0001
0002
0003
0004
0005
0006
0007
0008
0009 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
0010
0011 #include <linux/kernel.h>
0012 #include <linux/sched.h>
0013 #include <linux/wait.h>
0014 #include <linux/mm.h>
0015 #include <linux/delay.h>
0016 #include <linux/io.h>
0017 #include <linux/slab.h>
0018 #include <linux/netdevice.h>
0019 #include <linux/if_ether.h>
0020 #include <linux/vmalloc.h>
0021 #include <linux/rtnetlink.h>
0022 #include <linux/prefetch.h>
0023 #include <linux/filter.h>
0024
0025 #include <asm/sync_bitops.h>
0026 #include <asm/mshyperv.h>
0027
0028 #include "hyperv_net.h"
0029 #include "netvsc_trace.h"
0030
0031
0032
0033
0034
0035 int netvsc_switch_datapath(struct net_device *ndev, bool vf)
0036 {
0037 struct net_device_context *net_device_ctx = netdev_priv(ndev);
0038 struct hv_device *dev = net_device_ctx->device_ctx;
0039 struct netvsc_device *nv_dev = rtnl_dereference(net_device_ctx->nvdev);
0040 struct nvsp_message *init_pkt = &nv_dev->channel_init_pkt;
0041 int ret, retry = 0;
0042
0043
0044 if (!vf)
0045 net_device_ctx->data_path_is_vf = vf;
0046
0047 memset(init_pkt, 0, sizeof(struct nvsp_message));
0048 init_pkt->hdr.msg_type = NVSP_MSG4_TYPE_SWITCH_DATA_PATH;
0049 if (vf)
0050 init_pkt->msg.v4_msg.active_dp.active_datapath =
0051 NVSP_DATAPATH_VF;
0052 else
0053 init_pkt->msg.v4_msg.active_dp.active_datapath =
0054 NVSP_DATAPATH_SYNTHETIC;
0055
0056 again:
0057 trace_nvsp_send(ndev, init_pkt);
0058
0059 ret = vmbus_sendpacket(dev->channel, init_pkt,
0060 sizeof(struct nvsp_message),
0061 (unsigned long)init_pkt, VM_PKT_DATA_INBAND,
0062 VMBUS_DATA_PACKET_FLAG_COMPLETION_REQUESTED);
0063
0064
0065
0066
0067 if (ret) {
0068 if (ret != -EAGAIN) {
0069 netdev_err(ndev,
0070 "Unable to send sw datapath msg, err: %d\n",
0071 ret);
0072 return ret;
0073 }
0074
0075 if (retry++ < RETRY_MAX) {
0076 usleep_range(RETRY_US_LO, RETRY_US_HI);
0077 goto again;
0078 } else {
0079 netdev_err(
0080 ndev,
0081 "Retry failed to send sw datapath msg, err: %d\n",
0082 ret);
0083 return ret;
0084 }
0085 }
0086
0087 wait_for_completion(&nv_dev->channel_init_wait);
0088 net_device_ctx->data_path_is_vf = vf;
0089
0090 return 0;
0091 }
0092
0093
0094
0095
0096
0097 static void netvsc_subchan_work(struct work_struct *w)
0098 {
0099 struct netvsc_device *nvdev =
0100 container_of(w, struct netvsc_device, subchan_work);
0101 struct rndis_device *rdev;
0102 int i, ret;
0103
0104
0105 if (!rtnl_trylock()) {
0106 schedule_work(w);
0107 return;
0108 }
0109
0110 rdev = nvdev->extension;
0111 if (rdev) {
0112 ret = rndis_set_subchannel(rdev->ndev, nvdev, NULL);
0113 if (ret == 0) {
0114 netif_device_attach(rdev->ndev);
0115 } else {
0116
0117 for (i = 1; i < nvdev->num_chn; i++)
0118 netif_napi_del(&nvdev->chan_table[i].napi);
0119
0120 nvdev->max_chn = 1;
0121 nvdev->num_chn = 1;
0122 }
0123 }
0124
0125 rtnl_unlock();
0126 }
0127
0128 static struct netvsc_device *alloc_net_device(void)
0129 {
0130 struct netvsc_device *net_device;
0131
0132 net_device = kzalloc(sizeof(struct netvsc_device), GFP_KERNEL);
0133 if (!net_device)
0134 return NULL;
0135
0136 init_waitqueue_head(&net_device->wait_drain);
0137 net_device->destroy = false;
0138 net_device->tx_disable = true;
0139
0140 net_device->max_pkt = RNDIS_MAX_PKT_DEFAULT;
0141 net_device->pkt_align = RNDIS_PKT_ALIGN_DEFAULT;
0142
0143 init_completion(&net_device->channel_init_wait);
0144 init_waitqueue_head(&net_device->subchan_open);
0145 INIT_WORK(&net_device->subchan_work, netvsc_subchan_work);
0146
0147 return net_device;
0148 }
0149
0150 static void free_netvsc_device(struct rcu_head *head)
0151 {
0152 struct netvsc_device *nvdev
0153 = container_of(head, struct netvsc_device, rcu);
0154 int i;
0155
0156 kfree(nvdev->extension);
0157
0158 if (nvdev->recv_original_buf)
0159 vfree(nvdev->recv_original_buf);
0160 else
0161 vfree(nvdev->recv_buf);
0162
0163 if (nvdev->send_original_buf)
0164 vfree(nvdev->send_original_buf);
0165 else
0166 vfree(nvdev->send_buf);
0167
0168 bitmap_free(nvdev->send_section_map);
0169
0170 for (i = 0; i < VRSS_CHANNEL_MAX; i++) {
0171 xdp_rxq_info_unreg(&nvdev->chan_table[i].xdp_rxq);
0172 kfree(nvdev->chan_table[i].recv_buf);
0173 vfree(nvdev->chan_table[i].mrc.slots);
0174 }
0175
0176 kfree(nvdev);
0177 }
0178
0179 static void free_netvsc_device_rcu(struct netvsc_device *nvdev)
0180 {
0181 call_rcu(&nvdev->rcu, free_netvsc_device);
0182 }
0183
0184 static void netvsc_revoke_recv_buf(struct hv_device *device,
0185 struct netvsc_device *net_device,
0186 struct net_device *ndev)
0187 {
0188 struct nvsp_message *revoke_packet;
0189 int ret;
0190
0191
0192
0193
0194
0195
0196
0197 if (net_device->recv_section_cnt) {
0198
0199 revoke_packet = &net_device->revoke_packet;
0200 memset(revoke_packet, 0, sizeof(struct nvsp_message));
0201
0202 revoke_packet->hdr.msg_type =
0203 NVSP_MSG1_TYPE_REVOKE_RECV_BUF;
0204 revoke_packet->msg.v1_msg.
0205 revoke_recv_buf.id = NETVSC_RECEIVE_BUFFER_ID;
0206
0207 trace_nvsp_send(ndev, revoke_packet);
0208
0209 ret = vmbus_sendpacket(device->channel,
0210 revoke_packet,
0211 sizeof(struct nvsp_message),
0212 VMBUS_RQST_ID_NO_RESPONSE,
0213 VM_PKT_DATA_INBAND, 0);
0214
0215
0216
0217
0218
0219 if (device->channel->rescind)
0220 ret = 0;
0221
0222
0223
0224
0225 if (ret != 0) {
0226 netdev_err(ndev, "unable to send "
0227 "revoke receive buffer to netvsp\n");
0228 return;
0229 }
0230 net_device->recv_section_cnt = 0;
0231 }
0232 }
0233
0234 static void netvsc_revoke_send_buf(struct hv_device *device,
0235 struct netvsc_device *net_device,
0236 struct net_device *ndev)
0237 {
0238 struct nvsp_message *revoke_packet;
0239 int ret;
0240
0241
0242
0243
0244
0245
0246
0247 if (net_device->send_section_cnt) {
0248
0249 revoke_packet = &net_device->revoke_packet;
0250 memset(revoke_packet, 0, sizeof(struct nvsp_message));
0251
0252 revoke_packet->hdr.msg_type =
0253 NVSP_MSG1_TYPE_REVOKE_SEND_BUF;
0254 revoke_packet->msg.v1_msg.revoke_send_buf.id =
0255 NETVSC_SEND_BUFFER_ID;
0256
0257 trace_nvsp_send(ndev, revoke_packet);
0258
0259 ret = vmbus_sendpacket(device->channel,
0260 revoke_packet,
0261 sizeof(struct nvsp_message),
0262 VMBUS_RQST_ID_NO_RESPONSE,
0263 VM_PKT_DATA_INBAND, 0);
0264
0265
0266
0267
0268
0269
0270 if (device->channel->rescind)
0271 ret = 0;
0272
0273
0274
0275
0276 if (ret != 0) {
0277 netdev_err(ndev, "unable to send "
0278 "revoke send buffer to netvsp\n");
0279 return;
0280 }
0281 net_device->send_section_cnt = 0;
0282 }
0283 }
0284
0285 static void netvsc_teardown_recv_gpadl(struct hv_device *device,
0286 struct netvsc_device *net_device,
0287 struct net_device *ndev)
0288 {
0289 int ret;
0290
0291 if (net_device->recv_buf_gpadl_handle.gpadl_handle) {
0292 ret = vmbus_teardown_gpadl(device->channel,
0293 &net_device->recv_buf_gpadl_handle);
0294
0295
0296
0297
0298 if (ret != 0) {
0299 netdev_err(ndev,
0300 "unable to teardown receive buffer's gpadl\n");
0301 return;
0302 }
0303 }
0304 }
0305
0306 static void netvsc_teardown_send_gpadl(struct hv_device *device,
0307 struct netvsc_device *net_device,
0308 struct net_device *ndev)
0309 {
0310 int ret;
0311
0312 if (net_device->send_buf_gpadl_handle.gpadl_handle) {
0313 ret = vmbus_teardown_gpadl(device->channel,
0314 &net_device->send_buf_gpadl_handle);
0315
0316
0317
0318
0319 if (ret != 0) {
0320 netdev_err(ndev,
0321 "unable to teardown send buffer's gpadl\n");
0322 return;
0323 }
0324 }
0325 }
0326
0327 int netvsc_alloc_recv_comp_ring(struct netvsc_device *net_device, u32 q_idx)
0328 {
0329 struct netvsc_channel *nvchan = &net_device->chan_table[q_idx];
0330 int node = cpu_to_node(nvchan->channel->target_cpu);
0331 size_t size;
0332
0333 size = net_device->recv_completion_cnt * sizeof(struct recv_comp_data);
0334 nvchan->mrc.slots = vzalloc_node(size, node);
0335 if (!nvchan->mrc.slots)
0336 nvchan->mrc.slots = vzalloc(size);
0337
0338 return nvchan->mrc.slots ? 0 : -ENOMEM;
0339 }
0340
0341 static int netvsc_init_buf(struct hv_device *device,
0342 struct netvsc_device *net_device,
0343 const struct netvsc_device_info *device_info)
0344 {
0345 struct nvsp_1_message_send_receive_buffer_complete *resp;
0346 struct net_device *ndev = hv_get_drvdata(device);
0347 struct nvsp_message *init_packet;
0348 unsigned int buf_size;
0349 int i, ret = 0;
0350 void *vaddr;
0351
0352
0353 buf_size = device_info->recv_sections * device_info->recv_section_size;
0354 buf_size = roundup(buf_size, PAGE_SIZE);
0355
0356
0357 if (net_device->nvsp_version <= NVSP_PROTOCOL_VERSION_2)
0358 buf_size = min_t(unsigned int, buf_size,
0359 NETVSC_RECEIVE_BUFFER_SIZE_LEGACY);
0360
0361 net_device->recv_buf = vzalloc(buf_size);
0362 if (!net_device->recv_buf) {
0363 netdev_err(ndev,
0364 "unable to allocate receive buffer of size %u\n",
0365 buf_size);
0366 ret = -ENOMEM;
0367 goto cleanup;
0368 }
0369
0370 net_device->recv_buf_size = buf_size;
0371
0372
0373
0374
0375
0376
0377 ret = vmbus_establish_gpadl(device->channel, net_device->recv_buf,
0378 buf_size,
0379 &net_device->recv_buf_gpadl_handle);
0380 if (ret != 0) {
0381 netdev_err(ndev,
0382 "unable to establish receive buffer's gpadl\n");
0383 goto cleanup;
0384 }
0385
0386 if (hv_isolation_type_snp()) {
0387 vaddr = hv_map_memory(net_device->recv_buf, buf_size);
0388 if (!vaddr) {
0389 ret = -ENOMEM;
0390 goto cleanup;
0391 }
0392
0393 net_device->recv_original_buf = net_device->recv_buf;
0394 net_device->recv_buf = vaddr;
0395 }
0396
0397
0398 init_packet = &net_device->channel_init_pkt;
0399 memset(init_packet, 0, sizeof(struct nvsp_message));
0400 init_packet->hdr.msg_type = NVSP_MSG1_TYPE_SEND_RECV_BUF;
0401 init_packet->msg.v1_msg.send_recv_buf.
0402 gpadl_handle = net_device->recv_buf_gpadl_handle.gpadl_handle;
0403 init_packet->msg.v1_msg.
0404 send_recv_buf.id = NETVSC_RECEIVE_BUFFER_ID;
0405
0406 trace_nvsp_send(ndev, init_packet);
0407
0408
0409 ret = vmbus_sendpacket(device->channel, init_packet,
0410 sizeof(struct nvsp_message),
0411 (unsigned long)init_packet,
0412 VM_PKT_DATA_INBAND,
0413 VMBUS_DATA_PACKET_FLAG_COMPLETION_REQUESTED);
0414 if (ret != 0) {
0415 netdev_err(ndev,
0416 "unable to send receive buffer's gpadl to netvsp\n");
0417 goto cleanup;
0418 }
0419
0420 wait_for_completion(&net_device->channel_init_wait);
0421
0422
0423 resp = &init_packet->msg.v1_msg.send_recv_buf_complete;
0424 if (resp->status != NVSP_STAT_SUCCESS) {
0425 netdev_err(ndev,
0426 "Unable to complete receive buffer initialization with NetVsp - status %d\n",
0427 resp->status);
0428 ret = -EINVAL;
0429 goto cleanup;
0430 }
0431
0432
0433 netdev_dbg(ndev, "Receive sections: %u sub_allocs: size %u count: %u\n",
0434 resp->num_sections, resp->sections[0].sub_alloc_size,
0435 resp->sections[0].num_sub_allocs);
0436
0437
0438 if (resp->num_sections != 1 || resp->sections[0].offset != 0) {
0439 ret = -EINVAL;
0440 goto cleanup;
0441 }
0442
0443 net_device->recv_section_size = resp->sections[0].sub_alloc_size;
0444 net_device->recv_section_cnt = resp->sections[0].num_sub_allocs;
0445
0446
0447 if (net_device->recv_section_size < NETVSC_MTU_MIN || (u64)net_device->recv_section_size *
0448 (u64)net_device->recv_section_cnt > (u64)buf_size) {
0449 netdev_err(ndev, "invalid recv_section_size %u\n",
0450 net_device->recv_section_size);
0451 ret = -EINVAL;
0452 goto cleanup;
0453 }
0454
0455 for (i = 0; i < VRSS_CHANNEL_MAX; i++) {
0456 struct netvsc_channel *nvchan = &net_device->chan_table[i];
0457
0458 nvchan->recv_buf = kzalloc(net_device->recv_section_size, GFP_KERNEL);
0459 if (nvchan->recv_buf == NULL) {
0460 ret = -ENOMEM;
0461 goto cleanup;
0462 }
0463 }
0464
0465
0466
0467
0468
0469 net_device->recv_completion_cnt = net_device->recv_section_cnt + 1;
0470 ret = netvsc_alloc_recv_comp_ring(net_device, 0);
0471 if (ret)
0472 goto cleanup;
0473
0474
0475 buf_size = device_info->send_sections * device_info->send_section_size;
0476 buf_size = round_up(buf_size, PAGE_SIZE);
0477
0478 net_device->send_buf = vzalloc(buf_size);
0479 if (!net_device->send_buf) {
0480 netdev_err(ndev, "unable to allocate send buffer of size %u\n",
0481 buf_size);
0482 ret = -ENOMEM;
0483 goto cleanup;
0484 }
0485 net_device->send_buf_size = buf_size;
0486
0487
0488
0489
0490
0491 ret = vmbus_establish_gpadl(device->channel, net_device->send_buf,
0492 buf_size,
0493 &net_device->send_buf_gpadl_handle);
0494 if (ret != 0) {
0495 netdev_err(ndev,
0496 "unable to establish send buffer's gpadl\n");
0497 goto cleanup;
0498 }
0499
0500 if (hv_isolation_type_snp()) {
0501 vaddr = hv_map_memory(net_device->send_buf, buf_size);
0502 if (!vaddr) {
0503 ret = -ENOMEM;
0504 goto cleanup;
0505 }
0506
0507 net_device->send_original_buf = net_device->send_buf;
0508 net_device->send_buf = vaddr;
0509 }
0510
0511
0512 init_packet = &net_device->channel_init_pkt;
0513 memset(init_packet, 0, sizeof(struct nvsp_message));
0514 init_packet->hdr.msg_type = NVSP_MSG1_TYPE_SEND_SEND_BUF;
0515 init_packet->msg.v1_msg.send_send_buf.gpadl_handle =
0516 net_device->send_buf_gpadl_handle.gpadl_handle;
0517 init_packet->msg.v1_msg.send_send_buf.id = NETVSC_SEND_BUFFER_ID;
0518
0519 trace_nvsp_send(ndev, init_packet);
0520
0521
0522 ret = vmbus_sendpacket(device->channel, init_packet,
0523 sizeof(struct nvsp_message),
0524 (unsigned long)init_packet,
0525 VM_PKT_DATA_INBAND,
0526 VMBUS_DATA_PACKET_FLAG_COMPLETION_REQUESTED);
0527 if (ret != 0) {
0528 netdev_err(ndev,
0529 "unable to send send buffer's gpadl to netvsp\n");
0530 goto cleanup;
0531 }
0532
0533 wait_for_completion(&net_device->channel_init_wait);
0534
0535
0536 if (init_packet->msg.v1_msg.
0537 send_send_buf_complete.status != NVSP_STAT_SUCCESS) {
0538 netdev_err(ndev, "Unable to complete send buffer "
0539 "initialization with NetVsp - status %d\n",
0540 init_packet->msg.v1_msg.
0541 send_send_buf_complete.status);
0542 ret = -EINVAL;
0543 goto cleanup;
0544 }
0545
0546
0547 net_device->send_section_size = init_packet->msg.
0548 v1_msg.send_send_buf_complete.section_size;
0549 if (net_device->send_section_size < NETVSC_MTU_MIN) {
0550 netdev_err(ndev, "invalid send_section_size %u\n",
0551 net_device->send_section_size);
0552 ret = -EINVAL;
0553 goto cleanup;
0554 }
0555
0556
0557 net_device->send_section_cnt = buf_size / net_device->send_section_size;
0558
0559 netdev_dbg(ndev, "Send section size: %d, Section count:%d\n",
0560 net_device->send_section_size, net_device->send_section_cnt);
0561
0562
0563 net_device->send_section_map = bitmap_zalloc(net_device->send_section_cnt,
0564 GFP_KERNEL);
0565 if (!net_device->send_section_map) {
0566 ret = -ENOMEM;
0567 goto cleanup;
0568 }
0569
0570 goto exit;
0571
0572 cleanup:
0573 netvsc_revoke_recv_buf(device, net_device, ndev);
0574 netvsc_revoke_send_buf(device, net_device, ndev);
0575 netvsc_teardown_recv_gpadl(device, net_device, ndev);
0576 netvsc_teardown_send_gpadl(device, net_device, ndev);
0577
0578 exit:
0579 return ret;
0580 }
0581
0582
0583 static int negotiate_nvsp_ver(struct hv_device *device,
0584 struct netvsc_device *net_device,
0585 struct nvsp_message *init_packet,
0586 u32 nvsp_ver)
0587 {
0588 struct net_device *ndev = hv_get_drvdata(device);
0589 int ret;
0590
0591 memset(init_packet, 0, sizeof(struct nvsp_message));
0592 init_packet->hdr.msg_type = NVSP_MSG_TYPE_INIT;
0593 init_packet->msg.init_msg.init.min_protocol_ver = nvsp_ver;
0594 init_packet->msg.init_msg.init.max_protocol_ver = nvsp_ver;
0595 trace_nvsp_send(ndev, init_packet);
0596
0597
0598 ret = vmbus_sendpacket(device->channel, init_packet,
0599 sizeof(struct nvsp_message),
0600 (unsigned long)init_packet,
0601 VM_PKT_DATA_INBAND,
0602 VMBUS_DATA_PACKET_FLAG_COMPLETION_REQUESTED);
0603
0604 if (ret != 0)
0605 return ret;
0606
0607 wait_for_completion(&net_device->channel_init_wait);
0608
0609 if (init_packet->msg.init_msg.init_complete.status !=
0610 NVSP_STAT_SUCCESS)
0611 return -EINVAL;
0612
0613 if (nvsp_ver == NVSP_PROTOCOL_VERSION_1)
0614 return 0;
0615
0616
0617 memset(init_packet, 0, sizeof(struct nvsp_message));
0618 init_packet->hdr.msg_type = NVSP_MSG2_TYPE_SEND_NDIS_CONFIG;
0619 init_packet->msg.v2_msg.send_ndis_config.mtu = ndev->mtu + ETH_HLEN;
0620 init_packet->msg.v2_msg.send_ndis_config.capability.ieee8021q = 1;
0621
0622 if (nvsp_ver >= NVSP_PROTOCOL_VERSION_5) {
0623 if (hv_is_isolation_supported())
0624 netdev_info(ndev, "SR-IOV not advertised by guests on the host supporting isolation\n");
0625 else
0626 init_packet->msg.v2_msg.send_ndis_config.capability.sriov = 1;
0627
0628
0629 init_packet->msg.v2_msg.send_ndis_config.capability.teaming = 1;
0630 }
0631
0632 if (nvsp_ver >= NVSP_PROTOCOL_VERSION_61)
0633 init_packet->msg.v2_msg.send_ndis_config.capability.rsc = 1;
0634
0635 trace_nvsp_send(ndev, init_packet);
0636
0637 ret = vmbus_sendpacket(device->channel, init_packet,
0638 sizeof(struct nvsp_message),
0639 VMBUS_RQST_ID_NO_RESPONSE,
0640 VM_PKT_DATA_INBAND, 0);
0641
0642 return ret;
0643 }
0644
0645 static int netvsc_connect_vsp(struct hv_device *device,
0646 struct netvsc_device *net_device,
0647 const struct netvsc_device_info *device_info)
0648 {
0649 struct net_device *ndev = hv_get_drvdata(device);
0650 static const u32 ver_list[] = {
0651 NVSP_PROTOCOL_VERSION_1, NVSP_PROTOCOL_VERSION_2,
0652 NVSP_PROTOCOL_VERSION_4, NVSP_PROTOCOL_VERSION_5,
0653 NVSP_PROTOCOL_VERSION_6, NVSP_PROTOCOL_VERSION_61
0654 };
0655 struct nvsp_message *init_packet;
0656 int ndis_version, i, ret;
0657
0658 init_packet = &net_device->channel_init_pkt;
0659
0660
0661 for (i = ARRAY_SIZE(ver_list) - 1; i >= 0; i--)
0662 if (negotiate_nvsp_ver(device, net_device, init_packet,
0663 ver_list[i]) == 0) {
0664 net_device->nvsp_version = ver_list[i];
0665 break;
0666 }
0667
0668 if (i < 0) {
0669 ret = -EPROTO;
0670 goto cleanup;
0671 }
0672
0673 if (hv_is_isolation_supported() && net_device->nvsp_version < NVSP_PROTOCOL_VERSION_61) {
0674 netdev_err(ndev, "Invalid NVSP version 0x%x (expected >= 0x%x) from the host supporting isolation\n",
0675 net_device->nvsp_version, NVSP_PROTOCOL_VERSION_61);
0676 ret = -EPROTO;
0677 goto cleanup;
0678 }
0679
0680 pr_debug("Negotiated NVSP version:%x\n", net_device->nvsp_version);
0681
0682
0683 memset(init_packet, 0, sizeof(struct nvsp_message));
0684
0685 if (net_device->nvsp_version <= NVSP_PROTOCOL_VERSION_4)
0686 ndis_version = 0x00060001;
0687 else
0688 ndis_version = 0x0006001e;
0689
0690 init_packet->hdr.msg_type = NVSP_MSG1_TYPE_SEND_NDIS_VER;
0691 init_packet->msg.v1_msg.
0692 send_ndis_ver.ndis_major_ver =
0693 (ndis_version & 0xFFFF0000) >> 16;
0694 init_packet->msg.v1_msg.
0695 send_ndis_ver.ndis_minor_ver =
0696 ndis_version & 0xFFFF;
0697
0698 trace_nvsp_send(ndev, init_packet);
0699
0700
0701 ret = vmbus_sendpacket(device->channel, init_packet,
0702 sizeof(struct nvsp_message),
0703 VMBUS_RQST_ID_NO_RESPONSE,
0704 VM_PKT_DATA_INBAND, 0);
0705 if (ret != 0)
0706 goto cleanup;
0707
0708
0709 ret = netvsc_init_buf(device, net_device, device_info);
0710
0711 cleanup:
0712 return ret;
0713 }
0714
0715
0716
0717
0718 void netvsc_device_remove(struct hv_device *device)
0719 {
0720 struct net_device *ndev = hv_get_drvdata(device);
0721 struct net_device_context *net_device_ctx = netdev_priv(ndev);
0722 struct netvsc_device *net_device
0723 = rtnl_dereference(net_device_ctx->nvdev);
0724 int i;
0725
0726
0727
0728
0729
0730 netvsc_revoke_recv_buf(device, net_device, ndev);
0731 if (vmbus_proto_version < VERSION_WIN10)
0732 netvsc_teardown_recv_gpadl(device, net_device, ndev);
0733
0734 netvsc_revoke_send_buf(device, net_device, ndev);
0735 if (vmbus_proto_version < VERSION_WIN10)
0736 netvsc_teardown_send_gpadl(device, net_device, ndev);
0737
0738 RCU_INIT_POINTER(net_device_ctx->nvdev, NULL);
0739
0740
0741 for (i = 0; i < net_device->num_chn; i++) {
0742
0743 napi_disable(&net_device->chan_table[i].napi);
0744 netif_napi_del(&net_device->chan_table[i].napi);
0745 }
0746
0747
0748
0749
0750
0751 netdev_dbg(ndev, "net device safe to remove\n");
0752
0753
0754 vmbus_close(device->channel);
0755
0756
0757
0758
0759
0760 if (vmbus_proto_version >= VERSION_WIN10) {
0761 netvsc_teardown_recv_gpadl(device, net_device, ndev);
0762 netvsc_teardown_send_gpadl(device, net_device, ndev);
0763 }
0764
0765 if (net_device->recv_original_buf)
0766 hv_unmap_memory(net_device->recv_buf);
0767
0768 if (net_device->send_original_buf)
0769 hv_unmap_memory(net_device->send_buf);
0770
0771
0772 free_netvsc_device_rcu(net_device);
0773 }
0774
0775 #define RING_AVAIL_PERCENT_HIWATER 20
0776 #define RING_AVAIL_PERCENT_LOWATER 10
0777
0778 static inline void netvsc_free_send_slot(struct netvsc_device *net_device,
0779 u32 index)
0780 {
0781 sync_change_bit(index, net_device->send_section_map);
0782 }
0783
0784 static void netvsc_send_tx_complete(struct net_device *ndev,
0785 struct netvsc_device *net_device,
0786 struct vmbus_channel *channel,
0787 const struct vmpacket_descriptor *desc,
0788 int budget)
0789 {
0790 struct net_device_context *ndev_ctx = netdev_priv(ndev);
0791 struct sk_buff *skb;
0792 u16 q_idx = 0;
0793 int queue_sends;
0794 u64 cmd_rqst;
0795
0796 cmd_rqst = channel->request_addr_callback(channel, desc->trans_id);
0797 if (cmd_rqst == VMBUS_RQST_ERROR) {
0798 netdev_err(ndev, "Invalid transaction ID %llx\n", desc->trans_id);
0799 return;
0800 }
0801
0802 skb = (struct sk_buff *)(unsigned long)cmd_rqst;
0803
0804
0805 if (likely(skb)) {
0806 struct hv_netvsc_packet *packet
0807 = (struct hv_netvsc_packet *)skb->cb;
0808 u32 send_index = packet->send_buf_index;
0809 struct netvsc_stats_tx *tx_stats;
0810
0811 if (send_index != NETVSC_INVALID_INDEX)
0812 netvsc_free_send_slot(net_device, send_index);
0813 q_idx = packet->q_idx;
0814
0815 tx_stats = &net_device->chan_table[q_idx].tx_stats;
0816
0817 u64_stats_update_begin(&tx_stats->syncp);
0818 tx_stats->packets += packet->total_packets;
0819 tx_stats->bytes += packet->total_bytes;
0820 u64_stats_update_end(&tx_stats->syncp);
0821
0822 netvsc_dma_unmap(ndev_ctx->device_ctx, packet);
0823 napi_consume_skb(skb, budget);
0824 }
0825
0826 queue_sends =
0827 atomic_dec_return(&net_device->chan_table[q_idx].queue_sends);
0828
0829 if (unlikely(net_device->destroy)) {
0830 if (queue_sends == 0)
0831 wake_up(&net_device->wait_drain);
0832 } else {
0833 struct netdev_queue *txq = netdev_get_tx_queue(ndev, q_idx);
0834
0835 if (netif_tx_queue_stopped(txq) && !net_device->tx_disable &&
0836 (hv_get_avail_to_write_percent(&channel->outbound) >
0837 RING_AVAIL_PERCENT_HIWATER || queue_sends < 1)) {
0838 netif_tx_wake_queue(txq);
0839 ndev_ctx->eth_stats.wake_queue++;
0840 }
0841 }
0842 }
0843
0844 static void netvsc_send_completion(struct net_device *ndev,
0845 struct netvsc_device *net_device,
0846 struct vmbus_channel *incoming_channel,
0847 const struct vmpacket_descriptor *desc,
0848 int budget)
0849 {
0850 const struct nvsp_message *nvsp_packet;
0851 u32 msglen = hv_pkt_datalen(desc);
0852 struct nvsp_message *pkt_rqst;
0853 u64 cmd_rqst;
0854
0855
0856 if (!msglen) {
0857 cmd_rqst = incoming_channel->request_addr_callback(incoming_channel,
0858 desc->trans_id);
0859 if (cmd_rqst == VMBUS_RQST_ERROR) {
0860 netdev_err(ndev, "Invalid transaction ID %llx\n", desc->trans_id);
0861 return;
0862 }
0863
0864 pkt_rqst = (struct nvsp_message *)(uintptr_t)cmd_rqst;
0865 switch (pkt_rqst->hdr.msg_type) {
0866 case NVSP_MSG4_TYPE_SWITCH_DATA_PATH:
0867 complete(&net_device->channel_init_wait);
0868 break;
0869
0870 default:
0871 netdev_err(ndev, "Unexpected VMBUS completion!!\n");
0872 }
0873 return;
0874 }
0875
0876
0877 if (msglen < sizeof(struct nvsp_message_header)) {
0878 netdev_err(ndev, "nvsp_message length too small: %u\n", msglen);
0879 return;
0880 }
0881
0882 nvsp_packet = hv_pkt_data(desc);
0883 switch (nvsp_packet->hdr.msg_type) {
0884 case NVSP_MSG_TYPE_INIT_COMPLETE:
0885 if (msglen < sizeof(struct nvsp_message_header) +
0886 sizeof(struct nvsp_message_init_complete)) {
0887 netdev_err(ndev, "nvsp_msg length too small: %u\n",
0888 msglen);
0889 return;
0890 }
0891 fallthrough;
0892
0893 case NVSP_MSG1_TYPE_SEND_RECV_BUF_COMPLETE:
0894 if (msglen < sizeof(struct nvsp_message_header) +
0895 sizeof(struct nvsp_1_message_send_receive_buffer_complete)) {
0896 netdev_err(ndev, "nvsp_msg1 length too small: %u\n",
0897 msglen);
0898 return;
0899 }
0900 fallthrough;
0901
0902 case NVSP_MSG1_TYPE_SEND_SEND_BUF_COMPLETE:
0903 if (msglen < sizeof(struct nvsp_message_header) +
0904 sizeof(struct nvsp_1_message_send_send_buffer_complete)) {
0905 netdev_err(ndev, "nvsp_msg1 length too small: %u\n",
0906 msglen);
0907 return;
0908 }
0909 fallthrough;
0910
0911 case NVSP_MSG5_TYPE_SUBCHANNEL:
0912 if (msglen < sizeof(struct nvsp_message_header) +
0913 sizeof(struct nvsp_5_subchannel_complete)) {
0914 netdev_err(ndev, "nvsp_msg5 length too small: %u\n",
0915 msglen);
0916 return;
0917 }
0918
0919 memcpy(&net_device->channel_init_pkt, nvsp_packet,
0920 sizeof(struct nvsp_message));
0921 complete(&net_device->channel_init_wait);
0922 break;
0923
0924 case NVSP_MSG1_TYPE_SEND_RNDIS_PKT_COMPLETE:
0925 netvsc_send_tx_complete(ndev, net_device, incoming_channel,
0926 desc, budget);
0927 break;
0928
0929 default:
0930 netdev_err(ndev,
0931 "Unknown send completion type %d received!!\n",
0932 nvsp_packet->hdr.msg_type);
0933 }
0934 }
0935
0936 static u32 netvsc_get_next_send_section(struct netvsc_device *net_device)
0937 {
0938 unsigned long *map_addr = net_device->send_section_map;
0939 unsigned int i;
0940
0941 for_each_clear_bit(i, map_addr, net_device->send_section_cnt) {
0942 if (sync_test_and_set_bit(i, map_addr) == 0)
0943 return i;
0944 }
0945
0946 return NETVSC_INVALID_INDEX;
0947 }
0948
0949 static void netvsc_copy_to_send_buf(struct netvsc_device *net_device,
0950 unsigned int section_index,
0951 u32 pend_size,
0952 struct hv_netvsc_packet *packet,
0953 struct rndis_message *rndis_msg,
0954 struct hv_page_buffer *pb,
0955 bool xmit_more)
0956 {
0957 char *start = net_device->send_buf;
0958 char *dest = start + (section_index * net_device->send_section_size)
0959 + pend_size;
0960 int i;
0961 u32 padding = 0;
0962 u32 page_count = packet->cp_partial ? packet->rmsg_pgcnt :
0963 packet->page_buf_cnt;
0964 u32 remain;
0965
0966
0967 remain = packet->total_data_buflen & (net_device->pkt_align - 1);
0968 if (xmit_more && remain) {
0969 padding = net_device->pkt_align - remain;
0970 rndis_msg->msg_len += padding;
0971 packet->total_data_buflen += padding;
0972 }
0973
0974 for (i = 0; i < page_count; i++) {
0975 char *src = phys_to_virt(pb[i].pfn << HV_HYP_PAGE_SHIFT);
0976 u32 offset = pb[i].offset;
0977 u32 len = pb[i].len;
0978
0979 memcpy(dest, (src + offset), len);
0980 dest += len;
0981 }
0982
0983 if (padding)
0984 memset(dest, 0, padding);
0985 }
0986
0987 void netvsc_dma_unmap(struct hv_device *hv_dev,
0988 struct hv_netvsc_packet *packet)
0989 {
0990 u32 page_count = packet->cp_partial ?
0991 packet->page_buf_cnt - packet->rmsg_pgcnt :
0992 packet->page_buf_cnt;
0993 int i;
0994
0995 if (!hv_is_isolation_supported())
0996 return;
0997
0998 if (!packet->dma_range)
0999 return;
1000
1001 for (i = 0; i < page_count; i++)
1002 dma_unmap_single(&hv_dev->device, packet->dma_range[i].dma,
1003 packet->dma_range[i].mapping_size,
1004 DMA_TO_DEVICE);
1005
1006 kfree(packet->dma_range);
1007 }
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027 static int netvsc_dma_map(struct hv_device *hv_dev,
1028 struct hv_netvsc_packet *packet,
1029 struct hv_page_buffer *pb)
1030 {
1031 u32 page_count = packet->cp_partial ?
1032 packet->page_buf_cnt - packet->rmsg_pgcnt :
1033 packet->page_buf_cnt;
1034 dma_addr_t dma;
1035 int i;
1036
1037 if (!hv_is_isolation_supported())
1038 return 0;
1039
1040 packet->dma_range = kcalloc(page_count,
1041 sizeof(*packet->dma_range),
1042 GFP_KERNEL);
1043 if (!packet->dma_range)
1044 return -ENOMEM;
1045
1046 for (i = 0; i < page_count; i++) {
1047 char *src = phys_to_virt((pb[i].pfn << HV_HYP_PAGE_SHIFT)
1048 + pb[i].offset);
1049 u32 len = pb[i].len;
1050
1051 dma = dma_map_single(&hv_dev->device, src, len,
1052 DMA_TO_DEVICE);
1053 if (dma_mapping_error(&hv_dev->device, dma)) {
1054 kfree(packet->dma_range);
1055 return -ENOMEM;
1056 }
1057
1058
1059
1060
1061 packet->dma_range[i].dma = dma;
1062 packet->dma_range[i].mapping_size = len;
1063 pb[i].pfn = dma >> HV_HYP_PAGE_SHIFT;
1064 }
1065
1066 return 0;
1067 }
1068
1069 static inline int netvsc_send_pkt(
1070 struct hv_device *device,
1071 struct hv_netvsc_packet *packet,
1072 struct netvsc_device *net_device,
1073 struct hv_page_buffer *pb,
1074 struct sk_buff *skb)
1075 {
1076 struct nvsp_message nvmsg;
1077 struct nvsp_1_message_send_rndis_packet *rpkt =
1078 &nvmsg.msg.v1_msg.send_rndis_pkt;
1079 struct netvsc_channel * const nvchan =
1080 &net_device->chan_table[packet->q_idx];
1081 struct vmbus_channel *out_channel = nvchan->channel;
1082 struct net_device *ndev = hv_get_drvdata(device);
1083 struct net_device_context *ndev_ctx = netdev_priv(ndev);
1084 struct netdev_queue *txq = netdev_get_tx_queue(ndev, packet->q_idx);
1085 u64 req_id;
1086 int ret;
1087 u32 ring_avail = hv_get_avail_to_write_percent(&out_channel->outbound);
1088
1089 memset(&nvmsg, 0, sizeof(struct nvsp_message));
1090 nvmsg.hdr.msg_type = NVSP_MSG1_TYPE_SEND_RNDIS_PKT;
1091 if (skb)
1092 rpkt->channel_type = 0;
1093 else
1094 rpkt->channel_type = 1;
1095
1096 rpkt->send_buf_section_index = packet->send_buf_index;
1097 if (packet->send_buf_index == NETVSC_INVALID_INDEX)
1098 rpkt->send_buf_section_size = 0;
1099 else
1100 rpkt->send_buf_section_size = packet->total_data_buflen;
1101
1102 req_id = (ulong)skb;
1103
1104 if (out_channel->rescind)
1105 return -ENODEV;
1106
1107 trace_nvsp_send_pkt(ndev, out_channel, rpkt);
1108
1109 packet->dma_range = NULL;
1110 if (packet->page_buf_cnt) {
1111 if (packet->cp_partial)
1112 pb += packet->rmsg_pgcnt;
1113
1114 ret = netvsc_dma_map(ndev_ctx->device_ctx, packet, pb);
1115 if (ret) {
1116 ret = -EAGAIN;
1117 goto exit;
1118 }
1119
1120 ret = vmbus_sendpacket_pagebuffer(out_channel,
1121 pb, packet->page_buf_cnt,
1122 &nvmsg, sizeof(nvmsg),
1123 req_id);
1124
1125 if (ret)
1126 netvsc_dma_unmap(ndev_ctx->device_ctx, packet);
1127 } else {
1128 ret = vmbus_sendpacket(out_channel,
1129 &nvmsg, sizeof(nvmsg),
1130 req_id, VM_PKT_DATA_INBAND,
1131 VMBUS_DATA_PACKET_FLAG_COMPLETION_REQUESTED);
1132 }
1133
1134 exit:
1135 if (ret == 0) {
1136 atomic_inc_return(&nvchan->queue_sends);
1137
1138 if (ring_avail < RING_AVAIL_PERCENT_LOWATER) {
1139 netif_tx_stop_queue(txq);
1140 ndev_ctx->eth_stats.stop_queue++;
1141 }
1142 } else if (ret == -EAGAIN) {
1143 netif_tx_stop_queue(txq);
1144 ndev_ctx->eth_stats.stop_queue++;
1145 } else {
1146 netdev_err(ndev,
1147 "Unable to send packet pages %u len %u, ret %d\n",
1148 packet->page_buf_cnt, packet->total_data_buflen,
1149 ret);
1150 }
1151
1152 if (netif_tx_queue_stopped(txq) &&
1153 atomic_read(&nvchan->queue_sends) < 1 &&
1154 !net_device->tx_disable) {
1155 netif_tx_wake_queue(txq);
1156 ndev_ctx->eth_stats.wake_queue++;
1157 if (ret == -EAGAIN)
1158 ret = -ENOSPC;
1159 }
1160
1161 return ret;
1162 }
1163
1164
1165 static inline void move_pkt_msd(struct hv_netvsc_packet **msd_send,
1166 struct sk_buff **msd_skb,
1167 struct multi_send_data *msdp)
1168 {
1169 *msd_skb = msdp->skb;
1170 *msd_send = msdp->pkt;
1171 msdp->skb = NULL;
1172 msdp->pkt = NULL;
1173 msdp->count = 0;
1174 }
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197 int netvsc_send(struct net_device *ndev,
1198 struct hv_netvsc_packet *packet,
1199 struct rndis_message *rndis_msg,
1200 struct hv_page_buffer *pb,
1201 struct sk_buff *skb,
1202 bool xdp_tx)
1203 {
1204 struct net_device_context *ndev_ctx = netdev_priv(ndev);
1205 struct netvsc_device *net_device
1206 = rcu_dereference_bh(ndev_ctx->nvdev);
1207 struct hv_device *device = ndev_ctx->device_ctx;
1208 int ret = 0;
1209 struct netvsc_channel *nvchan;
1210 u32 pktlen = packet->total_data_buflen, msd_len = 0;
1211 unsigned int section_index = NETVSC_INVALID_INDEX;
1212 struct multi_send_data *msdp;
1213 struct hv_netvsc_packet *msd_send = NULL, *cur_send = NULL;
1214 struct sk_buff *msd_skb = NULL;
1215 bool try_batch, xmit_more;
1216
1217
1218 if (unlikely(!net_device || net_device->destroy))
1219 return -ENODEV;
1220
1221 nvchan = &net_device->chan_table[packet->q_idx];
1222 packet->send_buf_index = NETVSC_INVALID_INDEX;
1223 packet->cp_partial = false;
1224
1225
1226
1227
1228
1229 if (!skb || xdp_tx)
1230 return netvsc_send_pkt(device, packet, net_device, pb, skb);
1231
1232
1233 msdp = &nvchan->msd;
1234 if (msdp->pkt)
1235 msd_len = msdp->pkt->total_data_buflen;
1236
1237 try_batch = msd_len > 0 && msdp->count < net_device->max_pkt;
1238 if (try_batch && msd_len + pktlen + net_device->pkt_align <
1239 net_device->send_section_size) {
1240 section_index = msdp->pkt->send_buf_index;
1241
1242 } else if (try_batch && msd_len + packet->rmsg_size <
1243 net_device->send_section_size) {
1244 section_index = msdp->pkt->send_buf_index;
1245 packet->cp_partial = true;
1246
1247 } else if (pktlen + net_device->pkt_align <
1248 net_device->send_section_size) {
1249 section_index = netvsc_get_next_send_section(net_device);
1250 if (unlikely(section_index == NETVSC_INVALID_INDEX)) {
1251 ++ndev_ctx->eth_stats.tx_send_full;
1252 } else {
1253 move_pkt_msd(&msd_send, &msd_skb, msdp);
1254 msd_len = 0;
1255 }
1256 }
1257
1258
1259
1260
1261 xmit_more = netdev_xmit_more() &&
1262 !packet->cp_partial &&
1263 !netif_xmit_stopped(netdev_get_tx_queue(ndev, packet->q_idx));
1264
1265 if (section_index != NETVSC_INVALID_INDEX) {
1266 netvsc_copy_to_send_buf(net_device,
1267 section_index, msd_len,
1268 packet, rndis_msg, pb, xmit_more);
1269
1270 packet->send_buf_index = section_index;
1271
1272 if (packet->cp_partial) {
1273 packet->page_buf_cnt -= packet->rmsg_pgcnt;
1274 packet->total_data_buflen = msd_len + packet->rmsg_size;
1275 } else {
1276 packet->page_buf_cnt = 0;
1277 packet->total_data_buflen += msd_len;
1278 }
1279
1280 if (msdp->pkt) {
1281 packet->total_packets += msdp->pkt->total_packets;
1282 packet->total_bytes += msdp->pkt->total_bytes;
1283 }
1284
1285 if (msdp->skb)
1286 dev_consume_skb_any(msdp->skb);
1287
1288 if (xmit_more) {
1289 msdp->skb = skb;
1290 msdp->pkt = packet;
1291 msdp->count++;
1292 } else {
1293 cur_send = packet;
1294 msdp->skb = NULL;
1295 msdp->pkt = NULL;
1296 msdp->count = 0;
1297 }
1298 } else {
1299 move_pkt_msd(&msd_send, &msd_skb, msdp);
1300 cur_send = packet;
1301 }
1302
1303 if (msd_send) {
1304 int m_ret = netvsc_send_pkt(device, msd_send, net_device,
1305 NULL, msd_skb);
1306
1307 if (m_ret != 0) {
1308 netvsc_free_send_slot(net_device,
1309 msd_send->send_buf_index);
1310 dev_kfree_skb_any(msd_skb);
1311 }
1312 }
1313
1314 if (cur_send)
1315 ret = netvsc_send_pkt(device, cur_send, net_device, pb, skb);
1316
1317 if (ret != 0 && section_index != NETVSC_INVALID_INDEX)
1318 netvsc_free_send_slot(net_device, section_index);
1319
1320 return ret;
1321 }
1322
1323
1324 static int send_recv_completions(struct net_device *ndev,
1325 struct netvsc_device *nvdev,
1326 struct netvsc_channel *nvchan)
1327 {
1328 struct multi_recv_comp *mrc = &nvchan->mrc;
1329 struct recv_comp_msg {
1330 struct nvsp_message_header hdr;
1331 u32 status;
1332 } __packed;
1333 struct recv_comp_msg msg = {
1334 .hdr.msg_type = NVSP_MSG1_TYPE_SEND_RNDIS_PKT_COMPLETE,
1335 };
1336 int ret;
1337
1338 while (mrc->first != mrc->next) {
1339 const struct recv_comp_data *rcd
1340 = mrc->slots + mrc->first;
1341
1342 msg.status = rcd->status;
1343 ret = vmbus_sendpacket(nvchan->channel, &msg, sizeof(msg),
1344 rcd->tid, VM_PKT_COMP, 0);
1345 if (unlikely(ret)) {
1346 struct net_device_context *ndev_ctx = netdev_priv(ndev);
1347
1348 ++ndev_ctx->eth_stats.rx_comp_busy;
1349 return ret;
1350 }
1351
1352 if (++mrc->first == nvdev->recv_completion_cnt)
1353 mrc->first = 0;
1354 }
1355
1356
1357 if (unlikely(nvdev->destroy))
1358 wake_up(&nvdev->wait_drain);
1359
1360 return 0;
1361 }
1362
1363
1364 static void recv_comp_slot_avail(const struct netvsc_device *nvdev,
1365 const struct multi_recv_comp *mrc,
1366 u32 *filled, u32 *avail)
1367 {
1368 u32 count = nvdev->recv_completion_cnt;
1369
1370 if (mrc->next >= mrc->first)
1371 *filled = mrc->next - mrc->first;
1372 else
1373 *filled = (count - mrc->first) + mrc->next;
1374
1375 *avail = count - *filled - 1;
1376 }
1377
1378
1379 static void enq_receive_complete(struct net_device *ndev,
1380 struct netvsc_device *nvdev, u16 q_idx,
1381 u64 tid, u32 status)
1382 {
1383 struct netvsc_channel *nvchan = &nvdev->chan_table[q_idx];
1384 struct multi_recv_comp *mrc = &nvchan->mrc;
1385 struct recv_comp_data *rcd;
1386 u32 filled, avail;
1387
1388 recv_comp_slot_avail(nvdev, mrc, &filled, &avail);
1389
1390 if (unlikely(filled > NAPI_POLL_WEIGHT)) {
1391 send_recv_completions(ndev, nvdev, nvchan);
1392 recv_comp_slot_avail(nvdev, mrc, &filled, &avail);
1393 }
1394
1395 if (unlikely(!avail)) {
1396 netdev_err(ndev, "Recv_comp full buf q:%hd, tid:%llx\n",
1397 q_idx, tid);
1398 return;
1399 }
1400
1401 rcd = mrc->slots + mrc->next;
1402 rcd->tid = tid;
1403 rcd->status = status;
1404
1405 if (++mrc->next == nvdev->recv_completion_cnt)
1406 mrc->next = 0;
1407 }
1408
1409 static int netvsc_receive(struct net_device *ndev,
1410 struct netvsc_device *net_device,
1411 struct netvsc_channel *nvchan,
1412 const struct vmpacket_descriptor *desc)
1413 {
1414 struct net_device_context *net_device_ctx = netdev_priv(ndev);
1415 struct vmbus_channel *channel = nvchan->channel;
1416 const struct vmtransfer_page_packet_header *vmxferpage_packet
1417 = container_of(desc, const struct vmtransfer_page_packet_header, d);
1418 const struct nvsp_message *nvsp = hv_pkt_data(desc);
1419 u32 msglen = hv_pkt_datalen(desc);
1420 u16 q_idx = channel->offermsg.offer.sub_channel_index;
1421 char *recv_buf = net_device->recv_buf;
1422 u32 status = NVSP_STAT_SUCCESS;
1423 int i;
1424 int count = 0;
1425
1426
1427 if (msglen < sizeof(struct nvsp_message_header)) {
1428 netif_err(net_device_ctx, rx_err, ndev,
1429 "invalid nvsp header, length too small: %u\n",
1430 msglen);
1431 return 0;
1432 }
1433
1434
1435 if (unlikely(nvsp->hdr.msg_type != NVSP_MSG1_TYPE_SEND_RNDIS_PKT)) {
1436 netif_err(net_device_ctx, rx_err, ndev,
1437 "Unknown nvsp packet type received %u\n",
1438 nvsp->hdr.msg_type);
1439 return 0;
1440 }
1441
1442
1443 if ((desc->offset8 << 3) < sizeof(struct vmtransfer_page_packet_header)) {
1444 netif_err(net_device_ctx, rx_err, ndev,
1445 "Invalid xfer page pkt, offset too small: %u\n",
1446 desc->offset8 << 3);
1447 return 0;
1448 }
1449
1450 if (unlikely(vmxferpage_packet->xfer_pageset_id != NETVSC_RECEIVE_BUFFER_ID)) {
1451 netif_err(net_device_ctx, rx_err, ndev,
1452 "Invalid xfer page set id - expecting %x got %x\n",
1453 NETVSC_RECEIVE_BUFFER_ID,
1454 vmxferpage_packet->xfer_pageset_id);
1455 return 0;
1456 }
1457
1458 count = vmxferpage_packet->range_cnt;
1459
1460
1461 if (NETVSC_XFER_HEADER_SIZE(count) > desc->offset8 << 3) {
1462 netif_err(net_device_ctx, rx_err, ndev,
1463 "Range count is not valid: %d\n",
1464 count);
1465 return 0;
1466 }
1467
1468
1469 for (i = 0; i < count; i++) {
1470 u32 offset = vmxferpage_packet->ranges[i].byte_offset;
1471 u32 buflen = vmxferpage_packet->ranges[i].byte_count;
1472 void *data;
1473 int ret;
1474
1475 if (unlikely(offset > net_device->recv_buf_size ||
1476 buflen > net_device->recv_buf_size - offset)) {
1477 nvchan->rsc.cnt = 0;
1478 status = NVSP_STAT_FAIL;
1479 netif_err(net_device_ctx, rx_err, ndev,
1480 "Packet offset:%u + len:%u too big\n",
1481 offset, buflen);
1482
1483 continue;
1484 }
1485
1486
1487
1488
1489 if (unlikely(buflen > net_device->recv_section_size)) {
1490 nvchan->rsc.cnt = 0;
1491 status = NVSP_STAT_FAIL;
1492 netif_err(net_device_ctx, rx_err, ndev,
1493 "Packet too big: buflen=%u recv_section_size=%u\n",
1494 buflen, net_device->recv_section_size);
1495
1496 continue;
1497 }
1498
1499 data = recv_buf + offset;
1500
1501 nvchan->rsc.is_last = (i == count - 1);
1502
1503 trace_rndis_recv(ndev, q_idx, data);
1504
1505
1506 ret = rndis_filter_receive(ndev, net_device,
1507 nvchan, data, buflen);
1508
1509 if (unlikely(ret != NVSP_STAT_SUCCESS)) {
1510
1511 nvchan->rsc.cnt = 0;
1512 status = NVSP_STAT_FAIL;
1513 }
1514 }
1515
1516 enq_receive_complete(ndev, net_device, q_idx,
1517 vmxferpage_packet->d.trans_id, status);
1518
1519 return count;
1520 }
1521
1522 static void netvsc_send_table(struct net_device *ndev,
1523 struct netvsc_device *nvscdev,
1524 const struct nvsp_message *nvmsg,
1525 u32 msglen)
1526 {
1527 struct net_device_context *net_device_ctx = netdev_priv(ndev);
1528 u32 count, offset, *tab;
1529 int i;
1530
1531
1532 if (msglen < sizeof(struct nvsp_message_header) +
1533 sizeof(struct nvsp_5_send_indirect_table)) {
1534 netdev_err(ndev, "nvsp_v5_msg length too small: %u\n", msglen);
1535 return;
1536 }
1537
1538 count = nvmsg->msg.v5_msg.send_table.count;
1539 offset = nvmsg->msg.v5_msg.send_table.offset;
1540
1541 if (count != VRSS_SEND_TAB_SIZE) {
1542 netdev_err(ndev, "Received wrong send-table size:%u\n", count);
1543 return;
1544 }
1545
1546
1547
1548
1549 if (nvscdev->nvsp_version <= NVSP_PROTOCOL_VERSION_6 &&
1550 msglen >= sizeof(struct nvsp_message_header) +
1551 sizeof(union nvsp_6_message_uber) + count * sizeof(u32))
1552 offset = sizeof(struct nvsp_message_header) +
1553 sizeof(union nvsp_6_message_uber);
1554
1555
1556 if (msglen < count * sizeof(u32) || offset > msglen - count * sizeof(u32)) {
1557 netdev_err(ndev, "Received send-table offset too big:%u\n",
1558 offset);
1559 return;
1560 }
1561
1562 tab = (void *)nvmsg + offset;
1563
1564 for (i = 0; i < count; i++)
1565 net_device_ctx->tx_table[i] = tab[i];
1566 }
1567
1568 static void netvsc_send_vf(struct net_device *ndev,
1569 const struct nvsp_message *nvmsg,
1570 u32 msglen)
1571 {
1572 struct net_device_context *net_device_ctx = netdev_priv(ndev);
1573
1574
1575 if (msglen < sizeof(struct nvsp_message_header) +
1576 sizeof(struct nvsp_4_send_vf_association)) {
1577 netdev_err(ndev, "nvsp_v4_msg length too small: %u\n", msglen);
1578 return;
1579 }
1580
1581 net_device_ctx->vf_alloc = nvmsg->msg.v4_msg.vf_assoc.allocated;
1582 net_device_ctx->vf_serial = nvmsg->msg.v4_msg.vf_assoc.serial;
1583 netdev_info(ndev, "VF slot %u %s\n",
1584 net_device_ctx->vf_serial,
1585 net_device_ctx->vf_alloc ? "added" : "removed");
1586 }
1587
1588 static void netvsc_receive_inband(struct net_device *ndev,
1589 struct netvsc_device *nvscdev,
1590 const struct vmpacket_descriptor *desc)
1591 {
1592 const struct nvsp_message *nvmsg = hv_pkt_data(desc);
1593 u32 msglen = hv_pkt_datalen(desc);
1594
1595
1596 if (msglen < sizeof(struct nvsp_message_header)) {
1597 netdev_err(ndev, "inband nvsp_message length too small: %u\n", msglen);
1598 return;
1599 }
1600
1601 switch (nvmsg->hdr.msg_type) {
1602 case NVSP_MSG5_TYPE_SEND_INDIRECTION_TABLE:
1603 netvsc_send_table(ndev, nvscdev, nvmsg, msglen);
1604 break;
1605
1606 case NVSP_MSG4_TYPE_SEND_VF_ASSOCIATION:
1607 if (hv_is_isolation_supported())
1608 netdev_err(ndev, "Ignore VF_ASSOCIATION msg from the host supporting isolation\n");
1609 else
1610 netvsc_send_vf(ndev, nvmsg, msglen);
1611 break;
1612 }
1613 }
1614
1615 static int netvsc_process_raw_pkt(struct hv_device *device,
1616 struct netvsc_channel *nvchan,
1617 struct netvsc_device *net_device,
1618 struct net_device *ndev,
1619 const struct vmpacket_descriptor *desc,
1620 int budget)
1621 {
1622 struct vmbus_channel *channel = nvchan->channel;
1623 const struct nvsp_message *nvmsg = hv_pkt_data(desc);
1624
1625 trace_nvsp_recv(ndev, channel, nvmsg);
1626
1627 switch (desc->type) {
1628 case VM_PKT_COMP:
1629 netvsc_send_completion(ndev, net_device, channel, desc, budget);
1630 break;
1631
1632 case VM_PKT_DATA_USING_XFER_PAGES:
1633 return netvsc_receive(ndev, net_device, nvchan, desc);
1634
1635 case VM_PKT_DATA_INBAND:
1636 netvsc_receive_inband(ndev, net_device, desc);
1637 break;
1638
1639 default:
1640 netdev_err(ndev, "unhandled packet type %d, tid %llx\n",
1641 desc->type, desc->trans_id);
1642 break;
1643 }
1644
1645 return 0;
1646 }
1647
1648 static struct hv_device *netvsc_channel_to_device(struct vmbus_channel *channel)
1649 {
1650 struct vmbus_channel *primary = channel->primary_channel;
1651
1652 return primary ? primary->device_obj : channel->device_obj;
1653 }
1654
1655
1656
1657
1658
1659 int netvsc_poll(struct napi_struct *napi, int budget)
1660 {
1661 struct netvsc_channel *nvchan
1662 = container_of(napi, struct netvsc_channel, napi);
1663 struct netvsc_device *net_device = nvchan->net_device;
1664 struct vmbus_channel *channel = nvchan->channel;
1665 struct hv_device *device = netvsc_channel_to_device(channel);
1666 struct net_device *ndev = hv_get_drvdata(device);
1667 int work_done = 0;
1668 int ret;
1669
1670
1671 if (!nvchan->desc)
1672 nvchan->desc = hv_pkt_iter_first(channel);
1673
1674 nvchan->xdp_flush = false;
1675
1676 while (nvchan->desc && work_done < budget) {
1677 work_done += netvsc_process_raw_pkt(device, nvchan, net_device,
1678 ndev, nvchan->desc, budget);
1679 nvchan->desc = hv_pkt_iter_next(channel, nvchan->desc);
1680 }
1681
1682 if (nvchan->xdp_flush)
1683 xdp_do_flush();
1684
1685
1686 ret = send_recv_completions(ndev, net_device, nvchan);
1687
1688
1689
1690
1691
1692
1693
1694 if (work_done < budget &&
1695 napi_complete_done(napi, work_done) &&
1696 (ret || hv_end_read(&channel->inbound)) &&
1697 napi_schedule_prep(napi)) {
1698 hv_begin_read(&channel->inbound);
1699 __napi_schedule(napi);
1700 }
1701
1702
1703 return min(work_done, budget);
1704 }
1705
1706
1707
1708
1709 void netvsc_channel_cb(void *context)
1710 {
1711 struct netvsc_channel *nvchan = context;
1712 struct vmbus_channel *channel = nvchan->channel;
1713 struct hv_ring_buffer_info *rbi = &channel->inbound;
1714
1715
1716 prefetch(hv_get_ring_buffer(rbi) + rbi->priv_read_index);
1717
1718 if (napi_schedule_prep(&nvchan->napi)) {
1719
1720 hv_begin_read(rbi);
1721
1722 __napi_schedule_irqoff(&nvchan->napi);
1723 }
1724 }
1725
1726
1727
1728
1729
1730 struct netvsc_device *netvsc_device_add(struct hv_device *device,
1731 const struct netvsc_device_info *device_info)
1732 {
1733 int i, ret = 0;
1734 struct netvsc_device *net_device;
1735 struct net_device *ndev = hv_get_drvdata(device);
1736 struct net_device_context *net_device_ctx = netdev_priv(ndev);
1737
1738 net_device = alloc_net_device();
1739 if (!net_device)
1740 return ERR_PTR(-ENOMEM);
1741
1742 for (i = 0; i < VRSS_SEND_TAB_SIZE; i++)
1743 net_device_ctx->tx_table[i] = 0;
1744
1745
1746
1747
1748 set_channel_read_mode(device->channel, HV_CALL_ISR);
1749
1750
1751
1752
1753
1754
1755
1756
1757 for (i = 0; i < VRSS_CHANNEL_MAX; i++) {
1758 struct netvsc_channel *nvchan = &net_device->chan_table[i];
1759
1760 nvchan->channel = device->channel;
1761 nvchan->net_device = net_device;
1762 u64_stats_init(&nvchan->tx_stats.syncp);
1763 u64_stats_init(&nvchan->rx_stats.syncp);
1764
1765 ret = xdp_rxq_info_reg(&nvchan->xdp_rxq, ndev, i, 0);
1766
1767 if (ret) {
1768 netdev_err(ndev, "xdp_rxq_info_reg fail: %d\n", ret);
1769 goto cleanup2;
1770 }
1771
1772 ret = xdp_rxq_info_reg_mem_model(&nvchan->xdp_rxq,
1773 MEM_TYPE_PAGE_SHARED, NULL);
1774
1775 if (ret) {
1776 netdev_err(ndev, "xdp reg_mem_model fail: %d\n", ret);
1777 goto cleanup2;
1778 }
1779 }
1780
1781
1782 netif_napi_add(ndev, &net_device->chan_table[0].napi,
1783 netvsc_poll, NAPI_POLL_WEIGHT);
1784
1785
1786 device->channel->next_request_id_callback = vmbus_next_request_id;
1787 device->channel->request_addr_callback = vmbus_request_addr;
1788 device->channel->rqstor_size = netvsc_rqstor_size(netvsc_ring_bytes);
1789 device->channel->max_pkt_size = NETVSC_MAX_PKT_SIZE;
1790
1791 ret = vmbus_open(device->channel, netvsc_ring_bytes,
1792 netvsc_ring_bytes, NULL, 0,
1793 netvsc_channel_cb, net_device->chan_table);
1794
1795 if (ret != 0) {
1796 netdev_err(ndev, "unable to open channel: %d\n", ret);
1797 goto cleanup;
1798 }
1799
1800
1801 netdev_dbg(ndev, "hv_netvsc channel opened successfully\n");
1802
1803 napi_enable(&net_device->chan_table[0].napi);
1804
1805
1806 ret = netvsc_connect_vsp(device, net_device, device_info);
1807 if (ret != 0) {
1808 netdev_err(ndev,
1809 "unable to connect to NetVSP - %d\n", ret);
1810 goto close;
1811 }
1812
1813
1814
1815
1816 rcu_assign_pointer(net_device_ctx->nvdev, net_device);
1817
1818 return net_device;
1819
1820 close:
1821 RCU_INIT_POINTER(net_device_ctx->nvdev, NULL);
1822 napi_disable(&net_device->chan_table[0].napi);
1823
1824
1825 vmbus_close(device->channel);
1826
1827 cleanup:
1828 netif_napi_del(&net_device->chan_table[0].napi);
1829
1830 cleanup2:
1831 if (net_device->recv_original_buf)
1832 hv_unmap_memory(net_device->recv_buf);
1833
1834 if (net_device->send_original_buf)
1835 hv_unmap_memory(net_device->send_buf);
1836
1837 free_netvsc_device(&net_device->rcu);
1838
1839 return ERR_PTR(ret);
1840 }