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