rndis_filter.c 37.0 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
	struct hv_netvsc_packet *packet;
218
	struct hv_page_buffer page_buf[2];
219
	struct hv_page_buffer *pb = page_buf;
220
	struct net_device_context *net_device_ctx = netdev_priv(dev->ndev);
221
	int ret;
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
int rndis_filter_set_rss_param(struct rndis_device *rdev,
720
			       const u8 *rss_key)
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
static bool netvsc_device_idle(const struct netvsc_device *nvdev)
{
	int i;

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

934 935 936
		if (nvchan->mrc.first != nvchan->mrc.next)
			return false;

937 938 939 940 941 942 943
		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;

1035 1036 1037 1038 1039
	/* 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);

1040 1041 1042
	/* Set the channel before opening.*/
	nvchan->channel = new_sc;

1043 1044
	ret = vmbus_open(new_sc, nvscdev->ring_size * PAGE_SIZE,
			 nvscdev->ring_size * PAGE_SIZE, NULL, 0,
1045
			 netvsc_channel_cb, nvchan);
1046 1047 1048
	if (ret == 0)
		napi_enable(&nvchan->napi);
	else
1049
		netdev_notice(ndev, "sub channel open failed: %d\n", ret);
S
stephen hemminger 已提交
1050

1051 1052
	if (atomic_inc_return(&nvscdev->open_chn) == nvscdev->num_chn)
		wake_up(&nvscdev->subchan_open);
1053 1054
}

1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130
/* Open sub-channels after completing the handling of the device probe.
 * This breaks overlap of processing the host message for the
 * new primary channel with the initialization of sub-channels.
 */
void rndis_set_subchannel(struct work_struct *w)
{
	struct netvsc_device *nvdev
		= container_of(w, struct netvsc_device, subchan_work);
	struct nvsp_message *init_packet = &nvdev->channel_init_pkt;
	struct net_device_context *ndev_ctx;
	struct rndis_device *rdev;
	struct net_device *ndev;
	struct hv_device *hv_dev;
	int i, ret;

	if (!rtnl_trylock()) {
		schedule_work(w);
		return;
	}

	rdev = nvdev->extension;
	if (!rdev)
		goto unlock;	/* device was removed */

	ndev = rdev->ndev;
	ndev_ctx = netdev_priv(ndev);
	hv_dev = ndev_ctx->device_ctx;

	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 =
						nvdev->num_chn - 1;
	ret = vmbus_sendpacket(hv_dev->channel, init_packet,
			       sizeof(struct nvsp_message),
			       (unsigned long)init_packet,
			       VM_PKT_DATA_INBAND,
			       VMBUS_DATA_PACKET_FLAG_COMPLETION_REQUESTED);
	if (ret) {
		netdev_err(ndev, "sub channel allocate send failed: %d\n", ret);
		goto failed;
	}

	wait_for_completion(&nvdev->channel_init_wait);
	if (init_packet->msg.v5_msg.subchn_comp.status != NVSP_STAT_SUCCESS) {
		netdev_err(ndev, "sub channel request failed\n");
		goto failed;
	}

	nvdev->num_chn = 1 +
		init_packet->msg.v5_msg.subchn_comp.num_subchannels;

	/* wait for all sub channels to open */
	wait_event(nvdev->subchan_open,
		   atomic_read(&nvdev->open_chn) == nvdev->num_chn);

	/* ignore failues from setting rss parameters, still have channels */
	rndis_filter_set_rss_param(rdev, netvsc_hash_key);

	netif_set_real_num_tx_queues(ndev, nvdev->num_chn);
	netif_set_real_num_rx_queues(ndev, nvdev->num_chn);

	rtnl_unlock();
	return;

failed:
	/* fallback to only primary channel */
	for (i = 1; i < nvdev->num_chn; i++)
		netif_napi_del(&nvdev->chan_table[i].napi);

	nvdev->max_chn = 1;
	nvdev->num_chn = 1;
unlock:
	rtnl_unlock();
}

1131 1132
struct netvsc_device *rndis_filter_device_add(struct hv_device *dev,
				      struct netvsc_device_info *device_info)
