| #ifndef LINUX_26_34_COMPAT_H |
| #define LINUX_26_34_COMPAT_H |
| |
| #include <linux/version.h> |
| |
| #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,34)) |
| |
| #include <linux/netdevice.h> |
| #include <linux/usb.h> |
| |
| #define netdev_mc_count(dev) ((dev)->mc_count) |
| #define netdev_mc_empty(dev) (netdev_mc_count(dev) == 0) |
| |
| #define netdev_for_each_mc_addr(mclist, dev) \ |
| for (mclist = dev->mc_list; mclist; mclist = mclist->next) |
| /* source: include/linux/netdevice.h */ |
| |
| |
| /* Logging, debugging and troubleshooting/diagnostic helpers. */ |
| |
| /* netdev_printk helpers, similar to dev_printk */ |
| |
| #ifndef netdev_name |
| #define netdev_name(__dev) \ |
| ((__dev->reg_state != NETREG_REGISTERED) ? \ |
| "(unregistered net_device)" : __dev->name) |
| #endif |
| |
| #define netdev_printk(level, netdev, format, args...) \ |
| dev_printk(level, (netdev)->dev.parent, \ |
| "%s: " format, \ |
| netdev_name(netdev), ##args) |
| |
| #define netdev_emerg(dev, format, args...) \ |
| netdev_printk(KERN_EMERG, dev, format, ##args) |
| #define netdev_alert(dev, format, args...) \ |
| netdev_printk(KERN_ALERT, dev, format, ##args) |
| #define netdev_crit(dev, format, args...) \ |
| netdev_printk(KERN_CRIT, dev, format, ##args) |
| #define netdev_err(dev, format, args...) \ |
| netdev_printk(KERN_ERR, dev, format, ##args) |
| #define netdev_warn(dev, format, args...) \ |
| netdev_printk(KERN_WARNING, dev, format, ##args) |
| #define netdev_notice(dev, format, args...) \ |
| netdev_printk(KERN_NOTICE, dev, format, ##args) |
| #define netdev_info(dev, format, args...) \ |
| netdev_printk(KERN_INFO, dev, format, ##args) |
| |
| /* mask netdev_dbg as RHEL6 backports this */ |
| #if !defined(netdev_dbg) |
| |
| #if defined(DEBUG) |
| #define netdev_dbg(__dev, format, args...) \ |
| netdev_printk(KERN_DEBUG, __dev, format, ##args) |
| #elif defined(CONFIG_DYNAMIC_DEBUG) |
| #define netdev_dbg(__dev, format, args...) \ |
| do { \ |
| dynamic_dev_dbg((__dev)->dev.parent, "%s: " format, \ |
| netdev_name(__dev), ##args); \ |
| } while (0) |
| #else |
| #define netdev_dbg(__dev, format, args...) \ |
| ({ \ |
| if (0) \ |
| netdev_printk(KERN_DEBUG, __dev, format, ##args); \ |
| 0; \ |
| }) |
| #endif |
| |
| #endif |
| |
| /* mask netdev_vdbg as RHEL6 backports this */ |
| #if !defined(netdev_dbg) |
| |
| #if defined(VERBOSE_DEBUG) |
| #define netdev_vdbg netdev_dbg |
| #else |
| |
| #define netdev_vdbg(dev, format, args...) \ |
| ({ \ |
| if (0) \ |
| netdev_printk(KERN_DEBUG, dev, format, ##args); \ |
| 0; \ |
| }) |
| #endif |
| |
| #endif |
| |
| /* |
| * netdev_WARN() acts like dev_printk(), but with the key difference |
| * of using a WARN/WARN_ON to get the message out, including the |
| * file/line information and a backtrace. |
| */ |
| #define netdev_WARN(dev, format, args...) \ |
| WARN(1, "netdevice: %s\n" format, netdev_name(dev), ##args); |
| |
| /* netif printk helpers, similar to netdev_printk */ |
| |
| #define netif_printk(priv, type, level, dev, fmt, args...) \ |
| do { \ |
| if (netif_msg_##type(priv)) \ |
| netdev_printk(level, (dev), fmt, ##args); \ |
| } while (0) |
| |
| #define netif_emerg(priv, type, dev, fmt, args...) \ |
| netif_printk(priv, type, KERN_EMERG, dev, fmt, ##args) |
| #define netif_alert(priv, type, dev, fmt, args...) \ |
| netif_printk(priv, type, KERN_ALERT, dev, fmt, ##args) |
| #define netif_crit(priv, type, dev, fmt, args...) \ |
| netif_printk(priv, type, KERN_CRIT, dev, fmt, ##args) |
| #define netif_err(priv, type, dev, fmt, args...) \ |
| netif_printk(priv, type, KERN_ERR, dev, fmt, ##args) |
| #define netif_warn(priv, type, dev, fmt, args...) \ |
| netif_printk(priv, type, KERN_WARNING, dev, fmt, ##args) |
| #define netif_notice(priv, type, dev, fmt, args...) \ |
| netif_printk(priv, type, KERN_NOTICE, dev, fmt, ##args) |
| #define netif_info(priv, type, dev, fmt, args...) \ |
| netif_printk(priv, type, KERN_INFO, (dev), fmt, ##args) |
| |
| /* mask netif_dbg as RHEL6 backports this */ |
| #if !defined(netif_dbg) |
| |
| #if defined(DEBUG) |
| #define netif_dbg(priv, type, dev, format, args...) \ |
| netif_printk(priv, type, KERN_DEBUG, dev, format, ##args) |
| #elif defined(CONFIG_DYNAMIC_DEBUG) |
| #define netif_dbg(priv, type, netdev, format, args...) \ |
| do { \ |
| if (netif_msg_##type(priv)) \ |
| dynamic_dev_dbg((netdev)->dev.parent, \ |
| "%s: " format, \ |
| netdev_name(netdev), ##args); \ |
| } while (0) |
| #else |
| #define netif_dbg(priv, type, dev, format, args...) \ |
| ({ \ |
| if (0) \ |
| netif_printk(priv, type, KERN_DEBUG, dev, format, ##args); \ |
| 0; \ |
| }) |
| #endif |
| |
| #endif |
| |
| /* mask netif_vdbg as RHEL6 backports this */ |
| #if !defined(netif_vdbg) |
| |
| #if defined(VERBOSE_DEBUG) |
| #define netif_vdbg netdev_dbg |
| #else |
| #define netif_vdbg(priv, type, dev, format, args...) \ |
| ({ \ |
| if (0) \ |
| netif_printk(KERN_DEBUG, dev, format, ##args); \ |
| 0; \ |
| }) |
| #endif |
| #endif |
| /* source: include/linux/netdevice.h */ |
| |
| |
| static inline void device_lock(struct device *dev) |
| { |
| #if defined(CONFIG_PREEMPT_RT) || defined(CONFIG_PREEMPT_DESKTOP) |
| mutex_lock(&dev->mutex); |
| #else |
| down(&dev->sem); |
| #endif |
| } |
| |
| static inline int device_trylock(struct device *dev) |
| { |
| #if defined(CONFIG_PREEMPT_RT) || defined(CONFIG_PREEMPT_DESKTOP) |
| return mutex_trylock(&dev->mutex); |
| #else |
| return down_trylock(&dev->sem); |
| #endif |
| } |
| |
| static inline void device_unlock(struct device *dev) |
| { |
| #if defined(CONFIG_PREEMPT_RT) || defined(CONFIG_PREEMPT_DESKTOP) |
| mutex_unlock(&dev->mutex); |
| #else |
| up(&dev->sem); |
| #endif |
| } |
| |
| #if defined(CONFIG_PCMCIA) || defined(CONFIG_PCMCIA_MODULE) |
| #define PCMCIA_DEVICE_PROD_ID3(v3, vh3) { \ |
| .match_flags = PCMCIA_DEV_ID_MATCH_PROD_ID3, \ |
| .prod_id = { NULL, NULL, (v3), NULL }, \ |
| .prod_id_hash = { 0, 0, (vh3), 0 }, } |
| #endif |
| |
| #define rcu_dereference_check(p, c) rcu_dereference(p) |
| |
| /** |
| * sysfs_attr_init - initialize a dynamically allocated sysfs attribute |
| * @attr: struct attribute to initialize |
| * |
| * Initialize a dynamically allocated struct attribute so we can |
| * make lockdep happy. This is a new requirement for attributes |
| * and initially this is only needed when lockdep is enabled. |
| * Lockdep gives a nice error when your attribute is added to |
| * sysfs if you don't have this. |
| */ |
| #ifdef CONFIG_DEBUG_LOCK_ALLOC |
| #define sysfs_attr_init(attr) \ |
| do { \ |
| static struct lock_class_key __key; \ |
| \ |
| (attr)->key = &__key; \ |
| } while(0) |
| #else |
| #define sysfs_attr_init(attr) do {} while(0) |
| #endif |
| |
| /** |
| * sysfs_bin_attr_init - initialize a dynamically allocated bin_attribute |
| * @attr: struct bin_attribute to initialize |
| * |
| * Initialize a dynamically allocated struct bin_attribute so we |
| * can make lockdep happy. This is a new requirement for |
| * attributes and initially this is only needed when lockdep is |
| * enabled. Lockdep gives a nice error when your attribute is |
| * added to sysfs if you don't have this. |
| */ |
| #define sysfs_bin_attr_init(bin_attr) sysfs_attr_init(&(bin_attr)->attr) |
| |
| #define usb_alloc_coherent(dev, size, mem_flags, dma) usb_buffer_alloc(dev, size, mem_flags, dma) |
| #define usb_free_coherent(dev, size, addr, dma) usb_buffer_free(dev, size, addr, dma) |
| |
| /* only include this if DEFINE_DMA_UNMAP_ADDR is not set as debian squeeze also backports this */ |
| #ifndef DEFINE_DMA_UNMAP_ADDR |
| #ifdef CONFIG_NEED_DMA_MAP_STATE |
| #define DEFINE_DMA_UNMAP_ADDR(ADDR_NAME) dma_addr_t ADDR_NAME |
| #define DEFINE_DMA_UNMAP_LEN(LEN_NAME) __u32 LEN_NAME |
| #define dma_unmap_addr(PTR, ADDR_NAME) ((PTR)->ADDR_NAME) |
| #define dma_unmap_addr_set(PTR, ADDR_NAME, VAL) (((PTR)->ADDR_NAME) = (VAL)) |
| #define dma_unmap_len(PTR, LEN_NAME) ((PTR)->LEN_NAME) |
| #define dma_unmap_len_set(PTR, LEN_NAME, VAL) (((PTR)->LEN_NAME) = (VAL)) |
| #else |
| #define DEFINE_DMA_UNMAP_ADDR(ADDR_NAME) |
| #define DEFINE_DMA_UNMAP_LEN(LEN_NAME) |
| #define dma_unmap_addr(PTR, ADDR_NAME) (0) |
| #define dma_unmap_addr_set(PTR, ADDR_NAME, VAL) do { } while (0) |
| #define dma_unmap_len(PTR, LEN_NAME) (0) |
| #define dma_unmap_len_set(PTR, LEN_NAME, VAL) do { } while (0) |
| #endif |
| #endif |
| |
| /* mask dma_set_coherent_mask as debian squeeze also backports this */ |
| #define dma_set_coherent_mask(a, b) compat_dma_set_coherent_mask(a, b) |
| |
| static inline int dma_set_coherent_mask(struct device *dev, u64 mask) |
| { |
| if (!dma_supported(dev, mask)) |
| return -EIO; |
| dev->coherent_dma_mask = mask; |
| return 0; |
| } |
| |
| /* USB autosuspend and autoresume */ |
| static inline int usb_enable_autosuspend(struct usb_device *udev) |
| { return 0; } |
| static inline int usb_disable_autosuspend(struct usb_device *udev) |
| { return 0; } |
| |
| #define MMC_PM_KEEP_POWER (1 << 0) /* preserve card power during suspend */ |
| #define sdio_set_host_pm_flags(a, b) 0 |
| |
| #define rcu_dereference_protected(p, c) (p) |
| #define rcu_access_pointer(p) ACCESS_ONCE(p) |
| |
| #define rcu_dereference_raw(p) rcu_dereference(p) |
| |
| #define KEY_WPS_BUTTON 0x211 /* WiFi Protected Setup key */ |
| |
| /* |
| * This looks more complex than it should be. But we need to |
| * get the type for the ~ right in round_down (it needs to be |
| * as wide as the result!), and we want to evaluate the macro |
| * arguments just once each. |
| */ |
| #define __round_mask(x, y) ((__typeof__(x))((y)-1)) |
| #define round_up(x, y) ((((x)-1) | __round_mask(x, y))+1) |
| #define round_down(x, y) ((x) & ~__round_mask(x, y)) |
| |
| static inline int rcu_read_lock_held(void) |
| { |
| return 1; |
| } |
| |
| #ifdef CONFIG_PROVE_LOCKING |
| /* |
| * Obviously, this is wrong. But the base kernel will have rtnl_mutex |
| * declared static, with no way to access it. I think this is the best |
| * we can do... |
| */ |
| static inline int lockdep_rtnl_is_held(void) |
| { |
| return 1; |
| } |
| #endif /* #ifdef CONFIG_PROVE_LOCKING */ |
| |
| #endif /* (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,34)) */ |
| |
| #endif /* LINUX_26_34_COMPAT_H */ |