aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/hyperv
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/hyperv')
-rw-r--r--drivers/net/hyperv/netvsc.c3
-rw-r--r--drivers/net/hyperv/netvsc_drv.c5
-rw-r--r--drivers/net/hyperv/rndis_filter.c9
3 files changed, 14 insertions, 3 deletions
diff --git a/drivers/net/hyperv/netvsc.c b/drivers/net/hyperv/netvsc.c
index 7d76c9523395..6b463117dcac 100644
--- a/drivers/net/hyperv/netvsc.c
+++ b/drivers/net/hyperv/netvsc.c
@@ -440,7 +440,8 @@ static int negotiate_nvsp_ver(struct hv_device *device,
440 /* NVSPv2 only: Send NDIS config */ 440 /* NVSPv2 only: Send NDIS config */
441 memset(init_packet, 0, sizeof(struct nvsp_message)); 441 memset(init_packet, 0, sizeof(struct nvsp_message));
442 init_packet->hdr.msg_type = NVSP_MSG2_TYPE_SEND_NDIS_CONFIG; 442 init_packet->hdr.msg_type = NVSP_MSG2_TYPE_SEND_NDIS_CONFIG;
443 init_packet->msg.v2_msg.send_ndis_config.mtu = net_device->ndev->mtu; 443 init_packet->msg.v2_msg.send_ndis_config.mtu = net_device->ndev->mtu +
444 ETH_HLEN;
444 init_packet->msg.v2_msg.send_ndis_config.capability.ieee8021q = 1; 445 init_packet->msg.v2_msg.send_ndis_config.capability.ieee8021q = 1;
445 446
446 ret = vmbus_sendpacket(device->channel, init_packet, 447 ret = vmbus_sendpacket(device->channel, init_packet,
diff --git a/drivers/net/hyperv/netvsc_drv.c b/drivers/net/hyperv/netvsc_drv.c
index 3295e4ee9dbb..15d82eda0baf 100644
--- a/drivers/net/hyperv/netvsc_drv.c
+++ b/drivers/net/hyperv/netvsc_drv.c
@@ -699,9 +699,10 @@ static int netvsc_change_mtu(struct net_device *ndev, int mtu)
699 return -ENODEV; 699 return -ENODEV;
700 700
701 if (nvdev->nvsp_version >= NVSP_PROTOCOL_VERSION_2) 701 if (nvdev->nvsp_version >= NVSP_PROTOCOL_VERSION_2)
702 limit = NETVSC_MTU; 702 limit = NETVSC_MTU - ETH_HLEN;
703 703
704 if (mtu < 68 || mtu > limit) 704 /* Hyper-V hosts don't support MTU < ETH_DATA_LEN (1500) */
705 if (mtu < ETH_DATA_LEN || mtu > limit)
705 return -EINVAL; 706 return -EINVAL;
706 707
707 nvdev->start_remove = true; 708 nvdev->start_remove = true;
diff --git a/drivers/net/hyperv/rndis_filter.c b/drivers/net/hyperv/rndis_filter.c
index ccce6f24b009..7b2c5d1e9bad 100644
--- a/drivers/net/hyperv/rndis_filter.c
+++ b/drivers/net/hyperv/rndis_filter.c
@@ -998,6 +998,7 @@ int rndis_filter_device_add(struct hv_device *dev,
998 int t; 998 int t;
999 struct ndis_recv_scale_cap rsscap; 999 struct ndis_recv_scale_cap rsscap;
1000 u32 rsscap_size = sizeof(struct ndis_recv_scale_cap); 1000 u32 rsscap_size = sizeof(struct ndis_recv_scale_cap);
1001 u32 mtu, size;
1001 1002
1002 rndis_device = get_rndis_device(); 1003 rndis_device = get_rndis_device();
1003 if (!rndis_device) 1004 if (!rndis_device)
@@ -1029,6 +1030,14 @@ int rndis_filter_device_add(struct hv_device *dev,
1029 return ret; 1030 return ret;
1030 } 1031 }
1031 1032
1033 /* Get the MTU from the host */
1034 size = sizeof(u32);
1035 ret = rndis_filter_query_device(rndis_device,
1036 RNDIS_OID_GEN_MAXIMUM_FRAME_SIZE,
1037 &mtu, &size);
1038 if (ret == 0 && size == sizeof(u32))
1039 net_device->ndev->mtu = mtu;
1040
1032 /* Get the mac address */ 1041 /* Get the mac address */
1033 ret = rndis_filter_query_device_mac(rndis_device); 1042 ret = rndis_filter_query_device_mac(rndis_device);
1034 if (ret != 0) { 1043 if (ret != 0) {