rndis_filter.c 35.7 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13
/*
 * 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
14
 * this program; if not, see <http://www.gnu.org/licenses/>.
15 16 17 18 19
 *
 * Authors:
 *   Haiyang Zhang <haiyangz@microsoft.com>
 *   Hank Janssen  <hjanssen@microsoft.com>
 */
20
#include <linux/kernel.h>
21 22
#include <linux/sched.h>
#include <linux/wait.h>
23
#include <linux/highmem.h>
24
#include <linux/slab.h>
25
#include <linux/io.h>
26
#include <linux/if_ether.h>
27
#include <linux/netdevice.h>
28
#include <linux/if_vlan.h>
29
#include <linux/nls.h>
30
#include <linux/vmalloc.h>
S
stephen hemminger 已提交
31
#include <linux/rtnetlink.h>
32

33
#include "hyperv_net.h"
34

35
static void rndis_set_multicast(struct work_struct *w);
36

37
#define RNDIS_EXT_LEN PAGE_SIZE
38
struct rndis_request {
39
	struct list_head list_ent;
40
	struct completion  wait_event;
41

42
	struct rndis_message response_msg;
43
	/*
44 45 46 47
	 * The buffer for extended info after the RNDIS response message. It's
	 * referenced based on the data offset in the RNDIS message. Its size
	 * is enough for current needs, and should be sufficient for the near
	 * future.
48
	 */
49
	u8 response_ext[RNDIS_EXT_LEN];
50

51
	/* Simplify allocation by having a netvsc packet inline */
52
	struct hv_netvsc_packet	pkt;
53

54
	struct rndis_message request_msg;
55
	/*
56 57
	 * The buffer for the extended info after the RNDIS request message.
	 * It is referenced and sized in a similar way as response_ext.
58
	 */
59
	u8 request_ext[RNDIS_EXT_LEN];
60
};
61

62 63 64 65 66 67 68 69
static const u8 netvsc_hash_key[NETVSC_HASH_KEYLEN] = {
	0x6d, 0x5a, 0x56, 0xda, 0x25, 0x5b, 0x0e, 0xc2,
	0x41, 0x67, 0x25, 0x3d, 0x43, 0xa3, 0x8f, 0xb0,
	0xd0, 0xca, 0x2b, 0xcb, 0xae, 0x7b, 0x30, 0xb4,
	0x77, 0xcb, 0x2d, 0xa3, 0x80, 0x30, 0xf2, 0x0c,
	0x6a, 0x42, 0xb7, 0x3b, 0xbe, 0xac, 0x01, 0xfa
};

70
static struct rndis_device *get_rndis_device(void)
71
{
72
	struct rndis_device *device;
73

74
	device = kzalloc(sizeof(struct rndis_device), GFP_KERNEL);
75 76 77
	if (!device)
		return NULL;

78
	spin_lock_init(&device->request_lock);
79

80
	INIT_LIST_HEAD(&device->req_list);
81
	INIT_WORK(&device->mcast_work, rndis_set_multicast);
82

83
	device->state = RNDIS_DEV_UNINITIALIZED;
84 85 86 87

	return device;
}

88
static struct rndis_request *get_rndis_request(struct rndis_device *dev,
89 90
					     u32 msg_type,
					     u32 msg_len)
91
{
92
	struct rndis_request *request;
93
	struct rndis_message *rndis_msg;
94
	struct rndis_set_request *set;
95
	unsigned long flags;
96

97
	request = kzalloc(sizeof(struct rndis_request), GFP_KERNEL);
98 99 100
	if (!request)
		return NULL;

101
	init_completion(&request->wait_event);
102

103
	rndis_msg = &request->request_msg;
104 105
	rndis_msg->ndis_msg_type = msg_type;
	rndis_msg->msg_len = msg_len;
106

107 108
	request->pkt.q_idx = 0;

109 110 111 112 113
	/*
	 * Set the request id. This field is always after the rndis header for
	 * request/response packet types so we just used the SetRequest as a
	 * template
	 */
114 115
	set = &rndis_msg->msg.set_req;
	set->req_id = atomic_inc_return(&dev->new_req_id);
116

117
	/* Add to the request list */
118 119 120
	spin_lock_irqsave(&dev->request_lock, flags);
	list_add_tail(&request->list_ent, &dev->req_list);
	spin_unlock_irqrestore(&dev->request_lock, flags);
121 122 123 124

	return request;
}

125
static void put_rndis_request(struct rndis_device *dev,
126
			    struct rndis_request *req)
127
{
128 129
	unsigned long flags;

130 131 132
	spin_lock_irqsave(&dev->request_lock, flags);
	list_del(&req->list_ent);
	spin_unlock_irqrestore(&dev->request_lock, flags);
133

134
	kfree(req);
135 136
}

137
static void dump_rndis_message(struct hv_device *hv_dev,
138
			       const struct rndis_message *rndis_msg)
139
{
140
	struct net_device *netdev = hv_get_drvdata(hv_dev);
141

142
	switch (rndis_msg->ndis_msg_type) {
143 144
	case RNDIS_MSG_PACKET:
		netdev_dbg(netdev, "RNDIS_MSG_PACKET (len %u, "
145 146
			   "data offset %u data len %u, # oob %u, "
			   "oob offset %u, oob len %u, pkt offset %u, "
147
			   "pkt len %u\n",
148 149 150 151 152 153 154 155
			   rndis_msg->msg_len,
			   rndis_msg->msg.pkt.data_offset,
			   rndis_msg->msg.pkt.data_len,
			   rndis_msg->msg.pkt.num_oob_data_elements,
			   rndis_msg->msg.pkt.oob_data_offset,
			   rndis_msg->msg.pkt.oob_data_len,
			   rndis_msg->msg.pkt.per_pkt_info_offset,
			   rndis_msg->msg.pkt.per_pkt_info_len);
156 157
		break;

158 159
	case RNDIS_MSG_INIT_C:
		netdev_dbg(netdev, "RNDIS_MSG_INIT_C "
160 161
			"(len %u, id 0x%x, status 0x%x, major %d, minor %d, "
			"device flags %d, max xfer size 0x%x, max pkts %u, "
162
			"pkt aligned %u)\n",
163 164 165 166 167 168 169 170 171 172 173
			rndis_msg->msg_len,
			rndis_msg->msg.init_complete.req_id,
			rndis_msg->msg.init_complete.status,
			rndis_msg->msg.init_complete.major_ver,
			rndis_msg->msg.init_complete.minor_ver,
			rndis_msg->msg.init_complete.dev_flags,
			rndis_msg->msg.init_complete.max_xfer_size,
			rndis_msg->msg.init_complete.
			   max_pkt_per_msg,
			rndis_msg->msg.init_complete.
			   pkt_alignment_factor);
174 175
		break;

176 177
	case RNDIS_MSG_QUERY_C:
		netdev_dbg(netdev, "RNDIS_MSG_QUERY_C "
178
			"(len %u, id 0x%x, status 0x%x, buf len %u, "
179
			"buf offset %u)\n",
180 181 182 183 184 185 186
			rndis_msg->msg_len,
			rndis_msg->msg.query_complete.req_id,
			rndis_msg->msg.query_complete.status,
			rndis_msg->msg.query_complete.
			   info_buflen,
			rndis_msg->msg.query_complete.
			   info_buf_offset);
187 188
		break;

189
	case RNDIS_MSG_SET_C:
190
		netdev_dbg(netdev,
191
			"RNDIS_MSG_SET_C (len %u, id 0x%x, status 0x%x)\n",
192 193 194
			rndis_msg->msg_len,
			rndis_msg->msg.set_complete.req_id,
			rndis_msg->msg.set_complete.status);
195 196
		break;

197 198
	case RNDIS_MSG_INDICATE:
		netdev_dbg(netdev, "RNDIS_MSG_INDICATE "
199
			"(len %u, status 0x%x, buf len %u, buf offset %u)\n",
200 201 202 203
			rndis_msg->msg_len,
			rndis_msg->msg.indicate_status.status,
			rndis_msg->msg.indicate_status.status_buflen,
			rndis_msg->msg.indicate_status.status_buf_offset);
204 205 206
		break;

	default:
207
		netdev_dbg(netdev, "0x%x (len %u)\n",
208 209
			rndis_msg->ndis_msg_type,
			rndis_msg->msg_len);
210 211 212 213
		break;
	}
}

