diff options
author | Haiyang Zhang <haiyangz@microsoft.com> | 2014-02-19 18:49:45 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2014-02-19 19:52:45 -0500 |
commit | a1eabb0178bcef8eee6286bc646b66e23f4f77ea (patch) | |
tree | 68503c7c3732ce6b697fec768182ad5d2bdc6c57 /drivers/net/hyperv/netvsc.c | |
parent | 86c1a045640d3f34ca1ab2f3e8b102670d21f93a (diff) |
hyperv: Add latest NetVSP versions to auto negotiation
It auto negotiates the highest NetVSP version supported by both guest and host.
Signed-off-by: Haiyang Zhang <haiyangz@microsoft.com>
Reviewed-by: K. Y. Srinivasan <kys@microsoft.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/hyperv/netvsc.c')
-rw-r--r-- | drivers/net/hyperv/netvsc.c | 25 |
1 files changed, 16 insertions, 9 deletions
diff --git a/drivers/net/hyperv/netvsc.c b/drivers/net/hyperv/netvsc.c index 9a0e9c6f1414..1a0280dcba7e 100644 --- a/drivers/net/hyperv/netvsc.c +++ b/drivers/net/hyperv/netvsc.c | |||
@@ -290,7 +290,7 @@ static int negotiate_nvsp_ver(struct hv_device *device, | |||
290 | NVSP_STAT_SUCCESS) | 290 | NVSP_STAT_SUCCESS) |
291 | return -EINVAL; | 291 | return -EINVAL; |
292 | 292 | ||
293 | if (nvsp_ver != NVSP_PROTOCOL_VERSION_2) | 293 | if (nvsp_ver == NVSP_PROTOCOL_VERSION_1) |
294 | return 0; | 294 | return 0; |
295 | 295 | ||
296 | /* NVSPv2 only: Send NDIS config */ | 296 | /* NVSPv2 only: Send NDIS config */ |
@@ -314,6 +314,9 @@ static int netvsc_connect_vsp(struct hv_device *device) | |||
314 | struct nvsp_message *init_packet; | 314 | struct nvsp_message *init_packet; |
315 | int ndis_version; | 315 | int ndis_version; |
316 | struct net_device *ndev; | 316 | struct net_device *ndev; |
317 | u32 ver_list[] = { NVSP_PROTOCOL_VERSION_1, NVSP_PROTOCOL_VERSION_2, | ||
318 | NVSP_PROTOCOL_VERSION_4, NVSP_PROTOCOL_VERSION_5 }; | ||
319 | int i, num_ver = 4; /* number of different NVSP versions */ | ||
317 | 320 | ||
318 | net_device = get_outbound_net_device(device); | 321 | net_device = get_outbound_net_device(device); |
319 | if (!net_device) | 322 | if (!net_device) |
@@ -323,13 +326,14 @@ static int netvsc_connect_vsp(struct hv_device *device) | |||
323 | init_packet = &net_device->channel_init_pkt; | 326 | init_packet = &net_device->channel_init_pkt; |
324 | 327 | ||
325 | /* Negotiate the latest NVSP protocol supported */ | 328 | /* Negotiate the latest NVSP protocol supported */ |
326 | if (negotiate_nvsp_ver(device, net_device, init_packet, | 329 | for (i = num_ver - 1; i >= 0; i--) |
327 | NVSP_PROTOCOL_VERSION_2) == 0) { | 330 | if (negotiate_nvsp_ver(device, net_device, init_packet, |
328 | net_device->nvsp_version = NVSP_PROTOCOL_VERSION_2; | 331 | ver_list[i]) == 0) { |
329 | } else if (negotiate_nvsp_ver(device, net_device, init_packet, | 332 | net_device->nvsp_version = ver_list[i]; |
330 | NVSP_PROTOCOL_VERSION_1) == 0) { | 333 | break; |
331 | net_device->nvsp_version = NVSP_PROTOCOL_VERSION_1; | 334 | } |
332 | } else { | 335 | |
336 | if (i < 0) { | ||
333 | ret = -EPROTO; | 337 | ret = -EPROTO; |
334 | goto cleanup; | 338 | goto cleanup; |
335 | } | 339 | } |
@@ -339,7 +343,10 @@ static int netvsc_connect_vsp(struct hv_device *device) | |||
339 | /* Send the ndis version */ | 343 | /* Send the ndis version */ |
340 | memset(init_packet, 0, sizeof(struct nvsp_message)); | 344 | memset(init_packet, 0, sizeof(struct nvsp_message)); |
341 | 345 | ||
342 | ndis_version = 0x00050001; | 346 | if (net_device->nvsp_version <= NVSP_PROTOCOL_VERSION_4) |
347 | ndis_version = 0x00050001; | ||
348 | else | ||
349 | ndis_version = 0x0006001e; | ||
343 | 350 | ||
344 | init_packet->hdr.msg_type = NVSP_MSG1_TYPE_SEND_NDIS_VER; | 351 | init_packet->hdr.msg_type = NVSP_MSG1_TYPE_SEND_NDIS_VER; |
345 | init_packet->msg.v1_msg. | 352 | init_packet->msg.v1_msg. |