@@ -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)
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;