summaryrefslogtreecommitdiff
path: root/target
diff options
context:
space:
mode:
authorGabor Juhos <juhosg@openwrt.org>2012-03-18 22:06:23 +0000
committerGabor Juhos <juhosg@openwrt.org>2012-03-18 22:06:23 +0000
commitd964410cbcac717353fcaec8244e99c8824e1c81 (patch)
tree715344c2091d1cceac6d56955ba71b0aee20556a /target
parent006b3b846eea3bd9c2ac9f2eabe5d02df7d10882 (diff)
downloadmtk-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')
-rw-r--r--target/linux/generic/files/drivers/net/phy/ar8216.c26
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;