diff options
Diffstat (limited to 'drivers/net/hyperv')
| -rw-r--r-- | drivers/net/hyperv/hyperv_net.h | 4 | ||||
| -rw-r--r-- | drivers/net/hyperv/netvsc.c | 15 | ||||
| -rw-r--r-- | drivers/net/hyperv/netvsc_drv.c | 19 | ||||
| -rw-r--r-- | drivers/net/hyperv/rndis_filter.c | 6 | 
4 files changed, 28 insertions, 16 deletions
diff --git a/drivers/net/hyperv/hyperv_net.h b/drivers/net/hyperv/hyperv_net.h index f4fbcb5aa24a..3958adade7eb 100644 --- a/drivers/net/hyperv/hyperv_net.h +++ b/drivers/net/hyperv/hyperv_net.h @@ -606,8 +606,8 @@ struct nvsp_message {  } __packed; -#define NETVSC_MTU 65536 -#define NETVSC_MTU_MIN 68 +#define NETVSC_MTU 65535 +#define NETVSC_MTU_MIN ETH_MIN_MTU  #define NETVSC_RECEIVE_BUFFER_SIZE		(1024*1024*16)	/* 16MB */  #define NETVSC_RECEIVE_BUFFER_SIZE_LEGACY	(1024*1024*15)  /* 15MB */ diff --git a/drivers/net/hyperv/netvsc.c b/drivers/net/hyperv/netvsc.c index 720b5fa9e625..5a1cc089acb7 100644 --- a/drivers/net/hyperv/netvsc.c +++ b/drivers/net/hyperv/netvsc.c @@ -410,8 +410,8 @@ static int netvsc_init_buf(struct hv_device *device)  	net_device->send_section_cnt =  		net_device->send_buf_size / net_device->send_section_size; -	dev_info(&device->device, "Send section size: %d, Section count:%d\n", -		 net_device->send_section_size, net_device->send_section_cnt); +	netdev_dbg(ndev, "Send section size: %d, Section count:%d\n", +		   net_device->send_section_size, net_device->send_section_cnt);  	/* Setup state for managing the send buffer. */  	net_device->map_words = DIV_ROUND_UP(net_device->send_section_cnt, @@ -578,7 +578,7 @@ void netvsc_device_remove(struct hv_device *device)  	 * At this point, no one should be accessing net_device  	 * except in here  	 */ -	dev_notice(&device->device, "net device safe to remove\n"); +	netdev_dbg(ndev, "net device safe to remove\n");  	/* Now, we can close the channel safely */  	vmbus_close(device->channel); @@ -888,6 +888,13 @@ int netvsc_send(struct hv_device *device,  	if (!net_device)  		return -ENODEV; +	/* We may race with netvsc_connect_vsp()/netvsc_init_buf() and get +	 * here before the negotiation with the host is finished and +	 * send_section_map may not be allocated yet. +	 */ +	if (!net_device->send_section_map) +		return -EAGAIN; +  	out_channel = net_device->chn_table[q_idx];  	packet->send_buf_index = NETVSC_INVALID_INDEX; @@ -1380,7 +1387,7 @@ int netvsc_device_add(struct hv_device *device, void *additional_info)  	}  	/* Channel is opened */ -	pr_info("hv_netvsc channel opened successfully\n"); +	netdev_dbg(ndev, "hv_netvsc channel opened successfully\n");  	/* If we're reopening the device we may have multiple queues, fill the  	 * chn_table with the default channel to use it before subchannels are diff --git a/drivers/net/hyperv/netvsc_drv.c b/drivers/net/hyperv/netvsc_drv.c index f6382150b16a..c9414c054852 100644 --- a/drivers/net/hyperv/netvsc_drv.c +++ b/drivers/net/hyperv/netvsc_drv.c @@ -47,6 +47,10 @@  				 NETIF_F_TSO | \  				 NETIF_F_TSO6 | \  				 NETIF_F_HW_CSUM) + +/* Restrict GSO size to account for NVGRE */ +#define NETVSC_GSO_MAX_SIZE	62768 +  static int ring_size = 128;  module_param(ring_size, int, S_IRUGO);  MODULE_PARM_DESC(ring_size, "Ring buffer size (# of pages)"); @@ -871,19 +875,12 @@ static int netvsc_change_mtu(struct net_device *ndev, int mtu)  	struct netvsc_device *nvdev = ndevctx->nvdev;  	struct hv_device *hdev = ndevctx->device_ctx;  	struct netvsc_device_info device_info; -	int limit = ETH_DATA_LEN;  	u32 num_chn;  	int ret = 0;  	if (ndevctx->start_remove || !nvdev || nvdev->destroy)  		return -ENODEV; -	if (nvdev->nvsp_version >= NVSP_PROTOCOL_VERSION_2) -		limit = NETVSC_MTU - ETH_HLEN; - -	if (mtu < NETVSC_MTU_MIN || mtu > limit) -		return -EINVAL; -  	ret = netvsc_close(ndev);  	if (ret)  		goto out; @@ -1400,6 +1397,14 @@ static int netvsc_probe(struct hv_device *dev,  	nvdev = net_device_ctx->nvdev;  	netif_set_real_num_tx_queues(net, nvdev->num_chn);  	netif_set_real_num_rx_queues(net, nvdev->num_chn); +	netif_set_gso_max_size(net, NETVSC_GSO_MAX_SIZE); + +	/* MTU range: 68 - 1500 or 65521 */ +	net->min_mtu = NETVSC_MTU_MIN; +	if (nvdev->nvsp_version >= NVSP_PROTOCOL_VERSION_2) +		net->max_mtu = NETVSC_MTU - ETH_HLEN; +	else +		net->max_mtu = ETH_DATA_LEN;  	ret = register_netdev(net);  	if (ret != 0) { diff --git a/drivers/net/hyperv/rndis_filter.c b/drivers/net/hyperv/rndis_filter.c index 9195d5da8485..8d90904e0e49 100644 --- a/drivers/net/hyperv/rndis_filter.c +++ b/drivers/net/hyperv/rndis_filter.c @@ -1059,9 +1059,9 @@ int rndis_filter_device_add(struct hv_device *dev,  	device_info->link_state = rndis_device->link_state; -	dev_info(&dev->device, "Device MAC %pM link state %s\n", -		 rndis_device->hw_mac_adr, -		 device_info->link_state ? "down" : "up"); +	netdev_dbg(net, "Device MAC %pM link state %s\n", +		   rndis_device->hw_mac_adr, +		   device_info->link_state ? "down" : "up");  	if (net_device->nvsp_version < NVSP_PROTOCOL_VERSION_5)  		return 0;  |