|
|
@@ -352,6 +352,7 @@ int phy_mii_ioctl(struct phy_device *phydev, struct ifreq *ifr, int cmd)
|
|
|
{
|
|
|
struct mii_ioctl_data *mii_data = if_mii(ifr);
|
|
|
u16 val = mii_data->val_in;
|
|
|
+ bool change_autoneg = false;
|
|
|
|
|
|
switch (cmd) {
|
|
|
case SIOCGMIIPHY:
|
|
|
@@ -367,22 +368,29 @@ int phy_mii_ioctl(struct phy_device *phydev, struct ifreq *ifr, int cmd)
|
|
|
if (mii_data->phy_id == phydev->addr) {
|
|
|
switch (mii_data->reg_num) {
|
|
|
case MII_BMCR:
|
|
|
- if ((val & (BMCR_RESET | BMCR_ANENABLE)) == 0)
|
|
|
+ if ((val & (BMCR_RESET | BMCR_ANENABLE)) == 0) {
|
|
|
+ if (phydev->autoneg == AUTONEG_ENABLE)
|
|
|
+ change_autoneg = true;
|
|
|
phydev->autoneg = AUTONEG_DISABLE;
|
|
|
- else
|
|
|
+ if (val & BMCR_FULLDPLX)
|
|
|
+ phydev->duplex = DUPLEX_FULL;
|
|
|
+ else
|
|
|
+ phydev->duplex = DUPLEX_HALF;
|
|
|
+ if (val & BMCR_SPEED1000)
|
|
|
+ phydev->speed = SPEED_1000;
|
|
|
+ else if (val & BMCR_SPEED100)
|
|
|
+ phydev->speed = SPEED_100;
|
|
|
+ else phydev->speed = SPEED_10;
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ if (phydev->autoneg == AUTONEG_DISABLE)
|
|
|
+ change_autoneg = true;
|
|
|
phydev->autoneg = AUTONEG_ENABLE;
|
|
|
- if (!phydev->autoneg && (val & BMCR_FULLDPLX))
|
|
|
- phydev->duplex = DUPLEX_FULL;
|
|
|
- else
|
|
|
- phydev->duplex = DUPLEX_HALF;
|
|
|
- if (!phydev->autoneg && (val & BMCR_SPEED1000))
|
|
|
- phydev->speed = SPEED_1000;
|
|
|
- else if (!phydev->autoneg &&
|
|
|
- (val & BMCR_SPEED100))
|
|
|
- phydev->speed = SPEED_100;
|
|
|
+ }
|
|
|
break;
|
|
|
case MII_ADVERTISE:
|
|
|
- phydev->advertising = val;
|
|
|
+ phydev->advertising = mii_adv_to_ethtool_adv_t(val);
|
|
|
+ change_autoneg = true;
|
|
|
break;
|
|
|
default:
|
|
|
/* do nothing */
|
|
|
@@ -396,6 +404,10 @@ int phy_mii_ioctl(struct phy_device *phydev, struct ifreq *ifr, int cmd)
|
|
|
if (mii_data->reg_num == MII_BMCR &&
|
|
|
val & BMCR_RESET)
|
|
|
return phy_init_hw(phydev);
|
|
|
+
|
|
|
+ if (change_autoneg)
|
|
|
+ return phy_start_aneg(phydev);
|
|
|
+
|
|
|
return 0;
|
|
|
|
|
|
case SIOCSHWTSTAMP:
|