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

Commit ccd37cff authored by David S. Miller's avatar David S. Miller
Browse files

Merge branch 'dsa-mv88e6xxx-switch-factorization'



Vivien Didelot says:

====================
net: dsa: mv88e6xxx: factorize switch info

This patchset factorizes the mv88e6xxx code by sharing a new extendable
info structure to store static data such as switch family, product
number, number of ports, number of databases and the name.

The next step is to add a "flags" bitmap member to the info structure in
order to simplify the shared code with a feature-based logic instead of
checking their family/ID.

This is a step forward having a single mv88e6xxx driver supporting many
similar devices, like any usual Linux driver.

Changes v3 -> v4:
  - constify probed name in DSA
  - rebase patchset above conflicting commit 48ace4ef

Changes v2 -> v3:
  - update commit messages and add Andrew's tags
  - keep the info lookup code in a separated function
  - split the single switch ID reading in probe in a new commit

Changes v1 -> v2:
  - define PORT_SWITCH_ID_PROD_NUM_* values
  - use plain struct mv88e6xxx_info
  - remove non used yet ps->rev
====================

Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents efde611b d967ecbc
Loading
Loading
Loading
Loading
+3 −3
Original line number Original line Diff line number Diff line
@@ -135,9 +135,9 @@ static int bcm_sf2_sw_get_sset_count(struct dsa_switch *ds)
	return BCM_SF2_STATS_SIZE;
	return BCM_SF2_STATS_SIZE;
}
}


static char *bcm_sf2_sw_drv_probe(struct device *dsa_dev,
static const char *bcm_sf2_sw_drv_probe(struct device *dsa_dev,
				  struct device *host_dev,
					struct device *host_dev, int sw_addr,
				  int sw_addr, void **_priv)
					void **_priv)
{
{
	struct bcm_sf2_priv *priv;
	struct bcm_sf2_priv *priv;


+5 −5
Original line number Original line Diff line number Diff line
@@ -51,7 +51,7 @@ static int reg_write(struct dsa_switch *ds, int addr, int reg, u16 val)
			return __ret;				\
			return __ret;				\
	})
	})


