diff options
Diffstat (limited to 'drivers/net/hyperv')
-rw-r--r-- | drivers/net/hyperv/netvsc.c | 3 | ||||
-rw-r--r-- | drivers/net/hyperv/netvsc_drv.c | 5 | ||||
-rw-r--r-- | drivers/net/hyperv/rndis_filter.c | 9 |
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) { |