350 lines
10 KiB
C
350 lines
10 KiB
C
|
#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>
|
||
|
#include <linux/mmc/sdio_func.h>
|
||
|
#include <net/sock.h>
|
||
|
|
||
|
/*
|
||
|
* Backports da68c4eb25
|
||
|
* sdio: introduce API for special power management features
|
||
|
*
|
||
|
* We wimply carry around the data structures and flags, and
|
||
|
* make the host return no flags set by the driver.
|
||
|
*/
|
||
|
typedef unsigned int mmc_pm_flag_t;
|
||
|
|
||
|
#define MMC_PM_KEEP_POWER (1 << 0) /* preserve card power during suspend */
|
||
|
#define MMC_PM_WAKE_SDIO_IRQ (1 << 1) /* wake up host system on SDIO IRQ assertion */
|
||
|
|
||
|
extern mmc_pm_flag_t sdio_get_host_pm_caps(struct sdio_func *func);
|
||
|
extern int sdio_set_host_pm_flags(struct sdio_func *func, mmc_pm_flag_t flags);
|
||
|
|
||
|
void init_compat_mmc_pm_flags(void);
|
||
|
|
||
|
#define netdev_mc_count(dev) ((dev)->mc_count)
|
||
|
#define netdev_mc_empty(dev) (netdev_mc_count(dev) == 0)
|
||
|
|
||
|
/* mask netdev_for_each_mc_addr as RHEL6 backports this */
|
||
|
#if !defined(netdev_for_each_mc_addr)
|
||
|
#define netdev_for_each_mc_addr(mclist, dev) \
|
||
|
for (mclist = dev->mc_list; mclist; mclist = mclist->next)
|
||
|
#endif
|
||
|
/* 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
|
||
|
|
||
|
/* mask sysfs_bin_attr_init as RHEL6 backports this */
|
||
|
#if !defined(sysfs_bin_attr_init)
|
||
|
/**
|
||
|
* 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)
|
||
|
#endif
|
||
|
|
||
|
#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 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 */
|
||
|
|
||
|
extern struct hlist_node *seq_hlist_start_head(struct hlist_head *head,
|
||
|
loff_t pos);
|
||
|
|
||
|
extern struct hlist_node *seq_hlist_next(void *v, struct hlist_head *head,
|
||
|
loff_t *ppos);
|
||
|
|
||
|
static inline struct sock *sk_entry(const struct hlist_node *node)
|
||
|
{
|
||
|
return hlist_entry(node, struct sock, sk_node);
|
||
|
}
|
||
|
|
||
|
#else /* Kernels >= 2.6.34 */
|
||
|
|
||
|
static inline void init_compat_mmc_pm_flags(void)
|
||
|
{
|
||
|
}
|
||
|
|
||
|
#endif /* (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,34)) */
|
||
|
|
||
|
|
||
|
#endif /* LINUX_26_34_COMPAT_H */
|