diff options
author | Luka Perkov <luka@openwrt.org> | 2015-01-11 17:20:03 +0000 |
---|---|---|
committer | Luka Perkov <luka@openwrt.org> | 2015-01-11 17:20:03 +0000 |
commit | 418bc42665b747bcdcb8226a42d0686425e2da82 (patch) | |
tree | be6a4848c4bd0618f7d723c3f99f05a17ec80eba /target/linux/generic/files/drivers | |
parent | fb93335d7cf78d5be753104f32f2469f8f51febe (diff) | |
download | master-187ad058-418bc42665b747bcdcb8226a42d0686425e2da82.tar.gz master-187ad058-418bc42665b747bcdcb8226a42d0686425e2da82.tar.bz2 master-187ad058-418bc42665b747bcdcb8226a42d0686425e2da82.zip |
mvsw61xx: rework chip recognition
Recognizes 88E6171/6172/6176 at the moment.
Signed-off-by: Claudio Leite <leitec@staticky.com>
git-svn-id: svn://svn.openwrt.org/openwrt/trunk@43936 3c298f89-4303-0410-b956-a3cf2f4a3e73
Diffstat (limited to 'target/linux/generic/files/drivers')
-rw-r--r-- | target/linux/generic/files/drivers/net/phy/mvsw61xx.c | 27 | ||||
-rw-r--r-- | target/linux/generic/files/drivers/net/phy/mvsw61xx.h | 14 |
2 files changed, 31 insertions, 10 deletions
diff --git a/target/linux/generic/files/drivers/net/phy/mvsw61xx.c b/target/linux/generic/files/drivers/net/phy/mvsw61xx.c index 7199de0eb2..865bd1147b 100644 --- a/target/linux/generic/files/drivers/net/phy/mvsw61xx.c +++ b/target/linux/generic/files/drivers/net/phy/mvsw61xx.c @@ -740,8 +740,8 @@ static int mvsw61xx_probe(struct platform_device *pdev) struct mvsw61xx_state *state; struct device_node *np = pdev->dev.of_node; struct device_node *mdio; + char *model_str; u32 val; - u16 reg; int err; state = kzalloc(sizeof(*state), GFP_KERNEL); @@ -776,17 +776,28 @@ static int mvsw61xx_probe(struct platform_device *pdev) state->base_addr = MV_BASE; } - reg = r16(state->bus, state->is_indirect, state->base_addr, - MV_PORTREG(IDENT, 0)) & MV_IDENT_MASK; - if (reg != MV_IDENT_VALUE) { - dev_err(&pdev->dev, "No switch found at 0x%02x\n", + state->model = r16(state->bus, state->is_indirect, state->base_addr, + MV_PORTREG(IDENT, 0)) & MV_IDENT_MASK; + + switch(state->model) { + case MV_IDENT_VALUE_6171: + model_str = MV_IDENT_STR_6171; + break; + case MV_IDENT_VALUE_6172: + model_str = MV_IDENT_STR_6172; + break; + case MV_IDENT_VALUE_6176: + model_str = MV_IDENT_STR_6176; + break; + default: + dev_err(&pdev->dev, "No compatible switch found at 0x%02x\n", state->base_addr); err = -ENODEV; goto out_err; } platform_set_drvdata(pdev, state); - dev_info(&pdev->dev, "Found %s at %s:%02x\n", MV_IDENT_STR, + dev_info(&pdev->dev, "Found %s at %s:%02x\n", model_str, state->bus->id, state->base_addr); dev_info(&pdev->dev, "Using %sdirect addressing\n", @@ -808,7 +819,7 @@ static int mvsw61xx_probe(struct platform_device *pdev) state->dev.vlans = MV_VLANS; state->dev.cpu_port = state->cpu_port0; state->dev.ports = MV_PORTS; - state->dev.name = MV_IDENT_STR; + state->dev.name = model_str; state->dev.ops = &mvsw61xx_ops; state->dev.alias = dev_name(&pdev->dev); @@ -839,6 +850,8 @@ mvsw61xx_remove(struct platform_device *pdev) static const struct of_device_id mvsw61xx_match[] = { { .compatible = "marvell,88e6171" }, + { .compatible = "marvell,88e6172" }, + { .compatible = "marvell,88e6176" }, { } }; MODULE_DEVICE_TABLE(of, mvsw61xx_match); diff --git a/target/linux/generic/files/drivers/net/phy/mvsw61xx.h b/target/linux/generic/files/drivers/net/phy/mvsw61xx.h index bd9d60a8a7..d61d21f6cf 100644 --- a/target/linux/generic/files/drivers/net/phy/mvsw61xx.h +++ b/target/linux/generic/files/drivers/net/phy/mvsw61xx.h @@ -190,9 +190,16 @@ enum { }; #define MV_INDIRECT_ADDR_S 5 -#define MV_IDENT_MASK 0xffc0 -#define MV_IDENT_VALUE 0x1700 -#define MV_IDENT_STR "MV88E617x" +#define MV_IDENT_MASK 0xfff0 + +#define MV_IDENT_VALUE_6171 0x1710 +#define MV_IDENT_STR_6171 "MV88E6171" + +#define MV_IDENT_VALUE_6172 0x1720 +#define MV_IDENT_STR_6172 "MV88E6172" + +#define MV_IDENT_VALUE_6176 0x1760 +#define MV_IDENT_STR_6176 "MV88E6176" #define MV_PVID_MASK 0x0fff @@ -200,6 +207,7 @@ struct mvsw61xx_state { struct switch_dev dev; struct mii_bus *bus; int base_addr; + u16 model; bool registered; bool is_indirect; |