2021-08-21 08:54:34 +00:00
|
|
|
From f010a7d51cbb42bdb956f0a28b8868b15d7a3816 Mon Sep 17 00:00:00 2001
|
|
|
|
From: Hayes Wang <hayeswang@realtek.com>
|
|
|
|
Date: Fri, 16 Apr 2021 16:04:34 +0800
|
|
|
|
Subject: [PATCH] r8152: add help function to change mtu
|
|
|
|
|
|
|
|
commit 67ce1a806f164e59a074fea8809725d3411eaa20 upstream.
|
|
|
|
|
|
|
|
The different chips may have different requests when changing mtu.
|
|
|
|
Therefore, add a new help function of rtl_ops to change mtu. Besides,
|
|
|
|
reset the tx/rx after changing mtu.
|
|
|
|
|
|
|
|
Additionally, add mtu_to_size() and size_to_mtu() macros to simplify
|
|
|
|
the code.
|
|
|
|
|
|
|
|
Signed-off-by: Hayes Wang <hayeswang@realtek.com>
|
|
|
|
Signed-off-by: David S. Miller <davem@davemloft.net>
|
|
|
|
---
|
|
|
|
drivers/net/usb/r8152.c | 53 ++++++++++++++++++++++++-----------------
|
|
|
|
1 file changed, 31 insertions(+), 22 deletions(-)
|
|
|
|
|
|
|
|
--- a/drivers/net/usb/r8152.c
|
|
|
|
+++ b/drivers/net/usb/r8152.c
|
2021-11-02 21:05:27 +00:00
|
|
|
@@ -658,15 +658,13 @@ enum rtl_register_content {
|
2021-08-21 08:54:34 +00:00
|
|
|
|
|
|
|
#define INTR_LINK 0x0004
|
|
|
|
|
|
|
|
-#define RTL8153_MAX_PACKET 9216 /* 9K */
|
|
|
|
-#define RTL8153_MAX_MTU (RTL8153_MAX_PACKET - VLAN_ETH_HLEN - \
|
|
|
|
- ETH_FCS_LEN)
|
|
|
|
#define RTL8152_RMS (VLAN_ETH_FRAME_LEN + ETH_FCS_LEN)
|
|
|
|
#define RTL8153_RMS RTL8153_MAX_PACKET
|
|
|
|
#define RTL8152_TX_TIMEOUT (5 * HZ)
|
|
|
|
#define RTL8152_NAPI_WEIGHT 64
|
|
|
|
-#define rx_reserved_size(x) ((x) + VLAN_ETH_HLEN + ETH_FCS_LEN + \
|
|
|
|
- sizeof(struct rx_desc) + RX_ALIGN)
|
|
|
|
+#define mtu_to_size(m) ((m) + VLAN_ETH_HLEN + ETH_FCS_LEN)
|
|
|
|
+#define size_to_mtu(s) ((s) - VLAN_ETH_HLEN - ETH_FCS_LEN)
|
|
|
|
+#define rx_reserved_size(x) (mtu_to_size(x) + sizeof(struct rx_desc) + RX_ALIGN)
|
|
|
|
|
|
|
|
/* rtl8152 flags */
|
|
|
|
enum rtl8152_flags {
|
2021-11-02 21:05:27 +00:00
|
|
|
@@ -796,6 +794,7 @@ struct r8152 {
|
2021-08-21 08:54:34 +00:00
|
|
|
bool (*in_nway)(struct r8152 *tp);
|
|
|
|
void (*hw_phy_cfg)(struct r8152 *tp);
|
|
|
|
void (*autosuspend_en)(struct r8152 *tp, bool enable);
|
|
|
|
+ void (*change_mtu)(struct r8152 *tp);
|
|
|
|
} rtl_ops;
|
|
|
|
|
|
|
|
struct ups_info {
|
2021-11-02 21:05:27 +00:00
|
|
|
@@ -1022,8 +1021,7 @@ enum tx_csum_stat {
|
2021-08-21 08:54:34 +00:00
|
|
|
static const int multicast_filter_limit = 32;
|
|
|
|
static unsigned int agg_buf_sz = 16384;
|
|
|
|
|
|
|
|
-#define RTL_LIMITED_TSO_SIZE (agg_buf_sz - sizeof(struct tx_desc) - \
|
|
|
|
- VLAN_ETH_HLEN - ETH_FCS_LEN)
|
|
|
|
+#define RTL_LIMITED_TSO_SIZE (size_to_mtu(agg_buf_sz) - sizeof(struct tx_desc))
|
|
|
|
|
|
|
|
static
|
|
|
|
int get_registers(struct r8152 *tp, u16 value, u16 index, u16 size, void *data)
|
2021-11-02 21:05:27 +00:00
|
|
|
@@ -2633,10 +2631,7 @@ static void rtl8152_nic_reset(struct r81
|
2021-08-21 08:54:34 +00:00
|
|
|
|
|
|
|
static void set_tx_qlen(struct r8152 *tp)
|
|
|
|
{
|
|
|
|
- struct net_device *netdev = tp->netdev;
|
|
|
|
-
|
|
|
|
- tp->tx_qlen = agg_buf_sz / (netdev->mtu + VLAN_ETH_HLEN + ETH_FCS_LEN +
|
|
|
|
- sizeof(struct tx_desc));
|
|
|
|
+ tp->tx_qlen = agg_buf_sz / (mtu_to_size(tp->netdev->mtu) + sizeof(struct tx_desc));
|
|
|
|
}
|
|
|
|
|
|
|
|
static inline u8 rtl8152_get_speed(struct r8152 *tp)
|
2021-11-02 21:05:27 +00:00
|
|
|
@@ -4725,6 +4720,12 @@ static void r8153b_hw_phy_cfg(struct r81
|
2021-08-21 08:54:34 +00:00
|
|
|
set_bit(PHY_RESET, &tp->flags);
|
|
|
|
}
|
|
|
|
|
|
|
|
+static void rtl8153_change_mtu(struct r8152 *tp)
|
|
|
|
+{
|
|
|
|
+ ocp_write_word(tp, MCU_TYPE_PLA, PLA_RMS, mtu_to_size(tp->netdev->mtu));
|
|
|
|
+ ocp_write_byte(tp, MCU_TYPE_PLA, PLA_MTPS, MTPS_JUMBO);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
static void r8153_first_init(struct r8152 *tp)
|
|
|
|
{
|
|
|
|
u32 ocp_data;
|
2021-11-02 21:05:27 +00:00
|
|
|
@@ -4757,9 +4758,7 @@ static void r8153_first_init(struct r815
|
2021-08-21 08:54:34 +00:00
|
|
|
|
|
|
|
rtl_rx_vlan_en(tp, tp->netdev->features & NETIF_F_HW_VLAN_CTAG_RX);
|
|
|
|
|
|
|
|
- ocp_data = tp->netdev->mtu + VLAN_ETH_HLEN + ETH_FCS_LEN;
|
|
|
|
- ocp_write_word(tp, MCU_TYPE_PLA, PLA_RMS, ocp_data);
|
|
|
|
- ocp_write_byte(tp, MCU_TYPE_PLA, PLA_MTPS, MTPS_JUMBO);
|
|
|
|
+ rtl8153_change_mtu(tp);
|
|
|
|
|
|
|
|
ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_TCR0);
|
|
|
|
ocp_data |= TCR0_AUTO_FIFO;
|
2021-11-02 21:05:27 +00:00
|
|
|
@@ -4794,8 +4793,7 @@ static void r8153_enter_oob(struct r8152
|
2021-08-21 08:54:34 +00:00
|
|
|
|
|
|
|
wait_oob_link_list_ready(tp);
|
|
|
|
|
|
|
|
- ocp_data = tp->netdev->mtu + VLAN_ETH_HLEN + ETH_FCS_LEN;
|
|
|
|
- ocp_write_word(tp, MCU_TYPE_PLA, PLA_RMS, ocp_data);
|
|
|
|
+ ocp_write_word(tp, MCU_TYPE_PLA, PLA_RMS, mtu_to_size(tp->netdev->mtu));
|
|
|
|
|
|
|
|
switch (tp->version) {
|
|
|
|
case RTL_VER_03:
|
2021-11-02 21:05:27 +00:00
|
|
|
@@ -6518,12 +6516,21 @@ static int rtl8152_change_mtu(struct net
|
2021-08-21 08:54:34 +00:00
|
|
|
dev->mtu = new_mtu;
|
|
|
|
|
|
|
|
if (netif_running(dev)) {
|
|
|
|
- u32 rms = new_mtu + VLAN_ETH_HLEN + ETH_FCS_LEN;
|
|
|
|
-
|
|
|
|
- ocp_write_word(tp, MCU_TYPE_PLA, PLA_RMS, rms);
|
|
|
|
+ if (tp->rtl_ops.change_mtu)
|
|
|
|
+ tp->rtl_ops.change_mtu(tp);
|
|
|
|
|
|
|
|
- if (netif_carrier_ok(dev))
|
|
|
|
- r8153_set_rx_early_size(tp);
|
|
|
|
+ if (netif_carrier_ok(dev)) {
|
|
|
|
+ netif_stop_queue(dev);
|
|
|
|
+ napi_disable(&tp->napi);
|
|
|
|
+ tasklet_disable(&tp->tx_tl);
|
|
|
|
+ tp->rtl_ops.disable(tp);
|
|
|
|
+ tp->rtl_ops.enable(tp);
|
|
|
|
+ rtl_start_rx(tp);
|
|
|
|
+ tasklet_enable(&tp->tx_tl);
|
|
|
|
+ napi_enable(&tp->napi);
|
|
|
|
+ rtl8152_set_rx_mode(dev);
|
|
|
|
+ netif_wake_queue(dev);
|
|
|
|
+ }
|
|
|
|
}
|
|
|
|
|
|
|
|
mutex_unlock(&tp->control);
|
2021-11-02 21:05:27 +00:00
|
|
|
@@ -6612,6 +6619,7 @@ static int rtl_ops_init(struct r8152 *tp
|
2021-08-21 08:54:34 +00:00
|
|
|
ops->in_nway = rtl8153_in_nway;
|
|
|
|
ops->hw_phy_cfg = r8153_hw_phy_cfg;
|
|
|
|
ops->autosuspend_en = rtl8153_runtime_enable;
|
|
|
|
+ ops->change_mtu = rtl8153_change_mtu;
|
|
|
|
if (tp->udev->speed < USB_SPEED_SUPER)
|
|
|
|
tp->rx_buf_sz = 16 * 1024;
|
|
|
|
else
|
2021-11-02 21:05:27 +00:00
|
|
|
@@ -6633,6 +6641,7 @@ static int rtl_ops_init(struct r8152 *tp
|
2021-08-21 08:54:34 +00:00
|
|
|
ops->in_nway = rtl8153_in_nway;
|
|
|
|
ops->hw_phy_cfg = r8153b_hw_phy_cfg;
|
|
|
|
ops->autosuspend_en = rtl8153b_runtime_enable;
|
|
|
|
+ ops->change_mtu = rtl8153_change_mtu;
|
|
|
|
tp->rx_buf_sz = 32 * 1024;
|
|
|
|
tp->eee_en = true;
|
|
|
|
tp->eee_adv = MDIO_EEE_1000T | MDIO_EEE_100TX;
|
2021-11-02 21:05:27 +00:00
|
|
|
@@ -6853,7 +6862,7 @@ static int rtl8152_probe(struct usb_inte
|
2021-08-21 08:54:34 +00:00
|
|
|
netdev->max_mtu = ETH_DATA_LEN;
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
- netdev->max_mtu = RTL8153_MAX_MTU;
|
|
|
|
+ netdev->max_mtu = size_to_mtu(9 * 1024);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|