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