提交 f860f49e 编写于 作者: S Scott Wood 提交者: Jeff Garzik

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.
Signed-off-by: NScott Wood <scottwood@freescale.com>
Signed-off-by: NJeff Garzik <jeff@garzik.org>
上级 6880e7cb
...@@ -88,7 +88,7 @@ static void skb_align(struct sk_buff *skb, int align) ...@@ -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) 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 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; const struct fs_platform_info *fpi = fep->fpi;
cbd_t __iomem *bdp; cbd_t __iomem *bdp;
struct sk_buff *skb, *skbn, *skbt; struct sk_buff *skb, *skbn, *skbt;
...@@ -217,7 +217,7 @@ static int fs_enet_rx_napi(struct napi_struct *napi, int budget) ...@@ -217,7 +217,7 @@ static int fs_enet_rx_napi(struct napi_struct *napi, int budget)
fep->cur_rx = bdp; fep->cur_rx = bdp;
if (received >= budget) { if (received < budget) {
/* done */ /* done */
netif_rx_complete(dev, napi); netif_rx_complete(dev, napi);
(*fep->ops->napi_enable_rx)(dev); (*fep->ops->napi_enable_rx)(dev);
...@@ -807,20 +807,23 @@ static int fs_enet_open(struct net_device *dev) ...@@ -807,20 +807,23 @@ static int fs_enet_open(struct net_device *dev)
int r; int r;
int err; int err;
napi_enable(&fep->napi); if (fep->fpi->use_napi)
napi_enable(&fep->napi);
/* Install our interrupt handler. */ /* Install our interrupt handler. */
r = fs_request_irq(dev, fep->interrupt, "fs_enet-mac", fs_enet_interrupt); r = fs_request_irq(dev, fep->interrupt, "fs_enet-mac", fs_enet_interrupt);
if (r != 0) { if (r != 0) {
printk(KERN_ERR DRV_MODULE_NAME printk(KERN_ERR DRV_MODULE_NAME
": %s Could not allocate FS_ENET IRQ!", dev->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; return -EINVAL;
} }
err = fs_init_phy(dev); err = fs_init_phy(dev);
if(err) { if (err) {
napi_disable(&fep->napi); if (fep->fpi->use_napi)
napi_disable(&fep->napi);
return err; return err;
} }
phy_start(fep->phydev); phy_start(fep->phydev);
...@@ -1232,7 +1235,7 @@ static int __devinit fs_enet_probe(struct of_device *ofdev, ...@@ -1232,7 +1235,7 @@ static int __devinit fs_enet_probe(struct of_device *ofdev,
fpi->rx_ring = 32; fpi->rx_ring = 32;
fpi->tx_ring = 32; fpi->tx_ring = 32;
fpi->rx_copybreak = 240; fpi->rx_copybreak = 240;
fpi->use_napi = 0; fpi->use_napi = 1;
fpi->napi_weight = 17; fpi->napi_weight = 17;
ret = find_phy(ofdev->node, fpi); ret = find_phy(ofdev->node, fpi);
...@@ -1249,11 +1252,11 @@ static int __devinit fs_enet_probe(struct of_device *ofdev, ...@@ -1249,11 +1252,11 @@ static int __devinit fs_enet_probe(struct of_device *ofdev,
goto out_free_fpi; goto out_free_fpi;
} }
SET_MODULE_OWNER(ndev);
dev_set_drvdata(&ofdev->dev, ndev); dev_set_drvdata(&ofdev->dev, ndev);
fep = netdev_priv(ndev); fep = netdev_priv(ndev);
fep->dev = &ofdev->dev; fep->dev = &ofdev->dev;
fep->ndev = ndev;
fep->fpi = fpi; fep->fpi = fpi;
fep->ops = match->data; fep->ops = match->data;
...@@ -1288,10 +1291,11 @@ static int __devinit fs_enet_probe(struct of_device *ofdev, ...@@ -1288,10 +1291,11 @@ static int __devinit fs_enet_probe(struct of_device *ofdev,
ndev->stop = fs_enet_close; ndev->stop = fs_enet_close;
ndev->get_stats = fs_enet_get_stats; ndev->get_stats = fs_enet_get_stats;
ndev->set_multicast_list = fs_set_multicast_list; ndev->set_multicast_list = fs_set_multicast_list;
if (fpi->use_napi) {
ndev->poll = fs_enet_rx_napi; if (fpi->use_napi)
ndev->weight = fpi->napi_weight; netif_napi_add(ndev, &fep->napi, fs_enet_rx_napi,
} fpi->napi_weight);
ndev->ethtool_ops = &fs_ethtool_ops; ndev->ethtool_ops = &fs_ethtool_ops;
ndev->do_ioctl = fs_ioctl; ndev->do_ioctl = fs_ioctl;
......
...@@ -75,6 +75,7 @@ struct phy_info { ...@@ -75,6 +75,7 @@ struct phy_info {
struct fs_enet_private { struct fs_enet_private {
struct napi_struct napi; struct napi_struct napi;
struct device *dev; /* pointer back to the device (must be initialized first) */ 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 lock; /* during all ops except TX pckt processing */
spinlock_t tx_lock; /* during fs_start_xmit and fs_tx */ spinlock_t tx_lock; /* during fs_start_xmit and fs_tx */
struct fs_platform_info *fpi; struct fs_platform_info *fpi;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册