The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/dev/ixgbe/ixgbe_phy.c

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

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

Cache object: 473dfa2e158c0013182f3ae6072e969d


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.