mirror of
https://github.com/torvalds/linux.git
synced 2024-11-10 22:21:40 +00:00
ice: fix set pause param autoneg check
When ETHTOOL_GLINKSETTINGS is defined get pause param pause->autoneg reports SW configured setting, however when not defined get pause param pause->autoneg reports the link status. Set pause param needs to compare pause->autoneg with the same source as get pause param to block the user from changing autoneg with the set pause param option, or the user may be incorrectly blocked from changing Rx|Tx pause settings. Signed-off-by: Paul Greenwalt <paul.greenwalt@intel.com> Tested-by: Andrew Bowers <andrewx.bowers@intel.com> Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
This commit is contained in:
parent
d82dd83df2
commit
f1a4a66d23
@ -2856,6 +2856,7 @@ static int
|
||||
ice_set_pauseparam(struct net_device *netdev, struct ethtool_pauseparam *pause)
|
||||
{
|
||||
struct ice_netdev_priv *np = netdev_priv(netdev);
|
||||
struct ice_aqc_get_phy_caps_data *pcaps;
|
||||
struct ice_link_status *hw_link_info;
|
||||
struct ice_pf *pf = np->vsi->back;
|
||||
struct ice_dcbx_cfg *dcbx_cfg;
|
||||
@ -2866,6 +2867,7 @@ ice_set_pauseparam(struct net_device *netdev, struct ethtool_pauseparam *pause)
|
||||
u8 aq_failures;
|
||||
bool link_up;
|
||||
int err = 0;
|
||||
u32 is_an;
|
||||
|
||||
pi = vsi->port_info;
|
||||
hw_link_info = &pi->phy.link_info;
|
||||
@ -2880,7 +2882,30 @@ ice_set_pauseparam(struct net_device *netdev, struct ethtool_pauseparam *pause)
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
if (pause->autoneg != (hw_link_info->an_info & ICE_AQ_AN_COMPLETED)) {
|
||||
/* Get pause param reports configured and negotiated flow control pause
|
||||
* when ETHTOOL_GLINKSETTINGS is defined. Since ETHTOOL_GLINKSETTINGS is
|
||||
* defined get pause param pause->autoneg reports SW configured setting,
|
||||
* so compare pause->autoneg with SW configured to prevent the user from
|
||||
* using set pause param to chance autoneg.
|
||||
*/
|
||||
pcaps = kzalloc(sizeof(*pcaps), GFP_KERNEL);
|
||||
if (!pcaps)
|
||||
return -ENOMEM;
|
||||
|
||||
/* Get current PHY config */
|
||||
status = ice_aq_get_phy_caps(pi, false, ICE_AQC_REPORT_SW_CFG, pcaps,
|
||||
NULL);
|
||||
if (status) {
|
||||
kfree(pcaps);
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
is_an = ((pcaps->caps & ICE_AQC_PHY_AN_MODE) ?
|
||||
AUTONEG_ENABLE : AUTONEG_DISABLE);
|
||||
|
||||
kfree(pcaps);
|
||||
|
||||
if (pause->autoneg != is_an) {
|
||||
netdev_info(netdev, "To change autoneg please use: ethtool -s <dev> autoneg <on|off>\n");
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user