netvsc.c 24.5 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
/*
 * Copyright (c) 2009, Microsoft Corporation.
 *
 * This program is free software; you can redistribute it and/or modify it
 * under the terms and conditions of the GNU General Public License,
 * version 2, as published by the Free Software Foundation.
 *
 * This program is distributed in the hope it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
 * more details.
 *
 * You should have received a copy of the GNU General Public License along with
 * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
 * Place - Suite 330, Boston, MA 02111-1307 USA.
 *
 * Authors:
18
 *   Haiyang Zhang <haiyangz@microsoft.com>
19 20
 *   Hank Janssen  <hjanssen@microsoft.com>
 */
21 22
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt

23
#include <linux/kernel.h>
24 25
#include <linux/sched.h>
#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


36
static 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 42
	net_device = kzalloc(sizeof(struct netvsc_device), GFP_KERNEL);
	if (!net_device)
43 44 45
		return NULL;


46
	net_device->destroy = false;
47
	net_device->dev = device;
48
	net_device->ndev = ndev;
49

50
	hv_set_drvdata(device, net_device);
51
	return net_device;
52 53
}

54
static struct netvsc_device *get_outbound_net_device(struct hv_device *device)
55
{
56
	struct netvsc_device *net_device;
57

58
	net_device = hv_get_drvdata(device);
59
	if (net_device && net_device->destroy)
60
		net_device = NULL;
61

62
	return net_device;
63 64
}

65
static struct netvsc_device *get_inbound_net_device(struct hv_device *device)
66
{
67
	struct netvsc_device *net_device;
68

69
	net_device = hv_get_drvdata(device);
70 71 72 73 74 75

	if (!net_device)
		goto get_in_err;

	if (net_device->destroy &&
		atomic_read(&net_device->num_outstanding_sends) == 0)
76
		net_device = NULL;
77

78
get_in_err:
79
	return net_device;
80 81 82
}


83 84 85 86
static int netvsc_destroy_recv_buf(struct netvsc_device *net_device)
{
	struct nvsp_message *revoke_packet;
	int ret = 0;
87
	struct net_device *ndev = net_device->ndev;
88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114

	/*
	 * If we got a section count, it means we received a
	 * SendReceiveBufferComplete msg (ie sent
	 * NvspMessage1TypeSendReceiveBuffer msg) therefore, we need
	 * to send a revoke msg here
	 */
	if (net_device->recv_section_cnt) {
		/* Send the revoke receive buffer */
		revoke_packet = &net_device->revoke_packet;
		memset(revoke_packet, 0, sizeof(struct nvsp_message));

		revoke_packet->hdr.msg_type =
			NVSP_MSG1_TYPE_REVOKE_RECV_BUF;
		revoke_packet->msg.v1_msg.
		revoke_recv_buf.id = NETVSC_RECEIVE_BUFFER_ID;

		ret = vmbus_sendpacket(net_device->dev->channel,
				       revoke_packet,
				       sizeof(struct nvsp_message),
				       (unsigned long)revoke_packet,
				       VM_PKT_DATA_INBAND, 0);
		/*
		 * If we failed here, we might as well return and
		 * have a leak rather than continue and a bugchk
		 */
		if (ret != 0) {
115
			netdev_err(ndev, "unable to send "
116
				"revoke receive buffer to netvsp\n");
117
			return ret;
118 119 120 121 122 123 124 125 126 127 128 129
		}
	}

	/* Teardown the gpadl on the vsp end */
	if (net_device->recv_buf_gpadl_handle) {
		ret = vmbus_teardown_gpadl(net_device->dev->channel,
			   net_device->recv_buf_gpadl_handle);

		/* If we failed here, we might as well return and have a leak
		 * rather than continue and a bugchk
		 */
		if (ret != 0) {
130
			netdev_err(ndev,
131
				   "unable to teardown receive buffer's gpadl\n");
132
			return ret;
133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152
		}
		net_device->recv_buf_gpadl_handle = 0;
	}

	if (net_device->recv_buf) {
		/* Free up the receive buffer */
		free_pages((unsigned long)net_device->recv_buf,
			get_order(net_device->recv_buf_size));
		net_device->recv_buf = NULL;
	}

	if (net_device->recv_section) {
		net_device->recv_section_cnt = 0;
		kfree(net_device->recv_section);
		net_device->recv_section = NULL;
	}

	return ret;
}

