103
103
/* Configure traffic class credits and priority */
104
104
for (i = 0; i < MAX_TRAFFIC_CLASS; i++) {
105
p = &dcb_config->tc_config[i].path[DCB_RX_CONFIG];
106
credit_refill = p->data_credits_refill;
107
credit_max = p->data_credits_max;
105
credit_refill = refill[i];
109
108
reg = credit_refill | (credit_max << IXGBE_RT2CR_MCL_SHIFT);
111
if (p->prio_type == prio_link)
110
if (prio_type[i] == prio_link)
112
111
reg |= IXGBE_RT2CR_LSP;
114
113
IXGBE_WRITE_REG(hw, IXGBE_RT2CR(i), reg);
159
158
/* Configure traffic class credits and priority */
160
159
for (i = 0; i < MAX_TRAFFIC_CLASS; i++) {
161
p = &dcb_config->tc_config[i].path[DCB_TX_CONFIG];
162
max_credits = dcb_config->tc_config[i].desc_credits_max;
160
max_credits = max[i];
163
161
reg = max_credits << IXGBE_TDTQ2TCCR_MCL_SHIFT;
164
reg |= p->data_credits_refill;
165
reg |= (u32)(p->bwg_id) << IXGBE_TDTQ2TCCR_BWG_SHIFT;
163
reg |= (u32)(bwg_id[i]) << IXGBE_TDTQ2TCCR_BWG_SHIFT;
167
if (p->prio_type == prio_group)
165
if (prio_type[i] == prio_group)
168
166
reg |= IXGBE_TDTQ2TCCR_GSP;
170
if (p->prio_type == prio_link)
168
if (prio_type[i] == prio_link)
171
169
reg |= IXGBE_TDTQ2TCCR_LSP;
173
171
IXGBE_WRITE_REG(hw, IXGBE_TDTQ2TCCR(i), reg);
201
201
/* Configure traffic class credits and priority */
202
202
for (i = 0; i < MAX_TRAFFIC_CLASS; i++) {
203
p = &dcb_config->tc_config[i].path[DCB_TX_CONFIG];
204
reg = p->data_credits_refill;
205
reg |= (u32)(p->data_credits_max) << IXGBE_TDPT2TCCR_MCL_SHIFT;
206
reg |= (u32)(p->bwg_id) << IXGBE_TDPT2TCCR_BWG_SHIFT;
204
reg |= (u32)(max[i]) << IXGBE_TDPT2TCCR_MCL_SHIFT;
205
reg |= (u32)(bwg_id[i]) << IXGBE_TDPT2TCCR_BWG_SHIFT;
208
if (p->prio_type == prio_group)
207
if (prio_type[i] == prio_group)
209
208
reg |= IXGBE_TDPT2TCCR_GSP;
211
if (p->prio_type == prio_link)
210
if (prio_type[i] == prio_link)
212
211
reg |= IXGBE_TDPT2TCCR_LSP;
214
213
IXGBE_WRITE_REG(hw, IXGBE_TDPT2TCCR(i), reg);
230
229
* Configure Priority Flow Control for each traffic class.
232
s32 ixgbe_dcb_config_pfc_82598(struct ixgbe_hw *hw,
233
struct ixgbe_dcb_config *dcb_config)
231
s32 ixgbe_dcb_config_pfc_82598(struct ixgbe_hw *hw, u8 pfc_en)
235
233
u32 reg, rx_pba_size;
238
if (!dcb_config->pfc_mode_enable)
241
/* Enable Transmit Priority Flow Control */
242
reg = IXGBE_READ_REG(hw, IXGBE_RMCS);
243
reg &= ~IXGBE_RMCS_TFCE_802_3X;
244
/* correct the reporting of our flow control status */
245
reg |= IXGBE_RMCS_TFCE_PRIORITY;
246
IXGBE_WRITE_REG(hw, IXGBE_RMCS, reg);
248
/* Enable Receive Priority Flow Control */
249
reg = IXGBE_READ_REG(hw, IXGBE_FCTRL);
250
reg &= ~IXGBE_FCTRL_RFCE;
251
reg |= IXGBE_FCTRL_RPFCE;
252
IXGBE_WRITE_REG(hw, IXGBE_FCTRL, reg);
237
/* Enable Transmit Priority Flow Control */
238
reg = IXGBE_READ_REG(hw, IXGBE_RMCS);
239
reg &= ~IXGBE_RMCS_TFCE_802_3X;
240
/* correct the reporting of our flow control status */
241
reg |= IXGBE_RMCS_TFCE_PRIORITY;
242
IXGBE_WRITE_REG(hw, IXGBE_RMCS, reg);
244
/* Enable Receive Priority Flow Control */
245
reg = IXGBE_READ_REG(hw, IXGBE_FCTRL);
246
reg &= ~IXGBE_FCTRL_RFCE;
247
reg |= IXGBE_FCTRL_RPFCE;
248
IXGBE_WRITE_REG(hw, IXGBE_FCTRL, reg);
250
/* Configure pause time */
251
for (i = 0; i < (MAX_TRAFFIC_CLASS >> 1); i++)
252
IXGBE_WRITE_REG(hw, IXGBE_FCTTV(i), 0x68006800);
254
/* Configure flow control refresh threshold value */
255
IXGBE_WRITE_REG(hw, IXGBE_FCRTV, 0x3400);
255
259
* Configure flow control thresholds and enable priority flow control
256
260
* for each traffic class.
258
262
for (i = 0; i < MAX_TRAFFIC_CLASS; i++) {
263
int enabled = pfc_en & (1 << i);
259
264
rx_pba_size = IXGBE_READ_REG(hw, IXGBE_RXPBSIZE(i));
260
265
rx_pba_size >>= IXGBE_RXPBSIZE_SHIFT;
261
266
reg = (rx_pba_size - hw->fc.low_water) << 10;
263
if (dcb_config->tc_config[i].dcb_pfc == pfc_enabled_tx ||
264
dcb_config->tc_config[i].dcb_pfc == pfc_enabled_full)
268
if (enabled == pfc_enabled_tx ||
269
enabled == pfc_enabled_full)
265
270
reg |= IXGBE_FCRTL_XONE;
267
272
IXGBE_WRITE_REG(hw, IXGBE_FCRTL(i), reg);
269
274
reg = (rx_pba_size - hw->fc.high_water) << 10;
270
if (dcb_config->tc_config[i].dcb_pfc == pfc_enabled_tx ||
271
dcb_config->tc_config[i].dcb_pfc == pfc_enabled_full)
275
if (enabled == pfc_enabled_tx ||
276
enabled == pfc_enabled_full)
272
277
reg |= IXGBE_FCRTH_FCEN;
274
279
IXGBE_WRITE_REG(hw, IXGBE_FCRTH(i), reg);
277
/* Configure pause time */
278
for (i = 0; i < (MAX_TRAFFIC_CLASS >> 1); i++)
279
IXGBE_WRITE_REG(hw, IXGBE_FCTTV(i), 0x68006800);
281
/* Configure flow control refresh threshold value */
282
IXGBE_WRITE_REG(hw, IXGBE_FCRTV, 0x3400);
325
322
* Configure dcb settings and enable dcb mode.
327
324
s32 ixgbe_dcb_hw_config_82598(struct ixgbe_hw *hw,
328
struct ixgbe_dcb_config *dcb_config)
325
u8 rx_pba, u8 pfc_en, u16 *refill,
326
u16 *max, u8 *bwg_id, u8 *prio_type)
330
ixgbe_dcb_config_packet_buffers_82598(hw, dcb_config);
331
ixgbe_dcb_config_rx_arbiter_82598(hw, dcb_config);
332
ixgbe_dcb_config_tx_desc_arbiter_82598(hw, dcb_config);
333
ixgbe_dcb_config_tx_data_arbiter_82598(hw, dcb_config);
334
ixgbe_dcb_config_pfc_82598(hw, dcb_config);
328
ixgbe_dcb_config_packet_buffers_82598(hw, rx_pba);
329
ixgbe_dcb_config_rx_arbiter_82598(hw, refill, max, prio_type);
330
ixgbe_dcb_config_tx_desc_arbiter_82598(hw, refill, max,
332
ixgbe_dcb_config_tx_data_arbiter_82598(hw, refill, max,
334
ixgbe_dcb_config_pfc_82598(hw, pfc_en);
335
335
ixgbe_dcb_config_tc_stats_82598(hw);