Home | History | Annotate | Line # | Download | only in ixgbe
ixgbe_phy.c revision 1.7
      1  1.1    dyoung /******************************************************************************
      2  1.1    dyoung 
      3  1.7   msaitoh   Copyright (c) 2001-2014, Intel Corporation
      4  1.1    dyoung   All rights reserved.
      5  1.1    dyoung 
      6  1.1    dyoung   Redistribution and use in source and binary forms, with or without
      7  1.1    dyoung   modification, are permitted provided that the following conditions are met:
      8  1.1    dyoung 
      9  1.1    dyoung    1. Redistributions of source code must retain the above copyright notice,
     10  1.1    dyoung       this list of conditions and the following disclaimer.
     11  1.1    dyoung 
     12  1.1    dyoung    2. Redistributions in binary form must reproduce the above copyright
     13  1.1    dyoung       notice, this list of conditions and the following disclaimer in the
     14  1.1    dyoung       documentation and/or other materials provided with the distribution.
     15  1.1    dyoung 
     16  1.1    dyoung    3. Neither the name of the Intel Corporation nor the names of its
     17  1.1    dyoung       contributors may be used to endorse or promote products derived from
     18  1.1    dyoung       this software without specific prior written permission.
     19  1.1    dyoung 
     20  1.1    dyoung   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
     21  1.1    dyoung   AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     22  1.1    dyoung   IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     23  1.1    dyoung   ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
     24  1.1    dyoung   LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     25  1.1    dyoung   CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     26  1.1    dyoung   SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     27  1.1    dyoung   INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     28  1.1    dyoung   CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     29  1.1    dyoung   ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     30  1.1    dyoung   POSSIBILITY OF SUCH DAMAGE.
     31  1.1    dyoung 
     32  1.1    dyoung ******************************************************************************/
     33  1.7   msaitoh /*$FreeBSD: head/sys/dev/ixgbe/ixgbe_phy.c 280182 2015-03-17 18:32:28Z jfv $*/
     34  1.7   msaitoh /*$NetBSD: ixgbe_phy.c,v 1.7 2016/12/01 06:27:18 msaitoh Exp $*/
     35  1.1    dyoung 
     36  1.1    dyoung #include "ixgbe_api.h"
     37  1.1    dyoung #include "ixgbe_common.h"
     38  1.1    dyoung #include "ixgbe_phy.h"
     39  1.1    dyoung 
     40  1.1    dyoung static void ixgbe_i2c_start(struct ixgbe_hw *hw);
     41  1.1    dyoung static void ixgbe_i2c_stop(struct ixgbe_hw *hw);
     42  1.1    dyoung static s32 ixgbe_clock_in_i2c_byte(struct ixgbe_hw *hw, u8 *data);
     43  1.1    dyoung static s32 ixgbe_clock_out_i2c_byte(struct ixgbe_hw *hw, u8 data);
     44  1.1    dyoung static s32 ixgbe_get_i2c_ack(struct ixgbe_hw *hw);
     45  1.1    dyoung static s32 ixgbe_clock_in_i2c_bit(struct ixgbe_hw *hw, bool *data);
     46  1.1    dyoung static s32 ixgbe_clock_out_i2c_bit(struct ixgbe_hw *hw, bool data);
     47  1.3   msaitoh static void ixgbe_raise_i2c_clk(struct ixgbe_hw *hw, u32 *i2cctl);
     48  1.1    dyoung static void ixgbe_lower_i2c_clk(struct ixgbe_hw *hw, u32 *i2cctl);
     49  1.1    dyoung static s32 ixgbe_set_i2c_data(struct ixgbe_hw *hw, u32 *i2cctl, bool data);
     50  1.7   msaitoh static bool ixgbe_get_i2c_data(struct ixgbe_hw *hw, u32 *i2cctl);
     51  1.5   msaitoh static s32 ixgbe_read_i2c_sff8472_generic(struct ixgbe_hw *hw, u8 byte_offset,
     52  1.5   msaitoh 					  u8 *sff8472_data);
     53  1.1    dyoung 
     54  1.1    dyoung /**
     55  1.7   msaitoh  * ixgbe_out_i2c_byte_ack - Send I2C byte with ack
     56  1.7   msaitoh  * @hw: pointer to the hardware structure
     57  1.7   msaitoh  * @byte: byte to send
     58  1.7   msaitoh  *
     59  1.7   msaitoh  * Returns an error code on error.
     60  1.7   msaitoh  */
     61  1.7   msaitoh static s32 ixgbe_out_i2c_byte_ack(struct ixgbe_hw *hw, u8 byte)
     62  1.7   msaitoh {
     63  1.7   msaitoh 	s32 status;
     64  1.7   msaitoh 
     65  1.7   msaitoh 	status = ixgbe_clock_out_i2c_byte(hw, byte);
     66  1.7   msaitoh 	if (status)
     67  1.7   msaitoh 		return status;
     68  1.7   msaitoh 	return ixgbe_get_i2c_ack(hw);
     69  1.7   msaitoh }
     70  1.7   msaitoh 
     71  1.7   msaitoh /**
     72  1.7   msaitoh  * ixgbe_in_i2c_byte_ack - Receive an I2C byte and send ack
     73  1.7   msaitoh  * @hw: pointer to the hardware structure
     74  1.7   msaitoh  * @byte: pointer to a u8 to receive the byte
     75  1.7   msaitoh  *
     76  1.7   msaitoh  * Returns an error code on error.
     77  1.7   msaitoh  */
     78  1.7   msaitoh static s32 ixgbe_in_i2c_byte_ack(struct ixgbe_hw *hw, u8 *byte)
     79  1.7   msaitoh {
     80  1.7   msaitoh 	s32 status;
     81  1.7   msaitoh 
     82  1.7   msaitoh 	status = ixgbe_clock_in_i2c_byte(hw, byte);
     83  1.7   msaitoh 	if (status)
     84  1.7   msaitoh 		return status;
     85  1.7   msaitoh 	/* ACK */
     86  1.7   msaitoh 	return ixgbe_clock_out_i2c_bit(hw, FALSE);
     87  1.7   msaitoh }
     88  1.7   msaitoh 
     89  1.7   msaitoh /**
     90  1.7   msaitoh  * ixgbe_ones_comp_byte_add - Perform one's complement addition
     91  1.7   msaitoh  * @add1 - addend 1
     92  1.7   msaitoh  * @add2 - addend 2
     93  1.7   msaitoh  *
     94  1.7   msaitoh  * Returns one's complement 8-bit sum.
     95  1.7   msaitoh  */
     96  1.7   msaitoh static u8 ixgbe_ones_comp_byte_add(u8 add1, u8 add2)
     97  1.7   msaitoh {
     98  1.7   msaitoh 	u16 sum = add1 + add2;
     99  1.7   msaitoh 
    100  1.7   msaitoh 	sum = (sum & 0xFF) + (sum >> 8);
    101  1.7   msaitoh 	return sum & 0xFF;
    102  1.7   msaitoh }
    103  1.7   msaitoh 
    104  1.7   msaitoh /**
    105  1.7   msaitoh  * ixgbe_read_i2c_combined_generic - Perform I2C read combined operation
    106  1.7   msaitoh  * @hw: pointer to the hardware structure
    107  1.7   msaitoh  * @addr: I2C bus address to read from
    108  1.7   msaitoh  * @reg: I2C device register to read from
    109  1.7   msaitoh  * @val: pointer to location to receive read value
    110  1.7   msaitoh  *
    111  1.7   msaitoh  * Returns an error code on error.
    112  1.7   msaitoh  */
    113  1.7   msaitoh static s32 ixgbe_read_i2c_combined_generic(struct ixgbe_hw *hw, u8 addr,
    114  1.7   msaitoh 					   u16 reg, u16 *val)
    115  1.7   msaitoh {
    116  1.7   msaitoh 	u32 swfw_mask = hw->phy.phy_semaphore_mask;
    117  1.7   msaitoh 	int max_retry = 10;
    118  1.7   msaitoh 	int retry = 0;
    119  1.7   msaitoh 	u8 csum_byte;
    120  1.7   msaitoh 	u8 high_bits;
    121  1.7   msaitoh 	u8 low_bits;
    122  1.7   msaitoh 	u8 reg_high;
    123  1.7   msaitoh 	u8 csum;
    124  1.7   msaitoh 
    125  1.7   msaitoh 	reg_high = ((reg >> 7) & 0xFE) | 1;	/* Indicate read combined */
    126  1.7   msaitoh 	csum = ixgbe_ones_comp_byte_add(reg_high, reg & 0xFF);
    127  1.7   msaitoh 	csum = ~csum;
    128  1.7   msaitoh 	do {
    129  1.7   msaitoh 		if (hw->mac.ops.acquire_swfw_sync(hw, swfw_mask))
    130  1.7   msaitoh 			return IXGBE_ERR_SWFW_SYNC;
    131  1.7   msaitoh 		ixgbe_i2c_start(hw);
    132  1.7   msaitoh 		/* Device Address and write indication */
    133  1.7   msaitoh 		if (ixgbe_out_i2c_byte_ack(hw, addr))
    134  1.7   msaitoh 			goto fail;
    135  1.7   msaitoh 		/* Write bits 14:8 */
    136  1.7   msaitoh 		if (ixgbe_out_i2c_byte_ack(hw, reg_high))
    137  1.7   msaitoh 			goto fail;
    138  1.7   msaitoh 		/* Write bits 7:0 */
    139  1.7   msaitoh 		if (ixgbe_out_i2c_byte_ack(hw, reg & 0xFF))
    140  1.7   msaitoh 			goto fail;
    141  1.7   msaitoh 		/* Write csum */
    142  1.7   msaitoh 		if (ixgbe_out_i2c_byte_ack(hw, csum))
    143  1.7   msaitoh 			goto fail;
    144  1.7   msaitoh 		/* Re-start condition */
    145  1.7   msaitoh 		ixgbe_i2c_start(hw);
    146  1.7   msaitoh 		/* Device Address and read indication */
    147  1.7   msaitoh 		if (ixgbe_out_i2c_byte_ack(hw, addr | 1))
    148  1.7   msaitoh 			goto fail;
    149  1.7   msaitoh 		/* Get upper bits */
    150  1.7   msaitoh 		if (ixgbe_in_i2c_byte_ack(hw, &high_bits))
    151  1.7   msaitoh 			goto fail;
    152  1.7   msaitoh 		/* Get low bits */
    153  1.7   msaitoh 		if (ixgbe_in_i2c_byte_ack(hw, &low_bits))
    154  1.7   msaitoh 			goto fail;
    155  1.7   msaitoh 		/* Get csum */
    156  1.7   msaitoh 		if (ixgbe_clock_in_i2c_byte(hw, &csum_byte))
    157  1.7   msaitoh 			goto fail;
    158  1.7   msaitoh 		/* NACK */
    159  1.7   msaitoh 		if (ixgbe_clock_out_i2c_bit(hw, FALSE))
    160  1.7   msaitoh 			goto fail;
    161  1.7   msaitoh 		ixgbe_i2c_stop(hw);
    162  1.7   msaitoh 		hw->mac.ops.release_swfw_sync(hw, swfw_mask);
    163  1.7   msaitoh 		*val = (high_bits << 8) | low_bits;
    164  1.7   msaitoh 		return 0;
    165  1.7   msaitoh 
    166  1.7   msaitoh fail:
    167  1.7   msaitoh 		ixgbe_i2c_bus_clear(hw);
    168  1.7   msaitoh 		hw->mac.ops.release_swfw_sync(hw, swfw_mask);
    169  1.7   msaitoh 		retry++;
    170  1.7   msaitoh 		if (retry < max_retry)
    171  1.7   msaitoh 			DEBUGOUT("I2C byte read combined error - Retrying.\n");
    172  1.7   msaitoh 		else
    173  1.7   msaitoh 			DEBUGOUT("I2C byte read combined error.\n");
    174  1.7   msaitoh 	} while (retry < max_retry);
    175  1.7   msaitoh 
    176  1.7   msaitoh 	return IXGBE_ERR_I2C;
    177  1.7   msaitoh }
    178  1.7   msaitoh 
    179  1.7   msaitoh /**
    180  1.7   msaitoh  * ixgbe_write_i2c_combined_generic - Perform I2C write combined operation
    181  1.7   msaitoh  * @hw: pointer to the hardware structure
    182  1.7   msaitoh  * @addr: I2C bus address to write to
    183  1.7   msaitoh  * @reg: I2C device register to write to
    184  1.7   msaitoh  * @val: value to write
    185  1.7   msaitoh  *
    186  1.7   msaitoh  * Returns an error code on error.
    187  1.7   msaitoh  */
    188  1.7   msaitoh static s32 ixgbe_write_i2c_combined_generic(struct ixgbe_hw *hw,
    189  1.7   msaitoh 					    u8 addr, u16 reg, u16 val)
    190  1.7   msaitoh {
    191  1.7   msaitoh 	int max_retry = 1;
    192  1.7   msaitoh 	int retry = 0;
    193  1.7   msaitoh 	u8 reg_high;
    194  1.7   msaitoh 	u8 csum;
    195  1.7   msaitoh 
    196  1.7   msaitoh 	reg_high = (reg >> 7) & 0xFE;	/* Indicate write combined */
    197  1.7   msaitoh 	csum = ixgbe_ones_comp_byte_add(reg_high, reg & 0xFF);
    198  1.7   msaitoh 	csum = ixgbe_ones_comp_byte_add(csum, val >> 8);
    199  1.7   msaitoh 	csum = ixgbe_ones_comp_byte_add(csum, val & 0xFF);
    200  1.7   msaitoh 	csum = ~csum;
    201  1.7   msaitoh 	do {
    202  1.7   msaitoh 		ixgbe_i2c_start(hw);
    203  1.7   msaitoh 		/* Device Address and write indication */
    204  1.7   msaitoh 		if (ixgbe_out_i2c_byte_ack(hw, addr))
    205  1.7   msaitoh 			goto fail;
    206  1.7   msaitoh 		/* Write bits 14:8 */
    207  1.7   msaitoh 		if (ixgbe_out_i2c_byte_ack(hw, reg_high))
    208  1.7   msaitoh 			goto fail;
    209  1.7   msaitoh 		/* Write bits 7:0 */
    210  1.7   msaitoh 		if (ixgbe_out_i2c_byte_ack(hw, reg & 0xFF))
    211  1.7   msaitoh 			goto fail;
    212  1.7   msaitoh 		/* Write data 15:8 */
    213  1.7   msaitoh 		if (ixgbe_out_i2c_byte_ack(hw, val >> 8))
    214  1.7   msaitoh 			goto fail;
    215  1.7   msaitoh 		/* Write data 7:0 */
    216  1.7   msaitoh 		if (ixgbe_out_i2c_byte_ack(hw, val & 0xFF))
    217  1.7   msaitoh 			goto fail;
    218  1.7   msaitoh 		/* Write csum */
    219  1.7   msaitoh 		if (ixgbe_out_i2c_byte_ack(hw, csum))
    220  1.7   msaitoh 			goto fail;
    221  1.7   msaitoh 		ixgbe_i2c_stop(hw);
    222  1.7   msaitoh 		return 0;
    223  1.7   msaitoh 
    224  1.7   msaitoh fail:
    225  1.7   msaitoh 		ixgbe_i2c_bus_clear(hw);
    226  1.7   msaitoh 		retry++;
    227  1.7   msaitoh 		if (retry < max_retry)
    228  1.7   msaitoh 			DEBUGOUT("I2C byte write combined error - Retrying.\n");
    229  1.7   msaitoh 		else
    230  1.7   msaitoh 			DEBUGOUT("I2C byte write combined error.\n");
    231  1.7   msaitoh 	} while (retry < max_retry);
    232  1.7   msaitoh 
    233  1.7   msaitoh 	return IXGBE_ERR_I2C;
    234  1.7   msaitoh }
    235  1.7   msaitoh 
    236  1.7   msaitoh /**
    237  1.1    dyoung  *  ixgbe_init_phy_ops_generic - Inits PHY function ptrs
    238  1.1    dyoung  *  @hw: pointer to the hardware structure
    239  1.1    dyoung  *
    240  1.1    dyoung  *  Initialize the function pointers.
    241  1.1    dyoung  **/
    242  1.1    dyoung s32 ixgbe_init_phy_ops_generic(struct ixgbe_hw *hw)
    243  1.1    dyoung {
    244  1.1    dyoung 	struct ixgbe_phy_info *phy = &hw->phy;
    245  1.1    dyoung 
    246  1.1    dyoung 	DEBUGFUNC("ixgbe_init_phy_ops_generic");
    247  1.1    dyoung 
    248  1.1    dyoung 	/* PHY */
    249  1.7   msaitoh 	phy->ops.identify = ixgbe_identify_phy_generic;
    250  1.7   msaitoh 	phy->ops.reset = ixgbe_reset_phy_generic;
    251  1.7   msaitoh 	phy->ops.read_reg = ixgbe_read_phy_reg_generic;
    252  1.7   msaitoh 	phy->ops.write_reg = ixgbe_write_phy_reg_generic;
    253  1.7   msaitoh 	phy->ops.read_reg_mdi = ixgbe_read_phy_reg_mdi;
    254  1.7   msaitoh 	phy->ops.write_reg_mdi = ixgbe_write_phy_reg_mdi;
    255  1.7   msaitoh 	phy->ops.setup_link = ixgbe_setup_phy_link_generic;
    256  1.7   msaitoh 	phy->ops.setup_link_speed = ixgbe_setup_phy_link_speed_generic;
    257  1.1    dyoung 	phy->ops.check_link = NULL;
    258  1.1    dyoung 	phy->ops.get_firmware_version = ixgbe_get_phy_firmware_version_generic;
    259  1.7   msaitoh 	phy->ops.read_i2c_byte = ixgbe_read_i2c_byte_generic;
    260  1.7   msaitoh 	phy->ops.write_i2c_byte = ixgbe_write_i2c_byte_generic;
    261  1.7   msaitoh 	phy->ops.read_i2c_sff8472 = ixgbe_read_i2c_sff8472_generic;
    262  1.7   msaitoh 	phy->ops.read_i2c_eeprom = ixgbe_read_i2c_eeprom_generic;
    263  1.7   msaitoh 	phy->ops.write_i2c_eeprom = ixgbe_write_i2c_eeprom_generic;
    264  1.7   msaitoh 	phy->ops.i2c_bus_clear = ixgbe_i2c_bus_clear;
    265  1.7   msaitoh 	phy->ops.identify_sfp = ixgbe_identify_module_generic;
    266  1.1    dyoung 	phy->sfp_type = ixgbe_sfp_type_unknown;
    267  1.7   msaitoh 	phy->ops.read_i2c_combined = ixgbe_read_i2c_combined_generic;
    268  1.7   msaitoh 	phy->ops.write_i2c_combined = ixgbe_write_i2c_combined_generic;
    269  1.7   msaitoh 	phy->ops.check_overtemp = ixgbe_tn_check_overtemp;
    270  1.1    dyoung 	return IXGBE_SUCCESS;
    271  1.1    dyoung }
    272  1.1    dyoung 
    273  1.1    dyoung /**
    274  1.1    dyoung  *  ixgbe_identify_phy_generic - Get physical layer module
    275  1.1    dyoung  *  @hw: pointer to hardware structure
    276  1.1    dyoung  *
    277  1.1    dyoung  *  Determines the physical layer module found on the current adapter.
    278  1.1    dyoung  **/
    279  1.1    dyoung s32 ixgbe_identify_phy_generic(struct ixgbe_hw *hw)
    280  1.1    dyoung {
    281  1.1    dyoung 	s32 status = IXGBE_ERR_PHY_ADDR_INVALID;
    282  1.1    dyoung 	u32 phy_addr;
    283  1.1    dyoung 	u16 ext_ability = 0;
    284  1.1    dyoung 
    285  1.1    dyoung 	DEBUGFUNC("ixgbe_identify_phy_generic");
    286  1.1    dyoung 
    287  1.7   msaitoh 	if (!hw->phy.phy_semaphore_mask) {
    288  1.7   msaitoh 		if (hw->bus.lan_id)
    289  1.7   msaitoh 			hw->phy.phy_semaphore_mask = IXGBE_GSSR_PHY1_SM;
    290  1.7   msaitoh 		else
    291  1.7   msaitoh 			hw->phy.phy_semaphore_mask = IXGBE_GSSR_PHY0_SM;
    292  1.7   msaitoh 	}
    293  1.7   msaitoh 
    294  1.1    dyoung 	if (hw->phy.type == ixgbe_phy_unknown) {
    295  1.1    dyoung 		for (phy_addr = 0; phy_addr < IXGBE_MAX_PHY_ADDR; phy_addr++) {
    296  1.1    dyoung 			if (ixgbe_validate_phy_addr(hw, phy_addr)) {
    297  1.1    dyoung 				hw->phy.addr = phy_addr;
    298  1.1    dyoung 				ixgbe_get_phy_id(hw);
    299  1.1    dyoung 				hw->phy.type =
    300  1.3   msaitoh 					ixgbe_get_phy_type_from_id(hw->phy.id);
    301  1.1    dyoung 
    302  1.1    dyoung 				if (hw->phy.type == ixgbe_phy_unknown) {
    303  1.1    dyoung 					hw->phy.ops.read_reg(hw,
    304  1.1    dyoung 						  IXGBE_MDIO_PHY_EXT_ABILITY,
    305  1.3   msaitoh 						  IXGBE_MDIO_PMA_PMD_DEV_TYPE,
    306  1.3   msaitoh 						  &ext_ability);
    307  1.1    dyoung 					if (ext_ability &
    308  1.1    dyoung 					    (IXGBE_MDIO_PHY_10GBASET_ABILITY |
    309  1.1    dyoung 					     IXGBE_MDIO_PHY_1000BASET_ABILITY))
    310  1.1    dyoung 						hw->phy.type =
    311  1.3   msaitoh 							 ixgbe_phy_cu_unknown;
    312  1.1    dyoung 					else
    313  1.1    dyoung 						hw->phy.type =
    314  1.3   msaitoh 							 ixgbe_phy_generic;
    315  1.1    dyoung 				}
    316  1.1    dyoung 
    317  1.1    dyoung 				status = IXGBE_SUCCESS;
    318  1.1    dyoung 				break;
    319  1.1    dyoung 			}
    320  1.1    dyoung 		}
    321  1.7   msaitoh 
    322  1.7   msaitoh 		/* Certain media types do not have a phy so an address will not
    323  1.7   msaitoh 		 * be found and the code will take this path.  Caller has to
    324  1.7   msaitoh 		 * decide if it is an error or not.
    325  1.7   msaitoh 		 */
    326  1.6   msaitoh 		if (status != IXGBE_SUCCESS) {
    327  1.1    dyoung 			hw->phy.addr = 0;
    328  1.6   msaitoh 		}
    329  1.1    dyoung 	} else {
    330  1.1    dyoung 		status = IXGBE_SUCCESS;
    331  1.1    dyoung 	}
    332  1.1    dyoung 
    333  1.1    dyoung 	return status;
    334  1.1    dyoung }
    335  1.1    dyoung 
    336  1.1    dyoung /**
    337  1.7   msaitoh  * ixgbe_check_reset_blocked - check status of MNG FW veto bit
    338  1.7   msaitoh  * @hw: pointer to the hardware structure
    339  1.7   msaitoh  *
    340  1.7   msaitoh  * This function checks the MMNGC.MNG_VETO bit to see if there are
    341  1.7   msaitoh  * any constraints on link from manageability.  For MAC's that don't
    342  1.7   msaitoh  * have this bit just return faluse since the link can not be blocked
    343  1.7   msaitoh  * via this method.
    344  1.7   msaitoh  **/
    345  1.7   msaitoh s32 ixgbe_check_reset_blocked(struct ixgbe_hw *hw)
    346  1.7   msaitoh {
    347  1.7   msaitoh 	u32 mmngc;
    348  1.7   msaitoh 
    349  1.7   msaitoh 	DEBUGFUNC("ixgbe_check_reset_blocked");
    350  1.7   msaitoh 
    351  1.7   msaitoh 	/* If we don't have this bit, it can't be blocking */
    352  1.7   msaitoh 	if (hw->mac.type == ixgbe_mac_82598EB)
    353  1.7   msaitoh 		return FALSE;
    354  1.7   msaitoh 
    355  1.7   msaitoh 	mmngc = IXGBE_READ_REG(hw, IXGBE_MMNGC);
    356  1.7   msaitoh 	if (mmngc & IXGBE_MMNGC_MNG_VETO) {
    357  1.7   msaitoh 		ERROR_REPORT1(IXGBE_ERROR_SOFTWARE,
    358  1.7   msaitoh 			      "MNG_VETO bit detected.\n");
    359  1.7   msaitoh 		return TRUE;
    360  1.7   msaitoh 	}
    361  1.7   msaitoh 
    362  1.7   msaitoh 	return FALSE;
    363  1.7   msaitoh }
    364  1.7   msaitoh 
    365  1.7   msaitoh /**
    366  1.1    dyoung  *  ixgbe_validate_phy_addr - Determines phy address is valid
    367  1.1    dyoung  *  @hw: pointer to hardware structure
    368  1.1    dyoung  *
    369  1.1    dyoung  **/
    370  1.1    dyoung bool ixgbe_validate_phy_addr(struct ixgbe_hw *hw, u32 phy_addr)
    371  1.1    dyoung {
    372  1.1    dyoung 	u16 phy_id = 0;
    373  1.1    dyoung 	bool valid = FALSE;
    374  1.1    dyoung 
    375  1.1    dyoung 	DEBUGFUNC("ixgbe_validate_phy_addr");
    376  1.1    dyoung 
    377  1.1    dyoung 	hw->phy.addr = phy_addr;
    378  1.1    dyoung 	hw->phy.ops.read_reg(hw, IXGBE_MDIO_PHY_ID_HIGH,
    379  1.3   msaitoh 			     IXGBE_MDIO_PMA_PMD_DEV_TYPE, &phy_id);
    380  1.1    dyoung 
    381  1.1    dyoung 	if (phy_id != 0xFFFF && phy_id != 0x0)
    382  1.1    dyoung 		valid = TRUE;
    383  1.1    dyoung 
    384  1.1    dyoung 	return valid;
    385  1.1    dyoung }
    386  1.1    dyoung 
    387  1.1    dyoung /**
    388  1.1    dyoung  *  ixgbe_get_phy_id - Get the phy type
    389  1.1    dyoung  *  @hw: pointer to hardware structure
    390  1.1    dyoung  *
    391  1.1    dyoung  **/
    392  1.1    dyoung s32 ixgbe_get_phy_id(struct ixgbe_hw *hw)
    393  1.1    dyoung {
    394  1.1    dyoung 	u32 status;
    395  1.1    dyoung 	u16 phy_id_high = 0;
    396  1.1    dyoung 	u16 phy_id_low = 0;
    397  1.1    dyoung 
    398  1.1    dyoung 	DEBUGFUNC("ixgbe_get_phy_id");
    399  1.1    dyoung 
    400  1.1    dyoung 	status = hw->phy.ops.read_reg(hw, IXGBE_MDIO_PHY_ID_HIGH,
    401  1.3   msaitoh 				      IXGBE_MDIO_PMA_PMD_DEV_TYPE,
    402  1.3   msaitoh 				      &phy_id_high);
    403  1.1    dyoung 
    404  1.1    dyoung 	if (status == IXGBE_SUCCESS) {
    405  1.1    dyoung 		hw->phy.id = (u32)(phy_id_high << 16);
    406  1.1    dyoung 		status = hw->phy.ops.read_reg(hw, IXGBE_MDIO_PHY_ID_LOW,
    407  1.3   msaitoh 					      IXGBE_MDIO_PMA_PMD_DEV_TYPE,
    408  1.3   msaitoh 					      &phy_id_low);
    409  1.1    dyoung 		hw->phy.id |= (u32)(phy_id_low & IXGBE_PHY_REVISION_MASK);
    410  1.1    dyoung 		hw->phy.revision = (u32)(phy_id_low & ~IXGBE_PHY_REVISION_MASK);
    411  1.1    dyoung 	}
    412  1.1    dyoung 	return status;
    413  1.1    dyoung }
    414  1.1    dyoung 
    415  1.1    dyoung /**
    416  1.1    dyoung  *  ixgbe_get_phy_type_from_id - Get the phy type
    417  1.1    dyoung  *  @hw: pointer to hardware structure
    418  1.1    dyoung  *
    419  1.1    dyoung  **/
    420  1.1    dyoung enum ixgbe_phy_type ixgbe_get_phy_type_from_id(u32 phy_id)
    421  1.1    dyoung {
    422  1.1    dyoung 	enum ixgbe_phy_type phy_type;
    423  1.1    dyoung 
    424  1.1    dyoung 	DEBUGFUNC("ixgbe_get_phy_type_from_id");
    425  1.1    dyoung 
    426  1.1    dyoung 	switch (phy_id) {
    427  1.1    dyoung 	case TN1010_PHY_ID:
    428  1.1    dyoung 		phy_type = ixgbe_phy_tn;
    429  1.1    dyoung 		break;
    430  1.7   msaitoh 	case X550_PHY_ID:
    431  1.3   msaitoh 	case X540_PHY_ID:
    432  1.1    dyoung 		phy_type = ixgbe_phy_aq;
    433  1.1    dyoung 		break;
    434  1.1    dyoung 	case QT2022_PHY_ID:
    435  1.1    dyoung 		phy_type = ixgbe_phy_qt;
    436  1.1    dyoung 		break;
    437  1.1    dyoung 	case ATH_PHY_ID:
    438  1.1    dyoung 		phy_type = ixgbe_phy_nl;
    439  1.1    dyoung 		break;
    440  1.7   msaitoh 	case X557_PHY_ID:
    441  1.7   msaitoh 		phy_type = ixgbe_phy_x550em_ext_t;
    442  1.7   msaitoh 		break;
    443  1.1    dyoung 	default:
    444  1.1    dyoung 		phy_type = ixgbe_phy_unknown;
    445  1.1    dyoung 		break;
    446  1.1    dyoung 	}
    447  1.1    dyoung 
    448  1.1    dyoung 	DEBUGOUT1("phy type found is %d\n", phy_type);
    449  1.1    dyoung 	return phy_type;
    450  1.1    dyoung }
    451  1.1    dyoung 
    452  1.1    dyoung /**
    453  1.1    dyoung  *  ixgbe_reset_phy_generic - Performs a PHY reset
    454  1.1    dyoung  *  @hw: pointer to hardware structure
    455  1.1    dyoung  **/
    456  1.1    dyoung s32 ixgbe_reset_phy_generic(struct ixgbe_hw *hw)
    457  1.1    dyoung {
    458  1.1    dyoung 	u32 i;
    459  1.1    dyoung 	u16 ctrl = 0;
    460  1.1    dyoung 	s32 status = IXGBE_SUCCESS;
    461  1.1    dyoung 
    462  1.1    dyoung 	DEBUGFUNC("ixgbe_reset_phy_generic");
    463  1.1    dyoung 
    464  1.1    dyoung 	if (hw->phy.type == ixgbe_phy_unknown)
    465  1.1    dyoung 		status = ixgbe_identify_phy_generic(hw);
    466  1.1    dyoung 
    467  1.1    dyoung 	if (status != IXGBE_SUCCESS || hw->phy.type == ixgbe_phy_none)
    468  1.1    dyoung 		goto out;
    469  1.1    dyoung 
    470  1.1    dyoung 	/* Don't reset PHY if it's shut down due to overtemp. */
    471  1.1    dyoung 	if (!hw->phy.reset_if_overtemp &&
    472  1.1    dyoung 	    (IXGBE_ERR_OVERTEMP == hw->phy.ops.check_overtemp(hw)))
    473  1.1    dyoung 		goto out;
    474  1.1    dyoung 
    475  1.7   msaitoh 	/* Blocked by MNG FW so bail */
    476  1.7   msaitoh 	if (ixgbe_check_reset_blocked(hw))
    477  1.7   msaitoh 		goto out;
    478  1.7   msaitoh 
    479  1.1    dyoung 	/*
    480  1.1    dyoung 	 * Perform soft PHY reset to the PHY_XS.
    481  1.1    dyoung 	 * This will cause a soft reset to the PHY
    482  1.1    dyoung 	 */
    483  1.1    dyoung 	hw->phy.ops.write_reg(hw, IXGBE_MDIO_PHY_XS_CONTROL,
    484  1.3   msaitoh 			      IXGBE_MDIO_PHY_XS_DEV_TYPE,
    485  1.3   msaitoh 			      IXGBE_MDIO_PHY_XS_RESET);
    486  1.1    dyoung 
    487  1.1    dyoung 	/*
    488  1.1    dyoung 	 * Poll for reset bit to self-clear indicating reset is complete.
    489  1.1    dyoung 	 * Some PHYs could take up to 3 seconds to complete and need about
    490  1.1    dyoung 	 * 1.7 usec delay after the reset is complete.
    491  1.1    dyoung 	 */
    492  1.1    dyoung 	for (i = 0; i < 30; i++) {
    493  1.1    dyoung 		msec_delay(100);
    494  1.1    dyoung 		hw->phy.ops.read_reg(hw, IXGBE_MDIO_PHY_XS_CONTROL,
    495  1.3   msaitoh 				     IXGBE_MDIO_PHY_XS_DEV_TYPE, &ctrl);
    496  1.1    dyoung 		if (!(ctrl & IXGBE_MDIO_PHY_XS_RESET)) {
    497  1.1    dyoung 			usec_delay(2);
    498  1.1    dyoung 			break;
    499  1.1    dyoung 		}
    500  1.1    dyoung 	}
    501  1.1    dyoung 
    502  1.1    dyoung 	if (ctrl & IXGBE_MDIO_PHY_XS_RESET) {
    503  1.1    dyoung 		status = IXGBE_ERR_RESET_FAILED;
    504  1.6   msaitoh 		ERROR_REPORT1(IXGBE_ERROR_POLLING,
    505  1.6   msaitoh 			     "PHY reset polling failed to complete.\n");
    506  1.1    dyoung 	}
    507  1.1    dyoung 
    508  1.1    dyoung out:
    509  1.1    dyoung 	return status;
    510  1.1    dyoung }
    511  1.1    dyoung 
    512  1.1    dyoung /**
    513  1.6   msaitoh  *  ixgbe_read_phy_mdi - Reads a value from a specified PHY register without
    514  1.6   msaitoh  *  the SWFW lock
    515  1.6   msaitoh  *  @hw: pointer to hardware structure
    516  1.6   msaitoh  *  @reg_addr: 32 bit address of PHY register to read
    517  1.6   msaitoh  *  @phy_data: Pointer to read data from PHY register
    518  1.6   msaitoh  **/
    519  1.6   msaitoh s32 ixgbe_read_phy_reg_mdi(struct ixgbe_hw *hw, u32 reg_addr, u32 device_type,
    520  1.6   msaitoh 		       u16 *phy_data)
    521  1.6   msaitoh {
    522  1.6   msaitoh 	u32 i, data, command;
    523  1.6   msaitoh 
    524  1.6   msaitoh 	/* Setup and write the address cycle command */
    525  1.6   msaitoh 	command = ((reg_addr << IXGBE_MSCA_NP_ADDR_SHIFT)  |
    526  1.6   msaitoh 		   (device_type << IXGBE_MSCA_DEV_TYPE_SHIFT) |
    527  1.6   msaitoh 		   (hw->phy.addr << IXGBE_MSCA_PHY_ADDR_SHIFT) |
    528  1.6   msaitoh 		   (IXGBE_MSCA_ADDR_CYCLE | IXGBE_MSCA_MDI_COMMAND));
    529  1.6   msaitoh 
    530  1.6   msaitoh 	IXGBE_WRITE_REG(hw, IXGBE_MSCA, command);
    531  1.6   msaitoh 
    532  1.6   msaitoh 	/*
    533  1.6   msaitoh 	 * Check every 10 usec to see if the address cycle completed.
    534  1.6   msaitoh 	 * The MDI Command bit will clear when the operation is
    535  1.6   msaitoh 	 * complete
    536  1.6   msaitoh 	 */
    537  1.6   msaitoh 	for (i = 0; i < IXGBE_MDIO_COMMAND_TIMEOUT; i++) {
    538  1.6   msaitoh 		usec_delay(10);
    539  1.6   msaitoh 
    540  1.6   msaitoh 		command = IXGBE_READ_REG(hw, IXGBE_MSCA);
    541  1.6   msaitoh 		if ((command & IXGBE_MSCA_MDI_COMMAND) == 0)
    542  1.6   msaitoh 				break;
    543  1.6   msaitoh 	}
    544  1.6   msaitoh 
    545  1.6   msaitoh 
    546  1.6   msaitoh 	if ((command & IXGBE_MSCA_MDI_COMMAND) != 0) {
    547  1.6   msaitoh 		ERROR_REPORT1(IXGBE_ERROR_POLLING, "PHY address command did not complete.\n");
    548  1.6   msaitoh 		return IXGBE_ERR_PHY;
    549  1.6   msaitoh 	}
    550  1.6   msaitoh 
    551  1.6   msaitoh 	/*
    552  1.6   msaitoh 	 * Address cycle complete, setup and write the read
    553  1.6   msaitoh 	 * command
    554  1.6   msaitoh 	 */
    555  1.6   msaitoh 	command = ((reg_addr << IXGBE_MSCA_NP_ADDR_SHIFT)  |
    556  1.6   msaitoh 		   (device_type << IXGBE_MSCA_DEV_TYPE_SHIFT) |
    557  1.6   msaitoh 		   (hw->phy.addr << IXGBE_MSCA_PHY_ADDR_SHIFT) |
    558  1.6   msaitoh 		   (IXGBE_MSCA_READ | IXGBE_MSCA_MDI_COMMAND));
    559  1.6   msaitoh 
    560  1.6   msaitoh 	IXGBE_WRITE_REG(hw, IXGBE_MSCA, command);
    561  1.6   msaitoh 
    562  1.6   msaitoh 	/*
    563  1.6   msaitoh 	 * Check every 10 usec to see if the address cycle
    564  1.6   msaitoh 	 * completed. The MDI Command bit will clear when the
    565  1.6   msaitoh 	 * operation is complete
    566  1.6   msaitoh 	 */
    567  1.6   msaitoh 	for (i = 0; i < IXGBE_MDIO_COMMAND_TIMEOUT; i++) {
    568  1.6   msaitoh 		usec_delay(10);
    569  1.6   msaitoh 
    570  1.6   msaitoh 		command = IXGBE_READ_REG(hw, IXGBE_MSCA);
    571  1.6   msaitoh 		if ((command & IXGBE_MSCA_MDI_COMMAND) == 0)
    572  1.6   msaitoh 			break;
    573  1.6   msaitoh 	}
    574  1.6   msaitoh 
    575  1.6   msaitoh 	if ((command & IXGBE_MSCA_MDI_COMMAND) != 0) {
    576  1.6   msaitoh 		ERROR_REPORT1(IXGBE_ERROR_POLLING, "PHY read command didn't complete\n");
    577  1.6   msaitoh 		return IXGBE_ERR_PHY;
    578  1.6   msaitoh 	}
    579  1.6   msaitoh 
    580  1.6   msaitoh 	/*
    581  1.6   msaitoh 	 * Read operation is complete.  Get the data
    582  1.6   msaitoh 	 * from MSRWD
    583  1.6   msaitoh 	 */
    584  1.6   msaitoh 	data = IXGBE_READ_REG(hw, IXGBE_MSRWD);
    585  1.6   msaitoh 	data >>= IXGBE_MSRWD_READ_DATA_SHIFT;
    586  1.6   msaitoh 	*phy_data = (u16)(data);
    587  1.6   msaitoh 
    588  1.6   msaitoh 	return IXGBE_SUCCESS;
    589  1.6   msaitoh }
    590  1.6   msaitoh 
    591  1.6   msaitoh /**
    592  1.1    dyoung  *  ixgbe_read_phy_reg_generic - Reads a value from a specified PHY register
    593  1.6   msaitoh  *  using the SWFW lock - this function is needed in most cases
    594  1.1    dyoung  *  @hw: pointer to hardware structure
    595  1.1    dyoung  *  @reg_addr: 32 bit address of PHY register to read
    596  1.1    dyoung  *  @phy_data: Pointer to read data from PHY register
    597  1.1    dyoung  **/
    598  1.1    dyoung s32 ixgbe_read_phy_reg_generic(struct ixgbe_hw *hw, u32 reg_addr,
    599  1.3   msaitoh 			       u32 device_type, u16 *phy_data)
    600  1.1    dyoung {
    601  1.6   msaitoh 	s32 status;
    602  1.7   msaitoh 	u32 gssr = hw->phy.phy_semaphore_mask;
    603  1.1    dyoung 
    604  1.1    dyoung 	DEBUGFUNC("ixgbe_read_phy_reg_generic");
    605  1.1    dyoung 
    606  1.6   msaitoh 	if (hw->mac.ops.acquire_swfw_sync(hw, gssr) == IXGBE_SUCCESS) {
    607  1.6   msaitoh 		status = ixgbe_read_phy_reg_mdi(hw, reg_addr, device_type,
    608  1.6   msaitoh 						phy_data);
    609  1.6   msaitoh 		hw->mac.ops.release_swfw_sync(hw, gssr);
    610  1.6   msaitoh 	} else {
    611  1.1    dyoung 		status = IXGBE_ERR_SWFW_SYNC;
    612  1.6   msaitoh 	}
    613  1.6   msaitoh 
    614  1.6   msaitoh 	return status;
    615  1.6   msaitoh }
    616  1.6   msaitoh 
    617  1.6   msaitoh /**
    618  1.6   msaitoh  *  ixgbe_write_phy_reg_mdi - Writes a value to specified PHY register
    619  1.6   msaitoh  *  without SWFW lock
    620  1.6   msaitoh  *  @hw: pointer to hardware structure
    621  1.6   msaitoh  *  @reg_addr: 32 bit PHY register to write
    622  1.6   msaitoh  *  @device_type: 5 bit device type
    623  1.6   msaitoh  *  @phy_data: Data to write to the PHY register
    624  1.6   msaitoh  **/
    625  1.6   msaitoh s32 ixgbe_write_phy_reg_mdi(struct ixgbe_hw *hw, u32 reg_addr,
    626  1.6   msaitoh 				u32 device_type, u16 phy_data)
    627  1.6   msaitoh {
    628  1.6   msaitoh 	u32 i, command;
    629  1.1    dyoung 
    630  1.6   msaitoh 	/* Put the data in the MDI single read and write data register*/
    631  1.6   msaitoh 	IXGBE_WRITE_REG(hw, IXGBE_MSRWD, (u32)phy_data);
    632  1.1    dyoung 
    633  1.6   msaitoh 	/* Setup and write the address cycle command */
    634  1.6   msaitoh 	command = ((reg_addr << IXGBE_MSCA_NP_ADDR_SHIFT)  |
    635  1.6   msaitoh 		   (device_type << IXGBE_MSCA_DEV_TYPE_SHIFT) |
    636  1.6   msaitoh 		   (hw->phy.addr << IXGBE_MSCA_PHY_ADDR_SHIFT) |
    637  1.6   msaitoh 		   (IXGBE_MSCA_ADDR_CYCLE | IXGBE_MSCA_MDI_COMMAND));
    638  1.1    dyoung 
    639  1.6   msaitoh 	IXGBE_WRITE_REG(hw, IXGBE_MSCA, command);
    640  1.1    dyoung 
    641  1.6   msaitoh 	/*
    642  1.6   msaitoh 	 * Check every 10 usec to see if the address cycle completed.
    643  1.6   msaitoh 	 * The MDI Command bit will clear when the operation is
    644  1.6   msaitoh 	 * complete
    645  1.6   msaitoh 	 */
    646  1.6   msaitoh 	for (i = 0; i < IXGBE_MDIO_COMMAND_TIMEOUT; i++) {
    647  1.6   msaitoh 		usec_delay(10);
    648  1.1    dyoung 
    649  1.6   msaitoh 		command = IXGBE_READ_REG(hw, IXGBE_MSCA);
    650  1.6   msaitoh 		if ((command & IXGBE_MSCA_MDI_COMMAND) == 0)
    651  1.6   msaitoh 			break;
    652  1.6   msaitoh 	}
    653  1.1    dyoung 
    654  1.6   msaitoh 	if ((command & IXGBE_MSCA_MDI_COMMAND) != 0) {
    655  1.6   msaitoh 		ERROR_REPORT1(IXGBE_ERROR_POLLING, "PHY address cmd didn't complete\n");
    656  1.6   msaitoh 		return IXGBE_ERR_PHY;
    657  1.6   msaitoh 	}
    658  1.1    dyoung 
    659  1.6   msaitoh 	/*
    660  1.6   msaitoh 	 * Address cycle complete, setup and write the write
    661  1.6   msaitoh 	 * command
    662  1.6   msaitoh 	 */
    663  1.6   msaitoh 	command = ((reg_addr << IXGBE_MSCA_NP_ADDR_SHIFT)  |
    664  1.6   msaitoh 		   (device_type << IXGBE_MSCA_DEV_TYPE_SHIFT) |
    665  1.6   msaitoh 		   (hw->phy.addr << IXGBE_MSCA_PHY_ADDR_SHIFT) |
    666  1.6   msaitoh 		   (IXGBE_MSCA_WRITE | IXGBE_MSCA_MDI_COMMAND));
    667  1.1    dyoung 
    668  1.6   msaitoh 	IXGBE_WRITE_REG(hw, IXGBE_MSCA, command);
    669  1.1    dyoung 
    670  1.6   msaitoh 	/*
    671  1.6   msaitoh 	 * Check every 10 usec to see if the address cycle
    672  1.6   msaitoh 	 * completed. The MDI Command bit will clear when the
    673  1.6   msaitoh 	 * operation is complete
    674  1.6   msaitoh 	 */
    675  1.6   msaitoh 	for (i = 0; i < IXGBE_MDIO_COMMAND_TIMEOUT; i++) {
    676  1.6   msaitoh 		usec_delay(10);
    677  1.1    dyoung 
    678  1.6   msaitoh 		command = IXGBE_READ_REG(hw, IXGBE_MSCA);
    679  1.6   msaitoh 		if ((command & IXGBE_MSCA_MDI_COMMAND) == 0)
    680  1.6   msaitoh 			break;
    681  1.6   msaitoh 	}
    682  1.1    dyoung 
    683  1.6   msaitoh 	if ((command & IXGBE_MSCA_MDI_COMMAND) != 0) {
    684  1.6   msaitoh 		ERROR_REPORT1(IXGBE_ERROR_POLLING, "PHY write cmd didn't complete\n");
    685  1.6   msaitoh 		return IXGBE_ERR_PHY;
    686  1.1    dyoung 	}
    687  1.1    dyoung 
    688  1.6   msaitoh 	return IXGBE_SUCCESS;
    689  1.1    dyoung }
    690  1.1    dyoung 
    691  1.1    dyoung /**
    692  1.1    dyoung  *  ixgbe_write_phy_reg_generic - Writes a value to specified PHY register
    693  1.6   msaitoh  *  using SWFW lock- this function is needed in most cases
    694  1.1    dyoung  *  @hw: pointer to hardware structure
    695  1.1    dyoung  *  @reg_addr: 32 bit PHY register to write
    696  1.1    dyoung  *  @device_type: 5 bit device type
    697  1.1    dyoung  *  @phy_data: Data to write to the PHY register
    698  1.1    dyoung  **/
    699  1.1    dyoung s32 ixgbe_write_phy_reg_generic(struct ixgbe_hw *hw, u32 reg_addr,
    700  1.3   msaitoh 				u32 device_type, u16 phy_data)
    701  1.1    dyoung {
    702  1.6   msaitoh 	s32 status;
    703  1.7   msaitoh 	u32 gssr = hw->phy.phy_semaphore_mask;
    704  1.1    dyoung 
    705  1.1    dyoung 	DEBUGFUNC("ixgbe_write_phy_reg_generic");
    706  1.1    dyoung 
    707  1.6   msaitoh 	if (hw->mac.ops.acquire_swfw_sync(hw, gssr) == IXGBE_SUCCESS) {
    708  1.6   msaitoh 		status = ixgbe_write_phy_reg_mdi(hw, reg_addr, device_type,
    709  1.6   msaitoh 						 phy_data);
    710  1.6   msaitoh 		hw->mac.ops.release_swfw_sync(hw, gssr);
    711  1.6   msaitoh 	} else {
    712  1.1    dyoung 		status = IXGBE_ERR_SWFW_SYNC;
    713  1.1    dyoung 	}
    714  1.1    dyoung 
    715  1.1    dyoung 	return status;
    716  1.1    dyoung }
    717  1.1    dyoung 
    718  1.1    dyoung /**
    719  1.7   msaitoh  *  ixgbe_setup_phy_link_generic - Set and restart auto-neg
    720  1.1    dyoung  *  @hw: pointer to hardware structure
    721  1.1    dyoung  *
    722  1.7   msaitoh  *  Restart auto-negotiation and PHY and waits for completion.
    723  1.1    dyoung  **/
    724  1.1    dyoung s32 ixgbe_setup_phy_link_generic(struct ixgbe_hw *hw)
    725  1.1    dyoung {
    726  1.1    dyoung 	s32 status = IXGBE_SUCCESS;
    727  1.1    dyoung 	u16 autoneg_reg = IXGBE_MII_AUTONEG_REG;
    728  1.1    dyoung 	bool autoneg = FALSE;
    729  1.1    dyoung 	ixgbe_link_speed speed;
    730  1.1    dyoung 
    731  1.1    dyoung 	DEBUGFUNC("ixgbe_setup_phy_link_generic");
    732  1.1    dyoung 
    733  1.1    dyoung 	ixgbe_get_copper_link_capabilities_generic(hw, &speed, &autoneg);
    734  1.1    dyoung 
    735  1.1    dyoung 	if (speed & IXGBE_LINK_SPEED_10GB_FULL) {
    736  1.1    dyoung 		/* Set or unset auto-negotiation 10G advertisement */
    737  1.1    dyoung 		hw->phy.ops.read_reg(hw, IXGBE_MII_10GBASE_T_AUTONEG_CTRL_REG,
    738  1.3   msaitoh 				     IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
    739  1.3   msaitoh 				     &autoneg_reg);
    740  1.1    dyoung 
    741  1.1    dyoung 		autoneg_reg &= ~IXGBE_MII_10GBASE_T_ADVERTISE;
    742  1.1    dyoung 		if (hw->phy.autoneg_advertised & IXGBE_LINK_SPEED_10GB_FULL)
    743  1.1    dyoung 			autoneg_reg |= IXGBE_MII_10GBASE_T_ADVERTISE;
    744  1.1    dyoung 
    745  1.1    dyoung 		hw->phy.ops.write_reg(hw, IXGBE_MII_10GBASE_T_AUTONEG_CTRL_REG,
    746  1.3   msaitoh 				      IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
    747  1.3   msaitoh 				      autoneg_reg);
    748  1.1    dyoung 	}
    749  1.1    dyoung 
    750  1.7   msaitoh 	if (hw->mac.type == ixgbe_mac_X550) {
    751  1.7   msaitoh 		if (speed & IXGBE_LINK_SPEED_5GB_FULL) {
    752  1.7   msaitoh 			/* Set or unset auto-negotiation 1G advertisement */
    753  1.7   msaitoh 			hw->phy.ops.read_reg(hw,
    754  1.7   msaitoh 				IXGBE_MII_AUTONEG_VENDOR_PROVISION_1_REG,
    755  1.7   msaitoh 				IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
    756  1.7   msaitoh 				&autoneg_reg);
    757  1.7   msaitoh 
    758  1.7   msaitoh 			autoneg_reg &= ~IXGBE_MII_5GBASE_T_ADVERTISE;
    759  1.7   msaitoh 			if (hw->phy.autoneg_advertised &
    760  1.7   msaitoh 			     IXGBE_LINK_SPEED_5GB_FULL)
    761  1.7   msaitoh 				autoneg_reg |= IXGBE_MII_5GBASE_T_ADVERTISE;
    762  1.7   msaitoh 
    763  1.7   msaitoh 			hw->phy.ops.write_reg(hw,
    764  1.7   msaitoh 				IXGBE_MII_AUTONEG_VENDOR_PROVISION_1_REG,
    765  1.7   msaitoh 				IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
    766  1.7   msaitoh 				autoneg_reg);
    767  1.7   msaitoh 		}
    768  1.7   msaitoh 
    769  1.7   msaitoh 		if (speed & IXGBE_LINK_SPEED_2_5GB_FULL) {
    770  1.7   msaitoh 			/* Set or unset auto-negotiation 1G advertisement */
    771  1.7   msaitoh 			hw->phy.ops.read_reg(hw,
    772  1.7   msaitoh 				IXGBE_MII_AUTONEG_VENDOR_PROVISION_1_REG,
    773  1.7   msaitoh 				IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
    774  1.7   msaitoh 				&autoneg_reg);
    775  1.7   msaitoh 
    776  1.7   msaitoh 			autoneg_reg &= ~IXGBE_MII_2_5GBASE_T_ADVERTISE;
    777  1.7   msaitoh 			if (hw->phy.autoneg_advertised &
    778  1.7   msaitoh 			    IXGBE_LINK_SPEED_2_5GB_FULL)
    779  1.7   msaitoh 				autoneg_reg |= IXGBE_MII_2_5GBASE_T_ADVERTISE;
    780  1.7   msaitoh 
    781  1.7   msaitoh 			hw->phy.ops.write_reg(hw,
    782  1.7   msaitoh 				IXGBE_MII_AUTONEG_VENDOR_PROVISION_1_REG,
    783  1.7   msaitoh 				IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
    784  1.7   msaitoh 				autoneg_reg);
    785  1.7   msaitoh 		}
    786  1.7   msaitoh 	}
    787  1.7   msaitoh 
    788  1.1    dyoung 	if (speed & IXGBE_LINK_SPEED_1GB_FULL) {
    789  1.1    dyoung 		/* Set or unset auto-negotiation 1G advertisement */
    790  1.1    dyoung 		hw->phy.ops.read_reg(hw,
    791  1.3   msaitoh 				     IXGBE_MII_AUTONEG_VENDOR_PROVISION_1_REG,
    792  1.3   msaitoh 				     IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
    793  1.3   msaitoh 				     &autoneg_reg);
    794  1.1    dyoung 
    795  1.1    dyoung 		autoneg_reg &= ~IXGBE_MII_1GBASE_T_ADVERTISE;
    796  1.1    dyoung 		if (hw->phy.autoneg_advertised & IXGBE_LINK_SPEED_1GB_FULL)
    797  1.1    dyoung 			autoneg_reg |= IXGBE_MII_1GBASE_T_ADVERTISE;
    798  1.1    dyoung 
    799  1.1    dyoung 		hw->phy.ops.write_reg(hw,
    800  1.3   msaitoh 				      IXGBE_MII_AUTONEG_VENDOR_PROVISION_1_REG,
    801  1.3   msaitoh 				      IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
    802  1.3   msaitoh 				      autoneg_reg);
    803  1.1    dyoung 	}
    804  1.1    dyoung 
    805  1.1    dyoung 	if (speed & IXGBE_LINK_SPEED_100_FULL) {
    806  1.1    dyoung 		/* Set or unset auto-negotiation 100M advertisement */
    807  1.1    dyoung 		hw->phy.ops.read_reg(hw, IXGBE_MII_AUTONEG_ADVERTISE_REG,
    808  1.3   msaitoh 				     IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
    809  1.3   msaitoh 				     &autoneg_reg);
    810  1.1    dyoung 
    811  1.3   msaitoh 		autoneg_reg &= ~(IXGBE_MII_100BASE_T_ADVERTISE |
    812  1.3   msaitoh 				 IXGBE_MII_100BASE_T_ADVERTISE_HALF);
    813  1.1    dyoung 		if (hw->phy.autoneg_advertised & IXGBE_LINK_SPEED_100_FULL)
    814  1.1    dyoung 			autoneg_reg |= IXGBE_MII_100BASE_T_ADVERTISE;
    815  1.1    dyoung 
    816  1.1    dyoung 		hw->phy.ops.write_reg(hw, IXGBE_MII_AUTONEG_ADVERTISE_REG,
    817  1.3   msaitoh 				      IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
    818  1.3   msaitoh 				      autoneg_reg);
    819  1.1    dyoung 	}
    820  1.1    dyoung 
    821  1.7   msaitoh 	/* Blocked by MNG FW so don't reset PHY */
    822  1.7   msaitoh 	if (ixgbe_check_reset_blocked(hw))
    823  1.7   msaitoh 		return status;
    824  1.7   msaitoh 
    825  1.7   msaitoh 	/* Restart PHY auto-negotiation. */
    826  1.1    dyoung 	hw->phy.ops.read_reg(hw, IXGBE_MDIO_AUTO_NEG_CONTROL,
    827  1.3   msaitoh 			     IXGBE_MDIO_AUTO_NEG_DEV_TYPE, &autoneg_reg);
    828  1.1    dyoung 
    829  1.1    dyoung 	autoneg_reg |= IXGBE_MII_RESTART;
    830  1.1    dyoung 
    831  1.1    dyoung 	hw->phy.ops.write_reg(hw, IXGBE_MDIO_AUTO_NEG_CONTROL,
    832  1.3   msaitoh 			      IXGBE_MDIO_AUTO_NEG_DEV_TYPE, autoneg_reg);
    833  1.1    dyoung 
    834  1.1    dyoung 	return status;
    835  1.1    dyoung }
    836  1.1    dyoung 
    837  1.1    dyoung /**
    838  1.1    dyoung  *  ixgbe_setup_phy_link_speed_generic - Sets the auto advertised capabilities
    839  1.1    dyoung  *  @hw: pointer to hardware structure
    840  1.1    dyoung  *  @speed: new link speed
    841  1.1    dyoung  **/
    842  1.1    dyoung s32 ixgbe_setup_phy_link_speed_generic(struct ixgbe_hw *hw,
    843  1.3   msaitoh 				       ixgbe_link_speed speed,
    844  1.3   msaitoh 				       bool autoneg_wait_to_complete)
    845  1.1    dyoung {
    846  1.5   msaitoh 	UNREFERENCED_1PARAMETER(autoneg_wait_to_complete);
    847  1.1    dyoung 
    848  1.1    dyoung 	DEBUGFUNC("ixgbe_setup_phy_link_speed_generic");
    849  1.1    dyoung 
    850  1.1    dyoung 	/*
    851  1.1    dyoung 	 * Clear autoneg_advertised and set new values based on input link
    852  1.1    dyoung 	 * speed.
    853  1.1    dyoung 	 */
    854  1.1    dyoung 	hw->phy.autoneg_advertised = 0;
    855  1.1    dyoung 
    856  1.1    dyoung 	if (speed & IXGBE_LINK_SPEED_10GB_FULL)
    857  1.1    dyoung 		hw->phy.autoneg_advertised |= IXGBE_LINK_SPEED_10GB_FULL;
    858  1.1    dyoung 
    859  1.7   msaitoh 	if (speed & IXGBE_LINK_SPEED_5GB_FULL)
    860  1.7   msaitoh 		hw->phy.autoneg_advertised |= IXGBE_LINK_SPEED_5GB_FULL;
    861  1.7   msaitoh 
    862  1.7   msaitoh 	if (speed & IXGBE_LINK_SPEED_2_5GB_FULL)
    863  1.7   msaitoh 		hw->phy.autoneg_advertised |= IXGBE_LINK_SPEED_2_5GB_FULL;
    864  1.7   msaitoh 
    865  1.1    dyoung 	if (speed & IXGBE_LINK_SPEED_1GB_FULL)
    866  1.1    dyoung 		hw->phy.autoneg_advertised |= IXGBE_LINK_SPEED_1GB_FULL;
    867  1.1    dyoung 
    868  1.1    dyoung 	if (speed & IXGBE_LINK_SPEED_100_FULL)
    869  1.1    dyoung 		hw->phy.autoneg_advertised |= IXGBE_LINK_SPEED_100_FULL;
    870  1.1    dyoung 
    871  1.1    dyoung 	/* Setup link based on the new speed settings */
    872  1.1    dyoung 	hw->phy.ops.setup_link(hw);
    873  1.1    dyoung 
    874  1.1    dyoung 	return IXGBE_SUCCESS;
    875  1.1    dyoung }
    876  1.1    dyoung 
    877  1.1    dyoung /**
    878  1.1    dyoung  *  ixgbe_get_copper_link_capabilities_generic - Determines link capabilities
    879  1.1    dyoung  *  @hw: pointer to hardware structure
    880  1.1    dyoung  *  @speed: pointer to link speed
    881  1.1    dyoung  *  @autoneg: boolean auto-negotiation value
    882  1.1    dyoung  *
    883  1.7   msaitoh  *  Determines the supported link capabilities by reading the PHY auto
    884  1.7   msaitoh  *  negotiation register.
    885  1.1    dyoung  **/
    886  1.1    dyoung s32 ixgbe_get_copper_link_capabilities_generic(struct ixgbe_hw *hw,
    887  1.3   msaitoh 					       ixgbe_link_speed *speed,
    888  1.3   msaitoh 					       bool *autoneg)
    889  1.1    dyoung {
    890  1.7   msaitoh 	s32 status;
    891  1.1    dyoung 	u16 speed_ability;
    892  1.1    dyoung 
    893  1.1    dyoung 	DEBUGFUNC("ixgbe_get_copper_link_capabilities_generic");
    894  1.1    dyoung 
    895  1.1    dyoung 	*speed = 0;
    896  1.1    dyoung 	*autoneg = TRUE;
    897  1.1    dyoung 
    898  1.1    dyoung 	status = hw->phy.ops.read_reg(hw, IXGBE_MDIO_PHY_SPEED_ABILITY,
    899  1.3   msaitoh 				      IXGBE_MDIO_PMA_PMD_DEV_TYPE,
    900  1.3   msaitoh 				      &speed_ability);
    901  1.1    dyoung 
    902  1.1    dyoung 	if (status == IXGBE_SUCCESS) {
    903  1.1    dyoung 		if (speed_ability & IXGBE_MDIO_PHY_SPEED_10G)
    904  1.1    dyoung 			*speed |= IXGBE_LINK_SPEED_10GB_FULL;
    905  1.1    dyoung 		if (speed_ability & IXGBE_MDIO_PHY_SPEED_1G)
    906  1.1    dyoung 			*speed |= IXGBE_LINK_SPEED_1GB_FULL;
    907  1.1    dyoung 		if (speed_ability & IXGBE_MDIO_PHY_SPEED_100M)
    908  1.1    dyoung 			*speed |= IXGBE_LINK_SPEED_100_FULL;
    909  1.1    dyoung 	}
    910  1.1    dyoung 
    911  1.7   msaitoh 	/* Internal PHY does not support 100 Mbps */
    912  1.7   msaitoh 	if (hw->mac.type == ixgbe_mac_X550EM_x)
    913  1.7   msaitoh 		*speed &= ~IXGBE_LINK_SPEED_100_FULL;
    914  1.7   msaitoh 
    915  1.7   msaitoh 	if (hw->mac.type == ixgbe_mac_X550) {
    916  1.7   msaitoh 		*speed |= IXGBE_LINK_SPEED_2_5GB_FULL;
    917  1.7   msaitoh 		*speed |= IXGBE_LINK_SPEED_5GB_FULL;
    918  1.7   msaitoh 	}
    919  1.7   msaitoh 
    920  1.1    dyoung 	return status;
    921  1.1    dyoung }
    922  1.1    dyoung 
    923  1.1    dyoung /**
    924  1.1    dyoung  *  ixgbe_check_phy_link_tnx - Determine link and speed status
    925  1.1    dyoung  *  @hw: pointer to hardware structure
    926  1.1    dyoung  *
    927  1.1    dyoung  *  Reads the VS1 register to determine if link is up and the current speed for
    928  1.1    dyoung  *  the PHY.
    929  1.1    dyoung  **/
    930  1.1    dyoung s32 ixgbe_check_phy_link_tnx(struct ixgbe_hw *hw, ixgbe_link_speed *speed,
    931  1.3   msaitoh 			     bool *link_up)
    932  1.1    dyoung {
    933  1.1    dyoung 	s32 status = IXGBE_SUCCESS;
    934  1.1    dyoung 	u32 time_out;
    935  1.1    dyoung 	u32 max_time_out = 10;
    936  1.1    dyoung 	u16 phy_link = 0;
    937  1.1    dyoung 	u16 phy_speed = 0;
    938  1.1    dyoung 	u16 phy_data = 0;
    939  1.1    dyoung 
    940  1.1    dyoung 	DEBUGFUNC("ixgbe_check_phy_link_tnx");
    941  1.1    dyoung 
    942  1.1    dyoung 	/* Initialize speed and link to default case */
    943  1.1    dyoung 	*link_up = FALSE;
    944  1.1    dyoung 	*speed = IXGBE_LINK_SPEED_10GB_FULL;
    945  1.1    dyoung 
    946  1.1    dyoung 	/*
    947  1.1    dyoung 	 * Check current speed and link status of the PHY register.
    948  1.1    dyoung 	 * This is a vendor specific register and may have to
    949  1.1    dyoung 	 * be changed for other copper PHYs.
    950  1.1    dyoung 	 */
    951  1.1    dyoung 	for (time_out = 0; time_out < max_time_out; time_out++) {
    952  1.1    dyoung 		usec_delay(10);
    953  1.1    dyoung 		status = hw->phy.ops.read_reg(hw,
    954  1.3   msaitoh 					IXGBE_MDIO_VENDOR_SPECIFIC_1_STATUS,
    955  1.3   msaitoh 					IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE,
    956  1.3   msaitoh 					&phy_data);
    957  1.3   msaitoh 		phy_link = phy_data & IXGBE_MDIO_VENDOR_SPECIFIC_1_LINK_STATUS;
    958  1.1    dyoung 		phy_speed = phy_data &
    959  1.3   msaitoh 				 IXGBE_MDIO_VENDOR_SPECIFIC_1_SPEED_STATUS;
    960  1.1    dyoung 		if (phy_link == IXGBE_MDIO_VENDOR_SPECIFIC_1_LINK_STATUS) {
    961  1.1    dyoung 			*link_up = TRUE;
    962  1.1    dyoung 			if (phy_speed ==
    963  1.1    dyoung 			    IXGBE_MDIO_VENDOR_SPECIFIC_1_SPEED_STATUS)
    964  1.1    dyoung 				*speed = IXGBE_LINK_SPEED_1GB_FULL;
    965  1.1    dyoung 			break;
    966  1.1    dyoung 		}
    967  1.1    dyoung 	}
    968  1.1    dyoung 
    969  1.1    dyoung 	return status;
    970  1.1    dyoung }
    971  1.1    dyoung 
    972  1.1    dyoung /**
    973  1.7   msaitoh  *	ixgbe_setup_phy_link_tnx - Set and restart auto-neg
    974  1.1    dyoung  *	@hw: pointer to hardware structure
    975  1.1    dyoung  *
    976  1.7   msaitoh  *	Restart auto-negotiation and PHY and waits for completion.
    977  1.1    dyoung  **/
    978  1.1    dyoung s32 ixgbe_setup_phy_link_tnx(struct ixgbe_hw *hw)
    979  1.1    dyoung {
    980  1.1    dyoung 	s32 status = IXGBE_SUCCESS;
    981  1.1    dyoung 	u16 autoneg_reg = IXGBE_MII_AUTONEG_REG;
    982  1.1    dyoung 	bool autoneg = FALSE;
    983  1.1    dyoung 	ixgbe_link_speed speed;
    984  1.1    dyoung 
    985  1.1    dyoung 	DEBUGFUNC("ixgbe_setup_phy_link_tnx");
    986  1.1    dyoung 
    987  1.1    dyoung 	ixgbe_get_copper_link_capabilities_generic(hw, &speed, &autoneg);
    988  1.1    dyoung 
    989  1.1    dyoung 	if (speed & IXGBE_LINK_SPEED_10GB_FULL) {
    990  1.1    dyoung 		/* Set or unset auto-negotiation 10G advertisement */
    991  1.1    dyoung 		hw->phy.ops.read_reg(hw, IXGBE_MII_10GBASE_T_AUTONEG_CTRL_REG,
    992  1.3   msaitoh 				     IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
    993  1.3   msaitoh 				     &autoneg_reg);
    994  1.1    dyoung 
    995  1.1    dyoung 		autoneg_reg &= ~IXGBE_MII_10GBASE_T_ADVERTISE;
    996  1.1    dyoung 		if (hw->phy.autoneg_advertised & IXGBE_LINK_SPEED_10GB_FULL)
    997  1.1    dyoung 			autoneg_reg |= IXGBE_MII_10GBASE_T_ADVERTISE;
    998  1.1    dyoung 
    999  1.1    dyoung 		hw->phy.ops.write_reg(hw, IXGBE_MII_10GBASE_T_AUTONEG_CTRL_REG,
   1000  1.3   msaitoh 				      IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
   1001  1.3   msaitoh 				      autoneg_reg);
   1002  1.1    dyoung 	}
   1003  1.1    dyoung 
   1004  1.1    dyoung 	if (speed & IXGBE_LINK_SPEED_1GB_FULL) {
   1005  1.1    dyoung 		/* Set or unset auto-negotiation 1G advertisement */
   1006  1.1    dyoung 		hw->phy.ops.read_reg(hw, IXGBE_MII_AUTONEG_XNP_TX_REG,
   1007  1.3   msaitoh 				     IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
   1008  1.3   msaitoh 				     &autoneg_reg);
   1009  1.1    dyoung 
   1010  1.1    dyoung 		autoneg_reg &= ~IXGBE_MII_1GBASE_T_ADVERTISE_XNP_TX;
   1011  1.1    dyoung 		if (hw->phy.autoneg_advertised & IXGBE_LINK_SPEED_1GB_FULL)
   1012  1.1    dyoung 			autoneg_reg |= IXGBE_MII_1GBASE_T_ADVERTISE_XNP_TX;
   1013  1.1    dyoung 
   1014  1.1    dyoung 		hw->phy.ops.write_reg(hw, IXGBE_MII_AUTONEG_XNP_TX_REG,
   1015  1.3   msaitoh 				      IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
   1016  1.3   msaitoh 				      autoneg_reg);
   1017  1.1    dyoung 	}
   1018  1.1    dyoung 
   1019  1.1    dyoung 	if (speed & IXGBE_LINK_SPEED_100_FULL) {
   1020  1.1    dyoung 		/* Set or unset auto-negotiation 100M advertisement */
   1021  1.1    dyoung 		hw->phy.ops.read_reg(hw, IXGBE_MII_AUTONEG_ADVERTISE_REG,
   1022  1.3   msaitoh 				     IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
   1023  1.3   msaitoh 				     &autoneg_reg);
   1024  1.1    dyoung 
   1025  1.1    dyoung 		autoneg_reg &= ~IXGBE_MII_100BASE_T_ADVERTISE;
   1026  1.1    dyoung 		if (hw->phy.autoneg_advertised & IXGBE_LINK_SPEED_100_FULL)
   1027  1.1    dyoung 			autoneg_reg |= IXGBE_MII_100BASE_T_ADVERTISE;
   1028  1.1    dyoung 
   1029  1.1    dyoung 		hw->phy.ops.write_reg(hw, IXGBE_MII_AUTONEG_ADVERTISE_REG,
   1030  1.3   msaitoh 				      IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
   1031  1.3   msaitoh 				      autoneg_reg);
   1032  1.1    dyoung 	}
   1033  1.1    dyoung 
   1034  1.7   msaitoh 	/* Blocked by MNG FW so don't reset PHY */
   1035  1.7   msaitoh 	if (ixgbe_check_reset_blocked(hw))
   1036  1.7   msaitoh 		return status;
   1037  1.7   msaitoh 
   1038  1.7   msaitoh 	/* Restart PHY auto-negotiation. */
   1039  1.1    dyoung 	hw->phy.ops.read_reg(hw, IXGBE_MDIO_AUTO_NEG_CONTROL,
   1040  1.3   msaitoh 			     IXGBE_MDIO_AUTO_NEG_DEV_TYPE, &autoneg_reg);
   1041  1.1    dyoung 
   1042  1.1    dyoung 	autoneg_reg |= IXGBE_MII_RESTART;
   1043  1.1    dyoung 
   1044  1.1    dyoung 	hw->phy.ops.write_reg(hw, IXGBE_MDIO_AUTO_NEG_CONTROL,
   1045  1.3   msaitoh 			      IXGBE_MDIO_AUTO_NEG_DEV_TYPE, autoneg_reg);
   1046  1.1    dyoung 
   1047  1.1    dyoung 	return status;
   1048  1.1    dyoung }
   1049  1.1    dyoung 
   1050  1.1    dyoung /**
   1051  1.1    dyoung  *  ixgbe_get_phy_firmware_version_tnx - Gets the PHY Firmware Version
   1052  1.1    dyoung  *  @hw: pointer to hardware structure
   1053  1.1    dyoung  *  @firmware_version: pointer to the PHY Firmware Version
   1054  1.1    dyoung  **/
   1055  1.1    dyoung s32 ixgbe_get_phy_firmware_version_tnx(struct ixgbe_hw *hw,
   1056  1.3   msaitoh 				       u16 *firmware_version)
   1057  1.1    dyoung {
   1058  1.7   msaitoh 	s32 status;
   1059  1.1    dyoung 
   1060  1.1    dyoung 	DEBUGFUNC("ixgbe_get_phy_firmware_version_tnx");
   1061  1.1    dyoung 
   1062  1.1    dyoung 	status = hw->phy.ops.read_reg(hw, TNX_FW_REV,
   1063  1.3   msaitoh 				      IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE,
   1064  1.3   msaitoh 				      firmware_version);
   1065  1.1    dyoung 
   1066  1.1    dyoung 	return status;
   1067  1.1    dyoung }
   1068  1.1    dyoung 
   1069  1.1    dyoung /**
   1070  1.1    dyoung  *  ixgbe_get_phy_firmware_version_generic - Gets the PHY Firmware Version
   1071  1.1    dyoung  *  @hw: pointer to hardware structure
   1072  1.1    dyoung  *  @firmware_version: pointer to the PHY Firmware Version
   1073  1.1    dyoung  **/
   1074  1.1    dyoung s32 ixgbe_get_phy_firmware_version_generic(struct ixgbe_hw *hw,
   1075  1.3   msaitoh 					   u16 *firmware_version)
   1076  1.1    dyoung {
   1077  1.7   msaitoh 	s32 status;
   1078  1.1    dyoung 
   1079  1.1    dyoung 	DEBUGFUNC("ixgbe_get_phy_firmware_version_generic");
   1080  1.1    dyoung 
   1081  1.1    dyoung 	status = hw->phy.ops.read_reg(hw, AQ_FW_REV,
   1082  1.3   msaitoh 				      IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE,
   1083  1.3   msaitoh 				      firmware_version);
   1084  1.1    dyoung 
   1085  1.1    dyoung 	return status;
   1086  1.1    dyoung }
   1087  1.1    dyoung 
   1088  1.1    dyoung /**
   1089  1.1    dyoung  *  ixgbe_reset_phy_nl - Performs a PHY reset
   1090  1.1    dyoung  *  @hw: pointer to hardware structure
   1091  1.1    dyoung  **/
   1092  1.1    dyoung s32 ixgbe_reset_phy_nl(struct ixgbe_hw *hw)
   1093  1.1    dyoung {
   1094  1.1    dyoung 	u16 phy_offset, control, eword, edata, block_crc;
   1095  1.1    dyoung 	bool end_data = FALSE;
   1096  1.1    dyoung 	u16 list_offset, data_offset;
   1097  1.1    dyoung 	u16 phy_data = 0;
   1098  1.1    dyoung 	s32 ret_val = IXGBE_SUCCESS;
   1099  1.1    dyoung 	u32 i;
   1100  1.1    dyoung 
   1101  1.1    dyoung 	DEBUGFUNC("ixgbe_reset_phy_nl");
   1102  1.1    dyoung 
   1103  1.7   msaitoh 	/* Blocked by MNG FW so bail */
   1104  1.7   msaitoh 	if (ixgbe_check_reset_blocked(hw))
   1105  1.7   msaitoh 		goto out;
   1106  1.7   msaitoh 
   1107  1.1    dyoung 	hw->phy.ops.read_reg(hw, IXGBE_MDIO_PHY_XS_CONTROL,
   1108  1.3   msaitoh 			     IXGBE_MDIO_PHY_XS_DEV_TYPE, &phy_data);
   1109  1.1    dyoung 
   1110  1.1    dyoung 	/* reset the PHY and poll for completion */
   1111  1.1    dyoung 	hw->phy.ops.write_reg(hw, IXGBE_MDIO_PHY_XS_CONTROL,
   1112  1.3   msaitoh 			      IXGBE_MDIO_PHY_XS_DEV_TYPE,
   1113  1.3   msaitoh 			      (phy_data | IXGBE_MDIO_PHY_XS_RESET));
   1114  1.1    dyoung 
   1115  1.1    dyoung 	for (i = 0; i < 100; i++) {
   1116  1.1    dyoung 		hw->phy.ops.read_reg(hw, IXGBE_MDIO_PHY_XS_CONTROL,
   1117  1.3   msaitoh 				     IXGBE_MDIO_PHY_XS_DEV_TYPE, &phy_data);
   1118  1.1    dyoung 		if ((phy_data & IXGBE_MDIO_PHY_XS_RESET) == 0)
   1119  1.1    dyoung 			break;
   1120  1.1    dyoung 		msec_delay(10);
   1121  1.1    dyoung 	}
   1122  1.1    dyoung 
   1123  1.1    dyoung 	if ((phy_data & IXGBE_MDIO_PHY_XS_RESET) != 0) {
   1124  1.1    dyoung 		DEBUGOUT("PHY reset did not complete.\n");
   1125  1.1    dyoung 		ret_val = IXGBE_ERR_PHY;
   1126  1.1    dyoung 		goto out;
   1127  1.1    dyoung 	}
   1128  1.1    dyoung 
   1129  1.1    dyoung 	/* Get init offsets */
   1130  1.1    dyoung 	ret_val = ixgbe_get_sfp_init_sequence_offsets(hw, &list_offset,
   1131  1.3   msaitoh 						      &data_offset);
   1132  1.1    dyoung 	if (ret_val != IXGBE_SUCCESS)
   1133  1.1    dyoung 		goto out;
   1134  1.1    dyoung 
   1135  1.1    dyoung 	ret_val = hw->eeprom.ops.read(hw, data_offset, &block_crc);
   1136  1.1    dyoung 	data_offset++;
   1137  1.1    dyoung 	while (!end_data) {
   1138  1.1    dyoung 		/*
   1139  1.1    dyoung 		 * Read control word from PHY init contents offset
   1140  1.1    dyoung 		 */
   1141  1.1    dyoung 		ret_val = hw->eeprom.ops.read(hw, data_offset, &eword);
   1142  1.6   msaitoh 		if (ret_val)
   1143  1.6   msaitoh 			goto err_eeprom;
   1144  1.1    dyoung 		control = (eword & IXGBE_CONTROL_MASK_NL) >>
   1145  1.3   msaitoh 			   IXGBE_CONTROL_SHIFT_NL;
   1146  1.1    dyoung 		edata = eword & IXGBE_DATA_MASK_NL;
   1147  1.1    dyoung 		switch (control) {
   1148  1.1    dyoung 		case IXGBE_DELAY_NL:
   1149  1.1    dyoung 			data_offset++;
   1150  1.1    dyoung 			DEBUGOUT1("DELAY: %d MS\n", edata);
   1151  1.1    dyoung 			msec_delay(edata);
   1152  1.1    dyoung 			break;
   1153  1.1    dyoung 		case IXGBE_DATA_NL:
   1154  1.3   msaitoh 			DEBUGOUT("DATA:\n");
   1155  1.1    dyoung 			data_offset++;
   1156  1.6   msaitoh 			ret_val = hw->eeprom.ops.read(hw, data_offset,
   1157  1.6   msaitoh 						      &phy_offset);
   1158  1.6   msaitoh 			if (ret_val)
   1159  1.6   msaitoh 				goto err_eeprom;
   1160  1.6   msaitoh 			data_offset++;
   1161  1.1    dyoung 			for (i = 0; i < edata; i++) {
   1162  1.6   msaitoh 				ret_val = hw->eeprom.ops.read(hw, data_offset,
   1163  1.6   msaitoh 							      &eword);
   1164  1.6   msaitoh 				if (ret_val)
   1165  1.6   msaitoh 					goto err_eeprom;
   1166  1.1    dyoung 				hw->phy.ops.write_reg(hw, phy_offset,
   1167  1.3   msaitoh 						      IXGBE_TWINAX_DEV, eword);
   1168  1.1    dyoung 				DEBUGOUT2("Wrote %4.4x to %4.4x\n", eword,
   1169  1.3   msaitoh 					  phy_offset);
   1170  1.1    dyoung 				data_offset++;
   1171  1.1    dyoung 				phy_offset++;
   1172  1.1    dyoung 			}
   1173  1.1    dyoung 			break;
   1174  1.1    dyoung 		case IXGBE_CONTROL_NL:
   1175  1.1    dyoung 			data_offset++;
   1176  1.3   msaitoh 			DEBUGOUT("CONTROL:\n");
   1177  1.1    dyoung 			if (edata == IXGBE_CONTROL_EOL_NL) {
   1178  1.1    dyoung 				DEBUGOUT("EOL\n");
   1179  1.1    dyoung 				end_data = TRUE;
   1180  1.1    dyoung 			} else if (edata == IXGBE_CONTROL_SOL_NL) {
   1181  1.1    dyoung 				DEBUGOUT("SOL\n");
   1182  1.1    dyoung 			} else {
   1183  1.1    dyoung 				DEBUGOUT("Bad control value\n");
   1184  1.1    dyoung 				ret_val = IXGBE_ERR_PHY;
   1185  1.1    dyoung 				goto out;
   1186  1.1    dyoung 			}
   1187  1.1    dyoung 			break;
   1188  1.1    dyoung 		default:
   1189  1.1    dyoung 			DEBUGOUT("Bad control type\n");
   1190  1.1    dyoung 			ret_val = IXGBE_ERR_PHY;
   1191  1.1    dyoung 			goto out;
   1192  1.1    dyoung 		}
   1193  1.1    dyoung 	}
   1194  1.1    dyoung 
   1195  1.1    dyoung out:
   1196  1.1    dyoung 	return ret_val;
   1197  1.6   msaitoh 
   1198  1.6   msaitoh err_eeprom:
   1199  1.6   msaitoh 	ERROR_REPORT2(IXGBE_ERROR_INVALID_STATE,
   1200  1.6   msaitoh 		      "eeprom read at offset %d failed", data_offset);
   1201  1.6   msaitoh 	return IXGBE_ERR_PHY;
   1202  1.1    dyoung }
   1203  1.1    dyoung 
   1204  1.1    dyoung /**
   1205  1.3   msaitoh  *  ixgbe_identify_module_generic - Identifies module type
   1206  1.3   msaitoh  *  @hw: pointer to hardware structure
   1207  1.3   msaitoh  *
   1208  1.3   msaitoh  *  Determines HW type and calls appropriate function.
   1209  1.3   msaitoh  **/
   1210  1.3   msaitoh s32 ixgbe_identify_module_generic(struct ixgbe_hw *hw)
   1211  1.3   msaitoh {
   1212  1.3   msaitoh 	s32 status = IXGBE_ERR_SFP_NOT_PRESENT;
   1213  1.3   msaitoh 
   1214  1.3   msaitoh 	DEBUGFUNC("ixgbe_identify_module_generic");
   1215  1.3   msaitoh 
   1216  1.3   msaitoh 	switch (hw->mac.ops.get_media_type(hw)) {
   1217  1.3   msaitoh 	case ixgbe_media_type_fiber:
   1218  1.3   msaitoh 		status = ixgbe_identify_sfp_module_generic(hw);
   1219  1.3   msaitoh 		break;
   1220  1.3   msaitoh 
   1221  1.7   msaitoh 	case ixgbe_media_type_fiber_qsfp:
   1222  1.7   msaitoh 		status = ixgbe_identify_qsfp_module_generic(hw);
   1223  1.7   msaitoh 		break;
   1224  1.3   msaitoh 
   1225  1.3   msaitoh 	default:
   1226  1.3   msaitoh 		hw->phy.sfp_type = ixgbe_sfp_type_not_present;
   1227  1.3   msaitoh 		status = IXGBE_ERR_SFP_NOT_PRESENT;
   1228  1.3   msaitoh 		break;
   1229  1.3   msaitoh 	}
   1230  1.3   msaitoh 
   1231  1.3   msaitoh 	return status;
   1232  1.3   msaitoh }
   1233  1.3   msaitoh 
   1234  1.3   msaitoh /**
   1235  1.1    dyoung  *  ixgbe_identify_sfp_module_generic - Identifies SFP modules
   1236  1.1    dyoung  *  @hw: pointer to hardware structure
   1237  1.1    dyoung  *
   1238  1.1    dyoung  *  Searches for and identifies the SFP module and assigns appropriate PHY type.
   1239  1.1    dyoung  **/
   1240  1.1    dyoung s32 ixgbe_identify_sfp_module_generic(struct ixgbe_hw *hw)
   1241  1.1    dyoung {
   1242  1.1    dyoung 	s32 status = IXGBE_ERR_PHY_ADDR_INVALID;
   1243  1.1    dyoung 	u32 vendor_oui = 0;
   1244  1.1    dyoung 	enum ixgbe_sfp_type stored_sfp_type = hw->phy.sfp_type;
   1245  1.1    dyoung 	u8 identifier = 0;
   1246  1.1    dyoung 	u8 comp_codes_1g = 0;
   1247  1.1    dyoung 	u8 comp_codes_10g = 0;
   1248  1.1    dyoung 	u8 oui_bytes[3] = {0, 0, 0};
   1249  1.1    dyoung 	u8 cable_tech = 0;
   1250  1.1    dyoung 	u8 cable_spec = 0;
   1251  1.1    dyoung 	u16 enforce_sfp = 0;
   1252  1.1    dyoung 
   1253  1.1    dyoung 	DEBUGFUNC("ixgbe_identify_sfp_module_generic");
   1254  1.1    dyoung 
   1255  1.1    dyoung 	if (hw->mac.ops.get_media_type(hw) != ixgbe_media_type_fiber) {
   1256  1.1    dyoung 		hw->phy.sfp_type = ixgbe_sfp_type_not_present;
   1257  1.1    dyoung 		status = IXGBE_ERR_SFP_NOT_PRESENT;
   1258  1.1    dyoung 		goto out;
   1259  1.1    dyoung 	}
   1260  1.1    dyoung 
   1261  1.7   msaitoh 	/* LAN ID is needed for I2C access */
   1262  1.7   msaitoh 	hw->mac.ops.set_lan_id(hw);
   1263  1.7   msaitoh 
   1264  1.1    dyoung 	status = hw->phy.ops.read_i2c_eeprom(hw,
   1265  1.3   msaitoh 					     IXGBE_SFF_IDENTIFIER,
   1266  1.3   msaitoh 					     &identifier);
   1267  1.1    dyoung 
   1268  1.5   msaitoh 	if (status != IXGBE_SUCCESS)
   1269  1.1    dyoung 		goto err_read_i2c_eeprom;
   1270  1.1    dyoung 
   1271  1.1    dyoung 	if (identifier != IXGBE_SFF_IDENTIFIER_SFP) {
   1272  1.1    dyoung 		hw->phy.type = ixgbe_phy_sfp_unsupported;
   1273  1.1    dyoung 		status = IXGBE_ERR_SFP_NOT_SUPPORTED;
   1274  1.1    dyoung 	} else {
   1275  1.1    dyoung 		status = hw->phy.ops.read_i2c_eeprom(hw,
   1276  1.3   msaitoh 						     IXGBE_SFF_1GBE_COMP_CODES,
   1277  1.3   msaitoh 						     &comp_codes_1g);
   1278  1.1    dyoung 
   1279  1.5   msaitoh 		if (status != IXGBE_SUCCESS)
   1280  1.1    dyoung 			goto err_read_i2c_eeprom;
   1281  1.1    dyoung 
   1282  1.1    dyoung 		status = hw->phy.ops.read_i2c_eeprom(hw,
   1283  1.3   msaitoh 						     IXGBE_SFF_10GBE_COMP_CODES,
   1284  1.3   msaitoh 						     &comp_codes_10g);
   1285  1.1    dyoung 
   1286  1.5   msaitoh 		if (status != IXGBE_SUCCESS)
   1287  1.1    dyoung 			goto err_read_i2c_eeprom;
   1288  1.1    dyoung 		status = hw->phy.ops.read_i2c_eeprom(hw,
   1289  1.3   msaitoh 						     IXGBE_SFF_CABLE_TECHNOLOGY,
   1290  1.3   msaitoh 						     &cable_tech);
   1291  1.1    dyoung 
   1292  1.5   msaitoh 		if (status != IXGBE_SUCCESS)
   1293  1.1    dyoung 			goto err_read_i2c_eeprom;
   1294  1.1    dyoung 
   1295  1.1    dyoung 		 /* ID Module
   1296  1.1    dyoung 		  * =========
   1297  1.1    dyoung 		  * 0   SFP_DA_CU
   1298  1.1    dyoung 		  * 1   SFP_SR
   1299  1.1    dyoung 		  * 2   SFP_LR
   1300  1.1    dyoung 		  * 3   SFP_DA_CORE0 - 82599-specific
   1301  1.1    dyoung 		  * 4   SFP_DA_CORE1 - 82599-specific
   1302  1.1    dyoung 		  * 5   SFP_SR/LR_CORE0 - 82599-specific
   1303  1.1    dyoung 		  * 6   SFP_SR/LR_CORE1 - 82599-specific
   1304  1.1    dyoung 		  * 7   SFP_act_lmt_DA_CORE0 - 82599-specific
   1305  1.1    dyoung 		  * 8   SFP_act_lmt_DA_CORE1 - 82599-specific
   1306  1.1    dyoung 		  * 9   SFP_1g_cu_CORE0 - 82599-specific
   1307  1.1    dyoung 		  * 10  SFP_1g_cu_CORE1 - 82599-specific
   1308  1.4   msaitoh 		  * 11  SFP_1g_sx_CORE0 - 82599-specific
   1309  1.4   msaitoh 		  * 12  SFP_1g_sx_CORE1 - 82599-specific
   1310  1.1    dyoung 		  */
   1311  1.1    dyoung 		if (hw->mac.type == ixgbe_mac_82598EB) {
   1312  1.1    dyoung 			if (cable_tech & IXGBE_SFF_DA_PASSIVE_CABLE)
   1313  1.1    dyoung 				hw->phy.sfp_type = ixgbe_sfp_type_da_cu;
   1314  1.1    dyoung 			else if (comp_codes_10g & IXGBE_SFF_10GBASESR_CAPABLE)
   1315  1.1    dyoung 				hw->phy.sfp_type = ixgbe_sfp_type_sr;
   1316  1.1    dyoung 			else if (comp_codes_10g & IXGBE_SFF_10GBASELR_CAPABLE)
   1317  1.1    dyoung 				hw->phy.sfp_type = ixgbe_sfp_type_lr;
   1318  1.1    dyoung 			else
   1319  1.1    dyoung 				hw->phy.sfp_type = ixgbe_sfp_type_unknown;
   1320  1.7   msaitoh 		} else {
   1321  1.1    dyoung 			if (cable_tech & IXGBE_SFF_DA_PASSIVE_CABLE) {
   1322  1.1    dyoung 				if (hw->bus.lan_id == 0)
   1323  1.1    dyoung 					hw->phy.sfp_type =
   1324  1.3   msaitoh 						     ixgbe_sfp_type_da_cu_core0;
   1325  1.1    dyoung 				else
   1326  1.1    dyoung 					hw->phy.sfp_type =
   1327  1.3   msaitoh 						     ixgbe_sfp_type_da_cu_core1;
   1328  1.1    dyoung 			} else if (cable_tech & IXGBE_SFF_DA_ACTIVE_CABLE) {
   1329  1.1    dyoung 				hw->phy.ops.read_i2c_eeprom(
   1330  1.1    dyoung 						hw, IXGBE_SFF_CABLE_SPEC_COMP,
   1331  1.1    dyoung 						&cable_spec);
   1332  1.1    dyoung 				if (cable_spec &
   1333  1.1    dyoung 				    IXGBE_SFF_DA_SPEC_ACTIVE_LIMITING) {
   1334  1.1    dyoung 					if (hw->bus.lan_id == 0)
   1335  1.1    dyoung 						hw->phy.sfp_type =
   1336  1.1    dyoung 						ixgbe_sfp_type_da_act_lmt_core0;
   1337  1.1    dyoung 					else
   1338  1.1    dyoung 						hw->phy.sfp_type =
   1339  1.1    dyoung 						ixgbe_sfp_type_da_act_lmt_core1;
   1340  1.1    dyoung 				} else {
   1341  1.1    dyoung 					hw->phy.sfp_type =
   1342  1.3   msaitoh 							ixgbe_sfp_type_unknown;
   1343  1.1    dyoung 				}
   1344  1.1    dyoung 			} else if (comp_codes_10g &
   1345  1.1    dyoung 				   (IXGBE_SFF_10GBASESR_CAPABLE |
   1346  1.1    dyoung 				    IXGBE_SFF_10GBASELR_CAPABLE)) {
   1347  1.1    dyoung 				if (hw->bus.lan_id == 0)
   1348  1.1    dyoung 					hw->phy.sfp_type =
   1349  1.3   msaitoh 						      ixgbe_sfp_type_srlr_core0;
   1350  1.1    dyoung 				else
   1351  1.1    dyoung 					hw->phy.sfp_type =
   1352  1.3   msaitoh 						      ixgbe_sfp_type_srlr_core1;
   1353  1.1    dyoung 			} else if (comp_codes_1g & IXGBE_SFF_1GBASET_CAPABLE) {
   1354  1.1    dyoung 				if (hw->bus.lan_id == 0)
   1355  1.1    dyoung 					hw->phy.sfp_type =
   1356  1.1    dyoung 						ixgbe_sfp_type_1g_cu_core0;
   1357  1.1    dyoung 				else
   1358  1.1    dyoung 					hw->phy.sfp_type =
   1359  1.1    dyoung 						ixgbe_sfp_type_1g_cu_core1;
   1360  1.4   msaitoh 			} else if (comp_codes_1g & IXGBE_SFF_1GBASESX_CAPABLE) {
   1361  1.4   msaitoh 				if (hw->bus.lan_id == 0)
   1362  1.4   msaitoh 					hw->phy.sfp_type =
   1363  1.4   msaitoh 						ixgbe_sfp_type_1g_sx_core0;
   1364  1.4   msaitoh 				else
   1365  1.4   msaitoh 					hw->phy.sfp_type =
   1366  1.4   msaitoh 						ixgbe_sfp_type_1g_sx_core1;
   1367  1.1    dyoung 			} else {
   1368  1.1    dyoung 				hw->phy.sfp_type = ixgbe_sfp_type_unknown;
   1369  1.1    dyoung 			}
   1370  1.1    dyoung 		}
   1371  1.1    dyoung 
   1372  1.1    dyoung 		if (hw->phy.sfp_type != stored_sfp_type)
   1373  1.1    dyoung 			hw->phy.sfp_setup_needed = TRUE;
   1374  1.1    dyoung 
   1375  1.1    dyoung 		/* Determine if the SFP+ PHY is dual speed or not. */
   1376  1.1    dyoung 		hw->phy.multispeed_fiber = FALSE;
   1377  1.1    dyoung 		if (((comp_codes_1g & IXGBE_SFF_1GBASESX_CAPABLE) &&
   1378  1.1    dyoung 		   (comp_codes_10g & IXGBE_SFF_10GBASESR_CAPABLE)) ||
   1379  1.1    dyoung 		   ((comp_codes_1g & IXGBE_SFF_1GBASELX_CAPABLE) &&
   1380  1.1    dyoung 		   (comp_codes_10g & IXGBE_SFF_10GBASELR_CAPABLE)))
   1381  1.1    dyoung 			hw->phy.multispeed_fiber = TRUE;
   1382  1.1    dyoung 
   1383  1.1    dyoung 		/* Determine PHY vendor */
   1384  1.1    dyoung 		if (hw->phy.type != ixgbe_phy_nl) {
   1385  1.1    dyoung 			hw->phy.id = identifier;
   1386  1.1    dyoung 			status = hw->phy.ops.read_i2c_eeprom(hw,
   1387  1.3   msaitoh 						    IXGBE_SFF_VENDOR_OUI_BYTE0,
   1388  1.3   msaitoh 						    &oui_bytes[0]);
   1389  1.1    dyoung 
   1390  1.5   msaitoh 			if (status != IXGBE_SUCCESS)
   1391  1.1    dyoung 				goto err_read_i2c_eeprom;
   1392  1.1    dyoung 
   1393  1.1    dyoung 			status = hw->phy.ops.read_i2c_eeprom(hw,
   1394  1.3   msaitoh 						    IXGBE_SFF_VENDOR_OUI_BYTE1,
   1395  1.3   msaitoh 						    &oui_bytes[1]);
   1396  1.1    dyoung 
   1397  1.5   msaitoh 			if (status != IXGBE_SUCCESS)
   1398  1.1    dyoung 				goto err_read_i2c_eeprom;
   1399  1.1    dyoung 
   1400  1.1    dyoung 			status = hw->phy.ops.read_i2c_eeprom(hw,
   1401  1.3   msaitoh 						    IXGBE_SFF_VENDOR_OUI_BYTE2,
   1402  1.3   msaitoh 						    &oui_bytes[2]);
   1403  1.1    dyoung 
   1404  1.5   msaitoh 			if (status != IXGBE_SUCCESS)
   1405  1.1    dyoung 				goto err_read_i2c_eeprom;
   1406  1.1    dyoung 
   1407  1.1    dyoung 			vendor_oui =
   1408  1.1    dyoung 			  ((oui_bytes[0] << IXGBE_SFF_VENDOR_OUI_BYTE0_SHIFT) |
   1409  1.1    dyoung 			   (oui_bytes[1] << IXGBE_SFF_VENDOR_OUI_BYTE1_SHIFT) |
   1410  1.1    dyoung 			   (oui_bytes[2] << IXGBE_SFF_VENDOR_OUI_BYTE2_SHIFT));
   1411  1.1    dyoung 
   1412  1.1    dyoung 			switch (vendor_oui) {
   1413  1.1    dyoung 			case IXGBE_SFF_VENDOR_OUI_TYCO:
   1414  1.1    dyoung 				if (cable_tech & IXGBE_SFF_DA_PASSIVE_CABLE)
   1415  1.1    dyoung 					hw->phy.type =
   1416  1.3   msaitoh 						    ixgbe_phy_sfp_passive_tyco;
   1417  1.1    dyoung 				break;
   1418  1.1    dyoung 			case IXGBE_SFF_VENDOR_OUI_FTL:
   1419  1.1    dyoung 				if (cable_tech & IXGBE_SFF_DA_ACTIVE_CABLE)
   1420  1.1    dyoung 					hw->phy.type = ixgbe_phy_sfp_ftl_active;
   1421  1.1    dyoung 				else
   1422  1.1    dyoung 					hw->phy.type = ixgbe_phy_sfp_ftl;
   1423  1.1    dyoung 				break;
   1424  1.1    dyoung 			case IXGBE_SFF_VENDOR_OUI_AVAGO:
   1425  1.1    dyoung 				hw->phy.type = ixgbe_phy_sfp_avago;
   1426  1.1    dyoung 				break;
   1427  1.1    dyoung 			case IXGBE_SFF_VENDOR_OUI_INTEL:
   1428  1.1    dyoung 				hw->phy.type = ixgbe_phy_sfp_intel;
   1429  1.1    dyoung 				break;
   1430  1.1    dyoung 			default:
   1431  1.1    dyoung 				if (cable_tech & IXGBE_SFF_DA_PASSIVE_CABLE)
   1432  1.1    dyoung 					hw->phy.type =
   1433  1.3   msaitoh 						 ixgbe_phy_sfp_passive_unknown;
   1434  1.1    dyoung 				else if (cable_tech & IXGBE_SFF_DA_ACTIVE_CABLE)
   1435  1.1    dyoung 					hw->phy.type =
   1436  1.1    dyoung 						ixgbe_phy_sfp_active_unknown;
   1437  1.1    dyoung 				else
   1438  1.1    dyoung 					hw->phy.type = ixgbe_phy_sfp_unknown;
   1439  1.1    dyoung 				break;
   1440  1.1    dyoung 			}
   1441  1.1    dyoung 		}
   1442  1.1    dyoung 
   1443  1.1    dyoung 		/* Allow any DA cable vendor */
   1444  1.1    dyoung 		if (cable_tech & (IXGBE_SFF_DA_PASSIVE_CABLE |
   1445  1.1    dyoung 		    IXGBE_SFF_DA_ACTIVE_CABLE)) {
   1446  1.1    dyoung 			status = IXGBE_SUCCESS;
   1447  1.1    dyoung 			goto out;
   1448  1.1    dyoung 		}
   1449  1.1    dyoung 
   1450  1.1    dyoung 		/* Verify supported 1G SFP modules */
   1451  1.1    dyoung 		if (comp_codes_10g == 0 &&
   1452  1.1    dyoung 		    !(hw->phy.sfp_type == ixgbe_sfp_type_1g_cu_core1 ||
   1453  1.4   msaitoh 		      hw->phy.sfp_type == ixgbe_sfp_type_1g_cu_core0 ||
   1454  1.6   msaitoh 		      hw->phy.sfp_type == ixgbe_sfp_type_1g_sx_core0 ||
   1455  1.4   msaitoh 		      hw->phy.sfp_type == ixgbe_sfp_type_1g_sx_core1)) {
   1456  1.1    dyoung 			hw->phy.type = ixgbe_phy_sfp_unsupported;
   1457  1.1    dyoung 			status = IXGBE_ERR_SFP_NOT_SUPPORTED;
   1458  1.1    dyoung 			goto out;
   1459  1.1    dyoung 		}
   1460  1.1    dyoung 
   1461  1.1    dyoung 		/* Anything else 82598-based is supported */
   1462  1.1    dyoung 		if (hw->mac.type == ixgbe_mac_82598EB) {
   1463  1.1    dyoung 			status = IXGBE_SUCCESS;
   1464  1.1    dyoung 			goto out;
   1465  1.1    dyoung 		}
   1466  1.1    dyoung 
   1467  1.1    dyoung 		ixgbe_get_device_caps(hw, &enforce_sfp);
   1468  1.1    dyoung 		if (!(enforce_sfp & IXGBE_DEVICE_CAPS_ALLOW_ANY_SFP) &&
   1469  1.6   msaitoh 		    !(hw->phy.sfp_type == ixgbe_sfp_type_1g_cu_core0 ||
   1470  1.6   msaitoh 		      hw->phy.sfp_type == ixgbe_sfp_type_1g_cu_core1 ||
   1471  1.6   msaitoh 		      hw->phy.sfp_type == ixgbe_sfp_type_1g_sx_core0 ||
   1472  1.6   msaitoh 		      hw->phy.sfp_type == ixgbe_sfp_type_1g_sx_core1)) {
   1473  1.1    dyoung 			/* Make sure we're a supported PHY type */
   1474  1.1    dyoung 			if (hw->phy.type == ixgbe_phy_sfp_intel) {
   1475  1.1    dyoung 				status = IXGBE_SUCCESS;
   1476  1.1    dyoung 			} else {
   1477  1.4   msaitoh 				if (hw->allow_unsupported_sfp == TRUE) {
   1478  1.4   msaitoh 					EWARN(hw, "WARNING: Intel (R) Network "
   1479  1.4   msaitoh 					      "Connections are quality tested "
   1480  1.4   msaitoh 					      "using Intel (R) Ethernet Optics."
   1481  1.4   msaitoh 					      " Using untested modules is not "
   1482  1.4   msaitoh 					      "supported and may cause unstable"
   1483  1.4   msaitoh 					      " operation or damage to the "
   1484  1.4   msaitoh 					      "module or the adapter. Intel "
   1485  1.4   msaitoh 					      "Corporation is not responsible "
   1486  1.4   msaitoh 					      "for any harm caused by using "
   1487  1.4   msaitoh 					      "untested modules.\n", status);
   1488  1.4   msaitoh 					status = IXGBE_SUCCESS;
   1489  1.4   msaitoh 				} else {
   1490  1.4   msaitoh 					DEBUGOUT("SFP+ module not supported\n");
   1491  1.4   msaitoh 					hw->phy.type =
   1492  1.4   msaitoh 						ixgbe_phy_sfp_unsupported;
   1493  1.4   msaitoh 					status = IXGBE_ERR_SFP_NOT_SUPPORTED;
   1494  1.4   msaitoh 				}
   1495  1.1    dyoung 			}
   1496  1.1    dyoung 		} else {
   1497  1.1    dyoung 			status = IXGBE_SUCCESS;
   1498  1.1    dyoung 		}
   1499  1.1    dyoung 	}
   1500  1.1    dyoung 
   1501  1.1    dyoung out:
   1502  1.1    dyoung 	return status;
   1503  1.1    dyoung 
   1504  1.1    dyoung err_read_i2c_eeprom:
   1505  1.1    dyoung 	hw->phy.sfp_type = ixgbe_sfp_type_not_present;
   1506  1.1    dyoung 	if (hw->phy.type != ixgbe_phy_nl) {
   1507  1.1    dyoung 		hw->phy.id = 0;
   1508  1.1    dyoung 		hw->phy.type = ixgbe_phy_unknown;
   1509  1.1    dyoung 	}
   1510  1.1    dyoung 	return IXGBE_ERR_SFP_NOT_PRESENT;
   1511  1.1    dyoung }
   1512  1.1    dyoung 
   1513  1.7   msaitoh /**
   1514  1.7   msaitoh  *  ixgbe_get_supported_phy_sfp_layer_generic - Returns physical layer type
   1515  1.7   msaitoh  *  @hw: pointer to hardware structure
   1516  1.7   msaitoh  *
   1517  1.7   msaitoh  *  Determines physical layer capabilities of the current SFP.
   1518  1.7   msaitoh  */
   1519  1.7   msaitoh s32 ixgbe_get_supported_phy_sfp_layer_generic(struct ixgbe_hw *hw)
   1520  1.7   msaitoh {
   1521  1.7   msaitoh 	u32 physical_layer = IXGBE_PHYSICAL_LAYER_UNKNOWN;
   1522  1.7   msaitoh 	u8 comp_codes_10g = 0;
   1523  1.7   msaitoh 	u8 comp_codes_1g = 0;
   1524  1.7   msaitoh 
   1525  1.7   msaitoh 	DEBUGFUNC("ixgbe_get_supported_phy_sfp_layer_generic");
   1526  1.7   msaitoh 
   1527  1.7   msaitoh 	hw->phy.ops.identify_sfp(hw);
   1528  1.7   msaitoh 	if (hw->phy.sfp_type == ixgbe_sfp_type_not_present)
   1529  1.7   msaitoh 		return physical_layer;
   1530  1.7   msaitoh 
   1531  1.7   msaitoh 	switch (hw->phy.type) {
   1532  1.7   msaitoh 	case ixgbe_phy_sfp_passive_tyco:
   1533  1.7   msaitoh 	case ixgbe_phy_sfp_passive_unknown:
   1534  1.7   msaitoh 	case ixgbe_phy_qsfp_passive_unknown:
   1535  1.7   msaitoh 		physical_layer = IXGBE_PHYSICAL_LAYER_SFP_PLUS_CU;
   1536  1.7   msaitoh 		break;
   1537  1.7   msaitoh 	case ixgbe_phy_sfp_ftl_active:
   1538  1.7   msaitoh 	case ixgbe_phy_sfp_active_unknown:
   1539  1.7   msaitoh 	case ixgbe_phy_qsfp_active_unknown:
   1540  1.7   msaitoh 		physical_layer = IXGBE_PHYSICAL_LAYER_SFP_ACTIVE_DA;
   1541  1.7   msaitoh 		break;
   1542  1.7   msaitoh 	case ixgbe_phy_sfp_avago:
   1543  1.7   msaitoh 	case ixgbe_phy_sfp_ftl:
   1544  1.7   msaitoh 	case ixgbe_phy_sfp_intel:
   1545  1.7   msaitoh 	case ixgbe_phy_sfp_unknown:
   1546  1.7   msaitoh 		hw->phy.ops.read_i2c_eeprom(hw,
   1547  1.7   msaitoh 		      IXGBE_SFF_1GBE_COMP_CODES, &comp_codes_1g);
   1548  1.7   msaitoh 		hw->phy.ops.read_i2c_eeprom(hw,
   1549  1.7   msaitoh 		      IXGBE_SFF_10GBE_COMP_CODES, &comp_codes_10g);
   1550  1.7   msaitoh 		if (comp_codes_10g & IXGBE_SFF_10GBASESR_CAPABLE)
   1551  1.7   msaitoh 			physical_layer = IXGBE_PHYSICAL_LAYER_10GBASE_SR;
   1552  1.7   msaitoh 		else if (comp_codes_10g & IXGBE_SFF_10GBASELR_CAPABLE)
   1553  1.7   msaitoh 			physical_layer = IXGBE_PHYSICAL_LAYER_10GBASE_LR;
   1554  1.7   msaitoh 		else if (comp_codes_1g & IXGBE_SFF_1GBASET_CAPABLE)
   1555  1.7   msaitoh 			physical_layer = IXGBE_PHYSICAL_LAYER_1000BASE_T;
   1556  1.7   msaitoh 		else if (comp_codes_1g & IXGBE_SFF_1GBASESX_CAPABLE)
   1557  1.7   msaitoh 			physical_layer = IXGBE_PHYSICAL_LAYER_1000BASE_SX;
   1558  1.7   msaitoh 		break;
   1559  1.7   msaitoh 	case ixgbe_phy_qsfp_intel:
   1560  1.7   msaitoh 	case ixgbe_phy_qsfp_unknown:
   1561  1.7   msaitoh 		hw->phy.ops.read_i2c_eeprom(hw,
   1562  1.7   msaitoh 		      IXGBE_SFF_QSFP_10GBE_COMP, &comp_codes_10g);
   1563  1.7   msaitoh 		if (comp_codes_10g & IXGBE_SFF_10GBASESR_CAPABLE)
   1564  1.7   msaitoh 			physical_layer = IXGBE_PHYSICAL_LAYER_10GBASE_SR;
   1565  1.7   msaitoh 		else if (comp_codes_10g & IXGBE_SFF_10GBASELR_CAPABLE)
   1566  1.7   msaitoh 			physical_layer = IXGBE_PHYSICAL_LAYER_10GBASE_LR;
   1567  1.7   msaitoh 		break;
   1568  1.7   msaitoh 	default:
   1569  1.7   msaitoh 		break;
   1570  1.7   msaitoh 	}
   1571  1.7   msaitoh 
   1572  1.7   msaitoh 	return physical_layer;
   1573  1.7   msaitoh }
   1574  1.7   msaitoh 
   1575  1.7   msaitoh /**
   1576  1.7   msaitoh  *  ixgbe_identify_qsfp_module_generic - Identifies QSFP modules
   1577  1.7   msaitoh  *  @hw: pointer to hardware structure
   1578  1.7   msaitoh  *
   1579  1.7   msaitoh  *  Searches for and identifies the QSFP module and assigns appropriate PHY type
   1580  1.7   msaitoh  **/
   1581  1.7   msaitoh s32 ixgbe_identify_qsfp_module_generic(struct ixgbe_hw *hw)
   1582  1.7   msaitoh {
   1583  1.7   msaitoh 	s32 status = IXGBE_ERR_PHY_ADDR_INVALID;
   1584  1.7   msaitoh 	u32 vendor_oui = 0;
   1585  1.7   msaitoh 	enum ixgbe_sfp_type stored_sfp_type = hw->phy.sfp_type;
   1586  1.7   msaitoh 	u8 identifier = 0;
   1587  1.7   msaitoh 	u8 comp_codes_1g = 0;
   1588  1.7   msaitoh 	u8 comp_codes_10g = 0;
   1589  1.7   msaitoh 	u8 oui_bytes[3] = {0, 0, 0};
   1590  1.7   msaitoh 	u16 enforce_sfp = 0;
   1591  1.7   msaitoh 	u8 connector = 0;
   1592  1.7   msaitoh 	u8 cable_length = 0;
   1593  1.7   msaitoh 	u8 device_tech = 0;
   1594  1.7   msaitoh 	bool active_cable = FALSE;
   1595  1.7   msaitoh 
   1596  1.7   msaitoh 	DEBUGFUNC("ixgbe_identify_qsfp_module_generic");
   1597  1.7   msaitoh 
   1598  1.7   msaitoh 	if (hw->mac.ops.get_media_type(hw) != ixgbe_media_type_fiber_qsfp) {
   1599  1.7   msaitoh 		hw->phy.sfp_type = ixgbe_sfp_type_not_present;
   1600  1.7   msaitoh 		status = IXGBE_ERR_SFP_NOT_PRESENT;
   1601  1.7   msaitoh 		goto out;
   1602  1.7   msaitoh 	}
   1603  1.7   msaitoh 
   1604  1.7   msaitoh 	status = hw->phy.ops.read_i2c_eeprom(hw, IXGBE_SFF_IDENTIFIER,
   1605  1.7   msaitoh 					     &identifier);
   1606  1.7   msaitoh 
   1607  1.7   msaitoh 	if (status != IXGBE_SUCCESS)
   1608  1.7   msaitoh 		goto err_read_i2c_eeprom;
   1609  1.7   msaitoh 
   1610  1.7   msaitoh 	if (identifier != IXGBE_SFF_IDENTIFIER_QSFP_PLUS) {
   1611  1.7   msaitoh 		hw->phy.type = ixgbe_phy_sfp_unsupported;
   1612  1.7   msaitoh 		status = IXGBE_ERR_SFP_NOT_SUPPORTED;
   1613  1.7   msaitoh 		goto out;
   1614  1.7   msaitoh 	}
   1615  1.7   msaitoh 
   1616  1.7   msaitoh 	hw->phy.id = identifier;
   1617  1.7   msaitoh 
   1618  1.7   msaitoh 	/* LAN ID is needed for sfp_type determination */
   1619  1.7   msaitoh 	hw->mac.ops.set_lan_id(hw);
   1620  1.7   msaitoh 
   1621  1.7   msaitoh 	status = hw->phy.ops.read_i2c_eeprom(hw, IXGBE_SFF_QSFP_10GBE_COMP,
   1622  1.7   msaitoh 					     &comp_codes_10g);
   1623  1.7   msaitoh 
   1624  1.7   msaitoh 	if (status != IXGBE_SUCCESS)
   1625  1.7   msaitoh 		goto err_read_i2c_eeprom;
   1626  1.7   msaitoh 
   1627  1.7   msaitoh 	status = hw->phy.ops.read_i2c_eeprom(hw, IXGBE_SFF_QSFP_1GBE_COMP,
   1628  1.7   msaitoh 					     &comp_codes_1g);
   1629  1.7   msaitoh 
   1630  1.7   msaitoh 	if (status != IXGBE_SUCCESS)
   1631  1.7   msaitoh 		goto err_read_i2c_eeprom;
   1632  1.7   msaitoh 
   1633  1.7   msaitoh 	if (comp_codes_10g & IXGBE_SFF_QSFP_DA_PASSIVE_CABLE) {
   1634  1.7   msaitoh 		hw->phy.type = ixgbe_phy_qsfp_passive_unknown;
   1635  1.7   msaitoh 		if (hw->bus.lan_id == 0)
   1636  1.7   msaitoh 			hw->phy.sfp_type = ixgbe_sfp_type_da_cu_core0;
   1637  1.7   msaitoh 		else
   1638  1.7   msaitoh 			hw->phy.sfp_type = ixgbe_sfp_type_da_cu_core1;
   1639  1.7   msaitoh 	} else if (comp_codes_10g & (IXGBE_SFF_10GBASESR_CAPABLE |
   1640  1.7   msaitoh 				     IXGBE_SFF_10GBASELR_CAPABLE)) {
   1641  1.7   msaitoh 		if (hw->bus.lan_id == 0)
   1642  1.7   msaitoh 			hw->phy.sfp_type = ixgbe_sfp_type_srlr_core0;
   1643  1.7   msaitoh 		else
   1644  1.7   msaitoh 			hw->phy.sfp_type = ixgbe_sfp_type_srlr_core1;
   1645  1.7   msaitoh 	} else {
   1646  1.7   msaitoh 		if (comp_codes_10g & IXGBE_SFF_QSFP_DA_ACTIVE_CABLE)
   1647  1.7   msaitoh 			active_cable = TRUE;
   1648  1.7   msaitoh 
   1649  1.7   msaitoh 		if (!active_cable) {
   1650  1.7   msaitoh 			/* check for active DA cables that pre-date
   1651  1.7   msaitoh 			 * SFF-8436 v3.6 */
   1652  1.7   msaitoh 			hw->phy.ops.read_i2c_eeprom(hw,
   1653  1.7   msaitoh 					IXGBE_SFF_QSFP_CONNECTOR,
   1654  1.7   msaitoh 					&connector);
   1655  1.7   msaitoh 
   1656  1.7   msaitoh 			hw->phy.ops.read_i2c_eeprom(hw,
   1657  1.7   msaitoh 					IXGBE_SFF_QSFP_CABLE_LENGTH,
   1658  1.7   msaitoh 					&cable_length);
   1659  1.7   msaitoh 
   1660  1.7   msaitoh 			hw->phy.ops.read_i2c_eeprom(hw,
   1661  1.7   msaitoh 					IXGBE_SFF_QSFP_DEVICE_TECH,
   1662  1.7   msaitoh 					&device_tech);
   1663  1.7   msaitoh 
   1664  1.7   msaitoh 			if ((connector ==
   1665  1.7   msaitoh 				     IXGBE_SFF_QSFP_CONNECTOR_NOT_SEPARABLE) &&
   1666  1.7   msaitoh 			    (cable_length > 0) &&
   1667  1.7   msaitoh 			    ((device_tech >> 4) ==
   1668  1.7   msaitoh 				     IXGBE_SFF_QSFP_TRANSMITER_850NM_VCSEL))
   1669  1.7   msaitoh 				active_cable = TRUE;
   1670  1.7   msaitoh 		}
   1671  1.7   msaitoh 
   1672  1.7   msaitoh 		if (active_cable) {
   1673  1.7   msaitoh 			hw->phy.type = ixgbe_phy_qsfp_active_unknown;
   1674  1.7   msaitoh 			if (hw->bus.lan_id == 0)
   1675  1.7   msaitoh 				hw->phy.sfp_type =
   1676  1.7   msaitoh 						ixgbe_sfp_type_da_act_lmt_core0;
   1677  1.7   msaitoh 			else
   1678  1.7   msaitoh 				hw->phy.sfp_type =
   1679  1.7   msaitoh 						ixgbe_sfp_type_da_act_lmt_core1;
   1680  1.7   msaitoh 		} else {
   1681  1.7   msaitoh 			/* unsupported module type */
   1682  1.7   msaitoh 			hw->phy.type = ixgbe_phy_sfp_unsupported;
   1683  1.7   msaitoh 			status = IXGBE_ERR_SFP_NOT_SUPPORTED;
   1684  1.7   msaitoh 			goto out;
   1685  1.7   msaitoh 		}
   1686  1.7   msaitoh 	}
   1687  1.7   msaitoh 
   1688  1.7   msaitoh 	if (hw->phy.sfp_type != stored_sfp_type)
   1689  1.7   msaitoh 		hw->phy.sfp_setup_needed = TRUE;
   1690  1.7   msaitoh 
   1691  1.7   msaitoh 	/* Determine if the QSFP+ PHY is dual speed or not. */
   1692  1.7   msaitoh 	hw->phy.multispeed_fiber = FALSE;
   1693  1.7   msaitoh 	if (((comp_codes_1g & IXGBE_SFF_1GBASESX_CAPABLE) &&
   1694  1.7   msaitoh 	   (comp_codes_10g & IXGBE_SFF_10GBASESR_CAPABLE)) ||
   1695  1.7   msaitoh 	   ((comp_codes_1g & IXGBE_SFF_1GBASELX_CAPABLE) &&
   1696  1.7   msaitoh 	   (comp_codes_10g & IXGBE_SFF_10GBASELR_CAPABLE)))
   1697  1.7   msaitoh 		hw->phy.multispeed_fiber = TRUE;
   1698  1.7   msaitoh 
   1699  1.7   msaitoh 	/* Determine PHY vendor for optical modules */
   1700  1.7   msaitoh 	if (comp_codes_10g & (IXGBE_SFF_10GBASESR_CAPABLE |
   1701  1.7   msaitoh 			      IXGBE_SFF_10GBASELR_CAPABLE))  {
   1702  1.7   msaitoh 		status = hw->phy.ops.read_i2c_eeprom(hw,
   1703  1.7   msaitoh 					    IXGBE_SFF_QSFP_VENDOR_OUI_BYTE0,
   1704  1.7   msaitoh 					    &oui_bytes[0]);
   1705  1.7   msaitoh 
   1706  1.7   msaitoh 		if (status != IXGBE_SUCCESS)
   1707  1.7   msaitoh 			goto err_read_i2c_eeprom;
   1708  1.7   msaitoh 
   1709  1.7   msaitoh 		status = hw->phy.ops.read_i2c_eeprom(hw,
   1710  1.7   msaitoh 					    IXGBE_SFF_QSFP_VENDOR_OUI_BYTE1,
   1711  1.7   msaitoh 					    &oui_bytes[1]);
   1712  1.7   msaitoh 
   1713  1.7   msaitoh 		if (status != IXGBE_SUCCESS)
   1714  1.7   msaitoh 			goto err_read_i2c_eeprom;
   1715  1.7   msaitoh 
   1716  1.7   msaitoh 		status = hw->phy.ops.read_i2c_eeprom(hw,
   1717  1.7   msaitoh 					    IXGBE_SFF_QSFP_VENDOR_OUI_BYTE2,
   1718  1.7   msaitoh 					    &oui_bytes[2]);
   1719  1.7   msaitoh 
   1720  1.7   msaitoh 		if (status != IXGBE_SUCCESS)
   1721  1.7   msaitoh 			goto err_read_i2c_eeprom;
   1722  1.7   msaitoh 
   1723  1.7   msaitoh 		vendor_oui =
   1724  1.7   msaitoh 		  ((oui_bytes[0] << IXGBE_SFF_VENDOR_OUI_BYTE0_SHIFT) |
   1725  1.7   msaitoh 		   (oui_bytes[1] << IXGBE_SFF_VENDOR_OUI_BYTE1_SHIFT) |
   1726  1.7   msaitoh 		   (oui_bytes[2] << IXGBE_SFF_VENDOR_OUI_BYTE2_SHIFT));
   1727  1.7   msaitoh 
   1728  1.7   msaitoh 		if (vendor_oui == IXGBE_SFF_VENDOR_OUI_INTEL)
   1729  1.7   msaitoh 			hw->phy.type = ixgbe_phy_qsfp_intel;
   1730  1.7   msaitoh 		else
   1731  1.7   msaitoh 			hw->phy.type = ixgbe_phy_qsfp_unknown;
   1732  1.7   msaitoh 
   1733  1.7   msaitoh 		ixgbe_get_device_caps(hw, &enforce_sfp);
   1734  1.7   msaitoh 		if (!(enforce_sfp & IXGBE_DEVICE_CAPS_ALLOW_ANY_SFP)) {
   1735  1.7   msaitoh 			/* Make sure we're a supported PHY type */
   1736  1.7   msaitoh 			if (hw->phy.type == ixgbe_phy_qsfp_intel) {
   1737  1.7   msaitoh 				status = IXGBE_SUCCESS;
   1738  1.7   msaitoh 			} else {
   1739  1.7   msaitoh 				if (hw->allow_unsupported_sfp == TRUE) {
   1740  1.7   msaitoh 					EWARN(hw, "WARNING: Intel (R) Network "
   1741  1.7   msaitoh 					      "Connections are quality tested "
   1742  1.7   msaitoh 					      "using Intel (R) Ethernet Optics."
   1743  1.7   msaitoh 					      " Using untested modules is not "
   1744  1.7   msaitoh 					      "supported and may cause unstable"
   1745  1.7   msaitoh 					      " operation or damage to the "
   1746  1.7   msaitoh 					      "module or the adapter. Intel "
   1747  1.7   msaitoh 					      "Corporation is not responsible "
   1748  1.7   msaitoh 					      "for any harm caused by using "
   1749  1.7   msaitoh 					      "untested modules.\n", status);
   1750  1.7   msaitoh 					status = IXGBE_SUCCESS;
   1751  1.7   msaitoh 				} else {
   1752  1.7   msaitoh 					DEBUGOUT("QSFP module not supported\n");
   1753  1.7   msaitoh 					hw->phy.type =
   1754  1.7   msaitoh 						ixgbe_phy_sfp_unsupported;
   1755  1.7   msaitoh 					status = IXGBE_ERR_SFP_NOT_SUPPORTED;
   1756  1.7   msaitoh 				}
   1757  1.7   msaitoh 			}
   1758  1.7   msaitoh 		} else {
   1759  1.7   msaitoh 			status = IXGBE_SUCCESS;
   1760  1.7   msaitoh 		}
   1761  1.7   msaitoh 	}
   1762  1.7   msaitoh 
   1763  1.7   msaitoh out:
   1764  1.7   msaitoh 	return status;
   1765  1.7   msaitoh 
   1766  1.7   msaitoh err_read_i2c_eeprom:
   1767  1.7   msaitoh 	hw->phy.sfp_type = ixgbe_sfp_type_not_present;
   1768  1.7   msaitoh 	hw->phy.id = 0;
   1769  1.7   msaitoh 	hw->phy.type = ixgbe_phy_unknown;
   1770  1.7   msaitoh 
   1771  1.7   msaitoh 	return IXGBE_ERR_SFP_NOT_PRESENT;
   1772  1.7   msaitoh }
   1773  1.3   msaitoh 
   1774  1.3   msaitoh 
   1775  1.1    dyoung /**
   1776  1.1    dyoung  *  ixgbe_get_sfp_init_sequence_offsets - Provides offset of PHY init sequence
   1777  1.1    dyoung  *  @hw: pointer to hardware structure
   1778  1.1    dyoung  *  @list_offset: offset to the SFP ID list
   1779  1.1    dyoung  *  @data_offset: offset to the SFP data block
   1780  1.1    dyoung  *
   1781  1.1    dyoung  *  Checks the MAC's EEPROM to see if it supports a given SFP+ module type, if
   1782  1.1    dyoung  *  so it returns the offsets to the phy init sequence block.
   1783  1.1    dyoung  **/
   1784  1.1    dyoung s32 ixgbe_get_sfp_init_sequence_offsets(struct ixgbe_hw *hw,
   1785  1.3   msaitoh 					u16 *list_offset,
   1786  1.3   msaitoh 					u16 *data_offset)
   1787  1.1    dyoung {
   1788  1.1    dyoung 	u16 sfp_id;
   1789  1.1    dyoung 	u16 sfp_type = hw->phy.sfp_type;
   1790  1.1    dyoung 
   1791  1.1    dyoung 	DEBUGFUNC("ixgbe_get_sfp_init_sequence_offsets");
   1792  1.1    dyoung 
   1793  1.1    dyoung 	if (hw->phy.sfp_type == ixgbe_sfp_type_unknown)
   1794  1.1    dyoung 		return IXGBE_ERR_SFP_NOT_SUPPORTED;
   1795  1.1    dyoung 
   1796  1.1    dyoung 	if (hw->phy.sfp_type == ixgbe_sfp_type_not_present)
   1797  1.1    dyoung 		return IXGBE_ERR_SFP_NOT_PRESENT;
   1798  1.1    dyoung 
   1799  1.1    dyoung 	if ((hw->device_id == IXGBE_DEV_ID_82598_SR_DUAL_PORT_EM) &&
   1800  1.1    dyoung 	    (hw->phy.sfp_type == ixgbe_sfp_type_da_cu))
   1801  1.1    dyoung 		return IXGBE_ERR_SFP_NOT_SUPPORTED;
   1802  1.1    dyoung 
   1803  1.1    dyoung 	/*
   1804  1.1    dyoung 	 * Limiting active cables and 1G Phys must be initialized as
   1805  1.1    dyoung 	 * SR modules
   1806  1.1    dyoung 	 */
   1807  1.1    dyoung 	if (sfp_type == ixgbe_sfp_type_da_act_lmt_core0 ||
   1808  1.4   msaitoh 	    sfp_type == ixgbe_sfp_type_1g_cu_core0 ||
   1809  1.4   msaitoh 	    sfp_type == ixgbe_sfp_type_1g_sx_core0)
   1810  1.1    dyoung 		sfp_type = ixgbe_sfp_type_srlr_core0;
   1811  1.1    dyoung 	else if (sfp_type == ixgbe_sfp_type_da_act_lmt_core1 ||
   1812  1.4   msaitoh 		 sfp_type == ixgbe_sfp_type_1g_cu_core1 ||
   1813  1.4   msaitoh 		 sfp_type == ixgbe_sfp_type_1g_sx_core1)
   1814  1.1    dyoung 		sfp_type = ixgbe_sfp_type_srlr_core1;
   1815  1.1    dyoung 
   1816  1.1    dyoung 	/* Read offset to PHY init contents */
   1817  1.6   msaitoh 	if (hw->eeprom.ops.read(hw, IXGBE_PHY_INIT_OFFSET_NL, list_offset)) {
   1818  1.6   msaitoh 		ERROR_REPORT2(IXGBE_ERROR_INVALID_STATE,
   1819  1.6   msaitoh 			      "eeprom read at offset %d failed",
   1820  1.6   msaitoh 			      IXGBE_PHY_INIT_OFFSET_NL);
   1821  1.6   msaitoh 		return IXGBE_ERR_SFP_NO_INIT_SEQ_PRESENT;
   1822  1.6   msaitoh 	}
   1823  1.1    dyoung 
   1824  1.1    dyoung 	if ((!*list_offset) || (*list_offset == 0xFFFF))
   1825  1.1    dyoung 		return IXGBE_ERR_SFP_NO_INIT_SEQ_PRESENT;
   1826  1.1    dyoung 
   1827  1.1    dyoung 	/* Shift offset to first ID word */
   1828  1.1    dyoung 	(*list_offset)++;
   1829  1.1    dyoung 
   1830  1.1    dyoung 	/*
   1831  1.1    dyoung 	 * Find the matching SFP ID in the EEPROM
   1832  1.1    dyoung 	 * and program the init sequence
   1833  1.1    dyoung 	 */
   1834  1.6   msaitoh 	if (hw->eeprom.ops.read(hw, *list_offset, &sfp_id))
   1835  1.6   msaitoh 		goto err_phy;
   1836  1.1    dyoung 
   1837  1.1    dyoung 	while (sfp_id != IXGBE_PHY_INIT_END_NL) {
   1838  1.1    dyoung 		if (sfp_id == sfp_type) {
   1839  1.1    dyoung 			(*list_offset)++;
   1840  1.6   msaitoh 			if (hw->eeprom.ops.read(hw, *list_offset, data_offset))
   1841  1.6   msaitoh 				goto err_phy;
   1842  1.1    dyoung 			if ((!*data_offset) || (*data_offset == 0xFFFF)) {
   1843  1.1    dyoung 				DEBUGOUT("SFP+ module not supported\n");
   1844  1.1    dyoung 				return IXGBE_ERR_SFP_NOT_SUPPORTED;
   1845  1.1    dyoung 			} else {
   1846  1.1    dyoung 				break;
   1847  1.1    dyoung 			}
   1848  1.1    dyoung 		} else {
   1849  1.1    dyoung 			(*list_offset) += 2;
   1850  1.1    dyoung 			if (hw->eeprom.ops.read(hw, *list_offset, &sfp_id))
   1851  1.6   msaitoh 				goto err_phy;
   1852  1.1    dyoung 		}
   1853  1.1    dyoung 	}
   1854  1.1    dyoung 
   1855  1.1    dyoung 	if (sfp_id == IXGBE_PHY_INIT_END_NL) {
   1856  1.1    dyoung 		DEBUGOUT("No matching SFP+ module found\n");
   1857  1.1    dyoung 		return IXGBE_ERR_SFP_NOT_SUPPORTED;
   1858  1.1    dyoung 	}
   1859  1.1    dyoung 
   1860  1.1    dyoung 	return IXGBE_SUCCESS;
   1861  1.6   msaitoh 
   1862  1.6   msaitoh err_phy:
   1863  1.6   msaitoh 	ERROR_REPORT2(IXGBE_ERROR_INVALID_STATE,
   1864  1.6   msaitoh 		      "eeprom read at offset %d failed", *list_offset);
   1865  1.6   msaitoh 	return IXGBE_ERR_PHY;
   1866  1.1    dyoung }
   1867  1.1    dyoung 
   1868  1.1    dyoung /**
   1869  1.1    dyoung  *  ixgbe_read_i2c_eeprom_generic - Reads 8 bit EEPROM word over I2C interface
   1870  1.1    dyoung  *  @hw: pointer to hardware structure
   1871  1.1    dyoung  *  @byte_offset: EEPROM byte offset to read
   1872  1.1    dyoung  *  @eeprom_data: value read
   1873  1.1    dyoung  *
   1874  1.1    dyoung  *  Performs byte read operation to SFP module's EEPROM over I2C interface.
   1875  1.1    dyoung  **/
   1876  1.1    dyoung s32 ixgbe_read_i2c_eeprom_generic(struct ixgbe_hw *hw, u8 byte_offset,
   1877  1.3   msaitoh 				  u8 *eeprom_data)
   1878  1.1    dyoung {
   1879  1.1    dyoung 	DEBUGFUNC("ixgbe_read_i2c_eeprom_generic");
   1880  1.1    dyoung 
   1881  1.1    dyoung 	return hw->phy.ops.read_i2c_byte(hw, byte_offset,
   1882  1.3   msaitoh 					 IXGBE_I2C_EEPROM_DEV_ADDR,
   1883  1.3   msaitoh 					 eeprom_data);
   1884  1.1    dyoung }
   1885  1.1    dyoung 
   1886  1.1    dyoung /**
   1887  1.5   msaitoh  *  ixgbe_read_i2c_sff8472_generic - Reads 8 bit word over I2C interface
   1888  1.5   msaitoh  *  @hw: pointer to hardware structure
   1889  1.5   msaitoh  *  @byte_offset: byte offset at address 0xA2
   1890  1.5   msaitoh  *  @eeprom_data: value read
   1891  1.5   msaitoh  *
   1892  1.5   msaitoh  *  Performs byte read operation to SFP module's SFF-8472 data over I2C
   1893  1.5   msaitoh  **/
   1894  1.5   msaitoh static s32 ixgbe_read_i2c_sff8472_generic(struct ixgbe_hw *hw, u8 byte_offset,
   1895  1.5   msaitoh 					  u8 *sff8472_data)
   1896  1.5   msaitoh {
   1897  1.5   msaitoh 	return hw->phy.ops.read_i2c_byte(hw, byte_offset,
   1898  1.5   msaitoh 					 IXGBE_I2C_EEPROM_DEV_ADDR2,
   1899  1.5   msaitoh 					 sff8472_data);
   1900  1.5   msaitoh }
   1901  1.5   msaitoh 
   1902  1.5   msaitoh /**
   1903  1.1    dyoung  *  ixgbe_write_i2c_eeprom_generic - Writes 8 bit EEPROM word over I2C interface
   1904  1.1    dyoung  *  @hw: pointer to hardware structure
   1905  1.1    dyoung  *  @byte_offset: EEPROM byte offset to write
   1906  1.1    dyoung  *  @eeprom_data: value to write
   1907  1.1    dyoung  *
   1908  1.1    dyoung  *  Performs byte write operation to SFP module's EEPROM over I2C interface.
   1909  1.1    dyoung  **/
   1910  1.1    dyoung s32 ixgbe_write_i2c_eeprom_generic(struct ixgbe_hw *hw, u8 byte_offset,
   1911  1.3   msaitoh 				   u8 eeprom_data)
   1912  1.1    dyoung {
   1913  1.1    dyoung 	DEBUGFUNC("ixgbe_write_i2c_eeprom_generic");
   1914  1.1    dyoung 
   1915  1.1    dyoung 	return hw->phy.ops.write_i2c_byte(hw, byte_offset,
   1916  1.3   msaitoh 					  IXGBE_I2C_EEPROM_DEV_ADDR,
   1917  1.3   msaitoh 					  eeprom_data);
   1918  1.1    dyoung }
   1919  1.1    dyoung 
   1920  1.1    dyoung /**
   1921  1.7   msaitoh  * ixgbe_is_sfp_probe - Returns TRUE if SFP is being detected
   1922  1.7   msaitoh  * @hw: pointer to hardware structure
   1923  1.7   msaitoh  * @offset: eeprom offset to be read
   1924  1.7   msaitoh  * @addr: I2C address to be read
   1925  1.7   msaitoh  */
   1926  1.7   msaitoh static bool ixgbe_is_sfp_probe(struct ixgbe_hw *hw, u8 offset, u8 addr)
   1927  1.7   msaitoh {
   1928  1.7   msaitoh 	if (addr == IXGBE_I2C_EEPROM_DEV_ADDR &&
   1929  1.7   msaitoh 	    offset == IXGBE_SFF_IDENTIFIER &&
   1930  1.7   msaitoh 	    hw->phy.sfp_type == ixgbe_sfp_type_not_present)
   1931  1.7   msaitoh 		return TRUE;
   1932  1.7   msaitoh 	return FALSE;
   1933  1.7   msaitoh }
   1934  1.7   msaitoh 
   1935  1.7   msaitoh /**
   1936  1.1    dyoung  *  ixgbe_read_i2c_byte_generic - Reads 8 bit word over I2C
   1937  1.1    dyoung  *  @hw: pointer to hardware structure
   1938  1.1    dyoung  *  @byte_offset: byte offset to read
   1939  1.1    dyoung  *  @data: value read
   1940  1.1    dyoung  *
   1941  1.1    dyoung  *  Performs byte read operation to SFP module's EEPROM over I2C interface at
   1942  1.3   msaitoh  *  a specified device address.
   1943  1.1    dyoung  **/
   1944  1.1    dyoung s32 ixgbe_read_i2c_byte_generic(struct ixgbe_hw *hw, u8 byte_offset,
   1945  1.3   msaitoh 				u8 dev_addr, u8 *data)
   1946  1.1    dyoung {
   1947  1.7   msaitoh 	s32 status;
   1948  1.1    dyoung 	u32 max_retry = 10;
   1949  1.1    dyoung 	u32 retry = 0;
   1950  1.7   msaitoh 	u32 swfw_mask = hw->phy.phy_semaphore_mask;
   1951  1.1    dyoung 	bool nack = 1;
   1952  1.3   msaitoh 	*data = 0;
   1953  1.1    dyoung 
   1954  1.1    dyoung 	DEBUGFUNC("ixgbe_read_i2c_byte_generic");
   1955  1.1    dyoung 
   1956  1.7   msaitoh 	if (ixgbe_is_sfp_probe(hw, byte_offset, dev_addr))
   1957  1.7   msaitoh 		max_retry = IXGBE_SFP_DETECT_RETRIES;
   1958  1.1    dyoung 
   1959  1.1    dyoung 	do {
   1960  1.7   msaitoh 		if (hw->mac.ops.acquire_swfw_sync(hw, swfw_mask))
   1961  1.7   msaitoh 			return IXGBE_ERR_SWFW_SYNC;
   1962  1.1    dyoung 
   1963  1.1    dyoung 		ixgbe_i2c_start(hw);
   1964  1.1    dyoung 
   1965  1.1    dyoung 		/* Device Address and write indication */
   1966  1.1    dyoung 		status = ixgbe_clock_out_i2c_byte(hw, dev_addr);
   1967  1.1    dyoung 		if (status != IXGBE_SUCCESS)
   1968  1.1    dyoung 			goto fail;
   1969  1.1    dyoung 
   1970  1.1    dyoung 		status = ixgbe_get_i2c_ack(hw);
   1971  1.1    dyoung 		if (status != IXGBE_SUCCESS)
   1972  1.1    dyoung 			goto fail;
   1973  1.1    dyoung 
   1974  1.1    dyoung 		status = ixgbe_clock_out_i2c_byte(hw, byte_offset);
   1975  1.1    dyoung 		if (status != IXGBE_SUCCESS)
   1976  1.1    dyoung 			goto fail;
   1977  1.1    dyoung 
   1978  1.1    dyoung 		status = ixgbe_get_i2c_ack(hw);
   1979  1.1    dyoung 		if (status != IXGBE_SUCCESS)
   1980  1.1    dyoung 			goto fail;
   1981  1.1    dyoung 
   1982  1.1    dyoung 		ixgbe_i2c_start(hw);
   1983  1.1    dyoung 
   1984  1.1    dyoung 		/* Device Address and read indication */
   1985  1.1    dyoung 		status = ixgbe_clock_out_i2c_byte(hw, (dev_addr | 0x1));
   1986  1.1    dyoung 		if (status != IXGBE_SUCCESS)
   1987  1.1    dyoung 			goto fail;
   1988  1.1    dyoung 
   1989  1.1    dyoung 		status = ixgbe_get_i2c_ack(hw);
   1990  1.1    dyoung 		if (status != IXGBE_SUCCESS)
   1991  1.1    dyoung 			goto fail;
   1992  1.1    dyoung 
   1993  1.1    dyoung 		status = ixgbe_clock_in_i2c_byte(hw, data);
   1994  1.1    dyoung 		if (status != IXGBE_SUCCESS)
   1995  1.1    dyoung 			goto fail;
   1996  1.1    dyoung 
   1997  1.1    dyoung 		status = ixgbe_clock_out_i2c_bit(hw, nack);
   1998  1.1    dyoung 		if (status != IXGBE_SUCCESS)
   1999  1.1    dyoung 			goto fail;
   2000  1.1    dyoung 
   2001  1.1    dyoung 		ixgbe_i2c_stop(hw);
   2002  1.7   msaitoh 		hw->mac.ops.release_swfw_sync(hw, swfw_mask);
   2003  1.7   msaitoh 		return IXGBE_SUCCESS;
   2004  1.1    dyoung 
   2005  1.1    dyoung fail:
   2006  1.5   msaitoh 		ixgbe_i2c_bus_clear(hw);
   2007  1.3   msaitoh 		hw->mac.ops.release_swfw_sync(hw, swfw_mask);
   2008  1.1    dyoung 		msec_delay(100);
   2009  1.1    dyoung 		retry++;
   2010  1.1    dyoung 		if (retry < max_retry)
   2011  1.1    dyoung 			DEBUGOUT("I2C byte read error - Retrying.\n");
   2012  1.1    dyoung 		else
   2013  1.1    dyoung 			DEBUGOUT("I2C byte read error.\n");
   2014  1.1    dyoung 
   2015  1.1    dyoung 	} while (retry < max_retry);
   2016  1.1    dyoung 
   2017  1.1    dyoung 	return status;
   2018  1.1    dyoung }
   2019  1.1    dyoung 
   2020  1.1    dyoung /**
   2021  1.1    dyoung  *  ixgbe_write_i2c_byte_generic - Writes 8 bit word over I2C
   2022  1.1    dyoung  *  @hw: pointer to hardware structure
   2023  1.1    dyoung  *  @byte_offset: byte offset to write
   2024  1.1    dyoung  *  @data: value to write
   2025  1.1    dyoung  *
   2026  1.1    dyoung  *  Performs byte write operation to SFP module's EEPROM over I2C interface at
   2027  1.1    dyoung  *  a specified device address.
   2028  1.1    dyoung  **/
   2029  1.1    dyoung s32 ixgbe_write_i2c_byte_generic(struct ixgbe_hw *hw, u8 byte_offset,
   2030  1.3   msaitoh 				 u8 dev_addr, u8 data)
   2031  1.1    dyoung {
   2032  1.1    dyoung 	s32 status = IXGBE_SUCCESS;
   2033  1.2  christos 	u32 max_retry = 2;
   2034  1.1    dyoung 	u32 retry = 0;
   2035  1.7   msaitoh 	u32 swfw_mask = hw->phy.phy_semaphore_mask;
   2036  1.1    dyoung 
   2037  1.1    dyoung 	DEBUGFUNC("ixgbe_write_i2c_byte_generic");
   2038  1.1    dyoung 
   2039  1.3   msaitoh 	if (hw->mac.ops.acquire_swfw_sync(hw, swfw_mask) != IXGBE_SUCCESS) {
   2040  1.1    dyoung 		status = IXGBE_ERR_SWFW_SYNC;
   2041  1.1    dyoung 		goto write_byte_out;
   2042  1.1    dyoung 	}
   2043  1.1    dyoung 
   2044  1.1    dyoung 	do {
   2045  1.1    dyoung 		ixgbe_i2c_start(hw);
   2046  1.1    dyoung 
   2047  1.1    dyoung 		status = ixgbe_clock_out_i2c_byte(hw, dev_addr);
   2048  1.1    dyoung 		if (status != IXGBE_SUCCESS)
   2049  1.1    dyoung 			goto fail;
   2050  1.1    dyoung 
   2051  1.1    dyoung 		status = ixgbe_get_i2c_ack(hw);
   2052  1.1    dyoung 		if (status != IXGBE_SUCCESS)
   2053  1.1    dyoung 			goto fail;
   2054  1.1    dyoung 
   2055  1.1    dyoung 		status = ixgbe_clock_out_i2c_byte(hw, byte_offset);
   2056  1.1    dyoung 		if (status != IXGBE_SUCCESS)
   2057  1.1    dyoung 			goto fail;
   2058  1.1    dyoung 
   2059  1.1    dyoung 		status = ixgbe_get_i2c_ack(hw);
   2060  1.1    dyoung 		if (status != IXGBE_SUCCESS)
   2061  1.1    dyoung 			goto fail;
   2062  1.1    dyoung 
   2063  1.1    dyoung 		status = ixgbe_clock_out_i2c_byte(hw, data);
   2064  1.1    dyoung 		if (status != IXGBE_SUCCESS)
   2065  1.1    dyoung 			goto fail;
   2066  1.1    dyoung 
   2067  1.1    dyoung 		status = ixgbe_get_i2c_ack(hw);
   2068  1.1    dyoung 		if (status != IXGBE_SUCCESS)
   2069  1.1    dyoung 			goto fail;
   2070  1.1    dyoung 
   2071  1.1    dyoung 		ixgbe_i2c_stop(hw);
   2072  1.7   msaitoh 		hw->mac.ops.release_swfw_sync(hw, swfw_mask);
   2073  1.7   msaitoh 		return IXGBE_SUCCESS;
   2074  1.1    dyoung 
   2075  1.1    dyoung fail:
   2076  1.1    dyoung 		ixgbe_i2c_bus_clear(hw);
   2077  1.1    dyoung 		retry++;
   2078  1.1    dyoung 		if (retry < max_retry)
   2079  1.1    dyoung 			DEBUGOUT("I2C byte write error - Retrying.\n");
   2080  1.1    dyoung 		else
   2081  1.1    dyoung 			DEBUGOUT("I2C byte write error.\n");
   2082  1.1    dyoung 	} while (retry < max_retry);
   2083  1.1    dyoung 
   2084  1.3   msaitoh 	hw->mac.ops.release_swfw_sync(hw, swfw_mask);
   2085  1.1    dyoung 
   2086  1.1    dyoung write_byte_out:
   2087  1.1    dyoung 	return status;
   2088  1.1    dyoung }
   2089  1.1    dyoung 
   2090  1.1    dyoung /**
   2091  1.1    dyoung  *  ixgbe_i2c_start - Sets I2C start condition
   2092  1.1    dyoung  *  @hw: pointer to hardware structure
   2093  1.1    dyoung  *
   2094  1.1    dyoung  *  Sets I2C start condition (High -> Low on SDA while SCL is High)
   2095  1.7   msaitoh  *  Set bit-bang mode on X550 hardware.
   2096  1.1    dyoung  **/
   2097  1.1    dyoung static void ixgbe_i2c_start(struct ixgbe_hw *hw)
   2098  1.1    dyoung {
   2099  1.7   msaitoh 	u32 i2cctl = IXGBE_READ_REG(hw, IXGBE_I2CCTL_BY_MAC(hw));
   2100  1.1    dyoung 
   2101  1.1    dyoung 	DEBUGFUNC("ixgbe_i2c_start");
   2102  1.1    dyoung 
   2103  1.7   msaitoh 	i2cctl |= IXGBE_I2C_BB_EN_BY_MAC(hw);
   2104  1.7   msaitoh 
   2105  1.1    dyoung 	/* Start condition must begin with data and clock high */
   2106  1.1    dyoung 	ixgbe_set_i2c_data(hw, &i2cctl, 1);
   2107  1.1    dyoung 	ixgbe_raise_i2c_clk(hw, &i2cctl);
   2108  1.1    dyoung 
   2109  1.1    dyoung 	/* Setup time for start condition (4.7us) */
   2110  1.1    dyoung 	usec_delay(IXGBE_I2C_T_SU_STA);
   2111  1.1    dyoung 
   2112  1.1    dyoung 	ixgbe_set_i2c_data(hw, &i2cctl, 0);
   2113  1.1    dyoung 
   2114  1.1    dyoung 	/* Hold time for start condition (4us) */
   2115  1.1    dyoung 	usec_delay(IXGBE_I2C_T_HD_STA);
   2116  1.1    dyoung 
   2117  1.1    dyoung 	ixgbe_lower_i2c_clk(hw, &i2cctl);
   2118  1.1    dyoung 
   2119  1.1    dyoung 	/* Minimum low period of clock is 4.7 us */
   2120  1.1    dyoung 	usec_delay(IXGBE_I2C_T_LOW);
   2121  1.1    dyoung 
   2122  1.1    dyoung }
   2123  1.1    dyoung 
   2124  1.1    dyoung /**
   2125  1.1    dyoung  *  ixgbe_i2c_stop - Sets I2C stop condition
   2126  1.1    dyoung  *  @hw: pointer to hardware structure
   2127  1.1    dyoung  *
   2128  1.1    dyoung  *  Sets I2C stop condition (Low -> High on SDA while SCL is High)
   2129  1.7   msaitoh  *  Disables bit-bang mode and negates data output enable on X550
   2130  1.7   msaitoh  *  hardware.
   2131  1.1    dyoung  **/
   2132  1.1    dyoung static void ixgbe_i2c_stop(struct ixgbe_hw *hw)
   2133  1.1    dyoung {
   2134  1.7   msaitoh 	u32 i2cctl = IXGBE_READ_REG(hw, IXGBE_I2CCTL_BY_MAC(hw));
   2135  1.7   msaitoh 	u32 data_oe_bit = IXGBE_I2C_DATA_OE_N_EN_BY_MAC(hw);
   2136  1.7   msaitoh 	u32 clk_oe_bit = IXGBE_I2C_CLK_OE_N_EN_BY_MAC(hw);
   2137  1.7   msaitoh 	u32 bb_en_bit = IXGBE_I2C_BB_EN_BY_MAC(hw);
   2138  1.1    dyoung 
   2139  1.1    dyoung 	DEBUGFUNC("ixgbe_i2c_stop");
   2140  1.1    dyoung 
   2141  1.1    dyoung 	/* Stop condition must begin with data low and clock high */
   2142  1.1    dyoung 	ixgbe_set_i2c_data(hw, &i2cctl, 0);
   2143  1.1    dyoung 	ixgbe_raise_i2c_clk(hw, &i2cctl);
   2144  1.1    dyoung 
   2145  1.1    dyoung 	/* Setup time for stop condition (4us) */
   2146  1.1    dyoung 	usec_delay(IXGBE_I2C_T_SU_STO);
   2147  1.1    dyoung 
   2148  1.1    dyoung 	ixgbe_set_i2c_data(hw, &i2cctl, 1);
   2149  1.1    dyoung 
   2150  1.1    dyoung 	/* bus free time between stop and start (4.7us)*/
   2151  1.1    dyoung 	usec_delay(IXGBE_I2C_T_BUF);
   2152  1.7   msaitoh 
   2153  1.7   msaitoh 	if (bb_en_bit || data_oe_bit || clk_oe_bit) {
   2154  1.7   msaitoh 		i2cctl &= ~bb_en_bit;
   2155  1.7   msaitoh 		i2cctl |= data_oe_bit | clk_oe_bit;
   2156  1.7   msaitoh 		IXGBE_WRITE_REG(hw, IXGBE_I2CCTL_BY_MAC(hw), i2cctl);
   2157  1.7   msaitoh 		IXGBE_WRITE_FLUSH(hw);
   2158  1.7   msaitoh 	}
   2159  1.1    dyoung }
   2160  1.1    dyoung 
   2161  1.1    dyoung /**
   2162  1.1    dyoung  *  ixgbe_clock_in_i2c_byte - Clocks in one byte via I2C
   2163  1.1    dyoung  *  @hw: pointer to hardware structure
   2164  1.1    dyoung  *  @data: data byte to clock in
   2165  1.1    dyoung  *
   2166  1.1    dyoung  *  Clocks in one byte data via I2C data/clock
   2167  1.1    dyoung  **/
   2168  1.1    dyoung static s32 ixgbe_clock_in_i2c_byte(struct ixgbe_hw *hw, u8 *data)
   2169  1.1    dyoung {
   2170  1.1    dyoung 	s32 i;
   2171  1.1    dyoung 	bool bit = 0;
   2172  1.1    dyoung 
   2173  1.1    dyoung 	DEBUGFUNC("ixgbe_clock_in_i2c_byte");
   2174  1.1    dyoung 
   2175  1.7   msaitoh 	*data = 0;
   2176  1.1    dyoung 	for (i = 7; i >= 0; i--) {
   2177  1.3   msaitoh 		ixgbe_clock_in_i2c_bit(hw, &bit);
   2178  1.1    dyoung 		*data |= bit << i;
   2179  1.1    dyoung 	}
   2180  1.1    dyoung 
   2181  1.3   msaitoh 	return IXGBE_SUCCESS;
   2182  1.1    dyoung }
   2183  1.1    dyoung 
   2184  1.1    dyoung /**
   2185  1.1    dyoung  *  ixgbe_clock_out_i2c_byte - Clocks out one byte via I2C
   2186  1.1    dyoung  *  @hw: pointer to hardware structure
   2187  1.1    dyoung  *  @data: data byte clocked out
   2188  1.1    dyoung  *
   2189  1.1    dyoung  *  Clocks out one byte data via I2C data/clock
   2190  1.1    dyoung  **/
   2191  1.1    dyoung static s32 ixgbe_clock_out_i2c_byte(struct ixgbe_hw *hw, u8 data)
   2192  1.1    dyoung {
   2193  1.1    dyoung 	s32 status = IXGBE_SUCCESS;
   2194  1.1    dyoung 	s32 i;
   2195  1.1    dyoung 	u32 i2cctl;
   2196  1.7   msaitoh 	bool bit;
   2197  1.1    dyoung 
   2198  1.1    dyoung 	DEBUGFUNC("ixgbe_clock_out_i2c_byte");
   2199  1.1    dyoung 
   2200  1.1    dyoung 	for (i = 7; i >= 0; i--) {
   2201  1.1    dyoung 		bit = (data >> i) & 0x1;
   2202  1.1    dyoung 		status = ixgbe_clock_out_i2c_bit(hw, bit);
   2203  1.1    dyoung 
   2204  1.1    dyoung 		if (status != IXGBE_SUCCESS)
   2205  1.1    dyoung 			break;
   2206  1.1    dyoung 	}
   2207  1.1    dyoung 
   2208  1.1    dyoung 	/* Release SDA line (set high) */
   2209  1.7   msaitoh 	i2cctl = IXGBE_READ_REG(hw, IXGBE_I2CCTL_BY_MAC(hw));
   2210  1.7   msaitoh 	i2cctl |= IXGBE_I2C_DATA_OUT_BY_MAC(hw);
   2211  1.7   msaitoh 	i2cctl |= IXGBE_I2C_DATA_OE_N_EN_BY_MAC(hw);
   2212  1.7   msaitoh 	IXGBE_WRITE_REG(hw, IXGBE_I2CCTL_BY_MAC(hw), i2cctl);
   2213  1.3   msaitoh 	IXGBE_WRITE_FLUSH(hw);
   2214  1.1    dyoung 
   2215  1.1    dyoung 	return status;
   2216  1.1    dyoung }
   2217  1.1    dyoung 
   2218  1.1    dyoung /**
   2219  1.1    dyoung  *  ixgbe_get_i2c_ack - Polls for I2C ACK
   2220  1.1    dyoung  *  @hw: pointer to hardware structure
   2221  1.1    dyoung  *
   2222  1.1    dyoung  *  Clocks in/out one bit via I2C data/clock
   2223  1.1    dyoung  **/
   2224  1.1    dyoung static s32 ixgbe_get_i2c_ack(struct ixgbe_hw *hw)
   2225  1.1    dyoung {
   2226  1.7   msaitoh 	u32 data_oe_bit = IXGBE_I2C_DATA_OE_N_EN_BY_MAC(hw);
   2227  1.3   msaitoh 	s32 status = IXGBE_SUCCESS;
   2228  1.1    dyoung 	u32 i = 0;
   2229  1.7   msaitoh 	u32 i2cctl = IXGBE_READ_REG(hw, IXGBE_I2CCTL_BY_MAC(hw));
   2230  1.1    dyoung 	u32 timeout = 10;
   2231  1.1    dyoung 	bool ack = 1;
   2232  1.1    dyoung 
   2233  1.1    dyoung 	DEBUGFUNC("ixgbe_get_i2c_ack");
   2234  1.1    dyoung 
   2235  1.7   msaitoh 	if (data_oe_bit) {
   2236  1.7   msaitoh 		i2cctl |= IXGBE_I2C_DATA_OUT_BY_MAC(hw);
   2237  1.7   msaitoh 		i2cctl |= data_oe_bit;
   2238  1.7   msaitoh 		IXGBE_WRITE_REG(hw, IXGBE_I2CCTL_BY_MAC(hw), i2cctl);
   2239  1.7   msaitoh 		IXGBE_WRITE_FLUSH(hw);
   2240  1.7   msaitoh 	}
   2241  1.3   msaitoh 	ixgbe_raise_i2c_clk(hw, &i2cctl);
   2242  1.1    dyoung 
   2243  1.1    dyoung 	/* Minimum high period of clock is 4us */
   2244  1.1    dyoung 	usec_delay(IXGBE_I2C_T_HIGH);
   2245  1.1    dyoung 
   2246  1.1    dyoung 	/* Poll for ACK.  Note that ACK in I2C spec is
   2247  1.1    dyoung 	 * transition from 1 to 0 */
   2248  1.1    dyoung 	for (i = 0; i < timeout; i++) {
   2249  1.7   msaitoh 		i2cctl = IXGBE_READ_REG(hw, IXGBE_I2CCTL_BY_MAC(hw));
   2250  1.7   msaitoh 		ack = ixgbe_get_i2c_data(hw, &i2cctl);
   2251  1.1    dyoung 
   2252  1.1    dyoung 		usec_delay(1);
   2253  1.7   msaitoh 		if (!ack)
   2254  1.1    dyoung 			break;
   2255  1.1    dyoung 	}
   2256  1.1    dyoung 
   2257  1.7   msaitoh 	if (ack) {
   2258  1.7   msaitoh 		DEBUGOUT("I2C ack was not received.\n");
   2259  1.1    dyoung 		status = IXGBE_ERR_I2C;
   2260  1.1    dyoung 	}
   2261  1.1    dyoung 
   2262  1.1    dyoung 	ixgbe_lower_i2c_clk(hw, &i2cctl);
   2263  1.1    dyoung 
   2264  1.1    dyoung 	/* Minimum low period of clock is 4.7 us */
   2265  1.1    dyoung 	usec_delay(IXGBE_I2C_T_LOW);
   2266  1.1    dyoung 
   2267  1.1    dyoung 	return status;
   2268  1.1    dyoung }
   2269  1.1    dyoung 
   2270  1.1    dyoung /**
   2271  1.1    dyoung  *  ixgbe_clock_in_i2c_bit - Clocks in one bit via I2C data/clock
   2272  1.1    dyoung  *  @hw: pointer to hardware structure
   2273  1.1    dyoung  *  @data: read data value
   2274  1.1    dyoung  *
   2275  1.1    dyoung  *  Clocks in one bit via I2C data/clock
   2276  1.1    dyoung  **/
   2277  1.1    dyoung static s32 ixgbe_clock_in_i2c_bit(struct ixgbe_hw *hw, bool *data)
   2278  1.1    dyoung {
   2279  1.7   msaitoh 	u32 i2cctl = IXGBE_READ_REG(hw, IXGBE_I2CCTL_BY_MAC(hw));
   2280  1.7   msaitoh 	u32 data_oe_bit = IXGBE_I2C_DATA_OE_N_EN_BY_MAC(hw);
   2281  1.1    dyoung 
   2282  1.1    dyoung 	DEBUGFUNC("ixgbe_clock_in_i2c_bit");
   2283  1.1    dyoung 
   2284  1.7   msaitoh 	if (data_oe_bit) {
   2285  1.7   msaitoh 		i2cctl |= IXGBE_I2C_DATA_OUT_BY_MAC(hw);
   2286  1.7   msaitoh 		i2cctl |= data_oe_bit;
   2287  1.7   msaitoh 		IXGBE_WRITE_REG(hw, IXGBE_I2CCTL_BY_MAC(hw), i2cctl);
   2288  1.7   msaitoh 		IXGBE_WRITE_FLUSH(hw);
   2289  1.7   msaitoh 	}
   2290  1.3   msaitoh 	ixgbe_raise_i2c_clk(hw, &i2cctl);
   2291  1.1    dyoung 
   2292  1.1    dyoung 	/* Minimum high period of clock is 4us */
   2293  1.1    dyoung 	usec_delay(IXGBE_I2C_T_HIGH);
   2294  1.1    dyoung 
   2295  1.7   msaitoh 	i2cctl = IXGBE_READ_REG(hw, IXGBE_I2CCTL_BY_MAC(hw));
   2296  1.7   msaitoh 	*data = ixgbe_get_i2c_data(hw, &i2cctl);
   2297  1.1    dyoung 
   2298  1.1    dyoung 	ixgbe_lower_i2c_clk(hw, &i2cctl);
   2299  1.1    dyoung 
   2300  1.1    dyoung 	/* Minimum low period of clock is 4.7 us */
   2301  1.1    dyoung 	usec_delay(IXGBE_I2C_T_LOW);
   2302  1.1    dyoung 
   2303  1.3   msaitoh 	return IXGBE_SUCCESS;
   2304  1.1    dyoung }
   2305  1.1    dyoung 
   2306  1.1    dyoung /**
   2307  1.1    dyoung  *  ixgbe_clock_out_i2c_bit - Clocks in/out one bit via I2C data/clock
   2308  1.1    dyoung  *  @hw: pointer to hardware structure
   2309  1.1    dyoung  *  @data: data value to write
   2310  1.1    dyoung  *
   2311  1.1    dyoung  *  Clocks out one bit via I2C data/clock
   2312  1.1    dyoung  **/
   2313  1.1    dyoung static s32 ixgbe_clock_out_i2c_bit(struct ixgbe_hw *hw, bool data)
   2314  1.1    dyoung {
   2315  1.1    dyoung 	s32 status;
   2316  1.7   msaitoh 	u32 i2cctl = IXGBE_READ_REG(hw, IXGBE_I2CCTL_BY_MAC(hw));
   2317  1.1    dyoung 
   2318  1.1    dyoung 	DEBUGFUNC("ixgbe_clock_out_i2c_bit");
   2319  1.1    dyoung 
   2320  1.1    dyoung 	status = ixgbe_set_i2c_data(hw, &i2cctl, data);
   2321  1.1    dyoung 	if (status == IXGBE_SUCCESS) {
   2322  1.3   msaitoh 		ixgbe_raise_i2c_clk(hw, &i2cctl);
   2323  1.1    dyoung 
   2324  1.1    dyoung 		/* Minimum high period of clock is 4us */
   2325  1.1    dyoung 		usec_delay(IXGBE_I2C_T_HIGH);
   2326  1.1    dyoung 
   2327  1.1    dyoung 		ixgbe_lower_i2c_clk(hw, &i2cctl);
   2328  1.1    dyoung 
   2329  1.1    dyoung 		/* Minimum low period of clock is 4.7 us.
   2330  1.1    dyoung 		 * This also takes care of the data hold time.
   2331  1.1    dyoung 		 */
   2332  1.1    dyoung 		usec_delay(IXGBE_I2C_T_LOW);
   2333  1.1    dyoung 	} else {
   2334  1.1    dyoung 		status = IXGBE_ERR_I2C;
   2335  1.6   msaitoh 		ERROR_REPORT2(IXGBE_ERROR_INVALID_STATE,
   2336  1.6   msaitoh 			     "I2C data was not set to %X\n", data);
   2337  1.1    dyoung 	}
   2338  1.1    dyoung 
   2339  1.1    dyoung 	return status;
   2340  1.1    dyoung }
   2341  1.7   msaitoh 
   2342  1.1    dyoung /**
   2343  1.1    dyoung  *  ixgbe_raise_i2c_clk - Raises the I2C SCL clock
   2344  1.1    dyoung  *  @hw: pointer to hardware structure
   2345  1.1    dyoung  *  @i2cctl: Current value of I2CCTL register
   2346  1.1    dyoung  *
   2347  1.1    dyoung  *  Raises the I2C clock line '0'->'1'
   2348  1.7   msaitoh  *  Negates the I2C clock output enable on X550 hardware.
   2349  1.1    dyoung  **/
   2350  1.3   msaitoh static void ixgbe_raise_i2c_clk(struct ixgbe_hw *hw, u32 *i2cctl)
   2351  1.1    dyoung {
   2352  1.7   msaitoh 	u32 clk_oe_bit = IXGBE_I2C_CLK_OE_N_EN_BY_MAC(hw);
   2353  1.4   msaitoh 	u32 i = 0;
   2354  1.4   msaitoh 	u32 timeout = IXGBE_I2C_CLOCK_STRETCHING_TIMEOUT;
   2355  1.4   msaitoh 	u32 i2cctl_r = 0;
   2356  1.4   msaitoh 
   2357  1.1    dyoung 	DEBUGFUNC("ixgbe_raise_i2c_clk");
   2358  1.1    dyoung 
   2359  1.7   msaitoh 	if (clk_oe_bit) {
   2360  1.7   msaitoh 		*i2cctl |= clk_oe_bit;
   2361  1.7   msaitoh 		IXGBE_WRITE_REG(hw, IXGBE_I2CCTL_BY_MAC(hw), *i2cctl);
   2362  1.7   msaitoh 	}
   2363  1.7   msaitoh 
   2364  1.4   msaitoh 	for (i = 0; i < timeout; i++) {
   2365  1.7   msaitoh 		*i2cctl |= IXGBE_I2C_CLK_OUT_BY_MAC(hw);
   2366  1.1    dyoung 
   2367  1.7   msaitoh 		IXGBE_WRITE_REG(hw, IXGBE_I2CCTL_BY_MAC(hw), *i2cctl);
   2368  1.4   msaitoh 		IXGBE_WRITE_FLUSH(hw);
   2369  1.4   msaitoh 		/* SCL rise time (1000ns) */
   2370  1.4   msaitoh 		usec_delay(IXGBE_I2C_T_RISE);
   2371  1.1    dyoung 
   2372  1.7   msaitoh 		i2cctl_r = IXGBE_READ_REG(hw, IXGBE_I2CCTL_BY_MAC(hw));
   2373  1.7   msaitoh 		if (i2cctl_r & IXGBE_I2C_CLK_IN_BY_MAC(hw))
   2374  1.4   msaitoh 			break;
   2375  1.4   msaitoh 	}
   2376  1.1    dyoung }
   2377  1.1    dyoung 
   2378  1.1    dyoung /**
   2379  1.1    dyoung  *  ixgbe_lower_i2c_clk - Lowers the I2C SCL clock
   2380  1.1    dyoung  *  @hw: pointer to hardware structure
   2381  1.1    dyoung  *  @i2cctl: Current value of I2CCTL register
   2382  1.1    dyoung  *
   2383  1.1    dyoung  *  Lowers the I2C clock line '1'->'0'
   2384  1.7   msaitoh  *  Asserts the I2C clock output enable on X550 hardware.
   2385  1.1    dyoung  **/
   2386  1.1    dyoung static void ixgbe_lower_i2c_clk(struct ixgbe_hw *hw, u32 *i2cctl)
   2387  1.1    dyoung {
   2388  1.1    dyoung 	DEBUGFUNC("ixgbe_lower_i2c_clk");
   2389  1.1    dyoung 
   2390  1.7   msaitoh 	*i2cctl &= ~(IXGBE_I2C_CLK_OUT_BY_MAC(hw));
   2391  1.7   msaitoh 	*i2cctl &= ~IXGBE_I2C_CLK_OE_N_EN_BY_MAC(hw);
   2392  1.1    dyoung 
   2393  1.7   msaitoh 	IXGBE_WRITE_REG(hw, IXGBE_I2CCTL_BY_MAC(hw), *i2cctl);
   2394  1.3   msaitoh 	IXGBE_WRITE_FLUSH(hw);
   2395  1.1    dyoung 
   2396  1.1    dyoung 	/* SCL fall time (300ns) */
   2397  1.1    dyoung 	usec_delay(IXGBE_I2C_T_FALL);
   2398  1.1    dyoung }
   2399  1.1    dyoung 
   2400  1.1    dyoung /**
   2401  1.1    dyoung  *  ixgbe_set_i2c_data - Sets the I2C data bit
   2402  1.1    dyoung  *  @hw: pointer to hardware structure
   2403  1.1    dyoung  *  @i2cctl: Current value of I2CCTL register
   2404  1.1    dyoung  *  @data: I2C data value (0 or 1) to set
   2405  1.1    dyoung  *
   2406  1.1    dyoung  *  Sets the I2C data bit
   2407  1.7   msaitoh  *  Asserts the I2C data output enable on X550 hardware.
   2408  1.1    dyoung  **/
   2409  1.1    dyoung static s32 ixgbe_set_i2c_data(struct ixgbe_hw *hw, u32 *i2cctl, bool data)
   2410  1.1    dyoung {
   2411  1.7   msaitoh 	u32 data_oe_bit = IXGBE_I2C_DATA_OE_N_EN_BY_MAC(hw);
   2412  1.1    dyoung 	s32 status = IXGBE_SUCCESS;
   2413  1.1    dyoung 
   2414  1.1    dyoung 	DEBUGFUNC("ixgbe_set_i2c_data");
   2415  1.1    dyoung 
   2416  1.1    dyoung 	if (data)
   2417  1.7   msaitoh 		*i2cctl |= IXGBE_I2C_DATA_OUT_BY_MAC(hw);
   2418  1.1    dyoung 	else
   2419  1.7   msaitoh 		*i2cctl &= ~(IXGBE_I2C_DATA_OUT_BY_MAC(hw));
   2420  1.7   msaitoh 	*i2cctl &= ~data_oe_bit;
   2421  1.1    dyoung 
   2422  1.7   msaitoh 	IXGBE_WRITE_REG(hw, IXGBE_I2CCTL_BY_MAC(hw), *i2cctl);
   2423  1.3   msaitoh 	IXGBE_WRITE_FLUSH(hw);
   2424  1.1    dyoung 
   2425  1.1    dyoung 	/* Data rise/fall (1000ns/300ns) and set-up time (250ns) */
   2426  1.1    dyoung 	usec_delay(IXGBE_I2C_T_RISE + IXGBE_I2C_T_FALL + IXGBE_I2C_T_SU_DATA);
   2427  1.1    dyoung 
   2428  1.7   msaitoh 	if (!data)	/* Can't verify data in this case */
   2429  1.7   msaitoh 		return IXGBE_SUCCESS;
   2430  1.7   msaitoh 	if (data_oe_bit) {
   2431  1.7   msaitoh 		*i2cctl |= data_oe_bit;
   2432  1.7   msaitoh 		IXGBE_WRITE_REG(hw, IXGBE_I2CCTL_BY_MAC(hw), *i2cctl);
   2433  1.7   msaitoh 		IXGBE_WRITE_FLUSH(hw);
   2434  1.7   msaitoh 	}
   2435  1.7   msaitoh 
   2436  1.1    dyoung 	/* Verify data was set correctly */
   2437  1.7   msaitoh 	*i2cctl = IXGBE_READ_REG(hw, IXGBE_I2CCTL_BY_MAC(hw));
   2438  1.7   msaitoh 	if (data != ixgbe_get_i2c_data(hw, i2cctl)) {
   2439  1.1    dyoung 		status = IXGBE_ERR_I2C;
   2440  1.6   msaitoh 		ERROR_REPORT2(IXGBE_ERROR_INVALID_STATE,
   2441  1.6   msaitoh 			     "Error - I2C data was not set to %X.\n",
   2442  1.6   msaitoh 			     data);
   2443  1.1    dyoung 	}
   2444  1.1    dyoung 
   2445  1.1    dyoung 	return status;
   2446  1.1    dyoung }
   2447  1.1    dyoung 
   2448  1.1    dyoung /**
   2449  1.1    dyoung  *  ixgbe_get_i2c_data - Reads the I2C SDA data bit
   2450  1.1    dyoung  *  @hw: pointer to hardware structure
   2451  1.1    dyoung  *  @i2cctl: Current value of I2CCTL register
   2452  1.1    dyoung  *
   2453  1.1    dyoung  *  Returns the I2C data bit value
   2454  1.7   msaitoh  *  Negates the I2C data output enable on X550 hardware.
   2455  1.1    dyoung  **/
   2456  1.7   msaitoh static bool ixgbe_get_i2c_data(struct ixgbe_hw *hw, u32 *i2cctl)
   2457  1.1    dyoung {
   2458  1.7   msaitoh 	u32 data_oe_bit = IXGBE_I2C_DATA_OE_N_EN_BY_MAC(hw);
   2459  1.1    dyoung 	bool data;
   2460  1.1    dyoung 
   2461  1.1    dyoung 	DEBUGFUNC("ixgbe_get_i2c_data");
   2462  1.1    dyoung 
   2463  1.7   msaitoh 	if (data_oe_bit) {
   2464  1.7   msaitoh 		*i2cctl |= data_oe_bit;
   2465  1.7   msaitoh 		IXGBE_WRITE_REG(hw, IXGBE_I2CCTL_BY_MAC(hw), *i2cctl);
   2466  1.7   msaitoh 		IXGBE_WRITE_FLUSH(hw);
   2467  1.7   msaitoh 		usec_delay(IXGBE_I2C_T_FALL);
   2468  1.7   msaitoh 	}
   2469  1.7   msaitoh 
   2470  1.7   msaitoh 	if (*i2cctl & IXGBE_I2C_DATA_IN_BY_MAC(hw))
   2471  1.1    dyoung 		data = 1;
   2472  1.1    dyoung 	else
   2473  1.1    dyoung 		data = 0;
   2474  1.1    dyoung 
   2475  1.1    dyoung 	return data;
   2476  1.1    dyoung }
   2477  1.1    dyoung 
   2478  1.1    dyoung /**
   2479  1.1    dyoung  *  ixgbe_i2c_bus_clear - Clears the I2C bus
   2480  1.1    dyoung  *  @hw: pointer to hardware structure
   2481  1.1    dyoung  *
   2482  1.1    dyoung  *  Clears the I2C bus by sending nine clock pulses.
   2483  1.1    dyoung  *  Used when data line is stuck low.
   2484  1.1    dyoung  **/
   2485  1.1    dyoung void ixgbe_i2c_bus_clear(struct ixgbe_hw *hw)
   2486  1.1    dyoung {
   2487  1.7   msaitoh 	u32 i2cctl;
   2488  1.1    dyoung 	u32 i;
   2489  1.1    dyoung 
   2490  1.1    dyoung 	DEBUGFUNC("ixgbe_i2c_bus_clear");
   2491  1.1    dyoung 
   2492  1.1    dyoung 	ixgbe_i2c_start(hw);
   2493  1.7   msaitoh 	i2cctl = IXGBE_READ_REG(hw, IXGBE_I2CCTL_BY_MAC(hw));
   2494  1.1    dyoung 
   2495  1.1    dyoung 	ixgbe_set_i2c_data(hw, &i2cctl, 1);
   2496  1.1    dyoung 
   2497  1.1    dyoung 	for (i = 0; i < 9; i++) {
   2498  1.1    dyoung 		ixgbe_raise_i2c_clk(hw, &i2cctl);
   2499  1.1    dyoung 
   2500  1.1    dyoung 		/* Min high period of clock is 4us */
   2501  1.1    dyoung 		usec_delay(IXGBE_I2C_T_HIGH);
   2502  1.1    dyoung 
   2503  1.1    dyoung 		ixgbe_lower_i2c_clk(hw, &i2cctl);
   2504  1.1    dyoung 
   2505  1.1    dyoung 		/* Min low period of clock is 4.7us*/
   2506  1.1    dyoung 		usec_delay(IXGBE_I2C_T_LOW);
   2507  1.1    dyoung 	}
   2508  1.1    dyoung 
   2509  1.1    dyoung 	ixgbe_i2c_start(hw);
   2510  1.1    dyoung 
   2511  1.1    dyoung 	/* Put the i2c bus back to default state */
   2512  1.1    dyoung 	ixgbe_i2c_stop(hw);
   2513  1.1    dyoung }
   2514  1.1    dyoung 
   2515  1.1    dyoung /**
   2516  1.4   msaitoh  *  ixgbe_tn_check_overtemp - Checks if an overtemp occurred.
   2517  1.1    dyoung  *  @hw: pointer to hardware structure
   2518  1.1    dyoung  *
   2519  1.1    dyoung  *  Checks if the LASI temp alarm status was triggered due to overtemp
   2520  1.1    dyoung  **/
   2521  1.1    dyoung s32 ixgbe_tn_check_overtemp(struct ixgbe_hw *hw)
   2522  1.1    dyoung {
   2523  1.1    dyoung 	s32 status = IXGBE_SUCCESS;
   2524  1.1    dyoung 	u16 phy_data = 0;
   2525  1.1    dyoung 
   2526  1.1    dyoung 	DEBUGFUNC("ixgbe_tn_check_overtemp");
   2527  1.1    dyoung 
   2528  1.1    dyoung 	if (hw->device_id != IXGBE_DEV_ID_82599_T3_LOM)
   2529  1.1    dyoung 		goto out;
   2530  1.1    dyoung 
   2531  1.1    dyoung 	/* Check that the LASI temp alarm status was triggered */
   2532  1.1    dyoung 	hw->phy.ops.read_reg(hw, IXGBE_TN_LASI_STATUS_REG,
   2533  1.1    dyoung 			     IXGBE_MDIO_PMA_PMD_DEV_TYPE, &phy_data);
   2534  1.1    dyoung 
   2535  1.1    dyoung 	if (!(phy_data & IXGBE_TN_LASI_STATUS_TEMP_ALARM))
   2536  1.1    dyoung 		goto out;
   2537  1.1    dyoung 
   2538  1.1    dyoung 	status = IXGBE_ERR_OVERTEMP;
   2539  1.6   msaitoh 	ERROR_REPORT1(IXGBE_ERROR_CAUTION, "Device over temperature");
   2540  1.1    dyoung out:
   2541  1.1    dyoung 	return status;
   2542  1.1    dyoung }
   2543  1.7   msaitoh 
   2544  1.7   msaitoh /**
   2545  1.7   msaitoh  * ixgbe_set_copper_phy_power - Control power for copper phy
   2546  1.7   msaitoh  * @hw: pointer to hardware structure
   2547  1.7   msaitoh  * @on: TRUE for on, FALSE for off
   2548  1.7   msaitoh  */
   2549  1.7   msaitoh s32 ixgbe_set_copper_phy_power(struct ixgbe_hw *hw, bool on)
   2550  1.7   msaitoh {
   2551  1.7   msaitoh 	u32 status;
   2552  1.7   msaitoh 	u16 reg;
   2553  1.7   msaitoh 
   2554  1.7   msaitoh 	status = hw->phy.ops.read_reg(hw, IXGBE_MDIO_VENDOR_SPECIFIC_1_CONTROL,
   2555  1.7   msaitoh 				      IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE,
   2556  1.7   msaitoh 				      &reg);
   2557  1.7   msaitoh 	if (status)
   2558  1.7   msaitoh 		return status;
   2559  1.7   msaitoh 
   2560  1.7   msaitoh 	if (on) {
   2561  1.7   msaitoh 		reg &= ~IXGBE_MDIO_PHY_SET_LOW_POWER_MODE;
   2562  1.7   msaitoh 	} else {
   2563  1.7   msaitoh 		if (ixgbe_check_reset_blocked(hw))
   2564  1.7   msaitoh 			return 0;
   2565  1.7   msaitoh 		reg |= IXGBE_MDIO_PHY_SET_LOW_POWER_MODE;
   2566  1.7   msaitoh 	}
   2567  1.7   msaitoh 
   2568  1.7   msaitoh 	status = hw->phy.ops.write_reg(hw, IXGBE_MDIO_VENDOR_SPECIFIC_1_CONTROL,
   2569  1.7   msaitoh 				       IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE,
   2570  1.7   msaitoh 				       reg);
   2571  1.7   msaitoh 	return status;
   2572  1.7   msaitoh }
   2573