@@ -1069,27 +1069,35 @@ EXPORT_SYMBOL(phy_ethtool_ksettings_set);
1069
1069
int phy_speed_down (struct phy_device * phydev , bool sync )
1070
1070
{
1071
1071
__ETHTOOL_DECLARE_LINK_MODE_MASK (adv_tmp );
1072
- int ret ;
1072
+ int ret = 0 ;
1073
+
1074
+ mutex_lock (& phydev -> lock );
1073
1075
1074
1076
if (phydev -> autoneg != AUTONEG_ENABLE )
1075
- return 0 ;
1077
+ goto out ;
1076
1078
1077
1079
linkmode_copy (adv_tmp , phydev -> advertising );
1078
1080
1079
1081
ret = phy_speed_down_core (phydev );
1080
1082
if (ret )
1081
- return ret ;
1083
+ goto out ;
1082
1084
1083
1085
linkmode_copy (phydev -> adv_old , adv_tmp );
1084
1086
1085
- if (linkmode_equal (phydev -> advertising , adv_tmp ))
1086
- return 0 ;
1087
+ if (linkmode_equal (phydev -> advertising , adv_tmp )) {
1088
+ ret = 0 ;
1089
+ goto out ;
1090
+ }
1087
1091
1088
1092
ret = phy_config_aneg (phydev );
1089
1093
if (ret )
1090
- return ret ;
1094
+ goto out ;
1095
+
1096
+ ret = sync ? phy_poll_aneg_done (phydev ) : 0 ;
1097
+ out :
1098
+ mutex_unlock (& phydev -> lock );
1091
1099
1092
- return sync ? phy_poll_aneg_done ( phydev ) : 0 ;
1100
+ return ret ;
1093
1101
}
1094
1102
EXPORT_SYMBOL_GPL (phy_speed_down );
1095
1103
@@ -1102,21 +1110,28 @@ EXPORT_SYMBOL_GPL(phy_speed_down);
1102
1110
int phy_speed_up (struct phy_device * phydev )
1103
1111
{
1104
1112
__ETHTOOL_DECLARE_LINK_MODE_MASK (adv_tmp );
1113
+ int ret = 0 ;
1114
+
1115
+ mutex_lock (& phydev -> lock );
1105
1116
1106
1117
if (phydev -> autoneg != AUTONEG_ENABLE )
1107
- return 0 ;
1118
+ goto out ;
1108
1119
1109
1120
if (linkmode_empty (phydev -> adv_old ))
1110
- return 0 ;
1121
+ goto out ;
1111
1122
1112
1123
linkmode_copy (adv_tmp , phydev -> advertising );
1113
1124
linkmode_copy (phydev -> advertising , phydev -> adv_old );
1114
1125
linkmode_zero (phydev -> adv_old );
1115
1126
1116
1127
if (linkmode_equal (phydev -> advertising , adv_tmp ))
1117
- return 0 ;
1128
+ goto out ;
1129
+
1130
+ ret = phy_config_aneg (phydev );
1131
+ out :
1132
+ mutex_unlock (& phydev -> lock );
1118
1133
1119
- return phy_config_aneg ( phydev ) ;
1134
+ return ret ;
1120
1135
}
1121
1136
EXPORT_SYMBOL_GPL (phy_speed_up );
1122
1137
@@ -1500,10 +1515,16 @@ EXPORT_SYMBOL(phy_init_eee);
1500
1515
*/
1501
1516
int phy_get_eee_err (struct phy_device * phydev )
1502
1517
{
1518
+ int ret ;
1519
+
1503
1520
if (!phydev -> drv )
1504
1521
return - EIO ;
1505
1522
1506
- return phy_read_mmd (phydev , MDIO_MMD_PCS , MDIO_PCS_EEE_WK_ERR );
1523
+ mutex_lock (& phydev -> lock );
1524
+ ret = phy_read_mmd (phydev , MDIO_MMD_PCS , MDIO_PCS_EEE_WK_ERR );
1525
+ mutex_unlock (& phydev -> lock );
1526
+
1527
+ return ret ;
1507
1528
}
1508
1529
EXPORT_SYMBOL (phy_get_eee_err );
1509
1530
@@ -1517,10 +1538,16 @@ EXPORT_SYMBOL(phy_get_eee_err);
1517
1538
*/
1518
1539
int phy_ethtool_get_eee (struct phy_device * phydev , struct ethtool_eee * data )
1519
1540
{
1541
+ int ret ;
1542
+
1520
1543
if (!phydev -> drv )
1521
1544
return - EIO ;
1522
1545
1523
- return genphy_c45_ethtool_get_eee (phydev , data );
1546
+ mutex_lock (& phydev -> lock );
1547
+ ret = genphy_c45_ethtool_get_eee (phydev , data );
1548
+ mutex_unlock (& phydev -> lock );
1549
+
1550
+ return ret ;
1524
1551
}
1525
1552
EXPORT_SYMBOL (phy_ethtool_get_eee );
1526
1553
@@ -1533,10 +1560,16 @@ EXPORT_SYMBOL(phy_ethtool_get_eee);
1533
1560
*/
1534
1561
int phy_ethtool_set_eee (struct phy_device * phydev , struct ethtool_eee * data )
1535
1562
{
1563
+ int ret ;
1564
+
1536
1565
if (!phydev -> drv )
1537
1566
return - EIO ;
1538
1567
1539
- return genphy_c45_ethtool_set_eee (phydev , data );
1568
+ mutex_lock (& phydev -> lock );
1569
+ ret = genphy_c45_ethtool_set_eee (phydev , data );
1570
+ mutex_unlock (& phydev -> lock );
1571
+
1572
+ return ret ;
1540
1573
}
1541
1574
EXPORT_SYMBOL (phy_ethtool_set_eee );
1542
1575
@@ -1548,8 +1581,15 @@ EXPORT_SYMBOL(phy_ethtool_set_eee);
1548
1581
*/
1549
1582
int phy_ethtool_set_wol (struct phy_device * phydev , struct ethtool_wolinfo * wol )
1550
1583
{
1551
- if (phydev -> drv && phydev -> drv -> set_wol )
1552
- return phydev -> drv -> set_wol (phydev , wol );
1584
+ int ret ;
1585
+
1586
+ if (phydev -> drv && phydev -> drv -> set_wol ) {
1587
+ mutex_lock (& phydev -> lock );
1588
+ ret = phydev -> drv -> set_wol (phydev , wol );
1589
+ mutex_unlock (& phydev -> lock );
1590
+
1591
+ return ret ;
1592
+ }
1553
1593
1554
1594
return - EOPNOTSUPP ;
1555
1595
}
@@ -1563,8 +1603,11 @@ EXPORT_SYMBOL(phy_ethtool_set_wol);
1563
1603
*/
1564
1604
void phy_ethtool_get_wol (struct phy_device * phydev , struct ethtool_wolinfo * wol )
1565
1605
{
1566
- if (phydev -> drv && phydev -> drv -> get_wol )
1606
+ if (phydev -> drv && phydev -> drv -> get_wol ) {
1607
+ mutex_lock (& phydev -> lock );
1567
1608
phydev -> drv -> get_wol (phydev , wol );
1609
+ mutex_unlock (& phydev -> lock );
1610
+ }
1568
1611
}
1569
1612
EXPORT_SYMBOL (phy_ethtool_get_wol );
1570
1613
@@ -1601,13 +1644,18 @@ EXPORT_SYMBOL(phy_ethtool_set_link_ksettings);
1601
1644
int phy_ethtool_nway_reset (struct net_device * ndev )
1602
1645
{
1603
1646
struct phy_device * phydev = ndev -> phydev ;
1647
+ int ret ;
1604
1648
1605
1649
if (!phydev )
1606
1650
return - ENODEV ;
1607
1651
1608
1652
if (!phydev -> drv )
1609
1653
return - EIO ;
1610
1654
1611
- return phy_restart_aneg (phydev );
1655
+ mutex_lock (& phydev -> lock );
1656
+ ret = phy_restart_aneg (phydev );
1657
+ mutex_unlock (& phydev -> lock );
1658
+
1659
+ return ret ;
1612
1660
}
1613
1661
EXPORT_SYMBOL (phy_ethtool_nway_reset );
0 commit comments