792-v5.13-r8152-add-help-function-to-change-mtu.patch 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. From f010a7d51cbb42bdb956f0a28b8868b15d7a3816 Mon Sep 17 00:00:00 2001
  2. From: Hayes Wang <[email protected]>
  3. Date: Fri, 16 Apr 2021 16:04:34 +0800
  4. Subject: [PATCH] r8152: add help function to change mtu
  5. commit 67ce1a806f164e59a074fea8809725d3411eaa20 upstream.
  6. The different chips may have different requests when changing mtu.
  7. Therefore, add a new help function of rtl_ops to change mtu. Besides,
  8. reset the tx/rx after changing mtu.
  9. Additionally, add mtu_to_size() and size_to_mtu() macros to simplify
  10. the code.
  11. Signed-off-by: Hayes Wang <[email protected]>
  12. Signed-off-by: David S. Miller <[email protected]>
  13. ---
  14. drivers/net/usb/r8152.c | 53 ++++++++++++++++++++++++-----------------
  15. 1 file changed, 31 insertions(+), 22 deletions(-)
  16. --- a/drivers/net/usb/r8152.c
  17. +++ b/drivers/net/usb/r8152.c
  18. @@ -657,15 +657,13 @@ enum rtl_register_content {
  19. #define INTR_LINK 0x0004
  20. -#define RTL8153_MAX_PACKET 9216 /* 9K */
  21. -#define RTL8153_MAX_MTU (RTL8153_MAX_PACKET - VLAN_ETH_HLEN - \
  22. - ETH_FCS_LEN)
  23. #define RTL8152_RMS (VLAN_ETH_FRAME_LEN + ETH_FCS_LEN)
  24. #define RTL8153_RMS RTL8153_MAX_PACKET
  25. #define RTL8152_TX_TIMEOUT (5 * HZ)
  26. #define RTL8152_NAPI_WEIGHT 64
  27. -#define rx_reserved_size(x) ((x) + VLAN_ETH_HLEN + ETH_FCS_LEN + \
  28. - sizeof(struct rx_desc) + RX_ALIGN)
  29. +#define mtu_to_size(m) ((m) + VLAN_ETH_HLEN + ETH_FCS_LEN)
  30. +#define size_to_mtu(s) ((s) - VLAN_ETH_HLEN - ETH_FCS_LEN)
  31. +#define rx_reserved_size(x) (mtu_to_size(x) + sizeof(struct rx_desc) + RX_ALIGN)
  32. /* rtl8152 flags */
  33. enum rtl8152_flags {
  34. @@ -795,6 +793,7 @@ struct r8152 {
  35. bool (*in_nway)(struct r8152 *tp);
  36. void (*hw_phy_cfg)(struct r8152 *tp);
  37. void (*autosuspend_en)(struct r8152 *tp, bool enable);
  38. + void (*change_mtu)(struct r8152 *tp);
  39. } rtl_ops;
  40. struct ups_info {
  41. @@ -1021,8 +1020,7 @@ enum tx_csum_stat {
  42. static const int multicast_filter_limit = 32;
  43. static unsigned int agg_buf_sz = 16384;
  44. -#define RTL_LIMITED_TSO_SIZE (agg_buf_sz - sizeof(struct tx_desc) - \
  45. - VLAN_ETH_HLEN - ETH_FCS_LEN)
  46. +#define RTL_LIMITED_TSO_SIZE (size_to_mtu(agg_buf_sz) - sizeof(struct tx_desc))
  47. static
  48. int get_registers(struct r8152 *tp, u16 value, u16 index, u16 size, void *data)
  49. @@ -2634,10 +2632,7 @@ static void rtl8152_nic_reset(struct r81
  50. static void set_tx_qlen(struct r8152 *tp)
  51. {
  52. - struct net_device *netdev = tp->netdev;
  53. -
  54. - tp->tx_qlen = agg_buf_sz / (netdev->mtu + VLAN_ETH_HLEN + ETH_FCS_LEN +
  55. - sizeof(struct tx_desc));
  56. + tp->tx_qlen = agg_buf_sz / (mtu_to_size(tp->netdev->mtu) + sizeof(struct tx_desc));
  57. }
  58. static inline u8 rtl8152_get_speed(struct r8152 *tp)
  59. @@ -4726,6 +4721,12 @@ static void r8153b_hw_phy_cfg(struct r81
  60. set_bit(PHY_RESET, &tp->flags);
  61. }
  62. +static void rtl8153_change_mtu(struct r8152 *tp)
  63. +{
  64. + ocp_write_word(tp, MCU_TYPE_PLA, PLA_RMS, mtu_to_size(tp->netdev->mtu));
  65. + ocp_write_byte(tp, MCU_TYPE_PLA, PLA_MTPS, MTPS_JUMBO);
  66. +}
  67. +
  68. static void r8153_first_init(struct r8152 *tp)
  69. {
  70. u32 ocp_data;
  71. @@ -4758,9 +4759,7 @@ static void r8153_first_init(struct r815
  72. rtl_rx_vlan_en(tp, tp->netdev->features & NETIF_F_HW_VLAN_CTAG_RX);
  73. - ocp_data = tp->netdev->mtu + VLAN_ETH_HLEN + ETH_FCS_LEN;
  74. - ocp_write_word(tp, MCU_TYPE_PLA, PLA_RMS, ocp_data);
  75. - ocp_write_byte(tp, MCU_TYPE_PLA, PLA_MTPS, MTPS_JUMBO);
  76. + rtl8153_change_mtu(tp);
  77. ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_TCR0);
  78. ocp_data |= TCR0_AUTO_FIFO;
  79. @@ -4795,8 +4794,7 @@ static void r8153_enter_oob(struct r8152
  80. wait_oob_link_list_ready(tp);
  81. - ocp_data = tp->netdev->mtu + VLAN_ETH_HLEN + ETH_FCS_LEN;
  82. - ocp_write_word(tp, MCU_TYPE_PLA, PLA_RMS, ocp_data);
  83. + ocp_write_word(tp, MCU_TYPE_PLA, PLA_RMS, mtu_to_size(tp->netdev->mtu));
  84. switch (tp->version) {
  85. case RTL_VER_03:
  86. @@ -6497,12 +6495,21 @@ static int rtl8152_change_mtu(struct net
  87. dev->mtu = new_mtu;
  88. if (netif_running(dev)) {
  89. - u32 rms = new_mtu + VLAN_ETH_HLEN + ETH_FCS_LEN;
  90. -
  91. - ocp_write_word(tp, MCU_TYPE_PLA, PLA_RMS, rms);
  92. + if (tp->rtl_ops.change_mtu)
  93. + tp->rtl_ops.change_mtu(tp);
  94. - if (netif_carrier_ok(dev))
  95. - r8153_set_rx_early_size(tp);
  96. + if (netif_carrier_ok(dev)) {
  97. + netif_stop_queue(dev);
  98. + napi_disable(&tp->napi);
  99. + tasklet_disable(&tp->tx_tl);
  100. + tp->rtl_ops.disable(tp);
  101. + tp->rtl_ops.enable(tp);
  102. + rtl_start_rx(tp);
  103. + tasklet_enable(&tp->tx_tl);
  104. + napi_enable(&tp->napi);
  105. + rtl8152_set_rx_mode(dev);
  106. + netif_wake_queue(dev);
  107. + }
  108. }
  109. mutex_unlock(&tp->control);
  110. @@ -6591,6 +6598,7 @@ static int rtl_ops_init(struct r8152 *tp
  111. ops->in_nway = rtl8153_in_nway;
  112. ops->hw_phy_cfg = r8153_hw_phy_cfg;
  113. ops->autosuspend_en = rtl8153_runtime_enable;
  114. + ops->change_mtu = rtl8153_change_mtu;
  115. if (tp->udev->speed < USB_SPEED_SUPER)
  116. tp->rx_buf_sz = 16 * 1024;
  117. else
  118. @@ -6612,6 +6620,7 @@ static int rtl_ops_init(struct r8152 *tp
  119. ops->in_nway = rtl8153_in_nway;
  120. ops->hw_phy_cfg = r8153b_hw_phy_cfg;
  121. ops->autosuspend_en = rtl8153b_runtime_enable;
  122. + ops->change_mtu = rtl8153_change_mtu;
  123. tp->rx_buf_sz = 32 * 1024;
  124. tp->eee_en = true;
  125. tp->eee_adv = MDIO_EEE_1000T | MDIO_EEE_100TX;
  126. @@ -6832,7 +6841,7 @@ static int rtl8152_probe(struct usb_inte
  127. netdev->max_mtu = ETH_DATA_LEN;
  128. break;
  129. default:
  130. - netdev->max_mtu = RTL8153_MAX_MTU;
  131. + netdev->max_mtu = size_to_mtu(9 * 1024);
  132. break;
  133. }