1 /*******************************************************************************
3 Copyright (c) 2001-2015, Intel Corporation
6 Redistribution and use in source and binary forms, with or without
7 modification, are permitted provided that the following conditions are met:
9 1. Redistributions of source code must retain the above copyright notice,
10 this list of conditions and the following disclaimer.
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.
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.
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.
32 ***************************************************************************/
34 #include "ixgbe_x550.h"
35 #include "ixgbe_x540.h"
36 #include "ixgbe_type.h"
37 #include "ixgbe_api.h"
38 #include "ixgbe_common.h"
39 #include "ixgbe_phy.h"
41 STATIC s32 ixgbe_setup_ixfi_x550em(struct ixgbe_hw *hw, ixgbe_link_speed *speed);
42 STATIC s32 ixgbe_acquire_swfw_sync_X550a(struct ixgbe_hw *, u32 mask);
43 STATIC void ixgbe_release_swfw_sync_X550a(struct ixgbe_hw *, u32 mask);
44 STATIC s32 ixgbe_read_mng_if_sel_x550em(struct ixgbe_hw *hw);
47 * ixgbe_init_ops_X550 - Inits func ptrs and MAC type
48 * @hw: pointer to hardware structure
50 * Initialize the function pointers and assign the MAC type for X550.
51 * Does not touch the hardware.
53 s32 ixgbe_init_ops_X550(struct ixgbe_hw *hw)
55 struct ixgbe_mac_info *mac = &hw->mac;
56 struct ixgbe_eeprom_info *eeprom = &hw->eeprom;
59 DEBUGFUNC("ixgbe_init_ops_X550");
61 ret_val = ixgbe_init_ops_X540(hw);
62 mac->ops.dmac_config = ixgbe_dmac_config_X550;
63 mac->ops.dmac_config_tcs = ixgbe_dmac_config_tcs_X550;
64 mac->ops.dmac_update_tcs = ixgbe_dmac_update_tcs_X550;
65 mac->ops.setup_eee = NULL;
66 mac->ops.set_source_address_pruning =
67 ixgbe_set_source_address_pruning_X550;
68 mac->ops.set_ethertype_anti_spoofing =
69 ixgbe_set_ethertype_anti_spoofing_X550;
71 mac->ops.get_rtrup2tc = ixgbe_dcb_get_rtrup2tc_generic;
72 eeprom->ops.init_params = ixgbe_init_eeprom_params_X550;
73 eeprom->ops.calc_checksum = ixgbe_calc_eeprom_checksum_X550;
74 eeprom->ops.read = ixgbe_read_ee_hostif_X550;
75 eeprom->ops.read_buffer = ixgbe_read_ee_hostif_buffer_X550;
76 eeprom->ops.write = ixgbe_write_ee_hostif_X550;
77 eeprom->ops.write_buffer = ixgbe_write_ee_hostif_buffer_X550;
78 eeprom->ops.update_checksum = ixgbe_update_eeprom_checksum_X550;
79 eeprom->ops.validate_checksum = ixgbe_validate_eeprom_checksum_X550;
81 mac->ops.disable_mdd = ixgbe_disable_mdd_X550;
82 mac->ops.enable_mdd = ixgbe_enable_mdd_X550;
83 mac->ops.mdd_event = ixgbe_mdd_event_X550;
84 mac->ops.restore_mdd_vf = ixgbe_restore_mdd_vf_X550;
85 mac->ops.disable_rx = ixgbe_disable_rx_x550;
86 /* Manageability interface */
87 mac->ops.set_fw_drv_ver = ixgbe_set_fw_drv_ver_x550;
88 switch (hw->device_id) {
89 case IXGBE_DEV_ID_X550EM_X_10G_T:
90 case IXGBE_DEV_ID_X550EM_A_10G_T:
91 hw->mac.ops.led_on = ixgbe_led_on_t_X550em;
92 hw->mac.ops.led_off = ixgbe_led_off_t_X550em;
101 * ixgbe_read_cs4227 - Read CS4227 register
102 * @hw: pointer to hardware structure
103 * @reg: register number to write
104 * @value: pointer to receive value read
106 * Returns status code
108 STATIC s32 ixgbe_read_cs4227(struct ixgbe_hw *hw, u16 reg, u16 *value)
110 return hw->link.ops.read_link_unlocked(hw, hw->link.addr, reg, value);
114 * ixgbe_write_cs4227 - Write CS4227 register
115 * @hw: pointer to hardware structure
116 * @reg: register number to write
117 * @value: value to write to register
119 * Returns status code
121 STATIC s32 ixgbe_write_cs4227(struct ixgbe_hw *hw, u16 reg, u16 value)
123 return hw->link.ops.write_link_unlocked(hw, hw->link.addr, reg, value);
127 * ixgbe_read_pe - Read register from port expander
128 * @hw: pointer to hardware structure
129 * @reg: register number to read
130 * @value: pointer to receive read value
132 * Returns status code
134 STATIC s32 ixgbe_read_pe(struct ixgbe_hw *hw, u8 reg, u8 *value)
138 status = ixgbe_read_i2c_byte_unlocked(hw, reg, IXGBE_PE, value);
139 if (status != IXGBE_SUCCESS)
140 ERROR_REPORT2(IXGBE_ERROR_CAUTION,
141 "port expander access failed with %d\n", status);
146 * ixgbe_write_pe - Write register to port expander
147 * @hw: pointer to hardware structure
148 * @reg: register number to write
149 * @value: value to write
151 * Returns status code
153 STATIC s32 ixgbe_write_pe(struct ixgbe_hw *hw, u8 reg, u8 value)
157 status = ixgbe_write_i2c_byte_unlocked(hw, reg, IXGBE_PE, value);
158 if (status != IXGBE_SUCCESS)
159 ERROR_REPORT2(IXGBE_ERROR_CAUTION,
160 "port expander access failed with %d\n", status);
165 * ixgbe_reset_cs4227 - Reset CS4227 using port expander
166 * @hw: pointer to hardware structure
168 * This function assumes that the caller has acquired the proper semaphore.
171 STATIC s32 ixgbe_reset_cs4227(struct ixgbe_hw *hw)
178 /* Trigger hard reset. */
179 status = ixgbe_read_pe(hw, IXGBE_PE_OUTPUT, ®);
180 if (status != IXGBE_SUCCESS)
182 reg |= IXGBE_PE_BIT1;
183 status = ixgbe_write_pe(hw, IXGBE_PE_OUTPUT, reg);
184 if (status != IXGBE_SUCCESS)
187 status = ixgbe_read_pe(hw, IXGBE_PE_CONFIG, ®);
188 if (status != IXGBE_SUCCESS)
190 reg &= ~IXGBE_PE_BIT1;
191 status = ixgbe_write_pe(hw, IXGBE_PE_CONFIG, reg);
192 if (status != IXGBE_SUCCESS)
195 status = ixgbe_read_pe(hw, IXGBE_PE_OUTPUT, ®);
196 if (status != IXGBE_SUCCESS)
198 reg &= ~IXGBE_PE_BIT1;
199 status = ixgbe_write_pe(hw, IXGBE_PE_OUTPUT, reg);
200 if (status != IXGBE_SUCCESS)
203 usec_delay(IXGBE_CS4227_RESET_HOLD);
205 status = ixgbe_read_pe(hw, IXGBE_PE_OUTPUT, ®);
206 if (status != IXGBE_SUCCESS)
208 reg |= IXGBE_PE_BIT1;
209 status = ixgbe_write_pe(hw, IXGBE_PE_OUTPUT, reg);
210 if (status != IXGBE_SUCCESS)
213 /* Wait for the reset to complete. */
214 msec_delay(IXGBE_CS4227_RESET_DELAY);
215 for (retry = 0; retry < IXGBE_CS4227_RETRIES; retry++) {
216 status = ixgbe_read_cs4227(hw, IXGBE_CS4227_EFUSE_STATUS,
218 if (status == IXGBE_SUCCESS &&
219 value == IXGBE_CS4227_EEPROM_LOAD_OK)
221 msec_delay(IXGBE_CS4227_CHECK_DELAY);
223 if (retry == IXGBE_CS4227_RETRIES) {
224 ERROR_REPORT1(IXGBE_ERROR_INVALID_STATE,
225 "CS4227 reset did not complete.");
226 return IXGBE_ERR_PHY;
229 status = ixgbe_read_cs4227(hw, IXGBE_CS4227_EEPROM_STATUS, &value);
230 if (status != IXGBE_SUCCESS ||
231 !(value & IXGBE_CS4227_EEPROM_LOAD_OK)) {
232 ERROR_REPORT1(IXGBE_ERROR_INVALID_STATE,
233 "CS4227 EEPROM did not load successfully.");
234 return IXGBE_ERR_PHY;
237 return IXGBE_SUCCESS;
241 * ixgbe_check_cs4227 - Check CS4227 and reset as needed
242 * @hw: pointer to hardware structure
244 STATIC void ixgbe_check_cs4227(struct ixgbe_hw *hw)
246 s32 status = IXGBE_SUCCESS;
247 u32 swfw_mask = hw->phy.phy_semaphore_mask;
251 for (retry = 0; retry < IXGBE_CS4227_RETRIES; retry++) {
252 status = hw->mac.ops.acquire_swfw_sync(hw, swfw_mask);
253 if (status != IXGBE_SUCCESS) {
254 ERROR_REPORT2(IXGBE_ERROR_CAUTION,
255 "semaphore failed with %d", status);
256 msec_delay(IXGBE_CS4227_CHECK_DELAY);
260 /* Get status of reset flow. */
261 status = ixgbe_read_cs4227(hw, IXGBE_CS4227_SCRATCH, &value);
263 if (status == IXGBE_SUCCESS &&
264 value == IXGBE_CS4227_RESET_COMPLETE)
267 if (status != IXGBE_SUCCESS ||
268 value != IXGBE_CS4227_RESET_PENDING)
271 /* Reset is pending. Wait and check again. */
272 hw->mac.ops.release_swfw_sync(hw, swfw_mask);
273 msec_delay(IXGBE_CS4227_CHECK_DELAY);
276 /* If still pending, assume other instance failed. */
277 if (retry == IXGBE_CS4227_RETRIES) {
278 status = hw->mac.ops.acquire_swfw_sync(hw, swfw_mask);
279 if (status != IXGBE_SUCCESS) {
280 ERROR_REPORT2(IXGBE_ERROR_CAUTION,
281 "semaphore failed with %d", status);
286 /* Reset the CS4227. */
287 status = ixgbe_reset_cs4227(hw);
288 if (status != IXGBE_SUCCESS) {
289 ERROR_REPORT2(IXGBE_ERROR_INVALID_STATE,
290 "CS4227 reset failed: %d", status);
294 /* Reset takes so long, temporarily release semaphore in case the
295 * other driver instance is waiting for the reset indication.
297 ixgbe_write_cs4227(hw, IXGBE_CS4227_SCRATCH,
298 IXGBE_CS4227_RESET_PENDING);
299 hw->mac.ops.release_swfw_sync(hw, swfw_mask);
301 status = hw->mac.ops.acquire_swfw_sync(hw, swfw_mask);
302 if (status != IXGBE_SUCCESS) {
303 ERROR_REPORT2(IXGBE_ERROR_CAUTION,
304 "semaphore failed with %d", status);
308 /* Record completion for next time. */
309 status = ixgbe_write_cs4227(hw, IXGBE_CS4227_SCRATCH,
310 IXGBE_CS4227_RESET_COMPLETE);
313 hw->mac.ops.release_swfw_sync(hw, swfw_mask);
314 msec_delay(hw->eeprom.semaphore_delay);
318 * ixgbe_setup_mux_ctl - Setup ESDP register for I2C mux control
319 * @hw: pointer to hardware structure
321 STATIC void ixgbe_setup_mux_ctl(struct ixgbe_hw *hw)
323 u32 esdp = IXGBE_READ_REG(hw, IXGBE_ESDP);
325 if (hw->bus.lan_id) {
326 esdp &= ~(IXGBE_ESDP_SDP1_NATIVE | IXGBE_ESDP_SDP1);
327 esdp |= IXGBE_ESDP_SDP1_DIR;
329 esdp &= ~(IXGBE_ESDP_SDP0_NATIVE | IXGBE_ESDP_SDP0_DIR);
330 IXGBE_WRITE_REG(hw, IXGBE_ESDP, esdp);
331 IXGBE_WRITE_FLUSH(hw);
335 * ixgbe_read_phy_reg_mdi_22 - Read from a clause 22 PHY register without lock
336 * @hw: pointer to hardware structure
337 * @reg_addr: 32 bit address of PHY register to read
338 * @dev_type: always unused
339 * @phy_data: Pointer to read data from PHY register
341 STATIC s32 ixgbe_read_phy_reg_mdi_22(struct ixgbe_hw *hw, u32 reg_addr,
342 u32 dev_type, u16 *phy_data)
344 u32 i, data, command;
345 UNREFERENCED_1PARAMETER(dev_type);
347 /* Setup and write the read command */
348 command = (reg_addr << IXGBE_MSCA_DEV_TYPE_SHIFT) |
349 (hw->phy.addr << IXGBE_MSCA_PHY_ADDR_SHIFT) |
350 IXGBE_MSCA_OLD_PROTOCOL | IXGBE_MSCA_READ_AUTOINC |
351 IXGBE_MSCA_MDI_COMMAND;
353 IXGBE_WRITE_REG(hw, IXGBE_MSCA, command);
355 /* Check every 10 usec to see if the access completed.
356 * The MDI Command bit will clear when the operation is
359 for (i = 0; i < IXGBE_MDIO_COMMAND_TIMEOUT; i++) {
362 command = IXGBE_READ_REG(hw, IXGBE_MSCA);
363 if (!(command & IXGBE_MSCA_MDI_COMMAND))
367 if (command & IXGBE_MSCA_MDI_COMMAND) {
368 ERROR_REPORT1(IXGBE_ERROR_POLLING,
369 "PHY read command did not complete.\n");
370 return IXGBE_ERR_PHY;
373 /* Read operation is complete. Get the data from MSRWD */
374 data = IXGBE_READ_REG(hw, IXGBE_MSRWD);
375 data >>= IXGBE_MSRWD_READ_DATA_SHIFT;
376 *phy_data = (u16)data;
378 return IXGBE_SUCCESS;
382 * ixgbe_write_phy_reg_mdi_22 - Write to a clause 22 PHY register without lock
383 * @hw: pointer to hardware structure
384 * @reg_addr: 32 bit PHY register to write
385 * @dev_type: always unused
386 * @phy_data: Data to write to the PHY register
388 STATIC s32 ixgbe_write_phy_reg_mdi_22(struct ixgbe_hw *hw, u32 reg_addr,
389 u32 dev_type, u16 phy_data)
392 UNREFERENCED_1PARAMETER(dev_type);
394 /* Put the data in the MDI single read and write data register*/
395 IXGBE_WRITE_REG(hw, IXGBE_MSRWD, (u32)phy_data);
397 /* Setup and write the write command */
398 command = (reg_addr << IXGBE_MSCA_DEV_TYPE_SHIFT) |
399 (hw->phy.addr << IXGBE_MSCA_PHY_ADDR_SHIFT) |
400 IXGBE_MSCA_OLD_PROTOCOL | IXGBE_MSCA_WRITE |
401 IXGBE_MSCA_MDI_COMMAND;
403 IXGBE_WRITE_REG(hw, IXGBE_MSCA, command);
405 /* Check every 10 usec to see if the access completed.
406 * The MDI Command bit will clear when the operation is
409 for (i = 0; i < IXGBE_MDIO_COMMAND_TIMEOUT; i++) {
412 command = IXGBE_READ_REG(hw, IXGBE_MSCA);
413 if (!(command & IXGBE_MSCA_MDI_COMMAND))
417 if (command & IXGBE_MSCA_MDI_COMMAND) {
418 ERROR_REPORT1(IXGBE_ERROR_POLLING,
419 "PHY write cmd didn't complete\n");
420 return IXGBE_ERR_PHY;
423 return IXGBE_SUCCESS;
427 * ixgbe_identify_phy_x550em - Get PHY type based on device id
428 * @hw: pointer to hardware structure
432 STATIC s32 ixgbe_identify_phy_x550em(struct ixgbe_hw *hw)
434 hw->mac.ops.set_lan_id(hw);
436 ixgbe_read_mng_if_sel_x550em(hw);
438 switch (hw->device_id) {
439 case IXGBE_DEV_ID_X550EM_A_SFP:
440 return ixgbe_identify_module_generic(hw);
441 case IXGBE_DEV_ID_X550EM_X_SFP:
442 /* set up for CS4227 usage */
443 ixgbe_setup_mux_ctl(hw);
444 ixgbe_check_cs4227(hw);
447 case IXGBE_DEV_ID_X550EM_A_SFP_N:
448 return ixgbe_identify_module_generic(hw);
450 case IXGBE_DEV_ID_X550EM_X_KX4:
451 hw->phy.type = ixgbe_phy_x550em_kx4;
453 case IXGBE_DEV_ID_X550EM_X_XFI:
454 hw->phy.type = ixgbe_phy_x550em_xfi;
456 case IXGBE_DEV_ID_X550EM_X_KR:
457 case IXGBE_DEV_ID_X550EM_A_KR:
458 case IXGBE_DEV_ID_X550EM_A_KR_L:
459 hw->phy.type = ixgbe_phy_x550em_kr;
461 case IXGBE_DEV_ID_X550EM_A_10G_T:
462 case IXGBE_DEV_ID_X550EM_X_1G_T:
463 case IXGBE_DEV_ID_X550EM_X_10G_T:
464 return ixgbe_identify_phy_generic(hw);
465 case IXGBE_DEV_ID_X550EM_A_1G_T:
466 case IXGBE_DEV_ID_X550EM_A_1G_T_L:
467 hw->phy.type = ixgbe_phy_fw;
468 hw->phy.ops.read_reg = NULL;
469 hw->phy.ops.write_reg = NULL;
471 hw->phy.phy_semaphore_mask |= IXGBE_GSSR_PHY1_SM;
473 hw->phy.phy_semaphore_mask |= IXGBE_GSSR_PHY0_SM;
478 return IXGBE_SUCCESS;
482 * ixgbe_fw_phy_activity - Perform an activity on a PHY
483 * @hw: pointer to hardware structure
484 * @activity: activity to perform
485 * @data: Pointer to 4 32-bit words of data
487 s32 ixgbe_fw_phy_activity(struct ixgbe_hw *hw, u16 activity,
488 u32 (*data)[FW_PHY_ACT_DATA_COUNT])
491 struct ixgbe_hic_phy_activity_req cmd;
492 struct ixgbe_hic_phy_activity_resp rsp;
494 u16 retries = FW_PHY_ACT_RETRIES;
499 memset(&hic, 0, sizeof(hic));
500 hic.cmd.hdr.cmd = FW_PHY_ACT_REQ_CMD;
501 hic.cmd.hdr.buf_len = FW_PHY_ACT_REQ_LEN;
502 hic.cmd.hdr.checksum = FW_DEFAULT_CHECKSUM;
503 hic.cmd.port_number = hw->bus.lan_id;
504 hic.cmd.activity_id = IXGBE_CPU_TO_LE16(activity);
505 for (i = 0; i < FW_PHY_ACT_DATA_COUNT; ++i)
506 hic.cmd.data[i] = IXGBE_CPU_TO_BE32((*data)[i]);
508 rc = ixgbe_host_interface_command(hw, (u32 *)&hic.cmd,
510 IXGBE_HI_COMMAND_TIMEOUT,
512 if (rc != IXGBE_SUCCESS)
514 if (hic.rsp.hdr.cmd_or_resp.ret_status ==
515 FW_CEM_RESP_STATUS_SUCCESS) {
516 for (i = 0; i < FW_PHY_ACT_DATA_COUNT; ++i)
517 (*data)[i] = IXGBE_BE32_TO_CPU(hic.rsp.data[i]);
518 return IXGBE_SUCCESS;
522 } while (retries > 0);
524 return IXGBE_ERR_HOST_INTERFACE_COMMAND;
527 static const struct {
529 ixgbe_link_speed phy_speed;
531 { FW_PHY_ACT_LINK_SPEED_10, IXGBE_LINK_SPEED_10_FULL },
532 { FW_PHY_ACT_LINK_SPEED_100, IXGBE_LINK_SPEED_100_FULL },
533 { FW_PHY_ACT_LINK_SPEED_1G, IXGBE_LINK_SPEED_1GB_FULL },
534 { FW_PHY_ACT_LINK_SPEED_2_5G, IXGBE_LINK_SPEED_2_5GB_FULL },
535 { FW_PHY_ACT_LINK_SPEED_5G, IXGBE_LINK_SPEED_5GB_FULL },
536 { FW_PHY_ACT_LINK_SPEED_10G, IXGBE_LINK_SPEED_10GB_FULL },
540 * ixgbe_get_phy_id_fw - Get the phy ID via firmware command
541 * @hw: pointer to hardware structure
545 static s32 ixgbe_get_phy_id_fw(struct ixgbe_hw *hw)
547 u32 info[FW_PHY_ACT_DATA_COUNT] = { 0 };
553 rc = ixgbe_fw_phy_activity(hw, FW_PHY_ACT_GET_PHY_INFO, &info);
557 hw->phy.speeds_supported = 0;
558 phy_speeds = info[0] & FW_PHY_INFO_SPEED_MASK;
559 for (i = 0; i < sizeof(ixgbe_fw_map) / sizeof(ixgbe_fw_map[0]); ++i) {
560 if (phy_speeds & ixgbe_fw_map[i].fw_speed)
561 hw->phy.speeds_supported |= ixgbe_fw_map[i].phy_speed;
563 if (!hw->phy.autoneg_advertised)
564 hw->phy.autoneg_advertised = hw->phy.speeds_supported;
566 hw->phy.id = info[0] & FW_PHY_INFO_ID_HI_MASK;
567 phy_id_lo = info[1] & FW_PHY_INFO_ID_LO_MASK;
568 hw->phy.id |= phy_id_lo & IXGBE_PHY_REVISION_MASK;
569 hw->phy.revision = phy_id_lo & ~IXGBE_PHY_REVISION_MASK;
570 if (!hw->phy.id || hw->phy.id == IXGBE_PHY_REVISION_MASK)
571 return IXGBE_ERR_PHY_ADDR_INVALID;
572 return IXGBE_SUCCESS;
576 * ixgbe_identify_phy_fw - Get PHY type based on firmware command
577 * @hw: pointer to hardware structure
581 static s32 ixgbe_identify_phy_fw(struct ixgbe_hw *hw)
584 hw->phy.phy_semaphore_mask = IXGBE_GSSR_PHY1_SM;
586 hw->phy.phy_semaphore_mask = IXGBE_GSSR_PHY0_SM;
588 hw->phy.type = ixgbe_phy_fw;
589 hw->phy.ops.read_reg = NULL;
590 hw->phy.ops.write_reg = NULL;
591 return ixgbe_get_phy_id_fw(hw);
595 * ixgbe_shutdown_fw_phy - Shutdown a firmware-controlled PHY
596 * @hw: pointer to hardware structure
600 s32 ixgbe_shutdown_fw_phy(struct ixgbe_hw *hw)
602 u32 setup[FW_PHY_ACT_DATA_COUNT] = { 0 };
604 setup[0] = FW_PHY_ACT_FORCE_LINK_DOWN_OFF;
605 return ixgbe_fw_phy_activity(hw, FW_PHY_ACT_FORCE_LINK_DOWN, &setup);
608 STATIC s32 ixgbe_read_phy_reg_x550em(struct ixgbe_hw *hw, u32 reg_addr,
609 u32 device_type, u16 *phy_data)
611 UNREFERENCED_4PARAMETER(*hw, reg_addr, device_type, *phy_data);
612 return IXGBE_NOT_IMPLEMENTED;
615 STATIC s32 ixgbe_write_phy_reg_x550em(struct ixgbe_hw *hw, u32 reg_addr,
616 u32 device_type, u16 phy_data)
618 UNREFERENCED_4PARAMETER(*hw, reg_addr, device_type, phy_data);
619 return IXGBE_NOT_IMPLEMENTED;
623 * ixgbe_read_i2c_combined_generic - Perform I2C read combined operation
624 * @hw: pointer to the hardware structure
625 * @addr: I2C bus address to read from
626 * @reg: I2C device register to read from
627 * @val: pointer to location to receive read value
629 * Returns an error code on error.
631 STATIC s32 ixgbe_read_i2c_combined_generic(struct ixgbe_hw *hw, u8 addr,
634 return ixgbe_read_i2c_combined_generic_int(hw, addr, reg, val, true);
638 * ixgbe_read_i2c_combined_generic_unlocked - Do I2C read combined operation
639 * @hw: pointer to the hardware structure
640 * @addr: I2C bus address to read from
641 * @reg: I2C device register to read from
642 * @val: pointer to location to receive read value
644 * Returns an error code on error.
647 ixgbe_read_i2c_combined_generic_unlocked(struct ixgbe_hw *hw, u8 addr,
650 return ixgbe_read_i2c_combined_generic_int(hw, addr, reg, val, false);
654 * ixgbe_write_i2c_combined_generic - Perform I2C write combined operation
655 * @hw: pointer to the hardware structure
656 * @addr: I2C bus address to write to
657 * @reg: I2C device register to write to
658 * @val: value to write
660 * Returns an error code on error.
662 STATIC s32 ixgbe_write_i2c_combined_generic(struct ixgbe_hw *hw,
663 u8 addr, u16 reg, u16 val)
665 return ixgbe_write_i2c_combined_generic_int(hw, addr, reg, val, true);
669 * ixgbe_write_i2c_combined_generic_unlocked - Do I2C write combined operation
670 * @hw: pointer to the hardware structure
671 * @addr: I2C bus address to write to
672 * @reg: I2C device register to write to
673 * @val: value to write
675 * Returns an error code on error.
678 ixgbe_write_i2c_combined_generic_unlocked(struct ixgbe_hw *hw,
679 u8 addr, u16 reg, u16 val)
681 return ixgbe_write_i2c_combined_generic_int(hw, addr, reg, val, false);
685 * ixgbe_init_ops_X550EM - Inits func ptrs and MAC type
686 * @hw: pointer to hardware structure
688 * Initialize the function pointers and for MAC type X550EM.
689 * Does not touch the hardware.
691 s32 ixgbe_init_ops_X550EM(struct ixgbe_hw *hw)
693 struct ixgbe_mac_info *mac = &hw->mac;
694 struct ixgbe_eeprom_info *eeprom = &hw->eeprom;
695 struct ixgbe_phy_info *phy = &hw->phy;
698 DEBUGFUNC("ixgbe_init_ops_X550EM");
700 /* Similar to X550 so start there. */
701 ret_val = ixgbe_init_ops_X550(hw);
703 /* Since this function eventually calls
704 * ixgbe_init_ops_540 by design, we are setting
705 * the pointers to NULL explicitly here to overwrite
706 * the values being set in the x540 function.
708 /* Thermal sensor not supported in x550EM */
709 mac->ops.get_thermal_sensor_data = NULL;
710 mac->ops.init_thermal_sensor_thresh = NULL;
711 mac->thermal_sensor_enabled = false;
713 /* FCOE not supported in x550EM */
714 mac->ops.get_san_mac_addr = NULL;
715 mac->ops.set_san_mac_addr = NULL;
716 mac->ops.get_wwn_prefix = NULL;
717 mac->ops.get_fcoe_boot_status = NULL;
719 /* IPsec not supported in x550EM */
720 mac->ops.disable_sec_rx_path = NULL;
721 mac->ops.enable_sec_rx_path = NULL;
723 /* AUTOC register is not present in x550EM. */
724 mac->ops.prot_autoc_read = NULL;
725 mac->ops.prot_autoc_write = NULL;
727 /* X550EM bus type is internal*/
728 hw->bus.type = ixgbe_bus_type_internal;
729 mac->ops.get_bus_info = ixgbe_get_bus_info_X550em;
732 mac->ops.get_media_type = ixgbe_get_media_type_X550em;
733 mac->ops.setup_sfp = ixgbe_setup_sfp_modules_X550em;
734 mac->ops.get_link_capabilities = ixgbe_get_link_capabilities_X550em;
735 mac->ops.reset_hw = ixgbe_reset_hw_X550em;
736 mac->ops.get_supported_physical_layer =
737 ixgbe_get_supported_physical_layer_X550em;
739 if (mac->ops.get_media_type(hw) == ixgbe_media_type_copper)
740 mac->ops.setup_fc = ixgbe_setup_fc_generic;
742 mac->ops.setup_fc = ixgbe_setup_fc_X550em;
745 phy->ops.init = ixgbe_init_phy_ops_X550em;
746 switch (hw->device_id) {
747 case IXGBE_DEV_ID_X550EM_A_1G_T:
748 case IXGBE_DEV_ID_X550EM_A_1G_T_L:
749 mac->ops.setup_fc = NULL;
750 phy->ops.identify = ixgbe_identify_phy_fw;
751 phy->ops.set_phy_power = NULL;
752 phy->ops.get_firmware_version = NULL;
755 phy->ops.identify = ixgbe_identify_phy_x550em;
758 if (mac->ops.get_media_type(hw) != ixgbe_media_type_copper)
759 phy->ops.set_phy_power = NULL;
763 eeprom->ops.init_params = ixgbe_init_eeprom_params_X540;
764 eeprom->ops.read = ixgbe_read_ee_hostif_X550;
765 eeprom->ops.read_buffer = ixgbe_read_ee_hostif_buffer_X550;
766 eeprom->ops.write = ixgbe_write_ee_hostif_X550;
767 eeprom->ops.write_buffer = ixgbe_write_ee_hostif_buffer_X550;
768 eeprom->ops.update_checksum = ixgbe_update_eeprom_checksum_X550;
769 eeprom->ops.validate_checksum = ixgbe_validate_eeprom_checksum_X550;
770 eeprom->ops.calc_checksum = ixgbe_calc_eeprom_checksum_X550;
776 * ixgbe_setup_fw_link - Setup firmware-controlled PHYs
777 * @hw: pointer to hardware structure
779 static s32 ixgbe_setup_fw_link(struct ixgbe_hw *hw)
781 u32 setup[FW_PHY_ACT_DATA_COUNT] = { 0 };
785 if (hw->phy.reset_disable || ixgbe_check_reset_blocked(hw))
788 if (hw->fc.strict_ieee && hw->fc.requested_mode == ixgbe_fc_rx_pause) {
789 ERROR_REPORT1(IXGBE_ERROR_UNSUPPORTED,
790 "ixgbe_fc_rx_pause not valid in strict IEEE mode\n");
791 return IXGBE_ERR_INVALID_LINK_SETTINGS;
794 switch (hw->fc.requested_mode) {
796 setup[0] |= FW_PHY_ACT_SETUP_LINK_PAUSE_RXTX <<
797 FW_PHY_ACT_SETUP_LINK_PAUSE_SHIFT;
799 case ixgbe_fc_rx_pause:
800 setup[0] |= FW_PHY_ACT_SETUP_LINK_PAUSE_RX <<
801 FW_PHY_ACT_SETUP_LINK_PAUSE_SHIFT;
803 case ixgbe_fc_tx_pause:
804 setup[0] |= FW_PHY_ACT_SETUP_LINK_PAUSE_TX <<
805 FW_PHY_ACT_SETUP_LINK_PAUSE_SHIFT;
811 for (i = 0; i < sizeof(ixgbe_fw_map) / sizeof(ixgbe_fw_map[0]); ++i) {
812 if (hw->phy.autoneg_advertised & ixgbe_fw_map[i].phy_speed)
813 setup[0] |= ixgbe_fw_map[i].fw_speed;
815 setup[0] |= FW_PHY_ACT_SETUP_LINK_HP | FW_PHY_ACT_SETUP_LINK_AN;
817 if (hw->phy.eee_speeds_advertised)
818 setup[0] |= FW_PHY_ACT_SETUP_LINK_EEE;
820 rc = ixgbe_fw_phy_activity(hw, FW_PHY_ACT_SETUP_LINK, &setup);
823 if (setup[0] == FW_PHY_ACT_SETUP_LINK_RSP_DOWN)
824 return IXGBE_ERR_OVERTEMP;
825 return IXGBE_SUCCESS;
829 * ixgbe_fc_autoneg_fw _ Set up flow control for FW-controlled PHYs
830 * @hw: pointer to hardware structure
832 * Called at init time to set up flow control.
834 static s32 ixgbe_fc_autoneg_fw(struct ixgbe_hw *hw)
836 if (hw->fc.requested_mode == ixgbe_fc_default)
837 hw->fc.requested_mode = ixgbe_fc_full;
839 return ixgbe_setup_fw_link(hw);
843 * ixgbe_setup_eee_fw - Enable/disable EEE support
844 * @hw: pointer to the HW structure
845 * @enable_eee: boolean flag to enable EEE
847 * Enable/disable EEE based on enable_eee flag.
848 * This function controls EEE for firmware-based PHY implementations.
850 static s32 ixgbe_setup_eee_fw(struct ixgbe_hw *hw, bool enable_eee)
852 if (!!hw->phy.eee_speeds_advertised == enable_eee)
853 return IXGBE_SUCCESS;
855 hw->phy.eee_speeds_advertised = hw->phy.eee_speeds_supported;
857 hw->phy.eee_speeds_advertised = 0;
858 return hw->phy.ops.setup_link(hw);
862 * ixgbe_init_ops_X550EM_a - Inits func ptrs and MAC type
863 * @hw: pointer to hardware structure
865 * Initialize the function pointers and for MAC type X550EM_a.
866 * Does not touch the hardware.
868 s32 ixgbe_init_ops_X550EM_a(struct ixgbe_hw *hw)
870 struct ixgbe_mac_info *mac = &hw->mac;
873 DEBUGFUNC("ixgbe_init_ops_X550EM_a");
875 /* Start with generic X550EM init */
876 ret_val = ixgbe_init_ops_X550EM(hw);
878 if (hw->device_id == IXGBE_DEV_ID_X550EM_A_SGMII ||
879 hw->device_id == IXGBE_DEV_ID_X550EM_A_SGMII_L) {
880 mac->ops.read_iosf_sb_reg = ixgbe_read_iosf_sb_reg_x550;
881 mac->ops.write_iosf_sb_reg = ixgbe_write_iosf_sb_reg_x550;
883 mac->ops.read_iosf_sb_reg = ixgbe_read_iosf_sb_reg_x550a;
884 mac->ops.write_iosf_sb_reg = ixgbe_write_iosf_sb_reg_x550a;
886 mac->ops.acquire_swfw_sync = ixgbe_acquire_swfw_sync_X550a;
887 mac->ops.release_swfw_sync = ixgbe_release_swfw_sync_X550a;
889 switch (mac->ops.get_media_type(hw)) {
890 case ixgbe_media_type_fiber:
891 mac->ops.setup_fc = NULL;
892 mac->ops.fc_autoneg = ixgbe_fc_autoneg_fiber_x550em_a;
894 case ixgbe_media_type_backplane:
895 mac->ops.fc_autoneg = ixgbe_fc_autoneg_backplane_x550em_a;
896 mac->ops.setup_fc = ixgbe_setup_fc_backplane_x550em_a;
902 switch (hw->device_id) {
903 case IXGBE_DEV_ID_X550EM_A_1G_T:
904 case IXGBE_DEV_ID_X550EM_A_1G_T_L:
905 mac->ops.fc_autoneg = ixgbe_fc_autoneg_sgmii_x550em_a;
906 mac->ops.setup_fc = ixgbe_fc_autoneg_fw;
907 mac->ops.setup_eee = ixgbe_setup_eee_fw;
908 hw->phy.eee_speeds_supported = IXGBE_LINK_SPEED_100_FULL |
909 IXGBE_LINK_SPEED_1GB_FULL;
910 hw->phy.eee_speeds_advertised = hw->phy.eee_speeds_supported;
920 * ixgbe_init_ops_X550EM_x - Inits func ptrs and MAC type
921 * @hw: pointer to hardware structure
923 * Initialize the function pointers and for MAC type X550EM_x.
924 * Does not touch the hardware.
926 s32 ixgbe_init_ops_X550EM_x(struct ixgbe_hw *hw)
928 struct ixgbe_mac_info *mac = &hw->mac;
929 struct ixgbe_link_info *link = &hw->link;
932 DEBUGFUNC("ixgbe_init_ops_X550EM_x");
934 /* Start with generic X550EM init */
935 ret_val = ixgbe_init_ops_X550EM(hw);
937 mac->ops.read_iosf_sb_reg = ixgbe_read_iosf_sb_reg_x550;
938 mac->ops.write_iosf_sb_reg = ixgbe_write_iosf_sb_reg_x550;
939 mac->ops.acquire_swfw_sync = ixgbe_acquire_swfw_sync_X550em;
940 mac->ops.release_swfw_sync = ixgbe_release_swfw_sync_X550em;
941 link->ops.read_link = ixgbe_read_i2c_combined_generic;
942 link->ops.read_link_unlocked = ixgbe_read_i2c_combined_generic_unlocked;
943 link->ops.write_link = ixgbe_write_i2c_combined_generic;
944 link->ops.write_link_unlocked =
945 ixgbe_write_i2c_combined_generic_unlocked;
946 link->addr = IXGBE_CS4227;
953 * ixgbe_dmac_config_X550
954 * @hw: pointer to hardware structure
956 * Configure DMA coalescing. If enabling dmac, dmac is activated.
957 * When disabling dmac, dmac enable dmac bit is cleared.
959 s32 ixgbe_dmac_config_X550(struct ixgbe_hw *hw)
961 u32 reg, high_pri_tc;
963 DEBUGFUNC("ixgbe_dmac_config_X550");
965 /* Disable DMA coalescing before configuring */
966 reg = IXGBE_READ_REG(hw, IXGBE_DMACR);
967 reg &= ~IXGBE_DMACR_DMAC_EN;
968 IXGBE_WRITE_REG(hw, IXGBE_DMACR, reg);
970 /* Disable DMA Coalescing if the watchdog timer is 0 */
971 if (!hw->mac.dmac_config.watchdog_timer)
974 ixgbe_dmac_config_tcs_X550(hw);
976 /* Configure DMA Coalescing Control Register */
977 reg = IXGBE_READ_REG(hw, IXGBE_DMACR);
979 /* Set the watchdog timer in units of 40.96 usec */
980 reg &= ~IXGBE_DMACR_DMACWT_MASK;
981 reg |= (hw->mac.dmac_config.watchdog_timer * 100) / 4096;
983 reg &= ~IXGBE_DMACR_HIGH_PRI_TC_MASK;
984 /* If fcoe is enabled, set high priority traffic class */
985 if (hw->mac.dmac_config.fcoe_en) {
986 high_pri_tc = 1 << hw->mac.dmac_config.fcoe_tc;
987 reg |= ((high_pri_tc << IXGBE_DMACR_HIGH_PRI_TC_SHIFT) &
988 IXGBE_DMACR_HIGH_PRI_TC_MASK);
990 reg |= IXGBE_DMACR_EN_MNG_IND;
992 /* Enable DMA coalescing after configuration */
993 reg |= IXGBE_DMACR_DMAC_EN;
994 IXGBE_WRITE_REG(hw, IXGBE_DMACR, reg);
997 return IXGBE_SUCCESS;
1001 * ixgbe_dmac_config_tcs_X550
1002 * @hw: pointer to hardware structure
1004 * Configure DMA coalescing threshold per TC. The dmac enable bit must
1005 * be cleared before configuring.
1007 s32 ixgbe_dmac_config_tcs_X550(struct ixgbe_hw *hw)
1009 u32 tc, reg, pb_headroom, rx_pb_size, maxframe_size_kb;
1011 DEBUGFUNC("ixgbe_dmac_config_tcs_X550");
1013 /* Configure DMA coalescing enabled */
1014 switch (hw->mac.dmac_config.link_speed) {
1015 case IXGBE_LINK_SPEED_10_FULL:
1016 case IXGBE_LINK_SPEED_100_FULL:
1017 pb_headroom = IXGBE_DMACRXT_100M;
1019 case IXGBE_LINK_SPEED_1GB_FULL:
1020 pb_headroom = IXGBE_DMACRXT_1G;
1023 pb_headroom = IXGBE_DMACRXT_10G;
1027 maxframe_size_kb = ((IXGBE_READ_REG(hw, IXGBE_MAXFRS) >>
1028 IXGBE_MHADD_MFS_SHIFT) / 1024);
1030 /* Set the per Rx packet buffer receive threshold */
1031 for (tc = 0; tc < IXGBE_DCB_MAX_TRAFFIC_CLASS; tc++) {
1032 reg = IXGBE_READ_REG(hw, IXGBE_DMCTH(tc));
1033 reg &= ~IXGBE_DMCTH_DMACRXT_MASK;
1035 if (tc < hw->mac.dmac_config.num_tcs) {
1036 /* Get Rx PB size */
1037 rx_pb_size = IXGBE_READ_REG(hw, IXGBE_RXPBSIZE(tc));
1038 rx_pb_size = (rx_pb_size & IXGBE_RXPBSIZE_MASK) >>
1039 IXGBE_RXPBSIZE_SHIFT;
1041 /* Calculate receive buffer threshold in kilobytes */
1042 if (rx_pb_size > pb_headroom)
1043 rx_pb_size = rx_pb_size - pb_headroom;
1047 /* Minimum of MFS shall be set for DMCTH */
1048 reg |= (rx_pb_size > maxframe_size_kb) ?
1049 rx_pb_size : maxframe_size_kb;
1051 IXGBE_WRITE_REG(hw, IXGBE_DMCTH(tc), reg);
1053 return IXGBE_SUCCESS;
1057 * ixgbe_dmac_update_tcs_X550
1058 * @hw: pointer to hardware structure
1060 * Disables dmac, updates per TC settings, and then enables dmac.
1062 s32 ixgbe_dmac_update_tcs_X550(struct ixgbe_hw *hw)
1066 DEBUGFUNC("ixgbe_dmac_update_tcs_X550");
1068 /* Disable DMA coalescing before configuring */
1069 reg = IXGBE_READ_REG(hw, IXGBE_DMACR);
1070 reg &= ~IXGBE_DMACR_DMAC_EN;
1071 IXGBE_WRITE_REG(hw, IXGBE_DMACR, reg);
1073 ixgbe_dmac_config_tcs_X550(hw);
1075 /* Enable DMA coalescing after configuration */
1076 reg = IXGBE_READ_REG(hw, IXGBE_DMACR);
1077 reg |= IXGBE_DMACR_DMAC_EN;
1078 IXGBE_WRITE_REG(hw, IXGBE_DMACR, reg);
1080 return IXGBE_SUCCESS;
1084 * ixgbe_init_eeprom_params_X550 - Initialize EEPROM params
1085 * @hw: pointer to hardware structure
1087 * Initializes the EEPROM parameters ixgbe_eeprom_info within the
1088 * ixgbe_hw struct in order to set up EEPROM access.
1090 s32 ixgbe_init_eeprom_params_X550(struct ixgbe_hw *hw)
1092 struct ixgbe_eeprom_info *eeprom = &hw->eeprom;
1096 DEBUGFUNC("ixgbe_init_eeprom_params_X550");
1098 if (eeprom->type == ixgbe_eeprom_uninitialized) {
1099 eeprom->semaphore_delay = 10;
1100 eeprom->type = ixgbe_flash;
1102 eec = IXGBE_READ_REG(hw, IXGBE_EEC);
1103 eeprom_size = (u16)((eec & IXGBE_EEC_SIZE) >>
1104 IXGBE_EEC_SIZE_SHIFT);
1105 eeprom->word_size = 1 << (eeprom_size +
1106 IXGBE_EEPROM_WORD_SIZE_SHIFT);
1108 DEBUGOUT2("Eeprom params: type = %d, size = %d\n",
1109 eeprom->type, eeprom->word_size);
1112 return IXGBE_SUCCESS;
1116 * ixgbe_set_source_address_pruning_X550 - Enable/Disbale source address pruning
1117 * @hw: pointer to hardware structure
1118 * @enable: enable or disable source address pruning
1119 * @pool: Rx pool to set source address pruning for
1121 void ixgbe_set_source_address_pruning_X550(struct ixgbe_hw *hw, bool enable,
1126 /* max rx pool is 63 */
1130 pfflp = (u64)IXGBE_READ_REG(hw, IXGBE_PFFLPL);
1131 pfflp |= (u64)IXGBE_READ_REG(hw, IXGBE_PFFLPH) << 32;
1134 pfflp |= (1ULL << pool);
1136 pfflp &= ~(1ULL << pool);
1138 IXGBE_WRITE_REG(hw, IXGBE_PFFLPL, (u32)pfflp);
1139 IXGBE_WRITE_REG(hw, IXGBE_PFFLPH, (u32)(pfflp >> 32));
1143 * ixgbe_set_ethertype_anti_spoofing_X550 - Enable/Disable Ethertype anti-spoofing
1144 * @hw: pointer to hardware structure
1145 * @enable: enable or disable switch for Ethertype anti-spoofing
1146 * @vf: Virtual Function pool - VF Pool to set for Ethertype anti-spoofing
1149 void ixgbe_set_ethertype_anti_spoofing_X550(struct ixgbe_hw *hw,
1150 bool enable, int vf)
1152 int vf_target_reg = vf >> 3;
1153 int vf_target_shift = vf % 8 + IXGBE_SPOOF_ETHERTYPEAS_SHIFT;
1156 DEBUGFUNC("ixgbe_set_ethertype_anti_spoofing_X550");
1158 pfvfspoof = IXGBE_READ_REG(hw, IXGBE_PFVFSPOOF(vf_target_reg));
1160 pfvfspoof |= (1 << vf_target_shift);
1162 pfvfspoof &= ~(1 << vf_target_shift);
1164 IXGBE_WRITE_REG(hw, IXGBE_PFVFSPOOF(vf_target_reg), pfvfspoof);
1168 * ixgbe_iosf_wait - Wait for IOSF command completion
1169 * @hw: pointer to hardware structure
1170 * @ctrl: pointer to location to receive final IOSF control value
1172 * Returns failing status on timeout
1174 * Note: ctrl can be NULL if the IOSF control register value is not needed
1176 STATIC s32 ixgbe_iosf_wait(struct ixgbe_hw *hw, u32 *ctrl)
1180 /* Check every 10 usec to see if the address cycle completed.
1181 * The SB IOSF BUSY bit will clear when the operation is
1184 for (i = 0; i < IXGBE_MDIO_COMMAND_TIMEOUT; i++) {
1185 command = IXGBE_READ_REG(hw, IXGBE_SB_IOSF_INDIRECT_CTRL);
1186 if ((command & IXGBE_SB_IOSF_CTRL_BUSY) == 0)
1192 if (i == IXGBE_MDIO_COMMAND_TIMEOUT) {
1193 ERROR_REPORT1(IXGBE_ERROR_POLLING, "Wait timed out\n");
1194 return IXGBE_ERR_PHY;
1197 return IXGBE_SUCCESS;
1201 * ixgbe_write_iosf_sb_reg_x550 - Writes a value to specified register
1202 * of the IOSF device
1203 * @hw: pointer to hardware structure
1204 * @reg_addr: 32 bit PHY register to write
1205 * @device_type: 3 bit device type
1206 * @data: Data to write to the register
1208 s32 ixgbe_write_iosf_sb_reg_x550(struct ixgbe_hw *hw, u32 reg_addr,
1209 u32 device_type, u32 data)
1211 u32 gssr = IXGBE_GSSR_PHY1_SM | IXGBE_GSSR_PHY0_SM;
1215 ret = ixgbe_acquire_swfw_semaphore(hw, gssr);
1216 if (ret != IXGBE_SUCCESS)
1219 ret = ixgbe_iosf_wait(hw, NULL);
1220 if (ret != IXGBE_SUCCESS)
1223 command = ((reg_addr << IXGBE_SB_IOSF_CTRL_ADDR_SHIFT) |
1224 (device_type << IXGBE_SB_IOSF_CTRL_TARGET_SELECT_SHIFT));
1226 /* Write IOSF control register */
1227 IXGBE_WRITE_REG(hw, IXGBE_SB_IOSF_INDIRECT_CTRL, command);
1229 /* Write IOSF data register */
1230 IXGBE_WRITE_REG(hw, IXGBE_SB_IOSF_INDIRECT_DATA, data);
1232 ret = ixgbe_iosf_wait(hw, &command);
1234 if ((command & IXGBE_SB_IOSF_CTRL_RESP_STAT_MASK) != 0) {
1235 error = (command & IXGBE_SB_IOSF_CTRL_CMPL_ERR_MASK) >>
1236 IXGBE_SB_IOSF_CTRL_CMPL_ERR_SHIFT;
1237 ERROR_REPORT2(IXGBE_ERROR_POLLING,
1238 "Failed to write, error %x\n", error);
1239 ret = IXGBE_ERR_PHY;
1243 ixgbe_release_swfw_semaphore(hw, gssr);
1248 * ixgbe_read_iosf_sb_reg_x550 - Reads specified register of the IOSF device
1249 * @hw: pointer to hardware structure
1250 * @reg_addr: 32 bit PHY register to write
1251 * @device_type: 3 bit device type
1252 * @data: Pointer to read data from the register
1254 s32 ixgbe_read_iosf_sb_reg_x550(struct ixgbe_hw *hw, u32 reg_addr,
1255 u32 device_type, u32 *data)
1257 u32 gssr = IXGBE_GSSR_PHY1_SM | IXGBE_GSSR_PHY0_SM;
1261 ret = ixgbe_acquire_swfw_semaphore(hw, gssr);
1262 if (ret != IXGBE_SUCCESS)
1265 ret = ixgbe_iosf_wait(hw, NULL);
1266 if (ret != IXGBE_SUCCESS)
1269 command = ((reg_addr << IXGBE_SB_IOSF_CTRL_ADDR_SHIFT) |
1270 (device_type << IXGBE_SB_IOSF_CTRL_TARGET_SELECT_SHIFT));
1272 /* Write IOSF control register */
1273 IXGBE_WRITE_REG(hw, IXGBE_SB_IOSF_INDIRECT_CTRL, command);
1275 ret = ixgbe_iosf_wait(hw, &command);
1277 if ((command & IXGBE_SB_IOSF_CTRL_RESP_STAT_MASK) != 0) {
1278 error = (command & IXGBE_SB_IOSF_CTRL_CMPL_ERR_MASK) >>
1279 IXGBE_SB_IOSF_CTRL_CMPL_ERR_SHIFT;
1280 ERROR_REPORT2(IXGBE_ERROR_POLLING,
1281 "Failed to read, error %x\n", error);
1282 ret = IXGBE_ERR_PHY;
1285 if (ret == IXGBE_SUCCESS)
1286 *data = IXGBE_READ_REG(hw, IXGBE_SB_IOSF_INDIRECT_DATA);
1289 ixgbe_release_swfw_semaphore(hw, gssr);
1294 * ixgbe_get_phy_token - Get the token for shared phy access
1295 * @hw: Pointer to hardware structure
1298 s32 ixgbe_get_phy_token(struct ixgbe_hw *hw)
1300 struct ixgbe_hic_phy_token_req token_cmd;
1303 token_cmd.hdr.cmd = FW_PHY_TOKEN_REQ_CMD;
1304 token_cmd.hdr.buf_len = FW_PHY_TOKEN_REQ_LEN;
1305 token_cmd.hdr.cmd_or_resp.cmd_resv = 0;
1306 token_cmd.hdr.checksum = FW_DEFAULT_CHECKSUM;
1307 token_cmd.port_number = hw->bus.lan_id;
1308 token_cmd.command_type = FW_PHY_TOKEN_REQ;
1310 status = ixgbe_host_interface_command(hw, (u32 *)&token_cmd,
1312 IXGBE_HI_COMMAND_TIMEOUT,
1316 if (token_cmd.hdr.cmd_or_resp.ret_status == FW_PHY_TOKEN_OK)
1317 return IXGBE_SUCCESS;
1318 if (token_cmd.hdr.cmd_or_resp.ret_status != FW_PHY_TOKEN_RETRY)
1319 return IXGBE_ERR_FW_RESP_INVALID;
1321 return IXGBE_ERR_TOKEN_RETRY;
1325 * ixgbe_put_phy_token - Put the token for shared phy access
1326 * @hw: Pointer to hardware structure
1329 s32 ixgbe_put_phy_token(struct ixgbe_hw *hw)
1331 struct ixgbe_hic_phy_token_req token_cmd;
1334 token_cmd.hdr.cmd = FW_PHY_TOKEN_REQ_CMD;
1335 token_cmd.hdr.buf_len = FW_PHY_TOKEN_REQ_LEN;
1336 token_cmd.hdr.cmd_or_resp.cmd_resv = 0;
1337 token_cmd.hdr.checksum = FW_DEFAULT_CHECKSUM;
1338 token_cmd.port_number = hw->bus.lan_id;
1339 token_cmd.command_type = FW_PHY_TOKEN_REL;
1341 status = ixgbe_host_interface_command(hw, (u32 *)&token_cmd,
1343 IXGBE_HI_COMMAND_TIMEOUT,
1347 if (token_cmd.hdr.cmd_or_resp.ret_status == FW_PHY_TOKEN_OK)
1348 return IXGBE_SUCCESS;
1350 DEBUGOUT("Put PHY Token host interface command failed");
1351 return IXGBE_ERR_FW_RESP_INVALID;
1355 * ixgbe_write_iosf_sb_reg_x550a - Writes a value to specified register
1356 * of the IOSF device
1357 * @hw: pointer to hardware structure
1358 * @reg_addr: 32 bit PHY register to write
1359 * @device_type: 3 bit device type
1360 * @data: Data to write to the register
1362 s32 ixgbe_write_iosf_sb_reg_x550a(struct ixgbe_hw *hw, u32 reg_addr,
1363 u32 device_type, u32 data)
1365 struct ixgbe_hic_internal_phy_req write_cmd;
1367 UNREFERENCED_1PARAMETER(device_type);
1369 memset(&write_cmd, 0, sizeof(write_cmd));
1370 write_cmd.hdr.cmd = FW_INT_PHY_REQ_CMD;
1371 write_cmd.hdr.buf_len = FW_INT_PHY_REQ_LEN;
1372 write_cmd.hdr.checksum = FW_DEFAULT_CHECKSUM;
1373 write_cmd.port_number = hw->bus.lan_id;
1374 write_cmd.command_type = FW_INT_PHY_REQ_WRITE;
1375 write_cmd.address = IXGBE_CPU_TO_BE16(reg_addr);
1376 write_cmd.write_data = IXGBE_CPU_TO_BE32(data);
1378 status = ixgbe_host_interface_command(hw, (u32 *)&write_cmd,
1380 IXGBE_HI_COMMAND_TIMEOUT, false);
1386 * ixgbe_read_iosf_sb_reg_x550a - Reads specified register of the IOSF device
1387 * @hw: pointer to hardware structure
1388 * @reg_addr: 32 bit PHY register to write
1389 * @device_type: 3 bit device type
1390 * @data: Pointer to read data from the register
1392 s32 ixgbe_read_iosf_sb_reg_x550a(struct ixgbe_hw *hw, u32 reg_addr,
1393 u32 device_type, u32 *data)
1396 struct ixgbe_hic_internal_phy_req cmd;
1397 struct ixgbe_hic_internal_phy_resp rsp;
1400 UNREFERENCED_1PARAMETER(device_type);
1402 memset(&hic, 0, sizeof(hic));
1403 hic.cmd.hdr.cmd = FW_INT_PHY_REQ_CMD;
1404 hic.cmd.hdr.buf_len = FW_INT_PHY_REQ_LEN;
1405 hic.cmd.hdr.checksum = FW_DEFAULT_CHECKSUM;
1406 hic.cmd.port_number = hw->bus.lan_id;
1407 hic.cmd.command_type = FW_INT_PHY_REQ_READ;
1408 hic.cmd.address = IXGBE_CPU_TO_BE16(reg_addr);
1410 status = ixgbe_host_interface_command(hw, (u32 *)&hic.cmd,
1412 IXGBE_HI_COMMAND_TIMEOUT, true);
1414 /* Extract the register value from the response. */
1415 *data = IXGBE_BE32_TO_CPU(hic.rsp.read_data);
1421 * ixgbe_disable_mdd_X550
1422 * @hw: pointer to hardware structure
1424 * Disable malicious driver detection
1426 void ixgbe_disable_mdd_X550(struct ixgbe_hw *hw)
1430 DEBUGFUNC("ixgbe_disable_mdd_X550");
1432 /* Disable MDD for TX DMA and interrupt */
1433 reg = IXGBE_READ_REG(hw, IXGBE_DMATXCTL);
1434 reg &= ~(IXGBE_DMATXCTL_MDP_EN | IXGBE_DMATXCTL_MBINTEN);
1435 IXGBE_WRITE_REG(hw, IXGBE_DMATXCTL, reg);
1437 /* Disable MDD for RX and interrupt */
1438 reg = IXGBE_READ_REG(hw, IXGBE_RDRXCTL);
1439 reg &= ~(IXGBE_RDRXCTL_MDP_EN | IXGBE_RDRXCTL_MBINTEN);
1440 IXGBE_WRITE_REG(hw, IXGBE_RDRXCTL, reg);
1444 * ixgbe_enable_mdd_X550
1445 * @hw: pointer to hardware structure
1447 * Enable malicious driver detection
1449 void ixgbe_enable_mdd_X550(struct ixgbe_hw *hw)
1453 DEBUGFUNC("ixgbe_enable_mdd_X550");
1455 /* Enable MDD for TX DMA and interrupt */
1456 reg = IXGBE_READ_REG(hw, IXGBE_DMATXCTL);
1457 reg |= (IXGBE_DMATXCTL_MDP_EN | IXGBE_DMATXCTL_MBINTEN);
1458 IXGBE_WRITE_REG(hw, IXGBE_DMATXCTL, reg);
1460 /* Enable MDD for RX and interrupt */
1461 reg = IXGBE_READ_REG(hw, IXGBE_RDRXCTL);
1462 reg |= (IXGBE_RDRXCTL_MDP_EN | IXGBE_RDRXCTL_MBINTEN);
1463 IXGBE_WRITE_REG(hw, IXGBE_RDRXCTL, reg);
1467 * ixgbe_restore_mdd_vf_X550
1468 * @hw: pointer to hardware structure
1471 * Restore VF that was disabled during malicious driver detection event
1473 void ixgbe_restore_mdd_vf_X550(struct ixgbe_hw *hw, u32 vf)
1475 u32 idx, reg, num_qs, start_q, bitmask;
1477 DEBUGFUNC("ixgbe_restore_mdd_vf_X550");
1479 /* Map VF to queues */
1480 reg = IXGBE_READ_REG(hw, IXGBE_MRQC);
1481 switch (reg & IXGBE_MRQC_MRQE_MASK) {
1482 case IXGBE_MRQC_VMDQRT8TCEN:
1483 num_qs = 8; /* 16 VFs / pools */
1484 bitmask = 0x000000FF;
1486 case IXGBE_MRQC_VMDQRSS32EN:
1487 case IXGBE_MRQC_VMDQRT4TCEN:
1488 num_qs = 4; /* 32 VFs / pools */
1489 bitmask = 0x0000000F;
1491 default: /* 64 VFs / pools */
1493 bitmask = 0x00000003;
1496 start_q = vf * num_qs;
1498 /* Release vf's queues by clearing WQBR_TX and WQBR_RX (RW1C) */
1501 reg |= (bitmask << (start_q % 32));
1502 IXGBE_WRITE_REG(hw, IXGBE_WQBR_TX(idx), reg);
1503 IXGBE_WRITE_REG(hw, IXGBE_WQBR_RX(idx), reg);
1507 * ixgbe_mdd_event_X550
1508 * @hw: pointer to hardware structure
1509 * @vf_bitmap: vf bitmap of malicious vfs
1511 * Handle malicious driver detection event.
1513 void ixgbe_mdd_event_X550(struct ixgbe_hw *hw, u32 *vf_bitmap)
1516 u32 i, j, reg, q, shift, vf, idx;
1518 DEBUGFUNC("ixgbe_mdd_event_X550");
1520 /* figure out pool size for mapping to vf's */
1521 reg = IXGBE_READ_REG(hw, IXGBE_MRQC);
1522 switch (reg & IXGBE_MRQC_MRQE_MASK) {
1523 case IXGBE_MRQC_VMDQRT8TCEN:
1524 shift = 3; /* 16 VFs / pools */
1526 case IXGBE_MRQC_VMDQRSS32EN:
1527 case IXGBE_MRQC_VMDQRT4TCEN:
1528 shift = 2; /* 32 VFs / pools */
1531 shift = 1; /* 64 VFs / pools */
1535 /* Read WQBR_TX and WQBR_RX and check for malicious queues */
1536 for (i = 0; i < 4; i++) {
1537 wqbr = IXGBE_READ_REG(hw, IXGBE_WQBR_TX(i));
1538 wqbr |= IXGBE_READ_REG(hw, IXGBE_WQBR_RX(i));
1543 /* Get malicious queue */
1544 for (j = 0; j < 32 && wqbr; j++) {
1546 if (!(wqbr & (1 << j)))
1549 /* Get queue from bitmask */
1552 /* Map queue to vf */
1555 /* Set vf bit in vf_bitmap */
1557 vf_bitmap[idx] |= (1 << (vf % 32));
1564 * ixgbe_get_media_type_X550em - Get media type
1565 * @hw: pointer to hardware structure
1567 * Returns the media type (fiber, copper, backplane)
1569 enum ixgbe_media_type ixgbe_get_media_type_X550em(struct ixgbe_hw *hw)
1571 enum ixgbe_media_type media_type;
1573 DEBUGFUNC("ixgbe_get_media_type_X550em");
1575 /* Detect if there is a copper PHY attached. */
1576 switch (hw->device_id) {
1577 case IXGBE_DEV_ID_X550EM_X_KR:
1578 case IXGBE_DEV_ID_X550EM_X_KX4:
1579 case IXGBE_DEV_ID_X550EM_X_XFI:
1580 case IXGBE_DEV_ID_X550EM_A_KR:
1581 case IXGBE_DEV_ID_X550EM_A_KR_L:
1582 media_type = ixgbe_media_type_backplane;
1584 case IXGBE_DEV_ID_X550EM_X_SFP:
1585 case IXGBE_DEV_ID_X550EM_A_SFP:
1586 case IXGBE_DEV_ID_X550EM_A_SFP_N:
1587 case IXGBE_DEV_ID_X550EM_A_QSFP:
1588 case IXGBE_DEV_ID_X550EM_A_QSFP_N:
1589 media_type = ixgbe_media_type_fiber;
1591 case IXGBE_DEV_ID_X550EM_X_1G_T:
1592 case IXGBE_DEV_ID_X550EM_X_10G_T:
1593 case IXGBE_DEV_ID_X550EM_A_10G_T:
1594 media_type = ixgbe_media_type_copper;
1596 case IXGBE_DEV_ID_X550EM_A_SGMII:
1597 case IXGBE_DEV_ID_X550EM_A_SGMII_L:
1598 media_type = ixgbe_media_type_backplane;
1599 hw->phy.type = ixgbe_phy_sgmii;
1601 case IXGBE_DEV_ID_X550EM_A_1G_T:
1602 case IXGBE_DEV_ID_X550EM_A_1G_T_L:
1603 media_type = ixgbe_media_type_copper;
1606 media_type = ixgbe_media_type_unknown;
1613 * ixgbe_supported_sfp_modules_X550em - Check if SFP module type is supported
1614 * @hw: pointer to hardware structure
1615 * @linear: true if SFP module is linear
1617 STATIC s32 ixgbe_supported_sfp_modules_X550em(struct ixgbe_hw *hw, bool *linear)
1619 DEBUGFUNC("ixgbe_supported_sfp_modules_X550em");
1621 switch (hw->phy.sfp_type) {
1622 case ixgbe_sfp_type_not_present:
1623 return IXGBE_ERR_SFP_NOT_PRESENT;
1624 case ixgbe_sfp_type_da_cu_core0:
1625 case ixgbe_sfp_type_da_cu_core1:
1628 case ixgbe_sfp_type_srlr_core0:
1629 case ixgbe_sfp_type_srlr_core1:
1630 case ixgbe_sfp_type_da_act_lmt_core0:
1631 case ixgbe_sfp_type_da_act_lmt_core1:
1632 case ixgbe_sfp_type_1g_sx_core0:
1633 case ixgbe_sfp_type_1g_sx_core1:
1634 case ixgbe_sfp_type_1g_lx_core0:
1635 case ixgbe_sfp_type_1g_lx_core1:
1638 case ixgbe_sfp_type_unknown:
1639 case ixgbe_sfp_type_1g_cu_core0:
1640 case ixgbe_sfp_type_1g_cu_core1:
1642 return IXGBE_ERR_SFP_NOT_SUPPORTED;
1645 return IXGBE_SUCCESS;
1649 * ixgbe_identify_sfp_module_X550em - Identifies SFP modules
1650 * @hw: pointer to hardware structure
1652 * Searches for and identifies the SFP module and assigns appropriate PHY type.
1654 s32 ixgbe_identify_sfp_module_X550em(struct ixgbe_hw *hw)
1659 DEBUGFUNC("ixgbe_identify_sfp_module_X550em");
1661 status = ixgbe_identify_module_generic(hw);
1663 if (status != IXGBE_SUCCESS)
1666 /* Check if SFP module is supported */
1667 status = ixgbe_supported_sfp_modules_X550em(hw, &linear);
1673 * ixgbe_setup_sfp_modules_X550em - Setup MAC link ops
1674 * @hw: pointer to hardware structure
1676 s32 ixgbe_setup_sfp_modules_X550em(struct ixgbe_hw *hw)
1681 DEBUGFUNC("ixgbe_setup_sfp_modules_X550em");
1683 /* Check if SFP module is supported */
1684 status = ixgbe_supported_sfp_modules_X550em(hw, &linear);
1686 if (status != IXGBE_SUCCESS)
1689 ixgbe_init_mac_link_ops_X550em(hw);
1690 hw->phy.ops.reset = NULL;
1692 return IXGBE_SUCCESS;
1696 * ixgbe_restart_an_internal_phy_x550em - restart autonegotiation for the
1698 * @hw: pointer to hardware structure
1700 STATIC s32 ixgbe_restart_an_internal_phy_x550em(struct ixgbe_hw *hw)
1705 /* Restart auto-negotiation. */
1706 status = hw->mac.ops.read_iosf_sb_reg(hw,
1707 IXGBE_KRM_LINK_CTRL_1(hw->bus.lan_id),
1708 IXGBE_SB_IOSF_TARGET_KR_PHY, &link_ctrl);
1711 DEBUGOUT("Auto-negotiation did not complete\n");
1715 link_ctrl |= IXGBE_KRM_LINK_CTRL_1_TETH_AN_RESTART;
1716 status = hw->mac.ops.write_iosf_sb_reg(hw,
1717 IXGBE_KRM_LINK_CTRL_1(hw->bus.lan_id),
1718 IXGBE_SB_IOSF_TARGET_KR_PHY, link_ctrl);
1720 if (hw->mac.type == ixgbe_mac_X550EM_a) {
1723 /* Indicate to FW that AN restart has been asserted */
1724 status = hw->mac.ops.read_iosf_sb_reg(hw,
1725 IXGBE_KRM_PMD_FLX_MASK_ST20(hw->bus.lan_id),
1726 IXGBE_SB_IOSF_TARGET_KR_PHY, &flx_mask_st20);
1729 DEBUGOUT("Auto-negotiation did not complete\n");
1733 flx_mask_st20 |= IXGBE_KRM_PMD_FLX_MASK_ST20_FW_AN_RESTART;
1734 status = hw->mac.ops.write_iosf_sb_reg(hw,
1735 IXGBE_KRM_PMD_FLX_MASK_ST20(hw->bus.lan_id),
1736 IXGBE_SB_IOSF_TARGET_KR_PHY, flx_mask_st20);
1743 * ixgbe_setup_sgmii - Set up link for sgmii
1744 * @hw: pointer to hardware structure
1746 STATIC s32 ixgbe_setup_sgmii(struct ixgbe_hw *hw, ixgbe_link_speed speed,
1749 struct ixgbe_mac_info *mac = &hw->mac;
1750 u32 lval, sval, flx_val;
1753 rc = mac->ops.read_iosf_sb_reg(hw,
1754 IXGBE_KRM_LINK_CTRL_1(hw->bus.lan_id),
1755 IXGBE_SB_IOSF_TARGET_KR_PHY, &lval);
1759 lval &= ~IXGBE_KRM_LINK_CTRL_1_TETH_AN_ENABLE;
1760 lval &= ~IXGBE_KRM_LINK_CTRL_1_TETH_FORCE_SPEED_MASK;
1761 lval |= IXGBE_KRM_LINK_CTRL_1_TETH_AN_SGMII_EN;
1762 lval |= IXGBE_KRM_LINK_CTRL_1_TETH_AN_CLAUSE_37_EN;
1763 lval |= IXGBE_KRM_LINK_CTRL_1_TETH_FORCE_SPEED_1G;
1764 rc = mac->ops.write_iosf_sb_reg(hw,
1765 IXGBE_KRM_LINK_CTRL_1(hw->bus.lan_id),
1766 IXGBE_SB_IOSF_TARGET_KR_PHY, lval);
1770 rc = mac->ops.read_iosf_sb_reg(hw,
1771 IXGBE_KRM_SGMII_CTRL(hw->bus.lan_id),
1772 IXGBE_SB_IOSF_TARGET_KR_PHY, &sval);
1776 sval |= IXGBE_KRM_SGMII_CTRL_MAC_TAR_FORCE_10_D;
1777 sval |= IXGBE_KRM_SGMII_CTRL_MAC_TAR_FORCE_100_D;
1778 rc = mac->ops.write_iosf_sb_reg(hw,
1779 IXGBE_KRM_SGMII_CTRL(hw->bus.lan_id),
1780 IXGBE_SB_IOSF_TARGET_KR_PHY, sval);
1784 rc = mac->ops.read_iosf_sb_reg(hw,
1785 IXGBE_KRM_PMD_FLX_MASK_ST20(hw->bus.lan_id),
1786 IXGBE_SB_IOSF_TARGET_KR_PHY, &flx_val);
1790 flx_val &= ~IXGBE_KRM_PMD_FLX_MASK_ST20_SPEED_MASK;
1791 flx_val |= IXGBE_KRM_PMD_FLX_MASK_ST20_SPEED_1G;
1792 flx_val &= ~IXGBE_KRM_PMD_FLX_MASK_ST20_AN_EN;
1793 flx_val |= IXGBE_KRM_PMD_FLX_MASK_ST20_SGMII_EN;
1794 flx_val |= IXGBE_KRM_PMD_FLX_MASK_ST20_AN37_EN;
1796 rc = mac->ops.write_iosf_sb_reg(hw,
1797 IXGBE_KRM_PMD_FLX_MASK_ST20(hw->bus.lan_id),
1798 IXGBE_SB_IOSF_TARGET_KR_PHY, flx_val);
1802 rc = ixgbe_restart_an_internal_phy_x550em(hw);
1806 return hw->phy.ops.setup_link_speed(hw, speed, autoneg_wait);
1810 * ixgbe_setup_sgmii_fw - Set up link for sgmii with firmware-controlled PHYs
1811 * @hw: pointer to hardware structure
1813 STATIC s32 ixgbe_setup_sgmii_fw(struct ixgbe_hw *hw, ixgbe_link_speed speed,
1816 struct ixgbe_mac_info *mac = &hw->mac;
1817 u32 lval, sval, flx_val;
1820 rc = mac->ops.read_iosf_sb_reg(hw,
1821 IXGBE_KRM_LINK_CTRL_1(hw->bus.lan_id),
1822 IXGBE_SB_IOSF_TARGET_KR_PHY, &lval);
1826 lval &= ~IXGBE_KRM_LINK_CTRL_1_TETH_AN_ENABLE;
1827 lval &= ~IXGBE_KRM_LINK_CTRL_1_TETH_FORCE_SPEED_MASK;
1828 lval |= IXGBE_KRM_LINK_CTRL_1_TETH_AN_SGMII_EN;
1829 lval |= IXGBE_KRM_LINK_CTRL_1_TETH_AN_CLAUSE_37_EN;
1830 lval &= ~IXGBE_KRM_LINK_CTRL_1_TETH_FORCE_SPEED_1G;
1831 rc = mac->ops.write_iosf_sb_reg(hw,
1832 IXGBE_KRM_LINK_CTRL_1(hw->bus.lan_id),
1833 IXGBE_SB_IOSF_TARGET_KR_PHY, lval);
1837 rc = mac->ops.read_iosf_sb_reg(hw,
1838 IXGBE_KRM_SGMII_CTRL(hw->bus.lan_id),
1839 IXGBE_SB_IOSF_TARGET_KR_PHY, &sval);
1843 sval &= ~IXGBE_KRM_SGMII_CTRL_MAC_TAR_FORCE_10_D;
1844 sval &= ~IXGBE_KRM_SGMII_CTRL_MAC_TAR_FORCE_100_D;
1845 rc = mac->ops.write_iosf_sb_reg(hw,
1846 IXGBE_KRM_SGMII_CTRL(hw->bus.lan_id),
1847 IXGBE_SB_IOSF_TARGET_KR_PHY, sval);
1851 rc = mac->ops.write_iosf_sb_reg(hw,
1852 IXGBE_KRM_LINK_CTRL_1(hw->bus.lan_id),
1853 IXGBE_SB_IOSF_TARGET_KR_PHY, lval);
1857 rc = mac->ops.read_iosf_sb_reg(hw,
1858 IXGBE_KRM_PMD_FLX_MASK_ST20(hw->bus.lan_id),
1859 IXGBE_SB_IOSF_TARGET_KR_PHY, &flx_val);
1863 flx_val &= ~IXGBE_KRM_PMD_FLX_MASK_ST20_SPEED_MASK;
1864 flx_val |= IXGBE_KRM_PMD_FLX_MASK_ST20_SPEED_AN;
1865 flx_val &= ~IXGBE_KRM_PMD_FLX_MASK_ST20_AN_EN;
1866 flx_val |= IXGBE_KRM_PMD_FLX_MASK_ST20_SGMII_EN;
1867 flx_val |= IXGBE_KRM_PMD_FLX_MASK_ST20_AN37_EN;
1869 rc = mac->ops.write_iosf_sb_reg(hw,
1870 IXGBE_KRM_PMD_FLX_MASK_ST20(hw->bus.lan_id),
1871 IXGBE_SB_IOSF_TARGET_KR_PHY, flx_val);
1875 rc = ixgbe_restart_an_internal_phy_x550em(hw);
1877 return hw->phy.ops.setup_link_speed(hw, speed, autoneg_wait);
1881 * ixgbe_init_mac_link_ops_X550em - init mac link function pointers
1882 * @hw: pointer to hardware structure
1884 void ixgbe_init_mac_link_ops_X550em(struct ixgbe_hw *hw)
1886 struct ixgbe_mac_info *mac = &hw->mac;
1888 DEBUGFUNC("ixgbe_init_mac_link_ops_X550em");
1890 switch (hw->mac.ops.get_media_type(hw)) {
1891 case ixgbe_media_type_fiber:
1892 /* CS4227 does not support autoneg, so disable the laser control
1893 * functions for SFP+ fiber
1895 mac->ops.disable_tx_laser = NULL;
1896 mac->ops.enable_tx_laser = NULL;
1897 mac->ops.flap_tx_laser = NULL;
1898 mac->ops.setup_link = ixgbe_setup_mac_link_multispeed_fiber;
1899 mac->ops.set_rate_select_speed =
1900 ixgbe_set_soft_rate_select_speed;
1902 if ((hw->device_id == IXGBE_DEV_ID_X550EM_A_SFP_N) ||
1903 (hw->device_id == IXGBE_DEV_ID_X550EM_A_SFP))
1904 mac->ops.setup_mac_link =
1905 ixgbe_setup_mac_link_sfp_x550a;
1907 mac->ops.setup_mac_link =
1908 ixgbe_setup_mac_link_sfp_x550em;
1910 case ixgbe_media_type_copper:
1911 if (hw->mac.type == ixgbe_mac_X550EM_a) {
1912 if (hw->device_id == IXGBE_DEV_ID_X550EM_A_1G_T ||
1913 hw->device_id == IXGBE_DEV_ID_X550EM_A_1G_T_L) {
1914 mac->ops.setup_link = ixgbe_setup_sgmii_fw;
1915 mac->ops.check_link =
1916 ixgbe_check_mac_link_generic;
1918 mac->ops.setup_link =
1919 ixgbe_setup_mac_link_t_X550em;
1922 mac->ops.setup_link = ixgbe_setup_mac_link_t_X550em;
1923 mac->ops.check_link = ixgbe_check_link_t_X550em;
1926 case ixgbe_media_type_backplane:
1927 if (hw->device_id == IXGBE_DEV_ID_X550EM_A_SGMII ||
1928 hw->device_id == IXGBE_DEV_ID_X550EM_A_SGMII_L)
1929 mac->ops.setup_link = ixgbe_setup_sgmii;
1937 * ixgbe_get_link_capabilities_x550em - Determines link capabilities
1938 * @hw: pointer to hardware structure
1939 * @speed: pointer to link speed
1940 * @autoneg: true when autoneg or autotry is enabled
1942 s32 ixgbe_get_link_capabilities_X550em(struct ixgbe_hw *hw,
1943 ixgbe_link_speed *speed,
1946 DEBUGFUNC("ixgbe_get_link_capabilities_X550em");
1949 if (hw->phy.type == ixgbe_phy_fw) {
1951 *speed = hw->phy.speeds_supported;
1956 if (hw->phy.media_type == ixgbe_media_type_fiber) {
1958 /* CS4227 SFP must not enable auto-negotiation */
1961 /* Check if 1G SFP module. */
1962 if (hw->phy.sfp_type == ixgbe_sfp_type_1g_sx_core0 ||
1963 hw->phy.sfp_type == ixgbe_sfp_type_1g_sx_core1
1964 || hw->phy.sfp_type == ixgbe_sfp_type_1g_lx_core0 ||
1965 hw->phy.sfp_type == ixgbe_sfp_type_1g_lx_core1) {
1966 *speed = IXGBE_LINK_SPEED_1GB_FULL;
1967 return IXGBE_SUCCESS;
1970 /* Link capabilities are based on SFP */
1971 if (hw->phy.multispeed_fiber)
1972 *speed = IXGBE_LINK_SPEED_10GB_FULL |
1973 IXGBE_LINK_SPEED_1GB_FULL;
1975 *speed = IXGBE_LINK_SPEED_10GB_FULL;
1977 switch (hw->phy.type) {
1978 case ixgbe_phy_ext_1g_t:
1979 case ixgbe_phy_sgmii:
1980 *speed = IXGBE_LINK_SPEED_1GB_FULL;
1982 case ixgbe_phy_x550em_kr:
1983 if (hw->mac.type == ixgbe_mac_X550EM_a) {
1984 /* check different backplane modes */
1985 if (hw->phy.nw_mng_if_sel &
1986 IXGBE_NW_MNG_IF_SEL_PHY_SPEED_2_5G) {
1987 *speed = IXGBE_LINK_SPEED_2_5GB_FULL;
1989 } else if (hw->device_id ==
1990 IXGBE_DEV_ID_X550EM_A_KR_L) {
1991 *speed = IXGBE_LINK_SPEED_1GB_FULL;
1997 *speed = IXGBE_LINK_SPEED_10GB_FULL |
1998 IXGBE_LINK_SPEED_1GB_FULL;
2004 return IXGBE_SUCCESS;
2008 * ixgbe_get_lasi_ext_t_x550em - Determime external Base T PHY interrupt cause
2009 * @hw: pointer to hardware structure
2010 * @lsc: pointer to boolean flag which indicates whether external Base T
2011 * PHY interrupt is lsc
2013 * Determime if external Base T PHY interrupt cause is high temperature
2014 * failure alarm or link status change.
2016 * Return IXGBE_ERR_OVERTEMP if interrupt is high temperature
2017 * failure alarm, else return PHY access status.
2019 STATIC s32 ixgbe_get_lasi_ext_t_x550em(struct ixgbe_hw *hw, bool *lsc)
2026 /* Vendor alarm triggered */
2027 status = hw->phy.ops.read_reg(hw, IXGBE_MDIO_GLOBAL_CHIP_STD_INT_FLAG,
2028 IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE,
2031 if (status != IXGBE_SUCCESS ||
2032 !(reg & IXGBE_MDIO_GLOBAL_VEN_ALM_INT_EN))
2035 /* Vendor Auto-Neg alarm triggered or Global alarm 1 triggered */
2036 status = hw->phy.ops.read_reg(hw, IXGBE_MDIO_GLOBAL_INT_CHIP_VEN_FLAG,
2037 IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE,
2040 if (status != IXGBE_SUCCESS ||
2041 !(reg & (IXGBE_MDIO_GLOBAL_AN_VEN_ALM_INT_EN |
2042 IXGBE_MDIO_GLOBAL_ALARM_1_INT)))
2045 /* Global alarm triggered */
2046 status = hw->phy.ops.read_reg(hw, IXGBE_MDIO_GLOBAL_ALARM_1,
2047 IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE,
2050 if (status != IXGBE_SUCCESS)
2053 /* If high temperature failure, then return over temp error and exit */
2054 if (reg & IXGBE_MDIO_GLOBAL_ALM_1_HI_TMP_FAIL) {
2055 /* power down the PHY in case the PHY FW didn't already */
2056 ixgbe_set_copper_phy_power(hw, false);
2057 return IXGBE_ERR_OVERTEMP;
2058 } else if (reg & IXGBE_MDIO_GLOBAL_ALM_1_DEV_FAULT) {
2059 /* device fault alarm triggered */
2060 status = hw->phy.ops.read_reg(hw, IXGBE_MDIO_GLOBAL_FAULT_MSG,
2061 IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE,
2064 if (status != IXGBE_SUCCESS)
2067 /* if device fault was due to high temp alarm handle and exit */
2068 if (reg == IXGBE_MDIO_GLOBAL_FAULT_MSG_HI_TMP) {
2069 /* power down the PHY in case the PHY FW didn't */
2070 ixgbe_set_copper_phy_power(hw, false);
2071 return IXGBE_ERR_OVERTEMP;
2075 /* Vendor alarm 2 triggered */
2076 status = hw->phy.ops.read_reg(hw, IXGBE_MDIO_GLOBAL_CHIP_STD_INT_FLAG,
2077 IXGBE_MDIO_AUTO_NEG_DEV_TYPE, ®);
2079 if (status != IXGBE_SUCCESS ||
2080 !(reg & IXGBE_MDIO_GLOBAL_STD_ALM2_INT))
2083 /* link connect/disconnect event occurred */
2084 status = hw->phy.ops.read_reg(hw, IXGBE_MDIO_AUTO_NEG_VENDOR_TX_ALARM2,
2085 IXGBE_MDIO_AUTO_NEG_DEV_TYPE, ®);
2087 if (status != IXGBE_SUCCESS)
2091 if (reg & IXGBE_MDIO_AUTO_NEG_VEN_LSC)
2094 return IXGBE_SUCCESS;
2098 * ixgbe_enable_lasi_ext_t_x550em - Enable external Base T PHY interrupts
2099 * @hw: pointer to hardware structure
2101 * Enable link status change and temperature failure alarm for the external
2104 * Returns PHY access status
2106 STATIC s32 ixgbe_enable_lasi_ext_t_x550em(struct ixgbe_hw *hw)
2112 /* Clear interrupt flags */
2113 status = ixgbe_get_lasi_ext_t_x550em(hw, &lsc);
2115 /* Enable link status change alarm */
2117 /* Enable the LASI interrupts on X552 devices to receive notifications
2118 * of the link configurations of the external PHY and correspondingly
2119 * support the configuration of the internal iXFI link, since iXFI does
2120 * not support auto-negotiation. This is not required for X553 devices
2121 * having KR support, which performs auto-negotiations and which is used
2122 * as the internal link to the external PHY. Hence adding a check here
2123 * to avoid enabling LASI interrupts for X553 devices.
2125 if (hw->mac.type != ixgbe_mac_X550EM_a) {
2126 status = hw->phy.ops.read_reg(hw,
2127 IXGBE_MDIO_PMA_TX_VEN_LASI_INT_MASK,
2128 IXGBE_MDIO_AUTO_NEG_DEV_TYPE, ®);
2130 if (status != IXGBE_SUCCESS)
2133 reg |= IXGBE_MDIO_PMA_TX_VEN_LASI_INT_EN;
2135 status = hw->phy.ops.write_reg(hw,
2136 IXGBE_MDIO_PMA_TX_VEN_LASI_INT_MASK,
2137 IXGBE_MDIO_AUTO_NEG_DEV_TYPE, reg);
2139 if (status != IXGBE_SUCCESS)
2143 /* Enable high temperature failure and global fault alarms */
2144 status = hw->phy.ops.read_reg(hw, IXGBE_MDIO_GLOBAL_INT_MASK,
2145 IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE,
2148 if (status != IXGBE_SUCCESS)
2151 reg |= (IXGBE_MDIO_GLOBAL_INT_HI_TEMP_EN |
2152 IXGBE_MDIO_GLOBAL_INT_DEV_FAULT_EN);
2154 status = hw->phy.ops.write_reg(hw, IXGBE_MDIO_GLOBAL_INT_MASK,
2155 IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE,
2158 if (status != IXGBE_SUCCESS)
2161 /* Enable vendor Auto-Neg alarm and Global Interrupt Mask 1 alarm */
2162 status = hw->phy.ops.read_reg(hw, IXGBE_MDIO_GLOBAL_INT_CHIP_VEN_MASK,
2163 IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE,
2166 if (status != IXGBE_SUCCESS)
2169 reg |= (IXGBE_MDIO_GLOBAL_AN_VEN_ALM_INT_EN |
2170 IXGBE_MDIO_GLOBAL_ALARM_1_INT);
2172 status = hw->phy.ops.write_reg(hw, IXGBE_MDIO_GLOBAL_INT_CHIP_VEN_MASK,
2173 IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE,
2176 if (status != IXGBE_SUCCESS)
2179 /* Enable chip-wide vendor alarm */
2180 status = hw->phy.ops.read_reg(hw, IXGBE_MDIO_GLOBAL_INT_CHIP_STD_MASK,
2181 IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE,
2184 if (status != IXGBE_SUCCESS)
2187 reg |= IXGBE_MDIO_GLOBAL_VEN_ALM_INT_EN;
2189 status = hw->phy.ops.write_reg(hw, IXGBE_MDIO_GLOBAL_INT_CHIP_STD_MASK,
2190 IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE,
2197 * ixgbe_setup_kr_speed_x550em - Configure the KR PHY for link speed.
2198 * @hw: pointer to hardware structure
2199 * @speed: link speed
2201 * Configures the integrated KR PHY.
2203 STATIC s32 ixgbe_setup_kr_speed_x550em(struct ixgbe_hw *hw,
2204 ixgbe_link_speed speed)
2209 status = hw->mac.ops.read_iosf_sb_reg(hw,
2210 IXGBE_KRM_LINK_CTRL_1(hw->bus.lan_id),
2211 IXGBE_SB_IOSF_TARGET_KR_PHY, ®_val);
2215 reg_val |= IXGBE_KRM_LINK_CTRL_1_TETH_AN_ENABLE;
2216 reg_val &= ~(IXGBE_KRM_LINK_CTRL_1_TETH_AN_CAP_KR |
2217 IXGBE_KRM_LINK_CTRL_1_TETH_AN_CAP_KX);
2219 /* Advertise 10G support. */
2220 if (speed & IXGBE_LINK_SPEED_10GB_FULL)
2221 reg_val |= IXGBE_KRM_LINK_CTRL_1_TETH_AN_CAP_KR;
2223 /* Advertise 1G support. */
2224 if (speed & IXGBE_LINK_SPEED_1GB_FULL)
2225 reg_val |= IXGBE_KRM_LINK_CTRL_1_TETH_AN_CAP_KX;
2227 status = hw->mac.ops.write_iosf_sb_reg(hw,
2228 IXGBE_KRM_LINK_CTRL_1(hw->bus.lan_id),
2229 IXGBE_SB_IOSF_TARGET_KR_PHY, reg_val);
2231 if (hw->mac.type == ixgbe_mac_X550EM_a) {
2232 /* Set lane mode to KR auto negotiation */
2233 status = hw->mac.ops.read_iosf_sb_reg(hw,
2234 IXGBE_KRM_PMD_FLX_MASK_ST20(hw->bus.lan_id),
2235 IXGBE_SB_IOSF_TARGET_KR_PHY, ®_val);
2240 reg_val &= ~IXGBE_KRM_PMD_FLX_MASK_ST20_SPEED_MASK;
2241 reg_val |= IXGBE_KRM_PMD_FLX_MASK_ST20_SPEED_AN;
2242 reg_val |= IXGBE_KRM_PMD_FLX_MASK_ST20_AN_EN;
2243 reg_val &= ~IXGBE_KRM_PMD_FLX_MASK_ST20_AN37_EN;
2244 reg_val &= ~IXGBE_KRM_PMD_FLX_MASK_ST20_SGMII_EN;
2246 status = hw->mac.ops.write_iosf_sb_reg(hw,
2247 IXGBE_KRM_PMD_FLX_MASK_ST20(hw->bus.lan_id),
2248 IXGBE_SB_IOSF_TARGET_KR_PHY, reg_val);
2251 return ixgbe_restart_an_internal_phy_x550em(hw);
2255 * ixgbe_reset_phy_fw - Reset firmware-controlled PHYs
2256 * @hw: pointer to hardware structure
2258 static s32 ixgbe_reset_phy_fw(struct ixgbe_hw *hw)
2260 u32 store[FW_PHY_ACT_DATA_COUNT] = { 0 };
2263 if (hw->phy.reset_disable || ixgbe_check_reset_blocked(hw))
2264 return IXGBE_SUCCESS;
2266 rc = ixgbe_fw_phy_activity(hw, FW_PHY_ACT_PHY_SW_RESET, &store);
2269 memset(store, 0, sizeof(store));
2271 rc = ixgbe_fw_phy_activity(hw, FW_PHY_ACT_INIT_PHY, &store);
2275 return ixgbe_setup_fw_link(hw);
2279 * ixgbe_check_overtemp_fw - Check firmware-controlled PHYs for overtemp
2280 * @hw: pointer to hardware structure
2282 static s32 ixgbe_check_overtemp_fw(struct ixgbe_hw *hw)
2284 u32 store[FW_PHY_ACT_DATA_COUNT] = { 0 };
2287 rc = ixgbe_fw_phy_activity(hw, FW_PHY_ACT_GET_LINK_INFO, &store);
2291 if (store[0] & FW_PHY_ACT_GET_LINK_INFO_TEMP) {
2292 ixgbe_shutdown_fw_phy(hw);
2293 return IXGBE_ERR_OVERTEMP;
2295 return IXGBE_SUCCESS;
2299 * ixgbe_read_mng_if_sel_x550em - Read NW_MNG_IF_SEL register
2300 * @hw: pointer to hardware structure
2302 * Read NW_MNG_IF_SEL register and save field values, and check for valid field
2305 STATIC s32 ixgbe_read_mng_if_sel_x550em(struct ixgbe_hw *hw)
2307 /* Save NW management interface connected on board. This is used
2308 * to determine internal PHY mode.
2310 hw->phy.nw_mng_if_sel = IXGBE_READ_REG(hw, IXGBE_NW_MNG_IF_SEL);
2312 /* If X552 (X550EM_a) and MDIO is connected to external PHY, then set
2313 * PHY address. This register field was has only been used for X552.
2315 if (hw->mac.type == ixgbe_mac_X550EM_a &&
2316 hw->phy.nw_mng_if_sel & IXGBE_NW_MNG_IF_SEL_MDIO_ACT) {
2317 hw->phy.addr = (hw->phy.nw_mng_if_sel &
2318 IXGBE_NW_MNG_IF_SEL_MDIO_PHY_ADD) >>
2319 IXGBE_NW_MNG_IF_SEL_MDIO_PHY_ADD_SHIFT;
2322 return IXGBE_SUCCESS;
2326 * ixgbe_init_phy_ops_X550em - PHY/SFP specific init
2327 * @hw: pointer to hardware structure
2329 * Initialize any function pointers that were not able to be
2330 * set during init_shared_code because the PHY/SFP type was
2331 * not known. Perform the SFP init if necessary.
2333 s32 ixgbe_init_phy_ops_X550em(struct ixgbe_hw *hw)
2335 struct ixgbe_phy_info *phy = &hw->phy;
2338 DEBUGFUNC("ixgbe_init_phy_ops_X550em");
2340 hw->mac.ops.set_lan_id(hw);
2341 ixgbe_read_mng_if_sel_x550em(hw);
2343 if (hw->mac.ops.get_media_type(hw) == ixgbe_media_type_fiber) {
2344 phy->phy_semaphore_mask = IXGBE_GSSR_SHARED_I2C_SM;
2345 ixgbe_setup_mux_ctl(hw);
2346 phy->ops.identify_sfp = ixgbe_identify_sfp_module_X550em;
2349 switch (hw->device_id) {
2350 case IXGBE_DEV_ID_X550EM_A_1G_T:
2351 case IXGBE_DEV_ID_X550EM_A_1G_T_L:
2352 phy->ops.read_reg_mdi = ixgbe_read_phy_reg_mdi_22;
2353 phy->ops.write_reg_mdi = ixgbe_write_phy_reg_mdi_22;
2354 hw->phy.ops.read_reg = ixgbe_read_phy_reg_x550a;
2355 hw->phy.ops.write_reg = ixgbe_write_phy_reg_x550a;
2356 phy->ops.check_overtemp = ixgbe_check_overtemp_fw;
2358 hw->phy.phy_semaphore_mask |= IXGBE_GSSR_PHY1_SM;
2360 hw->phy.phy_semaphore_mask |= IXGBE_GSSR_PHY0_SM;
2363 case IXGBE_DEV_ID_X550EM_A_10G_T:
2364 case IXGBE_DEV_ID_X550EM_A_SFP:
2365 hw->phy.ops.read_reg = ixgbe_read_phy_reg_x550a;
2366 hw->phy.ops.write_reg = ixgbe_write_phy_reg_x550a;
2368 hw->phy.phy_semaphore_mask |= IXGBE_GSSR_PHY1_SM;
2370 hw->phy.phy_semaphore_mask |= IXGBE_GSSR_PHY0_SM;
2372 case IXGBE_DEV_ID_X550EM_X_SFP:
2373 /* set up for CS4227 usage */
2374 hw->phy.phy_semaphore_mask = IXGBE_GSSR_SHARED_I2C_SM;
2380 /* Identify the PHY or SFP module */
2381 ret_val = phy->ops.identify(hw);
2382 if (ret_val == IXGBE_ERR_SFP_NOT_SUPPORTED ||
2383 ret_val == IXGBE_ERR_PHY_ADDR_INVALID)
2386 /* Setup function pointers based on detected hardware */
2387 ixgbe_init_mac_link_ops_X550em(hw);
2388 if (phy->sfp_type != ixgbe_sfp_type_unknown)
2389 phy->ops.reset = NULL;
2391 /* Set functions pointers based on phy type */
2392 switch (hw->phy.type) {
2393 case ixgbe_phy_x550em_kx4:
2394 phy->ops.setup_link = NULL;
2395 phy->ops.read_reg = ixgbe_read_phy_reg_x550em;
2396 phy->ops.write_reg = ixgbe_write_phy_reg_x550em;
2398 case ixgbe_phy_x550em_kr:
2399 phy->ops.setup_link = ixgbe_setup_kr_x550em;
2400 phy->ops.read_reg = ixgbe_read_phy_reg_x550em;
2401 phy->ops.write_reg = ixgbe_write_phy_reg_x550em;
2403 case ixgbe_phy_ext_1g_t:
2404 /* link is managed by FW */
2405 phy->ops.setup_link = NULL;
2407 case ixgbe_phy_x550em_xfi:
2408 /* link is managed by HW */
2409 phy->ops.setup_link = NULL;
2410 phy->ops.read_reg = ixgbe_read_phy_reg_x550em;
2411 phy->ops.write_reg = ixgbe_write_phy_reg_x550em;
2413 case ixgbe_phy_x550em_ext_t:
2414 /* If internal link mode is XFI, then setup iXFI internal link,
2415 * else setup KR now.
2417 phy->ops.setup_internal_link =
2418 ixgbe_setup_internal_phy_t_x550em;
2420 /* setup SW LPLU only for first revision of X550EM_x */
2421 if ((hw->mac.type == ixgbe_mac_X550EM_x) &&
2422 !(IXGBE_FUSES0_REV_MASK &
2423 IXGBE_READ_REG(hw, IXGBE_FUSES0_GROUP(0))))
2424 phy->ops.enter_lplu = ixgbe_enter_lplu_t_x550em;
2426 phy->ops.handle_lasi = ixgbe_handle_lasi_ext_t_x550em;
2427 phy->ops.reset = ixgbe_reset_phy_t_X550em;
2429 case ixgbe_phy_sgmii:
2430 phy->ops.setup_link = NULL;
2433 phy->ops.setup_link = ixgbe_setup_fw_link;
2434 phy->ops.reset = ixgbe_reset_phy_fw;
2443 * ixgbe_set_mdio_speed - Set MDIO clock speed
2444 * @hw: pointer to hardware structure
2446 STATIC void ixgbe_set_mdio_speed(struct ixgbe_hw *hw)
2450 switch (hw->device_id) {
2451 case IXGBE_DEV_ID_X550EM_X_10G_T:
2452 case IXGBE_DEV_ID_X550EM_A_SGMII:
2453 case IXGBE_DEV_ID_X550EM_A_SGMII_L:
2454 case IXGBE_DEV_ID_X550EM_A_10G_T:
2455 case IXGBE_DEV_ID_X550EM_A_SFP:
2456 case IXGBE_DEV_ID_X550EM_A_QSFP:
2457 /* Config MDIO clock speed before the first MDIO PHY access */
2458 hlreg0 = IXGBE_READ_REG(hw, IXGBE_HLREG0);
2459 hlreg0 &= ~IXGBE_HLREG0_MDCSPD;
2460 IXGBE_WRITE_REG(hw, IXGBE_HLREG0, hlreg0);
2462 case IXGBE_DEV_ID_X550EM_A_1G_T:
2463 case IXGBE_DEV_ID_X550EM_A_1G_T_L:
2464 /* Select fast MDIO clock speed for these devices */
2465 hlreg0 = IXGBE_READ_REG(hw, IXGBE_HLREG0);
2466 hlreg0 |= IXGBE_HLREG0_MDCSPD;
2467 IXGBE_WRITE_REG(hw, IXGBE_HLREG0, hlreg0);
2475 * ixgbe_reset_hw_X550em - Perform hardware reset
2476 * @hw: pointer to hardware structure
2478 * Resets the hardware by resetting the transmit and receive units, masks
2479 * and clears all interrupts, perform a PHY reset, and perform a link (MAC)
2482 s32 ixgbe_reset_hw_X550em(struct ixgbe_hw *hw)
2484 ixgbe_link_speed link_speed;
2488 bool link_up = false;
2490 DEBUGFUNC("ixgbe_reset_hw_X550em");
2492 /* Call adapter stop to disable Tx/Rx and clear interrupts */
2493 status = hw->mac.ops.stop_adapter(hw);
2494 if (status != IXGBE_SUCCESS)
2497 /* flush pending Tx transactions */
2498 ixgbe_clear_tx_pending(hw);
2500 ixgbe_set_mdio_speed(hw);
2502 /* PHY ops must be identified and initialized prior to reset */
2503 status = hw->phy.ops.init(hw);
2505 if (status == IXGBE_ERR_SFP_NOT_SUPPORTED)
2508 /* start the external PHY */
2509 if (hw->phy.type == ixgbe_phy_x550em_ext_t) {
2510 status = ixgbe_init_ext_t_x550em(hw);
2515 /* Setup SFP module if there is one present. */
2516 if (hw->phy.sfp_setup_needed) {
2517 status = hw->mac.ops.setup_sfp(hw);
2518 hw->phy.sfp_setup_needed = false;
2521 if (status == IXGBE_ERR_SFP_NOT_SUPPORTED)
2525 if (!hw->phy.reset_disable && hw->phy.ops.reset) {
2526 if (hw->phy.ops.reset(hw) == IXGBE_ERR_OVERTEMP)
2527 return IXGBE_ERR_OVERTEMP;
2531 /* Issue global reset to the MAC. Needs to be SW reset if link is up.
2532 * If link reset is used when link is up, it might reset the PHY when
2533 * mng is using it. If link is down or the flag to force full link
2534 * reset is set, then perform link reset.
2536 ctrl = IXGBE_CTRL_LNK_RST;
2537 if (!hw->force_full_reset) {
2538 hw->mac.ops.check_link(hw, &link_speed, &link_up, false);
2540 ctrl = IXGBE_CTRL_RST;
2543 ctrl |= IXGBE_READ_REG(hw, IXGBE_CTRL);
2544 IXGBE_WRITE_REG(hw, IXGBE_CTRL, ctrl);
2545 IXGBE_WRITE_FLUSH(hw);
2547 /* Poll for reset bit to self-clear meaning reset is complete */
2548 for (i = 0; i < 10; i++) {
2550 ctrl = IXGBE_READ_REG(hw, IXGBE_CTRL);
2551 if (!(ctrl & IXGBE_CTRL_RST_MASK))
2555 if (ctrl & IXGBE_CTRL_RST_MASK) {
2556 status = IXGBE_ERR_RESET_FAILED;
2557 DEBUGOUT("Reset polling failed to complete.\n");
2562 /* Double resets are required for recovery from certain error
2563 * conditions. Between resets, it is necessary to stall to
2564 * allow time for any pending HW events to complete.
2566 if (hw->mac.flags & IXGBE_FLAGS_DOUBLE_RESET_REQUIRED) {
2567 hw->mac.flags &= ~IXGBE_FLAGS_DOUBLE_RESET_REQUIRED;
2571 /* Store the permanent mac address */
2572 hw->mac.ops.get_mac_addr(hw, hw->mac.perm_addr);
2574 /* Store MAC address from RAR0, clear receive address registers, and
2575 * clear the multicast table. Also reset num_rar_entries to 128,
2576 * since we modify this value when programming the SAN MAC address.
2578 hw->mac.num_rar_entries = 128;
2579 hw->mac.ops.init_rx_addrs(hw);
2581 ixgbe_set_mdio_speed(hw);
2583 if (hw->device_id == IXGBE_DEV_ID_X550EM_X_SFP)
2584 ixgbe_setup_mux_ctl(hw);
2590 * ixgbe_init_ext_t_x550em - Start (unstall) the external Base T PHY.
2591 * @hw: pointer to hardware structure
2593 s32 ixgbe_init_ext_t_x550em(struct ixgbe_hw *hw)
2598 status = hw->phy.ops.read_reg(hw,
2599 IXGBE_MDIO_TX_VENDOR_ALARMS_3,
2600 IXGBE_MDIO_PMA_PMD_DEV_TYPE,
2603 if (status != IXGBE_SUCCESS)
2606 /* If PHY FW reset completed bit is set then this is the first
2607 * SW instance after a power on so the PHY FW must be un-stalled.
2609 if (reg & IXGBE_MDIO_TX_VENDOR_ALARMS_3_RST_MASK) {
2610 status = hw->phy.ops.read_reg(hw,
2611 IXGBE_MDIO_GLOBAL_RES_PR_10,
2612 IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE,
2615 if (status != IXGBE_SUCCESS)
2618 reg &= ~IXGBE_MDIO_POWER_UP_STALL;
2620 status = hw->phy.ops.write_reg(hw,
2621 IXGBE_MDIO_GLOBAL_RES_PR_10,
2622 IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE,
2625 if (status != IXGBE_SUCCESS)
2633 * ixgbe_setup_kr_x550em - Configure the KR PHY.
2634 * @hw: pointer to hardware structure
2636 s32 ixgbe_setup_kr_x550em(struct ixgbe_hw *hw)
2638 /* leave link alone for 2.5G */
2639 if (hw->phy.autoneg_advertised & IXGBE_LINK_SPEED_2_5GB_FULL)
2640 return IXGBE_SUCCESS;
2642 return ixgbe_setup_kr_speed_x550em(hw, hw->phy.autoneg_advertised);
2646 * ixgbe_setup_mac_link_sfp_x550em - Setup internal/external the PHY for SFP
2647 * @hw: pointer to hardware structure
2649 * Configure the external PHY and the integrated KR PHY for SFP support.
2651 s32 ixgbe_setup_mac_link_sfp_x550em(struct ixgbe_hw *hw,
2652 ixgbe_link_speed speed,
2653 bool autoneg_wait_to_complete)
2656 u16 reg_slice, reg_val;
2657 bool setup_linear = false;
2658 UNREFERENCED_1PARAMETER(autoneg_wait_to_complete);
2660 /* Check if SFP module is supported and linear */
2661 ret_val = ixgbe_supported_sfp_modules_X550em(hw, &setup_linear);
2663 /* If no SFP module present, then return success. Return success since
2664 * there is no reason to configure CS4227 and SFP not present error is
2665 * not excepted in the setup MAC link flow.
2667 if (ret_val == IXGBE_ERR_SFP_NOT_PRESENT)
2668 return IXGBE_SUCCESS;
2670 if (ret_val != IXGBE_SUCCESS)
2673 if (!(hw->phy.nw_mng_if_sel & IXGBE_NW_MNG_IF_SEL_INT_PHY_MODE)) {
2674 /* Configure CS4227 LINE side to 10G SR. */
2675 reg_slice = IXGBE_CS4227_LINE_SPARE22_MSB +
2676 (hw->bus.lan_id << 12);
2677 reg_val = IXGBE_CS4227_SPEED_10G;
2678 ret_val = hw->link.ops.write_link(hw, hw->link.addr, reg_slice,
2681 reg_slice = IXGBE_CS4227_LINE_SPARE24_LSB +
2682 (hw->bus.lan_id << 12);
2683 reg_val = (IXGBE_CS4227_EDC_MODE_SR << 1) | 0x1;
2684 ret_val = hw->link.ops.write_link(hw, hw->link.addr, reg_slice,
2687 /* Configure CS4227 for HOST connection rate then type. */
2688 reg_slice = IXGBE_CS4227_HOST_SPARE22_MSB +
2689 (hw->bus.lan_id << 12);
2690 reg_val = (speed & IXGBE_LINK_SPEED_10GB_FULL) ?
2691 IXGBE_CS4227_SPEED_10G : IXGBE_CS4227_SPEED_1G;
2692 ret_val = hw->link.ops.write_link(hw, hw->link.addr, reg_slice,
2695 reg_slice = IXGBE_CS4227_HOST_SPARE24_LSB +
2696 (hw->bus.lan_id << 12);
2698 reg_val = (IXGBE_CS4227_EDC_MODE_CX1 << 1) | 0x1;
2700 reg_val = (IXGBE_CS4227_EDC_MODE_SR << 1) | 0x1;
2701 ret_val = hw->link.ops.write_link(hw, hw->link.addr, reg_slice,
2704 /* Setup XFI internal link. */
2705 ret_val = ixgbe_setup_ixfi_x550em(hw, &speed);
2707 /* Configure internal PHY for KR/KX. */
2708 ixgbe_setup_kr_speed_x550em(hw, speed);
2710 /* Configure CS4227 LINE side to proper mode. */
2711 reg_slice = IXGBE_CS4227_LINE_SPARE24_LSB +
2712 (hw->bus.lan_id << 12);
2714 reg_val = (IXGBE_CS4227_EDC_MODE_CX1 << 1) | 0x1;
2716 reg_val = (IXGBE_CS4227_EDC_MODE_SR << 1) | 0x1;
2717 ret_val = hw->link.ops.write_link(hw, hw->link.addr, reg_slice,
2724 * ixgbe_setup_sfi_x550a - Configure the internal PHY for native SFI mode
2725 * @hw: pointer to hardware structure
2726 * @speed: the link speed to force
2728 * Configures the integrated PHY for native SFI mode. Used to connect the
2729 * internal PHY directly to an SFP cage, without autonegotiation.
2731 STATIC s32 ixgbe_setup_sfi_x550a(struct ixgbe_hw *hw, ixgbe_link_speed *speed)
2733 struct ixgbe_mac_info *mac = &hw->mac;
2737 /* Disable all AN and force speed to 10G Serial. */
2738 status = mac->ops.read_iosf_sb_reg(hw,
2739 IXGBE_KRM_PMD_FLX_MASK_ST20(hw->bus.lan_id),
2740 IXGBE_SB_IOSF_TARGET_KR_PHY, ®_val);
2741 if (status != IXGBE_SUCCESS)
2744 reg_val &= ~IXGBE_KRM_PMD_FLX_MASK_ST20_AN_EN;
2745 reg_val &= ~IXGBE_KRM_PMD_FLX_MASK_ST20_AN37_EN;
2746 reg_val &= ~IXGBE_KRM_PMD_FLX_MASK_ST20_SGMII_EN;
2747 reg_val &= ~IXGBE_KRM_PMD_FLX_MASK_ST20_SPEED_MASK;
2749 /* Select forced link speed for internal PHY. */
2751 case IXGBE_LINK_SPEED_10GB_FULL:
2752 reg_val |= IXGBE_KRM_PMD_FLX_MASK_ST20_SPEED_10G;
2754 case IXGBE_LINK_SPEED_1GB_FULL:
2755 reg_val |= IXGBE_KRM_PMD_FLX_MASK_ST20_SPEED_1G;
2758 /* Other link speeds are not supported by internal PHY. */
2759 return IXGBE_ERR_LINK_SETUP;
2762 status = mac->ops.write_iosf_sb_reg(hw,
2763 IXGBE_KRM_PMD_FLX_MASK_ST20(hw->bus.lan_id),
2764 IXGBE_SB_IOSF_TARGET_KR_PHY, reg_val);
2766 /* Toggle port SW reset by AN reset. */
2767 status = ixgbe_restart_an_internal_phy_x550em(hw);
2773 * ixgbe_setup_mac_link_sfp_x550a - Setup internal PHY for SFP
2774 * @hw: pointer to hardware structure
2776 * Configure the the integrated PHY for SFP support.
2778 s32 ixgbe_setup_mac_link_sfp_x550a(struct ixgbe_hw *hw,
2779 ixgbe_link_speed speed,
2780 bool autoneg_wait_to_complete)
2784 bool setup_linear = false;
2785 u32 reg_slice, reg_phy_int, slice_offset;
2787 UNREFERENCED_1PARAMETER(autoneg_wait_to_complete);
2789 /* Check if SFP module is supported and linear */
2790 ret_val = ixgbe_supported_sfp_modules_X550em(hw, &setup_linear);
2792 /* If no SFP module present, then return success. Return success since
2793 * SFP not present error is not excepted in the setup MAC link flow.
2795 if (ret_val == IXGBE_ERR_SFP_NOT_PRESENT)
2796 return IXGBE_SUCCESS;
2798 if (ret_val != IXGBE_SUCCESS)
2801 if (hw->device_id == IXGBE_DEV_ID_X550EM_A_SFP_N) {
2802 /* Configure internal PHY for native SFI based on module type */
2803 ret_val = hw->mac.ops.read_iosf_sb_reg(hw,
2804 IXGBE_KRM_PMD_FLX_MASK_ST20(hw->bus.lan_id),
2805 IXGBE_SB_IOSF_TARGET_KR_PHY, ®_phy_int);
2807 if (ret_val != IXGBE_SUCCESS)
2810 reg_phy_int &= IXGBE_KRM_PMD_FLX_MASK_ST20_SFI_10G_DA;
2812 reg_phy_int |= IXGBE_KRM_PMD_FLX_MASK_ST20_SFI_10G_SR;
2814 ret_val = hw->mac.ops.write_iosf_sb_reg(hw,
2815 IXGBE_KRM_PMD_FLX_MASK_ST20(hw->bus.lan_id),
2816 IXGBE_SB_IOSF_TARGET_KR_PHY, reg_phy_int);
2818 if (ret_val != IXGBE_SUCCESS)
2821 /* Setup SFI internal link. */
2822 ret_val = ixgbe_setup_sfi_x550a(hw, &speed);
2824 /* Configure internal PHY for KR/KX. */
2825 ixgbe_setup_kr_speed_x550em(hw, speed);
2827 if (hw->phy.addr == 0x0 || hw->phy.addr == 0xFFFF) {
2829 DEBUGOUT("Invalid NW_MNG_IF_SEL.MDIO_PHY_ADD value\n");
2830 return IXGBE_ERR_PHY_ADDR_INVALID;
2833 /* Get external PHY SKU id */
2834 ret_val = hw->phy.ops.read_reg(hw, IXGBE_CS4227_EFUSE_PDF_SKU,
2835 IXGBE_MDIO_ZERO_DEV_TYPE, ®_phy_ext);
2837 if (ret_val != IXGBE_SUCCESS)
2840 /* When configuring quad port CS4223, the MAC instance is part
2841 * of the slice offset.
2843 if (reg_phy_ext == IXGBE_CS4223_SKU_ID)
2844 slice_offset = (hw->bus.lan_id +
2845 (hw->bus.instance_id << 1)) << 12;
2847 slice_offset = hw->bus.lan_id << 12;
2849 /* Configure CS4227/CS4223 LINE side to proper mode. */
2850 reg_slice = IXGBE_CS4227_LINE_SPARE24_LSB + slice_offset;
2852 ret_val = hw->phy.ops.read_reg(hw, reg_slice,
2853 IXGBE_MDIO_ZERO_DEV_TYPE, ®_phy_ext);
2855 if (ret_val != IXGBE_SUCCESS)
2858 reg_phy_ext &= ~((IXGBE_CS4227_EDC_MODE_CX1 << 1) |
2859 (IXGBE_CS4227_EDC_MODE_SR << 1));
2862 reg_phy_ext = (IXGBE_CS4227_EDC_MODE_CX1 << 1) | 0x1;
2864 reg_phy_ext = (IXGBE_CS4227_EDC_MODE_SR << 1) | 0x1;
2865 ret_val = hw->phy.ops.write_reg(hw, reg_slice,
2866 IXGBE_MDIO_ZERO_DEV_TYPE, reg_phy_ext);
2868 /* Flush previous write with a read */
2869 ret_val = hw->phy.ops.read_reg(hw, reg_slice,
2870 IXGBE_MDIO_ZERO_DEV_TYPE, ®_phy_ext);
2876 * ixgbe_setup_ixfi_x550em_x - MAC specific iXFI configuration
2877 * @hw: pointer to hardware structure
2879 * iXfI configuration needed for ixgbe_mac_X550EM_x devices.
2881 STATIC s32 ixgbe_setup_ixfi_x550em_x(struct ixgbe_hw *hw)
2883 struct ixgbe_mac_info *mac = &hw->mac;
2887 /* Disable training protocol FSM. */
2888 status = mac->ops.read_iosf_sb_reg(hw,
2889 IXGBE_KRM_RX_TRN_LINKUP_CTRL(hw->bus.lan_id),
2890 IXGBE_SB_IOSF_TARGET_KR_PHY, ®_val);
2891 if (status != IXGBE_SUCCESS)
2893 reg_val |= IXGBE_KRM_RX_TRN_LINKUP_CTRL_CONV_WO_PROTOCOL;
2894 status = mac->ops.write_iosf_sb_reg(hw,
2895 IXGBE_KRM_RX_TRN_LINKUP_CTRL(hw->bus.lan_id),
2896 IXGBE_SB_IOSF_TARGET_KR_PHY, reg_val);
2897 if (status != IXGBE_SUCCESS)
2900 /* Disable Flex from training TXFFE. */
2901 status = mac->ops.read_iosf_sb_reg(hw,
2902 IXGBE_KRM_DSP_TXFFE_STATE_4(hw->bus.lan_id),
2903 IXGBE_SB_IOSF_TARGET_KR_PHY, ®_val);
2904 if (status != IXGBE_SUCCESS)
2906 reg_val &= ~IXGBE_KRM_DSP_TXFFE_STATE_C0_EN;
2907 reg_val &= ~IXGBE_KRM_DSP_TXFFE_STATE_CP1_CN1_EN;
2908 reg_val &= ~IXGBE_KRM_DSP_TXFFE_STATE_CO_ADAPT_EN;
2909 status = mac->ops.write_iosf_sb_reg(hw,
2910 IXGBE_KRM_DSP_TXFFE_STATE_4(hw->bus.lan_id),
2911 IXGBE_SB_IOSF_TARGET_KR_PHY, reg_val);
2912 if (status != IXGBE_SUCCESS)
2914 status = mac->ops.read_iosf_sb_reg(hw,
2915 IXGBE_KRM_DSP_TXFFE_STATE_5(hw->bus.lan_id),
2916 IXGBE_SB_IOSF_TARGET_KR_PHY, ®_val);
2917 if (status != IXGBE_SUCCESS)
2919 reg_val &= ~IXGBE_KRM_DSP_TXFFE_STATE_C0_EN;
2920 reg_val &= ~IXGBE_KRM_DSP_TXFFE_STATE_CP1_CN1_EN;
2921 reg_val &= ~IXGBE_KRM_DSP_TXFFE_STATE_CO_ADAPT_EN;
2922 status = mac->ops.write_iosf_sb_reg(hw,
2923 IXGBE_KRM_DSP_TXFFE_STATE_5(hw->bus.lan_id),
2924 IXGBE_SB_IOSF_TARGET_KR_PHY, reg_val);
2925 if (status != IXGBE_SUCCESS)
2928 /* Enable override for coefficients. */
2929 status = mac->ops.read_iosf_sb_reg(hw,
2930 IXGBE_KRM_TX_COEFF_CTRL_1(hw->bus.lan_id),
2931 IXGBE_SB_IOSF_TARGET_KR_PHY, ®_val);
2932 if (status != IXGBE_SUCCESS)
2934 reg_val |= IXGBE_KRM_TX_COEFF_CTRL_1_OVRRD_EN;
2935 reg_val |= IXGBE_KRM_TX_COEFF_CTRL_1_CZERO_EN;
2936 reg_val |= IXGBE_KRM_TX_COEFF_CTRL_1_CPLUS1_OVRRD_EN;
2937 reg_val |= IXGBE_KRM_TX_COEFF_CTRL_1_CMINUS1_OVRRD_EN;
2938 status = mac->ops.write_iosf_sb_reg(hw,
2939 IXGBE_KRM_TX_COEFF_CTRL_1(hw->bus.lan_id),
2940 IXGBE_SB_IOSF_TARGET_KR_PHY, reg_val);
2945 * ixgbe_setup_ixfi_x550em - Configure the KR PHY for iXFI mode.
2946 * @hw: pointer to hardware structure
2947 * @speed: the link speed to force
2949 * Configures the integrated KR PHY to use iXFI mode. Used to connect an
2950 * internal and external PHY at a specific speed, without autonegotiation.
2952 STATIC s32 ixgbe_setup_ixfi_x550em(struct ixgbe_hw *hw, ixgbe_link_speed *speed)
2954 struct ixgbe_mac_info *mac = &hw->mac;
2958 /* iXFI is only supported with X552 */
2959 if (mac->type != ixgbe_mac_X550EM_x)
2960 return IXGBE_ERR_LINK_SETUP;
2962 /* Disable AN and force speed to 10G Serial. */
2963 status = mac->ops.read_iosf_sb_reg(hw,
2964 IXGBE_KRM_LINK_CTRL_1(hw->bus.lan_id),
2965 IXGBE_SB_IOSF_TARGET_KR_PHY, ®_val);
2966 if (status != IXGBE_SUCCESS)
2969 reg_val &= ~IXGBE_KRM_LINK_CTRL_1_TETH_AN_ENABLE;
2970 reg_val &= ~IXGBE_KRM_LINK_CTRL_1_TETH_FORCE_SPEED_MASK;
2972 /* Select forced link speed for internal PHY. */
2974 case IXGBE_LINK_SPEED_10GB_FULL:
2975 reg_val |= IXGBE_KRM_LINK_CTRL_1_TETH_FORCE_SPEED_10G;
2977 case IXGBE_LINK_SPEED_1GB_FULL:
2978 reg_val |= IXGBE_KRM_LINK_CTRL_1_TETH_FORCE_SPEED_1G;
2981 /* Other link speeds are not supported by internal KR PHY. */
2982 return IXGBE_ERR_LINK_SETUP;
2985 status = mac->ops.write_iosf_sb_reg(hw,
2986 IXGBE_KRM_LINK_CTRL_1(hw->bus.lan_id),
2987 IXGBE_SB_IOSF_TARGET_KR_PHY, reg_val);
2988 if (status != IXGBE_SUCCESS)
2991 /* Additional configuration needed for x550em_x */
2992 if (hw->mac.type == ixgbe_mac_X550EM_x) {
2993 status = ixgbe_setup_ixfi_x550em_x(hw);
2994 if (status != IXGBE_SUCCESS)
2998 /* Toggle port SW reset by AN reset. */
2999 status = ixgbe_restart_an_internal_phy_x550em(hw);
3005 * ixgbe_ext_phy_t_x550em_get_link - Get ext phy link status
3006 * @hw: address of hardware structure
3007 * @link_up: address of boolean to indicate link status
3009 * Returns error code if unable to get link status.
3011 STATIC s32 ixgbe_ext_phy_t_x550em_get_link(struct ixgbe_hw *hw, bool *link_up)
3018 /* read this twice back to back to indicate current status */
3019 ret = hw->phy.ops.read_reg(hw, IXGBE_MDIO_AUTO_NEG_STATUS,
3020 IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
3022 if (ret != IXGBE_SUCCESS)
3025 ret = hw->phy.ops.read_reg(hw, IXGBE_MDIO_AUTO_NEG_STATUS,
3026 IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
3028 if (ret != IXGBE_SUCCESS)
3031 *link_up = !!(autoneg_status & IXGBE_MDIO_AUTO_NEG_LINK_STATUS);
3033 return IXGBE_SUCCESS;
3037 * ixgbe_setup_internal_phy_t_x550em - Configure KR PHY to X557 link
3038 * @hw: point to hardware structure
3040 * Configures the link between the integrated KR PHY and the external X557 PHY
3041 * The driver will call this function when it gets a link status change
3042 * interrupt from the X557 PHY. This function configures the link speed
3043 * between the PHYs to match the link speed of the BASE-T link.
3045 * A return of a non-zero value indicates an error, and the base driver should
3046 * not report link up.
3048 s32 ixgbe_setup_internal_phy_t_x550em(struct ixgbe_hw *hw)
3050 ixgbe_link_speed force_speed;
3055 if (hw->mac.ops.get_media_type(hw) != ixgbe_media_type_copper)
3056 return IXGBE_ERR_CONFIG;
3058 if (hw->mac.type == ixgbe_mac_X550EM_x &&
3059 !(hw->phy.nw_mng_if_sel & IXGBE_NW_MNG_IF_SEL_INT_PHY_MODE)) {
3060 /* If link is down, there is no setup necessary so return */
3061 status = ixgbe_ext_phy_t_x550em_get_link(hw, &link_up);
3062 if (status != IXGBE_SUCCESS)
3066 return IXGBE_SUCCESS;
3068 status = hw->phy.ops.read_reg(hw,
3069 IXGBE_MDIO_AUTO_NEG_VENDOR_STAT,
3070 IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
3072 if (status != IXGBE_SUCCESS)
3075 /* If link is still down - no setup is required so return */
3076 status = ixgbe_ext_phy_t_x550em_get_link(hw, &link_up);
3077 if (status != IXGBE_SUCCESS)
3080 return IXGBE_SUCCESS;
3082 /* clear everything but the speed and duplex bits */
3083 speed &= IXGBE_MDIO_AUTO_NEG_VENDOR_STATUS_MASK;
3086 case IXGBE_MDIO_AUTO_NEG_VENDOR_STATUS_10GB_FULL:
3087 force_speed = IXGBE_LINK_SPEED_10GB_FULL;
3089 case IXGBE_MDIO_AUTO_NEG_VENDOR_STATUS_1GB_FULL:
3090 force_speed = IXGBE_LINK_SPEED_1GB_FULL;
3093 /* Internal PHY does not support anything else */
3094 return IXGBE_ERR_INVALID_LINK_SETTINGS;
3097 return ixgbe_setup_ixfi_x550em(hw, &force_speed);
3099 speed = IXGBE_LINK_SPEED_10GB_FULL |
3100 IXGBE_LINK_SPEED_1GB_FULL;
3101 return ixgbe_setup_kr_speed_x550em(hw, speed);
3106 * ixgbe_setup_phy_loopback_x550em - Configure the KR PHY for loopback.
3107 * @hw: pointer to hardware structure
3109 * Configures the integrated KR PHY to use internal loopback mode.
3111 s32 ixgbe_setup_phy_loopback_x550em(struct ixgbe_hw *hw)
3116 /* Disable AN and force speed to 10G Serial. */
3117 status = hw->mac.ops.read_iosf_sb_reg(hw,
3118 IXGBE_KRM_LINK_CTRL_1(hw->bus.lan_id),
3119 IXGBE_SB_IOSF_TARGET_KR_PHY, ®_val);
3120 if (status != IXGBE_SUCCESS)
3122 reg_val &= ~IXGBE_KRM_LINK_CTRL_1_TETH_AN_ENABLE;
3123 reg_val &= ~IXGBE_KRM_LINK_CTRL_1_TETH_FORCE_SPEED_MASK;
3124 reg_val |= IXGBE_KRM_LINK_CTRL_1_TETH_FORCE_SPEED_10G;
3125 status = hw->mac.ops.write_iosf_sb_reg(hw,
3126 IXGBE_KRM_LINK_CTRL_1(hw->bus.lan_id),
3127 IXGBE_SB_IOSF_TARGET_KR_PHY, reg_val);
3128 if (status != IXGBE_SUCCESS)
3131 /* Set near-end loopback clocks. */
3132 status = hw->mac.ops.read_iosf_sb_reg(hw,
3133 IXGBE_KRM_PORT_CAR_GEN_CTRL(hw->bus.lan_id),
3134 IXGBE_SB_IOSF_TARGET_KR_PHY, ®_val);
3135 if (status != IXGBE_SUCCESS)
3137 reg_val |= IXGBE_KRM_PORT_CAR_GEN_CTRL_NELB_32B;
3138 reg_val |= IXGBE_KRM_PORT_CAR_GEN_CTRL_NELB_KRPCS;
3139 status = hw->mac.ops.write_iosf_sb_reg(hw,
3140 IXGBE_KRM_PORT_CAR_GEN_CTRL(hw->bus.lan_id),
3141 IXGBE_SB_IOSF_TARGET_KR_PHY, reg_val);
3142 if (status != IXGBE_SUCCESS)
3145 /* Set loopback enable. */
3146 status = hw->mac.ops.read_iosf_sb_reg(hw,
3147 IXGBE_KRM_PMD_DFX_BURNIN(hw->bus.lan_id),
3148 IXGBE_SB_IOSF_TARGET_KR_PHY, ®_val);
3149 if (status != IXGBE_SUCCESS)
3151 reg_val |= IXGBE_KRM_PMD_DFX_BURNIN_TX_RX_KR_LB_MASK;
3152 status = hw->mac.ops.write_iosf_sb_reg(hw,
3153 IXGBE_KRM_PMD_DFX_BURNIN(hw->bus.lan_id),
3154 IXGBE_SB_IOSF_TARGET_KR_PHY, reg_val);
3155 if (status != IXGBE_SUCCESS)
3158 /* Training bypass. */
3159 status = hw->mac.ops.read_iosf_sb_reg(hw,
3160 IXGBE_KRM_RX_TRN_LINKUP_CTRL(hw->bus.lan_id),
3161 IXGBE_SB_IOSF_TARGET_KR_PHY, ®_val);
3162 if (status != IXGBE_SUCCESS)
3164 reg_val |= IXGBE_KRM_RX_TRN_LINKUP_CTRL_PROTOCOL_BYPASS;
3165 status = hw->mac.ops.write_iosf_sb_reg(hw,
3166 IXGBE_KRM_RX_TRN_LINKUP_CTRL(hw->bus.lan_id),
3167 IXGBE_SB_IOSF_TARGET_KR_PHY, reg_val);
3173 * ixgbe_read_ee_hostif_X550 - Read EEPROM word using a host interface command
3174 * assuming that the semaphore is already obtained.
3175 * @hw: pointer to hardware structure
3176 * @offset: offset of word in the EEPROM to read
3177 * @data: word read from the EEPROM
3179 * Reads a 16 bit word from the EEPROM using the hostif.
3181 s32 ixgbe_read_ee_hostif_X550(struct ixgbe_hw *hw, u16 offset, u16 *data)
3183 const u32 mask = IXGBE_GSSR_SW_MNG_SM | IXGBE_GSSR_EEP_SM;
3184 struct ixgbe_hic_read_shadow_ram buffer;
3187 DEBUGFUNC("ixgbe_read_ee_hostif_X550");
3188 buffer.hdr.req.cmd = FW_READ_SHADOW_RAM_CMD;
3189 buffer.hdr.req.buf_lenh = 0;
3190 buffer.hdr.req.buf_lenl = FW_READ_SHADOW_RAM_LEN;
3191 buffer.hdr.req.checksum = FW_DEFAULT_CHECKSUM;
3193 /* convert offset from words to bytes */
3194 buffer.address = IXGBE_CPU_TO_BE32(offset * 2);
3196 buffer.length = IXGBE_CPU_TO_BE16(sizeof(u16));
3198 status = hw->mac.ops.acquire_swfw_sync(hw, mask);
3202 status = ixgbe_hic_unlocked(hw, (u32 *)&buffer, sizeof(buffer),
3203 IXGBE_HI_COMMAND_TIMEOUT);
3205 *data = (u16)IXGBE_READ_REG_ARRAY(hw, IXGBE_FLEX_MNG,
3206 FW_NVM_DATA_OFFSET);
3209 hw->mac.ops.release_swfw_sync(hw, mask);
3214 * ixgbe_read_ee_hostif_buffer_X550- Read EEPROM word(s) using hostif
3215 * @hw: pointer to hardware structure
3216 * @offset: offset of word in the EEPROM to read
3217 * @words: number of words
3218 * @data: word(s) read from the EEPROM
3220 * Reads a 16 bit word(s) from the EEPROM using the hostif.
3222 s32 ixgbe_read_ee_hostif_buffer_X550(struct ixgbe_hw *hw,
3223 u16 offset, u16 words, u16 *data)
3225 const u32 mask = IXGBE_GSSR_SW_MNG_SM | IXGBE_GSSR_EEP_SM;
3226 struct ixgbe_hic_read_shadow_ram buffer;
3227 u32 current_word = 0;
3232 DEBUGFUNC("ixgbe_read_ee_hostif_buffer_X550");
3234 /* Take semaphore for the entire operation. */
3235 status = hw->mac.ops.acquire_swfw_sync(hw, mask);
3237 DEBUGOUT("EEPROM read buffer - semaphore failed\n");
3242 if (words > FW_MAX_READ_BUFFER_SIZE / 2)
3243 words_to_read = FW_MAX_READ_BUFFER_SIZE / 2;
3245 words_to_read = words;
3247 buffer.hdr.req.cmd = FW_READ_SHADOW_RAM_CMD;
3248 buffer.hdr.req.buf_lenh = 0;
3249 buffer.hdr.req.buf_lenl = FW_READ_SHADOW_RAM_LEN;
3250 buffer.hdr.req.checksum = FW_DEFAULT_CHECKSUM;
3252 /* convert offset from words to bytes */
3253 buffer.address = IXGBE_CPU_TO_BE32((offset + current_word) * 2);
3254 buffer.length = IXGBE_CPU_TO_BE16(words_to_read * 2);
3256 status = ixgbe_hic_unlocked(hw, (u32 *)&buffer, sizeof(buffer),
3257 IXGBE_HI_COMMAND_TIMEOUT);
3260 DEBUGOUT("Host interface command failed\n");
3264 for (i = 0; i < words_to_read; i++) {
3265 u32 reg = IXGBE_FLEX_MNG + (FW_NVM_DATA_OFFSET << 2) +
3267 u32 value = IXGBE_READ_REG(hw, reg);
3269 data[current_word] = (u16)(value & 0xffff);
3272 if (i < words_to_read) {
3274 data[current_word] = (u16)(value & 0xffff);
3278 words -= words_to_read;
3282 hw->mac.ops.release_swfw_sync(hw, mask);
3287 * ixgbe_write_ee_hostif_X550 - Write EEPROM word using hostif
3288 * @hw: pointer to hardware structure
3289 * @offset: offset of word in the EEPROM to write
3290 * @data: word write to the EEPROM
3292 * Write a 16 bit word to the EEPROM using the hostif.
3294 s32 ixgbe_write_ee_hostif_data_X550(struct ixgbe_hw *hw, u16 offset,
3298 struct ixgbe_hic_write_shadow_ram buffer;
3300 DEBUGFUNC("ixgbe_write_ee_hostif_data_X550");
3302 buffer.hdr.req.cmd = FW_WRITE_SHADOW_RAM_CMD;
3303 buffer.hdr.req.buf_lenh = 0;
3304 buffer.hdr.req.buf_lenl = FW_WRITE_SHADOW_RAM_LEN;
3305 buffer.hdr.req.checksum = FW_DEFAULT_CHECKSUM;
3308 buffer.length = IXGBE_CPU_TO_BE16(sizeof(u16));
3310 buffer.address = IXGBE_CPU_TO_BE32(offset * 2);
3312 status = ixgbe_host_interface_command(hw, (u32 *)&buffer,
3314 IXGBE_HI_COMMAND_TIMEOUT, false);
3320 * ixgbe_write_ee_hostif_X550 - Write EEPROM word using hostif
3321 * @hw: pointer to hardware structure
3322 * @offset: offset of word in the EEPROM to write
3323 * @data: word write to the EEPROM
3325 * Write a 16 bit word to the EEPROM using the hostif.
3327 s32 ixgbe_write_ee_hostif_X550(struct ixgbe_hw *hw, u16 offset,
3330 s32 status = IXGBE_SUCCESS;
3332 DEBUGFUNC("ixgbe_write_ee_hostif_X550");
3334 if (hw->mac.ops.acquire_swfw_sync(hw, IXGBE_GSSR_EEP_SM) ==
3336 status = ixgbe_write_ee_hostif_data_X550(hw, offset, data);
3337 hw->mac.ops.release_swfw_sync(hw, IXGBE_GSSR_EEP_SM);
3339 DEBUGOUT("write ee hostif failed to get semaphore");
3340 status = IXGBE_ERR_SWFW_SYNC;
3347 * ixgbe_write_ee_hostif_buffer_X550 - Write EEPROM word(s) using hostif
3348 * @hw: pointer to hardware structure
3349 * @offset: offset of word in the EEPROM to write
3350 * @words: number of words
3351 * @data: word(s) write to the EEPROM
3353 * Write a 16 bit word(s) to the EEPROM using the hostif.
3355 s32 ixgbe_write_ee_hostif_buffer_X550(struct ixgbe_hw *hw,
3356 u16 offset, u16 words, u16 *data)
3358 s32 status = IXGBE_SUCCESS;
3361 DEBUGFUNC("ixgbe_write_ee_hostif_buffer_X550");
3363 /* Take semaphore for the entire operation. */
3364 status = hw->mac.ops.acquire_swfw_sync(hw, IXGBE_GSSR_EEP_SM);
3365 if (status != IXGBE_SUCCESS) {
3366 DEBUGOUT("EEPROM write buffer - semaphore failed\n");
3370 for (i = 0; i < words; i++) {
3371 status = ixgbe_write_ee_hostif_data_X550(hw, offset + i,
3374 if (status != IXGBE_SUCCESS) {
3375 DEBUGOUT("Eeprom buffered write failed\n");
3380 hw->mac.ops.release_swfw_sync(hw, IXGBE_GSSR_EEP_SM);
3387 * ixgbe_checksum_ptr_x550 - Checksum one pointer region
3388 * @hw: pointer to hardware structure
3389 * @ptr: pointer offset in eeprom
3390 * @size: size of section pointed by ptr, if 0 first word will be used as size
3391 * @csum: address of checksum to update
3393 * Returns error status for any failure
3395 STATIC s32 ixgbe_checksum_ptr_x550(struct ixgbe_hw *hw, u16 ptr,
3396 u16 size, u16 *csum, u16 *buffer,
3401 u16 length, bufsz, i, start;
3404 bufsz = sizeof(buf) / sizeof(buf[0]);
3406 /* Read a chunk at the pointer location */
3408 status = ixgbe_read_ee_hostif_buffer_X550(hw, ptr, bufsz, buf);
3410 DEBUGOUT("Failed to read EEPROM image\n");
3415 if (buffer_size < ptr)
3416 return IXGBE_ERR_PARAM;
3417 local_buffer = &buffer[ptr];
3425 length = local_buffer[0];
3427 /* Skip pointer section if length is invalid. */
3428 if (length == 0xFFFF || length == 0 ||
3429 (ptr + length) >= hw->eeprom.word_size)
3430 return IXGBE_SUCCESS;
3433 if (buffer && ((u32)start + (u32)length > buffer_size))
3434 return IXGBE_ERR_PARAM;
3436 for (i = start; length; i++, length--) {
3437 if (i == bufsz && !buffer) {
3443 /* Read a chunk at the pointer location */
3444 status = ixgbe_read_ee_hostif_buffer_X550(hw, ptr,
3447 DEBUGOUT("Failed to read EEPROM image\n");
3451 *csum += local_buffer[i];
3453 return IXGBE_SUCCESS;
3457 * ixgbe_calc_checksum_X550 - Calculates and returns the checksum
3458 * @hw: pointer to hardware structure
3459 * @buffer: pointer to buffer containing calculated checksum
3460 * @buffer_size: size of buffer
3462 * Returns a negative error code on error, or the 16-bit checksum
3464 s32 ixgbe_calc_checksum_X550(struct ixgbe_hw *hw, u16 *buffer, u32 buffer_size)
3466 u16 eeprom_ptrs[IXGBE_EEPROM_LAST_WORD + 1];
3470 u16 pointer, i, size;
3472 DEBUGFUNC("ixgbe_calc_eeprom_checksum_X550");
3474 hw->eeprom.ops.init_params(hw);
3477 /* Read pointer area */
3478 status = ixgbe_read_ee_hostif_buffer_X550(hw, 0,
3479 IXGBE_EEPROM_LAST_WORD + 1,
3482 DEBUGOUT("Failed to read EEPROM image\n");
3485 local_buffer = eeprom_ptrs;
3487 if (buffer_size < IXGBE_EEPROM_LAST_WORD)
3488 return IXGBE_ERR_PARAM;
3489 local_buffer = buffer;
3493 * For X550 hardware include 0x0-0x41 in the checksum, skip the
3494 * checksum word itself
3496 for (i = 0; i <= IXGBE_EEPROM_LAST_WORD; i++)
3497 if (i != IXGBE_EEPROM_CHECKSUM)
3498 checksum += local_buffer[i];
3501 * Include all data from pointers 0x3, 0x6-0xE. This excludes the
3502 * FW, PHY module, and PCIe Expansion/Option ROM pointers.
3504 for (i = IXGBE_PCIE_ANALOG_PTR_X550; i < IXGBE_FW_PTR; i++) {
3505 if (i == IXGBE_PHY_PTR || i == IXGBE_OPTION_ROM_PTR)
3508 pointer = local_buffer[i];
3510 /* Skip pointer section if the pointer is invalid. */
3511 if (pointer == 0xFFFF || pointer == 0 ||
3512 pointer >= hw->eeprom.word_size)
3516 case IXGBE_PCIE_GENERAL_PTR:
3517 size = IXGBE_IXGBE_PCIE_GENERAL_SIZE;
3519 case IXGBE_PCIE_CONFIG0_PTR:
3520 case IXGBE_PCIE_CONFIG1_PTR:
3521 size = IXGBE_PCIE_CONFIG_SIZE;
3528 status = ixgbe_checksum_ptr_x550(hw, pointer, size, &checksum,
3529 buffer, buffer_size);
3534 checksum = (u16)IXGBE_EEPROM_SUM - checksum;
3536 return (s32)checksum;
3540 * ixgbe_calc_eeprom_checksum_X550 - Calculates and returns the checksum
3541 * @hw: pointer to hardware structure
3543 * Returns a negative error code on error, or the 16-bit checksum
3545 s32 ixgbe_calc_eeprom_checksum_X550(struct ixgbe_hw *hw)
3547 return ixgbe_calc_checksum_X550(hw, NULL, 0);
3551 * ixgbe_validate_eeprom_checksum_X550 - Validate EEPROM checksum
3552 * @hw: pointer to hardware structure
3553 * @checksum_val: calculated checksum
3555 * Performs checksum calculation and validates the EEPROM checksum. If the
3556 * caller does not need checksum_val, the value can be NULL.
3558 s32 ixgbe_validate_eeprom_checksum_X550(struct ixgbe_hw *hw, u16 *checksum_val)
3562 u16 read_checksum = 0;
3564 DEBUGFUNC("ixgbe_validate_eeprom_checksum_X550");
3566 /* Read the first word from the EEPROM. If this times out or fails, do
3567 * not continue or we could be in for a very long wait while every
3570 status = hw->eeprom.ops.read(hw, 0, &checksum);
3572 DEBUGOUT("EEPROM read failed\n");
3576 status = hw->eeprom.ops.calc_checksum(hw);
3580 checksum = (u16)(status & 0xffff);
3582 status = ixgbe_read_ee_hostif_X550(hw, IXGBE_EEPROM_CHECKSUM,
3587 /* Verify read checksum from EEPROM is the same as
3588 * calculated checksum
3590 if (read_checksum != checksum) {
3591 status = IXGBE_ERR_EEPROM_CHECKSUM;
3592 ERROR_REPORT1(IXGBE_ERROR_INVALID_STATE,
3593 "Invalid EEPROM checksum");
3596 /* If the user cares, return the calculated checksum */
3598 *checksum_val = checksum;
3604 * ixgbe_update_eeprom_checksum_X550 - Updates the EEPROM checksum and flash
3605 * @hw: pointer to hardware structure
3607 * After writing EEPROM to shadow RAM using EEWR register, software calculates
3608 * checksum and updates the EEPROM and instructs the hardware to update
3611 s32 ixgbe_update_eeprom_checksum_X550(struct ixgbe_hw *hw)
3616 DEBUGFUNC("ixgbe_update_eeprom_checksum_X550");
3618 /* Read the first word from the EEPROM. If this times out or fails, do
3619 * not continue or we could be in for a very long wait while every
3622 status = ixgbe_read_ee_hostif_X550(hw, 0, &checksum);
3624 DEBUGOUT("EEPROM read failed\n");
3628 status = ixgbe_calc_eeprom_checksum_X550(hw);
3632 checksum = (u16)(status & 0xffff);
3634 status = ixgbe_write_ee_hostif_X550(hw, IXGBE_EEPROM_CHECKSUM,
3639 status = ixgbe_update_flash_X550(hw);
3645 * ixgbe_update_flash_X550 - Instruct HW to copy EEPROM to Flash device
3646 * @hw: pointer to hardware structure
3648 * Issue a shadow RAM dump to FW to copy EEPROM from shadow RAM to the flash.
3650 s32 ixgbe_update_flash_X550(struct ixgbe_hw *hw)
3652 s32 status = IXGBE_SUCCESS;
3653 union ixgbe_hic_hdr2 buffer;
3655 DEBUGFUNC("ixgbe_update_flash_X550");
3657 buffer.req.cmd = FW_SHADOW_RAM_DUMP_CMD;
3658 buffer.req.buf_lenh = 0;
3659 buffer.req.buf_lenl = FW_SHADOW_RAM_DUMP_LEN;
3660 buffer.req.checksum = FW_DEFAULT_CHECKSUM;
3662 status = ixgbe_host_interface_command(hw, (u32 *)&buffer,
3664 IXGBE_HI_COMMAND_TIMEOUT, false);
3670 * ixgbe_get_supported_physical_layer_X550em - Returns physical layer type
3671 * @hw: pointer to hardware structure
3673 * Determines physical layer capabilities of the current configuration.
3675 u32 ixgbe_get_supported_physical_layer_X550em(struct ixgbe_hw *hw)
3677 u32 physical_layer = IXGBE_PHYSICAL_LAYER_UNKNOWN;
3678 u16 ext_ability = 0;
3680 DEBUGFUNC("ixgbe_get_supported_physical_layer_X550em");
3682 hw->phy.ops.identify(hw);
3684 switch (hw->phy.type) {
3685 case ixgbe_phy_x550em_kr:
3686 case ixgbe_phy_x550em_xfi:
3687 physical_layer = IXGBE_PHYSICAL_LAYER_10GBASE_KR |
3688 IXGBE_PHYSICAL_LAYER_1000BASE_KX;
3690 case ixgbe_phy_x550em_kx4:
3691 physical_layer = IXGBE_PHYSICAL_LAYER_10GBASE_KX4 |
3692 IXGBE_PHYSICAL_LAYER_1000BASE_KX;
3694 case ixgbe_phy_x550em_ext_t:
3695 hw->phy.ops.read_reg(hw, IXGBE_MDIO_PHY_EXT_ABILITY,
3696 IXGBE_MDIO_PMA_PMD_DEV_TYPE,
3698 if (ext_ability & IXGBE_MDIO_PHY_10GBASET_ABILITY)
3699 physical_layer |= IXGBE_PHYSICAL_LAYER_10GBASE_T;
3700 if (ext_ability & IXGBE_MDIO_PHY_1000BASET_ABILITY)
3701 physical_layer |= IXGBE_PHYSICAL_LAYER_1000BASE_T;
3704 if (hw->phy.speeds_supported & IXGBE_LINK_SPEED_1GB_FULL)
3705 physical_layer |= IXGBE_PHYSICAL_LAYER_1000BASE_T;
3706 if (hw->phy.speeds_supported & IXGBE_LINK_SPEED_100_FULL)
3707 physical_layer |= IXGBE_PHYSICAL_LAYER_100BASE_TX;
3708 if (hw->phy.speeds_supported & IXGBE_LINK_SPEED_10_FULL)
3709 physical_layer |= IXGBE_PHYSICAL_LAYER_10BASE_T;
3711 case ixgbe_phy_sgmii:
3712 physical_layer = IXGBE_PHYSICAL_LAYER_1000BASE_KX;
3714 case ixgbe_phy_ext_1g_t:
3715 physical_layer |= IXGBE_PHYSICAL_LAYER_1000BASE_T;
3721 if (hw->mac.ops.get_media_type(hw) == ixgbe_media_type_fiber)
3722 physical_layer = ixgbe_get_supported_phy_sfp_layer_generic(hw);
3724 return physical_layer;
3728 * ixgbe_get_bus_info_x550em - Set PCI bus info
3729 * @hw: pointer to hardware structure
3731 * Sets bus link width and speed to unknown because X550em is
3734 s32 ixgbe_get_bus_info_X550em(struct ixgbe_hw *hw)
3737 DEBUGFUNC("ixgbe_get_bus_info_x550em");
3739 hw->bus.width = ixgbe_bus_width_unknown;
3740 hw->bus.speed = ixgbe_bus_speed_unknown;
3742 hw->mac.ops.set_lan_id(hw);
3744 return IXGBE_SUCCESS;
3748 * ixgbe_disable_rx_x550 - Disable RX unit
3750 * Enables the Rx DMA unit for x550
3752 void ixgbe_disable_rx_x550(struct ixgbe_hw *hw)
3754 u32 rxctrl, pfdtxgswc;
3756 struct ixgbe_hic_disable_rxen fw_cmd;
3758 DEBUGFUNC("ixgbe_enable_rx_dma_x550");
3760 rxctrl = IXGBE_READ_REG(hw, IXGBE_RXCTRL);
3761 if (rxctrl & IXGBE_RXCTRL_RXEN) {
3762 pfdtxgswc = IXGBE_READ_REG(hw, IXGBE_PFDTXGSWC);
3763 if (pfdtxgswc & IXGBE_PFDTXGSWC_VT_LBEN) {
3764 pfdtxgswc &= ~IXGBE_PFDTXGSWC_VT_LBEN;
3765 IXGBE_WRITE_REG(hw, IXGBE_PFDTXGSWC, pfdtxgswc);
3766 hw->mac.set_lben = true;
3768 hw->mac.set_lben = false;
3771 fw_cmd.hdr.cmd = FW_DISABLE_RXEN_CMD;
3772 fw_cmd.hdr.buf_len = FW_DISABLE_RXEN_LEN;
3773 fw_cmd.hdr.checksum = FW_DEFAULT_CHECKSUM;
3774 fw_cmd.port_number = (u8)hw->bus.lan_id;
3776 status = ixgbe_host_interface_command(hw, (u32 *)&fw_cmd,
3777 sizeof(struct ixgbe_hic_disable_rxen),
3778 IXGBE_HI_COMMAND_TIMEOUT, true);
3780 /* If we fail - disable RX using register write */
3782 rxctrl = IXGBE_READ_REG(hw, IXGBE_RXCTRL);
3783 if (rxctrl & IXGBE_RXCTRL_RXEN) {
3784 rxctrl &= ~IXGBE_RXCTRL_RXEN;
3785 IXGBE_WRITE_REG(hw, IXGBE_RXCTRL, rxctrl);
3792 * ixgbe_enter_lplu_x550em - Transition to low power states
3793 * @hw: pointer to hardware structure
3795 * Configures Low Power Link Up on transition to low power states
3796 * (from D0 to non-D0). Link is required to enter LPLU so avoid resetting the
3797 * X557 PHY immediately prior to entering LPLU.
3799 s32 ixgbe_enter_lplu_t_x550em(struct ixgbe_hw *hw)
3801 u16 an_10g_cntl_reg, autoneg_reg, speed;
3803 ixgbe_link_speed lcd_speed;
3807 /* SW LPLU not required on later HW revisions. */
3808 if ((hw->mac.type == ixgbe_mac_X550EM_x) &&
3809 (IXGBE_FUSES0_REV_MASK &
3810 IXGBE_READ_REG(hw, IXGBE_FUSES0_GROUP(0))))
3811 return IXGBE_SUCCESS;
3813 /* If blocked by MNG FW, then don't restart AN */
3814 if (ixgbe_check_reset_blocked(hw))
3815 return IXGBE_SUCCESS;
3817 status = ixgbe_ext_phy_t_x550em_get_link(hw, &link_up);
3818 if (status != IXGBE_SUCCESS)
3821 status = ixgbe_read_eeprom(hw, NVM_INIT_CTRL_3, &hw->eeprom.ctrl_word_3);
3823 if (status != IXGBE_SUCCESS)
3826 /* If link is down, LPLU disabled in NVM, WoL disabled, or manageability
3827 * disabled, then force link down by entering low power mode.
3829 if (!link_up || !(hw->eeprom.ctrl_word_3 & NVM_INIT_CTRL_3_LPLU) ||
3830 !(hw->wol_enabled || ixgbe_mng_present(hw)))
3831 return ixgbe_set_copper_phy_power(hw, FALSE);
3834 status = ixgbe_get_lcd_t_x550em(hw, &lcd_speed);
3836 if (status != IXGBE_SUCCESS)
3839 /* If no valid LCD link speed, then force link down and exit. */
3840 if (lcd_speed == IXGBE_LINK_SPEED_UNKNOWN)
3841 return ixgbe_set_copper_phy_power(hw, FALSE);
3843 status = hw->phy.ops.read_reg(hw, IXGBE_MDIO_AUTO_NEG_VENDOR_STAT,
3844 IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
3847 if (status != IXGBE_SUCCESS)
3850 /* If no link now, speed is invalid so take link down */
3851 status = ixgbe_ext_phy_t_x550em_get_link(hw, &link_up);
3852 if (status != IXGBE_SUCCESS)
3853 return ixgbe_set_copper_phy_power(hw, false);
3855 /* clear everything but the speed bits */
3856 speed &= IXGBE_MDIO_AUTO_NEG_VEN_STAT_SPEED_MASK;
3858 /* If current speed is already LCD, then exit. */
3859 if (((speed == IXGBE_MDIO_AUTO_NEG_VENDOR_STATUS_1GB) &&
3860 (lcd_speed == IXGBE_LINK_SPEED_1GB_FULL)) ||
3861 ((speed == IXGBE_MDIO_AUTO_NEG_VENDOR_STATUS_10GB) &&
3862 (lcd_speed == IXGBE_LINK_SPEED_10GB_FULL)))
3865 /* Clear AN completed indication */
3866 status = hw->phy.ops.read_reg(hw, IXGBE_MDIO_AUTO_NEG_VENDOR_TX_ALARM,
3867 IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
3870 if (status != IXGBE_SUCCESS)
3873 status = hw->phy.ops.read_reg(hw, IXGBE_MII_10GBASE_T_AUTONEG_CTRL_REG,
3874 IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
3877 if (status != IXGBE_SUCCESS)
3880 status = hw->phy.ops.read_reg(hw,
3881 IXGBE_MII_AUTONEG_VENDOR_PROVISION_1_REG,
3882 IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
3885 if (status != IXGBE_SUCCESS)
3888 save_autoneg = hw->phy.autoneg_advertised;
3890 /* Setup link at least common link speed */
3891 status = hw->mac.ops.setup_link(hw, lcd_speed, false);
3893 /* restore autoneg from before setting lplu speed */
3894 hw->phy.autoneg_advertised = save_autoneg;
3900 * ixgbe_get_lcd_x550em - Determine lowest common denominator
3901 * @hw: pointer to hardware structure
3902 * @lcd_speed: pointer to lowest common link speed
3904 * Determine lowest common link speed with link partner.
3906 s32 ixgbe_get_lcd_t_x550em(struct ixgbe_hw *hw, ixgbe_link_speed *lcd_speed)
3910 u16 word = hw->eeprom.ctrl_word_3;
3912 *lcd_speed = IXGBE_LINK_SPEED_UNKNOWN;
3914 status = hw->phy.ops.read_reg(hw, IXGBE_AUTO_NEG_LP_STATUS,
3915 IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
3918 if (status != IXGBE_SUCCESS)
3921 /* If link partner advertised 1G, return 1G */
3922 if (an_lp_status & IXGBE_AUTO_NEG_LP_1000BASE_CAP) {
3923 *lcd_speed = IXGBE_LINK_SPEED_1GB_FULL;
3927 /* If 10G disabled for LPLU via NVM D10GMP, then return no valid LCD */
3928 if ((hw->bus.lan_id && (word & NVM_INIT_CTRL_3_D10GMP_PORT1)) ||
3929 (word & NVM_INIT_CTRL_3_D10GMP_PORT0))
3932 /* Link partner not capable of lower speeds, return 10G */
3933 *lcd_speed = IXGBE_LINK_SPEED_10GB_FULL;
3938 * ixgbe_setup_fc_X550em - Set up flow control
3939 * @hw: pointer to hardware structure
3941 * Called at init time to set up flow control.
3943 s32 ixgbe_setup_fc_X550em(struct ixgbe_hw *hw)
3945 s32 ret_val = IXGBE_SUCCESS;
3946 u32 pause, asm_dir, reg_val;
3948 DEBUGFUNC("ixgbe_setup_fc_X550em");
3950 /* Validate the requested mode */
3951 if (hw->fc.strict_ieee && hw->fc.requested_mode == ixgbe_fc_rx_pause) {
3952 ERROR_REPORT1(IXGBE_ERROR_UNSUPPORTED,
3953 "ixgbe_fc_rx_pause not valid in strict IEEE mode\n");
3954 ret_val = IXGBE_ERR_INVALID_LINK_SETTINGS;
3958 /* 10gig parts do not have a word in the EEPROM to determine the
3959 * default flow control setting, so we explicitly set it to full.
3961 if (hw->fc.requested_mode == ixgbe_fc_default)
3962 hw->fc.requested_mode = ixgbe_fc_full;
3964 /* Determine PAUSE and ASM_DIR bits. */
3965 switch (hw->fc.requested_mode) {
3970 case ixgbe_fc_tx_pause:
3974 case ixgbe_fc_rx_pause:
3975 /* Rx Flow control is enabled and Tx Flow control is
3976 * disabled by software override. Since there really
3977 * isn't a way to advertise that we are capable of RX
3978 * Pause ONLY, we will advertise that we support both
3979 * symmetric and asymmetric Rx PAUSE, as such we fall
3980 * through to the fc_full statement. Later, we will
3981 * disable the adapter's ability to send PAUSE frames.
3988 ERROR_REPORT1(IXGBE_ERROR_ARGUMENT,
3989 "Flow control param set incorrectly\n");
3990 ret_val = IXGBE_ERR_CONFIG;
3994 switch (hw->device_id) {
3995 case IXGBE_DEV_ID_X550EM_X_KR:
3996 case IXGBE_DEV_ID_X550EM_A_KR:
3997 case IXGBE_DEV_ID_X550EM_A_KR_L:
3998 ret_val = hw->mac.ops.read_iosf_sb_reg(hw,
3999 IXGBE_KRM_AN_CNTL_1(hw->bus.lan_id),
4000 IXGBE_SB_IOSF_TARGET_KR_PHY, ®_val);
4001 if (ret_val != IXGBE_SUCCESS)
4003 reg_val &= ~(IXGBE_KRM_AN_CNTL_1_SYM_PAUSE |
4004 IXGBE_KRM_AN_CNTL_1_ASM_PAUSE);
4006 reg_val |= IXGBE_KRM_AN_CNTL_1_SYM_PAUSE;
4008 reg_val |= IXGBE_KRM_AN_CNTL_1_ASM_PAUSE;
4009 ret_val = hw->mac.ops.write_iosf_sb_reg(hw,
4010 IXGBE_KRM_AN_CNTL_1(hw->bus.lan_id),
4011 IXGBE_SB_IOSF_TARGET_KR_PHY, reg_val);
4013 /* This device does not fully support AN. */
4014 hw->fc.disable_fc_autoneg = true;
4025 * ixgbe_fc_autoneg_backplane_x550em_a - Enable flow control IEEE clause 37
4026 * @hw: pointer to hardware structure
4028 * Enable flow control according to IEEE clause 37.
4030 void ixgbe_fc_autoneg_backplane_x550em_a(struct ixgbe_hw *hw)
4032 u32 link_s1, lp_an_page_low, an_cntl_1;
4033 s32 status = IXGBE_ERR_FC_NOT_NEGOTIATED;
4034 ixgbe_link_speed speed;
4037 /* AN should have completed when the cable was plugged in.
4038 * Look for reasons to bail out. Bail out if:
4039 * - FC autoneg is disabled, or if
4042 if (hw->fc.disable_fc_autoneg) {
4043 ERROR_REPORT1(IXGBE_ERROR_UNSUPPORTED,
4044 "Flow control autoneg is disabled");
4048 hw->mac.ops.check_link(hw, &speed, &link_up, false);
4050 ERROR_REPORT1(IXGBE_ERROR_SOFTWARE, "The link is down");
4054 /* Check at auto-negotiation has completed */
4055 status = hw->mac.ops.read_iosf_sb_reg(hw,
4056 IXGBE_KRM_LINK_S1(hw->bus.lan_id),
4057 IXGBE_SB_IOSF_TARGET_KR_PHY, &link_s1);
4059 if (status != IXGBE_SUCCESS ||
4060 (link_s1 & IXGBE_KRM_LINK_S1_MAC_AN_COMPLETE) == 0) {
4061 DEBUGOUT("Auto-Negotiation did not complete\n");
4062 status = IXGBE_ERR_FC_NOT_NEGOTIATED;
4066 /* Read the 10g AN autoc and LP ability registers and resolve
4067 * local flow control settings accordingly
4069 status = hw->mac.ops.read_iosf_sb_reg(hw,
4070 IXGBE_KRM_AN_CNTL_1(hw->bus.lan_id),
4071 IXGBE_SB_IOSF_TARGET_KR_PHY, &an_cntl_1);
4073 if (status != IXGBE_SUCCESS) {
4074 DEBUGOUT("Auto-Negotiation did not complete\n");
4078 status = hw->mac.ops.read_iosf_sb_reg(hw,
4079 IXGBE_KRM_LP_BASE_PAGE_HIGH(hw->bus.lan_id),
4080 IXGBE_SB_IOSF_TARGET_KR_PHY, &lp_an_page_low);
4082 if (status != IXGBE_SUCCESS) {
4083 DEBUGOUT("Auto-Negotiation did not complete\n");
4087 status = ixgbe_negotiate_fc(hw, an_cntl_1, lp_an_page_low,
4088 IXGBE_KRM_AN_CNTL_1_SYM_PAUSE,
4089 IXGBE_KRM_AN_CNTL_1_ASM_PAUSE,
4090 IXGBE_KRM_LP_BASE_PAGE_HIGH_SYM_PAUSE,
4091 IXGBE_KRM_LP_BASE_PAGE_HIGH_ASM_PAUSE);
4094 if (status == IXGBE_SUCCESS) {
4095 hw->fc.fc_was_autonegged = true;
4097 hw->fc.fc_was_autonegged = false;
4098 hw->fc.current_mode = hw->fc.requested_mode;
4103 * ixgbe_fc_autoneg_fiber_x550em_a - passthrough FC settings
4104 * @hw: pointer to hardware structure
4107 void ixgbe_fc_autoneg_fiber_x550em_a(struct ixgbe_hw *hw)
4109 hw->fc.fc_was_autonegged = false;
4110 hw->fc.current_mode = hw->fc.requested_mode;
4114 * ixgbe_fc_autoneg_sgmii_x550em_a - Enable flow control IEEE clause 37
4115 * @hw: pointer to hardware structure
4117 * Enable flow control according to IEEE clause 37.
4119 void ixgbe_fc_autoneg_sgmii_x550em_a(struct ixgbe_hw *hw)
4121 s32 status = IXGBE_ERR_FC_NOT_NEGOTIATED;
4122 u32 info[FW_PHY_ACT_DATA_COUNT] = { 0 };
4123 ixgbe_link_speed speed;
4126 /* AN should have completed when the cable was plugged in.
4127 * Look for reasons to bail out. Bail out if:
4128 * - FC autoneg is disabled, or if
4131 if (hw->fc.disable_fc_autoneg) {
4132 ERROR_REPORT1(IXGBE_ERROR_UNSUPPORTED,
4133 "Flow control autoneg is disabled");
4137 hw->mac.ops.check_link(hw, &speed, &link_up, false);
4139 ERROR_REPORT1(IXGBE_ERROR_SOFTWARE, "The link is down");
4143 /* Check if auto-negotiation has completed */
4144 status = ixgbe_fw_phy_activity(hw, FW_PHY_ACT_GET_LINK_INFO, &info);
4145 if (status != IXGBE_SUCCESS ||
4146 !(info[0] & FW_PHY_ACT_GET_LINK_INFO_AN_COMPLETE)) {
4147 DEBUGOUT("Auto-Negotiation did not complete\n");
4148 status = IXGBE_ERR_FC_NOT_NEGOTIATED;
4152 /* Negotiate the flow control */
4153 status = ixgbe_negotiate_fc(hw, info[0], info[0],
4154 FW_PHY_ACT_GET_LINK_INFO_FC_RX,
4155 FW_PHY_ACT_GET_LINK_INFO_FC_TX,
4156 FW_PHY_ACT_GET_LINK_INFO_LP_FC_RX,
4157 FW_PHY_ACT_GET_LINK_INFO_LP_FC_TX);
4160 if (status == IXGBE_SUCCESS) {
4161 hw->fc.fc_was_autonegged = true;
4163 hw->fc.fc_was_autonegged = false;
4164 hw->fc.current_mode = hw->fc.requested_mode;
4169 * ixgbe_setup_fc_backplane_x550em_a - Set up flow control
4170 * @hw: pointer to hardware structure
4172 * Called at init time to set up flow control.
4174 s32 ixgbe_setup_fc_backplane_x550em_a(struct ixgbe_hw *hw)
4176 s32 status = IXGBE_SUCCESS;
4179 DEBUGFUNC("ixgbe_setup_fc_backplane_x550em_a");
4181 /* Validate the requested mode */
4182 if (hw->fc.strict_ieee && hw->fc.requested_mode == ixgbe_fc_rx_pause) {
4183 ERROR_REPORT1(IXGBE_ERROR_UNSUPPORTED,
4184 "ixgbe_fc_rx_pause not valid in strict IEEE mode\n");
4185 return IXGBE_ERR_INVALID_LINK_SETTINGS;
4188 if (hw->fc.requested_mode == ixgbe_fc_default)
4189 hw->fc.requested_mode = ixgbe_fc_full;
4191 /* Set up the 1G and 10G flow control advertisement registers so the
4192 * HW will be able to do FC autoneg once the cable is plugged in. If
4193 * we link at 10G, the 1G advertisement is harmless and vice versa.
4195 status = hw->mac.ops.read_iosf_sb_reg(hw,
4196 IXGBE_KRM_AN_CNTL_1(hw->bus.lan_id),
4197 IXGBE_SB_IOSF_TARGET_KR_PHY, &an_cntl);
4199 if (status != IXGBE_SUCCESS) {
4200 DEBUGOUT("Auto-Negotiation did not complete\n");
4204 /* The possible values of fc.requested_mode are:
4205 * 0: Flow control is completely disabled
4206 * 1: Rx flow control is enabled (we can receive pause frames,
4207 * but not send pause frames).
4208 * 2: Tx flow control is enabled (we can send pause frames but
4209 * we do not support receiving pause frames).
4210 * 3: Both Rx and Tx flow control (symmetric) are enabled.
4213 switch (hw->fc.requested_mode) {
4215 /* Flow control completely disabled by software override. */
4216 an_cntl &= ~(IXGBE_KRM_AN_CNTL_1_SYM_PAUSE |
4217 IXGBE_KRM_AN_CNTL_1_ASM_PAUSE);
4219 case ixgbe_fc_tx_pause:
4220 /* Tx Flow control is enabled, and Rx Flow control is
4221 * disabled by software override.
4223 an_cntl |= IXGBE_KRM_AN_CNTL_1_ASM_PAUSE;
4224 an_cntl &= ~IXGBE_KRM_AN_CNTL_1_SYM_PAUSE;
4226 case ixgbe_fc_rx_pause:
4227 /* Rx Flow control is enabled and Tx Flow control is
4228 * disabled by software override. Since there really
4229 * isn't a way to advertise that we are capable of RX
4230 * Pause ONLY, we will advertise that we support both
4231 * symmetric and asymmetric Rx PAUSE, as such we fall
4232 * through to the fc_full statement. Later, we will
4233 * disable the adapter's ability to send PAUSE frames.
4236 /* Flow control (both Rx and Tx) is enabled by SW override. */
4237 an_cntl |= IXGBE_KRM_AN_CNTL_1_SYM_PAUSE |
4238 IXGBE_KRM_AN_CNTL_1_ASM_PAUSE;
4241 ERROR_REPORT1(IXGBE_ERROR_ARGUMENT,
4242 "Flow control param set incorrectly\n");
4243 return IXGBE_ERR_CONFIG;
4246 status = hw->mac.ops.write_iosf_sb_reg(hw,
4247 IXGBE_KRM_AN_CNTL_1(hw->bus.lan_id),
4248 IXGBE_SB_IOSF_TARGET_KR_PHY, an_cntl);
4250 /* Restart auto-negotiation. */
4251 status = ixgbe_restart_an_internal_phy_x550em(hw);
4257 * ixgbe_set_mux - Set mux for port 1 access with CS4227
4258 * @hw: pointer to hardware structure
4259 * @state: set mux if 1, clear if 0
4261 STATIC void ixgbe_set_mux(struct ixgbe_hw *hw, u8 state)
4265 if (!hw->bus.lan_id)
4267 esdp = IXGBE_READ_REG(hw, IXGBE_ESDP);
4269 esdp |= IXGBE_ESDP_SDP1;
4271 esdp &= ~IXGBE_ESDP_SDP1;
4272 IXGBE_WRITE_REG(hw, IXGBE_ESDP, esdp);
4273 IXGBE_WRITE_FLUSH(hw);
4277 * ixgbe_acquire_swfw_sync_X550em - Acquire SWFW semaphore
4278 * @hw: pointer to hardware structure
4279 * @mask: Mask to specify which semaphore to acquire
4281 * Acquires the SWFW semaphore and sets the I2C MUX
4283 s32 ixgbe_acquire_swfw_sync_X550em(struct ixgbe_hw *hw, u32 mask)
4287 DEBUGFUNC("ixgbe_acquire_swfw_sync_X550em");
4289 status = ixgbe_acquire_swfw_sync_X540(hw, mask);
4293 if (mask & IXGBE_GSSR_I2C_MASK)
4294 ixgbe_set_mux(hw, 1);
4296 return IXGBE_SUCCESS;
4300 * ixgbe_release_swfw_sync_X550em - Release SWFW semaphore
4301 * @hw: pointer to hardware structure
4302 * @mask: Mask to specify which semaphore to release
4304 * Releases the SWFW semaphore and sets the I2C MUX
4306 void ixgbe_release_swfw_sync_X550em(struct ixgbe_hw *hw, u32 mask)
4308 DEBUGFUNC("ixgbe_release_swfw_sync_X550em");
4310 if (mask & IXGBE_GSSR_I2C_MASK)
4311 ixgbe_set_mux(hw, 0);
4313 ixgbe_release_swfw_sync_X540(hw, mask);
4317 * ixgbe_acquire_swfw_sync_X550a - Acquire SWFW semaphore
4318 * @hw: pointer to hardware structure
4319 * @mask: Mask to specify which semaphore to acquire
4321 * Acquires the SWFW semaphore and get the shared phy token as needed
4323 STATIC s32 ixgbe_acquire_swfw_sync_X550a(struct ixgbe_hw *hw, u32 mask)
4325 u32 hmask = mask & ~IXGBE_GSSR_TOKEN_SM;
4326 int retries = FW_PHY_TOKEN_RETRIES;
4327 s32 status = IXGBE_SUCCESS;
4329 DEBUGFUNC("ixgbe_acquire_swfw_sync_X550a");
4332 status = IXGBE_SUCCESS;
4334 status = ixgbe_acquire_swfw_sync_X540(hw, hmask);
4337 if (!(mask & IXGBE_GSSR_TOKEN_SM))
4338 return IXGBE_SUCCESS;
4340 status = ixgbe_get_phy_token(hw);
4341 if (status == IXGBE_SUCCESS)
4342 return IXGBE_SUCCESS;
4345 ixgbe_release_swfw_sync_X540(hw, hmask);
4346 if (status != IXGBE_ERR_TOKEN_RETRY)
4354 * ixgbe_release_swfw_sync_X550a - Release SWFW semaphore
4355 * @hw: pointer to hardware structure
4356 * @mask: Mask to specify which semaphore to release
4358 * Releases the SWFW semaphore and puts the shared phy token as needed
4360 STATIC void ixgbe_release_swfw_sync_X550a(struct ixgbe_hw *hw, u32 mask)
4362 u32 hmask = mask & ~IXGBE_GSSR_TOKEN_SM;
4364 DEBUGFUNC("ixgbe_release_swfw_sync_X550a");
4366 if (mask & IXGBE_GSSR_TOKEN_SM)
4367 ixgbe_put_phy_token(hw);
4370 ixgbe_release_swfw_sync_X540(hw, hmask);
4374 * ixgbe_read_phy_reg_x550a - Reads specified PHY register
4375 * @hw: pointer to hardware structure
4376 * @reg_addr: 32 bit address of PHY register to read
4377 * @phy_data: Pointer to read data from PHY register
4379 * Reads a value from a specified PHY register using the SWFW lock and PHY
4380 * Token. The PHY Token is needed since the MDIO is shared between to MAC
4383 s32 ixgbe_read_phy_reg_x550a(struct ixgbe_hw *hw, u32 reg_addr,
4384 u32 device_type, u16 *phy_data)
4387 u32 mask = hw->phy.phy_semaphore_mask | IXGBE_GSSR_TOKEN_SM;
4389 DEBUGFUNC("ixgbe_read_phy_reg_x550a");
4391 if (hw->mac.ops.acquire_swfw_sync(hw, mask))
4392 return IXGBE_ERR_SWFW_SYNC;
4394 status = hw->phy.ops.read_reg_mdi(hw, reg_addr, device_type, phy_data);
4396 hw->mac.ops.release_swfw_sync(hw, mask);
4402 * ixgbe_write_phy_reg_x550a - Writes specified PHY register
4403 * @hw: pointer to hardware structure
4404 * @reg_addr: 32 bit PHY register to write
4405 * @device_type: 5 bit device type
4406 * @phy_data: Data to write to the PHY register
4408 * Writes a value to specified PHY register using the SWFW lock and PHY Token.
4409 * The PHY Token is needed since the MDIO is shared between to MAC instances.
4411 s32 ixgbe_write_phy_reg_x550a(struct ixgbe_hw *hw, u32 reg_addr,
4412 u32 device_type, u16 phy_data)
4415 u32 mask = hw->phy.phy_semaphore_mask | IXGBE_GSSR_TOKEN_SM;
4417 DEBUGFUNC("ixgbe_write_phy_reg_x550a");
4419 if (hw->mac.ops.acquire_swfw_sync(hw, mask) == IXGBE_SUCCESS) {
4420 status = hw->phy.ops.write_reg_mdi(hw, reg_addr, device_type,
4422 hw->mac.ops.release_swfw_sync(hw, mask);
4424 status = IXGBE_ERR_SWFW_SYNC;
4431 * ixgbe_handle_lasi_ext_t_x550em - Handle external Base T PHY interrupt
4432 * @hw: pointer to hardware structure
4434 * Handle external Base T PHY interrupt. If high temperature
4435 * failure alarm then return error, else if link status change
4436 * then setup internal/external PHY link
4438 * Return IXGBE_ERR_OVERTEMP if interrupt is high temperature
4439 * failure alarm, else return PHY access status.
4441 s32 ixgbe_handle_lasi_ext_t_x550em(struct ixgbe_hw *hw)
4446 status = ixgbe_get_lasi_ext_t_x550em(hw, &lsc);
4448 if (status != IXGBE_SUCCESS)
4452 return ixgbe_setup_internal_phy(hw);
4454 return IXGBE_SUCCESS;
4458 * ixgbe_setup_mac_link_t_X550em - Sets the auto advertised link speed
4459 * @hw: pointer to hardware structure
4460 * @speed: new link speed
4461 * @autoneg_wait_to_complete: true when waiting for completion is needed
4463 * Setup internal/external PHY link speed based on link speed, then set
4464 * external PHY auto advertised link speed.
4466 * Returns error status for any failure
4468 s32 ixgbe_setup_mac_link_t_X550em(struct ixgbe_hw *hw,
4469 ixgbe_link_speed speed,
4470 bool autoneg_wait_to_complete)
4473 ixgbe_link_speed force_speed;
4475 DEBUGFUNC("ixgbe_setup_mac_link_t_X550em");
4477 /* Setup internal/external PHY link speed to iXFI (10G), unless
4478 * only 1G is auto advertised then setup KX link.
4480 if (speed & IXGBE_LINK_SPEED_10GB_FULL)
4481 force_speed = IXGBE_LINK_SPEED_10GB_FULL;
4483 force_speed = IXGBE_LINK_SPEED_1GB_FULL;
4485 /* If X552 and internal link mode is XFI, then setup XFI internal link.
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);
4491 if (status != IXGBE_SUCCESS)
4495 return hw->phy.ops.setup_link_speed(hw, speed, autoneg_wait_to_complete);
4499 * ixgbe_check_link_t_X550em - Determine link and speed status
4500 * @hw: pointer to hardware structure
4501 * @speed: pointer to link speed
4502 * @link_up: true when link is up
4503 * @link_up_wait_to_complete: bool used to wait for link up or not
4505 * Check that both the MAC and X557 external PHY have link.
4507 s32 ixgbe_check_link_t_X550em(struct ixgbe_hw *hw, ixgbe_link_speed *speed,
4508 bool *link_up, bool link_up_wait_to_complete)
4511 u16 i, autoneg_status = 0;
4513 if (hw->mac.ops.get_media_type(hw) != ixgbe_media_type_copper)
4514 return IXGBE_ERR_CONFIG;
4516 status = ixgbe_check_mac_link_generic(hw, speed, link_up,
4517 link_up_wait_to_complete);
4519 /* If check link fails or MAC link is not up, then return */
4520 if (status != IXGBE_SUCCESS || !(*link_up))
4523 /* MAC link is up, so check external PHY link.
4524 * X557 PHY. Link status is latching low, and can only be used to detect
4525 * link drop, and not the current status of the link without performing
4526 * back-to-back reads.
4528 for (i = 0; i < 2; i++) {
4529 status = hw->phy.ops.read_reg(hw, IXGBE_MDIO_AUTO_NEG_STATUS,
4530 IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
4533 if (status != IXGBE_SUCCESS)
4537 /* If external PHY link is not up, then indicate link not up */
4538 if (!(autoneg_status & IXGBE_MDIO_AUTO_NEG_LINK_STATUS))
4541 return IXGBE_SUCCESS;
4545 * ixgbe_reset_phy_t_X550em - Performs X557 PHY reset and enables LASI
4546 * @hw: pointer to hardware structure
4548 s32 ixgbe_reset_phy_t_X550em(struct ixgbe_hw *hw)
4552 status = ixgbe_reset_phy_generic(hw);
4554 if (status != IXGBE_SUCCESS)
4557 /* Configure Link Status Alarm and Temperature Threshold interrupts */
4558 return ixgbe_enable_lasi_ext_t_x550em(hw);
4562 * ixgbe_led_on_t_X550em - Turns on the software controllable LEDs.
4563 * @hw: pointer to hardware structure
4564 * @led_idx: led number to turn on
4566 s32 ixgbe_led_on_t_X550em(struct ixgbe_hw *hw, u32 led_idx)
4570 DEBUGFUNC("ixgbe_led_on_t_X550em");
4572 if (led_idx >= IXGBE_X557_MAX_LED_INDEX)
4573 return IXGBE_ERR_PARAM;
4575 /* To turn on the LED, set mode to ON. */
4576 ixgbe_read_phy_reg(hw, IXGBE_X557_LED_PROVISIONING + led_idx,
4577 IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE, &phy_data);
4578 phy_data |= IXGBE_X557_LED_MANUAL_SET_MASK;
4579 ixgbe_write_phy_reg(hw, IXGBE_X557_LED_PROVISIONING + led_idx,
4580 IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE, phy_data);
4582 return IXGBE_SUCCESS;
4586 * ixgbe_led_off_t_X550em - Turns off the software controllable LEDs.
4587 * @hw: pointer to hardware structure
4588 * @led_idx: led number to turn off
4590 s32 ixgbe_led_off_t_X550em(struct ixgbe_hw *hw, u32 led_idx)
4594 DEBUGFUNC("ixgbe_led_off_t_X550em");
4596 if (led_idx >= IXGBE_X557_MAX_LED_INDEX)
4597 return IXGBE_ERR_PARAM;
4599 /* To turn on the LED, set mode to ON. */
4600 ixgbe_read_phy_reg(hw, IXGBE_X557_LED_PROVISIONING + led_idx,
4601 IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE, &phy_data);
4602 phy_data &= ~IXGBE_X557_LED_MANUAL_SET_MASK;
4603 ixgbe_write_phy_reg(hw, IXGBE_X557_LED_PROVISIONING + led_idx,
4604 IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE, phy_data);
4606 return IXGBE_SUCCESS;
4610 * ixgbe_set_fw_drv_ver_x550 - Sends driver version to firmware
4611 * @hw: pointer to the HW structure
4612 * @maj: driver version major number
4613 * @min: driver version minor number
4614 * @build: driver version build number
4615 * @sub: driver version sub build number
4616 * @len: length of driver_ver string
4617 * @driver_ver: driver string
4619 * Sends driver version number to firmware through the manageability
4620 * block. On success return IXGBE_SUCCESS
4621 * else returns IXGBE_ERR_SWFW_SYNC when encountering an error acquiring
4622 * semaphore or IXGBE_ERR_HOST_INTERFACE_COMMAND when command fails.
4624 s32 ixgbe_set_fw_drv_ver_x550(struct ixgbe_hw *hw, u8 maj, u8 min,
4625 u8 build, u8 sub, u16 len, const char *driver_ver)
4627 struct ixgbe_hic_drv_info2 fw_cmd;
4628 s32 ret_val = IXGBE_SUCCESS;
4631 DEBUGFUNC("ixgbe_set_fw_drv_ver_x550");
4633 if ((len == 0) || (driver_ver == NULL) ||
4634 (len > sizeof(fw_cmd.driver_string)))
4635 return IXGBE_ERR_INVALID_ARGUMENT;
4637 fw_cmd.hdr.cmd = FW_CEM_CMD_DRIVER_INFO;
4638 fw_cmd.hdr.buf_len = FW_CEM_CMD_DRIVER_INFO_LEN + len;
4639 fw_cmd.hdr.cmd_or_resp.cmd_resv = FW_CEM_CMD_RESERVED;
4640 fw_cmd.port_num = (u8)hw->bus.func;
4641 fw_cmd.ver_maj = maj;
4642 fw_cmd.ver_min = min;
4643 fw_cmd.ver_build = build;
4644 fw_cmd.ver_sub = sub;
4645 fw_cmd.hdr.checksum = 0;
4646 memcpy(fw_cmd.driver_string, driver_ver, len);
4647 fw_cmd.hdr.checksum = ixgbe_calculate_checksum((u8 *)&fw_cmd,
4648 (FW_CEM_HDR_LEN + fw_cmd.hdr.buf_len));
4650 for (i = 0; i <= FW_CEM_MAX_RETRIES; i++) {
4651 ret_val = ixgbe_host_interface_command(hw, (u32 *)&fw_cmd,
4653 IXGBE_HI_COMMAND_TIMEOUT,
4655 if (ret_val != IXGBE_SUCCESS)
4658 if (fw_cmd.hdr.cmd_or_resp.ret_status ==
4659 FW_CEM_RESP_STATUS_SUCCESS)
4660 ret_val = IXGBE_SUCCESS;
4662 ret_val = IXGBE_ERR_HOST_INTERFACE_COMMAND;