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

Merge branch 'net-dsa-b53-ARL-improvements'



Florian Fainelli says:

====================
net: dsa: b53: ARL improvements

This patch series improves the b53 driver ARL search code by
renaming the ARL entries to be reflective of what they are: bins, and
then introduce the number of buckets so we can properly bound check ARL
searches.

The final patch removes an unused argument.
====================

Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents 64cf2ea1 ef2a0bd9
Loading
Loading
Loading
Loading
+51 −30
Original line number Diff line number Diff line
@@ -1484,8 +1484,7 @@ static int b53_arl_rw_op(struct b53_device *dev, unsigned int op)
}

static int b53_arl_read(struct b53_device *dev, u64 mac,
			u16 vid, struct b53_arl_entry *ent, u8 *idx,
			bool is_valid)
			u16 vid, struct b53_arl_entry *ent, u8 *idx)
{
	DECLARE_BITMAP(free_bins, B53_ARLTBL_MAX_BIN_ENTRIES);
	unsigned int i;
@@ -1495,10 +1494,10 @@ static int b53_arl_read(struct b53_device *dev, u64 mac,
	if (ret)
		return ret;

	bitmap_zero(free_bins, dev->num_arl_entries);
	bitmap_zero(free_bins, dev->num_arl_bins);

	/* Read the bins */
	for (i = 0; i < dev->num_arl_entries; i++) {
	for (i = 0; i < dev->num_arl_bins; i++) {
		u64 mac_vid;
		u32 fwd_entry;

@@ -1521,10 +1520,10 @@ static int b53_arl_read(struct b53_device *dev, u64 mac,
		return 0;
	}

	if (bitmap_weight(free_bins, dev->num_arl_entries) == 0)
	if (bitmap_weight(free_bins, dev->num_arl_bins) == 0)
		return -ENOSPC;

	*idx = find_first_bit(free_bins, dev->num_arl_entries);
	*idx = find_first_bit(free_bins, dev->num_arl_bins);

	return -ENOENT;
}
@@ -1550,7 +1549,8 @@ static int b53_arl_op(struct b53_device *dev, int op, int port,
	if (ret)
		return ret;

	ret = b53_arl_read(dev, mac, vid, &ent, &idx, is_valid);
	ret = b53_arl_read(dev, mac, vid, &ent, &idx);

	/* If this is a read, just finish now */
	if (op)
		return ret;
@@ -1692,7 +1692,7 @@ int b53_fdb_dump(struct dsa_switch *ds, int port,
		if (ret)
			return ret;

		if (priv->num_arl_entries > 2) {
		if (priv->num_arl_bins > 2) {
			b53_arl_search_rd(priv, 1, &results[1]);
			ret = b53_fdb_copy(port, &results[1], cb, data);
			if (ret)
@@ -1702,7 +1702,7 @@ int b53_fdb_dump(struct dsa_switch *ds, int port,
				break;
		}

	} while (count++ < 1024);
	} while (count++ < b53_max_arl_entries(priv) / 2);

	return 0;
}
@@ -2185,7 +2185,8 @@ struct b53_chip_data {
	u16 enabled_ports;
	u8 cpu_port;
	u8 vta_regs[3];
	u8 arl_entries;
	u8 arl_bins;
	u16 arl_buckets;
	u8 duplex_reg;
	u8 jumbo_pm_reg;
	u8 jumbo_size_reg;
@@ -2204,7 +2205,8 @@ static const struct b53_chip_data b53_switch_chips[] = {
		.dev_name = "BCM5325",
		.vlans = 16,
		.enabled_ports = 0x1f,
		.arl_entries = 2,
		.arl_bins = 2,
		.arl_buckets = 1024,
		.cpu_port = B53_CPU_PORT_25,
		.duplex_reg = B53_DUPLEX_STAT_FE,
	},
@@ -2213,7 +2215,8 @@ static const struct b53_chip_data b53_switch_chips[] = {
		.dev_name = "BCM5365",
		.vlans = 256,
		.enabled_ports = 0x1f,
		.arl_entries = 2,
		.arl_bins = 2,
		.arl_buckets = 1024,
		.cpu_port = B53_CPU_PORT_25,
		.duplex_reg = B53_DUPLEX_STAT_FE,
	},
@@ -2222,7 +2225,8 @@ static const struct b53_chip_data b53_switch_chips[] = {
		.dev_name = "BCM5389",
		.vlans = 4096,
		.enabled_ports = 0x1f,
		.arl_entries = 4,
		.arl_bins = 4,
		.arl_buckets = 1024,
		.cpu_port = B53_CPU_PORT,
		.vta_regs = B53_VTA_REGS,
		.duplex_reg = B53_DUPLEX_STAT_GE,
@@ -2234,7 +2238,8 @@ static const struct b53_chip_data b53_switch_chips[] = {
		.dev_name = "BCM5395",
		.vlans = 4096,
		.enabled_ports = 0x1f,
		.arl_entries = 4,
		.arl_bins = 4,
		.arl_buckets = 1024,
		.cpu_port = B53_CPU_PORT,
		.vta_regs = B53_VTA_REGS,
		.duplex_reg = B53_DUPLEX_STAT_GE,
@@ -2246,7 +2251,8 @@ static const struct b53_chip_data b53_switch_chips[] = {
		.dev_name = "BCM5397",
		.vlans = 4096,
		.enabled_ports = 0x1f,
		.arl_entries = 4,
		.arl_bins = 4,
		.arl_buckets = 1024,
		.cpu_port = B53_CPU_PORT,
		.vta_regs = B53_VTA_REGS_9798,
		.duplex_reg = B53_DUPLEX_STAT_GE,
@@ -2258,7 +2264,8 @@ static const struct b53_chip_data b53_switch_chips[] = {
		.dev_name = "BCM5398",
		.vlans = 4096,
		.enabled_ports = 0x7f,
		.arl_entries = 4,
		.arl_bins = 4,
		.arl_buckets = 1024,
		.cpu_port = B53_CPU_PORT,
		.vta_regs = B53_VTA_REGS_9798,
		.duplex_reg = B53_DUPLEX_STAT_GE,
@@ -2270,7 +2277,8 @@ static const struct b53_chip_data b53_switch_chips[] = {
		.dev_name = "BCM53115",
		.vlans = 4096,
		.enabled_ports = 0x1f,
		.arl_entries = 4,
		.arl_bins = 4,
		.arl_buckets = 1024,
		.vta_regs = B53_VTA_REGS,
		.cpu_port = B53_CPU_PORT,
		.duplex_reg = B53_DUPLEX_STAT_GE,
@@ -2282,7 +2290,8 @@ static const struct b53_chip_data b53_switch_chips[] = {
		.dev_name = "BCM53125",
		.vlans = 4096,
		.enabled_ports = 0xff,
		.arl_entries = 4,
		.arl_bins = 4,
		.arl_buckets = 1024,
		.cpu_port = B53_CPU_PORT,
		.vta_regs = B53_VTA_REGS,
		.duplex_reg = B53_DUPLEX_STAT_GE,
@@ -2294,7 +2303,8 @@ static const struct b53_chip_data b53_switch_chips[] = {
		.dev_name = "BCM53128",
		.vlans = 4096,
		.enabled_ports = 0x1ff,
		.arl_entries = 4,
		.arl_bins = 4,
		.arl_buckets = 1024,
		.cpu_port = B53_CPU_PORT,
		.vta_regs = B53_VTA_REGS,
		.duplex_reg = B53_DUPLEX_STAT_GE,
@@ -2306,7 +2316,8 @@ static const struct b53_chip_data b53_switch_chips[] = {
		.dev_name = "BCM63xx",
		.vlans = 4096,
		.enabled_ports = 0, /* pdata must provide them */
		.arl_entries = 4,
		.arl_bins = 4,
		.arl_buckets = 1024,
		.cpu_port = B53_CPU_PORT,
		.vta_regs = B53_VTA_REGS_63XX,
		.duplex_reg = B53_DUPLEX_STAT_63XX,
@@ -2318,7 +2329,8 @@ static const struct b53_chip_data b53_switch_chips[] = {
		.dev_name = "BCM53010",
		.vlans = 4096,
		.enabled_ports = 0x1f,
		.arl_entries = 4,
		.arl_bins = 4,
		.arl_buckets = 1024,
		.cpu_port = B53_CPU_PORT_25, /* TODO: auto detect */
		.vta_regs = B53_VTA_REGS,
		.duplex_reg = B53_DUPLEX_STAT_GE,
@@ -2330,7 +2342,8 @@ static const struct b53_chip_data b53_switch_chips[] = {
		.dev_name = "BCM53011",
		.vlans = 4096,
		.enabled_ports = 0x1bf,
		.arl_entries = 4,
		.arl_bins = 4,
		.arl_buckets = 1024,
		.cpu_port = B53_CPU_PORT_25, /* TODO: auto detect */
		.vta_regs = B53_VTA_REGS,
		.duplex_reg = B53_DUPLEX_STAT_GE,
@@ -2342,7 +2355,8 @@ static const struct b53_chip_data b53_switch_chips[] = {
		.dev_name = "BCM53012",
		.vlans = 4096,
		.enabled_ports = 0x1bf,
		.arl_entries = 4,
		.arl_bins = 4,
		.arl_buckets = 1024,
		.cpu_port = B53_CPU_PORT_25, /* TODO: auto detect */
		.vta_regs = B53_VTA_REGS,
		.duplex_reg = B53_DUPLEX_STAT_GE,
@@ -2354,7 +2368,8 @@ static const struct b53_chip_data b53_switch_chips[] = {
		.dev_name = "BCM53018",
		.vlans = 4096,
		.enabled_ports = 0x1f,
		.arl_entries = 4,
		.arl_bins = 4,
		.arl_buckets = 1024,
		.cpu_port = B53_CPU_PORT_25, /* TODO: auto detect */
		.vta_regs = B53_VTA_REGS,
		.duplex_reg = B53_DUPLEX_STAT_GE,
@@ -2366,7 +2381,8 @@ static const struct b53_chip_data b53_switch_chips[] = {
		.dev_name = "BCM53019",
		.vlans = 4096,
		.enabled_ports = 0x1f,
		.arl_entries = 4,
		.arl_bins = 4,
		.arl_buckets = 1024,
		.cpu_port = B53_CPU_PORT_25, /* TODO: auto detect */
		.vta_regs = B53_VTA_REGS,
		.duplex_reg = B53_DUPLEX_STAT_GE,
@@ -2378,7 +2394,8 @@ static const struct b53_chip_data b53_switch_chips[] = {
		.dev_name = "BCM585xx/586xx/88312",
		.vlans	= 4096,
		.enabled_ports = 0x1ff,
		.arl_entries = 4,
		.arl_bins = 4,
		.arl_buckets = 1024,
		.cpu_port = B53_CPU_PORT,
		.vta_regs = B53_VTA_REGS,
		.duplex_reg = B53_DUPLEX_STAT_GE,
@@ -2390,7 +2407,8 @@ static const struct b53_chip_data b53_switch_chips[] = {
		.dev_name = "BCM583xx/11360",
		.vlans = 4096,
		.enabled_ports = 0x103,
		.arl_entries = 4,
		.arl_bins = 4,
		.arl_buckets = 1024,
		.cpu_port = B53_CPU_PORT,
		.vta_regs = B53_VTA_REGS,
		.duplex_reg = B53_DUPLEX_STAT_GE,
@@ -2402,7 +2420,8 @@ static const struct b53_chip_data b53_switch_chips[] = {
		.dev_name = "BCM7445",
		.vlans	= 4096,
		.enabled_ports = 0x1ff,
		.arl_entries = 4,
		.arl_bins = 4,
		.arl_buckets = 1024,
		.cpu_port = B53_CPU_PORT,
		.vta_regs = B53_VTA_REGS,
		.duplex_reg = B53_DUPLEX_STAT_GE,
@@ -2414,7 +2433,8 @@ static const struct b53_chip_data b53_switch_chips[] = {
		.dev_name = "BCM7278",
		.vlans = 4096,
		.enabled_ports = 0x1ff,
		.arl_entries= 4,
		.arl_bins = 4,
		.arl_buckets = 256,
		.cpu_port = B53_CPU_PORT,
		.vta_regs = B53_VTA_REGS,
		.duplex_reg = B53_DUPLEX_STAT_GE,
@@ -2442,7 +2462,8 @@ static int b53_switch_init(struct b53_device *dev)
			dev->jumbo_pm_reg = chip->jumbo_pm_reg;
			dev->cpu_port = chip->cpu_port;
			dev->num_vlans = chip->vlans;
			dev->num_arl_entries = chip->arl_entries;
			dev->num_arl_bins = chip->arl_bins;
			dev->num_arl_buckets = chip->arl_buckets;
			break;
		}
	}
+7 −1
Original line number Diff line number Diff line
@@ -117,7 +117,8 @@ struct b53_device {
	u8 jumbo_pm_reg;
	u8 jumbo_size_reg;
	int reset_gpio;
	u8 num_arl_entries;
	u8 num_arl_bins;
	u16 num_arl_buckets;
	enum dsa_tag_protocol tag_protocol;

	/* used ports mask */
@@ -212,6 +213,11 @@ static inline int is58xx(struct b53_device *dev)
#define B53_CPU_PORT_25	5
#define B53_CPU_PORT	8

static inline unsigned int b53_max_arl_entries(struct b53_device *dev)
{
	return dev->num_arl_buckets * dev->num_arl_bins;
}

struct b53_device *b53_switch_alloc(struct device *base,
				    const struct b53_io_ops *ops,
				    void *priv);