mirror of
https://github.com/VIKINGYFY/immortalwrt.git
synced 2025-12-16 09:10:38 +00:00
These patches have been accepted in netdev-next for linux v6.19.
2b3013ac0302 net: dsa: b53: add support for bcm63xx ARL entry format
300f78e8b6b7 net: dsa: b53: add support for 5389/5397/5398 ARL entry format
a7e73339ad46 net: dsa: b53: move ARL entry functions into ops struct
e0c476f325a8 net: dsa: b53: split reading search entry into their own functions
1716be6db04a net: dsa: b53: provide accessors for accessing ARL_SRCH_CTL
bf6e9d2ae1db net: dsa: b53: move writing ARL entries into their own functions
4a291fe72267 net: dsa: b53: move reading ARL entries into their own function
a6e4fd38bf2f net: dsa: b53: b53_arl_read{,25}(): use the entry for comparision
Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
349 lines
10 KiB
Diff
349 lines
10 KiB
Diff
From a7e73339ad46ade76d29fb6cc7d7854222608c26 Mon Sep 17 00:00:00 2001
|
|
From: Jonas Gorski <jonas.gorski@gmail.com>
|
|
Date: Fri, 7 Nov 2025 09:07:47 +0100
|
|
Subject: [PATCH] net: dsa: b53: move ARL entry functions into ops struct
|
|
|
|
Now that the differences in ARL entry formats are neatly contained into
|
|
functions per chip family, wrap them into an ops struct and add wrapper
|
|
functions to access them.
|
|
|
|
Signed-off-by: Jonas Gorski <jonas.gorski@gmail.com>
|
|
Reviewed-by: Florian Fainelli <florian.fainelli@broadcom.com>
|
|
Link: https://patch.msgid.link/20251107080749.26936-7-jonas.gorski@gmail.com
|
|
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
|
|
---
|
|
drivers/net/dsa/b53/b53_common.c | 67 ++++++++++++++++++++++----------
|
|
drivers/net/dsa/b53/b53_priv.h | 30 ++++++++++++++
|
|
2 files changed, 76 insertions(+), 21 deletions(-)
|
|
|
|
--- a/drivers/net/dsa/b53/b53_common.c
|
|
+++ b/drivers/net/dsa/b53/b53_common.c
|
|
@@ -1890,10 +1890,7 @@ static int b53_arl_read(struct b53_devic
|
|
|
|
/* Read the bins */
|
|
for (i = 0; i < dev->num_arl_bins; i++) {
|
|
- if (is5325(dev) || is5365(dev))
|
|
- b53_arl_read_entry_25(dev, ent, i);
|
|
- else
|
|
- b53_arl_read_entry_95(dev, ent, i);
|
|
+ b53_arl_read_entry(dev, ent, i);
|
|
|
|
if (!ent->is_valid) {
|
|
set_bit(i, free_bins);
|
|
@@ -1975,10 +1972,7 @@ static int b53_arl_op(struct b53_device
|
|
ent.is_static = true;
|
|
ent.is_age = false;
|
|
memcpy(ent.mac, addr, ETH_ALEN);
|
|
- if (is5325(dev) || is5365(dev))
|
|
- b53_arl_write_entry_25(dev, &ent, idx);
|
|
- else
|
|
- b53_arl_write_entry_95(dev, &ent, idx);
|
|
+ b53_arl_write_entry(dev, &ent, idx);
|
|
|
|
return b53_arl_rw_op(dev, 0);
|
|
}
|
|
@@ -2089,17 +2083,6 @@ static void b53_arl_search_read_95(struc
|
|
b53_arl_to_entry(ent, mac_vid, fwd_entry);
|
|
}
|
|
|
|
-static void b53_arl_search_rd(struct b53_device *dev, u8 idx,
|
|
- struct b53_arl_entry *ent)
|
|
-{
|
|
- if (is5325(dev))
|
|
- b53_arl_search_read_25(dev, idx, ent);
|
|
- else if (is5365(dev))
|
|
- b53_arl_search_read_65(dev, idx, ent);
|
|
- else
|
|
- b53_arl_search_read_95(dev, idx, ent);
|
|
-}
|
|
-
|
|
static int b53_fdb_copy(int port, const struct b53_arl_entry *ent,
|
|
dsa_fdb_dump_cb_t *cb, void *data)
|
|
{
|
|
@@ -2133,13 +2116,13 @@ int b53_fdb_dump(struct dsa_switch *ds,
|
|
if (ret)
|
|
break;
|
|
|
|
- b53_arl_search_rd(priv, 0, &results[0]);
|
|
+ b53_arl_search_read(priv, 0, &results[0]);
|
|
ret = b53_fdb_copy(port, &results[0], cb, data);
|
|
if (ret)
|
|
break;
|
|
|
|
if (results_per_hit == 2) {
|
|
- b53_arl_search_rd(priv, 1, &results[1]);
|
|
+ b53_arl_search_read(priv, 1, &results[1]);
|
|
ret = b53_fdb_copy(port, &results[1], cb, data);
|
|
if (ret)
|
|
break;
|
|
@@ -2672,6 +2655,24 @@ static const struct dsa_switch_ops b53_s
|
|
.port_change_mtu = b53_change_mtu,
|
|
};
|
|
|
|
+static const struct b53_arl_ops b53_arl_ops_25 = {
|
|
+ .arl_read_entry = b53_arl_read_entry_25,
|
|
+ .arl_write_entry = b53_arl_write_entry_25,
|
|
+ .arl_search_read = b53_arl_search_read_25,
|
|
+};
|
|
+
|
|
+static const struct b53_arl_ops b53_arl_ops_65 = {
|
|
+ .arl_read_entry = b53_arl_read_entry_25,
|
|
+ .arl_write_entry = b53_arl_write_entry_25,
|
|
+ .arl_search_read = b53_arl_search_read_65,
|
|
+};
|
|
+
|
|
+static const struct b53_arl_ops b53_arl_ops_95 = {
|
|
+ .arl_read_entry = b53_arl_read_entry_95,
|
|
+ .arl_write_entry = b53_arl_write_entry_95,
|
|
+ .arl_search_read = b53_arl_search_read_95,
|
|
+};
|
|
+
|
|
struct b53_chip_data {
|
|
u32 chip_id;
|
|
const char *dev_name;
|
|
@@ -2685,6 +2686,7 @@ struct b53_chip_data {
|
|
u8 duplex_reg;
|
|
u8 jumbo_pm_reg;
|
|
u8 jumbo_size_reg;
|
|
+ const struct b53_arl_ops *arl_ops;
|
|
};
|
|
|
|
#define B53_VTA_REGS \
|
|
@@ -2704,6 +2706,7 @@ static const struct b53_chip_data b53_sw
|
|
.arl_buckets = 1024,
|
|
.imp_port = 5,
|
|
.duplex_reg = B53_DUPLEX_STAT_FE,
|
|
+ .arl_ops = &b53_arl_ops_25,
|
|
},
|
|
{
|
|
.chip_id = BCM5365_DEVICE_ID,
|
|
@@ -2714,6 +2717,7 @@ static const struct b53_chip_data b53_sw
|
|
.arl_buckets = 1024,
|
|
.imp_port = 5,
|
|
.duplex_reg = B53_DUPLEX_STAT_FE,
|
|
+ .arl_ops = &b53_arl_ops_65,
|
|
},
|
|
{
|
|
.chip_id = BCM5389_DEVICE_ID,
|
|
@@ -2727,6 +2731,7 @@ static const struct b53_chip_data b53_sw
|
|
.duplex_reg = B53_DUPLEX_STAT_GE,
|
|
.jumbo_pm_reg = B53_JUMBO_PORT_MASK,
|
|
.jumbo_size_reg = B53_JUMBO_MAX_SIZE,
|
|
+ .arl_ops = &b53_arl_ops_95,
|
|
},
|
|
{
|
|
.chip_id = BCM5395_DEVICE_ID,
|
|
@@ -2740,6 +2745,7 @@ static const struct b53_chip_data b53_sw
|
|
.duplex_reg = B53_DUPLEX_STAT_GE,
|
|
.jumbo_pm_reg = B53_JUMBO_PORT_MASK,
|
|
.jumbo_size_reg = B53_JUMBO_MAX_SIZE,
|
|
+ .arl_ops = &b53_arl_ops_95,
|
|
},
|
|
{
|
|
.chip_id = BCM5397_DEVICE_ID,
|
|
@@ -2753,6 +2759,7 @@ static const struct b53_chip_data b53_sw
|
|
.duplex_reg = B53_DUPLEX_STAT_GE,
|
|
.jumbo_pm_reg = B53_JUMBO_PORT_MASK,
|
|
.jumbo_size_reg = B53_JUMBO_MAX_SIZE,
|
|
+ .arl_ops = &b53_arl_ops_95,
|
|
},
|
|
{
|
|
.chip_id = BCM5398_DEVICE_ID,
|
|
@@ -2766,6 +2773,7 @@ static const struct b53_chip_data b53_sw
|
|
.duplex_reg = B53_DUPLEX_STAT_GE,
|
|
.jumbo_pm_reg = B53_JUMBO_PORT_MASK,
|
|
.jumbo_size_reg = B53_JUMBO_MAX_SIZE,
|
|
+ .arl_ops = &b53_arl_ops_95,
|
|
},
|
|
{
|
|
.chip_id = BCM53101_DEVICE_ID,
|
|
@@ -2779,6 +2787,7 @@ static const struct b53_chip_data b53_sw
|
|
.duplex_reg = B53_DUPLEX_STAT_GE,
|
|
.jumbo_pm_reg = B53_JUMBO_PORT_MASK,
|
|
.jumbo_size_reg = B53_JUMBO_MAX_SIZE,
|
|
+ .arl_ops = &b53_arl_ops_95,
|
|
},
|
|
{
|
|
.chip_id = BCM53115_DEVICE_ID,
|
|
@@ -2792,6 +2801,7 @@ static const struct b53_chip_data b53_sw
|
|
.duplex_reg = B53_DUPLEX_STAT_GE,
|
|
.jumbo_pm_reg = B53_JUMBO_PORT_MASK,
|
|
.jumbo_size_reg = B53_JUMBO_MAX_SIZE,
|
|
+ .arl_ops = &b53_arl_ops_95,
|
|
},
|
|
{
|
|
.chip_id = BCM53125_DEVICE_ID,
|
|
@@ -2805,6 +2815,7 @@ static const struct b53_chip_data b53_sw
|
|
.duplex_reg = B53_DUPLEX_STAT_GE,
|
|
.jumbo_pm_reg = B53_JUMBO_PORT_MASK,
|
|
.jumbo_size_reg = B53_JUMBO_MAX_SIZE,
|
|
+ .arl_ops = &b53_arl_ops_95,
|
|
},
|
|
{
|
|
.chip_id = BCM53128_DEVICE_ID,
|
|
@@ -2818,6 +2829,7 @@ static const struct b53_chip_data b53_sw
|
|
.duplex_reg = B53_DUPLEX_STAT_GE,
|
|
.jumbo_pm_reg = B53_JUMBO_PORT_MASK,
|
|
.jumbo_size_reg = B53_JUMBO_MAX_SIZE,
|
|
+ .arl_ops = &b53_arl_ops_95,
|
|
},
|
|
{
|
|
.chip_id = BCM63XX_DEVICE_ID,
|
|
@@ -2831,6 +2843,7 @@ static const struct b53_chip_data b53_sw
|
|
.duplex_reg = B53_DUPLEX_STAT_63XX,
|
|
.jumbo_pm_reg = B53_JUMBO_PORT_MASK_63XX,
|
|
.jumbo_size_reg = B53_JUMBO_MAX_SIZE_63XX,
|
|
+ .arl_ops = &b53_arl_ops_95,
|
|
},
|
|
{
|
|
.chip_id = BCM53010_DEVICE_ID,
|
|
@@ -2844,6 +2857,7 @@ static const struct b53_chip_data b53_sw
|
|
.duplex_reg = B53_DUPLEX_STAT_GE,
|
|
.jumbo_pm_reg = B53_JUMBO_PORT_MASK,
|
|
.jumbo_size_reg = B53_JUMBO_MAX_SIZE,
|
|
+ .arl_ops = &b53_arl_ops_95,
|
|
},
|
|
{
|
|
.chip_id = BCM53011_DEVICE_ID,
|
|
@@ -2857,6 +2871,7 @@ static const struct b53_chip_data b53_sw
|
|
.duplex_reg = B53_DUPLEX_STAT_GE,
|
|
.jumbo_pm_reg = B53_JUMBO_PORT_MASK,
|
|
.jumbo_size_reg = B53_JUMBO_MAX_SIZE,
|
|
+ .arl_ops = &b53_arl_ops_95,
|
|
},
|
|
{
|
|
.chip_id = BCM53012_DEVICE_ID,
|
|
@@ -2870,6 +2885,7 @@ static const struct b53_chip_data b53_sw
|
|
.duplex_reg = B53_DUPLEX_STAT_GE,
|
|
.jumbo_pm_reg = B53_JUMBO_PORT_MASK,
|
|
.jumbo_size_reg = B53_JUMBO_MAX_SIZE,
|
|
+ .arl_ops = &b53_arl_ops_95,
|
|
},
|
|
{
|
|
.chip_id = BCM53018_DEVICE_ID,
|
|
@@ -2883,6 +2899,7 @@ static const struct b53_chip_data b53_sw
|
|
.duplex_reg = B53_DUPLEX_STAT_GE,
|
|
.jumbo_pm_reg = B53_JUMBO_PORT_MASK,
|
|
.jumbo_size_reg = B53_JUMBO_MAX_SIZE,
|
|
+ .arl_ops = &b53_arl_ops_95,
|
|
},
|
|
{
|
|
.chip_id = BCM53019_DEVICE_ID,
|
|
@@ -2896,6 +2913,7 @@ static const struct b53_chip_data b53_sw
|
|
.duplex_reg = B53_DUPLEX_STAT_GE,
|
|
.jumbo_pm_reg = B53_JUMBO_PORT_MASK,
|
|
.jumbo_size_reg = B53_JUMBO_MAX_SIZE,
|
|
+ .arl_ops = &b53_arl_ops_95,
|
|
},
|
|
{
|
|
.chip_id = BCM58XX_DEVICE_ID,
|
|
@@ -2909,6 +2927,7 @@ static const struct b53_chip_data b53_sw
|
|
.duplex_reg = B53_DUPLEX_STAT_GE,
|
|
.jumbo_pm_reg = B53_JUMBO_PORT_MASK,
|
|
.jumbo_size_reg = B53_JUMBO_MAX_SIZE,
|
|
+ .arl_ops = &b53_arl_ops_95,
|
|
},
|
|
{
|
|
.chip_id = BCM583XX_DEVICE_ID,
|
|
@@ -2922,6 +2941,7 @@ static const struct b53_chip_data b53_sw
|
|
.duplex_reg = B53_DUPLEX_STAT_GE,
|
|
.jumbo_pm_reg = B53_JUMBO_PORT_MASK,
|
|
.jumbo_size_reg = B53_JUMBO_MAX_SIZE,
|
|
+ .arl_ops = &b53_arl_ops_95,
|
|
},
|
|
/* Starfighter 2 */
|
|
{
|
|
@@ -2936,6 +2956,7 @@ static const struct b53_chip_data b53_sw
|
|
.duplex_reg = B53_DUPLEX_STAT_GE,
|
|
.jumbo_pm_reg = B53_JUMBO_PORT_MASK,
|
|
.jumbo_size_reg = B53_JUMBO_MAX_SIZE,
|
|
+ .arl_ops = &b53_arl_ops_95,
|
|
},
|
|
{
|
|
.chip_id = BCM7445_DEVICE_ID,
|
|
@@ -2949,6 +2970,7 @@ static const struct b53_chip_data b53_sw
|
|
.duplex_reg = B53_DUPLEX_STAT_GE,
|
|
.jumbo_pm_reg = B53_JUMBO_PORT_MASK,
|
|
.jumbo_size_reg = B53_JUMBO_MAX_SIZE,
|
|
+ .arl_ops = &b53_arl_ops_95,
|
|
},
|
|
{
|
|
.chip_id = BCM7278_DEVICE_ID,
|
|
@@ -2962,6 +2984,7 @@ static const struct b53_chip_data b53_sw
|
|
.duplex_reg = B53_DUPLEX_STAT_GE,
|
|
.jumbo_pm_reg = B53_JUMBO_PORT_MASK,
|
|
.jumbo_size_reg = B53_JUMBO_MAX_SIZE,
|
|
+ .arl_ops = &b53_arl_ops_95,
|
|
},
|
|
{
|
|
.chip_id = BCM53134_DEVICE_ID,
|
|
@@ -2976,6 +2999,7 @@ static const struct b53_chip_data b53_sw
|
|
.duplex_reg = B53_DUPLEX_STAT_GE,
|
|
.jumbo_pm_reg = B53_JUMBO_PORT_MASK,
|
|
.jumbo_size_reg = B53_JUMBO_MAX_SIZE,
|
|
+ .arl_ops = &b53_arl_ops_95,
|
|
},
|
|
};
|
|
|
|
@@ -3004,6 +3028,7 @@ static int b53_switch_init(struct b53_de
|
|
dev->num_vlans = chip->vlans;
|
|
dev->num_arl_bins = chip->arl_bins;
|
|
dev->num_arl_buckets = chip->arl_buckets;
|
|
+ dev->arl_ops = chip->arl_ops;
|
|
break;
|
|
}
|
|
}
|
|
--- a/drivers/net/dsa/b53/b53_priv.h
|
|
+++ b/drivers/net/dsa/b53/b53_priv.h
|
|
@@ -58,6 +58,17 @@ struct b53_io_ops {
|
|
bool link_up);
|
|
};
|
|
|
|
+struct b53_arl_entry;
|
|
+
|
|
+struct b53_arl_ops {
|
|
+ void (*arl_read_entry)(struct b53_device *dev,
|
|
+ struct b53_arl_entry *ent, u8 idx);
|
|
+ void (*arl_write_entry)(struct b53_device *dev,
|
|
+ const struct b53_arl_entry *ent, u8 idx);
|
|
+ void (*arl_search_read)(struct b53_device *dev, u8 idx,
|
|
+ struct b53_arl_entry *ent);
|
|
+};
|
|
+
|
|
#define B53_INVALID_LANE 0xff
|
|
|
|
enum {
|
|
@@ -127,6 +138,7 @@ struct b53_device {
|
|
struct mutex stats_mutex;
|
|
struct mutex arl_mutex;
|
|
const struct b53_io_ops *ops;
|
|
+ const struct b53_arl_ops *arl_ops;
|
|
|
|
/* chip specific data */
|
|
u32 chip_id;
|
|
@@ -371,6 +383,24 @@ static inline void b53_arl_from_entry_25
|
|
*mac_vid |= ARLTBL_AGE_25;
|
|
}
|
|
|
|
+static inline void b53_arl_read_entry(struct b53_device *dev,
|
|
+ struct b53_arl_entry *ent, u8 idx)
|
|
+{
|
|
+ dev->arl_ops->arl_read_entry(dev, ent, idx);
|
|
+}
|
|
+
|
|
+static inline void b53_arl_write_entry(struct b53_device *dev,
|
|
+ const struct b53_arl_entry *ent, u8 idx)
|
|
+{
|
|
+ dev->arl_ops->arl_write_entry(dev, ent, idx);
|
|
+}
|
|
+
|
|
+static inline void b53_arl_search_read(struct b53_device *dev, u8 idx,
|
|
+ struct b53_arl_entry *ent)
|
|
+{
|
|
+ dev->arl_ops->arl_search_read(dev, idx, ent);
|
|
+}
|
|
+
|
|
#ifdef CONFIG_BCM47XX
|
|
|
|
#include <linux/bcm47xx_nvram.h>
|