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

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
...@@ -1484,8 +1484,7 @@ static int b53_arl_rw_op(struct b53_device *dev, unsigned int op) ...@@ -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, static int b53_arl_read(struct b53_device *dev, u64 mac,
u16 vid, struct b53_arl_entry *ent, u8 *idx, u16 vid, struct b53_arl_entry *ent, u8 *idx)
bool is_valid)
{ {
DECLARE_BITMAP(free_bins, B53_ARLTBL_MAX_BIN_ENTRIES); DECLARE_BITMAP(free_bins, B53_ARLTBL_MAX_BIN_ENTRIES);
unsigned int i; unsigned int i;
...@@ -1495,10 +1494,10 @@ static int b53_arl_read(struct b53_device *dev, u64 mac, ...@@ -1495,10 +1494,10 @@ static int b53_arl_read(struct b53_device *dev, u64 mac,
if (ret) if (ret)
return ret; return ret;
bitmap_zero(free_bins, dev->num_arl_entries); bitmap_zero(free_bins, dev->num_arl_bins);
/* Read the 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; u64 mac_vid;
u32 fwd_entry; u32 fwd_entry;
...@@ -1521,10 +1520,10 @@ static int b53_arl_read(struct b53_device *dev, u64 mac, ...@@ -1521,10 +1520,10 @@ static int b53_arl_read(struct b53_device *dev, u64 mac,
return 0; return 0;
} }
if (bitmap_weight(free_bins, dev->num_arl_entries) == 0) if (bitmap_weight(free_bins, dev->num_arl_bins) == 0)
return -ENOSPC; return -ENOSPC;
*idx = find_first_bit(free_bins, dev->num_arl_entries); *idx = find_first_bit(free_bins, dev->num_arl_bins);
return -ENOENT; return -ENOENT;
} }
...@@ -1550,7 +1549,8 @@ static int b53_arl_op(struct b53_device *dev, int op, int port, ...@@ -1550,7 +1549,8 @@ static int b53_arl_op(struct b53_device *dev, int op, int port,
if (ret) if (ret)
return 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 this is a read, just finish now */
if (op) if (op)
return ret; return ret;
...@@ -1692,7 +1692,7 @@ int b53_fdb_dump(struct dsa_switch *ds, int port, ...@@ -1692,7 +1692,7 @@ int b53_fdb_dump(struct dsa_switch *ds, int port,
if (ret) if (ret)
return ret; return ret;
if (priv->num_arl_entries > 2) { if (priv->num_arl_bins > 2) {
b53_arl_search_rd(priv, 1, &results[1]); b53_arl_search_rd(priv, 1, &results[1]);
ret = b53_fdb_copy(port, &results[1], cb, data); ret = b53_fdb_copy(port, &results[1], cb, data);
if (ret) if (ret)
...@@ -1702,7 +1702,7 @@ int b53_fdb_dump(struct dsa_switch *ds, int port, ...@@ -1702,7 +1702,7 @@ int b53_fdb_dump(struct dsa_switch *ds, int port,
break; break;
} }
} while (count++ < 1024); } while (count++ < b53_max_arl_entries(priv) / 2);
return 0; return 0;
} }
...@@ -2185,7 +2185,8 @@ struct b53_chip_data { ...@@ -2185,7 +2185,8 @@ struct b53_chip_data {
u16 enabled_ports; u16 enabled_ports;
u8 cpu_port; u8 cpu_port;
u8 vta_regs[3]; u8 vta_regs[3];
u8 arl_entries; u8 arl_bins;
u16 arl_buckets;
u8 duplex_reg; u8 duplex_reg;
u8 jumbo_pm_reg; u8 jumbo_pm_reg;
u8 jumbo_size_reg; u8 jumbo_size_reg;
...@@ -2204,7 +2205,8 @@ static const struct b53_chip_data b53_switch_chips[] = { ...@@ -2204,7 +2205,8 @@ static const struct b53_chip_data b53_switch_chips[] = {
.dev_name = "BCM5325", .dev_name = "BCM5325",
.vlans = 16, .vlans = 16,
.enabled_ports = 0x1f, .enabled_ports = 0x1f,
.arl_entries = 2, .arl_bins = 2,
.arl_buckets = 1024,
.cpu_port = B53_CPU_PORT_25, .cpu_port = B53_CPU_PORT_25,
.duplex_reg = B53_DUPLEX_STAT_FE, .duplex_reg = B53_DUPLEX_STAT_FE,
}, },
...@@ -2213,7 +2215,8 @@ static const struct b53_chip_data b53_switch_chips[] = { ...@@ -2213,7 +2215,8 @@ static const struct b53_chip_data b53_switch_chips[] = {
.dev_name = "BCM5365", .dev_name = "BCM5365",
.vlans = 256, .vlans = 256,
.enabled_ports = 0x1f, .enabled_ports = 0x1f,
.arl_entries = 2, .arl_bins = 2,
.arl_buckets = 1024,
.cpu_port = B53_CPU_PORT_25, .cpu_port = B53_CPU_PORT_25,
.duplex_reg = B53_DUPLEX_STAT_FE, .duplex_reg = B53_DUPLEX_STAT_FE,
}, },
...@@ -2222,7 +2225,8 @@ static const struct b53_chip_data b53_switch_chips[] = { ...@@ -2222,7 +2225,8 @@ static const struct b53_chip_data b53_switch_chips[] = {
.dev_name = "BCM5389", .dev_name = "BCM5389",
.vlans = 4096, .vlans = 4096,
.enabled_ports = 0x1f, .enabled_ports = 0x1f,
.arl_entries = 4, .arl_bins = 4,
.arl_buckets = 1024,
.cpu_port = B53_CPU_PORT, .cpu_port = B53_CPU_PORT,
.vta_regs = B53_VTA_REGS, .vta_regs = B53_VTA_REGS,
.duplex_reg = B53_DUPLEX_STAT_GE, .duplex_reg = B53_DUPLEX_STAT_GE,
...@@ -2234,7 +2238,8 @@ static const struct b53_chip_data b53_switch_chips[] = { ...@@ -2234,7 +2238,8 @@ static const struct b53_chip_data b53_switch_chips[] = {
.dev_name = "BCM5395", .dev_name = "BCM5395",
.vlans = 4096, .vlans = 4096,
.enabled_ports = 0x1f, .enabled_ports = 0x1f,
.arl_entries = 4, .arl_bins = 4,
.arl_buckets = 1024,
.cpu_port = B53_CPU_PORT, .cpu_port = B53_CPU_PORT,
.vta_regs = B53_VTA_REGS, .vta_regs = B53_VTA_REGS,
.duplex_reg = B53_DUPLEX_STAT_GE, .duplex_reg = B53_DUPLEX_STAT_GE,
...@@ -2246,7 +2251,8 @@ static const struct b53_chip_data b53_switch_chips[] = { ...@@ -2246,7 +2251,8 @@ static const struct b53_chip_data b53_switch_chips[] = {
.dev_name = "BCM5397", .dev_name = "BCM5397",
.vlans = 4096, .vlans = 4096,
.enabled_ports = 0x1f, .enabled_ports = 0x1f,
.arl_entries = 4, .arl_bins = 4,
.arl_buckets = 1024,
.cpu_port = B53_CPU_PORT, .cpu_port = B53_CPU_PORT,
.vta_regs = B53_VTA_REGS_9798, .vta_regs = B53_VTA_REGS_9798,
.duplex_reg = B53_DUPLEX_STAT_GE, .duplex_reg = B53_DUPLEX_STAT_GE,
...@@ -2258,7 +2264,8 @@ static const struct b53_chip_data b53_switch_chips[] = { ...@@ -2258,7 +2264,8 @@ static const struct b53_chip_data b53_switch_chips[] = {
.dev_name = "BCM5398", .dev_name = "BCM5398",
.vlans = 4096, .vlans = 4096,
.enabled_ports = 0x7f, .enabled_ports = 0x7f,
.arl_entries = 4, .arl_bins = 4,
.arl_buckets = 1024,
.cpu_port = B53_CPU_PORT, .cpu_port = B53_CPU_PORT,
.vta_regs = B53_VTA_REGS_9798, .vta_regs = B53_VTA_REGS_9798,
.duplex_reg = B53_DUPLEX_STAT_GE, .duplex_reg = B53_DUPLEX_STAT_GE,
...@@ -2270,7 +2277,8 @@ static const struct b53_chip_data b53_switch_chips[] = { ...@@ -2270,7 +2277,8 @@ static const struct b53_chip_data b53_switch_chips[] = {
.dev_name = "BCM53115", .dev_name = "BCM53115",
.vlans = 4096, .vlans = 4096,
.enabled_ports = 0x1f, .enabled_ports = 0x1f,
.arl_entries = 4, .arl_bins = 4,
.arl_buckets = 1024,
.vta_regs = B53_VTA_REGS, .vta_regs = B53_VTA_REGS,
.cpu_port = B53_CPU_PORT, .cpu_port = B53_CPU_PORT,
.duplex_reg = B53_DUPLEX_STAT_GE, .duplex_reg = B53_DUPLEX_STAT_GE,
...@@ -2282,7 +2290,8 @@ static const struct b53_chip_data b53_switch_chips[] = { ...@@ -2282,7 +2290,8 @@ static const struct b53_chip_data b53_switch_chips[] = {
.dev_name = "BCM53125", .dev_name = "BCM53125",
.vlans = 4096, .vlans = 4096,
.enabled_ports = 0xff, .enabled_ports = 0xff,
.arl_entries = 4, .arl_bins = 4,
.arl_buckets = 1024,
.cpu_port = B53_CPU_PORT, .cpu_port = B53_CPU_PORT,
.vta_regs = B53_VTA_REGS, .vta_regs = B53_VTA_REGS,
.duplex_reg = B53_DUPLEX_STAT_GE, .duplex_reg = B53_DUPLEX_STAT_GE,
...@@ -2294,7 +2303,8 @@ static const struct b53_chip_data b53_switch_chips[] = { ...@@ -2294,7 +2303,8 @@ static const struct b53_chip_data b53_switch_chips[] = {
.dev_name = "BCM53128", .dev_name = "BCM53128",
.vlans = 4096, .vlans = 4096,
.enabled_ports = 0x1ff, .enabled_ports = 0x1ff,
.arl_entries = 4, .arl_bins = 4,
.arl_buckets = 1024,
.cpu_port = B53_CPU_PORT, .cpu_port = B53_CPU_PORT,
.vta_regs = B53_VTA_REGS, .vta_regs = B53_VTA_REGS,
.duplex_reg = B53_DUPLEX_STAT_GE, .duplex_reg = B53_DUPLEX_STAT_GE,
...@@ -2306,7 +2316,8 @@ static const struct b53_chip_data b53_switch_chips[] = { ...@@ -2306,7 +2316,8 @@ static const struct b53_chip_data b53_switch_chips[] = {
.dev_name = "BCM63xx", .dev_name = "BCM63xx",
.vlans = 4096, .vlans = 4096,
.enabled_ports = 0, /* pdata must provide them */ .enabled_ports = 0, /* pdata must provide them */
.arl_entries = 4, .arl_bins = 4,
.arl_buckets = 1024,
.cpu_port = B53_CPU_PORT, .cpu_port = B53_CPU_PORT,
.vta_regs = B53_VTA_REGS_63XX, .vta_regs = B53_VTA_REGS_63XX,
.duplex_reg = B53_DUPLEX_STAT_63XX, .duplex_reg = B53_DUPLEX_STAT_63XX,
...@@ -2318,7 +2329,8 @@ static const struct b53_chip_data b53_switch_chips[] = { ...@@ -2318,7 +2329,8 @@ static const struct b53_chip_data b53_switch_chips[] = {
.dev_name = "BCM53010", .dev_name = "BCM53010",
.vlans = 4096, .vlans = 4096,
.enabled_ports = 0x1f, .enabled_ports = 0x1f,
.arl_entries = 4, .arl_bins = 4,
.arl_buckets = 1024,
.cpu_port = B53_CPU_PORT_25, /* TODO: auto detect */ .cpu_port = B53_CPU_PORT_25, /* TODO: auto detect */
.vta_regs = B53_VTA_REGS, .vta_regs = B53_VTA_REGS,
.duplex_reg = B53_DUPLEX_STAT_GE, .duplex_reg = B53_DUPLEX_STAT_GE,
...@@ -2330,7 +2342,8 @@ static const struct b53_chip_data b53_switch_chips[] = { ...@@ -2330,7 +2342,8 @@ static const struct b53_chip_data b53_switch_chips[] = {
.dev_name = "BCM53011", .dev_name = "BCM53011",
.vlans = 4096, .vlans = 4096,
.enabled_ports = 0x1bf, .enabled_ports = 0x1bf,
.arl_entries = 4, .arl_bins = 4,
.arl_buckets = 1024,
.cpu_port = B53_CPU_PORT_25, /* TODO: auto detect */ .cpu_port = B53_CPU_PORT_25, /* TODO: auto detect */
.vta_regs = B53_VTA_REGS, .vta_regs = B53_VTA_REGS,
.duplex_reg = B53_DUPLEX_STAT_GE, .duplex_reg = B53_DUPLEX_STAT_GE,
...@@ -2342,7 +2355,8 @@ static const struct b53_chip_data b53_switch_chips[] = { ...@@ -2342,7 +2355,8 @@ static const struct b53_chip_data b53_switch_chips[] = {
.dev_name = "BCM53012", .dev_name = "BCM53012",
.vlans = 4096, .vlans = 4096,
.enabled_ports = 0x1bf, .enabled_ports = 0x1bf,
.arl_entries = 4, .arl_bins = 4,
.arl_buckets = 1024,
.cpu_port = B53_CPU_PORT_25, /* TODO: auto detect */ .cpu_port = B53_CPU_PORT_25, /* TODO: auto detect */
.vta_regs = B53_VTA_REGS, .vta_regs = B53_VTA_REGS,
.duplex_reg = B53_DUPLEX_STAT_GE, .duplex_reg = B53_DUPLEX_STAT_GE,
...@@ -2354,7 +2368,8 @@ static const struct b53_chip_data b53_switch_chips[] = { ...@@ -2354,7 +2368,8 @@ static const struct b53_chip_data b53_switch_chips[] = {
.dev_name = "BCM53018", .dev_name = "BCM53018",
.vlans = 4096, .vlans = 4096,
.enabled_ports = 0x1f, .enabled_ports = 0x1f,
.arl_entries = 4, .arl_bins = 4,
.arl_buckets = 1024,
.cpu_port = B53_CPU_PORT_25, /* TODO: auto detect */ .cpu_port = B53_CPU_PORT_25, /* TODO: auto detect */
.vta_regs = B53_VTA_REGS, .vta_regs = B53_VTA_REGS,
.duplex_reg = B53_DUPLEX_STAT_GE, .duplex_reg = B53_DUPLEX_STAT_GE,
...@@ -2366,7 +2381,8 @@ static const struct b53_chip_data b53_switch_chips[] = { ...@@ -2366,7 +2381,8 @@ static const struct b53_chip_data b53_switch_chips[] = {
.dev_name = "BCM53019", .dev_name = "BCM53019",
.vlans = 4096, .vlans = 4096,
.enabled_ports = 0x1f, .enabled_ports = 0x1f,
.arl_entries = 4, .arl_bins = 4,
.arl_buckets = 1024,
.cpu_port = B53_CPU_PORT_25, /* TODO: auto detect */ .cpu_port = B53_CPU_PORT_25, /* TODO: auto detect */
.vta_regs = B53_VTA_REGS, .vta_regs = B53_VTA_REGS,
.duplex_reg = B53_DUPLEX_STAT_GE, .duplex_reg = B53_DUPLEX_STAT_GE,
...@@ -2378,7 +2394,8 @@ static const struct b53_chip_data b53_switch_chips[] = { ...@@ -2378,7 +2394,8 @@ static const struct b53_chip_data b53_switch_chips[] = {
.dev_name = "BCM585xx/586xx/88312", .dev_name = "BCM585xx/586xx/88312",
.vlans = 4096, .vlans = 4096,
.enabled_ports = 0x1ff, .enabled_ports = 0x1ff,
.arl_entries = 4, .arl_bins = 4,
.arl_buckets = 1024,
.cpu_port = B53_CPU_PORT, .cpu_port = B53_CPU_PORT,
.vta_regs = B53_VTA_REGS, .vta_regs = B53_VTA_REGS,
.duplex_reg = B53_DUPLEX_STAT_GE, .duplex_reg = B53_DUPLEX_STAT_GE,
...@@ -2390,7 +2407,8 @@ static const struct b53_chip_data b53_switch_chips[] = { ...@@ -2390,7 +2407,8 @@ static const struct b53_chip_data b53_switch_chips[] = {
.dev_name = "BCM583xx/11360", .dev_name = "BCM583xx/11360",
.vlans = 4096, .vlans = 4096,
.enabled_ports = 0x103, .enabled_ports = 0x103,
.arl_entries = 4, .arl_bins = 4,
.arl_buckets = 1024,
.cpu_port = B53_CPU_PORT, .cpu_port = B53_CPU_PORT,
.vta_regs = B53_VTA_REGS, .vta_regs = B53_VTA_REGS,
.duplex_reg = B53_DUPLEX_STAT_GE, .duplex_reg = B53_DUPLEX_STAT_GE,
...@@ -2402,7 +2420,8 @@ static const struct b53_chip_data b53_switch_chips[] = { ...@@ -2402,7 +2420,8 @@ static const struct b53_chip_data b53_switch_chips[] = {
.dev_name = "BCM7445", .dev_name = "BCM7445",
.vlans = 4096, .vlans = 4096,
.enabled_ports = 0x1ff, .enabled_ports = 0x1ff,
.arl_entries = 4, .arl_bins = 4,
.arl_buckets = 1024,
.cpu_port = B53_CPU_PORT, .cpu_port = B53_CPU_PORT,
.vta_regs = B53_VTA_REGS, .vta_regs = B53_VTA_REGS,
.duplex_reg = B53_DUPLEX_STAT_GE, .duplex_reg = B53_DUPLEX_STAT_GE,
...@@ -2414,7 +2433,8 @@ static const struct b53_chip_data b53_switch_chips[] = { ...@@ -2414,7 +2433,8 @@ static const struct b53_chip_data b53_switch_chips[] = {
.dev_name = "BCM7278", .dev_name = "BCM7278",
.vlans = 4096, .vlans = 4096,
.enabled_ports = 0x1ff, .enabled_ports = 0x1ff,
.arl_entries= 4, .arl_bins = 4,
.arl_buckets = 256,
.cpu_port = B53_CPU_PORT, .cpu_port = B53_CPU_PORT,
.vta_regs = B53_VTA_REGS, .vta_regs = B53_VTA_REGS,
.duplex_reg = B53_DUPLEX_STAT_GE, .duplex_reg = B53_DUPLEX_STAT_GE,
...@@ -2442,7 +2462,8 @@ static int b53_switch_init(struct b53_device *dev) ...@@ -2442,7 +2462,8 @@ static int b53_switch_init(struct b53_device *dev)
dev->jumbo_pm_reg = chip->jumbo_pm_reg; dev->jumbo_pm_reg = chip->jumbo_pm_reg;
dev->cpu_port = chip->cpu_port; dev->cpu_port = chip->cpu_port;
dev->num_vlans = chip->vlans; 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; break;
} }
} }
......
...@@ -117,7 +117,8 @@ struct b53_device { ...@@ -117,7 +117,8 @@ struct b53_device {
u8 jumbo_pm_reg; u8 jumbo_pm_reg;
u8 jumbo_size_reg; u8 jumbo_size_reg;
int reset_gpio; int reset_gpio;
u8 num_arl_entries; u8 num_arl_bins;
u16 num_arl_buckets;
enum dsa_tag_protocol tag_protocol; enum dsa_tag_protocol tag_protocol;
/* used ports mask */ /* used ports mask */
...@@ -212,6 +213,11 @@ static inline int is58xx(struct b53_device *dev) ...@@ -212,6 +213,11 @@ static inline int is58xx(struct b53_device *dev)
#define B53_CPU_PORT_25 5 #define B53_CPU_PORT_25 5
#define B53_CPU_PORT 8 #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, struct b53_device *b53_switch_alloc(struct device *base,
const struct b53_io_ops *ops, const struct b53_io_ops *ops,
void *priv); void *priv);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment