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