static char *mv88e6060_get_name(struct mii_bus *bus, int sw_addr)
static const char *mv88e6060_get_name(struct mii_bus *bus, int sw_addr)
{
{
	int ret;
	int ret;


@@ -69,13 +69,13 @@ static char *mv88e6060_get_name(struct mii_bus *bus, int sw_addr)
	return NULL;
	return NULL;
}
}


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


	name = mv88e6060_get_name(bus, sw_addr);
	name = mv88e6060_get_name(bus, sw_addr);
	if (name) {
	if (name) {
+23 −28
Original line number Original line Diff line number Diff line
@@ -17,21 +17,31 @@
#include <net/dsa.h>
#include <net/dsa.h>
#include "mv88e6xxx.h"
#include "mv88e6xxx.h"


static const struct mv88e6xxx_switch_id mv88e6123_table[] = {
static const struct mv88e6xxx_info mv88e6123_table[] = {
	{ PORT_SWITCH_ID_6123, "Marvell 88E6123" },
	{
	{ PORT_SWITCH_ID_6123_A1, "Marvell 88E6123 (A1)" },
		.prod_num = PORT_SWITCH_ID_PROD_NUM_6123,
	{ PORT_SWITCH_ID_6123_A2, "Marvell 88E6123 (A2)" },
		.family = MV88E6XXX_FAMILY_6165,
	{ PORT_SWITCH_ID_6161, "Marvell 88E6161" },
		.name = "Marvell 88E6123",
	{ PORT_SWITCH_ID_6161_A1, "Marvell 88E6161 (A1)" },
		.num_databases = 4096,
	{ PORT_SWITCH_ID_6161_A2, "Marvell 88E6161 (A2)" },
		.num_ports = 3,
	{ PORT_SWITCH_ID_6165, "Marvell 88E6165" },
	}, {
	{ PORT_SWITCH_ID_6165_A1, "Marvell 88E6165 (A1)" },
		.prod_num = PORT_SWITCH_ID_PROD_NUM_6161,
	{ PORT_SWITCH_ID_6165_A2, "Marvell 88e6165 (A2)" },
		.family = MV88E6XXX_FAMILY_6165,
		.name = "Marvell 88E6161",
		.num_databases = 4096,
		.num_ports = 6,
	}, {
		.prod_num = PORT_SWITCH_ID_PROD_NUM_6165,
		.family = MV88E6XXX_FAMILY_6165,
		.name = "Marvell 88E6165",
		.num_databases = 4096,
		.num_ports = 6,
	}
};
};


static char *mv88e6123_drv_probe(struct device *dsa_dev,
static const char *mv88e6123_drv_probe(struct device *dsa_dev,
				 struct device *host_dev,
				       struct device *host_dev, int sw_addr,
				 int sw_addr, void **priv)
				       void **priv)
{
{
	return mv88e6xxx_drv_probe(dsa_dev, host_dev, sw_addr, priv,
	return mv88e6xxx_drv_probe(dsa_dev, host_dev, sw_addr, priv,
				   mv88e6123_table,
				   mv88e6123_table,
@@ -76,27 +86,12 @@ static int mv88e6123_setup_global(struct dsa_switch *ds)


static int mv88e6123_setup(struct dsa_switch *ds)
static int mv88e6123_setup(struct dsa_switch *ds)
{
{
	struct mv88e6xxx_priv_state *ps = ds_to_priv(ds);
	int ret;
	int ret;


	ps->ds = ds;

	ret = mv88e6xxx_setup_common(ds);
	ret = mv88e6xxx_setup_common(ds);
	if (ret < 0)
	if (ret < 0)
		return ret;
		return ret;


	switch (ps->id) {
	case PORT_SWITCH_ID_6123:
		ps->num_ports = 3;
		break;
	case PORT_SWITCH_ID_6161:
	case PORT_SWITCH_ID_6165:
		ps->num_ports = 6;
		break;
	default:
		return -ENODEV;
	}

	ret = mv88e6xxx_switch_reset(ds, false);
	ret = mv88e6xxx_switch_reset(ds, false);
	if (ret < 0)
	if (ret < 0)
		return ret;
		return ret;
+30 −29
Original line number Original line Diff line number Diff line
@@ -17,17 +17,37 @@
#include <net/dsa.h>
#include <net/dsa.h>
#include "mv88e6xxx.h"
#include "mv88e6xxx.h"


static const struct mv88e6xxx_switch_id mv88e6131_table[] = {
static const struct mv88e6xxx_info mv88e6131_table[] = {
	{ PORT_SWITCH_ID_6085, "Marvell 88E6085" },
	{
	{ PORT_SWITCH_ID_6095, "Marvell 88E6095/88E6095F" },
		.prod_num = PORT_SWITCH_ID_PROD_NUM_6095,
	{ PORT_SWITCH_ID_6131, "Marvell 88E6131" },
		.family = MV88E6XXX_FAMILY_6095,
	{ PORT_SWITCH_ID_6131_B2, "Marvell 88E6131 (B2)" },
		.name = "Marvell 88E6095/88E6095F",
	{ PORT_SWITCH_ID_6185, "Marvell 88E6185" },
		.num_databases = 256,
		.num_ports = 11,
	}, {
		.prod_num = PORT_SWITCH_ID_PROD_NUM_6085,
		.family = MV88E6XXX_FAMILY_6097,
		.name = "Marvell 88E6085",
		.num_databases = 4096,
		.num_ports = 10,
	}, {
		.prod_num = PORT_SWITCH_ID_PROD_NUM_6131,
		.family = MV88E6XXX_FAMILY_6185,
		.name = "Marvell 88E6131",
		.num_databases = 256,
		.num_ports = 8,
	}, {
		.prod_num = PORT_SWITCH_ID_PROD_NUM_6185,
		.family = MV88E6XXX_FAMILY_6185,
		.name = "Marvell 88E6185",
		.num_databases = 256,
		.num_ports = 10,
	}
};
};


static char *mv88e6131_drv_probe(struct device *dsa_dev,
static const char *mv88e6131_drv_probe(struct device *dsa_dev,
				 struct device *host_dev,
				       struct device *host_dev, int sw_addr,
				 int sw_addr, void **priv)
				       void **priv)
{
{
	return mv88e6xxx_drv_probe(dsa_dev, host_dev, sw_addr, priv,
	return mv88e6xxx_drv_probe(dsa_dev, host_dev, sw_addr, priv,
				   mv88e6131_table,
				   mv88e6131_table,
@@ -98,33 +118,14 @@ static int mv88e6131_setup_global(struct dsa_switch *ds)


static int mv88e6131_setup(struct dsa_switch *ds)
static int mv88e6131_setup(struct dsa_switch *ds)
{
{
	struct mv88e6xxx_priv_state *ps = ds_to_priv(ds);
	int ret;
	int ret;


	ps->ds = ds;

	ret = mv88e6xxx_setup_common(ds);
	ret = mv88e6xxx_setup_common(ds);
	if (ret < 0)
	if (ret < 0)
		return ret;
		return ret;


	mv88e6xxx_ppu_state_init(ds);
	mv88e6xxx_ppu_state_init(ds);


	switch (ps->id) {
	case PORT_SWITCH_ID_6085:
	case PORT_SWITCH_ID_6185:
		ps->num_ports = 10;
		break;
	case PORT_SWITCH_ID_6095:
		ps->num_ports = 11;
		break;
	case PORT_SWITCH_ID_6131:
	case PORT_SWITCH_ID_6131_B2:
		ps->num_ports = 8;
		break;
	default:
		return -ENODEV;
	}

	ret = mv88e6xxx_switch_reset(ds, false);
	ret = mv88e6xxx_switch_reset(ds, false);
	if (ret < 0)
	if (ret < 0)
		return ret;
		return ret;
@@ -140,7 +141,7 @@ static int mv88e6131_port_to_phy_addr(struct dsa_switch *ds, int port)
{
{
	struct mv88e6xxx_priv_state *ps = ds_to_priv(ds);
	struct mv88e6xxx_priv_state *ps = ds_to_priv(ds);


	if (port >= 0 && port < ps->num_ports)
	if (port >= 0 && port < ps->info->num_ports)
		return port;
		return port;


	return -EINVAL;
	return -EINVAL;
+29 −13
Original line number Original line Diff line number Diff line
@@ -17,16 +17,37 @@
#include <net/dsa.h>
#include <net/dsa.h>
#include "mv88e6xxx.h"
#include "mv88e6xxx.h"


static const struct mv88e6xxx_switch_id mv88e6171_table[] = {
static const struct mv88e6xxx_info mv88e6171_table[] = {
	{ PORT_SWITCH_ID_6171, "Marvell 88E6171" },
	{
	{ PORT_SWITCH_ID_6175, "Marvell 88E6175" },
		.prod_num = PORT_SWITCH_ID_PROD_NUM_6171,
	{ PORT_SWITCH_ID_6350, "Marvell 88E6350" },
		.family = MV88E6XXX_FAMILY_6351,
	{ PORT_SWITCH_ID_6351, "Marvell 88E6351" },
		.name = "Marvell 88E6171",
		.num_databases = 4096,
		.num_ports = 7,
	}, {
		.prod_num = PORT_SWITCH_ID_PROD_NUM_6175,
		.family = MV88E6XXX_FAMILY_6351,
		.name = "Marvell 88E6175",
		.num_databases = 4096,
		.num_ports = 7,
	}, {
		.prod_num = PORT_SWITCH_ID_PROD_NUM_6350,
		.family = MV88E6XXX_FAMILY_6351,
		.name = "Marvell 88E6350",
		.num_databases = 4096,
		.num_ports = 7,
	}, {
		.prod_num = PORT_SWITCH_ID_PROD_NUM_6351,
		.family = MV88E6XXX_FAMILY_6351,
		.name = "Marvell 88E6351",
		.num_databases = 4096,
		.num_ports = 7,
	}
};
};


static char *mv88e6171_drv_probe(struct device *dsa_dev,
static const char *mv88e6171_drv_probe(struct device *dsa_dev,
				 struct device *host_dev,
				       struct device *host_dev, int sw_addr,
				 int sw_addr, void **priv)
				       void **priv)
{
{
	return mv88e6xxx_drv_probe(dsa_dev, host_dev, sw_addr, priv,
	return mv88e6xxx_drv_probe(dsa_dev, host_dev, sw_addr, priv,
				   mv88e6171_table,
				   mv88e6171_table,
@@ -73,17 +94,12 @@ static int mv88e6171_setup_global(struct dsa_switch *ds)


static int mv88e6171_setup(struct dsa_switch *ds)
static int mv88e6171_setup(struct dsa_switch *ds)
{
{
	struct mv88e6xxx_priv_state *ps = ds_to_priv(ds);
	int ret;
	int ret;


	ps->ds = ds;

	ret = mv88e6xxx_setup_common(ds);
	ret = mv88e6xxx_setup_common(ds);
	if (ret < 0)
	if (ret < 0)
		return ret;
		return ret;


	ps->num_ports = 7;

	ret = mv88e6xxx_switch_reset(ds, true);
	ret = mv88e6xxx_switch_reset(ds, true);
	if (ret < 0)
	if (ret < 0)
		return ret;
		return ret;
Loading