Home | History | Annotate | Line # | Download | only in ixgbe
ixgbe_x550.c revision 1.3.2.3
      1  1.3.2.2  skrll /******************************************************************************
      2  1.3.2.2  skrll 
      3  1.3.2.2  skrll   Copyright (c) 2001-2015, Intel Corporation
      4  1.3.2.2  skrll   All rights reserved.
      5  1.3.2.2  skrll 
      6  1.3.2.2  skrll   Redistribution and use in source and binary forms, with or without
      7  1.3.2.2  skrll   modification, are permitted provided that the following conditions are met:
      8  1.3.2.2  skrll 
      9  1.3.2.2  skrll    1. Redistributions of source code must retain the above copyright notice,
     10  1.3.2.2  skrll       this list of conditions and the following disclaimer.
     11  1.3.2.2  skrll 
     12  1.3.2.2  skrll    2. Redistributions in binary form must reproduce the above copyright
     13  1.3.2.2  skrll       notice, this list of conditions and the following disclaimer in the
     14  1.3.2.2  skrll       documentation and/or other materials provided with the distribution.
     15  1.3.2.2  skrll 
     16  1.3.2.2  skrll    3. Neither the name of the Intel Corporation nor the names of its
     17  1.3.2.2  skrll       contributors may be used to endorse or promote products derived from
     18  1.3.2.2  skrll       this software without specific prior written permission.
     19  1.3.2.2  skrll 
     20  1.3.2.2  skrll   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
     21  1.3.2.2  skrll   AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     22  1.3.2.2  skrll   IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     23  1.3.2.2  skrll   ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
     24  1.3.2.2  skrll   LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     25  1.3.2.2  skrll   CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     26  1.3.2.2  skrll   SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     27  1.3.2.2  skrll   INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     28  1.3.2.2  skrll   CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     29  1.3.2.2  skrll   ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     30  1.3.2.2  skrll   POSSIBILITY OF SUCH DAMAGE.
     31  1.3.2.2  skrll 
     32  1.3.2.2  skrll ******************************************************************************/
     33  1.3.2.3  skrll /*$FreeBSD: head/sys/dev/ixgbe/ixgbe_x550.c 295093 2016-01-31 15:14:23Z smh $*/
     34  1.3.2.2  skrll 
     35  1.3.2.2  skrll #include "ixgbe_x550.h"
     36  1.3.2.2  skrll #include "ixgbe_x540.h"
     37  1.3.2.2  skrll #include "ixgbe_type.h"
     38  1.3.2.2  skrll #include "ixgbe_api.h"
     39  1.3.2.2  skrll #include "ixgbe_common.h"
     40  1.3.2.2  skrll #include "ixgbe_phy.h"
     41  1.3.2.2  skrll 
     42  1.3.2.2  skrll static s32 ixgbe_setup_ixfi_x550em(struct ixgbe_hw *hw, ixgbe_link_speed *speed);
     43  1.3.2.2  skrll 
     44  1.3.2.2  skrll /**
     45  1.3.2.2  skrll  *  ixgbe_init_ops_X550 - Inits func ptrs and MAC type
     46  1.3.2.2  skrll  *  @hw: pointer to hardware structure
     47  1.3.2.2  skrll  *
     48  1.3.2.2  skrll  *  Initialize the function pointers and assign the MAC type for X550.
     49  1.3.2.2  skrll  *  Does not touch the hardware.
     50  1.3.2.2  skrll  **/
     51  1.3.2.2  skrll s32 ixgbe_init_ops_X550(struct ixgbe_hw *hw)
     52  1.3.2.2  skrll {
     53  1.3.2.2  skrll 	struct ixgbe_mac_info *mac = &hw->mac;
     54  1.3.2.2  skrll 	struct ixgbe_eeprom_info *eeprom = &hw->eeprom;
     55  1.3.2.2  skrll 	s32 ret_val;
     56  1.3.2.2  skrll 
     57  1.3.2.2  skrll 	DEBUGFUNC("ixgbe_init_ops_X550");
     58  1.3.2.2  skrll 
     59  1.3.2.2  skrll 	ret_val = ixgbe_init_ops_X540(hw);
     60  1.3.2.2  skrll 	mac->ops.dmac_config = ixgbe_dmac_config_X550;
     61  1.3.2.2  skrll 	mac->ops.dmac_config_tcs = ixgbe_dmac_config_tcs_X550;
     62  1.3.2.2  skrll 	mac->ops.dmac_update_tcs = ixgbe_dmac_update_tcs_X550;
     63  1.3.2.2  skrll 	mac->ops.setup_eee = ixgbe_setup_eee_X550;
     64  1.3.2.2  skrll 	mac->ops.set_source_address_pruning =
     65  1.3.2.2  skrll 			ixgbe_set_source_address_pruning_X550;
     66  1.3.2.2  skrll 	mac->ops.set_ethertype_anti_spoofing =
     67  1.3.2.2  skrll 			ixgbe_set_ethertype_anti_spoofing_X550;
     68  1.3.2.2  skrll 
     69  1.3.2.2  skrll 	mac->ops.get_rtrup2tc = ixgbe_dcb_get_rtrup2tc_generic;
     70  1.3.2.2  skrll 	eeprom->ops.init_params = ixgbe_init_eeprom_params_X550;
     71  1.3.2.2  skrll 	eeprom->ops.calc_checksum = ixgbe_calc_eeprom_checksum_X550;
     72  1.3.2.2  skrll 	eeprom->ops.read = ixgbe_read_ee_hostif_X550;
     73  1.3.2.2  skrll 	eeprom->ops.read_buffer = ixgbe_read_ee_hostif_buffer_X550;
     74  1.3.2.2  skrll 	eeprom->ops.write = ixgbe_write_ee_hostif_X550;
     75  1.3.2.2  skrll 	eeprom->ops.write_buffer = ixgbe_write_ee_hostif_buffer_X550;
     76  1.3.2.2  skrll 	eeprom->ops.update_checksum = ixgbe_update_eeprom_checksum_X550;
     77  1.3.2.2  skrll 	eeprom->ops.validate_checksum = ixgbe_validate_eeprom_checksum_X550;
     78  1.3.2.2  skrll 
     79  1.3.2.2  skrll 	mac->ops.disable_mdd = ixgbe_disable_mdd_X550;
     80  1.3.2.2  skrll 	mac->ops.enable_mdd = ixgbe_enable_mdd_X550;
     81  1.3.2.2  skrll 	mac->ops.mdd_event = ixgbe_mdd_event_X550;
     82  1.3.2.2  skrll 	mac->ops.restore_mdd_vf = ixgbe_restore_mdd_vf_X550;
     83  1.3.2.2  skrll 	mac->ops.disable_rx = ixgbe_disable_rx_x550;
     84  1.3.2.2  skrll 	if (hw->device_id == IXGBE_DEV_ID_X550EM_X_10G_T) {
     85  1.3.2.2  skrll 		hw->mac.ops.led_on = ixgbe_led_on_t_X550em;
     86  1.3.2.2  skrll 		hw->mac.ops.led_off = ixgbe_led_off_t_X550em;
     87  1.3.2.2  skrll 	}
     88  1.3.2.2  skrll 	return ret_val;
     89  1.3.2.2  skrll }
     90  1.3.2.2  skrll 
     91  1.3.2.2  skrll /**
     92  1.3.2.2  skrll  * ixgbe_read_cs4227 - Read CS4227 register
     93  1.3.2.2  skrll  * @hw: pointer to hardware structure
     94  1.3.2.2  skrll  * @reg: register number to write
     95  1.3.2.2  skrll  * @value: pointer to receive value read
     96  1.3.2.2  skrll  *
     97  1.3.2.2  skrll  * Returns status code
     98  1.3.2.2  skrll  **/
     99  1.3.2.2  skrll static s32 ixgbe_read_cs4227(struct ixgbe_hw *hw, u16 reg, u16 *value)
    100  1.3.2.2  skrll {
    101  1.3.2.2  skrll 	return ixgbe_read_i2c_combined_unlocked(hw, IXGBE_CS4227, reg, value);
    102  1.3.2.2  skrll }
    103  1.3.2.2  skrll 
    104  1.3.2.2  skrll /**
    105  1.3.2.2  skrll  * ixgbe_write_cs4227 - Write CS4227 register
    106  1.3.2.2  skrll  * @hw: pointer to hardware structure
    107  1.3.2.2  skrll  * @reg: register number to write
    108  1.3.2.2  skrll  * @value: value to write to register
    109  1.3.2.2  skrll  *
    110  1.3.2.2  skrll  * Returns status code
    111  1.3.2.2  skrll  **/
    112  1.3.2.2  skrll static s32 ixgbe_write_cs4227(struct ixgbe_hw *hw, u16 reg, u16 value)
    113  1.3.2.2  skrll {
    114  1.3.2.2  skrll 	return ixgbe_write_i2c_combined_unlocked(hw, IXGBE_CS4227, reg, value);
    115  1.3.2.2  skrll }
    116  1.3.2.2  skrll 
    117  1.3.2.2  skrll /**
    118  1.3.2.2  skrll  * ixgbe_read_pe - Read register from port expander
    119  1.3.2.2  skrll  * @hw: pointer to hardware structure
    120  1.3.2.2  skrll  * @reg: register number to read
    121  1.3.2.2  skrll  * @value: pointer to receive read value
    122  1.3.2.2  skrll  *
    123  1.3.2.2  skrll  * Returns status code
    124  1.3.2.2  skrll  **/
    125  1.3.2.2  skrll static s32 ixgbe_read_pe(struct ixgbe_hw *hw, u8 reg, u8 *value)
    126  1.3.2.2  skrll {
    127  1.3.2.2  skrll 	s32 status;
    128  1.3.2.2  skrll 
    129  1.3.2.2  skrll 	status = ixgbe_read_i2c_byte_unlocked(hw, reg, IXGBE_PE, value);
    130  1.3.2.2  skrll 	if (status != IXGBE_SUCCESS)
    131  1.3.2.2  skrll 		ERROR_REPORT2(IXGBE_ERROR_CAUTION,
    132  1.3.2.2  skrll 			      "port expander access failed with %d\n", status);
    133  1.3.2.2  skrll 	return status;
    134  1.3.2.2  skrll }
    135  1.3.2.2  skrll 
    136  1.3.2.2  skrll /**
    137  1.3.2.2  skrll  * ixgbe_write_pe - Write register to port expander
    138  1.3.2.2  skrll  * @hw: pointer to hardware structure
    139  1.3.2.2  skrll  * @reg: register number to write
    140  1.3.2.2  skrll  * @value: value to write
    141  1.3.2.2  skrll  *
    142  1.3.2.2  skrll  * Returns status code
    143  1.3.2.2  skrll  **/
    144  1.3.2.2  skrll static s32 ixgbe_write_pe(struct ixgbe_hw *hw, u8 reg, u8 value)
    145  1.3.2.2  skrll {
    146  1.3.2.2  skrll 	s32 status;
    147  1.3.2.2  skrll 
    148  1.3.2.2  skrll 	status = ixgbe_write_i2c_byte_unlocked(hw, reg, IXGBE_PE, value);
    149  1.3.2.2  skrll 	if (status != IXGBE_SUCCESS)
    150  1.3.2.2  skrll 		ERROR_REPORT2(IXGBE_ERROR_CAUTION,
    151  1.3.2.2  skrll 			      "port expander access failed with %d\n", status);
    152  1.3.2.2  skrll 	return status;
    153  1.3.2.2  skrll }
    154  1.3.2.2  skrll 
    155  1.3.2.2  skrll /**
    156  1.3.2.2  skrll  * ixgbe_reset_cs4227 - Reset CS4227 using port expander
    157  1.3.2.2  skrll  * @hw: pointer to hardware structure
    158  1.3.2.2  skrll  *
    159  1.3.2.2  skrll  * This function assumes that the caller has acquired the proper semaphore.
    160  1.3.2.2  skrll  * Returns error code
    161  1.3.2.2  skrll  **/
    162  1.3.2.2  skrll static s32 ixgbe_reset_cs4227(struct ixgbe_hw *hw)
    163  1.3.2.2  skrll {
    164  1.3.2.2  skrll 	s32 status;
    165  1.3.2.2  skrll 	u32 retry;
    166  1.3.2.2  skrll 	u16 value;
    167  1.3.2.2  skrll 	u8 reg;
    168  1.3.2.2  skrll 
    169  1.3.2.2  skrll 	/* Trigger hard reset. */
    170  1.3.2.2  skrll 	status = ixgbe_read_pe(hw, IXGBE_PE_OUTPUT, &reg);
    171  1.3.2.2  skrll 	if (status != IXGBE_SUCCESS)
    172  1.3.2.2  skrll 		return status;
    173  1.3.2.2  skrll 	reg |= IXGBE_PE_BIT1;
    174  1.3.2.2  skrll 	status = ixgbe_write_pe(hw, IXGBE_PE_OUTPUT, reg);
    175  1.3.2.2  skrll 	if (status != IXGBE_SUCCESS)
    176  1.3.2.2  skrll 		return status;
    177  1.3.2.2  skrll 
    178  1.3.2.2  skrll 	status = ixgbe_read_pe(hw, IXGBE_PE_CONFIG, &reg);
    179  1.3.2.2  skrll 	if (status != IXGBE_SUCCESS)
    180  1.3.2.2  skrll 		return status;
    181  1.3.2.2  skrll 	reg &= ~IXGBE_PE_BIT1;
    182  1.3.2.2  skrll 	status = ixgbe_write_pe(hw, IXGBE_PE_CONFIG, reg);
    183  1.3.2.2  skrll 	if (status != IXGBE_SUCCESS)
    184  1.3.2.2  skrll 		return status;
    185  1.3.2.2  skrll 
    186  1.3.2.2  skrll 	status = ixgbe_read_pe(hw, IXGBE_PE_OUTPUT, &reg);
    187  1.3.2.2  skrll 	if (status != IXGBE_SUCCESS)
    188  1.3.2.2  skrll 		return status;
    189  1.3.2.2  skrll 	reg &= ~IXGBE_PE_BIT1;
    190  1.3.2.2  skrll 	status = ixgbe_write_pe(hw, IXGBE_PE_OUTPUT, reg);
    191  1.3.2.2  skrll 	if (status != IXGBE_SUCCESS)
    192  1.3.2.2  skrll 		return status;
    193  1.3.2.2  skrll 
    194  1.3.2.2  skrll 	usec_delay(IXGBE_CS4227_RESET_HOLD);
    195  1.3.2.2  skrll 
    196  1.3.2.2  skrll 	status = ixgbe_read_pe(hw, IXGBE_PE_OUTPUT, &reg);
    197  1.3.2.2  skrll 	if (status != IXGBE_SUCCESS)
    198  1.3.2.2  skrll 		return status;
    199  1.3.2.2  skrll 	reg |= IXGBE_PE_BIT1;
    200  1.3.2.2  skrll 	status = ixgbe_write_pe(hw, IXGBE_PE_OUTPUT, reg);
    201  1.3.2.2  skrll 	if (status != IXGBE_SUCCESS)
    202  1.3.2.2  skrll 		return status;
    203  1.3.2.2  skrll 
    204  1.3.2.2  skrll 	/* Wait for the reset to complete. */
    205  1.3.2.2  skrll 	msec_delay(IXGBE_CS4227_RESET_DELAY);
    206  1.3.2.2  skrll 	for (retry = 0; retry < IXGBE_CS4227_RETRIES; retry++) {
    207  1.3.2.2  skrll 		status = ixgbe_read_cs4227(hw, IXGBE_CS4227_EFUSE_STATUS,
    208  1.3.2.2  skrll 					   &value);
    209  1.3.2.2  skrll 		if (status == IXGBE_SUCCESS &&
    210  1.3.2.2  skrll 		    value == IXGBE_CS4227_EEPROM_LOAD_OK)
    211  1.3.2.2  skrll 			break;
    212  1.3.2.2  skrll 		msec_delay(IXGBE_CS4227_CHECK_DELAY);
    213  1.3.2.2  skrll 	}
    214  1.3.2.2  skrll 	if (retry == IXGBE_CS4227_RETRIES) {
    215  1.3.2.2  skrll 		ERROR_REPORT1(IXGBE_ERROR_INVALID_STATE,
    216  1.3.2.2  skrll 			"CS4227 reset did not complete.");
    217  1.3.2.2  skrll 		return IXGBE_ERR_PHY;
    218  1.3.2.2  skrll 	}
    219  1.3.2.2  skrll 
    220  1.3.2.2  skrll 	status = ixgbe_read_cs4227(hw, IXGBE_CS4227_EEPROM_STATUS, &value);
    221  1.3.2.2  skrll 	if (status != IXGBE_SUCCESS ||
    222  1.3.2.2  skrll 	    !(value & IXGBE_CS4227_EEPROM_LOAD_OK)) {
    223  1.3.2.2  skrll 		ERROR_REPORT1(IXGBE_ERROR_INVALID_STATE,
    224  1.3.2.2  skrll 			"CS4227 EEPROM did not load successfully.");
    225  1.3.2.2  skrll 		return IXGBE_ERR_PHY;
    226  1.3.2.2  skrll 	}
    227  1.3.2.2  skrll 
    228  1.3.2.2  skrll 	return IXGBE_SUCCESS;
    229  1.3.2.2  skrll }
    230  1.3.2.2  skrll 
    231  1.3.2.2  skrll /**
    232  1.3.2.2  skrll  * ixgbe_check_cs4227 - Check CS4227 and reset as needed
    233  1.3.2.2  skrll  * @hw: pointer to hardware structure
    234  1.3.2.2  skrll  **/
    235  1.3.2.2  skrll static void ixgbe_check_cs4227(struct ixgbe_hw *hw)
    236  1.3.2.2  skrll {
    237  1.3.2.2  skrll 	s32 status = IXGBE_SUCCESS;
    238  1.3.2.2  skrll 	u32 swfw_mask = hw->phy.phy_semaphore_mask;
    239  1.3.2.2  skrll 	u16 value = 0;
    240  1.3.2.2  skrll 	u8 retry;
    241  1.3.2.2  skrll 
    242  1.3.2.2  skrll 	for (retry = 0; retry < IXGBE_CS4227_RETRIES; retry++) {
    243  1.3.2.2  skrll 		status = hw->mac.ops.acquire_swfw_sync(hw, swfw_mask);
    244  1.3.2.2  skrll 		if (status != IXGBE_SUCCESS) {
    245  1.3.2.2  skrll 			ERROR_REPORT2(IXGBE_ERROR_CAUTION,
    246  1.3.2.2  skrll 				"semaphore failed with %d", status);
    247  1.3.2.2  skrll 			msec_delay(IXGBE_CS4227_CHECK_DELAY);
    248  1.3.2.2  skrll 			continue;
    249  1.3.2.2  skrll 		}
    250  1.3.2.2  skrll 
    251  1.3.2.2  skrll 		/* Get status of reset flow. */
    252  1.3.2.2  skrll 		status = ixgbe_read_cs4227(hw, IXGBE_CS4227_SCRATCH, &value);
    253  1.3.2.2  skrll 
    254  1.3.2.2  skrll 		if (status == IXGBE_SUCCESS &&
    255  1.3.2.2  skrll 		    value == IXGBE_CS4227_RESET_COMPLETE)
    256  1.3.2.2  skrll 			goto out;
    257  1.3.2.2  skrll 
    258  1.3.2.2  skrll 		if (status != IXGBE_SUCCESS ||
    259  1.3.2.2  skrll 		    value != IXGBE_CS4227_RESET_PENDING)
    260  1.3.2.2  skrll 			break;
    261  1.3.2.2  skrll 
    262  1.3.2.2  skrll 		/* Reset is pending. Wait and check again. */
    263  1.3.2.2  skrll 		hw->mac.ops.release_swfw_sync(hw, swfw_mask);
    264  1.3.2.2  skrll 		msec_delay(IXGBE_CS4227_CHECK_DELAY);
    265  1.3.2.2  skrll 	}
    266  1.3.2.2  skrll 
    267  1.3.2.2  skrll 	/* If still pending, assume other instance failed. */
    268  1.3.2.2  skrll 	if (retry == IXGBE_CS4227_RETRIES) {
    269  1.3.2.2  skrll 		status = hw->mac.ops.acquire_swfw_sync(hw, swfw_mask);
    270  1.3.2.2  skrll 		if (status != IXGBE_SUCCESS) {
    271  1.3.2.2  skrll 			ERROR_REPORT2(IXGBE_ERROR_CAUTION,
    272  1.3.2.2  skrll 				      "semaphore failed with %d", status);
    273  1.3.2.2  skrll 			return;
    274  1.3.2.2  skrll 		}
    275  1.3.2.2  skrll 	}
    276  1.3.2.2  skrll 
    277  1.3.2.2  skrll 	/* Reset the CS4227. */
    278  1.3.2.2  skrll 	status = ixgbe_reset_cs4227(hw);
    279  1.3.2.2  skrll 	if (status != IXGBE_SUCCESS) {
    280  1.3.2.2  skrll 		ERROR_REPORT2(IXGBE_ERROR_INVALID_STATE,
    281  1.3.2.2  skrll 			"CS4227 reset failed: %d", status);
    282  1.3.2.2  skrll 		goto out;
    283  1.3.2.2  skrll 	}
    284  1.3.2.2  skrll 
    285  1.3.2.2  skrll 	/* Reset takes so long, temporarily release semaphore in case the
    286  1.3.2.2  skrll 	 * other driver instance is waiting for the reset indication.
    287  1.3.2.2  skrll 	 */
    288  1.3.2.2  skrll 	ixgbe_write_cs4227(hw, IXGBE_CS4227_SCRATCH,
    289  1.3.2.2  skrll 			   IXGBE_CS4227_RESET_PENDING);
    290  1.3.2.2  skrll 	hw->mac.ops.release_swfw_sync(hw, swfw_mask);
    291  1.3.2.2  skrll 	msec_delay(10);
    292  1.3.2.2  skrll 	status = hw->mac.ops.acquire_swfw_sync(hw, swfw_mask);
    293  1.3.2.2  skrll 	if (status != IXGBE_SUCCESS) {
    294  1.3.2.2  skrll 		ERROR_REPORT2(IXGBE_ERROR_CAUTION,
    295  1.3.2.2  skrll 			"semaphore failed with %d", status);
    296  1.3.2.2  skrll 		return;
    297  1.3.2.2  skrll 	}
    298  1.3.2.2  skrll 
    299  1.3.2.2  skrll 	/* Record completion for next time. */
    300  1.3.2.2  skrll 	status = ixgbe_write_cs4227(hw, IXGBE_CS4227_SCRATCH,
    301  1.3.2.2  skrll 		IXGBE_CS4227_RESET_COMPLETE);
    302  1.3.2.2  skrll 
    303  1.3.2.2  skrll out:
    304  1.3.2.2  skrll 	hw->mac.ops.release_swfw_sync(hw, swfw_mask);
    305  1.3.2.2  skrll 	msec_delay(hw->eeprom.semaphore_delay);
    306  1.3.2.2  skrll }
    307  1.3.2.2  skrll 
    308  1.3.2.2  skrll /**
    309  1.3.2.2  skrll  * ixgbe_setup_mux_ctl - Setup ESDP register for I2C mux control
    310  1.3.2.2  skrll  * @hw: pointer to hardware structure
    311  1.3.2.2  skrll  **/
    312  1.3.2.2  skrll static void ixgbe_setup_mux_ctl(struct ixgbe_hw *hw)
    313  1.3.2.2  skrll {
    314  1.3.2.2  skrll 	u32 esdp = IXGBE_READ_REG(hw, IXGBE_ESDP);
    315  1.3.2.2  skrll 
    316  1.3.2.2  skrll 	if (hw->bus.lan_id) {
    317  1.3.2.2  skrll 		esdp &= ~(IXGBE_ESDP_SDP1_NATIVE | IXGBE_ESDP_SDP1);
    318  1.3.2.2  skrll 		esdp |= IXGBE_ESDP_SDP1_DIR;
    319  1.3.2.2  skrll 	}
    320  1.3.2.2  skrll 	esdp &= ~(IXGBE_ESDP_SDP0_NATIVE | IXGBE_ESDP_SDP0_DIR);
    321  1.3.2.2  skrll 	IXGBE_WRITE_REG(hw, IXGBE_ESDP, esdp);
    322  1.3.2.2  skrll 	IXGBE_WRITE_FLUSH(hw);
    323  1.3.2.2  skrll }
    324  1.3.2.2  skrll 
    325  1.3.2.2  skrll /**
    326  1.3.2.2  skrll  * ixgbe_identify_phy_x550em - Get PHY type based on device id
    327  1.3.2.2  skrll  * @hw: pointer to hardware structure
    328  1.3.2.2  skrll  *
    329  1.3.2.2  skrll  * Returns error code
    330  1.3.2.2  skrll  */
    331  1.3.2.2  skrll static s32 ixgbe_identify_phy_x550em(struct ixgbe_hw *hw)
    332  1.3.2.2  skrll {
    333  1.3.2.2  skrll 	switch (hw->device_id) {
    334  1.3.2.2  skrll 	case IXGBE_DEV_ID_X550EM_X_SFP:
    335  1.3.2.2  skrll 		/* set up for CS4227 usage */
    336  1.3.2.2  skrll 		hw->phy.phy_semaphore_mask = IXGBE_GSSR_SHARED_I2C_SM;
    337  1.3.2.2  skrll 		ixgbe_setup_mux_ctl(hw);
    338  1.3.2.2  skrll 		ixgbe_check_cs4227(hw);
    339  1.3.2.2  skrll 
    340  1.3.2.2  skrll 		return ixgbe_identify_module_generic(hw);
    341  1.3.2.2  skrll 		break;
    342  1.3.2.2  skrll 	case IXGBE_DEV_ID_X550EM_X_KX4:
    343  1.3.2.2  skrll 		hw->phy.type = ixgbe_phy_x550em_kx4;
    344  1.3.2.2  skrll 		break;
    345  1.3.2.2  skrll 	case IXGBE_DEV_ID_X550EM_X_KR:
    346  1.3.2.2  skrll 		hw->phy.type = ixgbe_phy_x550em_kr;
    347  1.3.2.2  skrll 		break;
    348  1.3.2.2  skrll 	case IXGBE_DEV_ID_X550EM_X_1G_T:
    349  1.3.2.2  skrll 	case IXGBE_DEV_ID_X550EM_X_10G_T:
    350  1.3.2.2  skrll 		return ixgbe_identify_phy_generic(hw);
    351  1.3.2.2  skrll 	default:
    352  1.3.2.2  skrll 		break;
    353  1.3.2.2  skrll 	}
    354  1.3.2.2  skrll 	return IXGBE_SUCCESS;
    355  1.3.2.2  skrll }
    356  1.3.2.2  skrll 
    357  1.3.2.2  skrll static s32 ixgbe_read_phy_reg_x550em(struct ixgbe_hw *hw, u32 reg_addr,
    358  1.3.2.2  skrll 				     u32 device_type, u16 *phy_data)
    359  1.3.2.2  skrll {
    360  1.3.2.2  skrll 	UNREFERENCED_4PARAMETER(*hw, reg_addr, device_type, *phy_data);
    361  1.3.2.2  skrll 	return IXGBE_NOT_IMPLEMENTED;
    362  1.3.2.2  skrll }
    363  1.3.2.2  skrll 
    364  1.3.2.2  skrll static s32 ixgbe_write_phy_reg_x550em(struct ixgbe_hw *hw, u32 reg_addr,
    365  1.3.2.2  skrll 				      u32 device_type, u16 phy_data)
    366  1.3.2.2  skrll {
    367  1.3.2.2  skrll 	UNREFERENCED_4PARAMETER(*hw, reg_addr, device_type, phy_data);
    368  1.3.2.2  skrll 	return IXGBE_NOT_IMPLEMENTED;
    369  1.3.2.2  skrll }
    370  1.3.2.2  skrll 
    371  1.3.2.2  skrll /**
    372  1.3.2.2  skrll *  ixgbe_init_ops_X550EM - Inits func ptrs and MAC type
    373  1.3.2.2  skrll *  @hw: pointer to hardware structure
    374  1.3.2.2  skrll *
    375  1.3.2.2  skrll *  Initialize the function pointers and for MAC type X550EM.
    376  1.3.2.2  skrll *  Does not touch the hardware.
    377  1.3.2.2  skrll **/
    378  1.3.2.2  skrll s32 ixgbe_init_ops_X550EM(struct ixgbe_hw *hw)
    379  1.3.2.2  skrll {
    380  1.3.2.2  skrll 	struct ixgbe_mac_info *mac = &hw->mac;
    381  1.3.2.2  skrll 	struct ixgbe_eeprom_info *eeprom = &hw->eeprom;
    382  1.3.2.2  skrll 	struct ixgbe_phy_info *phy = &hw->phy;
    383  1.3.2.2  skrll 	s32 ret_val;
    384  1.3.2.2  skrll 
    385  1.3.2.2  skrll 	DEBUGFUNC("ixgbe_init_ops_X550EM");
    386  1.3.2.2  skrll 
    387  1.3.2.2  skrll 	/* Similar to X550 so start there. */
    388  1.3.2.2  skrll 	ret_val = ixgbe_init_ops_X550(hw);
    389  1.3.2.2  skrll 
    390  1.3.2.2  skrll 	/* Since this function eventually calls
    391  1.3.2.2  skrll 	 * ixgbe_init_ops_540 by design, we are setting
    392  1.3.2.2  skrll 	 * the pointers to NULL explicitly here to overwrite
    393  1.3.2.2  skrll 	 * the values being set in the x540 function.
    394  1.3.2.2  skrll 	 */
    395  1.3.2.2  skrll 
    396  1.3.2.2  skrll 	/* FCOE not supported in x550EM */
    397  1.3.2.2  skrll 	mac->ops.get_san_mac_addr = NULL;
    398  1.3.2.2  skrll 	mac->ops.set_san_mac_addr = NULL;
    399  1.3.2.2  skrll 	mac->ops.get_wwn_prefix = NULL;
    400  1.3.2.2  skrll 	mac->ops.get_fcoe_boot_status = NULL;
    401  1.3.2.2  skrll 
    402  1.3.2.2  skrll 	/* IPsec not supported in x550EM */
    403  1.3.2.2  skrll 	mac->ops.disable_sec_rx_path = NULL;
    404  1.3.2.2  skrll 	mac->ops.enable_sec_rx_path = NULL;
    405  1.3.2.2  skrll 
    406  1.3.2.2  skrll 	/* AUTOC register is not present in x550EM. */
    407  1.3.2.2  skrll 	mac->ops.prot_autoc_read = NULL;
    408  1.3.2.2  skrll 	mac->ops.prot_autoc_write = NULL;
    409  1.3.2.2  skrll 
    410  1.3.2.2  skrll 	/* X550EM bus type is internal*/
    411  1.3.2.2  skrll 	hw->bus.type = ixgbe_bus_type_internal;
    412  1.3.2.2  skrll 	mac->ops.get_bus_info = ixgbe_get_bus_info_X550em;
    413  1.3.2.2  skrll 
    414  1.3.2.2  skrll 	if (hw->mac.type == ixgbe_mac_X550EM_x) {
    415  1.3.2.2  skrll 		mac->ops.read_iosf_sb_reg = ixgbe_read_iosf_sb_reg_x550;
    416  1.3.2.2  skrll 		mac->ops.write_iosf_sb_reg = ixgbe_write_iosf_sb_reg_x550;
    417  1.3.2.2  skrll 	}
    418  1.3.2.2  skrll 
    419  1.3.2.2  skrll 	mac->ops.get_media_type = ixgbe_get_media_type_X550em;
    420  1.3.2.2  skrll 	mac->ops.setup_sfp = ixgbe_setup_sfp_modules_X550em;
    421  1.3.2.2  skrll 	mac->ops.get_link_capabilities = ixgbe_get_link_capabilities_X550em;
    422  1.3.2.2  skrll 	mac->ops.reset_hw = ixgbe_reset_hw_X550em;
    423  1.3.2.2  skrll 	mac->ops.get_supported_physical_layer =
    424  1.3.2.2  skrll 				    ixgbe_get_supported_physical_layer_X550em;
    425  1.3.2.2  skrll 
    426  1.3.2.2  skrll 	if (mac->ops.get_media_type(hw) == ixgbe_media_type_copper)
    427  1.3.2.2  skrll 		mac->ops.setup_fc = ixgbe_setup_fc_generic;
    428  1.3.2.2  skrll 	else
    429  1.3.2.2  skrll 		mac->ops.setup_fc = ixgbe_setup_fc_X550em;
    430  1.3.2.2  skrll 
    431  1.3.2.2  skrll 	mac->ops.acquire_swfw_sync = ixgbe_acquire_swfw_sync_X550em;
    432  1.3.2.2  skrll 	mac->ops.release_swfw_sync = ixgbe_release_swfw_sync_X550em;
    433  1.3.2.2  skrll 
    434  1.3.2.2  skrll 	if (hw->device_id != IXGBE_DEV_ID_X550EM_X_KR)
    435  1.3.2.2  skrll 		mac->ops.setup_eee = NULL;
    436  1.3.2.2  skrll 
    437  1.3.2.2  skrll 	/* PHY */
    438  1.3.2.2  skrll 	phy->ops.init = ixgbe_init_phy_ops_X550em;
    439  1.3.2.2  skrll 	phy->ops.identify = ixgbe_identify_phy_x550em;
    440  1.3.2.2  skrll 	if (mac->ops.get_media_type(hw) != ixgbe_media_type_copper)
    441  1.3.2.2  skrll 		phy->ops.set_phy_power = NULL;
    442  1.3.2.2  skrll 
    443  1.3.2.2  skrll 
    444  1.3.2.2  skrll 	/* EEPROM */
    445  1.3.2.2  skrll 	eeprom->ops.init_params = ixgbe_init_eeprom_params_X540;
    446  1.3.2.2  skrll 	eeprom->ops.read = ixgbe_read_ee_hostif_X550;
    447  1.3.2.2  skrll 	eeprom->ops.read_buffer = ixgbe_read_ee_hostif_buffer_X550;
    448  1.3.2.2  skrll 	eeprom->ops.write = ixgbe_write_ee_hostif_X550;
    449  1.3.2.2  skrll 	eeprom->ops.write_buffer = ixgbe_write_ee_hostif_buffer_X550;
    450  1.3.2.2  skrll 	eeprom->ops.update_checksum = ixgbe_update_eeprom_checksum_X550;
    451  1.3.2.2  skrll 	eeprom->ops.validate_checksum = ixgbe_validate_eeprom_checksum_X550;
    452  1.3.2.2  skrll 	eeprom->ops.calc_checksum = ixgbe_calc_eeprom_checksum_X550;
    453  1.3.2.2  skrll 
    454  1.3.2.2  skrll 	return ret_val;
    455  1.3.2.2  skrll }
    456  1.3.2.2  skrll 
    457  1.3.2.2  skrll /**
    458  1.3.2.2  skrll  *  ixgbe_dmac_config_X550
    459  1.3.2.2  skrll  *  @hw: pointer to hardware structure
    460  1.3.2.2  skrll  *
    461  1.3.2.2  skrll  *  Configure DMA coalescing. If enabling dmac, dmac is activated.
    462  1.3.2.2  skrll  *  When disabling dmac, dmac enable dmac bit is cleared.
    463  1.3.2.2  skrll  **/
    464  1.3.2.2  skrll s32 ixgbe_dmac_config_X550(struct ixgbe_hw *hw)
    465  1.3.2.2  skrll {
    466  1.3.2.2  skrll 	u32 reg, high_pri_tc;
    467  1.3.2.2  skrll 
    468  1.3.2.2  skrll 	DEBUGFUNC("ixgbe_dmac_config_X550");
    469  1.3.2.2  skrll 
    470  1.3.2.2  skrll 	/* Disable DMA coalescing before configuring */
    471  1.3.2.2  skrll 	reg = IXGBE_READ_REG(hw, IXGBE_DMACR);
    472  1.3.2.2  skrll 	reg &= ~IXGBE_DMACR_DMAC_EN;
    473  1.3.2.2  skrll 	IXGBE_WRITE_REG(hw, IXGBE_DMACR, reg);
    474  1.3.2.2  skrll 
    475  1.3.2.2  skrll 	/* Disable DMA Coalescing if the watchdog timer is 0 */
    476  1.3.2.2  skrll 	if (!hw->mac.dmac_config.watchdog_timer)
    477  1.3.2.2  skrll 		goto out;
    478  1.3.2.2  skrll 
    479  1.3.2.2  skrll 	ixgbe_dmac_config_tcs_X550(hw);
    480  1.3.2.2  skrll 
    481  1.3.2.2  skrll 	/* Configure DMA Coalescing Control Register */
    482  1.3.2.2  skrll 	reg = IXGBE_READ_REG(hw, IXGBE_DMACR);
    483  1.3.2.2  skrll 
    484  1.3.2.2  skrll 	/* Set the watchdog timer in units of 40.96 usec */
    485  1.3.2.2  skrll 	reg &= ~IXGBE_DMACR_DMACWT_MASK;
    486  1.3.2.2  skrll 	reg |= (hw->mac.dmac_config.watchdog_timer * 100) / 4096;
    487  1.3.2.2  skrll 
    488  1.3.2.2  skrll 	reg &= ~IXGBE_DMACR_HIGH_PRI_TC_MASK;
    489  1.3.2.2  skrll 	/* If fcoe is enabled, set high priority traffic class */
    490  1.3.2.2  skrll 	if (hw->mac.dmac_config.fcoe_en) {
    491  1.3.2.2  skrll 		high_pri_tc = 1 << hw->mac.dmac_config.fcoe_tc;
    492  1.3.2.2  skrll 		reg |= ((high_pri_tc << IXGBE_DMACR_HIGH_PRI_TC_SHIFT) &
    493  1.3.2.2  skrll 			IXGBE_DMACR_HIGH_PRI_TC_MASK);
    494  1.3.2.2  skrll 	}
    495  1.3.2.2  skrll 	reg |= IXGBE_DMACR_EN_MNG_IND;
    496  1.3.2.2  skrll 
    497  1.3.2.2  skrll 	/* Enable DMA coalescing after configuration */
    498  1.3.2.2  skrll 	reg |= IXGBE_DMACR_DMAC_EN;
    499  1.3.2.2  skrll 	IXGBE_WRITE_REG(hw, IXGBE_DMACR, reg);
    500  1.3.2.2  skrll 
    501  1.3.2.2  skrll out:
    502  1.3.2.2  skrll 	return IXGBE_SUCCESS;
    503  1.3.2.2  skrll }
    504  1.3.2.2  skrll 
    505  1.3.2.2  skrll /**
    506  1.3.2.2  skrll  *  ixgbe_dmac_config_tcs_X550
    507  1.3.2.2  skrll  *  @hw: pointer to hardware structure
    508  1.3.2.2  skrll  *
    509  1.3.2.2  skrll  *  Configure DMA coalescing threshold per TC. The dmac enable bit must
    510  1.3.2.2  skrll  *  be cleared before configuring.
    511  1.3.2.2  skrll  **/
    512  1.3.2.2  skrll s32 ixgbe_dmac_config_tcs_X550(struct ixgbe_hw *hw)
    513  1.3.2.2  skrll {
    514  1.3.2.2  skrll 	u32 tc, reg, pb_headroom, rx_pb_size, maxframe_size_kb;
    515  1.3.2.2  skrll 
    516  1.3.2.2  skrll 	DEBUGFUNC("ixgbe_dmac_config_tcs_X550");
    517  1.3.2.2  skrll 
    518  1.3.2.2  skrll 	/* Configure DMA coalescing enabled */
    519  1.3.2.2  skrll 	switch (hw->mac.dmac_config.link_speed) {
    520  1.3.2.2  skrll 	case IXGBE_LINK_SPEED_100_FULL:
    521  1.3.2.2  skrll 		pb_headroom = IXGBE_DMACRXT_100M;
    522  1.3.2.2  skrll 		break;
    523  1.3.2.2  skrll 	case IXGBE_LINK_SPEED_1GB_FULL:
    524  1.3.2.2  skrll 		pb_headroom = IXGBE_DMACRXT_1G;
    525  1.3.2.2  skrll 		break;
    526  1.3.2.2  skrll 	default:
    527  1.3.2.2  skrll 		pb_headroom = IXGBE_DMACRXT_10G;
    528  1.3.2.2  skrll 		break;
    529  1.3.2.2  skrll 	}
    530  1.3.2.2  skrll 
    531  1.3.2.2  skrll 	maxframe_size_kb = ((IXGBE_READ_REG(hw, IXGBE_MAXFRS) >>
    532  1.3.2.2  skrll 			     IXGBE_MHADD_MFS_SHIFT) / 1024);
    533  1.3.2.2  skrll 
    534  1.3.2.2  skrll 	/* Set the per Rx packet buffer receive threshold */
    535  1.3.2.2  skrll 	for (tc = 0; tc < IXGBE_DCB_MAX_TRAFFIC_CLASS; tc++) {
    536  1.3.2.2  skrll 		reg = IXGBE_READ_REG(hw, IXGBE_DMCTH(tc));
    537  1.3.2.2  skrll 		reg &= ~IXGBE_DMCTH_DMACRXT_MASK;
    538  1.3.2.2  skrll 
    539  1.3.2.2  skrll 		if (tc < hw->mac.dmac_config.num_tcs) {
    540  1.3.2.2  skrll 			/* Get Rx PB size */
    541  1.3.2.2  skrll 			rx_pb_size = IXGBE_READ_REG(hw, IXGBE_RXPBSIZE(tc));
    542  1.3.2.2  skrll 			rx_pb_size = (rx_pb_size & IXGBE_RXPBSIZE_MASK) >>
    543  1.3.2.2  skrll 				IXGBE_RXPBSIZE_SHIFT;
    544  1.3.2.2  skrll 
    545  1.3.2.2  skrll 			/* Calculate receive buffer threshold in kilobytes */
    546  1.3.2.2  skrll 			if (rx_pb_size > pb_headroom)
    547  1.3.2.2  skrll 				rx_pb_size = rx_pb_size - pb_headroom;
    548  1.3.2.2  skrll 			else
    549  1.3.2.2  skrll 				rx_pb_size = 0;
    550  1.3.2.2  skrll 
    551  1.3.2.2  skrll 			/* Minimum of MFS shall be set for DMCTH */
    552  1.3.2.2  skrll 			reg |= (rx_pb_size > maxframe_size_kb) ?
    553  1.3.2.2  skrll 				rx_pb_size : maxframe_size_kb;
    554  1.3.2.2  skrll 		}
    555  1.3.2.2  skrll 		IXGBE_WRITE_REG(hw, IXGBE_DMCTH(tc), reg);
    556  1.3.2.2  skrll 	}
    557  1.3.2.2  skrll 	return IXGBE_SUCCESS;
    558  1.3.2.2  skrll }
    559  1.3.2.2  skrll 
    560  1.3.2.2  skrll /**
    561  1.3.2.2  skrll  *  ixgbe_dmac_update_tcs_X550
    562  1.3.2.2  skrll  *  @hw: pointer to hardware structure
    563  1.3.2.2  skrll  *
    564  1.3.2.2  skrll  *  Disables dmac, updates per TC settings, and then enables dmac.
    565  1.3.2.2  skrll  **/
    566  1.3.2.2  skrll s32 ixgbe_dmac_update_tcs_X550(struct ixgbe_hw *hw)
    567  1.3.2.2  skrll {
    568  1.3.2.2  skrll 	u32 reg;
    569  1.3.2.2  skrll 
    570  1.3.2.2  skrll 	DEBUGFUNC("ixgbe_dmac_update_tcs_X550");
    571  1.3.2.2  skrll 
    572  1.3.2.2  skrll 	/* Disable DMA coalescing before configuring */
    573  1.3.2.2  skrll 	reg = IXGBE_READ_REG(hw, IXGBE_DMACR);
    574  1.3.2.2  skrll 	reg &= ~IXGBE_DMACR_DMAC_EN;
    575  1.3.2.2  skrll 	IXGBE_WRITE_REG(hw, IXGBE_DMACR, reg);
    576  1.3.2.2  skrll 
    577  1.3.2.2  skrll 	ixgbe_dmac_config_tcs_X550(hw);
    578  1.3.2.2  skrll 
    579  1.3.2.2  skrll 	/* Enable DMA coalescing after configuration */
    580  1.3.2.2  skrll 	reg = IXGBE_READ_REG(hw, IXGBE_DMACR);
    581  1.3.2.2  skrll 	reg |= IXGBE_DMACR_DMAC_EN;
    582  1.3.2.2  skrll 	IXGBE_WRITE_REG(hw, IXGBE_DMACR, reg);
    583  1.3.2.2  skrll 
    584  1.3.2.2  skrll 	return IXGBE_SUCCESS;
    585  1.3.2.2  skrll }
    586  1.3.2.2  skrll 
    587  1.3.2.2  skrll /**
    588  1.3.2.2  skrll  *  ixgbe_init_eeprom_params_X550 - Initialize EEPROM params
    589  1.3.2.2  skrll  *  @hw: pointer to hardware structure
    590  1.3.2.2  skrll  *
    591  1.3.2.2  skrll  *  Initializes the EEPROM parameters ixgbe_eeprom_info within the
    592  1.3.2.2  skrll  *  ixgbe_hw struct in order to set up EEPROM access.
    593  1.3.2.2  skrll  **/
    594  1.3.2.2  skrll s32 ixgbe_init_eeprom_params_X550(struct ixgbe_hw *hw)
    595  1.3.2.2  skrll {
    596  1.3.2.2  skrll 	struct ixgbe_eeprom_info *eeprom = &hw->eeprom;
    597  1.3.2.2  skrll 	u32 eec;
    598  1.3.2.2  skrll 	u16 eeprom_size;
    599  1.3.2.2  skrll 
    600  1.3.2.2  skrll 	DEBUGFUNC("ixgbe_init_eeprom_params_X550");
    601  1.3.2.2  skrll 
    602  1.3.2.2  skrll 	if (eeprom->type == ixgbe_eeprom_uninitialized) {
    603  1.3.2.2  skrll 		eeprom->semaphore_delay = 10;
    604  1.3.2.2  skrll 		eeprom->type = ixgbe_flash;
    605  1.3.2.2  skrll 
    606  1.3.2.2  skrll 		eec = IXGBE_READ_REG(hw, IXGBE_EEC);
    607  1.3.2.2  skrll 		eeprom_size = (u16)((eec & IXGBE_EEC_SIZE) >>
    608  1.3.2.2  skrll 				    IXGBE_EEC_SIZE_SHIFT);
    609  1.3.2.2  skrll 		eeprom->word_size = 1 << (eeprom_size +
    610  1.3.2.2  skrll 					  IXGBE_EEPROM_WORD_SIZE_SHIFT);
    611  1.3.2.2  skrll 
    612  1.3.2.2  skrll 		DEBUGOUT2("Eeprom params: type = %d, size = %d\n",
    613  1.3.2.2  skrll 			  eeprom->type, eeprom->word_size);
    614  1.3.2.2  skrll 	}
    615  1.3.2.2  skrll 
    616  1.3.2.2  skrll 	return IXGBE_SUCCESS;
    617  1.3.2.2  skrll }
    618  1.3.2.2  skrll 
    619  1.3.2.2  skrll /**
    620  1.3.2.2  skrll  *  ixgbe_setup_eee_X550 - Enable/disable EEE support
    621  1.3.2.2  skrll  *  @hw: pointer to the HW structure
    622  1.3.2.2  skrll  *  @enable_eee: boolean flag to enable EEE
    623  1.3.2.2  skrll  *
    624  1.3.2.2  skrll  *  Enable/disable EEE based on enable_eee flag.
    625  1.3.2.2  skrll  *  Auto-negotiation must be started after BASE-T EEE bits in PHY register 7.3C
    626  1.3.2.2  skrll  *  are modified.
    627  1.3.2.2  skrll  *
    628  1.3.2.2  skrll  **/
    629  1.3.2.2  skrll s32 ixgbe_setup_eee_X550(struct ixgbe_hw *hw, bool enable_eee)
    630  1.3.2.2  skrll {
    631  1.3.2.2  skrll 	u32 eeer;
    632  1.3.2.2  skrll 	u16 autoneg_eee_reg;
    633  1.3.2.2  skrll 	u32 link_reg;
    634  1.3.2.2  skrll 	s32 status;
    635  1.3.2.2  skrll 	u32 fuse;
    636  1.3.2.2  skrll 
    637  1.3.2.2  skrll 	DEBUGFUNC("ixgbe_setup_eee_X550");
    638  1.3.2.2  skrll 
    639  1.3.2.2  skrll 	eeer = IXGBE_READ_REG(hw, IXGBE_EEER);
    640  1.3.2.2  skrll 	/* Enable or disable EEE per flag */
    641  1.3.2.2  skrll 	if (enable_eee) {
    642  1.3.2.2  skrll 		eeer |= (IXGBE_EEER_TX_LPI_EN | IXGBE_EEER_RX_LPI_EN);
    643  1.3.2.2  skrll 
    644  1.3.2.2  skrll 		if (hw->mac.type == ixgbe_mac_X550) {
    645  1.3.2.2  skrll 			/* Advertise EEE capability */
    646  1.3.2.2  skrll 			hw->phy.ops.read_reg(hw, IXGBE_MDIO_AUTO_NEG_EEE_ADVT,
    647  1.3.2.2  skrll 				IXGBE_MDIO_AUTO_NEG_DEV_TYPE, &autoneg_eee_reg);
    648  1.3.2.2  skrll 
    649  1.3.2.2  skrll 			autoneg_eee_reg |= (IXGBE_AUTO_NEG_10GBASE_EEE_ADVT |
    650  1.3.2.2  skrll 				IXGBE_AUTO_NEG_1000BASE_EEE_ADVT |
    651  1.3.2.2  skrll 				IXGBE_AUTO_NEG_100BASE_EEE_ADVT);
    652  1.3.2.2  skrll 
    653  1.3.2.2  skrll 			hw->phy.ops.write_reg(hw, IXGBE_MDIO_AUTO_NEG_EEE_ADVT,
    654  1.3.2.2  skrll 				IXGBE_MDIO_AUTO_NEG_DEV_TYPE, autoneg_eee_reg);
    655  1.3.2.2  skrll 		} else if (hw->device_id == IXGBE_DEV_ID_X550EM_X_KR) {
    656  1.3.2.2  skrll 			/* Not supported on first revision. */
    657  1.3.2.2  skrll 			fuse = IXGBE_READ_REG(hw, IXGBE_FUSES0_GROUP(0));
    658  1.3.2.2  skrll 			if (!(fuse & IXGBE_FUSES0_REV1))
    659  1.3.2.2  skrll 				return IXGBE_SUCCESS;
    660  1.3.2.2  skrll 
    661  1.3.2.2  skrll 			status = ixgbe_read_iosf_sb_reg_x550(hw,
    662  1.3.2.2  skrll 				IXGBE_KRM_LINK_CTRL_1(hw->bus.lan_id),
    663  1.3.2.2  skrll 				IXGBE_SB_IOSF_TARGET_KR_PHY, &link_reg);
    664  1.3.2.2  skrll 			if (status != IXGBE_SUCCESS)
    665  1.3.2.2  skrll 				return status;
    666  1.3.2.2  skrll 
    667  1.3.2.2  skrll 			link_reg |= IXGBE_KRM_LINK_CTRL_1_TETH_EEE_CAP_KR |
    668  1.3.2.2  skrll 				    IXGBE_KRM_LINK_CTRL_1_TETH_EEE_CAP_KX;
    669  1.3.2.2  skrll 
    670  1.3.2.2  skrll 			/* Don't advertise FEC capability when EEE enabled. */
    671  1.3.2.2  skrll 			link_reg &= ~IXGBE_KRM_LINK_CTRL_1_TETH_AN_CAP_FEC;
    672  1.3.2.2  skrll 
    673  1.3.2.2  skrll 			status = ixgbe_write_iosf_sb_reg_x550(hw,
    674  1.3.2.2  skrll 				IXGBE_KRM_LINK_CTRL_1(hw->bus.lan_id),
    675  1.3.2.2  skrll 				IXGBE_SB_IOSF_TARGET_KR_PHY, link_reg);
    676  1.3.2.2  skrll 			if (status != IXGBE_SUCCESS)
    677  1.3.2.2  skrll 				return status;
    678  1.3.2.2  skrll 		}
    679  1.3.2.2  skrll 	} else {
    680  1.3.2.2  skrll 		eeer &= ~(IXGBE_EEER_TX_LPI_EN | IXGBE_EEER_RX_LPI_EN);
    681  1.3.2.2  skrll 
    682  1.3.2.2  skrll 		if (hw->mac.type == ixgbe_mac_X550) {
    683  1.3.2.2  skrll 			/* Disable advertised EEE capability */
    684  1.3.2.2  skrll 			hw->phy.ops.read_reg(hw, IXGBE_MDIO_AUTO_NEG_EEE_ADVT,
    685  1.3.2.2  skrll 				IXGBE_MDIO_AUTO_NEG_DEV_TYPE, &autoneg_eee_reg);
    686  1.3.2.2  skrll 
    687  1.3.2.2  skrll 			autoneg_eee_reg &= ~(IXGBE_AUTO_NEG_10GBASE_EEE_ADVT |
    688  1.3.2.2  skrll 				IXGBE_AUTO_NEG_1000BASE_EEE_ADVT |
    689  1.3.2.2  skrll 				IXGBE_AUTO_NEG_100BASE_EEE_ADVT);
    690  1.3.2.2  skrll 
    691  1.3.2.2  skrll 			hw->phy.ops.write_reg(hw, IXGBE_MDIO_AUTO_NEG_EEE_ADVT,
    692  1.3.2.2  skrll 				IXGBE_MDIO_AUTO_NEG_DEV_TYPE, autoneg_eee_reg);
    693  1.3.2.2  skrll 		} else if (hw->device_id == IXGBE_DEV_ID_X550EM_X_KR) {
    694  1.3.2.2  skrll 			status = ixgbe_read_iosf_sb_reg_x550(hw,
    695  1.3.2.2  skrll 				IXGBE_KRM_LINK_CTRL_1(hw->bus.lan_id),
    696  1.3.2.2  skrll 				IXGBE_SB_IOSF_TARGET_KR_PHY, &link_reg);
    697  1.3.2.2  skrll 			if (status != IXGBE_SUCCESS)
    698  1.3.2.2  skrll 				return status;
    699  1.3.2.2  skrll 
    700  1.3.2.2  skrll 			link_reg &= ~(IXGBE_KRM_LINK_CTRL_1_TETH_EEE_CAP_KR |
    701  1.3.2.2  skrll 				IXGBE_KRM_LINK_CTRL_1_TETH_EEE_CAP_KX);
    702  1.3.2.2  skrll 
    703  1.3.2.2  skrll 			/* Advertise FEC capability when EEE is disabled. */
    704  1.3.2.2  skrll 			link_reg |= IXGBE_KRM_LINK_CTRL_1_TETH_AN_CAP_FEC;
    705  1.3.2.2  skrll 
    706  1.3.2.2  skrll 			status = ixgbe_write_iosf_sb_reg_x550(hw,
    707  1.3.2.2  skrll 				IXGBE_KRM_LINK_CTRL_1(hw->bus.lan_id),
    708  1.3.2.2  skrll 				IXGBE_SB_IOSF_TARGET_KR_PHY, link_reg);
    709  1.3.2.2  skrll 			if (status != IXGBE_SUCCESS)
    710  1.3.2.2  skrll 				return status;
    711  1.3.2.2  skrll 		}
    712  1.3.2.2  skrll 	}
    713  1.3.2.2  skrll 	IXGBE_WRITE_REG(hw, IXGBE_EEER, eeer);
    714  1.3.2.2  skrll 
    715  1.3.2.2  skrll 	return IXGBE_SUCCESS;
    716  1.3.2.2  skrll }
    717  1.3.2.2  skrll 
    718  1.3.2.2  skrll /**
    719  1.3.2.2  skrll  * ixgbe_set_source_address_pruning_X550 - Enable/Disbale source address pruning
    720  1.3.2.2  skrll  * @hw: pointer to hardware structure
    721  1.3.2.2  skrll  * @enable: enable or disable source address pruning
    722  1.3.2.2  skrll  * @pool: Rx pool to set source address pruning for
    723  1.3.2.2  skrll  **/
    724  1.3.2.2  skrll void ixgbe_set_source_address_pruning_X550(struct ixgbe_hw *hw, bool enable,
    725  1.3.2.2  skrll 					   unsigned int pool)
    726  1.3.2.2  skrll {
    727  1.3.2.2  skrll 	u64 pfflp;
    728  1.3.2.2  skrll 
    729  1.3.2.2  skrll 	/* max rx pool is 63 */
    730  1.3.2.2  skrll 	if (pool > 63)
    731  1.3.2.2  skrll 		return;
    732  1.3.2.2  skrll 
    733  1.3.2.2  skrll 	pfflp = (u64)IXGBE_READ_REG(hw, IXGBE_PFFLPL);
    734  1.3.2.2  skrll 	pfflp |= (u64)IXGBE_READ_REG(hw, IXGBE_PFFLPH) << 32;
    735  1.3.2.2  skrll 
    736  1.3.2.2  skrll 	if (enable)
    737  1.3.2.2  skrll 		pfflp |= (1ULL << pool);
    738  1.3.2.2  skrll 	else
    739  1.3.2.2  skrll 		pfflp &= ~(1ULL << pool);
    740  1.3.2.2  skrll 
    741  1.3.2.2  skrll 	IXGBE_WRITE_REG(hw, IXGBE_PFFLPL, (u32)pfflp);
    742  1.3.2.2  skrll 	IXGBE_WRITE_REG(hw, IXGBE_PFFLPH, (u32)(pfflp >> 32));
    743  1.3.2.2  skrll }
    744  1.3.2.2  skrll 
    745  1.3.2.2  skrll /**
    746  1.3.2.2  skrll  *  ixgbe_set_ethertype_anti_spoofing_X550 - Enable/Disable Ethertype anti-spoofing
    747  1.3.2.2  skrll  *  @hw: pointer to hardware structure
    748  1.3.2.2  skrll  *  @enable: enable or disable switch for Ethertype anti-spoofing
    749  1.3.2.2  skrll  *  @vf: Virtual Function pool - VF Pool to set for Ethertype anti-spoofing
    750  1.3.2.2  skrll  *
    751  1.3.2.2  skrll  **/
    752  1.3.2.2  skrll void ixgbe_set_ethertype_anti_spoofing_X550(struct ixgbe_hw *hw,
    753  1.3.2.2  skrll 		bool enable, int vf)
    754  1.3.2.2  skrll {
    755  1.3.2.2  skrll 	int vf_target_reg = vf >> 3;
    756  1.3.2.2  skrll 	int vf_target_shift = vf % 8 + IXGBE_SPOOF_ETHERTYPEAS_SHIFT;
    757  1.3.2.2  skrll 	u32 pfvfspoof;
    758  1.3.2.2  skrll 
    759  1.3.2.2  skrll 	DEBUGFUNC("ixgbe_set_ethertype_anti_spoofing_X550");
    760  1.3.2.2  skrll 
    761  1.3.2.2  skrll 	pfvfspoof = IXGBE_READ_REG(hw, IXGBE_PFVFSPOOF(vf_target_reg));
    762  1.3.2.2  skrll 	if (enable)
    763  1.3.2.2  skrll 		pfvfspoof |= (1 << vf_target_shift);
    764  1.3.2.2  skrll 	else
    765  1.3.2.2  skrll 		pfvfspoof &= ~(1 << vf_target_shift);
    766  1.3.2.2  skrll 
    767  1.3.2.2  skrll 	IXGBE_WRITE_REG(hw, IXGBE_PFVFSPOOF(vf_target_reg), pfvfspoof);
    768  1.3.2.2  skrll }
    769  1.3.2.2  skrll 
    770  1.3.2.2  skrll /**
    771  1.3.2.2  skrll  * ixgbe_iosf_wait - Wait for IOSF command completion
    772  1.3.2.2  skrll  * @hw: pointer to hardware structure
    773  1.3.2.2  skrll  * @ctrl: pointer to location to receive final IOSF control value
    774  1.3.2.2  skrll  *
    775  1.3.2.2  skrll  * Returns failing status on timeout
    776  1.3.2.2  skrll  *
    777  1.3.2.2  skrll  * Note: ctrl can be NULL if the IOSF control register value is not needed
    778  1.3.2.2  skrll  **/
    779  1.3.2.2  skrll static s32 ixgbe_iosf_wait(struct ixgbe_hw *hw, u32 *ctrl)
    780  1.3.2.2  skrll {
    781  1.3.2.2  skrll 	u32 i, command = 0;
    782  1.3.2.2  skrll 
    783  1.3.2.2  skrll 	/* Check every 10 usec to see if the address cycle completed.
    784  1.3.2.2  skrll 	 * The SB IOSF BUSY bit will clear when the operation is
    785  1.3.2.2  skrll 	 * complete
    786  1.3.2.2  skrll 	 */
    787  1.3.2.2  skrll 	for (i = 0; i < IXGBE_MDIO_COMMAND_TIMEOUT; i++) {
    788  1.3.2.2  skrll 		command = IXGBE_READ_REG(hw, IXGBE_SB_IOSF_INDIRECT_CTRL);
    789  1.3.2.2  skrll 		if ((command & IXGBE_SB_IOSF_CTRL_BUSY) == 0)
    790  1.3.2.2  skrll 			break;
    791  1.3.2.2  skrll 		usec_delay(10);
    792  1.3.2.2  skrll 	}
    793  1.3.2.2  skrll 	if (ctrl)
    794  1.3.2.2  skrll 		*ctrl = command;
    795  1.3.2.2  skrll 	if (i == IXGBE_MDIO_COMMAND_TIMEOUT) {
    796  1.3.2.2  skrll 		ERROR_REPORT1(IXGBE_ERROR_POLLING, "Wait timed out\n");
    797  1.3.2.2  skrll 		return IXGBE_ERR_PHY;
    798  1.3.2.2  skrll 	}
    799  1.3.2.2  skrll 
    800  1.3.2.2  skrll 	return IXGBE_SUCCESS;
    801  1.3.2.2  skrll }
    802  1.3.2.2  skrll 
    803  1.3.2.2  skrll /**
    804  1.3.2.2  skrll  *  ixgbe_write_iosf_sb_reg_x550 - Writes a value to specified register of the IOSF
    805  1.3.2.2  skrll  *  device
    806  1.3.2.2  skrll  *  @hw: pointer to hardware structure
    807  1.3.2.2  skrll  *  @reg_addr: 32 bit PHY register to write
    808  1.3.2.2  skrll  *  @device_type: 3 bit device type
    809  1.3.2.2  skrll  *  @data: Data to write to the register
    810  1.3.2.2  skrll  **/
    811  1.3.2.2  skrll s32 ixgbe_write_iosf_sb_reg_x550(struct ixgbe_hw *hw, u32 reg_addr,
    812  1.3.2.2  skrll 			    u32 device_type, u32 data)
    813  1.3.2.2  skrll {
    814  1.3.2.2  skrll 	u32 gssr = IXGBE_GSSR_PHY1_SM | IXGBE_GSSR_PHY0_SM;
    815  1.3.2.2  skrll 	u32 command, error __unused;
    816  1.3.2.2  skrll 	s32 ret;
    817  1.3.2.2  skrll 
    818  1.3.2.2  skrll 	ret = ixgbe_acquire_swfw_semaphore(hw, gssr);
    819  1.3.2.2  skrll 	if (ret != IXGBE_SUCCESS)
    820  1.3.2.2  skrll 		return ret;
    821  1.3.2.2  skrll 
    822  1.3.2.2  skrll 	ret = ixgbe_iosf_wait(hw, NULL);
    823  1.3.2.2  skrll 	if (ret != IXGBE_SUCCESS)
    824  1.3.2.2  skrll 		goto out;
    825  1.3.2.2  skrll 
    826  1.3.2.2  skrll 	command = ((reg_addr << IXGBE_SB_IOSF_CTRL_ADDR_SHIFT) |
    827  1.3.2.2  skrll 		   (device_type << IXGBE_SB_IOSF_CTRL_TARGET_SELECT_SHIFT));
    828  1.3.2.2  skrll 
    829  1.3.2.2  skrll 	/* Write IOSF control register */
    830  1.3.2.2  skrll 	IXGBE_WRITE_REG(hw, IXGBE_SB_IOSF_INDIRECT_CTRL, command);
    831  1.3.2.2  skrll 
    832  1.3.2.2  skrll 	/* Write IOSF data register */
    833  1.3.2.2  skrll 	IXGBE_WRITE_REG(hw, IXGBE_SB_IOSF_INDIRECT_DATA, data);
    834  1.3.2.2  skrll 
    835  1.3.2.2  skrll 	ret = ixgbe_iosf_wait(hw, &command);
    836  1.3.2.2  skrll 
    837  1.3.2.2  skrll 	if ((command & IXGBE_SB_IOSF_CTRL_RESP_STAT_MASK) != 0) {
    838  1.3.2.2  skrll 		error = (command & IXGBE_SB_IOSF_CTRL_CMPL_ERR_MASK) >>
    839  1.3.2.2  skrll 			 IXGBE_SB_IOSF_CTRL_CMPL_ERR_SHIFT;
    840  1.3.2.2  skrll 		ERROR_REPORT2(IXGBE_ERROR_POLLING,
    841  1.3.2.2  skrll 			      "Failed to write, error %x\n", error);
    842  1.3.2.2  skrll 		ret = IXGBE_ERR_PHY;
    843  1.3.2.2  skrll 	}
    844  1.3.2.2  skrll 
    845  1.3.2.2  skrll out:
    846  1.3.2.2  skrll 	ixgbe_release_swfw_semaphore(hw, gssr);
    847  1.3.2.2  skrll 	return ret;
    848  1.3.2.2  skrll }
    849  1.3.2.2  skrll 
    850  1.3.2.2  skrll /**
    851  1.3.2.2  skrll  *  ixgbe_read_iosf_sb_reg_x550 - Writes a value to specified register of the IOSF
    852  1.3.2.2  skrll  *  device
    853  1.3.2.2  skrll  *  @hw: pointer to hardware structure
    854  1.3.2.2  skrll  *  @reg_addr: 32 bit PHY register to write
    855  1.3.2.2  skrll  *  @device_type: 3 bit device type
    856  1.3.2.2  skrll  *  @phy_data: Pointer to read data from the register
    857  1.3.2.2  skrll  **/
    858  1.3.2.2  skrll s32 ixgbe_read_iosf_sb_reg_x550(struct ixgbe_hw *hw, u32 reg_addr,
    859  1.3.2.2  skrll 			   u32 device_type, u32 *data)
    860  1.3.2.2  skrll {
    861  1.3.2.2  skrll 	u32 gssr = IXGBE_GSSR_PHY1_SM | IXGBE_GSSR_PHY0_SM;
    862  1.3.2.2  skrll 	u32 command, error __unused;
    863  1.3.2.2  skrll 	s32 ret;
    864  1.3.2.2  skrll 
    865  1.3.2.2  skrll 	ret = ixgbe_acquire_swfw_semaphore(hw, gssr);
    866  1.3.2.2  skrll 	if (ret != IXGBE_SUCCESS)
    867  1.3.2.2  skrll 		return ret;
    868  1.3.2.2  skrll 
    869  1.3.2.2  skrll 	ret = ixgbe_iosf_wait(hw, NULL);
    870  1.3.2.2  skrll 	if (ret != IXGBE_SUCCESS)
    871  1.3.2.2  skrll 		goto out;
    872  1.3.2.2  skrll 
    873  1.3.2.2  skrll 	command = ((reg_addr << IXGBE_SB_IOSF_CTRL_ADDR_SHIFT) |
    874  1.3.2.2  skrll 		   (device_type << IXGBE_SB_IOSF_CTRL_TARGET_SELECT_SHIFT));
    875  1.3.2.2  skrll 
    876  1.3.2.2  skrll 	/* Write IOSF control register */
    877  1.3.2.2  skrll 	IXGBE_WRITE_REG(hw, IXGBE_SB_IOSF_INDIRECT_CTRL, command);
    878  1.3.2.2  skrll 
    879  1.3.2.2  skrll 	ret = ixgbe_iosf_wait(hw, &command);
    880  1.3.2.2  skrll 
    881  1.3.2.2  skrll 	if ((command & IXGBE_SB_IOSF_CTRL_RESP_STAT_MASK) != 0) {
    882  1.3.2.2  skrll 		error = (command & IXGBE_SB_IOSF_CTRL_CMPL_ERR_MASK) >>
    883  1.3.2.2  skrll 			 IXGBE_SB_IOSF_CTRL_CMPL_ERR_SHIFT;
    884  1.3.2.2  skrll 		ERROR_REPORT2(IXGBE_ERROR_POLLING,
    885  1.3.2.2  skrll 				"Failed to read, error %x\n", error);
    886  1.3.2.2  skrll 		ret = IXGBE_ERR_PHY;
    887  1.3.2.2  skrll 	}
    888  1.3.2.2  skrll 
    889  1.3.2.2  skrll 	if (ret == IXGBE_SUCCESS)
    890  1.3.2.2  skrll 		*data = IXGBE_READ_REG(hw, IXGBE_SB_IOSF_INDIRECT_DATA);
    891  1.3.2.2  skrll 
    892  1.3.2.2  skrll out:
    893  1.3.2.2  skrll 	ixgbe_release_swfw_semaphore(hw, gssr);
    894  1.3.2.2  skrll 	return ret;
    895  1.3.2.2  skrll }
    896  1.3.2.2  skrll 
    897  1.3.2.2  skrll /**
    898  1.3.2.2  skrll  *  ixgbe_disable_mdd_X550
    899  1.3.2.2  skrll  *  @hw: pointer to hardware structure
    900  1.3.2.2  skrll  *
    901  1.3.2.2  skrll  *  Disable malicious driver detection
    902  1.3.2.2  skrll  **/
    903  1.3.2.2  skrll void ixgbe_disable_mdd_X550(struct ixgbe_hw *hw)
    904  1.3.2.2  skrll {
    905  1.3.2.2  skrll 	u32 reg;
    906  1.3.2.2  skrll 
    907  1.3.2.2  skrll 	DEBUGFUNC("ixgbe_disable_mdd_X550");
    908  1.3.2.2  skrll 
    909  1.3.2.2  skrll 	/* Disable MDD for TX DMA and interrupt */
    910  1.3.2.2  skrll 	reg = IXGBE_READ_REG(hw, IXGBE_DMATXCTL);
    911  1.3.2.2  skrll 	reg &= ~(IXGBE_DMATXCTL_MDP_EN | IXGBE_DMATXCTL_MBINTEN);
    912  1.3.2.2  skrll 	IXGBE_WRITE_REG(hw, IXGBE_DMATXCTL, reg);
    913  1.3.2.2  skrll 
    914  1.3.2.2  skrll 	/* Disable MDD for RX and interrupt */
    915  1.3.2.2  skrll 	reg = IXGBE_READ_REG(hw, IXGBE_RDRXCTL);
    916  1.3.2.2  skrll 	reg &= ~(IXGBE_RDRXCTL_MDP_EN | IXGBE_RDRXCTL_MBINTEN);
    917  1.3.2.2  skrll 	IXGBE_WRITE_REG(hw, IXGBE_RDRXCTL, reg);
    918  1.3.2.2  skrll }
    919  1.3.2.2  skrll 
    920  1.3.2.2  skrll /**
    921  1.3.2.2  skrll  *  ixgbe_enable_mdd_X550
    922  1.3.2.2  skrll  *  @hw: pointer to hardware structure
    923  1.3.2.2  skrll  *
    924  1.3.2.2  skrll  *  Enable malicious driver detection
    925  1.3.2.2  skrll  **/
    926  1.3.2.2  skrll void ixgbe_enable_mdd_X550(struct ixgbe_hw *hw)
    927  1.3.2.2  skrll {
    928  1.3.2.2  skrll 	u32 reg;
    929  1.3.2.2  skrll 
    930  1.3.2.2  skrll 	DEBUGFUNC("ixgbe_enable_mdd_X550");
    931  1.3.2.2  skrll 
    932  1.3.2.2  skrll 	/* Enable MDD for TX DMA and interrupt */
    933  1.3.2.2  skrll 	reg = IXGBE_READ_REG(hw, IXGBE_DMATXCTL);
    934  1.3.2.2  skrll 	reg |= (IXGBE_DMATXCTL_MDP_EN | IXGBE_DMATXCTL_MBINTEN);
    935  1.3.2.2  skrll 	IXGBE_WRITE_REG(hw, IXGBE_DMATXCTL, reg);
    936  1.3.2.2  skrll 
    937  1.3.2.2  skrll 	/* Enable MDD for RX and interrupt */
    938  1.3.2.2  skrll 	reg = IXGBE_READ_REG(hw, IXGBE_RDRXCTL);
    939  1.3.2.2  skrll 	reg |= (IXGBE_RDRXCTL_MDP_EN | IXGBE_RDRXCTL_MBINTEN);
    940  1.3.2.2  skrll 	IXGBE_WRITE_REG(hw, IXGBE_RDRXCTL, reg);
    941  1.3.2.2  skrll }
    942  1.3.2.2  skrll 
    943  1.3.2.2  skrll /**
    944  1.3.2.2  skrll  *  ixgbe_restore_mdd_vf_X550
    945  1.3.2.2  skrll  *  @hw: pointer to hardware structure
    946  1.3.2.2  skrll  *  @vf: vf index
    947  1.3.2.2  skrll  *
    948  1.3.2.2  skrll  *  Restore VF that was disabled during malicious driver detection event
    949  1.3.2.2  skrll  **/
    950  1.3.2.2  skrll void ixgbe_restore_mdd_vf_X550(struct ixgbe_hw *hw, u32 vf)
    951  1.3.2.2  skrll {
    952  1.3.2.2  skrll 	u32 idx, reg, num_qs, start_q, bitmask;
    953  1.3.2.2  skrll 
    954  1.3.2.2  skrll 	DEBUGFUNC("ixgbe_restore_mdd_vf_X550");
    955  1.3.2.2  skrll 
    956  1.3.2.2  skrll 	/* Map VF to queues */
    957  1.3.2.2  skrll 	reg = IXGBE_READ_REG(hw, IXGBE_MRQC);
    958  1.3.2.2  skrll 	switch (reg & IXGBE_MRQC_MRQE_MASK) {
    959  1.3.2.2  skrll 	case IXGBE_MRQC_VMDQRT8TCEN:
    960  1.3.2.2  skrll 		num_qs = 8;  /* 16 VFs / pools */
    961  1.3.2.2  skrll 		bitmask = 0x000000FF;
    962  1.3.2.2  skrll 		break;
    963  1.3.2.2  skrll 	case IXGBE_MRQC_VMDQRSS32EN:
    964  1.3.2.2  skrll 	case IXGBE_MRQC_VMDQRT4TCEN:
    965  1.3.2.2  skrll 		num_qs = 4;  /* 32 VFs / pools */
    966  1.3.2.2  skrll 		bitmask = 0x0000000F;
    967  1.3.2.2  skrll 		break;
    968  1.3.2.3  skrll 	default:	    /* 64 VFs / pools */
    969  1.3.2.2  skrll 		num_qs = 2;
    970  1.3.2.2  skrll 		bitmask = 0x00000003;
    971  1.3.2.2  skrll 		break;
    972  1.3.2.2  skrll 	}
    973  1.3.2.2  skrll 	start_q = vf * num_qs;
    974  1.3.2.2  skrll 
    975  1.3.2.2  skrll 	/* Release vf's queues by clearing WQBR_TX and WQBR_RX (RW1C) */
    976  1.3.2.2  skrll 	idx = start_q / 32;
    977  1.3.2.2  skrll 	reg = 0;
    978  1.3.2.2  skrll 	reg |= (bitmask << (start_q % 32));
    979  1.3.2.2  skrll 	IXGBE_WRITE_REG(hw, IXGBE_WQBR_TX(idx), reg);
    980  1.3.2.2  skrll 	IXGBE_WRITE_REG(hw, IXGBE_WQBR_RX(idx), reg);
    981  1.3.2.2  skrll }
    982  1.3.2.2  skrll 
    983  1.3.2.2  skrll /**
    984  1.3.2.2  skrll  *  ixgbe_mdd_event_X550
    985  1.3.2.2  skrll  *  @hw: pointer to hardware structure
    986  1.3.2.2  skrll  *  @vf_bitmap: vf bitmap of malicious vfs
    987  1.3.2.2  skrll  *
    988  1.3.2.2  skrll  *  Handle malicious driver detection event.
    989  1.3.2.2  skrll  **/
    990  1.3.2.2  skrll void ixgbe_mdd_event_X550(struct ixgbe_hw *hw, u32 *vf_bitmap)
    991  1.3.2.2  skrll {
    992  1.3.2.2  skrll 	u32 wqbr;
    993  1.3.2.2  skrll 	u32 i, j, reg, q, shift, vf, idx;
    994  1.3.2.2  skrll 
    995  1.3.2.2  skrll 	DEBUGFUNC("ixgbe_mdd_event_X550");
    996  1.3.2.2  skrll 
    997  1.3.2.2  skrll 	/* figure out pool size for mapping to vf's */
    998  1.3.2.2  skrll 	reg = IXGBE_READ_REG(hw, IXGBE_MRQC);
    999  1.3.2.2  skrll 	switch (reg & IXGBE_MRQC_MRQE_MASK) {
   1000  1.3.2.2  skrll 	case IXGBE_MRQC_VMDQRT8TCEN:
   1001  1.3.2.2  skrll 		shift = 3;  /* 16 VFs / pools */
   1002  1.3.2.2  skrll 		break;
   1003  1.3.2.2  skrll 	case IXGBE_MRQC_VMDQRSS32EN:
   1004  1.3.2.2  skrll 	case IXGBE_MRQC_VMDQRT4TCEN:
   1005  1.3.2.2  skrll 		shift = 2;  /* 32 VFs / pools */
   1006  1.3.2.2  skrll 		break;
   1007  1.3.2.2  skrll 	default:
   1008  1.3.2.2  skrll 		shift = 1;  /* 64 VFs / pools */
   1009  1.3.2.2  skrll 		break;
   1010  1.3.2.2  skrll 	}
   1011  1.3.2.2  skrll 
   1012  1.3.2.2  skrll 	/* Read WQBR_TX and WQBR_RX and check for malicious queues */
   1013  1.3.2.2  skrll 	for (i = 0; i < 4; i++) {
   1014  1.3.2.2  skrll 		wqbr = IXGBE_READ_REG(hw, IXGBE_WQBR_TX(i));
   1015  1.3.2.2  skrll 		wqbr |= IXGBE_READ_REG(hw, IXGBE_WQBR_RX(i));
   1016  1.3.2.2  skrll 
   1017  1.3.2.2  skrll 		if (!wqbr)
   1018  1.3.2.2  skrll 			continue;
   1019  1.3.2.2  skrll 
   1020  1.3.2.2  skrll 		/* Get malicious queue */
   1021  1.3.2.2  skrll 		for (j = 0; j < 32 && wqbr; j++) {
   1022  1.3.2.2  skrll 
   1023  1.3.2.2  skrll 			if (!(wqbr & (1 << j)))
   1024  1.3.2.2  skrll 				continue;
   1025  1.3.2.2  skrll 
   1026  1.3.2.2  skrll 			/* Get queue from bitmask */
   1027  1.3.2.2  skrll 			q = j + (i * 32);
   1028  1.3.2.2  skrll 
   1029  1.3.2.2  skrll 			/* Map queue to vf */
   1030  1.3.2.2  skrll 			vf = (q >> shift);
   1031  1.3.2.2  skrll 
   1032  1.3.2.2  skrll 			/* Set vf bit in vf_bitmap */
   1033  1.3.2.2  skrll 			idx = vf / 32;
   1034  1.3.2.2  skrll 			vf_bitmap[idx] |= (1 << (vf % 32));
   1035  1.3.2.2  skrll 			wqbr &= ~(1 << j);
   1036  1.3.2.2  skrll 		}
   1037  1.3.2.2  skrll 	}
   1038  1.3.2.2  skrll }
   1039  1.3.2.2  skrll 
   1040  1.3.2.2  skrll /**
   1041  1.3.2.2  skrll  *  ixgbe_get_media_type_X550em - Get media type
   1042  1.3.2.2  skrll  *  @hw: pointer to hardware structure
   1043  1.3.2.2  skrll  *
   1044  1.3.2.2  skrll  *  Returns the media type (fiber, copper, backplane)
   1045  1.3.2.2  skrll  */
   1046  1.3.2.2  skrll enum ixgbe_media_type ixgbe_get_media_type_X550em(struct ixgbe_hw *hw)
   1047  1.3.2.2  skrll {
   1048  1.3.2.2  skrll 	enum ixgbe_media_type media_type;
   1049  1.3.2.2  skrll 
   1050  1.3.2.2  skrll 	DEBUGFUNC("ixgbe_get_media_type_X550em");
   1051  1.3.2.2  skrll 
   1052  1.3.2.2  skrll 	/* Detect if there is a copper PHY attached. */
   1053  1.3.2.2  skrll 	switch (hw->device_id) {
   1054  1.3.2.2  skrll 	case IXGBE_DEV_ID_X550EM_X_KR:
   1055  1.3.2.2  skrll 	case IXGBE_DEV_ID_X550EM_X_KX4:
   1056  1.3.2.2  skrll 		media_type = ixgbe_media_type_backplane;
   1057  1.3.2.2  skrll 		break;
   1058  1.3.2.2  skrll 	case IXGBE_DEV_ID_X550EM_X_SFP:
   1059  1.3.2.2  skrll 		media_type = ixgbe_media_type_fiber;
   1060  1.3.2.2  skrll 		break;
   1061  1.3.2.2  skrll 	case IXGBE_DEV_ID_X550EM_X_1G_T:
   1062  1.3.2.2  skrll 	case IXGBE_DEV_ID_X550EM_X_10G_T:
   1063  1.3.2.2  skrll 		media_type = ixgbe_media_type_copper;
   1064  1.3.2.2  skrll 		break;
   1065  1.3.2.2  skrll 	default:
   1066  1.3.2.2  skrll 		media_type = ixgbe_media_type_unknown;
   1067  1.3.2.2  skrll 		break;
   1068  1.3.2.2  skrll 	}
   1069  1.3.2.2  skrll 	return media_type;
   1070  1.3.2.2  skrll }
   1071  1.3.2.2  skrll 
   1072  1.3.2.2  skrll /**
   1073  1.3.2.2  skrll  *  ixgbe_supported_sfp_modules_X550em - Check if SFP module type is supported
   1074  1.3.2.2  skrll  *  @hw: pointer to hardware structure
   1075  1.3.2.2  skrll  *  @linear: TRUE if SFP module is linear
   1076  1.3.2.2  skrll  */
   1077  1.3.2.2  skrll static s32 ixgbe_supported_sfp_modules_X550em(struct ixgbe_hw *hw, bool *linear)
   1078  1.3.2.2  skrll {
   1079  1.3.2.2  skrll 	DEBUGFUNC("ixgbe_supported_sfp_modules_X550em");
   1080  1.3.2.2  skrll 
   1081  1.3.2.2  skrll 	switch (hw->phy.sfp_type) {
   1082  1.3.2.2  skrll 	case ixgbe_sfp_type_not_present:
   1083  1.3.2.2  skrll 		return IXGBE_ERR_SFP_NOT_PRESENT;
   1084  1.3.2.2  skrll 	case ixgbe_sfp_type_da_cu_core0:
   1085  1.3.2.2  skrll 	case ixgbe_sfp_type_da_cu_core1:
   1086  1.3.2.2  skrll 		*linear = TRUE;
   1087  1.3.2.2  skrll 		break;
   1088  1.3.2.2  skrll 	case ixgbe_sfp_type_srlr_core0:
   1089  1.3.2.2  skrll 	case ixgbe_sfp_type_srlr_core1:
   1090  1.3.2.2  skrll 	case ixgbe_sfp_type_da_act_lmt_core0:
   1091  1.3.2.2  skrll 	case ixgbe_sfp_type_da_act_lmt_core1:
   1092  1.3.2.2  skrll 	case ixgbe_sfp_type_1g_sx_core0:
   1093  1.3.2.2  skrll 	case ixgbe_sfp_type_1g_sx_core1:
   1094  1.3.2.2  skrll 	case ixgbe_sfp_type_1g_lx_core0:
   1095  1.3.2.2  skrll 	case ixgbe_sfp_type_1g_lx_core1:
   1096  1.3.2.2  skrll 		*linear = FALSE;
   1097  1.3.2.2  skrll 		break;
   1098  1.3.2.2  skrll 	case ixgbe_sfp_type_unknown:
   1099  1.3.2.2  skrll 	case ixgbe_sfp_type_1g_cu_core0:
   1100  1.3.2.2  skrll 	case ixgbe_sfp_type_1g_cu_core1:
   1101  1.3.2.2  skrll 	default:
   1102  1.3.2.2  skrll 		return IXGBE_ERR_SFP_NOT_SUPPORTED;
   1103  1.3.2.2  skrll 	}
   1104  1.3.2.2  skrll 
   1105  1.3.2.2  skrll 	return IXGBE_SUCCESS;
   1106  1.3.2.2  skrll }
   1107  1.3.2.2  skrll 
   1108  1.3.2.2  skrll /**
   1109  1.3.2.2  skrll  *  ixgbe_identify_sfp_module_X550em - Identifies SFP modules
   1110  1.3.2.2  skrll  *  @hw: pointer to hardware structure
   1111  1.3.2.2  skrll  *
   1112  1.3.2.2  skrll  *  Searches for and identifies the SFP module and assigns appropriate PHY type.
   1113  1.3.2.2  skrll  **/
   1114  1.3.2.2  skrll s32 ixgbe_identify_sfp_module_X550em(struct ixgbe_hw *hw)
   1115  1.3.2.2  skrll {
   1116  1.3.2.2  skrll 	s32 status;
   1117  1.3.2.2  skrll 	bool linear;
   1118  1.3.2.2  skrll 
   1119  1.3.2.2  skrll 	DEBUGFUNC("ixgbe_identify_sfp_module_X550em");
   1120  1.3.2.2  skrll 
   1121  1.3.2.2  skrll 	status = ixgbe_identify_module_generic(hw);
   1122  1.3.2.2  skrll 
   1123  1.3.2.2  skrll 	if (status != IXGBE_SUCCESS)
   1124  1.3.2.2  skrll 		return status;
   1125  1.3.2.2  skrll 
   1126  1.3.2.2  skrll 	/* Check if SFP module is supported */
   1127  1.3.2.2  skrll 	status = ixgbe_supported_sfp_modules_X550em(hw, &linear);
   1128  1.3.2.2  skrll 
   1129  1.3.2.2  skrll 	return status;
   1130  1.3.2.2  skrll }
   1131  1.3.2.2  skrll 
   1132  1.3.2.2  skrll /**
   1133  1.3.2.2  skrll  *  ixgbe_setup_sfp_modules_X550em - Setup MAC link ops
   1134  1.3.2.2  skrll  *  @hw: pointer to hardware structure
   1135  1.3.2.2  skrll  */
   1136  1.3.2.2  skrll s32 ixgbe_setup_sfp_modules_X550em(struct ixgbe_hw *hw)
   1137  1.3.2.2  skrll {
   1138  1.3.2.2  skrll 	s32 status;
   1139  1.3.2.2  skrll 	bool linear;
   1140  1.3.2.2  skrll 
   1141  1.3.2.2  skrll 	DEBUGFUNC("ixgbe_setup_sfp_modules_X550em");
   1142  1.3.2.2  skrll 
   1143  1.3.2.2  skrll 	/* Check if SFP module is supported */
   1144  1.3.2.2  skrll 	status = ixgbe_supported_sfp_modules_X550em(hw, &linear);
   1145  1.3.2.2  skrll 
   1146  1.3.2.2  skrll 	if (status != IXGBE_SUCCESS)
   1147  1.3.2.2  skrll 		return status;
   1148  1.3.2.2  skrll 
   1149  1.3.2.2  skrll 	ixgbe_init_mac_link_ops_X550em(hw);
   1150  1.3.2.2  skrll 	hw->phy.ops.reset = NULL;
   1151  1.3.2.2  skrll 
   1152  1.3.2.2  skrll 	return IXGBE_SUCCESS;
   1153  1.3.2.2  skrll }
   1154  1.3.2.2  skrll 
   1155  1.3.2.2  skrll /**
   1156  1.3.2.2  skrll  *  ixgbe_init_mac_link_ops_X550em - init mac link function pointers
   1157  1.3.2.2  skrll  *  @hw: pointer to hardware structure
   1158  1.3.2.2  skrll  */
   1159  1.3.2.2  skrll void ixgbe_init_mac_link_ops_X550em(struct ixgbe_hw *hw)
   1160  1.3.2.2  skrll {
   1161  1.3.2.2  skrll 	struct ixgbe_mac_info *mac = &hw->mac;
   1162  1.3.2.2  skrll 
   1163  1.3.2.2  skrll 	DEBUGFUNC("ixgbe_init_mac_link_ops_X550em");
   1164  1.3.2.2  skrll 
   1165  1.3.2.2  skrll 	 switch (hw->mac.ops.get_media_type(hw)) {
   1166  1.3.2.2  skrll 	 case ixgbe_media_type_fiber:
   1167  1.3.2.2  skrll 		/* CS4227 does not support autoneg, so disable the laser control
   1168  1.3.2.2  skrll 		 * functions for SFP+ fiber
   1169  1.3.2.2  skrll 		 */
   1170  1.3.2.2  skrll 		mac->ops.disable_tx_laser = NULL;
   1171  1.3.2.2  skrll 		mac->ops.enable_tx_laser = NULL;
   1172  1.3.2.2  skrll 		mac->ops.flap_tx_laser = NULL;
   1173  1.3.2.2  skrll 		mac->ops.setup_link = ixgbe_setup_mac_link_multispeed_fiber;
   1174  1.3.2.2  skrll 		mac->ops.setup_mac_link = ixgbe_setup_mac_link_sfp_x550em;
   1175  1.3.2.2  skrll 		mac->ops.set_rate_select_speed =
   1176  1.3.2.2  skrll 					ixgbe_set_soft_rate_select_speed;
   1177  1.3.2.2  skrll 		break;
   1178  1.3.2.2  skrll 	case ixgbe_media_type_copper:
   1179  1.3.2.2  skrll 		mac->ops.setup_link = ixgbe_setup_mac_link_t_X550em;
   1180  1.3.2.2  skrll 		mac->ops.check_link = ixgbe_check_link_t_X550em;
   1181  1.3.2.2  skrll 		break;
   1182  1.3.2.2  skrll 	default:
   1183  1.3.2.2  skrll 		break;
   1184  1.3.2.2  skrll 	 }
   1185  1.3.2.2  skrll }
   1186  1.3.2.2  skrll 
   1187  1.3.2.2  skrll /**
   1188  1.3.2.2  skrll  *  ixgbe_get_link_capabilities_x550em - Determines link capabilities
   1189  1.3.2.2  skrll  *  @hw: pointer to hardware structure
   1190  1.3.2.2  skrll  *  @speed: pointer to link speed
   1191  1.3.2.2  skrll  *  @autoneg: TRUE when autoneg or autotry is enabled
   1192  1.3.2.2  skrll  */
   1193  1.3.2.2  skrll s32 ixgbe_get_link_capabilities_X550em(struct ixgbe_hw *hw,
   1194  1.3.2.2  skrll 				       ixgbe_link_speed *speed,
   1195  1.3.2.2  skrll 				       bool *autoneg)
   1196  1.3.2.2  skrll {
   1197  1.3.2.2  skrll 	DEBUGFUNC("ixgbe_get_link_capabilities_X550em");
   1198  1.3.2.2  skrll 
   1199  1.3.2.2  skrll 	/* SFP */
   1200  1.3.2.2  skrll 	if (hw->phy.media_type == ixgbe_media_type_fiber) {
   1201  1.3.2.2  skrll 
   1202  1.3.2.2  skrll 		/* CS4227 SFP must not enable auto-negotiation */
   1203  1.3.2.2  skrll 		*autoneg = FALSE;
   1204  1.3.2.2  skrll 
   1205  1.3.2.2  skrll 		/* Check if 1G SFP module. */
   1206  1.3.2.2  skrll 		if (hw->phy.sfp_type == ixgbe_sfp_type_1g_sx_core0 ||
   1207  1.3.2.2  skrll 		    hw->phy.sfp_type == ixgbe_sfp_type_1g_sx_core1
   1208  1.3.2.2  skrll 		    || hw->phy.sfp_type == ixgbe_sfp_type_1g_lx_core0 ||
   1209  1.3.2.2  skrll 		    hw->phy.sfp_type == ixgbe_sfp_type_1g_lx_core1) {
   1210  1.3.2.2  skrll 			*speed = IXGBE_LINK_SPEED_1GB_FULL;
   1211  1.3.2.2  skrll 			return IXGBE_SUCCESS;
   1212  1.3.2.2  skrll 		}
   1213  1.3.2.2  skrll 
   1214  1.3.2.2  skrll 		/* Link capabilities are based on SFP */
   1215  1.3.2.2  skrll 		if (hw->phy.multispeed_fiber)
   1216  1.3.2.2  skrll 			*speed = IXGBE_LINK_SPEED_10GB_FULL |
   1217  1.3.2.2  skrll 				 IXGBE_LINK_SPEED_1GB_FULL;
   1218  1.3.2.2  skrll 		else
   1219  1.3.2.2  skrll 			*speed = IXGBE_LINK_SPEED_10GB_FULL;
   1220  1.3.2.2  skrll 	} else {
   1221  1.3.2.2  skrll 		*speed = IXGBE_LINK_SPEED_10GB_FULL |
   1222  1.3.2.2  skrll 			 IXGBE_LINK_SPEED_1GB_FULL;
   1223  1.3.2.2  skrll 		*autoneg = TRUE;
   1224  1.3.2.2  skrll 	}
   1225  1.3.2.2  skrll 
   1226  1.3.2.2  skrll 	return IXGBE_SUCCESS;
   1227  1.3.2.2  skrll }
   1228  1.3.2.2  skrll 
   1229  1.3.2.2  skrll /**
   1230  1.3.2.2  skrll  * ixgbe_get_lasi_ext_t_x550em - Determime external Base T PHY interrupt cause
   1231  1.3.2.2  skrll  * @hw: pointer to hardware structure
   1232  1.3.2.2  skrll  * @lsc: pointer to boolean flag which indicates whether external Base T
   1233  1.3.2.2  skrll  *       PHY interrupt is lsc
   1234  1.3.2.2  skrll  *
   1235  1.3.2.2  skrll  * Determime if external Base T PHY interrupt cause is high temperature
   1236  1.3.2.2  skrll  * failure alarm or link status change.
   1237  1.3.2.2  skrll  *
   1238  1.3.2.2  skrll  * Return IXGBE_ERR_OVERTEMP if interrupt is high temperature
   1239  1.3.2.2  skrll  * failure alarm, else return PHY access status.
   1240  1.3.2.2  skrll  */
   1241  1.3.2.2  skrll static s32 ixgbe_get_lasi_ext_t_x550em(struct ixgbe_hw *hw, bool *lsc)
   1242  1.3.2.2  skrll {
   1243  1.3.2.2  skrll 	u32 status;
   1244  1.3.2.2  skrll 	u16 reg;
   1245  1.3.2.2  skrll 
   1246  1.3.2.2  skrll 	*lsc = FALSE;
   1247  1.3.2.2  skrll 
   1248  1.3.2.2  skrll 	/* Vendor alarm triggered */
   1249  1.3.2.2  skrll 	status = hw->phy.ops.read_reg(hw, IXGBE_MDIO_GLOBAL_CHIP_STD_INT_FLAG,
   1250  1.3.2.2  skrll 				      IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE,
   1251  1.3.2.2  skrll 				      &reg);
   1252  1.3.2.2  skrll 
   1253  1.3.2.2  skrll 	if (status != IXGBE_SUCCESS ||
   1254  1.3.2.2  skrll 	    !(reg & IXGBE_MDIO_GLOBAL_VEN_ALM_INT_EN))
   1255  1.3.2.2  skrll 		return status;
   1256  1.3.2.2  skrll 
   1257  1.3.2.2  skrll 	/* Vendor Auto-Neg alarm triggered or Global alarm 1 triggered */
   1258  1.3.2.2  skrll 	status = hw->phy.ops.read_reg(hw, IXGBE_MDIO_GLOBAL_INT_CHIP_VEN_FLAG,
   1259  1.3.2.2  skrll 				      IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE,
   1260  1.3.2.2  skrll 				      &reg);
   1261  1.3.2.2  skrll 
   1262  1.3.2.2  skrll 	if (status != IXGBE_SUCCESS ||
   1263  1.3.2.2  skrll 	    !(reg & (IXGBE_MDIO_GLOBAL_AN_VEN_ALM_INT_EN |
   1264  1.3.2.2  skrll 	    IXGBE_MDIO_GLOBAL_ALARM_1_INT)))
   1265  1.3.2.2  skrll 		return status;
   1266  1.3.2.2  skrll 
   1267  1.3.2.3  skrll 	/* Global alarm triggered */
   1268  1.3.2.2  skrll 	status = hw->phy.ops.read_reg(hw, IXGBE_MDIO_GLOBAL_ALARM_1,
   1269  1.3.2.2  skrll 				      IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE,
   1270  1.3.2.2  skrll 				      &reg);
   1271  1.3.2.2  skrll 
   1272  1.3.2.2  skrll 	if (status != IXGBE_SUCCESS)
   1273  1.3.2.2  skrll 		return status;
   1274  1.3.2.2  skrll 
   1275  1.3.2.2  skrll 	/* If high temperature failure, then return over temp error and exit */
   1276  1.3.2.2  skrll 	if (reg & IXGBE_MDIO_GLOBAL_ALM_1_HI_TMP_FAIL) {
   1277  1.3.2.2  skrll 		/* power down the PHY in case the PHY FW didn't already */
   1278  1.3.2.2  skrll 		ixgbe_set_copper_phy_power(hw, FALSE);
   1279  1.3.2.2  skrll 		return IXGBE_ERR_OVERTEMP;
   1280  1.3.2.3  skrll 	} else if (reg & IXGBE_MDIO_GLOBAL_ALM_1_DEV_FAULT) {
   1281  1.3.2.3  skrll 		/*  device fault alarm triggered */
   1282  1.3.2.3  skrll 		status = hw->phy.ops.read_reg(hw, IXGBE_MDIO_GLOBAL_FAULT_MSG,
   1283  1.3.2.3  skrll 					  IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE,
   1284  1.3.2.3  skrll 					  &reg);
   1285  1.3.2.3  skrll 
   1286  1.3.2.3  skrll 		if (status != IXGBE_SUCCESS)
   1287  1.3.2.3  skrll 			return status;
   1288  1.3.2.3  skrll 
   1289  1.3.2.3  skrll 		/* if device fault was due to high temp alarm handle and exit */
   1290  1.3.2.3  skrll 		if (reg == IXGBE_MDIO_GLOBAL_FAULT_MSG_HI_TMP) {
   1291  1.3.2.3  skrll 			/* power down the PHY in case the PHY FW didn't */
   1292  1.3.2.3  skrll 			ixgbe_set_copper_phy_power(hw, FALSE);
   1293  1.3.2.3  skrll 			return IXGBE_ERR_OVERTEMP;
   1294  1.3.2.3  skrll 		}
   1295  1.3.2.2  skrll 	}
   1296  1.3.2.2  skrll 
   1297  1.3.2.2  skrll 	/* Vendor alarm 2 triggered */
   1298  1.3.2.2  skrll 	status = hw->phy.ops.read_reg(hw, IXGBE_MDIO_GLOBAL_CHIP_STD_INT_FLAG,
   1299  1.3.2.2  skrll 				      IXGBE_MDIO_AUTO_NEG_DEV_TYPE, &reg);
   1300  1.3.2.2  skrll 
   1301  1.3.2.2  skrll 	if (status != IXGBE_SUCCESS ||
   1302  1.3.2.2  skrll 	    !(reg & IXGBE_MDIO_GLOBAL_STD_ALM2_INT))
   1303  1.3.2.2  skrll 		return status;
   1304  1.3.2.2  skrll 
   1305  1.3.2.2  skrll 	/* link connect/disconnect event occurred */
   1306  1.3.2.2  skrll 	status = hw->phy.ops.read_reg(hw, IXGBE_MDIO_AUTO_NEG_VENDOR_TX_ALARM2,
   1307  1.3.2.2  skrll 				      IXGBE_MDIO_AUTO_NEG_DEV_TYPE, &reg);
   1308  1.3.2.2  skrll 
   1309  1.3.2.2  skrll 	if (status != IXGBE_SUCCESS)
   1310  1.3.2.2  skrll 		return status;
   1311  1.3.2.2  skrll 
   1312  1.3.2.2  skrll 	/* Indicate LSC */
   1313  1.3.2.2  skrll 	if (reg & IXGBE_MDIO_AUTO_NEG_VEN_LSC)
   1314  1.3.2.2  skrll 		*lsc = TRUE;
   1315  1.3.2.2  skrll 
   1316  1.3.2.2  skrll 	return IXGBE_SUCCESS;
   1317  1.3.2.2  skrll }
   1318  1.3.2.2  skrll 
   1319  1.3.2.2  skrll /**
   1320  1.3.2.2  skrll  * ixgbe_enable_lasi_ext_t_x550em - Enable external Base T PHY interrupts
   1321  1.3.2.2  skrll  * @hw: pointer to hardware structure
   1322  1.3.2.2  skrll  *
   1323  1.3.2.2  skrll  * Enable link status change and temperature failure alarm for the external
   1324  1.3.2.2  skrll  * Base T PHY
   1325  1.3.2.2  skrll  *
   1326  1.3.2.2  skrll  * Returns PHY access status
   1327  1.3.2.2  skrll  */
   1328  1.3.2.2  skrll static s32 ixgbe_enable_lasi_ext_t_x550em(struct ixgbe_hw *hw)
   1329  1.3.2.2  skrll {
   1330  1.3.2.2  skrll 	u32 status;
   1331  1.3.2.2  skrll 	u16 reg;
   1332  1.3.2.2  skrll 	bool lsc;
   1333  1.3.2.2  skrll 
   1334  1.3.2.2  skrll 	/* Clear interrupt flags */
   1335  1.3.2.2  skrll 	status = ixgbe_get_lasi_ext_t_x550em(hw, &lsc);
   1336  1.3.2.2  skrll 
   1337  1.3.2.2  skrll 	/* Enable link status change alarm */
   1338  1.3.2.2  skrll 	status = hw->phy.ops.read_reg(hw, IXGBE_MDIO_PMA_TX_VEN_LASI_INT_MASK,
   1339  1.3.2.2  skrll 				      IXGBE_MDIO_AUTO_NEG_DEV_TYPE, &reg);
   1340  1.3.2.2  skrll 
   1341  1.3.2.2  skrll 	if (status != IXGBE_SUCCESS)
   1342  1.3.2.2  skrll 		return status;
   1343  1.3.2.2  skrll 
   1344  1.3.2.2  skrll 	reg |= IXGBE_MDIO_PMA_TX_VEN_LASI_INT_EN;
   1345  1.3.2.2  skrll 
   1346  1.3.2.2  skrll 	status = hw->phy.ops.write_reg(hw, IXGBE_MDIO_PMA_TX_VEN_LASI_INT_MASK,
   1347  1.3.2.2  skrll 				       IXGBE_MDIO_AUTO_NEG_DEV_TYPE, reg);
   1348  1.3.2.2  skrll 
   1349  1.3.2.2  skrll 	if (status != IXGBE_SUCCESS)
   1350  1.3.2.2  skrll 		return status;
   1351  1.3.2.2  skrll 
   1352  1.3.2.2  skrll 	/* Enables high temperature failure alarm */
   1353  1.3.2.2  skrll 	status = hw->phy.ops.read_reg(hw, IXGBE_MDIO_GLOBAL_INT_MASK,
   1354  1.3.2.2  skrll 				      IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE,
   1355  1.3.2.2  skrll 				      &reg);
   1356  1.3.2.2  skrll 
   1357  1.3.2.2  skrll 	if (status != IXGBE_SUCCESS)
   1358  1.3.2.2  skrll 		return status;
   1359  1.3.2.2  skrll 
   1360  1.3.2.2  skrll 	reg |= IXGBE_MDIO_GLOBAL_INT_HI_TEMP_EN;
   1361  1.3.2.2  skrll 
   1362  1.3.2.2  skrll 	status = hw->phy.ops.write_reg(hw, IXGBE_MDIO_GLOBAL_INT_MASK,
   1363  1.3.2.2  skrll 				       IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE,
   1364  1.3.2.2  skrll 				       reg);
   1365  1.3.2.2  skrll 
   1366  1.3.2.2  skrll 	if (status != IXGBE_SUCCESS)
   1367  1.3.2.2  skrll 		return status;
   1368  1.3.2.2  skrll 
   1369  1.3.2.2  skrll 	/* Enable vendor Auto-Neg alarm and Global Interrupt Mask 1 alarm */
   1370  1.3.2.2  skrll 	status = hw->phy.ops.read_reg(hw, IXGBE_MDIO_GLOBAL_INT_CHIP_VEN_MASK,
   1371  1.3.2.2  skrll 				      IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE,
   1372  1.3.2.2  skrll 				      &reg);
   1373  1.3.2.2  skrll 
   1374  1.3.2.2  skrll 	if (status != IXGBE_SUCCESS)
   1375  1.3.2.2  skrll 		return status;
   1376  1.3.2.2  skrll 
   1377  1.3.2.2  skrll 	reg |= (IXGBE_MDIO_GLOBAL_AN_VEN_ALM_INT_EN |
   1378  1.3.2.2  skrll 		IXGBE_MDIO_GLOBAL_ALARM_1_INT);
   1379  1.3.2.2  skrll 
   1380  1.3.2.2  skrll 	status = hw->phy.ops.write_reg(hw, IXGBE_MDIO_GLOBAL_INT_CHIP_VEN_MASK,
   1381  1.3.2.2  skrll 				       IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE,
   1382  1.3.2.2  skrll 				       reg);
   1383  1.3.2.2  skrll 
   1384  1.3.2.2  skrll 	if (status != IXGBE_SUCCESS)
   1385  1.3.2.2  skrll 		return status;
   1386  1.3.2.2  skrll 
   1387  1.3.2.2  skrll 	/* Enable chip-wide vendor alarm */
   1388  1.3.2.2  skrll 	status = hw->phy.ops.read_reg(hw, IXGBE_MDIO_GLOBAL_INT_CHIP_STD_MASK,
   1389  1.3.2.2  skrll 				      IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE,
   1390  1.3.2.2  skrll 				      &reg);
   1391  1.3.2.2  skrll 
   1392  1.3.2.2  skrll 	if (status != IXGBE_SUCCESS)
   1393  1.3.2.2  skrll 		return status;
   1394  1.3.2.2  skrll 
   1395  1.3.2.2  skrll 	reg |= IXGBE_MDIO_GLOBAL_VEN_ALM_INT_EN;
   1396  1.3.2.2  skrll 
   1397  1.3.2.2  skrll 	status = hw->phy.ops.write_reg(hw, IXGBE_MDIO_GLOBAL_INT_CHIP_STD_MASK,
   1398  1.3.2.2  skrll 				       IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE,
   1399  1.3.2.2  skrll 				       reg);
   1400  1.3.2.2  skrll 
   1401  1.3.2.2  skrll 	return status;
   1402  1.3.2.2  skrll }
   1403  1.3.2.2  skrll 
   1404  1.3.2.2  skrll /**
   1405  1.3.2.2  skrll  *  ixgbe_setup_kr_speed_x550em - Configure the KR PHY for link speed.
   1406  1.3.2.2  skrll  *  @hw: pointer to hardware structure
   1407  1.3.2.2  skrll  *  @speed: link speed
   1408  1.3.2.2  skrll  *
   1409  1.3.2.2  skrll  *  Configures the integrated KR PHY.
   1410  1.3.2.2  skrll  **/
   1411  1.3.2.2  skrll static s32 ixgbe_setup_kr_speed_x550em(struct ixgbe_hw *hw,
   1412  1.3.2.2  skrll 				       ixgbe_link_speed speed)
   1413  1.3.2.2  skrll {
   1414  1.3.2.2  skrll 	s32 status;
   1415  1.3.2.2  skrll 	u32 reg_val;
   1416  1.3.2.2  skrll 
   1417  1.3.2.2  skrll 	status = ixgbe_read_iosf_sb_reg_x550(hw,
   1418  1.3.2.2  skrll 		IXGBE_KRM_LINK_CTRL_1(hw->bus.lan_id),
   1419  1.3.2.2  skrll 		IXGBE_SB_IOSF_TARGET_KR_PHY, &reg_val);
   1420  1.3.2.2  skrll 	if (status)
   1421  1.3.2.2  skrll 		return status;
   1422  1.3.2.2  skrll 
   1423  1.3.2.2  skrll 	reg_val |= IXGBE_KRM_LINK_CTRL_1_TETH_AN_ENABLE;
   1424  1.3.2.2  skrll 	reg_val &= ~(IXGBE_KRM_LINK_CTRL_1_TETH_AN_CAP_KR |
   1425  1.3.2.2  skrll 		     IXGBE_KRM_LINK_CTRL_1_TETH_AN_CAP_KX);
   1426  1.3.2.2  skrll 
   1427  1.3.2.2  skrll 	/* Advertise 10G support. */
   1428  1.3.2.2  skrll 	if (speed & IXGBE_LINK_SPEED_10GB_FULL)
   1429  1.3.2.2  skrll 		reg_val |= IXGBE_KRM_LINK_CTRL_1_TETH_AN_CAP_KR;
   1430  1.3.2.2  skrll 
   1431  1.3.2.2  skrll 	/* Advertise 1G support. */
   1432  1.3.2.2  skrll 	if (speed & IXGBE_LINK_SPEED_1GB_FULL)
   1433  1.3.2.2  skrll 		reg_val |= IXGBE_KRM_LINK_CTRL_1_TETH_AN_CAP_KX;
   1434  1.3.2.2  skrll 
   1435  1.3.2.2  skrll 	/* Restart auto-negotiation. */
   1436  1.3.2.2  skrll 	reg_val |= IXGBE_KRM_LINK_CTRL_1_TETH_AN_RESTART;
   1437  1.3.2.2  skrll 	status = ixgbe_write_iosf_sb_reg_x550(hw,
   1438  1.3.2.2  skrll 		IXGBE_KRM_LINK_CTRL_1(hw->bus.lan_id),
   1439  1.3.2.2  skrll 		IXGBE_SB_IOSF_TARGET_KR_PHY, reg_val);
   1440  1.3.2.2  skrll 
   1441  1.3.2.2  skrll 	return status;
   1442  1.3.2.2  skrll }
   1443  1.3.2.2  skrll 
   1444  1.3.2.2  skrll /**
   1445  1.3.2.2  skrll  *  ixgbe_init_phy_ops_X550em - PHY/SFP specific init
   1446  1.3.2.2  skrll  *  @hw: pointer to hardware structure
   1447  1.3.2.2  skrll  *
   1448  1.3.2.2  skrll  *  Initialize any function pointers that were not able to be
   1449  1.3.2.2  skrll  *  set during init_shared_code because the PHY/SFP type was
   1450  1.3.2.2  skrll  *  not known.  Perform the SFP init if necessary.
   1451  1.3.2.2  skrll  */
   1452  1.3.2.2  skrll s32 ixgbe_init_phy_ops_X550em(struct ixgbe_hw *hw)
   1453  1.3.2.2  skrll {
   1454  1.3.2.2  skrll 	struct ixgbe_phy_info *phy = &hw->phy;
   1455  1.3.2.2  skrll 	ixgbe_link_speed speed;
   1456  1.3.2.2  skrll 	s32 ret_val;
   1457  1.3.2.2  skrll 
   1458  1.3.2.2  skrll 	DEBUGFUNC("ixgbe_init_phy_ops_X550em");
   1459  1.3.2.2  skrll 
   1460  1.3.2.2  skrll 	hw->mac.ops.set_lan_id(hw);
   1461  1.3.2.2  skrll 
   1462  1.3.2.2  skrll 	if (hw->mac.ops.get_media_type(hw) == ixgbe_media_type_fiber) {
   1463  1.3.2.2  skrll 		phy->phy_semaphore_mask = IXGBE_GSSR_SHARED_I2C_SM;
   1464  1.3.2.2  skrll 		ixgbe_setup_mux_ctl(hw);
   1465  1.3.2.2  skrll 
   1466  1.3.2.2  skrll 		/* Save NW management interface connected on board. This is used
   1467  1.3.2.2  skrll 		 * to determine internal PHY mode.
   1468  1.3.2.2  skrll 		 */
   1469  1.3.2.2  skrll 		phy->nw_mng_if_sel = IXGBE_READ_REG(hw, IXGBE_NW_MNG_IF_SEL);
   1470  1.3.2.2  skrll 		if (phy->nw_mng_if_sel & IXGBE_NW_MNG_IF_SEL_INT_PHY_MODE) {
   1471  1.3.2.2  skrll 			speed = IXGBE_LINK_SPEED_10GB_FULL |
   1472  1.3.2.2  skrll 				IXGBE_LINK_SPEED_1GB_FULL;
   1473  1.3.2.2  skrll 		}
   1474  1.3.2.2  skrll 		phy->ops.identify_sfp = ixgbe_identify_sfp_module_X550em;
   1475  1.3.2.2  skrll 	}
   1476  1.3.2.2  skrll 
   1477  1.3.2.2  skrll 	/* Identify the PHY or SFP module */
   1478  1.3.2.2  skrll 	ret_val = phy->ops.identify(hw);
   1479  1.3.2.2  skrll 	if (ret_val == IXGBE_ERR_SFP_NOT_SUPPORTED)
   1480  1.3.2.2  skrll 		return ret_val;
   1481  1.3.2.2  skrll 
   1482  1.3.2.2  skrll 	/* Setup function pointers based on detected hardware */
   1483  1.3.2.2  skrll 	ixgbe_init_mac_link_ops_X550em(hw);
   1484  1.3.2.2  skrll 	if (phy->sfp_type != ixgbe_sfp_type_unknown)
   1485  1.3.2.2  skrll 		phy->ops.reset = NULL;
   1486  1.3.2.2  skrll 
   1487  1.3.2.2  skrll 	/* Set functions pointers based on phy type */
   1488  1.3.2.2  skrll 	switch (hw->phy.type) {
   1489  1.3.2.2  skrll 	case ixgbe_phy_x550em_kx4:
   1490  1.3.2.2  skrll 		phy->ops.setup_link = NULL;
   1491  1.3.2.2  skrll 		phy->ops.read_reg = ixgbe_read_phy_reg_x550em;
   1492  1.3.2.2  skrll 		phy->ops.write_reg = ixgbe_write_phy_reg_x550em;
   1493  1.3.2.2  skrll 		break;
   1494  1.3.2.2  skrll 	case ixgbe_phy_x550em_kr:
   1495  1.3.2.2  skrll 		phy->ops.setup_link = ixgbe_setup_kr_x550em;
   1496  1.3.2.2  skrll 		phy->ops.read_reg = ixgbe_read_phy_reg_x550em;
   1497  1.3.2.2  skrll 		phy->ops.write_reg = ixgbe_write_phy_reg_x550em;
   1498  1.3.2.2  skrll 		break;
   1499  1.3.2.2  skrll 	case ixgbe_phy_x550em_ext_t:
   1500  1.3.2.2  skrll 		/* Save NW management interface connected on board. This is used
   1501  1.3.2.2  skrll 		 * to determine internal PHY mode
   1502  1.3.2.2  skrll 		 */
   1503  1.3.2.2  skrll 		phy->nw_mng_if_sel = IXGBE_READ_REG(hw, IXGBE_NW_MNG_IF_SEL);
   1504  1.3.2.2  skrll 
   1505  1.3.2.2  skrll 		/* If internal link mode is XFI, then setup iXFI internal link,
   1506  1.3.2.2  skrll 		 * else setup KR now.
   1507  1.3.2.2  skrll 		 */
   1508  1.3.2.2  skrll 		if (!(phy->nw_mng_if_sel & IXGBE_NW_MNG_IF_SEL_INT_PHY_MODE)) {
   1509  1.3.2.2  skrll 			phy->ops.setup_internal_link =
   1510  1.3.2.2  skrll 					      ixgbe_setup_internal_phy_t_x550em;
   1511  1.3.2.2  skrll 		} else {
   1512  1.3.2.2  skrll 			speed = IXGBE_LINK_SPEED_10GB_FULL |
   1513  1.3.2.2  skrll 				IXGBE_LINK_SPEED_1GB_FULL;
   1514  1.3.2.2  skrll 			ret_val = ixgbe_setup_kr_speed_x550em(hw, speed);
   1515  1.3.2.2  skrll 		}
   1516  1.3.2.2  skrll 
   1517  1.3.2.2  skrll 		/* setup SW LPLU only for first revision */
   1518  1.3.2.2  skrll 		if (!(IXGBE_FUSES0_REV1 & IXGBE_READ_REG(hw,
   1519  1.3.2.2  skrll 						       IXGBE_FUSES0_GROUP(0))))
   1520  1.3.2.2  skrll 			phy->ops.enter_lplu = ixgbe_enter_lplu_t_x550em;
   1521  1.3.2.2  skrll 
   1522  1.3.2.2  skrll 		phy->ops.handle_lasi = ixgbe_handle_lasi_ext_t_x550em;
   1523  1.3.2.2  skrll 		phy->ops.reset = ixgbe_reset_phy_t_X550em;
   1524  1.3.2.2  skrll 		break;
   1525  1.3.2.2  skrll 	default:
   1526  1.3.2.2  skrll 		break;
   1527  1.3.2.2  skrll 	}
   1528  1.3.2.2  skrll 	return ret_val;
   1529  1.3.2.2  skrll }
   1530  1.3.2.2  skrll 
   1531  1.3.2.2  skrll /**
   1532  1.3.2.2  skrll  *  ixgbe_reset_hw_X550em - Perform hardware reset
   1533  1.3.2.2  skrll  *  @hw: pointer to hardware structure
   1534  1.3.2.2  skrll  *
   1535  1.3.2.2  skrll  *  Resets the hardware by resetting the transmit and receive units, masks
   1536  1.3.2.2  skrll  *  and clears all interrupts, perform a PHY reset, and perform a link (MAC)
   1537  1.3.2.2  skrll  *  reset.
   1538  1.3.2.2  skrll  */
   1539  1.3.2.2  skrll s32 ixgbe_reset_hw_X550em(struct ixgbe_hw *hw)
   1540  1.3.2.2  skrll {
   1541  1.3.2.2  skrll 	ixgbe_link_speed link_speed;
   1542  1.3.2.2  skrll 	s32 status;
   1543  1.3.2.2  skrll 	u32 ctrl = 0;
   1544  1.3.2.2  skrll 	u32 i;
   1545  1.3.2.2  skrll 	u32 hlreg0;
   1546  1.3.2.2  skrll 	bool link_up = FALSE;
   1547  1.3.2.2  skrll 
   1548  1.3.2.2  skrll 	DEBUGFUNC("ixgbe_reset_hw_X550em");
   1549  1.3.2.2  skrll 
   1550  1.3.2.2  skrll 	/* Call adapter stop to disable Tx/Rx and clear interrupts */
   1551  1.3.2.2  skrll 	status = hw->mac.ops.stop_adapter(hw);
   1552  1.3.2.2  skrll 	if (status != IXGBE_SUCCESS)
   1553  1.3.2.2  skrll 		return status;
   1554  1.3.2.2  skrll 
   1555  1.3.2.2  skrll 	/* flush pending Tx transactions */
   1556  1.3.2.2  skrll 	ixgbe_clear_tx_pending(hw);
   1557  1.3.2.2  skrll 
   1558  1.3.2.2  skrll 	if (hw->device_id == IXGBE_DEV_ID_X550EM_X_10G_T) {
   1559  1.3.2.2  skrll 		/* Config MDIO clock speed before the first MDIO PHY access */
   1560  1.3.2.2  skrll 		hlreg0 = IXGBE_READ_REG(hw, IXGBE_HLREG0);
   1561  1.3.2.2  skrll 		hlreg0 &= ~IXGBE_HLREG0_MDCSPD;
   1562  1.3.2.2  skrll 		IXGBE_WRITE_REG(hw, IXGBE_HLREG0, hlreg0);
   1563  1.3.2.2  skrll 	}
   1564  1.3.2.2  skrll 
   1565  1.3.2.2  skrll 	/* PHY ops must be identified and initialized prior to reset */
   1566  1.3.2.2  skrll 	status = hw->phy.ops.init(hw);
   1567  1.3.2.2  skrll 
   1568  1.3.2.2  skrll 	if (status == IXGBE_ERR_SFP_NOT_SUPPORTED)
   1569  1.3.2.2  skrll 		return status;
   1570  1.3.2.2  skrll 
   1571  1.3.2.2  skrll 	/* start the external PHY */
   1572  1.3.2.2  skrll 	if (hw->phy.type == ixgbe_phy_x550em_ext_t) {
   1573  1.3.2.2  skrll 		status = ixgbe_init_ext_t_x550em(hw);
   1574  1.3.2.2  skrll 		if (status)
   1575  1.3.2.2  skrll 			return status;
   1576  1.3.2.2  skrll 	}
   1577  1.3.2.2  skrll 
   1578  1.3.2.2  skrll 	/* Setup SFP module if there is one present. */
   1579  1.3.2.2  skrll 	if (hw->phy.sfp_setup_needed) {
   1580  1.3.2.2  skrll 		status = hw->mac.ops.setup_sfp(hw);
   1581  1.3.2.2  skrll 		hw->phy.sfp_setup_needed = FALSE;
   1582  1.3.2.2  skrll 	}
   1583  1.3.2.2  skrll 
   1584  1.3.2.2  skrll 	if (status == IXGBE_ERR_SFP_NOT_SUPPORTED)
   1585  1.3.2.2  skrll 		return status;
   1586  1.3.2.2  skrll 
   1587  1.3.2.2  skrll 	/* Reset PHY */
   1588  1.3.2.2  skrll 	if (!hw->phy.reset_disable && hw->phy.ops.reset)
   1589  1.3.2.2  skrll 		hw->phy.ops.reset(hw);
   1590  1.3.2.2  skrll 
   1591  1.3.2.2  skrll mac_reset_top:
   1592  1.3.2.2  skrll 	/* Issue global reset to the MAC.  Needs to be SW reset if link is up.
   1593  1.3.2.2  skrll 	 * If link reset is used when link is up, it might reset the PHY when
   1594  1.3.2.2  skrll 	 * mng is using it.  If link is down or the flag to force full link
   1595  1.3.2.2  skrll 	 * reset is set, then perform link reset.
   1596  1.3.2.2  skrll 	 */
   1597  1.3.2.2  skrll 	ctrl = IXGBE_CTRL_LNK_RST;
   1598  1.3.2.2  skrll 	if (!hw->force_full_reset) {
   1599  1.3.2.2  skrll 		hw->mac.ops.check_link(hw, &link_speed, &link_up, FALSE);
   1600  1.3.2.2  skrll 		if (link_up)
   1601  1.3.2.2  skrll 			ctrl = IXGBE_CTRL_RST;
   1602  1.3.2.2  skrll 	}
   1603  1.3.2.2  skrll 
   1604  1.3.2.2  skrll 	ctrl |= IXGBE_READ_REG(hw, IXGBE_CTRL);
   1605  1.3.2.2  skrll 	IXGBE_WRITE_REG(hw, IXGBE_CTRL, ctrl);
   1606  1.3.2.2  skrll 	IXGBE_WRITE_FLUSH(hw);
   1607  1.3.2.2  skrll 
   1608  1.3.2.2  skrll 	/* Poll for reset bit to self-clear meaning reset is complete */
   1609  1.3.2.2  skrll 	for (i = 0; i < 10; i++) {
   1610  1.3.2.2  skrll 		usec_delay(1);
   1611  1.3.2.2  skrll 		ctrl = IXGBE_READ_REG(hw, IXGBE_CTRL);
   1612  1.3.2.2  skrll 		if (!(ctrl & IXGBE_CTRL_RST_MASK))
   1613  1.3.2.2  skrll 			break;
   1614  1.3.2.2  skrll 	}
   1615  1.3.2.2  skrll 
   1616  1.3.2.2  skrll 	if (ctrl & IXGBE_CTRL_RST_MASK) {
   1617  1.3.2.2  skrll 		status = IXGBE_ERR_RESET_FAILED;
   1618  1.3.2.2  skrll 		DEBUGOUT("Reset polling failed to complete.\n");
   1619  1.3.2.2  skrll 	}
   1620  1.3.2.2  skrll 
   1621  1.3.2.2  skrll 	msec_delay(50);
   1622  1.3.2.2  skrll 
   1623  1.3.2.2  skrll 	/* Double resets are required for recovery from certain error
   1624  1.3.2.2  skrll 	 * conditions.  Between resets, it is necessary to stall to
   1625  1.3.2.2  skrll 	 * allow time for any pending HW events to complete.
   1626  1.3.2.2  skrll 	 */
   1627  1.3.2.2  skrll 	if (hw->mac.flags & IXGBE_FLAGS_DOUBLE_RESET_REQUIRED) {
   1628  1.3.2.2  skrll 		hw->mac.flags &= ~IXGBE_FLAGS_DOUBLE_RESET_REQUIRED;
   1629  1.3.2.2  skrll 		goto mac_reset_top;
   1630  1.3.2.2  skrll 	}
   1631  1.3.2.2  skrll 
   1632  1.3.2.2  skrll 	/* Store the permanent mac address */
   1633  1.3.2.2  skrll 	hw->mac.ops.get_mac_addr(hw, hw->mac.perm_addr);
   1634  1.3.2.2  skrll 
   1635  1.3.2.2  skrll 	/* Store MAC address from RAR0, clear receive address registers, and
   1636  1.3.2.2  skrll 	 * clear the multicast table.  Also reset num_rar_entries to 128,
   1637  1.3.2.2  skrll 	 * since we modify this value when programming the SAN MAC address.
   1638  1.3.2.2  skrll 	 */
   1639  1.3.2.2  skrll 	hw->mac.num_rar_entries = 128;
   1640  1.3.2.2  skrll 	hw->mac.ops.init_rx_addrs(hw);
   1641  1.3.2.2  skrll 
   1642  1.3.2.2  skrll 	if (hw->device_id == IXGBE_DEV_ID_X550EM_X_SFP)
   1643  1.3.2.2  skrll 		ixgbe_setup_mux_ctl(hw);
   1644  1.3.2.2  skrll 
   1645  1.3.2.2  skrll 	return status;
   1646  1.3.2.2  skrll }
   1647  1.3.2.2  skrll 
   1648  1.3.2.2  skrll /**
   1649  1.3.2.2  skrll  * ixgbe_init_ext_t_x550em - Start (unstall) the external Base T PHY.
   1650  1.3.2.2  skrll  * @hw: pointer to hardware structure
   1651  1.3.2.2  skrll  */
   1652  1.3.2.2  skrll s32 ixgbe_init_ext_t_x550em(struct ixgbe_hw *hw)
   1653  1.3.2.2  skrll {
   1654  1.3.2.2  skrll 	u32 status;
   1655  1.3.2.2  skrll 	u16 reg;
   1656  1.3.2.2  skrll 
   1657  1.3.2.2  skrll 	status = hw->phy.ops.read_reg(hw,
   1658  1.3.2.2  skrll 				      IXGBE_MDIO_TX_VENDOR_ALARMS_3,
   1659  1.3.2.2  skrll 				      IXGBE_MDIO_PMA_PMD_DEV_TYPE,
   1660  1.3.2.2  skrll 				      &reg);
   1661  1.3.2.2  skrll 
   1662  1.3.2.2  skrll 	if (status != IXGBE_SUCCESS)
   1663  1.3.2.2  skrll 		return status;
   1664  1.3.2.2  skrll 
   1665  1.3.2.2  skrll 	/* If PHY FW reset completed bit is set then this is the first
   1666  1.3.2.2  skrll 	 * SW instance after a power on so the PHY FW must be un-stalled.
   1667  1.3.2.2  skrll 	 */
   1668  1.3.2.2  skrll 	if (reg & IXGBE_MDIO_TX_VENDOR_ALARMS_3_RST_MASK) {
   1669  1.3.2.2  skrll 		status = hw->phy.ops.read_reg(hw,
   1670  1.3.2.2  skrll 					IXGBE_MDIO_GLOBAL_RES_PR_10,
   1671  1.3.2.2  skrll 					IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE,
   1672  1.3.2.2  skrll 					&reg);
   1673  1.3.2.2  skrll 
   1674  1.3.2.2  skrll 		if (status != IXGBE_SUCCESS)
   1675  1.3.2.2  skrll 			return status;
   1676  1.3.2.2  skrll 
   1677  1.3.2.2  skrll 		reg &= ~IXGBE_MDIO_POWER_UP_STALL;
   1678  1.3.2.2  skrll 
   1679  1.3.2.2  skrll 		status = hw->phy.ops.write_reg(hw,
   1680  1.3.2.2  skrll 					IXGBE_MDIO_GLOBAL_RES_PR_10,
   1681  1.3.2.2  skrll 					IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE,
   1682  1.3.2.2  skrll 					reg);
   1683  1.3.2.2  skrll 
   1684  1.3.2.2  skrll 		if (status != IXGBE_SUCCESS)
   1685  1.3.2.2  skrll 			return status;
   1686  1.3.2.2  skrll 	}
   1687  1.3.2.2  skrll 
   1688  1.3.2.2  skrll 	return status;
   1689  1.3.2.2  skrll }
   1690  1.3.2.2  skrll 
   1691  1.3.2.2  skrll /**
   1692  1.3.2.2  skrll  *  ixgbe_setup_kr_x550em - Configure the KR PHY.
   1693  1.3.2.2  skrll  *  @hw: pointer to hardware structure
   1694  1.3.2.2  skrll  *
   1695  1.3.2.2  skrll  *  Configures the integrated KR PHY.
   1696  1.3.2.2  skrll  **/
   1697  1.3.2.2  skrll s32 ixgbe_setup_kr_x550em(struct ixgbe_hw *hw)
   1698  1.3.2.2  skrll {
   1699  1.3.2.2  skrll 	return ixgbe_setup_kr_speed_x550em(hw, hw->phy.autoneg_advertised);
   1700  1.3.2.2  skrll }
   1701  1.3.2.2  skrll 
   1702  1.3.2.2  skrll /**
   1703  1.3.2.2  skrll  *  ixgbe_setup_mac_link_sfp_x550em - Setup internal/external the PHY for SFP
   1704  1.3.2.2  skrll  *  @hw: pointer to hardware structure
   1705  1.3.2.2  skrll  *
   1706  1.3.2.2  skrll  *  Configure the external PHY and the integrated KR PHY for SFP support.
   1707  1.3.2.2  skrll  **/
   1708  1.3.2.2  skrll s32 ixgbe_setup_mac_link_sfp_x550em(struct ixgbe_hw *hw,
   1709  1.3.2.2  skrll 				    ixgbe_link_speed speed,
   1710  1.3.2.2  skrll 				    bool autoneg_wait_to_complete)
   1711  1.3.2.2  skrll {
   1712  1.3.2.2  skrll 	s32 ret_val;
   1713  1.3.2.2  skrll 	u16 reg_slice, reg_val;
   1714  1.3.2.2  skrll 	bool setup_linear = FALSE;
   1715  1.3.2.2  skrll 	UNREFERENCED_1PARAMETER(autoneg_wait_to_complete);
   1716  1.3.2.2  skrll 
   1717  1.3.2.2  skrll 	/* Check if SFP module is supported and linear */
   1718  1.3.2.2  skrll 	ret_val = ixgbe_supported_sfp_modules_X550em(hw, &setup_linear);
   1719  1.3.2.2  skrll 
   1720  1.3.2.2  skrll 	/* If no SFP module present, then return success. Return success since
   1721  1.3.2.2  skrll 	 * there is no reason to configure CS4227 and SFP not present error is
   1722  1.3.2.2  skrll 	 * not excepted in the setup MAC link flow.
   1723  1.3.2.2  skrll 	 */
   1724  1.3.2.2  skrll 	if (ret_val == IXGBE_ERR_SFP_NOT_PRESENT)
   1725  1.3.2.2  skrll 		return IXGBE_SUCCESS;
   1726  1.3.2.2  skrll 
   1727  1.3.2.2  skrll 	if (ret_val != IXGBE_SUCCESS)
   1728  1.3.2.2  skrll 		return ret_val;
   1729  1.3.2.2  skrll 
   1730  1.3.2.2  skrll 	if (!(hw->phy.nw_mng_if_sel & IXGBE_NW_MNG_IF_SEL_INT_PHY_MODE)) {
   1731  1.3.2.2  skrll 		/* Configure CS4227 LINE side to 10G SR. */
   1732  1.3.2.2  skrll 		reg_slice = IXGBE_CS4227_LINE_SPARE22_MSB +
   1733  1.3.2.2  skrll 			    (hw->bus.lan_id << 12);
   1734  1.3.2.2  skrll 		reg_val = IXGBE_CS4227_SPEED_10G;
   1735  1.3.2.2  skrll 		ret_val = ixgbe_write_i2c_combined(hw, IXGBE_CS4227, reg_slice,
   1736  1.3.2.2  skrll 						   reg_val);
   1737  1.3.2.2  skrll 
   1738  1.3.2.2  skrll 		reg_slice = IXGBE_CS4227_LINE_SPARE24_LSB +
   1739  1.3.2.2  skrll 			    (hw->bus.lan_id << 12);
   1740  1.3.2.2  skrll 		reg_val = (IXGBE_CS4227_EDC_MODE_SR << 1) | 0x1;
   1741  1.3.2.2  skrll 		ret_val = ixgbe_write_i2c_combined(hw, IXGBE_CS4227, reg_slice,
   1742  1.3.2.2  skrll 						   reg_val);
   1743  1.3.2.2  skrll 
   1744  1.3.2.2  skrll 		/* Configure CS4227 for HOST connection rate then type. */
   1745  1.3.2.2  skrll 		reg_slice = IXGBE_CS4227_HOST_SPARE22_MSB +
   1746  1.3.2.2  skrll 			    (hw->bus.lan_id << 12);
   1747  1.3.2.2  skrll 		reg_val = (speed & IXGBE_LINK_SPEED_10GB_FULL) ?
   1748  1.3.2.2  skrll 		IXGBE_CS4227_SPEED_10G : IXGBE_CS4227_SPEED_1G;
   1749  1.3.2.2  skrll 		ret_val = ixgbe_write_i2c_combined(hw, IXGBE_CS4227, reg_slice,
   1750  1.3.2.2  skrll 						   reg_val);
   1751  1.3.2.2  skrll 
   1752  1.3.2.2  skrll 		reg_slice = IXGBE_CS4227_HOST_SPARE24_LSB +
   1753  1.3.2.2  skrll 			    (hw->bus.lan_id << 12);
   1754  1.3.2.2  skrll 		if (setup_linear)
   1755  1.3.2.2  skrll 			reg_val = (IXGBE_CS4227_EDC_MODE_CX1 << 1) | 0x1;
   1756  1.3.2.2  skrll 		else
   1757  1.3.2.2  skrll 			reg_val = (IXGBE_CS4227_EDC_MODE_SR << 1) | 0x1;
   1758  1.3.2.2  skrll 		ret_val = ixgbe_write_i2c_combined(hw, IXGBE_CS4227, reg_slice,
   1759  1.3.2.2  skrll 						   reg_val);
   1760  1.3.2.2  skrll 
   1761  1.3.2.2  skrll 		/* Setup XFI internal link. */
   1762  1.3.2.2  skrll 		ret_val = ixgbe_setup_ixfi_x550em(hw, &speed);
   1763  1.3.2.2  skrll 	} else {
   1764  1.3.2.2  skrll 		/* Configure internal PHY for KR/KX. */
   1765  1.3.2.2  skrll 		ixgbe_setup_kr_speed_x550em(hw, speed);
   1766  1.3.2.2  skrll 
   1767  1.3.2.2  skrll 		/* Configure CS4227 LINE side to proper mode. */
   1768  1.3.2.2  skrll 		reg_slice = IXGBE_CS4227_LINE_SPARE24_LSB +
   1769  1.3.2.2  skrll 			    (hw->bus.lan_id << 12);
   1770  1.3.2.2  skrll 		if (setup_linear)
   1771  1.3.2.2  skrll 			reg_val = (IXGBE_CS4227_EDC_MODE_CX1 << 1) | 0x1;
   1772  1.3.2.2  skrll 		else
   1773  1.3.2.2  skrll 			reg_val = (IXGBE_CS4227_EDC_MODE_SR << 1) | 0x1;
   1774  1.3.2.2  skrll 		ret_val = ixgbe_write_i2c_combined(hw, IXGBE_CS4227, reg_slice,
   1775  1.3.2.2  skrll 						   reg_val);
   1776  1.3.2.2  skrll 	}
   1777  1.3.2.2  skrll 	return ret_val;
   1778  1.3.2.2  skrll }
   1779  1.3.2.2  skrll 
   1780  1.3.2.2  skrll /**
   1781  1.3.2.2  skrll  *  ixgbe_setup_ixfi_x550em - Configure the KR PHY for iXFI mode.
   1782  1.3.2.2  skrll  *  @hw: pointer to hardware structure
   1783  1.3.2.2  skrll  *  @speed: the link speed to force
   1784  1.3.2.2  skrll  *
   1785  1.3.2.2  skrll  *  Configures the integrated KR PHY to use iXFI mode. Used to connect an
   1786  1.3.2.2  skrll  *  internal and external PHY at a specific speed, without autonegotiation.
   1787  1.3.2.2  skrll  **/
   1788  1.3.2.2  skrll static s32 ixgbe_setup_ixfi_x550em(struct ixgbe_hw *hw, ixgbe_link_speed *speed)
   1789  1.3.2.2  skrll {
   1790  1.3.2.2  skrll 	s32 status;
   1791  1.3.2.2  skrll 	u32 reg_val;
   1792  1.3.2.2  skrll 
   1793  1.3.2.2  skrll 	/* Disable AN and force speed to 10G Serial. */
   1794  1.3.2.2  skrll 	status = ixgbe_read_iosf_sb_reg_x550(hw,
   1795  1.3.2.2  skrll 					IXGBE_KRM_LINK_CTRL_1(hw->bus.lan_id),
   1796  1.3.2.2  skrll 					IXGBE_SB_IOSF_TARGET_KR_PHY, &reg_val);
   1797  1.3.2.2  skrll 	if (status != IXGBE_SUCCESS)
   1798  1.3.2.2  skrll 		return status;
   1799  1.3.2.2  skrll 
   1800  1.3.2.2  skrll 	reg_val &= ~IXGBE_KRM_LINK_CTRL_1_TETH_AN_ENABLE;
   1801  1.3.2.2  skrll 	reg_val &= ~IXGBE_KRM_LINK_CTRL_1_TETH_FORCE_SPEED_MASK;
   1802  1.3.2.2  skrll 
   1803  1.3.2.2  skrll 	/* Select forced link speed for internal PHY. */
   1804  1.3.2.2  skrll 	switch (*speed) {
   1805  1.3.2.2  skrll 	case IXGBE_LINK_SPEED_10GB_FULL:
   1806  1.3.2.2  skrll 		reg_val |= IXGBE_KRM_LINK_CTRL_1_TETH_FORCE_SPEED_10G;
   1807  1.3.2.2  skrll 		break;
   1808  1.3.2.2  skrll 	case IXGBE_LINK_SPEED_1GB_FULL:
   1809  1.3.2.2  skrll 		reg_val |= IXGBE_KRM_LINK_CTRL_1_TETH_FORCE_SPEED_1G;
   1810  1.3.2.2  skrll 		break;
   1811  1.3.2.2  skrll 	default:
   1812  1.3.2.2  skrll 		/* Other link speeds are not supported by internal KR PHY. */
   1813  1.3.2.2  skrll 		return IXGBE_ERR_LINK_SETUP;
   1814  1.3.2.2  skrll 	}
   1815  1.3.2.2  skrll 
   1816  1.3.2.2  skrll 	status = ixgbe_write_iosf_sb_reg_x550(hw,
   1817  1.3.2.2  skrll 					IXGBE_KRM_LINK_CTRL_1(hw->bus.lan_id),
   1818  1.3.2.2  skrll 					IXGBE_SB_IOSF_TARGET_KR_PHY, reg_val);
   1819  1.3.2.2  skrll 	if (status != IXGBE_SUCCESS)
   1820  1.3.2.2  skrll 		return status;
   1821  1.3.2.2  skrll 
   1822  1.3.2.2  skrll 	/* Disable training protocol FSM. */
   1823  1.3.2.2  skrll 	status = ixgbe_read_iosf_sb_reg_x550(hw,
   1824  1.3.2.2  skrll 				IXGBE_KRM_RX_TRN_LINKUP_CTRL(hw->bus.lan_id),
   1825  1.3.2.2  skrll 				IXGBE_SB_IOSF_TARGET_KR_PHY, &reg_val);
   1826  1.3.2.2  skrll 	if (status != IXGBE_SUCCESS)
   1827  1.3.2.2  skrll 		return status;
   1828  1.3.2.2  skrll 	reg_val |= IXGBE_KRM_RX_TRN_LINKUP_CTRL_CONV_WO_PROTOCOL;
   1829  1.3.2.2  skrll 	status = ixgbe_write_iosf_sb_reg_x550(hw,
   1830  1.3.2.2  skrll 				IXGBE_KRM_RX_TRN_LINKUP_CTRL(hw->bus.lan_id),
   1831  1.3.2.2  skrll 				IXGBE_SB_IOSF_TARGET_KR_PHY, reg_val);
   1832  1.3.2.2  skrll 	if (status != IXGBE_SUCCESS)
   1833  1.3.2.2  skrll 		return status;
   1834  1.3.2.2  skrll 
   1835  1.3.2.2  skrll 	/* Disable Flex from training TXFFE. */
   1836  1.3.2.2  skrll 	status = ixgbe_read_iosf_sb_reg_x550(hw,
   1837  1.3.2.2  skrll 				IXGBE_KRM_DSP_TXFFE_STATE_4(hw->bus.lan_id),
   1838  1.3.2.2  skrll 				IXGBE_SB_IOSF_TARGET_KR_PHY, &reg_val);
   1839  1.3.2.2  skrll 	if (status != IXGBE_SUCCESS)
   1840  1.3.2.2  skrll 		return status;
   1841  1.3.2.2  skrll 	reg_val &= ~IXGBE_KRM_DSP_TXFFE_STATE_C0_EN;
   1842  1.3.2.2  skrll 	reg_val &= ~IXGBE_KRM_DSP_TXFFE_STATE_CP1_CN1_EN;
   1843  1.3.2.2  skrll 	reg_val &= ~IXGBE_KRM_DSP_TXFFE_STATE_CO_ADAPT_EN;
   1844  1.3.2.2  skrll 	status = ixgbe_write_iosf_sb_reg_x550(hw,
   1845  1.3.2.2  skrll 				IXGBE_KRM_DSP_TXFFE_STATE_4(hw->bus.lan_id),
   1846  1.3.2.2  skrll 				IXGBE_SB_IOSF_TARGET_KR_PHY, reg_val);
   1847  1.3.2.2  skrll 	if (status != IXGBE_SUCCESS)
   1848  1.3.2.2  skrll 		return status;
   1849  1.3.2.2  skrll 	status = ixgbe_read_iosf_sb_reg_x550(hw,
   1850  1.3.2.2  skrll 				IXGBE_KRM_DSP_TXFFE_STATE_5(hw->bus.lan_id),
   1851  1.3.2.2  skrll 				IXGBE_SB_IOSF_TARGET_KR_PHY, &reg_val);
   1852  1.3.2.2  skrll 	if (status != IXGBE_SUCCESS)
   1853  1.3.2.2  skrll 		return status;
   1854  1.3.2.2  skrll 	reg_val &= ~IXGBE_KRM_DSP_TXFFE_STATE_C0_EN;
   1855  1.3.2.2  skrll 	reg_val &= ~IXGBE_KRM_DSP_TXFFE_STATE_CP1_CN1_EN;
   1856  1.3.2.2  skrll 	reg_val &= ~IXGBE_KRM_DSP_TXFFE_STATE_CO_ADAPT_EN;
   1857  1.3.2.2  skrll 	status = ixgbe_write_iosf_sb_reg_x550(hw,
   1858  1.3.2.2  skrll 				IXGBE_KRM_DSP_TXFFE_STATE_5(hw->bus.lan_id),
   1859  1.3.2.2  skrll 				IXGBE_SB_IOSF_TARGET_KR_PHY, reg_val);
   1860  1.3.2.2  skrll 	if (status != IXGBE_SUCCESS)
   1861  1.3.2.2  skrll 		return status;
   1862  1.3.2.2  skrll 
   1863  1.3.2.2  skrll 	/* Enable override for coefficients. */
   1864  1.3.2.2  skrll 	status = ixgbe_read_iosf_sb_reg_x550(hw,
   1865  1.3.2.2  skrll 				IXGBE_KRM_TX_COEFF_CTRL_1(hw->bus.lan_id),
   1866  1.3.2.2  skrll 				IXGBE_SB_IOSF_TARGET_KR_PHY, &reg_val);
   1867  1.3.2.2  skrll 	if (status != IXGBE_SUCCESS)
   1868  1.3.2.2  skrll 		return status;
   1869  1.3.2.2  skrll 	reg_val |= IXGBE_KRM_TX_COEFF_CTRL_1_OVRRD_EN;
   1870  1.3.2.2  skrll 	reg_val |= IXGBE_KRM_TX_COEFF_CTRL_1_CZERO_EN;
   1871  1.3.2.2  skrll 	reg_val |= IXGBE_KRM_TX_COEFF_CTRL_1_CPLUS1_OVRRD_EN;
   1872  1.3.2.2  skrll 	reg_val |= IXGBE_KRM_TX_COEFF_CTRL_1_CMINUS1_OVRRD_EN;
   1873  1.3.2.2  skrll 	status = ixgbe_write_iosf_sb_reg_x550(hw,
   1874  1.3.2.2  skrll 				IXGBE_KRM_TX_COEFF_CTRL_1(hw->bus.lan_id),
   1875  1.3.2.2  skrll 				IXGBE_SB_IOSF_TARGET_KR_PHY, reg_val);
   1876  1.3.2.2  skrll 	if (status != IXGBE_SUCCESS)
   1877  1.3.2.2  skrll 		return status;
   1878  1.3.2.2  skrll 
   1879  1.3.2.2  skrll 	/* Toggle port SW reset by AN reset. */
   1880  1.3.2.2  skrll 	status = ixgbe_read_iosf_sb_reg_x550(hw,
   1881  1.3.2.2  skrll 					IXGBE_KRM_LINK_CTRL_1(hw->bus.lan_id),
   1882  1.3.2.2  skrll 					IXGBE_SB_IOSF_TARGET_KR_PHY, &reg_val);
   1883  1.3.2.2  skrll 	if (status != IXGBE_SUCCESS)
   1884  1.3.2.2  skrll 		return status;
   1885  1.3.2.2  skrll 	reg_val |= IXGBE_KRM_LINK_CTRL_1_TETH_AN_RESTART;
   1886  1.3.2.2  skrll 	status = ixgbe_write_iosf_sb_reg_x550(hw,
   1887  1.3.2.2  skrll 					IXGBE_KRM_LINK_CTRL_1(hw->bus.lan_id),
   1888  1.3.2.2  skrll 					IXGBE_SB_IOSF_TARGET_KR_PHY, reg_val);
   1889  1.3.2.2  skrll 
   1890  1.3.2.2  skrll 	return status;
   1891  1.3.2.2  skrll }
   1892  1.3.2.2  skrll 
   1893  1.3.2.2  skrll /**
   1894  1.3.2.2  skrll  * ixgbe_ext_phy_t_x550em_get_link - Get ext phy link status
   1895  1.3.2.2  skrll  * @hw: address of hardware structure
   1896  1.3.2.2  skrll  * @link_up: address of boolean to indicate link status
   1897  1.3.2.2  skrll  *
   1898  1.3.2.2  skrll  * Returns error code if unable to get link status.
   1899  1.3.2.2  skrll  */
   1900  1.3.2.2  skrll static s32 ixgbe_ext_phy_t_x550em_get_link(struct ixgbe_hw *hw, bool *link_up)
   1901  1.3.2.2  skrll {
   1902  1.3.2.2  skrll 	u32 ret;
   1903  1.3.2.2  skrll 	u16 autoneg_status;
   1904  1.3.2.2  skrll 
   1905  1.3.2.2  skrll 	*link_up = FALSE;
   1906  1.3.2.2  skrll 
   1907  1.3.2.2  skrll 	/* read this twice back to back to indicate current status */
   1908  1.3.2.2  skrll 	ret = hw->phy.ops.read_reg(hw, IXGBE_MDIO_AUTO_NEG_STATUS,
   1909  1.3.2.2  skrll 				   IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
   1910  1.3.2.2  skrll 				   &autoneg_status);
   1911  1.3.2.2  skrll 	if (ret != IXGBE_SUCCESS)
   1912  1.3.2.2  skrll 		return ret;
   1913  1.3.2.2  skrll 
   1914  1.3.2.2  skrll 	ret = hw->phy.ops.read_reg(hw, IXGBE_MDIO_AUTO_NEG_STATUS,
   1915  1.3.2.2  skrll 				   IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
   1916  1.3.2.2  skrll 				   &autoneg_status);
   1917  1.3.2.2  skrll 	if (ret != IXGBE_SUCCESS)
   1918  1.3.2.2  skrll 		return ret;
   1919  1.3.2.2  skrll 
   1920  1.3.2.2  skrll 	*link_up = !!(autoneg_status & IXGBE_MDIO_AUTO_NEG_LINK_STATUS);
   1921  1.3.2.2  skrll 
   1922  1.3.2.2  skrll 	return IXGBE_SUCCESS;
   1923  1.3.2.2  skrll }
   1924  1.3.2.2  skrll 
   1925  1.3.2.2  skrll /**
   1926  1.3.2.2  skrll  * ixgbe_setup_internal_phy_t_x550em - Configure KR PHY to X557 link
   1927  1.3.2.2  skrll  * @hw: point to hardware structure
   1928  1.3.2.2  skrll  *
   1929  1.3.2.2  skrll  * Configures the link between the integrated KR PHY and the external X557 PHY
   1930  1.3.2.2  skrll  * The driver will call this function when it gets a link status change
   1931  1.3.2.2  skrll  * interrupt from the X557 PHY. This function configures the link speed
   1932  1.3.2.2  skrll  * between the PHYs to match the link speed of the BASE-T link.
   1933  1.3.2.2  skrll  *
   1934  1.3.2.2  skrll  * A return of a non-zero value indicates an error, and the base driver should
   1935  1.3.2.2  skrll  * not report link up.
   1936  1.3.2.2  skrll  */
   1937  1.3.2.2  skrll s32 ixgbe_setup_internal_phy_t_x550em(struct ixgbe_hw *hw)
   1938  1.3.2.2  skrll {
   1939  1.3.2.2  skrll 	ixgbe_link_speed force_speed;
   1940  1.3.2.2  skrll 	bool link_up;
   1941  1.3.2.2  skrll 	u32 status;
   1942  1.3.2.2  skrll 	u16 speed;
   1943  1.3.2.2  skrll 
   1944  1.3.2.2  skrll 	if (hw->mac.ops.get_media_type(hw) != ixgbe_media_type_copper)
   1945  1.3.2.2  skrll 		return IXGBE_ERR_CONFIG;
   1946  1.3.2.2  skrll 
   1947  1.3.2.2  skrll 	/* If link is not up, then there is no setup necessary so return  */
   1948  1.3.2.2  skrll 	status = ixgbe_ext_phy_t_x550em_get_link(hw, &link_up);
   1949  1.3.2.2  skrll 	if (status != IXGBE_SUCCESS)
   1950  1.3.2.2  skrll 		return status;
   1951  1.3.2.2  skrll 
   1952  1.3.2.2  skrll 	if (!link_up)
   1953  1.3.2.2  skrll 		return IXGBE_SUCCESS;
   1954  1.3.2.2  skrll 
   1955  1.3.2.2  skrll 	status = hw->phy.ops.read_reg(hw, IXGBE_MDIO_AUTO_NEG_VENDOR_STAT,
   1956  1.3.2.2  skrll 				      IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
   1957  1.3.2.2  skrll 				      &speed);
   1958  1.3.2.2  skrll 	if (status != IXGBE_SUCCESS)
   1959  1.3.2.2  skrll 		return status;
   1960  1.3.2.2  skrll 
   1961  1.3.2.2  skrll 	/* If link is not still up, then no setup is necessary so return */
   1962  1.3.2.2  skrll 	status = ixgbe_ext_phy_t_x550em_get_link(hw, &link_up);
   1963  1.3.2.2  skrll 	if (status != IXGBE_SUCCESS)
   1964  1.3.2.2  skrll 		return status;
   1965  1.3.2.2  skrll 	if (!link_up)
   1966  1.3.2.2  skrll 		return IXGBE_SUCCESS;
   1967  1.3.2.2  skrll 
   1968  1.3.2.2  skrll 	/* clear everything but the speed and duplex bits */
   1969  1.3.2.2  skrll 	speed &= IXGBE_MDIO_AUTO_NEG_VENDOR_STATUS_MASK;
   1970  1.3.2.2  skrll 
   1971  1.3.2.2  skrll 	switch (speed) {
   1972  1.3.2.2  skrll 	case IXGBE_MDIO_AUTO_NEG_VENDOR_STATUS_10GB_FULL:
   1973  1.3.2.2  skrll 		force_speed = IXGBE_LINK_SPEED_10GB_FULL;
   1974  1.3.2.2  skrll 		break;
   1975  1.3.2.2  skrll 	case IXGBE_MDIO_AUTO_NEG_VENDOR_STATUS_1GB_FULL:
   1976  1.3.2.2  skrll 		force_speed = IXGBE_LINK_SPEED_1GB_FULL;
   1977  1.3.2.2  skrll 		break;
   1978  1.3.2.2  skrll 	default:
   1979  1.3.2.2  skrll 		/* Internal PHY does not support anything else */
   1980  1.3.2.2  skrll 		return IXGBE_ERR_INVALID_LINK_SETTINGS;
   1981  1.3.2.2  skrll 	}
   1982  1.3.2.2  skrll 
   1983  1.3.2.2  skrll 	return ixgbe_setup_ixfi_x550em(hw, &force_speed);
   1984  1.3.2.2  skrll }
   1985  1.3.2.2  skrll 
   1986  1.3.2.2  skrll /**
   1987  1.3.2.2  skrll  *  ixgbe_setup_phy_loopback_x550em - Configure the KR PHY for loopback.
   1988  1.3.2.2  skrll  *  @hw: pointer to hardware structure
   1989  1.3.2.2  skrll  *
   1990  1.3.2.2  skrll  *  Configures the integrated KR PHY to use internal loopback mode.
   1991  1.3.2.2  skrll  **/
   1992  1.3.2.2  skrll s32 ixgbe_setup_phy_loopback_x550em(struct ixgbe_hw *hw)
   1993  1.3.2.2  skrll {
   1994  1.3.2.2  skrll 	s32 status;
   1995  1.3.2.2  skrll 	u32 reg_val;
   1996  1.3.2.2  skrll 
   1997  1.3.2.2  skrll 	/* Disable AN and force speed to 10G Serial. */
   1998  1.3.2.2  skrll 	status = ixgbe_read_iosf_sb_reg_x550(hw,
   1999  1.3.2.2  skrll 		IXGBE_KRM_LINK_CTRL_1(hw->bus.lan_id),
   2000  1.3.2.2  skrll 		IXGBE_SB_IOSF_TARGET_KR_PHY, &reg_val);
   2001  1.3.2.2  skrll 	if (status != IXGBE_SUCCESS)
   2002  1.3.2.2  skrll 		return status;
   2003  1.3.2.2  skrll 	reg_val &= ~IXGBE_KRM_LINK_CTRL_1_TETH_AN_ENABLE;
   2004  1.3.2.2  skrll 	reg_val &= ~IXGBE_KRM_LINK_CTRL_1_TETH_FORCE_SPEED_MASK;
   2005  1.3.2.2  skrll 	reg_val |= IXGBE_KRM_LINK_CTRL_1_TETH_FORCE_SPEED_10G;
   2006  1.3.2.2  skrll 	status = ixgbe_write_iosf_sb_reg_x550(hw,
   2007  1.3.2.2  skrll 		IXGBE_KRM_LINK_CTRL_1(hw->bus.lan_id),
   2008  1.3.2.2  skrll 		IXGBE_SB_IOSF_TARGET_KR_PHY, reg_val);
   2009  1.3.2.2  skrll 	if (status != IXGBE_SUCCESS)
   2010  1.3.2.2  skrll 		return status;
   2011  1.3.2.2  skrll 
   2012  1.3.2.2  skrll 	/* Set near-end loopback clocks. */
   2013  1.3.2.2  skrll 	status = ixgbe_read_iosf_sb_reg_x550(hw,
   2014  1.3.2.2  skrll 		IXGBE_KRM_PORT_CAR_GEN_CTRL(hw->bus.lan_id),
   2015  1.3.2.2  skrll 		IXGBE_SB_IOSF_TARGET_KR_PHY, &reg_val);
   2016  1.3.2.2  skrll 	if (status != IXGBE_SUCCESS)
   2017  1.3.2.2  skrll 		return status;
   2018  1.3.2.2  skrll 	reg_val |= IXGBE_KRM_PORT_CAR_GEN_CTRL_NELB_32B;
   2019  1.3.2.2  skrll 	reg_val |= IXGBE_KRM_PORT_CAR_GEN_CTRL_NELB_KRPCS;
   2020  1.3.2.2  skrll 	status = ixgbe_write_iosf_sb_reg_x550(hw,
   2021  1.3.2.2  skrll 		IXGBE_KRM_PORT_CAR_GEN_CTRL(hw->bus.lan_id),
   2022  1.3.2.2  skrll 		IXGBE_SB_IOSF_TARGET_KR_PHY, reg_val);
   2023  1.3.2.2  skrll 	if (status != IXGBE_SUCCESS)
   2024  1.3.2.2  skrll 		return status;
   2025  1.3.2.2  skrll 
   2026  1.3.2.2  skrll 	/* Set loopback enable. */
   2027  1.3.2.2  skrll 	status = ixgbe_read_iosf_sb_reg_x550(hw,
   2028  1.3.2.2  skrll 		IXGBE_KRM_PMD_DFX_BURNIN(hw->bus.lan_id),
   2029  1.3.2.2  skrll 		IXGBE_SB_IOSF_TARGET_KR_PHY, &reg_val);
   2030  1.3.2.2  skrll 	if (status != IXGBE_SUCCESS)
   2031  1.3.2.2  skrll 		return status;
   2032  1.3.2.2  skrll 	reg_val |= IXGBE_KRM_PMD_DFX_BURNIN_TX_RX_KR_LB_MASK;
   2033  1.3.2.2  skrll 	status = ixgbe_write_iosf_sb_reg_x550(hw,
   2034  1.3.2.2  skrll 		IXGBE_KRM_PMD_DFX_BURNIN(hw->bus.lan_id),
   2035  1.3.2.2  skrll 		IXGBE_SB_IOSF_TARGET_KR_PHY, reg_val);
   2036  1.3.2.2  skrll 	if (status != IXGBE_SUCCESS)
   2037  1.3.2.2  skrll 		return status;
   2038  1.3.2.2  skrll 
   2039  1.3.2.2  skrll 	/* Training bypass. */
   2040  1.3.2.2  skrll 	status = ixgbe_read_iosf_sb_reg_x550(hw,
   2041  1.3.2.2  skrll 		IXGBE_KRM_RX_TRN_LINKUP_CTRL(hw->bus.lan_id),
   2042  1.3.2.2  skrll 		IXGBE_SB_IOSF_TARGET_KR_PHY, &reg_val);
   2043  1.3.2.2  skrll 	if (status != IXGBE_SUCCESS)
   2044  1.3.2.2  skrll 		return status;
   2045  1.3.2.2  skrll 	reg_val |= IXGBE_KRM_RX_TRN_LINKUP_CTRL_PROTOCOL_BYPASS;
   2046  1.3.2.2  skrll 	status = ixgbe_write_iosf_sb_reg_x550(hw,
   2047  1.3.2.2  skrll 		IXGBE_KRM_RX_TRN_LINKUP_CTRL(hw->bus.lan_id),
   2048  1.3.2.2  skrll 		IXGBE_SB_IOSF_TARGET_KR_PHY, reg_val);
   2049  1.3.2.2  skrll 
   2050  1.3.2.2  skrll 	return status;
   2051  1.3.2.2  skrll }
   2052  1.3.2.2  skrll 
   2053  1.3.2.2  skrll /**
   2054  1.3.2.2  skrll  *  ixgbe_read_ee_hostif_X550 - Read EEPROM word using a host interface command
   2055  1.3.2.2  skrll  *  assuming that the semaphore is already obtained.
   2056  1.3.2.2  skrll  *  @hw: pointer to hardware structure
   2057  1.3.2.2  skrll  *  @offset: offset of  word in the EEPROM to read
   2058  1.3.2.2  skrll  *  @data: word read from the EEPROM
   2059  1.3.2.2  skrll  *
   2060  1.3.2.2  skrll  *  Reads a 16 bit word from the EEPROM using the hostif.
   2061  1.3.2.2  skrll  **/
   2062  1.3.2.2  skrll s32 ixgbe_read_ee_hostif_data_X550(struct ixgbe_hw *hw, u16 offset,
   2063  1.3.2.2  skrll 				   u16 *data)
   2064  1.3.2.2  skrll {
   2065  1.3.2.2  skrll 	s32 status;
   2066  1.3.2.2  skrll 	struct ixgbe_hic_read_shadow_ram buffer;
   2067  1.3.2.2  skrll 
   2068  1.3.2.2  skrll 	DEBUGFUNC("ixgbe_read_ee_hostif_data_X550");
   2069  1.3.2.2  skrll 	buffer.hdr.req.cmd = FW_READ_SHADOW_RAM_CMD;
   2070  1.3.2.2  skrll 	buffer.hdr.req.buf_lenh = 0;
   2071  1.3.2.2  skrll 	buffer.hdr.req.buf_lenl = FW_READ_SHADOW_RAM_LEN;
   2072  1.3.2.2  skrll 	buffer.hdr.req.checksum = FW_DEFAULT_CHECKSUM;
   2073  1.3.2.2  skrll 
   2074  1.3.2.2  skrll 	/* convert offset from words to bytes */
   2075  1.3.2.2  skrll 	buffer.address = IXGBE_CPU_TO_BE32(offset * 2);
   2076  1.3.2.2  skrll 	/* one word */
   2077  1.3.2.2  skrll 	buffer.length = IXGBE_CPU_TO_BE16(sizeof(u16));
   2078  1.3.2.2  skrll 
   2079  1.3.2.2  skrll 	status = ixgbe_host_interface_command(hw, (u32 *)&buffer,
   2080  1.3.2.2  skrll 					      sizeof(buffer),
   2081  1.3.2.2  skrll 					      IXGBE_HI_COMMAND_TIMEOUT, FALSE);
   2082  1.3.2.2  skrll 
   2083  1.3.2.2  skrll 	if (status)
   2084  1.3.2.2  skrll 		return status;
   2085  1.3.2.2  skrll 
   2086  1.3.2.2  skrll 	*data = (u16)IXGBE_READ_REG_ARRAY(hw, IXGBE_FLEX_MNG,
   2087  1.3.2.2  skrll 					  FW_NVM_DATA_OFFSET);
   2088  1.3.2.2  skrll 
   2089  1.3.2.2  skrll 	return 0;
   2090  1.3.2.2  skrll }
   2091  1.3.2.2  skrll 
   2092  1.3.2.2  skrll /**
   2093  1.3.2.2  skrll  *  ixgbe_read_ee_hostif_X550 - Read EEPROM word using a host interface command
   2094  1.3.2.2  skrll  *  @hw: pointer to hardware structure
   2095  1.3.2.2  skrll  *  @offset: offset of  word in the EEPROM to read
   2096  1.3.2.2  skrll  *  @data: word read from the EEPROM
   2097  1.3.2.2  skrll  *
   2098  1.3.2.2  skrll  *  Reads a 16 bit word from the EEPROM using the hostif.
   2099  1.3.2.2  skrll  **/
   2100  1.3.2.2  skrll s32 ixgbe_read_ee_hostif_X550(struct ixgbe_hw *hw, u16 offset,
   2101  1.3.2.2  skrll 			      u16 *data)
   2102  1.3.2.2  skrll {
   2103  1.3.2.2  skrll 	s32 status = IXGBE_SUCCESS;
   2104  1.3.2.2  skrll 
   2105  1.3.2.2  skrll 	DEBUGFUNC("ixgbe_read_ee_hostif_X550");
   2106  1.3.2.2  skrll 
   2107  1.3.2.2  skrll 	if (hw->mac.ops.acquire_swfw_sync(hw, IXGBE_GSSR_EEP_SM) ==
   2108  1.3.2.2  skrll 	    IXGBE_SUCCESS) {
   2109  1.3.2.2  skrll 		status = ixgbe_read_ee_hostif_data_X550(hw, offset, data);
   2110  1.3.2.2  skrll 		hw->mac.ops.release_swfw_sync(hw, IXGBE_GSSR_EEP_SM);
   2111  1.3.2.2  skrll 	} else {
   2112  1.3.2.2  skrll 		status = IXGBE_ERR_SWFW_SYNC;
   2113  1.3.2.2  skrll 	}
   2114  1.3.2.2  skrll 
   2115  1.3.2.2  skrll 	return status;
   2116  1.3.2.2  skrll }
   2117  1.3.2.2  skrll 
   2118  1.3.2.2  skrll /**
   2119  1.3.2.2  skrll  *  ixgbe_read_ee_hostif_buffer_X550- Read EEPROM word(s) using hostif
   2120  1.3.2.2  skrll  *  @hw: pointer to hardware structure
   2121  1.3.2.2  skrll  *  @offset: offset of  word in the EEPROM to read
   2122  1.3.2.2  skrll  *  @words: number of words
   2123  1.3.2.2  skrll  *  @data: word(s) read from the EEPROM
   2124  1.3.2.2  skrll  *
   2125  1.3.2.2  skrll  *  Reads a 16 bit word(s) from the EEPROM using the hostif.
   2126  1.3.2.2  skrll  **/
   2127  1.3.2.2  skrll s32 ixgbe_read_ee_hostif_buffer_X550(struct ixgbe_hw *hw,
   2128  1.3.2.2  skrll 				     u16 offset, u16 words, u16 *data)
   2129  1.3.2.2  skrll {
   2130  1.3.2.2  skrll 	struct ixgbe_hic_read_shadow_ram buffer;
   2131  1.3.2.2  skrll 	u32 current_word = 0;
   2132  1.3.2.2  skrll 	u16 words_to_read;
   2133  1.3.2.2  skrll 	s32 status;
   2134  1.3.2.2  skrll 	u32 i;
   2135  1.3.2.2  skrll 
   2136  1.3.2.2  skrll 	DEBUGFUNC("ixgbe_read_ee_hostif_buffer_X550");
   2137  1.3.2.2  skrll 
   2138  1.3.2.2  skrll 	/* Take semaphore for the entire operation. */
   2139  1.3.2.2  skrll 	status = hw->mac.ops.acquire_swfw_sync(hw, IXGBE_GSSR_EEP_SM);
   2140  1.3.2.2  skrll 	if (status) {
   2141  1.3.2.2  skrll 		DEBUGOUT("EEPROM read buffer - semaphore failed\n");
   2142  1.3.2.2  skrll 		return status;
   2143  1.3.2.2  skrll 	}
   2144  1.3.2.2  skrll 	while (words) {
   2145  1.3.2.2  skrll 		if (words > FW_MAX_READ_BUFFER_SIZE / 2)
   2146  1.3.2.2  skrll 			words_to_read = FW_MAX_READ_BUFFER_SIZE / 2;
   2147  1.3.2.2  skrll 		else
   2148  1.3.2.2  skrll 			words_to_read = words;
   2149  1.3.2.2  skrll 
   2150  1.3.2.2  skrll 		buffer.hdr.req.cmd = FW_READ_SHADOW_RAM_CMD;
   2151  1.3.2.2  skrll 		buffer.hdr.req.buf_lenh = 0;
   2152  1.3.2.2  skrll 		buffer.hdr.req.buf_lenl = FW_READ_SHADOW_RAM_LEN;
   2153  1.3.2.2  skrll 		buffer.hdr.req.checksum = FW_DEFAULT_CHECKSUM;
   2154  1.3.2.2  skrll 
   2155  1.3.2.2  skrll 		/* convert offset from words to bytes */
   2156  1.3.2.2  skrll 		buffer.address = IXGBE_CPU_TO_BE32((offset + current_word) * 2);
   2157  1.3.2.2  skrll 		buffer.length = IXGBE_CPU_TO_BE16(words_to_read * 2);
   2158  1.3.2.2  skrll 
   2159  1.3.2.2  skrll 		status = ixgbe_host_interface_command(hw, (u32 *)&buffer,
   2160  1.3.2.2  skrll 						      sizeof(buffer),
   2161  1.3.2.2  skrll 						      IXGBE_HI_COMMAND_TIMEOUT,
   2162  1.3.2.2  skrll 						      FALSE);
   2163  1.3.2.2  skrll 
   2164  1.3.2.2  skrll 		if (status) {
   2165  1.3.2.2  skrll 			DEBUGOUT("Host interface command failed\n");
   2166  1.3.2.2  skrll 			goto out;
   2167  1.3.2.2  skrll 		}
   2168  1.3.2.2  skrll 
   2169  1.3.2.2  skrll 		for (i = 0; i < words_to_read; i++) {
   2170  1.3.2.2  skrll 			u32 reg = IXGBE_FLEX_MNG + (FW_NVM_DATA_OFFSET << 2) +
   2171  1.3.2.2  skrll 				  2 * i;
   2172  1.3.2.2  skrll 			u32 value = IXGBE_READ_REG(hw, reg);
   2173  1.3.2.2  skrll 
   2174  1.3.2.2  skrll 			data[current_word] = (u16)(value & 0xffff);
   2175  1.3.2.2  skrll 			current_word++;
   2176  1.3.2.2  skrll 			i++;
   2177  1.3.2.2  skrll 			if (i < words_to_read) {
   2178  1.3.2.2  skrll 				value >>= 16;
   2179  1.3.2.2  skrll 				data[current_word] = (u16)(value & 0xffff);
   2180  1.3.2.2  skrll 				current_word++;
   2181  1.3.2.2  skrll 			}
   2182  1.3.2.2  skrll 		}
   2183  1.3.2.2  skrll 		words -= words_to_read;
   2184  1.3.2.2  skrll 	}
   2185  1.3.2.2  skrll 
   2186  1.3.2.2  skrll out:
   2187  1.3.2.2  skrll 	hw->mac.ops.release_swfw_sync(hw, IXGBE_GSSR_EEP_SM);
   2188  1.3.2.2  skrll 	return status;
   2189  1.3.2.2  skrll }
   2190  1.3.2.2  skrll 
   2191  1.3.2.2  skrll /**
   2192  1.3.2.2  skrll  *  ixgbe_write_ee_hostif_X550 - Write EEPROM word using hostif
   2193  1.3.2.2  skrll  *  @hw: pointer to hardware structure
   2194  1.3.2.2  skrll  *  @offset: offset of  word in the EEPROM to write
   2195  1.3.2.2  skrll  *  @data: word write to the EEPROM
   2196  1.3.2.2  skrll  *
   2197  1.3.2.2  skrll  *  Write a 16 bit word to the EEPROM using the hostif.
   2198  1.3.2.2  skrll  **/
   2199  1.3.2.2  skrll s32 ixgbe_write_ee_hostif_data_X550(struct ixgbe_hw *hw, u16 offset,
   2200  1.3.2.2  skrll 				    u16 data)
   2201  1.3.2.2  skrll {
   2202  1.3.2.2  skrll 	s32 status;
   2203  1.3.2.2  skrll 	struct ixgbe_hic_write_shadow_ram buffer;
   2204  1.3.2.2  skrll 
   2205  1.3.2.2  skrll 	DEBUGFUNC("ixgbe_write_ee_hostif_data_X550");
   2206  1.3.2.2  skrll 
   2207  1.3.2.2  skrll 	buffer.hdr.req.cmd = FW_WRITE_SHADOW_RAM_CMD;
   2208  1.3.2.2  skrll 	buffer.hdr.req.buf_lenh = 0;
   2209  1.3.2.2  skrll 	buffer.hdr.req.buf_lenl = FW_WRITE_SHADOW_RAM_LEN;
   2210  1.3.2.2  skrll 	buffer.hdr.req.checksum = FW_DEFAULT_CHECKSUM;
   2211  1.3.2.2  skrll 
   2212  1.3.2.2  skrll 	 /* one word */
   2213  1.3.2.2  skrll 	buffer.length = IXGBE_CPU_TO_BE16(sizeof(u16));
   2214  1.3.2.2  skrll 	buffer.data = data;
   2215  1.3.2.2  skrll 	buffer.address = IXGBE_CPU_TO_BE32(offset * 2);
   2216  1.3.2.2  skrll 
   2217  1.3.2.2  skrll 	status = ixgbe_host_interface_command(hw, (u32 *)&buffer,
   2218  1.3.2.2  skrll 					      sizeof(buffer),
   2219  1.3.2.2  skrll 					      IXGBE_HI_COMMAND_TIMEOUT, FALSE);
   2220  1.3.2.2  skrll 
   2221  1.3.2.2  skrll 	return status;
   2222  1.3.2.2  skrll }
   2223  1.3.2.2  skrll 
   2224  1.3.2.2  skrll /**
   2225  1.3.2.2  skrll  *  ixgbe_write_ee_hostif_X550 - Write EEPROM word using hostif
   2226  1.3.2.2  skrll  *  @hw: pointer to hardware structure
   2227  1.3.2.2  skrll  *  @offset: offset of  word in the EEPROM to write
   2228  1.3.2.2  skrll  *  @data: word write to the EEPROM
   2229  1.3.2.2  skrll  *
   2230  1.3.2.2  skrll  *  Write a 16 bit word to the EEPROM using the hostif.
   2231  1.3.2.2  skrll  **/
   2232  1.3.2.2  skrll s32 ixgbe_write_ee_hostif_X550(struct ixgbe_hw *hw, u16 offset,
   2233  1.3.2.2  skrll 			       u16 data)
   2234  1.3.2.2  skrll {
   2235  1.3.2.2  skrll 	s32 status = IXGBE_SUCCESS;
   2236  1.3.2.2  skrll 
   2237  1.3.2.2  skrll 	DEBUGFUNC("ixgbe_write_ee_hostif_X550");
   2238  1.3.2.2  skrll 
   2239  1.3.2.2  skrll 	if (hw->mac.ops.acquire_swfw_sync(hw, IXGBE_GSSR_EEP_SM) ==
   2240  1.3.2.2  skrll 	    IXGBE_SUCCESS) {
   2241  1.3.2.2  skrll 		status = ixgbe_write_ee_hostif_data_X550(hw, offset, data);
   2242  1.3.2.2  skrll 		hw->mac.ops.release_swfw_sync(hw, IXGBE_GSSR_EEP_SM);
   2243  1.3.2.2  skrll 	} else {
   2244  1.3.2.2  skrll 		DEBUGOUT("write ee hostif failed to get semaphore");
   2245  1.3.2.2  skrll 		status = IXGBE_ERR_SWFW_SYNC;
   2246  1.3.2.2  skrll 	}
   2247  1.3.2.2  skrll 
   2248  1.3.2.2  skrll 	return status;
   2249  1.3.2.2  skrll }
   2250  1.3.2.2  skrll 
   2251  1.3.2.2  skrll /**
   2252  1.3.2.2  skrll  *  ixgbe_write_ee_hostif_buffer_X550 - Write EEPROM word(s) using hostif
   2253  1.3.2.2  skrll  *  @hw: pointer to hardware structure
   2254  1.3.2.2  skrll  *  @offset: offset of  word in the EEPROM to write
   2255  1.3.2.2  skrll  *  @words: number of words
   2256  1.3.2.2  skrll  *  @data: word(s) write to the EEPROM
   2257  1.3.2.2  skrll  *
   2258  1.3.2.2  skrll  *  Write a 16 bit word(s) to the EEPROM using the hostif.
   2259  1.3.2.2  skrll  **/
   2260  1.3.2.2  skrll s32 ixgbe_write_ee_hostif_buffer_X550(struct ixgbe_hw *hw,
   2261  1.3.2.2  skrll 				      u16 offset, u16 words, u16 *data)
   2262  1.3.2.2  skrll {
   2263  1.3.2.2  skrll 	s32 status = IXGBE_SUCCESS;
   2264  1.3.2.2  skrll 	u32 i = 0;
   2265  1.3.2.2  skrll 
   2266  1.3.2.2  skrll 	DEBUGFUNC("ixgbe_write_ee_hostif_buffer_X550");
   2267  1.3.2.2  skrll 
   2268  1.3.2.2  skrll 	/* Take semaphore for the entire operation. */
   2269  1.3.2.2  skrll 	status = hw->mac.ops.acquire_swfw_sync(hw, IXGBE_GSSR_EEP_SM);
   2270  1.3.2.2  skrll 	if (status != IXGBE_SUCCESS) {
   2271  1.3.2.2  skrll 		DEBUGOUT("EEPROM write buffer - semaphore failed\n");
   2272  1.3.2.2  skrll 		goto out;
   2273  1.3.2.2  skrll 	}
   2274  1.3.2.2  skrll 
   2275  1.3.2.2  skrll 	for (i = 0; i < words; i++) {
   2276  1.3.2.2  skrll 		status = ixgbe_write_ee_hostif_data_X550(hw, offset + i,
   2277  1.3.2.2  skrll 							 data[i]);
   2278  1.3.2.2  skrll 
   2279  1.3.2.2  skrll 		if (status != IXGBE_SUCCESS) {
   2280  1.3.2.2  skrll 			DEBUGOUT("Eeprom buffered write failed\n");
   2281  1.3.2.2  skrll 			break;
   2282  1.3.2.2  skrll 		}
   2283  1.3.2.2  skrll 	}
   2284  1.3.2.2  skrll 
   2285  1.3.2.2  skrll 	hw->mac.ops.release_swfw_sync(hw, IXGBE_GSSR_EEP_SM);
   2286  1.3.2.2  skrll out:
   2287  1.3.2.2  skrll 
   2288  1.3.2.2  skrll 	return status;
   2289  1.3.2.2  skrll }
   2290  1.3.2.2  skrll 
   2291  1.3.2.2  skrll /**
   2292  1.3.2.2  skrll  * ixgbe_checksum_ptr_x550 - Checksum one pointer region
   2293  1.3.2.2  skrll  * @hw: pointer to hardware structure
   2294  1.3.2.2  skrll  * @ptr: pointer offset in eeprom
   2295  1.3.2.2  skrll  * @size: size of section pointed by ptr, if 0 first word will be used as size
   2296  1.3.2.2  skrll  * @csum: address of checksum to update
   2297  1.3.2.2  skrll  *
   2298  1.3.2.2  skrll  * Returns error status for any failure
   2299  1.3.2.2  skrll  */
   2300  1.3.2.2  skrll static s32 ixgbe_checksum_ptr_x550(struct ixgbe_hw *hw, u16 ptr,
   2301  1.3.2.2  skrll 				   u16 size, u16 *csum, u16 *buffer,
   2302  1.3.2.2  skrll 				   u32 buffer_size)
   2303  1.3.2.2  skrll {
   2304  1.3.2.2  skrll 	u16 buf[256];
   2305  1.3.2.2  skrll 	s32 status;
   2306  1.3.2.2  skrll 	u16 length, bufsz, i, start;
   2307  1.3.2.2  skrll 	u16 *local_buffer;
   2308  1.3.2.2  skrll 
   2309  1.3.2.2  skrll 	bufsz = sizeof(buf) / sizeof(buf[0]);
   2310  1.3.2.2  skrll 
   2311  1.3.2.2  skrll 	/* Read a chunk at the pointer location */
   2312  1.3.2.2  skrll 	if (!buffer) {
   2313  1.3.2.2  skrll 		status = ixgbe_read_ee_hostif_buffer_X550(hw, ptr, bufsz, buf);
   2314  1.3.2.2  skrll 		if (status) {
   2315  1.3.2.2  skrll 			DEBUGOUT("Failed to read EEPROM image\n");
   2316  1.3.2.2  skrll 			return status;
   2317  1.3.2.2  skrll 		}
   2318  1.3.2.2  skrll 		local_buffer = buf;
   2319  1.3.2.2  skrll 	} else {
   2320  1.3.2.2  skrll 		if (buffer_size < ptr)
   2321  1.3.2.2  skrll 			return  IXGBE_ERR_PARAM;
   2322  1.3.2.2  skrll 		local_buffer = &buffer[ptr];
   2323  1.3.2.2  skrll 	}
   2324  1.3.2.2  skrll 
   2325  1.3.2.2  skrll 	if (size) {
   2326  1.3.2.2  skrll 		start = 0;
   2327  1.3.2.2  skrll 		length = size;
   2328  1.3.2.2  skrll 	} else {
   2329  1.3.2.2  skrll 		start = 1;
   2330  1.3.2.2  skrll 		length = local_buffer[0];
   2331  1.3.2.2  skrll 
   2332  1.3.2.2  skrll 		/* Skip pointer section if length is invalid. */
   2333  1.3.2.2  skrll 		if (length == 0xFFFF || length == 0 ||
   2334  1.3.2.2  skrll 		    (ptr + length) >= hw->eeprom.word_size)
   2335  1.3.2.2  skrll 			return IXGBE_SUCCESS;
   2336  1.3.2.2  skrll 	}
   2337  1.3.2.2  skrll 
   2338  1.3.2.2  skrll 	if (buffer && ((u32)start + (u32)length > buffer_size))
   2339  1.3.2.2  skrll 		return IXGBE_ERR_PARAM;
   2340  1.3.2.2  skrll 
   2341  1.3.2.2  skrll 	for (i = start; length; i++, length--) {
   2342  1.3.2.2  skrll 		if (i == bufsz && !buffer) {
   2343  1.3.2.2  skrll 			ptr += bufsz;
   2344  1.3.2.2  skrll 			i = 0;
   2345  1.3.2.2  skrll 			if (length < bufsz)
   2346  1.3.2.2  skrll 				bufsz = length;
   2347  1.3.2.2  skrll 
   2348  1.3.2.2  skrll 			/* Read a chunk at the pointer location */
   2349  1.3.2.2  skrll 			status = ixgbe_read_ee_hostif_buffer_X550(hw, ptr,
   2350  1.3.2.2  skrll 								  bufsz, buf);
   2351  1.3.2.2  skrll 			if (status) {
   2352  1.3.2.2  skrll 				DEBUGOUT("Failed to read EEPROM image\n");
   2353  1.3.2.2  skrll 				return status;
   2354  1.3.2.2  skrll 			}
   2355  1.3.2.2  skrll 		}
   2356  1.3.2.2  skrll 		*csum += local_buffer[i];
   2357  1.3.2.2  skrll 	}
   2358  1.3.2.2  skrll 	return IXGBE_SUCCESS;
   2359  1.3.2.2  skrll }
   2360  1.3.2.2  skrll 
   2361  1.3.2.2  skrll /**
   2362  1.3.2.2  skrll  *  ixgbe_calc_checksum_X550 - Calculates and returns the checksum
   2363  1.3.2.2  skrll  *  @hw: pointer to hardware structure
   2364  1.3.2.2  skrll  *  @buffer: pointer to buffer containing calculated checksum
   2365  1.3.2.2  skrll  *  @buffer_size: size of buffer
   2366  1.3.2.2  skrll  *
   2367  1.3.2.2  skrll  *  Returns a negative error code on error, or the 16-bit checksum
   2368  1.3.2.2  skrll  **/
   2369  1.3.2.2  skrll s32 ixgbe_calc_checksum_X550(struct ixgbe_hw *hw, u16 *buffer, u32 buffer_size)
   2370  1.3.2.2  skrll {
   2371  1.3.2.2  skrll 	u16 eeprom_ptrs[IXGBE_EEPROM_LAST_WORD + 1];
   2372  1.3.2.2  skrll 	u16 *local_buffer;
   2373  1.3.2.2  skrll 	s32 status;
   2374  1.3.2.2  skrll 	u16 checksum = 0;
   2375  1.3.2.2  skrll 	u16 pointer, i, size;
   2376  1.3.2.2  skrll 
   2377  1.3.2.2  skrll 	DEBUGFUNC("ixgbe_calc_eeprom_checksum_X550");
   2378  1.3.2.2  skrll 
   2379  1.3.2.2  skrll 	hw->eeprom.ops.init_params(hw);
   2380  1.3.2.2  skrll 
   2381  1.3.2.2  skrll 	if (!buffer) {
   2382  1.3.2.2  skrll 		/* Read pointer area */
   2383  1.3.2.2  skrll 		status = ixgbe_read_ee_hostif_buffer_X550(hw, 0,
   2384  1.3.2.2  skrll 						     IXGBE_EEPROM_LAST_WORD + 1,
   2385  1.3.2.2  skrll 						     eeprom_ptrs);
   2386  1.3.2.2  skrll 		if (status) {
   2387  1.3.2.2  skrll 			DEBUGOUT("Failed to read EEPROM image\n");
   2388  1.3.2.2  skrll 			return status;
   2389  1.3.2.2  skrll 		}
   2390  1.3.2.2  skrll 		local_buffer = eeprom_ptrs;
   2391  1.3.2.2  skrll 	} else {
   2392  1.3.2.2  skrll 		if (buffer_size < IXGBE_EEPROM_LAST_WORD)
   2393  1.3.2.2  skrll 			return IXGBE_ERR_PARAM;
   2394  1.3.2.2  skrll 		local_buffer = buffer;
   2395  1.3.2.2  skrll 	}
   2396  1.3.2.2  skrll 
   2397  1.3.2.2  skrll 	/*
   2398  1.3.2.2  skrll 	 * For X550 hardware include 0x0-0x41 in the checksum, skip the
   2399  1.3.2.2  skrll 	 * checksum word itself
   2400  1.3.2.2  skrll 	 */
   2401  1.3.2.2  skrll 	for (i = 0; i <= IXGBE_EEPROM_LAST_WORD; i++)
   2402  1.3.2.2  skrll 		if (i != IXGBE_EEPROM_CHECKSUM)
   2403  1.3.2.2  skrll 			checksum += local_buffer[i];
   2404  1.3.2.2  skrll 
   2405  1.3.2.2  skrll 	/*
   2406  1.3.2.2  skrll 	 * Include all data from pointers 0x3, 0x6-0xE.  This excludes the
   2407  1.3.2.2  skrll 	 * FW, PHY module, and PCIe Expansion/Option ROM pointers.
   2408  1.3.2.2  skrll 	 */
   2409  1.3.2.2  skrll 	for (i = IXGBE_PCIE_ANALOG_PTR_X550; i < IXGBE_FW_PTR; i++) {
   2410  1.3.2.2  skrll 		if (i == IXGBE_PHY_PTR || i == IXGBE_OPTION_ROM_PTR)
   2411  1.3.2.2  skrll 			continue;
   2412  1.3.2.2  skrll 
   2413  1.3.2.2  skrll 		pointer = local_buffer[i];
   2414  1.3.2.2  skrll 
   2415  1.3.2.2  skrll 		/* Skip pointer section if the pointer is invalid. */
   2416  1.3.2.2  skrll 		if (pointer == 0xFFFF || pointer == 0 ||
   2417  1.3.2.2  skrll 		    pointer >= hw->eeprom.word_size)
   2418  1.3.2.2  skrll 			continue;
   2419  1.3.2.2  skrll 
   2420  1.3.2.2  skrll 		switch (i) {
   2421  1.3.2.2  skrll 		case IXGBE_PCIE_GENERAL_PTR:
   2422  1.3.2.2  skrll 			size = IXGBE_IXGBE_PCIE_GENERAL_SIZE;
   2423  1.3.2.2  skrll 			break;
   2424  1.3.2.2  skrll 		case IXGBE_PCIE_CONFIG0_PTR:
   2425  1.3.2.2  skrll 		case IXGBE_PCIE_CONFIG1_PTR:
   2426  1.3.2.2  skrll 			size = IXGBE_PCIE_CONFIG_SIZE;
   2427  1.3.2.2  skrll 			break;
   2428  1.3.2.2  skrll 		default:
   2429  1.3.2.2  skrll 			size = 0;
   2430  1.3.2.2  skrll 			break;
   2431  1.3.2.2  skrll 		}
   2432  1.3.2.2  skrll 
   2433  1.3.2.2  skrll 		status = ixgbe_checksum_ptr_x550(hw, pointer, size, &checksum,
   2434  1.3.2.2  skrll 						buffer, buffer_size);
   2435  1.3.2.2  skrll 		if (status)
   2436  1.3.2.2  skrll 			return status;
   2437  1.3.2.2  skrll 	}
   2438  1.3.2.2  skrll 
   2439  1.3.2.2  skrll 	checksum = (u16)IXGBE_EEPROM_SUM - checksum;
   2440  1.3.2.2  skrll 
   2441  1.3.2.2  skrll 	return (s32)checksum;
   2442  1.3.2.2  skrll }
   2443  1.3.2.2  skrll 
   2444  1.3.2.2  skrll /**
   2445  1.3.2.2  skrll  *  ixgbe_calc_eeprom_checksum_X550 - Calculates and returns the checksum
   2446  1.3.2.2  skrll  *  @hw: pointer to hardware structure
   2447  1.3.2.2  skrll  *
   2448  1.3.2.2  skrll  *  Returns a negative error code on error, or the 16-bit checksum
   2449  1.3.2.2  skrll  **/
   2450  1.3.2.2  skrll s32 ixgbe_calc_eeprom_checksum_X550(struct ixgbe_hw *hw)
   2451  1.3.2.2  skrll {
   2452  1.3.2.2  skrll 	return ixgbe_calc_checksum_X550(hw, NULL, 0);
   2453  1.3.2.2  skrll }
   2454  1.3.2.2  skrll 
   2455  1.3.2.2  skrll /**
   2456  1.3.2.2  skrll  *  ixgbe_validate_eeprom_checksum_X550 - Validate EEPROM checksum
   2457  1.3.2.2  skrll  *  @hw: pointer to hardware structure
   2458  1.3.2.2  skrll  *  @checksum_val: calculated checksum
   2459  1.3.2.2  skrll  *
   2460  1.3.2.2  skrll  *  Performs checksum calculation and validates the EEPROM checksum.  If the
   2461  1.3.2.2  skrll  *  caller does not need checksum_val, the value can be NULL.
   2462  1.3.2.2  skrll  **/
   2463  1.3.2.2  skrll s32 ixgbe_validate_eeprom_checksum_X550(struct ixgbe_hw *hw, u16 *checksum_val)
   2464  1.3.2.2  skrll {
   2465  1.3.2.2  skrll 	s32 status;
   2466  1.3.2.2  skrll 	u16 checksum;
   2467  1.3.2.2  skrll 	u16 read_checksum = 0;
   2468  1.3.2.2  skrll 
   2469  1.3.2.2  skrll 	DEBUGFUNC("ixgbe_validate_eeprom_checksum_X550");
   2470  1.3.2.2  skrll 
   2471  1.3.2.2  skrll 	/* Read the first word from the EEPROM. If this times out or fails, do
   2472  1.3.2.2  skrll 	 * not continue or we could be in for a very long wait while every
   2473  1.3.2.2  skrll 	 * EEPROM read fails
   2474  1.3.2.2  skrll 	 */
   2475  1.3.2.2  skrll 	status = hw->eeprom.ops.read(hw, 0, &checksum);
   2476  1.3.2.2  skrll 	if (status) {
   2477  1.3.2.2  skrll 		DEBUGOUT("EEPROM read failed\n");
   2478  1.3.2.2  skrll 		return status;
   2479  1.3.2.2  skrll 	}
   2480  1.3.2.2  skrll 
   2481  1.3.2.2  skrll 	status = hw->eeprom.ops.calc_checksum(hw);
   2482  1.3.2.2  skrll 	if (status < 0)
   2483  1.3.2.2  skrll 		return status;
   2484  1.3.2.2  skrll 
   2485  1.3.2.2  skrll 	checksum = (u16)(status & 0xffff);
   2486  1.3.2.2  skrll 
   2487  1.3.2.2  skrll 	status = ixgbe_read_ee_hostif_X550(hw, IXGBE_EEPROM_CHECKSUM,
   2488  1.3.2.2  skrll 					   &read_checksum);
   2489  1.3.2.2  skrll 	if (status)
   2490  1.3.2.2  skrll 		return status;
   2491  1.3.2.2  skrll 
   2492  1.3.2.2  skrll 	/* Verify read checksum from EEPROM is the same as
   2493  1.3.2.2  skrll 	 * calculated checksum
   2494  1.3.2.2  skrll 	 */
   2495  1.3.2.2  skrll 	if (read_checksum != checksum) {
   2496  1.3.2.2  skrll 		status = IXGBE_ERR_EEPROM_CHECKSUM;
   2497  1.3.2.2  skrll 		ERROR_REPORT1(IXGBE_ERROR_INVALID_STATE,
   2498  1.3.2.2  skrll 			     "Invalid EEPROM checksum");
   2499  1.3.2.2  skrll 	}
   2500  1.3.2.2  skrll 
   2501  1.3.2.2  skrll 	/* If the user cares, return the calculated checksum */
   2502  1.3.2.2  skrll 	if (checksum_val)
   2503  1.3.2.2  skrll 		*checksum_val = checksum;
   2504  1.3.2.2  skrll 
   2505  1.3.2.2  skrll 	return status;
   2506  1.3.2.2  skrll }
   2507  1.3.2.2  skrll 
   2508  1.3.2.2  skrll /**
   2509  1.3.2.2  skrll  * ixgbe_update_eeprom_checksum_X550 - Updates the EEPROM checksum and flash
   2510  1.3.2.2  skrll  * @hw: pointer to hardware structure
   2511  1.3.2.2  skrll  *
   2512  1.3.2.2  skrll  * After writing EEPROM to shadow RAM using EEWR register, software calculates
   2513  1.3.2.2  skrll  * checksum and updates the EEPROM and instructs the hardware to update
   2514  1.3.2.2  skrll  * the flash.
   2515  1.3.2.2  skrll  **/
   2516  1.3.2.2  skrll s32 ixgbe_update_eeprom_checksum_X550(struct ixgbe_hw *hw)
   2517  1.3.2.2  skrll {
   2518  1.3.2.2  skrll 	s32 status;
   2519  1.3.2.2  skrll 	u16 checksum = 0;
   2520  1.3.2.2  skrll 
   2521  1.3.2.2  skrll 	DEBUGFUNC("ixgbe_update_eeprom_checksum_X550");
   2522  1.3.2.2  skrll 
   2523  1.3.2.2  skrll 	/* Read the first word from the EEPROM. If this times out or fails, do
   2524  1.3.2.2  skrll 	 * not continue or we could be in for a very long wait while every
   2525  1.3.2.2  skrll 	 * EEPROM read fails
   2526  1.3.2.2  skrll 	 */
   2527  1.3.2.2  skrll 	status = ixgbe_read_ee_hostif_X550(hw, 0, &checksum);
   2528  1.3.2.2  skrll 	if (status) {
   2529  1.3.2.2  skrll 		DEBUGOUT("EEPROM read failed\n");
   2530  1.3.2.2  skrll 		return status;
   2531  1.3.2.2  skrll 	}
   2532  1.3.2.2  skrll 
   2533  1.3.2.2  skrll 	status = ixgbe_calc_eeprom_checksum_X550(hw);
   2534  1.3.2.2  skrll 	if (status < 0)
   2535  1.3.2.2  skrll 		return status;
   2536  1.3.2.2  skrll 
   2537  1.3.2.2  skrll 	checksum = (u16)(status & 0xffff);
   2538  1.3.2.2  skrll 
   2539  1.3.2.2  skrll 	status = ixgbe_write_ee_hostif_X550(hw, IXGBE_EEPROM_CHECKSUM,
   2540  1.3.2.2  skrll 					    checksum);
   2541  1.3.2.2  skrll 	if (status)
   2542  1.3.2.2  skrll 		return status;
   2543  1.3.2.2  skrll 
   2544  1.3.2.2  skrll 	status = ixgbe_update_flash_X550(hw);
   2545  1.3.2.2  skrll 
   2546  1.3.2.2  skrll 	return status;
   2547  1.3.2.2  skrll }
   2548  1.3.2.2  skrll 
   2549  1.3.2.2  skrll /**
   2550  1.3.2.2  skrll  *  ixgbe_update_flash_X550 - Instruct HW to copy EEPROM to Flash device
   2551  1.3.2.2  skrll  *  @hw: pointer to hardware structure
   2552  1.3.2.2  skrll  *
   2553  1.3.2.2  skrll  *  Issue a shadow RAM dump to FW to copy EEPROM from shadow RAM to the flash.
   2554  1.3.2.2  skrll  **/
   2555  1.3.2.2  skrll s32 ixgbe_update_flash_X550(struct ixgbe_hw *hw)
   2556  1.3.2.2  skrll {
   2557  1.3.2.2  skrll 	s32 status = IXGBE_SUCCESS;
   2558  1.3.2.2  skrll 	union ixgbe_hic_hdr2 buffer;
   2559  1.3.2.2  skrll 
   2560  1.3.2.2  skrll 	DEBUGFUNC("ixgbe_update_flash_X550");
   2561  1.3.2.2  skrll 
   2562  1.3.2.2  skrll 	buffer.req.cmd = FW_SHADOW_RAM_DUMP_CMD;
   2563  1.3.2.2  skrll 	buffer.req.buf_lenh = 0;
   2564  1.3.2.2  skrll 	buffer.req.buf_lenl = FW_SHADOW_RAM_DUMP_LEN;
   2565  1.3.2.2  skrll 	buffer.req.checksum = FW_DEFAULT_CHECKSUM;
   2566  1.3.2.2  skrll 
   2567  1.3.2.2  skrll 	status = ixgbe_host_interface_command(hw, (u32 *)&buffer,
   2568  1.3.2.2  skrll 					      sizeof(buffer),
   2569  1.3.2.2  skrll 					      IXGBE_HI_COMMAND_TIMEOUT, FALSE);
   2570  1.3.2.2  skrll 
   2571  1.3.2.2  skrll 	return status;
   2572  1.3.2.2  skrll }
   2573  1.3.2.2  skrll 
   2574  1.3.2.2  skrll /**
   2575  1.3.2.2  skrll  *  ixgbe_get_supported_physical_layer_X550em - Returns physical layer type
   2576  1.3.2.2  skrll  *  @hw: pointer to hardware structure
   2577  1.3.2.2  skrll  *
   2578  1.3.2.2  skrll  *  Determines physical layer capabilities of the current configuration.
   2579  1.3.2.2  skrll  **/
   2580  1.3.2.2  skrll u32 ixgbe_get_supported_physical_layer_X550em(struct ixgbe_hw *hw)
   2581  1.3.2.2  skrll {
   2582  1.3.2.2  skrll 	u32 physical_layer = IXGBE_PHYSICAL_LAYER_UNKNOWN;
   2583  1.3.2.2  skrll 	u16 ext_ability = 0;
   2584  1.3.2.2  skrll 
   2585  1.3.2.2  skrll 	DEBUGFUNC("ixgbe_get_supported_physical_layer_X550em");
   2586  1.3.2.2  skrll 
   2587  1.3.2.2  skrll 	hw->phy.ops.identify(hw);
   2588  1.3.2.2  skrll 
   2589  1.3.2.2  skrll 	switch (hw->phy.type) {
   2590  1.3.2.2  skrll 	case ixgbe_phy_x550em_kr:
   2591  1.3.2.2  skrll 		physical_layer = IXGBE_PHYSICAL_LAYER_10GBASE_KR |
   2592  1.3.2.2  skrll 				 IXGBE_PHYSICAL_LAYER_1000BASE_KX;
   2593  1.3.2.2  skrll 		break;
   2594  1.3.2.2  skrll 	case ixgbe_phy_x550em_kx4:
   2595  1.3.2.2  skrll 		physical_layer = IXGBE_PHYSICAL_LAYER_10GBASE_KX4 |
   2596  1.3.2.2  skrll 				 IXGBE_PHYSICAL_LAYER_1000BASE_KX;
   2597  1.3.2.2  skrll 		break;
   2598  1.3.2.2  skrll 	case ixgbe_phy_x550em_ext_t:
   2599  1.3.2.2  skrll 		hw->phy.ops.read_reg(hw, IXGBE_MDIO_PHY_EXT_ABILITY,
   2600  1.3.2.2  skrll 				     IXGBE_MDIO_PMA_PMD_DEV_TYPE,
   2601  1.3.2.2  skrll 				     &ext_ability);
   2602  1.3.2.2  skrll 		if (ext_ability & IXGBE_MDIO_PHY_10GBASET_ABILITY)
   2603  1.3.2.2  skrll 			physical_layer |= IXGBE_PHYSICAL_LAYER_10GBASE_T;
   2604  1.3.2.2  skrll 		if (ext_ability & IXGBE_MDIO_PHY_1000BASET_ABILITY)
   2605  1.3.2.2  skrll 			physical_layer |= IXGBE_PHYSICAL_LAYER_1000BASE_T;
   2606  1.3.2.2  skrll 		break;
   2607  1.3.2.2  skrll 	default:
   2608  1.3.2.2  skrll 		break;
   2609  1.3.2.2  skrll 	}
   2610  1.3.2.2  skrll 
   2611  1.3.2.2  skrll 	if (hw->mac.ops.get_media_type(hw) == ixgbe_media_type_fiber)
   2612  1.3.2.2  skrll 		physical_layer = ixgbe_get_supported_phy_sfp_layer_generic(hw);
   2613  1.3.2.2  skrll 
   2614  1.3.2.2  skrll 	return physical_layer;
   2615  1.3.2.2  skrll }
   2616  1.3.2.2  skrll 
   2617  1.3.2.2  skrll /**
   2618  1.3.2.2  skrll  * ixgbe_get_bus_info_x550em - Set PCI bus info
   2619  1.3.2.2  skrll  * @hw: pointer to hardware structure
   2620  1.3.2.2  skrll  *
   2621  1.3.2.2  skrll  * Sets bus link width and speed to unknown because X550em is
   2622  1.3.2.2  skrll  * not a PCI device.
   2623  1.3.2.2  skrll  **/
   2624  1.3.2.2  skrll s32 ixgbe_get_bus_info_X550em(struct ixgbe_hw *hw)
   2625  1.3.2.2  skrll {
   2626  1.3.2.2  skrll 
   2627  1.3.2.2  skrll 	DEBUGFUNC("ixgbe_get_bus_info_x550em");
   2628  1.3.2.2  skrll 
   2629  1.3.2.2  skrll 	hw->bus.width = ixgbe_bus_width_unknown;
   2630  1.3.2.2  skrll 	hw->bus.speed = ixgbe_bus_speed_unknown;
   2631  1.3.2.2  skrll 
   2632  1.3.2.2  skrll 	hw->mac.ops.set_lan_id(hw);
   2633  1.3.2.2  skrll 
   2634  1.3.2.2  skrll 	return IXGBE_SUCCESS;
   2635  1.3.2.2  skrll }
   2636  1.3.2.2  skrll 
   2637  1.3.2.2  skrll /**
   2638  1.3.2.2  skrll  * ixgbe_disable_rx_x550 - Disable RX unit
   2639  1.3.2.2  skrll  *
   2640  1.3.2.2  skrll  * Enables the Rx DMA unit for x550
   2641  1.3.2.2  skrll  **/
   2642  1.3.2.2  skrll void ixgbe_disable_rx_x550(struct ixgbe_hw *hw)
   2643  1.3.2.2  skrll {
   2644  1.3.2.2  skrll 	u32 rxctrl, pfdtxgswc;
   2645  1.3.2.2  skrll 	s32 status;
   2646  1.3.2.2  skrll 	struct ixgbe_hic_disable_rxen fw_cmd;
   2647  1.3.2.2  skrll 
   2648  1.3.2.3  skrll 	DEBUGFUNC("ixgbe_disable_rx_dma_x550");
   2649  1.3.2.2  skrll 
   2650  1.3.2.2  skrll 	rxctrl = IXGBE_READ_REG(hw, IXGBE_RXCTRL);
   2651  1.3.2.2  skrll 	if (rxctrl & IXGBE_RXCTRL_RXEN) {
   2652  1.3.2.2  skrll 		pfdtxgswc = IXGBE_READ_REG(hw, IXGBE_PFDTXGSWC);
   2653  1.3.2.2  skrll 		if (pfdtxgswc & IXGBE_PFDTXGSWC_VT_LBEN) {
   2654  1.3.2.2  skrll 			pfdtxgswc &= ~IXGBE_PFDTXGSWC_VT_LBEN;
   2655  1.3.2.2  skrll 			IXGBE_WRITE_REG(hw, IXGBE_PFDTXGSWC, pfdtxgswc);
   2656  1.3.2.2  skrll 			hw->mac.set_lben = TRUE;
   2657  1.3.2.2  skrll 		} else {
   2658  1.3.2.2  skrll 			hw->mac.set_lben = FALSE;
   2659  1.3.2.2  skrll 		}
   2660  1.3.2.2  skrll 
   2661  1.3.2.2  skrll 		fw_cmd.hdr.cmd = FW_DISABLE_RXEN_CMD;
   2662  1.3.2.2  skrll 		fw_cmd.hdr.buf_len = FW_DISABLE_RXEN_LEN;
   2663  1.3.2.2  skrll 		fw_cmd.hdr.checksum = FW_DEFAULT_CHECKSUM;
   2664  1.3.2.2  skrll 		fw_cmd.port_number = (u8)hw->bus.lan_id;
   2665  1.3.2.2  skrll 
   2666  1.3.2.2  skrll 		status = ixgbe_host_interface_command(hw, (u32 *)&fw_cmd,
   2667  1.3.2.2  skrll 					sizeof(struct ixgbe_hic_disable_rxen),
   2668  1.3.2.2  skrll 					IXGBE_HI_COMMAND_TIMEOUT, TRUE);
   2669  1.3.2.2  skrll 
   2670  1.3.2.2  skrll 		/* If we fail - disable RX using register write */
   2671  1.3.2.2  skrll 		if (status) {
   2672  1.3.2.2  skrll 			rxctrl = IXGBE_READ_REG(hw, IXGBE_RXCTRL);
   2673  1.3.2.2  skrll 			if (rxctrl & IXGBE_RXCTRL_RXEN) {
   2674  1.3.2.2  skrll 				rxctrl &= ~IXGBE_RXCTRL_RXEN;
   2675  1.3.2.2  skrll 				IXGBE_WRITE_REG(hw, IXGBE_RXCTRL, rxctrl);
   2676  1.3.2.2  skrll 			}
   2677  1.3.2.2  skrll 		}
   2678  1.3.2.2  skrll 	}
   2679  1.3.2.2  skrll }
   2680  1.3.2.2  skrll 
   2681  1.3.2.2  skrll /**
   2682  1.3.2.2  skrll  * ixgbe_enter_lplu_x550em - Transition to low power states
   2683  1.3.2.2  skrll  *  @hw: pointer to hardware structure
   2684  1.3.2.2  skrll  *
   2685  1.3.2.2  skrll  * Configures Low Power Link Up on transition to low power states
   2686  1.3.2.2  skrll  * (from D0 to non-D0). Link is required to enter LPLU so avoid resetting the
   2687  1.3.2.2  skrll  * X557 PHY immediately prior to entering LPLU.
   2688  1.3.2.2  skrll  **/
   2689  1.3.2.2  skrll s32 ixgbe_enter_lplu_t_x550em(struct ixgbe_hw *hw)
   2690  1.3.2.2  skrll {
   2691  1.3.2.2  skrll 	u16 an_10g_cntl_reg, autoneg_reg, speed;
   2692  1.3.2.2  skrll 	s32 status;
   2693  1.3.2.2  skrll 	ixgbe_link_speed lcd_speed;
   2694  1.3.2.2  skrll 	u32 save_autoneg;
   2695  1.3.2.2  skrll 	bool link_up;
   2696  1.3.2.2  skrll 
   2697  1.3.2.2  skrll 	/* SW LPLU not required on later HW revisions. */
   2698  1.3.2.2  skrll 	if (IXGBE_FUSES0_REV1 & IXGBE_READ_REG(hw, IXGBE_FUSES0_GROUP(0)))
   2699  1.3.2.2  skrll 		return IXGBE_SUCCESS;
   2700  1.3.2.2  skrll 
   2701  1.3.2.2  skrll 	/* If blocked by MNG FW, then don't restart AN */
   2702  1.3.2.2  skrll 	if (ixgbe_check_reset_blocked(hw))
   2703  1.3.2.2  skrll 		return IXGBE_SUCCESS;
   2704  1.3.2.2  skrll 
   2705  1.3.2.2  skrll 	status = ixgbe_ext_phy_t_x550em_get_link(hw, &link_up);
   2706  1.3.2.2  skrll 	if (status != IXGBE_SUCCESS)
   2707  1.3.2.2  skrll 		return status;
   2708  1.3.2.2  skrll 
   2709  1.3.2.2  skrll 	status = ixgbe_read_eeprom(hw, NVM_INIT_CTRL_3, &hw->eeprom.ctrl_word_3);
   2710  1.3.2.2  skrll 
   2711  1.3.2.2  skrll 	if (status != IXGBE_SUCCESS)
   2712  1.3.2.2  skrll 		return status;
   2713  1.3.2.2  skrll 
   2714  1.3.2.2  skrll 	/* If link is down, LPLU disabled in NVM, WoL disabled, or manageability
   2715  1.3.2.2  skrll 	 * disabled, then force link down by entering low power mode.
   2716  1.3.2.2  skrll 	 */
   2717  1.3.2.2  skrll 	if (!link_up || !(hw->eeprom.ctrl_word_3 & NVM_INIT_CTRL_3_LPLU) ||
   2718  1.3.2.2  skrll 	    !(hw->wol_enabled || ixgbe_mng_present(hw)))
   2719  1.3.2.2  skrll 		return ixgbe_set_copper_phy_power(hw, FALSE);
   2720  1.3.2.2  skrll 
   2721  1.3.2.2  skrll 	/* Determine LCD */
   2722  1.3.2.2  skrll 	status = ixgbe_get_lcd_t_x550em(hw, &lcd_speed);
   2723  1.3.2.2  skrll 
   2724  1.3.2.2  skrll 	if (status != IXGBE_SUCCESS)
   2725  1.3.2.2  skrll 		return status;
   2726  1.3.2.2  skrll 
   2727  1.3.2.2  skrll 	/* If no valid LCD link speed, then force link down and exit. */
   2728  1.3.2.2  skrll 	if (lcd_speed == IXGBE_LINK_SPEED_UNKNOWN)
   2729  1.3.2.2  skrll 		return ixgbe_set_copper_phy_power(hw, FALSE);
   2730  1.3.2.2  skrll 
   2731  1.3.2.2  skrll 	status = hw->phy.ops.read_reg(hw, IXGBE_MDIO_AUTO_NEG_VENDOR_STAT,
   2732  1.3.2.2  skrll 				      IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
   2733  1.3.2.2  skrll 				      &speed);
   2734  1.3.2.2  skrll 
   2735  1.3.2.2  skrll 	if (status != IXGBE_SUCCESS)
   2736  1.3.2.2  skrll 		return status;
   2737  1.3.2.2  skrll 
   2738  1.3.2.2  skrll 	/* If no link now, speed is invalid so take link down */
   2739  1.3.2.2  skrll 	status = ixgbe_ext_phy_t_x550em_get_link(hw, &link_up);
   2740  1.3.2.2  skrll 	if (status != IXGBE_SUCCESS)
   2741  1.3.2.2  skrll 		return ixgbe_set_copper_phy_power(hw, FALSE);
   2742  1.3.2.2  skrll 
   2743  1.3.2.2  skrll 	/* clear everything but the speed bits */
   2744  1.3.2.2  skrll 	speed &= IXGBE_MDIO_AUTO_NEG_VEN_STAT_SPEED_MASK;
   2745  1.3.2.2  skrll 
   2746  1.3.2.2  skrll 	/* If current speed is already LCD, then exit. */
   2747  1.3.2.2  skrll 	if (((speed == IXGBE_MDIO_AUTO_NEG_VENDOR_STATUS_1GB) &&
   2748  1.3.2.2  skrll 	     (lcd_speed == IXGBE_LINK_SPEED_1GB_FULL)) ||
   2749  1.3.2.2  skrll 	    ((speed == IXGBE_MDIO_AUTO_NEG_VENDOR_STATUS_10GB) &&
   2750  1.3.2.2  skrll 	     (lcd_speed == IXGBE_LINK_SPEED_10GB_FULL)))
   2751  1.3.2.2  skrll 		return status;
   2752  1.3.2.2  skrll 
   2753  1.3.2.2  skrll 	/* Clear AN completed indication */
   2754  1.3.2.2  skrll 	status = hw->phy.ops.read_reg(hw, IXGBE_MDIO_AUTO_NEG_VENDOR_TX_ALARM,
   2755  1.3.2.2  skrll 				      IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
   2756  1.3.2.2  skrll 				      &autoneg_reg);
   2757  1.3.2.2  skrll 
   2758  1.3.2.2  skrll 	if (status != IXGBE_SUCCESS)
   2759  1.3.2.2  skrll 		return status;
   2760  1.3.2.2  skrll 
   2761  1.3.2.2  skrll 	status = hw->phy.ops.read_reg(hw, IXGBE_MII_10GBASE_T_AUTONEG_CTRL_REG,
   2762  1.3.2.2  skrll 			     IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
   2763  1.3.2.2  skrll 			     &an_10g_cntl_reg);
   2764  1.3.2.2  skrll 
   2765  1.3.2.2  skrll 	if (status != IXGBE_SUCCESS)
   2766  1.3.2.2  skrll 		return status;
   2767  1.3.2.2  skrll 
   2768  1.3.2.2  skrll 	status = hw->phy.ops.read_reg(hw,
   2769  1.3.2.2  skrll 			     IXGBE_MII_AUTONEG_VENDOR_PROVISION_1_REG,
   2770  1.3.2.2  skrll 			     IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
   2771  1.3.2.2  skrll 			     &autoneg_reg);
   2772  1.3.2.2  skrll 
   2773  1.3.2.2  skrll 	if (status != IXGBE_SUCCESS)
   2774  1.3.2.2  skrll 		return status;
   2775  1.3.2.2  skrll 
   2776  1.3.2.2  skrll 	save_autoneg = hw->phy.autoneg_advertised;
   2777  1.3.2.2  skrll 
   2778  1.3.2.2  skrll 	/* Setup link at least common link speed */
   2779  1.3.2.2  skrll 	status = hw->mac.ops.setup_link(hw, lcd_speed, FALSE);
   2780  1.3.2.2  skrll 
   2781  1.3.2.2  skrll 	/* restore autoneg from before setting lplu speed */
   2782  1.3.2.2  skrll 	hw->phy.autoneg_advertised = save_autoneg;
   2783  1.3.2.2  skrll 
   2784  1.3.2.2  skrll 	return status;
   2785  1.3.2.2  skrll }
   2786  1.3.2.2  skrll 
   2787  1.3.2.2  skrll /**
   2788  1.3.2.2  skrll  * ixgbe_get_lcd_x550em - Determine lowest common denominator
   2789  1.3.2.2  skrll  *  @hw: pointer to hardware structure
   2790  1.3.2.2  skrll  *  @lcd_speed: pointer to lowest common link speed
   2791  1.3.2.2  skrll  *
   2792  1.3.2.2  skrll  * Determine lowest common link speed with link partner.
   2793  1.3.2.2  skrll  **/
   2794  1.3.2.2  skrll s32 ixgbe_get_lcd_t_x550em(struct ixgbe_hw *hw, ixgbe_link_speed *lcd_speed)
   2795  1.3.2.2  skrll {
   2796  1.3.2.2  skrll 	u16 an_lp_status;
   2797  1.3.2.2  skrll 	s32 status;
   2798  1.3.2.2  skrll 	u16 word = hw->eeprom.ctrl_word_3;
   2799  1.3.2.2  skrll 
   2800  1.3.2.2  skrll 	*lcd_speed = IXGBE_LINK_SPEED_UNKNOWN;
   2801  1.3.2.2  skrll 
   2802  1.3.2.2  skrll 	status = hw->phy.ops.read_reg(hw, IXGBE_AUTO_NEG_LP_STATUS,
   2803  1.3.2.2  skrll 				      IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
   2804  1.3.2.2  skrll 				      &an_lp_status);
   2805  1.3.2.2  skrll 
   2806  1.3.2.2  skrll 	if (status != IXGBE_SUCCESS)
   2807  1.3.2.2  skrll 		return status;
   2808  1.3.2.2  skrll 
   2809  1.3.2.2  skrll 	/* If link partner advertised 1G, return 1G */
   2810  1.3.2.2  skrll 	if (an_lp_status & IXGBE_AUTO_NEG_LP_1000BASE_CAP) {
   2811  1.3.2.2  skrll 		*lcd_speed = IXGBE_LINK_SPEED_1GB_FULL;
   2812  1.3.2.2  skrll 		return status;
   2813  1.3.2.2  skrll 	}
   2814  1.3.2.2  skrll 
   2815  1.3.2.2  skrll 	/* If 10G disabled for LPLU via NVM D10GMP, then return no valid LCD */
   2816  1.3.2.2  skrll 	if ((hw->bus.lan_id && (word & NVM_INIT_CTRL_3_D10GMP_PORT1)) ||
   2817  1.3.2.2  skrll 	    (word & NVM_INIT_CTRL_3_D10GMP_PORT0))
   2818  1.3.2.2  skrll 		return status;
   2819  1.3.2.2  skrll 
   2820  1.3.2.2  skrll 	/* Link partner not capable of lower speeds, return 10G */
   2821  1.3.2.2  skrll 	*lcd_speed = IXGBE_LINK_SPEED_10GB_FULL;
   2822  1.3.2.2  skrll 	return status;
   2823  1.3.2.2  skrll }
   2824  1.3.2.2  skrll 
   2825  1.3.2.2  skrll /**
   2826  1.3.2.2  skrll  *  ixgbe_setup_fc_X550em - Set up flow control
   2827  1.3.2.2  skrll  *  @hw: pointer to hardware structure
   2828  1.3.2.2  skrll  *
   2829  1.3.2.2  skrll  *  Called at init time to set up flow control.
   2830  1.3.2.2  skrll  **/
   2831  1.3.2.2  skrll s32 ixgbe_setup_fc_X550em(struct ixgbe_hw *hw)
   2832  1.3.2.2  skrll {
   2833  1.3.2.2  skrll 	s32 ret_val = IXGBE_SUCCESS;
   2834  1.3.2.2  skrll 	u32 pause, asm_dir, reg_val;
   2835  1.3.2.2  skrll 
   2836  1.3.2.2  skrll 	DEBUGFUNC("ixgbe_setup_fc_X550em");
   2837  1.3.2.2  skrll 
   2838  1.3.2.2  skrll 	/* Validate the requested mode */
   2839  1.3.2.2  skrll 	if (hw->fc.strict_ieee && hw->fc.requested_mode == ixgbe_fc_rx_pause) {
   2840  1.3.2.2  skrll 		ERROR_REPORT1(IXGBE_ERROR_UNSUPPORTED,
   2841  1.3.2.2  skrll 			"ixgbe_fc_rx_pause not valid in strict IEEE mode\n");
   2842  1.3.2.2  skrll 		ret_val = IXGBE_ERR_INVALID_LINK_SETTINGS;
   2843  1.3.2.2  skrll 		goto out;
   2844  1.3.2.2  skrll 	}
   2845  1.3.2.2  skrll 
   2846  1.3.2.2  skrll 	/* 10gig parts do not have a word in the EEPROM to determine the
   2847  1.3.2.2  skrll 	 * default flow control setting, so we explicitly set it to full.
   2848  1.3.2.2  skrll 	 */
   2849  1.3.2.2  skrll 	if (hw->fc.requested_mode == ixgbe_fc_default)
   2850  1.3.2.2  skrll 		hw->fc.requested_mode = ixgbe_fc_full;
   2851  1.3.2.2  skrll 
   2852  1.3.2.2  skrll 	/* Determine PAUSE and ASM_DIR bits. */
   2853  1.3.2.2  skrll 	switch (hw->fc.requested_mode) {
   2854  1.3.2.2  skrll 	case ixgbe_fc_none:
   2855  1.3.2.2  skrll 		pause = 0;
   2856  1.3.2.2  skrll 		asm_dir = 0;
   2857  1.3.2.2  skrll 		break;
   2858  1.3.2.2  skrll 	case ixgbe_fc_tx_pause:
   2859  1.3.2.2  skrll 		pause = 0;
   2860  1.3.2.2  skrll 		asm_dir = 1;
   2861  1.3.2.2  skrll 		break;
   2862  1.3.2.2  skrll 	case ixgbe_fc_rx_pause:
   2863  1.3.2.2  skrll 		/* Rx Flow control is enabled and Tx Flow control is
   2864  1.3.2.2  skrll 		 * disabled by software override. Since there really
   2865  1.3.2.2  skrll 		 * isn't a way to advertise that we are capable of RX
   2866  1.3.2.2  skrll 		 * Pause ONLY, we will advertise that we support both
   2867  1.3.2.2  skrll 		 * symmetric and asymmetric Rx PAUSE, as such we fall
   2868  1.3.2.2  skrll 		 * through to the fc_full statement.  Later, we will
   2869  1.3.2.2  skrll 		 * disable the adapter's ability to send PAUSE frames.
   2870  1.3.2.2  skrll 		 */
   2871  1.3.2.2  skrll 	case ixgbe_fc_full:
   2872  1.3.2.2  skrll 		pause = 1;
   2873  1.3.2.2  skrll 		asm_dir = 1;
   2874  1.3.2.2  skrll 		break;
   2875  1.3.2.2  skrll 	default:
   2876  1.3.2.2  skrll 		ERROR_REPORT1(IXGBE_ERROR_ARGUMENT,
   2877  1.3.2.2  skrll 			"Flow control param set incorrectly\n");
   2878  1.3.2.2  skrll 		ret_val = IXGBE_ERR_CONFIG;
   2879  1.3.2.2  skrll 		goto out;
   2880  1.3.2.2  skrll 	}
   2881  1.3.2.2  skrll 
   2882  1.3.2.2  skrll 	if (hw->device_id == IXGBE_DEV_ID_X550EM_X_KR) {
   2883  1.3.2.2  skrll 		ret_val = ixgbe_read_iosf_sb_reg_x550(hw,
   2884  1.3.2.2  skrll 			IXGBE_KRM_AN_CNTL_1(hw->bus.lan_id),
   2885  1.3.2.2  skrll 			IXGBE_SB_IOSF_TARGET_KR_PHY, &reg_val);
   2886  1.3.2.2  skrll 		if (ret_val != IXGBE_SUCCESS)
   2887  1.3.2.2  skrll 			goto out;
   2888  1.3.2.2  skrll 		reg_val &= ~(IXGBE_KRM_AN_CNTL_1_SYM_PAUSE |
   2889  1.3.2.2  skrll 			IXGBE_KRM_AN_CNTL_1_ASM_PAUSE);
   2890  1.3.2.2  skrll 		if (pause)
   2891  1.3.2.2  skrll 			reg_val |= IXGBE_KRM_AN_CNTL_1_SYM_PAUSE;
   2892  1.3.2.2  skrll 		if (asm_dir)
   2893  1.3.2.2  skrll 			reg_val |= IXGBE_KRM_AN_CNTL_1_ASM_PAUSE;
   2894  1.3.2.2  skrll 		ret_val = ixgbe_write_iosf_sb_reg_x550(hw,
   2895  1.3.2.2  skrll 			IXGBE_KRM_AN_CNTL_1(hw->bus.lan_id),
   2896  1.3.2.2  skrll 			IXGBE_SB_IOSF_TARGET_KR_PHY, reg_val);
   2897  1.3.2.2  skrll 
   2898  1.3.2.2  skrll 		/* This device does not fully support AN. */
   2899  1.3.2.2  skrll 		hw->fc.disable_fc_autoneg = TRUE;
   2900  1.3.2.2  skrll 	}
   2901  1.3.2.2  skrll 
   2902  1.3.2.2  skrll out:
   2903  1.3.2.2  skrll 	return ret_val;
   2904  1.3.2.2  skrll }
   2905  1.3.2.2  skrll 
   2906  1.3.2.2  skrll /**
   2907  1.3.2.2  skrll  * ixgbe_set_mux - Set mux for port 1 access with CS4227
   2908  1.3.2.2  skrll  * @hw: pointer to hardware structure
   2909  1.3.2.2  skrll  * @state: set mux if 1, clear if 0
   2910  1.3.2.2  skrll  */
   2911  1.3.2.2  skrll static void ixgbe_set_mux(struct ixgbe_hw *hw, u8 state)
   2912  1.3.2.2  skrll {
   2913  1.3.2.2  skrll 	u32 esdp;
   2914  1.3.2.2  skrll 
   2915  1.3.2.2  skrll 	if (!hw->bus.lan_id)
   2916  1.3.2.2  skrll 		return;
   2917  1.3.2.2  skrll 	esdp = IXGBE_READ_REG(hw, IXGBE_ESDP);
   2918  1.3.2.2  skrll 	if (state)
   2919  1.3.2.2  skrll 		esdp |= IXGBE_ESDP_SDP1;
   2920  1.3.2.2  skrll 	else
   2921  1.3.2.2  skrll 		esdp &= ~IXGBE_ESDP_SDP1;
   2922  1.3.2.2  skrll 	IXGBE_WRITE_REG(hw, IXGBE_ESDP, esdp);
   2923  1.3.2.2  skrll 	IXGBE_WRITE_FLUSH(hw);
   2924  1.3.2.2  skrll }
   2925  1.3.2.2  skrll 
   2926  1.3.2.2  skrll /**
   2927  1.3.2.2  skrll  *  ixgbe_acquire_swfw_sync_X550em - Acquire SWFW semaphore
   2928  1.3.2.2  skrll  *  @hw: pointer to hardware structure
   2929  1.3.2.2  skrll  *  @mask: Mask to specify which semaphore to acquire
   2930  1.3.2.2  skrll  *
   2931  1.3.2.2  skrll  *  Acquires the SWFW semaphore and sets the I2C MUX
   2932  1.3.2.2  skrll  **/
   2933  1.3.2.2  skrll s32 ixgbe_acquire_swfw_sync_X550em(struct ixgbe_hw *hw, u32 mask)
   2934  1.3.2.2  skrll {
   2935  1.3.2.2  skrll 	s32 status;
   2936  1.3.2.2  skrll 
   2937  1.3.2.2  skrll 	DEBUGFUNC("ixgbe_acquire_swfw_sync_X550em");
   2938  1.3.2.2  skrll 
   2939  1.3.2.2  skrll 	status = ixgbe_acquire_swfw_sync_X540(hw, mask);
   2940  1.3.2.2  skrll 	if (status)
   2941  1.3.2.2  skrll 		return status;
   2942  1.3.2.2  skrll 
   2943  1.3.2.2  skrll 	if (mask & IXGBE_GSSR_I2C_MASK)
   2944  1.3.2.2  skrll 		ixgbe_set_mux(hw, 1);
   2945  1.3.2.2  skrll 
   2946  1.3.2.2  skrll 	return IXGBE_SUCCESS;
   2947  1.3.2.2  skrll }
   2948  1.3.2.2  skrll 
   2949  1.3.2.2  skrll /**
   2950  1.3.2.2  skrll  *  ixgbe_release_swfw_sync_X550em - Release SWFW semaphore
   2951  1.3.2.2  skrll  *  @hw: pointer to hardware structure
   2952  1.3.2.2  skrll  *  @mask: Mask to specify which semaphore to release
   2953  1.3.2.2  skrll  *
   2954  1.3.2.2  skrll  *  Releases the SWFW semaphore and sets the I2C MUX
   2955  1.3.2.2  skrll  **/
   2956  1.3.2.2  skrll void ixgbe_release_swfw_sync_X550em(struct ixgbe_hw *hw, u32 mask)
   2957  1.3.2.2  skrll {
   2958  1.3.2.2  skrll 	DEBUGFUNC("ixgbe_release_swfw_sync_X550em");
   2959  1.3.2.2  skrll 
   2960  1.3.2.2  skrll 	if (mask & IXGBE_GSSR_I2C_MASK)
   2961  1.3.2.2  skrll 		ixgbe_set_mux(hw, 0);
   2962  1.3.2.2  skrll 
   2963  1.3.2.2  skrll 	ixgbe_release_swfw_sync_X540(hw, mask);
   2964  1.3.2.2  skrll }
   2965  1.3.2.2  skrll 
   2966  1.3.2.2  skrll /**
   2967  1.3.2.2  skrll  * ixgbe_handle_lasi_ext_t_x550em - Handle external Base T PHY interrupt
   2968  1.3.2.2  skrll  * @hw: pointer to hardware structure
   2969  1.3.2.2  skrll  *
   2970  1.3.2.2  skrll  * Handle external Base T PHY interrupt. If high temperature
   2971  1.3.2.2  skrll  * failure alarm then return error, else if link status change
   2972  1.3.2.2  skrll  * then setup internal/external PHY link
   2973  1.3.2.2  skrll  *
   2974  1.3.2.2  skrll  * Return IXGBE_ERR_OVERTEMP if interrupt is high temperature
   2975  1.3.2.2  skrll  * failure alarm, else return PHY access status.
   2976  1.3.2.2  skrll  */
   2977  1.3.2.2  skrll s32 ixgbe_handle_lasi_ext_t_x550em(struct ixgbe_hw *hw)
   2978  1.3.2.2  skrll {
   2979  1.3.2.2  skrll 	bool lsc;
   2980  1.3.2.2  skrll 	u32 status;
   2981  1.3.2.2  skrll 
   2982  1.3.2.2  skrll 	status = ixgbe_get_lasi_ext_t_x550em(hw, &lsc);
   2983  1.3.2.2  skrll 
   2984  1.3.2.2  skrll 	if (status != IXGBE_SUCCESS)
   2985  1.3.2.2  skrll 		return status;
   2986  1.3.2.2  skrll 
   2987  1.3.2.2  skrll 	if (lsc)
   2988  1.3.2.2  skrll 		return ixgbe_setup_internal_phy(hw);
   2989  1.3.2.2  skrll 
   2990  1.3.2.2  skrll 	return IXGBE_SUCCESS;
   2991  1.3.2.2  skrll }
   2992  1.3.2.2  skrll 
   2993  1.3.2.2  skrll /**
   2994  1.3.2.2  skrll  * ixgbe_setup_mac_link_t_X550em - Sets the auto advertised link speed
   2995  1.3.2.2  skrll  * @hw: pointer to hardware structure
   2996  1.3.2.2  skrll  * @speed: new link speed
   2997  1.3.2.2  skrll  * @autoneg_wait_to_complete: TRUE when waiting for completion is needed
   2998  1.3.2.2  skrll  *
   2999  1.3.2.2  skrll  * Setup internal/external PHY link speed based on link speed, then set
   3000  1.3.2.2  skrll  * external PHY auto advertised link speed.
   3001  1.3.2.2  skrll  *
   3002  1.3.2.2  skrll  * Returns error status for any failure
   3003  1.3.2.2  skrll  **/
   3004  1.3.2.2  skrll s32 ixgbe_setup_mac_link_t_X550em(struct ixgbe_hw *hw,
   3005  1.3.2.2  skrll 				  ixgbe_link_speed speed,
   3006  1.3.2.2  skrll 				  bool autoneg_wait_to_complete)
   3007  1.3.2.2  skrll {
   3008  1.3.2.2  skrll 	s32 status;
   3009  1.3.2.2  skrll 	ixgbe_link_speed force_speed;
   3010  1.3.2.2  skrll 
   3011  1.3.2.2  skrll 	DEBUGFUNC("ixgbe_setup_mac_link_t_X550em");
   3012  1.3.2.2  skrll 
   3013  1.3.2.2  skrll 	/* Setup internal/external PHY link speed to iXFI (10G), unless
   3014  1.3.2.2  skrll 	 * only 1G is auto advertised then setup KX link.
   3015  1.3.2.2  skrll 	 */
   3016  1.3.2.2  skrll 	if (speed & IXGBE_LINK_SPEED_10GB_FULL)
   3017  1.3.2.2  skrll 		force_speed = IXGBE_LINK_SPEED_10GB_FULL;
   3018  1.3.2.2  skrll 	else
   3019  1.3.2.2  skrll 		force_speed = IXGBE_LINK_SPEED_1GB_FULL;
   3020  1.3.2.2  skrll 
   3021  1.3.2.2  skrll 	/* If internal link mode is XFI, then setup XFI internal link. */
   3022  1.3.2.2  skrll 	if (!(hw->phy.nw_mng_if_sel & IXGBE_NW_MNG_IF_SEL_INT_PHY_MODE)) {
   3023  1.3.2.2  skrll 		status = ixgbe_setup_ixfi_x550em(hw, &force_speed);
   3024  1.3.2.2  skrll 
   3025  1.3.2.2  skrll 		if (status != IXGBE_SUCCESS)
   3026  1.3.2.2  skrll 			return status;
   3027  1.3.2.2  skrll 	}
   3028  1.3.2.2  skrll 
   3029  1.3.2.2  skrll 	return hw->phy.ops.setup_link_speed(hw, speed, autoneg_wait_to_complete);
   3030  1.3.2.2  skrll }
   3031  1.3.2.2  skrll 
   3032  1.3.2.2  skrll /**
   3033  1.3.2.2  skrll  * ixgbe_check_link_t_X550em - Determine link and speed status
   3034  1.3.2.2  skrll  * @hw: pointer to hardware structure
   3035  1.3.2.2  skrll  * @speed: pointer to link speed
   3036  1.3.2.2  skrll  * @link_up: TRUE when link is up
   3037  1.3.2.2  skrll  * @link_up_wait_to_complete: bool used to wait for link up or not
   3038  1.3.2.2  skrll  *
   3039  1.3.2.2  skrll  * Check that both the MAC and X557 external PHY have link.
   3040  1.3.2.2  skrll  **/
   3041  1.3.2.2  skrll s32 ixgbe_check_link_t_X550em(struct ixgbe_hw *hw, ixgbe_link_speed *speed,
   3042  1.3.2.2  skrll 			      bool *link_up, bool link_up_wait_to_complete)
   3043  1.3.2.2  skrll {
   3044  1.3.2.2  skrll 	u32 status;
   3045  1.3.2.2  skrll 	u16 autoneg_status;
   3046  1.3.2.2  skrll 
   3047  1.3.2.2  skrll 	if (hw->mac.ops.get_media_type(hw) != ixgbe_media_type_copper)
   3048  1.3.2.2  skrll 		return IXGBE_ERR_CONFIG;
   3049  1.3.2.2  skrll 
   3050  1.3.2.2  skrll 	status = ixgbe_check_mac_link_generic(hw, speed, link_up,
   3051  1.3.2.2  skrll 					      link_up_wait_to_complete);
   3052  1.3.2.2  skrll 
   3053  1.3.2.2  skrll 	/* If check link fails or MAC link is not up, then return */
   3054  1.3.2.2  skrll 	if (status != IXGBE_SUCCESS || !(*link_up))
   3055  1.3.2.2  skrll 		return status;
   3056  1.3.2.2  skrll 
   3057  1.3.2.2  skrll 	/* MAC link is up, so check external PHY link.
   3058  1.3.2.2  skrll 	 * Read this twice back to back to indicate current status.
   3059  1.3.2.2  skrll 	 */
   3060  1.3.2.2  skrll 	status = hw->phy.ops.read_reg(hw, IXGBE_MDIO_AUTO_NEG_STATUS,
   3061  1.3.2.2  skrll 				      IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
   3062  1.3.2.2  skrll 				      &autoneg_status);
   3063  1.3.2.2  skrll 
   3064  1.3.2.2  skrll 	if (status != IXGBE_SUCCESS)
   3065  1.3.2.2  skrll 		return status;
   3066  1.3.2.2  skrll 
   3067  1.3.2.2  skrll 	status = hw->phy.ops.read_reg(hw, IXGBE_MDIO_AUTO_NEG_STATUS,
   3068  1.3.2.2  skrll 				      IXGBE_MDIO_AUTO_NEG_DEV_TYPE,
   3069  1.3.2.2  skrll 				      &autoneg_status);
   3070  1.3.2.2  skrll 
   3071  1.3.2.2  skrll 	if (status != IXGBE_SUCCESS)
   3072  1.3.2.2  skrll 		return status;
   3073  1.3.2.2  skrll 
   3074  1.3.2.2  skrll 	/* If external PHY link is not up, then indicate link not up */
   3075  1.3.2.2  skrll 	if (!(autoneg_status & IXGBE_MDIO_AUTO_NEG_LINK_STATUS))
   3076  1.3.2.2  skrll 		*link_up = FALSE;
   3077  1.3.2.2  skrll 
   3078  1.3.2.2  skrll 	return IXGBE_SUCCESS;
   3079  1.3.2.2  skrll }
   3080  1.3.2.2  skrll 
   3081  1.3.2.2  skrll /**
   3082  1.3.2.2  skrll  *  ixgbe_reset_phy_t_X550em - Performs X557 PHY reset and enables LASI
   3083  1.3.2.2  skrll  *  @hw: pointer to hardware structure
   3084  1.3.2.2  skrll  **/
   3085  1.3.2.2  skrll s32 ixgbe_reset_phy_t_X550em(struct ixgbe_hw *hw)
   3086  1.3.2.2  skrll {
   3087  1.3.2.2  skrll 	s32 status;
   3088  1.3.2.2  skrll 
   3089  1.3.2.2  skrll 	status = ixgbe_reset_phy_generic(hw);
   3090  1.3.2.2  skrll 
   3091  1.3.2.2  skrll 	if (status != IXGBE_SUCCESS)
   3092  1.3.2.2  skrll 		return status;
   3093  1.3.2.2  skrll 
   3094  1.3.2.2  skrll 	/* Configure Link Status Alarm and Temperature Threshold interrupts */
   3095  1.3.2.2  skrll 	return ixgbe_enable_lasi_ext_t_x550em(hw);
   3096  1.3.2.2  skrll }
   3097  1.3.2.2  skrll 
   3098  1.3.2.2  skrll /**
   3099  1.3.2.2  skrll  *  ixgbe_led_on_t_X550em - Turns on the software controllable LEDs.
   3100  1.3.2.2  skrll  *  @hw: pointer to hardware structure
   3101  1.3.2.2  skrll  *  @led_idx: led number to turn on
   3102  1.3.2.2  skrll  **/
   3103  1.3.2.2  skrll s32 ixgbe_led_on_t_X550em(struct ixgbe_hw *hw, u32 led_idx)
   3104  1.3.2.2  skrll {
   3105  1.3.2.2  skrll 	u16 phy_data;
   3106  1.3.2.2  skrll 
   3107  1.3.2.2  skrll 	DEBUGFUNC("ixgbe_led_on_t_X550em");
   3108  1.3.2.2  skrll 
   3109  1.3.2.2  skrll 	if (led_idx >= IXGBE_X557_MAX_LED_INDEX)
   3110  1.3.2.2  skrll 		return IXGBE_ERR_PARAM;
   3111  1.3.2.2  skrll 
   3112  1.3.2.2  skrll 	/* To turn on the LED, set mode to ON. */
   3113  1.3.2.2  skrll 	ixgbe_read_phy_reg(hw, IXGBE_X557_LED_PROVISIONING + led_idx,
   3114  1.3.2.2  skrll 			   IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE, &phy_data);
   3115  1.3.2.2  skrll 	phy_data |= IXGBE_X557_LED_MANUAL_SET_MASK;
   3116  1.3.2.2  skrll 	ixgbe_write_phy_reg(hw, IXGBE_X557_LED_PROVISIONING + led_idx,
   3117  1.3.2.2  skrll 			    IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE, phy_data);
   3118  1.3.2.2  skrll 
   3119  1.3.2.2  skrll 	return IXGBE_SUCCESS;
   3120  1.3.2.2  skrll }
   3121  1.3.2.2  skrll 
   3122  1.3.2.2  skrll /**
   3123  1.3.2.2  skrll  *  ixgbe_led_off_t_X550em - Turns off the software controllable LEDs.
   3124  1.3.2.2  skrll  *  @hw: pointer to hardware structure
   3125  1.3.2.2  skrll  *  @led_idx: led number to turn off
   3126  1.3.2.2  skrll  **/
   3127  1.3.2.2  skrll s32 ixgbe_led_off_t_X550em(struct ixgbe_hw *hw, u32 led_idx)
   3128  1.3.2.2  skrll {
   3129  1.3.2.2  skrll 	u16 phy_data;
   3130  1.3.2.2  skrll 
   3131  1.3.2.2  skrll 	DEBUGFUNC("ixgbe_led_off_t_X550em");
   3132  1.3.2.2  skrll 
   3133  1.3.2.2  skrll 	if (led_idx >= IXGBE_X557_MAX_LED_INDEX)
   3134  1.3.2.2  skrll 		return IXGBE_ERR_PARAM;
   3135  1.3.2.2  skrll 
   3136  1.3.2.2  skrll 	/* To turn on the LED, set mode to ON. */
   3137  1.3.2.2  skrll 	ixgbe_read_phy_reg(hw, IXGBE_X557_LED_PROVISIONING + led_idx,
   3138  1.3.2.2  skrll 			   IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE, &phy_data);
   3139  1.3.2.2  skrll 	phy_data &= ~IXGBE_X557_LED_MANUAL_SET_MASK;
   3140  1.3.2.2  skrll 	ixgbe_write_phy_reg(hw, IXGBE_X557_LED_PROVISIONING + led_idx,
   3141  1.3.2.2  skrll 			    IXGBE_MDIO_VENDOR_SPECIFIC_1_DEV_TYPE, phy_data);
   3142  1.3.2.2  skrll 
   3143  1.3.2.2  skrll 	return IXGBE_SUCCESS;
   3144  1.3.2.2  skrll }
   3145  1.3.2.2  skrll 
   3146