diff options
Diffstat (limited to 'drivers/net/usb/r8152.c')
| -rw-r--r-- | drivers/net/usb/r8152.c | 24 | 
1 files changed, 17 insertions, 7 deletions
diff --git a/drivers/net/usb/r8152.c b/drivers/net/usb/r8152.c index 986243c932cc..0b1b9188625d 100644 --- a/drivers/net/usb/r8152.c +++ b/drivers/net/usb/r8152.c @@ -32,7 +32,7 @@  #define NETNEXT_VERSION		"08"  /* Information for net */ -#define NET_VERSION		"8" +#define NET_VERSION		"9"  #define DRIVER_VERSION		"v1." NETNEXT_VERSION "." NET_VERSION  #define DRIVER_AUTHOR "Realtek linux nic maintainers <[email protected]>" @@ -501,6 +501,8 @@ enum rtl_register_content {  #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 + CRC_SIZE + \ +				 sizeof(struct rx_desc) + RX_ALIGN)  /* rtl8152 flags */  enum rtl8152_flags { @@ -1362,6 +1364,7 @@ static int alloc_all_mem(struct r8152 *tp)  	spin_lock_init(&tp->rx_lock);  	spin_lock_init(&tp->tx_lock);  	INIT_LIST_HEAD(&tp->tx_free); +	INIT_LIST_HEAD(&tp->rx_done);  	skb_queue_head_init(&tp->tx_queue);  	skb_queue_head_init(&tp->rx_queue); @@ -2252,8 +2255,7 @@ static void r8153_set_rx_early_timeout(struct r8152 *tp)  static void r8153_set_rx_early_size(struct r8152 *tp)  { -	u32 mtu = tp->netdev->mtu; -	u32 ocp_data = (agg_buf_sz - mtu - VLAN_ETH_HLEN - VLAN_HLEN) / 8; +	u32 ocp_data = (agg_buf_sz - rx_reserved_size(tp->netdev->mtu)) / 4;  	ocp_write_word(tp, MCU_TYPE_USB, USB_RX_EARLY_SIZE, ocp_data);  } @@ -2898,7 +2900,8 @@ static void r8153_first_init(struct r8152 *tp)  	rtl_rx_vlan_en(tp, tp->netdev->features & NETIF_F_HW_VLAN_CTAG_RX); -	ocp_write_word(tp, MCU_TYPE_PLA, PLA_RMS, RTL8153_RMS); +	ocp_data = tp->netdev->mtu + VLAN_ETH_HLEN + CRC_SIZE; +	ocp_write_word(tp, MCU_TYPE_PLA, PLA_RMS, ocp_data);  	ocp_write_byte(tp, MCU_TYPE_PLA, PLA_MTPS, MTPS_JUMBO);  	ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_TCR0); @@ -2950,7 +2953,8 @@ static void r8153_enter_oob(struct r8152 *tp)  		usleep_range(1000, 2000);  	} -	ocp_write_word(tp, MCU_TYPE_PLA, PLA_RMS, RTL8153_RMS); +	ocp_data = tp->netdev->mtu + VLAN_ETH_HLEN + CRC_SIZE; +	ocp_write_word(tp, MCU_TYPE_PLA, PLA_RMS, ocp_data);  	ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_TEREDO_CFG);  	ocp_data &= ~TEREDO_WAKE_MASK; @@ -4200,8 +4204,14 @@ static int rtl8152_change_mtu(struct net_device *dev, int new_mtu)  	dev->mtu = new_mtu; -	if (netif_running(dev) && netif_carrier_ok(dev)) -		r8153_set_rx_early_size(tp); +	if (netif_running(dev)) { +		u32 rms = new_mtu + VLAN_ETH_HLEN + CRC_SIZE; + +		ocp_write_word(tp, MCU_TYPE_PLA, PLA_RMS, rms); + +		if (netif_carrier_ok(dev)) +			r8153_set_rx_early_size(tp); +	}  	mutex_unlock(&tp->control);  |