Deleted Added
full compact
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 ---