summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorTroy Kisky <troy.kisky@boundarydevices.com>2014-03-05 16:42:39 -0700
committerTroy Kisky <troy.kisky@boundarydevices.com>2014-04-24 18:59:46 -0700
commita90fc3e972819b1359fa90ede7deeb52b5a5c729 (patch)
treea2f765afc0230c405e7807fb57f27f64241a9502 /drivers
parent757bb599d3ab08a4406845d2824fda7bda96c73c (diff)
fec_main: only schedule quirk if controller is active
Diffstat (limited to 'drivers')
-rw-r--r--drivers/net/ethernet/freescale/fec_main.c20
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);