1 /****************************************************************************** 2 3 Copyright (c) 2013-2014, 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 * i40e_set_mac_type - Sets MAC type 42 * @hw: pointer to the HW structure 43 * 44 * This function sets the mac type of the adapter based on the 45 * vendor ID and device ID stored in the hw structure. 46 **/ 47 enum i40e_status_code i40e_set_mac_type(struct i40e_hw *hw) 48 { 49 enum i40e_status_code status = I40E_SUCCESS; 50 51 DEBUGFUNC("i40e_set_mac_type\n"); 52 53 if (hw->vendor_id == I40E_INTEL_VENDOR_ID) { 54 switch (hw->device_id) { 55 case I40E_DEV_ID_SFP_XL710: 56 case I40E_DEV_ID_QEMU: 57 case I40E_DEV_ID_KX_A: 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 hw->mac.type = I40E_MAC_XL710; 65 break; 66 case I40E_DEV_ID_VF: 67 case I40E_DEV_ID_VF_HV: 68 hw->mac.type = I40E_MAC_VF; 69 break; 70 default: 71 hw->mac.type = I40E_MAC_GENERIC; 72 break; 73 } 74 } else { 75 status = I40E_ERR_DEVICE_NOT_SUPPORTED; 76 } 77 78 DEBUGOUT2("i40e_set_mac_type found mac: %d, returns: %d\n", 79 hw->mac.type, status); 80 return status; 81 } 82 83 /** 84 * i40e_debug_aq 85 * @hw: debug mask related to admin queue 86 * @mask: debug mask 87 * @desc: pointer to admin queue descriptor 88 * @buffer: pointer to command buffer 89 * @buf_len: max length of buffer 90 * 91 * Dumps debug log about adminq command with descriptor contents. 92 **/ 93 void i40e_debug_aq(struct i40e_hw *hw, enum i40e_debug_mask mask, void *desc, 94 void *buffer, u16 buf_len) 95 { 96 struct i40e_aq_desc *aq_desc = (struct i40e_aq_desc *)desc; 97 u16 len = LE16_TO_CPU(aq_desc->datalen); 98 u8 *aq_buffer = (u8 *)buffer; 99 u32 data[4]; 100 u32 i = 0; 101 102 if ((!(mask & hw->debug_mask)) || (desc == NULL)) 103 return; 104 105 i40e_debug(hw, mask, 106 "AQ CMD: opcode 0x%04X, flags 0x%04X, datalen 0x%04X, retval 0x%04X\n", 107 aq_desc->opcode, aq_desc->flags, aq_desc->datalen, 108 aq_desc->retval); 109 i40e_debug(hw, mask, "\tcookie (h,l) 0x%08X 0x%08X\n", 110 aq_desc->cookie_high, aq_desc->cookie_low); 111 i40e_debug(hw, mask, "\tparam (0,1) 0x%08X 0x%08X\n", 112 aq_desc->params.internal.param0, 113 aq_desc->params.internal.param1); 114 i40e_debug(hw, mask, "\taddr (h,l) 0x%08X 0x%08X\n", 115 aq_desc->params.external.addr_high, 116 aq_desc->params.external.addr_low); 117 118 if ((buffer != NULL) && (aq_desc->datalen != 0)) { 119 i40e_memset(data, 0, sizeof(data), I40E_NONDMA_MEM); 120 i40e_debug(hw, mask, "AQ CMD Buffer:\n"); 121 if (buf_len < len) 122 len = buf_len; 123 for (i = 0; i < len; i++) { 124 data[((i % 16) / 4)] |= 125 ((u32)aq_buffer[i]) << (8 * (i % 4)); 126 if ((i % 16) == 15) { 127 i40e_debug(hw, mask, 128 "\t0x%04X %08X %08X %08X %08X\n", 129 i - 15, data[0], data[1], data[2], 130 data[3]); 131 i40e_memset(data, 0, sizeof(data), 132 I40E_NONDMA_MEM); 133 } 134 } 135 if ((i % 16) != 0) 136 i40e_debug(hw, mask, "\t0x%04X %08X %08X %08X %08X\n", 137 i - (i % 16), data[0], data[1], data[2], 138 data[3]); 139 } 140 } 141 142 /** 143 * i40e_check_asq_alive 144 * @hw: pointer to the hw struct 145 * 146 * Returns TRUE if Queue is enabled else FALSE. 147 **/ 148 bool i40e_check_asq_alive(struct i40e_hw *hw) 149 { 150 if (hw->aq.asq.len) 151 return !!(rd32(hw, hw->aq.asq.len) & I40E_PF_ATQLEN_ATQENABLE_MASK); 152 else 153 return FALSE; 154 } 155 156 /** 157 * i40e_aq_queue_shutdown 158 * @hw: pointer to the hw struct 159 * @unloading: is the driver unloading itself 160 * 161 * Tell the Firmware that we're shutting down the AdminQ and whether 162 * or not the driver is unloading as well. 163 **/ 164 enum i40e_status_code i40e_aq_queue_shutdown(struct i40e_hw *hw, 165 bool unloading) 166 { 167 struct i40e_aq_desc desc; 168 struct i40e_aqc_queue_shutdown *cmd = 169 (struct i40e_aqc_queue_shutdown *)&desc.params.raw; 170 enum i40e_status_code status; 171 172 i40e_fill_default_direct_cmd_desc(&desc, 173 i40e_aqc_opc_queue_shutdown); 174 175 if (unloading) 176 cmd->driver_unloading = CPU_TO_LE32(I40E_AQ_DRIVER_UNLOADING); 177 status = i40e_asq_send_command(hw, &desc, NULL, 0, NULL); 178 179 return status; 180 } 181 182 /* The i40e_ptype_lookup table is used to convert from the 8-bit ptype in the 183 * hardware to a bit-field that can be used by SW to more easily determine the 184 * packet type. 185 * 186 * Macros are used to shorten the table lines and make this table human 187 * readable. 188 * 189 * We store the PTYPE in the top byte of the bit field - this is just so that 190 * we can check that the table doesn't have a row missing, as the index into 191 * the table should be the PTYPE. 192 * 193 * Typical work flow: 194 * 195 * IF NOT i40e_ptype_lookup[ptype].known 196 * THEN 197 * Packet is unknown 198 * ELSE IF i40e_ptype_lookup[ptype].outer_ip == I40E_RX_PTYPE_OUTER_IP 199 * Use the rest of the fields to look at the tunnels, inner protocols, etc 200 * ELSE 201 * Use the enum i40e_rx_l2_ptype to decode the packet type 202 * ENDIF 203 */ 204 205 /* macro to make the table lines short */ 206 #define I40E_PTT(PTYPE, OUTER_IP, OUTER_IP_VER, OUTER_FRAG, T, TE, TEF, I, PL)\ 207 { PTYPE, \ 208 1, \ 209 I40E_RX_PTYPE_OUTER_##OUTER_IP, \ 210 I40E_RX_PTYPE_OUTER_##OUTER_IP_VER, \ 211 I40E_RX_PTYPE_##OUTER_FRAG, \ 212 I40E_RX_PTYPE_TUNNEL_##T, \ 213 I40E_RX_PTYPE_TUNNEL_END_##TE, \ 214 I40E_RX_PTYPE_##TEF, \ 215 I40E_RX_PTYPE_INNER_PROT_##I, \ 216 I40E_RX_PTYPE_PAYLOAD_LAYER_##PL } 217 218 #define I40E_PTT_UNUSED_ENTRY(PTYPE) \ 219 { PTYPE, 0, 0, 0, 0, 0, 0, 0, 0, 0 } 220 221 /* shorter macros makes the table fit but are terse */ 222 #define I40E_RX_PTYPE_NOF I40E_RX_PTYPE_NOT_FRAG 223 #define I40E_RX_PTYPE_FRG I40E_RX_PTYPE_FRAG 224 #define I40E_RX_PTYPE_INNER_PROT_TS I40E_RX_PTYPE_INNER_PROT_TIMESYNC 225 226 /* Lookup table mapping the HW PTYPE to the bit field for decoding */ 227 struct i40e_rx_ptype_decoded i40e_ptype_lookup[] = { 228 /* L2 Packet types */ 229 I40E_PTT_UNUSED_ENTRY(0), 230 I40E_PTT(1, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY2), 231 I40E_PTT(2, L2, NONE, NOF, NONE, NONE, NOF, TS, PAY2), 232 I40E_PTT(3, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY2), 233 I40E_PTT_UNUSED_ENTRY(4), 234 I40E_PTT_UNUSED_ENTRY(5), 235 I40E_PTT(6, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY2), 236 I40E_PTT(7, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY2), 237 I40E_PTT_UNUSED_ENTRY(8), 238 I40E_PTT_UNUSED_ENTRY(9), 239 I40E_PTT(10, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY2), 240 I40E_PTT(11, L2, NONE, NOF, NONE, NONE, NOF, NONE, NONE), 241 I40E_PTT(12, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3), 242 I40E_PTT(13, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3), 243 I40E_PTT(14, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3), 244 I40E_PTT(15, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3), 245 I40E_PTT(16, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3), 246 I40E_PTT(17, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3), 247 I40E_PTT(18, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3), 248 I40E_PTT(19, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3), 249 I40E_PTT(20, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3), 250 I40E_PTT(21, L2, NONE, NOF, NONE, NONE, NOF, NONE, PAY3), 251 252 /* Non Tunneled IPv4 */ 253 I40E_PTT(22, IP, IPV4, FRG, NONE, NONE, NOF, NONE, PAY3), 254 I40E_PTT(23, IP, IPV4, NOF, NONE, NONE, NOF, NONE, PAY3), 255 I40E_PTT(24, IP, IPV4, NOF, NONE, NONE, NOF, UDP, PAY4), 256 I40E_PTT_UNUSED_ENTRY(25), 257 I40E_PTT(26, IP, IPV4, NOF, NONE, NONE, NOF, TCP, PAY4), 258 I40E_PTT(27, IP, IPV4, NOF, NONE, NONE, NOF, SCTP, PAY4), 259 I40E_PTT(28, IP, IPV4, NOF, NONE, NONE, NOF, ICMP, PAY4), 260 261 /* IPv4 --> IPv4 */ 262 I40E_PTT(29, IP, IPV4, NOF, IP_IP, IPV4, FRG, NONE, PAY3), 263 I40E_PTT(30, IP, IPV4, NOF, IP_IP, IPV4, NOF, NONE, PAY3), 264 I40E_PTT(31, IP, IPV4, NOF, IP_IP, IPV4, NOF, UDP, PAY4), 265 I40E_PTT_UNUSED_ENTRY(32), 266 I40E_PTT(33, IP, IPV4, NOF, IP_IP, IPV4, NOF, TCP, PAY4), 267 I40E_PTT(34, IP, IPV4, NOF, IP_IP, IPV4, NOF, SCTP, PAY4), 268 I40E_PTT(35, IP, IPV4, NOF, IP_IP, IPV4, NOF, ICMP, PAY4), 269 270 /* IPv4 --> IPv6 */ 271 I40E_PTT(36, IP, IPV4, NOF, IP_IP, IPV6, FRG, NONE, PAY3), 272 I40E_PTT(37, IP, IPV4, NOF, IP_IP, IPV6, NOF, NONE, PAY3), 273 I40E_PTT(38, IP, IPV4, NOF, IP_IP, IPV6, NOF, UDP, PAY4), 274 I40E_PTT_UNUSED_ENTRY(39), 275 I40E_PTT(40, IP, IPV4, NOF, IP_IP, IPV6, NOF, TCP, PAY4), 276 I40E_PTT(41, IP, IPV4, NOF, IP_IP, IPV6, NOF, SCTP, PAY4), 277 I40E_PTT(42, IP, IPV4, NOF, IP_IP, IPV6, NOF, ICMP, PAY4), 278 279 /* IPv4 --> GRE/NAT */ 280 I40E_PTT(43, IP, IPV4, NOF, IP_GRENAT, NONE, NOF, NONE, PAY3), 281 282 /* IPv4 --> GRE/NAT --> IPv4 */ 283 I40E_PTT(44, IP, IPV4, NOF, IP_GRENAT, IPV4, FRG, NONE, PAY3), 284 I40E_PTT(45, IP, IPV4, NOF, IP_GRENAT, IPV4, NOF, NONE, PAY3), 285 I40E_PTT(46, IP, IPV4, NOF, IP_GRENAT, IPV4, NOF, UDP, PAY4), 286 I40E_PTT_UNUSED_ENTRY(47), 287 I40E_PTT(48, IP, IPV4, NOF, IP_GRENAT, IPV4, NOF, TCP, PAY4), 288 I40E_PTT(49, IP, IPV4, NOF, IP_GRENAT, IPV4, NOF, SCTP, PAY4), 289 I40E_PTT(50, IP, IPV4, NOF, IP_GRENAT, IPV4, NOF, ICMP, PAY4), 290 291 /* IPv4 --> GRE/NAT --> IPv6 */ 292 I40E_PTT(51, IP, IPV4, NOF, IP_GRENAT, IPV6, FRG, NONE, PAY3), 293 I40E_PTT(52, IP, IPV4, NOF, IP_GRENAT, IPV6, NOF, NONE, PAY3), 294 I40E_PTT(53, IP, IPV4, NOF, IP_GRENAT, IPV6, NOF, UDP, PAY4), 295 I40E_PTT_UNUSED_ENTRY(54), 296 I40E_PTT(55, IP, IPV4, NOF, IP_GRENAT, IPV6, NOF, TCP, PAY4), 297 I40E_PTT(56, IP, IPV4, NOF, IP_GRENAT, IPV6, NOF, SCTP, PAY4), 298 I40E_PTT(57, IP, IPV4, NOF, IP_GRENAT, IPV6, NOF, ICMP, PAY4), 299 300 /* IPv4 --> GRE/NAT --> MAC */ 301 I40E_PTT(58, IP, IPV4, NOF, IP_GRENAT_MAC, NONE, NOF, NONE, PAY3), 302 303 /* IPv4 --> GRE/NAT --> MAC --> IPv4 */ 304 I40E_PTT(59, IP, IPV4, NOF, IP_GRENAT_MAC, IPV4, FRG, NONE, PAY3), 305 I40E_PTT(60, IP, IPV4, NOF, IP_GRENAT_MAC, IPV4, NOF, NONE, PAY3), 306 I40E_PTT(61, IP, IPV4, NOF, IP_GRENAT_MAC, IPV4, NOF, UDP, PAY4), 307 I40E_PTT_UNUSED_ENTRY(62), 308 I40E_PTT(63, IP, IPV4, NOF, IP_GRENAT_MAC, IPV4, NOF, TCP, PAY4), 309 I40E_PTT(64, IP, IPV4, NOF, IP_GRENAT_MAC, IPV4, NOF, SCTP, PAY4), 310 I40E_PTT(65, IP, IPV4, NOF, IP_GRENAT_MAC, IPV4, NOF, ICMP, PAY4), 311 312 /* IPv4 --> GRE/NAT -> MAC --> IPv6 */ 313 I40E_PTT(66, IP, IPV4, NOF, IP_GRENAT_MAC, IPV6, FRG, NONE, PAY3), 314 I40E_PTT(67, IP, IPV4, NOF, IP_GRENAT_MAC, IPV6, NOF, NONE, PAY3), 315 I40E_PTT(68, IP, IPV4, NOF, IP_GRENAT_MAC, IPV6, NOF, UDP, PAY4), 316 I40E_PTT_UNUSED_ENTRY(69), 317 I40E_PTT(70, IP, IPV4, NOF, IP_GRENAT_MAC, IPV6, NOF, TCP, PAY4), 318 I40E_PTT(71, IP, IPV4, NOF, IP_GRENAT_MAC, IPV6, NOF, SCTP, PAY4), 319 I40E_PTT(72, IP, IPV4, NOF, IP_GRENAT_MAC, IPV6, NOF, ICMP, PAY4), 320 321 /* IPv4 --> GRE/NAT --> MAC/VLAN */ 322 I40E_PTT(73, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, NONE, NOF, NONE, PAY3), 323 324 /* IPv4 ---> GRE/NAT -> MAC/VLAN --> IPv4 */ 325 I40E_PTT(74, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV4, FRG, NONE, PAY3), 326 I40E_PTT(75, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, NONE, PAY3), 327 I40E_PTT(76, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, UDP, PAY4), 328 I40E_PTT_UNUSED_ENTRY(77), 329 I40E_PTT(78, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, TCP, PAY4), 330 I40E_PTT(79, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, SCTP, PAY4), 331 I40E_PTT(80, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, ICMP, PAY4), 332 333 /* IPv4 -> GRE/NAT -> MAC/VLAN --> IPv6 */ 334 I40E_PTT(81, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV6, FRG, NONE, PAY3), 335 I40E_PTT(82, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, NONE, PAY3), 336 I40E_PTT(83, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, UDP, PAY4), 337 I40E_PTT_UNUSED_ENTRY(84), 338 I40E_PTT(85, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, TCP, PAY4), 339 I40E_PTT(86, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, SCTP, PAY4), 340 I40E_PTT(87, IP, IPV4, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, ICMP, PAY4), 341 342 /* Non Tunneled IPv6 */ 343 I40E_PTT(88, IP, IPV6, FRG, NONE, NONE, NOF, NONE, PAY3), 344 I40E_PTT(89, IP, IPV6, NOF, NONE, NONE, NOF, NONE, PAY3), 345 I40E_PTT(90, IP, IPV6, NOF, NONE, NONE, NOF, UDP, PAY3), 346 I40E_PTT_UNUSED_ENTRY(91), 347 I40E_PTT(92, IP, IPV6, NOF, NONE, NONE, NOF, TCP, PAY4), 348 I40E_PTT(93, IP, IPV6, NOF, NONE, NONE, NOF, SCTP, PAY4), 349 I40E_PTT(94, IP, IPV6, NOF, NONE, NONE, NOF, ICMP, PAY4), 350 351 /* IPv6 --> IPv4 */ 352 I40E_PTT(95, IP, IPV6, NOF, IP_IP, IPV4, FRG, NONE, PAY3), 353 I40E_PTT(96, IP, IPV6, NOF, IP_IP, IPV4, NOF, NONE, PAY3), 354 I40E_PTT(97, IP, IPV6, NOF, IP_IP, IPV4, NOF, UDP, PAY4), 355 I40E_PTT_UNUSED_ENTRY(98), 356 I40E_PTT(99, IP, IPV6, NOF, IP_IP, IPV4, NOF, TCP, PAY4), 357 I40E_PTT(100, IP, IPV6, NOF, IP_IP, IPV4, NOF, SCTP, PAY4), 358 I40E_PTT(101, IP, IPV6, NOF, IP_IP, IPV4, NOF, ICMP, PAY4), 359 360 /* IPv6 --> IPv6 */ 361 I40E_PTT(102, IP, IPV6, NOF, IP_IP, IPV6, FRG, NONE, PAY3), 362 I40E_PTT(103, IP, IPV6, NOF, IP_IP, IPV6, NOF, NONE, PAY3), 363 I40E_PTT(104, IP, IPV6, NOF, IP_IP, IPV6, NOF, UDP, PAY4), 364 I40E_PTT_UNUSED_ENTRY(105), 365 I40E_PTT(106, IP, IPV6, NOF, IP_IP, IPV6, NOF, TCP, PAY4), 366 I40E_PTT(107, IP, IPV6, NOF, IP_IP, IPV6, NOF, SCTP, PAY4), 367 I40E_PTT(108, IP, IPV6, NOF, IP_IP, IPV6, NOF, ICMP, PAY4), 368 369 /* IPv6 --> GRE/NAT */ 370 I40E_PTT(109, IP, IPV6, NOF, IP_GRENAT, NONE, NOF, NONE, PAY3), 371 372 /* IPv6 --> GRE/NAT -> IPv4 */ 373 I40E_PTT(110, IP, IPV6, NOF, IP_GRENAT, IPV4, FRG, NONE, PAY3), 374 I40E_PTT(111, IP, IPV6, NOF, IP_GRENAT, IPV4, NOF, NONE, PAY3), 375 I40E_PTT(112, IP, IPV6, NOF, IP_GRENAT, IPV4, NOF, UDP, PAY4), 376 I40E_PTT_UNUSED_ENTRY(113), 377 I40E_PTT(114, IP, IPV6, NOF, IP_GRENAT, IPV4, NOF, TCP, PAY4), 378 I40E_PTT(115, IP, IPV6, NOF, IP_GRENAT, IPV4, NOF, SCTP, PAY4), 379 I40E_PTT(116, IP, IPV6, NOF, IP_GRENAT, IPV4, NOF, ICMP, PAY4), 380 381 /* IPv6 --> GRE/NAT -> IPv6 */ 382 I40E_PTT(117, IP, IPV6, NOF, IP_GRENAT, IPV6, FRG, NONE, PAY3), 383 I40E_PTT(118, IP, IPV6, NOF, IP_GRENAT, IPV6, NOF, NONE, PAY3), 384 I40E_PTT(119, IP, IPV6, NOF, IP_GRENAT, IPV6, NOF, UDP, PAY4), 385 I40E_PTT_UNUSED_ENTRY(120), 386 I40E_PTT(121, IP, IPV6, NOF, IP_GRENAT, IPV6, NOF, TCP, PAY4), 387 I40E_PTT(122, IP, IPV6, NOF, IP_GRENAT, IPV6, NOF, SCTP, PAY4), 388 I40E_PTT(123, IP, IPV6, NOF, IP_GRENAT, IPV6, NOF, ICMP, PAY4), 389 390 /* IPv6 --> GRE/NAT -> MAC */ 391 I40E_PTT(124, IP, IPV6, NOF, IP_GRENAT_MAC, NONE, NOF, NONE, PAY3), 392 393 /* IPv6 --> GRE/NAT -> MAC -> IPv4 */ 394 I40E_PTT(125, IP, IPV6, NOF, IP_GRENAT_MAC, IPV4, FRG, NONE, PAY3), 395 I40E_PTT(126, IP, IPV6, NOF, IP_GRENAT_MAC, IPV4, NOF, NONE, PAY3), 396 I40E_PTT(127, IP, IPV6, NOF, IP_GRENAT_MAC, IPV4, NOF, UDP, PAY4), 397 I40E_PTT_UNUSED_ENTRY(128), 398 I40E_PTT(129, IP, IPV6, NOF, IP_GRENAT_MAC, IPV4, NOF, TCP, PAY4), 399 I40E_PTT(130, IP, IPV6, NOF, IP_GRENAT_MAC, IPV4, NOF, SCTP, PAY4), 400 I40E_PTT(131, IP, IPV6, NOF, IP_GRENAT_MAC, IPV4, NOF, ICMP, PAY4), 401 402 /* IPv6 --> GRE/NAT -> MAC -> IPv6 */ 403 I40E_PTT(132, IP, IPV6, NOF, IP_GRENAT_MAC, IPV6, FRG, NONE, PAY3), 404 I40E_PTT(133, IP, IPV6, NOF, IP_GRENAT_MAC, IPV6, NOF, NONE, PAY3), 405 I40E_PTT(134, IP, IPV6, NOF, IP_GRENAT_MAC, IPV6, NOF, UDP, PAY4), 406 I40E_PTT_UNUSED_ENTRY(135), 407 I40E_PTT(136, IP, IPV6, NOF, IP_GRENAT_MAC, IPV6, NOF, TCP, PAY4), 408 I40E_PTT(137, IP, IPV6, NOF, IP_GRENAT_MAC, IPV6, NOF, SCTP, PAY4), 409 I40E_PTT(138, IP, IPV6, NOF, IP_GRENAT_MAC, IPV6, NOF, ICMP, PAY4), 410 411 /* IPv6 --> GRE/NAT -> MAC/VLAN */ 412 I40E_PTT(139, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, NONE, NOF, NONE, PAY3), 413 414 /* IPv6 --> GRE/NAT -> MAC/VLAN --> IPv4 */ 415 I40E_PTT(140, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV4, FRG, NONE, PAY3), 416 I40E_PTT(141, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, NONE, PAY3), 417 I40E_PTT(142, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, UDP, PAY4), 418 I40E_PTT_UNUSED_ENTRY(143), 419 I40E_PTT(144, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, TCP, PAY4), 420 I40E_PTT(145, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, SCTP, PAY4), 421 I40E_PTT(146, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV4, NOF, ICMP, PAY4), 422 423 /* IPv6 --> GRE/NAT -> MAC/VLAN --> IPv6 */ 424 I40E_PTT(147, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV6, FRG, NONE, PAY3), 425 I40E_PTT(148, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, NONE, PAY3), 426 I40E_PTT(149, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, UDP, PAY4), 427 I40E_PTT_UNUSED_ENTRY(150), 428 I40E_PTT(151, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, TCP, PAY4), 429 I40E_PTT(152, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, SCTP, PAY4), 430 I40E_PTT(153, IP, IPV6, NOF, IP_GRENAT_MAC_VLAN, IPV6, NOF, ICMP, PAY4), 431 432 /* unused entries */ 433 I40E_PTT_UNUSED_ENTRY(154), 434 I40E_PTT_UNUSED_ENTRY(155), 435 I40E_PTT_UNUSED_ENTRY(156), 436 I40E_PTT_UNUSED_ENTRY(157), 437 I40E_PTT_UNUSED_ENTRY(158), 438 I40E_PTT_UNUSED_ENTRY(159), 439 440 I40E_PTT_UNUSED_ENTRY(160), 441 I40E_PTT_UNUSED_ENTRY(161), 442 I40E_PTT_UNUSED_ENTRY(162), 443 I40E_PTT_UNUSED_ENTRY(163), 444 I40E_PTT_UNUSED_ENTRY(164), 445 I40E_PTT_UNUSED_ENTRY(165), 446 I40E_PTT_UNUSED_ENTRY(166), 447 I40E_PTT_UNUSED_ENTRY(167), 448 I40E_PTT_UNUSED_ENTRY(168), 449 I40E_PTT_UNUSED_ENTRY(169), 450 451 I40E_PTT_UNUSED_ENTRY(170), 452 I40E_PTT_UNUSED_ENTRY(171), 453 I40E_PTT_UNUSED_ENTRY(172), 454 I40E_PTT_UNUSED_ENTRY(173), 455 I40E_PTT_UNUSED_ENTRY(174), 456 I40E_PTT_UNUSED_ENTRY(175), 457 I40E_PTT_UNUSED_ENTRY(176), 458 I40E_PTT_UNUSED_ENTRY(177), 459 I40E_PTT_UNUSED_ENTRY(178), 460 I40E_PTT_UNUSED_ENTRY(179), 461 462 I40E_PTT_UNUSED_ENTRY(180), 463 I40E_PTT_UNUSED_ENTRY(181), 464 I40E_PTT_UNUSED_ENTRY(182), 465 I40E_PTT_UNUSED_ENTRY(183), 466 I40E_PTT_UNUSED_ENTRY(184), 467 I40E_PTT_UNUSED_ENTRY(185), 468 I40E_PTT_UNUSED_ENTRY(186), 469 I40E_PTT_UNUSED_ENTRY(187), 470 I40E_PTT_UNUSED_ENTRY(188), 471 I40E_PTT_UNUSED_ENTRY(189), 472 473 I40E_PTT_UNUSED_ENTRY(190), 474 I40E_PTT_UNUSED_ENTRY(191), 475 I40E_PTT_UNUSED_ENTRY(192), 476 I40E_PTT_UNUSED_ENTRY(193), 477 I40E_PTT_UNUSED_ENTRY(194), 478 I40E_PTT_UNUSED_ENTRY(195), 479 I40E_PTT_UNUSED_ENTRY(196), 480 I40E_PTT_UNUSED_ENTRY(197), 481 I40E_PTT_UNUSED_ENTRY(198), 482 I40E_PTT_UNUSED_ENTRY(199), 483 484 I40E_PTT_UNUSED_ENTRY(200), 485 I40E_PTT_UNUSED_ENTRY(201), 486 I40E_PTT_UNUSED_ENTRY(202), 487 I40E_PTT_UNUSED_ENTRY(203), 488 I40E_PTT_UNUSED_ENTRY(204), 489 I40E_PTT_UNUSED_ENTRY(205), 490 I40E_PTT_UNUSED_ENTRY(206), 491 I40E_PTT_UNUSED_ENTRY(207), 492 I40E_PTT_UNUSED_ENTRY(208), 493 I40E_PTT_UNUSED_ENTRY(209), 494 495 I40E_PTT_UNUSED_ENTRY(210), 496 I40E_PTT_UNUSED_ENTRY(211), 497 I40E_PTT_UNUSED_ENTRY(212), 498 I40E_PTT_UNUSED_ENTRY(213), 499 I40E_PTT_UNUSED_ENTRY(214), 500 I40E_PTT_UNUSED_ENTRY(215), 501 I40E_PTT_UNUSED_ENTRY(216), 502 I40E_PTT_UNUSED_ENTRY(217), 503 I40E_PTT_UNUSED_ENTRY(218), 504 I40E_PTT_UNUSED_ENTRY(219), 505 506 I40E_PTT_UNUSED_ENTRY(220), 507 I40E_PTT_UNUSED_ENTRY(221), 508 I40E_PTT_UNUSED_ENTRY(222), 509 I40E_PTT_UNUSED_ENTRY(223), 510 I40E_PTT_UNUSED_ENTRY(224), 511 I40E_PTT_UNUSED_ENTRY(225), 512 I40E_PTT_UNUSED_ENTRY(226), 513 I40E_PTT_UNUSED_ENTRY(227), 514 I40E_PTT_UNUSED_ENTRY(228), 515 I40E_PTT_UNUSED_ENTRY(229), 516 517 I40E_PTT_UNUSED_ENTRY(230), 518 I40E_PTT_UNUSED_ENTRY(231), 519 I40E_PTT_UNUSED_ENTRY(232), 520 I40E_PTT_UNUSED_ENTRY(233), 521 I40E_PTT_UNUSED_ENTRY(234), 522 I40E_PTT_UNUSED_ENTRY(235), 523 I40E_PTT_UNUSED_ENTRY(236), 524 I40E_PTT_UNUSED_ENTRY(237), 525 I40E_PTT_UNUSED_ENTRY(238), 526 I40E_PTT_UNUSED_ENTRY(239), 527 528 I40E_PTT_UNUSED_ENTRY(240), 529 I40E_PTT_UNUSED_ENTRY(241), 530 I40E_PTT_UNUSED_ENTRY(242), 531 I40E_PTT_UNUSED_ENTRY(243), 532 I40E_PTT_UNUSED_ENTRY(244), 533 I40E_PTT_UNUSED_ENTRY(245), 534 I40E_PTT_UNUSED_ENTRY(246), 535 I40E_PTT_UNUSED_ENTRY(247), 536 I40E_PTT_UNUSED_ENTRY(248), 537 I40E_PTT_UNUSED_ENTRY(249), 538 539 I40E_PTT_UNUSED_ENTRY(250), 540 I40E_PTT_UNUSED_ENTRY(251), 541 I40E_PTT_UNUSED_ENTRY(252), 542 I40E_PTT_UNUSED_ENTRY(253), 543 I40E_PTT_UNUSED_ENTRY(254), 544 I40E_PTT_UNUSED_ENTRY(255) 545 }; 546 547 548 /** 549 * i40e_init_shared_code - Initialize the shared code 550 * @hw: pointer to hardware structure 551 * 552 * This assigns the MAC type and PHY code and inits the NVM. 553 * Does not touch the hardware. This function must be called prior to any 554 * other function in the shared code. The i40e_hw structure should be 555 * memset to 0 prior to calling this function. The following fields in 556 * hw structure should be filled in prior to calling this function: 557 * hw_addr, back, device_id, vendor_id, subsystem_device_id, 558 * subsystem_vendor_id, and revision_id 559 **/ 560 enum i40e_status_code i40e_init_shared_code(struct i40e_hw *hw) 561 { 562 enum i40e_status_code status = I40E_SUCCESS; 563 u32 reg; 564 565 DEBUGFUNC("i40e_init_shared_code"); 566 567 i40e_set_mac_type(hw); 568 569 switch (hw->mac.type) { 570 case I40E_MAC_XL710: 571 break; 572 default: 573 return I40E_ERR_DEVICE_NOT_SUPPORTED; 574 } 575 576 hw->phy.get_link_info = TRUE; 577 578 /* Determine port number */ 579 reg = rd32(hw, I40E_PFGEN_PORTNUM); 580 reg = ((reg & I40E_PFGEN_PORTNUM_PORT_NUM_MASK) >> 581 I40E_PFGEN_PORTNUM_PORT_NUM_SHIFT); 582 hw->port = (u8)reg; 583 584 /* Determine the PF number based on the PCI fn */ 585 reg = rd32(hw, I40E_GLPCI_CAPSUP); 586 if (reg & I40E_GLPCI_CAPSUP_ARI_EN_MASK) 587 hw->pf_id = (u8)((hw->bus.device << 3) | hw->bus.func); 588 else 589 hw->pf_id = (u8)hw->bus.func; 590 591 status = i40e_init_nvm(hw); 592 return status; 593 } 594 595 /** 596 * i40e_aq_mac_address_read - Retrieve the MAC addresses 597 * @hw: pointer to the hw struct 598 * @flags: a return indicator of what addresses were added to the addr store 599 * @addrs: the requestor's mac addr store 600 * @cmd_details: pointer to command details structure or NULL 601 **/ 602 static enum i40e_status_code i40e_aq_mac_address_read(struct i40e_hw *hw, 603 u16 *flags, 604 struct i40e_aqc_mac_address_read_data *addrs, 605 struct i40e_asq_cmd_details *cmd_details) 606 { 607 struct i40e_aq_desc desc; 608 struct i40e_aqc_mac_address_read *cmd_data = 609 (struct i40e_aqc_mac_address_read *)&desc.params.raw; 610 enum i40e_status_code status; 611 612 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_mac_address_read); 613 desc.flags |= CPU_TO_LE16(I40E_AQ_FLAG_BUF); 614 615 status = i40e_asq_send_command(hw, &desc, addrs, 616 sizeof(*addrs), cmd_details); 617 *flags = LE16_TO_CPU(cmd_data->command_flags); 618 619 return status; 620 } 621 622 /** 623 * i40e_aq_mac_address_write - Change the MAC addresses 624 * @hw: pointer to the hw struct 625 * @flags: indicates which MAC to be written 626 * @mac_addr: address to write 627 * @cmd_details: pointer to command details structure or NULL 628 **/ 629 enum i40e_status_code i40e_aq_mac_address_write(struct i40e_hw *hw, 630 u16 flags, u8 *mac_addr, 631 struct i40e_asq_cmd_details *cmd_details) 632 { 633 struct i40e_aq_desc desc; 634 struct i40e_aqc_mac_address_write *cmd_data = 635 (struct i40e_aqc_mac_address_write *)&desc.params.raw; 636 enum i40e_status_code status; 637 638 i40e_fill_default_direct_cmd_desc(&desc, 639 i40e_aqc_opc_mac_address_write); 640 cmd_data->command_flags = CPU_TO_LE16(flags); 641 cmd_data->mac_sah = CPU_TO_LE16((u16)mac_addr[0] << 8 | mac_addr[1]); 642 cmd_data->mac_sal = CPU_TO_LE32(((u32)mac_addr[2] << 24) | 643 ((u32)mac_addr[3] << 16) | 644 ((u32)mac_addr[4] << 8) | 645 mac_addr[5]); 646 647 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details); 648 649 return status; 650 } 651 652 /** 653 * i40e_get_mac_addr - get MAC address 654 * @hw: pointer to the HW structure 655 * @mac_addr: pointer to MAC address 656 * 657 * Reads the adapter's MAC address from register 658 **/ 659 enum i40e_status_code i40e_get_mac_addr(struct i40e_hw *hw, u8 *mac_addr) 660 { 661 struct i40e_aqc_mac_address_read_data addrs; 662 enum i40e_status_code status; 663 u16 flags = 0; 664 665 status = i40e_aq_mac_address_read(hw, &flags, &addrs, NULL); 666 667 if (flags & I40E_AQC_LAN_ADDR_VALID) 668 memcpy(mac_addr, &addrs.pf_lan_mac, sizeof(addrs.pf_lan_mac)); 669 670 return status; 671 } 672 673 /** 674 * i40e_get_port_mac_addr - get Port MAC address 675 * @hw: pointer to the HW structure 676 * @mac_addr: pointer to Port MAC address 677 * 678 * Reads the adapter's Port MAC address 679 **/ 680 enum i40e_status_code i40e_get_port_mac_addr(struct i40e_hw *hw, u8 *mac_addr) 681 { 682 struct i40e_aqc_mac_address_read_data addrs; 683 enum i40e_status_code status; 684 u16 flags = 0; 685 686 status = i40e_aq_mac_address_read(hw, &flags, &addrs, NULL); 687 if (status) 688 return status; 689 690 if (flags & I40E_AQC_PORT_ADDR_VALID) 691 memcpy(mac_addr, &addrs.port_mac, sizeof(addrs.port_mac)); 692 else 693 status = I40E_ERR_INVALID_MAC_ADDR; 694 695 return status; 696 } 697 698 /** 699 * i40e_pre_tx_queue_cfg - pre tx queue configure 700 * @hw: pointer to the HW structure 701 * @queue: target pf queue index 702 * @enable: state change request 703 * 704 * Handles hw requirement to indicate intention to enable 705 * or disable target queue. 706 **/ 707 void i40e_pre_tx_queue_cfg(struct i40e_hw *hw, u32 queue, bool enable) 708 { 709 u32 abs_queue_idx = hw->func_caps.base_queue + queue; 710 u32 reg_block = 0; 711 u32 reg_val; 712 713 if (abs_queue_idx >= 128) { 714 reg_block = abs_queue_idx / 128; 715 abs_queue_idx %= 128; 716 } 717 718 reg_val = rd32(hw, I40E_GLLAN_TXPRE_QDIS(reg_block)); 719 reg_val &= ~I40E_GLLAN_TXPRE_QDIS_QINDX_MASK; 720 reg_val |= (abs_queue_idx << I40E_GLLAN_TXPRE_QDIS_QINDX_SHIFT); 721 722 if (enable) 723 reg_val |= I40E_GLLAN_TXPRE_QDIS_CLEAR_QDIS_MASK; 724 else 725 reg_val |= I40E_GLLAN_TXPRE_QDIS_SET_QDIS_MASK; 726 727 wr32(hw, I40E_GLLAN_TXPRE_QDIS(reg_block), reg_val); 728 } 729 730 /** 731 * i40e_validate_mac_addr - Validate unicast MAC address 732 * @mac_addr: pointer to MAC address 733 * 734 * Tests a MAC address to ensure it is a valid Individual Address 735 **/ 736 enum i40e_status_code i40e_validate_mac_addr(u8 *mac_addr) 737 { 738 enum i40e_status_code status = I40E_SUCCESS; 739 740 DEBUGFUNC("i40e_validate_mac_addr"); 741 742 /* Broadcast addresses ARE multicast addresses 743 * Make sure it is not a multicast address 744 * Reject the zero address 745 */ 746 if (I40E_IS_MULTICAST(mac_addr) || 747 (mac_addr[0] == 0 && mac_addr[1] == 0 && mac_addr[2] == 0 && 748 mac_addr[3] == 0 && mac_addr[4] == 0 && mac_addr[5] == 0)) 749 status = I40E_ERR_INVALID_MAC_ADDR; 750 751 return status; 752 } 753 754 /** 755 * i40e_get_media_type - Gets media type 756 * @hw: pointer to the hardware structure 757 **/ 758 static enum i40e_media_type i40e_get_media_type(struct i40e_hw *hw) 759 { 760 enum i40e_media_type media; 761 762 switch (hw->phy.link_info.phy_type) { 763 case I40E_PHY_TYPE_10GBASE_SR: 764 case I40E_PHY_TYPE_10GBASE_LR: 765 case I40E_PHY_TYPE_1000BASE_SX: 766 case I40E_PHY_TYPE_1000BASE_LX: 767 case I40E_PHY_TYPE_40GBASE_SR4: 768 case I40E_PHY_TYPE_40GBASE_LR4: 769 media = I40E_MEDIA_TYPE_FIBER; 770 break; 771 case I40E_PHY_TYPE_100BASE_TX: 772 case I40E_PHY_TYPE_1000BASE_T: 773 case I40E_PHY_TYPE_10GBASE_T: 774 media = I40E_MEDIA_TYPE_BASET; 775 break; 776 case I40E_PHY_TYPE_10GBASE_CR1_CU: 777 case I40E_PHY_TYPE_40GBASE_CR4_CU: 778 case I40E_PHY_TYPE_10GBASE_CR1: 779 case I40E_PHY_TYPE_40GBASE_CR4: 780 case I40E_PHY_TYPE_10GBASE_SFPP_CU: 781 media = I40E_MEDIA_TYPE_DA; 782 break; 783 case I40E_PHY_TYPE_1000BASE_KX: 784 case I40E_PHY_TYPE_10GBASE_KX4: 785 case I40E_PHY_TYPE_10GBASE_KR: 786 case I40E_PHY_TYPE_40GBASE_KR4: 787 media = I40E_MEDIA_TYPE_BACKPLANE; 788 break; 789 case I40E_PHY_TYPE_SGMII: 790 case I40E_PHY_TYPE_XAUI: 791 case I40E_PHY_TYPE_XFI: 792 case I40E_PHY_TYPE_XLAUI: 793 case I40E_PHY_TYPE_XLPPI: 794 default: 795 media = I40E_MEDIA_TYPE_UNKNOWN; 796 break; 797 } 798 799 return media; 800 } 801 802 #define I40E_PF_RESET_WAIT_COUNT 100 803 /** 804 * i40e_pf_reset - Reset the PF 805 * @hw: pointer to the hardware structure 806 * 807 * Assuming someone else has triggered a global reset, 808 * assure the global reset is complete and then reset the PF 809 **/ 810 enum i40e_status_code i40e_pf_reset(struct i40e_hw *hw) 811 { 812 u32 cnt = 0; 813 u32 cnt1 = 0; 814 u32 reg = 0; 815 u32 grst_del; 816 817 /* Poll for Global Reset steady state in case of recent GRST. 818 * The grst delay value is in 100ms units, and we'll wait a 819 * couple counts longer to be sure we don't just miss the end. 820 */ 821 grst_del = rd32(hw, I40E_GLGEN_RSTCTL) & I40E_GLGEN_RSTCTL_GRSTDEL_MASK 822 >> I40E_GLGEN_RSTCTL_GRSTDEL_SHIFT; 823 for (cnt = 0; cnt < grst_del + 2; cnt++) { 824 reg = rd32(hw, I40E_GLGEN_RSTAT); 825 if (!(reg & I40E_GLGEN_RSTAT_DEVSTATE_MASK)) 826 break; 827 i40e_msec_delay(100); 828 } 829 if (reg & I40E_GLGEN_RSTAT_DEVSTATE_MASK) { 830 DEBUGOUT("Global reset polling failed to complete.\n"); 831 return I40E_ERR_RESET_FAILED; 832 } 833 834 /* Now Wait for the FW to be ready */ 835 for (cnt1 = 0; cnt1 < I40E_PF_RESET_WAIT_COUNT; cnt1++) { 836 reg = rd32(hw, I40E_GLNVM_ULD); 837 reg &= (I40E_GLNVM_ULD_CONF_CORE_DONE_MASK | 838 I40E_GLNVM_ULD_CONF_GLOBAL_DONE_MASK); 839 if (reg == (I40E_GLNVM_ULD_CONF_CORE_DONE_MASK | 840 I40E_GLNVM_ULD_CONF_GLOBAL_DONE_MASK)) { 841 DEBUGOUT1("Core and Global modules ready %d\n", cnt1); 842 break; 843 } 844 i40e_msec_delay(10); 845 } 846 if (!(reg & (I40E_GLNVM_ULD_CONF_CORE_DONE_MASK | 847 I40E_GLNVM_ULD_CONF_GLOBAL_DONE_MASK))) { 848 DEBUGOUT("wait for FW Reset complete timedout\n"); 849 DEBUGOUT1("I40E_GLNVM_ULD = 0x%x\n", reg); 850 return I40E_ERR_RESET_FAILED; 851 } 852 853 /* If there was a Global Reset in progress when we got here, 854 * we don't need to do the PF Reset 855 */ 856 if (!cnt) { 857 reg = rd32(hw, I40E_PFGEN_CTRL); 858 wr32(hw, I40E_PFGEN_CTRL, 859 (reg | I40E_PFGEN_CTRL_PFSWR_MASK)); 860 for (cnt = 0; cnt < I40E_PF_RESET_WAIT_COUNT; cnt++) { 861 reg = rd32(hw, I40E_PFGEN_CTRL); 862 if (!(reg & I40E_PFGEN_CTRL_PFSWR_MASK)) 863 break; 864 i40e_msec_delay(1); 865 } 866 if (reg & I40E_PFGEN_CTRL_PFSWR_MASK) { 867 DEBUGOUT("PF reset polling failed to complete.\n"); 868 return I40E_ERR_RESET_FAILED; 869 } 870 } 871 872 i40e_clear_pxe_mode(hw); 873 874 875 return I40E_SUCCESS; 876 } 877 878 /** 879 * i40e_clear_hw - clear out any left over hw state 880 * @hw: pointer to the hw struct 881 * 882 * Clear queues and interrupts, typically called at init time, 883 * but after the capabilities have been found so we know how many 884 * queues and msix vectors have been allocated. 885 **/ 886 void i40e_clear_hw(struct i40e_hw *hw) 887 { 888 u32 num_queues, base_queue; 889 u32 num_pf_int; 890 u32 num_vf_int; 891 u32 num_vfs; 892 u32 i, j; 893 u32 val; 894 u32 eol = 0x7ff; 895 896 /* get number of interrupts, queues, and vfs */ 897 val = rd32(hw, I40E_GLPCI_CNF2); 898 num_pf_int = (val & I40E_GLPCI_CNF2_MSI_X_PF_N_MASK) >> 899 I40E_GLPCI_CNF2_MSI_X_PF_N_SHIFT; 900 num_vf_int = (val & I40E_GLPCI_CNF2_MSI_X_VF_N_MASK) >> 901 I40E_GLPCI_CNF2_MSI_X_VF_N_SHIFT; 902 903 val = rd32(hw, I40E_PFLAN_QALLOC); 904 base_queue = (val & I40E_PFLAN_QALLOC_FIRSTQ_MASK) >> 905 I40E_PFLAN_QALLOC_FIRSTQ_SHIFT; 906 j = (val & I40E_PFLAN_QALLOC_LASTQ_MASK) >> 907 I40E_PFLAN_QALLOC_LASTQ_SHIFT; 908 if (val & I40E_PFLAN_QALLOC_VALID_MASK) 909 num_queues = (j - base_queue) + 1; 910 else 911 num_queues = 0; 912 913 val = rd32(hw, I40E_PF_VT_PFALLOC); 914 i = (val & I40E_PF_VT_PFALLOC_FIRSTVF_MASK) >> 915 I40E_PF_VT_PFALLOC_FIRSTVF_SHIFT; 916 j = (val & I40E_PF_VT_PFALLOC_LASTVF_MASK) >> 917 I40E_PF_VT_PFALLOC_LASTVF_SHIFT; 918 if (val & I40E_PF_VT_PFALLOC_VALID_MASK) 919 num_vfs = (j - i) + 1; 920 else 921 num_vfs = 0; 922 923 /* stop all the interrupts */ 924 wr32(hw, I40E_PFINT_ICR0_ENA, 0); 925 val = 0x3 << I40E_PFINT_DYN_CTLN_ITR_INDX_SHIFT; 926 for (i = 0; i < num_pf_int - 2; i++) 927 wr32(hw, I40E_PFINT_DYN_CTLN(i), val); 928 929 /* Set the FIRSTQ_INDX field to 0x7FF in PFINT_LNKLSTx */ 930 val = eol << I40E_PFINT_LNKLST0_FIRSTQ_INDX_SHIFT; 931 wr32(hw, I40E_PFINT_LNKLST0, val); 932 for (i = 0; i < num_pf_int - 2; i++) 933 wr32(hw, I40E_PFINT_LNKLSTN(i), val); 934 val = eol << I40E_VPINT_LNKLST0_FIRSTQ_INDX_SHIFT; 935 for (i = 0; i < num_vfs; i++) 936 wr32(hw, I40E_VPINT_LNKLST0(i), val); 937 for (i = 0; i < num_vf_int - 2; i++) 938 wr32(hw, I40E_VPINT_LNKLSTN(i), val); 939 940 /* warn the HW of the coming Tx disables */ 941 for (i = 0; i < num_queues; i++) { 942 u32 abs_queue_idx = base_queue + i; 943 u32 reg_block = 0; 944 945 if (abs_queue_idx >= 128) { 946 reg_block = abs_queue_idx / 128; 947 abs_queue_idx %= 128; 948 } 949 950 val = rd32(hw, I40E_GLLAN_TXPRE_QDIS(reg_block)); 951 val &= ~I40E_GLLAN_TXPRE_QDIS_QINDX_MASK; 952 val |= (abs_queue_idx << I40E_GLLAN_TXPRE_QDIS_QINDX_SHIFT); 953 val |= I40E_GLLAN_TXPRE_QDIS_SET_QDIS_MASK; 954 955 wr32(hw, I40E_GLLAN_TXPRE_QDIS(reg_block), val); 956 } 957 i40e_usec_delay(400); 958 959 /* stop all the queues */ 960 for (i = 0; i < num_queues; i++) { 961 wr32(hw, I40E_QINT_TQCTL(i), 0); 962 wr32(hw, I40E_QTX_ENA(i), 0); 963 wr32(hw, I40E_QINT_RQCTL(i), 0); 964 wr32(hw, I40E_QRX_ENA(i), 0); 965 } 966 967 /* short wait for all queue disables to settle */ 968 i40e_usec_delay(50); 969 } 970 971 /** 972 * i40e_clear_pxe_mode - clear pxe operations mode 973 * @hw: pointer to the hw struct 974 * 975 * Make sure all PXE mode settings are cleared, including things 976 * like descriptor fetch/write-back mode. 977 **/ 978 void i40e_clear_pxe_mode(struct i40e_hw *hw) 979 { 980 if (i40e_check_asq_alive(hw)) 981 i40e_aq_clear_pxe_mode(hw, NULL); 982 } 983 984 /** 985 * i40e_led_is_mine - helper to find matching led 986 * @hw: pointer to the hw struct 987 * @idx: index into GPIO registers 988 * 989 * returns: 0 if no match, otherwise the value of the GPIO_CTL register 990 */ 991 static u32 i40e_led_is_mine(struct i40e_hw *hw, int idx) 992 { 993 u32 gpio_val = 0; 994 u32 port; 995 996 if (!hw->func_caps.led[idx]) 997 return 0; 998 999 gpio_val = rd32(hw, I40E_GLGEN_GPIO_CTL(idx)); 1000 port = (gpio_val & I40E_GLGEN_GPIO_CTL_PRT_NUM_MASK) >> 1001 I40E_GLGEN_GPIO_CTL_PRT_NUM_SHIFT; 1002 1003 /* if PRT_NUM_NA is 1 then this LED is not port specific, OR 1004 * if it is not our port then ignore 1005 */ 1006 if ((gpio_val & I40E_GLGEN_GPIO_CTL_PRT_NUM_NA_MASK) || 1007 (port != hw->port)) 1008 return 0; 1009 1010 return gpio_val; 1011 } 1012 1013 #define I40E_LED0 22 1014 #define I40E_LINK_ACTIVITY 0xC 1015 1016 /** 1017 * i40e_led_get - return current on/off mode 1018 * @hw: pointer to the hw struct 1019 * 1020 * The value returned is the 'mode' field as defined in the 1021 * GPIO register definitions: 0x0 = off, 0xf = on, and other 1022 * values are variations of possible behaviors relating to 1023 * blink, link, and wire. 1024 **/ 1025 u32 i40e_led_get(struct i40e_hw *hw) 1026 { 1027 u32 mode = 0; 1028 int i; 1029 1030 /* as per the documentation GPIO 22-29 are the LED 1031 * GPIO pins named LED0..LED7 1032 */ 1033 for (i = I40E_LED0; i <= I40E_GLGEN_GPIO_CTL_MAX_INDEX; i++) { 1034 u32 gpio_val = i40e_led_is_mine(hw, i); 1035 1036 if (!gpio_val) 1037 continue; 1038 1039 mode = (gpio_val & I40E_GLGEN_GPIO_CTL_LED_MODE_MASK) >> 1040 I40E_GLGEN_GPIO_CTL_LED_MODE_SHIFT; 1041 break; 1042 } 1043 1044 return mode; 1045 } 1046 1047 /** 1048 * i40e_led_set - set new on/off mode 1049 * @hw: pointer to the hw struct 1050 * @mode: 0=off, 0xf=on (else see manual for mode details) 1051 * @blink: TRUE if the LED should blink when on, FALSE if steady 1052 * 1053 * if this function is used to turn on the blink it should 1054 * be used to disable the blink when restoring the original state. 1055 **/ 1056 void i40e_led_set(struct i40e_hw *hw, u32 mode, bool blink) 1057 { 1058 int i; 1059 1060 if (mode & 0xfffffff0) 1061 DEBUGOUT1("invalid mode passed in %X\n", mode); 1062 1063 /* as per the documentation GPIO 22-29 are the LED 1064 * GPIO pins named LED0..LED7 1065 */ 1066 for (i = I40E_LED0; i <= I40E_GLGEN_GPIO_CTL_MAX_INDEX; i++) { 1067 u32 gpio_val = i40e_led_is_mine(hw, i); 1068 1069 if (!gpio_val) 1070 continue; 1071 1072 gpio_val &= ~I40E_GLGEN_GPIO_CTL_LED_MODE_MASK; 1073 /* this & is a bit of paranoia, but serves as a range check */ 1074 gpio_val |= ((mode << I40E_GLGEN_GPIO_CTL_LED_MODE_SHIFT) & 1075 I40E_GLGEN_GPIO_CTL_LED_MODE_MASK); 1076 1077 if (mode == I40E_LINK_ACTIVITY) 1078 blink = FALSE; 1079 1080 gpio_val |= (blink ? 1 : 0) << 1081 I40E_GLGEN_GPIO_CTL_LED_BLINK_SHIFT; 1082 1083 wr32(hw, I40E_GLGEN_GPIO_CTL(i), gpio_val); 1084 break; 1085 } 1086 } 1087 1088 /* Admin command wrappers */ 1089 1090 /** 1091 * i40e_aq_get_phy_capabilities 1092 * @hw: pointer to the hw struct 1093 * @abilities: structure for PHY capabilities to be filled 1094 * @qualified_modules: report Qualified Modules 1095 * @report_init: report init capabilities (active are default) 1096 * @cmd_details: pointer to command details structure or NULL 1097 * 1098 * Returns the various PHY abilities supported on the Port. 1099 **/ 1100 enum i40e_status_code i40e_aq_get_phy_capabilities(struct i40e_hw *hw, 1101 bool qualified_modules, bool report_init, 1102 struct i40e_aq_get_phy_abilities_resp *abilities, 1103 struct i40e_asq_cmd_details *cmd_details) 1104 { 1105 struct i40e_aq_desc desc; 1106 enum i40e_status_code status; 1107 u16 abilities_size = sizeof(struct i40e_aq_get_phy_abilities_resp); 1108 1109 if (!abilities) 1110 return I40E_ERR_PARAM; 1111 1112 i40e_fill_default_direct_cmd_desc(&desc, 1113 i40e_aqc_opc_get_phy_abilities); 1114 1115 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF); 1116 if (abilities_size > I40E_AQ_LARGE_BUF) 1117 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB); 1118 1119 if (qualified_modules) 1120 desc.params.external.param0 |= 1121 CPU_TO_LE32(I40E_AQ_PHY_REPORT_QUALIFIED_MODULES); 1122 1123 if (report_init) 1124 desc.params.external.param0 |= 1125 CPU_TO_LE32(I40E_AQ_PHY_REPORT_INITIAL_VALUES); 1126 1127 status = i40e_asq_send_command(hw, &desc, abilities, abilities_size, 1128 cmd_details); 1129 1130 if (hw->aq.asq_last_status == I40E_AQ_RC_EIO) 1131 status = I40E_ERR_UNKNOWN_PHY; 1132 1133 return status; 1134 } 1135 1136 /** 1137 * i40e_aq_set_phy_config 1138 * @hw: pointer to the hw struct 1139 * @config: structure with PHY configuration to be set 1140 * @cmd_details: pointer to command details structure or NULL 1141 * 1142 * Set the various PHY configuration parameters 1143 * supported on the Port.One or more of the Set PHY config parameters may be 1144 * ignored in an MFP mode as the PF may not have the privilege to set some 1145 * of the PHY Config parameters. This status will be indicated by the 1146 * command response. 1147 **/ 1148 enum i40e_status_code i40e_aq_set_phy_config(struct i40e_hw *hw, 1149 struct i40e_aq_set_phy_config *config, 1150 struct i40e_asq_cmd_details *cmd_details) 1151 { 1152 struct i40e_aq_desc desc; 1153 struct i40e_aq_set_phy_config *cmd = 1154 (struct i40e_aq_set_phy_config *)&desc.params.raw; 1155 enum i40e_status_code status; 1156 1157 if (!config) 1158 return I40E_ERR_PARAM; 1159 1160 i40e_fill_default_direct_cmd_desc(&desc, 1161 i40e_aqc_opc_set_phy_config); 1162 1163 *cmd = *config; 1164 1165 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details); 1166 1167 return status; 1168 } 1169 1170 /** 1171 * i40e_set_fc 1172 * @hw: pointer to the hw struct 1173 * 1174 * Set the requested flow control mode using set_phy_config. 1175 **/ 1176 enum i40e_status_code i40e_set_fc(struct i40e_hw *hw, u8 *aq_failures, 1177 bool atomic_restart) 1178 { 1179 enum i40e_fc_mode fc_mode = hw->fc.requested_mode; 1180 struct i40e_aq_get_phy_abilities_resp abilities; 1181 struct i40e_aq_set_phy_config config; 1182 enum i40e_status_code status; 1183 u8 pause_mask = 0x0; 1184 1185 *aq_failures = 0x0; 1186 1187 switch (fc_mode) { 1188 case I40E_FC_FULL: 1189 pause_mask |= I40E_AQ_PHY_FLAG_PAUSE_TX; 1190 pause_mask |= I40E_AQ_PHY_FLAG_PAUSE_RX; 1191 break; 1192 case I40E_FC_RX_PAUSE: 1193 pause_mask |= I40E_AQ_PHY_FLAG_PAUSE_RX; 1194 break; 1195 case I40E_FC_TX_PAUSE: 1196 pause_mask |= I40E_AQ_PHY_FLAG_PAUSE_TX; 1197 break; 1198 default: 1199 break; 1200 } 1201 1202 /* Get the current phy config */ 1203 status = i40e_aq_get_phy_capabilities(hw, FALSE, false, &abilities, 1204 NULL); 1205 if (status) { 1206 *aq_failures |= I40E_SET_FC_AQ_FAIL_GET; 1207 return status; 1208 } 1209 1210 memset(&config, 0, sizeof(struct i40e_aq_set_phy_config)); 1211 /* clear the old pause settings */ 1212 config.abilities = abilities.abilities & ~(I40E_AQ_PHY_FLAG_PAUSE_TX) & 1213 ~(I40E_AQ_PHY_FLAG_PAUSE_RX); 1214 /* set the new abilities */ 1215 config.abilities |= pause_mask; 1216 /* If the abilities have changed, then set the new config */ 1217 if (config.abilities != abilities.abilities) { 1218 /* Auto restart link so settings take effect */ 1219 if (atomic_restart) 1220 config.abilities |= I40E_AQ_PHY_ENABLE_ATOMIC_LINK; 1221 /* Copy over all the old settings */ 1222 config.phy_type = abilities.phy_type; 1223 config.link_speed = abilities.link_speed; 1224 config.eee_capability = abilities.eee_capability; 1225 config.eeer = abilities.eeer_val; 1226 config.low_power_ctrl = abilities.d3_lpan; 1227 status = i40e_aq_set_phy_config(hw, &config, NULL); 1228 1229 if (status) 1230 *aq_failures |= I40E_SET_FC_AQ_FAIL_SET; 1231 } 1232 /* Update the link info */ 1233 status = i40e_update_link_info(hw, TRUE); 1234 if (status) { 1235 /* Wait a little bit (on 40G cards it sometimes takes a really 1236 * long time for link to come back from the atomic reset) 1237 * and try once more 1238 */ 1239 i40e_msec_delay(1000); 1240 status = i40e_update_link_info(hw, TRUE); 1241 } 1242 if (status) 1243 *aq_failures |= I40E_SET_FC_AQ_FAIL_UPDATE; 1244 1245 return status; 1246 } 1247 1248 /** 1249 * i40e_aq_set_mac_config 1250 * @hw: pointer to the hw struct 1251 * @max_frame_size: Maximum Frame Size to be supported by the port 1252 * @crc_en: Tell HW to append a CRC to outgoing frames 1253 * @pacing: Pacing configurations 1254 * @cmd_details: pointer to command details structure or NULL 1255 * 1256 * Configure MAC settings for frame size, jumbo frame support and the 1257 * addition of a CRC by the hardware. 1258 **/ 1259 enum i40e_status_code i40e_aq_set_mac_config(struct i40e_hw *hw, 1260 u16 max_frame_size, 1261 bool crc_en, u16 pacing, 1262 struct i40e_asq_cmd_details *cmd_details) 1263 { 1264 struct i40e_aq_desc desc; 1265 struct i40e_aq_set_mac_config *cmd = 1266 (struct i40e_aq_set_mac_config *)&desc.params.raw; 1267 enum i40e_status_code status; 1268 1269 if (max_frame_size == 0) 1270 return I40E_ERR_PARAM; 1271 1272 i40e_fill_default_direct_cmd_desc(&desc, 1273 i40e_aqc_opc_set_mac_config); 1274 1275 cmd->max_frame_size = CPU_TO_LE16(max_frame_size); 1276 cmd->params = ((u8)pacing & 0x0F) << 3; 1277 if (crc_en) 1278 cmd->params |= I40E_AQ_SET_MAC_CONFIG_CRC_EN; 1279 1280 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details); 1281 1282 return status; 1283 } 1284 1285 /** 1286 * i40e_aq_clear_pxe_mode 1287 * @hw: pointer to the hw struct 1288 * @cmd_details: pointer to command details structure or NULL 1289 * 1290 * Tell the firmware that the driver is taking over from PXE 1291 **/ 1292 enum i40e_status_code i40e_aq_clear_pxe_mode(struct i40e_hw *hw, 1293 struct i40e_asq_cmd_details *cmd_details) 1294 { 1295 enum i40e_status_code status; 1296 struct i40e_aq_desc desc; 1297 struct i40e_aqc_clear_pxe *cmd = 1298 (struct i40e_aqc_clear_pxe *)&desc.params.raw; 1299 1300 i40e_fill_default_direct_cmd_desc(&desc, 1301 i40e_aqc_opc_clear_pxe_mode); 1302 1303 cmd->rx_cnt = 0x2; 1304 1305 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details); 1306 1307 wr32(hw, I40E_GLLAN_RCTL_0, 0x1); 1308 1309 return status; 1310 } 1311 1312 /** 1313 * i40e_aq_set_link_restart_an 1314 * @hw: pointer to the hw struct 1315 * @enable_link: if TRUE: enable link, if FALSE: disable link 1316 * @cmd_details: pointer to command details structure or NULL 1317 * 1318 * Sets up the link and restarts the Auto-Negotiation over the link. 1319 **/ 1320 enum i40e_status_code i40e_aq_set_link_restart_an(struct i40e_hw *hw, 1321 bool enable_link, struct i40e_asq_cmd_details *cmd_details) 1322 { 1323 struct i40e_aq_desc desc; 1324 struct i40e_aqc_set_link_restart_an *cmd = 1325 (struct i40e_aqc_set_link_restart_an *)&desc.params.raw; 1326 enum i40e_status_code status; 1327 1328 i40e_fill_default_direct_cmd_desc(&desc, 1329 i40e_aqc_opc_set_link_restart_an); 1330 1331 cmd->command = I40E_AQ_PHY_RESTART_AN; 1332 if (enable_link) 1333 cmd->command |= I40E_AQ_PHY_LINK_ENABLE; 1334 else 1335 cmd->command &= ~I40E_AQ_PHY_LINK_ENABLE; 1336 1337 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details); 1338 1339 return status; 1340 } 1341 1342 /** 1343 * i40e_aq_get_link_info 1344 * @hw: pointer to the hw struct 1345 * @enable_lse: enable/disable LinkStatusEvent reporting 1346 * @link: pointer to link status structure - optional 1347 * @cmd_details: pointer to command details structure or NULL 1348 * 1349 * Returns the link status of the adapter. 1350 **/ 1351 enum i40e_status_code i40e_aq_get_link_info(struct i40e_hw *hw, 1352 bool enable_lse, struct i40e_link_status *link, 1353 struct i40e_asq_cmd_details *cmd_details) 1354 { 1355 struct i40e_aq_desc desc; 1356 struct i40e_aqc_get_link_status *resp = 1357 (struct i40e_aqc_get_link_status *)&desc.params.raw; 1358 struct i40e_link_status *hw_link_info = &hw->phy.link_info; 1359 enum i40e_status_code status; 1360 bool tx_pause, rx_pause; 1361 u16 command_flags; 1362 1363 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_get_link_status); 1364 1365 if (enable_lse) 1366 command_flags = I40E_AQ_LSE_ENABLE; 1367 else 1368 command_flags = I40E_AQ_LSE_DISABLE; 1369 resp->command_flags = CPU_TO_LE16(command_flags); 1370 1371 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details); 1372 1373 if (status != I40E_SUCCESS) 1374 goto aq_get_link_info_exit; 1375 1376 /* save off old link status information */ 1377 i40e_memcpy(&hw->phy.link_info_old, hw_link_info, 1378 sizeof(struct i40e_link_status), I40E_NONDMA_TO_NONDMA); 1379 1380 /* update link status */ 1381 hw_link_info->phy_type = (enum i40e_aq_phy_type)resp->phy_type; 1382 hw->phy.media_type = i40e_get_media_type(hw); 1383 hw_link_info->link_speed = (enum i40e_aq_link_speed)resp->link_speed; 1384 hw_link_info->link_info = resp->link_info; 1385 hw_link_info->an_info = resp->an_info; 1386 hw_link_info->ext_info = resp->ext_info; 1387 hw_link_info->loopback = resp->loopback; 1388 hw_link_info->max_frame_size = LE16_TO_CPU(resp->max_frame_size); 1389 hw_link_info->pacing = resp->config & I40E_AQ_CONFIG_PACING_MASK; 1390 1391 /* update fc info */ 1392 tx_pause = !!(resp->an_info & I40E_AQ_LINK_PAUSE_TX); 1393 rx_pause = !!(resp->an_info & I40E_AQ_LINK_PAUSE_RX); 1394 if (tx_pause & rx_pause) 1395 hw->fc.current_mode = I40E_FC_FULL; 1396 else if (tx_pause) 1397 hw->fc.current_mode = I40E_FC_TX_PAUSE; 1398 else if (rx_pause) 1399 hw->fc.current_mode = I40E_FC_RX_PAUSE; 1400 else 1401 hw->fc.current_mode = I40E_FC_NONE; 1402 1403 if (resp->config & I40E_AQ_CONFIG_CRC_ENA) 1404 hw_link_info->crc_enable = TRUE; 1405 else 1406 hw_link_info->crc_enable = FALSE; 1407 1408 if (resp->command_flags & CPU_TO_LE16(I40E_AQ_LSE_ENABLE)) 1409 hw_link_info->lse_enable = TRUE; 1410 else 1411 hw_link_info->lse_enable = FALSE; 1412 1413 /* save link status information */ 1414 if (link) 1415 i40e_memcpy(link, hw_link_info, sizeof(struct i40e_link_status), 1416 I40E_NONDMA_TO_NONDMA); 1417 1418 /* flag cleared so helper functions don't call AQ again */ 1419 hw->phy.get_link_info = FALSE; 1420 1421 aq_get_link_info_exit: 1422 return status; 1423 } 1424 1425 /** 1426 * i40e_update_link_info 1427 * @hw: pointer to the hw struct 1428 * @enable_lse: enable/disable LinkStatusEvent reporting 1429 * 1430 * Returns the link status of the adapter 1431 **/ 1432 enum i40e_status_code i40e_update_link_info(struct i40e_hw *hw, 1433 bool enable_lse) 1434 { 1435 struct i40e_aq_get_phy_abilities_resp abilities; 1436 enum i40e_status_code status; 1437 1438 status = i40e_aq_get_link_info(hw, enable_lse, NULL, NULL); 1439 if (status) 1440 return status; 1441 1442 status = i40e_aq_get_phy_capabilities(hw, FALSE, false, 1443 &abilities, NULL); 1444 if (status) 1445 return status; 1446 1447 if (abilities.abilities & I40E_AQ_PHY_AN_ENABLED) 1448 hw->phy.link_info.an_enabled = TRUE; 1449 else 1450 hw->phy.link_info.an_enabled = FALSE; 1451 1452 return status; 1453 } 1454 1455 /** 1456 * i40e_aq_set_phy_int_mask 1457 * @hw: pointer to the hw struct 1458 * @mask: interrupt mask to be set 1459 * @cmd_details: pointer to command details structure or NULL 1460 * 1461 * Set link interrupt mask. 1462 **/ 1463 enum i40e_status_code i40e_aq_set_phy_int_mask(struct i40e_hw *hw, 1464 u16 mask, 1465 struct i40e_asq_cmd_details *cmd_details) 1466 { 1467 struct i40e_aq_desc desc; 1468 struct i40e_aqc_set_phy_int_mask *cmd = 1469 (struct i40e_aqc_set_phy_int_mask *)&desc.params.raw; 1470 enum i40e_status_code status; 1471 1472 i40e_fill_default_direct_cmd_desc(&desc, 1473 i40e_aqc_opc_set_phy_int_mask); 1474 1475 cmd->event_mask = CPU_TO_LE16(mask); 1476 1477 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details); 1478 1479 return status; 1480 } 1481 1482 /** 1483 * i40e_aq_get_local_advt_reg 1484 * @hw: pointer to the hw struct 1485 * @advt_reg: local AN advertisement register value 1486 * @cmd_details: pointer to command details structure or NULL 1487 * 1488 * Get the Local AN advertisement register value. 1489 **/ 1490 enum i40e_status_code i40e_aq_get_local_advt_reg(struct i40e_hw *hw, 1491 u64 *advt_reg, 1492 struct i40e_asq_cmd_details *cmd_details) 1493 { 1494 struct i40e_aq_desc desc; 1495 struct i40e_aqc_an_advt_reg *resp = 1496 (struct i40e_aqc_an_advt_reg *)&desc.params.raw; 1497 enum i40e_status_code status; 1498 1499 i40e_fill_default_direct_cmd_desc(&desc, 1500 i40e_aqc_opc_get_local_advt_reg); 1501 1502 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details); 1503 1504 if (status != I40E_SUCCESS) 1505 goto aq_get_local_advt_reg_exit; 1506 1507 *advt_reg = (u64)(LE16_TO_CPU(resp->local_an_reg1)) << 32; 1508 *advt_reg |= LE32_TO_CPU(resp->local_an_reg0); 1509 1510 aq_get_local_advt_reg_exit: 1511 return status; 1512 } 1513 1514 /** 1515 * i40e_aq_set_local_advt_reg 1516 * @hw: pointer to the hw struct 1517 * @advt_reg: local AN advertisement register value 1518 * @cmd_details: pointer to command details structure or NULL 1519 * 1520 * Get the Local AN advertisement register value. 1521 **/ 1522 enum i40e_status_code i40e_aq_set_local_advt_reg(struct i40e_hw *hw, 1523 u64 advt_reg, 1524 struct i40e_asq_cmd_details *cmd_details) 1525 { 1526 struct i40e_aq_desc desc; 1527 struct i40e_aqc_an_advt_reg *cmd = 1528 (struct i40e_aqc_an_advt_reg *)&desc.params.raw; 1529 enum i40e_status_code status; 1530 1531 i40e_fill_default_direct_cmd_desc(&desc, 1532 i40e_aqc_opc_get_local_advt_reg); 1533 1534 cmd->local_an_reg0 = CPU_TO_LE32(I40E_LO_DWORD(advt_reg)); 1535 cmd->local_an_reg1 = CPU_TO_LE16(I40E_HI_DWORD(advt_reg)); 1536 1537 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details); 1538 1539 return status; 1540 } 1541 1542 /** 1543 * i40e_aq_get_partner_advt 1544 * @hw: pointer to the hw struct 1545 * @advt_reg: AN partner advertisement register value 1546 * @cmd_details: pointer to command details structure or NULL 1547 * 1548 * Get the link partner AN advertisement register value. 1549 **/ 1550 enum i40e_status_code i40e_aq_get_partner_advt(struct i40e_hw *hw, 1551 u64 *advt_reg, 1552 struct i40e_asq_cmd_details *cmd_details) 1553 { 1554 struct i40e_aq_desc desc; 1555 struct i40e_aqc_an_advt_reg *resp = 1556 (struct i40e_aqc_an_advt_reg *)&desc.params.raw; 1557 enum i40e_status_code status; 1558 1559 i40e_fill_default_direct_cmd_desc(&desc, 1560 i40e_aqc_opc_get_partner_advt); 1561 1562 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details); 1563 1564 if (status != I40E_SUCCESS) 1565 goto aq_get_partner_advt_exit; 1566 1567 *advt_reg = (u64)(LE16_TO_CPU(resp->local_an_reg1)) << 32; 1568 *advt_reg |= LE32_TO_CPU(resp->local_an_reg0); 1569 1570 aq_get_partner_advt_exit: 1571 return status; 1572 } 1573 1574 /** 1575 * i40e_aq_set_lb_modes 1576 * @hw: pointer to the hw struct 1577 * @lb_modes: loopback mode to be set 1578 * @cmd_details: pointer to command details structure or NULL 1579 * 1580 * Sets loopback modes. 1581 **/ 1582 enum i40e_status_code i40e_aq_set_lb_modes(struct i40e_hw *hw, 1583 u16 lb_modes, 1584 struct i40e_asq_cmd_details *cmd_details) 1585 { 1586 struct i40e_aq_desc desc; 1587 struct i40e_aqc_set_lb_mode *cmd = 1588 (struct i40e_aqc_set_lb_mode *)&desc.params.raw; 1589 enum i40e_status_code status; 1590 1591 i40e_fill_default_direct_cmd_desc(&desc, 1592 i40e_aqc_opc_set_lb_modes); 1593 1594 cmd->lb_mode = CPU_TO_LE16(lb_modes); 1595 1596 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details); 1597 1598 return status; 1599 } 1600 1601 /** 1602 * i40e_aq_set_phy_debug 1603 * @hw: pointer to the hw struct 1604 * @cmd_flags: debug command flags 1605 * @cmd_details: pointer to command details structure or NULL 1606 * 1607 * Reset the external PHY. 1608 **/ 1609 enum i40e_status_code i40e_aq_set_phy_debug(struct i40e_hw *hw, u8 cmd_flags, 1610 struct i40e_asq_cmd_details *cmd_details) 1611 { 1612 struct i40e_aq_desc desc; 1613 struct i40e_aqc_set_phy_debug *cmd = 1614 (struct i40e_aqc_set_phy_debug *)&desc.params.raw; 1615 enum i40e_status_code status; 1616 1617 i40e_fill_default_direct_cmd_desc(&desc, 1618 i40e_aqc_opc_set_phy_debug); 1619 1620 cmd->command_flags = cmd_flags; 1621 1622 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details); 1623 1624 return status; 1625 } 1626 1627 /** 1628 * i40e_aq_add_vsi 1629 * @hw: pointer to the hw struct 1630 * @vsi_ctx: pointer to a vsi context struct 1631 * @cmd_details: pointer to command details structure or NULL 1632 * 1633 * Add a VSI context to the hardware. 1634 **/ 1635 enum i40e_status_code i40e_aq_add_vsi(struct i40e_hw *hw, 1636 struct i40e_vsi_context *vsi_ctx, 1637 struct i40e_asq_cmd_details *cmd_details) 1638 { 1639 struct i40e_aq_desc desc; 1640 struct i40e_aqc_add_get_update_vsi *cmd = 1641 (struct i40e_aqc_add_get_update_vsi *)&desc.params.raw; 1642 struct i40e_aqc_add_get_update_vsi_completion *resp = 1643 (struct i40e_aqc_add_get_update_vsi_completion *) 1644 &desc.params.raw; 1645 enum i40e_status_code status; 1646 1647 i40e_fill_default_direct_cmd_desc(&desc, 1648 i40e_aqc_opc_add_vsi); 1649 1650 cmd->uplink_seid = CPU_TO_LE16(vsi_ctx->uplink_seid); 1651 cmd->connection_type = vsi_ctx->connection_type; 1652 cmd->vf_id = vsi_ctx->vf_num; 1653 cmd->vsi_flags = CPU_TO_LE16(vsi_ctx->flags); 1654 1655 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD)); 1656 1657 status = i40e_asq_send_command(hw, &desc, &vsi_ctx->info, 1658 sizeof(vsi_ctx->info), cmd_details); 1659 1660 if (status != I40E_SUCCESS) 1661 goto aq_add_vsi_exit; 1662 1663 vsi_ctx->seid = LE16_TO_CPU(resp->seid); 1664 vsi_ctx->vsi_number = LE16_TO_CPU(resp->vsi_number); 1665 vsi_ctx->vsis_allocated = LE16_TO_CPU(resp->vsi_used); 1666 vsi_ctx->vsis_unallocated = LE16_TO_CPU(resp->vsi_free); 1667 1668 aq_add_vsi_exit: 1669 return status; 1670 } 1671 1672 /** 1673 * i40e_aq_set_default_vsi 1674 * @hw: pointer to the hw struct 1675 * @seid: vsi number 1676 * @cmd_details: pointer to command details structure or NULL 1677 **/ 1678 enum i40e_status_code i40e_aq_set_default_vsi(struct i40e_hw *hw, 1679 u16 seid, 1680 struct i40e_asq_cmd_details *cmd_details) 1681 { 1682 struct i40e_aq_desc desc; 1683 struct i40e_aqc_set_vsi_promiscuous_modes *cmd = 1684 (struct i40e_aqc_set_vsi_promiscuous_modes *) 1685 &desc.params.raw; 1686 enum i40e_status_code status; 1687 1688 i40e_fill_default_direct_cmd_desc(&desc, 1689 i40e_aqc_opc_set_vsi_promiscuous_modes); 1690 1691 cmd->promiscuous_flags = CPU_TO_LE16(I40E_AQC_SET_VSI_DEFAULT); 1692 cmd->valid_flags = CPU_TO_LE16(I40E_AQC_SET_VSI_DEFAULT); 1693 cmd->seid = CPU_TO_LE16(seid); 1694 1695 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details); 1696 1697 return status; 1698 } 1699 1700 /** 1701 * i40e_aq_set_vsi_unicast_promiscuous 1702 * @hw: pointer to the hw struct 1703 * @seid: vsi number 1704 * @set: set unicast promiscuous enable/disable 1705 * @cmd_details: pointer to command details structure or NULL 1706 **/ 1707 enum i40e_status_code i40e_aq_set_vsi_unicast_promiscuous(struct i40e_hw *hw, 1708 u16 seid, bool set, 1709 struct i40e_asq_cmd_details *cmd_details) 1710 { 1711 struct i40e_aq_desc desc; 1712 struct i40e_aqc_set_vsi_promiscuous_modes *cmd = 1713 (struct i40e_aqc_set_vsi_promiscuous_modes *)&desc.params.raw; 1714 enum i40e_status_code status; 1715 u16 flags = 0; 1716 1717 i40e_fill_default_direct_cmd_desc(&desc, 1718 i40e_aqc_opc_set_vsi_promiscuous_modes); 1719 1720 if (set) 1721 flags |= I40E_AQC_SET_VSI_PROMISC_UNICAST; 1722 1723 cmd->promiscuous_flags = CPU_TO_LE16(flags); 1724 1725 cmd->valid_flags = CPU_TO_LE16(I40E_AQC_SET_VSI_PROMISC_UNICAST); 1726 1727 cmd->seid = CPU_TO_LE16(seid); 1728 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details); 1729 1730 return status; 1731 } 1732 1733 /** 1734 * i40e_aq_set_vsi_multicast_promiscuous 1735 * @hw: pointer to the hw struct 1736 * @seid: vsi number 1737 * @set: set multicast promiscuous enable/disable 1738 * @cmd_details: pointer to command details structure or NULL 1739 **/ 1740 enum i40e_status_code i40e_aq_set_vsi_multicast_promiscuous(struct i40e_hw *hw, 1741 u16 seid, bool set, struct i40e_asq_cmd_details *cmd_details) 1742 { 1743 struct i40e_aq_desc desc; 1744 struct i40e_aqc_set_vsi_promiscuous_modes *cmd = 1745 (struct i40e_aqc_set_vsi_promiscuous_modes *)&desc.params.raw; 1746 enum i40e_status_code status; 1747 u16 flags = 0; 1748 1749 i40e_fill_default_direct_cmd_desc(&desc, 1750 i40e_aqc_opc_set_vsi_promiscuous_modes); 1751 1752 if (set) 1753 flags |= I40E_AQC_SET_VSI_PROMISC_MULTICAST; 1754 1755 cmd->promiscuous_flags = CPU_TO_LE16(flags); 1756 1757 cmd->valid_flags = CPU_TO_LE16(I40E_AQC_SET_VSI_PROMISC_MULTICAST); 1758 1759 cmd->seid = CPU_TO_LE16(seid); 1760 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details); 1761 1762 return status; 1763 } 1764 1765 /** 1766 * i40e_aq_set_vsi_broadcast 1767 * @hw: pointer to the hw struct 1768 * @seid: vsi number 1769 * @set_filter: TRUE to set filter, FALSE to clear filter 1770 * @cmd_details: pointer to command details structure or NULL 1771 * 1772 * Set or clear the broadcast promiscuous flag (filter) for a given VSI. 1773 **/ 1774 enum i40e_status_code i40e_aq_set_vsi_broadcast(struct i40e_hw *hw, 1775 u16 seid, bool set_filter, 1776 struct i40e_asq_cmd_details *cmd_details) 1777 { 1778 struct i40e_aq_desc desc; 1779 struct i40e_aqc_set_vsi_promiscuous_modes *cmd = 1780 (struct i40e_aqc_set_vsi_promiscuous_modes *)&desc.params.raw; 1781 enum i40e_status_code status; 1782 1783 i40e_fill_default_direct_cmd_desc(&desc, 1784 i40e_aqc_opc_set_vsi_promiscuous_modes); 1785 1786 if (set_filter) 1787 cmd->promiscuous_flags 1788 |= CPU_TO_LE16(I40E_AQC_SET_VSI_PROMISC_BROADCAST); 1789 else 1790 cmd->promiscuous_flags 1791 &= CPU_TO_LE16(~I40E_AQC_SET_VSI_PROMISC_BROADCAST); 1792 1793 cmd->valid_flags = CPU_TO_LE16(I40E_AQC_SET_VSI_PROMISC_BROADCAST); 1794 cmd->seid = CPU_TO_LE16(seid); 1795 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details); 1796 1797 return status; 1798 } 1799 1800 /** 1801 * i40e_get_vsi_params - get VSI configuration info 1802 * @hw: pointer to the hw struct 1803 * @vsi_ctx: pointer to a vsi context struct 1804 * @cmd_details: pointer to command details structure or NULL 1805 **/ 1806 enum i40e_status_code i40e_aq_get_vsi_params(struct i40e_hw *hw, 1807 struct i40e_vsi_context *vsi_ctx, 1808 struct i40e_asq_cmd_details *cmd_details) 1809 { 1810 struct i40e_aq_desc desc; 1811 struct i40e_aqc_add_get_update_vsi *cmd = 1812 (struct i40e_aqc_add_get_update_vsi *)&desc.params.raw; 1813 struct i40e_aqc_add_get_update_vsi_completion *resp = 1814 (struct i40e_aqc_add_get_update_vsi_completion *) 1815 &desc.params.raw; 1816 enum i40e_status_code status; 1817 1818 i40e_fill_default_direct_cmd_desc(&desc, 1819 i40e_aqc_opc_get_vsi_parameters); 1820 1821 cmd->uplink_seid = CPU_TO_LE16(vsi_ctx->seid); 1822 1823 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF); 1824 1825 status = i40e_asq_send_command(hw, &desc, &vsi_ctx->info, 1826 sizeof(vsi_ctx->info), NULL); 1827 1828 if (status != I40E_SUCCESS) 1829 goto aq_get_vsi_params_exit; 1830 1831 vsi_ctx->seid = LE16_TO_CPU(resp->seid); 1832 vsi_ctx->vsi_number = LE16_TO_CPU(resp->vsi_number); 1833 vsi_ctx->vsis_allocated = LE16_TO_CPU(resp->vsi_used); 1834 vsi_ctx->vsis_unallocated = LE16_TO_CPU(resp->vsi_free); 1835 1836 aq_get_vsi_params_exit: 1837 return status; 1838 } 1839 1840 /** 1841 * i40e_aq_update_vsi_params 1842 * @hw: pointer to the hw struct 1843 * @vsi_ctx: pointer to a vsi context struct 1844 * @cmd_details: pointer to command details structure or NULL 1845 * 1846 * Update a VSI context. 1847 **/ 1848 enum i40e_status_code i40e_aq_update_vsi_params(struct i40e_hw *hw, 1849 struct i40e_vsi_context *vsi_ctx, 1850 struct i40e_asq_cmd_details *cmd_details) 1851 { 1852 struct i40e_aq_desc desc; 1853 struct i40e_aqc_add_get_update_vsi *cmd = 1854 (struct i40e_aqc_add_get_update_vsi *)&desc.params.raw; 1855 enum i40e_status_code status; 1856 1857 i40e_fill_default_direct_cmd_desc(&desc, 1858 i40e_aqc_opc_update_vsi_parameters); 1859 cmd->uplink_seid = CPU_TO_LE16(vsi_ctx->seid); 1860 1861 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD)); 1862 1863 status = i40e_asq_send_command(hw, &desc, &vsi_ctx->info, 1864 sizeof(vsi_ctx->info), cmd_details); 1865 1866 return status; 1867 } 1868 1869 /** 1870 * i40e_aq_get_switch_config 1871 * @hw: pointer to the hardware structure 1872 * @buf: pointer to the result buffer 1873 * @buf_size: length of input buffer 1874 * @start_seid: seid to start for the report, 0 == beginning 1875 * @cmd_details: pointer to command details structure or NULL 1876 * 1877 * Fill the buf with switch configuration returned from AdminQ command 1878 **/ 1879 enum i40e_status_code i40e_aq_get_switch_config(struct i40e_hw *hw, 1880 struct i40e_aqc_get_switch_config_resp *buf, 1881 u16 buf_size, u16 *start_seid, 1882 struct i40e_asq_cmd_details *cmd_details) 1883 { 1884 struct i40e_aq_desc desc; 1885 struct i40e_aqc_switch_seid *scfg = 1886 (struct i40e_aqc_switch_seid *)&desc.params.raw; 1887 enum i40e_status_code status; 1888 1889 i40e_fill_default_direct_cmd_desc(&desc, 1890 i40e_aqc_opc_get_switch_config); 1891 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF); 1892 if (buf_size > I40E_AQ_LARGE_BUF) 1893 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB); 1894 scfg->seid = CPU_TO_LE16(*start_seid); 1895 1896 status = i40e_asq_send_command(hw, &desc, buf, buf_size, cmd_details); 1897 *start_seid = LE16_TO_CPU(scfg->seid); 1898 1899 return status; 1900 } 1901 1902 /** 1903 * i40e_aq_get_firmware_version 1904 * @hw: pointer to the hw struct 1905 * @fw_major_version: firmware major version 1906 * @fw_minor_version: firmware minor version 1907 * @api_major_version: major queue version 1908 * @api_minor_version: minor queue version 1909 * @cmd_details: pointer to command details structure or NULL 1910 * 1911 * Get the firmware version from the admin queue commands 1912 **/ 1913 enum i40e_status_code i40e_aq_get_firmware_version(struct i40e_hw *hw, 1914 u16 *fw_major_version, u16 *fw_minor_version, 1915 u16 *api_major_version, u16 *api_minor_version, 1916 struct i40e_asq_cmd_details *cmd_details) 1917 { 1918 struct i40e_aq_desc desc; 1919 struct i40e_aqc_get_version *resp = 1920 (struct i40e_aqc_get_version *)&desc.params.raw; 1921 enum i40e_status_code status; 1922 1923 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_get_version); 1924 1925 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details); 1926 1927 if (status == I40E_SUCCESS) { 1928 if (fw_major_version != NULL) 1929 *fw_major_version = LE16_TO_CPU(resp->fw_major); 1930 if (fw_minor_version != NULL) 1931 *fw_minor_version = LE16_TO_CPU(resp->fw_minor); 1932 if (api_major_version != NULL) 1933 *api_major_version = LE16_TO_CPU(resp->api_major); 1934 if (api_minor_version != NULL) 1935 *api_minor_version = LE16_TO_CPU(resp->api_minor); 1936 1937 /* A workaround to fix the API version in SW */ 1938 if (api_major_version && api_minor_version && 1939 fw_major_version && fw_minor_version && 1940 ((*api_major_version == 1) && (*api_minor_version == 1)) && 1941 (((*fw_major_version == 4) && (*fw_minor_version >= 2)) || 1942 (*fw_major_version > 4))) 1943 *api_minor_version = 2; 1944 } 1945 1946 return status; 1947 } 1948 1949 /** 1950 * i40e_aq_send_driver_version 1951 * @hw: pointer to the hw struct 1952 * @dv: driver's major, minor version 1953 * @cmd_details: pointer to command details structure or NULL 1954 * 1955 * Send the driver version to the firmware 1956 **/ 1957 enum i40e_status_code i40e_aq_send_driver_version(struct i40e_hw *hw, 1958 struct i40e_driver_version *dv, 1959 struct i40e_asq_cmd_details *cmd_details) 1960 { 1961 struct i40e_aq_desc desc; 1962 struct i40e_aqc_driver_version *cmd = 1963 (struct i40e_aqc_driver_version *)&desc.params.raw; 1964 enum i40e_status_code status; 1965 u16 len; 1966 1967 if (dv == NULL) 1968 return I40E_ERR_PARAM; 1969 1970 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_driver_version); 1971 1972 desc.flags |= CPU_TO_LE16(I40E_AQ_FLAG_SI); 1973 cmd->driver_major_ver = dv->major_version; 1974 cmd->driver_minor_ver = dv->minor_version; 1975 cmd->driver_build_ver = dv->build_version; 1976 cmd->driver_subbuild_ver = dv->subbuild_version; 1977 1978 len = 0; 1979 while (len < sizeof(dv->driver_string) && 1980 (dv->driver_string[len] < 0x80) && 1981 dv->driver_string[len]) 1982 len++; 1983 status = i40e_asq_send_command(hw, &desc, dv->driver_string, 1984 len, cmd_details); 1985 1986 return status; 1987 } 1988 1989 /** 1990 * i40e_get_link_status - get status of the HW network link 1991 * @hw: pointer to the hw struct 1992 * 1993 * Returns TRUE if link is up, FALSE if link is down. 1994 * 1995 * Side effect: LinkStatusEvent reporting becomes enabled 1996 **/ 1997 bool i40e_get_link_status(struct i40e_hw *hw) 1998 { 1999 enum i40e_status_code status = I40E_SUCCESS; 2000 bool link_status = FALSE; 2001 2002 if (hw->phy.get_link_info) { 2003 status = i40e_aq_get_link_info(hw, TRUE, NULL, NULL); 2004 2005 if (status != I40E_SUCCESS) 2006 goto i40e_get_link_status_exit; 2007 } 2008 2009 link_status = hw->phy.link_info.link_info & I40E_AQ_LINK_UP; 2010 2011 i40e_get_link_status_exit: 2012 return link_status; 2013 } 2014 2015 /** 2016 * i40e_get_link_speed 2017 * @hw: pointer to the hw struct 2018 * 2019 * Returns the link speed of the adapter. 2020 **/ 2021 enum i40e_aq_link_speed i40e_get_link_speed(struct i40e_hw *hw) 2022 { 2023 enum i40e_aq_link_speed speed = I40E_LINK_SPEED_UNKNOWN; 2024 enum i40e_status_code status = I40E_SUCCESS; 2025 2026 if (hw->phy.get_link_info) { 2027 status = i40e_aq_get_link_info(hw, TRUE, NULL, NULL); 2028 2029 if (status != I40E_SUCCESS) 2030 goto i40e_link_speed_exit; 2031 } 2032 2033 speed = hw->phy.link_info.link_speed; 2034 2035 i40e_link_speed_exit: 2036 return speed; 2037 } 2038 2039 /** 2040 * i40e_aq_add_veb - Insert a VEB between the VSI and the MAC 2041 * @hw: pointer to the hw struct 2042 * @uplink_seid: the MAC or other gizmo SEID 2043 * @downlink_seid: the VSI SEID 2044 * @enabled_tc: bitmap of TCs to be enabled 2045 * @default_port: TRUE for default port VSI, FALSE for control port 2046 * @enable_l2_filtering: TRUE to add L2 filter table rules to regular forwarding rules for cloud support 2047 * @veb_seid: pointer to where to put the resulting VEB SEID 2048 * @cmd_details: pointer to command details structure or NULL 2049 * 2050 * This asks the FW to add a VEB between the uplink and downlink 2051 * elements. If the uplink SEID is 0, this will be a floating VEB. 2052 **/ 2053 enum i40e_status_code i40e_aq_add_veb(struct i40e_hw *hw, u16 uplink_seid, 2054 u16 downlink_seid, u8 enabled_tc, 2055 bool default_port, bool enable_l2_filtering, 2056 u16 *veb_seid, 2057 struct i40e_asq_cmd_details *cmd_details) 2058 { 2059 struct i40e_aq_desc desc; 2060 struct i40e_aqc_add_veb *cmd = 2061 (struct i40e_aqc_add_veb *)&desc.params.raw; 2062 struct i40e_aqc_add_veb_completion *resp = 2063 (struct i40e_aqc_add_veb_completion *)&desc.params.raw; 2064 enum i40e_status_code status; 2065 u16 veb_flags = 0; 2066 2067 /* SEIDs need to either both be set or both be 0 for floating VEB */ 2068 if (!!uplink_seid != !!downlink_seid) 2069 return I40E_ERR_PARAM; 2070 2071 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_add_veb); 2072 2073 cmd->uplink_seid = CPU_TO_LE16(uplink_seid); 2074 cmd->downlink_seid = CPU_TO_LE16(downlink_seid); 2075 cmd->enable_tcs = enabled_tc; 2076 if (!uplink_seid) 2077 veb_flags |= I40E_AQC_ADD_VEB_FLOATING; 2078 if (default_port) 2079 veb_flags |= I40E_AQC_ADD_VEB_PORT_TYPE_DEFAULT; 2080 else 2081 veb_flags |= I40E_AQC_ADD_VEB_PORT_TYPE_DATA; 2082 2083 if (enable_l2_filtering) 2084 veb_flags |= I40E_AQC_ADD_VEB_ENABLE_L2_FILTER; 2085 2086 cmd->veb_flags = CPU_TO_LE16(veb_flags); 2087 2088 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details); 2089 2090 if (!status && veb_seid) 2091 *veb_seid = LE16_TO_CPU(resp->veb_seid); 2092 2093 return status; 2094 } 2095 2096 /** 2097 * i40e_aq_get_veb_parameters - Retrieve VEB parameters 2098 * @hw: pointer to the hw struct 2099 * @veb_seid: the SEID of the VEB to query 2100 * @switch_id: the uplink switch id 2101 * @floating: set to TRUE if the VEB is floating 2102 * @statistic_index: index of the stats counter block for this VEB 2103 * @vebs_used: number of VEB's used by function 2104 * @vebs_free: total VEB's not reserved by any function 2105 * @cmd_details: pointer to command details structure or NULL 2106 * 2107 * This retrieves the parameters for a particular VEB, specified by 2108 * uplink_seid, and returns them to the caller. 2109 **/ 2110 enum i40e_status_code i40e_aq_get_veb_parameters(struct i40e_hw *hw, 2111 u16 veb_seid, u16 *switch_id, 2112 bool *floating, u16 *statistic_index, 2113 u16 *vebs_used, u16 *vebs_free, 2114 struct i40e_asq_cmd_details *cmd_details) 2115 { 2116 struct i40e_aq_desc desc; 2117 struct i40e_aqc_get_veb_parameters_completion *cmd_resp = 2118 (struct i40e_aqc_get_veb_parameters_completion *) 2119 &desc.params.raw; 2120 enum i40e_status_code status; 2121 2122 if (veb_seid == 0) 2123 return I40E_ERR_PARAM; 2124 2125 i40e_fill_default_direct_cmd_desc(&desc, 2126 i40e_aqc_opc_get_veb_parameters); 2127 cmd_resp->seid = CPU_TO_LE16(veb_seid); 2128 2129 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details); 2130 if (status) 2131 goto get_veb_exit; 2132 2133 if (switch_id) 2134 *switch_id = LE16_TO_CPU(cmd_resp->switch_id); 2135 if (statistic_index) 2136 *statistic_index = LE16_TO_CPU(cmd_resp->statistic_index); 2137 if (vebs_used) 2138 *vebs_used = LE16_TO_CPU(cmd_resp->vebs_used); 2139 if (vebs_free) 2140 *vebs_free = LE16_TO_CPU(cmd_resp->vebs_free); 2141 if (floating) { 2142 u16 flags = LE16_TO_CPU(cmd_resp->veb_flags); 2143 if (flags & I40E_AQC_ADD_VEB_FLOATING) 2144 *floating = TRUE; 2145 else 2146 *floating = FALSE; 2147 } 2148 2149 get_veb_exit: 2150 return status; 2151 } 2152 2153 /** 2154 * i40e_aq_add_macvlan 2155 * @hw: pointer to the hw struct 2156 * @seid: VSI for the mac address 2157 * @mv_list: list of macvlans to be added 2158 * @count: length of the list 2159 * @cmd_details: pointer to command details structure or NULL 2160 * 2161 * Add MAC/VLAN addresses to the HW filtering 2162 **/ 2163 enum i40e_status_code i40e_aq_add_macvlan(struct i40e_hw *hw, u16 seid, 2164 struct i40e_aqc_add_macvlan_element_data *mv_list, 2165 u16 count, struct i40e_asq_cmd_details *cmd_details) 2166 { 2167 struct i40e_aq_desc desc; 2168 struct i40e_aqc_macvlan *cmd = 2169 (struct i40e_aqc_macvlan *)&desc.params.raw; 2170 enum i40e_status_code status; 2171 u16 buf_size; 2172 2173 if (count == 0 || !mv_list || !hw) 2174 return I40E_ERR_PARAM; 2175 2176 buf_size = count * sizeof(struct i40e_aqc_add_macvlan_element_data); 2177 2178 /* prep the rest of the request */ 2179 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_add_macvlan); 2180 cmd->num_addresses = CPU_TO_LE16(count); 2181 cmd->seid[0] = CPU_TO_LE16(I40E_AQC_MACVLAN_CMD_SEID_VALID | seid); 2182 cmd->seid[1] = 0; 2183 cmd->seid[2] = 0; 2184 2185 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD)); 2186 if (buf_size > I40E_AQ_LARGE_BUF) 2187 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB); 2188 2189 status = i40e_asq_send_command(hw, &desc, mv_list, buf_size, 2190 cmd_details); 2191 2192 return status; 2193 } 2194 2195 /** 2196 * i40e_aq_remove_macvlan 2197 * @hw: pointer to the hw struct 2198 * @seid: VSI for the mac address 2199 * @mv_list: list of macvlans to be removed 2200 * @count: length of the list 2201 * @cmd_details: pointer to command details structure or NULL 2202 * 2203 * Remove MAC/VLAN addresses from the HW filtering 2204 **/ 2205 enum i40e_status_code i40e_aq_remove_macvlan(struct i40e_hw *hw, u16 seid, 2206 struct i40e_aqc_remove_macvlan_element_data *mv_list, 2207 u16 count, struct i40e_asq_cmd_details *cmd_details) 2208 { 2209 struct i40e_aq_desc desc; 2210 struct i40e_aqc_macvlan *cmd = 2211 (struct i40e_aqc_macvlan *)&desc.params.raw; 2212 enum i40e_status_code status; 2213 u16 buf_size; 2214 2215 if (count == 0 || !mv_list || !hw) 2216 return I40E_ERR_PARAM; 2217 2218 buf_size = count * sizeof(struct i40e_aqc_remove_macvlan_element_data); 2219 2220 /* prep the rest of the request */ 2221 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_remove_macvlan); 2222 cmd->num_addresses = CPU_TO_LE16(count); 2223 cmd->seid[0] = CPU_TO_LE16(I40E_AQC_MACVLAN_CMD_SEID_VALID | seid); 2224 cmd->seid[1] = 0; 2225 cmd->seid[2] = 0; 2226 2227 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD)); 2228 if (buf_size > I40E_AQ_LARGE_BUF) 2229 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB); 2230 2231 status = i40e_asq_send_command(hw, &desc, mv_list, buf_size, 2232 cmd_details); 2233 2234 return status; 2235 } 2236 2237 /** 2238 * i40e_aq_add_vlan - Add VLAN ids to the HW filtering 2239 * @hw: pointer to the hw struct 2240 * @seid: VSI for the vlan filters 2241 * @v_list: list of vlan filters to be added 2242 * @count: length of the list 2243 * @cmd_details: pointer to command details structure or NULL 2244 **/ 2245 enum i40e_status_code i40e_aq_add_vlan(struct i40e_hw *hw, u16 seid, 2246 struct i40e_aqc_add_remove_vlan_element_data *v_list, 2247 u8 count, struct i40e_asq_cmd_details *cmd_details) 2248 { 2249 struct i40e_aq_desc desc; 2250 struct i40e_aqc_macvlan *cmd = 2251 (struct i40e_aqc_macvlan *)&desc.params.raw; 2252 enum i40e_status_code status; 2253 u16 buf_size; 2254 2255 if (count == 0 || !v_list || !hw) 2256 return I40E_ERR_PARAM; 2257 2258 buf_size = count * sizeof(struct i40e_aqc_add_remove_vlan_element_data); 2259 2260 /* prep the rest of the request */ 2261 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_add_vlan); 2262 cmd->num_addresses = CPU_TO_LE16(count); 2263 cmd->seid[0] = CPU_TO_LE16(seid | I40E_AQC_MACVLAN_CMD_SEID_VALID); 2264 cmd->seid[1] = 0; 2265 cmd->seid[2] = 0; 2266 2267 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD)); 2268 if (buf_size > I40E_AQ_LARGE_BUF) 2269 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB); 2270 2271 status = i40e_asq_send_command(hw, &desc, v_list, buf_size, 2272 cmd_details); 2273 2274 return status; 2275 } 2276 2277 /** 2278 * i40e_aq_remove_vlan - Remove VLANs from the HW filtering 2279 * @hw: pointer to the hw struct 2280 * @seid: VSI for the vlan filters 2281 * @v_list: list of macvlans to be removed 2282 * @count: length of the list 2283 * @cmd_details: pointer to command details structure or NULL 2284 **/ 2285 enum i40e_status_code i40e_aq_remove_vlan(struct i40e_hw *hw, u16 seid, 2286 struct i40e_aqc_add_remove_vlan_element_data *v_list, 2287 u8 count, struct i40e_asq_cmd_details *cmd_details) 2288 { 2289 struct i40e_aq_desc desc; 2290 struct i40e_aqc_macvlan *cmd = 2291 (struct i40e_aqc_macvlan *)&desc.params.raw; 2292 enum i40e_status_code status; 2293 u16 buf_size; 2294 2295 if (count == 0 || !v_list || !hw) 2296 return I40E_ERR_PARAM; 2297 2298 buf_size = count * sizeof(struct i40e_aqc_add_remove_vlan_element_data); 2299 2300 /* prep the rest of the request */ 2301 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_remove_vlan); 2302 cmd->num_addresses = CPU_TO_LE16(count); 2303 cmd->seid[0] = CPU_TO_LE16(seid | I40E_AQC_MACVLAN_CMD_SEID_VALID); 2304 cmd->seid[1] = 0; 2305 cmd->seid[2] = 0; 2306 2307 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD)); 2308 if (buf_size > I40E_AQ_LARGE_BUF) 2309 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB); 2310 2311 status = i40e_asq_send_command(hw, &desc, v_list, buf_size, 2312 cmd_details); 2313 2314 return status; 2315 } 2316 2317 /** 2318 * i40e_aq_send_msg_to_vf 2319 * @hw: pointer to the hardware structure 2320 * @vfid: vf id to send msg 2321 * @v_opcode: opcodes for VF-PF communication 2322 * @v_retval: return error code 2323 * @msg: pointer to the msg buffer 2324 * @msglen: msg length 2325 * @cmd_details: pointer to command details 2326 * 2327 * send msg to vf 2328 **/ 2329 enum i40e_status_code i40e_aq_send_msg_to_vf(struct i40e_hw *hw, u16 vfid, 2330 u32 v_opcode, u32 v_retval, u8 *msg, u16 msglen, 2331 struct i40e_asq_cmd_details *cmd_details) 2332 { 2333 struct i40e_aq_desc desc; 2334 struct i40e_aqc_pf_vf_message *cmd = 2335 (struct i40e_aqc_pf_vf_message *)&desc.params.raw; 2336 enum i40e_status_code status; 2337 2338 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_send_msg_to_vf); 2339 cmd->id = CPU_TO_LE32(vfid); 2340 desc.cookie_high = CPU_TO_LE32(v_opcode); 2341 desc.cookie_low = CPU_TO_LE32(v_retval); 2342 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_SI); 2343 if (msglen) { 2344 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | 2345 I40E_AQ_FLAG_RD)); 2346 if (msglen > I40E_AQ_LARGE_BUF) 2347 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB); 2348 desc.datalen = CPU_TO_LE16(msglen); 2349 } 2350 status = i40e_asq_send_command(hw, &desc, msg, msglen, cmd_details); 2351 2352 return status; 2353 } 2354 2355 /** 2356 * i40e_aq_debug_write_register 2357 * @hw: pointer to the hw struct 2358 * @reg_addr: register address 2359 * @reg_val: register value 2360 * @cmd_details: pointer to command details structure or NULL 2361 * 2362 * Write to a register using the admin queue commands 2363 **/ 2364 enum i40e_status_code i40e_aq_debug_write_register(struct i40e_hw *hw, 2365 u32 reg_addr, u64 reg_val, 2366 struct i40e_asq_cmd_details *cmd_details) 2367 { 2368 struct i40e_aq_desc desc; 2369 struct i40e_aqc_debug_reg_read_write *cmd = 2370 (struct i40e_aqc_debug_reg_read_write *)&desc.params.raw; 2371 enum i40e_status_code status; 2372 2373 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_debug_write_reg); 2374 2375 cmd->address = CPU_TO_LE32(reg_addr); 2376 cmd->value_high = CPU_TO_LE32((u32)(reg_val >> 32)); 2377 cmd->value_low = CPU_TO_LE32((u32)(reg_val & 0xFFFFFFFF)); 2378 2379 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details); 2380 2381 return status; 2382 } 2383 2384 /** 2385 * i40e_aq_get_hmc_resource_profile 2386 * @hw: pointer to the hw struct 2387 * @profile: type of profile the HMC is to be set as 2388 * @pe_vf_enabled_count: the number of PE enabled VFs the system has 2389 * @cmd_details: pointer to command details structure or NULL 2390 * 2391 * query the HMC profile of the device. 2392 **/ 2393 enum i40e_status_code i40e_aq_get_hmc_resource_profile(struct i40e_hw *hw, 2394 enum i40e_aq_hmc_profile *profile, 2395 u8 *pe_vf_enabled_count, 2396 struct i40e_asq_cmd_details *cmd_details) 2397 { 2398 struct i40e_aq_desc desc; 2399 struct i40e_aq_get_set_hmc_resource_profile *resp = 2400 (struct i40e_aq_get_set_hmc_resource_profile *)&desc.params.raw; 2401 enum i40e_status_code status; 2402 2403 i40e_fill_default_direct_cmd_desc(&desc, 2404 i40e_aqc_opc_query_hmc_resource_profile); 2405 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details); 2406 2407 *profile = (enum i40e_aq_hmc_profile)(resp->pm_profile & 2408 I40E_AQ_GET_HMC_RESOURCE_PROFILE_PM_MASK); 2409 *pe_vf_enabled_count = resp->pe_vf_enabled & 2410 I40E_AQ_GET_HMC_RESOURCE_PROFILE_COUNT_MASK; 2411 2412 return status; 2413 } 2414 2415 /** 2416 * i40e_aq_set_hmc_resource_profile 2417 * @hw: pointer to the hw struct 2418 * @profile: type of profile the HMC is to be set as 2419 * @pe_vf_enabled_count: the number of PE enabled VFs the system has 2420 * @cmd_details: pointer to command details structure or NULL 2421 * 2422 * set the HMC profile of the device. 2423 **/ 2424 enum i40e_status_code i40e_aq_set_hmc_resource_profile(struct i40e_hw *hw, 2425 enum i40e_aq_hmc_profile profile, 2426 u8 pe_vf_enabled_count, 2427 struct i40e_asq_cmd_details *cmd_details) 2428 { 2429 struct i40e_aq_desc desc; 2430 struct i40e_aq_get_set_hmc_resource_profile *cmd = 2431 (struct i40e_aq_get_set_hmc_resource_profile *)&desc.params.raw; 2432 enum i40e_status_code status; 2433 2434 i40e_fill_default_direct_cmd_desc(&desc, 2435 i40e_aqc_opc_set_hmc_resource_profile); 2436 2437 cmd->pm_profile = (u8)profile; 2438 cmd->pe_vf_enabled = pe_vf_enabled_count; 2439 2440 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details); 2441 2442 return status; 2443 } 2444 2445 /** 2446 * i40e_aq_request_resource 2447 * @hw: pointer to the hw struct 2448 * @resource: resource id 2449 * @access: access type 2450 * @sdp_number: resource number 2451 * @timeout: the maximum time in ms that the driver may hold the resource 2452 * @cmd_details: pointer to command details structure or NULL 2453 * 2454 * requests common resource using the admin queue commands 2455 **/ 2456 enum i40e_status_code i40e_aq_request_resource(struct i40e_hw *hw, 2457 enum i40e_aq_resources_ids resource, 2458 enum i40e_aq_resource_access_type access, 2459 u8 sdp_number, u64 *timeout, 2460 struct i40e_asq_cmd_details *cmd_details) 2461 { 2462 struct i40e_aq_desc desc; 2463 struct i40e_aqc_request_resource *cmd_resp = 2464 (struct i40e_aqc_request_resource *)&desc.params.raw; 2465 enum i40e_status_code status; 2466 2467 DEBUGFUNC("i40e_aq_request_resource"); 2468 2469 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_request_resource); 2470 2471 cmd_resp->resource_id = CPU_TO_LE16(resource); 2472 cmd_resp->access_type = CPU_TO_LE16(access); 2473 cmd_resp->resource_number = CPU_TO_LE32(sdp_number); 2474 2475 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details); 2476 /* The completion specifies the maximum time in ms that the driver 2477 * may hold the resource in the Timeout field. 2478 * If the resource is held by someone else, the command completes with 2479 * busy return value and the timeout field indicates the maximum time 2480 * the current owner of the resource has to free it. 2481 */ 2482 if (status == I40E_SUCCESS || hw->aq.asq_last_status == I40E_AQ_RC_EBUSY) 2483 *timeout = LE32_TO_CPU(cmd_resp->timeout); 2484 2485 return status; 2486 } 2487 2488 /** 2489 * i40e_aq_release_resource 2490 * @hw: pointer to the hw struct 2491 * @resource: resource id 2492 * @sdp_number: resource number 2493 * @cmd_details: pointer to command details structure or NULL 2494 * 2495 * release common resource using the admin queue commands 2496 **/ 2497 enum i40e_status_code i40e_aq_release_resource(struct i40e_hw *hw, 2498 enum i40e_aq_resources_ids resource, 2499 u8 sdp_number, 2500 struct i40e_asq_cmd_details *cmd_details) 2501 { 2502 struct i40e_aq_desc desc; 2503 struct i40e_aqc_request_resource *cmd = 2504 (struct i40e_aqc_request_resource *)&desc.params.raw; 2505 enum i40e_status_code status; 2506 2507 DEBUGFUNC("i40e_aq_release_resource"); 2508 2509 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_release_resource); 2510 2511 cmd->resource_id = CPU_TO_LE16(resource); 2512 cmd->resource_number = CPU_TO_LE32(sdp_number); 2513 2514 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details); 2515 2516 return status; 2517 } 2518 2519 /** 2520 * i40e_aq_read_nvm 2521 * @hw: pointer to the hw struct 2522 * @module_pointer: module pointer location in words from the NVM beginning 2523 * @offset: byte offset from the module beginning 2524 * @length: length of the section to be read (in bytes from the offset) 2525 * @data: command buffer (size [bytes] = length) 2526 * @last_command: tells if this is the last command in a series 2527 * @cmd_details: pointer to command details structure or NULL 2528 * 2529 * Read the NVM using the admin queue commands 2530 **/ 2531 enum i40e_status_code i40e_aq_read_nvm(struct i40e_hw *hw, u8 module_pointer, 2532 u32 offset, u16 length, void *data, 2533 bool last_command, 2534 struct i40e_asq_cmd_details *cmd_details) 2535 { 2536 struct i40e_aq_desc desc; 2537 struct i40e_aqc_nvm_update *cmd = 2538 (struct i40e_aqc_nvm_update *)&desc.params.raw; 2539 enum i40e_status_code status; 2540 2541 DEBUGFUNC("i40e_aq_read_nvm"); 2542 2543 /* In offset the highest byte must be zeroed. */ 2544 if (offset & 0xFF000000) { 2545 status = I40E_ERR_PARAM; 2546 goto i40e_aq_read_nvm_exit; 2547 } 2548 2549 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_nvm_read); 2550 2551 /* If this is the last command in a series, set the proper flag. */ 2552 if (last_command) 2553 cmd->command_flags |= I40E_AQ_NVM_LAST_CMD; 2554 cmd->module_pointer = module_pointer; 2555 cmd->offset = CPU_TO_LE32(offset); 2556 cmd->length = CPU_TO_LE16(length); 2557 2558 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF); 2559 if (length > I40E_AQ_LARGE_BUF) 2560 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB); 2561 2562 status = i40e_asq_send_command(hw, &desc, data, length, cmd_details); 2563 2564 i40e_aq_read_nvm_exit: 2565 return status; 2566 } 2567 2568 /** 2569 * i40e_aq_erase_nvm 2570 * @hw: pointer to the hw struct 2571 * @module_pointer: module pointer location in words from the NVM beginning 2572 * @offset: offset in the module (expressed in 4 KB from module's beginning) 2573 * @length: length of the section to be erased (expressed in 4 KB) 2574 * @last_command: tells if this is the last command in a series 2575 * @cmd_details: pointer to command details structure or NULL 2576 * 2577 * Erase the NVM sector using the admin queue commands 2578 **/ 2579 enum i40e_status_code i40e_aq_erase_nvm(struct i40e_hw *hw, u8 module_pointer, 2580 u32 offset, u16 length, bool last_command, 2581 struct i40e_asq_cmd_details *cmd_details) 2582 { 2583 struct i40e_aq_desc desc; 2584 struct i40e_aqc_nvm_update *cmd = 2585 (struct i40e_aqc_nvm_update *)&desc.params.raw; 2586 enum i40e_status_code status; 2587 2588 DEBUGFUNC("i40e_aq_erase_nvm"); 2589 2590 /* In offset the highest byte must be zeroed. */ 2591 if (offset & 0xFF000000) { 2592 status = I40E_ERR_PARAM; 2593 goto i40e_aq_erase_nvm_exit; 2594 } 2595 2596 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_nvm_erase); 2597 2598 /* If this is the last command in a series, set the proper flag. */ 2599 if (last_command) 2600 cmd->command_flags |= I40E_AQ_NVM_LAST_CMD; 2601 cmd->module_pointer = module_pointer; 2602 cmd->offset = CPU_TO_LE32(offset); 2603 cmd->length = CPU_TO_LE16(length); 2604 2605 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details); 2606 2607 i40e_aq_erase_nvm_exit: 2608 return status; 2609 } 2610 2611 #define I40E_DEV_FUNC_CAP_SWITCH_MODE 0x01 2612 #define I40E_DEV_FUNC_CAP_MGMT_MODE 0x02 2613 #define I40E_DEV_FUNC_CAP_NPAR 0x03 2614 #define I40E_DEV_FUNC_CAP_OS2BMC 0x04 2615 #define I40E_DEV_FUNC_CAP_VALID_FUNC 0x05 2616 #define I40E_DEV_FUNC_CAP_SRIOV_1_1 0x12 2617 #define I40E_DEV_FUNC_CAP_VF 0x13 2618 #define I40E_DEV_FUNC_CAP_VMDQ 0x14 2619 #define I40E_DEV_FUNC_CAP_802_1_QBG 0x15 2620 #define I40E_DEV_FUNC_CAP_802_1_QBH 0x16 2621 #define I40E_DEV_FUNC_CAP_VSI 0x17 2622 #define I40E_DEV_FUNC_CAP_DCB 0x18 2623 #define I40E_DEV_FUNC_CAP_FCOE 0x21 2624 #define I40E_DEV_FUNC_CAP_RSS 0x40 2625 #define I40E_DEV_FUNC_CAP_RX_QUEUES 0x41 2626 #define I40E_DEV_FUNC_CAP_TX_QUEUES 0x42 2627 #define I40E_DEV_FUNC_CAP_MSIX 0x43 2628 #define I40E_DEV_FUNC_CAP_MSIX_VF 0x44 2629 #define I40E_DEV_FUNC_CAP_FLOW_DIRECTOR 0x45 2630 #define I40E_DEV_FUNC_CAP_IEEE_1588 0x46 2631 #define I40E_DEV_FUNC_CAP_MFP_MODE_1 0xF1 2632 #define I40E_DEV_FUNC_CAP_CEM 0xF2 2633 #define I40E_DEV_FUNC_CAP_IWARP 0x51 2634 #define I40E_DEV_FUNC_CAP_LED 0x61 2635 #define I40E_DEV_FUNC_CAP_SDP 0x62 2636 #define I40E_DEV_FUNC_CAP_MDIO 0x63 2637 2638 /** 2639 * i40e_parse_discover_capabilities 2640 * @hw: pointer to the hw struct 2641 * @buff: pointer to a buffer containing device/function capability records 2642 * @cap_count: number of capability records in the list 2643 * @list_type_opc: type of capabilities list to parse 2644 * 2645 * Parse the device/function capabilities list. 2646 **/ 2647 static void i40e_parse_discover_capabilities(struct i40e_hw *hw, void *buff, 2648 u32 cap_count, 2649 enum i40e_admin_queue_opc list_type_opc) 2650 { 2651 struct i40e_aqc_list_capabilities_element_resp *cap; 2652 u32 number, logical_id, phys_id; 2653 struct i40e_hw_capabilities *p; 2654 u32 i = 0; 2655 u16 id; 2656 2657 cap = (struct i40e_aqc_list_capabilities_element_resp *) buff; 2658 2659 if (list_type_opc == i40e_aqc_opc_list_dev_capabilities) 2660 p = (struct i40e_hw_capabilities *)&hw->dev_caps; 2661 else if (list_type_opc == i40e_aqc_opc_list_func_capabilities) 2662 p = (struct i40e_hw_capabilities *)&hw->func_caps; 2663 else 2664 return; 2665 2666 for (i = 0; i < cap_count; i++, cap++) { 2667 id = LE16_TO_CPU(cap->id); 2668 number = LE32_TO_CPU(cap->number); 2669 logical_id = LE32_TO_CPU(cap->logical_id); 2670 phys_id = LE32_TO_CPU(cap->phys_id); 2671 2672 switch (id) { 2673 case I40E_DEV_FUNC_CAP_SWITCH_MODE: 2674 p->switch_mode = number; 2675 break; 2676 case I40E_DEV_FUNC_CAP_MGMT_MODE: 2677 p->management_mode = number; 2678 break; 2679 case I40E_DEV_FUNC_CAP_NPAR: 2680 p->npar_enable = number; 2681 break; 2682 case I40E_DEV_FUNC_CAP_OS2BMC: 2683 p->os2bmc = number; 2684 break; 2685 case I40E_DEV_FUNC_CAP_VALID_FUNC: 2686 p->valid_functions = number; 2687 break; 2688 case I40E_DEV_FUNC_CAP_SRIOV_1_1: 2689 if (number == 1) 2690 p->sr_iov_1_1 = TRUE; 2691 break; 2692 case I40E_DEV_FUNC_CAP_VF: 2693 p->num_vfs = number; 2694 p->vf_base_id = logical_id; 2695 break; 2696 case I40E_DEV_FUNC_CAP_VMDQ: 2697 if (number == 1) 2698 p->vmdq = TRUE; 2699 break; 2700 case I40E_DEV_FUNC_CAP_802_1_QBG: 2701 if (number == 1) 2702 p->evb_802_1_qbg = TRUE; 2703 break; 2704 case I40E_DEV_FUNC_CAP_802_1_QBH: 2705 if (number == 1) 2706 p->evb_802_1_qbh = TRUE; 2707 break; 2708 case I40E_DEV_FUNC_CAP_VSI: 2709 p->num_vsis = number; 2710 break; 2711 case I40E_DEV_FUNC_CAP_DCB: 2712 if (number == 1) { 2713 p->dcb = TRUE; 2714 p->enabled_tcmap = logical_id; 2715 p->maxtc = phys_id; 2716 } 2717 break; 2718 case I40E_DEV_FUNC_CAP_FCOE: 2719 if (number == 1) 2720 p->fcoe = TRUE; 2721 break; 2722 case I40E_DEV_FUNC_CAP_RSS: 2723 p->rss = TRUE; 2724 p->rss_table_size = number; 2725 p->rss_table_entry_width = logical_id; 2726 break; 2727 case I40E_DEV_FUNC_CAP_RX_QUEUES: 2728 p->num_rx_qp = number; 2729 p->base_queue = phys_id; 2730 break; 2731 case I40E_DEV_FUNC_CAP_TX_QUEUES: 2732 p->num_tx_qp = number; 2733 p->base_queue = phys_id; 2734 break; 2735 case I40E_DEV_FUNC_CAP_MSIX: 2736 p->num_msix_vectors = number; 2737 break; 2738 case I40E_DEV_FUNC_CAP_MSIX_VF: 2739 p->num_msix_vectors_vf = number; 2740 break; 2741 case I40E_DEV_FUNC_CAP_MFP_MODE_1: 2742 if (number == 1) 2743 p->mfp_mode_1 = TRUE; 2744 break; 2745 case I40E_DEV_FUNC_CAP_CEM: 2746 if (number == 1) 2747 p->mgmt_cem = TRUE; 2748 break; 2749 case I40E_DEV_FUNC_CAP_IWARP: 2750 if (number == 1) 2751 p->iwarp = TRUE; 2752 break; 2753 case I40E_DEV_FUNC_CAP_LED: 2754 if (phys_id < I40E_HW_CAP_MAX_GPIO) 2755 p->led[phys_id] = TRUE; 2756 break; 2757 case I40E_DEV_FUNC_CAP_SDP: 2758 if (phys_id < I40E_HW_CAP_MAX_GPIO) 2759 p->sdp[phys_id] = TRUE; 2760 break; 2761 case I40E_DEV_FUNC_CAP_MDIO: 2762 if (number == 1) { 2763 p->mdio_port_num = phys_id; 2764 p->mdio_port_mode = logical_id; 2765 } 2766 break; 2767 case I40E_DEV_FUNC_CAP_IEEE_1588: 2768 if (number == 1) 2769 p->ieee_1588 = TRUE; 2770 break; 2771 case I40E_DEV_FUNC_CAP_FLOW_DIRECTOR: 2772 p->fd = TRUE; 2773 p->fd_filters_guaranteed = number; 2774 p->fd_filters_best_effort = logical_id; 2775 break; 2776 default: 2777 break; 2778 } 2779 } 2780 2781 /* Software override ensuring FCoE is disabled if npar or mfp 2782 * mode because it is not supported in these modes. 2783 */ 2784 if (p->npar_enable || p->mfp_mode_1) 2785 p->fcoe = FALSE; 2786 2787 /* additional HW specific goodies that might 2788 * someday be HW version specific 2789 */ 2790 p->rx_buf_chain_len = I40E_MAX_CHAINED_RX_BUFFERS; 2791 } 2792 2793 /** 2794 * i40e_aq_discover_capabilities 2795 * @hw: pointer to the hw struct 2796 * @buff: a virtual buffer to hold the capabilities 2797 * @buff_size: Size of the virtual buffer 2798 * @data_size: Size of the returned data, or buff size needed if AQ err==ENOMEM 2799 * @list_type_opc: capabilities type to discover - pass in the command opcode 2800 * @cmd_details: pointer to command details structure or NULL 2801 * 2802 * Get the device capabilities descriptions from the firmware 2803 **/ 2804 enum i40e_status_code i40e_aq_discover_capabilities(struct i40e_hw *hw, 2805 void *buff, u16 buff_size, u16 *data_size, 2806 enum i40e_admin_queue_opc list_type_opc, 2807 struct i40e_asq_cmd_details *cmd_details) 2808 { 2809 struct i40e_aqc_list_capabilites *cmd; 2810 struct i40e_aq_desc desc; 2811 enum i40e_status_code status = I40E_SUCCESS; 2812 2813 cmd = (struct i40e_aqc_list_capabilites *)&desc.params.raw; 2814 2815 if (list_type_opc != i40e_aqc_opc_list_func_capabilities && 2816 list_type_opc != i40e_aqc_opc_list_dev_capabilities) { 2817 status = I40E_ERR_PARAM; 2818 goto exit; 2819 } 2820 2821 i40e_fill_default_direct_cmd_desc(&desc, list_type_opc); 2822 2823 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF); 2824 if (buff_size > I40E_AQ_LARGE_BUF) 2825 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB); 2826 2827 status = i40e_asq_send_command(hw, &desc, buff, buff_size, cmd_details); 2828 *data_size = LE16_TO_CPU(desc.datalen); 2829 2830 if (status) 2831 goto exit; 2832 2833 i40e_parse_discover_capabilities(hw, buff, LE32_TO_CPU(cmd->count), 2834 list_type_opc); 2835 2836 exit: 2837 return status; 2838 } 2839 2840 /** 2841 * i40e_aq_update_nvm 2842 * @hw: pointer to the hw struct 2843 * @module_pointer: module pointer location in words from the NVM beginning 2844 * @offset: byte offset from the module beginning 2845 * @length: length of the section to be written (in bytes from the offset) 2846 * @data: command buffer (size [bytes] = length) 2847 * @last_command: tells if this is the last command in a series 2848 * @cmd_details: pointer to command details structure or NULL 2849 * 2850 * Update the NVM using the admin queue commands 2851 **/ 2852 enum i40e_status_code i40e_aq_update_nvm(struct i40e_hw *hw, u8 module_pointer, 2853 u32 offset, u16 length, void *data, 2854 bool last_command, 2855 struct i40e_asq_cmd_details *cmd_details) 2856 { 2857 struct i40e_aq_desc desc; 2858 struct i40e_aqc_nvm_update *cmd = 2859 (struct i40e_aqc_nvm_update *)&desc.params.raw; 2860 enum i40e_status_code status; 2861 2862 DEBUGFUNC("i40e_aq_update_nvm"); 2863 2864 /* In offset the highest byte must be zeroed. */ 2865 if (offset & 0xFF000000) { 2866 status = I40E_ERR_PARAM; 2867 goto i40e_aq_update_nvm_exit; 2868 } 2869 2870 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_nvm_update); 2871 2872 /* If this is the last command in a series, set the proper flag. */ 2873 if (last_command) 2874 cmd->command_flags |= I40E_AQ_NVM_LAST_CMD; 2875 cmd->module_pointer = module_pointer; 2876 cmd->offset = CPU_TO_LE32(offset); 2877 cmd->length = CPU_TO_LE16(length); 2878 2879 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD)); 2880 if (length > I40E_AQ_LARGE_BUF) 2881 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB); 2882 2883 status = i40e_asq_send_command(hw, &desc, data, length, cmd_details); 2884 2885 i40e_aq_update_nvm_exit: 2886 return status; 2887 } 2888 2889 /** 2890 * i40e_aq_get_lldp_mib 2891 * @hw: pointer to the hw struct 2892 * @bridge_type: type of bridge requested 2893 * @mib_type: Local, Remote or both Local and Remote MIBs 2894 * @buff: pointer to a user supplied buffer to store the MIB block 2895 * @buff_size: size of the buffer (in bytes) 2896 * @local_len : length of the returned Local LLDP MIB 2897 * @remote_len: length of the returned Remote LLDP MIB 2898 * @cmd_details: pointer to command details structure or NULL 2899 * 2900 * Requests the complete LLDP MIB (entire packet). 2901 **/ 2902 enum i40e_status_code i40e_aq_get_lldp_mib(struct i40e_hw *hw, u8 bridge_type, 2903 u8 mib_type, void *buff, u16 buff_size, 2904 u16 *local_len, u16 *remote_len, 2905 struct i40e_asq_cmd_details *cmd_details) 2906 { 2907 struct i40e_aq_desc desc; 2908 struct i40e_aqc_lldp_get_mib *cmd = 2909 (struct i40e_aqc_lldp_get_mib *)&desc.params.raw; 2910 struct i40e_aqc_lldp_get_mib *resp = 2911 (struct i40e_aqc_lldp_get_mib *)&desc.params.raw; 2912 enum i40e_status_code status; 2913 2914 if (buff_size == 0 || !buff) 2915 return I40E_ERR_PARAM; 2916 2917 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_lldp_get_mib); 2918 /* Indirect Command */ 2919 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF); 2920 2921 cmd->type = mib_type & I40E_AQ_LLDP_MIB_TYPE_MASK; 2922 cmd->type |= ((bridge_type << I40E_AQ_LLDP_BRIDGE_TYPE_SHIFT) & 2923 I40E_AQ_LLDP_BRIDGE_TYPE_MASK); 2924 2925 desc.datalen = CPU_TO_LE16(buff_size); 2926 2927 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF); 2928 if (buff_size > I40E_AQ_LARGE_BUF) 2929 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB); 2930 2931 status = i40e_asq_send_command(hw, &desc, buff, buff_size, cmd_details); 2932 if (!status) { 2933 if (local_len != NULL) 2934 *local_len = LE16_TO_CPU(resp->local_len); 2935 if (remote_len != NULL) 2936 *remote_len = LE16_TO_CPU(resp->remote_len); 2937 } 2938 2939 return status; 2940 } 2941 2942 /** 2943 * i40e_aq_cfg_lldp_mib_change_event 2944 * @hw: pointer to the hw struct 2945 * @enable_update: Enable or Disable event posting 2946 * @cmd_details: pointer to command details structure or NULL 2947 * 2948 * Enable or Disable posting of an event on ARQ when LLDP MIB 2949 * associated with the interface changes 2950 **/ 2951 enum i40e_status_code i40e_aq_cfg_lldp_mib_change_event(struct i40e_hw *hw, 2952 bool enable_update, 2953 struct i40e_asq_cmd_details *cmd_details) 2954 { 2955 struct i40e_aq_desc desc; 2956 struct i40e_aqc_lldp_update_mib *cmd = 2957 (struct i40e_aqc_lldp_update_mib *)&desc.params.raw; 2958 enum i40e_status_code status; 2959 2960 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_lldp_update_mib); 2961 2962 if (!enable_update) 2963 cmd->command |= I40E_AQ_LLDP_MIB_UPDATE_DISABLE; 2964 2965 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details); 2966 2967 return status; 2968 } 2969 2970 /** 2971 * i40e_aq_add_lldp_tlv 2972 * @hw: pointer to the hw struct 2973 * @bridge_type: type of bridge 2974 * @buff: buffer with TLV to add 2975 * @buff_size: length of the buffer 2976 * @tlv_len: length of the TLV to be added 2977 * @mib_len: length of the LLDP MIB returned in response 2978 * @cmd_details: pointer to command details structure or NULL 2979 * 2980 * Add the specified TLV to LLDP Local MIB for the given bridge type, 2981 * it is responsibility of the caller to make sure that the TLV is not 2982 * already present in the LLDPDU. 2983 * In return firmware will write the complete LLDP MIB with the newly 2984 * added TLV in the response buffer. 2985 **/ 2986 enum i40e_status_code i40e_aq_add_lldp_tlv(struct i40e_hw *hw, u8 bridge_type, 2987 void *buff, u16 buff_size, u16 tlv_len, 2988 u16 *mib_len, 2989 struct i40e_asq_cmd_details *cmd_details) 2990 { 2991 struct i40e_aq_desc desc; 2992 struct i40e_aqc_lldp_add_tlv *cmd = 2993 (struct i40e_aqc_lldp_add_tlv *)&desc.params.raw; 2994 enum i40e_status_code status; 2995 2996 if (buff_size == 0 || !buff || tlv_len == 0) 2997 return I40E_ERR_PARAM; 2998 2999 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_lldp_add_tlv); 3000 3001 /* Indirect Command */ 3002 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD)); 3003 if (buff_size > I40E_AQ_LARGE_BUF) 3004 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB); 3005 desc.datalen = CPU_TO_LE16(buff_size); 3006 3007 cmd->type = ((bridge_type << I40E_AQ_LLDP_BRIDGE_TYPE_SHIFT) & 3008 I40E_AQ_LLDP_BRIDGE_TYPE_MASK); 3009 cmd->len = CPU_TO_LE16(tlv_len); 3010 3011 status = i40e_asq_send_command(hw, &desc, buff, buff_size, cmd_details); 3012 if (!status) { 3013 if (mib_len != NULL) 3014 *mib_len = LE16_TO_CPU(desc.datalen); 3015 } 3016 3017 return status; 3018 } 3019 3020 /** 3021 * i40e_aq_update_lldp_tlv 3022 * @hw: pointer to the hw struct 3023 * @bridge_type: type of bridge 3024 * @buff: buffer with TLV to update 3025 * @buff_size: size of the buffer holding original and updated TLVs 3026 * @old_len: Length of the Original TLV 3027 * @new_len: Length of the Updated TLV 3028 * @offset: offset of the updated TLV in the buff 3029 * @mib_len: length of the returned LLDP MIB 3030 * @cmd_details: pointer to command details structure or NULL 3031 * 3032 * Update the specified TLV to the LLDP Local MIB for the given bridge type. 3033 * Firmware will place the complete LLDP MIB in response buffer with the 3034 * updated TLV. 3035 **/ 3036 enum i40e_status_code i40e_aq_update_lldp_tlv(struct i40e_hw *hw, 3037 u8 bridge_type, void *buff, u16 buff_size, 3038 u16 old_len, u16 new_len, u16 offset, 3039 u16 *mib_len, 3040 struct i40e_asq_cmd_details *cmd_details) 3041 { 3042 struct i40e_aq_desc desc; 3043 struct i40e_aqc_lldp_update_tlv *cmd = 3044 (struct i40e_aqc_lldp_update_tlv *)&desc.params.raw; 3045 enum i40e_status_code status; 3046 3047 if (buff_size == 0 || !buff || offset == 0 || 3048 old_len == 0 || new_len == 0) 3049 return I40E_ERR_PARAM; 3050 3051 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_lldp_update_tlv); 3052 3053 /* Indirect Command */ 3054 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD)); 3055 if (buff_size > I40E_AQ_LARGE_BUF) 3056 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB); 3057 desc.datalen = CPU_TO_LE16(buff_size); 3058 3059 cmd->type = ((bridge_type << I40E_AQ_LLDP_BRIDGE_TYPE_SHIFT) & 3060 I40E_AQ_LLDP_BRIDGE_TYPE_MASK); 3061 cmd->old_len = CPU_TO_LE16(old_len); 3062 cmd->new_offset = CPU_TO_LE16(offset); 3063 cmd->new_len = CPU_TO_LE16(new_len); 3064 3065 status = i40e_asq_send_command(hw, &desc, buff, buff_size, cmd_details); 3066 if (!status) { 3067 if (mib_len != NULL) 3068 *mib_len = LE16_TO_CPU(desc.datalen); 3069 } 3070 3071 return status; 3072 } 3073 3074 /** 3075 * i40e_aq_delete_lldp_tlv 3076 * @hw: pointer to the hw struct 3077 * @bridge_type: type of bridge 3078 * @buff: pointer to a user supplied buffer that has the TLV 3079 * @buff_size: length of the buffer 3080 * @tlv_len: length of the TLV to be deleted 3081 * @mib_len: length of the returned LLDP MIB 3082 * @cmd_details: pointer to command details structure or NULL 3083 * 3084 * Delete the specified TLV from LLDP Local MIB for the given bridge type. 3085 * The firmware places the entire LLDP MIB in the response buffer. 3086 **/ 3087 enum i40e_status_code i40e_aq_delete_lldp_tlv(struct i40e_hw *hw, 3088 u8 bridge_type, void *buff, u16 buff_size, 3089 u16 tlv_len, u16 *mib_len, 3090 struct i40e_asq_cmd_details *cmd_details) 3091 { 3092 struct i40e_aq_desc desc; 3093 struct i40e_aqc_lldp_add_tlv *cmd = 3094 (struct i40e_aqc_lldp_add_tlv *)&desc.params.raw; 3095 enum i40e_status_code status; 3096 3097 if (buff_size == 0 || !buff) 3098 return I40E_ERR_PARAM; 3099 3100 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_lldp_delete_tlv); 3101 3102 /* Indirect Command */ 3103 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD)); 3104 if (buff_size > I40E_AQ_LARGE_BUF) 3105 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB); 3106 desc.datalen = CPU_TO_LE16(buff_size); 3107 cmd->len = CPU_TO_LE16(tlv_len); 3108 cmd->type = ((bridge_type << I40E_AQ_LLDP_BRIDGE_TYPE_SHIFT) & 3109 I40E_AQ_LLDP_BRIDGE_TYPE_MASK); 3110 3111 status = i40e_asq_send_command(hw, &desc, buff, buff_size, cmd_details); 3112 if (!status) { 3113 if (mib_len != NULL) 3114 *mib_len = LE16_TO_CPU(desc.datalen); 3115 } 3116 3117 return status; 3118 } 3119 3120 /** 3121 * i40e_aq_stop_lldp 3122 * @hw: pointer to the hw struct 3123 * @shutdown_agent: True if LLDP Agent needs to be Shutdown 3124 * @cmd_details: pointer to command details structure or NULL 3125 * 3126 * Stop or Shutdown the embedded LLDP Agent 3127 **/ 3128 enum i40e_status_code i40e_aq_stop_lldp(struct i40e_hw *hw, bool shutdown_agent, 3129 struct i40e_asq_cmd_details *cmd_details) 3130 { 3131 struct i40e_aq_desc desc; 3132 struct i40e_aqc_lldp_stop *cmd = 3133 (struct i40e_aqc_lldp_stop *)&desc.params.raw; 3134 enum i40e_status_code status; 3135 3136 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_lldp_stop); 3137 3138 if (shutdown_agent) 3139 cmd->command |= I40E_AQ_LLDP_AGENT_SHUTDOWN; 3140 3141 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details); 3142 3143 return status; 3144 } 3145 3146 /** 3147 * i40e_aq_start_lldp 3148 * @hw: pointer to the hw struct 3149 * @cmd_details: pointer to command details structure or NULL 3150 * 3151 * Start the embedded LLDP Agent on all ports. 3152 **/ 3153 enum i40e_status_code i40e_aq_start_lldp(struct i40e_hw *hw, 3154 struct i40e_asq_cmd_details *cmd_details) 3155 { 3156 struct i40e_aq_desc desc; 3157 struct i40e_aqc_lldp_start *cmd = 3158 (struct i40e_aqc_lldp_start *)&desc.params.raw; 3159 enum i40e_status_code status; 3160 3161 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_lldp_start); 3162 3163 cmd->command = I40E_AQ_LLDP_AGENT_START; 3164 3165 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details); 3166 3167 return status; 3168 } 3169 3170 /** 3171 * i40e_aq_add_udp_tunnel 3172 * @hw: pointer to the hw struct 3173 * @udp_port: the UDP port to add 3174 * @header_len: length of the tunneling header length in DWords 3175 * @protocol_index: protocol index type 3176 * @filter_index: pointer to filter index 3177 * @cmd_details: pointer to command details structure or NULL 3178 **/ 3179 enum i40e_status_code i40e_aq_add_udp_tunnel(struct i40e_hw *hw, 3180 u16 udp_port, u8 protocol_index, 3181 u8 *filter_index, 3182 struct i40e_asq_cmd_details *cmd_details) 3183 { 3184 struct i40e_aq_desc desc; 3185 struct i40e_aqc_add_udp_tunnel *cmd = 3186 (struct i40e_aqc_add_udp_tunnel *)&desc.params.raw; 3187 struct i40e_aqc_del_udp_tunnel_completion *resp = 3188 (struct i40e_aqc_del_udp_tunnel_completion *)&desc.params.raw; 3189 enum i40e_status_code status; 3190 3191 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_add_udp_tunnel); 3192 3193 cmd->udp_port = CPU_TO_LE16(udp_port); 3194 cmd->protocol_type = protocol_index; 3195 3196 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details); 3197 3198 if (!status) 3199 *filter_index = resp->index; 3200 3201 return status; 3202 } 3203 3204 /** 3205 * i40e_aq_del_udp_tunnel 3206 * @hw: pointer to the hw struct 3207 * @index: filter index 3208 * @cmd_details: pointer to command details structure or NULL 3209 **/ 3210 enum i40e_status_code i40e_aq_del_udp_tunnel(struct i40e_hw *hw, u8 index, 3211 struct i40e_asq_cmd_details *cmd_details) 3212 { 3213 struct i40e_aq_desc desc; 3214 struct i40e_aqc_remove_udp_tunnel *cmd = 3215 (struct i40e_aqc_remove_udp_tunnel *)&desc.params.raw; 3216 enum i40e_status_code status; 3217 3218 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_del_udp_tunnel); 3219 3220 cmd->index = index; 3221 3222 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details); 3223 3224 return status; 3225 } 3226 3227 /** 3228 * i40e_aq_get_switch_resource_alloc (0x0204) 3229 * @hw: pointer to the hw struct 3230 * @num_entries: pointer to u8 to store the number of resource entries returned 3231 * @buf: pointer to a user supplied buffer. This buffer must be large enough 3232 * to store the resource information for all resource types. Each 3233 * resource type is a i40e_aqc_switch_resource_alloc_data structure. 3234 * @count: size, in bytes, of the buffer provided 3235 * @cmd_details: pointer to command details structure or NULL 3236 * 3237 * Query the resources allocated to a function. 3238 **/ 3239 enum i40e_status_code i40e_aq_get_switch_resource_alloc(struct i40e_hw *hw, 3240 u8 *num_entries, 3241 struct i40e_aqc_switch_resource_alloc_element_resp *buf, 3242 u16 count, 3243 struct i40e_asq_cmd_details *cmd_details) 3244 { 3245 struct i40e_aq_desc desc; 3246 struct i40e_aqc_get_switch_resource_alloc *cmd_resp = 3247 (struct i40e_aqc_get_switch_resource_alloc *)&desc.params.raw; 3248 enum i40e_status_code status; 3249 u16 length = count 3250 * sizeof(struct i40e_aqc_switch_resource_alloc_element_resp); 3251 3252 i40e_fill_default_direct_cmd_desc(&desc, 3253 i40e_aqc_opc_get_switch_resource_alloc); 3254 3255 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF); 3256 if (length > I40E_AQ_LARGE_BUF) 3257 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB); 3258 3259 status = i40e_asq_send_command(hw, &desc, buf, length, cmd_details); 3260 3261 if (!status) 3262 *num_entries = cmd_resp->num_entries; 3263 3264 return status; 3265 } 3266 3267 /** 3268 * i40e_aq_delete_element - Delete switch element 3269 * @hw: pointer to the hw struct 3270 * @seid: the SEID to delete from the switch 3271 * @cmd_details: pointer to command details structure or NULL 3272 * 3273 * This deletes a switch element from the switch. 3274 **/ 3275 enum i40e_status_code i40e_aq_delete_element(struct i40e_hw *hw, u16 seid, 3276 struct i40e_asq_cmd_details *cmd_details) 3277 { 3278 struct i40e_aq_desc desc; 3279 struct i40e_aqc_switch_seid *cmd = 3280 (struct i40e_aqc_switch_seid *)&desc.params.raw; 3281 enum i40e_status_code status; 3282 3283 if (seid == 0) 3284 return I40E_ERR_PARAM; 3285 3286 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_delete_element); 3287 3288 cmd->seid = CPU_TO_LE16(seid); 3289 3290 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details); 3291 3292 return status; 3293 } 3294 3295 /** 3296 * i40_aq_add_pvirt - Instantiate a Port Virtualizer on a port 3297 * @hw: pointer to the hw struct 3298 * @flags: component flags 3299 * @mac_seid: uplink seid (MAC SEID) 3300 * @vsi_seid: connected vsi seid 3301 * @ret_seid: seid of create pv component 3302 * 3303 * This instantiates an i40e port virtualizer with specified flags. 3304 * Depending on specified flags the port virtualizer can act as a 3305 * 802.1Qbr port virtualizer or a 802.1Qbg S-component. 3306 */ 3307 enum i40e_status_code i40e_aq_add_pvirt(struct i40e_hw *hw, u16 flags, 3308 u16 mac_seid, u16 vsi_seid, 3309 u16 *ret_seid) 3310 { 3311 struct i40e_aq_desc desc; 3312 struct i40e_aqc_add_update_pv *cmd = 3313 (struct i40e_aqc_add_update_pv *)&desc.params.raw; 3314 struct i40e_aqc_add_update_pv_completion *resp = 3315 (struct i40e_aqc_add_update_pv_completion *)&desc.params.raw; 3316 enum i40e_status_code status; 3317 3318 if (vsi_seid == 0) 3319 return I40E_ERR_PARAM; 3320 3321 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_add_pv); 3322 cmd->command_flags = CPU_TO_LE16(flags); 3323 cmd->uplink_seid = CPU_TO_LE16(mac_seid); 3324 cmd->connected_seid = CPU_TO_LE16(vsi_seid); 3325 3326 status = i40e_asq_send_command(hw, &desc, NULL, 0, NULL); 3327 if (!status && ret_seid) 3328 *ret_seid = LE16_TO_CPU(resp->pv_seid); 3329 3330 return status; 3331 } 3332 3333 /** 3334 * i40e_aq_add_tag - Add an S/E-tag 3335 * @hw: pointer to the hw struct 3336 * @direct_to_queue: should s-tag direct flow to a specific queue 3337 * @vsi_seid: VSI SEID to use this tag 3338 * @tag: value of the tag 3339 * @queue_num: queue number, only valid is direct_to_queue is TRUE 3340 * @tags_used: return value, number of tags in use by this PF 3341 * @tags_free: return value, number of unallocated tags 3342 * @cmd_details: pointer to command details structure or NULL 3343 * 3344 * This associates an S- or E-tag to a VSI in the switch complex. It returns 3345 * the number of tags allocated by the PF, and the number of unallocated 3346 * tags available. 3347 **/ 3348 enum i40e_status_code i40e_aq_add_tag(struct i40e_hw *hw, bool direct_to_queue, 3349 u16 vsi_seid, u16 tag, u16 queue_num, 3350 u16 *tags_used, u16 *tags_free, 3351 struct i40e_asq_cmd_details *cmd_details) 3352 { 3353 struct i40e_aq_desc desc; 3354 struct i40e_aqc_add_tag *cmd = 3355 (struct i40e_aqc_add_tag *)&desc.params.raw; 3356 struct i40e_aqc_add_remove_tag_completion *resp = 3357 (struct i40e_aqc_add_remove_tag_completion *)&desc.params.raw; 3358 enum i40e_status_code status; 3359 3360 if (vsi_seid == 0) 3361 return I40E_ERR_PARAM; 3362 3363 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_add_tag); 3364 3365 cmd->seid = CPU_TO_LE16(vsi_seid); 3366 cmd->tag = CPU_TO_LE16(tag); 3367 if (direct_to_queue) { 3368 cmd->flags = CPU_TO_LE16(I40E_AQC_ADD_TAG_FLAG_TO_QUEUE); 3369 cmd->queue_number = CPU_TO_LE16(queue_num); 3370 } 3371 3372 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details); 3373 3374 if (!status) { 3375 if (tags_used != NULL) 3376 *tags_used = LE16_TO_CPU(resp->tags_used); 3377 if (tags_free != NULL) 3378 *tags_free = LE16_TO_CPU(resp->tags_free); 3379 } 3380 3381 return status; 3382 } 3383 3384 /** 3385 * i40e_aq_remove_tag - Remove an S- or E-tag 3386 * @hw: pointer to the hw struct 3387 * @vsi_seid: VSI SEID this tag is associated with 3388 * @tag: value of the S-tag to delete 3389 * @tags_used: return value, number of tags in use by this PF 3390 * @tags_free: return value, number of unallocated tags 3391 * @cmd_details: pointer to command details structure or NULL 3392 * 3393 * This deletes an S- or E-tag from a VSI in the switch complex. It returns 3394 * the number of tags allocated by the PF, and the number of unallocated 3395 * tags available. 3396 **/ 3397 enum i40e_status_code i40e_aq_remove_tag(struct i40e_hw *hw, u16 vsi_seid, 3398 u16 tag, u16 *tags_used, u16 *tags_free, 3399 struct i40e_asq_cmd_details *cmd_details) 3400 { 3401 struct i40e_aq_desc desc; 3402 struct i40e_aqc_remove_tag *cmd = 3403 (struct i40e_aqc_remove_tag *)&desc.params.raw; 3404 struct i40e_aqc_add_remove_tag_completion *resp = 3405 (struct i40e_aqc_add_remove_tag_completion *)&desc.params.raw; 3406 enum i40e_status_code status; 3407 3408 if (vsi_seid == 0) 3409 return I40E_ERR_PARAM; 3410 3411 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_remove_tag); 3412 3413 cmd->seid = CPU_TO_LE16(vsi_seid); 3414 cmd->tag = CPU_TO_LE16(tag); 3415 3416 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details); 3417 3418 if (!status) { 3419 if (tags_used != NULL) 3420 *tags_used = LE16_TO_CPU(resp->tags_used); 3421 if (tags_free != NULL) 3422 *tags_free = LE16_TO_CPU(resp->tags_free); 3423 } 3424 3425 return status; 3426 } 3427 3428 /** 3429 * i40e_aq_add_mcast_etag - Add a multicast E-tag 3430 * @hw: pointer to the hw struct 3431 * @pv_seid: Port Virtualizer of this SEID to associate E-tag with 3432 * @etag: value of E-tag to add 3433 * @num_tags_in_buf: number of unicast E-tags in indirect buffer 3434 * @buf: address of indirect buffer 3435 * @tags_used: return value, number of E-tags in use by this port 3436 * @tags_free: return value, number of unallocated M-tags 3437 * @cmd_details: pointer to command details structure or NULL 3438 * 3439 * This associates a multicast E-tag to a port virtualizer. It will return 3440 * the number of tags allocated by the PF, and the number of unallocated 3441 * tags available. 3442 * 3443 * The indirect buffer pointed to by buf is a list of 2-byte E-tags, 3444 * num_tags_in_buf long. 3445 **/ 3446 enum i40e_status_code i40e_aq_add_mcast_etag(struct i40e_hw *hw, u16 pv_seid, 3447 u16 etag, u8 num_tags_in_buf, void *buf, 3448 u16 *tags_used, u16 *tags_free, 3449 struct i40e_asq_cmd_details *cmd_details) 3450 { 3451 struct i40e_aq_desc desc; 3452 struct i40e_aqc_add_remove_mcast_etag *cmd = 3453 (struct i40e_aqc_add_remove_mcast_etag *)&desc.params.raw; 3454 struct i40e_aqc_add_remove_mcast_etag_completion *resp = 3455 (struct i40e_aqc_add_remove_mcast_etag_completion *)&desc.params.raw; 3456 enum i40e_status_code status; 3457 u16 length = sizeof(u16) * num_tags_in_buf; 3458 3459 if ((pv_seid == 0) || (buf == NULL) || (num_tags_in_buf == 0)) 3460 return I40E_ERR_PARAM; 3461 3462 i40e_fill_default_direct_cmd_desc(&desc, 3463 i40e_aqc_opc_add_multicast_etag); 3464 3465 cmd->pv_seid = CPU_TO_LE16(pv_seid); 3466 cmd->etag = CPU_TO_LE16(etag); 3467 cmd->num_unicast_etags = num_tags_in_buf; 3468 3469 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD)); 3470 if (length > I40E_AQ_LARGE_BUF) 3471 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB); 3472 3473 status = i40e_asq_send_command(hw, &desc, buf, length, cmd_details); 3474 3475 if (!status) { 3476 if (tags_used != NULL) 3477 *tags_used = LE16_TO_CPU(resp->mcast_etags_used); 3478 if (tags_free != NULL) 3479 *tags_free = LE16_TO_CPU(resp->mcast_etags_free); 3480 } 3481 3482 return status; 3483 } 3484 3485 /** 3486 * i40e_aq_remove_mcast_etag - Remove a multicast E-tag 3487 * @hw: pointer to the hw struct 3488 * @pv_seid: Port Virtualizer SEID this M-tag is associated with 3489 * @etag: value of the E-tag to remove 3490 * @tags_used: return value, number of tags in use by this port 3491 * @tags_free: return value, number of unallocated tags 3492 * @cmd_details: pointer to command details structure or NULL 3493 * 3494 * This deletes an E-tag from the port virtualizer. It will return 3495 * the number of tags allocated by the port, and the number of unallocated 3496 * tags available. 3497 **/ 3498 enum i40e_status_code i40e_aq_remove_mcast_etag(struct i40e_hw *hw, u16 pv_seid, 3499 u16 etag, u16 *tags_used, u16 *tags_free, 3500 struct i40e_asq_cmd_details *cmd_details) 3501 { 3502 struct i40e_aq_desc desc; 3503 struct i40e_aqc_add_remove_mcast_etag *cmd = 3504 (struct i40e_aqc_add_remove_mcast_etag *)&desc.params.raw; 3505 struct i40e_aqc_add_remove_mcast_etag_completion *resp = 3506 (struct i40e_aqc_add_remove_mcast_etag_completion *)&desc.params.raw; 3507 enum i40e_status_code status; 3508 3509 3510 if (pv_seid == 0) 3511 return I40E_ERR_PARAM; 3512 3513 i40e_fill_default_direct_cmd_desc(&desc, 3514 i40e_aqc_opc_remove_multicast_etag); 3515 3516 cmd->pv_seid = CPU_TO_LE16(pv_seid); 3517 cmd->etag = CPU_TO_LE16(etag); 3518 3519 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details); 3520 3521 if (!status) { 3522 if (tags_used != NULL) 3523 *tags_used = LE16_TO_CPU(resp->mcast_etags_used); 3524 if (tags_free != NULL) 3525 *tags_free = LE16_TO_CPU(resp->mcast_etags_free); 3526 } 3527 3528 return status; 3529 } 3530 3531 /** 3532 * i40e_aq_update_tag - Update an S/E-tag 3533 * @hw: pointer to the hw struct 3534 * @vsi_seid: VSI SEID using this S-tag 3535 * @old_tag: old tag value 3536 * @new_tag: new tag value 3537 * @tags_used: return value, number of tags in use by this PF 3538 * @tags_free: return value, number of unallocated tags 3539 * @cmd_details: pointer to command details structure or NULL 3540 * 3541 * This updates the value of the tag currently attached to this VSI 3542 * in the switch complex. It will return the number of tags allocated 3543 * by the PF, and the number of unallocated tags available. 3544 **/ 3545 enum i40e_status_code i40e_aq_update_tag(struct i40e_hw *hw, u16 vsi_seid, 3546 u16 old_tag, u16 new_tag, u16 *tags_used, 3547 u16 *tags_free, 3548 struct i40e_asq_cmd_details *cmd_details) 3549 { 3550 struct i40e_aq_desc desc; 3551 struct i40e_aqc_update_tag *cmd = 3552 (struct i40e_aqc_update_tag *)&desc.params.raw; 3553 struct i40e_aqc_update_tag_completion *resp = 3554 (struct i40e_aqc_update_tag_completion *)&desc.params.raw; 3555 enum i40e_status_code status; 3556 3557 if (vsi_seid == 0) 3558 return I40E_ERR_PARAM; 3559 3560 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_update_tag); 3561 3562 cmd->seid = CPU_TO_LE16(vsi_seid); 3563 cmd->old_tag = CPU_TO_LE16(old_tag); 3564 cmd->new_tag = CPU_TO_LE16(new_tag); 3565 3566 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details); 3567 3568 if (!status) { 3569 if (tags_used != NULL) 3570 *tags_used = LE16_TO_CPU(resp->tags_used); 3571 if (tags_free != NULL) 3572 *tags_free = LE16_TO_CPU(resp->tags_free); 3573 } 3574 3575 return status; 3576 } 3577 3578 /** 3579 * i40e_aq_dcb_ignore_pfc - Ignore PFC for given TCs 3580 * @hw: pointer to the hw struct 3581 * @tcmap: TC map for request/release any ignore PFC condition 3582 * @request: request or release ignore PFC condition 3583 * @tcmap_ret: return TCs for which PFC is currently ignored 3584 * @cmd_details: pointer to command details structure or NULL 3585 * 3586 * This sends out request/release to ignore PFC condition for a TC. 3587 * It will return the TCs for which PFC is currently ignored. 3588 **/ 3589 enum i40e_status_code i40e_aq_dcb_ignore_pfc(struct i40e_hw *hw, u8 tcmap, 3590 bool request, u8 *tcmap_ret, 3591 struct i40e_asq_cmd_details *cmd_details) 3592 { 3593 struct i40e_aq_desc desc; 3594 struct i40e_aqc_pfc_ignore *cmd_resp = 3595 (struct i40e_aqc_pfc_ignore *)&desc.params.raw; 3596 enum i40e_status_code status; 3597 3598 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_dcb_ignore_pfc); 3599 3600 if (request) 3601 cmd_resp->command_flags = I40E_AQC_PFC_IGNORE_SET; 3602 3603 cmd_resp->tc_bitmap = tcmap; 3604 3605 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details); 3606 3607 if (!status) { 3608 if (tcmap_ret != NULL) 3609 *tcmap_ret = cmd_resp->tc_bitmap; 3610 } 3611 3612 return status; 3613 } 3614 3615 /** 3616 * i40e_aq_dcb_updated - DCB Updated Command 3617 * @hw: pointer to the hw struct 3618 * @cmd_details: pointer to command details structure or NULL 3619 * 3620 * When LLDP is handled in PF this command is used by the PF 3621 * to notify EMP that a DCB setting is modified. 3622 * When LLDP is handled in EMP this command is used by the PF 3623 * to notify EMP whenever one of the following parameters get 3624 * modified: 3625 * - PFCLinkDelayAllowance in PRTDCB_GENC.PFCLDA 3626 * - PCIRTT in PRTDCB_GENC.PCIRTT 3627 * - Maximum Frame Size for non-FCoE TCs set by PRTDCB_TDPUC.MAX_TXFRAME. 3628 * EMP will return when the shared RPB settings have been 3629 * recomputed and modified. The retval field in the descriptor 3630 * will be set to 0 when RPB is modified. 3631 **/ 3632 enum i40e_status_code i40e_aq_dcb_updated(struct i40e_hw *hw, 3633 struct i40e_asq_cmd_details *cmd_details) 3634 { 3635 struct i40e_aq_desc desc; 3636 enum i40e_status_code status; 3637 3638 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_dcb_updated); 3639 3640 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details); 3641 3642 return status; 3643 } 3644 3645 /** 3646 * i40e_aq_add_statistics - Add a statistics block to a VLAN in a switch. 3647 * @hw: pointer to the hw struct 3648 * @seid: defines the SEID of the switch for which the stats are requested 3649 * @vlan_id: the VLAN ID for which the statistics are requested 3650 * @stat_index: index of the statistics counters block assigned to this VLAN 3651 * @cmd_details: pointer to command details structure or NULL 3652 * 3653 * XL710 supports 128 smonVlanStats counters.This command is used to 3654 * allocate a set of smonVlanStats counters to a specific VLAN in a specific 3655 * switch. 3656 **/ 3657 enum i40e_status_code i40e_aq_add_statistics(struct i40e_hw *hw, u16 seid, 3658 u16 vlan_id, u16 *stat_index, 3659 struct i40e_asq_cmd_details *cmd_details) 3660 { 3661 struct i40e_aq_desc desc; 3662 struct i40e_aqc_add_remove_statistics *cmd_resp = 3663 (struct i40e_aqc_add_remove_statistics *)&desc.params.raw; 3664 enum i40e_status_code status; 3665 3666 if ((seid == 0) || (stat_index == NULL)) 3667 return I40E_ERR_PARAM; 3668 3669 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_add_statistics); 3670 3671 cmd_resp->seid = CPU_TO_LE16(seid); 3672 cmd_resp->vlan = CPU_TO_LE16(vlan_id); 3673 3674 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details); 3675 3676 if (!status) 3677 *stat_index = LE16_TO_CPU(cmd_resp->stat_index); 3678 3679 return status; 3680 } 3681 3682 /** 3683 * i40e_aq_remove_statistics - Remove a statistics block to a VLAN in a switch. 3684 * @hw: pointer to the hw struct 3685 * @seid: defines the SEID of the switch for which the stats are requested 3686 * @vlan_id: the VLAN ID for which the statistics are requested 3687 * @stat_index: index of the statistics counters block assigned to this VLAN 3688 * @cmd_details: pointer to command details structure or NULL 3689 * 3690 * XL710 supports 128 smonVlanStats counters.This command is used to 3691 * deallocate a set of smonVlanStats counters to a specific VLAN in a specific 3692 * switch. 3693 **/ 3694 enum i40e_status_code i40e_aq_remove_statistics(struct i40e_hw *hw, u16 seid, 3695 u16 vlan_id, u16 stat_index, 3696 struct i40e_asq_cmd_details *cmd_details) 3697 { 3698 struct i40e_aq_desc desc; 3699 struct i40e_aqc_add_remove_statistics *cmd = 3700 (struct i40e_aqc_add_remove_statistics *)&desc.params.raw; 3701 enum i40e_status_code status; 3702 3703 if (seid == 0) 3704 return I40E_ERR_PARAM; 3705 3706 i40e_fill_default_direct_cmd_desc(&desc, 3707 i40e_aqc_opc_remove_statistics); 3708 3709 cmd->seid = CPU_TO_LE16(seid); 3710 cmd->vlan = CPU_TO_LE16(vlan_id); 3711 cmd->stat_index = CPU_TO_LE16(stat_index); 3712 3713 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details); 3714 3715 return status; 3716 } 3717 3718 /** 3719 * i40e_aq_set_port_parameters - set physical port parameters. 3720 * @hw: pointer to the hw struct 3721 * @bad_frame_vsi: defines the VSI to which bad frames are forwarded 3722 * @save_bad_pac: if set packets with errors are forwarded to the bad frames VSI 3723 * @pad_short_pac: if set transmit packets smaller than 60 bytes are padded 3724 * @double_vlan: if set double VLAN is enabled 3725 * @cmd_details: pointer to command details structure or NULL 3726 **/ 3727 enum i40e_status_code i40e_aq_set_port_parameters(struct i40e_hw *hw, 3728 u16 bad_frame_vsi, bool save_bad_pac, 3729 bool pad_short_pac, bool double_vlan, 3730 struct i40e_asq_cmd_details *cmd_details) 3731 { 3732 struct i40e_aqc_set_port_parameters *cmd; 3733 enum i40e_status_code status; 3734 struct i40e_aq_desc desc; 3735 u16 command_flags = 0; 3736 3737 cmd = (struct i40e_aqc_set_port_parameters *)&desc.params.raw; 3738 3739 i40e_fill_default_direct_cmd_desc(&desc, 3740 i40e_aqc_opc_set_port_parameters); 3741 3742 cmd->bad_frame_vsi = CPU_TO_LE16(bad_frame_vsi); 3743 if (save_bad_pac) 3744 command_flags |= I40E_AQ_SET_P_PARAMS_SAVE_BAD_PACKETS; 3745 if (pad_short_pac) 3746 command_flags |= I40E_AQ_SET_P_PARAMS_PAD_SHORT_PACKETS; 3747 if (double_vlan) 3748 command_flags |= I40E_AQ_SET_P_PARAMS_DOUBLE_VLAN_ENA; 3749 cmd->command_flags = CPU_TO_LE16(command_flags); 3750 3751 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details); 3752 3753 return status; 3754 } 3755 3756 /** 3757 * i40e_aq_tx_sched_cmd - generic Tx scheduler AQ command handler 3758 * @hw: pointer to the hw struct 3759 * @seid: seid for the physical port/switching component/vsi 3760 * @buff: Indirect buffer to hold data parameters and response 3761 * @buff_size: Indirect buffer size 3762 * @opcode: Tx scheduler AQ command opcode 3763 * @cmd_details: pointer to command details structure or NULL 3764 * 3765 * Generic command handler for Tx scheduler AQ commands 3766 **/ 3767 static enum i40e_status_code i40e_aq_tx_sched_cmd(struct i40e_hw *hw, u16 seid, 3768 void *buff, u16 buff_size, 3769 enum i40e_admin_queue_opc opcode, 3770 struct i40e_asq_cmd_details *cmd_details) 3771 { 3772 struct i40e_aq_desc desc; 3773 struct i40e_aqc_tx_sched_ind *cmd = 3774 (struct i40e_aqc_tx_sched_ind *)&desc.params.raw; 3775 enum i40e_status_code status; 3776 bool cmd_param_flag = FALSE; 3777 3778 switch (opcode) { 3779 case i40e_aqc_opc_configure_vsi_ets_sla_bw_limit: 3780 case i40e_aqc_opc_configure_vsi_tc_bw: 3781 case i40e_aqc_opc_enable_switching_comp_ets: 3782 case i40e_aqc_opc_modify_switching_comp_ets: 3783 case i40e_aqc_opc_disable_switching_comp_ets: 3784 case i40e_aqc_opc_configure_switching_comp_ets_bw_limit: 3785 case i40e_aqc_opc_configure_switching_comp_bw_config: 3786 cmd_param_flag = TRUE; 3787 break; 3788 case i40e_aqc_opc_query_vsi_bw_config: 3789 case i40e_aqc_opc_query_vsi_ets_sla_config: 3790 case i40e_aqc_opc_query_switching_comp_ets_config: 3791 case i40e_aqc_opc_query_port_ets_config: 3792 case i40e_aqc_opc_query_switching_comp_bw_config: 3793 cmd_param_flag = FALSE; 3794 break; 3795 default: 3796 return I40E_ERR_PARAM; 3797 } 3798 3799 i40e_fill_default_direct_cmd_desc(&desc, opcode); 3800 3801 /* Indirect command */ 3802 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF); 3803 if (cmd_param_flag) 3804 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_RD); 3805 if (buff_size > I40E_AQ_LARGE_BUF) 3806 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB); 3807 3808 desc.datalen = CPU_TO_LE16(buff_size); 3809 3810 cmd->vsi_seid = CPU_TO_LE16(seid); 3811 3812 status = i40e_asq_send_command(hw, &desc, buff, buff_size, cmd_details); 3813 3814 return status; 3815 } 3816 3817 /** 3818 * i40e_aq_config_vsi_bw_limit - Configure VSI BW Limit 3819 * @hw: pointer to the hw struct 3820 * @seid: VSI seid 3821 * @credit: BW limit credits (0 = disabled) 3822 * @max_credit: Max BW limit credits 3823 * @cmd_details: pointer to command details structure or NULL 3824 **/ 3825 enum i40e_status_code i40e_aq_config_vsi_bw_limit(struct i40e_hw *hw, 3826 u16 seid, u16 credit, u8 max_credit, 3827 struct i40e_asq_cmd_details *cmd_details) 3828 { 3829 struct i40e_aq_desc desc; 3830 struct i40e_aqc_configure_vsi_bw_limit *cmd = 3831 (struct i40e_aqc_configure_vsi_bw_limit *)&desc.params.raw; 3832 enum i40e_status_code status; 3833 3834 i40e_fill_default_direct_cmd_desc(&desc, 3835 i40e_aqc_opc_configure_vsi_bw_limit); 3836 3837 cmd->vsi_seid = CPU_TO_LE16(seid); 3838 cmd->credit = CPU_TO_LE16(credit); 3839 cmd->max_credit = max_credit; 3840 3841 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details); 3842 3843 return status; 3844 } 3845 3846 /** 3847 * i40e_aq_config_switch_comp_bw_limit - Configure Switching component BW Limit 3848 * @hw: pointer to the hw struct 3849 * @seid: switching component seid 3850 * @credit: BW limit credits (0 = disabled) 3851 * @max_bw: Max BW limit credits 3852 * @cmd_details: pointer to command details structure or NULL 3853 **/ 3854 enum i40e_status_code i40e_aq_config_switch_comp_bw_limit(struct i40e_hw *hw, 3855 u16 seid, u16 credit, u8 max_bw, 3856 struct i40e_asq_cmd_details *cmd_details) 3857 { 3858 struct i40e_aq_desc desc; 3859 struct i40e_aqc_configure_switching_comp_bw_limit *cmd = 3860 (struct i40e_aqc_configure_switching_comp_bw_limit *)&desc.params.raw; 3861 enum i40e_status_code status; 3862 3863 i40e_fill_default_direct_cmd_desc(&desc, 3864 i40e_aqc_opc_configure_switching_comp_bw_limit); 3865 3866 cmd->seid = CPU_TO_LE16(seid); 3867 cmd->credit = CPU_TO_LE16(credit); 3868 cmd->max_bw = max_bw; 3869 3870 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details); 3871 3872 return status; 3873 } 3874 3875 /** 3876 * i40e_aq_config_vsi_ets_sla_bw_limit - Config VSI BW Limit per TC 3877 * @hw: pointer to the hw struct 3878 * @seid: VSI seid 3879 * @bw_data: Buffer holding enabled TCs, per TC BW limit/credits 3880 * @cmd_details: pointer to command details structure or NULL 3881 **/ 3882 enum i40e_status_code i40e_aq_config_vsi_ets_sla_bw_limit(struct i40e_hw *hw, 3883 u16 seid, 3884 struct i40e_aqc_configure_vsi_ets_sla_bw_data *bw_data, 3885 struct i40e_asq_cmd_details *cmd_details) 3886 { 3887 return i40e_aq_tx_sched_cmd(hw, seid, (void *)bw_data, sizeof(*bw_data), 3888 i40e_aqc_opc_configure_vsi_ets_sla_bw_limit, 3889 cmd_details); 3890 } 3891 3892 /** 3893 * i40e_aq_config_vsi_tc_bw - Config VSI BW Allocation per TC 3894 * @hw: pointer to the hw struct 3895 * @seid: VSI seid 3896 * @bw_data: Buffer holding enabled TCs, relative TC BW limit/credits 3897 * @cmd_details: pointer to command details structure or NULL 3898 **/ 3899 enum i40e_status_code i40e_aq_config_vsi_tc_bw(struct i40e_hw *hw, 3900 u16 seid, 3901 struct i40e_aqc_configure_vsi_tc_bw_data *bw_data, 3902 struct i40e_asq_cmd_details *cmd_details) 3903 { 3904 return i40e_aq_tx_sched_cmd(hw, seid, (void *)bw_data, sizeof(*bw_data), 3905 i40e_aqc_opc_configure_vsi_tc_bw, 3906 cmd_details); 3907 } 3908 3909 /** 3910 * i40e_aq_config_switch_comp_ets_bw_limit - Config Switch comp BW Limit per TC 3911 * @hw: pointer to the hw struct 3912 * @seid: seid of the switching component 3913 * @bw_data: Buffer holding enabled TCs, per TC BW limit/credits 3914 * @cmd_details: pointer to command details structure or NULL 3915 **/ 3916 enum i40e_status_code i40e_aq_config_switch_comp_ets_bw_limit( 3917 struct i40e_hw *hw, u16 seid, 3918 struct i40e_aqc_configure_switching_comp_ets_bw_limit_data *bw_data, 3919 struct i40e_asq_cmd_details *cmd_details) 3920 { 3921 return i40e_aq_tx_sched_cmd(hw, seid, (void *)bw_data, sizeof(*bw_data), 3922 i40e_aqc_opc_configure_switching_comp_ets_bw_limit, 3923 cmd_details); 3924 } 3925 3926 /** 3927 * i40e_aq_query_vsi_bw_config - Query VSI BW configuration 3928 * @hw: pointer to the hw struct 3929 * @seid: seid of the VSI 3930 * @bw_data: Buffer to hold VSI BW configuration 3931 * @cmd_details: pointer to command details structure or NULL 3932 **/ 3933 enum i40e_status_code i40e_aq_query_vsi_bw_config(struct i40e_hw *hw, 3934 u16 seid, 3935 struct i40e_aqc_query_vsi_bw_config_resp *bw_data, 3936 struct i40e_asq_cmd_details *cmd_details) 3937 { 3938 return i40e_aq_tx_sched_cmd(hw, seid, (void *)bw_data, sizeof(*bw_data), 3939 i40e_aqc_opc_query_vsi_bw_config, 3940 cmd_details); 3941 } 3942 3943 /** 3944 * i40e_aq_query_vsi_ets_sla_config - Query VSI BW configuration per TC 3945 * @hw: pointer to the hw struct 3946 * @seid: seid of the VSI 3947 * @bw_data: Buffer to hold VSI BW configuration per TC 3948 * @cmd_details: pointer to command details structure or NULL 3949 **/ 3950 enum i40e_status_code i40e_aq_query_vsi_ets_sla_config(struct i40e_hw *hw, 3951 u16 seid, 3952 struct i40e_aqc_query_vsi_ets_sla_config_resp *bw_data, 3953 struct i40e_asq_cmd_details *cmd_details) 3954 { 3955 return i40e_aq_tx_sched_cmd(hw, seid, (void *)bw_data, sizeof(*bw_data), 3956 i40e_aqc_opc_query_vsi_ets_sla_config, 3957 cmd_details); 3958 } 3959 3960 /** 3961 * i40e_aq_query_switch_comp_ets_config - Query Switch comp BW config per TC 3962 * @hw: pointer to the hw struct 3963 * @seid: seid of the switching component 3964 * @bw_data: Buffer to hold switching component's per TC BW config 3965 * @cmd_details: pointer to command details structure or NULL 3966 **/ 3967 enum i40e_status_code i40e_aq_query_switch_comp_ets_config(struct i40e_hw *hw, 3968 u16 seid, 3969 struct i40e_aqc_query_switching_comp_ets_config_resp *bw_data, 3970 struct i40e_asq_cmd_details *cmd_details) 3971 { 3972 return i40e_aq_tx_sched_cmd(hw, seid, (void *)bw_data, sizeof(*bw_data), 3973 i40e_aqc_opc_query_switching_comp_ets_config, 3974 cmd_details); 3975 } 3976 3977 /** 3978 * i40e_aq_query_port_ets_config - Query Physical Port ETS configuration 3979 * @hw: pointer to the hw struct 3980 * @seid: seid of the VSI or switching component connected to Physical Port 3981 * @bw_data: Buffer to hold current ETS configuration for the Physical Port 3982 * @cmd_details: pointer to command details structure or NULL 3983 **/ 3984 enum i40e_status_code i40e_aq_query_port_ets_config(struct i40e_hw *hw, 3985 u16 seid, 3986 struct i40e_aqc_query_port_ets_config_resp *bw_data, 3987 struct i40e_asq_cmd_details *cmd_details) 3988 { 3989 return i40e_aq_tx_sched_cmd(hw, seid, (void *)bw_data, sizeof(*bw_data), 3990 i40e_aqc_opc_query_port_ets_config, 3991 cmd_details); 3992 } 3993 3994 /** 3995 * i40e_aq_query_switch_comp_bw_config - Query Switch comp BW configuration 3996 * @hw: pointer to the hw struct 3997 * @seid: seid of the switching component 3998 * @bw_data: Buffer to hold switching component's BW configuration 3999 * @cmd_details: pointer to command details structure or NULL 4000 **/ 4001 enum i40e_status_code i40e_aq_query_switch_comp_bw_config(struct i40e_hw *hw, 4002 u16 seid, 4003 struct i40e_aqc_query_switching_comp_bw_config_resp *bw_data, 4004 struct i40e_asq_cmd_details *cmd_details) 4005 { 4006 return i40e_aq_tx_sched_cmd(hw, seid, (void *)bw_data, sizeof(*bw_data), 4007 i40e_aqc_opc_query_switching_comp_bw_config, 4008 cmd_details); 4009 } 4010 4011 /** 4012 * i40e_validate_filter_settings 4013 * @hw: pointer to the hardware structure 4014 * @settings: Filter control settings 4015 * 4016 * Check and validate the filter control settings passed. 4017 * The function checks for the valid filter/context sizes being 4018 * passed for FCoE and PE. 4019 * 4020 * Returns I40E_SUCCESS if the values passed are valid and within 4021 * range else returns an error. 4022 **/ 4023 static enum i40e_status_code i40e_validate_filter_settings(struct i40e_hw *hw, 4024 struct i40e_filter_control_settings *settings) 4025 { 4026 u32 fcoe_cntx_size, fcoe_filt_size; 4027 u32 pe_cntx_size, pe_filt_size; 4028 u32 fcoe_fmax; 4029 4030 u32 val; 4031 4032 /* Validate FCoE settings passed */ 4033 switch (settings->fcoe_filt_num) { 4034 case I40E_HASH_FILTER_SIZE_1K: 4035 case I40E_HASH_FILTER_SIZE_2K: 4036 case I40E_HASH_FILTER_SIZE_4K: 4037 case I40E_HASH_FILTER_SIZE_8K: 4038 case I40E_HASH_FILTER_SIZE_16K: 4039 case I40E_HASH_FILTER_SIZE_32K: 4040 fcoe_filt_size = I40E_HASH_FILTER_BASE_SIZE; 4041 fcoe_filt_size <<= (u32)settings->fcoe_filt_num; 4042 break; 4043 default: 4044 return I40E_ERR_PARAM; 4045 } 4046 4047 switch (settings->fcoe_cntx_num) { 4048 case I40E_DMA_CNTX_SIZE_512: 4049 case I40E_DMA_CNTX_SIZE_1K: 4050 case I40E_DMA_CNTX_SIZE_2K: 4051 case I40E_DMA_CNTX_SIZE_4K: 4052 fcoe_cntx_size = I40E_DMA_CNTX_BASE_SIZE; 4053 fcoe_cntx_size <<= (u32)settings->fcoe_cntx_num; 4054 break; 4055 default: 4056 return I40E_ERR_PARAM; 4057 } 4058 4059 /* Validate PE settings passed */ 4060 switch (settings->pe_filt_num) { 4061 case I40E_HASH_FILTER_SIZE_1K: 4062 case I40E_HASH_FILTER_SIZE_2K: 4063 case I40E_HASH_FILTER_SIZE_4K: 4064 case I40E_HASH_FILTER_SIZE_8K: 4065 case I40E_HASH_FILTER_SIZE_16K: 4066 case I40E_HASH_FILTER_SIZE_32K: 4067 case I40E_HASH_FILTER_SIZE_64K: 4068 case I40E_HASH_FILTER_SIZE_128K: 4069 case I40E_HASH_FILTER_SIZE_256K: 4070 case I40E_HASH_FILTER_SIZE_512K: 4071 case I40E_HASH_FILTER_SIZE_1M: 4072 pe_filt_size = I40E_HASH_FILTER_BASE_SIZE; 4073 pe_filt_size <<= (u32)settings->pe_filt_num; 4074 break; 4075 default: 4076 return I40E_ERR_PARAM; 4077 } 4078 4079 switch (settings->pe_cntx_num) { 4080 case I40E_DMA_CNTX_SIZE_512: 4081 case I40E_DMA_CNTX_SIZE_1K: 4082 case I40E_DMA_CNTX_SIZE_2K: 4083 case I40E_DMA_CNTX_SIZE_4K: 4084 case I40E_DMA_CNTX_SIZE_8K: 4085 case I40E_DMA_CNTX_SIZE_16K: 4086 case I40E_DMA_CNTX_SIZE_32K: 4087 case I40E_DMA_CNTX_SIZE_64K: 4088 case I40E_DMA_CNTX_SIZE_128K: 4089 case I40E_DMA_CNTX_SIZE_256K: 4090 pe_cntx_size = I40E_DMA_CNTX_BASE_SIZE; 4091 pe_cntx_size <<= (u32)settings->pe_cntx_num; 4092 break; 4093 default: 4094 return I40E_ERR_PARAM; 4095 } 4096 4097 /* FCHSIZE + FCDSIZE should not be greater than PMFCOEFMAX */ 4098 val = rd32(hw, I40E_GLHMC_FCOEFMAX); 4099 fcoe_fmax = (val & I40E_GLHMC_FCOEFMAX_PMFCOEFMAX_MASK) 4100 >> I40E_GLHMC_FCOEFMAX_PMFCOEFMAX_SHIFT; 4101 if (fcoe_filt_size + fcoe_cntx_size > fcoe_fmax) 4102 return I40E_ERR_INVALID_SIZE; 4103 4104 return I40E_SUCCESS; 4105 } 4106 4107 /** 4108 * i40e_set_filter_control 4109 * @hw: pointer to the hardware structure 4110 * @settings: Filter control settings 4111 * 4112 * Set the Queue Filters for PE/FCoE and enable filters required 4113 * for a single PF. It is expected that these settings are programmed 4114 * at the driver initialization time. 4115 **/ 4116 enum i40e_status_code i40e_set_filter_control(struct i40e_hw *hw, 4117 struct i40e_filter_control_settings *settings) 4118 { 4119 enum i40e_status_code ret = I40E_SUCCESS; 4120 u32 hash_lut_size = 0; 4121 u32 val; 4122 4123 if (!settings) 4124 return I40E_ERR_PARAM; 4125 4126 /* Validate the input settings */ 4127 ret = i40e_validate_filter_settings(hw, settings); 4128 if (ret) 4129 return ret; 4130 4131 /* Read the PF Queue Filter control register */ 4132 val = rd32(hw, I40E_PFQF_CTL_0); 4133 4134 /* Program required PE hash buckets for the PF */ 4135 val &= ~I40E_PFQF_CTL_0_PEHSIZE_MASK; 4136 val |= ((u32)settings->pe_filt_num << I40E_PFQF_CTL_0_PEHSIZE_SHIFT) & 4137 I40E_PFQF_CTL_0_PEHSIZE_MASK; 4138 /* Program required PE contexts for the PF */ 4139 val &= ~I40E_PFQF_CTL_0_PEDSIZE_MASK; 4140 val |= ((u32)settings->pe_cntx_num << I40E_PFQF_CTL_0_PEDSIZE_SHIFT) & 4141 I40E_PFQF_CTL_0_PEDSIZE_MASK; 4142 4143 /* Program required FCoE hash buckets for the PF */ 4144 val &= ~I40E_PFQF_CTL_0_PFFCHSIZE_MASK; 4145 val |= ((u32)settings->fcoe_filt_num << 4146 I40E_PFQF_CTL_0_PFFCHSIZE_SHIFT) & 4147 I40E_PFQF_CTL_0_PFFCHSIZE_MASK; 4148 /* Program required FCoE DDP contexts for the PF */ 4149 val &= ~I40E_PFQF_CTL_0_PFFCDSIZE_MASK; 4150 val |= ((u32)settings->fcoe_cntx_num << 4151 I40E_PFQF_CTL_0_PFFCDSIZE_SHIFT) & 4152 I40E_PFQF_CTL_0_PFFCDSIZE_MASK; 4153 4154 /* Program Hash LUT size for the PF */ 4155 val &= ~I40E_PFQF_CTL_0_HASHLUTSIZE_MASK; 4156 if (settings->hash_lut_size == I40E_HASH_LUT_SIZE_512) 4157 hash_lut_size = 1; 4158 val |= (hash_lut_size << I40E_PFQF_CTL_0_HASHLUTSIZE_SHIFT) & 4159 I40E_PFQF_CTL_0_HASHLUTSIZE_MASK; 4160 4161 /* Enable FDIR, Ethertype and MACVLAN filters for PF and VFs */ 4162 if (settings->enable_fdir) 4163 val |= I40E_PFQF_CTL_0_FD_ENA_MASK; 4164 if (settings->enable_ethtype) 4165 val |= I40E_PFQF_CTL_0_ETYPE_ENA_MASK; 4166 if (settings->enable_macvlan) 4167 val |= I40E_PFQF_CTL_0_MACVLAN_ENA_MASK; 4168 4169 wr32(hw, I40E_PFQF_CTL_0, val); 4170 4171 return I40E_SUCCESS; 4172 } 4173 4174 /** 4175 * i40e_aq_add_rem_control_packet_filter - Add or Remove Control Packet Filter 4176 * @hw: pointer to the hw struct 4177 * @mac_addr: MAC address to use in the filter 4178 * @ethtype: Ethertype to use in the filter 4179 * @flags: Flags that needs to be applied to the filter 4180 * @vsi_seid: seid of the control VSI 4181 * @queue: VSI queue number to send the packet to 4182 * @is_add: Add control packet filter if True else remove 4183 * @stats: Structure to hold information on control filter counts 4184 * @cmd_details: pointer to command details structure or NULL 4185 * 4186 * This command will Add or Remove control packet filter for a control VSI. 4187 * In return it will update the total number of perfect filter count in 4188 * the stats member. 4189 **/ 4190 enum i40e_status_code i40e_aq_add_rem_control_packet_filter(struct i40e_hw *hw, 4191 u8 *mac_addr, u16 ethtype, u16 flags, 4192 u16 vsi_seid, u16 queue, bool is_add, 4193 struct i40e_control_filter_stats *stats, 4194 struct i40e_asq_cmd_details *cmd_details) 4195 { 4196 struct i40e_aq_desc desc; 4197 struct i40e_aqc_add_remove_control_packet_filter *cmd = 4198 (struct i40e_aqc_add_remove_control_packet_filter *) 4199 &desc.params.raw; 4200 struct i40e_aqc_add_remove_control_packet_filter_completion *resp = 4201 (struct i40e_aqc_add_remove_control_packet_filter_completion *) 4202 &desc.params.raw; 4203 enum i40e_status_code status; 4204 4205 if (vsi_seid == 0) 4206 return I40E_ERR_PARAM; 4207 4208 if (is_add) { 4209 i40e_fill_default_direct_cmd_desc(&desc, 4210 i40e_aqc_opc_add_control_packet_filter); 4211 cmd->queue = CPU_TO_LE16(queue); 4212 } else { 4213 i40e_fill_default_direct_cmd_desc(&desc, 4214 i40e_aqc_opc_remove_control_packet_filter); 4215 } 4216 4217 if (mac_addr) 4218 i40e_memcpy(cmd->mac, mac_addr, I40E_ETH_LENGTH_OF_ADDRESS, 4219 I40E_NONDMA_TO_NONDMA); 4220 4221 cmd->etype = CPU_TO_LE16(ethtype); 4222 cmd->flags = CPU_TO_LE16(flags); 4223 cmd->seid = CPU_TO_LE16(vsi_seid); 4224 4225 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details); 4226 4227 if (!status && stats) { 4228 stats->mac_etype_used = LE16_TO_CPU(resp->mac_etype_used); 4229 stats->etype_used = LE16_TO_CPU(resp->etype_used); 4230 stats->mac_etype_free = LE16_TO_CPU(resp->mac_etype_free); 4231 stats->etype_free = LE16_TO_CPU(resp->etype_free); 4232 } 4233 4234 return status; 4235 } 4236 4237 /** 4238 * i40e_aq_add_cloud_filters 4239 * @hw: pointer to the hardware structure 4240 * @seid: VSI seid to add cloud filters from 4241 * @filters: Buffer which contains the filters to be added 4242 * @filter_count: number of filters contained in the buffer 4243 * 4244 * Set the cloud filters for a given VSI. The contents of the 4245 * i40e_aqc_add_remove_cloud_filters_element_data are filled 4246 * in by the caller of the function. 4247 * 4248 **/ 4249 enum i40e_status_code i40e_aq_add_cloud_filters(struct i40e_hw *hw, 4250 u16 seid, 4251 struct i40e_aqc_add_remove_cloud_filters_element_data *filters, 4252 u8 filter_count) 4253 { 4254 struct i40e_aq_desc desc; 4255 struct i40e_aqc_add_remove_cloud_filters *cmd = 4256 (struct i40e_aqc_add_remove_cloud_filters *)&desc.params.raw; 4257 u16 buff_len; 4258 enum i40e_status_code status; 4259 4260 i40e_fill_default_direct_cmd_desc(&desc, 4261 i40e_aqc_opc_add_cloud_filters); 4262 4263 buff_len = sizeof(struct i40e_aqc_add_remove_cloud_filters_element_data) * 4264 filter_count; 4265 desc.datalen = CPU_TO_LE16(buff_len); 4266 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD)); 4267 cmd->num_filters = filter_count; 4268 cmd->seid = CPU_TO_LE16(seid); 4269 4270 status = i40e_asq_send_command(hw, &desc, filters, buff_len, NULL); 4271 4272 return status; 4273 } 4274 4275 /** 4276 * i40e_aq_remove_cloud_filters 4277 * @hw: pointer to the hardware structure 4278 * @seid: VSI seid to remove cloud filters from 4279 * @filters: Buffer which contains the filters to be removed 4280 * @filter_count: number of filters contained in the buffer 4281 * 4282 * Remove the cloud filters for a given VSI. The contents of the 4283 * i40e_aqc_add_remove_cloud_filters_element_data are filled 4284 * in by the caller of the function. 4285 * 4286 **/ 4287 enum i40e_status_code i40e_aq_remove_cloud_filters(struct i40e_hw *hw, 4288 u16 seid, 4289 struct i40e_aqc_add_remove_cloud_filters_element_data *filters, 4290 u8 filter_count) 4291 { 4292 struct i40e_aq_desc desc; 4293 struct i40e_aqc_add_remove_cloud_filters *cmd = 4294 (struct i40e_aqc_add_remove_cloud_filters *)&desc.params.raw; 4295 enum i40e_status_code status; 4296 u16 buff_len; 4297 4298 i40e_fill_default_direct_cmd_desc(&desc, 4299 i40e_aqc_opc_remove_cloud_filters); 4300 4301 buff_len = sizeof(struct i40e_aqc_add_remove_cloud_filters_element_data) * 4302 filter_count; 4303 desc.datalen = CPU_TO_LE16(buff_len); 4304 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF | I40E_AQ_FLAG_RD)); 4305 cmd->num_filters = filter_count; 4306 cmd->seid = CPU_TO_LE16(seid); 4307 4308 status = i40e_asq_send_command(hw, &desc, filters, buff_len, NULL); 4309 4310 return status; 4311 } 4312 4313 /** 4314 * i40e_aq_alternate_write 4315 * @hw: pointer to the hardware structure 4316 * @reg_addr0: address of first dword to be read 4317 * @reg_val0: value to be written under 'reg_addr0' 4318 * @reg_addr1: address of second dword to be read 4319 * @reg_val1: value to be written under 'reg_addr1' 4320 * 4321 * Write one or two dwords to alternate structure. Fields are indicated 4322 * by 'reg_addr0' and 'reg_addr1' register numbers. 4323 * 4324 **/ 4325 enum i40e_status_code i40e_aq_alternate_write(struct i40e_hw *hw, 4326 u32 reg_addr0, u32 reg_val0, 4327 u32 reg_addr1, u32 reg_val1) 4328 { 4329 struct i40e_aq_desc desc; 4330 struct i40e_aqc_alternate_write *cmd_resp = 4331 (struct i40e_aqc_alternate_write *)&desc.params.raw; 4332 enum i40e_status_code status; 4333 4334 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_alternate_write); 4335 cmd_resp->address0 = CPU_TO_LE32(reg_addr0); 4336 cmd_resp->address1 = CPU_TO_LE32(reg_addr1); 4337 cmd_resp->data0 = CPU_TO_LE32(reg_val0); 4338 cmd_resp->data1 = CPU_TO_LE32(reg_val1); 4339 4340 status = i40e_asq_send_command(hw, &desc, NULL, 0, NULL); 4341 4342 return status; 4343 } 4344 4345 /** 4346 * i40e_aq_alternate_write_indirect 4347 * @hw: pointer to the hardware structure 4348 * @addr: address of a first register to be modified 4349 * @dw_count: number of alternate structure fields to write 4350 * @buffer: pointer to the command buffer 4351 * 4352 * Write 'dw_count' dwords from 'buffer' to alternate structure 4353 * starting at 'addr'. 4354 * 4355 **/ 4356 enum i40e_status_code i40e_aq_alternate_write_indirect(struct i40e_hw *hw, 4357 u32 addr, u32 dw_count, void *buffer) 4358 { 4359 struct i40e_aq_desc desc; 4360 struct i40e_aqc_alternate_ind_write *cmd_resp = 4361 (struct i40e_aqc_alternate_ind_write *)&desc.params.raw; 4362 enum i40e_status_code status; 4363 4364 if (buffer == NULL) 4365 return I40E_ERR_PARAM; 4366 4367 /* Indirect command */ 4368 i40e_fill_default_direct_cmd_desc(&desc, 4369 i40e_aqc_opc_alternate_write_indirect); 4370 4371 desc.flags |= CPU_TO_LE16(I40E_AQ_FLAG_RD); 4372 desc.flags |= CPU_TO_LE16(I40E_AQ_FLAG_BUF); 4373 if (dw_count > (I40E_AQ_LARGE_BUF/4)) 4374 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB); 4375 4376 cmd_resp->address = CPU_TO_LE32(addr); 4377 cmd_resp->length = CPU_TO_LE32(dw_count); 4378 cmd_resp->addr_high = CPU_TO_LE32(I40E_HI_WORD((u64)buffer)); 4379 cmd_resp->addr_low = CPU_TO_LE32(I40E_LO_DWORD((u64)buffer)); 4380 4381 status = i40e_asq_send_command(hw, &desc, buffer, 4382 I40E_LO_DWORD(4*dw_count), NULL); 4383 4384 return status; 4385 } 4386 4387 /** 4388 * i40e_aq_alternate_read 4389 * @hw: pointer to the hardware structure 4390 * @reg_addr0: address of first dword to be read 4391 * @reg_val0: pointer for data read from 'reg_addr0' 4392 * @reg_addr1: address of second dword to be read 4393 * @reg_val1: pointer for data read from 'reg_addr1' 4394 * 4395 * Read one or two dwords from alternate structure. Fields are indicated 4396 * by 'reg_addr0' and 'reg_addr1' register numbers. If 'reg_val1' pointer 4397 * is not passed then only register at 'reg_addr0' is read. 4398 * 4399 **/ 4400 enum i40e_status_code i40e_aq_alternate_read(struct i40e_hw *hw, 4401 u32 reg_addr0, u32 *reg_val0, 4402 u32 reg_addr1, u32 *reg_val1) 4403 { 4404 struct i40e_aq_desc desc; 4405 struct i40e_aqc_alternate_write *cmd_resp = 4406 (struct i40e_aqc_alternate_write *)&desc.params.raw; 4407 enum i40e_status_code status; 4408 4409 if (reg_val0 == NULL) 4410 return I40E_ERR_PARAM; 4411 4412 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_alternate_read); 4413 cmd_resp->address0 = CPU_TO_LE32(reg_addr0); 4414 cmd_resp->address1 = CPU_TO_LE32(reg_addr1); 4415 4416 status = i40e_asq_send_command(hw, &desc, NULL, 0, NULL); 4417 4418 if (status == I40E_SUCCESS) { 4419 *reg_val0 = LE32_TO_CPU(cmd_resp->data0); 4420 4421 if (reg_val1 != NULL) 4422 *reg_val1 = LE32_TO_CPU(cmd_resp->data1); 4423 } 4424 4425 return status; 4426 } 4427 4428 /** 4429 * i40e_aq_alternate_read_indirect 4430 * @hw: pointer to the hardware structure 4431 * @addr: address of the alternate structure field 4432 * @dw_count: number of alternate structure fields to read 4433 * @buffer: pointer to the command buffer 4434 * 4435 * Read 'dw_count' dwords from alternate structure starting at 'addr' and 4436 * place them in 'buffer'. The buffer should be allocated by caller. 4437 * 4438 **/ 4439 enum i40e_status_code i40e_aq_alternate_read_indirect(struct i40e_hw *hw, 4440 u32 addr, u32 dw_count, void *buffer) 4441 { 4442 struct i40e_aq_desc desc; 4443 struct i40e_aqc_alternate_ind_write *cmd_resp = 4444 (struct i40e_aqc_alternate_ind_write *)&desc.params.raw; 4445 enum i40e_status_code status; 4446 4447 if (buffer == NULL) 4448 return I40E_ERR_PARAM; 4449 4450 /* Indirect command */ 4451 i40e_fill_default_direct_cmd_desc(&desc, 4452 i40e_aqc_opc_alternate_read_indirect); 4453 4454 desc.flags |= CPU_TO_LE16(I40E_AQ_FLAG_RD); 4455 desc.flags |= CPU_TO_LE16(I40E_AQ_FLAG_BUF); 4456 if (dw_count > (I40E_AQ_LARGE_BUF/4)) 4457 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB); 4458 4459 cmd_resp->address = CPU_TO_LE32(addr); 4460 cmd_resp->length = CPU_TO_LE32(dw_count); 4461 cmd_resp->addr_high = CPU_TO_LE32(I40E_HI_DWORD((u64)buffer)); 4462 cmd_resp->addr_low = CPU_TO_LE32(I40E_LO_DWORD((u64)buffer)); 4463 4464 status = i40e_asq_send_command(hw, &desc, buffer, 4465 I40E_LO_DWORD(4*dw_count), NULL); 4466 4467 return status; 4468 } 4469 4470 /** 4471 * i40e_aq_alternate_clear 4472 * @hw: pointer to the HW structure. 4473 * 4474 * Clear the alternate structures of the port from which the function 4475 * is called. 4476 * 4477 **/ 4478 enum i40e_status_code i40e_aq_alternate_clear(struct i40e_hw *hw) 4479 { 4480 struct i40e_aq_desc desc; 4481 enum i40e_status_code status; 4482 4483 i40e_fill_default_direct_cmd_desc(&desc, 4484 i40e_aqc_opc_alternate_clear_port); 4485 4486 status = i40e_asq_send_command(hw, &desc, NULL, 0, NULL); 4487 4488 return status; 4489 } 4490 4491 /** 4492 * i40e_aq_alternate_write_done 4493 * @hw: pointer to the HW structure. 4494 * @bios_mode: indicates whether the command is executed by UEFI or legacy BIOS 4495 * @reset_needed: indicates the SW should trigger GLOBAL reset 4496 * 4497 * Indicates to the FW that alternate structures have been changed. 4498 * 4499 **/ 4500 enum i40e_status_code i40e_aq_alternate_write_done(struct i40e_hw *hw, 4501 u8 bios_mode, bool *reset_needed) 4502 { 4503 struct i40e_aq_desc desc; 4504 struct i40e_aqc_alternate_write_done *cmd = 4505 (struct i40e_aqc_alternate_write_done *)&desc.params.raw; 4506 enum i40e_status_code status; 4507 4508 if (reset_needed == NULL) 4509 return I40E_ERR_PARAM; 4510 4511 i40e_fill_default_direct_cmd_desc(&desc, 4512 i40e_aqc_opc_alternate_write_done); 4513 4514 cmd->cmd_flags = CPU_TO_LE16(bios_mode); 4515 4516 status = i40e_asq_send_command(hw, &desc, NULL, 0, NULL); 4517 if (!status) 4518 *reset_needed = ((LE16_TO_CPU(cmd->cmd_flags) & 4519 I40E_AQ_ALTERNATE_RESET_NEEDED) != 0); 4520 4521 return status; 4522 } 4523 4524 /** 4525 * i40e_aq_set_oem_mode 4526 * @hw: pointer to the HW structure. 4527 * @oem_mode: the OEM mode to be used 4528 * 4529 * Sets the device to a specific operating mode. Currently the only supported 4530 * mode is no_clp, which causes FW to refrain from using Alternate RAM. 4531 * 4532 **/ 4533 enum i40e_status_code i40e_aq_set_oem_mode(struct i40e_hw *hw, 4534 u8 oem_mode) 4535 { 4536 struct i40e_aq_desc desc; 4537 struct i40e_aqc_alternate_write_done *cmd = 4538 (struct i40e_aqc_alternate_write_done *)&desc.params.raw; 4539 enum i40e_status_code status; 4540 4541 i40e_fill_default_direct_cmd_desc(&desc, 4542 i40e_aqc_opc_alternate_set_mode); 4543 4544 cmd->cmd_flags = CPU_TO_LE16(oem_mode); 4545 4546 status = i40e_asq_send_command(hw, &desc, NULL, 0, NULL); 4547 4548 return status; 4549 } 4550 4551 /** 4552 * i40e_aq_resume_port_tx 4553 * @hw: pointer to the hardware structure 4554 * @cmd_details: pointer to command details structure or NULL 4555 * 4556 * Resume port's Tx traffic 4557 **/ 4558 enum i40e_status_code i40e_aq_resume_port_tx(struct i40e_hw *hw, 4559 struct i40e_asq_cmd_details *cmd_details) 4560 { 4561 struct i40e_aq_desc desc; 4562 enum i40e_status_code status; 4563 4564 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_resume_port_tx); 4565 4566 status = i40e_asq_send_command(hw, &desc, NULL, 0, cmd_details); 4567 4568 return status; 4569 } 4570 4571 /** 4572 * i40e_set_pci_config_data - store PCI bus info 4573 * @hw: pointer to hardware structure 4574 * @link_status: the link status word from PCI config space 4575 * 4576 * Stores the PCI bus info (speed, width, type) within the i40e_hw structure 4577 **/ 4578 void i40e_set_pci_config_data(struct i40e_hw *hw, u16 link_status) 4579 { 4580 hw->bus.type = i40e_bus_type_pci_express; 4581 4582 switch (link_status & I40E_PCI_LINK_WIDTH) { 4583 case I40E_PCI_LINK_WIDTH_1: 4584 hw->bus.width = i40e_bus_width_pcie_x1; 4585 break; 4586 case I40E_PCI_LINK_WIDTH_2: 4587 hw->bus.width = i40e_bus_width_pcie_x2; 4588 break; 4589 case I40E_PCI_LINK_WIDTH_4: 4590 hw->bus.width = i40e_bus_width_pcie_x4; 4591 break; 4592 case I40E_PCI_LINK_WIDTH_8: 4593 hw->bus.width = i40e_bus_width_pcie_x8; 4594 break; 4595 default: 4596 hw->bus.width = i40e_bus_width_unknown; 4597 break; 4598 } 4599 4600 switch (link_status & I40E_PCI_LINK_SPEED) { 4601 case I40E_PCI_LINK_SPEED_2500: 4602 hw->bus.speed = i40e_bus_speed_2500; 4603 break; 4604 case I40E_PCI_LINK_SPEED_5000: 4605 hw->bus.speed = i40e_bus_speed_5000; 4606 break; 4607 case I40E_PCI_LINK_SPEED_8000: 4608 hw->bus.speed = i40e_bus_speed_8000; 4609 break; 4610 default: 4611 hw->bus.speed = i40e_bus_speed_unknown; 4612 break; 4613 } 4614 } 4615 4616 /** 4617 * i40e_read_bw_from_alt_ram 4618 * @hw: pointer to the hardware structure 4619 * @max_bw: pointer for max_bw read 4620 * @min_bw: pointer for min_bw read 4621 * @min_valid: pointer for bool that is TRUE if min_bw is a valid value 4622 * @max_valid: pointer for bool that is TRUE if max_bw is a valid value 4623 * 4624 * Read bw from the alternate ram for the given pf 4625 **/ 4626 enum i40e_status_code i40e_read_bw_from_alt_ram(struct i40e_hw *hw, 4627 u32 *max_bw, u32 *min_bw, 4628 bool *min_valid, bool *max_valid) 4629 { 4630 enum i40e_status_code status; 4631 u32 max_bw_addr, min_bw_addr; 4632 4633 /* Calculate the address of the min/max bw registers */ 4634 max_bw_addr = I40E_ALT_STRUCT_FIRST_PF_OFFSET + 4635 I40E_ALT_STRUCT_MAX_BW_OFFSET + 4636 (I40E_ALT_STRUCT_DWORDS_PER_PF*hw->pf_id); 4637 min_bw_addr = I40E_ALT_STRUCT_FIRST_PF_OFFSET + 4638 I40E_ALT_STRUCT_MIN_BW_OFFSET + 4639 (I40E_ALT_STRUCT_DWORDS_PER_PF*hw->pf_id); 4640 4641 /* Read the bandwidths from alt ram */ 4642 status = i40e_aq_alternate_read(hw, max_bw_addr, max_bw, 4643 min_bw_addr, min_bw); 4644 4645 if (*min_bw & I40E_ALT_BW_VALID_MASK) 4646 *min_valid = TRUE; 4647 else 4648 *min_valid = FALSE; 4649 4650 if (*max_bw & I40E_ALT_BW_VALID_MASK) 4651 *max_valid = TRUE; 4652 else 4653 *max_valid = FALSE; 4654 4655 return status; 4656 } 4657 4658 /** 4659 * i40e_aq_configure_partition_bw 4660 * @hw: pointer to the hardware structure 4661 * @bw_data: Buffer holding valid pfs and bw limits 4662 * @cmd_details: pointer to command details 4663 * 4664 * Configure partitions guaranteed/max bw 4665 **/ 4666 enum i40e_status_code i40e_aq_configure_partition_bw(struct i40e_hw *hw, 4667 struct i40e_aqc_configure_partition_bw_data *bw_data, 4668 struct i40e_asq_cmd_details *cmd_details) 4669 { 4670 enum i40e_status_code status; 4671 struct i40e_aq_desc desc; 4672 u16 bwd_size = sizeof(struct i40e_aqc_configure_partition_bw_data); 4673 4674 i40e_fill_default_direct_cmd_desc(&desc, 4675 i40e_aqc_opc_configure_partition_bw); 4676 4677 /* Indirect command */ 4678 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_BUF); 4679 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_RD); 4680 4681 if (bwd_size > I40E_AQ_LARGE_BUF) 4682 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB); 4683 4684 desc.datalen = CPU_TO_LE16(bwd_size); 4685 4686 status = i40e_asq_send_command(hw, &desc, bw_data, bwd_size, cmd_details); 4687 4688 return status; 4689 } 4690 4691 /** 4692 * i40e_aq_send_msg_to_pf 4693 * @hw: pointer to the hardware structure 4694 * @v_opcode: opcodes for VF-PF communication 4695 * @v_retval: return error code 4696 * @msg: pointer to the msg buffer 4697 * @msglen: msg length 4698 * @cmd_details: pointer to command details 4699 * 4700 * Send message to PF driver using admin queue. By default, this message 4701 * is sent asynchronously, i.e. i40e_asq_send_command() does not wait for 4702 * completion before returning. 4703 **/ 4704 enum i40e_status_code i40e_aq_send_msg_to_pf(struct i40e_hw *hw, 4705 enum i40e_virtchnl_ops v_opcode, 4706 enum i40e_status_code v_retval, 4707 u8 *msg, u16 msglen, 4708 struct i40e_asq_cmd_details *cmd_details) 4709 { 4710 struct i40e_aq_desc desc; 4711 struct i40e_asq_cmd_details details; 4712 enum i40e_status_code status; 4713 4714 i40e_fill_default_direct_cmd_desc(&desc, i40e_aqc_opc_send_msg_to_pf); 4715 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_SI); 4716 desc.cookie_high = CPU_TO_LE32(v_opcode); 4717 desc.cookie_low = CPU_TO_LE32(v_retval); 4718 if (msglen) { 4719 desc.flags |= CPU_TO_LE16((u16)(I40E_AQ_FLAG_BUF 4720 | I40E_AQ_FLAG_RD)); 4721 if (msglen > I40E_AQ_LARGE_BUF) 4722 desc.flags |= CPU_TO_LE16((u16)I40E_AQ_FLAG_LB); 4723 desc.datalen = CPU_TO_LE16(msglen); 4724 } 4725 if (!cmd_details) { 4726 i40e_memset(&details, 0, sizeof(details), I40E_NONDMA_MEM); 4727 details.async = TRUE; 4728 cmd_details = &details; 4729 } 4730 status = i40e_asq_send_command(hw, (struct i40e_aq_desc *)&desc, msg, 4731 msglen, cmd_details); 4732 return status; 4733 } 4734 4735 /** 4736 * i40e_vf_parse_hw_config 4737 * @hw: pointer to the hardware structure 4738 * @msg: pointer to the virtual channel VF resource structure 4739 * 4740 * Given a VF resource message from the PF, populate the hw struct 4741 * with appropriate information. 4742 **/ 4743 void i40e_vf_parse_hw_config(struct i40e_hw *hw, 4744 struct i40e_virtchnl_vf_resource *msg) 4745 { 4746 struct i40e_virtchnl_vsi_resource *vsi_res; 4747 int i; 4748 4749 vsi_res = &msg->vsi_res[0]; 4750 4751 hw->dev_caps.num_vsis = msg->num_vsis; 4752 hw->dev_caps.num_rx_qp = msg->num_queue_pairs; 4753 hw->dev_caps.num_tx_qp = msg->num_queue_pairs; 4754 hw->dev_caps.num_msix_vectors_vf = msg->max_vectors; 4755 hw->dev_caps.dcb = msg->vf_offload_flags & 4756 I40E_VIRTCHNL_VF_OFFLOAD_L2; 4757 hw->dev_caps.fcoe = (msg->vf_offload_flags & 4758 I40E_VIRTCHNL_VF_OFFLOAD_FCOE) ? 1 : 0; 4759 hw->dev_caps.iwarp = (msg->vf_offload_flags & 4760 I40E_VIRTCHNL_VF_OFFLOAD_IWARP) ? 1 : 0; 4761 for (i = 0; i < msg->num_vsis; i++) { 4762 if (vsi_res->vsi_type == I40E_VSI_SRIOV) { 4763 i40e_memcpy(hw->mac.perm_addr, 4764 vsi_res->default_mac_addr, 4765 I40E_ETH_LENGTH_OF_ADDRESS, 4766 I40E_NONDMA_TO_NONDMA); 4767 i40e_memcpy(hw->mac.addr, vsi_res->default_mac_addr, 4768 I40E_ETH_LENGTH_OF_ADDRESS, 4769 I40E_NONDMA_TO_NONDMA); 4770 } 4771 vsi_res++; 4772 } 4773 } 4774 4775 /** 4776 * i40e_vf_reset 4777 * @hw: pointer to the hardware structure 4778 * 4779 * Send a VF_RESET message to the PF. Does not wait for response from PF 4780 * as none will be forthcoming. Immediately after calling this function, 4781 * the admin queue should be shut down and (optionally) reinitialized. 4782 **/ 4783 enum i40e_status_code i40e_vf_reset(struct i40e_hw *hw) 4784 { 4785 return i40e_aq_send_msg_to_pf(hw, I40E_VIRTCHNL_OP_RESET_VF, 4786 I40E_SUCCESS, NULL, 0, NULL); 4787 } 4788