X-Git-Url: https://git.rohieb.name/openwrt.git/blobdiff_plain/9044daabf76946a3e02bfbe33920796f5a495136..86b5f9e15f37d932d9bba3b7ef81ade0085c40dd:/target/linux/generic/files/drivers/net/phy/ar8216.c?ds=inline diff --git a/target/linux/generic/files/drivers/net/phy/ar8216.c b/target/linux/generic/files/drivers/net/phy/ar8216.c index ba9bca03d..ffa561b36 100644 --- a/target/linux/generic/files/drivers/net/phy/ar8216.c +++ b/target/linux/generic/files/drivers/net/phy/ar8216.c @@ -29,6 +29,7 @@ #include #include #include +#include #include "ar8216.h" /* size of the vlan table */ @@ -86,7 +87,7 @@ ar8216_mii_read(struct ar8216_priv *priv, int reg) mutex_lock(&bus->mdio_lock); bus->write(bus, 0x18, 0, page); - msleep(1); /* wait for the page switch to propagate */ + usleep_range(1000, 2000); /* wait for the page switch to propagate */ lo = bus->read(bus, 0x10 | r2, r1); hi = bus->read(bus, 0x10 | r2, r1 + 1); @@ -110,18 +111,32 @@ ar8216_mii_write(struct ar8216_priv *priv, int reg, u32 val) mutex_lock(&bus->mdio_lock); bus->write(bus, 0x18, 0, r3); - msleep(1); /* wait for the page switch to propagate */ + usleep_range(1000, 2000); /* wait for the page switch to propagate */ bus->write(bus, 0x10 | r2, r1 + 1, hi); bus->write(bus, 0x10 | r2, r1, lo); mutex_unlock(&bus->mdio_lock); } +static void +ar8216_phy_dbg_write(struct ar8216_priv *priv, int phy_addr, + u16 dbg_addr, u16 dbg_data) +{ + struct mii_bus *bus = priv->phy->bus; + + mutex_lock(&bus->mdio_lock); + bus->write(bus, phy_addr, MII_ATH_DBG_ADDR, dbg_addr); + bus->write(bus, phy_addr, MII_ATH_DBG_DATA, dbg_data); + mutex_unlock(&bus->mdio_lock); +} + static u32 ar8216_rmw(struct ar8216_priv *priv, int reg, u32 mask, u32 val) { u32 v; + lockdep_assert_held(&priv->reg_mutex); + v = priv->read(priv, reg); v &= ~mask; v |= val; @@ -226,7 +241,7 @@ ar8216_read_port_link(struct ar8216_priv *priv, int port, static int ar8216_set_vlan(struct switch_dev *dev, const struct switch_attr *attr, - struct switch_val *val) + struct switch_val *val) { struct ar8216_priv *priv = to_ar8216(dev); priv->vlan = !!val->value.i; @@ -235,7 +250,7 @@ ar8216_set_vlan(struct switch_dev *dev, const struct switch_attr *attr, static int ar8216_get_vlan(struct switch_dev *dev, const struct switch_attr *attr, - struct switch_val *val) + struct switch_val *val) { struct ar8216_priv *priv = to_ar8216(dev); val->value.i = priv->vlan; @@ -267,7 +282,7 @@ ar8216_get_pvid(struct switch_dev *dev, int port, int *vlan) static int ar8216_set_vid(struct switch_dev *dev, const struct switch_attr *attr, - struct switch_val *val) + struct switch_val *val) { struct ar8216_priv *priv = to_ar8216(dev); priv->vlan_id[val->port_vlan] = val->value.i; @@ -276,7 +291,7 @@ ar8216_set_vid(struct switch_dev *dev, const struct switch_attr *attr, static int ar8216_get_vid(struct switch_dev *dev, const struct switch_attr *attr, - struct switch_val *val) + struct switch_val *val) { struct ar8216_priv *priv = to_ar8216(dev); val->value.i = priv->vlan_id[val->port_vlan]; @@ -299,8 +314,8 @@ ar8216_mangle_tx(struct sk_buff *skb, struct net_device *dev) struct ar8216_priv *priv = dev->phy_ptr; unsigned char *buf; - if (unlikely(!priv)) - goto error; + if (unlikely(!priv)) + goto error; if (!priv->vlan) goto send; @@ -451,9 +466,9 @@ ar8216_set_ports(struct switch_dev *dev, struct switch_val *val) for (i = 0; i < val->len; i++) { struct switch_port *p = &val->value.ports[i]; - if (p->flags & (1 << SWITCH_PORT_FLAG_TAGGED)) + if (p->flags & (1 << SWITCH_PORT_FLAG_TAGGED)) { priv->vlan_tagged |= (1 << p->id); - else { + } else { priv->vlan_tagged &= ~(1 << p->id); priv->pvid[p->id] = val->port_vlan; @@ -606,11 +621,10 @@ ar8216_hw_apply(struct switch_dev *dev) int egress, ingress; int pvid; - if (priv->vlan) { + if (priv->vlan) pvid = priv->vlan_id[priv->pvid[i]]; - } else { + else pvid = i; - } if (priv->vlan) { if (priv->vlan_tagged & (1 << i)) @@ -620,11 +634,11 @@ ar8216_hw_apply(struct switch_dev *dev) } else { egress = AR8216_OUT_KEEP; } - if (priv->vlan) { + + if (priv->vlan) ingress = AR8216_IN_SECURE; - } else { + else ingress = AR8216_IN_PORT_ONLY; - } if (priv->chip == AR8236) ar8236_setup_port(priv, i, egress, ingress, portmask[i], @@ -649,7 +663,8 @@ ar8216_hw_init(struct ar8216_priv *priv) } static int -ar8236_hw_init(struct ar8216_priv *priv) { +ar8236_hw_init(struct ar8216_priv *priv) +{ int i; struct mii_bus *bus; @@ -675,7 +690,8 @@ ar8236_hw_init(struct ar8216_priv *priv) { } static int -ar8316_hw_init(struct ar8216_priv *priv) { +ar8316_hw_init(struct ar8216_priv *priv) +{ int i; u32 val, newval; struct mii_bus *bus; @@ -715,14 +731,11 @@ ar8316_hw_init(struct ar8216_priv *priv) { if ((i == 4) && priv->port4_phy && priv->phy->interface == PHY_INTERFACE_MODE_RGMII) { /* work around for phy4 rgmii mode */ - mdiobus_write(bus, i, MII_ATH_DBG_ADDR, 0x12); - mdiobus_write(bus, i, MII_ATH_DBG_DATA, 0x480c); + ar8216_phy_dbg_write(priv, i, 0x12, 0x480c); /* rx delay */ - mdiobus_write(bus, i, MII_ATH_DBG_ADDR, 0x0); - mdiobus_write(bus, i, MII_ATH_DBG_DATA, 0x824e); + ar8216_phy_dbg_write(priv, i, 0x0, 0x824e); /* tx delay */ - mdiobus_write(bus, i, MII_ATH_DBG_ADDR, 0x5); - mdiobus_write(bus, i, MII_ATH_DBG_DATA, 0x3d47); + ar8216_phy_dbg_write(priv, i, 0x5, 0x3d47); msleep(1000); } @@ -781,9 +794,9 @@ ar8216_reset_switch(struct switch_dev *dev) mutex_lock(&priv->reg_mutex); memset(&priv->vlan, 0, sizeof(struct ar8216_priv) - offsetof(struct ar8216_priv, vlan)); - for (i = 0; i < AR8X16_MAX_VLANS; i++) { + + for (i = 0; i < AR8X16_MAX_VLANS; i++) priv->vlan_id[i] = i; - } /* Configure all ports */ for (i = 0; i < AR8216_NUM_PORTS; i++) @@ -954,9 +967,9 @@ ar8216_read_status(struct phy_device *phydev) struct ar8216_priv *priv = phydev->priv; struct switch_port_link link; int ret; - if (phydev->addr != 0) { + + if (phydev->addr != 0) return genphy_read_status(phydev); - } ar8216_read_port_link(priv, phydev->addr, &link); phydev->link = !!link.link; @@ -965,13 +978,13 @@ ar8216_read_status(struct phy_device *phydev) switch (link.speed) { case SWITCH_PORT_SPEED_10: - phydev->speed = SPEED_10; + phydev->speed = SPEED_10; break; case SWITCH_PORT_SPEED_100: - phydev->speed = SPEED_100; + phydev->speed = SPEED_100; break; case SWITCH_PORT_SPEED_1000: - phydev->speed = SPEED_1000; + phydev->speed = SPEED_1000; break; default: phydev->speed = 0;