diff options
author | Gabor Juhos <juhosg@openwrt.org> | 2012-03-18 22:06:23 +0000 |
---|---|---|
committer | Gabor Juhos <juhosg@openwrt.org> | 2012-03-18 22:06:23 +0000 |
commit | d964410cbcac717353fcaec8244e99c8824e1c81 (patch) | |
tree | 715344c2091d1cceac6d56955ba71b0aee20556a /target/linux/generic | |
parent | 006b3b846eea3bd9c2ac9f2eabe5d02df7d10882 (diff) | |
download | mtk-20170518-d964410cbcac717353fcaec8244e99c8824e1c81.zip mtk-20170518-d964410cbcac717353fcaec8244e99c8824e1c81.tar.gz mtk-20170518-d964410cbcac717353fcaec8244e99c8824e1c81.tar.bz2 |
generic: ar8216: add init_port field to ar8xxx_chip
SVN-Revision: 31000
Diffstat (limited to 'target/linux/generic')
-rw-r--r-- | target/linux/generic/files/drivers/net/phy/ar8216.c | 26 |
1 files changed, 22 insertions, 4 deletions
diff --git a/target/linux/generic/files/drivers/net/phy/ar8216.c b/target/linux/generic/files/drivers/net/phy/ar8216.c index 4c64b46..485cb52 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; |