Skip to content

Commit

Permalink
net: ethernet: ti: cpsw_ale: use regfields for number of Entries and …
Browse files Browse the repository at this point in the history
…Policers

Use regfields for number of ALE Entries and Policers.

The variants that support Policers/Classifiers have the number
of policers encoded in the ALE_STATUS register.

Use that and show the number of Policers in the ALE info message.

Signed-off-by: Roger Quadros <rogerq@kernel.org>
Reviewed-by: Simon Horman <horms@kernel.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
rogerq authored and davem330 committed Sep 13, 2024
1 parent bbfc7e2 commit 11cbcfe
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 6 deletions.
25 changes: 19 additions & 6 deletions drivers/net/ethernet/ti/cpsw_ale.c
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,7 @@ struct cpsw_ale_dev_id {
#define ALE_UCAST_TOUCHED 3

#define ALE_TABLE_SIZE_MULTIPLIER 1024
#define ALE_STATUS_SIZE_MASK 0x1f
#define ALE_POLICER_SIZE_MULTIPLIER 8

static inline int cpsw_ale_get_field(u32 *ale_entry, u32 start, u32 bits)
{
Expand Down Expand Up @@ -1303,6 +1303,9 @@ static const struct reg_field ale_fields_cpsw_nu[] = {
/* CPSW_ALE_IDVER_REG */
[MINOR_VER] = REG_FIELD(ALE_IDVER, 0, 7),
[MAJOR_VER] = REG_FIELD(ALE_IDVER, 8, 10),
/* CPSW_ALE_STATUS_REG */
[ALE_ENTRIES] = REG_FIELD(ALE_STATUS, 0, 7),
[ALE_POLICERS] = REG_FIELD(ALE_STATUS, 8, 15),
};

static const struct cpsw_ale_dev_id cpsw_ale_id_match[] = {
Expand Down Expand Up @@ -1402,8 +1405,8 @@ static int cpsw_ale_regfield_init(struct cpsw_ale *ale)

struct cpsw_ale *cpsw_ale_create(struct cpsw_ale_params *params)
{
u32 ale_entries, rev_major, rev_minor, policers;
const struct cpsw_ale_dev_id *ale_dev_id;
u32 ale_entries, rev_major, rev_minor;
struct cpsw_ale *ale;
int ret;

Expand Down Expand Up @@ -1447,9 +1450,7 @@ struct cpsw_ale *cpsw_ale_create(struct cpsw_ale_params *params)

if (ale->features & CPSW_ALE_F_STATUS_REG &&
!ale->params.ale_entries) {
ale_entries =
readl_relaxed(ale->params.ale_regs + ALE_STATUS) &
ALE_STATUS_SIZE_MASK;
regmap_field_read(ale->fields[ALE_ENTRIES], &ale_entries);
/* ALE available on newer NetCP switches has introduced
* a register, ALE_STATUS, to indicate the size of ALE
* table which shows the size as a multiple of 1024 entries.
Expand All @@ -1463,8 +1464,20 @@ struct cpsw_ale *cpsw_ale_create(struct cpsw_ale_params *params)
ale_entries *= ALE_TABLE_SIZE_MULTIPLIER;
ale->params.ale_entries = ale_entries;
}

if (ale->features & CPSW_ALE_F_STATUS_REG &&
!ale->params.num_policers) {
regmap_field_read(ale->fields[ALE_POLICERS], &policers);
if (!policers)
return ERR_PTR(-EINVAL);

policers *= ALE_POLICER_SIZE_MULTIPLIER;
ale->params.num_policers = policers;
}

dev_info(ale->params.dev,
"ALE Table size %ld\n", ale->params.ale_entries);
"ALE Table size %ld, Policers %ld\n", ale->params.ale_entries,
ale->params.num_policers);

/* set default bits for existing h/w */
ale->port_mask_bits = ale->params.ale_ports;
Expand Down
3 changes: 3 additions & 0 deletions drivers/net/ethernet/ti/cpsw_ale.h
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ struct cpsw_ale_params {
void __iomem *ale_regs;
unsigned long ale_ageout; /* in secs */
unsigned long ale_entries;
unsigned long num_policers;
unsigned long ale_ports;
/* NU Switch has specific handling as number of bits in ALE entries
* are different than other versions of ALE. Also there are specific
Expand All @@ -33,6 +34,8 @@ struct regmap;
enum ale_fields {
MINOR_VER,
MAJOR_VER,
ALE_ENTRIES,
ALE_POLICERS,
/* terminator */
ALE_FIELDS_MAX,
};
Expand Down

0 comments on commit 11cbcfe

Please sign in to comment.