153
static int netvsc_init_recv_buf(struct hv_device *device)
154
{
155
	int ret = 0;
156
	int t;
157 158
	struct netvsc_device *net_device;
	struct nvsp_message *init_packet;
159
	struct net_device *ndev;
160

161
	net_device = get_outbound_net_device(device);
162
	if (!net_device)
163
		return -ENODEV;
164
	ndev = net_device->ndev;
165

166
	net_device->recv_buf =
167 168
		(void *)__get_free_pages(GFP_KERNEL|__GFP_ZERO,
				get_order(net_device->recv_buf_size));
169
	if (!net_device->recv_buf) {
170
		netdev_err(ndev, "unable to allocate receive "
171
			"buffer of size %d\n", net_device->recv_buf_size);
172
		ret = -ENOMEM;
173
		goto cleanup;
174 175
	}

176 177 178 179 180
	/*
	 * Establish the gpadl handle for this buffer on this
	 * channel.  Note: This call uses the vmbus connection rather
	 * than the channel to establish the gpadl handle.
	 */
181 182 183
	ret = vmbus_establish_gpadl(device->channel, net_device->recv_buf,
				    net_device->recv_buf_size,
				    &net_device->recv_buf_gpadl_handle);
184
	if (ret != 0) {
185
		netdev_err(ndev,
186
			"unable to establish receive buffer's gpadl\n");
187
		goto cleanup;
188 189 190
	}


191
	/* Notify the NetVsp of the gpadl handle */
192
	init_packet = &net_device->channel_init_pkt;
193

194
	memset(init_packet, 0, sizeof(struct nvsp_message));
195

196 197 198 199 200
	init_packet->hdr.msg_type = NVSP_MSG1_TYPE_SEND_RECV_BUF;
	init_packet->msg.v1_msg.send_recv_buf.
		gpadl_handle = net_device->recv_buf_gpadl_handle;
	init_packet->msg.v1_msg.
		send_recv_buf.id = NETVSC_RECEIVE_BUFFER_ID;
201

202
	/* Send the gpadl notification request */
203
	ret = vmbus_sendpacket(device->channel, init_packet,
204
			       sizeof(struct nvsp_message),
205
			       (unsigned long)init_packet,
206
			       VM_PKT_DATA_INBAND,
207
			       VMBUS_DATA_PACKET_FLAG_COMPLETION_REQUESTED);
208
	if (ret != 0) {
209
		netdev_err(ndev,
210
			"unable to send receive buffer's gpadl to netvsp\n");
211
		goto cleanup;
212 213
	}

214
	t = wait_for_completion_timeout(&net_device->channel_init_wait, 5*HZ);
215
	BUG_ON(t == 0);
216

217

218
	/* Check the response */
219 220
	if (init_packet->msg.v1_msg.
	    send_recv_buf_complete.status != NVSP_STAT_SUCCESS) {
221
		netdev_err(ndev, "Unable to complete receive buffer "
222
			   "initialization with NetVsp - status %d\n",
223 224
			   init_packet->msg.v1_msg.
			   send_recv_buf_complete.status);
225
		ret = -EINVAL;
226
		goto cleanup;
227 228
	}

229
	/* Parse the response */
230

231 232
	net_device->recv_section_cnt = init_packet->msg.
		v1_msg.send_recv_buf_complete.num_sections;
233

234 235 236 237 238
	net_device->recv_section = kmemdup(
		init_packet->msg.v1_msg.send_recv_buf_complete.sections,
		net_device->recv_section_cnt *
		sizeof(struct nvsp_1_receive_buffer_section),
		GFP_KERNEL);
239
	if (net_device->recv_section == NULL) {
240
		ret = -EINVAL;
241
		goto cleanup;
242 243
	}

244 245 246 247
	/*
	 * For 1st release, there should only be 1 section that represents the
	 * entire receive buffer
	 */
248 249
	if (net_device->recv_section_cnt != 1 ||
	    net_device->recv_section->offset != 0) {
250
		ret = -EINVAL;
251
		goto cleanup;
252 253
	}

254
	goto exit;
255

256
cleanup:
257
	netvsc_destroy_recv_buf(net_device);
258

259
exit:
260 261 262 263
	return ret;
}


