fs_enet: Update for API changes
Subsystems (2)
PATCH 1/1 fs_enet: Update for API changes
This driver was recently broken by several changes for which this driver was not (or was improperly) updated:
1. SET_MODULE_OWNER() was removed.
2. netif_napi_add() was only being called when building with the old CPM binding.
3. The received/budget test was backwards.
4. to_net_dev() was wrong -- the device struct embedded in the net_device struct is not the same as the of_platform device in the private struct.
5. napi_disable/napi_enable was being called even when napi was not being used.
These changes have been fixed, and napi is now on by default.
--- drivers/net/fs_enet/fs_enet-main.c | 28 ++++++++++++++++------------ drivers/net/fs_enet/fs_enet.h | 1 + 2 files changed, 17 insertions(+), 12 deletions(-)
drivers/net/fs_enet/fs_enet-main.c +16 -12
@@ -88,7 +88,7 @@ static void skb_align(struct sk_buff *skb, int align)static int fs_enet_rx_napi (struct napi_struct *napi,int budget) { struct fs_enet_private *fep = container_of(napi, struct fs_enet_private, napi); -struct net_device *dev =to_net_dev (fep->dev); +struct net_device *dev = fep->ndev;const struct fs_platform_info *fpi = fep->fpi;cbd_t __iomem *bdp;struct sk_buff *skb, *skbn, *skbt;
@@ -217,7 +217,7 @@ static int fs_enet_rx_napi(struct napi_struct *napi, int budget) fep->cur_rx = bdp; -if (received >= budget) { +if (received < budget) {/* done */ netif_rx_complete (dev, napi); (*fep->ops->napi_enable_rx)(dev);
@@ -807,20 +807,23 @@ static int fs_enet_open(struct net_device *dev)int r;int err; -napi_enable (&fep->napi); +if (fep->fpi->use_napi) +napi_enable (&fep->napi);/* Install our interrupt handler. */ r =fs_request_irq (dev, fep->interrupt,"fs_enet-mac" , fs_enet_interrupt);if (r !=0 ) { printk(KERN_ERR DRV_MODULE_NAME ": %s Could not allocate FS_ENET IRQ!", dev->name); -napi_disable (&fep->napi); +if (fep->fpi->use_napi) +napi_disable (&fep->napi);return -EINVAL ; } err =fs_init_phy (dev); -if (err) { -napi_disable (&fep->napi); +if (err) { +if (fep->fpi->use_napi) +napi_disable (&fep->napi);return err; }phy_start (fep->phydev);
@@ -1232,7 +1235,7 @@ static int __devinit fs_enet_probe(struct of_device *ofdev, fpi->rx_ring =32 ; fpi->tx_ring =32 ; fpi->rx_copybreak =240 ; - fpi->use_napi =0 ; + fpi->use_napi =1 ; fpi->napi_weight =17 ; ret =find_phy (ofdev->node, fpi);
@@ -1249,11 +1252,11 @@ static int __devinit fs_enet_probe(struct of_device *ofdev, goto out_free_fpi; } -SET_MODULE_OWNER (ndev);dev_set_drvdata (&ofdev->dev, ndev); fep =netdev_priv (ndev); fep->dev = &ofdev->dev; + fep->ndev = ndev; fep->fpi = fpi; fep->ops = match->data;
@@ -1288,10 +1291,11 @@ static int __devinit fs_enet_probe(struct of_device *ofdev, ndev->stop = fs_enet_close; ndev->get_stats = fs_enet_get_stats; ndev->set_multicast_list = fs_set_multicast_list; -if (fpi->use_napi) { - ndev->poll = fs_enet_rx_napi; - ndev->weight = fpi->napi_weight; - } + +if (fpi->use_napi) +netif_napi_add (ndev, &fep->napi, fs_enet_rx_napi, + fpi->napi_weight); + ndev->ethtool_ops = &fs_ethtool_ops; ndev->do_ioctl = fs_ioctl;
drivers/net/fs_enet/fs_enet.h +1 -0
@@ -75,6 +75,7 @@ struct phy_info {struct fs_enet_private {struct napi_struct napi;struct device *dev;/* pointer back to the device (must be initialized first) */ +struct net_device *ndev;spinlock_t lock;/* during all ops except TX pckt processing */ spinlock_t tx_lock;/* during fs_start_xmit and fs_tx */ struct fs_platform_info *fpi;
Signature · 1 line
1.5.3.4
Hello Scott,
Quoted 13 lines · On Wed, 17 Oct 2007 12:42:43 -0500 Scott Wood wrote:
This driver was recently broken by several changes for which this driver was not (or was improperly) updated:
1.
SET_MODULE_OWNER()was removed.
2.netif_napi_add()was only being called when building with the old CPM binding.
3. The received/budget test was backwards.
4.to_net_dev()was wrong -- the device struct embedded in thenet_devicestruct is not the same as theof_platformdevice in the private struct.
5. napi_disable/napi_enable was being called even when napi was not being used.
Good cleanup, thanks!
Jeff: this is important fix, and should be applied if possible.
Quoted 3 lines
These changes have been fixed, and napi is now on by default.
Signed-off-by Scott Wood <[email protected]>
Quoted 105 lines
--- drivers/net/fs_enet/fs_enet-main.c | 28 ++++++++++++++++------------ drivers/net/fs_enet/fs_enet.h | 1 + 2 files changed, 17 insertions(+), 12 deletions(-)drivers/net/fs_enet/fs_enet-main.c +16
-12@@ -88,7 +88,7 @@ static void skb_align(struct sk_buff *skb, int align)static int fs_enet_rx_napi (struct napi_struct *napi,int budget) { struct fs_enet_private *fep = container_of(napi, struct fs_enet_private, napi); -struct net_device *dev =to_net_dev (fep->dev); +struct net_device *dev = fep->ndev;const struct fs_platform_info *fpi = fep->fpi;cbd_t __iomem *bdp;struct sk_buff *skb, *skbn, *skbt;@@ -217,7 +217,7 @@ static int fs_enet_rx_napi(struct napi_struct *napi, int budget) fep->cur_rx = bdp; -if (received >= budget) { +if (received < budget) {/* done */ netif_rx_complete (dev, napi); (*fep->ops->napi_enable_rx)(dev);@@ -807,20 +807,23 @@ static int fs_enet_open(struct net_device *dev)int r;int err; -napi_enable (&fep->napi); +if (fep->fpi->use_napi) +napi_enable (&fep->napi);/* Install our interrupt handler. */ r =fs_request_irq (dev, fep->interrupt,"fs_enet-mac" , fs_enet_interrupt);if (r !=0 ) { printk(KERN_ERR DRV_MODULE_NAME ": %s Could not allocate FS_ENET IRQ!", dev->name); -napi_disable (&fep->napi); +if (fep->fpi->use_napi) +napi_disable (&fep->napi);return -EINVAL ; } err =fs_init_phy (dev); -if (err) { -napi_disable (&fep->napi); +if (err) { +if (fep->fpi->use_napi) +napi_disable (&fep->napi);return err; }phy_start (fep->phydev);@@ -1232,7 +1235,7 @@ static int __devinit fs_enet_probe(struct of_device *ofdev, fpi->rx_ring =32 ; fpi->tx_ring =32 ; fpi->rx_copybreak =240 ; - fpi->use_napi =0 ; + fpi->use_napi =1 ; fpi->napi_weight =17 ; ret =find_phy (ofdev->node, fpi);@@ -1249,11 +1252,11 @@ static int __devinit fs_enet_probe(struct of_device *ofdev, goto out_free_fpi; } -SET_MODULE_OWNER (ndev);dev_set_drvdata (&ofdev->dev, ndev); fep =netdev_priv (ndev); fep->dev = &ofdev->dev; + fep->ndev = ndev; fep->fpi = fpi; fep->ops = match->data;@@ -1288,10 +1291,11 @@ static int __devinit fs_enet_probe(struct of_device *ofdev, ndev->stop = fs_enet_close; ndev->get_stats = fs_enet_get_stats; ndev->set_multicast_list = fs_set_multicast_list; -if (fpi->use_napi) { - ndev->poll = fs_enet_rx_napi; - ndev->weight = fpi->napi_weight; - } + +if (fpi->use_napi) +netif_napi_add (ndev, &fep->napi, fs_enet_rx_napi, + fpi->napi_weight); + ndev->ethtool_ops = &fs_ethtool_ops; ndev->do_ioctl = fs_ioctl;drivers/net/fs_enet/fs_enet.h +1
-0@@ -75,6 +75,7 @@ struct phy_info {struct fs_enet_private {struct napi_struct napi;struct device *dev;/* pointer back to the device (must be initialized first) */ +struct net_device *ndev;spinlock_t lock;/* during all ops except TX pckt processing */ spinlock_t tx_lock;/* during fs_start_xmit and fs_tx */ struct fs_platform_info *fpi;
Signature · 1 line
Sincerely, Vitaly
Jeff Garzik
AppliedQuoted 13 lines · Scott Wood
This driver was recently broken by several changes for which this driver was not (or was improperly) updated:
1.
SET_MODULE_OWNER()was removed.
2.netif_napi_add()was only being called when building with the old CPM binding.
3. The received/budget test was backwards.
4.to_net_dev()was wrong -- the device struct embedded in thenet_devicestruct is not the same as theof_platformdevice in the private struct.
5. napi_disable/napi_enable was being called even when napi was not being used.
Quoted 3 lines
These changes have been fixed, and napi is now on by default.
Signed-off-by Scott Wood <[email protected]>
applied