LCOV - code coverage report
Current view: top level - drivers/net/ixgbe/base - ixgbe_82599.c (source / functions) Hit Total Coverage
Test: Code coverage Lines: 0 977 0.0 %
Date: 2025-01-02 22:41:34 Functions: 0 44 0.0 %
Legend: Lines: hit not hit | Branches: + taken - not taken # not executed Branches: 0 581 0.0 %

           Branch data     Line data    Source code
       1                 :            : /* SPDX-License-Identifier: BSD-3-Clause
       2                 :            :  * Copyright(c) 2001-2024 Intel Corporation
       3                 :            :  */
       4                 :            : 
       5                 :            : #include "ixgbe_type.h"
       6                 :            : #include "ixgbe_82599.h"
       7                 :            : #include "ixgbe_api.h"
       8                 :            : #include "ixgbe_common.h"
       9                 :            : #include "ixgbe_phy.h"
      10                 :            : 
      11                 :            : #define IXGBE_82599_MAX_TX_QUEUES 128
      12                 :            : #define IXGBE_82599_MAX_RX_QUEUES 128
      13                 :            : #define IXGBE_82599_RAR_ENTRIES   128
      14                 :            : #define IXGBE_82599_MC_TBL_SIZE   128
      15                 :            : #define IXGBE_82599_VFT_TBL_SIZE  128
      16                 :            : #define IXGBE_82599_RX_PB_SIZE    512
      17                 :            : 
      18                 :            : STATIC s32 ixgbe_setup_copper_link_82599(struct ixgbe_hw *hw,
      19                 :            :                                          ixgbe_link_speed speed,
      20                 :            :                                          bool autoneg_wait_to_complete);
      21                 :            : STATIC s32 ixgbe_verify_fw_version_82599(struct ixgbe_hw *hw);
      22                 :            : STATIC s32 ixgbe_read_eeprom_82599(struct ixgbe_hw *hw,
      23                 :            :                                    u16 offset, u16 *data);
      24                 :            : STATIC s32 ixgbe_read_eeprom_buffer_82599(struct ixgbe_hw *hw, u16 offset,
      25                 :            :                                           u16 words, u16 *data);
      26                 :            : STATIC s32 ixgbe_read_i2c_byte_82599(struct ixgbe_hw *hw, u8 byte_offset,
      27                 :            :                                         u8 dev_addr, u8 *data);
      28                 :            : STATIC s32 ixgbe_write_i2c_byte_82599(struct ixgbe_hw *hw, u8 byte_offset,
      29                 :            :                                         u8 dev_addr, u8 data);
      30                 :            : 
      31                 :          0 : void ixgbe_init_mac_link_ops_82599(struct ixgbe_hw *hw)
      32                 :            : {
      33                 :            :         struct ixgbe_mac_info *mac = &hw->mac;
      34                 :            : 
      35                 :          0 :         DEBUGFUNC("ixgbe_init_mac_link_ops_82599");
      36                 :            : 
      37                 :            :         /*
      38                 :            :          * enable the laser control functions for SFP+ fiber
      39                 :            :          * and MNG not enabled
      40                 :            :          */
      41   [ #  #  #  # ]:          0 :         if ((mac->ops.get_media_type(hw) == ixgbe_media_type_fiber) &&
      42                 :          0 :             !ixgbe_mng_enabled(hw)) {
      43                 :          0 :                 mac->ops.disable_tx_laser =
      44                 :            :                                        ixgbe_disable_tx_laser_multispeed_fiber;
      45                 :          0 :                 mac->ops.enable_tx_laser =
      46                 :            :                                         ixgbe_enable_tx_laser_multispeed_fiber;
      47                 :          0 :                 mac->ops.flap_tx_laser = ixgbe_flap_tx_laser_multispeed_fiber;
      48                 :            : 
      49                 :            :         } else {
      50                 :          0 :                 mac->ops.disable_tx_laser = NULL;
      51                 :          0 :                 mac->ops.enable_tx_laser = NULL;
      52                 :          0 :                 mac->ops.flap_tx_laser = NULL;
      53                 :            :         }
      54                 :            : 
      55         [ #  # ]:          0 :         if (hw->phy.multispeed_fiber) {
      56                 :            :                 /* Set up dual speed SFP+ support */
      57                 :          0 :                 mac->ops.setup_link = ixgbe_setup_mac_link_multispeed_fiber;
      58                 :          0 :                 mac->ops.setup_mac_link = ixgbe_setup_mac_link_82599;
      59                 :          0 :                 mac->ops.set_rate_select_speed =
      60                 :            :                                                ixgbe_set_hard_rate_select_speed;
      61                 :            :         } else {
      62         [ #  # ]:          0 :                 if ((ixgbe_get_media_type(hw) == ixgbe_media_type_backplane) &&
      63         [ #  # ]:          0 :                      (hw->phy.smart_speed == ixgbe_smart_speed_auto ||
      64         [ #  # ]:          0 :                       hw->phy.smart_speed == ixgbe_smart_speed_on) &&
      65                 :          0 :                       !ixgbe_verify_lesm_fw_enabled_82599(hw)) {
      66                 :          0 :                         mac->ops.setup_link = ixgbe_setup_mac_link_smartspeed;
      67                 :            :                 } else {
      68                 :          0 :                         mac->ops.setup_link = ixgbe_setup_mac_link_82599;
      69                 :            :                 }
      70                 :            :         }
      71                 :          0 : }
      72                 :            : 
      73                 :            : /**
      74                 :            :  * ixgbe_init_phy_ops_82599 - PHY/SFP specific init
      75                 :            :  * @hw: pointer to hardware structure
      76                 :            :  *
      77                 :            :  * Initialize any function pointers that were not able to be
      78                 :            :  * set during init_shared_code because the PHY/SFP type was
      79                 :            :  * not known.  Perform the SFP init if necessary.
      80                 :            :  *
      81                 :            :  **/
      82                 :          0 : s32 ixgbe_init_phy_ops_82599(struct ixgbe_hw *hw)
      83                 :            : {
      84                 :            :         struct ixgbe_mac_info *mac = &hw->mac;
      85                 :            :         struct ixgbe_phy_info *phy = &hw->phy;
      86                 :            :         s32 ret_val = IXGBE_SUCCESS;
      87                 :            :         u32 esdp;
      88                 :            : 
      89                 :          0 :         DEBUGFUNC("ixgbe_init_phy_ops_82599");
      90                 :            : 
      91         [ #  # ]:          0 :         if (hw->device_id == IXGBE_DEV_ID_82599_QSFP_SF_QP) {
      92                 :            :                 /* Store flag indicating I2C bus access control unit. */
      93                 :          0 :                 hw->phy.qsfp_shared_i2c_bus = TRUE;
      94                 :            : 
      95                 :            :                 /* Initialize access to QSFP+ I2C bus */
      96                 :          0 :                 esdp = IXGBE_READ_REG(hw, IXGBE_ESDP);
      97                 :            :                 esdp |= IXGBE_ESDP_SDP0_DIR;
      98                 :            :                 esdp &= ~IXGBE_ESDP_SDP1_DIR;
      99                 :            :                 esdp &= ~IXGBE_ESDP_SDP0;
     100                 :            :                 esdp &= ~IXGBE_ESDP_SDP0_NATIVE;
     101                 :          0 :                 esdp &= ~IXGBE_ESDP_SDP1_NATIVE;
     102                 :          0 :                 IXGBE_WRITE_REG(hw, IXGBE_ESDP, esdp);
     103                 :          0 :                 IXGBE_WRITE_FLUSH(hw);
     104                 :            : 
     105                 :          0 :                 phy->ops.read_i2c_byte = ixgbe_read_i2c_byte_82599;
     106                 :          0 :                 phy->ops.write_i2c_byte = ixgbe_write_i2c_byte_82599;
     107                 :            :         }
     108                 :            :         /* Identify the PHY or SFP module */
     109                 :          0 :         ret_val = phy->ops.identify(hw);
     110         [ #  # ]:          0 :         if (ret_val == IXGBE_ERR_SFP_NOT_SUPPORTED)
     111                 :          0 :                 goto init_phy_ops_out;
     112                 :            : 
     113                 :            :         /* Setup function pointers based on detected SFP module and speeds */
     114                 :          0 :         ixgbe_init_mac_link_ops_82599(hw);
     115         [ #  # ]:          0 :         if (hw->phy.sfp_type != ixgbe_sfp_type_unknown)
     116                 :          0 :                 hw->phy.ops.reset = NULL;
     117                 :            : 
     118                 :            :         /* If copper media, overwrite with copper function pointers */
     119         [ #  # ]:          0 :         if (mac->ops.get_media_type(hw) == ixgbe_media_type_copper) {
     120                 :          0 :                 mac->ops.setup_link = ixgbe_setup_copper_link_82599;
     121                 :          0 :                 mac->ops.get_link_capabilities =
     122                 :            :                                   ixgbe_get_copper_link_capabilities_generic;
     123                 :            :         }
     124                 :            : 
     125                 :            :         /* Set necessary function pointers based on PHY type */
     126         [ #  # ]:          0 :         switch (hw->phy.type) {
     127                 :          0 :         case ixgbe_phy_tn:
     128                 :          0 :                 phy->ops.setup_link = ixgbe_setup_phy_link_tnx;
     129                 :          0 :                 phy->ops.check_link = ixgbe_check_phy_link_tnx;
     130                 :          0 :                 phy->ops.get_firmware_version =
     131                 :            :                              ixgbe_get_phy_firmware_version_tnx;
     132                 :          0 :                 break;
     133                 :            :         default:
     134                 :            :                 break;
     135                 :            :         }
     136                 :          0 : init_phy_ops_out:
     137                 :          0 :         return ret_val;
     138                 :            : }
     139                 :            : 
     140                 :          0 : s32 ixgbe_setup_sfp_modules_82599(struct ixgbe_hw *hw)
     141                 :            : {
     142                 :            :         s32 ret_val = IXGBE_SUCCESS;
     143                 :            :         u16 list_offset, data_offset, data_value;
     144                 :            : 
     145                 :          0 :         DEBUGFUNC("ixgbe_setup_sfp_modules_82599");
     146                 :            : 
     147         [ #  # ]:          0 :         if (hw->phy.sfp_type != ixgbe_sfp_type_unknown) {
     148                 :          0 :                 ixgbe_init_mac_link_ops_82599(hw);
     149                 :            : 
     150                 :          0 :                 hw->phy.ops.reset = NULL;
     151                 :            : 
     152                 :          0 :                 ret_val = ixgbe_get_sfp_init_sequence_offsets(hw, &list_offset,
     153                 :            :                                                               &data_offset);
     154         [ #  # ]:          0 :                 if (ret_val != IXGBE_SUCCESS)
     155                 :          0 :                         goto setup_sfp_out;
     156                 :            : 
     157                 :            :                 /* PHY config will finish before releasing the semaphore */
     158                 :          0 :                 ret_val = hw->mac.ops.acquire_swfw_sync(hw,
     159                 :            :                                                         IXGBE_GSSR_MAC_CSR_SM);
     160         [ #  # ]:          0 :                 if (ret_val != IXGBE_SUCCESS) {
     161                 :            :                         ret_val = IXGBE_ERR_SWFW_SYNC;
     162                 :          0 :                         goto setup_sfp_out;
     163                 :            :                 }
     164                 :            : 
     165         [ #  # ]:          0 :                 if (hw->eeprom.ops.read(hw, ++data_offset, &data_value))
     166                 :          0 :                         goto setup_sfp_err;
     167         [ #  # ]:          0 :                 while (data_value != 0xffff) {
     168                 :          0 :                         IXGBE_WRITE_REG(hw, IXGBE_CORECTL, data_value);
     169                 :          0 :                         IXGBE_WRITE_FLUSH(hw);
     170         [ #  # ]:          0 :                         if (hw->eeprom.ops.read(hw, ++data_offset, &data_value))
     171                 :          0 :                                 goto setup_sfp_err;
     172                 :            :                 }
     173                 :            : 
     174                 :            :                 /* Release the semaphore */
     175                 :          0 :                 hw->mac.ops.release_swfw_sync(hw, IXGBE_GSSR_MAC_CSR_SM);
     176                 :            :                 /* Delay obtaining semaphore again to allow FW access
     177                 :            :                  * prot_autoc_write uses the semaphore too.
     178                 :            :                  */
     179                 :          0 :                 msec_delay(hw->eeprom.semaphore_delay);
     180                 :            : 
     181                 :            :                 /* Restart DSP and set SFI mode */
     182                 :          0 :                 ret_val = hw->mac.ops.prot_autoc_write(hw,
     183                 :          0 :                         hw->mac.orig_autoc | IXGBE_AUTOC_LMS_10G_SERIAL,
     184                 :            :                         false);
     185                 :            : 
     186         [ #  # ]:          0 :                 if (ret_val) {
     187                 :          0 :                         DEBUGOUT("sfp module setup not complete\n");
     188                 :            :                         ret_val = IXGBE_ERR_SFP_SETUP_NOT_COMPLETE;
     189                 :          0 :                         goto setup_sfp_out;
     190                 :            :                 }
     191                 :            : 
     192                 :            :         }
     193                 :            : 
     194                 :          0 : setup_sfp_out:
     195                 :            :         return ret_val;
     196                 :            : 
     197                 :          0 : setup_sfp_err:
     198                 :            :         /* Release the semaphore */
     199                 :          0 :         hw->mac.ops.release_swfw_sync(hw, IXGBE_GSSR_MAC_CSR_SM);
     200                 :            :         /* Delay obtaining semaphore again to allow FW access */
     201                 :          0 :         msec_delay(hw->eeprom.semaphore_delay);
     202                 :          0 :         ERROR_REPORT2(IXGBE_ERROR_INVALID_STATE,
     203                 :            :                       "eeprom read at offset %d failed", data_offset);
     204                 :          0 :         return IXGBE_ERR_PHY;
     205                 :            : }
     206                 :            : 
     207                 :            : /**
     208                 :            :  * prot_autoc_read_82599 - Hides MAC differences needed for AUTOC read
     209                 :            :  * @hw: pointer to hardware structure
     210                 :            :  * @locked: Return the if we locked for this read.
     211                 :            :  * @reg_val: Value we read from AUTOC
     212                 :            :  *
     213                 :            :  * For this part (82599) we need to wrap read-modify-writes with a possible
     214                 :            :  * FW/SW lock.  It is assumed this lock will be freed with the next
     215                 :            :  * prot_autoc_write_82599().
     216                 :            :  */
     217                 :          0 : s32 prot_autoc_read_82599(struct ixgbe_hw *hw, bool *locked, u32 *reg_val)
     218                 :            : {
     219                 :            :         s32 ret_val;
     220                 :            : 
     221                 :          0 :         *locked = false;
     222                 :            :          /* If LESM is on then we need to hold the SW/FW semaphore. */
     223         [ #  # ]:          0 :         if (ixgbe_verify_lesm_fw_enabled_82599(hw)) {
     224                 :          0 :                 ret_val = hw->mac.ops.acquire_swfw_sync(hw,
     225                 :            :                                         IXGBE_GSSR_MAC_CSR_SM);
     226         [ #  # ]:          0 :                 if (ret_val != IXGBE_SUCCESS)
     227                 :            :                         return IXGBE_ERR_SWFW_SYNC;
     228                 :            : 
     229                 :          0 :                 *locked = true;
     230                 :            :         }
     231                 :            : 
     232                 :          0 :         *reg_val = IXGBE_READ_REG(hw, IXGBE_AUTOC);
     233                 :          0 :         return IXGBE_SUCCESS;
     234                 :            : }
     235                 :            : 
     236                 :            : /**
     237                 :            :  * prot_autoc_write_82599 - Hides MAC differences needed for AUTOC write
     238                 :            :  * @hw: pointer to hardware structure
     239                 :            :  * @autoc: value to write to AUTOC
     240                 :            :  * @locked: bool to indicate whether the SW/FW lock was already taken by
     241                 :            :  *          previous proc_autoc_read_82599.
     242                 :            :  *
     243                 :            :  * This part (82599) may need to hold the SW/FW lock around all writes to
     244                 :            :  * AUTOC. Likewise after a write we need to do a pipeline reset.
     245                 :            :  */
     246                 :          0 : s32 prot_autoc_write_82599(struct ixgbe_hw *hw, u32 autoc, bool locked)
     247                 :            : {
     248                 :            :         s32 ret_val = IXGBE_SUCCESS;
     249                 :            : 
     250                 :            :         /* Blocked by MNG FW so bail */
     251         [ #  # ]:          0 :         if (ixgbe_check_reset_blocked(hw))
     252                 :          0 :                 goto out;
     253                 :            : 
     254                 :            :         /* We only need to get the lock if:
     255                 :            :          *  - We didn't do it already (in the read part of a read-modify-write)
     256                 :            :          *  - LESM is enabled.
     257                 :            :          */
     258   [ #  #  #  # ]:          0 :         if (!locked && ixgbe_verify_lesm_fw_enabled_82599(hw)) {
     259                 :          0 :                 ret_val = hw->mac.ops.acquire_swfw_sync(hw,
     260                 :            :                                         IXGBE_GSSR_MAC_CSR_SM);
     261         [ #  # ]:          0 :                 if (ret_val != IXGBE_SUCCESS)
     262                 :            :                         return IXGBE_ERR_SWFW_SYNC;
     263                 :            : 
     264                 :            :                 locked = true;
     265                 :            :         }
     266                 :            : 
     267                 :          0 :         IXGBE_WRITE_REG(hw, IXGBE_AUTOC, autoc);
     268                 :          0 :         ret_val = ixgbe_reset_pipeline_82599(hw);
     269                 :            : 
     270                 :          0 : out:
     271                 :            :         /* Free the SW/FW semaphore as we either grabbed it here or
     272                 :            :          * already had it when this function was called.
     273                 :            :          */
     274         [ #  # ]:          0 :         if (locked)
     275                 :          0 :                 hw->mac.ops.release_swfw_sync(hw, IXGBE_GSSR_MAC_CSR_SM);
     276                 :            : 
     277                 :            :         return ret_val;
     278                 :            : }
     279                 :            : 
     280                 :            : /**
     281                 :            :  * ixgbe_init_ops_82599 - Inits func ptrs and MAC type
     282                 :            :  * @hw: pointer to hardware structure
     283                 :            :  *
     284                 :            :  * Initialize the function pointers and assign the MAC type for 82599.
     285                 :            :  * Does not touch the hardware.
     286                 :            :  **/
     287                 :            : 
     288                 :          0 : s32 ixgbe_init_ops_82599(struct ixgbe_hw *hw)
     289                 :            : {
     290                 :            :         struct ixgbe_mac_info *mac = &hw->mac;
     291                 :            :         struct ixgbe_phy_info *phy = &hw->phy;
     292                 :            :         struct ixgbe_eeprom_info *eeprom = &hw->eeprom;
     293                 :            :         s32 ret_val;
     294                 :            :         u16 i;
     295                 :            : 
     296                 :          0 :         DEBUGFUNC("ixgbe_init_ops_82599");
     297                 :            : 
     298                 :          0 :         ixgbe_init_phy_ops_generic(hw);
     299                 :          0 :         ret_val = ixgbe_init_ops_generic(hw);
     300                 :            : 
     301                 :            :         /* PHY */
     302                 :          0 :         phy->ops.identify = ixgbe_identify_phy_82599;
     303                 :          0 :         phy->ops.init = ixgbe_init_phy_ops_82599;
     304                 :            : 
     305                 :            :         /* MAC */
     306                 :          0 :         mac->ops.reset_hw = ixgbe_reset_hw_82599;
     307                 :          0 :         mac->ops.enable_relaxed_ordering = ixgbe_enable_relaxed_ordering_gen2;
     308                 :          0 :         mac->ops.get_media_type = ixgbe_get_media_type_82599;
     309                 :          0 :         mac->ops.get_supported_physical_layer =
     310                 :            :                                     ixgbe_get_supported_physical_layer_82599;
     311                 :          0 :         mac->ops.disable_sec_rx_path = ixgbe_disable_sec_rx_path_generic;
     312                 :          0 :         mac->ops.enable_sec_rx_path = ixgbe_enable_sec_rx_path_generic;
     313                 :          0 :         mac->ops.enable_rx_dma = ixgbe_enable_rx_dma_82599;
     314                 :          0 :         mac->ops.read_analog_reg8 = ixgbe_read_analog_reg8_82599;
     315                 :          0 :         mac->ops.write_analog_reg8 = ixgbe_write_analog_reg8_82599;
     316                 :          0 :         mac->ops.start_hw = ixgbe_start_hw_82599;
     317                 :          0 :         mac->ops.get_san_mac_addr = ixgbe_get_san_mac_addr_generic;
     318                 :          0 :         mac->ops.set_san_mac_addr = ixgbe_set_san_mac_addr_generic;
     319                 :          0 :         mac->ops.get_device_caps = ixgbe_get_device_caps_generic;
     320                 :          0 :         mac->ops.get_wwn_prefix = ixgbe_get_wwn_prefix_generic;
     321                 :          0 :         mac->ops.get_fcoe_boot_status = ixgbe_get_fcoe_boot_status_generic;
     322                 :          0 :         mac->ops.prot_autoc_read = prot_autoc_read_82599;
     323                 :          0 :         mac->ops.prot_autoc_write = prot_autoc_write_82599;
     324                 :            : 
     325                 :            :         /* RAR, Multicast, VLAN */
     326                 :          0 :         mac->ops.set_vmdq = ixgbe_set_vmdq_generic;
     327                 :          0 :         mac->ops.set_vmdq_san_mac = ixgbe_set_vmdq_san_mac_generic;
     328                 :          0 :         mac->ops.clear_vmdq = ixgbe_clear_vmdq_generic;
     329                 :          0 :         mac->ops.insert_mac_addr = ixgbe_insert_mac_addr_generic;
     330                 :          0 :         mac->rar_highwater = 1;
     331                 :          0 :         mac->ops.set_vfta = ixgbe_set_vfta_generic;
     332                 :          0 :         mac->ops.set_vlvf = ixgbe_set_vlvf_generic;
     333                 :          0 :         mac->ops.clear_vfta = ixgbe_clear_vfta_generic;
     334                 :          0 :         mac->ops.init_uta_tables = ixgbe_init_uta_tables_generic;
     335                 :          0 :         mac->ops.setup_sfp = ixgbe_setup_sfp_modules_82599;
     336                 :          0 :         mac->ops.set_mac_anti_spoofing = ixgbe_set_mac_anti_spoofing;
     337                 :          0 :         mac->ops.set_vlan_anti_spoofing = ixgbe_set_vlan_anti_spoofing;
     338                 :            : 
     339                 :            :         /* Link */
     340                 :          0 :         mac->ops.get_link_capabilities = ixgbe_get_link_capabilities_82599;
     341                 :          0 :         mac->ops.check_link = ixgbe_check_mac_link_generic;
     342                 :          0 :         mac->ops.setup_rxpba = ixgbe_set_rxpba_generic;
     343                 :          0 :         ixgbe_init_mac_link_ops_82599(hw);
     344                 :            : 
     345                 :          0 :         mac->mcft_size               = IXGBE_82599_MC_TBL_SIZE;
     346                 :          0 :         mac->vft_size                = IXGBE_82599_VFT_TBL_SIZE;
     347                 :          0 :         mac->num_rar_entries = IXGBE_82599_RAR_ENTRIES;
     348                 :          0 :         mac->rx_pb_size              = IXGBE_82599_RX_PB_SIZE;
     349                 :          0 :         mac->max_rx_queues   = IXGBE_82599_MAX_RX_QUEUES;
     350                 :          0 :         mac->max_tx_queues   = IXGBE_82599_MAX_TX_QUEUES;
     351                 :          0 :         mac->max_msix_vectors        = ixgbe_get_pcie_msix_count_generic(hw);
     352                 :            : 
     353                 :          0 :         mac->arc_subsystem_valid = !!(IXGBE_READ_REG(hw, IXGBE_FWSM_BY_MAC(hw))
     354                 :          0 :                                       & IXGBE_FWSM_MODE_MASK);
     355                 :            : 
     356         [ #  # ]:          0 :         for (i = 0; i < 64; i++)
     357                 :          0 :                 hw->mbx.ops[i].init_params = ixgbe_init_mbx_params_pf;
     358                 :            : 
     359                 :            :         /* EEPROM */
     360                 :          0 :         eeprom->ops.read = ixgbe_read_eeprom_82599;
     361                 :          0 :         eeprom->ops.read_buffer = ixgbe_read_eeprom_buffer_82599;
     362                 :            : 
     363                 :            :         /* Manageability interface */
     364                 :          0 :         mac->ops.set_fw_drv_ver = ixgbe_set_fw_drv_ver_generic;
     365                 :            : 
     366                 :          0 :         mac->ops.get_thermal_sensor_data =
     367                 :            :                                          ixgbe_get_thermal_sensor_data_generic;
     368                 :          0 :         mac->ops.init_thermal_sensor_thresh =
     369                 :            :                                       ixgbe_init_thermal_sensor_thresh_generic;
     370                 :            : 
     371                 :          0 :         mac->ops.get_rtrup2tc = ixgbe_dcb_get_rtrup2tc_generic;
     372                 :            : 
     373                 :          0 :         return ret_val;
     374                 :            : }
     375                 :            : 
     376                 :            : /**
     377                 :            :  * ixgbe_get_link_capabilities_82599 - Determines link capabilities
     378                 :            :  * @hw: pointer to hardware structure
     379                 :            :  * @speed: pointer to link speed
     380                 :            :  * @autoneg: true when autoneg or autotry is enabled
     381                 :            :  *
     382                 :            :  * Determines the link capabilities by reading the AUTOC register.
     383                 :            :  **/
     384                 :          0 : s32 ixgbe_get_link_capabilities_82599(struct ixgbe_hw *hw,
     385                 :            :                                       ixgbe_link_speed *speed,
     386                 :            :                                       bool *autoneg)
     387                 :            : {
     388                 :            :         s32 status = IXGBE_SUCCESS;
     389                 :            :         u32 autoc = 0;
     390                 :            : 
     391                 :          0 :         DEBUGFUNC("ixgbe_get_link_capabilities_82599");
     392                 :            : 
     393                 :            : 
     394                 :            :         /* Check if 1G SFP module. */
     395                 :          0 :         if (hw->phy.sfp_type == ixgbe_sfp_type_1g_cu_core0 ||
     396         [ #  # ]:          0 :             hw->phy.sfp_type == ixgbe_sfp_type_1g_cu_core1 ||
     397         [ #  # ]:          0 :             hw->phy.sfp_type == ixgbe_sfp_type_1g_lha_core0 ||
     398         [ #  # ]:          0 :             hw->phy.sfp_type == ixgbe_sfp_type_1g_lha_core1 ||
     399         [ #  # ]:          0 :             hw->phy.sfp_type == ixgbe_sfp_type_1g_lx_core0 ||
     400         [ #  # ]:          0 :             hw->phy.sfp_type == ixgbe_sfp_type_1g_lx_core1 ||
     401         [ #  # ]:          0 :             hw->phy.sfp_type == ixgbe_sfp_type_1g_sx_core0 ||
     402                 :            :             hw->phy.sfp_type == ixgbe_sfp_type_1g_sx_core1) {
     403                 :          0 :                 *speed = IXGBE_LINK_SPEED_1GB_FULL;
     404                 :          0 :                 *autoneg = true;
     405                 :          0 :                 goto out;
     406                 :            :         }
     407                 :            : 
     408                 :            :         /*
     409                 :            :          * Determine link capabilities based on the stored value of AUTOC,
     410                 :            :          * which represents EEPROM defaults.  If AUTOC value has not
     411                 :            :          * been stored, use the current register values.
     412                 :            :          */
     413         [ #  # ]:          0 :         if (hw->mac.orig_link_settings_stored)
     414                 :          0 :                 autoc = hw->mac.orig_autoc;
     415                 :            :         else
     416                 :          0 :                 autoc = IXGBE_READ_REG(hw, IXGBE_AUTOC);
     417                 :            : 
     418   [ #  #  #  #  :          0 :         switch (autoc & IXGBE_AUTOC_LMS_MASK) {
             #  #  #  # ]
     419                 :          0 :         case IXGBE_AUTOC_LMS_1G_LINK_NO_AN:
     420                 :          0 :                 *speed = IXGBE_LINK_SPEED_1GB_FULL;
     421                 :          0 :                 *autoneg = false;
     422                 :          0 :                 break;
     423                 :            : 
     424                 :          0 :         case IXGBE_AUTOC_LMS_10G_LINK_NO_AN:
     425                 :          0 :                 *speed = IXGBE_LINK_SPEED_10GB_FULL;
     426                 :          0 :                 *autoneg = false;
     427                 :          0 :                 break;
     428                 :            : 
     429                 :          0 :         case IXGBE_AUTOC_LMS_1G_AN:
     430                 :          0 :                 *speed = IXGBE_LINK_SPEED_1GB_FULL;
     431                 :          0 :                 *autoneg = true;
     432                 :          0 :                 break;
     433                 :            : 
     434                 :          0 :         case IXGBE_AUTOC_LMS_10G_SERIAL:
     435                 :          0 :                 *speed = IXGBE_LINK_SPEED_10GB_FULL;
     436                 :          0 :                 *autoneg = false;
     437                 :          0 :                 break;
     438                 :            : 
     439                 :          0 :         case IXGBE_AUTOC_LMS_KX4_KX_KR:
     440                 :            :         case IXGBE_AUTOC_LMS_KX4_KX_KR_1G_AN:
     441                 :          0 :                 *speed = IXGBE_LINK_SPEED_UNKNOWN;
     442         [ #  # ]:          0 :                 if (autoc & IXGBE_AUTOC_KR_SUPP)
     443                 :          0 :                         *speed |= IXGBE_LINK_SPEED_10GB_FULL;
     444         [ #  # ]:          0 :                 if (autoc & IXGBE_AUTOC_KX4_SUPP)
     445                 :          0 :                         *speed |= IXGBE_LINK_SPEED_10GB_FULL;
     446         [ #  # ]:          0 :                 if (autoc & IXGBE_AUTOC_KX_SUPP)
     447                 :          0 :                         *speed |= IXGBE_LINK_SPEED_1GB_FULL;
     448                 :          0 :                 *autoneg = true;
     449                 :          0 :                 break;
     450                 :            : 
     451                 :          0 :         case IXGBE_AUTOC_LMS_KX4_KX_KR_SGMII:
     452                 :          0 :                 *speed = IXGBE_LINK_SPEED_100_FULL;
     453         [ #  # ]:          0 :                 if (autoc & IXGBE_AUTOC_KR_SUPP)
     454                 :          0 :                         *speed |= IXGBE_LINK_SPEED_10GB_FULL;
     455         [ #  # ]:          0 :                 if (autoc & IXGBE_AUTOC_KX4_SUPP)
     456                 :          0 :                         *speed |= IXGBE_LINK_SPEED_10GB_FULL;
     457         [ #  # ]:          0 :                 if (autoc & IXGBE_AUTOC_KX_SUPP)
     458                 :          0 :                         *speed |= IXGBE_LINK_SPEED_1GB_FULL;
     459                 :          0 :                 *autoneg = true;
     460                 :          0 :                 break;
     461                 :            : 
     462                 :          0 :         case IXGBE_AUTOC_LMS_SGMII_1G_100M:
     463                 :          0 :                 *speed = IXGBE_LINK_SPEED_1GB_FULL | IXGBE_LINK_SPEED_100_FULL;
     464                 :          0 :                 *autoneg = false;
     465                 :          0 :                 break;
     466                 :            : 
     467                 :          0 :         default:
     468                 :            :                 status = IXGBE_ERR_LINK_SETUP;
     469                 :          0 :                 goto out;
     470                 :            :                 break;
     471                 :            :         }
     472                 :            : 
     473         [ #  # ]:          0 :         if (hw->phy.multispeed_fiber) {
     474                 :          0 :                 *speed |= IXGBE_LINK_SPEED_10GB_FULL |
     475                 :            :                           IXGBE_LINK_SPEED_1GB_FULL;
     476                 :            : 
     477                 :            :                 /* QSFP must not enable full auto-negotiation
     478                 :            :                  * Limited autoneg is enabled at 1G
     479                 :            :                  */
     480         [ #  # ]:          0 :                 if (hw->phy.media_type == ixgbe_media_type_fiber_qsfp)
     481                 :          0 :                         *autoneg = false;
     482                 :            :                 else
     483                 :          0 :                         *autoneg = true;
     484                 :            :         }
     485                 :            : 
     486                 :          0 : out:
     487                 :          0 :         return status;
     488                 :            : }
     489                 :            : 
     490                 :            : /**
     491                 :            :  * ixgbe_get_media_type_82599 - Get media type
     492                 :            :  * @hw: pointer to hardware structure
     493                 :            :  *
     494                 :            :  * Returns the media type (fiber, copper, backplane)
     495                 :            :  **/
     496                 :          0 : enum ixgbe_media_type ixgbe_get_media_type_82599(struct ixgbe_hw *hw)
     497                 :            : {
     498                 :            :         enum ixgbe_media_type media_type;
     499                 :            : 
     500                 :          0 :         DEBUGFUNC("ixgbe_get_media_type_82599");
     501                 :            : 
     502                 :            :         /* Detect if there is a copper PHY attached. */
     503         [ #  # ]:          0 :         switch (hw->phy.type) {
     504                 :          0 :         case ixgbe_phy_cu_unknown:
     505                 :            :         case ixgbe_phy_tn:
     506                 :            :                 media_type = ixgbe_media_type_copper;
     507                 :          0 :                 goto out;
     508                 :            :         default:
     509                 :            :                 break;
     510                 :            :         }
     511                 :            : 
     512   [ #  #  #  #  :          0 :         switch (hw->device_id) {
                #  #  # ]
     513                 :            :         case IXGBE_DEV_ID_82599_KX4:
     514                 :            :         case IXGBE_DEV_ID_82599_KX4_MEZZ:
     515                 :            :         case IXGBE_DEV_ID_82599_COMBO_BACKPLANE:
     516                 :            :         case IXGBE_DEV_ID_82599_KR:
     517                 :            :         case IXGBE_DEV_ID_82599_BACKPLANE_FCOE:
     518                 :            :         case IXGBE_DEV_ID_82599_XAUI_LOM:
     519                 :            :                 /* Default device ID is mezzanine card KX/KX4 */
     520                 :            :                 media_type = ixgbe_media_type_backplane;
     521                 :            :                 break;
     522                 :          0 :         case IXGBE_DEV_ID_82599_SFP:
     523                 :            :         case IXGBE_DEV_ID_82599_SFP_FCOE:
     524                 :            :         case IXGBE_DEV_ID_82599_SFP_EM:
     525                 :            :         case IXGBE_DEV_ID_82599_SFP_SF2:
     526                 :            :         case IXGBE_DEV_ID_82599_SFP_SF_QP:
     527                 :            :         case IXGBE_DEV_ID_82599EN_SFP:
     528                 :            :                 media_type = ixgbe_media_type_fiber;
     529                 :          0 :                 break;
     530                 :          0 :         case IXGBE_DEV_ID_82599_CX4:
     531                 :            :                 media_type = ixgbe_media_type_cx4;
     532                 :          0 :                 break;
     533                 :          0 :         case IXGBE_DEV_ID_82599_T3_LOM:
     534                 :            :                 media_type = ixgbe_media_type_copper;
     535                 :          0 :                 break;
     536                 :          0 :         case IXGBE_DEV_ID_82599_LS:
     537                 :            :                 media_type = ixgbe_media_type_fiber_lco;
     538                 :          0 :                 break;
     539                 :          0 :         case IXGBE_DEV_ID_82599_QSFP_SF_QP:
     540                 :            :                 media_type = ixgbe_media_type_fiber_qsfp;
     541                 :          0 :                 break;
     542                 :          0 :         default:
     543                 :            :                 media_type = ixgbe_media_type_unknown;
     544                 :          0 :                 break;
     545                 :            :         }
     546                 :          0 : out:
     547                 :          0 :         return media_type;
     548                 :            : }
     549                 :            : 
     550                 :            : /**
     551                 :            :  * ixgbe_stop_mac_link_on_d3_82599 - Disables link on D3
     552                 :            :  * @hw: pointer to hardware structure
     553                 :            :  *
     554                 :            :  * Disables link during D3 power down sequence.
     555                 :            :  *
     556                 :            :  **/
     557                 :          0 : void ixgbe_stop_mac_link_on_d3_82599(struct ixgbe_hw *hw)
     558                 :            : {
     559                 :          0 :         u16 ee_ctrl_2 = 0;
     560                 :            :         u32 autoc2_reg;
     561                 :            :         u32 status;
     562                 :            : 
     563                 :          0 :         DEBUGFUNC("ixgbe_stop_mac_link_on_d3_82599");
     564                 :          0 :         status = ixgbe_read_eeprom(hw, IXGBE_EEPROM_CTRL_2, &ee_ctrl_2);
     565                 :            : 
     566   [ #  #  #  # ]:          0 :         if (status == IXGBE_SUCCESS &&
     567         [ #  # ]:          0 :             !ixgbe_mng_present(hw) && !hw->wol_enabled &&
     568         [ #  # ]:          0 :             ee_ctrl_2 & IXGBE_EEPROM_CCD_BIT) {
     569                 :          0 :                 autoc2_reg = IXGBE_READ_REG(hw, IXGBE_AUTOC2);
     570                 :          0 :                 autoc2_reg |= IXGBE_AUTOC2_LINK_DISABLE_ON_D3_MASK;
     571                 :          0 :                 IXGBE_WRITE_REG(hw, IXGBE_AUTOC2, autoc2_reg);
     572                 :            :         }
     573                 :          0 : }
     574                 :            : 
     575                 :            : /**
     576                 :            :  * ixgbe_start_mac_link_82599 - Setup MAC link settings
     577                 :            :  * @hw: pointer to hardware structure
     578                 :            :  * @autoneg_wait_to_complete: true when waiting for completion is needed
     579                 :            :  *
     580                 :            :  * Configures link settings based on values in the ixgbe_hw struct.
     581                 :            :  * Restarts the link.  Performs autonegotiation if needed.
     582                 :            :  **/
     583                 :          0 : s32 ixgbe_start_mac_link_82599(struct ixgbe_hw *hw,
     584                 :            :                                bool autoneg_wait_to_complete)
     585                 :            : {
     586                 :            :         u32 autoc_reg;
     587                 :            :         u32 links_reg;
     588                 :            :         u32 i;
     589                 :            :         s32 status = IXGBE_SUCCESS;
     590                 :            :         bool got_lock = false;
     591                 :            : 
     592                 :          0 :         DEBUGFUNC("ixgbe_start_mac_link_82599");
     593                 :            : 
     594                 :            : 
     595                 :            :         /*  reset_pipeline requires us to hold this lock as it writes to
     596                 :            :          *  AUTOC.
     597                 :            :          */
     598         [ #  # ]:          0 :         if (ixgbe_verify_lesm_fw_enabled_82599(hw)) {
     599                 :          0 :                 status = hw->mac.ops.acquire_swfw_sync(hw,
     600                 :            :                                                        IXGBE_GSSR_MAC_CSR_SM);
     601         [ #  # ]:          0 :                 if (status != IXGBE_SUCCESS)
     602                 :          0 :                         goto out;
     603                 :            : 
     604                 :            :                 got_lock = true;
     605                 :            :         }
     606                 :            : 
     607                 :            :         /* Restart link */
     608                 :          0 :         ixgbe_reset_pipeline_82599(hw);
     609                 :            : 
     610         [ #  # ]:          0 :         if (got_lock)
     611                 :          0 :                 hw->mac.ops.release_swfw_sync(hw, IXGBE_GSSR_MAC_CSR_SM);
     612                 :            : 
     613                 :            :         /* Only poll for autoneg to complete if specified to do so */
     614         [ #  # ]:          0 :         if (autoneg_wait_to_complete) {
     615                 :          0 :                 autoc_reg = IXGBE_READ_REG(hw, IXGBE_AUTOC);
     616                 :          0 :                 if ((autoc_reg & IXGBE_AUTOC_LMS_MASK) ==
     617         [ #  # ]:          0 :                      IXGBE_AUTOC_LMS_KX4_KX_KR ||
     618                 :            :                     (autoc_reg & IXGBE_AUTOC_LMS_MASK) ==
     619         [ #  # ]:          0 :                      IXGBE_AUTOC_LMS_KX4_KX_KR_1G_AN ||
     620                 :            :                     (autoc_reg & IXGBE_AUTOC_LMS_MASK) ==
     621                 :            :                      IXGBE_AUTOC_LMS_KX4_KX_KR_SGMII) {
     622                 :            :                         links_reg = 0; /* Just in case Autoneg time = 0 */
     623         [ #  # ]:          0 :                         for (i = 0; i < IXGBE_AUTO_NEG_TIME; i++) {
     624                 :          0 :                                 links_reg = IXGBE_READ_REG(hw, IXGBE_LINKS);
     625         [ #  # ]:          0 :                                 if (links_reg & IXGBE_LINKS_KX_AN_COMP)
     626                 :            :                                         break;
     627                 :          0 :                                 msec_delay(100);
     628                 :            :                         }
     629         [ #  # ]:          0 :                         if (!(links_reg & IXGBE_LINKS_KX_AN_COMP)) {
     630                 :            :                                 status = IXGBE_ERR_AUTONEG_NOT_COMPLETE;
     631                 :          0 :                                 DEBUGOUT("Autoneg did not complete.\n");
     632                 :            :                         }
     633                 :            :                 }
     634                 :            :         }
     635                 :            : 
     636                 :            :         /* Add delay to filter out noises during initial link setup */
     637                 :          0 :         msec_delay(50);
     638                 :            : 
     639                 :          0 : out:
     640                 :          0 :         return status;
     641                 :            : }
     642                 :            : 
     643                 :            : /**
     644                 :            :  * ixgbe_disable_tx_laser_multispeed_fiber - Disable Tx laser
     645                 :            :  * @hw: pointer to hardware structure
     646                 :            :  *
     647                 :            :  * The base drivers may require better control over SFP+ module
     648                 :            :  * PHY states.  This includes selectively shutting down the Tx
     649                 :            :  * laser on the PHY, effectively halting physical link.
     650                 :            :  **/
     651                 :          0 : void ixgbe_disable_tx_laser_multispeed_fiber(struct ixgbe_hw *hw)
     652                 :            : {
     653                 :          0 :         u32 esdp_reg = IXGBE_READ_REG(hw, IXGBE_ESDP);
     654                 :            : 
     655                 :            :         /* Blocked by MNG FW so bail */
     656         [ #  # ]:          0 :         if (ixgbe_check_reset_blocked(hw))
     657                 :            :                 return;
     658                 :            : 
     659                 :            :         /* Disable Tx laser; allow 100us to go dark per spec */
     660                 :          0 :         esdp_reg |= IXGBE_ESDP_SDP3;
     661                 :          0 :         IXGBE_WRITE_REG(hw, IXGBE_ESDP, esdp_reg);
     662                 :          0 :         IXGBE_WRITE_FLUSH(hw);
     663                 :          0 :         usec_delay(100);
     664                 :            : }
     665                 :            : 
     666                 :            : /**
     667                 :            :  * ixgbe_enable_tx_laser_multispeed_fiber - Enable Tx laser
     668                 :            :  * @hw: pointer to hardware structure
     669                 :            :  *
     670                 :            :  * The base drivers may require better control over SFP+ module
     671                 :            :  * PHY states.  This includes selectively turning on the Tx
     672                 :            :  * laser on the PHY, effectively starting physical link.
     673                 :            :  **/
     674                 :          0 : void ixgbe_enable_tx_laser_multispeed_fiber(struct ixgbe_hw *hw)
     675                 :            : {
     676                 :          0 :         u32 esdp_reg = IXGBE_READ_REG(hw, IXGBE_ESDP);
     677                 :            : 
     678                 :            :         /* Enable Tx laser; allow 100ms to light up */
     679                 :          0 :         esdp_reg &= ~IXGBE_ESDP_SDP3;
     680                 :          0 :         IXGBE_WRITE_REG(hw, IXGBE_ESDP, esdp_reg);
     681                 :          0 :         IXGBE_WRITE_FLUSH(hw);
     682                 :          0 :         msec_delay(100);
     683                 :          0 : }
     684                 :            : 
     685                 :            : /**
     686                 :            :  * ixgbe_flap_tx_laser_multispeed_fiber - Flap Tx laser
     687                 :            :  * @hw: pointer to hardware structure
     688                 :            :  *
     689                 :            :  * When the driver changes the link speeds that it can support,
     690                 :            :  * it sets autotry_restart to true to indicate that we need to
     691                 :            :  * initiate a new autotry session with the link partner.  To do
     692                 :            :  * so, we set the speed then disable and re-enable the Tx laser, to
     693                 :            :  * alert the link partner that it also needs to restart autotry on its
     694                 :            :  * end.  This is consistent with true clause 37 autoneg, which also
     695                 :            :  * involves a loss of signal.
     696                 :            :  **/
     697                 :          0 : void ixgbe_flap_tx_laser_multispeed_fiber(struct ixgbe_hw *hw)
     698                 :            : {
     699                 :          0 :         DEBUGFUNC("ixgbe_flap_tx_laser_multispeed_fiber");
     700                 :            : 
     701                 :            :         /* Blocked by MNG FW so bail */
     702         [ #  # ]:          0 :         if (ixgbe_check_reset_blocked(hw))
     703                 :            :                 return;
     704                 :            : 
     705         [ #  # ]:          0 :         if (hw->mac.autotry_restart) {
     706                 :          0 :                 ixgbe_disable_tx_laser_multispeed_fiber(hw);
     707                 :          0 :                 ixgbe_enable_tx_laser_multispeed_fiber(hw);
     708                 :          0 :                 hw->mac.autotry_restart = false;
     709                 :            :         }
     710                 :            : }
     711                 :            : 
     712                 :            : /**
     713                 :            :  * ixgbe_set_hard_rate_select_speed - Set module link speed
     714                 :            :  * @hw: pointer to hardware structure
     715                 :            :  * @speed: link speed to set
     716                 :            :  *
     717                 :            :  * Set module link speed via RS0/RS1 rate select pins.
     718                 :            :  */
     719                 :          0 : void ixgbe_set_hard_rate_select_speed(struct ixgbe_hw *hw,
     720                 :            :                                         ixgbe_link_speed speed)
     721                 :            : {
     722                 :          0 :         u32 esdp_reg = IXGBE_READ_REG(hw, IXGBE_ESDP);
     723                 :            : 
     724      [ #  #  # ]:          0 :         switch (speed) {
     725                 :          0 :         case IXGBE_LINK_SPEED_10GB_FULL:
     726                 :          0 :                 esdp_reg |= (IXGBE_ESDP_SDP5_DIR | IXGBE_ESDP_SDP5);
     727                 :          0 :                 break;
     728                 :          0 :         case IXGBE_LINK_SPEED_1GB_FULL:
     729                 :          0 :                 esdp_reg &= ~IXGBE_ESDP_SDP5;
     730                 :          0 :                 esdp_reg |= IXGBE_ESDP_SDP5_DIR;
     731                 :          0 :                 break;
     732                 :          0 :         default:
     733                 :          0 :                 DEBUGOUT("Invalid fixed module speed\n");
     734                 :          0 :                 return;
     735                 :            :         }
     736                 :            : 
     737                 :          0 :         IXGBE_WRITE_REG(hw, IXGBE_ESDP, esdp_reg);
     738                 :          0 :         IXGBE_WRITE_FLUSH(hw);
     739                 :            : }
     740                 :            : 
     741                 :            : /**
     742                 :            :  * ixgbe_setup_mac_link_smartspeed - Set MAC link speed using SmartSpeed
     743                 :            :  * @hw: pointer to hardware structure
     744                 :            :  * @speed: new link speed
     745                 :            :  * @autoneg_wait_to_complete: true when waiting for completion is needed
     746                 :            :  *
     747                 :            :  * Implements the Intel SmartSpeed algorithm.
     748                 :            :  **/
     749                 :          0 : s32 ixgbe_setup_mac_link_smartspeed(struct ixgbe_hw *hw,
     750                 :            :                                     ixgbe_link_speed speed,
     751                 :            :                                     bool autoneg_wait_to_complete)
     752                 :            : {
     753                 :            :         s32 status = IXGBE_SUCCESS;
     754                 :          0 :         ixgbe_link_speed link_speed = IXGBE_LINK_SPEED_UNKNOWN;
     755                 :            :         s32 i, j;
     756                 :          0 :         bool link_up = false;
     757                 :          0 :         u32 autoc_reg = IXGBE_READ_REG(hw, IXGBE_AUTOC);
     758                 :            : 
     759                 :          0 :         DEBUGFUNC("ixgbe_setup_mac_link_smartspeed");
     760                 :            : 
     761                 :            :          /* Set autoneg_advertised value based on input link speed */
     762                 :          0 :         hw->phy.autoneg_advertised = 0;
     763                 :            : 
     764         [ #  # ]:          0 :         if (speed & IXGBE_LINK_SPEED_10GB_FULL)
     765                 :          0 :                 hw->phy.autoneg_advertised |= IXGBE_LINK_SPEED_10GB_FULL;
     766                 :            : 
     767         [ #  # ]:          0 :         if (speed & IXGBE_LINK_SPEED_1GB_FULL)
     768                 :          0 :                 hw->phy.autoneg_advertised |= IXGBE_LINK_SPEED_1GB_FULL;
     769                 :            : 
     770         [ #  # ]:          0 :         if (speed & IXGBE_LINK_SPEED_100_FULL)
     771                 :          0 :                 hw->phy.autoneg_advertised |= IXGBE_LINK_SPEED_100_FULL;
     772                 :            : 
     773                 :            :         /*
     774                 :            :          * Implement Intel SmartSpeed algorithm.  SmartSpeed will reduce the
     775                 :            :          * autoneg advertisement if link is unable to be established at the
     776                 :            :          * highest negotiated rate.  This can sometimes happen due to integrity
     777                 :            :          * issues with the physical media connection.
     778                 :            :          */
     779                 :            : 
     780                 :            :         /* First, try to get link with full advertisement */
     781                 :          0 :         hw->phy.smart_speed_active = false;
     782         [ #  # ]:          0 :         for (j = 0; j < IXGBE_SMARTSPEED_MAX_RETRIES; j++) {
     783                 :          0 :                 status = ixgbe_setup_mac_link_82599(hw, speed,
     784                 :            :                                                     autoneg_wait_to_complete);
     785         [ #  # ]:          0 :                 if (status != IXGBE_SUCCESS)
     786                 :          0 :                         goto out;
     787                 :            : 
     788                 :            :                 /*
     789                 :            :                  * Wait for the controller to acquire link.  Per IEEE 802.3ap,
     790                 :            :                  * Section 73.10.2, we may have to wait up to 500ms if KR is
     791                 :            :                  * attempted, or 200ms if KX/KX4/BX/BX4 is attempted, per
     792                 :            :                  * Table 9 in the AN MAS.
     793                 :            :                  */
     794         [ #  # ]:          0 :                 for (i = 0; i < 5; i++) {
     795                 :          0 :                         msec_delay(100);
     796                 :            : 
     797                 :            :                         /* If we have link, just jump out */
     798                 :          0 :                         status = ixgbe_check_link(hw, &link_speed, &link_up,
     799                 :            :                                                   false);
     800         [ #  # ]:          0 :                         if (status != IXGBE_SUCCESS)
     801                 :          0 :                                 goto out;
     802                 :            : 
     803         [ #  # ]:          0 :                         if (link_up)
     804                 :          0 :                                 goto out;
     805                 :            :                 }
     806                 :            :         }
     807                 :            : 
     808                 :            :         /*
     809                 :            :          * We didn't get link.  If we advertised KR plus one of KX4/KX
     810                 :            :          * (or BX4/BX), then disable KR and try again.
     811                 :            :          */
     812         [ #  # ]:          0 :         if (((autoc_reg & IXGBE_AUTOC_KR_SUPP) == 0) ||
     813         [ #  # ]:          0 :             ((autoc_reg & IXGBE_AUTOC_KX4_KX_SUPP_MASK) == 0))
     814                 :          0 :                 goto out;
     815                 :            : 
     816                 :            :         /* Turn SmartSpeed on to disable KR support */
     817                 :          0 :         hw->phy.smart_speed_active = true;
     818                 :          0 :         status = ixgbe_setup_mac_link_82599(hw, speed,
     819                 :            :                                             autoneg_wait_to_complete);
     820         [ #  # ]:          0 :         if (status != IXGBE_SUCCESS)
     821                 :          0 :                 goto out;
     822                 :            : 
     823                 :            :         /*
     824                 :            :          * Wait for the controller to acquire link.  600ms will allow for
     825                 :            :          * the AN link_fail_inhibit_timer as well for multiple cycles of
     826                 :            :          * parallel detect, both 10g and 1g. This allows for the maximum
     827                 :            :          * connect attempts as defined in the AN MAS table 73-7.
     828                 :            :          */
     829         [ #  # ]:          0 :         for (i = 0; i < 6; i++) {
     830                 :          0 :                 msec_delay(100);
     831                 :            : 
     832                 :            :                 /* If we have link, just jump out */
     833                 :          0 :                 status = ixgbe_check_link(hw, &link_speed, &link_up, false);
     834         [ #  # ]:          0 :                 if (status != IXGBE_SUCCESS)
     835                 :          0 :                         goto out;
     836                 :            : 
     837         [ #  # ]:          0 :                 if (link_up)
     838                 :          0 :                         goto out;
     839                 :            :         }
     840                 :            : 
     841                 :            :         /* We didn't get link.  Turn SmartSpeed back off. */
     842                 :          0 :         hw->phy.smart_speed_active = false;
     843                 :          0 :         status = ixgbe_setup_mac_link_82599(hw, speed,
     844                 :            :                                             autoneg_wait_to_complete);
     845                 :            : 
     846                 :          0 : out:
     847   [ #  #  #  # ]:          0 :         if (link_up && (link_speed == IXGBE_LINK_SPEED_1GB_FULL))
     848                 :          0 :                 DEBUGOUT("Smartspeed has downgraded the link speed "
     849                 :            :                 "from the maximum advertised\n");
     850                 :          0 :         return status;
     851                 :            : }
     852                 :            : 
     853                 :            : /**
     854                 :            :  * ixgbe_setup_mac_link_82599 - Set MAC link speed
     855                 :            :  * @hw: pointer to hardware structure
     856                 :            :  * @speed: new link speed
     857                 :            :  * @autoneg_wait_to_complete: true when waiting for completion is needed
     858                 :            :  *
     859                 :            :  * Set the link speed in the AUTOC register and restarts link.
     860                 :            :  **/
     861                 :          0 : s32 ixgbe_setup_mac_link_82599(struct ixgbe_hw *hw,
     862                 :            :                                ixgbe_link_speed speed,
     863                 :            :                                bool autoneg_wait_to_complete)
     864                 :            : {
     865                 :          0 :         bool autoneg = false;
     866                 :            :         s32 status = IXGBE_SUCCESS;
     867                 :            :         u32 pma_pmd_1g, link_mode;
     868                 :          0 :         u32 current_autoc = IXGBE_READ_REG(hw, IXGBE_AUTOC); /* holds the value of AUTOC register at this current point in time */
     869                 :            :         u32 orig_autoc = 0; /* holds the cached value of AUTOC register */
     870                 :            :         u32 autoc = current_autoc; /* Temporary variable used for comparison purposes */
     871                 :          0 :         u32 autoc2 = IXGBE_READ_REG(hw, IXGBE_AUTOC2);
     872                 :          0 :         u32 pma_pmd_10g_serial = autoc2 & IXGBE_AUTOC2_10G_SERIAL_PMA_PMD_MASK;
     873                 :            :         u32 links_reg;
     874                 :            :         u32 i;
     875                 :          0 :         ixgbe_link_speed link_capabilities = IXGBE_LINK_SPEED_UNKNOWN;
     876                 :            : 
     877                 :          0 :         DEBUGFUNC("ixgbe_setup_mac_link_82599");
     878                 :            : 
     879                 :            :         /* Check to see if speed passed in is supported. */
     880                 :          0 :         status = ixgbe_get_link_capabilities(hw, &link_capabilities, &autoneg);
     881         [ #  # ]:          0 :         if (status)
     882                 :          0 :                 goto out;
     883                 :            : 
     884                 :          0 :         speed &= link_capabilities;
     885                 :            : 
     886         [ #  # ]:          0 :         if (speed == IXGBE_LINK_SPEED_UNKNOWN) {
     887                 :            :                 status = IXGBE_ERR_LINK_SETUP;
     888                 :          0 :                 goto out;
     889                 :            :         }
     890                 :            : 
     891                 :            :         /* Use stored value (EEPROM defaults) of AUTOC to find KR/KX4 support*/
     892         [ #  # ]:          0 :         if (hw->mac.orig_link_settings_stored)
     893                 :          0 :                 orig_autoc = hw->mac.orig_autoc;
     894                 :            :         else
     895                 :            :                 orig_autoc = autoc;
     896                 :            : 
     897                 :          0 :         link_mode = autoc & IXGBE_AUTOC_LMS_MASK;
     898                 :          0 :         pma_pmd_1g = autoc & IXGBE_AUTOC_1G_PMA_PMD_MASK;
     899                 :            : 
     900                 :          0 :         if (link_mode == IXGBE_AUTOC_LMS_KX4_KX_KR ||
     901   [ #  #  #  # ]:          0 :             link_mode == IXGBE_AUTOC_LMS_KX4_KX_KR_1G_AN ||
     902                 :            :             link_mode == IXGBE_AUTOC_LMS_KX4_KX_KR_SGMII) {
     903                 :            :                 /* Set KX4/KX/KR support according to speed requested */
     904                 :          0 :                 autoc &= ~(IXGBE_AUTOC_KX4_KX_SUPP_MASK | IXGBE_AUTOC_KR_SUPP);
     905         [ #  # ]:          0 :                 if (speed & IXGBE_LINK_SPEED_10GB_FULL) {
     906         [ #  # ]:          0 :                         if (orig_autoc & IXGBE_AUTOC_KX4_SUPP)
     907                 :          0 :                                 autoc |= IXGBE_AUTOC_KX4_SUPP;
     908         [ #  # ]:          0 :                         if ((orig_autoc & IXGBE_AUTOC_KR_SUPP) &&
     909         [ #  # ]:          0 :                             (hw->phy.smart_speed_active == false))
     910                 :          0 :                                 autoc |= IXGBE_AUTOC_KR_SUPP;
     911                 :            :                 }
     912         [ #  # ]:          0 :                 if (speed & IXGBE_LINK_SPEED_1GB_FULL)
     913                 :          0 :                         autoc |= IXGBE_AUTOC_KX_SUPP;
     914         [ #  # ]:          0 :         } else if ((pma_pmd_1g == IXGBE_AUTOC_1G_SFI) &&
     915                 :          0 :                    (link_mode == IXGBE_AUTOC_LMS_1G_LINK_NO_AN ||
     916         [ #  # ]:          0 :                     link_mode == IXGBE_AUTOC_LMS_1G_AN)) {
     917                 :            :                 /* Switch from 1G SFI to 10G SFI if requested */
     918                 :          0 :                 if ((speed == IXGBE_LINK_SPEED_10GB_FULL) &&
     919         [ #  # ]:          0 :                     (pma_pmd_10g_serial == IXGBE_AUTOC2_10G_SFI)) {
     920                 :          0 :                         autoc &= ~IXGBE_AUTOC_LMS_MASK;
     921                 :          0 :                         autoc |= IXGBE_AUTOC_LMS_10G_SERIAL;
     922                 :            :                 }
     923                 :          0 :         } else if ((pma_pmd_10g_serial == IXGBE_AUTOC2_10G_SFI) &&
     924         [ #  # ]:          0 :                    (link_mode == IXGBE_AUTOC_LMS_10G_SERIAL)) {
     925                 :            :                 /* Switch from 10G SFI to 1G SFI if requested */
     926                 :          0 :                 if ((speed == IXGBE_LINK_SPEED_1GB_FULL) &&
     927         [ #  # ]:          0 :                     (pma_pmd_1g == IXGBE_AUTOC_1G_SFI)) {
     928                 :          0 :                         autoc &= ~IXGBE_AUTOC_LMS_MASK;
     929   [ #  #  #  # ]:          0 :                         if (autoneg || hw->phy.type == ixgbe_phy_qsfp_intel)
     930                 :          0 :                                 autoc |= IXGBE_AUTOC_LMS_1G_AN;
     931                 :            :                         else
     932                 :            :                                 autoc |= IXGBE_AUTOC_LMS_1G_LINK_NO_AN;
     933                 :            :                 }
     934                 :            :         }
     935                 :            : 
     936         [ #  # ]:          0 :         if (autoc != current_autoc) {
     937                 :            :                 /* Restart link */
     938                 :          0 :                 status = hw->mac.ops.prot_autoc_write(hw, autoc, false);
     939         [ #  # ]:          0 :                 if (status != IXGBE_SUCCESS)
     940                 :          0 :                         goto out;
     941                 :            : 
     942                 :            :                 /* Only poll for autoneg to complete if specified to do so */
     943         [ #  # ]:          0 :                 if (autoneg_wait_to_complete) {
     944         [ #  # ]:          0 :                         if (link_mode == IXGBE_AUTOC_LMS_KX4_KX_KR ||
     945         [ #  # ]:          0 :                             link_mode == IXGBE_AUTOC_LMS_KX4_KX_KR_1G_AN ||
     946                 :            :                             link_mode == IXGBE_AUTOC_LMS_KX4_KX_KR_SGMII) {
     947                 :            :                                 links_reg = 0; /*Just in case Autoneg time=0*/
     948         [ #  # ]:          0 :                                 for (i = 0; i < IXGBE_AUTO_NEG_TIME; i++) {
     949                 :            :                                         links_reg =
     950                 :          0 :                                                IXGBE_READ_REG(hw, IXGBE_LINKS);
     951         [ #  # ]:          0 :                                         if (links_reg & IXGBE_LINKS_KX_AN_COMP)
     952                 :            :                                                 break;
     953                 :          0 :                                         msec_delay(100);
     954                 :            :                                 }
     955         [ #  # ]:          0 :                                 if (!(links_reg & IXGBE_LINKS_KX_AN_COMP)) {
     956                 :            :                                         status =
     957                 :            :                                                 IXGBE_ERR_AUTONEG_NOT_COMPLETE;
     958                 :          0 :                                         DEBUGOUT("Autoneg did not complete.\n");
     959                 :            :                                 }
     960                 :            :                         }
     961                 :            :                 }
     962                 :            : 
     963                 :            :                 /* Add delay to filter out noises during initial link setup */
     964                 :          0 :                 msec_delay(50);
     965                 :            :         }
     966                 :            : 
     967                 :          0 : out:
     968                 :          0 :         return status;
     969                 :            : }
     970                 :            : 
     971                 :            : /**
     972                 :            :  * ixgbe_setup_copper_link_82599 - Set the PHY autoneg advertised field
     973                 :            :  * @hw: pointer to hardware structure
     974                 :            :  * @speed: new link speed
     975                 :            :  * @autoneg_wait_to_complete: true if waiting is needed to complete
     976                 :            :  *
     977                 :            :  * Restarts link on PHY and MAC based on settings passed in.
     978                 :            :  **/
     979                 :          0 : STATIC s32 ixgbe_setup_copper_link_82599(struct ixgbe_hw *hw,
     980                 :            :                                          ixgbe_link_speed speed,
     981                 :            :                                          bool autoneg_wait_to_complete)
     982                 :            : {
     983                 :            :         s32 status;
     984                 :            : 
     985                 :          0 :         DEBUGFUNC("ixgbe_setup_copper_link_82599");
     986                 :            : 
     987                 :            :         /* Setup the PHY according to input speed */
     988                 :          0 :         status = hw->phy.ops.setup_link_speed(hw, speed,
     989                 :            :                                               autoneg_wait_to_complete);
     990                 :            :         /* Set up MAC */
     991                 :          0 :         ixgbe_start_mac_link_82599(hw, autoneg_wait_to_complete);
     992                 :            : 
     993                 :          0 :         return status;
     994                 :            : }
     995                 :            : 
     996                 :            : /**
     997                 :            :  * ixgbe_reset_hw_82599 - Perform hardware reset
     998                 :            :  * @hw: pointer to hardware structure
     999                 :            :  *
    1000                 :            :  * Resets the hardware by resetting the transmit and receive units, masks
    1001                 :            :  * and clears all interrupts, perform a PHY reset, and perform a link (MAC)
    1002                 :            :  * reset.
    1003                 :            :  **/
    1004                 :          0 : s32 ixgbe_reset_hw_82599(struct ixgbe_hw *hw)
    1005                 :            : {
    1006                 :            :         ixgbe_link_speed link_speed;
    1007                 :            :         s32 status;
    1008                 :            :         u32 ctrl = 0;
    1009                 :            :         u32 i, autoc, autoc2;
    1010                 :            :         u32 curr_lms;
    1011                 :          0 :         bool link_up = false;
    1012                 :            : 
    1013                 :          0 :         DEBUGFUNC("ixgbe_reset_hw_82599");
    1014                 :            : 
    1015                 :            :         /* Call adapter stop to disable tx/rx and clear interrupts */
    1016                 :          0 :         status = hw->mac.ops.stop_adapter(hw);
    1017         [ #  # ]:          0 :         if (status != IXGBE_SUCCESS)
    1018                 :          0 :                 goto reset_hw_out;
    1019                 :            : 
    1020                 :            :         /* flush pending Tx transactions */
    1021                 :          0 :         ixgbe_clear_tx_pending(hw);
    1022                 :            : 
    1023                 :            :         /* PHY ops must be identified and initialized prior to reset */
    1024                 :            : 
    1025                 :            :         /* Identify PHY and related function pointers */
    1026                 :          0 :         status = hw->phy.ops.init(hw);
    1027                 :            : 
    1028         [ #  # ]:          0 :         if (status == IXGBE_ERR_SFP_NOT_SUPPORTED)
    1029                 :          0 :                 goto reset_hw_out;
    1030                 :            : 
    1031                 :            :         /* Setup SFP module if there is one present. */
    1032         [ #  # ]:          0 :         if (hw->phy.sfp_setup_needed) {
    1033                 :          0 :                 status = hw->mac.ops.setup_sfp(hw);
    1034                 :          0 :                 hw->phy.sfp_setup_needed = false;
    1035                 :            :         }
    1036                 :            : 
    1037         [ #  # ]:          0 :         if (status == IXGBE_ERR_SFP_NOT_SUPPORTED)
    1038                 :          0 :                 goto reset_hw_out;
    1039                 :            : 
    1040                 :            :         /* Reset PHY */
    1041   [ #  #  #  # ]:          0 :         if (hw->phy.reset_disable == false && hw->phy.ops.reset != NULL)
    1042                 :          0 :                 hw->phy.ops.reset(hw);
    1043                 :            : 
    1044                 :            :         /* remember AUTOC from before we reset */
    1045                 :          0 :         curr_lms = IXGBE_READ_REG(hw, IXGBE_AUTOC) & IXGBE_AUTOC_LMS_MASK;
    1046                 :            : 
    1047                 :          0 : mac_reset_top:
    1048                 :            :         /*
    1049                 :            :          * Issue global reset to the MAC.  Needs to be SW reset if link is up.
    1050                 :            :          * If link reset is used when link is up, it might reset the PHY when
    1051                 :            :          * mng is using it.  If link is down or the flag to force full link
    1052                 :            :          * reset is set, then perform link reset.
    1053                 :            :          */
    1054                 :            :         ctrl = IXGBE_CTRL_LNK_RST;
    1055         [ #  # ]:          0 :         if (!hw->force_full_reset) {
    1056                 :          0 :                 hw->mac.ops.check_link(hw, &link_speed, &link_up, false);
    1057         [ #  # ]:          0 :                 if (link_up)
    1058                 :            :                         ctrl = IXGBE_CTRL_RST;
    1059                 :            :         }
    1060                 :            : 
    1061                 :          0 :         ctrl |= IXGBE_READ_REG(hw, IXGBE_CTRL);
    1062                 :          0 :         IXGBE_WRITE_REG(hw, IXGBE_CTRL, ctrl);
    1063                 :          0 :         IXGBE_WRITE_FLUSH(hw);
    1064                 :            : 
    1065                 :            :         /* Poll for reset bit to self-clear meaning reset is complete */
    1066         [ #  # ]:          0 :         for (i = 0; i < 10; i++) {
    1067                 :          0 :                 usec_delay(1);
    1068                 :          0 :                 ctrl = IXGBE_READ_REG(hw, IXGBE_CTRL);
    1069         [ #  # ]:          0 :                 if (!(ctrl & IXGBE_CTRL_RST_MASK))
    1070                 :            :                         break;
    1071                 :            :         }
    1072                 :            : 
    1073         [ #  # ]:          0 :         if (ctrl & IXGBE_CTRL_RST_MASK) {
    1074                 :            :                 status = IXGBE_ERR_RESET_FAILED;
    1075                 :          0 :                 DEBUGOUT("Reset polling failed to complete.\n");
    1076                 :            :         }
    1077                 :            : 
    1078                 :          0 :         msec_delay(50);
    1079                 :            : 
    1080                 :            :         /*
    1081                 :            :          * Double resets are required for recovery from certain error
    1082                 :            :          * conditions.  Between resets, it is necessary to stall to
    1083                 :            :          * allow time for any pending HW events to complete.
    1084                 :            :          */
    1085         [ #  # ]:          0 :         if (hw->mac.flags & IXGBE_FLAGS_DOUBLE_RESET_REQUIRED) {
    1086                 :          0 :                 hw->mac.flags &= ~IXGBE_FLAGS_DOUBLE_RESET_REQUIRED;
    1087                 :          0 :                 goto mac_reset_top;
    1088                 :            :         }
    1089                 :            : 
    1090                 :            :         /*
    1091                 :            :          * Store the original AUTOC/AUTOC2 values if they have not been
    1092                 :            :          * stored off yet.  Otherwise restore the stored original
    1093                 :            :          * values since the reset operation sets back to defaults.
    1094                 :            :          */
    1095                 :          0 :         autoc = IXGBE_READ_REG(hw, IXGBE_AUTOC);
    1096                 :          0 :         autoc2 = IXGBE_READ_REG(hw, IXGBE_AUTOC2);
    1097                 :            : 
    1098                 :            :         /* Enable link if disabled in NVM */
    1099         [ #  # ]:          0 :         if (autoc2 & IXGBE_AUTOC2_LINK_DISABLE_MASK) {
    1100                 :          0 :                 autoc2 &= ~IXGBE_AUTOC2_LINK_DISABLE_MASK;
    1101                 :          0 :                 IXGBE_WRITE_REG(hw, IXGBE_AUTOC2, autoc2);
    1102                 :          0 :                 IXGBE_WRITE_FLUSH(hw);
    1103                 :            :         }
    1104                 :            : 
    1105         [ #  # ]:          0 :         if (hw->mac.orig_link_settings_stored == false) {
    1106                 :          0 :                 hw->mac.orig_autoc = autoc;
    1107                 :          0 :                 hw->mac.orig_autoc2 = autoc2;
    1108                 :          0 :                 hw->mac.orig_link_settings_stored = true;
    1109                 :            :         } else {
    1110                 :            : 
    1111                 :            :                 /* If MNG FW is running on a multi-speed device that
    1112                 :            :                  * doesn't autoneg with out driver support we need to
    1113                 :            :                  * leave LMS in the state it was before we MAC reset.
    1114                 :            :                  * Likewise if we support WoL we don't want change the
    1115                 :            :                  * LMS state.
    1116                 :            :                  */
    1117   [ #  #  #  # ]:          0 :                 if ((hw->phy.multispeed_fiber && ixgbe_mng_enabled(hw)) ||
    1118         [ #  # ]:          0 :                     hw->wol_enabled)
    1119                 :          0 :                         hw->mac.orig_autoc =
    1120                 :          0 :                                 (hw->mac.orig_autoc & ~IXGBE_AUTOC_LMS_MASK) |
    1121                 :            :                                 curr_lms;
    1122                 :            : 
    1123         [ #  # ]:          0 :                 if (autoc != hw->mac.orig_autoc) {
    1124                 :          0 :                         status = hw->mac.ops.prot_autoc_write(hw,
    1125                 :            :                                                         hw->mac.orig_autoc,
    1126                 :            :                                                         false);
    1127         [ #  # ]:          0 :                         if (status != IXGBE_SUCCESS)
    1128                 :          0 :                                 goto reset_hw_out;
    1129                 :            :                 }
    1130                 :            : 
    1131                 :          0 :                 if ((autoc2 & IXGBE_AUTOC2_UPPER_MASK) !=
    1132         [ #  # ]:          0 :                     (hw->mac.orig_autoc2 & IXGBE_AUTOC2_UPPER_MASK)) {
    1133                 :          0 :                         autoc2 &= ~IXGBE_AUTOC2_UPPER_MASK;
    1134                 :          0 :                         autoc2 |= (hw->mac.orig_autoc2 &
    1135                 :            :                                    IXGBE_AUTOC2_UPPER_MASK);
    1136                 :          0 :                         IXGBE_WRITE_REG(hw, IXGBE_AUTOC2, autoc2);
    1137                 :            :                 }
    1138                 :            :         }
    1139                 :            : 
    1140                 :            :         /* Store the permanent mac address */
    1141                 :          0 :         hw->mac.ops.get_mac_addr(hw, hw->mac.perm_addr);
    1142                 :            : 
    1143                 :            :         /*
    1144                 :            :          * Store MAC address from RAR0, clear receive address registers, and
    1145                 :            :          * clear the multicast table.  Also reset num_rar_entries to 128,
    1146                 :            :          * since we modify this value when programming the SAN MAC address.
    1147                 :            :          */
    1148                 :          0 :         hw->mac.num_rar_entries = 128;
    1149                 :          0 :         hw->mac.ops.init_rx_addrs(hw);
    1150                 :            : 
    1151                 :            :         /* Store the permanent SAN mac address */
    1152                 :          0 :         hw->mac.ops.get_san_mac_addr(hw, hw->mac.san_addr);
    1153                 :            : 
    1154                 :            :         /* Add the SAN MAC address to the RAR only if it's a valid address */
    1155         [ #  # ]:          0 :         if (ixgbe_validate_mac_addr(hw->mac.san_addr) == 0) {
    1156                 :            :                 /* Save the SAN MAC RAR index */
    1157                 :          0 :                 hw->mac.san_mac_rar_index = hw->mac.num_rar_entries - 1;
    1158                 :            : 
    1159                 :          0 :                 hw->mac.ops.set_rar(hw, hw->mac.san_mac_rar_index,
    1160                 :            :                                     hw->mac.san_addr, 0, IXGBE_RAH_AV);
    1161                 :            : 
    1162                 :            :                 /* clear VMDq pool/queue selection for this RAR */
    1163                 :          0 :                 hw->mac.ops.clear_vmdq(hw, hw->mac.san_mac_rar_index,
    1164                 :            :                                        IXGBE_CLEAR_VMDQ_ALL);
    1165                 :            : 
    1166                 :            :                 /* Reserve the last RAR for the SAN MAC address */
    1167                 :          0 :                 hw->mac.num_rar_entries--;
    1168                 :            :         }
    1169                 :            : 
    1170                 :            :         /* Store the alternative WWNN/WWPN prefix */
    1171                 :          0 :         hw->mac.ops.get_wwn_prefix(hw, &hw->mac.wwnn_prefix,
    1172                 :            :                                    &hw->mac.wwpn_prefix);
    1173                 :            : 
    1174                 :          0 : reset_hw_out:
    1175                 :          0 :         return status;
    1176                 :            : }
    1177                 :            : 
    1178                 :            : /**
    1179                 :            :  * ixgbe_fdir_check_cmd_complete - poll to check whether FDIRCMD is complete
    1180                 :            :  * @hw: pointer to hardware structure
    1181                 :            :  * @fdircmd: current value of FDIRCMD register
    1182                 :            :  */
    1183                 :            : STATIC s32 ixgbe_fdir_check_cmd_complete(struct ixgbe_hw *hw, u32 *fdircmd)
    1184                 :            : {
    1185                 :            :         int i;
    1186                 :            : 
    1187   [ #  #  #  #  :          0 :         for (i = 0; i < IXGBE_FDIRCMD_CMD_POLL; i++) {
                   #  # ]
    1188                 :          0 :                 *fdircmd = IXGBE_READ_REG(hw, IXGBE_FDIRCMD);
    1189   [ #  #  #  #  :          0 :                 if (!(*fdircmd & IXGBE_FDIRCMD_CMD_MASK))
                   #  # ]
    1190                 :            :                         return IXGBE_SUCCESS;
    1191                 :          0 :                 usec_delay(10);
    1192                 :            :         }
    1193                 :            : 
    1194                 :            :         return IXGBE_ERR_FDIR_CMD_INCOMPLETE;
    1195                 :            : }
    1196                 :            : 
    1197                 :            : /**
    1198                 :            :  * ixgbe_reinit_fdir_tables_82599 - Reinitialize Flow Director tables.
    1199                 :            :  * @hw: pointer to hardware structure
    1200                 :            :  **/
    1201                 :          0 : s32 ixgbe_reinit_fdir_tables_82599(struct ixgbe_hw *hw)
    1202                 :            : {
    1203                 :            :         s32 err;
    1204                 :            :         int i;
    1205                 :          0 :         u32 fdirctrl = IXGBE_READ_REG(hw, IXGBE_FDIRCTRL);
    1206                 :            :         u32 fdircmd;
    1207                 :          0 :         fdirctrl &= ~IXGBE_FDIRCTRL_INIT_DONE;
    1208                 :            : 
    1209                 :          0 :         DEBUGFUNC("ixgbe_reinit_fdir_tables_82599");
    1210                 :            : 
    1211                 :            :         /*
    1212                 :            :          * Before starting reinitialization process,
    1213                 :            :          * FDIRCMD.CMD must be zero.
    1214                 :            :          */
    1215                 :            :         err = ixgbe_fdir_check_cmd_complete(hw, &fdircmd);
    1216         [ #  # ]:          0 :         if (err) {
    1217                 :          0 :                 DEBUGOUT("Flow Director previous command did not complete, aborting table re-initialization.\n");
    1218                 :          0 :                 return err;
    1219                 :            :         }
    1220                 :            : 
    1221                 :          0 :         IXGBE_WRITE_REG(hw, IXGBE_FDIRFREE, 0);
    1222                 :          0 :         IXGBE_WRITE_FLUSH(hw);
    1223                 :            :         /*
    1224                 :            :          * 82599 adapters flow director init flow cannot be restarted,
    1225                 :            :          * Workaround 82599 silicon errata by performing the following steps
    1226                 :            :          * before re-writing the FDIRCTRL control register with the same value.
    1227                 :            :          * - write 1 to bit 8 of FDIRCMD register &
    1228                 :            :          * - write 0 to bit 8 of FDIRCMD register
    1229                 :            :          */
    1230                 :          0 :         IXGBE_WRITE_REG(hw, IXGBE_FDIRCMD,
    1231                 :            :                         (IXGBE_READ_REG(hw, IXGBE_FDIRCMD) |
    1232                 :            :                          IXGBE_FDIRCMD_CLEARHT));
    1233                 :          0 :         IXGBE_WRITE_FLUSH(hw);
    1234                 :          0 :         IXGBE_WRITE_REG(hw, IXGBE_FDIRCMD,
    1235                 :            :                         (IXGBE_READ_REG(hw, IXGBE_FDIRCMD) &
    1236                 :            :                          ~IXGBE_FDIRCMD_CLEARHT));
    1237                 :          0 :         IXGBE_WRITE_FLUSH(hw);
    1238                 :            :         /*
    1239                 :            :          * Clear FDIR Hash register to clear any leftover hashes
    1240                 :            :          * waiting to be programmed.
    1241                 :            :          */
    1242                 :          0 :         IXGBE_WRITE_REG(hw, IXGBE_FDIRHASH, 0x00);
    1243                 :          0 :         IXGBE_WRITE_FLUSH(hw);
    1244                 :            : 
    1245                 :          0 :         IXGBE_WRITE_REG(hw, IXGBE_FDIRCTRL, fdirctrl);
    1246                 :          0 :         IXGBE_WRITE_FLUSH(hw);
    1247                 :            : 
    1248                 :            :         /* Poll init-done after we write FDIRCTRL register */
    1249         [ #  # ]:          0 :         for (i = 0; i < IXGBE_FDIR_INIT_DONE_POLL; i++) {
    1250         [ #  # ]:          0 :                 if (IXGBE_READ_REG(hw, IXGBE_FDIRCTRL) &
    1251                 :            :                                    IXGBE_FDIRCTRL_INIT_DONE)
    1252                 :            :                         break;
    1253                 :          0 :                 msec_delay(1);
    1254                 :            :         }
    1255         [ #  # ]:          0 :         if (i >= IXGBE_FDIR_INIT_DONE_POLL) {
    1256                 :          0 :                 DEBUGOUT("Flow Director Signature poll time exceeded!\n");
    1257                 :          0 :                 return IXGBE_ERR_FDIR_REINIT_FAILED;
    1258                 :            :         }
    1259                 :            : 
    1260                 :            :         /* Clear FDIR statistics registers (read to clear) */
    1261                 :          0 :         IXGBE_READ_REG(hw, IXGBE_FDIRUSTAT);
    1262                 :          0 :         IXGBE_READ_REG(hw, IXGBE_FDIRFSTAT);
    1263                 :          0 :         IXGBE_READ_REG(hw, IXGBE_FDIRMATCH);
    1264                 :          0 :         IXGBE_READ_REG(hw, IXGBE_FDIRMISS);
    1265                 :          0 :         IXGBE_READ_REG(hw, IXGBE_FDIRLEN);
    1266                 :            : 
    1267                 :          0 :         return IXGBE_SUCCESS;
    1268                 :            : }
    1269                 :            : 
    1270                 :            : /**
    1271                 :            :  * ixgbe_fdir_enable_82599 - Initialize Flow Director control registers
    1272                 :            :  * @hw: pointer to hardware structure
    1273                 :            :  * @fdirctrl: value to write to flow director control register
    1274                 :            :  **/
    1275                 :          0 : STATIC void ixgbe_fdir_enable_82599(struct ixgbe_hw *hw, u32 fdirctrl)
    1276                 :            : {
    1277                 :            :         int i;
    1278                 :            : 
    1279                 :          0 :         DEBUGFUNC("ixgbe_fdir_enable_82599");
    1280                 :            : 
    1281                 :            :         /* Prime the keys for hashing */
    1282                 :          0 :         IXGBE_WRITE_REG(hw, IXGBE_FDIRHKEY, IXGBE_ATR_BUCKET_HASH_KEY);
    1283                 :          0 :         IXGBE_WRITE_REG(hw, IXGBE_FDIRSKEY, IXGBE_ATR_SIGNATURE_HASH_KEY);
    1284                 :            : 
    1285                 :            :         /*
    1286                 :            :          * Poll init-done after we write the register.  Estimated times:
    1287                 :            :          *      10G: PBALLOC = 11b, timing is 60us
    1288                 :            :          *       1G: PBALLOC = 11b, timing is 600us
    1289                 :            :          *     100M: PBALLOC = 11b, timing is 6ms
    1290                 :            :          *
    1291                 :            :          *     Multiple these timings by 4 if under full Rx load
    1292                 :            :          *
    1293                 :            :          * So we'll poll for IXGBE_FDIR_INIT_DONE_POLL times, sleeping for
    1294                 :            :          * 1 msec per poll time.  If we're at line rate and drop to 100M, then
    1295                 :            :          * this might not finish in our poll time, but we can live with that
    1296                 :            :          * for now.
    1297                 :            :          */
    1298                 :          0 :         IXGBE_WRITE_REG(hw, IXGBE_FDIRCTRL, fdirctrl);
    1299                 :          0 :         IXGBE_WRITE_FLUSH(hw);
    1300         [ #  # ]:          0 :         for (i = 0; i < IXGBE_FDIR_INIT_DONE_POLL; i++) {
    1301         [ #  # ]:          0 :                 if (IXGBE_READ_REG(hw, IXGBE_FDIRCTRL) &
    1302                 :            :                                    IXGBE_FDIRCTRL_INIT_DONE)
    1303                 :            :                         break;
    1304                 :          0 :                 msec_delay(1);
    1305                 :            :         }
    1306                 :            : 
    1307         [ #  # ]:          0 :         if (i >= IXGBE_FDIR_INIT_DONE_POLL)
    1308                 :          0 :                 DEBUGOUT("Flow Director poll time exceeded!\n");
    1309                 :          0 : }
    1310                 :            : 
    1311                 :            : /**
    1312                 :            :  * ixgbe_init_fdir_signature_82599 - Initialize Flow Director signature filters
    1313                 :            :  * @hw: pointer to hardware structure
    1314                 :            :  * @fdirctrl: value to write to flow director control register, initially
    1315                 :            :  *           contains just the value of the Rx packet buffer allocation
    1316                 :            :  **/
    1317                 :          0 : s32 ixgbe_init_fdir_signature_82599(struct ixgbe_hw *hw, u32 fdirctrl)
    1318                 :            : {
    1319                 :          0 :         DEBUGFUNC("ixgbe_init_fdir_signature_82599");
    1320                 :            : 
    1321                 :            :         /*
    1322                 :            :          * Continue setup of fdirctrl register bits:
    1323                 :            :          *  Move the flexible bytes to use the ethertype - shift 6 words
    1324                 :            :          *  Set the maximum length per hash bucket to 0xA filters
    1325                 :            :          *  Send interrupt when 64 filters are left
    1326                 :            :          */
    1327                 :          0 :         fdirctrl |= (0x6 << IXGBE_FDIRCTRL_FLEX_SHIFT) |
    1328                 :            :                     (0xA << IXGBE_FDIRCTRL_MAX_LENGTH_SHIFT) |
    1329                 :            :                     (4 << IXGBE_FDIRCTRL_FULL_THRESH_SHIFT);
    1330                 :            : 
    1331                 :            :         /* write hashes and fdirctrl register, poll for completion */
    1332                 :          0 :         ixgbe_fdir_enable_82599(hw, fdirctrl);
    1333                 :            : 
    1334                 :          0 :         return IXGBE_SUCCESS;
    1335                 :            : }
    1336                 :            : 
    1337                 :            : /**
    1338                 :            :  * ixgbe_init_fdir_perfect_82599 - Initialize Flow Director perfect filters
    1339                 :            :  * @hw: pointer to hardware structure
    1340                 :            :  * @fdirctrl: value to write to flow director control register, initially
    1341                 :            :  *           contains just the value of the Rx packet buffer allocation
    1342                 :            :  * @cloud_mode: true - cloud mode, false - other mode
    1343                 :            :  **/
    1344                 :          0 : s32 ixgbe_init_fdir_perfect_82599(struct ixgbe_hw *hw, u32 fdirctrl,
    1345                 :            :                         bool cloud_mode)
    1346                 :            : {
    1347                 :            :         UNREFERENCED_1PARAMETER(cloud_mode);
    1348                 :          0 :         DEBUGFUNC("ixgbe_init_fdir_perfect_82599");
    1349                 :            : 
    1350                 :            :         /*
    1351                 :            :          * Continue setup of fdirctrl register bits:
    1352                 :            :          *  Turn perfect match filtering on
    1353                 :            :          *  Report hash in RSS field of Rx wb descriptor
    1354                 :            :          *  Initialize the drop queue to queue 127
    1355                 :            :          *  Move the flexible bytes to use the ethertype - shift 6 words
    1356                 :            :          *  Set the maximum length per hash bucket to 0xA filters
    1357                 :            :          *  Send interrupt when 64 (0x4 * 16) filters are left
    1358                 :            :          */
    1359                 :          0 :         fdirctrl |= IXGBE_FDIRCTRL_PERFECT_MATCH |
    1360                 :            :                     IXGBE_FDIRCTRL_REPORT_STATUS |
    1361                 :            :                     (IXGBE_FDIR_DROP_QUEUE << IXGBE_FDIRCTRL_DROP_Q_SHIFT) |
    1362                 :            :                     (0x6 << IXGBE_FDIRCTRL_FLEX_SHIFT) |
    1363                 :            :                     (0xA << IXGBE_FDIRCTRL_MAX_LENGTH_SHIFT) |
    1364                 :            :                     (4 << IXGBE_FDIRCTRL_FULL_THRESH_SHIFT);
    1365                 :            : 
    1366         [ #  # ]:          0 :         if (cloud_mode)
    1367                 :          0 :                 fdirctrl |=(IXGBE_FDIRCTRL_FILTERMODE_CLOUD <<
    1368                 :            :                                         IXGBE_FDIRCTRL_FILTERMODE_SHIFT);
    1369                 :            : 
    1370                 :            :         /* write hashes and fdirctrl register, poll for completion */
    1371                 :          0 :         ixgbe_fdir_enable_82599(hw, fdirctrl);
    1372                 :            : 
    1373                 :          0 :         return IXGBE_SUCCESS;
    1374                 :            : }
    1375                 :            : 
    1376                 :            : /**
    1377                 :            :  * ixgbe_set_fdir_drop_queue_82599 - Set Flow Director drop queue
    1378                 :            :  * @hw: pointer to hardware structure
    1379                 :            :  * @dropqueue: Rx queue index used for the dropped packets
    1380                 :            :  **/
    1381                 :          0 : void ixgbe_set_fdir_drop_queue_82599(struct ixgbe_hw *hw, u8 dropqueue)
    1382                 :            : {
    1383                 :            :         u32 fdirctrl;
    1384                 :            : 
    1385                 :          0 :         DEBUGFUNC("ixgbe_set_fdir_drop_queue_82599");
    1386                 :            :         /* Clear init done bit and drop queue field */
    1387                 :          0 :         fdirctrl = IXGBE_READ_REG(hw, IXGBE_FDIRCTRL);
    1388                 :          0 :         fdirctrl &= ~(IXGBE_FDIRCTRL_DROP_Q_MASK | IXGBE_FDIRCTRL_INIT_DONE);
    1389                 :            : 
    1390                 :            :         /* Set drop queue */
    1391                 :          0 :         fdirctrl |= (dropqueue << IXGBE_FDIRCTRL_DROP_Q_SHIFT);
    1392                 :          0 :         if ((hw->mac.type == ixgbe_mac_X550) ||
    1393                 :            :             (hw->mac.type == ixgbe_mac_X550EM_x) ||
    1394         [ #  # ]:          0 :             (hw->mac.type == ixgbe_mac_X550EM_a) ||
    1395                 :            :             (hw->mac.type == ixgbe_mac_E610))
    1396                 :          0 :                 fdirctrl |= IXGBE_FDIRCTRL_DROP_NO_MATCH;
    1397                 :            : 
    1398                 :          0 :         IXGBE_WRITE_REG(hw, IXGBE_FDIRCMD,
    1399                 :            :                         (IXGBE_READ_REG(hw, IXGBE_FDIRCMD) |
    1400                 :            :                          IXGBE_FDIRCMD_CLEARHT));
    1401                 :          0 :         IXGBE_WRITE_FLUSH(hw);
    1402                 :          0 :         IXGBE_WRITE_REG(hw, IXGBE_FDIRCMD,
    1403                 :            :                         (IXGBE_READ_REG(hw, IXGBE_FDIRCMD) &
    1404                 :            :                          ~IXGBE_FDIRCMD_CLEARHT));
    1405                 :          0 :         IXGBE_WRITE_FLUSH(hw);
    1406                 :            : 
    1407                 :            :         /* write hashes and fdirctrl register, poll for completion */
    1408                 :          0 :         ixgbe_fdir_enable_82599(hw, fdirctrl);
    1409                 :          0 : }
    1410                 :            : 
    1411                 :            : /*
    1412                 :            :  * These defines allow us to quickly generate all of the necessary instructions
    1413                 :            :  * in the function below by simply calling out IXGBE_COMPUTE_SIG_HASH_ITERATION
    1414                 :            :  * for values 0 through 15
    1415                 :            :  */
    1416                 :            : #define IXGBE_ATR_COMMON_HASH_KEY \
    1417                 :            :                 (IXGBE_ATR_BUCKET_HASH_KEY & IXGBE_ATR_SIGNATURE_HASH_KEY)
    1418                 :            : #define IXGBE_COMPUTE_SIG_HASH_ITERATION(_n) \
    1419                 :            : do { \
    1420                 :            :         u32 n = (_n); \
    1421                 :            :         if (IXGBE_ATR_COMMON_HASH_KEY & (0x01 << n)) \
    1422                 :            :                 common_hash ^= lo_hash_dword >> n; \
    1423                 :            :         else if (IXGBE_ATR_BUCKET_HASH_KEY & (0x01 << n)) \
    1424                 :            :                 bucket_hash ^= lo_hash_dword >> n; \
    1425                 :            :         else if (IXGBE_ATR_SIGNATURE_HASH_KEY & (0x01 << n)) \
    1426                 :            :                 sig_hash ^= lo_hash_dword << (16 - n); \
    1427                 :            :         if (IXGBE_ATR_COMMON_HASH_KEY & (0x01 << (n + 16))) \
    1428                 :            :                 common_hash ^= hi_hash_dword >> n; \
    1429                 :            :         else if (IXGBE_ATR_BUCKET_HASH_KEY & (0x01 << (n + 16))) \
    1430                 :            :                 bucket_hash ^= hi_hash_dword >> n; \
    1431                 :            :         else if (IXGBE_ATR_SIGNATURE_HASH_KEY & (0x01 << (n + 16))) \
    1432                 :            :                 sig_hash ^= hi_hash_dword << (16 - n); \
    1433                 :            : } while (0)
    1434                 :            : 
    1435                 :            : /**
    1436                 :            :  * ixgbe_atr_compute_sig_hash_82599 - Compute the signature hash
    1437                 :            :  * @input: input bitstream to compute the hash on
    1438                 :            :  * @common: compressed common input dword
    1439                 :            :  *
    1440                 :            :  * This function is almost identical to the function above but contains
    1441                 :            :  * several optimizations such as unwinding all of the loops, letting the
    1442                 :            :  * compiler work out all of the conditional ifs since the keys are static
    1443                 :            :  * defines, and computing two keys at once since the hashed dword stream
    1444                 :            :  * will be the same for both keys.
    1445                 :            :  **/
    1446                 :          0 : u32 ixgbe_atr_compute_sig_hash_82599(union ixgbe_atr_hash_dword input,
    1447                 :            :                                      union ixgbe_atr_hash_dword common)
    1448                 :            : {
    1449                 :            :         u32 hi_hash_dword, lo_hash_dword, flow_vm_vlan;
    1450                 :            :         u32 sig_hash = 0, bucket_hash = 0, common_hash = 0;
    1451                 :            : 
    1452                 :            :         /* record the flow_vm_vlan bits as they are a key part to the hash */
    1453         [ #  # ]:          0 :         flow_vm_vlan = IXGBE_NTOHL(input.dword);
    1454                 :            : 
    1455                 :            :         /* generate common hash dword */
    1456         [ #  # ]:          0 :         hi_hash_dword = IXGBE_NTOHL(common.dword);
    1457                 :            : 
    1458                 :            :         /* low dword is word swapped version of common */
    1459                 :          0 :         lo_hash_dword = (hi_hash_dword >> 16) | (hi_hash_dword << 16);
    1460                 :            : 
    1461                 :            :         /* apply flow ID/VM pool/VLAN ID bits to hash words */
    1462                 :          0 :         hi_hash_dword ^= flow_vm_vlan ^ (flow_vm_vlan >> 16);
    1463                 :            : 
    1464                 :            :         /* Process bits 0 and 16 */
    1465                 :            :         IXGBE_COMPUTE_SIG_HASH_ITERATION(0);
    1466                 :            : 
    1467                 :            :         /*
    1468                 :            :          * apply flow ID/VM pool/VLAN ID bits to lo hash dword, we had to
    1469                 :            :          * delay this because bit 0 of the stream should not be processed
    1470                 :            :          * so we do not add the VLAN until after bit 0 was processed
    1471                 :            :          */
    1472                 :          0 :         lo_hash_dword ^= flow_vm_vlan ^ (flow_vm_vlan << 16);
    1473                 :            : 
    1474                 :            :         /* Process remaining 30 bit of the key */
    1475                 :          0 :         IXGBE_COMPUTE_SIG_HASH_ITERATION(1);
    1476                 :          0 :         IXGBE_COMPUTE_SIG_HASH_ITERATION(2);
    1477                 :          0 :         IXGBE_COMPUTE_SIG_HASH_ITERATION(3);
    1478                 :          0 :         IXGBE_COMPUTE_SIG_HASH_ITERATION(4);
    1479                 :          0 :         IXGBE_COMPUTE_SIG_HASH_ITERATION(5);
    1480                 :          0 :         IXGBE_COMPUTE_SIG_HASH_ITERATION(6);
    1481                 :          0 :         IXGBE_COMPUTE_SIG_HASH_ITERATION(7);
    1482                 :          0 :         IXGBE_COMPUTE_SIG_HASH_ITERATION(8);
    1483                 :          0 :         IXGBE_COMPUTE_SIG_HASH_ITERATION(9);
    1484                 :          0 :         IXGBE_COMPUTE_SIG_HASH_ITERATION(10);
    1485                 :          0 :         IXGBE_COMPUTE_SIG_HASH_ITERATION(11);
    1486                 :          0 :         IXGBE_COMPUTE_SIG_HASH_ITERATION(12);
    1487                 :          0 :         IXGBE_COMPUTE_SIG_HASH_ITERATION(13);
    1488                 :            :         IXGBE_COMPUTE_SIG_HASH_ITERATION(14);
    1489                 :            :         IXGBE_COMPUTE_SIG_HASH_ITERATION(15);
    1490                 :            : 
    1491                 :            :         /* combine common_hash result with signature and bucket hashes */
    1492                 :          0 :         bucket_hash ^= common_hash;
    1493                 :          0 :         bucket_hash &= IXGBE_ATR_HASH_MASK;
    1494                 :            : 
    1495                 :          0 :         sig_hash ^= common_hash << 16;
    1496                 :          0 :         sig_hash &= IXGBE_ATR_HASH_MASK << 16;
    1497                 :            : 
    1498                 :            :         /* return completed signature hash */
    1499                 :          0 :         return sig_hash ^ bucket_hash;
    1500                 :            : }
    1501                 :            : 
    1502                 :            : /**
    1503                 :            :  * ixgbe_fdir_add_signature_filter_82599 - Adds a signature hash filter
    1504                 :            :  * @hw: pointer to hardware structure
    1505                 :            :  * @input: unique input dword
    1506                 :            :  * @common: compressed common input dword
    1507                 :            :  * @queue: queue index to direct traffic to
    1508                 :            :  *
    1509                 :            :  * Note that the tunnel bit in input must not be set when the hardware
    1510                 :            :  * tunneling support does not exist.
    1511                 :            :  **/
    1512                 :          0 : void ixgbe_fdir_add_signature_filter_82599(struct ixgbe_hw *hw,
    1513                 :            :                                            union ixgbe_atr_hash_dword input,
    1514                 :            :                                            union ixgbe_atr_hash_dword common,
    1515                 :            :                                            u8 queue)
    1516                 :            : {
    1517                 :            :         u64 fdirhashcmd;
    1518                 :            :         u8 flow_type;
    1519                 :            :         bool tunnel;
    1520                 :            :         u32 fdircmd;
    1521                 :            : 
    1522                 :          0 :         DEBUGFUNC("ixgbe_fdir_add_signature_filter_82599");
    1523                 :            : 
    1524                 :            :         /*
    1525                 :            :          * Get the flow_type in order to program FDIRCMD properly
    1526                 :            :          * lowest 2 bits are FDIRCMD.L4TYPE, third lowest bit is FDIRCMD.IPV6
    1527                 :            :          * fifth is FDIRCMD.TUNNEL_FILTER
    1528                 :            :          */
    1529                 :            :         tunnel = !!(input.formatted.flow_type & IXGBE_ATR_L4TYPE_TUNNEL_MASK);
    1530                 :          0 :         flow_type = input.formatted.flow_type &
    1531                 :            :                     (IXGBE_ATR_L4TYPE_TUNNEL_MASK - 1);
    1532         [ #  # ]:          0 :         switch (flow_type) {
    1533                 :            :         case IXGBE_ATR_FLOW_TYPE_TCPV4:
    1534                 :            :         case IXGBE_ATR_FLOW_TYPE_UDPV4:
    1535                 :            :         case IXGBE_ATR_FLOW_TYPE_SCTPV4:
    1536                 :            :         case IXGBE_ATR_FLOW_TYPE_TCPV6:
    1537                 :            :         case IXGBE_ATR_FLOW_TYPE_UDPV6:
    1538                 :            :         case IXGBE_ATR_FLOW_TYPE_SCTPV6:
    1539                 :            :                 break;
    1540                 :          0 :         default:
    1541                 :          0 :                 DEBUGOUT(" Error on flow type input\n");
    1542                 :          0 :                 return;
    1543                 :            :         }
    1544                 :            : 
    1545                 :            :         /* configure FDIRCMD register */
    1546                 :            :         fdircmd = IXGBE_FDIRCMD_CMD_ADD_FLOW | IXGBE_FDIRCMD_FILTER_UPDATE |
    1547                 :            :                   IXGBE_FDIRCMD_LAST | IXGBE_FDIRCMD_QUEUE_EN;
    1548                 :          0 :         fdircmd |= (u32)flow_type << IXGBE_FDIRCMD_FLOW_TYPE_SHIFT;
    1549                 :          0 :         fdircmd |= (u32)queue << IXGBE_FDIRCMD_RX_QUEUE_SHIFT;
    1550         [ #  # ]:          0 :         if (tunnel)
    1551                 :          0 :                 fdircmd |= IXGBE_FDIRCMD_TUNNEL_FILTER;
    1552                 :            : 
    1553                 :            :         /*
    1554                 :            :          * The lower 32-bits of fdirhashcmd is for FDIRHASH, the upper 32-bits
    1555                 :            :          * is for FDIRCMD.  Then do a 64-bit register write from FDIRHASH.
    1556                 :            :          */
    1557                 :          0 :         fdirhashcmd = (u64)fdircmd << 32;
    1558                 :          0 :         fdirhashcmd |= (u64)ixgbe_atr_compute_sig_hash_82599(input, common);
    1559                 :          0 :         IXGBE_WRITE_REG64(hw, IXGBE_FDIRHASH, fdirhashcmd);
    1560                 :            : 
    1561                 :          0 :         DEBUGOUT2("Tx Queue=%x hash=%x\n", queue, (u32)fdirhashcmd);
    1562                 :            : 
    1563                 :          0 :         return;
    1564                 :            : }
    1565                 :            : 
    1566                 :            : #define IXGBE_COMPUTE_BKT_HASH_ITERATION(_n) \
    1567                 :            : do { \
    1568                 :            :         u32 n = (_n); \
    1569                 :            :         if (IXGBE_ATR_BUCKET_HASH_KEY & (0x01 << n)) \
    1570                 :            :                 bucket_hash ^= lo_hash_dword >> n; \
    1571                 :            :         if (IXGBE_ATR_BUCKET_HASH_KEY & (0x01 << (n + 16))) \
    1572                 :            :                 bucket_hash ^= hi_hash_dword >> n; \
    1573                 :            : } while (0)
    1574                 :            : 
    1575                 :            : /**
    1576                 :            :  * ixgbe_atr_compute_perfect_hash_82599 - Compute the perfect filter hash
    1577                 :            :  * @input: input bitstream to compute the hash on
    1578                 :            :  * @input_mask: mask for the input bitstream
    1579                 :            :  *
    1580                 :            :  * This function serves two main purposes.  First it applies the input_mask
    1581                 :            :  * to the atr_input resulting in a cleaned up atr_input data stream.
    1582                 :            :  * Secondly it computes the hash and stores it in the bkt_hash field at
    1583                 :            :  * the end of the input byte stream.  This way it will be available for
    1584                 :            :  * future use without needing to recompute the hash.
    1585                 :            :  **/
    1586                 :          0 : void ixgbe_atr_compute_perfect_hash_82599(union ixgbe_atr_input *input,
    1587                 :            :                                           union ixgbe_atr_input *input_mask)
    1588                 :            : {
    1589                 :            : 
    1590                 :            :         u32 hi_hash_dword, lo_hash_dword, flow_vm_vlan;
    1591                 :            :         u32 bucket_hash = 0;
    1592                 :            :         u32 hi_dword = 0;
    1593                 :            :         u32 i = 0;
    1594                 :            : 
    1595                 :            :         /* Apply masks to input data */
    1596         [ #  # ]:          0 :         for (i = 0; i < 14; i++)
    1597                 :          0 :                 input->dword_stream[i]  &= input_mask->dword_stream[i];
    1598                 :            : 
    1599                 :            :         /* record the flow_vm_vlan bits as they are a key part to the hash */
    1600         [ #  # ]:          0 :         flow_vm_vlan = IXGBE_NTOHL(input->dword_stream[0]);
    1601                 :            : 
    1602                 :            :         /* generate common hash dword */
    1603         [ #  # ]:          0 :         for (i = 1; i <= 13; i++)
    1604                 :          0 :                 hi_dword ^= input->dword_stream[i];
    1605         [ #  # ]:          0 :         hi_hash_dword = IXGBE_NTOHL(hi_dword);
    1606                 :            : 
    1607                 :            :         /* low dword is word swapped version of common */
    1608                 :          0 :         lo_hash_dword = (hi_hash_dword >> 16) | (hi_hash_dword << 16);
    1609                 :            : 
    1610                 :            :         /* apply flow ID/VM pool/VLAN ID bits to hash words */
    1611                 :          0 :         hi_hash_dword ^= flow_vm_vlan ^ (flow_vm_vlan >> 16);
    1612                 :            : 
    1613                 :            :         /* Process bits 0 and 16 */
    1614                 :            :         IXGBE_COMPUTE_BKT_HASH_ITERATION(0);
    1615                 :            : 
    1616                 :            :         /*
    1617                 :            :          * apply flow ID/VM pool/VLAN ID bits to lo hash dword, we had to
    1618                 :            :          * delay this because bit 0 of the stream should not be processed
    1619                 :            :          * so we do not add the VLAN until after bit 0 was processed
    1620                 :            :          */
    1621                 :          0 :         lo_hash_dword ^= flow_vm_vlan ^ (flow_vm_vlan << 16);
    1622                 :            : 
    1623                 :            :         /* Process remaining 30 bit of the key */
    1624         [ #  # ]:          0 :         for (i = 1; i <= 15; i++)
    1625   [ #  #  #  # ]:          0 :                 IXGBE_COMPUTE_BKT_HASH_ITERATION(i);
    1626                 :            : 
    1627                 :            :         /*
    1628                 :            :          * Limit hash to 13 bits since max bucket count is 8K.
    1629                 :            :          * Store result at the end of the input stream.
    1630                 :            :          */
    1631                 :          0 :         input->formatted.bkt_hash = bucket_hash & 0x1FFF;
    1632                 :          0 : }
    1633                 :            : 
    1634                 :            : /**
    1635                 :            :  * ixgbe_get_fdirtcpm_82599 - generate a TCP port from atr_input_masks
    1636                 :            :  * @input_mask: mask to be bit swapped
    1637                 :            :  *
    1638                 :            :  * The source and destination port masks for flow director are bit swapped
    1639                 :            :  * in that bit 15 effects bit 0, 14 effects 1, 13, 2 etc.  In order to
    1640                 :            :  * generate a correctly swapped value we need to bit swap the mask and that
    1641                 :            :  * is what is accomplished by this function.
    1642                 :            :  **/
    1643                 :          0 : STATIC u32 ixgbe_get_fdirtcpm_82599(union ixgbe_atr_input *input_mask)
    1644                 :            : {
    1645         [ #  # ]:          0 :         u32 mask = IXGBE_NTOHS(input_mask->formatted.dst_port);
    1646                 :          0 :         mask <<= IXGBE_FDIRTCPM_DPORTM_SHIFT;
    1647         [ #  # ]:          0 :         mask |= (u32)IXGBE_NTOHS(input_mask->formatted.src_port);
    1648                 :          0 :         mask = ((mask & 0x55555555) << 1) | ((mask & 0xAAAAAAAA) >> 1);
    1649                 :          0 :         mask = ((mask & 0x33333333) << 2) | ((mask & 0xCCCCCCCC) >> 2);
    1650                 :          0 :         mask = ((mask & 0x0F0F0F0F) << 4) | ((mask & 0xF0F0F0F0) >> 4);
    1651                 :          0 :         return ((mask & 0x00FF00FF) << 8) | ((mask & 0xFF00FF00) >> 8);
    1652                 :            : }
    1653                 :            : 
    1654                 :            : /*
    1655                 :            :  * These two macros are meant to address the fact that we have registers
    1656                 :            :  * that are either all or in part big-endian.  As a result on big-endian
    1657                 :            :  * systems we will end up byte swapping the value to little-endian before
    1658                 :            :  * it is byte swapped again and written to the hardware in the original
    1659                 :            :  * big-endian format.
    1660                 :            :  */
    1661                 :            : #define IXGBE_STORE_AS_BE32(_value) \
    1662                 :            :         (((u32)(_value) >> 24) | (((u32)(_value) & 0x00FF0000) >> 8) | \
    1663                 :            :          (((u32)(_value) & 0x0000FF00) << 8) | ((u32)(_value) << 24))
    1664                 :            : 
    1665                 :            : #define IXGBE_WRITE_REG_BE32(a, reg, value) \
    1666                 :            :         IXGBE_WRITE_REG((a), (reg), IXGBE_STORE_AS_BE32(IXGBE_NTOHL(value)))
    1667                 :            : 
    1668                 :            : #define IXGBE_STORE_AS_BE16(_value) \
    1669                 :            :         IXGBE_NTOHS(((u16)(_value) >> 8) | ((u16)(_value) << 8))
    1670                 :            : 
    1671                 :          0 : s32 ixgbe_fdir_set_input_mask_82599(struct ixgbe_hw *hw,
    1672                 :            :                                     union ixgbe_atr_input *input_mask, bool cloud_mode)
    1673                 :            : {
    1674                 :            :         /* mask IPv6 since it is currently not supported */
    1675                 :            :         u32 fdirm = IXGBE_FDIRM_DIPv6;
    1676                 :            :         u32 fdirtcpm;
    1677                 :            :         u32 fdirip6m;
    1678                 :            :         UNREFERENCED_1PARAMETER(cloud_mode);
    1679                 :          0 :         DEBUGFUNC("ixgbe_fdir_set_atr_input_mask_82599");
    1680                 :            : 
    1681                 :            :         /*
    1682                 :            :          * Program the relevant mask registers.  If src/dst_port or src/dst_addr
    1683                 :            :          * are zero, then assume a full mask for that field.  Also assume that
    1684                 :            :          * a VLAN of 0 is unspecified, so mask that out as well.  L4type
    1685                 :            :          * cannot be masked out in this implementation.
    1686                 :            :          *
    1687                 :            :          * This also assumes IPv4 only.  IPv6 masking isn't supported at this
    1688                 :            :          * point in time.
    1689                 :            :          */
    1690                 :            : 
    1691                 :            :         /* verify bucket hash is cleared on hash generation */
    1692         [ #  # ]:          0 :         if (input_mask->formatted.bkt_hash)
    1693                 :          0 :                 DEBUGOUT(" bucket hash should always be 0 in mask\n");
    1694                 :            : 
    1695                 :            :         /* Program FDIRM and verify partial masks */
    1696      [ #  #  # ]:          0 :         switch (input_mask->formatted.vm_pool & 0x7F) {
    1697                 :          0 :         case 0x0:
    1698                 :            :                 fdirm |= IXGBE_FDIRM_POOL;
    1699                 :            :         case 0x7F:
    1700                 :            :                 break;
    1701                 :          0 :         default:
    1702                 :          0 :                 DEBUGOUT(" Error on vm pool mask\n");
    1703                 :          0 :                 return IXGBE_ERR_CONFIG;
    1704                 :            :         }
    1705                 :            : 
    1706      [ #  #  # ]:          0 :         switch (input_mask->formatted.flow_type & IXGBE_ATR_L4TYPE_MASK) {
    1707                 :          0 :         case 0x0:
    1708                 :          0 :                 fdirm |= IXGBE_FDIRM_L4P;
    1709         [ #  # ]:          0 :                 if (input_mask->formatted.dst_port ||
    1710                 :            :                     input_mask->formatted.src_port) {
    1711                 :          0 :                         DEBUGOUT(" Error on src/dst port mask\n");
    1712                 :          0 :                         return IXGBE_ERR_CONFIG;
    1713                 :            :                 }
    1714                 :            :         case IXGBE_ATR_L4TYPE_MASK:
    1715                 :            :                 break;
    1716                 :          0 :         default:
    1717                 :          0 :                 DEBUGOUT(" Error on flow type mask\n");
    1718                 :          0 :                 return IXGBE_ERR_CONFIG;
    1719                 :            :         }
    1720                 :            : 
    1721   [ #  #  #  #  :          0 :         switch (IXGBE_NTOHS(input_mask->formatted.vlan_id) & 0xEFFF) {
                #  #  # ]
    1722                 :          0 :         case 0x0000:
    1723                 :            :                 /* mask VLAN ID */
    1724                 :            :                 fdirm |= IXGBE_FDIRM_VLANID;
    1725                 :          0 :                 fdirm |= IXGBE_FDIRM_VLANP;
    1726                 :          0 :                 break;
    1727                 :          0 :         case 0x0FFF:
    1728                 :            :                 /* mask VLAN priority */
    1729                 :          0 :                 fdirm |= IXGBE_FDIRM_VLANP;
    1730                 :          0 :                 break;
    1731                 :          0 :         case 0xE000:
    1732                 :            :                 /* mask VLAN ID only */
    1733                 :          0 :                 fdirm |= IXGBE_FDIRM_VLANID;
    1734                 :            :                 /* fall through */
    1735                 :            :         case 0xEFFF:
    1736                 :            :                 /* no VLAN fields masked */
    1737                 :            :                 break;
    1738                 :          0 :         default:
    1739                 :          0 :                 DEBUGOUT(" Error on VLAN mask\n");
    1740                 :          0 :                 return IXGBE_ERR_CONFIG;
    1741                 :            :         }
    1742                 :            : 
    1743      [ #  #  # ]:          0 :         switch (input_mask->formatted.flex_bytes & 0xFFFF) {
    1744                 :          0 :         case 0x0000:
    1745                 :            :                 /* Mask Flex Bytes */
    1746                 :          0 :                 fdirm |= IXGBE_FDIRM_FLEX;
    1747                 :            :                 /* fall through */
    1748                 :            :         case 0xFFFF:
    1749                 :            :                 break;
    1750                 :          0 :         default:
    1751                 :          0 :                 DEBUGOUT(" Error on flexible byte mask\n");
    1752                 :          0 :                 return IXGBE_ERR_CONFIG;
    1753                 :            :         }
    1754                 :            : 
    1755         [ #  # ]:          0 :         if (cloud_mode) {
    1756                 :          0 :                 fdirm |= IXGBE_FDIRM_L3P;
    1757                 :            :                 fdirip6m = ((u32) 0xFFFFU << IXGBE_FDIRIP6M_DIPM_SHIFT);
    1758                 :            :                 fdirip6m |= IXGBE_FDIRIP6M_ALWAYS_MASK;
    1759                 :            : 
    1760      [ #  #  # ]:          0 :                 switch (input_mask->formatted.inner_mac[0] & 0xFF) {
    1761                 :          0 :                 case 0x00:
    1762                 :            :                         /* Mask inner MAC, fall through */
    1763                 :            :                         fdirip6m |= IXGBE_FDIRIP6M_INNER_MAC;
    1764                 :            :                 case 0xFF:
    1765                 :            :                         break;
    1766                 :          0 :                 default:
    1767                 :          0 :                         DEBUGOUT(" Error on inner_mac byte mask\n");
    1768                 :          0 :                         return IXGBE_ERR_CONFIG;
    1769                 :            :                 }
    1770                 :            : 
    1771   [ #  #  #  # ]:          0 :                 switch (input_mask->formatted.tni_vni & 0xFFFFFFFF) {
    1772                 :          0 :                 case 0x0:
    1773                 :            :                         /* Mask vxlan id */
    1774                 :          0 :                         fdirip6m |= IXGBE_FDIRIP6M_TNI_VNI;
    1775                 :          0 :                         break;
    1776                 :          0 :                 case 0x00FFFFFF:
    1777                 :          0 :                         fdirip6m |= IXGBE_FDIRIP6M_TNI_VNI_24;
    1778                 :          0 :                         break;
    1779                 :            :                 case 0xFFFFFFFF:
    1780                 :            :                         break;
    1781                 :          0 :                 default:
    1782                 :          0 :                         DEBUGOUT(" Error on TNI/VNI byte mask\n");
    1783                 :          0 :                         return IXGBE_ERR_CONFIG;
    1784                 :            :                 }
    1785                 :            : 
    1786      [ #  #  # ]:          0 :                 switch (input_mask->formatted.tunnel_type & 0xFFFF) {
    1787                 :          0 :                 case 0x0:
    1788                 :            :                         /* Mask turnnel type, fall through */
    1789                 :          0 :                         fdirip6m |= IXGBE_FDIRIP6M_TUNNEL_TYPE;
    1790                 :            :                 case 0xFFFF:
    1791                 :            :                         break;
    1792                 :          0 :                 default:
    1793                 :          0 :                         DEBUGOUT(" Error on tunnel type byte mask\n");
    1794                 :          0 :                         return IXGBE_ERR_CONFIG;
    1795                 :            :                 }
    1796   [ #  #  #  #  :          0 :                 IXGBE_WRITE_REG_BE32(hw, IXGBE_FDIRIP6M, fdirip6m);
             #  #  #  # ]
    1797                 :            : 
    1798                 :            :                 /* Set all bits in FDIRTCPM, FDIRUDPM, FDIRSCTPM,
    1799                 :            :                  * FDIRSIP4M and FDIRDIP4M in cloud mode to allow
    1800                 :            :                  * L3/L3 packets to tunnel.
    1801                 :            :                  */
    1802                 :          0 :                 IXGBE_WRITE_REG(hw, IXGBE_FDIRTCPM, 0xFFFFFFFF);
    1803                 :          0 :                 IXGBE_WRITE_REG(hw, IXGBE_FDIRUDPM, 0xFFFFFFFF);
    1804                 :          0 :                 IXGBE_WRITE_REG_BE32(hw, IXGBE_FDIRDIP4M, 0xFFFFFFFF);
    1805                 :          0 :                 IXGBE_WRITE_REG_BE32(hw, IXGBE_FDIRSIP4M, 0xFFFFFFFF);
    1806         [ #  # ]:          0 :                 switch (hw->mac.type) {
    1807                 :          0 :                 case ixgbe_mac_X550:
    1808                 :            :                 case ixgbe_mac_X550EM_x:
    1809                 :            :                 case ixgbe_mac_X550EM_a:
    1810                 :            :                 case ixgbe_mac_E610:
    1811                 :          0 :                         IXGBE_WRITE_REG(hw, IXGBE_FDIRSCTPM, 0xFFFFFFFF);
    1812                 :            :                         break;
    1813                 :            :                 default:
    1814                 :            :                         break;
    1815                 :            :                 }
    1816                 :            :         }
    1817                 :            : 
    1818                 :            :         /* Now mask VM pool and destination IPv6 - bits 5 and 2 */
    1819                 :          0 :         IXGBE_WRITE_REG(hw, IXGBE_FDIRM, fdirm);
    1820                 :            : 
    1821         [ #  # ]:          0 :         if (!cloud_mode) {
    1822                 :            :                 /* store the TCP/UDP port masks, bit reversed from port
    1823                 :            :                  * layout */
    1824                 :          0 :                 fdirtcpm = ixgbe_get_fdirtcpm_82599(input_mask);
    1825                 :            : 
    1826                 :            :                 /* write both the same so that UDP and TCP use the same mask */
    1827                 :          0 :                 IXGBE_WRITE_REG(hw, IXGBE_FDIRTCPM, ~fdirtcpm);
    1828                 :          0 :                 IXGBE_WRITE_REG(hw, IXGBE_FDIRUDPM, ~fdirtcpm);
    1829                 :            :                 /* also use it for SCTP */
    1830         [ #  # ]:          0 :                 switch (hw->mac.type) {
    1831                 :          0 :                 case ixgbe_mac_X550:
    1832                 :            :                 case ixgbe_mac_X550EM_x:
    1833                 :            :                 case ixgbe_mac_X550EM_a:
    1834                 :            :                 case ixgbe_mac_E610:
    1835                 :          0 :                         IXGBE_WRITE_REG(hw, IXGBE_FDIRSCTPM, ~fdirtcpm);
    1836                 :            :                         break;
    1837                 :            :                 default:
    1838                 :            :                         break;
    1839                 :            :                 }
    1840                 :            : 
    1841                 :            :                 /* store source and destination IP masks (big-enian) */
    1842   [ #  #  #  #  :          0 :                 IXGBE_WRITE_REG_BE32(hw, IXGBE_FDIRSIP4M,
             #  #  #  # ]
    1843                 :            :                                      ~input_mask->formatted.src_ip[0]);
    1844   [ #  #  #  #  :          0 :                 IXGBE_WRITE_REG_BE32(hw, IXGBE_FDIRDIP4M,
             #  #  #  # ]
    1845                 :            :                                      ~input_mask->formatted.dst_ip[0]);
    1846                 :          0 :                 IXGBE_WRITE_REG_BE32(hw, IXGBE_FDIRIP6M, 0xFFFFFFFF);
    1847                 :            :         }
    1848                 :            :         return IXGBE_SUCCESS;
    1849                 :            : }
    1850                 :            : 
    1851                 :          0 : s32 ixgbe_fdir_write_perfect_filter_82599(struct ixgbe_hw *hw,
    1852                 :            :                                           union ixgbe_atr_input *input,
    1853                 :            :                                           u16 soft_id, u8 queue, bool cloud_mode)
    1854                 :            : {
    1855                 :            :         u32 fdirport, fdirvlan, fdirhash, fdircmd;
    1856                 :            :         u32 addr_low, addr_high;
    1857                 :            :         u32 cloud_type = 0;
    1858                 :            :         s32 err;
    1859                 :            :         UNREFERENCED_1PARAMETER(cloud_mode);
    1860                 :            : 
    1861                 :          0 :         DEBUGFUNC("ixgbe_fdir_write_perfect_filter_82599");
    1862         [ #  # ]:          0 :         if (!cloud_mode) {
    1863                 :            :                 /* currently IPv6 is not supported, must be programmed with 0 */
    1864   [ #  #  #  #  :          0 :                 IXGBE_WRITE_REG_BE32(hw, IXGBE_FDIRSIPv6(0),
             #  #  #  # ]
    1865                 :            :                                      input->formatted.src_ip[0]);
    1866   [ #  #  #  #  :          0 :                 IXGBE_WRITE_REG_BE32(hw, IXGBE_FDIRSIPv6(1),
             #  #  #  # ]
    1867                 :            :                                      input->formatted.src_ip[1]);
    1868   [ #  #  #  #  :          0 :                 IXGBE_WRITE_REG_BE32(hw, IXGBE_FDIRSIPv6(2),
             #  #  #  # ]
    1869                 :            :                                      input->formatted.src_ip[2]);
    1870                 :            : 
    1871                 :            :                 /* record the source address (big-endian) */
    1872   [ #  #  #  #  :          0 :                 IXGBE_WRITE_REG_BE32(hw, IXGBE_FDIRIPSA,
             #  #  #  # ]
    1873                 :            :                         input->formatted.src_ip[0]);
    1874                 :            : 
    1875                 :            :                 /* record the first 32 bits of the destination address
    1876                 :            :                  * (big-endian) */
    1877   [ #  #  #  #  :          0 :                 IXGBE_WRITE_REG_BE32(hw, IXGBE_FDIRIPDA,
             #  #  #  # ]
    1878                 :            :                         input->formatted.dst_ip[0]);
    1879                 :            : 
    1880                 :            :                 /* record source and destination port (little-endian)*/
    1881         [ #  # ]:          0 :                 fdirport = IXGBE_NTOHS(input->formatted.dst_port);
    1882                 :          0 :                 fdirport <<= IXGBE_FDIRPORT_DESTINATION_SHIFT;
    1883         [ #  # ]:          0 :                 fdirport |= (u32)IXGBE_NTOHS(input->formatted.src_port);
    1884                 :          0 :                 IXGBE_WRITE_REG(hw, IXGBE_FDIRPORT, fdirport);
    1885                 :            :         }
    1886                 :            : 
    1887                 :            :         /* record VLAN (little-endian) and flex_bytes(big-endian) */
    1888         [ #  # ]:          0 :         fdirvlan = IXGBE_STORE_AS_BE16(input->formatted.flex_bytes);
    1889                 :          0 :         fdirvlan <<= IXGBE_FDIRVLAN_FLEX_SHIFT;
    1890         [ #  # ]:          0 :         fdirvlan |= (u32)IXGBE_NTOHS(input->formatted.vlan_id);
    1891                 :          0 :         IXGBE_WRITE_REG(hw, IXGBE_FDIRVLAN, fdirvlan);
    1892                 :            : 
    1893         [ #  # ]:          0 :         if (cloud_mode) {
    1894         [ #  # ]:          0 :                 if (input->formatted.tunnel_type != 0)
    1895                 :            :                         cloud_type = 0x80000000;
    1896                 :            : 
    1897                 :          0 :                 addr_low = ((u32)input->formatted.inner_mac[0] |
    1898                 :          0 :                                 ((u32)input->formatted.inner_mac[1] << 8) |
    1899                 :          0 :                                 ((u32)input->formatted.inner_mac[2] << 16) |
    1900                 :          0 :                                 ((u32)input->formatted.inner_mac[3] << 24));
    1901                 :          0 :                 addr_high = ((u32)input->formatted.inner_mac[4] |
    1902                 :          0 :                                 ((u32)input->formatted.inner_mac[5] << 8));
    1903                 :          0 :                 cloud_type |= addr_high;
    1904   [ #  #  #  #  :          0 :                 IXGBE_WRITE_REG_BE32(hw, IXGBE_FDIRSIPv6(0), addr_low);
             #  #  #  # ]
    1905   [ #  #  #  #  :          0 :                 IXGBE_WRITE_REG_BE32(hw, IXGBE_FDIRSIPv6(1), cloud_type);
             #  #  #  # ]
    1906   [ #  #  #  #  :          0 :                 IXGBE_WRITE_REG_BE32(hw, IXGBE_FDIRSIPv6(2), input->formatted.tni_vni);
             #  #  #  # ]
    1907                 :            :         }
    1908                 :            : 
    1909                 :            :         /* configure FDIRHASH register */
    1910                 :          0 :         fdirhash = input->formatted.bkt_hash;
    1911                 :          0 :         fdirhash |= soft_id << IXGBE_FDIRHASH_SIG_SW_INDEX_SHIFT;
    1912                 :          0 :         IXGBE_WRITE_REG(hw, IXGBE_FDIRHASH, fdirhash);
    1913                 :            : 
    1914                 :            :         /*
    1915                 :            :          * flush all previous writes to make certain registers are
    1916                 :            :          * programmed prior to issuing the command
    1917                 :            :          */
    1918                 :          0 :         IXGBE_WRITE_FLUSH(hw);
    1919                 :            : 
    1920                 :            :         /* configure FDIRCMD register */
    1921                 :            :         fdircmd = IXGBE_FDIRCMD_CMD_ADD_FLOW | IXGBE_FDIRCMD_FILTER_UPDATE |
    1922                 :            :                   IXGBE_FDIRCMD_LAST | IXGBE_FDIRCMD_QUEUE_EN;
    1923         [ #  # ]:          0 :         if (queue == IXGBE_FDIR_DROP_QUEUE)
    1924                 :            :                 fdircmd |= IXGBE_FDIRCMD_DROP;
    1925         [ #  # ]:          0 :         if (input->formatted.flow_type & IXGBE_ATR_L4TYPE_TUNNEL_MASK)
    1926                 :          0 :                 fdircmd |= IXGBE_FDIRCMD_TUNNEL_FILTER;
    1927                 :          0 :         fdircmd |= input->formatted.flow_type << IXGBE_FDIRCMD_FLOW_TYPE_SHIFT;
    1928                 :          0 :         fdircmd |= (u32)queue << IXGBE_FDIRCMD_RX_QUEUE_SHIFT;
    1929                 :          0 :         fdircmd |= (u32)input->formatted.vm_pool << IXGBE_FDIRCMD_VT_POOL_SHIFT;
    1930                 :            : 
    1931                 :          0 :         IXGBE_WRITE_REG(hw, IXGBE_FDIRCMD, fdircmd);
    1932                 :            :         err = ixgbe_fdir_check_cmd_complete(hw, &fdircmd);
    1933         [ #  # ]:          0 :         if (err) {
    1934                 :          0 :                 DEBUGOUT("Flow Director command did not complete!\n");
    1935                 :          0 :                 return err;
    1936                 :            :         }
    1937                 :            : 
    1938                 :            :         return IXGBE_SUCCESS;
    1939                 :            : }
    1940                 :            : 
    1941                 :          0 : s32 ixgbe_fdir_erase_perfect_filter_82599(struct ixgbe_hw *hw,
    1942                 :            :                                           union ixgbe_atr_input *input,
    1943                 :            :                                           u16 soft_id)
    1944                 :            : {
    1945                 :            :         u32 fdirhash;
    1946                 :            :         u32 fdircmd;
    1947                 :            :         s32 err;
    1948                 :            : 
    1949                 :            :         /* configure FDIRHASH register */
    1950                 :          0 :         fdirhash = input->formatted.bkt_hash;
    1951                 :          0 :         fdirhash |= soft_id << IXGBE_FDIRHASH_SIG_SW_INDEX_SHIFT;
    1952                 :          0 :         IXGBE_WRITE_REG(hw, IXGBE_FDIRHASH, fdirhash);
    1953                 :            : 
    1954                 :            :         /* flush hash to HW */
    1955                 :          0 :         IXGBE_WRITE_FLUSH(hw);
    1956                 :            : 
    1957                 :            :         /* Query if filter is present */
    1958                 :          0 :         IXGBE_WRITE_REG(hw, IXGBE_FDIRCMD, IXGBE_FDIRCMD_CMD_QUERY_REM_FILT);
    1959                 :            : 
    1960                 :            :         err = ixgbe_fdir_check_cmd_complete(hw, &fdircmd);
    1961         [ #  # ]:          0 :         if (err) {
    1962                 :          0 :                 DEBUGOUT("Flow Director command did not complete!\n");
    1963                 :          0 :                 return err;
    1964                 :            :         }
    1965                 :            : 
    1966                 :            :         /* if filter exists in hardware then remove it */
    1967         [ #  # ]:          0 :         if (fdircmd & IXGBE_FDIRCMD_FILTER_VALID) {
    1968                 :          0 :                 IXGBE_WRITE_REG(hw, IXGBE_FDIRHASH, fdirhash);
    1969                 :          0 :                 IXGBE_WRITE_FLUSH(hw);
    1970                 :          0 :                 IXGBE_WRITE_REG(hw, IXGBE_FDIRCMD,
    1971                 :            :                                 IXGBE_FDIRCMD_CMD_REMOVE_FLOW);
    1972                 :            :         }
    1973                 :            : 
    1974                 :            :         return IXGBE_SUCCESS;
    1975                 :            : }
    1976                 :            : 
    1977                 :            : /**
    1978                 :            :  * ixgbe_fdir_add_perfect_filter_82599 - Adds a perfect filter
    1979                 :            :  * @hw: pointer to hardware structure
    1980                 :            :  * @input: input bitstream
    1981                 :            :  * @input_mask: mask for the input bitstream
    1982                 :            :  * @soft_id: software index for the filters
    1983                 :            :  * @queue: queue index to direct traffic to
    1984                 :            :  * @cloud_mode: unused
    1985                 :            :  *
    1986                 :            :  * Note that the caller to this function must lock before calling, since the
    1987                 :            :  * hardware writes must be protected from one another.
    1988                 :            :  **/
    1989                 :          0 : s32 ixgbe_fdir_add_perfect_filter_82599(struct ixgbe_hw *hw,
    1990                 :            :                                         union ixgbe_atr_input *input,
    1991                 :            :                                         union ixgbe_atr_input *input_mask,
    1992                 :            :                                         u16 soft_id, u8 queue, bool cloud_mode)
    1993                 :            : {
    1994                 :            :         s32 err = IXGBE_ERR_CONFIG;
    1995                 :            :         UNREFERENCED_1PARAMETER(cloud_mode);
    1996                 :            : 
    1997                 :          0 :         DEBUGFUNC("ixgbe_fdir_add_perfect_filter_82599");
    1998                 :            : 
    1999                 :            :         /*
    2000                 :            :          * Check flow_type formatting, and bail out before we touch the hardware
    2001                 :            :          * if there's a configuration issue
    2002                 :            :          */
    2003   [ #  #  #  # ]:          0 :         switch (input->formatted.flow_type) {
    2004                 :          0 :         case IXGBE_ATR_FLOW_TYPE_IPV4:
    2005                 :            :         case IXGBE_ATR_FLOW_TYPE_TUNNELED_IPV4:
    2006                 :          0 :                 input_mask->formatted.flow_type = IXGBE_ATR_L4TYPE_IPV6_MASK;
    2007         [ #  # ]:          0 :                 if (input->formatted.dst_port || input->formatted.src_port) {
    2008                 :          0 :                         DEBUGOUT(" Error on src/dst port\n");
    2009                 :          0 :                         return IXGBE_ERR_CONFIG;
    2010                 :            :                 }
    2011                 :            :                 break;
    2012                 :          0 :         case IXGBE_ATR_FLOW_TYPE_SCTPV4:
    2013                 :            :         case IXGBE_ATR_FLOW_TYPE_TUNNELED_SCTPV4:
    2014         [ #  # ]:          0 :                 if (input->formatted.dst_port || input->formatted.src_port) {
    2015                 :          0 :                         DEBUGOUT(" Error on src/dst port\n");
    2016                 :          0 :                         return IXGBE_ERR_CONFIG;
    2017                 :            :                 }
    2018                 :          0 :                 input_mask->formatted.flow_type = IXGBE_ATR_L4TYPE_IPV6_MASK |
    2019                 :            :                                                   IXGBE_ATR_L4TYPE_MASK;
    2020                 :          0 :                 break;
    2021                 :          0 :         case IXGBE_ATR_FLOW_TYPE_TCPV4:
    2022                 :            :         case IXGBE_ATR_FLOW_TYPE_TUNNELED_TCPV4:
    2023                 :            :         case IXGBE_ATR_FLOW_TYPE_UDPV4:
    2024                 :            :         case IXGBE_ATR_FLOW_TYPE_TUNNELED_UDPV4:
    2025                 :          0 :                 input_mask->formatted.flow_type = IXGBE_ATR_L4TYPE_IPV6_MASK |
    2026                 :            :                                                   IXGBE_ATR_L4TYPE_MASK;
    2027                 :          0 :                 break;
    2028                 :          0 :         default:
    2029                 :          0 :                 DEBUGOUT(" Error on flow type input\n");
    2030                 :          0 :                 return err;
    2031                 :            :         }
    2032                 :            : 
    2033                 :            :         /* program input mask into the HW */
    2034                 :          0 :         err = ixgbe_fdir_set_input_mask_82599(hw, input_mask, cloud_mode);
    2035         [ #  # ]:          0 :         if (err)
    2036                 :            :                 return err;
    2037                 :            : 
    2038                 :            :         /* apply mask and compute/store hash */
    2039                 :          0 :         ixgbe_atr_compute_perfect_hash_82599(input, input_mask);
    2040                 :            : 
    2041                 :            :         /* program filters to filter memory */
    2042                 :          0 :         return ixgbe_fdir_write_perfect_filter_82599(hw, input,
    2043                 :            :                                                      soft_id, queue, cloud_mode);
    2044                 :            : }
    2045                 :            : 
    2046                 :            : /**
    2047                 :            :  * ixgbe_read_analog_reg8_82599 - Reads 8 bit Omer analog register
    2048                 :            :  * @hw: pointer to hardware structure
    2049                 :            :  * @reg: analog register to read
    2050                 :            :  * @val: read value
    2051                 :            :  *
    2052                 :            :  * Performs read operation to Omer analog register specified.
    2053                 :            :  **/
    2054                 :          0 : s32 ixgbe_read_analog_reg8_82599(struct ixgbe_hw *hw, u32 reg, u8 *val)
    2055                 :            : {
    2056                 :            :         u32  core_ctl;
    2057                 :            : 
    2058                 :          0 :         DEBUGFUNC("ixgbe_read_analog_reg8_82599");
    2059                 :            : 
    2060                 :          0 :         IXGBE_WRITE_REG(hw, IXGBE_CORECTL, IXGBE_CORECTL_WRITE_CMD |
    2061                 :            :                         (reg << 8));
    2062                 :          0 :         IXGBE_WRITE_FLUSH(hw);
    2063                 :          0 :         usec_delay(10);
    2064                 :          0 :         core_ctl = IXGBE_READ_REG(hw, IXGBE_CORECTL);
    2065                 :          0 :         *val = (u8)core_ctl;
    2066                 :            : 
    2067                 :          0 :         return IXGBE_SUCCESS;
    2068                 :            : }
    2069                 :            : 
    2070                 :            : /**
    2071                 :            :  * ixgbe_write_analog_reg8_82599 - Writes 8 bit Omer analog register
    2072                 :            :  * @hw: pointer to hardware structure
    2073                 :            :  * @reg: atlas register to write
    2074                 :            :  * @val: value to write
    2075                 :            :  *
    2076                 :            :  * Performs write operation to Omer analog register specified.
    2077                 :            :  **/
    2078                 :          0 : s32 ixgbe_write_analog_reg8_82599(struct ixgbe_hw *hw, u32 reg, u8 val)
    2079                 :            : {
    2080                 :            :         u32  core_ctl;
    2081                 :            : 
    2082                 :          0 :         DEBUGFUNC("ixgbe_write_analog_reg8_82599");
    2083                 :            : 
    2084                 :          0 :         core_ctl = (reg << 8) | val;
    2085                 :          0 :         IXGBE_WRITE_REG(hw, IXGBE_CORECTL, core_ctl);
    2086                 :          0 :         IXGBE_WRITE_FLUSH(hw);
    2087                 :          0 :         usec_delay(10);
    2088                 :            : 
    2089                 :          0 :         return IXGBE_SUCCESS;
    2090                 :            : }
    2091                 :            : 
    2092                 :            : /**
    2093                 :            :  * ixgbe_start_hw_82599 - Prepare hardware for Tx/Rx
    2094                 :            :  * @hw: pointer to hardware structure
    2095                 :            :  *
    2096                 :            :  * Starts the hardware using the generic start_hw function
    2097                 :            :  * and the generation start_hw function.
    2098                 :            :  * Then performs revision-specific operations, if any.
    2099                 :            :  **/
    2100                 :          0 : s32 ixgbe_start_hw_82599(struct ixgbe_hw *hw)
    2101                 :            : {
    2102                 :            :         s32 ret_val = IXGBE_SUCCESS;
    2103                 :            : 
    2104                 :          0 :         DEBUGFUNC("ixgbe_start_hw_82599");
    2105                 :            : 
    2106                 :          0 :         ret_val = ixgbe_start_hw_generic(hw);
    2107         [ #  # ]:          0 :         if (ret_val != IXGBE_SUCCESS)
    2108                 :          0 :                 goto out;
    2109                 :            : 
    2110                 :          0 :         ixgbe_start_hw_gen2(hw);
    2111                 :            : 
    2112                 :            :         /* We need to run link autotry after the driver loads */
    2113                 :          0 :         hw->mac.autotry_restart = true;
    2114                 :            : 
    2115                 :            :         if (ret_val == IXGBE_SUCCESS)
    2116                 :          0 :                 ret_val = ixgbe_verify_fw_version_82599(hw);
    2117                 :          0 : out:
    2118                 :          0 :         return ret_val;
    2119                 :            : }
    2120                 :            : 
    2121                 :            : /**
    2122                 :            :  * ixgbe_identify_phy_82599 - Get physical layer module
    2123                 :            :  * @hw: pointer to hardware structure
    2124                 :            :  *
    2125                 :            :  * Determines the physical layer module found on the current adapter.
    2126                 :            :  * If PHY already detected, maintains current PHY type in hw struct,
    2127                 :            :  * otherwise executes the PHY detection routine.
    2128                 :            :  **/
    2129                 :          0 : s32 ixgbe_identify_phy_82599(struct ixgbe_hw *hw)
    2130                 :            : {
    2131                 :            :         s32 status;
    2132                 :            : 
    2133                 :          0 :         DEBUGFUNC("ixgbe_identify_phy_82599");
    2134                 :            : 
    2135                 :            :         /* Detect PHY if not unknown - returns success if already detected. */
    2136                 :          0 :         status = ixgbe_identify_phy_generic(hw);
    2137         [ #  # ]:          0 :         if (status != IXGBE_SUCCESS) {
    2138                 :            :                 /* 82599 10GBASE-T requires an external PHY */
    2139         [ #  # ]:          0 :                 if (hw->mac.ops.get_media_type(hw) == ixgbe_media_type_copper)
    2140                 :            :                         return status;
    2141                 :            :                 else
    2142                 :          0 :                         status = ixgbe_identify_module_generic(hw);
    2143                 :            :         }
    2144                 :            : 
    2145                 :            :         /* Set PHY type none if no PHY detected */
    2146         [ #  # ]:          0 :         if (hw->phy.type == ixgbe_phy_unknown) {
    2147                 :          0 :                 hw->phy.type = ixgbe_phy_none;
    2148                 :          0 :                 return IXGBE_SUCCESS;
    2149                 :            :         }
    2150                 :            : 
    2151                 :            :         /* Return error if SFP module has been detected but is not supported */
    2152         [ #  # ]:          0 :         if (hw->phy.type == ixgbe_phy_sfp_unsupported)
    2153                 :          0 :                 return IXGBE_ERR_SFP_NOT_SUPPORTED;
    2154                 :            : 
    2155                 :            :         return status;
    2156                 :            : }
    2157                 :            : 
    2158                 :            : /**
    2159                 :            :  * ixgbe_get_supported_physical_layer_82599 - Returns physical layer type
    2160                 :            :  * @hw: pointer to hardware structure
    2161                 :            :  *
    2162                 :            :  * Determines physical layer capabilities of the current configuration.
    2163                 :            :  **/
    2164                 :          0 : u64 ixgbe_get_supported_physical_layer_82599(struct ixgbe_hw *hw)
    2165                 :            : {
    2166                 :            :         u64 physical_layer = IXGBE_PHYSICAL_LAYER_UNKNOWN;
    2167                 :          0 :         u32 autoc = IXGBE_READ_REG(hw, IXGBE_AUTOC);
    2168                 :          0 :         u32 autoc2 = IXGBE_READ_REG(hw, IXGBE_AUTOC2);
    2169                 :          0 :         u32 pma_pmd_10g_serial = autoc2 & IXGBE_AUTOC2_10G_SERIAL_PMA_PMD_MASK;
    2170                 :          0 :         u32 pma_pmd_10g_parallel = autoc & IXGBE_AUTOC_10G_PMA_PMD_MASK;
    2171                 :          0 :         u32 pma_pmd_1g = autoc & IXGBE_AUTOC_1G_PMA_PMD_MASK;
    2172                 :          0 :         u16 ext_ability = 0;
    2173                 :            : 
    2174                 :          0 :         DEBUGFUNC("ixgbe_get_support_physical_layer_82599");
    2175                 :            : 
    2176                 :          0 :         hw->phy.ops.identify(hw);
    2177                 :            : 
    2178         [ #  # ]:          0 :         switch (hw->phy.type) {
    2179                 :          0 :         case ixgbe_phy_tn:
    2180                 :            :         case ixgbe_phy_cu_unknown:
    2181                 :          0 :                 hw->phy.ops.read_reg(hw, IXGBE_MDIO_PHY_EXT_ABILITY,
    2182                 :            :                 IXGBE_MDIO_PMA_PMD_DEV_TYPE, &ext_ability);
    2183         [ #  # ]:          0 :                 if (ext_ability & IXGBE_MDIO_PHY_10GBASET_ABILITY)
    2184                 :            :                         physical_layer |= IXGBE_PHYSICAL_LAYER_10GBASE_T;
    2185         [ #  # ]:          0 :                 if (ext_ability & IXGBE_MDIO_PHY_1000BASET_ABILITY)
    2186                 :          0 :                         physical_layer |= IXGBE_PHYSICAL_LAYER_1000BASE_T;
    2187         [ #  # ]:          0 :                 if (ext_ability & IXGBE_MDIO_PHY_100BASETX_ABILITY)
    2188                 :          0 :                         physical_layer |= IXGBE_PHYSICAL_LAYER_100BASE_TX;
    2189                 :          0 :                 goto out;
    2190                 :            :         default:
    2191                 :            :                 break;
    2192                 :            :         }
    2193                 :            : 
    2194   [ #  #  #  #  :          0 :         switch (autoc & IXGBE_AUTOC_LMS_MASK) {
                      # ]
    2195                 :          0 :         case IXGBE_AUTOC_LMS_1G_AN:
    2196                 :            :         case IXGBE_AUTOC_LMS_1G_LINK_NO_AN:
    2197         [ #  # ]:          0 :                 if (pma_pmd_1g == IXGBE_AUTOC_1G_KX_BX) {
    2198                 :            :                         physical_layer = IXGBE_PHYSICAL_LAYER_1000BASE_KX |
    2199                 :            :                             IXGBE_PHYSICAL_LAYER_1000BASE_BX;
    2200                 :          0 :                         goto out;
    2201                 :            :                 } else
    2202                 :            :                         /* SFI mode so read SFP module */
    2203                 :          0 :                         goto sfp_check;
    2204                 :            :                 break;
    2205                 :          0 :         case IXGBE_AUTOC_LMS_10G_LINK_NO_AN:
    2206         [ #  # ]:          0 :                 if (pma_pmd_10g_parallel == IXGBE_AUTOC_10G_CX4)
    2207                 :            :                         physical_layer = IXGBE_PHYSICAL_LAYER_10GBASE_CX4;
    2208         [ #  # ]:          0 :                 else if (pma_pmd_10g_parallel == IXGBE_AUTOC_10G_KX4)
    2209                 :            :                         physical_layer = IXGBE_PHYSICAL_LAYER_10GBASE_KX4;
    2210         [ #  # ]:          0 :                 else if (pma_pmd_10g_parallel == IXGBE_AUTOC_10G_XAUI)
    2211                 :            :                         physical_layer = IXGBE_PHYSICAL_LAYER_10GBASE_XAUI;
    2212                 :          0 :                 goto out;
    2213                 :            :                 break;
    2214                 :          0 :         case IXGBE_AUTOC_LMS_10G_SERIAL:
    2215         [ #  # ]:          0 :                 if (pma_pmd_10g_serial == IXGBE_AUTOC2_10G_KR) {
    2216                 :            :                         physical_layer = IXGBE_PHYSICAL_LAYER_10GBASE_KR;
    2217                 :          0 :                         goto out;
    2218                 :            :                 } else if (pma_pmd_10g_serial == IXGBE_AUTOC2_10G_SFI)
    2219                 :            :                         goto sfp_check;
    2220                 :            :                 break;
    2221                 :          0 :         case IXGBE_AUTOC_LMS_KX4_KX_KR:
    2222                 :            :         case IXGBE_AUTOC_LMS_KX4_KX_KR_1G_AN:
    2223         [ #  # ]:          0 :                 if (autoc & IXGBE_AUTOC_KX_SUPP)
    2224                 :            :                         physical_layer |= IXGBE_PHYSICAL_LAYER_1000BASE_KX;
    2225         [ #  # ]:          0 :                 if (autoc & IXGBE_AUTOC_KX4_SUPP)
    2226                 :          0 :                         physical_layer |= IXGBE_PHYSICAL_LAYER_10GBASE_KX4;
    2227         [ #  # ]:          0 :                 if (autoc & IXGBE_AUTOC_KR_SUPP)
    2228                 :          0 :                         physical_layer |= IXGBE_PHYSICAL_LAYER_10GBASE_KR;
    2229                 :          0 :                 goto out;
    2230                 :            :                 break;
    2231                 :          0 :         default:
    2232                 :          0 :                 goto out;
    2233                 :            :                 break;
    2234                 :            :         }
    2235                 :            : 
    2236                 :          0 : sfp_check:
    2237                 :            :         /* SFP check must be done last since DA modules are sometimes used to
    2238                 :            :          * test KR mode -  we need to id KR mode correctly before SFP module.
    2239                 :            :          * Call identify_sfp because the pluggable module may have changed */
    2240                 :          0 :         physical_layer = ixgbe_get_supported_phy_sfp_layer_generic(hw);
    2241                 :          0 : out:
    2242                 :          0 :         return physical_layer;
    2243                 :            : }
    2244                 :            : 
    2245                 :            : /**
    2246                 :            :  * ixgbe_enable_rx_dma_82599 - Enable the Rx DMA unit on 82599
    2247                 :            :  * @hw: pointer to hardware structure
    2248                 :            :  * @regval: register value to write to RXCTRL
    2249                 :            :  *
    2250                 :            :  * Enables the Rx DMA unit for 82599
    2251                 :            :  **/
    2252                 :          0 : s32 ixgbe_enable_rx_dma_82599(struct ixgbe_hw *hw, u32 regval)
    2253                 :            : {
    2254                 :            : 
    2255                 :          0 :         DEBUGFUNC("ixgbe_enable_rx_dma_82599");
    2256                 :            : 
    2257                 :            :         /*
    2258                 :            :          * Workaround for 82599 silicon errata when enabling the Rx datapath.
    2259                 :            :          * If traffic is incoming before we enable the Rx unit, it could hang
    2260                 :            :          * the Rx DMA unit.  Therefore, make sure the security engine is
    2261                 :            :          * completely disabled prior to enabling the Rx unit.
    2262                 :            :          */
    2263                 :            : 
    2264                 :          0 :         hw->mac.ops.disable_sec_rx_path(hw);
    2265                 :            : 
    2266         [ #  # ]:          0 :         if (regval & IXGBE_RXCTRL_RXEN)
    2267                 :          0 :                 ixgbe_enable_rx(hw);
    2268                 :            :         else
    2269                 :          0 :                 ixgbe_disable_rx(hw);
    2270                 :            : 
    2271                 :          0 :         hw->mac.ops.enable_sec_rx_path(hw);
    2272                 :            : 
    2273                 :          0 :         return IXGBE_SUCCESS;
    2274                 :            : }
    2275                 :            : 
    2276                 :            : /**
    2277                 :            :  * ixgbe_verify_fw_version_82599 - verify FW version for 82599
    2278                 :            :  * @hw: pointer to hardware structure
    2279                 :            :  *
    2280                 :            :  * Verifies that installed the firmware version is 0.6 or higher
    2281                 :            :  * for SFI devices. All 82599 SFI devices should have version 0.6 or higher.
    2282                 :            :  *
    2283                 :            :  * Returns IXGBE_ERR_EEPROM_VERSION if the FW is not present or
    2284                 :            :  * if the FW version is not supported.
    2285                 :            :  **/
    2286                 :          0 : STATIC s32 ixgbe_verify_fw_version_82599(struct ixgbe_hw *hw)
    2287                 :            : {
    2288                 :            :         s32 status = IXGBE_ERR_EEPROM_VERSION;
    2289                 :            :         u16 fw_offset, fw_ptp_cfg_offset;
    2290                 :            :         u16 fw_version;
    2291                 :            : 
    2292                 :          0 :         DEBUGFUNC("ixgbe_verify_fw_version_82599");
    2293                 :            : 
    2294                 :            :         /* firmware check is only necessary for SFI devices */
    2295         [ #  # ]:          0 :         if (hw->phy.media_type != ixgbe_media_type_fiber) {
    2296                 :            :                 status = IXGBE_SUCCESS;
    2297                 :          0 :                 goto fw_version_out;
    2298                 :            :         }
    2299                 :            : 
    2300                 :            :         /* get the offset to the Firmware Module block */
    2301         [ #  # ]:          0 :         if (hw->eeprom.ops.read(hw, IXGBE_FW_PTR, &fw_offset)) {
    2302                 :          0 :                 ERROR_REPORT2(IXGBE_ERROR_INVALID_STATE,
    2303                 :            :                               "eeprom read at offset %d failed", IXGBE_FW_PTR);
    2304                 :          0 :                 return IXGBE_ERR_EEPROM_VERSION;
    2305                 :            :         }
    2306                 :            : 
    2307         [ #  # ]:          0 :         if ((fw_offset == 0) || (fw_offset == 0xFFFF))
    2308                 :          0 :                 goto fw_version_out;
    2309                 :            : 
    2310                 :            :         /* get the offset to the Pass Through Patch Configuration block */
    2311         [ #  # ]:          0 :         if (hw->eeprom.ops.read(hw, (fw_offset +
    2312                 :            :                                  IXGBE_FW_PASSTHROUGH_PATCH_CONFIG_PTR),
    2313                 :            :                                  &fw_ptp_cfg_offset)) {
    2314                 :          0 :                 ERROR_REPORT2(IXGBE_ERROR_INVALID_STATE,
    2315                 :            :                               "eeprom read at offset %d failed",
    2316                 :            :                               fw_offset +
    2317                 :            :                               IXGBE_FW_PASSTHROUGH_PATCH_CONFIG_PTR);
    2318                 :          0 :                 return IXGBE_ERR_EEPROM_VERSION;
    2319                 :            :         }
    2320                 :            : 
    2321         [ #  # ]:          0 :         if ((fw_ptp_cfg_offset == 0) || (fw_ptp_cfg_offset == 0xFFFF))
    2322                 :          0 :                 goto fw_version_out;
    2323                 :            : 
    2324                 :            :         /* get the firmware version */
    2325         [ #  # ]:          0 :         if (hw->eeprom.ops.read(hw, (fw_ptp_cfg_offset +
    2326                 :            :                             IXGBE_FW_PATCH_VERSION_4), &fw_version)) {
    2327                 :          0 :                 ERROR_REPORT2(IXGBE_ERROR_INVALID_STATE,
    2328                 :            :                               "eeprom read at offset %d failed",
    2329                 :            :                               fw_ptp_cfg_offset + IXGBE_FW_PATCH_VERSION_4);
    2330                 :          0 :                 return IXGBE_ERR_EEPROM_VERSION;
    2331                 :            :         }
    2332                 :            : 
    2333         [ #  # ]:          0 :         if (fw_version > 0x5)
    2334                 :            :                 status = IXGBE_SUCCESS;
    2335                 :            : 
    2336                 :          0 : fw_version_out:
    2337                 :            :         return status;
    2338                 :            : }
    2339                 :            : 
    2340                 :            : /**
    2341                 :            :  * ixgbe_verify_lesm_fw_enabled_82599 - Checks LESM FW module state.
    2342                 :            :  * @hw: pointer to hardware structure
    2343                 :            :  *
    2344                 :            :  * Returns true if the LESM FW module is present and enabled. Otherwise
    2345                 :            :  * returns false. Smart Speed must be disabled if LESM FW module is enabled.
    2346                 :            :  **/
    2347                 :          0 : bool ixgbe_verify_lesm_fw_enabled_82599(struct ixgbe_hw *hw)
    2348                 :            : {
    2349                 :            :         bool lesm_enabled = false;
    2350                 :            :         u16 fw_offset, fw_lesm_param_offset, fw_lesm_state;
    2351                 :            :         s32 status;
    2352                 :            : 
    2353                 :          0 :         DEBUGFUNC("ixgbe_verify_lesm_fw_enabled_82599");
    2354                 :            : 
    2355                 :            :         /* get the offset to the Firmware Module block */
    2356                 :          0 :         status = hw->eeprom.ops.read(hw, IXGBE_FW_PTR, &fw_offset);
    2357                 :            : 
    2358         [ #  # ]:          0 :         if ((status != IXGBE_SUCCESS) ||
    2359   [ #  #  #  # ]:          0 :             (fw_offset == 0) || (fw_offset == 0xFFFF))
    2360                 :          0 :                 goto out;
    2361                 :            : 
    2362                 :            :         /* get the offset to the LESM Parameters block */
    2363                 :          0 :         status = hw->eeprom.ops.read(hw, (fw_offset +
    2364                 :            :                                      IXGBE_FW_LESM_PARAMETERS_PTR),
    2365                 :            :                                      &fw_lesm_param_offset);
    2366                 :            : 
    2367         [ #  # ]:          0 :         if ((status != IXGBE_SUCCESS) ||
    2368   [ #  #  #  # ]:          0 :             (fw_lesm_param_offset == 0) || (fw_lesm_param_offset == 0xFFFF))
    2369                 :          0 :                 goto out;
    2370                 :            : 
    2371                 :            :         /* get the LESM state word */
    2372                 :          0 :         status = hw->eeprom.ops.read(hw, (fw_lesm_param_offset +
    2373                 :            :                                      IXGBE_FW_LESM_STATE_1),
    2374                 :            :                                      &fw_lesm_state);
    2375                 :            : 
    2376   [ #  #  #  # ]:          0 :         if ((status == IXGBE_SUCCESS) &&
    2377                 :            :             (fw_lesm_state & IXGBE_FW_LESM_STATE_ENABLED))
    2378                 :            :                 lesm_enabled = true;
    2379                 :            : 
    2380                 :          0 : out:
    2381                 :          0 :         return lesm_enabled;
    2382                 :            : }
    2383                 :            : 
    2384                 :            : /**
    2385                 :            :  * ixgbe_read_eeprom_buffer_82599 - Read EEPROM word(s) using
    2386                 :            :  * fastest available method
    2387                 :            :  *
    2388                 :            :  * @hw: pointer to hardware structure
    2389                 :            :  * @offset: offset of  word in EEPROM to read
    2390                 :            :  * @words: number of words
    2391                 :            :  * @data: word(s) read from the EEPROM
    2392                 :            :  *
    2393                 :            :  * Retrieves 16 bit word(s) read from EEPROM
    2394                 :            :  **/
    2395                 :          0 : STATIC s32 ixgbe_read_eeprom_buffer_82599(struct ixgbe_hw *hw, u16 offset,
    2396                 :            :                                           u16 words, u16 *data)
    2397                 :            : {
    2398                 :            :         struct ixgbe_eeprom_info *eeprom = &hw->eeprom;
    2399                 :            :         s32 ret_val = IXGBE_ERR_CONFIG;
    2400                 :            : 
    2401                 :          0 :         DEBUGFUNC("ixgbe_read_eeprom_buffer_82599");
    2402                 :            : 
    2403                 :            :         /*
    2404                 :            :          * If EEPROM is detected and can be addressed using 14 bits,
    2405                 :            :          * use EERD otherwise use bit bang
    2406                 :            :          */
    2407         [ #  # ]:          0 :         if ((eeprom->type == ixgbe_eeprom_spi) &&
    2408         [ #  # ]:          0 :             (offset + (words - 1) <= IXGBE_EERD_MAX_ADDR))
    2409                 :          0 :                 ret_val = ixgbe_read_eerd_buffer_generic(hw, offset, words,
    2410                 :            :                                                          data);
    2411                 :            :         else
    2412                 :          0 :                 ret_val = ixgbe_read_eeprom_buffer_bit_bang_generic(hw, offset,
    2413                 :            :                                                                     words,
    2414                 :            :                                                                     data);
    2415                 :            : 
    2416                 :          0 :         return ret_val;
    2417                 :            : }
    2418                 :            : 
    2419                 :            : /**
    2420                 :            :  * ixgbe_read_eeprom_82599 - Read EEPROM word using
    2421                 :            :  * fastest available method
    2422                 :            :  *
    2423                 :            :  * @hw: pointer to hardware structure
    2424                 :            :  * @offset: offset of  word in the EEPROM to read
    2425                 :            :  * @data: word read from the EEPROM
    2426                 :            :  *
    2427                 :            :  * Reads a 16 bit word from the EEPROM
    2428                 :            :  **/
    2429                 :          0 : STATIC s32 ixgbe_read_eeprom_82599(struct ixgbe_hw *hw,
    2430                 :            :                                    u16 offset, u16 *data)
    2431                 :            : {
    2432                 :            :         struct ixgbe_eeprom_info *eeprom = &hw->eeprom;
    2433                 :            :         s32 ret_val = IXGBE_ERR_CONFIG;
    2434                 :            : 
    2435                 :          0 :         DEBUGFUNC("ixgbe_read_eeprom_82599");
    2436                 :            : 
    2437                 :            :         /*
    2438                 :            :          * If EEPROM is detected and can be addressed using 14 bits,
    2439                 :            :          * use EERD otherwise use bit bang
    2440                 :            :          */
    2441   [ #  #  #  # ]:          0 :         if ((eeprom->type == ixgbe_eeprom_spi) &&
    2442                 :            :             (offset <= IXGBE_EERD_MAX_ADDR))
    2443                 :          0 :                 ret_val = ixgbe_read_eerd_generic(hw, offset, data);
    2444                 :            :         else
    2445                 :          0 :                 ret_val = ixgbe_read_eeprom_bit_bang_generic(hw, offset, data);
    2446                 :            : 
    2447                 :          0 :         return ret_val;
    2448                 :            : }
    2449                 :            : 
    2450                 :            : /**
    2451                 :            :  * ixgbe_reset_pipeline_82599 - perform pipeline reset
    2452                 :            :  *
    2453                 :            :  * @hw: pointer to hardware structure
    2454                 :            :  *
    2455                 :            :  * Reset pipeline by asserting Restart_AN together with LMS change to ensure
    2456                 :            :  * full pipeline reset.  This function assumes the SW/FW lock is held.
    2457                 :            :  **/
    2458                 :          0 : s32 ixgbe_reset_pipeline_82599(struct ixgbe_hw *hw)
    2459                 :            : {
    2460                 :            :         s32 ret_val;
    2461                 :            :         u32 anlp1_reg = 0;
    2462                 :            :         u32 i, autoc_reg, autoc2_reg;
    2463                 :            : 
    2464                 :            :         /* Enable link if disabled in NVM */
    2465                 :          0 :         autoc2_reg = IXGBE_READ_REG(hw, IXGBE_AUTOC2);
    2466         [ #  # ]:          0 :         if (autoc2_reg & IXGBE_AUTOC2_LINK_DISABLE_MASK) {
    2467                 :          0 :                 autoc2_reg &= ~IXGBE_AUTOC2_LINK_DISABLE_MASK;
    2468                 :          0 :                 IXGBE_WRITE_REG(hw, IXGBE_AUTOC2, autoc2_reg);
    2469                 :          0 :                 IXGBE_WRITE_FLUSH(hw);
    2470                 :            :         }
    2471                 :            : 
    2472                 :          0 :         autoc_reg = IXGBE_READ_REG(hw, IXGBE_AUTOC);
    2473                 :          0 :         autoc_reg |= IXGBE_AUTOC_AN_RESTART;
    2474                 :            :         /* Write AUTOC register with toggled LMS[2] bit and Restart_AN */
    2475                 :          0 :         IXGBE_WRITE_REG(hw, IXGBE_AUTOC,
    2476                 :            :                         autoc_reg ^ (0x4 << IXGBE_AUTOC_LMS_SHIFT));
    2477                 :            :         /* Wait for AN to leave state 0 */
    2478         [ #  # ]:          0 :         for (i = 0; i < 10; i++) {
    2479                 :          0 :                 msec_delay(4);
    2480                 :          0 :                 anlp1_reg = IXGBE_READ_REG(hw, IXGBE_ANLP1);
    2481         [ #  # ]:          0 :                 if (anlp1_reg & IXGBE_ANLP1_AN_STATE_MASK)
    2482                 :            :                         break;
    2483                 :            :         }
    2484                 :            : 
    2485         [ #  # ]:          0 :         if (!(anlp1_reg & IXGBE_ANLP1_AN_STATE_MASK)) {
    2486                 :          0 :                 DEBUGOUT("auto negotiation not completed\n");
    2487                 :            :                 ret_val = IXGBE_ERR_RESET_FAILED;
    2488                 :          0 :                 goto reset_pipeline_out;
    2489                 :            :         }
    2490                 :            : 
    2491                 :            :         ret_val = IXGBE_SUCCESS;
    2492                 :            : 
    2493                 :          0 : reset_pipeline_out:
    2494                 :            :         /* Write AUTOC register with original LMS field and Restart_AN */
    2495                 :          0 :         IXGBE_WRITE_REG(hw, IXGBE_AUTOC, autoc_reg);
    2496                 :          0 :         IXGBE_WRITE_FLUSH(hw);
    2497                 :            : 
    2498                 :          0 :         return ret_val;
    2499                 :            : }
    2500                 :            : 
    2501                 :            : /**
    2502                 :            :  * ixgbe_read_i2c_byte_82599 - Reads 8 bit word over I2C
    2503                 :            :  * @hw: pointer to hardware structure
    2504                 :            :  * @byte_offset: byte offset to read
    2505                 :            :  * @dev_addr: address to read from
    2506                 :            :  * @data: value read
    2507                 :            :  *
    2508                 :            :  * Performs byte read operation to SFP module's EEPROM over I2C interface at
    2509                 :            :  * a specified device address.
    2510                 :            :  **/
    2511                 :          0 : STATIC s32 ixgbe_read_i2c_byte_82599(struct ixgbe_hw *hw, u8 byte_offset,
    2512                 :            :                                 u8 dev_addr, u8 *data)
    2513                 :            : {
    2514                 :            :         u32 esdp;
    2515                 :            :         s32 status;
    2516                 :            :         s32 timeout = 200;
    2517                 :            : 
    2518                 :          0 :         DEBUGFUNC("ixgbe_read_i2c_byte_82599");
    2519                 :            : 
    2520         [ #  # ]:          0 :         if (hw->phy.qsfp_shared_i2c_bus == TRUE) {
    2521                 :            :                 /* Acquire I2C bus ownership. */
    2522                 :          0 :                 esdp = IXGBE_READ_REG(hw, IXGBE_ESDP);
    2523                 :          0 :                 esdp |= IXGBE_ESDP_SDP0;
    2524                 :          0 :                 IXGBE_WRITE_REG(hw, IXGBE_ESDP, esdp);
    2525                 :          0 :                 IXGBE_WRITE_FLUSH(hw);
    2526                 :            : 
    2527         [ #  # ]:          0 :                 while (timeout) {
    2528                 :          0 :                         esdp = IXGBE_READ_REG(hw, IXGBE_ESDP);
    2529         [ #  # ]:          0 :                         if (esdp & IXGBE_ESDP_SDP1)
    2530                 :            :                                 break;
    2531                 :            : 
    2532                 :          0 :                         msec_delay(5);
    2533                 :          0 :                         timeout--;
    2534                 :            :                 }
    2535                 :            : 
    2536         [ #  # ]:          0 :                 if (!timeout) {
    2537                 :          0 :                         DEBUGOUT("Driver can't access resource,"
    2538                 :            :                                  " acquiring I2C bus timeout.\n");
    2539                 :            :                         status = IXGBE_ERR_I2C;
    2540                 :          0 :                         goto release_i2c_access;
    2541                 :            :                 }
    2542                 :            :         }
    2543                 :            : 
    2544                 :          0 :         status = ixgbe_read_i2c_byte_generic(hw, byte_offset, dev_addr, data);
    2545                 :            : 
    2546                 :          0 : release_i2c_access:
    2547                 :            : 
    2548         [ #  # ]:          0 :         if (hw->phy.qsfp_shared_i2c_bus == TRUE) {
    2549                 :            :                 /* Release I2C bus ownership. */
    2550                 :          0 :                 esdp = IXGBE_READ_REG(hw, IXGBE_ESDP);
    2551                 :          0 :                 esdp &= ~IXGBE_ESDP_SDP0;
    2552                 :          0 :                 IXGBE_WRITE_REG(hw, IXGBE_ESDP, esdp);
    2553                 :          0 :                 IXGBE_WRITE_FLUSH(hw);
    2554                 :            :         }
    2555                 :            : 
    2556                 :          0 :         return status;
    2557                 :            : }
    2558                 :            : 
    2559                 :            : /**
    2560                 :            :  * ixgbe_write_i2c_byte_82599 - Writes 8 bit word over I2C
    2561                 :            :  * @hw: pointer to hardware structure
    2562                 :            :  * @byte_offset: byte offset to write
    2563                 :            :  * @dev_addr: address to read from
    2564                 :            :  * @data: value to write
    2565                 :            :  *
    2566                 :            :  * Performs byte write operation to SFP module's EEPROM over I2C interface at
    2567                 :            :  * a specified device address.
    2568                 :            :  **/
    2569                 :          0 : STATIC s32 ixgbe_write_i2c_byte_82599(struct ixgbe_hw *hw, u8 byte_offset,
    2570                 :            :                                  u8 dev_addr, u8 data)
    2571                 :            : {
    2572                 :            :         u32 esdp;
    2573                 :            :         s32 status;
    2574                 :            :         s32 timeout = 200;
    2575                 :            : 
    2576                 :          0 :         DEBUGFUNC("ixgbe_write_i2c_byte_82599");
    2577                 :            : 
    2578         [ #  # ]:          0 :         if (hw->phy.qsfp_shared_i2c_bus == TRUE) {
    2579                 :            :                 /* Acquire I2C bus ownership. */
    2580                 :          0 :                 esdp = IXGBE_READ_REG(hw, IXGBE_ESDP);
    2581                 :          0 :                 esdp |= IXGBE_ESDP_SDP0;
    2582                 :          0 :                 IXGBE_WRITE_REG(hw, IXGBE_ESDP, esdp);
    2583                 :          0 :                 IXGBE_WRITE_FLUSH(hw);
    2584                 :            : 
    2585         [ #  # ]:          0 :                 while (timeout) {
    2586                 :          0 :                         esdp = IXGBE_READ_REG(hw, IXGBE_ESDP);
    2587         [ #  # ]:          0 :                         if (esdp & IXGBE_ESDP_SDP1)
    2588                 :            :                                 break;
    2589                 :            : 
    2590                 :          0 :                         msec_delay(5);
    2591                 :          0 :                         timeout--;
    2592                 :            :                 }
    2593                 :            : 
    2594         [ #  # ]:          0 :                 if (!timeout) {
    2595                 :          0 :                         DEBUGOUT("Driver can't access resource,"
    2596                 :            :                                  " acquiring I2C bus timeout.\n");
    2597                 :            :                         status = IXGBE_ERR_I2C;
    2598                 :          0 :                         goto release_i2c_access;
    2599                 :            :                 }
    2600                 :            :         }
    2601                 :            : 
    2602                 :          0 :         status = ixgbe_write_i2c_byte_generic(hw, byte_offset, dev_addr, data);
    2603                 :            : 
    2604                 :          0 : release_i2c_access:
    2605                 :            : 
    2606         [ #  # ]:          0 :         if (hw->phy.qsfp_shared_i2c_bus == TRUE) {
    2607                 :            :                 /* Release I2C bus ownership. */
    2608                 :          0 :                 esdp = IXGBE_READ_REG(hw, IXGBE_ESDP);
    2609                 :          0 :                 esdp &= ~IXGBE_ESDP_SDP0;
    2610                 :          0 :                 IXGBE_WRITE_REG(hw, IXGBE_ESDP, esdp);
    2611                 :          0 :                 IXGBE_WRITE_FLUSH(hw);
    2612                 :            :         }
    2613                 :            : 
    2614                 :          0 :         return status;
    2615                 :            : }

Generated by: LCOV version 1.14