264 265 266 267 268
/* Negotiate NVSP protocol version */
static int negotiate_nvsp_ver(struct hv_device *device,
			      struct netvsc_device *net_device,
			      struct nvsp_message *init_packet,
			      u32 nvsp_ver)
269
{
270
	int ret, t;
271

272
	memset(init_packet, 0, sizeof(struct nvsp_message));
273
	init_packet->hdr.msg_type = NVSP_MSG_TYPE_INIT;
274 275
	init_packet->msg.init_msg.init.min_protocol_ver = nvsp_ver;
	init_packet->msg.init_msg.init.max_protocol_ver = nvsp_ver;
276

277
	/* Send the init request */
278
	ret = vmbus_sendpacket(device->channel, init_packet,
279
			       sizeof(struct nvsp_message),
280
			       (unsigned long)init_packet,
281
			       VM_PKT_DATA_INBAND,
282
			       VMBUS_DATA_PACKET_FLAG_COMPLETION_REQUESTED);
283

284
	if (ret != 0)
285
		return ret;
286

287
	t = wait_for_completion_timeout(&net_device->channel_init_wait, 5*HZ);
288

289 290
	if (t == 0)
		return -ETIMEDOUT;
291

292
	if (init_packet->msg.init_msg.init_complete.status !=
293 294
	    NVSP_STAT_SUCCESS)
		return -EINVAL;
295

296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334
	if (nvsp_ver != NVSP_PROTOCOL_VERSION_2)
		return 0;

	/* NVSPv2 only: Send NDIS config */
	memset(init_packet, 0, sizeof(struct nvsp_message));
	init_packet->hdr.msg_type = NVSP_MSG2_TYPE_SEND_NDIS_CONFIG;
	init_packet->msg.v2_msg.send_ndis_config.mtu = ETH_DATA_LEN;

	ret = vmbus_sendpacket(device->channel, init_packet,
				sizeof(struct nvsp_message),
				(unsigned long)init_packet,
				VM_PKT_DATA_INBAND, 0);

	return ret;
}

static int netvsc_connect_vsp(struct hv_device *device)
{
	int ret;
	struct netvsc_device *net_device;
	struct nvsp_message *init_packet;
	int ndis_version;
	struct net_device *ndev;

	net_device = get_outbound_net_device(device);
	if (!net_device)
		return -ENODEV;
	ndev = net_device->ndev;

	init_packet = &net_device->channel_init_pkt;

	/* Negotiate the latest NVSP protocol supported */
	if (negotiate_nvsp_ver(device, net_device, init_packet,
			       NVSP_PROTOCOL_VERSION_2) == 0) {
		net_device->nvsp_version = NVSP_PROTOCOL_VERSION_2;
	} else if (negotiate_nvsp_ver(device, net_device, init_packet,
				    NVSP_PROTOCOL_VERSION_1) == 0) {
		net_device->nvsp_version = NVSP_PROTOCOL_VERSION_1;
	} else {
335
		ret = -EPROTO;
336
		goto cleanup;
337
	}
338 339 340

	pr_debug("Negotiated NVSP version:%x\n", net_device->nvsp_version);

341
	/* Send the ndis version */
342
	memset(init_packet, 0, sizeof(struct nvsp_message));
343

344
	ndis_version = 0x00050000;
345

346 347 348
	init_packet->hdr.msg_type = NVSP_MSG1_TYPE_SEND_NDIS_VER;
	init_packet->msg.v1_msg.
		send_ndis_ver.ndis_major_ver =
349
				(ndis_version & 0xFFFF0000) >> 16;
350 351
	init_packet->msg.v1_msg.
		send_ndis_ver.ndis_minor_ver =
352
				ndis_version & 0xFFFF;
353

354
	/* Send the init request */
355
	ret = vmbus_sendpacket(device->channel, init_packet,
356 357 358
				sizeof(struct nvsp_message),
				(unsigned long)init_packet,
				VM_PKT_DATA_INBAND, 0);
359
	if (ret != 0)
360
		goto cleanup;
361 362

	/* Post the big receive buffer to NetVSP */
363
	ret = netvsc_init_recv_buf(device);
364

365
cleanup:
366 367 368
	return ret;
}

