summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorTroy Kisky <troy.kisky@boundarydevices.com>2014-03-05 17:23:57 -0700
committerTroy Kisky <troy.kisky@boundarydevices.com>2014-04-24 18:59:46 -0700
commit86c1e3efd5e4db9ebc32a282e85db32d9ec2c2e4 (patch)
treec67d4f09ca83f8d7232542f47945c52ff819261a /drivers
parenta90fc3e972819b1359fa90ede7deeb52b5a5c729 (diff)
fec_main: test for restart quirk in fec_enet_tx
Diffstat (limited to 'drivers')
-rw-r--r--drivers/net/ethernet/freescale/fec_main.c22
1 files changed, 18 insertions, 4 deletions
diff --git a/drivers/net/ethernet/freescale/fec_main.c b/drivers/net/ethernet/freescale/fec_main.c
index 2925488ad8b6..8daefbd5571a 100644
--- a/drivers/net/ethernet/freescale/fec_main.c
+++ b/drivers/net/ethernet/freescale/fec_main.c
@@ -735,11 +735,25 @@ fec_enet_tx(struct net_device *ndev)
/* get next bdp of dirty_tx */
bdp = fec_enet_get_nextdesc(bdp, &fep->bd_tx);
- while (((status = bdp->cbd_sc) & BD_ENET_TX_READY) == 0) {
-
- /* current queue is empty */
- if (bdp == fep->bd_tx.cur)
+ while (bdp != fep->bd_tx.cur) {
+ status = bdp->cbd_sc;
+ if (status & BD_ENET_TX_READY) {
+ /* Test for ERR006358 workaround */
+ if (readl(fep->hwp + FEC_X_DES_ACTIVE)) {
+ const struct platform_device_id *id_entry =
+ platform_get_device_id(fep->pdev);
+ if (id_entry->driver_data & FEC_QUIRK_ERR006358) {
+ fep->delay_work.trig_tx = true;
+ schedule_delayed_work(
+ &fep->delay_work.delay_work,
+ msecs_to_jiffies(1) + 1);
+ }
+ } else {
+ /* ERR006358 has hit, restart tx */
+ writel(0, fep->hwp + FEC_X_DES_ACTIVE);
+ }
break;
+ }
if (fep->bufdesc_ex)
index = (struct bufdesc_ex *)bdp -