Home | History | Annotate | Line # | Download | only in ixgbe
      1 /* $NetBSD: ixgbe_dcb_82599.c,v 1.12 2023/07/15 21:41:26 andvar Exp $ */
      2 /******************************************************************************
      3   SPDX-License-Identifier: BSD-3-Clause
      4 
      5   Copyright (c) 2001-2020, Intel Corporation
      6   All rights reserved.
      7 
      8   Redistribution and use in source and binary forms, with or without
      9   modification, are permitted provided that the following conditions are met:
     10 
     11    1. Redistributions of source code must retain the above copyright notice,
     12       this list of conditions and the following disclaimer.
     13 
     14    2. Redistributions in binary form must reproduce the above copyright
     15       notice, this list of conditions and the following disclaimer in the
     16       documentation and/or other materials provided with the distribution.
     17 
     18    3. Neither the name of the Intel Corporation nor the names of its
     19       contributors may be used to endorse or promote products derived from
     20       this software without specific prior written permission.
     21 
     22   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
     23   AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     24   IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     25   ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
     26   LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     27   CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     28   SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     29   INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     30   CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     31   ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     32   POSSIBILITY OF SUCH DAMAGE.
     33 
     34 ******************************************************************************/
     35 /*$FreeBSD: head/sys/dev/ixgbe/ixgbe_dcb_82599.c 331224 2018-03-19 20:55:05Z erj $*/
     36 
     37 #include <sys/cdefs.h>
     38 __KERNEL_RCSID(0, "$NetBSD: ixgbe_dcb_82599.c,v 1.12 2023/07/15 21:41:26 andvar Exp $");
     39 
     40 #include "ixgbe_type.h"
     41 #include "ixgbe_dcb.h"
     42 #include "ixgbe_dcb_82599.h"
     43 
     44 /**
     45  * ixgbe_dcb_get_tc_stats_82599 - Returns status for each traffic class
     46  * @hw: pointer to hardware structure
     47  * @stats: pointer to statistics structure
     48  * @tc_count:  Number of elements in bwg_array.
     49  *
     50  * This function returns the status data for each of the Traffic Classes in use.
     51  */
     52 s32 ixgbe_dcb_get_tc_stats_82599(struct ixgbe_hw *hw,
     53 				 struct ixgbe_hw_stats *stats,
     54 				 u8 tc_count)
     55 {
     56 	int tc;
     57 
     58 	DEBUGFUNC("dcb_get_tc_stats");
     59 
     60 	if (tc_count > IXGBE_DCB_MAX_TRAFFIC_CLASS)
     61 		return IXGBE_ERR_PARAM;
     62 
     63 	/* Statistics pertaining to each traffic class */
     64 	for (tc = 0; tc < tc_count; tc++) {
     65 		/* Transmitted Packets */
     66 		stats->qptc[tc] += IXGBE_READ_REG(hw, IXGBE_QPTC(tc));
     67 		/* Transmitted Bytes (read low first to prevent missed carry) */
     68 		stats->qbtc[tc] += IXGBE_READ_REG(hw, IXGBE_QBTC_L(tc));
     69 		stats->qbtc[tc] +=
     70 			(((u64)(IXGBE_READ_REG(hw, IXGBE_QBTC_H(tc)))) << 32);
     71 		/* Received Packets */
     72 		stats->qprc[tc] += IXGBE_READ_REG(hw, IXGBE_QPRC(tc));
     73 		/* Received Bytes (read low first to prevent missed carry) */
     74 		stats->qbrc[tc] += IXGBE_READ_REG(hw, IXGBE_QBRC_L(tc));
     75 		stats->qbrc[tc] +=
     76 			(((u64)(IXGBE_READ_REG(hw, IXGBE_QBRC_H(tc)))) << 32);
     77 
     78 		/* Received Dropped Packet */
     79 		stats->qprdc[tc] += IXGBE_READ_REG(hw, IXGBE_QPRDC(tc));
     80 	}
     81 
     82 	return IXGBE_SUCCESS;
     83 }
     84 
     85 /**
     86  * ixgbe_dcb_get_pfc_stats_82599 - Return CBFC status data
     87  * @hw: pointer to hardware structure
     88  * @stats: pointer to statistics structure
     89  * @tc_count:  Number of elements in bwg_array.
     90  *
     91  * This function returns the CBFC status data for each of the Traffic Classes.
     92  */
     93 s32 ixgbe_dcb_get_pfc_stats_82599(struct ixgbe_hw *hw,
     94 				  struct ixgbe_hw_stats *stats,
     95 				  u8 tc_count)
     96 {
     97 	int tc;
     98 
     99 	DEBUGFUNC("dcb_get_pfc_stats");
    100 
    101 	if (tc_count > IXGBE_DCB_MAX_TRAFFIC_CLASS)
    102 		return IXGBE_ERR_PARAM;
    103 
    104 	for (tc = 0; tc < tc_count; tc++) {
    105 		/* Priority XOFF Transmitted */
    106 		stats->pxofftxc[tc] += IXGBE_READ_REG(hw, IXGBE_PXOFFTXC(tc));
    107 		/* Priority XOFF Received */
    108 		stats->pxoffrxc[tc] += IXGBE_READ_REG(hw, IXGBE_PXOFFRXCNT(tc));
    109 	}
    110 
    111 	return IXGBE_SUCCESS;
    112 }
    113 
    114 /**
    115  * ixgbe_dcb_config_rx_arbiter_82599 - Config Rx Data arbiter
    116  * @hw: pointer to hardware structure
    117  * @refill: refill credits index by traffic class
    118  * @max: max credits index by traffic class
    119  * @bwg_id: bandwidth grouping indexed by traffic class
    120  * @tsa: transmission selection algorithm indexed by traffic class
    121  * @map: priority to tc assignments indexed by priority
    122  *
    123  * Configure Rx Packet Arbiter and credits for each traffic class.
    124  */
    125 s32 ixgbe_dcb_config_rx_arbiter_82599(struct ixgbe_hw *hw, u16 *refill,
    126 				      u16 *max, u8 *bwg_id, u8 *tsa,
    127 				      u8 *map)
    128 {
    129 	u32 reg = 0;
    130 	u32 credit_refill = 0;
    131 	u32 credit_max = 0;
    132 	u8  i = 0;
    133 
    134 	/*
    135 	 * Disable the arbiter before changing parameters
    136 	 * (always enable recycle mode; WSP)
    137 	 */
    138 	reg = IXGBE_RTRPCS_RRM | IXGBE_RTRPCS_RAC | IXGBE_RTRPCS_ARBDIS;
    139 	IXGBE_WRITE_REG(hw, IXGBE_RTRPCS, reg);
    140 
    141 	/*
    142 	 * map all UPs to TCs. up_to_tc_bitmap for each TC has corresponding
    143 	 * bits sets for the UPs that needs to be mapped to that TC.
    144 	 * e.g if priorities 6 and 7 are to be mapped to a TC then the
    145 	 * up_to_tc_bitmap value for that TC will be 11000000 in binary.
    146 	 */
    147 	reg = 0;
    148 	for (i = 0; i < IXGBE_DCB_MAX_USER_PRIORITY; i++)
    149 		reg |= (map[i] << (i * IXGBE_RTRUP2TC_UP_SHIFT));
    150 
    151 	IXGBE_WRITE_REG(hw, IXGBE_RTRUP2TC, reg);
    152 
    153 	/* Configure traffic class credits and priority */
    154 	for (i = 0; i < IXGBE_DCB_MAX_TRAFFIC_CLASS; i++) {
    155 		credit_refill = refill[i];
    156 		credit_max = max[i];
    157 		reg = credit_refill | (credit_max << IXGBE_RTRPT4C_MCL_SHIFT);
    158 
    159 		reg |= (u32)(bwg_id[i]) << IXGBE_RTRPT4C_BWG_SHIFT;
    160 
    161 		if (tsa[i] == ixgbe_dcb_tsa_strict)
    162 			reg |= IXGBE_RTRPT4C_LSP;
    163 
    164 		IXGBE_WRITE_REG(hw, IXGBE_RTRPT4C(i), reg);
    165 	}
    166 
    167 	/*
    168 	 * Configure Rx packet plane (recycle mode; WSP) and
    169 	 * enable arbiter
    170 	 */
    171 	reg = IXGBE_RTRPCS_RRM | IXGBE_RTRPCS_RAC;
    172 	IXGBE_WRITE_REG(hw, IXGBE_RTRPCS, reg);
    173 
    174 	return IXGBE_SUCCESS;
    175 }
    176 
    177 /**
    178  * ixgbe_dcb_config_tx_desc_arbiter_82599 - Config Tx Desc. arbiter
    179  * @hw: pointer to hardware structure
    180  * @refill: refill credits index by traffic class
    181  * @max: max credits index by traffic class
    182  * @bwg_id: bandwidth grouping indexed by traffic class
    183  * @tsa: transmission selection algorithm indexed by traffic class
    184  *
    185  * Configure Tx Descriptor Arbiter and credits for each traffic class.
    186  */
    187 s32 ixgbe_dcb_config_tx_desc_arbiter_82599(struct ixgbe_hw *hw, u16 *refill,
    188 					   u16 *max, u8 *bwg_id, u8 *tsa)
    189 {
    190 	u32 reg, max_credits;
    191 	u8  i;
    192 
    193 	/* Clear the per-Tx queue credits; we use per-TC instead */
    194 	for (i = 0; i < 128; i++) {
    195 		IXGBE_WRITE_REG(hw, IXGBE_RTTDQSEL, i);
    196 		IXGBE_WRITE_REG(hw, IXGBE_RTTDT1C, 0);
    197 	}
    198 
    199 	/* Configure traffic class credits and priority */
    200 	for (i = 0; i < IXGBE_DCB_MAX_TRAFFIC_CLASS; i++) {
    201 		max_credits = max[i];
    202 		reg = max_credits << IXGBE_RTTDT2C_MCL_SHIFT;
    203 		reg |= (u32)(refill[i]);
    204 		reg |= (u32)(bwg_id[i]) << IXGBE_RTTDT2C_BWG_SHIFT;
    205 
    206 		if (tsa[i] == ixgbe_dcb_tsa_group_strict_cee)
    207 			reg |= IXGBE_RTTDT2C_GSP;
    208 
    209 		if (tsa[i] == ixgbe_dcb_tsa_strict)
    210 			reg |= IXGBE_RTTDT2C_LSP;
    211 
    212 		IXGBE_WRITE_REG(hw, IXGBE_RTTDT2C(i), reg);
    213 	}
    214 
    215 	/*
    216 	 * Configure Tx descriptor plane (recycle mode; WSP) and
    217 	 * enable arbiter
    218 	 */
    219 	reg = IXGBE_RTTDCS_TDPAC | IXGBE_RTTDCS_TDRM;
    220 	IXGBE_WRITE_REG(hw, IXGBE_RTTDCS, reg);
    221 
    222 	return IXGBE_SUCCESS;
    223 }
    224 
    225 /**
    226  * ixgbe_dcb_config_tx_data_arbiter_82599 - Config Tx Data arbiter
    227  * @hw: pointer to hardware structure
    228  * @refill: refill credits index by traffic class
    229  * @max: max credits index by traffic class
    230  * @bwg_id: bandwidth grouping indexed by traffic class
    231  * @tsa: transmission selection algorithm indexed by traffic class
    232  * @map: priority to tc assignments indexed by priority
    233  *
    234  * Configure Tx Packet Arbiter and credits for each traffic class.
    235  */
    236 s32 ixgbe_dcb_config_tx_data_arbiter_82599(struct ixgbe_hw *hw, u16 *refill,
    237 					   u16 *max, u8 *bwg_id, u8 *tsa,
    238 					   u8 *map)
    239 {
    240 	u32 reg;
    241 	u8 i;
    242 
    243 	/*
    244 	 * Disable the arbiter before changing parameters
    245 	 * (always enable recycle mode; SP; arb delay)
    246 	 */
    247 	reg = IXGBE_RTTPCS_TPPAC | IXGBE_RTTPCS_TPRM |
    248 	      (IXGBE_RTTPCS_ARBD_DCB << IXGBE_RTTPCS_ARBD_SHIFT) |
    249 	      IXGBE_RTTPCS_ARBDIS;
    250 	IXGBE_WRITE_REG(hw, IXGBE_RTTPCS, reg);
    251 
    252 	/*
    253 	 * map all UPs to TCs. up_to_tc_bitmap for each TC has corresponding
    254 	 * bits sets for the UPs that needs to be mapped to that TC.
    255 	 * e.g if priorities 6 and 7 are to be mapped to a TC then the
    256 	 * up_to_tc_bitmap value for that TC will be 11000000 in binary.
    257 	 */
    258 	reg = 0;
    259 	for (i = 0; i < IXGBE_DCB_MAX_USER_PRIORITY; i++)
    260 		reg |= (map[i] << (i * IXGBE_RTTUP2TC_UP_SHIFT));
    261 
    262 	IXGBE_WRITE_REG(hw, IXGBE_RTTUP2TC, reg);
    263 
    264 	/* Configure traffic class credits and priority */
    265 	for (i = 0; i < IXGBE_DCB_MAX_TRAFFIC_CLASS; i++) {
    266 		reg = refill[i];
    267 		reg |= (u32)(max[i]) << IXGBE_RTTPT2C_MCL_SHIFT;
    268 		reg |= (u32)(bwg_id[i]) << IXGBE_RTTPT2C_BWG_SHIFT;
    269 
    270 		if (tsa[i] == ixgbe_dcb_tsa_group_strict_cee)
    271 			reg |= IXGBE_RTTPT2C_GSP;
    272 
    273 		if (tsa[i] == ixgbe_dcb_tsa_strict)
    274 			reg |= IXGBE_RTTPT2C_LSP;
    275 
    276 		IXGBE_WRITE_REG(hw, IXGBE_RTTPT2C(i), reg);
    277 	}
    278 
    279 	/*
    280 	 * Configure Tx packet plane (recycle mode; SP; arb delay) and
    281 	 * enable arbiter
    282 	 */
    283 	reg = IXGBE_RTTPCS_TPPAC | IXGBE_RTTPCS_TPRM |
    284 	      (IXGBE_RTTPCS_ARBD_DCB << IXGBE_RTTPCS_ARBD_SHIFT);
    285 	IXGBE_WRITE_REG(hw, IXGBE_RTTPCS, reg);
    286 
    287 	return IXGBE_SUCCESS;
    288 }
    289 
    290 /**
    291  * ixgbe_dcb_config_pfc_82599 - Configure priority flow control
    292  * @hw: pointer to hardware structure
    293  * @pfc_en: enabled pfc bitmask
    294  * @map: priority to tc assignments indexed by priority
    295  *
    296  * Configure Priority Flow Control (PFC) for each traffic class.
    297  */
    298 s32 ixgbe_dcb_config_pfc_82599(struct ixgbe_hw *hw, u8 pfc_en, u8 *map)
    299 {
    300 	u32 i, j, fcrtl, reg;
    301 	u8 max_tc = 0;
    302 
    303 	/* Enable Transmit Priority Flow Control */
    304 	IXGBE_WRITE_REG(hw, IXGBE_FCCFG, IXGBE_FCCFG_TFCE_PRIORITY);
    305 
    306 	/* Enable Receive Priority Flow Control */
    307 	reg = IXGBE_READ_REG(hw, IXGBE_MFLCN);
    308 	reg |= IXGBE_MFLCN_DPF;
    309 
    310 	/*
    311 	 * X540 supports per TC Rx priority flow control.  So
    312 	 * clear all TCs and only enable those that should be
    313 	 * enabled.
    314 	 */
    315 	reg &= ~(IXGBE_MFLCN_RPFCE_MASK | IXGBE_MFLCN_RFCE);
    316 
    317 	if (hw->mac.type >= ixgbe_mac_X540)
    318 		reg |= pfc_en << IXGBE_MFLCN_RPFCE_SHIFT;
    319 
    320 	if (pfc_en)
    321 		reg |= IXGBE_MFLCN_RPFCE;
    322 
    323 	IXGBE_WRITE_REG(hw, IXGBE_MFLCN, reg);
    324 
    325 	for (i = 0; i < IXGBE_DCB_MAX_USER_PRIORITY; i++) {
    326 		if (map[i] > max_tc)
    327 			max_tc = map[i];
    328 	}
    329 
    330 
    331 	/* Configure PFC Tx thresholds per TC */
    332 	for (i = 0; i <= max_tc; i++) {
    333 		int enabled = 0;
    334 
    335 		for (j = 0; j < IXGBE_DCB_MAX_USER_PRIORITY; j++) {
    336 			if ((map[j] == i) && (pfc_en & (1 << j))) {
    337 				enabled = 1;
    338 				break;
    339 			}
    340 		}
    341 
    342 		if (enabled) {
    343 			reg = (hw->fc.high_water[i] << 10) | IXGBE_FCRTH_FCEN;
    344 			fcrtl = (hw->fc.low_water[i] << 10) | IXGBE_FCRTL_XONE;
    345 			IXGBE_WRITE_REG(hw, IXGBE_FCRTL_82599(i), fcrtl);
    346 		} else {
    347 			/*
    348 			 * In order to prevent Tx hangs when the internal Tx
    349 			 * switch is enabled we must set the high water mark
    350 			 * to the Rx packet buffer size - 24KB.  This allows
    351 			 * the Tx switch to function even under heavy Rx
    352 			 * workloads.
    353 			 */
    354 			reg = IXGBE_READ_REG(hw, IXGBE_RXPBSIZE(i)) - 24576;
    355 			IXGBE_WRITE_REG(hw, IXGBE_FCRTL_82599(i), 0);
    356 		}
    357 
    358 		IXGBE_WRITE_REG(hw, IXGBE_FCRTH_82599(i), reg);
    359 	}
    360 
    361 	for (; i < IXGBE_DCB_MAX_TRAFFIC_CLASS; i++) {
    362 		IXGBE_WRITE_REG(hw, IXGBE_FCRTL_82599(i), 0);
    363 		IXGBE_WRITE_REG(hw, IXGBE_FCRTH_82599(i), 0);
    364 	}
    365 
    366 	/* Configure pause time (2 TCs per register) */
    367 	reg = hw->fc.pause_time | (hw->fc.pause_time << 16);
    368 	for (i = 0; i < (IXGBE_DCB_MAX_TRAFFIC_CLASS / 2); i++)
    369 		IXGBE_WRITE_REG(hw, IXGBE_FCTTV(i), reg);
    370 
    371 	/* Configure flow control refresh threshold value */
    372 	IXGBE_WRITE_REG(hw, IXGBE_FCRTV, hw->fc.pause_time / 2);
    373 
    374 	return IXGBE_SUCCESS;
    375 }
    376 
    377 /**
    378  * ixgbe_dcb_config_tc_stats_82599 - Config traffic class statistics
    379  * @hw: pointer to hardware structure
    380  * @dcb_config: pointer to ixgbe_dcb_config structure
    381  *
    382  * Configure queue statistics registers, all queues belonging to same traffic
    383  * class uses a single set of queue statistics counters.
    384  */
    385 s32 ixgbe_dcb_config_tc_stats_82599(struct ixgbe_hw *hw,
    386 				    struct ixgbe_dcb_config *dcb_config)
    387 {
    388 	u32 reg = 0;
    389 	u8  i   = 0;
    390 	u8 tc_count = 8;
    391 	bool vt_mode = FALSE;
    392 
    393 	if (dcb_config != NULL) {
    394 		tc_count = dcb_config->num_tcs.pg_tcs;
    395 		vt_mode = dcb_config->vt_mode;
    396 	}
    397 
    398 	if (!((tc_count == 8 && vt_mode == FALSE) || tc_count == 4))
    399 		return IXGBE_ERR_PARAM;
    400 
    401 	if (tc_count == 8 && vt_mode == FALSE) {
    402 		/*
    403 		 * Receive Queues stats setting
    404 		 * 32 RQSMR registers, each configuring 4 queues.
    405 		 *
    406 		 * Set all 16 queues of each TC to the same stat
    407 		 * with TC 'n' going to stat 'n'.
    408 		 */
    409 		for (i = 0; i < 32; i++) {
    410 			reg = 0x01010101 * (i / 4);
    411 			IXGBE_WRITE_REG(hw, IXGBE_RQSMR(i), reg);
    412 		}
    413 		/*
    414 		 * Transmit Queues stats setting
    415 		 * 32 TQSM registers, each controlling 4 queues.
    416 		 *
    417 		 * Set all queues of each TC to the same stat
    418 		 * with TC 'n' going to stat 'n'.
    419 		 * Tx queues are allocated non-uniformly to TCs:
    420 		 * 32, 32, 16, 16, 8, 8, 8, 8.
    421 		 */
    422 		for (i = 0; i < 32; i++) {
    423 			if (i < 8)
    424 				reg = 0x00000000;
    425 			else if (i < 16)
    426 				reg = 0x01010101;
    427 			else if (i < 20)
    428 				reg = 0x02020202;
    429 			else if (i < 24)
    430 				reg = 0x03030303;
    431 			else if (i < 26)
    432 				reg = 0x04040404;
    433 			else if (i < 28)
    434 				reg = 0x05050505;
    435 			else if (i < 30)
    436 				reg = 0x06060606;
    437 			else
    438 				reg = 0x07070707;
    439 			IXGBE_WRITE_REG(hw, IXGBE_TQSM(i), reg);
    440 		}
    441 	} else if (tc_count == 4 && vt_mode == FALSE) {
    442 		/*
    443 		 * Receive Queues stats setting
    444 		 * 32 RQSMR registers, each configuring 4 queues.
    445 		 *
    446 		 * Set all 16 queues of each TC to the same stat
    447 		 * with TC 'n' going to stat 'n'.
    448 		 */
    449 		for (i = 0; i < 32; i++) {
    450 			if (i % 8 > 3)
    451 				/* In 4 TC mode, odd 16-queue ranges are
    452 				 *  not used.
    453 				*/
    454 				continue;
    455 			reg = 0x01010101 * (i / 8);
    456 			IXGBE_WRITE_REG(hw, IXGBE_RQSMR(i), reg);
    457 		}
    458 		/*
    459 		 * Transmit Queues stats setting
    460 		 * 32 TQSM registers, each controlling 4 queues.
    461 		 *
    462 		 * Set all queues of each TC to the same stat
    463 		 * with TC 'n' going to stat 'n'.
    464 		 * Tx queues are allocated non-uniformly to TCs:
    465 		 * 64, 32, 16, 16.
    466 		 */
    467 		for (i = 0; i < 32; i++) {
    468 			if (i < 16)
    469 				reg = 0x00000000;
    470 			else if (i < 24)
    471 				reg = 0x01010101;
    472 			else if (i < 28)
    473 				reg = 0x02020202;
    474 			else
    475 				reg = 0x03030303;
    476 			IXGBE_WRITE_REG(hw, IXGBE_TQSM(i), reg);
    477 		}
    478 	} else if (tc_count == 4 && vt_mode == TRUE) {
    479 		/*
    480 		 * Receive Queues stats setting
    481 		 * 32 RQSMR registers, each configuring 4 queues.
    482 		 *
    483 		 * Queue Indexing in 32 VF with DCB mode maps 4 TC's to each
    484 		 * pool. Set all 32 queues of each TC across pools to the same
    485 		 * stat with TC 'n' going to stat 'n'.
    486 		 */
    487 		for (i = 0; i < 32; i++)
    488 			IXGBE_WRITE_REG(hw, IXGBE_RQSMR(i), 0x03020100);
    489 		/*
    490 		 * Transmit Queues stats setting
    491 		 * 32 TQSM registers, each controlling 4 queues.
    492 		 *
    493 		 * Queue Indexing in 32 VF with DCB mode maps 4 TC's to each
    494 		 * pool. Set all 32 queues of each TC across pools to the same
    495 		 * stat with TC 'n' going to stat 'n'.
    496 		 */
    497 		for (i = 0; i < 32; i++)
    498 			IXGBE_WRITE_REG(hw, IXGBE_TQSM(i), 0x03020100);
    499 	}
    500 
    501 	return IXGBE_SUCCESS;
    502 }
    503 
    504 /**
    505  * ixgbe_dcb_config_82599 - Configure general DCB parameters
    506  * @hw: pointer to hardware structure
    507  * @dcb_config: pointer to ixgbe_dcb_config structure
    508  *
    509  * Configure general DCB parameters.
    510  */
    511 s32 ixgbe_dcb_config_82599(struct ixgbe_hw *hw,
    512 			   struct ixgbe_dcb_config *dcb_config)
    513 {
    514 	u32 reg;
    515 	u32 q;
    516 
    517 	/* Disable the Tx desc arbiter so that MTQC can be changed */
    518 	reg = IXGBE_READ_REG(hw, IXGBE_RTTDCS);
    519 	reg |= IXGBE_RTTDCS_ARBDIS;
    520 	IXGBE_WRITE_REG(hw, IXGBE_RTTDCS, reg);
    521 
    522 	reg = IXGBE_READ_REG(hw, IXGBE_MRQC);
    523 	if (dcb_config->num_tcs.pg_tcs == 8) {
    524 		/* Enable DCB for Rx with 8 TCs */
    525 		switch (reg & IXGBE_MRQC_MRQE_MASK) {
    526 		case 0:
    527 		case IXGBE_MRQC_RT4TCEN:
    528 			/* RSS disabled cases */
    529 			reg = (reg & ~IXGBE_MRQC_MRQE_MASK) |
    530 			      IXGBE_MRQC_RT8TCEN;
    531 			break;
    532 		case IXGBE_MRQC_RSSEN:
    533 		case IXGBE_MRQC_RTRSS4TCEN:
    534 			/* RSS enabled cases */
    535 			reg = (reg & ~IXGBE_MRQC_MRQE_MASK) |
    536 			      IXGBE_MRQC_RTRSS8TCEN;
    537 			break;
    538 		default:
    539 			/*
    540 			 * Unsupported value, assume stale data,
    541 			 * overwrite no RSS
    542 			 */
    543 			ASSERT(0);
    544 			reg = (reg & ~IXGBE_MRQC_MRQE_MASK) |
    545 			      IXGBE_MRQC_RT8TCEN;
    546 		}
    547 	}
    548 	if (dcb_config->num_tcs.pg_tcs == 4) {
    549 		/* We support both VT-on and VT-off with 4 TCs. */
    550 		if (dcb_config->vt_mode)
    551 			reg = (reg & ~IXGBE_MRQC_MRQE_MASK) |
    552 			      IXGBE_MRQC_VMDQRT4TCEN;
    553 		else
    554 			reg = (reg & ~IXGBE_MRQC_MRQE_MASK) |
    555 			      IXGBE_MRQC_RTRSS4TCEN;
    556 	}
    557 	IXGBE_WRITE_REG(hw, IXGBE_MRQC, reg);
    558 
    559 	/* Enable DCB for Tx with 8 TCs */
    560 	if (dcb_config->num_tcs.pg_tcs == 8)
    561 		reg = IXGBE_MTQC_RT_ENA | IXGBE_MTQC_8TC_8TQ;
    562 	else {
    563 		/* We support both VT-on and VT-off with 4 TCs. */
    564 		reg = IXGBE_MTQC_RT_ENA | IXGBE_MTQC_4TC_4TQ;
    565 		if (dcb_config->vt_mode)
    566 			reg |= IXGBE_MTQC_VT_ENA;
    567 	}
    568 	IXGBE_WRITE_REG(hw, IXGBE_MTQC, reg);
    569 
    570 	/* Disable drop for all queues */
    571 	for (q = 0; q < 128; q++)
    572 		IXGBE_WRITE_REG(hw, IXGBE_QDE,
    573 				(IXGBE_QDE_WRITE | (q << IXGBE_QDE_IDX_SHIFT)));
    574 
    575 	/* Enable the Tx desc arbiter */
    576 	reg = IXGBE_READ_REG(hw, IXGBE_RTTDCS);
    577 	reg &= ~IXGBE_RTTDCS_ARBDIS;
    578 	IXGBE_WRITE_REG(hw, IXGBE_RTTDCS, reg);
    579 
    580 	/* Enable Security TX Buffer IFG for DCB */
    581 	reg = IXGBE_READ_REG(hw, IXGBE_SECTXMINIFG);
    582 	reg |= IXGBE_SECTX_DCB;
    583 	IXGBE_WRITE_REG(hw, IXGBE_SECTXMINIFG, reg);
    584 
    585 	return IXGBE_SUCCESS;
    586 }
    587 
    588 /**
    589  * ixgbe_dcb_hw_config_82599 - Configure and enable DCB
    590  * @hw: pointer to hardware structure
    591  * @link_speed: unused
    592  * @refill: refill credits index by traffic class
    593  * @max: max credits index by traffic class
    594  * @bwg_id: bandwidth grouping indexed by traffic class
    595  * @tsa: transmission selection algorithm indexed by traffic class
    596  * @map: priority to tc assignments indexed by priority
    597  *
    598  * Configure dcb settings and enable dcb mode.
    599  */
    600 s32 ixgbe_dcb_hw_config_82599(struct ixgbe_hw *hw, int link_speed,
    601 			      u16 *refill, u16 *max, u8 *bwg_id, u8 *tsa,
    602 			      u8 *map)
    603 {
    604 	UNREFERENCED_1PARAMETER(link_speed);
    605 
    606 	ixgbe_dcb_config_rx_arbiter_82599(hw, refill, max, bwg_id, tsa,
    607 					  map);
    608 	ixgbe_dcb_config_tx_desc_arbiter_82599(hw, refill, max, bwg_id,
    609 					       tsa);
    610 	ixgbe_dcb_config_tx_data_arbiter_82599(hw, refill, max, bwg_id,
    611 					       tsa, map);
    612 
    613 	return IXGBE_SUCCESS;
    614 }
    615 
    616