aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet/mediatek
diff options
context:
space:
mode:
authorSean Wang <sean.wang@mediatek.com>2016-08-31 22:47:27 -0400
committerDavid S. Miller <davem@davemloft.net>2016-08-31 23:53:47 -0400
commitc6f1dc4d9ce275c1bd9d90b5630f36ca6abccc97 (patch)
tree345f875d57002986e31c563ff3a1fc6d2263e466 /drivers/net/ethernet/mediatek
parent9264251ee2a55bce8fb93826b3f581fb9eb7e2c2 (diff)
net: ethernet: mediatek: fix fails from TX housekeeping due to incorrect port setup
which net device the SKB is complete for depends on the forward port on txd4 on the corresponding TX descriptor, but the information isn't set up well in case of SKB fragments that would lead to watchdog timeout from the upper layer, so fix it up. Signed-off-by: Sean Wang <sean.wang@mediatek.com> Acked-by: John Crispin <john@phrozen.org> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/ethernet/mediatek')
-rw-r--r--drivers/net/ethernet/mediatek/mtk_eth_soc.c7
1 files changed, 4 insertions, 3 deletions
diff --git a/drivers/net/ethernet/mediatek/mtk_eth_soc.c b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
index f1609542adf1..7fc2ff0c5bf0 100644
--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
@@ -588,14 +588,15 @@ static int mtk_tx_map(struct sk_buff *skb, struct net_device *dev,
588 dma_addr_t mapped_addr; 588 dma_addr_t mapped_addr;
589 unsigned int nr_frags; 589 unsigned int nr_frags;
590 int i, n_desc = 1; 590 int i, n_desc = 1;
591 u32 txd4 = 0; 591 u32 txd4 = 0, fport;
592 592
593 itxd = ring->next_free; 593 itxd = ring->next_free;
594 if (itxd == ring->last_free) 594 if (itxd == ring->last_free)
595 return -ENOMEM; 595 return -ENOMEM;
596 596
597 /* set the forward port */ 597 /* set the forward port */
598 txd4 |= (mac->id + 1) << TX_DMA_FPORT_SHIFT; 598 fport = (mac->id + 1) << TX_DMA_FPORT_SHIFT;
599 txd4 |= fport;
599 600
600 tx_buf = mtk_desc_to_tx_buf(ring, itxd); 601 tx_buf = mtk_desc_to_tx_buf(ring, itxd);
601 memset(tx_buf, 0, sizeof(*tx_buf)); 602 memset(tx_buf, 0, sizeof(*tx_buf));
@@ -653,7 +654,7 @@ static int mtk_tx_map(struct sk_buff *skb, struct net_device *dev,
653 WRITE_ONCE(txd->txd3, (TX_DMA_SWC | 654 WRITE_ONCE(txd->txd3, (TX_DMA_SWC |
654 TX_DMA_PLEN0(frag_map_size) | 655 TX_DMA_PLEN0(frag_map_size) |
655 last_frag * TX_DMA_LS0)); 656 last_frag * TX_DMA_LS0));
656 WRITE_ONCE(txd->txd4, 0); 657 WRITE_ONCE(txd->txd4, fport);
657 658
658 tx_buf->skb = (struct sk_buff *)MTK_DMA_DUMMY_DESC; 659 tx_buf->skb = (struct sk_buff *)MTK_DMA_DUMMY_DESC;
659 tx_buf = mtk_desc_to_tx_buf(ring, txd); 660 tx_buf = mtk_desc_to_tx_buf(ring, txd);