1dee1ad47SJeff Kirsher /*******************************************************************************
2dee1ad47SJeff Kirsher 
3dee1ad47SJeff Kirsher   Intel 10 Gigabit PCI Express Linux driver
494971820SDon Skidmore   Copyright(c) 1999 - 2012 Intel Corporation.
5dee1ad47SJeff Kirsher 
6dee1ad47SJeff Kirsher   This program is free software; you can redistribute it and/or modify it
7dee1ad47SJeff Kirsher   under the terms and conditions of the GNU General Public License,
8dee1ad47SJeff Kirsher   version 2, as published by the Free Software Foundation.
9dee1ad47SJeff Kirsher 
10dee1ad47SJeff Kirsher   This program is distributed in the hope it will be useful, but WITHOUT
11dee1ad47SJeff Kirsher   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12dee1ad47SJeff Kirsher   FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
13dee1ad47SJeff Kirsher   more details.
14dee1ad47SJeff Kirsher 
15dee1ad47SJeff Kirsher   You should have received a copy of the GNU General Public License along with
16dee1ad47SJeff Kirsher   this program; if not, write to the Free Software Foundation, Inc.,
17dee1ad47SJeff Kirsher   51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
18dee1ad47SJeff Kirsher 
19dee1ad47SJeff Kirsher   The full GNU General Public License is included in this distribution in
20dee1ad47SJeff Kirsher   the file called "COPYING".
21dee1ad47SJeff Kirsher 
22dee1ad47SJeff Kirsher   Contact Information:
23dee1ad47SJeff Kirsher   e1000-devel Mailing List <e1000-devel@lists.sourceforge.net>
24dee1ad47SJeff Kirsher   Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
25dee1ad47SJeff Kirsher 
26dee1ad47SJeff Kirsher *******************************************************************************/
27dee1ad47SJeff Kirsher 
28dee1ad47SJeff Kirsher #include <linux/pci.h>
29dee1ad47SJeff Kirsher #include <linux/delay.h>
30dee1ad47SJeff Kirsher #include <linux/sched.h>
31dee1ad47SJeff Kirsher 
32dee1ad47SJeff Kirsher #include "ixgbe.h"
33dee1ad47SJeff Kirsher #include "ixgbe_phy.h"
34dee1ad47SJeff Kirsher 
35dee1ad47SJeff Kirsher #define IXGBE_82598_MAX_TX_QUEUES 32
36dee1ad47SJeff Kirsher #define IXGBE_82598_MAX_RX_QUEUES 64
37dee1ad47SJeff Kirsher #define IXGBE_82598_RAR_ENTRIES   16
38dee1ad47SJeff Kirsher #define IXGBE_82598_MC_TBL_SIZE  128
39dee1ad47SJeff Kirsher #define IXGBE_82598_VFT_TBL_SIZE 128
40dee1ad47SJeff Kirsher #define IXGBE_82598_RX_PB_SIZE	 512
41dee1ad47SJeff Kirsher 
42dee1ad47SJeff Kirsher static s32 ixgbe_setup_copper_link_82598(struct ixgbe_hw *hw,
43dee1ad47SJeff Kirsher                                          ixgbe_link_speed speed,
44dee1ad47SJeff Kirsher                                          bool autoneg,
45dee1ad47SJeff Kirsher                                          bool autoneg_wait_to_complete);
46dee1ad47SJeff Kirsher static s32 ixgbe_read_i2c_eeprom_82598(struct ixgbe_hw *hw, u8 byte_offset,
47dee1ad47SJeff Kirsher                                        u8 *eeprom_data);
48dee1ad47SJeff Kirsher 
49dee1ad47SJeff Kirsher /**
50dee1ad47SJeff Kirsher  *  ixgbe_set_pcie_completion_timeout - set pci-e completion timeout
51dee1ad47SJeff Kirsher  *  @hw: pointer to the HW structure
52dee1ad47SJeff Kirsher  *
53dee1ad47SJeff Kirsher  *  The defaults for 82598 should be in the range of 50us to 50ms,
54dee1ad47SJeff Kirsher  *  however the hardware default for these parts is 500us to 1ms which is less
55dee1ad47SJeff Kirsher  *  than the 10ms recommended by the pci-e spec.  To address this we need to
56dee1ad47SJeff Kirsher  *  increase the value to either 10ms to 250ms for capability version 1 config,
57dee1ad47SJeff Kirsher  *  or 16ms to 55ms for version 2.
58dee1ad47SJeff Kirsher  **/
59dee1ad47SJeff Kirsher static void ixgbe_set_pcie_completion_timeout(struct ixgbe_hw *hw)
60dee1ad47SJeff Kirsher {
61dee1ad47SJeff Kirsher 	struct ixgbe_adapter *adapter = hw->back;
62dee1ad47SJeff Kirsher 	u32 gcr = IXGBE_READ_REG(hw, IXGBE_GCR);
63dee1ad47SJeff Kirsher 	u16 pcie_devctl2;
64dee1ad47SJeff Kirsher 
65dee1ad47SJeff Kirsher 	/* only take action if timeout value is defaulted to 0 */
66dee1ad47SJeff Kirsher 	if (gcr & IXGBE_GCR_CMPL_TMOUT_MASK)
67dee1ad47SJeff Kirsher 		goto out;
68dee1ad47SJeff Kirsher 
69dee1ad47SJeff Kirsher 	/*
70dee1ad47SJeff Kirsher 	 * if capababilities version is type 1 we can write the
71dee1ad47SJeff Kirsher 	 * timeout of 10ms to 250ms through the GCR register
72dee1ad47SJeff Kirsher 	 */
73dee1ad47SJeff Kirsher 	if (!(gcr & IXGBE_GCR_CAP_VER2)) {
74dee1ad47SJeff Kirsher 		gcr |= IXGBE_GCR_CMPL_TMOUT_10ms;
75dee1ad47SJeff Kirsher 		goto out;
76dee1ad47SJeff Kirsher 	}
77dee1ad47SJeff Kirsher 
78dee1ad47SJeff Kirsher 	/*
79dee1ad47SJeff Kirsher 	 * for version 2 capabilities we need to write the config space
80dee1ad47SJeff Kirsher 	 * directly in order to set the completion timeout value for
81dee1ad47SJeff Kirsher 	 * 16ms to 55ms
82dee1ad47SJeff Kirsher 	 */
83dee1ad47SJeff Kirsher 	pci_read_config_word(adapter->pdev,
84dee1ad47SJeff Kirsher 	                     IXGBE_PCI_DEVICE_CONTROL2, &pcie_devctl2);
85dee1ad47SJeff Kirsher 	pcie_devctl2 |= IXGBE_PCI_DEVICE_CONTROL2_16ms;
86dee1ad47SJeff Kirsher 	pci_write_config_word(adapter->pdev,
87dee1ad47SJeff Kirsher 	                      IXGBE_PCI_DEVICE_CONTROL2, pcie_devctl2);
88dee1ad47SJeff Kirsher out:
89dee1ad47SJeff Kirsher 	/* disable completion timeout resend */
90dee1ad47SJeff Kirsher 	gcr &= ~IXGBE_GCR_CMPL_TMOUT_RESEND;
91dee1ad47SJeff Kirsher 	IXGBE_WRITE_REG(hw, IXGBE_GCR, gcr);
92dee1ad47SJeff Kirsher }
93dee1ad47SJeff Kirsher 
94dee1ad47SJeff Kirsher /**
95dee1ad47SJeff Kirsher  *  ixgbe_get_pcie_msix_count_82598 - Gets MSI-X vector count
96dee1ad47SJeff Kirsher  *  @hw: pointer to hardware structure
97dee1ad47SJeff Kirsher  *
98dee1ad47SJeff Kirsher  *  Read PCIe configuration space, and get the MSI-X vector count from
99dee1ad47SJeff Kirsher  *  the capabilities table.
100dee1ad47SJeff Kirsher  **/
101dee1ad47SJeff Kirsher static u16 ixgbe_get_pcie_msix_count_82598(struct ixgbe_hw *hw)
102dee1ad47SJeff Kirsher {
103dee1ad47SJeff Kirsher 	struct ixgbe_adapter *adapter = hw->back;
104dee1ad47SJeff Kirsher 	u16 msix_count;
105dee1ad47SJeff Kirsher 	pci_read_config_word(adapter->pdev, IXGBE_PCIE_MSIX_82598_CAPS,
106dee1ad47SJeff Kirsher 	                     &msix_count);
107dee1ad47SJeff Kirsher 	msix_count &= IXGBE_PCIE_MSIX_TBL_SZ_MASK;
108dee1ad47SJeff Kirsher 
109dee1ad47SJeff Kirsher 	/* MSI-X count is zero-based in HW, so increment to give proper value */
110dee1ad47SJeff Kirsher 	msix_count++;
111dee1ad47SJeff Kirsher 
112dee1ad47SJeff Kirsher 	return msix_count;
113dee1ad47SJeff Kirsher }
114dee1ad47SJeff Kirsher 
115dee1ad47SJeff Kirsher /**
116dee1ad47SJeff Kirsher  */
117dee1ad47SJeff Kirsher static s32 ixgbe_get_invariants_82598(struct ixgbe_hw *hw)
118dee1ad47SJeff Kirsher {
119dee1ad47SJeff Kirsher 	struct ixgbe_mac_info *mac = &hw->mac;
120dee1ad47SJeff Kirsher 
121dee1ad47SJeff Kirsher 	/* Call PHY identify routine to get the phy type */
122dee1ad47SJeff Kirsher 	ixgbe_identify_phy_generic(hw);
123dee1ad47SJeff Kirsher 
124dee1ad47SJeff Kirsher 	mac->mcft_size = IXGBE_82598_MC_TBL_SIZE;
125dee1ad47SJeff Kirsher 	mac->vft_size = IXGBE_82598_VFT_TBL_SIZE;
126dee1ad47SJeff Kirsher 	mac->num_rar_entries = IXGBE_82598_RAR_ENTRIES;
127dee1ad47SJeff Kirsher 	mac->max_rx_queues = IXGBE_82598_MAX_RX_QUEUES;
128dee1ad47SJeff Kirsher 	mac->max_tx_queues = IXGBE_82598_MAX_TX_QUEUES;
129dee1ad47SJeff Kirsher 	mac->max_msix_vectors = ixgbe_get_pcie_msix_count_82598(hw);
130dee1ad47SJeff Kirsher 
131dee1ad47SJeff Kirsher 	return 0;
132dee1ad47SJeff Kirsher }
133dee1ad47SJeff Kirsher 
134dee1ad47SJeff Kirsher /**
135dee1ad47SJeff Kirsher  *  ixgbe_init_phy_ops_82598 - PHY/SFP specific init
136dee1ad47SJeff Kirsher  *  @hw: pointer to hardware structure
137dee1ad47SJeff Kirsher  *
138dee1ad47SJeff Kirsher  *  Initialize any function pointers that were not able to be
139dee1ad47SJeff Kirsher  *  set during get_invariants because the PHY/SFP type was
140dee1ad47SJeff Kirsher  *  not known.  Perform the SFP init if necessary.
141dee1ad47SJeff Kirsher  *
142dee1ad47SJeff Kirsher  **/
143dee1ad47SJeff Kirsher static s32 ixgbe_init_phy_ops_82598(struct ixgbe_hw *hw)
144dee1ad47SJeff Kirsher {
145dee1ad47SJeff Kirsher 	struct ixgbe_mac_info *mac = &hw->mac;
146dee1ad47SJeff Kirsher 	struct ixgbe_phy_info *phy = &hw->phy;
147dee1ad47SJeff Kirsher 	s32 ret_val = 0;
148dee1ad47SJeff Kirsher 	u16 list_offset, data_offset;
149dee1ad47SJeff Kirsher 
150dee1ad47SJeff Kirsher 	/* Identify the PHY */
151dee1ad47SJeff Kirsher 	phy->ops.identify(hw);
152dee1ad47SJeff Kirsher 
153dee1ad47SJeff Kirsher 	/* Overwrite the link function pointers if copper PHY */
154dee1ad47SJeff Kirsher 	if (mac->ops.get_media_type(hw) == ixgbe_media_type_copper) {
155dee1ad47SJeff Kirsher 		mac->ops.setup_link = &ixgbe_setup_copper_link_82598;
156dee1ad47SJeff Kirsher 		mac->ops.get_link_capabilities =
157dee1ad47SJeff Kirsher 			&ixgbe_get_copper_link_capabilities_generic;
158dee1ad47SJeff Kirsher 	}
159dee1ad47SJeff Kirsher 
160dee1ad47SJeff Kirsher 	switch (hw->phy.type) {
161dee1ad47SJeff Kirsher 	case ixgbe_phy_tn:
162dee1ad47SJeff Kirsher 		phy->ops.setup_link = &ixgbe_setup_phy_link_tnx;
163dee1ad47SJeff Kirsher 		phy->ops.check_link = &ixgbe_check_phy_link_tnx;
164dee1ad47SJeff Kirsher 		phy->ops.get_firmware_version =
165dee1ad47SJeff Kirsher 		             &ixgbe_get_phy_firmware_version_tnx;
166dee1ad47SJeff Kirsher 		break;
167dee1ad47SJeff Kirsher 	case ixgbe_phy_nl:
168dee1ad47SJeff Kirsher 		phy->ops.reset = &ixgbe_reset_phy_nl;
169dee1ad47SJeff Kirsher 
170dee1ad47SJeff Kirsher 		/* Call SFP+ identify routine to get the SFP+ module type */
171dee1ad47SJeff Kirsher 		ret_val = phy->ops.identify_sfp(hw);
172dee1ad47SJeff Kirsher 		if (ret_val != 0)
173dee1ad47SJeff Kirsher 			goto out;
174dee1ad47SJeff Kirsher 		else if (hw->phy.sfp_type == ixgbe_sfp_type_unknown) {
175dee1ad47SJeff Kirsher 			ret_val = IXGBE_ERR_SFP_NOT_SUPPORTED;
176dee1ad47SJeff Kirsher 			goto out;
177dee1ad47SJeff Kirsher 		}
178dee1ad47SJeff Kirsher 
179dee1ad47SJeff Kirsher 		/* Check to see if SFP+ module is supported */
180dee1ad47SJeff Kirsher 		ret_val = ixgbe_get_sfp_init_sequence_offsets(hw,
181dee1ad47SJeff Kirsher 		                                            &list_offset,
182dee1ad47SJeff Kirsher 		                                            &data_offset);
183dee1ad47SJeff Kirsher 		if (ret_val != 0) {
184dee1ad47SJeff Kirsher 			ret_val = IXGBE_ERR_SFP_NOT_SUPPORTED;
185dee1ad47SJeff Kirsher 			goto out;
186dee1ad47SJeff Kirsher 		}
187dee1ad47SJeff Kirsher 		break;
188dee1ad47SJeff Kirsher 	default:
189dee1ad47SJeff Kirsher 		break;
190dee1ad47SJeff Kirsher 	}
191dee1ad47SJeff Kirsher 
192dee1ad47SJeff Kirsher out:
193dee1ad47SJeff Kirsher 	return ret_val;
194dee1ad47SJeff Kirsher }
195dee1ad47SJeff Kirsher 
196dee1ad47SJeff Kirsher /**
197dee1ad47SJeff Kirsher  *  ixgbe_start_hw_82598 - Prepare hardware for Tx/Rx
198dee1ad47SJeff Kirsher  *  @hw: pointer to hardware structure
199dee1ad47SJeff Kirsher  *
200dee1ad47SJeff Kirsher  *  Starts the hardware using the generic start_hw function.
201dee1ad47SJeff Kirsher  *  Disables relaxed ordering Then set pcie completion timeout
202dee1ad47SJeff Kirsher  *
203dee1ad47SJeff Kirsher  **/
204dee1ad47SJeff Kirsher static s32 ixgbe_start_hw_82598(struct ixgbe_hw *hw)
205dee1ad47SJeff Kirsher {
206dee1ad47SJeff Kirsher 	u32 regval;
207dee1ad47SJeff Kirsher 	u32 i;
208dee1ad47SJeff Kirsher 	s32 ret_val = 0;
209dee1ad47SJeff Kirsher 
210dee1ad47SJeff Kirsher 	ret_val = ixgbe_start_hw_generic(hw);
211dee1ad47SJeff Kirsher 
212dee1ad47SJeff Kirsher 	/* Disable relaxed ordering */
213dee1ad47SJeff Kirsher 	for (i = 0; ((i < hw->mac.max_tx_queues) &&
214dee1ad47SJeff Kirsher 	     (i < IXGBE_DCA_MAX_QUEUES_82598)); i++) {
215dee1ad47SJeff Kirsher 		regval = IXGBE_READ_REG(hw, IXGBE_DCA_TXCTRL(i));
216dee1ad47SJeff Kirsher 		regval &= ~IXGBE_DCA_TXCTRL_TX_WB_RO_EN;
217dee1ad47SJeff Kirsher 		IXGBE_WRITE_REG(hw, IXGBE_DCA_TXCTRL(i), regval);
218dee1ad47SJeff Kirsher 	}
219dee1ad47SJeff Kirsher 
220dee1ad47SJeff Kirsher 	for (i = 0; ((i < hw->mac.max_rx_queues) &&
221dee1ad47SJeff Kirsher 	     (i < IXGBE_DCA_MAX_QUEUES_82598)); i++) {
222dee1ad47SJeff Kirsher 		regval = IXGBE_READ_REG(hw, IXGBE_DCA_RXCTRL(i));
223dee1ad47SJeff Kirsher 		regval &= ~(IXGBE_DCA_RXCTRL_DESC_WRO_EN |
224dee1ad47SJeff Kirsher 			    IXGBE_DCA_RXCTRL_DESC_HSRO_EN);
225dee1ad47SJeff Kirsher 		IXGBE_WRITE_REG(hw, IXGBE_DCA_RXCTRL(i), regval);
226dee1ad47SJeff Kirsher 	}
227dee1ad47SJeff Kirsher 
228dee1ad47SJeff Kirsher 	hw->mac.rx_pb_size = IXGBE_82598_RX_PB_SIZE;
229dee1ad47SJeff Kirsher 
230dee1ad47SJeff Kirsher 	/* set the completion timeout for interface */
231dee1ad47SJeff Kirsher 	if (ret_val == 0)
232dee1ad47SJeff Kirsher 		ixgbe_set_pcie_completion_timeout(hw);
233dee1ad47SJeff Kirsher 
234dee1ad47SJeff Kirsher 	return ret_val;
235dee1ad47SJeff Kirsher }
236dee1ad47SJeff Kirsher 
237dee1ad47SJeff Kirsher /**
238dee1ad47SJeff Kirsher  *  ixgbe_get_link_capabilities_82598 - Determines link capabilities
239dee1ad47SJeff Kirsher  *  @hw: pointer to hardware structure
240dee1ad47SJeff Kirsher  *  @speed: pointer to link speed
241dee1ad47SJeff Kirsher  *  @autoneg: boolean auto-negotiation value
242dee1ad47SJeff Kirsher  *
243dee1ad47SJeff Kirsher  *  Determines the link capabilities by reading the AUTOC register.
244dee1ad47SJeff Kirsher  **/
245dee1ad47SJeff Kirsher static s32 ixgbe_get_link_capabilities_82598(struct ixgbe_hw *hw,
246dee1ad47SJeff Kirsher                                              ixgbe_link_speed *speed,
247dee1ad47SJeff Kirsher                                              bool *autoneg)
248dee1ad47SJeff Kirsher {
249dee1ad47SJeff Kirsher 	s32 status = 0;
250dee1ad47SJeff Kirsher 	u32 autoc = 0;
251dee1ad47SJeff Kirsher 
252dee1ad47SJeff Kirsher 	/*
253dee1ad47SJeff Kirsher 	 * Determine link capabilities based on the stored value of AUTOC,
254dee1ad47SJeff Kirsher 	 * which represents EEPROM defaults.  If AUTOC value has not been
255dee1ad47SJeff Kirsher 	 * stored, use the current register value.
256dee1ad47SJeff Kirsher 	 */
257dee1ad47SJeff Kirsher 	if (hw->mac.orig_link_settings_stored)
258dee1ad47SJeff Kirsher 		autoc = hw->mac.orig_autoc;
259dee1ad47SJeff Kirsher 	else
260dee1ad47SJeff Kirsher 		autoc = IXGBE_READ_REG(hw, IXGBE_AUTOC);
261dee1ad47SJeff Kirsher 
262dee1ad47SJeff Kirsher 	switch (autoc & IXGBE_AUTOC_LMS_MASK) {
263dee1ad47SJeff Kirsher 	case IXGBE_AUTOC_LMS_1G_LINK_NO_AN:
264dee1ad47SJeff Kirsher 		*speed = IXGBE_LINK_SPEED_1GB_FULL;
265dee1ad47SJeff Kirsher 		*autoneg = false;
266dee1ad47SJeff Kirsher 		break;
267dee1ad47SJeff Kirsher 
268dee1ad47SJeff Kirsher 	case IXGBE_AUTOC_LMS_10G_LINK_NO_AN:
269dee1ad47SJeff Kirsher 		*speed = IXGBE_LINK_SPEED_10GB_FULL;
270dee1ad47SJeff Kirsher 		*autoneg = false;
271dee1ad47SJeff Kirsher 		break;
272dee1ad47SJeff Kirsher 
273dee1ad47SJeff Kirsher 	case IXGBE_AUTOC_LMS_1G_AN:
274dee1ad47SJeff Kirsher 		*speed = IXGBE_LINK_SPEED_1GB_FULL;
275dee1ad47SJeff Kirsher 		*autoneg = true;
276dee1ad47SJeff Kirsher 		break;
277dee1ad47SJeff Kirsher 
278dee1ad47SJeff Kirsher 	case IXGBE_AUTOC_LMS_KX4_AN:
279dee1ad47SJeff Kirsher 	case IXGBE_AUTOC_LMS_KX4_AN_1G_AN:
280dee1ad47SJeff Kirsher 		*speed = IXGBE_LINK_SPEED_UNKNOWN;
281dee1ad47SJeff Kirsher 		if (autoc & IXGBE_AUTOC_KX4_SUPP)
282dee1ad47SJeff Kirsher 			*speed |= IXGBE_LINK_SPEED_10GB_FULL;
283dee1ad47SJeff Kirsher 		if (autoc & IXGBE_AUTOC_KX_SUPP)
284dee1ad47SJeff Kirsher 			*speed |= IXGBE_LINK_SPEED_1GB_FULL;
285dee1ad47SJeff Kirsher 		*autoneg = true;
286dee1ad47SJeff Kirsher 		break;
287dee1ad47SJeff Kirsher 
288dee1ad47SJeff Kirsher 	default:
289dee1ad47SJeff Kirsher 		status = IXGBE_ERR_LINK_SETUP;
290dee1ad47SJeff Kirsher 		break;
291dee1ad47SJeff Kirsher 	}
292dee1ad47SJeff Kirsher 
293dee1ad47SJeff Kirsher 	return status;
294dee1ad47SJeff Kirsher }
295dee1ad47SJeff Kirsher 
296dee1ad47SJeff Kirsher /**
297dee1ad47SJeff Kirsher  *  ixgbe_get_media_type_82598 - Determines media type
298dee1ad47SJeff Kirsher  *  @hw: pointer to hardware structure
299dee1ad47SJeff Kirsher  *
300dee1ad47SJeff Kirsher  *  Returns the media type (fiber, copper, backplane)
301dee1ad47SJeff Kirsher  **/
302dee1ad47SJeff Kirsher static enum ixgbe_media_type ixgbe_get_media_type_82598(struct ixgbe_hw *hw)
303dee1ad47SJeff Kirsher {
304dee1ad47SJeff Kirsher 	enum ixgbe_media_type media_type;
305dee1ad47SJeff Kirsher 
306dee1ad47SJeff Kirsher 	/* Detect if there is a copper PHY attached. */
307dee1ad47SJeff Kirsher 	switch (hw->phy.type) {
308dee1ad47SJeff Kirsher 	case ixgbe_phy_cu_unknown:
309dee1ad47SJeff Kirsher 	case ixgbe_phy_tn:
310dee1ad47SJeff Kirsher 		media_type = ixgbe_media_type_copper;
311dee1ad47SJeff Kirsher 		goto out;
312dee1ad47SJeff Kirsher 	default:
313dee1ad47SJeff Kirsher 		break;
314dee1ad47SJeff Kirsher 	}
315dee1ad47SJeff Kirsher 
316dee1ad47SJeff Kirsher 	/* Media type for I82598 is based on device ID */
317dee1ad47SJeff Kirsher 	switch (hw->device_id) {
318dee1ad47SJeff Kirsher 	case IXGBE_DEV_ID_82598:
319dee1ad47SJeff Kirsher 	case IXGBE_DEV_ID_82598_BX:
320dee1ad47SJeff Kirsher 		/* Default device ID is mezzanine card KX/KX4 */
321dee1ad47SJeff Kirsher 		media_type = ixgbe_media_type_backplane;
322dee1ad47SJeff Kirsher 		break;
323dee1ad47SJeff Kirsher 	case IXGBE_DEV_ID_82598AF_DUAL_PORT:
324dee1ad47SJeff Kirsher 	case IXGBE_DEV_ID_82598AF_SINGLE_PORT:
325dee1ad47SJeff Kirsher 	case IXGBE_DEV_ID_82598_DA_DUAL_PORT:
326dee1ad47SJeff Kirsher 	case IXGBE_DEV_ID_82598_SR_DUAL_PORT_EM:
327dee1ad47SJeff Kirsher 	case IXGBE_DEV_ID_82598EB_XF_LR:
328dee1ad47SJeff Kirsher 	case IXGBE_DEV_ID_82598EB_SFP_LOM:
329dee1ad47SJeff Kirsher 		media_type = ixgbe_media_type_fiber;
330dee1ad47SJeff Kirsher 		break;
331dee1ad47SJeff Kirsher 	case IXGBE_DEV_ID_82598EB_CX4:
332dee1ad47SJeff Kirsher 	case IXGBE_DEV_ID_82598_CX4_DUAL_PORT:
333dee1ad47SJeff Kirsher 		media_type = ixgbe_media_type_cx4;
334dee1ad47SJeff Kirsher 		break;
335dee1ad47SJeff Kirsher 	case IXGBE_DEV_ID_82598AT:
336dee1ad47SJeff Kirsher 	case IXGBE_DEV_ID_82598AT2:
337dee1ad47SJeff Kirsher 		media_type = ixgbe_media_type_copper;
338dee1ad47SJeff Kirsher 		break;
339dee1ad47SJeff Kirsher 	default:
340dee1ad47SJeff Kirsher 		media_type = ixgbe_media_type_unknown;
341dee1ad47SJeff Kirsher 		break;
342dee1ad47SJeff Kirsher 	}
343dee1ad47SJeff Kirsher out:
344dee1ad47SJeff Kirsher 	return media_type;
345dee1ad47SJeff Kirsher }
346dee1ad47SJeff Kirsher 
347dee1ad47SJeff Kirsher /**
348dee1ad47SJeff Kirsher  *  ixgbe_fc_enable_82598 - Enable flow control
349dee1ad47SJeff Kirsher  *  @hw: pointer to hardware structure
350dee1ad47SJeff Kirsher  *  @packetbuf_num: packet buffer number (0-7)
351dee1ad47SJeff Kirsher  *
352dee1ad47SJeff Kirsher  *  Enable flow control according to the current settings.
353dee1ad47SJeff Kirsher  **/
354dee1ad47SJeff Kirsher static s32 ixgbe_fc_enable_82598(struct ixgbe_hw *hw, s32 packetbuf_num)
355dee1ad47SJeff Kirsher {
356dee1ad47SJeff Kirsher 	s32 ret_val = 0;
357dee1ad47SJeff Kirsher 	u32 fctrl_reg;
358dee1ad47SJeff Kirsher 	u32 rmcs_reg;
359dee1ad47SJeff Kirsher 	u32 reg;
360dee1ad47SJeff Kirsher 	u32 link_speed = 0;
361dee1ad47SJeff Kirsher 	bool link_up;
362dee1ad47SJeff Kirsher 
363dee1ad47SJeff Kirsher #ifdef CONFIG_DCB
364dee1ad47SJeff Kirsher 	if (hw->fc.requested_mode == ixgbe_fc_pfc)
365dee1ad47SJeff Kirsher 		goto out;
366dee1ad47SJeff Kirsher 
367dee1ad47SJeff Kirsher #endif /* CONFIG_DCB */
368dee1ad47SJeff Kirsher 	/*
369dee1ad47SJeff Kirsher 	 * On 82598 having Rx FC on causes resets while doing 1G
370dee1ad47SJeff Kirsher 	 * so if it's on turn it off once we know link_speed. For
371dee1ad47SJeff Kirsher 	 * more details see 82598 Specification update.
372dee1ad47SJeff Kirsher 	 */
373dee1ad47SJeff Kirsher 	hw->mac.ops.check_link(hw, &link_speed, &link_up, false);
374dee1ad47SJeff Kirsher 	if (link_up && link_speed == IXGBE_LINK_SPEED_1GB_FULL) {
375dee1ad47SJeff Kirsher 		switch (hw->fc.requested_mode) {
376dee1ad47SJeff Kirsher 		case ixgbe_fc_full:
377dee1ad47SJeff Kirsher 			hw->fc.requested_mode = ixgbe_fc_tx_pause;
378dee1ad47SJeff Kirsher 			break;
379dee1ad47SJeff Kirsher 		case ixgbe_fc_rx_pause:
380dee1ad47SJeff Kirsher 			hw->fc.requested_mode = ixgbe_fc_none;
381dee1ad47SJeff Kirsher 			break;
382dee1ad47SJeff Kirsher 		default:
383dee1ad47SJeff Kirsher 			/* no change */
384dee1ad47SJeff Kirsher 			break;
385dee1ad47SJeff Kirsher 		}
386dee1ad47SJeff Kirsher 	}
387dee1ad47SJeff Kirsher 
388dee1ad47SJeff Kirsher 	/* Negotiate the fc mode to use */
389dee1ad47SJeff Kirsher 	ret_val = ixgbe_fc_autoneg(hw);
390dee1ad47SJeff Kirsher 	if (ret_val == IXGBE_ERR_FLOW_CONTROL)
391dee1ad47SJeff Kirsher 		goto out;
392dee1ad47SJeff Kirsher 
393dee1ad47SJeff Kirsher 	/* Disable any previous flow control settings */
394dee1ad47SJeff Kirsher 	fctrl_reg = IXGBE_READ_REG(hw, IXGBE_FCTRL);
395dee1ad47SJeff Kirsher 	fctrl_reg &= ~(IXGBE_FCTRL_RFCE | IXGBE_FCTRL_RPFCE);
396dee1ad47SJeff Kirsher 
397dee1ad47SJeff Kirsher 	rmcs_reg = IXGBE_READ_REG(hw, IXGBE_RMCS);
398dee1ad47SJeff Kirsher 	rmcs_reg &= ~(IXGBE_RMCS_TFCE_PRIORITY | IXGBE_RMCS_TFCE_802_3X);
399dee1ad47SJeff Kirsher 
400dee1ad47SJeff Kirsher 	/*
401dee1ad47SJeff Kirsher 	 * The possible values of fc.current_mode are:
402dee1ad47SJeff Kirsher 	 * 0: Flow control is completely disabled
403dee1ad47SJeff Kirsher 	 * 1: Rx flow control is enabled (we can receive pause frames,
404dee1ad47SJeff Kirsher 	 *    but not send pause frames).
405dee1ad47SJeff Kirsher 	 * 2: Tx flow control is enabled (we can send pause frames but
406dee1ad47SJeff Kirsher 	 *     we do not support receiving pause frames).
407dee1ad47SJeff Kirsher 	 * 3: Both Rx and Tx flow control (symmetric) are enabled.
408dee1ad47SJeff Kirsher #ifdef CONFIG_DCB
409dee1ad47SJeff Kirsher 	 * 4: Priority Flow Control is enabled.
410dee1ad47SJeff Kirsher #endif
411dee1ad47SJeff Kirsher 	 * other: Invalid.
412dee1ad47SJeff Kirsher 	 */
413dee1ad47SJeff Kirsher 	switch (hw->fc.current_mode) {
414dee1ad47SJeff Kirsher 	case ixgbe_fc_none:
415dee1ad47SJeff Kirsher 		/*
416dee1ad47SJeff Kirsher 		 * Flow control is disabled by software override or autoneg.
417dee1ad47SJeff Kirsher 		 * The code below will actually disable it in the HW.
418dee1ad47SJeff Kirsher 		 */
419dee1ad47SJeff Kirsher 		break;
420dee1ad47SJeff Kirsher 	case ixgbe_fc_rx_pause:
421dee1ad47SJeff Kirsher 		/*
422dee1ad47SJeff Kirsher 		 * Rx Flow control is enabled and Tx Flow control is
423dee1ad47SJeff Kirsher 		 * disabled by software override. Since there really
424dee1ad47SJeff Kirsher 		 * isn't a way to advertise that we are capable of RX
425dee1ad47SJeff Kirsher 		 * Pause ONLY, we will advertise that we support both
426dee1ad47SJeff Kirsher 		 * symmetric and asymmetric Rx PAUSE.  Later, we will
427dee1ad47SJeff Kirsher 		 * disable the adapter's ability to send PAUSE frames.
428dee1ad47SJeff Kirsher 		 */
429dee1ad47SJeff Kirsher 		fctrl_reg |= IXGBE_FCTRL_RFCE;
430dee1ad47SJeff Kirsher 		break;
431dee1ad47SJeff Kirsher 	case ixgbe_fc_tx_pause:
432dee1ad47SJeff Kirsher 		/*
433dee1ad47SJeff Kirsher 		 * Tx Flow control is enabled, and Rx Flow control is
434dee1ad47SJeff Kirsher 		 * disabled by software override.
435dee1ad47SJeff Kirsher 		 */
436dee1ad47SJeff Kirsher 		rmcs_reg |= IXGBE_RMCS_TFCE_802_3X;
437dee1ad47SJeff Kirsher 		break;
438dee1ad47SJeff Kirsher 	case ixgbe_fc_full:
439dee1ad47SJeff Kirsher 		/* Flow control (both Rx and Tx) is enabled by SW override. */
440dee1ad47SJeff Kirsher 		fctrl_reg |= IXGBE_FCTRL_RFCE;
441dee1ad47SJeff Kirsher 		rmcs_reg |= IXGBE_RMCS_TFCE_802_3X;
442dee1ad47SJeff Kirsher 		break;
443dee1ad47SJeff Kirsher #ifdef CONFIG_DCB
444dee1ad47SJeff Kirsher 	case ixgbe_fc_pfc:
445dee1ad47SJeff Kirsher 		goto out;
446dee1ad47SJeff Kirsher 		break;
447dee1ad47SJeff Kirsher #endif /* CONFIG_DCB */
448dee1ad47SJeff Kirsher 	default:
449dee1ad47SJeff Kirsher 		hw_dbg(hw, "Flow control param set incorrectly\n");
450dee1ad47SJeff Kirsher 		ret_val = IXGBE_ERR_CONFIG;
451dee1ad47SJeff Kirsher 		goto out;
452dee1ad47SJeff Kirsher 		break;
453dee1ad47SJeff Kirsher 	}
454dee1ad47SJeff Kirsher 
455dee1ad47SJeff Kirsher 	/* Set 802.3x based flow control settings. */
456dee1ad47SJeff Kirsher 	fctrl_reg |= IXGBE_FCTRL_DPF;
457dee1ad47SJeff Kirsher 	IXGBE_WRITE_REG(hw, IXGBE_FCTRL, fctrl_reg);
458dee1ad47SJeff Kirsher 	IXGBE_WRITE_REG(hw, IXGBE_RMCS, rmcs_reg);
459dee1ad47SJeff Kirsher 
460dee1ad47SJeff Kirsher 	/* Set up and enable Rx high/low water mark thresholds, enable XON. */
461dee1ad47SJeff Kirsher 	if (hw->fc.current_mode & ixgbe_fc_tx_pause) {
4629da712d2SJohn Fastabend 		reg = hw->fc.low_water << 6;
463dee1ad47SJeff Kirsher 		if (hw->fc.send_xon)
464dee1ad47SJeff Kirsher 			reg |= IXGBE_FCRTL_XONE;
465dee1ad47SJeff Kirsher 
466dee1ad47SJeff Kirsher 		IXGBE_WRITE_REG(hw, IXGBE_FCRTL(packetbuf_num), reg);
467dee1ad47SJeff Kirsher 
4689da712d2SJohn Fastabend 		reg = hw->fc.high_water[packetbuf_num] << 6;
469dee1ad47SJeff Kirsher 		reg |= IXGBE_FCRTH_FCEN;
470dee1ad47SJeff Kirsher 
471dee1ad47SJeff Kirsher 		IXGBE_WRITE_REG(hw, IXGBE_FCRTH(packetbuf_num), reg);
472dee1ad47SJeff Kirsher 	}
473dee1ad47SJeff Kirsher 
474dee1ad47SJeff Kirsher 	/* Configure pause time (2 TCs per register) */
475dee1ad47SJeff Kirsher 	reg = IXGBE_READ_REG(hw, IXGBE_FCTTV(packetbuf_num / 2));
476dee1ad47SJeff Kirsher 	if ((packetbuf_num & 1) == 0)
477dee1ad47SJeff Kirsher 		reg = (reg & 0xFFFF0000) | hw->fc.pause_time;
478dee1ad47SJeff Kirsher 	else
479dee1ad47SJeff Kirsher 		reg = (reg & 0x0000FFFF) | (hw->fc.pause_time << 16);
480dee1ad47SJeff Kirsher 	IXGBE_WRITE_REG(hw, IXGBE_FCTTV(packetbuf_num / 2), reg);
481dee1ad47SJeff Kirsher 
482dee1ad47SJeff Kirsher 	IXGBE_WRITE_REG(hw, IXGBE_FCRTV, (hw->fc.pause_time >> 1));
483dee1ad47SJeff Kirsher 
484dee1ad47SJeff Kirsher out:
485dee1ad47SJeff Kirsher 	return ret_val;
486dee1ad47SJeff Kirsher }
487dee1ad47SJeff Kirsher 
488dee1ad47SJeff Kirsher /**
489dee1ad47SJeff Kirsher  *  ixgbe_start_mac_link_82598 - Configures MAC link settings
490dee1ad47SJeff Kirsher  *  @hw: pointer to hardware structure
491dee1ad47SJeff Kirsher  *
492dee1ad47SJeff Kirsher  *  Configures link settings based on values in the ixgbe_hw struct.
493dee1ad47SJeff Kirsher  *  Restarts the link.  Performs autonegotiation if needed.
494dee1ad47SJeff Kirsher  **/
495dee1ad47SJeff Kirsher static s32 ixgbe_start_mac_link_82598(struct ixgbe_hw *hw,
496dee1ad47SJeff Kirsher                                       bool autoneg_wait_to_complete)
497dee1ad47SJeff Kirsher {
498dee1ad47SJeff Kirsher 	u32 autoc_reg;
499dee1ad47SJeff Kirsher 	u32 links_reg;
500dee1ad47SJeff Kirsher 	u32 i;
501dee1ad47SJeff Kirsher 	s32 status = 0;
502dee1ad47SJeff Kirsher 
503dee1ad47SJeff Kirsher 	/* Restart link */
504dee1ad47SJeff Kirsher 	autoc_reg = IXGBE_READ_REG(hw, IXGBE_AUTOC);
505dee1ad47SJeff Kirsher 	autoc_reg |= IXGBE_AUTOC_AN_RESTART;
506dee1ad47SJeff Kirsher 	IXGBE_WRITE_REG(hw, IXGBE_AUTOC, autoc_reg);
507dee1ad47SJeff Kirsher 
508dee1ad47SJeff Kirsher 	/* Only poll for autoneg to complete if specified to do so */
509dee1ad47SJeff Kirsher 	if (autoneg_wait_to_complete) {
510dee1ad47SJeff Kirsher 		if ((autoc_reg & IXGBE_AUTOC_LMS_MASK) ==
511dee1ad47SJeff Kirsher 		     IXGBE_AUTOC_LMS_KX4_AN ||
512dee1ad47SJeff Kirsher 		    (autoc_reg & IXGBE_AUTOC_LMS_MASK) ==
513dee1ad47SJeff Kirsher 		     IXGBE_AUTOC_LMS_KX4_AN_1G_AN) {
514dee1ad47SJeff Kirsher 			links_reg = 0; /* Just in case Autoneg time = 0 */
515dee1ad47SJeff Kirsher 			for (i = 0; i < IXGBE_AUTO_NEG_TIME; i++) {
516dee1ad47SJeff Kirsher 				links_reg = IXGBE_READ_REG(hw, IXGBE_LINKS);
517dee1ad47SJeff Kirsher 				if (links_reg & IXGBE_LINKS_KX_AN_COMP)
518dee1ad47SJeff Kirsher 					break;
519dee1ad47SJeff Kirsher 				msleep(100);
520dee1ad47SJeff Kirsher 			}
521dee1ad47SJeff Kirsher 			if (!(links_reg & IXGBE_LINKS_KX_AN_COMP)) {
522dee1ad47SJeff Kirsher 				status = IXGBE_ERR_AUTONEG_NOT_COMPLETE;
523dee1ad47SJeff Kirsher 				hw_dbg(hw, "Autonegotiation did not complete.\n");
524dee1ad47SJeff Kirsher 			}
525dee1ad47SJeff Kirsher 		}
526dee1ad47SJeff Kirsher 	}
527dee1ad47SJeff Kirsher 
528dee1ad47SJeff Kirsher 	/* Add delay to filter out noises during initial link setup */
529dee1ad47SJeff Kirsher 	msleep(50);
530dee1ad47SJeff Kirsher 
531dee1ad47SJeff Kirsher 	return status;
532dee1ad47SJeff Kirsher }
533dee1ad47SJeff Kirsher 
534dee1ad47SJeff Kirsher /**
535dee1ad47SJeff Kirsher  *  ixgbe_validate_link_ready - Function looks for phy link
536dee1ad47SJeff Kirsher  *  @hw: pointer to hardware structure
537dee1ad47SJeff Kirsher  *
538dee1ad47SJeff Kirsher  *  Function indicates success when phy link is available. If phy is not ready
539dee1ad47SJeff Kirsher  *  within 5 seconds of MAC indicating link, the function returns error.
540dee1ad47SJeff Kirsher  **/
541dee1ad47SJeff Kirsher static s32 ixgbe_validate_link_ready(struct ixgbe_hw *hw)
542dee1ad47SJeff Kirsher {
543dee1ad47SJeff Kirsher 	u32 timeout;
544dee1ad47SJeff Kirsher 	u16 an_reg;
545dee1ad47SJeff Kirsher 
546dee1ad47SJeff Kirsher 	if (hw->device_id != IXGBE_DEV_ID_82598AT2)
547dee1ad47SJeff Kirsher 		return 0;
548dee1ad47SJeff Kirsher 
549dee1ad47SJeff Kirsher 	for (timeout = 0;
550dee1ad47SJeff Kirsher 	     timeout < IXGBE_VALIDATE_LINK_READY_TIMEOUT; timeout++) {
551dee1ad47SJeff Kirsher 		hw->phy.ops.read_reg(hw, MDIO_STAT1, MDIO_MMD_AN, &an_reg);
552dee1ad47SJeff Kirsher 
553dee1ad47SJeff Kirsher 		if ((an_reg & MDIO_AN_STAT1_COMPLETE) &&
554dee1ad47SJeff Kirsher 		    (an_reg & MDIO_STAT1_LSTATUS))
555dee1ad47SJeff Kirsher 			break;
556dee1ad47SJeff Kirsher 
557dee1ad47SJeff Kirsher 		msleep(100);
558dee1ad47SJeff Kirsher 	}
559dee1ad47SJeff Kirsher 
560dee1ad47SJeff Kirsher 	if (timeout == IXGBE_VALIDATE_LINK_READY_TIMEOUT) {
561dee1ad47SJeff Kirsher 		hw_dbg(hw, "Link was indicated but link is down\n");
562dee1ad47SJeff Kirsher 		return IXGBE_ERR_LINK_SETUP;
563dee1ad47SJeff Kirsher 	}
564dee1ad47SJeff Kirsher 
565dee1ad47SJeff Kirsher 	return 0;
566dee1ad47SJeff Kirsher }
567dee1ad47SJeff Kirsher 
568dee1ad47SJeff Kirsher /**
569dee1ad47SJeff Kirsher  *  ixgbe_check_mac_link_82598 - Get link/speed status
570dee1ad47SJeff Kirsher  *  @hw: pointer to hardware structure
571dee1ad47SJeff Kirsher  *  @speed: pointer to link speed
572dee1ad47SJeff Kirsher  *  @link_up: true is link is up, false otherwise
573dee1ad47SJeff Kirsher  *  @link_up_wait_to_complete: bool used to wait for link up or not
574dee1ad47SJeff Kirsher  *
575dee1ad47SJeff Kirsher  *  Reads the links register to determine if link is up and the current speed
576dee1ad47SJeff Kirsher  **/
577dee1ad47SJeff Kirsher static s32 ixgbe_check_mac_link_82598(struct ixgbe_hw *hw,
578dee1ad47SJeff Kirsher                                       ixgbe_link_speed *speed, bool *link_up,
579dee1ad47SJeff Kirsher                                       bool link_up_wait_to_complete)
580dee1ad47SJeff Kirsher {
581dee1ad47SJeff Kirsher 	u32 links_reg;
582dee1ad47SJeff Kirsher 	u32 i;
583dee1ad47SJeff Kirsher 	u16 link_reg, adapt_comp_reg;
584dee1ad47SJeff Kirsher 
585dee1ad47SJeff Kirsher 	/*
586dee1ad47SJeff Kirsher 	 * SERDES PHY requires us to read link status from register 0xC79F.
587dee1ad47SJeff Kirsher 	 * Bit 0 set indicates link is up/ready; clear indicates link down.
588dee1ad47SJeff Kirsher 	 * 0xC00C is read to check that the XAUI lanes are active.  Bit 0
589dee1ad47SJeff Kirsher 	 * clear indicates active; set indicates inactive.
590dee1ad47SJeff Kirsher 	 */
591dee1ad47SJeff Kirsher 	if (hw->phy.type == ixgbe_phy_nl) {
592dee1ad47SJeff Kirsher 		hw->phy.ops.read_reg(hw, 0xC79F, MDIO_MMD_PMAPMD, &link_reg);
593dee1ad47SJeff Kirsher 		hw->phy.ops.read_reg(hw, 0xC79F, MDIO_MMD_PMAPMD, &link_reg);
594dee1ad47SJeff Kirsher 		hw->phy.ops.read_reg(hw, 0xC00C, MDIO_MMD_PMAPMD,
595dee1ad47SJeff Kirsher 		                     &adapt_comp_reg);
596dee1ad47SJeff Kirsher 		if (link_up_wait_to_complete) {
597dee1ad47SJeff Kirsher 			for (i = 0; i < IXGBE_LINK_UP_TIME; i++) {
598dee1ad47SJeff Kirsher 				if ((link_reg & 1) &&
599dee1ad47SJeff Kirsher 				    ((adapt_comp_reg & 1) == 0)) {
600dee1ad47SJeff Kirsher 					*link_up = true;
601dee1ad47SJeff Kirsher 					break;
602dee1ad47SJeff Kirsher 				} else {
603dee1ad47SJeff Kirsher 					*link_up = false;
604dee1ad47SJeff Kirsher 				}
605dee1ad47SJeff Kirsher 				msleep(100);
606dee1ad47SJeff Kirsher 				hw->phy.ops.read_reg(hw, 0xC79F,
607dee1ad47SJeff Kirsher 				                     MDIO_MMD_PMAPMD,
608dee1ad47SJeff Kirsher 				                     &link_reg);
609dee1ad47SJeff Kirsher 				hw->phy.ops.read_reg(hw, 0xC00C,
610dee1ad47SJeff Kirsher 				                     MDIO_MMD_PMAPMD,
611dee1ad47SJeff Kirsher 				                     &adapt_comp_reg);
612dee1ad47SJeff Kirsher 			}
613dee1ad47SJeff Kirsher 		} else {
614dee1ad47SJeff Kirsher 			if ((link_reg & 1) && ((adapt_comp_reg & 1) == 0))
615dee1ad47SJeff Kirsher 				*link_up = true;
616dee1ad47SJeff Kirsher 			else
617dee1ad47SJeff Kirsher 				*link_up = false;
618dee1ad47SJeff Kirsher 		}
619dee1ad47SJeff Kirsher 
620dee1ad47SJeff Kirsher 		if (*link_up == false)
621dee1ad47SJeff Kirsher 			goto out;
622dee1ad47SJeff Kirsher 	}
623dee1ad47SJeff Kirsher 
624dee1ad47SJeff Kirsher 	links_reg = IXGBE_READ_REG(hw, IXGBE_LINKS);
625dee1ad47SJeff Kirsher 	if (link_up_wait_to_complete) {
626dee1ad47SJeff Kirsher 		for (i = 0; i < IXGBE_LINK_UP_TIME; i++) {
627dee1ad47SJeff Kirsher 			if (links_reg & IXGBE_LINKS_UP) {
628dee1ad47SJeff Kirsher 				*link_up = true;
629dee1ad47SJeff Kirsher 				break;
630dee1ad47SJeff Kirsher 			} else {
631dee1ad47SJeff Kirsher 				*link_up = false;
632dee1ad47SJeff Kirsher 			}
633dee1ad47SJeff Kirsher 			msleep(100);
634dee1ad47SJeff Kirsher 			links_reg = IXGBE_READ_REG(hw, IXGBE_LINKS);
635dee1ad47SJeff Kirsher 		}
636dee1ad47SJeff Kirsher 	} else {
637dee1ad47SJeff Kirsher 		if (links_reg & IXGBE_LINKS_UP)
638dee1ad47SJeff Kirsher 			*link_up = true;
639dee1ad47SJeff Kirsher 		else
640dee1ad47SJeff Kirsher 			*link_up = false;
641dee1ad47SJeff Kirsher 	}
642dee1ad47SJeff Kirsher 
643dee1ad47SJeff Kirsher 	if (links_reg & IXGBE_LINKS_SPEED)
644dee1ad47SJeff Kirsher 		*speed = IXGBE_LINK_SPEED_10GB_FULL;
645dee1ad47SJeff Kirsher 	else
646dee1ad47SJeff Kirsher 		*speed = IXGBE_LINK_SPEED_1GB_FULL;
647dee1ad47SJeff Kirsher 
648dee1ad47SJeff Kirsher 	if ((hw->device_id == IXGBE_DEV_ID_82598AT2) && (*link_up == true) &&
649dee1ad47SJeff Kirsher 	    (ixgbe_validate_link_ready(hw) != 0))
650dee1ad47SJeff Kirsher 		*link_up = false;
651dee1ad47SJeff Kirsher 
652dee1ad47SJeff Kirsher out:
653dee1ad47SJeff Kirsher 	return 0;
654dee1ad47SJeff Kirsher }
655dee1ad47SJeff Kirsher 
656dee1ad47SJeff Kirsher /**
657dee1ad47SJeff Kirsher  *  ixgbe_setup_mac_link_82598 - Set MAC link speed
658dee1ad47SJeff Kirsher  *  @hw: pointer to hardware structure
659dee1ad47SJeff Kirsher  *  @speed: new link speed
660dee1ad47SJeff Kirsher  *  @autoneg: true if auto-negotiation enabled
661dee1ad47SJeff Kirsher  *  @autoneg_wait_to_complete: true when waiting for completion is needed
662dee1ad47SJeff Kirsher  *
663dee1ad47SJeff Kirsher  *  Set the link speed in the AUTOC register and restarts link.
664dee1ad47SJeff Kirsher  **/
665dee1ad47SJeff Kirsher static s32 ixgbe_setup_mac_link_82598(struct ixgbe_hw *hw,
666dee1ad47SJeff Kirsher                                            ixgbe_link_speed speed, bool autoneg,
667dee1ad47SJeff Kirsher                                            bool autoneg_wait_to_complete)
668dee1ad47SJeff Kirsher {
669dee1ad47SJeff Kirsher 	s32              status            = 0;
670dee1ad47SJeff Kirsher 	ixgbe_link_speed link_capabilities = IXGBE_LINK_SPEED_UNKNOWN;
671dee1ad47SJeff Kirsher 	u32              curr_autoc        = IXGBE_READ_REG(hw, IXGBE_AUTOC);
672dee1ad47SJeff Kirsher 	u32              autoc             = curr_autoc;
673dee1ad47SJeff Kirsher 	u32              link_mode         = autoc & IXGBE_AUTOC_LMS_MASK;
674dee1ad47SJeff Kirsher 
675dee1ad47SJeff Kirsher 	/* Check to see if speed passed in is supported. */
676dee1ad47SJeff Kirsher 	ixgbe_get_link_capabilities_82598(hw, &link_capabilities, &autoneg);
677dee1ad47SJeff Kirsher 	speed &= link_capabilities;
678dee1ad47SJeff Kirsher 
679dee1ad47SJeff Kirsher 	if (speed == IXGBE_LINK_SPEED_UNKNOWN)
680dee1ad47SJeff Kirsher 		status = IXGBE_ERR_LINK_SETUP;
681dee1ad47SJeff Kirsher 
682dee1ad47SJeff Kirsher 	/* Set KX4/KX support according to speed requested */
683dee1ad47SJeff Kirsher 	else if (link_mode == IXGBE_AUTOC_LMS_KX4_AN ||
684dee1ad47SJeff Kirsher 	         link_mode == IXGBE_AUTOC_LMS_KX4_AN_1G_AN) {
685dee1ad47SJeff Kirsher 		autoc &= ~IXGBE_AUTOC_KX4_KX_SUPP_MASK;
686dee1ad47SJeff Kirsher 		if (speed & IXGBE_LINK_SPEED_10GB_FULL)
687dee1ad47SJeff Kirsher 			autoc |= IXGBE_AUTOC_KX4_SUPP;
688dee1ad47SJeff Kirsher 		if (speed & IXGBE_LINK_SPEED_1GB_FULL)
689dee1ad47SJeff Kirsher 			autoc |= IXGBE_AUTOC_KX_SUPP;
690dee1ad47SJeff Kirsher 		if (autoc != curr_autoc)
691dee1ad47SJeff Kirsher 			IXGBE_WRITE_REG(hw, IXGBE_AUTOC, autoc);
692dee1ad47SJeff Kirsher 	}
693dee1ad47SJeff Kirsher 
694dee1ad47SJeff Kirsher 	if (status == 0) {
695dee1ad47SJeff Kirsher 		/*
696dee1ad47SJeff Kirsher 		 * Setup and restart the link based on the new values in
697dee1ad47SJeff Kirsher 		 * ixgbe_hw This will write the AUTOC register based on the new
698dee1ad47SJeff Kirsher 		 * stored values
699dee1ad47SJeff Kirsher 		 */
700dee1ad47SJeff Kirsher 		status = ixgbe_start_mac_link_82598(hw,
701dee1ad47SJeff Kirsher 						    autoneg_wait_to_complete);
702dee1ad47SJeff Kirsher 	}
703dee1ad47SJeff Kirsher 
704dee1ad47SJeff Kirsher 	return status;
705dee1ad47SJeff Kirsher }
706dee1ad47SJeff Kirsher 
707dee1ad47SJeff Kirsher 
708dee1ad47SJeff Kirsher /**
709dee1ad47SJeff Kirsher  *  ixgbe_setup_copper_link_82598 - Set the PHY autoneg advertised field
710dee1ad47SJeff Kirsher  *  @hw: pointer to hardware structure
711dee1ad47SJeff Kirsher  *  @speed: new link speed
712dee1ad47SJeff Kirsher  *  @autoneg: true if autonegotiation enabled
713dee1ad47SJeff Kirsher  *  @autoneg_wait_to_complete: true if waiting is needed to complete
714dee1ad47SJeff Kirsher  *
715dee1ad47SJeff Kirsher  *  Sets the link speed in the AUTOC register in the MAC and restarts link.
716dee1ad47SJeff Kirsher  **/
717dee1ad47SJeff Kirsher static s32 ixgbe_setup_copper_link_82598(struct ixgbe_hw *hw,
718dee1ad47SJeff Kirsher                                                ixgbe_link_speed speed,
719dee1ad47SJeff Kirsher                                                bool autoneg,
720dee1ad47SJeff Kirsher                                                bool autoneg_wait_to_complete)
721dee1ad47SJeff Kirsher {
722dee1ad47SJeff Kirsher 	s32 status;
723dee1ad47SJeff Kirsher 
724dee1ad47SJeff Kirsher 	/* Setup the PHY according to input speed */
725dee1ad47SJeff Kirsher 	status = hw->phy.ops.setup_link_speed(hw, speed, autoneg,
726dee1ad47SJeff Kirsher 	                                      autoneg_wait_to_complete);
727dee1ad47SJeff Kirsher 	/* Set up MAC */
728dee1ad47SJeff Kirsher 	ixgbe_start_mac_link_82598(hw, autoneg_wait_to_complete);
729dee1ad47SJeff Kirsher 
730dee1ad47SJeff Kirsher 	return status;
731dee1ad47SJeff Kirsher }
732dee1ad47SJeff Kirsher 
733dee1ad47SJeff Kirsher /**
734dee1ad47SJeff Kirsher  *  ixgbe_reset_hw_82598 - Performs hardware reset
735dee1ad47SJeff Kirsher  *  @hw: pointer to hardware structure
736dee1ad47SJeff Kirsher  *
737dee1ad47SJeff Kirsher  *  Resets the hardware by resetting the transmit and receive units, masks and
738dee1ad47SJeff Kirsher  *  clears all interrupts, performing a PHY reset, and performing a link (MAC)
739dee1ad47SJeff Kirsher  *  reset.
740dee1ad47SJeff Kirsher  **/
741dee1ad47SJeff Kirsher static s32 ixgbe_reset_hw_82598(struct ixgbe_hw *hw)
742dee1ad47SJeff Kirsher {
743dee1ad47SJeff Kirsher 	s32 status = 0;
744dee1ad47SJeff Kirsher 	s32 phy_status = 0;
745dee1ad47SJeff Kirsher 	u32 ctrl;
746dee1ad47SJeff Kirsher 	u32 gheccr;
747dee1ad47SJeff Kirsher 	u32 i;
748dee1ad47SJeff Kirsher 	u32 autoc;
749dee1ad47SJeff Kirsher 	u8  analog_val;
750dee1ad47SJeff Kirsher 
751dee1ad47SJeff Kirsher 	/* Call adapter stop to disable tx/rx and clear interrupts */
752ff9d1a5aSEmil Tantilov 	status = hw->mac.ops.stop_adapter(hw);
753ff9d1a5aSEmil Tantilov 	if (status != 0)
754ff9d1a5aSEmil Tantilov 		goto reset_hw_out;
755dee1ad47SJeff Kirsher 
756dee1ad47SJeff Kirsher 	/*
757dee1ad47SJeff Kirsher 	 * Power up the Atlas Tx lanes if they are currently powered down.
758dee1ad47SJeff Kirsher 	 * Atlas Tx lanes are powered down for MAC loopback tests, but
759dee1ad47SJeff Kirsher 	 * they are not automatically restored on reset.
760dee1ad47SJeff Kirsher 	 */
761dee1ad47SJeff Kirsher 	hw->mac.ops.read_analog_reg8(hw, IXGBE_ATLAS_PDN_LPBK, &analog_val);
762dee1ad47SJeff Kirsher 	if (analog_val & IXGBE_ATLAS_PDN_TX_REG_EN) {
763dee1ad47SJeff Kirsher 		/* Enable Tx Atlas so packets can be transmitted again */
764dee1ad47SJeff Kirsher 		hw->mac.ops.read_analog_reg8(hw, IXGBE_ATLAS_PDN_LPBK,
765dee1ad47SJeff Kirsher 		                             &analog_val);
766dee1ad47SJeff Kirsher 		analog_val &= ~IXGBE_ATLAS_PDN_TX_REG_EN;
767dee1ad47SJeff Kirsher 		hw->mac.ops.write_analog_reg8(hw, IXGBE_ATLAS_PDN_LPBK,
768dee1ad47SJeff Kirsher 		                              analog_val);
769dee1ad47SJeff Kirsher 
770dee1ad47SJeff Kirsher 		hw->mac.ops.read_analog_reg8(hw, IXGBE_ATLAS_PDN_10G,
771dee1ad47SJeff Kirsher 		                             &analog_val);
772dee1ad47SJeff Kirsher 		analog_val &= ~IXGBE_ATLAS_PDN_TX_10G_QL_ALL;
773dee1ad47SJeff Kirsher 		hw->mac.ops.write_analog_reg8(hw, IXGBE_ATLAS_PDN_10G,
774dee1ad47SJeff Kirsher 		                              analog_val);
775dee1ad47SJeff Kirsher 
776dee1ad47SJeff Kirsher 		hw->mac.ops.read_analog_reg8(hw, IXGBE_ATLAS_PDN_1G,
777dee1ad47SJeff Kirsher 		                             &analog_val);
778dee1ad47SJeff Kirsher 		analog_val &= ~IXGBE_ATLAS_PDN_TX_1G_QL_ALL;
779dee1ad47SJeff Kirsher 		hw->mac.ops.write_analog_reg8(hw, IXGBE_ATLAS_PDN_1G,
780dee1ad47SJeff Kirsher 		                              analog_val);
781dee1ad47SJeff Kirsher 
782dee1ad47SJeff Kirsher 		hw->mac.ops.read_analog_reg8(hw, IXGBE_ATLAS_PDN_AN,
783dee1ad47SJeff Kirsher 		                             &analog_val);
784dee1ad47SJeff Kirsher 		analog_val &= ~IXGBE_ATLAS_PDN_TX_AN_QL_ALL;
785dee1ad47SJeff Kirsher 		hw->mac.ops.write_analog_reg8(hw, IXGBE_ATLAS_PDN_AN,
786dee1ad47SJeff Kirsher 		                              analog_val);
787dee1ad47SJeff Kirsher 	}
788dee1ad47SJeff Kirsher 
789dee1ad47SJeff Kirsher 	/* Reset PHY */
790dee1ad47SJeff Kirsher 	if (hw->phy.reset_disable == false) {
791dee1ad47SJeff Kirsher 		/* PHY ops must be identified and initialized prior to reset */
792dee1ad47SJeff Kirsher 
793dee1ad47SJeff Kirsher 		/* Init PHY and function pointers, perform SFP setup */
794dee1ad47SJeff Kirsher 		phy_status = hw->phy.ops.init(hw);
795dee1ad47SJeff Kirsher 		if (phy_status == IXGBE_ERR_SFP_NOT_SUPPORTED)
796dee1ad47SJeff Kirsher 			goto reset_hw_out;
797ff9d1a5aSEmil Tantilov 		if (phy_status == IXGBE_ERR_SFP_NOT_PRESENT)
798ff9d1a5aSEmil Tantilov 			goto mac_reset_top;
799dee1ad47SJeff Kirsher 
800dee1ad47SJeff Kirsher 		hw->phy.ops.reset(hw);
801dee1ad47SJeff Kirsher 	}
802dee1ad47SJeff Kirsher 
803dee1ad47SJeff Kirsher mac_reset_top:
804dee1ad47SJeff Kirsher 	/*
805dee1ad47SJeff Kirsher 	 * Issue global reset to the MAC.  This needs to be a SW reset.
806dee1ad47SJeff Kirsher 	 * If link reset is used, it might reset the MAC when mng is using it
807dee1ad47SJeff Kirsher 	 */
8088132b54eSAlexander Duyck 	ctrl = IXGBE_READ_REG(hw, IXGBE_CTRL) | IXGBE_CTRL_RST;
8098132b54eSAlexander Duyck 	IXGBE_WRITE_REG(hw, IXGBE_CTRL, ctrl);
810dee1ad47SJeff Kirsher 	IXGBE_WRITE_FLUSH(hw);
811dee1ad47SJeff Kirsher 
812dee1ad47SJeff Kirsher 	/* Poll for reset bit to self-clear indicating reset is complete */
813dee1ad47SJeff Kirsher 	for (i = 0; i < 10; i++) {
814dee1ad47SJeff Kirsher 		udelay(1);
815dee1ad47SJeff Kirsher 		ctrl = IXGBE_READ_REG(hw, IXGBE_CTRL);
816dee1ad47SJeff Kirsher 		if (!(ctrl & IXGBE_CTRL_RST))
817dee1ad47SJeff Kirsher 			break;
818dee1ad47SJeff Kirsher 	}
819dee1ad47SJeff Kirsher 	if (ctrl & IXGBE_CTRL_RST) {
820dee1ad47SJeff Kirsher 		status = IXGBE_ERR_RESET_FAILED;
821dee1ad47SJeff Kirsher 		hw_dbg(hw, "Reset polling failed to complete.\n");
822dee1ad47SJeff Kirsher 	}
823dee1ad47SJeff Kirsher 
8248132b54eSAlexander Duyck 	msleep(50);
8258132b54eSAlexander Duyck 
826dee1ad47SJeff Kirsher 	/*
827dee1ad47SJeff Kirsher 	 * Double resets are required for recovery from certain error
828dee1ad47SJeff Kirsher 	 * conditions.  Between resets, it is necessary to stall to allow time
8298132b54eSAlexander Duyck 	 * for any pending HW events to complete.
830dee1ad47SJeff Kirsher 	 */
831dee1ad47SJeff Kirsher 	if (hw->mac.flags & IXGBE_FLAGS_DOUBLE_RESET_REQUIRED) {
832dee1ad47SJeff Kirsher 		hw->mac.flags &= ~IXGBE_FLAGS_DOUBLE_RESET_REQUIRED;
833dee1ad47SJeff Kirsher 		goto mac_reset_top;
834dee1ad47SJeff Kirsher 	}
835dee1ad47SJeff Kirsher 
836dee1ad47SJeff Kirsher 	gheccr = IXGBE_READ_REG(hw, IXGBE_GHECCR);
837dee1ad47SJeff Kirsher 	gheccr &= ~((1 << 21) | (1 << 18) | (1 << 9) | (1 << 6));
838dee1ad47SJeff Kirsher 	IXGBE_WRITE_REG(hw, IXGBE_GHECCR, gheccr);
839dee1ad47SJeff Kirsher 
840dee1ad47SJeff Kirsher 	/*
841dee1ad47SJeff Kirsher 	 * Store the original AUTOC value if it has not been
842dee1ad47SJeff Kirsher 	 * stored off yet.  Otherwise restore the stored original
843dee1ad47SJeff Kirsher 	 * AUTOC value since the reset operation sets back to deaults.
844dee1ad47SJeff Kirsher 	 */
845dee1ad47SJeff Kirsher 	autoc = IXGBE_READ_REG(hw, IXGBE_AUTOC);
846dee1ad47SJeff Kirsher 	if (hw->mac.orig_link_settings_stored == false) {
847dee1ad47SJeff Kirsher 		hw->mac.orig_autoc = autoc;
848dee1ad47SJeff Kirsher 		hw->mac.orig_link_settings_stored = true;
849dee1ad47SJeff Kirsher 	} else if (autoc != hw->mac.orig_autoc) {
850dee1ad47SJeff Kirsher 		IXGBE_WRITE_REG(hw, IXGBE_AUTOC, hw->mac.orig_autoc);
851dee1ad47SJeff Kirsher 	}
852dee1ad47SJeff Kirsher 
853dee1ad47SJeff Kirsher 	/* Store the permanent mac address */
854dee1ad47SJeff Kirsher 	hw->mac.ops.get_mac_addr(hw, hw->mac.perm_addr);
855dee1ad47SJeff Kirsher 
856dee1ad47SJeff Kirsher 	/*
857dee1ad47SJeff Kirsher 	 * Store MAC address from RAR0, clear receive address registers, and
858dee1ad47SJeff Kirsher 	 * clear the multicast table
859dee1ad47SJeff Kirsher 	 */
860dee1ad47SJeff Kirsher 	hw->mac.ops.init_rx_addrs(hw);
861dee1ad47SJeff Kirsher 
862dee1ad47SJeff Kirsher reset_hw_out:
863dee1ad47SJeff Kirsher 	if (phy_status)
864dee1ad47SJeff Kirsher 		status = phy_status;
865dee1ad47SJeff Kirsher 
866dee1ad47SJeff Kirsher 	return status;
867dee1ad47SJeff Kirsher }
868dee1ad47SJeff Kirsher 
869dee1ad47SJeff Kirsher /**
870dee1ad47SJeff Kirsher  *  ixgbe_set_vmdq_82598 - Associate a VMDq set index with a rx address
871dee1ad47SJeff Kirsher  *  @hw: pointer to hardware struct
872dee1ad47SJeff Kirsher  *  @rar: receive address register index to associate with a VMDq index
873dee1ad47SJeff Kirsher  *  @vmdq: VMDq set index
874dee1ad47SJeff Kirsher  **/
875dee1ad47SJeff Kirsher static s32 ixgbe_set_vmdq_82598(struct ixgbe_hw *hw, u32 rar, u32 vmdq)
876dee1ad47SJeff Kirsher {
877dee1ad47SJeff Kirsher 	u32 rar_high;
878dee1ad47SJeff Kirsher 	u32 rar_entries = hw->mac.num_rar_entries;
879dee1ad47SJeff Kirsher 
880dee1ad47SJeff Kirsher 	/* Make sure we are using a valid rar index range */
881dee1ad47SJeff Kirsher 	if (rar >= rar_entries) {
882dee1ad47SJeff Kirsher 		hw_dbg(hw, "RAR index %d is out of range.\n", rar);
883dee1ad47SJeff Kirsher 		return IXGBE_ERR_INVALID_ARGUMENT;
884dee1ad47SJeff Kirsher 	}
885dee1ad47SJeff Kirsher 
886dee1ad47SJeff Kirsher 	rar_high = IXGBE_READ_REG(hw, IXGBE_RAH(rar));
887dee1ad47SJeff Kirsher 	rar_high &= ~IXGBE_RAH_VIND_MASK;
888dee1ad47SJeff Kirsher 	rar_high |= ((vmdq << IXGBE_RAH_VIND_SHIFT) & IXGBE_RAH_VIND_MASK);
889dee1ad47SJeff Kirsher 	IXGBE_WRITE_REG(hw, IXGBE_RAH(rar), rar_high);
890dee1ad47SJeff Kirsher 	return 0;
891dee1ad47SJeff Kirsher }
892dee1ad47SJeff Kirsher 
893dee1ad47SJeff Kirsher /**
894dee1ad47SJeff Kirsher  *  ixgbe_clear_vmdq_82598 - Disassociate a VMDq set index from an rx address
895dee1ad47SJeff Kirsher  *  @hw: pointer to hardware struct
896dee1ad47SJeff Kirsher  *  @rar: receive address register index to associate with a VMDq index
897dee1ad47SJeff Kirsher  *  @vmdq: VMDq clear index (not used in 82598, but elsewhere)
898dee1ad47SJeff Kirsher  **/
899dee1ad47SJeff Kirsher static s32 ixgbe_clear_vmdq_82598(struct ixgbe_hw *hw, u32 rar, u32 vmdq)
900dee1ad47SJeff Kirsher {
901dee1ad47SJeff Kirsher 	u32 rar_high;
902dee1ad47SJeff Kirsher 	u32 rar_entries = hw->mac.num_rar_entries;
903dee1ad47SJeff Kirsher 
904dee1ad47SJeff Kirsher 
905dee1ad47SJeff Kirsher 	/* Make sure we are using a valid rar index range */
906dee1ad47SJeff Kirsher 	if (rar >= rar_entries) {
907dee1ad47SJeff Kirsher 		hw_dbg(hw, "RAR index %d is out of range.\n", rar);
908dee1ad47SJeff Kirsher 		return IXGBE_ERR_INVALID_ARGUMENT;
909dee1ad47SJeff Kirsher 	}
910dee1ad47SJeff Kirsher 
911dee1ad47SJeff Kirsher 	rar_high = IXGBE_READ_REG(hw, IXGBE_RAH(rar));
912dee1ad47SJeff Kirsher 	if (rar_high & IXGBE_RAH_VIND_MASK) {
913dee1ad47SJeff Kirsher 		rar_high &= ~IXGBE_RAH_VIND_MASK;
914dee1ad47SJeff Kirsher 		IXGBE_WRITE_REG(hw, IXGBE_RAH(rar), rar_high);
915dee1ad47SJeff Kirsher 	}
916dee1ad47SJeff Kirsher 
917dee1ad47SJeff Kirsher 	return 0;
918dee1ad47SJeff Kirsher }
919dee1ad47SJeff Kirsher 
920dee1ad47SJeff Kirsher /**
921dee1ad47SJeff Kirsher  *  ixgbe_set_vfta_82598 - Set VLAN filter table
922dee1ad47SJeff Kirsher  *  @hw: pointer to hardware structure
923dee1ad47SJeff Kirsher  *  @vlan: VLAN id to write to VLAN filter
924dee1ad47SJeff Kirsher  *  @vind: VMDq output index that maps queue to VLAN id in VFTA
925dee1ad47SJeff Kirsher  *  @vlan_on: boolean flag to turn on/off VLAN in VFTA
926dee1ad47SJeff Kirsher  *
927dee1ad47SJeff Kirsher  *  Turn on/off specified VLAN in the VLAN filter table.
928dee1ad47SJeff Kirsher  **/
929dee1ad47SJeff Kirsher static s32 ixgbe_set_vfta_82598(struct ixgbe_hw *hw, u32 vlan, u32 vind,
930dee1ad47SJeff Kirsher 				bool vlan_on)
931dee1ad47SJeff Kirsher {
932dee1ad47SJeff Kirsher 	u32 regindex;
933dee1ad47SJeff Kirsher 	u32 bitindex;
934dee1ad47SJeff Kirsher 	u32 bits;
935dee1ad47SJeff Kirsher 	u32 vftabyte;
936dee1ad47SJeff Kirsher 
937dee1ad47SJeff Kirsher 	if (vlan > 4095)
938dee1ad47SJeff Kirsher 		return IXGBE_ERR_PARAM;
939dee1ad47SJeff Kirsher 
940dee1ad47SJeff Kirsher 	/* Determine 32-bit word position in array */
941dee1ad47SJeff Kirsher 	regindex = (vlan >> 5) & 0x7F;   /* upper seven bits */
942dee1ad47SJeff Kirsher 
943dee1ad47SJeff Kirsher 	/* Determine the location of the (VMD) queue index */
944dee1ad47SJeff Kirsher 	vftabyte =  ((vlan >> 3) & 0x03); /* bits (4:3) indicating byte array */
945dee1ad47SJeff Kirsher 	bitindex = (vlan & 0x7) << 2;    /* lower 3 bits indicate nibble */
946dee1ad47SJeff Kirsher 
947dee1ad47SJeff Kirsher 	/* Set the nibble for VMD queue index */
948dee1ad47SJeff Kirsher 	bits = IXGBE_READ_REG(hw, IXGBE_VFTAVIND(vftabyte, regindex));
949dee1ad47SJeff Kirsher 	bits &= (~(0x0F << bitindex));
950dee1ad47SJeff Kirsher 	bits |= (vind << bitindex);
951dee1ad47SJeff Kirsher 	IXGBE_WRITE_REG(hw, IXGBE_VFTAVIND(vftabyte, regindex), bits);
952dee1ad47SJeff Kirsher 
953dee1ad47SJeff Kirsher 	/* Determine the location of the bit for this VLAN id */
954dee1ad47SJeff Kirsher 	bitindex = vlan & 0x1F;   /* lower five bits */
955dee1ad47SJeff Kirsher 
956dee1ad47SJeff Kirsher 	bits = IXGBE_READ_REG(hw, IXGBE_VFTA(regindex));
957dee1ad47SJeff Kirsher 	if (vlan_on)
958dee1ad47SJeff Kirsher 		/* Turn on this VLAN id */
959dee1ad47SJeff Kirsher 		bits |= (1 << bitindex);
960dee1ad47SJeff Kirsher 	else
961dee1ad47SJeff Kirsher 		/* Turn off this VLAN id */
962dee1ad47SJeff Kirsher 		bits &= ~(1 << bitindex);
963dee1ad47SJeff Kirsher 	IXGBE_WRITE_REG(hw, IXGBE_VFTA(regindex), bits);
964dee1ad47SJeff Kirsher 
965dee1ad47SJeff Kirsher 	return 0;
966dee1ad47SJeff Kirsher }
967dee1ad47SJeff Kirsher 
968dee1ad47SJeff Kirsher /**
969dee1ad47SJeff Kirsher  *  ixgbe_clear_vfta_82598 - Clear VLAN filter table
970dee1ad47SJeff Kirsher  *  @hw: pointer to hardware structure
971dee1ad47SJeff Kirsher  *
972dee1ad47SJeff Kirsher  *  Clears the VLAN filer table, and the VMDq index associated with the filter
973dee1ad47SJeff Kirsher  **/
974dee1ad47SJeff Kirsher static s32 ixgbe_clear_vfta_82598(struct ixgbe_hw *hw)
975dee1ad47SJeff Kirsher {
976dee1ad47SJeff Kirsher 	u32 offset;
977dee1ad47SJeff Kirsher 	u32 vlanbyte;
978dee1ad47SJeff Kirsher 
979dee1ad47SJeff Kirsher 	for (offset = 0; offset < hw->mac.vft_size; offset++)
980dee1ad47SJeff Kirsher 		IXGBE_WRITE_REG(hw, IXGBE_VFTA(offset), 0);
981dee1ad47SJeff Kirsher 
982dee1ad47SJeff Kirsher 	for (vlanbyte = 0; vlanbyte < 4; vlanbyte++)
983dee1ad47SJeff Kirsher 		for (offset = 0; offset < hw->mac.vft_size; offset++)
984dee1ad47SJeff Kirsher 			IXGBE_WRITE_REG(hw, IXGBE_VFTAVIND(vlanbyte, offset),
985dee1ad47SJeff Kirsher 			                0);
986dee1ad47SJeff Kirsher 
987dee1ad47SJeff Kirsher 	return 0;
988dee1ad47SJeff Kirsher }
989dee1ad47SJeff Kirsher 
990dee1ad47SJeff Kirsher /**
991dee1ad47SJeff Kirsher  *  ixgbe_read_analog_reg8_82598 - Reads 8 bit Atlas analog register
992dee1ad47SJeff Kirsher  *  @hw: pointer to hardware structure
993dee1ad47SJeff Kirsher  *  @reg: analog register to read
994dee1ad47SJeff Kirsher  *  @val: read value
995dee1ad47SJeff Kirsher  *
996dee1ad47SJeff Kirsher  *  Performs read operation to Atlas analog register specified.
997dee1ad47SJeff Kirsher  **/
998dee1ad47SJeff Kirsher static s32 ixgbe_read_analog_reg8_82598(struct ixgbe_hw *hw, u32 reg, u8 *val)
999dee1ad47SJeff Kirsher {
1000dee1ad47SJeff Kirsher 	u32  atlas_ctl;
1001dee1ad47SJeff Kirsher 
1002dee1ad47SJeff Kirsher 	IXGBE_WRITE_REG(hw, IXGBE_ATLASCTL,
1003dee1ad47SJeff Kirsher 	                IXGBE_ATLASCTL_WRITE_CMD | (reg << 8));
1004dee1ad47SJeff Kirsher 	IXGBE_WRITE_FLUSH(hw);
1005dee1ad47SJeff Kirsher 	udelay(10);
1006dee1ad47SJeff Kirsher 	atlas_ctl = IXGBE_READ_REG(hw, IXGBE_ATLASCTL);
1007dee1ad47SJeff Kirsher 	*val = (u8)atlas_ctl;
1008dee1ad47SJeff Kirsher 
1009dee1ad47SJeff Kirsher 	return 0;
1010dee1ad47SJeff Kirsher }
1011dee1ad47SJeff Kirsher 
1012dee1ad47SJeff Kirsher /**
1013dee1ad47SJeff Kirsher  *  ixgbe_write_analog_reg8_82598 - Writes 8 bit Atlas analog register
1014dee1ad47SJeff Kirsher  *  @hw: pointer to hardware structure
1015dee1ad47SJeff Kirsher  *  @reg: atlas register to write
1016dee1ad47SJeff Kirsher  *  @val: value to write
1017dee1ad47SJeff Kirsher  *
1018dee1ad47SJeff Kirsher  *  Performs write operation to Atlas analog register specified.
1019dee1ad47SJeff Kirsher  **/
1020dee1ad47SJeff Kirsher static s32 ixgbe_write_analog_reg8_82598(struct ixgbe_hw *hw, u32 reg, u8 val)
1021dee1ad47SJeff Kirsher {
1022dee1ad47SJeff Kirsher 	u32  atlas_ctl;
1023dee1ad47SJeff Kirsher 
1024dee1ad47SJeff Kirsher 	atlas_ctl = (reg << 8) | val;
1025dee1ad47SJeff Kirsher 	IXGBE_WRITE_REG(hw, IXGBE_ATLASCTL, atlas_ctl);
1026dee1ad47SJeff Kirsher 	IXGBE_WRITE_FLUSH(hw);
1027dee1ad47SJeff Kirsher 	udelay(10);
1028dee1ad47SJeff Kirsher 
1029dee1ad47SJeff Kirsher 	return 0;
1030dee1ad47SJeff Kirsher }
1031dee1ad47SJeff Kirsher 
1032dee1ad47SJeff Kirsher /**
1033dee1ad47SJeff Kirsher  *  ixgbe_read_i2c_eeprom_82598 - Reads 8 bit word over I2C interface.
1034dee1ad47SJeff Kirsher  *  @hw: pointer to hardware structure
1035dee1ad47SJeff Kirsher  *  @byte_offset: EEPROM byte offset to read
1036dee1ad47SJeff Kirsher  *  @eeprom_data: value read
1037dee1ad47SJeff Kirsher  *
1038dee1ad47SJeff Kirsher  *  Performs 8 byte read operation to SFP module's EEPROM over I2C interface.
1039dee1ad47SJeff Kirsher  **/
1040dee1ad47SJeff Kirsher static s32 ixgbe_read_i2c_eeprom_82598(struct ixgbe_hw *hw, u8 byte_offset,
1041dee1ad47SJeff Kirsher 				       u8 *eeprom_data)
1042dee1ad47SJeff Kirsher {
1043dee1ad47SJeff Kirsher 	s32 status = 0;
1044dee1ad47SJeff Kirsher 	u16 sfp_addr = 0;
1045dee1ad47SJeff Kirsher 	u16 sfp_data = 0;
1046dee1ad47SJeff Kirsher 	u16 sfp_stat = 0;
1047dee1ad47SJeff Kirsher 	u32 i;
1048dee1ad47SJeff Kirsher 
1049dee1ad47SJeff Kirsher 	if (hw->phy.type == ixgbe_phy_nl) {
1050dee1ad47SJeff Kirsher 		/*
1051dee1ad47SJeff Kirsher 		 * phy SDA/SCL registers are at addresses 0xC30A to
1052dee1ad47SJeff Kirsher 		 * 0xC30D.  These registers are used to talk to the SFP+
1053dee1ad47SJeff Kirsher 		 * module's EEPROM through the SDA/SCL (I2C) interface.
1054dee1ad47SJeff Kirsher 		 */
1055dee1ad47SJeff Kirsher 		sfp_addr = (IXGBE_I2C_EEPROM_DEV_ADDR << 8) + byte_offset;
1056dee1ad47SJeff Kirsher 		sfp_addr = (sfp_addr | IXGBE_I2C_EEPROM_READ_MASK);
1057dee1ad47SJeff Kirsher 		hw->phy.ops.write_reg(hw,
1058dee1ad47SJeff Kirsher 		                      IXGBE_MDIO_PMA_PMD_SDA_SCL_ADDR,
1059dee1ad47SJeff Kirsher 		                      MDIO_MMD_PMAPMD,
1060dee1ad47SJeff Kirsher 		                      sfp_addr);
1061dee1ad47SJeff Kirsher 
1062dee1ad47SJeff Kirsher 		/* Poll status */
1063dee1ad47SJeff Kirsher 		for (i = 0; i < 100; i++) {
1064dee1ad47SJeff Kirsher 			hw->phy.ops.read_reg(hw,
1065dee1ad47SJeff Kirsher 			                     IXGBE_MDIO_PMA_PMD_SDA_SCL_STAT,
1066dee1ad47SJeff Kirsher 			                     MDIO_MMD_PMAPMD,
1067dee1ad47SJeff Kirsher 			                     &sfp_stat);
1068dee1ad47SJeff Kirsher 			sfp_stat = sfp_stat & IXGBE_I2C_EEPROM_STATUS_MASK;
1069dee1ad47SJeff Kirsher 			if (sfp_stat != IXGBE_I2C_EEPROM_STATUS_IN_PROGRESS)
1070dee1ad47SJeff Kirsher 				break;
1071dee1ad47SJeff Kirsher 			usleep_range(10000, 20000);
1072dee1ad47SJeff Kirsher 		}
1073dee1ad47SJeff Kirsher 
1074dee1ad47SJeff Kirsher 		if (sfp_stat != IXGBE_I2C_EEPROM_STATUS_PASS) {
1075dee1ad47SJeff Kirsher 			hw_dbg(hw, "EEPROM read did not pass.\n");
1076dee1ad47SJeff Kirsher 			status = IXGBE_ERR_SFP_NOT_PRESENT;
1077dee1ad47SJeff Kirsher 			goto out;
1078dee1ad47SJeff Kirsher 		}
1079dee1ad47SJeff Kirsher 
1080dee1ad47SJeff Kirsher 		/* Read data */
1081dee1ad47SJeff Kirsher 		hw->phy.ops.read_reg(hw, IXGBE_MDIO_PMA_PMD_SDA_SCL_DATA,
1082dee1ad47SJeff Kirsher 		                     MDIO_MMD_PMAPMD, &sfp_data);
1083dee1ad47SJeff Kirsher 
1084dee1ad47SJeff Kirsher 		*eeprom_data = (u8)(sfp_data >> 8);
1085dee1ad47SJeff Kirsher 	} else {
1086dee1ad47SJeff Kirsher 		status = IXGBE_ERR_PHY;
1087dee1ad47SJeff Kirsher 		goto out;
1088dee1ad47SJeff Kirsher 	}
1089dee1ad47SJeff Kirsher 
1090dee1ad47SJeff Kirsher out:
1091dee1ad47SJeff Kirsher 	return status;
1092dee1ad47SJeff Kirsher }
1093dee1ad47SJeff Kirsher 
1094dee1ad47SJeff Kirsher /**
1095dee1ad47SJeff Kirsher  *  ixgbe_get_supported_physical_layer_82598 - Returns physical layer type
1096dee1ad47SJeff Kirsher  *  @hw: pointer to hardware structure
1097dee1ad47SJeff Kirsher  *
1098dee1ad47SJeff Kirsher  *  Determines physical layer capabilities of the current configuration.
1099dee1ad47SJeff Kirsher  **/
1100dee1ad47SJeff Kirsher static u32 ixgbe_get_supported_physical_layer_82598(struct ixgbe_hw *hw)
1101dee1ad47SJeff Kirsher {
1102dee1ad47SJeff Kirsher 	u32 physical_layer = IXGBE_PHYSICAL_LAYER_UNKNOWN;
1103dee1ad47SJeff Kirsher 	u32 autoc = IXGBE_READ_REG(hw, IXGBE_AUTOC);
1104dee1ad47SJeff Kirsher 	u32 pma_pmd_10g = autoc & IXGBE_AUTOC_10G_PMA_PMD_MASK;
1105dee1ad47SJeff Kirsher 	u32 pma_pmd_1g = autoc & IXGBE_AUTOC_1G_PMA_PMD_MASK;
1106dee1ad47SJeff Kirsher 	u16 ext_ability = 0;
1107dee1ad47SJeff Kirsher 
1108dee1ad47SJeff Kirsher 	hw->phy.ops.identify(hw);
1109dee1ad47SJeff Kirsher 
1110dee1ad47SJeff Kirsher 	/* Copper PHY must be checked before AUTOC LMS to determine correct
1111dee1ad47SJeff Kirsher 	 * physical layer because 10GBase-T PHYs use LMS = KX4/KX */
1112dee1ad47SJeff Kirsher 	switch (hw->phy.type) {
1113dee1ad47SJeff Kirsher 	case ixgbe_phy_tn:
1114dee1ad47SJeff Kirsher 	case ixgbe_phy_cu_unknown:
1115dee1ad47SJeff Kirsher 		hw->phy.ops.read_reg(hw, MDIO_PMA_EXTABLE,
1116dee1ad47SJeff Kirsher 		MDIO_MMD_PMAPMD, &ext_ability);
1117dee1ad47SJeff Kirsher 		if (ext_ability & MDIO_PMA_EXTABLE_10GBT)
1118dee1ad47SJeff Kirsher 			physical_layer |= IXGBE_PHYSICAL_LAYER_10GBASE_T;
1119dee1ad47SJeff Kirsher 		if (ext_ability & MDIO_PMA_EXTABLE_1000BT)
1120dee1ad47SJeff Kirsher 			physical_layer |= IXGBE_PHYSICAL_LAYER_1000BASE_T;
1121dee1ad47SJeff Kirsher 		if (ext_ability & MDIO_PMA_EXTABLE_100BTX)
1122dee1ad47SJeff Kirsher 			physical_layer |= IXGBE_PHYSICAL_LAYER_100BASE_TX;
1123dee1ad47SJeff Kirsher 		goto out;
1124dee1ad47SJeff Kirsher 	default:
1125dee1ad47SJeff Kirsher 		break;
1126dee1ad47SJeff Kirsher 	}
1127dee1ad47SJeff Kirsher 
1128dee1ad47SJeff Kirsher 	switch (autoc & IXGBE_AUTOC_LMS_MASK) {
1129dee1ad47SJeff Kirsher 	case IXGBE_AUTOC_LMS_1G_AN:
1130dee1ad47SJeff Kirsher 	case IXGBE_AUTOC_LMS_1G_LINK_NO_AN:
1131dee1ad47SJeff Kirsher 		if (pma_pmd_1g == IXGBE_AUTOC_1G_KX)
1132dee1ad47SJeff Kirsher 			physical_layer = IXGBE_PHYSICAL_LAYER_1000BASE_KX;
1133dee1ad47SJeff Kirsher 		else
1134dee1ad47SJeff Kirsher 			physical_layer = IXGBE_PHYSICAL_LAYER_1000BASE_BX;
1135dee1ad47SJeff Kirsher 		break;
1136dee1ad47SJeff Kirsher 	case IXGBE_AUTOC_LMS_10G_LINK_NO_AN:
1137dee1ad47SJeff Kirsher 		if (pma_pmd_10g == IXGBE_AUTOC_10G_CX4)
1138dee1ad47SJeff Kirsher 			physical_layer = IXGBE_PHYSICAL_LAYER_10GBASE_CX4;
1139dee1ad47SJeff Kirsher 		else if (pma_pmd_10g == IXGBE_AUTOC_10G_KX4)
1140dee1ad47SJeff Kirsher 			physical_layer = IXGBE_PHYSICAL_LAYER_10GBASE_KX4;
1141dee1ad47SJeff Kirsher 		else /* XAUI */
1142dee1ad47SJeff Kirsher 			physical_layer = IXGBE_PHYSICAL_LAYER_UNKNOWN;
1143dee1ad47SJeff Kirsher 		break;
1144dee1ad47SJeff Kirsher 	case IXGBE_AUTOC_LMS_KX4_AN:
1145dee1ad47SJeff Kirsher 	case IXGBE_AUTOC_LMS_KX4_AN_1G_AN:
1146dee1ad47SJeff Kirsher 		if (autoc & IXGBE_AUTOC_KX_SUPP)
1147dee1ad47SJeff Kirsher 			physical_layer |= IXGBE_PHYSICAL_LAYER_1000BASE_KX;
1148dee1ad47SJeff Kirsher 		if (autoc & IXGBE_AUTOC_KX4_SUPP)
1149dee1ad47SJeff Kirsher 			physical_layer |= IXGBE_PHYSICAL_LAYER_10GBASE_KX4;
1150dee1ad47SJeff Kirsher 		break;
1151dee1ad47SJeff Kirsher 	default:
1152dee1ad47SJeff Kirsher 		break;
1153dee1ad47SJeff Kirsher 	}
1154dee1ad47SJeff Kirsher 
1155dee1ad47SJeff Kirsher 	if (hw->phy.type == ixgbe_phy_nl) {
1156dee1ad47SJeff Kirsher 		hw->phy.ops.identify_sfp(hw);
1157dee1ad47SJeff Kirsher 
1158dee1ad47SJeff Kirsher 		switch (hw->phy.sfp_type) {
1159dee1ad47SJeff Kirsher 		case ixgbe_sfp_type_da_cu:
1160dee1ad47SJeff Kirsher 			physical_layer = IXGBE_PHYSICAL_LAYER_SFP_PLUS_CU;
1161dee1ad47SJeff Kirsher 			break;
1162dee1ad47SJeff Kirsher 		case ixgbe_sfp_type_sr:
1163dee1ad47SJeff Kirsher 			physical_layer = IXGBE_PHYSICAL_LAYER_10GBASE_SR;
1164dee1ad47SJeff Kirsher 			break;
1165dee1ad47SJeff Kirsher 		case ixgbe_sfp_type_lr:
1166dee1ad47SJeff Kirsher 			physical_layer = IXGBE_PHYSICAL_LAYER_10GBASE_LR;
1167dee1ad47SJeff Kirsher 			break;
1168dee1ad47SJeff Kirsher 		default:
1169dee1ad47SJeff Kirsher 			physical_layer = IXGBE_PHYSICAL_LAYER_UNKNOWN;
1170dee1ad47SJeff Kirsher 			break;
1171dee1ad47SJeff Kirsher 		}
1172dee1ad47SJeff Kirsher 	}
1173dee1ad47SJeff Kirsher 
1174dee1ad47SJeff Kirsher 	switch (hw->device_id) {
1175dee1ad47SJeff Kirsher 	case IXGBE_DEV_ID_82598_DA_DUAL_PORT:
1176dee1ad47SJeff Kirsher 		physical_layer = IXGBE_PHYSICAL_LAYER_SFP_PLUS_CU;
1177dee1ad47SJeff Kirsher 		break;
1178dee1ad47SJeff Kirsher 	case IXGBE_DEV_ID_82598AF_DUAL_PORT:
1179dee1ad47SJeff Kirsher 	case IXGBE_DEV_ID_82598AF_SINGLE_PORT:
1180dee1ad47SJeff Kirsher 	case IXGBE_DEV_ID_82598_SR_DUAL_PORT_EM:
1181dee1ad47SJeff Kirsher 		physical_layer = IXGBE_PHYSICAL_LAYER_10GBASE_SR;
1182dee1ad47SJeff Kirsher 		break;
1183dee1ad47SJeff Kirsher 	case IXGBE_DEV_ID_82598EB_XF_LR:
1184dee1ad47SJeff Kirsher 		physical_layer = IXGBE_PHYSICAL_LAYER_10GBASE_LR;
1185dee1ad47SJeff Kirsher 		break;
1186dee1ad47SJeff Kirsher 	default:
1187dee1ad47SJeff Kirsher 		break;
1188dee1ad47SJeff Kirsher 	}
1189dee1ad47SJeff Kirsher 
1190dee1ad47SJeff Kirsher out:
1191dee1ad47SJeff Kirsher 	return physical_layer;
1192dee1ad47SJeff Kirsher }
1193dee1ad47SJeff Kirsher 
1194dee1ad47SJeff Kirsher /**
1195dee1ad47SJeff Kirsher  *  ixgbe_set_lan_id_multi_port_pcie_82598 - Set LAN id for PCIe multiple
1196dee1ad47SJeff Kirsher  *  port devices.
1197dee1ad47SJeff Kirsher  *  @hw: pointer to the HW structure
1198dee1ad47SJeff Kirsher  *
1199dee1ad47SJeff Kirsher  *  Calls common function and corrects issue with some single port devices
1200dee1ad47SJeff Kirsher  *  that enable LAN1 but not LAN0.
1201dee1ad47SJeff Kirsher  **/
1202dee1ad47SJeff Kirsher static void ixgbe_set_lan_id_multi_port_pcie_82598(struct ixgbe_hw *hw)
1203dee1ad47SJeff Kirsher {
1204dee1ad47SJeff Kirsher 	struct ixgbe_bus_info *bus = &hw->bus;
1205dee1ad47SJeff Kirsher 	u16 pci_gen = 0;
1206dee1ad47SJeff Kirsher 	u16 pci_ctrl2 = 0;
1207dee1ad47SJeff Kirsher 
1208dee1ad47SJeff Kirsher 	ixgbe_set_lan_id_multi_port_pcie(hw);
1209dee1ad47SJeff Kirsher 
1210dee1ad47SJeff Kirsher 	/* check if LAN0 is disabled */
1211dee1ad47SJeff Kirsher 	hw->eeprom.ops.read(hw, IXGBE_PCIE_GENERAL_PTR, &pci_gen);
1212dee1ad47SJeff Kirsher 	if ((pci_gen != 0) && (pci_gen != 0xFFFF)) {
1213dee1ad47SJeff Kirsher 
1214dee1ad47SJeff Kirsher 		hw->eeprom.ops.read(hw, pci_gen + IXGBE_PCIE_CTRL2, &pci_ctrl2);
1215dee1ad47SJeff Kirsher 
1216dee1ad47SJeff Kirsher 		/* if LAN0 is completely disabled force function to 0 */
1217dee1ad47SJeff Kirsher 		if ((pci_ctrl2 & IXGBE_PCIE_CTRL2_LAN_DISABLE) &&
1218dee1ad47SJeff Kirsher 		    !(pci_ctrl2 & IXGBE_PCIE_CTRL2_DISABLE_SELECT) &&
1219dee1ad47SJeff Kirsher 		    !(pci_ctrl2 & IXGBE_PCIE_CTRL2_DUMMY_ENABLE)) {
1220dee1ad47SJeff Kirsher 
1221dee1ad47SJeff Kirsher 			bus->func = 0;
1222dee1ad47SJeff Kirsher 		}
1223dee1ad47SJeff Kirsher 	}
1224dee1ad47SJeff Kirsher }
1225dee1ad47SJeff Kirsher 
1226dee1ad47SJeff Kirsher /**
1227dee1ad47SJeff Kirsher  * ixgbe_set_rxpba_82598 - Configure packet buffers
1228dee1ad47SJeff Kirsher  * @hw: pointer to hardware structure
1229dee1ad47SJeff Kirsher  * @dcb_config: pointer to ixgbe_dcb_config structure
1230dee1ad47SJeff Kirsher  *
1231dee1ad47SJeff Kirsher  * Configure packet buffers.
1232dee1ad47SJeff Kirsher  */
1233dee1ad47SJeff Kirsher static void ixgbe_set_rxpba_82598(struct ixgbe_hw *hw, int num_pb, u32 headroom,
1234dee1ad47SJeff Kirsher 				  int strategy)
1235dee1ad47SJeff Kirsher {
1236dee1ad47SJeff Kirsher 	u32 rxpktsize = IXGBE_RXPBSIZE_64KB;
1237dee1ad47SJeff Kirsher 	u8  i = 0;
1238dee1ad47SJeff Kirsher 
1239dee1ad47SJeff Kirsher 	if (!num_pb)
1240dee1ad47SJeff Kirsher 		return;
1241dee1ad47SJeff Kirsher 
1242dee1ad47SJeff Kirsher 	/* Setup Rx packet buffer sizes */
1243dee1ad47SJeff Kirsher 	switch (strategy) {
1244dee1ad47SJeff Kirsher 	case PBA_STRATEGY_WEIGHTED:
1245dee1ad47SJeff Kirsher 		/* Setup the first four at 80KB */
1246dee1ad47SJeff Kirsher 		rxpktsize = IXGBE_RXPBSIZE_80KB;
1247dee1ad47SJeff Kirsher 		for (; i < 4; i++)
1248dee1ad47SJeff Kirsher 			IXGBE_WRITE_REG(hw, IXGBE_RXPBSIZE(i), rxpktsize);
1249dee1ad47SJeff Kirsher 		/* Setup the last four at 48KB...don't re-init i */
1250dee1ad47SJeff Kirsher 		rxpktsize = IXGBE_RXPBSIZE_48KB;
1251dee1ad47SJeff Kirsher 		/* Fall Through */
1252dee1ad47SJeff Kirsher 	case PBA_STRATEGY_EQUAL:
1253dee1ad47SJeff Kirsher 	default:
1254dee1ad47SJeff Kirsher 		/* Divide the remaining Rx packet buffer evenly among the TCs */
1255dee1ad47SJeff Kirsher 		for (; i < IXGBE_MAX_PACKET_BUFFERS; i++)
1256dee1ad47SJeff Kirsher 			IXGBE_WRITE_REG(hw, IXGBE_RXPBSIZE(i), rxpktsize);
1257dee1ad47SJeff Kirsher 		break;
1258dee1ad47SJeff Kirsher 	}
1259dee1ad47SJeff Kirsher 
1260dee1ad47SJeff Kirsher 	/* Setup Tx packet buffer sizes */
1261dee1ad47SJeff Kirsher 	for (i = 0; i < IXGBE_MAX_PACKET_BUFFERS; i++)
1262dee1ad47SJeff Kirsher 		IXGBE_WRITE_REG(hw, IXGBE_TXPBSIZE(i), IXGBE_TXPBSIZE_40KB);
1263dee1ad47SJeff Kirsher 
1264dee1ad47SJeff Kirsher 	return;
1265dee1ad47SJeff Kirsher }
1266dee1ad47SJeff Kirsher 
1267dee1ad47SJeff Kirsher static struct ixgbe_mac_operations mac_ops_82598 = {
1268dee1ad47SJeff Kirsher 	.init_hw		= &ixgbe_init_hw_generic,
1269dee1ad47SJeff Kirsher 	.reset_hw		= &ixgbe_reset_hw_82598,
1270dee1ad47SJeff Kirsher 	.start_hw		= &ixgbe_start_hw_82598,
1271dee1ad47SJeff Kirsher 	.clear_hw_cntrs		= &ixgbe_clear_hw_cntrs_generic,
1272dee1ad47SJeff Kirsher 	.get_media_type		= &ixgbe_get_media_type_82598,
1273dee1ad47SJeff Kirsher 	.get_supported_physical_layer = &ixgbe_get_supported_physical_layer_82598,
1274dee1ad47SJeff Kirsher 	.enable_rx_dma          = &ixgbe_enable_rx_dma_generic,
1275dee1ad47SJeff Kirsher 	.get_mac_addr		= &ixgbe_get_mac_addr_generic,
1276dee1ad47SJeff Kirsher 	.stop_adapter		= &ixgbe_stop_adapter_generic,
1277dee1ad47SJeff Kirsher 	.get_bus_info           = &ixgbe_get_bus_info_generic,
1278dee1ad47SJeff Kirsher 	.set_lan_id             = &ixgbe_set_lan_id_multi_port_pcie_82598,
1279dee1ad47SJeff Kirsher 	.read_analog_reg8	= &ixgbe_read_analog_reg8_82598,
1280dee1ad47SJeff Kirsher 	.write_analog_reg8	= &ixgbe_write_analog_reg8_82598,
1281dee1ad47SJeff Kirsher 	.setup_link		= &ixgbe_setup_mac_link_82598,
1282dee1ad47SJeff Kirsher 	.set_rxpba		= &ixgbe_set_rxpba_82598,
1283dee1ad47SJeff Kirsher 	.check_link		= &ixgbe_check_mac_link_82598,
1284dee1ad47SJeff Kirsher 	.get_link_capabilities	= &ixgbe_get_link_capabilities_82598,
1285dee1ad47SJeff Kirsher 	.led_on			= &ixgbe_led_on_generic,
1286dee1ad47SJeff Kirsher 	.led_off		= &ixgbe_led_off_generic,
1287dee1ad47SJeff Kirsher 	.blink_led_start	= &ixgbe_blink_led_start_generic,
1288dee1ad47SJeff Kirsher 	.blink_led_stop		= &ixgbe_blink_led_stop_generic,
1289dee1ad47SJeff Kirsher 	.set_rar		= &ixgbe_set_rar_generic,
1290dee1ad47SJeff Kirsher 	.clear_rar		= &ixgbe_clear_rar_generic,
1291dee1ad47SJeff Kirsher 	.set_vmdq		= &ixgbe_set_vmdq_82598,
1292dee1ad47SJeff Kirsher 	.clear_vmdq		= &ixgbe_clear_vmdq_82598,
1293dee1ad47SJeff Kirsher 	.init_rx_addrs		= &ixgbe_init_rx_addrs_generic,
1294dee1ad47SJeff Kirsher 	.update_mc_addr_list	= &ixgbe_update_mc_addr_list_generic,
1295dee1ad47SJeff Kirsher 	.enable_mc		= &ixgbe_enable_mc_generic,
1296dee1ad47SJeff Kirsher 	.disable_mc		= &ixgbe_disable_mc_generic,
1297dee1ad47SJeff Kirsher 	.clear_vfta		= &ixgbe_clear_vfta_82598,
1298dee1ad47SJeff Kirsher 	.set_vfta		= &ixgbe_set_vfta_82598,
1299dee1ad47SJeff Kirsher 	.fc_enable		= &ixgbe_fc_enable_82598,
1300dee1ad47SJeff Kirsher 	.set_fw_drv_ver         = NULL,
1301dee1ad47SJeff Kirsher 	.acquire_swfw_sync      = &ixgbe_acquire_swfw_sync,
1302dee1ad47SJeff Kirsher 	.release_swfw_sync      = &ixgbe_release_swfw_sync,
1303dee1ad47SJeff Kirsher };
1304dee1ad47SJeff Kirsher 
1305dee1ad47SJeff Kirsher static struct ixgbe_eeprom_operations eeprom_ops_82598 = {
1306dee1ad47SJeff Kirsher 	.init_params		= &ixgbe_init_eeprom_params_generic,
1307dee1ad47SJeff Kirsher 	.read			= &ixgbe_read_eerd_generic,
13082fa5eef4SEmil Tantilov 	.write			= &ixgbe_write_eeprom_generic,
13092fa5eef4SEmil Tantilov 	.write_buffer		= &ixgbe_write_eeprom_buffer_bit_bang_generic,
1310dee1ad47SJeff Kirsher 	.read_buffer		= &ixgbe_read_eerd_buffer_generic,
1311dee1ad47SJeff Kirsher 	.calc_checksum          = &ixgbe_calc_eeprom_checksum_generic,
1312dee1ad47SJeff Kirsher 	.validate_checksum	= &ixgbe_validate_eeprom_checksum_generic,
1313dee1ad47SJeff Kirsher 	.update_checksum	= &ixgbe_update_eeprom_checksum_generic,
1314dee1ad47SJeff Kirsher };
1315dee1ad47SJeff Kirsher 
1316dee1ad47SJeff Kirsher static struct ixgbe_phy_operations phy_ops_82598 = {
1317dee1ad47SJeff Kirsher 	.identify		= &ixgbe_identify_phy_generic,
1318dee1ad47SJeff Kirsher 	.identify_sfp		= &ixgbe_identify_sfp_module_generic,
1319dee1ad47SJeff Kirsher 	.init			= &ixgbe_init_phy_ops_82598,
1320dee1ad47SJeff Kirsher 	.reset			= &ixgbe_reset_phy_generic,
1321dee1ad47SJeff Kirsher 	.read_reg		= &ixgbe_read_phy_reg_generic,
1322dee1ad47SJeff Kirsher 	.write_reg		= &ixgbe_write_phy_reg_generic,
1323dee1ad47SJeff Kirsher 	.setup_link		= &ixgbe_setup_phy_link_generic,
1324dee1ad47SJeff Kirsher 	.setup_link_speed	= &ixgbe_setup_phy_link_speed_generic,
1325dee1ad47SJeff Kirsher 	.read_i2c_eeprom	= &ixgbe_read_i2c_eeprom_82598,
1326dee1ad47SJeff Kirsher 	.check_overtemp   = &ixgbe_tn_check_overtemp,
1327dee1ad47SJeff Kirsher };
1328dee1ad47SJeff Kirsher 
1329dee1ad47SJeff Kirsher struct ixgbe_info ixgbe_82598_info = {
1330dee1ad47SJeff Kirsher 	.mac			= ixgbe_mac_82598EB,
1331dee1ad47SJeff Kirsher 	.get_invariants		= &ixgbe_get_invariants_82598,
1332dee1ad47SJeff Kirsher 	.mac_ops		= &mac_ops_82598,
1333dee1ad47SJeff Kirsher 	.eeprom_ops		= &eeprom_ops_82598,
1334dee1ad47SJeff Kirsher 	.phy_ops		= &phy_ops_82598,
1335dee1ad47SJeff Kirsher };
1336dee1ad47SJeff Kirsher 
1337