Print this page
6064 ixgbe needs X550 support

Split Close
Expand all
Collapse all
          --- old/usr/src/uts/common/io/ixgbe/ixgbe_common.c
          +++ new/usr/src/uts/common/io/ixgbe/ixgbe_common.c
   1    1  /******************************************************************************
   2    2  
   3      -  Copyright (c) 2001-2012, Intel Corporation 
        3 +  Copyright (c) 2001-2015, Intel Corporation 
   4    4    All rights reserved.
   5    5    
   6    6    Redistribution and use in source and binary forms, with or without 
   7    7    modification, are permitted provided that the following conditions are met:
   8    8    
   9    9     1. Redistributions of source code must retain the above copyright notice, 
  10   10        this list of conditions and the following disclaimer.
  11   11    
  12   12     2. Redistributions in binary form must reproduce the above copyright 
  13   13        notice, this list of conditions and the following disclaimer in the 
↓ open down ↓ 9 lines elided ↑ open up ↑
  23   23    ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 
  24   24    LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 
  25   25    CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 
  26   26    SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 
  27   27    INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 
  28   28    CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
  29   29    ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  30   30    POSSIBILITY OF SUCH DAMAGE.
  31   31  
  32   32  ******************************************************************************/
  33      -/*$FreeBSD: src/sys/dev/ixgbe/ixgbe_common.c,v 1.14 2012/07/05 20:51:44 jfv Exp $*/
       33 +/*$FreeBSD$*/
  34   34  
  35   35  #include "ixgbe_common.h"
  36   36  #include "ixgbe_phy.h"
       37 +#include "ixgbe_dcb.h"
       38 +#include "ixgbe_dcb_82599.h"
  37   39  #include "ixgbe_api.h"
  38   40  
  39   41  static s32 ixgbe_acquire_eeprom(struct ixgbe_hw *hw);
  40   42  static s32 ixgbe_get_eeprom_semaphore(struct ixgbe_hw *hw);
  41   43  static void ixgbe_release_eeprom_semaphore(struct ixgbe_hw *hw);
  42   44  static s32 ixgbe_ready_eeprom(struct ixgbe_hw *hw);
  43   45  static void ixgbe_standby_eeprom(struct ixgbe_hw *hw);
  44   46  static void ixgbe_shift_out_eeprom_bits(struct ixgbe_hw *hw, u16 data,
  45   47                                          u16 count);
  46   48  static u16 ixgbe_shift_in_eeprom_bits(struct ixgbe_hw *hw, u16 count);
