aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/net/mv643xx_eth.c23
1 files changed, 7 insertions, 16 deletions
diff --git a/drivers/net/mv643xx_eth.c b/drivers/net/mv643xx_eth.c
index 2f6cec4e8499..2d434017a670 100644
--- a/drivers/net/mv643xx_eth.c
+++ b/drivers/net/mv643xx_eth.c
@@ -251,7 +251,7 @@ struct mv643xx_eth_shared_private {
251 /* 251 /*
252 * Protects access to SMI_REG, which is shared between ports. 252 * Protects access to SMI_REG, which is shared between ports.
253 */ 253 */
254 spinlock_t phy_lock; 254 struct mutex phy_lock;
255 255
256 /* 256 /*
257 * Per-port MBUS window access register value. 257 * Per-port MBUS window access register value.
@@ -988,11 +988,10 @@ static void smi_reg_read(struct mv643xx_eth_private *mp, unsigned int addr,
988 unsigned int reg, unsigned int *value) 988 unsigned int reg, unsigned int *value)
989{ 989{
990 void __iomem *smi_reg = mp->shared_smi->base + SMI_REG; 990 void __iomem *smi_reg = mp->shared_smi->base + SMI_REG;
991 unsigned long flags;
992 int i; 991 int i;
993 992
994 /* the SMI register is a shared resource */ 993 /* the SMI register is a shared resource */
995 spin_lock_irqsave(&mp->shared_smi->phy_lock, flags); 994 mutex_lock(&mp->shared_smi->phy_lock);
996 995
997 /* wait for the SMI register to become available */ 996 /* wait for the SMI register to become available */
998 for (i = 0; readl(smi_reg) & SMI_BUSY; i++) { 997 for (i = 0; readl(smi_reg) & SMI_BUSY; i++) {
@@ -1016,7 +1015,7 @@ static void smi_reg_read(struct mv643xx_eth_private *mp, unsigned int addr,
1016 1015
1017 *value = readl(smi_reg) & 0xffff; 1016 *value = readl(smi_reg) & 0xffff;
1018out: 1017out:
1019 spin_unlock_irqrestore(&mp->shared_smi->phy_lock, flags); 1018 mutex_unlock(&mp->shared_smi->phy_lock);
1020} 1019}
1021 1020
1022static void smi_reg_write(struct mv643xx_eth_private *mp, 1021static void smi_reg_write(struct mv643xx_eth_private *mp,
@@ -1024,11 +1023,10 @@ static void smi_reg_write(struct mv643xx_eth_private *mp,
1024 unsigned int reg, unsigned int value) 1023 unsigned int reg, unsigned int value)
1025{ 1024{
1026 void __iomem *smi_reg = mp->shared_smi->base + SMI_REG; 1025 void __iomem *smi_reg = mp->shared_smi->base + SMI_REG;
1027 unsigned long flags;
1028 int i; 1026 int i;
1029 1027
1030 /* the SMI register is a shared resource */ 1028 /* the SMI register is a shared resource */
1031 spin_lock_irqsave(&mp->shared_smi->phy_lock, flags); 1029 mutex_lock(&mp->shared_smi->phy_lock);
1032 1030
1033 /* wait for the SMI register to become available */ 1031 /* wait for the SMI register to become available */
1034 for (i = 0; readl(smi_reg) & SMI_BUSY; i++) { 1032 for (i = 0; readl(smi_reg) & SMI_BUSY; i++) {
@@ -1042,7 +1040,7 @@ static void smi_reg_write(struct mv643xx_eth_private *mp,
1042 writel(SMI_OPCODE_WRITE | (reg << 21) | 1040 writel(SMI_OPCODE_WRITE | (reg << 21) |
1043 (addr << 16) | (value & 0xffff), smi_reg); 1041 (addr << 16) | (value & 0xffff), smi_reg);
1044out: 1042out:
1045 spin_unlock_irqrestore(&mp->shared_smi->phy_lock, flags); 1043 mutex_unlock(&mp->shared_smi->phy_lock);
1046} 1044}
1047 1045
1048 1046
@@ -1161,9 +1159,7 @@ static int mv643xx_eth_get_settings(struct net_device *dev, struct ethtool_cmd *
1161 struct mv643xx_eth_private *mp = netdev_priv(dev); 1159 struct mv643xx_eth_private *mp = netdev_priv(dev);
1162 int err; 1160 int err;
1163 1161
1164 spin_lock_irq(&mp->lock);
1165 err = mii_ethtool_gset(&mp->mii, cmd); 1162 err = mii_ethtool_gset(&mp->mii, cmd);
1166 spin_unlock_irq(&mp->lock);
1167 1163
1168 /* 1164 /*
1169 * The MAC does not support 1000baseT_Half. 1165 * The MAC does not support 1000baseT_Half.
@@ -1211,18 +1207,13 @@ static int mv643xx_eth_get_settings_phyless(struct net_device *dev, struct ethto
1211static int mv643xx_eth_set_settings(struct net_device *dev, struct ethtool_cmd *cmd) 1207static int mv643xx_eth_set_settings(struct net_device *dev, struct ethtool_cmd *cmd)
1212{ 1208{
1213 struct mv643xx_eth_private *mp = netdev_priv(dev); 1209 struct mv643xx_eth_private *mp = netdev_priv(dev);
1214 int err;
1215 1210
1216 /* 1211 /*
1217 * The MAC does not support 1000baseT_Half. 1212 * The MAC does not support 1000baseT_Half.
1218 */ 1213 */
1219 cmd->advertising &= ~ADVERTISED_1000baseT_Half; 1214 cmd->advertising &= ~ADVERTISED_1000baseT_Half;
1220 1215
1221 spin_lock_irq(&mp->lock); 1216 return mii_ethtool_sset(&mp->mii, cmd);
1222 err = mii_ethtool_sset(&mp->mii, cmd);
1223 spin_unlock_irq(&mp->lock);
1224
1225 return err;
1226} 1217}
1227 1218
1228static int mv643xx_eth_set_settings_phyless(struct net_device *dev, struct ethtool_cmd *cmd) 1219static int mv643xx_eth_set_settings_phyless(struct net_device *dev, struct ethtool_cmd *cmd)
@@ -2324,7 +2315,7 @@ static int mv643xx_eth_shared_probe(struct platform_device *pdev)
2324 if (msp->base == NULL) 2315 if (msp->base == NULL)
2325 goto out_free; 2316 goto out_free;
2326 2317
2327 spin_lock_init(&msp->phy_lock); 2318 mutex_init(&msp->phy_lock);
2328 2319
2329 /* 2320 /*
2330 * (Re-)program MBUS remapping windows if we are asked to. 2321 * (Re-)program MBUS remapping windows if we are asked to.