Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a77d43f1 authored by Andrew Lunn's avatar Andrew Lunn Committed by David S. Miller
Browse files

net: dsa: Keep the mii bus and address in the private structure



Rather than looking up the mii bus and address every time, do it once
at probe, and keep it in the private structure. Centralise this probe
code in mv88e6xxx.

Signed-off-by: default avatarAndrew Lunn <andrew@lunn.ch>
Acked-by: default avatarFlorian Fainelli <f.fainelli@gmail.com>
Tested-by: default avatarVivien Didelot <vivien.didelot@savoirfairelinux.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 5feebd0a
Loading
Loading
Loading
Loading
+26 −18
Original line number Diff line number Diff line
@@ -19,12 +19,9 @@

static int reg_read(struct dsa_switch *ds, int addr, int reg)
{
	struct mii_bus *bus = dsa_host_dev_to_mii_bus(ds->master_dev);
	struct mv88e6060_priv *priv = ds_to_priv(ds);

	if (bus == NULL)
		return -EINVAL;

	return mdiobus_read_nested(bus, ds->pd->sw_addr + addr, reg);
	return mdiobus_read_nested(priv->bus, priv->sw_addr + addr, reg);
}

#define REG_READ(addr, reg)					\
@@ -40,12 +37,9 @@ static int reg_read(struct dsa_switch *ds, int addr, int reg)

static int reg_write(struct dsa_switch *ds, int addr, int reg, u16 val)
{
	struct mii_bus *bus = dsa_host_dev_to_mii_bus(ds->master_dev);

	if (bus == NULL)
		return -EINVAL;
	struct mv88e6060_priv *priv = ds_to_priv(ds);

	return mdiobus_write_nested(bus, ds->pd->sw_addr + addr, reg, val);
	return mdiobus_write_nested(priv->bus, priv->sw_addr + addr, reg, val);
}

#define REG_WRITE(addr, reg, val)				\
@@ -57,16 +51,10 @@ static int reg_write(struct dsa_switch *ds, int addr, int reg, u16 val)
			return __ret;				\
	})

static char *mv88e6060_probe(struct device *dsa_dev, struct device *host_dev,
			     int sw_addr, void **priv)
static char *mv88e6060_get_name(struct mii_bus *bus, int sw_addr)
{
	struct mii_bus *bus = dsa_host_dev_to_mii_bus(host_dev);
	int ret;

	*priv = NULL;
	if (bus == NULL)
		return NULL;

	ret = mdiobus_read(bus, sw_addr + REG_PORT(0), PORT_SWITCH_ID);
	if (ret >= 0) {
		if (ret == PORT_SWITCH_ID_6060)
@@ -81,6 +69,26 @@ static char *mv88e6060_probe(struct device *dsa_dev, struct device *host_dev,
	return NULL;
}

static char *mv88e6060_probe(struct device *dsa_dev, struct device *host_dev,
			     int sw_addr, void **_priv)
{
	struct mii_bus *bus = dsa_host_dev_to_mii_bus(host_dev);
	struct mv88e6060_priv *priv;
	char *name;

	name = mv88e6060_get_name(bus, sw_addr);
	if (name) {
		priv = devm_kzalloc(dsa_dev, sizeof(*priv), GFP_KERNEL);
		if (!priv)
			return NULL;
		*_priv = priv;
		priv->bus = bus;
		priv->sw_addr = sw_addr;
	}

	return name;
}

static int mv88e6060_switch_reset(struct dsa_switch *ds)
{
	int i;
@@ -176,8 +184,8 @@ static int mv88e6060_setup_port(struct dsa_switch *ds, int p)

static int mv88e6060_setup(struct dsa_switch *ds)
{
	int i;
	int ret;
	int i;

	ret = mv88e6060_switch_reset(ds);
	if (ret < 0)
+11 −0
Original line number Diff line number Diff line
@@ -108,4 +108,15 @@
#define GLOBAL_ATU_MAC_23	0x0e
#define GLOBAL_ATU_MAC_45	0x0f

struct mv88e6060_priv {
	/* MDIO bus and address on bus to use. When in single chip
	 * mode, address is 0, and the switch uses multiple addresses
	 * on the bus.  When in multi-chip mode, the switch uses a
	 * single address which contains two registers used for
	 * indirect access to more registers.
	 */
	struct mii_bus *bus;
	int sw_addr;
};

#endif
+3 −12
Original line number Diff line number Diff line
@@ -32,18 +32,9 @@ static const struct mv88e6xxx_switch_id mv88e6123_table[] = {
static char *mv88e6123_probe(struct device *dsa_dev, struct device *host_dev,
			     int sw_addr, void **priv)
{
	struct mv88e6xxx_priv_state *ps;
	char *name;

	name = mv88e6xxx_lookup_name(host_dev, sw_addr, mv88e6123_table,
	return mv88e6xxx_drv_probe(dsa_dev, host_dev, sw_addr, priv,
				   mv88e6123_table,
				   ARRAY_SIZE(mv88e6123_table));
	if (name) {
		ps = devm_kzalloc(dsa_dev, sizeof(*ps), GFP_KERNEL);
		if (!ps)
			return NULL;
		*priv = ps;
	}
	return name;
}

static int mv88e6123_setup_global(struct dsa_switch *ds)
+3 −12
Original line number Diff line number Diff line
@@ -28,18 +28,9 @@ static const struct mv88e6xxx_switch_id mv88e6131_table[] = {
static char *mv88e6131_probe(struct device *dsa_dev, struct device *host_dev,
			     int sw_addr, void **priv)
{
	struct mv88e6xxx_priv_state *ps;
	char *name;

	name = mv88e6xxx_lookup_name(host_dev, sw_addr, mv88e6131_table,
	return mv88e6xxx_drv_probe(dsa_dev, host_dev, sw_addr, priv,
				   mv88e6131_table,
				   ARRAY_SIZE(mv88e6131_table));
	if (name) {
		ps = devm_kzalloc(dsa_dev, sizeof(*ps), GFP_KERNEL);
		if (!ps)
			return NULL;
		*priv = ps;
	}
	return name;
}

static int mv88e6131_setup_global(struct dsa_switch *ds)
+3 −12
Original line number Diff line number Diff line
@@ -27,18 +27,9 @@ static const struct mv88e6xxx_switch_id mv88e6171_table[] = {
static char *mv88e6171_probe(struct device *dsa_dev, struct device *host_dev,
			     int sw_addr, void **priv)
{
	struct mv88e6xxx_priv_state *ps;
	char *name;

	name = mv88e6xxx_lookup_name(host_dev, sw_addr, mv88e6171_table,
	return mv88e6xxx_drv_probe(dsa_dev, host_dev, sw_addr, priv,
				   mv88e6171_table,
				   ARRAY_SIZE(mv88e6171_table));
		if (name) {
		ps = devm_kzalloc(dsa_dev, sizeof(*ps), GFP_KERNEL);
		if (!ps)
			return NULL;
		*priv = ps;
	}
	return name;
}

static int mv88e6171_setup_global(struct dsa_switch *ds)
Loading