↓ open down ↓ 14 lines elided ↑ open up ↑
  61   63  /**
  62   64   *  ixgbe_init_ops_generic - Inits function ptrs
  63   65   *  @hw: pointer to the hardware structure
  64   66   *
  65   67   *  Initialize the function pointers.
  66   68   **/
  67   69  s32 ixgbe_init_ops_generic(struct ixgbe_hw *hw)
  68   70  {
  69   71          struct ixgbe_eeprom_info *eeprom = &hw->eeprom;
  70   72          struct ixgbe_mac_info *mac = &hw->mac;
  71      -        u32 eec = IXGBE_READ_REG(hw, IXGBE_EEC);
       73 +        u32 eec = IXGBE_READ_REG(hw, IXGBE_EEC_BY_MAC(hw));
  72   74  
  73   75          DEBUGFUNC("ixgbe_init_ops_generic");
  74   76  
  75   77          /* EEPROM */
  76      -        eeprom->ops.init_params = &ixgbe_init_eeprom_params_generic;
       78 +        eeprom->ops.init_params = ixgbe_init_eeprom_params_generic;
  77   79          /* If EEPROM is valid (bit 8 = 1), use EERD otherwise use bit bang */
  78   80          if (eec & IXGBE_EEC_PRES) {
  79      -                eeprom->ops.read = &ixgbe_read_eerd_generic;
  80      -                eeprom->ops.read_buffer = &ixgbe_read_eerd_buffer_generic;
       81 +                eeprom->ops.read = ixgbe_read_eerd_generic;
       82 +                eeprom->ops.read_buffer = ixgbe_read_eerd_buffer_generic;
  81   83          } else {
  82      -                eeprom->ops.read = &ixgbe_read_eeprom_bit_bang_generic;
       84 +                eeprom->ops.read = ixgbe_read_eeprom_bit_bang_generic;
  83   85                  eeprom->ops.read_buffer =
  84      -                                 &ixgbe_read_eeprom_buffer_bit_bang_generic;
       86 +                                 ixgbe_read_eeprom_buffer_bit_bang_generic;
  85   87          }
  86      -        eeprom->ops.write = &ixgbe_write_eeprom_generic;
  87      -        eeprom->ops.write_buffer = &ixgbe_write_eeprom_buffer_bit_bang_generic;
       88 +        eeprom->ops.write = ixgbe_write_eeprom_generic;
       89 +        eeprom->ops.write_buffer = ixgbe_write_eeprom_buffer_bit_bang_generic;
  88   90          eeprom->ops.validate_checksum =
  89      -                                      &ixgbe_validate_eeprom_checksum_generic;
  90      -        eeprom->ops.update_checksum = &ixgbe_update_eeprom_checksum_generic;
  91      -        eeprom->ops.calc_checksum = &ixgbe_calc_eeprom_checksum_generic;
       91 +                                      ixgbe_validate_eeprom_checksum_generic;
       92 +        eeprom->ops.update_checksum = ixgbe_update_eeprom_checksum_generic;
       93 +        eeprom->ops.calc_checksum = ixgbe_calc_eeprom_checksum_generic;
  92   94  
  93   95          /* MAC */
  94      -        mac->ops.init_hw = &ixgbe_init_hw_generic;
       96 +        mac->ops.init_hw = ixgbe_init_hw_generic;
  95   97          mac->ops.reset_hw = NULL;
  96      -        mac->ops.start_hw = &ixgbe_start_hw_generic;
  97      -        mac->ops.clear_hw_cntrs = &ixgbe_clear_hw_cntrs_generic;
       98 +        mac->ops.start_hw = ixgbe_start_hw_generic;
       99 +        mac->ops.clear_hw_cntrs = ixgbe_clear_hw_cntrs_generic;
  98  100          mac->ops.get_media_type = NULL;
  99  101          mac->ops.get_supported_physical_layer = NULL;
 100      -        mac->ops.enable_rx_dma = &ixgbe_enable_rx_dma_generic;
 101      -        mac->ops.get_mac_addr = &ixgbe_get_mac_addr_generic;
 102      -        mac->ops.stop_adapter = &ixgbe_stop_adapter_generic;
 103      -        mac->ops.get_bus_info = &ixgbe_get_bus_info_generic;
 104      -        mac->ops.set_lan_id = &ixgbe_set_lan_id_multi_port_pcie;
 105      -        mac->ops.acquire_swfw_sync = &ixgbe_acquire_swfw_sync;
 106      -        mac->ops.release_swfw_sync = &ixgbe_release_swfw_sync;
      102 +        mac->ops.enable_rx_dma = ixgbe_enable_rx_dma_generic;
      103 +        mac->ops.get_mac_addr = ixgbe_get_mac_addr_generic;
      104 +        mac->ops.stop_adapter = ixgbe_stop_adapter_generic;
      105 +        mac->ops.get_bus_info = ixgbe_get_bus_info_generic;
      106 +        mac->ops.set_lan_id = ixgbe_set_lan_id_multi_port_pcie;
      107 +        mac->ops.acquire_swfw_sync = ixgbe_acquire_swfw_sync;
      108 +        mac->ops.release_swfw_sync = ixgbe_release_swfw_sync;
      109 +        mac->ops.prot_autoc_read = prot_autoc_read_generic;
      110 +        mac->ops.prot_autoc_write = prot_autoc_write_generic;
 107  111  
 108  112          /* LEDs */
 109      -        mac->ops.led_on = &ixgbe_led_on_generic;
 110      -        mac->ops.led_off = &ixgbe_led_off_generic;
 111      -        mac->ops.blink_led_start = &ixgbe_blink_led_start_generic;
 112      -        mac->ops.blink_led_stop = &ixgbe_blink_led_stop_generic;
      113 +        mac->ops.led_on = ixgbe_led_on_generic;
      114 +        mac->ops.led_off = ixgbe_led_off_generic;
      115 +        mac->ops.blink_led_start = ixgbe_blink_led_start_generic;
      116 +        mac->ops.blink_led_stop = ixgbe_blink_led_stop_generic;
 113  117  
 114  118          /* RAR, Multicast, VLAN */
 115      -        mac->ops.set_rar = &ixgbe_set_rar_generic;
 116      -        mac->ops.clear_rar = &ixgbe_clear_rar_generic;
      119 +        mac->ops.set_rar = ixgbe_set_rar_generic;
      120 +        mac->ops.clear_rar = ixgbe_clear_rar_generic;
 117  121          mac->ops.insert_mac_addr = NULL;
 118  122          mac->ops.set_vmdq = NULL;
 119  123          mac->ops.clear_vmdq = NULL;
 120      -        mac->ops.init_rx_addrs = &ixgbe_init_rx_addrs_generic;
 121      -        mac->ops.update_uc_addr_list = &ixgbe_update_uc_addr_list_generic;
 122      -        mac->ops.update_mc_addr_list = &ixgbe_update_mc_addr_list_generic;
 123      -        mac->ops.enable_mc = &ixgbe_enable_mc_generic;
 124      -        mac->ops.disable_mc = &ixgbe_disable_mc_generic;
      124 +        mac->ops.init_rx_addrs = ixgbe_init_rx_addrs_generic;
      125 +        mac->ops.update_uc_addr_list = ixgbe_update_uc_addr_list_generic;
      126 +        mac->ops.update_mc_addr_list = ixgbe_update_mc_addr_list_generic;
      127 +        mac->ops.enable_mc = ixgbe_enable_mc_generic;
      128 +        mac->ops.disable_mc = ixgbe_disable_mc_generic;
 125  129          mac->ops.clear_vfta = NULL;
 126  130          mac->ops.set_vfta = NULL;
 127  131          mac->ops.set_vlvf = NULL;
 128  132          mac->ops.init_uta_tables = NULL;
      133 +        mac->ops.enable_rx = ixgbe_enable_rx_generic;
      134 +        mac->ops.disable_rx = ixgbe_disable_rx_generic;
 129  135  
 130  136          /* Flow Control */
 131      -        mac->ops.fc_enable = &ixgbe_fc_enable_generic;
      137 +        mac->ops.fc_enable = ixgbe_fc_enable_generic;
      138 +        mac->ops.setup_fc = ixgbe_setup_fc_generic;
 132  139  
 133  140          /* Link */
 134  141          mac->ops.get_link_capabilities = NULL;
 135  142          mac->ops.setup_link = NULL;
 136  143          mac->ops.check_link = NULL;
      144 +        mac->ops.dmac_config = NULL;
      145 +        mac->ops.dmac_update_tcs = NULL;
      146 +        mac->ops.dmac_config_tcs = NULL;
 137  147  
 138  148          return IXGBE_SUCCESS;
 139  149  }
 140  150  
 141  151  /**
 142      - *  ixgbe_device_supports_autoneg_fc - Check if phy supports autoneg flow
 143      - *  control
 144      - *  @hw: pointer to hardware structure
      152 + * ixgbe_device_supports_autoneg_fc - Check if device supports autonegotiation
      153 + * of flow control
      154 + * @hw: pointer to hardware structure
 145  155   *
 146      - *  There are several phys that do not support autoneg flow control. This
 147      - *  function check the device id to see if the associated phy supports
 148      - *  autoneg flow control.
      156 + * This function returns TRUE if the device supports flow control
      157 + * autonegotiation, and FALSE if it does not.
      158 + *
 149  159   **/
 150      -static s32 ixgbe_device_supports_autoneg_fc(struct ixgbe_hw *hw)
      160 +bool ixgbe_device_supports_autoneg_fc(struct ixgbe_hw *hw)
 151  161  {
      162 +        bool supported = FALSE;
      163 +        ixgbe_link_speed speed;
      164 +        bool link_up;
 152  165  
 153  166          DEBUGFUNC("ixgbe_device_supports_autoneg_fc");
 154  167  
 155      -        switch (hw->device_id) {
 156      -        case IXGBE_DEV_ID_X540T:
 157      -        case IXGBE_DEV_ID_X540T1:
 158      -                return IXGBE_SUCCESS;
 159      -        case IXGBE_DEV_ID_82599_T3_LOM:
 160      -                return IXGBE_SUCCESS;
      168 +        switch (hw->phy.media_type) {
      169 +        case ixgbe_media_type_fiber_fixed:
      170 +        case ixgbe_media_type_fiber_qsfp:
      171 +        case ixgbe_media_type_fiber:
      172 +                hw->mac.ops.check_link(hw, &speed, &link_up, FALSE);
      173 +                /* if link is down, assume supported */
      174 +                if (link_up)
      175 +                        supported = speed == IXGBE_LINK_SPEED_1GB_FULL ?
      176 +                                TRUE : FALSE;
      177 +                else
      178 +                        supported = TRUE;
      179 +                break;
      180 +        case ixgbe_media_type_backplane:
      181 +                supported = TRUE;
      182 +                break;
      183 +        case ixgbe_media_type_copper:
      184 +                /* only some copper devices support flow control autoneg */
      185 +                switch (hw->device_id) {
      186 +                case IXGBE_DEV_ID_82599_T3_LOM:
      187 +                case IXGBE_DEV_ID_X540T:
      188 +                case IXGBE_DEV_ID_X540T1:
      189 +                case IXGBE_DEV_ID_X540_BYPASS:
      190 +                case IXGBE_DEV_ID_X550T:
      191 +                case IXGBE_DEV_ID_X550T1:
      192 +                case IXGBE_DEV_ID_X550EM_X_10G_T:
      193 +                        supported = TRUE;
      194 +                        break;
      195 +                default:
      196 +                        supported = FALSE;
      197 +                }
 161  198          default:
 162      -                return IXGBE_ERR_FC_NOT_SUPPORTED;
      199 +                break;
 163  200          }
      201 +
      202 +        ERROR_REPORT2(IXGBE_ERROR_UNSUPPORTED,
      203 +                      "Device %x does not support flow control autoneg",
      204 +                      hw->device_id);
      205 +        return supported;
 164  206  }
 165  207  
 166  208  /**
 167      - *  ixgbe_setup_fc - Set up flow control
      209 + *  ixgbe_setup_fc_generic - Set up flow control
 168  210   *  @hw: pointer to hardware structure
 169  211   *
 170  212   *  Called at init time to set up flow control.
 171  213   **/
 172      -static s32 ixgbe_setup_fc(struct ixgbe_hw *hw)
      214 +s32 ixgbe_setup_fc_generic(struct ixgbe_hw *hw)
 173  215  {
 174  216          s32 ret_val = IXGBE_SUCCESS;
 175  217          u32 reg = 0, reg_bp = 0;
 176  218          u16 reg_cu = 0;
      219 +        bool locked = FALSE;
 177  220  
 178      -        DEBUGFUNC("ixgbe_setup_fc");
      221 +        DEBUGFUNC("ixgbe_setup_fc_generic");
 179  222  
 180      -        /*
 181      -         * Validate the requested mode.  Strict IEEE mode does not allow
 182      -         * ixgbe_fc_rx_pause because it will cause us to fail at UNH.
 183      -         */
      223 +        /* Validate the requested mode */
 184  224          if (hw->fc.strict_ieee && hw->fc.requested_mode == ixgbe_fc_rx_pause) {
 185      -                DEBUGOUT("ixgbe_fc_rx_pause not valid in strict IEEE mode\n");
      225 +                ERROR_REPORT1(IXGBE_ERROR_UNSUPPORTED,
      226 +                           "ixgbe_fc_rx_pause not valid in strict IEEE mode\n");
 186  227                  ret_val = IXGBE_ERR_INVALID_LINK_SETTINGS;
 187  228                  goto out;
 188  229          }
 189  230  
 190  231          /*
 191  232           * 10gig parts do not have a word in the EEPROM to determine the
 192  233           * default flow control setting, so we explicitly set it to full.
 193  234           */
 194  235          if (hw->fc.requested_mode == ixgbe_fc_default)
 195  236                  hw->fc.requested_mode = ixgbe_fc_full;
 196  237  
 197  238          /*
 198  239           * Set up the 1G and 10G flow control advertisement registers so the
 199  240           * HW will be able to do fc autoneg once the cable is plugged in.  If
 200  241           * we link at 10G, the 1G advertisement is harmless and vice versa.
 201  242           */
 202  243          switch (hw->phy.media_type) {
 203      -        case ixgbe_media_type_fiber:
 204  244          case ixgbe_media_type_backplane:
      245 +                /* some MAC's need RMW protection on AUTOC */
      246 +                ret_val = hw->mac.ops.prot_autoc_read(hw, &locked, &reg_bp);
      247 +                if (ret_val != IXGBE_SUCCESS)
      248 +                        goto out;
      249 +
      250 +                /* only backplane uses autoc so fall though */
      251 +        case ixgbe_media_type_fiber_fixed:
      252 +        case ixgbe_media_type_fiber_qsfp:
      253 +        case ixgbe_media_type_fiber:
 205  254                  reg = IXGBE_READ_REG(hw, IXGBE_PCS1GANA);
 206      -                reg_bp = IXGBE_READ_REG(hw, IXGBE_AUTOC);
      255 +
 207  256                  break;
 208  257          case ixgbe_media_type_copper:
 209  258                  hw->phy.ops.read_reg(hw, IXGBE_MDIO_AUTO_NEG_ADVT,
 210  259                                       IXGBE_MDIO_AUTO_NEG_DEV_TYPE, &reg_cu);
 211  260                  break;
 212  261          default:
 213  262                  break;
 214  263          }
 215  264  
 216  265          /*
↓ open down ↓ 44 lines elided ↑ open up ↑
 261  310          case ixgbe_fc_full:
 262  311                  /* Flow control (both Rx and Tx) is enabled by SW override. */
 263  312                  reg |= IXGBE_PCS1GANA_SYM_PAUSE | IXGBE_PCS1GANA_ASM_PAUSE;
 264  313                  if (hw->phy.media_type == ixgbe_media_type_backplane)
 265  314                          reg_bp |= IXGBE_AUTOC_SYM_PAUSE |
 266  315                                    IXGBE_AUTOC_ASM_PAUSE;
 267  316                  else if (hw->phy.media_type == ixgbe_media_type_copper)
 268  317                          reg_cu |= IXGBE_TAF_SYM_PAUSE | IXGBE_TAF_ASM_PAUSE;
 269  318                  break;
 270  319          default:
 271      -                DEBUGOUT("Flow control param set incorrectly\n");
      320 +                ERROR_REPORT1(IXGBE_ERROR_ARGUMENT,
      321 +                             "Flow control param set incorrectly\n");
 272  322                  ret_val = IXGBE_ERR_CONFIG;
 273  323                  goto out;
      324 +                break;
 274  325          }
 275  326  
 276      -        if (hw->mac.type != ixgbe_mac_X540) {
      327 +        if (hw->mac.type < ixgbe_mac_X540) {
 277  328                  /*
 278  329                   * Enable auto-negotiation between the MAC & PHY;
 279  330                   * the MAC will advertise clause 37 flow control.
 280  331                   */
 281  332                  IXGBE_WRITE_REG(hw, IXGBE_PCS1GANA, reg);
 282  333                  reg = IXGBE_READ_REG(hw, IXGBE_PCS1GLCTL);
 283  334  
 284  335                  /* Disable AN timeout */
 285  336                  if (hw->fc.strict_ieee)
 286  337                          reg &= ~IXGBE_PCS1GLCTL_AN_1G_TIMEOUT_EN;
↓ open down ↓ 2 lines elided ↑ open up ↑
 289  340                  DEBUGOUT1("Set up FC; PCS1GLCTL = 0x%08X\n", reg);
 290  341          }
 291  342  
 292  343          /*
 293  344           * AUTOC restart handles negotiation of 1G and 10G on backplane
 294  345           * and copper. There is no need to set the PCS1GCTL register.
 295  346           *
 296  347           */
 297  348          if (hw->phy.media_type == ixgbe_media_type_backplane) {
 298  349                  reg_bp |= IXGBE_AUTOC_AN_RESTART;
 299      -                IXGBE_WRITE_REG(hw, IXGBE_AUTOC, reg_bp);
      350 +                ret_val = hw->mac.ops.prot_autoc_write(hw, reg_bp, locked);
      351 +                if (ret_val)
      352 +                        goto out;
 300  353          } else if ((hw->phy.media_type == ixgbe_media_type_copper) &&
 301      -                    (ixgbe_device_supports_autoneg_fc(hw) == IXGBE_SUCCESS)) {
      354 +                    (ixgbe_device_supports_autoneg_fc(hw))) {
 302  355                  hw->phy.ops.write_reg(hw, IXGBE_MDIO_AUTO_NEG_ADVT,
 303  356                                        IXGBE_MDIO_AUTO_NEG_DEV_TYPE, reg_cu);
 304  357          }
 305  358  
 306      -        DEBUGOUT1("Set up FC; IXGBE_AUTOC = 0x%08X\n", reg);
      359 +        DEBUGOUT1("Set up FC; PCS1GLCTL = 0x%08X\n", reg);
 307  360  out:
 308  361          return ret_val;
 309  362  }
 310  363  
 311  364  /**
 312  365   *  ixgbe_start_hw_generic - Prepare hardware for Tx/Rx
 313  366   *  @hw: pointer to hardware structure
 314  367   *
 315  368   *  Starts the hardware by filling the bus info structure and media type, clears
 316  369   *  all on chip counters, initializes receive address registers, multicast
↓ open down ↓ 108 lines elided ↑ open up ↑
 425  478   *
 426  479   *  Clears all hardware statistics counters by reading them from the hardware
 427  480   *  Statistics counters are clear on read.
 428  481   **/
 429  482  s32 ixgbe_clear_hw_cntrs_generic(struct ixgbe_hw *hw)
 430  483  {
 431  484          u16 i = 0;
 432  485  
 433  486          DEBUGFUNC("ixgbe_clear_hw_cntrs_generic");
 434  487  
 435      -        (void) IXGBE_READ_REG(hw, IXGBE_CRCERRS);
 436      -        (void) IXGBE_READ_REG(hw, IXGBE_ILLERRC);
 437      -        (void) IXGBE_READ_REG(hw, IXGBE_ERRBC);
 438      -        (void) IXGBE_READ_REG(hw, IXGBE_MSPDC);
      488 +        IXGBE_READ_REG(hw, IXGBE_CRCERRS);
      489 +        IXGBE_READ_REG(hw, IXGBE_ILLERRC);
      490 +        IXGBE_READ_REG(hw, IXGBE_ERRBC);
      491 +        IXGBE_READ_REG(hw, IXGBE_MSPDC);
 439  492          for (i = 0; i < 8; i++)
 440      -                (void) IXGBE_READ_REG(hw, IXGBE_MPC(i));
      493 +                IXGBE_READ_REG(hw, IXGBE_MPC(i));
 441  494  
 442      -        (void) IXGBE_READ_REG(hw, IXGBE_MLFC);
 443      -        (void) IXGBE_READ_REG(hw, IXGBE_MRFC);
 444      -        (void) IXGBE_READ_REG(hw, IXGBE_RLEC);
 445      -        (void) IXGBE_READ_REG(hw, IXGBE_LXONTXC);
 446      -        (void) IXGBE_READ_REG(hw, IXGBE_LXOFFTXC);
      495 +        IXGBE_READ_REG(hw, IXGBE_MLFC);
      496 +        IXGBE_READ_REG(hw, IXGBE_MRFC);
      497 +        IXGBE_READ_REG(hw, IXGBE_RLEC);
      498 +        IXGBE_READ_REG(hw, IXGBE_LXONTXC);
      499 +        IXGBE_READ_REG(hw, IXGBE_LXOFFTXC);
 447  500          if (hw->mac.type >= ixgbe_mac_82599EB) {
 448      -                (void) IXGBE_READ_REG(hw, IXGBE_LXONRXCNT);
 449      -                (void) IXGBE_READ_REG(hw, IXGBE_LXOFFRXCNT);
      501 +                IXGBE_READ_REG(hw, IXGBE_LXONRXCNT);
      502 +                IXGBE_READ_REG(hw, IXGBE_LXOFFRXCNT);
 450  503          } else {
 451      -                (void) IXGBE_READ_REG(hw, IXGBE_LXONRXC);
 452      -                (void) IXGBE_READ_REG(hw, IXGBE_LXOFFRXC);
      504 +                IXGBE_READ_REG(hw, IXGBE_LXONRXC);
      505 +                IXGBE_READ_REG(hw, IXGBE_LXOFFRXC);
 453  506          }
 454  507  
 455  508          for (i = 0; i < 8; i++) {
 456      -                (void) IXGBE_READ_REG(hw, IXGBE_PXONTXC(i));
 457      -                (void) IXGBE_READ_REG(hw, IXGBE_PXOFFTXC(i));
      509 +                IXGBE_READ_REG(hw, IXGBE_PXONTXC(i));
      510 +                IXGBE_READ_REG(hw, IXGBE_PXOFFTXC(i));
 458  511                  if (hw->mac.type >= ixgbe_mac_82599EB) {
 459      -                        (void) IXGBE_READ_REG(hw, IXGBE_PXONRXCNT(i));
 460      -                        (void) IXGBE_READ_REG(hw, IXGBE_PXOFFRXCNT(i));
      512 +                        IXGBE_READ_REG(hw, IXGBE_PXONRXCNT(i));
      513 +                        IXGBE_READ_REG(hw, IXGBE_PXOFFRXCNT(i));
 461  514                  } else {
 462      -                        (void) IXGBE_READ_REG(hw, IXGBE_PXONRXC(i));
 463      -                        (void) IXGBE_READ_REG(hw, IXGBE_PXOFFRXC(i));
      515 +                        IXGBE_READ_REG(hw, IXGBE_PXONRXC(i));
      516 +                        IXGBE_READ_REG(hw, IXGBE_PXOFFRXC(i));
 464  517                  }
 465  518          }
 466  519          if (hw->mac.type >= ixgbe_mac_82599EB)
 467  520                  for (i = 0; i < 8; i++)
 468      -                        (void) IXGBE_READ_REG(hw, IXGBE_PXON2OFFCNT(i));
 469      -        (void) IXGBE_READ_REG(hw, IXGBE_PRC64);
 470      -        (void) IXGBE_READ_REG(hw, IXGBE_PRC127);
 471      -        (void) IXGBE_READ_REG(hw, IXGBE_PRC255);
 472      -        (void) IXGBE_READ_REG(hw, IXGBE_PRC511);
 473      -        (void) IXGBE_READ_REG(hw, IXGBE_PRC1023);
 474      -        (void) IXGBE_READ_REG(hw, IXGBE_PRC1522);
 475      -        (void) IXGBE_READ_REG(hw, IXGBE_GPRC);
 476      -        (void) IXGBE_READ_REG(hw, IXGBE_BPRC);
 477      -        (void) IXGBE_READ_REG(hw, IXGBE_MPRC);
 478      -        (void) IXGBE_READ_REG(hw, IXGBE_GPTC);
 479      -        (void) IXGBE_READ_REG(hw, IXGBE_GORCL);
 480      -        (void) IXGBE_READ_REG(hw, IXGBE_GORCH);
 481      -        (void) IXGBE_READ_REG(hw, IXGBE_GOTCL);
 482      -        (void) IXGBE_READ_REG(hw, IXGBE_GOTCH);
      521 +                        IXGBE_READ_REG(hw, IXGBE_PXON2OFFCNT(i));
      522 +        IXGBE_READ_REG(hw, IXGBE_PRC64);
      523 +        IXGBE_READ_REG(hw, IXGBE_PRC127);
      524 +        IXGBE_READ_REG(hw, IXGBE_PRC255);
      525 +        IXGBE_READ_REG(hw, IXGBE_PRC511);
      526 +        IXGBE_READ_REG(hw, IXGBE_PRC1023);
      527 +        IXGBE_READ_REG(hw, IXGBE_PRC1522);
      528 +        IXGBE_READ_REG(hw, IXGBE_GPRC);
      529 +        IXGBE_READ_REG(hw, IXGBE_BPRC);
      530 +        IXGBE_READ_REG(hw, IXGBE_MPRC);
      531 +        IXGBE_READ_REG(hw, IXGBE_GPTC);
      532 +        IXGBE_READ_REG(hw, IXGBE_GORCL);
      533 +        IXGBE_READ_REG(hw, IXGBE_GORCH);
      534 +        IXGBE_READ_REG(hw, IXGBE_GOTCL);
      535 +        IXGBE_READ_REG(hw, IXGBE_GOTCH);
 483  536          if (hw->mac.type == ixgbe_mac_82598EB)
 484  537                  for (i = 0; i < 8; i++)
 485      -                        (void) IXGBE_READ_REG(hw, IXGBE_RNBC(i));
 486      -        (void) IXGBE_READ_REG(hw, IXGBE_RUC);
 487      -        (void) IXGBE_READ_REG(hw, IXGBE_RFC);
 488      -        (void) IXGBE_READ_REG(hw, IXGBE_ROC);
 489      -        (void) IXGBE_READ_REG(hw, IXGBE_RJC);
 490      -        (void) IXGBE_READ_REG(hw, IXGBE_MNGPRC);
 491      -        (void) IXGBE_READ_REG(hw, IXGBE_MNGPDC);
 492      -        (void) IXGBE_READ_REG(hw, IXGBE_MNGPTC);
 493      -        (void) IXGBE_READ_REG(hw, IXGBE_TORL);
 494      -        (void) IXGBE_READ_REG(hw, IXGBE_TORH);
 495      -        (void) IXGBE_READ_REG(hw, IXGBE_TPR);
 496      -        (void) IXGBE_READ_REG(hw, IXGBE_TPT);
 497      -        (void) IXGBE_READ_REG(hw, IXGBE_PTC64);
 498      -        (void) IXGBE_READ_REG(hw, IXGBE_PTC127);
 499      -        (void) IXGBE_READ_REG(hw, IXGBE_PTC255);
 500      -        (void) IXGBE_READ_REG(hw, IXGBE_PTC511);
 501      -        (void) IXGBE_READ_REG(hw, IXGBE_PTC1023);
 502      -        (void) IXGBE_READ_REG(hw, IXGBE_PTC1522);
 503      -        (void) IXGBE_READ_REG(hw, IXGBE_MPTC);
 504      -        (void) IXGBE_READ_REG(hw, IXGBE_BPTC);
      538 +                        IXGBE_READ_REG(hw, IXGBE_RNBC(i));
      539 +        IXGBE_READ_REG(hw, IXGBE_RUC);
      540 +        IXGBE_READ_REG(hw, IXGBE_RFC);
      541 +        IXGBE_READ_REG(hw, IXGBE_ROC);
      542 +        IXGBE_READ_REG(hw, IXGBE_RJC);
      543 +        IXGBE_READ_REG(hw, IXGBE_MNGPRC);
      544 +        IXGBE_READ_REG(hw, IXGBE_MNGPDC);
      545 +        IXGBE_READ_REG(hw, IXGBE_MNGPTC);
      546 +        IXGBE_READ_REG(hw, IXGBE_TORL);
      547 +        IXGBE_READ_REG(hw, IXGBE_TORH);
      548 +        IXGBE_READ_REG(hw, IXGBE_TPR);
      549 +        IXGBE_READ_REG(hw, IXGBE_TPT);
      550 +        IXGBE_READ_REG(hw, IXGBE_PTC64);
      551 +        IXGBE_READ_REG(hw, IXGBE_PTC127);
      552 +        IXGBE_READ_REG(hw, IXGBE_PTC255);
      553 +        IXGBE_READ_REG(hw, IXGBE_PTC511);
      554 +        IXGBE_READ_REG(hw, IXGBE_PTC1023);
      555 +        IXGBE_READ_REG(hw, IXGBE_PTC1522);
      556 +        IXGBE_READ_REG(hw, IXGBE_MPTC);
      557 +        IXGBE_READ_REG(hw, IXGBE_BPTC);
 505  558          for (i = 0; i < 16; i++) {
 506      -                (void) IXGBE_READ_REG(hw, IXGBE_QPRC(i));
 507      -                (void) IXGBE_READ_REG(hw, IXGBE_QPTC(i));
      559 +                IXGBE_READ_REG(hw, IXGBE_QPRC(i));
      560 +                IXGBE_READ_REG(hw, IXGBE_QPTC(i));
 508  561                  if (hw->mac.type >= ixgbe_mac_82599EB) {
 509      -                        (void) IXGBE_READ_REG(hw, IXGBE_QBRC_L(i));
 510      -                        (void) IXGBE_READ_REG(hw, IXGBE_QBRC_H(i));
 511      -                        (void) IXGBE_READ_REG(hw, IXGBE_QBTC_L(i));
 512      -                        (void) IXGBE_READ_REG(hw, IXGBE_QBTC_H(i));
 513      -                        (void) IXGBE_READ_REG(hw, IXGBE_QPRDC(i));
      562 +                        IXGBE_READ_REG(hw, IXGBE_QBRC_L(i));
      563 +                        IXGBE_READ_REG(hw, IXGBE_QBRC_H(i));
      564 +                        IXGBE_READ_REG(hw, IXGBE_QBTC_L(i));
      565 +                        IXGBE_READ_REG(hw, IXGBE_QBTC_H(i));
      566 +                        IXGBE_READ_REG(hw, IXGBE_QPRDC(i));
 514  567                  } else {
 515      -                        (void) IXGBE_READ_REG(hw, IXGBE_QBRC(i));
 516      -                        (void) IXGBE_READ_REG(hw, IXGBE_QBTC(i));
      568 +                        IXGBE_READ_REG(hw, IXGBE_QBRC(i));
      569 +                        IXGBE_READ_REG(hw, IXGBE_QBTC(i));
 517  570                  }
 518  571          }
 519  572  
 520      -        if (hw->mac.type == ixgbe_mac_X540) {
      573 +        if (hw->mac.type == ixgbe_mac_X550 || hw->mac.type == ixgbe_mac_X540) {
 521  574                  if (hw->phy.id == 0)
 522      -                        (void) ixgbe_identify_phy(hw);
      575 +                        ixgbe_identify_phy(hw);
 523  576                  hw->phy.ops.read_reg(hw, IXGBE_PCRC8ECL,
 524  577                                       IXGBE_MDIO_PCS_DEV_TYPE, &i);
 525  578                  hw->phy.ops.read_reg(hw, IXGBE_PCRC8ECH,
 526  579                                       IXGBE_MDIO_PCS_DEV_TYPE, &i);
 527  580                  hw->phy.ops.read_reg(hw, IXGBE_LDPCECL,
 528  581                                       IXGBE_MDIO_PCS_DEV_TYPE, &i);
 529  582                  hw->phy.ops.read_reg(hw, IXGBE_LDPCECH,
 530  583                                       IXGBE_MDIO_PCS_DEV_TYPE, &i);
 531  584          }
 532  585  
↓ open down ↓ 139 lines elided ↑ open up ↑
 672  725          if (ret_val) {
 673  726                  DEBUGOUT("NVM Read Error\n");
 674  727                  return ret_val;
 675  728          }
 676  729          *pba_num |= data;
 677  730  
 678  731          return IXGBE_SUCCESS;
 679  732  }
 680  733  
 681  734  /**
      735 + *  ixgbe_read_pba_raw
      736 + *  @hw: pointer to the HW structure
      737 + *  @eeprom_buf: optional pointer to EEPROM image
      738 + *  @eeprom_buf_size: size of EEPROM image in words
      739 + *  @max_pba_block_size: PBA block size limit
      740 + *  @pba: pointer to output PBA structure
      741 + *
      742 + *  Reads PBA from EEPROM image when eeprom_buf is not NULL.
      743 + *  Reads PBA from physical EEPROM device when eeprom_buf is NULL.
      744 + *
      745 + **/
      746 +s32 ixgbe_read_pba_raw(struct ixgbe_hw *hw, u16 *eeprom_buf,
      747 +                       u32 eeprom_buf_size, u16 max_pba_block_size,
      748 +                       struct ixgbe_pba *pba)
      749 +{
      750 +        s32 ret_val;
      751 +        u16 pba_block_size;
      752 +
      753 +        if (pba == NULL)
      754 +                return IXGBE_ERR_PARAM;
      755 +
      756 +        if (eeprom_buf == NULL) {
      757 +                ret_val = hw->eeprom.ops.read_buffer(hw, IXGBE_PBANUM0_PTR, 2,
      758 +                                                     &pba->word[0]);
      759 +                if (ret_val)
      760 +                        return ret_val;
      761 +        } else {
      762 +                if (eeprom_buf_size > IXGBE_PBANUM1_PTR) {
      763 +                        pba->word[0] = eeprom_buf[IXGBE_PBANUM0_PTR];
      764 +                        pba->word[1] = eeprom_buf[IXGBE_PBANUM1_PTR];
      765 +                } else {
      766 +                        return IXGBE_ERR_PARAM;
      767 +                }
      768 +        }
      769 +
      770 +        if (pba->word[0] == IXGBE_PBANUM_PTR_GUARD) {
      771 +                if (pba->pba_block == NULL)
      772 +                        return IXGBE_ERR_PARAM;
      773 +
      774 +                ret_val = ixgbe_get_pba_block_size(hw, eeprom_buf,
      775 +                                                   eeprom_buf_size,
      776 +                                                   &pba_block_size);
      777 +                if (ret_val)
      778 +                        return ret_val;
      779 +
      780 +                if (pba_block_size > max_pba_block_size)
      781 +                        return IXGBE_ERR_PARAM;
      782 +
      783 +                if (eeprom_buf == NULL) {
      784 +                        ret_val = hw->eeprom.ops.read_buffer(hw, pba->word[1],
      785 +                                                             pba_block_size,
      786 +                                                             pba->pba_block);
      787 +                        if (ret_val)
      788 +                                return ret_val;
      789 +                } else {
      790 +                        if (eeprom_buf_size > (u32)(pba->word[1] +
      791 +                                              pba_block_size)) {
      792 +                                memcpy(pba->pba_block,
      793 +                                       &eeprom_buf[pba->word[1]],
      794 +                                       pba_block_size * sizeof(u16));
      795 +                        } else {
      796 +                                return IXGBE_ERR_PARAM;
      797 +                        }
      798 +                }
      799 +        }
      800 +
      801 +        return IXGBE_SUCCESS;
      802 +}
      803 +
      804 +/**
      805 + *  ixgbe_write_pba_raw
      806 + *  @hw: pointer to the HW structure
      807 + *  @eeprom_buf: optional pointer to EEPROM image
      808 + *  @eeprom_buf_size: size of EEPROM image in words
      809 + *  @pba: pointer to PBA structure
      810 + *
      811 + *  Writes PBA to EEPROM image when eeprom_buf is not NULL.
      812 + *  Writes PBA to physical EEPROM device when eeprom_buf is NULL.
      813 + *
      814 + **/
      815 +s32 ixgbe_write_pba_raw(struct ixgbe_hw *hw, u16 *eeprom_buf,
      816 +                        u32 eeprom_buf_size, struct ixgbe_pba *pba)
      817 +{
      818 +        s32 ret_val;
      819 +
      820 +        if (pba == NULL)
      821 +                return IXGBE_ERR_PARAM;
      822 +
      823 +        if (eeprom_buf == NULL) {
      824 +                ret_val = hw->eeprom.ops.write_buffer(hw, IXGBE_PBANUM0_PTR, 2,
      825 +                                                      &pba->word[0]);
      826 +                if (ret_val)
      827 +                        return ret_val;
      828 +        } else {
      829 +                if (eeprom_buf_size > IXGBE_PBANUM1_PTR) {
      830 +                        eeprom_buf[IXGBE_PBANUM0_PTR] = pba->word[0];
      831 +                        eeprom_buf[IXGBE_PBANUM1_PTR] = pba->word[1];
      832 +                } else {
      833 +                        return IXGBE_ERR_PARAM;
      834 +                }
      835 +        }
      836 +
      837 +        if (pba->word[0] == IXGBE_PBANUM_PTR_GUARD) {
      838 +                if (pba->pba_block == NULL)
      839 +                        return IXGBE_ERR_PARAM;
      840 +
      841 +                if (eeprom_buf == NULL) {
      842 +                        ret_val = hw->eeprom.ops.write_buffer(hw, pba->word[1],
      843 +                                                              pba->pba_block[0],
      844 +                                                              pba->pba_block);
      845 +                        if (ret_val)
      846 +                                return ret_val;
      847 +                } else {
      848 +                        if (eeprom_buf_size > (u32)(pba->word[1] +
      849 +                                              pba->pba_block[0])) {
      850 +                                memcpy(&eeprom_buf[pba->word[1]],
      851 +                                       pba->pba_block,
      852 +                                       pba->pba_block[0] * sizeof(u16));
      853 +                        } else {
      854 +                                return IXGBE_ERR_PARAM;
      855 +                        }
      856 +                }
      857 +        }
      858 +
      859 +        return IXGBE_SUCCESS;
      860 +}
      861 +
      862 +/**
      863 + *  ixgbe_get_pba_block_size
      864 + *  @hw: pointer to the HW structure
      865 + *  @eeprom_buf: optional pointer to EEPROM image
      866 + *  @eeprom_buf_size: size of EEPROM image in words
      867 + *  @pba_data_size: pointer to output variable
      868 + *
      869 + *  Returns the size of the PBA block in words. Function operates on EEPROM
      870 + *  image if the eeprom_buf pointer is not NULL otherwise it accesses physical
      871 + *  EEPROM device.
      872 + *
      873 + **/
      874 +s32 ixgbe_get_pba_block_size(struct ixgbe_hw *hw, u16 *eeprom_buf,
      875 +                             u32 eeprom_buf_size, u16 *pba_block_size)
      876 +{
      877 +        s32 ret_val;
      878 +        u16 pba_word[2];
      879 +        u16 length;
      880 +
      881 +        DEBUGFUNC("ixgbe_get_pba_block_size");
      882 +
      883 +        if (eeprom_buf == NULL) {
      884 +                ret_val = hw->eeprom.ops.read_buffer(hw, IXGBE_PBANUM0_PTR, 2,
      885 +                                                     &pba_word[0]);
      886 +                if (ret_val)
      887 +                        return ret_val;
      888 +        } else {
      889 +                if (eeprom_buf_size > IXGBE_PBANUM1_PTR) {
      890 +                        pba_word[0] = eeprom_buf[IXGBE_PBANUM0_PTR];
      891 +                        pba_word[1] = eeprom_buf[IXGBE_PBANUM1_PTR];
      892 +                } else {
      893 +                        return IXGBE_ERR_PARAM;
      894 +                }
      895 +        }
      896 +
      897 +        if (pba_word[0] == IXGBE_PBANUM_PTR_GUARD) {
      898 +                if (eeprom_buf == NULL) {
      899 +                        ret_val = hw->eeprom.ops.read(hw, pba_word[1] + 0,
      900 +                                                      &length);
      901 +                        if (ret_val)
      902 +                                return ret_val;
      903 +                } else {
      904 +                        if (eeprom_buf_size > pba_word[1])
      905 +                                length = eeprom_buf[pba_word[1] + 0];
      906 +                        else
      907 +                                return IXGBE_ERR_PARAM;
      908 +                }
      909 +
      910 +                if (length == 0xFFFF || length == 0)
      911 +                        return IXGBE_ERR_PBA_SECTION;
      912 +        } else {
      913 +                /* PBA number in legacy format, there is no PBA Block. */
      914 +                length = 0;
      915 +        }
      916 +
      917 +        if (pba_block_size != NULL)
      918 +                *pba_block_size = length;
      919 +
      920 +        return IXGBE_SUCCESS;
      921 +}
      922 +
      923 +/**
 682  924   *  ixgbe_get_mac_addr_generic - Generic get MAC address
 683  925   *  @hw: pointer to hardware structure
 684  926   *  @mac_addr: Adapter MAC address
 685  927   *
 686  928   *  Reads the adapter's MAC address from first Receive Address Register (RAR0)
 687  929   *  A reset of the adapter must be performed prior to calling this function
 688  930   *  in order for the MAC address to have been loaded from the EEPROM into RAR0
 689  931   **/
 690  932  s32 ixgbe_get_mac_addr_generic(struct ixgbe_hw *hw, u8 *mac_addr)
 691  933  {
↓ open down ↓ 9 lines elided ↑ open up ↑
 701  943          for (i = 0; i < 4; i++)
 702  944                  mac_addr[i] = (u8)(rar_low >> (i*8));
 703  945  
 704  946          for (i = 0; i < 2; i++)
 705  947                  mac_addr[i+4] = (u8)(rar_high >> (i*8));
 706  948  
 707  949          return IXGBE_SUCCESS;
 708  950  }
 709  951  
 710  952  /**
 711      - *  ixgbe_get_bus_info_generic - Generic set PCI bus info
      953 + *  ixgbe_set_pci_config_data_generic - Generic store PCI bus info
 712  954   *  @hw: pointer to hardware structure
      955 + *  @link_status: the link status returned by the PCI config space
 713  956   *
 714      - *  Sets the PCI bus info (speed, width, type) within the ixgbe_hw structure
      957 + *  Stores the PCI bus info (speed, width, type) within the ixgbe_hw structure
 715  958   **/
 716      -s32 ixgbe_get_bus_info_generic(struct ixgbe_hw *hw)
      959 +void ixgbe_set_pci_config_data_generic(struct ixgbe_hw *hw, u16 link_status)
 717  960  {
 718  961          struct ixgbe_mac_info *mac = &hw->mac;
 719      -        u16 link_status;
 720  962  
 721      -        DEBUGFUNC("ixgbe_get_bus_info_generic");
      963 +        if (hw->bus.type == ixgbe_bus_type_unknown)
      964 +                hw->bus.type = ixgbe_bus_type_pci_express;
 722  965  
 723      -        hw->bus.type = ixgbe_bus_type_pci_express;
 724      -
 725      -        /* Get the negotiated link width and speed from PCI config space */
 726      -        link_status = IXGBE_READ_PCIE_WORD(hw, IXGBE_PCI_LINK_STATUS);
 727      -
 728  966          switch (link_status & IXGBE_PCI_LINK_WIDTH) {
 729  967          case IXGBE_PCI_LINK_WIDTH_1:
 730  968                  hw->bus.width = ixgbe_bus_width_pcie_x1;
 731  969                  break;
 732  970          case IXGBE_PCI_LINK_WIDTH_2:
 733  971                  hw->bus.width = ixgbe_bus_width_pcie_x2;
 734  972                  break;
 735  973          case IXGBE_PCI_LINK_WIDTH_4:
 736  974                  hw->bus.width = ixgbe_bus_width_pcie_x4;
 737  975                  break;
↓ open down ↓ 14 lines elided ↑ open up ↑
 752  990                  break;
 753  991          case IXGBE_PCI_LINK_SPEED_8000:
 754  992                  hw->bus.speed = ixgbe_bus_speed_8000;
 755  993                  break;
 756  994          default:
 757  995                  hw->bus.speed = ixgbe_bus_speed_unknown;
 758  996                  break;
 759  997          }
 760  998  
 761  999          mac->ops.set_lan_id(hw);
     1000 +}
 762 1001  
     1002 +/**
     1003 + *  ixgbe_get_bus_info_generic - Generic set PCI bus info
     1004 + *  @hw: pointer to hardware structure
     1005 + *
     1006 + *  Gets the PCI bus info (speed, width, type) then calls helper function to
     1007 + *  store this data within the ixgbe_hw structure.
     1008 + **/
     1009 +s32 ixgbe_get_bus_info_generic(struct ixgbe_hw *hw)
     1010 +{
     1011 +        u16 link_status;
     1012 +
     1013 +        DEBUGFUNC("ixgbe_get_bus_info_generic");
     1014 +
     1015 +        /* Get the negotiated link width and speed from PCI config space */
     1016 +        link_status = IXGBE_READ_PCIE_WORD(hw, IXGBE_PCI_LINK_STATUS);
     1017 +
     1018 +        ixgbe_set_pci_config_data_generic(hw, link_status);
     1019 +
 763 1020          return IXGBE_SUCCESS;
 764 1021  }
 765 1022  
 766 1023  /**
 767 1024   *  ixgbe_set_lan_id_multi_port_pcie - Set LAN id for PCIe multiple port devices
 768 1025   *  @hw: pointer to the HW structure
 769 1026   *
 770 1027   *  Determines the LAN function id by reading memory-mapped registers
 771 1028   *  and swaps the port value if requested.
 772 1029   **/
↓ open down ↓ 2 lines elided ↑ open up ↑
 775 1032          struct ixgbe_bus_info *bus = &hw->bus;
 776 1033          u32 reg;
 777 1034  
 778 1035          DEBUGFUNC("ixgbe_set_lan_id_multi_port_pcie");
 779 1036  
 780 1037          reg = IXGBE_READ_REG(hw, IXGBE_STATUS);
 781 1038          bus->func = (reg & IXGBE_STATUS_LAN_ID) >> IXGBE_STATUS_LAN_ID_SHIFT;
 782 1039          bus->lan_id = bus->func;
 783 1040  
 784 1041          /* check for a port swap */
 785      -        reg = IXGBE_READ_REG(hw, IXGBE_FACTPS);
     1042 +        reg = IXGBE_READ_REG(hw, IXGBE_FACTPS_BY_MAC(hw));
 786 1043          if (reg & IXGBE_FACTPS_LFS)
 787 1044                  bus->func ^= 0x1;
 788 1045  }
 789 1046  
 790 1047  /**
 791 1048   *  ixgbe_stop_adapter_generic - Generic stop Tx/Rx units
 792 1049   *  @hw: pointer to hardware structure
 793 1050   *
 794 1051   *  Sets the adapter_stopped flag within ixgbe_hw struct. Clears interrupts,
 795 1052   *  disables transmit and receive units. The adapter_stopped flag is used by
↓ open down ↓ 7 lines elided ↑ open up ↑
 803 1060  
 804 1061          DEBUGFUNC("ixgbe_stop_adapter_generic");
 805 1062  
 806 1063          /*
 807 1064           * Set the adapter_stopped flag so other driver functions stop touching
 808 1065           * the hardware
 809 1066           */
 810 1067          hw->adapter_stopped = TRUE;
 811 1068  
 812 1069          /* Disable the receive unit */
 813      -        IXGBE_WRITE_REG(hw, IXGBE_RXCTRL, 0);
     1070 +        ixgbe_disable_rx(hw);
 814 1071  
 815 1072          /* Clear interrupt mask to stop interrupts from being generated */
 816 1073          IXGBE_WRITE_REG(hw, IXGBE_EIMC, IXGBE_IRQ_CLEAR_MASK);
 817 1074  
 818 1075          /* Clear any pending interrupts, flush previous writes */
 819      -        (void) IXGBE_READ_REG(hw, IXGBE_EICR);
     1076 +        IXGBE_READ_REG(hw, IXGBE_EICR);
 820 1077  
 821 1078          /* Disable the transmit unit.  Each queue must be disabled. */
 822 1079          for (i = 0; i < hw->mac.max_tx_queues; i++)
 823 1080                  IXGBE_WRITE_REG(hw, IXGBE_TXDCTL(i), IXGBE_TXDCTL_SWFLSH);
 824 1081  
 825 1082          /* Disable the receive unit by stopping each queue */
 826 1083          for (i = 0; i < hw->mac.max_rx_queues; i++) {
 827 1084                  reg_val = IXGBE_READ_REG(hw, IXGBE_RXDCTL(i));
 828 1085                  reg_val &= ~IXGBE_RXDCTL_ENABLE;
 829 1086                  reg_val |= IXGBE_RXDCTL_SWFLSH;
 830 1087                  IXGBE_WRITE_REG(hw, IXGBE_RXDCTL(i), reg_val);
 831 1088          }
 832 1089  
 833 1090          /* flush all queues disables */
 834 1091          IXGBE_WRITE_FLUSH(hw);
 835 1092          msec_delay(2);
 836 1093  
 837 1094          /*
 838      -         * Prevent the PCI-E bus from from hanging by disabling PCI-E master
     1095 +         * Prevent the PCI-E bus from hanging by disabling PCI-E master
 839 1096           * access and verify no pending requests
 840 1097           */
 841 1098          return ixgbe_disable_pcie_master(hw);
 842 1099  }
 843 1100  
 844 1101  /**
 845 1102   *  ixgbe_led_on_generic - Turns on the software controllable LEDs.
 846 1103   *  @hw: pointer to hardware structure
 847 1104   *  @index: led number to turn on
 848 1105   **/
