Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 97876fc6 authored by Malli Chilakala's avatar Malli Chilakala Committed by Jeff Garzik
Browse files

[PATCH] e1000: Synchronize phy access between stats update and MII_IOCTL



Synchronize phy access between stats update and MII_IOCTL

Signed-off-by: default avatarMallikarjuna R Chilakala <mallikarjuna.chilakala@intel.com>
Signed-off-by: default avatarGanesh Venkatesan <ganesh.venkatesan@intel.com>
Signed-off-by: default avatarJohn Ronciak <john.ronciak@intel.com>
parent 0685c31b
Loading
Loading
Loading
Loading
+26 −10
Original line number Diff line number Diff line
@@ -3376,6 +3376,7 @@ e1000_mii_ioctl(struct net_device *netdev, struct ifreq *ifr, int cmd)
	int retval;
	uint16_t mii_reg;
	uint16_t spddplx;
	unsigned long flags;

	if(adapter->hw.media_type != e1000_media_type_copper)
		return -EOPNOTSUPP;
@@ -3387,9 +3388,13 @@ e1000_mii_ioctl(struct net_device *netdev, struct ifreq *ifr, int cmd)
	case SIOCGMIIREG:
		if(!capable(CAP_NET_ADMIN))
			return -EPERM;
		spin_lock_irqsave(&adapter->stats_lock, flags);
		if(e1000_read_phy_reg(&adapter->hw, data->reg_num & 0x1F,
				   &data->val_out))
				   &data->val_out)) {
			spin_unlock_irqrestore(&adapter->stats_lock, flags);
			return -EIO;
		}
		spin_unlock_irqrestore(&adapter->stats_lock, flags);
		break;
	case SIOCSMIIREG:
		if(!capable(CAP_NET_ADMIN))
@@ -3397,9 +3402,12 @@ e1000_mii_ioctl(struct net_device *netdev, struct ifreq *ifr, int cmd)
		if(data->reg_num & ~(0x1F))
			return -EFAULT;
		mii_reg = data->val_in;
		spin_lock_irqsave(&adapter->stats_lock, flags);
		if(e1000_write_phy_reg(&adapter->hw, data->reg_num,
					mii_reg))
					mii_reg)) {
			spin_unlock_irqrestore(&adapter->stats_lock, flags);
			return -EIO;
		}
		if(adapter->hw.phy_type == e1000_phy_m88) {
			switch (data->reg_num) {
			case PHY_CTRL:
@@ -3420,9 +3428,13 @@ e1000_mii_ioctl(struct net_device *netdev, struct ifreq *ifr, int cmd)
						   HALF_DUPLEX;
					retval = e1000_set_spd_dplx(adapter,
								    spddplx);
					if(retval)
					if(retval) {
						spin_unlock_irqrestore(
							&adapter->stats_lock, 
							flags);
						return retval;
					}
				}
				if(netif_running(adapter->netdev)) {
					e1000_down(adapter);
					e1000_up(adapter);
@@ -3431,8 +3443,11 @@ e1000_mii_ioctl(struct net_device *netdev, struct ifreq *ifr, int cmd)
				break;
			case M88E1000_PHY_SPEC_CTRL:
			case M88E1000_EXT_PHY_SPEC_CTRL:
				if (e1000_phy_reset(&adapter->hw))
				if(e1000_phy_reset(&adapter->hw)) {
					spin_unlock_irqrestore(
						&adapter->stats_lock, flags);
					return -EIO;
				}
				break;
			}
		} else {
@@ -3448,6 +3463,7 @@ e1000_mii_ioctl(struct net_device *netdev, struct ifreq *ifr, int cmd)
				break;
			}
		}
		spin_unlock_irqrestore(&adapter->stats_lock, flags);
		break;
	default:
		return -EOPNOTSUPP;