Home | History | Annotate | Line # | Download | only in ixgbe
ixgbe_dcb_82598.c revision 1.1.2.3
      1  1.1.2.2  skrll /******************************************************************************
      2  1.1.2.2  skrll 
      3  1.1.2.3  skrll   Copyright (c) 2001-2015, Intel Corporation
      4  1.1.2.2  skrll   All rights reserved.
      5  1.1.2.2  skrll 
      6  1.1.2.2  skrll   Redistribution and use in source and binary forms, with or without
      7  1.1.2.2  skrll   modification, are permitted provided that the following conditions are met:
      8  1.1.2.2  skrll 
      9  1.1.2.2  skrll    1. Redistributions of source code must retain the above copyright notice,
     10  1.1.2.2  skrll       this list of conditions and the following disclaimer.
     11  1.1.2.2  skrll 
     12  1.1.2.2  skrll    2. Redistributions in binary form must reproduce the above copyright
     13  1.1.2.2  skrll       notice, this list of conditions and the following disclaimer in the
     14  1.1.2.2  skrll       documentation and/or other materials provided with the distribution.
     15  1.1.2.2  skrll 
     16  1.1.2.2  skrll    3. Neither the name of the Intel Corporation nor the names of its
     17  1.1.2.2  skrll       contributors may be used to endorse or promote products derived from
     18  1.1.2.2  skrll       this software without specific prior written permission.
     19  1.1.2.2  skrll 
     20  1.1.2.2  skrll   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
     21  1.1.2.2  skrll   AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     22  1.1.2.2  skrll   IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     23  1.1.2.2  skrll   ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
     24  1.1.2.2  skrll   LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     25  1.1.2.2  skrll   CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     26  1.1.2.2  skrll   SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     27  1.1.2.2  skrll   INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     28  1.1.2.2  skrll   CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     29  1.1.2.2  skrll   ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     30  1.1.2.2  skrll   POSSIBILITY OF SUCH DAMAGE.
     31  1.1.2.2  skrll 
     32  1.1.2.2  skrll ******************************************************************************/
     33  1.1.2.3  skrll /*$FreeBSD: head/sys/dev/ixgbe/ixgbe_dcb_82598.c 282289 2015-04-30 22:53:27Z erj $*/
     34  1.1.2.2  skrll 
     35  1.1.2.2  skrll 
     36  1.1.2.2  skrll #include "ixgbe_type.h"
     37  1.1.2.2  skrll #include "ixgbe_dcb.h"
     38  1.1.2.2  skrll #include "ixgbe_dcb_82598.h"
     39  1.1.2.2  skrll 
     40  1.1.2.2  skrll /**
     41  1.1.2.2  skrll  * ixgbe_dcb_get_tc_stats_82598 - Return status data for each traffic class
     42  1.1.2.2  skrll  * @hw: pointer to hardware structure
     43  1.1.2.2  skrll  * @stats: pointer to statistics structure
     44  1.1.2.2  skrll  * @tc_count:  Number of elements in bwg_array.
     45  1.1.2.2  skrll  *
     46  1.1.2.2  skrll  * This function returns the status data for each of the Traffic Classes in use.
     47  1.1.2.2  skrll  */
     48  1.1.2.2  skrll s32 ixgbe_dcb_get_tc_stats_82598(struct ixgbe_hw *hw,
     49  1.1.2.2  skrll 				 struct ixgbe_hw_stats *stats,
     50  1.1.2.2  skrll 				 u8 tc_count)
     51  1.1.2.2  skrll {
     52  1.1.2.2  skrll 	int tc;
     53  1.1.2.2  skrll 
     54  1.1.2.2  skrll 	DEBUGFUNC("dcb_get_tc_stats");
     55  1.1.2.2  skrll 
     56  1.1.2.2  skrll 	if (tc_count > IXGBE_DCB_MAX_TRAFFIC_CLASS)
     57  1.1.2.2  skrll 		return IXGBE_ERR_PARAM;
     58  1.1.2.2  skrll 
     59  1.1.2.2  skrll 	/* Statistics pertaining to each traffic class */
     60  1.1.2.2  skrll 	for (tc = 0; tc < tc_count; tc++) {
     61  1.1.2.2  skrll 		/* Transmitted Packets */
     62  1.1.2.2  skrll 		stats->qptc[tc] += IXGBE_READ_REG(hw, IXGBE_QPTC(tc));
     63  1.1.2.2  skrll 		/* Transmitted Bytes */
     64  1.1.2.2  skrll 		stats->qbtc[tc] += IXGBE_READ_REG(hw, IXGBE_QBTC(tc));
     65  1.1.2.2  skrll 		/* Received Packets */
     66  1.1.2.2  skrll 		stats->qprc[tc] += IXGBE_READ_REG(hw, IXGBE_QPRC(tc));
     67  1.1.2.2  skrll 		/* Received Bytes */
     68  1.1.2.2  skrll 		stats->qbrc[tc] += IXGBE_READ_REG(hw, IXGBE_QBRC(tc));
     69  1.1.2.2  skrll 
     70  1.1.2.2  skrll #if 0
     71  1.1.2.2  skrll 		/* Can we get rid of these??  Consequently, getting rid
     72  1.1.2.2  skrll 		 * of the tc_stats structure.
     73  1.1.2.2  skrll 		 */
     74  1.1.2.2  skrll 		tc_stats_array[up]->in_overflow_discards = 0;
     75  1.1.2.2  skrll 		tc_stats_array[up]->out_overflow_discards = 0;
     76  1.1.2.2  skrll #endif
     77  1.1.2.2  skrll 	}
     78  1.1.2.2  skrll 
     79  1.1.2.2  skrll 	return IXGBE_SUCCESS;
     80  1.1.2.2  skrll }
     81  1.1.2.2  skrll 
     82  1.1.2.2  skrll /**
     83  1.1.2.2  skrll  * ixgbe_dcb_get_pfc_stats_82598 - Returns CBFC status data
     84  1.1.2.2  skrll  * @hw: pointer to hardware structure
     85  1.1.2.2  skrll  * @stats: pointer to statistics structure
     86  1.1.2.2  skrll  * @tc_count:  Number of elements in bwg_array.
     87  1.1.2.2  skrll  *
     88  1.1.2.2  skrll  * This function returns the CBFC status data for each of the Traffic Classes.
     89  1.1.2.2  skrll  */
     90  1.1.2.2  skrll s32 ixgbe_dcb_get_pfc_stats_82598(struct ixgbe_hw *hw,
     91  1.1.2.2  skrll 				  struct ixgbe_hw_stats *stats,
     92  1.1.2.2  skrll 				  u8 tc_count)
     93  1.1.2.2  skrll {
     94  1.1.2.2  skrll 	int tc;
     95  1.1.2.2  skrll 
     96  1.1.2.2  skrll 	DEBUGFUNC("dcb_get_pfc_stats");
     97  1.1.2.2  skrll 
     98  1.1.2.2  skrll 	if (tc_count > IXGBE_DCB_MAX_TRAFFIC_CLASS)
     99  1.1.2.2  skrll 		return IXGBE_ERR_PARAM;
    100  1.1.2.2  skrll 
    101  1.1.2.2  skrll 	for (tc = 0; tc < tc_count; tc++) {
    102  1.1.2.2  skrll 		/* Priority XOFF Transmitted */
    103  1.1.2.2  skrll 		stats->pxofftxc[tc] += IXGBE_READ_REG(hw, IXGBE_PXOFFTXC(tc));
    104  1.1.2.2  skrll 		/* Priority XOFF Received */
    105  1.1.2.2  skrll 		stats->pxoffrxc[tc] += IXGBE_READ_REG(hw, IXGBE_PXOFFRXC(tc));
    106  1.1.2.2  skrll 	}
    107  1.1.2.2  skrll 
    108  1.1.2.2  skrll 	return IXGBE_SUCCESS;
    109  1.1.2.2  skrll }
    110  1.1.2.2  skrll 
    111  1.1.2.2  skrll /**
    112  1.1.2.2  skrll  * ixgbe_dcb_config_rx_arbiter_82598 - Config Rx data arbiter
    113  1.1.2.2  skrll  * @hw: pointer to hardware structure
    114  1.1.2.2  skrll  * @dcb_config: pointer to ixgbe_dcb_config structure
    115  1.1.2.2  skrll  *
    116  1.1.2.2  skrll  * Configure Rx Data Arbiter and credits for each traffic class.
    117  1.1.2.2  skrll  */
    118  1.1.2.2  skrll s32 ixgbe_dcb_config_rx_arbiter_82598(struct ixgbe_hw *hw, u16 *refill,
    119  1.1.2.2  skrll 				      u16 *max, u8 *tsa)
    120  1.1.2.2  skrll {
    121  1.1.2.2  skrll 	u32 reg = 0;
    122  1.1.2.2  skrll 	u32 credit_refill = 0;
    123  1.1.2.2  skrll 	u32 credit_max = 0;
    124  1.1.2.2  skrll 	u8 i = 0;
    125  1.1.2.2  skrll 
    126  1.1.2.2  skrll 	reg = IXGBE_READ_REG(hw, IXGBE_RUPPBMR) | IXGBE_RUPPBMR_MQA;
    127  1.1.2.2  skrll 	IXGBE_WRITE_REG(hw, IXGBE_RUPPBMR, reg);
    128  1.1.2.2  skrll 
    129  1.1.2.2  skrll 	reg = IXGBE_READ_REG(hw, IXGBE_RMCS);
    130  1.1.2.2  skrll 	/* Enable Arbiter */
    131  1.1.2.2  skrll 	reg &= ~IXGBE_RMCS_ARBDIS;
    132  1.1.2.2  skrll 	/* Enable Receive Recycle within the BWG */
    133  1.1.2.2  skrll 	reg |= IXGBE_RMCS_RRM;
    134  1.1.2.2  skrll 	/* Enable Deficit Fixed Priority arbitration*/
    135  1.1.2.2  skrll 	reg |= IXGBE_RMCS_DFP;
    136  1.1.2.2  skrll 
    137  1.1.2.2  skrll 	IXGBE_WRITE_REG(hw, IXGBE_RMCS, reg);
    138  1.1.2.2  skrll 
    139  1.1.2.2  skrll 	/* Configure traffic class credits and priority */
    140  1.1.2.2  skrll 	for (i = 0; i < IXGBE_DCB_MAX_TRAFFIC_CLASS; i++) {
    141  1.1.2.2  skrll 		credit_refill = refill[i];
    142  1.1.2.2  skrll 		credit_max = max[i];
    143  1.1.2.2  skrll 
    144  1.1.2.2  skrll 		reg = credit_refill | (credit_max << IXGBE_RT2CR_MCL_SHIFT);
    145  1.1.2.2  skrll 
    146  1.1.2.2  skrll 		if (tsa[i] == ixgbe_dcb_tsa_strict)
    147  1.1.2.2  skrll 			reg |= IXGBE_RT2CR_LSP;
    148  1.1.2.2  skrll 
    149  1.1.2.2  skrll 		IXGBE_WRITE_REG(hw, IXGBE_RT2CR(i), reg);
    150  1.1.2.2  skrll 	}
    151  1.1.2.2  skrll 
    152  1.1.2.2  skrll 	reg = IXGBE_READ_REG(hw, IXGBE_RDRXCTL);
    153  1.1.2.2  skrll 	reg |= IXGBE_RDRXCTL_RDMTS_1_2;
    154  1.1.2.2  skrll 	reg |= IXGBE_RDRXCTL_MPBEN;
    155  1.1.2.2  skrll 	reg |= IXGBE_RDRXCTL_MCEN;
    156  1.1.2.2  skrll 	IXGBE_WRITE_REG(hw, IXGBE_RDRXCTL, reg);
    157  1.1.2.2  skrll 
    158  1.1.2.2  skrll 	reg = IXGBE_READ_REG(hw, IXGBE_RXCTRL);
    159  1.1.2.2  skrll 	/* Make sure there is enough descriptors before arbitration */
    160  1.1.2.2  skrll 	reg &= ~IXGBE_RXCTRL_DMBYPS;
    161  1.1.2.2  skrll 	IXGBE_WRITE_REG(hw, IXGBE_RXCTRL, reg);
    162  1.1.2.2  skrll 
    163  1.1.2.2  skrll 	return IXGBE_SUCCESS;
    164  1.1.2.2  skrll }
    165  1.1.2.2  skrll 
    166  1.1.2.2  skrll /**
    167  1.1.2.2  skrll  * ixgbe_dcb_config_tx_desc_arbiter_82598 - Config Tx Desc. arbiter
    168  1.1.2.2  skrll  * @hw: pointer to hardware structure
    169  1.1.2.2  skrll  * @dcb_config: pointer to ixgbe_dcb_config structure
    170  1.1.2.2  skrll  *
    171  1.1.2.2  skrll  * Configure Tx Descriptor Arbiter and credits for each traffic class.
    172  1.1.2.2  skrll  */
    173  1.1.2.2  skrll s32 ixgbe_dcb_config_tx_desc_arbiter_82598(struct ixgbe_hw *hw,
    174  1.1.2.2  skrll 					   u16 *refill, u16 *max, u8 *bwg_id,
    175  1.1.2.2  skrll 					   u8 *tsa)
    176  1.1.2.2  skrll {
    177  1.1.2.2  skrll 	u32 reg, max_credits;
    178  1.1.2.2  skrll 	u8 i;
    179  1.1.2.2  skrll 
    180  1.1.2.2  skrll 	reg = IXGBE_READ_REG(hw, IXGBE_DPMCS);
    181  1.1.2.2  skrll 
    182  1.1.2.2  skrll 	/* Enable arbiter */
    183  1.1.2.2  skrll 	reg &= ~IXGBE_DPMCS_ARBDIS;
    184  1.1.2.2  skrll 	reg |= IXGBE_DPMCS_TSOEF;
    185  1.1.2.2  skrll 
    186  1.1.2.2  skrll 	/* Configure Max TSO packet size 34KB including payload and headers */
    187  1.1.2.2  skrll 	reg |= (0x4 << IXGBE_DPMCS_MTSOS_SHIFT);
    188  1.1.2.2  skrll 
    189  1.1.2.2  skrll 	IXGBE_WRITE_REG(hw, IXGBE_DPMCS, reg);
    190  1.1.2.2  skrll 
    191  1.1.2.2  skrll 	/* Configure traffic class credits and priority */
    192  1.1.2.2  skrll 	for (i = 0; i < IXGBE_DCB_MAX_TRAFFIC_CLASS; i++) {
    193  1.1.2.2  skrll 		max_credits = max[i];
    194  1.1.2.2  skrll 		reg = max_credits << IXGBE_TDTQ2TCCR_MCL_SHIFT;
    195  1.1.2.2  skrll 		reg |= refill[i];
    196  1.1.2.2  skrll 		reg |= (u32)(bwg_id[i]) << IXGBE_TDTQ2TCCR_BWG_SHIFT;
    197  1.1.2.2  skrll 
    198  1.1.2.2  skrll 		if (tsa[i] == ixgbe_dcb_tsa_group_strict_cee)
    199  1.1.2.2  skrll 			reg |= IXGBE_TDTQ2TCCR_GSP;
    200  1.1.2.2  skrll 
    201  1.1.2.2  skrll 		if (tsa[i] == ixgbe_dcb_tsa_strict)
    202  1.1.2.2  skrll 			reg |= IXGBE_TDTQ2TCCR_LSP;
    203  1.1.2.2  skrll 
    204  1.1.2.2  skrll 		IXGBE_WRITE_REG(hw, IXGBE_TDTQ2TCCR(i), reg);
    205  1.1.2.2  skrll 	}
    206  1.1.2.2  skrll 
    207  1.1.2.2  skrll 	return IXGBE_SUCCESS;
    208  1.1.2.2  skrll }
    209  1.1.2.2  skrll 
    210  1.1.2.2  skrll /**
    211  1.1.2.2  skrll  * ixgbe_dcb_config_tx_data_arbiter_82598 - Config Tx data arbiter
    212  1.1.2.2  skrll  * @hw: pointer to hardware structure
    213  1.1.2.2  skrll  * @dcb_config: pointer to ixgbe_dcb_config structure
    214  1.1.2.2  skrll  *
    215  1.1.2.2  skrll  * Configure Tx Data Arbiter and credits for each traffic class.
    216  1.1.2.2  skrll  */
    217  1.1.2.2  skrll s32 ixgbe_dcb_config_tx_data_arbiter_82598(struct ixgbe_hw *hw,
    218  1.1.2.2  skrll 					   u16 *refill, u16 *max, u8 *bwg_id,
    219  1.1.2.2  skrll 					   u8 *tsa)
    220  1.1.2.2  skrll {
    221  1.1.2.2  skrll 	u32 reg;
    222  1.1.2.2  skrll 	u8 i;
    223  1.1.2.2  skrll 
    224  1.1.2.2  skrll 	reg = IXGBE_READ_REG(hw, IXGBE_PDPMCS);
    225  1.1.2.2  skrll 	/* Enable Data Plane Arbiter */
    226  1.1.2.2  skrll 	reg &= ~IXGBE_PDPMCS_ARBDIS;
    227  1.1.2.2  skrll 	/* Enable DFP and Transmit Recycle Mode */
    228  1.1.2.2  skrll 	reg |= (IXGBE_PDPMCS_TPPAC | IXGBE_PDPMCS_TRM);
    229  1.1.2.2  skrll 
    230  1.1.2.2  skrll 	IXGBE_WRITE_REG(hw, IXGBE_PDPMCS, reg);
    231  1.1.2.2  skrll 
    232  1.1.2.2  skrll 	/* Configure traffic class credits and priority */
    233  1.1.2.2  skrll 	for (i = 0; i < IXGBE_DCB_MAX_TRAFFIC_CLASS; i++) {
    234  1.1.2.2  skrll 		reg = refill[i];
    235  1.1.2.2  skrll 		reg |= (u32)(max[i]) << IXGBE_TDPT2TCCR_MCL_SHIFT;
    236  1.1.2.2  skrll 		reg |= (u32)(bwg_id[i]) << IXGBE_TDPT2TCCR_BWG_SHIFT;
    237  1.1.2.2  skrll 
    238  1.1.2.2  skrll 		if (tsa[i] == ixgbe_dcb_tsa_group_strict_cee)
    239  1.1.2.2  skrll 			reg |= IXGBE_TDPT2TCCR_GSP;
    240  1.1.2.2  skrll 
    241  1.1.2.2  skrll 		if (tsa[i] == ixgbe_dcb_tsa_strict)
    242  1.1.2.2  skrll 			reg |= IXGBE_TDPT2TCCR_LSP;
    243  1.1.2.2  skrll 
    244  1.1.2.2  skrll 		IXGBE_WRITE_REG(hw, IXGBE_TDPT2TCCR(i), reg);
    245  1.1.2.2  skrll 	}
    246  1.1.2.2  skrll 
    247  1.1.2.2  skrll 	/* Enable Tx packet buffer division */
    248  1.1.2.2  skrll 	reg = IXGBE_READ_REG(hw, IXGBE_DTXCTL);
    249  1.1.2.2  skrll 	reg |= IXGBE_DTXCTL_ENDBUBD;
    250  1.1.2.2  skrll 	IXGBE_WRITE_REG(hw, IXGBE_DTXCTL, reg);
    251  1.1.2.2  skrll 
    252  1.1.2.2  skrll 	return IXGBE_SUCCESS;
    253  1.1.2.2  skrll }
    254  1.1.2.2  skrll 
    255  1.1.2.2  skrll /**
    256  1.1.2.2  skrll  * ixgbe_dcb_config_pfc_82598 - Config priority flow control
    257  1.1.2.2  skrll  * @hw: pointer to hardware structure
    258  1.1.2.2  skrll  * @dcb_config: pointer to ixgbe_dcb_config structure
    259  1.1.2.2  skrll  *
    260  1.1.2.2  skrll  * Configure Priority Flow Control for each traffic class.
    261  1.1.2.2  skrll  */
    262  1.1.2.2  skrll s32 ixgbe_dcb_config_pfc_82598(struct ixgbe_hw *hw, u8 pfc_en)
    263  1.1.2.2  skrll {
    264  1.1.2.2  skrll 	u32 fcrtl, reg;
    265  1.1.2.2  skrll 	u8 i;
    266  1.1.2.2  skrll 
    267  1.1.2.2  skrll 	/* Enable Transmit Priority Flow Control */
    268  1.1.2.2  skrll 	reg = IXGBE_READ_REG(hw, IXGBE_RMCS);
    269  1.1.2.2  skrll 	reg &= ~IXGBE_RMCS_TFCE_802_3X;
    270  1.1.2.2  skrll 	reg |= IXGBE_RMCS_TFCE_PRIORITY;
    271  1.1.2.2  skrll 	IXGBE_WRITE_REG(hw, IXGBE_RMCS, reg);
    272  1.1.2.2  skrll 
    273  1.1.2.2  skrll 	/* Enable Receive Priority Flow Control */
    274  1.1.2.2  skrll 	reg = IXGBE_READ_REG(hw, IXGBE_FCTRL);
    275  1.1.2.2  skrll 	reg &= ~(IXGBE_FCTRL_RPFCE | IXGBE_FCTRL_RFCE);
    276  1.1.2.2  skrll 
    277  1.1.2.2  skrll 	if (pfc_en)
    278  1.1.2.2  skrll 		reg |= IXGBE_FCTRL_RPFCE;
    279  1.1.2.2  skrll 
    280  1.1.2.2  skrll 	IXGBE_WRITE_REG(hw, IXGBE_FCTRL, reg);
    281  1.1.2.2  skrll 
    282  1.1.2.2  skrll 	/* Configure PFC Tx thresholds per TC */
    283  1.1.2.2  skrll 	for (i = 0; i < IXGBE_DCB_MAX_TRAFFIC_CLASS; i++) {
    284  1.1.2.2  skrll 		if (!(pfc_en & (1 << i))) {
    285  1.1.2.2  skrll 			IXGBE_WRITE_REG(hw, IXGBE_FCRTL(i), 0);
    286  1.1.2.2  skrll 			IXGBE_WRITE_REG(hw, IXGBE_FCRTH(i), 0);
    287  1.1.2.2  skrll 			continue;
    288  1.1.2.2  skrll 		}
    289  1.1.2.2  skrll 
    290  1.1.2.2  skrll 		fcrtl = (hw->fc.low_water[i] << 10) | IXGBE_FCRTL_XONE;
    291  1.1.2.2  skrll 		reg = (hw->fc.high_water[i] << 10) | IXGBE_FCRTH_FCEN;
    292  1.1.2.2  skrll 		IXGBE_WRITE_REG(hw, IXGBE_FCRTL(i), fcrtl);
    293  1.1.2.2  skrll 		IXGBE_WRITE_REG(hw, IXGBE_FCRTH(i), reg);
    294  1.1.2.2  skrll 	}
    295  1.1.2.2  skrll 
    296  1.1.2.2  skrll 	/* Configure pause time */
    297  1.1.2.2  skrll 	reg = hw->fc.pause_time | (hw->fc.pause_time << 16);
    298  1.1.2.2  skrll 	for (i = 0; i < (IXGBE_DCB_MAX_TRAFFIC_CLASS / 2); i++)
    299  1.1.2.2  skrll 		IXGBE_WRITE_REG(hw, IXGBE_FCTTV(i), reg);
    300  1.1.2.2  skrll 
    301  1.1.2.2  skrll 	/* Configure flow control refresh threshold value */
    302  1.1.2.2  skrll 	IXGBE_WRITE_REG(hw, IXGBE_FCRTV, hw->fc.pause_time / 2);
    303  1.1.2.2  skrll 
    304  1.1.2.2  skrll 	return IXGBE_SUCCESS;
    305  1.1.2.2  skrll }
    306  1.1.2.2  skrll 
    307  1.1.2.2  skrll /**
    308  1.1.2.2  skrll  * ixgbe_dcb_config_tc_stats_82598 - Configure traffic class statistics
    309  1.1.2.2  skrll  * @hw: pointer to hardware structure
    310  1.1.2.2  skrll  *
    311  1.1.2.2  skrll  * Configure queue statistics registers, all queues belonging to same traffic
    312  1.1.2.2  skrll  * class uses a single set of queue statistics counters.
    313  1.1.2.2  skrll  */
    314  1.1.2.2  skrll s32 ixgbe_dcb_config_tc_stats_82598(struct ixgbe_hw *hw)
    315  1.1.2.2  skrll {
    316  1.1.2.2  skrll 	u32 reg = 0;
    317  1.1.2.2  skrll 	u8 i = 0;
    318  1.1.2.2  skrll 	u8 j = 0;
    319  1.1.2.2  skrll 
    320  1.1.2.2  skrll 	/* Receive Queues stats setting -  8 queues per statistics reg */
    321  1.1.2.2  skrll 	for (i = 0, j = 0; i < 15 && j < 8; i = i + 2, j++) {
    322  1.1.2.2  skrll 		reg = IXGBE_READ_REG(hw, IXGBE_RQSMR(i));
    323  1.1.2.2  skrll 		reg |= ((0x1010101) * j);
    324  1.1.2.2  skrll 		IXGBE_WRITE_REG(hw, IXGBE_RQSMR(i), reg);
    325  1.1.2.2  skrll 		reg = IXGBE_READ_REG(hw, IXGBE_RQSMR(i + 1));
    326  1.1.2.2  skrll 		reg |= ((0x1010101) * j);
    327  1.1.2.2  skrll 		IXGBE_WRITE_REG(hw, IXGBE_RQSMR(i + 1), reg);
    328  1.1.2.2  skrll 	}
    329  1.1.2.2  skrll 	/* Transmit Queues stats setting -  4 queues per statistics reg*/
    330  1.1.2.2  skrll 	for (i = 0; i < 8; i++) {
    331  1.1.2.2  skrll 		reg = IXGBE_READ_REG(hw, IXGBE_TQSMR(i));
    332  1.1.2.2  skrll 		reg |= ((0x1010101) * i);
    333  1.1.2.2  skrll 		IXGBE_WRITE_REG(hw, IXGBE_TQSMR(i), reg);
    334  1.1.2.2  skrll 	}
    335  1.1.2.2  skrll 
    336  1.1.2.2  skrll 	return IXGBE_SUCCESS;
    337  1.1.2.2  skrll }
    338  1.1.2.2  skrll 
    339  1.1.2.2  skrll /**
    340  1.1.2.2  skrll  * ixgbe_dcb_hw_config_82598 - Config and enable DCB
    341  1.1.2.2  skrll  * @hw: pointer to hardware structure
    342  1.1.2.2  skrll  * @dcb_config: pointer to ixgbe_dcb_config structure
    343  1.1.2.2  skrll  *
    344  1.1.2.2  skrll  * Configure dcb settings and enable dcb mode.
    345  1.1.2.2  skrll  */
    346  1.1.2.2  skrll s32 ixgbe_dcb_hw_config_82598(struct ixgbe_hw *hw, int link_speed,
    347  1.1.2.2  skrll 			      u16 *refill, u16 *max, u8 *bwg_id,
    348  1.1.2.2  skrll 			      u8 *tsa)
    349  1.1.2.2  skrll {
    350  1.1.2.3  skrll 	UNREFERENCED_1PARAMETER(link_speed);
    351  1.1.2.3  skrll 
    352  1.1.2.2  skrll 	ixgbe_dcb_config_rx_arbiter_82598(hw, refill, max, tsa);
    353  1.1.2.2  skrll 	ixgbe_dcb_config_tx_desc_arbiter_82598(hw, refill, max, bwg_id,
    354  1.1.2.2  skrll 					       tsa);
    355  1.1.2.2  skrll 	ixgbe_dcb_config_tx_data_arbiter_82598(hw, refill, max, bwg_id,
    356  1.1.2.2  skrll 					       tsa);
    357  1.1.2.2  skrll 	ixgbe_dcb_config_tc_stats_82598(hw);
    358  1.1.2.2  skrll 
    359  1.1.2.2  skrll 
    360  1.1.2.2  skrll 	return IXGBE_SUCCESS;
    361  1.1.2.2  skrll }
    362