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