Home | History | Annotate | Line # | Download | only in ixgbe
ixgbe_phy.c revision 1.1
      1  1.1  dyoung /******************************************************************************
      2  1.1  dyoung 
      3  1.1  dyoung   Copyright (c) 2001-2010, 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.1  dyoung /*$FreeBSD: src/sys/dev/ixgbe/ixgbe_phy.c,v 1.11 2010/11/26 22:46:32 jfv Exp $*/
     34  1.1  dyoung /*$NetBSD: ixgbe_phy.c,v 1.1 2011/08/12 21:55:29 dyoung 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.1  dyoung static s32 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.1  dyoung static bool ixgbe_get_i2c_data(u32 *i2cctl);
     51  1.1  dyoung void ixgbe_i2c_bus_clear(struct ixgbe_hw *hw);
     52  1.1  dyoung 
     53  1.1  dyoung /**
     54  1.1  dyoung  *  ixgbe_init_phy_ops_generic - Inits PHY function ptrs
     55  1.1  dyoung  *  @hw: pointer to the hardware structure
     56  1.1  dyoung  *
     57  1.1  dyoung  *  Initialize the function pointers.
     58  1.1  dyoung  **/
     59  1.1  dyoung s32 ixgbe_init_phy_ops_generic(struct ixgbe_hw *hw)
     60  1.1  dyoung {
     61  1.1  dyoung 	struct ixgbe_phy_info *phy = &hw->phy;
     62  1.1  dyoung 
     63  1.1  dyoung 	DEBUGFUNC("ixgbe_init_phy_ops_generic");
     64  1.1  dyoung 
     65  1.1  dyoung 	/* PHY */
     66  1.1  dyoung 	phy->ops.identify = &ixgbe_identify_phy_generic;
     67  1.1  dyoung 	phy->ops.reset = &ixgbe_reset_phy_generic;
     68  1.1  dyoung 	phy->ops.read_reg = &ixgbe_read_phy_reg_generic;
     69  1.1  dyoung 	phy->ops.write_reg = &ixgbe_write_phy_reg_generic;
     70  1.1  dyoung 	phy->ops.setup_link = &ixgbe_setup_phy_link_generic;
     71  1.1  dyoung 	phy->ops.setup_link_speed = &ixgbe_setup_phy_link_speed_generic;
     72  1.1  dyoung 	phy->ops.check_link = NULL;
     73  1.1  dyoung 	phy->ops.get_firmware_version = ixgbe_get_phy_firmware_version_generic;
     74  1.1  dyoung 	phy->ops.read_i2c_byte = &ixgbe_read_i2c_byte_generic;
     75  1.1  dyoung 	phy->ops.write_i2c_byte = &ixgbe_write_i2c_byte_generic;
     76  1.1  dyoung 	phy->ops.read_i2c_eeprom = &ixgbe_read_i2c_eeprom_generic;
     77  1.1  dyoung 	phy->ops.write_i2c_eeprom = &ixgbe_write_i2c_eeprom_generic;
     78  1.1  dyoung 	phy->ops.i2c_bus_clear = &ixgbe_i2c_bus_clear;
     79  1.1  dyoung 	phy->ops.identify_sfp = &ixgbe_identify_sfp_module_generic;
     80  1.1  dyoung 	phy->sfp_type = ixgbe_sfp_type_unknown;
     81  1.1  dyoung 	phy->ops.check_overtemp = &ixgbe_tn_check_overtemp;
     82  1.1  dyoung 	return IXGBE_SUCCESS;
     83  1.1  dyoung }
     84  1.1  dyoung 
     85  1.1  dyoung /**
     86  1.1  dyoung  *  ixgbe_identify_phy_generic - Get physical layer module
     87  1.1  dyoung  *  @hw: pointer to hardware structure
     88  1.1  dyoung  *
     89  1.1  dyoung  *  Determines the physical layer module found on the current adapter.
     90  1.1  dyoung  **/
     91  1.1  dyoung s32 ixgbe_identify_phy_generic(struct ixgbe_hw *hw)
     92  1.1  dyoung {
     93  1.1  dyoung 	s32 status = IXGBE_ERR_PHY_ADDR_INVALID;
     94  1.1  dyoung 	u32 phy_addr;
     95  1.1  dyoung 	u16 ext_ability = 0;
     96  1.1  dyoung 
     97  1.1  dyoung 	DEBUGFUNC("ixgbe_identify_phy_generic");
     98  1.1  dyoung 
     99  1.1  dyoung 	if (hw->phy.type == ixgbe_phy_unknown) {
    100  1.1  dyoung 		for (phy_addr = 0; phy_addr < IXGBE_MAX_PHY_ADDR; phy_addr++) {
    101  1.1  dyoung 			if (ixgbe_validate_phy_addr(hw, phy_addr)) {
    102  1.1  dyoung 				hw->phy.addr = phy_addr;
    103  1.1  dyoung 				ixgbe_get_phy_id(hw);
    104  1.1  dyoung 				hw->phy.type =
    105  1.1  dyoung 				        ixgbe_get_phy_type_from_id(hw->phy.id);
    106  1.1  dyoung 
    107  1.1  dyoung 				if (hw->phy.type == ixgbe_phy_unknown) {
    108  1.1  dyoung 					hw->phy.ops.read_reg(hw,
    109  1.1  dyoung 						  IXGBE_MDIO_PHY_EXT_ABILITY,
    110  1.1  dyoung 					          IXGBE_MDIO_PMA_PMD_DEV_TYPE,
    111  1.1  dyoung 					          &ext_ability);
    112  1.1  dyoung 					if (ext_ability &
    113  1.1  dyoung 					    (IXGBE_MDIO_PHY_10GBASET_ABILITY |
    114  1.1  dyoung 					     IXGBE_MDIO_PHY_1000BASET_ABILITY))
    115  1.1  dyoung 						hw->phy.type =
    116  1.1  dyoung 						         ixgbe_phy_cu_unknown;
    117  1.1  dyoung 					else
    118  1.1  dyoung 						hw->phy.type =
    119  1.1  dyoung 						         ixgbe_phy_generic;
    120  1.1  dyoung 				}
    121  1.1  dyoung 
    122  1.1  dyoung 				status = IXGBE_SUCCESS;
    123  1.1  dyoung 				break;
    124  1.1  dyoung 			}
    125  1.1  dyoung 		}
    126  1.1  dyoung 		/* clear value if nothing found */
    127  1.1  dyoung 		if (status != IXGBE_SUCCESS)
    128  1.1  dyoung 			hw->phy.addr = 0;
    129  1.1  dyoung 	} else {
    130  1.1  dyoung 		status = IXGBE_SUCCESS;
    131  1.1  dyoung 	}
    132  1.1  dyoung 
    133  1.1  dyoung 	return status;
    134  1.1  dyoung }
    135  1.1  dyoung 
    136  1.1  dyoung /**
    137  1.1  dyoung  *  ixgbe_validate_phy_addr - Determines phy address is valid
    138  1.1  dyoung  *  @hw: pointer to hardware structure
    139  1.1  dyoung  *
    140  1.1  dyoung  **/
    141  1.1  dyoung bool ixgbe_validate_phy_addr(struct ixgbe_hw *hw, u32 phy_addr)
    142  1.1  dyoung {
    143  1.1  dyoung 	u16 phy_id = 0;
    144  1.1  dyoung 	bool valid = FALSE;
    145  1.1  dyoung 
    146  1.1  dyoung 	DEBUGFUNC("ixgbe_validate_phy_addr");
    147  1.1  dyoung 
    148  1.1  dyoung 	hw->phy.addr = phy_addr;
    149  1.1  dyoung 	hw->phy.ops.read_reg(hw, IXGBE_MDIO_PHY_ID_HIGH,
    150  1.1  dyoung 	                     IXGBE_MDIO_PMA_PMD_DEV_TYPE, &phy_id);
    151  1.1  dyoung 
    152  1.1  dyoung 	if (phy_id != 0xFFFF && phy_id != 0x0)
    153  1.1  dyoung 		valid = TRUE;
    154  1.1  dyoung 
    155  1.1  dyoung 	return valid;
    156  1.1  dyoung }
    157  1.1  dyoung 
    158  1.1  dyoung /**
    159  1.1  dyoung  *  ixgbe_get_phy_id - Get the phy type
    160  1.1  dyoung  *  @hw: pointer to hardware structure
    161  1.1  dyoung  *
    162  1.1  dyoung  **/
    163  1.1  dyoung s32 ixgbe_get_phy_id(struct ixgbe_hw *hw)
    164  1.1  dyoung {
    165  1.1  dyoung 	u32 status;
    166  1.1  dyoung 	u16 phy_id_high = 0;
    167  1.1  dyoung 	u16 phy_id_low = 0;
    168  1.1  dyoung 
    169  1.1  dyoung 	DEBUGFUNC("ixgbe_get_phy_id");
    170  1.1  dyoung 
    171  1.1  dyoung 	status = hw->phy.ops.read_reg(hw, IXGBE_MDIO_PHY_ID_HIGH,
    172  1.1  dyoung 	                              IXGBE_MDIO_PMA_PMD_DEV_TYPE,
    173  1.1  dyoung 	                              &phy_id_high);
    174  1.1  dyoung 
    175  1.1  dyoung 	if (status == IXGBE_SUCCESS) {
    176  1.1  dyoung 		hw->phy.id = (u32)(phy_id_high << 16);
    177  1.1  dyoung 		status = hw->phy.ops.read_reg(hw, IXGBE_MDIO_PHY_ID_LOW,
    178  1.1  dyoung 		                              IXGBE_MDIO_PMA_PMD_DEV_TYPE,
    179  1.1  dyoung 		                              &phy_id_low);
    180  1.1  dyoung 		hw->phy.id |= (u32)(phy_id_low & IXGBE_PHY_REVISION_MASK);
    181  1.1  dyoung 		hw->phy.revision = (u32)(phy_id_low & ~IXGBE_PHY_REVISION_MASK);
    182  1.1  dyoung 	}
    183  1.1  dyoung 	return status;
    184  1.1  dyoung }
    185  1.1  dyoung 
    186  1.1  dyoung /**
    187  1.1  dyoung  *  ixgbe_get_phy_type_from_id - Get the phy type
    188  1.1  dyoung  *  @hw: pointer to hardware structure
    189  1.1  dyoung  *
    190  1.1  dyoung  **/
    191  1.1  dyoung enum ixgbe_phy_type ixgbe_get_phy_type_from_id(u32 phy_id)
    192  1.1  dyoung {
    193  1.1  dyoung 	enum ixgbe_phy_type phy_type;
    194  1.1  dyoung 
    195  1.1  dyoung 	DEBUGFUNC("ixgbe_get_phy_type_from_id");
    196  1.1  dyoung 
    197  1.1  dyoung 	switch (phy_id) {
    198  1.1  dyoung 	case TN1010_PHY_ID:
    199  1.1  dyoung 		phy_type = ixgbe_phy_tn;
    200  1.1  dyoung 		break;
    201  1.1  dyoung 	case AQ1002_PHY_ID:
    202  1.1  dyoung 		phy_type = ixgbe_phy_aq;
    203  1.1  dyoung 		break;
    204  1.1  dyoung 	case QT2022_PHY_ID:
    205  1.1  dyoung 		phy_type = ixgbe_phy_qt;
    206  1.1  dyoung 		break;
    207  1.1  dyoung 	case ATH_PHY_ID:
    208  1.1  dyoung 		phy_type = ixgbe_phy_nl;
    209  1.1  dyoung 		break;
    210  1.1  dyoung 	default:
    211  1.1  dyoung 		phy_type = ixgbe_phy_unknown;
    212  1.1  dyoung 		break;
    213  1.1  dyoung 	}
    214  1.1  dyoung 
    215  1.1  dyoung 	DEBUGOUT1("phy type found is %d\n", phy_type);
    216  1.1  dyoung 	return phy_type;
    217  1.1  dyoung }
    218  1.1  dyoung 
    219  1.1  dyoung /**
    220  1.1  dyoung  *  ixgbe_reset_phy_generic - Performs a PHY reset
    221  1.1  dyoung  *  @hw: pointer to hardware structure
    222  1.1  dyoung  **/
    223  1.1  dyoung s32 ixgbe_reset_phy_generic(struct ixgbe_hw *hw)
    224  1.1  dyoung {
    225  1.1  dyoung 	u32 i;
    226  1.1  dyoung 	u16 ctrl = 0;
    227  1.1  dyoung 	s32 status = IXGBE_SUCCESS;
    228  1.1  dyoung 
    229  1.1  dyoung 	DEBUGFUNC("ixgbe_reset_phy_generic");
    230  1.1  dyoung 
    231  1.1  dyoung 	if (hw->phy.type == ixgbe_phy_unknown)
    232  1.1  dyoung 		status = ixgbe_identify_phy_generic(hw);
    233  1.1  dyoung 
    234  1.1  dyoung 	if (status != IXGBE_SUCCESS || hw->phy.type == ixgbe_phy_none)
    235  1.1  dyoung 		goto out;
    236  1.1  dyoung 
    237  1.1  dyoung 	/* Don't reset PHY if it's shut down due to overtemp. */
    238  1.1  dyoung 	if (!hw->phy.reset_if_overtemp &&
    239  1.1  dyoung 	    (IXGBE_ERR_OVERTEMP == hw->phy.ops.check_overtemp(hw)))
    240  1.1  dyoung 		goto out;
    241  1.1  dyoung 
    242  1.1  dyoung 	/*
    243  1.1  dyoung 	 * Perform soft PHY reset to the PHY_XS.
    244  1.1  dyoung 	 * This will cause a soft reset to the PHY
    245  1.1  dyoung 	 */
    246  1.1  dyoung 	hw->phy.ops.write_reg(hw, IXGBE_MDIO_PHY_XS_CONTROL,
    247  1.1  dyoung 	                      IXGBE_MDIO_PHY_XS_DEV_TYPE,
    248  1.1  dyoung 	                      IXGBE_MDIO_PHY_XS_RESET);
    249  1.1  dyoung 
    250  1.1  dyoung 	/*
    251  1.1  dyoung 	 * Poll for reset bit to self-clear indicating reset is complete.
    252  1.1  dyoung 	 * Some PHYs could take up to 3 seconds to complete and need about
    253  1.1  dyoung 	 * 1.7 usec delay after the reset is complete.
    254  1.1  dyoung 	 */
    255  1.1  dyoung 	for (i = 0; i < 30; i++) {
    256  1.1  dyoung 		msec_delay(100);
    257  1.1  dyoung 		hw->phy.ops.read_reg(hw, IXGBE_MDIO_PHY_XS_CONTROL,
    258  1.1  dyoung 		                     IXGBE_MDIO_PHY_XS_DEV_TYPE, &ctrl);
    259  1.1  dyoung 		if (!(ctrl & IXGBE_MDIO_PHY_XS_RESET)) {
    260  1.1  dyoung 			usec_delay(2);
    261  1.1  dyoung 			break;
    262  1.1  dyoung 		}
    263  1.1  dyoung 	}
    264  1.1  dyoung 
    265  1.1  dyoung 	if (ctrl & IXGBE_MDIO_PHY_XS_RESET) {
    266  1.1  dyoung 		status = IXGBE_ERR_RESET_FAILED;
    267  1.1  dyoung 		DEBUGOUT("PHY reset polling failed to complete.\n");
    268  1.1  dyoung 	}
    269  1.1  dyoung 
    270  1.1  dyoung out:
    271  1.1  dyoung 	return status;
    272  1.1  dyoung }
    273  1.1  dyoung 
    274  1.1  dyoung /**
    275  1.1  dyoung  *  ixgbe_read_phy_reg_generic - Reads a value from a specified PHY register
    276  1.1  dyoung  *  @hw: pointer to hardware structure
    277  1.1  dyoung  *  @reg_addr: 32 bit address of PHY register to read
    278  1.1  dyoung  *  @phy_data: Pointer to read data from PHY register
    279  1.1  dyoung  **/
    280  1.1  dyoung s32 ixgbe_read_phy_reg_generic(struct ixgbe_hw *hw, u32 reg_addr,
    281  1.1  dyoung                                u32 device_type, u16 *phy_data)
    282  1.1  dyoung {
    283  1.1  dyoung 	u32 command;
    284  1.1  dyoung 	u32 i;
    285  1.1  dyoung 	u32 data;
    286  1.1  dyoung 	s32 status = IXGBE_SUCCESS;
    287  1.1  dyoung 	u16 gssr;
    288  1.1  dyoung 
    289  1.1  dyoung 	DEBUGFUNC("ixgbe_read_phy_reg_generic");
    290  1.1  dyoung 
    291  1.1  dyoung 	if (IXGBE_READ_REG(hw, IXGBE_STATUS) & IXGBE_STATUS_LAN_ID_1)
    292  1.1  dyoung 		gssr = IXGBE_GSSR_PHY1_SM;
    293  1.1  dyoung 	else
    294  1.1  dyoung 		gssr = IXGBE_GSSR_PHY0_SM;
    295  1.1  dyoung 
    296  1.1  dyoung 	if (ixgbe_acquire_swfw_sync(hw, gssr) != IXGBE_SUCCESS)
    297  1.1  dyoung 		status = IXGBE_ERR_SWFW_SYNC;
    298  1.1  dyoung 
    299  1.1  dyoung 	if (status == IXGBE_SUCCESS) {
    300  1.1  dyoung 		/* Setup and write the address cycle command */
    301  1.1  dyoung 		command = ((reg_addr << IXGBE_MSCA_NP_ADDR_SHIFT)  |
    302  1.1  dyoung 		           (device_type << IXGBE_MSCA_DEV_TYPE_SHIFT) |
    303  1.1  dyoung 		           (hw->phy.addr << IXGBE_MSCA_PHY_ADDR_SHIFT) |
    304  1.1  dyoung 		           (IXGBE_MSCA_ADDR_CYCLE | IXGBE_MSCA_MDI_COMMAND));
    305  1.1  dyoung 
    306  1.1  dyoung 		IXGBE_WRITE_REG(hw, IXGBE_MSCA, command);
    307  1.1  dyoung 
    308  1.1  dyoung 		/*
    309  1.1  dyoung 		 * Check every 10 usec to see if the address cycle completed.
    310  1.1  dyoung 		 * The MDI Command bit will clear when the operation is
    311  1.1  dyoung 		 * complete
    312  1.1  dyoung 		 */
    313  1.1  dyoung 		for (i = 0; i < IXGBE_MDIO_COMMAND_TIMEOUT; i++) {
    314  1.1  dyoung 			usec_delay(10);
    315  1.1  dyoung 
    316  1.1  dyoung 			command = IXGBE_READ_REG(hw, IXGBE_MSCA);
    317  1.1  dyoung 
    318  1.1  dyoung 			if ((command & IXGBE_MSCA_MDI_COMMAND) == 0)
    319  1.1  dyoung 				break;
    320  1.1  dyoung 		}
    321  1.1  dyoung 
    322  1.1  dyoung 		if ((command & IXGBE_MSCA_MDI_COMMAND) != 0) {
    323  1.1  dyoung 			DEBUGOUT("PHY address command did not complete.\n");
    324  1.1  dyoung 			status = IXGBE_ERR_PHY;
    325  1.1  dyoung 		}
    326  1.1  dyoung 
    327  1.1  dyoung 		if (status == IXGBE_SUCCESS) {
    328  1.1  dyoung 			/*
    329  1.1  dyoung 			 * Address cycle complete, setup and write the read
    330  1.1  dyoung 			 * command
    331  1.1  dyoung 			 */
    332  1.1  dyoung 			command = ((reg_addr << IXGBE_MSCA_NP_ADDR_SHIFT)  |
    333  1.1  dyoung 			           (device_type << IXGBE_MSCA_DEV_TYPE_SHIFT) |
    334  1.1  dyoung 			           (hw->phy.addr << IXGBE_MSCA_PHY_ADDR_SHIFT) |
    335  1.1  dyoung 			           (IXGBE_MSCA_READ | IXGBE_MSCA_MDI_COMMAND));
    336  1.1  dyoung 
    337  1.1  dyoung 			IXGBE_WRITE_REG(hw, IXGBE_MSCA, command);
    338  1.1  dyoung 
    339  1.1  dyoung 			/*
    340  1.1  dyoung 			 * Check every 10 usec to see if the address cycle
    341  1.1  dyoung 			 * completed. The MDI Command bit will clear when the
    342  1.1  dyoung 			 * operation is complete
    343  1.1  dyoung 			 */
    344  1.1  dyoung 			for (i = 0; i < IXGBE_MDIO_COMMAND_TIMEOUT; i++) {
    345  1.1  dyoung 				usec_delay(10);
    346  1.1  dyoung 
    347  1.1  dyoung 				command = IXGBE_READ_REG(hw, IXGBE_MSCA);
    348  1.1  dyoung 
    349  1.1  dyoung 				if ((command & IXGBE_MSCA_MDI_COMMAND) == 0)
    350  1.1  dyoung 					break;
    351  1.1  dyoung 			}
    352  1.1  dyoung 
    353  1.1  dyoung 			if ((command & IXGBE_MSCA_MDI_COMMAND) != 0) {
    354  1.1  dyoung 				DEBUGOUT("PHY read command didn't complete\n");
    355  1.1  dyoung 				status = IXGBE_ERR_PHY;
    356  1.1  dyoung 			} else {
    357  1.1  dyoung 				/*
    358  1.1  dyoung 				 * Read operation is complete.  Get the data
    359  1.1  dyoung 				 * from MSRWD
    360  1.1  dyoung 				 */
    361  1.1  dyoung 				data = IXGBE_READ_REG(hw, IXGBE_MSRWD);
    362  1.1  dyoung 				data >>= IXGBE_MSRWD_READ_DATA_SHIFT;
    363  1.1  dyoung 				*phy_data = (u16)(data);
    364  1.1  dyoung 			}
    365  1.1  dyoung 		}
    366  1.1  dyoung 
    367  1.1  dyoung 		ixgbe_release_swfw_sync(hw, gssr);
    368  1.1  dyoung 	}
    369  1.1  dyoung 
    370  1.1  dyoung 	return status;
    371  1.1  dyoung }
    372  1.1  dyoung 
    373  1.1  dyoung /**
    374  1.1  dyoung  *  ixgbe_write_phy_reg_generic - Writes a value to specified PHY register
    375  1.1  dyoung  *  @hw: pointer to hardware structure
    376  1.1  dyoung  *  @reg_addr: 32 bit PHY register to write
    377  1.1  dyoung  *  @device_type: 5 bit device type
    378  1.1  dyoung  *  @phy_data: Data to write to the PHY register
    379  1.1  dyoung  **/
    380  1.1  dyoung s32 ixgbe_write_phy_reg_generic(struct ixgbe_hw *hw, u32 reg_addr,
    381  1.1  dyoung                                 u32 device_type, u16 phy_data)
    382  1.1  dyoung {
    383  1.1  dyoung 	u32 command;
    384  1.1  dyoung 	u32 i;
    385  1.1  dyoung 	s32 status = IXGBE_SUCCESS;
    386  1.1  dyoung 	u16 gssr;
    387  1.1  dyoung 
    388  1.1  dyoung 	DEBUGFUNC("ixgbe_write_phy_reg_generic");
    389  1.1  dyoung 
    390  1.1  dyoung 	if (IXGBE_READ_REG(hw, IXGBE_STATUS) & IXGBE_STATUS_LAN_ID_1)
    391  1.1  dyoung 		gssr = IXGBE_GSSR_PHY1_SM;
    392  1.1  dyoung 	else
    393  1.1  dyoung 		gssr = IXGBE_GSSR_PHY0_SM;
    394  1.1  dyoung 
    395  1.1  dyoung 	if (ixgbe_acquire_swfw_sync(hw, gssr) != IXGBE_SUCCESS)
    396  1.1  dyoung 		status = IXGBE_ERR_SWFW_SYNC;
    397  1.1  dyoung 
    398  1.1  dyoung 	if (status == IXGBE_SUCCESS) {
    399  1.1  dyoung 		/* Put the data in the MDI single read and write data register*/
    400  1.1  dyoung 		IXGBE_WRITE_REG(hw, IXGBE_MSRWD, (u32)phy_data);
    401  1.1  dyoung 
    402  1.1  dyoung 		/* Setup and write the address cycle command */
    403  1.1  dyoung 		command = ((reg_addr << IXGBE_MSCA_NP_ADDR_SHIFT)  |
    404  1.1  dyoung 		           (device_type << IXGBE_MSCA_DEV_TYPE_SHIFT) |
    405  1.1  dyoung 		           (hw->phy.addr << IXGBE_MSCA_PHY_ADDR_SHIFT) |
    406  1.1  dyoung 		           (IXGBE_MSCA_ADDR_CYCLE | IXGBE_MSCA_MDI_COMMAND));
    407  1.1  dyoung 
    408  1.1  dyoung 		IXGBE_WRITE_REG(hw, IXGBE_MSCA, command);
    409  1.1  dyoung 
    410  1.1  dyoung 		/*
    411  1.1  dyoung 		 * Check every 10 usec to see if the address cycle completed.
    412  1.1  dyoung 		 * The MDI Command bit will clear when the operation is
    413  1.1  dyoung 		 * complete
    414  1.1  dyoung 		 */
    415  1.1  dyoung 		for (i = 0; i < IXGBE_MDIO_COMMAND_TIMEOUT; i++) {
    416  1.1  dyoung 			usec_delay(10);
    417  1.1  dyoung 
    418  1.1  dyoung 			command = IXGBE_READ_REG(hw, IXGBE_MSCA);
    419  1.1  dyoung 
    420  1.1  dyoung 			if ((command & IXGBE_MSCA_MDI_COMMAND) == 0)
    421  1.1  dyoung 				break;
    422  1.1  dyoung 		}
    423  1.1  dyoung 
    424  1.1  dyoung 		if ((command & IXGBE_MSCA_MDI_COMMAND) != 0) {
    425  1.1  dyoung 			DEBUGOUT("PHY address cmd didn't complete\n");
    426  1.1  dyoung 			status = IXGBE_ERR_PHY;
    427  1.1  dyoung 		}
    428  1.1  dyoung 
    429  1.1  dyoung 		if (status == IXGBE_SUCCESS) {
    430  1.1  dyoung 			/*
    431  1.1  dyoung 			 * Address cycle complete, setup and write the write
    432  1.1  dyoung 			 * command
    433  1.1  dyoung 			 */
    434  1.1  dyoung 			command = ((reg_addr << IXGBE_MSCA_NP_ADDR_SHIFT)  |
    435  1.1  dyoung 			           (device_type << IXGBE_MSCA_DEV_TYPE_SHIFT) |
    436  1.1  dyoung 			           (hw->phy.addr << IXGBE_MSCA_PHY_ADDR_SHIFT) |
    437  1.1  dyoung 			           (IXGBE_MSCA_WRITE | IXGBE_MSCA_MDI_COMMAND));
    438  1.1  dyoung 
    439  1.1  dyoung 			IXGBE_WRITE_REG(hw, IXGBE_MSCA, command);
    440  1.1  dyoung 
    441  1.1  dyoung 			/*
    442  1.1  dyoung 			 * Check every 10 usec to see if the address cycle
    443  1.1  dyoung 			 * completed. The MDI Command bit will clear when the
    444  1.1  dyoung 			 * operation is complete
    445  1.1  dyoung 			 */
    446  1.1  dyoung 			for (i = 0; i < IXGBE_MDIO_COMMAND_TIMEOUT; i++) {
    447  1.1  dyoung 				usec_delay(10);
    448  1.1  dyoung 
    449  1.1  dyoung 				command = IXGBE_READ_REG(hw, IXGBE_MSCA);
    450  1.1  dyoung 
    451  1.1  dyoung 				if ((command & IXGBE_MSCA_MDI_COMMAND) == 0)
    452  1.1  dyoung 					break;
    453  1.1  dyoung 			}
    454  1.1  dyoung 
    455  1.1  dyoung 			if ((command & IXGBE_MSCA_MDI_COMMAND) != 0) {
    456  1.1  dyoung 				DEBUGOUT("PHY address cmd didn't complete\n");
    457  1.1  dyoung 				status = IXGBE_ERR_PHY;
    458  1.1  dyoung 			}
    459  1.1  dyoung 		}
    460  1.1  dyoung 
    461  1.1  dyoung 		ixgbe_release_swfw_sync(hw, gssr);
    462  1.1  dyoung 	}
    463  1.1  dyoung 
    464  1.1  dyoung 	return status;
    465  1.1  dyoung }
    466  1.1  dyoung 
    467  1.1  dyoung /**
    468  1.1  dyoung  *  ixgbe_setup_phy_link_generic - Set and restart autoneg
    469  1.1  dyoung  *  @hw: pointer to hardware structure
    470  1.1  dyoung  *
    471  1.1  dyoung  *  Restart autonegotiation and PHY and waits for completion.
    472  1.1  dyoung  **/
    473  1.1  dyoung s32 ixgbe_setup_phy_link_generic(struct ixgbe_hw *hw)
    474  1.1  dyoung {
    475  1.1  dyoung 	s32 status = IXGBE_SUCCESS;
    476  1.1  dyoung 	u32 time_out;
    477  1.1  dyoung 	u32 max_time_out = 10;
    478  1.1  dyoung 	u16 autoneg_reg = IXGBE_MII_AUTONEG_REG;
    479  1.1  dyoung 	bool autoneg = FALSE;
    480  1.1  dyoung 	ixgbe_link_speed speed;
    481  1.1  dyoung 
    482  1.1  dyoung 	DEBUGFUNC("ixgbe_setup_phy_link_generic");
    483  1.1  dyoung 
    484  1.1  dyoung 	ixgbe_get_copper_link_capabilities_generic(hw, &speed, &autoneg);
    485  1.1  dyoung 
    486  1.1  dyoung 	if (speed & IXGBE_LINK_SPEED_10GB_FULL) {
    487  1.1  dyoung 		/* Set or unset auto-negotiation 10G advertisement */
    488  1.1  dyoung 		hw->phy.ops.read_reg(hw, IXGBE_MII_10GBASE_T_AUTONEG_CTRL_REG,
    489  1.1  dyoung 		                     IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
    490  1.1  dyoung 	                             &autoneg_reg);
    491  1.1  dyoung 
    492  1.1  dyoung 		autoneg_reg &= ~IXGBE_MII_10GBASE_T_ADVERTISE;
    493  1.1  dyoung 		if (hw->phy.autoneg_advertised & IXGBE_LINK_SPEED_10GB_FULL)
    494  1.1  dyoung 			autoneg_reg |= IXGBE_MII_10GBASE_T_ADVERTISE;
    495  1.1  dyoung 
    496  1.1  dyoung 		hw->phy.ops.write_reg(hw, IXGBE_MII_10GBASE_T_AUTONEG_CTRL_REG,
    497  1.1  dyoung 		                      IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
    498  1.1  dyoung 		                      autoneg_reg);
    499  1.1  dyoung 	}
    500  1.1  dyoung 
    501  1.1  dyoung 	if (speed & IXGBE_LINK_SPEED_1GB_FULL) {
    502  1.1  dyoung 		/* Set or unset auto-negotiation 1G advertisement */
    503  1.1  dyoung 		hw->phy.ops.read_reg(hw,
    504  1.1  dyoung 		                     IXGBE_MII_AUTONEG_VENDOR_PROVISION_1_REG,
    505  1.1  dyoung 		                     IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
    506  1.1  dyoung 		                     &autoneg_reg);
    507  1.1  dyoung 
    508  1.1  dyoung 		autoneg_reg &= ~IXGBE_MII_1GBASE_T_ADVERTISE;
    509  1.1  dyoung 		if (hw->phy.autoneg_advertised & IXGBE_LINK_SPEED_1GB_FULL)
    510  1.1  dyoung 			autoneg_reg |= IXGBE_MII_1GBASE_T_ADVERTISE;
    511  1.1  dyoung 
    512  1.1  dyoung 		hw->phy.ops.write_reg(hw,
    513  1.1  dyoung 		                      IXGBE_MII_AUTONEG_VENDOR_PROVISION_1_REG,
    514  1.1  dyoung 		                      IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
    515  1.1  dyoung 		                      autoneg_reg);
    516  1.1  dyoung 	}
    517  1.1  dyoung 
    518  1.1  dyoung 	if (speed & IXGBE_LINK_SPEED_100_FULL) {
    519  1.1  dyoung 		/* Set or unset auto-negotiation 100M advertisement */
    520  1.1  dyoung 		hw->phy.ops.read_reg(hw, IXGBE_MII_AUTONEG_ADVERTISE_REG,
    521  1.1  dyoung 		                     IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
    522  1.1  dyoung 		                     &autoneg_reg);
    523  1.1  dyoung 
    524  1.1  dyoung 		autoneg_reg &= ~IXGBE_MII_100BASE_T_ADVERTISE;
    525  1.1  dyoung 		if (hw->phy.autoneg_advertised & IXGBE_LINK_SPEED_100_FULL)
    526  1.1  dyoung 			autoneg_reg |= IXGBE_MII_100BASE_T_ADVERTISE;
    527  1.1  dyoung 
    528  1.1  dyoung 		hw->phy.ops.write_reg(hw, IXGBE_MII_AUTONEG_ADVERTISE_REG,
    529  1.1  dyoung 		                      IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
    530  1.1  dyoung 		                      autoneg_reg);
    531  1.1  dyoung 	}
    532  1.1  dyoung 
    533  1.1  dyoung 	/* Restart PHY autonegotiation and wait for completion */
    534  1.1  dyoung 	hw->phy.ops.read_reg(hw, IXGBE_MDIO_AUTO_NEG_CONTROL,
    535  1.1  dyoung 	                     IXGBE_MDIO_AUTO_NEG_DEV_TYPE, &autoneg_reg);
    536  1.1  dyoung 
    537  1.1  dyoung 	autoneg_reg |= IXGBE_MII_RESTART;
    538  1.1  dyoung 
    539  1.1  dyoung 	hw->phy.ops.write_reg(hw, IXGBE_MDIO_AUTO_NEG_CONTROL,
    540  1.1  dyoung 	                      IXGBE_MDIO_AUTO_NEG_DEV_TYPE, autoneg_reg);
    541  1.1  dyoung 
    542  1.1  dyoung 	/* Wait for autonegotiation to finish */
    543  1.1  dyoung 	for (time_out = 0; time_out < max_time_out; time_out++) {
    544  1.1  dyoung 		usec_delay(10);
    545  1.1  dyoung 		/* Restart PHY autonegotiation and wait for completion */
    546  1.1  dyoung 		status = hw->phy.ops.read_reg(hw, IXGBE_MDIO_AUTO_NEG_STATUS,
    547  1.1  dyoung 		                              IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
    548  1.1  dyoung 		                              &autoneg_reg);
    549  1.1  dyoung 
    550  1.1  dyoung 		autoneg_reg &= IXGBE_MII_AUTONEG_COMPLETE;
    551  1.1  dyoung 		if (autoneg_reg == IXGBE_MII_AUTONEG_COMPLETE) {
    552  1.1  dyoung 			break;
    553  1.1  dyoung 		}
    554  1.1  dyoung 	}
    555  1.1  dyoung 
    556  1.1  dyoung 	if (time_out == max_time_out) {
    557  1.1  dyoung 		status = IXGBE_ERR_LINK_SETUP;
    558  1.1  dyoung 		DEBUGOUT("ixgbe_setup_phy_link_generic: time out");
    559  1.1  dyoung 	}
    560  1.1  dyoung 
    561  1.1  dyoung 	return status;
    562  1.1  dyoung }
    563  1.1  dyoung 
    564  1.1  dyoung /**
    565  1.1  dyoung  *  ixgbe_setup_phy_link_speed_generic - Sets the auto advertised capabilities
    566  1.1  dyoung  *  @hw: pointer to hardware structure
    567  1.1  dyoung  *  @speed: new link speed
    568  1.1  dyoung  *  @autoneg: TRUE if autonegotiation enabled
    569  1.1  dyoung  **/
    570  1.1  dyoung s32 ixgbe_setup_phy_link_speed_generic(struct ixgbe_hw *hw,
    571  1.1  dyoung                                        ixgbe_link_speed speed,
    572  1.1  dyoung                                        bool autoneg,
    573  1.1  dyoung                                        bool autoneg_wait_to_complete)
    574  1.1  dyoung {
    575  1.1  dyoung 	UNREFERENCED_PARAMETER(autoneg);
    576  1.1  dyoung 	UNREFERENCED_PARAMETER(autoneg_wait_to_complete);
    577  1.1  dyoung 
    578  1.1  dyoung 	DEBUGFUNC("ixgbe_setup_phy_link_speed_generic");
    579  1.1  dyoung 
    580  1.1  dyoung 	/*
    581  1.1  dyoung 	 * Clear autoneg_advertised and set new values based on input link
    582  1.1  dyoung 	 * speed.
    583  1.1  dyoung 	 */
    584  1.1  dyoung 	hw->phy.autoneg_advertised = 0;
    585  1.1  dyoung 
    586  1.1  dyoung 	if (speed & IXGBE_LINK_SPEED_10GB_FULL)
    587  1.1  dyoung 		hw->phy.autoneg_advertised |= IXGBE_LINK_SPEED_10GB_FULL;
    588  1.1  dyoung 
    589  1.1  dyoung 	if (speed & IXGBE_LINK_SPEED_1GB_FULL)
    590  1.1  dyoung 		hw->phy.autoneg_advertised |= IXGBE_LINK_SPEED_1GB_FULL;
    591  1.1  dyoung 
    592  1.1  dyoung 	if (speed & IXGBE_LINK_SPEED_100_FULL)
    593  1.1  dyoung 		hw->phy.autoneg_advertised |= IXGBE_LINK_SPEED_100_FULL;
    594  1.1  dyoung 
    595  1.1  dyoung 	/* Setup link based on the new speed settings */
    596  1.1  dyoung 	hw->phy.ops.setup_link(hw);
    597  1.1  dyoung 
    598  1.1  dyoung 	return IXGBE_SUCCESS;
    599  1.1  dyoung }
    600  1.1  dyoung 
    601  1.1  dyoung /**
    602  1.1  dyoung  *  ixgbe_get_copper_link_capabilities_generic - Determines link capabilities
    603  1.1  dyoung  *  @hw: pointer to hardware structure
    604  1.1  dyoung  *  @speed: pointer to link speed
    605  1.1  dyoung  *  @autoneg: boolean auto-negotiation value
    606  1.1  dyoung  *
    607  1.1  dyoung  *  Determines the link capabilities by reading the AUTOC register.
    608  1.1  dyoung  **/
    609  1.1  dyoung s32 ixgbe_get_copper_link_capabilities_generic(struct ixgbe_hw *hw,
    610  1.1  dyoung                                              ixgbe_link_speed *speed,
    611  1.1  dyoung                                              bool *autoneg)
    612  1.1  dyoung {
    613  1.1  dyoung 	s32 status = IXGBE_ERR_LINK_SETUP;
    614  1.1  dyoung 	u16 speed_ability;
    615  1.1  dyoung 
    616  1.1  dyoung 	DEBUGFUNC("ixgbe_get_copper_link_capabilities_generic");
    617  1.1  dyoung 
    618  1.1  dyoung 	*speed = 0;
    619  1.1  dyoung 	*autoneg = TRUE;
    620  1.1  dyoung 
    621  1.1  dyoung 	status = hw->phy.ops.read_reg(hw, IXGBE_MDIO_PHY_SPEED_ABILITY,
    622  1.1  dyoung 	                              IXGBE_MDIO_PMA_PMD_DEV_TYPE,
    623  1.1  dyoung 	                              &speed_ability);
    624  1.1  dyoung 
    625  1.1  dyoung 	if (status == IXGBE_SUCCESS) {
    626  1.1  dyoung 		if (speed_ability & IXGBE_MDIO_PHY_SPEED_10G)
    627  1.1  dyoung 			*speed |= IXGBE_LINK_SPEED_10GB_FULL;
    628  1.1  dyoung 		if (speed_ability & IXGBE_MDIO_PHY_SPEED_1G)
    629  1.1  dyoung 			*speed |= IXGBE_LINK_SPEED_1GB_FULL;
    630  1.1  dyoung 		if (speed_ability & IXGBE_MDIO_PHY_SPEED_100M)
    631  1.1  dyoung 			*speed |= IXGBE_LINK_SPEED_100_FULL;
    632  1.1  dyoung 	}
    633  1.1  dyoung 
    634  1.1  dyoung 	return status;
    635  1.1  dyoung }
    636  1.1  dyoung 
    637  1.1  dyoung /**
    638  1.1  dyoung  *  ixgbe_check_phy_link_tnx - Determine link and speed status
    639  1.1  dyoung  *  @hw: pointer to hardware structure
    640  1.1  dyoung  *
    641  1.1  dyoung  *  Reads the VS1 register to determine if link is up and the current speed for
    642  1.1  dyoung  *  the PHY.
    643  1.1  dyoung  **/
    644  1.1  dyoung s32 ixgbe_check_phy_link_tnx(struct ixgbe_hw *hw, ixgbe_link_speed *speed,
    645  1.1  dyoung                              bool *link_up)
    646  1.1  dyoung {
    647  1.1  dyoung 	s32 status = IXGBE_SUCCESS;
    648  1.1  dyoung 	u32 time_out;
    649  1.1  dyoung 	u32 max_time_out = 10;
    650  1.1  dyoung 	u16 phy_link = 0;
    651  1.1  dyoung 	u16 phy_speed = 0;
    652  1.1  dyoung 	u16 phy_data = 0;
    653  1.1  dyoung 
    654  1.1  dyoung 	DEBUGFUNC("ixgbe_check_phy_link_tnx");
    655  1.1  dyoung 
    656  1.1  dyoung 	/* Initialize speed and link to default case */
    657  1.1  dyoung 	*link_up = FALSE;
    658  1.1  dyoung 	*speed = IXGBE_LINK_SPEED_10GB_FULL;
    659  1.1  dyoung 
    660  1.1  dyoung 	/*
    661  1.1  dyoung 	 * Check current speed and link status of the PHY register.
    662  1.1  dyoung 	 * This is a vendor specific register and may have to
    663  1.1  dyoung 	 * be changed for other copper PHYs.
    664  1.1  dyoung 	 */
    665  1.1  dyoung 	for (time_out = 0; time_out < max_time_out; time_out++) {
    666  1.1  dyoung 		usec_delay(10);
    667  1.1  dyoung 		status = hw->phy.ops.read_reg(hw,
    668  1.1  dyoung 		                        IXGBE_MDIO_VENDOR_SPECIFIC_1_STATUS,
    669  1.1  dyoung 		                        IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE,
    670  1.1  dyoung 		                        &phy_data);
    671  1.1  dyoung 		phy_link = phy_data &
    672  1.1  dyoung 		           IXGBE_MDIO_VENDOR_SPECIFIC_1_LINK_STATUS;
    673  1.1  dyoung 		phy_speed = phy_data &
    674  1.1  dyoung 		            IXGBE_MDIO_VENDOR_SPECIFIC_1_SPEED_STATUS;
    675  1.1  dyoung 		if (phy_link == IXGBE_MDIO_VENDOR_SPECIFIC_1_LINK_STATUS) {
    676  1.1  dyoung 			*link_up = TRUE;
    677  1.1  dyoung 			if (phy_speed ==
    678  1.1  dyoung 			    IXGBE_MDIO_VENDOR_SPECIFIC_1_SPEED_STATUS)
    679  1.1  dyoung 				*speed = IXGBE_LINK_SPEED_1GB_FULL;
    680  1.1  dyoung 			break;
    681  1.1  dyoung 		}
    682  1.1  dyoung 	}
    683  1.1  dyoung 
    684  1.1  dyoung 	return status;
    685  1.1  dyoung }
    686  1.1  dyoung 
    687  1.1  dyoung /**
    688  1.1  dyoung  *	ixgbe_setup_phy_link_tnx - Set and restart autoneg
    689  1.1  dyoung  *	@hw: pointer to hardware structure
    690  1.1  dyoung  *
    691  1.1  dyoung  *	Restart autonegotiation and PHY and waits for completion.
    692  1.1  dyoung  **/
    693  1.1  dyoung s32 ixgbe_setup_phy_link_tnx(struct ixgbe_hw *hw)
    694  1.1  dyoung {
    695  1.1  dyoung 	s32 status = IXGBE_SUCCESS;
    696  1.1  dyoung 	u32 time_out;
    697  1.1  dyoung 	u32 max_time_out = 10;
    698  1.1  dyoung 	u16 autoneg_reg = IXGBE_MII_AUTONEG_REG;
    699  1.1  dyoung 	bool autoneg = FALSE;
    700  1.1  dyoung 	ixgbe_link_speed speed;
    701  1.1  dyoung 
    702  1.1  dyoung 	DEBUGFUNC("ixgbe_setup_phy_link_tnx");
    703  1.1  dyoung 
    704  1.1  dyoung 	ixgbe_get_copper_link_capabilities_generic(hw, &speed, &autoneg);
    705  1.1  dyoung 
    706  1.1  dyoung 	if (speed & IXGBE_LINK_SPEED_10GB_FULL) {
    707  1.1  dyoung 		/* Set or unset auto-negotiation 10G advertisement */
    708  1.1  dyoung 		hw->phy.ops.read_reg(hw, IXGBE_MII_10GBASE_T_AUTONEG_CTRL_REG,
    709  1.1  dyoung 		                     IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
    710  1.1  dyoung 		                     &autoneg_reg);
    711  1.1  dyoung 
    712  1.1  dyoung 		autoneg_reg &= ~IXGBE_MII_10GBASE_T_ADVERTISE;
    713  1.1  dyoung 		if (hw->phy.autoneg_advertised & IXGBE_LINK_SPEED_10GB_FULL)
    714  1.1  dyoung 			autoneg_reg |= IXGBE_MII_10GBASE_T_ADVERTISE;
    715  1.1  dyoung 
    716  1.1  dyoung 		hw->phy.ops.write_reg(hw, IXGBE_MII_10GBASE_T_AUTONEG_CTRL_REG,
    717  1.1  dyoung 		                      IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
    718  1.1  dyoung 		                      autoneg_reg);
    719  1.1  dyoung 	}
    720  1.1  dyoung 
    721  1.1  dyoung 	if (speed & IXGBE_LINK_SPEED_1GB_FULL) {
    722  1.1  dyoung 		/* Set or unset auto-negotiation 1G advertisement */
    723  1.1  dyoung 		hw->phy.ops.read_reg(hw, IXGBE_MII_AUTONEG_XNP_TX_REG,
    724  1.1  dyoung 		                     IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
    725  1.1  dyoung 		                     &autoneg_reg);
    726  1.1  dyoung 
    727  1.1  dyoung 		autoneg_reg &= ~IXGBE_MII_1GBASE_T_ADVERTISE_XNP_TX;
    728  1.1  dyoung 		if (hw->phy.autoneg_advertised & IXGBE_LINK_SPEED_1GB_FULL)
    729  1.1  dyoung 			autoneg_reg |= IXGBE_MII_1GBASE_T_ADVERTISE_XNP_TX;
    730  1.1  dyoung 
    731  1.1  dyoung 		hw->phy.ops.write_reg(hw, IXGBE_MII_AUTONEG_XNP_TX_REG,
    732  1.1  dyoung 		                      IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
    733  1.1  dyoung 		                      autoneg_reg);
    734  1.1  dyoung 	}
    735  1.1  dyoung 
    736  1.1  dyoung 	if (speed & IXGBE_LINK_SPEED_100_FULL) {
    737  1.1  dyoung 		/* Set or unset auto-negotiation 100M advertisement */
    738  1.1  dyoung 		hw->phy.ops.read_reg(hw, IXGBE_MII_AUTONEG_ADVERTISE_REG,
    739  1.1  dyoung 		                     IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
    740  1.1  dyoung 		                     &autoneg_reg);
    741  1.1  dyoung 
    742  1.1  dyoung 		autoneg_reg &= ~IXGBE_MII_100BASE_T_ADVERTISE;
    743  1.1  dyoung 		if (hw->phy.autoneg_advertised & IXGBE_LINK_SPEED_100_FULL)
    744  1.1  dyoung 			autoneg_reg |= IXGBE_MII_100BASE_T_ADVERTISE;
    745  1.1  dyoung 
    746  1.1  dyoung 		hw->phy.ops.write_reg(hw, IXGBE_MII_AUTONEG_ADVERTISE_REG,
    747  1.1  dyoung 		                      IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
    748  1.1  dyoung 		                      autoneg_reg);
    749  1.1  dyoung 	}
    750  1.1  dyoung 
    751  1.1  dyoung 	/* Restart PHY autonegotiation and wait for completion */
    752  1.1  dyoung 	hw->phy.ops.read_reg(hw, IXGBE_MDIO_AUTO_NEG_CONTROL,
    753  1.1  dyoung 	                     IXGBE_MDIO_AUTO_NEG_DEV_TYPE, &autoneg_reg);
    754  1.1  dyoung 
    755  1.1  dyoung 	autoneg_reg |= IXGBE_MII_RESTART;
    756  1.1  dyoung 
    757  1.1  dyoung 	hw->phy.ops.write_reg(hw, IXGBE_MDIO_AUTO_NEG_CONTROL,
    758  1.1  dyoung 	                      IXGBE_MDIO_AUTO_NEG_DEV_TYPE, autoneg_reg);
    759  1.1  dyoung 
    760  1.1  dyoung 	/* Wait for autonegotiation to finish */
    761  1.1  dyoung 	for (time_out = 0; time_out < max_time_out; time_out++) {
    762  1.1  dyoung 		usec_delay(10);
    763  1.1  dyoung 		/* Restart PHY autonegotiation and wait for completion */
    764  1.1  dyoung 		status = hw->phy.ops.read_reg(hw, IXGBE_MDIO_AUTO_NEG_STATUS,
    765  1.1  dyoung 		                              IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
    766  1.1  dyoung 		                              &autoneg_reg);
    767  1.1  dyoung 
    768  1.1  dyoung 		autoneg_reg &= IXGBE_MII_AUTONEG_COMPLETE;
    769  1.1  dyoung 		if (autoneg_reg == IXGBE_MII_AUTONEG_COMPLETE) {
    770  1.1  dyoung 			break;
    771  1.1  dyoung 		}
    772  1.1  dyoung 	}
    773  1.1  dyoung 
    774  1.1  dyoung 	if (time_out == max_time_out) {
    775  1.1  dyoung 		status = IXGBE_ERR_LINK_SETUP;
    776  1.1  dyoung 		DEBUGOUT("ixgbe_setup_phy_link_tnx: time out");
    777  1.1  dyoung 	}
    778  1.1  dyoung 
    779  1.1  dyoung 	return status;
    780  1.1  dyoung }
    781  1.1  dyoung 
    782  1.1  dyoung /**
    783  1.1  dyoung  *  ixgbe_get_phy_firmware_version_tnx - Gets the PHY Firmware Version
    784  1.1  dyoung  *  @hw: pointer to hardware structure
    785  1.1  dyoung  *  @firmware_version: pointer to the PHY Firmware Version
    786  1.1  dyoung  **/
    787  1.1  dyoung s32 ixgbe_get_phy_firmware_version_tnx(struct ixgbe_hw *hw,
    788  1.1  dyoung                                        u16 *firmware_version)
    789  1.1  dyoung {
    790  1.1  dyoung 	s32 status = IXGBE_SUCCESS;
    791  1.1  dyoung 
    792  1.1  dyoung 	DEBUGFUNC("ixgbe_get_phy_firmware_version_tnx");
    793  1.1  dyoung 
    794  1.1  dyoung 	status = hw->phy.ops.read_reg(hw, TNX_FW_REV,
    795  1.1  dyoung 	                              IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE,
    796  1.1  dyoung 	                              firmware_version);
    797  1.1  dyoung 
    798  1.1  dyoung 	return status;
    799  1.1  dyoung }
    800  1.1  dyoung 
    801  1.1  dyoung /**
    802  1.1  dyoung  *  ixgbe_get_phy_firmware_version_generic - Gets the PHY Firmware Version
    803  1.1  dyoung  *  @hw: pointer to hardware structure
    804  1.1  dyoung  *  @firmware_version: pointer to the PHY Firmware Version
    805  1.1  dyoung  **/
    806  1.1  dyoung s32 ixgbe_get_phy_firmware_version_generic(struct ixgbe_hw *hw,
    807  1.1  dyoung                                        u16 *firmware_version)
    808  1.1  dyoung {
    809  1.1  dyoung 	s32 status = IXGBE_SUCCESS;
    810  1.1  dyoung 
    811  1.1  dyoung 	DEBUGFUNC("ixgbe_get_phy_firmware_version_generic");
    812  1.1  dyoung 
    813  1.1  dyoung 	status = hw->phy.ops.read_reg(hw, AQ_FW_REV,
    814  1.1  dyoung 	                              IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE,
    815  1.1  dyoung 	                              firmware_version);
    816  1.1  dyoung 
    817  1.1  dyoung 	return status;
    818  1.1  dyoung }
    819  1.1  dyoung 
    820  1.1  dyoung /**
    821  1.1  dyoung  *  ixgbe_reset_phy_nl - Performs a PHY reset
    822  1.1  dyoung  *  @hw: pointer to hardware structure
    823  1.1  dyoung  **/
    824  1.1  dyoung s32 ixgbe_reset_phy_nl(struct ixgbe_hw *hw)
    825  1.1  dyoung {
    826  1.1  dyoung 	u16 phy_offset, control, eword, edata, block_crc;
    827  1.1  dyoung 	bool end_data = FALSE;
    828  1.1  dyoung 	u16 list_offset, data_offset;
    829  1.1  dyoung 	u16 phy_data = 0;
    830  1.1  dyoung 	s32 ret_val = IXGBE_SUCCESS;
    831  1.1  dyoung 	u32 i;
    832  1.1  dyoung 
    833  1.1  dyoung 	DEBUGFUNC("ixgbe_reset_phy_nl");
    834  1.1  dyoung 
    835  1.1  dyoung 	hw->phy.ops.read_reg(hw, IXGBE_MDIO_PHY_XS_CONTROL,
    836  1.1  dyoung 	                     IXGBE_MDIO_PHY_XS_DEV_TYPE, &phy_data);
    837  1.1  dyoung 
    838  1.1  dyoung 	/* reset the PHY and poll for completion */
    839  1.1  dyoung 	hw->phy.ops.write_reg(hw, IXGBE_MDIO_PHY_XS_CONTROL,
    840  1.1  dyoung 	                      IXGBE_MDIO_PHY_XS_DEV_TYPE,
    841  1.1  dyoung 	                      (phy_data | IXGBE_MDIO_PHY_XS_RESET));
    842  1.1  dyoung 
    843  1.1  dyoung 	for (i = 0; i < 100; i++) {
    844  1.1  dyoung 		hw->phy.ops.read_reg(hw, IXGBE_MDIO_PHY_XS_CONTROL,
    845  1.1  dyoung 		                     IXGBE_MDIO_PHY_XS_DEV_TYPE, &phy_data);
    846  1.1  dyoung 		if ((phy_data & IXGBE_MDIO_PHY_XS_RESET) == 0)
    847  1.1  dyoung 			break;
    848  1.1  dyoung 		msec_delay(10);
    849  1.1  dyoung 	}
    850  1.1  dyoung 
    851  1.1  dyoung 	if ((phy_data & IXGBE_MDIO_PHY_XS_RESET) != 0) {
    852  1.1  dyoung 		DEBUGOUT("PHY reset did not complete.\n");
    853  1.1  dyoung 		ret_val = IXGBE_ERR_PHY;
    854  1.1  dyoung 		goto out;
    855  1.1  dyoung 	}
    856  1.1  dyoung 
    857  1.1  dyoung 	/* Get init offsets */
    858  1.1  dyoung 	ret_val = ixgbe_get_sfp_init_sequence_offsets(hw, &list_offset,
    859  1.1  dyoung 	                                              &data_offset);
    860  1.1  dyoung 	if (ret_val != IXGBE_SUCCESS)
    861  1.1  dyoung 		goto out;
    862  1.1  dyoung 
    863  1.1  dyoung 	ret_val = hw->eeprom.ops.read(hw, data_offset, &block_crc);
    864  1.1  dyoung 	data_offset++;
    865  1.1  dyoung 	while (!end_data) {
    866  1.1  dyoung 		/*
    867  1.1  dyoung 		 * Read control word from PHY init contents offset
    868  1.1  dyoung 		 */
    869  1.1  dyoung 		ret_val = hw->eeprom.ops.read(hw, data_offset, &eword);
    870  1.1  dyoung 		control = (eword & IXGBE_CONTROL_MASK_NL) >>
    871  1.1  dyoung 		           IXGBE_CONTROL_SHIFT_NL;
    872  1.1  dyoung 		edata = eword & IXGBE_DATA_MASK_NL;
    873  1.1  dyoung 		switch (control) {
    874  1.1  dyoung 		case IXGBE_DELAY_NL:
    875  1.1  dyoung 			data_offset++;
    876  1.1  dyoung 			DEBUGOUT1("DELAY: %d MS\n", edata);
    877  1.1  dyoung 			msec_delay(edata);
    878  1.1  dyoung 			break;
    879  1.1  dyoung 		case IXGBE_DATA_NL:
    880  1.1  dyoung 			DEBUGOUT("DATA:  \n");
    881  1.1  dyoung 			data_offset++;
    882  1.1  dyoung 			hw->eeprom.ops.read(hw, data_offset++,
    883  1.1  dyoung 			                    &phy_offset);
    884  1.1  dyoung 			for (i = 0; i < edata; i++) {
    885  1.1  dyoung 				hw->eeprom.ops.read(hw, data_offset, &eword);
    886  1.1  dyoung 				hw->phy.ops.write_reg(hw, phy_offset,
    887  1.1  dyoung 				                      IXGBE_TWINAX_DEV, eword);
    888  1.1  dyoung 				DEBUGOUT2("Wrote %4.4x to %4.4x\n", eword,
    889  1.1  dyoung 				          phy_offset);
    890  1.1  dyoung 				data_offset++;
    891  1.1  dyoung 				phy_offset++;
    892  1.1  dyoung 			}
    893  1.1  dyoung 			break;
    894  1.1  dyoung 		case IXGBE_CONTROL_NL:
    895  1.1  dyoung 			data_offset++;
    896  1.1  dyoung 			DEBUGOUT("CONTROL: \n");
    897  1.1  dyoung 			if (edata == IXGBE_CONTROL_EOL_NL) {
    898  1.1  dyoung 				DEBUGOUT("EOL\n");
    899  1.1  dyoung 				end_data = TRUE;
    900  1.1  dyoung 			} else if (edata == IXGBE_CONTROL_SOL_NL) {
    901  1.1  dyoung 				DEBUGOUT("SOL\n");
    902  1.1  dyoung 			} else {
    903  1.1  dyoung 				DEBUGOUT("Bad control value\n");
    904  1.1  dyoung 				ret_val = IXGBE_ERR_PHY;
    905  1.1  dyoung 				goto out;
    906  1.1  dyoung 			}
    907  1.1  dyoung 			break;
    908  1.1  dyoung 		default:
    909  1.1  dyoung 			DEBUGOUT("Bad control type\n");
    910  1.1  dyoung 			ret_val = IXGBE_ERR_PHY;
    911  1.1  dyoung 			goto out;
    912  1.1  dyoung 		}
    913  1.1  dyoung 	}
    914  1.1  dyoung 
    915  1.1  dyoung out:
    916  1.1  dyoung 	return ret_val;
    917  1.1  dyoung }
    918  1.1  dyoung 
    919  1.1  dyoung /**
    920  1.1  dyoung  *  ixgbe_identify_sfp_module_generic - Identifies SFP modules
    921  1.1  dyoung  *  @hw: pointer to hardware structure
    922  1.1  dyoung  *
    923  1.1  dyoung  *  Searches for and identifies the SFP module and assigns appropriate PHY type.
    924  1.1  dyoung  **/
    925  1.1  dyoung s32 ixgbe_identify_sfp_module_generic(struct ixgbe_hw *hw)
    926  1.1  dyoung {
    927  1.1  dyoung 	s32 status = IXGBE_ERR_PHY_ADDR_INVALID;
    928  1.1  dyoung 	u32 vendor_oui = 0;
    929  1.1  dyoung 	enum ixgbe_sfp_type stored_sfp_type = hw->phy.sfp_type;
    930  1.1  dyoung 	u8 identifier = 0;
    931  1.1  dyoung 	u8 comp_codes_1g = 0;
    932  1.1  dyoung 	u8 comp_codes_10g = 0;
    933  1.1  dyoung 	u8 oui_bytes[3] = {0, 0, 0};
    934  1.1  dyoung 	u8 cable_tech = 0;
    935  1.1  dyoung 	u8 cable_spec = 0;
    936  1.1  dyoung 	u16 enforce_sfp = 0;
    937  1.1  dyoung 
    938  1.1  dyoung 	DEBUGFUNC("ixgbe_identify_sfp_module_generic");
    939  1.1  dyoung 
    940  1.1  dyoung 	if (hw->mac.ops.get_media_type(hw) != ixgbe_media_type_fiber) {
    941  1.1  dyoung 		hw->phy.sfp_type = ixgbe_sfp_type_not_present;
    942  1.1  dyoung 		status = IXGBE_ERR_SFP_NOT_PRESENT;
    943  1.1  dyoung 		goto out;
    944  1.1  dyoung 	}
    945  1.1  dyoung 
    946  1.1  dyoung 	status = hw->phy.ops.read_i2c_eeprom(hw,
    947  1.1  dyoung 	                                     IXGBE_SFF_IDENTIFIER,
    948  1.1  dyoung 	                                     &identifier);
    949  1.1  dyoung 
    950  1.1  dyoung 	if (status == IXGBE_ERR_SWFW_SYNC ||
    951  1.1  dyoung 	    status == IXGBE_ERR_I2C ||
    952  1.1  dyoung 	    status == IXGBE_ERR_SFP_NOT_PRESENT)
    953  1.1  dyoung 		goto err_read_i2c_eeprom;
    954  1.1  dyoung 
    955  1.1  dyoung 	/* LAN ID is needed for sfp_type determination */
    956  1.1  dyoung 	hw->mac.ops.set_lan_id(hw);
    957  1.1  dyoung 
    958  1.1  dyoung 	if (identifier != IXGBE_SFF_IDENTIFIER_SFP) {
    959  1.1  dyoung 		hw->phy.type = ixgbe_phy_sfp_unsupported;
    960  1.1  dyoung 		status = IXGBE_ERR_SFP_NOT_SUPPORTED;
    961  1.1  dyoung 	} else {
    962  1.1  dyoung 		status = hw->phy.ops.read_i2c_eeprom(hw,
    963  1.1  dyoung 		                                     IXGBE_SFF_1GBE_COMP_CODES,
    964  1.1  dyoung 		                                     &comp_codes_1g);
    965  1.1  dyoung 
    966  1.1  dyoung 		if (status == IXGBE_ERR_SWFW_SYNC ||
    967  1.1  dyoung 		    status == IXGBE_ERR_I2C ||
    968  1.1  dyoung 		    status == IXGBE_ERR_SFP_NOT_PRESENT)
    969  1.1  dyoung 			goto err_read_i2c_eeprom;
    970  1.1  dyoung 
    971  1.1  dyoung 		status = hw->phy.ops.read_i2c_eeprom(hw,
    972  1.1  dyoung 		                                     IXGBE_SFF_10GBE_COMP_CODES,
    973  1.1  dyoung 		                                     &comp_codes_10g);
    974  1.1  dyoung 
    975  1.1  dyoung 		if (status == IXGBE_ERR_SWFW_SYNC ||
    976  1.1  dyoung 		    status == IXGBE_ERR_I2C ||
    977  1.1  dyoung 		    status == IXGBE_ERR_SFP_NOT_PRESENT)
    978  1.1  dyoung 			goto err_read_i2c_eeprom;
    979  1.1  dyoung 		status = hw->phy.ops.read_i2c_eeprom(hw,
    980  1.1  dyoung 		                                     IXGBE_SFF_CABLE_TECHNOLOGY,
    981  1.1  dyoung 		                                     &cable_tech);
    982  1.1  dyoung 
    983  1.1  dyoung 		if (status == IXGBE_ERR_SWFW_SYNC ||
    984  1.1  dyoung 		    status == IXGBE_ERR_I2C ||
    985  1.1  dyoung 		    status == IXGBE_ERR_SFP_NOT_PRESENT)
    986  1.1  dyoung 			goto err_read_i2c_eeprom;
    987  1.1  dyoung 
    988  1.1  dyoung 		 /* ID Module
    989  1.1  dyoung 		  * =========
    990  1.1  dyoung 		  * 0   SFP_DA_CU
    991  1.1  dyoung 		  * 1   SFP_SR
    992  1.1  dyoung 		  * 2   SFP_LR
    993  1.1  dyoung 		  * 3   SFP_DA_CORE0 - 82599-specific
    994  1.1  dyoung 		  * 4   SFP_DA_CORE1 - 82599-specific
    995  1.1  dyoung 		  * 5   SFP_SR/LR_CORE0 - 82599-specific
    996  1.1  dyoung 		  * 6   SFP_SR/LR_CORE1 - 82599-specific
    997  1.1  dyoung 		  * 7   SFP_act_lmt_DA_CORE0 - 82599-specific
    998  1.1  dyoung 		  * 8   SFP_act_lmt_DA_CORE1 - 82599-specific
    999  1.1  dyoung 		  * 9   SFP_1g_cu_CORE0 - 82599-specific
   1000  1.1  dyoung 		  * 10  SFP_1g_cu_CORE1 - 82599-specific
   1001  1.1  dyoung 		  */
   1002  1.1  dyoung 		if (hw->mac.type == ixgbe_mac_82598EB) {
   1003  1.1  dyoung 			if (cable_tech & IXGBE_SFF_DA_PASSIVE_CABLE)
   1004  1.1  dyoung 				hw->phy.sfp_type = ixgbe_sfp_type_da_cu;
   1005  1.1  dyoung 			else if (comp_codes_10g & IXGBE_SFF_10GBASESR_CAPABLE)
   1006  1.1  dyoung 				hw->phy.sfp_type = ixgbe_sfp_type_sr;
   1007  1.1  dyoung 			else if (comp_codes_10g & IXGBE_SFF_10GBASELR_CAPABLE)
   1008  1.1  dyoung 				hw->phy.sfp_type = ixgbe_sfp_type_lr;
   1009  1.1  dyoung 			else
   1010  1.1  dyoung 				hw->phy.sfp_type = ixgbe_sfp_type_unknown;
   1011  1.1  dyoung 		} else if (hw->mac.type == ixgbe_mac_82599EB) {
   1012  1.1  dyoung 			if (cable_tech & IXGBE_SFF_DA_PASSIVE_CABLE) {
   1013  1.1  dyoung 				if (hw->bus.lan_id == 0)
   1014  1.1  dyoung 					hw->phy.sfp_type =
   1015  1.1  dyoung 					             ixgbe_sfp_type_da_cu_core0;
   1016  1.1  dyoung 				else
   1017  1.1  dyoung 					hw->phy.sfp_type =
   1018  1.1  dyoung 					             ixgbe_sfp_type_da_cu_core1;
   1019  1.1  dyoung 			} else if (cable_tech & IXGBE_SFF_DA_ACTIVE_CABLE) {
   1020  1.1  dyoung 				hw->phy.ops.read_i2c_eeprom(
   1021  1.1  dyoung 						hw, IXGBE_SFF_CABLE_SPEC_COMP,
   1022  1.1  dyoung 						&cable_spec);
   1023  1.1  dyoung 				if (cable_spec &
   1024  1.1  dyoung 				    IXGBE_SFF_DA_SPEC_ACTIVE_LIMITING) {
   1025  1.1  dyoung 					if (hw->bus.lan_id == 0)
   1026  1.1  dyoung 						hw->phy.sfp_type =
   1027  1.1  dyoung 						ixgbe_sfp_type_da_act_lmt_core0;
   1028  1.1  dyoung 					else
   1029  1.1  dyoung 						hw->phy.sfp_type =
   1030  1.1  dyoung 						ixgbe_sfp_type_da_act_lmt_core1;
   1031  1.1  dyoung 				} else {
   1032  1.1  dyoung 					hw->phy.sfp_type =
   1033  1.1  dyoung 					                ixgbe_sfp_type_unknown;
   1034  1.1  dyoung 				}
   1035  1.1  dyoung 			} else if (comp_codes_10g &
   1036  1.1  dyoung 				   (IXGBE_SFF_10GBASESR_CAPABLE |
   1037  1.1  dyoung 				    IXGBE_SFF_10GBASELR_CAPABLE)) {
   1038  1.1  dyoung 				if (hw->bus.lan_id == 0)
   1039  1.1  dyoung 					hw->phy.sfp_type =
   1040  1.1  dyoung 					              ixgbe_sfp_type_srlr_core0;
   1041  1.1  dyoung 				else
   1042  1.1  dyoung 					hw->phy.sfp_type =
   1043  1.1  dyoung 					              ixgbe_sfp_type_srlr_core1;
   1044  1.1  dyoung 			} else if (comp_codes_1g & IXGBE_SFF_1GBASET_CAPABLE) {
   1045  1.1  dyoung 				if (hw->bus.lan_id == 0)
   1046  1.1  dyoung 					hw->phy.sfp_type =
   1047  1.1  dyoung 						ixgbe_sfp_type_1g_cu_core0;
   1048  1.1  dyoung 				else
   1049  1.1  dyoung 					hw->phy.sfp_type =
   1050  1.1  dyoung 						ixgbe_sfp_type_1g_cu_core1;
   1051  1.1  dyoung 			} else {
   1052  1.1  dyoung 				hw->phy.sfp_type = ixgbe_sfp_type_unknown;
   1053  1.1  dyoung 			}
   1054  1.1  dyoung 		}
   1055  1.1  dyoung 
   1056  1.1  dyoung 		if (hw->phy.sfp_type != stored_sfp_type)
   1057  1.1  dyoung 			hw->phy.sfp_setup_needed = TRUE;
   1058  1.1  dyoung 
   1059  1.1  dyoung 		/* Determine if the SFP+ PHY is dual speed or not. */
   1060  1.1  dyoung 		hw->phy.multispeed_fiber = FALSE;
   1061  1.1  dyoung 		if (((comp_codes_1g & IXGBE_SFF_1GBASESX_CAPABLE) &&
   1062  1.1  dyoung 		   (comp_codes_10g & IXGBE_SFF_10GBASESR_CAPABLE)) ||
   1063  1.1  dyoung 		   ((comp_codes_1g & IXGBE_SFF_1GBASELX_CAPABLE) &&
   1064  1.1  dyoung 		   (comp_codes_10g & IXGBE_SFF_10GBASELR_CAPABLE)))
   1065  1.1  dyoung 			hw->phy.multispeed_fiber = TRUE;
   1066  1.1  dyoung 
   1067  1.1  dyoung 		/* Determine PHY vendor */
   1068  1.1  dyoung 		if (hw->phy.type != ixgbe_phy_nl) {
   1069  1.1  dyoung 			hw->phy.id = identifier;
   1070  1.1  dyoung 			status = hw->phy.ops.read_i2c_eeprom(hw,
   1071  1.1  dyoung 			                            IXGBE_SFF_VENDOR_OUI_BYTE0,
   1072  1.1  dyoung 			                            &oui_bytes[0]);
   1073  1.1  dyoung 
   1074  1.1  dyoung 			if (status == IXGBE_ERR_SWFW_SYNC ||
   1075  1.1  dyoung 			    status == IXGBE_ERR_I2C ||
   1076  1.1  dyoung 			    status == IXGBE_ERR_SFP_NOT_PRESENT)
   1077  1.1  dyoung 				goto err_read_i2c_eeprom;
   1078  1.1  dyoung 
   1079  1.1  dyoung 			status = hw->phy.ops.read_i2c_eeprom(hw,
   1080  1.1  dyoung 			                            IXGBE_SFF_VENDOR_OUI_BYTE1,
   1081  1.1  dyoung 			                            &oui_bytes[1]);
   1082  1.1  dyoung 
   1083  1.1  dyoung 			if (status == IXGBE_ERR_SWFW_SYNC ||
   1084  1.1  dyoung 			    status == IXGBE_ERR_I2C ||
   1085  1.1  dyoung 			    status == IXGBE_ERR_SFP_NOT_PRESENT)
   1086  1.1  dyoung 				goto err_read_i2c_eeprom;
   1087  1.1  dyoung 
   1088  1.1  dyoung 			status = hw->phy.ops.read_i2c_eeprom(hw,
   1089  1.1  dyoung 			                            IXGBE_SFF_VENDOR_OUI_BYTE2,
   1090  1.1  dyoung 			                            &oui_bytes[2]);
   1091  1.1  dyoung 
   1092  1.1  dyoung 			if (status == IXGBE_ERR_SWFW_SYNC ||
   1093  1.1  dyoung 			    status == IXGBE_ERR_I2C ||
   1094  1.1  dyoung 			    status == IXGBE_ERR_SFP_NOT_PRESENT)
   1095  1.1  dyoung 				goto err_read_i2c_eeprom;
   1096  1.1  dyoung 
   1097  1.1  dyoung 			vendor_oui =
   1098  1.1  dyoung 			  ((oui_bytes[0] << IXGBE_SFF_VENDOR_OUI_BYTE0_SHIFT) |
   1099  1.1  dyoung 			   (oui_bytes[1] << IXGBE_SFF_VENDOR_OUI_BYTE1_SHIFT) |
   1100  1.1  dyoung 			   (oui_bytes[2] << IXGBE_SFF_VENDOR_OUI_BYTE2_SHIFT));
   1101  1.1  dyoung 
   1102  1.1  dyoung 			switch (vendor_oui) {
   1103  1.1  dyoung 			case IXGBE_SFF_VENDOR_OUI_TYCO:
   1104  1.1  dyoung 				if (cable_tech & IXGBE_SFF_DA_PASSIVE_CABLE)
   1105  1.1  dyoung 					hw->phy.type =
   1106  1.1  dyoung 					            ixgbe_phy_sfp_passive_tyco;
   1107  1.1  dyoung 				break;
   1108  1.1  dyoung 			case IXGBE_SFF_VENDOR_OUI_FTL:
   1109  1.1  dyoung 				if (cable_tech & IXGBE_SFF_DA_ACTIVE_CABLE)
   1110  1.1  dyoung 					hw->phy.type = ixgbe_phy_sfp_ftl_active;
   1111  1.1  dyoung 				else
   1112  1.1  dyoung 					hw->phy.type = ixgbe_phy_sfp_ftl;
   1113  1.1  dyoung 				break;
   1114  1.1  dyoung 			case IXGBE_SFF_VENDOR_OUI_AVAGO:
   1115  1.1  dyoung 				hw->phy.type = ixgbe_phy_sfp_avago;
   1116  1.1  dyoung 				break;
   1117  1.1  dyoung 			case IXGBE_SFF_VENDOR_OUI_INTEL:
   1118  1.1  dyoung 				hw->phy.type = ixgbe_phy_sfp_intel;
   1119  1.1  dyoung 				break;
   1120  1.1  dyoung 			default:
   1121  1.1  dyoung 				if (cable_tech & IXGBE_SFF_DA_PASSIVE_CABLE)
   1122  1.1  dyoung 					hw->phy.type =
   1123  1.1  dyoung 					         ixgbe_phy_sfp_passive_unknown;
   1124  1.1  dyoung 				else if (cable_tech & IXGBE_SFF_DA_ACTIVE_CABLE)
   1125  1.1  dyoung 					hw->phy.type =
   1126  1.1  dyoung 						ixgbe_phy_sfp_active_unknown;
   1127  1.1  dyoung 				else
   1128  1.1  dyoung 					hw->phy.type = ixgbe_phy_sfp_unknown;
   1129  1.1  dyoung 				break;
   1130  1.1  dyoung 			}
   1131  1.1  dyoung 		}
   1132  1.1  dyoung 
   1133  1.1  dyoung 		/* Allow any DA cable vendor */
   1134  1.1  dyoung 		if (cable_tech & (IXGBE_SFF_DA_PASSIVE_CABLE |
   1135  1.1  dyoung 		    IXGBE_SFF_DA_ACTIVE_CABLE)) {
   1136  1.1  dyoung 			status = IXGBE_SUCCESS;
   1137  1.1  dyoung 			goto out;
   1138  1.1  dyoung 		}
   1139  1.1  dyoung 
   1140  1.1  dyoung 		/* Verify supported 1G SFP modules */
   1141  1.1  dyoung 		if (comp_codes_10g == 0 &&
   1142  1.1  dyoung 		    !(hw->phy.sfp_type == ixgbe_sfp_type_1g_cu_core1 ||
   1143  1.1  dyoung 		      hw->phy.sfp_type == ixgbe_sfp_type_1g_cu_core0)) {
   1144  1.1  dyoung 			hw->phy.type = ixgbe_phy_sfp_unsupported;
   1145  1.1  dyoung 			status = IXGBE_ERR_SFP_NOT_SUPPORTED;
   1146  1.1  dyoung 			goto out;
   1147  1.1  dyoung 		}
   1148  1.1  dyoung 
   1149  1.1  dyoung 		/* Anything else 82598-based is supported */
   1150  1.1  dyoung 		if (hw->mac.type == ixgbe_mac_82598EB) {
   1151  1.1  dyoung 			status = IXGBE_SUCCESS;
   1152  1.1  dyoung 			goto out;
   1153  1.1  dyoung 		}
   1154  1.1  dyoung 
   1155  1.1  dyoung 		ixgbe_get_device_caps(hw, &enforce_sfp);
   1156  1.1  dyoung 		if (!(enforce_sfp & IXGBE_DEVICE_CAPS_ALLOW_ANY_SFP) &&
   1157  1.1  dyoung 		    !((hw->phy.sfp_type == ixgbe_sfp_type_1g_cu_core0) ||
   1158  1.1  dyoung 		      (hw->phy.sfp_type == ixgbe_sfp_type_1g_cu_core1))) {
   1159  1.1  dyoung 			/* Make sure we're a supported PHY type */
   1160  1.1  dyoung 			if (hw->phy.type == ixgbe_phy_sfp_intel) {
   1161  1.1  dyoung 				status = IXGBE_SUCCESS;
   1162  1.1  dyoung 			} else {
   1163  1.1  dyoung 				DEBUGOUT("SFP+ module not supported\n");
   1164  1.1  dyoung 				hw->phy.type = ixgbe_phy_sfp_unsupported;
   1165  1.1  dyoung 				status = IXGBE_ERR_SFP_NOT_SUPPORTED;
   1166  1.1  dyoung 			}
   1167  1.1  dyoung 		} else {
   1168  1.1  dyoung 			status = IXGBE_SUCCESS;
   1169  1.1  dyoung 		}
   1170  1.1  dyoung 	}
   1171  1.1  dyoung 
   1172  1.1  dyoung out:
   1173  1.1  dyoung 	return status;
   1174  1.1  dyoung 
   1175  1.1  dyoung err_read_i2c_eeprom:
   1176  1.1  dyoung 	hw->phy.sfp_type = ixgbe_sfp_type_not_present;
   1177  1.1  dyoung 	if (hw->phy.type != ixgbe_phy_nl) {
   1178  1.1  dyoung 		hw->phy.id = 0;
   1179  1.1  dyoung 		hw->phy.type = ixgbe_phy_unknown;
   1180  1.1  dyoung 	}
   1181  1.1  dyoung 	return IXGBE_ERR_SFP_NOT_PRESENT;
   1182  1.1  dyoung }
   1183  1.1  dyoung 
   1184  1.1  dyoung /**
   1185  1.1  dyoung  *  ixgbe_get_sfp_init_sequence_offsets - Provides offset of PHY init sequence
   1186  1.1  dyoung  *  @hw: pointer to hardware structure
   1187  1.1  dyoung  *  @list_offset: offset to the SFP ID list
   1188  1.1  dyoung  *  @data_offset: offset to the SFP data block
   1189  1.1  dyoung  *
   1190  1.1  dyoung  *  Checks the MAC's EEPROM to see if it supports a given SFP+ module type, if
   1191  1.1  dyoung  *  so it returns the offsets to the phy init sequence block.
   1192  1.1  dyoung  **/
   1193  1.1  dyoung s32 ixgbe_get_sfp_init_sequence_offsets(struct ixgbe_hw *hw,
   1194  1.1  dyoung                                         u16 *list_offset,
   1195  1.1  dyoung                                         u16 *data_offset)
   1196  1.1  dyoung {
   1197  1.1  dyoung 	u16 sfp_id;
   1198  1.1  dyoung 	u16 sfp_type = hw->phy.sfp_type;
   1199  1.1  dyoung 
   1200  1.1  dyoung 	DEBUGFUNC("ixgbe_get_sfp_init_sequence_offsets");
   1201  1.1  dyoung 
   1202  1.1  dyoung 	if (hw->phy.sfp_type == ixgbe_sfp_type_unknown)
   1203  1.1  dyoung 		return IXGBE_ERR_SFP_NOT_SUPPORTED;
   1204  1.1  dyoung 
   1205  1.1  dyoung 	if (hw->phy.sfp_type == ixgbe_sfp_type_not_present)
   1206  1.1  dyoung 		return IXGBE_ERR_SFP_NOT_PRESENT;
   1207  1.1  dyoung 
   1208  1.1  dyoung 	if ((hw->device_id == IXGBE_DEV_ID_82598_SR_DUAL_PORT_EM) &&
   1209  1.1  dyoung 	    (hw->phy.sfp_type == ixgbe_sfp_type_da_cu))
   1210  1.1  dyoung 		return IXGBE_ERR_SFP_NOT_SUPPORTED;
   1211  1.1  dyoung 
   1212  1.1  dyoung 	/*
   1213  1.1  dyoung 	 * Limiting active cables and 1G Phys must be initialized as
   1214  1.1  dyoung 	 * SR modules
   1215  1.1  dyoung 	 */
   1216  1.1  dyoung 	if (sfp_type == ixgbe_sfp_type_da_act_lmt_core0 ||
   1217  1.1  dyoung 	    sfp_type == ixgbe_sfp_type_1g_cu_core0)
   1218  1.1  dyoung 		sfp_type = ixgbe_sfp_type_srlr_core0;
   1219  1.1  dyoung 	else if (sfp_type == ixgbe_sfp_type_da_act_lmt_core1 ||
   1220  1.1  dyoung 		 sfp_type == ixgbe_sfp_type_1g_cu_core1)
   1221  1.1  dyoung 		sfp_type = ixgbe_sfp_type_srlr_core1;
   1222  1.1  dyoung 
   1223  1.1  dyoung 	/* Read offset to PHY init contents */
   1224  1.1  dyoung 	hw->eeprom.ops.read(hw, IXGBE_PHY_INIT_OFFSET_NL, list_offset);
   1225  1.1  dyoung 
   1226  1.1  dyoung 	if ((!*list_offset) || (*list_offset == 0xFFFF))
   1227  1.1  dyoung 		return IXGBE_ERR_SFP_NO_INIT_SEQ_PRESENT;
   1228  1.1  dyoung 
   1229  1.1  dyoung 	/* Shift offset to first ID word */
   1230  1.1  dyoung 	(*list_offset)++;
   1231  1.1  dyoung 
   1232  1.1  dyoung 	/*
   1233  1.1  dyoung 	 * Find the matching SFP ID in the EEPROM
   1234  1.1  dyoung 	 * and program the init sequence
   1235  1.1  dyoung 	 */
   1236  1.1  dyoung 	hw->eeprom.ops.read(hw, *list_offset, &sfp_id);
   1237  1.1  dyoung 
   1238  1.1  dyoung 	while (sfp_id != IXGBE_PHY_INIT_END_NL) {
   1239  1.1  dyoung 		if (sfp_id == sfp_type) {
   1240  1.1  dyoung 			(*list_offset)++;
   1241  1.1  dyoung 			hw->eeprom.ops.read(hw, *list_offset, data_offset);
   1242  1.1  dyoung 			if ((!*data_offset) || (*data_offset == 0xFFFF)) {
   1243  1.1  dyoung 				DEBUGOUT("SFP+ module not supported\n");
   1244  1.1  dyoung 				return IXGBE_ERR_SFP_NOT_SUPPORTED;
   1245  1.1  dyoung 			} else {
   1246  1.1  dyoung 				break;
   1247  1.1  dyoung 			}
   1248  1.1  dyoung 		} else {
   1249  1.1  dyoung 			(*list_offset) += 2;
   1250  1.1  dyoung 			if (hw->eeprom.ops.read(hw, *list_offset, &sfp_id))
   1251  1.1  dyoung 				return IXGBE_ERR_PHY;
   1252  1.1  dyoung 		}
   1253  1.1  dyoung 	}
   1254  1.1  dyoung 
   1255  1.1  dyoung 	if (sfp_id == IXGBE_PHY_INIT_END_NL) {
   1256  1.1  dyoung 		DEBUGOUT("No matching SFP+ module found\n");
   1257  1.1  dyoung 		return IXGBE_ERR_SFP_NOT_SUPPORTED;
   1258  1.1  dyoung 	}
   1259  1.1  dyoung 
   1260  1.1  dyoung 	return IXGBE_SUCCESS;
   1261  1.1  dyoung }
   1262  1.1  dyoung 
   1263  1.1  dyoung /**
   1264  1.1  dyoung  *  ixgbe_read_i2c_eeprom_generic - Reads 8 bit EEPROM word over I2C interface
   1265  1.1  dyoung  *  @hw: pointer to hardware structure
   1266  1.1  dyoung  *  @byte_offset: EEPROM byte offset to read
   1267  1.1  dyoung  *  @eeprom_data: value read
   1268  1.1  dyoung  *
   1269  1.1  dyoung  *  Performs byte read operation to SFP module's EEPROM over I2C interface.
   1270  1.1  dyoung  **/
   1271  1.1  dyoung s32 ixgbe_read_i2c_eeprom_generic(struct ixgbe_hw *hw, u8 byte_offset,
   1272  1.1  dyoung                                   u8 *eeprom_data)
   1273  1.1  dyoung {
   1274  1.1  dyoung 	DEBUGFUNC("ixgbe_read_i2c_eeprom_generic");
   1275  1.1  dyoung 
   1276  1.1  dyoung 	return hw->phy.ops.read_i2c_byte(hw, byte_offset,
   1277  1.1  dyoung 	                                 IXGBE_I2C_EEPROM_DEV_ADDR,
   1278  1.1  dyoung 	                                 eeprom_data);
   1279  1.1  dyoung }
   1280  1.1  dyoung 
   1281  1.1  dyoung /**
   1282  1.1  dyoung  *  ixgbe_write_i2c_eeprom_generic - Writes 8 bit EEPROM word over I2C interface
   1283  1.1  dyoung  *  @hw: pointer to hardware structure
   1284  1.1  dyoung  *  @byte_offset: EEPROM byte offset to write
   1285  1.1  dyoung  *  @eeprom_data: value to write
   1286  1.1  dyoung  *
   1287  1.1  dyoung  *  Performs byte write operation to SFP module's EEPROM over I2C interface.
   1288  1.1  dyoung  **/
   1289  1.1  dyoung s32 ixgbe_write_i2c_eeprom_generic(struct ixgbe_hw *hw, u8 byte_offset,
   1290  1.1  dyoung                                    u8 eeprom_data)
   1291  1.1  dyoung {
   1292  1.1  dyoung 	DEBUGFUNC("ixgbe_write_i2c_eeprom_generic");
   1293  1.1  dyoung 
   1294  1.1  dyoung 	return hw->phy.ops.write_i2c_byte(hw, byte_offset,
   1295  1.1  dyoung 	                                  IXGBE_I2C_EEPROM_DEV_ADDR,
   1296  1.1  dyoung 	                                  eeprom_data);
   1297  1.1  dyoung }
   1298  1.1  dyoung 
   1299  1.1  dyoung /**
   1300  1.1  dyoung  *  ixgbe_read_i2c_byte_generic - Reads 8 bit word over I2C
   1301  1.1  dyoung  *  @hw: pointer to hardware structure
   1302  1.1  dyoung  *  @byte_offset: byte offset to read
   1303  1.1  dyoung  *  @data: value read
   1304  1.1  dyoung  *
   1305  1.1  dyoung  *  Performs byte read operation to SFP module's EEPROM over I2C interface at
   1306  1.1  dyoung  *  a specified deivce address.
   1307  1.1  dyoung  **/
   1308  1.1  dyoung s32 ixgbe_read_i2c_byte_generic(struct ixgbe_hw *hw, u8 byte_offset,
   1309  1.1  dyoung                                 u8 dev_addr, u8 *data)
   1310  1.1  dyoung {
   1311  1.1  dyoung 	s32 status = IXGBE_SUCCESS;
   1312  1.1  dyoung 	u32 max_retry = 10;
   1313  1.1  dyoung 	u32 retry = 0;
   1314  1.1  dyoung 	u16 swfw_mask = 0;
   1315  1.1  dyoung 	bool nack = 1;
   1316  1.1  dyoung 
   1317  1.1  dyoung 	DEBUGFUNC("ixgbe_read_i2c_byte_generic");
   1318  1.1  dyoung 
   1319  1.1  dyoung 	if (IXGBE_READ_REG(hw, IXGBE_STATUS) & IXGBE_STATUS_LAN_ID_1)
   1320  1.1  dyoung 		swfw_mask = IXGBE_GSSR_PHY1_SM;
   1321  1.1  dyoung 	else
   1322  1.1  dyoung 		swfw_mask = IXGBE_GSSR_PHY0_SM;
   1323  1.1  dyoung 
   1324  1.1  dyoung 	do {
   1325  1.1  dyoung 		if (ixgbe_acquire_swfw_sync(hw, swfw_mask) != IXGBE_SUCCESS) {
   1326  1.1  dyoung 			status = IXGBE_ERR_SWFW_SYNC;
   1327  1.1  dyoung 			goto read_byte_out;
   1328  1.1  dyoung 		}
   1329  1.1  dyoung 
   1330  1.1  dyoung 		ixgbe_i2c_start(hw);
   1331  1.1  dyoung 
   1332  1.1  dyoung 		/* Device Address and write indication */
   1333  1.1  dyoung 		status = ixgbe_clock_out_i2c_byte(hw, dev_addr);
   1334  1.1  dyoung 		if (status != IXGBE_SUCCESS)
   1335  1.1  dyoung 			goto fail;
   1336  1.1  dyoung 
   1337  1.1  dyoung 		status = ixgbe_get_i2c_ack(hw);
   1338  1.1  dyoung 		if (status != IXGBE_SUCCESS)
   1339  1.1  dyoung 			goto fail;
   1340  1.1  dyoung 
   1341  1.1  dyoung 		status = ixgbe_clock_out_i2c_byte(hw, byte_offset);
   1342  1.1  dyoung 		if (status != IXGBE_SUCCESS)
   1343  1.1  dyoung 			goto fail;
   1344  1.1  dyoung 
   1345  1.1  dyoung 		status = ixgbe_get_i2c_ack(hw);
   1346  1.1  dyoung 		if (status != IXGBE_SUCCESS)
   1347  1.1  dyoung 			goto fail;
   1348  1.1  dyoung 
   1349  1.1  dyoung 		ixgbe_i2c_start(hw);
   1350  1.1  dyoung 
   1351  1.1  dyoung 		/* Device Address and read indication */
   1352  1.1  dyoung 		status = ixgbe_clock_out_i2c_byte(hw, (dev_addr | 0x1));
   1353  1.1  dyoung 		if (status != IXGBE_SUCCESS)
   1354  1.1  dyoung 			goto fail;
   1355  1.1  dyoung 
   1356  1.1  dyoung 		status = ixgbe_get_i2c_ack(hw);
   1357  1.1  dyoung 		if (status != IXGBE_SUCCESS)
   1358  1.1  dyoung 			goto fail;
   1359  1.1  dyoung 
   1360  1.1  dyoung 		status = ixgbe_clock_in_i2c_byte(hw, data);
   1361  1.1  dyoung 		if (status != IXGBE_SUCCESS)
   1362  1.1  dyoung 			goto fail;
   1363  1.1  dyoung 
   1364  1.1  dyoung 		status = ixgbe_clock_out_i2c_bit(hw, nack);
   1365  1.1  dyoung 		if (status != IXGBE_SUCCESS)
   1366  1.1  dyoung 			goto fail;
   1367  1.1  dyoung 
   1368  1.1  dyoung 		ixgbe_i2c_stop(hw);
   1369  1.1  dyoung 		break;
   1370  1.1  dyoung 
   1371  1.1  dyoung fail:
   1372  1.1  dyoung 		ixgbe_release_swfw_sync(hw, swfw_mask);
   1373  1.1  dyoung 		msec_delay(100);
   1374  1.1  dyoung 		ixgbe_i2c_bus_clear(hw);
   1375  1.1  dyoung 		retry++;
   1376  1.1  dyoung 		if (retry < max_retry)
   1377  1.1  dyoung 			DEBUGOUT("I2C byte read error - Retrying.\n");
   1378  1.1  dyoung 		else
   1379  1.1  dyoung 			DEBUGOUT("I2C byte read error.\n");
   1380  1.1  dyoung 
   1381  1.1  dyoung 	} while (retry < max_retry);
   1382  1.1  dyoung 
   1383  1.1  dyoung 	ixgbe_release_swfw_sync(hw, swfw_mask);
   1384  1.1  dyoung 
   1385  1.1  dyoung read_byte_out:
   1386  1.1  dyoung 	return status;
   1387  1.1  dyoung }
   1388  1.1  dyoung 
   1389  1.1  dyoung /**
   1390  1.1  dyoung  *  ixgbe_write_i2c_byte_generic - Writes 8 bit word over I2C
   1391  1.1  dyoung  *  @hw: pointer to hardware structure
   1392  1.1  dyoung  *  @byte_offset: byte offset to write
   1393  1.1  dyoung  *  @data: value to write
   1394  1.1  dyoung  *
   1395  1.1  dyoung  *  Performs byte write operation to SFP module's EEPROM over I2C interface at
   1396  1.1  dyoung  *  a specified device address.
   1397  1.1  dyoung  **/
   1398  1.1  dyoung s32 ixgbe_write_i2c_byte_generic(struct ixgbe_hw *hw, u8 byte_offset,
   1399  1.1  dyoung                                  u8 dev_addr, u8 data)
   1400  1.1  dyoung {
   1401  1.1  dyoung 	s32 status = IXGBE_SUCCESS;
   1402  1.1  dyoung 	u32 max_retry = 1;
   1403  1.1  dyoung 	u32 retry = 0;
   1404  1.1  dyoung 	u16 swfw_mask = 0;
   1405  1.1  dyoung 
   1406  1.1  dyoung 	DEBUGFUNC("ixgbe_write_i2c_byte_generic");
   1407  1.1  dyoung 
   1408  1.1  dyoung 	if (IXGBE_READ_REG(hw, IXGBE_STATUS) & IXGBE_STATUS_LAN_ID_1)
   1409  1.1  dyoung 		swfw_mask = IXGBE_GSSR_PHY1_SM;
   1410  1.1  dyoung 	else
   1411  1.1  dyoung 		swfw_mask = IXGBE_GSSR_PHY0_SM;
   1412  1.1  dyoung 
   1413  1.1  dyoung 	if (ixgbe_acquire_swfw_sync(hw, swfw_mask) != IXGBE_SUCCESS) {
   1414  1.1  dyoung 		status = IXGBE_ERR_SWFW_SYNC;
   1415  1.1  dyoung 		goto write_byte_out;
   1416  1.1  dyoung 	}
   1417  1.1  dyoung 
   1418  1.1  dyoung 	do {
   1419  1.1  dyoung 		ixgbe_i2c_start(hw);
   1420  1.1  dyoung 
   1421  1.1  dyoung 		status = ixgbe_clock_out_i2c_byte(hw, dev_addr);
   1422  1.1  dyoung 		if (status != IXGBE_SUCCESS)
   1423  1.1  dyoung 			goto fail;
   1424  1.1  dyoung 
   1425  1.1  dyoung 		status = ixgbe_get_i2c_ack(hw);
   1426  1.1  dyoung 		if (status != IXGBE_SUCCESS)
   1427  1.1  dyoung 			goto fail;
   1428  1.1  dyoung 
   1429  1.1  dyoung 		status = ixgbe_clock_out_i2c_byte(hw, byte_offset);
   1430  1.1  dyoung 		if (status != IXGBE_SUCCESS)
   1431  1.1  dyoung 			goto fail;
   1432  1.1  dyoung 
   1433  1.1  dyoung 		status = ixgbe_get_i2c_ack(hw);
   1434  1.1  dyoung 		if (status != IXGBE_SUCCESS)
   1435  1.1  dyoung 			goto fail;
   1436  1.1  dyoung 
   1437  1.1  dyoung 		status = ixgbe_clock_out_i2c_byte(hw, data);
   1438  1.1  dyoung 		if (status != IXGBE_SUCCESS)
   1439  1.1  dyoung 			goto fail;
   1440  1.1  dyoung 
   1441  1.1  dyoung 		status = ixgbe_get_i2c_ack(hw);
   1442  1.1  dyoung 		if (status != IXGBE_SUCCESS)
   1443  1.1  dyoung 			goto fail;
   1444  1.1  dyoung 
   1445  1.1  dyoung 		ixgbe_i2c_stop(hw);
   1446  1.1  dyoung 		break;
   1447  1.1  dyoung 
   1448  1.1  dyoung fail:
   1449  1.1  dyoung 		ixgbe_i2c_bus_clear(hw);
   1450  1.1  dyoung 		retry++;
   1451  1.1  dyoung 		if (retry < max_retry)
   1452  1.1  dyoung 			DEBUGOUT("I2C byte write error - Retrying.\n");
   1453  1.1  dyoung 		else
   1454  1.1  dyoung 			DEBUGOUT("I2C byte write error.\n");
   1455  1.1  dyoung 	} while (retry < max_retry);
   1456  1.1  dyoung 
   1457  1.1  dyoung 	ixgbe_release_swfw_sync(hw, swfw_mask);
   1458  1.1  dyoung 
   1459  1.1  dyoung write_byte_out:
   1460  1.1  dyoung 	return status;
   1461  1.1  dyoung }
   1462  1.1  dyoung 
   1463  1.1  dyoung /**
   1464  1.1  dyoung  *  ixgbe_i2c_start - Sets I2C start condition
   1465  1.1  dyoung  *  @hw: pointer to hardware structure
   1466  1.1  dyoung  *
   1467  1.1  dyoung  *  Sets I2C start condition (High -> Low on SDA while SCL is High)
   1468  1.1  dyoung  **/
   1469  1.1  dyoung static void ixgbe_i2c_start(struct ixgbe_hw *hw)
   1470  1.1  dyoung {
   1471  1.1  dyoung 	u32 i2cctl = IXGBE_READ_REG(hw, IXGBE_I2CCTL);
   1472  1.1  dyoung 
   1473  1.1  dyoung 	DEBUGFUNC("ixgbe_i2c_start");
   1474  1.1  dyoung 
   1475  1.1  dyoung 	/* Start condition must begin with data and clock high */
   1476  1.1  dyoung 	ixgbe_set_i2c_data(hw, &i2cctl, 1);
   1477  1.1  dyoung 	ixgbe_raise_i2c_clk(hw, &i2cctl);
   1478  1.1  dyoung 
   1479  1.1  dyoung 	/* Setup time for start condition (4.7us) */
   1480  1.1  dyoung 	usec_delay(IXGBE_I2C_T_SU_STA);
   1481  1.1  dyoung 
   1482  1.1  dyoung 	ixgbe_set_i2c_data(hw, &i2cctl, 0);
   1483  1.1  dyoung 
   1484  1.1  dyoung 	/* Hold time for start condition (4us) */
   1485  1.1  dyoung 	usec_delay(IXGBE_I2C_T_HD_STA);
   1486  1.1  dyoung 
   1487  1.1  dyoung 	ixgbe_lower_i2c_clk(hw, &i2cctl);
   1488  1.1  dyoung 
   1489  1.1  dyoung 	/* Minimum low period of clock is 4.7 us */
   1490  1.1  dyoung 	usec_delay(IXGBE_I2C_T_LOW);
   1491  1.1  dyoung 
   1492  1.1  dyoung }
   1493  1.1  dyoung 
   1494  1.1  dyoung /**
   1495  1.1  dyoung  *  ixgbe_i2c_stop - Sets I2C stop condition
   1496  1.1  dyoung  *  @hw: pointer to hardware structure
   1497  1.1  dyoung  *
   1498  1.1  dyoung  *  Sets I2C stop condition (Low -> High on SDA while SCL is High)
   1499  1.1  dyoung  **/
   1500  1.1  dyoung static void ixgbe_i2c_stop(struct ixgbe_hw *hw)
   1501  1.1  dyoung {
   1502  1.1  dyoung 	u32 i2cctl = IXGBE_READ_REG(hw, IXGBE_I2CCTL);
   1503  1.1  dyoung 
   1504  1.1  dyoung 	DEBUGFUNC("ixgbe_i2c_stop");
   1505  1.1  dyoung 
   1506  1.1  dyoung 	/* Stop condition must begin with data low and clock high */
   1507  1.1  dyoung 	ixgbe_set_i2c_data(hw, &i2cctl, 0);
   1508  1.1  dyoung 	ixgbe_raise_i2c_clk(hw, &i2cctl);
   1509  1.1  dyoung 
   1510  1.1  dyoung 	/* Setup time for stop condition (4us) */
   1511  1.1  dyoung 	usec_delay(IXGBE_I2C_T_SU_STO);
   1512  1.1  dyoung 
   1513  1.1  dyoung 	ixgbe_set_i2c_data(hw, &i2cctl, 1);
   1514  1.1  dyoung 
   1515  1.1  dyoung 	/* bus free time between stop and start (4.7us)*/
   1516  1.1  dyoung 	usec_delay(IXGBE_I2C_T_BUF);
   1517  1.1  dyoung }
   1518  1.1  dyoung 
   1519  1.1  dyoung /**
   1520  1.1  dyoung  *  ixgbe_clock_in_i2c_byte - Clocks in one byte via I2C
   1521  1.1  dyoung  *  @hw: pointer to hardware structure
   1522  1.1  dyoung  *  @data: data byte to clock in
   1523  1.1  dyoung  *
   1524  1.1  dyoung  *  Clocks in one byte data via I2C data/clock
   1525  1.1  dyoung  **/
   1526  1.1  dyoung static s32 ixgbe_clock_in_i2c_byte(struct ixgbe_hw *hw, u8 *data)
   1527  1.1  dyoung {
   1528  1.1  dyoung 	s32 status = IXGBE_SUCCESS;
   1529  1.1  dyoung 	s32 i;
   1530  1.1  dyoung 	bool bit = 0;
   1531  1.1  dyoung 
   1532  1.1  dyoung 	DEBUGFUNC("ixgbe_clock_in_i2c_byte");
   1533  1.1  dyoung 
   1534  1.1  dyoung 	for (i = 7; i >= 0; i--) {
   1535  1.1  dyoung 		status = ixgbe_clock_in_i2c_bit(hw, &bit);
   1536  1.1  dyoung 		*data |= bit << i;
   1537  1.1  dyoung 
   1538  1.1  dyoung 		if (status != IXGBE_SUCCESS)
   1539  1.1  dyoung 			break;
   1540  1.1  dyoung 	}
   1541  1.1  dyoung 
   1542  1.1  dyoung 	return status;
   1543  1.1  dyoung }
   1544  1.1  dyoung 
   1545  1.1  dyoung /**
   1546  1.1  dyoung  *  ixgbe_clock_out_i2c_byte - Clocks out one byte via I2C
   1547  1.1  dyoung  *  @hw: pointer to hardware structure
   1548  1.1  dyoung  *  @data: data byte clocked out
   1549  1.1  dyoung  *
   1550  1.1  dyoung  *  Clocks out one byte data via I2C data/clock
   1551  1.1  dyoung  **/
   1552  1.1  dyoung static s32 ixgbe_clock_out_i2c_byte(struct ixgbe_hw *hw, u8 data)
   1553  1.1  dyoung {
   1554  1.1  dyoung 	s32 status = IXGBE_SUCCESS;
   1555  1.1  dyoung 	s32 i;
   1556  1.1  dyoung 	u32 i2cctl;
   1557  1.1  dyoung 	bool bit = 0;
   1558  1.1  dyoung 
   1559  1.1  dyoung 	DEBUGFUNC("ixgbe_clock_out_i2c_byte");
   1560  1.1  dyoung 
   1561  1.1  dyoung 	for (i = 7; i >= 0; i--) {
   1562  1.1  dyoung 		bit = (data >> i) & 0x1;
   1563  1.1  dyoung 		status = ixgbe_clock_out_i2c_bit(hw, bit);
   1564  1.1  dyoung 
   1565  1.1  dyoung 		if (status != IXGBE_SUCCESS)
   1566  1.1  dyoung 			break;
   1567  1.1  dyoung 	}
   1568  1.1  dyoung 
   1569  1.1  dyoung 	/* Release SDA line (set high) */
   1570  1.1  dyoung 	i2cctl = IXGBE_READ_REG(hw, IXGBE_I2CCTL);
   1571  1.1  dyoung 	i2cctl |= IXGBE_I2C_DATA_OUT;
   1572  1.1  dyoung 	IXGBE_WRITE_REG(hw, IXGBE_I2CCTL, i2cctl);
   1573  1.1  dyoung 
   1574  1.1  dyoung 	return status;
   1575  1.1  dyoung }
   1576  1.1  dyoung 
   1577  1.1  dyoung /**
   1578  1.1  dyoung  *  ixgbe_get_i2c_ack - Polls for I2C ACK
   1579  1.1  dyoung  *  @hw: pointer to hardware structure
   1580  1.1  dyoung  *
   1581  1.1  dyoung  *  Clocks in/out one bit via I2C data/clock
   1582  1.1  dyoung  **/
   1583  1.1  dyoung static s32 ixgbe_get_i2c_ack(struct ixgbe_hw *hw)
   1584  1.1  dyoung {
   1585  1.1  dyoung 	s32 status;
   1586  1.1  dyoung 	u32 i = 0;
   1587  1.1  dyoung 	u32 i2cctl = IXGBE_READ_REG(hw, IXGBE_I2CCTL);
   1588  1.1  dyoung 	u32 timeout = 10;
   1589  1.1  dyoung 	bool ack = 1;
   1590  1.1  dyoung 
   1591  1.1  dyoung 	DEBUGFUNC("ixgbe_get_i2c_ack");
   1592  1.1  dyoung 
   1593  1.1  dyoung 	status = ixgbe_raise_i2c_clk(hw, &i2cctl);
   1594  1.1  dyoung 
   1595  1.1  dyoung 	if (status != IXGBE_SUCCESS)
   1596  1.1  dyoung 		goto out;
   1597  1.1  dyoung 
   1598  1.1  dyoung 	/* Minimum high period of clock is 4us */
   1599  1.1  dyoung 	usec_delay(IXGBE_I2C_T_HIGH);
   1600  1.1  dyoung 
   1601  1.1  dyoung 	/* Poll for ACK.  Note that ACK in I2C spec is
   1602  1.1  dyoung 	 * transition from 1 to 0 */
   1603  1.1  dyoung 	for (i = 0; i < timeout; i++) {
   1604  1.1  dyoung 		i2cctl = IXGBE_READ_REG(hw, IXGBE_I2CCTL);
   1605  1.1  dyoung 		ack = ixgbe_get_i2c_data(&i2cctl);
   1606  1.1  dyoung 
   1607  1.1  dyoung 		usec_delay(1);
   1608  1.1  dyoung 		if (ack == 0)
   1609  1.1  dyoung 			break;
   1610  1.1  dyoung 	}
   1611  1.1  dyoung 
   1612  1.1  dyoung 	if (ack == 1) {
   1613  1.1  dyoung 		DEBUGOUT("I2C ack was not received.\n");
   1614  1.1  dyoung 		status = IXGBE_ERR_I2C;
   1615  1.1  dyoung 	}
   1616  1.1  dyoung 
   1617  1.1  dyoung 	ixgbe_lower_i2c_clk(hw, &i2cctl);
   1618  1.1  dyoung 
   1619  1.1  dyoung 	/* Minimum low period of clock is 4.7 us */
   1620  1.1  dyoung 	usec_delay(IXGBE_I2C_T_LOW);
   1621  1.1  dyoung 
   1622  1.1  dyoung out:
   1623  1.1  dyoung 	return status;
   1624  1.1  dyoung }
   1625  1.1  dyoung 
   1626  1.1  dyoung /**
   1627  1.1  dyoung  *  ixgbe_clock_in_i2c_bit - Clocks in one bit via I2C data/clock
   1628  1.1  dyoung  *  @hw: pointer to hardware structure
   1629  1.1  dyoung  *  @data: read data value
   1630  1.1  dyoung  *
   1631  1.1  dyoung  *  Clocks in one bit via I2C data/clock
   1632  1.1  dyoung  **/
   1633  1.1  dyoung static s32 ixgbe_clock_in_i2c_bit(struct ixgbe_hw *hw, bool *data)
   1634  1.1  dyoung {
   1635  1.1  dyoung 	s32 status;
   1636  1.1  dyoung 	u32 i2cctl = IXGBE_READ_REG(hw, IXGBE_I2CCTL);
   1637  1.1  dyoung 
   1638  1.1  dyoung 	DEBUGFUNC("ixgbe_clock_in_i2c_bit");
   1639  1.1  dyoung 
   1640  1.1  dyoung 	status = ixgbe_raise_i2c_clk(hw, &i2cctl);
   1641  1.1  dyoung 
   1642  1.1  dyoung 	/* Minimum high period of clock is 4us */
   1643  1.1  dyoung 	usec_delay(IXGBE_I2C_T_HIGH);
   1644  1.1  dyoung 
   1645  1.1  dyoung 	i2cctl = IXGBE_READ_REG(hw, IXGBE_I2CCTL);
   1646  1.1  dyoung 	*data = ixgbe_get_i2c_data(&i2cctl);
   1647  1.1  dyoung 
   1648  1.1  dyoung 	ixgbe_lower_i2c_clk(hw, &i2cctl);
   1649  1.1  dyoung 
   1650  1.1  dyoung 	/* Minimum low period of clock is 4.7 us */
   1651  1.1  dyoung 	usec_delay(IXGBE_I2C_T_LOW);
   1652  1.1  dyoung 
   1653  1.1  dyoung 	return status;
   1654  1.1  dyoung }
   1655  1.1  dyoung 
   1656  1.1  dyoung /**
   1657  1.1  dyoung  *  ixgbe_clock_out_i2c_bit - Clocks in/out one bit via I2C data/clock
   1658  1.1  dyoung  *  @hw: pointer to hardware structure
   1659  1.1  dyoung  *  @data: data value to write
   1660  1.1  dyoung  *
   1661  1.1  dyoung  *  Clocks out one bit via I2C data/clock
   1662  1.1  dyoung  **/
   1663  1.1  dyoung static s32 ixgbe_clock_out_i2c_bit(struct ixgbe_hw *hw, bool data)
   1664  1.1  dyoung {
   1665  1.1  dyoung 	s32 status;
   1666  1.1  dyoung 	u32 i2cctl = IXGBE_READ_REG(hw, IXGBE_I2CCTL);
   1667  1.1  dyoung 
   1668  1.1  dyoung 	DEBUGFUNC("ixgbe_clock_out_i2c_bit");
   1669  1.1  dyoung 
   1670  1.1  dyoung 	status = ixgbe_set_i2c_data(hw, &i2cctl, data);
   1671  1.1  dyoung 	if (status == IXGBE_SUCCESS) {
   1672  1.1  dyoung 		status = ixgbe_raise_i2c_clk(hw, &i2cctl);
   1673  1.1  dyoung 
   1674  1.1  dyoung 		/* Minimum high period of clock is 4us */
   1675  1.1  dyoung 		usec_delay(IXGBE_I2C_T_HIGH);
   1676  1.1  dyoung 
   1677  1.1  dyoung 		ixgbe_lower_i2c_clk(hw, &i2cctl);
   1678  1.1  dyoung 
   1679  1.1  dyoung 		/* Minimum low period of clock is 4.7 us.
   1680  1.1  dyoung 		 * This also takes care of the data hold time.
   1681  1.1  dyoung 		 */
   1682  1.1  dyoung 		usec_delay(IXGBE_I2C_T_LOW);
   1683  1.1  dyoung 	} else {
   1684  1.1  dyoung 		status = IXGBE_ERR_I2C;
   1685  1.1  dyoung 		DEBUGOUT1("I2C data was not set to %X\n", data);
   1686  1.1  dyoung 	}
   1687  1.1  dyoung 
   1688  1.1  dyoung 	return status;
   1689  1.1  dyoung }
   1690  1.1  dyoung /**
   1691  1.1  dyoung  *  ixgbe_raise_i2c_clk - Raises the I2C SCL clock
   1692  1.1  dyoung  *  @hw: pointer to hardware structure
   1693  1.1  dyoung  *  @i2cctl: Current value of I2CCTL register
   1694  1.1  dyoung  *
   1695  1.1  dyoung  *  Raises the I2C clock line '0'->'1'
   1696  1.1  dyoung  **/
   1697  1.1  dyoung static s32 ixgbe_raise_i2c_clk(struct ixgbe_hw *hw, u32 *i2cctl)
   1698  1.1  dyoung {
   1699  1.1  dyoung 	s32 status = IXGBE_SUCCESS;
   1700  1.1  dyoung 
   1701  1.1  dyoung 	DEBUGFUNC("ixgbe_raise_i2c_clk");
   1702  1.1  dyoung 
   1703  1.1  dyoung 	*i2cctl |= IXGBE_I2C_CLK_OUT;
   1704  1.1  dyoung 
   1705  1.1  dyoung 	IXGBE_WRITE_REG(hw, IXGBE_I2CCTL, *i2cctl);
   1706  1.1  dyoung 
   1707  1.1  dyoung 	/* SCL rise time (1000ns) */
   1708  1.1  dyoung 	usec_delay(IXGBE_I2C_T_RISE);
   1709  1.1  dyoung 
   1710  1.1  dyoung 	return status;
   1711  1.1  dyoung }
   1712  1.1  dyoung 
   1713  1.1  dyoung /**
   1714  1.1  dyoung  *  ixgbe_lower_i2c_clk - Lowers the I2C SCL clock
   1715  1.1  dyoung  *  @hw: pointer to hardware structure
   1716  1.1  dyoung  *  @i2cctl: Current value of I2CCTL register
   1717  1.1  dyoung  *
   1718  1.1  dyoung  *  Lowers the I2C clock line '1'->'0'
   1719  1.1  dyoung  **/
   1720  1.1  dyoung static void ixgbe_lower_i2c_clk(struct ixgbe_hw *hw, u32 *i2cctl)
   1721  1.1  dyoung {
   1722  1.1  dyoung 
   1723  1.1  dyoung 	DEBUGFUNC("ixgbe_lower_i2c_clk");
   1724  1.1  dyoung 
   1725  1.1  dyoung 	*i2cctl &= ~IXGBE_I2C_CLK_OUT;
   1726  1.1  dyoung 
   1727  1.1  dyoung 	IXGBE_WRITE_REG(hw, IXGBE_I2CCTL, *i2cctl);
   1728  1.1  dyoung 
   1729  1.1  dyoung 	/* SCL fall time (300ns) */
   1730  1.1  dyoung 	usec_delay(IXGBE_I2C_T_FALL);
   1731  1.1  dyoung }
   1732  1.1  dyoung 
   1733  1.1  dyoung /**
   1734  1.1  dyoung  *  ixgbe_set_i2c_data - Sets the I2C data bit
   1735  1.1  dyoung  *  @hw: pointer to hardware structure
   1736  1.1  dyoung  *  @i2cctl: Current value of I2CCTL register
   1737  1.1  dyoung  *  @data: I2C data value (0 or 1) to set
   1738  1.1  dyoung  *
   1739  1.1  dyoung  *  Sets the I2C data bit
   1740  1.1  dyoung  **/
   1741  1.1  dyoung static s32 ixgbe_set_i2c_data(struct ixgbe_hw *hw, u32 *i2cctl, bool data)
   1742  1.1  dyoung {
   1743  1.1  dyoung 	s32 status = IXGBE_SUCCESS;
   1744  1.1  dyoung 
   1745  1.1  dyoung 	DEBUGFUNC("ixgbe_set_i2c_data");
   1746  1.1  dyoung 
   1747  1.1  dyoung 	if (data)
   1748  1.1  dyoung 		*i2cctl |= IXGBE_I2C_DATA_OUT;
   1749  1.1  dyoung 	else
   1750  1.1  dyoung 		*i2cctl &= ~IXGBE_I2C_DATA_OUT;
   1751  1.1  dyoung 
   1752  1.1  dyoung 	IXGBE_WRITE_REG(hw, IXGBE_I2CCTL, *i2cctl);
   1753  1.1  dyoung 
   1754  1.1  dyoung 	/* Data rise/fall (1000ns/300ns) and set-up time (250ns) */
   1755  1.1  dyoung 	usec_delay(IXGBE_I2C_T_RISE + IXGBE_I2C_T_FALL + IXGBE_I2C_T_SU_DATA);
   1756  1.1  dyoung 
   1757  1.1  dyoung 	/* Verify data was set correctly */
   1758  1.1  dyoung 	*i2cctl = IXGBE_READ_REG(hw, IXGBE_I2CCTL);
   1759  1.1  dyoung 	if (data != ixgbe_get_i2c_data(i2cctl)) {
   1760  1.1  dyoung 		status = IXGBE_ERR_I2C;
   1761  1.1  dyoung 		DEBUGOUT1("Error - I2C data was not set to %X.\n", data);
   1762  1.1  dyoung 	}
   1763  1.1  dyoung 
   1764  1.1  dyoung 	return status;
   1765  1.1  dyoung }
   1766  1.1  dyoung 
   1767  1.1  dyoung /**
   1768  1.1  dyoung  *  ixgbe_get_i2c_data - Reads the I2C SDA data bit
   1769  1.1  dyoung  *  @hw: pointer to hardware structure
   1770  1.1  dyoung  *  @i2cctl: Current value of I2CCTL register
   1771  1.1  dyoung  *
   1772  1.1  dyoung  *  Returns the I2C data bit value
   1773  1.1  dyoung  **/
   1774  1.1  dyoung static bool ixgbe_get_i2c_data(u32 *i2cctl)
   1775  1.1  dyoung {
   1776  1.1  dyoung 	bool data;
   1777  1.1  dyoung 
   1778  1.1  dyoung 	DEBUGFUNC("ixgbe_get_i2c_data");
   1779  1.1  dyoung 
   1780  1.1  dyoung 	if (*i2cctl & IXGBE_I2C_DATA_IN)
   1781  1.1  dyoung 		data = 1;
   1782  1.1  dyoung 	else
   1783  1.1  dyoung 		data = 0;
   1784  1.1  dyoung 
   1785  1.1  dyoung 	return data;
   1786  1.1  dyoung }
   1787  1.1  dyoung 
   1788  1.1  dyoung /**
   1789  1.1  dyoung  *  ixgbe_i2c_bus_clear - Clears the I2C bus
   1790  1.1  dyoung  *  @hw: pointer to hardware structure
   1791  1.1  dyoung  *
   1792  1.1  dyoung  *  Clears the I2C bus by sending nine clock pulses.
   1793  1.1  dyoung  *  Used when data line is stuck low.
   1794  1.1  dyoung  **/
   1795  1.1  dyoung void ixgbe_i2c_bus_clear(struct ixgbe_hw *hw)
   1796  1.1  dyoung {
   1797  1.1  dyoung 	u32 i2cctl = IXGBE_READ_REG(hw, IXGBE_I2CCTL);
   1798  1.1  dyoung 	u32 i;
   1799  1.1  dyoung 
   1800  1.1  dyoung 	DEBUGFUNC("ixgbe_i2c_bus_clear");
   1801  1.1  dyoung 
   1802  1.1  dyoung 	ixgbe_i2c_start(hw);
   1803  1.1  dyoung 
   1804  1.1  dyoung 	ixgbe_set_i2c_data(hw, &i2cctl, 1);
   1805  1.1  dyoung 
   1806  1.1  dyoung 	for (i = 0; i < 9; i++) {
   1807  1.1  dyoung 		ixgbe_raise_i2c_clk(hw, &i2cctl);
   1808  1.1  dyoung 
   1809  1.1  dyoung 		/* Min high period of clock is 4us */
   1810  1.1  dyoung 		usec_delay(IXGBE_I2C_T_HIGH);
   1811  1.1  dyoung 
   1812  1.1  dyoung 		ixgbe_lower_i2c_clk(hw, &i2cctl);
   1813  1.1  dyoung 
   1814  1.1  dyoung 		/* Min low period of clock is 4.7us*/
   1815  1.1  dyoung 		usec_delay(IXGBE_I2C_T_LOW);
   1816  1.1  dyoung 	}
   1817  1.1  dyoung 
   1818  1.1  dyoung 	ixgbe_i2c_start(hw);
   1819  1.1  dyoung 
   1820  1.1  dyoung 	/* Put the i2c bus back to default state */
   1821  1.1  dyoung 	ixgbe_i2c_stop(hw);
   1822  1.1  dyoung }
   1823  1.1  dyoung 
   1824  1.1  dyoung /**
   1825  1.1  dyoung  *  ixgbe_tn_check_overtemp - Checks if an overtemp occured.
   1826  1.1  dyoung  *  @hw: pointer to hardware structure
   1827  1.1  dyoung  *
   1828  1.1  dyoung  *  Checks if the LASI temp alarm status was triggered due to overtemp
   1829  1.1  dyoung  **/
   1830  1.1  dyoung s32 ixgbe_tn_check_overtemp(struct ixgbe_hw *hw)
   1831  1.1  dyoung {
   1832  1.1  dyoung 	s32 status = IXGBE_SUCCESS;
   1833  1.1  dyoung 	u16 phy_data = 0;
   1834  1.1  dyoung 
   1835  1.1  dyoung 	DEBUGFUNC("ixgbe_tn_check_overtemp");
   1836  1.1  dyoung 
   1837  1.1  dyoung 	if (hw->device_id != IXGBE_DEV_ID_82599_T3_LOM)
   1838  1.1  dyoung 		goto out;
   1839  1.1  dyoung 
   1840  1.1  dyoung 	/* Check that the LASI temp alarm status was triggered */
   1841  1.1  dyoung 	hw->phy.ops.read_reg(hw, IXGBE_TN_LASI_STATUS_REG,
   1842  1.1  dyoung 			     IXGBE_MDIO_PMA_PMD_DEV_TYPE, &phy_data);
   1843  1.1  dyoung 
   1844  1.1  dyoung 	if (!(phy_data & IXGBE_TN_LASI_STATUS_TEMP_ALARM))
   1845  1.1  dyoung 		goto out;
   1846  1.1  dyoung 
   1847  1.1  dyoung 	status = IXGBE_ERR_OVERTEMP;
   1848  1.1  dyoung out:
   1849  1.1  dyoung 	return status;
   1850  1.1  dyoung }
   1851