1dee1ad47SJeff Kirsher /*******************************************************************************
2dee1ad47SJeff Kirsher 
3dee1ad47SJeff Kirsher   Intel 10 Gigabit PCI Express Linux driver
4dee1ad47SJeff Kirsher   Copyright(c) 1999 - 2011 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 "ixgbe.h"
29dee1ad47SJeff Kirsher #include "ixgbe_type.h"
30dee1ad47SJeff Kirsher #include "ixgbe_dcb.h"
31dee1ad47SJeff Kirsher #include "ixgbe_dcb_82599.h"
32dee1ad47SJeff Kirsher 
33dee1ad47SJeff Kirsher /**
34dee1ad47SJeff Kirsher  * ixgbe_dcb_config_rx_arbiter_82599 - Config Rx Data arbiter
35dee1ad47SJeff Kirsher  * @hw: pointer to hardware structure
36dee1ad47SJeff Kirsher  * @refill: refill credits index by traffic class
37dee1ad47SJeff Kirsher  * @max: max credits index by traffic class
38dee1ad47SJeff Kirsher  * @bwg_id: bandwidth grouping indexed by traffic class
39dee1ad47SJeff Kirsher  * @prio_type: priority type indexed by traffic class
40dee1ad47SJeff Kirsher  *
41dee1ad47SJeff Kirsher  * Configure Rx Packet Arbiter and credits for each traffic class.
42dee1ad47SJeff Kirsher  */
43dee1ad47SJeff Kirsher s32 ixgbe_dcb_config_rx_arbiter_82599(struct ixgbe_hw *hw,
44dee1ad47SJeff Kirsher 				      u16 *refill,
45dee1ad47SJeff Kirsher 				      u16 *max,
46dee1ad47SJeff Kirsher 				      u8 *bwg_id,
47dee1ad47SJeff Kirsher 				      u8 *prio_type,
48dee1ad47SJeff Kirsher 				      u8 *prio_tc)
49dee1ad47SJeff Kirsher {
50dee1ad47SJeff Kirsher 	u32    reg           = 0;
51dee1ad47SJeff Kirsher 	u32    credit_refill = 0;
52dee1ad47SJeff Kirsher 	u32    credit_max    = 0;
53dee1ad47SJeff Kirsher 	u8     i             = 0;
54dee1ad47SJeff Kirsher 
55dee1ad47SJeff Kirsher 	/*
56dee1ad47SJeff Kirsher 	 * Disable the arbiter before changing parameters
57dee1ad47SJeff Kirsher 	 * (always enable recycle mode; WSP)
58dee1ad47SJeff Kirsher 	 */
59dee1ad47SJeff Kirsher 	reg = IXGBE_RTRPCS_RRM | IXGBE_RTRPCS_RAC | IXGBE_RTRPCS_ARBDIS;
60dee1ad47SJeff Kirsher 	IXGBE_WRITE_REG(hw, IXGBE_RTRPCS, reg);
61dee1ad47SJeff Kirsher 
62dee1ad47SJeff Kirsher 	/* Map all traffic classes to their UP, 1 to 1 */
63dee1ad47SJeff Kirsher 	reg = 0;
64dee1ad47SJeff Kirsher 	for (i = 0; i < MAX_TRAFFIC_CLASS; i++)
65dee1ad47SJeff Kirsher 		reg |= (prio_tc[i] << (i * IXGBE_RTRUP2TC_UP_SHIFT));
66dee1ad47SJeff Kirsher 	IXGBE_WRITE_REG(hw, IXGBE_RTRUP2TC, reg);
67dee1ad47SJeff Kirsher 
68dee1ad47SJeff Kirsher 	/* Configure traffic class credits and priority */
69dee1ad47SJeff Kirsher 	for (i = 0; i < MAX_TRAFFIC_CLASS; i++) {
70dee1ad47SJeff Kirsher 		credit_refill = refill[i];
71dee1ad47SJeff Kirsher 		credit_max    = max[i];
72dee1ad47SJeff Kirsher 		reg = credit_refill | (credit_max << IXGBE_RTRPT4C_MCL_SHIFT);
73dee1ad47SJeff Kirsher 
74dee1ad47SJeff Kirsher 		reg |= (u32)(bwg_id[i]) << IXGBE_RTRPT4C_BWG_SHIFT;
75dee1ad47SJeff Kirsher 
76dee1ad47SJeff Kirsher 		if (prio_type[i] == prio_link)
77dee1ad47SJeff Kirsher 			reg |= IXGBE_RTRPT4C_LSP;
78dee1ad47SJeff Kirsher 
79dee1ad47SJeff Kirsher 		IXGBE_WRITE_REG(hw, IXGBE_RTRPT4C(i), reg);
80dee1ad47SJeff Kirsher 	}
81dee1ad47SJeff Kirsher 
82dee1ad47SJeff Kirsher 	/*
83dee1ad47SJeff Kirsher 	 * Configure Rx packet plane (recycle mode; WSP) and
84dee1ad47SJeff Kirsher 	 * enable arbiter
85dee1ad47SJeff Kirsher 	 */
86dee1ad47SJeff Kirsher 	reg = IXGBE_RTRPCS_RRM | IXGBE_RTRPCS_RAC;
87dee1ad47SJeff Kirsher 	IXGBE_WRITE_REG(hw, IXGBE_RTRPCS, reg);
88dee1ad47SJeff Kirsher 
89dee1ad47SJeff Kirsher 	return 0;
90dee1ad47SJeff Kirsher }
91dee1ad47SJeff Kirsher 
92dee1ad47SJeff Kirsher /**
93dee1ad47SJeff Kirsher  * ixgbe_dcb_config_tx_desc_arbiter_82599 - Config Tx Desc. arbiter
94dee1ad47SJeff Kirsher  * @hw: pointer to hardware structure
95dee1ad47SJeff Kirsher  * @refill: refill credits index by traffic class
96dee1ad47SJeff Kirsher  * @max: max credits index by traffic class
97dee1ad47SJeff Kirsher  * @bwg_id: bandwidth grouping indexed by traffic class
98dee1ad47SJeff Kirsher  * @prio_type: priority type indexed by traffic class
99dee1ad47SJeff Kirsher  *
100dee1ad47SJeff Kirsher  * Configure Tx Descriptor Arbiter and credits for each traffic class.
101dee1ad47SJeff Kirsher  */
102dee1ad47SJeff Kirsher s32 ixgbe_dcb_config_tx_desc_arbiter_82599(struct ixgbe_hw *hw,
103dee1ad47SJeff Kirsher 					   u16 *refill,
104dee1ad47SJeff Kirsher 					   u16 *max,
105dee1ad47SJeff Kirsher 					   u8 *bwg_id,
106dee1ad47SJeff Kirsher 					   u8 *prio_type)
107dee1ad47SJeff Kirsher {
108dee1ad47SJeff Kirsher 	u32    reg, max_credits;
109dee1ad47SJeff Kirsher 	u8     i;
110dee1ad47SJeff Kirsher 
111dee1ad47SJeff Kirsher 	/* Clear the per-Tx queue credits; we use per-TC instead */
112dee1ad47SJeff Kirsher 	for (i = 0; i < 128; i++) {
113dee1ad47SJeff Kirsher 		IXGBE_WRITE_REG(hw, IXGBE_RTTDQSEL, i);
114dee1ad47SJeff Kirsher 		IXGBE_WRITE_REG(hw, IXGBE_RTTDT1C, 0);
115dee1ad47SJeff Kirsher 	}
116dee1ad47SJeff Kirsher 
117dee1ad47SJeff Kirsher 	/* Configure traffic class credits and priority */
118dee1ad47SJeff Kirsher 	for (i = 0; i < MAX_TRAFFIC_CLASS; i++) {
119dee1ad47SJeff Kirsher 		max_credits = max[i];
120dee1ad47SJeff Kirsher 		reg = max_credits << IXGBE_RTTDT2C_MCL_SHIFT;
121dee1ad47SJeff Kirsher 		reg |= refill[i];
122dee1ad47SJeff Kirsher 		reg |= (u32)(bwg_id[i]) << IXGBE_RTTDT2C_BWG_SHIFT;
123dee1ad47SJeff Kirsher 
124dee1ad47SJeff Kirsher 		if (prio_type[i] == prio_group)
125dee1ad47SJeff Kirsher 			reg |= IXGBE_RTTDT2C_GSP;
126dee1ad47SJeff Kirsher 
127dee1ad47SJeff Kirsher 		if (prio_type[i] == prio_link)
128dee1ad47SJeff Kirsher 			reg |= IXGBE_RTTDT2C_LSP;
129dee1ad47SJeff Kirsher 
130dee1ad47SJeff Kirsher 		IXGBE_WRITE_REG(hw, IXGBE_RTTDT2C(i), reg);
131dee1ad47SJeff Kirsher 	}
132dee1ad47SJeff Kirsher 
133dee1ad47SJeff Kirsher 	/*
134dee1ad47SJeff Kirsher 	 * Configure Tx descriptor plane (recycle mode; WSP) and
135dee1ad47SJeff Kirsher 	 * enable arbiter
136dee1ad47SJeff Kirsher 	 */
137dee1ad47SJeff Kirsher 	reg = IXGBE_RTTDCS_TDPAC | IXGBE_RTTDCS_TDRM;
138dee1ad47SJeff Kirsher 	IXGBE_WRITE_REG(hw, IXGBE_RTTDCS, reg);
139dee1ad47SJeff Kirsher 
140dee1ad47SJeff Kirsher 	return 0;
141dee1ad47SJeff Kirsher }
142dee1ad47SJeff Kirsher 
143dee1ad47SJeff Kirsher /**
144dee1ad47SJeff Kirsher  * ixgbe_dcb_config_tx_data_arbiter_82599 - Config Tx Data arbiter
145dee1ad47SJeff Kirsher  * @hw: pointer to hardware structure
146dee1ad47SJeff Kirsher  * @refill: refill credits index by traffic class
147dee1ad47SJeff Kirsher  * @max: max credits index by traffic class
148dee1ad47SJeff Kirsher  * @bwg_id: bandwidth grouping indexed by traffic class
149dee1ad47SJeff Kirsher  * @prio_type: priority type indexed by traffic class
150dee1ad47SJeff Kirsher  *
151dee1ad47SJeff Kirsher  * Configure Tx Packet Arbiter and credits for each traffic class.
152dee1ad47SJeff Kirsher  */
153dee1ad47SJeff Kirsher s32 ixgbe_dcb_config_tx_data_arbiter_82599(struct ixgbe_hw *hw,
154dee1ad47SJeff Kirsher 					   u16 *refill,
155dee1ad47SJeff Kirsher 					   u16 *max,
156dee1ad47SJeff Kirsher 					   u8 *bwg_id,
157dee1ad47SJeff Kirsher 					   u8 *prio_type,
158dee1ad47SJeff Kirsher 					   u8 *prio_tc)
159dee1ad47SJeff Kirsher {
160dee1ad47SJeff Kirsher 	u32 reg;
161dee1ad47SJeff Kirsher 	u8 i;
162dee1ad47SJeff Kirsher 
163dee1ad47SJeff Kirsher 	/*
164dee1ad47SJeff Kirsher 	 * Disable the arbiter before changing parameters
165dee1ad47SJeff Kirsher 	 * (always enable recycle mode; SP; arb delay)
166dee1ad47SJeff Kirsher 	 */
167dee1ad47SJeff Kirsher 	reg = IXGBE_RTTPCS_TPPAC | IXGBE_RTTPCS_TPRM |
168dee1ad47SJeff Kirsher 	      (IXGBE_RTTPCS_ARBD_DCB << IXGBE_RTTPCS_ARBD_SHIFT) |
169dee1ad47SJeff Kirsher 	      IXGBE_RTTPCS_ARBDIS;
170dee1ad47SJeff Kirsher 	IXGBE_WRITE_REG(hw, IXGBE_RTTPCS, reg);
171dee1ad47SJeff Kirsher 
172dee1ad47SJeff Kirsher 	/* Map all traffic classes to their UP, 1 to 1 */
173dee1ad47SJeff Kirsher 	reg = 0;
174dee1ad47SJeff Kirsher 	for (i = 0; i < MAX_TRAFFIC_CLASS; i++)
175dee1ad47SJeff Kirsher 		reg |= (prio_tc[i] << (i * IXGBE_RTTUP2TC_UP_SHIFT));
176dee1ad47SJeff Kirsher 	IXGBE_WRITE_REG(hw, IXGBE_RTTUP2TC, reg);
177dee1ad47SJeff Kirsher 
178dee1ad47SJeff Kirsher 	/* Configure traffic class credits and priority */
179dee1ad47SJeff Kirsher 	for (i = 0; i < MAX_TRAFFIC_CLASS; i++) {
180dee1ad47SJeff Kirsher 		reg = refill[i];
181dee1ad47SJeff Kirsher 		reg |= (u32)(max[i]) << IXGBE_RTTPT2C_MCL_SHIFT;
182dee1ad47SJeff Kirsher 		reg |= (u32)(bwg_id[i]) << IXGBE_RTTPT2C_BWG_SHIFT;
183dee1ad47SJeff Kirsher 
184dee1ad47SJeff Kirsher 		if (prio_type[i] == prio_group)
185dee1ad47SJeff Kirsher 			reg |= IXGBE_RTTPT2C_GSP;
186dee1ad47SJeff Kirsher 
187dee1ad47SJeff Kirsher 		if (prio_type[i] == prio_link)
188dee1ad47SJeff Kirsher 			reg |= IXGBE_RTTPT2C_LSP;
189dee1ad47SJeff Kirsher 
190dee1ad47SJeff Kirsher 		IXGBE_WRITE_REG(hw, IXGBE_RTTPT2C(i), reg);
191dee1ad47SJeff Kirsher 	}
192dee1ad47SJeff Kirsher 
193dee1ad47SJeff Kirsher 	/*
194dee1ad47SJeff Kirsher 	 * Configure Tx packet plane (recycle mode; SP; arb delay) and
195dee1ad47SJeff Kirsher 	 * enable arbiter
196dee1ad47SJeff Kirsher 	 */
197dee1ad47SJeff Kirsher 	reg = IXGBE_RTTPCS_TPPAC | IXGBE_RTTPCS_TPRM |
198dee1ad47SJeff Kirsher 	      (IXGBE_RTTPCS_ARBD_DCB << IXGBE_RTTPCS_ARBD_SHIFT);
199dee1ad47SJeff Kirsher 	IXGBE_WRITE_REG(hw, IXGBE_RTTPCS, reg);
200dee1ad47SJeff Kirsher 
201dee1ad47SJeff Kirsher 	return 0;
202dee1ad47SJeff Kirsher }
203dee1ad47SJeff Kirsher 
204dee1ad47SJeff Kirsher /**
205dee1ad47SJeff Kirsher  * ixgbe_dcb_config_pfc_82599 - Configure priority flow control
206dee1ad47SJeff Kirsher  * @hw: pointer to hardware structure
207dee1ad47SJeff Kirsher  * @pfc_en: enabled pfc bitmask
208dee1ad47SJeff Kirsher  *
209dee1ad47SJeff Kirsher  * Configure Priority Flow Control (PFC) for each traffic class.
210dee1ad47SJeff Kirsher  */
211dee1ad47SJeff Kirsher s32 ixgbe_dcb_config_pfc_82599(struct ixgbe_hw *hw, u8 pfc_en)
212dee1ad47SJeff Kirsher {
213dee1ad47SJeff Kirsher 	u32 i, reg, rx_pba_size;
214dee1ad47SJeff Kirsher 
215dee1ad47SJeff Kirsher 	/* Configure PFC Tx thresholds per TC */
216dee1ad47SJeff Kirsher 	for (i = 0; i < MAX_TRAFFIC_CLASS; i++) {
217dee1ad47SJeff Kirsher 		int enabled = pfc_en & (1 << i);
218dee1ad47SJeff Kirsher 		rx_pba_size = IXGBE_READ_REG(hw, IXGBE_RXPBSIZE(i));
219dee1ad47SJeff Kirsher 		rx_pba_size >>= IXGBE_RXPBSIZE_SHIFT;
220dee1ad47SJeff Kirsher 
221dee1ad47SJeff Kirsher 		reg = (rx_pba_size - hw->fc.low_water) << 10;
222dee1ad47SJeff Kirsher 
223dee1ad47SJeff Kirsher 		if (enabled)
224dee1ad47SJeff Kirsher 			reg |= IXGBE_FCRTL_XONE;
225dee1ad47SJeff Kirsher 		IXGBE_WRITE_REG(hw, IXGBE_FCRTL_82599(i), reg);
226dee1ad47SJeff Kirsher 
227dee1ad47SJeff Kirsher 		reg = (rx_pba_size - hw->fc.high_water) << 10;
228dee1ad47SJeff Kirsher 		if (enabled)
229dee1ad47SJeff Kirsher 			reg |= IXGBE_FCRTH_FCEN;
230dee1ad47SJeff Kirsher 		IXGBE_WRITE_REG(hw, IXGBE_FCRTH_82599(i), reg);
231dee1ad47SJeff Kirsher 	}
232dee1ad47SJeff Kirsher 
233dee1ad47SJeff Kirsher 	if (pfc_en) {
234dee1ad47SJeff Kirsher 		/* Configure pause time (2 TCs per register) */
235dee1ad47SJeff Kirsher 		reg = hw->fc.pause_time | (hw->fc.pause_time << 16);
236dee1ad47SJeff Kirsher 		for (i = 0; i < (MAX_TRAFFIC_CLASS / 2); i++)
237dee1ad47SJeff Kirsher 			IXGBE_WRITE_REG(hw, IXGBE_FCTTV(i), reg);
238dee1ad47SJeff Kirsher 
239dee1ad47SJeff Kirsher 		/* Configure flow control refresh threshold value */
240dee1ad47SJeff Kirsher 		IXGBE_WRITE_REG(hw, IXGBE_FCRTV, hw->fc.pause_time / 2);
241dee1ad47SJeff Kirsher 
242dee1ad47SJeff Kirsher 
243dee1ad47SJeff Kirsher 		reg = IXGBE_FCCFG_TFCE_PRIORITY;
244dee1ad47SJeff Kirsher 		IXGBE_WRITE_REG(hw, IXGBE_FCCFG, reg);
245dee1ad47SJeff Kirsher 		/*
246dee1ad47SJeff Kirsher 		 * Enable Receive PFC
247dee1ad47SJeff Kirsher 		 * 82599 will always honor XOFF frames we receive when
248dee1ad47SJeff Kirsher 		 * we are in PFC mode however X540 only honors enabled
249dee1ad47SJeff Kirsher 		 * traffic classes.
250dee1ad47SJeff Kirsher 		 */
251dee1ad47SJeff Kirsher 		reg = IXGBE_READ_REG(hw, IXGBE_MFLCN);
252dee1ad47SJeff Kirsher 		reg &= ~IXGBE_MFLCN_RFCE;
253dee1ad47SJeff Kirsher 		reg |= IXGBE_MFLCN_RPFCE | IXGBE_MFLCN_DPF;
254dee1ad47SJeff Kirsher 
255dee1ad47SJeff Kirsher 		if (hw->mac.type == ixgbe_mac_X540)
256dee1ad47SJeff Kirsher 			reg |= pfc_en << IXGBE_MFLCN_RPFCE_SHIFT;
257dee1ad47SJeff Kirsher 
258dee1ad47SJeff Kirsher 		IXGBE_WRITE_REG(hw, IXGBE_MFLCN, reg);
259dee1ad47SJeff Kirsher 
260dee1ad47SJeff Kirsher 	} else {
261dee1ad47SJeff Kirsher 		for (i = 0; i < MAX_TRAFFIC_CLASS; i++)
262dee1ad47SJeff Kirsher 			hw->mac.ops.fc_enable(hw, i);
263dee1ad47SJeff Kirsher 	}
264dee1ad47SJeff Kirsher 
265dee1ad47SJeff Kirsher 	return 0;
266dee1ad47SJeff Kirsher }
267dee1ad47SJeff Kirsher 
268dee1ad47SJeff Kirsher /**
269dee1ad47SJeff Kirsher  * ixgbe_dcb_config_tc_stats_82599 - Config traffic class statistics
270dee1ad47SJeff Kirsher  * @hw: pointer to hardware structure
271dee1ad47SJeff Kirsher  *
272dee1ad47SJeff Kirsher  * Configure queue statistics registers, all queues belonging to same traffic
273dee1ad47SJeff Kirsher  * class uses a single set of queue statistics counters.
274dee1ad47SJeff Kirsher  */
275dee1ad47SJeff Kirsher static s32 ixgbe_dcb_config_tc_stats_82599(struct ixgbe_hw *hw)
276dee1ad47SJeff Kirsher {
277dee1ad47SJeff Kirsher 	u32 reg = 0;
278dee1ad47SJeff Kirsher 	u8  i   = 0;
279dee1ad47SJeff Kirsher 
280dee1ad47SJeff Kirsher 	/*
281dee1ad47SJeff Kirsher 	 * Receive Queues stats setting
282dee1ad47SJeff Kirsher 	 * 32 RQSMR registers, each configuring 4 queues.
283dee1ad47SJeff Kirsher 	 * Set all 16 queues of each TC to the same stat
284dee1ad47SJeff Kirsher 	 * with TC 'n' going to stat 'n'.
285dee1ad47SJeff Kirsher 	 */
286dee1ad47SJeff Kirsher 	for (i = 0; i < 32; i++) {
287dee1ad47SJeff Kirsher 		reg = 0x01010101 * (i / 4);
288dee1ad47SJeff Kirsher 		IXGBE_WRITE_REG(hw, IXGBE_RQSMR(i), reg);
289dee1ad47SJeff Kirsher 	}
290dee1ad47SJeff Kirsher 	/*
291dee1ad47SJeff Kirsher 	 * Transmit Queues stats setting
292dee1ad47SJeff Kirsher 	 * 32 TQSM registers, each controlling 4 queues.
293dee1ad47SJeff Kirsher 	 * Set all queues of each TC to the same stat
294dee1ad47SJeff Kirsher 	 * with TC 'n' going to stat 'n'.
295dee1ad47SJeff Kirsher 	 * Tx queues are allocated non-uniformly to TCs:
296dee1ad47SJeff Kirsher 	 * 32, 32, 16, 16, 8, 8, 8, 8.
297dee1ad47SJeff Kirsher 	 */
298dee1ad47SJeff Kirsher 	for (i = 0; i < 32; i++) {
299dee1ad47SJeff Kirsher 		if (i < 8)
300dee1ad47SJeff Kirsher 			reg = 0x00000000;
301dee1ad47SJeff Kirsher 		else if (i < 16)
302dee1ad47SJeff Kirsher 			reg = 0x01010101;
303dee1ad47SJeff Kirsher 		else if (i < 20)
304dee1ad47SJeff Kirsher 			reg = 0x02020202;
305dee1ad47SJeff Kirsher 		else if (i < 24)
306dee1ad47SJeff Kirsher 			reg = 0x03030303;
307dee1ad47SJeff Kirsher 		else if (i < 26)
308dee1ad47SJeff Kirsher 			reg = 0x04040404;
309dee1ad47SJeff Kirsher 		else if (i < 28)
310dee1ad47SJeff Kirsher 			reg = 0x05050505;
311dee1ad47SJeff Kirsher 		else if (i < 30)
312dee1ad47SJeff Kirsher 			reg = 0x06060606;
313dee1ad47SJeff Kirsher 		else
314dee1ad47SJeff Kirsher 			reg = 0x07070707;
315dee1ad47SJeff Kirsher 		IXGBE_WRITE_REG(hw, IXGBE_TQSM(i), reg);
316dee1ad47SJeff Kirsher 	}
317dee1ad47SJeff Kirsher 
318dee1ad47SJeff Kirsher 	return 0;
319dee1ad47SJeff Kirsher }
320dee1ad47SJeff Kirsher 
321dee1ad47SJeff Kirsher /**
322dee1ad47SJeff Kirsher  * ixgbe_dcb_hw_config_82599 - Configure and enable DCB
323dee1ad47SJeff Kirsher  * @hw: pointer to hardware structure
324dee1ad47SJeff Kirsher  * @refill: refill credits index by traffic class
325dee1ad47SJeff Kirsher  * @max: max credits index by traffic class
326dee1ad47SJeff Kirsher  * @bwg_id: bandwidth grouping indexed by traffic class
327dee1ad47SJeff Kirsher  * @prio_type: priority type indexed by traffic class
328dee1ad47SJeff Kirsher  * @pfc_en: enabled pfc bitmask
329dee1ad47SJeff Kirsher  *
330dee1ad47SJeff Kirsher  * Configure dcb settings and enable dcb mode.
331dee1ad47SJeff Kirsher  */
332dee1ad47SJeff Kirsher s32 ixgbe_dcb_hw_config_82599(struct ixgbe_hw *hw, u8 pfc_en, u16 *refill,
333dee1ad47SJeff Kirsher 			      u16 *max, u8 *bwg_id, u8 *prio_type, u8 *prio_tc)
334dee1ad47SJeff Kirsher {
335dee1ad47SJeff Kirsher 	ixgbe_dcb_config_rx_arbiter_82599(hw, refill, max, bwg_id,
336dee1ad47SJeff Kirsher 					  prio_type, prio_tc);
337dee1ad47SJeff Kirsher 	ixgbe_dcb_config_tx_desc_arbiter_82599(hw, refill, max,
338dee1ad47SJeff Kirsher 					       bwg_id, prio_type);
339dee1ad47SJeff Kirsher 	ixgbe_dcb_config_tx_data_arbiter_82599(hw, refill, max,
340dee1ad47SJeff Kirsher 					       bwg_id, prio_type, prio_tc);
341dee1ad47SJeff Kirsher 	ixgbe_dcb_config_pfc_82599(hw, pfc_en);
342dee1ad47SJeff Kirsher 	ixgbe_dcb_config_tc_stats_82599(hw);
343dee1ad47SJeff Kirsher 
344dee1ad47SJeff Kirsher 	return 0;
345dee1ad47SJeff Kirsher }
346dee1ad47SJeff Kirsher 
347