214
static int rndis_filter_send_request(struct rndis_device *dev,
215
				  struct rndis_request *req)
216
{
217
	int ret;
218
	struct hv_netvsc_packet *packet;
219
	struct hv_page_buffer page_buf[2];
220
	struct hv_page_buffer *pb = page_buf;
221
	struct net_device_context *net_device_ctx = netdev_priv(dev->ndev);
222

223
	/* Setup the packet to send it */
224
	packet = &req->pkt;
225

226
	packet->total_data_buflen = req->request_msg.msg_len;
227
	packet->page_buf_cnt = 1;
228

229
	pb[0].pfn = virt_to_phys(&req->request_msg) >>
230
					PAGE_SHIFT;
231 232
	pb[0].len = req->request_msg.msg_len;
	pb[0].offset =
233
		(unsigned long)&req->request_msg & (PAGE_SIZE - 1);
234

235
	/* Add one page_buf when request_msg crossing page boundary */
236
	if (pb[0].offset + pb[0].len > PAGE_SIZE) {
237
		packet->page_buf_cnt++;
238 239 240 241 242 243 244
		pb[0].len = PAGE_SIZE -
			pb[0].offset;
		pb[1].pfn = virt_to_phys((void *)&req->request_msg
			+ pb[0].len) >> PAGE_SHIFT;
		pb[1].offset = 0;
		pb[1].len = req->request_msg.msg_len -
			pb[0].len;
245 246
	}

247
	rcu_read_lock_bh();
248
	ret = netvsc_send(net_device_ctx, packet, NULL, &pb, NULL);
249 250
	rcu_read_unlock_bh();

251 252 253
	return ret;
}

254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269
static void rndis_set_link_state(struct rndis_device *rdev,
				 struct rndis_request *request)
{
	u32 link_status;
	struct rndis_query_complete *query_complete;

	query_complete = &request->response_msg.msg.query_complete;

	if (query_complete->status == RNDIS_STATUS_SUCCESS &&
	    query_complete->info_buflen == sizeof(u32)) {
		memcpy(&link_status, (void *)((unsigned long)query_complete +
		       query_complete->info_buf_offset), sizeof(u32));
		rdev->link_state = link_status != 0;
	}
}

270
static void rndis_filter_receive_response(struct rndis_device *dev,
271
				       struct rndis_message *resp)
272
{
273
	struct rndis_request *request = NULL;
274
	bool found = false;
275
	unsigned long flags;
276
	struct net_device *ndev = dev->ndev;
277

278 279
	spin_lock_irqsave(&dev->request_lock, flags);
	list_for_each_entry(request, &dev->req_list, list_ent) {
280 281 282 283
		/*
		 * All request/response message contains RequestId as the 1st
		 * field
		 */
284 285
		if (request->request_msg.msg.init_req.req_id
		    == resp->msg.init_complete.req_id) {
286
			found = true;
287 288 289
			break;
		}
	}
290
	spin_unlock_irqrestore(&dev->request_lock, flags);
291

292
	if (found) {
293 294
		if (resp->msg_len <=
		    sizeof(struct rndis_message) + RNDIS_EXT_LEN) {
295
			memcpy(&request->response_msg, resp,
296
			       resp->msg_len);
297 298 299 300
			if (request->request_msg.ndis_msg_type ==
			    RNDIS_MSG_QUERY && request->request_msg.msg.
			    query_req.oid == RNDIS_OID_GEN_MEDIA_CONNECT_STATUS)
				rndis_set_link_state(dev, request);
301
		} else {
302
			netdev_err(ndev,
303 304 305
				"rndis response buffer overflow "
				"detected (size %u max %zu)\n",
				resp->msg_len,
306
				sizeof(struct rndis_message));
307

308
			if (resp->ndis_msg_type ==
309
			    RNDIS_MSG_RESET_C) {
310
				/* does not have a request id field */
311
				request->response_msg.msg.reset_complete.
312
					status = RNDIS_STATUS_BUFFER_OVERFLOW;
313
			} else {
314 315
				request->response_msg.msg.
				init_complete.status =
316
					RNDIS_STATUS_BUFFER_OVERFLOW;
317 318 319
			}
		}

320
		complete(&request->wait_event);
321
	} else {
322
		netdev_err(ndev,
323 324 325 326
			"no rndis request found for this response "
			"(id 0x%x res type 0x%x)\n",
			resp->msg.init_complete.req_id,
			resp->ndis_msg_type);
327 328 329
	}
}

330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355
/*
 * Get the Per-Packet-Info with the specified type
 * return NULL if not found.
 */
static inline void *rndis_get_ppi(struct rndis_packet *rpkt, u32 type)
{
	struct rndis_per_packet_info *ppi;
	int len;

	if (rpkt->per_pkt_info_offset == 0)
		return NULL;

	ppi = (struct rndis_per_packet_info *)((ulong)rpkt +
		rpkt->per_pkt_info_offset);
	len = rpkt->per_pkt_info_len;

	while (len > 0) {
		if (ppi->type == type)
			return (void *)((ulong)ppi + ppi->ppi_offset);
		len -= ppi->size;
		ppi = (struct rndis_per_packet_info *)((ulong)ppi + ppi->size);
	}

	return NULL;
}

