0057-net-mediatek-add-HW-QoS-support.patch 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. From 660c13dfbacbf37f090a66a2b14f0c5ce7cbec81 Mon Sep 17 00:00:00 2001
  2. From: John Crispin <[email protected]>
  3. Date: Thu, 10 Aug 2017 16:38:27 +0200
  4. Subject: [PATCH 57/57] net: mediatek: add HW QoS support
  5. Signed-off-by: John Crispin <[email protected]>
  6. ---
  7. drivers/net/ethernet/mediatek/Kconfig | 7 ++++
  8. drivers/net/ethernet/mediatek/mtk_eth_soc.c | 60 ++++++++++++++++++++++++++++-
  9. drivers/net/ethernet/mediatek/mtk_eth_soc.h | 2 +-
  10. 3 files changed, 66 insertions(+), 3 deletions(-)
  11. --- a/drivers/net/ethernet/mediatek/Kconfig
  12. +++ b/drivers/net/ethernet/mediatek/Kconfig
  13. @@ -21,4 +21,11 @@ config NET_MEDIATEK_HNAT
  14. This driver supports the hardwaer NAT in the
  15. MediaTek MT2701/MT7623 chipset family.
  16. +config NET_MEDIATEK_HW_QOS
  17. + tristate "MediaTek MT7623 hardware QoS support"
  18. + depends on NET_MEDIATEK_SOC
  19. + ---help---
  20. + This driver supports the hardware QoS in the
  21. + MediaTek MT2701/MT7623 chipset family.
  22. +
  23. endif #NET_VENDOR_MEDIATEK
  24. --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
  25. +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
  26. @@ -23,6 +23,17 @@
  27. #include <linux/reset.h>
  28. #include <linux/tcp.h>
  29. +#if defined(CONFIG_NET_MEDIATEK_HW_QOS)
  30. +struct mtk_ioctl_reg {
  31. + unsigned int off;
  32. + unsigned int val;
  33. +};
  34. +
  35. +#define REG_HQOS_MAX 0x3FFF
  36. +#define RAETH_QDMA_REG_READ 0x89F8
  37. +#define RAETH_QDMA_REG_WRITE 0x89F9
  38. +#endif
  39. +
  40. #if defined(CONFIG_NET_MEDIATEK_HNAT) || defined(CONFIG_NET_MEDIATEK_HNAT_MODULE)
  41. #include "mtk_hnat/nf_hnat_mtk.h"
  42. #endif
  43. @@ -646,7 +657,7 @@ static int mtk_tx_map(struct sk_buff *sk
  44. dma_addr_t mapped_addr;
  45. unsigned int nr_frags;
  46. int i, n_desc = 1;
  47. - u32 txd4 = 0, fport;
  48. + u32 txd3 = 0, txd4 = 0, fport;
  49. itxd = ring->next_free;
  50. if (itxd == ring->last_free)
  51. @@ -675,6 +686,12 @@ static int mtk_tx_map(struct sk_buff *sk
  52. // if (skb_vlan_tag_present(skb))
  53. // txd4 |= TX_DMA_INS_VLAN | skb_vlan_tag_get(skb);
  54. +#ifdef CONFIG_NET_MEDIATEK_HW_QOS
  55. + txd3 |= skb->mark & 0x7;
  56. + if (mac->id)
  57. + txd3 += 8;
  58. +#endif
  59. +
  60. mapped_addr = dma_map_single(eth->dev, skb->data,
  61. skb_headlen(skb), DMA_TO_DEVICE);
  62. if (unlikely(dma_mapping_error(eth->dev, mapped_addr)))
  63. @@ -718,7 +735,8 @@ static int mtk_tx_map(struct sk_buff *sk
  64. WRITE_ONCE(txd->txd1, mapped_addr);
  65. WRITE_ONCE(txd->txd3, (TX_DMA_SWC |
  66. TX_DMA_PLEN0(frag_map_size) |
  67. - last_frag * TX_DMA_LS0));
  68. + last_frag * TX_DMA_LS0 |
  69. + txd3));
  70. WRITE_ONCE(txd->txd4, fport);
  71. tx_buf = mtk_desc_to_tx_buf(ring, txd);
  72. @@ -2029,7 +2047,31 @@ static void mtk_uninit(struct net_device
  73. static int mtk_do_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
  74. {
  75. +#if defined(CONFIG_NET_MEDIATEK_HW_QOS)
  76. + struct mtk_mac *mac = netdev_priv(dev);
  77. + struct mtk_eth *eth = mac->hw;
  78. + struct mtk_ioctl_reg reg;
  79. +#endif
  80. +
  81. switch (cmd) {
  82. +#if defined(CONFIG_NET_MEDIATEK_HW_QOS)
  83. + case RAETH_QDMA_REG_READ:
  84. + copy_from_user(&reg, ifr->ifr_data, sizeof(reg));
  85. + if (reg.off > REG_HQOS_MAX)
  86. + return -EINVAL;
  87. + reg.val = mtk_r32(eth, 0x1800 + reg.off);
  88. +// printk("read reg off:%x val:%x\n", reg.off, reg.val);
  89. + copy_to_user(ifr->ifr_data, &reg, sizeof(reg));
  90. + return 0;
  91. +
  92. + case RAETH_QDMA_REG_WRITE:
  93. + copy_from_user(&reg, ifr->ifr_data, sizeof(reg));
  94. + if (reg.off > REG_HQOS_MAX)
  95. + return -EINVAL;
  96. + mtk_w32(eth, reg.val, 0x1800 + reg.off);
  97. +// printk("write reg off:%x val:%x\n", reg.off, reg.val);
  98. + return 0;
  99. +#endif
  100. case SIOCGMIIPHY:
  101. case SIOCGMIIREG:
  102. case SIOCSMIIREG:
  103. --- a/drivers/net/ethernet/mediatek/mtk_eth_soc.h
  104. +++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.h
  105. @@ -20,7 +20,7 @@
  106. #define MTK_QDMA_PAGE_SIZE 2048
  107. #define MTK_MAX_RX_LENGTH 1536
  108. #define MTK_TX_DMA_BUF_LEN 0x3fff
  109. -#define MTK_DMA_SIZE 256
  110. +#define MTK_DMA_SIZE 2048
  111. #define MTK_NAPI_WEIGHT 64
  112. #define MTK_MAC_COUNT 2
  113. #define MTK_RX_ETH_HLEN (VLAN_ETH_HLEN + VLAN_HLEN + ETH_FCS_LEN)