Commit ea962fa1 authored by Mitch Williams's avatar Mitch Williams Committed by Greg Kroah-Hartman

i40e: don't restart nway if autoneg not supported

[ Upstream commit 7c3758f7 ]

On link types that do not support autoneg, we cannot attempt to restart
nway negotiation. This results in a dead link that requires a power
cycle to remedy.

Fix this by saving off the autoneg state and checking this value before
we try to restart nway.
Signed-off-by: default avatarMitch Williams <mitch.a.williams@intel.com>
Tested-by: default avatarAndrew Bowers <andrewx.bowers@intel.com>
Signed-off-by: default avatarJeff Kirsher <jeffrey.t.kirsher@intel.com>
Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
parent 2538bbb0
...@@ -1136,6 +1136,7 @@ static int i40e_set_pauseparam(struct net_device *netdev, ...@@ -1136,6 +1136,7 @@ static int i40e_set_pauseparam(struct net_device *netdev,
i40e_status status; i40e_status status;
u8 aq_failures; u8 aq_failures;
int err = 0; int err = 0;
u32 is_an;
/* Changing the port's flow control is not supported if this isn't the /* Changing the port's flow control is not supported if this isn't the
* port's controlling PF * port's controlling PF
...@@ -1148,15 +1149,14 @@ static int i40e_set_pauseparam(struct net_device *netdev, ...@@ -1148,15 +1149,14 @@ static int i40e_set_pauseparam(struct net_device *netdev,
if (vsi != pf->vsi[pf->lan_vsi]) if (vsi != pf->vsi[pf->lan_vsi])
return -EOPNOTSUPP; return -EOPNOTSUPP;
if (pause->autoneg != ((hw_link_info->an_info & I40E_AQ_AN_COMPLETED) ? is_an = hw_link_info->an_info & I40E_AQ_AN_COMPLETED;
AUTONEG_ENABLE : AUTONEG_DISABLE)) { if (pause->autoneg != is_an) {
netdev_info(netdev, "To change autoneg please use: ethtool -s <dev> autoneg <on|off>\n"); netdev_info(netdev, "To change autoneg please use: ethtool -s <dev> autoneg <on|off>\n");
return -EOPNOTSUPP; return -EOPNOTSUPP;
} }
/* If we have link and don't have autoneg */ /* If we have link and don't have autoneg */
if (!test_bit(__I40E_DOWN, pf->state) && if (!test_bit(__I40E_DOWN, pf->state) && !is_an) {
!(hw_link_info->an_info & I40E_AQ_AN_COMPLETED)) {
/* Send message that it might not necessarily work*/ /* Send message that it might not necessarily work*/
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");
} }
...@@ -1207,7 +1207,7 @@ static int i40e_set_pauseparam(struct net_device *netdev, ...@@ -1207,7 +1207,7 @@ static int i40e_set_pauseparam(struct net_device *netdev,
err = -EAGAIN; err = -EAGAIN;
} }
if (!test_bit(__I40E_DOWN, pf->state)) { if (!test_bit(__I40E_DOWN, pf->state) && is_an) {
/* Give it a little more time to try to come back */ /* Give it a little more time to try to come back */
msleep(75); msleep(75);
if (!test_bit(__I40E_DOWN, pf->state)) if (!test_bit(__I40E_DOWN, pf->state))
......
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