|
@@ -33,19 +33,18 @@
|
|
/**
|
|
/**
|
|
* ixgbe_dcb_config_packet_buffers_82599 - Configure DCB packet buffers
|
|
* ixgbe_dcb_config_packet_buffers_82599 - Configure DCB packet buffers
|
|
* @hw: pointer to hardware structure
|
|
* @hw: pointer to hardware structure
|
|
- * @dcb_config: pointer to ixgbe_dcb_config structure
|
|
|
|
|
|
+ * @rx_pba: method to distribute packet buffer
|
|
*
|
|
*
|
|
* Configure packet buffers for DCB mode.
|
|
* Configure packet buffers for DCB mode.
|
|
*/
|
|
*/
|
|
-static s32 ixgbe_dcb_config_packet_buffers_82599(struct ixgbe_hw *hw,
|
|
|
|
- struct ixgbe_dcb_config *dcb_config)
|
|
|
|
|
|
+static s32 ixgbe_dcb_config_packet_buffers_82599(struct ixgbe_hw *hw, u8 rx_pba)
|
|
{
|
|
{
|
|
s32 ret_val = 0;
|
|
s32 ret_val = 0;
|
|
u32 value = IXGBE_RXPBSIZE_64KB;
|
|
u32 value = IXGBE_RXPBSIZE_64KB;
|
|
u8 i = 0;
|
|
u8 i = 0;
|
|
|
|
|
|
/* Setup Rx packet buffer sizes */
|
|
/* Setup Rx packet buffer sizes */
|
|
- switch (dcb_config->rx_pba_cfg) {
|
|
|
|
|
|
+ switch (rx_pba) {
|
|
case pba_80_48:
|
|
case pba_80_48:
|
|
/* Setup the first four at 80KB */
|
|
/* Setup the first four at 80KB */
|
|
value = IXGBE_RXPBSIZE_80KB;
|
|
value = IXGBE_RXPBSIZE_80KB;
|
|
@@ -75,14 +74,19 @@ static s32 ixgbe_dcb_config_packet_buffers_82599(struct ixgbe_hw *hw,
|
|
/**
|
|
/**
|
|
* ixgbe_dcb_config_rx_arbiter_82599 - Config Rx Data arbiter
|
|
* ixgbe_dcb_config_rx_arbiter_82599 - Config Rx Data arbiter
|
|
* @hw: pointer to hardware structure
|
|
* @hw: pointer to hardware structure
|
|
- * @dcb_config: pointer to ixgbe_dcb_config structure
|
|
|
|
|
|
+ * @refill: refill credits index by traffic class
|
|
|
|
+ * @max: max credits index by traffic class
|
|
|
|
+ * @bwg_id: bandwidth grouping indexed by traffic class
|
|
|
|
+ * @prio_type: priority type indexed by traffic class
|
|
*
|
|
*
|
|
* Configure Rx Packet Arbiter and credits for each traffic class.
|
|
* Configure Rx Packet Arbiter and credits for each traffic class.
|
|
*/
|
|
*/
|
|
-static s32 ixgbe_dcb_config_rx_arbiter_82599(struct ixgbe_hw *hw,
|
|
|
|
- struct ixgbe_dcb_config *dcb_config)
|
|
|
|
|
|
+s32 ixgbe_dcb_config_rx_arbiter_82599(struct ixgbe_hw *hw,
|
|
|
|
+ u16 *refill,
|
|
|
|
+ u16 *max,
|
|
|
|
+ u8 *bwg_id,
|
|
|
|
+ u8 *prio_type)
|
|
{
|
|
{
|
|
- struct tc_bw_alloc *p;
|
|
|
|
u32 reg = 0;
|
|
u32 reg = 0;
|
|
u32 credit_refill = 0;
|
|
u32 credit_refill = 0;
|
|
u32 credit_max = 0;
|
|
u32 credit_max = 0;
|
|
@@ -103,15 +107,13 @@ static s32 ixgbe_dcb_config_rx_arbiter_82599(struct ixgbe_hw *hw,
|
|
|
|
|
|
/* Configure traffic class credits and priority */
|
|
/* Configure traffic class credits and priority */
|
|
for (i = 0; i < MAX_TRAFFIC_CLASS; i++) {
|
|
for (i = 0; i < MAX_TRAFFIC_CLASS; i++) {
|
|
- p = &dcb_config->tc_config[i].path[DCB_RX_CONFIG];
|
|
|
|
-
|
|
|
|
- credit_refill = p->data_credits_refill;
|
|
|
|
- credit_max = p->data_credits_max;
|
|
|
|
|
|
+ credit_refill = refill[i];
|
|
|
|
+ credit_max = max[i];
|
|
reg = credit_refill | (credit_max << IXGBE_RTRPT4C_MCL_SHIFT);
|
|
reg = credit_refill | (credit_max << IXGBE_RTRPT4C_MCL_SHIFT);
|
|
|
|
|
|
- reg |= (u32)(p->bwg_id) << IXGBE_RTRPT4C_BWG_SHIFT;
|
|
|
|
|
|
+ reg |= (u32)(bwg_id[i]) << IXGBE_RTRPT4C_BWG_SHIFT;
|
|
|
|
|
|
- if (p->prio_type == prio_link)
|
|
|
|
|
|
+ if (prio_type[i] == prio_link)
|
|
reg |= IXGBE_RTRPT4C_LSP;
|
|
reg |= IXGBE_RTRPT4C_LSP;
|
|
|
|
|
|
IXGBE_WRITE_REG(hw, IXGBE_RTRPT4C(i), reg);
|
|
IXGBE_WRITE_REG(hw, IXGBE_RTRPT4C(i), reg);
|
|
@@ -130,14 +132,19 @@ static s32 ixgbe_dcb_config_rx_arbiter_82599(struct ixgbe_hw *hw,
|
|
/**
|
|
/**
|
|
* ixgbe_dcb_config_tx_desc_arbiter_82599 - Config Tx Desc. arbiter
|
|
* ixgbe_dcb_config_tx_desc_arbiter_82599 - Config Tx Desc. arbiter
|
|
* @hw: pointer to hardware structure
|
|
* @hw: pointer to hardware structure
|
|
- * @dcb_config: pointer to ixgbe_dcb_config structure
|
|
|
|
|
|
+ * @refill: refill credits index by traffic class
|
|
|
|
+ * @max: max credits index by traffic class
|
|
|
|
+ * @bwg_id: bandwidth grouping indexed by traffic class
|
|
|
|
+ * @prio_type: priority type indexed by traffic class
|
|
*
|
|
*
|
|
* Configure Tx Descriptor Arbiter and credits for each traffic class.
|
|
* Configure Tx Descriptor Arbiter and credits for each traffic class.
|
|
*/
|
|
*/
|
|
-static s32 ixgbe_dcb_config_tx_desc_arbiter_82599(struct ixgbe_hw *hw,
|
|
|
|
- struct ixgbe_dcb_config *dcb_config)
|
|
|
|
|
|
+s32 ixgbe_dcb_config_tx_desc_arbiter_82599(struct ixgbe_hw *hw,
|
|
|
|
+ u16 *refill,
|
|
|
|
+ u16 *max,
|
|
|
|
+ u8 *bwg_id,
|
|
|
|
+ u8 *prio_type)
|
|
{
|
|
{
|
|
- struct tc_bw_alloc *p;
|
|
|
|
u32 reg, max_credits;
|
|
u32 reg, max_credits;
|
|
u8 i;
|
|
u8 i;
|
|
|
|
|
|
@@ -149,16 +156,15 @@ static s32 ixgbe_dcb_config_tx_desc_arbiter_82599(struct ixgbe_hw *hw,
|
|
|
|
|
|
/* Configure traffic class credits and priority */
|
|
/* Configure traffic class credits and priority */
|
|
for (i = 0; i < MAX_TRAFFIC_CLASS; i++) {
|
|
for (i = 0; i < MAX_TRAFFIC_CLASS; i++) {
|
|
- p = &dcb_config->tc_config[i].path[DCB_TX_CONFIG];
|
|
|
|
- max_credits = dcb_config->tc_config[i].desc_credits_max;
|
|
|
|
|
|
+ max_credits = max[i];
|
|
reg = max_credits << IXGBE_RTTDT2C_MCL_SHIFT;
|
|
reg = max_credits << IXGBE_RTTDT2C_MCL_SHIFT;
|
|
- reg |= p->data_credits_refill;
|
|
|
|
- reg |= (u32)(p->bwg_id) << IXGBE_RTTDT2C_BWG_SHIFT;
|
|
|
|
|
|
+ reg |= refill[i];
|
|
|
|
+ reg |= (u32)(bwg_id[i]) << IXGBE_RTTDT2C_BWG_SHIFT;
|
|
|
|
|
|
- if (p->prio_type == prio_group)
|
|
|
|
|
|
+ if (prio_type[i] == prio_group)
|
|
reg |= IXGBE_RTTDT2C_GSP;
|
|
reg |= IXGBE_RTTDT2C_GSP;
|
|
|
|
|
|
- if (p->prio_type == prio_link)
|
|
|
|
|
|
+ if (prio_type[i] == prio_link)
|
|
reg |= IXGBE_RTTDT2C_LSP;
|
|
reg |= IXGBE_RTTDT2C_LSP;
|
|
|
|
|
|
IXGBE_WRITE_REG(hw, IXGBE_RTTDT2C(i), reg);
|
|
IXGBE_WRITE_REG(hw, IXGBE_RTTDT2C(i), reg);
|
|
@@ -177,14 +183,19 @@ static s32 ixgbe_dcb_config_tx_desc_arbiter_82599(struct ixgbe_hw *hw,
|
|
/**
|
|
/**
|
|
* ixgbe_dcb_config_tx_data_arbiter_82599 - Config Tx Data arbiter
|
|
* ixgbe_dcb_config_tx_data_arbiter_82599 - Config Tx Data arbiter
|
|
* @hw: pointer to hardware structure
|
|
* @hw: pointer to hardware structure
|
|
- * @dcb_config: pointer to ixgbe_dcb_config structure
|
|
|
|
|
|
+ * @refill: refill credits index by traffic class
|
|
|
|
+ * @max: max credits index by traffic class
|
|
|
|
+ * @bwg_id: bandwidth grouping indexed by traffic class
|
|
|
|
+ * @prio_type: priority type indexed by traffic class
|
|
*
|
|
*
|
|
* Configure Tx Packet Arbiter and credits for each traffic class.
|
|
* Configure Tx Packet Arbiter and credits for each traffic class.
|
|
*/
|
|
*/
|
|
-static s32 ixgbe_dcb_config_tx_data_arbiter_82599(struct ixgbe_hw *hw,
|
|
|
|
- struct ixgbe_dcb_config *dcb_config)
|
|
|
|
|
|
+s32 ixgbe_dcb_config_tx_data_arbiter_82599(struct ixgbe_hw *hw,
|
|
|
|
+ u16 *refill,
|
|
|
|
+ u16 *max,
|
|
|
|
+ u8 *bwg_id,
|
|
|
|
+ u8 *prio_type)
|
|
{
|
|
{
|
|
- struct tc_bw_alloc *p;
|
|
|
|
u32 reg;
|
|
u32 reg;
|
|
u8 i;
|
|
u8 i;
|
|
|
|
|
|
@@ -205,15 +216,14 @@ static s32 ixgbe_dcb_config_tx_data_arbiter_82599(struct ixgbe_hw *hw,
|
|
|
|
|
|
/* Configure traffic class credits and priority */
|
|
/* Configure traffic class credits and priority */
|
|
for (i = 0; i < MAX_TRAFFIC_CLASS; i++) {
|
|
for (i = 0; i < MAX_TRAFFIC_CLASS; i++) {
|
|
- p = &dcb_config->tc_config[i].path[DCB_TX_CONFIG];
|
|
|
|
- reg = p->data_credits_refill;
|
|
|
|
- reg |= (u32)(p->data_credits_max) << IXGBE_RTTPT2C_MCL_SHIFT;
|
|
|
|
- reg |= (u32)(p->bwg_id) << IXGBE_RTTPT2C_BWG_SHIFT;
|
|
|
|
|
|
+ reg = refill[i];
|
|
|
|
+ reg |= (u32)(max[i]) << IXGBE_RTTPT2C_MCL_SHIFT;
|
|
|
|
+ reg |= (u32)(bwg_id[i]) << IXGBE_RTTPT2C_BWG_SHIFT;
|
|
|
|
|
|
- if (p->prio_type == prio_group)
|
|
|
|
|
|
+ if (prio_type[i] == prio_group)
|
|
reg |= IXGBE_RTTPT2C_GSP;
|
|
reg |= IXGBE_RTTPT2C_GSP;
|
|
|
|
|
|
- if (p->prio_type == prio_link)
|
|
|
|
|
|
+ if (prio_type[i] == prio_link)
|
|
reg |= IXGBE_RTTPT2C_LSP;
|
|
reg |= IXGBE_RTTPT2C_LSP;
|
|
|
|
|
|
IXGBE_WRITE_REG(hw, IXGBE_RTTPT2C(i), reg);
|
|
IXGBE_WRITE_REG(hw, IXGBE_RTTPT2C(i), reg);
|
|
@@ -233,17 +243,16 @@ static s32 ixgbe_dcb_config_tx_data_arbiter_82599(struct ixgbe_hw *hw,
|
|
/**
|
|
/**
|
|
* ixgbe_dcb_config_pfc_82599 - Configure priority flow control
|
|
* ixgbe_dcb_config_pfc_82599 - Configure priority flow control
|
|
* @hw: pointer to hardware structure
|
|
* @hw: pointer to hardware structure
|
|
- * @dcb_config: pointer to ixgbe_dcb_config structure
|
|
|
|
|
|
+ * @pfc_en: enabled pfc bitmask
|
|
*
|
|
*
|
|
* Configure Priority Flow Control (PFC) for each traffic class.
|
|
* Configure Priority Flow Control (PFC) for each traffic class.
|
|
*/
|
|
*/
|
|
-s32 ixgbe_dcb_config_pfc_82599(struct ixgbe_hw *hw,
|
|
|
|
- struct ixgbe_dcb_config *dcb_config)
|
|
|
|
|
|
+s32 ixgbe_dcb_config_pfc_82599(struct ixgbe_hw *hw, u8 pfc_en)
|
|
{
|
|
{
|
|
u32 i, reg, rx_pba_size;
|
|
u32 i, reg, rx_pba_size;
|
|
|
|
|
|
/* If PFC is disabled globally then fall back to LFC. */
|
|
/* If PFC is disabled globally then fall back to LFC. */
|
|
- if (!dcb_config->pfc_mode_enable) {
|
|
|
|
|
|
+ if (!pfc_en) {
|
|
for (i = 0; i < MAX_TRAFFIC_CLASS; i++)
|
|
for (i = 0; i < MAX_TRAFFIC_CLASS; i++)
|
|
hw->mac.ops.fc_enable(hw, i);
|
|
hw->mac.ops.fc_enable(hw, i);
|
|
goto out;
|
|
goto out;
|
|
@@ -251,19 +260,18 @@ s32 ixgbe_dcb_config_pfc_82599(struct ixgbe_hw *hw,
|
|
|
|
|
|
/* Configure PFC Tx thresholds per TC */
|
|
/* Configure PFC Tx thresholds per TC */
|
|
for (i = 0; i < MAX_TRAFFIC_CLASS; i++) {
|
|
for (i = 0; i < MAX_TRAFFIC_CLASS; i++) {
|
|
|
|
+ int enabled = pfc_en & (1 << i);
|
|
rx_pba_size = IXGBE_READ_REG(hw, IXGBE_RXPBSIZE(i));
|
|
rx_pba_size = IXGBE_READ_REG(hw, IXGBE_RXPBSIZE(i));
|
|
rx_pba_size >>= IXGBE_RXPBSIZE_SHIFT;
|
|
rx_pba_size >>= IXGBE_RXPBSIZE_SHIFT;
|
|
|
|
|
|
reg = (rx_pba_size - hw->fc.low_water) << 10;
|
|
reg = (rx_pba_size - hw->fc.low_water) << 10;
|
|
|
|
|
|
- if (dcb_config->tc_config[i].dcb_pfc == pfc_enabled_full ||
|
|
|
|
- dcb_config->tc_config[i].dcb_pfc == pfc_enabled_tx)
|
|
|
|
|
|
+ if (enabled)
|
|
reg |= IXGBE_FCRTL_XONE;
|
|
reg |= IXGBE_FCRTL_XONE;
|
|
IXGBE_WRITE_REG(hw, IXGBE_FCRTL_82599(i), reg);
|
|
IXGBE_WRITE_REG(hw, IXGBE_FCRTL_82599(i), reg);
|
|
|
|
|
|
reg = (rx_pba_size - hw->fc.high_water) << 10;
|
|
reg = (rx_pba_size - hw->fc.high_water) << 10;
|
|
- if (dcb_config->tc_config[i].dcb_pfc == pfc_enabled_full ||
|
|
|
|
- dcb_config->tc_config[i].dcb_pfc == pfc_enabled_tx)
|
|
|
|
|
|
+ if (enabled)
|
|
reg |= IXGBE_FCRTH_FCEN;
|
|
reg |= IXGBE_FCRTH_FCEN;
|
|
IXGBE_WRITE_REG(hw, IXGBE_FCRTH_82599(i), reg);
|
|
IXGBE_WRITE_REG(hw, IXGBE_FCRTH_82599(i), reg);
|
|
}
|
|
}
|
|
@@ -349,7 +357,6 @@ static s32 ixgbe_dcb_config_tc_stats_82599(struct ixgbe_hw *hw)
|
|
/**
|
|
/**
|
|
* ixgbe_dcb_config_82599 - Configure general DCB parameters
|
|
* ixgbe_dcb_config_82599 - Configure general DCB parameters
|
|
* @hw: pointer to hardware structure
|
|
* @hw: pointer to hardware structure
|
|
- * @dcb_config: pointer to ixgbe_dcb_config structure
|
|
|
|
*
|
|
*
|
|
* Configure general DCB parameters.
|
|
* Configure general DCB parameters.
|
|
*/
|
|
*/
|
|
@@ -406,19 +413,27 @@ static s32 ixgbe_dcb_config_82599(struct ixgbe_hw *hw)
|
|
/**
|
|
/**
|
|
* ixgbe_dcb_hw_config_82599 - Configure and enable DCB
|
|
* ixgbe_dcb_hw_config_82599 - Configure and enable DCB
|
|
* @hw: pointer to hardware structure
|
|
* @hw: pointer to hardware structure
|
|
- * @dcb_config: pointer to ixgbe_dcb_config structure
|
|
|
|
|
|
+ * @rx_pba: method to distribute packet buffer
|
|
|
|
+ * @refill: refill credits index by traffic class
|
|
|
|
+ * @max: max credits index by traffic class
|
|
|
|
+ * @bwg_id: bandwidth grouping indexed by traffic class
|
|
|
|
+ * @prio_type: priority type indexed by traffic class
|
|
|
|
+ * @pfc_en: enabled pfc bitmask
|
|
*
|
|
*
|
|
* Configure dcb settings and enable dcb mode.
|
|
* Configure dcb settings and enable dcb mode.
|
|
*/
|
|
*/
|
|
s32 ixgbe_dcb_hw_config_82599(struct ixgbe_hw *hw,
|
|
s32 ixgbe_dcb_hw_config_82599(struct ixgbe_hw *hw,
|
|
- struct ixgbe_dcb_config *dcb_config)
|
|
|
|
|
|
+ u8 rx_pba, u8 pfc_en, u16 *refill,
|
|
|
|
+ u16 *max, u8 *bwg_id, u8 *prio_type)
|
|
{
|
|
{
|
|
- ixgbe_dcb_config_packet_buffers_82599(hw, dcb_config);
|
|
|
|
|
|
+ ixgbe_dcb_config_packet_buffers_82599(hw, rx_pba);
|
|
ixgbe_dcb_config_82599(hw);
|
|
ixgbe_dcb_config_82599(hw);
|
|
- ixgbe_dcb_config_rx_arbiter_82599(hw, dcb_config);
|
|
|
|
- ixgbe_dcb_config_tx_desc_arbiter_82599(hw, dcb_config);
|
|
|
|
- ixgbe_dcb_config_tx_data_arbiter_82599(hw, dcb_config);
|
|
|
|
- ixgbe_dcb_config_pfc_82599(hw, dcb_config);
|
|
|
|
|
|
+ ixgbe_dcb_config_rx_arbiter_82599(hw, refill, max, bwg_id, prio_type);
|
|
|
|
+ ixgbe_dcb_config_tx_desc_arbiter_82599(hw, refill, max,
|
|
|
|
+ bwg_id, prio_type);
|
|
|
|
+ ixgbe_dcb_config_tx_data_arbiter_82599(hw, refill, max,
|
|
|
|
+ bwg_id, prio_type);
|
|
|
|
+ ixgbe_dcb_config_pfc_82599(hw, pfc_en);
|
|
ixgbe_dcb_config_tc_stats_82599(hw);
|
|
ixgbe_dcb_config_tc_stats_82599(hw);
|
|
|
|
|
|
return 0;
|
|
return 0;
|