Skip to content

Commit 2aca31e

Browse files
Stephen Hemmingerdavem330
authored andcommitted
sky2: fix limited auto negotiation
The sky2 driver would always try all possible supported speeds even if the user only asked for a limited set of speed/duplex combinations. Reported-by: Mohsen Hariri <[email protected]> Signed-off-by: Stephen Hemminger <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 9bcb801 commit 2aca31e

File tree

1 file changed

+17
-9
lines changed

1 file changed

+17
-9
lines changed

drivers/net/sky2.c

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3411,18 +3411,15 @@ static u32 sky2_supported_modes(const struct sky2_hw *hw)
34113411
u32 modes = SUPPORTED_10baseT_Half
34123412
| SUPPORTED_10baseT_Full
34133413
| SUPPORTED_100baseT_Half
3414-
| SUPPORTED_100baseT_Full
3415-
| SUPPORTED_Autoneg | SUPPORTED_TP;
3414+
| SUPPORTED_100baseT_Full;
34163415

34173416
if (hw->flags & SKY2_HW_GIGABIT)
34183417
modes |= SUPPORTED_1000baseT_Half
34193418
| SUPPORTED_1000baseT_Full;
34203419
return modes;
34213420
} else
3422-
return SUPPORTED_1000baseT_Half
3423-
| SUPPORTED_1000baseT_Full
3424-
| SUPPORTED_Autoneg
3425-
| SUPPORTED_FIBRE;
3421+
return SUPPORTED_1000baseT_Half
3422+
| SUPPORTED_1000baseT_Full;
34263423
}
34273424

34283425
static int sky2_get_settings(struct net_device *dev, struct ethtool_cmd *ecmd)
@@ -3436,9 +3433,11 @@ static int sky2_get_settings(struct net_device *dev, struct ethtool_cmd *ecmd)
34363433
if (sky2_is_copper(hw)) {
34373434
ecmd->port = PORT_TP;
34383435
ecmd->speed = sky2->speed;
3436+
ecmd->supported |= SUPPORTED_Autoneg | SUPPORTED_TP;
34393437
} else {
34403438
ecmd->speed = SPEED_1000;
34413439
ecmd->port = PORT_FIBRE;
3440+
ecmd->supported |= SUPPORTED_Autoneg | SUPPORTED_FIBRE;
34423441
}
34433442

34443443
ecmd->advertising = sky2->advertising;
@@ -3455,8 +3454,19 @@ static int sky2_set_settings(struct net_device *dev, struct ethtool_cmd *ecmd)
34553454
u32 supported = sky2_supported_modes(hw);
34563455

34573456
if (ecmd->autoneg == AUTONEG_ENABLE) {
3457+
if (ecmd->advertising & ~supported)
3458+
return -EINVAL;
3459+
3460+
if (sky2_is_copper(hw))
3461+
sky2->advertising = ecmd->advertising |
3462+
ADVERTISED_TP |
3463+
ADVERTISED_Autoneg;
3464+
else
3465+
sky2->advertising = ecmd->advertising |
3466+
ADVERTISED_FIBRE |
3467+
ADVERTISED_Autoneg;
3468+
34583469
sky2->flags |= SKY2_FLAG_AUTO_SPEED;
3459-
ecmd->advertising = supported;
34603470
sky2->duplex = -1;
34613471
sky2->speed = -1;
34623472
} else {
@@ -3500,8 +3510,6 @@ static int sky2_set_settings(struct net_device *dev, struct ethtool_cmd *ecmd)
35003510
sky2->flags &= ~SKY2_FLAG_AUTO_SPEED;
35013511
}
35023512

3503-
sky2->advertising = ecmd->advertising;
3504-
35053513
if (netif_running(dev)) {
35063514
sky2_phy_reinit(sky2);
35073515
sky2_set_multicast(dev);

0 commit comments

Comments
 (0)