770-10-net-ethernet-mtk_eth_soc-unmap-rx-data-before-callin.patch 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. From: Felix Fietkau <[email protected]>
  2. Date: Thu, 27 Aug 2020 09:44:43 +0200
  3. Subject: [PATCH] net: ethernet: mtk_eth_soc: unmap rx data before calling
  4. build_skb
  5. Since build_skb accesses the data area (for initializing shinfo), dma unmap
  6. needs to happen before that call
  7. Signed-off-by: Felix Fietkau <[email protected]>
  8. ---
  9. --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
  10. +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
  11. @@ -1293,17 +1293,18 @@ static int mtk_poll_rx(struct napi_struc
  12. goto release_desc;
  13. }
  14. + dma_unmap_single(eth->dev, trxd.rxd1,
  15. + ring->buf_size, DMA_FROM_DEVICE);
  16. +
  17. /* receive data */
  18. skb = build_skb(data, ring->frag_size);
  19. if (unlikely(!skb)) {
  20. - skb_free_frag(new_data);
  21. + skb_free_frag(data);
  22. netdev->stats.rx_dropped++;
  23. - goto release_desc;
  24. + goto skip_rx;
  25. }
  26. skb_reserve(skb, NET_SKB_PAD + NET_IP_ALIGN);
  27. - dma_unmap_single(eth->dev, trxd.rxd1,
  28. - ring->buf_size, DMA_FROM_DEVICE);
  29. pktlen = RX_DMA_GET_PLEN0(trxd.rxd2);
  30. skb->dev = netdev;
  31. skb_put(skb, pktlen);
  32. @@ -1321,6 +1322,7 @@ static int mtk_poll_rx(struct napi_struc
  33. skb_record_rx_queue(skb, 0);
  34. napi_gro_receive(napi, skb);
  35. +skip_rx:
  36. ring->data[idx] = new_data;
  37. rxd->rxd1 = (unsigned int)dma_addr;