752-09-v6.7-net-ethernet-mtk_wed-introduce-mtk_wed_buf-structure.patch 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. From: Lorenzo Bianconi <[email protected]>
  2. Date: Mon, 18 Sep 2023 12:29:08 +0200
  3. Subject: [PATCH] net: ethernet: mtk_wed: introduce mtk_wed_buf structure
  4. Introduce mtk_wed_buf structure to store both virtual and physical
  5. addresses allocated in mtk_wed_tx_buffer_alloc() routine. This is a
  6. preliminary patch to add WED support for MT7988 SoC since it relies on a
  7. different dma descriptor layout not storing page dma addresses.
  8. Co-developed-by: Sujuan Chen <[email protected]>
  9. Signed-off-by: Sujuan Chen <[email protected]>
  10. Signed-off-by: Lorenzo Bianconi <[email protected]>
  11. Signed-off-by: Paolo Abeni <[email protected]>
  12. ---
  13. --- a/drivers/net/ethernet/mediatek/mtk_wed.c
  14. +++ b/drivers/net/ethernet/mediatek/mtk_wed.c
  15. @@ -300,9 +300,9 @@ out:
  16. static int
  17. mtk_wed_tx_buffer_alloc(struct mtk_wed_device *dev)
  18. {
  19. + struct mtk_wed_buf *page_list;
  20. struct mtk_wdma_desc *desc;
  21. dma_addr_t desc_phys;
  22. - void **page_list;
  23. int token = dev->wlan.token_start;
  24. int ring_size;
  25. int n_pages;
  26. @@ -343,7 +343,8 @@ mtk_wed_tx_buffer_alloc(struct mtk_wed_d
  27. return -ENOMEM;
  28. }
  29. - page_list[page_idx++] = page;
  30. + page_list[page_idx].p = page;
  31. + page_list[page_idx++].phy_addr = page_phys;
  32. dma_sync_single_for_cpu(dev->hw->dev, page_phys, PAGE_SIZE,
  33. DMA_BIDIRECTIONAL);
  34. @@ -387,8 +388,8 @@ mtk_wed_tx_buffer_alloc(struct mtk_wed_d
  35. static void
  36. mtk_wed_free_tx_buffer(struct mtk_wed_device *dev)
  37. {
  38. + struct mtk_wed_buf *page_list = dev->tx_buf_ring.pages;
  39. struct mtk_wdma_desc *desc = dev->tx_buf_ring.desc;
  40. - void **page_list = dev->tx_buf_ring.pages;
  41. int page_idx;
  42. int i;
  43. @@ -400,13 +401,12 @@ mtk_wed_free_tx_buffer(struct mtk_wed_de
  44. for (i = 0, page_idx = 0; i < dev->tx_buf_ring.size;
  45. i += MTK_WED_BUF_PER_PAGE) {
  46. - void *page = page_list[page_idx++];
  47. - dma_addr_t buf_addr;
  48. + dma_addr_t buf_addr = page_list[page_idx].phy_addr;
  49. + void *page = page_list[page_idx++].p;
  50. if (!page)
  51. break;
  52. - buf_addr = le32_to_cpu(desc[i].buf0);
  53. dma_unmap_page(dev->hw->dev, buf_addr, PAGE_SIZE,
  54. DMA_BIDIRECTIONAL);
  55. __free_page(page);
  56. --- a/include/linux/soc/mediatek/mtk_wed.h
  57. +++ b/include/linux/soc/mediatek/mtk_wed.h
  58. @@ -76,6 +76,11 @@ struct mtk_wed_wo_rx_stats {
  59. __le32 rx_drop_cnt;
  60. };
  61. +struct mtk_wed_buf {
  62. + void *p;
  63. + dma_addr_t phy_addr;
  64. +};
  65. +
  66. struct mtk_wed_device {
  67. #ifdef CONFIG_NET_MEDIATEK_SOC_WED
  68. const struct mtk_wed_ops *ops;
  69. @@ -97,7 +102,7 @@ struct mtk_wed_device {
  70. struct {
  71. int size;
  72. - void **pages;
  73. + struct mtk_wed_buf *pages;
  74. struct mtk_wdma_desc *desc;
  75. dma_addr_t desc_phys;
  76. } tx_buf_ring;