diff --git a/vmkdrivers/src_9/include/linux/netdevice.h b/vmkdrivers/src_9/include/linux/netdevice.h index 76207dc14990eaf00df0d60bd97ad41b7069b83e..57685fef0190ee00813527d805f12fbb3a47e2f1 100644 --- a/vmkdrivers/src_9/include/linux/netdevice.h +++ b/vmkdrivers/src_9/include/linux/netdevice.h @@ -299,6 +299,40 @@ typedef enum { NETPOLL_BACKUP = 1, } vmklnx_poll_type; +/* + * since all pointers are 4 bytes or even 8 bytes aligned, + * let's simply embed the poll_type in the lower bits of vmk_NetPoll->priv + * final pointer value = (original priv pointer | poll_type) + */ +#define POLLPRIV_TYPE_BITS 1 +#define POLLPRIV_TYPE_MASK ((1 << POLLPRIV_TYPE_BITS) - 1) + +static inline void *pollpriv_embed(void *priv, vmklnx_poll_type poll_type) +{ + VMK_ASSERT(priv); + VMK_ASSERT((((unsigned long) priv) & POLLPRIV_TYPE_MASK) == 0); + VMK_ASSERT(poll_type <= POLLPRIV_TYPE_MASK); + return (void *)(((unsigned long )priv) | poll_type); +} + +static inline vmklnx_poll_type pollpriv_type(void *priv) +{ + VMK_ASSERT(priv); + return (vmklnx_poll_type)(((unsigned long)priv) & POLLPRIV_TYPE_MASK); +} + +static inline struct napi_struct *pollpriv_napi(void *priv) +{ + VMK_ASSERT(pollpriv_type(priv) == NETPOLL_DEFAULT); + return (struct napi_struct *) (((unsigned long)priv) & (~POLLPRIV_TYPE_MASK)); +} + +static inline struct net_device *pollpriv_net_device(void *priv) +{ + VMK_ASSERT(pollpriv_type(priv) == NETPOLL_BACKUP); + return (struct net_device *) (((unsigned long)priv) & (~POLLPRIV_TYPE_MASK)); +} + struct napi_struct { unsigned long state; int weight;