Commit 40c3c546 authored by Lukasz Czapnik's avatar Lukasz Czapnik Committed by Jeff Kirsher

ice: Fix for FC get rx/tx pause params

Ethtool reported pause params based on the currently negotiated
link settings instead of current PHY config. User was not able
to turn off pause params because ethtool was incorrectly reporting
parameters as off when link was down even though PHY was configured
to support pause frames. Now pause params are taken from PHY config
instead of link status.
Signed-off-by: default avatarLukasz Czapnik <lukasz.czapnik@intel.com>
Signed-off-by: default avatarAnirudh Venkataramanan <anirudh.venkataramanan@intel.com>
Tested-by: default avatarAndrew Bowers <andrewx.bowers@intel.com>
Signed-off-by: default avatarJeff Kirsher <jeffrey.t.kirsher@intel.com>
parent f966127a
...@@ -1818,21 +1818,36 @@ static void ...@@ -1818,21 +1818,36 @@ static void
ice_get_pauseparam(struct net_device *netdev, struct ethtool_pauseparam *pause) ice_get_pauseparam(struct net_device *netdev, struct ethtool_pauseparam *pause)
{ {
struct ice_netdev_priv *np = netdev_priv(netdev); struct ice_netdev_priv *np = netdev_priv(netdev);
struct ice_port_info *pi; struct ice_port_info *pi = np->vsi->port_info;
struct ice_aqc_get_phy_caps_data *pcaps;
struct ice_vsi *vsi = np->vsi;
enum ice_status status;
/* Initialize pause params */
pause->rx_pause = 0;
pause->tx_pause = 0;
pi = np->vsi->port_info; pcaps = devm_kzalloc(&vsi->back->pdev->dev, sizeof(*pcaps),
pause->autoneg = GFP_KERNEL);
((pi->phy.link_info.an_info & ICE_AQ_AN_COMPLETED) ? if (!pcaps)
return;
/* Get current phy config */
status = ice_aq_get_phy_caps(pi, false, ICE_AQC_REPORT_SW_CFG, pcaps,
NULL);
if (status)
goto out;
pause->autoneg = ((pcaps->caps & ICE_AQC_PHY_AN_MODE) ?
AUTONEG_ENABLE : AUTONEG_DISABLE); AUTONEG_ENABLE : AUTONEG_DISABLE);
if (pi->fc.current_mode == ICE_FC_RX_PAUSE) { if (pcaps->caps & ICE_AQC_PHY_EN_TX_LINK_PAUSE)
pause->rx_pause = 1;
} else if (pi->fc.current_mode == ICE_FC_TX_PAUSE) {
pause->tx_pause = 1; pause->tx_pause = 1;
} else if (pi->fc.current_mode == ICE_FC_FULL) { if (pcaps->caps & ICE_AQC_PHY_EN_RX_LINK_PAUSE)
pause->rx_pause = 1; pause->rx_pause = 1;
pause->tx_pause = 1;
} out:
devm_kfree(&vsi->back->pdev->dev, pcaps);
} }
/** /**
......
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