356 357 358 359 360
static int rndis_filter_receive_data(struct net_device *ndev,
				     struct rndis_device *dev,
				     struct rndis_message *msg,
				     struct vmbus_channel *channel,
				     void *data, u32 data_buflen)
361
{
362 363 364
	struct rndis_packet *rndis_pkt = &msg->msg.pkt;
	const struct ndis_tcp_ip_checksum_info *csum_info;
	const struct ndis_pkt_8021q_info *vlan;
365
	u32 data_offset;
366

367
	/* Remove the rndis header and pass it back up the stack */
368
	data_offset = RNDIS_HEADER_SIZE + rndis_pkt->data_offset;
369

370
	data_buflen -= data_offset;
371 372 373 374 375

	/*
	 * Make sure we got a valid RNDIS message, now total_data_buflen
	 * should be the data packet size plus the trailer padding size
	 */
376
	if (unlikely(data_buflen < rndis_pkt->data_len)) {
377
		netdev_err(dev->ndev, "rndis message buffer "
378 379
			   "overflow detected (got %u, min %u)"
			   "...dropping this message!\n",
380
			   data_buflen, rndis_pkt->data_len);
381
		return NVSP_STAT_FAIL;
382 383
	}

384 385
	vlan = rndis_get_ppi(rndis_pkt, IEEE_8021Q_INFO);

386 387 388 389 390
	/*
	 * Remove the rndis trailer padding from rndis packet message
	 * rndis_pkt->data_len tell us the real data length, we only copy
	 * the data packet to the stack, without the rndis trailer padding
	 */
391
	data = (void *)((unsigned long)data + data_offset);
392
	csum_info = rndis_get_ppi(rndis_pkt, TCPIP_CHKSUM_PKTINFO);
393 394 395
	return netvsc_recv_callback(ndev, channel,
				    data, rndis_pkt->data_len,
				    csum_info, vlan);
396 397
}

398 399 400 401 402
int rndis_filter_receive(struct net_device *ndev,
			 struct netvsc_device *net_dev,
			 struct hv_device *dev,
			 struct vmbus_channel *channel,
			 void *data, u32 buflen)
403
{
404
	struct net_device_context *net_device_ctx = netdev_priv(ndev);
405 406
	struct rndis_device *rndis_dev = net_dev->extension;
	struct rndis_message *rndis_msg = data;
407

408
	/* Make sure the rndis device state is initialized */
409 410 411 412
	if (unlikely(!rndis_dev)) {
		netif_err(net_device_ctx, rx_err, ndev,
			  "got rndis message but no rndis device!\n");
		return NVSP_STAT_FAIL;
413 414
	}

415 416 417 418
	if (unlikely(rndis_dev->state == RNDIS_DEV_UNINITIALIZED)) {
		netif_err(net_device_ctx, rx_err, ndev,
			  "got rndis message uninitialized\n");
		return NVSP_STAT_FAIL;
419 420
	}

421
	if (netif_msg_rx_status(net_device_ctx))
422
		dump_rndis_message(dev, rndis_msg);
423

424
	switch (rndis_msg->ndis_msg_type) {
425
	case RNDIS_MSG_PACKET:
426 427
		return rndis_filter_receive_data(ndev, rndis_dev, rndis_msg,
						 channel, data, buflen);
428 429 430
	case RNDIS_MSG_INIT_C:
	case RNDIS_MSG_QUERY_C:
	case RNDIS_MSG_SET_C:
431
		/* completion msgs */
432
		rndis_filter_receive_response(rndis_dev, rndis_msg);
433 434
		break;

435
	case RNDIS_MSG_INDICATE:
436
		/* notification msgs */
437
		netvsc_linkstatus_callback(dev, rndis_msg);
438 439
		break;
	default:
440
		netdev_err(ndev,
441
			"unhandled rndis message (type %u len %u)\n",
442 443
			   rndis_msg->ndis_msg_type,
			   rndis_msg->msg_len);
444 445 446
		break;
	}

447
	return 0;
448 449
}

450 451 452
static int rndis_filter_query_device(struct rndis_device *dev,
				     struct netvsc_device *nvdev,
				     u32 oid, void *result, u32 *result_size)
453
{
454
	struct rndis_request *request;
455
	u32 inresult_size = *result_size;
456
	struct rndis_query_request *query;
457
	struct rndis_query_complete *query_complete;
458
	int ret = 0;
459

460
	if (!result)
461
		return -EINVAL;
462

463
	*result_size = 0;
464
	request = get_rndis_request(dev, RNDIS_MSG_QUERY,
465 466
			RNDIS_MESSAGE_SIZE(struct rndis_query_request));
	if (!request) {
467
		ret = -ENOMEM;
468
		goto cleanup;
469 470
	}

471
	/* Setup the rndis query */
472 473 474 475 476
	query = &request->request_msg.msg.query_req;
	query->oid = oid;
	query->info_buf_offset = sizeof(struct rndis_query_request);
	query->info_buflen = 0;
	query->dev_vc_handle = 0;
477

478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504
	if (oid == OID_TCP_OFFLOAD_HARDWARE_CAPABILITIES) {
		struct ndis_offload *hwcaps;
		u32 nvsp_version = nvdev->nvsp_version;
		u8 ndis_rev;
		size_t size;

		if (nvsp_version >= NVSP_PROTOCOL_VERSION_5) {
			ndis_rev = NDIS_OFFLOAD_PARAMETERS_REVISION_3;
			size = NDIS_OFFLOAD_SIZE;
		} else if (nvsp_version >= NVSP_PROTOCOL_VERSION_4) {
			ndis_rev = NDIS_OFFLOAD_PARAMETERS_REVISION_2;
			size = NDIS_OFFLOAD_SIZE_6_1;
		} else {
			ndis_rev = NDIS_OFFLOAD_PARAMETERS_REVISION_1;
			size = NDIS_OFFLOAD_SIZE_6_0;
		}

		request->request_msg.msg_len += size;
		query->info_buflen = size;
		hwcaps = (struct ndis_offload *)
			((unsigned long)query + query->info_buf_offset);

		hwcaps->header.type = NDIS_OBJECT_TYPE_OFFLOAD;
		hwcaps->header.revision = ndis_rev;
		hwcaps->header.size = size;

	} else if (oid == OID_GEN_RECEIVE_SCALE_CAPABILITIES) {
505 506 507 508 509 510 511 512 513 514 515 516
		struct ndis_recv_scale_cap *cap;

		request->request_msg.msg_len +=
			sizeof(struct ndis_recv_scale_cap);
		query->info_buflen = sizeof(struct ndis_recv_scale_cap);
		cap = (struct ndis_recv_scale_cap *)((unsigned long)query +
						     query->info_buf_offset);
		cap->hdr.type = NDIS_OBJECT_TYPE_RSS_CAPABILITIES;
		cap->hdr.rev = NDIS_RECEIVE_SCALE_CAPABILITIES_REVISION_2;
		cap->hdr.size = sizeof(struct ndis_recv_scale_cap);
	}

517
	ret = rndis_filter_send_request(dev, request);
518
	if (ret != 0)
519
		goto cleanup;
520

521
	wait_for_completion(&request->wait_event);
522

523
	/* Copy the response back */
524
	query_complete = &request->response_msg.msg.query_complete;
525

526
	if (query_complete->info_buflen > inresult_size) {
527
		ret = -1;
528
		goto cleanup;
529 530
	}

531 532
	memcpy(result,
	       (void *)((unsigned long)query_complete +
533 534
			 query_complete->info_buf_offset),
	       query_complete->info_buflen);
535

536
	*result_size = query_complete->info_buflen;
537

538
cleanup:
539
	if (request)
540
		put_rndis_request(dev, request);
541 542 543 544

	return ret;
}