369
static void netvsc_disconnect_vsp(struct netvsc_device *net_device)
370
{
371
	netvsc_destroy_recv_buf(net_device);
372 373
}

374
/*
375
 * netvsc_device_remove - Callback when the root bus device is removed
376
 */
377
int netvsc_device_remove(struct hv_device *device)
378
{
379 380
	struct netvsc_device *net_device;
	struct hv_netvsc_packet *netvsc_packet, *pos;
381
	unsigned long flags;
382

383
	net_device = hv_get_drvdata(device);
384 385 386 387
	spin_lock_irqsave(&device->channel->inbound_lock, flags);
	net_device->destroy = true;
	spin_unlock_irqrestore(&device->channel->inbound_lock, flags);

388
	/* Wait for all send completions */
389
	while (atomic_read(&net_device->num_outstanding_sends)) {
390
		dev_info(&device->device,
391
			"waiting for %d requests to complete...\n",
392
			atomic_read(&net_device->num_outstanding_sends));
393
		udelay(100);
394 395
	}

396
	netvsc_disconnect_vsp(net_device);
397

398
	/*
399 400 401 402 403
	 * Since we have already drained, we don't need to busy wait
	 * as was done in final_release_stor_device()
	 * Note that we cannot set the ext pointer to NULL until
	 * we have drained - to drain the outgoing packets, we need to
	 * allow incoming packets.
404
	 */
405 406

	spin_lock_irqsave(&device->channel->inbound_lock, flags);
407
	hv_set_drvdata(device, NULL);
408
	spin_unlock_irqrestore(&device->channel->inbound_lock, flags);
409

410 411 412 413
	/*
	 * At this point, no one should be accessing net_device
	 * except in here
	 */
414
	dev_notice(&device->device, "net device safe to remove\n");
415

416
	/* Now, we can close the channel safely */
417
	vmbus_close(device->channel);
418

419
	/* Release all resources */
420
	list_for_each_entry_safe(netvsc_packet, pos,
421
				 &net_device->recv_pkt_list, list_ent) {
422
		list_del(&netvsc_packet->list_ent);
423
		kfree(netvsc_packet);
424 425
	}

426
	kfree(net_device);
427
	return 0;
428 429
}

430
static void netvsc_send_completion(struct hv_device *device,
431
				   struct vmpacket_descriptor *packet)
432
{
433 434 435
	struct netvsc_device *net_device;
	struct nvsp_message *nvsp_packet;
	struct hv_netvsc_packet *nvsc_packet;
436
	struct net_device *ndev;
437

438
	net_device = get_inbound_net_device(device);
439
	if (!net_device)
440
		return;
441
	ndev = net_device->ndev;
442

443
	nvsp_packet = (struct nvsp_message *)((unsigned long)packet +
444
			(packet->offset8 << 3));
445

446 447 448 449 450
	if ((nvsp_packet->hdr.msg_type == NVSP_MSG_TYPE_INIT_COMPLETE) ||
	    (nvsp_packet->hdr.msg_type ==
	     NVSP_MSG1_TYPE_SEND_RECV_BUF_COMPLETE) ||
	    (nvsp_packet->hdr.msg_type ==
	     NVSP_MSG1_TYPE_SEND_SEND_BUF_COMPLETE)) {
451
		/* Copy the response back */
452
		memcpy(&net_device->channel_init_pkt, nvsp_packet,
453
		       sizeof(struct nvsp_message));
454
		complete(&net_device->channel_init_wait);
455 456
	} else if (nvsp_packet->hdr.msg_type ==
		   NVSP_MSG1_TYPE_SEND_RNDIS_PKT_COMPLETE) {
457
		/* Get the send context */
458
		nvsc_packet = (struct hv_netvsc_packet *)(unsigned long)
459
			packet->trans_id;
460

461
		/* Notify the layer above us */
462 463
		nvsc_packet->completion.send.send_completion(
			nvsc_packet->completion.send.send_completion_ctx);
464

465
		atomic_dec(&net_device->num_outstanding_sends);
466 467 468

		if (netif_queue_stopped(ndev))
			netif_wake_queue(ndev);
469
	} else {
470
		netdev_err(ndev, "Unknown send completion packet type- "
471
			   "%d received!!\n", nvsp_packet->hdr.msg_type);
472 473 474 475
	}

}

