1 /****************************************************************************** 2 3 Copyright (c) 2001-2020, 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 "ixgbe_x550.h" 36 #include "ixgbe_x540.h" 37 #include "ixgbe_type.h" 38 #include "ixgbe_api.h" 39 #include "ixgbe_common.h" 40 #include "ixgbe_phy.h" 41 42 static s32 ixgbe_setup_ixfi_x550em(struct ixgbe_hw *hw, ixgbe_link_speed *speed); 43 static s32 ixgbe_acquire_swfw_sync_X550a(struct ixgbe_hw *, u32 mask); 44 static void ixgbe_release_swfw_sync_X550a(struct ixgbe_hw *, u32 mask); 45 static s32 ixgbe_read_mng_if_sel_x550em(struct ixgbe_hw *hw); 46 47 /** 48 * ixgbe_init_ops_X550 - Inits func ptrs and MAC type 49 * @hw: pointer to hardware structure 50 * 51 * Initialize the function pointers and assign the MAC type for X550. 52 * Does not touch the hardware. 53 **/ 54 s32 ixgbe_init_ops_X550(struct ixgbe_hw *hw) 55 { 56 struct ixgbe_mac_info *mac = &hw->mac; 57 struct ixgbe_eeprom_info *eeprom = &hw->eeprom; 58 s32 ret_val; 59 60 DEBUGFUNC("ixgbe_init_ops_X550"); 61 62 ret_val = ixgbe_init_ops_X540(hw); 63 mac->ops.dmac_config = ixgbe_dmac_config_X550; 64 mac->ops.dmac_config_tcs = ixgbe_dmac_config_tcs_X550; 65 mac->ops.dmac_update_tcs = ixgbe_dmac_update_tcs_X550; 66 mac->ops.setup_eee = NULL; 67 mac->ops.set_source_address_pruning = 68 ixgbe_set_source_address_pruning_X550; 69 mac->ops.set_ethertype_anti_spoofing = 70 ixgbe_set_ethertype_anti_spoofing_X550; 71 72 mac->ops.get_rtrup2tc = ixgbe_dcb_get_rtrup2tc_generic; 73 eeprom->ops.init_params = ixgbe_init_eeprom_params_X550; 74 eeprom->ops.calc_checksum = ixgbe_calc_eeprom_checksum_X550; 75 eeprom->ops.read = ixgbe_read_ee_hostif_X550; 76 eeprom->ops.read_buffer = ixgbe_read_ee_hostif_buffer_X550; 77 eeprom->ops.write = ixgbe_write_ee_hostif_X550; 78 eeprom->ops.write_buffer = ixgbe_write_ee_hostif_buffer_X550; 79 eeprom->ops.update_checksum = ixgbe_update_eeprom_checksum_X550; 80 eeprom->ops.validate_checksum = ixgbe_validate_eeprom_checksum_X550; 81 82 mac->ops.disable_mdd = ixgbe_disable_mdd_X550; 83 mac->ops.enable_mdd = ixgbe_enable_mdd_X550; 84 mac->ops.mdd_event = ixgbe_mdd_event_X550; 85 mac->ops.restore_mdd_vf = ixgbe_restore_mdd_vf_X550; 86 mac->ops.fw_recovery_mode = ixgbe_fw_recovery_mode_X550; 87 mac->ops.disable_rx = ixgbe_disable_rx_x550; 88 /* Manageability interface */ 89 mac->ops.set_fw_drv_ver = ixgbe_set_fw_drv_ver_x550; 90 switch (hw->device_id) { 91 case IXGBE_DEV_ID_X550EM_X_1G_T: 92 hw->mac.ops.led_on = NULL; 93 hw->mac.ops.led_off = NULL; 94 break; 95 case IXGBE_DEV_ID_X550EM_X_10G_T: 96 case IXGBE_DEV_ID_X550EM_A_10G_T: 97 hw->mac.ops.led_on = ixgbe_led_on_t_X550em; 98 hw->mac.ops.led_off = ixgbe_led_off_t_X550em; 99 break; 100 default: 101 break; 102 } 103 return ret_val; 104 } 105 106 /** 107 * ixgbe_read_cs4227 - Read CS4227 register 108 * @hw: pointer to hardware structure 109 * @reg: register number to write 110 * @value: pointer to receive value read 111 * 112 * Returns status code 113 **/ 114 static s32 ixgbe_read_cs4227(struct ixgbe_hw *hw, u16 reg, u16 *value) 115 { 116 return hw->link.ops.read_link_unlocked(hw, hw->link.addr, reg, value); 117 } 118 119 /** 120 * ixgbe_write_cs4227 - Write CS4227 register 121 * @hw: pointer to hardware structure 122 * @reg: register number to write 123 * @value: value to write to register 124 * 125 * Returns status code 126 **/ 127 static s32 ixgbe_write_cs4227(struct ixgbe_hw *hw, u16 reg, u16 value) 128 { 129 return hw->link.ops.write_link_unlocked(hw, hw->link.addr, reg, value); 130 } 131 132 /** 133 * ixgbe_read_pe - Read register from port expander 134 * @hw: pointer to hardware structure 135 * @reg: register number to read 136 * @value: pointer to receive read value 137 * 138 * Returns status code 139 **/ 140 static s32 ixgbe_read_pe(struct ixgbe_hw *hw, u8 reg, u8 *value) 141 { 142 s32 status; 143 144 status = ixgbe_read_i2c_byte_unlocked(hw, reg, IXGBE_PE, value); 145 if (status != IXGBE_SUCCESS) 146 ERROR_REPORT2(IXGBE_ERROR_CAUTION, 147 "port expander access failed with %d\n", status); 148 return status; 149 } 150 151 /** 152 * ixgbe_write_pe - Write register to port expander 153 * @hw: pointer to hardware structure 154 * @reg: register number to write 155 * @value: value to write 156 * 157 * Returns status code 158 **/ 159 static s32 ixgbe_write_pe(struct ixgbe_hw *hw, u8 reg, u8 value) 160 { 161 s32 status; 162 163 status = ixgbe_write_i2c_byte_unlocked(hw, reg, IXGBE_PE, value); 164 if (status != IXGBE_SUCCESS) 165 ERROR_REPORT2(IXGBE_ERROR_CAUTION, 166 "port expander access failed with %d\n", status); 167 return status; 168 } 169 170 /** 171 * ixgbe_reset_cs4227 - Reset CS4227 using port expander 172 * @hw: pointer to hardware structure 173 * 174 * This function assumes that the caller has acquired the proper semaphore. 175 * Returns error code 176 **/ 177 static s32 ixgbe_reset_cs4227(struct ixgbe_hw *hw) 178 { 179 s32 status; 180 u32 retry; 181 u16 value; 182 u8 reg; 183 184 /* Trigger hard reset. */ 185 status = ixgbe_read_pe(hw, IXGBE_PE_OUTPUT, ®); 186 if (status != IXGBE_SUCCESS) 187 return status; 188 reg |= IXGBE_PE_BIT1; 189 status = ixgbe_write_pe(hw, IXGBE_PE_OUTPUT, reg); 190 if (status != IXGBE_SUCCESS) 191 return status; 192 193 status = ixgbe_read_pe(hw, IXGBE_PE_CONFIG, ®); 194 if (status != IXGBE_SUCCESS) 195 return status; 196 reg &= ~IXGBE_PE_BIT1; 197 status = ixgbe_write_pe(hw, IXGBE_PE_CONFIG, reg); 198 if (status != IXGBE_SUCCESS) 199 return status; 200 201 status = ixgbe_read_pe(hw, IXGBE_PE_OUTPUT, ®); 202 if (status != IXGBE_SUCCESS) 203 return status; 204 reg &= ~IXGBE_PE_BIT1; 205 status = ixgbe_write_pe(hw, IXGBE_PE_OUTPUT, reg); 206 if (status != IXGBE_SUCCESS) 207 return status; 208 209 usec_delay(IXGBE_CS4227_RESET_HOLD); 210 211 status = ixgbe_read_pe(hw, IXGBE_PE_OUTPUT, ®); 212 if (status != IXGBE_SUCCESS) 213 return status; 214 reg |= IXGBE_PE_BIT1; 215 status = ixgbe_write_pe(hw, IXGBE_PE_OUTPUT, reg); 216 if (status != IXGBE_SUCCESS) 217 return status; 218 219 /* Wait for the reset to complete. */ 220 msec_delay(IXGBE_CS4227_RESET_DELAY); 221 for (retry = 0; retry < IXGBE_CS4227_RETRIES; retry++) { 222 status = ixgbe_read_cs4227(hw, IXGBE_CS4227_EFUSE_STATUS, 223 &value); 224 if (status == IXGBE_SUCCESS && 225 value == IXGBE_CS4227_EEPROM_LOAD_OK) 226 break; 227 msec_delay(IXGBE_CS4227_CHECK_DELAY); 228 } 229 if (retry == IXGBE_CS4227_RETRIES) { 230 ERROR_REPORT1(IXGBE_ERROR_INVALID_STATE, 231 "CS4227 reset did not complete."); 232 return IXGBE_ERR_PHY; 233 } 234 235 status = ixgbe_read_cs4227(hw, IXGBE_CS4227_EEPROM_STATUS, &value); 236 if (status != IXGBE_SUCCESS || 237 !(value & IXGBE_CS4227_EEPROM_LOAD_OK)) { 238 ERROR_REPORT1(IXGBE_ERROR_INVALID_STATE, 239 "CS4227 EEPROM did not load successfully."); 240 return IXGBE_ERR_PHY; 241 } 242 243 return IXGBE_SUCCESS; 244 } 245 246 /** 247 * ixgbe_check_cs4227 - Check CS4227 and reset as needed 248 * @hw: pointer to hardware structure 249 **/ 250 static void ixgbe_check_cs4227(struct ixgbe_hw *hw) 251 { 252 s32 status = IXGBE_SUCCESS; 253 u32 swfw_mask = hw->phy.phy_semaphore_mask; 254 u16 value = 0; 255 u8 retry; 256 257 for (retry = 0; retry < IXGBE_CS4227_RETRIES; retry++) { 258 status = hw->mac.ops.acquire_swfw_sync(hw, swfw_mask); 259 if (status != IXGBE_SUCCESS) { 260 ERROR_REPORT2(IXGBE_ERROR_CAUTION, 261 "semaphore failed with %d", status); 262 msec_delay(IXGBE_CS4227_CHECK_DELAY); 263 continue; 264 } 265 266 /* Get status of reset flow. */ 267 status = ixgbe_read_cs4227(hw, IXGBE_CS4227_SCRATCH, &value); 268 269 if (status == IXGBE_SUCCESS && 270 value == IXGBE_CS4227_RESET_COMPLETE) 271 goto out; 272 273 if (status != IXGBE_SUCCESS || 274 value != IXGBE_CS4227_RESET_PENDING) 275 break; 276 277 /* Reset is pending. Wait and check again. */ 278 hw->mac.ops.release_swfw_sync(hw, swfw_mask); 279 msec_delay(IXGBE_CS4227_CHECK_DELAY); 280 } 281 282 /* If still pending, assume other instance failed. */ 283 if (retry == IXGBE_CS4227_RETRIES) { 284 status = hw->mac.ops.acquire_swfw_sync(hw, swfw_mask); 285 if (status != IXGBE_SUCCESS) { 286 ERROR_REPORT2(IXGBE_ERROR_CAUTION, 287 "semaphore failed with %d", status); 288 return; 289 } 290 } 291 292 /* Reset the CS4227. */ 293 status = ixgbe_reset_cs4227(hw); 294 if (status != IXGBE_SUCCESS) { 295 ERROR_REPORT2(IXGBE_ERROR_INVALID_STATE, 296 "CS4227 reset failed: %d", status); 297 goto out; 298 } 299 300 /* Reset takes so long, temporarily release semaphore in case the 301 * other driver instance is waiting for the reset indication. 302 */ 303 ixgbe_write_cs4227(hw, IXGBE_CS4227_SCRATCH, 304 IXGBE_CS4227_RESET_PENDING); 305 hw->mac.ops.release_swfw_sync(hw, swfw_mask); 306 msec_delay(10); 307 status = hw->mac.ops.acquire_swfw_sync(hw, swfw_mask); 308 if (status != IXGBE_SUCCESS) { 309 ERROR_REPORT2(IXGBE_ERROR_CAUTION, 310 "semaphore failed with %d", status); 311 return; 312 } 313 314 /* Record completion for next time. */ 315 status = ixgbe_write_cs4227(hw, IXGBE_CS4227_SCRATCH, 316 IXGBE_CS4227_RESET_COMPLETE); 317 318 out: 319 hw->mac.ops.release_swfw_sync(hw, swfw_mask); 320 msec_delay(hw->eeprom.semaphore_delay); 321 } 322 323 /** 324 * ixgbe_setup_mux_ctl - Setup ESDP register for I2C mux control 325 * @hw: pointer to hardware structure 326 **/ 327 static void ixgbe_setup_mux_ctl(struct ixgbe_hw *hw) 328 { 329 u32 esdp = IXGBE_READ_REG(hw, IXGBE_ESDP); 330 331 if (hw->bus.lan_id) { 332 esdp &= ~(IXGBE_ESDP_SDP1_NATIVE | IXGBE_ESDP_SDP1); 333 esdp |= IXGBE_ESDP_SDP1_DIR; 334 } 335 esdp &= ~(IXGBE_ESDP_SDP0_NATIVE | IXGBE_ESDP_SDP0_DIR); 336 IXGBE_WRITE_REG(hw, IXGBE_ESDP, esdp); 337 IXGBE_WRITE_FLUSH(hw); 338 } 339 340 /** 341 * ixgbe_identify_phy_x550em - Get PHY type based on device id 342 * @hw: pointer to hardware structure 343 * 344 * Returns error code 345 */ 346 static s32 ixgbe_identify_phy_x550em(struct ixgbe_hw *hw) 347 { 348 hw->mac.ops.set_lan_id(hw); 349 350 ixgbe_read_mng_if_sel_x550em(hw); 351 352 switch (hw->device_id) { 353 case IXGBE_DEV_ID_X550EM_A_SFP: 354 return ixgbe_identify_sfp_module_X550em(hw); 355 case IXGBE_DEV_ID_X550EM_X_SFP: 356 /* set up for CS4227 usage */ 357 ixgbe_setup_mux_ctl(hw); 358 ixgbe_check_cs4227(hw); 359 /* Fallthrough */ 360 361 case IXGBE_DEV_ID_X550EM_A_SFP_N: 362 return ixgbe_identify_sfp_module_X550em(hw); 363 break; 364 case IXGBE_DEV_ID_X550EM_X_KX4: 365 hw->phy.type = ixgbe_phy_x550em_kx4; 366 break; 367 case IXGBE_DEV_ID_X550EM_X_XFI: 368 hw->phy.type = ixgbe_phy_x550em_xfi; 369 break; 370 case IXGBE_DEV_ID_X550EM_X_KR: 371 case IXGBE_DEV_ID_X550EM_A_KR: 372 case IXGBE_DEV_ID_X550EM_A_KR_L: 373 hw->phy.type = ixgbe_phy_x550em_kr; 374 break; 375 case IXGBE_DEV_ID_X550EM_A_10G_T: 376 case IXGBE_DEV_ID_X550EM_X_10G_T: 377 return ixgbe_identify_phy_generic(hw); 378 case IXGBE_DEV_ID_X550EM_X_1G_T: 379 hw->phy.type = ixgbe_phy_ext_1g_t; 380 break; 381 case IXGBE_DEV_ID_X550EM_A_1G_T: 382 case IXGBE_DEV_ID_X550EM_A_1G_T_L: 383 hw->phy.type = ixgbe_phy_fw; 384 if (hw->bus.lan_id) 385 hw->phy.phy_semaphore_mask |= IXGBE_GSSR_PHY1_SM; 386 else 387 hw->phy.phy_semaphore_mask |= IXGBE_GSSR_PHY0_SM; 388 break; 389 default: 390 break; 391 } 392 return IXGBE_SUCCESS; 393 } 394 395 /** 396 * ixgbe_fw_phy_activity - Perform an activity on a PHY 397 * @hw: pointer to hardware structure 398 * @activity: activity to perform 399 * @data: Pointer to 4 32-bit words of data 400 */ 401 s32 ixgbe_fw_phy_activity(struct ixgbe_hw *hw, u16 activity, 402 u32 (*data)[FW_PHY_ACT_DATA_COUNT]) 403 { 404 union { 405 struct ixgbe_hic_phy_activity_req cmd; 406 struct ixgbe_hic_phy_activity_resp rsp; 407 } hic; 408 u16 retries = FW_PHY_ACT_RETRIES; 409 s32 rc; 410 u16 i; 411 412 do { 413 memset(&hic, 0, sizeof(hic)); 414 hic.cmd.hdr.cmd = FW_PHY_ACT_REQ_CMD; 415 hic.cmd.hdr.buf_len = FW_PHY_ACT_REQ_LEN; 416 hic.cmd.hdr.checksum = FW_DEFAULT_CHECKSUM; 417 hic.cmd.port_number = hw->bus.lan_id; 418 hic.cmd.activity_id = IXGBE_CPU_TO_LE16(activity); 419 for (i = 0; i < FW_PHY_ACT_DATA_COUNT; ++i) 420 hic.cmd.data[i] = IXGBE_CPU_TO_BE32((*data)[i]); 421 422 rc = ixgbe_host_interface_command(hw, (u32 *)&hic.cmd, 423 sizeof(hic.cmd), 424 IXGBE_HI_COMMAND_TIMEOUT, 425 true); 426 if (rc != IXGBE_SUCCESS) 427 return rc; 428 if (hic.rsp.hdr.cmd_or_resp.ret_status == 429 FW_CEM_RESP_STATUS_SUCCESS) { 430 for (i = 0; i < FW_PHY_ACT_DATA_COUNT; ++i) 431 (*data)[i] = IXGBE_BE32_TO_CPU(hic.rsp.data[i]); 432 return IXGBE_SUCCESS; 433 } 434 usec_delay(20); 435 --retries; 436 } while (retries > 0); 437 438 return IXGBE_ERR_HOST_INTERFACE_COMMAND; 439 } 440 441 static const struct { 442 u16 fw_speed; 443 ixgbe_link_speed phy_speed; 444 } ixgbe_fw_map[] = { 445 { FW_PHY_ACT_LINK_SPEED_10, IXGBE_LINK_SPEED_10_FULL }, 446 { FW_PHY_ACT_LINK_SPEED_100, IXGBE_LINK_SPEED_100_FULL }, 447 { FW_PHY_ACT_LINK_SPEED_1G, IXGBE_LINK_SPEED_1GB_FULL }, 448 { FW_PHY_ACT_LINK_SPEED_2_5G, IXGBE_LINK_SPEED_2_5GB_FULL }, 449 { FW_PHY_ACT_LINK_SPEED_5G, IXGBE_LINK_SPEED_5GB_FULL }, 450 { FW_PHY_ACT_LINK_SPEED_10G, IXGBE_LINK_SPEED_10GB_FULL }, 451 }; 452 453 /** 454 * ixgbe_get_phy_id_fw - Get the phy ID via firmware command 455 * @hw: pointer to hardware structure 456 * 457 * Returns error code 458 */ 459 static s32 ixgbe_get_phy_id_fw(struct ixgbe_hw *hw) 460 { 461 u32 info[FW_PHY_ACT_DATA_COUNT] = { 0 }; 462 u16 phy_speeds; 463 u16 phy_id_lo; 464 s32 rc; 465 u16 i; 466 467 rc = ixgbe_fw_phy_activity(hw, FW_PHY_ACT_GET_PHY_INFO, &info); 468 if (rc) 469 return rc; 470 471 hw->phy.speeds_supported = 0; 472 phy_speeds = info[0] & FW_PHY_INFO_SPEED_MASK; 473 for (i = 0; i < sizeof(ixgbe_fw_map) / sizeof(ixgbe_fw_map[0]); ++i) { 474 if (phy_speeds & ixgbe_fw_map[i].fw_speed) 475 hw->phy.speeds_supported |= ixgbe_fw_map[i].phy_speed; 476 } 477 if (!hw->phy.autoneg_advertised) 478 hw->phy.autoneg_advertised = hw->phy.speeds_supported; 479 480 hw->phy.id = info[0] & FW_PHY_INFO_ID_HI_MASK; 481 phy_id_lo = info[1] & FW_PHY_INFO_ID_LO_MASK; 482 hw->phy.id |= phy_id_lo & IXGBE_PHY_REVISION_MASK; 483 hw->phy.revision = phy_id_lo & ~IXGBE_PHY_REVISION_MASK; 484 if (!hw->phy.id || hw->phy.id == IXGBE_PHY_REVISION_MASK) 485 return IXGBE_ERR_PHY_ADDR_INVALID; 486 return IXGBE_SUCCESS; 487 } 488 489 /** 490 * ixgbe_identify_phy_fw - Get PHY type based on firmware command 491 * @hw: pointer to hardware structure 492 * 493 * Returns error code 494 */ 495 static s32 ixgbe_identify_phy_fw(struct ixgbe_hw *hw) 496 { 497 if (hw->bus.lan_id) 498 hw->phy.phy_semaphore_mask = IXGBE_GSSR_PHY1_SM; 499 else 500 hw->phy.phy_semaphore_mask = IXGBE_GSSR_PHY0_SM; 501 502 hw->phy.type = ixgbe_phy_fw; 503 hw->phy.ops.read_reg = NULL; 504 hw->phy.ops.write_reg = NULL; 505 return ixgbe_get_phy_id_fw(hw); 506 } 507 508 /** 509 * ixgbe_shutdown_fw_phy - Shutdown a firmware-controlled PHY 510 * @hw: pointer to hardware structure 511 * 512 * Returns error code 513 */ 514 s32 ixgbe_shutdown_fw_phy(struct ixgbe_hw *hw) 515 { 516 u32 setup[FW_PHY_ACT_DATA_COUNT] = { 0 }; 517 518 setup[0] = FW_PHY_ACT_FORCE_LINK_DOWN_OFF; 519 return ixgbe_fw_phy_activity(hw, FW_PHY_ACT_FORCE_LINK_DOWN, &setup); 520 } 521 522 static s32 ixgbe_read_phy_reg_x550em(struct ixgbe_hw *hw, u32 reg_addr, 523 u32 device_type, u16 *phy_data) 524 { 525 UNREFERENCED_4PARAMETER(*hw, reg_addr, device_type, *phy_data); 526 return IXGBE_NOT_IMPLEMENTED; 527 } 528 529 static s32 ixgbe_write_phy_reg_x550em(struct ixgbe_hw *hw, u32 reg_addr, 530 u32 device_type, u16 phy_data) 531 { 532 UNREFERENCED_4PARAMETER(*hw, reg_addr, device_type, phy_data); 533 return IXGBE_NOT_IMPLEMENTED; 534 } 535 536 /** 537 * ixgbe_read_i2c_combined_generic - Perform I2C read combined operation 538 * @hw: pointer to the hardware structure 539 * @addr: I2C bus address to read from 540 * @reg: I2C device register to read from 541 * @val: pointer to location to receive read value 542 * 543 * Returns an error code on error. 544 **/ 545 static s32 ixgbe_read_i2c_combined_generic(struct ixgbe_hw *hw, u8 addr, 546 u16 reg, u16 *val) 547 { 548 return ixgbe_read_i2c_combined_generic_int(hw, addr, reg, val, true); 549 } 550 551 /** 552 * ixgbe_read_i2c_combined_generic_unlocked - Do I2C read combined operation 553 * @hw: pointer to the hardware structure 554 * @addr: I2C bus address to read from 555 * @reg: I2C device register to read from 556 * @val: pointer to location to receive read value 557 * 558 * Returns an error code on error. 559 **/ 560 static s32 561 ixgbe_read_i2c_combined_generic_unlocked(struct ixgbe_hw *hw, u8 addr, 562 u16 reg, u16 *val) 563 { 564 return ixgbe_read_i2c_combined_generic_int(hw, addr, reg, val, false); 565 } 566 567 /** 568 * ixgbe_write_i2c_combined_generic - Perform I2C write combined operation 569 * @hw: pointer to the hardware structure 570 * @addr: I2C bus address to write to 571 * @reg: I2C device register to write to 572 * @val: value to write 573 * 574 * Returns an error code on error. 575 **/ 576 static s32 ixgbe_write_i2c_combined_generic(struct ixgbe_hw *hw, 577 u8 addr, u16 reg, u16 val) 578 { 579 return ixgbe_write_i2c_combined_generic_int(hw, addr, reg, val, true); 580 } 581 582 /** 583 * ixgbe_write_i2c_combined_generic_unlocked - Do I2C write combined operation 584 * @hw: pointer to the hardware structure 585 * @addr: I2C bus address to write to 586 * @reg: I2C device register to write to 587 * @val: value to write 588 * 589 * Returns an error code on error. 590 **/ 591 static s32 592 ixgbe_write_i2c_combined_generic_unlocked(struct ixgbe_hw *hw, 593 u8 addr, u16 reg, u16 val) 594 { 595 return ixgbe_write_i2c_combined_generic_int(hw, addr, reg, val, false); 596 } 597 598 /** 599 * ixgbe_init_ops_X550EM - Inits func ptrs and MAC type 600 * @hw: pointer to hardware structure 601 * 602 * Initialize the function pointers and for MAC type X550EM. 603 * Does not touch the hardware. 604 **/ 605 s32 ixgbe_init_ops_X550EM(struct ixgbe_hw *hw) 606 { 607 struct ixgbe_mac_info *mac = &hw->mac; 608 struct ixgbe_eeprom_info *eeprom = &hw->eeprom; 609 struct ixgbe_phy_info *phy = &hw->phy; 610 s32 ret_val; 611 612 DEBUGFUNC("ixgbe_init_ops_X550EM"); 613 614 /* Similar to X550 so start there. */ 615 ret_val = ixgbe_init_ops_X550(hw); 616 617 /* Since this function eventually calls 618 * ixgbe_init_ops_540 by design, we are setting 619 * the pointers to NULL explicitly here to overwrite 620 * the values being set in the x540 function. 621 */ 622 /* Thermal sensor not supported in x550EM */ 623 mac->ops.get_thermal_sensor_data = NULL; 624 mac->ops.init_thermal_sensor_thresh = NULL; 625 mac->thermal_sensor_enabled = false; 626 627 /* Bypass not supported in x550EM */ 628 mac->ops.bypass_rw = NULL; 629 mac->ops.bypass_valid_rd = NULL; 630 mac->ops.bypass_set = NULL; 631 mac->ops.bypass_rd_eep = NULL; 632 633 /* FCOE not supported in x550EM */ 634 mac->ops.get_san_mac_addr = NULL; 635 mac->ops.set_san_mac_addr = NULL; 636 mac->ops.get_wwn_prefix = NULL; 637 mac->ops.get_fcoe_boot_status = NULL; 638 639 /* IPsec not supported in x550EM */ 640 mac->ops.disable_sec_rx_path = NULL; 641 mac->ops.enable_sec_rx_path = NULL; 642 643 /* AUTOC register is not present in x550EM. */ 644 mac->ops.prot_autoc_read = NULL; 645 mac->ops.prot_autoc_write = NULL; 646 647 /* X550EM bus type is internal*/ 648 hw->bus.type = ixgbe_bus_type_internal; 649 mac->ops.get_bus_info = ixgbe_get_bus_info_X550em; 650 651 652 mac->ops.get_media_type = ixgbe_get_media_type_X550em; 653 mac->ops.setup_sfp = ixgbe_setup_sfp_modules_X550em; 654 mac->ops.get_link_capabilities = ixgbe_get_link_capabilities_X550em; 655 mac->ops.reset_hw = ixgbe_reset_hw_X550em; 656 mac->ops.get_supported_physical_layer = 657 ixgbe_get_supported_physical_layer_X550em; 658 659 if (mac->ops.get_media_type(hw) == ixgbe_media_type_copper) 660 mac->ops.setup_fc = ixgbe_setup_fc_generic; 661 else 662 mac->ops.setup_fc = ixgbe_setup_fc_X550em; 663 664 /* PHY */ 665 phy->ops.init = ixgbe_init_phy_ops_X550em; 666 switch (hw->device_id) { 667 case IXGBE_DEV_ID_X550EM_A_1G_T: 668 case IXGBE_DEV_ID_X550EM_A_1G_T_L: 669 mac->ops.setup_fc = NULL; 670 phy->ops.identify = ixgbe_identify_phy_fw; 671 phy->ops.set_phy_power = NULL; 672 phy->ops.get_firmware_version = NULL; 673 break; 674 case IXGBE_DEV_ID_X550EM_X_1G_T: 675 mac->ops.setup_fc = NULL; 676 phy->ops.identify = ixgbe_identify_phy_x550em; 677 phy->ops.set_phy_power = NULL; 678 break; 679 default: 680 phy->ops.identify = ixgbe_identify_phy_x550em; 681 } 682 683 if (mac->ops.get_media_type(hw) != ixgbe_media_type_copper) 684 phy->ops.set_phy_power = NULL; 685 686 687 /* EEPROM */ 688 eeprom->ops.init_params = ixgbe_init_eeprom_params_X540; 689 eeprom->ops.read = ixgbe_read_ee_hostif_X550; 690 eeprom->ops.read_buffer = ixgbe_read_ee_hostif_buffer_X550; 691 eeprom->ops.write = ixgbe_write_ee_hostif_X550; 692 eeprom->ops.write_buffer = ixgbe_write_ee_hostif_buffer_X550; 693 eeprom->ops.update_checksum = ixgbe_update_eeprom_checksum_X550; 694 eeprom->ops.validate_checksum = ixgbe_validate_eeprom_checksum_X550; 695 eeprom->ops.calc_checksum = ixgbe_calc_eeprom_checksum_X550; 696 697 return ret_val; 698 } 699 700 /** 701 * ixgbe_setup_fw_link - Setup firmware-controlled PHYs 702 * @hw: pointer to hardware structure 703 */ 704 static s32 ixgbe_setup_fw_link(struct ixgbe_hw *hw) 705 { 706 u32 setup[FW_PHY_ACT_DATA_COUNT] = { 0 }; 707 s32 rc; 708 u16 i; 709 710 if (hw->phy.reset_disable || ixgbe_check_reset_blocked(hw)) 711 return 0; 712 713 if (hw->fc.strict_ieee && hw->fc.requested_mode == ixgbe_fc_rx_pause) { 714 ERROR_REPORT1(IXGBE_ERROR_UNSUPPORTED, 715 "ixgbe_fc_rx_pause not valid in strict IEEE mode\n"); 716 return IXGBE_ERR_INVALID_LINK_SETTINGS; 717 } 718 719 switch (hw->fc.requested_mode) { 720 case ixgbe_fc_full: 721 setup[0] |= FW_PHY_ACT_SETUP_LINK_PAUSE_RXTX << 722 FW_PHY_ACT_SETUP_LINK_PAUSE_SHIFT; 723 break; 724 case ixgbe_fc_rx_pause: 725 setup[0] |= FW_PHY_ACT_SETUP_LINK_PAUSE_RX << 726 FW_PHY_ACT_SETUP_LINK_PAUSE_SHIFT; 727 break; 728 case ixgbe_fc_tx_pause: 729 setup[0] |= FW_PHY_ACT_SETUP_LINK_PAUSE_TX << 730 FW_PHY_ACT_SETUP_LINK_PAUSE_SHIFT; 731 break; 732 default: 733 break; 734 } 735 736 for (i = 0; i < sizeof(ixgbe_fw_map) / sizeof(ixgbe_fw_map[0]); ++i) { 737 if (hw->phy.autoneg_advertised & ixgbe_fw_map[i].phy_speed) 738 setup[0] |= (u32)(ixgbe_fw_map[i].fw_speed); 739 } 740 setup[0] |= FW_PHY_ACT_SETUP_LINK_HP | FW_PHY_ACT_SETUP_LINK_AN; 741 742 if (hw->phy.eee_speeds_advertised) 743 setup[0] |= FW_PHY_ACT_SETUP_LINK_EEE; 744 745 rc = ixgbe_fw_phy_activity(hw, FW_PHY_ACT_SETUP_LINK, &setup); 746 if (rc) 747 return rc; 748 if (setup[0] == FW_PHY_ACT_SETUP_LINK_RSP_DOWN) 749 return IXGBE_ERR_OVERTEMP; 750 return IXGBE_SUCCESS; 751 } 752 753 /** 754 * ixgbe_fc_autoneg_fw _ Set up flow control for FW-controlled PHYs 755 * @hw: pointer to hardware structure 756 * 757 * Called at init time to set up flow control. 758 */ 759 static s32 ixgbe_fc_autoneg_fw(struct ixgbe_hw *hw) 760 { 761 if (hw->fc.requested_mode == ixgbe_fc_default) 762 hw->fc.requested_mode = ixgbe_fc_full; 763 764 return ixgbe_setup_fw_link(hw); 765 } 766 767 /** 768 * ixgbe_setup_eee_fw - Enable/disable EEE support 769 * @hw: pointer to the HW structure 770 * @enable_eee: boolean flag to enable EEE 771 * 772 * Enable/disable EEE based on enable_eee flag. 773 * This function controls EEE for firmware-based PHY implementations. 774 */ 775 static s32 ixgbe_setup_eee_fw(struct ixgbe_hw *hw, bool enable_eee) 776 { 777 if (!!hw->phy.eee_speeds_advertised == enable_eee) 778 return IXGBE_SUCCESS; 779 if (enable_eee) 780 hw->phy.eee_speeds_advertised = hw->phy.eee_speeds_supported; 781 else 782 hw->phy.eee_speeds_advertised = 0; 783 return hw->phy.ops.setup_link(hw); 784 } 785 786 /** 787 * ixgbe_init_ops_X550EM_a - Inits func ptrs and MAC type 788 * @hw: pointer to hardware structure 789 * 790 * Initialize the function pointers and for MAC type X550EM_a. 791 * Does not touch the hardware. 792 **/ 793 s32 ixgbe_init_ops_X550EM_a(struct ixgbe_hw *hw) 794 { 795 struct ixgbe_mac_info *mac = &hw->mac; 796 s32 ret_val; 797 798 DEBUGFUNC("ixgbe_init_ops_X550EM_a"); 799 800 /* Start with generic X550EM init */ 801 ret_val = ixgbe_init_ops_X550EM(hw); 802 803 if (hw->device_id == IXGBE_DEV_ID_X550EM_A_SGMII || 804 hw->device_id == IXGBE_DEV_ID_X550EM_A_SGMII_L) { 805 mac->ops.read_iosf_sb_reg = ixgbe_read_iosf_sb_reg_x550; 806 mac->ops.write_iosf_sb_reg = ixgbe_write_iosf_sb_reg_x550; 807 } else { 808 mac->ops.read_iosf_sb_reg = ixgbe_read_iosf_sb_reg_x550a; 809 mac->ops.write_iosf_sb_reg = ixgbe_write_iosf_sb_reg_x550a; 810 } 811 mac->ops.acquire_swfw_sync = ixgbe_acquire_swfw_sync_X550a; 812 mac->ops.release_swfw_sync = ixgbe_release_swfw_sync_X550a; 813 814 switch (mac->ops.get_media_type(hw)) { 815 case ixgbe_media_type_fiber: 816 mac->ops.setup_fc = NULL; 817 mac->ops.fc_autoneg = ixgbe_fc_autoneg_fiber_x550em_a; 818 break; 819 case ixgbe_media_type_backplane: 820 mac->ops.fc_autoneg = ixgbe_fc_autoneg_backplane_x550em_a; 821 mac->ops.setup_fc = ixgbe_setup_fc_backplane_x550em_a; 822 break; 823 default: 824 break; 825 } 826 827 switch (hw->device_id) { 828 case IXGBE_DEV_ID_X550EM_A_1G_T: 829 case IXGBE_DEV_ID_X550EM_A_1G_T_L: 830 mac->ops.fc_autoneg = ixgbe_fc_autoneg_sgmii_x550em_a; 831 mac->ops.setup_fc = ixgbe_fc_autoneg_fw; 832 mac->ops.setup_eee = ixgbe_setup_eee_fw; 833 hw->phy.eee_speeds_supported = IXGBE_LINK_SPEED_100_FULL | 834 IXGBE_LINK_SPEED_1GB_FULL; 835 hw->phy.eee_speeds_advertised = hw->phy.eee_speeds_supported; 836 break; 837 default: 838 break; 839 } 840 841 return ret_val; 842 } 843 844 /** 845 * ixgbe_init_ops_X550EM_x - Inits func ptrs and MAC type 846 * @hw: pointer to hardware structure 847 * 848 * Initialize the function pointers and for MAC type X550EM_x. 849 * Does not touch the hardware. 850 **/ 851 s32 ixgbe_init_ops_X550EM_x(struct ixgbe_hw *hw) 852 { 853 struct ixgbe_mac_info *mac = &hw->mac; 854 struct ixgbe_link_info *link = &hw->link; 855 s32 ret_val; 856 857 DEBUGFUNC("ixgbe_init_ops_X550EM_x"); 858 859 /* Start with generic X550EM init */ 860 ret_val = ixgbe_init_ops_X550EM(hw); 861 862 mac->ops.read_iosf_sb_reg = ixgbe_read_iosf_sb_reg_x550; 863 mac->ops.write_iosf_sb_reg = ixgbe_write_iosf_sb_reg_x550; 864 mac->ops.acquire_swfw_sync = ixgbe_acquire_swfw_sync_X550em; 865 mac->ops.release_swfw_sync = ixgbe_release_swfw_sync_X550em; 866 link->ops.read_link = ixgbe_read_i2c_combined_generic; 867 link->ops.read_link_unlocked = ixgbe_read_i2c_combined_generic_unlocked; 868 link->ops.write_link = ixgbe_write_i2c_combined_generic; 869 link->ops.write_link_unlocked = 870 ixgbe_write_i2c_combined_generic_unlocked; 871 link->addr = IXGBE_CS4227; 872 873 if (hw->device_id == IXGBE_DEV_ID_X550EM_X_1G_T) { 874 mac->ops.setup_fc = NULL; 875 mac->ops.setup_eee = NULL; 876 mac->ops.init_led_link_act = NULL; 877 } 878 879 return ret_val; 880 } 881 882 /** 883 * ixgbe_dmac_config_X550 884 * @hw: pointer to hardware structure 885 * 886 * Configure DMA coalescing. If enabling dmac, dmac is activated. 887 * When disabling dmac, dmac enable dmac bit is cleared. 888 **/ 889 s32 ixgbe_dmac_config_X550(struct ixgbe_hw *hw) 890 { 891 u32 reg, high_pri_tc; 892 893 DEBUGFUNC("ixgbe_dmac_config_X550"); 894 895 /* Disable DMA coalescing before configuring */ 896 reg = IXGBE_READ_REG(hw, IXGBE_DMACR); 897 reg &= ~IXGBE_DMACR_DMAC_EN; 898 IXGBE_WRITE_REG(hw, IXGBE_DMACR, reg); 899 900 /* Disable DMA Coalescing if the watchdog timer is 0 */ 901 if (!hw->mac.dmac_config.watchdog_timer) 902 goto out; 903 904 ixgbe_dmac_config_tcs_X550(hw); 905 906 /* Configure DMA Coalescing Control Register */ 907 reg = IXGBE_READ_REG(hw, IXGBE_DMACR); 908 909 /* Set the watchdog timer in units of 40.96 usec */ 910 reg &= ~IXGBE_DMACR_DMACWT_MASK; 911 reg |= (hw->mac.dmac_config.watchdog_timer * 100) / 4096; 912 913 reg &= ~IXGBE_DMACR_HIGH_PRI_TC_MASK; 914 /* If fcoe is enabled, set high priority traffic class */ 915 if (hw->mac.dmac_config.fcoe_en) { 916 high_pri_tc = 1 << hw->mac.dmac_config.fcoe_tc; 917 reg |= ((high_pri_tc << IXGBE_DMACR_HIGH_PRI_TC_SHIFT) & 918 IXGBE_DMACR_HIGH_PRI_TC_MASK); 919 } 920 reg |= IXGBE_DMACR_EN_MNG_IND; 921 922 /* Enable DMA coalescing after configuration */ 923 reg |= IXGBE_DMACR_DMAC_EN; 924 IXGBE_WRITE_REG(hw, IXGBE_DMACR, reg); 925 926 out: 927 return IXGBE_SUCCESS; 928 } 929 930 /** 931 * ixgbe_dmac_config_tcs_X550 932 * @hw: pointer to hardware structure 933 * 934 * Configure DMA coalescing threshold per TC. The dmac enable bit must 935 * be cleared before configuring. 936 **/ 937 s32 ixgbe_dmac_config_tcs_X550(struct ixgbe_hw *hw) 938 { 939 u32 tc, reg, pb_headroom, rx_pb_size, maxframe_size_kb; 940 941 DEBUGFUNC("ixgbe_dmac_config_tcs_X550"); 942 943 /* Configure DMA coalescing enabled */ 944 switch (hw->mac.dmac_config.link_speed) { 945 case IXGBE_LINK_SPEED_10_FULL: 946 case IXGBE_LINK_SPEED_100_FULL: 947 pb_headroom = IXGBE_DMACRXT_100M; 948 break; 949 case IXGBE_LINK_SPEED_1GB_FULL: 950 pb_headroom = IXGBE_DMACRXT_1G; 951 break; 952 default: 953 pb_headroom = IXGBE_DMACRXT_10G; 954 break; 955 } 956 957 maxframe_size_kb = ((IXGBE_READ_REG(hw, IXGBE_MAXFRS) >> 958 IXGBE_MHADD_MFS_SHIFT) / 1024); 959 960 /* Set the per Rx packet buffer receive threshold */ 961 for (tc = 0; tc < IXGBE_DCB_MAX_TRAFFIC_CLASS; tc++) { 962 reg = IXGBE_READ_REG(hw, IXGBE_DMCTH(tc)); 963 reg &= ~IXGBE_DMCTH_DMACRXT_MASK; 964 965 if (tc < hw->mac.dmac_config.num_tcs) { 966 /* Get Rx PB size */ 967 rx_pb_size = IXGBE_READ_REG(hw, IXGBE_RXPBSIZE(tc)); 968 rx_pb_size = (rx_pb_size & IXGBE_RXPBSIZE_MASK) >> 969 IXGBE_RXPBSIZE_SHIFT; 970 971 /* Calculate receive buffer threshold in kilobytes */ 972 if (rx_pb_size > pb_headroom) 973 rx_pb_size = rx_pb_size - pb_headroom; 974 else 975 rx_pb_size = 0; 976 977 /* Minimum of MFS shall be set for DMCTH */ 978 reg |= (rx_pb_size > maxframe_size_kb) ? 979 rx_pb_size : maxframe_size_kb; 980 } 981 IXGBE_WRITE_REG(hw, IXGBE_DMCTH(tc), reg); 982 } 983 return IXGBE_SUCCESS; 984 } 985 986 /** 987 * ixgbe_dmac_update_tcs_X550 988 * @hw: pointer to hardware structure 989 * 990 * Disables dmac, updates per TC settings, and then enables dmac. 991 **/ 992 s32 ixgbe_dmac_update_tcs_X550(struct ixgbe_hw *hw) 993 { 994 u32 reg; 995 996 DEBUGFUNC("ixgbe_dmac_update_tcs_X550"); 997 998 /* Disable DMA coalescing before configuring */ 999 reg = IXGBE_READ_REG(hw, IXGBE_DMACR); 1000 reg &= ~IXGBE_DMACR_DMAC_EN; 1001 IXGBE_WRITE_REG(hw, IXGBE_DMACR, reg); 1002 1003 ixgbe_dmac_config_tcs_X550(hw); 1004 1005 /* Enable DMA coalescing after configuration */ 1006 reg = IXGBE_READ_REG(hw, IXGBE_DMACR); 1007 reg |= IXGBE_DMACR_DMAC_EN; 1008 IXGBE_WRITE_REG(hw, IXGBE_DMACR, reg); 1009 1010 return IXGBE_SUCCESS; 1011 } 1012 1013 /** 1014 * ixgbe_init_eeprom_params_X550 - Initialize EEPROM params 1015 * @hw: pointer to hardware structure 1016 * 1017 * Initializes the EEPROM parameters ixgbe_eeprom_info within the 1018 * ixgbe_hw struct in order to set up EEPROM access. 1019 **/ 1020 s32 ixgbe_init_eeprom_params_X550(struct ixgbe_hw *hw) 1021 { 1022 struct ixgbe_eeprom_info *eeprom = &hw->eeprom; 1023 u32 eec; 1024 u16 eeprom_size; 1025 1026 DEBUGFUNC("ixgbe_init_eeprom_params_X550"); 1027 1028 if (eeprom->type == ixgbe_eeprom_uninitialized) { 1029 eeprom->semaphore_delay = 10; 1030 eeprom->type = ixgbe_flash; 1031 1032 eec = IXGBE_READ_REG(hw, IXGBE_EEC); 1033 eeprom_size = (u16)((eec & IXGBE_EEC_SIZE) >> 1034 IXGBE_EEC_SIZE_SHIFT); 1035 eeprom->word_size = 1 << (eeprom_size + 1036 IXGBE_EEPROM_WORD_SIZE_SHIFT); 1037 1038 DEBUGOUT2("Eeprom params: type = %d, size = %d\n", 1039 eeprom->type, eeprom->word_size); 1040 } 1041 1042 return IXGBE_SUCCESS; 1043 } 1044 1045 /** 1046 * ixgbe_set_source_address_pruning_X550 - Enable/Disbale source address pruning 1047 * @hw: pointer to hardware structure 1048 * @enable: enable or disable source address pruning 1049 * @pool: Rx pool to set source address pruning for 1050 **/ 1051 void ixgbe_set_source_address_pruning_X550(struct ixgbe_hw *hw, bool enable, 1052 unsigned int pool) 1053 { 1054 u64 pfflp; 1055 1056 /* max rx pool is 63 */ 1057 if (pool > 63) 1058 return; 1059 1060 pfflp = (u64)IXGBE_READ_REG(hw, IXGBE_PFFLPL); 1061 pfflp |= (u64)IXGBE_READ_REG(hw, IXGBE_PFFLPH) << 32; 1062 1063 if (enable) 1064 pfflp |= (1ULL << pool); 1065 else 1066 pfflp &= ~(1ULL << pool); 1067 1068 IXGBE_WRITE_REG(hw, IXGBE_PFFLPL, (u32)pfflp); 1069 IXGBE_WRITE_REG(hw, IXGBE_PFFLPH, (u32)(pfflp >> 32)); 1070 } 1071 1072 /** 1073 * ixgbe_set_ethertype_anti_spoofing_X550 - Configure Ethertype anti-spoofing 1074 * @hw: pointer to hardware structure 1075 * @enable: enable or disable switch for Ethertype anti-spoofing 1076 * @vf: Virtual Function pool - VF Pool to set for Ethertype anti-spoofing 1077 * 1078 **/ 1079 void ixgbe_set_ethertype_anti_spoofing_X550(struct ixgbe_hw *hw, 1080 bool enable, int vf) 1081 { 1082 int vf_target_reg = vf >> 3; 1083 int vf_target_shift = vf % 8 + IXGBE_SPOOF_ETHERTYPEAS_SHIFT; 1084 u32 pfvfspoof; 1085 1086 DEBUGFUNC("ixgbe_set_ethertype_anti_spoofing_X550"); 1087 1088 pfvfspoof = IXGBE_READ_REG(hw, IXGBE_PFVFSPOOF(vf_target_reg)); 1089 if (enable) 1090 pfvfspoof |= (1 << vf_target_shift); 1091 else 1092 pfvfspoof &= ~(1 << vf_target_shift); 1093 1094 IXGBE_WRITE_REG(hw, IXGBE_PFVFSPOOF(vf_target_reg), pfvfspoof); 1095 } 1096 1097 /** 1098 * ixgbe_iosf_wait - Wait for IOSF command completion 1099 * @hw: pointer to hardware structure 1100 * @ctrl: pointer to location to receive final IOSF control value 1101 * 1102 * Returns failing status on timeout 1103 * 1104 * Note: ctrl can be NULL if the IOSF control register value is not needed 1105 **/ 1106 static s32 ixgbe_iosf_wait(struct ixgbe_hw *hw, u32 *ctrl) 1107 { 1108 u32 i, command = 0; 1109 1110 /* Check every 10 usec to see if the address cycle completed. 1111 * The SB IOSF BUSY bit will clear when the operation is 1112 * complete 1113 */ 1114 for (i = 0; i < IXGBE_MDIO_COMMAND_TIMEOUT; i++) { 1115 command = IXGBE_READ_REG(hw, IXGBE_SB_IOSF_INDIRECT_CTRL); 1116 if ((command & IXGBE_SB_IOSF_CTRL_BUSY) == 0) 1117 break; 1118 usec_delay(10); 1119 } 1120 if (ctrl) 1121 *ctrl = command; 1122 if (i == IXGBE_MDIO_COMMAND_TIMEOUT) { 1123 ERROR_REPORT1(IXGBE_ERROR_POLLING, "Wait timed out\n"); 1124 return IXGBE_ERR_PHY; 1125 } 1126 1127 return IXGBE_SUCCESS; 1128 } 1129 1130 /** 1131 * ixgbe_write_iosf_sb_reg_x550 - Writes a value to specified register 1132 * of the IOSF device 1133 * @hw: pointer to hardware structure 1134 * @reg_addr: 32 bit PHY register to write 1135 * @device_type: 3 bit device type 1136 * @data: Data to write to the register 1137 **/ 1138 s32 ixgbe_write_iosf_sb_reg_x550(struct ixgbe_hw *hw, u32 reg_addr, 1139 u32 device_type, u32 data) 1140 { 1141 u32 gssr = IXGBE_GSSR_PHY1_SM | IXGBE_GSSR_PHY0_SM; 1142 u32 command, error; 1143 s32 ret; 1144 1145 ret = ixgbe_acquire_swfw_semaphore(hw, gssr); 1146 if (ret != IXGBE_SUCCESS) 1147 return ret; 1148 1149 ret = ixgbe_iosf_wait(hw, NULL); 1150 if (ret != IXGBE_SUCCESS) 1151 goto out; 1152 1153 command = ((reg_addr << IXGBE_SB_IOSF_CTRL_ADDR_SHIFT) | 1154 (device_type << IXGBE_SB_IOSF_CTRL_TARGET_SELECT_SHIFT)); 1155 1156 /* Write IOSF control register */ 1157 IXGBE_WRITE_REG(hw, IXGBE_SB_IOSF_INDIRECT_CTRL, command); 1158 1159 /* Write IOSF data register */ 1160 IXGBE_WRITE_REG(hw, IXGBE_SB_IOSF_INDIRECT_DATA, data); 1161 1162 ret = ixgbe_iosf_wait(hw, &command); 1163 1164 if ((command & IXGBE_SB_IOSF_CTRL_RESP_STAT_MASK) != 0) { 1165 error = (command & IXGBE_SB_IOSF_CTRL_CMPL_ERR_MASK) >> 1166 IXGBE_SB_IOSF_CTRL_CMPL_ERR_SHIFT; 1167 ERROR_REPORT2(IXGBE_ERROR_POLLING, 1168 "Failed to write, error %x\n", error); 1169 ret = IXGBE_ERR_PHY; 1170 } 1171 1172 out: 1173 ixgbe_release_swfw_semaphore(hw, gssr); 1174 return ret; 1175 } 1176 1177 /** 1178 * ixgbe_read_iosf_sb_reg_x550 - Reads specified register of the IOSF device 1179 * @hw: pointer to hardware structure 1180 * @reg_addr: 32 bit PHY register to write 1181 * @device_type: 3 bit device type 1182 * @data: Pointer to read data from the register 1183 **/ 1184 s32 ixgbe_read_iosf_sb_reg_x550(struct ixgbe_hw *hw, u32 reg_addr, 1185 u32 device_type, u32 *data) 1186 { 1187 u32 gssr = IXGBE_GSSR_PHY1_SM | IXGBE_GSSR_PHY0_SM; 1188 u32 command, error; 1189 s32 ret; 1190 1191 ret = ixgbe_acquire_swfw_semaphore(hw, gssr); 1192 if (ret != IXGBE_SUCCESS) 1193 return ret; 1194 1195 ret = ixgbe_iosf_wait(hw, NULL); 1196 if (ret != IXGBE_SUCCESS) 1197 goto out; 1198 1199 command = ((reg_addr << IXGBE_SB_IOSF_CTRL_ADDR_SHIFT) | 1200 (device_type << IXGBE_SB_IOSF_CTRL_TARGET_SELECT_SHIFT)); 1201 1202 /* Write IOSF control register */ 1203 IXGBE_WRITE_REG(hw, IXGBE_SB_IOSF_INDIRECT_CTRL, command); 1204 1205 ret = ixgbe_iosf_wait(hw, &command); 1206 1207 if ((command & IXGBE_SB_IOSF_CTRL_RESP_STAT_MASK) != 0) { 1208 error = (command & IXGBE_SB_IOSF_CTRL_CMPL_ERR_MASK) >> 1209 IXGBE_SB_IOSF_CTRL_CMPL_ERR_SHIFT; 1210 ERROR_REPORT2(IXGBE_ERROR_POLLING, 1211 "Failed to read, error %x\n", error); 1212 ret = IXGBE_ERR_PHY; 1213 } 1214 1215 if (ret == IXGBE_SUCCESS) 1216 *data = IXGBE_READ_REG(hw, IXGBE_SB_IOSF_INDIRECT_DATA); 1217 1218 out: 1219 ixgbe_release_swfw_semaphore(hw, gssr); 1220 return ret; 1221 } 1222 1223 /** 1224 * ixgbe_get_phy_token - Get the token for shared phy access 1225 * @hw: Pointer to hardware structure 1226 */ 1227 1228 s32 ixgbe_get_phy_token(struct ixgbe_hw *hw) 1229 { 1230 struct ixgbe_hic_phy_token_req token_cmd; 1231 s32 status; 1232 1233 token_cmd.hdr.cmd = FW_PHY_TOKEN_REQ_CMD; 1234 token_cmd.hdr.buf_len = FW_PHY_TOKEN_REQ_LEN; 1235 token_cmd.hdr.cmd_or_resp.cmd_resv = 0; 1236 token_cmd.hdr.checksum = FW_DEFAULT_CHECKSUM; 1237 token_cmd.port_number = hw->bus.lan_id; 1238 token_cmd.command_type = FW_PHY_TOKEN_REQ; 1239 token_cmd.pad = 0; 1240 status = ixgbe_host_interface_command(hw, (u32 *)&token_cmd, 1241 sizeof(token_cmd), 1242 IXGBE_HI_COMMAND_TIMEOUT, 1243 true); 1244 if (status) { 1245 DEBUGOUT1("Issuing host interface command failed with Status = %d\n", 1246 status); 1247 return status; 1248 } 1249 if (token_cmd.hdr.cmd_or_resp.ret_status == FW_PHY_TOKEN_OK) 1250 return IXGBE_SUCCESS; 1251 if (token_cmd.hdr.cmd_or_resp.ret_status != FW_PHY_TOKEN_RETRY) { 1252 DEBUGOUT1("Host interface command returned 0x%08x , returning IXGBE_ERR_FW_RESP_INVALID\n", 1253 token_cmd.hdr.cmd_or_resp.ret_status); 1254 return IXGBE_ERR_FW_RESP_INVALID; 1255 } 1256 1257 DEBUGOUT("Returning IXGBE_ERR_TOKEN_RETRY\n"); 1258 return IXGBE_ERR_TOKEN_RETRY; 1259 } 1260 1261 /** 1262 * ixgbe_put_phy_token - Put the token for shared phy access 1263 * @hw: Pointer to hardware structure 1264 */ 1265 1266 s32 ixgbe_put_phy_token(struct ixgbe_hw *hw) 1267 { 1268 struct ixgbe_hic_phy_token_req token_cmd; 1269 s32 status; 1270 1271 token_cmd.hdr.cmd = FW_PHY_TOKEN_REQ_CMD; 1272 token_cmd.hdr.buf_len = FW_PHY_TOKEN_REQ_LEN; 1273 token_cmd.hdr.cmd_or_resp.cmd_resv = 0; 1274 token_cmd.hdr.checksum = FW_DEFAULT_CHECKSUM; 1275 token_cmd.port_number = hw->bus.lan_id; 1276 token_cmd.command_type = FW_PHY_TOKEN_REL; 1277 token_cmd.pad = 0; 1278 status = ixgbe_host_interface_command(hw, (u32 *)&token_cmd, 1279 sizeof(token_cmd), 1280 IXGBE_HI_COMMAND_TIMEOUT, 1281 true); 1282 if (status) 1283 return status; 1284 if (token_cmd.hdr.cmd_or_resp.ret_status == FW_PHY_TOKEN_OK) 1285 return IXGBE_SUCCESS; 1286 1287 DEBUGOUT("Put PHY Token host interface command failed"); 1288 return IXGBE_ERR_FW_RESP_INVALID; 1289 } 1290 1291 /** 1292 * ixgbe_write_iosf_sb_reg_x550a - Writes a value to specified register 1293 * of the IOSF device 1294 * @hw: pointer to hardware structure 1295 * @reg_addr: 32 bit PHY register to write 1296 * @device_type: 3 bit device type 1297 * @data: Data to write to the register 1298 **/ 1299 s32 ixgbe_write_iosf_sb_reg_x550a(struct ixgbe_hw *hw, u32 reg_addr, 1300 u32 device_type, u32 data) 1301 { 1302 struct ixgbe_hic_internal_phy_req write_cmd; 1303 s32 status; 1304 UNREFERENCED_1PARAMETER(device_type); 1305 1306 memset(&write_cmd, 0, sizeof(write_cmd)); 1307 write_cmd.hdr.cmd = FW_INT_PHY_REQ_CMD; 1308 write_cmd.hdr.buf_len = FW_INT_PHY_REQ_LEN; 1309 write_cmd.hdr.checksum = FW_DEFAULT_CHECKSUM; 1310 write_cmd.port_number = hw->bus.lan_id; 1311 write_cmd.command_type = FW_INT_PHY_REQ_WRITE; 1312 write_cmd.address = IXGBE_CPU_TO_BE16(reg_addr); 1313 write_cmd.write_data = IXGBE_CPU_TO_BE32(data); 1314 1315 status = ixgbe_host_interface_command(hw, (u32 *)&write_cmd, 1316 sizeof(write_cmd), 1317 IXGBE_HI_COMMAND_TIMEOUT, false); 1318 1319 return status; 1320 } 1321 1322 /** 1323 * ixgbe_read_iosf_sb_reg_x550a - Reads specified register of the IOSF device 1324 * @hw: pointer to hardware structure 1325 * @reg_addr: 32 bit PHY register to write 1326 * @device_type: 3 bit device type 1327 * @data: Pointer to read data from the register 1328 **/ 1329 s32 ixgbe_read_iosf_sb_reg_x550a(struct ixgbe_hw *hw, u32 reg_addr, 1330 u32 device_type, u32 *data) 1331 { 1332 union { 1333 struct ixgbe_hic_internal_phy_req cmd; 1334 struct ixgbe_hic_internal_phy_resp rsp; 1335 } hic; 1336 s32 status; 1337 UNREFERENCED_1PARAMETER(device_type); 1338 1339 memset(&hic, 0, sizeof(hic)); 1340 hic.cmd.hdr.cmd = FW_INT_PHY_REQ_CMD; 1341 hic.cmd.hdr.buf_len = FW_INT_PHY_REQ_LEN; 1342 hic.cmd.hdr.checksum = FW_DEFAULT_CHECKSUM; 1343 hic.cmd.port_number = hw->bus.lan_id; 1344 hic.cmd.command_type = FW_INT_PHY_REQ_READ; 1345 hic.cmd.address = IXGBE_CPU_TO_BE16(reg_addr); 1346 1347 status = ixgbe_host_interface_command(hw, (u32 *)&hic.cmd, 1348 sizeof(hic.cmd), 1349 IXGBE_HI_COMMAND_TIMEOUT, true); 1350 1351 /* Extract the register value from the response. */ 1352 *data = IXGBE_BE32_TO_CPU(hic.rsp.read_data); 1353 1354 return status; 1355 } 1356 1357 /** 1358 * ixgbe_disable_mdd_X550 1359 * @hw: pointer to hardware structure 1360 * 1361 * Disable malicious driver detection 1362 **/ 1363 void ixgbe_disable_mdd_X550(struct ixgbe_hw *hw) 1364 { 1365 u32 reg; 1366 1367 DEBUGFUNC("ixgbe_disable_mdd_X550"); 1368 1369 /* Disable MDD for TX DMA and interrupt */ 1370 reg = IXGBE_READ_REG(hw, IXGBE_DMATXCTL); 1371 reg &= ~(IXGBE_DMATXCTL_MDP_EN | IXGBE_DMATXCTL_MBINTEN); 1372 IXGBE_WRITE_REG(hw, IXGBE_DMATXCTL, reg); 1373 1374 /* Disable MDD for RX and interrupt */ 1375 reg = IXGBE_READ_REG(hw, IXGBE_RDRXCTL); 1376 reg &= ~(IXGBE_RDRXCTL_MDP_EN | IXGBE_RDRXCTL_MBINTEN); 1377 IXGBE_WRITE_REG(hw, IXGBE_RDRXCTL, reg); 1378 } 1379 1380 /** 1381 * ixgbe_enable_mdd_X550 1382 * @hw: pointer to hardware structure 1383 * 1384 * Enable malicious driver detection 1385 **/ 1386 void ixgbe_enable_mdd_X550(struct ixgbe_hw *hw) 1387 { 1388 u32 reg; 1389 1390 DEBUGFUNC("ixgbe_enable_mdd_X550"); 1391 1392 /* Enable MDD for TX DMA and interrupt */ 1393 reg = IXGBE_READ_REG(hw, IXGBE_DMATXCTL); 1394 reg |= (IXGBE_DMATXCTL_MDP_EN | IXGBE_DMATXCTL_MBINTEN); 1395 IXGBE_WRITE_REG(hw, IXGBE_DMATXCTL, reg); 1396 1397 /* Enable MDD for RX and interrupt */ 1398 reg = IXGBE_READ_REG(hw, IXGBE_RDRXCTL); 1399 reg |= (IXGBE_RDRXCTL_MDP_EN | IXGBE_RDRXCTL_MBINTEN); 1400 IXGBE_WRITE_REG(hw, IXGBE_RDRXCTL, reg); 1401 } 1402 1403 /** 1404 * ixgbe_restore_mdd_vf_X550 1405 * @hw: pointer to hardware structure 1406 * @vf: vf index 1407 * 1408 * Restore VF that was disabled during malicious driver detection event 1409 **/ 1410 void ixgbe_restore_mdd_vf_X550(struct ixgbe_hw *hw, u32 vf) 1411 { 1412 u32 idx, reg, num_qs, start_q, bitmask; 1413 1414 DEBUGFUNC("ixgbe_restore_mdd_vf_X550"); 1415 1416 /* Map VF to queues */ 1417 reg = IXGBE_READ_REG(hw, IXGBE_MRQC); 1418 switch (reg & IXGBE_MRQC_MRQE_MASK) { 1419 case IXGBE_MRQC_VMDQRT8TCEN: 1420 num_qs = 8; /* 16 VFs / pools */ 1421 bitmask = 0x000000FF; 1422 break; 1423 case IXGBE_MRQC_VMDQRSS32EN: 1424 case IXGBE_MRQC_VMDQRT4TCEN: 1425 num_qs = 4; /* 32 VFs / pools */ 1426 bitmask = 0x0000000F; 1427 break; 1428 default: /* 64 VFs / pools */ 1429 num_qs = 2; 1430 bitmask = 0x00000003; 1431 break; 1432 } 1433 start_q = vf * num_qs; 1434 1435 /* Release vf's queues by clearing WQBR_TX and WQBR_RX (RW1C) */ 1436 idx = start_q / 32; 1437 reg = 0; 1438 reg |= (bitmask << (start_q % 32)); 1439 IXGBE_WRITE_REG(hw, IXGBE_WQBR_TX(idx), reg); 1440 IXGBE_WRITE_REG(hw, IXGBE_WQBR_RX(idx), reg); 1441 } 1442 1443 /** 1444 * ixgbe_mdd_event_X550 1445 * @hw: pointer to hardware structure 1446 * @vf_bitmap: vf bitmap of malicious vfs 1447 * 1448 * Handle malicious driver detection event. 1449 **/ 1450 void ixgbe_mdd_event_X550(struct ixgbe_hw *hw, u32 *vf_bitmap) 1451 { 1452 u32 wqbr; 1453 u32 i, j, reg, q, shift, vf, idx; 1454 1455 DEBUGFUNC("ixgbe_mdd_event_X550"); 1456 1457 /* figure out pool size for mapping to vf's */ 1458 reg = IXGBE_READ_REG(hw, IXGBE_MRQC); 1459 switch (reg & IXGBE_MRQC_MRQE_MASK) { 1460 case IXGBE_MRQC_VMDQRT8TCEN: 1461 shift = 3; /* 16 VFs / pools */ 1462 break; 1463 case IXGBE_MRQC_VMDQRSS32EN: 1464 case IXGBE_MRQC_VMDQRT4TCEN: 1465 shift = 2; /* 32 VFs / pools */ 1466 break; 1467 default: 1468 shift = 1; /* 64 VFs / pools */ 1469 break; 1470 } 1471 1472 /* Read WQBR_TX and WQBR_RX and check for malicious queues */ 1473 for (i = 0; i < 4; i++) { 1474 wqbr = IXGBE_READ_REG(hw, IXGBE_WQBR_TX(i)); 1475 wqbr |= IXGBE_READ_REG(hw, IXGBE_WQBR_RX(i)); 1476 1477 if (!wqbr) 1478 continue; 1479 1480 /* Get malicious queue */ 1481 for (j = 0; j < 32 && wqbr; j++) { 1482 1483 if (!(wqbr & (1 << j))) 1484 continue; 1485 1486 /* Get queue from bitmask */ 1487 q = j + (i * 32); 1488 1489 /* Map queue to vf */ 1490 vf = (q >> shift); 1491 1492 /* Set vf bit in vf_bitmap */ 1493 idx = vf / 32; 1494 vf_bitmap[idx] |= (1 << (vf % 32)); 1495 wqbr &= ~(1 << j); 1496 } 1497 } 1498 } 1499 1500 /** 1501 * ixgbe_get_media_type_X550em - Get media type 1502 * @hw: pointer to hardware structure 1503 * 1504 * Returns the media type (fiber, copper, backplane) 1505 */ 1506 enum ixgbe_media_type ixgbe_get_media_type_X550em(struct ixgbe_hw *hw) 1507 { 1508 enum ixgbe_media_type media_type; 1509 1510 DEBUGFUNC("ixgbe_get_media_type_X550em"); 1511 1512 /* Detect if there is a copper PHY attached. */ 1513 switch (hw->device_id) { 1514 case IXGBE_DEV_ID_X550EM_X_KR: 1515 case IXGBE_DEV_ID_X550EM_X_KX4: 1516 case IXGBE_DEV_ID_X550EM_X_XFI: 1517 case IXGBE_DEV_ID_X550EM_A_KR: 1518 case IXGBE_DEV_ID_X550EM_A_KR_L: 1519 media_type = ixgbe_media_type_backplane; 1520 break; 1521 case IXGBE_DEV_ID_X550EM_X_SFP: 1522 case IXGBE_DEV_ID_X550EM_A_SFP: 1523 case IXGBE_DEV_ID_X550EM_A_SFP_N: 1524 case IXGBE_DEV_ID_X550EM_A_QSFP: 1525 case IXGBE_DEV_ID_X550EM_A_QSFP_N: 1526 media_type = ixgbe_media_type_fiber; 1527 break; 1528 case IXGBE_DEV_ID_X550EM_X_1G_T: 1529 case IXGBE_DEV_ID_X550EM_X_10G_T: 1530 case IXGBE_DEV_ID_X550EM_A_10G_T: 1531 media_type = ixgbe_media_type_copper; 1532 break; 1533 case IXGBE_DEV_ID_X550EM_A_SGMII: 1534 case IXGBE_DEV_ID_X550EM_A_SGMII_L: 1535 media_type = ixgbe_media_type_backplane; 1536 hw->phy.type = ixgbe_phy_sgmii; 1537 break; 1538 case IXGBE_DEV_ID_X550EM_A_1G_T: 1539 case IXGBE_DEV_ID_X550EM_A_1G_T_L: 1540 media_type = ixgbe_media_type_copper; 1541 break; 1542 default: 1543 media_type = ixgbe_media_type_unknown; 1544 break; 1545 } 1546 return media_type; 1547 } 1548 1549 /** 1550 * ixgbe_supported_sfp_modules_X550em - Check if SFP module type is supported 1551 * @hw: pointer to hardware structure 1552 * @linear: true if SFP module is linear 1553 */ 1554 static s32 ixgbe_supported_sfp_modules_X550em(struct ixgbe_hw *hw, bool *linear) 1555 { 1556 DEBUGFUNC("ixgbe_supported_sfp_modules_X550em"); 1557 1558 switch (hw->phy.sfp_type) { 1559 case ixgbe_sfp_type_not_present: 1560 return IXGBE_ERR_SFP_NOT_PRESENT; 1561 case ixgbe_sfp_type_da_cu_core0: 1562 case ixgbe_sfp_type_da_cu_core1: 1563 *linear = true; 1564 break; 1565 case ixgbe_sfp_type_srlr_core0: 1566 case ixgbe_sfp_type_srlr_core1: 1567 case ixgbe_sfp_type_da_act_lmt_core0: 1568 case ixgbe_sfp_type_da_act_lmt_core1: 1569 case ixgbe_sfp_type_1g_sx_core0: 1570 case ixgbe_sfp_type_1g_sx_core1: 1571 case ixgbe_sfp_type_1g_lx_core0: 1572 case ixgbe_sfp_type_1g_lx_core1: 1573 *linear = false; 1574 break; 1575 case ixgbe_sfp_type_unknown: 1576 case ixgbe_sfp_type_1g_cu_core0: 1577 case ixgbe_sfp_type_1g_cu_core1: 1578 default: 1579 return IXGBE_ERR_SFP_NOT_SUPPORTED; 1580 } 1581 1582 return IXGBE_SUCCESS; 1583 } 1584 1585 /** 1586 * ixgbe_identify_sfp_module_X550em - Identifies SFP modules 1587 * @hw: pointer to hardware structure 1588 * 1589 * Searches for and identifies the SFP module and assigns appropriate PHY type. 1590 **/ 1591 s32 ixgbe_identify_sfp_module_X550em(struct ixgbe_hw *hw) 1592 { 1593 s32 status; 1594 bool linear; 1595 1596 DEBUGFUNC("ixgbe_identify_sfp_module_X550em"); 1597 1598 status = ixgbe_identify_module_generic(hw); 1599 1600 if (status != IXGBE_SUCCESS) 1601 return status; 1602 1603 /* Check if SFP module is supported */ 1604 status = ixgbe_supported_sfp_modules_X550em(hw, &linear); 1605 1606 return status; 1607 } 1608 1609 /** 1610 * ixgbe_setup_sfp_modules_X550em - Setup MAC link ops 1611 * @hw: pointer to hardware structure 1612 */ 1613 s32 ixgbe_setup_sfp_modules_X550em(struct ixgbe_hw *hw) 1614 { 1615 s32 status; 1616 bool linear; 1617 1618 DEBUGFUNC("ixgbe_setup_sfp_modules_X550em"); 1619 1620 /* Check if SFP module is supported */ 1621 status = ixgbe_supported_sfp_modules_X550em(hw, &linear); 1622 1623 if (status != IXGBE_SUCCESS) 1624 return status; 1625 1626 ixgbe_init_mac_link_ops_X550em(hw); 1627 hw->phy.ops.reset = NULL; 1628 1629 return IXGBE_SUCCESS; 1630 } 1631 1632 /** 1633 * ixgbe_restart_an_internal_phy_x550em - restart autonegotiation for the 1634 * internal PHY 1635 * @hw: pointer to hardware structure 1636 **/ 1637 static s32 ixgbe_restart_an_internal_phy_x550em(struct ixgbe_hw *hw) 1638 { 1639 s32 status; 1640 u32 link_ctrl; 1641 1642 /* Restart auto-negotiation. */ 1643 status = hw->mac.ops.read_iosf_sb_reg(hw, 1644 IXGBE_KRM_LINK_CTRL_1(hw->bus.lan_id), 1645 IXGBE_SB_IOSF_TARGET_KR_PHY, &link_ctrl); 1646 1647 if (status) { 1648 DEBUGOUT("Auto-negotiation did not complete\n"); 1649 return status; 1650 } 1651 1652 link_ctrl |= IXGBE_KRM_LINK_CTRL_1_TETH_AN_RESTART; 1653 status = hw->mac.ops.write_iosf_sb_reg(hw, 1654 IXGBE_KRM_LINK_CTRL_1(hw->bus.lan_id), 1655 IXGBE_SB_IOSF_TARGET_KR_PHY, link_ctrl); 1656 1657 if (hw->mac.type == ixgbe_mac_X550EM_a) { 1658 u32 flx_mask_st20; 1659 1660 /* Indicate to FW that AN restart has been asserted */ 1661 status = hw->mac.ops.read_iosf_sb_reg(hw, 1662 IXGBE_KRM_PMD_FLX_MASK_ST20(hw->bus.lan_id), 1663 IXGBE_SB_IOSF_TARGET_KR_PHY, &flx_mask_st20); 1664 1665 if (status) { 1666 DEBUGOUT("Auto-negotiation did not complete\n"); 1667 return status; 1668 } 1669 1670 flx_mask_st20 |= IXGBE_KRM_PMD_FLX_MASK_ST20_FW_AN_RESTART; 1671 status = hw->mac.ops.write_iosf_sb_reg(hw, 1672 IXGBE_KRM_PMD_FLX_MASK_ST20(hw->bus.lan_id), 1673 IXGBE_SB_IOSF_TARGET_KR_PHY, flx_mask_st20); 1674 } 1675 1676 return status; 1677 } 1678 1679 /** 1680 * ixgbe_setup_sgmii - Set up link for sgmii 1681 * @hw: pointer to hardware structure 1682 * @speed: new link speed 1683 * @autoneg_wait: true when waiting for completion is needed 1684 */ 1685 static s32 ixgbe_setup_sgmii(struct ixgbe_hw *hw, ixgbe_link_speed speed, 1686 bool autoneg_wait) 1687 { 1688 struct ixgbe_mac_info *mac = &hw->mac; 1689 u32 lval, sval, flx_val; 1690 s32 rc; 1691 1692 rc = mac->ops.read_iosf_sb_reg(hw, 1693 IXGBE_KRM_LINK_CTRL_1(hw->bus.lan_id), 1694 IXGBE_SB_IOSF_TARGET_KR_PHY, &lval); 1695 if (rc) 1696 return rc; 1697 1698 lval &= ~IXGBE_KRM_LINK_CTRL_1_TETH_AN_ENABLE; 1699 lval &= ~IXGBE_KRM_LINK_CTRL_1_TETH_FORCE_SPEED_MASK; 1700 lval |= IXGBE_KRM_LINK_CTRL_1_TETH_AN_SGMII_EN; 1701 lval |= IXGBE_KRM_LINK_CTRL_1_TETH_AN_CLAUSE_37_EN; 1702 lval |= IXGBE_KRM_LINK_CTRL_1_TETH_FORCE_SPEED_1G; 1703 rc = mac->ops.write_iosf_sb_reg(hw, 1704 IXGBE_KRM_LINK_CTRL_1(hw->bus.lan_id), 1705 IXGBE_SB_IOSF_TARGET_KR_PHY, lval); 1706 if (rc) 1707 return rc; 1708 1709 rc = mac->ops.read_iosf_sb_reg(hw, 1710 IXGBE_KRM_SGMII_CTRL(hw->bus.lan_id), 1711 IXGBE_SB_IOSF_TARGET_KR_PHY, &sval); 1712 if (rc) 1713 return rc; 1714 1715 sval |= IXGBE_KRM_SGMII_CTRL_MAC_TAR_FORCE_10_D; 1716 sval |= IXGBE_KRM_SGMII_CTRL_MAC_TAR_FORCE_100_D; 1717 rc = mac->ops.write_iosf_sb_reg(hw, 1718 IXGBE_KRM_SGMII_CTRL(hw->bus.lan_id), 1719 IXGBE_SB_IOSF_TARGET_KR_PHY, sval); 1720 if (rc) 1721 return rc; 1722 1723 rc = mac->ops.read_iosf_sb_reg(hw, 1724 IXGBE_KRM_PMD_FLX_MASK_ST20(hw->bus.lan_id), 1725 IXGBE_SB_IOSF_TARGET_KR_PHY, &flx_val); 1726 if (rc) 1727 return rc; 1728 1729 flx_val &= ~IXGBE_KRM_PMD_FLX_MASK_ST20_SPEED_MASK; 1730 flx_val |= IXGBE_KRM_PMD_FLX_MASK_ST20_SPEED_1G; 1731 flx_val &= ~IXGBE_KRM_PMD_FLX_MASK_ST20_AN_EN; 1732 flx_val |= IXGBE_KRM_PMD_FLX_MASK_ST20_SGMII_EN; 1733 flx_val |= IXGBE_KRM_PMD_FLX_MASK_ST20_AN37_EN; 1734 1735 rc = mac->ops.write_iosf_sb_reg(hw, 1736 IXGBE_KRM_PMD_FLX_MASK_ST20(hw->bus.lan_id), 1737 IXGBE_SB_IOSF_TARGET_KR_PHY, flx_val); 1738 if (rc) 1739 return rc; 1740 1741 rc = ixgbe_restart_an_internal_phy_x550em(hw); 1742 if (rc) 1743 return rc; 1744 1745 return hw->phy.ops.setup_link_speed(hw, speed, autoneg_wait); 1746 } 1747 1748 /** 1749 * ixgbe_setup_sgmii_fw - Set up link for internal PHY SGMII auto-negotiation 1750 * @hw: pointer to hardware structure 1751 * @speed: new link speed 1752 * @autoneg_wait: true when waiting for completion is needed 1753 */ 1754 static s32 ixgbe_setup_sgmii_fw(struct ixgbe_hw *hw, ixgbe_link_speed speed, 1755 bool autoneg_wait) 1756 { 1757 struct ixgbe_mac_info *mac = &hw->mac; 1758 u32 lval, sval, flx_val; 1759 s32 rc; 1760 1761 rc = mac->ops.read_iosf_sb_reg(hw, 1762 IXGBE_KRM_LINK_CTRL_1(hw->bus.lan_id), 1763 IXGBE_SB_IOSF_TARGET_KR_PHY, &lval); 1764 if (rc) 1765 return rc; 1766 1767 lval &= ~IXGBE_KRM_LINK_CTRL_1_TETH_AN_ENABLE; 1768 lval &= ~IXGBE_KRM_LINK_CTRL_1_TETH_FORCE_SPEED_MASK; 1769 lval |= IXGBE_KRM_LINK_CTRL_1_TETH_AN_SGMII_EN; 1770 lval |= IXGBE_KRM_LINK_CTRL_1_TETH_AN_CLAUSE_37_EN; 1771 lval &= ~IXGBE_KRM_LINK_CTRL_1_TETH_FORCE_SPEED_1G; 1772 rc = mac->ops.write_iosf_sb_reg(hw, 1773 IXGBE_KRM_LINK_CTRL_1(hw->bus.lan_id), 1774 IXGBE_SB_IOSF_TARGET_KR_PHY, lval); 1775 if (rc) 1776 return rc; 1777 1778 rc = mac->ops.read_iosf_sb_reg(hw, 1779 IXGBE_KRM_SGMII_CTRL(hw->bus.lan_id), 1780 IXGBE_SB_IOSF_TARGET_KR_PHY, &sval); 1781 if (rc) 1782 return rc; 1783 1784 sval &= ~IXGBE_KRM_SGMII_CTRL_MAC_TAR_FORCE_10_D; 1785 sval &= ~IXGBE_KRM_SGMII_CTRL_MAC_TAR_FORCE_100_D; 1786 rc = mac->ops.write_iosf_sb_reg(hw, 1787 IXGBE_KRM_SGMII_CTRL(hw->bus.lan_id), 1788 IXGBE_SB_IOSF_TARGET_KR_PHY, sval); 1789 if (rc) 1790 return rc; 1791 1792 rc = mac->ops.write_iosf_sb_reg(hw, 1793 IXGBE_KRM_LINK_CTRL_1(hw->bus.lan_id), 1794 IXGBE_SB_IOSF_TARGET_KR_PHY, lval); 1795 if (rc) 1796 return rc; 1797 1798 rc = mac->ops.read_iosf_sb_reg(hw, 1799 IXGBE_KRM_PMD_FLX_MASK_ST20(hw->bus.lan_id), 1800 IXGBE_SB_IOSF_TARGET_KR_PHY, &flx_val); 1801 if (rc) 1802 return rc; 1803 1804 flx_val &= ~IXGBE_KRM_PMD_FLX_MASK_ST20_SPEED_MASK; 1805 flx_val |= IXGBE_KRM_PMD_FLX_MASK_ST20_SPEED_AN; 1806 flx_val &= ~IXGBE_KRM_PMD_FLX_MASK_ST20_AN_EN; 1807 flx_val |= IXGBE_KRM_PMD_FLX_MASK_ST20_SGMII_EN; 1808 flx_val |= IXGBE_KRM_PMD_FLX_MASK_ST20_AN37_EN; 1809 1810 rc = mac->ops.write_iosf_sb_reg(hw, 1811 IXGBE_KRM_PMD_FLX_MASK_ST20(hw->bus.lan_id), 1812 IXGBE_SB_IOSF_TARGET_KR_PHY, flx_val); 1813 if (rc) 1814 return rc; 1815 1816 rc = ixgbe_restart_an_internal_phy_x550em(hw); 1817 1818 return hw->phy.ops.setup_link_speed(hw, speed, autoneg_wait); 1819 } 1820 1821 /** 1822 * ixgbe_init_mac_link_ops_X550em - init mac link function pointers 1823 * @hw: pointer to hardware structure 1824 */ 1825 void ixgbe_init_mac_link_ops_X550em(struct ixgbe_hw *hw) 1826 { 1827 struct ixgbe_mac_info *mac = &hw->mac; 1828 1829 DEBUGFUNC("ixgbe_init_mac_link_ops_X550em"); 1830 1831 switch (hw->mac.ops.get_media_type(hw)) { 1832 case ixgbe_media_type_fiber: 1833 /* CS4227 does not support autoneg, so disable the laser control 1834 * functions for SFP+ fiber 1835 */ 1836 mac->ops.disable_tx_laser = NULL; 1837 mac->ops.enable_tx_laser = NULL; 1838 mac->ops.flap_tx_laser = NULL; 1839 mac->ops.setup_link = ixgbe_setup_mac_link_multispeed_fiber; 1840 mac->ops.set_rate_select_speed = 1841 ixgbe_set_soft_rate_select_speed; 1842 1843 if ((hw->device_id == IXGBE_DEV_ID_X550EM_A_SFP_N) || 1844 (hw->device_id == IXGBE_DEV_ID_X550EM_A_SFP)) 1845 mac->ops.setup_mac_link = 1846 ixgbe_setup_mac_link_sfp_x550a; 1847 else 1848 mac->ops.setup_mac_link = 1849 ixgbe_setup_mac_link_sfp_x550em; 1850 break; 1851 case ixgbe_media_type_copper: 1852 if (hw->device_id == IXGBE_DEV_ID_X550EM_X_1G_T) 1853 break; 1854 if (hw->mac.type == ixgbe_mac_X550EM_a) { 1855 if (hw->device_id == IXGBE_DEV_ID_X550EM_A_1G_T || 1856 hw->device_id == IXGBE_DEV_ID_X550EM_A_1G_T_L) { 1857 mac->ops.setup_link = ixgbe_setup_sgmii_fw; 1858 mac->ops.check_link = 1859 ixgbe_check_mac_link_generic; 1860 } else { 1861 mac->ops.setup_link = 1862 ixgbe_setup_mac_link_t_X550em; 1863 } 1864 } else { 1865 mac->ops.setup_link = ixgbe_setup_mac_link_t_X550em; 1866 mac->ops.check_link = ixgbe_check_link_t_X550em; 1867 } 1868 break; 1869 case ixgbe_media_type_backplane: 1870 if (hw->device_id == IXGBE_DEV_ID_X550EM_A_SGMII || 1871 hw->device_id == IXGBE_DEV_ID_X550EM_A_SGMII_L) 1872 mac->ops.setup_link = ixgbe_setup_sgmii; 1873 break; 1874 default: 1875 break; 1876 } 1877 } 1878 1879 /** 1880 * ixgbe_get_link_capabilities_x550em - Determines link capabilities 1881 * @hw: pointer to hardware structure 1882 * @speed: pointer to link speed 1883 * @autoneg: true when autoneg or autotry is enabled 1884 */ 1885 s32 ixgbe_get_link_capabilities_X550em(struct ixgbe_hw *hw, 1886 ixgbe_link_speed *speed, 1887 bool *autoneg) 1888 { 1889 DEBUGFUNC("ixgbe_get_link_capabilities_X550em"); 1890 1891 1892 if (hw->phy.type == ixgbe_phy_fw) { 1893 *autoneg = true; 1894 *speed = hw->phy.speeds_supported; 1895 return 0; 1896 } 1897 1898 /* SFP */ 1899 if (hw->phy.media_type == ixgbe_media_type_fiber) { 1900 1901 /* CS4227 SFP must not enable auto-negotiation */ 1902 *autoneg = false; 1903 1904 /* Check if 1G SFP module. */ 1905 if (hw->phy.sfp_type == ixgbe_sfp_type_1g_sx_core0 || 1906 hw->phy.sfp_type == ixgbe_sfp_type_1g_sx_core1 1907 || hw->phy.sfp_type == ixgbe_sfp_type_1g_lx_core0 || 1908 hw->phy.sfp_type == ixgbe_sfp_type_1g_lx_core1) { 1909 *speed = IXGBE_LINK_SPEED_1GB_FULL; 1910 return IXGBE_SUCCESS; 1911 } 1912 1913 /* Link capabilities are based on SFP */ 1914 if (hw->phy.multispeed_fiber) 1915 *speed = IXGBE_LINK_SPEED_10GB_FULL | 1916 IXGBE_LINK_SPEED_1GB_FULL; 1917 else 1918 *speed = IXGBE_LINK_SPEED_10GB_FULL; 1919 } else { 1920 *autoneg = true; 1921 1922 switch (hw->phy.type) { 1923 case ixgbe_phy_x550em_xfi: 1924 *speed = IXGBE_LINK_SPEED_1GB_FULL | 1925 IXGBE_LINK_SPEED_10GB_FULL; 1926 *autoneg = false; 1927 break; 1928 case ixgbe_phy_ext_1g_t: 1929 case ixgbe_phy_sgmii: 1930 *speed = IXGBE_LINK_SPEED_1GB_FULL; 1931 break; 1932 case ixgbe_phy_x550em_kr: 1933 if (hw->mac.type == ixgbe_mac_X550EM_a) { 1934 /* check different backplane modes */ 1935 if (hw->phy.nw_mng_if_sel & 1936 IXGBE_NW_MNG_IF_SEL_PHY_SPEED_2_5G) { 1937 *speed = IXGBE_LINK_SPEED_2_5GB_FULL; 1938 break; 1939 } else if (hw->device_id == 1940 IXGBE_DEV_ID_X550EM_A_KR_L) { 1941 *speed = IXGBE_LINK_SPEED_1GB_FULL; 1942 break; 1943 } 1944 } 1945 /* fall through */ 1946 default: 1947 *speed = IXGBE_LINK_SPEED_10GB_FULL | 1948 IXGBE_LINK_SPEED_1GB_FULL; 1949 break; 1950 } 1951 } 1952 1953 return IXGBE_SUCCESS; 1954 } 1955 1956 /** 1957 * ixgbe_get_lasi_ext_t_x550em - Determime external Base T PHY interrupt cause 1958 * @hw: pointer to hardware structure 1959 * @lsc: pointer to boolean flag which indicates whether external Base T 1960 * PHY interrupt is lsc 1961 * 1962 * Determime if external Base T PHY interrupt cause is high temperature 1963 * failure alarm or link status change. 1964 * 1965 * Return IXGBE_ERR_OVERTEMP if interrupt is high temperature 1966 * failure alarm, else return PHY access status. 1967 */ 1968 static s32 ixgbe_get_lasi_ext_t_x550em(struct ixgbe_hw *hw, bool *lsc) 1969 { 1970 u32 status; 1971 u16 reg; 1972 1973 *lsc = false; 1974 1975 /* Vendor alarm triggered */ 1976 status = hw->phy.ops.read_reg(hw, IXGBE_MDIO_GLOBAL_CHIP_STD_INT_FLAG, 1977 IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE, 1978 ®); 1979 1980 if (status != IXGBE_SUCCESS || 1981 !(reg & IXGBE_MDIO_GLOBAL_VEN_ALM_INT_EN)) 1982 return status; 1983 1984 /* Vendor Auto-Neg alarm triggered or Global alarm 1 triggered */ 1985 status = hw->phy.ops.read_reg(hw, IXGBE_MDIO_GLOBAL_INT_CHIP_VEN_FLAG, 1986 IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE, 1987 ®); 1988 1989 if (status != IXGBE_SUCCESS || 1990 !(reg & (IXGBE_MDIO_GLOBAL_AN_VEN_ALM_INT_EN | 1991 IXGBE_MDIO_GLOBAL_ALARM_1_INT))) 1992 return status; 1993 1994 /* Global alarm triggered */ 1995 status = hw->phy.ops.read_reg(hw, IXGBE_MDIO_GLOBAL_ALARM_1, 1996 IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE, 1997 ®); 1998 1999 if (status != IXGBE_SUCCESS) 2000 return status; 2001 2002 /* If high temperature failure, then return over temp error and exit */ 2003 if (reg & IXGBE_MDIO_GLOBAL_ALM_1_HI_TMP_FAIL) { 2004 /* power down the PHY in case the PHY FW didn't already */ 2005 ixgbe_set_copper_phy_power(hw, false); 2006 return IXGBE_ERR_OVERTEMP; 2007 } else if (reg & IXGBE_MDIO_GLOBAL_ALM_1_DEV_FAULT) { 2008 /* device fault alarm triggered */ 2009 status = hw->phy.ops.read_reg(hw, IXGBE_MDIO_GLOBAL_FAULT_MSG, 2010 IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE, 2011 ®); 2012 2013 if (status != IXGBE_SUCCESS) 2014 return status; 2015 2016 /* if device fault was due to high temp alarm handle and exit */ 2017 if (reg == IXGBE_MDIO_GLOBAL_FAULT_MSG_HI_TMP) { 2018 /* power down the PHY in case the PHY FW didn't */ 2019 ixgbe_set_copper_phy_power(hw, false); 2020 return IXGBE_ERR_OVERTEMP; 2021 } 2022 } 2023 2024 /* Vendor alarm 2 triggered */ 2025 status = hw->phy.ops.read_reg(hw, IXGBE_MDIO_GLOBAL_CHIP_STD_INT_FLAG, 2026 IXGBE_MDIO_AUTO_NEG_DEV_TYPE, ®); 2027 2028 if (status != IXGBE_SUCCESS || 2029 !(reg & IXGBE_MDIO_GLOBAL_STD_ALM2_INT)) 2030 return status; 2031 2032 /* link connect/disconnect event occurred */ 2033 status = hw->phy.ops.read_reg(hw, IXGBE_MDIO_AUTO_NEG_VENDOR_TX_ALARM2, 2034 IXGBE_MDIO_AUTO_NEG_DEV_TYPE, ®); 2035 2036 if (status != IXGBE_SUCCESS) 2037 return status; 2038 2039 /* Indicate LSC */ 2040 if (reg & IXGBE_MDIO_AUTO_NEG_VEN_LSC) 2041 *lsc = true; 2042 2043 return IXGBE_SUCCESS; 2044 } 2045 2046 /** 2047 * ixgbe_enable_lasi_ext_t_x550em - Enable external Base T PHY interrupts 2048 * @hw: pointer to hardware structure 2049 * 2050 * Enable link status change and temperature failure alarm for the external 2051 * Base T PHY 2052 * 2053 * Returns PHY access status 2054 */ 2055 static s32 ixgbe_enable_lasi_ext_t_x550em(struct ixgbe_hw *hw) 2056 { 2057 u32 status; 2058 u16 reg; 2059 bool lsc; 2060 2061 /* Clear interrupt flags */ 2062 status = ixgbe_get_lasi_ext_t_x550em(hw, &lsc); 2063 2064 /* Enable link status change alarm */ 2065 2066 /* Enable the LASI interrupts on X552 devices to receive notifications 2067 * of the link configurations of the external PHY and correspondingly 2068 * support the configuration of the internal iXFI link, since iXFI does 2069 * not support auto-negotiation. This is not required for X553 devices 2070 * having KR support, which performs auto-negotiations and which is used 2071 * as the internal link to the external PHY. Hence adding a check here 2072 * to avoid enabling LASI interrupts for X553 devices. 2073 */ 2074 if (hw->mac.type != ixgbe_mac_X550EM_a) { 2075 status = hw->phy.ops.read_reg(hw, 2076 IXGBE_MDIO_PMA_TX_VEN_LASI_INT_MASK, 2077 IXGBE_MDIO_AUTO_NEG_DEV_TYPE, ®); 2078 2079 if (status != IXGBE_SUCCESS) 2080 return status; 2081 2082 reg |= IXGBE_MDIO_PMA_TX_VEN_LASI_INT_EN; 2083 2084 status = hw->phy.ops.write_reg(hw, 2085 IXGBE_MDIO_PMA_TX_VEN_LASI_INT_MASK, 2086 IXGBE_MDIO_AUTO_NEG_DEV_TYPE, reg); 2087 2088 if (status != IXGBE_SUCCESS) 2089 return status; 2090 } 2091 2092 /* Enable high temperature failure and global fault alarms */ 2093 status = hw->phy.ops.read_reg(hw, IXGBE_MDIO_GLOBAL_INT_MASK, 2094 IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE, 2095 ®); 2096 2097 if (status != IXGBE_SUCCESS) 2098 return status; 2099 2100 reg |= (IXGBE_MDIO_GLOBAL_INT_HI_TEMP_EN | 2101 IXGBE_MDIO_GLOBAL_INT_DEV_FAULT_EN); 2102 2103 status = hw->phy.ops.write_reg(hw, IXGBE_MDIO_GLOBAL_INT_MASK, 2104 IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE, 2105 reg); 2106 2107 if (status != IXGBE_SUCCESS) 2108 return status; 2109 2110 /* Enable vendor Auto-Neg alarm and Global Interrupt Mask 1 alarm */ 2111 status = hw->phy.ops.read_reg(hw, IXGBE_MDIO_GLOBAL_INT_CHIP_VEN_MASK, 2112 IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE, 2113 ®); 2114 2115 if (status != IXGBE_SUCCESS) 2116 return status; 2117 2118 reg |= (IXGBE_MDIO_GLOBAL_AN_VEN_ALM_INT_EN | 2119 IXGBE_MDIO_GLOBAL_ALARM_1_INT); 2120 2121 status = hw->phy.ops.write_reg(hw, IXGBE_MDIO_GLOBAL_INT_CHIP_VEN_MASK, 2122 IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE, 2123 reg); 2124 2125 if (status != IXGBE_SUCCESS) 2126 return status; 2127 2128 /* Enable chip-wide vendor alarm */ 2129 status = hw->phy.ops.read_reg(hw, IXGBE_MDIO_GLOBAL_INT_CHIP_STD_MASK, 2130 IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE, 2131 ®); 2132 2133 if (status != IXGBE_SUCCESS) 2134 return status; 2135 2136 reg |= IXGBE_MDIO_GLOBAL_VEN_ALM_INT_EN; 2137 2138 status = hw->phy.ops.write_reg(hw, IXGBE_MDIO_GLOBAL_INT_CHIP_STD_MASK, 2139 IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE, 2140 reg); 2141 2142 return status; 2143 } 2144 2145 /** 2146 * ixgbe_setup_kr_speed_x550em - Configure the KR PHY for link speed. 2147 * @hw: pointer to hardware structure 2148 * @speed: link speed 2149 * 2150 * Configures the integrated KR PHY. 2151 **/ 2152 static s32 ixgbe_setup_kr_speed_x550em(struct ixgbe_hw *hw, 2153 ixgbe_link_speed speed) 2154 { 2155 s32 status; 2156 u32 reg_val; 2157 2158 status = hw->mac.ops.read_iosf_sb_reg(hw, 2159 IXGBE_KRM_LINK_CTRL_1(hw->bus.lan_id), 2160 IXGBE_SB_IOSF_TARGET_KR_PHY, ®_val); 2161 if (status) 2162 return status; 2163 2164 reg_val |= IXGBE_KRM_LINK_CTRL_1_TETH_AN_ENABLE; 2165 reg_val &= ~(IXGBE_KRM_LINK_CTRL_1_TETH_AN_CAP_KR | 2166 IXGBE_KRM_LINK_CTRL_1_TETH_AN_CAP_KX); 2167 2168 /* Advertise 10G support. */ 2169 if (speed & IXGBE_LINK_SPEED_10GB_FULL) 2170 reg_val |= IXGBE_KRM_LINK_CTRL_1_TETH_AN_CAP_KR; 2171 2172 /* Advertise 1G support. */ 2173 if (speed & IXGBE_LINK_SPEED_1GB_FULL) 2174 reg_val |= IXGBE_KRM_LINK_CTRL_1_TETH_AN_CAP_KX; 2175 2176 status = hw->mac.ops.write_iosf_sb_reg(hw, 2177 IXGBE_KRM_LINK_CTRL_1(hw->bus.lan_id), 2178 IXGBE_SB_IOSF_TARGET_KR_PHY, reg_val); 2179 2180 if (hw->mac.type == ixgbe_mac_X550EM_a) { 2181 /* Set lane mode to KR auto negotiation */ 2182 status = hw->mac.ops.read_iosf_sb_reg(hw, 2183 IXGBE_KRM_PMD_FLX_MASK_ST20(hw->bus.lan_id), 2184 IXGBE_SB_IOSF_TARGET_KR_PHY, ®_val); 2185 2186 if (status) 2187 return status; 2188 2189 reg_val &= ~IXGBE_KRM_PMD_FLX_MASK_ST20_SPEED_MASK; 2190 reg_val |= IXGBE_KRM_PMD_FLX_MASK_ST20_SPEED_AN; 2191 reg_val |= IXGBE_KRM_PMD_FLX_MASK_ST20_AN_EN; 2192 reg_val &= ~IXGBE_KRM_PMD_FLX_MASK_ST20_AN37_EN; 2193 reg_val &= ~IXGBE_KRM_PMD_FLX_MASK_ST20_SGMII_EN; 2194 2195 status = hw->mac.ops.write_iosf_sb_reg(hw, 2196 IXGBE_KRM_PMD_FLX_MASK_ST20(hw->bus.lan_id), 2197 IXGBE_SB_IOSF_TARGET_KR_PHY, reg_val); 2198 } 2199 2200 return ixgbe_restart_an_internal_phy_x550em(hw); 2201 } 2202 2203 /** 2204 * ixgbe_reset_phy_fw - Reset firmware-controlled PHYs 2205 * @hw: pointer to hardware structure 2206 */ 2207 static s32 ixgbe_reset_phy_fw(struct ixgbe_hw *hw) 2208 { 2209 u32 store[FW_PHY_ACT_DATA_COUNT] = { 0 }; 2210 s32 rc; 2211 2212 if (hw->phy.reset_disable || ixgbe_check_reset_blocked(hw)) 2213 return IXGBE_SUCCESS; 2214 2215 rc = ixgbe_fw_phy_activity(hw, FW_PHY_ACT_PHY_SW_RESET, &store); 2216 if (rc) 2217 return rc; 2218 memset(store, 0, sizeof(store)); 2219 2220 rc = ixgbe_fw_phy_activity(hw, FW_PHY_ACT_INIT_PHY, &store); 2221 if (rc) 2222 return rc; 2223 2224 return ixgbe_setup_fw_link(hw); 2225 } 2226 2227 /** 2228 * ixgbe_check_overtemp_fw - Check firmware-controlled PHYs for overtemp 2229 * @hw: pointer to hardware structure 2230 */ 2231 static s32 ixgbe_check_overtemp_fw(struct ixgbe_hw *hw) 2232 { 2233 u32 store[FW_PHY_ACT_DATA_COUNT] = { 0 }; 2234 s32 rc; 2235 2236 rc = ixgbe_fw_phy_activity(hw, FW_PHY_ACT_GET_LINK_INFO, &store); 2237 if (rc) 2238 return rc; 2239 2240 if (store[0] & FW_PHY_ACT_GET_LINK_INFO_TEMP) { 2241 ixgbe_shutdown_fw_phy(hw); 2242 return IXGBE_ERR_OVERTEMP; 2243 } 2244 return IXGBE_SUCCESS; 2245 } 2246 2247 /** 2248 * ixgbe_read_mng_if_sel_x550em - Read NW_MNG_IF_SEL register 2249 * @hw: pointer to hardware structure 2250 * 2251 * Read NW_MNG_IF_SEL register and save field values, and check for valid field 2252 * values. 2253 **/ 2254 static s32 ixgbe_read_mng_if_sel_x550em(struct ixgbe_hw *hw) 2255 { 2256 /* Save NW management interface connected on board. This is used 2257 * to determine internal PHY mode. 2258 */ 2259 hw->phy.nw_mng_if_sel = IXGBE_READ_REG(hw, IXGBE_NW_MNG_IF_SEL); 2260 2261 /* If X552 (X550EM_a) and MDIO is connected to external PHY, then set 2262 * PHY address. This register field was has only been used for X552. 2263 */ 2264 if (hw->mac.type == ixgbe_mac_X550EM_a && 2265 hw->phy.nw_mng_if_sel & IXGBE_NW_MNG_IF_SEL_MDIO_ACT) { 2266 hw->phy.addr = (hw->phy.nw_mng_if_sel & 2267 IXGBE_NW_MNG_IF_SEL_MDIO_PHY_ADD) >> 2268 IXGBE_NW_MNG_IF_SEL_MDIO_PHY_ADD_SHIFT; 2269 } 2270 2271 return IXGBE_SUCCESS; 2272 } 2273 2274 /** 2275 * ixgbe_init_phy_ops_X550em - PHY/SFP specific init 2276 * @hw: pointer to hardware structure 2277 * 2278 * Initialize any function pointers that were not able to be 2279 * set during init_shared_code because the PHY/SFP type was 2280 * not known. Perform the SFP init if necessary. 2281 */ 2282 s32 ixgbe_init_phy_ops_X550em(struct ixgbe_hw *hw) 2283 { 2284 struct ixgbe_phy_info *phy = &hw->phy; 2285 s32 ret_val; 2286 2287 DEBUGFUNC("ixgbe_init_phy_ops_X550em"); 2288 2289 hw->mac.ops.set_lan_id(hw); 2290 ixgbe_read_mng_if_sel_x550em(hw); 2291 2292 if (hw->mac.ops.get_media_type(hw) == ixgbe_media_type_fiber) { 2293 phy->phy_semaphore_mask = IXGBE_GSSR_SHARED_I2C_SM; 2294 ixgbe_setup_mux_ctl(hw); 2295 phy->ops.identify_sfp = ixgbe_identify_sfp_module_X550em; 2296 } 2297 2298 switch (hw->device_id) { 2299 case IXGBE_DEV_ID_X550EM_A_1G_T: 2300 case IXGBE_DEV_ID_X550EM_A_1G_T_L: 2301 phy->ops.read_reg_mdi = NULL; 2302 phy->ops.write_reg_mdi = NULL; 2303 hw->phy.ops.read_reg = NULL; 2304 hw->phy.ops.write_reg = NULL; 2305 phy->ops.check_overtemp = ixgbe_check_overtemp_fw; 2306 if (hw->bus.lan_id) 2307 hw->phy.phy_semaphore_mask |= IXGBE_GSSR_PHY1_SM; 2308 else 2309 hw->phy.phy_semaphore_mask |= IXGBE_GSSR_PHY0_SM; 2310 2311 break; 2312 case IXGBE_DEV_ID_X550EM_A_10G_T: 2313 case IXGBE_DEV_ID_X550EM_A_SFP: 2314 hw->phy.ops.read_reg = ixgbe_read_phy_reg_x550a; 2315 hw->phy.ops.write_reg = ixgbe_write_phy_reg_x550a; 2316 if (hw->bus.lan_id) 2317 hw->phy.phy_semaphore_mask |= IXGBE_GSSR_PHY1_SM; 2318 else 2319 hw->phy.phy_semaphore_mask |= IXGBE_GSSR_PHY0_SM; 2320 break; 2321 case IXGBE_DEV_ID_X550EM_X_SFP: 2322 /* set up for CS4227 usage */ 2323 hw->phy.phy_semaphore_mask = IXGBE_GSSR_SHARED_I2C_SM; 2324 break; 2325 case IXGBE_DEV_ID_X550EM_X_1G_T: 2326 phy->ops.read_reg_mdi = NULL; 2327 phy->ops.write_reg_mdi = NULL; 2328 default: 2329 break; 2330 } 2331 2332 /* Identify the PHY or SFP module */ 2333 ret_val = phy->ops.identify(hw); 2334 if (ret_val == IXGBE_ERR_SFP_NOT_SUPPORTED || 2335 ret_val == IXGBE_ERR_PHY_ADDR_INVALID) 2336 return ret_val; 2337 2338 /* Setup function pointers based on detected hardware */ 2339 ixgbe_init_mac_link_ops_X550em(hw); 2340 if (phy->sfp_type != ixgbe_sfp_type_unknown) 2341 phy->ops.reset = NULL; 2342 2343 /* Set functions pointers based on phy type */ 2344 switch (hw->phy.type) { 2345 case ixgbe_phy_x550em_kx4: 2346 phy->ops.setup_link = NULL; 2347 phy->ops.read_reg = ixgbe_read_phy_reg_x550em; 2348 phy->ops.write_reg = ixgbe_write_phy_reg_x550em; 2349 break; 2350 case ixgbe_phy_x550em_kr: 2351 phy->ops.setup_link = ixgbe_setup_kr_x550em; 2352 phy->ops.read_reg = ixgbe_read_phy_reg_x550em; 2353 phy->ops.write_reg = ixgbe_write_phy_reg_x550em; 2354 break; 2355 case ixgbe_phy_ext_1g_t: 2356 /* link is managed by FW */ 2357 phy->ops.setup_link = NULL; 2358 phy->ops.reset = NULL; 2359 break; 2360 case ixgbe_phy_x550em_xfi: 2361 /* link is managed by HW */ 2362 phy->ops.setup_link = NULL; 2363 phy->ops.read_reg = ixgbe_read_phy_reg_x550em; 2364 phy->ops.write_reg = ixgbe_write_phy_reg_x550em; 2365 break; 2366 case ixgbe_phy_x550em_ext_t: 2367 /* If internal link mode is XFI, then setup iXFI internal link, 2368 * else setup KR now. 2369 */ 2370 phy->ops.setup_internal_link = 2371 ixgbe_setup_internal_phy_t_x550em; 2372 2373 /* setup SW LPLU only for first revision of X550EM_x */ 2374 if ((hw->mac.type == ixgbe_mac_X550EM_x) && 2375 !(IXGBE_FUSES0_REV_MASK & 2376 IXGBE_READ_REG(hw, IXGBE_FUSES0_GROUP(0)))) 2377 phy->ops.enter_lplu = ixgbe_enter_lplu_t_x550em; 2378 2379 phy->ops.handle_lasi = ixgbe_handle_lasi_ext_t_x550em; 2380 phy->ops.reset = ixgbe_reset_phy_t_X550em; 2381 break; 2382 case ixgbe_phy_sgmii: 2383 phy->ops.setup_link = NULL; 2384 break; 2385 case ixgbe_phy_fw: 2386 phy->ops.setup_link = ixgbe_setup_fw_link; 2387 phy->ops.reset = ixgbe_reset_phy_fw; 2388 break; 2389 default: 2390 break; 2391 } 2392 return ret_val; 2393 } 2394 2395 /** 2396 * ixgbe_set_mdio_speed - Set MDIO clock speed 2397 * @hw: pointer to hardware structure 2398 */ 2399 static void ixgbe_set_mdio_speed(struct ixgbe_hw *hw) 2400 { 2401 u32 hlreg0; 2402 2403 switch (hw->device_id) { 2404 case IXGBE_DEV_ID_X550EM_X_10G_T: 2405 case IXGBE_DEV_ID_X550EM_A_SGMII: 2406 case IXGBE_DEV_ID_X550EM_A_SGMII_L: 2407 case IXGBE_DEV_ID_X550EM_A_10G_T: 2408 case IXGBE_DEV_ID_X550EM_A_SFP: 2409 case IXGBE_DEV_ID_X550EM_A_QSFP: 2410 /* Config MDIO clock speed before the first MDIO PHY access */ 2411 hlreg0 = IXGBE_READ_REG(hw, IXGBE_HLREG0); 2412 hlreg0 &= ~IXGBE_HLREG0_MDCSPD; 2413 IXGBE_WRITE_REG(hw, IXGBE_HLREG0, hlreg0); 2414 break; 2415 case IXGBE_DEV_ID_X550EM_A_1G_T: 2416 case IXGBE_DEV_ID_X550EM_A_1G_T_L: 2417 /* Select fast MDIO clock speed for these devices */ 2418 hlreg0 = IXGBE_READ_REG(hw, IXGBE_HLREG0); 2419 hlreg0 |= IXGBE_HLREG0_MDCSPD; 2420 IXGBE_WRITE_REG(hw, IXGBE_HLREG0, hlreg0); 2421 break; 2422 default: 2423 break; 2424 } 2425 } 2426 2427 /** 2428 * ixgbe_reset_hw_X550em - Perform hardware reset 2429 * @hw: pointer to hardware structure 2430 * 2431 * Resets the hardware by resetting the transmit and receive units, masks 2432 * and clears all interrupts, perform a PHY reset, and perform a link (MAC) 2433 * reset. 2434 */ 2435 s32 ixgbe_reset_hw_X550em(struct ixgbe_hw *hw) 2436 { 2437 ixgbe_link_speed link_speed; 2438 s32 status; 2439 u32 ctrl = 0; 2440 u32 i; 2441 bool link_up = false; 2442 u32 swfw_mask = hw->phy.phy_semaphore_mask; 2443 2444 DEBUGFUNC("ixgbe_reset_hw_X550em"); 2445 2446 /* Call adapter stop to disable Tx/Rx and clear interrupts */ 2447 status = hw->mac.ops.stop_adapter(hw); 2448 if (status != IXGBE_SUCCESS) { 2449 DEBUGOUT1("Failed to stop adapter, STATUS = %d\n", status); 2450 return status; 2451 } 2452 /* flush pending Tx transactions */ 2453 ixgbe_clear_tx_pending(hw); 2454 2455 ixgbe_set_mdio_speed(hw); 2456 2457 /* PHY ops must be identified and initialized prior to reset */ 2458 status = hw->phy.ops.init(hw); 2459 2460 if (status) 2461 DEBUGOUT1("Failed to initialize PHY ops, STATUS = %d\n", 2462 status); 2463 2464 if (status == IXGBE_ERR_SFP_NOT_SUPPORTED || 2465 status == IXGBE_ERR_PHY_ADDR_INVALID) { 2466 DEBUGOUT("Returning from reset HW due to PHY init failure\n"); 2467 return status; 2468 } 2469 2470 /* start the external PHY */ 2471 if (hw->phy.type == ixgbe_phy_x550em_ext_t) { 2472 status = ixgbe_init_ext_t_x550em(hw); 2473 if (status) { 2474 DEBUGOUT1("Failed to start the external PHY, STATUS = %d\n", 2475 status); 2476 return status; 2477 } 2478 } 2479 2480 /* Setup SFP module if there is one present. */ 2481 if (hw->phy.sfp_setup_needed) { 2482 status = hw->mac.ops.setup_sfp(hw); 2483 hw->phy.sfp_setup_needed = false; 2484 } 2485 2486 if (status == IXGBE_ERR_SFP_NOT_SUPPORTED) 2487 return status; 2488 2489 /* Reset PHY */ 2490 if (!hw->phy.reset_disable && hw->phy.ops.reset) { 2491 if (hw->phy.ops.reset(hw) == IXGBE_ERR_OVERTEMP) 2492 return IXGBE_ERR_OVERTEMP; 2493 } 2494 2495 mac_reset_top: 2496 /* Issue global reset to the MAC. Needs to be SW reset if link is up. 2497 * If link reset is used when link is up, it might reset the PHY when 2498 * mng is using it. If link is down or the flag to force full link 2499 * reset is set, then perform link reset. 2500 */ 2501 ctrl = IXGBE_CTRL_LNK_RST; 2502 if (!hw->force_full_reset) { 2503 hw->mac.ops.check_link(hw, &link_speed, &link_up, false); 2504 if (link_up) 2505 ctrl = IXGBE_CTRL_RST; 2506 } 2507 2508 status = hw->mac.ops.acquire_swfw_sync(hw, swfw_mask); 2509 if (status != IXGBE_SUCCESS) { 2510 ERROR_REPORT2(IXGBE_ERROR_CAUTION, 2511 "semaphore failed with %d", status); 2512 return IXGBE_ERR_SWFW_SYNC; 2513 } 2514 ctrl |= IXGBE_READ_REG(hw, IXGBE_CTRL); 2515 IXGBE_WRITE_REG(hw, IXGBE_CTRL, ctrl); 2516 IXGBE_WRITE_FLUSH(hw); 2517 hw->mac.ops.release_swfw_sync(hw, swfw_mask); 2518 2519 /* Poll for reset bit to self-clear meaning reset is complete */ 2520 for (i = 0; i < 10; i++) { 2521 usec_delay(1); 2522 ctrl = IXGBE_READ_REG(hw, IXGBE_CTRL); 2523 if (!(ctrl & IXGBE_CTRL_RST_MASK)) 2524 break; 2525 } 2526 2527 if (ctrl & IXGBE_CTRL_RST_MASK) { 2528 status = IXGBE_ERR_RESET_FAILED; 2529 DEBUGOUT("Reset polling failed to complete.\n"); 2530 } 2531 2532 msec_delay(50); 2533 2534 /* Double resets are required for recovery from certain error 2535 * conditions. Between resets, it is necessary to stall to 2536 * allow time for any pending HW events to complete. 2537 */ 2538 if (hw->mac.flags & IXGBE_FLAGS_DOUBLE_RESET_REQUIRED) { 2539 hw->mac.flags &= ~IXGBE_FLAGS_DOUBLE_RESET_REQUIRED; 2540 goto mac_reset_top; 2541 } 2542 2543 /* Store the permanent mac address */ 2544 hw->mac.ops.get_mac_addr(hw, hw->mac.perm_addr); 2545 2546 /* Store MAC address from RAR0, clear receive address registers, and 2547 * clear the multicast table. Also reset num_rar_entries to 128, 2548 * since we modify this value when programming the SAN MAC address. 2549 */ 2550 hw->mac.num_rar_entries = 128; 2551 hw->mac.ops.init_rx_addrs(hw); 2552 2553 ixgbe_set_mdio_speed(hw); 2554 2555 if (hw->device_id == IXGBE_DEV_ID_X550EM_X_SFP) 2556 ixgbe_setup_mux_ctl(hw); 2557 2558 if (status != IXGBE_SUCCESS) 2559 DEBUGOUT1("Reset HW failed, STATUS = %d\n", status); 2560 2561 return status; 2562 } 2563 2564 /** 2565 * ixgbe_init_ext_t_x550em - Start (unstall) the external Base T PHY. 2566 * @hw: pointer to hardware structure 2567 */ 2568 s32 ixgbe_init_ext_t_x550em(struct ixgbe_hw *hw) 2569 { 2570 u32 status; 2571 u16 reg; 2572 2573 status = hw->phy.ops.read_reg(hw, 2574 IXGBE_MDIO_TX_VENDOR_ALARMS_3, 2575 IXGBE_MDIO_PMA_PMD_DEV_TYPE, 2576 ®); 2577 2578 if (status != IXGBE_SUCCESS) 2579 return status; 2580 2581 /* If PHY FW reset completed bit is set then this is the first 2582 * SW instance after a power on so the PHY FW must be un-stalled. 2583 */ 2584 if (reg & IXGBE_MDIO_TX_VENDOR_ALARMS_3_RST_MASK) { 2585 status = hw->phy.ops.read_reg(hw, 2586 IXGBE_MDIO_GLOBAL_RES_PR_10, 2587 IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE, 2588 ®); 2589 2590 if (status != IXGBE_SUCCESS) 2591 return status; 2592 2593 reg &= ~IXGBE_MDIO_POWER_UP_STALL; 2594 2595 status = hw->phy.ops.write_reg(hw, 2596 IXGBE_MDIO_GLOBAL_RES_PR_10, 2597 IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE, 2598 reg); 2599 2600 if (status != IXGBE_SUCCESS) 2601 return status; 2602 } 2603 2604 return status; 2605 } 2606 2607 /** 2608 * ixgbe_setup_kr_x550em - Configure the KR PHY. 2609 * @hw: pointer to hardware structure 2610 **/ 2611 s32 ixgbe_setup_kr_x550em(struct ixgbe_hw *hw) 2612 { 2613 /* leave link alone for 2.5G */ 2614 if (hw->phy.autoneg_advertised & IXGBE_LINK_SPEED_2_5GB_FULL) 2615 return IXGBE_SUCCESS; 2616 2617 if (ixgbe_check_reset_blocked(hw)) 2618 return 0; 2619 2620 return ixgbe_setup_kr_speed_x550em(hw, hw->phy.autoneg_advertised); 2621 } 2622 2623 /** 2624 * ixgbe_setup_mac_link_sfp_x550em - Setup internal/external the PHY for SFP 2625 * @hw: pointer to hardware structure 2626 * @speed: new link speed 2627 * @autoneg_wait_to_complete: unused 2628 * 2629 * Configure the external PHY and the integrated KR PHY for SFP support. 2630 **/ 2631 s32 ixgbe_setup_mac_link_sfp_x550em(struct ixgbe_hw *hw, 2632 ixgbe_link_speed speed, 2633 bool autoneg_wait_to_complete) 2634 { 2635 s32 ret_val; 2636 u16 reg_slice, reg_val; 2637 bool setup_linear = false; 2638 UNREFERENCED_1PARAMETER(autoneg_wait_to_complete); 2639 2640 /* Check if SFP module is supported and linear */ 2641 ret_val = ixgbe_supported_sfp_modules_X550em(hw, &setup_linear); 2642 2643 /* If no SFP module present, then return success. Return success since 2644 * there is no reason to configure CS4227 and SFP not present error is 2645 * not excepted in the setup MAC link flow. 2646 */ 2647 if (ret_val == IXGBE_ERR_SFP_NOT_PRESENT) 2648 return IXGBE_SUCCESS; 2649 2650 if (ret_val != IXGBE_SUCCESS) 2651 return ret_val; 2652 2653 /* Configure internal PHY for KR/KX. */ 2654 ixgbe_setup_kr_speed_x550em(hw, speed); 2655 2656 /* Configure CS4227 LINE side to proper mode. */ 2657 reg_slice = IXGBE_CS4227_LINE_SPARE24_LSB + 2658 (hw->bus.lan_id << 12); 2659 if (setup_linear) 2660 reg_val = (IXGBE_CS4227_EDC_MODE_CX1 << 1) | 0x1; 2661 else 2662 reg_val = (IXGBE_CS4227_EDC_MODE_SR << 1) | 0x1; 2663 ret_val = hw->link.ops.write_link(hw, hw->link.addr, reg_slice, 2664 reg_val); 2665 return ret_val; 2666 } 2667 2668 /** 2669 * ixgbe_setup_sfi_x550a - Configure the internal PHY for native SFI mode 2670 * @hw: pointer to hardware structure 2671 * @speed: the link speed to force 2672 * 2673 * Configures the integrated PHY for native SFI mode. Used to connect the 2674 * internal PHY directly to an SFP cage, without autonegotiation. 2675 **/ 2676 static s32 ixgbe_setup_sfi_x550a(struct ixgbe_hw *hw, ixgbe_link_speed *speed) 2677 { 2678 struct ixgbe_mac_info *mac = &hw->mac; 2679 s32 status; 2680 u32 reg_val; 2681 2682 /* Disable all AN and force speed to 10G Serial. */ 2683 status = mac->ops.read_iosf_sb_reg(hw, 2684 IXGBE_KRM_PMD_FLX_MASK_ST20(hw->bus.lan_id), 2685 IXGBE_SB_IOSF_TARGET_KR_PHY, ®_val); 2686 if (status != IXGBE_SUCCESS) 2687 return status; 2688 2689 reg_val &= ~IXGBE_KRM_PMD_FLX_MASK_ST20_AN_EN; 2690 reg_val &= ~IXGBE_KRM_PMD_FLX_MASK_ST20_AN37_EN; 2691 reg_val &= ~IXGBE_KRM_PMD_FLX_MASK_ST20_SGMII_EN; 2692 reg_val &= ~IXGBE_KRM_PMD_FLX_MASK_ST20_SPEED_MASK; 2693 2694 /* Select forced link speed for internal PHY. */ 2695 switch (*speed) { 2696 case IXGBE_LINK_SPEED_10GB_FULL: 2697 reg_val |= IXGBE_KRM_PMD_FLX_MASK_ST20_SPEED_10G; 2698 break; 2699 case IXGBE_LINK_SPEED_1GB_FULL: 2700 reg_val |= IXGBE_KRM_PMD_FLX_MASK_ST20_SPEED_1G; 2701 break; 2702 default: 2703 /* Other link speeds are not supported by internal PHY. */ 2704 return IXGBE_ERR_LINK_SETUP; 2705 } 2706 2707 status = mac->ops.write_iosf_sb_reg(hw, 2708 IXGBE_KRM_PMD_FLX_MASK_ST20(hw->bus.lan_id), 2709 IXGBE_SB_IOSF_TARGET_KR_PHY, reg_val); 2710 2711 /* Toggle port SW reset by AN reset. */ 2712 status = ixgbe_restart_an_internal_phy_x550em(hw); 2713 2714 return status; 2715 } 2716 2717 /** 2718 * ixgbe_setup_mac_link_sfp_x550a - Setup internal PHY for SFP 2719 * @hw: pointer to hardware structure 2720 * @speed: new link speed 2721 * @autoneg_wait_to_complete: unused 2722 * 2723 * Configure the integrated PHY for SFP support. 2724 **/ 2725 s32 ixgbe_setup_mac_link_sfp_x550a(struct ixgbe_hw *hw, 2726 ixgbe_link_speed speed, 2727 bool autoneg_wait_to_complete) 2728 { 2729 s32 ret_val; 2730 u16 reg_phy_ext; 2731 bool setup_linear = false; 2732 u32 reg_slice, reg_phy_int, slice_offset; 2733 2734 UNREFERENCED_1PARAMETER(autoneg_wait_to_complete); 2735 2736 /* Check if SFP module is supported and linear */ 2737 ret_val = ixgbe_supported_sfp_modules_X550em(hw, &setup_linear); 2738 2739 /* If no SFP module present, then return success. Return success since 2740 * SFP not present error is not excepted in the setup MAC link flow. 2741 */ 2742 if (ret_val == IXGBE_ERR_SFP_NOT_PRESENT) 2743 return IXGBE_SUCCESS; 2744 2745 if (ret_val != IXGBE_SUCCESS) 2746 return ret_val; 2747 2748 if (hw->device_id == IXGBE_DEV_ID_X550EM_A_SFP_N) { 2749 /* Configure internal PHY for native SFI based on module type */ 2750 ret_val = hw->mac.ops.read_iosf_sb_reg(hw, 2751 IXGBE_KRM_PMD_FLX_MASK_ST20(hw->bus.lan_id), 2752 IXGBE_SB_IOSF_TARGET_KR_PHY, ®_phy_int); 2753 2754 if (ret_val != IXGBE_SUCCESS) 2755 return ret_val; 2756 2757 reg_phy_int &= IXGBE_KRM_PMD_FLX_MASK_ST20_SFI_10G_DA; 2758 if (!setup_linear) 2759 reg_phy_int |= IXGBE_KRM_PMD_FLX_MASK_ST20_SFI_10G_SR; 2760 2761 ret_val = hw->mac.ops.write_iosf_sb_reg(hw, 2762 IXGBE_KRM_PMD_FLX_MASK_ST20(hw->bus.lan_id), 2763 IXGBE_SB_IOSF_TARGET_KR_PHY, reg_phy_int); 2764 2765 if (ret_val != IXGBE_SUCCESS) 2766 return ret_val; 2767 2768 /* Setup SFI internal link. */ 2769 ret_val = ixgbe_setup_sfi_x550a(hw, &speed); 2770 } else { 2771 /* Configure internal PHY for KR/KX. */ 2772 ixgbe_setup_kr_speed_x550em(hw, speed); 2773 2774 if (hw->phy.addr == 0x0 || hw->phy.addr == 0xFFFF) { 2775 /* Find Address */ 2776 DEBUGOUT("Invalid NW_MNG_IF_SEL.MDIO_PHY_ADD value\n"); 2777 return IXGBE_ERR_PHY_ADDR_INVALID; 2778 } 2779 2780 /* Get external PHY SKU id */ 2781 ret_val = hw->phy.ops.read_reg(hw, IXGBE_CS4227_EFUSE_PDF_SKU, 2782 IXGBE_MDIO_ZERO_DEV_TYPE, ®_phy_ext); 2783 2784 if (ret_val != IXGBE_SUCCESS) 2785 return ret_val; 2786 2787 /* When configuring quad port CS4223, the MAC instance is part 2788 * of the slice offset. 2789 */ 2790 if (reg_phy_ext == IXGBE_CS4223_SKU_ID) 2791 slice_offset = (hw->bus.lan_id + 2792 (hw->bus.instance_id << 1)) << 12; 2793 else 2794 slice_offset = hw->bus.lan_id << 12; 2795 2796 /* Configure CS4227/CS4223 LINE side to proper mode. */ 2797 reg_slice = IXGBE_CS4227_LINE_SPARE24_LSB + slice_offset; 2798 2799 ret_val = hw->phy.ops.read_reg(hw, reg_slice, 2800 IXGBE_MDIO_ZERO_DEV_TYPE, ®_phy_ext); 2801 2802 if (ret_val != IXGBE_SUCCESS) 2803 return ret_val; 2804 2805 reg_phy_ext &= ~((IXGBE_CS4227_EDC_MODE_CX1 << 1) | 2806 (IXGBE_CS4227_EDC_MODE_SR << 1)); 2807 2808 if (setup_linear) 2809 reg_phy_ext |= (IXGBE_CS4227_EDC_MODE_CX1 << 1) | 0x1; 2810 else 2811 reg_phy_ext |= (IXGBE_CS4227_EDC_MODE_SR << 1) | 0x1; 2812 ret_val = hw->phy.ops.write_reg(hw, reg_slice, 2813 IXGBE_MDIO_ZERO_DEV_TYPE, reg_phy_ext); 2814 2815 /* Flush previous write with a read */ 2816 ret_val = hw->phy.ops.read_reg(hw, reg_slice, 2817 IXGBE_MDIO_ZERO_DEV_TYPE, ®_phy_ext); 2818 } 2819 return ret_val; 2820 } 2821 2822 /** 2823 * ixgbe_setup_ixfi_x550em_x - MAC specific iXFI configuration 2824 * @hw: pointer to hardware structure 2825 * 2826 * iXfI configuration needed for ixgbe_mac_X550EM_x devices. 2827 **/ 2828 static s32 ixgbe_setup_ixfi_x550em_x(struct ixgbe_hw *hw) 2829 { 2830 struct ixgbe_mac_info *mac = &hw->mac; 2831 s32 status; 2832 u32 reg_val; 2833 2834 /* Disable training protocol FSM. */ 2835 status = mac->ops.read_iosf_sb_reg(hw, 2836 IXGBE_KRM_RX_TRN_LINKUP_CTRL(hw->bus.lan_id), 2837 IXGBE_SB_IOSF_TARGET_KR_PHY, ®_val); 2838 if (status != IXGBE_SUCCESS) 2839 return status; 2840 reg_val |= IXGBE_KRM_RX_TRN_LINKUP_CTRL_CONV_WO_PROTOCOL; 2841 status = mac->ops.write_iosf_sb_reg(hw, 2842 IXGBE_KRM_RX_TRN_LINKUP_CTRL(hw->bus.lan_id), 2843 IXGBE_SB_IOSF_TARGET_KR_PHY, reg_val); 2844 if (status != IXGBE_SUCCESS) 2845 return status; 2846 2847 /* Disable Flex from training TXFFE. */ 2848 status = mac->ops.read_iosf_sb_reg(hw, 2849 IXGBE_KRM_DSP_TXFFE_STATE_4(hw->bus.lan_id), 2850 IXGBE_SB_IOSF_TARGET_KR_PHY, ®_val); 2851 if (status != IXGBE_SUCCESS) 2852 return status; 2853 reg_val &= ~IXGBE_KRM_DSP_TXFFE_STATE_C0_EN; 2854 reg_val &= ~IXGBE_KRM_DSP_TXFFE_STATE_CP1_CN1_EN; 2855 reg_val &= ~IXGBE_KRM_DSP_TXFFE_STATE_CO_ADAPT_EN; 2856 status = mac->ops.write_iosf_sb_reg(hw, 2857 IXGBE_KRM_DSP_TXFFE_STATE_4(hw->bus.lan_id), 2858 IXGBE_SB_IOSF_TARGET_KR_PHY, reg_val); 2859 if (status != IXGBE_SUCCESS) 2860 return status; 2861 status = mac->ops.read_iosf_sb_reg(hw, 2862 IXGBE_KRM_DSP_TXFFE_STATE_5(hw->bus.lan_id), 2863 IXGBE_SB_IOSF_TARGET_KR_PHY, ®_val); 2864 if (status != IXGBE_SUCCESS) 2865 return status; 2866 reg_val &= ~IXGBE_KRM_DSP_TXFFE_STATE_C0_EN; 2867 reg_val &= ~IXGBE_KRM_DSP_TXFFE_STATE_CP1_CN1_EN; 2868 reg_val &= ~IXGBE_KRM_DSP_TXFFE_STATE_CO_ADAPT_EN; 2869 status = mac->ops.write_iosf_sb_reg(hw, 2870 IXGBE_KRM_DSP_TXFFE_STATE_5(hw->bus.lan_id), 2871 IXGBE_SB_IOSF_TARGET_KR_PHY, reg_val); 2872 if (status != IXGBE_SUCCESS) 2873 return status; 2874 2875 /* Enable override for coefficients. */ 2876 status = mac->ops.read_iosf_sb_reg(hw, 2877 IXGBE_KRM_TX_COEFF_CTRL_1(hw->bus.lan_id), 2878 IXGBE_SB_IOSF_TARGET_KR_PHY, ®_val); 2879 if (status != IXGBE_SUCCESS) 2880 return status; 2881 reg_val |= IXGBE_KRM_TX_COEFF_CTRL_1_OVRRD_EN; 2882 reg_val |= IXGBE_KRM_TX_COEFF_CTRL_1_CZERO_EN; 2883 reg_val |= IXGBE_KRM_TX_COEFF_CTRL_1_CPLUS1_OVRRD_EN; 2884 reg_val |= IXGBE_KRM_TX_COEFF_CTRL_1_CMINUS1_OVRRD_EN; 2885 status = mac->ops.write_iosf_sb_reg(hw, 2886 IXGBE_KRM_TX_COEFF_CTRL_1(hw->bus.lan_id), 2887 IXGBE_SB_IOSF_TARGET_KR_PHY, reg_val); 2888 return status; 2889 } 2890 2891 /** 2892 * ixgbe_setup_ixfi_x550em - Configure the KR PHY for iXFI mode. 2893 * @hw: pointer to hardware structure 2894 * @speed: the link speed to force 2895 * 2896 * Configures the integrated KR PHY to use iXFI mode. Used to connect an 2897 * internal and external PHY at a specific speed, without autonegotiation. 2898 **/ 2899 static s32 ixgbe_setup_ixfi_x550em(struct ixgbe_hw *hw, ixgbe_link_speed *speed) 2900 { 2901 struct ixgbe_mac_info *mac = &hw->mac; 2902 s32 status; 2903 u32 reg_val; 2904 2905 /* iXFI is only supported with X552 */ 2906 if (mac->type != ixgbe_mac_X550EM_x) 2907 return IXGBE_ERR_LINK_SETUP; 2908 2909 /* Disable AN and force speed to 10G Serial. */ 2910 status = mac->ops.read_iosf_sb_reg(hw, 2911 IXGBE_KRM_LINK_CTRL_1(hw->bus.lan_id), 2912 IXGBE_SB_IOSF_TARGET_KR_PHY, ®_val); 2913 if (status != IXGBE_SUCCESS) 2914 return status; 2915 2916 reg_val &= ~IXGBE_KRM_LINK_CTRL_1_TETH_AN_ENABLE; 2917 reg_val &= ~IXGBE_KRM_LINK_CTRL_1_TETH_FORCE_SPEED_MASK; 2918 2919 /* Select forced link speed for internal PHY. */ 2920 switch (*speed) { 2921 case IXGBE_LINK_SPEED_10GB_FULL: 2922 reg_val |= IXGBE_KRM_LINK_CTRL_1_TETH_FORCE_SPEED_10G; 2923 break; 2924 case IXGBE_LINK_SPEED_1GB_FULL: 2925 reg_val |= IXGBE_KRM_LINK_CTRL_1_TETH_FORCE_SPEED_1G; 2926 break; 2927 default: 2928 /* Other link speeds are not supported by internal KR PHY. */ 2929 return IXGBE_ERR_LINK_SETUP; 2930 } 2931 2932 status = mac->ops.write_iosf_sb_reg(hw, 2933 IXGBE_KRM_LINK_CTRL_1(hw->bus.lan_id), 2934 IXGBE_SB_IOSF_TARGET_KR_PHY, reg_val); 2935 if (status != IXGBE_SUCCESS) 2936 return status; 2937 2938 /* Additional configuration needed for x550em_x */ 2939 if (hw->mac.type == ixgbe_mac_X550EM_x) { 2940 status = ixgbe_setup_ixfi_x550em_x(hw); 2941 if (status != IXGBE_SUCCESS) 2942 return status; 2943 } 2944 2945 /* Toggle port SW reset by AN reset. */ 2946 status = ixgbe_restart_an_internal_phy_x550em(hw); 2947 2948 return status; 2949 } 2950 2951 /** 2952 * ixgbe_ext_phy_t_x550em_get_link - Get ext phy link status 2953 * @hw: address of hardware structure 2954 * @link_up: address of boolean to indicate link status 2955 * 2956 * Returns error code if unable to get link status. 2957 */ 2958 static s32 ixgbe_ext_phy_t_x550em_get_link(struct ixgbe_hw *hw, bool *link_up) 2959 { 2960 u32 ret; 2961 u16 autoneg_status; 2962 2963 *link_up = false; 2964 2965 /* read this twice back to back to indicate current status */ 2966 ret = hw->phy.ops.read_reg(hw, IXGBE_MDIO_AUTO_NEG_STATUS, 2967 IXGBE_MDIO_AUTO_NEG_DEV_TYPE, 2968 &autoneg_status); 2969 if (ret != IXGBE_SUCCESS) 2970 return ret; 2971 2972 ret = hw->phy.ops.read_reg(hw, IXGBE_MDIO_AUTO_NEG_STATUS, 2973 IXGBE_MDIO_AUTO_NEG_DEV_TYPE, 2974 &autoneg_status); 2975 if (ret != IXGBE_SUCCESS) 2976 return ret; 2977 2978 *link_up = !!(autoneg_status & IXGBE_MDIO_AUTO_NEG_LINK_STATUS); 2979 2980 return IXGBE_SUCCESS; 2981 } 2982 2983 /** 2984 * ixgbe_setup_internal_phy_t_x550em - Configure KR PHY to X557 link 2985 * @hw: point to hardware structure 2986 * 2987 * Configures the link between the integrated KR PHY and the external X557 PHY 2988 * The driver will call this function when it gets a link status change 2989 * interrupt from the X557 PHY. This function configures the link speed 2990 * between the PHYs to match the link speed of the BASE-T link. 2991 * 2992 * A return of a non-zero value indicates an error, and the base driver should 2993 * not report link up. 2994 */ 2995 s32 ixgbe_setup_internal_phy_t_x550em(struct ixgbe_hw *hw) 2996 { 2997 ixgbe_link_speed force_speed; 2998 bool link_up; 2999 u32 status; 3000 u16 speed; 3001 3002 if (hw->mac.ops.get_media_type(hw) != ixgbe_media_type_copper) 3003 return IXGBE_ERR_CONFIG; 3004 3005 if (hw->mac.type == ixgbe_mac_X550EM_x && 3006 !(hw->phy.nw_mng_if_sel & IXGBE_NW_MNG_IF_SEL_INT_PHY_MODE)) { 3007 /* If link is down, there is no setup necessary so return */ 3008 status = ixgbe_ext_phy_t_x550em_get_link(hw, &link_up); 3009 if (status != IXGBE_SUCCESS) 3010 return status; 3011 3012 if (!link_up) 3013 return IXGBE_SUCCESS; 3014 3015 status = hw->phy.ops.read_reg(hw, 3016 IXGBE_MDIO_AUTO_NEG_VENDOR_STAT, 3017 IXGBE_MDIO_AUTO_NEG_DEV_TYPE, 3018 &speed); 3019 if (status != IXGBE_SUCCESS) 3020 return status; 3021 3022 /* If link is still down - no setup is required so return */ 3023 status = ixgbe_ext_phy_t_x550em_get_link(hw, &link_up); 3024 if (status != IXGBE_SUCCESS) 3025 return status; 3026 if (!link_up) 3027 return IXGBE_SUCCESS; 3028 3029 /* clear everything but the speed and duplex bits */ 3030 speed &= IXGBE_MDIO_AUTO_NEG_VENDOR_STATUS_MASK; 3031 3032 switch (speed) { 3033 case IXGBE_MDIO_AUTO_NEG_VENDOR_STATUS_10GB_FULL: 3034 force_speed = IXGBE_LINK_SPEED_10GB_FULL; 3035 break; 3036 case IXGBE_MDIO_AUTO_NEG_VENDOR_STATUS_1GB_FULL: 3037 force_speed = IXGBE_LINK_SPEED_1GB_FULL; 3038 break; 3039 default: 3040 /* Internal PHY does not support anything else */ 3041 return IXGBE_ERR_INVALID_LINK_SETTINGS; 3042 } 3043 3044 return ixgbe_setup_ixfi_x550em(hw, &force_speed); 3045 } else { 3046 speed = IXGBE_LINK_SPEED_10GB_FULL | 3047 IXGBE_LINK_SPEED_1GB_FULL; 3048 return ixgbe_setup_kr_speed_x550em(hw, speed); 3049 } 3050 } 3051 3052 /** 3053 * ixgbe_setup_phy_loopback_x550em - Configure the KR PHY for loopback. 3054 * @hw: pointer to hardware structure 3055 * 3056 * Configures the integrated KR PHY to use internal loopback mode. 3057 **/ 3058 s32 ixgbe_setup_phy_loopback_x550em(struct ixgbe_hw *hw) 3059 { 3060 s32 status; 3061 u32 reg_val; 3062 3063 /* Disable AN and force speed to 10G Serial. */ 3064 status = hw->mac.ops.read_iosf_sb_reg(hw, 3065 IXGBE_KRM_LINK_CTRL_1(hw->bus.lan_id), 3066 IXGBE_SB_IOSF_TARGET_KR_PHY, ®_val); 3067 if (status != IXGBE_SUCCESS) 3068 return status; 3069 reg_val &= ~IXGBE_KRM_LINK_CTRL_1_TETH_AN_ENABLE; 3070 reg_val &= ~IXGBE_KRM_LINK_CTRL_1_TETH_FORCE_SPEED_MASK; 3071 reg_val |= IXGBE_KRM_LINK_CTRL_1_TETH_FORCE_SPEED_10G; 3072 status = hw->mac.ops.write_iosf_sb_reg(hw, 3073 IXGBE_KRM_LINK_CTRL_1(hw->bus.lan_id), 3074 IXGBE_SB_IOSF_TARGET_KR_PHY, reg_val); 3075 if (status != IXGBE_SUCCESS) 3076 return status; 3077 3078 /* Set near-end loopback clocks. */ 3079 status = hw->mac.ops.read_iosf_sb_reg(hw, 3080 IXGBE_KRM_PORT_CAR_GEN_CTRL(hw->bus.lan_id), 3081 IXGBE_SB_IOSF_TARGET_KR_PHY, ®_val); 3082 if (status != IXGBE_SUCCESS) 3083 return status; 3084 reg_val |= IXGBE_KRM_PORT_CAR_GEN_CTRL_NELB_32B; 3085 reg_val |= IXGBE_KRM_PORT_CAR_GEN_CTRL_NELB_KRPCS; 3086 status = hw->mac.ops.write_iosf_sb_reg(hw, 3087 IXGBE_KRM_PORT_CAR_GEN_CTRL(hw->bus.lan_id), 3088 IXGBE_SB_IOSF_TARGET_KR_PHY, reg_val); 3089 if (status != IXGBE_SUCCESS) 3090 return status; 3091 3092 /* Set loopback enable. */ 3093 status = hw->mac.ops.read_iosf_sb_reg(hw, 3094 IXGBE_KRM_PMD_DFX_BURNIN(hw->bus.lan_id), 3095 IXGBE_SB_IOSF_TARGET_KR_PHY, ®_val); 3096 if (status != IXGBE_SUCCESS) 3097 return status; 3098 reg_val |= IXGBE_KRM_PMD_DFX_BURNIN_TX_RX_KR_LB_MASK; 3099 status = hw->mac.ops.write_iosf_sb_reg(hw, 3100 IXGBE_KRM_PMD_DFX_BURNIN(hw->bus.lan_id), 3101 IXGBE_SB_IOSF_TARGET_KR_PHY, reg_val); 3102 if (status != IXGBE_SUCCESS) 3103 return status; 3104 3105 /* Training bypass. */ 3106 status = hw->mac.ops.read_iosf_sb_reg(hw, 3107 IXGBE_KRM_RX_TRN_LINKUP_CTRL(hw->bus.lan_id), 3108 IXGBE_SB_IOSF_TARGET_KR_PHY, ®_val); 3109 if (status != IXGBE_SUCCESS) 3110 return status; 3111 reg_val |= IXGBE_KRM_RX_TRN_LINKUP_CTRL_PROTOCOL_BYPASS; 3112 status = hw->mac.ops.write_iosf_sb_reg(hw, 3113 IXGBE_KRM_RX_TRN_LINKUP_CTRL(hw->bus.lan_id), 3114 IXGBE_SB_IOSF_TARGET_KR_PHY, reg_val); 3115 3116 return status; 3117 } 3118 3119 /** 3120 * ixgbe_read_ee_hostif_X550 - Read EEPROM word using a host interface command 3121 * assuming that the semaphore is already obtained. 3122 * @hw: pointer to hardware structure 3123 * @offset: offset of word in the EEPROM to read 3124 * @data: word read from the EEPROM 3125 * 3126 * Reads a 16 bit word from the EEPROM using the hostif. 3127 **/ 3128 s32 ixgbe_read_ee_hostif_X550(struct ixgbe_hw *hw, u16 offset, u16 *data) 3129 { 3130 const u32 mask = IXGBE_GSSR_SW_MNG_SM | IXGBE_GSSR_EEP_SM; 3131 struct ixgbe_hic_read_shadow_ram buffer; 3132 s32 status; 3133 3134 DEBUGFUNC("ixgbe_read_ee_hostif_X550"); 3135 buffer.hdr.req.cmd = FW_READ_SHADOW_RAM_CMD; 3136 buffer.hdr.req.buf_lenh = 0; 3137 buffer.hdr.req.buf_lenl = FW_READ_SHADOW_RAM_LEN; 3138 buffer.hdr.req.checksum = FW_DEFAULT_CHECKSUM; 3139 3140 /* convert offset from words to bytes */ 3141 buffer.address = IXGBE_CPU_TO_BE32(offset * 2); 3142 /* one word */ 3143 buffer.length = IXGBE_CPU_TO_BE16(sizeof(u16)); 3144 buffer.pad2 = 0; 3145 buffer.data = 0; 3146 buffer.pad3 = 0; 3147 3148 status = hw->mac.ops.acquire_swfw_sync(hw, mask); 3149 if (status) 3150 return status; 3151 3152 status = ixgbe_hic_unlocked(hw, (u32 *)&buffer, sizeof(buffer), 3153 IXGBE_HI_COMMAND_TIMEOUT); 3154 if (!status) { 3155 *data = (u16)IXGBE_READ_REG_ARRAY(hw, IXGBE_FLEX_MNG, 3156 FW_NVM_DATA_OFFSET); 3157 } 3158 3159 hw->mac.ops.release_swfw_sync(hw, mask); 3160 return status; 3161 } 3162 3163 /** 3164 * ixgbe_read_ee_hostif_buffer_X550- Read EEPROM word(s) using hostif 3165 * @hw: pointer to hardware structure 3166 * @offset: offset of word in the EEPROM to read 3167 * @words: number of words 3168 * @data: word(s) read from the EEPROM 3169 * 3170 * Reads a 16 bit word(s) from the EEPROM using the hostif. 3171 **/ 3172 s32 ixgbe_read_ee_hostif_buffer_X550(struct ixgbe_hw *hw, 3173 u16 offset, u16 words, u16 *data) 3174 { 3175 const u32 mask = IXGBE_GSSR_SW_MNG_SM | IXGBE_GSSR_EEP_SM; 3176 struct ixgbe_hic_read_shadow_ram buffer; 3177 u32 current_word = 0; 3178 u16 words_to_read; 3179 s32 status; 3180 u32 i; 3181 3182 DEBUGFUNC("ixgbe_read_ee_hostif_buffer_X550"); 3183 3184 /* Take semaphore for the entire operation. */ 3185 status = hw->mac.ops.acquire_swfw_sync(hw, mask); 3186 if (status) { 3187 DEBUGOUT("EEPROM read buffer - semaphore failed\n"); 3188 return status; 3189 } 3190 3191 while (words) { 3192 if (words > FW_MAX_READ_BUFFER_SIZE / 2) 3193 words_to_read = FW_MAX_READ_BUFFER_SIZE / 2; 3194 else 3195 words_to_read = words; 3196 3197 buffer.hdr.req.cmd = FW_READ_SHADOW_RAM_CMD; 3198 buffer.hdr.req.buf_lenh = 0; 3199 buffer.hdr.req.buf_lenl = FW_READ_SHADOW_RAM_LEN; 3200 buffer.hdr.req.checksum = FW_DEFAULT_CHECKSUM; 3201 3202 /* convert offset from words to bytes */ 3203 buffer.address = IXGBE_CPU_TO_BE32((offset + current_word) * 2); 3204 buffer.length = IXGBE_CPU_TO_BE16(words_to_read * 2); 3205 buffer.pad2 = 0; 3206 buffer.data = 0; 3207 buffer.pad3 = 0; 3208 3209 status = ixgbe_hic_unlocked(hw, (u32 *)&buffer, sizeof(buffer), 3210 IXGBE_HI_COMMAND_TIMEOUT); 3211 3212 if (status) { 3213 DEBUGOUT("Host interface command failed\n"); 3214 goto out; 3215 } 3216 3217 for (i = 0; i < words_to_read; i++) { 3218 u32 reg = IXGBE_FLEX_MNG + (FW_NVM_DATA_OFFSET << 2) + 3219 2 * i; 3220 u32 value = IXGBE_READ_REG(hw, reg); 3221 3222 data[current_word] = (u16)(value & 0xffff); 3223 current_word++; 3224 i++; 3225 if (i < words_to_read) { 3226 value >>= 16; 3227 data[current_word] = (u16)(value & 0xffff); 3228 current_word++; 3229 } 3230 } 3231 words -= words_to_read; 3232 } 3233 3234 out: 3235 hw->mac.ops.release_swfw_sync(hw, mask); 3236 return status; 3237 } 3238 3239 /** 3240 * ixgbe_write_ee_hostif_X550 - Write EEPROM word using hostif 3241 * @hw: pointer to hardware structure 3242 * @offset: offset of word in the EEPROM to write 3243 * @data: word write to the EEPROM 3244 * 3245 * Write a 16 bit word to the EEPROM using the hostif. 3246 **/ 3247 s32 ixgbe_write_ee_hostif_data_X550(struct ixgbe_hw *hw, u16 offset, 3248 u16 data) 3249 { 3250 s32 status; 3251 struct ixgbe_hic_write_shadow_ram buffer; 3252 3253 DEBUGFUNC("ixgbe_write_ee_hostif_data_X550"); 3254 3255 buffer.hdr.req.cmd = FW_WRITE_SHADOW_RAM_CMD; 3256 buffer.hdr.req.buf_lenh = 0; 3257 buffer.hdr.req.buf_lenl = FW_WRITE_SHADOW_RAM_LEN; 3258 buffer.hdr.req.checksum = FW_DEFAULT_CHECKSUM; 3259 3260 /* one word */ 3261 buffer.length = IXGBE_CPU_TO_BE16(sizeof(u16)); 3262 buffer.data = data; 3263 buffer.address = IXGBE_CPU_TO_BE32(offset * 2); 3264 3265 status = ixgbe_host_interface_command(hw, (u32 *)&buffer, 3266 sizeof(buffer), 3267 IXGBE_HI_COMMAND_TIMEOUT, true); 3268 if (status != IXGBE_SUCCESS) { 3269 DEBUGOUT2("for offset %04x failed with status %d\n", 3270 offset, status); 3271 return status; 3272 } 3273 3274 if (buffer.hdr.rsp.buf_lenh_status != FW_CEM_RESP_STATUS_SUCCESS) { 3275 DEBUGOUT2("for offset %04x host interface return status %02x\n", 3276 offset, buffer.hdr.rsp.buf_lenh_status); 3277 return IXGBE_ERR_HOST_INTERFACE_COMMAND; 3278 } 3279 3280 return status; 3281 } 3282 3283 /** 3284 * ixgbe_write_ee_hostif_X550 - Write EEPROM word using hostif 3285 * @hw: pointer to hardware structure 3286 * @offset: offset of word in the EEPROM to write 3287 * @data: word write to the EEPROM 3288 * 3289 * Write a 16 bit word to the EEPROM using the hostif. 3290 **/ 3291 s32 ixgbe_write_ee_hostif_X550(struct ixgbe_hw *hw, u16 offset, 3292 u16 data) 3293 { 3294 s32 status = IXGBE_SUCCESS; 3295 3296 DEBUGFUNC("ixgbe_write_ee_hostif_X550"); 3297 3298 if (hw->mac.ops.acquire_swfw_sync(hw, IXGBE_GSSR_EEP_SM) == 3299 IXGBE_SUCCESS) { 3300 status = ixgbe_write_ee_hostif_data_X550(hw, offset, data); 3301 hw->mac.ops.release_swfw_sync(hw, IXGBE_GSSR_EEP_SM); 3302 } else { 3303 DEBUGOUT("write ee hostif failed to get semaphore"); 3304 status = IXGBE_ERR_SWFW_SYNC; 3305 } 3306 3307 return status; 3308 } 3309 3310 /** 3311 * ixgbe_write_ee_hostif_buffer_X550 - Write EEPROM word(s) using hostif 3312 * @hw: pointer to hardware structure 3313 * @offset: offset of word in the EEPROM to write 3314 * @words: number of words 3315 * @data: word(s) write to the EEPROM 3316 * 3317 * Write a 16 bit word(s) to the EEPROM using the hostif. 3318 **/ 3319 s32 ixgbe_write_ee_hostif_buffer_X550(struct ixgbe_hw *hw, 3320 u16 offset, u16 words, u16 *data) 3321 { 3322 s32 status = IXGBE_SUCCESS; 3323 u32 i = 0; 3324 3325 DEBUGFUNC("ixgbe_write_ee_hostif_buffer_X550"); 3326 3327 /* Take semaphore for the entire operation. */ 3328 status = hw->mac.ops.acquire_swfw_sync(hw, IXGBE_GSSR_EEP_SM); 3329 if (status != IXGBE_SUCCESS) { 3330 DEBUGOUT("EEPROM write buffer - semaphore failed\n"); 3331 goto out; 3332 } 3333 3334 for (i = 0; i < words; i++) { 3335 status = ixgbe_write_ee_hostif_data_X550(hw, offset + i, 3336 data[i]); 3337 3338 if (status != IXGBE_SUCCESS) { 3339 DEBUGOUT("Eeprom buffered write failed\n"); 3340 break; 3341 } 3342 } 3343 3344 hw->mac.ops.release_swfw_sync(hw, IXGBE_GSSR_EEP_SM); 3345 out: 3346 3347 return status; 3348 } 3349 3350 /** 3351 * ixgbe_checksum_ptr_x550 - Checksum one pointer region 3352 * @hw: pointer to hardware structure 3353 * @ptr: pointer offset in eeprom 3354 * @size: size of section pointed by ptr, if 0 first word will be used as size 3355 * @csum: address of checksum to update 3356 * @buffer: pointer to buffer containing calculated checksum 3357 * @buffer_size: size of buffer 3358 * 3359 * Returns error status for any failure 3360 */ 3361 static s32 ixgbe_checksum_ptr_x550(struct ixgbe_hw *hw, u16 ptr, 3362 u16 size, u16 *csum, u16 *buffer, 3363 u32 buffer_size) 3364 { 3365 u16 buf[256]; 3366 s32 status; 3367 u16 length, bufsz, i, start; 3368 u16 *local_buffer; 3369 3370 bufsz = sizeof(buf) / sizeof(buf[0]); 3371 3372 /* Read a chunk at the pointer location */ 3373 if (!buffer) { 3374 status = ixgbe_read_ee_hostif_buffer_X550(hw, ptr, bufsz, buf); 3375 if (status) { 3376 DEBUGOUT("Failed to read EEPROM image\n"); 3377 return status; 3378 } 3379 local_buffer = buf; 3380 } else { 3381 if (buffer_size < ptr) 3382 return IXGBE_ERR_PARAM; 3383 local_buffer = &buffer[ptr]; 3384 } 3385 3386 if (size) { 3387 start = 0; 3388 length = size; 3389 } else { 3390 start = 1; 3391 length = local_buffer[0]; 3392 3393 /* Skip pointer section if length is invalid. */ 3394 if (length == 0xFFFF || length == 0 || 3395 (ptr + length) >= hw->eeprom.word_size) 3396 return IXGBE_SUCCESS; 3397 } 3398 3399 if (buffer && ((u32)start + (u32)length > buffer_size)) 3400 return IXGBE_ERR_PARAM; 3401 3402 for (i = start; length; i++, length--) { 3403 if (i == bufsz && !buffer) { 3404 ptr += bufsz; 3405 i = 0; 3406 if (length < bufsz) 3407 bufsz = length; 3408 3409 /* Read a chunk at the pointer location */ 3410 status = ixgbe_read_ee_hostif_buffer_X550(hw, ptr, 3411 bufsz, buf); 3412 if (status) { 3413 DEBUGOUT("Failed to read EEPROM image\n"); 3414 return status; 3415 } 3416 } 3417 *csum += local_buffer[i]; 3418 } 3419 return IXGBE_SUCCESS; 3420 } 3421 3422 /** 3423 * ixgbe_calc_checksum_X550 - Calculates and returns the checksum 3424 * @hw: pointer to hardware structure 3425 * @buffer: pointer to buffer containing calculated checksum 3426 * @buffer_size: size of buffer 3427 * 3428 * Returns a negative error code on error, or the 16-bit checksum 3429 **/ 3430 s32 ixgbe_calc_checksum_X550(struct ixgbe_hw *hw, u16 *buffer, u32 buffer_size) 3431 { 3432 u16 eeprom_ptrs[IXGBE_EEPROM_LAST_WORD + 1]; 3433 u16 *local_buffer; 3434 s32 status; 3435 u16 checksum = 0; 3436 u16 pointer, i, size; 3437 3438 DEBUGFUNC("ixgbe_calc_eeprom_checksum_X550"); 3439 3440 hw->eeprom.ops.init_params(hw); 3441 3442 if (!buffer) { 3443 /* Read pointer area */ 3444 status = ixgbe_read_ee_hostif_buffer_X550(hw, 0, 3445 IXGBE_EEPROM_LAST_WORD + 1, 3446 eeprom_ptrs); 3447 if (status) { 3448 DEBUGOUT("Failed to read EEPROM image\n"); 3449 return status; 3450 } 3451 local_buffer = eeprom_ptrs; 3452 } else { 3453 if (buffer_size < IXGBE_EEPROM_LAST_WORD) 3454 return IXGBE_ERR_PARAM; 3455 local_buffer = buffer; 3456 } 3457 3458 /* 3459 * For X550 hardware include 0x0-0x41 in the checksum, skip the 3460 * checksum word itself 3461 */ 3462 for (i = 0; i <= IXGBE_EEPROM_LAST_WORD; i++) 3463 if (i != IXGBE_EEPROM_CHECKSUM) 3464 checksum += local_buffer[i]; 3465 3466 /* 3467 * Include all data from pointers 0x3, 0x6-0xE. This excludes the 3468 * FW, PHY module, and PCIe Expansion/Option ROM pointers. 3469 */ 3470 for (i = IXGBE_PCIE_ANALOG_PTR_X550; i < IXGBE_FW_PTR; i++) { 3471 if (i == IXGBE_PHY_PTR || i == IXGBE_OPTION_ROM_PTR) 3472 continue; 3473 3474 pointer = local_buffer[i]; 3475 3476 /* Skip pointer section if the pointer is invalid. */ 3477 if (pointer == 0xFFFF || pointer == 0 || 3478 pointer >= hw->eeprom.word_size) 3479 continue; 3480 3481 switch (i) { 3482 case IXGBE_PCIE_GENERAL_PTR: 3483 size = IXGBE_IXGBE_PCIE_GENERAL_SIZE; 3484 break; 3485 case IXGBE_PCIE_CONFIG0_PTR: 3486 case IXGBE_PCIE_CONFIG1_PTR: 3487 size = IXGBE_PCIE_CONFIG_SIZE; 3488 break; 3489 default: 3490 size = 0; 3491 break; 3492 } 3493 3494 status = ixgbe_checksum_ptr_x550(hw, pointer, size, &checksum, 3495 buffer, buffer_size); 3496 if (status) 3497 return status; 3498 } 3499 3500 checksum = (u16)IXGBE_EEPROM_SUM - checksum; 3501 3502 return (s32)checksum; 3503 } 3504 3505 /** 3506 * ixgbe_calc_eeprom_checksum_X550 - Calculates and returns the checksum 3507 * @hw: pointer to hardware structure 3508 * 3509 * Returns a negative error code on error, or the 16-bit checksum 3510 **/ 3511 s32 ixgbe_calc_eeprom_checksum_X550(struct ixgbe_hw *hw) 3512 { 3513 return ixgbe_calc_checksum_X550(hw, NULL, 0); 3514 } 3515 3516 /** 3517 * ixgbe_validate_eeprom_checksum_X550 - Validate EEPROM checksum 3518 * @hw: pointer to hardware structure 3519 * @checksum_val: calculated checksum 3520 * 3521 * Performs checksum calculation and validates the EEPROM checksum. If the 3522 * caller does not need checksum_val, the value can be NULL. 3523 **/ 3524 s32 ixgbe_validate_eeprom_checksum_X550(struct ixgbe_hw *hw, u16 *checksum_val) 3525 { 3526 s32 status; 3527 u16 checksum; 3528 u16 read_checksum = 0; 3529 3530 DEBUGFUNC("ixgbe_validate_eeprom_checksum_X550"); 3531 3532 /* Read the first word from the EEPROM. If this times out or fails, do 3533 * not continue or we could be in for a very long wait while every 3534 * EEPROM read fails 3535 */ 3536 status = hw->eeprom.ops.read(hw, 0, &checksum); 3537 if (status) { 3538 DEBUGOUT("EEPROM read failed\n"); 3539 return status; 3540 } 3541 3542 status = hw->eeprom.ops.calc_checksum(hw); 3543 if (status < 0) 3544 return status; 3545 3546 checksum = (u16)(status & 0xffff); 3547 3548 status = ixgbe_read_ee_hostif_X550(hw, IXGBE_EEPROM_CHECKSUM, 3549 &read_checksum); 3550 if (status) 3551 return status; 3552 3553 /* Verify read checksum from EEPROM is the same as 3554 * calculated checksum 3555 */ 3556 if (read_checksum != checksum) { 3557 status = IXGBE_ERR_EEPROM_CHECKSUM; 3558 ERROR_REPORT1(IXGBE_ERROR_INVALID_STATE, 3559 "Invalid EEPROM checksum"); 3560 } 3561 3562 /* If the user cares, return the calculated checksum */ 3563 if (checksum_val) 3564 *checksum_val = checksum; 3565 3566 return status; 3567 } 3568 3569 /** 3570 * ixgbe_update_eeprom_checksum_X550 - Updates the EEPROM checksum and flash 3571 * @hw: pointer to hardware structure 3572 * 3573 * After writing EEPROM to shadow RAM using EEWR register, software calculates 3574 * checksum and updates the EEPROM and instructs the hardware to update 3575 * the flash. 3576 **/ 3577 s32 ixgbe_update_eeprom_checksum_X550(struct ixgbe_hw *hw) 3578 { 3579 s32 status; 3580 u16 checksum = 0; 3581 3582 DEBUGFUNC("ixgbe_update_eeprom_checksum_X550"); 3583 3584 /* Read the first word from the EEPROM. If this times out or fails, do 3585 * not continue or we could be in for a very long wait while every 3586 * EEPROM read fails 3587 */ 3588 status = ixgbe_read_ee_hostif_X550(hw, 0, &checksum); 3589 if (status) { 3590 DEBUGOUT("EEPROM read failed\n"); 3591 return status; 3592 } 3593 3594 status = ixgbe_calc_eeprom_checksum_X550(hw); 3595 if (status < 0) 3596 return status; 3597 3598 checksum = (u16)(status & 0xffff); 3599 3600 status = ixgbe_write_ee_hostif_X550(hw, IXGBE_EEPROM_CHECKSUM, 3601 checksum); 3602 if (status) 3603 return status; 3604 3605 status = ixgbe_update_flash_X550(hw); 3606 3607 return status; 3608 } 3609 3610 /** 3611 * ixgbe_update_flash_X550 - Instruct HW to copy EEPROM to Flash device 3612 * @hw: pointer to hardware structure 3613 * 3614 * Issue a shadow RAM dump to FW to copy EEPROM from shadow RAM to the flash. 3615 **/ 3616 s32 ixgbe_update_flash_X550(struct ixgbe_hw *hw) 3617 { 3618 s32 status = IXGBE_SUCCESS; 3619 union ixgbe_hic_hdr2 buffer; 3620 3621 DEBUGFUNC("ixgbe_update_flash_X550"); 3622 3623 buffer.req.cmd = FW_SHADOW_RAM_DUMP_CMD; 3624 buffer.req.buf_lenh = 0; 3625 buffer.req.buf_lenl = FW_SHADOW_RAM_DUMP_LEN; 3626 buffer.req.checksum = FW_DEFAULT_CHECKSUM; 3627 3628 status = ixgbe_host_interface_command(hw, (u32 *)&buffer, 3629 sizeof(buffer), 3630 IXGBE_HI_COMMAND_TIMEOUT, false); 3631 3632 return status; 3633 } 3634 3635 /** 3636 * ixgbe_get_supported_physical_layer_X550em - Returns physical layer type 3637 * @hw: pointer to hardware structure 3638 * 3639 * Determines physical layer capabilities of the current configuration. 3640 **/ 3641 u64 ixgbe_get_supported_physical_layer_X550em(struct ixgbe_hw *hw) 3642 { 3643 u64 physical_layer = IXGBE_PHYSICAL_LAYER_UNKNOWN; 3644 u16 ext_ability = 0; 3645 3646 DEBUGFUNC("ixgbe_get_supported_physical_layer_X550em"); 3647 3648 hw->phy.ops.identify(hw); 3649 3650 switch (hw->phy.type) { 3651 case ixgbe_phy_x550em_kr: 3652 if (hw->mac.type == ixgbe_mac_X550EM_a) { 3653 if (hw->phy.nw_mng_if_sel & 3654 IXGBE_NW_MNG_IF_SEL_PHY_SPEED_2_5G) { 3655 physical_layer = 3656 IXGBE_PHYSICAL_LAYER_2500BASE_KX; 3657 break; 3658 } else if (hw->device_id == 3659 IXGBE_DEV_ID_X550EM_A_KR_L) { 3660 physical_layer = 3661 IXGBE_PHYSICAL_LAYER_1000BASE_KX; 3662 break; 3663 } 3664 } 3665 /* fall through */ 3666 case ixgbe_phy_x550em_xfi: 3667 physical_layer = IXGBE_PHYSICAL_LAYER_10GBASE_KR | 3668 IXGBE_PHYSICAL_LAYER_1000BASE_KX; 3669 break; 3670 case ixgbe_phy_x550em_kx4: 3671 physical_layer = IXGBE_PHYSICAL_LAYER_10GBASE_KX4 | 3672 IXGBE_PHYSICAL_LAYER_1000BASE_KX; 3673 break; 3674 case ixgbe_phy_x550em_ext_t: 3675 hw->phy.ops.read_reg(hw, IXGBE_MDIO_PHY_EXT_ABILITY, 3676 IXGBE_MDIO_PMA_PMD_DEV_TYPE, 3677 &ext_ability); 3678 if (ext_ability & IXGBE_MDIO_PHY_10GBASET_ABILITY) 3679 physical_layer |= IXGBE_PHYSICAL_LAYER_10GBASE_T; 3680 if (ext_ability & IXGBE_MDIO_PHY_1000BASET_ABILITY) 3681 physical_layer |= IXGBE_PHYSICAL_LAYER_1000BASE_T; 3682 break; 3683 case ixgbe_phy_fw: 3684 if (hw->phy.speeds_supported & IXGBE_LINK_SPEED_1GB_FULL) 3685 physical_layer |= IXGBE_PHYSICAL_LAYER_1000BASE_T; 3686 if (hw->phy.speeds_supported & IXGBE_LINK_SPEED_100_FULL) 3687 physical_layer |= IXGBE_PHYSICAL_LAYER_100BASE_TX; 3688 if (hw->phy.speeds_supported & IXGBE_LINK_SPEED_10_FULL) 3689 physical_layer |= IXGBE_PHYSICAL_LAYER_10BASE_T; 3690 break; 3691 case ixgbe_phy_sgmii: 3692 physical_layer = IXGBE_PHYSICAL_LAYER_1000BASE_KX; 3693 break; 3694 case ixgbe_phy_ext_1g_t: 3695 physical_layer |= IXGBE_PHYSICAL_LAYER_1000BASE_T; 3696 break; 3697 default: 3698 break; 3699 } 3700 3701 if (hw->mac.ops.get_media_type(hw) == ixgbe_media_type_fiber) 3702 physical_layer = ixgbe_get_supported_phy_sfp_layer_generic(hw); 3703 3704 return physical_layer; 3705 } 3706 3707 /** 3708 * ixgbe_get_bus_info_x550em - Set PCI bus info 3709 * @hw: pointer to hardware structure 3710 * 3711 * Sets bus link width and speed to unknown because X550em is 3712 * not a PCI device. 3713 **/ 3714 s32 ixgbe_get_bus_info_X550em(struct ixgbe_hw *hw) 3715 { 3716 3717 DEBUGFUNC("ixgbe_get_bus_info_x550em"); 3718 3719 hw->bus.width = ixgbe_bus_width_unknown; 3720 hw->bus.speed = ixgbe_bus_speed_unknown; 3721 3722 hw->mac.ops.set_lan_id(hw); 3723 3724 return IXGBE_SUCCESS; 3725 } 3726 3727 /** 3728 * ixgbe_disable_rx_x550 - Disable RX unit 3729 * @hw: pointer to hardware structure 3730 * 3731 * Enables the Rx DMA unit for x550 3732 **/ 3733 void ixgbe_disable_rx_x550(struct ixgbe_hw *hw) 3734 { 3735 u32 rxctrl, pfdtxgswc; 3736 s32 status; 3737 struct ixgbe_hic_disable_rxen fw_cmd; 3738 3739 DEBUGFUNC("ixgbe_enable_rx_dma_x550"); 3740 3741 rxctrl = IXGBE_READ_REG(hw, IXGBE_RXCTRL); 3742 if (rxctrl & IXGBE_RXCTRL_RXEN) { 3743 pfdtxgswc = IXGBE_READ_REG(hw, IXGBE_PFDTXGSWC); 3744 if (pfdtxgswc & IXGBE_PFDTXGSWC_VT_LBEN) { 3745 pfdtxgswc &= ~IXGBE_PFDTXGSWC_VT_LBEN; 3746 IXGBE_WRITE_REG(hw, IXGBE_PFDTXGSWC, pfdtxgswc); 3747 hw->mac.set_lben = true; 3748 } else { 3749 hw->mac.set_lben = false; 3750 } 3751 3752 fw_cmd.hdr.cmd = FW_DISABLE_RXEN_CMD; 3753 fw_cmd.hdr.buf_len = FW_DISABLE_RXEN_LEN; 3754 fw_cmd.hdr.checksum = FW_DEFAULT_CHECKSUM; 3755 fw_cmd.port_number = (u8)hw->bus.lan_id; 3756 3757 status = ixgbe_host_interface_command(hw, (u32 *)&fw_cmd, 3758 sizeof(struct ixgbe_hic_disable_rxen), 3759 IXGBE_HI_COMMAND_TIMEOUT, true); 3760 3761 /* If we fail - disable RX using register write */ 3762 if (status) { 3763 rxctrl = IXGBE_READ_REG(hw, IXGBE_RXCTRL); 3764 if (rxctrl & IXGBE_RXCTRL_RXEN) { 3765 rxctrl &= ~IXGBE_RXCTRL_RXEN; 3766 IXGBE_WRITE_REG(hw, IXGBE_RXCTRL, rxctrl); 3767 } 3768 } 3769 } 3770 } 3771 3772 /** 3773 * ixgbe_enter_lplu_x550em - Transition to low power states 3774 * @hw: pointer to hardware structure 3775 * 3776 * Configures Low Power Link Up on transition to low power states 3777 * (from D0 to non-D0). Link is required to enter LPLU so avoid resetting the 3778 * X557 PHY immediately prior to entering LPLU. 3779 **/ 3780 s32 ixgbe_enter_lplu_t_x550em(struct ixgbe_hw *hw) 3781 { 3782 u16 an_10g_cntl_reg, autoneg_reg, speed; 3783 s32 status; 3784 ixgbe_link_speed lcd_speed; 3785 u32 save_autoneg; 3786 bool link_up; 3787 3788 /* SW LPLU not required on later HW revisions. */ 3789 if ((hw->mac.type == ixgbe_mac_X550EM_x) && 3790 (IXGBE_FUSES0_REV_MASK & 3791 IXGBE_READ_REG(hw, IXGBE_FUSES0_GROUP(0)))) 3792 return IXGBE_SUCCESS; 3793 3794 /* If blocked by MNG FW, then don't restart AN */ 3795 if (ixgbe_check_reset_blocked(hw)) 3796 return IXGBE_SUCCESS; 3797 3798 status = ixgbe_ext_phy_t_x550em_get_link(hw, &link_up); 3799 if (status != IXGBE_SUCCESS) 3800 return status; 3801 3802 status = ixgbe_read_eeprom(hw, NVM_INIT_CTRL_3, &hw->eeprom.ctrl_word_3); 3803 3804 if (status != IXGBE_SUCCESS) 3805 return status; 3806 3807 /* If link is down, LPLU disabled in NVM, WoL disabled, or manageability 3808 * disabled, then force link down by entering low power mode. 3809 */ 3810 if (!link_up || !(hw->eeprom.ctrl_word_3 & NVM_INIT_CTRL_3_LPLU) || 3811 !(hw->wol_enabled || ixgbe_mng_present(hw))) 3812 return ixgbe_set_copper_phy_power(hw, false); 3813 3814 /* Determine LCD */ 3815 status = ixgbe_get_lcd_t_x550em(hw, &lcd_speed); 3816 3817 if (status != IXGBE_SUCCESS) 3818 return status; 3819 3820 /* If no valid LCD link speed, then force link down and exit. */ 3821 if (lcd_speed == IXGBE_LINK_SPEED_UNKNOWN) 3822 return ixgbe_set_copper_phy_power(hw, false); 3823 3824 status = hw->phy.ops.read_reg(hw, IXGBE_MDIO_AUTO_NEG_VENDOR_STAT, 3825 IXGBE_MDIO_AUTO_NEG_DEV_TYPE, 3826 &speed); 3827 3828 if (status != IXGBE_SUCCESS) 3829 return status; 3830 3831 /* If no link now, speed is invalid so take link down */ 3832 status = ixgbe_ext_phy_t_x550em_get_link(hw, &link_up); 3833 if (status != IXGBE_SUCCESS) 3834 return ixgbe_set_copper_phy_power(hw, false); 3835 3836 /* clear everything but the speed bits */ 3837 speed &= IXGBE_MDIO_AUTO_NEG_VEN_STAT_SPEED_MASK; 3838 3839 /* If current speed is already LCD, then exit. */ 3840 if (((speed == IXGBE_MDIO_AUTO_NEG_VENDOR_STATUS_1GB) && 3841 (lcd_speed == IXGBE_LINK_SPEED_1GB_FULL)) || 3842 ((speed == IXGBE_MDIO_AUTO_NEG_VENDOR_STATUS_10GB) && 3843 (lcd_speed == IXGBE_LINK_SPEED_10GB_FULL))) 3844 return status; 3845 3846 /* Clear AN completed indication */ 3847 status = hw->phy.ops.read_reg(hw, IXGBE_MDIO_AUTO_NEG_VENDOR_TX_ALARM, 3848 IXGBE_MDIO_AUTO_NEG_DEV_TYPE, 3849 &autoneg_reg); 3850 3851 if (status != IXGBE_SUCCESS) 3852 return status; 3853 3854 status = hw->phy.ops.read_reg(hw, IXGBE_MII_10GBASE_T_AUTONEG_CTRL_REG, 3855 IXGBE_MDIO_AUTO_NEG_DEV_TYPE, 3856 &an_10g_cntl_reg); 3857 3858 if (status != IXGBE_SUCCESS) 3859 return status; 3860 3861 status = hw->phy.ops.read_reg(hw, 3862 IXGBE_MII_AUTONEG_VENDOR_PROVISION_1_REG, 3863 IXGBE_MDIO_AUTO_NEG_DEV_TYPE, 3864 &autoneg_reg); 3865 3866 if (status != IXGBE_SUCCESS) 3867 return status; 3868 3869 save_autoneg = hw->phy.autoneg_advertised; 3870 3871 /* Setup link at least common link speed */ 3872 status = hw->mac.ops.setup_link(hw, lcd_speed, false); 3873 3874 /* restore autoneg from before setting lplu speed */ 3875 hw->phy.autoneg_advertised = save_autoneg; 3876 3877 return status; 3878 } 3879 3880 /** 3881 * ixgbe_get_lcd_x550em - Determine lowest common denominator 3882 * @hw: pointer to hardware structure 3883 * @lcd_speed: pointer to lowest common link speed 3884 * 3885 * Determine lowest common link speed with link partner. 3886 **/ 3887 s32 ixgbe_get_lcd_t_x550em(struct ixgbe_hw *hw, ixgbe_link_speed *lcd_speed) 3888 { 3889 u16 an_lp_status; 3890 s32 status; 3891 u16 word = hw->eeprom.ctrl_word_3; 3892 3893 *lcd_speed = IXGBE_LINK_SPEED_UNKNOWN; 3894 3895 status = hw->phy.ops.read_reg(hw, IXGBE_AUTO_NEG_LP_STATUS, 3896 IXGBE_MDIO_AUTO_NEG_DEV_TYPE, 3897 &an_lp_status); 3898 3899 if (status != IXGBE_SUCCESS) 3900 return status; 3901 3902 /* If link partner advertised 1G, return 1G */ 3903 if (an_lp_status & IXGBE_AUTO_NEG_LP_1000BASE_CAP) { 3904 *lcd_speed = IXGBE_LINK_SPEED_1GB_FULL; 3905 return status; 3906 } 3907 3908 /* If 10G disabled for LPLU via NVM D10GMP, then return no valid LCD */ 3909 if ((hw->bus.lan_id && (word & NVM_INIT_CTRL_3_D10GMP_PORT1)) || 3910 (word & NVM_INIT_CTRL_3_D10GMP_PORT0)) 3911 return status; 3912 3913 /* Link partner not capable of lower speeds, return 10G */ 3914 *lcd_speed = IXGBE_LINK_SPEED_10GB_FULL; 3915 return status; 3916 } 3917 3918 /** 3919 * ixgbe_setup_fc_X550em - Set up flow control 3920 * @hw: pointer to hardware structure 3921 * 3922 * Called at init time to set up flow control. 3923 **/ 3924 s32 ixgbe_setup_fc_X550em(struct ixgbe_hw *hw) 3925 { 3926 s32 ret_val = IXGBE_SUCCESS; 3927 u32 pause, asm_dir, reg_val; 3928 3929 DEBUGFUNC("ixgbe_setup_fc_X550em"); 3930 3931 /* Validate the requested mode */ 3932 if (hw->fc.strict_ieee && hw->fc.requested_mode == ixgbe_fc_rx_pause) { 3933 ERROR_REPORT1(IXGBE_ERROR_UNSUPPORTED, 3934 "ixgbe_fc_rx_pause not valid in strict IEEE mode\n"); 3935 ret_val = IXGBE_ERR_INVALID_LINK_SETTINGS; 3936 goto out; 3937 } 3938 3939 /* 10gig parts do not have a word in the EEPROM to determine the 3940 * default flow control setting, so we explicitly set it to full. 3941 */ 3942 if (hw->fc.requested_mode == ixgbe_fc_default) 3943 hw->fc.requested_mode = ixgbe_fc_full; 3944 3945 /* Determine PAUSE and ASM_DIR bits. */ 3946 switch (hw->fc.requested_mode) { 3947 case ixgbe_fc_none: 3948 pause = 0; 3949 asm_dir = 0; 3950 break; 3951 case ixgbe_fc_tx_pause: 3952 pause = 0; 3953 asm_dir = 1; 3954 break; 3955 case ixgbe_fc_rx_pause: 3956 /* Rx Flow control is enabled and Tx Flow control is 3957 * disabled by software override. Since there really 3958 * isn't a way to advertise that we are capable of RX 3959 * Pause ONLY, we will advertise that we support both 3960 * symmetric and asymmetric Rx PAUSE, as such we fall 3961 * through to the fc_full statement. Later, we will 3962 * disable the adapter's ability to send PAUSE frames. 3963 */ 3964 case ixgbe_fc_full: 3965 pause = 1; 3966 asm_dir = 1; 3967 break; 3968 default: 3969 ERROR_REPORT1(IXGBE_ERROR_ARGUMENT, 3970 "Flow control param set incorrectly\n"); 3971 ret_val = IXGBE_ERR_CONFIG; 3972 goto out; 3973 } 3974 3975 switch (hw->device_id) { 3976 case IXGBE_DEV_ID_X550EM_X_KR: 3977 case IXGBE_DEV_ID_X550EM_A_KR: 3978 case IXGBE_DEV_ID_X550EM_A_KR_L: 3979 ret_val = hw->mac.ops.read_iosf_sb_reg(hw, 3980 IXGBE_KRM_AN_CNTL_1(hw->bus.lan_id), 3981 IXGBE_SB_IOSF_TARGET_KR_PHY, ®_val); 3982 if (ret_val != IXGBE_SUCCESS) 3983 goto out; 3984 reg_val &= ~(IXGBE_KRM_AN_CNTL_1_SYM_PAUSE | 3985 IXGBE_KRM_AN_CNTL_1_ASM_PAUSE); 3986 if (pause) 3987 reg_val |= IXGBE_KRM_AN_CNTL_1_SYM_PAUSE; 3988 if (asm_dir) 3989 reg_val |= IXGBE_KRM_AN_CNTL_1_ASM_PAUSE; 3990 ret_val = hw->mac.ops.write_iosf_sb_reg(hw, 3991 IXGBE_KRM_AN_CNTL_1(hw->bus.lan_id), 3992 IXGBE_SB_IOSF_TARGET_KR_PHY, reg_val); 3993 3994 /* This device does not fully support AN. */ 3995 hw->fc.disable_fc_autoneg = true; 3996 break; 3997 case IXGBE_DEV_ID_X550EM_X_XFI: 3998 hw->fc.disable_fc_autoneg = true; 3999 break; 4000 default: 4001 break; 4002 } 4003 4004 out: 4005 return ret_val; 4006 } 4007 4008 /** 4009 * ixgbe_fc_autoneg_backplane_x550em_a - Enable flow control IEEE clause 37 4010 * @hw: pointer to hardware structure 4011 * 4012 * Enable flow control according to IEEE clause 37. 4013 **/ 4014 void ixgbe_fc_autoneg_backplane_x550em_a(struct ixgbe_hw *hw) 4015 { 4016 u32 link_s1, lp_an_page_low, an_cntl_1; 4017 s32 status = IXGBE_ERR_FC_NOT_NEGOTIATED; 4018 ixgbe_link_speed speed; 4019 bool link_up; 4020 4021 /* AN should have completed when the cable was plugged in. 4022 * Look for reasons to bail out. Bail out if: 4023 * - FC autoneg is disabled, or if 4024 * - link is not up. 4025 */ 4026 if (hw->fc.disable_fc_autoneg) { 4027 ERROR_REPORT1(IXGBE_ERROR_UNSUPPORTED, 4028 "Flow control autoneg is disabled"); 4029 goto out; 4030 } 4031 4032 hw->mac.ops.check_link(hw, &speed, &link_up, false); 4033 if (!link_up) { 4034 ERROR_REPORT1(IXGBE_ERROR_SOFTWARE, "The link is down"); 4035 goto out; 4036 } 4037 4038 /* Check at auto-negotiation has completed */ 4039 status = hw->mac.ops.read_iosf_sb_reg(hw, 4040 IXGBE_KRM_LINK_S1(hw->bus.lan_id), 4041 IXGBE_SB_IOSF_TARGET_KR_PHY, &link_s1); 4042 4043 if (status != IXGBE_SUCCESS || 4044 (link_s1 & IXGBE_KRM_LINK_S1_MAC_AN_COMPLETE) == 0) { 4045 DEBUGOUT("Auto-Negotiation did not complete\n"); 4046 status = IXGBE_ERR_FC_NOT_NEGOTIATED; 4047 goto out; 4048 } 4049 4050 /* Read the 10g AN autoc and LP ability registers and resolve 4051 * local flow control settings accordingly 4052 */ 4053 status = hw->mac.ops.read_iosf_sb_reg(hw, 4054 IXGBE_KRM_AN_CNTL_1(hw->bus.lan_id), 4055 IXGBE_SB_IOSF_TARGET_KR_PHY, &an_cntl_1); 4056 4057 if (status != IXGBE_SUCCESS) { 4058 DEBUGOUT("Auto-Negotiation did not complete\n"); 4059 goto out; 4060 } 4061 4062 status = hw->mac.ops.read_iosf_sb_reg(hw, 4063 IXGBE_KRM_LP_BASE_PAGE_HIGH(hw->bus.lan_id), 4064 IXGBE_SB_IOSF_TARGET_KR_PHY, &lp_an_page_low); 4065 4066 if (status != IXGBE_SUCCESS) { 4067 DEBUGOUT("Auto-Negotiation did not complete\n"); 4068 goto out; 4069 } 4070 4071 status = ixgbe_negotiate_fc(hw, an_cntl_1, lp_an_page_low, 4072 IXGBE_KRM_AN_CNTL_1_SYM_PAUSE, 4073 IXGBE_KRM_AN_CNTL_1_ASM_PAUSE, 4074 IXGBE_KRM_LP_BASE_PAGE_HIGH_SYM_PAUSE, 4075 IXGBE_KRM_LP_BASE_PAGE_HIGH_ASM_PAUSE); 4076 4077 out: 4078 if (status == IXGBE_SUCCESS) { 4079 hw->fc.fc_was_autonegged = true; 4080 } else { 4081 hw->fc.fc_was_autonegged = false; 4082 hw->fc.current_mode = hw->fc.requested_mode; 4083 } 4084 } 4085 4086 /** 4087 * ixgbe_fc_autoneg_fiber_x550em_a - passthrough FC settings 4088 * @hw: pointer to hardware structure 4089 * 4090 **/ 4091 void ixgbe_fc_autoneg_fiber_x550em_a(struct ixgbe_hw *hw) 4092 { 4093 hw->fc.fc_was_autonegged = false; 4094 hw->fc.current_mode = hw->fc.requested_mode; 4095 } 4096 4097 /** 4098 * ixgbe_fc_autoneg_sgmii_x550em_a - Enable flow control IEEE clause 37 4099 * @hw: pointer to hardware structure 4100 * 4101 * Enable flow control according to IEEE clause 37. 4102 **/ 4103 void ixgbe_fc_autoneg_sgmii_x550em_a(struct ixgbe_hw *hw) 4104 { 4105 s32 status = IXGBE_ERR_FC_NOT_NEGOTIATED; 4106 u32 info[FW_PHY_ACT_DATA_COUNT] = { 0 }; 4107 ixgbe_link_speed speed; 4108 bool link_up; 4109 4110 /* AN should have completed when the cable was plugged in. 4111 * Look for reasons to bail out. Bail out if: 4112 * - FC autoneg is disabled, or if 4113 * - link is not up. 4114 */ 4115 if (hw->fc.disable_fc_autoneg) { 4116 ERROR_REPORT1(IXGBE_ERROR_UNSUPPORTED, 4117 "Flow control autoneg is disabled"); 4118 goto out; 4119 } 4120 4121 hw->mac.ops.check_link(hw, &speed, &link_up, false); 4122 if (!link_up) { 4123 ERROR_REPORT1(IXGBE_ERROR_SOFTWARE, "The link is down"); 4124 goto out; 4125 } 4126 4127 /* Check if auto-negotiation has completed */ 4128 status = ixgbe_fw_phy_activity(hw, FW_PHY_ACT_GET_LINK_INFO, &info); 4129 if (status != IXGBE_SUCCESS || 4130 !(info[0] & FW_PHY_ACT_GET_LINK_INFO_AN_COMPLETE)) { 4131 DEBUGOUT("Auto-Negotiation did not complete\n"); 4132 status = IXGBE_ERR_FC_NOT_NEGOTIATED; 4133 goto out; 4134 } 4135 4136 /* Negotiate the flow control */ 4137 status = ixgbe_negotiate_fc(hw, info[0], info[0], 4138 FW_PHY_ACT_GET_LINK_INFO_FC_RX, 4139 FW_PHY_ACT_GET_LINK_INFO_FC_TX, 4140 FW_PHY_ACT_GET_LINK_INFO_LP_FC_RX, 4141 FW_PHY_ACT_GET_LINK_INFO_LP_FC_TX); 4142 4143 out: 4144 if (status == IXGBE_SUCCESS) { 4145 hw->fc.fc_was_autonegged = true; 4146 } else { 4147 hw->fc.fc_was_autonegged = false; 4148 hw->fc.current_mode = hw->fc.requested_mode; 4149 } 4150 } 4151 4152 /** 4153 * ixgbe_setup_fc_backplane_x550em_a - Set up flow control 4154 * @hw: pointer to hardware structure 4155 * 4156 * Called at init time to set up flow control. 4157 **/ 4158 s32 ixgbe_setup_fc_backplane_x550em_a(struct ixgbe_hw *hw) 4159 { 4160 s32 status = IXGBE_SUCCESS; 4161 u32 an_cntl = 0; 4162 4163 DEBUGFUNC("ixgbe_setup_fc_backplane_x550em_a"); 4164 4165 /* Validate the requested mode */ 4166 if (hw->fc.strict_ieee && hw->fc.requested_mode == ixgbe_fc_rx_pause) { 4167 ERROR_REPORT1(IXGBE_ERROR_UNSUPPORTED, 4168 "ixgbe_fc_rx_pause not valid in strict IEEE mode\n"); 4169 return IXGBE_ERR_INVALID_LINK_SETTINGS; 4170 } 4171 4172 if (hw->fc.requested_mode == ixgbe_fc_default) 4173 hw->fc.requested_mode = ixgbe_fc_full; 4174 4175 /* Set up the 1G and 10G flow control advertisement registers so the 4176 * HW will be able to do FC autoneg once the cable is plugged in. If 4177 * we link at 10G, the 1G advertisement is harmless and vice versa. 4178 */ 4179 status = hw->mac.ops.read_iosf_sb_reg(hw, 4180 IXGBE_KRM_AN_CNTL_1(hw->bus.lan_id), 4181 IXGBE_SB_IOSF_TARGET_KR_PHY, &an_cntl); 4182 4183 if (status != IXGBE_SUCCESS) { 4184 DEBUGOUT("Auto-Negotiation did not complete\n"); 4185 return status; 4186 } 4187 4188 /* The possible values of fc.requested_mode are: 4189 * 0: Flow control is completely disabled 4190 * 1: Rx flow control is enabled (we can receive pause frames, 4191 * but not send pause frames). 4192 * 2: Tx flow control is enabled (we can send pause frames but 4193 * we do not support receiving pause frames). 4194 * 3: Both Rx and Tx flow control (symmetric) are enabled. 4195 * other: Invalid. 4196 */ 4197 switch (hw->fc.requested_mode) { 4198 case ixgbe_fc_none: 4199 /* Flow control completely disabled by software override. */ 4200 an_cntl &= ~(IXGBE_KRM_AN_CNTL_1_SYM_PAUSE | 4201 IXGBE_KRM_AN_CNTL_1_ASM_PAUSE); 4202 break; 4203 case ixgbe_fc_tx_pause: 4204 /* Tx Flow control is enabled, and Rx Flow control is 4205 * disabled by software override. 4206 */ 4207 an_cntl |= IXGBE_KRM_AN_CNTL_1_ASM_PAUSE; 4208 an_cntl &= ~IXGBE_KRM_AN_CNTL_1_SYM_PAUSE; 4209 break; 4210 case ixgbe_fc_rx_pause: 4211 /* Rx Flow control is enabled and Tx Flow control is 4212 * disabled by software override. Since there really 4213 * isn't a way to advertise that we are capable of RX 4214 * Pause ONLY, we will advertise that we support both 4215 * symmetric and asymmetric Rx PAUSE, as such we fall 4216 * through to the fc_full statement. Later, we will 4217 * disable the adapter's ability to send PAUSE frames. 4218 */ 4219 case ixgbe_fc_full: 4220 /* Flow control (both Rx and Tx) is enabled by SW override. */ 4221 an_cntl |= IXGBE_KRM_AN_CNTL_1_SYM_PAUSE | 4222 IXGBE_KRM_AN_CNTL_1_ASM_PAUSE; 4223 break; 4224 default: 4225 ERROR_REPORT1(IXGBE_ERROR_ARGUMENT, 4226 "Flow control param set incorrectly\n"); 4227 return IXGBE_ERR_CONFIG; 4228 } 4229 4230 status = hw->mac.ops.write_iosf_sb_reg(hw, 4231 IXGBE_KRM_AN_CNTL_1(hw->bus.lan_id), 4232 IXGBE_SB_IOSF_TARGET_KR_PHY, an_cntl); 4233 4234 /* Restart auto-negotiation. */ 4235 status = ixgbe_restart_an_internal_phy_x550em(hw); 4236 4237 return status; 4238 } 4239 4240 /** 4241 * ixgbe_set_mux - Set mux for port 1 access with CS4227 4242 * @hw: pointer to hardware structure 4243 * @state: set mux if 1, clear if 0 4244 */ 4245 static void ixgbe_set_mux(struct ixgbe_hw *hw, u8 state) 4246 { 4247 u32 esdp; 4248 4249 if (!hw->bus.lan_id) 4250 return; 4251 esdp = IXGBE_READ_REG(hw, IXGBE_ESDP); 4252 if (state) 4253 esdp |= IXGBE_ESDP_SDP1; 4254 else 4255 esdp &= ~IXGBE_ESDP_SDP1; 4256 IXGBE_WRITE_REG(hw, IXGBE_ESDP, esdp); 4257 IXGBE_WRITE_FLUSH(hw); 4258 } 4259 4260 /** 4261 * ixgbe_acquire_swfw_sync_X550em - Acquire SWFW semaphore 4262 * @hw: pointer to hardware structure 4263 * @mask: Mask to specify which semaphore to acquire 4264 * 4265 * Acquires the SWFW semaphore and sets the I2C MUX 4266 **/ 4267 s32 ixgbe_acquire_swfw_sync_X550em(struct ixgbe_hw *hw, u32 mask) 4268 { 4269 s32 status; 4270 4271 DEBUGFUNC("ixgbe_acquire_swfw_sync_X550em"); 4272 4273 status = ixgbe_acquire_swfw_sync_X540(hw, mask); 4274 if (status) 4275 return status; 4276 4277 if (mask & IXGBE_GSSR_I2C_MASK) 4278 ixgbe_set_mux(hw, 1); 4279 4280 return IXGBE_SUCCESS; 4281 } 4282 4283 /** 4284 * ixgbe_release_swfw_sync_X550em - Release SWFW semaphore 4285 * @hw: pointer to hardware structure 4286 * @mask: Mask to specify which semaphore to release 4287 * 4288 * Releases the SWFW semaphore and sets the I2C MUX 4289 **/ 4290 void ixgbe_release_swfw_sync_X550em(struct ixgbe_hw *hw, u32 mask) 4291 { 4292 DEBUGFUNC("ixgbe_release_swfw_sync_X550em"); 4293 4294 if (mask & IXGBE_GSSR_I2C_MASK) 4295 ixgbe_set_mux(hw, 0); 4296 4297 ixgbe_release_swfw_sync_X540(hw, mask); 4298 } 4299 4300 /** 4301 * ixgbe_acquire_swfw_sync_X550a - Acquire SWFW semaphore 4302 * @hw: pointer to hardware structure 4303 * @mask: Mask to specify which semaphore to acquire 4304 * 4305 * Acquires the SWFW semaphore and get the shared phy token as needed 4306 */ 4307 static s32 ixgbe_acquire_swfw_sync_X550a(struct ixgbe_hw *hw, u32 mask) 4308 { 4309 u32 hmask = mask & ~IXGBE_GSSR_TOKEN_SM; 4310 int retries = FW_PHY_TOKEN_RETRIES; 4311 s32 status = IXGBE_SUCCESS; 4312 4313 DEBUGFUNC("ixgbe_acquire_swfw_sync_X550a"); 4314 4315 while (--retries) { 4316 status = IXGBE_SUCCESS; 4317 if (hmask) 4318 status = ixgbe_acquire_swfw_sync_X540(hw, hmask); 4319 if (status) { 4320 DEBUGOUT1("Could not acquire SWFW semaphore, Status = %d\n", 4321 status); 4322 return status; 4323 } 4324 if (!(mask & IXGBE_GSSR_TOKEN_SM)) 4325 return IXGBE_SUCCESS; 4326 4327 status = ixgbe_get_phy_token(hw); 4328 if (status == IXGBE_ERR_TOKEN_RETRY) 4329 DEBUGOUT1("Could not acquire PHY token, Status = %d\n", 4330 status); 4331 4332 if (status == IXGBE_SUCCESS) 4333 return IXGBE_SUCCESS; 4334 4335 if (hmask) 4336 ixgbe_release_swfw_sync_X540(hw, hmask); 4337 4338 if (status != IXGBE_ERR_TOKEN_RETRY) { 4339 DEBUGOUT1("Unable to retry acquiring the PHY token, Status = %d\n", 4340 status); 4341 return status; 4342 } 4343 } 4344 4345 DEBUGOUT1("Semaphore acquisition retries failed!: PHY ID = 0x%08X\n", 4346 hw->phy.id); 4347 return status; 4348 } 4349 4350 /** 4351 * ixgbe_release_swfw_sync_X550a - Release SWFW semaphore 4352 * @hw: pointer to hardware structure 4353 * @mask: Mask to specify which semaphore to release 4354 * 4355 * Releases the SWFW semaphore and puts the shared phy token as needed 4356 */ 4357 static void ixgbe_release_swfw_sync_X550a(struct ixgbe_hw *hw, u32 mask) 4358 { 4359 u32 hmask = mask & ~IXGBE_GSSR_TOKEN_SM; 4360 4361 DEBUGFUNC("ixgbe_release_swfw_sync_X550a"); 4362 4363 if (mask & IXGBE_GSSR_TOKEN_SM) 4364 ixgbe_put_phy_token(hw); 4365 4366 if (hmask) 4367 ixgbe_release_swfw_sync_X540(hw, hmask); 4368 } 4369 4370 /** 4371 * ixgbe_read_phy_reg_x550a - Reads specified PHY register 4372 * @hw: pointer to hardware structure 4373 * @reg_addr: 32 bit address of PHY register to read 4374 * @device_type: 5 bit device type 4375 * @phy_data: Pointer to read data from PHY register 4376 * 4377 * Reads a value from a specified PHY register using the SWFW lock and PHY 4378 * Token. The PHY Token is needed since the MDIO is shared between to MAC 4379 * instances. 4380 **/ 4381 s32 ixgbe_read_phy_reg_x550a(struct ixgbe_hw *hw, u32 reg_addr, 4382 u32 device_type, u16 *phy_data) 4383 { 4384 s32 status; 4385 u32 mask = hw->phy.phy_semaphore_mask | IXGBE_GSSR_TOKEN_SM; 4386 4387 DEBUGFUNC("ixgbe_read_phy_reg_x550a"); 4388 4389 if (hw->mac.ops.acquire_swfw_sync(hw, mask)) 4390 return IXGBE_ERR_SWFW_SYNC; 4391 4392 status = hw->phy.ops.read_reg_mdi(hw, reg_addr, device_type, phy_data); 4393 4394 hw->mac.ops.release_swfw_sync(hw, mask); 4395 4396 return status; 4397 } 4398 4399 /** 4400 * ixgbe_write_phy_reg_x550a - Writes specified PHY register 4401 * @hw: pointer to hardware structure 4402 * @reg_addr: 32 bit PHY register to write 4403 * @device_type: 5 bit device type 4404 * @phy_data: Data to write to the PHY register 4405 * 4406 * Writes a value to specified PHY register using the SWFW lock and PHY Token. 4407 * The PHY Token is needed since the MDIO is shared between to MAC instances. 4408 **/ 4409 s32 ixgbe_write_phy_reg_x550a(struct ixgbe_hw *hw, u32 reg_addr, 4410 u32 device_type, u16 phy_data) 4411 { 4412 s32 status; 4413 u32 mask = hw->phy.phy_semaphore_mask | IXGBE_GSSR_TOKEN_SM; 4414 4415 DEBUGFUNC("ixgbe_write_phy_reg_x550a"); 4416 4417 if (hw->mac.ops.acquire_swfw_sync(hw, mask) == IXGBE_SUCCESS) { 4418 status = hw->phy.ops.write_reg_mdi(hw, reg_addr, device_type, 4419 phy_data); 4420 hw->mac.ops.release_swfw_sync(hw, mask); 4421 } else { 4422 status = IXGBE_ERR_SWFW_SYNC; 4423 } 4424 4425 return status; 4426 } 4427 4428 /** 4429 * ixgbe_handle_lasi_ext_t_x550em - Handle external Base T PHY interrupt 4430 * @hw: pointer to hardware structure 4431 * 4432 * Handle external Base T PHY interrupt. If high temperature 4433 * failure alarm then return error, else if link status change 4434 * then setup internal/external PHY link 4435 * 4436 * Return IXGBE_ERR_OVERTEMP if interrupt is high temperature 4437 * failure alarm, else return PHY access status. 4438 */ 4439 s32 ixgbe_handle_lasi_ext_t_x550em(struct ixgbe_hw *hw) 4440 { 4441 bool lsc; 4442 u32 status; 4443 4444 status = ixgbe_get_lasi_ext_t_x550em(hw, &lsc); 4445 4446 if (status != IXGBE_SUCCESS) 4447 return status; 4448 4449 if (lsc) 4450 return ixgbe_setup_internal_phy(hw); 4451 4452 return IXGBE_SUCCESS; 4453 } 4454 4455 /** 4456 * ixgbe_setup_mac_link_t_X550em - Sets the auto advertised link speed 4457 * @hw: pointer to hardware structure 4458 * @speed: new link speed 4459 * @autoneg_wait_to_complete: true when waiting for completion is needed 4460 * 4461 * Setup internal/external PHY link speed based on link speed, then set 4462 * external PHY auto advertised link speed. 4463 * 4464 * Returns error status for any failure 4465 **/ 4466 s32 ixgbe_setup_mac_link_t_X550em(struct ixgbe_hw *hw, 4467 ixgbe_link_speed speed, 4468 bool autoneg_wait_to_complete) 4469 { 4470 s32 status; 4471 ixgbe_link_speed force_speed; 4472 u32 i; 4473 bool link_up = false; 4474 4475 DEBUGFUNC("ixgbe_setup_mac_link_t_X550em"); 4476 4477 /* Setup internal/external PHY link speed to iXFI (10G), unless 4478 * only 1G is auto advertised then setup KX link. 4479 */ 4480 if (speed & IXGBE_LINK_SPEED_10GB_FULL) 4481 force_speed = IXGBE_LINK_SPEED_10GB_FULL; 4482 else 4483 force_speed = IXGBE_LINK_SPEED_1GB_FULL; 4484 4485 /* If X552 and internal link mode is XFI, then setup XFI internal link. 4486 */ 4487 if (hw->mac.type == ixgbe_mac_X550EM_x && 4488 !(hw->phy.nw_mng_if_sel & IXGBE_NW_MNG_IF_SEL_INT_PHY_MODE)) { 4489 status = ixgbe_setup_ixfi_x550em(hw, &force_speed); 4490 4491 if (status != IXGBE_SUCCESS) 4492 return status; 4493 4494 /* Wait for the controller to acquire link */ 4495 for (i = 0; i < 10; i++) { 4496 msec_delay(100); 4497 4498 status = ixgbe_check_link(hw, &force_speed, &link_up, 4499 false); 4500 if (status != IXGBE_SUCCESS) 4501 return status; 4502 4503 if (link_up) 4504 break; 4505 } 4506 } 4507 4508 return hw->phy.ops.setup_link_speed(hw, speed, autoneg_wait_to_complete); 4509 } 4510 4511 /** 4512 * ixgbe_check_link_t_X550em - Determine link and speed status 4513 * @hw: pointer to hardware structure 4514 * @speed: pointer to link speed 4515 * @link_up: true when link is up 4516 * @link_up_wait_to_complete: bool used to wait for link up or not 4517 * 4518 * Check that both the MAC and X557 external PHY have link. 4519 **/ 4520 s32 ixgbe_check_link_t_X550em(struct ixgbe_hw *hw, ixgbe_link_speed *speed, 4521 bool *link_up, bool link_up_wait_to_complete) 4522 { 4523 u32 status; 4524 u16 i, autoneg_status = 0; 4525 4526 if (hw->mac.ops.get_media_type(hw) != ixgbe_media_type_copper) 4527 return IXGBE_ERR_CONFIG; 4528 4529 status = ixgbe_check_mac_link_generic(hw, speed, link_up, 4530 link_up_wait_to_complete); 4531 4532 /* If check link fails or MAC link is not up, then return */ 4533 if (status != IXGBE_SUCCESS || !(*link_up)) 4534 return status; 4535 4536 /* MAC link is up, so check external PHY link. 4537 * X557 PHY. Link status is latching low, and can only be used to detect 4538 * link drop, and not the current status of the link without performing 4539 * back-to-back reads. 4540 */ 4541 for (i = 0; i < 2; i++) { 4542 status = hw->phy.ops.read_reg(hw, IXGBE_MDIO_AUTO_NEG_STATUS, 4543 IXGBE_MDIO_AUTO_NEG_DEV_TYPE, 4544 &autoneg_status); 4545 4546 if (status != IXGBE_SUCCESS) 4547 return status; 4548 } 4549 4550 /* If external PHY link is not up, then indicate link not up */ 4551 if (!(autoneg_status & IXGBE_MDIO_AUTO_NEG_LINK_STATUS)) 4552 *link_up = false; 4553 4554 return IXGBE_SUCCESS; 4555 } 4556 4557 /** 4558 * ixgbe_reset_phy_t_X550em - Performs X557 PHY reset and enables LASI 4559 * @hw: pointer to hardware structure 4560 **/ 4561 s32 ixgbe_reset_phy_t_X550em(struct ixgbe_hw *hw) 4562 { 4563 s32 status; 4564 4565 status = ixgbe_reset_phy_generic(hw); 4566 4567 if (status != IXGBE_SUCCESS) 4568 return status; 4569 4570 /* Configure Link Status Alarm and Temperature Threshold interrupts */ 4571 return ixgbe_enable_lasi_ext_t_x550em(hw); 4572 } 4573 4574 /** 4575 * ixgbe_led_on_t_X550em - Turns on the software controllable LEDs. 4576 * @hw: pointer to hardware structure 4577 * @led_idx: led number to turn on 4578 **/ 4579 s32 ixgbe_led_on_t_X550em(struct ixgbe_hw *hw, u32 led_idx) 4580 { 4581 u16 phy_data; 4582 4583 DEBUGFUNC("ixgbe_led_on_t_X550em"); 4584 4585 if (led_idx >= IXGBE_X557_MAX_LED_INDEX) 4586 return IXGBE_ERR_PARAM; 4587 4588 /* To turn on the LED, set mode to ON. */ 4589 ixgbe_read_phy_reg(hw, IXGBE_X557_LED_PROVISIONING + led_idx, 4590 IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE, &phy_data); 4591 phy_data |= IXGBE_X557_LED_MANUAL_SET_MASK; 4592 ixgbe_write_phy_reg(hw, IXGBE_X557_LED_PROVISIONING + led_idx, 4593 IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE, phy_data); 4594 4595 /* Some designs have the LEDs wired to the MAC */ 4596 return ixgbe_led_on_generic(hw, led_idx); 4597 } 4598 4599 /** 4600 * ixgbe_led_off_t_X550em - Turns off the software controllable LEDs. 4601 * @hw: pointer to hardware structure 4602 * @led_idx: led number to turn off 4603 **/ 4604 s32 ixgbe_led_off_t_X550em(struct ixgbe_hw *hw, u32 led_idx) 4605 { 4606 u16 phy_data; 4607 4608 DEBUGFUNC("ixgbe_led_off_t_X550em"); 4609 4610 if (led_idx >= IXGBE_X557_MAX_LED_INDEX) 4611 return IXGBE_ERR_PARAM; 4612 4613 /* To turn on the LED, set mode to ON. */ 4614 ixgbe_read_phy_reg(hw, IXGBE_X557_LED_PROVISIONING + led_idx, 4615 IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE, &phy_data); 4616 phy_data &= ~IXGBE_X557_LED_MANUAL_SET_MASK; 4617 ixgbe_write_phy_reg(hw, IXGBE_X557_LED_PROVISIONING + led_idx, 4618 IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE, phy_data); 4619 4620 /* Some designs have the LEDs wired to the MAC */ 4621 return ixgbe_led_off_generic(hw, led_idx); 4622 } 4623 4624 /** 4625 * ixgbe_set_fw_drv_ver_x550 - Sends driver version to firmware 4626 * @hw: pointer to the HW structure 4627 * @maj: driver version major number 4628 * @min: driver version minor number 4629 * @build: driver version build number 4630 * @sub: driver version sub build number 4631 * @len: length of driver_ver string 4632 * @driver_ver: driver string 4633 * 4634 * Sends driver version number to firmware through the manageability 4635 * block. On success return IXGBE_SUCCESS 4636 * else returns IXGBE_ERR_SWFW_SYNC when encountering an error acquiring 4637 * semaphore or IXGBE_ERR_HOST_INTERFACE_COMMAND when command fails. 4638 **/ 4639 s32 ixgbe_set_fw_drv_ver_x550(struct ixgbe_hw *hw, u8 maj, u8 min, 4640 u8 build, u8 sub, u16 len, const char *driver_ver) 4641 { 4642 struct ixgbe_hic_drv_info2 fw_cmd; 4643 s32 ret_val = IXGBE_SUCCESS; 4644 int i; 4645 4646 DEBUGFUNC("ixgbe_set_fw_drv_ver_x550"); 4647 4648 if ((len == 0) || (driver_ver == NULL) || 4649 (len > sizeof(fw_cmd.driver_string))) 4650 return IXGBE_ERR_INVALID_ARGUMENT; 4651 4652 fw_cmd.hdr.cmd = FW_CEM_CMD_DRIVER_INFO; 4653 fw_cmd.hdr.buf_len = FW_CEM_CMD_DRIVER_INFO_LEN + len; 4654 fw_cmd.hdr.cmd_or_resp.cmd_resv = FW_CEM_CMD_RESERVED; 4655 fw_cmd.port_num = (u8)hw->bus.func; 4656 fw_cmd.ver_maj = maj; 4657 fw_cmd.ver_min = min; 4658 fw_cmd.ver_build = build; 4659 fw_cmd.ver_sub = sub; 4660 fw_cmd.hdr.checksum = 0; 4661 memcpy(fw_cmd.driver_string, driver_ver, len); 4662 fw_cmd.hdr.checksum = ixgbe_calculate_checksum((u8 *)&fw_cmd, 4663 (FW_CEM_HDR_LEN + fw_cmd.hdr.buf_len)); 4664 4665 for (i = 0; i <= FW_CEM_MAX_RETRIES; i++) { 4666 ret_val = ixgbe_host_interface_command(hw, (u32 *)&fw_cmd, 4667 sizeof(fw_cmd), 4668 IXGBE_HI_COMMAND_TIMEOUT, 4669 true); 4670 if (ret_val != IXGBE_SUCCESS) 4671 continue; 4672 4673 if (fw_cmd.hdr.cmd_or_resp.ret_status == 4674 FW_CEM_RESP_STATUS_SUCCESS) 4675 ret_val = IXGBE_SUCCESS; 4676 else 4677 ret_val = IXGBE_ERR_HOST_INTERFACE_COMMAND; 4678 4679 break; 4680 } 4681 4682 return ret_val; 4683 } 4684 4685 /** 4686 * ixgbe_fw_recovery_mode_X550 - Check FW NVM recovery mode 4687 * @hw: pointer t hardware structure 4688 * 4689 * Returns true if in FW NVM recovery mode. 4690 **/ 4691 bool ixgbe_fw_recovery_mode_X550(struct ixgbe_hw *hw) 4692 { 4693 u32 fwsm; 4694 4695 fwsm = IXGBE_READ_REG(hw, IXGBE_FWSM_BY_MAC(hw)); 4696 4697 return !!(fwsm & IXGBE_FWSM_FW_NVM_RECOVERY_MODE); 4698 } 4699