545 546
/* Get the hardware offload capabilities */
static int
547 548
rndis_query_hwcaps(struct rndis_device *dev, struct netvsc_device *net_device,
		   struct ndis_offload *caps)
549 550 551 552 553 554
{
	u32 caps_len = sizeof(*caps);
	int ret;

	memset(caps, 0, sizeof(*caps));

555
	ret = rndis_filter_query_device(dev, net_device,
556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583
					OID_TCP_OFFLOAD_HARDWARE_CAPABILITIES,
					caps, &caps_len);
	if (ret)
		return ret;

	if (caps->header.type != NDIS_OBJECT_TYPE_OFFLOAD) {
		netdev_warn(dev->ndev, "invalid NDIS objtype %#x\n",
			    caps->header.type);
		return -EINVAL;
	}

	if (caps->header.revision < NDIS_OFFLOAD_PARAMETERS_REVISION_1) {
		netdev_warn(dev->ndev, "invalid NDIS objrev %x\n",
			    caps->header.revision);
		return -EINVAL;
	}

	if (caps->header.size > caps_len ||
	    caps->header.size < NDIS_OFFLOAD_SIZE_6_0) {
		netdev_warn(dev->ndev,
			    "invalid NDIS objsize %u, data size %u\n",
			    caps->header.size, caps_len);
		return -EINVAL;
	}

	return 0;
}

584 585
static int rndis_filter_query_device_mac(struct rndis_device *dev,
					 struct netvsc_device *net_device)
586
{
587
	u32 size = ETH_ALEN;
588

589
	return rndis_filter_query_device(dev, net_device,
590
				      RNDIS_OID_802_3_PERMANENT_ADDRESS,
591
				      dev->hw_mac_adr, &size);
592 593
}

594 595 596
#define NWADR_STR "NetworkAddress"
#define NWADR_STRLEN 14

597 598
int rndis_filter_set_device_mac(struct netvsc_device *nvdev,
				const char *mac)
599 600 601 602 603 604 605 606 607 608
{
	struct rndis_device *rdev = nvdev->extension;
	struct rndis_request *request;
	struct rndis_set_request *set;
	struct rndis_config_parameter_info *cpi;
	wchar_t *cfg_nwadr, *cfg_mac;
	struct rndis_set_complete *set_complete;
	char macstr[2*ETH_ALEN+1];
	u32 extlen = sizeof(struct rndis_config_parameter_info) +
		2*NWADR_STRLEN + 4*ETH_ALEN;
609
	int ret;
610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649

	request = get_rndis_request(rdev, RNDIS_MSG_SET,
		RNDIS_MESSAGE_SIZE(struct rndis_set_request) + extlen);
	if (!request)
		return -ENOMEM;

	set = &request->request_msg.msg.set_req;
	set->oid = RNDIS_OID_GEN_RNDIS_CONFIG_PARAMETER;
	set->info_buflen = extlen;
	set->info_buf_offset = sizeof(struct rndis_set_request);
	set->dev_vc_handle = 0;

	cpi = (struct rndis_config_parameter_info *)((ulong)set +
		set->info_buf_offset);
	cpi->parameter_name_offset =
		sizeof(struct rndis_config_parameter_info);
	/* Multiply by 2 because host needs 2 bytes (utf16) for each char */
	cpi->parameter_name_length = 2*NWADR_STRLEN;
	cpi->parameter_type = RNDIS_CONFIG_PARAM_TYPE_STRING;
	cpi->parameter_value_offset =
		cpi->parameter_name_offset + cpi->parameter_name_length;
	/* Multiply by 4 because each MAC byte displayed as 2 utf16 chars */
	cpi->parameter_value_length = 4*ETH_ALEN;

	cfg_nwadr = (wchar_t *)((ulong)cpi + cpi->parameter_name_offset);
	cfg_mac = (wchar_t *)((ulong)cpi + cpi->parameter_value_offset);
	ret = utf8s_to_utf16s(NWADR_STR, NWADR_STRLEN, UTF16_HOST_ENDIAN,
			      cfg_nwadr, NWADR_STRLEN);
	if (ret < 0)
		goto cleanup;
	snprintf(macstr, 2*ETH_ALEN+1, "%pm", mac);
	ret = utf8s_to_utf16s(macstr, 2*ETH_ALEN, UTF16_HOST_ENDIAN,
			      cfg_mac, 2*ETH_ALEN);
	if (ret < 0)
		goto cleanup;

	ret = rndis_filter_send_request(rdev, request);
	if (ret != 0)
		goto cleanup;

650 651 652
	wait_for_completion(&request->wait_event);

	set_complete = &request->response_msg.msg.set_complete;
653 654
	if (set_complete->status != RNDIS_STATUS_SUCCESS)
		ret = -EIO;
655 656 657 658 659 660

cleanup:
	put_rndis_request(rdev, request);
	return ret;
}

L
Lad, Prabhakar 已提交
661
static int
662
rndis_filter_set_offload_params(struct net_device *ndev,
663
				struct netvsc_device *nvdev,
664 665 666 667 668 669 670 671
				struct ndis_offload_params *req_offloads)
{
	struct rndis_device *rdev = nvdev->extension;
	struct rndis_request *request;
	struct rndis_set_request *set;
	struct ndis_offload_params *offload_params;
	struct rndis_set_complete *set_complete;
	u32 extlen = sizeof(struct ndis_offload_params);
672
	int ret;
673 674 675 676 677 678 679 680 681 682
	u32 vsp_version = nvdev->nvsp_version;

