xref: /dflybsd-src/sys/dev/netif/ix/ixgbe_82598.c (revision dd5ce676d9b4496101d795200cb99fd0ddf5b254)
179251f5eSSepherosa Ziehau /******************************************************************************
279251f5eSSepherosa Ziehau 
36150453fSSepherosa Ziehau   Copyright (c) 2001-2017, Intel Corporation
479251f5eSSepherosa Ziehau   All rights reserved.
579251f5eSSepherosa Ziehau 
679251f5eSSepherosa Ziehau   Redistribution and use in source and binary forms, with or without
779251f5eSSepherosa Ziehau   modification, are permitted provided that the following conditions are met:
879251f5eSSepherosa Ziehau 
979251f5eSSepherosa Ziehau    1. Redistributions of source code must retain the above copyright notice,
1079251f5eSSepherosa Ziehau       this list of conditions and the following disclaimer.
1179251f5eSSepherosa Ziehau 
1279251f5eSSepherosa Ziehau    2. Redistributions in binary form must reproduce the above copyright
1379251f5eSSepherosa Ziehau       notice, this list of conditions and the following disclaimer in the
1479251f5eSSepherosa Ziehau       documentation and/or other materials provided with the distribution.
1579251f5eSSepherosa Ziehau 
1679251f5eSSepherosa Ziehau    3. Neither the name of the Intel Corporation nor the names of its
1779251f5eSSepherosa Ziehau       contributors may be used to endorse or promote products derived from
1879251f5eSSepherosa Ziehau       this software without specific prior written permission.
1979251f5eSSepherosa Ziehau 
2079251f5eSSepherosa Ziehau   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
2179251f5eSSepherosa Ziehau   AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
2279251f5eSSepherosa Ziehau   IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
2379251f5eSSepherosa Ziehau   ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
2479251f5eSSepherosa Ziehau   LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
2579251f5eSSepherosa Ziehau   CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
2679251f5eSSepherosa Ziehau   SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
2779251f5eSSepherosa Ziehau   INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
2879251f5eSSepherosa Ziehau   CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
2979251f5eSSepherosa Ziehau   ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
3079251f5eSSepherosa Ziehau   POSSIBILITY OF SUCH DAMAGE.
3179251f5eSSepherosa Ziehau 
3279251f5eSSepherosa Ziehau ******************************************************************************/
3379251f5eSSepherosa Ziehau /*$FreeBSD$*/
3479251f5eSSepherosa Ziehau 
3579251f5eSSepherosa Ziehau #include "ixgbe_type.h"
3679251f5eSSepherosa Ziehau #include "ixgbe_82598.h"
3779251f5eSSepherosa Ziehau #include "ixgbe_api.h"
3879251f5eSSepherosa Ziehau #include "ixgbe_common.h"
3979251f5eSSepherosa Ziehau #include "ixgbe_phy.h"
4079251f5eSSepherosa Ziehau 
4163d483cdSSepherosa Ziehau #define IXGBE_82598_MAX_TX_QUEUES 32
4263d483cdSSepherosa Ziehau #define IXGBE_82598_MAX_RX_QUEUES 64
4363d483cdSSepherosa Ziehau #define IXGBE_82598_RAR_ENTRIES   16
4463d483cdSSepherosa Ziehau #define IXGBE_82598_MC_TBL_SIZE  128
4563d483cdSSepherosa Ziehau #define IXGBE_82598_VFT_TBL_SIZE 128
4663d483cdSSepherosa Ziehau #define IXGBE_82598_RX_PB_SIZE   512
4763d483cdSSepherosa Ziehau 
4879251f5eSSepherosa Ziehau static s32 ixgbe_get_link_capabilities_82598(struct ixgbe_hw *hw,
4979251f5eSSepherosa Ziehau 					     ixgbe_link_speed *speed,
5079251f5eSSepherosa Ziehau 					     bool *autoneg);
5179251f5eSSepherosa Ziehau static enum ixgbe_media_type ixgbe_get_media_type_82598(struct ixgbe_hw *hw);
5279251f5eSSepherosa Ziehau static s32 ixgbe_start_mac_link_82598(struct ixgbe_hw *hw,
5379251f5eSSepherosa Ziehau 				      bool autoneg_wait_to_complete);
5479251f5eSSepherosa Ziehau static s32 ixgbe_check_mac_link_82598(struct ixgbe_hw *hw,
5579251f5eSSepherosa Ziehau 				      ixgbe_link_speed *speed, bool *link_up,
5679251f5eSSepherosa Ziehau 				      bool link_up_wait_to_complete);
5779251f5eSSepherosa Ziehau static s32 ixgbe_setup_mac_link_82598(struct ixgbe_hw *hw,
5879251f5eSSepherosa Ziehau 				      ixgbe_link_speed speed,
5979251f5eSSepherosa Ziehau 				      bool autoneg_wait_to_complete);
6079251f5eSSepherosa Ziehau static s32 ixgbe_setup_copper_link_82598(struct ixgbe_hw *hw,
6179251f5eSSepherosa Ziehau 					 ixgbe_link_speed speed,
6279251f5eSSepherosa Ziehau 					 bool autoneg_wait_to_complete);
6379251f5eSSepherosa Ziehau static s32 ixgbe_reset_hw_82598(struct ixgbe_hw *hw);
6479251f5eSSepherosa Ziehau static s32 ixgbe_clear_vmdq_82598(struct ixgbe_hw *hw, u32 rar, u32 vmdq);
6579251f5eSSepherosa Ziehau static s32 ixgbe_clear_vfta_82598(struct ixgbe_hw *hw);
6679251f5eSSepherosa Ziehau static void ixgbe_set_rxpba_82598(struct ixgbe_hw *hw, int num_pb,
6779251f5eSSepherosa Ziehau 				  u32 headroom, int strategy);
6879251f5eSSepherosa Ziehau static s32 ixgbe_read_i2c_sff8472_82598(struct ixgbe_hw *hw, u8 byte_offset,
6979251f5eSSepherosa Ziehau 					u8 *sff8472_data);
7079251f5eSSepherosa Ziehau /**
7179251f5eSSepherosa Ziehau  *  ixgbe_set_pcie_completion_timeout - set pci-e completion timeout
7279251f5eSSepherosa Ziehau  *  @hw: pointer to the HW structure
7379251f5eSSepherosa Ziehau  *
7479251f5eSSepherosa Ziehau  *  The defaults for 82598 should be in the range of 50us to 50ms,
7579251f5eSSepherosa Ziehau  *  however the hardware default for these parts is 500us to 1ms which is less
7679251f5eSSepherosa Ziehau  *  than the 10ms recommended by the pci-e spec.  To address this we need to
7779251f5eSSepherosa Ziehau  *  increase the value to either 10ms to 250ms for capability version 1 config,
7879251f5eSSepherosa Ziehau  *  or 16ms to 55ms for version 2.
7979251f5eSSepherosa Ziehau  **/
ixgbe_set_pcie_completion_timeout(struct ixgbe_hw * hw)8079251f5eSSepherosa Ziehau void ixgbe_set_pcie_completion_timeout(struct ixgbe_hw *hw)
8179251f5eSSepherosa Ziehau {
8279251f5eSSepherosa Ziehau 	u32 gcr = IXGBE_READ_REG(hw, IXGBE_GCR);
8379251f5eSSepherosa Ziehau 	u16 pcie_devctl2;
8479251f5eSSepherosa Ziehau 
8579251f5eSSepherosa Ziehau 	/* only take action if timeout value is defaulted to 0 */
8679251f5eSSepherosa Ziehau 	if (gcr & IXGBE_GCR_CMPL_TMOUT_MASK)
8779251f5eSSepherosa Ziehau 		goto out;
8879251f5eSSepherosa Ziehau 
8979251f5eSSepherosa Ziehau 	/*
9079251f5eSSepherosa Ziehau 	 * if capababilities version is type 1 we can write the
9179251f5eSSepherosa Ziehau 	 * timeout of 10ms to 250ms through the GCR register
9279251f5eSSepherosa Ziehau 	 */
9379251f5eSSepherosa Ziehau 	if (!(gcr & IXGBE_GCR_CAP_VER2)) {
9479251f5eSSepherosa Ziehau 		gcr |= IXGBE_GCR_CMPL_TMOUT_10ms;
9579251f5eSSepherosa Ziehau 		goto out;
9679251f5eSSepherosa Ziehau 	}
9779251f5eSSepherosa Ziehau 
9879251f5eSSepherosa Ziehau 	/*
9979251f5eSSepherosa Ziehau 	 * for version 2 capabilities we need to write the config space
10079251f5eSSepherosa Ziehau 	 * directly in order to set the completion timeout value for
10179251f5eSSepherosa Ziehau 	 * 16ms to 55ms
10279251f5eSSepherosa Ziehau 	 */
10379251f5eSSepherosa Ziehau 	pcie_devctl2 = IXGBE_READ_PCIE_WORD(hw, IXGBE_PCI_DEVICE_CONTROL2);
10479251f5eSSepherosa Ziehau 	pcie_devctl2 |= IXGBE_PCI_DEVICE_CONTROL2_16ms;
10579251f5eSSepherosa Ziehau 	IXGBE_WRITE_PCIE_WORD(hw, IXGBE_PCI_DEVICE_CONTROL2, pcie_devctl2);
10679251f5eSSepherosa Ziehau out:
10779251f5eSSepherosa Ziehau 	/* disable completion timeout resend */
10879251f5eSSepherosa Ziehau 	gcr &= ~IXGBE_GCR_CMPL_TMOUT_RESEND;
10979251f5eSSepherosa Ziehau 	IXGBE_WRITE_REG(hw, IXGBE_GCR, gcr);
11079251f5eSSepherosa Ziehau }
11179251f5eSSepherosa Ziehau 
11279251f5eSSepherosa Ziehau /**
11379251f5eSSepherosa Ziehau  *  ixgbe_init_ops_82598 - Inits func ptrs and MAC type
11479251f5eSSepherosa Ziehau  *  @hw: pointer to hardware structure
11579251f5eSSepherosa Ziehau  *
11679251f5eSSepherosa Ziehau  *  Initialize the function pointers and assign the MAC type for 82598.
11779251f5eSSepherosa Ziehau  *  Does not touch the hardware.
11879251f5eSSepherosa Ziehau  **/
ixgbe_init_ops_82598(struct ixgbe_hw * hw)11979251f5eSSepherosa Ziehau s32 ixgbe_init_ops_82598(struct ixgbe_hw *hw)
12079251f5eSSepherosa Ziehau {
12179251f5eSSepherosa Ziehau 	struct ixgbe_mac_info *mac = &hw->mac;
12279251f5eSSepherosa Ziehau 	struct ixgbe_phy_info *phy = &hw->phy;
12379251f5eSSepherosa Ziehau 	s32 ret_val;
12479251f5eSSepherosa Ziehau 
12579251f5eSSepherosa Ziehau 	DEBUGFUNC("ixgbe_init_ops_82598");
12679251f5eSSepherosa Ziehau 
12779251f5eSSepherosa Ziehau 	ret_val = ixgbe_init_phy_ops_generic(hw);
12879251f5eSSepherosa Ziehau 	ret_val = ixgbe_init_ops_generic(hw);
12979251f5eSSepherosa Ziehau 
13079251f5eSSepherosa Ziehau 	/* PHY */
13163d483cdSSepherosa Ziehau 	phy->ops.init = ixgbe_init_phy_ops_82598;
13279251f5eSSepherosa Ziehau 
13379251f5eSSepherosa Ziehau 	/* MAC */
13463d483cdSSepherosa Ziehau 	mac->ops.start_hw = ixgbe_start_hw_82598;
13563d483cdSSepherosa Ziehau 	mac->ops.enable_relaxed_ordering = ixgbe_enable_relaxed_ordering_82598;
13663d483cdSSepherosa Ziehau 	mac->ops.reset_hw = ixgbe_reset_hw_82598;
13763d483cdSSepherosa Ziehau 	mac->ops.get_media_type = ixgbe_get_media_type_82598;
13879251f5eSSepherosa Ziehau 	mac->ops.get_supported_physical_layer =
13963d483cdSSepherosa Ziehau 				ixgbe_get_supported_physical_layer_82598;
14063d483cdSSepherosa Ziehau 	mac->ops.read_analog_reg8 = ixgbe_read_analog_reg8_82598;
14163d483cdSSepherosa Ziehau 	mac->ops.write_analog_reg8 = ixgbe_write_analog_reg8_82598;
14263d483cdSSepherosa Ziehau 	mac->ops.set_lan_id = ixgbe_set_lan_id_multi_port_pcie_82598;
14363d483cdSSepherosa Ziehau 	mac->ops.enable_rx_dma = ixgbe_enable_rx_dma_82598;
14479251f5eSSepherosa Ziehau 
14579251f5eSSepherosa Ziehau 	/* RAR, Multicast, VLAN */
14663d483cdSSepherosa Ziehau 	mac->ops.set_vmdq = ixgbe_set_vmdq_82598;
14763d483cdSSepherosa Ziehau 	mac->ops.clear_vmdq = ixgbe_clear_vmdq_82598;
14863d483cdSSepherosa Ziehau 	mac->ops.set_vfta = ixgbe_set_vfta_82598;
14979251f5eSSepherosa Ziehau 	mac->ops.set_vlvf = NULL;
15063d483cdSSepherosa Ziehau 	mac->ops.clear_vfta = ixgbe_clear_vfta_82598;
15179251f5eSSepherosa Ziehau 
15279251f5eSSepherosa Ziehau 	/* Flow Control */
15363d483cdSSepherosa Ziehau 	mac->ops.fc_enable = ixgbe_fc_enable_82598;
15479251f5eSSepherosa Ziehau 
15563d483cdSSepherosa Ziehau 	mac->mcft_size		= IXGBE_82598_MC_TBL_SIZE;
15663d483cdSSepherosa Ziehau 	mac->vft_size		= IXGBE_82598_VFT_TBL_SIZE;
15763d483cdSSepherosa Ziehau 	mac->num_rar_entries	= IXGBE_82598_RAR_ENTRIES;
15863d483cdSSepherosa Ziehau 	mac->rx_pb_size		= IXGBE_82598_RX_PB_SIZE;
15963d483cdSSepherosa Ziehau 	mac->max_rx_queues	= IXGBE_82598_MAX_RX_QUEUES;
16063d483cdSSepherosa Ziehau 	mac->max_tx_queues	= IXGBE_82598_MAX_TX_QUEUES;
16179251f5eSSepherosa Ziehau 	mac->max_msix_vectors	= ixgbe_get_pcie_msix_count_generic(hw);
16279251f5eSSepherosa Ziehau 
16379251f5eSSepherosa Ziehau 	/* SFP+ Module */
16463d483cdSSepherosa Ziehau 	phy->ops.read_i2c_eeprom = ixgbe_read_i2c_eeprom_82598;
16563d483cdSSepherosa Ziehau 	phy->ops.read_i2c_sff8472 = ixgbe_read_i2c_sff8472_82598;
16679251f5eSSepherosa Ziehau 
16779251f5eSSepherosa Ziehau 	/* Link */
16863d483cdSSepherosa Ziehau 	mac->ops.check_link = ixgbe_check_mac_link_82598;
16963d483cdSSepherosa Ziehau 	mac->ops.setup_link = ixgbe_setup_mac_link_82598;
17079251f5eSSepherosa Ziehau 	mac->ops.flap_tx_laser = NULL;
17163d483cdSSepherosa Ziehau 	mac->ops.get_link_capabilities = ixgbe_get_link_capabilities_82598;
17263d483cdSSepherosa Ziehau 	mac->ops.setup_rxpba = ixgbe_set_rxpba_82598;
17379251f5eSSepherosa Ziehau 
17479251f5eSSepherosa Ziehau 	/* Manageability interface */
17579251f5eSSepherosa Ziehau 	mac->ops.set_fw_drv_ver = NULL;
17679251f5eSSepherosa Ziehau 
17779251f5eSSepherosa Ziehau 	mac->ops.get_rtrup2tc = NULL;
17879251f5eSSepherosa Ziehau 
17979251f5eSSepherosa Ziehau 	return ret_val;
18079251f5eSSepherosa Ziehau }
18179251f5eSSepherosa Ziehau 
18279251f5eSSepherosa Ziehau /**
18379251f5eSSepherosa Ziehau  *  ixgbe_init_phy_ops_82598 - PHY/SFP specific init
18479251f5eSSepherosa Ziehau  *  @hw: pointer to hardware structure
18579251f5eSSepherosa Ziehau  *
18679251f5eSSepherosa Ziehau  *  Initialize any function pointers that were not able to be
18779251f5eSSepherosa Ziehau  *  set during init_shared_code because the PHY/SFP type was
18879251f5eSSepherosa Ziehau  *  not known.  Perform the SFP init if necessary.
18979251f5eSSepherosa Ziehau  *
19079251f5eSSepherosa Ziehau  **/
ixgbe_init_phy_ops_82598(struct ixgbe_hw * hw)19179251f5eSSepherosa Ziehau s32 ixgbe_init_phy_ops_82598(struct ixgbe_hw *hw)
19279251f5eSSepherosa Ziehau {
19379251f5eSSepherosa Ziehau 	struct ixgbe_mac_info *mac = &hw->mac;
19479251f5eSSepherosa Ziehau 	struct ixgbe_phy_info *phy = &hw->phy;
19579251f5eSSepherosa Ziehau 	s32 ret_val = IXGBE_SUCCESS;
19679251f5eSSepherosa Ziehau 	u16 list_offset, data_offset;
19779251f5eSSepherosa Ziehau 
19879251f5eSSepherosa Ziehau 	DEBUGFUNC("ixgbe_init_phy_ops_82598");
19979251f5eSSepherosa Ziehau 
20079251f5eSSepherosa Ziehau 	/* Identify the PHY */
20179251f5eSSepherosa Ziehau 	phy->ops.identify(hw);
20279251f5eSSepherosa Ziehau 
20379251f5eSSepherosa Ziehau 	/* Overwrite the link function pointers if copper PHY */
20479251f5eSSepherosa Ziehau 	if (mac->ops.get_media_type(hw) == ixgbe_media_type_copper) {
20563d483cdSSepherosa Ziehau 		mac->ops.setup_link = ixgbe_setup_copper_link_82598;
20679251f5eSSepherosa Ziehau 		mac->ops.get_link_capabilities =
20763d483cdSSepherosa Ziehau 				ixgbe_get_copper_link_capabilities_generic;
20879251f5eSSepherosa Ziehau 	}
20979251f5eSSepherosa Ziehau 
21079251f5eSSepherosa Ziehau 	switch (hw->phy.type) {
21179251f5eSSepherosa Ziehau 	case ixgbe_phy_tn:
21263d483cdSSepherosa Ziehau 		phy->ops.setup_link = ixgbe_setup_phy_link_tnx;
21363d483cdSSepherosa Ziehau 		phy->ops.check_link = ixgbe_check_phy_link_tnx;
21479251f5eSSepherosa Ziehau 		phy->ops.get_firmware_version =
21563d483cdSSepherosa Ziehau 					ixgbe_get_phy_firmware_version_tnx;
21679251f5eSSepherosa Ziehau 		break;
21779251f5eSSepherosa Ziehau 	case ixgbe_phy_nl:
21863d483cdSSepherosa Ziehau 		phy->ops.reset = ixgbe_reset_phy_nl;
21979251f5eSSepherosa Ziehau 
22079251f5eSSepherosa Ziehau 		/* Call SFP+ identify routine to get the SFP+ module type */
22179251f5eSSepherosa Ziehau 		ret_val = phy->ops.identify_sfp(hw);
22279251f5eSSepherosa Ziehau 		if (ret_val != IXGBE_SUCCESS)
22379251f5eSSepherosa Ziehau 			goto out;
22479251f5eSSepherosa Ziehau 		else if (hw->phy.sfp_type == ixgbe_sfp_type_unknown) {
22579251f5eSSepherosa Ziehau 			ret_val = IXGBE_ERR_SFP_NOT_SUPPORTED;
22679251f5eSSepherosa Ziehau 			goto out;
22779251f5eSSepherosa Ziehau 		}
22879251f5eSSepherosa Ziehau 
22979251f5eSSepherosa Ziehau 		/* Check to see if SFP+ module is supported */
23079251f5eSSepherosa Ziehau 		ret_val = ixgbe_get_sfp_init_sequence_offsets(hw,
23179251f5eSSepherosa Ziehau 							      &list_offset,
23279251f5eSSepherosa Ziehau 							      &data_offset);
23379251f5eSSepherosa Ziehau 		if (ret_val != IXGBE_SUCCESS) {
23479251f5eSSepherosa Ziehau 			ret_val = IXGBE_ERR_SFP_NOT_SUPPORTED;
23579251f5eSSepherosa Ziehau 			goto out;
23679251f5eSSepherosa Ziehau 		}
23779251f5eSSepherosa Ziehau 		break;
23879251f5eSSepherosa Ziehau 	default:
23979251f5eSSepherosa Ziehau 		break;
24079251f5eSSepherosa Ziehau 	}
24179251f5eSSepherosa Ziehau 
24279251f5eSSepherosa Ziehau out:
24379251f5eSSepherosa Ziehau 	return ret_val;
24479251f5eSSepherosa Ziehau }
24579251f5eSSepherosa Ziehau 
24679251f5eSSepherosa Ziehau /**
24779251f5eSSepherosa Ziehau  *  ixgbe_start_hw_82598 - Prepare hardware for Tx/Rx
24879251f5eSSepherosa Ziehau  *  @hw: pointer to hardware structure
24979251f5eSSepherosa Ziehau  *
25079251f5eSSepherosa Ziehau  *  Starts the hardware using the generic start_hw function.
25179251f5eSSepherosa Ziehau  *  Disables relaxed ordering Then set pcie completion timeout
25279251f5eSSepherosa Ziehau  *
25379251f5eSSepherosa Ziehau  **/
ixgbe_start_hw_82598(struct ixgbe_hw * hw)25479251f5eSSepherosa Ziehau s32 ixgbe_start_hw_82598(struct ixgbe_hw *hw)
25579251f5eSSepherosa Ziehau {
25679251f5eSSepherosa Ziehau 	u32 regval;
25779251f5eSSepherosa Ziehau 	u32 i;
25879251f5eSSepherosa Ziehau 	s32 ret_val = IXGBE_SUCCESS;
25979251f5eSSepherosa Ziehau 
26079251f5eSSepherosa Ziehau 	DEBUGFUNC("ixgbe_start_hw_82598");
26179251f5eSSepherosa Ziehau 
26279251f5eSSepherosa Ziehau 	ret_val = ixgbe_start_hw_generic(hw);
26363d483cdSSepherosa Ziehau 	if (ret_val)
26463d483cdSSepherosa Ziehau 		return ret_val;
26579251f5eSSepherosa Ziehau 
26679251f5eSSepherosa Ziehau 	/* Disable relaxed ordering */
26779251f5eSSepherosa Ziehau 	for (i = 0; ((i < hw->mac.max_tx_queues) &&
26879251f5eSSepherosa Ziehau 	     (i < IXGBE_DCA_MAX_QUEUES_82598)); i++) {
26979251f5eSSepherosa Ziehau 		regval = IXGBE_READ_REG(hw, IXGBE_DCA_TXCTRL(i));
27079251f5eSSepherosa Ziehau 		regval &= ~IXGBE_DCA_TXCTRL_DESC_WRO_EN;
27179251f5eSSepherosa Ziehau 		IXGBE_WRITE_REG(hw, IXGBE_DCA_TXCTRL(i), regval);
27279251f5eSSepherosa Ziehau 	}
27379251f5eSSepherosa Ziehau 
27479251f5eSSepherosa Ziehau 	for (i = 0; ((i < hw->mac.max_rx_queues) &&
27579251f5eSSepherosa Ziehau 	     (i < IXGBE_DCA_MAX_QUEUES_82598)); i++) {
27679251f5eSSepherosa Ziehau 		regval = IXGBE_READ_REG(hw, IXGBE_DCA_RXCTRL(i));
27779251f5eSSepherosa Ziehau 		regval &= ~(IXGBE_DCA_RXCTRL_DATA_WRO_EN |
27879251f5eSSepherosa Ziehau 			    IXGBE_DCA_RXCTRL_HEAD_WRO_EN);
27979251f5eSSepherosa Ziehau 		IXGBE_WRITE_REG(hw, IXGBE_DCA_RXCTRL(i), regval);
28079251f5eSSepherosa Ziehau 	}
28179251f5eSSepherosa Ziehau 
28279251f5eSSepherosa Ziehau 	/* set the completion timeout for interface */
28379251f5eSSepherosa Ziehau 	ixgbe_set_pcie_completion_timeout(hw);
28479251f5eSSepherosa Ziehau 
28579251f5eSSepherosa Ziehau 	return ret_val;
28679251f5eSSepherosa Ziehau }
28779251f5eSSepherosa Ziehau 
28879251f5eSSepherosa Ziehau /**
28979251f5eSSepherosa Ziehau  *  ixgbe_get_link_capabilities_82598 - Determines link capabilities
29079251f5eSSepherosa Ziehau  *  @hw: pointer to hardware structure
29179251f5eSSepherosa Ziehau  *  @speed: pointer to link speed
29279251f5eSSepherosa Ziehau  *  @autoneg: boolean auto-negotiation value
29379251f5eSSepherosa Ziehau  *
29479251f5eSSepherosa Ziehau  *  Determines the link capabilities by reading the AUTOC register.
29579251f5eSSepherosa Ziehau  **/
ixgbe_get_link_capabilities_82598(struct ixgbe_hw * hw,ixgbe_link_speed * speed,bool * autoneg)29679251f5eSSepherosa Ziehau static s32 ixgbe_get_link_capabilities_82598(struct ixgbe_hw *hw,
29779251f5eSSepherosa Ziehau 					     ixgbe_link_speed *speed,
29879251f5eSSepherosa Ziehau 					     bool *autoneg)
29979251f5eSSepherosa Ziehau {
30079251f5eSSepherosa Ziehau 	s32 status = IXGBE_SUCCESS;
30179251f5eSSepherosa Ziehau 	u32 autoc = 0;
30279251f5eSSepherosa Ziehau 
30379251f5eSSepherosa Ziehau 	DEBUGFUNC("ixgbe_get_link_capabilities_82598");
30479251f5eSSepherosa Ziehau 
30579251f5eSSepherosa Ziehau 	/*
30679251f5eSSepherosa Ziehau 	 * Determine link capabilities based on the stored value of AUTOC,
30779251f5eSSepherosa Ziehau 	 * which represents EEPROM defaults.  If AUTOC value has not been
30879251f5eSSepherosa Ziehau 	 * stored, use the current register value.
30979251f5eSSepherosa Ziehau 	 */
31079251f5eSSepherosa Ziehau 	if (hw->mac.orig_link_settings_stored)
31179251f5eSSepherosa Ziehau 		autoc = hw->mac.orig_autoc;
31279251f5eSSepherosa Ziehau 	else
31379251f5eSSepherosa Ziehau 		autoc = IXGBE_READ_REG(hw, IXGBE_AUTOC);
31479251f5eSSepherosa Ziehau 
31579251f5eSSepherosa Ziehau 	switch (autoc & IXGBE_AUTOC_LMS_MASK) {
31679251f5eSSepherosa Ziehau 	case IXGBE_AUTOC_LMS_1G_LINK_NO_AN:
31779251f5eSSepherosa Ziehau 		*speed = IXGBE_LINK_SPEED_1GB_FULL;
31879251f5eSSepherosa Ziehau 		*autoneg = FALSE;
31979251f5eSSepherosa Ziehau 		break;
32079251f5eSSepherosa Ziehau 
32179251f5eSSepherosa Ziehau 	case IXGBE_AUTOC_LMS_10G_LINK_NO_AN:
32279251f5eSSepherosa Ziehau 		*speed = IXGBE_LINK_SPEED_10GB_FULL;
32379251f5eSSepherosa Ziehau 		*autoneg = FALSE;
32479251f5eSSepherosa Ziehau 		break;
32579251f5eSSepherosa Ziehau 
32679251f5eSSepherosa Ziehau 	case IXGBE_AUTOC_LMS_1G_AN:
32779251f5eSSepherosa Ziehau 		*speed = IXGBE_LINK_SPEED_1GB_FULL;
32879251f5eSSepherosa Ziehau 		*autoneg = TRUE;
32979251f5eSSepherosa Ziehau 		break;
33079251f5eSSepherosa Ziehau 
33179251f5eSSepherosa Ziehau 	case IXGBE_AUTOC_LMS_KX4_AN:
33279251f5eSSepherosa Ziehau 	case IXGBE_AUTOC_LMS_KX4_AN_1G_AN:
33379251f5eSSepherosa Ziehau 		*speed = IXGBE_LINK_SPEED_UNKNOWN;
33479251f5eSSepherosa Ziehau 		if (autoc & IXGBE_AUTOC_KX4_SUPP)
33579251f5eSSepherosa Ziehau 			*speed |= IXGBE_LINK_SPEED_10GB_FULL;
33679251f5eSSepherosa Ziehau 		if (autoc & IXGBE_AUTOC_KX_SUPP)
33779251f5eSSepherosa Ziehau 			*speed |= IXGBE_LINK_SPEED_1GB_FULL;
33879251f5eSSepherosa Ziehau 		*autoneg = TRUE;
33979251f5eSSepherosa Ziehau 		break;
34079251f5eSSepherosa Ziehau 
34179251f5eSSepherosa Ziehau 	default:
34279251f5eSSepherosa Ziehau 		status = IXGBE_ERR_LINK_SETUP;
34379251f5eSSepherosa Ziehau 		break;
34479251f5eSSepherosa Ziehau 	}
34579251f5eSSepherosa Ziehau 
34679251f5eSSepherosa Ziehau 	return status;
34779251f5eSSepherosa Ziehau }
34879251f5eSSepherosa Ziehau 
34979251f5eSSepherosa Ziehau /**
35079251f5eSSepherosa Ziehau  *  ixgbe_get_media_type_82598 - Determines media type
35179251f5eSSepherosa Ziehau  *  @hw: pointer to hardware structure
35279251f5eSSepherosa Ziehau  *
35379251f5eSSepherosa Ziehau  *  Returns the media type (fiber, copper, backplane)
35479251f5eSSepherosa Ziehau  **/
ixgbe_get_media_type_82598(struct ixgbe_hw * hw)35579251f5eSSepherosa Ziehau static enum ixgbe_media_type ixgbe_get_media_type_82598(struct ixgbe_hw *hw)
35679251f5eSSepherosa Ziehau {
35779251f5eSSepherosa Ziehau 	enum ixgbe_media_type media_type;
35879251f5eSSepherosa Ziehau 
35979251f5eSSepherosa Ziehau 	DEBUGFUNC("ixgbe_get_media_type_82598");
36079251f5eSSepherosa Ziehau 
36179251f5eSSepherosa Ziehau 	/* Detect if there is a copper PHY attached. */
36279251f5eSSepherosa Ziehau 	switch (hw->phy.type) {
36379251f5eSSepherosa Ziehau 	case ixgbe_phy_cu_unknown:
36479251f5eSSepherosa Ziehau 	case ixgbe_phy_tn:
36579251f5eSSepherosa Ziehau 		media_type = ixgbe_media_type_copper;
36679251f5eSSepherosa Ziehau 		goto out;
36779251f5eSSepherosa Ziehau 	default:
36879251f5eSSepherosa Ziehau 		break;
36979251f5eSSepherosa Ziehau 	}
37079251f5eSSepherosa Ziehau 
37179251f5eSSepherosa Ziehau 	/* Media type for I82598 is based on device ID */
37279251f5eSSepherosa Ziehau 	switch (hw->device_id) {
37379251f5eSSepherosa Ziehau 	case IXGBE_DEV_ID_82598:
37479251f5eSSepherosa Ziehau 	case IXGBE_DEV_ID_82598_BX:
37579251f5eSSepherosa Ziehau 		/* Default device ID is mezzanine card KX/KX4 */
37679251f5eSSepherosa Ziehau 		media_type = ixgbe_media_type_backplane;
37779251f5eSSepherosa Ziehau 		break;
37879251f5eSSepherosa Ziehau 	case IXGBE_DEV_ID_82598AF_DUAL_PORT:
37979251f5eSSepherosa Ziehau 	case IXGBE_DEV_ID_82598AF_SINGLE_PORT:
38079251f5eSSepherosa Ziehau 	case IXGBE_DEV_ID_82598_DA_DUAL_PORT:
38179251f5eSSepherosa Ziehau 	case IXGBE_DEV_ID_82598_SR_DUAL_PORT_EM:
38279251f5eSSepherosa Ziehau 	case IXGBE_DEV_ID_82598EB_XF_LR:
38379251f5eSSepherosa Ziehau 	case IXGBE_DEV_ID_82598EB_SFP_LOM:
38479251f5eSSepherosa Ziehau 		media_type = ixgbe_media_type_fiber;
38579251f5eSSepherosa Ziehau 		break;
38679251f5eSSepherosa Ziehau 	case IXGBE_DEV_ID_82598EB_CX4:
38779251f5eSSepherosa Ziehau 	case IXGBE_DEV_ID_82598_CX4_DUAL_PORT:
38879251f5eSSepherosa Ziehau 		media_type = ixgbe_media_type_cx4;
38979251f5eSSepherosa Ziehau 		break;
39079251f5eSSepherosa Ziehau 	case IXGBE_DEV_ID_82598AT:
39179251f5eSSepherosa Ziehau 	case IXGBE_DEV_ID_82598AT2:
39279251f5eSSepherosa Ziehau 		media_type = ixgbe_media_type_copper;
39379251f5eSSepherosa Ziehau 		break;
39479251f5eSSepherosa Ziehau 	default:
39579251f5eSSepherosa Ziehau 		media_type = ixgbe_media_type_unknown;
39679251f5eSSepherosa Ziehau 		break;
39779251f5eSSepherosa Ziehau 	}
39879251f5eSSepherosa Ziehau out:
39979251f5eSSepherosa Ziehau 	return media_type;
40079251f5eSSepherosa Ziehau }
40179251f5eSSepherosa Ziehau 
40279251f5eSSepherosa Ziehau /**
40379251f5eSSepherosa Ziehau  *  ixgbe_fc_enable_82598 - Enable flow control
40479251f5eSSepherosa Ziehau  *  @hw: pointer to hardware structure
40579251f5eSSepherosa Ziehau  *
40679251f5eSSepherosa Ziehau  *  Enable flow control according to the current settings.
40779251f5eSSepherosa Ziehau  **/
ixgbe_fc_enable_82598(struct ixgbe_hw * hw)40879251f5eSSepherosa Ziehau s32 ixgbe_fc_enable_82598(struct ixgbe_hw *hw)
40979251f5eSSepherosa Ziehau {
41079251f5eSSepherosa Ziehau 	s32 ret_val = IXGBE_SUCCESS;
41179251f5eSSepherosa Ziehau 	u32 fctrl_reg;
41279251f5eSSepherosa Ziehau 	u32 rmcs_reg;
41379251f5eSSepherosa Ziehau 	u32 reg;
41479251f5eSSepherosa Ziehau 	u32 fcrtl, fcrth;
41579251f5eSSepherosa Ziehau 	u32 link_speed = 0;
41679251f5eSSepherosa Ziehau 	int i;
41779251f5eSSepherosa Ziehau 	bool link_up;
41879251f5eSSepherosa Ziehau 
41979251f5eSSepherosa Ziehau 	DEBUGFUNC("ixgbe_fc_enable_82598");
42079251f5eSSepherosa Ziehau 
42179251f5eSSepherosa Ziehau 	/* Validate the water mark configuration */
42279251f5eSSepherosa Ziehau 	if (!hw->fc.pause_time) {
42379251f5eSSepherosa Ziehau 		ret_val = IXGBE_ERR_INVALID_LINK_SETTINGS;
42479251f5eSSepherosa Ziehau 		goto out;
42579251f5eSSepherosa Ziehau 	}
42679251f5eSSepherosa Ziehau 
42779251f5eSSepherosa Ziehau 	/* Low water mark of zero causes XOFF floods */
42879251f5eSSepherosa Ziehau 	for (i = 0; i < IXGBE_DCB_MAX_TRAFFIC_CLASS; i++) {
42979251f5eSSepherosa Ziehau 		if ((hw->fc.current_mode & ixgbe_fc_tx_pause) &&
43079251f5eSSepherosa Ziehau 		    hw->fc.high_water[i]) {
43179251f5eSSepherosa Ziehau 			if (!hw->fc.low_water[i] ||
43279251f5eSSepherosa Ziehau 			    hw->fc.low_water[i] >= hw->fc.high_water[i]) {
43379251f5eSSepherosa Ziehau 				DEBUGOUT("Invalid water mark configuration\n");
43479251f5eSSepherosa Ziehau 				ret_val = IXGBE_ERR_INVALID_LINK_SETTINGS;
43579251f5eSSepherosa Ziehau 				goto out;
43679251f5eSSepherosa Ziehau 			}
43779251f5eSSepherosa Ziehau 		}
43879251f5eSSepherosa Ziehau 	}
43979251f5eSSepherosa Ziehau 
44079251f5eSSepherosa Ziehau 	/*
44179251f5eSSepherosa Ziehau 	 * On 82598 having Rx FC on causes resets while doing 1G
44279251f5eSSepherosa Ziehau 	 * so if it's on turn it off once we know link_speed. For
44379251f5eSSepherosa Ziehau 	 * more details see 82598 Specification update.
44479251f5eSSepherosa Ziehau 	 */
44579251f5eSSepherosa Ziehau 	hw->mac.ops.check_link(hw, &link_speed, &link_up, FALSE);
44679251f5eSSepherosa Ziehau 	if (link_up && link_speed == IXGBE_LINK_SPEED_1GB_FULL) {
44779251f5eSSepherosa Ziehau 		switch (hw->fc.requested_mode) {
44879251f5eSSepherosa Ziehau 		case ixgbe_fc_full:
44979251f5eSSepherosa Ziehau 			hw->fc.requested_mode = ixgbe_fc_tx_pause;
45079251f5eSSepherosa Ziehau 			break;
45179251f5eSSepherosa Ziehau 		case ixgbe_fc_rx_pause:
45279251f5eSSepherosa Ziehau 			hw->fc.requested_mode = ixgbe_fc_none;
45379251f5eSSepherosa Ziehau 			break;
45479251f5eSSepherosa Ziehau 		default:
45579251f5eSSepherosa Ziehau 			/* no change */
45679251f5eSSepherosa Ziehau 			break;
45779251f5eSSepherosa Ziehau 		}
45879251f5eSSepherosa Ziehau 	}
45979251f5eSSepherosa Ziehau 
46079251f5eSSepherosa Ziehau 	/* Negotiate the fc mode to use */
46179251f5eSSepherosa Ziehau 	ixgbe_fc_autoneg(hw);
46279251f5eSSepherosa Ziehau 
46379251f5eSSepherosa Ziehau 	/* Disable any previous flow control settings */
46479251f5eSSepherosa Ziehau 	fctrl_reg = IXGBE_READ_REG(hw, IXGBE_FCTRL);
46579251f5eSSepherosa Ziehau 	fctrl_reg &= ~(IXGBE_FCTRL_RFCE | IXGBE_FCTRL_RPFCE);
46679251f5eSSepherosa Ziehau 
46779251f5eSSepherosa Ziehau 	rmcs_reg = IXGBE_READ_REG(hw, IXGBE_RMCS);
46879251f5eSSepherosa Ziehau 	rmcs_reg &= ~(IXGBE_RMCS_TFCE_PRIORITY | IXGBE_RMCS_TFCE_802_3X);
46979251f5eSSepherosa Ziehau 
47079251f5eSSepherosa Ziehau 	/*
47179251f5eSSepherosa Ziehau 	 * The possible values of fc.current_mode are:
47279251f5eSSepherosa Ziehau 	 * 0: Flow control is completely disabled
47379251f5eSSepherosa Ziehau 	 * 1: Rx flow control is enabled (we can receive pause frames,
47479251f5eSSepherosa Ziehau 	 *    but not send pause frames).
47579251f5eSSepherosa Ziehau 	 * 2: Tx flow control is enabled (we can send pause frames but
47679251f5eSSepherosa Ziehau 	 *     we do not support receiving pause frames).
47779251f5eSSepherosa Ziehau 	 * 3: Both Rx and Tx flow control (symmetric) are enabled.
47879251f5eSSepherosa Ziehau 	 * other: Invalid.
47979251f5eSSepherosa Ziehau 	 */
48079251f5eSSepherosa Ziehau 	switch (hw->fc.current_mode) {
48179251f5eSSepherosa Ziehau 	case ixgbe_fc_none:
48279251f5eSSepherosa Ziehau 		/*
48379251f5eSSepherosa Ziehau 		 * Flow control is disabled by software override or autoneg.
48479251f5eSSepherosa Ziehau 		 * The code below will actually disable it in the HW.
48579251f5eSSepherosa Ziehau 		 */
48679251f5eSSepherosa Ziehau 		break;
48779251f5eSSepherosa Ziehau 	case ixgbe_fc_rx_pause:
48879251f5eSSepherosa Ziehau 		/*
48979251f5eSSepherosa Ziehau 		 * Rx Flow control is enabled and Tx Flow control is
49079251f5eSSepherosa Ziehau 		 * disabled by software override. Since there really
49179251f5eSSepherosa Ziehau 		 * isn't a way to advertise that we are capable of RX
49279251f5eSSepherosa Ziehau 		 * Pause ONLY, we will advertise that we support both
49379251f5eSSepherosa Ziehau 		 * symmetric and asymmetric Rx PAUSE.  Later, we will
49479251f5eSSepherosa Ziehau 		 * disable the adapter's ability to send PAUSE frames.
49579251f5eSSepherosa Ziehau 		 */
49679251f5eSSepherosa Ziehau 		fctrl_reg |= IXGBE_FCTRL_RFCE;
49779251f5eSSepherosa Ziehau 		break;
49879251f5eSSepherosa Ziehau 	case ixgbe_fc_tx_pause:
49979251f5eSSepherosa Ziehau 		/*
50079251f5eSSepherosa Ziehau 		 * Tx Flow control is enabled, and Rx Flow control is
50179251f5eSSepherosa Ziehau 		 * disabled by software override.
50279251f5eSSepherosa Ziehau 		 */
50379251f5eSSepherosa Ziehau 		rmcs_reg |= IXGBE_RMCS_TFCE_802_3X;
50479251f5eSSepherosa Ziehau 		break;
50579251f5eSSepherosa Ziehau 	case ixgbe_fc_full:
50679251f5eSSepherosa Ziehau 		/* Flow control (both Rx and Tx) is enabled by SW override. */
50779251f5eSSepherosa Ziehau 		fctrl_reg |= IXGBE_FCTRL_RFCE;
50879251f5eSSepherosa Ziehau 		rmcs_reg |= IXGBE_RMCS_TFCE_802_3X;
50979251f5eSSepherosa Ziehau 		break;
51079251f5eSSepherosa Ziehau 	default:
51179251f5eSSepherosa Ziehau 		DEBUGOUT("Flow control param set incorrectly\n");
51279251f5eSSepherosa Ziehau 		ret_val = IXGBE_ERR_CONFIG;
51379251f5eSSepherosa Ziehau 		goto out;
51479251f5eSSepherosa Ziehau 		break;
51579251f5eSSepherosa Ziehau 	}
51679251f5eSSepherosa Ziehau 
51779251f5eSSepherosa Ziehau 	/* Set 802.3x based flow control settings. */
51879251f5eSSepherosa Ziehau 	fctrl_reg |= IXGBE_FCTRL_DPF;
51979251f5eSSepherosa Ziehau 	IXGBE_WRITE_REG(hw, IXGBE_FCTRL, fctrl_reg);
52079251f5eSSepherosa Ziehau 	IXGBE_WRITE_REG(hw, IXGBE_RMCS, rmcs_reg);
52179251f5eSSepherosa Ziehau 
52279251f5eSSepherosa Ziehau 	/* Set up and enable Rx high/low water mark thresholds, enable XON. */
52379251f5eSSepherosa Ziehau 	for (i = 0; i < IXGBE_DCB_MAX_TRAFFIC_CLASS; i++) {
52479251f5eSSepherosa Ziehau 		if ((hw->fc.current_mode & ixgbe_fc_tx_pause) &&
52579251f5eSSepherosa Ziehau 		    hw->fc.high_water[i]) {
52679251f5eSSepherosa Ziehau 			fcrtl = (hw->fc.low_water[i] << 10) | IXGBE_FCRTL_XONE;
52779251f5eSSepherosa Ziehau 			fcrth = (hw->fc.high_water[i] << 10) | IXGBE_FCRTH_FCEN;
52879251f5eSSepherosa Ziehau 			IXGBE_WRITE_REG(hw, IXGBE_FCRTL(i), fcrtl);
52979251f5eSSepherosa Ziehau 			IXGBE_WRITE_REG(hw, IXGBE_FCRTH(i), fcrth);
53079251f5eSSepherosa Ziehau 		} else {
53179251f5eSSepherosa Ziehau 			IXGBE_WRITE_REG(hw, IXGBE_FCRTL(i), 0);
53279251f5eSSepherosa Ziehau 			IXGBE_WRITE_REG(hw, IXGBE_FCRTH(i), 0);
53379251f5eSSepherosa Ziehau 		}
53479251f5eSSepherosa Ziehau 
53579251f5eSSepherosa Ziehau 	}
53679251f5eSSepherosa Ziehau 
53779251f5eSSepherosa Ziehau 	/* Configure pause time (2 TCs per register) */
53879251f5eSSepherosa Ziehau 	reg = hw->fc.pause_time * 0x00010001;
53979251f5eSSepherosa Ziehau 	for (i = 0; i < (IXGBE_DCB_MAX_TRAFFIC_CLASS / 2); i++)
54079251f5eSSepherosa Ziehau 		IXGBE_WRITE_REG(hw, IXGBE_FCTTV(i), reg);
54179251f5eSSepherosa Ziehau 
54279251f5eSSepherosa Ziehau 	/* Configure flow control refresh threshold value */
54379251f5eSSepherosa Ziehau 	IXGBE_WRITE_REG(hw, IXGBE_FCRTV, hw->fc.pause_time / 2);
54479251f5eSSepherosa Ziehau 
54579251f5eSSepherosa Ziehau out:
54679251f5eSSepherosa Ziehau 	return ret_val;
54779251f5eSSepherosa Ziehau }
54879251f5eSSepherosa Ziehau 
54979251f5eSSepherosa Ziehau /**
55079251f5eSSepherosa Ziehau  *  ixgbe_start_mac_link_82598 - Configures MAC link settings
55179251f5eSSepherosa Ziehau  *  @hw: pointer to hardware structure
552*dd5ce676SSepherosa Ziehau  *  @autoneg_wait_to_complete: TRUE when waiting for completion is needed
55379251f5eSSepherosa Ziehau  *
55479251f5eSSepherosa Ziehau  *  Configures link settings based on values in the ixgbe_hw struct.
55579251f5eSSepherosa Ziehau  *  Restarts the link.  Performs autonegotiation if needed.
55679251f5eSSepherosa Ziehau  **/
ixgbe_start_mac_link_82598(struct ixgbe_hw * hw,bool autoneg_wait_to_complete)55779251f5eSSepherosa Ziehau static s32 ixgbe_start_mac_link_82598(struct ixgbe_hw *hw,
55879251f5eSSepherosa Ziehau 				      bool autoneg_wait_to_complete)
55979251f5eSSepherosa Ziehau {
56079251f5eSSepherosa Ziehau 	u32 autoc_reg;
56179251f5eSSepherosa Ziehau 	u32 links_reg;
56279251f5eSSepherosa Ziehau 	u32 i;
56379251f5eSSepherosa Ziehau 	s32 status = IXGBE_SUCCESS;
56479251f5eSSepherosa Ziehau 
56579251f5eSSepherosa Ziehau 	DEBUGFUNC("ixgbe_start_mac_link_82598");
56679251f5eSSepherosa Ziehau 
56779251f5eSSepherosa Ziehau 	/* Restart link */
56879251f5eSSepherosa Ziehau 	autoc_reg = IXGBE_READ_REG(hw, IXGBE_AUTOC);
56979251f5eSSepherosa Ziehau 	autoc_reg |= IXGBE_AUTOC_AN_RESTART;
57079251f5eSSepherosa Ziehau 	IXGBE_WRITE_REG(hw, IXGBE_AUTOC, autoc_reg);
57179251f5eSSepherosa Ziehau 
57279251f5eSSepherosa Ziehau 	/* Only poll for autoneg to complete if specified to do so */
57379251f5eSSepherosa Ziehau 	if (autoneg_wait_to_complete) {
57479251f5eSSepherosa Ziehau 		if ((autoc_reg & IXGBE_AUTOC_LMS_MASK) ==
57579251f5eSSepherosa Ziehau 		     IXGBE_AUTOC_LMS_KX4_AN ||
57679251f5eSSepherosa Ziehau 		    (autoc_reg & IXGBE_AUTOC_LMS_MASK) ==
57779251f5eSSepherosa Ziehau 		     IXGBE_AUTOC_LMS_KX4_AN_1G_AN) {
57879251f5eSSepherosa Ziehau 			links_reg = 0; /* Just in case Autoneg time = 0 */
57979251f5eSSepherosa Ziehau 			for (i = 0; i < IXGBE_AUTO_NEG_TIME; i++) {
58079251f5eSSepherosa Ziehau 				links_reg = IXGBE_READ_REG(hw, IXGBE_LINKS);
58179251f5eSSepherosa Ziehau 				if (links_reg & IXGBE_LINKS_KX_AN_COMP)
58279251f5eSSepherosa Ziehau 					break;
58379251f5eSSepherosa Ziehau 				msec_delay(100);
58479251f5eSSepherosa Ziehau 			}
58579251f5eSSepherosa Ziehau 			if (!(links_reg & IXGBE_LINKS_KX_AN_COMP)) {
58679251f5eSSepherosa Ziehau 				status = IXGBE_ERR_AUTONEG_NOT_COMPLETE;
58779251f5eSSepherosa Ziehau 				DEBUGOUT("Autonegotiation did not complete.\n");
58879251f5eSSepherosa Ziehau 			}
58979251f5eSSepherosa Ziehau 		}
59079251f5eSSepherosa Ziehau 	}
59179251f5eSSepherosa Ziehau 
59279251f5eSSepherosa Ziehau 	/* Add delay to filter out noises during initial link setup */
59379251f5eSSepherosa Ziehau 	msec_delay(50);
59479251f5eSSepherosa Ziehau 
59579251f5eSSepherosa Ziehau 	return status;
59679251f5eSSepherosa Ziehau }
59779251f5eSSepherosa Ziehau 
59879251f5eSSepherosa Ziehau /**
59979251f5eSSepherosa Ziehau  *  ixgbe_validate_link_ready - Function looks for phy link
60079251f5eSSepherosa Ziehau  *  @hw: pointer to hardware structure
60179251f5eSSepherosa Ziehau  *
60279251f5eSSepherosa Ziehau  *  Function indicates success when phy link is available. If phy is not ready
60379251f5eSSepherosa Ziehau  *  within 5 seconds of MAC indicating link, the function returns error.
60479251f5eSSepherosa Ziehau  **/
ixgbe_validate_link_ready(struct ixgbe_hw * hw)60579251f5eSSepherosa Ziehau static s32 ixgbe_validate_link_ready(struct ixgbe_hw *hw)
60679251f5eSSepherosa Ziehau {
60779251f5eSSepherosa Ziehau 	u32 timeout;
60879251f5eSSepherosa Ziehau 	u16 an_reg;
60979251f5eSSepherosa Ziehau 
61079251f5eSSepherosa Ziehau 	if (hw->device_id != IXGBE_DEV_ID_82598AT2)
61179251f5eSSepherosa Ziehau 		return IXGBE_SUCCESS;
61279251f5eSSepherosa Ziehau 
61379251f5eSSepherosa Ziehau 	for (timeout = 0;
61479251f5eSSepherosa Ziehau 	     timeout < IXGBE_VALIDATE_LINK_READY_TIMEOUT; timeout++) {
61579251f5eSSepherosa Ziehau 		hw->phy.ops.read_reg(hw, IXGBE_MDIO_AUTO_NEG_STATUS,
61679251f5eSSepherosa Ziehau 				     IXGBE_MDIO_AUTO_NEG_DEV_TYPE, &an_reg);
61779251f5eSSepherosa Ziehau 
61879251f5eSSepherosa Ziehau 		if ((an_reg & IXGBE_MII_AUTONEG_COMPLETE) &&
61979251f5eSSepherosa Ziehau 		    (an_reg & IXGBE_MII_AUTONEG_LINK_UP))
62079251f5eSSepherosa Ziehau 			break;
62179251f5eSSepherosa Ziehau 
62279251f5eSSepherosa Ziehau 		msec_delay(100);
62379251f5eSSepherosa Ziehau 	}
62479251f5eSSepherosa Ziehau 
62579251f5eSSepherosa Ziehau 	if (timeout == IXGBE_VALIDATE_LINK_READY_TIMEOUT) {
62679251f5eSSepherosa Ziehau 		DEBUGOUT("Link was indicated but link is down\n");
62779251f5eSSepherosa Ziehau 		return IXGBE_ERR_LINK_SETUP;
62879251f5eSSepherosa Ziehau 	}
62979251f5eSSepherosa Ziehau 
63079251f5eSSepherosa Ziehau 	return IXGBE_SUCCESS;
63179251f5eSSepherosa Ziehau }
63279251f5eSSepherosa Ziehau 
63379251f5eSSepherosa Ziehau /**
63479251f5eSSepherosa Ziehau  *  ixgbe_check_mac_link_82598 - Get link/speed status
63579251f5eSSepherosa Ziehau  *  @hw: pointer to hardware structure
63679251f5eSSepherosa Ziehau  *  @speed: pointer to link speed
63779251f5eSSepherosa Ziehau  *  @link_up: TRUE is link is up, FALSE otherwise
63879251f5eSSepherosa Ziehau  *  @link_up_wait_to_complete: bool used to wait for link up or not
63979251f5eSSepherosa Ziehau  *
64079251f5eSSepherosa Ziehau  *  Reads the links register to determine if link is up and the current speed
64179251f5eSSepherosa Ziehau  **/
ixgbe_check_mac_link_82598(struct ixgbe_hw * hw,ixgbe_link_speed * speed,bool * link_up,bool link_up_wait_to_complete)64279251f5eSSepherosa Ziehau static s32 ixgbe_check_mac_link_82598(struct ixgbe_hw *hw,
64379251f5eSSepherosa Ziehau 				      ixgbe_link_speed *speed, bool *link_up,
64479251f5eSSepherosa Ziehau 				      bool link_up_wait_to_complete)
64579251f5eSSepherosa Ziehau {
64679251f5eSSepherosa Ziehau 	u32 links_reg;
64779251f5eSSepherosa Ziehau 	u32 i;
64879251f5eSSepherosa Ziehau 	u16 link_reg, adapt_comp_reg;
64979251f5eSSepherosa Ziehau 
65079251f5eSSepherosa Ziehau 	DEBUGFUNC("ixgbe_check_mac_link_82598");
65179251f5eSSepherosa Ziehau 
65279251f5eSSepherosa Ziehau 	/*
65379251f5eSSepherosa Ziehau 	 * SERDES PHY requires us to read link status from undocumented
65479251f5eSSepherosa Ziehau 	 * register 0xC79F.  Bit 0 set indicates link is up/ready; clear
65579251f5eSSepherosa Ziehau 	 * indicates link down.  OxC00C is read to check that the XAUI lanes
65679251f5eSSepherosa Ziehau 	 * are active.  Bit 0 clear indicates active; set indicates inactive.
65779251f5eSSepherosa Ziehau 	 */
65879251f5eSSepherosa Ziehau 	if (hw->phy.type == ixgbe_phy_nl) {
65979251f5eSSepherosa Ziehau 		hw->phy.ops.read_reg(hw, 0xC79F, IXGBE_TWINAX_DEV, &link_reg);
66079251f5eSSepherosa Ziehau 		hw->phy.ops.read_reg(hw, 0xC79F, IXGBE_TWINAX_DEV, &link_reg);
66179251f5eSSepherosa Ziehau 		hw->phy.ops.read_reg(hw, 0xC00C, IXGBE_TWINAX_DEV,
66279251f5eSSepherosa Ziehau 				     &adapt_comp_reg);
66379251f5eSSepherosa Ziehau 		if (link_up_wait_to_complete) {
6646150453fSSepherosa Ziehau 			for (i = 0; i < hw->mac.max_link_up_time; i++) {
66579251f5eSSepherosa Ziehau 				if ((link_reg & 1) &&
66679251f5eSSepherosa Ziehau 				    ((adapt_comp_reg & 1) == 0)) {
66779251f5eSSepherosa Ziehau 					*link_up = TRUE;
66879251f5eSSepherosa Ziehau 					break;
66979251f5eSSepherosa Ziehau 				} else {
67079251f5eSSepherosa Ziehau 					*link_up = FALSE;
67179251f5eSSepherosa Ziehau 				}
67279251f5eSSepherosa Ziehau 				msec_delay(100);
67379251f5eSSepherosa Ziehau 				hw->phy.ops.read_reg(hw, 0xC79F,
67479251f5eSSepherosa Ziehau 						     IXGBE_TWINAX_DEV,
67579251f5eSSepherosa Ziehau 						     &link_reg);
67679251f5eSSepherosa Ziehau 				hw->phy.ops.read_reg(hw, 0xC00C,
67779251f5eSSepherosa Ziehau 						     IXGBE_TWINAX_DEV,
67879251f5eSSepherosa Ziehau 						     &adapt_comp_reg);
67979251f5eSSepherosa Ziehau 			}
68079251f5eSSepherosa Ziehau 		} else {
68179251f5eSSepherosa Ziehau 			if ((link_reg & 1) && ((adapt_comp_reg & 1) == 0))
68279251f5eSSepherosa Ziehau 				*link_up = TRUE;
68379251f5eSSepherosa Ziehau 			else
68479251f5eSSepherosa Ziehau 				*link_up = FALSE;
68579251f5eSSepherosa Ziehau 		}
68679251f5eSSepherosa Ziehau 
68779251f5eSSepherosa Ziehau 		if (*link_up == FALSE)
68879251f5eSSepherosa Ziehau 			goto out;
68979251f5eSSepherosa Ziehau 	}
69079251f5eSSepherosa Ziehau 
69179251f5eSSepherosa Ziehau 	links_reg = IXGBE_READ_REG(hw, IXGBE_LINKS);
69279251f5eSSepherosa Ziehau 	if (link_up_wait_to_complete) {
6936150453fSSepherosa Ziehau 		for (i = 0; i < hw->mac.max_link_up_time; i++) {
69479251f5eSSepherosa Ziehau 			if (links_reg & IXGBE_LINKS_UP) {
69579251f5eSSepherosa Ziehau 				*link_up = TRUE;
69679251f5eSSepherosa Ziehau 				break;
69779251f5eSSepherosa Ziehau 			} else {
69879251f5eSSepherosa Ziehau 				*link_up = FALSE;
69979251f5eSSepherosa Ziehau 			}
70079251f5eSSepherosa Ziehau 			msec_delay(100);
70179251f5eSSepherosa Ziehau 			links_reg = IXGBE_READ_REG(hw, IXGBE_LINKS);
70279251f5eSSepherosa Ziehau 		}
70379251f5eSSepherosa Ziehau 	} else {
70479251f5eSSepherosa Ziehau 		if (links_reg & IXGBE_LINKS_UP)
70579251f5eSSepherosa Ziehau 			*link_up = TRUE;
70679251f5eSSepherosa Ziehau 		else
70779251f5eSSepherosa Ziehau 			*link_up = FALSE;
70879251f5eSSepherosa Ziehau 	}
70979251f5eSSepherosa Ziehau 
71079251f5eSSepherosa Ziehau 	if (links_reg & IXGBE_LINKS_SPEED)
71179251f5eSSepherosa Ziehau 		*speed = IXGBE_LINK_SPEED_10GB_FULL;
71279251f5eSSepherosa Ziehau 	else
71379251f5eSSepherosa Ziehau 		*speed = IXGBE_LINK_SPEED_1GB_FULL;
71479251f5eSSepherosa Ziehau 
71579251f5eSSepherosa Ziehau 	if ((hw->device_id == IXGBE_DEV_ID_82598AT2) && (*link_up == TRUE) &&
71679251f5eSSepherosa Ziehau 	    (ixgbe_validate_link_ready(hw) != IXGBE_SUCCESS))
71779251f5eSSepherosa Ziehau 		*link_up = FALSE;
71879251f5eSSepherosa Ziehau 
71979251f5eSSepherosa Ziehau out:
72079251f5eSSepherosa Ziehau 	return IXGBE_SUCCESS;
72179251f5eSSepherosa Ziehau }
72279251f5eSSepherosa Ziehau 
72379251f5eSSepherosa Ziehau /**
72479251f5eSSepherosa Ziehau  *  ixgbe_setup_mac_link_82598 - Set MAC link speed
72579251f5eSSepherosa Ziehau  *  @hw: pointer to hardware structure
72679251f5eSSepherosa Ziehau  *  @speed: new link speed
72779251f5eSSepherosa Ziehau  *  @autoneg_wait_to_complete: TRUE when waiting for completion is needed
72879251f5eSSepherosa Ziehau  *
72979251f5eSSepherosa Ziehau  *  Set the link speed in the AUTOC register and restarts link.
73079251f5eSSepherosa Ziehau  **/
ixgbe_setup_mac_link_82598(struct ixgbe_hw * hw,ixgbe_link_speed speed,bool autoneg_wait_to_complete)73179251f5eSSepherosa Ziehau static s32 ixgbe_setup_mac_link_82598(struct ixgbe_hw *hw,
73279251f5eSSepherosa Ziehau 				      ixgbe_link_speed speed,
73379251f5eSSepherosa Ziehau 				      bool autoneg_wait_to_complete)
73479251f5eSSepherosa Ziehau {
73579251f5eSSepherosa Ziehau 	bool autoneg = FALSE;
73679251f5eSSepherosa Ziehau 	s32 status = IXGBE_SUCCESS;
73779251f5eSSepherosa Ziehau 	ixgbe_link_speed link_capabilities = IXGBE_LINK_SPEED_UNKNOWN;
73879251f5eSSepherosa Ziehau 	u32 curr_autoc = IXGBE_READ_REG(hw, IXGBE_AUTOC);
73979251f5eSSepherosa Ziehau 	u32 autoc = curr_autoc;
74079251f5eSSepherosa Ziehau 	u32 link_mode = autoc & IXGBE_AUTOC_LMS_MASK;
74179251f5eSSepherosa Ziehau 
74279251f5eSSepherosa Ziehau 	DEBUGFUNC("ixgbe_setup_mac_link_82598");
74379251f5eSSepherosa Ziehau 
74479251f5eSSepherosa Ziehau 	/* Check to see if speed passed in is supported. */
74579251f5eSSepherosa Ziehau 	ixgbe_get_link_capabilities(hw, &link_capabilities, &autoneg);
74679251f5eSSepherosa Ziehau 	speed &= link_capabilities;
74779251f5eSSepherosa Ziehau 
74879251f5eSSepherosa Ziehau 	if (speed == IXGBE_LINK_SPEED_UNKNOWN)
74979251f5eSSepherosa Ziehau 		status = IXGBE_ERR_LINK_SETUP;
75079251f5eSSepherosa Ziehau 
75179251f5eSSepherosa Ziehau 	/* Set KX4/KX support according to speed requested */
75279251f5eSSepherosa Ziehau 	else if (link_mode == IXGBE_AUTOC_LMS_KX4_AN ||
75379251f5eSSepherosa Ziehau 		 link_mode == IXGBE_AUTOC_LMS_KX4_AN_1G_AN) {
75479251f5eSSepherosa Ziehau 		autoc &= ~IXGBE_AUTOC_KX4_KX_SUPP_MASK;
75579251f5eSSepherosa Ziehau 		if (speed & IXGBE_LINK_SPEED_10GB_FULL)
75679251f5eSSepherosa Ziehau 			autoc |= IXGBE_AUTOC_KX4_SUPP;
75779251f5eSSepherosa Ziehau 		if (speed & IXGBE_LINK_SPEED_1GB_FULL)
75879251f5eSSepherosa Ziehau 			autoc |= IXGBE_AUTOC_KX_SUPP;
75979251f5eSSepherosa Ziehau 		if (autoc != curr_autoc)
76079251f5eSSepherosa Ziehau 			IXGBE_WRITE_REG(hw, IXGBE_AUTOC, autoc);
76179251f5eSSepherosa Ziehau 	}
76279251f5eSSepherosa Ziehau 
76379251f5eSSepherosa Ziehau 	if (status == IXGBE_SUCCESS) {
76479251f5eSSepherosa Ziehau 		/*
76579251f5eSSepherosa Ziehau 		 * Setup and restart the link based on the new values in
76679251f5eSSepherosa Ziehau 		 * ixgbe_hw This will write the AUTOC register based on the new
76779251f5eSSepherosa Ziehau 		 * stored values
76879251f5eSSepherosa Ziehau 		 */
76979251f5eSSepherosa Ziehau 		status = ixgbe_start_mac_link_82598(hw,
77079251f5eSSepherosa Ziehau 						    autoneg_wait_to_complete);
77179251f5eSSepherosa Ziehau 	}
77279251f5eSSepherosa Ziehau 
77379251f5eSSepherosa Ziehau 	return status;
77479251f5eSSepherosa Ziehau }
77579251f5eSSepherosa Ziehau 
77679251f5eSSepherosa Ziehau 
77779251f5eSSepherosa Ziehau /**
77879251f5eSSepherosa Ziehau  *  ixgbe_setup_copper_link_82598 - Set the PHY autoneg advertised field
77979251f5eSSepherosa Ziehau  *  @hw: pointer to hardware structure
78079251f5eSSepherosa Ziehau  *  @speed: new link speed
78179251f5eSSepherosa Ziehau  *  @autoneg_wait_to_complete: TRUE if waiting is needed to complete
78279251f5eSSepherosa Ziehau  *
78379251f5eSSepherosa Ziehau  *  Sets the link speed in the AUTOC register in the MAC and restarts link.
78479251f5eSSepherosa Ziehau  **/
ixgbe_setup_copper_link_82598(struct ixgbe_hw * hw,ixgbe_link_speed speed,bool autoneg_wait_to_complete)78579251f5eSSepherosa Ziehau static s32 ixgbe_setup_copper_link_82598(struct ixgbe_hw *hw,
78679251f5eSSepherosa Ziehau 					 ixgbe_link_speed speed,
78779251f5eSSepherosa Ziehau 					 bool autoneg_wait_to_complete)
78879251f5eSSepherosa Ziehau {
78979251f5eSSepherosa Ziehau 	s32 status;
79079251f5eSSepherosa Ziehau 
79179251f5eSSepherosa Ziehau 	DEBUGFUNC("ixgbe_setup_copper_link_82598");
79279251f5eSSepherosa Ziehau 
79379251f5eSSepherosa Ziehau 	/* Setup the PHY according to input speed */
79479251f5eSSepherosa Ziehau 	status = hw->phy.ops.setup_link_speed(hw, speed,
79579251f5eSSepherosa Ziehau 					      autoneg_wait_to_complete);
79679251f5eSSepherosa Ziehau 	/* Set up MAC */
79779251f5eSSepherosa Ziehau 	ixgbe_start_mac_link_82598(hw, autoneg_wait_to_complete);
79879251f5eSSepherosa Ziehau 
79979251f5eSSepherosa Ziehau 	return status;
80079251f5eSSepherosa Ziehau }
80179251f5eSSepherosa Ziehau 
80279251f5eSSepherosa Ziehau /**
80379251f5eSSepherosa Ziehau  *  ixgbe_reset_hw_82598 - Performs hardware reset
80479251f5eSSepherosa Ziehau  *  @hw: pointer to hardware structure
80579251f5eSSepherosa Ziehau  *
80679251f5eSSepherosa Ziehau  *  Resets the hardware by resetting the transmit and receive units, masks and
80779251f5eSSepherosa Ziehau  *  clears all interrupts, performing a PHY reset, and performing a link (MAC)
80879251f5eSSepherosa Ziehau  *  reset.
80979251f5eSSepherosa Ziehau  **/
ixgbe_reset_hw_82598(struct ixgbe_hw * hw)81079251f5eSSepherosa Ziehau static s32 ixgbe_reset_hw_82598(struct ixgbe_hw *hw)
81179251f5eSSepherosa Ziehau {
81279251f5eSSepherosa Ziehau 	s32 status = IXGBE_SUCCESS;
81379251f5eSSepherosa Ziehau 	s32 phy_status = IXGBE_SUCCESS;
81479251f5eSSepherosa Ziehau 	u32 ctrl;
81579251f5eSSepherosa Ziehau 	u32 gheccr;
81679251f5eSSepherosa Ziehau 	u32 i;
81779251f5eSSepherosa Ziehau 	u32 autoc;
81879251f5eSSepherosa Ziehau 	u8  analog_val;
81979251f5eSSepherosa Ziehau 
82079251f5eSSepherosa Ziehau 	DEBUGFUNC("ixgbe_reset_hw_82598");
82179251f5eSSepherosa Ziehau 
82279251f5eSSepherosa Ziehau 	/* Call adapter stop to disable tx/rx and clear interrupts */
82379251f5eSSepherosa Ziehau 	status = hw->mac.ops.stop_adapter(hw);
82479251f5eSSepherosa Ziehau 	if (status != IXGBE_SUCCESS)
82579251f5eSSepherosa Ziehau 		goto reset_hw_out;
82679251f5eSSepherosa Ziehau 
82779251f5eSSepherosa Ziehau 	/*
82879251f5eSSepherosa Ziehau 	 * Power up the Atlas Tx lanes if they are currently powered down.
82979251f5eSSepherosa Ziehau 	 * Atlas Tx lanes are powered down for MAC loopback tests, but
83079251f5eSSepherosa Ziehau 	 * they are not automatically restored on reset.
83179251f5eSSepherosa Ziehau 	 */
83279251f5eSSepherosa Ziehau 	hw->mac.ops.read_analog_reg8(hw, IXGBE_ATLAS_PDN_LPBK, &analog_val);
83379251f5eSSepherosa Ziehau 	if (analog_val & IXGBE_ATLAS_PDN_TX_REG_EN) {
83479251f5eSSepherosa Ziehau 		/* Enable Tx Atlas so packets can be transmitted again */
83579251f5eSSepherosa Ziehau 		hw->mac.ops.read_analog_reg8(hw, IXGBE_ATLAS_PDN_LPBK,
83679251f5eSSepherosa Ziehau 					     &analog_val);
83779251f5eSSepherosa Ziehau 		analog_val &= ~IXGBE_ATLAS_PDN_TX_REG_EN;
83879251f5eSSepherosa Ziehau 		hw->mac.ops.write_analog_reg8(hw, IXGBE_ATLAS_PDN_LPBK,
83979251f5eSSepherosa Ziehau 					      analog_val);
84079251f5eSSepherosa Ziehau 
84179251f5eSSepherosa Ziehau 		hw->mac.ops.read_analog_reg8(hw, IXGBE_ATLAS_PDN_10G,
84279251f5eSSepherosa Ziehau 					     &analog_val);
84379251f5eSSepherosa Ziehau 		analog_val &= ~IXGBE_ATLAS_PDN_TX_10G_QL_ALL;
84479251f5eSSepherosa Ziehau 		hw->mac.ops.write_analog_reg8(hw, IXGBE_ATLAS_PDN_10G,
84579251f5eSSepherosa Ziehau 					      analog_val);
84679251f5eSSepherosa Ziehau 
84779251f5eSSepherosa Ziehau 		hw->mac.ops.read_analog_reg8(hw, IXGBE_ATLAS_PDN_1G,
84879251f5eSSepherosa Ziehau 					     &analog_val);
84979251f5eSSepherosa Ziehau 		analog_val &= ~IXGBE_ATLAS_PDN_TX_1G_QL_ALL;
85079251f5eSSepherosa Ziehau 		hw->mac.ops.write_analog_reg8(hw, IXGBE_ATLAS_PDN_1G,
85179251f5eSSepherosa Ziehau 					      analog_val);
85279251f5eSSepherosa Ziehau 
85379251f5eSSepherosa Ziehau 		hw->mac.ops.read_analog_reg8(hw, IXGBE_ATLAS_PDN_AN,
85479251f5eSSepherosa Ziehau 					     &analog_val);
85579251f5eSSepherosa Ziehau 		analog_val &= ~IXGBE_ATLAS_PDN_TX_AN_QL_ALL;
85679251f5eSSepherosa Ziehau 		hw->mac.ops.write_analog_reg8(hw, IXGBE_ATLAS_PDN_AN,
85779251f5eSSepherosa Ziehau 					      analog_val);
85879251f5eSSepherosa Ziehau 	}
85979251f5eSSepherosa Ziehau 
86079251f5eSSepherosa Ziehau 	/* Reset PHY */
86179251f5eSSepherosa Ziehau 	if (hw->phy.reset_disable == FALSE) {
86279251f5eSSepherosa Ziehau 		/* PHY ops must be identified and initialized prior to reset */
86379251f5eSSepherosa Ziehau 
86479251f5eSSepherosa Ziehau 		/* Init PHY and function pointers, perform SFP setup */
86579251f5eSSepherosa Ziehau 		phy_status = hw->phy.ops.init(hw);
86679251f5eSSepherosa Ziehau 		if (phy_status == IXGBE_ERR_SFP_NOT_SUPPORTED)
86779251f5eSSepherosa Ziehau 			goto reset_hw_out;
86879251f5eSSepherosa Ziehau 		if (phy_status == IXGBE_ERR_SFP_NOT_PRESENT)
86979251f5eSSepherosa Ziehau 			goto mac_reset_top;
87079251f5eSSepherosa Ziehau 
87179251f5eSSepherosa Ziehau 		hw->phy.ops.reset(hw);
87279251f5eSSepherosa Ziehau 	}
87379251f5eSSepherosa Ziehau 
87479251f5eSSepherosa Ziehau mac_reset_top:
87579251f5eSSepherosa Ziehau 	/*
87679251f5eSSepherosa Ziehau 	 * Issue global reset to the MAC.  This needs to be a SW reset.
87779251f5eSSepherosa Ziehau 	 * If link reset is used, it might reset the MAC when mng is using it
87879251f5eSSepherosa Ziehau 	 */
87979251f5eSSepherosa Ziehau 	ctrl = IXGBE_READ_REG(hw, IXGBE_CTRL) | IXGBE_CTRL_RST;
88079251f5eSSepherosa Ziehau 	IXGBE_WRITE_REG(hw, IXGBE_CTRL, ctrl);
88179251f5eSSepherosa Ziehau 	IXGBE_WRITE_FLUSH(hw);
88279251f5eSSepherosa Ziehau 
88379251f5eSSepherosa Ziehau 	/* Poll for reset bit to self-clear indicating reset is complete */
88479251f5eSSepherosa Ziehau 	for (i = 0; i < 10; i++) {
88579251f5eSSepherosa Ziehau 		usec_delay(1);
88679251f5eSSepherosa Ziehau 		ctrl = IXGBE_READ_REG(hw, IXGBE_CTRL);
88779251f5eSSepherosa Ziehau 		if (!(ctrl & IXGBE_CTRL_RST))
88879251f5eSSepherosa Ziehau 			break;
88979251f5eSSepherosa Ziehau 	}
89079251f5eSSepherosa Ziehau 	if (ctrl & IXGBE_CTRL_RST) {
89179251f5eSSepherosa Ziehau 		status = IXGBE_ERR_RESET_FAILED;
89279251f5eSSepherosa Ziehau 		DEBUGOUT("Reset polling failed to complete.\n");
89379251f5eSSepherosa Ziehau 	}
89479251f5eSSepherosa Ziehau 
89579251f5eSSepherosa Ziehau 	msec_delay(50);
89679251f5eSSepherosa Ziehau 
89779251f5eSSepherosa Ziehau 	/*
89879251f5eSSepherosa Ziehau 	 * Double resets are required for recovery from certain error
89979251f5eSSepherosa Ziehau 	 * conditions.  Between resets, it is necessary to stall to allow time
90079251f5eSSepherosa Ziehau 	 * for any pending HW events to complete.
90179251f5eSSepherosa Ziehau 	 */
90279251f5eSSepherosa Ziehau 	if (hw->mac.flags & IXGBE_FLAGS_DOUBLE_RESET_REQUIRED) {
90379251f5eSSepherosa Ziehau 		hw->mac.flags &= ~IXGBE_FLAGS_DOUBLE_RESET_REQUIRED;
90479251f5eSSepherosa Ziehau 		goto mac_reset_top;
90579251f5eSSepherosa Ziehau 	}
90679251f5eSSepherosa Ziehau 
90779251f5eSSepherosa Ziehau 	gheccr = IXGBE_READ_REG(hw, IXGBE_GHECCR);
90879251f5eSSepherosa Ziehau 	gheccr &= ~((1 << 21) | (1 << 18) | (1 << 9) | (1 << 6));
90979251f5eSSepherosa Ziehau 	IXGBE_WRITE_REG(hw, IXGBE_GHECCR, gheccr);
91079251f5eSSepherosa Ziehau 
91179251f5eSSepherosa Ziehau 	/*
91279251f5eSSepherosa Ziehau 	 * Store the original AUTOC value if it has not been
91379251f5eSSepherosa Ziehau 	 * stored off yet.  Otherwise restore the stored original
91479251f5eSSepherosa Ziehau 	 * AUTOC value since the reset operation sets back to deaults.
91579251f5eSSepherosa Ziehau 	 */
91679251f5eSSepherosa Ziehau 	autoc = IXGBE_READ_REG(hw, IXGBE_AUTOC);
91779251f5eSSepherosa Ziehau 	if (hw->mac.orig_link_settings_stored == FALSE) {
91879251f5eSSepherosa Ziehau 		hw->mac.orig_autoc = autoc;
91979251f5eSSepherosa Ziehau 		hw->mac.orig_link_settings_stored = TRUE;
92079251f5eSSepherosa Ziehau 	} else if (autoc != hw->mac.orig_autoc) {
92179251f5eSSepherosa Ziehau 		IXGBE_WRITE_REG(hw, IXGBE_AUTOC, hw->mac.orig_autoc);
92279251f5eSSepherosa Ziehau 	}
92379251f5eSSepherosa Ziehau 
92479251f5eSSepherosa Ziehau 	/* Store the permanent mac address */
92579251f5eSSepherosa Ziehau 	hw->mac.ops.get_mac_addr(hw, hw->mac.perm_addr);
92679251f5eSSepherosa Ziehau 
92779251f5eSSepherosa Ziehau 	/*
92879251f5eSSepherosa Ziehau 	 * Store MAC address from RAR0, clear receive address registers, and
92979251f5eSSepherosa Ziehau 	 * clear the multicast table
93079251f5eSSepherosa Ziehau 	 */
93179251f5eSSepherosa Ziehau 	hw->mac.ops.init_rx_addrs(hw);
93279251f5eSSepherosa Ziehau 
93379251f5eSSepherosa Ziehau reset_hw_out:
93479251f5eSSepherosa Ziehau 	if (phy_status != IXGBE_SUCCESS)
93579251f5eSSepherosa Ziehau 		status = phy_status;
93679251f5eSSepherosa Ziehau 
93779251f5eSSepherosa Ziehau 	return status;
93879251f5eSSepherosa Ziehau }
93979251f5eSSepherosa Ziehau 
94079251f5eSSepherosa Ziehau /**
94179251f5eSSepherosa Ziehau  *  ixgbe_set_vmdq_82598 - Associate a VMDq set index with a rx address
94279251f5eSSepherosa Ziehau  *  @hw: pointer to hardware struct
94379251f5eSSepherosa Ziehau  *  @rar: receive address register index to associate with a VMDq index
94479251f5eSSepherosa Ziehau  *  @vmdq: VMDq set index
94579251f5eSSepherosa Ziehau  **/
ixgbe_set_vmdq_82598(struct ixgbe_hw * hw,u32 rar,u32 vmdq)94679251f5eSSepherosa Ziehau s32 ixgbe_set_vmdq_82598(struct ixgbe_hw *hw, u32 rar, u32 vmdq)
94779251f5eSSepherosa Ziehau {
94879251f5eSSepherosa Ziehau 	u32 rar_high;
94979251f5eSSepherosa Ziehau 	u32 rar_entries = hw->mac.num_rar_entries;
95079251f5eSSepherosa Ziehau 
95179251f5eSSepherosa Ziehau 	DEBUGFUNC("ixgbe_set_vmdq_82598");
95279251f5eSSepherosa Ziehau 
95379251f5eSSepherosa Ziehau 	/* Make sure we are using a valid rar index range */
95479251f5eSSepherosa Ziehau 	if (rar >= rar_entries) {
95579251f5eSSepherosa Ziehau 		DEBUGOUT1("RAR index %d is out of range.\n", rar);
95679251f5eSSepherosa Ziehau 		return IXGBE_ERR_INVALID_ARGUMENT;
95779251f5eSSepherosa Ziehau 	}
95879251f5eSSepherosa Ziehau 
95979251f5eSSepherosa Ziehau 	rar_high = IXGBE_READ_REG(hw, IXGBE_RAH(rar));
96079251f5eSSepherosa Ziehau 	rar_high &= ~IXGBE_RAH_VIND_MASK;
96179251f5eSSepherosa Ziehau 	rar_high |= ((vmdq << IXGBE_RAH_VIND_SHIFT) & IXGBE_RAH_VIND_MASK);
96279251f5eSSepherosa Ziehau 	IXGBE_WRITE_REG(hw, IXGBE_RAH(rar), rar_high);
96379251f5eSSepherosa Ziehau 	return IXGBE_SUCCESS;
96479251f5eSSepherosa Ziehau }
96579251f5eSSepherosa Ziehau 
96679251f5eSSepherosa Ziehau /**
96779251f5eSSepherosa Ziehau  *  ixgbe_clear_vmdq_82598 - Disassociate a VMDq set index from an rx address
96879251f5eSSepherosa Ziehau  *  @hw: pointer to hardware struct
96979251f5eSSepherosa Ziehau  *  @rar: receive address register index to associate with a VMDq index
97079251f5eSSepherosa Ziehau  *  @vmdq: VMDq clear index (not used in 82598, but elsewhere)
97179251f5eSSepherosa Ziehau  **/
ixgbe_clear_vmdq_82598(struct ixgbe_hw * hw,u32 rar,u32 vmdq)97279251f5eSSepherosa Ziehau static s32 ixgbe_clear_vmdq_82598(struct ixgbe_hw *hw, u32 rar, u32 vmdq)
97379251f5eSSepherosa Ziehau {
97479251f5eSSepherosa Ziehau 	u32 rar_high;
97579251f5eSSepherosa Ziehau 	u32 rar_entries = hw->mac.num_rar_entries;
97679251f5eSSepherosa Ziehau 
97779251f5eSSepherosa Ziehau 	UNREFERENCED_1PARAMETER(vmdq);
97879251f5eSSepherosa Ziehau 
97979251f5eSSepherosa Ziehau 	/* Make sure we are using a valid rar index range */
98079251f5eSSepherosa Ziehau 	if (rar >= rar_entries) {
98179251f5eSSepherosa Ziehau 		DEBUGOUT1("RAR index %d is out of range.\n", rar);
98279251f5eSSepherosa Ziehau 		return IXGBE_ERR_INVALID_ARGUMENT;
98379251f5eSSepherosa Ziehau 	}
98479251f5eSSepherosa Ziehau 
98579251f5eSSepherosa Ziehau 	rar_high = IXGBE_READ_REG(hw, IXGBE_RAH(rar));
98679251f5eSSepherosa Ziehau 	if (rar_high & IXGBE_RAH_VIND_MASK) {
98779251f5eSSepherosa Ziehau 		rar_high &= ~IXGBE_RAH_VIND_MASK;
98879251f5eSSepherosa Ziehau 		IXGBE_WRITE_REG(hw, IXGBE_RAH(rar), rar_high);
98979251f5eSSepherosa Ziehau 	}
99079251f5eSSepherosa Ziehau 
99179251f5eSSepherosa Ziehau 	return IXGBE_SUCCESS;
99279251f5eSSepherosa Ziehau }
99379251f5eSSepherosa Ziehau 
99479251f5eSSepherosa Ziehau /**
99579251f5eSSepherosa Ziehau  *  ixgbe_set_vfta_82598 - Set VLAN filter table
99679251f5eSSepherosa Ziehau  *  @hw: pointer to hardware structure
99779251f5eSSepherosa Ziehau  *  @vlan: VLAN id to write to VLAN filter
99879251f5eSSepherosa Ziehau  *  @vind: VMDq output index that maps queue to VLAN id in VFTA
99979251f5eSSepherosa Ziehau  *  @vlan_on: boolean flag to turn on/off VLAN in VFTA
10006150453fSSepherosa Ziehau  *  @vlvf_bypass: boolean flag - unused
100179251f5eSSepherosa Ziehau  *
100279251f5eSSepherosa Ziehau  *  Turn on/off specified VLAN in the VLAN filter table.
100379251f5eSSepherosa Ziehau  **/
ixgbe_set_vfta_82598(struct ixgbe_hw * hw,u32 vlan,u32 vind,bool vlan_on,bool vlvf_bypass)100479251f5eSSepherosa Ziehau s32 ixgbe_set_vfta_82598(struct ixgbe_hw *hw, u32 vlan, u32 vind,
10056150453fSSepherosa Ziehau 			 bool vlan_on, bool vlvf_bypass)
100679251f5eSSepherosa Ziehau {
100779251f5eSSepherosa Ziehau 	u32 regindex;
100879251f5eSSepherosa Ziehau 	u32 bitindex;
100979251f5eSSepherosa Ziehau 	u32 bits;
101079251f5eSSepherosa Ziehau 	u32 vftabyte;
101179251f5eSSepherosa Ziehau 
10126150453fSSepherosa Ziehau 	UNREFERENCED_1PARAMETER(vlvf_bypass);
10136150453fSSepherosa Ziehau 
101479251f5eSSepherosa Ziehau 	DEBUGFUNC("ixgbe_set_vfta_82598");
101579251f5eSSepherosa Ziehau 
101679251f5eSSepherosa Ziehau 	if (vlan > 4095)
101779251f5eSSepherosa Ziehau 		return IXGBE_ERR_PARAM;
101879251f5eSSepherosa Ziehau 
101979251f5eSSepherosa Ziehau 	/* Determine 32-bit word position in array */
102079251f5eSSepherosa Ziehau 	regindex = (vlan >> 5) & 0x7F;   /* upper seven bits */
102179251f5eSSepherosa Ziehau 
102279251f5eSSepherosa Ziehau 	/* Determine the location of the (VMD) queue index */
102379251f5eSSepherosa Ziehau 	vftabyte =  ((vlan >> 3) & 0x03); /* bits (4:3) indicating byte array */
102479251f5eSSepherosa Ziehau 	bitindex = (vlan & 0x7) << 2;    /* lower 3 bits indicate nibble */
102579251f5eSSepherosa Ziehau 
102679251f5eSSepherosa Ziehau 	/* Set the nibble for VMD queue index */
102779251f5eSSepherosa Ziehau 	bits = IXGBE_READ_REG(hw, IXGBE_VFTAVIND(vftabyte, regindex));
102879251f5eSSepherosa Ziehau 	bits &= (~(0x0F << bitindex));
102979251f5eSSepherosa Ziehau 	bits |= (vind << bitindex);
103079251f5eSSepherosa Ziehau 	IXGBE_WRITE_REG(hw, IXGBE_VFTAVIND(vftabyte, regindex), bits);
103179251f5eSSepherosa Ziehau 
103279251f5eSSepherosa Ziehau 	/* Determine the location of the bit for this VLAN id */
103379251f5eSSepherosa Ziehau 	bitindex = vlan & 0x1F;   /* lower five bits */
103479251f5eSSepherosa Ziehau 
103579251f5eSSepherosa Ziehau 	bits = IXGBE_READ_REG(hw, IXGBE_VFTA(regindex));
103679251f5eSSepherosa Ziehau 	if (vlan_on)
103779251f5eSSepherosa Ziehau 		/* Turn on this VLAN id */
103879251f5eSSepherosa Ziehau 		bits |= (1 << bitindex);
103979251f5eSSepherosa Ziehau 	else
104079251f5eSSepherosa Ziehau 		/* Turn off this VLAN id */
104179251f5eSSepherosa Ziehau 		bits &= ~(1 << bitindex);
104279251f5eSSepherosa Ziehau 	IXGBE_WRITE_REG(hw, IXGBE_VFTA(regindex), bits);
104379251f5eSSepherosa Ziehau 
104479251f5eSSepherosa Ziehau 	return IXGBE_SUCCESS;
104579251f5eSSepherosa Ziehau }
104679251f5eSSepherosa Ziehau 
104779251f5eSSepherosa Ziehau /**
104879251f5eSSepherosa Ziehau  *  ixgbe_clear_vfta_82598 - Clear VLAN filter table
104979251f5eSSepherosa Ziehau  *  @hw: pointer to hardware structure
105079251f5eSSepherosa Ziehau  *
105179251f5eSSepherosa Ziehau  *  Clears the VLAN filer table, and the VMDq index associated with the filter
105279251f5eSSepherosa Ziehau  **/
ixgbe_clear_vfta_82598(struct ixgbe_hw * hw)105379251f5eSSepherosa Ziehau static s32 ixgbe_clear_vfta_82598(struct ixgbe_hw *hw)
105479251f5eSSepherosa Ziehau {
105579251f5eSSepherosa Ziehau 	u32 offset;
105679251f5eSSepherosa Ziehau 	u32 vlanbyte;
105779251f5eSSepherosa Ziehau 
105879251f5eSSepherosa Ziehau 	DEBUGFUNC("ixgbe_clear_vfta_82598");
105979251f5eSSepherosa Ziehau 
106079251f5eSSepherosa Ziehau 	for (offset = 0; offset < hw->mac.vft_size; offset++)
106179251f5eSSepherosa Ziehau 		IXGBE_WRITE_REG(hw, IXGBE_VFTA(offset), 0);
106279251f5eSSepherosa Ziehau 
106379251f5eSSepherosa Ziehau 	for (vlanbyte = 0; vlanbyte < 4; vlanbyte++)
106479251f5eSSepherosa Ziehau 		for (offset = 0; offset < hw->mac.vft_size; offset++)
106579251f5eSSepherosa Ziehau 			IXGBE_WRITE_REG(hw, IXGBE_VFTAVIND(vlanbyte, offset),
106679251f5eSSepherosa Ziehau 					0);
106779251f5eSSepherosa Ziehau 
106879251f5eSSepherosa Ziehau 	return IXGBE_SUCCESS;
106979251f5eSSepherosa Ziehau }
107079251f5eSSepherosa Ziehau 
107179251f5eSSepherosa Ziehau /**
107279251f5eSSepherosa Ziehau  *  ixgbe_read_analog_reg8_82598 - Reads 8 bit Atlas analog register
107379251f5eSSepherosa Ziehau  *  @hw: pointer to hardware structure
107479251f5eSSepherosa Ziehau  *  @reg: analog register to read
107579251f5eSSepherosa Ziehau  *  @val: read value
107679251f5eSSepherosa Ziehau  *
107779251f5eSSepherosa Ziehau  *  Performs read operation to Atlas analog register specified.
107879251f5eSSepherosa Ziehau  **/
ixgbe_read_analog_reg8_82598(struct ixgbe_hw * hw,u32 reg,u8 * val)107979251f5eSSepherosa Ziehau s32 ixgbe_read_analog_reg8_82598(struct ixgbe_hw *hw, u32 reg, u8 *val)
108079251f5eSSepherosa Ziehau {
108179251f5eSSepherosa Ziehau 	u32  atlas_ctl;
108279251f5eSSepherosa Ziehau 
108379251f5eSSepherosa Ziehau 	DEBUGFUNC("ixgbe_read_analog_reg8_82598");
108479251f5eSSepherosa Ziehau 
108579251f5eSSepherosa Ziehau 	IXGBE_WRITE_REG(hw, IXGBE_ATLASCTL,
108679251f5eSSepherosa Ziehau 			IXGBE_ATLASCTL_WRITE_CMD | (reg << 8));
108779251f5eSSepherosa Ziehau 	IXGBE_WRITE_FLUSH(hw);
108879251f5eSSepherosa Ziehau 	usec_delay(10);
108979251f5eSSepherosa Ziehau 	atlas_ctl = IXGBE_READ_REG(hw, IXGBE_ATLASCTL);
109079251f5eSSepherosa Ziehau 	*val = (u8)atlas_ctl;
109179251f5eSSepherosa Ziehau 
109279251f5eSSepherosa Ziehau 	return IXGBE_SUCCESS;
109379251f5eSSepherosa Ziehau }
109479251f5eSSepherosa Ziehau 
109579251f5eSSepherosa Ziehau /**
109679251f5eSSepherosa Ziehau  *  ixgbe_write_analog_reg8_82598 - Writes 8 bit Atlas analog register
109779251f5eSSepherosa Ziehau  *  @hw: pointer to hardware structure
109879251f5eSSepherosa Ziehau  *  @reg: atlas register to write
109979251f5eSSepherosa Ziehau  *  @val: value to write
110079251f5eSSepherosa Ziehau  *
110179251f5eSSepherosa Ziehau  *  Performs write operation to Atlas analog register specified.
110279251f5eSSepherosa Ziehau  **/
ixgbe_write_analog_reg8_82598(struct ixgbe_hw * hw,u32 reg,u8 val)110379251f5eSSepherosa Ziehau s32 ixgbe_write_analog_reg8_82598(struct ixgbe_hw *hw, u32 reg, u8 val)
110479251f5eSSepherosa Ziehau {
110579251f5eSSepherosa Ziehau 	u32  atlas_ctl;
110679251f5eSSepherosa Ziehau 
110779251f5eSSepherosa Ziehau 	DEBUGFUNC("ixgbe_write_analog_reg8_82598");
110879251f5eSSepherosa Ziehau 
110979251f5eSSepherosa Ziehau 	atlas_ctl = (reg << 8) | val;
111079251f5eSSepherosa Ziehau 	IXGBE_WRITE_REG(hw, IXGBE_ATLASCTL, atlas_ctl);
111179251f5eSSepherosa Ziehau 	IXGBE_WRITE_FLUSH(hw);
111279251f5eSSepherosa Ziehau 	usec_delay(10);
111379251f5eSSepherosa Ziehau 
111479251f5eSSepherosa Ziehau 	return IXGBE_SUCCESS;
111579251f5eSSepherosa Ziehau }
111679251f5eSSepherosa Ziehau 
111779251f5eSSepherosa Ziehau /**
111879251f5eSSepherosa Ziehau  *  ixgbe_read_i2c_phy_82598 - Reads 8 bit word over I2C interface.
111979251f5eSSepherosa Ziehau  *  @hw: pointer to hardware structure
112079251f5eSSepherosa Ziehau  *  @dev_addr: address to read from
112179251f5eSSepherosa Ziehau  *  @byte_offset: byte offset to read from dev_addr
112279251f5eSSepherosa Ziehau  *  @eeprom_data: value read
112379251f5eSSepherosa Ziehau  *
112479251f5eSSepherosa Ziehau  *  Performs 8 byte read operation to SFP module's EEPROM over I2C interface.
112579251f5eSSepherosa Ziehau  **/
ixgbe_read_i2c_phy_82598(struct ixgbe_hw * hw,u8 dev_addr,u8 byte_offset,u8 * eeprom_data)112679251f5eSSepherosa Ziehau static s32 ixgbe_read_i2c_phy_82598(struct ixgbe_hw *hw, u8 dev_addr,
112779251f5eSSepherosa Ziehau 				    u8 byte_offset, u8 *eeprom_data)
112879251f5eSSepherosa Ziehau {
112979251f5eSSepherosa Ziehau 	s32 status = IXGBE_SUCCESS;
113079251f5eSSepherosa Ziehau 	u16 sfp_addr = 0;
113179251f5eSSepherosa Ziehau 	u16 sfp_data = 0;
113279251f5eSSepherosa Ziehau 	u16 sfp_stat = 0;
113379251f5eSSepherosa Ziehau 	u16 gssr;
113479251f5eSSepherosa Ziehau 	u32 i;
113579251f5eSSepherosa Ziehau 
113679251f5eSSepherosa Ziehau 	DEBUGFUNC("ixgbe_read_i2c_phy_82598");
113779251f5eSSepherosa Ziehau 
113879251f5eSSepherosa Ziehau 	if (IXGBE_READ_REG(hw, IXGBE_STATUS) & IXGBE_STATUS_LAN_ID_1)
113979251f5eSSepherosa Ziehau 		gssr = IXGBE_GSSR_PHY1_SM;
114079251f5eSSepherosa Ziehau 	else
114179251f5eSSepherosa Ziehau 		gssr = IXGBE_GSSR_PHY0_SM;
114279251f5eSSepherosa Ziehau 
114379251f5eSSepherosa Ziehau 	if (hw->mac.ops.acquire_swfw_sync(hw, gssr) != IXGBE_SUCCESS)
114479251f5eSSepherosa Ziehau 		return IXGBE_ERR_SWFW_SYNC;
114579251f5eSSepherosa Ziehau 
114679251f5eSSepherosa Ziehau 	if (hw->phy.type == ixgbe_phy_nl) {
114779251f5eSSepherosa Ziehau 		/*
114879251f5eSSepherosa Ziehau 		 * NetLogic phy SDA/SCL registers are at addresses 0xC30A to
114979251f5eSSepherosa Ziehau 		 * 0xC30D. These registers are used to talk to the SFP+
115079251f5eSSepherosa Ziehau 		 * module's EEPROM through the SDA/SCL (I2C) interface.
115179251f5eSSepherosa Ziehau 		 */
115279251f5eSSepherosa Ziehau 		sfp_addr = (dev_addr << 8) + byte_offset;
115379251f5eSSepherosa Ziehau 		sfp_addr = (sfp_addr | IXGBE_I2C_EEPROM_READ_MASK);
115479251f5eSSepherosa Ziehau 		hw->phy.ops.write_reg_mdi(hw,
115579251f5eSSepherosa Ziehau 					  IXGBE_MDIO_PMA_PMD_SDA_SCL_ADDR,
115679251f5eSSepherosa Ziehau 					  IXGBE_MDIO_PMA_PMD_DEV_TYPE,
115779251f5eSSepherosa Ziehau 					  sfp_addr);
115879251f5eSSepherosa Ziehau 
115979251f5eSSepherosa Ziehau 		/* Poll status */
116079251f5eSSepherosa Ziehau 		for (i = 0; i < 100; i++) {
116179251f5eSSepherosa Ziehau 			hw->phy.ops.read_reg_mdi(hw,
116279251f5eSSepherosa Ziehau 						IXGBE_MDIO_PMA_PMD_SDA_SCL_STAT,
116379251f5eSSepherosa Ziehau 						IXGBE_MDIO_PMA_PMD_DEV_TYPE,
116479251f5eSSepherosa Ziehau 						&sfp_stat);
116579251f5eSSepherosa Ziehau 			sfp_stat = sfp_stat & IXGBE_I2C_EEPROM_STATUS_MASK;
116679251f5eSSepherosa Ziehau 			if (sfp_stat != IXGBE_I2C_EEPROM_STATUS_IN_PROGRESS)
116779251f5eSSepherosa Ziehau 				break;
116879251f5eSSepherosa Ziehau 			msec_delay(10);
116979251f5eSSepherosa Ziehau 		}
117079251f5eSSepherosa Ziehau 
117179251f5eSSepherosa Ziehau 		if (sfp_stat != IXGBE_I2C_EEPROM_STATUS_PASS) {
117279251f5eSSepherosa Ziehau 			DEBUGOUT("EEPROM read did not pass.\n");
117379251f5eSSepherosa Ziehau 			status = IXGBE_ERR_SFP_NOT_PRESENT;
117479251f5eSSepherosa Ziehau 			goto out;
117579251f5eSSepherosa Ziehau 		}
117679251f5eSSepherosa Ziehau 
117779251f5eSSepherosa Ziehau 		/* Read data */
117879251f5eSSepherosa Ziehau 		hw->phy.ops.read_reg_mdi(hw, IXGBE_MDIO_PMA_PMD_SDA_SCL_DATA,
117979251f5eSSepherosa Ziehau 					IXGBE_MDIO_PMA_PMD_DEV_TYPE, &sfp_data);
118079251f5eSSepherosa Ziehau 
118179251f5eSSepherosa Ziehau 		*eeprom_data = (u8)(sfp_data >> 8);
118279251f5eSSepherosa Ziehau 	} else {
118379251f5eSSepherosa Ziehau 		status = IXGBE_ERR_PHY;
118479251f5eSSepherosa Ziehau 	}
118579251f5eSSepherosa Ziehau 
118679251f5eSSepherosa Ziehau out:
118779251f5eSSepherosa Ziehau 	hw->mac.ops.release_swfw_sync(hw, gssr);
118879251f5eSSepherosa Ziehau 	return status;
118979251f5eSSepherosa Ziehau }
119079251f5eSSepherosa Ziehau 
119179251f5eSSepherosa Ziehau /**
119279251f5eSSepherosa Ziehau  *  ixgbe_read_i2c_eeprom_82598 - Reads 8 bit word over I2C interface.
119379251f5eSSepherosa Ziehau  *  @hw: pointer to hardware structure
119479251f5eSSepherosa Ziehau  *  @byte_offset: EEPROM byte offset to read
119579251f5eSSepherosa Ziehau  *  @eeprom_data: value read
119679251f5eSSepherosa Ziehau  *
119779251f5eSSepherosa Ziehau  *  Performs 8 byte read operation to SFP module's EEPROM over I2C interface.
119879251f5eSSepherosa Ziehau  **/
ixgbe_read_i2c_eeprom_82598(struct ixgbe_hw * hw,u8 byte_offset,u8 * eeprom_data)119979251f5eSSepherosa Ziehau s32 ixgbe_read_i2c_eeprom_82598(struct ixgbe_hw *hw, u8 byte_offset,
120079251f5eSSepherosa Ziehau 				u8 *eeprom_data)
120179251f5eSSepherosa Ziehau {
120279251f5eSSepherosa Ziehau 	return ixgbe_read_i2c_phy_82598(hw, IXGBE_I2C_EEPROM_DEV_ADDR,
120379251f5eSSepherosa Ziehau 					byte_offset, eeprom_data);
120479251f5eSSepherosa Ziehau }
120579251f5eSSepherosa Ziehau 
120679251f5eSSepherosa Ziehau /**
120779251f5eSSepherosa Ziehau  *  ixgbe_read_i2c_sff8472_82598 - Reads 8 bit word over I2C interface.
120879251f5eSSepherosa Ziehau  *  @hw: pointer to hardware structure
120979251f5eSSepherosa Ziehau  *  @byte_offset: byte offset at address 0xA2
1210*dd5ce676SSepherosa Ziehau  *  @sff8472_data: value read
121179251f5eSSepherosa Ziehau  *
121279251f5eSSepherosa Ziehau  *  Performs 8 byte read operation to SFP module's SFF-8472 data over I2C
121379251f5eSSepherosa Ziehau  **/
ixgbe_read_i2c_sff8472_82598(struct ixgbe_hw * hw,u8 byte_offset,u8 * sff8472_data)121479251f5eSSepherosa Ziehau static s32 ixgbe_read_i2c_sff8472_82598(struct ixgbe_hw *hw, u8 byte_offset,
121579251f5eSSepherosa Ziehau 					u8 *sff8472_data)
121679251f5eSSepherosa Ziehau {
121779251f5eSSepherosa Ziehau 	return ixgbe_read_i2c_phy_82598(hw, IXGBE_I2C_EEPROM_DEV_ADDR2,
121879251f5eSSepherosa Ziehau 					byte_offset, sff8472_data);
121979251f5eSSepherosa Ziehau }
122079251f5eSSepherosa Ziehau 
122179251f5eSSepherosa Ziehau /**
122279251f5eSSepherosa Ziehau  *  ixgbe_get_supported_physical_layer_82598 - Returns physical layer type
122379251f5eSSepherosa Ziehau  *  @hw: pointer to hardware structure
122479251f5eSSepherosa Ziehau  *
122579251f5eSSepherosa Ziehau  *  Determines physical layer capabilities of the current configuration.
122679251f5eSSepherosa Ziehau  **/
ixgbe_get_supported_physical_layer_82598(struct ixgbe_hw * hw)12276150453fSSepherosa Ziehau u64 ixgbe_get_supported_physical_layer_82598(struct ixgbe_hw *hw)
122879251f5eSSepherosa Ziehau {
12296150453fSSepherosa Ziehau 	u64 physical_layer = IXGBE_PHYSICAL_LAYER_UNKNOWN;
123079251f5eSSepherosa Ziehau 	u32 autoc = IXGBE_READ_REG(hw, IXGBE_AUTOC);
123179251f5eSSepherosa Ziehau 	u32 pma_pmd_10g = autoc & IXGBE_AUTOC_10G_PMA_PMD_MASK;
123279251f5eSSepherosa Ziehau 	u32 pma_pmd_1g = autoc & IXGBE_AUTOC_1G_PMA_PMD_MASK;
123379251f5eSSepherosa Ziehau 	u16 ext_ability = 0;
123479251f5eSSepherosa Ziehau 
123579251f5eSSepherosa Ziehau 	DEBUGFUNC("ixgbe_get_supported_physical_layer_82598");
123679251f5eSSepherosa Ziehau 
123779251f5eSSepherosa Ziehau 	hw->phy.ops.identify(hw);
123879251f5eSSepherosa Ziehau 
123979251f5eSSepherosa Ziehau 	/* Copper PHY must be checked before AUTOC LMS to determine correct
124079251f5eSSepherosa Ziehau 	 * physical layer because 10GBase-T PHYs use LMS = KX4/KX */
124179251f5eSSepherosa Ziehau 	switch (hw->phy.type) {
124279251f5eSSepherosa Ziehau 	case ixgbe_phy_tn:
124379251f5eSSepherosa Ziehau 	case ixgbe_phy_cu_unknown:
124479251f5eSSepherosa Ziehau 		hw->phy.ops.read_reg(hw, IXGBE_MDIO_PHY_EXT_ABILITY,
124579251f5eSSepherosa Ziehau 		IXGBE_MDIO_PMA_PMD_DEV_TYPE, &ext_ability);
124679251f5eSSepherosa Ziehau 		if (ext_ability & IXGBE_MDIO_PHY_10GBASET_ABILITY)
124779251f5eSSepherosa Ziehau 			physical_layer |= IXGBE_PHYSICAL_LAYER_10GBASE_T;
124879251f5eSSepherosa Ziehau 		if (ext_ability & IXGBE_MDIO_PHY_1000BASET_ABILITY)
124979251f5eSSepherosa Ziehau 			physical_layer |= IXGBE_PHYSICAL_LAYER_1000BASE_T;
125079251f5eSSepherosa Ziehau 		if (ext_ability & IXGBE_MDIO_PHY_100BASETX_ABILITY)
125179251f5eSSepherosa Ziehau 			physical_layer |= IXGBE_PHYSICAL_LAYER_100BASE_TX;
125279251f5eSSepherosa Ziehau 		goto out;
125379251f5eSSepherosa Ziehau 	default:
125479251f5eSSepherosa Ziehau 		break;
125579251f5eSSepherosa Ziehau 	}
125679251f5eSSepherosa Ziehau 
125779251f5eSSepherosa Ziehau 	switch (autoc & IXGBE_AUTOC_LMS_MASK) {
125879251f5eSSepherosa Ziehau 	case IXGBE_AUTOC_LMS_1G_AN:
125979251f5eSSepherosa Ziehau 	case IXGBE_AUTOC_LMS_1G_LINK_NO_AN:
126079251f5eSSepherosa Ziehau 		if (pma_pmd_1g == IXGBE_AUTOC_1G_KX)
126179251f5eSSepherosa Ziehau 			physical_layer = IXGBE_PHYSICAL_LAYER_1000BASE_KX;
126279251f5eSSepherosa Ziehau 		else
126379251f5eSSepherosa Ziehau 			physical_layer = IXGBE_PHYSICAL_LAYER_1000BASE_BX;
126479251f5eSSepherosa Ziehau 		break;
126579251f5eSSepherosa Ziehau 	case IXGBE_AUTOC_LMS_10G_LINK_NO_AN:
126679251f5eSSepherosa Ziehau 		if (pma_pmd_10g == IXGBE_AUTOC_10G_CX4)
126779251f5eSSepherosa Ziehau 			physical_layer = IXGBE_PHYSICAL_LAYER_10GBASE_CX4;
126879251f5eSSepherosa Ziehau 		else if (pma_pmd_10g == IXGBE_AUTOC_10G_KX4)
126979251f5eSSepherosa Ziehau 			physical_layer = IXGBE_PHYSICAL_LAYER_10GBASE_KX4;
127079251f5eSSepherosa Ziehau 		else /* XAUI */
127179251f5eSSepherosa Ziehau 			physical_layer = IXGBE_PHYSICAL_LAYER_UNKNOWN;
127279251f5eSSepherosa Ziehau 		break;
127379251f5eSSepherosa Ziehau 	case IXGBE_AUTOC_LMS_KX4_AN:
127479251f5eSSepherosa Ziehau 	case IXGBE_AUTOC_LMS_KX4_AN_1G_AN:
127579251f5eSSepherosa Ziehau 		if (autoc & IXGBE_AUTOC_KX_SUPP)
127679251f5eSSepherosa Ziehau 			physical_layer |= IXGBE_PHYSICAL_LAYER_1000BASE_KX;
127779251f5eSSepherosa Ziehau 		if (autoc & IXGBE_AUTOC_KX4_SUPP)
127879251f5eSSepherosa Ziehau 			physical_layer |= IXGBE_PHYSICAL_LAYER_10GBASE_KX4;
127979251f5eSSepherosa Ziehau 		break;
128079251f5eSSepherosa Ziehau 	default:
128179251f5eSSepherosa Ziehau 		break;
128279251f5eSSepherosa Ziehau 	}
128379251f5eSSepherosa Ziehau 
128479251f5eSSepherosa Ziehau 	if (hw->phy.type == ixgbe_phy_nl) {
128579251f5eSSepherosa Ziehau 		hw->phy.ops.identify_sfp(hw);
128679251f5eSSepherosa Ziehau 
128779251f5eSSepherosa Ziehau 		switch (hw->phy.sfp_type) {
128879251f5eSSepherosa Ziehau 		case ixgbe_sfp_type_da_cu:
128979251f5eSSepherosa Ziehau 			physical_layer = IXGBE_PHYSICAL_LAYER_SFP_PLUS_CU;
129079251f5eSSepherosa Ziehau 			break;
129179251f5eSSepherosa Ziehau 		case ixgbe_sfp_type_sr:
129279251f5eSSepherosa Ziehau 			physical_layer = IXGBE_PHYSICAL_LAYER_10GBASE_SR;
129379251f5eSSepherosa Ziehau 			break;
129479251f5eSSepherosa Ziehau 		case ixgbe_sfp_type_lr:
129579251f5eSSepherosa Ziehau 			physical_layer = IXGBE_PHYSICAL_LAYER_10GBASE_LR;
129679251f5eSSepherosa Ziehau 			break;
129779251f5eSSepherosa Ziehau 		default:
129879251f5eSSepherosa Ziehau 			physical_layer = IXGBE_PHYSICAL_LAYER_UNKNOWN;
129979251f5eSSepherosa Ziehau 			break;
130079251f5eSSepherosa Ziehau 		}
130179251f5eSSepherosa Ziehau 	}
130279251f5eSSepherosa Ziehau 
130379251f5eSSepherosa Ziehau 	switch (hw->device_id) {
130479251f5eSSepherosa Ziehau 	case IXGBE_DEV_ID_82598_DA_DUAL_PORT:
130579251f5eSSepherosa Ziehau 		physical_layer = IXGBE_PHYSICAL_LAYER_SFP_PLUS_CU;
130679251f5eSSepherosa Ziehau 		break;
130779251f5eSSepherosa Ziehau 	case IXGBE_DEV_ID_82598AF_DUAL_PORT:
130879251f5eSSepherosa Ziehau 	case IXGBE_DEV_ID_82598AF_SINGLE_PORT:
130979251f5eSSepherosa Ziehau 	case IXGBE_DEV_ID_82598_SR_DUAL_PORT_EM:
131079251f5eSSepherosa Ziehau 		physical_layer = IXGBE_PHYSICAL_LAYER_10GBASE_SR;
131179251f5eSSepherosa Ziehau 		break;
131279251f5eSSepherosa Ziehau 	case IXGBE_DEV_ID_82598EB_XF_LR:
131379251f5eSSepherosa Ziehau 		physical_layer = IXGBE_PHYSICAL_LAYER_10GBASE_LR;
131479251f5eSSepherosa Ziehau 		break;
131579251f5eSSepherosa Ziehau 	default:
131679251f5eSSepherosa Ziehau 		break;
131779251f5eSSepherosa Ziehau 	}
131879251f5eSSepherosa Ziehau 
131979251f5eSSepherosa Ziehau out:
132079251f5eSSepherosa Ziehau 	return physical_layer;
132179251f5eSSepherosa Ziehau }
132279251f5eSSepherosa Ziehau 
132379251f5eSSepherosa Ziehau /**
132479251f5eSSepherosa Ziehau  *  ixgbe_set_lan_id_multi_port_pcie_82598 - Set LAN id for PCIe multiple
132579251f5eSSepherosa Ziehau  *  port devices.
132679251f5eSSepherosa Ziehau  *  @hw: pointer to the HW structure
132779251f5eSSepherosa Ziehau  *
132879251f5eSSepherosa Ziehau  *  Calls common function and corrects issue with some single port devices
132979251f5eSSepherosa Ziehau  *  that enable LAN1 but not LAN0.
133079251f5eSSepherosa Ziehau  **/
ixgbe_set_lan_id_multi_port_pcie_82598(struct ixgbe_hw * hw)133179251f5eSSepherosa Ziehau void ixgbe_set_lan_id_multi_port_pcie_82598(struct ixgbe_hw *hw)
133279251f5eSSepherosa Ziehau {
133379251f5eSSepherosa Ziehau 	struct ixgbe_bus_info *bus = &hw->bus;
133479251f5eSSepherosa Ziehau 	u16 pci_gen = 0;
133579251f5eSSepherosa Ziehau 	u16 pci_ctrl2 = 0;
133679251f5eSSepherosa Ziehau 
133779251f5eSSepherosa Ziehau 	DEBUGFUNC("ixgbe_set_lan_id_multi_port_pcie_82598");
133879251f5eSSepherosa Ziehau 
133979251f5eSSepherosa Ziehau 	ixgbe_set_lan_id_multi_port_pcie(hw);
134079251f5eSSepherosa Ziehau 
134179251f5eSSepherosa Ziehau 	/* check if LAN0 is disabled */
134279251f5eSSepherosa Ziehau 	hw->eeprom.ops.read(hw, IXGBE_PCIE_GENERAL_PTR, &pci_gen);
134379251f5eSSepherosa Ziehau 	if ((pci_gen != 0) && (pci_gen != 0xFFFF)) {
134479251f5eSSepherosa Ziehau 
134579251f5eSSepherosa Ziehau 		hw->eeprom.ops.read(hw, pci_gen + IXGBE_PCIE_CTRL2, &pci_ctrl2);
134679251f5eSSepherosa Ziehau 
134779251f5eSSepherosa Ziehau 		/* if LAN0 is completely disabled force function to 0 */
134879251f5eSSepherosa Ziehau 		if ((pci_ctrl2 & IXGBE_PCIE_CTRL2_LAN_DISABLE) &&
134979251f5eSSepherosa Ziehau 		    !(pci_ctrl2 & IXGBE_PCIE_CTRL2_DISABLE_SELECT) &&
135079251f5eSSepherosa Ziehau 		    !(pci_ctrl2 & IXGBE_PCIE_CTRL2_DUMMY_ENABLE)) {
135179251f5eSSepherosa Ziehau 
135279251f5eSSepherosa Ziehau 			bus->func = 0;
135379251f5eSSepherosa Ziehau 		}
135479251f5eSSepherosa Ziehau 	}
135579251f5eSSepherosa Ziehau }
135679251f5eSSepherosa Ziehau 
135779251f5eSSepherosa Ziehau /**
135879251f5eSSepherosa Ziehau  *  ixgbe_enable_relaxed_ordering_82598 - enable relaxed ordering
135979251f5eSSepherosa Ziehau  *  @hw: pointer to hardware structure
136079251f5eSSepherosa Ziehau  *
136179251f5eSSepherosa Ziehau  **/
ixgbe_enable_relaxed_ordering_82598(struct ixgbe_hw * hw)136279251f5eSSepherosa Ziehau void ixgbe_enable_relaxed_ordering_82598(struct ixgbe_hw *hw)
136379251f5eSSepherosa Ziehau {
136479251f5eSSepherosa Ziehau 	u32 regval;
136579251f5eSSepherosa Ziehau 	u32 i;
136679251f5eSSepherosa Ziehau 
136779251f5eSSepherosa Ziehau 	DEBUGFUNC("ixgbe_enable_relaxed_ordering_82598");
136879251f5eSSepherosa Ziehau 
136979251f5eSSepherosa Ziehau 	/* Enable relaxed ordering */
137079251f5eSSepherosa Ziehau 	for (i = 0; ((i < hw->mac.max_tx_queues) &&
137179251f5eSSepherosa Ziehau 	     (i < IXGBE_DCA_MAX_QUEUES_82598)); i++) {
137279251f5eSSepherosa Ziehau 		regval = IXGBE_READ_REG(hw, IXGBE_DCA_TXCTRL(i));
137379251f5eSSepherosa Ziehau 		regval |= IXGBE_DCA_TXCTRL_DESC_WRO_EN;
137479251f5eSSepherosa Ziehau 		IXGBE_WRITE_REG(hw, IXGBE_DCA_TXCTRL(i), regval);
137579251f5eSSepherosa Ziehau 	}
137679251f5eSSepherosa Ziehau 
137779251f5eSSepherosa Ziehau 	for (i = 0; ((i < hw->mac.max_rx_queues) &&
137879251f5eSSepherosa Ziehau 	     (i < IXGBE_DCA_MAX_QUEUES_82598)); i++) {
137979251f5eSSepherosa Ziehau 		regval = IXGBE_READ_REG(hw, IXGBE_DCA_RXCTRL(i));
138079251f5eSSepherosa Ziehau 		regval |= IXGBE_DCA_RXCTRL_DATA_WRO_EN |
138179251f5eSSepherosa Ziehau 			  IXGBE_DCA_RXCTRL_HEAD_WRO_EN;
138279251f5eSSepherosa Ziehau 		IXGBE_WRITE_REG(hw, IXGBE_DCA_RXCTRL(i), regval);
138379251f5eSSepherosa Ziehau 	}
138479251f5eSSepherosa Ziehau 
138579251f5eSSepherosa Ziehau }
138679251f5eSSepherosa Ziehau 
138779251f5eSSepherosa Ziehau /**
138879251f5eSSepherosa Ziehau  * ixgbe_set_rxpba_82598 - Initialize RX packet buffer
138979251f5eSSepherosa Ziehau  * @hw: pointer to hardware structure
139079251f5eSSepherosa Ziehau  * @num_pb: number of packet buffers to allocate
139179251f5eSSepherosa Ziehau  * @headroom: reserve n KB of headroom
139279251f5eSSepherosa Ziehau  * @strategy: packet buffer allocation strategy
139379251f5eSSepherosa Ziehau  **/
ixgbe_set_rxpba_82598(struct ixgbe_hw * hw,int num_pb,u32 headroom,int strategy)139479251f5eSSepherosa Ziehau static void ixgbe_set_rxpba_82598(struct ixgbe_hw *hw, int num_pb,
139579251f5eSSepherosa Ziehau 				  u32 headroom, int strategy)
139679251f5eSSepherosa Ziehau {
139779251f5eSSepherosa Ziehau 	u32 rxpktsize = IXGBE_RXPBSIZE_64KB;
139879251f5eSSepherosa Ziehau 	u8 i = 0;
139979251f5eSSepherosa Ziehau 	UNREFERENCED_1PARAMETER(headroom);
140079251f5eSSepherosa Ziehau 
140179251f5eSSepherosa Ziehau 	if (!num_pb)
140279251f5eSSepherosa Ziehau 		return;
140379251f5eSSepherosa Ziehau 
140479251f5eSSepherosa Ziehau 	/* Setup Rx packet buffer sizes */
140579251f5eSSepherosa Ziehau 	switch (strategy) {
140679251f5eSSepherosa Ziehau 	case PBA_STRATEGY_WEIGHTED:
140779251f5eSSepherosa Ziehau 		/* Setup the first four at 80KB */
140879251f5eSSepherosa Ziehau 		rxpktsize = IXGBE_RXPBSIZE_80KB;
140979251f5eSSepherosa Ziehau 		for (; i < 4; i++)
141079251f5eSSepherosa Ziehau 			IXGBE_WRITE_REG(hw, IXGBE_RXPBSIZE(i), rxpktsize);
141179251f5eSSepherosa Ziehau 		/* Setup the last four at 48KB...don't re-init i */
141279251f5eSSepherosa Ziehau 		rxpktsize = IXGBE_RXPBSIZE_48KB;
141379251f5eSSepherosa Ziehau 		/* Fall Through */
141479251f5eSSepherosa Ziehau 	case PBA_STRATEGY_EQUAL:
141579251f5eSSepherosa Ziehau 	default:
141679251f5eSSepherosa Ziehau 		/* Divide the remaining Rx packet buffer evenly among the TCs */
141779251f5eSSepherosa Ziehau 		for (; i < IXGBE_MAX_PACKET_BUFFERS; i++)
141879251f5eSSepherosa Ziehau 			IXGBE_WRITE_REG(hw, IXGBE_RXPBSIZE(i), rxpktsize);
141979251f5eSSepherosa Ziehau 		break;
142079251f5eSSepherosa Ziehau 	}
142179251f5eSSepherosa Ziehau 
142279251f5eSSepherosa Ziehau 	/* Setup Tx packet buffer sizes */
142379251f5eSSepherosa Ziehau 	for (i = 0; i < IXGBE_MAX_PACKET_BUFFERS; i++)
142479251f5eSSepherosa Ziehau 		IXGBE_WRITE_REG(hw, IXGBE_TXPBSIZE(i), IXGBE_TXPBSIZE_40KB);
142563d483cdSSepherosa Ziehau }
142679251f5eSSepherosa Ziehau 
142763d483cdSSepherosa Ziehau /**
142863d483cdSSepherosa Ziehau  *  ixgbe_enable_rx_dma_82598 - Enable the Rx DMA unit
142963d483cdSSepherosa Ziehau  *  @hw: pointer to hardware structure
143063d483cdSSepherosa Ziehau  *  @regval: register value to write to RXCTRL
143163d483cdSSepherosa Ziehau  *
143263d483cdSSepherosa Ziehau  *  Enables the Rx DMA unit
143363d483cdSSepherosa Ziehau  **/
ixgbe_enable_rx_dma_82598(struct ixgbe_hw * hw,u32 regval)143463d483cdSSepherosa Ziehau s32 ixgbe_enable_rx_dma_82598(struct ixgbe_hw *hw, u32 regval)
143563d483cdSSepherosa Ziehau {
143663d483cdSSepherosa Ziehau 	DEBUGFUNC("ixgbe_enable_rx_dma_82598");
143763d483cdSSepherosa Ziehau 
143863d483cdSSepherosa Ziehau 	IXGBE_WRITE_REG(hw, IXGBE_RXCTRL, regval);
143963d483cdSSepherosa Ziehau 
144063d483cdSSepherosa Ziehau 	return IXGBE_SUCCESS;
144179251f5eSSepherosa Ziehau }
1442