#ifndef _WANPIPE_KERNEL_H #define _WANPIPE_KERNEL_H #ifdef __KERNEL__ #include # if defined (__BIG_ENDIAN_BITFIELD) # define WAN_BIG_ENDIAN 1 # undef WAN_LITTLE_ENDIAN # else # undef WAN_BIG_ENDIAN # define WAN_LITTLE_ENDIAN 1 # endif #if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,9) # define MODULE_LICENSE(a) #endif #if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,10) # define snprintf(a,b,c,d...) sprintf(a,c,##d) #endif #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,15) # define wp_ip_rt_ioctl(_cmd_,_rptr_) -EINVAL # define wp_devinet_ioctl(_cmd_,_rptr_) -EINVAL #else # define wp_ip_rt_ioctl(_cmd_,_rptr_) ip_rt_ioctl(_cmd_,_rptr_) # define wp_devinet_ioctl(_cmd_,_rptr_) devinet_ioctl(_cmd_,_rptr_) #endif #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22) #define wan_skb_reset_mac_header(skb) skb_reset_mac_header(skb) #define wan_skb_reset_network_header(skb) skb_reset_network_header(skb) #define wan_skb_end_pointer(skb) skb_end_pointer(skb) #define wan_skb_tail_pointer(skb) skb_tail_pointer(skb) #define wan_skb_reset_tail_pointer(skb) skb_reset_tail_pointer(skb) #define wan_skb_set_tail_pointer(skb,offset) skb_set_tail_pointer(skb,offset) #else #define wan_skb_reset_mac_header(skb) ((skb)->mac.raw = (skb)->data) #define wan_skb_reset_network_header(skb) ((skb)->nh.raw = (skb)->data) #define wan_skb_tail_pointer(skb) ((skb)->tail) #define wan_skb_end_pointer(skb) ((skb)->end) #define wan_skb_reset_tail_pointer(skb) ((skb)->tail = (skb)->data) #define wan_skb_set_tail_pointer(skb,offset) ((skb)->tail = ((skb)->data + offset)) #endif #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24) || defined(LINUX_FEAT_2624) # ifndef LINUX_FEAT_2624 # define LINUX_FEAT_2624 1 # endif # define wan_dev_get_by_name(name) dev_get_by_name(&init_net,name) # define wan_dev_get_by_index(idx) dev_get_by_index(&init_net,idx) # define wan_init_net(name) init_net.name #else # define wan_dev_get_by_name(name) dev_get_by_name(name) # define wan_dev_get_by_index(idx) dev_get_by_index(idx) # define wan_init_net(name) name #endif #ifndef IRQF_SHARED #define IRQF_SHARED SA_SHIRQ #endif #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0) /* KERNEL 2.6.X */ #define LINUX_2_6 #define netdevice_t struct net_device #define FREE_READ 1 #define FREE_WRITE 0 #define stop_net_queue(a) netif_stop_queue(a) #define start_net_queue(a) netif_start_queue(a) #define is_queue_stopped(a) netif_queue_stopped(a) #define wake_net_dev(a) netif_wake_queue(a) #define is_dev_running(a) netif_running(a) #define wan_dev_kfree_skb(a,b) dev_kfree_skb_any(a) #define tq_struct work_struct #define wan_call_usermodehelper(a,b,c) call_usermodehelper(a,b,c,0) #define pci_present() 1 static inline void wan_schedule_task(struct tq_struct *tq) { schedule_work(tq); } #define ADMIN_CHECK() {if (!capable(CAP_SYS_ADMIN)) {\ DEBUG_EVENT("wanpipe: ADMIN_CHECK: Failed Cap=0x%X Fsuid=0x%X Euid=0x%X\n", \ current->cap_effective,current->fsuid,current->euid);\ return -EPERM; \ }\ } #define NET_ADMIN_CHECK() {if (!capable(CAP_NET_ADMIN)){\ DEBUG_EVENT("wanpipe: NET_ADMIN_CHECK: Failed Cap=0x%X Fsuid=0x%X Euid=0x%X\n", \ current->cap_effective,current->fsuid,current->euid);\ return -EPERM; \ }\ } #define WAN_IRQ_CALL(fn,args,ret) ret = fn args #define WAN_IRQ_RETURN(a) return a #define WAN_IRQ_RETVAL irqreturn_t #define WAN_IRQ_RETVAL_DECL(ret) irqreturn_t ret = WAN_IRQ_NONE #define WAN_IRQ_RETVAL_SET(ret, val) ret = val #define WAN_IRQ_HANDLED IRQ_HANDLED #define WAN_IRQ_NONE IRQ_NONE #define mark_bh(a) #define wan_clear_bit(a,b) clear_bit((a),(unsigned long*)(b)) #define wan_set_bit(a,b) set_bit((a),(unsigned long*)(b)) #define wan_test_bit(a,b) test_bit((a),(unsigned long*)(b)) #define wan_test_and_set_bit(a,b) test_and_set_bit((a),(unsigned long*)(b)) #define wan_test_and_clear_bit(a,b) test_and_clear_bit((a),(unsigned long*)(b)) #define dev_init_buffers(a) #define WP_PDE(_a) PDE(_a) #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,9) # define wp_rcu_read_lock(in_dev) rcu_read_lock() # define wp_rcu_read_unlock(in_dev) rcu_read_unlock() # define wp_readb(ptr) readb((void __iomem *)(ptr)) # define wp_reads(ptr) reads((void __iomem *)(ptr)) # define wp_readl(ptr) readl((void __iomem *)(ptr)) # define wp_writeb(data,ptr) writeb(data,(void __iomem *)(ptr)) # define wp_writew(data,ptr) writew(data,(void __iomem *)(ptr)) # define wp_writel(data,ptr) writel(data,(void __iomem *)(ptr)) # define wp_memset_io(ptr,data,len) memset_io((void __iomem *)(ptr),data,len) #else # define wp_rcu_read_lock(in_dev) read_lock_bh(&in_dev->lock) # define wp_rcu_read_unlock(in_dev) read_unlock_bh(&in_dev->lock) # define wp_readb(ptr) readb((ptr)) # define wp_reads(ptr) reads((ptr)) # define wp_readl(ptr) readl((ptr)) # define wp_writeb(data,ptr) writeb(data,(ptr)) # define wp_writew(data,ptr) writew(data,(ptr)) # define wp_writel(data,ptr) writel(data,(ptr)) # define wp_memset_io(ptr,data,len) memset_io((ptr),data,len) #endif #if LINUX_VERSION_CODE == KERNEL_VERSION(2,6,14) #define htonl __constant_htonl #define htons __constant_htons #define ntohl __constant_ntohl #define ntohs __constant_ntohs #endif #elif LINUX_VERSION_CODE >= KERNEL_VERSION(2,3,0) /* -------------------------------------------------- * KERNEL 2.4.X * -------------------------------------------------*/ #define LINUX_2_4 #define netdevice_t struct net_device #define FREE_READ 1 #define FREE_WRITE 0 #define stop_net_queue(a) netif_stop_queue(a) #define start_net_queue(a) netif_start_queue(a) #define is_queue_stopped(a) netif_queue_stopped(a) #define wake_net_dev(a) netif_wake_queue(a) #define is_dev_running(a) netif_running(a) #define wan_dev_kfree_skb(a,b) dev_kfree_skb_any(a) #define pci_get_device(a,b,c) pci_find_device(a,b,c) #define __dev_get(a) dev_get(a) static inline void wan_schedule_task(struct tq_struct *tq) { schedule_task(tq); } #ifndef INIT_WORK # define INIT_WORK INIT_TQUEUE #endif #define wan_call_usermodehelper(a,b,c) call_usermodehelper(a,b,c) #define ADMIN_CHECK() {if (!capable(CAP_SYS_ADMIN)) {\ DEBUG_EVENT("wanpipe: ADMIN_CHECK: Failed Cap=0x%X Fsuid=0x%X Euid=0x%X\n", \ current->cap_effective,current->fsuid,current->euid);\ return -EPERM; \ }\ } #define NET_ADMIN_CHECK() {if (!capable(CAP_NET_ADMIN)){\ DEBUG_EVENT("wanpipe: NET_ADMIN_CHECK: Failed Cap=0x%X Fsuid=0x%X Euid=0x%X\n", \ current->cap_effective,current->fsuid,current->euid);\ return -EPERM; \ }\ } #define WAN_IRQ_CALL(fn,args,ret) fn args #define WAN_IRQ_RETURN(a) return #define WAN_IRQ_RETVAL void #define WAN_IRQ_RETVAL_DECL(ret) #define WAN_IRQ_RETVAL_SET(ret, val) #ifndef WAN_IRQ_NONE # define WAN_IRQ_NONE (0) #endif #ifndef WAN_IRQ_HANDLED # define WAN_IRQ_HANDLED (1) #endif #define wan_clear_bit(a,b) clear_bit((a),(b)) #define wan_set_bit(a,b) set_bit((a),(b)) #define wan_test_bit(a,b) test_bit((a),(b)) #define wan_test_and_set_bit(a,b) test_and_set_bit((a),(b)) #define wan_test_and_clear_bit(a,b) test_and_clear_bit((a),(b)) static inline struct proc_dir_entry *WP_PDE(const struct inode *inode) { #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,21) return (struct proc_dir_entry *)inode->u.generic_ip; #else return (struct proc_dir_entry *)inode->i_private; #endif } #define wp_rcu_read_lock(in_dev) read_lock_bh(&in_dev->lock) #define wp_rcu_read_unlock(in_dev) read_unlock_bh(&in_dev->lock) #define wp_readb(ptr) readb((ptr)) #define wp_reads(ptr) reads((ptr)) #define wp_readl(ptr) readl((ptr)) #define wp_writeb(data,ptr) writeb(data,(ptr)) #define wp_writew(data,ptr) writew(data,(ptr)) #define wp_writel(data,ptr) writel(data,(ptr)) #define wp_memset_io(ptr,data,len) memset_io((ptr),data,len) #elif LINUX_VERSION_CODE >= KERNEL_VERSION(2,1,0) /*----------------------------------------------------- * KERNEL 2.2.X * ---------------------------------------------------*/ #define LINUX_2_1 #define net_device device #define netdevice_t struct device #define FREE_READ 1 #define FREE_WRITE 0 #define S_IRUGO 0 #define __exit #ifndef get_order # define get_order(x) __get_order(x) #endif #define pci_get_device(a,b,c) pci_find_device(a,b,c) #define wan_dev_kfree_skb(a,b) kfree_skb(a) #define dev_kfree_skb_any(a) kfree_skb(a) #define netif_wake_queue(dev) do { \ clear_bit(0, &(dev)->tbusy); \ mark_bh(NET_BH); \ } while(0) #define netif_start_queue(dev) do { \ (dev)->tbusy = 0; \ (dev)->interrupt = 0; \ (dev)->start = 1; \ } while (0) #define netif_stop_queue(dev) (set_bit(0, &(dev)->tbusy)) #define netif_running(dev) (dev)->start #define netdevice_start(dev) (dev)->start = 1 #define netdevice_stop(dev) (dev)->start = 0 #define netif_queue_stopped(dev) (test_bit(0,&(dev)->tbusy)) #define netif_set_tx_timeout(dev, tf, tm) #define stop_net_queue(dev) netif_stop_queue(dev) #define start_net_queue(dev) netif_start_queue(dev) #define is_queue_stopped(dev) netif_queue_stopped(dev) #define wake_net_dev(dev) netif_wake_queue(dev) #define is_dev_running(dev) netif_running(dev) #define dev_kfree_skb_irq(x) kfree_skb(x) #define tasklet_struct tq_struct #define __dev_get(a) dev_get(a) #ifndef DECLARE_WAITQUEUE #define DECLARE_WAITQUEUE(wait, current) struct wait_queue wait = { current, NULL } #endif #define tasklet_kill(a) { if ((a)->sync) {} } #define request_mem_region(addr, size, name) ((void *)1) #define release_mem_region(addr, size) #define pci_enable_device(x) (0) #define pci_resource_start(dev, bar) dev->base_address[bar] #define wp_rcu_read_lock(in_dev) #define wp_rcu_read_unlock(in_dev) #define wp_readb(ptr) readb((ptr)) #define wp_reads(ptr) reads((ptr)) #define wp_readl(ptr) readl((ptr)) #define wp_writeb(data,ptr) writeb(data,(ptr)) #define wp_writew(data,ptr) writew(data,(ptr)) #define wp_writel(data,ptr) writel(data,(ptr)) #define wp_memset_io(ptr,data,len) memset_io((ptr),data,len) static inline void tasklet_hi_schedule(struct tasklet_struct *tasklet) { queue_task(tasklet, &tq_immediate); mark_bh(IMMEDIATE_BH); } static inline void tasklet_schedule(struct tasklet_struct *tasklet) { queue_task(tasklet, &tq_immediate); mark_bh(IMMEDIATE_BH); } static inline void tasklet_init(struct tasklet_struct *tasklet, void (*func)(unsigned long), unsigned long data) { tasklet->next = NULL; tasklet->sync = 0; tasklet->routine = (void (*)(void *))func; tasklet->data = (void *)data; } static inline void wan_schedule_task(struct tq_struct *tq) { queue_task(tq, &tq_scheduler); } /* Setup Dma Memory size copied directly from 3c505.c */ static inline int __get_order(unsigned long size) { int order; size = (size - 1) >> (PAGE_SHIFT - 1); order = -1; do { size >>= 1; order++; } while (size); return order; } typedef int (get_info_t)(char *, char **, off_t, int, int); #define ADMIN_CHECK() {if (!capable(CAP_SYS_ADMIN)) return -EPERM;} #define NET_ADMIN_CHECK() {if (!capable(CAP_NET_ADMIN)) return -EPERM;} #define WAN_IRQ_CALL(fn,args,ret) fn args #define WAN_IRQ_RETURN(a) return #define WAN_IRQ_RETVAL void #define WAN_IRQ_RETVAL_DECL(ret) #define WAN_IRQ_RETVAL_SET(ret, val) #ifndef WAN_IRQ_NONE # define WAN_IRQ_NONE (0) #endif #ifndef WAN_IRQ_HANDLED # define WAN_IRQ_HANDLED (1) #endif typedef unsigned long mm_segment_t; #ifndef INIT_WORK # define INIT_WORK INIT_TQUEUE #endif #define wan_clear_bit(a,b) clear_bit((a),(b)) #define wan_set_bit(a,b) set_bit((a),(b)) #define wan_test_bit(a,b) test_bit((a),(b)) #define wan_test_and_set_bit(a,b) test_and_set_bit((a),(b)) #define wan_test_and_clear_bit(a,b) test_and_clear_bit((a),(b)) static inline struct proc_dir_entry *WP_PDE(const struct inode *inode) { #if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,18) return (struct proc_dir_entry *)inode->u.generic_ip; #else return (struct proc_dir_entry *)inode->i_private; #endif } #else /* KERNEL 2.0.X */ #define LINUX_2_0 #define netdevice_t struct device static inline struct proc_dir_entry *WP_PDE(const struct inode *inode) { #if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,18) return (struct proc_dir_entry *)inode->i_private; #else return (struct proc_dir_entry *)inode->u.generic_ip; #endif } #define test_and_set_bit set_bit #define net_ratelimit() 1 #define stop_net_queue(a) (set_bit(0, &a->tbusy)) #define start_net_queue(a) (clear_bit(0,&a->tbusy)) #define is_queue_stopped(a) (a->tbusy) #define wake_net_dev(a) {clear_bit(0,&a->tbusy);mark_bh(NET_BH);} #define is_dev_running(a) (test_bit(0,(void*)&a->start)) #define wan_dev_kfree_skb(a,b) kfree_skb(a,b) #define pci_get_device(a,b,c) pci_find_device(a,b,c) #define spin_lock_init(a) #define spin_lock(a) #define spin_unlock(a) #define __dev_get(a) dev_get(a) #define netif_wake_queue(dev) do { \ clear_bit(0, &dev->tbusy); \ mark_bh(NET_BH); \ } while(0) #define netif_start_queue(dev) do { \ dev->tbusy = 0; \ dev->interrupt = 0; \ dev->start = 1; \ } while (0) #define netif_stop_queue(dev) set_bit(0, &dev->tbusy) #define netif_running(dev) dev->start #define netdevice_start(dev) dev->start = 1 #define netdevice_stop(dev) dev->start = 0 #define netif_set_tx_timeout(dev, tf, tm) #define dev_kfree_skb_irq(x) kfree_skb(x) typedef int (write_proc_t)(char *, char **, off_t, int, int); #define net_device_stats enet_statistics static inline int copy_from_user(void *a, void *b, int len){ int err = verify_area(VERIFY_READ, b, len); if (err) return err; memcpy_fromfs (a, b, len); return 0; } static inline int copy_to_user(void *a, void *b, int len){ int err = verify_area(VERIFY_WRITE, b, len); if (err) return err; memcpy_tofs (a, b,len); return 0; } #define WAN_IRQ_CALL(fn,args,ret) fn args #define WAN_IRQ_RETURN(a) return #define WAN_IRQ_RETVAL void #define WAN_IRQ_RETVAL_DECL(ret) #define WAN_IRQ_RETVAL_SET(ret, val) #ifndef WAN_IRQ_NONE # define WAN_IRQ_NONE (0) #endif #ifndef WAN_IRQ_HANDLED # define WAN_IRQ_HANDLED (1) #endif typedef unsigned long mm_segment_t; #endif static inline int open_dev_check(netdevice_t *dev) { #if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,18) return is_dev_running(dev); #else return 0; #endif } #else #include /* This file is not being included from kernel space * we need to define what kersdladrv_pci_tblnel version we are * running */ #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0) #define LINUX_2_6 #elif LINUX_VERSION_CODE >= KERNEL_VERSION(2,3,0) #define LINUX_2_4 #else #define LINUX_2_4 #endif #endif #endif