diff options
| author | Sean Wang <sean.wang@mediatek.com> | 2017-04-13 23:19:11 -0400 |
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2017-04-17 13:33:58 -0400 |
| commit | 81d2dd09ca11a2b834c8a915c6aabf8325d57ecf (patch) | |
| tree | b9bedca953f51b7a57c4d5fd61c28870fb9825ee | |
| parent | bfe72442578bb112626e476ffe1f276504d85b95 (diff) | |
net: ethernet: mediatek: fix inconsistency between TXD and the used buffer
Fix inconsistency between the TXD descriptor and the used buffer that
would cause unexpected logic at mtk_tx_unmap() during skb housekeeping.
Signed-off-by: Sean Wang <sean.wang@mediatek.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
| -rw-r--r-- | drivers/net/ethernet/mediatek/mtk_eth_soc.c | 17 |
1 files changed, 8 insertions, 9 deletions
diff --git a/drivers/net/ethernet/mediatek/mtk_eth_soc.c b/drivers/net/ethernet/mediatek/mtk_eth_soc.c index 9e757684816d..50a6fe87e990 100644 --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c | |||
| @@ -613,7 +613,7 @@ static int mtk_tx_map(struct sk_buff *skb, struct net_device *dev, | |||
| 613 | struct mtk_mac *mac = netdev_priv(dev); | 613 | struct mtk_mac *mac = netdev_priv(dev); |
| 614 | struct mtk_eth *eth = mac->hw; | 614 | struct mtk_eth *eth = mac->hw; |
| 615 | struct mtk_tx_dma *itxd, *txd; | 615 | struct mtk_tx_dma *itxd, *txd; |
| 616 | struct mtk_tx_buf *tx_buf; | 616 | struct mtk_tx_buf *itx_buf, *tx_buf; |
| 617 | dma_addr_t mapped_addr; | 617 | dma_addr_t mapped_addr; |
| 618 | unsigned int nr_frags; | 618 | unsigned int nr_frags; |
| 619 | int i, n_desc = 1; | 619 | int i, n_desc = 1; |
| @@ -627,8 +627,8 @@ static int mtk_tx_map(struct sk_buff *skb, struct net_device *dev, | |||
| 627 | fport = (mac->id + 1) << TX_DMA_FPORT_SHIFT; | 627 | fport = (mac->id + 1) << TX_DMA_FPORT_SHIFT; |
| 628 | txd4 |= fport; | 628 | txd4 |= fport; |
| 629 | 629 | ||
| 630 | tx_buf = mtk_desc_to_tx_buf(ring, itxd); | 630 | itx_buf = mtk_desc_to_tx_buf(ring, itxd); |
| 631 | memset(tx_buf, 0, sizeof(*tx_buf)); | 631 | memset(itx_buf, 0, sizeof(*itx_buf)); |
| 632 | 632 | ||
| 633 | if (gso) | 633 | if (gso) |
| 634 | txd4 |= TX_DMA_TSO; | 634 | txd4 |= TX_DMA_TSO; |
| @@ -647,9 +647,9 @@ static int mtk_tx_map(struct sk_buff *skb, struct net_device *dev, | |||
| 647 | return -ENOMEM; | 647 | return -ENOMEM; |
| 648 | 648 | ||
| 649 | WRITE_ONCE(itxd->txd1, mapped_addr); | 649 | WRITE_ONCE(itxd->txd1, mapped_addr); |
| 650 | tx_buf->flags |= MTK_TX_FLAGS_SINGLE0; | 650 | itx_buf->flags |= MTK_TX_FLAGS_SINGLE0; |
| 651 | dma_unmap_addr_set(tx_buf, dma_addr0, mapped_addr); | 651 | dma_unmap_addr_set(itx_buf, dma_addr0, mapped_addr); |
| 652 | dma_unmap_len_set(tx_buf, dma_len0, skb_headlen(skb)); | 652 | dma_unmap_len_set(itx_buf, dma_len0, skb_headlen(skb)); |
| 653 | 653 | ||
| 654 | /* TX SG offload */ | 654 | /* TX SG offload */ |
| 655 | txd = itxd; | 655 | txd = itxd; |
| @@ -685,10 +685,9 @@ static int mtk_tx_map(struct sk_buff *skb, struct net_device *dev, | |||
| 685 | last_frag * TX_DMA_LS0)); | 685 | last_frag * TX_DMA_LS0)); |
| 686 | WRITE_ONCE(txd->txd4, fport); | 686 | WRITE_ONCE(txd->txd4, fport); |
| 687 | 687 | ||
| 688 | tx_buf->skb = (struct sk_buff *)MTK_DMA_DUMMY_DESC; | ||
| 689 | tx_buf = mtk_desc_to_tx_buf(ring, txd); | 688 | tx_buf = mtk_desc_to_tx_buf(ring, txd); |
| 690 | memset(tx_buf, 0, sizeof(*tx_buf)); | 689 | memset(tx_buf, 0, sizeof(*tx_buf)); |
| 691 | 690 | tx_buf->skb = (struct sk_buff *)MTK_DMA_DUMMY_DESC; | |
| 692 | tx_buf->flags |= MTK_TX_FLAGS_PAGE0; | 691 | tx_buf->flags |= MTK_TX_FLAGS_PAGE0; |
| 693 | dma_unmap_addr_set(tx_buf, dma_addr0, mapped_addr); | 692 | dma_unmap_addr_set(tx_buf, dma_addr0, mapped_addr); |
| 694 | dma_unmap_len_set(tx_buf, dma_len0, frag_map_size); | 693 | dma_unmap_len_set(tx_buf, dma_len0, frag_map_size); |
| @@ -698,7 +697,7 @@ static int mtk_tx_map(struct sk_buff *skb, struct net_device *dev, | |||
| 698 | } | 697 | } |
| 699 | 698 | ||
| 700 | /* store skb to cleanup */ | 699 | /* store skb to cleanup */ |
| 701 | tx_buf->skb = skb; | 700 | itx_buf->skb = skb; |
| 702 | 701 | ||
| 703 | WRITE_ONCE(itxd->txd4, txd4); | 702 | WRITE_ONCE(itxd->txd4, txd4); |
| 704 | WRITE_ONCE(itxd->txd3, (TX_DMA_SWC | TX_DMA_PLEN0(skb_headlen(skb)) | | 703 | WRITE_ONCE(itxd->txd3, (TX_DMA_SWC | TX_DMA_PLEN0(skb_headlen(skb)) | |
