xref: /freebsd/sys/dev/ixl/ixl_pf_iov.c (revision 3cbb4cc200f8a0ad7ed08233425ea54524a21f1c)
1 /******************************************************************************
2 
3   Copyright (c) 2013-2018, Intel Corporation
4   All rights reserved.
5 
6   Redistribution and use in source and binary forms, with or without
7   modification, are permitted provided that the following conditions are met:
8 
9    1. Redistributions of source code must retain the above copyright notice,
10       this list of conditions and the following disclaimer.
11 
12    2. Redistributions in binary form must reproduce the above copyright
13       notice, this list of conditions and the following disclaimer in the
14       documentation and/or other materials provided with the distribution.
15 
16    3. Neither the name of the Intel Corporation nor the names of its
17       contributors may be used to endorse or promote products derived from
18       this software without specific prior written permission.
19 
20   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21   AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22   IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23   ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
24   LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
25   CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26   SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27   INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28   CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29   ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30   POSSIBILITY OF SUCH DAMAGE.
31 
32 ******************************************************************************/
33 /*$FreeBSD$*/
34 
35 #include "ixl_pf_iov.h"
36 
37 /* Private functions */
38 static void	ixl_vf_map_vsi_queue(struct i40e_hw *hw, struct ixl_vf *vf, int qnum, uint32_t val);
39 static void	ixl_vf_disable_queue_intr(struct i40e_hw *hw, uint32_t vfint_reg);
40 static void	ixl_vf_unregister_intr(struct i40e_hw *hw, uint32_t vpint_reg);
41 
42 static int	ixl_vc_opcode_level(uint16_t opcode);
43 
44 static int	ixl_vf_mac_valid(struct ixl_vf *vf, const uint8_t *addr);
45 
46 static int	ixl_vf_alloc_vsi(struct ixl_pf *pf, struct ixl_vf *vf);
47 static int	ixl_vf_setup_vsi(struct ixl_pf *pf, struct ixl_vf *vf);
48 static void	ixl_vf_map_queues(struct ixl_pf *pf, struct ixl_vf *vf);
49 static void	ixl_vf_vsi_release(struct ixl_pf *pf, struct ixl_vsi *vsi);
50 static void	ixl_vf_release_resources(struct ixl_pf *pf, struct ixl_vf *vf);
51 static int	ixl_flush_pcie(struct ixl_pf *pf, struct ixl_vf *vf);
52 static void	ixl_reset_vf(struct ixl_pf *pf, struct ixl_vf *vf);
53 static void	ixl_reinit_vf(struct ixl_pf *pf, struct ixl_vf *vf);
54 static void	ixl_send_vf_msg(struct ixl_pf *pf, struct ixl_vf *vf, uint16_t op, enum i40e_status_code status, void *msg, uint16_t len);
55 static void	ixl_send_vf_ack(struct ixl_pf *pf, struct ixl_vf *vf, uint16_t op);
56 static void	ixl_send_vf_nack_msg(struct ixl_pf *pf, struct ixl_vf *vf, uint16_t op, enum i40e_status_code status, const char *file, int line);
57 static void	ixl_vf_version_msg(struct ixl_pf *pf, struct ixl_vf *vf, void *msg, uint16_t msg_size);
58 static void	ixl_vf_reset_msg(struct ixl_pf *pf, struct ixl_vf *vf, void *msg, uint16_t msg_size);
59 static void	ixl_vf_get_resources_msg(struct ixl_pf *pf, struct ixl_vf *vf, void *msg, uint16_t msg_size);
60 static int	ixl_vf_config_tx_queue(struct ixl_pf *pf, struct ixl_vf *vf, struct virtchnl_txq_info *info);
61 static int	ixl_vf_config_rx_queue(struct ixl_pf *pf, struct ixl_vf *vf, struct virtchnl_rxq_info *info);
62 static void	ixl_vf_config_vsi_msg(struct ixl_pf *pf, struct ixl_vf *vf, void *msg, uint16_t msg_size);
63 static void	ixl_vf_set_qctl(struct ixl_pf *pf, const struct virtchnl_vector_map *vector, enum i40e_queue_type cur_type, uint16_t cur_queue,
64     enum i40e_queue_type *last_type, uint16_t *last_queue);
65 static void	ixl_vf_config_vector(struct ixl_pf *pf, struct ixl_vf *vf, const struct virtchnl_vector_map *vector);
66 static void	ixl_vf_config_irq_msg(struct ixl_pf *pf, struct ixl_vf *vf, void *msg, uint16_t msg_size);
67 static void	ixl_vf_enable_queues_msg(struct ixl_pf *pf, struct ixl_vf *vf, void *msg, uint16_t msg_size);
68 static void	ixl_vf_disable_queues_msg(struct ixl_pf *pf, struct ixl_vf *vf, void *msg, uint16_t msg_size);
69 static void	ixl_vf_add_mac_msg(struct ixl_pf *pf, struct ixl_vf *vf, void *msg, uint16_t msg_size);
70 static void	ixl_vf_del_mac_msg(struct ixl_pf *pf, struct ixl_vf *vf, void *msg, uint16_t msg_size);
71 static enum i40e_status_code	ixl_vf_enable_vlan_strip(struct ixl_pf *pf, struct ixl_vf *vf);
72 static void	ixl_vf_add_vlan_msg(struct ixl_pf *pf, struct ixl_vf *vf, void *msg, uint16_t msg_size);
73 static void	ixl_vf_del_vlan_msg(struct ixl_pf *pf, struct ixl_vf *vf, void *msg, uint16_t msg_size);
74 static void	ixl_vf_config_promisc_msg(struct ixl_pf *pf, struct ixl_vf *vf, void *msg, uint16_t msg_size);
75 static void	ixl_vf_get_stats_msg(struct ixl_pf *pf, struct ixl_vf *vf, void *msg, uint16_t msg_size);
76 static int	ixl_vf_reserve_queues(struct ixl_pf *pf, struct ixl_vf *vf, int num_queues);
77 static int	ixl_config_pf_vsi_loopback(struct ixl_pf *pf, bool enable);
78 
79 static int	ixl_adminq_err_to_errno(enum i40e_admin_queue_err err);
80 
81 /*
82  * TODO: Move pieces of this into iflib and call the rest in a handler?
83  *
84  * e.g. ixl_if_iov_set_schema
85  *
86  * It's odd to do pci_iov_detach() there while doing pci_iov_attach()
87  * in the driver.
88  */
89 void
90 ixl_initialize_sriov(struct ixl_pf *pf)
91 {
92 	device_t dev = pf->dev;
93 	struct i40e_hw *hw = &pf->hw;
94 	nvlist_t	*pf_schema, *vf_schema;
95 	int		iov_error;
96 
97 	pf_schema = pci_iov_schema_alloc_node();
98 	vf_schema = pci_iov_schema_alloc_node();
99 	pci_iov_schema_add_unicast_mac(vf_schema, "mac-addr", 0, NULL);
100 	pci_iov_schema_add_bool(vf_schema, "mac-anti-spoof",
101 	    IOV_SCHEMA_HASDEFAULT, TRUE);
102 	pci_iov_schema_add_bool(vf_schema, "allow-set-mac",
103 	    IOV_SCHEMA_HASDEFAULT, FALSE);
104 	pci_iov_schema_add_bool(vf_schema, "allow-promisc",
105 	    IOV_SCHEMA_HASDEFAULT, FALSE);
106 	pci_iov_schema_add_uint16(vf_schema, "num-queues",
107 	    IOV_SCHEMA_HASDEFAULT,
108 	    max(1, min(hw->func_caps.num_msix_vectors_vf - 1, IAVF_MAX_QUEUES)));
109 
110 	iov_error = pci_iov_attach(dev, pf_schema, vf_schema);
111 	if (iov_error != 0) {
112 		device_printf(dev,
113 		    "Failed to initialize SR-IOV (error=%d)\n",
114 		    iov_error);
115 	} else
116 		device_printf(dev, "SR-IOV ready\n");
117 
118 	pf->vc_debug_lvl = 1;
119 }
120 
121 /*
122  * Allocate the VSI for a VF.
123  */
124 static int
125 ixl_vf_alloc_vsi(struct ixl_pf *pf, struct ixl_vf *vf)
126 {
127 	device_t dev;
128 	struct i40e_hw *hw;
129 	struct ixl_vsi *vsi;
130 	struct i40e_vsi_context vsi_ctx;
131 	int i;
132 	enum i40e_status_code code;
133 
134 	hw = &pf->hw;
135 	vsi = &pf->vsi;
136 	dev = pf->dev;
137 
138 	vsi_ctx.pf_num = hw->pf_id;
139 	vsi_ctx.uplink_seid = pf->veb_seid;
140 	vsi_ctx.connection_type = IXL_VSI_DATA_PORT;
141 	vsi_ctx.vf_num = hw->func_caps.vf_base_id + vf->vf_num;
142 	vsi_ctx.flags = I40E_AQ_VSI_TYPE_VF;
143 
144 	bzero(&vsi_ctx.info, sizeof(vsi_ctx.info));
145 
146 	vsi_ctx.info.valid_sections = htole16(I40E_AQ_VSI_PROP_SWITCH_VALID);
147 	if (pf->enable_vf_loopback)
148 		vsi_ctx.info.switch_id =
149 		   htole16(I40E_AQ_VSI_SW_ID_FLAG_ALLOW_LB);
150 
151 	vsi_ctx.info.valid_sections |= htole16(I40E_AQ_VSI_PROP_SECURITY_VALID);
152 	vsi_ctx.info.sec_flags = 0;
153 	if (vf->vf_flags & VF_FLAG_MAC_ANTI_SPOOF)
154 		vsi_ctx.info.sec_flags |= I40E_AQ_VSI_SEC_FLAG_ENABLE_MAC_CHK;
155 
156 	vsi_ctx.info.valid_sections |= htole16(I40E_AQ_VSI_PROP_VLAN_VALID);
157 	vsi_ctx.info.port_vlan_flags = I40E_AQ_VSI_PVLAN_MODE_ALL |
158 	    I40E_AQ_VSI_PVLAN_EMOD_NOTHING;
159 
160 	vsi_ctx.info.valid_sections |=
161 	    htole16(I40E_AQ_VSI_PROP_QUEUE_MAP_VALID);
162 	vsi_ctx.info.mapping_flags = htole16(I40E_AQ_VSI_QUE_MAP_NONCONTIG);
163 
164 	/* XXX: Only scattered allocation is supported for VFs right now */
165 	for (i = 0; i < vf->qtag.num_active; i++)
166 		vsi_ctx.info.queue_mapping[i] = vf->qtag.qidx[i];
167 	for (; i < nitems(vsi_ctx.info.queue_mapping); i++)
168 		vsi_ctx.info.queue_mapping[i] = htole16(I40E_AQ_VSI_QUEUE_MASK);
169 
170 	vsi_ctx.info.tc_mapping[0] = htole16(
171 	    (0 << I40E_AQ_VSI_TC_QUE_OFFSET_SHIFT) |
172 	    ((fls(vf->qtag.num_allocated) - 1) << I40E_AQ_VSI_TC_QUE_NUMBER_SHIFT));
173 
174 	code = i40e_aq_add_vsi(hw, &vsi_ctx, NULL);
175 	if (code != I40E_SUCCESS)
176 		return (ixl_adminq_err_to_errno(hw->aq.asq_last_status));
177 	vf->vsi.seid = vsi_ctx.seid;
178 	vf->vsi.vsi_num = vsi_ctx.vsi_number;
179 	vf->vsi.num_rx_queues = vf->qtag.num_active;
180 	vf->vsi.num_tx_queues = vf->qtag.num_active;
181 
182 	code = i40e_aq_get_vsi_params(hw, &vsi_ctx, NULL);
183 	if (code != I40E_SUCCESS)
184 		return (ixl_adminq_err_to_errno(hw->aq.asq_last_status));
185 
186 	code = i40e_aq_config_vsi_bw_limit(hw, vf->vsi.seid, 0, 0, NULL);
187 	if (code != I40E_SUCCESS) {
188 		device_printf(dev, "Failed to disable BW limit: %d\n",
189 		    ixl_adminq_err_to_errno(hw->aq.asq_last_status));
190 		return (ixl_adminq_err_to_errno(hw->aq.asq_last_status));
191 	}
192 
193 	memcpy(&vf->vsi.info, &vsi_ctx.info, sizeof(vf->vsi.info));
194 	return (0);
195 }
196 
197 static int
198 ixl_vf_setup_vsi(struct ixl_pf *pf, struct ixl_vf *vf)
199 {
200 	struct i40e_hw *hw;
201 	int error;
202 
203 	hw = &pf->hw;
204 	vf->vsi.flags |= IXL_FLAGS_IS_VF;
205 
206 	error = ixl_vf_alloc_vsi(pf, vf);
207 	if (error != 0)
208 		return (error);
209 
210 	vf->vsi.dev = pf->dev;
211 
212 	ixl_init_filters(&vf->vsi);
213 	/* Let VF receive broadcast Ethernet frames */
214 	error = i40e_aq_set_vsi_broadcast(hw, vf->vsi.seid, TRUE, NULL);
215 	if (error)
216 		device_printf(pf->dev, "Error configuring VF VSI for broadcast promiscuous\n");
217 	/* Re-add VF's MAC/VLAN filters to its VSI */
218 	ixl_reconfigure_filters(&vf->vsi);
219 
220 	return (0);
221 }
222 
223 static void
224 ixl_vf_map_vsi_queue(struct i40e_hw *hw, struct ixl_vf *vf, int qnum,
225     uint32_t val)
226 {
227 	uint32_t qtable;
228 	int index, shift;
229 
230 	/*
231 	 * Two queues are mapped in a single register, so we have to do some
232 	 * gymnastics to convert the queue number into a register index and
233 	 * shift.
234 	 */
235 	index = qnum / 2;
236 	shift = (qnum % 2) * I40E_VSILAN_QTABLE_QINDEX_1_SHIFT;
237 
238 	qtable = i40e_read_rx_ctl(hw, I40E_VSILAN_QTABLE(index, vf->vsi.vsi_num));
239 	qtable &= ~(I40E_VSILAN_QTABLE_QINDEX_0_MASK << shift);
240 	qtable |= val << shift;
241 	i40e_write_rx_ctl(hw, I40E_VSILAN_QTABLE(index, vf->vsi.vsi_num), qtable);
242 }
243 
244 static void
245 ixl_vf_map_queues(struct ixl_pf *pf, struct ixl_vf *vf)
246 {
247 	struct i40e_hw *hw;
248 	uint32_t qtable;
249 	int i;
250 
251 	hw = &pf->hw;
252 
253 	/*
254 	 * Contiguous mappings aren't actually supported by the hardware,
255 	 * so we have to use non-contiguous mappings.
256 	 */
257 	i40e_write_rx_ctl(hw, I40E_VSILAN_QBASE(vf->vsi.vsi_num),
258 	     I40E_VSILAN_QBASE_VSIQTABLE_ENA_MASK);
259 
260 	/* Enable LAN traffic on this VF */
261 	wr32(hw, I40E_VPLAN_MAPENA(vf->vf_num),
262 	    I40E_VPLAN_MAPENA_TXRX_ENA_MASK);
263 
264 	/* Program index of each VF queue into PF queue space
265 	 * (This is only needed if QTABLE is enabled) */
266 	for (i = 0; i < vf->vsi.num_tx_queues; i++) {
267 		qtable = ixl_pf_qidx_from_vsi_qidx(&vf->qtag, i) <<
268 		    I40E_VPLAN_QTABLE_QINDEX_SHIFT;
269 
270 		wr32(hw, I40E_VPLAN_QTABLE(i, vf->vf_num), qtable);
271 	}
272 	for (; i < IXL_MAX_VSI_QUEUES; i++)
273 		wr32(hw, I40E_VPLAN_QTABLE(i, vf->vf_num),
274 		    I40E_VPLAN_QTABLE_QINDEX_MASK);
275 
276 	/* Map queues allocated to VF to its VSI;
277 	 * This mapping matches the VF-wide mapping since the VF
278 	 * is only given a single VSI */
279 	for (i = 0; i < vf->vsi.num_tx_queues; i++)
280 		ixl_vf_map_vsi_queue(hw, vf, i,
281 		    ixl_pf_qidx_from_vsi_qidx(&vf->qtag, i));
282 
283 	/* Set rest of VSI queues as unused. */
284 	for (; i < IXL_MAX_VSI_QUEUES; i++)
285 		ixl_vf_map_vsi_queue(hw, vf, i,
286 		    I40E_VSILAN_QTABLE_QINDEX_0_MASK);
287 
288 	ixl_flush(hw);
289 }
290 
291 static void
292 ixl_vf_vsi_release(struct ixl_pf *pf, struct ixl_vsi *vsi)
293 {
294 	struct i40e_hw *hw;
295 
296 	hw = &pf->hw;
297 
298 	if (vsi->seid == 0)
299 		return;
300 
301 	i40e_aq_delete_element(hw, vsi->seid, NULL);
302 }
303 
304 static void
305 ixl_vf_disable_queue_intr(struct i40e_hw *hw, uint32_t vfint_reg)
306 {
307 
308 	wr32(hw, vfint_reg, I40E_VFINT_DYN_CTLN_CLEARPBA_MASK);
309 	ixl_flush(hw);
310 }
311 
312 static void
313 ixl_vf_unregister_intr(struct i40e_hw *hw, uint32_t vpint_reg)
314 {
315 
316 	wr32(hw, vpint_reg, I40E_VPINT_LNKLSTN_FIRSTQ_TYPE_MASK |
317 	    I40E_VPINT_LNKLSTN_FIRSTQ_INDX_MASK);
318 	ixl_flush(hw);
319 }
320 
321 static void
322 ixl_vf_release_resources(struct ixl_pf *pf, struct ixl_vf *vf)
323 {
324 	struct i40e_hw *hw;
325 	uint32_t vfint_reg, vpint_reg;
326 	int i;
327 
328 	hw = &pf->hw;
329 
330 	ixl_vf_vsi_release(pf, &vf->vsi);
331 
332 	/* Index 0 has a special register. */
333 	ixl_vf_disable_queue_intr(hw, I40E_VFINT_DYN_CTL0(vf->vf_num));
334 
335 	for (i = 1; i < hw->func_caps.num_msix_vectors_vf; i++) {
336 		vfint_reg = IXL_VFINT_DYN_CTLN_REG(hw, i , vf->vf_num);
337 		ixl_vf_disable_queue_intr(hw, vfint_reg);
338 	}
339 
340 	/* Index 0 has a special register. */
341 	ixl_vf_unregister_intr(hw, I40E_VPINT_LNKLST0(vf->vf_num));
342 
343 	for (i = 1; i < hw->func_caps.num_msix_vectors_vf; i++) {
344 		vpint_reg = IXL_VPINT_LNKLSTN_REG(hw, i, vf->vf_num);
345 		ixl_vf_unregister_intr(hw, vpint_reg);
346 	}
347 
348 	vf->vsi.num_tx_queues = 0;
349 	vf->vsi.num_rx_queues = 0;
350 }
351 
352 static int
353 ixl_flush_pcie(struct ixl_pf *pf, struct ixl_vf *vf)
354 {
355 	struct i40e_hw *hw;
356 	int i;
357 	uint16_t global_vf_num;
358 	uint32_t ciad;
359 
360 	hw = &pf->hw;
361 	global_vf_num = hw->func_caps.vf_base_id + vf->vf_num;
362 
363 	wr32(hw, I40E_PF_PCI_CIAA, IXL_PF_PCI_CIAA_VF_DEVICE_STATUS |
364 	     (global_vf_num << I40E_PF_PCI_CIAA_VF_NUM_SHIFT));
365 	for (i = 0; i < IXL_VF_RESET_TIMEOUT; i++) {
366 		ciad = rd32(hw, I40E_PF_PCI_CIAD);
367 		if ((ciad & IXL_PF_PCI_CIAD_VF_TRANS_PENDING_MASK) == 0)
368 			return (0);
369 		DELAY(1);
370 	}
371 
372 	return (ETIMEDOUT);
373 }
374 
375 static void
376 ixl_reset_vf(struct ixl_pf *pf, struct ixl_vf *vf)
377 {
378 	struct i40e_hw *hw;
379 	uint32_t vfrtrig;
380 
381 	hw = &pf->hw;
382 
383 	ixl_dbg_iov(pf, "Resetting VF-%d\n", vf->vf_num);
384 
385 	vfrtrig = rd32(hw, I40E_VPGEN_VFRTRIG(vf->vf_num));
386 	vfrtrig |= I40E_VPGEN_VFRTRIG_VFSWR_MASK;
387 	wr32(hw, I40E_VPGEN_VFRTRIG(vf->vf_num), vfrtrig);
388 	ixl_flush(hw);
389 
390 	ixl_reinit_vf(pf, vf);
391 
392 	ixl_dbg_iov(pf, "Resetting VF-%d done.\n", vf->vf_num);
393 }
394 
395 static void
396 ixl_reinit_vf(struct ixl_pf *pf, struct ixl_vf *vf)
397 {
398 	struct i40e_hw *hw;
399 	uint32_t vfrstat, vfrtrig;
400 	int i, error;
401 
402 	hw = &pf->hw;
403 
404 	error = ixl_flush_pcie(pf, vf);
405 	if (error != 0)
406 		device_printf(pf->dev,
407 		    "Timed out waiting for PCIe activity to stop on VF-%d\n",
408 		    vf->vf_num);
409 
410 	for (i = 0; i < IXL_VF_RESET_TIMEOUT; i++) {
411 		DELAY(10);
412 
413 		vfrstat = rd32(hw, I40E_VPGEN_VFRSTAT(vf->vf_num));
414 		if (vfrstat & I40E_VPGEN_VFRSTAT_VFRD_MASK)
415 			break;
416 	}
417 
418 	if (i == IXL_VF_RESET_TIMEOUT)
419 		device_printf(pf->dev, "VF %d failed to reset\n", vf->vf_num);
420 
421 	wr32(hw, I40E_VFGEN_RSTAT1(vf->vf_num), VIRTCHNL_VFR_COMPLETED);
422 
423 	vfrtrig = rd32(hw, I40E_VPGEN_VFRTRIG(vf->vf_num));
424 	vfrtrig &= ~I40E_VPGEN_VFRTRIG_VFSWR_MASK;
425 	wr32(hw, I40E_VPGEN_VFRTRIG(vf->vf_num), vfrtrig);
426 
427 	if (vf->vsi.seid != 0)
428 		ixl_disable_rings(pf, &vf->vsi, &vf->qtag);
429 	ixl_pf_qmgr_clear_queue_flags(&vf->qtag);
430 
431 	ixl_vf_release_resources(pf, vf);
432 	ixl_vf_setup_vsi(pf, vf);
433 	ixl_vf_map_queues(pf, vf);
434 
435 	wr32(hw, I40E_VFGEN_RSTAT1(vf->vf_num), VIRTCHNL_VFR_VFACTIVE);
436 	ixl_flush(hw);
437 }
438 
439 static int
440 ixl_vc_opcode_level(uint16_t opcode)
441 {
442 	switch (opcode) {
443 	case VIRTCHNL_OP_GET_STATS:
444 		return (10);
445 	default:
446 		return (5);
447 	}
448 }
449 
450 static void
451 ixl_send_vf_msg(struct ixl_pf *pf, struct ixl_vf *vf, uint16_t op,
452     enum i40e_status_code status, void *msg, uint16_t len)
453 {
454 	struct i40e_hw *hw;
455 	int global_vf_id;
456 
457 	hw = &pf->hw;
458 	global_vf_id = hw->func_caps.vf_base_id + vf->vf_num;
459 
460 	I40E_VC_DEBUG(pf, ixl_vc_opcode_level(op),
461 	    "Sending msg (op=%s[%d], status=%d) to VF-%d\n",
462 	    ixl_vc_opcode_str(op), op, status, vf->vf_num);
463 
464 	i40e_aq_send_msg_to_vf(hw, global_vf_id, op, status, msg, len, NULL);
465 }
466 
467 static void
468 ixl_send_vf_ack(struct ixl_pf *pf, struct ixl_vf *vf, uint16_t op)
469 {
470 
471 	ixl_send_vf_msg(pf, vf, op, I40E_SUCCESS, NULL, 0);
472 }
473 
474 static void
475 ixl_send_vf_nack_msg(struct ixl_pf *pf, struct ixl_vf *vf, uint16_t op,
476     enum i40e_status_code status, const char *file, int line)
477 {
478 
479 	I40E_VC_DEBUG(pf, 1,
480 	    "Sending NACK (op=%s[%d], err=%s[%d]) to VF-%d from %s:%d\n",
481 	    ixl_vc_opcode_str(op), op, i40e_stat_str(&pf->hw, status),
482 	    status, vf->vf_num, file, line);
483 	ixl_send_vf_msg(pf, vf, op, status, NULL, 0);
484 }
485 
486 static void
487 ixl_vf_version_msg(struct ixl_pf *pf, struct ixl_vf *vf, void *msg,
488     uint16_t msg_size)
489 {
490 	struct virtchnl_version_info *recv_vf_version;
491 	device_t dev = pf->dev;
492 
493 	recv_vf_version = (struct virtchnl_version_info *)msg;
494 
495 	/* VFs running the 1.0 API expect to get 1.0 back */
496 	if (VF_IS_V10(recv_vf_version)) {
497 		vf->version.major = 1;
498 		vf->version.minor = VIRTCHNL_VERSION_MINOR_NO_VF_CAPS;
499 	} else {
500 		vf->version.major = VIRTCHNL_VERSION_MAJOR;
501 		vf->version.minor = VIRTCHNL_VERSION_MINOR;
502 
503 		if ((recv_vf_version->major != VIRTCHNL_VERSION_MAJOR) ||
504 		    (recv_vf_version->minor != VIRTCHNL_VERSION_MINOR))
505 		    device_printf(dev,
506 		        "%s: VF-%d requested version (%d.%d) differs from PF version (%d.%d)\n",
507 			__func__, vf->vf_num,
508 			recv_vf_version->major, recv_vf_version->minor,
509 			VIRTCHNL_VERSION_MAJOR, VIRTCHNL_VERSION_MINOR);
510 	}
511 
512 	ixl_send_vf_msg(pf, vf, VIRTCHNL_OP_VERSION, I40E_SUCCESS,
513 	    &vf->version, sizeof(vf->version));
514 }
515 
516 static void
517 ixl_vf_reset_msg(struct ixl_pf *pf, struct ixl_vf *vf, void *msg,
518     uint16_t msg_size)
519 {
520 	ixl_reset_vf(pf, vf);
521 
522 	/* No response to a reset message. */
523 }
524 
525 static void
526 ixl_vf_get_resources_msg(struct ixl_pf *pf, struct ixl_vf *vf, void *msg,
527     uint16_t msg_size)
528 {
529 	struct virtchnl_vf_resource reply;
530 
531 	bzero(&reply, sizeof(reply));
532 
533 	if (vf->version.minor == VIRTCHNL_VERSION_MINOR_NO_VF_CAPS)
534 		reply.vf_cap_flags = VIRTCHNL_VF_OFFLOAD_L2 |
535 					 VIRTCHNL_VF_OFFLOAD_RSS_REG |
536 					 VIRTCHNL_VF_OFFLOAD_VLAN;
537 	else
538 		/* Force VF RSS setup by PF in 1.1+ VFs */
539 		reply.vf_cap_flags = *(u32 *)msg & (
540 					 VIRTCHNL_VF_OFFLOAD_L2 |
541 					 VIRTCHNL_VF_OFFLOAD_RSS_PF |
542 					 VIRTCHNL_VF_OFFLOAD_VLAN);
543 
544 	reply.num_vsis = 1;
545 	reply.num_queue_pairs = vf->vsi.num_tx_queues;
546 	reply.max_vectors = pf->hw.func_caps.num_msix_vectors_vf;
547 	reply.rss_key_size = 52;
548 	reply.rss_lut_size = 64;
549 	reply.vsi_res[0].vsi_id = vf->vsi.vsi_num;
550 	reply.vsi_res[0].vsi_type = VIRTCHNL_VSI_SRIOV;
551 	reply.vsi_res[0].num_queue_pairs = vf->vsi.num_tx_queues;
552 	memcpy(reply.vsi_res[0].default_mac_addr, vf->mac, ETHER_ADDR_LEN);
553 
554 	ixl_send_vf_msg(pf, vf, VIRTCHNL_OP_GET_VF_RESOURCES,
555 	    I40E_SUCCESS, &reply, sizeof(reply));
556 }
557 
558 static int
559 ixl_vf_config_tx_queue(struct ixl_pf *pf, struct ixl_vf *vf,
560     struct virtchnl_txq_info *info)
561 {
562 	struct i40e_hw *hw;
563 	struct i40e_hmc_obj_txq txq;
564 	uint16_t global_queue_num, global_vf_num;
565 	enum i40e_status_code status;
566 	uint32_t qtx_ctl;
567 
568 	hw = &pf->hw;
569 	global_queue_num = ixl_pf_qidx_from_vsi_qidx(&vf->qtag, info->queue_id);
570 	global_vf_num = hw->func_caps.vf_base_id + vf->vf_num;
571 	bzero(&txq, sizeof(txq));
572 
573 	DDPRINTF(pf->dev, "VF %d: PF TX queue %d / VF TX queue %d (Global VF %d)\n",
574 	    vf->vf_num, global_queue_num, info->queue_id, global_vf_num);
575 
576 	status = i40e_clear_lan_tx_queue_context(hw, global_queue_num);
577 	if (status != I40E_SUCCESS)
578 		return (EINVAL);
579 
580 	txq.base = info->dma_ring_addr / IXL_TX_CTX_BASE_UNITS;
581 
582 	txq.head_wb_ena = info->headwb_enabled;
583 	txq.head_wb_addr = info->dma_headwb_addr;
584 	txq.qlen = info->ring_len;
585 	txq.rdylist = le16_to_cpu(vf->vsi.info.qs_handle[0]);
586 	txq.rdylist_act = 0;
587 
588 	status = i40e_set_lan_tx_queue_context(hw, global_queue_num, &txq);
589 	if (status != I40E_SUCCESS)
590 		return (EINVAL);
591 
592 	qtx_ctl = I40E_QTX_CTL_VF_QUEUE |
593 	    (hw->pf_id << I40E_QTX_CTL_PF_INDX_SHIFT) |
594 	    (global_vf_num << I40E_QTX_CTL_VFVM_INDX_SHIFT);
595 	wr32(hw, I40E_QTX_CTL(global_queue_num), qtx_ctl);
596 	ixl_flush(hw);
597 
598 	ixl_pf_qmgr_mark_queue_configured(&vf->qtag, info->queue_id, true);
599 
600 	return (0);
601 }
602 
603 static int
604 ixl_vf_config_rx_queue(struct ixl_pf *pf, struct ixl_vf *vf,
605     struct virtchnl_rxq_info *info)
606 {
607 	struct i40e_hw *hw;
608 	struct i40e_hmc_obj_rxq rxq;
609 	uint16_t global_queue_num;
610 	enum i40e_status_code status;
611 
612 	hw = &pf->hw;
613 	global_queue_num = ixl_pf_qidx_from_vsi_qidx(&vf->qtag, info->queue_id);
614 	bzero(&rxq, sizeof(rxq));
615 
616 	DDPRINTF(pf->dev, "VF %d: PF RX queue %d / VF RX queue %d\n",
617 	    vf->vf_num, global_queue_num, info->queue_id);
618 
619 	if (info->databuffer_size > IXL_VF_MAX_BUFFER)
620 		return (EINVAL);
621 
622 	if (info->max_pkt_size > IXL_VF_MAX_FRAME ||
623 	    info->max_pkt_size < ETHER_MIN_LEN)
624 		return (EINVAL);
625 
626 	if (info->splithdr_enabled) {
627 		if (info->hdr_size > IXL_VF_MAX_HDR_BUFFER)
628 			return (EINVAL);
629 
630 		rxq.hsplit_0 = info->rx_split_pos &
631 		    (I40E_HMC_OBJ_RX_HSPLIT_0_SPLIT_L2 |
632 		     I40E_HMC_OBJ_RX_HSPLIT_0_SPLIT_IP |
633 		     I40E_HMC_OBJ_RX_HSPLIT_0_SPLIT_TCP_UDP |
634 		     I40E_HMC_OBJ_RX_HSPLIT_0_SPLIT_SCTP);
635 		rxq.hbuff = info->hdr_size >> I40E_RXQ_CTX_HBUFF_SHIFT;
636 
637 		rxq.dtype = 2;
638 	}
639 
640 	status = i40e_clear_lan_rx_queue_context(hw, global_queue_num);
641 	if (status != I40E_SUCCESS)
642 		return (EINVAL);
643 
644 	rxq.base = info->dma_ring_addr / IXL_RX_CTX_BASE_UNITS;
645 	rxq.qlen = info->ring_len;
646 
647 	rxq.dbuff = info->databuffer_size >> I40E_RXQ_CTX_DBUFF_SHIFT;
648 
649 	rxq.dsize = 1;
650 	rxq.crcstrip = 1;
651 	rxq.l2tsel = 1;
652 
653 	rxq.rxmax = info->max_pkt_size;
654 	rxq.tphrdesc_ena = 1;
655 	rxq.tphwdesc_ena = 1;
656 	rxq.tphdata_ena = 1;
657 	rxq.tphhead_ena = 1;
658 	rxq.lrxqthresh = 1;
659 	rxq.prefena = 1;
660 
661 	status = i40e_set_lan_rx_queue_context(hw, global_queue_num, &rxq);
662 	if (status != I40E_SUCCESS)
663 		return (EINVAL);
664 
665 	ixl_pf_qmgr_mark_queue_configured(&vf->qtag, info->queue_id, false);
666 
667 	return (0);
668 }
669 
670 static void
671 ixl_vf_config_vsi_msg(struct ixl_pf *pf, struct ixl_vf *vf, void *msg,
672     uint16_t msg_size)
673 {
674 	struct virtchnl_vsi_queue_config_info *info;
675 	struct virtchnl_queue_pair_info *pair;
676 	int i;
677 
678 	info = msg;
679 	if (info->num_queue_pairs == 0 || info->num_queue_pairs > vf->vsi.num_tx_queues) {
680 		device_printf(pf->dev, "VF %d: invalid # of qpairs (msg has %d, VSI has %d)\n",
681 		    vf->vf_num, info->num_queue_pairs, vf->vsi.num_tx_queues);
682 		i40e_send_vf_nack(pf, vf, VIRTCHNL_OP_CONFIG_VSI_QUEUES,
683 		    I40E_ERR_PARAM);
684 		return;
685 	}
686 
687 	if (info->vsi_id != vf->vsi.vsi_num) {
688 		device_printf(pf->dev, "VF %d: VSI id in recvd message (%d) does not match expected id (%d)\n",
689 		    vf->vf_num, info->vsi_id, vf->vsi.vsi_num);
690 		i40e_send_vf_nack(pf, vf, VIRTCHNL_OP_CONFIG_VSI_QUEUES,
691 		    I40E_ERR_PARAM);
692 		return;
693 	}
694 
695 	for (i = 0; i < info->num_queue_pairs; i++) {
696 		pair = &info->qpair[i];
697 
698 		if (pair->txq.vsi_id != vf->vsi.vsi_num ||
699 		    pair->rxq.vsi_id != vf->vsi.vsi_num ||
700 		    pair->txq.queue_id != pair->rxq.queue_id ||
701 		    pair->txq.queue_id >= vf->vsi.num_tx_queues) {
702 
703 			i40e_send_vf_nack(pf, vf,
704 			    VIRTCHNL_OP_CONFIG_VSI_QUEUES, I40E_ERR_PARAM);
705 			return;
706 		}
707 
708 		if (ixl_vf_config_tx_queue(pf, vf, &pair->txq) != 0) {
709 			i40e_send_vf_nack(pf, vf,
710 			    VIRTCHNL_OP_CONFIG_VSI_QUEUES, I40E_ERR_PARAM);
711 			return;
712 		}
713 
714 		if (ixl_vf_config_rx_queue(pf, vf, &pair->rxq) != 0) {
715 			i40e_send_vf_nack(pf, vf,
716 			    VIRTCHNL_OP_CONFIG_VSI_QUEUES, I40E_ERR_PARAM);
717 			return;
718 		}
719 	}
720 
721 	ixl_send_vf_ack(pf, vf, VIRTCHNL_OP_CONFIG_VSI_QUEUES);
722 }
723 
724 static void
725 ixl_vf_set_qctl(struct ixl_pf *pf,
726     const struct virtchnl_vector_map *vector,
727     enum i40e_queue_type cur_type, uint16_t cur_queue,
728     enum i40e_queue_type *last_type, uint16_t *last_queue)
729 {
730 	uint32_t offset, qctl;
731 	uint16_t itr_indx;
732 
733 	if (cur_type == I40E_QUEUE_TYPE_RX) {
734 		offset = I40E_QINT_RQCTL(cur_queue);
735 		itr_indx = vector->rxitr_idx;
736 	} else {
737 		offset = I40E_QINT_TQCTL(cur_queue);
738 		itr_indx = vector->txitr_idx;
739 	}
740 
741 	qctl = htole32((vector->vector_id << I40E_QINT_RQCTL_MSIX_INDX_SHIFT) |
742 	    (*last_type << I40E_QINT_RQCTL_NEXTQ_TYPE_SHIFT) |
743 	    (*last_queue << I40E_QINT_RQCTL_NEXTQ_INDX_SHIFT) |
744 	    I40E_QINT_RQCTL_CAUSE_ENA_MASK |
745 	    (itr_indx << I40E_QINT_RQCTL_ITR_INDX_SHIFT));
746 
747 	wr32(&pf->hw, offset, qctl);
748 
749 	*last_type = cur_type;
750 	*last_queue = cur_queue;
751 }
752 
753 static void
754 ixl_vf_config_vector(struct ixl_pf *pf, struct ixl_vf *vf,
755     const struct virtchnl_vector_map *vector)
756 {
757 	struct i40e_hw *hw;
758 	u_int qindex;
759 	enum i40e_queue_type type, last_type;
760 	uint32_t lnklst_reg;
761 	uint16_t rxq_map, txq_map, cur_queue, last_queue;
762 
763 	hw = &pf->hw;
764 
765 	rxq_map = vector->rxq_map;
766 	txq_map = vector->txq_map;
767 
768 	last_queue = IXL_END_OF_INTR_LNKLST;
769 	last_type = I40E_QUEUE_TYPE_RX;
770 
771 	/*
772 	 * The datasheet says to optimize performance, RX queues and TX queues
773 	 * should be interleaved in the interrupt linked list, so we process
774 	 * both at once here.
775 	 */
776 	while ((rxq_map != 0) || (txq_map != 0)) {
777 		if (txq_map != 0) {
778 			qindex = ffs(txq_map) - 1;
779 			type = I40E_QUEUE_TYPE_TX;
780 			cur_queue = ixl_pf_qidx_from_vsi_qidx(&vf->qtag, qindex);
781 			ixl_vf_set_qctl(pf, vector, type, cur_queue,
782 			    &last_type, &last_queue);
783 			txq_map &= ~(1 << qindex);
784 		}
785 
786 		if (rxq_map != 0) {
787 			qindex = ffs(rxq_map) - 1;
788 			type = I40E_QUEUE_TYPE_RX;
789 			cur_queue = ixl_pf_qidx_from_vsi_qidx(&vf->qtag, qindex);
790 			ixl_vf_set_qctl(pf, vector, type, cur_queue,
791 			    &last_type, &last_queue);
792 			rxq_map &= ~(1 << qindex);
793 		}
794 	}
795 
796 	if (vector->vector_id == 0)
797 		lnklst_reg = I40E_VPINT_LNKLST0(vf->vf_num);
798 	else
799 		lnklst_reg = IXL_VPINT_LNKLSTN_REG(hw, vector->vector_id,
800 		    vf->vf_num);
801 	wr32(hw, lnklst_reg,
802 	    (last_queue << I40E_VPINT_LNKLST0_FIRSTQ_INDX_SHIFT) |
803 	    (last_type << I40E_VPINT_LNKLST0_FIRSTQ_TYPE_SHIFT));
804 
805 	ixl_flush(hw);
806 }
807 
808 static void
809 ixl_vf_config_irq_msg(struct ixl_pf *pf, struct ixl_vf *vf, void *msg,
810     uint16_t msg_size)
811 {
812 	struct virtchnl_irq_map_info *map;
813 	struct virtchnl_vector_map *vector;
814 	struct i40e_hw *hw;
815 	int i, largest_txq, largest_rxq;
816 
817 	hw = &pf->hw;
818 	map = msg;
819 
820 	for (i = 0; i < map->num_vectors; i++) {
821 		vector = &map->vecmap[i];
822 
823 		if ((vector->vector_id >= hw->func_caps.num_msix_vectors_vf) ||
824 		    vector->vsi_id != vf->vsi.vsi_num) {
825 			i40e_send_vf_nack(pf, vf,
826 			    VIRTCHNL_OP_CONFIG_IRQ_MAP, I40E_ERR_PARAM);
827 			return;
828 		}
829 
830 		if (vector->rxq_map != 0) {
831 			largest_rxq = fls(vector->rxq_map) - 1;
832 			if (largest_rxq >= vf->vsi.num_rx_queues) {
833 				i40e_send_vf_nack(pf, vf,
834 				    VIRTCHNL_OP_CONFIG_IRQ_MAP,
835 				    I40E_ERR_PARAM);
836 				return;
837 			}
838 		}
839 
840 		if (vector->txq_map != 0) {
841 			largest_txq = fls(vector->txq_map) - 1;
842 			if (largest_txq >= vf->vsi.num_tx_queues) {
843 				i40e_send_vf_nack(pf, vf,
844 				    VIRTCHNL_OP_CONFIG_IRQ_MAP,
845 				    I40E_ERR_PARAM);
846 				return;
847 			}
848 		}
849 
850 		if (vector->rxitr_idx > IXL_MAX_ITR_IDX ||
851 		    vector->txitr_idx > IXL_MAX_ITR_IDX) {
852 			i40e_send_vf_nack(pf, vf,
853 			    VIRTCHNL_OP_CONFIG_IRQ_MAP,
854 			    I40E_ERR_PARAM);
855 			return;
856 		}
857 
858 		ixl_vf_config_vector(pf, vf, vector);
859 	}
860 
861 	ixl_send_vf_ack(pf, vf, VIRTCHNL_OP_CONFIG_IRQ_MAP);
862 }
863 
864 static void
865 ixl_vf_enable_queues_msg(struct ixl_pf *pf, struct ixl_vf *vf, void *msg,
866     uint16_t msg_size)
867 {
868 	struct virtchnl_queue_select *select;
869 	int error = 0;
870 
871 	select = msg;
872 
873 	if (select->vsi_id != vf->vsi.vsi_num ||
874 	    select->rx_queues == 0 || select->tx_queues == 0) {
875 		i40e_send_vf_nack(pf, vf, VIRTCHNL_OP_ENABLE_QUEUES,
876 		    I40E_ERR_PARAM);
877 		return;
878 	}
879 
880 	/* Enable TX rings selected by the VF */
881 	for (int i = 0; i < 32; i++) {
882 		if ((1 << i) & select->tx_queues) {
883 			/* Warn if queue is out of VF allocation range */
884 			if (i >= vf->vsi.num_tx_queues) {
885 				device_printf(pf->dev, "VF %d: TX ring %d is outside of VF VSI allocation!\n",
886 				    vf->vf_num, i);
887 				break;
888 			}
889 			/* Skip this queue if it hasn't been configured */
890 			if (!ixl_pf_qmgr_is_queue_configured(&vf->qtag, i, true))
891 				continue;
892 			/* Warn if this queue is already marked as enabled */
893 			if (ixl_pf_qmgr_is_queue_enabled(&vf->qtag, i, true))
894 				ixl_dbg_iov(pf, "VF %d: TX ring %d is already enabled!\n",
895 				    vf->vf_num, i);
896 
897 			error = ixl_enable_tx_ring(pf, &vf->qtag, i);
898 			if (error)
899 				break;
900 			else
901 				ixl_pf_qmgr_mark_queue_enabled(&vf->qtag, i, true);
902 		}
903 	}
904 
905 	/* Enable RX rings selected by the VF */
906 	for (int i = 0; i < 32; i++) {
907 		if ((1 << i) & select->rx_queues) {
908 			/* Warn if queue is out of VF allocation range */
909 			if (i >= vf->vsi.num_rx_queues) {
910 				device_printf(pf->dev, "VF %d: RX ring %d is outside of VF VSI allocation!\n",
911 				    vf->vf_num, i);
912 				break;
913 			}
914 			/* Skip this queue if it hasn't been configured */
915 			if (!ixl_pf_qmgr_is_queue_configured(&vf->qtag, i, false))
916 				continue;
917 			/* Warn if this queue is already marked as enabled */
918 			if (ixl_pf_qmgr_is_queue_enabled(&vf->qtag, i, false))
919 				ixl_dbg_iov(pf, "VF %d: RX ring %d is already enabled!\n",
920 				    vf->vf_num, i);
921 			error = ixl_enable_rx_ring(pf, &vf->qtag, i);
922 			if (error)
923 				break;
924 			else
925 				ixl_pf_qmgr_mark_queue_enabled(&vf->qtag, i, false);
926 		}
927 	}
928 
929 	if (error) {
930 		i40e_send_vf_nack(pf, vf, VIRTCHNL_OP_ENABLE_QUEUES,
931 		    I40E_ERR_TIMEOUT);
932 		return;
933 	}
934 
935 	ixl_send_vf_ack(pf, vf, VIRTCHNL_OP_ENABLE_QUEUES);
936 }
937 
938 static void
939 ixl_vf_disable_queues_msg(struct ixl_pf *pf, struct ixl_vf *vf,
940     void *msg, uint16_t msg_size)
941 {
942 	struct virtchnl_queue_select *select;
943 	int error = 0;
944 
945 	select = msg;
946 
947 	if (select->vsi_id != vf->vsi.vsi_num ||
948 	    select->rx_queues == 0 || select->tx_queues == 0) {
949 		i40e_send_vf_nack(pf, vf, VIRTCHNL_OP_DISABLE_QUEUES,
950 		    I40E_ERR_PARAM);
951 		return;
952 	}
953 
954 	/* Disable TX rings selected by the VF */
955 	for (int i = 0; i < 32; i++) {
956 		if ((1 << i) & select->tx_queues) {
957 			/* Warn if queue is out of VF allocation range */
958 			if (i >= vf->vsi.num_tx_queues) {
959 				device_printf(pf->dev, "VF %d: TX ring %d is outside of VF VSI allocation!\n",
960 				    vf->vf_num, i);
961 				break;
962 			}
963 			/* Skip this queue if it hasn't been configured */
964 			if (!ixl_pf_qmgr_is_queue_configured(&vf->qtag, i, true))
965 				continue;
966 			/* Warn if this queue is already marked as disabled */
967 			if (!ixl_pf_qmgr_is_queue_enabled(&vf->qtag, i, true)) {
968 				ixl_dbg_iov(pf, "VF %d: TX ring %d is already disabled!\n",
969 				    vf->vf_num, i);
970 				continue;
971 			}
972 			error = ixl_disable_tx_ring(pf, &vf->qtag, i);
973 			if (error)
974 				break;
975 			else
976 				ixl_pf_qmgr_mark_queue_disabled(&vf->qtag, i, true);
977 		}
978 	}
979 
980 	/* Enable RX rings selected by the VF */
981 	for (int i = 0; i < 32; i++) {
982 		if ((1 << i) & select->rx_queues) {
983 			/* Warn if queue is out of VF allocation range */
984 			if (i >= vf->vsi.num_rx_queues) {
985 				device_printf(pf->dev, "VF %d: RX ring %d is outside of VF VSI allocation!\n",
986 				    vf->vf_num, i);
987 				break;
988 			}
989 			/* Skip this queue if it hasn't been configured */
990 			if (!ixl_pf_qmgr_is_queue_configured(&vf->qtag, i, false))
991 				continue;
992 			/* Warn if this queue is already marked as disabled */
993 			if (!ixl_pf_qmgr_is_queue_enabled(&vf->qtag, i, false)) {
994 				ixl_dbg_iov(pf, "VF %d: RX ring %d is already disabled!\n",
995 				    vf->vf_num, i);
996 				continue;
997 			}
998 			error = ixl_disable_rx_ring(pf, &vf->qtag, i);
999 			if (error)
1000 				break;
1001 			else
1002 				ixl_pf_qmgr_mark_queue_disabled(&vf->qtag, i, false);
1003 		}
1004 	}
1005 
1006 	if (error) {
1007 		i40e_send_vf_nack(pf, vf, VIRTCHNL_OP_DISABLE_QUEUES,
1008 		    I40E_ERR_TIMEOUT);
1009 		return;
1010 	}
1011 
1012 	ixl_send_vf_ack(pf, vf, VIRTCHNL_OP_DISABLE_QUEUES);
1013 }
1014 
1015 static int
1016 ixl_vf_mac_valid(struct ixl_vf *vf, const uint8_t *addr)
1017 {
1018 
1019 	if (ETHER_IS_ZERO(addr) || ETHER_IS_BROADCAST(addr))
1020 		return (EINVAL);
1021 
1022 	/*
1023 	 * If the VF is not allowed to change its MAC address, don't let it
1024 	 * set a MAC filter for an address that is not a multicast address and
1025 	 * is not its assigned MAC.
1026 	 */
1027 	if (!(vf->vf_flags & VF_FLAG_SET_MAC_CAP) &&
1028 	    !(ETHER_IS_MULTICAST(addr) || cmp_etheraddr(addr, vf->mac)))
1029 		return (EPERM);
1030 
1031 	return (0);
1032 }
1033 
1034 static void
1035 ixl_vf_add_mac_msg(struct ixl_pf *pf, struct ixl_vf *vf, void *msg,
1036     uint16_t msg_size)
1037 {
1038 	struct virtchnl_ether_addr_list *addr_list;
1039 	struct virtchnl_ether_addr *addr;
1040 	struct ixl_vsi *vsi;
1041 	int i;
1042 
1043 	vsi = &vf->vsi;
1044 	addr_list = msg;
1045 
1046 	if (addr_list->vsi_id != vsi->vsi_num) {
1047 		i40e_send_vf_nack(pf, vf, VIRTCHNL_OP_ADD_ETH_ADDR,
1048 		    I40E_ERR_PARAM);
1049 		return;
1050 	}
1051 
1052 	for (i = 0; i < addr_list->num_elements; i++) {
1053 		if (ixl_vf_mac_valid(vf, addr_list->list[i].addr) != 0) {
1054 			i40e_send_vf_nack(pf, vf,
1055 			    VIRTCHNL_OP_ADD_ETH_ADDR, I40E_ERR_PARAM);
1056 			return;
1057 		}
1058 	}
1059 
1060 	for (i = 0; i < addr_list->num_elements; i++) {
1061 		addr = &addr_list->list[i];
1062 		ixl_add_filter(vsi, addr->addr, IXL_VLAN_ANY);
1063 	}
1064 
1065 	ixl_send_vf_ack(pf, vf, VIRTCHNL_OP_ADD_ETH_ADDR);
1066 }
1067 
1068 static void
1069 ixl_vf_del_mac_msg(struct ixl_pf *pf, struct ixl_vf *vf, void *msg,
1070     uint16_t msg_size)
1071 {
1072 	struct virtchnl_ether_addr_list *addr_list;
1073 	struct virtchnl_ether_addr *addr;
1074 	struct ixl_vsi *vsi;
1075 	int i;
1076 
1077 	vsi = &vf->vsi;
1078 	addr_list = msg;
1079 
1080 	if (addr_list->vsi_id != vsi->vsi_num) {
1081 		i40e_send_vf_nack(pf, vf, VIRTCHNL_OP_DEL_ETH_ADDR,
1082 		    I40E_ERR_PARAM);
1083 		return;
1084 	}
1085 
1086 	for (i = 0; i < addr_list->num_elements; i++) {
1087 		addr = &addr_list->list[i];
1088 		if (ETHER_IS_ZERO(addr->addr) || ETHER_IS_BROADCAST(addr->addr)) {
1089 			i40e_send_vf_nack(pf, vf,
1090 			    VIRTCHNL_OP_DEL_ETH_ADDR, I40E_ERR_PARAM);
1091 			return;
1092 		}
1093 	}
1094 
1095 	for (i = 0; i < addr_list->num_elements; i++) {
1096 		addr = &addr_list->list[i];
1097 		ixl_del_filter(&vf->vsi, addr->addr, IXL_VLAN_ANY);
1098 	}
1099 
1100 	ixl_send_vf_ack(pf, vf, VIRTCHNL_OP_DEL_ETH_ADDR);
1101 }
1102 
1103 static enum i40e_status_code
1104 ixl_vf_enable_vlan_strip(struct ixl_pf *pf, struct ixl_vf *vf)
1105 {
1106 	struct i40e_vsi_context vsi_ctx;
1107 
1108 	vsi_ctx.seid = vf->vsi.seid;
1109 
1110 	bzero(&vsi_ctx.info, sizeof(vsi_ctx.info));
1111 	vsi_ctx.info.valid_sections = htole16(I40E_AQ_VSI_PROP_VLAN_VALID);
1112 	vsi_ctx.info.port_vlan_flags = I40E_AQ_VSI_PVLAN_MODE_ALL |
1113 	    I40E_AQ_VSI_PVLAN_EMOD_STR_BOTH;
1114 	return (i40e_aq_update_vsi_params(&pf->hw, &vsi_ctx, NULL));
1115 }
1116 
1117 static void
1118 ixl_vf_add_vlan_msg(struct ixl_pf *pf, struct ixl_vf *vf, void *msg,
1119     uint16_t msg_size)
1120 {
1121 	struct virtchnl_vlan_filter_list *filter_list;
1122 	enum i40e_status_code code;
1123 	int i;
1124 
1125 	filter_list = msg;
1126 
1127 	if (filter_list->vsi_id != vf->vsi.vsi_num) {
1128 		i40e_send_vf_nack(pf, vf, VIRTCHNL_OP_ADD_VLAN,
1129 		    I40E_ERR_PARAM);
1130 		return;
1131 	}
1132 
1133 	if (!(vf->vf_flags & VF_FLAG_VLAN_CAP)) {
1134 		i40e_send_vf_nack(pf, vf, VIRTCHNL_OP_ADD_VLAN,
1135 		    I40E_ERR_PARAM);
1136 		return;
1137 	}
1138 
1139 	for (i = 0; i < filter_list->num_elements; i++) {
1140 		if (filter_list->vlan_id[i] > EVL_VLID_MASK) {
1141 			i40e_send_vf_nack(pf, vf, VIRTCHNL_OP_ADD_VLAN,
1142 			    I40E_ERR_PARAM);
1143 			return;
1144 		}
1145 	}
1146 
1147 	code = ixl_vf_enable_vlan_strip(pf, vf);
1148 	if (code != I40E_SUCCESS) {
1149 		i40e_send_vf_nack(pf, vf, VIRTCHNL_OP_ADD_VLAN,
1150 		    I40E_ERR_PARAM);
1151 	}
1152 
1153 	for (i = 0; i < filter_list->num_elements; i++)
1154 		ixl_add_filter(&vf->vsi, vf->mac, filter_list->vlan_id[i]);
1155 
1156 	ixl_send_vf_ack(pf, vf, VIRTCHNL_OP_ADD_VLAN);
1157 }
1158 
1159 static void
1160 ixl_vf_del_vlan_msg(struct ixl_pf *pf, struct ixl_vf *vf, void *msg,
1161     uint16_t msg_size)
1162 {
1163 	struct virtchnl_vlan_filter_list *filter_list;
1164 	int i;
1165 
1166 	filter_list = msg;
1167 
1168 	if (filter_list->vsi_id != vf->vsi.vsi_num) {
1169 		i40e_send_vf_nack(pf, vf, VIRTCHNL_OP_DEL_VLAN,
1170 		    I40E_ERR_PARAM);
1171 		return;
1172 	}
1173 
1174 	for (i = 0; i < filter_list->num_elements; i++) {
1175 		if (filter_list->vlan_id[i] > EVL_VLID_MASK) {
1176 			i40e_send_vf_nack(pf, vf, VIRTCHNL_OP_ADD_VLAN,
1177 			    I40E_ERR_PARAM);
1178 			return;
1179 		}
1180 	}
1181 
1182 	if (!(vf->vf_flags & VF_FLAG_VLAN_CAP)) {
1183 		i40e_send_vf_nack(pf, vf, VIRTCHNL_OP_ADD_VLAN,
1184 		    I40E_ERR_PARAM);
1185 		return;
1186 	}
1187 
1188 	for (i = 0; i < filter_list->num_elements; i++)
1189 		ixl_del_filter(&vf->vsi, vf->mac, filter_list->vlan_id[i]);
1190 
1191 	ixl_send_vf_ack(pf, vf, VIRTCHNL_OP_DEL_VLAN);
1192 }
1193 
1194 static void
1195 ixl_vf_config_promisc_msg(struct ixl_pf *pf, struct ixl_vf *vf,
1196     void *msg, uint16_t msg_size)
1197 {
1198 	struct virtchnl_promisc_info *info;
1199 	struct i40e_hw *hw = &pf->hw;
1200 	enum i40e_status_code code;
1201 
1202 	if (!(vf->vf_flags & VF_FLAG_PROMISC_CAP)) {
1203 		/*
1204 		 * Do the same thing as the Linux PF driver -- lie to the VF
1205 		 */
1206 		ixl_send_vf_ack(pf, vf,
1207 		    VIRTCHNL_OP_CONFIG_PROMISCUOUS_MODE);
1208 		return;
1209 	}
1210 
1211 	info = msg;
1212 	if (info->vsi_id != vf->vsi.vsi_num) {
1213 		i40e_send_vf_nack(pf, vf,
1214 		    VIRTCHNL_OP_CONFIG_PROMISCUOUS_MODE, I40E_ERR_PARAM);
1215 		return;
1216 	}
1217 
1218 	code = i40e_aq_set_vsi_unicast_promiscuous(hw, vf->vsi.seid,
1219 	    info->flags & FLAG_VF_UNICAST_PROMISC, NULL, TRUE);
1220 	if (code != I40E_SUCCESS) {
1221 		device_printf(pf->dev, "i40e_aq_set_vsi_unicast_promiscuous (seid %d) failed: status %s,"
1222 		    " error %s\n", vf->vsi.seid, i40e_stat_str(hw, code),
1223 		    i40e_aq_str(hw, hw->aq.asq_last_status));
1224 		i40e_send_vf_nack(pf, vf,
1225 		    VIRTCHNL_OP_CONFIG_PROMISCUOUS_MODE, I40E_ERR_PARAM);
1226 		return;
1227 	}
1228 
1229 	code = i40e_aq_set_vsi_multicast_promiscuous(hw, vf->vsi.seid,
1230 	    info->flags & FLAG_VF_MULTICAST_PROMISC, NULL);
1231 	if (code != I40E_SUCCESS) {
1232 		device_printf(pf->dev, "i40e_aq_set_vsi_multicast_promiscuous (seid %d) failed: status %s,"
1233 		    " error %s\n", vf->vsi.seid, i40e_stat_str(hw, code),
1234 		    i40e_aq_str(hw, hw->aq.asq_last_status));
1235 		i40e_send_vf_nack(pf, vf,
1236 		    VIRTCHNL_OP_CONFIG_PROMISCUOUS_MODE, I40E_ERR_PARAM);
1237 		return;
1238 	}
1239 
1240 	ixl_send_vf_ack(pf, vf, VIRTCHNL_OP_CONFIG_PROMISCUOUS_MODE);
1241 }
1242 
1243 static void
1244 ixl_vf_get_stats_msg(struct ixl_pf *pf, struct ixl_vf *vf, void *msg,
1245     uint16_t msg_size)
1246 {
1247 	struct virtchnl_queue_select *queue;
1248 
1249 	queue = msg;
1250 	if (queue->vsi_id != vf->vsi.vsi_num) {
1251 		i40e_send_vf_nack(pf, vf, VIRTCHNL_OP_GET_STATS,
1252 		    I40E_ERR_PARAM);
1253 		return;
1254 	}
1255 
1256 	ixl_update_eth_stats(&vf->vsi);
1257 
1258 	ixl_send_vf_msg(pf, vf, VIRTCHNL_OP_GET_STATS,
1259 	    I40E_SUCCESS, &vf->vsi.eth_stats, sizeof(vf->vsi.eth_stats));
1260 }
1261 
1262 static void
1263 ixl_vf_config_rss_key_msg(struct ixl_pf *pf, struct ixl_vf *vf, void *msg,
1264     uint16_t msg_size)
1265 {
1266 	struct i40e_hw *hw;
1267 	struct virtchnl_rss_key *key;
1268 	struct i40e_aqc_get_set_rss_key_data key_data;
1269 	enum i40e_status_code status;
1270 
1271 	hw = &pf->hw;
1272 
1273 	key = msg;
1274 
1275 	if (key->key_len > 52) {
1276 		device_printf(pf->dev, "VF %d: Key size in msg (%d) is greater than max key size (%d)\n",
1277 		    vf->vf_num, key->key_len, 52);
1278 		i40e_send_vf_nack(pf, vf, VIRTCHNL_OP_CONFIG_RSS_KEY,
1279 		    I40E_ERR_PARAM);
1280 		return;
1281 	}
1282 
1283 	if (key->vsi_id != vf->vsi.vsi_num) {
1284 		device_printf(pf->dev, "VF %d: VSI id in recvd message (%d) does not match expected id (%d)\n",
1285 		    vf->vf_num, key->vsi_id, vf->vsi.vsi_num);
1286 		i40e_send_vf_nack(pf, vf, VIRTCHNL_OP_CONFIG_RSS_KEY,
1287 		    I40E_ERR_PARAM);
1288 		return;
1289 	}
1290 
1291 	/* Fill out hash using MAC-dependent method */
1292 	if (hw->mac.type == I40E_MAC_X722) {
1293 		bzero(&key_data, sizeof(key_data));
1294 		if (key->key_len <= 40)
1295 			bcopy(key->key, key_data.standard_rss_key, key->key_len);
1296 		else {
1297 			bcopy(key->key, key_data.standard_rss_key, 40);
1298 			bcopy(&key->key[40], key_data.extended_hash_key, key->key_len - 40);
1299 		}
1300 		status = i40e_aq_set_rss_key(hw, vf->vsi.vsi_num, &key_data);
1301 		if (status) {
1302 			device_printf(pf->dev, "i40e_aq_set_rss_key status %s, error %s\n",
1303 			    i40e_stat_str(hw, status), i40e_aq_str(hw, hw->aq.asq_last_status));
1304 			i40e_send_vf_nack(pf, vf, VIRTCHNL_OP_CONFIG_RSS_KEY,
1305 			    I40E_ERR_ADMIN_QUEUE_ERROR);
1306 			return;
1307 		}
1308 	} else {
1309 		for (int i = 0; i < (key->key_len / 4); i++)
1310 			i40e_write_rx_ctl(hw, I40E_VFQF_HKEY1(i, vf->vf_num), ((u32 *)key->key)[i]);
1311 	}
1312 
1313 	DDPRINTF(pf->dev, "VF %d: Programmed key starting with 0x%x ok!",
1314 	    vf->vf_num, key->key[0]);
1315 
1316 	ixl_send_vf_ack(pf, vf, VIRTCHNL_OP_CONFIG_RSS_KEY);
1317 }
1318 
1319 static void
1320 ixl_vf_config_rss_lut_msg(struct ixl_pf *pf, struct ixl_vf *vf, void *msg,
1321     uint16_t msg_size)
1322 {
1323 	struct i40e_hw *hw;
1324 	struct virtchnl_rss_lut *lut;
1325 	enum i40e_status_code status;
1326 
1327 	hw = &pf->hw;
1328 
1329 	lut = msg;
1330 
1331 	if (lut->lut_entries > 64) {
1332 		device_printf(pf->dev, "VF %d: # of LUT entries in msg (%d) is greater than max (%d)\n",
1333 		    vf->vf_num, lut->lut_entries, 64);
1334 		i40e_send_vf_nack(pf, vf, VIRTCHNL_OP_CONFIG_RSS_LUT,
1335 		    I40E_ERR_PARAM);
1336 		return;
1337 	}
1338 
1339 	if (lut->vsi_id != vf->vsi.vsi_num) {
1340 		device_printf(pf->dev, "VF %d: VSI id in recvd message (%d) does not match expected id (%d)\n",
1341 		    vf->vf_num, lut->vsi_id, vf->vsi.vsi_num);
1342 		i40e_send_vf_nack(pf, vf, VIRTCHNL_OP_CONFIG_RSS_LUT,
1343 		    I40E_ERR_PARAM);
1344 		return;
1345 	}
1346 
1347 	/* Fill out LUT using MAC-dependent method */
1348 	if (hw->mac.type == I40E_MAC_X722) {
1349 		status = i40e_aq_set_rss_lut(hw, vf->vsi.vsi_num, false, lut->lut, lut->lut_entries);
1350 		if (status) {
1351 			device_printf(pf->dev, "i40e_aq_set_rss_lut status %s, error %s\n",
1352 			    i40e_stat_str(hw, status), i40e_aq_str(hw, hw->aq.asq_last_status));
1353 			i40e_send_vf_nack(pf, vf, VIRTCHNL_OP_CONFIG_RSS_LUT,
1354 			    I40E_ERR_ADMIN_QUEUE_ERROR);
1355 			return;
1356 		}
1357 	} else {
1358 		for (int i = 0; i < (lut->lut_entries / 4); i++)
1359 			i40e_write_rx_ctl(hw, I40E_VFQF_HLUT1(i, vf->vf_num), ((u32 *)lut->lut)[i]);
1360 	}
1361 
1362 	DDPRINTF(pf->dev, "VF %d: Programmed LUT starting with 0x%x and length %d ok!",
1363 	    vf->vf_num, lut->lut[0], lut->lut_entries);
1364 
1365 	ixl_send_vf_ack(pf, vf, VIRTCHNL_OP_CONFIG_RSS_LUT);
1366 }
1367 
1368 static void
1369 ixl_vf_set_rss_hena_msg(struct ixl_pf *pf, struct ixl_vf *vf, void *msg,
1370     uint16_t msg_size)
1371 {
1372 	struct i40e_hw *hw;
1373 	struct virtchnl_rss_hena *hena;
1374 
1375 	hw = &pf->hw;
1376 	hena = msg;
1377 
1378 	/* Set HENA */
1379 	i40e_write_rx_ctl(hw, I40E_VFQF_HENA1(0, vf->vf_num), (u32)hena->hena);
1380 	i40e_write_rx_ctl(hw, I40E_VFQF_HENA1(1, vf->vf_num), (u32)(hena->hena >> 32));
1381 
1382 	DDPRINTF(pf->dev, "VF %d: Programmed HENA with 0x%016lx",
1383 	    vf->vf_num, hena->hena);
1384 
1385 	ixl_send_vf_ack(pf, vf, VIRTCHNL_OP_SET_RSS_HENA);
1386 }
1387 
1388 static void
1389 ixl_notify_vf_link_state(struct ixl_pf *pf, struct ixl_vf *vf)
1390 {
1391 	struct virtchnl_pf_event event;
1392 	struct i40e_hw *hw;
1393 
1394 	hw = &pf->hw;
1395 	event.event = VIRTCHNL_EVENT_LINK_CHANGE;
1396 	event.severity = PF_EVENT_SEVERITY_INFO;
1397 	event.event_data.link_event.link_status = pf->vsi.link_active;
1398 	event.event_data.link_event.link_speed =
1399 	    i40e_virtchnl_link_speed(hw->phy.link_info.link_speed);
1400 
1401 	ixl_send_vf_msg(pf, vf, VIRTCHNL_OP_EVENT, I40E_SUCCESS, &event,
1402 			sizeof(event));
1403 }
1404 
1405 void
1406 ixl_broadcast_link_state(struct ixl_pf *pf)
1407 {
1408 	int i;
1409 
1410 	for (i = 0; i < pf->num_vfs; i++)
1411 		ixl_notify_vf_link_state(pf, &pf->vfs[i]);
1412 }
1413 
1414 void
1415 ixl_handle_vf_msg(struct ixl_pf *pf, struct i40e_arq_event_info *event)
1416 {
1417 	device_t dev = pf->dev;
1418 	struct ixl_vf *vf;
1419 	uint16_t vf_num, msg_size;
1420 	uint32_t opcode;
1421 	void *msg;
1422 	int err;
1423 
1424 	vf_num = le16toh(event->desc.retval) - pf->hw.func_caps.vf_base_id;
1425 	opcode = le32toh(event->desc.cookie_high);
1426 
1427 	if (vf_num >= pf->num_vfs) {
1428 		device_printf(pf->dev, "Got msg from illegal VF: %d\n", vf_num);
1429 		return;
1430 	}
1431 
1432 	vf = &pf->vfs[vf_num];
1433 	msg = event->msg_buf;
1434 	msg_size = event->msg_len;
1435 
1436 	I40E_VC_DEBUG(pf, ixl_vc_opcode_level(opcode),
1437 	    "Got msg %s(%d) from%sVF-%d of size %d\n",
1438 	    ixl_vc_opcode_str(opcode), opcode,
1439 	    (vf->vf_flags & VF_FLAG_ENABLED) ? " " : " disabled ",
1440 	    vf_num, msg_size);
1441 
1442 	/* Perform basic checks on the msg */
1443 	err = virtchnl_vc_validate_vf_msg(&vf->version, opcode, msg, msg_size);
1444 	if (err) {
1445 		device_printf(dev, "%s: Received invalid msg from VF-%d: opcode %d, len %d, error %d\n",
1446 		    __func__, vf->vf_num, opcode, msg_size, err);
1447 		i40e_send_vf_nack(pf, vf, opcode, I40E_ERR_PARAM);
1448 		return;
1449 	}
1450 
1451 	/* This must be a stray msg from a previously destroyed VF. */
1452 	if (!(vf->vf_flags & VF_FLAG_ENABLED))
1453 		return;
1454 
1455 	switch (opcode) {
1456 	case VIRTCHNL_OP_VERSION:
1457 		ixl_vf_version_msg(pf, vf, msg, msg_size);
1458 		break;
1459 	case VIRTCHNL_OP_RESET_VF:
1460 		ixl_vf_reset_msg(pf, vf, msg, msg_size);
1461 		break;
1462 	case VIRTCHNL_OP_GET_VF_RESOURCES:
1463 		ixl_vf_get_resources_msg(pf, vf, msg, msg_size);
1464 		/* Notify VF of link state after it obtains queues, as this is
1465 		 * the last thing it will do as part of initialization
1466 		 */
1467 		ixl_notify_vf_link_state(pf, vf);
1468 		break;
1469 	case VIRTCHNL_OP_CONFIG_VSI_QUEUES:
1470 		ixl_vf_config_vsi_msg(pf, vf, msg, msg_size);
1471 		break;
1472 	case VIRTCHNL_OP_CONFIG_IRQ_MAP:
1473 		ixl_vf_config_irq_msg(pf, vf, msg, msg_size);
1474 		break;
1475 	case VIRTCHNL_OP_ENABLE_QUEUES:
1476 		ixl_vf_enable_queues_msg(pf, vf, msg, msg_size);
1477 		/* Notify VF of link state after it obtains queues, as this is
1478 		 * the last thing it will do as part of initialization
1479 		 */
1480 		ixl_notify_vf_link_state(pf, vf);
1481 		break;
1482 	case VIRTCHNL_OP_DISABLE_QUEUES:
1483 		ixl_vf_disable_queues_msg(pf, vf, msg, msg_size);
1484 		break;
1485 	case VIRTCHNL_OP_ADD_ETH_ADDR:
1486 		ixl_vf_add_mac_msg(pf, vf, msg, msg_size);
1487 		break;
1488 	case VIRTCHNL_OP_DEL_ETH_ADDR:
1489 		ixl_vf_del_mac_msg(pf, vf, msg, msg_size);
1490 		break;
1491 	case VIRTCHNL_OP_ADD_VLAN:
1492 		ixl_vf_add_vlan_msg(pf, vf, msg, msg_size);
1493 		break;
1494 	case VIRTCHNL_OP_DEL_VLAN:
1495 		ixl_vf_del_vlan_msg(pf, vf, msg, msg_size);
1496 		break;
1497 	case VIRTCHNL_OP_CONFIG_PROMISCUOUS_MODE:
1498 		ixl_vf_config_promisc_msg(pf, vf, msg, msg_size);
1499 		break;
1500 	case VIRTCHNL_OP_GET_STATS:
1501 		ixl_vf_get_stats_msg(pf, vf, msg, msg_size);
1502 		break;
1503 	case VIRTCHNL_OP_CONFIG_RSS_KEY:
1504 		ixl_vf_config_rss_key_msg(pf, vf, msg, msg_size);
1505 		break;
1506 	case VIRTCHNL_OP_CONFIG_RSS_LUT:
1507 		ixl_vf_config_rss_lut_msg(pf, vf, msg, msg_size);
1508 		break;
1509 	case VIRTCHNL_OP_SET_RSS_HENA:
1510 		ixl_vf_set_rss_hena_msg(pf, vf, msg, msg_size);
1511 		break;
1512 
1513 	/* These two opcodes have been superseded by CONFIG_VSI_QUEUES. */
1514 	case VIRTCHNL_OP_CONFIG_TX_QUEUE:
1515 	case VIRTCHNL_OP_CONFIG_RX_QUEUE:
1516 	default:
1517 		i40e_send_vf_nack(pf, vf, opcode, I40E_ERR_NOT_IMPLEMENTED);
1518 		break;
1519 	}
1520 }
1521 
1522 /* Handle any VFs that have reset themselves via a Function Level Reset(FLR). */
1523 void
1524 ixl_handle_vflr(struct ixl_pf *pf)
1525 {
1526 	struct ixl_vf *vf;
1527 	struct i40e_hw *hw;
1528 	uint16_t global_vf_num;
1529 	uint32_t vflrstat_index, vflrstat_mask, vflrstat, icr0;
1530 	int i;
1531 
1532 	hw = &pf->hw;
1533 
1534 	ixl_dbg_iov(pf, "%s: begin\n", __func__);
1535 
1536 	/* Re-enable VFLR interrupt cause so driver doesn't miss a
1537 	 * reset interrupt for another VF */
1538 	icr0 = rd32(hw, I40E_PFINT_ICR0_ENA);
1539 	icr0 |= I40E_PFINT_ICR0_ENA_VFLR_MASK;
1540 	wr32(hw, I40E_PFINT_ICR0_ENA, icr0);
1541 	ixl_flush(hw);
1542 
1543 	for (i = 0; i < pf->num_vfs; i++) {
1544 		global_vf_num = hw->func_caps.vf_base_id + i;
1545 
1546 		vf = &pf->vfs[i];
1547 		if (!(vf->vf_flags & VF_FLAG_ENABLED))
1548 			continue;
1549 
1550 		vflrstat_index = IXL_GLGEN_VFLRSTAT_INDEX(global_vf_num);
1551 		vflrstat_mask = IXL_GLGEN_VFLRSTAT_MASK(global_vf_num);
1552 		vflrstat = rd32(hw, I40E_GLGEN_VFLRSTAT(vflrstat_index));
1553 		if (vflrstat & vflrstat_mask) {
1554 			wr32(hw, I40E_GLGEN_VFLRSTAT(vflrstat_index),
1555 			    vflrstat_mask);
1556 
1557 			ixl_dbg_iov(pf, "Reinitializing VF-%d\n", i);
1558 			ixl_reinit_vf(pf, vf);
1559 			ixl_dbg_iov(pf, "Reinitializing VF-%d done\n", i);
1560 		}
1561 	}
1562 
1563 }
1564 
1565 static int
1566 ixl_adminq_err_to_errno(enum i40e_admin_queue_err err)
1567 {
1568 
1569 	switch (err) {
1570 	case I40E_AQ_RC_EPERM:
1571 		return (EPERM);
1572 	case I40E_AQ_RC_ENOENT:
1573 		return (ENOENT);
1574 	case I40E_AQ_RC_ESRCH:
1575 		return (ESRCH);
1576 	case I40E_AQ_RC_EINTR:
1577 		return (EINTR);
1578 	case I40E_AQ_RC_EIO:
1579 		return (EIO);
1580 	case I40E_AQ_RC_ENXIO:
1581 		return (ENXIO);
1582 	case I40E_AQ_RC_E2BIG:
1583 		return (E2BIG);
1584 	case I40E_AQ_RC_EAGAIN:
1585 		return (EAGAIN);
1586 	case I40E_AQ_RC_ENOMEM:
1587 		return (ENOMEM);
1588 	case I40E_AQ_RC_EACCES:
1589 		return (EACCES);
1590 	case I40E_AQ_RC_EFAULT:
1591 		return (EFAULT);
1592 	case I40E_AQ_RC_EBUSY:
1593 		return (EBUSY);
1594 	case I40E_AQ_RC_EEXIST:
1595 		return (EEXIST);
1596 	case I40E_AQ_RC_EINVAL:
1597 		return (EINVAL);
1598 	case I40E_AQ_RC_ENOTTY:
1599 		return (ENOTTY);
1600 	case I40E_AQ_RC_ENOSPC:
1601 		return (ENOSPC);
1602 	case I40E_AQ_RC_ENOSYS:
1603 		return (ENOSYS);
1604 	case I40E_AQ_RC_ERANGE:
1605 		return (ERANGE);
1606 	case I40E_AQ_RC_EFLUSHED:
1607 		return (EINVAL);	/* No exact equivalent in errno.h */
1608 	case I40E_AQ_RC_BAD_ADDR:
1609 		return (EFAULT);
1610 	case I40E_AQ_RC_EMODE:
1611 		return (EPERM);
1612 	case I40E_AQ_RC_EFBIG:
1613 		return (EFBIG);
1614 	default:
1615 		return (EINVAL);
1616 	}
1617 }
1618 
1619 static int
1620 ixl_config_pf_vsi_loopback(struct ixl_pf *pf, bool enable)
1621 {
1622 	struct i40e_hw *hw = &pf->hw;
1623 	device_t dev = pf->dev;
1624 	struct ixl_vsi *vsi = &pf->vsi;
1625 	struct i40e_vsi_context	ctxt;
1626 	int error;
1627 
1628 	memset(&ctxt, 0, sizeof(ctxt));
1629 
1630 	ctxt.seid = vsi->seid;
1631 	if (pf->veb_seid != 0)
1632 		ctxt.uplink_seid = pf->veb_seid;
1633 	ctxt.pf_num = hw->pf_id;
1634 	ctxt.connection_type = IXL_VSI_DATA_PORT;
1635 
1636 	ctxt.info.valid_sections = htole16(I40E_AQ_VSI_PROP_SWITCH_VALID);
1637 	ctxt.info.switch_id = (enable) ?
1638 	    htole16(I40E_AQ_VSI_SW_ID_FLAG_ALLOW_LB) : 0;
1639 
1640 	/* error is set to 0 on success */
1641 	error = i40e_aq_update_vsi_params(hw, &ctxt, NULL);
1642 	if (error) {
1643 		device_printf(dev, "i40e_aq_update_vsi_params() failed, error %d,"
1644 		    " aq_error %d\n", error, hw->aq.asq_last_status);
1645 	}
1646 
1647 	return (error);
1648 }
1649 
1650 int
1651 ixl_if_iov_init(if_ctx_t ctx, uint16_t num_vfs, const nvlist_t *params)
1652 {
1653 	struct ixl_pf *pf = iflib_get_softc(ctx);
1654 	device_t dev = iflib_get_dev(ctx);
1655 	struct i40e_hw *hw;
1656 	struct ixl_vsi *pf_vsi;
1657 	enum i40e_status_code ret;
1658 	int error;
1659 
1660 	hw = &pf->hw;
1661 	pf_vsi = &pf->vsi;
1662 
1663 	pf->vfs = malloc(sizeof(struct ixl_vf) * num_vfs, M_IXL, M_NOWAIT |
1664 	    M_ZERO);
1665 	if (pf->vfs == NULL) {
1666 		error = ENOMEM;
1667 		goto fail;
1668 	}
1669 
1670 	/*
1671 	 * Add the VEB and ...
1672 	 * - do nothing: VEPA mode
1673 	 * - enable loopback mode on connected VSIs: VEB mode
1674 	 */
1675 	ret = i40e_aq_add_veb(hw, pf_vsi->uplink_seid, pf_vsi->seid,
1676 	    1, FALSE, &pf->veb_seid, FALSE, NULL);
1677 	if (ret != I40E_SUCCESS) {
1678 		error = hw->aq.asq_last_status;
1679 		device_printf(dev, "i40e_aq_add_veb failed; status %s error %s",
1680 		    i40e_stat_str(hw, ret), i40e_aq_str(hw, error));
1681 		goto fail;
1682 	}
1683 	if (pf->enable_vf_loopback)
1684 		ixl_config_pf_vsi_loopback(pf, true);
1685 
1686 	/*
1687 	 * Adding a VEB brings back the default MAC filter(s). Remove them,
1688 	 * and let the driver add the proper filters back.
1689 	 */
1690 	ixl_del_default_hw_filters(pf_vsi);
1691 	ixl_reconfigure_filters(pf_vsi);
1692 
1693 	pf->num_vfs = num_vfs;
1694 	return (0);
1695 
1696 fail:
1697 	free(pf->vfs, M_IXL);
1698 	pf->vfs = NULL;
1699 	return (error);
1700 }
1701 
1702 void
1703 ixl_if_iov_uninit(if_ctx_t ctx)
1704 {
1705 	struct ixl_pf *pf = iflib_get_softc(ctx);
1706 	struct i40e_hw *hw;
1707 	struct ixl_vsi *vsi;
1708 	struct ifnet *ifp;
1709 	struct ixl_vf *vfs;
1710 	int i, num_vfs;
1711 
1712 	hw = &pf->hw;
1713 	vsi = &pf->vsi;
1714 	ifp = vsi->ifp;
1715 
1716 	for (i = 0; i < pf->num_vfs; i++) {
1717 		if (pf->vfs[i].vsi.seid != 0)
1718 			i40e_aq_delete_element(hw, pf->vfs[i].vsi.seid, NULL);
1719 		ixl_pf_qmgr_release(&pf->qmgr, &pf->vfs[i].qtag);
1720 		ixl_free_mac_filters(&pf->vfs[i].vsi);
1721 		ixl_dbg_iov(pf, "VF %d: %d released\n",
1722 		    i, pf->vfs[i].qtag.num_allocated);
1723 		ixl_dbg_iov(pf, "Unallocated total: %d\n", ixl_pf_qmgr_get_num_free(&pf->qmgr));
1724 	}
1725 
1726 	if (pf->veb_seid != 0) {
1727 		i40e_aq_delete_element(hw, pf->veb_seid, NULL);
1728 		pf->veb_seid = 0;
1729 	}
1730 	/* Reset PF VSI loopback mode */
1731 	if (pf->enable_vf_loopback)
1732 		ixl_config_pf_vsi_loopback(pf, false);
1733 
1734 	vfs = pf->vfs;
1735 	num_vfs = pf->num_vfs;
1736 
1737 	pf->vfs = NULL;
1738 	pf->num_vfs = 0;
1739 
1740 	/* sysctl_ctx_free might sleep, but this func is called w/ an sx lock */
1741 	for (i = 0; i < num_vfs; i++)
1742 		sysctl_ctx_free(&vfs[i].vsi.sysctl_ctx);
1743 	free(vfs, M_IXL);
1744 }
1745 
1746 static int
1747 ixl_vf_reserve_queues(struct ixl_pf *pf, struct ixl_vf *vf, int num_queues)
1748 {
1749 	device_t dev = pf->dev;
1750 	int error;
1751 
1752 	/* Validate, and clamp value if invalid */
1753 	if (num_queues < 1 || num_queues > 16)
1754 		device_printf(dev, "Invalid num-queues (%d) for VF %d\n",
1755 		    num_queues, vf->vf_num);
1756 	if (num_queues < 1) {
1757 		device_printf(dev, "Setting VF %d num-queues to 1\n", vf->vf_num);
1758 		num_queues = 1;
1759 	} else if (num_queues > IAVF_MAX_QUEUES) {
1760 		device_printf(dev, "Setting VF %d num-queues to %d\n", vf->vf_num, IAVF_MAX_QUEUES);
1761 		num_queues = IAVF_MAX_QUEUES;
1762 	}
1763 	error = ixl_pf_qmgr_alloc_scattered(&pf->qmgr, num_queues, &vf->qtag);
1764 	if (error) {
1765 		device_printf(dev, "Error allocating %d queues for VF %d's VSI\n",
1766 		    num_queues, vf->vf_num);
1767 		return (ENOSPC);
1768 	}
1769 
1770 	ixl_dbg_iov(pf, "VF %d: %d allocated, %d active\n",
1771 	    vf->vf_num, vf->qtag.num_allocated, vf->qtag.num_active);
1772 	ixl_dbg_iov(pf, "Unallocated total: %d\n", ixl_pf_qmgr_get_num_free(&pf->qmgr));
1773 
1774 	return (0);
1775 }
1776 
1777 int
1778 ixl_if_iov_vf_add(if_ctx_t ctx, uint16_t vfnum, const nvlist_t *params)
1779 {
1780 	struct ixl_pf *pf = iflib_get_softc(ctx);
1781 	char sysctl_name[IXL_QUEUE_NAME_LEN];
1782 	struct ixl_vf *vf;
1783 	const void *mac;
1784 	size_t size;
1785 	int error;
1786 	int vf_num_queues;
1787 
1788 	vf = &pf->vfs[vfnum];
1789 	vf->vf_num = vfnum;
1790 	vf->vsi.back = pf;
1791 	vf->vf_flags = VF_FLAG_ENABLED;
1792 
1793 	/* Reserve queue allocation from PF */
1794 	vf_num_queues = nvlist_get_number(params, "num-queues");
1795 	error = ixl_vf_reserve_queues(pf, vf, vf_num_queues);
1796 	if (error != 0)
1797 		goto out;
1798 
1799 	error = ixl_vf_setup_vsi(pf, vf);
1800 	if (error != 0)
1801 		goto out;
1802 
1803 	if (nvlist_exists_binary(params, "mac-addr")) {
1804 		mac = nvlist_get_binary(params, "mac-addr", &size);
1805 		bcopy(mac, vf->mac, ETHER_ADDR_LEN);
1806 
1807 		if (nvlist_get_bool(params, "allow-set-mac"))
1808 			vf->vf_flags |= VF_FLAG_SET_MAC_CAP;
1809 	} else
1810 		/*
1811 		 * If the administrator has not specified a MAC address then
1812 		 * we must allow the VF to choose one.
1813 		 */
1814 		vf->vf_flags |= VF_FLAG_SET_MAC_CAP;
1815 
1816 	if (nvlist_get_bool(params, "mac-anti-spoof"))
1817 		vf->vf_flags |= VF_FLAG_MAC_ANTI_SPOOF;
1818 
1819 	if (nvlist_get_bool(params, "allow-promisc"))
1820 		vf->vf_flags |= VF_FLAG_PROMISC_CAP;
1821 
1822 	vf->vf_flags |= VF_FLAG_VLAN_CAP;
1823 
1824 	/* VF needs to be reset before it can be used */
1825 	ixl_reset_vf(pf, vf);
1826 out:
1827 	if (error == 0) {
1828 		snprintf(sysctl_name, sizeof(sysctl_name), "vf%d", vfnum);
1829 		ixl_vsi_add_sysctls(&vf->vsi, sysctl_name, false);
1830 	}
1831 
1832 	return (error);
1833 }
1834 
1835