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