476
int netvsc_send(struct hv_device *device,
477
			struct hv_netvsc_packet *packet)
478
{
479
	struct netvsc_device *net_device;
480
	int ret = 0;
481
	struct nvsp_message sendMessage;
482
	struct net_device *ndev;
483

484
	net_device = get_outbound_net_device(device);
485
	if (!net_device)
486
		return -ENODEV;
487
	ndev = net_device->ndev;
488

489
	sendMessage.hdr.msg_type = NVSP_MSG1_TYPE_SEND_RNDIS_PKT;
490
	if (packet->is_data_pkt) {
491
		/* 0 is RMC_DATA; */
492
		sendMessage.msg.v1_msg.send_rndis_pkt.channel_type = 0;
493 494
	} else {
		/* 1 is RMC_CONTROL; */
495
		sendMessage.msg.v1_msg.send_rndis_pkt.channel_type = 1;
496
	}
497

498
	/* Not using send buffer section */
499 500 501
	sendMessage.msg.v1_msg.send_rndis_pkt.send_buf_section_index =
		0xFFFFFFFF;
	sendMessage.msg.v1_msg.send_rndis_pkt.send_buf_section_size = 0;
502

503
	if (packet->page_buf_cnt) {
504
		ret = vmbus_sendpacket_pagebuffer(device->channel,
505 506
						  packet->page_buf,
						  packet->page_buf_cnt,
507 508
						  &sendMessage,
						  sizeof(struct nvsp_message),
509
						  (unsigned long)packet);
510
	} else {
511
		ret = vmbus_sendpacket(device->channel, &sendMessage,
512 513 514 515
				sizeof(struct nvsp_message),
				(unsigned long)packet,
				VM_PKT_DATA_INBAND,
				VMBUS_DATA_PACKET_FLAG_COMPLETION_REQUESTED);
516 517 518

	}

519 520 521 522 523 524 525
	if (ret == 0) {
		atomic_inc(&net_device->num_outstanding_sends);
	} else if (ret == -EAGAIN) {
		netif_stop_queue(ndev);
		if (atomic_read(&net_device->num_outstanding_sends) < 1)
			netif_wake_queue(ndev);
	} else {
526
		netdev_err(ndev, "Unable to send packet %p ret %d\n",
527
			   packet, ret);
528
	}
529 530 531 532

	return ret;
}

533 534 535 536 537 538
static void netvsc_send_recv_completion(struct hv_device *device,
					u64 transaction_id)
{
	struct nvsp_message recvcompMessage;
	int retries = 0;
	int ret;
539 540 541 542
	struct net_device *ndev;
	struct netvsc_device *net_device = hv_get_drvdata(device);

	ndev = net_device->ndev;
543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558

	recvcompMessage.hdr.msg_type =
				NVSP_MSG1_TYPE_SEND_RNDIS_PKT_COMPLETE;

	/* FIXME: Pass in the status */
	recvcompMessage.msg.v1_msg.send_rndis_pkt_complete.status =
		NVSP_STAT_SUCCESS;

retry_send_cmplt:
	/* Send the completion */
	ret = vmbus_sendpacket(device->channel, &recvcompMessage,
			       sizeof(struct nvsp_message), transaction_id,
			       VM_PKT_COMP, 0);
	if (ret == 0) {
		/* success */
		/* no-op */
559
	} else if (ret == -EAGAIN) {
560 561
		/* no more room...wait a bit and attempt to retry 3 times */
		retries++;
562
		netdev_err(ndev, "unable to send receive completion pkt"
563
			" (tid %llx)...retrying %d\n", transaction_id, retries);
564 565 566 567 568

		if (retries < 4) {
			udelay(100);
			goto retry_send_cmplt;
		} else {
569
			netdev_err(ndev, "unable to send receive "
570
				"completion pkt (tid %llx)...give up retrying\n",
571 572 573
				transaction_id);
		}
	} else {
574
		netdev_err(ndev, "unable to send receive "
575
			"completion pkt - %llx\n", transaction_id);
576 577 578
	}
}