1133
{
1134 1135
	struct net_device *net = hv_get_drvdata(dev);
	struct net_device_context *net_device_ctx = netdev_priv(net);
1136
	struct netvsc_device *net_device;
1137
	struct rndis_device *rndis_device;
1138
	struct ndis_offload hwcaps;
1139
	struct ndis_offload_params offloads;
1140 1141
	struct ndis_recv_scale_cap rsscap;
	u32 rsscap_size = sizeof(struct ndis_recv_scale_cap);
1142
	unsigned int gso_max_size = GSO_MAX_SIZE;
1143
	u32 mtu, size;
1144 1145
	const struct cpumask *node_cpu_mask;
	u32 num_possible_rss_qs;
1146
	int i, ret;
1147

1148 1149
	rndis_device = get_rndis_device();
	if (!rndis_device)
1150
		return ERR_PTR(-ENODEV);
1151

1152 1153 1154 1155 1156
	/*
	 * 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
	 */
1157 1158
	net_device = netvsc_device_add(dev, device_info);
	if (IS_ERR(net_device)) {
1159
		kfree(rndis_device);
1160
		return net_device;
1161 1162
	}

1163
	/* Initialize the rndis device */
1164
	net_device->max_chn = 1;
1165
	net_device->num_chn = 1;
1166

1167
	net_device->extension = rndis_device;
1168
	rndis_device->ndev = net;
1169

1170
	/* Send the rndis initialization message */
1171
	ret = rndis_filter_init_device(rndis_device, net_device);
1172 1173
	if (ret != 0)
		goto err_dev_remv;
1174

1175 1176
	/* Get the MTU from the host */
	size = sizeof(u32);
1177
	ret = rndis_filter_query_device(rndis_device, net_device,
1178 1179
					RNDIS_OID_GEN_MAXIMUM_FRAME_SIZE,
					&mtu, &size);
1180 1181
	if (ret == 0 && size == sizeof(u32) && mtu < net->mtu)
		net->mtu = mtu;
1182

1183
	/* Get the mac address */
1184
	ret = rndis_filter_query_device_mac(rndis_device, net_device);
1185 1186
	if (ret != 0)
		goto err_dev_remv;
1187

1188
	memcpy(device_info->mac_adr, rndis_device->hw_mac_adr, ETH_ALEN);
1189

1190
	/* Find HW offload capabilities */
1191
	ret = rndis_query_hwcaps(rndis_device, net_device, &hwcaps);
1192 1193
	if (ret != 0)
		goto err_dev_remv;
1194 1195

	/* A value of zero means "no change"; now turn on what we want. */
1196
	memset(&offloads, 0, sizeof(struct ndis_offload_params));
1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246

	/* 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);
1247

1248
	ret = rndis_filter_set_offload_params(net, net_device, &offloads);
1249 1250 1251
	if (ret)
		goto err_dev_remv;

1252
	rndis_filter_query_device_link_status(rndis_device, net_device);
1253

1254 1255
	netdev_dbg(net, "Device MAC %pM link state %s\n",
		   rndis_device->hw_mac_adr,
1256
		   rndis_device->link_state ? "down" : "up");
1257

1258
	if (net_device->nvsp_version < NVSP_PROTOCOL_VERSION_5)
1259
		return net_device;
1260

1261
	rndis_filter_query_link_speed(rndis_device, net_device);
1262

1263 1264
	/* vRSS setup */
	memset(&rsscap, 0, rsscap_size);
1265
	ret = rndis_filter_query_device(rndis_device, net_device,
1266 1267 1268 1269 1270
					OID_GEN_RECEIVE_SCALE_CAPABILITIES,
					&rsscap, &rsscap_size);
	if (ret || rsscap.num_recv_que < 2)
		goto out;

1271 1272 1273
	/*
	 * We will limit the VRSS channels to the number CPUs in the NUMA node
	 * the primary channel is currently bound to.
1274 1275
	 *
	 * This also guarantees that num_possible_rss_qs <= num_online_cpus
1276 1277
	 */
	node_cpu_mask = cpumask_of_node(cpu_to_node(dev->channel->target_cpu));
1278 1279
	num_possible_rss_qs = min_t(u32, cpumask_weight(node_cpu_mask),
				    rsscap.num_recv_que);
1280

1281
	net_device->max_chn = min_t(u32, VRSS_CHANNEL_MAX, num_possible_rss_qs);
1282

1283 1284
	/* We will use the given number of channels if available. */
	net_device->num_chn = min(net_device->max_chn, device_info->num_chn);
1285 1286 1287 1288 1289

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

1290
	atomic_set(&net_device->open_chn, 1);
1291
	vmbus_set_sc_create_callback(dev->channel, netvsc_sc_open);
1292

1293 1294 1295 1296 1297 1298 1299 1300 1301
	for (i = 1; i < net_device->num_chn; i++) {
		ret = netvsc_alloc_recv_comp_ring(net_device, i);
		if (ret) {
			while (--i != 0)
				vfree(net_device->chan_table[i].mrc.slots);
			goto out;
		}
	}

1302 1303 1304
	for (i = 1; i < net_device->num_chn; i++)
		netif_napi_add(net, &net_device->chan_table[i].napi,
			       netvsc_poll, NAPI_POLL_WEIGHT);
1305

1306 1307
	if (net_device->num_chn > 1)
		schedule_work(&net_device->subchan_work);
1308

1309
out:
1310
	/* if unavailable, just proceed with one queue */
1311 1312
	if (ret) {
		net_device->max_chn = 1;
1313
		net_device->num_chn = 1;
1314
	}
1315

1316
	return net_device;
1317 1318

err_dev_remv:
1319
	rndis_filter_device_remove(dev, net_device);
1320
	return ERR_PTR(ret);
1321 1322
}

1323 1324
void rndis_filter_device_remove(struct hv_device *dev,
				struct netvsc_device *net_dev)
1325
{
1326
	struct rndis_device *rndis_dev = net_dev->extension;
1327

1328
	/* Halt and release the rndis device */
1329
	rndis_filter_halt_device(rndis_dev);
1330

1331
	net_dev->extension = NULL;
1332

1333
	netvsc_device_remove(dev);
1334
	kfree(rndis_dev);
1335 1336
}

1337
int rndis_filter_open(struct netvsc_device *nvdev)
1338
{
1339
	if (!nvdev)
1340 1341
		return -EINVAL;

1342
	if (atomic_inc_return(&nvdev->open_cnt) != 1)
1343 1344
		return 0;

1345
	return rndis_filter_open_device(nvdev->extension);
1346 1347
}

1348
int rndis_filter_close(struct netvsc_device *nvdev)
1349
{
1350
	if (!nvdev)
1351 1352
		return -EINVAL;

1353 1354 1355
	if (atomic_dec_return(&nvdev->open_cnt) != 0)
		return 0;

1356
	return rndis_filter_close_device(nvdev->extension);
1357
}
1358 1359 1360 1361 1362

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