diff options
author | Herbert Xu <herbert@gondor.apana.org.au> | 2010-06-10 16:12:47 (GMT) |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2010-06-15 17:58:39 (GMT) |
commit | 4247e161b12f8dffb7ee3ee07bc5e61f714ebe2d (patch) | |
tree | 95edfebfb67abcfb95b1865ce8d78e44c1c153c5 | |
parent | dbaa154178341689faaa08fbf40b94ae5ca1d6c0 (diff) | |
download | linux-fsl-qoriq-4247e161b12f8dffb7ee3ee07bc5e61f714ebe2d.tar.xz |
netpoll: Add ndo_netpoll_setup
This patch adds ndo_netpoll_setup as the initialisation primitive
to complement ndo_netpoll_cleanup.
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | include/linux/netdevice.h | 2 | ||||
-rw-r--r-- | net/core/netpoll.c | 10 |
2 files changed, 12 insertions, 0 deletions
diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h index 4fbccc5..fb20cc5 100644 --- a/include/linux/netdevice.h +++ b/include/linux/netdevice.h @@ -744,6 +744,8 @@ struct net_device_ops { unsigned short vid); #ifdef CONFIG_NET_POLL_CONTROLLER void (*ndo_poll_controller)(struct net_device *dev); + int (*ndo_netpoll_setup)(struct net_device *dev, + struct netpoll_info *info); void (*ndo_netpoll_cleanup)(struct net_device *dev); #endif int (*ndo_set_vf_mac)(struct net_device *dev, diff --git a/net/core/netpoll.c b/net/core/netpoll.c index d10c249..7de6dca 100644 --- a/net/core/netpoll.c +++ b/net/core/netpoll.c @@ -698,6 +698,7 @@ int netpoll_setup(struct netpoll *np) struct net_device *ndev = NULL; struct in_device *in_dev; struct netpoll_info *npinfo; + const struct net_device_ops *ops; unsigned long flags; int err; @@ -797,6 +798,13 @@ int netpoll_setup(struct netpoll *np) INIT_DELAYED_WORK(&npinfo->tx_work, queue_process); atomic_set(&npinfo->refcnt, 1); + + ops = np->dev->netdev_ops; + if (ops->ndo_netpoll_setup) { + err = ops->ndo_netpoll_setup(ndev, npinfo); + if (err) + goto free_npinfo; + } } else { npinfo = ndev->npinfo; atomic_inc(&npinfo->refcnt); @@ -817,6 +825,8 @@ int netpoll_setup(struct netpoll *np) return 0; +free_npinfo: + kfree(npinfo); unlock: rtnl_unlock(); put: |