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