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