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