linux/drivers/net/hyperv/netvsc.c
<<
>>
Prefs
   1/*
   2 * Copyright (c) 2009, Microsoft Corporation.
   3 *
   4 * This program is free software; you can redistribute it and/or modify it
   5 * under the terms and conditions of the GNU General Public License,
   6 * version 2, as published by the Free Software Foundation.
   7 *
   8 * This program is distributed in the hope it will be useful, but WITHOUT
   9 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  10 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
  11 * more details.
  12 *
  13 * You should have received a copy of the GNU General Public License along with
  14 * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
  15 * Place - Suite 330, Boston, MA 02111-1307 USA.
  16 *
  17 * Authors:
  18 *   Haiyang Zhang <haiyangz@microsoft.com>
  19 *   Hank Janssen  <hjanssen@microsoft.com>
  20 */
  21#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
  22
  23#include <linux/kernel.h>
  24#include <linux/sched.h>
  25#include <linux/wait.h>
  26#include <linux/mm.h>
  27#include <linux/delay.h>
  28#include <linux/io.h>
  29#include <linux/slab.h>
  30#include <linux/netdevice.h>
  31#include <linux/if_ether.h>
  32
  33#include "hyperv_net.h"
  34
  35
  36static struct netvsc_device *alloc_net_device(struct hv_device *device)
  37{
  38        struct netvsc_device *net_device;
  39        struct net_device *ndev = hv_get_drvdata(device);
  40
  41        net_device = kzalloc(sizeof(struct netvsc_device), GFP_KERNEL);
  42        if (!net_device)
  43                return NULL;
  44
  45        init_waitqueue_head(&net_device->wait_drain);
  46        net_device->start_remove = false;
  47        net_device->destroy = false;
  48        net_device->dev = device;
  49        net_device->ndev = ndev;
  50
  51        hv_set_drvdata(device, net_device);
  52        return net_device;
  53}
  54
  55static struct netvsc_device *get_outbound_net_device(struct hv_device *device)
  56{
  57        struct netvsc_device *net_device;
  58
  59        net_device = hv_get_drvdata(device);
  60        if (net_device && net_device->destroy)
  61                net_device = NULL;
  62
  63        return net_device;
  64}
  65
  66static struct netvsc_device *get_inbound_net_device(struct hv_device *device)
  67{
  68        struct netvsc_device *net_device;
  69
  70        net_device = hv_get_drvdata(device);
  71
  72        if (!net_device)
  73                goto get_in_err;
  74
  75        if (net_device->destroy &&
  76                atomic_read(&net_device->num_outstanding_sends) == 0)
  77                net_device = NULL;
  78
  79get_in_err:
  80        return net_device;
  81}
  82
  83
  84static int netvsc_destroy_recv_buf(struct netvsc_device *net_device)
  85{
  86        struct nvsp_message *revoke_packet;
  87        int ret = 0;
  88        struct net_device *ndev = net_device->ndev;
  89
  90        /*
  91         * If we got a section count, it means we received a
  92         * SendReceiveBufferComplete msg (ie sent
  93         * NvspMessage1TypeSendReceiveBuffer msg) therefore, we need
  94         * to send a revoke msg here
  95         */
  96        if (net_device->recv_section_cnt) {
  97                /* Send the revoke receive buffer */
  98                revoke_packet = &net_device->revoke_packet;
  99                memset(revoke_packet, 0, sizeof(struct nvsp_message));
 100
 101                revoke_packet->hdr.msg_type =
 102                        NVSP_MSG1_TYPE_REVOKE_RECV_BUF;
 103                revoke_packet->msg.v1_msg.
 104                revoke_recv_buf.id = NETVSC_RECEIVE_BUFFER_ID;
 105
 106                ret = vmbus_sendpacket(net_device->dev->channel,
 107                                       revoke_packet,
 108                                       sizeof(struct nvsp_message),
 109                                       (unsigned long)revoke_packet,
 110                                       VM_PKT_DATA_INBAND, 0);
 111                /*
 112                 * If we failed here, we might as well return and
 113                 * have a leak rather than continue and a bugchk
 114                 */
 115                if (ret != 0) {
 116                        netdev_err(ndev, "unable to send "
 117                                "revoke receive buffer to netvsp\n");
 118                        return ret;
 119                }
 120        }
 121
 122        /* Teardown the gpadl on the vsp end */
 123        if (net_device->recv_buf_gpadl_handle) {
 124                ret = vmbus_teardown_gpadl(net_device->dev->channel,
 125                           net_device->recv_buf_gpadl_handle);
 126
 127                /* If we failed here, we might as well return and have a leak
 128                 * rather than continue and a bugchk
 129                 */
 130                if (ret != 0) {
 131                        netdev_err(ndev,
 132                                   "unable to teardown receive buffer's gpadl\n");
 133                        return ret;
 134                }
 135                net_device->recv_buf_gpadl_handle = 0;
 136        }
 137
 138        if (net_device->recv_buf) {
 139                /* Free up the receive buffer */
 140                free_pages((unsigned long)net_device->recv_buf,
 141                        get_order(net_device->recv_buf_size));
 142                net_device->recv_buf = NULL;
 143        }
 144
 145        if (net_device->recv_section) {
 146                net_device->recv_section_cnt = 0;
 147                kfree(net_device->recv_section);
 148                net_device->recv_section = NULL;
 149        }
 150
 151        return ret;
 152}
 153
 154static int netvsc_init_recv_buf(struct hv_device *device)
 155{
 156        int ret = 0;
 157        int t;
 158        struct netvsc_device *net_device;
 159        struct nvsp_message *init_packet;
 160        struct net_device *ndev;
 161
 162        net_device = get_outbound_net_device(device);
 163        if (!net_device)
 164                return -ENODEV;
 165        ndev = net_device->ndev;
 166
 167        net_device->recv_buf =
 168                (void *)__get_free_pages(GFP_KERNEL|__GFP_ZERO,
 169                                get_order(net_device->recv_buf_size));
 170        if (!net_device->recv_buf) {
 171                netdev_err(ndev, "unable to allocate receive "
 172                        "buffer of size %d\n", net_device->recv_buf_size);
 173                ret = -ENOMEM;
 174                goto cleanup;
 175        }
 176
 177        /*
 178         * Establish the gpadl handle for this buffer on this
 179         * channel.  Note: This call uses the vmbus connection rather
 180         * than the channel to establish the gpadl handle.
 181         */
 182        ret = vmbus_establish_gpadl(device->channel, net_device->recv_buf,
 183                                    net_device->recv_buf_size,
 184                                    &net_device->recv_buf_gpadl_handle);
 185        if (ret != 0) {
 186                netdev_err(ndev,
 187                        "unable to establish receive buffer's gpadl\n");
 188                goto cleanup;
 189        }
 190
 191
 192        /* Notify the NetVsp of the gpadl handle */
 193        init_packet = &net_device->channel_init_pkt;
 194
 195        memset(init_packet, 0, sizeof(struct nvsp_message));
 196
 197        init_packet->hdr.msg_type = NVSP_MSG1_TYPE_SEND_RECV_BUF;
 198        init_packet->msg.v1_msg.send_recv_buf.
 199                gpadl_handle = net_device->recv_buf_gpadl_handle;
 200        init_packet->msg.v1_msg.
 201                send_recv_buf.id = NETVSC_RECEIVE_BUFFER_ID;
 202
 203        /* Send the gpadl notification request */
 204        ret = vmbus_sendpacket(device->channel, init_packet,
 205                               sizeof(struct nvsp_message),
 206                               (unsigned long)init_packet,
 207                               VM_PKT_DATA_INBAND,
 208                               VMBUS_DATA_PACKET_FLAG_COMPLETION_REQUESTED);
 209        if (ret != 0) {
 210                netdev_err(ndev,
 211                        "unable to send receive buffer's gpadl to netvsp\n");
 212                goto cleanup;
 213        }
 214
 215        t = wait_for_completion_timeout(&net_device->channel_init_wait, 5*HZ);
 216        BUG_ON(t == 0);
 217
 218
 219        /* Check the response */
 220        if (init_packet->msg.v1_msg.
 221            send_recv_buf_complete.status != NVSP_STAT_SUCCESS) {
 222                netdev_err(ndev, "Unable to complete receive buffer "
 223                           "initialization with NetVsp - status %d\n",
 224                           init_packet->msg.v1_msg.
 225                           send_recv_buf_complete.status);
 226                ret = -EINVAL;
 227                goto cleanup;
 228        }
 229
 230        /* Parse the response */
 231
 232        net_device->recv_section_cnt = init_packet->msg.
 233                v1_msg.send_recv_buf_complete.num_sections;
 234
 235        net_device->recv_section = kmemdup(
 236                init_packet->msg.v1_msg.send_recv_buf_complete.sections,
 237                net_device->recv_section_cnt *
 238                sizeof(struct nvsp_1_receive_buffer_section),
 239                GFP_KERNEL);
 240        if (net_device->recv_section == NULL) {
 241                ret = -EINVAL;
 242                goto cleanup;
 243        }
 244
 245        /*
 246         * For 1st release, there should only be 1 section that represents the
 247         * entire receive buffer
 248         */
 249        if (net_device->recv_section_cnt != 1 ||
 250            net_device->recv_section->offset != 0) {
 251                ret = -EINVAL;
 252                goto cleanup;
 253        }
 254
 255        goto exit;
 256
 257cleanup:
 258        netvsc_destroy_recv_buf(net_device);
 259
 260exit:
 261        return ret;
 262}
 263
 264
 265/* Negotiate NVSP protocol version */
 266static int negotiate_nvsp_ver(struct hv_device *device,
 267                              struct netvsc_device *net_device,
 268                              struct nvsp_message *init_packet,
 269                              u32 nvsp_ver)
 270{
 271        int ret, t;
 272
 273        memset(init_packet, 0, sizeof(struct nvsp_message));
 274        init_packet->hdr.msg_type = NVSP_MSG_TYPE_INIT;
 275        init_packet->msg.init_msg.init.min_protocol_ver = nvsp_ver;
 276        init_packet->msg.init_msg.init.max_protocol_ver = nvsp_ver;
 277
 278        /* Send the init request */
 279        ret = vmbus_sendpacket(device->channel, init_packet,
 280                               sizeof(struct nvsp_message),
 281                               (unsigned long)init_packet,
 282                               VM_PKT_DATA_INBAND,
 283                               VMBUS_DATA_PACKET_FLAG_COMPLETION_REQUESTED);
 284
 285        if (ret != 0)
 286                return ret;
 287
 288        t = wait_for_completion_timeout(&net_device->channel_init_wait, 5*HZ);
 289
 290        if (t == 0)
 291                return -ETIMEDOUT;
 292
 293        if (init_packet->msg.init_msg.init_complete.status !=
 294            NVSP_STAT_SUCCESS)
 295                return -EINVAL;
 296
 297        if (nvsp_ver != NVSP_PROTOCOL_VERSION_2)
 298                return 0;
 299
 300        /* NVSPv2 only: Send NDIS config */
 301        memset(init_packet, 0, sizeof(struct nvsp_message));
 302        init_packet->hdr.msg_type = NVSP_MSG2_TYPE_SEND_NDIS_CONFIG;
 303        init_packet->msg.v2_msg.send_ndis_config.mtu = net_device->ndev->mtu;
 304        init_packet->msg.v2_msg.send_ndis_config.capability.ieee8021q = 1;
 305
 306        ret = vmbus_sendpacket(device->channel, init_packet,
 307                                sizeof(struct nvsp_message),
 308                                (unsigned long)init_packet,
 309                                VM_PKT_DATA_INBAND, 0);
 310
 311        return ret;
 312}
 313
 314static int netvsc_connect_vsp(struct hv_device *device)
 315{
 316        int ret;
 317        struct netvsc_device *net_device;
 318        struct nvsp_message *init_packet;
 319        int ndis_version;
 320        struct net_device *ndev;
 321
 322        net_device = get_outbound_net_device(device);
 323        if (!net_device)
 324                return -ENODEV;
 325        ndev = net_device->ndev;
 326
 327        init_packet = &net_device->channel_init_pkt;
 328
 329        /* Negotiate the latest NVSP protocol supported */
 330        if (negotiate_nvsp_ver(device, net_device, init_packet,
 331                               NVSP_PROTOCOL_VERSION_2) == 0) {
 332                net_device->nvsp_version = NVSP_PROTOCOL_VERSION_2;
 333        } else if (negotiate_nvsp_ver(device, net_device, init_packet,
 334                                    NVSP_PROTOCOL_VERSION_1) == 0) {
 335                net_device->nvsp_version = NVSP_PROTOCOL_VERSION_1;
 336        } else {
 337                ret = -EPROTO;
 338                goto cleanup;
 339        }
 340
 341        pr_debug("Negotiated NVSP version:%x\n", net_device->nvsp_version);
 342
 343        /* Send the ndis version */
 344        memset(init_packet, 0, sizeof(struct nvsp_message));
 345
 346        ndis_version = 0x00050001;
 347
 348        init_packet->hdr.msg_type = NVSP_MSG1_TYPE_SEND_NDIS_VER;
 349        init_packet->msg.v1_msg.
 350                send_ndis_ver.ndis_major_ver =
 351                                (ndis_version & 0xFFFF0000) >> 16;
 352        init_packet->msg.v1_msg.
 353                send_ndis_ver.ndis_minor_ver =
 354                                ndis_version & 0xFFFF;
 355
 356        /* Send the init request */
 357        ret = vmbus_sendpacket(device->channel, init_packet,
 358                                sizeof(struct nvsp_message),
 359                                (unsigned long)init_packet,
 360                                VM_PKT_DATA_INBAND, 0);
 361        if (ret != 0)
 362                goto cleanup;
 363
 364        /* Post the big receive buffer to NetVSP */
 365        ret = netvsc_init_recv_buf(device);
 366
 367cleanup:
 368        return ret;
 369}
 370
 371static void netvsc_disconnect_vsp(struct netvsc_device *net_device)
 372{
 373        netvsc_destroy_recv_buf(net_device);
 374}
 375
 376/*
 377 * netvsc_device_remove - Callback when the root bus device is removed
 378 */
 379int netvsc_device_remove(struct hv_device *device)
 380{
 381        struct netvsc_device *net_device;
 382        struct hv_netvsc_packet *netvsc_packet, *pos;
 383        unsigned long flags;
 384
 385        net_device = hv_get_drvdata(device);
 386
 387        netvsc_disconnect_vsp(net_device);
 388
 389        /*
 390         * Since we have already drained, we don't need to busy wait
 391         * as was done in final_release_stor_device()
 392         * Note that we cannot set the ext pointer to NULL until
 393         * we have drained - to drain the outgoing packets, we need to
 394         * allow incoming packets.
 395         */
 396
 397        spin_lock_irqsave(&device->channel->inbound_lock, flags);
 398        hv_set_drvdata(device, NULL);
 399        spin_unlock_irqrestore(&device->channel->inbound_lock, flags);
 400
 401        /*
 402         * At this point, no one should be accessing net_device
 403         * except in here
 404         */
 405        dev_notice(&device->device, "net device safe to remove\n");
 406
 407        /* Now, we can close the channel safely */
 408        vmbus_close(device->channel);
 409
 410        /* Release all resources */
 411        list_for_each_entry_safe(netvsc_packet, pos,
 412                                 &net_device->recv_pkt_list, list_ent) {
 413                list_del(&netvsc_packet->list_ent);
 414                kfree(netvsc_packet);
 415        }
 416
 417        kfree(net_device);
 418        return 0;
 419}
 420
 421
 422#define RING_AVAIL_PERCENT_HIWATER 20
 423#define RING_AVAIL_PERCENT_LOWATER 10
 424
 425/*
 426 * Get the percentage of available bytes to write in the ring.
 427 * The return value is in range from 0 to 100.
 428 */
 429static inline u32 hv_ringbuf_avail_percent(
 430                struct hv_ring_buffer_info *ring_info)
 431{
 432        u32 avail_read, avail_write;
 433
 434        hv_get_ringbuffer_availbytes(ring_info, &avail_read, &avail_write);
 435
 436        return avail_write * 100 / ring_info->ring_datasize;
 437}
 438
 439static void netvsc_send_completion(struct hv_device *device,
 440                                   struct vmpacket_descriptor *packet)
 441{
 442        struct netvsc_device *net_device;
 443        struct nvsp_message *nvsp_packet;
 444        struct hv_netvsc_packet *nvsc_packet;
 445        struct net_device *ndev;
 446
 447        net_device = get_inbound_net_device(device);
 448        if (!net_device)
 449                return;
 450        ndev = net_device->ndev;
 451
 452        nvsp_packet = (struct nvsp_message *)((unsigned long)packet +
 453                        (packet->offset8 << 3));
 454
 455        if ((nvsp_packet->hdr.msg_type == NVSP_MSG_TYPE_INIT_COMPLETE) ||
 456            (nvsp_packet->hdr.msg_type ==
 457             NVSP_MSG1_TYPE_SEND_RECV_BUF_COMPLETE) ||
 458            (nvsp_packet->hdr.msg_type ==
 459             NVSP_MSG1_TYPE_SEND_SEND_BUF_COMPLETE)) {
 460                /* Copy the response back */
 461                memcpy(&net_device->channel_init_pkt, nvsp_packet,
 462                       sizeof(struct nvsp_message));
 463                complete(&net_device->channel_init_wait);
 464        } else if (nvsp_packet->hdr.msg_type ==
 465                   NVSP_MSG1_TYPE_SEND_RNDIS_PKT_COMPLETE) {
 466                int num_outstanding_sends;
 467
 468                /* Get the send context */
 469                nvsc_packet = (struct hv_netvsc_packet *)(unsigned long)
 470                        packet->trans_id;
 471
 472                /* Notify the layer above us */
 473                if (nvsc_packet)
 474                        nvsc_packet->completion.send.send_completion(
 475                                nvsc_packet->completion.send.
 476                                send_completion_ctx);
 477
 478                num_outstanding_sends =
 479                        atomic_dec_return(&net_device->num_outstanding_sends);
 480
 481                if (net_device->destroy && num_outstanding_sends == 0)
 482                        wake_up(&net_device->wait_drain);
 483
 484                if (netif_queue_stopped(ndev) && !net_device->start_remove &&
 485                        (hv_ringbuf_avail_percent(&device->channel->outbound)
 486                        > RING_AVAIL_PERCENT_HIWATER ||
 487                        num_outstanding_sends < 1))
 488                                netif_wake_queue(ndev);
 489        } else {
 490                netdev_err(ndev, "Unknown send completion packet type- "
 491                           "%d received!!\n", nvsp_packet->hdr.msg_type);
 492        }
 493
 494}
 495
 496int netvsc_send(struct hv_device *device,
 497                        struct hv_netvsc_packet *packet)
 498{
 499        struct netvsc_device *net_device;
 500        int ret = 0;
 501        struct nvsp_message sendMessage;
 502        struct net_device *ndev;
 503        u64 req_id;
 504
 505        net_device = get_outbound_net_device(device);
 506        if (!net_device)
 507                return -ENODEV;
 508        ndev = net_device->ndev;
 509
 510        sendMessage.hdr.msg_type = NVSP_MSG1_TYPE_SEND_RNDIS_PKT;
 511        if (packet->is_data_pkt) {
 512                /* 0 is RMC_DATA; */
 513                sendMessage.msg.v1_msg.send_rndis_pkt.channel_type = 0;
 514        } else {
 515                /* 1 is RMC_CONTROL; */
 516                sendMessage.msg.v1_msg.send_rndis_pkt.channel_type = 1;
 517        }
 518
 519        /* Not using send buffer section */
 520        sendMessage.msg.v1_msg.send_rndis_pkt.send_buf_section_index =
 521                0xFFFFFFFF;
 522        sendMessage.msg.v1_msg.send_rndis_pkt.send_buf_section_size = 0;
 523
 524        if (packet->completion.send.send_completion)
 525                req_id = (ulong)packet;
 526        else
 527                req_id = 0;
 528
 529        if (packet->page_buf_cnt) {
 530                ret = vmbus_sendpacket_pagebuffer(device->channel,
 531                                                  packet->page_buf,
 532                                                  packet->page_buf_cnt,
 533                                                  &sendMessage,
 534                                                  sizeof(struct nvsp_message),
 535                                                  req_id);
 536        } else {
 537                ret = vmbus_sendpacket(device->channel, &sendMessage,
 538                                sizeof(struct nvsp_message),
 539                                req_id,
 540                                VM_PKT_DATA_INBAND,
 541                                VMBUS_DATA_PACKET_FLAG_COMPLETION_REQUESTED);
 542        }
 543
 544        if (ret == 0) {
 545                atomic_inc(&net_device->num_outstanding_sends);
 546                if (hv_ringbuf_avail_percent(&device->channel->outbound) <
 547                        RING_AVAIL_PERCENT_LOWATER) {
 548                        netif_stop_queue(ndev);
 549                        if (atomic_read(&net_device->
 550                                num_outstanding_sends) < 1)
 551                                netif_wake_queue(ndev);
 552                }
 553        } else if (ret == -EAGAIN) {
 554                netif_stop_queue(ndev);
 555                if (atomic_read(&net_device->num_outstanding_sends) < 1) {
 556                        netif_wake_queue(ndev);
 557                        ret = -ENOSPC;
 558                }
 559        } else {
 560                netdev_err(ndev, "Unable to send packet %p ret %d\n",
 561                           packet, ret);
 562        }
 563
 564        return ret;
 565}
 566
 567static void netvsc_send_recv_completion(struct hv_device *device,
 568                                        u64 transaction_id, u32 status)
 569{
 570        struct nvsp_message recvcompMessage;
 571        int retries = 0;
 572        int ret;
 573        struct net_device *ndev;
 574        struct netvsc_device *net_device = hv_get_drvdata(device);
 575
 576        ndev = net_device->ndev;
 577
 578        recvcompMessage.hdr.msg_type =
 579                                NVSP_MSG1_TYPE_SEND_RNDIS_PKT_COMPLETE;
 580
 581        recvcompMessage.msg.v1_msg.send_rndis_pkt_complete.status = status;
 582
 583retry_send_cmplt:
 584        /* Send the completion */
 585        ret = vmbus_sendpacket(device->channel, &recvcompMessage,
 586                               sizeof(struct nvsp_message), transaction_id,
 587                               VM_PKT_COMP, 0);
 588        if (ret == 0) {
 589                /* success */
 590                /* no-op */
 591        } else if (ret == -EAGAIN) {
 592                /* no more room...wait a bit and attempt to retry 3 times */
 593                retries++;
 594                netdev_err(ndev, "unable to send receive completion pkt"
 595                        " (tid %llx)...retrying %d\n", transaction_id, retries);
 596
 597                if (retries < 4) {
 598                        udelay(100);
 599                        goto retry_send_cmplt;
 600                } else {
 601                        netdev_err(ndev, "unable to send receive "
 602                                "completion pkt (tid %llx)...give up retrying\n",
 603                                transaction_id);
 604                }
 605        } else {
 606                netdev_err(ndev, "unable to send receive "
 607                        "completion pkt - %llx\n", transaction_id);
 608        }
 609}
 610
 611/* Send a receive completion packet to RNDIS device (ie NetVsp) */
 612static void netvsc_receive_completion(void *context)
 613{
 614        struct hv_netvsc_packet *packet = context;
 615        struct hv_device *device = packet->device;
 616        struct netvsc_device *net_device;
 617        u64 transaction_id = 0;
 618        bool fsend_receive_comp = false;
 619        unsigned long flags;
 620        struct net_device *ndev;
 621        u32 status = NVSP_STAT_NONE;
 622
 623        /*
 624         * Even though it seems logical to do a GetOutboundNetDevice() here to
 625         * send out receive completion, we are using GetInboundNetDevice()
 626         * since we may have disable outbound traffic already.
 627         */
 628        net_device = get_inbound_net_device(device);
 629        if (!net_device)
 630                return;
 631        ndev = net_device->ndev;
 632
 633        /* Overloading use of the lock. */
 634        spin_lock_irqsave(&net_device->recv_pkt_list_lock, flags);
 635
 636        if (packet->status != NVSP_STAT_SUCCESS)
 637                packet->xfer_page_pkt->status = NVSP_STAT_FAIL;
 638
 639        packet->xfer_page_pkt->count--;
 640
 641        /*
 642         * Last one in the line that represent 1 xfer page packet.
 643         * Return the xfer page packet itself to the freelist
 644         */
 645        if (packet->xfer_page_pkt->count == 0) {
 646                fsend_receive_comp = true;
 647                transaction_id = packet->completion.recv.recv_completion_tid;
 648                status = packet->xfer_page_pkt->status;
 649                list_add_tail(&packet->xfer_page_pkt->list_ent,
 650                              &net_device->recv_pkt_list);
 651
 652        }
 653
 654        /* Put the packet back */
 655        list_add_tail(&packet->list_ent, &net_device->recv_pkt_list);
 656        spin_unlock_irqrestore(&net_device->recv_pkt_list_lock, flags);
 657
 658        /* Send a receive completion for the xfer page packet */
 659        if (fsend_receive_comp)
 660                netvsc_send_recv_completion(device, transaction_id, status);
 661
 662}
 663
 664static void netvsc_receive(struct hv_device *device,
 665                            struct vmpacket_descriptor *packet)
 666{
 667        struct netvsc_device *net_device;
 668        struct vmtransfer_page_packet_header *vmxferpage_packet;
 669        struct nvsp_message *nvsp_packet;
 670        struct hv_netvsc_packet *netvsc_packet = NULL;
 671        /* struct netvsc_driver *netvscDriver; */
 672        struct xferpage_packet *xferpage_packet = NULL;
 673        int i;
 674        int count = 0;
 675        unsigned long flags;
 676        struct net_device *ndev;
 677
 678        LIST_HEAD(listHead);
 679
 680        net_device = get_inbound_net_device(device);
 681        if (!net_device)
 682                return;
 683        ndev = net_device->ndev;
 684
 685        /*
 686         * All inbound packets other than send completion should be xfer page
 687         * packet
 688         */
 689        if (packet->type != VM_PKT_DATA_USING_XFER_PAGES) {
 690                netdev_err(ndev, "Unknown packet type received - %d\n",
 691                           packet->type);
 692                return;
 693        }
 694
 695        nvsp_packet = (struct nvsp_message *)((unsigned long)packet +
 696                        (packet->offset8 << 3));
 697
 698        /* Make sure this is a valid nvsp packet */
 699        if (nvsp_packet->hdr.msg_type !=
 700            NVSP_MSG1_TYPE_SEND_RNDIS_PKT) {
 701                netdev_err(ndev, "Unknown nvsp packet type received-"
 702                        " %d\n", nvsp_packet->hdr.msg_type);
 703                return;
 704        }
 705
 706        vmxferpage_packet = (struct vmtransfer_page_packet_header *)packet;
 707
 708        if (vmxferpage_packet->xfer_pageset_id != NETVSC_RECEIVE_BUFFER_ID) {
 709                netdev_err(ndev, "Invalid xfer page set id - "
 710                           "expecting %x got %x\n", NETVSC_RECEIVE_BUFFER_ID,
 711                           vmxferpage_packet->xfer_pageset_id);
 712                return;
 713        }
 714
 715        /*
 716         * Grab free packets (range count + 1) to represent this xfer
 717         * page packet. +1 to represent the xfer page packet itself.
 718         * We grab it here so that we know exactly how many we can
 719         * fulfil
 720         */
 721        spin_lock_irqsave(&net_device->recv_pkt_list_lock, flags);
 722        while (!list_empty(&net_device->recv_pkt_list)) {
 723                list_move_tail(net_device->recv_pkt_list.next, &listHead);
 724                if (++count == vmxferpage_packet->range_cnt + 1)
 725                        break;
 726        }
 727        spin_unlock_irqrestore(&net_device->recv_pkt_list_lock, flags);
 728
 729        /*
 730         * We need at least 2 netvsc pkts (1 to represent the xfer
 731         * page and at least 1 for the range) i.e. we can handled
 732         * some of the xfer page packet ranges...
 733         */
 734        if (count < 2) {
 735                netdev_err(ndev, "Got only %d netvsc pkt...needed "
 736                        "%d pkts. Dropping this xfer page packet completely!\n",
 737                        count, vmxferpage_packet->range_cnt + 1);
 738
 739                /* Return it to the freelist */
 740                spin_lock_irqsave(&net_device->recv_pkt_list_lock, flags);
 741                for (i = count; i != 0; i--) {
 742                        list_move_tail(listHead.next,
 743                                       &net_device->recv_pkt_list);
 744                }
 745                spin_unlock_irqrestore(&net_device->recv_pkt_list_lock,
 746                                       flags);
 747
 748                netvsc_send_recv_completion(device,
 749                                            vmxferpage_packet->d.trans_id,
 750                                            NVSP_STAT_FAIL);
 751
 752                return;
 753        }
 754
 755        /* Remove the 1st packet to represent the xfer page packet itself */
 756        xferpage_packet = (struct xferpage_packet *)listHead.next;
 757        list_del(&xferpage_packet->list_ent);
 758        xferpage_packet->status = NVSP_STAT_SUCCESS;
 759
 760        /* This is how much we can satisfy */
 761        xferpage_packet->count = count - 1;
 762
 763        if (xferpage_packet->count != vmxferpage_packet->range_cnt) {
 764                netdev_err(ndev, "Needed %d netvsc pkts to satisfy "
 765                        "this xfer page...got %d\n",
 766                        vmxferpage_packet->range_cnt, xferpage_packet->count);
 767        }
 768
 769        /* Each range represents 1 RNDIS pkt that contains 1 ethernet frame */
 770        for (i = 0; i < (count - 1); i++) {
 771                netvsc_packet = (struct hv_netvsc_packet *)listHead.next;
 772                list_del(&netvsc_packet->list_ent);
 773
 774                /* Initialize the netvsc packet */
 775                netvsc_packet->status = NVSP_STAT_SUCCESS;
 776                netvsc_packet->xfer_page_pkt = xferpage_packet;
 777                netvsc_packet->completion.recv.recv_completion =
 778                                        netvsc_receive_completion;
 779                netvsc_packet->completion.recv.recv_completion_ctx =
 780                                        netvsc_packet;
 781                netvsc_packet->device = device;
 782                /* Save this so that we can send it back */
 783                netvsc_packet->completion.recv.recv_completion_tid =
 784                                        vmxferpage_packet->d.trans_id;
 785
 786                netvsc_packet->data = (void *)((unsigned long)net_device->
 787                        recv_buf + vmxferpage_packet->ranges[i].byte_offset);
 788                netvsc_packet->total_data_buflen =
 789                                        vmxferpage_packet->ranges[i].byte_count;
 790
 791                /* Pass it to the upper layer */
 792                rndis_filter_receive(device, netvsc_packet);
 793
 794                netvsc_receive_completion(netvsc_packet->
 795                                completion.recv.recv_completion_ctx);
 796        }
 797
 798}
 799
 800static void netvsc_channel_cb(void *context)
 801{
 802        int ret;
 803        struct hv_device *device = context;
 804        struct netvsc_device *net_device;
 805        u32 bytes_recvd;
 806        u64 request_id;
 807        unsigned char *packet;
 808        struct vmpacket_descriptor *desc;
 809        unsigned char *buffer;
 810        int bufferlen = NETVSC_PACKET_SIZE;
 811        struct net_device *ndev;
 812
 813        packet = kzalloc(NETVSC_PACKET_SIZE * sizeof(unsigned char),
 814                         GFP_ATOMIC);
 815        if (!packet)
 816                return;
 817        buffer = packet;
 818
 819        net_device = get_inbound_net_device(device);
 820        if (!net_device)
 821                goto out;
 822        ndev = net_device->ndev;
 823
 824        do {
 825                ret = vmbus_recvpacket_raw(device->channel, buffer, bufferlen,
 826                                           &bytes_recvd, &request_id);
 827                if (ret == 0) {
 828                        if (bytes_recvd > 0) {
 829                                desc = (struct vmpacket_descriptor *)buffer;
 830                                switch (desc->type) {
 831                                case VM_PKT_COMP:
 832                                        netvsc_send_completion(device, desc);
 833                                        break;
 834
 835                                case VM_PKT_DATA_USING_XFER_PAGES:
 836                                        netvsc_receive(device, desc);
 837                                        break;
 838
 839                                default:
 840                                        netdev_err(ndev,
 841                                                   "unhandled packet type %d, "
 842                                                   "tid %llx len %d\n",
 843                                                   desc->type, request_id,
 844                                                   bytes_recvd);
 845                                        break;
 846                                }
 847
 848                                /* reset */
 849                                if (bufferlen > NETVSC_PACKET_SIZE) {
 850                                        kfree(buffer);
 851                                        buffer = packet;
 852                                        bufferlen = NETVSC_PACKET_SIZE;
 853                                }
 854                        } else {
 855                                /* reset */
 856                                if (bufferlen > NETVSC_PACKET_SIZE) {
 857                                        kfree(buffer);
 858                                        buffer = packet;
 859                                        bufferlen = NETVSC_PACKET_SIZE;
 860                                }
 861
 862                                break;
 863                        }
 864                } else if (ret == -ENOBUFS) {
 865                        /* Handle large packet */
 866                        buffer = kmalloc(bytes_recvd, GFP_ATOMIC);
 867                        if (buffer == NULL) {
 868                                /* Try again next time around */
 869                                netdev_err(ndev,
 870                                           "unable to allocate buffer of size "
 871                                           "(%d)!!\n", bytes_recvd);
 872                                break;
 873                        }
 874
 875                        bufferlen = bytes_recvd;
 876                }
 877        } while (1);
 878
 879out:
 880        kfree(buffer);
 881        return;
 882}
 883
 884/*
 885 * netvsc_device_add - Callback when the device belonging to this
 886 * driver is added
 887 */
 888int netvsc_device_add(struct hv_device *device, void *additional_info)
 889{
 890        int ret = 0;
 891        int i;
 892        int ring_size =
 893        ((struct netvsc_device_info *)additional_info)->ring_size;
 894        struct netvsc_device *net_device;
 895        struct hv_netvsc_packet *packet, *pos;
 896        struct net_device *ndev;
 897
 898        net_device = alloc_net_device(device);
 899        if (!net_device) {
 900                ret = -ENOMEM;
 901                goto cleanup;
 902        }
 903
 904        /*
 905         * Coming into this function, struct net_device * is
 906         * registered as the driver private data.
 907         * In alloc_net_device(), we register struct netvsc_device *
 908         * as the driver private data and stash away struct net_device *
 909         * in struct netvsc_device *.
 910         */
 911        ndev = net_device->ndev;
 912
 913        /* Initialize the NetVSC channel extension */
 914        net_device->recv_buf_size = NETVSC_RECEIVE_BUFFER_SIZE;
 915        spin_lock_init(&net_device->recv_pkt_list_lock);
 916
 917        INIT_LIST_HEAD(&net_device->recv_pkt_list);
 918
 919        for (i = 0; i < NETVSC_RECEIVE_PACKETLIST_COUNT; i++) {
 920                packet = kzalloc(sizeof(struct hv_netvsc_packet), GFP_KERNEL);
 921                if (!packet)
 922                        break;
 923
 924                list_add_tail(&packet->list_ent,
 925                              &net_device->recv_pkt_list);
 926        }
 927        init_completion(&net_device->channel_init_wait);
 928
 929        /* Open the channel */
 930        ret = vmbus_open(device->channel, ring_size * PAGE_SIZE,
 931                         ring_size * PAGE_SIZE, NULL, 0,
 932                         netvsc_channel_cb, device);
 933
 934        if (ret != 0) {
 935                netdev_err(ndev, "unable to open channel: %d\n", ret);
 936                goto cleanup;
 937        }
 938
 939        /* Channel is opened */
 940        pr_info("hv_netvsc channel opened successfully\n");
 941
 942        /* Connect with the NetVsp */
 943        ret = netvsc_connect_vsp(device);
 944        if (ret != 0) {
 945                netdev_err(ndev,
 946                        "unable to connect to NetVSP - %d\n", ret);
 947                goto close;
 948        }
 949
 950        return ret;
 951
 952close:
 953        /* Now, we can close the channel safely */
 954        vmbus_close(device->channel);
 955
 956cleanup:
 957
 958        if (net_device) {
 959                list_for_each_entry_safe(packet, pos,
 960                                         &net_device->recv_pkt_list,
 961                                         list_ent) {
 962                        list_del(&packet->list_ent);
 963                        kfree(packet);
 964                }
 965
 966                kfree(net_device);
 967        }
 968
 969        return ret;
 970}
 971