	if (vsp_version <= NVSP_PROTOCOL_VERSION_4) {
		extlen = VERSION_4_OFFLOAD_SIZE;
		/* On NVSP_PROTOCOL_VERSION_4 and below, we do not support
		 * UDP checksum offload.
		 */
		req_offloads->udp_ip_v4_csum = 0;
		req_offloads->udp_ip_v6_csum = 0;
	}
683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705

	request = get_rndis_request(rdev, RNDIS_MSG_SET,
		RNDIS_MESSAGE_SIZE(struct rndis_set_request) + extlen);
	if (!request)
		return -ENOMEM;

	set = &request->request_msg.msg.set_req;
	set->oid = OID_TCP_OFFLOAD_PARAMETERS;
	set->info_buflen = extlen;
	set->info_buf_offset = sizeof(struct rndis_set_request);
	set->dev_vc_handle = 0;

	offload_params = (struct ndis_offload_params *)((ulong)set +
				set->info_buf_offset);
	*offload_params = *req_offloads;
	offload_params->header.type = NDIS_OBJECT_TYPE_DEFAULT;
	offload_params->header.revision = NDIS_OFFLOAD_PARAMETERS_REVISION_3;
	offload_params->header.size = extlen;

	ret = rndis_filter_send_request(rdev, request);
	if (ret != 0)
		goto cleanup;

706 707 708 709 710 711
	wait_for_completion(&request->wait_event);
	set_complete = &request->response_msg.msg.set_complete;
	if (set_complete->status != RNDIS_STATUS_SUCCESS) {
		netdev_err(ndev, "Fail to set offload on host side:0x%x\n",
			   set_complete->status);
		ret = -EINVAL;
712 713 714 715 716 717
	}

cleanup:
	put_rndis_request(rdev, request);
	return ret;
}
718

719 720
int rndis_filter_set_rss_param(struct rndis_device *rdev,
			       const u8 *rss_key, int num_queue)
721
{
722
	struct net_device *ndev = rdev->ndev;
723 724 725 726
	struct rndis_request *request;
	struct rndis_set_request *set;
	struct rndis_set_complete *set_complete;
	u32 extlen = sizeof(struct ndis_recv_scale_param) +
727
		     4 * ITAB_NUM + NETVSC_HASH_KEYLEN;
728 729 730
	struct ndis_recv_scale_param *rssp;
	u32 *itab;
	u8 *keyp;
731
	int i, ret;
732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750

	request = get_rndis_request(
			rdev, RNDIS_MSG_SET,
			RNDIS_MESSAGE_SIZE(struct rndis_set_request) + extlen);
	if (!request)
		return -ENOMEM;

	set = &request->request_msg.msg.set_req;
	set->oid = OID_GEN_RECEIVE_SCALE_PARAMETERS;
	set->info_buflen = extlen;
	set->info_buf_offset = sizeof(struct rndis_set_request);
	set->dev_vc_handle = 0;

	rssp = (struct ndis_recv_scale_param *)(set + 1);
	rssp->hdr.type = NDIS_OBJECT_TYPE_RSS_PARAMETERS;
	rssp->hdr.rev = NDIS_RECEIVE_SCALE_PARAMETERS_REVISION_2;
	rssp->hdr.size = sizeof(struct ndis_recv_scale_param);
	rssp->flag = 0;
	rssp->hashinfo = NDIS_HASH_FUNC_TOEPLITZ | NDIS_HASH_IPV4 |
751 752
			 NDIS_HASH_TCP_IPV4 | NDIS_HASH_IPV6 |
			 NDIS_HASH_TCP_IPV6;
753 754
	rssp->indirect_tabsize = 4*ITAB_NUM;
	rssp->indirect_taboffset = sizeof(struct ndis_recv_scale_param);
755
	rssp->hashkey_size = NETVSC_HASH_KEYLEN;
756 757 758 759 760 761
	rssp->kashkey_offset = rssp->indirect_taboffset +
			       rssp->indirect_tabsize;

	/* Set indirection table entries */
	itab = (u32 *)(rssp + 1);
	for (i = 0; i < ITAB_NUM; i++)
762
		itab[i] = rdev->ind_table[i];
763 764 765

	/* Set hask key values */
	keyp = (u8 *)((unsigned long)rssp + rssp->kashkey_offset);
766
	memcpy(keyp, rss_key, NETVSC_HASH_KEYLEN);
767 768 769 770 771

	ret = rndis_filter_send_request(rdev, request);
	if (ret != 0)
		goto cleanup;

772 773
	wait_for_completion(&request->wait_event);
	set_complete = &request->response_msg.msg.set_complete;
774 775 776
	if (set_complete->status == RNDIS_STATUS_SUCCESS)
		memcpy(rdev->rss_key, rss_key, NETVSC_HASH_KEYLEN);
	else {
777 778 779
		netdev_err(ndev, "Fail to set RSS parameters:0x%x\n",
			   set_complete->status);
		ret = -EINVAL;
780 781 782 783 784 785 786
	}

cleanup:
	put_rndis_request(rdev, request);
	return ret;
}

787 788
static int rndis_filter_query_device_link_status(struct rndis_device *dev,
						 struct netvsc_device *net_device)
789
{
790
	u32 size = sizeof(u32);
791
	u32 link_status;
792

793 794 795
	return rndis_filter_query_device(dev, net_device,
					 RNDIS_OID_GEN_MEDIA_CONNECT_STATUS,
					 &link_status, &size);
796 797
}

798 799
static int rndis_filter_query_link_speed(struct rndis_device *dev,
					 struct netvsc_device *net_device)
800 801 802 803 804 805
{
	u32 size = sizeof(u32);
	u32 link_speed;
	struct net_device_context *ndc;
	int ret;

806 807
	ret = rndis_filter_query_device(dev, net_device,
					RNDIS_OID_GEN_LINK_SPEED,
808 809 810 811 812 813 814 815 816 817 818 819 820 821
					&link_speed, &size);

	if (!ret) {
		ndc = netdev_priv(dev->ndev);

		/* The link speed reported from host is in 100bps unit, so
		 * we convert it to Mbps here.
		 */
		ndc->speed = link_speed / 10000;
	}

	return ret;
}

822 823
static int rndis_filter_set_packet_filter(struct rndis_device *dev,
					  u32 new_filter)
