mirror of
https://github.com/FEX-Emu/linux.git
synced 2024-12-28 20:37:27 +00:00
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>
This commit is contained in:
parent
bfe7244257
commit
81d2dd09ca
@ -613,7 +613,7 @@ static int mtk_tx_map(struct sk_buff *skb, struct net_device *dev,
|
||||
struct mtk_mac *mac = netdev_priv(dev);
|
||||
struct mtk_eth *eth = mac->hw;
|
||||
struct mtk_tx_dma *itxd, *txd;
|
||||
struct mtk_tx_buf *tx_buf;
|
||||
struct mtk_tx_buf *itx_buf, *tx_buf;
|
||||
dma_addr_t mapped_addr;
|
||||
unsigned int nr_frags;
|
||||
int i, n_desc = 1;
|
||||
@ -627,8 +627,8 @@ static int mtk_tx_map(struct sk_buff *skb, struct net_device *dev,
|
||||
fport = (mac->id + 1) << TX_DMA_FPORT_SHIFT;
|
||||
txd4 |= fport;
|
||||
|
||||
tx_buf = mtk_desc_to_tx_buf(ring, itxd);
|
||||
memset(tx_buf, 0, sizeof(*tx_buf));
|
||||
itx_buf = mtk_desc_to_tx_buf(ring, itxd);
|
||||
memset(itx_buf, 0, sizeof(*itx_buf));
|
||||
|
||||
if (gso)
|
||||
txd4 |= TX_DMA_TSO;
|
||||
@ -647,9 +647,9 @@ static int mtk_tx_map(struct sk_buff *skb, struct net_device *dev,
|
||||
return -ENOMEM;
|
||||
|
||||
WRITE_ONCE(itxd->txd1, mapped_addr);
|
||||
tx_buf->flags |= MTK_TX_FLAGS_SINGLE0;
|
||||
dma_unmap_addr_set(tx_buf, dma_addr0, mapped_addr);
|
||||
dma_unmap_len_set(tx_buf, dma_len0, skb_headlen(skb));
|
||||
itx_buf->flags |= MTK_TX_FLAGS_SINGLE0;
|
||||
dma_unmap_addr_set(itx_buf, dma_addr0, mapped_addr);
|
||||
dma_unmap_len_set(itx_buf, dma_len0, skb_headlen(skb));
|
||||
|
||||
/* TX SG offload */
|
||||
txd = itxd;
|
||||
@ -685,10 +685,9 @@ static int mtk_tx_map(struct sk_buff *skb, struct net_device *dev,
|
||||
last_frag * TX_DMA_LS0));
|
||||
WRITE_ONCE(txd->txd4, fport);
|
||||
|
||||
tx_buf->skb = (struct sk_buff *)MTK_DMA_DUMMY_DESC;
|
||||
tx_buf = mtk_desc_to_tx_buf(ring, txd);
|
||||
memset(tx_buf, 0, sizeof(*tx_buf));
|
||||
|
||||
tx_buf->skb = (struct sk_buff *)MTK_DMA_DUMMY_DESC;
|
||||
tx_buf->flags |= MTK_TX_FLAGS_PAGE0;
|
||||
dma_unmap_addr_set(tx_buf, dma_addr0, mapped_addr);
|
||||
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,
|
||||
}
|
||||
|
||||
/* store skb to cleanup */
|
||||
tx_buf->skb = skb;
|
||||
itx_buf->skb = skb;
|
||||
|
||||
WRITE_ONCE(itxd->txd4, txd4);
|
||||
WRITE_ONCE(itxd->txd3, (TX_DMA_SWC | TX_DMA_PLEN0(skb_headlen(skb)) |
|
||||
|
Loading…
Reference in New Issue
Block a user