1 /* 2 * Linux-specific abstractions to gain some independence from linux kernel versions. 3 * Pave over some 2.2 versus 2.4 versus 2.6 kernel differences. 4 * 5 * Copyright (C) 1999-2009, Broadcom Corporation 6 * 7 * Unless you and Broadcom execute a separate written software license 8 * agreement governing use of this software, this software is licensed to you 9 * under the terms of the GNU General Public License version 2 (the "GPL"), 10 * available at http://www.broadcom.com/licenses/GPLv2.php, with the 11 * following added to such license: 12 * 13 * As a special exception, the copyright holders of this software give you 14 * permission to link this software with independent modules, and to copy and 15 * distribute the resulting executable under terms of your choice, provided that 16 * you also meet, for each linked independent module, the terms and conditions of 17 * the license of that module. An independent module is a module which is not 18 * derived from this software. The special exception does not apply to any 19 * modifications of the software. 20 * 21 * Notwithstanding the above, under no circumstances may you combine this 22 * software in any way with any other Broadcom software provided under a license 23 * other than the GPL, without Broadcom's express prior written consent. 24 * 25 * $Id: linuxver.h,v 13.38.8.1.8.3 2009/06/19 04:42:45 Exp $ 26 */ 27 28 29 #ifndef _linuxver_h_ 30 #define _linuxver_h_ 31 32 #include <linux/version.h> 33 #if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 0)) 34 #include <linux/config.h> 35 #else 36 #include <linux/autoconf.h> 37 #endif 38 #include <linux/module.h> 39 40 #if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 3, 0)) 41 42 #ifdef __UNDEF_NO_VERSION__ 43 #undef __NO_VERSION__ 44 #else 45 #define __NO_VERSION__ 46 #endif 47 #endif 48 49 #if LINUX_VERSION_CODE < KERNEL_VERSION(2, 5, 0) 50 #define module_param(_name_, _type_, _perm_) MODULE_PARM(_name_, "i") 51 #define module_param_string(_name_, _string_, _size_, _perm_) \ 52 MODULE_PARM(_string_, "c" __MODULE_STRING(_size_)) 53 #endif 54 55 56 #if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 4, 9)) 57 #include <linux/malloc.h> 58 #else 59 #include <linux/slab.h> 60 #endif 61 62 #include <linux/types.h> 63 #include <linux/init.h> 64 #include <linux/mm.h> 65 #include <linux/string.h> 66 #include <linux/pci.h> 67 #include <linux/interrupt.h> 68 #include <linux/netdevice.h> 69 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 28)) 70 #undef IP_TOS 71 #endif 72 #include <asm/io.h> 73 74 #if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 5, 41)) 75 #include <linux/workqueue.h> 76 #else 77 #include <linux/tqueue.h> 78 #ifndef work_struct 79 #define work_struct tq_struct 80 #endif 81 #ifndef INIT_WORK 82 #define INIT_WORK(_work, _func, _data) INIT_TQUEUE((_work), (_func), (_data)) 83 #endif 84 #ifndef schedule_work 85 #define schedule_work(_work) schedule_task((_work)) 86 #endif 87 #ifndef flush_scheduled_work 88 #define flush_scheduled_work() flush_scheduled_tasks() 89 #endif 90 #endif 91 92 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 19) 93 #define MY_INIT_WORK(_work, _func, _data) INIT_WORK(_work, _func) 94 #else 95 #define MY_INIT_WORK(_work, _func, _data) INIT_WORK(_work, _func, _data) 96 typedef void (*work_func_t)(void *work); 97 #endif 98 99 #if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 0)) 100 101 #ifndef IRQ_NONE 102 typedef void irqreturn_t; 103 #define IRQ_NONE 104 #define IRQ_HANDLED 105 #define IRQ_RETVAL(x) 106 #endif 107 #else 108 typedef irqreturn_t(*FN_ISR) (int irq, void *dev_id, struct pt_regs *ptregs); 109 #endif 110 111 #if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 18) 112 #define IRQF_SHARED SA_SHIRQ 113 #endif 114 115 #if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 17) 116 #ifdef CONFIG_NET_RADIO 117 #define CONFIG_WIRELESS_EXT 118 #endif 119 #endif 120 121 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 5, 67) 122 #ifndef SANDGATE2G 123 #define MOD_INC_USE_COUNT 124 #endif 125 #endif 126 127 128 #ifndef __exit 129 #define __exit 130 #endif 131 #ifndef __devexit 132 #define __devexit 133 #endif 134 #ifndef __devinit 135 #define __devinit __init 136 #endif 137 #ifndef __devinitdata 138 #define __devinitdata 139 #endif 140 #ifndef __devexit_p 141 #define __devexit_p(x) x 142 #endif 143 144 #if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 4, 0)) 145 146 #define pci_get_drvdata(dev) (dev)->sysdata 147 #define pci_set_drvdata(dev, value) (dev)->sysdata = (value) 148 149 150 151 struct pci_device_id { 152 unsigned int vendor, device; 153 unsigned int subvendor, subdevice; 154 unsigned int class, class_mask; 155 unsigned long driver_data; 156 }; 157 158 struct pci_driver { 159 struct list_head node; 160 char *name; 161 const struct pci_device_id *id_table; 162 int (*probe)(struct pci_dev *dev, 163 const struct pci_device_id *id); 164 void (*remove)(struct pci_dev *dev); 165 void (*suspend)(struct pci_dev *dev); 166 void (*resume)(struct pci_dev *dev); 167 }; 168 169 #define MODULE_DEVICE_TABLE(type, name) 170 #define PCI_ANY_ID (~0) 171 172 173 #define pci_module_init pci_register_driver 174 extern int pci_register_driver(struct pci_driver *drv); 175 extern void pci_unregister_driver(struct pci_driver *drv); 176 177 #endif 178 179 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 18)) 180 #define pci_module_init pci_register_driver 181 #endif 182 183 #if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 2, 18)) 184 #ifdef MODULE 185 #define module_init(x) int init_module(void) { return x(); } 186 #define module_exit(x) void cleanup_module(void) { x(); } 187 #else 188 #define module_init(x) __initcall(x); 189 #define module_exit(x) __exitcall(x); 190 #endif 191 #endif 192 193 #if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 3, 48)) 194 #define list_for_each(pos, head) \ 195 for (pos = (head)->next; pos != (head); pos = pos->next) 196 #endif 197 198 #if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 3, 13)) 199 #define pci_resource_start(dev, bar) ((dev)->base_address[(bar)]) 200 #elif (LINUX_VERSION_CODE < KERNEL_VERSION(2, 3, 44)) 201 #define pci_resource_start(dev, bar) ((dev)->resource[(bar)].start) 202 #endif 203 204 #if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 3, 23)) 205 #define pci_enable_device(dev) do { } while (0) 206 #endif 207 208 #if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 3, 14)) 209 #define net_device device 210 #endif 211 212 #if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 3, 42)) 213 214 215 216 #ifndef PCI_DMA_TODEVICE 217 #define PCI_DMA_TODEVICE 1 218 #define PCI_DMA_FROMDEVICE 2 219 #endif 220 221 typedef u32 dma_addr_t; 222 223 224 static inline int get_order(unsigned long size) 225 { 226 int order; 227 228 size = (size-1) >> (PAGE_SHIFT-1); 229 order = -1; 230 do { 231 size >>= 1; 232 order++; 233 } while (size); 234 return order; 235 } 236 237 static inline void *pci_alloc_consistent(struct pci_dev *hwdev, size_t size, 238 dma_addr_t *dma_handle) 239 { 240 void *ret; 241 int gfp = GFP_ATOMIC | GFP_DMA; 242 243 ret = (void *)__get_free_pages(gfp, get_order(size)); 244 245 if (ret != NULL) { 246 memset(ret, 0, size); 247 *dma_handle = virt_to_bus(ret); 248 } 249 return ret; 250 } 251 static inline void pci_free_consistent(struct pci_dev *hwdev, size_t size, 252 void *vaddr, dma_addr_t dma_handle) 253 { 254 free_pages((unsigned long)vaddr, get_order(size)); 255 } 256 #define pci_map_single(cookie, address, size, dir) virt_to_bus(address) 257 #define pci_unmap_single(cookie, address, size, dir) 258 259 #endif 260 261 #if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 3, 43)) 262 263 #define dev_kfree_skb_any(a) dev_kfree_skb(a) 264 #define netif_down(dev) do { (dev)->start = 0; } while (0) 265 266 267 #ifndef _COMPAT_NETDEVICE_H 268 269 270 271 #define dev_kfree_skb_irq(a) dev_kfree_skb(a) 272 #define netif_wake_queue(dev) \ 273 do { clear_bit(0, &(dev)->tbusy); mark_bh(NET_BH); } while (0) 274 #define netif_stop_queue(dev) set_bit(0, &(dev)->tbusy) 275 276 static inline void netif_start_queue(struct net_device *dev) 277 { 278 dev->tbusy = 0; 279 dev->interrupt = 0; 280 dev->start = 1; 281 } 282 283 #define netif_queue_stopped(dev) (dev)->tbusy 284 #define netif_running(dev) (dev)->start 285 286 #endif 287 288 #define netif_device_attach(dev) netif_start_queue(dev) 289 #define netif_device_detach(dev) netif_stop_queue(dev) 290 291 292 #define tasklet_struct tq_struct 293 static inline void tasklet_schedule(struct tasklet_struct *tasklet) 294 { 295 queue_task(tasklet, &tq_immediate); 296 mark_bh(IMMEDIATE_BH); 297 } 298 299 static inline void tasklet_init(struct tasklet_struct *tasklet, 300 void (*func)(unsigned long), 301 unsigned long data) 302 { 303 tasklet->next = NULL; 304 tasklet->sync = 0; 305 tasklet->routine = (void (*)(void *))func; 306 tasklet->data = (void *)data; 307 } 308 #define tasklet_kill(tasklet) { do {} while (0); } 309 310 311 #define del_timer_sync(timer) del_timer(timer) 312 313 #else 314 315 #define netif_down(dev) 316 317 #endif 318 319 #if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 4, 3)) 320 321 322 #define PREPARE_TQUEUE(_tq, _routine, _data) \ 323 do { \ 324 (_tq)->routine = _routine; \ 325 (_tq)->data = _data; \ 326 } while (0) 327 328 329 #define INIT_TQUEUE(_tq, _routine, _data) \ 330 do { \ 331 INIT_LIST_HEAD(&(_tq)->list); \ 332 (_tq)->sync = 0; \ 333 PREPARE_TQUEUE((_tq), (_routine), (_data)); \ 334 } while (0) 335 336 #endif 337 338 #if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 4, 6)) 339 340 341 342 static inline int 343 pci_save_state(struct pci_dev *dev, u32 *buffer) 344 { 345 int i; 346 if (buffer) { 347 for (i = 0; i < 16; i++) 348 pci_read_config_dword(dev, i * 4, &buffer[i]); 349 } 350 return 0; 351 } 352 353 static inline int 354 pci_restore_state(struct pci_dev *dev, u32 *buffer) 355 { 356 int i; 357 358 if (buffer) { 359 for (i = 0; i < 16; i++) 360 pci_write_config_dword(dev, i * 4, buffer[i]); 361 } 362 363 else { 364 for (i = 0; i < 6; i ++) 365 pci_write_config_dword(dev, 366 PCI_BASE_ADDRESS_0 + (i * 4), 367 pci_resource_start(dev, i)); 368 pci_write_config_byte(dev, PCI_INTERRUPT_LINE, dev->irq); 369 } 370 return 0; 371 } 372 373 #endif 374 375 376 #if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 4, 19)) 377 #define read_c0_count() read_32bit_cp0_register(CP0_COUNT) 378 #endif 379 380 381 #if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 24)) 382 #ifndef SET_MODULE_OWNER 383 #define SET_MODULE_OWNER(dev) do {} while (0) 384 #define OLD_MOD_INC_USE_COUNT MOD_INC_USE_COUNT 385 #define OLD_MOD_DEC_USE_COUNT MOD_DEC_USE_COUNT 386 #else 387 #define OLD_MOD_INC_USE_COUNT do {} while (0) 388 #define OLD_MOD_DEC_USE_COUNT do {} while (0) 389 #endif 390 #else 391 #ifndef SET_MODULE_OWNER 392 #define SET_MODULE_OWNER(dev) do {} while (0) 393 #endif 394 #ifndef MOD_INC_USE_COUNT 395 #define MOD_INC_USE_COUNT do {} while (0) 396 #endif 397 #ifndef MOD_DEC_USE_COUNT 398 #define MOD_DEC_USE_COUNT do {} while (0) 399 #endif 400 #define OLD_MOD_INC_USE_COUNT MOD_INC_USE_COUNT 401 #define OLD_MOD_DEC_USE_COUNT MOD_DEC_USE_COUNT 402 #endif 403 404 #ifndef SET_NETDEV_DEV 405 #define SET_NETDEV_DEV(net, pdev) do {} while (0) 406 #endif 407 408 #ifndef HAVE_FREE_NETDEV 409 #define free_netdev(dev) kfree(dev) 410 #endif 411 412 #if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 0)) 413 414 #define af_packet_priv data 415 #endif 416 417 418 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 11) 419 #define DRV_SUSPEND_STATE_TYPE pm_message_t 420 #else 421 #define DRV_SUSPEND_STATE_TYPE uint32 422 #endif 423 424 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 19) 425 #define CHECKSUM_HW CHECKSUM_PARTIAL 426 #endif 427 428 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)) 429 #define KILL_PROC(pid, sig) \ 430 { \ 431 struct task_struct *tsk; \ 432 tsk = pid_task(find_vpid(pid), PIDTYPE_PID); \ 433 if (tsk) send_sig(sig, tsk, 1); \ 434 } 435 #else 436 #define KILL_PROC(pid, sig) \ 437 { \ 438 kill_proc(pid, sig, 1); \ 439 } 440 #endif 441 442 #if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 0)) 443 #define netdev_priv(dev) dev->priv 444 #endif 445 446 #endif 447