824
{
825
	struct rndis_request *request;
826
	struct rndis_set_request *set;
827
	int ret;
828

829
	request = get_rndis_request(dev, RNDIS_MSG_SET,
830 831
			RNDIS_MESSAGE_SIZE(struct rndis_set_request) +
			sizeof(u32));
832 833 834
	if (!request)
		return -ENOMEM;

835

836
	/* Setup the rndis set */
837 838 839 840
	set = &request->request_msg.msg.set_req;
	set->oid = RNDIS_OID_GEN_CURRENT_PACKET_FILTER;
	set->info_buflen = sizeof(u32);
	set->info_buf_offset = sizeof(struct rndis_set_request);
841

842
	memcpy((void *)(unsigned long)set + sizeof(struct rndis_set_request),
843
	       &new_filter, sizeof(u32));
844

845
	ret = rndis_filter_send_request(dev, request);
846 847
	if (ret == 0)
		wait_for_completion(&request->wait_event);
848

849
	put_rndis_request(dev, request);
850

851 852 853
	return ret;
}

854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875
static void rndis_set_multicast(struct work_struct *w)
{
	struct rndis_device *rdev
		= container_of(w, struct rndis_device, mcast_work);

	if (rdev->ndev->flags & IFF_PROMISC)
		rndis_filter_set_packet_filter(rdev,
					       NDIS_PACKET_TYPE_PROMISCUOUS);
	else
		rndis_filter_set_packet_filter(rdev,
					       NDIS_PACKET_TYPE_BROADCAST |
					       NDIS_PACKET_TYPE_ALL_MULTICAST |
					       NDIS_PACKET_TYPE_DIRECTED);
}

void rndis_filter_update(struct netvsc_device *nvdev)
{
	struct rndis_device *rdev = nvdev->extension;

	schedule_work(&rdev->mcast_work);
}

876 877
static int rndis_filter_init_device(struct rndis_device *dev,
				    struct netvsc_device *nvdev)
878
{
879
	struct rndis_request *request;
880
	struct rndis_initialize_request *init;
881
	struct rndis_initialize_complete *init_complete;
882
	u32 status;
883
	int ret;
884

885
	request = get_rndis_request(dev, RNDIS_MSG_INIT,
886 887
			RNDIS_MESSAGE_SIZE(struct rndis_initialize_request));
	if (!request) {
888
		ret = -ENOMEM;
889
		goto cleanup;
890 891
	}

892
	/* Setup the rndis set */
893 894 895
	init = &request->request_msg.msg.init_req;
	init->major_ver = RNDIS_MAJOR_VERSION;
	init->minor_ver = RNDIS_MINOR_VERSION;
896
	init->max_xfer_size = 0x4000;
897

898
	dev->state = RNDIS_DEV_INITIALIZING;
899

900
	ret = rndis_filter_send_request(dev, request);
901
	if (ret != 0) {
902
		dev->state = RNDIS_DEV_UNINITIALIZED;
903
		goto cleanup;
904 905
	}

906
	wait_for_completion(&request->wait_event);
907

908 909
	init_complete = &request->response_msg.msg.init_complete;
	status = init_complete->status;
910
	if (status == RNDIS_STATUS_SUCCESS) {
911
		dev->state = RNDIS_DEV_INITIALIZED;
912 913
		nvdev->max_pkt = init_complete->max_pkt_per_msg;
		nvdev->pkt_align = 1 << init_complete->pkt_alignment_factor;
914
		ret = 0;
915
	} else {
916
		dev->state = RNDIS_DEV_UNINITIALIZED;
917
		ret = -EINVAL;
918 919
	}

920
cleanup:
921
	if (request)
922
		put_rndis_request(dev, request);
923 924 925 926

	return ret;
}

927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943
static bool netvsc_device_idle(const struct netvsc_device *nvdev)
{
	int i;

	if (atomic_read(&nvdev->num_outstanding_recvs) > 0)
		return false;

	for (i = 0; i < nvdev->num_chn; i++) {
		const struct netvsc_channel *nvchan = &nvdev->chan_table[i];

		if (atomic_read(&nvchan->queue_sends) > 0)
			return false;
	}

	return true;
}

944
static void rndis_filter_halt_device(struct rndis_device *dev)
945
{
946
	struct rndis_request *request;
947
	struct rndis_halt_request *halt;
948
	struct net_device_context *net_device_ctx = netdev_priv(dev->ndev);
949
	struct netvsc_device *nvdev = rtnl_dereference(net_device_ctx->nvdev);
950

951
	/* Attempt to do a rndis device halt */
952
	request = get_rndis_request(dev, RNDIS_MSG_HALT,
953
				RNDIS_MESSAGE_SIZE(struct rndis_halt_request));
954
	if (!request)
955
		goto cleanup;
956

957
	/* Setup the rndis set */
958 959
	halt = &request->request_msg.msg.halt_req;
	halt->req_id = atomic_inc_return(&dev->new_req_id);
960

961
	/* Ignore return since this msg is optional. */
962
	rndis_filter_send_request(dev, request);
963

964
	dev->state = RNDIS_DEV_UNINITIALIZED;
965

966
cleanup:
967
	nvdev->destroy = true;
968 969 970

	/* Force flag to be ordered before waiting */
	wmb();
971 972

	/* Wait for all send completions */
973
	wait_event(nvdev->wait_drain, netvsc_device_idle(nvdev));
974

975
	if (request)
976
		put_rndis_request(dev, request);
977 978
}

979
static int rndis_filter_open_device(struct rndis_device *dev)
980
{
981
	int ret;
982

983
	if (dev->state != RNDIS_DEV_INITIALIZED)
984 985
		return 0;

986
	ret = rndis_filter_set_packet_filter(dev,
987
					 NDIS_PACKET_TYPE_BROADCAST |
988
					 NDIS_PACKET_TYPE_ALL_MULTICAST |
989
					 NDIS_PACKET_TYPE_DIRECTED);
990
	if (ret == 0)
991
		dev->state = RNDIS_DEV_DATAINITIALIZED;
992 993 994 995

	return ret;
}

996
static int rndis_filter_close_device(struct rndis_device *dev)
997 998 999
{
	int ret;

1000
	if (dev->state != RNDIS_DEV_DATAINITIALIZED)
1001 1002
		return 0;

1003 1004 1005
	/* Make sure rndis_set_multicast doesn't re-enable filter! */
	cancel_work_sync(&dev->mcast_work);

1006
	ret = rndis_filter_set_packet_filter(dev, 0);
1007 1008 1009
	if (ret == -ENODEV)
		ret = 0;

1010
	if (ret == 0)
1011
		dev->state = RNDIS_DEV_INITIALIZED;
1012 1013 1014 1015

	return ret;
}

