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

Cache object: 6167c4278c25fc6c9a406e0b0cc999bd


[ 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.