net: dsa: microchip: refactor ethtool and devlink

- extract common regdump function
- conistently use ksz9477 instead of ksz9
- fix integer constants in code

Signed-off-by: Jan Sondhauss <jan.sondhauss@wago.com>
This commit is contained in:
Jan Sondhauss
2025-12-08 08:07:02 +01:00
committed by Oleg Karfich
parent 1e1dcb7b51
commit fdab488aa1
5 changed files with 59 additions and 80 deletions
-24
View File
@@ -85,30 +85,6 @@ static void ksz8_get_regs_dump_fdb(struct ksz_device *dev, u32 *reg, u32 *pos)
*pos = cnt;
}
static void ksz_dump_regmap_range(struct ksz_device *dev, u32 *regs, u32 *pos,
u32 start, u32 end)
{
int i, length = *pos;
const struct regmap_range *yes_ranges = dev->info->rd_table->yes_ranges;
for (i = 0; i < dev->info->rd_table->n_yes_ranges; i++) {
const struct regmap_range range = yes_ranges[i];
u32 reg;
if (range.range_max < start || range.range_min >= end)
continue;
for (reg = range.range_min; reg <= range.range_max; reg++) {
u8 val;
ksz_read8(dev, reg, &val);
regs[length++] = reg;
regs[length++] = val;
}
}
*pos = length;
}
void ksz8_get_regs(struct ksz_device *dev, int port, struct ethtool_regs *regs,
void *p)
{
+3 -28
View File
@@ -3,7 +3,7 @@
#include "ksz9477_ethtool.h"
#include "ksz_ethtool.h"
static const struct ksz_regdump_record ksz8_regdump_records[] = {
static const struct ksz_regdump_record ksz9477_regdump_records[] = {
KSZ_REGDUMP_ENTRY(KSZ_REGDUMP_ID_GLOBAL, 0x00, 0x700),
KSZ_REGDUMP_ENTRY(KSZ_REGDUMP_ID_PORT + 0, 0x1000, 0x1fff),
KSZ_REGDUMP_ENTRY(KSZ_REGDUMP_ID_PORT + 1, 0x2000, 0x2fff),
@@ -31,31 +31,6 @@ int ksz9477_get_regs_len(struct ksz_device *dev, int port)
return length;
}
static void ksz_dump_regmap_range(struct ksz_device *dev, u32 *regs, u32 *pos,
u32 start, u32 end)
{
int i, length = *pos;
const struct regmap_range *yes_ranges = dev->info->rd_table->yes_ranges;
for (i = 0; i < dev->info->rd_table->n_yes_ranges; i++) {
const struct regmap_range range = yes_ranges[i];
u32 reg;
if (range.range_max < start || range.range_min >= end)
continue;
for (reg = range.range_min; reg <= range.range_max; reg++) {
u8 val;
ksz_read8(dev, reg, &val);
regs[length++] = reg;
regs[length++] = val;
}
}
*pos = length;
}
void ksz9477_get_regs(struct ksz_device *dev, int port,
struct ethtool_regs *regs, void *p)
{
@@ -63,8 +38,8 @@ void ksz9477_get_regs(struct ksz_device *dev, int port,
u32 pos = 0;
u32 *reg = p;
for (i = 0; i < ARRAY_SIZE(ksz8_regdump_records); i++) {
struct ksz_regdump_record rec = ksz8_regdump_records[i];
for (i = 0; i < ARRAY_SIZE(ksz9477_regdump_records); i++) {
struct ksz_regdump_record rec = ksz9477_regdump_records[i];
struct ksz_regdump_hdr *hdr =
(struct ksz_regdump_hdr *)&reg[pos];
hdr->module_id = rec.hdr.module_id;
+1 -1
View File
@@ -221,7 +221,7 @@ static const struct ksz_dev_ops ksz8_dev_ops = {
.devlink_param_teardown = ksz8_teardown_devlink_params,
.devlink_param_get = ksz_devlink_param_get,
.devlink_param_set = ksz_devlink_param_set,
.devlink_info_get= ksz_devlink_info_get,
.devlink_info_get = ksz_devlink_info_get,
.get_regs = ksz8_get_regs,
.get_regs_len = ksz8_get_regs_len,
};
+26 -26
View File
@@ -13,8 +13,8 @@
#define KSZ8_P_BCAST_STORM_CTRL 0
#define KSZ8_PORT_BROADCAST_STORM BIT(7)
#define KSZ9_P_BCAST_STORM_CTRL 0x400
#define KSZ9_PORT_BROADCAST_STORM BIT(1)
#define KSZ9477_P_BCAST_STORM_CTRL 0x400
#define KSZ9477_PORT_BROADCAST_STORM BIT(1)
static void ksz_port_cfg(struct ksz_device *dev, int port, int offset, u8 bits,
@@ -30,8 +30,8 @@ enum ksz_devlink_param_id {
KSZ_DEVLINK_PARAM_ID_MCAST_STORM_RATE_DISABLE,
KSZ_DEVLINK_PARAM_ID_PORT_BASE,
KSZ_DEVLINK_PARAM_ID_PORT_MAX = KSZ_DEVLINK_PARAM_ID_PORT_BASE + 3,
KSZ9_DEVLINK_PARAM_ID_PORT_BASE,
KSZ9_DEVLINK_PARAM_ID_PORT_MAX = KSZ9_DEVLINK_PARAM_ID_PORT_BASE + 8,
KSZ9477_DEVLINK_PARAM_ID_PORT_BASE,
KSZ9477_DEVLINK_PARAM_ID_PORT_MAX = KSZ9477_DEVLINK_PARAM_ID_PORT_BASE + 8,
};
static const struct devlink_param ksz8_devlink_params[] = {
@@ -57,7 +57,7 @@ static const struct devlink_param ksz8_devlink_params[] = {
};
static const struct devlink_param ksz9_devlink_params[] = {
static const struct devlink_param ksz9477_devlink_params[] = {
DSA_DEVLINK_PARAM_DRIVER(KSZ_DEVLINK_PARAM_ID_BROADCAST_STORM_RATE,
"bcast storm rate", DEVLINK_PARAM_TYPE_U16,
BIT(DEVLINK_PARAM_CMODE_RUNTIME)),
@@ -65,35 +65,35 @@ static const struct devlink_param ksz9_devlink_params[] = {
"mcast storm rate disable",
DEVLINK_PARAM_TYPE_BOOL,
BIT(DEVLINK_PARAM_CMODE_RUNTIME)),
DSA_DEVLINK_PARAM_DRIVER(KSZ9_DEVLINK_PARAM_ID_PORT_BASE,
DSA_DEVLINK_PARAM_DRIVER(KSZ9477_DEVLINK_PARAM_ID_PORT_BASE,
"bcast storm protection enable port 0",
DEVLINK_PARAM_TYPE_BOOL,
BIT(DEVLINK_PARAM_CMODE_RUNTIME)),
DSA_DEVLINK_PARAM_DRIVER(KSZ9_DEVLINK_PARAM_ID_PORT_BASE + 1,
DSA_DEVLINK_PARAM_DRIVER(KSZ9477_DEVLINK_PARAM_ID_PORT_BASE + 1,
"bcast storm protection enable port 1",
DEVLINK_PARAM_TYPE_BOOL,
BIT(DEVLINK_PARAM_CMODE_RUNTIME)),
DSA_DEVLINK_PARAM_DRIVER(KSZ9_DEVLINK_PARAM_ID_PORT_BASE + 2,
DSA_DEVLINK_PARAM_DRIVER(KSZ9477_DEVLINK_PARAM_ID_PORT_BASE + 2,
"bcast storm protection enable port 2",
DEVLINK_PARAM_TYPE_BOOL,
BIT(DEVLINK_PARAM_CMODE_RUNTIME)),
DSA_DEVLINK_PARAM_DRIVER(KSZ9_DEVLINK_PARAM_ID_PORT_BASE + 3,
DSA_DEVLINK_PARAM_DRIVER(KSZ9477_DEVLINK_PARAM_ID_PORT_BASE + 3,
"bcast storm protection enable port 3",
DEVLINK_PARAM_TYPE_BOOL,
BIT(DEVLINK_PARAM_CMODE_RUNTIME)),
DSA_DEVLINK_PARAM_DRIVER(KSZ9_DEVLINK_PARAM_ID_PORT_BASE + 4,
DSA_DEVLINK_PARAM_DRIVER(KSZ9477_DEVLINK_PARAM_ID_PORT_BASE + 4,
"bcast storm protection enable port 4",
DEVLINK_PARAM_TYPE_BOOL,
BIT(DEVLINK_PARAM_CMODE_RUNTIME)),
DSA_DEVLINK_PARAM_DRIVER(KSZ9_DEVLINK_PARAM_ID_PORT_BASE + 5,
DSA_DEVLINK_PARAM_DRIVER(KSZ9477_DEVLINK_PARAM_ID_PORT_BASE + 5,
"bcast storm protection enable port 5",
DEVLINK_PARAM_TYPE_BOOL,
BIT(DEVLINK_PARAM_CMODE_RUNTIME)),
DSA_DEVLINK_PARAM_DRIVER(KSZ9_DEVLINK_PARAM_ID_PORT_BASE + 6,
DSA_DEVLINK_PARAM_DRIVER(KSZ9477_DEVLINK_PARAM_ID_PORT_BASE + 6,
"bcast storm protection enable port 6",
DEVLINK_PARAM_TYPE_BOOL,
BIT(DEVLINK_PARAM_CMODE_RUNTIME)),
DSA_DEVLINK_PARAM_DRIVER(KSZ9_DEVLINK_PARAM_ID_PORT_BASE + 7,
DSA_DEVLINK_PARAM_DRIVER(KSZ9477_DEVLINK_PARAM_ID_PORT_BASE + 7,
"bcast storm protection enable port 7",
DEVLINK_PARAM_TYPE_BOOL,
BIT(DEVLINK_PARAM_CMODE_RUNTIME)),
@@ -113,14 +113,14 @@ void ksz8_teardown_devlink_params(struct dsa_switch *ds)
int ksz9477_setup_devlink_params(struct dsa_switch *ds)
{
return dsa_devlink_params_register(ds, ksz9_devlink_params,
ARRAY_SIZE(ksz9_devlink_params));
return dsa_devlink_params_register(ds, ksz9477_devlink_params,
ARRAY_SIZE(ksz9477_devlink_params));
}
void ksz9477_teardown_devlink_params(struct dsa_switch *ds)
{
dsa_devlink_params_unregister(ds, ksz9_devlink_params,
ARRAY_SIZE(ksz9_devlink_params));
dsa_devlink_params_unregister(ds, ksz9477_devlink_params,
ARRAY_SIZE(ksz9477_devlink_params));
}
int ksz_devlink_param_get(struct ksz_device *dev, u32 id,
@@ -152,14 +152,14 @@ int ksz_devlink_param_get(struct ksz_device *dev, u32 id,
KSZ8_PORT_BROADCAST_STORM;
} break;
case KSZ9_DEVLINK_PARAM_ID_PORT_BASE ... KSZ9_DEVLINK_PARAM_ID_PORT_MAX: {
int port = id - KSZ9_DEVLINK_PARAM_ID_PORT_BASE;
case KSZ9477_DEVLINK_PARAM_ID_PORT_BASE ... KSZ9477_DEVLINK_PARAM_ID_PORT_MAX: {
int port = id - KSZ9477_DEVLINK_PARAM_ID_PORT_BASE;
u8 val;
ksz_pread8(dev, port, 0x400, &val);
ksz_pread8(dev, port, KSZ9477_P_BCAST_STORM_CTRL, &val);
ctx->val.vbool = (val & KSZ9_PORT_BROADCAST_STORM) ==
KSZ9_PORT_BROADCAST_STORM;
ctx->val.vbool = (val & KSZ9477_PORT_BROADCAST_STORM) ==
KSZ9477_PORT_BROADCAST_STORM;
} break;
default:
@@ -205,11 +205,11 @@ int ksz_devlink_param_set(struct ksz_device *dev, u32 id,
KSZ8_PORT_BROADCAST_STORM, ctx->val.vbool);
} break;
case KSZ9_DEVLINK_PARAM_ID_PORT_BASE ... KSZ9_DEVLINK_PARAM_ID_PORT_MAX: {
int port = id - KSZ9_DEVLINK_PARAM_ID_PORT_BASE;
case KSZ9477_DEVLINK_PARAM_ID_PORT_BASE ... KSZ9477_DEVLINK_PARAM_ID_PORT_MAX: {
int port = id - KSZ9477_DEVLINK_PARAM_ID_PORT_BASE;
ksz_port_cfg(dev, port, KSZ9_P_BCAST_STORM_CTRL,
KSZ9_PORT_BROADCAST_STORM, ctx->val.vbool);
ksz_port_cfg(dev, port, KSZ9477_P_BCAST_STORM_CTRL,
KSZ9477_PORT_BROADCAST_STORM, ctx->val.vbool);
} break;
default:
+29 -1
View File
@@ -5,6 +5,9 @@
#include <linux/types.h>
#include <linux/if_ether.h>
#include <linux/regmap.h>
#include "ksz_common.h"
// sizeof(ksz8_dyn_mac_entry) == 12
struct ksz8_dyn_mac_entry {
@@ -56,5 +59,30 @@ enum {
.end_off = 0, \
}
#endif
static inline void ksz_dump_regmap_range(struct ksz_device *dev, u32 *regs, u32 *pos,
u32 start, u32 end)
{
int i, length = *pos;
const struct regmap_range *yes_ranges = dev->info->rd_table->yes_ranges;
for (i = 0; i < dev->info->rd_table->n_yes_ranges; i++) {
const struct regmap_range range = yes_ranges[i];
u32 reg;
if (range.range_max < start || range.range_min >= end)
continue;
for (reg = range.range_min; reg <= range.range_max; reg++) {
u8 val;
ksz_read8(dev, reg, &val);
regs[length++] = reg;
regs[length++] = val;
}
}
*pos = length;
}
#endif