From: Chuanhong Guo Date: Sun, 2 Aug 2020 05:00:57 +0000 (+0800) Subject: more lock X-Git-Url: http://git.openwrt.org/?a=commitdiff_plain;h=d5b82f3ad86d7ce78d2ed1a04a1d67041653552f;p=openwrt%2Fstaging%2F981213.git more lock --- diff --git a/target/linux/generic/files/drivers/net/phy/ar8216.c b/target/linux/generic/files/drivers/net/phy/ar8216.c index ef71b94bd0..7c0745c8a6 100644 --- a/target/linux/generic/files/drivers/net/phy/ar8216.c +++ b/target/linux/generic/files/drivers/net/phy/ar8216.c @@ -224,6 +224,7 @@ ar8xxx_mii_read32(struct ar8xxx_priv *priv, int phy_id, int regnum) { struct mii_bus *bus = priv->mii_bus; u16 lo, hi; + lockdep_assert_held(&priv->reg_mutex); lo = bus->read(bus, phy_id, regnum); hi = bus->read(bus, phy_id, regnum + 1); @@ -236,6 +237,7 @@ ar8xxx_mii_write32(struct ar8xxx_priv *priv, int phy_id, int regnum, u32 val) { struct mii_bus *bus = priv->mii_bus; u16 lo, hi; + lockdep_assert_held(&priv->reg_mutex); lo = val & 0xffff; hi = (u16) (val >> 16); @@ -472,7 +474,10 @@ ar8216_read_port_link(struct ar8xxx_priv *priv, int port, memset(link, '\0', sizeof(*link)); + mutex_lock(&priv->reg_mutex); status = priv->chip->read_port_status(priv, port); + mutex_unlock(&priv->reg_mutex); + cond_resched(); link->aneg = !!(status & AR8216_PORT_STATUS_LINK_AUTO); if (link->aneg) { @@ -496,8 +501,11 @@ ar8216_read_port_link(struct ar8xxx_priv *priv, int port, link->tx_flow = !!(status & AR8216_PORT_STATUS_TXFLOW); link->rx_flow = !!(status & AR8216_PORT_STATUS_RXFLOW); - if (link->aneg && link->duplex && priv->chip->read_port_eee_status) + if (link->aneg && link->duplex && priv->chip->read_port_eee_status) { + mutex_lock(&priv->reg_mutex); link->eee = priv->chip->read_port_eee_status(priv, port); + mutex_unlock(&priv->reg_mutex); + } speed = (status & AR8216_PORT_STATUS_SPEED) >> AR8216_PORT_STATUS_SPEED_S;