aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net
diff options
context:
space:
mode:
authorVivien Didelot <vivien.didelot@savoirfairelinux.com>2016-04-17 13:23:58 -0400
committerDavid S. Miller <davem@davemloft.net>2016-04-17 18:54:15 -0400
commita439c0612d7bdbd5ce8ea868e6a1084f0d7300dc (patch)
treef0d99384b51a6035ce38e5d876affc2eae355faf /drivers/net
parentnet: dsa: mv88e6xxx: drop revision probing (diff)
downloadlinux-dev-a439c0612d7bdbd5ce8ea868e6a1084f0d7300dc.tar.xz
linux-dev-a439c0612d7bdbd5ce8ea868e6a1084f0d7300dc.zip
net: dsa: mv88e6xxx: read switch ID in probe
Read the switch ID only once, at probe time, to avoid multiple read accesses and MII bus checking. Signed-off-by: Vivien Didelot <vivien.didelot@savoirfairelinux.com> Reviewed-by: Andrew Lunn <andrew@lunn.ch> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to '')
-rw-r--r--drivers/net/dsa/mv88e6xxx.c57
1 files changed, 30 insertions, 27 deletions
diff --git a/drivers/net/dsa/mv88e6xxx.c b/drivers/net/dsa/mv88e6xxx.c
index 469d8a3476cb..49f085a8453d 100644
--- a/drivers/net/dsa/mv88e6xxx.c
+++ b/drivers/net/dsa/mv88e6xxx.c
@@ -2700,10 +2700,6 @@ int mv88e6xxx_setup_common(struct dsa_switch *ds)
ps->ds = ds;
mutex_init(&ps->smi_mutex);
- ps->id = mv88e6xxx_reg_read(ds, REG_PORT(0), PORT_SWITCH_ID) & 0xfff0;
- if (ps->id < 0)
- return ps->id;
-
INIT_WORK(&ps->bridge_work, mv88e6xxx_bridge_work);
return 0;
@@ -3174,21 +3170,13 @@ int mv88e6xxx_get_temp_alarm(struct dsa_switch *ds, bool *alarm)
#endif /* CONFIG_NET_DSA_HWMON */
static const char *
-mv88e6xxx_lookup_name(struct mii_bus *bus, int sw_addr,
- const struct mv88e6xxx_switch_id *table,
+mv88e6xxx_lookup_name(unsigned int id, const struct mv88e6xxx_switch_id *table,
unsigned int num)
{
- int i, ret;
-
- if (!bus)
- return NULL;
-
- ret = __mv88e6xxx_reg_read(bus, sw_addr, REG_PORT(0), PORT_SWITCH_ID);
- if (ret < 0)
- return NULL;
+ int i;
for (i = 0; i < num; ++i)
- if (table[i].id == (ret & 0xfff0))
+ if (table[i].id == (id & 0xfff0))
return table[i].name;
return NULL;
@@ -3200,23 +3188,38 @@ const char *mv88e6xxx_drv_probe(struct device *dsa_dev, struct device *host_dev,
unsigned int num)
{
struct mv88e6xxx_priv_state *ps;
- struct mii_bus *bus = dsa_host_dev_to_mii_bus(host_dev);
+ struct mii_bus *bus;
const char *name;
+ int id, prod_num, rev;
+ bus = dsa_host_dev_to_mii_bus(host_dev);
if (!bus)
return NULL;
- name = mv88e6xxx_lookup_name(bus, sw_addr, table, num);
- if (name) {
- ps = devm_kzalloc(dsa_dev, sizeof(*ps), GFP_KERNEL);
- if (!ps)
- return NULL;
- *priv = ps;
- ps->bus = dsa_host_dev_to_mii_bus(host_dev);
- if (!ps->bus)
- return NULL;
- ps->sw_addr = sw_addr;
- }
+ id = __mv88e6xxx_reg_read(bus, sw_addr, REG_PORT(0), PORT_SWITCH_ID);
+ if (id < 0)
+ return NULL;
+
+ prod_num = (id & 0xfff0) >> 4;
+ rev = id & 0x000f;
+
+ name = mv88e6xxx_lookup_name(id, table, num);
+ if (!name)
+ return NULL;
+
+ ps = devm_kzalloc(dsa_dev, sizeof(*ps), GFP_KERNEL);
+ if (!ps)
+ return NULL;
+
+ ps->bus = bus;
+ ps->sw_addr = sw_addr;
+ ps->id = id & 0xfff0;
+
+ *priv = ps;
+
+ dev_info(&ps->bus->dev, "switch 0x%x probed: %s, revision %u\n",
+ prod_num, name, rev);
+
return name;
}