↓ open down ↓ 52 lines elided ↑ open up ↑
 901 1158                  /* Set default semaphore delay to 10ms which is a well
 902 1159                   * tested value */
 903 1160                  eeprom->semaphore_delay = 10;
 904 1161                  /* Clear EEPROM page size, it will be initialized as needed */
 905 1162                  eeprom->word_page_size = 0;
 906 1163  
 907 1164                  /*
 908 1165                   * Check for EEPROM present first.
 909 1166                   * If not present leave as none
 910 1167                   */
 911      -                eec = IXGBE_READ_REG(hw, IXGBE_EEC);
     1168 +                eec = IXGBE_READ_REG(hw, IXGBE_EEC_BY_MAC(hw));
 912 1169                  if (eec & IXGBE_EEC_PRES) {
 913 1170                          eeprom->type = ixgbe_eeprom_spi;
 914 1171  
 915 1172                          /*
 916 1173                           * SPI EEPROM is assumed here.  This code would need to
 917 1174                           * change if a future EEPROM is not SPI.
 918 1175                           */
 919 1176                          eeprom_size = (u16)((eec & IXGBE_EEC_SIZE) >>
 920 1177                                              IXGBE_EEC_SIZE_SHIFT);
 921 1178                          eeprom->word_size = 1 << (eeprom_size +
↓ open down ↓ 40 lines elided ↑ open up ↑
 962 1219                  status = IXGBE_ERR_EEPROM;
 963 1220                  goto out;
 964 1221          }
 965 1222  
 966 1223          /*
 967 1224           * The EEPROM page size cannot be queried from the chip. We do lazy
 968 1225           * initialization. It is worth to do that when we write large buffer.
 969 1226           */
 970 1227          if ((hw->eeprom.word_page_size == 0) &&
 971 1228              (words > IXGBE_EEPROM_PAGE_SIZE_MAX))
 972      -                status = ixgbe_detect_eeprom_page_size_generic(hw, offset);
 973      -        if (status != IXGBE_SUCCESS)
 974      -                goto out;
     1229 +                ixgbe_detect_eeprom_page_size_generic(hw, offset);
 975 1230  
 976 1231          /*
 977 1232           * We cannot hold synchronization semaphores for too long
 978 1233           * to avoid other entity starvation. However it is more efficient
 979 1234           * to read in bursts than synchronizing access for each word.
 980 1235           */
 981 1236          for (i = 0; i < words; i += IXGBE_EEPROM_RD_BUFFER_MAX_COUNT) {
 982 1237                  count = (words - i) / IXGBE_EEPROM_RD_BUFFER_MAX_COUNT > 0 ?
 983 1238                          IXGBE_EEPROM_RD_BUFFER_MAX_COUNT : (words - i);
 984 1239                  status = ixgbe_write_eeprom_buffer_bit_bang(hw, offset + i,
↓ open down ↓ 268 lines elided ↑ open up ↑
1253 1508          u32 eerd;
1254 1509          s32 status = IXGBE_SUCCESS;
1255 1510          u32 i;
1256 1511  
1257 1512          DEBUGFUNC("ixgbe_read_eerd_buffer_generic");
1258 1513  
1259 1514          hw->eeprom.ops.init_params(hw);
1260 1515  
1261 1516          if (words == 0) {
1262 1517                  status = IXGBE_ERR_INVALID_ARGUMENT;
     1518 +                ERROR_REPORT1(IXGBE_ERROR_ARGUMENT, "Invalid EEPROM words");
1263 1519                  goto out;
1264 1520          }
1265 1521  
1266 1522          if (offset >= hw->eeprom.word_size) {
1267 1523                  status = IXGBE_ERR_EEPROM;
     1524 +                ERROR_REPORT1(IXGBE_ERROR_ARGUMENT, "Invalid EEPROM offset");
1268 1525                  goto out;
1269 1526          }
1270 1527  
1271 1528          for (i = 0; i < words; i++) {
1272      -                eerd = ((offset + i) << IXGBE_EEPROM_RW_ADDR_SHIFT) +
     1529 +                eerd = ((offset + i) << IXGBE_EEPROM_RW_ADDR_SHIFT) |
1273 1530                         IXGBE_EEPROM_RW_REG_START;
1274 1531  
1275 1532                  IXGBE_WRITE_REG(hw, IXGBE_EERD, eerd);
1276 1533                  status = ixgbe_poll_eerd_eewr_done(hw, IXGBE_NVM_POLL_READ);
1277 1534  
1278 1535                  if (status == IXGBE_SUCCESS) {
1279 1536                          data[i] = (IXGBE_READ_REG(hw, IXGBE_EERD) >>
1280 1537                                     IXGBE_EEPROM_RW_REG_DATA);
1281 1538                  } else {
1282 1539                          DEBUGOUT("Eeprom read timed out\n");
↓ open down ↓ 76 lines elided ↑ open up ↑
1359 1616          u32 eewr;
1360 1617          s32 status = IXGBE_SUCCESS;
1361 1618          u16 i;
1362 1619  
1363 1620          DEBUGFUNC("ixgbe_write_eewr_generic");
1364 1621  
1365 1622          hw->eeprom.ops.init_params(hw);
1366 1623  
1367 1624          if (words == 0) {
1368 1625                  status = IXGBE_ERR_INVALID_ARGUMENT;
     1626 +                ERROR_REPORT1(IXGBE_ERROR_ARGUMENT, "Invalid EEPROM words");
1369 1627                  goto out;
1370 1628          }
1371 1629  
1372 1630          if (offset >= hw->eeprom.word_size) {
1373 1631                  status = IXGBE_ERR_EEPROM;
     1632 +                ERROR_REPORT1(IXGBE_ERROR_ARGUMENT, "Invalid EEPROM offset");
1374 1633                  goto out;
1375 1634          }
1376 1635  
1377 1636          for (i = 0; i < words; i++) {
1378 1637                  eewr = ((offset + i) << IXGBE_EEPROM_RW_ADDR_SHIFT) |
1379 1638                          (data[i] << IXGBE_EEPROM_RW_REG_DATA) |
1380 1639                          IXGBE_EEPROM_RW_REG_START;
1381 1640  
1382 1641                  status = ixgbe_poll_eerd_eewr_done(hw, IXGBE_NVM_POLL_WRITE);
1383 1642                  if (status != IXGBE_SUCCESS) {
↓ open down ↓ 48 lines elided ↑ open up ↑
1432 1691                          reg = IXGBE_READ_REG(hw, IXGBE_EERD);
1433 1692                  else
1434 1693                          reg = IXGBE_READ_REG(hw, IXGBE_EEWR);
1435 1694  
1436 1695                  if (reg & IXGBE_EEPROM_RW_REG_DONE) {
1437 1696                          status = IXGBE_SUCCESS;
1438 1697                          break;
1439 1698                  }
1440 1699                  usec_delay(5);
1441 1700          }
     1701 +
     1702 +        if (i == IXGBE_EERD_EEWR_ATTEMPTS)
     1703 +                ERROR_REPORT1(IXGBE_ERROR_POLLING,
     1704 +                             "EEPROM read/write done polling timed out");
     1705 +
1442 1706          return status;
1443 1707  }
1444 1708  
1445 1709  /**
1446 1710   *  ixgbe_acquire_eeprom - Acquire EEPROM using bit-bang
1447 1711   *  @hw: pointer to hardware structure
1448 1712   *
1449 1713   *  Prepares EEPROM for access using bit-bang method. This function should
1450 1714   *  be called before issuing a command to the EEPROM.
1451 1715   **/
↓ open down ↓ 3 lines elided ↑ open up ↑
1455 1719          u32 eec;
1456 1720          u32 i;
1457 1721  
1458 1722          DEBUGFUNC("ixgbe_acquire_eeprom");
1459 1723  
1460 1724          if (hw->mac.ops.acquire_swfw_sync(hw, IXGBE_GSSR_EEP_SM)
1461 1725              != IXGBE_SUCCESS)
1462 1726                  status = IXGBE_ERR_SWFW_SYNC;
1463 1727  
1464 1728          if (status == IXGBE_SUCCESS) {
1465      -                eec = IXGBE_READ_REG(hw, IXGBE_EEC);
     1729 +                eec = IXGBE_READ_REG(hw, IXGBE_EEC_BY_MAC(hw));
1466 1730  
1467 1731                  /* Request EEPROM Access */
1468 1732                  eec |= IXGBE_EEC_REQ;
1469      -                IXGBE_WRITE_REG(hw, IXGBE_EEC, eec);
     1733 +                IXGBE_WRITE_REG(hw, IXGBE_EEC_BY_MAC(hw), eec);
1470 1734  
1471 1735                  for (i = 0; i < IXGBE_EEPROM_GRANT_ATTEMPTS; i++) {
1472      -                        eec = IXGBE_READ_REG(hw, IXGBE_EEC);
     1736 +                        eec = IXGBE_READ_REG(hw, IXGBE_EEC_BY_MAC(hw));
1473 1737                          if (eec & IXGBE_EEC_GNT)
1474 1738                                  break;
1475 1739                          usec_delay(5);
1476 1740                  }
1477 1741  
1478 1742                  /* Release if grant not acquired */
1479 1743                  if (!(eec & IXGBE_EEC_GNT)) {
1480 1744                          eec &= ~IXGBE_EEC_REQ;
1481      -                        IXGBE_WRITE_REG(hw, IXGBE_EEC, eec);
     1745 +                        IXGBE_WRITE_REG(hw, IXGBE_EEC_BY_MAC(hw), eec);
1482 1746                          DEBUGOUT("Could not acquire EEPROM grant\n");
1483 1747  
1484 1748                          hw->mac.ops.release_swfw_sync(hw, IXGBE_GSSR_EEP_SM);
1485 1749                          status = IXGBE_ERR_EEPROM;
1486 1750                  }
1487 1751  
1488 1752                  /* Setup EEPROM for Read/Write */
1489 1753                  if (status == IXGBE_SUCCESS) {
1490 1754                          /* Clear CS and SK */
1491 1755                          eec &= ~(IXGBE_EEC_CS | IXGBE_EEC_SK);
1492      -                        IXGBE_WRITE_REG(hw, IXGBE_EEC, eec);
     1756 +                        IXGBE_WRITE_REG(hw, IXGBE_EEC_BY_MAC(hw), eec);
1493 1757                          IXGBE_WRITE_FLUSH(hw);
1494 1758                          usec_delay(1);
1495 1759                  }
1496 1760          }
1497 1761          return status;
1498 1762  }
1499 1763  
1500 1764  /**
1501 1765   *  ixgbe_get_eeprom_semaphore - Get hardware semaphore
1502 1766   *  @hw: pointer to hardware structure
↓ open down ↓ 9 lines elided ↑ open up ↑
1512 1776  
1513 1777          DEBUGFUNC("ixgbe_get_eeprom_semaphore");
1514 1778  
1515 1779  
1516 1780          /* Get SMBI software semaphore between device drivers first */
1517 1781          for (i = 0; i < timeout; i++) {
1518 1782                  /*
1519 1783                   * If the SMBI bit is 0 when we read it, then the bit will be
1520 1784                   * set and we have the semaphore
1521 1785                   */
1522      -                swsm = IXGBE_READ_REG(hw, IXGBE_SWSM);
     1786 +                swsm = IXGBE_READ_REG(hw, IXGBE_SWSM_BY_MAC(hw));
1523 1787                  if (!(swsm & IXGBE_SWSM_SMBI)) {
1524 1788                          status = IXGBE_SUCCESS;
1525 1789                          break;
1526 1790                  }
1527 1791                  usec_delay(50);
1528 1792          }
1529 1793  
1530 1794          if (i == timeout) {
1531 1795                  DEBUGOUT("Driver can't access the Eeprom - SMBI Semaphore "
1532 1796                           "not granted.\n");
↓ open down ↓ 4 lines elided ↑ open up ↑
1537 1801                   * bits to free the driver to make progress
1538 1802                   */
1539 1803                  ixgbe_release_eeprom_semaphore(hw);
1540 1804  
1541 1805                  usec_delay(50);
1542 1806                  /*
1543 1807                   * one last try
1544 1808                   * If the SMBI bit is 0 when we read it, then the bit will be
1545 1809                   * set and we have the semaphore
1546 1810                   */
1547      -                swsm = IXGBE_READ_REG(hw, IXGBE_SWSM);
     1811 +                swsm = IXGBE_READ_REG(hw, IXGBE_SWSM_BY_MAC(hw));
1548 1812                  if (!(swsm & IXGBE_SWSM_SMBI))
1549 1813                          status = IXGBE_SUCCESS;
1550 1814          }
1551 1815  
1552 1816          /* Now get the semaphore between SW/FW through the SWESMBI bit */
1553 1817          if (status == IXGBE_SUCCESS) {
1554 1818                  for (i = 0; i < timeout; i++) {
1555      -                        swsm = IXGBE_READ_REG(hw, IXGBE_SWSM);
     1819 +                        swsm = IXGBE_READ_REG(hw, IXGBE_SWSM_BY_MAC(hw));
1556 1820  
1557 1821                          /* Set the SW EEPROM semaphore bit to request access */
1558 1822                          swsm |= IXGBE_SWSM_SWESMBI;
1559      -                        IXGBE_WRITE_REG(hw, IXGBE_SWSM, swsm);
     1823 +                        IXGBE_WRITE_REG(hw, IXGBE_SWSM_BY_MAC(hw), swsm);
1560 1824  
1561 1825                          /*
1562 1826                           * If we set the bit successfully then we got the
1563 1827                           * semaphore.
1564 1828                           */
1565      -                        swsm = IXGBE_READ_REG(hw, IXGBE_SWSM);
     1829 +                        swsm = IXGBE_READ_REG(hw, IXGBE_SWSM_BY_MAC(hw));
1566 1830                          if (swsm & IXGBE_SWSM_SWESMBI)
1567 1831                                  break;
1568 1832  
1569 1833                          usec_delay(50);
1570 1834                  }
1571 1835  
1572 1836                  /*
1573 1837                   * Release semaphores and return error if SW EEPROM semaphore
1574 1838                   * was not granted because we don't have access to the EEPROM
1575 1839                   */
1576 1840                  if (i >= timeout) {
1577      -                        DEBUGOUT("SWESMBI Software EEPROM semaphore "
1578      -                                 "not granted.\n");
     1841 +                        ERROR_REPORT1(IXGBE_ERROR_POLLING,
     1842 +                            "SWESMBI Software EEPROM semaphore not granted.\n");
1579 1843                          ixgbe_release_eeprom_semaphore(hw);
1580 1844                          status = IXGBE_ERR_EEPROM;
1581 1845                  }
1582 1846          } else {
1583      -                DEBUGOUT("Software semaphore SMBI between device drivers "
1584      -                         "not granted.\n");
     1847 +                ERROR_REPORT1(IXGBE_ERROR_POLLING,
     1848 +                             "Software semaphore SMBI between device drivers "
     1849 +                             "not granted.\n");
1585 1850          }
1586 1851  
1587 1852          return status;
1588 1853  }
1589 1854  
1590 1855  /**
1591 1856   *  ixgbe_release_eeprom_semaphore - Release hardware semaphore
1592 1857   *  @hw: pointer to hardware structure
1593 1858   *
1594 1859   *  This function clears hardware semaphore bits.
↓ open down ↓ 56 lines elided ↑ open up ↑
1651 1916  /**
1652 1917   *  ixgbe_standby_eeprom - Returns EEPROM to a "standby" state
1653 1918   *  @hw: pointer to hardware structure
1654 1919   **/
1655 1920  static void ixgbe_standby_eeprom(struct ixgbe_hw *hw)
1656 1921  {
1657 1922          u32 eec;
1658 1923  
1659 1924          DEBUGFUNC("ixgbe_standby_eeprom");
1660 1925  
1661      -        eec = IXGBE_READ_REG(hw, IXGBE_EEC);
     1926 +        eec = IXGBE_READ_REG(hw, IXGBE_EEC_BY_MAC(hw));
1662 1927  
1663 1928          /* Toggle CS to flush commands */
1664 1929          eec |= IXGBE_EEC_CS;
1665      -        IXGBE_WRITE_REG(hw, IXGBE_EEC, eec);
     1930 +        IXGBE_WRITE_REG(hw, IXGBE_EEC_BY_MAC(hw), eec);
1666 1931          IXGBE_WRITE_FLUSH(hw);
1667 1932          usec_delay(1);
1668 1933          eec &= ~IXGBE_EEC_CS;
1669      -        IXGBE_WRITE_REG(hw, IXGBE_EEC, eec);
     1934 +        IXGBE_WRITE_REG(hw, IXGBE_EEC_BY_MAC(hw), eec);
1670 1935          IXGBE_WRITE_FLUSH(hw);
1671 1936          usec_delay(1);
1672 1937  }
1673 1938  
1674 1939  /**
1675 1940   *  ixgbe_shift_out_eeprom_bits - Shift data bits out to the EEPROM.
1676 1941   *  @hw: pointer to hardware structure
1677 1942   *  @data: data to send to the EEPROM
1678 1943   *  @count: number of bits to shift out
1679 1944   **/
1680 1945  static void ixgbe_shift_out_eeprom_bits(struct ixgbe_hw *hw, u16 data,
1681 1946                                          u16 count)
1682 1947  {
1683 1948          u32 eec;
1684 1949          u32 mask;
1685 1950          u32 i;
1686 1951  
1687 1952          DEBUGFUNC("ixgbe_shift_out_eeprom_bits");
1688 1953  
1689      -        eec = IXGBE_READ_REG(hw, IXGBE_EEC);
     1954 +        eec = IXGBE_READ_REG(hw, IXGBE_EEC_BY_MAC(hw));
1690 1955  
1691 1956          /*
1692 1957           * Mask is used to shift "count" bits of "data" out to the EEPROM
1693 1958           * one bit at a time.  Determine the starting bit based on count
1694 1959           */
1695 1960          mask = 0x01 << (count - 1);
1696 1961  
1697 1962          for (i = 0; i < count; i++) {
1698 1963                  /*
1699 1964                   * A "1" is shifted out to the EEPROM by setting bit "DI" to a
1700 1965                   * "1", and then raising and then lowering the clock (the SK
1701 1966                   * bit controls the clock input to the EEPROM).  A "0" is
1702 1967                   * shifted out to the EEPROM by setting "DI" to "0" and then
1703 1968                   * raising and then lowering the clock.
1704 1969                   */
1705 1970                  if (data & mask)
1706 1971                          eec |= IXGBE_EEC_DI;
1707 1972                  else
1708 1973                          eec &= ~IXGBE_EEC_DI;
1709 1974  
1710      -                IXGBE_WRITE_REG(hw, IXGBE_EEC, eec);
     1975 +                IXGBE_WRITE_REG(hw, IXGBE_EEC_BY_MAC(hw), eec);
1711 1976                  IXGBE_WRITE_FLUSH(hw);
1712 1977  
1713 1978                  usec_delay(1);
1714 1979  
1715 1980                  ixgbe_raise_eeprom_clk(hw, &eec);
1716 1981                  ixgbe_lower_eeprom_clk(hw, &eec);
1717 1982  
1718 1983                  /*
1719 1984                   * Shift mask to signify next bit of data to shift in to the
1720 1985                   * EEPROM
1721 1986                   */
1722 1987                  mask = mask >> 1;
1723 1988          };
1724 1989  
1725 1990          /* We leave the "DI" bit set to "0" when we leave this routine. */
1726 1991          eec &= ~IXGBE_EEC_DI;
1727      -        IXGBE_WRITE_REG(hw, IXGBE_EEC, eec);
     1992 +        IXGBE_WRITE_REG(hw, IXGBE_EEC_BY_MAC(hw), eec);
1728 1993          IXGBE_WRITE_FLUSH(hw);
1729 1994  }
1730 1995  
1731 1996  /**
1732 1997   *  ixgbe_shift_in_eeprom_bits - Shift data bits in from the EEPROM
1733 1998   *  @hw: pointer to hardware structure
1734 1999   **/
1735 2000  static u16 ixgbe_shift_in_eeprom_bits(struct ixgbe_hw *hw, u16 count)
1736 2001  {
1737 2002          u32 eec;
↓ open down ↓ 2 lines elided ↑ open up ↑
1740 2005  
1741 2006          DEBUGFUNC("ixgbe_shift_in_eeprom_bits");
1742 2007  
1743 2008          /*
1744 2009           * In order to read a register from the EEPROM, we need to shift
1745 2010           * 'count' bits in from the EEPROM. Bits are "shifted in" by raising
1746 2011           * the clock input to the EEPROM (setting the SK bit), and then reading
1747 2012           * the value of the "DO" bit.  During this "shifting in" process the
1748 2013           * "DI" bit should always be clear.
1749 2014           */
1750      -        eec = IXGBE_READ_REG(hw, IXGBE_EEC);
     2015 +        eec = IXGBE_READ_REG(hw, IXGBE_EEC_BY_MAC(hw));
1751 2016  
1752 2017          eec &= ~(IXGBE_EEC_DO | IXGBE_EEC_DI);
1753 2018  
1754 2019          for (i = 0; i < count; i++) {
1755 2020                  data = data << 1;
1756 2021                  ixgbe_raise_eeprom_clk(hw, &eec);
1757 2022  
1758      -                eec = IXGBE_READ_REG(hw, IXGBE_EEC);
     2023 +                eec = IXGBE_READ_REG(hw, IXGBE_EEC_BY_MAC(hw));
1759 2024  
1760 2025                  eec &= ~(IXGBE_EEC_DI);
1761 2026                  if (eec & IXGBE_EEC_DO)
1762 2027                          data |= 1;
1763 2028  
1764 2029                  ixgbe_lower_eeprom_clk(hw, &eec);
1765 2030          }
1766 2031  
1767 2032          return data;
1768 2033  }
↓ open down ↓ 5 lines elided ↑ open up ↑
1774 2039   **/
1775 2040  static void ixgbe_raise_eeprom_clk(struct ixgbe_hw *hw, u32 *eec)
1776 2041  {
1777 2042          DEBUGFUNC("ixgbe_raise_eeprom_clk");
1778 2043  
1779 2044          /*
1780 2045           * Raise the clock input to the EEPROM
1781 2046           * (setting the SK bit), then delay
1782 2047           */
1783 2048          *eec = *eec | IXGBE_EEC_SK;
1784      -        IXGBE_WRITE_REG(hw, IXGBE_EEC, *eec);
     2049 +        IXGBE_WRITE_REG(hw, IXGBE_EEC_BY_MAC(hw), *eec);
1785 2050          IXGBE_WRITE_FLUSH(hw);
1786 2051          usec_delay(1);
1787 2052  }
1788 2053  
1789 2054  /**
1790 2055   *  ixgbe_lower_eeprom_clk - Lowers the EEPROM's clock input.
1791 2056   *  @hw: pointer to hardware structure
1792 2057   *  @eecd: EECD's current value
1793 2058   **/
1794 2059  static void ixgbe_lower_eeprom_clk(struct ixgbe_hw *hw, u32 *eec)
1795 2060  {
1796 2061          DEBUGFUNC("ixgbe_lower_eeprom_clk");
1797 2062  
1798 2063          /*
1799 2064           * Lower the clock input to the EEPROM (clearing the SK bit), then
1800 2065           * delay
1801 2066           */
1802 2067          *eec = *eec & ~IXGBE_EEC_SK;
1803      -        IXGBE_WRITE_REG(hw, IXGBE_EEC, *eec);
     2068 +        IXGBE_WRITE_REG(hw, IXGBE_EEC_BY_MAC(hw), *eec);
1804 2069          IXGBE_WRITE_FLUSH(hw);
1805 2070          usec_delay(1);
1806 2071  }
1807 2072  
1808 2073  /**
1809 2074   *  ixgbe_release_eeprom - Release EEPROM, release semaphores
1810 2075   *  @hw: pointer to hardware structure
1811 2076   **/
1812 2077  static void ixgbe_release_eeprom(struct ixgbe_hw *hw)
1813 2078  {
1814 2079          u32 eec;
1815 2080  
1816 2081          DEBUGFUNC("ixgbe_release_eeprom");
1817 2082  
1818      -        eec = IXGBE_READ_REG(hw, IXGBE_EEC);
     2083 +        eec = IXGBE_READ_REG(hw, IXGBE_EEC_BY_MAC(hw));
1819 2084  
1820 2085          eec |= IXGBE_EEC_CS;  /* Pull CS high */
1821 2086          eec &= ~IXGBE_EEC_SK; /* Lower SCK */
1822 2087  
1823      -        IXGBE_WRITE_REG(hw, IXGBE_EEC, eec);
     2088 +        IXGBE_WRITE_REG(hw, IXGBE_EEC_BY_MAC(hw), eec);
1824 2089          IXGBE_WRITE_FLUSH(hw);
1825 2090  
1826 2091          usec_delay(1);
1827 2092  
1828 2093          /* Stop requesting EEPROM access */
1829 2094          eec &= ~IXGBE_EEC_REQ;
1830      -        IXGBE_WRITE_REG(hw, IXGBE_EEC, eec);
     2095 +        IXGBE_WRITE_REG(hw, IXGBE_EEC_BY_MAC(hw), eec);
1831 2096  
1832 2097          hw->mac.ops.release_swfw_sync(hw, IXGBE_GSSR_EEP_SM);
1833 2098  
1834 2099          /* Delay before attempt to obtain semaphore again to allow FW access */
1835 2100          msec_delay(hw->eeprom.semaphore_delay);
1836 2101  }
1837 2102  
1838 2103  /**
1839 2104   *  ixgbe_calc_eeprom_checksum_generic - Calculates and returns the checksum
1840 2105   *  @hw: pointer to hardware structure
     2106 + *
     2107 + *  Returns a negative error code on error, or the 16-bit checksum
1841 2108   **/
1842      -u16 ixgbe_calc_eeprom_checksum_generic(struct ixgbe_hw *hw)
     2109 +s32 ixgbe_calc_eeprom_checksum_generic(struct ixgbe_hw *hw)
1843 2110  {
1844 2111          u16 i;
1845 2112          u16 j;
1846 2113          u16 checksum = 0;
1847 2114          u16 length = 0;
1848 2115          u16 pointer = 0;
1849 2116          u16 word = 0;
1850 2117  
1851 2118          DEBUGFUNC("ixgbe_calc_eeprom_checksum_generic");
1852 2119  
1853 2120          /* Include 0x0-0x3F in the checksum */
1854 2121          for (i = 0; i < IXGBE_EEPROM_CHECKSUM; i++) {
1855      -                if (hw->eeprom.ops.read(hw, i, &word) != IXGBE_SUCCESS) {
     2122 +                if (hw->eeprom.ops.read(hw, i, &word)) {
1856 2123                          DEBUGOUT("EEPROM read failed\n");
1857      -                        break;
     2124 +                        return IXGBE_ERR_EEPROM;
1858 2125                  }
1859 2126                  checksum += word;
1860 2127          }
1861 2128  
1862 2129          /* Include all data from pointers except for the fw pointer */
1863 2130          for (i = IXGBE_PCIE_ANALOG_PTR; i < IXGBE_FW_PTR; i++) {
1864      -                hw->eeprom.ops.read(hw, i, &pointer);
     2131 +                if (hw->eeprom.ops.read(hw, i, &pointer)) {
     2132 +                        DEBUGOUT("EEPROM read failed\n");
     2133 +                        return IXGBE_ERR_EEPROM;
     2134 +                }
1865 2135  
1866      -                /* Make sure the pointer seems valid */
1867      -                if (pointer != 0xFFFF && pointer != 0) {
1868      -                        hw->eeprom.ops.read(hw, pointer, &length);
     2136 +                /* If the pointer seems invalid */
     2137 +                if (pointer == 0xFFFF || pointer == 0)
     2138 +                        continue;
1869 2139  
1870      -                        if (length != 0xFFFF && length != 0) {
1871      -                                for (j = pointer+1; j <= pointer+length; j++) {
1872      -                                        hw->eeprom.ops.read(hw, j, &word);
1873      -                                        checksum += word;
1874      -                                }
     2140 +                if (hw->eeprom.ops.read(hw, pointer, &length)) {
     2141 +                        DEBUGOUT("EEPROM read failed\n");
     2142 +                        return IXGBE_ERR_EEPROM;
     2143 +                }
     2144 +
     2145 +                if (length == 0xFFFF || length == 0)
     2146 +                        continue;
     2147 +
     2148 +                for (j = pointer + 1; j <= pointer + length; j++) {
     2149 +                        if (hw->eeprom.ops.read(hw, j, &word)) {
     2150 +                                DEBUGOUT("EEPROM read failed\n");
     2151 +                                return IXGBE_ERR_EEPROM;
1875 2152                          }
     2153 +                        checksum += word;
1876 2154                  }
1877 2155          }
1878 2156  
1879 2157          checksum = (u16)IXGBE_EEPROM_SUM - checksum;
1880 2158  
1881      -        return checksum;
     2159 +        return (s32)checksum;
1882 2160  }
1883 2161  
1884 2162  /**
1885 2163   *  ixgbe_validate_eeprom_checksum_generic - Validate EEPROM checksum
1886 2164   *  @hw: pointer to hardware structure
1887 2165   *  @checksum_val: calculated checksum
1888 2166   *
1889 2167   *  Performs checksum calculation and validates the EEPROM checksum.  If the
1890 2168   *  caller does not need checksum_val, the value can be NULL.
1891 2169   **/
1892 2170  s32 ixgbe_validate_eeprom_checksum_generic(struct ixgbe_hw *hw,
1893 2171                                             u16 *checksum_val)
1894 2172  {
1895 2173          s32 status;
1896 2174          u16 checksum;
1897 2175          u16 read_checksum = 0;
1898 2176  
1899 2177          DEBUGFUNC("ixgbe_validate_eeprom_checksum_generic");
1900 2178  
1901      -        /*
1902      -         * Read the first word from the EEPROM. If this times out or fails, do
     2179 +        /* Read the first word from the EEPROM. If this times out or fails, do
1903 2180           * not continue or we could be in for a very long wait while every
1904 2181           * EEPROM read fails
1905 2182           */
1906 2183          status = hw->eeprom.ops.read(hw, 0, &checksum);
     2184 +        if (status) {
     2185 +                DEBUGOUT("EEPROM read failed\n");
     2186 +                return status;
     2187 +        }
1907 2188  
1908      -        if (status == IXGBE_SUCCESS) {
1909      -                checksum = hw->eeprom.ops.calc_checksum(hw);
     2189 +        status = hw->eeprom.ops.calc_checksum(hw);
     2190 +        if (status < 0)
     2191 +                return status;
1910 2192  
1911      -                hw->eeprom.ops.read(hw, IXGBE_EEPROM_CHECKSUM, &read_checksum);
     2193 +        checksum = (u16)(status & 0xffff);
1912 2194  
1913      -                /*
1914      -                 * Verify read checksum from EEPROM is the same as
1915      -                 * calculated checksum
1916      -                 */
1917      -                if (read_checksum != checksum)
1918      -                        status = IXGBE_ERR_EEPROM_CHECKSUM;
1919      -
1920      -                /* If the user cares, return the calculated checksum */
1921      -                if (checksum_val)
1922      -                        *checksum_val = checksum;
1923      -        } else {
     2195 +        status = hw->eeprom.ops.read(hw, IXGBE_EEPROM_CHECKSUM, &read_checksum);
     2196 +        if (status) {
1924 2197                  DEBUGOUT("EEPROM read failed\n");
     2198 +                return status;
1925 2199          }
1926 2200  
     2201 +        /* Verify read checksum from EEPROM is the same as
     2202 +         * calculated checksum
     2203 +         */
     2204 +        if (read_checksum != checksum)
     2205 +                status = IXGBE_ERR_EEPROM_CHECKSUM;
     2206 +
     2207 +        /* If the user cares, return the calculated checksum */
     2208 +        if (checksum_val)
     2209 +                *checksum_val = checksum;
     2210 +
1927 2211          return status;
1928 2212  }
1929 2213  
1930 2214  /**
1931 2215   *  ixgbe_update_eeprom_checksum_generic - Updates the EEPROM checksum
1932 2216   *  @hw: pointer to hardware structure
1933 2217   **/
1934 2218  s32 ixgbe_update_eeprom_checksum_generic(struct ixgbe_hw *hw)
1935 2219  {
1936 2220          s32 status;
1937 2221          u16 checksum;
1938 2222  
1939 2223          DEBUGFUNC("ixgbe_update_eeprom_checksum_generic");
1940 2224  
1941      -        /*
1942      -         * Read the first word from the EEPROM. If this times out or fails, do
     2225 +        /* Read the first word from the EEPROM. If this times out or fails, do
1943 2226           * not continue or we could be in for a very long wait while every
1944 2227           * EEPROM read fails
1945 2228           */
1946 2229          status = hw->eeprom.ops.read(hw, 0, &checksum);
1947      -
1948      -        if (status == IXGBE_SUCCESS) {
1949      -                checksum = hw->eeprom.ops.calc_checksum(hw);
1950      -                status = hw->eeprom.ops.write(hw, IXGBE_EEPROM_CHECKSUM,
1951      -                                              checksum);
1952      -        } else {
     2230 +        if (status) {
1953 2231                  DEBUGOUT("EEPROM read failed\n");
     2232 +                return status;
1954 2233          }
1955 2234  
     2235 +        status = hw->eeprom.ops.calc_checksum(hw);
     2236 +        if (status < 0)
     2237 +                return status;
     2238 +
     2239 +        checksum = (u16)(status & 0xffff);
     2240 +
     2241 +        status = hw->eeprom.ops.write(hw, IXGBE_EEPROM_CHECKSUM, checksum);
     2242 +
1956 2243          return status;
1957 2244  }
1958 2245  
1959 2246  /**
1960 2247   *  ixgbe_validate_mac_addr - Validate MAC address
1961 2248   *  @mac_addr: pointer to MAC address.
1962 2249   *
1963 2250   *  Tests a MAC address to ensure it is a valid Individual Address
1964 2251   **/
1965 2252  s32 ixgbe_validate_mac_addr(u8 *mac_addr)
↓ open down ↓ 32 lines elided ↑ open up ↑
1998 2285  s32 ixgbe_set_rar_generic(struct ixgbe_hw *hw, u32 index, u8 *addr, u32 vmdq,
1999 2286                            u32 enable_addr)
2000 2287  {
2001 2288          u32 rar_low, rar_high;
2002 2289          u32 rar_entries = hw->mac.num_rar_entries;
2003 2290  
2004 2291          DEBUGFUNC("ixgbe_set_rar_generic");
2005 2292  
2006 2293          /* Make sure we are using a valid rar index range */
2007 2294          if (index >= rar_entries) {
2008      -                DEBUGOUT1("RAR index %d is out of range.\n", index);
     2295 +                ERROR_REPORT2(IXGBE_ERROR_ARGUMENT,
     2296 +                             "RAR index %d is out of range.\n", index);
2009 2297                  return IXGBE_ERR_INVALID_ARGUMENT;
2010 2298          }
2011 2299  
2012 2300          /* setup VMDq pool selection before this RAR gets enabled */
2013 2301          hw->mac.ops.set_vmdq(hw, index, vmdq);
2014 2302  
2015 2303          /*
2016 2304           * HW expects these in little endian so we reverse the byte
2017 2305           * order from network order (big endian) to little endian
2018 2306           */
↓ open down ↓ 28 lines elided ↑ open up ↑
2047 2335   **/
2048 2336  s32 ixgbe_clear_rar_generic(struct ixgbe_hw *hw, u32 index)
2049 2337  {
2050 2338          u32 rar_high;
2051 2339          u32 rar_entries = hw->mac.num_rar_entries;
2052 2340  
2053 2341          DEBUGFUNC("ixgbe_clear_rar_generic");
2054 2342  
2055 2343          /* Make sure we are using a valid rar index range */
2056 2344          if (index >= rar_entries) {
2057      -                DEBUGOUT1("RAR index %d is out of range.\n", index);
     2345 +                ERROR_REPORT2(IXGBE_ERROR_ARGUMENT,
     2346 +                             "RAR index %d is out of range.\n", index);
2058 2347                  return IXGBE_ERR_INVALID_ARGUMENT;
2059 2348          }
2060 2349  
2061 2350          /*
2062 2351           * Some parts put the VMDq setting in the extra RAH bits,
2063 2352           * so save everything except the lower 16 bits that hold part
2064 2353           * of the address and the address valid bit.
2065 2354           */
2066 2355          rar_high = IXGBE_READ_REG(hw, IXGBE_RAH(index));
2067 2356          rar_high &= ~(0x0000FFFF | IXGBE_RAH_AV);
↓ open down ↓ 63 lines elided ↑ open up ↑
2131 2420          }
2132 2421  
2133 2422          /* Clear the MTA */
2134 2423          hw->addr_ctrl.mta_in_use = 0;
2135 2424          IXGBE_WRITE_REG(hw, IXGBE_MCSTCTRL, hw->mac.mc_filter_type);
2136 2425  
2137 2426          DEBUGOUT(" Clearing MTA\n");
2138 2427          for (i = 0; i < hw->mac.mcft_size; i++)
2139 2428                  IXGBE_WRITE_REG(hw, IXGBE_MTA(i), 0);
2140 2429  
2141      -        /* Should always be IXGBE_SUCCESS. */
2142      -        return ixgbe_init_uta_tables(hw);
     2430 +        ixgbe_init_uta_tables(hw);
     2431 +
     2432 +        return IXGBE_SUCCESS;
2143 2433  }
2144 2434  
2145 2435  /**
2146 2436   *  ixgbe_add_uc_addr - Adds a secondary unicast address.
2147 2437   *  @hw: pointer to hardware structure
2148 2438   *  @addr: new address
2149 2439   *
2150 2440   *  Adds it to unused receive address register or goes into promiscuous mode.
2151 2441   **/
2152 2442  void ixgbe_add_uc_addr(struct ixgbe_hw *hw, u8 *addr, u32 vmdq)
↓ open down ↓ 191 lines elided ↑ open up ↑
2344 2634          /*
2345 2635           * Set the new number of MC addresses that we are being requested to
2346 2636           * use.
2347 2637           */
2348 2638          hw->addr_ctrl.num_mc_addrs = mc_addr_count;
2349 2639          hw->addr_ctrl.mta_in_use = 0;
2350 2640  
2351 2641          /* Clear mta_shadow */
2352 2642          if (clear) {
2353 2643                  DEBUGOUT(" Clearing MTA\n");
2354      -                (void) memset(&hw->mac.mta_shadow, 0,
2355      -                    sizeof(hw->mac.mta_shadow));
     2644 +                memset(&hw->mac.mta_shadow, 0, sizeof(hw->mac.mta_shadow));
2356 2645          }
2357 2646  
2358 2647          /* Update mta_shadow */
2359 2648          for (i = 0; i < mc_addr_count; i++) {
2360 2649                  DEBUGOUT(" Adding the multicast addresses:\n");
2361 2650                  ixgbe_set_mta(hw, next(hw, &mc_addr_list, &vmdq));
2362 2651          }
2363 2652  
2364 2653          /* Enable mta */
2365 2654          for (i = 0; i < hw->mac.mcft_size; i++)
↓ open down ↓ 124 lines elided ↑ open up ↑
2490 2779                   * disabled by software override.
2491 2780                   */
2492 2781                  fccfg_reg |= IXGBE_FCCFG_TFCE_802_3X;
2493 2782                  break;
2494 2783          case ixgbe_fc_full:
2495 2784                  /* Flow control (both Rx and Tx) is enabled by SW override. */
2496 2785                  mflcn_reg |= IXGBE_MFLCN_RFCE;
2497 2786                  fccfg_reg |= IXGBE_FCCFG_TFCE_802_3X;
2498 2787                  break;
2499 2788          default:
2500      -                DEBUGOUT("Flow control param set incorrectly\n");
     2789 +                ERROR_REPORT1(IXGBE_ERROR_ARGUMENT,
     2790 +                             "Flow control param set incorrectly\n");
2501 2791                  ret_val = IXGBE_ERR_CONFIG;
2502 2792                  goto out;
     2793 +                break;
2503 2794          }
2504 2795  
2505 2796          /* Set 802.3x based flow control settings. */
2506 2797          mflcn_reg |= IXGBE_MFLCN_DPF;
2507 2798          IXGBE_WRITE_REG(hw, IXGBE_MFLCN, mflcn_reg);
2508 2799          IXGBE_WRITE_REG(hw, IXGBE_FCCFG, fccfg_reg);
2509 2800  
2510 2801  
2511 2802          /* Set up and enable Rx high/low water mark thresholds, enable XON. */
2512 2803          for (i = 0; i < IXGBE_DCB_MAX_TRAFFIC_CLASS; i++) {
2513 2804                  if ((hw->fc.current_mode & ixgbe_fc_tx_pause) &&
2514 2805                      hw->fc.high_water[i]) {
2515 2806                          fcrtl = (hw->fc.low_water[i] << 10) | IXGBE_FCRTL_XONE;
2516 2807                          IXGBE_WRITE_REG(hw, IXGBE_FCRTL_82599(i), fcrtl);
2517 2808                          fcrth = (hw->fc.high_water[i] << 10) | IXGBE_FCRTH_FCEN;
2518 2809                  } else {
2519 2810                          IXGBE_WRITE_REG(hw, IXGBE_FCRTL_82599(i), 0);
2520 2811                          /*
2521 2812                           * In order to prevent Tx hangs when the internal Tx
2522 2813                           * switch is enabled we must set the high water mark
2523      -                         * to the maximum FCRTH value.  This allows the Tx
2524      -                         * switch to function even under heavy Rx workloads.
     2814 +                         * to the Rx packet buffer size - 24KB.  This allows
     2815 +                         * the Tx switch to function even under heavy Rx
     2816 +                         * workloads.
2525 2817                           */
2526      -                        fcrth = IXGBE_READ_REG(hw, IXGBE_RXPBSIZE(i)) - 32;
     2818 +                        fcrth = IXGBE_READ_REG(hw, IXGBE_RXPBSIZE(i)) - 24576;
2527 2819                  }
2528 2820  
2529 2821                  IXGBE_WRITE_REG(hw, IXGBE_FCRTH_82599(i), fcrth);
2530 2822          }
2531 2823  
2532 2824          /* Configure pause time (2 TCs per register) */
2533 2825          reg = hw->fc.pause_time * 0x00010001;
2534 2826          for (i = 0; i < (IXGBE_DCB_MAX_TRAFFIC_CLASS / 2); i++)
2535 2827                  IXGBE_WRITE_REG(hw, IXGBE_FCTTV(i), reg);
2536 2828  
↓ open down ↓ 13 lines elided ↑ open up ↑
2550 2842   *  @adv_asm: asymmetric pause bit in advertisement
2551 2843   *  @lp_sym: symmetric pause bit in link partner advertisement
2552 2844   *  @lp_asm: asymmetric pause bit in link partner advertisement
2553 2845   *
2554 2846   *  Find the intersection between advertised settings and link partner's
2555 2847   *  advertised settings
2556 2848   **/
2557 2849  static s32 ixgbe_negotiate_fc(struct ixgbe_hw *hw, u32 adv_reg, u32 lp_reg,
2558 2850                                u32 adv_sym, u32 adv_asm, u32 lp_sym, u32 lp_asm)
2559 2851  {
2560      -        if ((!(adv_reg)) ||  (!(lp_reg)))
     2852 +        if ((!(adv_reg)) ||  (!(lp_reg))) {
     2853 +                ERROR_REPORT3(IXGBE_ERROR_UNSUPPORTED,
     2854 +                             "Local or link partner's advertised flow control "
     2855 +                             "settings are NULL. Local: %x, link partner: %x\n",
     2856 +                             adv_reg, lp_reg);
2561 2857                  return IXGBE_ERR_FC_NOT_NEGOTIATED;
     2858 +        }
2562 2859  
2563 2860          if ((adv_reg & adv_sym) && (lp_reg & lp_sym)) {
2564 2861                  /*
2565 2862                   * Now we need to check if the user selected Rx ONLY
2566 2863                   * of pause frames.  In this case, we had to advertise
2567 2864                   * FULL flow control because we could not advertise RX
2568 2865                   * ONLY. Hence, we must now check to see if we need to
2569 2866                   * turn OFF the TRANSMISSION of PAUSE frames.
2570 2867                   */
2571 2868                  if (hw->fc.requested_mode == ixgbe_fc_full) {
↓ open down ↓ 30 lines elided ↑ open up ↑
2602 2899          s32 ret_val = IXGBE_ERR_FC_NOT_NEGOTIATED;
2603 2900  
2604 2901          /*
2605 2902           * On multispeed fiber at 1g, bail out if
2606 2903           * - link is up but AN did not complete, or if
2607 2904           * - link is up and AN completed but timed out
2608 2905           */
2609 2906  
2610 2907          linkstat = IXGBE_READ_REG(hw, IXGBE_PCS1GLSTA);
2611 2908          if ((!!(linkstat & IXGBE_PCS1GLSTA_AN_COMPLETE) == 0) ||
2612      -            (!!(linkstat & IXGBE_PCS1GLSTA_AN_TIMED_OUT) == 1))
     2909 +            (!!(linkstat & IXGBE_PCS1GLSTA_AN_TIMED_OUT) == 1)) {
     2910 +                DEBUGOUT("Auto-Negotiation did not complete or timed out\n");
2613 2911                  goto out;
     2912 +        }
2614 2913  
2615 2914          pcs_anadv_reg = IXGBE_READ_REG(hw, IXGBE_PCS1GANA);
2616 2915          pcs_lpab_reg = IXGBE_READ_REG(hw, IXGBE_PCS1GANLP);
2617 2916  
2618 2917          ret_val =  ixgbe_negotiate_fc(hw, pcs_anadv_reg,
2619 2918                                        pcs_lpab_reg, IXGBE_PCS1GANA_SYM_PAUSE,
2620 2919                                        IXGBE_PCS1GANA_ASM_PAUSE,
2621 2920                                        IXGBE_PCS1GANA_SYM_PAUSE,
2622 2921                                        IXGBE_PCS1GANA_ASM_PAUSE);
2623 2922  
↓ open down ↓ 11 lines elided ↑ open up ↑
2635 2934  {
2636 2935          u32 links2, anlp1_reg, autoc_reg, links;
2637 2936          s32 ret_val = IXGBE_ERR_FC_NOT_NEGOTIATED;
2638 2937  
2639 2938          /*
2640 2939           * On backplane, bail out if
2641 2940           * - backplane autoneg was not completed, or if
2642 2941           * - we are 82599 and link partner is not AN enabled
2643 2942           */
2644 2943          links = IXGBE_READ_REG(hw, IXGBE_LINKS);
2645      -        if ((links & IXGBE_LINKS_KX_AN_COMP) == 0)
     2944 +        if ((links & IXGBE_LINKS_KX_AN_COMP) == 0) {
     2945 +                DEBUGOUT("Auto-Negotiation did not complete\n");
2646 2946                  goto out;
     2947 +        }
2647 2948  
2648 2949          if (hw->mac.type == ixgbe_mac_82599EB) {
2649 2950                  links2 = IXGBE_READ_REG(hw, IXGBE_LINKS2);
2650      -                if ((links2 & IXGBE_LINKS2_AN_SUPPORTED) == 0)
     2951 +                if ((links2 & IXGBE_LINKS2_AN_SUPPORTED) == 0) {
     2952 +                        DEBUGOUT("Link partner is not AN enabled\n");
2651 2953                          goto out;
     2954 +                }
2652 2955          }
2653 2956          /*
2654 2957           * Read the 10g AN autoc and LP ability registers and resolve
2655 2958           * local flow control settings accordingly
2656 2959           */
2657 2960          autoc_reg = IXGBE_READ_REG(hw, IXGBE_AUTOC);
2658 2961          anlp1_reg = IXGBE_READ_REG(hw, IXGBE_ANLP1);
2659 2962  
2660 2963          ret_val = ixgbe_negotiate_fc(hw, autoc_reg,
2661 2964                  anlp1_reg, IXGBE_AUTOC_SYM_PAUSE, IXGBE_AUTOC_ASM_PAUSE,
↓ open down ↓ 41 lines elided ↑ open up ↑
2703 3006          bool link_up;
2704 3007  
2705 3008          DEBUGFUNC("ixgbe_fc_autoneg");
2706 3009  
2707 3010          /*
2708 3011           * AN should have completed when the cable was plugged in.
2709 3012           * Look for reasons to bail out.  Bail out if:
2710 3013           * - FC autoneg is disabled, or if
2711 3014           * - link is not up.
2712 3015           */
2713      -        if (hw->fc.disable_fc_autoneg)
     3016 +        if (hw->fc.disable_fc_autoneg) {
     3017 +                ERROR_REPORT1(IXGBE_ERROR_UNSUPPORTED,
     3018 +                             "Flow control autoneg is disabled");
2714 3019                  goto out;
     3020 +        }
2715 3021  
2716 3022          hw->mac.ops.check_link(hw, &speed, &link_up, FALSE);
2717      -        if (!link_up)
     3023 +        if (!link_up) {
     3024 +                ERROR_REPORT1(IXGBE_ERROR_SOFTWARE, "The link is down");
2718 3025                  goto out;
     3026 +        }
2719 3027  
2720 3028          switch (hw->phy.media_type) {
2721 3029          /* Autoneg flow control on fiber adapters */
     3030 +        case ixgbe_media_type_fiber_fixed:
     3031 +        case ixgbe_media_type_fiber_qsfp:
2722 3032          case ixgbe_media_type_fiber:
2723 3033                  if (speed == IXGBE_LINK_SPEED_1GB_FULL)
2724 3034                          ret_val = ixgbe_fc_autoneg_fiber(hw);
2725 3035                  break;
2726 3036  
2727 3037          /* Autoneg flow control on backplane adapters */
2728 3038          case ixgbe_media_type_backplane:
2729 3039                  ret_val = ixgbe_fc_autoneg_backplane(hw);
2730 3040                  break;
2731 3041  
2732 3042          /* Autoneg flow control on copper adapters */
2733 3043          case ixgbe_media_type_copper:
2734      -                if (ixgbe_device_supports_autoneg_fc(hw) == IXGBE_SUCCESS)
     3044 +                if (ixgbe_device_supports_autoneg_fc(hw))
2735 3045                          ret_val = ixgbe_fc_autoneg_copper(hw);
2736 3046                  break;
2737 3047  
2738 3048          default:
2739 3049                  break;
2740 3050          }
2741 3051  
2742 3052  out:
2743 3053          if (ret_val == IXGBE_SUCCESS) {
2744 3054                  hw->fc.fc_was_autonegged = TRUE;
2745 3055          } else {
2746 3056                  hw->fc.fc_was_autonegged = FALSE;
2747 3057                  hw->fc.current_mode = hw->fc.requested_mode;
2748 3058          }
2749 3059  }
2750 3060  
     3061 +/*
     3062 + * ixgbe_pcie_timeout_poll - Return number of times to poll for completion
     3063 + * @hw: pointer to hardware structure
     3064 + *
     3065 + * System-wide timeout range is encoded in PCIe Device Control2 register.
     3066 + *
     3067 + * Add 10% to specified maximum and return the number of times to poll for
     3068 + * completion timeout, in units of 100 microsec.  Never return less than
     3069 + * 800 = 80 millisec.
     3070 + */
     3071 +static u32 ixgbe_pcie_timeout_poll(struct ixgbe_hw *hw)
     3072 +{
     3073 +        s16 devctl2;
     3074 +        u32 pollcnt;
     3075 +
     3076 +        devctl2 = IXGBE_READ_PCIE_WORD(hw, IXGBE_PCI_DEVICE_CONTROL2);
     3077 +        devctl2 &= IXGBE_PCIDEVCTRL2_TIMEO_MASK;
     3078 +
     3079 +        switch (devctl2) {
     3080 +        case IXGBE_PCIDEVCTRL2_65_130ms:
     3081 +                pollcnt = 1300;         /* 130 millisec */
     3082 +                break;
     3083 +        case IXGBE_PCIDEVCTRL2_260_520ms:
     3084 +                pollcnt = 5200;         /* 520 millisec */
     3085 +                break;
     3086 +        case IXGBE_PCIDEVCTRL2_1_2s:
     3087 +                pollcnt = 20000;        /* 2 sec */
     3088 +                break;
     3089 +        case IXGBE_PCIDEVCTRL2_4_8s:
     3090 +                pollcnt = 80000;        /* 8 sec */
     3091 +                break;
     3092 +        case IXGBE_PCIDEVCTRL2_17_34s:
     3093 +                pollcnt = 34000;        /* 34 sec */
     3094 +                break;
     3095 +        case IXGBE_PCIDEVCTRL2_50_100us:        /* 100 microsecs */
     3096 +        case IXGBE_PCIDEVCTRL2_1_2ms:           /* 2 millisecs */
     3097 +        case IXGBE_PCIDEVCTRL2_16_32ms:         /* 32 millisec */
     3098 +        case IXGBE_PCIDEVCTRL2_16_32ms_def:     /* 32 millisec default */
     3099 +        default:
     3100 +                pollcnt = 800;          /* 80 millisec minimum */
     3101 +                break;
     3102 +        }
     3103 +
     3104 +        /* add 10% to spec maximum */
     3105 +        return (pollcnt * 11) / 10;
     3106 +}
     3107 +
2751 3108  /**
2752 3109   *  ixgbe_disable_pcie_master - Disable PCI-express master access
2753 3110   *  @hw: pointer to hardware structure
2754 3111   *
2755 3112   *  Disables PCI-Express master access and verifies there are no pending
2756 3113   *  requests. IXGBE_ERR_MASTER_REQUESTS_PENDING is returned if master disable
2757 3114   *  bit hasn't caused the master requests to be disabled, else IXGBE_SUCCESS
2758 3115   *  is returned signifying master requests disabled.
2759 3116   **/
2760 3117  s32 ixgbe_disable_pcie_master(struct ixgbe_hw *hw)
2761 3118  {
2762 3119          s32 status = IXGBE_SUCCESS;
2763      -        u32 i;
     3120 +        u32 i, poll;
     3121 +        u16 value;
2764 3122  
2765 3123          DEBUGFUNC("ixgbe_disable_pcie_master");
2766 3124  
2767 3125          /* Always set this bit to ensure any future transactions are blocked */
2768 3126          IXGBE_WRITE_REG(hw, IXGBE_CTRL, IXGBE_CTRL_GIO_DIS);
2769 3127  
2770      -        /* Exit if master requets are blocked */
2771      -        if (!(IXGBE_READ_REG(hw, IXGBE_STATUS) & IXGBE_STATUS_GIO))
     3128 +        /* Exit if master requests are blocked */
     3129 +        if (!(IXGBE_READ_REG(hw, IXGBE_STATUS) & IXGBE_STATUS_GIO) ||
     3130 +            IXGBE_REMOVED(hw->hw_addr))
2772 3131                  goto out;
2773 3132  
2774 3133          /* Poll for master request bit to clear */
2775 3134          for (i = 0; i < IXGBE_PCI_MASTER_DISABLE_TIMEOUT; i++) {
2776 3135                  usec_delay(100);
2777 3136                  if (!(IXGBE_READ_REG(hw, IXGBE_STATUS) & IXGBE_STATUS_GIO))
2778 3137                          goto out;
2779 3138          }
2780 3139  
2781 3140          /*
2782 3141           * Two consecutive resets are required via CTRL.RST per datasheet
2783 3142           * 5.2.5.3.2 Master Disable.  We set a flag to inform the reset routine
2784 3143           * of this need.  The first reset prevents new master requests from
2785 3144           * being issued by our device.  We then must wait 1usec or more for any
2786 3145           * remaining completions from the PCIe bus to trickle in, and then reset
2787 3146           * again to clear out any effects they may have had on our device.
2788 3147           */
2789 3148          DEBUGOUT("GIO Master Disable bit didn't clear - requesting resets\n");
2790 3149          hw->mac.flags |= IXGBE_FLAGS_DOUBLE_RESET_REQUIRED;
2791 3150  
     3151 +        if (hw->mac.type >= ixgbe_mac_X550)
     3152 +                goto out;
     3153 +
2792 3154          /*
2793 3155           * Before proceeding, make sure that the PCIe block does not have
2794 3156           * transactions pending.
2795 3157           */
2796      -        for (i = 0; i < IXGBE_PCI_MASTER_DISABLE_TIMEOUT; i++) {
     3158 +        poll = ixgbe_pcie_timeout_poll(hw);
     3159 +        for (i = 0; i < poll; i++) {
2797 3160                  usec_delay(100);
2798      -                if (!(IXGBE_READ_PCIE_WORD(hw, IXGBE_PCI_DEVICE_STATUS) &
2799      -                    IXGBE_PCI_DEVICE_STATUS_TRANSACTION_PENDING))
     3161 +                value = IXGBE_READ_PCIE_WORD(hw, IXGBE_PCI_DEVICE_STATUS);
     3162 +                if (IXGBE_REMOVED(hw->hw_addr))
2800 3163                          goto out;
     3164 +                if (!(value & IXGBE_PCI_DEVICE_STATUS_TRANSACTION_PENDING))
     3165 +                        goto out;
2801 3166          }
2802 3167  
2803      -        DEBUGOUT("PCIe transaction pending bit also did not clear.\n");
     3168 +        ERROR_REPORT1(IXGBE_ERROR_POLLING,
     3169 +                     "PCIe transaction pending bit also did not clear.\n");
2804 3170          status = IXGBE_ERR_MASTER_REQUESTS_PENDING;
2805 3171  
2806 3172  out:
2807 3173          return status;
2808 3174  }
2809 3175  
2810 3176  /**
2811 3177   *  ixgbe_acquire_swfw_sync - Acquire SWFW semaphore
2812 3178   *  @hw: pointer to hardware structure
2813 3179   *  @mask: Mask to specify which semaphore to acquire
2814 3180   *
2815 3181   *  Acquires the SWFW semaphore through the GSSR register for the specified
2816 3182   *  function (CSR, PHY0, PHY1, EEPROM, Flash)
2817 3183   **/
2818      -s32 ixgbe_acquire_swfw_sync(struct ixgbe_hw *hw, u16 mask)
     3184 +s32 ixgbe_acquire_swfw_sync(struct ixgbe_hw *hw, u32 mask)
2819 3185  {
2820      -        u32 gssr;
     3186 +        u32 gssr = 0;
2821 3187          u32 swmask = mask;
2822 3188          u32 fwmask = mask << 5;
2823      -        s32 timeout = 200;
     3189 +        u32 timeout = 200;
     3190 +        u32 i;
2824 3191  
2825 3192          DEBUGFUNC("ixgbe_acquire_swfw_sync");
2826 3193  
2827      -        while (timeout) {
     3194 +        for (i = 0; i < timeout; i++) {
2828 3195                  /*
2829      -                 * SW EEPROM semaphore bit is used for access to all
2830      -                 * SW_FW_SYNC/GSSR bits (not just EEPROM)
     3196 +                 * SW NVM semaphore bit is used for access to all
     3197 +                 * SW_FW_SYNC bits (not just NVM)
2831 3198                   */
2832 3199                  if (ixgbe_get_eeprom_semaphore(hw))
2833 3200                          return IXGBE_ERR_SWFW_SYNC;
2834 3201  
2835 3202                  gssr = IXGBE_READ_REG(hw, IXGBE_GSSR);
2836      -                if (!(gssr & (fwmask | swmask)))
2837      -                        break;
2838      -
2839      -                /*
2840      -                 * Firmware currently using resource (fwmask) or other software
2841      -                 * thread currently using resource (swmask)
2842      -                 */
2843      -                ixgbe_release_eeprom_semaphore(hw);
2844      -                msec_delay(5);
2845      -                timeout--;
     3203 +                if (!(gssr & (fwmask | swmask))) {
     3204 +                        gssr |= swmask;
     3205 +                        IXGBE_WRITE_REG(hw, IXGBE_GSSR, gssr);
     3206 +                        ixgbe_release_eeprom_semaphore(hw);
     3207 +                        return IXGBE_SUCCESS;
     3208 +                } else {
     3209 +                        /* Resource is currently in use by FW or SW */
     3210 +                        ixgbe_release_eeprom_semaphore(hw);
     3211 +                        msec_delay(5);
     3212 +                }
2846 3213          }
2847 3214  
2848      -        if (!timeout) {
2849      -                DEBUGOUT("Driver can't access resource, SW_FW_SYNC timeout.\n");
2850      -                return IXGBE_ERR_SWFW_SYNC;
2851      -        }
     3215 +        /* If time expired clear the bits holding the lock and retry */
     3216 +        if (gssr & (fwmask | swmask))
     3217 +                ixgbe_release_swfw_sync(hw, gssr & (fwmask | swmask));
2852 3218  
2853      -        gssr |= swmask;
2854      -        IXGBE_WRITE_REG(hw, IXGBE_GSSR, gssr);
2855      -
2856      -        ixgbe_release_eeprom_semaphore(hw);
2857      -        return IXGBE_SUCCESS;
     3219 +        msec_delay(5);
     3220 +        return IXGBE_ERR_SWFW_SYNC;
2858 3221  }
2859 3222  
2860 3223  /**
2861 3224   *  ixgbe_release_swfw_sync - Release SWFW semaphore
2862 3225   *  @hw: pointer to hardware structure
2863 3226   *  @mask: Mask to specify which semaphore to release
2864 3227   *
2865 3228   *  Releases the SWFW semaphore through the GSSR register for the specified
2866 3229   *  function (CSR, PHY0, PHY1, EEPROM, Flash)
2867 3230   **/
2868      -void ixgbe_release_swfw_sync(struct ixgbe_hw *hw, u16 mask)
     3231 +void ixgbe_release_swfw_sync(struct ixgbe_hw *hw, u32 mask)
2869 3232  {
2870 3233          u32 gssr;
2871 3234          u32 swmask = mask;
2872 3235  
2873 3236          DEBUGFUNC("ixgbe_release_swfw_sync");
2874 3237  
2875      -        (void) ixgbe_get_eeprom_semaphore(hw);
     3238 +        ixgbe_get_eeprom_semaphore(hw);
2876 3239  
2877 3240          gssr = IXGBE_READ_REG(hw, IXGBE_GSSR);
2878 3241          gssr &= ~swmask;
2879 3242          IXGBE_WRITE_REG(hw, IXGBE_GSSR, gssr);
2880 3243  
2881 3244          ixgbe_release_eeprom_semaphore(hw);
2882 3245  }
2883 3246  
2884 3247  /**
2885 3248   *  ixgbe_disable_sec_rx_path_generic - Stops the receive data path
↓ open down ↓ 26 lines elided ↑ open up ↑
2912 3275  
2913 3276          /* For informational purposes only */
2914 3277          if (i >= IXGBE_MAX_SECRX_POLL)
2915 3278                  DEBUGOUT("Rx unit being enabled before security "
2916 3279                           "path fully disabled.  Continuing with init.\n");
2917 3280  
2918 3281          return IXGBE_SUCCESS;
2919 3282  }
2920 3283  
2921 3284  /**
     3285 + *  prot_autoc_read_generic - Hides MAC differences needed for AUTOC read
     3286 + *  @hw: pointer to hardware structure
     3287 + *  @reg_val: Value we read from AUTOC
     3288 + *
     3289 + *  The default case requires no protection so just to the register read.
     3290 + */
     3291 +s32 prot_autoc_read_generic(struct ixgbe_hw *hw, bool *locked, u32 *reg_val)
     3292 +{
     3293 +        *locked = FALSE;
     3294 +        *reg_val = IXGBE_READ_REG(hw, IXGBE_AUTOC);
     3295 +        return IXGBE_SUCCESS;
     3296 +}
     3297 +
     3298 +/**
     3299 + * prot_autoc_write_generic - Hides MAC differences needed for AUTOC write
     3300 + * @hw: pointer to hardware structure
     3301 + * @reg_val: value to write to AUTOC
     3302 + * @locked: bool to indicate whether the SW/FW lock was already taken by
     3303 + *           previous read.
     3304 + *
     3305 + * The default case requires no protection so just to the register write.
     3306 + */
     3307 +s32 prot_autoc_write_generic(struct ixgbe_hw *hw, u32 reg_val, bool locked)
     3308 +{
     3309 +        UNREFERENCED_1PARAMETER(locked);
     3310 +
     3311 +        IXGBE_WRITE_REG(hw, IXGBE_AUTOC, reg_val);
     3312 +        return IXGBE_SUCCESS;
     3313 +}
     3314 +
     3315 +/**
2922 3316   *  ixgbe_enable_sec_rx_path_generic - Enables the receive data path
2923 3317   *  @hw: pointer to hardware structure
2924 3318   *
2925 3319   *  Enables the receive data path.
2926 3320   **/
2927 3321  s32 ixgbe_enable_sec_rx_path_generic(struct ixgbe_hw *hw)
2928 3322  {
2929 3323          int secrxreg;
2930 3324  
2931 3325          DEBUGFUNC("ixgbe_enable_sec_rx_path_generic");
↓ open down ↓ 10 lines elided ↑ open up ↑
2942 3336   *  ixgbe_enable_rx_dma_generic - Enable the Rx DMA unit
2943 3337   *  @hw: pointer to hardware structure
2944 3338   *  @regval: register value to write to RXCTRL
2945 3339   *
2946 3340   *  Enables the Rx DMA unit
2947 3341   **/
2948 3342  s32 ixgbe_enable_rx_dma_generic(struct ixgbe_hw *hw, u32 regval)
2949 3343  {
2950 3344          DEBUGFUNC("ixgbe_enable_rx_dma_generic");
2951 3345  
2952      -        IXGBE_WRITE_REG(hw, IXGBE_RXCTRL, regval);
     3346 +        if (regval & IXGBE_RXCTRL_RXEN)
     3347 +                ixgbe_enable_rx(hw);
     3348 +        else
     3349 +                ixgbe_disable_rx(hw);
2953 3350  
2954 3351          return IXGBE_SUCCESS;
2955 3352  }
2956 3353  
2957 3354  /**
2958 3355   *  ixgbe_blink_led_start_generic - Blink LED based on index.
2959 3356   *  @hw: pointer to hardware structure
2960 3357   *  @index: led number to blink
2961 3358   **/
2962 3359  s32 ixgbe_blink_led_start_generic(struct ixgbe_hw *hw, u32 index)
2963 3360  {
2964 3361          ixgbe_link_speed speed = 0;
2965 3362          bool link_up = 0;
2966      -        u32 autoc_reg = IXGBE_READ_REG(hw, IXGBE_AUTOC);
     3363 +        u32 autoc_reg = 0;
2967 3364          u32 led_reg = IXGBE_READ_REG(hw, IXGBE_LEDCTL);
     3365 +        s32 ret_val = IXGBE_SUCCESS;
     3366 +        bool locked = FALSE;
2968 3367  
2969 3368          DEBUGFUNC("ixgbe_blink_led_start_generic");
2970 3369  
2971 3370          /*
2972 3371           * Link must be up to auto-blink the LEDs;
2973 3372           * Force it if link is down.
2974 3373           */
2975 3374          hw->mac.ops.check_link(hw, &speed, &link_up, FALSE);
2976 3375  
2977 3376          if (!link_up) {
     3377 +                ret_val = hw->mac.ops.prot_autoc_read(hw, &locked, &autoc_reg);
     3378 +                if (ret_val != IXGBE_SUCCESS)
     3379 +                        goto out;
     3380 +
2978 3381                  autoc_reg |= IXGBE_AUTOC_AN_RESTART;
2979 3382                  autoc_reg |= IXGBE_AUTOC_FLU;
2980      -                IXGBE_WRITE_REG(hw, IXGBE_AUTOC, autoc_reg);
     3383 +
     3384 +                ret_val = hw->mac.ops.prot_autoc_write(hw, autoc_reg, locked);
     3385 +                if (ret_val != IXGBE_SUCCESS)
     3386 +                        goto out;
     3387 +
2981 3388                  IXGBE_WRITE_FLUSH(hw);
2982 3389                  msec_delay(10);
2983 3390          }
2984 3391  
2985 3392          led_reg &= ~IXGBE_LED_MODE_MASK(index);
2986 3393          led_reg |= IXGBE_LED_BLINK(index);
2987 3394          IXGBE_WRITE_REG(hw, IXGBE_LEDCTL, led_reg);
2988 3395          IXGBE_WRITE_FLUSH(hw);
2989 3396  
2990      -        return IXGBE_SUCCESS;
     3397 +out:
     3398 +        return ret_val;
2991 3399  }
2992 3400  
2993 3401  /**
2994 3402   *  ixgbe_blink_led_stop_generic - Stop blinking LED based on index.
2995 3403   *  @hw: pointer to hardware structure
2996 3404   *  @index: led number to stop blinking
2997 3405   **/
2998 3406  s32 ixgbe_blink_led_stop_generic(struct ixgbe_hw *hw, u32 index)
2999 3407  {
3000      -        u32 autoc_reg = IXGBE_READ_REG(hw, IXGBE_AUTOC);
     3408 +        u32 autoc_reg = 0;
3001 3409          u32 led_reg = IXGBE_READ_REG(hw, IXGBE_LEDCTL);
     3410 +        s32 ret_val = IXGBE_SUCCESS;
     3411 +        bool locked = FALSE;
3002 3412  
3003 3413          DEBUGFUNC("ixgbe_blink_led_stop_generic");
3004 3414  
     3415 +        ret_val = hw->mac.ops.prot_autoc_read(hw, &locked, &autoc_reg);
     3416 +        if (ret_val != IXGBE_SUCCESS)
     3417 +                goto out;
3005 3418  
3006 3419          autoc_reg &= ~IXGBE_AUTOC_FLU;
3007 3420          autoc_reg |= IXGBE_AUTOC_AN_RESTART;
3008      -        IXGBE_WRITE_REG(hw, IXGBE_AUTOC, autoc_reg);
3009 3421  
     3422 +        ret_val = hw->mac.ops.prot_autoc_write(hw, autoc_reg, locked);
     3423 +        if (ret_val != IXGBE_SUCCESS)
     3424 +                goto out;
     3425 +
3010 3426          led_reg &= ~IXGBE_LED_MODE_MASK(index);
3011 3427          led_reg &= ~IXGBE_LED_BLINK(index);
3012 3428          led_reg |= IXGBE_LED_LINK_ACTIVE << IXGBE_LED_MODE_SHIFT(index);
3013 3429          IXGBE_WRITE_REG(hw, IXGBE_LEDCTL, led_reg);
3014 3430          IXGBE_WRITE_FLUSH(hw);
3015 3431  
3016      -        return IXGBE_SUCCESS;
     3432 +out:
     3433 +        return ret_val;
3017 3434  }
3018 3435  
3019 3436  /**
3020 3437   *  ixgbe_get_san_mac_addr_offset - Get SAN MAC address offset from the EEPROM
3021 3438   *  @hw: pointer to hardware structure
3022 3439   *  @san_mac_offset: SAN MAC address offset
3023 3440   *
3024 3441   *  This function will read the EEPROM location for the SAN MAC address
3025 3442   *  pointer, and returns the value at that location.  This is used in both
3026 3443   *  get and set mac_addr routines.
3027 3444   **/
3028 3445  static s32 ixgbe_get_san_mac_addr_offset(struct ixgbe_hw *hw,
3029 3446                                           u16 *san_mac_offset)
3030 3447  {
     3448 +        s32 ret_val;
     3449 +
3031 3450          DEBUGFUNC("ixgbe_get_san_mac_addr_offset");
3032 3451  
3033 3452          /*
3034 3453           * First read the EEPROM pointer to see if the MAC addresses are
3035 3454           * available.
3036 3455           */
3037      -        hw->eeprom.ops.read(hw, IXGBE_SAN_MAC_ADDR_PTR, san_mac_offset);
     3456 +        ret_val = hw->eeprom.ops.read(hw, IXGBE_SAN_MAC_ADDR_PTR,
     3457 +                                      san_mac_offset);
     3458 +        if (ret_val) {
     3459 +                ERROR_REPORT2(IXGBE_ERROR_INVALID_STATE,
     3460 +                              "eeprom at offset %d failed",
     3461 +                              IXGBE_SAN_MAC_ADDR_PTR);
     3462 +        }
3038 3463  
3039      -        return IXGBE_SUCCESS;
     3464 +        return ret_val;
3040 3465  }
3041 3466  
3042 3467  /**
3043 3468   *  ixgbe_get_san_mac_addr_generic - SAN MAC address retrieval from the EEPROM
3044 3469   *  @hw: pointer to hardware structure
3045 3470   *  @san_mac_addr: SAN MAC address
3046 3471   *
3047 3472   *  Reads the SAN MAC address from the EEPROM, if it's available.  This is
3048 3473   *  per-port, so set_lan_id() must be called before reading the addresses.
3049 3474   *  set_lan_id() is called by identify_sfp(), but this cannot be relied
3050 3475   *  upon for non-SFP connections, so we must call it here.
3051 3476   **/
3052 3477  s32 ixgbe_get_san_mac_addr_generic(struct ixgbe_hw *hw, u8 *san_mac_addr)
3053 3478  {
3054 3479          u16 san_mac_data, san_mac_offset;
3055 3480          u8 i;
     3481 +        s32 ret_val;
3056 3482  
3057 3483          DEBUGFUNC("ixgbe_get_san_mac_addr_generic");
3058 3484  
3059 3485          /*
3060 3486           * First read the EEPROM pointer to see if the MAC addresses are
3061 3487           * available.  If they're not, no point in calling set_lan_id() here.
3062 3488           */
3063      -        (void) ixgbe_get_san_mac_addr_offset(hw, &san_mac_offset);
3064      -
3065      -        if ((san_mac_offset == 0) || (san_mac_offset == 0xFFFF)) {
3066      -                /*
3067      -                 * No addresses available in this EEPROM.  It's not an
3068      -                 * error though, so just wipe the local address and return.
3069      -                 */
3070      -                for (i = 0; i < 6; i++)
3071      -                        san_mac_addr[i] = 0xFF;
3072      -
     3489 +        ret_val = ixgbe_get_san_mac_addr_offset(hw, &san_mac_offset);
     3490 +        if (ret_val || san_mac_offset == 0 || san_mac_offset == 0xFFFF)
3073 3491                  goto san_mac_addr_out;
3074      -        }
3075 3492  
3076 3493          /* make sure we know which port we need to program */
3077 3494          hw->mac.ops.set_lan_id(hw);
3078 3495          /* apply the port offset to the address offset */
3079 3496          (hw->bus.func) ? (san_mac_offset += IXGBE_SAN_MAC_ADDR_PORT1_OFFSET) :
3080 3497                           (san_mac_offset += IXGBE_SAN_MAC_ADDR_PORT0_OFFSET);
3081 3498          for (i = 0; i < 3; i++) {
3082      -                hw->eeprom.ops.read(hw, san_mac_offset, &san_mac_data);
     3499 +                ret_val = hw->eeprom.ops.read(hw, san_mac_offset,
     3500 +                                              &san_mac_data);
     3501 +                if (ret_val) {
     3502 +                        ERROR_REPORT2(IXGBE_ERROR_INVALID_STATE,
     3503 +                                      "eeprom read at offset %d failed",
     3504 +                                      san_mac_offset);
     3505 +                        goto san_mac_addr_out;
     3506 +                }
3083 3507                  san_mac_addr[i * 2] = (u8)(san_mac_data);
3084 3508                  san_mac_addr[i * 2 + 1] = (u8)(san_mac_data >> 8);
3085 3509                  san_mac_offset++;
3086 3510          }
     3511 +        return IXGBE_SUCCESS;
3087 3512  
3088 3513  san_mac_addr_out:
     3514 +        /*
     3515 +         * No addresses available in this EEPROM.  It's not an
     3516 +         * error though, so just wipe the local address and return.
     3517 +         */
     3518 +        for (i = 0; i < 6; i++)
     3519 +                san_mac_addr[i] = 0xFF;
3089 3520          return IXGBE_SUCCESS;
3090 3521  }
3091 3522  
3092 3523  /**
3093 3524   *  ixgbe_set_san_mac_addr_generic - Write the SAN MAC address to the EEPROM
3094 3525   *  @hw: pointer to hardware structure
3095 3526   *  @san_mac_addr: SAN MAC address
3096 3527   *
3097 3528   *  Write a SAN MAC address to the EEPROM.
3098 3529   **/
3099 3530  s32 ixgbe_set_san_mac_addr_generic(struct ixgbe_hw *hw, u8 *san_mac_addr)
3100 3531  {
3101      -        s32 status = IXGBE_SUCCESS;
     3532 +        s32 ret_val;
3102 3533          u16 san_mac_data, san_mac_offset;
3103 3534          u8 i;
3104 3535  
3105 3536          DEBUGFUNC("ixgbe_set_san_mac_addr_generic");
3106 3537  
3107 3538          /* Look for SAN mac address pointer.  If not defined, return */
3108      -        (void) ixgbe_get_san_mac_addr_offset(hw, &san_mac_offset);
     3539 +        ret_val = ixgbe_get_san_mac_addr_offset(hw, &san_mac_offset);
     3540 +        if (ret_val || san_mac_offset == 0 || san_mac_offset == 0xFFFF)
     3541 +                return IXGBE_ERR_NO_SAN_ADDR_PTR;
3109 3542  
3110      -        if ((san_mac_offset == 0) || (san_mac_offset == 0xFFFF)) {
3111      -                status = IXGBE_ERR_NO_SAN_ADDR_PTR;
3112      -                goto san_mac_addr_out;
3113      -        }
3114      -
3115 3543          /* Make sure we know which port we need to write */
3116 3544          hw->mac.ops.set_lan_id(hw);
3117 3545          /* Apply the port offset to the address offset */
3118 3546          (hw->bus.func) ? (san_mac_offset += IXGBE_SAN_MAC_ADDR_PORT1_OFFSET) :
3119 3547                           (san_mac_offset += IXGBE_SAN_MAC_ADDR_PORT0_OFFSET);
3120 3548  
3121 3549          for (i = 0; i < 3; i++) {
3122 3550                  san_mac_data = (u16)((u16)(san_mac_addr[i * 2 + 1]) << 8);
3123 3551                  san_mac_data |= (u16)(san_mac_addr[i * 2]);
3124 3552                  hw->eeprom.ops.write(hw, san_mac_offset, san_mac_data);
3125 3553                  san_mac_offset++;
3126 3554          }
3127 3555  
3128      -san_mac_addr_out:
3129      -        return status;
     3556 +        return IXGBE_SUCCESS;
3130 3557  }
3131 3558  
3132 3559  /**
3133 3560   *  ixgbe_get_pcie_msix_count_generic - Gets MSI-X vector count
3134 3561   *  @hw: pointer to hardware structure
3135 3562   *
3136 3563   *  Read PCIe configuration space, and get the MSI-X vector count from
3137 3564   *  the capabilities table.
3138 3565   **/
3139 3566  u16 ixgbe_get_pcie_msix_count_generic(struct ixgbe_hw *hw)
↓ open down ↓ 2 lines elided ↑ open up ↑
3142 3569          u16 max_msix_count;
3143 3570          u16 pcie_offset;
3144 3571  
3145 3572          switch (hw->mac.type) {
3146 3573          case ixgbe_mac_82598EB:
3147 3574                  pcie_offset = IXGBE_PCIE_MSIX_82598_CAPS;
3148 3575                  max_msix_count = IXGBE_MAX_MSIX_VECTORS_82598;
3149 3576                  break;
3150 3577          case ixgbe_mac_82599EB:
3151 3578          case ixgbe_mac_X540:
     3579 +        case ixgbe_mac_X550:
     3580 +        case ixgbe_mac_X550EM_x:
3152 3581                  pcie_offset = IXGBE_PCIE_MSIX_82599_CAPS;
3153 3582                  max_msix_count = IXGBE_MAX_MSIX_VECTORS_82599;
3154 3583                  break;
3155 3584          default:
3156 3585                  return msix_count;
3157 3586          }
3158 3587  
3159 3588          DEBUGFUNC("ixgbe_get_pcie_msix_count_generic");
3160 3589          msix_count = IXGBE_READ_PCIE_WORD(hw, pcie_offset);
     3590 +        if (IXGBE_REMOVED(hw->hw_addr))
     3591 +                msix_count = 0;
3161 3592          msix_count &= IXGBE_PCIE_MSIX_TBL_SZ_MASK;
3162 3593  
3163 3594          /* MSI-X count is zero-based in HW */
3164 3595          msix_count++;
3165 3596  
3166 3597          if (msix_count > max_msix_count)
3167 3598                  msix_count = max_msix_count;
3168 3599  
3169 3600          return msix_count;
3170 3601  }
↓ open down ↓ 37 lines elided ↑ open up ↑
3208 3639                          first_empty_rar = rar;
3209 3640                  } else if ((rar_high & 0xFFFF) == addr_high) {
3210 3641                          rar_low = IXGBE_READ_REG(hw, IXGBE_RAL(rar));
3211 3642                          if (rar_low == addr_low)
3212 3643                                  break;    /* found it already in the rars */
3213 3644                  }
3214 3645          }
3215 3646  
3216 3647          if (rar < hw->mac.rar_highwater) {
3217 3648                  /* already there so just add to the pool bits */
3218      -                (void) ixgbe_set_vmdq(hw, rar, vmdq);
     3649 +                ixgbe_set_vmdq(hw, rar, vmdq);
3219 3650          } else if (first_empty_rar != NO_EMPTY_RAR_FOUND) {
3220 3651                  /* stick it into first empty RAR slot we found */
3221 3652                  rar = first_empty_rar;
3222      -                (void) ixgbe_set_rar(hw, rar, addr, vmdq, IXGBE_RAH_AV);
     3653 +                ixgbe_set_rar(hw, rar, addr, vmdq, IXGBE_RAH_AV);
3223 3654          } else if (rar == hw->mac.rar_highwater) {
3224 3655                  /* add it to the top of the list and inc the highwater mark */
3225      -                (void) ixgbe_set_rar(hw, rar, addr, vmdq, IXGBE_RAH_AV);
     3656 +                ixgbe_set_rar(hw, rar, addr, vmdq, IXGBE_RAH_AV);
3226 3657                  hw->mac.rar_highwater++;
3227 3658          } else if (rar >= hw->mac.num_rar_entries) {
3228 3659                  return IXGBE_ERR_INVALID_MAC_ADDR;
3229 3660          }
3230 3661  
3231 3662          /*
3232 3663           * If we found rar[0], make sure the default pool bit (we use pool 0)
3233 3664           * remains cleared to be sure default pool packets will get delivered
3234 3665           */
3235 3666          if (rar == 0)
3236      -                (void) ixgbe_clear_vmdq(hw, rar, 0);
     3667 +                ixgbe_clear_vmdq(hw, rar, 0);
3237 3668  
3238 3669          return rar;
3239 3670  }
3240 3671  
3241 3672  /**
3242 3673   *  ixgbe_clear_vmdq_generic - Disassociate a VMDq pool index from a rx address
3243 3674   *  @hw: pointer to hardware struct
3244 3675   *  @rar: receive address register index to disassociate
3245 3676   *  @vmdq: VMDq pool index to remove from the rar
3246 3677   **/
3247 3678  s32 ixgbe_clear_vmdq_generic(struct ixgbe_hw *hw, u32 rar, u32 vmdq)
3248 3679  {
3249 3680          u32 mpsar_lo, mpsar_hi;
3250 3681          u32 rar_entries = hw->mac.num_rar_entries;
3251 3682  
3252 3683          DEBUGFUNC("ixgbe_clear_vmdq_generic");
3253 3684  
3254 3685          /* Make sure we are using a valid rar index range */
3255 3686          if (rar >= rar_entries) {
3256      -                DEBUGOUT1("RAR index %d is out of range.\n", rar);
     3687 +                ERROR_REPORT2(IXGBE_ERROR_ARGUMENT,
     3688 +                             "RAR index %d is out of range.\n", rar);
3257 3689                  return IXGBE_ERR_INVALID_ARGUMENT;
3258 3690          }
3259 3691  
3260 3692          mpsar_lo = IXGBE_READ_REG(hw, IXGBE_MPSAR_LO(rar));
3261 3693          mpsar_hi = IXGBE_READ_REG(hw, IXGBE_MPSAR_HI(rar));
3262 3694  
     3695 +        if (IXGBE_REMOVED(hw->hw_addr))
     3696 +                goto done;
     3697 +
3263 3698          if (!mpsar_lo && !mpsar_hi)
3264 3699                  goto done;
3265 3700  
3266 3701          if (vmdq == IXGBE_CLEAR_VMDQ_ALL) {
3267 3702                  if (mpsar_lo) {
3268 3703                          IXGBE_WRITE_REG(hw, IXGBE_MPSAR_LO(rar), 0);
3269 3704                          mpsar_lo = 0;
3270 3705                  }
3271 3706                  if (mpsar_hi) {
3272 3707                          IXGBE_WRITE_REG(hw, IXGBE_MPSAR_HI(rar), 0);
↓ open down ↓ 22 lines elided ↑ open up ↑
3295 3730   **/
3296 3731  s32 ixgbe_set_vmdq_generic(struct ixgbe_hw *hw, u32 rar, u32 vmdq)
3297 3732  {
3298 3733          u32 mpsar;
3299 3734          u32 rar_entries = hw->mac.num_rar_entries;
3300 3735  
3301 3736          DEBUGFUNC("ixgbe_set_vmdq_generic");
3302 3737  
3303 3738          /* Make sure we are using a valid rar index range */
3304 3739          if (rar >= rar_entries) {
3305      -                DEBUGOUT1("RAR index %d is out of range.\n", rar);
     3740 +                ERROR_REPORT2(IXGBE_ERROR_ARGUMENT,
     3741 +                             "RAR index %d is out of range.\n", rar);
3306 3742                  return IXGBE_ERR_INVALID_ARGUMENT;
3307 3743          }
3308 3744  
3309 3745          if (vmdq < 32) {
3310 3746                  mpsar = IXGBE_READ_REG(hw, IXGBE_MPSAR_LO(rar));
3311 3747                  mpsar |= 1 << vmdq;
3312 3748                  IXGBE_WRITE_REG(hw, IXGBE_MPSAR_LO(rar), mpsar);
3313 3749          } else {
3314 3750                  mpsar = IXGBE_READ_REG(hw, IXGBE_MPSAR_HI(rar));
3315 3751                  mpsar |= 1 << (vmdq - 32);
↓ open down ↓ 78 lines elided ↑ open up ↑
3394 3830  
3395 3831          /*
3396 3832            * If regindex is less than IXGBE_VLVF_ENTRIES, then we found the vlan
3397 3833            * in the VLVF. Else use the first empty VLVF register for this
3398 3834            * vlan id.
3399 3835            */
3400 3836          if (regindex >= IXGBE_VLVF_ENTRIES) {
3401 3837                  if (first_empty_slot)
3402 3838                          regindex = first_empty_slot;
3403 3839                  else {
3404      -                        DEBUGOUT("No space in VLVF.\n");
     3840 +                        ERROR_REPORT1(IXGBE_ERROR_SOFTWARE,
     3841 +                                     "No space in VLVF.\n");
3405 3842                          regindex = IXGBE_ERR_NO_SPACE;
3406 3843                  }
3407 3844          }
3408 3845  
3409 3846          return regindex;
3410 3847  }
3411 3848  
3412 3849  /**
3413 3850   *  ixgbe_set_vfta_generic - Set VLAN filter table
3414 3851   *  @hw: pointer to hardware structure
↓ open down ↓ 214 lines elided ↑ open up ↑
3629 4066          links_orig = IXGBE_READ_REG(hw, IXGBE_LINKS);
3630 4067  
3631 4068          links_reg = IXGBE_READ_REG(hw, IXGBE_LINKS);
3632 4069  
3633 4070          if (links_orig != links_reg) {
3634 4071                  DEBUGOUT2("LINKS changed from %08X to %08X\n",
3635 4072                            links_orig, links_reg);
3636 4073          }
3637 4074  
3638 4075          if (link_up_wait_to_complete) {
3639      -                for (i = 0; i < IXGBE_LINK_UP_TIME; i++) {
     4076 +                for (i = 0; i < hw->mac.max_link_up_time; i++) {
3640 4077                          if (links_reg & IXGBE_LINKS_UP) {
3641 4078                                  *link_up = TRUE;
3642 4079                                  break;
3643 4080                          } else {
3644 4081                                  *link_up = FALSE;
3645 4082                          }
3646 4083                          msec_delay(100);
3647 4084                          links_reg = IXGBE_READ_REG(hw, IXGBE_LINKS);
3648 4085                  }
3649 4086          } else {
3650 4087                  if (links_reg & IXGBE_LINKS_UP)
3651 4088                          *link_up = TRUE;
3652 4089                  else
3653 4090                          *link_up = FALSE;
3654 4091          }
3655 4092  
3656      -        if ((links_reg & IXGBE_LINKS_SPEED_82599) ==
3657      -            IXGBE_LINKS_SPEED_10G_82599)
     4093 +        switch (links_reg & IXGBE_LINKS_SPEED_82599) {
     4094 +        case IXGBE_LINKS_SPEED_10G_82599:
3658 4095                  *speed = IXGBE_LINK_SPEED_10GB_FULL;
3659      -        else if ((links_reg & IXGBE_LINKS_SPEED_82599) ==
3660      -                 IXGBE_LINKS_SPEED_1G_82599)
     4096 +                if (hw->mac.type >= ixgbe_mac_X550) {
     4097 +                        if (links_reg & IXGBE_LINKS_SPEED_NON_STD)
     4098 +                                *speed = IXGBE_LINK_SPEED_2_5GB_FULL;
     4099 +                }
     4100 +                break;
     4101 +        case IXGBE_LINKS_SPEED_1G_82599:
3661 4102                  *speed = IXGBE_LINK_SPEED_1GB_FULL;
3662      -        else if ((links_reg & IXGBE_LINKS_SPEED_82599) ==
3663      -                 IXGBE_LINKS_SPEED_100_82599)
     4103 +                break;
     4104 +        case IXGBE_LINKS_SPEED_100_82599:
3664 4105                  *speed = IXGBE_LINK_SPEED_100_FULL;
3665      -        else
     4106 +                if (hw->mac.type >= ixgbe_mac_X550) {
     4107 +                        if (links_reg & IXGBE_LINKS_SPEED_NON_STD)
     4108 +                                *speed = IXGBE_LINK_SPEED_5GB_FULL;
     4109 +                }
     4110 +                break;
     4111 +        default:
3666 4112                  *speed = IXGBE_LINK_SPEED_UNKNOWN;
     4113 +        }
3667 4114  
3668 4115          return IXGBE_SUCCESS;
3669 4116  }
3670 4117  
3671 4118  /**
3672 4119   *  ixgbe_get_wwn_prefix_generic - Get alternative WWNN/WWPN prefix from
3673 4120   *  the EEPROM
3674 4121   *  @hw: pointer to hardware structure
3675 4122   *  @wwnn_prefix: the alternative WWNN prefix
3676 4123   *  @wwpn_prefix: the alternative WWPN prefix
↓ open down ↓ 7 lines elided ↑ open up ↑
3684 4131          u16 offset, caps;
3685 4132          u16 alt_san_mac_blk_offset;
3686 4133  
3687 4134          DEBUGFUNC("ixgbe_get_wwn_prefix_generic");
3688 4135  
3689 4136          /* clear output first */
3690 4137          *wwnn_prefix = 0xFFFF;
3691 4138          *wwpn_prefix = 0xFFFF;
3692 4139  
3693 4140          /* check if alternative SAN MAC is supported */
3694      -        hw->eeprom.ops.read(hw, IXGBE_ALT_SAN_MAC_ADDR_BLK_PTR,
3695      -                            &alt_san_mac_blk_offset);
     4141 +        offset = IXGBE_ALT_SAN_MAC_ADDR_BLK_PTR;
     4142 +        if (hw->eeprom.ops.read(hw, offset, &alt_san_mac_blk_offset))
     4143 +                goto wwn_prefix_err;
3696 4144  
3697 4145          if ((alt_san_mac_blk_offset == 0) ||
3698 4146              (alt_san_mac_blk_offset == 0xFFFF))
3699 4147                  goto wwn_prefix_out;
3700 4148  
3701 4149          /* check capability in alternative san mac address block */
3702 4150          offset = alt_san_mac_blk_offset + IXGBE_ALT_SAN_MAC_ADDR_CAPS_OFFSET;
3703      -        hw->eeprom.ops.read(hw, offset, &caps);
     4151 +        if (hw->eeprom.ops.read(hw, offset, &caps))
     4152 +                goto wwn_prefix_err;
3704 4153          if (!(caps & IXGBE_ALT_SAN_MAC_ADDR_CAPS_ALTWWN))
3705 4154                  goto wwn_prefix_out;
3706 4155  
3707 4156          /* get the corresponding prefix for WWNN/WWPN */
3708 4157          offset = alt_san_mac_blk_offset + IXGBE_ALT_SAN_MAC_ADDR_WWNN_OFFSET;
3709      -        hw->eeprom.ops.read(hw, offset, wwnn_prefix);
     4158 +        if (hw->eeprom.ops.read(hw, offset, wwnn_prefix)) {
     4159 +                ERROR_REPORT2(IXGBE_ERROR_INVALID_STATE,
     4160 +                              "eeprom read at offset %d failed", offset);
     4161 +        }
3710 4162  
3711 4163          offset = alt_san_mac_blk_offset + IXGBE_ALT_SAN_MAC_ADDR_WWPN_OFFSET;
3712      -        hw->eeprom.ops.read(hw, offset, wwpn_prefix);
     4164 +        if (hw->eeprom.ops.read(hw, offset, wwpn_prefix))
     4165 +                goto wwn_prefix_err;
3713 4166  
3714 4167  wwn_prefix_out:
3715 4168          return IXGBE_SUCCESS;
     4169 +
     4170 +wwn_prefix_err:
     4171 +        ERROR_REPORT2(IXGBE_ERROR_INVALID_STATE,
     4172 +                      "eeprom read at offset %d failed", offset);
     4173 +        return IXGBE_SUCCESS;
3716 4174  }
3717 4175  
3718 4176  /**
3719 4177   *  ixgbe_get_fcoe_boot_status_generic - Get FCOE boot status from EEPROM
3720 4178   *  @hw: pointer to hardware structure
3721 4179   *  @bs: the fcoe boot status
3722 4180   *
3723 4181   *  This function will read the FCOE boot status from the iSCSI FCOE block
3724 4182   **/
3725 4183  s32 ixgbe_get_fcoe_boot_status_generic(struct ixgbe_hw *hw, u16 *bs)
↓ open down ↓ 77 lines elided ↑ open up ↑
3803 4261           * anti-spoofing enabled.
3804 4262           */
3805 4263          for (j++; j < IXGBE_PFVFSPOOF_REG_COUNT; j++)
3806 4264                  IXGBE_WRITE_REG(hw, IXGBE_PFVFSPOOF(j), 0);
3807 4265  }
3808 4266  
3809 4267  /**
3810 4268   *  ixgbe_set_vlan_anti_spoofing - Enable/Disable VLAN anti-spoofing
3811 4269   *  @hw: pointer to hardware structure
3812 4270   *  @enable: enable or disable switch for VLAN anti-spoofing
3813      - *  @pf: Virtual Function pool - VF Pool to set for VLAN anti-spoofing
     4271 + *  @vf: Virtual Function pool - VF Pool to set for VLAN anti-spoofing
3814 4272   *
3815 4273   **/
3816 4274  void ixgbe_set_vlan_anti_spoofing(struct ixgbe_hw *hw, bool enable, int vf)
3817 4275  {
3818 4276          int vf_target_reg = vf >> 3;
3819 4277          int vf_target_shift = vf % 8 + IXGBE_SPOOF_VLANAS_SHIFT;
3820 4278          u32 pfvfspoof;
3821 4279  
3822 4280          if (hw->mac.type == ixgbe_mac_82598EB)
3823 4281                  return;
↓ open down ↓ 51 lines elided ↑ open up ↑
3875 4333  
3876 4334  }
3877 4335  
3878 4336  /**
3879 4337   *  ixgbe_calculate_checksum - Calculate checksum for buffer
3880 4338   *  @buffer: pointer to EEPROM
3881 4339   *  @length: size of EEPROM to calculate a checksum for
3882 4340   *  Calculates the checksum for some buffer on a specified length.  The
3883 4341   *  checksum calculated is returned.
3884 4342   **/
3885      -static u8 ixgbe_calculate_checksum(u8 *buffer, u32 length)
     4343 +u8 ixgbe_calculate_checksum(u8 *buffer, u32 length)
3886 4344  {
3887 4345          u32 i;
3888 4346          u8 sum = 0;
3889 4347  
3890 4348          DEBUGFUNC("ixgbe_calculate_checksum");
3891 4349  
3892 4350          if (!buffer)
3893 4351                  return 0;
3894 4352  
3895 4353          for (i = 0; i < length; i++)
↓ open down ↓ 1 lines elided ↑ open up ↑
3897 4355  
3898 4356          return (u8) (0 - sum);
3899 4357  }
3900 4358  
3901 4359  /**
3902 4360   *  ixgbe_host_interface_command - Issue command to manageability block
3903 4361   *  @hw: pointer to the HW structure
3904 4362   *  @buffer: contains the command to write and where the return status will
3905 4363   *   be placed
3906 4364   *  @length: length of buffer, must be multiple of 4 bytes
     4365 + *  @timeout: time in ms to wait for command completion
     4366 + *  @return_data: read and return data from the buffer (TRUE) or not (FALSE)
     4367 + *   Needed because FW structures are big endian and decoding of
     4368 + *   these fields can be 8 bit or 16 bit based on command. Decoding
     4369 + *   is not easily understood without making a table of commands.
     4370 + *   So we will leave this up to the caller to read back the data
     4371 + *   in these cases.
3907 4372   *
3908 4373   *  Communicates with the manageability block.  On success return IXGBE_SUCCESS
3909 4374   *  else return IXGBE_ERR_HOST_INTERFACE_COMMAND.
3910 4375   **/
3911      -static s32 ixgbe_host_interface_command(struct ixgbe_hw *hw, u32 *buffer,
3912      -                                        u32 length)
     4376 +s32 ixgbe_host_interface_command(struct ixgbe_hw *hw, u32 *buffer,
     4377 +                                 u32 length, u32 timeout, bool return_data)
3913 4378  {
3914      -        u32 hicr, i, bi;
     4379 +        u32 hicr, i, bi, fwsts;
3915 4380          u32 hdr_size = sizeof(struct ixgbe_hic_hdr);
3916      -        u8 buf_len, dword_len;
     4381 +        u16 buf_len;
     4382 +        u16 dword_len;
3917 4383  
3918      -        s32 ret_val = IXGBE_SUCCESS;
3919      -
3920 4384          DEBUGFUNC("ixgbe_host_interface_command");
3921 4385  
3922      -        if (length == 0 || length & 0x3 ||
3923      -            length > IXGBE_HI_MAX_BLOCK_BYTE_LENGTH) {
3924      -                DEBUGOUT("Buffer length failure.\n");
3925      -                ret_val = IXGBE_ERR_HOST_INTERFACE_COMMAND;
3926      -                goto out;
     4386 +        if (length == 0 || length > IXGBE_HI_MAX_BLOCK_BYTE_LENGTH) {
     4387 +                DEBUGOUT1("Buffer length failure buffersize=%d.\n", length);
     4388 +                return IXGBE_ERR_HOST_INTERFACE_COMMAND;
3927 4389          }
     4390 +        /* Set bit 9 of FWSTS clearing FW reset indication */
     4391 +        fwsts = IXGBE_READ_REG(hw, IXGBE_FWSTS);
     4392 +        IXGBE_WRITE_REG(hw, IXGBE_FWSTS, fwsts | IXGBE_FWSTS_FWRI);
3928 4393  
3929 4394          /* Check that the host interface is enabled. */
3930 4395          hicr = IXGBE_READ_REG(hw, IXGBE_HICR);
3931 4396          if ((hicr & IXGBE_HICR_EN) == 0) {
3932 4397                  DEBUGOUT("IXGBE_HOST_EN bit disabled.\n");
3933      -                ret_val = IXGBE_ERR_HOST_INTERFACE_COMMAND;
3934      -                goto out;
     4398 +                return IXGBE_ERR_HOST_INTERFACE_COMMAND;
3935 4399          }
3936 4400  
3937      -        /* Calculate length in DWORDs */
     4401 +        /* Calculate length in DWORDs. We must be DWORD aligned */
     4402 +        if ((length % (sizeof(u32))) != 0) {
     4403 +                DEBUGOUT("Buffer length failure, not aligned to dword");
     4404 +                return IXGBE_ERR_INVALID_ARGUMENT;
     4405 +        }
     4406 +
3938 4407          dword_len = length >> 2;
3939 4408  
3940      -        /*
3941      -         * The device driver writes the relevant command block
     4409 +        /* The device driver writes the relevant command block
3942 4410           * into the ram area.
3943 4411           */
3944 4412          for (i = 0; i < dword_len; i++)
3945 4413                  IXGBE_WRITE_REG_ARRAY(hw, IXGBE_FLEX_MNG,
3946 4414                                        i, IXGBE_CPU_TO_LE32(buffer[i]));
3947 4415  
3948 4416          /* Setting this bit tells the ARC that a new command is pending. */
3949 4417          IXGBE_WRITE_REG(hw, IXGBE_HICR, hicr | IXGBE_HICR_C);
3950 4418  
3951      -        for (i = 0; i < IXGBE_HI_COMMAND_TIMEOUT; i++) {
     4419 +        for (i = 0; i < timeout; i++) {
3952 4420                  hicr = IXGBE_READ_REG(hw, IXGBE_HICR);
3953 4421                  if (!(hicr & IXGBE_HICR_C))
3954 4422                          break;
3955 4423                  msec_delay(1);
3956 4424          }
3957 4425  
3958      -        /* Check command successful completion. */
3959      -        if (i == IXGBE_HI_COMMAND_TIMEOUT ||
3960      -            (!(IXGBE_READ_REG(hw, IXGBE_HICR) & IXGBE_HICR_SV))) {
3961      -                DEBUGOUT("Command has failed with no status valid.\n");
3962      -                ret_val = IXGBE_ERR_HOST_INTERFACE_COMMAND;
3963      -                goto out;
     4426 +        /* Check command completion */
     4427 +        if ((timeout != 0 && i == timeout) ||
     4428 +            !(IXGBE_READ_REG(hw, IXGBE_HICR) & IXGBE_HICR_SV)) {
     4429 +                ERROR_REPORT1(IXGBE_ERROR_CAUTION,
     4430 +                             "Command has failed with no status valid.\n");
     4431 +                return IXGBE_ERR_HOST_INTERFACE_COMMAND;
3964 4432          }
3965 4433  
     4434 +        if (!return_data)
     4435 +                return 0;
     4436 +
3966 4437          /* Calculate length in DWORDs */
3967 4438          dword_len = hdr_size >> 2;
3968 4439  
3969 4440          /* first pull in the header so we know the buffer length */
3970 4441          for (bi = 0; bi < dword_len; bi++) {
3971 4442                  buffer[bi] = IXGBE_READ_REG_ARRAY(hw, IXGBE_FLEX_MNG, bi);
3972      -                buffer[bi] = IXGBE_LE32_TO_CPUS(buffer[bi]);
     4443 +                IXGBE_LE32_TO_CPUS(&buffer[bi]);
3973 4444          }
3974 4445  
3975 4446          /* If there is any thing in data position pull it in */
3976 4447          buf_len = ((struct ixgbe_hic_hdr *)buffer)->buf_len;
3977 4448          if (buf_len == 0)
3978      -                goto out;
     4449 +                return 0;
3979 4450  
3980      -        if (length < (buf_len + hdr_size)) {
     4451 +        if (length < buf_len + hdr_size) {
3981 4452                  DEBUGOUT("Buffer not large enough for reply message.\n");
3982      -                ret_val = IXGBE_ERR_HOST_INTERFACE_COMMAND;
3983      -                goto out;
     4453 +                return IXGBE_ERR_HOST_INTERFACE_COMMAND;
3984 4454          }
3985 4455  
3986 4456          /* Calculate length in DWORDs, add 3 for odd lengths */
3987 4457          dword_len = (buf_len + 3) >> 2;
3988 4458  
3989      -        /* Pull in the rest of the buffer (bi is where we left off)*/
     4459 +        /* Pull in the rest of the buffer (bi is where we left off) */
3990 4460          for (; bi <= dword_len; bi++) {
3991 4461                  buffer[bi] = IXGBE_READ_REG_ARRAY(hw, IXGBE_FLEX_MNG, bi);
3992      -                buffer[bi] = IXGBE_LE32_TO_CPUS(buffer[bi]);
     4462 +                IXGBE_LE32_TO_CPUS(&buffer[bi]);
3993 4463          }
3994 4464  
3995      -out:
3996      -        return ret_val;
     4465 +        return 0;
3997 4466  }
3998 4467  
3999 4468  /**
4000 4469   *  ixgbe_set_fw_drv_ver_generic - Sends driver version to firmware
4001 4470   *  @hw: pointer to the HW structure
4002 4471   *  @maj: driver version major number
4003 4472   *  @min: driver version minor number
4004 4473   *  @build: driver version build number
4005 4474   *  @sub: driver version sub build number
4006 4475   *
↓ open down ↓ 25 lines elided ↑ open up ↑
4032 4501          fw_cmd.ver_min = min;
4033 4502          fw_cmd.ver_build = build;
4034 4503          fw_cmd.ver_sub = sub;
4035 4504          fw_cmd.hdr.checksum = 0;
4036 4505          fw_cmd.hdr.checksum = ixgbe_calculate_checksum((u8 *)&fw_cmd,
4037 4506                                  (FW_CEM_HDR_LEN + fw_cmd.hdr.buf_len));
4038 4507          fw_cmd.pad = 0;
4039 4508          fw_cmd.pad2 = 0;
4040 4509  
4041 4510          for (i = 0; i <= FW_CEM_MAX_RETRIES; i++) {
4042      -                /* LINTED */
4043 4511                  ret_val = ixgbe_host_interface_command(hw, (u32 *)&fw_cmd,
4044      -                                                       sizeof(fw_cmd));
     4512 +                                                       sizeof(fw_cmd),
     4513 +                                                       IXGBE_HI_COMMAND_TIMEOUT,
     4514 +                                                       TRUE);
4045 4515                  if (ret_val != IXGBE_SUCCESS)
4046 4516                          continue;
4047 4517  
4048 4518                  if (fw_cmd.hdr.cmd_or_resp.ret_status ==
4049 4519                      FW_CEM_RESP_STATUS_SUCCESS)
4050 4520                          ret_val = IXGBE_SUCCESS;
4051 4521                  else
4052 4522                          ret_val = IXGBE_ERR_HOST_INTERFACE_COMMAND;
4053 4523  
4054 4524                  break;
↓ open down ↓ 31 lines elided ↑ open up ↑
4086 4556          case PBA_STRATEGY_WEIGHTED:
4087 4557                  /* ixgbe_dcb_pba_80_48 strategy weight first half of packet
4088 4558                   * buffer with 5/8 of the packet buffer space.
4089 4559                   */
4090 4560                  rxpktsize = (pbsize * 5) / (num_pb * 4);
4091 4561                  pbsize -= rxpktsize * (num_pb / 2);
4092 4562                  rxpktsize <<= IXGBE_RXPBSIZE_SHIFT;
4093 4563                  for (; i < (num_pb / 2); i++)
4094 4564                          IXGBE_WRITE_REG(hw, IXGBE_RXPBSIZE(i), rxpktsize);
4095 4565                  /* Fall through to configure remaining packet buffers */
4096      -                /* FALLTHRU */
4097 4566          case PBA_STRATEGY_EQUAL:
4098 4567                  rxpktsize = (pbsize / (num_pb - i)) << IXGBE_RXPBSIZE_SHIFT;
4099 4568                  for (; i < num_pb; i++)
4100 4569                          IXGBE_WRITE_REG(hw, IXGBE_RXPBSIZE(i), rxpktsize);
4101 4570                  break;
4102 4571          default:
4103 4572                  break;
4104 4573          }
4105 4574  
4106 4575          /* Only support an equally distributed Tx packet buffer strategy. */
↓ open down ↓ 15 lines elided ↑ open up ↑
4122 4591  /**
4123 4592   * ixgbe_clear_tx_pending - Clear pending TX work from the PCIe fifo
4124 4593   * @hw: pointer to the hardware structure
4125 4594   *
4126 4595   * The 82599 and x540 MACs can experience issues if TX work is still pending
4127 4596   * when a reset occurs.  This function prevents this by flushing the PCIe
4128 4597   * buffers on the system.
4129 4598   **/
4130 4599  void ixgbe_clear_tx_pending(struct ixgbe_hw *hw)
4131 4600  {
4132      -        u32 gcr_ext, hlreg0;
     4601 +        u32 gcr_ext, hlreg0, i, poll;
     4602 +        u16 value;
4133 4603  
4134 4604          /*
4135 4605           * If double reset is not requested then all transactions should
4136 4606           * already be clear and as such there is no work to do
4137 4607           */
4138 4608          if (!(hw->mac.flags & IXGBE_FLAGS_DOUBLE_RESET_REQUIRED))
4139 4609                  return;
4140 4610  
4141 4611          /*
4142 4612           * Set loopback enable to prevent any transmits from being sent
4143 4613           * should the link come up.  This assumes that the RXCTRL.RXEN bit
4144 4614           * has already been cleared.
4145 4615           */
4146 4616          hlreg0 = IXGBE_READ_REG(hw, IXGBE_HLREG0);
4147 4617          IXGBE_WRITE_REG(hw, IXGBE_HLREG0, hlreg0 | IXGBE_HLREG0_LPBK);
4148 4618  
     4619 +        /* Wait for a last completion before clearing buffers */
     4620 +        IXGBE_WRITE_FLUSH(hw);
     4621 +        msec_delay(3);
     4622 +
     4623 +        /*
     4624 +         * Before proceeding, make sure that the PCIe block does not have
     4625 +         * transactions pending.
     4626 +         */
     4627 +        poll = ixgbe_pcie_timeout_poll(hw);
     4628 +        for (i = 0; i < poll; i++) {
     4629 +                usec_delay(100);
     4630 +                value = IXGBE_READ_PCIE_WORD(hw, IXGBE_PCI_DEVICE_STATUS);
     4631 +                if (IXGBE_REMOVED(hw->hw_addr))
     4632 +                        goto out;
     4633 +                if (!(value & IXGBE_PCI_DEVICE_STATUS_TRANSACTION_PENDING))
     4634 +                        goto out;
     4635 +        }
     4636 +
     4637 +out:
4149 4638          /* initiate cleaning flow for buffers in the PCIe transaction layer */
4150 4639          gcr_ext = IXGBE_READ_REG(hw, IXGBE_GCR_EXT);
4151 4640          IXGBE_WRITE_REG(hw, IXGBE_GCR_EXT,
4152 4641                          gcr_ext | IXGBE_GCR_EXT_BUFFERS_CLEAR);
4153 4642  
4154 4643          /* Flush all writes and allow 20usec for all transactions to clear */
4155 4644          IXGBE_WRITE_FLUSH(hw);
4156 4645          usec_delay(20);
4157 4646  
4158 4647          /* restore previous register values */
4159 4648          IXGBE_WRITE_REG(hw, IXGBE_GCR_EXT, gcr_ext);
4160 4649          IXGBE_WRITE_REG(hw, IXGBE_HLREG0, hlreg0);
4161 4650  }
4162 4651  
     4652 +
     4653 +/**
     4654 + * ixgbe_dcb_get_rtrup2tc_generic - read rtrup2tc reg
     4655 + * @hw: pointer to hardware structure
     4656 + * @map: pointer to u8 arr for returning map
     4657 + *
     4658 + * Read the rtrup2tc HW register and resolve its content into map
     4659 + **/
     4660 +void ixgbe_dcb_get_rtrup2tc_generic(struct ixgbe_hw *hw, u8 *map)
     4661 +{
     4662 +        u32 reg, i;
     4663 +
     4664 +        reg = IXGBE_READ_REG(hw, IXGBE_RTRUP2TC);
     4665 +        for (i = 0; i < IXGBE_DCB_MAX_USER_PRIORITY; i++)
     4666 +                map[i] = IXGBE_RTRUP2TC_UP_MASK &
     4667 +                        (reg >> (i * IXGBE_RTRUP2TC_UP_SHIFT));
     4668 +        return;
     4669 +}
     4670 +
     4671 +void ixgbe_disable_rx_generic(struct ixgbe_hw *hw)
     4672 +{
     4673 +        u32 pfdtxgswc;
     4674 +        u32 rxctrl;
     4675 +
     4676 +        rxctrl = IXGBE_READ_REG(hw, IXGBE_RXCTRL);
     4677 +        if (rxctrl & IXGBE_RXCTRL_RXEN) {
     4678 +                if (hw->mac.type != ixgbe_mac_82598EB) {
     4679 +                        pfdtxgswc = IXGBE_READ_REG(hw, IXGBE_PFDTXGSWC);
     4680 +                        if (pfdtxgswc & IXGBE_PFDTXGSWC_VT_LBEN) {
     4681 +                                pfdtxgswc &= ~IXGBE_PFDTXGSWC_VT_LBEN;
     4682 +                                IXGBE_WRITE_REG(hw, IXGBE_PFDTXGSWC, pfdtxgswc);
     4683 +                                hw->mac.set_lben = TRUE;
     4684 +                        } else {
     4685 +                                hw->mac.set_lben = FALSE;
     4686 +                        }
     4687 +                }
     4688 +                rxctrl &= ~IXGBE_RXCTRL_RXEN;
     4689 +                IXGBE_WRITE_REG(hw, IXGBE_RXCTRL, rxctrl);
     4690 +        }
     4691 +}
     4692 +
     4693 +void ixgbe_enable_rx_generic(struct ixgbe_hw *hw)
     4694 +{
     4695 +        u32 pfdtxgswc;
     4696 +        u32 rxctrl;
     4697 +
     4698 +        rxctrl = IXGBE_READ_REG(hw, IXGBE_RXCTRL);
     4699 +        IXGBE_WRITE_REG(hw, IXGBE_RXCTRL, (rxctrl | IXGBE_RXCTRL_RXEN));
     4700 +
     4701 +        if (hw->mac.type != ixgbe_mac_82598EB) {
     4702 +                if (hw->mac.set_lben) {
     4703 +                        pfdtxgswc = IXGBE_READ_REG(hw, IXGBE_PFDTXGSWC);
     4704 +                        pfdtxgswc |= IXGBE_PFDTXGSWC_VT_LBEN;
     4705 +                        IXGBE_WRITE_REG(hw, IXGBE_PFDTXGSWC, pfdtxgswc);
     4706 +                        hw->mac.set_lben = FALSE;
     4707 +                }
     4708 +        }
     4709 +}
     4710 +
     4711 +/**
     4712 + * ixgbe_mng_present - returns TRUE when management capability is present
     4713 + * @hw: pointer to hardware structure
     4714 + */
     4715 +bool ixgbe_mng_present(struct ixgbe_hw *hw)
     4716 +{
     4717 +        u32 fwsm;
     4718 +
     4719 +        if (hw->mac.type < ixgbe_mac_82599EB)
     4720 +                return FALSE;
     4721 +
     4722 +        fwsm = IXGBE_READ_REG(hw, IXGBE_FWSM_BY_MAC(hw));
     4723 +        fwsm &= IXGBE_FWSM_MODE_MASK;
     4724 +        return fwsm == IXGBE_FWSM_FW_MODE_PT;
     4725 +}
     4726 +
     4727 +/**
     4728 + * ixgbe_mng_enabled - Is the manageability engine enabled?
     4729 + * @hw: pointer to hardware structure
     4730 + *
     4731 + * Returns TRUE if the manageability engine is enabled.
     4732 + **/
     4733 +bool ixgbe_mng_enabled(struct ixgbe_hw *hw)
     4734 +{
     4735 +        u32 fwsm, manc, factps;
     4736 +
     4737 +        fwsm = IXGBE_READ_REG(hw, IXGBE_FWSM_BY_MAC(hw));
     4738 +        if ((fwsm & IXGBE_FWSM_MODE_MASK) != IXGBE_FWSM_FW_MODE_PT)
     4739 +                return FALSE;
     4740 +
     4741 +        manc = IXGBE_READ_REG(hw, IXGBE_MANC);
     4742 +        if (!(manc & IXGBE_MANC_RCV_TCO_EN))
     4743 +                return FALSE;
     4744 +
     4745 +        if (hw->mac.type <= ixgbe_mac_X540) {
     4746 +                factps = IXGBE_READ_REG(hw, IXGBE_FACTPS_BY_MAC(hw));
     4747 +                if (factps & IXGBE_FACTPS_MNGCG)
     4748 +                        return FALSE;
     4749 +        }
     4750 +
     4751 +        return TRUE;
     4752 +}
     4753 +
     4754 +/**
     4755 + *  ixgbe_setup_mac_link_multispeed_fiber - Set MAC link speed
     4756 + *  @hw: pointer to hardware structure
     4757 + *  @speed: new link speed
     4758 + *  @autoneg_wait_to_complete: TRUE when waiting for completion is needed
     4759 + *
     4760 + *  Set the link speed in the MAC and/or PHY register and restarts link.
     4761 + **/
     4762 +s32 ixgbe_setup_mac_link_multispeed_fiber(struct ixgbe_hw *hw,
     4763 +                                          ixgbe_link_speed speed,
     4764 +                                          bool autoneg_wait_to_complete)
     4765 +{
     4766 +        ixgbe_link_speed link_speed = IXGBE_LINK_SPEED_UNKNOWN;
     4767 +        ixgbe_link_speed highest_link_speed = IXGBE_LINK_SPEED_UNKNOWN;
     4768 +        s32 status = IXGBE_SUCCESS;
     4769 +        u32 speedcnt = 0;
     4770 +        u32 i = 0;
     4771 +        bool autoneg, link_up = FALSE;
     4772 +
     4773 +        DEBUGFUNC("ixgbe_setup_mac_link_multispeed_fiber");
     4774 +
     4775 +        /* Mask off requested but non-supported speeds */
     4776 +        status = ixgbe_get_link_capabilities(hw, &link_speed, &autoneg);
     4777 +        if (status != IXGBE_SUCCESS)
     4778 +                return status;
     4779 +
     4780 +        speed &= link_speed;
     4781 +
     4782 +        /* Try each speed one by one, highest priority first.  We do this in
     4783 +         * software because 10Gb fiber doesn't support speed autonegotiation.
     4784 +         */
     4785 +        if (speed & IXGBE_LINK_SPEED_10GB_FULL) {
     4786 +                speedcnt++;
     4787 +                highest_link_speed = IXGBE_LINK_SPEED_10GB_FULL;
     4788 +
     4789 +                /* If we already have link at this speed, just jump out */
     4790 +                status = ixgbe_check_link(hw, &link_speed, &link_up, FALSE);
     4791 +                if (status != IXGBE_SUCCESS)
     4792 +                        return status;
     4793 +
     4794 +                if ((link_speed == IXGBE_LINK_SPEED_10GB_FULL) && link_up)
     4795 +                        goto out;
     4796 +
     4797 +                /* Set the module link speed */
     4798 +                switch (hw->phy.media_type) {
     4799 +                case ixgbe_media_type_fiber_fixed:
     4800 +                case ixgbe_media_type_fiber:
     4801 +                        ixgbe_set_rate_select_speed(hw,
     4802 +                                                    IXGBE_LINK_SPEED_10GB_FULL);
     4803 +                        break;
     4804 +                case ixgbe_media_type_fiber_qsfp:
     4805 +                        /* QSFP module automatically detects MAC link speed */
     4806 +                        break;
     4807 +                default:
     4808 +                        DEBUGOUT("Unexpected media type.\n");
     4809 +                        break;
     4810 +                }
     4811 +
     4812 +                /* Allow module to change analog characteristics (1G->10G) */
     4813 +                msec_delay(40);
     4814 +
     4815 +                status = ixgbe_setup_mac_link(hw,
     4816 +                                              IXGBE_LINK_SPEED_10GB_FULL,
     4817 +                                              autoneg_wait_to_complete);
     4818 +                if (status != IXGBE_SUCCESS)
     4819 +                        return status;
     4820 +
     4821 +                /* Flap the Tx laser if it has not already been done */
     4822 +                ixgbe_flap_tx_laser(hw);
     4823 +
     4824 +                /* Wait for the controller to acquire link.  Per IEEE 802.3ap,
     4825 +                 * Section 73.10.2, we may have to wait up to 500ms if KR is
     4826 +                 * attempted.  82599 uses the same timing for 10g SFI.
     4827 +                 */
     4828 +                for (i = 0; i < 5; i++) {
     4829 +                        /* Wait for the link partner to also set speed */
     4830 +                        msec_delay(100);
     4831 +
     4832 +                        /* If we have link, just jump out */
     4833 +                        status = ixgbe_check_link(hw, &link_speed,
     4834 +                                                  &link_up, FALSE);
     4835 +                        if (status != IXGBE_SUCCESS)
     4836 +                                return status;
     4837 +
     4838 +                        if (link_up)
     4839 +                                goto out;
     4840 +                }
     4841 +        }
     4842 +
     4843 +        if (speed & IXGBE_LINK_SPEED_1GB_FULL) {
     4844 +                speedcnt++;
     4845 +                if (highest_link_speed == IXGBE_LINK_SPEED_UNKNOWN)
     4846 +                        highest_link_speed = IXGBE_LINK_SPEED_1GB_FULL;
     4847 +
     4848 +                /* If we already have link at this speed, just jump out */
     4849 +                status = ixgbe_check_link(hw, &link_speed, &link_up, FALSE);
     4850 +                if (status != IXGBE_SUCCESS)
     4851 +                        return status;
     4852 +
     4853 +                if ((link_speed == IXGBE_LINK_SPEED_1GB_FULL) && link_up)
     4854 +                        goto out;
     4855 +
     4856 +                /* Set the module link speed */
     4857 +                switch (hw->phy.media_type) {
     4858 +                case ixgbe_media_type_fiber_fixed:
     4859 +                case ixgbe_media_type_fiber:
     4860 +                        ixgbe_set_rate_select_speed(hw,
     4861 +                                                    IXGBE_LINK_SPEED_1GB_FULL);
     4862 +                        break;
     4863 +                case ixgbe_media_type_fiber_qsfp:
     4864 +                        /* QSFP module automatically detects link speed */
     4865 +                        break;
     4866 +                default:
     4867 +                        DEBUGOUT("Unexpected media type.\n");
     4868 +                        break;
     4869 +                }
     4870 +
     4871 +                /* Allow module to change analog characteristics (10G->1G) */
     4872 +                msec_delay(40);
     4873 +
     4874 +                status = ixgbe_setup_mac_link(hw,
     4875 +                                              IXGBE_LINK_SPEED_1GB_FULL,
     4876 +                                              autoneg_wait_to_complete);
     4877 +                if (status != IXGBE_SUCCESS)
     4878 +                        return status;
     4879 +
     4880 +                /* Flap the Tx laser if it has not already been done */
     4881 +                ixgbe_flap_tx_laser(hw);
     4882 +
     4883 +                /* Wait for the link partner to also set speed */
     4884 +                msec_delay(100);
     4885 +
     4886 +                /* If we have link, just jump out */
     4887 +                status = ixgbe_check_link(hw, &link_speed, &link_up, FALSE);
     4888 +                if (status != IXGBE_SUCCESS)
     4889 +                        return status;
     4890 +
     4891 +                if (link_up)
     4892 +                        goto out;
     4893 +        }
     4894 +
     4895 +        /* We didn't get link.  Configure back to the highest speed we tried,
     4896 +         * (if there was more than one).  We call ourselves back with just the
     4897 +         * single highest speed that the user requested.
     4898 +         */
     4899 +        if (speedcnt > 1)
     4900 +                status = ixgbe_setup_mac_link_multispeed_fiber(hw,
     4901 +                                                      highest_link_speed,
     4902 +                                                      autoneg_wait_to_complete);
     4903 +
     4904 +out:
     4905 +        /* Set autoneg_advertised value based on input link speed */
     4906 +        hw->phy.autoneg_advertised = 0;
     4907 +
     4908 +        if (speed & IXGBE_LINK_SPEED_10GB_FULL)
     4909 +                hw->phy.autoneg_advertised |= IXGBE_LINK_SPEED_10GB_FULL;
     4910 +
     4911 +        if (speed & IXGBE_LINK_SPEED_1GB_FULL)
     4912 +                hw->phy.autoneg_advertised |= IXGBE_LINK_SPEED_1GB_FULL;
     4913 +
     4914 +        return status;
     4915 +}
     4916 +
     4917 +/**
     4918 + *  ixgbe_set_soft_rate_select_speed - Set module link speed
     4919 + *  @hw: pointer to hardware structure
     4920 + *  @speed: link speed to set
     4921 + *
     4922 + *  Set module link speed via the soft rate select.
     4923 + */
     4924 +void ixgbe_set_soft_rate_select_speed(struct ixgbe_hw *hw,
     4925 +                                        ixgbe_link_speed speed)
     4926 +{
     4927 +        s32 status;
     4928 +        u8 rs, eeprom_data;
     4929 +
     4930 +        switch (speed) {
     4931 +        case IXGBE_LINK_SPEED_10GB_FULL:
     4932 +                /* one bit mask same as setting on */
     4933 +                rs = IXGBE_SFF_SOFT_RS_SELECT_10G;
     4934 +                break;
     4935 +        case IXGBE_LINK_SPEED_1GB_FULL:
     4936 +                rs = IXGBE_SFF_SOFT_RS_SELECT_1G;
     4937 +                break;
     4938 +        default:
     4939 +                DEBUGOUT("Invalid fixed module speed\n");
     4940 +                return;
     4941 +        }
     4942 +
     4943 +        /* Set RS0 */
     4944 +        status = hw->phy.ops.read_i2c_byte(hw, IXGBE_SFF_SFF_8472_OSCB,
     4945 +                                           IXGBE_I2C_EEPROM_DEV_ADDR2,
     4946 +                                           &eeprom_data);
     4947 +        if (status) {
     4948 +                DEBUGOUT("Failed to read Rx Rate Select RS0\n");
     4949 +                goto out;
     4950 +        }
     4951 +
     4952 +        eeprom_data = (eeprom_data & ~IXGBE_SFF_SOFT_RS_SELECT_MASK) | rs;
     4953 +
     4954 +        status = hw->phy.ops.write_i2c_byte(hw, IXGBE_SFF_SFF_8472_OSCB,
     4955 +                                            IXGBE_I2C_EEPROM_DEV_ADDR2,
     4956 +                                            eeprom_data);
     4957 +        if (status) {
     4958 +                DEBUGOUT("Failed to write Rx Rate Select RS0\n");
     4959 +                goto out;
     4960 +        }
     4961 +
     4962 +        /* Set RS1 */
     4963 +        status = hw->phy.ops.read_i2c_byte(hw, IXGBE_SFF_SFF_8472_ESCB,
     4964 +                                           IXGBE_I2C_EEPROM_DEV_ADDR2,
     4965 +                                           &eeprom_data);
     4966 +        if (status) {
     4967 +                DEBUGOUT("Failed to read Rx Rate Select RS1\n");
     4968 +                goto out;
     4969 +        }
     4970 +
     4971 +        eeprom_data = (eeprom_data & ~IXGBE_SFF_SOFT_RS_SELECT_MASK) | rs;
     4972 +
     4973 +        status = hw->phy.ops.write_i2c_byte(hw, IXGBE_SFF_SFF_8472_ESCB,
     4974 +                                            IXGBE_I2C_EEPROM_DEV_ADDR2,
     4975 +                                            eeprom_data);
     4976 +        if (status) {
     4977 +                DEBUGOUT("Failed to write Rx Rate Select RS1\n");
     4978 +                goto out;
     4979 +        }
     4980 +out:
     4981 +        return;
     4982 +}
    
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX