1 /*******************************************************************************
3 Intel 10 Gigabit PCI Express Linux driver
4 Copyright(c) 1999 - 2013 Intel Corporation.
6 This program is free software; you can redistribute it and/or modify it
7 under the terms and conditions of the GNU General Public License,
8 version 2, as published by the Free Software Foundation.
10 This program is distributed in the hope it will be useful, but WITHOUT
11 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
15 You should have received a copy of the GNU General Public License along with
16 this program; if not, write to the Free Software Foundation, Inc.,
17 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
19 The full GNU General Public License is included in this distribution in
20 the file called "COPYING".
25 Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
27 *******************************************************************************/
30 #include "ixgbe_type.h"
31 #include "ixgbe_dcb.h"
32 #include "ixgbe_dcb_82598.h"
35 * ixgbe_dcb_config_rx_arbiter_82598 - Config Rx data arbiter
36 * @hw: pointer to hardware structure
37 * @dcb_config: pointer to ixgbe_dcb_config structure
39 * Configure Rx Data Arbiter and credits for each traffic class.
41 s32 ixgbe_dcb_config_rx_arbiter_82598(struct ixgbe_hw *hw,
47 u32 credit_refill = 0;
51 reg = IXGBE_READ_REG(hw, IXGBE_RUPPBMR) | IXGBE_RUPPBMR_MQA;
52 IXGBE_WRITE_REG(hw, IXGBE_RUPPBMR, reg);
54 reg = IXGBE_READ_REG(hw, IXGBE_RMCS);
56 reg &= ~IXGBE_RMCS_ARBDIS;
57 /* Enable Receive Recycle within the BWG */
58 reg |= IXGBE_RMCS_RRM;
59 /* Enable Deficit Fixed Priority arbitration*/
60 reg |= IXGBE_RMCS_DFP;
62 IXGBE_WRITE_REG(hw, IXGBE_RMCS, reg);
64 /* Configure traffic class credits and priority */
65 for (i = 0; i < MAX_TRAFFIC_CLASS; i++) {
66 credit_refill = refill[i];
69 reg = credit_refill | (credit_max << IXGBE_RT2CR_MCL_SHIFT);
71 if (prio_type[i] == prio_link)
72 reg |= IXGBE_RT2CR_LSP;
74 IXGBE_WRITE_REG(hw, IXGBE_RT2CR(i), reg);
77 reg = IXGBE_READ_REG(hw, IXGBE_RDRXCTL);
78 reg |= IXGBE_RDRXCTL_RDMTS_1_2;
79 reg |= IXGBE_RDRXCTL_MPBEN;
80 reg |= IXGBE_RDRXCTL_MCEN;
81 IXGBE_WRITE_REG(hw, IXGBE_RDRXCTL, reg);
83 reg = IXGBE_READ_REG(hw, IXGBE_RXCTRL);
84 /* Make sure there is enough descriptors before arbitration */
85 reg &= ~IXGBE_RXCTRL_DMBYPS;
86 IXGBE_WRITE_REG(hw, IXGBE_RXCTRL, reg);
92 * ixgbe_dcb_config_tx_desc_arbiter_82598 - Config Tx Desc. arbiter
93 * @hw: pointer to hardware structure
94 * @dcb_config: pointer to ixgbe_dcb_config structure
96 * Configure Tx Descriptor Arbiter and credits for each traffic class.
98 s32 ixgbe_dcb_config_tx_desc_arbiter_82598(struct ixgbe_hw *hw,
104 u32 reg, max_credits;
107 reg = IXGBE_READ_REG(hw, IXGBE_DPMCS);
110 reg &= ~IXGBE_DPMCS_ARBDIS;
111 reg |= IXGBE_DPMCS_TSOEF;
113 /* Configure Max TSO packet size 34KB including payload and headers */
114 reg |= (0x4 << IXGBE_DPMCS_MTSOS_SHIFT);
116 IXGBE_WRITE_REG(hw, IXGBE_DPMCS, reg);
118 /* Configure traffic class credits and priority */
119 for (i = 0; i < MAX_TRAFFIC_CLASS; i++) {
120 max_credits = max[i];
121 reg = max_credits << IXGBE_TDTQ2TCCR_MCL_SHIFT;
123 reg |= (u32)(bwg_id[i]) << IXGBE_TDTQ2TCCR_BWG_SHIFT;
125 if (prio_type[i] == prio_group)
126 reg |= IXGBE_TDTQ2TCCR_GSP;
128 if (prio_type[i] == prio_link)
129 reg |= IXGBE_TDTQ2TCCR_LSP;
131 IXGBE_WRITE_REG(hw, IXGBE_TDTQ2TCCR(i), reg);
138 * ixgbe_dcb_config_tx_data_arbiter_82598 - Config Tx data arbiter
139 * @hw: pointer to hardware structure
140 * @dcb_config: pointer to ixgbe_dcb_config structure
142 * Configure Tx Data Arbiter and credits for each traffic class.
144 s32 ixgbe_dcb_config_tx_data_arbiter_82598(struct ixgbe_hw *hw,
153 reg = IXGBE_READ_REG(hw, IXGBE_PDPMCS);
154 /* Enable Data Plane Arbiter */
155 reg &= ~IXGBE_PDPMCS_ARBDIS;
156 /* Enable DFP and Transmit Recycle Mode */
157 reg |= (IXGBE_PDPMCS_TPPAC | IXGBE_PDPMCS_TRM);
159 IXGBE_WRITE_REG(hw, IXGBE_PDPMCS, reg);
161 /* Configure traffic class credits and priority */
162 for (i = 0; i < MAX_TRAFFIC_CLASS; i++) {
164 reg |= (u32)(max[i]) << IXGBE_TDPT2TCCR_MCL_SHIFT;
165 reg |= (u32)(bwg_id[i]) << IXGBE_TDPT2TCCR_BWG_SHIFT;
167 if (prio_type[i] == prio_group)
168 reg |= IXGBE_TDPT2TCCR_GSP;
170 if (prio_type[i] == prio_link)
171 reg |= IXGBE_TDPT2TCCR_LSP;
173 IXGBE_WRITE_REG(hw, IXGBE_TDPT2TCCR(i), reg);
176 /* Enable Tx packet buffer division */
177 reg = IXGBE_READ_REG(hw, IXGBE_DTXCTL);
178 reg |= IXGBE_DTXCTL_ENDBUBD;
179 IXGBE_WRITE_REG(hw, IXGBE_DTXCTL, reg);
185 * ixgbe_dcb_config_pfc_82598 - Config priority flow control
186 * @hw: pointer to hardware structure
187 * @dcb_config: pointer to ixgbe_dcb_config structure
189 * Configure Priority Flow Control for each traffic class.
191 s32 ixgbe_dcb_config_pfc_82598(struct ixgbe_hw *hw, u8 pfc_en)
196 /* Enable Transmit Priority Flow Control */
197 reg = IXGBE_READ_REG(hw, IXGBE_RMCS);
198 reg &= ~IXGBE_RMCS_TFCE_802_3X;
199 reg |= IXGBE_RMCS_TFCE_PRIORITY;
200 IXGBE_WRITE_REG(hw, IXGBE_RMCS, reg);
202 /* Enable Receive Priority Flow Control */
203 reg = IXGBE_READ_REG(hw, IXGBE_FCTRL);
204 reg &= ~(IXGBE_FCTRL_RPFCE | IXGBE_FCTRL_RFCE);
207 reg |= IXGBE_FCTRL_RPFCE;
209 IXGBE_WRITE_REG(hw, IXGBE_FCTRL, reg);
211 /* Configure PFC Tx thresholds per TC */
212 for (i = 0; i < MAX_TRAFFIC_CLASS; i++) {
213 if (!(pfc_en & (1 << i))) {
214 IXGBE_WRITE_REG(hw, IXGBE_FCRTL(i), 0);
215 IXGBE_WRITE_REG(hw, IXGBE_FCRTH(i), 0);
219 fcrtl = (hw->fc.low_water[i] << 10) | IXGBE_FCRTL_XONE;
220 reg = (hw->fc.high_water[i] << 10) | IXGBE_FCRTH_FCEN;
221 IXGBE_WRITE_REG(hw, IXGBE_FCRTL(i), fcrtl);
222 IXGBE_WRITE_REG(hw, IXGBE_FCRTH(i), reg);
225 /* Configure pause time */
226 reg = hw->fc.pause_time * 0x00010001;
227 for (i = 0; i < (MAX_TRAFFIC_CLASS / 2); i++)
228 IXGBE_WRITE_REG(hw, IXGBE_FCTTV(i), reg);
230 /* Configure flow control refresh threshold value */
231 IXGBE_WRITE_REG(hw, IXGBE_FCRTV, hw->fc.pause_time / 2);
238 * ixgbe_dcb_config_tc_stats_82598 - Configure traffic class statistics
239 * @hw: pointer to hardware structure
241 * Configure queue statistics registers, all queues belonging to same traffic
242 * class uses a single set of queue statistics counters.
244 static s32 ixgbe_dcb_config_tc_stats_82598(struct ixgbe_hw *hw)
250 /* Receive Queues stats setting - 8 queues per statistics reg */
251 for (i = 0, j = 0; i < 15 && j < 8; i = i + 2, j++) {
252 reg = IXGBE_READ_REG(hw, IXGBE_RQSMR(i));
253 reg |= ((0x1010101) * j);
254 IXGBE_WRITE_REG(hw, IXGBE_RQSMR(i), reg);
255 reg = IXGBE_READ_REG(hw, IXGBE_RQSMR(i + 1));
256 reg |= ((0x1010101) * j);
257 IXGBE_WRITE_REG(hw, IXGBE_RQSMR(i + 1), reg);
259 /* Transmit Queues stats setting - 4 queues per statistics reg */
260 for (i = 0; i < 8; i++) {
261 reg = IXGBE_READ_REG(hw, IXGBE_TQSMR(i));
262 reg |= ((0x1010101) * i);
263 IXGBE_WRITE_REG(hw, IXGBE_TQSMR(i), reg);
270 * ixgbe_dcb_hw_config_82598 - Config and enable DCB
271 * @hw: pointer to hardware structure
272 * @dcb_config: pointer to ixgbe_dcb_config structure
274 * Configure dcb settings and enable dcb mode.
276 s32 ixgbe_dcb_hw_config_82598(struct ixgbe_hw *hw, u8 pfc_en, u16 *refill,
277 u16 *max, u8 *bwg_id, u8 *prio_type)
279 ixgbe_dcb_config_rx_arbiter_82598(hw, refill, max, prio_type);
280 ixgbe_dcb_config_tx_desc_arbiter_82598(hw, refill, max,
282 ixgbe_dcb_config_tx_data_arbiter_82598(hw, refill, max,
284 ixgbe_dcb_config_pfc_82598(hw, pfc_en);
285 ixgbe_dcb_config_tc_stats_82598(hw);