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


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

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

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

    1 /******************************************************************************
    2   SPDX-License-Identifier: BSD-3-Clause
    3 
    4   Copyright (c) 2001-2020, Intel Corporation
    5   All rights reserved.
    6 
    7   Redistribution and use in source and binary forms, with or without
    8   modification, are permitted provided that the following conditions are met:
    9 
   10    1. Redistributions of source code must retain the above copyright notice,
   11       this list of conditions and the following disclaimer.
   12 
   13    2. Redistributions in binary form must reproduce the above copyright
   14       notice, this list of conditions and the following disclaimer in the
   15       documentation and/or other materials provided with the distribution.
   16 
   17    3. Neither the name of the Intel Corporation nor the names of its
   18       contributors may be used to endorse or promote products derived from
   19       this software without specific prior written permission.
   20 
   21   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
   22   AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   23   IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   24   ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
   25   LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
   26   CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
   27   SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
   28   INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
   29   CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
   30   ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
   31   POSSIBILITY OF SUCH DAMAGE.
   32 
   33 ******************************************************************************/
   34 /*$FreeBSD$*/
   35 
   36 #include "ixgbe_x540.h"
   37 #include "ixgbe_type.h"
   38 #include "ixgbe_api.h"
   39 #include "ixgbe_common.h"
   40 #include "ixgbe_phy.h"
   41 
   42 #define IXGBE_X540_MAX_TX_QUEUES        128
   43 #define IXGBE_X540_MAX_RX_QUEUES        128
   44 #define IXGBE_X540_RAR_ENTRIES          128
   45 #define IXGBE_X540_MC_TBL_SIZE          128
   46 #define IXGBE_X540_VFT_TBL_SIZE         128
   47 #define IXGBE_X540_RX_PB_SIZE           384
   48 
   49 static s32 ixgbe_poll_flash_update_done_X540(struct ixgbe_hw *hw);
   50 static s32 ixgbe_get_swfw_sync_semaphore(struct ixgbe_hw *hw);
   51 static void ixgbe_release_swfw_sync_semaphore(struct ixgbe_hw *hw);
   52 
   53 /**
   54  * ixgbe_init_ops_X540 - Inits func ptrs and MAC type
   55  * @hw: pointer to hardware structure
   56  *
   57  * Initialize the function pointers and assign the MAC type for X540.
   58  * Does not touch the hardware.
   59  **/
   60 s32 ixgbe_init_ops_X540(struct ixgbe_hw *hw)
   61 {
   62         struct ixgbe_mac_info *mac = &hw->mac;
   63         struct ixgbe_phy_info *phy = &hw->phy;
   64         struct ixgbe_eeprom_info *eeprom = &hw->eeprom;
   65         s32 ret_val;
   66 
   67         DEBUGFUNC("ixgbe_init_ops_X540");
   68 
   69         ret_val = ixgbe_init_phy_ops_generic(hw);
   70         ret_val = ixgbe_init_ops_generic(hw);
   71 
   72 
   73         /* EEPROM */
   74         eeprom->ops.init_params = ixgbe_init_eeprom_params_X540;
   75         eeprom->ops.read = ixgbe_read_eerd_X540;
   76         eeprom->ops.read_buffer = ixgbe_read_eerd_buffer_X540;
   77         eeprom->ops.write = ixgbe_write_eewr_X540;
   78         eeprom->ops.write_buffer = ixgbe_write_eewr_buffer_X540;
   79         eeprom->ops.update_checksum = ixgbe_update_eeprom_checksum_X540;
   80         eeprom->ops.validate_checksum = ixgbe_validate_eeprom_checksum_X540;
   81         eeprom->ops.calc_checksum = ixgbe_calc_eeprom_checksum_X540;
   82 
   83         /* PHY */
   84         phy->ops.init = ixgbe_init_phy_ops_generic;
   85         phy->ops.reset = NULL;
   86         phy->ops.set_phy_power = ixgbe_set_copper_phy_power;
   87 
   88         /* MAC */
   89         mac->ops.reset_hw = ixgbe_reset_hw_X540;
   90         mac->ops.enable_relaxed_ordering = ixgbe_enable_relaxed_ordering_gen2;
   91         mac->ops.get_media_type = ixgbe_get_media_type_X540;
   92         mac->ops.get_supported_physical_layer =
   93                                     ixgbe_get_supported_physical_layer_X540;
   94         mac->ops.read_analog_reg8 = NULL;
   95         mac->ops.write_analog_reg8 = NULL;
   96         mac->ops.start_hw = ixgbe_start_hw_X540;
   97         mac->ops.get_san_mac_addr = ixgbe_get_san_mac_addr_generic;
   98         mac->ops.set_san_mac_addr = ixgbe_set_san_mac_addr_generic;
   99         mac->ops.get_device_caps = ixgbe_get_device_caps_generic;
  100         mac->ops.get_wwn_prefix = ixgbe_get_wwn_prefix_generic;
  101         mac->ops.get_fcoe_boot_status = ixgbe_get_fcoe_boot_status_generic;
  102         mac->ops.acquire_swfw_sync = ixgbe_acquire_swfw_sync_X540;
  103         mac->ops.release_swfw_sync = ixgbe_release_swfw_sync_X540;
  104         mac->ops.init_swfw_sync = ixgbe_init_swfw_sync_X540;
  105         mac->ops.disable_sec_rx_path = ixgbe_disable_sec_rx_path_generic;
  106         mac->ops.enable_sec_rx_path = ixgbe_enable_sec_rx_path_generic;
  107 
  108         /* RAR, Multicast, VLAN */
  109         mac->ops.set_vmdq = ixgbe_set_vmdq_generic;
  110         mac->ops.set_vmdq_san_mac = ixgbe_set_vmdq_san_mac_generic;
  111         mac->ops.clear_vmdq = ixgbe_clear_vmdq_generic;
  112         mac->ops.insert_mac_addr = ixgbe_insert_mac_addr_generic;
  113         mac->rar_highwater = 1;
  114         mac->ops.set_vfta = ixgbe_set_vfta_generic;
  115         mac->ops.set_vlvf = ixgbe_set_vlvf_generic;
  116         mac->ops.clear_vfta = ixgbe_clear_vfta_generic;
  117         mac->ops.init_uta_tables = ixgbe_init_uta_tables_generic;
  118         mac->ops.set_mac_anti_spoofing = ixgbe_set_mac_anti_spoofing;
  119         mac->ops.set_vlan_anti_spoofing = ixgbe_set_vlan_anti_spoofing;
  120 
  121         /* Link */
  122         mac->ops.get_link_capabilities =
  123                                 ixgbe_get_copper_link_capabilities_generic;
  124         mac->ops.setup_link = ixgbe_setup_mac_link_X540;
  125         mac->ops.setup_rxpba = ixgbe_set_rxpba_generic;
  126         mac->ops.check_link = ixgbe_check_mac_link_generic;
  127         mac->ops.bypass_rw = ixgbe_bypass_rw_generic;
  128         mac->ops.bypass_valid_rd = ixgbe_bypass_valid_rd_generic;
  129         mac->ops.bypass_set = ixgbe_bypass_set_generic;
  130         mac->ops.bypass_rd_eep = ixgbe_bypass_rd_eep_generic;
  131 
  132 
  133         mac->mcft_size          = IXGBE_X540_MC_TBL_SIZE;
  134         mac->vft_size           = IXGBE_X540_VFT_TBL_SIZE;
  135         mac->num_rar_entries    = IXGBE_X540_RAR_ENTRIES;
  136         mac->rx_pb_size         = IXGBE_X540_RX_PB_SIZE;
  137         mac->max_rx_queues      = IXGBE_X540_MAX_RX_QUEUES;
  138         mac->max_tx_queues      = IXGBE_X540_MAX_TX_QUEUES;
  139         mac->max_msix_vectors   = ixgbe_get_pcie_msix_count_generic(hw);
  140 
  141         /*
  142          * FWSM register
  143          * ARC supported; valid only if manageability features are
  144          * enabled.
  145          */
  146         mac->arc_subsystem_valid = !!(IXGBE_READ_REG(hw, IXGBE_FWSM_BY_MAC(hw))
  147                                      & IXGBE_FWSM_MODE_MASK);
  148 
  149         hw->mbx.ops.init_params = ixgbe_init_mbx_params_pf;
  150 
  151         /* LEDs */
  152         mac->ops.blink_led_start = ixgbe_blink_led_start_X540;
  153         mac->ops.blink_led_stop = ixgbe_blink_led_stop_X540;
  154 
  155         /* Manageability interface */
  156         mac->ops.set_fw_drv_ver = ixgbe_set_fw_drv_ver_generic;
  157 
  158         mac->ops.get_rtrup2tc = ixgbe_dcb_get_rtrup2tc_generic;
  159 
  160         return ret_val;
  161 }
  162 
  163 /**
  164  * ixgbe_get_link_capabilities_X540 - Determines link capabilities
  165  * @hw: pointer to hardware structure
  166  * @speed: pointer to link speed
  167  * @autoneg: true when autoneg or autotry is enabled
  168  *
  169  * Determines the link capabilities by reading the AUTOC register.
  170  **/
  171 s32 ixgbe_get_link_capabilities_X540(struct ixgbe_hw *hw,
  172                                      ixgbe_link_speed *speed,
  173                                      bool *autoneg)
  174 {
  175         ixgbe_get_copper_link_capabilities_generic(hw, speed, autoneg);
  176 
  177         return IXGBE_SUCCESS;
  178 }
  179 
  180 /**
  181  * ixgbe_get_media_type_X540 - Get media type
  182  * @hw: pointer to hardware structure
  183  *
  184  * Returns the media type (fiber, copper, backplane)
  185  **/
  186 enum ixgbe_media_type ixgbe_get_media_type_X540(struct ixgbe_hw *hw)
  187 {
  188         UNREFERENCED_1PARAMETER(hw);
  189         return ixgbe_media_type_copper;
  190 }
  191 
  192 /**
  193  * ixgbe_setup_mac_link_X540 - Sets the auto advertised capabilities
  194  * @hw: pointer to hardware structure
  195  * @speed: new link speed
  196  * @autoneg_wait_to_complete: true when waiting for completion is needed
  197  **/
  198 s32 ixgbe_setup_mac_link_X540(struct ixgbe_hw *hw,
  199                               ixgbe_link_speed speed,
  200                               bool autoneg_wait_to_complete)
  201 {
  202         DEBUGFUNC("ixgbe_setup_mac_link_X540");
  203         return hw->phy.ops.setup_link_speed(hw, speed, autoneg_wait_to_complete);
  204 }
  205 
  206 /**
  207  * ixgbe_reset_hw_X540 - Perform hardware reset
  208  * @hw: pointer to hardware structure
  209  *
  210  * Resets the hardware by resetting the transmit and receive units, masks
  211  * and clears all interrupts, and perform a reset.
  212  **/
  213 s32 ixgbe_reset_hw_X540(struct ixgbe_hw *hw)
  214 {
  215         s32 status;
  216         u32 ctrl, i;
  217         u32 swfw_mask = hw->phy.phy_semaphore_mask;
  218 
  219         DEBUGFUNC("ixgbe_reset_hw_X540");
  220 
  221         /* Call adapter stop to disable tx/rx and clear interrupts */
  222         status = hw->mac.ops.stop_adapter(hw);
  223         if (status != IXGBE_SUCCESS)
  224                 goto reset_hw_out;
  225 
  226         /* flush pending Tx transactions */
  227         ixgbe_clear_tx_pending(hw);
  228 
  229 mac_reset_top:
  230         status = hw->mac.ops.acquire_swfw_sync(hw, swfw_mask);
  231         if (status != IXGBE_SUCCESS) {
  232                 ERROR_REPORT2(IXGBE_ERROR_CAUTION,
  233                         "semaphore failed with %d", status);
  234                 return IXGBE_ERR_SWFW_SYNC;
  235         }
  236         ctrl = IXGBE_CTRL_RST;
  237         ctrl |= IXGBE_READ_REG(hw, IXGBE_CTRL);
  238         IXGBE_WRITE_REG(hw, IXGBE_CTRL, ctrl);
  239         IXGBE_WRITE_FLUSH(hw);
  240         hw->mac.ops.release_swfw_sync(hw, swfw_mask);
  241 
  242         /* Poll for reset bit to self-clear indicating reset is complete */
  243         for (i = 0; i < 10; i++) {
  244                 usec_delay(1);
  245                 ctrl = IXGBE_READ_REG(hw, IXGBE_CTRL);
  246                 if (!(ctrl & IXGBE_CTRL_RST_MASK))
  247                         break;
  248         }
  249 
  250         if (ctrl & IXGBE_CTRL_RST_MASK) {
  251                 status = IXGBE_ERR_RESET_FAILED;
  252                 ERROR_REPORT1(IXGBE_ERROR_POLLING,
  253                              "Reset polling failed to complete.\n");
  254         }
  255         msec_delay(100);
  256 
  257         /*
  258          * Double resets are required for recovery from certain error
  259          * conditions.  Between resets, it is necessary to stall to allow time
  260          * for any pending HW events to complete.
  261          */
  262         if (hw->mac.flags & IXGBE_FLAGS_DOUBLE_RESET_REQUIRED) {
  263                 hw->mac.flags &= ~IXGBE_FLAGS_DOUBLE_RESET_REQUIRED;
  264                 goto mac_reset_top;
  265         }
  266 
  267         /* Set the Rx packet buffer size. */
  268         IXGBE_WRITE_REG(hw, IXGBE_RXPBSIZE(0), 384 << IXGBE_RXPBSIZE_SHIFT);
  269 
  270         /* Store the permanent mac address */
  271         hw->mac.ops.get_mac_addr(hw, hw->mac.perm_addr);
  272 
  273         /*
  274          * Store MAC address from RAR0, clear receive address registers, and
  275          * clear the multicast table.  Also reset num_rar_entries to 128,
  276          * since we modify this value when programming the SAN MAC address.
  277          */
  278         hw->mac.num_rar_entries = 128;
  279         hw->mac.ops.init_rx_addrs(hw);
  280 
  281         /* Store the permanent SAN mac address */
  282         hw->mac.ops.get_san_mac_addr(hw, hw->mac.san_addr);
  283 
  284         /* Add the SAN MAC address to the RAR only if it's a valid address */
  285         if (ixgbe_validate_mac_addr(hw->mac.san_addr) == 0) {
  286                 /* Save the SAN MAC RAR index */
  287                 hw->mac.san_mac_rar_index = hw->mac.num_rar_entries - 1;
  288 
  289                 hw->mac.ops.set_rar(hw, hw->mac.san_mac_rar_index,
  290                                     hw->mac.san_addr, 0, IXGBE_RAH_AV);
  291 
  292                 /* clear VMDq pool/queue selection for this RAR */
  293                 hw->mac.ops.clear_vmdq(hw, hw->mac.san_mac_rar_index,
  294                                        IXGBE_CLEAR_VMDQ_ALL);
  295 
  296                 /* Reserve the last RAR for the SAN MAC address */
  297                 hw->mac.num_rar_entries--;
  298         }
  299 
  300         /* Store the alternative WWNN/WWPN prefix */
  301         hw->mac.ops.get_wwn_prefix(hw, &hw->mac.wwnn_prefix,
  302                                    &hw->mac.wwpn_prefix);
  303 
  304 reset_hw_out:
  305         return status;
  306 }
  307 
  308 /**
  309  * ixgbe_start_hw_X540 - Prepare hardware for Tx/Rx
  310  * @hw: pointer to hardware structure
  311  *
  312  * Starts the hardware using the generic start_hw function
  313  * and the generation start_hw function.
  314  * Then performs revision-specific operations, if any.
  315  **/
  316 s32 ixgbe_start_hw_X540(struct ixgbe_hw *hw)
  317 {
  318         s32 ret_val = IXGBE_SUCCESS;
  319 
  320         DEBUGFUNC("ixgbe_start_hw_X540");
  321 
  322         ret_val = ixgbe_start_hw_generic(hw);
  323         if (ret_val != IXGBE_SUCCESS)
  324                 goto out;
  325 
  326         ixgbe_start_hw_gen2(hw);
  327 
  328 out:
  329         return ret_val;
  330 }
  331 
  332 /**
  333  * ixgbe_get_supported_physical_layer_X540 - Returns physical layer type
  334  * @hw: pointer to hardware structure
  335  *
  336  * Determines physical layer capabilities of the current configuration.
  337  **/
  338 u64 ixgbe_get_supported_physical_layer_X540(struct ixgbe_hw *hw)
  339 {
  340         u64 physical_layer = IXGBE_PHYSICAL_LAYER_UNKNOWN;
  341         u16 ext_ability = 0;
  342 
  343         DEBUGFUNC("ixgbe_get_supported_physical_layer_X540");
  344 
  345         hw->phy.ops.read_reg(hw, IXGBE_MDIO_PHY_EXT_ABILITY,
  346         IXGBE_MDIO_PMA_PMD_DEV_TYPE, &ext_ability);
  347         if (ext_ability & IXGBE_MDIO_PHY_10GBASET_ABILITY)
  348                 physical_layer |= IXGBE_PHYSICAL_LAYER_10GBASE_T;
  349         if (ext_ability & IXGBE_MDIO_PHY_1000BASET_ABILITY)
  350                 physical_layer |= IXGBE_PHYSICAL_LAYER_1000BASE_T;
  351         if (ext_ability & IXGBE_MDIO_PHY_100BASETX_ABILITY)
  352                 physical_layer |= IXGBE_PHYSICAL_LAYER_100BASE_TX;
  353 
  354         return physical_layer;
  355 }
  356 
  357 /**
  358  * ixgbe_init_eeprom_params_X540 - Initialize EEPROM params
  359  * @hw: pointer to hardware structure
  360  *
  361  * Initializes the EEPROM parameters ixgbe_eeprom_info within the
  362  * ixgbe_hw struct in order to set up EEPROM access.
  363  **/
  364 s32 ixgbe_init_eeprom_params_X540(struct ixgbe_hw *hw)
  365 {
  366         struct ixgbe_eeprom_info *eeprom = &hw->eeprom;
  367         u32 eec;
  368         u16 eeprom_size;
  369 
  370         DEBUGFUNC("ixgbe_init_eeprom_params_X540");
  371 
  372         if (eeprom->type == ixgbe_eeprom_uninitialized) {
  373                 eeprom->semaphore_delay = 10;
  374                 eeprom->type = ixgbe_flash;
  375 
  376                 eec = IXGBE_READ_REG(hw, IXGBE_EEC_BY_MAC(hw));
  377                 eeprom_size = (u16)((eec & IXGBE_EEC_SIZE) >>
  378                                     IXGBE_EEC_SIZE_SHIFT);
  379                 eeprom->word_size = 1 << (eeprom_size +
  380                                           IXGBE_EEPROM_WORD_SIZE_SHIFT);
  381 
  382                 DEBUGOUT2("Eeprom params: type = %d, size = %d\n",
  383                           eeprom->type, eeprom->word_size);
  384         }
  385 
  386         return IXGBE_SUCCESS;
  387 }
  388 
  389 /**
  390  * ixgbe_read_eerd_X540- Read EEPROM word using EERD
  391  * @hw: pointer to hardware structure
  392  * @offset: offset of  word in the EEPROM to read
  393  * @data: word read from the EEPROM
  394  *
  395  * Reads a 16 bit word from the EEPROM using the EERD register.
  396  **/
  397 s32 ixgbe_read_eerd_X540(struct ixgbe_hw *hw, u16 offset, u16 *data)
  398 {
  399         s32 status = IXGBE_SUCCESS;
  400 
  401         DEBUGFUNC("ixgbe_read_eerd_X540");
  402         if (hw->mac.ops.acquire_swfw_sync(hw, IXGBE_GSSR_EEP_SM) ==
  403             IXGBE_SUCCESS) {
  404                 status = ixgbe_read_eerd_generic(hw, offset, data);
  405                 hw->mac.ops.release_swfw_sync(hw, IXGBE_GSSR_EEP_SM);
  406         } else {
  407                 status = IXGBE_ERR_SWFW_SYNC;
  408         }
  409 
  410         return status;
  411 }
  412 
  413 /**
  414  * ixgbe_read_eerd_buffer_X540- Read EEPROM word(s) using EERD
  415  * @hw: pointer to hardware structure
  416  * @offset: offset of  word in the EEPROM to read
  417  * @words: number of words
  418  * @data: word(s) read from the EEPROM
  419  *
  420  * Reads a 16 bit word(s) from the EEPROM using the EERD register.
  421  **/
  422 s32 ixgbe_read_eerd_buffer_X540(struct ixgbe_hw *hw,
  423                                 u16 offset, u16 words, u16 *data)
  424 {
  425         s32 status = IXGBE_SUCCESS;
  426 
  427         DEBUGFUNC("ixgbe_read_eerd_buffer_X540");
  428         if (hw->mac.ops.acquire_swfw_sync(hw, IXGBE_GSSR_EEP_SM) ==
  429             IXGBE_SUCCESS) {
  430                 status = ixgbe_read_eerd_buffer_generic(hw, offset,
  431                                                         words, data);
  432                 hw->mac.ops.release_swfw_sync(hw, IXGBE_GSSR_EEP_SM);
  433         } else {
  434                 status = IXGBE_ERR_SWFW_SYNC;
  435         }
  436 
  437         return status;
  438 }
  439 
  440 /**
  441  * ixgbe_write_eewr_X540 - Write EEPROM word using EEWR
  442  * @hw: pointer to hardware structure
  443  * @offset: offset of  word in the EEPROM to write
  444  * @data: word write to the EEPROM
  445  *
  446  * Write a 16 bit word to the EEPROM using the EEWR register.
  447  **/
  448 s32 ixgbe_write_eewr_X540(struct ixgbe_hw *hw, u16 offset, u16 data)
  449 {
  450         s32 status = IXGBE_SUCCESS;
  451 
  452         DEBUGFUNC("ixgbe_write_eewr_X540");
  453         if (hw->mac.ops.acquire_swfw_sync(hw, IXGBE_GSSR_EEP_SM) ==
  454             IXGBE_SUCCESS) {
  455                 status = ixgbe_write_eewr_generic(hw, offset, data);
  456                 hw->mac.ops.release_swfw_sync(hw, IXGBE_GSSR_EEP_SM);
  457         } else {
  458                 status = IXGBE_ERR_SWFW_SYNC;
  459         }
  460 
  461         return status;
  462 }
  463 
  464 /**
  465  * ixgbe_write_eewr_buffer_X540 - Write EEPROM word(s) using EEWR
  466  * @hw: pointer to hardware structure
  467  * @offset: offset of  word in the EEPROM to write
  468  * @words: number of words
  469  * @data: word(s) write to the EEPROM
  470  *
  471  * Write a 16 bit word(s) to the EEPROM using the EEWR register.
  472  **/
  473 s32 ixgbe_write_eewr_buffer_X540(struct ixgbe_hw *hw,
  474                                  u16 offset, u16 words, u16 *data)
  475 {
  476         s32 status = IXGBE_SUCCESS;
  477 
  478         DEBUGFUNC("ixgbe_write_eewr_buffer_X540");
  479         if (hw->mac.ops.acquire_swfw_sync(hw, IXGBE_GSSR_EEP_SM) ==
  480             IXGBE_SUCCESS) {
  481                 status = ixgbe_write_eewr_buffer_generic(hw, offset,
  482                                                          words, data);
  483                 hw->mac.ops.release_swfw_sync(hw, IXGBE_GSSR_EEP_SM);
  484         } else {
  485                 status = IXGBE_ERR_SWFW_SYNC;
  486         }
  487 
  488         return status;
  489 }
  490 
  491 /**
  492  * ixgbe_calc_eeprom_checksum_X540 - Calculates and returns the checksum
  493  *
  494  * This function does not use synchronization for EERD and EEWR. It can
  495  * be used internally by function which utilize ixgbe_acquire_swfw_sync_X540.
  496  *
  497  * @hw: pointer to hardware structure
  498  *
  499  * Returns a negative error code on error, or the 16-bit checksum
  500  **/
  501 s32 ixgbe_calc_eeprom_checksum_X540(struct ixgbe_hw *hw)
  502 {
  503         u16 i, j;
  504         u16 checksum = 0;
  505         u16 length = 0;
  506         u16 pointer = 0;
  507         u16 word = 0;
  508         u16 ptr_start = IXGBE_PCIE_ANALOG_PTR;
  509 
  510         /* Do not use hw->eeprom.ops.read because we do not want to take
  511          * the synchronization semaphores here. Instead use
  512          * ixgbe_read_eerd_generic
  513          */
  514 
  515         DEBUGFUNC("ixgbe_calc_eeprom_checksum_X540");
  516 
  517         /* Include 0x0 up to IXGBE_EEPROM_CHECKSUM; do not include the
  518          * checksum itself
  519          */
  520         for (i = 0; i < IXGBE_EEPROM_CHECKSUM; i++) {
  521                 if (ixgbe_read_eerd_generic(hw, i, &word)) {
  522                         DEBUGOUT("EEPROM read failed\n");
  523                         return IXGBE_ERR_EEPROM;
  524                 }
  525                 checksum += word;
  526         }
  527 
  528         /* Include all data from pointers 0x3, 0x6-0xE.  This excludes the
  529          * FW, PHY module, and PCIe Expansion/Option ROM pointers.
  530          */
  531         for (i = ptr_start; i < IXGBE_FW_PTR; i++) {
  532                 if (i == IXGBE_PHY_PTR || i == IXGBE_OPTION_ROM_PTR)
  533                         continue;
  534 
  535                 if (ixgbe_read_eerd_generic(hw, i, &pointer)) {
  536                         DEBUGOUT("EEPROM read failed\n");
  537                         return IXGBE_ERR_EEPROM;
  538                 }
  539 
  540                 /* Skip pointer section if the pointer is invalid. */
  541                 if (pointer == 0xFFFF || pointer == 0 ||
  542                     pointer >= hw->eeprom.word_size)
  543                         continue;
  544 
  545                 if (ixgbe_read_eerd_generic(hw, pointer, &length)) {
  546                         DEBUGOUT("EEPROM read failed\n");
  547                         return IXGBE_ERR_EEPROM;
  548                 }
  549 
  550                 /* Skip pointer section if length is invalid. */
  551                 if (length == 0xFFFF || length == 0 ||
  552                     (pointer + length) >= hw->eeprom.word_size)
  553                         continue;
  554 
  555                 for (j = pointer + 1; j <= pointer + length; j++) {
  556                         if (ixgbe_read_eerd_generic(hw, j, &word)) {
  557                                 DEBUGOUT("EEPROM read failed\n");
  558                                 return IXGBE_ERR_EEPROM;
  559                         }
  560                         checksum += word;
  561                 }
  562         }
  563 
  564         checksum = (u16)IXGBE_EEPROM_SUM - checksum;
  565 
  566         return (s32)checksum;
  567 }
  568 
  569 /**
  570  * ixgbe_validate_eeprom_checksum_X540 - Validate EEPROM checksum
  571  * @hw: pointer to hardware structure
  572  * @checksum_val: calculated checksum
  573  *
  574  * Performs checksum calculation and validates the EEPROM checksum.  If the
  575  * caller does not need checksum_val, the value can be NULL.
  576  **/
  577 s32 ixgbe_validate_eeprom_checksum_X540(struct ixgbe_hw *hw,
  578                                         u16 *checksum_val)
  579 {
  580         s32 status;
  581         u16 checksum;
  582         u16 read_checksum = 0;
  583 
  584         DEBUGFUNC("ixgbe_validate_eeprom_checksum_X540");
  585 
  586         /* Read the first word from the EEPROM. If this times out or fails, do
  587          * not continue or we could be in for a very long wait while every
  588          * EEPROM read fails
  589          */
  590         status = hw->eeprom.ops.read(hw, 0, &checksum);
  591         if (status) {
  592                 DEBUGOUT("EEPROM read failed\n");
  593                 return status;
  594         }
  595 
  596         if (hw->mac.ops.acquire_swfw_sync(hw, IXGBE_GSSR_EEP_SM))
  597                 return IXGBE_ERR_SWFW_SYNC;
  598 
  599         status = hw->eeprom.ops.calc_checksum(hw);
  600         if (status < 0)
  601                 goto out;
  602 
  603         checksum = (u16)(status & 0xffff);
  604 
  605         /* Do not use hw->eeprom.ops.read because we do not want to take
  606          * the synchronization semaphores twice here.
  607          */
  608         status = ixgbe_read_eerd_generic(hw, IXGBE_EEPROM_CHECKSUM,
  609                                          &read_checksum);
  610         if (status)
  611                 goto out;
  612 
  613         /* Verify read checksum from EEPROM is the same as
  614          * calculated checksum
  615          */
  616         if (read_checksum != checksum) {
  617                 ERROR_REPORT1(IXGBE_ERROR_INVALID_STATE,
  618                              "Invalid EEPROM checksum");
  619                 status = IXGBE_ERR_EEPROM_CHECKSUM;
  620         }
  621 
  622         /* If the user cares, return the calculated checksum */
  623         if (checksum_val)
  624                 *checksum_val = checksum;
  625 
  626 out:
  627         hw->mac.ops.release_swfw_sync(hw, IXGBE_GSSR_EEP_SM);
  628 
  629         return status;
  630 }
  631 
  632 /**
  633  * ixgbe_update_eeprom_checksum_X540 - Updates the EEPROM checksum and flash
  634  * @hw: pointer to hardware structure
  635  *
  636  * After writing EEPROM to shadow RAM using EEWR register, software calculates
  637  * checksum and updates the EEPROM and instructs the hardware to update
  638  * the flash.
  639  **/
  640 s32 ixgbe_update_eeprom_checksum_X540(struct ixgbe_hw *hw)
  641 {
  642         s32 status;
  643         u16 checksum;
  644 
  645         DEBUGFUNC("ixgbe_update_eeprom_checksum_X540");
  646 
  647         /* Read the first word from the EEPROM. If this times out or fails, do
  648          * not continue or we could be in for a very long wait while every
  649          * EEPROM read fails
  650          */
  651         status = hw->eeprom.ops.read(hw, 0, &checksum);
  652         if (status) {
  653                 DEBUGOUT("EEPROM read failed\n");
  654                 return status;
  655         }
  656 
  657         if (hw->mac.ops.acquire_swfw_sync(hw, IXGBE_GSSR_EEP_SM))
  658                 return IXGBE_ERR_SWFW_SYNC;
  659 
  660         status = hw->eeprom.ops.calc_checksum(hw);
  661         if (status < 0)
  662                 goto out;
  663 
  664         checksum = (u16)(status & 0xffff);
  665 
  666         /* Do not use hw->eeprom.ops.write because we do not want to
  667          * take the synchronization semaphores twice here.
  668          */
  669         status = ixgbe_write_eewr_generic(hw, IXGBE_EEPROM_CHECKSUM, checksum);
  670         if (status)
  671                 goto out;
  672 
  673         status = ixgbe_update_flash_X540(hw);
  674 
  675 out:
  676         hw->mac.ops.release_swfw_sync(hw, IXGBE_GSSR_EEP_SM);
  677 
  678         return status;
  679 }
  680 
  681 /**
  682  * ixgbe_update_flash_X540 - Instruct HW to copy EEPROM to Flash device
  683  * @hw: pointer to hardware structure
  684  *
  685  * Set FLUP (bit 23) of the EEC register to instruct Hardware to copy
  686  * EEPROM from shadow RAM to the flash device.
  687  **/
  688 s32 ixgbe_update_flash_X540(struct ixgbe_hw *hw)
  689 {
  690         u32 flup;
  691         s32 status;
  692 
  693         DEBUGFUNC("ixgbe_update_flash_X540");
  694 
  695         status = ixgbe_poll_flash_update_done_X540(hw);
  696         if (status == IXGBE_ERR_EEPROM) {
  697                 DEBUGOUT("Flash update time out\n");
  698                 goto out;
  699         }
  700 
  701         flup = IXGBE_READ_REG(hw, IXGBE_EEC_BY_MAC(hw)) | IXGBE_EEC_FLUP;
  702         IXGBE_WRITE_REG(hw, IXGBE_EEC_BY_MAC(hw), flup);
  703 
  704         status = ixgbe_poll_flash_update_done_X540(hw);
  705         if (status == IXGBE_SUCCESS)
  706                 DEBUGOUT("Flash update complete\n");
  707         else
  708                 DEBUGOUT("Flash update time out\n");
  709 
  710         if (hw->mac.type == ixgbe_mac_X540 && hw->revision_id == 0) {
  711                 flup = IXGBE_READ_REG(hw, IXGBE_EEC_BY_MAC(hw));
  712 
  713                 if (flup & IXGBE_EEC_SEC1VAL) {
  714                         flup |= IXGBE_EEC_FLUP;
  715                         IXGBE_WRITE_REG(hw, IXGBE_EEC_BY_MAC(hw), flup);
  716                 }
  717 
  718                 status = ixgbe_poll_flash_update_done_X540(hw);
  719                 if (status == IXGBE_SUCCESS)
  720                         DEBUGOUT("Flash update complete\n");
  721                 else
  722                         DEBUGOUT("Flash update time out\n");
  723         }
  724 out:
  725         return status;
  726 }
  727 
  728 /**
  729  * ixgbe_poll_flash_update_done_X540 - Poll flash update status
  730  * @hw: pointer to hardware structure
  731  *
  732  * Polls the FLUDONE (bit 26) of the EEC Register to determine when the
  733  * flash update is done.
  734  **/
  735 static s32 ixgbe_poll_flash_update_done_X540(struct ixgbe_hw *hw)
  736 {
  737         u32 i;
  738         u32 reg;
  739         s32 status = IXGBE_ERR_EEPROM;
  740 
  741         DEBUGFUNC("ixgbe_poll_flash_update_done_X540");
  742 
  743         for (i = 0; i < IXGBE_FLUDONE_ATTEMPTS; i++) {
  744                 reg = IXGBE_READ_REG(hw, IXGBE_EEC_BY_MAC(hw));
  745                 if (reg & IXGBE_EEC_FLUDONE) {
  746                         status = IXGBE_SUCCESS;
  747                         break;
  748                 }
  749                 msec_delay(5);
  750         }
  751 
  752         if (i == IXGBE_FLUDONE_ATTEMPTS)
  753                 ERROR_REPORT1(IXGBE_ERROR_POLLING,
  754                              "Flash update status polling timed out");
  755 
  756         return status;
  757 }
  758 
  759 /**
  760  * ixgbe_acquire_swfw_sync_X540 - Acquire SWFW semaphore
  761  * @hw: pointer to hardware structure
  762  * @mask: Mask to specify which semaphore to acquire
  763  *
  764  * Acquires the SWFW semaphore thought the SW_FW_SYNC register for
  765  * the specified function (CSR, PHY0, PHY1, NVM, Flash)
  766  **/
  767 s32 ixgbe_acquire_swfw_sync_X540(struct ixgbe_hw *hw, u32 mask)
  768 {
  769         u32 swmask = mask & IXGBE_GSSR_NVM_PHY_MASK;
  770         u32 fwmask = swmask << 5;
  771         u32 swi2c_mask = mask & IXGBE_GSSR_I2C_MASK;
  772         u32 timeout = 200;
  773         u32 hwmask = 0;
  774         u32 swfw_sync;
  775         u32 i;
  776 
  777         DEBUGFUNC("ixgbe_acquire_swfw_sync_X540");
  778 
  779         if (swmask & IXGBE_GSSR_EEP_SM)
  780                 hwmask |= IXGBE_GSSR_FLASH_SM;
  781 
  782         /* SW only mask doesn't have FW bit pair */
  783         if (mask & IXGBE_GSSR_SW_MNG_SM)
  784                 swmask |= IXGBE_GSSR_SW_MNG_SM;
  785 
  786         swmask |= swi2c_mask;
  787         fwmask |= swi2c_mask << 2;
  788         if (hw->mac.type >= ixgbe_mac_X550)
  789                 timeout = 1000;
  790 
  791         for (i = 0; i < timeout; i++) {
  792                 /* SW NVM semaphore bit is used for access to all
  793                  * SW_FW_SYNC bits (not just NVM)
  794                  */
  795                 if (ixgbe_get_swfw_sync_semaphore(hw)) {
  796                         DEBUGOUT("Failed to get NVM access and register semaphore, returning IXGBE_ERR_SWFW_SYNC\n");
  797                         return IXGBE_ERR_SWFW_SYNC;
  798                 }
  799 
  800                 swfw_sync = IXGBE_READ_REG(hw, IXGBE_SWFW_SYNC_BY_MAC(hw));
  801                 if (!(swfw_sync & (fwmask | swmask | hwmask))) {
  802                         swfw_sync |= swmask;
  803                         IXGBE_WRITE_REG(hw, IXGBE_SWFW_SYNC_BY_MAC(hw),
  804                                         swfw_sync);
  805                         ixgbe_release_swfw_sync_semaphore(hw);
  806                         return IXGBE_SUCCESS;
  807                 }
  808                 /* Firmware currently using resource (fwmask), hardware
  809                  * currently using resource (hwmask), or other software
  810                  * thread currently using resource (swmask)
  811                  */
  812                 ixgbe_release_swfw_sync_semaphore(hw);
  813                 msec_delay(5);
  814         }
  815 
  816         /* If the resource is not released by the FW/HW the SW can assume that
  817          * the FW/HW malfunctions. In that case the SW should set the SW bit(s)
  818          * of the requested resource(s) while ignoring the corresponding FW/HW
  819          * bits in the SW_FW_SYNC register.
  820          */
  821         if (ixgbe_get_swfw_sync_semaphore(hw)) {
  822                 DEBUGOUT("Failed to get NVM semaphore and register semaphore while forcefully ignoring FW semaphore bit(s) and setting SW semaphore bit(s), returning IXGBE_ERR_SWFW_SYNC\n");
  823                 return IXGBE_ERR_SWFW_SYNC;
  824         }
  825         swfw_sync = IXGBE_READ_REG(hw, IXGBE_SWFW_SYNC_BY_MAC(hw));
  826         if (swfw_sync & (fwmask | hwmask)) {
  827                 swfw_sync |= swmask;
  828                 IXGBE_WRITE_REG(hw, IXGBE_SWFW_SYNC_BY_MAC(hw), swfw_sync);
  829                 ixgbe_release_swfw_sync_semaphore(hw);
  830                 msec_delay(5);
  831                 return IXGBE_SUCCESS;
  832         }
  833         /* If the resource is not released by other SW the SW can assume that
  834          * the other SW malfunctions. In that case the SW should clear all SW
  835          * flags that it does not own and then repeat the whole process once
  836          * again.
  837          */
  838         if (swfw_sync & swmask) {
  839                 u32 rmask = IXGBE_GSSR_EEP_SM | IXGBE_GSSR_PHY0_SM |
  840                             IXGBE_GSSR_PHY1_SM | IXGBE_GSSR_MAC_CSR_SM |
  841                             IXGBE_GSSR_SW_MNG_SM;
  842 
  843                 if (swi2c_mask)
  844                         rmask |= IXGBE_GSSR_I2C_MASK;
  845                 ixgbe_release_swfw_sync_X540(hw, rmask);
  846                 ixgbe_release_swfw_sync_semaphore(hw);
  847                 DEBUGOUT("Resource not released by other SW, returning IXGBE_ERR_SWFW_SYNC\n");
  848                 return IXGBE_ERR_SWFW_SYNC;
  849         }
  850         ixgbe_release_swfw_sync_semaphore(hw);
  851         DEBUGOUT("Returning error IXGBE_ERR_SWFW_SYNC\n");
  852 
  853         return IXGBE_ERR_SWFW_SYNC;
  854 }
  855 
  856 /**
  857  * ixgbe_release_swfw_sync_X540 - Release SWFW semaphore
  858  * @hw: pointer to hardware structure
  859  * @mask: Mask to specify which semaphore to release
  860  *
  861  * Releases the SWFW semaphore through the SW_FW_SYNC register
  862  * for the specified function (CSR, PHY0, PHY1, EVM, Flash)
  863  **/
  864 void ixgbe_release_swfw_sync_X540(struct ixgbe_hw *hw, u32 mask)
  865 {
  866         u32 swmask = mask & (IXGBE_GSSR_NVM_PHY_MASK | IXGBE_GSSR_SW_MNG_SM);
  867         u32 swfw_sync;
  868 
  869         DEBUGFUNC("ixgbe_release_swfw_sync_X540");
  870 
  871         if (mask & IXGBE_GSSR_I2C_MASK)
  872                 swmask |= mask & IXGBE_GSSR_I2C_MASK;
  873         ixgbe_get_swfw_sync_semaphore(hw);
  874 
  875         swfw_sync = IXGBE_READ_REG(hw, IXGBE_SWFW_SYNC_BY_MAC(hw));
  876         swfw_sync &= ~swmask;
  877         IXGBE_WRITE_REG(hw, IXGBE_SWFW_SYNC_BY_MAC(hw), swfw_sync);
  878 
  879         ixgbe_release_swfw_sync_semaphore(hw);
  880         msec_delay(2);
  881 }
  882 
  883 /**
  884  * ixgbe_get_swfw_sync_semaphore - Get hardware semaphore
  885  * @hw: pointer to hardware structure
  886  *
  887  * Sets the hardware semaphores so SW/FW can gain control of shared resources
  888  **/
  889 static s32 ixgbe_get_swfw_sync_semaphore(struct ixgbe_hw *hw)
  890 {
  891         s32 status = IXGBE_ERR_EEPROM;
  892         u32 timeout = 2000;
  893         u32 i;
  894         u32 swsm;
  895 
  896         DEBUGFUNC("ixgbe_get_swfw_sync_semaphore");
  897 
  898         /* Get SMBI software semaphore between device drivers first */
  899         for (i = 0; i < timeout; i++) {
  900                 /*
  901                  * If the SMBI bit is 0 when we read it, then the bit will be
  902                  * set and we have the semaphore
  903                  */
  904                 swsm = IXGBE_READ_REG(hw, IXGBE_SWSM_BY_MAC(hw));
  905                 if (!(swsm & IXGBE_SWSM_SMBI)) {
  906                         status = IXGBE_SUCCESS;
  907                         break;
  908                 }
  909                 usec_delay(50);
  910         }
  911 
  912         /* Now get the semaphore between SW/FW through the REGSMP bit */
  913         if (status == IXGBE_SUCCESS) {
  914                 for (i = 0; i < timeout; i++) {
  915                         swsm = IXGBE_READ_REG(hw, IXGBE_SWFW_SYNC_BY_MAC(hw));
  916                         if (!(swsm & IXGBE_SWFW_REGSMP))
  917                                 break;
  918 
  919                         usec_delay(50);
  920                 }
  921 
  922                 /*
  923                  * Release semaphores and return error if SW NVM semaphore
  924                  * was not granted because we don't have access to the EEPROM
  925                  */
  926                 if (i >= timeout) {
  927                         ERROR_REPORT1(IXGBE_ERROR_POLLING,
  928                                 "REGSMP Software NVM semaphore not granted.\n");
  929                         ixgbe_release_swfw_sync_semaphore(hw);
  930                         status = IXGBE_ERR_EEPROM;
  931                 }
  932         } else {
  933                 ERROR_REPORT1(IXGBE_ERROR_POLLING,
  934                              "Software semaphore SMBI between device drivers "
  935                              "not granted.\n");
  936         }
  937 
  938         return status;
  939 }
  940 
  941 /**
  942  * ixgbe_release_swfw_sync_semaphore - Release hardware semaphore
  943  * @hw: pointer to hardware structure
  944  *
  945  * This function clears hardware semaphore bits.
  946  **/
  947 static void ixgbe_release_swfw_sync_semaphore(struct ixgbe_hw *hw)
  948 {
  949         u32 swsm;
  950 
  951         DEBUGFUNC("ixgbe_release_swfw_sync_semaphore");
  952 
  953         /* Release both semaphores by writing 0 to the bits REGSMP and SMBI */
  954 
  955         swsm = IXGBE_READ_REG(hw, IXGBE_SWFW_SYNC_BY_MAC(hw));
  956         swsm &= ~IXGBE_SWFW_REGSMP;
  957         IXGBE_WRITE_REG(hw, IXGBE_SWFW_SYNC_BY_MAC(hw), swsm);
  958 
  959         swsm = IXGBE_READ_REG(hw, IXGBE_SWSM_BY_MAC(hw));
  960         swsm &= ~IXGBE_SWSM_SMBI;
  961         IXGBE_WRITE_REG(hw, IXGBE_SWSM_BY_MAC(hw), swsm);
  962 
  963         IXGBE_WRITE_FLUSH(hw);
  964 }
  965 
  966 /**
  967  * ixgbe_init_swfw_sync_X540 - Release hardware semaphore
  968  * @hw: pointer to hardware structure
  969  *
  970  * This function reset hardware semaphore bits for a semaphore that may
  971  * have be left locked due to a catastrophic failure.
  972  **/
  973 void ixgbe_init_swfw_sync_X540(struct ixgbe_hw *hw)
  974 {
  975         u32 rmask;
  976 
  977         /* First try to grab the semaphore but we don't need to bother
  978          * looking to see whether we got the lock or not since we do
  979          * the same thing regardless of whether we got the lock or not.
  980          * We got the lock - we release it.
  981          * We timeout trying to get the lock - we force its release.
  982          */
  983         ixgbe_get_swfw_sync_semaphore(hw);
  984         ixgbe_release_swfw_sync_semaphore(hw);
  985 
  986         /* Acquire and release all software resources. */
  987         rmask = IXGBE_GSSR_EEP_SM | IXGBE_GSSR_PHY0_SM |
  988                 IXGBE_GSSR_PHY1_SM | IXGBE_GSSR_MAC_CSR_SM |
  989                 IXGBE_GSSR_SW_MNG_SM;
  990 
  991         rmask |= IXGBE_GSSR_I2C_MASK;
  992         ixgbe_acquire_swfw_sync_X540(hw, rmask);
  993         ixgbe_release_swfw_sync_X540(hw, rmask);
  994 }
  995 
  996 /**
  997  * ixgbe_blink_led_start_X540 - Blink LED based on index.
  998  * @hw: pointer to hardware structure
  999  * @index: led number to blink
 1000  *
 1001  * Devices that implement the version 2 interface:
 1002  *  X540
 1003  **/
 1004 s32 ixgbe_blink_led_start_X540(struct ixgbe_hw *hw, u32 index)
 1005 {
 1006         u32 macc_reg;
 1007         u32 ledctl_reg;
 1008         ixgbe_link_speed speed;
 1009         bool link_up;
 1010 
 1011         DEBUGFUNC("ixgbe_blink_led_start_X540");
 1012 
 1013         if (index > 3)
 1014                 return IXGBE_ERR_PARAM;
 1015 
 1016         /*
 1017          * Link should be up in order for the blink bit in the LED control
 1018          * register to work. Force link and speed in the MAC if link is down.
 1019          * This will be reversed when we stop the blinking.
 1020          */
 1021         hw->mac.ops.check_link(hw, &speed, &link_up, false);
 1022         if (link_up == false) {
 1023                 macc_reg = IXGBE_READ_REG(hw, IXGBE_MACC);
 1024                 macc_reg |= IXGBE_MACC_FLU | IXGBE_MACC_FSV_10G | IXGBE_MACC_FS;
 1025                 IXGBE_WRITE_REG(hw, IXGBE_MACC, macc_reg);
 1026         }
 1027         /* Set the LED to LINK_UP + BLINK. */
 1028         ledctl_reg = IXGBE_READ_REG(hw, IXGBE_LEDCTL);
 1029         ledctl_reg &= ~IXGBE_LED_MODE_MASK(index);
 1030         ledctl_reg |= IXGBE_LED_BLINK(index);
 1031         IXGBE_WRITE_REG(hw, IXGBE_LEDCTL, ledctl_reg);
 1032         IXGBE_WRITE_FLUSH(hw);
 1033 
 1034         return IXGBE_SUCCESS;
 1035 }
 1036 
 1037 /**
 1038  * ixgbe_blink_led_stop_X540 - Stop blinking LED based on index.
 1039  * @hw: pointer to hardware structure
 1040  * @index: led number to stop blinking
 1041  *
 1042  * Devices that implement the version 2 interface:
 1043  *  X540
 1044  **/
 1045 s32 ixgbe_blink_led_stop_X540(struct ixgbe_hw *hw, u32 index)
 1046 {
 1047         u32 macc_reg;
 1048         u32 ledctl_reg;
 1049 
 1050         if (index > 3)
 1051                 return IXGBE_ERR_PARAM;
 1052 
 1053         DEBUGFUNC("ixgbe_blink_led_stop_X540");
 1054 
 1055         /* Restore the LED to its default value. */
 1056         ledctl_reg = IXGBE_READ_REG(hw, IXGBE_LEDCTL);
 1057         ledctl_reg &= ~IXGBE_LED_MODE_MASK(index);
 1058         ledctl_reg |= IXGBE_LED_LINK_ACTIVE << IXGBE_LED_MODE_SHIFT(index);
 1059         ledctl_reg &= ~IXGBE_LED_BLINK(index);
 1060         IXGBE_WRITE_REG(hw, IXGBE_LEDCTL, ledctl_reg);
 1061 
 1062         /* Unforce link and speed in the MAC. */
 1063         macc_reg = IXGBE_READ_REG(hw, IXGBE_MACC);
 1064         macc_reg &= ~(IXGBE_MACC_FLU | IXGBE_MACC_FSV_10G | IXGBE_MACC_FS);
 1065         IXGBE_WRITE_REG(hw, IXGBE_MACC, macc_reg);
 1066         IXGBE_WRITE_FLUSH(hw);
 1067 
 1068         return IXGBE_SUCCESS;
 1069 }

Cache object: db3a65de90744454fb60777f0bd65b6e


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


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