ar8216: add link change detection for switch ports

Check for switch port link changes and
- flush ATU in case of a change
- report link change via syslog

Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com>

SVN-Revision: 44102
This commit is contained in:
Felix Fietkau 2015-01-24 19:41:55 +00:00
parent 74146c62c0
commit a1fba9dfbe
2 changed files with 36 additions and 0 deletions

View file

@ -1707,12 +1707,47 @@ ar8xxx_phy_config_init(struct phy_device *phydev)
return 0; return 0;
} }
static bool
ar8xxx_check_link_states(struct ar8xxx_priv *priv)
{
bool link_new, changed = false;
u32 status;
int i;
mutex_lock(&priv->reg_mutex);
for (i = 0; i < priv->dev.ports; i++) {
status = priv->chip->read_port_status(priv, i);
link_new = !!(status & AR8216_PORT_STATUS_LINK_UP);
if (link_new == priv->link_up[i])
continue;
priv->link_up[i] = link_new;
changed = true;
dev_info(&priv->phy->dev, "Port %d is %s\n",
i, link_new ? "up" : "down");
}
if (changed)
priv->chip->atu_flush(priv);
mutex_unlock(&priv->reg_mutex);
return changed;
}
static int static int
ar8xxx_phy_read_status(struct phy_device *phydev) ar8xxx_phy_read_status(struct phy_device *phydev)
{ {
struct ar8xxx_priv *priv = phydev->priv; struct ar8xxx_priv *priv = phydev->priv;
struct switch_port_link link; struct switch_port_link link;
/* check for link changes and flush ATU
* if a change was detected
*/
if (phydev->state == PHY_CHANGELINK)
ar8xxx_check_link_states(priv);
if (phydev->addr != 0) if (phydev->addr != 0)
return genphy_read_status(phydev); return genphy_read_status(phydev);

View file

@ -396,6 +396,7 @@ struct ar8xxx_priv {
bool initialized; bool initialized;
bool port4_phy; bool port4_phy;
char buf[2048]; char buf[2048];
bool link_up[AR8X16_MAX_PORTS];
bool init; bool init;