diff options
author | Troy Kisky <troy.kisky@boundarydevices.com> | 2014-03-05 16:42:39 -0700 |
---|---|---|
committer | Troy Kisky <troy.kisky@boundarydevices.com> | 2014-04-24 18:59:46 -0700 |
commit | a90fc3e972819b1359fa90ede7deeb52b5a5c729 (patch) | |
tree | a2f765afc0230c405e7807fb57f27f64241a9502 /drivers | |
parent | 757bb599d3ab08a4406845d2824fda7bda96c73c (diff) |
fec_main: only schedule quirk if controller is active
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/net/ethernet/freescale/fec_main.c | 20 |
1 files changed, 12 insertions, 8 deletions
diff --git a/drivers/net/ethernet/freescale/fec_main.c b/drivers/net/ethernet/freescale/fec_main.c index f9b1886e2aa0..2925488ad8b6 100644 --- a/drivers/net/ethernet/freescale/fec_main.c +++ b/drivers/net/ethernet/freescale/fec_main.c @@ -290,8 +290,9 @@ fec_enet_start_xmit(struct sk_buff *skb, struct net_device *ndev) struct fec_enet_private *fep = netdev_priv(ndev); const struct platform_device_id *id_entry = platform_get_device_id(fep->pdev); - struct bufdesc *bdp, *bdp_pre; + struct bufdesc *bdp; void *bufaddr; + unsigned short prev_status; unsigned int index; /* Fill in a Tx ring entry */ @@ -383,13 +384,8 @@ fec_enet_start_xmit(struct sk_buff *skb, struct net_device *ndev) bdp->cbd_sc = BD_ENET_TX_READY | BD_ENET_TX_INTR | BD_ENET_TX_LAST | BD_ENET_TX_TC | ((bdp == fep->bd_tx.last) ? BD_SC_WRAP : 0); - bdp_pre = fec_enet_get_prevdesc(bdp, &fep->bd_tx); - if ((id_entry->driver_data & FEC_QUIRK_ERR006358) && - !(bdp_pre->cbd_sc & BD_ENET_TX_READY)) { - fep->delay_work.trig_tx = true; - schedule_delayed_work(&(fep->delay_work.delay_work), - msecs_to_jiffies(1)); - } + mb(); + prev_status = fec_enet_get_prevdesc(bdp, &fep->bd_tx)->cbd_sc; /* If this was the last BD in the ring, start at the beginning again. */ bdp = fec_enet_get_nextdesc(bdp, &fep->bd_tx); @@ -401,6 +397,14 @@ fec_enet_start_xmit(struct sk_buff *skb, struct net_device *ndev) if (fep->bd_tx.cur == fep->dirty_tx) netif_stop_queue(ndev); + if ((id_entry->driver_data & FEC_QUIRK_ERR006358) && + !(prev_status & BD_ENET_TX_READY)) { + if (readl(fep->hwp + FEC_X_DES_ACTIVE)) { + fep->delay_work.trig_tx = true; + schedule_delayed_work(&(fep->delay_work.delay_work), + msecs_to_jiffies(1) + 1); + } + } /* Trigger transmission start */ writel(0, fep->hwp + FEC_X_DES_ACTIVE); |