diff options
author | Troy Kisky <troy.kisky@boundarydevices.com> | 2014-03-05 16:18:12 -0700 |
---|---|---|
committer | Troy Kisky <troy.kisky@boundarydevices.com> | 2014-04-24 18:59:44 -0700 |
commit | d186dd7f101b2266f2f464548babdd6736f56c19 (patch) | |
tree | 41b5168d576b6cc24cfe3a7fba0bc64f097b0324 /drivers | |
parent | d38633a3c4c95a84d446588af6f55af1e2232597 (diff) |
fec_main: give tx descriptor to controller AFTER writing extended info
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/net/ethernet/freescale/fec_main.c | 16 |
1 files changed, 10 insertions, 6 deletions
diff --git a/drivers/net/ethernet/freescale/fec_main.c b/drivers/net/ethernet/freescale/fec_main.c index 8209b1642f68..c30b43070486 100644 --- a/drivers/net/ethernet/freescale/fec_main.c +++ b/drivers/net/ethernet/freescale/fec_main.c @@ -358,12 +358,6 @@ fec_enet_start_xmit(struct sk_buff *skb, struct net_device *ndev) netdev_err(ndev, "Tx DMA memory map failed\n"); return NETDEV_TX_OK; } - /* Send it on its way. Tell FEC it's ready, interrupt when done, - * it's the last BD of the frame, and to put the CRC on the end. - */ - status |= (BD_ENET_TX_READY | BD_ENET_TX_INTR - | BD_ENET_TX_LAST | BD_ENET_TX_TC); - bdp->cbd_sc = status; if (fep->bufdesc_ex) { @@ -386,6 +380,16 @@ fec_enet_start_xmit(struct sk_buff *skb, struct net_device *ndev) } } + /* Ensure the next write happens after the extended writes */ + wmb(); + /* + * Send it on its way. Tell FEC it's ready, interrupt when done, + * it's the last BD of the frame, and to put the CRC on the end. + */ + status |= (BD_ENET_TX_READY | BD_ENET_TX_INTR + | BD_ENET_TX_LAST | BD_ENET_TX_TC); + bdp->cbd_sc = status; + 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)) { |