579 580 581 582 583 584 585 586 587
/* Send a receive completion packet to RNDIS device (ie NetVsp) */
static void netvsc_receive_completion(void *context)
{
	struct hv_netvsc_packet *packet = context;
	struct hv_device *device = (struct hv_device *)packet->device;
	struct netvsc_device *net_device;
	u64 transaction_id = 0;
	bool fsend_receive_comp = false;
	unsigned long flags;
588
	struct net_device *ndev;
589 590 591 592 593 594 595

	/*
	 * Even though it seems logical to do a GetOutboundNetDevice() here to
	 * send out receive completion, we are using GetInboundNetDevice()
	 * since we may have disable outbound traffic already.
	 */
	net_device = get_inbound_net_device(device);
596
	if (!net_device)
597
		return;
598
	ndev = net_device->ndev;
599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626

	/* Overloading use of the lock. */
	spin_lock_irqsave(&net_device->recv_pkt_list_lock, flags);

	packet->xfer_page_pkt->count--;

	/*
	 * Last one in the line that represent 1 xfer page packet.
	 * Return the xfer page packet itself to the freelist
	 */
	if (packet->xfer_page_pkt->count == 0) {
		fsend_receive_comp = true;
		transaction_id = packet->completion.recv.recv_completion_tid;
		list_add_tail(&packet->xfer_page_pkt->list_ent,
			      &net_device->recv_pkt_list);

	}

	/* Put the packet back */
	list_add_tail(&packet->list_ent, &net_device->recv_pkt_list);
	spin_unlock_irqrestore(&net_device->recv_pkt_list_lock, flags);

	/* Send a receive completion for the xfer page packet */
	if (fsend_receive_comp)
		netvsc_send_recv_completion(device, transaction_id);

}

627
static void netvsc_receive(struct hv_device *device,
628
			    struct vmpacket_descriptor *packet)
