hv_net_vsc.c (256281) | hv_net_vsc.c (266794) |
---|---|
1/*- 2 * Copyright (c) 2009-2012 Microsoft Corp. 3 * Copyright (c) 2010-2012 Citrix Inc. 4 * Copyright (c) 2012 NetApp Inc. 5 * All rights reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions --- 10 unchanged lines hidden (view full) --- 19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 1/*- 2 * Copyright (c) 2009-2012 Microsoft Corp. 3 * Copyright (c) 2010-2012 Citrix Inc. 4 * Copyright (c) 2012 NetApp Inc. 5 * All rights reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions --- 10 unchanged lines hidden (view full) --- 19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
27 * 28 * $FreeBSD: stable/10/sys/dev/hyperv/netvsc/hv_net_vsc.c 266794 2014-05-28 09:06:36Z marius $ |
|
27 */ 28 29/** 30 * HyperV vmbus network VSC (virtual services client) module 31 * 32 */ 33 34 --- 139 unchanged lines hidden (view full) --- 174 init_pkt->msgs.vers_1_msgs.send_rx_buf.gpadl_handle = 175 net_dev->rx_buf_gpadl_handle; 176 init_pkt->msgs.vers_1_msgs.send_rx_buf.id = 177 NETVSC_RECEIVE_BUFFER_ID; 178 179 /* Send the gpadl notification request */ 180 181 ret = hv_vmbus_channel_send_packet(device->channel, init_pkt, | 29 */ 30 31/** 32 * HyperV vmbus network VSC (virtual services client) module 33 * 34 */ 35 36 --- 139 unchanged lines hidden (view full) --- 176 init_pkt->msgs.vers_1_msgs.send_rx_buf.gpadl_handle = 177 net_dev->rx_buf_gpadl_handle; 178 init_pkt->msgs.vers_1_msgs.send_rx_buf.id = 179 NETVSC_RECEIVE_BUFFER_ID; 180 181 /* Send the gpadl notification request */ 182 183 ret = hv_vmbus_channel_send_packet(device->channel, init_pkt, |
182 sizeof(nvsp_msg), (uint64_t)init_pkt, | 184 sizeof(nvsp_msg), (uint64_t)(uintptr_t)init_pkt, |
183 HV_VMBUS_PACKET_TYPE_DATA_IN_BAND, 184 HV_VMBUS_DATA_PACKET_FLAG_COMPLETION_REQUESTED); 185 if (ret != 0) { 186 goto cleanup; 187 } 188 189 sema_wait(&net_dev->channel_init_sema); 190 --- 81 unchanged lines hidden (view full) --- 272 init_pkt->msgs.vers_1_msgs.send_rx_buf.gpadl_handle = 273 net_dev->send_buf_gpadl_handle; 274 init_pkt->msgs.vers_1_msgs.send_rx_buf.id = 275 NETVSC_SEND_BUFFER_ID; 276 277 /* Send the gpadl notification request */ 278 279 ret = hv_vmbus_channel_send_packet(device->channel, init_pkt, | 185 HV_VMBUS_PACKET_TYPE_DATA_IN_BAND, 186 HV_VMBUS_DATA_PACKET_FLAG_COMPLETION_REQUESTED); 187 if (ret != 0) { 188 goto cleanup; 189 } 190 191 sema_wait(&net_dev->channel_init_sema); 192 --- 81 unchanged lines hidden (view full) --- 274 init_pkt->msgs.vers_1_msgs.send_rx_buf.gpadl_handle = 275 net_dev->send_buf_gpadl_handle; 276 init_pkt->msgs.vers_1_msgs.send_rx_buf.id = 277 NETVSC_SEND_BUFFER_ID; 278 279 /* Send the gpadl notification request */ 280 281 ret = hv_vmbus_channel_send_packet(device->channel, init_pkt, |
280 sizeof(nvsp_msg), (uint64_t)init_pkt, | 282 sizeof(nvsp_msg), (uint64_t)(uintptr_t)init_pkt, |
281 HV_VMBUS_PACKET_TYPE_DATA_IN_BAND, 282 HV_VMBUS_DATA_PACKET_FLAG_COMPLETION_REQUESTED); 283 if (ret != 0) { 284 goto cleanup; 285 } 286 287 sema_wait(&net_dev->channel_init_sema); 288 --- 37 unchanged lines hidden (view full) --- 326 memset(revoke_pkt, 0, sizeof(nvsp_msg)); 327 328 revoke_pkt->hdr.msg_type = nvsp_msg_1_type_revoke_rx_buf; 329 revoke_pkt->msgs.vers_1_msgs.revoke_rx_buf.id = 330 NETVSC_RECEIVE_BUFFER_ID; 331 332 ret = hv_vmbus_channel_send_packet(net_dev->dev->channel, 333 revoke_pkt, sizeof(nvsp_msg), | 283 HV_VMBUS_PACKET_TYPE_DATA_IN_BAND, 284 HV_VMBUS_DATA_PACKET_FLAG_COMPLETION_REQUESTED); 285 if (ret != 0) { 286 goto cleanup; 287 } 288 289 sema_wait(&net_dev->channel_init_sema); 290 --- 37 unchanged lines hidden (view full) --- 328 memset(revoke_pkt, 0, sizeof(nvsp_msg)); 329 330 revoke_pkt->hdr.msg_type = nvsp_msg_1_type_revoke_rx_buf; 331 revoke_pkt->msgs.vers_1_msgs.revoke_rx_buf.id = 332 NETVSC_RECEIVE_BUFFER_ID; 333 334 ret = hv_vmbus_channel_send_packet(net_dev->dev->channel, 335 revoke_pkt, sizeof(nvsp_msg), |
334 (uint64_t)revoke_pkt, | 336 (uint64_t)(uintptr_t)revoke_pkt, |
335 HV_VMBUS_PACKET_TYPE_DATA_IN_BAND, 0); 336 337 /* 338 * If we failed here, we might as well return and have a leak 339 * rather than continue and a bugchk 340 */ 341 if (ret != 0) { 342 return (ret); --- 51 unchanged lines hidden (view full) --- 394 395 revoke_pkt->hdr.msg_type = 396 nvsp_msg_1_type_revoke_send_buf; 397 revoke_pkt->msgs.vers_1_msgs.revoke_send_buf.id = 398 NETVSC_SEND_BUFFER_ID; 399 400 ret = hv_vmbus_channel_send_packet(net_dev->dev->channel, 401 revoke_pkt, sizeof(nvsp_msg), | 337 HV_VMBUS_PACKET_TYPE_DATA_IN_BAND, 0); 338 339 /* 340 * If we failed here, we might as well return and have a leak 341 * rather than continue and a bugchk 342 */ 343 if (ret != 0) { 344 return (ret); --- 51 unchanged lines hidden (view full) --- 396 397 revoke_pkt->hdr.msg_type = 398 nvsp_msg_1_type_revoke_send_buf; 399 revoke_pkt->msgs.vers_1_msgs.revoke_send_buf.id = 400 NETVSC_SEND_BUFFER_ID; 401 402 ret = hv_vmbus_channel_send_packet(net_dev->dev->channel, 403 revoke_pkt, sizeof(nvsp_msg), |
402 (uint64_t)revoke_pkt, | 404 (uint64_t)(uintptr_t)revoke_pkt, |
403 HV_VMBUS_PACKET_TYPE_DATA_IN_BAND, 0); 404 /* 405 * If we failed here, we might as well return and have a leak 406 * rather than continue and a bugchk 407 */ 408 if (ret != 0) { 409 return (ret); 410 } --- 45 unchanged lines hidden (view full) --- 456 /* 457 * Specify parameter as the only acceptable protocol version 458 */ 459 init_pkt->msgs.init_msgs.init.p1.protocol_version = nvsp_ver; 460 init_pkt->msgs.init_msgs.init.protocol_version_2 = nvsp_ver; 461 462 /* Send the init request */ 463 ret = hv_vmbus_channel_send_packet(device->channel, init_pkt, | 405 HV_VMBUS_PACKET_TYPE_DATA_IN_BAND, 0); 406 /* 407 * If we failed here, we might as well return and have a leak 408 * rather than continue and a bugchk 409 */ 410 if (ret != 0) { 411 return (ret); 412 } --- 45 unchanged lines hidden (view full) --- 458 /* 459 * Specify parameter as the only acceptable protocol version 460 */ 461 init_pkt->msgs.init_msgs.init.p1.protocol_version = nvsp_ver; 462 init_pkt->msgs.init_msgs.init.protocol_version_2 = nvsp_ver; 463 464 /* Send the init request */ 465 ret = hv_vmbus_channel_send_packet(device->channel, init_pkt, |
464 sizeof(nvsp_msg), (uint64_t)init_pkt, | 466 sizeof(nvsp_msg), (uint64_t)(uintptr_t)init_pkt, |
465 HV_VMBUS_PACKET_TYPE_DATA_IN_BAND, 466 HV_VMBUS_DATA_PACKET_FLAG_COMPLETION_REQUESTED); 467 if (ret != 0) 468 return (-1); 469 470 sema_wait(&net_dev->channel_init_sema); 471 472 if (init_pkt->msgs.init_msgs.init_compl.status != nvsp_status_success) --- 27 unchanged lines hidden (view full) --- 500 init_pkt->hdr.msg_type = nvsp_msg_2_type_send_ndis_config; 501 init_pkt->msgs.vers_2_msgs.send_ndis_config.mtu = mtu; 502 init_pkt-> 503 msgs.vers_2_msgs.send_ndis_config.capabilities.u1.u2.ieee8021q 504 = 1; 505 506 /* Send the configuration packet */ 507 ret = hv_vmbus_channel_send_packet(device->channel, init_pkt, | 467 HV_VMBUS_PACKET_TYPE_DATA_IN_BAND, 468 HV_VMBUS_DATA_PACKET_FLAG_COMPLETION_REQUESTED); 469 if (ret != 0) 470 return (-1); 471 472 sema_wait(&net_dev->channel_init_sema); 473 474 if (init_pkt->msgs.init_msgs.init_compl.status != nvsp_status_success) --- 27 unchanged lines hidden (view full) --- 502 init_pkt->hdr.msg_type = nvsp_msg_2_type_send_ndis_config; 503 init_pkt->msgs.vers_2_msgs.send_ndis_config.mtu = mtu; 504 init_pkt-> 505 msgs.vers_2_msgs.send_ndis_config.capabilities.u1.u2.ieee8021q 506 = 1; 507 508 /* Send the configuration packet */ 509 ret = hv_vmbus_channel_send_packet(device->channel, init_pkt, |
508 sizeof(nvsp_msg), (uint64_t)init_pkt, | 510 sizeof(nvsp_msg), (uint64_t)(uintptr_t)init_pkt, |
509 HV_VMBUS_PACKET_TYPE_DATA_IN_BAND, 0); 510 if (ret != 0) 511 return (-EINVAL); 512 513 return (0); 514} 515 516/* --- 55 unchanged lines hidden (view full) --- 572 init_pkt->msgs.vers_1_msgs.send_ndis_vers.ndis_major_vers = 573 (ndis_version & 0xFFFF0000) >> 16; 574 init_pkt->msgs.vers_1_msgs.send_ndis_vers.ndis_minor_vers = 575 ndis_version & 0xFFFF; 576 577 /* Send the init request */ 578 579 ret = hv_vmbus_channel_send_packet(device->channel, init_pkt, | 511 HV_VMBUS_PACKET_TYPE_DATA_IN_BAND, 0); 512 if (ret != 0) 513 return (-EINVAL); 514 515 return (0); 516} 517 518/* --- 55 unchanged lines hidden (view full) --- 574 init_pkt->msgs.vers_1_msgs.send_ndis_vers.ndis_major_vers = 575 (ndis_version & 0xFFFF0000) >> 16; 576 init_pkt->msgs.vers_1_msgs.send_ndis_vers.ndis_minor_vers = 577 ndis_version & 0xFFFF; 578 579 /* Send the init request */ 580 581 ret = hv_vmbus_channel_send_packet(device->channel, init_pkt, |
580 sizeof(nvsp_msg), (uint64_t)init_pkt, | 582 sizeof(nvsp_msg), (uint64_t)(uintptr_t)init_pkt, |
581 HV_VMBUS_PACKET_TYPE_DATA_IN_BAND, 0); 582 if (ret != 0) { 583 goto cleanup; 584 } 585 /* 586 * TODO: BUGBUG - We have to wait for the above msg since the netvsp 587 * uses KMCL which acknowledges packet (completion packet) 588 * since our Vmbus always set the --- 233 unchanged lines hidden (view full) --- 822 /* Not using send buffer section */ 823 send_msg.msgs.vers_1_msgs.send_rndis_pkt.send_buf_section_idx = 824 0xFFFFFFFF; 825 send_msg.msgs.vers_1_msgs.send_rndis_pkt.send_buf_section_size = 0; 826 827 if (pkt->page_buf_count) { 828 ret = hv_vmbus_channel_send_packet_pagebuffer(device->channel, 829 pkt->page_buffers, pkt->page_buf_count, | 583 HV_VMBUS_PACKET_TYPE_DATA_IN_BAND, 0); 584 if (ret != 0) { 585 goto cleanup; 586 } 587 /* 588 * TODO: BUGBUG - We have to wait for the above msg since the netvsp 589 * uses KMCL which acknowledges packet (completion packet) 590 * since our Vmbus always set the --- 233 unchanged lines hidden (view full) --- 824 /* Not using send buffer section */ 825 send_msg.msgs.vers_1_msgs.send_rndis_pkt.send_buf_section_idx = 826 0xFFFFFFFF; 827 send_msg.msgs.vers_1_msgs.send_rndis_pkt.send_buf_section_size = 0; 828 829 if (pkt->page_buf_count) { 830 ret = hv_vmbus_channel_send_packet_pagebuffer(device->channel, 831 pkt->page_buffers, pkt->page_buf_count, |
830 &send_msg, sizeof(nvsp_msg), (uint64_t)pkt); | 832 &send_msg, sizeof(nvsp_msg), (uint64_t)(uintptr_t)pkt); |
831 } else { 832 ret = hv_vmbus_channel_send_packet(device->channel, | 833 } else { 834 ret = hv_vmbus_channel_send_packet(device->channel, |
833 &send_msg, sizeof(nvsp_msg), (uint64_t)pkt, | 835 &send_msg, sizeof(nvsp_msg), (uint64_t)(uintptr_t)pkt, |
834 HV_VMBUS_PACKET_TYPE_DATA_IN_BAND, 835 HV_VMBUS_DATA_PACKET_FLAG_COMPLETION_REQUESTED); 836 } 837 838 /* Record outstanding send only if send_packet() succeeded */ 839 if (ret == 0) 840 atomic_add_int(&net_dev->num_outstanding_sends, 1); 841 --- 300 unchanged lines hidden --- | 836 HV_VMBUS_PACKET_TYPE_DATA_IN_BAND, 837 HV_VMBUS_DATA_PACKET_FLAG_COMPLETION_REQUESTED); 838 } 839 840 /* Record outstanding send only if send_packet() succeeded */ 841 if (ret == 0) 842 atomic_add_int(&net_dev->num_outstanding_sends, 1); 843 --- 300 unchanged lines hidden --- |