1016 1017
static void netvsc_sc_open(struct vmbus_channel *new_sc)
{
1018 1019
	struct net_device *ndev =
		hv_get_drvdata(new_sc->primary_channel->device_obj);
1020 1021
	struct net_device_context *ndev_ctx = netdev_priv(ndev);
	struct netvsc_device *nvscdev;
1022
	u16 chn_index = new_sc->offermsg.offer.sub_channel_index;
1023 1024
	struct netvsc_channel *nvchan;
	int ret;
1025

1026 1027 1028 1029 1030
	/* This is safe because this callback only happens when
	 * new device is being setup and waiting on the channel_init_wait.
	 */
	nvscdev = rcu_dereference_raw(ndev_ctx->nvdev);
	if (!nvscdev || chn_index >= nvscdev->num_chn)
1031 1032
		return;

1033 1034
	nvchan = nvscdev->chan_table + chn_index;
	nvchan->mrc.buf
1035
		= vzalloc(NETVSC_RECVSLOT_MAX * sizeof(struct recv_comp_data));
1036

1037 1038 1039
	if (!nvchan->mrc.buf)
		return;

1040 1041 1042 1043 1044
	/* Because the device uses NAPI, all the interrupt batching and
	 * control is done via Net softirq, not the channel handling
	 */
	set_channel_read_mode(new_sc, HV_CALL_ISR);

1045 1046
	/* Set the channel before opening.*/
	nvchan->channel = new_sc;
1047 1048
	netif_napi_add(ndev, &nvchan->napi,
		       netvsc_poll, NAPI_POLL_WEIGHT);
1049

1050 1051
	ret = vmbus_open(new_sc, nvscdev->ring_size * PAGE_SIZE,
			 nvscdev->ring_size * PAGE_SIZE, NULL, 0,
1052
			 netvsc_channel_cb, nvchan);
1053 1054 1055
	if (ret == 0)
		napi_enable(&nvchan->napi);
	else
1056
		netif_napi_del(&nvchan->napi);
S
stephen hemminger 已提交
1057

1058
	if (refcount_dec_and_test(&nvscdev->sc_offered))
1059
		complete(&nvscdev->channel_init_wait);
1060 1061
}

1062 1063
struct netvsc_device *rndis_filter_device_add(struct hv_device *dev,
				      struct netvsc_device_info *device_info)
