@@ -657,15 +657,13 @@ enum rtl_register_content {
657
657
658
658
#define INTR_LINK 0x0004
659
659
660
- #define RTL8153_MAX_PACKET 9216 /* 9K */
661
- #define RTL8153_MAX_MTU (RTL8153_MAX_PACKET - VLAN_ETH_HLEN - \
662
- ETH_FCS_LEN)
663
660
#define RTL8152_RMS (VLAN_ETH_FRAME_LEN + ETH_FCS_LEN)
664
661
#define RTL8153_RMS RTL8153_MAX_PACKET
665
662
#define RTL8152_TX_TIMEOUT (5 * HZ)
666
663
#define RTL8152_NAPI_WEIGHT 64
667
- #define rx_reserved_size (x ) ((x) + VLAN_ETH_HLEN + ETH_FCS_LEN + \
668
- sizeof(struct rx_desc) + RX_ALIGN)
664
+ #define mtu_to_size (m ) ((m) + VLAN_ETH_HLEN + ETH_FCS_LEN)
665
+ #define size_to_mtu (s ) ((s) - VLAN_ETH_HLEN - ETH_FCS_LEN)
666
+ #define rx_reserved_size (x ) (mtu_to_size(x) + sizeof(struct rx_desc) + RX_ALIGN)
669
667
670
668
/* rtl8152 flags */
671
669
enum rtl8152_flags {
@@ -795,6 +793,7 @@ struct r8152 {
795
793
bool (* in_nway )(struct r8152 * tp );
796
794
void (* hw_phy_cfg )(struct r8152 * tp );
797
795
void (* autosuspend_en )(struct r8152 * tp , bool enable );
796
+ void (* change_mtu )(struct r8152 * tp );
798
797
} rtl_ops ;
799
798
800
799
struct ups_info {
@@ -1021,8 +1020,7 @@ enum tx_csum_stat {
1021
1020
static const int multicast_filter_limit = 32 ;
1022
1021
static unsigned int agg_buf_sz = 16384 ;
1023
1022
1024
- #define RTL_LIMITED_TSO_SIZE (agg_buf_sz - sizeof(struct tx_desc) - \
1025
- VLAN_ETH_HLEN - ETH_FCS_LEN)
1023
+ #define RTL_LIMITED_TSO_SIZE (size_to_mtu(agg_buf_sz) - sizeof(struct tx_desc))
1026
1024
1027
1025
static
1028
1026
int get_registers (struct r8152 * tp , u16 value , u16 index , u16 size , void * data )
@@ -2632,10 +2630,7 @@ static void rtl8152_nic_reset(struct r8152 *tp)
2632
2630
2633
2631
static void set_tx_qlen (struct r8152 * tp )
2634
2632
{
2635
- struct net_device * netdev = tp -> netdev ;
2636
-
2637
- tp -> tx_qlen = agg_buf_sz / (netdev -> mtu + VLAN_ETH_HLEN + ETH_FCS_LEN +
2638
- sizeof (struct tx_desc ));
2633
+ tp -> tx_qlen = agg_buf_sz / (mtu_to_size (tp -> netdev -> mtu ) + sizeof (struct tx_desc ));
2639
2634
}
2640
2635
2641
2636
static inline u8 rtl8152_get_speed (struct r8152 * tp )
@@ -4724,6 +4719,12 @@ static void r8153b_hw_phy_cfg(struct r8152 *tp)
4724
4719
set_bit (PHY_RESET , & tp -> flags );
4725
4720
}
4726
4721
4722
+ static void rtl8153_change_mtu (struct r8152 * tp )
4723
+ {
4724
+ ocp_write_word (tp , MCU_TYPE_PLA , PLA_RMS , mtu_to_size (tp -> netdev -> mtu ));
4725
+ ocp_write_byte (tp , MCU_TYPE_PLA , PLA_MTPS , MTPS_JUMBO );
4726
+ }
4727
+
4727
4728
static void r8153_first_init (struct r8152 * tp )
4728
4729
{
4729
4730
u32 ocp_data ;
@@ -4756,9 +4757,7 @@ static void r8153_first_init(struct r8152 *tp)
4756
4757
4757
4758
rtl_rx_vlan_en (tp , tp -> netdev -> features & NETIF_F_HW_VLAN_CTAG_RX );
4758
4759
4759
- ocp_data = tp -> netdev -> mtu + VLAN_ETH_HLEN + ETH_FCS_LEN ;
4760
- ocp_write_word (tp , MCU_TYPE_PLA , PLA_RMS , ocp_data );
4761
- ocp_write_byte (tp , MCU_TYPE_PLA , PLA_MTPS , MTPS_JUMBO );
4760
+ rtl8153_change_mtu (tp );
4762
4761
4763
4762
ocp_data = ocp_read_word (tp , MCU_TYPE_PLA , PLA_TCR0 );
4764
4763
ocp_data |= TCR0_AUTO_FIFO ;
@@ -4793,8 +4792,7 @@ static void r8153_enter_oob(struct r8152 *tp)
4793
4792
4794
4793
wait_oob_link_list_ready (tp );
4795
4794
4796
- ocp_data = tp -> netdev -> mtu + VLAN_ETH_HLEN + ETH_FCS_LEN ;
4797
- ocp_write_word (tp , MCU_TYPE_PLA , PLA_RMS , ocp_data );
4795
+ ocp_write_word (tp , MCU_TYPE_PLA , PLA_RMS , mtu_to_size (tp -> netdev -> mtu ));
4798
4796
4799
4797
switch (tp -> version ) {
4800
4798
case RTL_VER_03 :
@@ -6494,12 +6492,21 @@ static int rtl8152_change_mtu(struct net_device *dev, int new_mtu)
6494
6492
dev -> mtu = new_mtu ;
6495
6493
6496
6494
if (netif_running (dev )) {
6497
- u32 rms = new_mtu + VLAN_ETH_HLEN + ETH_FCS_LEN ;
6498
-
6499
- ocp_write_word (tp , MCU_TYPE_PLA , PLA_RMS , rms );
6495
+ if (tp -> rtl_ops .change_mtu )
6496
+ tp -> rtl_ops .change_mtu (tp );
6500
6497
6501
- if (netif_carrier_ok (dev ))
6502
- r8153_set_rx_early_size (tp );
6498
+ if (netif_carrier_ok (dev )) {
6499
+ netif_stop_queue (dev );
6500
+ napi_disable (& tp -> napi );
6501
+ tasklet_disable (& tp -> tx_tl );
6502
+ tp -> rtl_ops .disable (tp );
6503
+ tp -> rtl_ops .enable (tp );
6504
+ rtl_start_rx (tp );
6505
+ tasklet_enable (& tp -> tx_tl );
6506
+ napi_enable (& tp -> napi );
6507
+ rtl8152_set_rx_mode (dev );
6508
+ netif_wake_queue (dev );
6509
+ }
6503
6510
}
6504
6511
6505
6512
mutex_unlock (& tp -> control );
@@ -6588,6 +6595,7 @@ static int rtl_ops_init(struct r8152 *tp)
6588
6595
ops -> in_nway = rtl8153_in_nway ;
6589
6596
ops -> hw_phy_cfg = r8153_hw_phy_cfg ;
6590
6597
ops -> autosuspend_en = rtl8153_runtime_enable ;
6598
+ ops -> change_mtu = rtl8153_change_mtu ;
6591
6599
if (tp -> udev -> speed < USB_SPEED_SUPER )
6592
6600
tp -> rx_buf_sz = 16 * 1024 ;
6593
6601
else
@@ -6609,6 +6617,7 @@ static int rtl_ops_init(struct r8152 *tp)
6609
6617
ops -> in_nway = rtl8153_in_nway ;
6610
6618
ops -> hw_phy_cfg = r8153b_hw_phy_cfg ;
6611
6619
ops -> autosuspend_en = rtl8153b_runtime_enable ;
6620
+ ops -> change_mtu = rtl8153_change_mtu ;
6612
6621
tp -> rx_buf_sz = 32 * 1024 ;
6613
6622
tp -> eee_en = true;
6614
6623
tp -> eee_adv = MDIO_EEE_1000T | MDIO_EEE_100TX ;
@@ -6829,7 +6838,7 @@ static int rtl8152_probe(struct usb_interface *intf,
6829
6838
netdev -> max_mtu = ETH_DATA_LEN ;
6830
6839
break ;
6831
6840
default :
6832
- netdev -> max_mtu = RTL8153_MAX_MTU ;
6841
+ netdev -> max_mtu = size_to_mtu ( 9 * 1024 ) ;
6833
6842
break ;
6834
6843
}
6835
6844
0 commit comments