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