1 /******************************************************************************
2
3 Copyright (c) 2013-2015, 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 "i40e_type.h"
36 #include "i40e_adminq.h"
37 #include "i40e_prototype.h"
38 #include "i40e_virtchnl.h"
39
40
41 /**
42 * i40e_set_mac_type - Sets MAC type
43 * @hw: pointer to the HW structure
44 *
45 * This function sets the mac type of the adapter based on the
46 * vendor ID and device ID stored in the hw structure.
47 **/
i40e_set_mac_type(struct i40e_hw * hw)48 static enum i40e_status_code i40e_set_mac_type(struct i40e_hw *hw)
49 {
50 enum i40e_status_code status = I40E_SUCCESS;
51
52 DEBUGFUNC("i40e_set_mac_type\n");
53
54 if (hw->vendor_id == I40E_INTEL_VENDOR_ID) {
55 switch (hw->device_id) {
56 case I40E_DEV_ID_SFP_XL710:
57 case I40E_DEV_ID_QEMU:
58 case I40E_DEV_ID_KX_B:
59 case I40E_DEV_ID_KX_C:
60 case I40E_DEV_ID_QSFP_A:
61 case I40E_DEV_ID_QSFP_B:
62 case I40E_DEV_ID_QSFP_C:
63 case I40E_DEV_ID_10G_BASE_T:
64 case I40E_DEV_ID_10G_BASE_T4:
65 case I40E_DEV_ID_20G_KR2:
66 case I40E_DEV_ID_20G_KR2_A:
67 case I40E_DEV_ID_25G_B:
68 case I40E_DEV_ID_25G_SFP28:
69 hw->mac.type = I40E_MAC_XL710;
70 break;
71 case I40E_DEV_ID_X722_A0:
72 case I40E_DEV_ID_KX_X722:
73 case I40E_DEV_ID_QSFP_X722:
74 case I40E_DEV_ID_SFP_X722:
75 case I40E_DEV_ID_1G_BASE_T_X722:
76 case I40E_DEV_ID_10G_BASE_T_X722:
77 case I40E_DEV_ID_SFP_I_X722:
78 hw->mac.type = I40E_MAC_X722;
79 break;
80 default:
81 hw->mac.type = I40E_MAC_GENERIC;
82 break;
83 }
84 } else {
85 status = I40E_ERR_DEVICE_NOT_SUPPORTED;
86 }
87
88 DEBUGOUT2("i40e_set_mac_type found mac: %d, returns: %d\n",
89 hw->mac.type, status);
90 return status;
91 }
92
93 /**
94 * i40e_aq_str - convert AQ err code to a string
95 * @hw: pointer to the HW structure
96 * @aq_err: the AQ error code to convert
97 **/
i40e_aq_str(struct i40e_hw * hw,enum i40e_admin_queue_err aq_err)98 const char *i40e_aq_str(struct i40e_hw *hw, enum i40e_admin_queue_err aq_err)
99 {
100 switch (aq_err) {
101 case I40E_AQ_RC_OK:
102 return "OK";
103 case I40E_AQ_RC_EPERM:
104 return "I40E_AQ_RC_EPERM";
105 case I40E_AQ_RC_ENOENT:
106 return "I40E_AQ_RC_ENOENT";
107 case I40E_AQ_RC_ESRCH:
108 return "I40E_AQ_RC_ESRCH";
109 case I40E_AQ_RC_EINTR:
110 return "I40E_AQ_RC_EINTR";
111 case I40E_AQ_RC_EIO:
112 return "I40E_AQ_RC_EIO";
113 case I40E_AQ_RC_ENXIO:
114 return "I40E_AQ_RC_ENXIO";
115 case I40E_AQ_RC_E2BIG:
116 return "I40E_AQ_RC_E2BIG";
117 case I40E_AQ_RC_EAGAIN:
118 return "I40E_AQ_RC_EAGAIN";
119 case I40E_AQ_RC_ENOMEM:
120 return "I40E_AQ_RC_ENOMEM";
121 case I40E_AQ_RC_EACCES:
122 return "I40E_AQ_RC_EACCES";
123 case I40E_AQ_RC_EFAULT:
124 return "I40E_AQ_RC_EFAULT";
125 case I40E_AQ_RC_EBUSY:
126 return "I40E_AQ_RC_EBUSY";
127 case I40E_AQ_RC_EEXIST:
128 return "I40E_AQ_RC_EEXIST";
129 case I40E_AQ_RC_EINVAL:
130 return "I40E_AQ_RC_EINVAL";
131 case I40E_AQ_RC_ENOTTY:
132 return "I40E_AQ_RC_ENOTTY";
133 case I40E_AQ_RC_ENOSPC:
134 return "I40E_AQ_RC_ENOSPC";
135 case I40E_AQ_RC_ENOSYS:
136 return "I40E_AQ_RC_ENOSYS";
137 case I40E_AQ_RC_ERANGE:
138 return "I40E_AQ_RC_ERANGE";
139 case I40E_AQ_RC_EFLUSHED:
140 return "I40E_AQ_RC_EFLUSHED";
141 case I40E_AQ_RC_BAD_ADDR:
142 return "I40E_AQ_RC_BAD_ADDR";
143 case I40E_AQ_RC_EMODE:
144 return "I40E_AQ_RC_EMODE";
145 case I40E_AQ_RC_EFBIG:
146 return "I40E_AQ_RC_EFBIG";
147 }
148
149 snprintf(hw->err_str, sizeof(hw->err_str), "%d", aq_err);
150 return hw->err_str;
151 }
152
153 /**
154 * i40e_stat_str - convert status err code to a string
155 * @hw: pointer to the HW structure
156 * @stat_err: the status error code to convert
157 **/
i40e_stat_str(struct i40e_hw * hw,enum i40e_status_code stat_err)158 const char *i40e_stat_str(struct i40e_hw *hw, enum i40e_status_code stat_err)
159 {
160 switch (stat_err) {
161 case I40E_SUCCESS:
162 return "OK";
163 case I40E_ERR_NVM:
164 return "I40E_ERR_NVM";
165 case I40E_ERR_NVM_CHECKSUM:
166 return "I40E_ERR_NVM_CHECKSUM";
167 case I40E_ERR_PHY:
168 return "I40E_ERR_PHY";
169 case I40E_ERR_CONFIG:
170 return "I40E_ERR_CONFIG";
171 case I40E_ERR_PARAM:
172 return "I40E_ERR_PARAM";
173 case I40E_ERR_MAC_TYPE:
174 return "I40E_ERR_MAC_TYPE";
175 case I40E_ERR_UNKNOWN_PHY:
176 return "I40E_ERR_UNKNOWN_PHY";
177 case I40E_ERR_LINK_SETUP:
178 return "I40E_ERR_LINK_SETUP";
179 case I40E_ERR_ADAPTER_STOPPED:
180 return "I40E_ERR_ADAPTER_STOPPED";
181 case I40E_ERR_INVALID_MAC_ADDR:
182 return "I40E_ERR_INVALID_MAC_ADDR";
183 case I40E_ERR_DEVICE_NOT_SUPPORTED:
184 return "I40E_ERR_DEVICE_NOT_SUPPORTED";
185 case I40E_ERR_MASTER_REQUESTS_PENDING:
186 return "I40E_ERR_MASTER_REQUESTS_PENDING";
187 case I40E_ERR_INVALID_LINK_SETTINGS:
188 return "I40E_ERR_INVALID_LINK_SETTINGS";
189 case I40E_ERR_AUTONEG_NOT_COMPLETE:
190 return "I40E_ERR_AUTONEG_NOT_COMPLETE";
191 case I40E_ERR_RESET_FAILED:
192 return "I40E_ERR_RESET_FAILED";
193 case I40E_ERR_SWFW_SYNC:
194 return "I40E_ERR_SWFW_SYNC";
195 case I40E_ERR_NO_AVAILABLE_VSI:
196 return "I40E_ERR_NO_AVAILABLE_VSI";
197 case I40E_ERR_NO_MEMORY:
198 return "I40E_ERR_NO_MEMORY";
199 case I40E_ERR_BAD_PTR:
200 return "I40E_ERR_BAD_PTR";
201 case I40E_ERR_RING_FULL:
202 return "I40E_ERR_RING_FULL";
203 case I40E_ERR_INVALID_PD_ID:
204 return "I40E_ERR_INVALID_PD_ID";
205 case I40E_ERR_INVALID_QP_ID:
206 return "I40E_ERR_INVALID_QP_ID";
207 case I40E_ERR_INVALID_CQ_ID:
208 return "I40E_ERR_INVALID_CQ_ID";
209 case I40E_ERR_INVALID_CEQ_ID:
210 return "I40E_ERR_INVALID_CEQ_ID";
211 case I40E_ERR_INVALID_AEQ_ID:
212 return "I40E_ERR_INVALID_AEQ_ID";
213 case I40E_ERR_INVALID_SIZE:
214 return "I40E_ERR_INVALID_SIZE";
215 case I40E_ERR_INVALID_ARP_INDEX:
216 return "I40E_ERR_INVALID_ARP_INDEX";
217 case I40E_ERR_INVALID_FPM_FUNC_ID:
218 return "I40E_ERR_INVALID_FPM_FUNC_ID";
219 case I40E_ERR_QP_INVALID_MSG_SIZE:
220 return "I40E_ERR_QP_INVALID_MSG_SIZE";
221 case I40E_ERR_QP_TOOMANY_WRS_POSTED:
222 return "I40E_ERR_QP_TOOMANY_WRS_POSTED";
223 case I40E_ERR_INVALID_FRAG_COUNT:
224 return "I40E_ERR_INVALID_FRAG_COUNT";
225 case I40E_ERR_QUEUE_EMPTY:
226 return "I40E_ERR_QUEUE_EMPTY";
227 case I40E_ERR_INVALID_ALIGNMENT:
228 return "I40E_ERR_INVALID_ALIGNMENT";
229 case I40E_ERR_FLUSHED_QUEUE:
230 return "I40E_ERR_FLUSHED_QUEUE";
231 case I40E_ERR_INVALID_PUSH_PAGE_INDEX:
232 return "I40E_ERR_INVALID_PUSH_PAGE_INDEX";
233 case I40E_ERR_INVALID_IMM_DATA_SIZE:
234 return "I40E_ERR_INVALID_IMM_DATA_SIZE";
235 case I40E_ERR_TIMEOUT:
236 return "I40E_ERR_TIMEOUT";
237 case I40E_ERR_OPCODE_MISMATCH:
238 return "I40E_ERR_OPCODE_MISMATCH";
239 case I40E_ERR_CQP_COMPL_ERROR:
240 return "I40E_ERR_CQP_COMPL_ERROR";
241 case I40E_ERR_INVALID_VF_ID:
242 return "I40E_ERR_INVALID_VF_ID";
243 case I40E_ERR_INVALID_HMCFN_ID:
244 return "I40E_ERR_INVALID_HMCFN_ID";
245 case I40E_ERR_BACKING_PAGE_ERROR:
246 return "I40E_ERR_BACKING_PAGE_ERROR";
247 case I40E_ERR_NO_PBLCHUNKS_AVAILABLE:
248 return "I40E_ERR_NO_PBLCHUNKS_AVAILABLE";
249 case I40E_ERR_INVALID_PBLE_INDEX:
250 return "I40E_ERR_INVALID_PBLE_INDEX";
251 case I40E_ERR_INVALID_SD_INDEX:
252 return "I40E_ERR_INVALID_SD_INDEX";
253 case I40E_ERR_INVALID_PAGE_DESC_INDEX:
254 return "I40E_ERR_INVALID_PAGE_DESC_INDEX";
255 case I40E_ERR_INVALID_SD_TYPE:
256 return "I40E_ERR_INVALID_SD_TYPE";
257 case I40E_ERR_MEMCPY_FAILED:
258 return "I40E_ERR_MEMCPY_FAILED";
259 case I40E_ERR_INVALID_HMC_OBJ_INDEX:
260 return "I40E_ERR_INVALID_HMC_OBJ_INDEX";
261 case I40E_ERR_INVALID_HMC_OBJ_COUNT:
262 return "I40E_ERR_INVALID_HMC_OBJ_COUNT";
263 case I40E_ERR_INVALID_SRQ_ARM_LIMIT:
264 return "I40E_ERR_INVALID_SRQ_ARM_LIMIT";
265 case I40E_ERR_SRQ_ENABLED:
266 return "I40E_ERR_SRQ_ENABLED";
267 case I40E_ERR_ADMIN_QUEUE_ERROR:
268 return "I40E_ERR_ADMIN_QUEUE_ERROR";
269 case I40E_ERR_ADMIN_QUEUE_TIMEOUT:
270 return "I40E_ERR_ADMIN_QUEUE_TIMEOUT";
271 case I40E_ERR_BUF_TOO_SHORT:
272 return "I40E_ERR_BUF_TOO_SHORT";
273 case I40E_ERR_ADMIN_QUEUE_FULL:
274 return "I40E_ERR_ADMIN_QUEUE_FULL";
275 case I40E_ERR_ADMIN_QUEUE_NO_WORK:
276 return "I40E_ERR_ADMIN_QUEUE_NO_WORK";
277 case I40E_ERR_BAD_IWARP_CQE:
278 return "I40E_ERR_BAD_IWARP_CQE";
279 case I40E_ERR_NVM_BLANK_MODE:
280 return "I40E_ERR_NVM_BLANK_MODE";
281 case I40E_ERR_NOT_IMPLEMENTED:
282 return "I40E_ERR_NOT_IMPLEMENTED";
283 case I40E_ERR_PE_DOORBELL_NOT_ENABLED:
284 return "I40E_ERR_PE_DOORBELL_NOT_ENABLED";
285 case I40E_ERR_DIAG_TEST_FAILED:
286 return "I40E_ERR_DIAG_TEST_FAILED";
287 case I40E_ERR_NOT_READY:
288 return "I40E_ERR_NOT_READY";
289 case I40E_NOT_SUPPORTED:
290 return "I40E_NOT_SUPPORTED";
291 case I40E_ERR_FIRMWARE_API_VERSION:
292 return "I40E_ERR_FIRMWARE_API_VERSION";
293 }
294
295 snprintf(hw->err_str, sizeof(hw->err_str), "%d", stat_err);
296 return hw->err_str;
297 }
298
299 /**
300 * i40e_debug_aq
301 * @hw: debug mask related to admin queue
302 * @mask: debug mask
303 * @desc: pointer to admin queue descriptor
304 * @buffer: pointer to command buffer
305 * @buf_len: max length of buffer
306 *
307 * Dumps debug log about adminq command with descriptor contents.
308 **/
i40e_debug_aq(struct i40e_hw * hw,enum i40e_debug_mask mask,void * desc,void * buffer,u16 buf_len)309 void i40e_debug_aq(struct i40e_hw *hw, enum i40e_debug_mask mask, void *desc,
310 void *buffer, u16 buf_len)
311 {
312 struct i40e_aq_desc *aq_desc = (struct i40e_aq_desc *)desc;
313 u16 len = LE16_TO_CPU(aq_desc->datalen);
314 u8 *buf = (u8 *)buffer;
315 u16 i = 0;
316
317 if ((!(mask & hw->debug_mask)) || (desc == NULL))
318 return;
319
320 i40e_debug(hw, mask,
321 "AQ CMD: opcode 0x%04X, flags 0x%04X, datalen 0x%04X, retval 0x%04X\n",
322 LE16_TO_CPU(aq_desc->opcode),
323 LE16_TO_CPU(aq_desc->flags),
324 LE16_TO_CPU(aq_desc->datalen),
325 LE16_TO_CPU(aq_desc->retval));
326 i40e_debug(hw, mask, "\tcookie (h,l) 0x%08X 0x%08X\n",
327 LE32_TO_CPU(aq_desc->cookie_high),
328 LE32_TO_CPU(aq_desc->cookie_low));
329 i40e_debug(hw, mask, "\tparam (0,1) 0x%08X 0x%08X\n",
330 LE32_TO_CPU(aq_desc->params.internal.param0),
331 LE32_TO_CPU(aq_desc->params.internal.param1));
332 i40e_debug(hw, mask, "\taddr (h,l) 0x%08X 0x%08X\n",
333 LE32_TO_CPU(aq_desc->params.external.addr_high),
334 LE32_TO_CPU(aq_desc->params.external.addr_low));
335
336 if ((buffer != NULL) && (aq_desc->datalen != 0)) {
337 i40e_debug(hw, mask, "AQ CMD Buffer:\n");
338 if (buf_len < len)
339 len = buf_len;
340 /* write the full 16-byte chunks */
341 for (i = 0; i < (len - 16); i += 16)
342 i40e_debug(hw, mask,
343 "\t0x%04X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X\n",
344 i, buf[i], buf[i+1], buf[i+2], buf[i+3],
345 buf[i+4], buf[i+5], buf[i+6], buf[i+7],
346 buf[i+8], buf[i+9], buf[i+10], buf[i+11],
347 buf[i+12], buf[i+13], buf[i+14], buf[i+15]);
348 /* the most we could have left is 16 bytes, pad with zeros */
349 if (i < len) {
350 char d_buf[16];
351 int j, i_sav;
352
353 i_sav = i;
354 memset(d_buf, 0, sizeof(d_buf));
355 for (j = 0; i < len; j++, i++)
356 d_buf[j] = buf[i];
357 i40e_debug(hw, mask,
358 "\t0x%04X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X\n",
359 i_sav, d_buf[0], d_buf[1], d_buf[2], d_buf[3],
360 d_buf[4], d_buf[5], d_buf[6], d_buf[7],
361 d_buf[8], d_buf[9], d_buf[10], d_buf[11],
362 d_buf[12], d_buf[13], d_buf[14], d_buf[15]);
363 }
364 }
365 }
366
367 /**
368 * i40e_check_asq_alive
369 * @hw: pointer to the hw struct
370 *
371 * Returns TRUE if Queue is enabled else FALSE.
372 **/
i40e_check_asq_alive(struct i40e_hw * hw)373 bool i40e_check_asq_alive(struct i40e_hw *hw)
374 {
375 if (hw->aq.asq.len)
376 return !!(rd32(hw, hw->aq.asq.len) &
377 I40E_PF_ATQLEN_ATQENABLE_MASK);
378 return FALSE;
379 }
380
381 /**
382 * i40e_aq_queue_shutdown
383 * @hw: pointer to the hw struct
384 * @unloading: is the driver unloading itself
385 *
386 * Tell the Firmware that we're shutting down the AdminQ and whether
387 * or not the driver is unloading as well.
388 **/
i40e_aq_queue_shutdown(struct i40e_hw * hw,bool unloading)389 enum i40e_status_code i40e_aq_queue_shutdown(struct i40e_hw *hw,
390 bool unloading)
391 {
392 struct i40e_aq_desc desc;
393 struct i40e_aqc_queue_shutdown *cmd =
394 (struct i40e_aqc_queue_shutdown *)&desc.params.raw;
395 enum i40e_status_code status;
396
397 i40e_fill_default_direct_cmd_desc(&desc,
398 i40e_aqc_opc_queue_shutdown);
399
400 if (unloading)
401 cmd->driver_unloading = CPU_TO_LE32(I40E_AQ_DRIVER_UNLOADING);
402 status = i40e_asq_send_command(hw, &desc, NULL, 0, NULL);
403
404 return status;
405 }
406
407 /**
408 * i40e_aq_get_set_rss_lut
409 * @hw: pointer to the hardware structure
410 * @vsi_id: vsi fw index
411 * @pf_lut: for PF table set TRUE, for VSI table set FALSE
412 * @lut: pointer to the lut buffer provided by the caller
413 * @lut_size: size of the lut buffer
414 * @set: set TRUE to set the table, FALSE to get the table
415 *
416 * Internal function to get or set RSS look up table
417 **/
i40e_aq_get_set_rss_lut(struct i40e_hw * hw,u16 vsi_id,bool pf_lut,u8 * lut,u16 lut_size,bool set)418 static enum i40e_status_code i40e_aq_get_set_rss_lut(struct i40e_hw *hw,
419 u16 vsi_id, bool pf_lut,
420 u8 *lut, u16 lut_size,
421 bool set)
422 {
423 enum i40e_status_code status;
424 struct i40e_aq_desc desc;
425 struct i40e_aqc_get_set_rss_lut *cmd_resp =
426 (struct i40e_aqc_get_set_rss_lut *)&desc.params.raw;
427
428 if (set)
429 i40e_fill_default_direct_cmd_desc(&desc,
430 i40e_aqc_opc_set_rss_lut);
431 else
432 i40e_fill_default_direct_cmd_desc(&desc,
433 i40e_aqc_opc_get_rss_lut);
434
435 /* Indirect command */
436 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
437 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_RD);
438
439 cmd_resp->vsi_id =
440 CPU_TO_LE16((u16)((vsi_id <<
441 I40E_AQC_SET_RSS_LUT_VSI_ID_SHIFT) &
442 I40E_AQC_SET_RSS_LUT_VSI_ID_MASK));
443 cmd_resp->vsi_id |= CPU_TO_LE16((u16)I40E_AQC_SET_RSS_LUT_VSI_VALID);
444
445 if (pf_lut)
446 cmd_resp->flags |= CPU_TO_LE16((u16)
447 ((I40E_AQC_SET_RSS_LUT_TABLE_TYPE_PF <<
448 I40E_AQC_SET_RSS_LUT_TABLE_TYPE_SHIFT) &
449 I40E_AQC_SET_RSS_LUT_TABLE_TYPE_MASK));
450 else
451 cmd_resp->flags |= CPU_TO_LE16((u16)
452 ((I40E_AQC_SET_RSS_LUT_TABLE_TYPE_VSI <<
453 I40E_AQC_SET_RSS_LUT_TABLE_TYPE_SHIFT) &
454 I40E_AQC_SET_RSS_LUT_TABLE_TYPE_MASK));
455
456 status = i40e_asq_send_command(hw, &desc, lut, lut_size, NULL);
457
458 return status;
459 }
460
461 /**
462 * i40e_aq_get_rss_lut
463 * @hw: pointer to the hardware structure
464 * @vsi_id: vsi fw index
465 * @pf_lut: for PF table set TRUE, for VSI table set FALSE
466 * @lut: pointer to the lut buffer provided by the caller
467 * @lut_size: size of the lut buffer
468 *
469 * get the RSS lookup table, PF or VSI type
470 **/
i40e_aq_get_rss_lut(struct i40e_hw * hw,u16 vsi_id,bool pf_lut,u8 * lut,u16 lut_size)471 enum i40e_status_code i40e_aq_get_rss_lut(struct i40e_hw *hw, u16 vsi_id,
472 bool pf_lut, u8 *lut, u16 lut_size)
473 {
474 return i40e_aq_get_set_rss_lut(hw, vsi_id, pf_lut, lut, lut_size,
475 FALSE);
476 }
477
478 /**
479 * i40e_aq_set_rss_lut
480 * @hw: pointer to the hardware structure
481 * @vsi_id: vsi fw index
482 * @pf_lut: for PF table set TRUE, for VSI table set FALSE
483 * @lut: pointer to the lut buffer provided by the caller
484 * @lut_size: size of the lut buffer
485 *
486 * set the RSS lookup table, PF or VSI type
487 **/
i40e_aq_set_rss_lut(struct i40e_hw * hw,u16 vsi_id,bool pf_lut,u8 * lut,u16 lut_size)488 enum i40e_status_code i40e_aq_set_rss_lut(struct i40e_hw *hw, u16 vsi_id,
489 bool pf_lut, u8 *lut, u16 lut_size)
490 {
491 return i40e_aq_get_set_rss_lut(hw, vsi_id, pf_lut, lut, lut_size, TRUE);
492 }
493
494 /**
495 * i40e_aq_get_set_rss_key
496 * @hw: pointer to the hw struct
497 * @vsi_id: vsi fw index
498 * @key: pointer to key info struct
499 * @set: set TRUE to set the key, FALSE to get the key
500 *
501 * get the RSS key per VSI
502 **/
i40e_aq_get_set_rss_key(struct i40e_hw * hw,u16 vsi_id,struct i40e_aqc_get_set_rss_key_data * key,bool set)503 static enum i40e_status_code i40e_aq_get_set_rss_key(struct i40e_hw *hw,
504 u16 vsi_id,
505 struct i40e_aqc_get_set_rss_key_data *key,
506 bool set)
507 {
508 enum i40e_status_code status;
509 struct i40e_aq_desc desc;
510 struct i40e_aqc_get_set_rss_key *cmd_resp =
511 (struct i40e_aqc_get_set_rss_key *)&desc.params.raw;
512 u16 key_size = sizeof(struct i40e_aqc_get_set_rss_key_data);
513
514 if (set)
515 i40e_fill_default_direct_cmd_desc(&desc,
516 i40e_aqc_opc_set_rss_key);
517 else
518 i40e_fill_default_direct_cmd_desc(&desc,
519 i40e_aqc_opc_get_rss_key);
520
521 /* Indirect command */
522 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
523 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_RD);
524
525 cmd_resp->vsi_id =
526 CPU_TO_LE16((u16)((vsi_id <<
527 I40E_AQC_SET_RSS_KEY_VSI_ID_SHIFT) &
528 I40E_AQC_SET_RSS_KEY_VSI_ID_MASK));
529 cmd_resp->vsi_id |= CPU_TO_LE16((u16)I40E_AQC_SET_RSS_KEY_VSI_VALID);
530
531 status = i40e_asq_send_command(hw, &desc, key, key_size, NULL);
532
533 return status;
534 }
535
536 /**
537 * i40e_aq_get_rss_key
538 * @hw: pointer to the hw struct
539 * @vsi_id: vsi fw index
540 * @key: pointer to key info struct
541 *
542 **/
i40e_aq_get_rss_key(struct i40e_hw * hw,u16 vsi_id,struct i40e_aqc_get_set_rss_key_data * key)543 enum i40e_status_code i40e_aq_get_rss_key(struct i40e_hw *hw,
544 u16 vsi_id,
545 struct i40e_aqc_get_set_rss_key_data *key)
546 {
547 return i40e_aq_get_set_rss_key(hw, vsi_id, key, FALSE);
548 }
549
550 /**
551 * i40e_aq_set_rss_key
552 * @hw: pointer to the hw struct
553 * @vsi_id: vsi fw index
554 * @key: pointer to key info struct
555 *
556 * set the RSS key per VSI
557 **/
i40e_aq_set_rss_key(struct i40e_hw * hw,u16 vsi_id,struct i40e_aqc_get_set_rss_key_data * key)558 enum i40e_status_code i40e_aq_set_rss_key(struct i40e_hw *hw,
559 u16 vsi_id,
560 struct i40e_aqc_get_set_rss_key_data *key)
561 {
562 return i40e_aq_get_set_rss_key(hw, vsi_id, key, TRUE);
563 }
564
565 /* The i40e_ptype_lookup table is used to convert from the 8-bit ptype in the
566 * hardware to a bit-field that can be used by SW to more easily determine the
567 * packet type.
568 *
569 * Macros are used to shorten the table lines and make this table human
570 * readable.
571 *
572 * We store the PTYPE in the top byte of the bit field - this is just so that
573 * we can check that the table doesn't have a row missing, as the index into
574 * the table should be the PTYPE.
575 *
576 * Typical work flow:
577 *
578 * IF NOT i40e_ptype_lookup[ptype].known
579 * THEN
580 * Packet is unknown
581 * ELSE IF i40e_ptype_lookup[ptype].outer_ip == I40E_RX_PTYPE_OUTER_IP
582 * Use the rest of the fields to look at the tunnels, inner protocols, etc
583 * ELSE
584 * Use the enum i40e_rx_l2_ptype to decode the packet type
585 * ENDIF
586 */
587
588 /* macro to make the table lines short */
589 #define I40E_PTT(PTYPE, OUTER_IP, OUTER_IP_VER, OUTER_FRAG, T, TE, TEF, I, PL)\
590 { PTYPE, \
591 1, \
592 I40E_RX_PTYPE_OUTER_##OUTER_IP, \
593 I40E_RX_PTYPE_OUTER_##OUTER_IP_VER, \
594 I40E_RX_PTYPE_##OUTER_FRAG, \
595 I40E_RX_PTYPE_TUNNEL_##T, \
596 I40E_RX_PTYPE_TUNNEL_END_##TE, \
597 I40E_RX_PTYPE_##TEF, \
598 I40E_RX_PTYPE_INNER_PROT_##I, \
599 I40E_RX_PTYPE_PAYLOAD_LAYER_##PL }
600
601 #define I40E_PTT_UNUSED_ENTRY(PTYPE) \
602 { PTYPE, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
603
604 /* shorter macros makes the table fit but are terse */
605 #define I40E_RX_PTYPE_NOF I40E_RX_PTYPE_NOT_FRAG
606 #define I40E_RX_PTYPE_FRG I40E_RX_PTYPE_FRAG
607 #define I40E_RX_PTYPE_INNER_PROT_TS I40E_RX_PTYPE_INNER_PROT_TIMESYNC
608
609 /* Lookup table mapping the HW PTYPE to the bit field for decoding */
610 struct i40e_rx_ptype_decoded i40e_ptype_lookup[] = {
611 /* L2 Packet types */
612 I40E_PTT_UNUSED_ENTRY(0),
613 I40E_PTT(1, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY2),
614 I40E_PTT(2, L2, NONE, NOF, NONE, NONE, NOF, TS, PAY2),
615 I40E_PTT(3, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY2),
616 I40E_PTT_UNUSED_ENTRY(4),
617 I40E_PTT_UNUSED_ENTRY(5),
618 I40E_PTT(6, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY2),
619 I40E_PTT(7, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY2),
620 I40E_PTT_UNUSED_ENTRY(8),
621 I40E_PTT_UNUSED_ENTRY(9),
622 I40E_PTT(10, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY2),
623 I40E_PTT(11, L2, NONE, NOF, NONE, NONE, NOF, NONE, NONE),
624 I40E_PTT(12, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3),
625 I40E_PTT(13, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3),
626 I40E_PTT(14, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3),
627 I40E_PTT(15, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3),
628 I40E_PTT(16, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3),
629 I40E_PTT(17, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3),
630 I40E_PTT(18, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3),
631 I40E_PTT(19, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3),
632 I40E_PTT(20, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3),
633 I40E_PTT(21, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3),
634
635 /* Non Tunneled IPv4 */
636 I40E_PTT(22, IP, IPV4, FRG, NONE, NONE, NOF, NONE, PAY3),
637 I40E_PTT(23, IP, IPV4, NOF, NONE, NONE, NOF, NONE, PAY3),
638 I40E_PTT(24, IP, IPV4, NOF, NONE, NONE, NOF, UDP, PAY4),
639 I40E_PTT_UNUSED_ENTRY(25),
640 I40E_PTT(26, IP, IPV4, NOF, NONE, NONE, NOF, TCP, PAY4),
641 I40E_PTT(27, IP, IPV4, NOF, NONE, NONE, NOF, SCTP, PAY4),
642 I40E_PTT(28, IP, IPV4, NOF, NONE, NONE, NOF, ICMP, PAY4),
643
644 /* IPv4 --> IPv4 */
645 I40E_PTT(29, IP, IPV4, NOF, IP_IP, IPV4, FRG, NONE, PAY3),
646 I40E_PTT(30, IP, IPV4, NOF, IP_IP, IPV4, NOF, NONE, PAY3),
647 I40E_PTT(31, IP, IPV4, NOF, IP_IP, IPV4, NOF, UDP, PAY4),
648 I40E_PTT_UNUSED_ENTRY(32),
649 I40E_PTT(33, IP, IPV4, NOF, IP_IP, IPV4, NOF, TCP, PAY4),
650 I40E_PTT(34, IP, IPV4, NOF, IP_IP, IPV4, NOF, SCTP, PAY4),
651 I40E_PTT(35, IP, IPV4, NOF, IP_IP, IPV4, NOF, ICMP, PAY4),
652
653 /* IPv4 --> IPv6 */
654 I40E_PTT(36, IP, IPV4, NOF, IP_IP, IPV6, FRG, NONE, PAY3),
655 I40E_PTT(37, IP, IPV4, NOF, IP_IP, IPV6, NOF, NONE, PAY3),
656 I40E_PTT(38, IP, IPV4, NOF, IP_IP, IPV6, NOF, UDP, PAY4),
657 I40E_PTT_UNUSED_ENTRY(39),
658 I40E_PTT(40, IP, IPV4, NOF, IP_IP, IPV6, NOF, TCP, PAY4),
659 I40E_PTT(41, IP, IPV4, NOF, IP_IP, IPV6, NOF, SCTP, PAY4),
660 I40E_PTT(42, IP, IPV4, NOF, IP_IP, IPV6, NOF, ICMP, PAY4),
661
662 /* IPv4 --> GRE/NAT */
663 I40E_PTT(43, IP, IPV4, NOF, IP_GRENAT, NONE, NOF, NONE, PAY3),
664
665 /* IPv4 --> GRE/NAT --> IPv4 */
666 I40E_PTT(44, IP, IPV4, NOF, IP_GRENAT, IPV4, FRG, NONE, PAY3),
667 I40E_PTT(45, IP, IPV4, NOF, IP_GRENAT, IPV4, NOF, NONE, PAY3),
668 I40E_PTT(46, IP, IPV4, NOF, IP_GRENAT, IPV4, NOF, UDP, PAY4),
669 I40E_PTT_UNUSED_ENTRY(47),
670 I40E_PTT(48, IP, IPV4, NOF, IP_GRENAT, IPV4, NOF, TCP, PAY4),
671 I40E_PTT(49, IP, IPV4, NOF, IP_GRENAT, IPV4, NOF, SCTP, PAY4),
672 I40E_PTT(50, IP, IPV4, NOF, IP_GRENAT, IPV4, NOF, ICMP, PAY4),
673
674 /* IPv4 --> GRE/NAT --> IPv6 */
675 I40E_PTT(51, IP, IPV4, NOF, IP_GRENAT, IPV6, FRG, NONE, PAY3),
676 I40E_PTT(52, IP, IPV4, NOF, IP_GRENAT, IPV6, NOF, NONE, PAY3),
677 I40E_PTT(53, IP, IPV4, NOF, IP_GRENAT, IPV6, NOF, UDP, PAY4),
678 I40E_PTT_UNUSED_ENTRY(54),
679 I40E_PTT(55, IP, IPV4, NOF, IP_GRENAT, IPV6, NOF, TCP, PAY4),
680 I40E_PTT(56, IP, IPV4, NOF, IP_GRENAT, IPV6, NOF, SCTP, PAY4),
681 I40E_PTT(57, IP, IPV4, NOF, IP_GRENAT, IPV6, NOF, ICMP, PAY4),
682
683 /* IPv4 --> GRE/NAT --> MAC */
684 I40E_PTT(58, IP, IPV4, NOF, IP_GRENAT_MAC, NONE, NOF, NONE, PAY3),
685
686 /* IPv4 --> GRE/NAT --> MAC --> IPv4 */
687 I40E_PTT(59, IP, IPV4, NOF, IP_GRENAT_MAC, IPV4, FRG, NONE, PAY3),
688 I40E_PTT(60, IP, IPV4, NOF, IP_GRENAT_MAC, IPV4, NOF, NONE, PAY3),
689 I40E_PTT(61, IP, IPV4, NOF, IP_GRENAT_MAC, IPV4, NOF, UDP, PAY4),
690 I40E_PTT_UNUSED_ENTRY(62),
691 I40E_PTT(63, IP, IPV4, NOF, IP_GRENAT_MAC, IPV4, NOF, TCP, PAY4),
692 I40E_PTT(64, IP, IPV4, NOF, IP_GRENAT_MAC, IPV4, NOF, SCTP, PAY4),
693 I40E_PTT(65, IP, IPV4, NOF, IP_GRENAT_MAC, IPV4, NOF, ICMP, PAY4),
694
695 /* IPv4 --> GRE/NAT -> MAC --> IPv6 */
696 I40E_PTT(66, IP, IPV4, NOF, IP_GRENAT_MAC, IPV6, FRG, NONE, PAY3),
697 I40E_PTT(67, IP, IPV4, NOF, IP_GRENAT_MAC, IPV6, NOF, NONE, PAY3),
698 I40E_PTT(68, IP, IPV4, NOF, IP_GRENAT_MAC, IPV6, NOF, UDP, PAY4),
699 I40E_PTT_UNUSED_ENTRY(69),
700 I40E_PTT(70, IP, IPV4, NOF, IP_GRENAT_MAC, IPV6, NOF, TCP, PAY4),
701 I40E_PTT(71, IP, IPV4, NOF, IP_GRENAT_MAC, IPV6, NOF, SCTP, PAY4),
702 I40E_PTT(72, IP, IPV4, NOF, IP_GRENAT_MAC, IPV6, NOF, ICMP, PAY4),
703
704 /* IPv4 --> GRE/NAT --> MAC/VLAN */
705 I40E_PTT(73, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, NONE, NOF, NONE, PAY3),
706
707 /* IPv4 ---> GRE/NAT -> MAC/VLAN --> IPv4 */
708 I40E_PTT(74, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV4, FRG, NONE, PAY3),
709 I40E_PTT(75, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, NONE, PAY3),
710 I40E_PTT(76, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, UDP, PAY4),
711 I40E_PTT_UNUSED_ENTRY(77),
712 I40E_PTT(78, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, TCP, PAY4),
713 I40E_PTT(79, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, SCTP, PAY4),
714 I40E_PTT(80, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, ICMP, PAY4),
715
716 /* IPv4 -> GRE/NAT -> MAC/VLAN --> IPv6 */
717 I40E_PTT(81, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV6, FRG, NONE, PAY3),
718 I40E_PTT(82, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, NONE, PAY3),
719 I40E_PTT(83, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, UDP, PAY4),
720 I40E_PTT_UNUSED_ENTRY(84),
721 I40E_PTT(85, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, TCP, PAY4),
722 I40E_PTT(86, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, SCTP, PAY4),
723 I40E_PTT(87, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, ICMP, PAY4),
724
725 /* Non Tunneled IPv6 */
726 I40E_PTT(88, IP, IPV6, FRG, NONE, NONE, NOF, NONE, PAY3),
727 I40E_PTT(89, IP, IPV6, NOF, NONE, NONE, NOF, NONE, PAY3),
728 I40E_PTT(90, IP, IPV6, NOF, NONE, NONE, NOF, UDP, PAY4),
729 I40E_PTT_UNUSED_ENTRY(91),
730 I40E_PTT(92, IP, IPV6, NOF, NONE, NONE, NOF, TCP, PAY4),
731 I40E_PTT(93, IP, IPV6, NOF, NONE, NONE, NOF, SCTP, PAY4),
732 I40E_PTT(94, IP, IPV6, NOF, NONE, NONE, NOF, ICMP, PAY4),
733
734 /* IPv6 --> IPv4 */
735 I40E_PTT(95, IP, IPV6, NOF, IP_IP, IPV4, FRG, NONE, PAY3),
736 I40E_PTT(96, IP, IPV6, NOF, IP_IP, IPV4, NOF, NONE, PAY3),
737 I40E_PTT(97, IP, IPV6, NOF, IP_IP, IPV4, NOF, UDP, PAY4),
738 I40E_PTT_UNUSED_ENTRY(98),
739 I40E_PTT(99, IP, IPV6, NOF, IP_IP, IPV4, NOF, TCP, PAY4),
740 I40E_PTT(100, IP, IPV6, NOF, IP_IP, IPV4, NOF, SCTP, PAY4),
741 I40E_PTT(101, IP, IPV6, NOF, IP_IP, IPV4, NOF, ICMP, PAY4),
742
743 /* IPv6 --> IPv6 */
744 I40E_PTT(102, IP, IPV6, NOF, IP_IP, IPV6, FRG, NONE, PAY3),
745 I40E_PTT(103, IP, IPV6, NOF, IP_IP, IPV6, NOF, NONE, PAY3),
746 I40E_PTT(104, IP, IPV6, NOF, IP_IP, IPV6, NOF, UDP, PAY4),
747 I40E_PTT_UNUSED_ENTRY(105),
748 I40E_PTT(106, IP, IPV6, NOF, IP_IP, IPV6, NOF, TCP, PAY4),
749 I40E_PTT(107, IP, IPV6, NOF, IP_IP, IPV6, NOF, SCTP, PAY4),
750 I40E_PTT(108, IP, IPV6, NOF, IP_IP, IPV6, NOF, ICMP, PAY4),
751
752 /* IPv6 --> GRE/NAT */
753 I40E_PTT(109, IP, IPV6, NOF, IP_GRENAT, NONE, NOF, NONE, PAY3),
754
755 /* IPv6 --> GRE/NAT -> IPv4 */
756 I40E_PTT(110, IP, IPV6, NOF, IP_GRENAT, IPV4, FRG, NONE, PAY3),
757 I40E_PTT(111, IP, IPV6, NOF, IP_GRENAT, IPV4, NOF, NONE, PAY3),
758 I40E_PTT(112, IP, IPV6, NOF, IP_GRENAT, IPV4, NOF, UDP, PAY4),
759 I40E_PTT_UNUSED_ENTRY(113),
760 I40E_PTT(114, IP, IPV6, NOF, IP_GRENAT, IPV4, NOF, TCP, PAY4),
761 I40E_PTT(115, IP, IPV6, NOF, IP_GRENAT, IPV4, NOF, SCTP, PAY4),
762 I40E_PTT(116, IP, IPV6, NOF, IP_GRENAT, IPV4, NOF, ICMP, PAY4),
763
764 /* IPv6 --> GRE/NAT -> IPv6 */
765 I40E_PTT(117, IP, IPV6, NOF, IP_GRENAT, IPV6, FRG, NONE, PAY3),
766 I40E_PTT(118, IP, IPV6, NOF, IP_GRENAT, IPV6, NOF, NONE, PAY3),
767 I40E_PTT(119, IP, IPV6, NOF, IP_GRENAT, IPV6, NOF, UDP, PAY4),
768 I40E_PTT_UNUSED_ENTRY(120),
769 I40E_PTT(121, IP, IPV6, NOF, IP_GRENAT, IPV6, NOF, TCP, PAY4),
770 I40E_PTT(122, IP, IPV6, NOF, IP_GRENAT, IPV6, NOF, SCTP, PAY4),
771 I40E_PTT(123, IP, IPV6, NOF, IP_GRENAT, IPV6, NOF, ICMP, PAY4),
772
773 /* IPv6 --> GRE/NAT -> MAC */
774 I40E_PTT(124, IP, IPV6, NOF, IP_GRENAT_MAC, NONE, NOF, NONE, PAY3),
775
776 /* IPv6 --> GRE/NAT -> MAC -> IPv4 */
777 I40E_PTT(125, IP, IPV6, NOF, IP_GRENAT_MAC, IPV4, FRG, NONE, PAY3),
778 I40E_PTT(126, IP, IPV6, NOF, IP_GRENAT_MAC, IPV4, NOF, NONE, PAY3),
779 I40E_PTT(127, IP, IPV6, NOF, IP_GRENAT_MAC, IPV4, NOF, UDP, PAY4),
780 I40E_PTT_UNUSED_ENTRY(128),
781 I40E_PTT(129, IP, IPV6, NOF, IP_GRENAT_MAC, IPV4, NOF, TCP, PAY4),
782 I40E_PTT(130, IP, IPV6, NOF, IP_GRENAT_MAC, IPV4, NOF, SCTP, PAY4),
783 I40E_PTT(131, IP, IPV6, NOF, IP_GRENAT_MAC, IPV4, NOF, ICMP, PAY4),
784
785 /* IPv6 --> GRE/NAT -> MAC -> IPv6 */
786 I40E_PTT(132, IP, IPV6, NOF, IP_GRENAT_MAC, IPV6, FRG, NONE, PAY3),
787 I40E_PTT(133, IP, IPV6, NOF, IP_GRENAT_MAC, IPV6, NOF, NONE, PAY3),
788 I40E_PTT(134, IP, IPV6, NOF, IP_GRENAT_MAC, IPV6, NOF, UDP, PAY4),
789 I40E_PTT_UNUSED_ENTRY(135),
790 I40E_PTT(136, IP, IPV6, NOF, IP_GRENAT_MAC, IPV6, NOF, TCP, PAY4),
791 I40E_PTT(137, IP, IPV6, NOF, IP_GRENAT_MAC, IPV6, NOF, SCTP, PAY4),
792 I40E_PTT(138, IP, IPV6, NOF, IP_GRENAT_MAC, IPV6, NOF, ICMP, PAY4),
793
794 /* IPv6 --> GRE/NAT -> MAC/VLAN */
795 I40E_PTT(139, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, NONE, NOF, NONE, PAY3),
796
797 /* IPv6 --> GRE/NAT -> MAC/VLAN --> IPv4 */
798 I40E_PTT(140, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV4, FRG, NONE, PAY3),
799 I40E_PTT(141, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, NONE, PAY3),
800 I40E_PTT(142, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, UDP, PAY4),
801 I40E_PTT_UNUSED_ENTRY(143),
802 I40E_PTT(144, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, TCP, PAY4),
803 I40E_PTT(145, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, SCTP, PAY4),
804 I40E_PTT(146, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, ICMP, PAY4),
805
806 /* IPv6 --> GRE/NAT -> MAC/VLAN --> IPv6 */
807 I40E_PTT(147, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV6, FRG, NONE, PAY3),
808 I40E_PTT(148, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, NONE, PAY3),
809 I40E_PTT(149, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, UDP, PAY4),
810 I40E_PTT_UNUSED_ENTRY(150),
811 I40E_PTT(151, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, TCP, PAY4),
812 I40E_PTT(152, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, SCTP, PAY4),
813 I40E_PTT(153, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, ICMP, PAY4),
814
815 /* unused entries */
816 I40E_PTT_UNUSED_ENTRY(154),
817 I40E_PTT_UNUSED_ENTRY(155),
818 I40E_PTT_UNUSED_ENTRY(156),
819 I40E_PTT_UNUSED_ENTRY(157),
820 I40E_PTT_UNUSED_ENTRY(158),
821 I40E_PTT_UNUSED_ENTRY(159),
822
823 I40E_PTT_UNUSED_ENTRY(160),
824 I40E_PTT_UNUSED_ENTRY(161),
825 I40E_PTT_UNUSED_ENTRY(162),
826 I40E_PTT_UNUSED_ENTRY(163),
827 I40E_PTT_UNUSED_ENTRY(164),
828 I40E_PTT_UNUSED_ENTRY(165),
829 I40E_PTT_UNUSED_ENTRY(166),
830 I40E_PTT_UNUSED_ENTRY(167),
831 I40E_PTT_UNUSED_ENTRY(168),
832 I40E_PTT_UNUSED_ENTRY(169),
833
834 I40E_PTT_UNUSED_ENTRY(170),
835 I40E_PTT_UNUSED_ENTRY(171),
836 I40E_PTT_UNUSED_ENTRY(172),
837 I40E_PTT_UNUSED_ENTRY(173),
838 I40E_PTT_UNUSED_ENTRY(174),
839 I40E_PTT_UNUSED_ENTRY(175),
840 I40E_PTT_UNUSED_ENTRY(176),
841 I40E_PTT_UNUSED_ENTRY(177),
842 I40E_PTT_UNUSED_ENTRY(178),
843 I40E_PTT_UNUSED_ENTRY(179),
844
845 I40E_PTT_UNUSED_ENTRY(180),
846 I40E_PTT_UNUSED_ENTRY(181),
847 I40E_PTT_UNUSED_ENTRY(182),
848 I40E_PTT_UNUSED_ENTRY(183),
849 I40E_PTT_UNUSED_ENTRY(184),
850 I40E_PTT_UNUSED_ENTRY(185),
851 I40E_PTT_UNUSED_ENTRY(186),
852 I40E_PTT_UNUSED_ENTRY(187),
853 I40E_PTT_UNUSED_ENTRY(188),
854 I40E_PTT_UNUSED_ENTRY(189),
855
856 I40E_PTT_UNUSED_ENTRY(190),
857 I40E_PTT_UNUSED_ENTRY(191),
858 I40E_PTT_UNUSED_ENTRY(192),
859 I40E_PTT_UNUSED_ENTRY(193),
860 I40E_PTT_UNUSED_ENTRY(194),
861 I40E_PTT_UNUSED_ENTRY(195),
862 I40E_PTT_UNUSED_ENTRY(196),
863 I40E_PTT_UNUSED_ENTRY(197),
864 I40E_PTT_UNUSED_ENTRY(198),
865 I40E_PTT_UNUSED_ENTRY(199),
866
867 I40E_PTT_UNUSED_ENTRY(200),
868 I40E_PTT_UNUSED_ENTRY(201),
869 I40E_PTT_UNUSED_ENTRY(202),
870 I40E_PTT_UNUSED_ENTRY(203),
871 I40E_PTT_UNUSED_ENTRY(204),
872 I40E_PTT_UNUSED_ENTRY(205),
873 I40E_PTT_UNUSED_ENTRY(206),
874 I40E_PTT_UNUSED_ENTRY(207),
875 I40E_PTT_UNUSED_ENTRY(208),
876 I40E_PTT_UNUSED_ENTRY(209),
877
878 I40E_PTT_UNUSED_ENTRY(210),
879 I40E_PTT_UNUSED_ENTRY(211),
880 I40E_PTT_UNUSED_ENTRY(212),
881 I40E_PTT_UNUSED_ENTRY(213),
882 I40E_PTT_UNUSED_ENTRY(214),
883 I40E_PTT_UNUSED_ENTRY(215),
884 I40E_PTT_UNUSED_ENTRY(216),
885 I40E_PTT_UNUSED_ENTRY(217),
886 I40E_PTT_UNUSED_ENTRY(218),
887 I40E_PTT_UNUSED_ENTRY(219),
888
889 I40E_PTT_UNUSED_ENTRY(220),
890 I40E_PTT_UNUSED_ENTRY(221),
891 I40E_PTT_UNUSED_ENTRY(222),
892 I40E_PTT_UNUSED_ENTRY(223),
893 I40E_PTT_UNUSED_ENTRY(224),
894 I40E_PTT_UNUSED_ENTRY(225),
895 I40E_PTT_UNUSED_ENTRY(226),
896 I40E_PTT_UNUSED_ENTRY(227),
897 I40E_PTT_UNUSED_ENTRY(228),
898 I40E_PTT_UNUSED_ENTRY(229),
899
900 I40E_PTT_UNUSED_ENTRY(230),
901 I40E_PTT_UNUSED_ENTRY(231),
902 I40E_PTT_UNUSED_ENTRY(232),
903 I40E_PTT_UNUSED_ENTRY(233),
904 I40E_PTT_UNUSED_ENTRY(234),
905 I40E_PTT_UNUSED_ENTRY(235),
906 I40E_PTT_UNUSED_ENTRY(236),
907 I40E_PTT_UNUSED_ENTRY(237),
908 I40E_PTT_UNUSED_ENTRY(238),
909 I40E_PTT_UNUSED_ENTRY(239),
910
911 I40E_PTT_UNUSED_ENTRY(240),
912 I40E_PTT_UNUSED_ENTRY(241),
913 I40E_PTT_UNUSED_ENTRY(242),
914 I40E_PTT_UNUSED_ENTRY(243),
915 I40E_PTT_UNUSED_ENTRY(244),
916 I40E_PTT_UNUSED_ENTRY(245),
917 I40E_PTT_UNUSED_ENTRY(246),
918 I40E_PTT_UNUSED_ENTRY(247),
919 I40E_PTT_UNUSED_ENTRY(248),
920 I40E_PTT_UNUSED_ENTRY(249),
921
922 I40E_PTT_UNUSED_ENTRY(250),
923 I40E_PTT_UNUSED_ENTRY(251),
924 I40E_PTT_UNUSED_ENTRY(252),
925 I40E_PTT_UNUSED_ENTRY(253),
926 I40E_PTT_UNUSED_ENTRY(254),
927 I40E_PTT_UNUSED_ENTRY(255)
928 };
929
930
931 /**
932 * i40e_validate_mac_addr - Validate unicast MAC address
933 * @mac_addr: pointer to MAC address
934 *
935 * Tests a MAC address to ensure it is a valid Individual Address
936 **/
i40e_validate_mac_addr(u8 * mac_addr)937 enum i40e_status_code i40e_validate_mac_addr(u8 *mac_addr)
938 {
939 enum i40e_status_code status = I40E_SUCCESS;
940
941 DEBUGFUNC("i40e_validate_mac_addr");
942
943 /* Broadcast addresses ARE multicast addresses
944 * Make sure it is not a multicast address
945 * Reject the zero address
946 */
947 if (I40E_IS_MULTICAST(mac_addr) ||
948 (mac_addr[0] == 0 && mac_addr[1] == 0 && mac_addr[2] == 0 &&
949 mac_addr[3] == 0 && mac_addr[4] == 0 && mac_addr[5] == 0))
950 status = I40E_ERR_INVALID_MAC_ADDR;
951
952 return status;
953 }
954
955 /**
956 * i40e_init_shared_code - Initialize the shared code
957 * @hw: pointer to hardware structure
958 *
959 * This assigns the MAC type and PHY code and inits the NVM.
960 * Does not touch the hardware. This function must be called prior to any
961 * other function in the shared code. The i40e_hw structure should be
962 * memset to 0 prior to calling this function. The following fields in
963 * hw structure should be filled in prior to calling this function:
964 * hw_addr, back, device_id, vendor_id, subsystem_device_id,
965 * subsystem_vendor_id, and revision_id
966 **/
i40e_init_shared_code(struct i40e_hw * hw)967 enum i40e_status_code i40e_init_shared_code(struct i40e_hw *hw)
968 {
969 enum i40e_status_code status = I40E_SUCCESS;
970 u32 port, ari, func_rid;
971
972 DEBUGFUNC("i40e_init_shared_code");
973
974 i40e_set_mac_type(hw);
975
976 switch (hw->mac.type) {
977 case I40E_MAC_XL710:
978 case I40E_MAC_X722:
979 break;
980 default:
981 return I40E_ERR_DEVICE_NOT_SUPPORTED;
982 }
983
984 hw->phy.get_link_info = TRUE;
985
986 /* Determine port number and PF number*/
987 port = (rd32(hw, I40E_PFGEN_PORTNUM) & I40E_PFGEN_PORTNUM_PORT_NUM_MASK)
988 >> I40E_PFGEN_PORTNUM_PORT_NUM_SHIFT;
989 hw->port = (u8)port;
990 ari = (rd32(hw, I40E_GLPCI_CAPSUP) & I40E_GLPCI_CAPSUP_ARI_EN_MASK) >>
991 I40E_GLPCI_CAPSUP_ARI_EN_SHIFT;
992 func_rid = rd32(hw, I40E_PF_FUNC_RID);
993 if (ari)
994 hw->pf_id = (u8)(func_rid & 0xff);
995 else
996 hw->pf_id = (u8)(func_rid & 0x7);
997
998 if (hw->mac.type == I40E_MAC_X722)
999 hw->flags |= I40E_HW_FLAG_AQ_SRCTL_ACCESS_ENABLE;
1000
1001 status = i40e_init_nvm(hw);
1002 return status;
1003 }
1004
1005 /**
1006 * i40e_aq_mac_address_read - Retrieve the MAC addresses
1007 * @hw: pointer to the hw struct
1008 * @flags: a return indicator of what addresses were added to the addr store
1009 * @addrs: the requestor's mac addr store
1010 * @cmd_details: pointer to command details structure or NULL
1011 **/
i40e_aq_mac_address_read(struct i40e_hw * hw,u16 * flags,struct i40e_aqc_mac_address_read_data * addrs,struct i40e_asq_cmd_details * cmd_details)1012 static enum i40e_status_code i40e_aq_mac_address_read(struct i40e_hw *hw,
1013 u16 *flags,
1014 struct i40e_aqc_mac_address_read_data *addrs,
1015 struct i40e_asq_cmd_details *cmd_details)
1016 {
1017 struct i40e_aq_desc desc;
1018 struct i40e_aqc_mac_address_read *cmd_data =
1019 (struct i40e_aqc_mac_address_read *)&desc.params.raw;
1020 enum i40e_status_code status;
1021
1022 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_mac_address_read);
1023 desc.flags |= CPU_TO_LE16(I40E_AQ_FLAG_BUF);
1024
1025 status = i40e_asq_send_command(hw, &desc, addrs,
1026 sizeof(*addrs), cmd_details);
1027 *flags = LE16_TO_CPU(cmd_data->command_flags);
1028
1029 return status;
1030 }
1031
1032 /**
1033 * i40e_aq_mac_address_write - Change the MAC addresses
1034 * @hw: pointer to the hw struct
1035 * @flags: indicates which MAC to be written
1036 * @mac_addr: address to write
1037 * @cmd_details: pointer to command details structure or NULL
1038 **/
i40e_aq_mac_address_write(struct i40e_hw * hw,u16 flags,u8 * mac_addr,struct i40e_asq_cmd_details * cmd_details)1039 enum i40e_status_code i40e_aq_mac_address_write(struct i40e_hw *hw,
1040 u16 flags, u8 *mac_addr,
1041 struct i40e_asq_cmd_details *cmd_details)
1042 {
1043 struct i40e_aq_desc desc;
1044 struct i40e_aqc_mac_address_write *cmd_data =
1045 (struct i40e_aqc_mac_address_write *)&desc.params.raw;
1046 enum i40e_status_code status;
1047
1048 i40e_fill_default_direct_cmd_desc(&desc,
1049 i40e_aqc_opc_mac_address_write);
1050 cmd_data->command_flags = CPU_TO_LE16(flags);
1051 cmd_data->mac_sah = CPU_TO_LE16((u16)mac_addr[0] << 8 | mac_addr[1]);
1052 cmd_data->mac_sal = CPU_TO_LE32(((u32)mac_addr[2] << 24) |
1053 ((u32)mac_addr[3] << 16) |
1054 ((u32)mac_addr[4] << 8) |
1055 mac_addr[5]);
1056
1057 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
1058
1059 return status;
1060 }
1061
1062 /**
1063 * i40e_get_mac_addr - get MAC address
1064 * @hw: pointer to the HW structure
1065 * @mac_addr: pointer to MAC address
1066 *
1067 * Reads the adapter's MAC address from register
1068 **/
i40e_get_mac_addr(struct i40e_hw * hw,u8 * mac_addr)1069 enum i40e_status_code i40e_get_mac_addr(struct i40e_hw *hw, u8 *mac_addr)
1070 {
1071 struct i40e_aqc_mac_address_read_data addrs;
1072 enum i40e_status_code status;
1073 u16 flags = 0;
1074
1075 status = i40e_aq_mac_address_read(hw, &flags, &addrs, NULL);
1076
1077 if (flags & I40E_AQC_LAN_ADDR_VALID)
1078 i40e_memcpy(mac_addr, &addrs.pf_lan_mac, sizeof(addrs.pf_lan_mac),
1079 I40E_NONDMA_TO_NONDMA);
1080
1081 return status;
1082 }
1083
1084 /**
1085 * i40e_get_port_mac_addr - get Port MAC address
1086 * @hw: pointer to the HW structure
1087 * @mac_addr: pointer to Port MAC address
1088 *
1089 * Reads the adapter's Port MAC address
1090 **/
i40e_get_port_mac_addr(struct i40e_hw * hw,u8 * mac_addr)1091 enum i40e_status_code i40e_get_port_mac_addr(struct i40e_hw *hw, u8 *mac_addr)
1092 {
1093 struct i40e_aqc_mac_address_read_data addrs;
1094 enum i40e_status_code status;
1095 u16 flags = 0;
1096
1097 status = i40e_aq_mac_address_read(hw, &flags, &addrs, NULL);
1098 if (status)
1099 return status;
1100
1101 if (flags & I40E_AQC_PORT_ADDR_VALID)
1102 i40e_memcpy(mac_addr, &addrs.port_mac, sizeof(addrs.port_mac),
1103 I40E_NONDMA_TO_NONDMA);
1104 else
1105 status = I40E_ERR_INVALID_MAC_ADDR;
1106
1107 return status;
1108 }
1109
1110 /**
1111 * i40e_pre_tx_queue_cfg - pre tx queue configure
1112 * @hw: pointer to the HW structure
1113 * @queue: target pf queue index
1114 * @enable: state change request
1115 *
1116 * Handles hw requirement to indicate intention to enable
1117 * or disable target queue.
1118 **/
i40e_pre_tx_queue_cfg(struct i40e_hw * hw,u32 queue,bool enable)1119 void i40e_pre_tx_queue_cfg(struct i40e_hw *hw, u32 queue, bool enable)
1120 {
1121 u32 abs_queue_idx = hw->func_caps.base_queue + queue;
1122 u32 reg_block = 0;
1123 u32 reg_val;
1124
1125 if (abs_queue_idx >= 128) {
1126 reg_block = abs_queue_idx / 128;
1127 abs_queue_idx %= 128;
1128 }
1129
1130 reg_val = rd32(hw, I40E_GLLAN_TXPRE_QDIS(reg_block));
1131 reg_val &= ~I40E_GLLAN_TXPRE_QDIS_QINDX_MASK;
1132 reg_val |= (abs_queue_idx << I40E_GLLAN_TXPRE_QDIS_QINDX_SHIFT);
1133
1134 if (enable)
1135 reg_val |= I40E_GLLAN_TXPRE_QDIS_CLEAR_QDIS_MASK;
1136 else
1137 reg_val |= I40E_GLLAN_TXPRE_QDIS_SET_QDIS_MASK;
1138
1139 wr32(hw, I40E_GLLAN_TXPRE_QDIS(reg_block), reg_val);
1140 }
1141
1142 /**
1143 * i40e_read_pba_string - Reads part number string from EEPROM
1144 * @hw: pointer to hardware structure
1145 * @pba_num: stores the part number string from the EEPROM
1146 * @pba_num_size: part number string buffer length
1147 *
1148 * Reads the part number string from the EEPROM.
1149 **/
i40e_read_pba_string(struct i40e_hw * hw,u8 * pba_num,u32 pba_num_size)1150 enum i40e_status_code i40e_read_pba_string(struct i40e_hw *hw, u8 *pba_num,
1151 u32 pba_num_size)
1152 {
1153 enum i40e_status_code status = I40E_SUCCESS;
1154 u16 pba_word = 0;
1155 u16 pba_size = 0;
1156 u16 pba_ptr = 0;
1157 u16 i = 0;
1158
1159 status = i40e_read_nvm_word(hw, I40E_SR_PBA_FLAGS, &pba_word);
1160 if ((status != I40E_SUCCESS) || (pba_word != 0xFAFA)) {
1161 DEBUGOUT("Failed to read PBA flags or flag is invalid.\n");
1162 return status;
1163 }
1164
1165 status = i40e_read_nvm_word(hw, I40E_SR_PBA_BLOCK_PTR, &pba_ptr);
1166 if (status != I40E_SUCCESS) {
1167 DEBUGOUT("Failed to read PBA Block pointer.\n");
1168 return status;
1169 }
1170
1171 status = i40e_read_nvm_word(hw, pba_ptr, &pba_size);
1172 if (status != I40E_SUCCESS) {
1173 DEBUGOUT("Failed to read PBA Block size.\n");
1174 return status;
1175 }
1176
1177 /* Subtract one to get PBA word count (PBA Size word is included in
1178 * total size)
1179 */
1180 pba_size--;
1181 if (pba_num_size < (((u32)pba_size * 2) + 1)) {
1182 DEBUGOUT("Buffer to small for PBA data.\n");
1183 return I40E_ERR_PARAM;
1184 }
1185
1186 for (i = 0; i < pba_size; i++) {
1187 status = i40e_read_nvm_word(hw, (pba_ptr + 1) + i, &pba_word);
1188 if (status != I40E_SUCCESS) {
1189 DEBUGOUT1("Failed to read PBA Block word %d.\n", i);
1190 return status;
1191 }
1192
1193 pba_num[(i * 2)] = (pba_word >> 8) & 0xFF;
1194 pba_num[(i * 2) + 1] = pba_word & 0xFF;
1195 }
1196 pba_num[(pba_size * 2)] = '\0';
1197
1198 return status;
1199 }
1200
1201 /**
1202 * i40e_get_media_type - Gets media type
1203 * @hw: pointer to the hardware structure
1204 **/
i40e_get_media_type(struct i40e_hw * hw)1205 static enum i40e_media_type i40e_get_media_type(struct i40e_hw *hw)
1206 {
1207 enum i40e_media_type media;
1208
1209 switch (hw->phy.link_info.phy_type) {
1210 case I40E_PHY_TYPE_10GBASE_SR:
1211 case I40E_PHY_TYPE_10GBASE_LR:
1212 case I40E_PHY_TYPE_1000BASE_SX:
1213 case I40E_PHY_TYPE_1000BASE_LX:
1214 case I40E_PHY_TYPE_40GBASE_SR4:
1215 case I40E_PHY_TYPE_40GBASE_LR4:
1216 case I40E_PHY_TYPE_25GBASE_LR:
1217 case I40E_PHY_TYPE_25GBASE_SR:
1218 media = I40E_MEDIA_TYPE_FIBER;
1219 break;
1220 case I40E_PHY_TYPE_100BASE_TX:
1221 case I40E_PHY_TYPE_1000BASE_T:
1222 case I40E_PHY_TYPE_10GBASE_T:
1223 media = I40E_MEDIA_TYPE_BASET;
1224 break;
1225 case I40E_PHY_TYPE_10GBASE_CR1_CU:
1226 case I40E_PHY_TYPE_40GBASE_CR4_CU:
1227 case I40E_PHY_TYPE_10GBASE_CR1:
1228 case I40E_PHY_TYPE_40GBASE_CR4:
1229 case I40E_PHY_TYPE_10GBASE_SFPP_CU:
1230 case I40E_PHY_TYPE_40GBASE_AOC:
1231 case I40E_PHY_TYPE_10GBASE_AOC:
1232 case I40E_PHY_TYPE_25GBASE_CR:
1233 media = I40E_MEDIA_TYPE_DA;
1234 break;
1235 case I40E_PHY_TYPE_1000BASE_KX:
1236 case I40E_PHY_TYPE_10GBASE_KX4:
1237 case I40E_PHY_TYPE_10GBASE_KR:
1238 case I40E_PHY_TYPE_40GBASE_KR4:
1239 case I40E_PHY_TYPE_20GBASE_KR2:
1240 case I40E_PHY_TYPE_25GBASE_KR:
1241 media = I40E_MEDIA_TYPE_BACKPLANE;
1242 break;
1243 case I40E_PHY_TYPE_SGMII:
1244 case I40E_PHY_TYPE_XAUI:
1245 case I40E_PHY_TYPE_XFI:
1246 case I40E_PHY_TYPE_XLAUI:
1247 case I40E_PHY_TYPE_XLPPI:
1248 default:
1249 media = I40E_MEDIA_TYPE_UNKNOWN;
1250 break;
1251 }
1252
1253 return media;
1254 }
1255
1256 #define I40E_PF_RESET_WAIT_COUNT 200
1257 /**
1258 * i40e_pf_reset - Reset the PF
1259 * @hw: pointer to the hardware structure
1260 *
1261 * Assuming someone else has triggered a global reset,
1262 * assure the global reset is complete and then reset the PF
1263 **/
i40e_pf_reset(struct i40e_hw * hw)1264 enum i40e_status_code i40e_pf_reset(struct i40e_hw *hw)
1265 {
1266 u32 cnt = 0;
1267 u32 cnt1 = 0;
1268 u32 reg = 0;
1269 u32 grst_del;
1270
1271 /* Poll for Global Reset steady state in case of recent GRST.
1272 * The grst delay value is in 100ms units, and we'll wait a
1273 * couple counts longer to be sure we don't just miss the end.
1274 */
1275 grst_del = (rd32(hw, I40E_GLGEN_RSTCTL) &
1276 I40E_GLGEN_RSTCTL_GRSTDEL_MASK) >>
1277 I40E_GLGEN_RSTCTL_GRSTDEL_SHIFT;
1278
1279 grst_del = grst_del * 20;
1280
1281 for (cnt = 0; cnt < grst_del; cnt++) {
1282 reg = rd32(hw, I40E_GLGEN_RSTAT);
1283 if (!(reg & I40E_GLGEN_RSTAT_DEVSTATE_MASK))
1284 break;
1285 i40e_msec_delay(100);
1286 }
1287 if (reg & I40E_GLGEN_RSTAT_DEVSTATE_MASK) {
1288 DEBUGOUT("Global reset polling failed to complete.\n");
1289 return I40E_ERR_RESET_FAILED;
1290 }
1291
1292 /* Now Wait for the FW to be ready */
1293 for (cnt1 = 0; cnt1 < I40E_PF_RESET_WAIT_COUNT; cnt1++) {
1294 reg = rd32(hw, I40E_GLNVM_ULD);
1295 reg &= (I40E_GLNVM_ULD_CONF_CORE_DONE_MASK |
1296 I40E_GLNVM_ULD_CONF_GLOBAL_DONE_MASK);
1297 if (reg == (I40E_GLNVM_ULD_CONF_CORE_DONE_MASK |
1298 I40E_GLNVM_ULD_CONF_GLOBAL_DONE_MASK)) {
1299 DEBUGOUT1("Core and Global modules ready %d\n", cnt1);
1300 break;
1301 }
1302 i40e_msec_delay(10);
1303 }
1304 if (!(reg & (I40E_GLNVM_ULD_CONF_CORE_DONE_MASK |
1305 I40E_GLNVM_ULD_CONF_GLOBAL_DONE_MASK))) {
1306 DEBUGOUT("wait for FW Reset complete timedout\n");
1307 DEBUGOUT1("I40E_GLNVM_ULD = 0x%x\n", reg);
1308 return I40E_ERR_RESET_FAILED;
1309 }
1310
1311 /* If there was a Global Reset in progress when we got here,
1312 * we don't need to do the PF Reset
1313 */
1314 if (!cnt) {
1315 reg = rd32(hw, I40E_PFGEN_CTRL);
1316 wr32(hw, I40E_PFGEN_CTRL,
1317 (reg | I40E_PFGEN_CTRL_PFSWR_MASK));
1318 for (cnt = 0; cnt < I40E_PF_RESET_WAIT_COUNT; cnt++) {
1319 reg = rd32(hw, I40E_PFGEN_CTRL);
1320 if (!(reg & I40E_PFGEN_CTRL_PFSWR_MASK))
1321 break;
1322 i40e_msec_delay(1);
1323 }
1324 if (reg & I40E_PFGEN_CTRL_PFSWR_MASK) {
1325 DEBUGOUT("PF reset polling failed to complete.\n");
1326 return I40E_ERR_RESET_FAILED;
1327 }
1328 }
1329
1330 i40e_clear_pxe_mode(hw);
1331
1332
1333 return I40E_SUCCESS;
1334 }
1335
1336 /**
1337 * i40e_clear_hw - clear out any left over hw state
1338 * @hw: pointer to the hw struct
1339 *
1340 * Clear queues and interrupts, typically called at init time,
1341 * but after the capabilities have been found so we know how many
1342 * queues and msix vectors have been allocated.
1343 **/
i40e_clear_hw(struct i40e_hw * hw)1344 void i40e_clear_hw(struct i40e_hw *hw)
1345 {
1346 u32 num_queues, base_queue;
1347 u32 num_pf_int;
1348 u32 num_vf_int;
1349 u32 num_vfs;
1350 u32 i, j;
1351 u32 val;
1352 u32 eol = 0x7ff;
1353
1354 /* get number of interrupts, queues, and vfs */
1355 val = rd32(hw, I40E_GLPCI_CNF2);
1356 num_pf_int = (val & I40E_GLPCI_CNF2_MSI_X_PF_N_MASK) >>
1357 I40E_GLPCI_CNF2_MSI_X_PF_N_SHIFT;
1358 num_vf_int = (val & I40E_GLPCI_CNF2_MSI_X_VF_N_MASK) >>
1359 I40E_GLPCI_CNF2_MSI_X_VF_N_SHIFT;
1360
1361 val = rd32(hw, I40E_PFLAN_QALLOC);
1362 base_queue = (val & I40E_PFLAN_QALLOC_FIRSTQ_MASK) >>
1363 I40E_PFLAN_QALLOC_FIRSTQ_SHIFT;
1364 j = (val & I40E_PFLAN_QALLOC_LASTQ_MASK) >>
1365 I40E_PFLAN_QALLOC_LASTQ_SHIFT;
1366 if (val & I40E_PFLAN_QALLOC_VALID_MASK)
1367 num_queues = (j - base_queue) + 1;
1368 else
1369 num_queues = 0;
1370
1371 val = rd32(hw, I40E_PF_VT_PFALLOC);
1372 i = (val & I40E_PF_VT_PFALLOC_FIRSTVF_MASK) >>
1373 I40E_PF_VT_PFALLOC_FIRSTVF_SHIFT;
1374 j = (val & I40E_PF_VT_PFALLOC_LASTVF_MASK) >>
1375 I40E_PF_VT_PFALLOC_LASTVF_SHIFT;
1376 if (val & I40E_PF_VT_PFALLOC_VALID_MASK)
1377 num_vfs = (j - i) + 1;
1378 else
1379 num_vfs = 0;
1380
1381 /* stop all the interrupts */
1382 wr32(hw, I40E_PFINT_ICR0_ENA, 0);
1383 val = 0x3 << I40E_PFINT_DYN_CTLN_ITR_INDX_SHIFT;
1384 for (i = 0; i < num_pf_int - 2; i++)
1385 wr32(hw, I40E_PFINT_DYN_CTLN(i), val);
1386
1387 /* Set the FIRSTQ_INDX field to 0x7FF in PFINT_LNKLSTx */
1388 val = eol << I40E_PFINT_LNKLST0_FIRSTQ_INDX_SHIFT;
1389 wr32(hw, I40E_PFINT_LNKLST0, val);
1390 for (i = 0; i < num_pf_int - 2; i++)
1391 wr32(hw, I40E_PFINT_LNKLSTN(i), val);
1392 val = eol << I40E_VPINT_LNKLST0_FIRSTQ_INDX_SHIFT;
1393 for (i = 0; i < num_vfs; i++)
1394 wr32(hw, I40E_VPINT_LNKLST0(i), val);
1395 for (i = 0; i < num_vf_int - 2; i++)
1396 wr32(hw, I40E_VPINT_LNKLSTN(i), val);
1397
1398 /* warn the HW of the coming Tx disables */
1399 for (i = 0; i < num_queues; i++) {
1400 u32 abs_queue_idx = base_queue + i;
1401 u32 reg_block = 0;
1402
1403 if (abs_queue_idx >= 128) {
1404 reg_block = abs_queue_idx / 128;
1405 abs_queue_idx %= 128;
1406 }
1407
1408 val = rd32(hw, I40E_GLLAN_TXPRE_QDIS(reg_block));
1409 val &= ~I40E_GLLAN_TXPRE_QDIS_QINDX_MASK;
1410 val |= (abs_queue_idx << I40E_GLLAN_TXPRE_QDIS_QINDX_SHIFT);
1411 val |= I40E_GLLAN_TXPRE_QDIS_SET_QDIS_MASK;
1412
1413 wr32(hw, I40E_GLLAN_TXPRE_QDIS(reg_block), val);
1414 }
1415 i40e_usec_delay(400);
1416
1417 /* stop all the queues */
1418 for (i = 0; i < num_queues; i++) {
1419 wr32(hw, I40E_QINT_TQCTL(i), 0);
1420 wr32(hw, I40E_QTX_ENA(i), 0);
1421 wr32(hw, I40E_QINT_RQCTL(i), 0);
1422 wr32(hw, I40E_QRX_ENA(i), 0);
1423 }
1424
1425 /* short wait for all queue disables to settle */
1426 i40e_usec_delay(50);
1427 }
1428
1429 /**
1430 * i40e_clear_pxe_mode - clear pxe operations mode
1431 * @hw: pointer to the hw struct
1432 *
1433 * Make sure all PXE mode settings are cleared, including things
1434 * like descriptor fetch/write-back mode.
1435 **/
i40e_clear_pxe_mode(struct i40e_hw * hw)1436 void i40e_clear_pxe_mode(struct i40e_hw *hw)
1437 {
1438 if (i40e_check_asq_alive(hw))
1439 i40e_aq_clear_pxe_mode(hw, NULL);
1440 }
1441
1442 /**
1443 * i40e_led_is_mine - helper to find matching led
1444 * @hw: pointer to the hw struct
1445 * @idx: index into GPIO registers
1446 *
1447 * returns: 0 if no match, otherwise the value of the GPIO_CTL register
1448 */
i40e_led_is_mine(struct i40e_hw * hw,int idx)1449 static u32 i40e_led_is_mine(struct i40e_hw *hw, int idx)
1450 {
1451 u32 gpio_val = 0;
1452 u32 port;
1453
1454 if (!hw->func_caps.led[idx])
1455 return 0;
1456
1457 gpio_val = rd32(hw, I40E_GLGEN_GPIO_CTL(idx));
1458 port = (gpio_val & I40E_GLGEN_GPIO_CTL_PRT_NUM_MASK) >>
1459 I40E_GLGEN_GPIO_CTL_PRT_NUM_SHIFT;
1460
1461 /* if PRT_NUM_NA is 1 then this LED is not port specific, OR
1462 * if it is not our port then ignore
1463 */
1464 if ((gpio_val & I40E_GLGEN_GPIO_CTL_PRT_NUM_NA_MASK) ||
1465 (port != hw->port))
1466 return 0;
1467
1468 return gpio_val;
1469 }
1470
1471 #define I40E_COMBINED_ACTIVITY 0xA
1472 #define I40E_FILTER_ACTIVITY 0xE
1473 #define I40E_LINK_ACTIVITY 0xC
1474 #define I40E_MAC_ACTIVITY 0xD
1475 #define I40E_LED0 22
1476
1477 /**
1478 * i40e_led_get - return current on/off mode
1479 * @hw: pointer to the hw struct
1480 *
1481 * The value returned is the 'mode' field as defined in the
1482 * GPIO register definitions: 0x0 = off, 0xf = on, and other
1483 * values are variations of possible behaviors relating to
1484 * blink, link, and wire.
1485 **/
i40e_led_get(struct i40e_hw * hw)1486 u32 i40e_led_get(struct i40e_hw *hw)
1487 {
1488 u32 current_mode = 0;
1489 u32 mode = 0;
1490 int i;
1491
1492 /* as per the documentation GPIO 22-29 are the LED
1493 * GPIO pins named LED0..LED7
1494 */
1495 for (i = I40E_LED0; i <= I40E_GLGEN_GPIO_CTL_MAX_INDEX; i++) {
1496 u32 gpio_val = i40e_led_is_mine(hw, i);
1497
1498 if (!gpio_val)
1499 continue;
1500
1501 /* ignore gpio LED src mode entries related to the activity
1502 * LEDs
1503 */
1504 current_mode = ((gpio_val & I40E_GLGEN_GPIO_CTL_LED_MODE_MASK)
1505 >> I40E_GLGEN_GPIO_CTL_LED_MODE_SHIFT);
1506 switch (current_mode) {
1507 case I40E_COMBINED_ACTIVITY:
1508 case I40E_FILTER_ACTIVITY:
1509 case I40E_MAC_ACTIVITY:
1510 continue;
1511 default:
1512 break;
1513 }
1514
1515 mode = (gpio_val & I40E_GLGEN_GPIO_CTL_LED_MODE_MASK) >>
1516 I40E_GLGEN_GPIO_CTL_LED_MODE_SHIFT;
1517 break;
1518 }
1519
1520 return mode;
1521 }
1522
1523 /**
1524 * i40e_led_set - set new on/off mode
1525 * @hw: pointer to the hw struct
1526 * @mode: 0=off, 0xf=on (else see manual for mode details)
1527 * @blink: TRUE if the LED should blink when on, FALSE if steady
1528 *
1529 * if this function is used to turn on the blink it should
1530 * be used to disable the blink when restoring the original state.
1531 **/
i40e_led_set(struct i40e_hw * hw,u32 mode,bool blink)1532 void i40e_led_set(struct i40e_hw *hw, u32 mode, bool blink)
1533 {
1534 u32 current_mode = 0;
1535 int i;
1536
1537 if (mode & 0xfffffff0)
1538 DEBUGOUT1("invalid mode passed in %X\n", mode);
1539
1540 /* as per the documentation GPIO 22-29 are the LED
1541 * GPIO pins named LED0..LED7
1542 */
1543 for (i = I40E_LED0; i <= I40E_GLGEN_GPIO_CTL_MAX_INDEX; i++) {
1544 u32 gpio_val = i40e_led_is_mine(hw, i);
1545
1546 if (!gpio_val)
1547 continue;
1548
1549 /* ignore gpio LED src mode entries related to the activity
1550 * LEDs
1551 */
1552 current_mode = ((gpio_val & I40E_GLGEN_GPIO_CTL_LED_MODE_MASK)
1553 >> I40E_GLGEN_GPIO_CTL_LED_MODE_SHIFT);
1554 switch (current_mode) {
1555 case I40E_COMBINED_ACTIVITY:
1556 case I40E_FILTER_ACTIVITY:
1557 case I40E_MAC_ACTIVITY:
1558 continue;
1559 default:
1560 break;
1561 }
1562
1563 gpio_val &= ~I40E_GLGEN_GPIO_CTL_LED_MODE_MASK;
1564 /* this & is a bit of paranoia, but serves as a range check */
1565 gpio_val |= ((mode << I40E_GLGEN_GPIO_CTL_LED_MODE_SHIFT) &
1566 I40E_GLGEN_GPIO_CTL_LED_MODE_MASK);
1567
1568 if (mode == I40E_LINK_ACTIVITY)
1569 blink = FALSE;
1570
1571 if (blink)
1572 gpio_val |= BIT(I40E_GLGEN_GPIO_CTL_LED_BLINK_SHIFT);
1573 else
1574 gpio_val &= ~BIT(I40E_GLGEN_GPIO_CTL_LED_BLINK_SHIFT);
1575
1576 wr32(hw, I40E_GLGEN_GPIO_CTL(i), gpio_val);
1577 break;
1578 }
1579 }
1580
1581 /* Admin command wrappers */
1582
1583 /**
1584 * i40e_aq_get_phy_capabilities
1585 * @hw: pointer to the hw struct
1586 * @abilities: structure for PHY capabilities to be filled
1587 * @qualified_modules: report Qualified Modules
1588 * @report_init: report init capabilities (active are default)
1589 * @cmd_details: pointer to command details structure or NULL
1590 *
1591 * Returns the various PHY abilities supported on the Port.
1592 **/
i40e_aq_get_phy_capabilities(struct i40e_hw * hw,bool qualified_modules,bool report_init,struct i40e_aq_get_phy_abilities_resp * abilities,struct i40e_asq_cmd_details * cmd_details)1593 enum i40e_status_code i40e_aq_get_phy_capabilities(struct i40e_hw *hw,
1594 bool qualified_modules, bool report_init,
1595 struct i40e_aq_get_phy_abilities_resp *abilities,
1596 struct i40e_asq_cmd_details *cmd_details)
1597 {
1598 struct i40e_aq_desc desc;
1599 enum i40e_status_code status;
1600 u16 abilities_size = sizeof(struct i40e_aq_get_phy_abilities_resp);
1601
1602 if (!abilities)
1603 return I40E_ERR_PARAM;
1604
1605 i40e_fill_default_direct_cmd_desc(&desc,
1606 i40e_aqc_opc_get_phy_abilities);
1607
1608 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
1609 if (abilities_size > I40E_AQ_LARGE_BUF)
1610 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
1611
1612 if (qualified_modules)
1613 desc.params.external.param0 |=
1614 CPU_TO_LE32(I40E_AQ_PHY_REPORT_QUALIFIED_MODULES);
1615
1616 if (report_init)
1617 desc.params.external.param0 |=
1618 CPU_TO_LE32(I40E_AQ_PHY_REPORT_INITIAL_VALUES);
1619
1620 status = i40e_asq_send_command(hw, &desc, abilities, abilities_size,
1621 cmd_details);
1622
1623 if (hw->aq.asq_last_status == I40E_AQ_RC_EIO)
1624 status = I40E_ERR_UNKNOWN_PHY;
1625
1626 if (report_init) {
1627 hw->phy.phy_types = LE32_TO_CPU(abilities->phy_type);
1628 hw->phy.phy_types |= ((u64)abilities->phy_type_ext << 32);
1629 }
1630
1631 return status;
1632 }
1633
1634 /**
1635 * i40e_aq_set_phy_config
1636 * @hw: pointer to the hw struct
1637 * @config: structure with PHY configuration to be set
1638 * @cmd_details: pointer to command details structure or NULL
1639 *
1640 * Set the various PHY configuration parameters
1641 * supported on the Port.One or more of the Set PHY config parameters may be
1642 * ignored in an MFP mode as the PF may not have the privilege to set some
1643 * of the PHY Config parameters. This status will be indicated by the
1644 * command response.
1645 **/
i40e_aq_set_phy_config(struct i40e_hw * hw,struct i40e_aq_set_phy_config * config,struct i40e_asq_cmd_details * cmd_details)1646 enum i40e_status_code i40e_aq_set_phy_config(struct i40e_hw *hw,
1647 struct i40e_aq_set_phy_config *config,
1648 struct i40e_asq_cmd_details *cmd_details)
1649 {
1650 struct i40e_aq_desc desc;
1651 struct i40e_aq_set_phy_config *cmd =
1652 (struct i40e_aq_set_phy_config *)&desc.params.raw;
1653 enum i40e_status_code status;
1654
1655 if (!config)
1656 return I40E_ERR_PARAM;
1657
1658 i40e_fill_default_direct_cmd_desc(&desc,
1659 i40e_aqc_opc_set_phy_config);
1660
1661 *cmd = *config;
1662
1663 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
1664
1665 return status;
1666 }
1667
1668 /**
1669 * i40e_set_fc
1670 * @hw: pointer to the hw struct
1671 *
1672 * Set the requested flow control mode using set_phy_config.
1673 **/
i40e_set_fc(struct i40e_hw * hw,u8 * aq_failures,bool atomic_restart)1674 enum i40e_status_code i40e_set_fc(struct i40e_hw *hw, u8 *aq_failures,
1675 bool atomic_restart)
1676 {
1677 enum i40e_fc_mode fc_mode = hw->fc.requested_mode;
1678 struct i40e_aq_get_phy_abilities_resp abilities;
1679 struct i40e_aq_set_phy_config config;
1680 enum i40e_status_code status;
1681 u8 pause_mask = 0x0;
1682
1683 *aq_failures = 0x0;
1684
1685 switch (fc_mode) {
1686 case I40E_FC_FULL:
1687 pause_mask |= I40E_AQ_PHY_FLAG_PAUSE_TX;
1688 pause_mask |= I40E_AQ_PHY_FLAG_PAUSE_RX;
1689 break;
1690 case I40E_FC_RX_PAUSE:
1691 pause_mask |= I40E_AQ_PHY_FLAG_PAUSE_RX;
1692 break;
1693 case I40E_FC_TX_PAUSE:
1694 pause_mask |= I40E_AQ_PHY_FLAG_PAUSE_TX;
1695 break;
1696 default:
1697 break;
1698 }
1699
1700 /* Get the current phy config */
1701 status = i40e_aq_get_phy_capabilities(hw, FALSE, false, &abilities,
1702 NULL);
1703 if (status) {
1704 *aq_failures |= I40E_SET_FC_AQ_FAIL_GET;
1705 return status;
1706 }
1707
1708 memset(&config, 0, sizeof(config));
1709 /* clear the old pause settings */
1710 config.abilities = abilities.abilities & ~(I40E_AQ_PHY_FLAG_PAUSE_TX) &
1711 ~(I40E_AQ_PHY_FLAG_PAUSE_RX);
1712 /* set the new abilities */
1713 config.abilities |= pause_mask;
1714 /* If the abilities have changed, then set the new config */
1715 if (config.abilities != abilities.abilities) {
1716 /* Auto restart link so settings take effect */
1717 if (atomic_restart)
1718 config.abilities |= I40E_AQ_PHY_ENABLE_ATOMIC_LINK;
1719 /* Copy over all the old settings */
1720 config.phy_type = abilities.phy_type;
1721 config.phy_type_ext = abilities.phy_type_ext;
1722 config.link_speed = abilities.link_speed;
1723 config.eee_capability = abilities.eee_capability;
1724 config.eeer = abilities.eeer_val;
1725 config.low_power_ctrl = abilities.d3_lpan;
1726 status = i40e_aq_set_phy_config(hw, &config, NULL);
1727
1728 if (status)
1729 *aq_failures |= I40E_SET_FC_AQ_FAIL_SET;
1730 }
1731 /* Update the link info */
1732 status = i40e_update_link_info(hw);
1733 if (status) {
1734 /* Wait a little bit (on 40G cards it sometimes takes a really
1735 * long time for link to come back from the atomic reset)
1736 * and try once more
1737 */
1738 i40e_msec_delay(1000);
1739 status = i40e_update_link_info(hw);
1740 }
1741 if (status)
1742 *aq_failures |= I40E_SET_FC_AQ_FAIL_UPDATE;
1743
1744 return status;
1745 }
1746
1747 /**
1748 * i40e_aq_set_mac_config
1749 * @hw: pointer to the hw struct
1750 * @max_frame_size: Maximum Frame Size to be supported by the port
1751 * @crc_en: Tell HW to append a CRC to outgoing frames
1752 * @pacing: Pacing configurations
1753 * @cmd_details: pointer to command details structure or NULL
1754 *
1755 * Configure MAC settings for frame size, jumbo frame support and the
1756 * addition of a CRC by the hardware.
1757 **/
i40e_aq_set_mac_config(struct i40e_hw * hw,u16 max_frame_size,bool crc_en,u16 pacing,struct i40e_asq_cmd_details * cmd_details)1758 enum i40e_status_code i40e_aq_set_mac_config(struct i40e_hw *hw,
1759 u16 max_frame_size,
1760 bool crc_en, u16 pacing,
1761 struct i40e_asq_cmd_details *cmd_details)
1762 {
1763 struct i40e_aq_desc desc;
1764 struct i40e_aq_set_mac_config *cmd =
1765 (struct i40e_aq_set_mac_config *)&desc.params.raw;
1766 enum i40e_status_code status;
1767
1768 if (max_frame_size == 0)
1769 return I40E_ERR_PARAM;
1770
1771 i40e_fill_default_direct_cmd_desc(&desc,
1772 i40e_aqc_opc_set_mac_config);
1773
1774 cmd->max_frame_size = CPU_TO_LE16(max_frame_size);
1775 cmd->params = ((u8)pacing & 0x0F) << 3;
1776 if (crc_en)
1777 cmd->params |= I40E_AQ_SET_MAC_CONFIG_CRC_EN;
1778
1779 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
1780
1781 return status;
1782 }
1783
1784 /**
1785 * i40e_aq_clear_pxe_mode
1786 * @hw: pointer to the hw struct
1787 * @cmd_details: pointer to command details structure or NULL
1788 *
1789 * Tell the firmware that the driver is taking over from PXE
1790 **/
i40e_aq_clear_pxe_mode(struct i40e_hw * hw,struct i40e_asq_cmd_details * cmd_details)1791 enum i40e_status_code i40e_aq_clear_pxe_mode(struct i40e_hw *hw,
1792 struct i40e_asq_cmd_details *cmd_details)
1793 {
1794 enum i40e_status_code status;
1795 struct i40e_aq_desc desc;
1796 struct i40e_aqc_clear_pxe *cmd =
1797 (struct i40e_aqc_clear_pxe *)&desc.params.raw;
1798
1799 i40e_fill_default_direct_cmd_desc(&desc,
1800 i40e_aqc_opc_clear_pxe_mode);
1801
1802 cmd->rx_cnt = 0x2;
1803
1804 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
1805
1806 wr32(hw, I40E_GLLAN_RCTL_0, 0x1);
1807
1808 return status;
1809 }
1810
1811 /**
1812 * i40e_aq_set_link_restart_an
1813 * @hw: pointer to the hw struct
1814 * @enable_link: if TRUE: enable link, if FALSE: disable link
1815 * @cmd_details: pointer to command details structure or NULL
1816 *
1817 * Sets up the link and restarts the Auto-Negotiation over the link.
1818 **/
i40e_aq_set_link_restart_an(struct i40e_hw * hw,bool enable_link,struct i40e_asq_cmd_details * cmd_details)1819 enum i40e_status_code i40e_aq_set_link_restart_an(struct i40e_hw *hw,
1820 bool enable_link, struct i40e_asq_cmd_details *cmd_details)
1821 {
1822 struct i40e_aq_desc desc;
1823 struct i40e_aqc_set_link_restart_an *cmd =
1824 (struct i40e_aqc_set_link_restart_an *)&desc.params.raw;
1825 enum i40e_status_code status;
1826
1827 i40e_fill_default_direct_cmd_desc(&desc,
1828 i40e_aqc_opc_set_link_restart_an);
1829
1830 cmd->command = I40E_AQ_PHY_RESTART_AN;
1831 if (enable_link)
1832 cmd->command |= I40E_AQ_PHY_LINK_ENABLE;
1833 else
1834 cmd->command &= ~I40E_AQ_PHY_LINK_ENABLE;
1835
1836 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
1837
1838 return status;
1839 }
1840
1841 /**
1842 * i40e_aq_get_link_info
1843 * @hw: pointer to the hw struct
1844 * @enable_lse: enable/disable LinkStatusEvent reporting
1845 * @link: pointer to link status structure - optional
1846 * @cmd_details: pointer to command details structure or NULL
1847 *
1848 * Returns the link status of the adapter.
1849 **/
i40e_aq_get_link_info(struct i40e_hw * hw,bool enable_lse,struct i40e_link_status * link,struct i40e_asq_cmd_details * cmd_details)1850 enum i40e_status_code i40e_aq_get_link_info(struct i40e_hw *hw,
1851 bool enable_lse, struct i40e_link_status *link,
1852 struct i40e_asq_cmd_details *cmd_details)
1853 {
1854 struct i40e_aq_desc desc;
1855 struct i40e_aqc_get_link_status *resp =
1856 (struct i40e_aqc_get_link_status *)&desc.params.raw;
1857 struct i40e_link_status *hw_link_info = &hw->phy.link_info;
1858 enum i40e_status_code status;
1859 bool tx_pause, rx_pause;
1860 u16 command_flags;
1861
1862 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_get_link_status);
1863
1864 if (enable_lse)
1865 command_flags = I40E_AQ_LSE_ENABLE;
1866 else
1867 command_flags = I40E_AQ_LSE_DISABLE;
1868 resp->command_flags = CPU_TO_LE16(command_flags);
1869
1870 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
1871
1872 if (status != I40E_SUCCESS)
1873 goto aq_get_link_info_exit;
1874
1875 /* save off old link status information */
1876 i40e_memcpy(&hw->phy.link_info_old, hw_link_info,
1877 sizeof(*hw_link_info), I40E_NONDMA_TO_NONDMA);
1878
1879 /* update link status */
1880 hw_link_info->phy_type = (enum i40e_aq_phy_type)resp->phy_type;
1881 hw->phy.media_type = i40e_get_media_type(hw);
1882 hw_link_info->link_speed = (enum i40e_aq_link_speed)resp->link_speed;
1883 hw_link_info->link_info = resp->link_info;
1884 hw_link_info->an_info = resp->an_info;
1885 hw_link_info->ext_info = resp->ext_info;
1886 hw_link_info->loopback = resp->loopback;
1887 hw_link_info->max_frame_size = LE16_TO_CPU(resp->max_frame_size);
1888 hw_link_info->pacing = resp->config & I40E_AQ_CONFIG_PACING_MASK;
1889
1890 /* update fc info */
1891 tx_pause = !!(resp->an_info & I40E_AQ_LINK_PAUSE_TX);
1892 rx_pause = !!(resp->an_info & I40E_AQ_LINK_PAUSE_RX);
1893 if (tx_pause & rx_pause)
1894 hw->fc.current_mode = I40E_FC_FULL;
1895 else if (tx_pause)
1896 hw->fc.current_mode = I40E_FC_TX_PAUSE;
1897 else if (rx_pause)
1898 hw->fc.current_mode = I40E_FC_RX_PAUSE;
1899 else
1900 hw->fc.current_mode = I40E_FC_NONE;
1901
1902 if (resp->config & I40E_AQ_CONFIG_CRC_ENA)
1903 hw_link_info->crc_enable = TRUE;
1904 else
1905 hw_link_info->crc_enable = FALSE;
1906
1907 if (resp->command_flags & CPU_TO_LE16(I40E_AQ_LSE_IS_ENABLED))
1908 hw_link_info->lse_enable = TRUE;
1909 else
1910 hw_link_info->lse_enable = FALSE;
1911
1912 if ((hw->mac.type == I40E_MAC_XL710) &&
1913 (hw->aq.fw_maj_ver < 4 || (hw->aq.fw_maj_ver == 4 &&
1914 hw->aq.fw_min_ver < 40)) && hw_link_info->phy_type == 0xE)
1915 hw_link_info->phy_type = I40E_PHY_TYPE_10GBASE_SFPP_CU;
1916
1917 /* save link status information */
1918 if (link)
1919 i40e_memcpy(link, hw_link_info, sizeof(*hw_link_info),
1920 I40E_NONDMA_TO_NONDMA);
1921
1922 /* flag cleared so helper functions don't call AQ again */
1923 hw->phy.get_link_info = FALSE;
1924
1925 aq_get_link_info_exit:
1926 return status;
1927 }
1928
1929 /**
1930 * i40e_aq_set_phy_int_mask
1931 * @hw: pointer to the hw struct
1932 * @mask: interrupt mask to be set
1933 * @cmd_details: pointer to command details structure or NULL
1934 *
1935 * Set link interrupt mask.
1936 **/
i40e_aq_set_phy_int_mask(struct i40e_hw * hw,u16 mask,struct i40e_asq_cmd_details * cmd_details)1937 enum i40e_status_code i40e_aq_set_phy_int_mask(struct i40e_hw *hw,
1938 u16 mask,
1939 struct i40e_asq_cmd_details *cmd_details)
1940 {
1941 struct i40e_aq_desc desc;
1942 struct i40e_aqc_set_phy_int_mask *cmd =
1943 (struct i40e_aqc_set_phy_int_mask *)&desc.params.raw;
1944 enum i40e_status_code status;
1945
1946 i40e_fill_default_direct_cmd_desc(&desc,
1947 i40e_aqc_opc_set_phy_int_mask);
1948
1949 cmd->event_mask = CPU_TO_LE16(mask);
1950
1951 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
1952
1953 return status;
1954 }
1955
1956 /**
1957 * i40e_aq_get_local_advt_reg
1958 * @hw: pointer to the hw struct
1959 * @advt_reg: local AN advertisement register value
1960 * @cmd_details: pointer to command details structure or NULL
1961 *
1962 * Get the Local AN advertisement register value.
1963 **/
i40e_aq_get_local_advt_reg(struct i40e_hw * hw,u64 * advt_reg,struct i40e_asq_cmd_details * cmd_details)1964 enum i40e_status_code i40e_aq_get_local_advt_reg(struct i40e_hw *hw,
1965 u64 *advt_reg,
1966 struct i40e_asq_cmd_details *cmd_details)
1967 {
1968 struct i40e_aq_desc desc;
1969 struct i40e_aqc_an_advt_reg *resp =
1970 (struct i40e_aqc_an_advt_reg *)&desc.params.raw;
1971 enum i40e_status_code status;
1972
1973 i40e_fill_default_direct_cmd_desc(&desc,
1974 i40e_aqc_opc_get_local_advt_reg);
1975
1976 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
1977
1978 if (status != I40E_SUCCESS)
1979 goto aq_get_local_advt_reg_exit;
1980
1981 *advt_reg = (u64)(LE16_TO_CPU(resp->local_an_reg1)) << 32;
1982 *advt_reg |= LE32_TO_CPU(resp->local_an_reg0);
1983
1984 aq_get_local_advt_reg_exit:
1985 return status;
1986 }
1987
1988 /**
1989 * i40e_aq_set_local_advt_reg
1990 * @hw: pointer to the hw struct
1991 * @advt_reg: local AN advertisement register value
1992 * @cmd_details: pointer to command details structure or NULL
1993 *
1994 * Get the Local AN advertisement register value.
1995 **/
i40e_aq_set_local_advt_reg(struct i40e_hw * hw,u64 advt_reg,struct i40e_asq_cmd_details * cmd_details)1996 enum i40e_status_code i40e_aq_set_local_advt_reg(struct i40e_hw *hw,
1997 u64 advt_reg,
1998 struct i40e_asq_cmd_details *cmd_details)
1999 {
2000 struct i40e_aq_desc desc;
2001 struct i40e_aqc_an_advt_reg *cmd =
2002 (struct i40e_aqc_an_advt_reg *)&desc.params.raw;
2003 enum i40e_status_code status;
2004
2005 i40e_fill_default_direct_cmd_desc(&desc,
2006 i40e_aqc_opc_get_local_advt_reg);
2007
2008 cmd->local_an_reg0 = CPU_TO_LE32(I40E_LO_DWORD(advt_reg));
2009 cmd->local_an_reg1 = CPU_TO_LE16(I40E_HI_DWORD(advt_reg));
2010
2011 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2012
2013 return status;
2014 }
2015
2016 /**
2017 * i40e_aq_get_partner_advt
2018 * @hw: pointer to the hw struct
2019 * @advt_reg: AN partner advertisement register value
2020 * @cmd_details: pointer to command details structure or NULL
2021 *
2022 * Get the link partner AN advertisement register value.
2023 **/
i40e_aq_get_partner_advt(struct i40e_hw * hw,u64 * advt_reg,struct i40e_asq_cmd_details * cmd_details)2024 enum i40e_status_code i40e_aq_get_partner_advt(struct i40e_hw *hw,
2025 u64 *advt_reg,
2026 struct i40e_asq_cmd_details *cmd_details)
2027 {
2028 struct i40e_aq_desc desc;
2029 struct i40e_aqc_an_advt_reg *resp =
2030 (struct i40e_aqc_an_advt_reg *)&desc.params.raw;
2031 enum i40e_status_code status;
2032
2033 i40e_fill_default_direct_cmd_desc(&desc,
2034 i40e_aqc_opc_get_partner_advt);
2035
2036 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2037
2038 if (status != I40E_SUCCESS)
2039 goto aq_get_partner_advt_exit;
2040
2041 *advt_reg = (u64)(LE16_TO_CPU(resp->local_an_reg1)) << 32;
2042 *advt_reg |= LE32_TO_CPU(resp->local_an_reg0);
2043
2044 aq_get_partner_advt_exit:
2045 return status;
2046 }
2047
2048 /**
2049 * i40e_aq_set_lb_modes
2050 * @hw: pointer to the hw struct
2051 * @lb_modes: loopback mode to be set
2052 * @cmd_details: pointer to command details structure or NULL
2053 *
2054 * Sets loopback modes.
2055 **/
i40e_aq_set_lb_modes(struct i40e_hw * hw,u16 lb_modes,struct i40e_asq_cmd_details * cmd_details)2056 enum i40e_status_code i40e_aq_set_lb_modes(struct i40e_hw *hw,
2057 u16 lb_modes,
2058 struct i40e_asq_cmd_details *cmd_details)
2059 {
2060 struct i40e_aq_desc desc;
2061 struct i40e_aqc_set_lb_mode *cmd =
2062 (struct i40e_aqc_set_lb_mode *)&desc.params.raw;
2063 enum i40e_status_code status;
2064
2065 i40e_fill_default_direct_cmd_desc(&desc,
2066 i40e_aqc_opc_set_lb_modes);
2067
2068 cmd->lb_mode = CPU_TO_LE16(lb_modes);
2069
2070 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2071
2072 return status;
2073 }
2074
2075 /**
2076 * i40e_aq_set_phy_debug
2077 * @hw: pointer to the hw struct
2078 * @cmd_flags: debug command flags
2079 * @cmd_details: pointer to command details structure or NULL
2080 *
2081 * Reset the external PHY.
2082 **/
i40e_aq_set_phy_debug(struct i40e_hw * hw,u8 cmd_flags,struct i40e_asq_cmd_details * cmd_details)2083 enum i40e_status_code i40e_aq_set_phy_debug(struct i40e_hw *hw, u8 cmd_flags,
2084 struct i40e_asq_cmd_details *cmd_details)
2085 {
2086 struct i40e_aq_desc desc;
2087 struct i40e_aqc_set_phy_debug *cmd =
2088 (struct i40e_aqc_set_phy_debug *)&desc.params.raw;
2089 enum i40e_status_code status;
2090
2091 i40e_fill_default_direct_cmd_desc(&desc,
2092 i40e_aqc_opc_set_phy_debug);
2093
2094 cmd->command_flags = cmd_flags;
2095
2096 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2097
2098 return status;
2099 }
2100
2101 /**
2102 * i40e_aq_add_vsi
2103 * @hw: pointer to the hw struct
2104 * @vsi_ctx: pointer to a vsi context struct
2105 * @cmd_details: pointer to command details structure or NULL
2106 *
2107 * Add a VSI context to the hardware.
2108 **/
i40e_aq_add_vsi(struct i40e_hw * hw,struct i40e_vsi_context * vsi_ctx,struct i40e_asq_cmd_details * cmd_details)2109 enum i40e_status_code i40e_aq_add_vsi(struct i40e_hw *hw,
2110 struct i40e_vsi_context *vsi_ctx,
2111 struct i40e_asq_cmd_details *cmd_details)
2112 {
2113 struct i40e_aq_desc desc;
2114 struct i40e_aqc_add_get_update_vsi *cmd =
2115 (struct i40e_aqc_add_get_update_vsi *)&desc.params.raw;
2116 struct i40e_aqc_add_get_update_vsi_completion *resp =
2117 (struct i40e_aqc_add_get_update_vsi_completion *)
2118 &desc.params.raw;
2119 enum i40e_status_code status;
2120
2121 i40e_fill_default_direct_cmd_desc(&desc,
2122 i40e_aqc_opc_add_vsi);
2123
2124 cmd->uplink_seid = CPU_TO_LE16(vsi_ctx->uplink_seid);
2125 cmd->connection_type = vsi_ctx->connection_type;
2126 cmd->vf_id = vsi_ctx->vf_num;
2127 cmd->vsi_flags = CPU_TO_LE16(vsi_ctx->flags);
2128
2129 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
2130
2131 status = i40e_asq_send_command(hw, &desc, &vsi_ctx->info,
2132 sizeof(vsi_ctx->info), cmd_details);
2133
2134 if (status != I40E_SUCCESS)
2135 goto aq_add_vsi_exit;
2136
2137 vsi_ctx->seid = LE16_TO_CPU(resp->seid);
2138 vsi_ctx->vsi_number = LE16_TO_CPU(resp->vsi_number);
2139 vsi_ctx->vsis_allocated = LE16_TO_CPU(resp->vsi_used);
2140 vsi_ctx->vsis_unallocated = LE16_TO_CPU(resp->vsi_free);
2141
2142 aq_add_vsi_exit:
2143 return status;
2144 }
2145
2146 /**
2147 * i40e_aq_set_default_vsi
2148 * @hw: pointer to the hw struct
2149 * @seid: vsi number
2150 * @cmd_details: pointer to command details structure or NULL
2151 **/
i40e_aq_set_default_vsi(struct i40e_hw * hw,u16 seid,struct i40e_asq_cmd_details * cmd_details)2152 enum i40e_status_code i40e_aq_set_default_vsi(struct i40e_hw *hw,
2153 u16 seid,
2154 struct i40e_asq_cmd_details *cmd_details)
2155 {
2156 struct i40e_aq_desc desc;
2157 struct i40e_aqc_set_vsi_promiscuous_modes *cmd =
2158 (struct i40e_aqc_set_vsi_promiscuous_modes *)
2159 &desc.params.raw;
2160 enum i40e_status_code status;
2161
2162 i40e_fill_default_direct_cmd_desc(&desc,
2163 i40e_aqc_opc_set_vsi_promiscuous_modes);
2164
2165 cmd->promiscuous_flags = CPU_TO_LE16(I40E_AQC_SET_VSI_DEFAULT);
2166 cmd->valid_flags = CPU_TO_LE16(I40E_AQC_SET_VSI_DEFAULT);
2167 cmd->seid = CPU_TO_LE16(seid);
2168
2169 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2170
2171 return status;
2172 }
2173
2174 /**
2175 * i40e_aq_clear_default_vsi
2176 * @hw: pointer to the hw struct
2177 * @seid: vsi number
2178 * @cmd_details: pointer to command details structure or NULL
2179 **/
i40e_aq_clear_default_vsi(struct i40e_hw * hw,u16 seid,struct i40e_asq_cmd_details * cmd_details)2180 enum i40e_status_code i40e_aq_clear_default_vsi(struct i40e_hw *hw,
2181 u16 seid,
2182 struct i40e_asq_cmd_details *cmd_details)
2183 {
2184 struct i40e_aq_desc desc;
2185 struct i40e_aqc_set_vsi_promiscuous_modes *cmd =
2186 (struct i40e_aqc_set_vsi_promiscuous_modes *)
2187 &desc.params.raw;
2188 enum i40e_status_code status;
2189
2190 i40e_fill_default_direct_cmd_desc(&desc,
2191 i40e_aqc_opc_set_vsi_promiscuous_modes);
2192
2193 cmd->promiscuous_flags = CPU_TO_LE16(0);
2194 cmd->valid_flags = CPU_TO_LE16(I40E_AQC_SET_VSI_DEFAULT);
2195 cmd->seid = CPU_TO_LE16(seid);
2196
2197 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2198
2199 return status;
2200 }
2201
2202 /**
2203 * i40e_aq_set_vsi_unicast_promiscuous
2204 * @hw: pointer to the hw struct
2205 * @seid: vsi number
2206 * @set: set unicast promiscuous enable/disable
2207 * @cmd_details: pointer to command details structure or NULL
2208 * @rx_only_promisc: flag to decide if egress traffic gets mirrored in promisc
2209 **/
i40e_aq_set_vsi_unicast_promiscuous(struct i40e_hw * hw,u16 seid,bool set,struct i40e_asq_cmd_details * cmd_details,bool rx_only_promisc)2210 enum i40e_status_code i40e_aq_set_vsi_unicast_promiscuous(struct i40e_hw *hw,
2211 u16 seid, bool set,
2212 struct i40e_asq_cmd_details *cmd_details,
2213 bool rx_only_promisc)
2214 {
2215 struct i40e_aq_desc desc;
2216 struct i40e_aqc_set_vsi_promiscuous_modes *cmd =
2217 (struct i40e_aqc_set_vsi_promiscuous_modes *)&desc.params.raw;
2218 enum i40e_status_code status;
2219 u16 flags = 0;
2220
2221 i40e_fill_default_direct_cmd_desc(&desc,
2222 i40e_aqc_opc_set_vsi_promiscuous_modes);
2223
2224 if (set) {
2225 flags |= I40E_AQC_SET_VSI_PROMISC_UNICAST;
2226 if (rx_only_promisc &&
2227 (((hw->aq.api_maj_ver == 1) && (hw->aq.api_min_ver >= 5)) ||
2228 (hw->aq.api_maj_ver > 1)))
2229 flags |= I40E_AQC_SET_VSI_PROMISC_TX;
2230 }
2231
2232 cmd->promiscuous_flags = CPU_TO_LE16(flags);
2233
2234 cmd->valid_flags = CPU_TO_LE16(I40E_AQC_SET_VSI_PROMISC_UNICAST);
2235 if (((hw->aq.api_maj_ver >= 1) && (hw->aq.api_min_ver >= 5)) ||
2236 (hw->aq.api_maj_ver > 1))
2237 cmd->valid_flags |= CPU_TO_LE16(I40E_AQC_SET_VSI_PROMISC_TX);
2238
2239 cmd->seid = CPU_TO_LE16(seid);
2240 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2241
2242 return status;
2243 }
2244
2245 /**
2246 * i40e_aq_set_vsi_multicast_promiscuous
2247 * @hw: pointer to the hw struct
2248 * @seid: vsi number
2249 * @set: set multicast promiscuous enable/disable
2250 * @cmd_details: pointer to command details structure or NULL
2251 **/
i40e_aq_set_vsi_multicast_promiscuous(struct i40e_hw * hw,u16 seid,bool set,struct i40e_asq_cmd_details * cmd_details)2252 enum i40e_status_code i40e_aq_set_vsi_multicast_promiscuous(struct i40e_hw *hw,
2253 u16 seid, bool set, struct i40e_asq_cmd_details *cmd_details)
2254 {
2255 struct i40e_aq_desc desc;
2256 struct i40e_aqc_set_vsi_promiscuous_modes *cmd =
2257 (struct i40e_aqc_set_vsi_promiscuous_modes *)&desc.params.raw;
2258 enum i40e_status_code status;
2259 u16 flags = 0;
2260
2261 i40e_fill_default_direct_cmd_desc(&desc,
2262 i40e_aqc_opc_set_vsi_promiscuous_modes);
2263
2264 if (set)
2265 flags |= I40E_AQC_SET_VSI_PROMISC_MULTICAST;
2266
2267 cmd->promiscuous_flags = CPU_TO_LE16(flags);
2268
2269 cmd->valid_flags = CPU_TO_LE16(I40E_AQC_SET_VSI_PROMISC_MULTICAST);
2270
2271 cmd->seid = CPU_TO_LE16(seid);
2272 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2273
2274 return status;
2275 }
2276
2277 /**
2278 * i40e_aq_set_vsi_mc_promisc_on_vlan
2279 * @hw: pointer to the hw struct
2280 * @seid: vsi number
2281 * @enable: set MAC L2 layer unicast promiscuous enable/disable for a given VLAN
2282 * @vid: The VLAN tag filter - capture any multicast packet with this VLAN tag
2283 * @cmd_details: pointer to command details structure or NULL
2284 **/
i40e_aq_set_vsi_mc_promisc_on_vlan(struct i40e_hw * hw,u16 seid,bool enable,u16 vid,struct i40e_asq_cmd_details * cmd_details)2285 enum i40e_status_code i40e_aq_set_vsi_mc_promisc_on_vlan(struct i40e_hw *hw,
2286 u16 seid, bool enable, u16 vid,
2287 struct i40e_asq_cmd_details *cmd_details)
2288 {
2289 struct i40e_aq_desc desc;
2290 struct i40e_aqc_set_vsi_promiscuous_modes *cmd =
2291 (struct i40e_aqc_set_vsi_promiscuous_modes *)&desc.params.raw;
2292 enum i40e_status_code status;
2293 u16 flags = 0;
2294
2295 i40e_fill_default_direct_cmd_desc(&desc,
2296 i40e_aqc_opc_set_vsi_promiscuous_modes);
2297
2298 if (enable)
2299 flags |= I40E_AQC_SET_VSI_PROMISC_MULTICAST;
2300
2301 cmd->promiscuous_flags = CPU_TO_LE16(flags);
2302 cmd->valid_flags = CPU_TO_LE16(I40E_AQC_SET_VSI_PROMISC_MULTICAST);
2303 cmd->seid = CPU_TO_LE16(seid);
2304 cmd->vlan_tag = CPU_TO_LE16(vid | I40E_AQC_SET_VSI_VLAN_VALID);
2305
2306 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2307
2308 return status;
2309 }
2310
2311 /**
2312 * i40e_aq_set_vsi_uc_promisc_on_vlan
2313 * @hw: pointer to the hw struct
2314 * @seid: vsi number
2315 * @enable: set MAC L2 layer unicast promiscuous enable/disable for a given VLAN
2316 * @vid: The VLAN tag filter - capture any unicast packet with this VLAN tag
2317 * @cmd_details: pointer to command details structure or NULL
2318 **/
i40e_aq_set_vsi_uc_promisc_on_vlan(struct i40e_hw * hw,u16 seid,bool enable,u16 vid,struct i40e_asq_cmd_details * cmd_details)2319 enum i40e_status_code i40e_aq_set_vsi_uc_promisc_on_vlan(struct i40e_hw *hw,
2320 u16 seid, bool enable, u16 vid,
2321 struct i40e_asq_cmd_details *cmd_details)
2322 {
2323 struct i40e_aq_desc desc;
2324 struct i40e_aqc_set_vsi_promiscuous_modes *cmd =
2325 (struct i40e_aqc_set_vsi_promiscuous_modes *)&desc.params.raw;
2326 enum i40e_status_code status;
2327 u16 flags = 0;
2328
2329 i40e_fill_default_direct_cmd_desc(&desc,
2330 i40e_aqc_opc_set_vsi_promiscuous_modes);
2331
2332 if (enable)
2333 flags |= I40E_AQC_SET_VSI_PROMISC_UNICAST;
2334
2335 cmd->promiscuous_flags = CPU_TO_LE16(flags);
2336 cmd->valid_flags = CPU_TO_LE16(I40E_AQC_SET_VSI_PROMISC_UNICAST);
2337 cmd->seid = CPU_TO_LE16(seid);
2338 cmd->vlan_tag = CPU_TO_LE16(vid | I40E_AQC_SET_VSI_VLAN_VALID);
2339
2340 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2341
2342 return status;
2343 }
2344
2345 /**
2346 * i40e_aq_set_vsi_bc_promisc_on_vlan
2347 * @hw: pointer to the hw struct
2348 * @seid: vsi number
2349 * @enable: set broadcast promiscuous enable/disable for a given VLAN
2350 * @vid: The VLAN tag filter - capture any broadcast packet with this VLAN tag
2351 * @cmd_details: pointer to command details structure or NULL
2352 **/
i40e_aq_set_vsi_bc_promisc_on_vlan(struct i40e_hw * hw,u16 seid,bool enable,u16 vid,struct i40e_asq_cmd_details * cmd_details)2353 enum i40e_status_code i40e_aq_set_vsi_bc_promisc_on_vlan(struct i40e_hw *hw,
2354 u16 seid, bool enable, u16 vid,
2355 struct i40e_asq_cmd_details *cmd_details)
2356 {
2357 struct i40e_aq_desc desc;
2358 struct i40e_aqc_set_vsi_promiscuous_modes *cmd =
2359 (struct i40e_aqc_set_vsi_promiscuous_modes *)&desc.params.raw;
2360 enum i40e_status_code status;
2361 u16 flags = 0;
2362
2363 i40e_fill_default_direct_cmd_desc(&desc,
2364 i40e_aqc_opc_set_vsi_promiscuous_modes);
2365
2366 if (enable)
2367 flags |= I40E_AQC_SET_VSI_PROMISC_BROADCAST;
2368
2369 cmd->promiscuous_flags = CPU_TO_LE16(flags);
2370 cmd->valid_flags = CPU_TO_LE16(I40E_AQC_SET_VSI_PROMISC_BROADCAST);
2371 cmd->seid = CPU_TO_LE16(seid);
2372 cmd->vlan_tag = CPU_TO_LE16(vid | I40E_AQC_SET_VSI_VLAN_VALID);
2373
2374 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2375
2376 return status;
2377 }
2378
2379 /**
2380 * i40e_aq_set_vsi_broadcast
2381 * @hw: pointer to the hw struct
2382 * @seid: vsi number
2383 * @set_filter: TRUE to set filter, FALSE to clear filter
2384 * @cmd_details: pointer to command details structure or NULL
2385 *
2386 * Set or clear the broadcast promiscuous flag (filter) for a given VSI.
2387 **/
i40e_aq_set_vsi_broadcast(struct i40e_hw * hw,u16 seid,bool set_filter,struct i40e_asq_cmd_details * cmd_details)2388 enum i40e_status_code i40e_aq_set_vsi_broadcast(struct i40e_hw *hw,
2389 u16 seid, bool set_filter,
2390 struct i40e_asq_cmd_details *cmd_details)
2391 {
2392 struct i40e_aq_desc desc;
2393 struct i40e_aqc_set_vsi_promiscuous_modes *cmd =
2394 (struct i40e_aqc_set_vsi_promiscuous_modes *)&desc.params.raw;
2395 enum i40e_status_code status;
2396
2397 i40e_fill_default_direct_cmd_desc(&desc,
2398 i40e_aqc_opc_set_vsi_promiscuous_modes);
2399
2400 if (set_filter)
2401 cmd->promiscuous_flags
2402 |= CPU_TO_LE16(I40E_AQC_SET_VSI_PROMISC_BROADCAST);
2403 else
2404 cmd->promiscuous_flags
2405 &= CPU_TO_LE16(~I40E_AQC_SET_VSI_PROMISC_BROADCAST);
2406
2407 cmd->valid_flags = CPU_TO_LE16(I40E_AQC_SET_VSI_PROMISC_BROADCAST);
2408 cmd->seid = CPU_TO_LE16(seid);
2409 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2410
2411 return status;
2412 }
2413
2414 /**
2415 * i40e_aq_set_vsi_vlan_promisc - control the VLAN promiscuous setting
2416 * @hw: pointer to the hw struct
2417 * @seid: vsi number
2418 * @enable: set MAC L2 layer unicast promiscuous enable/disable for a given VLAN
2419 * @cmd_details: pointer to command details structure or NULL
2420 **/
i40e_aq_set_vsi_vlan_promisc(struct i40e_hw * hw,u16 seid,bool enable,struct i40e_asq_cmd_details * cmd_details)2421 enum i40e_status_code i40e_aq_set_vsi_vlan_promisc(struct i40e_hw *hw,
2422 u16 seid, bool enable,
2423 struct i40e_asq_cmd_details *cmd_details)
2424 {
2425 struct i40e_aq_desc desc;
2426 struct i40e_aqc_set_vsi_promiscuous_modes *cmd =
2427 (struct i40e_aqc_set_vsi_promiscuous_modes *)&desc.params.raw;
2428 enum i40e_status_code status;
2429 u16 flags = 0;
2430
2431 i40e_fill_default_direct_cmd_desc(&desc,
2432 i40e_aqc_opc_set_vsi_promiscuous_modes);
2433 if (enable)
2434 flags |= I40E_AQC_SET_VSI_PROMISC_VLAN;
2435
2436 cmd->promiscuous_flags = CPU_TO_LE16(flags);
2437 cmd->valid_flags = CPU_TO_LE16(I40E_AQC_SET_VSI_PROMISC_VLAN);
2438 cmd->seid = CPU_TO_LE16(seid);
2439
2440 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2441
2442 return status;
2443 }
2444
2445 /**
2446 * i40e_get_vsi_params - get VSI configuration info
2447 * @hw: pointer to the hw struct
2448 * @vsi_ctx: pointer to a vsi context struct
2449 * @cmd_details: pointer to command details structure or NULL
2450 **/
i40e_aq_get_vsi_params(struct i40e_hw * hw,struct i40e_vsi_context * vsi_ctx,struct i40e_asq_cmd_details * cmd_details)2451 enum i40e_status_code i40e_aq_get_vsi_params(struct i40e_hw *hw,
2452 struct i40e_vsi_context *vsi_ctx,
2453 struct i40e_asq_cmd_details *cmd_details)
2454 {
2455 struct i40e_aq_desc desc;
2456 struct i40e_aqc_add_get_update_vsi *cmd =
2457 (struct i40e_aqc_add_get_update_vsi *)&desc.params.raw;
2458 struct i40e_aqc_add_get_update_vsi_completion *resp =
2459 (struct i40e_aqc_add_get_update_vsi_completion *)
2460 &desc.params.raw;
2461 enum i40e_status_code status;
2462
2463 i40e_fill_default_direct_cmd_desc(&desc,
2464 i40e_aqc_opc_get_vsi_parameters);
2465
2466 cmd->uplink_seid = CPU_TO_LE16(vsi_ctx->seid);
2467
2468 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
2469
2470 status = i40e_asq_send_command(hw, &desc, &vsi_ctx->info,
2471 sizeof(vsi_ctx->info), NULL);
2472
2473 if (status != I40E_SUCCESS)
2474 goto aq_get_vsi_params_exit;
2475
2476 vsi_ctx->seid = LE16_TO_CPU(resp->seid);
2477 vsi_ctx->vsi_number = LE16_TO_CPU(resp->vsi_number);
2478 vsi_ctx->vsis_allocated = LE16_TO_CPU(resp->vsi_used);
2479 vsi_ctx->vsis_unallocated = LE16_TO_CPU(resp->vsi_free);
2480
2481 aq_get_vsi_params_exit:
2482 return status;
2483 }
2484
2485 /**
2486 * i40e_aq_update_vsi_params
2487 * @hw: pointer to the hw struct
2488 * @vsi_ctx: pointer to a vsi context struct
2489 * @cmd_details: pointer to command details structure or NULL
2490 *
2491 * Update a VSI context.
2492 **/
i40e_aq_update_vsi_params(struct i40e_hw * hw,struct i40e_vsi_context * vsi_ctx,struct i40e_asq_cmd_details * cmd_details)2493 enum i40e_status_code i40e_aq_update_vsi_params(struct i40e_hw *hw,
2494 struct i40e_vsi_context *vsi_ctx,
2495 struct i40e_asq_cmd_details *cmd_details)
2496 {
2497 struct i40e_aq_desc desc;
2498 struct i40e_aqc_add_get_update_vsi *cmd =
2499 (struct i40e_aqc_add_get_update_vsi *)&desc.params.raw;
2500 struct i40e_aqc_add_get_update_vsi_completion *resp =
2501 (struct i40e_aqc_add_get_update_vsi_completion *)
2502 &desc.params.raw;
2503 enum i40e_status_code status;
2504
2505 i40e_fill_default_direct_cmd_desc(&desc,
2506 i40e_aqc_opc_update_vsi_parameters);
2507 cmd->uplink_seid = CPU_TO_LE16(vsi_ctx->seid);
2508
2509 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
2510
2511 status = i40e_asq_send_command(hw, &desc, &vsi_ctx->info,
2512 sizeof(vsi_ctx->info), cmd_details);
2513
2514 vsi_ctx->vsis_allocated = LE16_TO_CPU(resp->vsi_used);
2515 vsi_ctx->vsis_unallocated = LE16_TO_CPU(resp->vsi_free);
2516
2517 return status;
2518 }
2519
2520 /**
2521 * i40e_aq_get_switch_config
2522 * @hw: pointer to the hardware structure
2523 * @buf: pointer to the result buffer
2524 * @buf_size: length of input buffer
2525 * @start_seid: seid to start for the report, 0 == beginning
2526 * @cmd_details: pointer to command details structure or NULL
2527 *
2528 * Fill the buf with switch configuration returned from AdminQ command
2529 **/
i40e_aq_get_switch_config(struct i40e_hw * hw,struct i40e_aqc_get_switch_config_resp * buf,u16 buf_size,u16 * start_seid,struct i40e_asq_cmd_details * cmd_details)2530 enum i40e_status_code i40e_aq_get_switch_config(struct i40e_hw *hw,
2531 struct i40e_aqc_get_switch_config_resp *buf,
2532 u16 buf_size, u16 *start_seid,
2533 struct i40e_asq_cmd_details *cmd_details)
2534 {
2535 struct i40e_aq_desc desc;
2536 struct i40e_aqc_switch_seid *scfg =
2537 (struct i40e_aqc_switch_seid *)&desc.params.raw;
2538 enum i40e_status_code status;
2539
2540 i40e_fill_default_direct_cmd_desc(&desc,
2541 i40e_aqc_opc_get_switch_config);
2542 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
2543 if (buf_size > I40E_AQ_LARGE_BUF)
2544 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
2545 scfg->seid = CPU_TO_LE16(*start_seid);
2546
2547 status = i40e_asq_send_command(hw, &desc, buf, buf_size, cmd_details);
2548 *start_seid = LE16_TO_CPU(scfg->seid);
2549
2550 return status;
2551 }
2552
2553 /**
2554 * i40e_aq_set_switch_config
2555 * @hw: pointer to the hardware structure
2556 * @flags: bit flag values to set
2557 * @valid_flags: which bit flags to set
2558 * @cmd_details: pointer to command details structure or NULL
2559 *
2560 * Set switch configuration bits
2561 **/
i40e_aq_set_switch_config(struct i40e_hw * hw,u16 flags,u16 valid_flags,struct i40e_asq_cmd_details * cmd_details)2562 enum i40e_status_code i40e_aq_set_switch_config(struct i40e_hw *hw,
2563 u16 flags, u16 valid_flags,
2564 struct i40e_asq_cmd_details *cmd_details)
2565 {
2566 struct i40e_aq_desc desc;
2567 struct i40e_aqc_set_switch_config *scfg =
2568 (struct i40e_aqc_set_switch_config *)&desc.params.raw;
2569 enum i40e_status_code status;
2570
2571 i40e_fill_default_direct_cmd_desc(&desc,
2572 i40e_aqc_opc_set_switch_config);
2573 scfg->flags = CPU_TO_LE16(flags);
2574 scfg->valid_flags = CPU_TO_LE16(valid_flags);
2575
2576 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2577
2578 return status;
2579 }
2580
2581 /**
2582 * i40e_aq_get_firmware_version
2583 * @hw: pointer to the hw struct
2584 * @fw_major_version: firmware major version
2585 * @fw_minor_version: firmware minor version
2586 * @fw_build: firmware build number
2587 * @api_major_version: major queue version
2588 * @api_minor_version: minor queue version
2589 * @cmd_details: pointer to command details structure or NULL
2590 *
2591 * Get the firmware version from the admin queue commands
2592 **/
i40e_aq_get_firmware_version(struct i40e_hw * hw,u16 * fw_major_version,u16 * fw_minor_version,u32 * fw_build,u16 * api_major_version,u16 * api_minor_version,struct i40e_asq_cmd_details * cmd_details)2593 enum i40e_status_code i40e_aq_get_firmware_version(struct i40e_hw *hw,
2594 u16 *fw_major_version, u16 *fw_minor_version,
2595 u32 *fw_build,
2596 u16 *api_major_version, u16 *api_minor_version,
2597 struct i40e_asq_cmd_details *cmd_details)
2598 {
2599 struct i40e_aq_desc desc;
2600 struct i40e_aqc_get_version *resp =
2601 (struct i40e_aqc_get_version *)&desc.params.raw;
2602 enum i40e_status_code status;
2603
2604 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_get_version);
2605
2606 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2607
2608 if (status == I40E_SUCCESS) {
2609 if (fw_major_version != NULL)
2610 *fw_major_version = LE16_TO_CPU(resp->fw_major);
2611 if (fw_minor_version != NULL)
2612 *fw_minor_version = LE16_TO_CPU(resp->fw_minor);
2613 if (fw_build != NULL)
2614 *fw_build = LE32_TO_CPU(resp->fw_build);
2615 if (api_major_version != NULL)
2616 *api_major_version = LE16_TO_CPU(resp->api_major);
2617 if (api_minor_version != NULL)
2618 *api_minor_version = LE16_TO_CPU(resp->api_minor);
2619
2620 /* A workaround to fix the API version in SW */
2621 if (api_major_version && api_minor_version &&
2622 fw_major_version && fw_minor_version &&
2623 ((*api_major_version == 1) && (*api_minor_version == 1)) &&
2624 (((*fw_major_version == 4) && (*fw_minor_version >= 2)) ||
2625 (*fw_major_version > 4)))
2626 *api_minor_version = 2;
2627 }
2628
2629 return status;
2630 }
2631
2632 /**
2633 * i40e_aq_send_driver_version
2634 * @hw: pointer to the hw struct
2635 * @dv: driver's major, minor version
2636 * @cmd_details: pointer to command details structure or NULL
2637 *
2638 * Send the driver version to the firmware
2639 **/
i40e_aq_send_driver_version(struct i40e_hw * hw,struct i40e_driver_version * dv,struct i40e_asq_cmd_details * cmd_details)2640 enum i40e_status_code i40e_aq_send_driver_version(struct i40e_hw *hw,
2641 struct i40e_driver_version *dv,
2642 struct i40e_asq_cmd_details *cmd_details)
2643 {
2644 struct i40e_aq_desc desc;
2645 struct i40e_aqc_driver_version *cmd =
2646 (struct i40e_aqc_driver_version *)&desc.params.raw;
2647 enum i40e_status_code status;
2648 u16 len;
2649
2650 if (dv == NULL)
2651 return I40E_ERR_PARAM;
2652
2653 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_driver_version);
2654
2655 desc.flags |= CPU_TO_LE16(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD);
2656 cmd->driver_major_ver = dv->major_version;
2657 cmd->driver_minor_ver = dv->minor_version;
2658 cmd->driver_build_ver = dv->build_version;
2659 cmd->driver_subbuild_ver = dv->subbuild_version;
2660
2661 len = 0;
2662 while (len < sizeof(dv->driver_string) &&
2663 (dv->driver_string[len] < 0x80) &&
2664 dv->driver_string[len])
2665 len++;
2666 status = i40e_asq_send_command(hw, &desc, dv->driver_string,
2667 len, cmd_details);
2668
2669 return status;
2670 }
2671
2672 /**
2673 * i40e_get_link_status - get status of the HW network link
2674 * @hw: pointer to the hw struct
2675 * @link_up: pointer to bool (TRUE/FALSE = linkup/linkdown)
2676 *
2677 * Variable link_up TRUE if link is up, FALSE if link is down.
2678 * The variable link_up is invalid if returned value of status != I40E_SUCCESS
2679 *
2680 * Side effect: LinkStatusEvent reporting becomes enabled
2681 **/
i40e_get_link_status(struct i40e_hw * hw,bool * link_up)2682 enum i40e_status_code i40e_get_link_status(struct i40e_hw *hw, bool *link_up)
2683 {
2684 enum i40e_status_code status = I40E_SUCCESS;
2685
2686 if (hw->phy.get_link_info) {
2687 status = i40e_update_link_info(hw);
2688
2689 if (status != I40E_SUCCESS)
2690 i40e_debug(hw, I40E_DEBUG_LINK, "get link failed: status %d\n",
2691 status);
2692 }
2693
2694 *link_up = hw->phy.link_info.link_info & I40E_AQ_LINK_UP;
2695
2696 return status;
2697 }
2698
2699 /**
2700 * i40e_updatelink_status - update status of the HW network link
2701 * @hw: pointer to the hw struct
2702 **/
i40e_update_link_info(struct i40e_hw * hw)2703 enum i40e_status_code i40e_update_link_info(struct i40e_hw *hw)
2704 {
2705 struct i40e_aq_get_phy_abilities_resp abilities;
2706 enum i40e_status_code status = I40E_SUCCESS;
2707
2708 status = i40e_aq_get_link_info(hw, TRUE, NULL, NULL);
2709 if (status)
2710 return status;
2711
2712 /* extra checking needed to ensure link info to user is timely */
2713 if ((hw->phy.link_info.link_info & I40E_AQ_MEDIA_AVAILABLE) &&
2714 ((hw->phy.link_info.link_info & I40E_AQ_LINK_UP) ||
2715 !(hw->phy.link_info_old.link_info & I40E_AQ_LINK_UP))) {
2716 status = i40e_aq_get_phy_capabilities(hw, FALSE, false,
2717 &abilities, NULL);
2718 if (status)
2719 return status;
2720
2721 i40e_memcpy(hw->phy.link_info.module_type, &abilities.module_type,
2722 sizeof(hw->phy.link_info.module_type), I40E_NONDMA_TO_NONDMA);
2723 }
2724 return status;
2725 }
2726
2727
2728 /**
2729 * i40e_get_link_speed
2730 * @hw: pointer to the hw struct
2731 *
2732 * Returns the link speed of the adapter.
2733 **/
i40e_get_link_speed(struct i40e_hw * hw)2734 enum i40e_aq_link_speed i40e_get_link_speed(struct i40e_hw *hw)
2735 {
2736 enum i40e_aq_link_speed speed = I40E_LINK_SPEED_UNKNOWN;
2737 enum i40e_status_code status = I40E_SUCCESS;
2738
2739 if (hw->phy.get_link_info) {
2740 status = i40e_aq_get_link_info(hw, TRUE, NULL, NULL);
2741
2742 if (status != I40E_SUCCESS)
2743 goto i40e_link_speed_exit;
2744 }
2745
2746 speed = hw->phy.link_info.link_speed;
2747
2748 i40e_link_speed_exit:
2749 return speed;
2750 }
2751
2752 /**
2753 * i40e_aq_add_veb - Insert a VEB between the VSI and the MAC
2754 * @hw: pointer to the hw struct
2755 * @uplink_seid: the MAC or other gizmo SEID
2756 * @downlink_seid: the VSI SEID
2757 * @enabled_tc: bitmap of TCs to be enabled
2758 * @default_port: TRUE for default port VSI, FALSE for control port
2759 * @veb_seid: pointer to where to put the resulting VEB SEID
2760 * @enable_stats: TRUE to turn on VEB stats
2761 * @cmd_details: pointer to command details structure or NULL
2762 *
2763 * This asks the FW to add a VEB between the uplink and downlink
2764 * elements. If the uplink SEID is 0, this will be a floating VEB.
2765 **/
i40e_aq_add_veb(struct i40e_hw * hw,u16 uplink_seid,u16 downlink_seid,u8 enabled_tc,bool default_port,u16 * veb_seid,bool enable_stats,struct i40e_asq_cmd_details * cmd_details)2766 enum i40e_status_code i40e_aq_add_veb(struct i40e_hw *hw, u16 uplink_seid,
2767 u16 downlink_seid, u8 enabled_tc,
2768 bool default_port, u16 *veb_seid,
2769 bool enable_stats,
2770 struct i40e_asq_cmd_details *cmd_details)
2771 {
2772 struct i40e_aq_desc desc;
2773 struct i40e_aqc_add_veb *cmd =
2774 (struct i40e_aqc_add_veb *)&desc.params.raw;
2775 struct i40e_aqc_add_veb_completion *resp =
2776 (struct i40e_aqc_add_veb_completion *)&desc.params.raw;
2777 enum i40e_status_code status;
2778 u16 veb_flags = 0;
2779
2780 /* SEIDs need to either both be set or both be 0 for floating VEB */
2781 if (!!uplink_seid != !!downlink_seid)
2782 return I40E_ERR_PARAM;
2783
2784 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_add_veb);
2785
2786 cmd->uplink_seid = CPU_TO_LE16(uplink_seid);
2787 cmd->downlink_seid = CPU_TO_LE16(downlink_seid);
2788 cmd->enable_tcs = enabled_tc;
2789 if (!uplink_seid)
2790 veb_flags |= I40E_AQC_ADD_VEB_FLOATING;
2791 if (default_port)
2792 veb_flags |= I40E_AQC_ADD_VEB_PORT_TYPE_DEFAULT;
2793 else
2794 veb_flags |= I40E_AQC_ADD_VEB_PORT_TYPE_DATA;
2795
2796 /* reverse logic here: set the bitflag to disable the stats */
2797 if (!enable_stats)
2798 veb_flags |= I40E_AQC_ADD_VEB_ENABLE_DISABLE_STATS;
2799
2800 cmd->veb_flags = CPU_TO_LE16(veb_flags);
2801
2802 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2803
2804 if (!status && veb_seid)
2805 *veb_seid = LE16_TO_CPU(resp->veb_seid);
2806
2807 return status;
2808 }
2809
2810 /**
2811 * i40e_aq_get_veb_parameters - Retrieve VEB parameters
2812 * @hw: pointer to the hw struct
2813 * @veb_seid: the SEID of the VEB to query
2814 * @switch_id: the uplink switch id
2815 * @floating: set to TRUE if the VEB is floating
2816 * @statistic_index: index of the stats counter block for this VEB
2817 * @vebs_used: number of VEB's used by function
2818 * @vebs_free: total VEB's not reserved by any function
2819 * @cmd_details: pointer to command details structure or NULL
2820 *
2821 * This retrieves the parameters for a particular VEB, specified by
2822 * uplink_seid, and returns them to the caller.
2823 **/
i40e_aq_get_veb_parameters(struct i40e_hw * hw,u16 veb_seid,u16 * switch_id,bool * floating,u16 * statistic_index,u16 * vebs_used,u16 * vebs_free,struct i40e_asq_cmd_details * cmd_details)2824 enum i40e_status_code i40e_aq_get_veb_parameters(struct i40e_hw *hw,
2825 u16 veb_seid, u16 *switch_id,
2826 bool *floating, u16 *statistic_index,
2827 u16 *vebs_used, u16 *vebs_free,
2828 struct i40e_asq_cmd_details *cmd_details)
2829 {
2830 struct i40e_aq_desc desc;
2831 struct i40e_aqc_get_veb_parameters_completion *cmd_resp =
2832 (struct i40e_aqc_get_veb_parameters_completion *)
2833 &desc.params.raw;
2834 enum i40e_status_code status;
2835
2836 if (veb_seid == 0)
2837 return I40E_ERR_PARAM;
2838
2839 i40e_fill_default_direct_cmd_desc(&desc,
2840 i40e_aqc_opc_get_veb_parameters);
2841 cmd_resp->seid = CPU_TO_LE16(veb_seid);
2842
2843 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
2844 if (status)
2845 goto get_veb_exit;
2846
2847 if (switch_id)
2848 *switch_id = LE16_TO_CPU(cmd_resp->switch_id);
2849 if (statistic_index)
2850 *statistic_index = LE16_TO_CPU(cmd_resp->statistic_index);
2851 if (vebs_used)
2852 *vebs_used = LE16_TO_CPU(cmd_resp->vebs_used);
2853 if (vebs_free)
2854 *vebs_free = LE16_TO_CPU(cmd_resp->vebs_free);
2855 if (floating) {
2856 u16 flags = LE16_TO_CPU(cmd_resp->veb_flags);
2857
2858 if (flags & I40E_AQC_ADD_VEB_FLOATING)
2859 *floating = TRUE;
2860 else
2861 *floating = FALSE;
2862 }
2863
2864 get_veb_exit:
2865 return status;
2866 }
2867
2868 /**
2869 * i40e_aq_add_macvlan
2870 * @hw: pointer to the hw struct
2871 * @seid: VSI for the mac address
2872 * @mv_list: list of macvlans to be added
2873 * @count: length of the list
2874 * @cmd_details: pointer to command details structure or NULL
2875 *
2876 * Add MAC/VLAN addresses to the HW filtering
2877 **/
i40e_aq_add_macvlan(struct i40e_hw * hw,u16 seid,struct i40e_aqc_add_macvlan_element_data * mv_list,u16 count,struct i40e_asq_cmd_details * cmd_details)2878 enum i40e_status_code i40e_aq_add_macvlan(struct i40e_hw *hw, u16 seid,
2879 struct i40e_aqc_add_macvlan_element_data *mv_list,
2880 u16 count, struct i40e_asq_cmd_details *cmd_details)
2881 {
2882 struct i40e_aq_desc desc;
2883 struct i40e_aqc_macvlan *cmd =
2884 (struct i40e_aqc_macvlan *)&desc.params.raw;
2885 enum i40e_status_code status;
2886 u16 buf_size;
2887 int i;
2888
2889 if (count == 0 || !mv_list || !hw)
2890 return I40E_ERR_PARAM;
2891
2892 buf_size = count * sizeof(*mv_list);
2893
2894 /* prep the rest of the request */
2895 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_add_macvlan);
2896 cmd->num_addresses = CPU_TO_LE16(count);
2897 cmd->seid[0] = CPU_TO_LE16(I40E_AQC_MACVLAN_CMD_SEID_VALID | seid);
2898 cmd->seid[1] = 0;
2899 cmd->seid[2] = 0;
2900
2901 for (i = 0; i < count; i++)
2902 if (I40E_IS_MULTICAST(mv_list[i].mac_addr))
2903 mv_list[i].flags |=
2904 CPU_TO_LE16(I40E_AQC_MACVLAN_ADD_USE_SHARED_MAC);
2905
2906 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
2907 if (buf_size > I40E_AQ_LARGE_BUF)
2908 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
2909
2910 status = i40e_asq_send_command(hw, &desc, mv_list, buf_size,
2911 cmd_details);
2912
2913 return status;
2914 }
2915
2916 /**
2917 * i40e_aq_remove_macvlan
2918 * @hw: pointer to the hw struct
2919 * @seid: VSI for the mac address
2920 * @mv_list: list of macvlans to be removed
2921 * @count: length of the list
2922 * @cmd_details: pointer to command details structure or NULL
2923 *
2924 * Remove MAC/VLAN addresses from the HW filtering
2925 **/
i40e_aq_remove_macvlan(struct i40e_hw * hw,u16 seid,struct i40e_aqc_remove_macvlan_element_data * mv_list,u16 count,struct i40e_asq_cmd_details * cmd_details)2926 enum i40e_status_code i40e_aq_remove_macvlan(struct i40e_hw *hw, u16 seid,
2927 struct i40e_aqc_remove_macvlan_element_data *mv_list,
2928 u16 count, struct i40e_asq_cmd_details *cmd_details)
2929 {
2930 struct i40e_aq_desc desc;
2931 struct i40e_aqc_macvlan *cmd =
2932 (struct i40e_aqc_macvlan *)&desc.params.raw;
2933 enum i40e_status_code status;
2934 u16 buf_size;
2935
2936 if (count == 0 || !mv_list || !hw)
2937 return I40E_ERR_PARAM;
2938
2939 buf_size = count * sizeof(*mv_list);
2940
2941 /* prep the rest of the request */
2942 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_remove_macvlan);
2943 cmd->num_addresses = CPU_TO_LE16(count);
2944 cmd->seid[0] = CPU_TO_LE16(I40E_AQC_MACVLAN_CMD_SEID_VALID | seid);
2945 cmd->seid[1] = 0;
2946 cmd->seid[2] = 0;
2947
2948 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
2949 if (buf_size > I40E_AQ_LARGE_BUF)
2950 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
2951
2952 status = i40e_asq_send_command(hw, &desc, mv_list, buf_size,
2953 cmd_details);
2954
2955 return status;
2956 }
2957
2958 /**
2959 * i40e_mirrorrule_op - Internal helper function to add/delete mirror rule
2960 * @hw: pointer to the hw struct
2961 * @opcode: AQ opcode for add or delete mirror rule
2962 * @sw_seid: Switch SEID (to which rule refers)
2963 * @rule_type: Rule Type (ingress/egress/VLAN)
2964 * @id: Destination VSI SEID or Rule ID
2965 * @count: length of the list
2966 * @mr_list: list of mirrored VSI SEIDs or VLAN IDs
2967 * @cmd_details: pointer to command details structure or NULL
2968 * @rule_id: Rule ID returned from FW
2969 * @rule_used: Number of rules used in internal switch
2970 * @rule_free: Number of rules free in internal switch
2971 *
2972 * Add/Delete a mirror rule to a specific switch. Mirror rules are supported for
2973 * VEBs/VEPA elements only
2974 **/
i40e_mirrorrule_op(struct i40e_hw * hw,u16 opcode,u16 sw_seid,u16 rule_type,u16 id,u16 count,__le16 * mr_list,struct i40e_asq_cmd_details * cmd_details,u16 * rule_id,u16 * rules_used,u16 * rules_free)2975 static enum i40e_status_code i40e_mirrorrule_op(struct i40e_hw *hw,
2976 u16 opcode, u16 sw_seid, u16 rule_type, u16 id,
2977 u16 count, __le16 *mr_list,
2978 struct i40e_asq_cmd_details *cmd_details,
2979 u16 *rule_id, u16 *rules_used, u16 *rules_free)
2980 {
2981 struct i40e_aq_desc desc;
2982 struct i40e_aqc_add_delete_mirror_rule *cmd =
2983 (struct i40e_aqc_add_delete_mirror_rule *)&desc.params.raw;
2984 struct i40e_aqc_add_delete_mirror_rule_completion *resp =
2985 (struct i40e_aqc_add_delete_mirror_rule_completion *)&desc.params.raw;
2986 enum i40e_status_code status;
2987 u16 buf_size;
2988
2989 buf_size = count * sizeof(*mr_list);
2990
2991 /* prep the rest of the request */
2992 i40e_fill_default_direct_cmd_desc(&desc, opcode);
2993 cmd->seid = CPU_TO_LE16(sw_seid);
2994 cmd->rule_type = CPU_TO_LE16(rule_type &
2995 I40E_AQC_MIRROR_RULE_TYPE_MASK);
2996 cmd->num_entries = CPU_TO_LE16(count);
2997 /* Dest VSI for add, rule_id for delete */
2998 cmd->destination = CPU_TO_LE16(id);
2999 if (mr_list) {
3000 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF |
3001 I40E_AQ_FLAG_RD));
3002 if (buf_size > I40E_AQ_LARGE_BUF)
3003 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
3004 }
3005
3006 status = i40e_asq_send_command(hw, &desc, mr_list, buf_size,
3007 cmd_details);
3008 if (status == I40E_SUCCESS ||
3009 hw->aq.asq_last_status == I40E_AQ_RC_ENOSPC) {
3010 if (rule_id)
3011 *rule_id = LE16_TO_CPU(resp->rule_id);
3012 if (rules_used)
3013 *rules_used = LE16_TO_CPU(resp->mirror_rules_used);
3014 if (rules_free)
3015 *rules_free = LE16_TO_CPU(resp->mirror_rules_free);
3016 }
3017 return status;
3018 }
3019
3020 /**
3021 * i40e_aq_add_mirrorrule - add a mirror rule
3022 * @hw: pointer to the hw struct
3023 * @sw_seid: Switch SEID (to which rule refers)
3024 * @rule_type: Rule Type (ingress/egress/VLAN)
3025 * @dest_vsi: SEID of VSI to which packets will be mirrored
3026 * @count: length of the list
3027 * @mr_list: list of mirrored VSI SEIDs or VLAN IDs
3028 * @cmd_details: pointer to command details structure or NULL
3029 * @rule_id: Rule ID returned from FW
3030 * @rule_used: Number of rules used in internal switch
3031 * @rule_free: Number of rules free in internal switch
3032 *
3033 * Add mirror rule. Mirror rules are supported for VEBs or VEPA elements only
3034 **/
i40e_aq_add_mirrorrule(struct i40e_hw * hw,u16 sw_seid,u16 rule_type,u16 dest_vsi,u16 count,__le16 * mr_list,struct i40e_asq_cmd_details * cmd_details,u16 * rule_id,u16 * rules_used,u16 * rules_free)3035 enum i40e_status_code i40e_aq_add_mirrorrule(struct i40e_hw *hw, u16 sw_seid,
3036 u16 rule_type, u16 dest_vsi, u16 count, __le16 *mr_list,
3037 struct i40e_asq_cmd_details *cmd_details,
3038 u16 *rule_id, u16 *rules_used, u16 *rules_free)
3039 {
3040 if (!(rule_type == I40E_AQC_MIRROR_RULE_TYPE_ALL_INGRESS ||
3041 rule_type == I40E_AQC_MIRROR_RULE_TYPE_ALL_EGRESS)) {
3042 if (count == 0 || !mr_list)
3043 return I40E_ERR_PARAM;
3044 }
3045
3046 return i40e_mirrorrule_op(hw, i40e_aqc_opc_add_mirror_rule, sw_seid,
3047 rule_type, dest_vsi, count, mr_list,
3048 cmd_details, rule_id, rules_used, rules_free);
3049 }
3050
3051 /**
3052 * i40e_aq_delete_mirrorrule - delete a mirror rule
3053 * @hw: pointer to the hw struct
3054 * @sw_seid: Switch SEID (to which rule refers)
3055 * @rule_type: Rule Type (ingress/egress/VLAN)
3056 * @count: length of the list
3057 * @rule_id: Rule ID that is returned in the receive desc as part of
3058 * add_mirrorrule.
3059 * @mr_list: list of mirrored VLAN IDs to be removed
3060 * @cmd_details: pointer to command details structure or NULL
3061 * @rule_used: Number of rules used in internal switch
3062 * @rule_free: Number of rules free in internal switch
3063 *
3064 * Delete a mirror rule. Mirror rules are supported for VEBs/VEPA elements only
3065 **/
i40e_aq_delete_mirrorrule(struct i40e_hw * hw,u16 sw_seid,u16 rule_type,u16 rule_id,u16 count,__le16 * mr_list,struct i40e_asq_cmd_details * cmd_details,u16 * rules_used,u16 * rules_free)3066 enum i40e_status_code i40e_aq_delete_mirrorrule(struct i40e_hw *hw, u16 sw_seid,
3067 u16 rule_type, u16 rule_id, u16 count, __le16 *mr_list,
3068 struct i40e_asq_cmd_details *cmd_details,
3069 u16 *rules_used, u16 *rules_free)
3070 {
3071 /* Rule ID has to be valid except rule_type: INGRESS VLAN mirroring */
3072 if (rule_type == I40E_AQC_MIRROR_RULE_TYPE_VLAN) {
3073 /* count and mr_list shall be valid for rule_type INGRESS VLAN
3074 * mirroring. For other rule_type, count and rule_type should
3075 * not matter.
3076 */
3077 if (count == 0 || !mr_list)
3078 return I40E_ERR_PARAM;
3079 }
3080
3081 return i40e_mirrorrule_op(hw, i40e_aqc_opc_delete_mirror_rule, sw_seid,
3082 rule_type, rule_id, count, mr_list,
3083 cmd_details, NULL, rules_used, rules_free);
3084 }
3085
3086 /**
3087 * i40e_aq_add_vlan - Add VLAN ids to the HW filtering
3088 * @hw: pointer to the hw struct
3089 * @seid: VSI for the vlan filters
3090 * @v_list: list of vlan filters to be added
3091 * @count: length of the list
3092 * @cmd_details: pointer to command details structure or NULL
3093 **/
i40e_aq_add_vlan(struct i40e_hw * hw,u16 seid,struct i40e_aqc_add_remove_vlan_element_data * v_list,u8 count,struct i40e_asq_cmd_details * cmd_details)3094 enum i40e_status_code i40e_aq_add_vlan(struct i40e_hw *hw, u16 seid,
3095 struct i40e_aqc_add_remove_vlan_element_data *v_list,
3096 u8 count, struct i40e_asq_cmd_details *cmd_details)
3097 {
3098 struct i40e_aq_desc desc;
3099 struct i40e_aqc_macvlan *cmd =
3100 (struct i40e_aqc_macvlan *)&desc.params.raw;
3101 enum i40e_status_code status;
3102 u16 buf_size;
3103
3104 if (count == 0 || !v_list || !hw)
3105 return I40E_ERR_PARAM;
3106
3107 buf_size = count * sizeof(*v_list);
3108
3109 /* prep the rest of the request */
3110 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_add_vlan);
3111 cmd->num_addresses = CPU_TO_LE16(count);
3112 cmd->seid[0] = CPU_TO_LE16(seid | I40E_AQC_MACVLAN_CMD_SEID_VALID);
3113 cmd->seid[1] = 0;
3114 cmd->seid[2] = 0;
3115
3116 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
3117 if (buf_size > I40E_AQ_LARGE_BUF)
3118 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
3119
3120 status = i40e_asq_send_command(hw, &desc, v_list, buf_size,
3121 cmd_details);
3122
3123 return status;
3124 }
3125
3126 /**
3127 * i40e_aq_remove_vlan - Remove VLANs from the HW filtering
3128 * @hw: pointer to the hw struct
3129 * @seid: VSI for the vlan filters
3130 * @v_list: list of macvlans to be removed
3131 * @count: length of the list
3132 * @cmd_details: pointer to command details structure or NULL
3133 **/
i40e_aq_remove_vlan(struct i40e_hw * hw,u16 seid,struct i40e_aqc_add_remove_vlan_element_data * v_list,u8 count,struct i40e_asq_cmd_details * cmd_details)3134 enum i40e_status_code i40e_aq_remove_vlan(struct i40e_hw *hw, u16 seid,
3135 struct i40e_aqc_add_remove_vlan_element_data *v_list,
3136 u8 count, struct i40e_asq_cmd_details *cmd_details)
3137 {
3138 struct i40e_aq_desc desc;
3139 struct i40e_aqc_macvlan *cmd =
3140 (struct i40e_aqc_macvlan *)&desc.params.raw;
3141 enum i40e_status_code status;
3142 u16 buf_size;
3143
3144 if (count == 0 || !v_list || !hw)
3145 return I40E_ERR_PARAM;
3146
3147 buf_size = count * sizeof(*v_list);
3148
3149 /* prep the rest of the request */
3150 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_remove_vlan);
3151 cmd->num_addresses = CPU_TO_LE16(count);
3152 cmd->seid[0] = CPU_TO_LE16(seid | I40E_AQC_MACVLAN_CMD_SEID_VALID);
3153 cmd->seid[1] = 0;
3154 cmd->seid[2] = 0;
3155
3156 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
3157 if (buf_size > I40E_AQ_LARGE_BUF)
3158 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
3159
3160 status = i40e_asq_send_command(hw, &desc, v_list, buf_size,
3161 cmd_details);
3162
3163 return status;
3164 }
3165
3166 /**
3167 * i40e_aq_send_msg_to_vf
3168 * @hw: pointer to the hardware structure
3169 * @vfid: vf id to send msg
3170 * @v_opcode: opcodes for VF-PF communication
3171 * @v_retval: return error code
3172 * @msg: pointer to the msg buffer
3173 * @msglen: msg length
3174 * @cmd_details: pointer to command details
3175 *
3176 * send msg to vf
3177 **/
i40e_aq_send_msg_to_vf(struct i40e_hw * hw,u16 vfid,u32 v_opcode,u32 v_retval,u8 * msg,u16 msglen,struct i40e_asq_cmd_details * cmd_details)3178 enum i40e_status_code i40e_aq_send_msg_to_vf(struct i40e_hw *hw, u16 vfid,
3179 u32 v_opcode, u32 v_retval, u8 *msg, u16 msglen,
3180 struct i40e_asq_cmd_details *cmd_details)
3181 {
3182 struct i40e_aq_desc desc;
3183 struct i40e_aqc_pf_vf_message *cmd =
3184 (struct i40e_aqc_pf_vf_message *)&desc.params.raw;
3185 enum i40e_status_code status;
3186
3187 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_send_msg_to_vf);
3188 cmd->id = CPU_TO_LE32(vfid);
3189 desc.cookie_high = CPU_TO_LE32(v_opcode);
3190 desc.cookie_low = CPU_TO_LE32(v_retval);
3191 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_SI);
3192 if (msglen) {
3193 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF |
3194 I40E_AQ_FLAG_RD));
3195 if (msglen > I40E_AQ_LARGE_BUF)
3196 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
3197 desc.datalen = CPU_TO_LE16(msglen);
3198 }
3199 status = i40e_asq_send_command(hw, &desc, msg, msglen, cmd_details);
3200
3201 return status;
3202 }
3203
3204 /**
3205 * i40e_aq_debug_read_register
3206 * @hw: pointer to the hw struct
3207 * @reg_addr: register address
3208 * @reg_val: register value
3209 * @cmd_details: pointer to command details structure or NULL
3210 *
3211 * Read the register using the admin queue commands
3212 **/
i40e_aq_debug_read_register(struct i40e_hw * hw,u32 reg_addr,u64 * reg_val,struct i40e_asq_cmd_details * cmd_details)3213 enum i40e_status_code i40e_aq_debug_read_register(struct i40e_hw *hw,
3214 u32 reg_addr, u64 *reg_val,
3215 struct i40e_asq_cmd_details *cmd_details)
3216 {
3217 struct i40e_aq_desc desc;
3218 struct i40e_aqc_debug_reg_read_write *cmd_resp =
3219 (struct i40e_aqc_debug_reg_read_write *)&desc.params.raw;
3220 enum i40e_status_code status;
3221
3222 if (reg_val == NULL)
3223 return I40E_ERR_PARAM;
3224
3225 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_debug_read_reg);
3226
3227 cmd_resp->address = CPU_TO_LE32(reg_addr);
3228
3229 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
3230
3231 if (status == I40E_SUCCESS) {
3232 *reg_val = ((u64)LE32_TO_CPU(cmd_resp->value_high) << 32) |
3233 (u64)LE32_TO_CPU(cmd_resp->value_low);
3234 }
3235
3236 return status;
3237 }
3238
3239 /**
3240 * i40e_aq_debug_write_register
3241 * @hw: pointer to the hw struct
3242 * @reg_addr: register address
3243 * @reg_val: register value
3244 * @cmd_details: pointer to command details structure or NULL
3245 *
3246 * Write to a register using the admin queue commands
3247 **/
i40e_aq_debug_write_register(struct i40e_hw * hw,u32 reg_addr,u64 reg_val,struct i40e_asq_cmd_details * cmd_details)3248 enum i40e_status_code i40e_aq_debug_write_register(struct i40e_hw *hw,
3249 u32 reg_addr, u64 reg_val,
3250 struct i40e_asq_cmd_details *cmd_details)
3251 {
3252 struct i40e_aq_desc desc;
3253 struct i40e_aqc_debug_reg_read_write *cmd =
3254 (struct i40e_aqc_debug_reg_read_write *)&desc.params.raw;
3255 enum i40e_status_code status;
3256
3257 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_debug_write_reg);
3258
3259 cmd->address = CPU_TO_LE32(reg_addr);
3260 cmd->value_high = CPU_TO_LE32((u32)(reg_val >> 32));
3261 cmd->value_low = CPU_TO_LE32((u32)(reg_val & 0xFFFFFFFF));
3262
3263 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
3264
3265 return status;
3266 }
3267
3268 /**
3269 * i40e_aq_request_resource
3270 * @hw: pointer to the hw struct
3271 * @resource: resource id
3272 * @access: access type
3273 * @sdp_number: resource number
3274 * @timeout: the maximum time in ms that the driver may hold the resource
3275 * @cmd_details: pointer to command details structure or NULL
3276 *
3277 * requests common resource using the admin queue commands
3278 **/
i40e_aq_request_resource(struct i40e_hw * hw,enum i40e_aq_resources_ids resource,enum i40e_aq_resource_access_type access,u8 sdp_number,u64 * timeout,struct i40e_asq_cmd_details * cmd_details)3279 enum i40e_status_code i40e_aq_request_resource(struct i40e_hw *hw,
3280 enum i40e_aq_resources_ids resource,
3281 enum i40e_aq_resource_access_type access,
3282 u8 sdp_number, u64 *timeout,
3283 struct i40e_asq_cmd_details *cmd_details)
3284 {
3285 struct i40e_aq_desc desc;
3286 struct i40e_aqc_request_resource *cmd_resp =
3287 (struct i40e_aqc_request_resource *)&desc.params.raw;
3288 enum i40e_status_code status;
3289
3290 DEBUGFUNC("i40e_aq_request_resource");
3291
3292 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_request_resource);
3293
3294 cmd_resp->resource_id = CPU_TO_LE16(resource);
3295 cmd_resp->access_type = CPU_TO_LE16(access);
3296 cmd_resp->resource_number = CPU_TO_LE32(sdp_number);
3297
3298 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
3299 /* The completion specifies the maximum time in ms that the driver
3300 * may hold the resource in the Timeout field.
3301 * If the resource is held by someone else, the command completes with
3302 * busy return value and the timeout field indicates the maximum time
3303 * the current owner of the resource has to free it.
3304 */
3305 if (status == I40E_SUCCESS || hw->aq.asq_last_status == I40E_AQ_RC_EBUSY)
3306 *timeout = LE32_TO_CPU(cmd_resp->timeout);
3307
3308 return status;
3309 }
3310
3311 /**
3312 * i40e_aq_release_resource
3313 * @hw: pointer to the hw struct
3314 * @resource: resource id
3315 * @sdp_number: resource number
3316 * @cmd_details: pointer to command details structure or NULL
3317 *
3318 * release common resource using the admin queue commands
3319 **/
i40e_aq_release_resource(struct i40e_hw * hw,enum i40e_aq_resources_ids resource,u8 sdp_number,struct i40e_asq_cmd_details * cmd_details)3320 enum i40e_status_code i40e_aq_release_resource(struct i40e_hw *hw,
3321 enum i40e_aq_resources_ids resource,
3322 u8 sdp_number,
3323 struct i40e_asq_cmd_details *cmd_details)
3324 {
3325 struct i40e_aq_desc desc;
3326 struct i40e_aqc_request_resource *cmd =
3327 (struct i40e_aqc_request_resource *)&desc.params.raw;
3328 enum i40e_status_code status;
3329
3330 DEBUGFUNC("i40e_aq_release_resource");
3331
3332 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_release_resource);
3333
3334 cmd->resource_id = CPU_TO_LE16(resource);
3335 cmd->resource_number = CPU_TO_LE32(sdp_number);
3336
3337 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
3338
3339 return status;
3340 }
3341
3342 /**
3343 * i40e_aq_read_nvm
3344 * @hw: pointer to the hw struct
3345 * @module_pointer: module pointer location in words from the NVM beginning
3346 * @offset: byte offset from the module beginning
3347 * @length: length of the section to be read (in bytes from the offset)
3348 * @data: command buffer (size [bytes] = length)
3349 * @last_command: tells if this is the last command in a series
3350 * @cmd_details: pointer to command details structure or NULL
3351 *
3352 * Read the NVM using the admin queue commands
3353 **/
i40e_aq_read_nvm(struct i40e_hw * hw,u8 module_pointer,u32 offset,u16 length,void * data,bool last_command,struct i40e_asq_cmd_details * cmd_details)3354 enum i40e_status_code i40e_aq_read_nvm(struct i40e_hw *hw, u8 module_pointer,
3355 u32 offset, u16 length, void *data,
3356 bool last_command,
3357 struct i40e_asq_cmd_details *cmd_details)
3358 {
3359 struct i40e_aq_desc desc;
3360 struct i40e_aqc_nvm_update *cmd =
3361 (struct i40e_aqc_nvm_update *)&desc.params.raw;
3362 enum i40e_status_code status;
3363
3364 DEBUGFUNC("i40e_aq_read_nvm");
3365
3366 /* In offset the highest byte must be zeroed. */
3367 if (offset & 0xFF000000) {
3368 status = I40E_ERR_PARAM;
3369 goto i40e_aq_read_nvm_exit;
3370 }
3371
3372 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_nvm_read);
3373
3374 /* If this is the last command in a series, set the proper flag. */
3375 if (last_command)
3376 cmd->command_flags |= I40E_AQ_NVM_LAST_CMD;
3377 cmd->module_pointer = module_pointer;
3378 cmd->offset = CPU_TO_LE32(offset);
3379 cmd->length = CPU_TO_LE16(length);
3380
3381 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
3382 if (length > I40E_AQ_LARGE_BUF)
3383 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
3384
3385 status = i40e_asq_send_command(hw, &desc, data, length, cmd_details);
3386
3387 i40e_aq_read_nvm_exit:
3388 return status;
3389 }
3390
3391 /**
3392 * i40e_aq_read_nvm_config - read an nvm config block
3393 * @hw: pointer to the hw struct
3394 * @cmd_flags: NVM access admin command bits
3395 * @field_id: field or feature id
3396 * @data: buffer for result
3397 * @buf_size: buffer size
3398 * @element_count: pointer to count of elements read by FW
3399 * @cmd_details: pointer to command details structure or NULL
3400 **/
i40e_aq_read_nvm_config(struct i40e_hw * hw,u8 cmd_flags,u32 field_id,void * data,u16 buf_size,u16 * element_count,struct i40e_asq_cmd_details * cmd_details)3401 enum i40e_status_code i40e_aq_read_nvm_config(struct i40e_hw *hw,
3402 u8 cmd_flags, u32 field_id, void *data,
3403 u16 buf_size, u16 *element_count,
3404 struct i40e_asq_cmd_details *cmd_details)
3405 {
3406 struct i40e_aq_desc desc;
3407 struct i40e_aqc_nvm_config_read *cmd =
3408 (struct i40e_aqc_nvm_config_read *)&desc.params.raw;
3409 enum i40e_status_code status;
3410
3411 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_nvm_config_read);
3412 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF));
3413 if (buf_size > I40E_AQ_LARGE_BUF)
3414 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
3415
3416 cmd->cmd_flags = CPU_TO_LE16(cmd_flags);
3417 cmd->element_id = CPU_TO_LE16((u16)(0xffff & field_id));
3418 if (cmd_flags & I40E_AQ_ANVM_FEATURE_OR_IMMEDIATE_MASK)
3419 cmd->element_id_msw = CPU_TO_LE16((u16)(field_id >> 16));
3420 else
3421 cmd->element_id_msw = 0;
3422
3423 status = i40e_asq_send_command(hw, &desc, data, buf_size, cmd_details);
3424
3425 if (!status && element_count)
3426 *element_count = LE16_TO_CPU(cmd->element_count);
3427
3428 return status;
3429 }
3430
3431 /**
3432 * i40e_aq_write_nvm_config - write an nvm config block
3433 * @hw: pointer to the hw struct
3434 * @cmd_flags: NVM access admin command bits
3435 * @data: buffer for result
3436 * @buf_size: buffer size
3437 * @element_count: count of elements to be written
3438 * @cmd_details: pointer to command details structure or NULL
3439 **/
i40e_aq_write_nvm_config(struct i40e_hw * hw,u8 cmd_flags,void * data,u16 buf_size,u16 element_count,struct i40e_asq_cmd_details * cmd_details)3440 enum i40e_status_code i40e_aq_write_nvm_config(struct i40e_hw *hw,
3441 u8 cmd_flags, void *data, u16 buf_size,
3442 u16 element_count,
3443 struct i40e_asq_cmd_details *cmd_details)
3444 {
3445 struct i40e_aq_desc desc;
3446 struct i40e_aqc_nvm_config_write *cmd =
3447 (struct i40e_aqc_nvm_config_write *)&desc.params.raw;
3448 enum i40e_status_code status;
3449
3450 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_nvm_config_write);
3451 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
3452 if (buf_size > I40E_AQ_LARGE_BUF)
3453 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
3454
3455 cmd->element_count = CPU_TO_LE16(element_count);
3456 cmd->cmd_flags = CPU_TO_LE16(cmd_flags);
3457 status = i40e_asq_send_command(hw, &desc, data, buf_size, cmd_details);
3458
3459 return status;
3460 }
3461
3462 /**
3463 * i40e_aq_oem_post_update - triggers an OEM specific flow after update
3464 * @hw: pointer to the hw struct
3465 * @cmd_details: pointer to command details structure or NULL
3466 **/
i40e_aq_oem_post_update(struct i40e_hw * hw,void * buff,u16 buff_size,struct i40e_asq_cmd_details * cmd_details)3467 enum i40e_status_code i40e_aq_oem_post_update(struct i40e_hw *hw,
3468 void *buff, u16 buff_size,
3469 struct i40e_asq_cmd_details *cmd_details)
3470 {
3471 struct i40e_aq_desc desc;
3472 enum i40e_status_code status;
3473
3474
3475 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_oem_post_update);
3476 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
3477 if (status && LE16_TO_CPU(desc.retval) == I40E_AQ_RC_ESRCH)
3478 status = I40E_ERR_NOT_IMPLEMENTED;
3479
3480 return status;
3481 }
3482
3483 /**
3484 * i40e_aq_erase_nvm
3485 * @hw: pointer to the hw struct
3486 * @module_pointer: module pointer location in words from the NVM beginning
3487 * @offset: offset in the module (expressed in 4 KB from module's beginning)
3488 * @length: length of the section to be erased (expressed in 4 KB)
3489 * @last_command: tells if this is the last command in a series
3490 * @cmd_details: pointer to command details structure or NULL
3491 *
3492 * Erase the NVM sector using the admin queue commands
3493 **/
i40e_aq_erase_nvm(struct i40e_hw * hw,u8 module_pointer,u32 offset,u16 length,bool last_command,struct i40e_asq_cmd_details * cmd_details)3494 enum i40e_status_code i40e_aq_erase_nvm(struct i40e_hw *hw, u8 module_pointer,
3495 u32 offset, u16 length, bool last_command,
3496 struct i40e_asq_cmd_details *cmd_details)
3497 {
3498 struct i40e_aq_desc desc;
3499 struct i40e_aqc_nvm_update *cmd =
3500 (struct i40e_aqc_nvm_update *)&desc.params.raw;
3501 enum i40e_status_code status;
3502
3503 DEBUGFUNC("i40e_aq_erase_nvm");
3504
3505 /* In offset the highest byte must be zeroed. */
3506 if (offset & 0xFF000000) {
3507 status = I40E_ERR_PARAM;
3508 goto i40e_aq_erase_nvm_exit;
3509 }
3510
3511 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_nvm_erase);
3512
3513 /* If this is the last command in a series, set the proper flag. */
3514 if (last_command)
3515 cmd->command_flags |= I40E_AQ_NVM_LAST_CMD;
3516 cmd->module_pointer = module_pointer;
3517 cmd->offset = CPU_TO_LE32(offset);
3518 cmd->length = CPU_TO_LE16(length);
3519
3520 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
3521
3522 i40e_aq_erase_nvm_exit:
3523 return status;
3524 }
3525
3526 /**
3527 * i40e_parse_discover_capabilities
3528 * @hw: pointer to the hw struct
3529 * @buff: pointer to a buffer containing device/function capability records
3530 * @cap_count: number of capability records in the list
3531 * @list_type_opc: type of capabilities list to parse
3532 *
3533 * Parse the device/function capabilities list.
3534 **/
i40e_parse_discover_capabilities(struct i40e_hw * hw,void * buff,u32 cap_count,enum i40e_admin_queue_opc list_type_opc)3535 static void i40e_parse_discover_capabilities(struct i40e_hw *hw, void *buff,
3536 u32 cap_count,
3537 enum i40e_admin_queue_opc list_type_opc)
3538 {
3539 struct i40e_aqc_list_capabilities_element_resp *cap;
3540 u32 valid_functions, num_functions;
3541 u32 number, logical_id, phys_id;
3542 struct i40e_hw_capabilities *p;
3543 u8 major_rev;
3544 u32 i = 0;
3545 u16 id;
3546
3547 cap = (struct i40e_aqc_list_capabilities_element_resp *) buff;
3548
3549 if (list_type_opc == i40e_aqc_opc_list_dev_capabilities)
3550 p = (struct i40e_hw_capabilities *)&hw->dev_caps;
3551 else if (list_type_opc == i40e_aqc_opc_list_func_capabilities)
3552 p = (struct i40e_hw_capabilities *)&hw->func_caps;
3553 else
3554 return;
3555
3556 for (i = 0; i < cap_count; i++, cap++) {
3557 id = LE16_TO_CPU(cap->id);
3558 number = LE32_TO_CPU(cap->number);
3559 logical_id = LE32_TO_CPU(cap->logical_id);
3560 phys_id = LE32_TO_CPU(cap->phys_id);
3561 major_rev = cap->major_rev;
3562
3563 switch (id) {
3564 case I40E_AQ_CAP_ID_SWITCH_MODE:
3565 p->switch_mode = number;
3566 i40e_debug(hw, I40E_DEBUG_INIT,
3567 "HW Capability: Switch mode = %d\n",
3568 p->switch_mode);
3569 break;
3570 case I40E_AQ_CAP_ID_MNG_MODE:
3571 p->management_mode = number;
3572 if (major_rev > 1) {
3573 p->mng_protocols_over_mctp = logical_id;
3574 i40e_debug(hw, I40E_DEBUG_INIT,
3575 "HW Capability: Protocols over MCTP = %d\n",
3576 p->mng_protocols_over_mctp);
3577 } else {
3578 p->mng_protocols_over_mctp = 0;
3579 }
3580 i40e_debug(hw, I40E_DEBUG_INIT,
3581 "HW Capability: Management Mode = %d\n",
3582 p->management_mode);
3583 break;
3584 case I40E_AQ_CAP_ID_NPAR_ACTIVE:
3585 p->npar_enable = number;
3586 i40e_debug(hw, I40E_DEBUG_INIT,
3587 "HW Capability: NPAR enable = %d\n",
3588 p->npar_enable);
3589 break;
3590 case I40E_AQ_CAP_ID_OS2BMC_CAP:
3591 p->os2bmc = number;
3592 i40e_debug(hw, I40E_DEBUG_INIT,
3593 "HW Capability: OS2BMC = %d\n", p->os2bmc);
3594 break;
3595 case I40E_AQ_CAP_ID_FUNCTIONS_VALID:
3596 p->valid_functions = number;
3597 i40e_debug(hw, I40E_DEBUG_INIT,
3598 "HW Capability: Valid Functions = %d\n",
3599 p->valid_functions);
3600 break;
3601 case I40E_AQ_CAP_ID_SRIOV:
3602 if (number == 1)
3603 p->sr_iov_1_1 = TRUE;
3604 i40e_debug(hw, I40E_DEBUG_INIT,
3605 "HW Capability: SR-IOV = %d\n",
3606 p->sr_iov_1_1);
3607 break;
3608 case I40E_AQ_CAP_ID_VF:
3609 p->num_vfs = number;
3610 p->vf_base_id = logical_id;
3611 i40e_debug(hw, I40E_DEBUG_INIT,
3612 "HW Capability: VF count = %d\n",
3613 p->num_vfs);
3614 i40e_debug(hw, I40E_DEBUG_INIT,
3615 "HW Capability: VF base_id = %d\n",
3616 p->vf_base_id);
3617 break;
3618 case I40E_AQ_CAP_ID_VMDQ:
3619 if (number == 1)
3620 p->vmdq = TRUE;
3621 i40e_debug(hw, I40E_DEBUG_INIT,
3622 "HW Capability: VMDQ = %d\n", p->vmdq);
3623 break;
3624 case I40E_AQ_CAP_ID_8021QBG:
3625 if (number == 1)
3626 p->evb_802_1_qbg = TRUE;
3627 i40e_debug(hw, I40E_DEBUG_INIT,
3628 "HW Capability: 802.1Qbg = %d\n", number);
3629 break;
3630 case I40E_AQ_CAP_ID_8021QBR:
3631 if (number == 1)
3632 p->evb_802_1_qbh = TRUE;
3633 i40e_debug(hw, I40E_DEBUG_INIT,
3634 "HW Capability: 802.1Qbh = %d\n", number);
3635 break;
3636 case I40E_AQ_CAP_ID_VSI:
3637 p->num_vsis = number;
3638 i40e_debug(hw, I40E_DEBUG_INIT,
3639 "HW Capability: VSI count = %d\n",
3640 p->num_vsis);
3641 break;
3642 case I40E_AQ_CAP_ID_DCB:
3643 if (number == 1) {
3644 p->dcb = TRUE;
3645 p->enabled_tcmap = logical_id;
3646 p->maxtc = phys_id;
3647 }
3648 i40e_debug(hw, I40E_DEBUG_INIT,
3649 "HW Capability: DCB = %d\n", p->dcb);
3650 i40e_debug(hw, I40E_DEBUG_INIT,
3651 "HW Capability: TC Mapping = %d\n",
3652 logical_id);
3653 i40e_debug(hw, I40E_DEBUG_INIT,
3654 "HW Capability: TC Max = %d\n", p->maxtc);
3655 break;
3656 case I40E_AQ_CAP_ID_FCOE:
3657 if (number == 1)
3658 p->fcoe = TRUE;
3659 i40e_debug(hw, I40E_DEBUG_INIT,
3660 "HW Capability: FCOE = %d\n", p->fcoe);
3661 break;
3662 case I40E_AQ_CAP_ID_ISCSI:
3663 if (number == 1)
3664 p->iscsi = TRUE;
3665 i40e_debug(hw, I40E_DEBUG_INIT,
3666 "HW Capability: iSCSI = %d\n", p->iscsi);
3667 break;
3668 case I40E_AQ_CAP_ID_RSS:
3669 p->rss = TRUE;
3670 p->rss_table_size = number;
3671 p->rss_table_entry_width = logical_id;
3672 i40e_debug(hw, I40E_DEBUG_INIT,
3673 "HW Capability: RSS = %d\n", p->rss);
3674 i40e_debug(hw, I40E_DEBUG_INIT,
3675 "HW Capability: RSS table size = %d\n",
3676 p->rss_table_size);
3677 i40e_debug(hw, I40E_DEBUG_INIT,
3678 "HW Capability: RSS table width = %d\n",
3679 p->rss_table_entry_width);
3680 break;
3681 case I40E_AQ_CAP_ID_RXQ:
3682 p->num_rx_qp = number;
3683 p->base_queue = phys_id;
3684 i40e_debug(hw, I40E_DEBUG_INIT,
3685 "HW Capability: Rx QP = %d\n", number);
3686 i40e_debug(hw, I40E_DEBUG_INIT,
3687 "HW Capability: base_queue = %d\n",
3688 p->base_queue);
3689 break;
3690 case I40E_AQ_CAP_ID_TXQ:
3691 p->num_tx_qp = number;
3692 p->base_queue = phys_id;
3693 i40e_debug(hw, I40E_DEBUG_INIT,
3694 "HW Capability: Tx QP = %d\n", number);
3695 i40e_debug(hw, I40E_DEBUG_INIT,
3696 "HW Capability: base_queue = %d\n",
3697 p->base_queue);
3698 break;
3699 case I40E_AQ_CAP_ID_MSIX:
3700 p->num_msix_vectors = number;
3701 i40e_debug(hw, I40E_DEBUG_INIT,
3702 "HW Capability: MSIX vector count = %d\n",
3703 p->num_msix_vectors);
3704 break;
3705 case I40E_AQ_CAP_ID_VF_MSIX:
3706 p->num_msix_vectors_vf = number;
3707 i40e_debug(hw, I40E_DEBUG_INIT,
3708 "HW Capability: MSIX VF vector count = %d\n",
3709 p->num_msix_vectors_vf);
3710 break;
3711 case I40E_AQ_CAP_ID_FLEX10:
3712 if (major_rev == 1) {
3713 if (number == 1) {
3714 p->flex10_enable = TRUE;
3715 p->flex10_capable = TRUE;
3716 }
3717 } else {
3718 /* Capability revision >= 2 */
3719 if (number & 1)
3720 p->flex10_enable = TRUE;
3721 if (number & 2)
3722 p->flex10_capable = TRUE;
3723 }
3724 p->flex10_mode = logical_id;
3725 p->flex10_status = phys_id;
3726 i40e_debug(hw, I40E_DEBUG_INIT,
3727 "HW Capability: Flex10 mode = %d\n",
3728 p->flex10_mode);
3729 i40e_debug(hw, I40E_DEBUG_INIT,
3730 "HW Capability: Flex10 status = %d\n",
3731 p->flex10_status);
3732 break;
3733 case I40E_AQ_CAP_ID_CEM:
3734 if (number == 1)
3735 p->mgmt_cem = TRUE;
3736 i40e_debug(hw, I40E_DEBUG_INIT,
3737 "HW Capability: CEM = %d\n", p->mgmt_cem);
3738 break;
3739 case I40E_AQ_CAP_ID_IWARP:
3740 if (number == 1)
3741 p->iwarp = TRUE;
3742 i40e_debug(hw, I40E_DEBUG_INIT,
3743 "HW Capability: iWARP = %d\n", p->iwarp);
3744 break;
3745 case I40E_AQ_CAP_ID_LED:
3746 if (phys_id < I40E_HW_CAP_MAX_GPIO)
3747 p->led[phys_id] = TRUE;
3748 i40e_debug(hw, I40E_DEBUG_INIT,
3749 "HW Capability: LED - PIN %d\n", phys_id);
3750 break;
3751 case I40E_AQ_CAP_ID_SDP:
3752 if (phys_id < I40E_HW_CAP_MAX_GPIO)
3753 p->sdp[phys_id] = TRUE;
3754 i40e_debug(hw, I40E_DEBUG_INIT,
3755 "HW Capability: SDP - PIN %d\n", phys_id);
3756 break;
3757 case I40E_AQ_CAP_ID_MDIO:
3758 if (number == 1) {
3759 p->mdio_port_num = phys_id;
3760 p->mdio_port_mode = logical_id;
3761 }
3762 i40e_debug(hw, I40E_DEBUG_INIT,
3763 "HW Capability: MDIO port number = %d\n",
3764 p->mdio_port_num);
3765 i40e_debug(hw, I40E_DEBUG_INIT,
3766 "HW Capability: MDIO port mode = %d\n",
3767 p->mdio_port_mode);
3768 break;
3769 case I40E_AQ_CAP_ID_1588:
3770 if (number == 1)
3771 p->ieee_1588 = TRUE;
3772 i40e_debug(hw, I40E_DEBUG_INIT,
3773 "HW Capability: IEEE 1588 = %d\n",
3774 p->ieee_1588);
3775 break;
3776 case I40E_AQ_CAP_ID_FLOW_DIRECTOR:
3777 p->fd = TRUE;
3778 p->fd_filters_guaranteed = number;
3779 p->fd_filters_best_effort = logical_id;
3780 i40e_debug(hw, I40E_DEBUG_INIT,
3781 "HW Capability: Flow Director = 1\n");
3782 i40e_debug(hw, I40E_DEBUG_INIT,
3783 "HW Capability: Guaranteed FD filters = %d\n",
3784 p->fd_filters_guaranteed);
3785 break;
3786 case I40E_AQ_CAP_ID_WSR_PROT:
3787 p->wr_csr_prot = (u64)number;
3788 p->wr_csr_prot |= (u64)logical_id << 32;
3789 i40e_debug(hw, I40E_DEBUG_INIT,
3790 "HW Capability: wr_csr_prot = 0x%llX\n\n",
3791 (p->wr_csr_prot & 0xffff));
3792 break;
3793 case I40E_AQ_CAP_ID_NVM_MGMT:
3794 if (number & I40E_NVM_MGMT_SEC_REV_DISABLED)
3795 p->sec_rev_disabled = TRUE;
3796 if (number & I40E_NVM_MGMT_UPDATE_DISABLED)
3797 p->update_disabled = TRUE;
3798 break;
3799 case I40E_AQ_CAP_ID_WOL_AND_PROXY:
3800 hw->num_wol_proxy_filters = (u16)number;
3801 hw->wol_proxy_vsi_seid = (u16)logical_id;
3802 p->apm_wol_support = phys_id & I40E_WOL_SUPPORT_MASK;
3803 if (phys_id & I40E_ACPI_PROGRAMMING_METHOD_MASK)
3804 p->acpi_prog_method = I40E_ACPI_PROGRAMMING_METHOD_AQC_FPK;
3805 else
3806 p->acpi_prog_method = I40E_ACPI_PROGRAMMING_METHOD_HW_FVL;
3807 p->proxy_support = (phys_id & I40E_PROXY_SUPPORT_MASK) ? 1 : 0;
3808 i40e_debug(hw, I40E_DEBUG_INIT,
3809 "HW Capability: WOL proxy filters = %d\n",
3810 hw->num_wol_proxy_filters);
3811 break;
3812 default:
3813 break;
3814 }
3815 }
3816
3817 if (p->fcoe)
3818 i40e_debug(hw, I40E_DEBUG_ALL, "device is FCoE capable\n");
3819
3820 /* Always disable FCoE if compiled without the I40E_FCOE_ENA flag */
3821 p->fcoe = FALSE;
3822
3823 /* count the enabled ports (aka the "not disabled" ports) */
3824 hw->num_ports = 0;
3825 for (i = 0; i < 4; i++) {
3826 enum i40e_status_code status;
3827 u32 port_cfg_reg = I40E_PRTGEN_STATUS + (4 * i);
3828 u64 port_cfg = 0;
3829
3830 /* use AQ read to get the physical register offset instead
3831 * of the port relative offset
3832 */
3833 status = i40e_aq_debug_read_register(hw, port_cfg_reg, &port_cfg, NULL);
3834 if ((status == I40E_SUCCESS) &&
3835 (port_cfg & I40E_PRTGEN_STATUS_PORT_VALID_MASK))
3836 hw->num_ports++;
3837 }
3838
3839 valid_functions = p->valid_functions;
3840 num_functions = 0;
3841 while (valid_functions) {
3842 if (valid_functions & 1)
3843 num_functions++;
3844 valid_functions >>= 1;
3845 }
3846
3847 /* partition id is 1-based, and functions are evenly spread
3848 * across the ports as partitions
3849 */
3850 if (hw->num_ports != 0) {
3851 hw->partition_id = (hw->pf_id / hw->num_ports) + 1;
3852 hw->num_partitions = num_functions / hw->num_ports;
3853 }
3854
3855 /* additional HW specific goodies that might
3856 * someday be HW version specific
3857 */
3858 p->rx_buf_chain_len = I40E_MAX_CHAINED_RX_BUFFERS;
3859 }
3860
3861 /**
3862 * i40e_aq_discover_capabilities
3863 * @hw: pointer to the hw struct
3864 * @buff: a virtual buffer to hold the capabilities
3865 * @buff_size: Size of the virtual buffer
3866 * @data_size: Size of the returned data, or buff size needed if AQ err==ENOMEM
3867 * @list_type_opc: capabilities type to discover - pass in the command opcode
3868 * @cmd_details: pointer to command details structure or NULL
3869 *
3870 * Get the device capabilities descriptions from the firmware
3871 **/
i40e_aq_discover_capabilities(struct i40e_hw * hw,void * buff,u16 buff_size,u16 * data_size,enum i40e_admin_queue_opc list_type_opc,struct i40e_asq_cmd_details * cmd_details)3872 enum i40e_status_code i40e_aq_discover_capabilities(struct i40e_hw *hw,
3873 void *buff, u16 buff_size, u16 *data_size,
3874 enum i40e_admin_queue_opc list_type_opc,
3875 struct i40e_asq_cmd_details *cmd_details)
3876 {
3877 struct i40e_aqc_list_capabilites *cmd;
3878 struct i40e_aq_desc desc;
3879 enum i40e_status_code status = I40E_SUCCESS;
3880
3881 cmd = (struct i40e_aqc_list_capabilites *)&desc.params.raw;
3882
3883 if (list_type_opc != i40e_aqc_opc_list_func_capabilities &&
3884 list_type_opc != i40e_aqc_opc_list_dev_capabilities) {
3885 status = I40E_ERR_PARAM;
3886 goto exit;
3887 }
3888
3889 i40e_fill_default_direct_cmd_desc(&desc, list_type_opc);
3890
3891 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
3892 if (buff_size > I40E_AQ_LARGE_BUF)
3893 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
3894
3895 status = i40e_asq_send_command(hw, &desc, buff, buff_size, cmd_details);
3896 *data_size = LE16_TO_CPU(desc.datalen);
3897
3898 if (status)
3899 goto exit;
3900
3901 i40e_parse_discover_capabilities(hw, buff, LE32_TO_CPU(cmd->count),
3902 list_type_opc);
3903
3904 exit:
3905 return status;
3906 }
3907
3908 /**
3909 * i40e_aq_update_nvm
3910 * @hw: pointer to the hw struct
3911 * @module_pointer: module pointer location in words from the NVM beginning
3912 * @offset: byte offset from the module beginning
3913 * @length: length of the section to be written (in bytes from the offset)
3914 * @data: command buffer (size [bytes] = length)
3915 * @last_command: tells if this is the last command in a series
3916 * @cmd_details: pointer to command details structure or NULL
3917 *
3918 * Update the NVM using the admin queue commands
3919 **/
i40e_aq_update_nvm(struct i40e_hw * hw,u8 module_pointer,u32 offset,u16 length,void * data,bool last_command,struct i40e_asq_cmd_details * cmd_details)3920 enum i40e_status_code i40e_aq_update_nvm(struct i40e_hw *hw, u8 module_pointer,
3921 u32 offset, u16 length, void *data,
3922 bool last_command,
3923 struct i40e_asq_cmd_details *cmd_details)
3924 {
3925 struct i40e_aq_desc desc;
3926 struct i40e_aqc_nvm_update *cmd =
3927 (struct i40e_aqc_nvm_update *)&desc.params.raw;
3928 enum i40e_status_code status;
3929
3930 DEBUGFUNC("i40e_aq_update_nvm");
3931
3932 /* In offset the highest byte must be zeroed. */
3933 if (offset & 0xFF000000) {
3934 status = I40E_ERR_PARAM;
3935 goto i40e_aq_update_nvm_exit;
3936 }
3937
3938 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_nvm_update);
3939
3940 /* If this is the last command in a series, set the proper flag. */
3941 if (last_command)
3942 cmd->command_flags |= I40E_AQ_NVM_LAST_CMD;
3943 cmd->module_pointer = module_pointer;
3944 cmd->offset = CPU_TO_LE32(offset);
3945 cmd->length = CPU_TO_LE16(length);
3946
3947 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
3948 if (length > I40E_AQ_LARGE_BUF)
3949 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
3950
3951 status = i40e_asq_send_command(hw, &desc, data, length, cmd_details);
3952
3953 i40e_aq_update_nvm_exit:
3954 return status;
3955 }
3956
3957 /**
3958 * i40e_aq_get_lldp_mib
3959 * @hw: pointer to the hw struct
3960 * @bridge_type: type of bridge requested
3961 * @mib_type: Local, Remote or both Local and Remote MIBs
3962 * @buff: pointer to a user supplied buffer to store the MIB block
3963 * @buff_size: size of the buffer (in bytes)
3964 * @local_len : length of the returned Local LLDP MIB
3965 * @remote_len: length of the returned Remote LLDP MIB
3966 * @cmd_details: pointer to command details structure or NULL
3967 *
3968 * Requests the complete LLDP MIB (entire packet).
3969 **/
i40e_aq_get_lldp_mib(struct i40e_hw * hw,u8 bridge_type,u8 mib_type,void * buff,u16 buff_size,u16 * local_len,u16 * remote_len,struct i40e_asq_cmd_details * cmd_details)3970 enum i40e_status_code i40e_aq_get_lldp_mib(struct i40e_hw *hw, u8 bridge_type,
3971 u8 mib_type, void *buff, u16 buff_size,
3972 u16 *local_len, u16 *remote_len,
3973 struct i40e_asq_cmd_details *cmd_details)
3974 {
3975 struct i40e_aq_desc desc;
3976 struct i40e_aqc_lldp_get_mib *cmd =
3977 (struct i40e_aqc_lldp_get_mib *)&desc.params.raw;
3978 struct i40e_aqc_lldp_get_mib *resp =
3979 (struct i40e_aqc_lldp_get_mib *)&desc.params.raw;
3980 enum i40e_status_code status;
3981
3982 if (buff_size == 0 || !buff)
3983 return I40E_ERR_PARAM;
3984
3985 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_lldp_get_mib);
3986 /* Indirect Command */
3987 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
3988
3989 cmd->type = mib_type & I40E_AQ_LLDP_MIB_TYPE_MASK;
3990 cmd->type |= ((bridge_type << I40E_AQ_LLDP_BRIDGE_TYPE_SHIFT) &
3991 I40E_AQ_LLDP_BRIDGE_TYPE_MASK);
3992
3993 desc.datalen = CPU_TO_LE16(buff_size);
3994
3995 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
3996 if (buff_size > I40E_AQ_LARGE_BUF)
3997 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
3998
3999 status = i40e_asq_send_command(hw, &desc, buff, buff_size, cmd_details);
4000 if (!status) {
4001 if (local_len != NULL)
4002 *local_len = LE16_TO_CPU(resp->local_len);
4003 if (remote_len != NULL)
4004 *remote_len = LE16_TO_CPU(resp->remote_len);
4005 }
4006
4007 return status;
4008 }
4009
4010 /**
4011 * i40e_aq_set_lldp_mib - Set the LLDP MIB
4012 * @hw: pointer to the hw struct
4013 * @mib_type: Local, Remote or both Local and Remote MIBs
4014 * @buff: pointer to a user supplied buffer to store the MIB block
4015 * @buff_size: size of the buffer (in bytes)
4016 * @cmd_details: pointer to command details structure or NULL
4017 *
4018 * Set the LLDP MIB.
4019 **/
i40e_aq_set_lldp_mib(struct i40e_hw * hw,u8 mib_type,void * buff,u16 buff_size,struct i40e_asq_cmd_details * cmd_details)4020 enum i40e_status_code i40e_aq_set_lldp_mib(struct i40e_hw *hw,
4021 u8 mib_type, void *buff, u16 buff_size,
4022 struct i40e_asq_cmd_details *cmd_details)
4023 {
4024 struct i40e_aq_desc desc;
4025 struct i40e_aqc_lldp_set_local_mib *cmd =
4026 (struct i40e_aqc_lldp_set_local_mib *)&desc.params.raw;
4027 enum i40e_status_code status;
4028
4029 if (buff_size == 0 || !buff)
4030 return I40E_ERR_PARAM;
4031
4032 i40e_fill_default_direct_cmd_desc(&desc,
4033 i40e_aqc_opc_lldp_set_local_mib);
4034 /* Indirect Command */
4035 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
4036 if (buff_size > I40E_AQ_LARGE_BUF)
4037 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
4038 desc.datalen = CPU_TO_LE16(buff_size);
4039
4040 cmd->type = mib_type;
4041 cmd->length = CPU_TO_LE16(buff_size);
4042 cmd->address_high = CPU_TO_LE32(I40E_HI_WORD((uintptr_t)buff));
4043 cmd->address_low = CPU_TO_LE32(I40E_LO_DWORD((uintptr_t)buff));
4044
4045 status = i40e_asq_send_command(hw, &desc, buff, buff_size, cmd_details);
4046 return status;
4047 }
4048
4049 /**
4050 * i40e_aq_cfg_lldp_mib_change_event
4051 * @hw: pointer to the hw struct
4052 * @enable_update: Enable or Disable event posting
4053 * @cmd_details: pointer to command details structure or NULL
4054 *
4055 * Enable or Disable posting of an event on ARQ when LLDP MIB
4056 * associated with the interface changes
4057 **/
i40e_aq_cfg_lldp_mib_change_event(struct i40e_hw * hw,bool enable_update,struct i40e_asq_cmd_details * cmd_details)4058 enum i40e_status_code i40e_aq_cfg_lldp_mib_change_event(struct i40e_hw *hw,
4059 bool enable_update,
4060 struct i40e_asq_cmd_details *cmd_details)
4061 {
4062 struct i40e_aq_desc desc;
4063 struct i40e_aqc_lldp_update_mib *cmd =
4064 (struct i40e_aqc_lldp_update_mib *)&desc.params.raw;
4065 enum i40e_status_code status;
4066
4067 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_lldp_update_mib);
4068
4069 if (!enable_update)
4070 cmd->command |= I40E_AQ_LLDP_MIB_UPDATE_DISABLE;
4071
4072 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
4073
4074 return status;
4075 }
4076
4077 /**
4078 * i40e_aq_add_lldp_tlv
4079 * @hw: pointer to the hw struct
4080 * @bridge_type: type of bridge
4081 * @buff: buffer with TLV to add
4082 * @buff_size: length of the buffer
4083 * @tlv_len: length of the TLV to be added
4084 * @mib_len: length of the LLDP MIB returned in response
4085 * @cmd_details: pointer to command details structure or NULL
4086 *
4087 * Add the specified TLV to LLDP Local MIB for the given bridge type,
4088 * it is responsibility of the caller to make sure that the TLV is not
4089 * already present in the LLDPDU.
4090 * In return firmware will write the complete LLDP MIB with the newly
4091 * added TLV in the response buffer.
4092 **/
i40e_aq_add_lldp_tlv(struct i40e_hw * hw,u8 bridge_type,void * buff,u16 buff_size,u16 tlv_len,u16 * mib_len,struct i40e_asq_cmd_details * cmd_details)4093 enum i40e_status_code i40e_aq_add_lldp_tlv(struct i40e_hw *hw, u8 bridge_type,
4094 void *buff, u16 buff_size, u16 tlv_len,
4095 u16 *mib_len,
4096 struct i40e_asq_cmd_details *cmd_details)
4097 {
4098 struct i40e_aq_desc desc;
4099 struct i40e_aqc_lldp_add_tlv *cmd =
4100 (struct i40e_aqc_lldp_add_tlv *)&desc.params.raw;
4101 enum i40e_status_code status;
4102
4103 if (buff_size == 0 || !buff || tlv_len == 0)
4104 return I40E_ERR_PARAM;
4105
4106 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_lldp_add_tlv);
4107
4108 /* Indirect Command */
4109 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
4110 if (buff_size > I40E_AQ_LARGE_BUF)
4111 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
4112 desc.datalen = CPU_TO_LE16(buff_size);
4113
4114 cmd->type = ((bridge_type << I40E_AQ_LLDP_BRIDGE_TYPE_SHIFT) &
4115 I40E_AQ_LLDP_BRIDGE_TYPE_MASK);
4116 cmd->len = CPU_TO_LE16(tlv_len);
4117
4118 status = i40e_asq_send_command(hw, &desc, buff, buff_size, cmd_details);
4119 if (!status) {
4120 if (mib_len != NULL)
4121 *mib_len = LE16_TO_CPU(desc.datalen);
4122 }
4123
4124 return status;
4125 }
4126
4127 /**
4128 * i40e_aq_update_lldp_tlv
4129 * @hw: pointer to the hw struct
4130 * @bridge_type: type of bridge
4131 * @buff: buffer with TLV to update
4132 * @buff_size: size of the buffer holding original and updated TLVs
4133 * @old_len: Length of the Original TLV
4134 * @new_len: Length of the Updated TLV
4135 * @offset: offset of the updated TLV in the buff
4136 * @mib_len: length of the returned LLDP MIB
4137 * @cmd_details: pointer to command details structure or NULL
4138 *
4139 * Update the specified TLV to the LLDP Local MIB for the given bridge type.
4140 * Firmware will place the complete LLDP MIB in response buffer with the
4141 * updated TLV.
4142 **/
i40e_aq_update_lldp_tlv(struct i40e_hw * hw,u8 bridge_type,void * buff,u16 buff_size,u16 old_len,u16 new_len,u16 offset,u16 * mib_len,struct i40e_asq_cmd_details * cmd_details)4143 enum i40e_status_code i40e_aq_update_lldp_tlv(struct i40e_hw *hw,
4144 u8 bridge_type, void *buff, u16 buff_size,
4145 u16 old_len, u16 new_len, u16 offset,
4146 u16 *mib_len,
4147 struct i40e_asq_cmd_details *cmd_details)
4148 {
4149 struct i40e_aq_desc desc;
4150 struct i40e_aqc_lldp_update_tlv *cmd =
4151 (struct i40e_aqc_lldp_update_tlv *)&desc.params.raw;
4152 enum i40e_status_code status;
4153
4154 if (buff_size == 0 || !buff || offset == 0 ||
4155 old_len == 0 || new_len == 0)
4156 return I40E_ERR_PARAM;
4157
4158 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_lldp_update_tlv);
4159
4160 /* Indirect Command */
4161 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
4162 if (buff_size > I40E_AQ_LARGE_BUF)
4163 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
4164 desc.datalen = CPU_TO_LE16(buff_size);
4165
4166 cmd->type = ((bridge_type << I40E_AQ_LLDP_BRIDGE_TYPE_SHIFT) &
4167 I40E_AQ_LLDP_BRIDGE_TYPE_MASK);
4168 cmd->old_len = CPU_TO_LE16(old_len);
4169 cmd->new_offset = CPU_TO_LE16(offset);
4170 cmd->new_len = CPU_TO_LE16(new_len);
4171
4172 status = i40e_asq_send_command(hw, &desc, buff, buff_size, cmd_details);
4173 if (!status) {
4174 if (mib_len != NULL)
4175 *mib_len = LE16_TO_CPU(desc.datalen);
4176 }
4177
4178 return status;
4179 }
4180
4181 /**
4182 * i40e_aq_delete_lldp_tlv
4183 * @hw: pointer to the hw struct
4184 * @bridge_type: type of bridge
4185 * @buff: pointer to a user supplied buffer that has the TLV
4186 * @buff_size: length of the buffer
4187 * @tlv_len: length of the TLV to be deleted
4188 * @mib_len: length of the returned LLDP MIB
4189 * @cmd_details: pointer to command details structure or NULL
4190 *
4191 * Delete the specified TLV from LLDP Local MIB for the given bridge type.
4192 * The firmware places the entire LLDP MIB in the response buffer.
4193 **/
i40e_aq_delete_lldp_tlv(struct i40e_hw * hw,u8 bridge_type,void * buff,u16 buff_size,u16 tlv_len,u16 * mib_len,struct i40e_asq_cmd_details * cmd_details)4194 enum i40e_status_code i40e_aq_delete_lldp_tlv(struct i40e_hw *hw,
4195 u8 bridge_type, void *buff, u16 buff_size,
4196 u16 tlv_len, u16 *mib_len,
4197 struct i40e_asq_cmd_details *cmd_details)
4198 {
4199 struct i40e_aq_desc desc;
4200 struct i40e_aqc_lldp_add_tlv *cmd =
4201 (struct i40e_aqc_lldp_add_tlv *)&desc.params.raw;
4202 enum i40e_status_code status;
4203
4204 if (buff_size == 0 || !buff)
4205 return I40E_ERR_PARAM;
4206
4207 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_lldp_delete_tlv);
4208
4209 /* Indirect Command */
4210 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
4211 if (buff_size > I40E_AQ_LARGE_BUF)
4212 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
4213 desc.datalen = CPU_TO_LE16(buff_size);
4214 cmd->len = CPU_TO_LE16(tlv_len);
4215 cmd->type = ((bridge_type << I40E_AQ_LLDP_BRIDGE_TYPE_SHIFT) &
4216 I40E_AQ_LLDP_BRIDGE_TYPE_MASK);
4217
4218 status = i40e_asq_send_command(hw, &desc, buff, buff_size, cmd_details);
4219 if (!status) {
4220 if (mib_len != NULL)
4221 *mib_len = LE16_TO_CPU(desc.datalen);
4222 }
4223
4224 return status;
4225 }
4226
4227 /**
4228 * i40e_aq_stop_lldp
4229 * @hw: pointer to the hw struct
4230 * @shutdown_agent: True if LLDP Agent needs to be Shutdown
4231 * @cmd_details: pointer to command details structure or NULL
4232 *
4233 * Stop or Shutdown the embedded LLDP Agent
4234 **/
i40e_aq_stop_lldp(struct i40e_hw * hw,bool shutdown_agent,struct i40e_asq_cmd_details * cmd_details)4235 enum i40e_status_code i40e_aq_stop_lldp(struct i40e_hw *hw, bool shutdown_agent,
4236 struct i40e_asq_cmd_details *cmd_details)
4237 {
4238 struct i40e_aq_desc desc;
4239 struct i40e_aqc_lldp_stop *cmd =
4240 (struct i40e_aqc_lldp_stop *)&desc.params.raw;
4241 enum i40e_status_code status;
4242
4243 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_lldp_stop);
4244
4245 if (shutdown_agent)
4246 cmd->command |= I40E_AQ_LLDP_AGENT_SHUTDOWN;
4247
4248 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
4249
4250 return status;
4251 }
4252
4253 /**
4254 * i40e_aq_start_lldp
4255 * @hw: pointer to the hw struct
4256 * @cmd_details: pointer to command details structure or NULL
4257 *
4258 * Start the embedded LLDP Agent on all ports.
4259 **/
i40e_aq_start_lldp(struct i40e_hw * hw,struct i40e_asq_cmd_details * cmd_details)4260 enum i40e_status_code i40e_aq_start_lldp(struct i40e_hw *hw,
4261 struct i40e_asq_cmd_details *cmd_details)
4262 {
4263 struct i40e_aq_desc desc;
4264 struct i40e_aqc_lldp_start *cmd =
4265 (struct i40e_aqc_lldp_start *)&desc.params.raw;
4266 enum i40e_status_code status;
4267
4268 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_lldp_start);
4269
4270 cmd->command = I40E_AQ_LLDP_AGENT_START;
4271
4272 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
4273
4274 return status;
4275 }
4276
4277 /**
4278 * i40e_aq_get_cee_dcb_config
4279 * @hw: pointer to the hw struct
4280 * @buff: response buffer that stores CEE operational configuration
4281 * @buff_size: size of the buffer passed
4282 * @cmd_details: pointer to command details structure or NULL
4283 *
4284 * Get CEE DCBX mode operational configuration from firmware
4285 **/
i40e_aq_get_cee_dcb_config(struct i40e_hw * hw,void * buff,u16 buff_size,struct i40e_asq_cmd_details * cmd_details)4286 enum i40e_status_code i40e_aq_get_cee_dcb_config(struct i40e_hw *hw,
4287 void *buff, u16 buff_size,
4288 struct i40e_asq_cmd_details *cmd_details)
4289 {
4290 struct i40e_aq_desc desc;
4291 enum i40e_status_code status;
4292
4293 if (buff_size == 0 || !buff)
4294 return I40E_ERR_PARAM;
4295
4296 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_get_cee_dcb_cfg);
4297
4298 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
4299 status = i40e_asq_send_command(hw, &desc, (void *)buff, buff_size,
4300 cmd_details);
4301
4302 return status;
4303 }
4304
4305 /**
4306 * i40e_aq_start_stop_dcbx - Start/Stop DCBx service in FW
4307 * @hw: pointer to the hw struct
4308 * @start_agent: True if DCBx Agent needs to be Started
4309 * False if DCBx Agent needs to be Stopped
4310 * @cmd_details: pointer to command details structure or NULL
4311 *
4312 * Start/Stop the embedded dcbx Agent
4313 **/
i40e_aq_start_stop_dcbx(struct i40e_hw * hw,bool start_agent,struct i40e_asq_cmd_details * cmd_details)4314 enum i40e_status_code i40e_aq_start_stop_dcbx(struct i40e_hw *hw,
4315 bool start_agent,
4316 struct i40e_asq_cmd_details *cmd_details)
4317 {
4318 struct i40e_aq_desc desc;
4319 struct i40e_aqc_lldp_stop_start_specific_agent *cmd =
4320 (struct i40e_aqc_lldp_stop_start_specific_agent *)
4321 &desc.params.raw;
4322 enum i40e_status_code status;
4323
4324 i40e_fill_default_direct_cmd_desc(&desc,
4325 i40e_aqc_opc_lldp_stop_start_spec_agent);
4326
4327 if (start_agent)
4328 cmd->command = I40E_AQC_START_SPECIFIC_AGENT_MASK;
4329
4330 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
4331
4332 return status;
4333 }
4334
4335 /**
4336 * i40e_aq_add_udp_tunnel
4337 * @hw: pointer to the hw struct
4338 * @udp_port: the UDP port to add
4339 * @header_len: length of the tunneling header length in DWords
4340 * @protocol_index: protocol index type
4341 * @filter_index: pointer to filter index
4342 * @cmd_details: pointer to command details structure or NULL
4343 **/
i40e_aq_add_udp_tunnel(struct i40e_hw * hw,u16 udp_port,u8 protocol_index,u8 * filter_index,struct i40e_asq_cmd_details * cmd_details)4344 enum i40e_status_code i40e_aq_add_udp_tunnel(struct i40e_hw *hw,
4345 u16 udp_port, u8 protocol_index,
4346 u8 *filter_index,
4347 struct i40e_asq_cmd_details *cmd_details)
4348 {
4349 struct i40e_aq_desc desc;
4350 struct i40e_aqc_add_udp_tunnel *cmd =
4351 (struct i40e_aqc_add_udp_tunnel *)&desc.params.raw;
4352 struct i40e_aqc_del_udp_tunnel_completion *resp =
4353 (struct i40e_aqc_del_udp_tunnel_completion *)&desc.params.raw;
4354 enum i40e_status_code status;
4355
4356 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_add_udp_tunnel);
4357
4358 cmd->udp_port = CPU_TO_LE16(udp_port);
4359 cmd->protocol_type = protocol_index;
4360
4361 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
4362
4363 if (!status && filter_index)
4364 *filter_index = resp->index;
4365
4366 return status;
4367 }
4368
4369 /**
4370 * i40e_aq_del_udp_tunnel
4371 * @hw: pointer to the hw struct
4372 * @index: filter index
4373 * @cmd_details: pointer to command details structure or NULL
4374 **/
i40e_aq_del_udp_tunnel(struct i40e_hw * hw,u8 index,struct i40e_asq_cmd_details * cmd_details)4375 enum i40e_status_code i40e_aq_del_udp_tunnel(struct i40e_hw *hw, u8 index,
4376 struct i40e_asq_cmd_details *cmd_details)
4377 {
4378 struct i40e_aq_desc desc;
4379 struct i40e_aqc_remove_udp_tunnel *cmd =
4380 (struct i40e_aqc_remove_udp_tunnel *)&desc.params.raw;
4381 enum i40e_status_code status;
4382
4383 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_del_udp_tunnel);
4384
4385 cmd->index = index;
4386
4387 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
4388
4389 return status;
4390 }
4391
4392 /**
4393 * i40e_aq_get_switch_resource_alloc (0x0204)
4394 * @hw: pointer to the hw struct
4395 * @num_entries: pointer to u8 to store the number of resource entries returned
4396 * @buf: pointer to a user supplied buffer. This buffer must be large enough
4397 * to store the resource information for all resource types. Each
4398 * resource type is a i40e_aqc_switch_resource_alloc_data structure.
4399 * @count: size, in bytes, of the buffer provided
4400 * @cmd_details: pointer to command details structure or NULL
4401 *
4402 * Query the resources allocated to a function.
4403 **/
i40e_aq_get_switch_resource_alloc(struct i40e_hw * hw,u8 * num_entries,struct i40e_aqc_switch_resource_alloc_element_resp * buf,u16 count,struct i40e_asq_cmd_details * cmd_details)4404 enum i40e_status_code i40e_aq_get_switch_resource_alloc(struct i40e_hw *hw,
4405 u8 *num_entries,
4406 struct i40e_aqc_switch_resource_alloc_element_resp *buf,
4407 u16 count,
4408 struct i40e_asq_cmd_details *cmd_details)
4409 {
4410 struct i40e_aq_desc desc;
4411 struct i40e_aqc_get_switch_resource_alloc *cmd_resp =
4412 (struct i40e_aqc_get_switch_resource_alloc *)&desc.params.raw;
4413 enum i40e_status_code status;
4414 u16 length = count * sizeof(*buf);
4415
4416 i40e_fill_default_direct_cmd_desc(&desc,
4417 i40e_aqc_opc_get_switch_resource_alloc);
4418
4419 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
4420 if (length > I40E_AQ_LARGE_BUF)
4421 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
4422
4423 status = i40e_asq_send_command(hw, &desc, buf, length, cmd_details);
4424
4425 if (!status && num_entries)
4426 *num_entries = cmd_resp->num_entries;
4427
4428 return status;
4429 }
4430
4431 /**
4432 * i40e_aq_delete_element - Delete switch element
4433 * @hw: pointer to the hw struct
4434 * @seid: the SEID to delete from the switch
4435 * @cmd_details: pointer to command details structure or NULL
4436 *
4437 * This deletes a switch element from the switch.
4438 **/
i40e_aq_delete_element(struct i40e_hw * hw,u16 seid,struct i40e_asq_cmd_details * cmd_details)4439 enum i40e_status_code i40e_aq_delete_element(struct i40e_hw *hw, u16 seid,
4440 struct i40e_asq_cmd_details *cmd_details)
4441 {
4442 struct i40e_aq_desc desc;
4443 struct i40e_aqc_switch_seid *cmd =
4444 (struct i40e_aqc_switch_seid *)&desc.params.raw;
4445 enum i40e_status_code status;
4446
4447 if (seid == 0)
4448 return I40E_ERR_PARAM;
4449
4450 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_delete_element);
4451
4452 cmd->seid = CPU_TO_LE16(seid);
4453
4454 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
4455
4456 return status;
4457 }
4458
4459 /**
4460 * i40e_aq_add_pvirt - Instantiate a Port Virtualizer on a port
4461 * @hw: pointer to the hw struct
4462 * @flags: component flags
4463 * @mac_seid: uplink seid (MAC SEID)
4464 * @vsi_seid: connected vsi seid
4465 * @ret_seid: seid of create pv component
4466 *
4467 * This instantiates an i40e port virtualizer with specified flags.
4468 * Depending on specified flags the port virtualizer can act as a
4469 * 802.1Qbr port virtualizer or a 802.1Qbg S-component.
4470 */
i40e_aq_add_pvirt(struct i40e_hw * hw,u16 flags,u16 mac_seid,u16 vsi_seid,u16 * ret_seid)4471 enum i40e_status_code i40e_aq_add_pvirt(struct i40e_hw *hw, u16 flags,
4472 u16 mac_seid, u16 vsi_seid,
4473 u16 *ret_seid)
4474 {
4475 struct i40e_aq_desc desc;
4476 struct i40e_aqc_add_update_pv *cmd =
4477 (struct i40e_aqc_add_update_pv *)&desc.params.raw;
4478 struct i40e_aqc_add_update_pv_completion *resp =
4479 (struct i40e_aqc_add_update_pv_completion *)&desc.params.raw;
4480 enum i40e_status_code status;
4481
4482 if (vsi_seid == 0)
4483 return I40E_ERR_PARAM;
4484
4485 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_add_pv);
4486 cmd->command_flags = CPU_TO_LE16(flags);
4487 cmd->uplink_seid = CPU_TO_LE16(mac_seid);
4488 cmd->connected_seid = CPU_TO_LE16(vsi_seid);
4489
4490 status = i40e_asq_send_command(hw, &desc, NULL, 0, NULL);
4491 if (!status && ret_seid)
4492 *ret_seid = LE16_TO_CPU(resp->pv_seid);
4493
4494 return status;
4495 }
4496
4497 /**
4498 * i40e_aq_add_tag - Add an S/E-tag
4499 * @hw: pointer to the hw struct
4500 * @direct_to_queue: should s-tag direct flow to a specific queue
4501 * @vsi_seid: VSI SEID to use this tag
4502 * @tag: value of the tag
4503 * @queue_num: queue number, only valid is direct_to_queue is TRUE
4504 * @tags_used: return value, number of tags in use by this PF
4505 * @tags_free: return value, number of unallocated tags
4506 * @cmd_details: pointer to command details structure or NULL
4507 *
4508 * This associates an S- or E-tag to a VSI in the switch complex. It returns
4509 * the number of tags allocated by the PF, and the number of unallocated
4510 * tags available.
4511 **/
i40e_aq_add_tag(struct i40e_hw * hw,bool direct_to_queue,u16 vsi_seid,u16 tag,u16 queue_num,u16 * tags_used,u16 * tags_free,struct i40e_asq_cmd_details * cmd_details)4512 enum i40e_status_code i40e_aq_add_tag(struct i40e_hw *hw, bool direct_to_queue,
4513 u16 vsi_seid, u16 tag, u16 queue_num,
4514 u16 *tags_used, u16 *tags_free,
4515 struct i40e_asq_cmd_details *cmd_details)
4516 {
4517 struct i40e_aq_desc desc;
4518 struct i40e_aqc_add_tag *cmd =
4519 (struct i40e_aqc_add_tag *)&desc.params.raw;
4520 struct i40e_aqc_add_remove_tag_completion *resp =
4521 (struct i40e_aqc_add_remove_tag_completion *)&desc.params.raw;
4522 enum i40e_status_code status;
4523
4524 if (vsi_seid == 0)
4525 return I40E_ERR_PARAM;
4526
4527 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_add_tag);
4528
4529 cmd->seid = CPU_TO_LE16(vsi_seid);
4530 cmd->tag = CPU_TO_LE16(tag);
4531 if (direct_to_queue) {
4532 cmd->flags = CPU_TO_LE16(I40E_AQC_ADD_TAG_FLAG_TO_QUEUE);
4533 cmd->queue_number = CPU_TO_LE16(queue_num);
4534 }
4535
4536 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
4537
4538 if (!status) {
4539 if (tags_used != NULL)
4540 *tags_used = LE16_TO_CPU(resp->tags_used);
4541 if (tags_free != NULL)
4542 *tags_free = LE16_TO_CPU(resp->tags_free);
4543 }
4544
4545 return status;
4546 }
4547
4548 /**
4549 * i40e_aq_remove_tag - Remove an S- or E-tag
4550 * @hw: pointer to the hw struct
4551 * @vsi_seid: VSI SEID this tag is associated with
4552 * @tag: value of the S-tag to delete
4553 * @tags_used: return value, number of tags in use by this PF
4554 * @tags_free: return value, number of unallocated tags
4555 * @cmd_details: pointer to command details structure or NULL
4556 *
4557 * This deletes an S- or E-tag from a VSI in the switch complex. It returns
4558 * the number of tags allocated by the PF, and the number of unallocated
4559 * tags available.
4560 **/
i40e_aq_remove_tag(struct i40e_hw * hw,u16 vsi_seid,u16 tag,u16 * tags_used,u16 * tags_free,struct i40e_asq_cmd_details * cmd_details)4561 enum i40e_status_code i40e_aq_remove_tag(struct i40e_hw *hw, u16 vsi_seid,
4562 u16 tag, u16 *tags_used, u16 *tags_free,
4563 struct i40e_asq_cmd_details *cmd_details)
4564 {
4565 struct i40e_aq_desc desc;
4566 struct i40e_aqc_remove_tag *cmd =
4567 (struct i40e_aqc_remove_tag *)&desc.params.raw;
4568 struct i40e_aqc_add_remove_tag_completion *resp =
4569 (struct i40e_aqc_add_remove_tag_completion *)&desc.params.raw;
4570 enum i40e_status_code status;
4571
4572 if (vsi_seid == 0)
4573 return I40E_ERR_PARAM;
4574
4575 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_remove_tag);
4576
4577 cmd->seid = CPU_TO_LE16(vsi_seid);
4578 cmd->tag = CPU_TO_LE16(tag);
4579
4580 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
4581
4582 if (!status) {
4583 if (tags_used != NULL)
4584 *tags_used = LE16_TO_CPU(resp->tags_used);
4585 if (tags_free != NULL)
4586 *tags_free = LE16_TO_CPU(resp->tags_free);
4587 }
4588
4589 return status;
4590 }
4591
4592 /**
4593 * i40e_aq_add_mcast_etag - Add a multicast E-tag
4594 * @hw: pointer to the hw struct
4595 * @pv_seid: Port Virtualizer of this SEID to associate E-tag with
4596 * @etag: value of E-tag to add
4597 * @num_tags_in_buf: number of unicast E-tags in indirect buffer
4598 * @buf: address of indirect buffer
4599 * @tags_used: return value, number of E-tags in use by this port
4600 * @tags_free: return value, number of unallocated M-tags
4601 * @cmd_details: pointer to command details structure or NULL
4602 *
4603 * This associates a multicast E-tag to a port virtualizer. It will return
4604 * the number of tags allocated by the PF, and the number of unallocated
4605 * tags available.
4606 *
4607 * The indirect buffer pointed to by buf is a list of 2-byte E-tags,
4608 * num_tags_in_buf long.
4609 **/
i40e_aq_add_mcast_etag(struct i40e_hw * hw,u16 pv_seid,u16 etag,u8 num_tags_in_buf,void * buf,u16 * tags_used,u16 * tags_free,struct i40e_asq_cmd_details * cmd_details)4610 enum i40e_status_code i40e_aq_add_mcast_etag(struct i40e_hw *hw, u16 pv_seid,
4611 u16 etag, u8 num_tags_in_buf, void *buf,
4612 u16 *tags_used, u16 *tags_free,
4613 struct i40e_asq_cmd_details *cmd_details)
4614 {
4615 struct i40e_aq_desc desc;
4616 struct i40e_aqc_add_remove_mcast_etag *cmd =
4617 (struct i40e_aqc_add_remove_mcast_etag *)&desc.params.raw;
4618 struct i40e_aqc_add_remove_mcast_etag_completion *resp =
4619 (struct i40e_aqc_add_remove_mcast_etag_completion *)&desc.params.raw;
4620 enum i40e_status_code status;
4621 u16 length = sizeof(u16) * num_tags_in_buf;
4622
4623 if ((pv_seid == 0) || (buf == NULL) || (num_tags_in_buf == 0))
4624 return I40E_ERR_PARAM;
4625
4626 i40e_fill_default_direct_cmd_desc(&desc,
4627 i40e_aqc_opc_add_multicast_etag);
4628
4629 cmd->pv_seid = CPU_TO_LE16(pv_seid);
4630 cmd->etag = CPU_TO_LE16(etag);
4631 cmd->num_unicast_etags = num_tags_in_buf;
4632
4633 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
4634 if (length > I40E_AQ_LARGE_BUF)
4635 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
4636
4637 status = i40e_asq_send_command(hw, &desc, buf, length, cmd_details);
4638
4639 if (!status) {
4640 if (tags_used != NULL)
4641 *tags_used = LE16_TO_CPU(resp->mcast_etags_used);
4642 if (tags_free != NULL)
4643 *tags_free = LE16_TO_CPU(resp->mcast_etags_free);
4644 }
4645
4646 return status;
4647 }
4648
4649 /**
4650 * i40e_aq_remove_mcast_etag - Remove a multicast E-tag
4651 * @hw: pointer to the hw struct
4652 * @pv_seid: Port Virtualizer SEID this M-tag is associated with
4653 * @etag: value of the E-tag to remove
4654 * @tags_used: return value, number of tags in use by this port
4655 * @tags_free: return value, number of unallocated tags
4656 * @cmd_details: pointer to command details structure or NULL
4657 *
4658 * This deletes an E-tag from the port virtualizer. It will return
4659 * the number of tags allocated by the port, and the number of unallocated
4660 * tags available.
4661 **/
i40e_aq_remove_mcast_etag(struct i40e_hw * hw,u16 pv_seid,u16 etag,u16 * tags_used,u16 * tags_free,struct i40e_asq_cmd_details * cmd_details)4662 enum i40e_status_code i40e_aq_remove_mcast_etag(struct i40e_hw *hw, u16 pv_seid,
4663 u16 etag, u16 *tags_used, u16 *tags_free,
4664 struct i40e_asq_cmd_details *cmd_details)
4665 {
4666 struct i40e_aq_desc desc;
4667 struct i40e_aqc_add_remove_mcast_etag *cmd =
4668 (struct i40e_aqc_add_remove_mcast_etag *)&desc.params.raw;
4669 struct i40e_aqc_add_remove_mcast_etag_completion *resp =
4670 (struct i40e_aqc_add_remove_mcast_etag_completion *)&desc.params.raw;
4671 enum i40e_status_code status;
4672
4673
4674 if (pv_seid == 0)
4675 return I40E_ERR_PARAM;
4676
4677 i40e_fill_default_direct_cmd_desc(&desc,
4678 i40e_aqc_opc_remove_multicast_etag);
4679
4680 cmd->pv_seid = CPU_TO_LE16(pv_seid);
4681 cmd->etag = CPU_TO_LE16(etag);
4682
4683 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
4684
4685 if (!status) {
4686 if (tags_used != NULL)
4687 *tags_used = LE16_TO_CPU(resp->mcast_etags_used);
4688 if (tags_free != NULL)
4689 *tags_free = LE16_TO_CPU(resp->mcast_etags_free);
4690 }
4691
4692 return status;
4693 }
4694
4695 /**
4696 * i40e_aq_update_tag - Update an S/E-tag
4697 * @hw: pointer to the hw struct
4698 * @vsi_seid: VSI SEID using this S-tag
4699 * @old_tag: old tag value
4700 * @new_tag: new tag value
4701 * @tags_used: return value, number of tags in use by this PF
4702 * @tags_free: return value, number of unallocated tags
4703 * @cmd_details: pointer to command details structure or NULL
4704 *
4705 * This updates the value of the tag currently attached to this VSI
4706 * in the switch complex. It will return the number of tags allocated
4707 * by the PF, and the number of unallocated tags available.
4708 **/
i40e_aq_update_tag(struct i40e_hw * hw,u16 vsi_seid,u16 old_tag,u16 new_tag,u16 * tags_used,u16 * tags_free,struct i40e_asq_cmd_details * cmd_details)4709 enum i40e_status_code i40e_aq_update_tag(struct i40e_hw *hw, u16 vsi_seid,
4710 u16 old_tag, u16 new_tag, u16 *tags_used,
4711 u16 *tags_free,
4712 struct i40e_asq_cmd_details *cmd_details)
4713 {
4714 struct i40e_aq_desc desc;
4715 struct i40e_aqc_update_tag *cmd =
4716 (struct i40e_aqc_update_tag *)&desc.params.raw;
4717 struct i40e_aqc_update_tag_completion *resp =
4718 (struct i40e_aqc_update_tag_completion *)&desc.params.raw;
4719 enum i40e_status_code status;
4720
4721 if (vsi_seid == 0)
4722 return I40E_ERR_PARAM;
4723
4724 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_update_tag);
4725
4726 cmd->seid = CPU_TO_LE16(vsi_seid);
4727 cmd->old_tag = CPU_TO_LE16(old_tag);
4728 cmd->new_tag = CPU_TO_LE16(new_tag);
4729
4730 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
4731
4732 if (!status) {
4733 if (tags_used != NULL)
4734 *tags_used = LE16_TO_CPU(resp->tags_used);
4735 if (tags_free != NULL)
4736 *tags_free = LE16_TO_CPU(resp->tags_free);
4737 }
4738
4739 return status;
4740 }
4741
4742 /**
4743 * i40e_aq_dcb_ignore_pfc - Ignore PFC for given TCs
4744 * @hw: pointer to the hw struct
4745 * @tcmap: TC map for request/release any ignore PFC condition
4746 * @request: request or release ignore PFC condition
4747 * @tcmap_ret: return TCs for which PFC is currently ignored
4748 * @cmd_details: pointer to command details structure or NULL
4749 *
4750 * This sends out request/release to ignore PFC condition for a TC.
4751 * It will return the TCs for which PFC is currently ignored.
4752 **/
i40e_aq_dcb_ignore_pfc(struct i40e_hw * hw,u8 tcmap,bool request,u8 * tcmap_ret,struct i40e_asq_cmd_details * cmd_details)4753 enum i40e_status_code i40e_aq_dcb_ignore_pfc(struct i40e_hw *hw, u8 tcmap,
4754 bool request, u8 *tcmap_ret,
4755 struct i40e_asq_cmd_details *cmd_details)
4756 {
4757 struct i40e_aq_desc desc;
4758 struct i40e_aqc_pfc_ignore *cmd_resp =
4759 (struct i40e_aqc_pfc_ignore *)&desc.params.raw;
4760 enum i40e_status_code status;
4761
4762 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_dcb_ignore_pfc);
4763
4764 if (request)
4765 cmd_resp->command_flags = I40E_AQC_PFC_IGNORE_SET;
4766
4767 cmd_resp->tc_bitmap = tcmap;
4768
4769 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
4770
4771 if (!status) {
4772 if (tcmap_ret != NULL)
4773 *tcmap_ret = cmd_resp->tc_bitmap;
4774 }
4775
4776 return status;
4777 }
4778
4779 /**
4780 * i40e_aq_dcb_updated - DCB Updated Command
4781 * @hw: pointer to the hw struct
4782 * @cmd_details: pointer to command details structure or NULL
4783 *
4784 * When LLDP is handled in PF this command is used by the PF
4785 * to notify EMP that a DCB setting is modified.
4786 * When LLDP is handled in EMP this command is used by the PF
4787 * to notify EMP whenever one of the following parameters get
4788 * modified:
4789 * - PFCLinkDelayAllowance in PRTDCB_GENC.PFCLDA
4790 * - PCIRTT in PRTDCB_GENC.PCIRTT
4791 * - Maximum Frame Size for non-FCoE TCs set by PRTDCB_TDPUC.MAX_TXFRAME.
4792 * EMP will return when the shared RPB settings have been
4793 * recomputed and modified. The retval field in the descriptor
4794 * will be set to 0 when RPB is modified.
4795 **/
i40e_aq_dcb_updated(struct i40e_hw * hw,struct i40e_asq_cmd_details * cmd_details)4796 enum i40e_status_code i40e_aq_dcb_updated(struct i40e_hw *hw,
4797 struct i40e_asq_cmd_details *cmd_details)
4798 {
4799 struct i40e_aq_desc desc;
4800 enum i40e_status_code status;
4801
4802 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_dcb_updated);
4803
4804 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
4805
4806 return status;
4807 }
4808
4809 /**
4810 * i40e_aq_add_statistics - Add a statistics block to a VLAN in a switch.
4811 * @hw: pointer to the hw struct
4812 * @seid: defines the SEID of the switch for which the stats are requested
4813 * @vlan_id: the VLAN ID for which the statistics are requested
4814 * @stat_index: index of the statistics counters block assigned to this VLAN
4815 * @cmd_details: pointer to command details structure or NULL
4816 *
4817 * XL710 supports 128 smonVlanStats counters.This command is used to
4818 * allocate a set of smonVlanStats counters to a specific VLAN in a specific
4819 * switch.
4820 **/
i40e_aq_add_statistics(struct i40e_hw * hw,u16 seid,u16 vlan_id,u16 * stat_index,struct i40e_asq_cmd_details * cmd_details)4821 enum i40e_status_code i40e_aq_add_statistics(struct i40e_hw *hw, u16 seid,
4822 u16 vlan_id, u16 *stat_index,
4823 struct i40e_asq_cmd_details *cmd_details)
4824 {
4825 struct i40e_aq_desc desc;
4826 struct i40e_aqc_add_remove_statistics *cmd_resp =
4827 (struct i40e_aqc_add_remove_statistics *)&desc.params.raw;
4828 enum i40e_status_code status;
4829
4830 if ((seid == 0) || (stat_index == NULL))
4831 return I40E_ERR_PARAM;
4832
4833 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_add_statistics);
4834
4835 cmd_resp->seid = CPU_TO_LE16(seid);
4836 cmd_resp->vlan = CPU_TO_LE16(vlan_id);
4837
4838 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
4839
4840 if (!status && stat_index)
4841 *stat_index = LE16_TO_CPU(cmd_resp->stat_index);
4842
4843 return status;
4844 }
4845
4846 /**
4847 * i40e_aq_remove_statistics - Remove a statistics block to a VLAN in a switch.
4848 * @hw: pointer to the hw struct
4849 * @seid: defines the SEID of the switch for which the stats are requested
4850 * @vlan_id: the VLAN ID for which the statistics are requested
4851 * @stat_index: index of the statistics counters block assigned to this VLAN
4852 * @cmd_details: pointer to command details structure or NULL
4853 *
4854 * XL710 supports 128 smonVlanStats counters.This command is used to
4855 * deallocate a set of smonVlanStats counters to a specific VLAN in a specific
4856 * switch.
4857 **/
i40e_aq_remove_statistics(struct i40e_hw * hw,u16 seid,u16 vlan_id,u16 stat_index,struct i40e_asq_cmd_details * cmd_details)4858 enum i40e_status_code i40e_aq_remove_statistics(struct i40e_hw *hw, u16 seid,
4859 u16 vlan_id, u16 stat_index,
4860 struct i40e_asq_cmd_details *cmd_details)
4861 {
4862 struct i40e_aq_desc desc;
4863 struct i40e_aqc_add_remove_statistics *cmd =
4864 (struct i40e_aqc_add_remove_statistics *)&desc.params.raw;
4865 enum i40e_status_code status;
4866
4867 if (seid == 0)
4868 return I40E_ERR_PARAM;
4869
4870 i40e_fill_default_direct_cmd_desc(&desc,
4871 i40e_aqc_opc_remove_statistics);
4872
4873 cmd->seid = CPU_TO_LE16(seid);
4874 cmd->vlan = CPU_TO_LE16(vlan_id);
4875 cmd->stat_index = CPU_TO_LE16(stat_index);
4876
4877 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
4878
4879 return status;
4880 }
4881
4882 /**
4883 * i40e_aq_set_port_parameters - set physical port parameters.
4884 * @hw: pointer to the hw struct
4885 * @bad_frame_vsi: defines the VSI to which bad frames are forwarded
4886 * @save_bad_pac: if set packets with errors are forwarded to the bad frames VSI
4887 * @pad_short_pac: if set transmit packets smaller than 60 bytes are padded
4888 * @double_vlan: if set double VLAN is enabled
4889 * @cmd_details: pointer to command details structure or NULL
4890 **/
i40e_aq_set_port_parameters(struct i40e_hw * hw,u16 bad_frame_vsi,bool save_bad_pac,bool pad_short_pac,bool double_vlan,struct i40e_asq_cmd_details * cmd_details)4891 enum i40e_status_code i40e_aq_set_port_parameters(struct i40e_hw *hw,
4892 u16 bad_frame_vsi, bool save_bad_pac,
4893 bool pad_short_pac, bool double_vlan,
4894 struct i40e_asq_cmd_details *cmd_details)
4895 {
4896 struct i40e_aqc_set_port_parameters *cmd;
4897 enum i40e_status_code status;
4898 struct i40e_aq_desc desc;
4899 u16 command_flags = 0;
4900
4901 cmd = (struct i40e_aqc_set_port_parameters *)&desc.params.raw;
4902
4903 i40e_fill_default_direct_cmd_desc(&desc,
4904 i40e_aqc_opc_set_port_parameters);
4905
4906 cmd->bad_frame_vsi = CPU_TO_LE16(bad_frame_vsi);
4907 if (save_bad_pac)
4908 command_flags |= I40E_AQ_SET_P_PARAMS_SAVE_BAD_PACKETS;
4909 if (pad_short_pac)
4910 command_flags |= I40E_AQ_SET_P_PARAMS_PAD_SHORT_PACKETS;
4911 if (double_vlan)
4912 command_flags |= I40E_AQ_SET_P_PARAMS_DOUBLE_VLAN_ENA;
4913 cmd->command_flags = CPU_TO_LE16(command_flags);
4914
4915 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
4916
4917 return status;
4918 }
4919
4920 /**
4921 * i40e_aq_tx_sched_cmd - generic Tx scheduler AQ command handler
4922 * @hw: pointer to the hw struct
4923 * @seid: seid for the physical port/switching component/vsi
4924 * @buff: Indirect buffer to hold data parameters and response
4925 * @buff_size: Indirect buffer size
4926 * @opcode: Tx scheduler AQ command opcode
4927 * @cmd_details: pointer to command details structure or NULL
4928 *
4929 * Generic command handler for Tx scheduler AQ commands
4930 **/
i40e_aq_tx_sched_cmd(struct i40e_hw * hw,u16 seid,void * buff,u16 buff_size,enum i40e_admin_queue_opc opcode,struct i40e_asq_cmd_details * cmd_details)4931 static enum i40e_status_code i40e_aq_tx_sched_cmd(struct i40e_hw *hw, u16 seid,
4932 void *buff, u16 buff_size,
4933 enum i40e_admin_queue_opc opcode,
4934 struct i40e_asq_cmd_details *cmd_details)
4935 {
4936 struct i40e_aq_desc desc;
4937 struct i40e_aqc_tx_sched_ind *cmd =
4938 (struct i40e_aqc_tx_sched_ind *)&desc.params.raw;
4939 enum i40e_status_code status;
4940 bool cmd_param_flag = FALSE;
4941
4942 switch (opcode) {
4943 case i40e_aqc_opc_configure_vsi_ets_sla_bw_limit:
4944 case i40e_aqc_opc_configure_vsi_tc_bw:
4945 case i40e_aqc_opc_enable_switching_comp_ets:
4946 case i40e_aqc_opc_modify_switching_comp_ets:
4947 case i40e_aqc_opc_disable_switching_comp_ets:
4948 case i40e_aqc_opc_configure_switching_comp_ets_bw_limit:
4949 case i40e_aqc_opc_configure_switching_comp_bw_config:
4950 cmd_param_flag = TRUE;
4951 break;
4952 case i40e_aqc_opc_query_vsi_bw_config:
4953 case i40e_aqc_opc_query_vsi_ets_sla_config:
4954 case i40e_aqc_opc_query_switching_comp_ets_config:
4955 case i40e_aqc_opc_query_port_ets_config:
4956 case i40e_aqc_opc_query_switching_comp_bw_config:
4957 cmd_param_flag = FALSE;
4958 break;
4959 default:
4960 return I40E_ERR_PARAM;
4961 }
4962
4963 i40e_fill_default_direct_cmd_desc(&desc, opcode);
4964
4965 /* Indirect command */
4966 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
4967 if (cmd_param_flag)
4968 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_RD);
4969 if (buff_size > I40E_AQ_LARGE_BUF)
4970 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
4971
4972 desc.datalen = CPU_TO_LE16(buff_size);
4973
4974 cmd->vsi_seid = CPU_TO_LE16(seid);
4975
4976 status = i40e_asq_send_command(hw, &desc, buff, buff_size, cmd_details);
4977
4978 return status;
4979 }
4980
4981 /**
4982 * i40e_aq_config_vsi_bw_limit - Configure VSI BW Limit
4983 * @hw: pointer to the hw struct
4984 * @seid: VSI seid
4985 * @credit: BW limit credits (0 = disabled)
4986 * @max_credit: Max BW limit credits
4987 * @cmd_details: pointer to command details structure or NULL
4988 **/
i40e_aq_config_vsi_bw_limit(struct i40e_hw * hw,u16 seid,u16 credit,u8 max_credit,struct i40e_asq_cmd_details * cmd_details)4989 enum i40e_status_code i40e_aq_config_vsi_bw_limit(struct i40e_hw *hw,
4990 u16 seid, u16 credit, u8 max_credit,
4991 struct i40e_asq_cmd_details *cmd_details)
4992 {
4993 struct i40e_aq_desc desc;
4994 struct i40e_aqc_configure_vsi_bw_limit *cmd =
4995 (struct i40e_aqc_configure_vsi_bw_limit *)&desc.params.raw;
4996 enum i40e_status_code status;
4997
4998 i40e_fill_default_direct_cmd_desc(&desc,
4999 i40e_aqc_opc_configure_vsi_bw_limit);
5000
5001 cmd->vsi_seid = CPU_TO_LE16(seid);
5002 cmd->credit = CPU_TO_LE16(credit);
5003 cmd->max_credit = max_credit;
5004
5005 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
5006
5007 return status;
5008 }
5009
5010 /**
5011 * i40e_aq_config_switch_comp_bw_limit - Configure Switching component BW Limit
5012 * @hw: pointer to the hw struct
5013 * @seid: switching component seid
5014 * @credit: BW limit credits (0 = disabled)
5015 * @max_bw: Max BW limit credits
5016 * @cmd_details: pointer to command details structure or NULL
5017 **/
i40e_aq_config_switch_comp_bw_limit(struct i40e_hw * hw,u16 seid,u16 credit,u8 max_bw,struct i40e_asq_cmd_details * cmd_details)5018 enum i40e_status_code i40e_aq_config_switch_comp_bw_limit(struct i40e_hw *hw,
5019 u16 seid, u16 credit, u8 max_bw,
5020 struct i40e_asq_cmd_details *cmd_details)
5021 {
5022 struct i40e_aq_desc desc;
5023 struct i40e_aqc_configure_switching_comp_bw_limit *cmd =
5024 (struct i40e_aqc_configure_switching_comp_bw_limit *)&desc.params.raw;
5025 enum i40e_status_code status;
5026
5027 i40e_fill_default_direct_cmd_desc(&desc,
5028 i40e_aqc_opc_configure_switching_comp_bw_limit);
5029
5030 cmd->seid = CPU_TO_LE16(seid);
5031 cmd->credit = CPU_TO_LE16(credit);
5032 cmd->max_bw = max_bw;
5033
5034 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
5035
5036 return status;
5037 }
5038
5039 /**
5040 * i40e_aq_config_vsi_ets_sla_bw_limit - Config VSI BW Limit per TC
5041 * @hw: pointer to the hw struct
5042 * @seid: VSI seid
5043 * @bw_data: Buffer holding enabled TCs, per TC BW limit/credits
5044 * @cmd_details: pointer to command details structure or NULL
5045 **/
i40e_aq_config_vsi_ets_sla_bw_limit(struct i40e_hw * hw,u16 seid,struct i40e_aqc_configure_vsi_ets_sla_bw_data * bw_data,struct i40e_asq_cmd_details * cmd_details)5046 enum i40e_status_code i40e_aq_config_vsi_ets_sla_bw_limit(struct i40e_hw *hw,
5047 u16 seid,
5048 struct i40e_aqc_configure_vsi_ets_sla_bw_data *bw_data,
5049 struct i40e_asq_cmd_details *cmd_details)
5050 {
5051 return i40e_aq_tx_sched_cmd(hw, seid, (void *)bw_data, sizeof(*bw_data),
5052 i40e_aqc_opc_configure_vsi_ets_sla_bw_limit,
5053 cmd_details);
5054 }
5055
5056 /**
5057 * i40e_aq_config_vsi_tc_bw - Config VSI BW Allocation per TC
5058 * @hw: pointer to the hw struct
5059 * @seid: VSI seid
5060 * @bw_data: Buffer holding enabled TCs, relative TC BW limit/credits
5061 * @cmd_details: pointer to command details structure or NULL
5062 **/
i40e_aq_config_vsi_tc_bw(struct i40e_hw * hw,u16 seid,struct i40e_aqc_configure_vsi_tc_bw_data * bw_data,struct i40e_asq_cmd_details * cmd_details)5063 enum i40e_status_code i40e_aq_config_vsi_tc_bw(struct i40e_hw *hw,
5064 u16 seid,
5065 struct i40e_aqc_configure_vsi_tc_bw_data *bw_data,
5066 struct i40e_asq_cmd_details *cmd_details)
5067 {
5068 return i40e_aq_tx_sched_cmd(hw, seid, (void *)bw_data, sizeof(*bw_data),
5069 i40e_aqc_opc_configure_vsi_tc_bw,
5070 cmd_details);
5071 }
5072
5073 /**
5074 * i40e_aq_config_switch_comp_ets_bw_limit - Config Switch comp BW Limit per TC
5075 * @hw: pointer to the hw struct
5076 * @seid: seid of the switching component
5077 * @bw_data: Buffer holding enabled TCs, per TC BW limit/credits
5078 * @cmd_details: pointer to command details structure or NULL
5079 **/
i40e_aq_config_switch_comp_ets_bw_limit(struct i40e_hw * hw,u16 seid,struct i40e_aqc_configure_switching_comp_ets_bw_limit_data * bw_data,struct i40e_asq_cmd_details * cmd_details)5080 enum i40e_status_code i40e_aq_config_switch_comp_ets_bw_limit(
5081 struct i40e_hw *hw, u16 seid,
5082 struct i40e_aqc_configure_switching_comp_ets_bw_limit_data *bw_data,
5083 struct i40e_asq_cmd_details *cmd_details)
5084 {
5085 return i40e_aq_tx_sched_cmd(hw, seid, (void *)bw_data, sizeof(*bw_data),
5086 i40e_aqc_opc_configure_switching_comp_ets_bw_limit,
5087 cmd_details);
5088 }
5089
5090 /**
5091 * i40e_aq_query_vsi_bw_config - Query VSI BW configuration
5092 * @hw: pointer to the hw struct
5093 * @seid: seid of the VSI
5094 * @bw_data: Buffer to hold VSI BW configuration
5095 * @cmd_details: pointer to command details structure or NULL
5096 **/
i40e_aq_query_vsi_bw_config(struct i40e_hw * hw,u16 seid,struct i40e_aqc_query_vsi_bw_config_resp * bw_data,struct i40e_asq_cmd_details * cmd_details)5097 enum i40e_status_code i40e_aq_query_vsi_bw_config(struct i40e_hw *hw,
5098 u16 seid,
5099 struct i40e_aqc_query_vsi_bw_config_resp *bw_data,
5100 struct i40e_asq_cmd_details *cmd_details)
5101 {
5102 return i40e_aq_tx_sched_cmd(hw, seid, (void *)bw_data, sizeof(*bw_data),
5103 i40e_aqc_opc_query_vsi_bw_config,
5104 cmd_details);
5105 }
5106
5107 /**
5108 * i40e_aq_query_vsi_ets_sla_config - Query VSI BW configuration per TC
5109 * @hw: pointer to the hw struct
5110 * @seid: seid of the VSI
5111 * @bw_data: Buffer to hold VSI BW configuration per TC
5112 * @cmd_details: pointer to command details structure or NULL
5113 **/
i40e_aq_query_vsi_ets_sla_config(struct i40e_hw * hw,u16 seid,struct i40e_aqc_query_vsi_ets_sla_config_resp * bw_data,struct i40e_asq_cmd_details * cmd_details)5114 enum i40e_status_code i40e_aq_query_vsi_ets_sla_config(struct i40e_hw *hw,
5115 u16 seid,
5116 struct i40e_aqc_query_vsi_ets_sla_config_resp *bw_data,
5117 struct i40e_asq_cmd_details *cmd_details)
5118 {
5119 return i40e_aq_tx_sched_cmd(hw, seid, (void *)bw_data, sizeof(*bw_data),
5120 i40e_aqc_opc_query_vsi_ets_sla_config,
5121 cmd_details);
5122 }
5123
5124 /**
5125 * i40e_aq_query_switch_comp_ets_config - Query Switch comp BW config per TC
5126 * @hw: pointer to the hw struct
5127 * @seid: seid of the switching component
5128 * @bw_data: Buffer to hold switching component's per TC BW config
5129 * @cmd_details: pointer to command details structure or NULL
5130 **/
i40e_aq_query_switch_comp_ets_config(struct i40e_hw * hw,u16 seid,struct i40e_aqc_query_switching_comp_ets_config_resp * bw_data,struct i40e_asq_cmd_details * cmd_details)5131 enum i40e_status_code i40e_aq_query_switch_comp_ets_config(struct i40e_hw *hw,
5132 u16 seid,
5133 struct i40e_aqc_query_switching_comp_ets_config_resp *bw_data,
5134 struct i40e_asq_cmd_details *cmd_details)
5135 {
5136 return i40e_aq_tx_sched_cmd(hw, seid, (void *)bw_data, sizeof(*bw_data),
5137 i40e_aqc_opc_query_switching_comp_ets_config,
5138 cmd_details);
5139 }
5140
5141 /**
5142 * i40e_aq_query_port_ets_config - Query Physical Port ETS configuration
5143 * @hw: pointer to the hw struct
5144 * @seid: seid of the VSI or switching component connected to Physical Port
5145 * @bw_data: Buffer to hold current ETS configuration for the Physical Port
5146 * @cmd_details: pointer to command details structure or NULL
5147 **/
i40e_aq_query_port_ets_config(struct i40e_hw * hw,u16 seid,struct i40e_aqc_query_port_ets_config_resp * bw_data,struct i40e_asq_cmd_details * cmd_details)5148 enum i40e_status_code i40e_aq_query_port_ets_config(struct i40e_hw *hw,
5149 u16 seid,
5150 struct i40e_aqc_query_port_ets_config_resp *bw_data,
5151 struct i40e_asq_cmd_details *cmd_details)
5152 {
5153 return i40e_aq_tx_sched_cmd(hw, seid, (void *)bw_data, sizeof(*bw_data),
5154 i40e_aqc_opc_query_port_ets_config,
5155 cmd_details);
5156 }
5157
5158 /**
5159 * i40e_aq_query_switch_comp_bw_config - Query Switch comp BW configuration
5160 * @hw: pointer to the hw struct
5161 * @seid: seid of the switching component
5162 * @bw_data: Buffer to hold switching component's BW configuration
5163 * @cmd_details: pointer to command details structure or NULL
5164 **/
i40e_aq_query_switch_comp_bw_config(struct i40e_hw * hw,u16 seid,struct i40e_aqc_query_switching_comp_bw_config_resp * bw_data,struct i40e_asq_cmd_details * cmd_details)5165 enum i40e_status_code i40e_aq_query_switch_comp_bw_config(struct i40e_hw *hw,
5166 u16 seid,
5167 struct i40e_aqc_query_switching_comp_bw_config_resp *bw_data,
5168 struct i40e_asq_cmd_details *cmd_details)
5169 {
5170 return i40e_aq_tx_sched_cmd(hw, seid, (void *)bw_data, sizeof(*bw_data),
5171 i40e_aqc_opc_query_switching_comp_bw_config,
5172 cmd_details);
5173 }
5174
5175 /**
5176 * i40e_validate_filter_settings
5177 * @hw: pointer to the hardware structure
5178 * @settings: Filter control settings
5179 *
5180 * Check and validate the filter control settings passed.
5181 * The function checks for the valid filter/context sizes being
5182 * passed for FCoE and PE.
5183 *
5184 * Returns I40E_SUCCESS if the values passed are valid and within
5185 * range else returns an error.
5186 **/
i40e_validate_filter_settings(struct i40e_hw * hw,struct i40e_filter_control_settings * settings)5187 static enum i40e_status_code i40e_validate_filter_settings(struct i40e_hw *hw,
5188 struct i40e_filter_control_settings *settings)
5189 {
5190 u32 fcoe_cntx_size, fcoe_filt_size;
5191 u32 pe_cntx_size, pe_filt_size;
5192 u32 fcoe_fmax;
5193
5194 u32 val;
5195
5196 /* Validate FCoE settings passed */
5197 switch (settings->fcoe_filt_num) {
5198 case I40E_HASH_FILTER_SIZE_1K:
5199 case I40E_HASH_FILTER_SIZE_2K:
5200 case I40E_HASH_FILTER_SIZE_4K:
5201 case I40E_HASH_FILTER_SIZE_8K:
5202 case I40E_HASH_FILTER_SIZE_16K:
5203 case I40E_HASH_FILTER_SIZE_32K:
5204 fcoe_filt_size = I40E_HASH_FILTER_BASE_SIZE;
5205 fcoe_filt_size <<= (u32)settings->fcoe_filt_num;
5206 break;
5207 default:
5208 return I40E_ERR_PARAM;
5209 }
5210
5211 switch (settings->fcoe_cntx_num) {
5212 case I40E_DMA_CNTX_SIZE_512:
5213 case I40E_DMA_CNTX_SIZE_1K:
5214 case I40E_DMA_CNTX_SIZE_2K:
5215 case I40E_DMA_CNTX_SIZE_4K:
5216 fcoe_cntx_size = I40E_DMA_CNTX_BASE_SIZE;
5217 fcoe_cntx_size <<= (u32)settings->fcoe_cntx_num;
5218 break;
5219 default:
5220 return I40E_ERR_PARAM;
5221 }
5222
5223 /* Validate PE settings passed */
5224 switch (settings->pe_filt_num) {
5225 case I40E_HASH_FILTER_SIZE_1K:
5226 case I40E_HASH_FILTER_SIZE_2K:
5227 case I40E_HASH_FILTER_SIZE_4K:
5228 case I40E_HASH_FILTER_SIZE_8K:
5229 case I40E_HASH_FILTER_SIZE_16K:
5230 case I40E_HASH_FILTER_SIZE_32K:
5231 case I40E_HASH_FILTER_SIZE_64K:
5232 case I40E_HASH_FILTER_SIZE_128K:
5233 case I40E_HASH_FILTER_SIZE_256K:
5234 case I40E_HASH_FILTER_SIZE_512K:
5235 case I40E_HASH_FILTER_SIZE_1M:
5236 pe_filt_size = I40E_HASH_FILTER_BASE_SIZE;
5237 pe_filt_size <<= (u32)settings->pe_filt_num;
5238 break;
5239 default:
5240 return I40E_ERR_PARAM;
5241 }
5242
5243 switch (settings->pe_cntx_num) {
5244 case I40E_DMA_CNTX_SIZE_512:
5245 case I40E_DMA_CNTX_SIZE_1K:
5246 case I40E_DMA_CNTX_SIZE_2K:
5247 case I40E_DMA_CNTX_SIZE_4K:
5248 case I40E_DMA_CNTX_SIZE_8K:
5249 case I40E_DMA_CNTX_SIZE_16K:
5250 case I40E_DMA_CNTX_SIZE_32K:
5251 case I40E_DMA_CNTX_SIZE_64K:
5252 case I40E_DMA_CNTX_SIZE_128K:
5253 case I40E_DMA_CNTX_SIZE_256K:
5254 pe_cntx_size = I40E_DMA_CNTX_BASE_SIZE;
5255 pe_cntx_size <<= (u32)settings->pe_cntx_num;
5256 break;
5257 default:
5258 return I40E_ERR_PARAM;
5259 }
5260
5261 /* FCHSIZE + FCDSIZE should not be greater than PMFCOEFMAX */
5262 val = rd32(hw, I40E_GLHMC_FCOEFMAX);
5263 fcoe_fmax = (val & I40E_GLHMC_FCOEFMAX_PMFCOEFMAX_MASK)
5264 >> I40E_GLHMC_FCOEFMAX_PMFCOEFMAX_SHIFT;
5265 if (fcoe_filt_size + fcoe_cntx_size > fcoe_fmax)
5266 return I40E_ERR_INVALID_SIZE;
5267
5268 return I40E_SUCCESS;
5269 }
5270
5271 /**
5272 * i40e_set_filter_control
5273 * @hw: pointer to the hardware structure
5274 * @settings: Filter control settings
5275 *
5276 * Set the Queue Filters for PE/FCoE and enable filters required
5277 * for a single PF. It is expected that these settings are programmed
5278 * at the driver initialization time.
5279 **/
i40e_set_filter_control(struct i40e_hw * hw,struct i40e_filter_control_settings * settings)5280 enum i40e_status_code i40e_set_filter_control(struct i40e_hw *hw,
5281 struct i40e_filter_control_settings *settings)
5282 {
5283 enum i40e_status_code ret = I40E_SUCCESS;
5284 u32 hash_lut_size = 0;
5285 u32 val;
5286
5287 if (!settings)
5288 return I40E_ERR_PARAM;
5289
5290 /* Validate the input settings */
5291 ret = i40e_validate_filter_settings(hw, settings);
5292 if (ret)
5293 return ret;
5294
5295 /* Read the PF Queue Filter control register */
5296 val = i40e_read_rx_ctl(hw, I40E_PFQF_CTL_0);
5297
5298 /* Program required PE hash buckets for the PF */
5299 val &= ~I40E_PFQF_CTL_0_PEHSIZE_MASK;
5300 val |= ((u32)settings->pe_filt_num << I40E_PFQF_CTL_0_PEHSIZE_SHIFT) &
5301 I40E_PFQF_CTL_0_PEHSIZE_MASK;
5302 /* Program required PE contexts for the PF */
5303 val &= ~I40E_PFQF_CTL_0_PEDSIZE_MASK;
5304 val |= ((u32)settings->pe_cntx_num << I40E_PFQF_CTL_0_PEDSIZE_SHIFT) &
5305 I40E_PFQF_CTL_0_PEDSIZE_MASK;
5306
5307 /* Program required FCoE hash buckets for the PF */
5308 val &= ~I40E_PFQF_CTL_0_PFFCHSIZE_MASK;
5309 val |= ((u32)settings->fcoe_filt_num <<
5310 I40E_PFQF_CTL_0_PFFCHSIZE_SHIFT) &
5311 I40E_PFQF_CTL_0_PFFCHSIZE_MASK;
5312 /* Program required FCoE DDP contexts for the PF */
5313 val &= ~I40E_PFQF_CTL_0_PFFCDSIZE_MASK;
5314 val |= ((u32)settings->fcoe_cntx_num <<
5315 I40E_PFQF_CTL_0_PFFCDSIZE_SHIFT) &
5316 I40E_PFQF_CTL_0_PFFCDSIZE_MASK;
5317
5318 /* Program Hash LUT size for the PF */
5319 val &= ~I40E_PFQF_CTL_0_HASHLUTSIZE_MASK;
5320 if (settings->hash_lut_size == I40E_HASH_LUT_SIZE_512)
5321 hash_lut_size = 1;
5322 val |= (hash_lut_size << I40E_PFQF_CTL_0_HASHLUTSIZE_SHIFT) &
5323 I40E_PFQF_CTL_0_HASHLUTSIZE_MASK;
5324
5325 /* Enable FDIR, Ethertype and MACVLAN filters for PF and VFs */
5326 if (settings->enable_fdir)
5327 val |= I40E_PFQF_CTL_0_FD_ENA_MASK;
5328 if (settings->enable_ethtype)
5329 val |= I40E_PFQF_CTL_0_ETYPE_ENA_MASK;
5330 if (settings->enable_macvlan)
5331 val |= I40E_PFQF_CTL_0_MACVLAN_ENA_MASK;
5332
5333 i40e_write_rx_ctl(hw, I40E_PFQF_CTL_0, val);
5334
5335 return I40E_SUCCESS;
5336 }
5337
5338 /**
5339 * i40e_aq_add_rem_control_packet_filter - Add or Remove Control Packet Filter
5340 * @hw: pointer to the hw struct
5341 * @mac_addr: MAC address to use in the filter
5342 * @ethtype: Ethertype to use in the filter
5343 * @flags: Flags that needs to be applied to the filter
5344 * @vsi_seid: seid of the control VSI
5345 * @queue: VSI queue number to send the packet to
5346 * @is_add: Add control packet filter if True else remove
5347 * @stats: Structure to hold information on control filter counts
5348 * @cmd_details: pointer to command details structure or NULL
5349 *
5350 * This command will Add or Remove control packet filter for a control VSI.
5351 * In return it will update the total number of perfect filter count in
5352 * the stats member.
5353 **/
i40e_aq_add_rem_control_packet_filter(struct i40e_hw * hw,u8 * mac_addr,u16 ethtype,u16 flags,u16 vsi_seid,u16 queue,bool is_add,struct i40e_control_filter_stats * stats,struct i40e_asq_cmd_details * cmd_details)5354 enum i40e_status_code i40e_aq_add_rem_control_packet_filter(struct i40e_hw *hw,
5355 u8 *mac_addr, u16 ethtype, u16 flags,
5356 u16 vsi_seid, u16 queue, bool is_add,
5357 struct i40e_control_filter_stats *stats,
5358 struct i40e_asq_cmd_details *cmd_details)
5359 {
5360 struct i40e_aq_desc desc;
5361 struct i40e_aqc_add_remove_control_packet_filter *cmd =
5362 (struct i40e_aqc_add_remove_control_packet_filter *)
5363 &desc.params.raw;
5364 struct i40e_aqc_add_remove_control_packet_filter_completion *resp =
5365 (struct i40e_aqc_add_remove_control_packet_filter_completion *)
5366 &desc.params.raw;
5367 enum i40e_status_code status;
5368
5369 if (vsi_seid == 0)
5370 return I40E_ERR_PARAM;
5371
5372 if (is_add) {
5373 i40e_fill_default_direct_cmd_desc(&desc,
5374 i40e_aqc_opc_add_control_packet_filter);
5375 cmd->queue = CPU_TO_LE16(queue);
5376 } else {
5377 i40e_fill_default_direct_cmd_desc(&desc,
5378 i40e_aqc_opc_remove_control_packet_filter);
5379 }
5380
5381 if (mac_addr)
5382 i40e_memcpy(cmd->mac, mac_addr, I40E_ETH_LENGTH_OF_ADDRESS,
5383 I40E_NONDMA_TO_NONDMA);
5384
5385 cmd->etype = CPU_TO_LE16(ethtype);
5386 cmd->flags = CPU_TO_LE16(flags);
5387 cmd->seid = CPU_TO_LE16(vsi_seid);
5388
5389 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
5390
5391 if (!status && stats) {
5392 stats->mac_etype_used = LE16_TO_CPU(resp->mac_etype_used);
5393 stats->etype_used = LE16_TO_CPU(resp->etype_used);
5394 stats->mac_etype_free = LE16_TO_CPU(resp->mac_etype_free);
5395 stats->etype_free = LE16_TO_CPU(resp->etype_free);
5396 }
5397
5398 return status;
5399 }
5400
5401 /**
5402 * i40e_add_filter_to_drop_tx_flow_control_frames- filter to drop flow control
5403 * @hw: pointer to the hw struct
5404 * @seid: VSI seid to add ethertype filter from
5405 **/
5406 #define I40E_FLOW_CONTROL_ETHTYPE 0x8808
i40e_add_filter_to_drop_tx_flow_control_frames(struct i40e_hw * hw,u16 seid)5407 void i40e_add_filter_to_drop_tx_flow_control_frames(struct i40e_hw *hw,
5408 u16 seid)
5409 {
5410 u16 flag = I40E_AQC_ADD_CONTROL_PACKET_FLAGS_IGNORE_MAC |
5411 I40E_AQC_ADD_CONTROL_PACKET_FLAGS_DROP |
5412 I40E_AQC_ADD_CONTROL_PACKET_FLAGS_TX;
5413 u16 ethtype = I40E_FLOW_CONTROL_ETHTYPE;
5414 enum i40e_status_code status;
5415
5416 status = i40e_aq_add_rem_control_packet_filter(hw, NULL, ethtype, flag,
5417 seid, 0, TRUE, NULL,
5418 NULL);
5419 if (status)
5420 DEBUGOUT("Ethtype Filter Add failed: Error pruning Tx flow control frames\n");
5421 }
5422
5423 /**
5424 * i40e_fix_up_geneve_vni - adjust Geneve VNI for HW issue
5425 * @filters: list of cloud filters
5426 * @filter_count: length of list
5427 *
5428 * There's an issue in the device where the Geneve VNI layout needs
5429 * to be shifted 1 byte over from the VxLAN VNI
5430 **/
i40e_fix_up_geneve_vni(struct i40e_aqc_add_remove_cloud_filters_element_data * filters,u8 filter_count)5431 static void i40e_fix_up_geneve_vni(
5432 struct i40e_aqc_add_remove_cloud_filters_element_data *filters,
5433 u8 filter_count)
5434 {
5435 struct i40e_aqc_add_remove_cloud_filters_element_data *f = filters;
5436 int i;
5437
5438 for (i = 0; i < filter_count; i++) {
5439 u16 tnl_type;
5440 u32 ti;
5441
5442 tnl_type = (LE16_TO_CPU(f[i].flags) &
5443 I40E_AQC_ADD_CLOUD_TNL_TYPE_MASK) >>
5444 I40E_AQC_ADD_CLOUD_TNL_TYPE_SHIFT;
5445 if (tnl_type == I40E_AQC_ADD_CLOUD_TNL_TYPE_GENEVE) {
5446 ti = LE32_TO_CPU(f[i].tenant_id);
5447 f[i].tenant_id = CPU_TO_LE32(ti << 8);
5448 }
5449 }
5450 }
5451
5452 /**
5453 * i40e_aq_add_cloud_filters
5454 * @hw: pointer to the hardware structure
5455 * @seid: VSI seid to add cloud filters from
5456 * @filters: Buffer which contains the filters to be added
5457 * @filter_count: number of filters contained in the buffer
5458 *
5459 * Set the cloud filters for a given VSI. The contents of the
5460 * i40e_aqc_add_remove_cloud_filters_element_data are filled
5461 * in by the caller of the function.
5462 *
5463 **/
i40e_aq_add_cloud_filters(struct i40e_hw * hw,u16 seid,struct i40e_aqc_add_remove_cloud_filters_element_data * filters,u8 filter_count)5464 enum i40e_status_code i40e_aq_add_cloud_filters(struct i40e_hw *hw,
5465 u16 seid,
5466 struct i40e_aqc_add_remove_cloud_filters_element_data *filters,
5467 u8 filter_count)
5468 {
5469 struct i40e_aq_desc desc;
5470 struct i40e_aqc_add_remove_cloud_filters *cmd =
5471 (struct i40e_aqc_add_remove_cloud_filters *)&desc.params.raw;
5472 enum i40e_status_code status;
5473 u16 buff_len;
5474
5475 i40e_fill_default_direct_cmd_desc(&desc,
5476 i40e_aqc_opc_add_cloud_filters);
5477
5478 buff_len = filter_count * sizeof(*filters);
5479 desc.datalen = CPU_TO_LE16(buff_len);
5480 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
5481 cmd->num_filters = filter_count;
5482 cmd->seid = CPU_TO_LE16(seid);
5483
5484 i40e_fix_up_geneve_vni(filters, filter_count);
5485
5486 status = i40e_asq_send_command(hw, &desc, filters, buff_len, NULL);
5487
5488 return status;
5489 }
5490
5491 /**
5492 * i40e_aq_remove_cloud_filters
5493 * @hw: pointer to the hardware structure
5494 * @seid: VSI seid to remove cloud filters from
5495 * @filters: Buffer which contains the filters to be removed
5496 * @filter_count: number of filters contained in the buffer
5497 *
5498 * Remove the cloud filters for a given VSI. The contents of the
5499 * i40e_aqc_add_remove_cloud_filters_element_data are filled
5500 * in by the caller of the function.
5501 *
5502 **/
i40e_aq_remove_cloud_filters(struct i40e_hw * hw,u16 seid,struct i40e_aqc_add_remove_cloud_filters_element_data * filters,u8 filter_count)5503 enum i40e_status_code i40e_aq_remove_cloud_filters(struct i40e_hw *hw,
5504 u16 seid,
5505 struct i40e_aqc_add_remove_cloud_filters_element_data *filters,
5506 u8 filter_count)
5507 {
5508 struct i40e_aq_desc desc;
5509 struct i40e_aqc_add_remove_cloud_filters *cmd =
5510 (struct i40e_aqc_add_remove_cloud_filters *)&desc.params.raw;
5511 enum i40e_status_code status;
5512 u16 buff_len;
5513
5514 i40e_fill_default_direct_cmd_desc(&desc,
5515 i40e_aqc_opc_remove_cloud_filters);
5516
5517 buff_len = filter_count * sizeof(*filters);
5518 desc.datalen = CPU_TO_LE16(buff_len);
5519 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD));
5520 cmd->num_filters = filter_count;
5521 cmd->seid = CPU_TO_LE16(seid);
5522
5523 i40e_fix_up_geneve_vni(filters, filter_count);
5524
5525 status = i40e_asq_send_command(hw, &desc, filters, buff_len, NULL);
5526
5527 return status;
5528 }
5529
5530 /**
5531 * i40e_aq_alternate_write
5532 * @hw: pointer to the hardware structure
5533 * @reg_addr0: address of first dword to be read
5534 * @reg_val0: value to be written under 'reg_addr0'
5535 * @reg_addr1: address of second dword to be read
5536 * @reg_val1: value to be written under 'reg_addr1'
5537 *
5538 * Write one or two dwords to alternate structure. Fields are indicated
5539 * by 'reg_addr0' and 'reg_addr1' register numbers.
5540 *
5541 **/
i40e_aq_alternate_write(struct i40e_hw * hw,u32 reg_addr0,u32 reg_val0,u32 reg_addr1,u32 reg_val1)5542 enum i40e_status_code i40e_aq_alternate_write(struct i40e_hw *hw,
5543 u32 reg_addr0, u32 reg_val0,
5544 u32 reg_addr1, u32 reg_val1)
5545 {
5546 struct i40e_aq_desc desc;
5547 struct i40e_aqc_alternate_write *cmd_resp =
5548 (struct i40e_aqc_alternate_write *)&desc.params.raw;
5549 enum i40e_status_code status;
5550
5551 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_alternate_write);
5552 cmd_resp->address0 = CPU_TO_LE32(reg_addr0);
5553 cmd_resp->address1 = CPU_TO_LE32(reg_addr1);
5554 cmd_resp->data0 = CPU_TO_LE32(reg_val0);
5555 cmd_resp->data1 = CPU_TO_LE32(reg_val1);
5556
5557 status = i40e_asq_send_command(hw, &desc, NULL, 0, NULL);
5558
5559 return status;
5560 }
5561
5562 /**
5563 * i40e_aq_alternate_write_indirect
5564 * @hw: pointer to the hardware structure
5565 * @addr: address of a first register to be modified
5566 * @dw_count: number of alternate structure fields to write
5567 * @buffer: pointer to the command buffer
5568 *
5569 * Write 'dw_count' dwords from 'buffer' to alternate structure
5570 * starting at 'addr'.
5571 *
5572 **/
i40e_aq_alternate_write_indirect(struct i40e_hw * hw,u32 addr,u32 dw_count,void * buffer)5573 enum i40e_status_code i40e_aq_alternate_write_indirect(struct i40e_hw *hw,
5574 u32 addr, u32 dw_count, void *buffer)
5575 {
5576 struct i40e_aq_desc desc;
5577 struct i40e_aqc_alternate_ind_write *cmd_resp =
5578 (struct i40e_aqc_alternate_ind_write *)&desc.params.raw;
5579 enum i40e_status_code status;
5580
5581 if (buffer == NULL)
5582 return I40E_ERR_PARAM;
5583
5584 /* Indirect command */
5585 i40e_fill_default_direct_cmd_desc(&desc,
5586 i40e_aqc_opc_alternate_write_indirect);
5587
5588 desc.flags |= CPU_TO_LE16(I40E_AQ_FLAG_RD);
5589 desc.flags |= CPU_TO_LE16(I40E_AQ_FLAG_BUF);
5590 if (dw_count > (I40E_AQ_LARGE_BUF/4))
5591 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
5592
5593 cmd_resp->address = CPU_TO_LE32(addr);
5594 cmd_resp->length = CPU_TO_LE32(dw_count);
5595
5596 status = i40e_asq_send_command(hw, &desc, buffer,
5597 I40E_LO_DWORD(4*dw_count), NULL);
5598
5599 return status;
5600 }
5601
5602 /**
5603 * i40e_aq_alternate_read
5604 * @hw: pointer to the hardware structure
5605 * @reg_addr0: address of first dword to be read
5606 * @reg_val0: pointer for data read from 'reg_addr0'
5607 * @reg_addr1: address of second dword to be read
5608 * @reg_val1: pointer for data read from 'reg_addr1'
5609 *
5610 * Read one or two dwords from alternate structure. Fields are indicated
5611 * by 'reg_addr0' and 'reg_addr1' register numbers. If 'reg_val1' pointer
5612 * is not passed then only register at 'reg_addr0' is read.
5613 *
5614 **/
i40e_aq_alternate_read(struct i40e_hw * hw,u32 reg_addr0,u32 * reg_val0,u32 reg_addr1,u32 * reg_val1)5615 enum i40e_status_code i40e_aq_alternate_read(struct i40e_hw *hw,
5616 u32 reg_addr0, u32 *reg_val0,
5617 u32 reg_addr1, u32 *reg_val1)
5618 {
5619 struct i40e_aq_desc desc;
5620 struct i40e_aqc_alternate_write *cmd_resp =
5621 (struct i40e_aqc_alternate_write *)&desc.params.raw;
5622 enum i40e_status_code status;
5623
5624 if (reg_val0 == NULL)
5625 return I40E_ERR_PARAM;
5626
5627 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_alternate_read);
5628 cmd_resp->address0 = CPU_TO_LE32(reg_addr0);
5629 cmd_resp->address1 = CPU_TO_LE32(reg_addr1);
5630
5631 status = i40e_asq_send_command(hw, &desc, NULL, 0, NULL);
5632
5633 if (status == I40E_SUCCESS) {
5634 *reg_val0 = LE32_TO_CPU(cmd_resp->data0);
5635
5636 if (reg_val1 != NULL)
5637 *reg_val1 = LE32_TO_CPU(cmd_resp->data1);
5638 }
5639
5640 return status;
5641 }
5642
5643 /**
5644 * i40e_aq_alternate_read_indirect
5645 * @hw: pointer to the hardware structure
5646 * @addr: address of the alternate structure field
5647 * @dw_count: number of alternate structure fields to read
5648 * @buffer: pointer to the command buffer
5649 *
5650 * Read 'dw_count' dwords from alternate structure starting at 'addr' and
5651 * place them in 'buffer'. The buffer should be allocated by caller.
5652 *
5653 **/
i40e_aq_alternate_read_indirect(struct i40e_hw * hw,u32 addr,u32 dw_count,void * buffer)5654 enum i40e_status_code i40e_aq_alternate_read_indirect(struct i40e_hw *hw,
5655 u32 addr, u32 dw_count, void *buffer)
5656 {
5657 struct i40e_aq_desc desc;
5658 struct i40e_aqc_alternate_ind_write *cmd_resp =
5659 (struct i40e_aqc_alternate_ind_write *)&desc.params.raw;
5660 enum i40e_status_code status;
5661
5662 if (buffer == NULL)
5663 return I40E_ERR_PARAM;
5664
5665 /* Indirect command */
5666 i40e_fill_default_direct_cmd_desc(&desc,
5667 i40e_aqc_opc_alternate_read_indirect);
5668
5669 desc.flags |= CPU_TO_LE16(I40E_AQ_FLAG_RD);
5670 desc.flags |= CPU_TO_LE16(I40E_AQ_FLAG_BUF);
5671 if (dw_count > (I40E_AQ_LARGE_BUF/4))
5672 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
5673
5674 cmd_resp->address = CPU_TO_LE32(addr);
5675 cmd_resp->length = CPU_TO_LE32(dw_count);
5676
5677 status = i40e_asq_send_command(hw, &desc, buffer,
5678 I40E_LO_DWORD(4*dw_count), NULL);
5679
5680 return status;
5681 }
5682
5683 /**
5684 * i40e_aq_alternate_clear
5685 * @hw: pointer to the HW structure.
5686 *
5687 * Clear the alternate structures of the port from which the function
5688 * is called.
5689 *
5690 **/
i40e_aq_alternate_clear(struct i40e_hw * hw)5691 enum i40e_status_code i40e_aq_alternate_clear(struct i40e_hw *hw)
5692 {
5693 struct i40e_aq_desc desc;
5694 enum i40e_status_code status;
5695
5696 i40e_fill_default_direct_cmd_desc(&desc,
5697 i40e_aqc_opc_alternate_clear_port);
5698
5699 status = i40e_asq_send_command(hw, &desc, NULL, 0, NULL);
5700
5701 return status;
5702 }
5703
5704 /**
5705 * i40e_aq_alternate_write_done
5706 * @hw: pointer to the HW structure.
5707 * @bios_mode: indicates whether the command is executed by UEFI or legacy BIOS
5708 * @reset_needed: indicates the SW should trigger GLOBAL reset
5709 *
5710 * Indicates to the FW that alternate structures have been changed.
5711 *
5712 **/
i40e_aq_alternate_write_done(struct i40e_hw * hw,u8 bios_mode,bool * reset_needed)5713 enum i40e_status_code i40e_aq_alternate_write_done(struct i40e_hw *hw,
5714 u8 bios_mode, bool *reset_needed)
5715 {
5716 struct i40e_aq_desc desc;
5717 struct i40e_aqc_alternate_write_done *cmd =
5718 (struct i40e_aqc_alternate_write_done *)&desc.params.raw;
5719 enum i40e_status_code status;
5720
5721 if (reset_needed == NULL)
5722 return I40E_ERR_PARAM;
5723
5724 i40e_fill_default_direct_cmd_desc(&desc,
5725 i40e_aqc_opc_alternate_write_done);
5726
5727 cmd->cmd_flags = CPU_TO_LE16(bios_mode);
5728
5729 status = i40e_asq_send_command(hw, &desc, NULL, 0, NULL);
5730 if (!status && reset_needed)
5731 *reset_needed = ((LE16_TO_CPU(cmd->cmd_flags) &
5732 I40E_AQ_ALTERNATE_RESET_NEEDED) != 0);
5733
5734 return status;
5735 }
5736
5737 /**
5738 * i40e_aq_set_oem_mode
5739 * @hw: pointer to the HW structure.
5740 * @oem_mode: the OEM mode to be used
5741 *
5742 * Sets the device to a specific operating mode. Currently the only supported
5743 * mode is no_clp, which causes FW to refrain from using Alternate RAM.
5744 *
5745 **/
i40e_aq_set_oem_mode(struct i40e_hw * hw,u8 oem_mode)5746 enum i40e_status_code i40e_aq_set_oem_mode(struct i40e_hw *hw,
5747 u8 oem_mode)
5748 {
5749 struct i40e_aq_desc desc;
5750 struct i40e_aqc_alternate_write_done *cmd =
5751 (struct i40e_aqc_alternate_write_done *)&desc.params.raw;
5752 enum i40e_status_code status;
5753
5754 i40e_fill_default_direct_cmd_desc(&desc,
5755 i40e_aqc_opc_alternate_set_mode);
5756
5757 cmd->cmd_flags = CPU_TO_LE16(oem_mode);
5758
5759 status = i40e_asq_send_command(hw, &desc, NULL, 0, NULL);
5760
5761 return status;
5762 }
5763
5764 /**
5765 * i40e_aq_resume_port_tx
5766 * @hw: pointer to the hardware structure
5767 * @cmd_details: pointer to command details structure or NULL
5768 *
5769 * Resume port's Tx traffic
5770 **/
i40e_aq_resume_port_tx(struct i40e_hw * hw,struct i40e_asq_cmd_details * cmd_details)5771 enum i40e_status_code i40e_aq_resume_port_tx(struct i40e_hw *hw,
5772 struct i40e_asq_cmd_details *cmd_details)
5773 {
5774 struct i40e_aq_desc desc;
5775 enum i40e_status_code status;
5776
5777 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_resume_port_tx);
5778
5779 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
5780
5781 return status;
5782 }
5783
5784 /**
5785 * i40e_set_pci_config_data - store PCI bus info
5786 * @hw: pointer to hardware structure
5787 * @link_status: the link status word from PCI config space
5788 *
5789 * Stores the PCI bus info (speed, width, type) within the i40e_hw structure
5790 **/
i40e_set_pci_config_data(struct i40e_hw * hw,u16 link_status)5791 void i40e_set_pci_config_data(struct i40e_hw *hw, u16 link_status)
5792 {
5793 hw->bus.type = i40e_bus_type_pci_express;
5794
5795 switch (link_status & I40E_PCI_LINK_WIDTH) {
5796 case I40E_PCI_LINK_WIDTH_1:
5797 hw->bus.width = i40e_bus_width_pcie_x1;
5798 break;
5799 case I40E_PCI_LINK_WIDTH_2:
5800 hw->bus.width = i40e_bus_width_pcie_x2;
5801 break;
5802 case I40E_PCI_LINK_WIDTH_4:
5803 hw->bus.width = i40e_bus_width_pcie_x4;
5804 break;
5805 case I40E_PCI_LINK_WIDTH_8:
5806 hw->bus.width = i40e_bus_width_pcie_x8;
5807 break;
5808 default:
5809 hw->bus.width = i40e_bus_width_unknown;
5810 break;
5811 }
5812
5813 switch (link_status & I40E_PCI_LINK_SPEED) {
5814 case I40E_PCI_LINK_SPEED_2500:
5815 hw->bus.speed = i40e_bus_speed_2500;
5816 break;
5817 case I40E_PCI_LINK_SPEED_5000:
5818 hw->bus.speed = i40e_bus_speed_5000;
5819 break;
5820 case I40E_PCI_LINK_SPEED_8000:
5821 hw->bus.speed = i40e_bus_speed_8000;
5822 break;
5823 default:
5824 hw->bus.speed = i40e_bus_speed_unknown;
5825 break;
5826 }
5827 }
5828
5829 /**
5830 * i40e_aq_debug_dump
5831 * @hw: pointer to the hardware structure
5832 * @cluster_id: specific cluster to dump
5833 * @table_id: table id within cluster
5834 * @start_index: index of line in the block to read
5835 * @buff_size: dump buffer size
5836 * @buff: dump buffer
5837 * @ret_buff_size: actual buffer size returned
5838 * @ret_next_table: next block to read
5839 * @ret_next_index: next index to read
5840 *
5841 * Dump internal FW/HW data for debug purposes.
5842 *
5843 **/
i40e_aq_debug_dump(struct i40e_hw * hw,u8 cluster_id,u8 table_id,u32 start_index,u16 buff_size,void * buff,u16 * ret_buff_size,u8 * ret_next_table,u32 * ret_next_index,struct i40e_asq_cmd_details * cmd_details)5844 enum i40e_status_code i40e_aq_debug_dump(struct i40e_hw *hw, u8 cluster_id,
5845 u8 table_id, u32 start_index, u16 buff_size,
5846 void *buff, u16 *ret_buff_size,
5847 u8 *ret_next_table, u32 *ret_next_index,
5848 struct i40e_asq_cmd_details *cmd_details)
5849 {
5850 struct i40e_aq_desc desc;
5851 struct i40e_aqc_debug_dump_internals *cmd =
5852 (struct i40e_aqc_debug_dump_internals *)&desc.params.raw;
5853 struct i40e_aqc_debug_dump_internals *resp =
5854 (struct i40e_aqc_debug_dump_internals *)&desc.params.raw;
5855 enum i40e_status_code status;
5856
5857 if (buff_size == 0 || !buff)
5858 return I40E_ERR_PARAM;
5859
5860 i40e_fill_default_direct_cmd_desc(&desc,
5861 i40e_aqc_opc_debug_dump_internals);
5862 /* Indirect Command */
5863 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
5864 if (buff_size > I40E_AQ_LARGE_BUF)
5865 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB);
5866
5867 cmd->cluster_id = cluster_id;
5868 cmd->table_id = table_id;
5869 cmd->idx = CPU_TO_LE32(start_index);
5870
5871 desc.datalen = CPU_TO_LE16(buff_size);
5872
5873 status = i40e_asq_send_command(hw, &desc, buff, buff_size, cmd_details);
5874 if (!status) {
5875 if (ret_buff_size != NULL)
5876 *ret_buff_size = LE16_TO_CPU(desc.datalen);
5877 if (ret_next_table != NULL)
5878 *ret_next_table = resp->table_id;
5879 if (ret_next_index != NULL)
5880 *ret_next_index = LE32_TO_CPU(resp->idx);
5881 }
5882
5883 return status;
5884 }
5885
5886 /**
5887 * i40e_read_bw_from_alt_ram
5888 * @hw: pointer to the hardware structure
5889 * @max_bw: pointer for max_bw read
5890 * @min_bw: pointer for min_bw read
5891 * @min_valid: pointer for bool that is TRUE if min_bw is a valid value
5892 * @max_valid: pointer for bool that is TRUE if max_bw is a valid value
5893 *
5894 * Read bw from the alternate ram for the given pf
5895 **/
i40e_read_bw_from_alt_ram(struct i40e_hw * hw,u32 * max_bw,u32 * min_bw,bool * min_valid,bool * max_valid)5896 enum i40e_status_code i40e_read_bw_from_alt_ram(struct i40e_hw *hw,
5897 u32 *max_bw, u32 *min_bw,
5898 bool *min_valid, bool *max_valid)
5899 {
5900 enum i40e_status_code status;
5901 u32 max_bw_addr, min_bw_addr;
5902
5903 /* Calculate the address of the min/max bw registers */
5904 max_bw_addr = I40E_ALT_STRUCT_FIRST_PF_OFFSET +
5905 I40E_ALT_STRUCT_MAX_BW_OFFSET +
5906 (I40E_ALT_STRUCT_DWORDS_PER_PF * hw->pf_id);
5907 min_bw_addr = I40E_ALT_STRUCT_FIRST_PF_OFFSET +
5908 I40E_ALT_STRUCT_MIN_BW_OFFSET +
5909 (I40E_ALT_STRUCT_DWORDS_PER_PF * hw->pf_id);
5910
5911 /* Read the bandwidths from alt ram */
5912 status = i40e_aq_alternate_read(hw, max_bw_addr, max_bw,
5913 min_bw_addr, min_bw);
5914
5915 if (*min_bw & I40E_ALT_BW_VALID_MASK)
5916 *min_valid = TRUE;
5917 else
5918 *min_valid = FALSE;
5919
5920 if (*max_bw & I40E_ALT_BW_VALID_MASK)
5921 *max_valid = TRUE;
5922 else
5923 *max_valid = FALSE;
5924
5925 return status;
5926 }
5927
5928 /**
5929 * i40e_aq_configure_partition_bw
5930 * @hw: pointer to the hardware structure
5931 * @bw_data: Buffer holding valid pfs and bw limits
5932 * @cmd_details: pointer to command details
5933 *
5934 * Configure partitions guaranteed/max bw
5935 **/
i40e_aq_configure_partition_bw(struct i40e_hw * hw,struct i40e_aqc_configure_partition_bw_data * bw_data,struct i40e_asq_cmd_details * cmd_details)5936 enum i40e_status_code i40e_aq_configure_partition_bw(struct i40e_hw *hw,
5937 struct i40e_aqc_configure_partition_bw_data *bw_data,
5938 struct i40e_asq_cmd_details *cmd_details)
5939 {
5940 enum i40e_status_code status;
5941 struct i40e_aq_desc desc;
5942 u16 bwd_size = sizeof(*bw_data);
5943
5944 i40e_fill_default_direct_cmd_desc(&desc,
5945 i40e_aqc_opc_configure_partition_bw);
5946
5947 /* Indirect command */
5948 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF);
5949 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_RD);
5950
5951 desc.datalen = CPU_TO_LE16(bwd_size);
5952
5953 status = i40e_asq_send_command(hw, &desc, bw_data, bwd_size, cmd_details);
5954
5955 return status;
5956 }
5957
5958 /**
5959 * i40e_read_phy_register_clause22
5960 * @hw: pointer to the HW structure
5961 * @reg: register address in the page
5962 * @phy_adr: PHY address on MDIO interface
5963 * @value: PHY register value
5964 *
5965 * Reads specified PHY register value
5966 **/
i40e_read_phy_register_clause22(struct i40e_hw * hw,u16 reg,u8 phy_addr,u16 * value)5967 enum i40e_status_code i40e_read_phy_register_clause22(struct i40e_hw *hw,
5968 u16 reg, u8 phy_addr, u16 *value)
5969 {
5970 enum i40e_status_code status = I40E_ERR_TIMEOUT;
5971 u8 port_num = (u8)hw->func_caps.mdio_port_num;
5972 u32 command = 0;
5973 u16 retry = 1000;
5974
5975 command = (reg << I40E_GLGEN_MSCA_DEVADD_SHIFT) |
5976 (phy_addr << I40E_GLGEN_MSCA_PHYADD_SHIFT) |
5977 (I40E_MDIO_CLAUSE22_OPCODE_READ_MASK) |
5978 (I40E_MDIO_CLAUSE22_STCODE_MASK) |
5979 (I40E_GLGEN_MSCA_MDICMD_MASK);
5980 wr32(hw, I40E_GLGEN_MSCA(port_num), command);
5981 do {
5982 command = rd32(hw, I40E_GLGEN_MSCA(port_num));
5983 if (!(command & I40E_GLGEN_MSCA_MDICMD_MASK)) {
5984 status = I40E_SUCCESS;
5985 break;
5986 }
5987 i40e_usec_delay(10);
5988 retry--;
5989 } while (retry);
5990
5991 if (status) {
5992 i40e_debug(hw, I40E_DEBUG_PHY,
5993 "PHY: Can't write command to external PHY.\n");
5994 } else {
5995 command = rd32(hw, I40E_GLGEN_MSRWD(port_num));
5996 *value = (command & I40E_GLGEN_MSRWD_MDIRDDATA_MASK) >>
5997 I40E_GLGEN_MSRWD_MDIRDDATA_SHIFT;
5998 }
5999
6000 return status;
6001 }
6002
6003 /**
6004 * i40e_write_phy_register_clause22
6005 * @hw: pointer to the HW structure
6006 * @reg: register address in the page
6007 * @phy_adr: PHY address on MDIO interface
6008 * @value: PHY register value
6009 *
6010 * Writes specified PHY register value
6011 **/
i40e_write_phy_register_clause22(struct i40e_hw * hw,u16 reg,u8 phy_addr,u16 value)6012 enum i40e_status_code i40e_write_phy_register_clause22(struct i40e_hw *hw,
6013 u16 reg, u8 phy_addr, u16 value)
6014 {
6015 enum i40e_status_code status = I40E_ERR_TIMEOUT;
6016 u8 port_num = (u8)hw->func_caps.mdio_port_num;
6017 u32 command = 0;
6018 u16 retry = 1000;
6019
6020 command = value << I40E_GLGEN_MSRWD_MDIWRDATA_SHIFT;
6021 wr32(hw, I40E_GLGEN_MSRWD(port_num), command);
6022
6023 command = (reg << I40E_GLGEN_MSCA_DEVADD_SHIFT) |
6024 (phy_addr << I40E_GLGEN_MSCA_PHYADD_SHIFT) |
6025 (I40E_MDIO_CLAUSE22_OPCODE_WRITE_MASK) |
6026 (I40E_MDIO_CLAUSE22_STCODE_MASK) |
6027 (I40E_GLGEN_MSCA_MDICMD_MASK);
6028
6029 wr32(hw, I40E_GLGEN_MSCA(port_num), command);
6030 do {
6031 command = rd32(hw, I40E_GLGEN_MSCA(port_num));
6032 if (!(command & I40E_GLGEN_MSCA_MDICMD_MASK)) {
6033 status = I40E_SUCCESS;
6034 break;
6035 }
6036 i40e_usec_delay(10);
6037 retry--;
6038 } while (retry);
6039
6040 return status;
6041 }
6042
6043 /**
6044 * i40e_read_phy_register_clause45
6045 * @hw: pointer to the HW structure
6046 * @page: registers page number
6047 * @reg: register address in the page
6048 * @phy_adr: PHY address on MDIO interface
6049 * @value: PHY register value
6050 *
6051 * Reads specified PHY register value
6052 **/
i40e_read_phy_register_clause45(struct i40e_hw * hw,u8 page,u16 reg,u8 phy_addr,u16 * value)6053 enum i40e_status_code i40e_read_phy_register_clause45(struct i40e_hw *hw,
6054 u8 page, u16 reg, u8 phy_addr, u16 *value)
6055 {
6056 enum i40e_status_code status = I40E_ERR_TIMEOUT;
6057 u32 command = 0;
6058 u16 retry = 1000;
6059 u8 port_num = (u8)hw->func_caps.mdio_port_num;
6060
6061 command = (reg << I40E_GLGEN_MSCA_MDIADD_SHIFT) |
6062 (page << I40E_GLGEN_MSCA_DEVADD_SHIFT) |
6063 (phy_addr << I40E_GLGEN_MSCA_PHYADD_SHIFT) |
6064 (I40E_MDIO_CLAUSE45_OPCODE_ADDRESS_MASK) |
6065 (I40E_MDIO_CLAUSE45_STCODE_MASK) |
6066 (I40E_GLGEN_MSCA_MDICMD_MASK) |
6067 (I40E_GLGEN_MSCA_MDIINPROGEN_MASK);
6068 wr32(hw, I40E_GLGEN_MSCA(port_num), command);
6069 do {
6070 command = rd32(hw, I40E_GLGEN_MSCA(port_num));
6071 if (!(command & I40E_GLGEN_MSCA_MDICMD_MASK)) {
6072 status = I40E_SUCCESS;
6073 break;
6074 }
6075 i40e_usec_delay(10);
6076 retry--;
6077 } while (retry);
6078
6079 if (status) {
6080 i40e_debug(hw, I40E_DEBUG_PHY,
6081 "PHY: Can't write command to external PHY.\n");
6082 goto phy_read_end;
6083 }
6084
6085 command = (page << I40E_GLGEN_MSCA_DEVADD_SHIFT) |
6086 (phy_addr << I40E_GLGEN_MSCA_PHYADD_SHIFT) |
6087 (I40E_MDIO_CLAUSE45_OPCODE_READ_MASK) |
6088 (I40E_MDIO_CLAUSE45_STCODE_MASK) |
6089 (I40E_GLGEN_MSCA_MDICMD_MASK) |
6090 (I40E_GLGEN_MSCA_MDIINPROGEN_MASK);
6091 status = I40E_ERR_TIMEOUT;
6092 retry = 1000;
6093 wr32(hw, I40E_GLGEN_MSCA(port_num), command);
6094 do {
6095 command = rd32(hw, I40E_GLGEN_MSCA(port_num));
6096 if (!(command & I40E_GLGEN_MSCA_MDICMD_MASK)) {
6097 status = I40E_SUCCESS;
6098 break;
6099 }
6100 i40e_usec_delay(10);
6101 retry--;
6102 } while (retry);
6103
6104 if (!status) {
6105 command = rd32(hw, I40E_GLGEN_MSRWD(port_num));
6106 *value = (command & I40E_GLGEN_MSRWD_MDIRDDATA_MASK) >>
6107 I40E_GLGEN_MSRWD_MDIRDDATA_SHIFT;
6108 } else {
6109 i40e_debug(hw, I40E_DEBUG_PHY,
6110 "PHY: Can't read register value from external PHY.\n");
6111 }
6112
6113 phy_read_end:
6114 return status;
6115 }
6116
6117 /**
6118 * i40e_write_phy_register_clause45
6119 * @hw: pointer to the HW structure
6120 * @page: registers page number
6121 * @reg: register address in the page
6122 * @phy_adr: PHY address on MDIO interface
6123 * @value: PHY register value
6124 *
6125 * Writes value to specified PHY register
6126 **/
i40e_write_phy_register_clause45(struct i40e_hw * hw,u8 page,u16 reg,u8 phy_addr,u16 value)6127 enum i40e_status_code i40e_write_phy_register_clause45(struct i40e_hw *hw,
6128 u8 page, u16 reg, u8 phy_addr, u16 value)
6129 {
6130 enum i40e_status_code status = I40E_ERR_TIMEOUT;
6131 u32 command = 0;
6132 u16 retry = 1000;
6133 u8 port_num = (u8)hw->func_caps.mdio_port_num;
6134
6135 command = (reg << I40E_GLGEN_MSCA_MDIADD_SHIFT) |
6136 (page << I40E_GLGEN_MSCA_DEVADD_SHIFT) |
6137 (phy_addr << I40E_GLGEN_MSCA_PHYADD_SHIFT) |
6138 (I40E_MDIO_CLAUSE45_OPCODE_ADDRESS_MASK) |
6139 (I40E_MDIO_CLAUSE45_STCODE_MASK) |
6140 (I40E_GLGEN_MSCA_MDICMD_MASK) |
6141 (I40E_GLGEN_MSCA_MDIINPROGEN_MASK);
6142 wr32(hw, I40E_GLGEN_MSCA(port_num), command);
6143 do {
6144 command = rd32(hw, I40E_GLGEN_MSCA(port_num));
6145 if (!(command & I40E_GLGEN_MSCA_MDICMD_MASK)) {
6146 status = I40E_SUCCESS;
6147 break;
6148 }
6149 i40e_usec_delay(10);
6150 retry--;
6151 } while (retry);
6152 if (status) {
6153 i40e_debug(hw, I40E_DEBUG_PHY,
6154 "PHY: Can't write command to external PHY.\n");
6155 goto phy_write_end;
6156 }
6157
6158 command = value << I40E_GLGEN_MSRWD_MDIWRDATA_SHIFT;
6159 wr32(hw, I40E_GLGEN_MSRWD(port_num), command);
6160
6161 command = (page << I40E_GLGEN_MSCA_DEVADD_SHIFT) |
6162 (phy_addr << I40E_GLGEN_MSCA_PHYADD_SHIFT) |
6163 (I40E_MDIO_CLAUSE45_OPCODE_WRITE_MASK) |
6164 (I40E_MDIO_CLAUSE45_STCODE_MASK) |
6165 (I40E_GLGEN_MSCA_MDICMD_MASK) |
6166 (I40E_GLGEN_MSCA_MDIINPROGEN_MASK);
6167 status = I40E_ERR_TIMEOUT;
6168 retry = 1000;
6169 wr32(hw, I40E_GLGEN_MSCA(port_num), command);
6170 do {
6171 command = rd32(hw, I40E_GLGEN_MSCA(port_num));
6172 if (!(command & I40E_GLGEN_MSCA_MDICMD_MASK)) {
6173 status = I40E_SUCCESS;
6174 break;
6175 }
6176 i40e_usec_delay(10);
6177 retry--;
6178 } while (retry);
6179
6180 phy_write_end:
6181 return status;
6182 }
6183
6184 /**
6185 * i40e_write_phy_register
6186 * @hw: pointer to the HW structure
6187 * @page: registers page number
6188 * @reg: register address in the page
6189 * @phy_adr: PHY address on MDIO interface
6190 * @value: PHY register value
6191 *
6192 * Writes value to specified PHY register
6193 **/
i40e_write_phy_register(struct i40e_hw * hw,u8 page,u16 reg,u8 phy_addr,u16 value)6194 enum i40e_status_code i40e_write_phy_register(struct i40e_hw *hw,
6195 u8 page, u16 reg, u8 phy_addr, u16 value)
6196 {
6197 enum i40e_status_code status;
6198
6199 switch (hw->device_id) {
6200 case I40E_DEV_ID_1G_BASE_T_X722:
6201 status = i40e_write_phy_register_clause22(hw,
6202 reg, phy_addr, value);
6203 break;
6204 case I40E_DEV_ID_10G_BASE_T:
6205 case I40E_DEV_ID_10G_BASE_T4:
6206 case I40E_DEV_ID_10G_BASE_T_X722:
6207 case I40E_DEV_ID_25G_B:
6208 case I40E_DEV_ID_25G_SFP28:
6209 status = i40e_write_phy_register_clause45(hw,
6210 page, reg, phy_addr, value);
6211 break;
6212 default:
6213 status = I40E_ERR_UNKNOWN_PHY;
6214 break;
6215 }
6216
6217 return status;
6218 }
6219
6220 /**
6221 * i40e_read_phy_register
6222 * @hw: pointer to the HW structure
6223 * @page: registers page number
6224 * @reg: register address in the page
6225 * @phy_adr: PHY address on MDIO interface
6226 * @value: PHY register value
6227 *
6228 * Reads specified PHY register value
6229 **/
i40e_read_phy_register(struct i40e_hw * hw,u8 page,u16 reg,u8 phy_addr,u16 * value)6230 enum i40e_status_code i40e_read_phy_register(struct i40e_hw *hw,
6231 u8 page, u16 reg, u8 phy_addr, u16 *value)
6232 {
6233 enum i40e_status_code status;
6234
6235 switch (hw->device_id) {
6236 case I40E_DEV_ID_1G_BASE_T_X722:
6237 status = i40e_read_phy_register_clause22(hw, reg, phy_addr,
6238 value);
6239 break;
6240 case I40E_DEV_ID_10G_BASE_T:
6241 case I40E_DEV_ID_10G_BASE_T4:
6242 case I40E_DEV_ID_10G_BASE_T_X722:
6243 case I40E_DEV_ID_25G_B:
6244 case I40E_DEV_ID_25G_SFP28:
6245 status = i40e_read_phy_register_clause45(hw, page, reg,
6246 phy_addr, value);
6247 break;
6248 default:
6249 status = I40E_ERR_UNKNOWN_PHY;
6250 break;
6251 }
6252
6253 return status;
6254 }
6255
6256 /**
6257 * i40e_get_phy_address
6258 * @hw: pointer to the HW structure
6259 * @dev_num: PHY port num that address we want
6260 * @phy_addr: Returned PHY address
6261 *
6262 * Gets PHY address for current port
6263 **/
i40e_get_phy_address(struct i40e_hw * hw,u8 dev_num)6264 u8 i40e_get_phy_address(struct i40e_hw *hw, u8 dev_num)
6265 {
6266 u8 port_num = (u8)hw->func_caps.mdio_port_num;
6267 u32 reg_val = rd32(hw, I40E_GLGEN_MDIO_I2C_SEL(port_num));
6268
6269 return (u8)(reg_val >> ((dev_num + 1) * 5)) & 0x1f;
6270 }
6271
6272 /**
6273 * i40e_blink_phy_led
6274 * @hw: pointer to the HW structure
6275 * @time: time how long led will blinks in secs
6276 * @interval: gap between LED on and off in msecs
6277 *
6278 * Blinks PHY link LED
6279 **/
i40e_blink_phy_link_led(struct i40e_hw * hw,u32 time,u32 interval)6280 enum i40e_status_code i40e_blink_phy_link_led(struct i40e_hw *hw,
6281 u32 time, u32 interval)
6282 {
6283 enum i40e_status_code status = I40E_SUCCESS;
6284 u32 i;
6285 u16 led_ctl = 0;
6286 u16 gpio_led_port;
6287 u16 led_reg;
6288 u16 led_addr = I40E_PHY_LED_PROV_REG_1;
6289 u8 phy_addr = 0;
6290 u8 port_num;
6291
6292 i = rd32(hw, I40E_PFGEN_PORTNUM);
6293 port_num = (u8)(i & I40E_PFGEN_PORTNUM_PORT_NUM_MASK);
6294 phy_addr = i40e_get_phy_address(hw, port_num);
6295
6296 for (gpio_led_port = 0; gpio_led_port < 3; gpio_led_port++,
6297 led_addr++) {
6298 status = i40e_read_phy_register_clause45(hw,
6299 I40E_PHY_COM_REG_PAGE,
6300 led_addr, phy_addr,
6301 &led_reg);
6302 if (status)
6303 goto phy_blinking_end;
6304 led_ctl = led_reg;
6305 if (led_reg & I40E_PHY_LED_LINK_MODE_MASK) {
6306 led_reg = 0;
6307 status = i40e_write_phy_register_clause45(hw,
6308 I40E_PHY_COM_REG_PAGE,
6309 led_addr, phy_addr,
6310 led_reg);
6311 if (status)
6312 goto phy_blinking_end;
6313 break;
6314 }
6315 }
6316
6317 if (time > 0 && interval > 0) {
6318 for (i = 0; i < time * 1000; i += interval) {
6319 status = i40e_read_phy_register_clause45(hw,
6320 I40E_PHY_COM_REG_PAGE,
6321 led_addr, phy_addr, &led_reg);
6322 if (status)
6323 goto restore_config;
6324 if (led_reg & I40E_PHY_LED_MANUAL_ON)
6325 led_reg = 0;
6326 else
6327 led_reg = I40E_PHY_LED_MANUAL_ON;
6328 status = i40e_write_phy_register_clause45(hw,
6329 I40E_PHY_COM_REG_PAGE,
6330 led_addr, phy_addr, led_reg);
6331 if (status)
6332 goto restore_config;
6333 i40e_msec_delay(interval);
6334 }
6335 }
6336
6337 restore_config:
6338 status = i40e_write_phy_register_clause45(hw,
6339 I40E_PHY_COM_REG_PAGE,
6340 led_addr, phy_addr, led_ctl);
6341
6342 phy_blinking_end:
6343 return status;
6344 }
6345
6346 /**
6347 * i40e_led_get_phy - return current on/off mode
6348 * @hw: pointer to the hw struct
6349 * @led_addr: address of led register to use
6350 * @val: original value of register to use
6351 *
6352 **/
i40e_led_get_phy(struct i40e_hw * hw,u16 * led_addr,u16 * val)6353 enum i40e_status_code i40e_led_get_phy(struct i40e_hw *hw, u16 *led_addr,
6354 u16 *val)
6355 {
6356 enum i40e_status_code status = I40E_SUCCESS;
6357 u16 gpio_led_port;
6358 u8 phy_addr = 0;
6359 u16 reg_val;
6360 u16 temp_addr;
6361 u8 port_num;
6362 u32 i;
6363
6364 temp_addr = I40E_PHY_LED_PROV_REG_1;
6365 i = rd32(hw, I40E_PFGEN_PORTNUM);
6366 port_num = (u8)(i & I40E_PFGEN_PORTNUM_PORT_NUM_MASK);
6367 phy_addr = i40e_get_phy_address(hw, port_num);
6368
6369 for (gpio_led_port = 0; gpio_led_port < 3; gpio_led_port++,
6370 temp_addr++) {
6371 status = i40e_read_phy_register_clause45(hw,
6372 I40E_PHY_COM_REG_PAGE,
6373 temp_addr, phy_addr,
6374 ®_val);
6375 if (status)
6376 return status;
6377 *val = reg_val;
6378 if (reg_val & I40E_PHY_LED_LINK_MODE_MASK) {
6379 *led_addr = temp_addr;
6380 break;
6381 }
6382 }
6383 return status;
6384 }
6385
6386 /**
6387 * i40e_led_set_phy
6388 * @hw: pointer to the HW structure
6389 * @on: TRUE or FALSE
6390 * @mode: original val plus bit for set or ignore
6391 * Set led's on or off when controlled by the PHY
6392 *
6393 **/
i40e_led_set_phy(struct i40e_hw * hw,bool on,u16 led_addr,u32 mode)6394 enum i40e_status_code i40e_led_set_phy(struct i40e_hw *hw, bool on,
6395 u16 led_addr, u32 mode)
6396 {
6397 enum i40e_status_code status = I40E_SUCCESS;
6398 u16 led_ctl = 0;
6399 u16 led_reg = 0;
6400 u8 phy_addr = 0;
6401 u8 port_num;
6402 u32 i;
6403
6404 i = rd32(hw, I40E_PFGEN_PORTNUM);
6405 port_num = (u8)(i & I40E_PFGEN_PORTNUM_PORT_NUM_MASK);
6406 phy_addr = i40e_get_phy_address(hw, port_num);
6407 status = i40e_read_phy_register_clause45(hw, I40E_PHY_COM_REG_PAGE,
6408 led_addr, phy_addr, &led_reg);
6409 if (status)
6410 return status;
6411 led_ctl = led_reg;
6412 if (led_reg & I40E_PHY_LED_LINK_MODE_MASK) {
6413 led_reg = 0;
6414 status = i40e_write_phy_register_clause45(hw,
6415 I40E_PHY_COM_REG_PAGE,
6416 led_addr, phy_addr,
6417 led_reg);
6418 if (status)
6419 return status;
6420 }
6421 status = i40e_read_phy_register_clause45(hw, I40E_PHY_COM_REG_PAGE,
6422 led_addr, phy_addr, &led_reg);
6423 if (status)
6424 goto restore_config;
6425 if (on)
6426 led_reg = I40E_PHY_LED_MANUAL_ON;
6427 else
6428 led_reg = 0;
6429 status = i40e_write_phy_register_clause45(hw, I40E_PHY_COM_REG_PAGE,
6430 led_addr, phy_addr, led_reg);
6431 if (status)
6432 goto restore_config;
6433 if (mode & I40E_PHY_LED_MODE_ORIG) {
6434 led_ctl = (mode & I40E_PHY_LED_MODE_MASK);
6435 status = i40e_write_phy_register_clause45(hw,
6436 I40E_PHY_COM_REG_PAGE,
6437 led_addr, phy_addr, led_ctl);
6438 }
6439 return status;
6440 restore_config:
6441 status = i40e_write_phy_register_clause45(hw, I40E_PHY_COM_REG_PAGE,
6442 led_addr, phy_addr, led_ctl);
6443 return status;
6444 }
6445
6446 /**
6447 * i40e_aq_rx_ctl_read_register - use FW to read from an Rx control register
6448 * @hw: pointer to the hw struct
6449 * @reg_addr: register address
6450 * @reg_val: ptr to register value
6451 * @cmd_details: pointer to command details structure or NULL
6452 *
6453 * Use the firmware to read the Rx control register,
6454 * especially useful if the Rx unit is under heavy pressure
6455 **/
i40e_aq_rx_ctl_read_register(struct i40e_hw * hw,u32 reg_addr,u32 * reg_val,struct i40e_asq_cmd_details * cmd_details)6456 enum i40e_status_code i40e_aq_rx_ctl_read_register(struct i40e_hw *hw,
6457 u32 reg_addr, u32 *reg_val,
6458 struct i40e_asq_cmd_details *cmd_details)
6459 {
6460 struct i40e_aq_desc desc;
6461 struct i40e_aqc_rx_ctl_reg_read_write *cmd_resp =
6462 (struct i40e_aqc_rx_ctl_reg_read_write *)&desc.params.raw;
6463 enum i40e_status_code status;
6464
6465 if (reg_val == NULL)
6466 return I40E_ERR_PARAM;
6467
6468 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_rx_ctl_reg_read);
6469
6470 cmd_resp->address = CPU_TO_LE32(reg_addr);
6471
6472 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
6473
6474 if (status == I40E_SUCCESS)
6475 *reg_val = LE32_TO_CPU(cmd_resp->value);
6476
6477 return status;
6478 }
6479
6480 /**
6481 * i40e_read_rx_ctl - read from an Rx control register
6482 * @hw: pointer to the hw struct
6483 * @reg_addr: register address
6484 **/
i40e_read_rx_ctl(struct i40e_hw * hw,u32 reg_addr)6485 u32 i40e_read_rx_ctl(struct i40e_hw *hw, u32 reg_addr)
6486 {
6487 enum i40e_status_code status = I40E_SUCCESS;
6488 bool use_register;
6489 int retry = 5;
6490 u32 val = 0;
6491
6492 use_register = (hw->aq.api_maj_ver == 1) && (hw->aq.api_min_ver < 5);
6493 if (!use_register) {
6494 do_retry:
6495 status = i40e_aq_rx_ctl_read_register(hw, reg_addr, &val, NULL);
6496 if (hw->aq.asq_last_status == I40E_AQ_RC_EAGAIN && retry) {
6497 i40e_msec_delay(1);
6498 retry--;
6499 goto do_retry;
6500 }
6501 }
6502
6503 /* if the AQ access failed, try the old-fashioned way */
6504 if (status || use_register)
6505 val = rd32(hw, reg_addr);
6506
6507 return val;
6508 }
6509
6510 /**
6511 * i40e_aq_rx_ctl_write_register
6512 * @hw: pointer to the hw struct
6513 * @reg_addr: register address
6514 * @reg_val: register value
6515 * @cmd_details: pointer to command details structure or NULL
6516 *
6517 * Use the firmware to write to an Rx control register,
6518 * especially useful if the Rx unit is under heavy pressure
6519 **/
i40e_aq_rx_ctl_write_register(struct i40e_hw * hw,u32 reg_addr,u32 reg_val,struct i40e_asq_cmd_details * cmd_details)6520 enum i40e_status_code i40e_aq_rx_ctl_write_register(struct i40e_hw *hw,
6521 u32 reg_addr, u32 reg_val,
6522 struct i40e_asq_cmd_details *cmd_details)
6523 {
6524 struct i40e_aq_desc desc;
6525 struct i40e_aqc_rx_ctl_reg_read_write *cmd =
6526 (struct i40e_aqc_rx_ctl_reg_read_write *)&desc.params.raw;
6527 enum i40e_status_code status;
6528
6529 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_rx_ctl_reg_write);
6530
6531 cmd->address = CPU_TO_LE32(reg_addr);
6532 cmd->value = CPU_TO_LE32(reg_val);
6533
6534 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
6535
6536 return status;
6537 }
6538
6539 /**
6540 * i40e_write_rx_ctl - write to an Rx control register
6541 * @hw: pointer to the hw struct
6542 * @reg_addr: register address
6543 * @reg_val: register value
6544 **/
i40e_write_rx_ctl(struct i40e_hw * hw,u32 reg_addr,u32 reg_val)6545 void i40e_write_rx_ctl(struct i40e_hw *hw, u32 reg_addr, u32 reg_val)
6546 {
6547 enum i40e_status_code status = I40E_SUCCESS;
6548 bool use_register;
6549 int retry = 5;
6550
6551 use_register = (hw->aq.api_maj_ver == 1) && (hw->aq.api_min_ver < 5);
6552 if (!use_register) {
6553 do_retry:
6554 status = i40e_aq_rx_ctl_write_register(hw, reg_addr,
6555 reg_val, NULL);
6556 if (hw->aq.asq_last_status == I40E_AQ_RC_EAGAIN && retry) {
6557 i40e_msec_delay(1);
6558 retry--;
6559 goto do_retry;
6560 }
6561 }
6562
6563 /* if the AQ access failed, try the old-fashioned way */
6564 if (status || use_register)
6565 wr32(hw, reg_addr, reg_val);
6566 }
6567
6568
6569 /**
6570 * i40e_aq_set_phy_register
6571 * @hw: pointer to the hw struct
6572 * @phy_select: select which phy should be accessed
6573 * @dev_addr: PHY device address
6574 * @reg_addr: PHY register address
6575 * @reg_val: new register value
6576 * @cmd_details: pointer to command details structure or NULL
6577 *
6578 * Write the external PHY register.
6579 **/
i40e_aq_set_phy_register(struct i40e_hw * hw,u8 phy_select,u8 dev_addr,u32 reg_addr,u32 reg_val,struct i40e_asq_cmd_details * cmd_details)6580 enum i40e_status_code i40e_aq_set_phy_register(struct i40e_hw *hw,
6581 u8 phy_select, u8 dev_addr,
6582 u32 reg_addr, u32 reg_val,
6583 struct i40e_asq_cmd_details *cmd_details)
6584 {
6585 struct i40e_aq_desc desc;
6586 struct i40e_aqc_phy_register_access *cmd =
6587 (struct i40e_aqc_phy_register_access *)&desc.params.raw;
6588 enum i40e_status_code status;
6589
6590 i40e_fill_default_direct_cmd_desc(&desc,
6591 i40e_aqc_opc_set_phy_register);
6592
6593 cmd->phy_interface = phy_select;
6594 cmd->dev_addres = dev_addr;
6595 cmd->reg_address = reg_addr;
6596 cmd->reg_value = reg_val;
6597
6598 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
6599
6600 return status;
6601 }
6602
6603 /**
6604 * i40e_aq_get_phy_register
6605 * @hw: pointer to the hw struct
6606 * @phy_select: select which phy should be accessed
6607 * @dev_addr: PHY device address
6608 * @reg_addr: PHY register address
6609 * @reg_val: read register value
6610 * @cmd_details: pointer to command details structure or NULL
6611 *
6612 * Read the external PHY register.
6613 **/
i40e_aq_get_phy_register(struct i40e_hw * hw,u8 phy_select,u8 dev_addr,u32 reg_addr,u32 * reg_val,struct i40e_asq_cmd_details * cmd_details)6614 enum i40e_status_code i40e_aq_get_phy_register(struct i40e_hw *hw,
6615 u8 phy_select, u8 dev_addr,
6616 u32 reg_addr, u32 *reg_val,
6617 struct i40e_asq_cmd_details *cmd_details)
6618 {
6619 struct i40e_aq_desc desc;
6620 struct i40e_aqc_phy_register_access *cmd =
6621 (struct i40e_aqc_phy_register_access *)&desc.params.raw;
6622 enum i40e_status_code status;
6623
6624 i40e_fill_default_direct_cmd_desc(&desc,
6625 i40e_aqc_opc_get_phy_register);
6626
6627 cmd->phy_interface = phy_select;
6628 cmd->dev_addres = dev_addr;
6629 cmd->reg_address = reg_addr;
6630
6631 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
6632 if (!status)
6633 *reg_val = cmd->reg_value;
6634
6635 return status;
6636 }
6637
6638 /**
6639 * i40e_aq_set_arp_proxy_config
6640 * @hw: pointer to the HW structure
6641 * @proxy_config - pointer to proxy config command table struct
6642 * @cmd_details: pointer to command details
6643 *
6644 * Set ARP offload parameters from pre-populated
6645 * i40e_aqc_arp_proxy_data struct
6646 **/
i40e_aq_set_arp_proxy_config(struct i40e_hw * hw,struct i40e_aqc_arp_proxy_data * proxy_config,struct i40e_asq_cmd_details * cmd_details)6647 enum i40e_status_code i40e_aq_set_arp_proxy_config(struct i40e_hw *hw,
6648 struct i40e_aqc_arp_proxy_data *proxy_config,
6649 struct i40e_asq_cmd_details *cmd_details)
6650 {
6651 struct i40e_aq_desc desc;
6652 enum i40e_status_code status;
6653
6654 if (!proxy_config)
6655 return I40E_ERR_PARAM;
6656
6657 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_set_proxy_config);
6658
6659 desc.params.external.addr_high =
6660 CPU_TO_LE32(I40E_HI_DWORD((uintptr_t)proxy_config));
6661 desc.params.external.addr_low =
6662 CPU_TO_LE32(I40E_LO_DWORD((uintptr_t)proxy_config));
6663
6664 status = i40e_asq_send_command(hw, &desc, proxy_config,
6665 sizeof(struct i40e_aqc_arp_proxy_data),
6666 cmd_details);
6667
6668 return status;
6669 }
6670
6671 /**
6672 * i40e_aq_opc_set_ns_proxy_table_entry
6673 * @hw: pointer to the HW structure
6674 * @ns_proxy_table_entry: pointer to NS table entry command struct
6675 * @cmd_details: pointer to command details
6676 *
6677 * Set IPv6 Neighbor Solicitation (NS) protocol offload parameters
6678 * from pre-populated i40e_aqc_ns_proxy_data struct
6679 **/
i40e_aq_set_ns_proxy_table_entry(struct i40e_hw * hw,struct i40e_aqc_ns_proxy_data * ns_proxy_table_entry,struct i40e_asq_cmd_details * cmd_details)6680 enum i40e_status_code i40e_aq_set_ns_proxy_table_entry(struct i40e_hw *hw,
6681 struct i40e_aqc_ns_proxy_data *ns_proxy_table_entry,
6682 struct i40e_asq_cmd_details *cmd_details)
6683 {
6684 struct i40e_aq_desc desc;
6685 enum i40e_status_code status;
6686
6687 if (!ns_proxy_table_entry)
6688 return I40E_ERR_PARAM;
6689
6690 i40e_fill_default_direct_cmd_desc(&desc,
6691 i40e_aqc_opc_set_ns_proxy_table_entry);
6692
6693 desc.params.external.addr_high =
6694 CPU_TO_LE32(I40E_HI_DWORD((uintptr_t)ns_proxy_table_entry));
6695 desc.params.external.addr_low =
6696 CPU_TO_LE32(I40E_LO_DWORD((uintptr_t)ns_proxy_table_entry));
6697
6698 status = i40e_asq_send_command(hw, &desc, ns_proxy_table_entry,
6699 sizeof(struct i40e_aqc_ns_proxy_data),
6700 cmd_details);
6701
6702 return status;
6703 }
6704
6705 /**
6706 * i40e_aq_set_clear_wol_filter
6707 * @hw: pointer to the hw struct
6708 * @filter_index: index of filter to modify (0-7)
6709 * @filter: buffer containing filter to be set
6710 * @set_filter: TRUE to set filter, FALSE to clear filter
6711 * @no_wol_tco: if TRUE, pass through packets cannot cause wake-up
6712 * if FALSE, pass through packets may cause wake-up
6713 * @filter_valid: TRUE if filter action is valid
6714 * @no_wol_tco_valid: TRUE if no WoL in TCO traffic action valid
6715 * @cmd_details: pointer to command details structure or NULL
6716 *
6717 * Set or clear WoL filter for port attached to the PF
6718 **/
i40e_aq_set_clear_wol_filter(struct i40e_hw * hw,u8 filter_index,struct i40e_aqc_set_wol_filter_data * filter,bool set_filter,bool no_wol_tco,bool filter_valid,bool no_wol_tco_valid,struct i40e_asq_cmd_details * cmd_details)6719 enum i40e_status_code i40e_aq_set_clear_wol_filter(struct i40e_hw *hw,
6720 u8 filter_index,
6721 struct i40e_aqc_set_wol_filter_data *filter,
6722 bool set_filter, bool no_wol_tco,
6723 bool filter_valid, bool no_wol_tco_valid,
6724 struct i40e_asq_cmd_details *cmd_details)
6725 {
6726 struct i40e_aq_desc desc;
6727 struct i40e_aqc_set_wol_filter *cmd =
6728 (struct i40e_aqc_set_wol_filter *)&desc.params.raw;
6729 enum i40e_status_code status;
6730 u16 cmd_flags = 0;
6731 u16 valid_flags = 0;
6732 u16 buff_len = 0;
6733
6734 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_set_wol_filter);
6735
6736 if (filter_index >= I40E_AQC_MAX_NUM_WOL_FILTERS)
6737 return I40E_ERR_PARAM;
6738 cmd->filter_index = CPU_TO_LE16(filter_index);
6739
6740 if (set_filter) {
6741 if (!filter)
6742 return I40E_ERR_PARAM;
6743 cmd_flags |= I40E_AQC_SET_WOL_FILTER;
6744 buff_len = sizeof(*filter);
6745 }
6746 if (no_wol_tco)
6747 cmd_flags |= I40E_AQC_SET_WOL_FILTER_NO_TCO_WOL;
6748 cmd->cmd_flags = CPU_TO_LE16(cmd_flags);
6749
6750 if (filter_valid)
6751 valid_flags |= I40E_AQC_SET_WOL_FILTER_ACTION_VALID;
6752 if (no_wol_tco_valid)
6753 valid_flags |= I40E_AQC_SET_WOL_FILTER_NO_TCO_ACTION_VALID;
6754 cmd->valid_flags = CPU_TO_LE16(valid_flags);
6755
6756 cmd->address_high = CPU_TO_LE32(I40E_HI_DWORD((uintptr_t)filter));
6757 cmd->address_low = CPU_TO_LE32(I40E_LO_DWORD((uintptr_t)filter));
6758
6759 status = i40e_asq_send_command(hw, &desc, filter,
6760 buff_len, cmd_details);
6761
6762 return status;
6763 }
6764
6765 /**
6766 * i40e_aq_get_wake_event_reason
6767 * @hw: pointer to the hw struct
6768 * @wake_reason: return value, index of matching filter
6769 * @cmd_details: pointer to command details structure or NULL
6770 *
6771 * Get information for the reason of a Wake Up event
6772 **/
i40e_aq_get_wake_event_reason(struct i40e_hw * hw,u16 * wake_reason,struct i40e_asq_cmd_details * cmd_details)6773 enum i40e_status_code i40e_aq_get_wake_event_reason(struct i40e_hw *hw,
6774 u16 *wake_reason,
6775 struct i40e_asq_cmd_details *cmd_details)
6776 {
6777 struct i40e_aq_desc desc;
6778 struct i40e_aqc_get_wake_reason_completion *resp =
6779 (struct i40e_aqc_get_wake_reason_completion *)&desc.params.raw;
6780 enum i40e_status_code status;
6781
6782 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_get_wake_reason);
6783
6784 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details);
6785
6786 if (status == I40E_SUCCESS)
6787 *wake_reason = LE16_TO_CPU(resp->wake_reason);
6788
6789 return status;
6790 }
6791
6792