diff --git a/target/linux/generic/files/drivers/net/phy/ar8216.c b/target/linux/generic/files/drivers/net/phy/ar8216.c index 4c64b460b..485cb5205 100644 --- a/target/linux/generic/files/drivers/net/phy/ar8216.c +++ b/target/linux/generic/files/drivers/net/phy/ar8216.c @@ -40,8 +40,10 @@ struct ar8216_priv; struct ar8xxx_chip { int (*hw_init)(struct ar8216_priv *priv); + void (*init_port)(struct ar8216_priv *priv, int port); void (*setup_port)(struct ar8216_priv *priv, int port, u32 egress, u32 ingress, u32 members, u32 pvid); + int (*atu_flush)(struct ar8216_priv *priv); }; struct ar8216_priv { @@ -480,6 +482,18 @@ ar8216_vtu_op(struct ar8216_priv *priv, u32 op, u32 val) priv->write(priv, AR8216_REG_VTU, op); } +static int +ar8216_atu_flush(struct ar8216_priv *priv) +{ + int ret; + + ret = ar8216_wait_bit(priv, AR8216_REG_ATU, AR8216_ATU_ACTIVE, 0); + if (!ret) + priv->write(priv, AR8216_REG_ATU, AR8216_ATU_OP_FLUSH); + + return ret; +} + static void ar8216_setup_port(struct ar8216_priv *priv, int port, u32 egress, u32 ingress, u32 members, u32 pvid) @@ -743,17 +757,23 @@ ar8216_init_port(struct ar8216_priv *priv, int port) static const struct ar8xxx_chip ar8216_chip = { .hw_init = ar8216_hw_init, + .init_port = ar8216_init_port, .setup_port = ar8216_setup_port, + .atu_flush = ar8216_atu_flush, }; static const struct ar8xxx_chip ar8236_chip = { .hw_init = ar8236_hw_init, + .init_port = ar8216_init_port, .setup_port = ar8236_setup_port, + .atu_flush = ar8216_atu_flush, }; static const struct ar8xxx_chip ar8316_chip = { .hw_init = ar8316_hw_init, + .init_port = ar8216_init_port, .setup_port = ar8216_setup_port, + .atu_flush = ar8216_atu_flush, }; static int @@ -771,7 +791,7 @@ ar8216_reset_switch(struct switch_dev *dev) /* Configure all ports */ for (i = 0; i < AR8216_NUM_PORTS; i++) - ar8216_init_port(priv, i); + priv->chip->init_port(priv, i); ar8216_init_globals(priv); mutex_unlock(&priv->reg_mutex); @@ -1012,9 +1032,7 @@ ar8216_read_status(struct phy_device *phydev) /* flush the address translation unit */ mutex_lock(&priv->reg_mutex); - ret = ar8216_wait_bit(priv, AR8216_REG_ATU, AR8216_ATU_ACTIVE, 0); - if (!ret) - priv->write(priv, AR8216_REG_ATU, AR8216_ATU_OP_FLUSH); + ret = priv->chip->atu_flush(priv); mutex_unlock(&priv->reg_mutex); phydev->state = PHY_RUNNING;