1064
{
1065 1066
	struct net_device *net = hv_get_drvdata(dev);
	struct net_device_context *net_device_ctx = netdev_priv(net);
1067
	struct netvsc_device *net_device;
1068
	struct rndis_device *rndis_device;
1069
	struct ndis_offload hwcaps;
1070
	struct ndis_offload_params offloads;
1071 1072 1073
	struct nvsp_message *init_packet;
	struct ndis_recv_scale_cap rsscap;
	u32 rsscap_size = sizeof(struct ndis_recv_scale_cap);
1074
	unsigned int gso_max_size = GSO_MAX_SIZE;
1075
	u32 mtu, size, num_rss_qs;
1076 1077
	const struct cpumask *node_cpu_mask;
	u32 num_possible_rss_qs;
1078
	int i, ret;
1079

1080 1081
	rndis_device = get_rndis_device();
	if (!rndis_device)
1082
		return ERR_PTR(-ENODEV);
1083

1084 1085 1086 1087 1088
	/*
	 * Let the inner driver handle this first to create the netvsc channel
	 * NOTE! Once the channel is created, we may get a receive callback
	 * (RndisFilterOnReceive()) before this call is completed
	 */
1089 1090
	net_device = netvsc_device_add(dev, device_info);
	if (IS_ERR(net_device)) {
1091
		kfree(rndis_device);
1092
		return net_device;
1093 1094
	}

1095
	/* Initialize the rndis device */
1096
	net_device->max_chn = 1;
1097
	net_device->num_chn = 1;
1098

1099
	refcount_set(&net_device->sc_offered, 0);
1100

1101
	net_device->extension = rndis_device;
1102
	rndis_device->ndev = net;
1103

1104
	/* Send the rndis initialization message */
1105
	ret = rndis_filter_init_device(rndis_device, net_device);
1106 1107
	if (ret != 0)
		goto err_dev_remv;
1108

1109 1110
	/* Get the MTU from the host */
	size = sizeof(u32);
1111
	ret = rndis_filter_query_device(rndis_device, net_device,
1112 1113
					RNDIS_OID_GEN_MAXIMUM_FRAME_SIZE,
					&mtu, &size);
1114 1115
	if (ret == 0 && size == sizeof(u32) && mtu < net->mtu)
		net->mtu = mtu;
1116

1117
	/* Get the mac address */
1118
	ret = rndis_filter_query_device_mac(rndis_device, net_device);
1119 1120
	if (ret != 0)
		goto err_dev_remv;
1121

1122
	memcpy(device_info->mac_adr, rndis_device->hw_mac_adr, ETH_ALEN);
1123

1124
	/* Find HW offload capabilities */
1125
	ret = rndis_query_hwcaps(rndis_device, net_device, &hwcaps);
1126 1127
	if (ret != 0)
		goto err_dev_remv;
1128 1129

	/* A value of zero means "no change"; now turn on what we want. */
1130
	memset(&offloads, 0, sizeof(struct ndis_offload_params));
1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180

	/* Linux does not care about IP checksum, always does in kernel */
	offloads.ip_v4_csum = NDIS_OFFLOAD_PARAMETERS_TX_RX_DISABLED;

	/* Compute tx offload settings based on hw capabilities */
	net->hw_features = NETIF_F_RXCSUM;

	if ((hwcaps.csum.ip4_txcsum & NDIS_TXCSUM_ALL_TCP4) == NDIS_TXCSUM_ALL_TCP4) {
		/* Can checksum TCP */
		net->hw_features |= NETIF_F_IP_CSUM;
		net_device_ctx->tx_checksum_mask |= TRANSPORT_INFO_IPV4_TCP;

		offloads.tcp_ip_v4_csum = NDIS_OFFLOAD_PARAMETERS_TX_RX_ENABLED;

		if (hwcaps.lsov2.ip4_encap & NDIS_OFFLOAD_ENCAP_8023) {
			offloads.lso_v2_ipv4 = NDIS_OFFLOAD_PARAMETERS_LSOV2_ENABLED;
			net->hw_features |= NETIF_F_TSO;

			if (hwcaps.lsov2.ip4_maxsz < gso_max_size)
				gso_max_size = hwcaps.lsov2.ip4_maxsz;
		}

		if (hwcaps.csum.ip4_txcsum & NDIS_TXCSUM_CAP_UDP4) {
			offloads.udp_ip_v4_csum = NDIS_OFFLOAD_PARAMETERS_TX_RX_ENABLED;
			net_device_ctx->tx_checksum_mask |= TRANSPORT_INFO_IPV4_UDP;
		}
	}

	if ((hwcaps.csum.ip6_txcsum & NDIS_TXCSUM_ALL_TCP6) == NDIS_TXCSUM_ALL_TCP6) {
		net->hw_features |= NETIF_F_IPV6_CSUM;

		offloads.tcp_ip_v6_csum = NDIS_OFFLOAD_PARAMETERS_TX_RX_ENABLED;
		net_device_ctx->tx_checksum_mask |= TRANSPORT_INFO_IPV6_TCP;

		if ((hwcaps.lsov2.ip6_encap & NDIS_OFFLOAD_ENCAP_8023) &&
		    (hwcaps.lsov2.ip6_opts & NDIS_LSOV2_CAP_IP6) == NDIS_LSOV2_CAP_IP6) {
			offloads.lso_v2_ipv6 = NDIS_OFFLOAD_PARAMETERS_LSOV2_ENABLED;
			net->hw_features |= NETIF_F_TSO6;

			if (hwcaps.lsov2.ip6_maxsz < gso_max_size)
				gso_max_size = hwcaps.lsov2.ip6_maxsz;
		}

		if (hwcaps.csum.ip6_txcsum & NDIS_TXCSUM_CAP_UDP6) {
			offloads.udp_ip_v6_csum = NDIS_OFFLOAD_PARAMETERS_TX_RX_ENABLED;
			net_device_ctx->tx_checksum_mask |= TRANSPORT_INFO_IPV6_UDP;
		}
	}

	netif_set_gso_max_size(net, gso_max_size);
1181

1182
	ret = rndis_filter_set_offload_params(net, net_device, &offloads);
1183 1184 1185
	if (ret)
		goto err_dev_remv;

1186
	rndis_filter_query_device_link_status(rndis_device, net_device);
1187

1188 1189
	netdev_dbg(net, "Device MAC %pM link state %s\n",
		   rndis_device->hw_mac_adr,
1190
		   rndis_device->link_state ? "down" : "up");
1191

1192
	if (net_device->nvsp_version < NVSP_PROTOCOL_VERSION_5)
1193
		return net_device;
1194

1195
	rndis_filter_query_link_speed(rndis_device, net_device);
1196

1197 1198
	/* vRSS setup */
	memset(&rsscap, 0, rsscap_size);
1199
	ret = rndis_filter_query_device(rndis_device, net_device,
1200 1201 1202 1203 1204
					OID_GEN_RECEIVE_SCALE_CAPABILITIES,
					&rsscap, &rsscap_size);
	if (ret || rsscap.num_recv_que < 2)
		goto out;

1205 1206 1207
	/*
	 * We will limit the VRSS channels to the number CPUs in the NUMA node
	 * the primary channel is currently bound to.
1208 1209
	 *
	 * This also guarantees that num_possible_rss_qs <= num_online_cpus
1210 1211
	 */
	node_cpu_mask = cpumask_of_node(cpu_to_node(dev->channel->target_cpu));
1212 1213
	num_possible_rss_qs = min_t(u32, cpumask_weight(node_cpu_mask),
				    rsscap.num_recv_que);
1214

1215
	net_device->max_chn = min_t(u32, VRSS_CHANNEL_MAX, num_possible_rss_qs);
1216

1217 1218
	/* We will use the given number of channels if available. */
	net_device->num_chn = min(net_device->max_chn, device_info->num_chn);
1219 1220 1221 1222 1223

	for (i = 0; i < ITAB_NUM; i++)
		rndis_device->ind_table[i] = ethtool_rxfh_indir_default(i,
							net_device->num_chn);

1224 1225
	num_rss_qs = net_device->num_chn - 1;
	if (num_rss_qs == 0)
1226
		return net_device;
1227

1228
	refcount_set(&net_device->sc_offered, num_rss_qs);
1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243
	vmbus_set_sc_create_callback(dev->channel, netvsc_sc_open);

	init_packet = &net_device->channel_init_pkt;
	memset(init_packet, 0, sizeof(struct nvsp_message));
	init_packet->hdr.msg_type = NVSP_MSG5_TYPE_SUBCHANNEL;
	init_packet->msg.v5_msg.subchn_req.op = NVSP_SUBCHANNEL_ALLOCATE;
	init_packet->msg.v5_msg.subchn_req.num_subchannels =
						net_device->num_chn - 1;
	ret = vmbus_sendpacket(dev->channel, init_packet,
			       sizeof(struct nvsp_message),
			       (unsigned long)init_packet,
			       VM_PKT_DATA_INBAND,
			       VMBUS_DATA_PACKET_FLAG_COMPLETION_REQUESTED);
	if (ret)
		goto out;
1244

1245
	if (init_packet->msg.v5_msg.subchn_comp.status != NVSP_STAT_SUCCESS) {
1246 1247 1248
		ret = -ENODEV;
		goto out;
	}
1249 1250
	wait_for_completion(&net_device->channel_init_wait);

1251 1252 1253
	net_device->num_chn = 1 +
		init_packet->msg.v5_msg.subchn_comp.num_subchannels;

1254 1255 1256
	/* ignore failues from setting rss parameters, still have channels */
	rndis_filter_set_rss_param(rndis_device, netvsc_hash_key,
				   net_device->num_chn);
1257
out:
1258 1259
	if (ret) {
		net_device->max_chn = 1;
1260
		net_device->num_chn = 1;
1261
	}
1262

1263
	return net_device;
1264 1265

err_dev_remv:
1266
	rndis_filter_device_remove(dev, net_device);
1267
	return ERR_PTR(ret);
1268 1269
}

1270 1271
void rndis_filter_device_remove(struct hv_device *dev,
				struct netvsc_device *net_dev)
1272
{
1273
	struct rndis_device *rndis_dev = net_dev->extension;
1274

1275
	/* Halt and release the rndis device */
1276
	rndis_filter_halt_device(rndis_dev);
1277

1278
	kfree(rndis_dev);
1279
	net_dev->extension = NULL;
1280

1281
	netvsc_device_remove(dev);
1282 1283
}

1284
int rndis_filter_open(struct netvsc_device *nvdev)
1285
{
1286
	if (!nvdev)
1287 1288
		return -EINVAL;

1289
	if (atomic_inc_return(&nvdev->open_cnt) != 1)
1290 1291
		return 0;

1292
	return rndis_filter_open_device(nvdev->extension);
1293 1294
}

1295
int rndis_filter_close(struct netvsc_device *nvdev)
1296
{
1297
	if (!nvdev)
1298 1299
		return -EINVAL;

1300 1301 1302
	if (atomic_dec_return(&nvdev->open_cnt) != 0)
		return 0;

1303
	return rndis_filter_close_device(nvdev->extension);
1304
}
1305 1306 1307 1308 1309

bool rndis_filter_opened(const struct netvsc_device *nvdev)
{
	return atomic_read(&nvdev->open_cnt) > 0;
}