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