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: David S. Miller <davem@davemloft.net>
This commit is contained in:
commit
4d73ce1924
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user