629
{
630 631 632 633
	struct netvsc_device *net_device;
	struct vmtransfer_page_packet_header *vmxferpage_packet;
	struct nvsp_message *nvsp_packet;
	struct hv_netvsc_packet *netvsc_packet = NULL;
634
	/* struct netvsc_driver *netvscDriver; */
635
	struct xferpage_packet *xferpage_packet = NULL;
636 637
	int i;
	int count = 0;
638
	unsigned long flags;
639
	struct net_device *ndev;
640

641
	LIST_HEAD(listHead);
642

643
	net_device = get_inbound_net_device(device);
644
	if (!net_device)
645
		return;
646
	ndev = net_device->ndev;
647

648 649 650 651
	/*
	 * All inbound packets other than send completion should be xfer page
	 * packet
	 */
652
	if (packet->type != VM_PKT_DATA_USING_XFER_PAGES) {
653
		netdev_err(ndev, "Unknown packet type received - %d\n",
654
			   packet->type);
655 656 657
		return;
	}

658
	nvsp_packet = (struct nvsp_message *)((unsigned long)packet +
659
			(packet->offset8 << 3));
660

661
	/* Make sure this is a valid nvsp packet */
662 663
	if (nvsp_packet->hdr.msg_type !=
	    NVSP_MSG1_TYPE_SEND_RNDIS_PKT) {
664
		netdev_err(ndev, "Unknown nvsp packet type received-"
665
			" %d\n", nvsp_packet->hdr.msg_type);
666 667 668
		return;
	}

669
	vmxferpage_packet = (struct vmtransfer_page_packet_header *)packet;
670

671
	if (vmxferpage_packet->xfer_pageset_id != NETVSC_RECEIVE_BUFFER_ID) {
672
		netdev_err(ndev, "Invalid xfer page set id - "
673
			   "expecting %x got %x\n", NETVSC_RECEIVE_BUFFER_ID,
674
			   vmxferpage_packet->xfer_pageset_id);
675 676 677
		return;
	}

678 679 680 681 682 683
	/*
	 * Grab free packets (range count + 1) to represent this xfer
	 * page packet. +1 to represent the xfer page packet itself.
	 * We grab it here so that we know exactly how many we can
	 * fulfil
	 */
684 685 686
	spin_lock_irqsave(&net_device->recv_pkt_list_lock, flags);
	while (!list_empty(&net_device->recv_pkt_list)) {
		list_move_tail(net_device->recv_pkt_list.next, &listHead);
687
		if (++count == vmxferpage_packet->range_cnt + 1)
688 689
			break;
	}
690
	spin_unlock_irqrestore(&net_device->recv_pkt_list_lock, flags);
691

692 693 694 695 696
	/*
	 * We need at least 2 netvsc pkts (1 to represent the xfer
	 * page and at least 1 for the range) i.e. we can handled
	 * some of the xfer page packet ranges...
	 */
697
	if (count < 2) {
698
		netdev_err(ndev, "Got only %d netvsc pkt...needed "
699
			"%d pkts. Dropping this xfer page packet completely!\n",
700
			count, vmxferpage_packet->range_cnt + 1);
701

702
		/* Return it to the freelist */
703
		spin_lock_irqsave(&net_device->recv_pkt_list_lock, flags);
704
		for (i = count; i != 0; i--) {
705
			list_move_tail(listHead.next,
706
				       &net_device->recv_pkt_list);
707
		}
708
		spin_unlock_irqrestore(&net_device->recv_pkt_list_lock,
709
				       flags);
710

711
		netvsc_send_recv_completion(device,
712
					    vmxferpage_packet->d.trans_id);
713 714 715 716

		return;
	}

717
	/* Remove the 1st packet to represent the xfer page packet itself */
718
	xferpage_packet = (struct xferpage_packet *)listHead.next;
719
	list_del(&xferpage_packet->list_ent);
720

721
	/* This is how much we can satisfy */
722
	xferpage_packet->count = count - 1;
723

724
	if (xferpage_packet->count != vmxferpage_packet->range_cnt) {
725
		netdev_err(ndev, "Needed %d netvsc pkts to satisfy "
726
			"this xfer page...got %d\n",
727
			vmxferpage_packet->range_cnt, xferpage_packet->count);
728 729
	}

730
	/* Each range represents 1 RNDIS pkt that contains 1 ethernet frame */
731
	for (i = 0; i < (count - 1); i++) {
732
		netvsc_packet = (struct hv_netvsc_packet *)listHead.next;
733
		list_del(&netvsc_packet->list_ent);
734

735
		/* Initialize the netvsc packet */
736 737
		netvsc_packet->xfer_page_pkt = xferpage_packet;
		netvsc_packet->completion.recv.recv_completion =
738
					netvsc_receive_completion;
739
		netvsc_packet->completion.recv.recv_completion_ctx =
740
					netvsc_packet;
741
		netvsc_packet->device = device;
742
		/* Save this so that we can send it back */
743
		netvsc_packet->completion.recv.recv_completion_tid =
744
					vmxferpage_packet->d.trans_id;
745

746 747
		netvsc_packet->data = (void *)((unsigned long)net_device->
			recv_buf + vmxferpage_packet->ranges[i].byte_offset);
748
		netvsc_packet->total_data_buflen =
749
					vmxferpage_packet->ranges[i].byte_count;
750

751
		/* Pass it to the upper layer */
752
		rndis_filter_receive(device, netvsc_packet);
753

754
		netvsc_receive_completion(netvsc_packet->
755
				completion.recv.recv_completion_ctx);
756 757 758 759
	}

}

