1dee1ad47SJeff Kirsher /******************************************************************************* 2dee1ad47SJeff Kirsher 3dee1ad47SJeff Kirsher Intel 10 Gigabit PCI Express Linux driver 4dee1ad47SJeff Kirsher Copyright(c) 1999 - 2011 Intel Corporation. 5dee1ad47SJeff Kirsher 6dee1ad47SJeff Kirsher This program is free software; you can redistribute it and/or modify it 7dee1ad47SJeff Kirsher under the terms and conditions of the GNU General Public License, 8dee1ad47SJeff Kirsher version 2, as published by the Free Software Foundation. 9dee1ad47SJeff Kirsher 10dee1ad47SJeff Kirsher This program is distributed in the hope it will be useful, but WITHOUT 11dee1ad47SJeff Kirsher ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 12dee1ad47SJeff Kirsher FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 13dee1ad47SJeff Kirsher more details. 14dee1ad47SJeff Kirsher 15dee1ad47SJeff Kirsher You should have received a copy of the GNU General Public License along with 16dee1ad47SJeff Kirsher this program; if not, write to the Free Software Foundation, Inc., 17dee1ad47SJeff Kirsher 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. 18dee1ad47SJeff Kirsher 19dee1ad47SJeff Kirsher The full GNU General Public License is included in this distribution in 20dee1ad47SJeff Kirsher the file called "COPYING". 21dee1ad47SJeff Kirsher 22dee1ad47SJeff Kirsher Contact Information: 23dee1ad47SJeff Kirsher e1000-devel Mailing List <e1000-devel@lists.sourceforge.net> 24dee1ad47SJeff Kirsher Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 25dee1ad47SJeff Kirsher 26dee1ad47SJeff Kirsher *******************************************************************************/ 27dee1ad47SJeff Kirsher 28dee1ad47SJeff Kirsher #include "ixgbe.h" 29dee1ad47SJeff Kirsher #include "ixgbe_type.h" 30dee1ad47SJeff Kirsher #include "ixgbe_dcb.h" 31dee1ad47SJeff Kirsher #include "ixgbe_dcb_82599.h" 32dee1ad47SJeff Kirsher 33dee1ad47SJeff Kirsher /** 34dee1ad47SJeff Kirsher * ixgbe_dcb_config_rx_arbiter_82599 - Config Rx Data arbiter 35dee1ad47SJeff Kirsher * @hw: pointer to hardware structure 36dee1ad47SJeff Kirsher * @refill: refill credits index by traffic class 37dee1ad47SJeff Kirsher * @max: max credits index by traffic class 38dee1ad47SJeff Kirsher * @bwg_id: bandwidth grouping indexed by traffic class 39dee1ad47SJeff Kirsher * @prio_type: priority type indexed by traffic class 40dee1ad47SJeff Kirsher * 41dee1ad47SJeff Kirsher * Configure Rx Packet Arbiter and credits for each traffic class. 42dee1ad47SJeff Kirsher */ 43dee1ad47SJeff Kirsher s32 ixgbe_dcb_config_rx_arbiter_82599(struct ixgbe_hw *hw, 44dee1ad47SJeff Kirsher u16 *refill, 45dee1ad47SJeff Kirsher u16 *max, 46dee1ad47SJeff Kirsher u8 *bwg_id, 47dee1ad47SJeff Kirsher u8 *prio_type, 48dee1ad47SJeff Kirsher u8 *prio_tc) 49dee1ad47SJeff Kirsher { 50dee1ad47SJeff Kirsher u32 reg = 0; 51dee1ad47SJeff Kirsher u32 credit_refill = 0; 52dee1ad47SJeff Kirsher u32 credit_max = 0; 53dee1ad47SJeff Kirsher u8 i = 0; 54dee1ad47SJeff Kirsher 55dee1ad47SJeff Kirsher /* 56dee1ad47SJeff Kirsher * Disable the arbiter before changing parameters 57dee1ad47SJeff Kirsher * (always enable recycle mode; WSP) 58dee1ad47SJeff Kirsher */ 59dee1ad47SJeff Kirsher reg = IXGBE_RTRPCS_RRM | IXGBE_RTRPCS_RAC | IXGBE_RTRPCS_ARBDIS; 60dee1ad47SJeff Kirsher IXGBE_WRITE_REG(hw, IXGBE_RTRPCS, reg); 61dee1ad47SJeff Kirsher 6232701dc2SJohn Fastabend /* Map all traffic classes to their UP */ 63dee1ad47SJeff Kirsher reg = 0; 6432701dc2SJohn Fastabend for (i = 0; i < MAX_USER_PRIORITY; i++) 65dee1ad47SJeff Kirsher reg |= (prio_tc[i] << (i * IXGBE_RTRUP2TC_UP_SHIFT)); 66dee1ad47SJeff Kirsher IXGBE_WRITE_REG(hw, IXGBE_RTRUP2TC, reg); 67dee1ad47SJeff Kirsher 68dee1ad47SJeff Kirsher /* Configure traffic class credits and priority */ 69dee1ad47SJeff Kirsher for (i = 0; i < MAX_TRAFFIC_CLASS; i++) { 70dee1ad47SJeff Kirsher credit_refill = refill[i]; 71dee1ad47SJeff Kirsher credit_max = max[i]; 72dee1ad47SJeff Kirsher reg = credit_refill | (credit_max << IXGBE_RTRPT4C_MCL_SHIFT); 73dee1ad47SJeff Kirsher 74dee1ad47SJeff Kirsher reg |= (u32)(bwg_id[i]) << IXGBE_RTRPT4C_BWG_SHIFT; 75dee1ad47SJeff Kirsher 76dee1ad47SJeff Kirsher if (prio_type[i] == prio_link) 77dee1ad47SJeff Kirsher reg |= IXGBE_RTRPT4C_LSP; 78dee1ad47SJeff Kirsher 79dee1ad47SJeff Kirsher IXGBE_WRITE_REG(hw, IXGBE_RTRPT4C(i), reg); 80dee1ad47SJeff Kirsher } 81dee1ad47SJeff Kirsher 82dee1ad47SJeff Kirsher /* 83dee1ad47SJeff Kirsher * Configure Rx packet plane (recycle mode; WSP) and 84dee1ad47SJeff Kirsher * enable arbiter 85dee1ad47SJeff Kirsher */ 86dee1ad47SJeff Kirsher reg = IXGBE_RTRPCS_RRM | IXGBE_RTRPCS_RAC; 87dee1ad47SJeff Kirsher IXGBE_WRITE_REG(hw, IXGBE_RTRPCS, reg); 88dee1ad47SJeff Kirsher 89dee1ad47SJeff Kirsher return 0; 90dee1ad47SJeff Kirsher } 91dee1ad47SJeff Kirsher 92dee1ad47SJeff Kirsher /** 93dee1ad47SJeff Kirsher * ixgbe_dcb_config_tx_desc_arbiter_82599 - Config Tx Desc. arbiter 94dee1ad47SJeff Kirsher * @hw: pointer to hardware structure 95dee1ad47SJeff Kirsher * @refill: refill credits index by traffic class 96dee1ad47SJeff Kirsher * @max: max credits index by traffic class 97dee1ad47SJeff Kirsher * @bwg_id: bandwidth grouping indexed by traffic class 98dee1ad47SJeff Kirsher * @prio_type: priority type indexed by traffic class 99dee1ad47SJeff Kirsher * 100dee1ad47SJeff Kirsher * Configure Tx Descriptor Arbiter and credits for each traffic class. 101dee1ad47SJeff Kirsher */ 102dee1ad47SJeff Kirsher s32 ixgbe_dcb_config_tx_desc_arbiter_82599(struct ixgbe_hw *hw, 103dee1ad47SJeff Kirsher u16 *refill, 104dee1ad47SJeff Kirsher u16 *max, 105dee1ad47SJeff Kirsher u8 *bwg_id, 106dee1ad47SJeff Kirsher u8 *prio_type) 107dee1ad47SJeff Kirsher { 108dee1ad47SJeff Kirsher u32 reg, max_credits; 109dee1ad47SJeff Kirsher u8 i; 110dee1ad47SJeff Kirsher 111dee1ad47SJeff Kirsher /* Clear the per-Tx queue credits; we use per-TC instead */ 112dee1ad47SJeff Kirsher for (i = 0; i < 128; i++) { 113dee1ad47SJeff Kirsher IXGBE_WRITE_REG(hw, IXGBE_RTTDQSEL, i); 114dee1ad47SJeff Kirsher IXGBE_WRITE_REG(hw, IXGBE_RTTDT1C, 0); 115dee1ad47SJeff Kirsher } 116dee1ad47SJeff Kirsher 117dee1ad47SJeff Kirsher /* Configure traffic class credits and priority */ 118dee1ad47SJeff Kirsher for (i = 0; i < MAX_TRAFFIC_CLASS; i++) { 119dee1ad47SJeff Kirsher max_credits = max[i]; 120dee1ad47SJeff Kirsher reg = max_credits << IXGBE_RTTDT2C_MCL_SHIFT; 121dee1ad47SJeff Kirsher reg |= refill[i]; 122dee1ad47SJeff Kirsher reg |= (u32)(bwg_id[i]) << IXGBE_RTTDT2C_BWG_SHIFT; 123dee1ad47SJeff Kirsher 124dee1ad47SJeff Kirsher if (prio_type[i] == prio_group) 125dee1ad47SJeff Kirsher reg |= IXGBE_RTTDT2C_GSP; 126dee1ad47SJeff Kirsher 127dee1ad47SJeff Kirsher if (prio_type[i] == prio_link) 128dee1ad47SJeff Kirsher reg |= IXGBE_RTTDT2C_LSP; 129dee1ad47SJeff Kirsher 130dee1ad47SJeff Kirsher IXGBE_WRITE_REG(hw, IXGBE_RTTDT2C(i), reg); 131dee1ad47SJeff Kirsher } 132dee1ad47SJeff Kirsher 133dee1ad47SJeff Kirsher /* 134dee1ad47SJeff Kirsher * Configure Tx descriptor plane (recycle mode; WSP) and 135dee1ad47SJeff Kirsher * enable arbiter 136dee1ad47SJeff Kirsher */ 137dee1ad47SJeff Kirsher reg = IXGBE_RTTDCS_TDPAC | IXGBE_RTTDCS_TDRM; 138dee1ad47SJeff Kirsher IXGBE_WRITE_REG(hw, IXGBE_RTTDCS, reg); 139dee1ad47SJeff Kirsher 140dee1ad47SJeff Kirsher return 0; 141dee1ad47SJeff Kirsher } 142dee1ad47SJeff Kirsher 143dee1ad47SJeff Kirsher /** 144dee1ad47SJeff Kirsher * ixgbe_dcb_config_tx_data_arbiter_82599 - Config Tx Data arbiter 145dee1ad47SJeff Kirsher * @hw: pointer to hardware structure 146dee1ad47SJeff Kirsher * @refill: refill credits index by traffic class 147dee1ad47SJeff Kirsher * @max: max credits index by traffic class 148dee1ad47SJeff Kirsher * @bwg_id: bandwidth grouping indexed by traffic class 149dee1ad47SJeff Kirsher * @prio_type: priority type indexed by traffic class 150dee1ad47SJeff Kirsher * 151dee1ad47SJeff Kirsher * Configure Tx Packet Arbiter and credits for each traffic class. 152dee1ad47SJeff Kirsher */ 153dee1ad47SJeff Kirsher s32 ixgbe_dcb_config_tx_data_arbiter_82599(struct ixgbe_hw *hw, 154dee1ad47SJeff Kirsher u16 *refill, 155dee1ad47SJeff Kirsher u16 *max, 156dee1ad47SJeff Kirsher u8 *bwg_id, 157dee1ad47SJeff Kirsher u8 *prio_type, 158dee1ad47SJeff Kirsher u8 *prio_tc) 159dee1ad47SJeff Kirsher { 160dee1ad47SJeff Kirsher u32 reg; 161dee1ad47SJeff Kirsher u8 i; 162dee1ad47SJeff Kirsher 163dee1ad47SJeff Kirsher /* 164dee1ad47SJeff Kirsher * Disable the arbiter before changing parameters 165dee1ad47SJeff Kirsher * (always enable recycle mode; SP; arb delay) 166dee1ad47SJeff Kirsher */ 167dee1ad47SJeff Kirsher reg = IXGBE_RTTPCS_TPPAC | IXGBE_RTTPCS_TPRM | 168dee1ad47SJeff Kirsher (IXGBE_RTTPCS_ARBD_DCB << IXGBE_RTTPCS_ARBD_SHIFT) | 169dee1ad47SJeff Kirsher IXGBE_RTTPCS_ARBDIS; 170dee1ad47SJeff Kirsher IXGBE_WRITE_REG(hw, IXGBE_RTTPCS, reg); 171dee1ad47SJeff Kirsher 17232701dc2SJohn Fastabend /* Map all traffic classes to their UP */ 173dee1ad47SJeff Kirsher reg = 0; 17432701dc2SJohn Fastabend for (i = 0; i < MAX_USER_PRIORITY; i++) 175dee1ad47SJeff Kirsher reg |= (prio_tc[i] << (i * IXGBE_RTTUP2TC_UP_SHIFT)); 176dee1ad47SJeff Kirsher IXGBE_WRITE_REG(hw, IXGBE_RTTUP2TC, reg); 177dee1ad47SJeff Kirsher 178dee1ad47SJeff Kirsher /* Configure traffic class credits and priority */ 179dee1ad47SJeff Kirsher for (i = 0; i < MAX_TRAFFIC_CLASS; i++) { 180dee1ad47SJeff Kirsher reg = refill[i]; 181dee1ad47SJeff Kirsher reg |= (u32)(max[i]) << IXGBE_RTTPT2C_MCL_SHIFT; 182dee1ad47SJeff Kirsher reg |= (u32)(bwg_id[i]) << IXGBE_RTTPT2C_BWG_SHIFT; 183dee1ad47SJeff Kirsher 184dee1ad47SJeff Kirsher if (prio_type[i] == prio_group) 185dee1ad47SJeff Kirsher reg |= IXGBE_RTTPT2C_GSP; 186dee1ad47SJeff Kirsher 187dee1ad47SJeff Kirsher if (prio_type[i] == prio_link) 188dee1ad47SJeff Kirsher reg |= IXGBE_RTTPT2C_LSP; 189dee1ad47SJeff Kirsher 190dee1ad47SJeff Kirsher IXGBE_WRITE_REG(hw, IXGBE_RTTPT2C(i), reg); 191dee1ad47SJeff Kirsher } 192dee1ad47SJeff Kirsher 193dee1ad47SJeff Kirsher /* 194dee1ad47SJeff Kirsher * Configure Tx packet plane (recycle mode; SP; arb delay) and 195dee1ad47SJeff Kirsher * enable arbiter 196dee1ad47SJeff Kirsher */ 197dee1ad47SJeff Kirsher reg = IXGBE_RTTPCS_TPPAC | IXGBE_RTTPCS_TPRM | 198dee1ad47SJeff Kirsher (IXGBE_RTTPCS_ARBD_DCB << IXGBE_RTTPCS_ARBD_SHIFT); 199dee1ad47SJeff Kirsher IXGBE_WRITE_REG(hw, IXGBE_RTTPCS, reg); 200dee1ad47SJeff Kirsher 201dee1ad47SJeff Kirsher return 0; 202dee1ad47SJeff Kirsher } 203dee1ad47SJeff Kirsher 204dee1ad47SJeff Kirsher /** 205dee1ad47SJeff Kirsher * ixgbe_dcb_config_pfc_82599 - Configure priority flow control 206dee1ad47SJeff Kirsher * @hw: pointer to hardware structure 207dee1ad47SJeff Kirsher * @pfc_en: enabled pfc bitmask 20832701dc2SJohn Fastabend * @prio_tc: priority to tc assignments indexed by priority 209dee1ad47SJeff Kirsher * 210dee1ad47SJeff Kirsher * Configure Priority Flow Control (PFC) for each traffic class. 211dee1ad47SJeff Kirsher */ 21232701dc2SJohn Fastabend s32 ixgbe_dcb_config_pfc_82599(struct ixgbe_hw *hw, u8 pfc_en, u8 *prio_tc) 213dee1ad47SJeff Kirsher { 21432701dc2SJohn Fastabend u32 i, j, reg; 21532701dc2SJohn Fastabend u8 max_tc = 0; 21632701dc2SJohn Fastabend 21732701dc2SJohn Fastabend for (i = 0; i < MAX_USER_PRIORITY; i++) 21832701dc2SJohn Fastabend if (prio_tc[i] > max_tc) 21932701dc2SJohn Fastabend max_tc = prio_tc[i]; 220dee1ad47SJeff Kirsher 221dee1ad47SJeff Kirsher /* Configure PFC Tx thresholds per TC */ 222dee1ad47SJeff Kirsher for (i = 0; i < MAX_TRAFFIC_CLASS; i++) { 22332701dc2SJohn Fastabend int enabled = 0; 22432701dc2SJohn Fastabend 22532701dc2SJohn Fastabend if (i > max_tc) { 22632701dc2SJohn Fastabend reg = 0; 22732701dc2SJohn Fastabend IXGBE_WRITE_REG(hw, IXGBE_FCRTL_82599(i), reg); 22832701dc2SJohn Fastabend IXGBE_WRITE_REG(hw, IXGBE_FCRTH_82599(i), reg); 22932701dc2SJohn Fastabend continue; 23032701dc2SJohn Fastabend } 23132701dc2SJohn Fastabend 23232701dc2SJohn Fastabend for (j = 0; j < MAX_USER_PRIORITY; j++) { 23332701dc2SJohn Fastabend if ((prio_tc[j] == i) && (pfc_en & (1 << j))) { 23432701dc2SJohn Fastabend enabled = 1; 23532701dc2SJohn Fastabend break; 23632701dc2SJohn Fastabend } 23732701dc2SJohn Fastabend } 238dee1ad47SJeff Kirsher 2399da712d2SJohn Fastabend reg = hw->fc.low_water << 10; 240dee1ad47SJeff Kirsher 241dee1ad47SJeff Kirsher if (enabled) 242dee1ad47SJeff Kirsher reg |= IXGBE_FCRTL_XONE; 243dee1ad47SJeff Kirsher IXGBE_WRITE_REG(hw, IXGBE_FCRTL_82599(i), reg); 244dee1ad47SJeff Kirsher 2459da712d2SJohn Fastabend reg = hw->fc.high_water[i] << 10; 246dee1ad47SJeff Kirsher if (enabled) 247dee1ad47SJeff Kirsher reg |= IXGBE_FCRTH_FCEN; 248dee1ad47SJeff Kirsher IXGBE_WRITE_REG(hw, IXGBE_FCRTH_82599(i), reg); 249dee1ad47SJeff Kirsher } 250dee1ad47SJeff Kirsher 251dee1ad47SJeff Kirsher if (pfc_en) { 252dee1ad47SJeff Kirsher /* Configure pause time (2 TCs per register) */ 253dee1ad47SJeff Kirsher reg = hw->fc.pause_time | (hw->fc.pause_time << 16); 254dee1ad47SJeff Kirsher for (i = 0; i < (MAX_TRAFFIC_CLASS / 2); i++) 255dee1ad47SJeff Kirsher IXGBE_WRITE_REG(hw, IXGBE_FCTTV(i), reg); 256dee1ad47SJeff Kirsher 257dee1ad47SJeff Kirsher /* Configure flow control refresh threshold value */ 258dee1ad47SJeff Kirsher IXGBE_WRITE_REG(hw, IXGBE_FCRTV, hw->fc.pause_time / 2); 259dee1ad47SJeff Kirsher 260dee1ad47SJeff Kirsher 261dee1ad47SJeff Kirsher reg = IXGBE_FCCFG_TFCE_PRIORITY; 262dee1ad47SJeff Kirsher IXGBE_WRITE_REG(hw, IXGBE_FCCFG, reg); 263dee1ad47SJeff Kirsher /* 264dee1ad47SJeff Kirsher * Enable Receive PFC 265dee1ad47SJeff Kirsher * 82599 will always honor XOFF frames we receive when 266dee1ad47SJeff Kirsher * we are in PFC mode however X540 only honors enabled 267dee1ad47SJeff Kirsher * traffic classes. 268dee1ad47SJeff Kirsher */ 269dee1ad47SJeff Kirsher reg = IXGBE_READ_REG(hw, IXGBE_MFLCN); 270dee1ad47SJeff Kirsher reg &= ~IXGBE_MFLCN_RFCE; 271dee1ad47SJeff Kirsher reg |= IXGBE_MFLCN_RPFCE | IXGBE_MFLCN_DPF; 272dee1ad47SJeff Kirsher 273634cdca5SJohn Fastabend if (hw->mac.type == ixgbe_mac_X540) { 27432701dc2SJohn Fastabend reg &= ~(IXGBE_MFLCN_RPFCE_MASK | 0x10); 275dee1ad47SJeff Kirsher reg |= pfc_en << IXGBE_MFLCN_RPFCE_SHIFT; 276634cdca5SJohn Fastabend } 277dee1ad47SJeff Kirsher 278dee1ad47SJeff Kirsher IXGBE_WRITE_REG(hw, IXGBE_MFLCN, reg); 279dee1ad47SJeff Kirsher 280dee1ad47SJeff Kirsher } else { 281dee1ad47SJeff Kirsher for (i = 0; i < MAX_TRAFFIC_CLASS; i++) 282dee1ad47SJeff Kirsher hw->mac.ops.fc_enable(hw, i); 283dee1ad47SJeff Kirsher } 284dee1ad47SJeff Kirsher 285dee1ad47SJeff Kirsher return 0; 286dee1ad47SJeff Kirsher } 287dee1ad47SJeff Kirsher 288dee1ad47SJeff Kirsher /** 289dee1ad47SJeff Kirsher * ixgbe_dcb_config_tc_stats_82599 - Config traffic class statistics 290dee1ad47SJeff Kirsher * @hw: pointer to hardware structure 291dee1ad47SJeff Kirsher * 292dee1ad47SJeff Kirsher * Configure queue statistics registers, all queues belonging to same traffic 293dee1ad47SJeff Kirsher * class uses a single set of queue statistics counters. 294dee1ad47SJeff Kirsher */ 295dee1ad47SJeff Kirsher static s32 ixgbe_dcb_config_tc_stats_82599(struct ixgbe_hw *hw) 296dee1ad47SJeff Kirsher { 297dee1ad47SJeff Kirsher u32 reg = 0; 298dee1ad47SJeff Kirsher u8 i = 0; 299dee1ad47SJeff Kirsher 300dee1ad47SJeff Kirsher /* 301dee1ad47SJeff Kirsher * Receive Queues stats setting 302dee1ad47SJeff Kirsher * 32 RQSMR registers, each configuring 4 queues. 303dee1ad47SJeff Kirsher * Set all 16 queues of each TC to the same stat 304dee1ad47SJeff Kirsher * with TC 'n' going to stat 'n'. 305dee1ad47SJeff Kirsher */ 306dee1ad47SJeff Kirsher for (i = 0; i < 32; i++) { 307dee1ad47SJeff Kirsher reg = 0x01010101 * (i / 4); 308dee1ad47SJeff Kirsher IXGBE_WRITE_REG(hw, IXGBE_RQSMR(i), reg); 309dee1ad47SJeff Kirsher } 310dee1ad47SJeff Kirsher /* 311dee1ad47SJeff Kirsher * Transmit Queues stats setting 312dee1ad47SJeff Kirsher * 32 TQSM registers, each controlling 4 queues. 313dee1ad47SJeff Kirsher * Set all queues of each TC to the same stat 314dee1ad47SJeff Kirsher * with TC 'n' going to stat 'n'. 315dee1ad47SJeff Kirsher * Tx queues are allocated non-uniformly to TCs: 316dee1ad47SJeff Kirsher * 32, 32, 16, 16, 8, 8, 8, 8. 317dee1ad47SJeff Kirsher */ 318dee1ad47SJeff Kirsher for (i = 0; i < 32; i++) { 319dee1ad47SJeff Kirsher if (i < 8) 320dee1ad47SJeff Kirsher reg = 0x00000000; 321dee1ad47SJeff Kirsher else if (i < 16) 322dee1ad47SJeff Kirsher reg = 0x01010101; 323dee1ad47SJeff Kirsher else if (i < 20) 324dee1ad47SJeff Kirsher reg = 0x02020202; 325dee1ad47SJeff Kirsher else if (i < 24) 326dee1ad47SJeff Kirsher reg = 0x03030303; 327dee1ad47SJeff Kirsher else if (i < 26) 328dee1ad47SJeff Kirsher reg = 0x04040404; 329dee1ad47SJeff Kirsher else if (i < 28) 330dee1ad47SJeff Kirsher reg = 0x05050505; 331dee1ad47SJeff Kirsher else if (i < 30) 332dee1ad47SJeff Kirsher reg = 0x06060606; 333dee1ad47SJeff Kirsher else 334dee1ad47SJeff Kirsher reg = 0x07070707; 335dee1ad47SJeff Kirsher IXGBE_WRITE_REG(hw, IXGBE_TQSM(i), reg); 336dee1ad47SJeff Kirsher } 337dee1ad47SJeff Kirsher 338dee1ad47SJeff Kirsher return 0; 339dee1ad47SJeff Kirsher } 340dee1ad47SJeff Kirsher 341dee1ad47SJeff Kirsher /** 342dee1ad47SJeff Kirsher * ixgbe_dcb_hw_config_82599 - Configure and enable DCB 343dee1ad47SJeff Kirsher * @hw: pointer to hardware structure 344dee1ad47SJeff Kirsher * @refill: refill credits index by traffic class 345dee1ad47SJeff Kirsher * @max: max credits index by traffic class 346dee1ad47SJeff Kirsher * @bwg_id: bandwidth grouping indexed by traffic class 347dee1ad47SJeff Kirsher * @prio_type: priority type indexed by traffic class 348dee1ad47SJeff Kirsher * @pfc_en: enabled pfc bitmask 349dee1ad47SJeff Kirsher * 350dee1ad47SJeff Kirsher * Configure dcb settings and enable dcb mode. 351dee1ad47SJeff Kirsher */ 352dee1ad47SJeff Kirsher s32 ixgbe_dcb_hw_config_82599(struct ixgbe_hw *hw, u8 pfc_en, u16 *refill, 353dee1ad47SJeff Kirsher u16 *max, u8 *bwg_id, u8 *prio_type, u8 *prio_tc) 354dee1ad47SJeff Kirsher { 355dee1ad47SJeff Kirsher ixgbe_dcb_config_rx_arbiter_82599(hw, refill, max, bwg_id, 356dee1ad47SJeff Kirsher prio_type, prio_tc); 357dee1ad47SJeff Kirsher ixgbe_dcb_config_tx_desc_arbiter_82599(hw, refill, max, 358dee1ad47SJeff Kirsher bwg_id, prio_type); 359dee1ad47SJeff Kirsher ixgbe_dcb_config_tx_data_arbiter_82599(hw, refill, max, 360dee1ad47SJeff Kirsher bwg_id, prio_type, prio_tc); 36132701dc2SJohn Fastabend ixgbe_dcb_config_pfc_82599(hw, pfc_en, prio_tc); 362dee1ad47SJeff Kirsher ixgbe_dcb_config_tc_stats_82599(hw); 363dee1ad47SJeff Kirsher 364dee1ad47SJeff Kirsher return 0; 365dee1ad47SJeff Kirsher } 366dee1ad47SJeff Kirsher 367