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_api.h"
35 #include "ixgbe_common.h"
36 #include "ixgbe_phy.h"
38 STATIC void ixgbe_i2c_start(struct ixgbe_hw *hw);
39 STATIC void ixgbe_i2c_stop(struct ixgbe_hw *hw);
40 STATIC s32 ixgbe_clock_in_i2c_byte(struct ixgbe_hw *hw, u8 *data);
41 STATIC s32 ixgbe_clock_out_i2c_byte(struct ixgbe_hw *hw, u8 data);
42 STATIC s32 ixgbe_get_i2c_ack(struct ixgbe_hw *hw);
43 STATIC s32 ixgbe_clock_in_i2c_bit(struct ixgbe_hw *hw, bool *data);
44 STATIC s32 ixgbe_clock_out_i2c_bit(struct ixgbe_hw *hw, bool data);
45 STATIC void ixgbe_raise_i2c_clk(struct ixgbe_hw *hw, u32 *i2cctl);
46 STATIC void ixgbe_lower_i2c_clk(struct ixgbe_hw *hw, u32 *i2cctl);
47 STATIC s32 ixgbe_set_i2c_data(struct ixgbe_hw *hw, u32 *i2cctl, bool data);
48 STATIC bool ixgbe_get_i2c_data(struct ixgbe_hw *hw, u32 *i2cctl);
49 STATIC s32 ixgbe_read_i2c_sff8472_generic(struct ixgbe_hw *hw, u8 byte_offset,
53 * ixgbe_out_i2c_byte_ack - Send I2C byte with ack
54 * @hw: pointer to the hardware structure
57 * Returns an error code on error.
59 STATIC s32 ixgbe_out_i2c_byte_ack(struct ixgbe_hw *hw, u8 byte)
63 status = ixgbe_clock_out_i2c_byte(hw, byte);
66 return ixgbe_get_i2c_ack(hw);
70 * ixgbe_in_i2c_byte_ack - Receive an I2C byte and send ack
71 * @hw: pointer to the hardware structure
72 * @byte: pointer to a u8 to receive the byte
74 * Returns an error code on error.
76 STATIC s32 ixgbe_in_i2c_byte_ack(struct ixgbe_hw *hw, u8 *byte)
80 status = ixgbe_clock_in_i2c_byte(hw, byte);
84 return ixgbe_clock_out_i2c_bit(hw, false);
88 * ixgbe_ones_comp_byte_add - Perform one's complement addition
92 * Returns one's complement 8-bit sum.
94 STATIC u8 ixgbe_ones_comp_byte_add(u8 add1, u8 add2)
96 u16 sum = add1 + add2;
98 sum = (sum & 0xFF) + (sum >> 8);
103 * ixgbe_read_i2c_combined_generic_int - Perform I2C read combined operation
104 * @hw: pointer to the hardware structure
105 * @addr: I2C bus address to read from
106 * @reg: I2C device register to read from
107 * @val: pointer to location to receive read value
108 * @lock: true if to take and release semaphore
110 * Returns an error code on error.
112 s32 ixgbe_read_i2c_combined_generic_int(struct ixgbe_hw *hw, u8 addr, u16 reg,
115 u32 swfw_mask = hw->phy.phy_semaphore_mask;
124 reg_high = ((reg >> 7) & 0xFE) | 1; /* Indicate read combined */
125 csum = ixgbe_ones_comp_byte_add(reg_high, reg & 0xFF);
128 if (lock && hw->mac.ops.acquire_swfw_sync(hw, swfw_mask))
129 return IXGBE_ERR_SWFW_SYNC;
131 /* Device Address and write indication */
132 if (ixgbe_out_i2c_byte_ack(hw, addr))
134 /* Write bits 14:8 */
135 if (ixgbe_out_i2c_byte_ack(hw, reg_high))
138 if (ixgbe_out_i2c_byte_ack(hw, reg & 0xFF))
141 if (ixgbe_out_i2c_byte_ack(hw, csum))
143 /* Re-start condition */
145 /* Device Address and read indication */
146 if (ixgbe_out_i2c_byte_ack(hw, addr | 1))
149 if (ixgbe_in_i2c_byte_ack(hw, &high_bits))
152 if (ixgbe_in_i2c_byte_ack(hw, &low_bits))
155 if (ixgbe_clock_in_i2c_byte(hw, &csum_byte))
158 if (ixgbe_clock_out_i2c_bit(hw, false))
162 hw->mac.ops.release_swfw_sync(hw, swfw_mask);
163 *val = (high_bits << 8) | low_bits;
167 ixgbe_i2c_bus_clear(hw);
169 hw->mac.ops.release_swfw_sync(hw, swfw_mask);
171 if (retry < max_retry)
172 DEBUGOUT("I2C byte read combined error - Retrying.\n");
174 DEBUGOUT("I2C byte read combined error.\n");
175 } while (retry < max_retry);
177 return IXGBE_ERR_I2C;
181 * ixgbe_write_i2c_combined_generic_int - Perform I2C write combined operation
182 * @hw: pointer to the hardware structure
183 * @addr: I2C bus address to write to
184 * @reg: I2C device register to write to
185 * @val: value to write
186 * @lock: true if to take and release semaphore
188 * Returns an error code on error.
190 s32 ixgbe_write_i2c_combined_generic_int(struct ixgbe_hw *hw, u8 addr, u16 reg,
193 u32 swfw_mask = hw->phy.phy_semaphore_mask;
199 reg_high = (reg >> 7) & 0xFE; /* Indicate write combined */
200 csum = ixgbe_ones_comp_byte_add(reg_high, reg & 0xFF);
201 csum = ixgbe_ones_comp_byte_add(csum, val >> 8);
202 csum = ixgbe_ones_comp_byte_add(csum, val & 0xFF);
205 if (lock && hw->mac.ops.acquire_swfw_sync(hw, swfw_mask))
206 return IXGBE_ERR_SWFW_SYNC;
208 /* Device Address and write indication */
209 if (ixgbe_out_i2c_byte_ack(hw, addr))
211 /* Write bits 14:8 */
212 if (ixgbe_out_i2c_byte_ack(hw, reg_high))
215 if (ixgbe_out_i2c_byte_ack(hw, reg & 0xFF))
217 /* Write data 15:8 */
218 if (ixgbe_out_i2c_byte_ack(hw, val >> 8))
221 if (ixgbe_out_i2c_byte_ack(hw, val & 0xFF))
224 if (ixgbe_out_i2c_byte_ack(hw, csum))
228 hw->mac.ops.release_swfw_sync(hw, swfw_mask);
232 ixgbe_i2c_bus_clear(hw);
234 hw->mac.ops.release_swfw_sync(hw, swfw_mask);
236 if (retry < max_retry)
237 DEBUGOUT("I2C byte write combined error - Retrying.\n");
239 DEBUGOUT("I2C byte write combined error.\n");
240 } while (retry < max_retry);
242 return IXGBE_ERR_I2C;
246 * ixgbe_init_phy_ops_generic - Inits PHY function ptrs
247 * @hw: pointer to the hardware structure
249 * Initialize the function pointers.
251 s32 ixgbe_init_phy_ops_generic(struct ixgbe_hw *hw)
253 struct ixgbe_phy_info *phy = &hw->phy;
255 DEBUGFUNC("ixgbe_init_phy_ops_generic");
258 phy->ops.identify = ixgbe_identify_phy_generic;
259 phy->ops.reset = ixgbe_reset_phy_generic;
260 phy->ops.read_reg = ixgbe_read_phy_reg_generic;
261 phy->ops.write_reg = ixgbe_write_phy_reg_generic;
262 phy->ops.read_reg_mdi = ixgbe_read_phy_reg_mdi;
263 phy->ops.write_reg_mdi = ixgbe_write_phy_reg_mdi;
264 phy->ops.setup_link = ixgbe_setup_phy_link_generic;
265 phy->ops.setup_link_speed = ixgbe_setup_phy_link_speed_generic;
266 phy->ops.check_link = NULL;
267 phy->ops.get_firmware_version = ixgbe_get_phy_firmware_version_generic;
268 phy->ops.read_i2c_byte = ixgbe_read_i2c_byte_generic;
269 phy->ops.write_i2c_byte = ixgbe_write_i2c_byte_generic;
270 phy->ops.read_i2c_sff8472 = ixgbe_read_i2c_sff8472_generic;
271 phy->ops.read_i2c_eeprom = ixgbe_read_i2c_eeprom_generic;
272 phy->ops.write_i2c_eeprom = ixgbe_write_i2c_eeprom_generic;
273 phy->ops.i2c_bus_clear = ixgbe_i2c_bus_clear;
274 phy->ops.identify_sfp = ixgbe_identify_module_generic;
275 phy->sfp_type = ixgbe_sfp_type_unknown;
276 phy->ops.read_i2c_byte_unlocked = ixgbe_read_i2c_byte_generic_unlocked;
277 phy->ops.write_i2c_byte_unlocked =
278 ixgbe_write_i2c_byte_generic_unlocked;
279 phy->ops.check_overtemp = ixgbe_tn_check_overtemp;
280 return IXGBE_SUCCESS;
284 * ixgbe_probe_phy - Probe a single address for a PHY
285 * @hw: pointer to hardware structure
286 * @phy_addr: PHY address to probe
288 * Returns true if PHY found
290 static bool ixgbe_probe_phy(struct ixgbe_hw *hw, u16 phy_addr)
294 if (!ixgbe_validate_phy_addr(hw, phy_addr))
297 if (ixgbe_get_phy_id(hw))
300 hw->phy.type = ixgbe_get_phy_type_from_id(hw->phy.id);
302 if (hw->phy.type == ixgbe_phy_unknown) {
303 hw->phy.ops.read_reg(hw, IXGBE_MDIO_PHY_EXT_ABILITY,
304 IXGBE_MDIO_PMA_PMD_DEV_TYPE, &ext_ability);
306 (IXGBE_MDIO_PHY_10GBASET_ABILITY |
307 IXGBE_MDIO_PHY_1000BASET_ABILITY))
308 hw->phy.type = ixgbe_phy_cu_unknown;
310 hw->phy.type = ixgbe_phy_generic;
317 * ixgbe_identify_phy_generic - Get physical layer module
318 * @hw: pointer to hardware structure
320 * Determines the physical layer module found on the current adapter.
322 s32 ixgbe_identify_phy_generic(struct ixgbe_hw *hw)
324 s32 status = IXGBE_ERR_PHY_ADDR_INVALID;
327 DEBUGFUNC("ixgbe_identify_phy_generic");
329 if (!hw->phy.phy_semaphore_mask) {
331 hw->phy.phy_semaphore_mask = IXGBE_GSSR_PHY1_SM;
333 hw->phy.phy_semaphore_mask = IXGBE_GSSR_PHY0_SM;
336 if (hw->phy.type != ixgbe_phy_unknown)
337 return IXGBE_SUCCESS;
339 if (hw->phy.nw_mng_if_sel) {
340 phy_addr = (hw->phy.nw_mng_if_sel &
341 IXGBE_NW_MNG_IF_SEL_MDIO_PHY_ADD) >>
342 IXGBE_NW_MNG_IF_SEL_MDIO_PHY_ADD_SHIFT;
343 if (ixgbe_probe_phy(hw, phy_addr))
344 return IXGBE_SUCCESS;
346 return IXGBE_ERR_PHY_ADDR_INVALID;
349 for (phy_addr = 0; phy_addr < IXGBE_MAX_PHY_ADDR; phy_addr++) {
350 if (ixgbe_probe_phy(hw, phy_addr)) {
351 status = IXGBE_SUCCESS;
356 /* Certain media types do not have a phy so an address will not
357 * be found and the code will take this path. Caller has to
358 * decide if it is an error or not.
360 if (status != IXGBE_SUCCESS)
367 * ixgbe_check_reset_blocked - check status of MNG FW veto bit
368 * @hw: pointer to the hardware structure
370 * This function checks the MMNGC.MNG_VETO bit to see if there are
371 * any constraints on link from manageability. For MAC's that don't
372 * have this bit just return faluse since the link can not be blocked
375 s32 ixgbe_check_reset_blocked(struct ixgbe_hw *hw)
379 DEBUGFUNC("ixgbe_check_reset_blocked");
381 /* If we don't have this bit, it can't be blocking */
382 if (hw->mac.type == ixgbe_mac_82598EB)
385 mmngc = IXGBE_READ_REG(hw, IXGBE_MMNGC);
386 if (mmngc & IXGBE_MMNGC_MNG_VETO) {
387 ERROR_REPORT1(IXGBE_ERROR_SOFTWARE,
388 "MNG_VETO bit detected.\n");
396 * ixgbe_validate_phy_addr - Determines phy address is valid
397 * @hw: pointer to hardware structure
400 bool ixgbe_validate_phy_addr(struct ixgbe_hw *hw, u32 phy_addr)
405 DEBUGFUNC("ixgbe_validate_phy_addr");
407 hw->phy.addr = phy_addr;
408 hw->phy.ops.read_reg(hw, IXGBE_MDIO_PHY_ID_HIGH,
409 IXGBE_MDIO_PMA_PMD_DEV_TYPE, &phy_id);
411 if (phy_id != 0xFFFF && phy_id != 0x0)
418 * ixgbe_get_phy_id - Get the phy type
419 * @hw: pointer to hardware structure
422 s32 ixgbe_get_phy_id(struct ixgbe_hw *hw)
428 DEBUGFUNC("ixgbe_get_phy_id");
430 status = hw->phy.ops.read_reg(hw, IXGBE_MDIO_PHY_ID_HIGH,
431 IXGBE_MDIO_PMA_PMD_DEV_TYPE,
434 if (status == IXGBE_SUCCESS) {
435 hw->phy.id = (u32)(phy_id_high << 16);
436 status = hw->phy.ops.read_reg(hw, IXGBE_MDIO_PHY_ID_LOW,
437 IXGBE_MDIO_PMA_PMD_DEV_TYPE,
439 hw->phy.id |= (u32)(phy_id_low & IXGBE_PHY_REVISION_MASK);
440 hw->phy.revision = (u32)(phy_id_low & ~IXGBE_PHY_REVISION_MASK);
446 * ixgbe_get_phy_type_from_id - Get the phy type
447 * @phy_id: PHY ID information
450 enum ixgbe_phy_type ixgbe_get_phy_type_from_id(u32 phy_id)
452 enum ixgbe_phy_type phy_type;
454 DEBUGFUNC("ixgbe_get_phy_type_from_id");
458 phy_type = ixgbe_phy_tn;
463 phy_type = ixgbe_phy_aq;
466 phy_type = ixgbe_phy_qt;
469 phy_type = ixgbe_phy_nl;
473 phy_type = ixgbe_phy_x550em_ext_t;
476 phy_type = ixgbe_phy_unknown;
483 * ixgbe_reset_phy_generic - Performs a PHY reset
484 * @hw: pointer to hardware structure
486 s32 ixgbe_reset_phy_generic(struct ixgbe_hw *hw)
490 s32 status = IXGBE_SUCCESS;
492 DEBUGFUNC("ixgbe_reset_phy_generic");
494 if (hw->phy.type == ixgbe_phy_unknown)
495 status = ixgbe_identify_phy_generic(hw);
497 if (status != IXGBE_SUCCESS || hw->phy.type == ixgbe_phy_none)
500 /* Don't reset PHY if it's shut down due to overtemp. */
501 if (!hw->phy.reset_if_overtemp &&
502 (IXGBE_ERR_OVERTEMP == hw->phy.ops.check_overtemp(hw)))
505 /* Blocked by MNG FW so bail */
506 if (ixgbe_check_reset_blocked(hw))
510 * Perform soft PHY reset to the PHY_XS.
511 * This will cause a soft reset to the PHY
513 hw->phy.ops.write_reg(hw, IXGBE_MDIO_PHY_XS_CONTROL,
514 IXGBE_MDIO_PHY_XS_DEV_TYPE,
515 IXGBE_MDIO_PHY_XS_RESET);
518 * Poll for reset bit to self-clear indicating reset is complete.
519 * Some PHYs could take up to 3 seconds to complete and need about
520 * 1.7 usec delay after the reset is complete.
522 for (i = 0; i < 30; i++) {
524 if (hw->phy.type == ixgbe_phy_x550em_ext_t) {
525 status = hw->phy.ops.read_reg(hw,
526 IXGBE_MDIO_TX_VENDOR_ALARMS_3,
527 IXGBE_MDIO_PMA_PMD_DEV_TYPE,
529 if (status != IXGBE_SUCCESS)
532 if (ctrl & IXGBE_MDIO_TX_VENDOR_ALARMS_3_RST_MASK) {
537 status = hw->phy.ops.read_reg(hw,
538 IXGBE_MDIO_PHY_XS_CONTROL,
539 IXGBE_MDIO_PHY_XS_DEV_TYPE,
541 if (status != IXGBE_SUCCESS)
544 if (!(ctrl & IXGBE_MDIO_PHY_XS_RESET)) {
551 if (ctrl & IXGBE_MDIO_PHY_XS_RESET) {
552 status = IXGBE_ERR_RESET_FAILED;
553 ERROR_REPORT1(IXGBE_ERROR_POLLING,
554 "PHY reset polling failed to complete.\n");
562 * ixgbe_read_phy_mdi - Reads a value from a specified PHY register without
564 * @hw: pointer to hardware structure
565 * @reg_addr: 32 bit address of PHY register to read
566 * @phy_data: Pointer to read data from PHY register
568 s32 ixgbe_read_phy_reg_mdi(struct ixgbe_hw *hw, u32 reg_addr, u32 device_type,
571 u32 i, data, command;
573 /* Setup and write the address cycle command */
574 command = ((reg_addr << IXGBE_MSCA_NP_ADDR_SHIFT) |
575 (device_type << IXGBE_MSCA_DEV_TYPE_SHIFT) |
576 (hw->phy.addr << IXGBE_MSCA_PHY_ADDR_SHIFT) |
577 (IXGBE_MSCA_ADDR_CYCLE | IXGBE_MSCA_MDI_COMMAND));
579 IXGBE_WRITE_REG(hw, IXGBE_MSCA, command);
582 * Check every 10 usec to see if the address cycle completed.
583 * The MDI Command bit will clear when the operation is
586 for (i = 0; i < IXGBE_MDIO_COMMAND_TIMEOUT; i++) {
589 command = IXGBE_READ_REG(hw, IXGBE_MSCA);
590 if ((command & IXGBE_MSCA_MDI_COMMAND) == 0)
595 if ((command & IXGBE_MSCA_MDI_COMMAND) != 0) {
596 ERROR_REPORT1(IXGBE_ERROR_POLLING, "PHY address command did not complete.\n");
597 return IXGBE_ERR_PHY;
601 * Address cycle complete, setup and write the read
604 command = ((reg_addr << IXGBE_MSCA_NP_ADDR_SHIFT) |
605 (device_type << IXGBE_MSCA_DEV_TYPE_SHIFT) |
606 (hw->phy.addr << IXGBE_MSCA_PHY_ADDR_SHIFT) |
607 (IXGBE_MSCA_READ | IXGBE_MSCA_MDI_COMMAND));
609 IXGBE_WRITE_REG(hw, IXGBE_MSCA, command);
612 * Check every 10 usec to see if the address cycle
613 * completed. The MDI Command bit will clear when the
614 * operation is complete
616 for (i = 0; i < IXGBE_MDIO_COMMAND_TIMEOUT; i++) {
619 command = IXGBE_READ_REG(hw, IXGBE_MSCA);
620 if ((command & IXGBE_MSCA_MDI_COMMAND) == 0)
624 if ((command & IXGBE_MSCA_MDI_COMMAND) != 0) {
625 ERROR_REPORT1(IXGBE_ERROR_POLLING, "PHY read command didn't complete\n");
626 return IXGBE_ERR_PHY;
630 * Read operation is complete. Get the data
633 data = IXGBE_READ_REG(hw, IXGBE_MSRWD);
634 data >>= IXGBE_MSRWD_READ_DATA_SHIFT;
635 *phy_data = (u16)(data);
637 return IXGBE_SUCCESS;
641 * ixgbe_read_phy_reg_generic - Reads a value from a specified PHY register
642 * using the SWFW lock - this function is needed in most cases
643 * @hw: pointer to hardware structure
644 * @reg_addr: 32 bit address of PHY register to read
645 * @phy_data: Pointer to read data from PHY register
647 s32 ixgbe_read_phy_reg_generic(struct ixgbe_hw *hw, u32 reg_addr,
648 u32 device_type, u16 *phy_data)
651 u32 gssr = hw->phy.phy_semaphore_mask;
653 DEBUGFUNC("ixgbe_read_phy_reg_generic");
655 if (hw->mac.ops.acquire_swfw_sync(hw, gssr))
656 return IXGBE_ERR_SWFW_SYNC;
658 status = hw->phy.ops.read_reg_mdi(hw, reg_addr, device_type, phy_data);
660 hw->mac.ops.release_swfw_sync(hw, gssr);
666 * ixgbe_write_phy_reg_mdi - Writes a value to specified PHY register
668 * @hw: pointer to hardware structure
669 * @reg_addr: 32 bit PHY register to write
670 * @device_type: 5 bit device type
671 * @phy_data: Data to write to the PHY register
673 s32 ixgbe_write_phy_reg_mdi(struct ixgbe_hw *hw, u32 reg_addr,
674 u32 device_type, u16 phy_data)
678 /* Put the data in the MDI single read and write data register*/
679 IXGBE_WRITE_REG(hw, IXGBE_MSRWD, (u32)phy_data);
681 /* Setup and write the address cycle command */
682 command = ((reg_addr << IXGBE_MSCA_NP_ADDR_SHIFT) |
683 (device_type << IXGBE_MSCA_DEV_TYPE_SHIFT) |
684 (hw->phy.addr << IXGBE_MSCA_PHY_ADDR_SHIFT) |
685 (IXGBE_MSCA_ADDR_CYCLE | IXGBE_MSCA_MDI_COMMAND));
687 IXGBE_WRITE_REG(hw, IXGBE_MSCA, command);
690 * Check every 10 usec to see if the address cycle completed.
691 * The MDI Command bit will clear when the operation is
694 for (i = 0; i < IXGBE_MDIO_COMMAND_TIMEOUT; i++) {
697 command = IXGBE_READ_REG(hw, IXGBE_MSCA);
698 if ((command & IXGBE_MSCA_MDI_COMMAND) == 0)
702 if ((command & IXGBE_MSCA_MDI_COMMAND) != 0) {
703 ERROR_REPORT1(IXGBE_ERROR_POLLING, "PHY address cmd didn't complete\n");
704 return IXGBE_ERR_PHY;
708 * Address cycle complete, setup and write the write
711 command = ((reg_addr << IXGBE_MSCA_NP_ADDR_SHIFT) |
712 (device_type << IXGBE_MSCA_DEV_TYPE_SHIFT) |
713 (hw->phy.addr << IXGBE_MSCA_PHY_ADDR_SHIFT) |
714 (IXGBE_MSCA_WRITE | IXGBE_MSCA_MDI_COMMAND));
716 IXGBE_WRITE_REG(hw, IXGBE_MSCA, command);
719 * Check every 10 usec to see if the address cycle
720 * completed. The MDI Command bit will clear when the
721 * operation is complete
723 for (i = 0; i < IXGBE_MDIO_COMMAND_TIMEOUT; i++) {
726 command = IXGBE_READ_REG(hw, IXGBE_MSCA);
727 if ((command & IXGBE_MSCA_MDI_COMMAND) == 0)
731 if ((command & IXGBE_MSCA_MDI_COMMAND) != 0) {
732 ERROR_REPORT1(IXGBE_ERROR_POLLING, "PHY write cmd didn't complete\n");
733 return IXGBE_ERR_PHY;
736 return IXGBE_SUCCESS;
740 * ixgbe_write_phy_reg_generic - Writes a value to specified PHY register
741 * using SWFW lock- this function is needed in most cases
742 * @hw: pointer to hardware structure
743 * @reg_addr: 32 bit PHY register to write
744 * @device_type: 5 bit device type
745 * @phy_data: Data to write to the PHY register
747 s32 ixgbe_write_phy_reg_generic(struct ixgbe_hw *hw, u32 reg_addr,
748 u32 device_type, u16 phy_data)
751 u32 gssr = hw->phy.phy_semaphore_mask;
753 DEBUGFUNC("ixgbe_write_phy_reg_generic");
755 if (hw->mac.ops.acquire_swfw_sync(hw, gssr) == IXGBE_SUCCESS) {
756 status = hw->phy.ops.write_reg_mdi(hw, reg_addr, device_type,
758 hw->mac.ops.release_swfw_sync(hw, gssr);
760 status = IXGBE_ERR_SWFW_SYNC;
767 * ixgbe_setup_phy_link_generic - Set and restart auto-neg
768 * @hw: pointer to hardware structure
770 * Restart auto-negotiation and PHY and waits for completion.
772 s32 ixgbe_setup_phy_link_generic(struct ixgbe_hw *hw)
774 s32 status = IXGBE_SUCCESS;
775 u16 autoneg_reg = IXGBE_MII_AUTONEG_REG;
776 bool autoneg = false;
777 ixgbe_link_speed speed;
779 DEBUGFUNC("ixgbe_setup_phy_link_generic");
781 ixgbe_get_copper_link_capabilities_generic(hw, &speed, &autoneg);
783 /* Set or unset auto-negotiation 10G advertisement */
784 hw->phy.ops.read_reg(hw, IXGBE_MII_10GBASE_T_AUTONEG_CTRL_REG,
785 IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
788 autoneg_reg &= ~IXGBE_MII_10GBASE_T_ADVERTISE;
789 if ((hw->phy.autoneg_advertised & IXGBE_LINK_SPEED_10GB_FULL) &&
790 (speed & IXGBE_LINK_SPEED_10GB_FULL))
791 autoneg_reg |= IXGBE_MII_10GBASE_T_ADVERTISE;
793 hw->phy.ops.write_reg(hw, IXGBE_MII_10GBASE_T_AUTONEG_CTRL_REG,
794 IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
797 hw->phy.ops.read_reg(hw, IXGBE_MII_AUTONEG_VENDOR_PROVISION_1_REG,
798 IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
801 if (hw->mac.type == ixgbe_mac_X550) {
802 /* Set or unset auto-negotiation 5G advertisement */
803 autoneg_reg &= ~IXGBE_MII_5GBASE_T_ADVERTISE;
804 if ((hw->phy.autoneg_advertised & IXGBE_LINK_SPEED_5GB_FULL) &&
805 (speed & IXGBE_LINK_SPEED_5GB_FULL))
806 autoneg_reg |= IXGBE_MII_5GBASE_T_ADVERTISE;
808 /* Set or unset auto-negotiation 2.5G advertisement */
809 autoneg_reg &= ~IXGBE_MII_2_5GBASE_T_ADVERTISE;
810 if ((hw->phy.autoneg_advertised &
811 IXGBE_LINK_SPEED_2_5GB_FULL) &&
812 (speed & IXGBE_LINK_SPEED_2_5GB_FULL))
813 autoneg_reg |= IXGBE_MII_2_5GBASE_T_ADVERTISE;
816 /* Set or unset auto-negotiation 1G advertisement */
817 autoneg_reg &= ~IXGBE_MII_1GBASE_T_ADVERTISE;
818 if ((hw->phy.autoneg_advertised & IXGBE_LINK_SPEED_1GB_FULL) &&
819 (speed & IXGBE_LINK_SPEED_1GB_FULL))
820 autoneg_reg |= IXGBE_MII_1GBASE_T_ADVERTISE;
822 hw->phy.ops.write_reg(hw, IXGBE_MII_AUTONEG_VENDOR_PROVISION_1_REG,
823 IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
826 /* Set or unset auto-negotiation 100M advertisement */
827 hw->phy.ops.read_reg(hw, IXGBE_MII_AUTONEG_ADVERTISE_REG,
828 IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
831 autoneg_reg &= ~(IXGBE_MII_100BASE_T_ADVERTISE |
832 IXGBE_MII_100BASE_T_ADVERTISE_HALF);
833 if ((hw->phy.autoneg_advertised & IXGBE_LINK_SPEED_100_FULL) &&
834 (speed & IXGBE_LINK_SPEED_100_FULL))
835 autoneg_reg |= IXGBE_MII_100BASE_T_ADVERTISE;
837 hw->phy.ops.write_reg(hw, IXGBE_MII_AUTONEG_ADVERTISE_REG,
838 IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
841 /* Blocked by MNG FW so don't reset PHY */
842 if (ixgbe_check_reset_blocked(hw))
845 /* Restart PHY auto-negotiation. */
846 hw->phy.ops.read_reg(hw, IXGBE_MDIO_AUTO_NEG_CONTROL,
847 IXGBE_MDIO_AUTO_NEG_DEV_TYPE, &autoneg_reg);
849 autoneg_reg |= IXGBE_MII_RESTART;
851 hw->phy.ops.write_reg(hw, IXGBE_MDIO_AUTO_NEG_CONTROL,
852 IXGBE_MDIO_AUTO_NEG_DEV_TYPE, autoneg_reg);
858 * ixgbe_setup_phy_link_speed_generic - Sets the auto advertised capabilities
859 * @hw: pointer to hardware structure
860 * @speed: new link speed
862 s32 ixgbe_setup_phy_link_speed_generic(struct ixgbe_hw *hw,
863 ixgbe_link_speed speed,
864 bool autoneg_wait_to_complete)
866 UNREFERENCED_1PARAMETER(autoneg_wait_to_complete);
868 DEBUGFUNC("ixgbe_setup_phy_link_speed_generic");
871 * Clear autoneg_advertised and set new values based on input link
874 hw->phy.autoneg_advertised = 0;
876 if (speed & IXGBE_LINK_SPEED_10GB_FULL)
877 hw->phy.autoneg_advertised |= IXGBE_LINK_SPEED_10GB_FULL;
879 if (speed & IXGBE_LINK_SPEED_5GB_FULL)
880 hw->phy.autoneg_advertised |= IXGBE_LINK_SPEED_5GB_FULL;
882 if (speed & IXGBE_LINK_SPEED_2_5GB_FULL)
883 hw->phy.autoneg_advertised |= IXGBE_LINK_SPEED_2_5GB_FULL;
885 if (speed & IXGBE_LINK_SPEED_1GB_FULL)
886 hw->phy.autoneg_advertised |= IXGBE_LINK_SPEED_1GB_FULL;
888 if (speed & IXGBE_LINK_SPEED_100_FULL)
889 hw->phy.autoneg_advertised |= IXGBE_LINK_SPEED_100_FULL;
891 if (speed & IXGBE_LINK_SPEED_10_FULL)
892 hw->phy.autoneg_advertised |= IXGBE_LINK_SPEED_10_FULL;
894 /* Setup link based on the new speed settings */
895 ixgbe_setup_phy_link(hw);
897 return IXGBE_SUCCESS;
901 * ixgbe_get_copper_speeds_supported - Get copper link speeds from phy
902 * @hw: pointer to hardware structure
904 * Determines the supported link capabilities by reading the PHY auto
905 * negotiation register.
907 static s32 ixgbe_get_copper_speeds_supported(struct ixgbe_hw *hw)
912 status = hw->phy.ops.read_reg(hw, IXGBE_MDIO_PHY_SPEED_ABILITY,
913 IXGBE_MDIO_PMA_PMD_DEV_TYPE,
918 if (speed_ability & IXGBE_MDIO_PHY_SPEED_10G)
919 hw->phy.speeds_supported |= IXGBE_LINK_SPEED_10GB_FULL;
920 if (speed_ability & IXGBE_MDIO_PHY_SPEED_1G)
921 hw->phy.speeds_supported |= IXGBE_LINK_SPEED_1GB_FULL;
922 if (speed_ability & IXGBE_MDIO_PHY_SPEED_100M)
923 hw->phy.speeds_supported |= IXGBE_LINK_SPEED_100_FULL;
925 switch (hw->mac.type) {
927 hw->phy.speeds_supported |= IXGBE_LINK_SPEED_2_5GB_FULL;
928 hw->phy.speeds_supported |= IXGBE_LINK_SPEED_5GB_FULL;
930 case ixgbe_mac_X550EM_x:
931 case ixgbe_mac_X550EM_a:
932 hw->phy.speeds_supported &= ~IXGBE_LINK_SPEED_100_FULL;
942 * ixgbe_get_copper_link_capabilities_generic - Determines link capabilities
943 * @hw: pointer to hardware structure
944 * @speed: pointer to link speed
945 * @autoneg: boolean auto-negotiation value
947 s32 ixgbe_get_copper_link_capabilities_generic(struct ixgbe_hw *hw,
948 ixgbe_link_speed *speed,
951 s32 status = IXGBE_SUCCESS;
953 DEBUGFUNC("ixgbe_get_copper_link_capabilities_generic");
956 if (!hw->phy.speeds_supported)
957 status = ixgbe_get_copper_speeds_supported(hw);
959 *speed = hw->phy.speeds_supported;
964 * ixgbe_check_phy_link_tnx - Determine link and speed status
965 * @hw: pointer to hardware structure
967 * Reads the VS1 register to determine if link is up and the current speed for
970 s32 ixgbe_check_phy_link_tnx(struct ixgbe_hw *hw, ixgbe_link_speed *speed,
973 s32 status = IXGBE_SUCCESS;
975 u32 max_time_out = 10;
980 DEBUGFUNC("ixgbe_check_phy_link_tnx");
982 /* Initialize speed and link to default case */
984 *speed = IXGBE_LINK_SPEED_10GB_FULL;
987 * Check current speed and link status of the PHY register.
988 * This is a vendor specific register and may have to
989 * be changed for other copper PHYs.
991 for (time_out = 0; time_out < max_time_out; time_out++) {
993 status = hw->phy.ops.read_reg(hw,
994 IXGBE_MDIO_VENDOR_SPECIFIC_1_STATUS,
995 IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE,
997 phy_link = phy_data & IXGBE_MDIO_VENDOR_SPECIFIC_1_LINK_STATUS;
998 phy_speed = phy_data &
999 IXGBE_MDIO_VENDOR_SPECIFIC_1_SPEED_STATUS;
1000 if (phy_link == IXGBE_MDIO_VENDOR_SPECIFIC_1_LINK_STATUS) {
1003 IXGBE_MDIO_VENDOR_SPECIFIC_1_SPEED_STATUS)
1004 *speed = IXGBE_LINK_SPEED_1GB_FULL;
1013 * ixgbe_setup_phy_link_tnx - Set and restart auto-neg
1014 * @hw: pointer to hardware structure
1016 * Restart auto-negotiation and PHY and waits for completion.
1018 s32 ixgbe_setup_phy_link_tnx(struct ixgbe_hw *hw)
1020 s32 status = IXGBE_SUCCESS;
1021 u16 autoneg_reg = IXGBE_MII_AUTONEG_REG;
1022 bool autoneg = false;
1023 ixgbe_link_speed speed;
1025 DEBUGFUNC("ixgbe_setup_phy_link_tnx");
1027 ixgbe_get_copper_link_capabilities_generic(hw, &speed, &autoneg);
1029 if (speed & IXGBE_LINK_SPEED_10GB_FULL) {
1030 /* Set or unset auto-negotiation 10G advertisement */
1031 hw->phy.ops.read_reg(hw, IXGBE_MII_10GBASE_T_AUTONEG_CTRL_REG,
1032 IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
1035 autoneg_reg &= ~IXGBE_MII_10GBASE_T_ADVERTISE;
1036 if (hw->phy.autoneg_advertised & IXGBE_LINK_SPEED_10GB_FULL)
1037 autoneg_reg |= IXGBE_MII_10GBASE_T_ADVERTISE;
1039 hw->phy.ops.write_reg(hw, IXGBE_MII_10GBASE_T_AUTONEG_CTRL_REG,
1040 IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
1044 if (speed & IXGBE_LINK_SPEED_1GB_FULL) {
1045 /* Set or unset auto-negotiation 1G advertisement */
1046 hw->phy.ops.read_reg(hw, IXGBE_MII_AUTONEG_XNP_TX_REG,
1047 IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
1050 autoneg_reg &= ~IXGBE_MII_1GBASE_T_ADVERTISE_XNP_TX;
1051 if (hw->phy.autoneg_advertised & IXGBE_LINK_SPEED_1GB_FULL)
1052 autoneg_reg |= IXGBE_MII_1GBASE_T_ADVERTISE_XNP_TX;
1054 hw->phy.ops.write_reg(hw, IXGBE_MII_AUTONEG_XNP_TX_REG,
1055 IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
1059 if (speed & IXGBE_LINK_SPEED_100_FULL) {
1060 /* Set or unset auto-negotiation 100M advertisement */
1061 hw->phy.ops.read_reg(hw, IXGBE_MII_AUTONEG_ADVERTISE_REG,
1062 IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
1065 autoneg_reg &= ~IXGBE_MII_100BASE_T_ADVERTISE;
1066 if (hw->phy.autoneg_advertised & IXGBE_LINK_SPEED_100_FULL)
1067 autoneg_reg |= IXGBE_MII_100BASE_T_ADVERTISE;
1069 hw->phy.ops.write_reg(hw, IXGBE_MII_AUTONEG_ADVERTISE_REG,
1070 IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
1074 /* Blocked by MNG FW so don't reset PHY */
1075 if (ixgbe_check_reset_blocked(hw))
1078 /* Restart PHY auto-negotiation. */
1079 hw->phy.ops.read_reg(hw, IXGBE_MDIO_AUTO_NEG_CONTROL,
1080 IXGBE_MDIO_AUTO_NEG_DEV_TYPE, &autoneg_reg);
1082 autoneg_reg |= IXGBE_MII_RESTART;
1084 hw->phy.ops.write_reg(hw, IXGBE_MDIO_AUTO_NEG_CONTROL,
1085 IXGBE_MDIO_AUTO_NEG_DEV_TYPE, autoneg_reg);
1091 * ixgbe_get_phy_firmware_version_tnx - Gets the PHY Firmware Version
1092 * @hw: pointer to hardware structure
1093 * @firmware_version: pointer to the PHY Firmware Version
1095 s32 ixgbe_get_phy_firmware_version_tnx(struct ixgbe_hw *hw,
1096 u16 *firmware_version)
1100 DEBUGFUNC("ixgbe_get_phy_firmware_version_tnx");
1102 status = hw->phy.ops.read_reg(hw, TNX_FW_REV,
1103 IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE,
1110 * ixgbe_get_phy_firmware_version_generic - Gets the PHY Firmware Version
1111 * @hw: pointer to hardware structure
1112 * @firmware_version: pointer to the PHY Firmware Version
1114 s32 ixgbe_get_phy_firmware_version_generic(struct ixgbe_hw *hw,
1115 u16 *firmware_version)
1119 DEBUGFUNC("ixgbe_get_phy_firmware_version_generic");
1121 status = hw->phy.ops.read_reg(hw, AQ_FW_REV,
1122 IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE,
1129 * ixgbe_reset_phy_nl - Performs a PHY reset
1130 * @hw: pointer to hardware structure
1132 s32 ixgbe_reset_phy_nl(struct ixgbe_hw *hw)
1134 u16 phy_offset, control, eword, edata, block_crc;
1135 bool end_data = false;
1136 u16 list_offset, data_offset;
1138 s32 ret_val = IXGBE_SUCCESS;
1141 DEBUGFUNC("ixgbe_reset_phy_nl");
1143 /* Blocked by MNG FW so bail */
1144 if (ixgbe_check_reset_blocked(hw))
1147 hw->phy.ops.read_reg(hw, IXGBE_MDIO_PHY_XS_CONTROL,
1148 IXGBE_MDIO_PHY_XS_DEV_TYPE, &phy_data);
1150 /* reset the PHY and poll for completion */
1151 hw->phy.ops.write_reg(hw, IXGBE_MDIO_PHY_XS_CONTROL,
1152 IXGBE_MDIO_PHY_XS_DEV_TYPE,
1153 (phy_data | IXGBE_MDIO_PHY_XS_RESET));
1155 for (i = 0; i < 100; i++) {
1156 hw->phy.ops.read_reg(hw, IXGBE_MDIO_PHY_XS_CONTROL,
1157 IXGBE_MDIO_PHY_XS_DEV_TYPE, &phy_data);
1158 if ((phy_data & IXGBE_MDIO_PHY_XS_RESET) == 0)
1163 if ((phy_data & IXGBE_MDIO_PHY_XS_RESET) != 0) {
1164 DEBUGOUT("PHY reset did not complete.\n");
1165 ret_val = IXGBE_ERR_PHY;
1169 /* Get init offsets */
1170 ret_val = ixgbe_get_sfp_init_sequence_offsets(hw, &list_offset,
1172 if (ret_val != IXGBE_SUCCESS)
1175 ret_val = hw->eeprom.ops.read(hw, data_offset, &block_crc);
1179 * Read control word from PHY init contents offset
1181 ret_val = hw->eeprom.ops.read(hw, data_offset, &eword);
1184 control = (eword & IXGBE_CONTROL_MASK_NL) >>
1185 IXGBE_CONTROL_SHIFT_NL;
1186 edata = eword & IXGBE_DATA_MASK_NL;
1188 case IXGBE_DELAY_NL:
1190 DEBUGOUT1("DELAY: %d MS\n", edata);
1194 DEBUGOUT("DATA:\n");
1196 ret_val = hw->eeprom.ops.read(hw, data_offset,
1201 for (i = 0; i < edata; i++) {
1202 ret_val = hw->eeprom.ops.read(hw, data_offset,
1206 hw->phy.ops.write_reg(hw, phy_offset,
1207 IXGBE_TWINAX_DEV, eword);
1208 DEBUGOUT2("Wrote %4.4x to %4.4x\n", eword,
1214 case IXGBE_CONTROL_NL:
1216 DEBUGOUT("CONTROL:\n");
1217 if (edata == IXGBE_CONTROL_EOL_NL) {
1220 } else if (edata == IXGBE_CONTROL_SOL_NL) {
1223 DEBUGOUT("Bad control value\n");
1224 ret_val = IXGBE_ERR_PHY;
1229 DEBUGOUT("Bad control type\n");
1230 ret_val = IXGBE_ERR_PHY;
1239 ERROR_REPORT2(IXGBE_ERROR_INVALID_STATE,
1240 "eeprom read at offset %d failed", data_offset);
1241 return IXGBE_ERR_PHY;
1245 * ixgbe_identify_module_generic - Identifies module type
1246 * @hw: pointer to hardware structure
1248 * Determines HW type and calls appropriate function.
1250 s32 ixgbe_identify_module_generic(struct ixgbe_hw *hw)
1252 s32 status = IXGBE_ERR_SFP_NOT_PRESENT;
1254 DEBUGFUNC("ixgbe_identify_module_generic");
1256 switch (hw->mac.ops.get_media_type(hw)) {
1257 case ixgbe_media_type_fiber:
1258 status = ixgbe_identify_sfp_module_generic(hw);
1261 case ixgbe_media_type_fiber_qsfp:
1262 status = ixgbe_identify_qsfp_module_generic(hw);
1266 hw->phy.sfp_type = ixgbe_sfp_type_not_present;
1267 status = IXGBE_ERR_SFP_NOT_PRESENT;
1275 * ixgbe_identify_sfp_module_generic - Identifies SFP modules
1276 * @hw: pointer to hardware structure
1278 * Searches for and identifies the SFP module and assigns appropriate PHY type.
1280 s32 ixgbe_identify_sfp_module_generic(struct ixgbe_hw *hw)
1282 s32 status = IXGBE_ERR_PHY_ADDR_INVALID;
1284 enum ixgbe_sfp_type stored_sfp_type = hw->phy.sfp_type;
1286 u8 comp_codes_1g = 0;
1287 u8 comp_codes_10g = 0;
1288 u8 oui_bytes[3] = {0, 0, 0};
1291 u16 enforce_sfp = 0;
1293 DEBUGFUNC("ixgbe_identify_sfp_module_generic");
1295 if (hw->mac.ops.get_media_type(hw) != ixgbe_media_type_fiber) {
1296 hw->phy.sfp_type = ixgbe_sfp_type_not_present;
1297 status = IXGBE_ERR_SFP_NOT_PRESENT;
1301 /* LAN ID is needed for I2C access */
1302 hw->mac.ops.set_lan_id(hw);
1304 status = hw->phy.ops.read_i2c_eeprom(hw,
1305 IXGBE_SFF_IDENTIFIER,
1308 if (status != IXGBE_SUCCESS)
1309 goto err_read_i2c_eeprom;
1311 if (identifier != IXGBE_SFF_IDENTIFIER_SFP) {
1312 hw->phy.type = ixgbe_phy_sfp_unsupported;
1313 status = IXGBE_ERR_SFP_NOT_SUPPORTED;
1315 status = hw->phy.ops.read_i2c_eeprom(hw,
1316 IXGBE_SFF_1GBE_COMP_CODES,
1319 if (status != IXGBE_SUCCESS)
1320 goto err_read_i2c_eeprom;
1322 status = hw->phy.ops.read_i2c_eeprom(hw,
1323 IXGBE_SFF_10GBE_COMP_CODES,
1326 if (status != IXGBE_SUCCESS)
1327 goto err_read_i2c_eeprom;
1328 status = hw->phy.ops.read_i2c_eeprom(hw,
1329 IXGBE_SFF_CABLE_TECHNOLOGY,
1332 if (status != IXGBE_SUCCESS)
1333 goto err_read_i2c_eeprom;
1340 * 3 SFP_DA_CORE0 - 82599-specific
1341 * 4 SFP_DA_CORE1 - 82599-specific
1342 * 5 SFP_SR/LR_CORE0 - 82599-specific
1343 * 6 SFP_SR/LR_CORE1 - 82599-specific
1344 * 7 SFP_act_lmt_DA_CORE0 - 82599-specific
1345 * 8 SFP_act_lmt_DA_CORE1 - 82599-specific
1346 * 9 SFP_1g_cu_CORE0 - 82599-specific
1347 * 10 SFP_1g_cu_CORE1 - 82599-specific
1348 * 11 SFP_1g_sx_CORE0 - 82599-specific
1349 * 12 SFP_1g_sx_CORE1 - 82599-specific
1351 if (hw->mac.type == ixgbe_mac_82598EB) {
1352 if (cable_tech & IXGBE_SFF_DA_PASSIVE_CABLE)
1353 hw->phy.sfp_type = ixgbe_sfp_type_da_cu;
1354 else if (comp_codes_10g & IXGBE_SFF_10GBASESR_CAPABLE)
1355 hw->phy.sfp_type = ixgbe_sfp_type_sr;
1356 else if (comp_codes_10g & IXGBE_SFF_10GBASELR_CAPABLE)
1357 hw->phy.sfp_type = ixgbe_sfp_type_lr;
1359 hw->phy.sfp_type = ixgbe_sfp_type_unknown;
1361 if (cable_tech & IXGBE_SFF_DA_PASSIVE_CABLE) {
1362 if (hw->bus.lan_id == 0)
1364 ixgbe_sfp_type_da_cu_core0;
1367 ixgbe_sfp_type_da_cu_core1;
1368 } else if (cable_tech & IXGBE_SFF_DA_ACTIVE_CABLE) {
1369 hw->phy.ops.read_i2c_eeprom(
1370 hw, IXGBE_SFF_CABLE_SPEC_COMP,
1373 IXGBE_SFF_DA_SPEC_ACTIVE_LIMITING) {
1374 if (hw->bus.lan_id == 0)
1376 ixgbe_sfp_type_da_act_lmt_core0;
1379 ixgbe_sfp_type_da_act_lmt_core1;
1382 ixgbe_sfp_type_unknown;
1384 } else if (comp_codes_10g &
1385 (IXGBE_SFF_10GBASESR_CAPABLE |
1386 IXGBE_SFF_10GBASELR_CAPABLE)) {
1387 if (hw->bus.lan_id == 0)
1389 ixgbe_sfp_type_srlr_core0;
1392 ixgbe_sfp_type_srlr_core1;
1393 } else if (comp_codes_1g & IXGBE_SFF_1GBASET_CAPABLE) {
1394 if (hw->bus.lan_id == 0)
1396 ixgbe_sfp_type_1g_cu_core0;
1399 ixgbe_sfp_type_1g_cu_core1;
1400 } else if (comp_codes_1g & IXGBE_SFF_1GBASESX_CAPABLE) {
1401 if (hw->bus.lan_id == 0)
1403 ixgbe_sfp_type_1g_sx_core0;
1406 ixgbe_sfp_type_1g_sx_core1;
1407 } else if (comp_codes_1g & IXGBE_SFF_1GBASELX_CAPABLE) {
1408 if (hw->bus.lan_id == 0)
1410 ixgbe_sfp_type_1g_lx_core0;
1413 ixgbe_sfp_type_1g_lx_core1;
1415 hw->phy.sfp_type = ixgbe_sfp_type_unknown;
1419 if (hw->phy.sfp_type != stored_sfp_type)
1420 hw->phy.sfp_setup_needed = true;
1422 /* Determine if the SFP+ PHY is dual speed or not. */
1423 hw->phy.multispeed_fiber = false;
1424 if (((comp_codes_1g & IXGBE_SFF_1GBASESX_CAPABLE) &&
1425 (comp_codes_10g & IXGBE_SFF_10GBASESR_CAPABLE)) ||
1426 ((comp_codes_1g & IXGBE_SFF_1GBASELX_CAPABLE) &&
1427 (comp_codes_10g & IXGBE_SFF_10GBASELR_CAPABLE)))
1428 hw->phy.multispeed_fiber = true;
1430 /* Determine PHY vendor */
1431 if (hw->phy.type != ixgbe_phy_nl) {
1432 hw->phy.id = identifier;
1433 status = hw->phy.ops.read_i2c_eeprom(hw,
1434 IXGBE_SFF_VENDOR_OUI_BYTE0,
1437 if (status != IXGBE_SUCCESS)
1438 goto err_read_i2c_eeprom;
1440 status = hw->phy.ops.read_i2c_eeprom(hw,
1441 IXGBE_SFF_VENDOR_OUI_BYTE1,
1444 if (status != IXGBE_SUCCESS)
1445 goto err_read_i2c_eeprom;
1447 status = hw->phy.ops.read_i2c_eeprom(hw,
1448 IXGBE_SFF_VENDOR_OUI_BYTE2,
1451 if (status != IXGBE_SUCCESS)
1452 goto err_read_i2c_eeprom;
1455 ((oui_bytes[0] << IXGBE_SFF_VENDOR_OUI_BYTE0_SHIFT) |
1456 (oui_bytes[1] << IXGBE_SFF_VENDOR_OUI_BYTE1_SHIFT) |
1457 (oui_bytes[2] << IXGBE_SFF_VENDOR_OUI_BYTE2_SHIFT));
1459 switch (vendor_oui) {
1460 case IXGBE_SFF_VENDOR_OUI_TYCO:
1461 if (cable_tech & IXGBE_SFF_DA_PASSIVE_CABLE)
1463 ixgbe_phy_sfp_passive_tyco;
1465 case IXGBE_SFF_VENDOR_OUI_FTL:
1466 if (cable_tech & IXGBE_SFF_DA_ACTIVE_CABLE)
1467 hw->phy.type = ixgbe_phy_sfp_ftl_active;
1469 hw->phy.type = ixgbe_phy_sfp_ftl;
1471 case IXGBE_SFF_VENDOR_OUI_AVAGO:
1472 hw->phy.type = ixgbe_phy_sfp_avago;
1474 case IXGBE_SFF_VENDOR_OUI_INTEL:
1475 hw->phy.type = ixgbe_phy_sfp_intel;
1478 if (cable_tech & IXGBE_SFF_DA_PASSIVE_CABLE)
1480 ixgbe_phy_sfp_passive_unknown;
1481 else if (cable_tech & IXGBE_SFF_DA_ACTIVE_CABLE)
1483 ixgbe_phy_sfp_active_unknown;
1485 hw->phy.type = ixgbe_phy_sfp_unknown;
1490 /* Allow any DA cable vendor */
1491 if (cable_tech & (IXGBE_SFF_DA_PASSIVE_CABLE |
1492 IXGBE_SFF_DA_ACTIVE_CABLE)) {
1493 status = IXGBE_SUCCESS;
1497 /* Verify supported 1G SFP modules */
1498 if (comp_codes_10g == 0 &&
1499 !(hw->phy.sfp_type == ixgbe_sfp_type_1g_cu_core1 ||
1500 hw->phy.sfp_type == ixgbe_sfp_type_1g_cu_core0 ||
1501 hw->phy.sfp_type == ixgbe_sfp_type_1g_lx_core0 ||
1502 hw->phy.sfp_type == ixgbe_sfp_type_1g_lx_core1 ||
1503 hw->phy.sfp_type == ixgbe_sfp_type_1g_sx_core0 ||
1504 hw->phy.sfp_type == ixgbe_sfp_type_1g_sx_core1)) {
1505 hw->phy.type = ixgbe_phy_sfp_unsupported;
1506 status = IXGBE_ERR_SFP_NOT_SUPPORTED;
1510 /* Anything else 82598-based is supported */
1511 if (hw->mac.type == ixgbe_mac_82598EB) {
1512 status = IXGBE_SUCCESS;
1516 ixgbe_get_device_caps(hw, &enforce_sfp);
1517 if (!(enforce_sfp & IXGBE_DEVICE_CAPS_ALLOW_ANY_SFP) &&
1518 !(hw->phy.sfp_type == ixgbe_sfp_type_1g_cu_core0 ||
1519 hw->phy.sfp_type == ixgbe_sfp_type_1g_cu_core1 ||
1520 hw->phy.sfp_type == ixgbe_sfp_type_1g_lx_core0 ||
1521 hw->phy.sfp_type == ixgbe_sfp_type_1g_lx_core1 ||
1522 hw->phy.sfp_type == ixgbe_sfp_type_1g_sx_core0 ||
1523 hw->phy.sfp_type == ixgbe_sfp_type_1g_sx_core1)) {
1524 /* Make sure we're a supported PHY type */
1525 if (hw->phy.type == ixgbe_phy_sfp_intel) {
1526 status = IXGBE_SUCCESS;
1528 if (hw->allow_unsupported_sfp == true) {
1529 EWARN(hw, "WARNING: Intel (R) Network "
1530 "Connections are quality tested "
1531 "using Intel (R) Ethernet Optics."
1532 " Using untested modules is not "
1533 "supported and may cause unstable"
1534 " operation or damage to the "
1535 "module or the adapter. Intel "
1536 "Corporation is not responsible "
1537 "for any harm caused by using "
1538 "untested modules.\n", status);
1539 status = IXGBE_SUCCESS;
1541 DEBUGOUT("SFP+ module not supported\n");
1543 ixgbe_phy_sfp_unsupported;
1544 status = IXGBE_ERR_SFP_NOT_SUPPORTED;
1548 status = IXGBE_SUCCESS;
1555 err_read_i2c_eeprom:
1556 hw->phy.sfp_type = ixgbe_sfp_type_not_present;
1557 if (hw->phy.type != ixgbe_phy_nl) {
1559 hw->phy.type = ixgbe_phy_unknown;
1561 return IXGBE_ERR_SFP_NOT_PRESENT;
1565 * ixgbe_get_supported_phy_sfp_layer_generic - Returns physical layer type
1566 * @hw: pointer to hardware structure
1568 * Determines physical layer capabilities of the current SFP.
1570 s32 ixgbe_get_supported_phy_sfp_layer_generic(struct ixgbe_hw *hw)
1572 u32 physical_layer = IXGBE_PHYSICAL_LAYER_UNKNOWN;
1573 u8 comp_codes_10g = 0;
1574 u8 comp_codes_1g = 0;
1576 DEBUGFUNC("ixgbe_get_supported_phy_sfp_layer_generic");
1578 hw->phy.ops.identify_sfp(hw);
1579 if (hw->phy.sfp_type == ixgbe_sfp_type_not_present)
1580 return physical_layer;
1582 switch (hw->phy.type) {
1583 case ixgbe_phy_sfp_passive_tyco:
1584 case ixgbe_phy_sfp_passive_unknown:
1585 case ixgbe_phy_qsfp_passive_unknown:
1586 physical_layer = IXGBE_PHYSICAL_LAYER_SFP_PLUS_CU;
1588 case ixgbe_phy_sfp_ftl_active:
1589 case ixgbe_phy_sfp_active_unknown:
1590 case ixgbe_phy_qsfp_active_unknown:
1591 physical_layer = IXGBE_PHYSICAL_LAYER_SFP_ACTIVE_DA;
1593 case ixgbe_phy_sfp_avago:
1594 case ixgbe_phy_sfp_ftl:
1595 case ixgbe_phy_sfp_intel:
1596 case ixgbe_phy_sfp_unknown:
1597 hw->phy.ops.read_i2c_eeprom(hw,
1598 IXGBE_SFF_1GBE_COMP_CODES, &comp_codes_1g);
1599 hw->phy.ops.read_i2c_eeprom(hw,
1600 IXGBE_SFF_10GBE_COMP_CODES, &comp_codes_10g);
1601 if (comp_codes_10g & IXGBE_SFF_10GBASESR_CAPABLE)
1602 physical_layer = IXGBE_PHYSICAL_LAYER_10GBASE_SR;
1603 else if (comp_codes_10g & IXGBE_SFF_10GBASELR_CAPABLE)
1604 physical_layer = IXGBE_PHYSICAL_LAYER_10GBASE_LR;
1605 else if (comp_codes_1g & IXGBE_SFF_1GBASET_CAPABLE)
1606 physical_layer = IXGBE_PHYSICAL_LAYER_1000BASE_T;
1607 else if (comp_codes_1g & IXGBE_SFF_1GBASESX_CAPABLE)
1608 physical_layer = IXGBE_PHYSICAL_LAYER_1000BASE_SX;
1610 case ixgbe_phy_qsfp_intel:
1611 case ixgbe_phy_qsfp_unknown:
1612 hw->phy.ops.read_i2c_eeprom(hw,
1613 IXGBE_SFF_QSFP_10GBE_COMP, &comp_codes_10g);
1614 if (comp_codes_10g & IXGBE_SFF_10GBASESR_CAPABLE)
1615 physical_layer = IXGBE_PHYSICAL_LAYER_10GBASE_SR;
1616 else if (comp_codes_10g & IXGBE_SFF_10GBASELR_CAPABLE)
1617 physical_layer = IXGBE_PHYSICAL_LAYER_10GBASE_LR;
1623 return physical_layer;
1627 * ixgbe_identify_qsfp_module_generic - Identifies QSFP modules
1628 * @hw: pointer to hardware structure
1630 * Searches for and identifies the QSFP module and assigns appropriate PHY type
1632 s32 ixgbe_identify_qsfp_module_generic(struct ixgbe_hw *hw)
1634 s32 status = IXGBE_ERR_PHY_ADDR_INVALID;
1636 enum ixgbe_sfp_type stored_sfp_type = hw->phy.sfp_type;
1638 u8 comp_codes_1g = 0;
1639 u8 comp_codes_10g = 0;
1640 u8 oui_bytes[3] = {0, 0, 0};
1641 u16 enforce_sfp = 0;
1643 u8 cable_length = 0;
1645 bool active_cable = false;
1647 DEBUGFUNC("ixgbe_identify_qsfp_module_generic");
1649 if (hw->mac.ops.get_media_type(hw) != ixgbe_media_type_fiber_qsfp) {
1650 hw->phy.sfp_type = ixgbe_sfp_type_not_present;
1651 status = IXGBE_ERR_SFP_NOT_PRESENT;
1655 /* LAN ID is needed for I2C access */
1656 hw->mac.ops.set_lan_id(hw);
1658 status = hw->phy.ops.read_i2c_eeprom(hw, IXGBE_SFF_IDENTIFIER,
1661 if (status != IXGBE_SUCCESS)
1662 goto err_read_i2c_eeprom;
1664 if (identifier != IXGBE_SFF_IDENTIFIER_QSFP_PLUS) {
1665 hw->phy.type = ixgbe_phy_sfp_unsupported;
1666 status = IXGBE_ERR_SFP_NOT_SUPPORTED;
1670 hw->phy.id = identifier;
1672 status = hw->phy.ops.read_i2c_eeprom(hw, IXGBE_SFF_QSFP_10GBE_COMP,
1675 if (status != IXGBE_SUCCESS)
1676 goto err_read_i2c_eeprom;
1678 status = hw->phy.ops.read_i2c_eeprom(hw, IXGBE_SFF_QSFP_1GBE_COMP,
1681 if (status != IXGBE_SUCCESS)
1682 goto err_read_i2c_eeprom;
1684 if (comp_codes_10g & IXGBE_SFF_QSFP_DA_PASSIVE_CABLE) {
1685 hw->phy.type = ixgbe_phy_qsfp_passive_unknown;
1686 if (hw->bus.lan_id == 0)
1687 hw->phy.sfp_type = ixgbe_sfp_type_da_cu_core0;
1689 hw->phy.sfp_type = ixgbe_sfp_type_da_cu_core1;
1690 } else if (comp_codes_10g & (IXGBE_SFF_10GBASESR_CAPABLE |
1691 IXGBE_SFF_10GBASELR_CAPABLE)) {
1692 if (hw->bus.lan_id == 0)
1693 hw->phy.sfp_type = ixgbe_sfp_type_srlr_core0;
1695 hw->phy.sfp_type = ixgbe_sfp_type_srlr_core1;
1697 if (comp_codes_10g & IXGBE_SFF_QSFP_DA_ACTIVE_CABLE)
1698 active_cable = true;
1700 if (!active_cable) {
1701 /* check for active DA cables that pre-date
1703 hw->phy.ops.read_i2c_eeprom(hw,
1704 IXGBE_SFF_QSFP_CONNECTOR,
1707 hw->phy.ops.read_i2c_eeprom(hw,
1708 IXGBE_SFF_QSFP_CABLE_LENGTH,
1711 hw->phy.ops.read_i2c_eeprom(hw,
1712 IXGBE_SFF_QSFP_DEVICE_TECH,
1716 IXGBE_SFF_QSFP_CONNECTOR_NOT_SEPARABLE) &&
1717 (cable_length > 0) &&
1718 ((device_tech >> 4) ==
1719 IXGBE_SFF_QSFP_TRANSMITER_850NM_VCSEL))
1720 active_cable = true;
1724 hw->phy.type = ixgbe_phy_qsfp_active_unknown;
1725 if (hw->bus.lan_id == 0)
1727 ixgbe_sfp_type_da_act_lmt_core0;
1730 ixgbe_sfp_type_da_act_lmt_core1;
1732 /* unsupported module type */
1733 hw->phy.type = ixgbe_phy_sfp_unsupported;
1734 status = IXGBE_ERR_SFP_NOT_SUPPORTED;
1739 if (hw->phy.sfp_type != stored_sfp_type)
1740 hw->phy.sfp_setup_needed = true;
1742 /* Determine if the QSFP+ PHY is dual speed or not. */
1743 hw->phy.multispeed_fiber = false;
1744 if (((comp_codes_1g & IXGBE_SFF_1GBASESX_CAPABLE) &&
1745 (comp_codes_10g & IXGBE_SFF_10GBASESR_CAPABLE)) ||
1746 ((comp_codes_1g & IXGBE_SFF_1GBASELX_CAPABLE) &&
1747 (comp_codes_10g & IXGBE_SFF_10GBASELR_CAPABLE)))
1748 hw->phy.multispeed_fiber = true;
1750 /* Determine PHY vendor for optical modules */
1751 if (comp_codes_10g & (IXGBE_SFF_10GBASESR_CAPABLE |
1752 IXGBE_SFF_10GBASELR_CAPABLE)) {
1753 status = hw->phy.ops.read_i2c_eeprom(hw,
1754 IXGBE_SFF_QSFP_VENDOR_OUI_BYTE0,
1757 if (status != IXGBE_SUCCESS)
1758 goto err_read_i2c_eeprom;
1760 status = hw->phy.ops.read_i2c_eeprom(hw,
1761 IXGBE_SFF_QSFP_VENDOR_OUI_BYTE1,
1764 if (status != IXGBE_SUCCESS)
1765 goto err_read_i2c_eeprom;
1767 status = hw->phy.ops.read_i2c_eeprom(hw,
1768 IXGBE_SFF_QSFP_VENDOR_OUI_BYTE2,
1771 if (status != IXGBE_SUCCESS)
1772 goto err_read_i2c_eeprom;
1775 ((oui_bytes[0] << IXGBE_SFF_VENDOR_OUI_BYTE0_SHIFT) |
1776 (oui_bytes[1] << IXGBE_SFF_VENDOR_OUI_BYTE1_SHIFT) |
1777 (oui_bytes[2] << IXGBE_SFF_VENDOR_OUI_BYTE2_SHIFT));
1779 if (vendor_oui == IXGBE_SFF_VENDOR_OUI_INTEL)
1780 hw->phy.type = ixgbe_phy_qsfp_intel;
1782 hw->phy.type = ixgbe_phy_qsfp_unknown;
1784 ixgbe_get_device_caps(hw, &enforce_sfp);
1785 if (!(enforce_sfp & IXGBE_DEVICE_CAPS_ALLOW_ANY_SFP)) {
1786 /* Make sure we're a supported PHY type */
1787 if (hw->phy.type == ixgbe_phy_qsfp_intel) {
1788 status = IXGBE_SUCCESS;
1790 if (hw->allow_unsupported_sfp == true) {
1791 EWARN(hw, "WARNING: Intel (R) Network "
1792 "Connections are quality tested "
1793 "using Intel (R) Ethernet Optics."
1794 " Using untested modules is not "
1795 "supported and may cause unstable"
1796 " operation or damage to the "
1797 "module or the adapter. Intel "
1798 "Corporation is not responsible "
1799 "for any harm caused by using "
1800 "untested modules.\n", status);
1801 status = IXGBE_SUCCESS;
1803 DEBUGOUT("QSFP module not supported\n");
1805 ixgbe_phy_sfp_unsupported;
1806 status = IXGBE_ERR_SFP_NOT_SUPPORTED;
1810 status = IXGBE_SUCCESS;
1817 err_read_i2c_eeprom:
1818 hw->phy.sfp_type = ixgbe_sfp_type_not_present;
1820 hw->phy.type = ixgbe_phy_unknown;
1822 return IXGBE_ERR_SFP_NOT_PRESENT;
1827 * ixgbe_get_sfp_init_sequence_offsets - Provides offset of PHY init sequence
1828 * @hw: pointer to hardware structure
1829 * @list_offset: offset to the SFP ID list
1830 * @data_offset: offset to the SFP data block
1832 * Checks the MAC's EEPROM to see if it supports a given SFP+ module type, if
1833 * so it returns the offsets to the phy init sequence block.
1835 s32 ixgbe_get_sfp_init_sequence_offsets(struct ixgbe_hw *hw,
1840 u16 sfp_type = hw->phy.sfp_type;
1842 DEBUGFUNC("ixgbe_get_sfp_init_sequence_offsets");
1844 if (hw->phy.sfp_type == ixgbe_sfp_type_unknown)
1845 return IXGBE_ERR_SFP_NOT_SUPPORTED;
1847 if (hw->phy.sfp_type == ixgbe_sfp_type_not_present)
1848 return IXGBE_ERR_SFP_NOT_PRESENT;
1850 if ((hw->device_id == IXGBE_DEV_ID_82598_SR_DUAL_PORT_EM) &&
1851 (hw->phy.sfp_type == ixgbe_sfp_type_da_cu))
1852 return IXGBE_ERR_SFP_NOT_SUPPORTED;
1855 * Limiting active cables and 1G Phys must be initialized as
1858 if (sfp_type == ixgbe_sfp_type_da_act_lmt_core0 ||
1859 sfp_type == ixgbe_sfp_type_1g_lx_core0 ||
1860 sfp_type == ixgbe_sfp_type_1g_cu_core0 ||
1861 sfp_type == ixgbe_sfp_type_1g_sx_core0)
1862 sfp_type = ixgbe_sfp_type_srlr_core0;
1863 else if (sfp_type == ixgbe_sfp_type_da_act_lmt_core1 ||
1864 sfp_type == ixgbe_sfp_type_1g_lx_core1 ||
1865 sfp_type == ixgbe_sfp_type_1g_cu_core1 ||
1866 sfp_type == ixgbe_sfp_type_1g_sx_core1)
1867 sfp_type = ixgbe_sfp_type_srlr_core1;
1869 /* Read offset to PHY init contents */
1870 if (hw->eeprom.ops.read(hw, IXGBE_PHY_INIT_OFFSET_NL, list_offset)) {
1871 ERROR_REPORT2(IXGBE_ERROR_INVALID_STATE,
1872 "eeprom read at offset %d failed",
1873 IXGBE_PHY_INIT_OFFSET_NL);
1874 return IXGBE_ERR_SFP_NO_INIT_SEQ_PRESENT;
1877 if ((!*list_offset) || (*list_offset == 0xFFFF))
1878 return IXGBE_ERR_SFP_NO_INIT_SEQ_PRESENT;
1880 /* Shift offset to first ID word */
1884 * Find the matching SFP ID in the EEPROM
1885 * and program the init sequence
1887 if (hw->eeprom.ops.read(hw, *list_offset, &sfp_id))
1890 while (sfp_id != IXGBE_PHY_INIT_END_NL) {
1891 if (sfp_id == sfp_type) {
1893 if (hw->eeprom.ops.read(hw, *list_offset, data_offset))
1895 if ((!*data_offset) || (*data_offset == 0xFFFF)) {
1896 DEBUGOUT("SFP+ module not supported\n");
1897 return IXGBE_ERR_SFP_NOT_SUPPORTED;
1902 (*list_offset) += 2;
1903 if (hw->eeprom.ops.read(hw, *list_offset, &sfp_id))
1908 if (sfp_id == IXGBE_PHY_INIT_END_NL) {
1909 DEBUGOUT("No matching SFP+ module found\n");
1910 return IXGBE_ERR_SFP_NOT_SUPPORTED;
1913 return IXGBE_SUCCESS;
1916 ERROR_REPORT2(IXGBE_ERROR_INVALID_STATE,
1917 "eeprom read at offset %d failed", *list_offset);
1918 return IXGBE_ERR_PHY;
1922 * ixgbe_read_i2c_eeprom_generic - Reads 8 bit EEPROM word over I2C interface
1923 * @hw: pointer to hardware structure
1924 * @byte_offset: EEPROM byte offset to read
1925 * @eeprom_data: value read
1927 * Performs byte read operation to SFP module's EEPROM over I2C interface.
1929 s32 ixgbe_read_i2c_eeprom_generic(struct ixgbe_hw *hw, u8 byte_offset,
1932 DEBUGFUNC("ixgbe_read_i2c_eeprom_generic");
1934 return hw->phy.ops.read_i2c_byte(hw, byte_offset,
1935 IXGBE_I2C_EEPROM_DEV_ADDR,
1940 * ixgbe_read_i2c_sff8472_generic - Reads 8 bit word over I2C interface
1941 * @hw: pointer to hardware structure
1942 * @byte_offset: byte offset at address 0xA2
1943 * @eeprom_data: value read
1945 * Performs byte read operation to SFP module's SFF-8472 data over I2C
1947 STATIC s32 ixgbe_read_i2c_sff8472_generic(struct ixgbe_hw *hw, u8 byte_offset,
1950 return hw->phy.ops.read_i2c_byte(hw, byte_offset,
1951 IXGBE_I2C_EEPROM_DEV_ADDR2,
1956 * ixgbe_write_i2c_eeprom_generic - Writes 8 bit EEPROM word over I2C interface
1957 * @hw: pointer to hardware structure
1958 * @byte_offset: EEPROM byte offset to write
1959 * @eeprom_data: value to write
1961 * Performs byte write operation to SFP module's EEPROM over I2C interface.
1963 s32 ixgbe_write_i2c_eeprom_generic(struct ixgbe_hw *hw, u8 byte_offset,
1966 DEBUGFUNC("ixgbe_write_i2c_eeprom_generic");
1968 return hw->phy.ops.write_i2c_byte(hw, byte_offset,
1969 IXGBE_I2C_EEPROM_DEV_ADDR,
1974 * ixgbe_is_sfp_probe - Returns true if SFP is being detected
1975 * @hw: pointer to hardware structure
1976 * @offset: eeprom offset to be read
1977 * @addr: I2C address to be read
1979 STATIC bool ixgbe_is_sfp_probe(struct ixgbe_hw *hw, u8 offset, u8 addr)
1981 if (addr == IXGBE_I2C_EEPROM_DEV_ADDR &&
1982 offset == IXGBE_SFF_IDENTIFIER &&
1983 hw->phy.sfp_type == ixgbe_sfp_type_not_present)
1989 * ixgbe_read_i2c_byte_generic_int - Reads 8 bit word over I2C
1990 * @hw: pointer to hardware structure
1991 * @byte_offset: byte offset to read
1993 * @lock: true if to take and release semaphore
1995 * Performs byte read operation to SFP module's EEPROM over I2C interface at
1996 * a specified device address.
1998 STATIC s32 ixgbe_read_i2c_byte_generic_int(struct ixgbe_hw *hw, u8 byte_offset,
1999 u8 dev_addr, u8 *data, bool lock)
2004 u32 swfw_mask = hw->phy.phy_semaphore_mask;
2008 DEBUGFUNC("ixgbe_read_i2c_byte_generic");
2010 if (hw->mac.type >= ixgbe_mac_X550)
2012 if (ixgbe_is_sfp_probe(hw, byte_offset, dev_addr))
2013 max_retry = IXGBE_SFP_DETECT_RETRIES;
2016 if (lock && hw->mac.ops.acquire_swfw_sync(hw, swfw_mask))
2017 return IXGBE_ERR_SWFW_SYNC;
2019 ixgbe_i2c_start(hw);
2021 /* Device Address and write indication */
2022 status = ixgbe_clock_out_i2c_byte(hw, dev_addr);
2023 if (status != IXGBE_SUCCESS)
2026 status = ixgbe_get_i2c_ack(hw);
2027 if (status != IXGBE_SUCCESS)
2030 status = ixgbe_clock_out_i2c_byte(hw, byte_offset);
2031 if (status != IXGBE_SUCCESS)
2034 status = ixgbe_get_i2c_ack(hw);
2035 if (status != IXGBE_SUCCESS)
2038 ixgbe_i2c_start(hw);
2040 /* Device Address and read indication */
2041 status = ixgbe_clock_out_i2c_byte(hw, (dev_addr | 0x1));
2042 if (status != IXGBE_SUCCESS)
2045 status = ixgbe_get_i2c_ack(hw);
2046 if (status != IXGBE_SUCCESS)
2049 status = ixgbe_clock_in_i2c_byte(hw, data);
2050 if (status != IXGBE_SUCCESS)
2053 status = ixgbe_clock_out_i2c_bit(hw, nack);
2054 if (status != IXGBE_SUCCESS)
2059 hw->mac.ops.release_swfw_sync(hw, swfw_mask);
2060 return IXGBE_SUCCESS;
2063 ixgbe_i2c_bus_clear(hw);
2065 hw->mac.ops.release_swfw_sync(hw, swfw_mask);
2069 if (retry < max_retry)
2070 DEBUGOUT("I2C byte read error - Retrying.\n");
2072 DEBUGOUT("I2C byte read error.\n");
2074 } while (retry < max_retry);
2080 * ixgbe_read_i2c_byte_generic - Reads 8 bit word over I2C
2081 * @hw: pointer to hardware structure
2082 * @byte_offset: byte offset to read
2085 * Performs byte read operation to SFP module's EEPROM over I2C interface at
2086 * a specified device address.
2088 s32 ixgbe_read_i2c_byte_generic(struct ixgbe_hw *hw, u8 byte_offset,
2089 u8 dev_addr, u8 *data)
2091 return ixgbe_read_i2c_byte_generic_int(hw, byte_offset, dev_addr,
2096 * ixgbe_read_i2c_byte_generic_unlocked - Reads 8 bit word over I2C
2097 * @hw: pointer to hardware structure
2098 * @byte_offset: byte offset to read
2101 * Performs byte read operation to SFP module's EEPROM over I2C interface at
2102 * a specified device address.
2104 s32 ixgbe_read_i2c_byte_generic_unlocked(struct ixgbe_hw *hw, u8 byte_offset,
2105 u8 dev_addr, u8 *data)
2107 return ixgbe_read_i2c_byte_generic_int(hw, byte_offset, dev_addr,
2112 * ixgbe_write_i2c_byte_generic_int - Writes 8 bit word over I2C
2113 * @hw: pointer to hardware structure
2114 * @byte_offset: byte offset to write
2115 * @data: value to write
2116 * @lock: true if to take and release semaphore
2118 * Performs byte write operation to SFP module's EEPROM over I2C interface at
2119 * a specified device address.
2121 STATIC s32 ixgbe_write_i2c_byte_generic_int(struct ixgbe_hw *hw, u8 byte_offset,
2122 u8 dev_addr, u8 data, bool lock)
2127 u32 swfw_mask = hw->phy.phy_semaphore_mask;
2129 DEBUGFUNC("ixgbe_write_i2c_byte_generic");
2131 if (lock && hw->mac.ops.acquire_swfw_sync(hw, swfw_mask) !=
2133 return IXGBE_ERR_SWFW_SYNC;
2136 ixgbe_i2c_start(hw);
2138 status = ixgbe_clock_out_i2c_byte(hw, dev_addr);
2139 if (status != IXGBE_SUCCESS)
2142 status = ixgbe_get_i2c_ack(hw);
2143 if (status != IXGBE_SUCCESS)
2146 status = ixgbe_clock_out_i2c_byte(hw, byte_offset);
2147 if (status != IXGBE_SUCCESS)
2150 status = ixgbe_get_i2c_ack(hw);
2151 if (status != IXGBE_SUCCESS)
2154 status = ixgbe_clock_out_i2c_byte(hw, data);
2155 if (status != IXGBE_SUCCESS)
2158 status = ixgbe_get_i2c_ack(hw);
2159 if (status != IXGBE_SUCCESS)
2164 hw->mac.ops.release_swfw_sync(hw, swfw_mask);
2165 return IXGBE_SUCCESS;
2168 ixgbe_i2c_bus_clear(hw);
2170 if (retry < max_retry)
2171 DEBUGOUT("I2C byte write error - Retrying.\n");
2173 DEBUGOUT("I2C byte write error.\n");
2174 } while (retry < max_retry);
2177 hw->mac.ops.release_swfw_sync(hw, swfw_mask);
2183 * ixgbe_write_i2c_byte_generic - Writes 8 bit word over I2C
2184 * @hw: pointer to hardware structure
2185 * @byte_offset: byte offset to write
2186 * @data: value to write
2188 * Performs byte write operation to SFP module's EEPROM over I2C interface at
2189 * a specified device address.
2191 s32 ixgbe_write_i2c_byte_generic(struct ixgbe_hw *hw, u8 byte_offset,
2192 u8 dev_addr, u8 data)
2194 return ixgbe_write_i2c_byte_generic_int(hw, byte_offset, dev_addr,
2199 * ixgbe_write_i2c_byte_generic_unlocked - Writes 8 bit word over I2C
2200 * @hw: pointer to hardware structure
2201 * @byte_offset: byte offset to write
2202 * @data: value to write
2204 * Performs byte write operation to SFP module's EEPROM over I2C interface at
2205 * a specified device address.
2207 s32 ixgbe_write_i2c_byte_generic_unlocked(struct ixgbe_hw *hw, u8 byte_offset,
2208 u8 dev_addr, u8 data)
2210 return ixgbe_write_i2c_byte_generic_int(hw, byte_offset, dev_addr,
2215 * ixgbe_i2c_start - Sets I2C start condition
2216 * @hw: pointer to hardware structure
2218 * Sets I2C start condition (High -> Low on SDA while SCL is High)
2219 * Set bit-bang mode on X550 hardware.
2221 STATIC void ixgbe_i2c_start(struct ixgbe_hw *hw)
2223 u32 i2cctl = IXGBE_READ_REG(hw, IXGBE_I2CCTL_BY_MAC(hw));
2225 DEBUGFUNC("ixgbe_i2c_start");
2227 i2cctl |= IXGBE_I2C_BB_EN_BY_MAC(hw);
2229 /* Start condition must begin with data and clock high */
2230 ixgbe_set_i2c_data(hw, &i2cctl, 1);
2231 ixgbe_raise_i2c_clk(hw, &i2cctl);
2233 /* Setup time for start condition (4.7us) */
2234 usec_delay(IXGBE_I2C_T_SU_STA);
2236 ixgbe_set_i2c_data(hw, &i2cctl, 0);
2238 /* Hold time for start condition (4us) */
2239 usec_delay(IXGBE_I2C_T_HD_STA);
2241 ixgbe_lower_i2c_clk(hw, &i2cctl);
2243 /* Minimum low period of clock is 4.7 us */
2244 usec_delay(IXGBE_I2C_T_LOW);
2249 * ixgbe_i2c_stop - Sets I2C stop condition
2250 * @hw: pointer to hardware structure
2252 * Sets I2C stop condition (Low -> High on SDA while SCL is High)
2253 * Disables bit-bang mode and negates data output enable on X550
2256 STATIC void ixgbe_i2c_stop(struct ixgbe_hw *hw)
2258 u32 i2cctl = IXGBE_READ_REG(hw, IXGBE_I2CCTL_BY_MAC(hw));
2259 u32 data_oe_bit = IXGBE_I2C_DATA_OE_N_EN_BY_MAC(hw);
2260 u32 clk_oe_bit = IXGBE_I2C_CLK_OE_N_EN_BY_MAC(hw);
2261 u32 bb_en_bit = IXGBE_I2C_BB_EN_BY_MAC(hw);
2263 DEBUGFUNC("ixgbe_i2c_stop");
2265 /* Stop condition must begin with data low and clock high */
2266 ixgbe_set_i2c_data(hw, &i2cctl, 0);
2267 ixgbe_raise_i2c_clk(hw, &i2cctl);
2269 /* Setup time for stop condition (4us) */
2270 usec_delay(IXGBE_I2C_T_SU_STO);
2272 ixgbe_set_i2c_data(hw, &i2cctl, 1);
2274 /* bus free time between stop and start (4.7us)*/
2275 usec_delay(IXGBE_I2C_T_BUF);
2277 if (bb_en_bit || data_oe_bit || clk_oe_bit) {
2278 i2cctl &= ~bb_en_bit;
2279 i2cctl |= data_oe_bit | clk_oe_bit;
2280 IXGBE_WRITE_REG(hw, IXGBE_I2CCTL_BY_MAC(hw), i2cctl);
2281 IXGBE_WRITE_FLUSH(hw);
2286 * ixgbe_clock_in_i2c_byte - Clocks in one byte via I2C
2287 * @hw: pointer to hardware structure
2288 * @data: data byte to clock in
2290 * Clocks in one byte data via I2C data/clock
2292 STATIC s32 ixgbe_clock_in_i2c_byte(struct ixgbe_hw *hw, u8 *data)
2297 DEBUGFUNC("ixgbe_clock_in_i2c_byte");
2300 for (i = 7; i >= 0; i--) {
2301 ixgbe_clock_in_i2c_bit(hw, &bit);
2305 return IXGBE_SUCCESS;
2309 * ixgbe_clock_out_i2c_byte - Clocks out one byte via I2C
2310 * @hw: pointer to hardware structure
2311 * @data: data byte clocked out
2313 * Clocks out one byte data via I2C data/clock
2315 STATIC s32 ixgbe_clock_out_i2c_byte(struct ixgbe_hw *hw, u8 data)
2317 s32 status = IXGBE_SUCCESS;
2322 DEBUGFUNC("ixgbe_clock_out_i2c_byte");
2324 for (i = 7; i >= 0; i--) {
2325 bit = (data >> i) & 0x1;
2326 status = ixgbe_clock_out_i2c_bit(hw, bit);
2328 if (status != IXGBE_SUCCESS)
2332 /* Release SDA line (set high) */
2333 i2cctl = IXGBE_READ_REG(hw, IXGBE_I2CCTL_BY_MAC(hw));
2334 i2cctl |= IXGBE_I2C_DATA_OUT_BY_MAC(hw);
2335 i2cctl |= IXGBE_I2C_DATA_OE_N_EN_BY_MAC(hw);
2336 IXGBE_WRITE_REG(hw, IXGBE_I2CCTL_BY_MAC(hw), i2cctl);
2337 IXGBE_WRITE_FLUSH(hw);
2343 * ixgbe_get_i2c_ack - Polls for I2C ACK
2344 * @hw: pointer to hardware structure
2346 * Clocks in/out one bit via I2C data/clock
2348 STATIC s32 ixgbe_get_i2c_ack(struct ixgbe_hw *hw)
2350 u32 data_oe_bit = IXGBE_I2C_DATA_OE_N_EN_BY_MAC(hw);
2351 s32 status = IXGBE_SUCCESS;
2353 u32 i2cctl = IXGBE_READ_REG(hw, IXGBE_I2CCTL_BY_MAC(hw));
2357 DEBUGFUNC("ixgbe_get_i2c_ack");
2360 i2cctl |= IXGBE_I2C_DATA_OUT_BY_MAC(hw);
2361 i2cctl |= data_oe_bit;
2362 IXGBE_WRITE_REG(hw, IXGBE_I2CCTL_BY_MAC(hw), i2cctl);
2363 IXGBE_WRITE_FLUSH(hw);
2365 ixgbe_raise_i2c_clk(hw, &i2cctl);
2367 /* Minimum high period of clock is 4us */
2368 usec_delay(IXGBE_I2C_T_HIGH);
2370 /* Poll for ACK. Note that ACK in I2C spec is
2371 * transition from 1 to 0 */
2372 for (i = 0; i < timeout; i++) {
2373 i2cctl = IXGBE_READ_REG(hw, IXGBE_I2CCTL_BY_MAC(hw));
2374 ack = ixgbe_get_i2c_data(hw, &i2cctl);
2382 DEBUGOUT("I2C ack was not received.\n");
2383 status = IXGBE_ERR_I2C;
2386 ixgbe_lower_i2c_clk(hw, &i2cctl);
2388 /* Minimum low period of clock is 4.7 us */
2389 usec_delay(IXGBE_I2C_T_LOW);
2395 * ixgbe_clock_in_i2c_bit - Clocks in one bit via I2C data/clock
2396 * @hw: pointer to hardware structure
2397 * @data: read data value
2399 * Clocks in one bit via I2C data/clock
2401 STATIC s32 ixgbe_clock_in_i2c_bit(struct ixgbe_hw *hw, bool *data)
2403 u32 i2cctl = IXGBE_READ_REG(hw, IXGBE_I2CCTL_BY_MAC(hw));
2404 u32 data_oe_bit = IXGBE_I2C_DATA_OE_N_EN_BY_MAC(hw);
2406 DEBUGFUNC("ixgbe_clock_in_i2c_bit");
2409 i2cctl |= IXGBE_I2C_DATA_OUT_BY_MAC(hw);
2410 i2cctl |= data_oe_bit;
2411 IXGBE_WRITE_REG(hw, IXGBE_I2CCTL_BY_MAC(hw), i2cctl);
2412 IXGBE_WRITE_FLUSH(hw);
2414 ixgbe_raise_i2c_clk(hw, &i2cctl);
2416 /* Minimum high period of clock is 4us */
2417 usec_delay(IXGBE_I2C_T_HIGH);
2419 i2cctl = IXGBE_READ_REG(hw, IXGBE_I2CCTL_BY_MAC(hw));
2420 *data = ixgbe_get_i2c_data(hw, &i2cctl);
2422 ixgbe_lower_i2c_clk(hw, &i2cctl);
2424 /* Minimum low period of clock is 4.7 us */
2425 usec_delay(IXGBE_I2C_T_LOW);
2427 return IXGBE_SUCCESS;
2431 * ixgbe_clock_out_i2c_bit - Clocks in/out one bit via I2C data/clock
2432 * @hw: pointer to hardware structure
2433 * @data: data value to write
2435 * Clocks out one bit via I2C data/clock
2437 STATIC s32 ixgbe_clock_out_i2c_bit(struct ixgbe_hw *hw, bool data)
2440 u32 i2cctl = IXGBE_READ_REG(hw, IXGBE_I2CCTL_BY_MAC(hw));
2442 DEBUGFUNC("ixgbe_clock_out_i2c_bit");
2444 status = ixgbe_set_i2c_data(hw, &i2cctl, data);
2445 if (status == IXGBE_SUCCESS) {
2446 ixgbe_raise_i2c_clk(hw, &i2cctl);
2448 /* Minimum high period of clock is 4us */
2449 usec_delay(IXGBE_I2C_T_HIGH);
2451 ixgbe_lower_i2c_clk(hw, &i2cctl);
2453 /* Minimum low period of clock is 4.7 us.
2454 * This also takes care of the data hold time.
2456 usec_delay(IXGBE_I2C_T_LOW);
2458 status = IXGBE_ERR_I2C;
2459 ERROR_REPORT2(IXGBE_ERROR_INVALID_STATE,
2460 "I2C data was not set to %X\n", data);
2467 * ixgbe_raise_i2c_clk - Raises the I2C SCL clock
2468 * @hw: pointer to hardware structure
2469 * @i2cctl: Current value of I2CCTL register
2471 * Raises the I2C clock line '0'->'1'
2472 * Negates the I2C clock output enable on X550 hardware.
2474 STATIC void ixgbe_raise_i2c_clk(struct ixgbe_hw *hw, u32 *i2cctl)
2476 u32 clk_oe_bit = IXGBE_I2C_CLK_OE_N_EN_BY_MAC(hw);
2478 u32 timeout = IXGBE_I2C_CLOCK_STRETCHING_TIMEOUT;
2481 DEBUGFUNC("ixgbe_raise_i2c_clk");
2484 *i2cctl |= clk_oe_bit;
2485 IXGBE_WRITE_REG(hw, IXGBE_I2CCTL_BY_MAC(hw), *i2cctl);
2488 for (i = 0; i < timeout; i++) {
2489 *i2cctl |= IXGBE_I2C_CLK_OUT_BY_MAC(hw);
2491 IXGBE_WRITE_REG(hw, IXGBE_I2CCTL_BY_MAC(hw), *i2cctl);
2492 IXGBE_WRITE_FLUSH(hw);
2493 /* SCL rise time (1000ns) */
2494 usec_delay(IXGBE_I2C_T_RISE);
2496 i2cctl_r = IXGBE_READ_REG(hw, IXGBE_I2CCTL_BY_MAC(hw));
2497 if (i2cctl_r & IXGBE_I2C_CLK_IN_BY_MAC(hw))
2503 * ixgbe_lower_i2c_clk - Lowers the I2C SCL clock
2504 * @hw: pointer to hardware structure
2505 * @i2cctl: Current value of I2CCTL register
2507 * Lowers the I2C clock line '1'->'0'
2508 * Asserts the I2C clock output enable on X550 hardware.
2510 STATIC void ixgbe_lower_i2c_clk(struct ixgbe_hw *hw, u32 *i2cctl)
2512 DEBUGFUNC("ixgbe_lower_i2c_clk");
2514 *i2cctl &= ~(IXGBE_I2C_CLK_OUT_BY_MAC(hw));
2515 *i2cctl &= ~IXGBE_I2C_CLK_OE_N_EN_BY_MAC(hw);
2517 IXGBE_WRITE_REG(hw, IXGBE_I2CCTL_BY_MAC(hw), *i2cctl);
2518 IXGBE_WRITE_FLUSH(hw);
2520 /* SCL fall time (300ns) */
2521 usec_delay(IXGBE_I2C_T_FALL);
2525 * ixgbe_set_i2c_data - Sets the I2C data bit
2526 * @hw: pointer to hardware structure
2527 * @i2cctl: Current value of I2CCTL register
2528 * @data: I2C data value (0 or 1) to set
2530 * Sets the I2C data bit
2531 * Asserts the I2C data output enable on X550 hardware.
2533 STATIC s32 ixgbe_set_i2c_data(struct ixgbe_hw *hw, u32 *i2cctl, bool data)
2535 u32 data_oe_bit = IXGBE_I2C_DATA_OE_N_EN_BY_MAC(hw);
2536 s32 status = IXGBE_SUCCESS;
2538 DEBUGFUNC("ixgbe_set_i2c_data");
2541 *i2cctl |= IXGBE_I2C_DATA_OUT_BY_MAC(hw);
2543 *i2cctl &= ~(IXGBE_I2C_DATA_OUT_BY_MAC(hw));
2544 *i2cctl &= ~data_oe_bit;
2546 IXGBE_WRITE_REG(hw, IXGBE_I2CCTL_BY_MAC(hw), *i2cctl);
2547 IXGBE_WRITE_FLUSH(hw);
2549 /* Data rise/fall (1000ns/300ns) and set-up time (250ns) */
2550 usec_delay(IXGBE_I2C_T_RISE + IXGBE_I2C_T_FALL + IXGBE_I2C_T_SU_DATA);
2552 if (!data) /* Can't verify data in this case */
2553 return IXGBE_SUCCESS;
2555 *i2cctl |= data_oe_bit;
2556 IXGBE_WRITE_REG(hw, IXGBE_I2CCTL_BY_MAC(hw), *i2cctl);
2557 IXGBE_WRITE_FLUSH(hw);
2560 /* Verify data was set correctly */
2561 *i2cctl = IXGBE_READ_REG(hw, IXGBE_I2CCTL_BY_MAC(hw));
2562 if (data != ixgbe_get_i2c_data(hw, i2cctl)) {
2563 status = IXGBE_ERR_I2C;
2564 ERROR_REPORT2(IXGBE_ERROR_INVALID_STATE,
2565 "Error - I2C data was not set to %X.\n",
2573 * ixgbe_get_i2c_data - Reads the I2C SDA data bit
2574 * @hw: pointer to hardware structure
2575 * @i2cctl: Current value of I2CCTL register
2577 * Returns the I2C data bit value
2578 * Negates the I2C data output enable on X550 hardware.
2580 STATIC bool ixgbe_get_i2c_data(struct ixgbe_hw *hw, u32 *i2cctl)
2582 u32 data_oe_bit = IXGBE_I2C_DATA_OE_N_EN_BY_MAC(hw);
2585 DEBUGFUNC("ixgbe_get_i2c_data");
2588 *i2cctl |= data_oe_bit;
2589 IXGBE_WRITE_REG(hw, IXGBE_I2CCTL_BY_MAC(hw), *i2cctl);
2590 IXGBE_WRITE_FLUSH(hw);
2591 usec_delay(IXGBE_I2C_T_FALL);
2594 if (*i2cctl & IXGBE_I2C_DATA_IN_BY_MAC(hw))
2603 * ixgbe_i2c_bus_clear - Clears the I2C bus
2604 * @hw: pointer to hardware structure
2606 * Clears the I2C bus by sending nine clock pulses.
2607 * Used when data line is stuck low.
2609 void ixgbe_i2c_bus_clear(struct ixgbe_hw *hw)
2614 DEBUGFUNC("ixgbe_i2c_bus_clear");
2616 ixgbe_i2c_start(hw);
2617 i2cctl = IXGBE_READ_REG(hw, IXGBE_I2CCTL_BY_MAC(hw));
2619 ixgbe_set_i2c_data(hw, &i2cctl, 1);
2621 for (i = 0; i < 9; i++) {
2622 ixgbe_raise_i2c_clk(hw, &i2cctl);
2624 /* Min high period of clock is 4us */
2625 usec_delay(IXGBE_I2C_T_HIGH);
2627 ixgbe_lower_i2c_clk(hw, &i2cctl);
2629 /* Min low period of clock is 4.7us*/
2630 usec_delay(IXGBE_I2C_T_LOW);
2633 ixgbe_i2c_start(hw);
2635 /* Put the i2c bus back to default state */
2640 * ixgbe_tn_check_overtemp - Checks if an overtemp occurred.
2641 * @hw: pointer to hardware structure
2643 * Checks if the LASI temp alarm status was triggered due to overtemp
2645 s32 ixgbe_tn_check_overtemp(struct ixgbe_hw *hw)
2647 s32 status = IXGBE_SUCCESS;
2650 DEBUGFUNC("ixgbe_tn_check_overtemp");
2652 if (hw->device_id != IXGBE_DEV_ID_82599_T3_LOM)
2655 /* Check that the LASI temp alarm status was triggered */
2656 hw->phy.ops.read_reg(hw, IXGBE_TN_LASI_STATUS_REG,
2657 IXGBE_MDIO_PMA_PMD_DEV_TYPE, &phy_data);
2659 if (!(phy_data & IXGBE_TN_LASI_STATUS_TEMP_ALARM))
2662 status = IXGBE_ERR_OVERTEMP;
2663 ERROR_REPORT1(IXGBE_ERROR_CAUTION, "Device over temperature");
2669 * ixgbe_set_copper_phy_power - Control power for copper phy
2670 * @hw: pointer to hardware structure
2671 * @on: true for on, false for off
2673 s32 ixgbe_set_copper_phy_power(struct ixgbe_hw *hw, bool on)
2678 if (!on && ixgbe_mng_present(hw))
2681 status = hw->phy.ops.read_reg(hw, IXGBE_MDIO_VENDOR_SPECIFIC_1_CONTROL,
2682 IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE,
2688 reg &= ~IXGBE_MDIO_PHY_SET_LOW_POWER_MODE;
2690 if (ixgbe_check_reset_blocked(hw))
2692 reg |= IXGBE_MDIO_PHY_SET_LOW_POWER_MODE;
2695 status = hw->phy.ops.write_reg(hw, IXGBE_MDIO_VENDOR_SPECIFIC_1_CONTROL,
2696 IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE,