Linux Audio

Check our new training course

Loading...
Note: File does not exist in v6.13.7.
   1/*******************************************************************************
   2 *
   3 * Intel Ethernet Controller XL710 Family Linux Virtual Function Driver
   4 * Copyright(c) 2013 - 2014 Intel Corporation.
   5 *
   6 * This program is free software; you can redistribute it and/or modify it
   7 * under the terms and conditions of the GNU General Public License,
   8 * version 2, as published by the Free Software Foundation.
   9 *
  10 * This program is distributed in the hope it will be useful, but WITHOUT
  11 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  12 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
  13 * more details.
  14 *
  15 * You should have received a copy of the GNU General Public License along
  16 * with this program.  If not, see <http://www.gnu.org/licenses/>.
  17 *
  18 * The full GNU General Public License is included in this distribution in
  19 * the file called "COPYING".
  20 *
  21 * Contact Information:
  22 * e1000-devel Mailing List <e1000-devel@lists.sourceforge.net>
  23 * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
  24 *
  25 ******************************************************************************/
  26
  27#include "i40evf.h"
  28#include "i40e_prototype.h"
  29
  30/* busy wait delay in msec */
  31#define I40EVF_BUSY_WAIT_DELAY 10
  32#define I40EVF_BUSY_WAIT_COUNT 50
  33
  34/**
  35 * i40evf_send_pf_msg
  36 * @adapter: adapter structure
  37 * @op: virtual channel opcode
  38 * @msg: pointer to message buffer
  39 * @len: message length
  40 *
  41 * Send message to PF and print status if failure.
  42 **/
  43static int i40evf_send_pf_msg(struct i40evf_adapter *adapter,
  44			      enum i40e_virtchnl_ops op, u8 *msg, u16 len)
  45{
  46	struct i40e_hw *hw = &adapter->hw;
  47	i40e_status err;
  48
  49	if (adapter->flags & I40EVF_FLAG_PF_COMMS_FAILED)
  50		return 0; /* nothing to see here, move along */
  51
  52	err = i40e_aq_send_msg_to_pf(hw, op, 0, msg, len, NULL);
  53	if (err)
  54		dev_err(&adapter->pdev->dev, "Unable to send opcode %d to PF, err %s, aq_err %s\n",
  55			op, i40evf_stat_str(hw, err),
  56			i40evf_aq_str(hw, hw->aq.asq_last_status));
  57	return err;
  58}
  59
  60/**
  61 * i40evf_send_api_ver
  62 * @adapter: adapter structure
  63 *
  64 * Send API version admin queue message to the PF. The reply is not checked
  65 * in this function. Returns 0 if the message was successfully
  66 * sent, or one of the I40E_ADMIN_QUEUE_ERROR_ statuses if not.
  67 **/
  68int i40evf_send_api_ver(struct i40evf_adapter *adapter)
  69{
  70	struct i40e_virtchnl_version_info vvi;
  71
  72	vvi.major = I40E_VIRTCHNL_VERSION_MAJOR;
  73	vvi.minor = I40E_VIRTCHNL_VERSION_MINOR;
  74
  75	return i40evf_send_pf_msg(adapter, I40E_VIRTCHNL_OP_VERSION, (u8 *)&vvi,
  76				  sizeof(vvi));
  77}
  78
  79/**
  80 * i40evf_verify_api_ver
  81 * @adapter: adapter structure
  82 *
  83 * Compare API versions with the PF. Must be called after admin queue is
  84 * initialized. Returns 0 if API versions match, -EIO if they do not,
  85 * I40E_ERR_ADMIN_QUEUE_NO_WORK if the admin queue is empty, and any errors
  86 * from the firmware are propagated.
  87 **/
  88int i40evf_verify_api_ver(struct i40evf_adapter *adapter)
  89{
  90	struct i40e_virtchnl_version_info *pf_vvi;
  91	struct i40e_hw *hw = &adapter->hw;
  92	struct i40e_arq_event_info event;
  93	enum i40e_virtchnl_ops op;
  94	i40e_status err;
  95
  96	event.buf_len = I40EVF_MAX_AQ_BUF_SIZE;
  97	event.msg_buf = kzalloc(event.buf_len, GFP_KERNEL);
  98	if (!event.msg_buf) {
  99		err = -ENOMEM;
 100		goto out;
 101	}
 102
 103	while (1) {
 104		err = i40evf_clean_arq_element(hw, &event, NULL);
 105		/* When the AQ is empty, i40evf_clean_arq_element will return
 106		 * nonzero and this loop will terminate.
 107		 */
 108		if (err)
 109			goto out_alloc;
 110		op =
 111		    (enum i40e_virtchnl_ops)le32_to_cpu(event.desc.cookie_high);
 112		if (op == I40E_VIRTCHNL_OP_VERSION)
 113			break;
 114	}
 115
 116
 117	err = (i40e_status)le32_to_cpu(event.desc.cookie_low);
 118	if (err)
 119		goto out_alloc;
 120
 121	if (op != I40E_VIRTCHNL_OP_VERSION) {
 122		dev_info(&adapter->pdev->dev, "Invalid reply type %d from PF\n",
 123			op);
 124		err = -EIO;
 125		goto out_alloc;
 126	}
 127
 128	pf_vvi = (struct i40e_virtchnl_version_info *)event.msg_buf;
 129	adapter->pf_version = *pf_vvi;
 130
 131	if ((pf_vvi->major > I40E_VIRTCHNL_VERSION_MAJOR) ||
 132	    ((pf_vvi->major == I40E_VIRTCHNL_VERSION_MAJOR) &&
 133	     (pf_vvi->minor > I40E_VIRTCHNL_VERSION_MINOR)))
 134		err = -EIO;
 135
 136out_alloc:
 137	kfree(event.msg_buf);
 138out:
 139	return err;
 140}
 141
 142/**
 143 * i40evf_send_vf_config_msg
 144 * @adapter: adapter structure
 145 *
 146 * Send VF configuration request admin queue message to the PF. The reply
 147 * is not checked in this function. Returns 0 if the message was
 148 * successfully sent, or one of the I40E_ADMIN_QUEUE_ERROR_ statuses if not.
 149 **/
 150int i40evf_send_vf_config_msg(struct i40evf_adapter *adapter)
 151{
 152	u32 caps;
 153
 154	adapter->current_op = I40E_VIRTCHNL_OP_GET_VF_RESOURCES;
 155	adapter->aq_required &= ~I40EVF_FLAG_AQ_GET_CONFIG;
 156	caps = I40E_VIRTCHNL_VF_OFFLOAD_L2 |
 157	       I40E_VIRTCHNL_VF_OFFLOAD_RSS_AQ |
 158	       I40E_VIRTCHNL_VF_OFFLOAD_RSS_REG |
 159	       I40E_VIRTCHNL_VF_OFFLOAD_VLAN |
 160	       I40E_VIRTCHNL_VF_OFFLOAD_WB_ON_ITR |
 161	       I40E_VIRTCHNL_VF_OFFLOAD_RSS_PCTYPE_V2;
 162
 163	adapter->current_op = I40E_VIRTCHNL_OP_GET_VF_RESOURCES;
 164	adapter->aq_required &= ~I40EVF_FLAG_AQ_GET_CONFIG;
 165	if (PF_IS_V11(adapter))
 166		return i40evf_send_pf_msg(adapter,
 167					  I40E_VIRTCHNL_OP_GET_VF_RESOURCES,
 168					  (u8 *)&caps, sizeof(caps));
 169	else
 170		return i40evf_send_pf_msg(adapter,
 171					  I40E_VIRTCHNL_OP_GET_VF_RESOURCES,
 172					  NULL, 0);
 173}
 174
 175/**
 176 * i40evf_get_vf_config
 177 * @hw: pointer to the hardware structure
 178 * @len: length of buffer
 179 *
 180 * Get VF configuration from PF and populate hw structure. Must be called after
 181 * admin queue is initialized. Busy waits until response is received from PF,
 182 * with maximum timeout. Response from PF is returned in the buffer for further
 183 * processing by the caller.
 184 **/
 185int i40evf_get_vf_config(struct i40evf_adapter *adapter)
 186{
 187	struct i40e_hw *hw = &adapter->hw;
 188	struct i40e_arq_event_info event;
 189	enum i40e_virtchnl_ops op;
 190	i40e_status err;
 191	u16 len;
 192
 193	len =  sizeof(struct i40e_virtchnl_vf_resource) +
 194		I40E_MAX_VF_VSI * sizeof(struct i40e_virtchnl_vsi_resource);
 195	event.buf_len = len;
 196	event.msg_buf = kzalloc(event.buf_len, GFP_KERNEL);
 197	if (!event.msg_buf) {
 198		err = -ENOMEM;
 199		goto out;
 200	}
 201
 202	while (1) {
 203		/* When the AQ is empty, i40evf_clean_arq_element will return
 204		 * nonzero and this loop will terminate.
 205		 */
 206		err = i40evf_clean_arq_element(hw, &event, NULL);
 207		if (err)
 208			goto out_alloc;
 209		op =
 210		    (enum i40e_virtchnl_ops)le32_to_cpu(event.desc.cookie_high);
 211		if (op == I40E_VIRTCHNL_OP_GET_VF_RESOURCES)
 212			break;
 213	}
 214
 215	err = (i40e_status)le32_to_cpu(event.desc.cookie_low);
 216	memcpy(adapter->vf_res, event.msg_buf, min(event.msg_len, len));
 217
 218	i40e_vf_parse_hw_config(hw, adapter->vf_res);
 219out_alloc:
 220	kfree(event.msg_buf);
 221out:
 222	return err;
 223}
 224
 225/**
 226 * i40evf_configure_queues
 227 * @adapter: adapter structure
 228 *
 229 * Request that the PF set up our (previously allocated) queues.
 230 **/
 231void i40evf_configure_queues(struct i40evf_adapter *adapter)
 232{
 233	struct i40e_virtchnl_vsi_queue_config_info *vqci;
 234	struct i40e_virtchnl_queue_pair_info *vqpi;
 235	int pairs = adapter->num_active_queues;
 236	int i, len;
 237
 238	if (adapter->current_op != I40E_VIRTCHNL_OP_UNKNOWN) {
 239		/* bail because we already have a command pending */
 240		dev_err(&adapter->pdev->dev, "Cannot configure queues, command %d pending\n",
 241			adapter->current_op);
 242		return;
 243	}
 244	adapter->current_op = I40E_VIRTCHNL_OP_CONFIG_VSI_QUEUES;
 245	len = sizeof(struct i40e_virtchnl_vsi_queue_config_info) +
 246		       (sizeof(struct i40e_virtchnl_queue_pair_info) * pairs);
 247	vqci = kzalloc(len, GFP_KERNEL);
 248	if (!vqci)
 249		return;
 250
 251	vqci->vsi_id = adapter->vsi_res->vsi_id;
 252	vqci->num_queue_pairs = pairs;
 253	vqpi = vqci->qpair;
 254	/* Size check is not needed here - HW max is 16 queue pairs, and we
 255	 * can fit info for 31 of them into the AQ buffer before it overflows.
 256	 */
 257	for (i = 0; i < pairs; i++) {
 258		vqpi->txq.vsi_id = vqci->vsi_id;
 259		vqpi->txq.queue_id = i;
 260		vqpi->txq.ring_len = adapter->tx_rings[i].count;
 261		vqpi->txq.dma_ring_addr = adapter->tx_rings[i].dma;
 262		vqpi->txq.headwb_enabled = 1;
 263		vqpi->txq.dma_headwb_addr = vqpi->txq.dma_ring_addr +
 264		    (vqpi->txq.ring_len * sizeof(struct i40e_tx_desc));
 265
 266		vqpi->rxq.vsi_id = vqci->vsi_id;
 267		vqpi->rxq.queue_id = i;
 268		vqpi->rxq.ring_len = adapter->rx_rings[i].count;
 269		vqpi->rxq.dma_ring_addr = adapter->rx_rings[i].dma;
 270		vqpi->rxq.max_pkt_size = adapter->netdev->mtu
 271					+ ETH_HLEN + VLAN_HLEN + ETH_FCS_LEN;
 272		vqpi->rxq.databuffer_size = adapter->rx_rings[i].rx_buf_len;
 273		vqpi++;
 274	}
 275
 276	adapter->aq_required &= ~I40EVF_FLAG_AQ_CONFIGURE_QUEUES;
 277	i40evf_send_pf_msg(adapter, I40E_VIRTCHNL_OP_CONFIG_VSI_QUEUES,
 278			   (u8 *)vqci, len);
 279	kfree(vqci);
 280}
 281
 282/**
 283 * i40evf_enable_queues
 284 * @adapter: adapter structure
 285 *
 286 * Request that the PF enable all of our queues.
 287 **/
 288void i40evf_enable_queues(struct i40evf_adapter *adapter)
 289{
 290	struct i40e_virtchnl_queue_select vqs;
 291
 292	if (adapter->current_op != I40E_VIRTCHNL_OP_UNKNOWN) {
 293		/* bail because we already have a command pending */
 294		dev_err(&adapter->pdev->dev, "Cannot enable queues, command %d pending\n",
 295			adapter->current_op);
 296		return;
 297	}
 298	adapter->current_op = I40E_VIRTCHNL_OP_ENABLE_QUEUES;
 299	vqs.vsi_id = adapter->vsi_res->vsi_id;
 300	vqs.tx_queues = BIT(adapter->num_active_queues) - 1;
 301	vqs.rx_queues = vqs.tx_queues;
 302	adapter->aq_required &= ~I40EVF_FLAG_AQ_ENABLE_QUEUES;
 303	i40evf_send_pf_msg(adapter, I40E_VIRTCHNL_OP_ENABLE_QUEUES,
 304			   (u8 *)&vqs, sizeof(vqs));
 305}
 306
 307/**
 308 * i40evf_disable_queues
 309 * @adapter: adapter structure
 310 *
 311 * Request that the PF disable all of our queues.
 312 **/
 313void i40evf_disable_queues(struct i40evf_adapter *adapter)
 314{
 315	struct i40e_virtchnl_queue_select vqs;
 316
 317	if (adapter->current_op != I40E_VIRTCHNL_OP_UNKNOWN) {
 318		/* bail because we already have a command pending */
 319		dev_err(&adapter->pdev->dev, "Cannot disable queues, command %d pending\n",
 320			adapter->current_op);
 321		return;
 322	}
 323	adapter->current_op = I40E_VIRTCHNL_OP_DISABLE_QUEUES;
 324	vqs.vsi_id = adapter->vsi_res->vsi_id;
 325	vqs.tx_queues = BIT(adapter->num_active_queues) - 1;
 326	vqs.rx_queues = vqs.tx_queues;
 327	adapter->aq_required &= ~I40EVF_FLAG_AQ_DISABLE_QUEUES;
 328	i40evf_send_pf_msg(adapter, I40E_VIRTCHNL_OP_DISABLE_QUEUES,
 329			   (u8 *)&vqs, sizeof(vqs));
 330}
 331
 332/**
 333 * i40evf_map_queues
 334 * @adapter: adapter structure
 335 *
 336 * Request that the PF map queues to interrupt vectors. Misc causes, including
 337 * admin queue, are always mapped to vector 0.
 338 **/
 339void i40evf_map_queues(struct i40evf_adapter *adapter)
 340{
 341	struct i40e_virtchnl_irq_map_info *vimi;
 342	int v_idx, q_vectors, len;
 343	struct i40e_q_vector *q_vector;
 344
 345	if (adapter->current_op != I40E_VIRTCHNL_OP_UNKNOWN) {
 346		/* bail because we already have a command pending */
 347		dev_err(&adapter->pdev->dev, "Cannot map queues to vectors, command %d pending\n",
 348			adapter->current_op);
 349		return;
 350	}
 351	adapter->current_op = I40E_VIRTCHNL_OP_CONFIG_IRQ_MAP;
 352
 353	q_vectors = adapter->num_msix_vectors - NONQ_VECS;
 354
 355	len = sizeof(struct i40e_virtchnl_irq_map_info) +
 356	      (adapter->num_msix_vectors *
 357		sizeof(struct i40e_virtchnl_vector_map));
 358	vimi = kzalloc(len, GFP_KERNEL);
 359	if (!vimi)
 360		return;
 361
 362	vimi->num_vectors = adapter->num_msix_vectors;
 363	/* Queue vectors first */
 364	for (v_idx = 0; v_idx < q_vectors; v_idx++) {
 365		q_vector = adapter->q_vectors + v_idx;
 366		vimi->vecmap[v_idx].vsi_id = adapter->vsi_res->vsi_id;
 367		vimi->vecmap[v_idx].vector_id = v_idx + NONQ_VECS;
 368		vimi->vecmap[v_idx].txq_map = q_vector->ring_mask;
 369		vimi->vecmap[v_idx].rxq_map = q_vector->ring_mask;
 370	}
 371	/* Misc vector last - this is only for AdminQ messages */
 372	vimi->vecmap[v_idx].vsi_id = adapter->vsi_res->vsi_id;
 373	vimi->vecmap[v_idx].vector_id = 0;
 374	vimi->vecmap[v_idx].txq_map = 0;
 375	vimi->vecmap[v_idx].rxq_map = 0;
 376
 377	adapter->aq_required &= ~I40EVF_FLAG_AQ_MAP_VECTORS;
 378	i40evf_send_pf_msg(adapter, I40E_VIRTCHNL_OP_CONFIG_IRQ_MAP,
 379			   (u8 *)vimi, len);
 380	kfree(vimi);
 381}
 382
 383/**
 384 * i40evf_add_ether_addrs
 385 * @adapter: adapter structure
 386 * @addrs: the MAC address filters to add (contiguous)
 387 * @count: number of filters
 388 *
 389 * Request that the PF add one or more addresses to our filters.
 390 **/
 391void i40evf_add_ether_addrs(struct i40evf_adapter *adapter)
 392{
 393	struct i40e_virtchnl_ether_addr_list *veal;
 394	int len, i = 0, count = 0;
 395	struct i40evf_mac_filter *f;
 396	bool more = false;
 397
 398	if (adapter->current_op != I40E_VIRTCHNL_OP_UNKNOWN) {
 399		/* bail because we already have a command pending */
 400		dev_err(&adapter->pdev->dev, "Cannot add filters, command %d pending\n",
 401			adapter->current_op);
 402		return;
 403	}
 404	list_for_each_entry(f, &adapter->mac_filter_list, list) {
 405		if (f->add)
 406			count++;
 407	}
 408	if (!count) {
 409		adapter->aq_required &= ~I40EVF_FLAG_AQ_ADD_MAC_FILTER;
 410		return;
 411	}
 412	adapter->current_op = I40E_VIRTCHNL_OP_ADD_ETHER_ADDRESS;
 413
 414	len = sizeof(struct i40e_virtchnl_ether_addr_list) +
 415	      (count * sizeof(struct i40e_virtchnl_ether_addr));
 416	if (len > I40EVF_MAX_AQ_BUF_SIZE) {
 417		dev_warn(&adapter->pdev->dev, "Too many add MAC changes in one request\n");
 418		count = (I40EVF_MAX_AQ_BUF_SIZE -
 419			 sizeof(struct i40e_virtchnl_ether_addr_list)) /
 420			sizeof(struct i40e_virtchnl_ether_addr);
 421		len = sizeof(struct i40e_virtchnl_ether_addr_list) +
 422		      (count * sizeof(struct i40e_virtchnl_ether_addr));
 423		more = true;
 424	}
 425
 426	veal = kzalloc(len, GFP_KERNEL);
 427	if (!veal)
 428		return;
 429
 430	veal->vsi_id = adapter->vsi_res->vsi_id;
 431	veal->num_elements = count;
 432	list_for_each_entry(f, &adapter->mac_filter_list, list) {
 433		if (f->add) {
 434			ether_addr_copy(veal->list[i].addr, f->macaddr);
 435			i++;
 436			f->add = false;
 437			if (i == count)
 438				break;
 439		}
 440	}
 441	if (!more)
 442		adapter->aq_required &= ~I40EVF_FLAG_AQ_ADD_MAC_FILTER;
 443	i40evf_send_pf_msg(adapter, I40E_VIRTCHNL_OP_ADD_ETHER_ADDRESS,
 444			   (u8 *)veal, len);
 445	kfree(veal);
 446}
 447
 448/**
 449 * i40evf_del_ether_addrs
 450 * @adapter: adapter structure
 451 * @addrs: the MAC address filters to remove (contiguous)
 452 * @count: number of filtes
 453 *
 454 * Request that the PF remove one or more addresses from our filters.
 455 **/
 456void i40evf_del_ether_addrs(struct i40evf_adapter *adapter)
 457{
 458	struct i40e_virtchnl_ether_addr_list *veal;
 459	struct i40evf_mac_filter *f, *ftmp;
 460	int len, i = 0, count = 0;
 461	bool more = false;
 462
 463	if (adapter->current_op != I40E_VIRTCHNL_OP_UNKNOWN) {
 464		/* bail because we already have a command pending */
 465		dev_err(&adapter->pdev->dev, "Cannot remove filters, command %d pending\n",
 466			adapter->current_op);
 467		return;
 468	}
 469	list_for_each_entry(f, &adapter->mac_filter_list, list) {
 470		if (f->remove)
 471			count++;
 472	}
 473	if (!count) {
 474		adapter->aq_required &= ~I40EVF_FLAG_AQ_DEL_MAC_FILTER;
 475		return;
 476	}
 477	adapter->current_op = I40E_VIRTCHNL_OP_DEL_ETHER_ADDRESS;
 478
 479	len = sizeof(struct i40e_virtchnl_ether_addr_list) +
 480	      (count * sizeof(struct i40e_virtchnl_ether_addr));
 481	if (len > I40EVF_MAX_AQ_BUF_SIZE) {
 482		dev_warn(&adapter->pdev->dev, "Too many delete MAC changes in one request\n");
 483		count = (I40EVF_MAX_AQ_BUF_SIZE -
 484			 sizeof(struct i40e_virtchnl_ether_addr_list)) /
 485			sizeof(struct i40e_virtchnl_ether_addr);
 486		len = sizeof(struct i40e_virtchnl_ether_addr_list) +
 487		      (count * sizeof(struct i40e_virtchnl_ether_addr));
 488		more = true;
 489	}
 490	veal = kzalloc(len, GFP_KERNEL);
 491	if (!veal)
 492		return;
 493
 494	veal->vsi_id = adapter->vsi_res->vsi_id;
 495	veal->num_elements = count;
 496	list_for_each_entry_safe(f, ftmp, &adapter->mac_filter_list, list) {
 497		if (f->remove) {
 498			ether_addr_copy(veal->list[i].addr, f->macaddr);
 499			i++;
 500			list_del(&f->list);
 501			kfree(f);
 502			if (i == count)
 503				break;
 504		}
 505	}
 506	if (!more)
 507		adapter->aq_required &= ~I40EVF_FLAG_AQ_DEL_MAC_FILTER;
 508	i40evf_send_pf_msg(adapter, I40E_VIRTCHNL_OP_DEL_ETHER_ADDRESS,
 509			   (u8 *)veal, len);
 510	kfree(veal);
 511}
 512
 513/**
 514 * i40evf_add_vlans
 515 * @adapter: adapter structure
 516 * @vlans: the VLANs to add
 517 * @count: number of VLANs
 518 *
 519 * Request that the PF add one or more VLAN filters to our VSI.
 520 **/
 521void i40evf_add_vlans(struct i40evf_adapter *adapter)
 522{
 523	struct i40e_virtchnl_vlan_filter_list *vvfl;
 524	int len, i = 0, count = 0;
 525	struct i40evf_vlan_filter *f;
 526	bool more = false;
 527
 528	if (adapter->current_op != I40E_VIRTCHNL_OP_UNKNOWN) {
 529		/* bail because we already have a command pending */
 530		dev_err(&adapter->pdev->dev, "Cannot add VLANs, command %d pending\n",
 531			adapter->current_op);
 532		return;
 533	}
 534
 535	list_for_each_entry(f, &adapter->vlan_filter_list, list) {
 536		if (f->add)
 537			count++;
 538	}
 539	if (!count) {
 540		adapter->aq_required &= ~I40EVF_FLAG_AQ_ADD_VLAN_FILTER;
 541		return;
 542	}
 543	adapter->current_op = I40E_VIRTCHNL_OP_ADD_VLAN;
 544
 545	len = sizeof(struct i40e_virtchnl_vlan_filter_list) +
 546	      (count * sizeof(u16));
 547	if (len > I40EVF_MAX_AQ_BUF_SIZE) {
 548		dev_warn(&adapter->pdev->dev, "Too many add VLAN changes in one request\n");
 549		count = (I40EVF_MAX_AQ_BUF_SIZE -
 550			 sizeof(struct i40e_virtchnl_vlan_filter_list)) /
 551			sizeof(u16);
 552		len = sizeof(struct i40e_virtchnl_vlan_filter_list) +
 553		      (count * sizeof(u16));
 554		more = true;
 555	}
 556	vvfl = kzalloc(len, GFP_KERNEL);
 557	if (!vvfl)
 558		return;
 559
 560	vvfl->vsi_id = adapter->vsi_res->vsi_id;
 561	vvfl->num_elements = count;
 562	list_for_each_entry(f, &adapter->vlan_filter_list, list) {
 563		if (f->add) {
 564			vvfl->vlan_id[i] = f->vlan;
 565			i++;
 566			f->add = false;
 567			if (i == count)
 568				break;
 569		}
 570	}
 571	if (!more)
 572		adapter->aq_required &= ~I40EVF_FLAG_AQ_ADD_VLAN_FILTER;
 573	i40evf_send_pf_msg(adapter, I40E_VIRTCHNL_OP_ADD_VLAN, (u8 *)vvfl, len);
 574	kfree(vvfl);
 575}
 576
 577/**
 578 * i40evf_del_vlans
 579 * @adapter: adapter structure
 580 * @vlans: the VLANs to remove
 581 * @count: number of VLANs
 582 *
 583 * Request that the PF remove one or more VLAN filters from our VSI.
 584 **/
 585void i40evf_del_vlans(struct i40evf_adapter *adapter)
 586{
 587	struct i40e_virtchnl_vlan_filter_list *vvfl;
 588	struct i40evf_vlan_filter *f, *ftmp;
 589	int len, i = 0, count = 0;
 590	bool more = false;
 591
 592	if (adapter->current_op != I40E_VIRTCHNL_OP_UNKNOWN) {
 593		/* bail because we already have a command pending */
 594		dev_err(&adapter->pdev->dev, "Cannot remove VLANs, command %d pending\n",
 595			adapter->current_op);
 596		return;
 597	}
 598
 599	list_for_each_entry(f, &adapter->vlan_filter_list, list) {
 600		if (f->remove)
 601			count++;
 602	}
 603	if (!count) {
 604		adapter->aq_required &= ~I40EVF_FLAG_AQ_DEL_VLAN_FILTER;
 605		return;
 606	}
 607	adapter->current_op = I40E_VIRTCHNL_OP_DEL_VLAN;
 608
 609	len = sizeof(struct i40e_virtchnl_vlan_filter_list) +
 610	      (count * sizeof(u16));
 611	if (len > I40EVF_MAX_AQ_BUF_SIZE) {
 612		dev_warn(&adapter->pdev->dev, "Too many delete VLAN changes in one request\n");
 613		count = (I40EVF_MAX_AQ_BUF_SIZE -
 614			 sizeof(struct i40e_virtchnl_vlan_filter_list)) /
 615			sizeof(u16);
 616		len = sizeof(struct i40e_virtchnl_vlan_filter_list) +
 617		      (count * sizeof(u16));
 618		more = true;
 619	}
 620	vvfl = kzalloc(len, GFP_KERNEL);
 621	if (!vvfl)
 622		return;
 623
 624	vvfl->vsi_id = adapter->vsi_res->vsi_id;
 625	vvfl->num_elements = count;
 626	list_for_each_entry_safe(f, ftmp, &adapter->vlan_filter_list, list) {
 627		if (f->remove) {
 628			vvfl->vlan_id[i] = f->vlan;
 629			i++;
 630			list_del(&f->list);
 631			kfree(f);
 632			if (i == count)
 633				break;
 634		}
 635	}
 636	if (!more)
 637		adapter->aq_required &= ~I40EVF_FLAG_AQ_DEL_VLAN_FILTER;
 638	i40evf_send_pf_msg(adapter, I40E_VIRTCHNL_OP_DEL_VLAN, (u8 *)vvfl, len);
 639	kfree(vvfl);
 640}
 641
 642/**
 643 * i40evf_set_promiscuous
 644 * @adapter: adapter structure
 645 * @flags: bitmask to control unicast/multicast promiscuous.
 646 *
 647 * Request that the PF enable promiscuous mode for our VSI.
 648 **/
 649void i40evf_set_promiscuous(struct i40evf_adapter *adapter, int flags)
 650{
 651	struct i40e_virtchnl_promisc_info vpi;
 652	int promisc_all;
 653
 654	if (adapter->current_op != I40E_VIRTCHNL_OP_UNKNOWN) {
 655		/* bail because we already have a command pending */
 656		dev_err(&adapter->pdev->dev, "Cannot set promiscuous mode, command %d pending\n",
 657			adapter->current_op);
 658		return;
 659	}
 660
 661	promisc_all = I40E_FLAG_VF_UNICAST_PROMISC |
 662		      I40E_FLAG_VF_MULTICAST_PROMISC;
 663	if ((flags & promisc_all) == promisc_all) {
 664		adapter->flags |= I40EVF_FLAG_PROMISC_ON;
 665		adapter->aq_required &= ~I40EVF_FLAG_AQ_REQUEST_PROMISC;
 666		dev_info(&adapter->pdev->dev, "Entering promiscuous mode\n");
 667	}
 668
 669	if (flags & I40E_FLAG_VF_MULTICAST_PROMISC) {
 670		adapter->flags |= I40EVF_FLAG_ALLMULTI_ON;
 671		adapter->aq_required &= ~I40EVF_FLAG_AQ_REQUEST_ALLMULTI;
 672		dev_info(&adapter->pdev->dev, "Entering multicast promiscuous mode\n");
 673	}
 674
 675	if (!flags) {
 676		adapter->flags &= ~I40EVF_FLAG_PROMISC_ON;
 677		adapter->aq_required &= ~I40EVF_FLAG_AQ_RELEASE_PROMISC;
 678		dev_info(&adapter->pdev->dev, "Leaving promiscuous mode\n");
 679	}
 680
 681	adapter->current_op = I40E_VIRTCHNL_OP_CONFIG_PROMISCUOUS_MODE;
 682	vpi.vsi_id = adapter->vsi_res->vsi_id;
 683	vpi.flags = flags;
 684	i40evf_send_pf_msg(adapter, I40E_VIRTCHNL_OP_CONFIG_PROMISCUOUS_MODE,
 685			   (u8 *)&vpi, sizeof(vpi));
 686}
 687
 688/**
 689 * i40evf_request_stats
 690 * @adapter: adapter structure
 691 *
 692 * Request VSI statistics from PF.
 693 **/
 694void i40evf_request_stats(struct i40evf_adapter *adapter)
 695{
 696	struct i40e_virtchnl_queue_select vqs;
 697
 698	if (adapter->current_op != I40E_VIRTCHNL_OP_UNKNOWN) {
 699		/* no error message, this isn't crucial */
 700		return;
 701	}
 702	adapter->current_op = I40E_VIRTCHNL_OP_GET_STATS;
 703	vqs.vsi_id = adapter->vsi_res->vsi_id;
 704	/* queue maps are ignored for this message - only the vsi is used */
 705	if (i40evf_send_pf_msg(adapter, I40E_VIRTCHNL_OP_GET_STATS,
 706			       (u8 *)&vqs, sizeof(vqs)))
 707		/* if the request failed, don't lock out others */
 708		adapter->current_op = I40E_VIRTCHNL_OP_UNKNOWN;
 709}
 710
 711/**
 712 * i40evf_get_hena
 713 * @adapter: adapter structure
 714 *
 715 * Request hash enable capabilities from PF
 716 **/
 717void i40evf_get_hena(struct i40evf_adapter *adapter)
 718{
 719	if (adapter->current_op != I40E_VIRTCHNL_OP_UNKNOWN) {
 720		/* bail because we already have a command pending */
 721		dev_err(&adapter->pdev->dev, "Cannot get RSS hash capabilities, command %d pending\n",
 722			adapter->current_op);
 723		return;
 724	}
 725	adapter->current_op = I40E_VIRTCHNL_OP_GET_RSS_HENA_CAPS;
 726	adapter->aq_required &= ~I40EVF_FLAG_AQ_GET_HENA;
 727	i40evf_send_pf_msg(adapter, I40E_VIRTCHNL_OP_GET_RSS_HENA_CAPS,
 728			   NULL, 0);
 729}
 730
 731/**
 732 * i40evf_set_hena
 733 * @adapter: adapter structure
 734 *
 735 * Request the PF to set our RSS hash capabilities
 736 **/
 737void i40evf_set_hena(struct i40evf_adapter *adapter)
 738{
 739	struct i40e_virtchnl_rss_hena vrh;
 740
 741	if (adapter->current_op != I40E_VIRTCHNL_OP_UNKNOWN) {
 742		/* bail because we already have a command pending */
 743		dev_err(&adapter->pdev->dev, "Cannot set RSS hash enable, command %d pending\n",
 744			adapter->current_op);
 745		return;
 746	}
 747	vrh.hena = adapter->hena;
 748	adapter->current_op = I40E_VIRTCHNL_OP_SET_RSS_HENA;
 749	adapter->aq_required &= ~I40EVF_FLAG_AQ_SET_HENA;
 750	i40evf_send_pf_msg(adapter, I40E_VIRTCHNL_OP_SET_RSS_HENA,
 751			   (u8 *)&vrh, sizeof(vrh));
 752}
 753
 754/**
 755 * i40evf_set_rss_key
 756 * @adapter: adapter structure
 757 *
 758 * Request the PF to set our RSS hash key
 759 **/
 760void i40evf_set_rss_key(struct i40evf_adapter *adapter)
 761{
 762	struct i40e_virtchnl_rss_key *vrk;
 763	int len;
 764
 765	if (adapter->current_op != I40E_VIRTCHNL_OP_UNKNOWN) {
 766		/* bail because we already have a command pending */
 767		dev_err(&adapter->pdev->dev, "Cannot set RSS key, command %d pending\n",
 768			adapter->current_op);
 769		return;
 770	}
 771	len = sizeof(struct i40e_virtchnl_rss_key) +
 772	      (adapter->rss_key_size * sizeof(u8)) - 1;
 773	vrk = kzalloc(len, GFP_KERNEL);
 774	if (!vrk)
 775		return;
 776	vrk->vsi_id = adapter->vsi.id;
 777	vrk->key_len = adapter->rss_key_size;
 778	memcpy(vrk->key, adapter->rss_key, adapter->rss_key_size);
 779
 780	adapter->current_op = I40E_VIRTCHNL_OP_CONFIG_RSS_KEY;
 781	adapter->aq_required &= ~I40EVF_FLAG_AQ_SET_RSS_KEY;
 782	i40evf_send_pf_msg(adapter, I40E_VIRTCHNL_OP_CONFIG_RSS_KEY,
 783			   (u8 *)vrk, len);
 784	kfree(vrk);
 785}
 786
 787/**
 788 * i40evf_set_rss_lut
 789 * @adapter: adapter structure
 790 *
 791 * Request the PF to set our RSS lookup table
 792 **/
 793void i40evf_set_rss_lut(struct i40evf_adapter *adapter)
 794{
 795	struct i40e_virtchnl_rss_lut *vrl;
 796	int len;
 797
 798	if (adapter->current_op != I40E_VIRTCHNL_OP_UNKNOWN) {
 799		/* bail because we already have a command pending */
 800		dev_err(&adapter->pdev->dev, "Cannot set RSS LUT, command %d pending\n",
 801			adapter->current_op);
 802		return;
 803	}
 804	len = sizeof(struct i40e_virtchnl_rss_lut) +
 805	      (adapter->rss_lut_size * sizeof(u8)) - 1;
 806	vrl = kzalloc(len, GFP_KERNEL);
 807	if (!vrl)
 808		return;
 809	vrl->vsi_id = adapter->vsi.id;
 810	vrl->lut_entries = adapter->rss_lut_size;
 811	memcpy(vrl->lut, adapter->rss_lut, adapter->rss_lut_size);
 812	adapter->current_op = I40E_VIRTCHNL_OP_CONFIG_RSS_LUT;
 813	adapter->aq_required &= ~I40EVF_FLAG_AQ_SET_RSS_LUT;
 814	i40evf_send_pf_msg(adapter, I40E_VIRTCHNL_OP_CONFIG_RSS_LUT,
 815			   (u8 *)vrl, len);
 816	kfree(vrl);
 817}
 818
 819/**
 820 * i40evf_print_link_message - print link up or down
 821 * @adapter: adapter structure
 822 *
 823 * Log a message telling the world of our wonderous link status
 824 */
 825static void i40evf_print_link_message(struct i40evf_adapter *adapter)
 826{
 827	struct net_device *netdev = adapter->netdev;
 828	char *speed = "Unknown ";
 829
 830	if (!adapter->link_up) {
 831		netdev_info(netdev, "NIC Link is Down\n");
 832		return;
 833	}
 834
 835	switch (adapter->link_speed) {
 836	case I40E_LINK_SPEED_40GB:
 837		speed = "40 G";
 838		break;
 839	case I40E_LINK_SPEED_25GB:
 840		speed = "25 G";
 841		break;
 842	case I40E_LINK_SPEED_20GB:
 843		speed = "20 G";
 844		break;
 845	case I40E_LINK_SPEED_10GB:
 846		speed = "10 G";
 847		break;
 848	case I40E_LINK_SPEED_1GB:
 849		speed = "1000 M";
 850		break;
 851	case I40E_LINK_SPEED_100MB:
 852		speed = "100 M";
 853		break;
 854	default:
 855		break;
 856	}
 857
 858	netdev_info(netdev, "NIC Link is Up %sbps Full Duplex\n", speed);
 859}
 860
 861/**
 862 * i40evf_request_reset
 863 * @adapter: adapter structure
 864 *
 865 * Request that the PF reset this VF. No response is expected.
 866 **/
 867void i40evf_request_reset(struct i40evf_adapter *adapter)
 868{
 869	/* Don't check CURRENT_OP - this is always higher priority */
 870	i40evf_send_pf_msg(adapter, I40E_VIRTCHNL_OP_RESET_VF, NULL, 0);
 871	adapter->current_op = I40E_VIRTCHNL_OP_UNKNOWN;
 872}
 873
 874/**
 875 * i40evf_virtchnl_completion
 876 * @adapter: adapter structure
 877 * @v_opcode: opcode sent by PF
 878 * @v_retval: retval sent by PF
 879 * @msg: message sent by PF
 880 * @msglen: message length
 881 *
 882 * Asynchronous completion function for admin queue messages. Rather than busy
 883 * wait, we fire off our requests and assume that no errors will be returned.
 884 * This function handles the reply messages.
 885 **/
 886void i40evf_virtchnl_completion(struct i40evf_adapter *adapter,
 887				enum i40e_virtchnl_ops v_opcode,
 888				i40e_status v_retval,
 889				u8 *msg, u16 msglen)
 890{
 891	struct net_device *netdev = adapter->netdev;
 892
 893	if (v_opcode == I40E_VIRTCHNL_OP_EVENT) {
 894		struct i40e_virtchnl_pf_event *vpe =
 895			(struct i40e_virtchnl_pf_event *)msg;
 896		switch (vpe->event) {
 897		case I40E_VIRTCHNL_EVENT_LINK_CHANGE:
 898			adapter->link_speed =
 899				vpe->event_data.link_event.link_speed;
 900			if (adapter->link_up !=
 901			    vpe->event_data.link_event.link_status) {
 902				adapter->link_up =
 903					vpe->event_data.link_event.link_status;
 904				if (adapter->link_up) {
 905					netif_tx_start_all_queues(netdev);
 906					netif_carrier_on(netdev);
 907				} else {
 908					netif_tx_stop_all_queues(netdev);
 909					netif_carrier_off(netdev);
 910				}
 911				i40evf_print_link_message(adapter);
 912			}
 913			break;
 914		case I40E_VIRTCHNL_EVENT_RESET_IMPENDING:
 915			dev_info(&adapter->pdev->dev, "PF reset warning received\n");
 916			if (!(adapter->flags & I40EVF_FLAG_RESET_PENDING)) {
 917				adapter->flags |= I40EVF_FLAG_RESET_PENDING;
 918				dev_info(&adapter->pdev->dev, "Scheduling reset task\n");
 919				schedule_work(&adapter->reset_task);
 920			}
 921			break;
 922		default:
 923			dev_err(&adapter->pdev->dev, "Unknown event %d from PF\n",
 924				vpe->event);
 925			break;
 926		}
 927		return;
 928	}
 929	if (v_retval) {
 930		switch (v_opcode) {
 931		case I40E_VIRTCHNL_OP_ADD_VLAN:
 932			dev_err(&adapter->pdev->dev, "Failed to add VLAN filter, error %s\n",
 933				i40evf_stat_str(&adapter->hw, v_retval));
 934			break;
 935		case I40E_VIRTCHNL_OP_ADD_ETHER_ADDRESS:
 936			dev_err(&adapter->pdev->dev, "Failed to add MAC filter, error %s\n",
 937				i40evf_stat_str(&adapter->hw, v_retval));
 938			break;
 939		case I40E_VIRTCHNL_OP_DEL_VLAN:
 940			dev_err(&adapter->pdev->dev, "Failed to delete VLAN filter, error %s\n",
 941				i40evf_stat_str(&adapter->hw, v_retval));
 942			break;
 943		case I40E_VIRTCHNL_OP_DEL_ETHER_ADDRESS:
 944			dev_err(&adapter->pdev->dev, "Failed to delete MAC filter, error %s\n",
 945				i40evf_stat_str(&adapter->hw, v_retval));
 946			break;
 947		default:
 948			dev_err(&adapter->pdev->dev, "PF returned error %d (%s) to our request %d\n",
 949				v_retval,
 950				i40evf_stat_str(&adapter->hw, v_retval),
 951				v_opcode);
 952		}
 953	}
 954	switch (v_opcode) {
 955	case I40E_VIRTCHNL_OP_GET_STATS: {
 956		struct i40e_eth_stats *stats =
 957			(struct i40e_eth_stats *)msg;
 958		adapter->net_stats.rx_packets = stats->rx_unicast +
 959						 stats->rx_multicast +
 960						 stats->rx_broadcast;
 961		adapter->net_stats.tx_packets = stats->tx_unicast +
 962						 stats->tx_multicast +
 963						 stats->tx_broadcast;
 964		adapter->net_stats.rx_bytes = stats->rx_bytes;
 965		adapter->net_stats.tx_bytes = stats->tx_bytes;
 966		adapter->net_stats.tx_errors = stats->tx_errors;
 967		adapter->net_stats.rx_dropped = stats->rx_discards;
 968		adapter->net_stats.tx_dropped = stats->tx_discards;
 969		adapter->current_stats = *stats;
 970		}
 971		break;
 972	case I40E_VIRTCHNL_OP_GET_VF_RESOURCES: {
 973		u16 len = sizeof(struct i40e_virtchnl_vf_resource) +
 974			  I40E_MAX_VF_VSI *
 975			  sizeof(struct i40e_virtchnl_vsi_resource);
 976		memcpy(adapter->vf_res, msg, min(msglen, len));
 977		i40e_vf_parse_hw_config(&adapter->hw, adapter->vf_res);
 978		/* restore current mac address */
 979		ether_addr_copy(adapter->hw.mac.addr, netdev->dev_addr);
 980		i40evf_process_config(adapter);
 981		}
 982		break;
 983	case I40E_VIRTCHNL_OP_ENABLE_QUEUES:
 984		/* enable transmits */
 985		i40evf_irq_enable(adapter, true);
 986		break;
 987	case I40E_VIRTCHNL_OP_DISABLE_QUEUES:
 988		i40evf_free_all_tx_resources(adapter);
 989		i40evf_free_all_rx_resources(adapter);
 990		if (adapter->state == __I40EVF_DOWN_PENDING)
 991			adapter->state = __I40EVF_DOWN;
 992		break;
 993	case I40E_VIRTCHNL_OP_VERSION:
 994	case I40E_VIRTCHNL_OP_CONFIG_IRQ_MAP:
 995		/* Don't display an error if we get these out of sequence.
 996		 * If the firmware needed to get kicked, we'll get these and
 997		 * it's no problem.
 998		 */
 999		if (v_opcode != adapter->current_op)
1000			return;
1001		break;
1002	case I40E_VIRTCHNL_OP_GET_RSS_HENA_CAPS: {
1003		struct i40e_virtchnl_rss_hena *vrh =
1004			(struct i40e_virtchnl_rss_hena *)msg;
1005		if (msglen == sizeof(*vrh))
1006			adapter->hena = vrh->hena;
1007		else
1008			dev_warn(&adapter->pdev->dev,
1009				 "Invalid message %d from PF\n", v_opcode);
1010		}
1011		break;
1012	default:
1013		if (v_opcode != adapter->current_op)
1014			dev_warn(&adapter->pdev->dev, "Expected response %d from PF, received %d\n",
1015				 adapter->current_op, v_opcode);
1016		break;
1017	} /* switch v_opcode */
1018	adapter->current_op = I40E_VIRTCHNL_OP_UNKNOWN;
1019}