Commit 4b7698cb authored by Neerav Parikh's avatar Neerav Parikh Committed by Jeff Kirsher

i40e: Prevent link flow control settings when PFC is enabled

When PFC is enabled we should not proceed with setting the link flow control
parameters.  Also, always report the link flow Tx/Rx settings as off when
PFC is enabled.

Change-ID: Ib09ec58afdf0b2e587ac9d8851a5c80ad58206c4
Signed-off-by: default avatarNeerav Parikh <neerav.parikh@intel.com>
Tested-By: default avatarJack Morgan <jack.morgan@intel.com>
Signed-off-by: default avatarJeff Kirsher <jeffrey.t.kirsher@intel.com>
parent d341b7a5
...@@ -644,11 +644,19 @@ static void i40e_get_pauseparam(struct net_device *netdev, ...@@ -644,11 +644,19 @@ static void i40e_get_pauseparam(struct net_device *netdev,
struct i40e_pf *pf = np->vsi->back; struct i40e_pf *pf = np->vsi->back;
struct i40e_hw *hw = &pf->hw; struct i40e_hw *hw = &pf->hw;
struct i40e_link_status *hw_link_info = &hw->phy.link_info; struct i40e_link_status *hw_link_info = &hw->phy.link_info;
struct i40e_dcbx_config *dcbx_cfg = &hw->local_dcbx_config;
pause->autoneg = pause->autoneg =
((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);
/* PFC enabled so report LFC as off */
if (dcbx_cfg->pfc.pfcenable) {
pause->rx_pause = 0;
pause->tx_pause = 0;
return;
}
if (hw->fc.current_mode == I40E_FC_RX_PAUSE) { if (hw->fc.current_mode == I40E_FC_RX_PAUSE) {
pause->rx_pause = 1; pause->rx_pause = 1;
} else if (hw->fc.current_mode == I40E_FC_TX_PAUSE) { } else if (hw->fc.current_mode == I40E_FC_TX_PAUSE) {
...@@ -672,6 +680,7 @@ static int i40e_set_pauseparam(struct net_device *netdev, ...@@ -672,6 +680,7 @@ static int i40e_set_pauseparam(struct net_device *netdev,
struct i40e_vsi *vsi = np->vsi; struct i40e_vsi *vsi = np->vsi;
struct i40e_hw *hw = &pf->hw; struct i40e_hw *hw = &pf->hw;
struct i40e_link_status *hw_link_info = &hw->phy.link_info; struct i40e_link_status *hw_link_info = &hw->phy.link_info;
struct i40e_dcbx_config *dcbx_cfg = &hw->local_dcbx_config;
bool link_up = hw_link_info->link_info & I40E_AQ_LINK_UP; bool link_up = hw_link_info->link_info & I40E_AQ_LINK_UP;
i40e_status status; i40e_status status;
u8 aq_failures; u8 aq_failures;
...@@ -693,8 +702,9 @@ static int i40e_set_pauseparam(struct net_device *netdev, ...@@ -693,8 +702,9 @@ static int i40e_set_pauseparam(struct net_device *netdev,
netdev_info(netdev, "Autoneg did not complete so changing settings may not result in an actual change.\n"); netdev_info(netdev, "Autoneg did not complete so changing settings may not result in an actual change.\n");
} }
if (hw->fc.current_mode == I40E_FC_PFC) { if (dcbx_cfg->pfc.pfcenable) {
netdev_info(netdev, "Priority flow control enabled. Cannot set link flow control.\n"); netdev_info(netdev,
"Priority flow control enabled. Cannot set link flow control.\n");
return -EOPNOTSUPP; return -EOPNOTSUPP;
} }
......
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