Commit d52c20b7 authored by Jesse Brandeburg's avatar Jesse Brandeburg Committed by Jeff Kirsher

i40e: init flow control settings to disabled

Refactor flow control set up and disable L2 flow
control by default.

Change-Id: I2fe257b80df6d9a1e37deb4df118da8f8467040d
Signed-off-by: default avatarJesse Brandeburg <jesse.brandeburg@intel.com>
Signed-off-by: default avatarAkeem G Abodunrin <akeem.g.abodunrin@intel.com>
Tested-by: default avatarKavindya Deegala <kavindya.s.deegala@intel.com>
Signed-off-by: default avatarJeff Kirsher <jeffrey.t.kirsher@intel.com>
parent 25946ddb
...@@ -276,12 +276,14 @@ static void i40e_get_pauseparam(struct net_device *netdev, ...@@ -276,12 +276,14 @@ static void i40e_get_pauseparam(struct net_device *netdev,
((hw_link_info->an_info & I40E_AQ_AN_COMPLETED) ? ((hw_link_info->an_info & I40E_AQ_AN_COMPLETED) ?
AUTONEG_ENABLE : AUTONEG_DISABLE); AUTONEG_ENABLE : AUTONEG_DISABLE);
pause->rx_pause = 0; if (hw->fc.current_mode == I40E_FC_RX_PAUSE) {
pause->tx_pause = 0;
if (hw_link_info->an_info & I40E_AQ_LINK_PAUSE_RX)
pause->rx_pause = 1; pause->rx_pause = 1;
if (hw_link_info->an_info & I40E_AQ_LINK_PAUSE_TX) } else if (hw->fc.current_mode == I40E_FC_TX_PAUSE) {
pause->tx_pause = 1; pause->tx_pause = 1;
} else if (hw->fc.current_mode == I40E_FC_FULL) {
pause->rx_pause = 1;
pause->tx_pause = 1;
}
} }
static u32 i40e_get_msglevel(struct net_device *netdev) static u32 i40e_get_msglevel(struct net_device *netdev)
......
...@@ -6911,6 +6911,7 @@ int i40e_fetch_switch_configuration(struct i40e_pf *pf, bool printconfig) ...@@ -6911,6 +6911,7 @@ int i40e_fetch_switch_configuration(struct i40e_pf *pf, bool printconfig)
**/ **/
static int i40e_setup_pf_switch(struct i40e_pf *pf) static int i40e_setup_pf_switch(struct i40e_pf *pf)
{ {
u32 rxfc, txfc, rxfc_reg;
int ret; int ret;
/* find out what's out there already */ /* find out what's out there already */
...@@ -6981,20 +6982,65 @@ static int i40e_setup_pf_switch(struct i40e_pf *pf) ...@@ -6981,20 +6982,65 @@ static int i40e_setup_pf_switch(struct i40e_pf *pf)
i40e_aq_get_link_info(&pf->hw, true, NULL, NULL); i40e_aq_get_link_info(&pf->hw, true, NULL, NULL);
i40e_link_event(pf); i40e_link_event(pf);
/* Initialize user-specifics link properties */ /* Initialize user-specific link properties */
pf->fc_autoneg_status = ((pf->hw.phy.link_info.an_info & pf->fc_autoneg_status = ((pf->hw.phy.link_info.an_info &
I40E_AQ_AN_COMPLETED) ? true : false); I40E_AQ_AN_COMPLETED) ? true : false);
pf->hw.fc.requested_mode = I40E_FC_DEFAULT; /* requested_mode is set in probe or by ethtool */
if (pf->hw.phy.link_info.an_info & if (!pf->fc_autoneg_status)
(I40E_AQ_LINK_PAUSE_TX | I40E_AQ_LINK_PAUSE_RX)) goto no_autoneg;
if ((pf->hw.phy.link_info.an_info & I40E_AQ_LINK_PAUSE_TX) &&
(pf->hw.phy.link_info.an_info & I40E_AQ_LINK_PAUSE_RX))
pf->hw.fc.current_mode = I40E_FC_FULL; pf->hw.fc.current_mode = I40E_FC_FULL;
else if (pf->hw.phy.link_info.an_info & I40E_AQ_LINK_PAUSE_TX) else if (pf->hw.phy.link_info.an_info & I40E_AQ_LINK_PAUSE_TX)
pf->hw.fc.current_mode = I40E_FC_TX_PAUSE; pf->hw.fc.current_mode = I40E_FC_TX_PAUSE;
else if (pf->hw.phy.link_info.an_info & I40E_AQ_LINK_PAUSE_RX) else if (pf->hw.phy.link_info.an_info & I40E_AQ_LINK_PAUSE_RX)
pf->hw.fc.current_mode = I40E_FC_RX_PAUSE; pf->hw.fc.current_mode = I40E_FC_RX_PAUSE;
else else
pf->hw.fc.current_mode = I40E_FC_DEFAULT; pf->hw.fc.current_mode = I40E_FC_NONE;
/* sync the flow control settings with the auto-neg values */
switch (pf->hw.fc.current_mode) {
case I40E_FC_FULL:
txfc = 1;
rxfc = 1;
break;
case I40E_FC_TX_PAUSE:
txfc = 1;
rxfc = 0;
break;
case I40E_FC_RX_PAUSE:
txfc = 0;
rxfc = 1;
break;
case I40E_FC_NONE:
case I40E_FC_DEFAULT:
txfc = 0;
rxfc = 0;
break;
case I40E_FC_PFC:
/* TBD */
break;
/* no default case, we have to handle all possibilities here */
}
wr32(&pf->hw, I40E_PRTDCB_FCCFG, txfc << I40E_PRTDCB_FCCFG_TFCE_SHIFT);
rxfc_reg = rd32(&pf->hw, I40E_PRTDCB_MFLCN) &
~I40E_PRTDCB_MFLCN_RFCE_MASK;
rxfc_reg |= (rxfc << I40E_PRTDCB_MFLCN_RFCE_SHIFT);
wr32(&pf->hw, I40E_PRTDCB_MFLCN, rxfc_reg);
goto fc_complete;
no_autoneg:
/* disable L2 flow control, user can turn it on if they wish */
wr32(&pf->hw, I40E_PRTDCB_FCCFG, 0);
wr32(&pf->hw, I40E_PRTDCB_MFLCN, rd32(&pf->hw, I40E_PRTDCB_MFLCN) &
~I40E_PRTDCB_MFLCN_RFCE_MASK);
fc_complete:
return ret; return ret;
} }
...@@ -7288,6 +7334,9 @@ static int i40e_probe(struct pci_dev *pdev, const struct pci_device_id *ent) ...@@ -7288,6 +7334,9 @@ static int i40e_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
goto err_pf_reset; goto err_pf_reset;
} }
/* set up a default setting for link flow control */
pf->hw.fc.requested_mode = I40E_FC_NONE;
err = i40e_init_adminq(hw); err = i40e_init_adminq(hw);
dev_info(&pdev->dev, "%s\n", i40e_fw_version_str(hw)); dev_info(&pdev->dev, "%s\n", i40e_fw_version_str(hw));
if (((hw->nvm.version & I40E_NVM_VERSION_HI_MASK) if (((hw->nvm.version & I40E_NVM_VERSION_HI_MASK)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment