| From 2dc10caab9c946258295051933cc1a13a3201cd1 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Mon, 4 May 2020 01:20:26 +0300 |
| Subject: net: dsa: ocelot: the MAC table on Felix is twice as large |
| |
| From: Vladimir Oltean <vladimir.oltean@nxp.com> |
| |
| [ Upstream commit 21ce7f3e16fbf89faaf149cfe0f730edfc553914 ] |
| |
| When running 'bridge fdb dump' on Felix, sometimes learnt and static MAC |
| addresses would appear, sometimes they wouldn't. |
| |
| Turns out, the MAC table has 4096 entries on VSC7514 (Ocelot) and 8192 |
| entries on VSC9959 (Felix), so the existing code from the Ocelot common |
| library only dumped half of Felix's MAC table. They are both organized |
| as a 4-way set-associative TCAM, so we just need a single variable |
| indicating the correct number of rows. |
| |
| Fixes: 56051948773e ("net: dsa: ocelot: add driver for Felix switch family") |
| Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com> |
| Reviewed-by: Florian Fainelli <f.fainelli@gmail.com> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/net/dsa/ocelot/felix.c | 1 + |
| drivers/net/dsa/ocelot/felix.h | 1 + |
| drivers/net/dsa/ocelot/felix_vsc9959.c | 1 + |
| drivers/net/ethernet/mscc/ocelot.c | 6 ++---- |
| drivers/net/ethernet/mscc/ocelot_regs.c | 1 + |
| include/soc/mscc/ocelot.h | 1 + |
| 6 files changed, 7 insertions(+), 4 deletions(-) |
| |
| diff --git a/drivers/net/dsa/ocelot/felix.c b/drivers/net/dsa/ocelot/felix.c |
| index 9e895ab586d5a..a7780c06fa65b 100644 |
| --- a/drivers/net/dsa/ocelot/felix.c |
| +++ b/drivers/net/dsa/ocelot/felix.c |
| @@ -397,6 +397,7 @@ static int felix_init_structs(struct felix *felix, int num_phys_ports) |
| ocelot->stats_layout = felix->info->stats_layout; |
| ocelot->num_stats = felix->info->num_stats; |
| ocelot->shared_queue_sz = felix->info->shared_queue_sz; |
| + ocelot->num_mact_rows = felix->info->num_mact_rows; |
| ocelot->ops = felix->info->ops; |
| |
| port_phy_modes = kcalloc(num_phys_ports, sizeof(phy_interface_t), |
| diff --git a/drivers/net/dsa/ocelot/felix.h b/drivers/net/dsa/ocelot/felix.h |
| index 3a7580015b621..8771d40324f10 100644 |
| --- a/drivers/net/dsa/ocelot/felix.h |
| +++ b/drivers/net/dsa/ocelot/felix.h |
| @@ -15,6 +15,7 @@ struct felix_info { |
| const u32 *const *map; |
| const struct ocelot_ops *ops; |
| int shared_queue_sz; |
| + int num_mact_rows; |
| const struct ocelot_stat_layout *stats_layout; |
| unsigned int num_stats; |
| int num_ports; |
| diff --git a/drivers/net/dsa/ocelot/felix_vsc9959.c b/drivers/net/dsa/ocelot/felix_vsc9959.c |
| index 2c812b481778c..edc1a67c002b6 100644 |
| --- a/drivers/net/dsa/ocelot/felix_vsc9959.c |
| +++ b/drivers/net/dsa/ocelot/felix_vsc9959.c |
| @@ -1090,6 +1090,7 @@ struct felix_info felix_info_vsc9959 = { |
| .stats_layout = vsc9959_stats_layout, |
| .num_stats = ARRAY_SIZE(vsc9959_stats_layout), |
| .shared_queue_sz = 128 * 1024, |
| + .num_mact_rows = 2048, |
| .num_ports = 6, |
| .switch_pci_bar = 4, |
| .imdio_pci_bar = 0, |
| diff --git a/drivers/net/ethernet/mscc/ocelot.c b/drivers/net/ethernet/mscc/ocelot.c |
| index b14286dc49fb5..33ef8690eafe9 100644 |
| --- a/drivers/net/ethernet/mscc/ocelot.c |
| +++ b/drivers/net/ethernet/mscc/ocelot.c |
| @@ -1016,10 +1016,8 @@ int ocelot_fdb_dump(struct ocelot *ocelot, int port, |
| { |
| int i, j; |
| |
| - /* Loop through all the mac tables entries. There are 1024 rows of 4 |
| - * entries. |
| - */ |
| - for (i = 0; i < 1024; i++) { |
| + /* Loop through all the mac tables entries. */ |
| + for (i = 0; i < ocelot->num_mact_rows; i++) { |
| for (j = 0; j < 4; j++) { |
| struct ocelot_mact_entry entry; |
| bool is_static; |
| diff --git a/drivers/net/ethernet/mscc/ocelot_regs.c b/drivers/net/ethernet/mscc/ocelot_regs.c |
| index b88b5899b2273..7d4fd1b6addaf 100644 |
| --- a/drivers/net/ethernet/mscc/ocelot_regs.c |
| +++ b/drivers/net/ethernet/mscc/ocelot_regs.c |
| @@ -431,6 +431,7 @@ int ocelot_chip_init(struct ocelot *ocelot, const struct ocelot_ops *ops) |
| ocelot->stats_layout = ocelot_stats_layout; |
| ocelot->num_stats = ARRAY_SIZE(ocelot_stats_layout); |
| ocelot->shared_queue_sz = 224 * 1024; |
| + ocelot->num_mact_rows = 1024; |
| ocelot->ops = ops; |
| |
| ret = ocelot_regfields_init(ocelot, ocelot_regfields); |
| diff --git a/include/soc/mscc/ocelot.h b/include/soc/mscc/ocelot.h |
| index f8e1955c86f14..7b5382e10bd29 100644 |
| --- a/include/soc/mscc/ocelot.h |
| +++ b/include/soc/mscc/ocelot.h |
| @@ -437,6 +437,7 @@ struct ocelot { |
| unsigned int num_stats; |
| |
| int shared_queue_sz; |
| + int num_mact_rows; |
| |
| struct net_device *hw_bridge_dev; |
| u16 bridge_mask; |
| -- |
| 2.20.1 |
| |