760
static void netvsc_channel_cb(void *context)
761
{
762
	int ret;
763 764 765 766
	struct hv_device *device = context;
	struct netvsc_device *net_device;
	u32 bytes_recvd;
	u64 request_id;
767
	unsigned char *packet;
768
	struct vmpacket_descriptor *desc;
769 770
	unsigned char *buffer;
	int bufferlen = NETVSC_PACKET_SIZE;
771
	struct net_device *ndev;
772

773
	packet = kzalloc(NETVSC_PACKET_SIZE * sizeof(unsigned char),
774
			 GFP_ATOMIC);
775 776 777 778
	if (!packet)
		return;
	buffer = packet;

779
	net_device = get_inbound_net_device(device);
780
	if (!net_device)
781
		goto out;
782
	ndev = net_device->ndev;
783

784
	do {
785
		ret = vmbus_recvpacket_raw(device->channel, buffer, bufferlen,
786
					   &bytes_recvd, &request_id);
787
		if (ret == 0) {
788
			if (bytes_recvd > 0) {
789
				desc = (struct vmpacket_descriptor *)buffer;
790 791
				switch (desc->type) {
				case VM_PKT_COMP:
792
					netvsc_send_completion(device, desc);
793 794
					break;

795
				case VM_PKT_DATA_USING_XFER_PAGES:
796
					netvsc_receive(device, desc);
797 798 799
					break;

				default:
800
					netdev_err(ndev,
801 802
						   "unhandled packet type %d, "
						   "tid %llx len %d\n",
803
						   desc->type, request_id,
804
						   bytes_recvd);
805
					break;
806 807
				}

808
				/* reset */
809
				if (bufferlen > NETVSC_PACKET_SIZE) {
810
					kfree(buffer);
811
					buffer = packet;
812
					bufferlen = NETVSC_PACKET_SIZE;
813
				}
814
			} else {
815
				/* reset */
816
				if (bufferlen > NETVSC_PACKET_SIZE) {
817
					kfree(buffer);
818
					buffer = packet;
819
					bufferlen = NETVSC_PACKET_SIZE;
820 821 822 823
				}

				break;
			}
824
		} else if (ret == -ENOBUFS) {
825
			/* Handle large packet */
826
			buffer = kmalloc(bytes_recvd, GFP_ATOMIC);
827
			if (buffer == NULL) {
828
				/* Try again next time around */
829
				netdev_err(ndev,
830
					   "unable to allocate buffer of size "
831
					   "(%d)!!\n", bytes_recvd);
832 833 834
				break;
			}

835
			bufferlen = bytes_recvd;
836 837 838
		}
	} while (1);

839 840
out:
	kfree(buffer);
841 842
	return;
}
843

844 845 846 847
/*
 * netvsc_device_add - Callback when the device belonging to this
 * driver is added
 */
848
int netvsc_device_add(struct hv_device *device, void *additional_info)
849 850 851
{
	int ret = 0;
	int i;
852 853
	int ring_size =
	((struct netvsc_device_info *)additional_info)->ring_size;
854 855
	struct netvsc_device *net_device;
	struct hv_netvsc_packet *packet, *pos;
856
	struct net_device *ndev;
857 858 859

	net_device = alloc_net_device(device);
	if (!net_device) {
860
		ret = -ENOMEM;
861 862 863
		goto cleanup;
	}

864 865 866 867 868 869 870 871 872
	/*
	 * Coming into this function, struct net_device * is
	 * registered as the driver private data.
	 * In alloc_net_device(), we register struct netvsc_device *
	 * as the driver private data and stash away struct net_device *
	 * in struct netvsc_device *.
	 */
	ndev = net_device->ndev;

873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888
	/* Initialize the NetVSC channel extension */
	net_device->recv_buf_size = NETVSC_RECEIVE_BUFFER_SIZE;
	spin_lock_init(&net_device->recv_pkt_list_lock);

	INIT_LIST_HEAD(&net_device->recv_pkt_list);

	for (i = 0; i < NETVSC_RECEIVE_PACKETLIST_COUNT; i++) {
		packet = kzalloc(sizeof(struct hv_netvsc_packet) +
				 (NETVSC_RECEIVE_SG_COUNT *
				  sizeof(struct hv_page_buffer)), GFP_KERNEL);
		if (!packet)
			break;

		list_add_tail(&packet->list_ent,
			      &net_device->recv_pkt_list);
	}
889
	init_completion(&net_device->channel_init_wait);
890 891

	/* Open the channel */
892 893
	ret = vmbus_open(device->channel, ring_size * PAGE_SIZE,
			 ring_size * PAGE_SIZE, NULL, 0,
894 895 896
			 netvsc_channel_cb, device);

	if (ret != 0) {
897
		netdev_err(ndev, "unable to open channel: %d\n", ret);
898 899 900 901
		goto cleanup;
	}

	/* Channel is opened */
902
	pr_info("hv_netvsc channel opened successfully\n");
903 904 905 906

	/* Connect with the NetVsp */
	ret = netvsc_connect_vsp(device);
	if (ret != 0) {
907
		netdev_err(ndev,
908
			"unable to connect to NetVSP - %d\n", ret);
909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927
		goto close;
	}

	return ret;

close:
	/* Now, we can close the channel safely */
	vmbus_close(device->channel);

cleanup:

	if (net_device) {
		list_for_each_entry_safe(packet, pos,
					 &net_device->recv_pkt_list,
					 list_ent) {
			list_del(&packet->list_ent);
			kfree(packet);
		}

928
		kfree(net_device);
929 930 931 932
	}

	return ret;
}