mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-11-25 06:40:53 +07:00
net: dsa: sja1105: Make room for P/Q/R/S FDB operations
The DSA callbacks were written with the E/T (first generation) in mind, which is quite different. For P/Q/R/S completely new implementations need to be provided, which are held as function pointers in the priv->info structure. We are taking a slightly roundabout way for this (a function from sja1105_main.c reads a structure defined in sja1105_spi.c that points to a function defined in sja1105_main.c), but it is what it is. The FDB dump callback works for both families, hence no function pointer for that. Signed-off-by: Vladimir Oltean <olteanv@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
90c96cca35
commit
9dfa69118f
@ -55,6 +55,11 @@ struct sja1105_info {
|
|||||||
const struct sja1105_regs *regs;
|
const struct sja1105_regs *regs;
|
||||||
int (*reset_cmd)(const void *ctx, const void *data);
|
int (*reset_cmd)(const void *ctx, const void *data);
|
||||||
int (*setup_rgmii_delay)(const void *ctx, int port);
|
int (*setup_rgmii_delay)(const void *ctx, int port);
|
||||||
|
/* Prototypes from include/net/dsa.h */
|
||||||
|
int (*fdb_add_cmd)(struct dsa_switch *ds, int port,
|
||||||
|
const unsigned char *addr, u16 vid);
|
||||||
|
int (*fdb_del_cmd)(struct dsa_switch *ds, int port,
|
||||||
|
const unsigned char *addr, u16 vid);
|
||||||
const char *name;
|
const char *name;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -142,7 +147,15 @@ int sja1105_dynamic_config_write(struct sja1105_private *priv,
|
|||||||
enum sja1105_blk_idx blk_idx,
|
enum sja1105_blk_idx blk_idx,
|
||||||
int index, void *entry, bool keep);
|
int index, void *entry, bool keep);
|
||||||
|
|
||||||
u8 sja1105_fdb_hash(struct sja1105_private *priv, const u8 *addr, u16 vid);
|
u8 sja1105et_fdb_hash(struct sja1105_private *priv, const u8 *addr, u16 vid);
|
||||||
|
int sja1105et_fdb_add(struct dsa_switch *ds, int port,
|
||||||
|
const unsigned char *addr, u16 vid);
|
||||||
|
int sja1105et_fdb_del(struct dsa_switch *ds, int port,
|
||||||
|
const unsigned char *addr, u16 vid);
|
||||||
|
int sja1105pqrs_fdb_add(struct dsa_switch *ds, int port,
|
||||||
|
const unsigned char *addr, u16 vid);
|
||||||
|
int sja1105pqrs_fdb_del(struct dsa_switch *ds, int port,
|
||||||
|
const unsigned char *addr, u16 vid);
|
||||||
|
|
||||||
/* Common implementations for the static and dynamic configs */
|
/* Common implementations for the static and dynamic configs */
|
||||||
size_t sja1105_l2_forwarding_entry_packing(void *buf, void *entry_ptr,
|
size_t sja1105_l2_forwarding_entry_packing(void *buf, void *entry_ptr,
|
||||||
|
@ -552,7 +552,7 @@ static u8 sja1105_crc8_add(u8 crc, u8 byte, u8 poly)
|
|||||||
* is also received as argument in the Koopman notation that the switch
|
* is also received as argument in the Koopman notation that the switch
|
||||||
* hardware stores it in.
|
* hardware stores it in.
|
||||||
*/
|
*/
|
||||||
u8 sja1105_fdb_hash(struct sja1105_private *priv, const u8 *addr, u16 vid)
|
u8 sja1105et_fdb_hash(struct sja1105_private *priv, const u8 *addr, u16 vid)
|
||||||
{
|
{
|
||||||
struct sja1105_l2_lookup_params_entry *l2_lookup_params =
|
struct sja1105_l2_lookup_params_entry *l2_lookup_params =
|
||||||
priv->static_config.tables[BLK_IDX_L2_LOOKUP_PARAMS].entries;
|
priv->static_config.tables[BLK_IDX_L2_LOOKUP_PARAMS].entries;
|
||||||
|
@ -786,10 +786,10 @@ static inline int sja1105et_fdb_index(int bin, int way)
|
|||||||
return bin * SJA1105ET_FDB_BIN_SIZE + way;
|
return bin * SJA1105ET_FDB_BIN_SIZE + way;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int sja1105_is_fdb_entry_in_bin(struct sja1105_private *priv, int bin,
|
static int sja1105et_is_fdb_entry_in_bin(struct sja1105_private *priv, int bin,
|
||||||
const u8 *addr, u16 vid,
|
const u8 *addr, u16 vid,
|
||||||
struct sja1105_l2_lookup_entry *match,
|
struct sja1105_l2_lookup_entry *match,
|
||||||
int *last_unused)
|
int *last_unused)
|
||||||
{
|
{
|
||||||
int way;
|
int way;
|
||||||
|
|
||||||
@ -818,8 +818,8 @@ static int sja1105_is_fdb_entry_in_bin(struct sja1105_private *priv, int bin,
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int sja1105_fdb_add(struct dsa_switch *ds, int port,
|
int sja1105et_fdb_add(struct dsa_switch *ds, int port,
|
||||||
const unsigned char *addr, u16 vid)
|
const unsigned char *addr, u16 vid)
|
||||||
{
|
{
|
||||||
struct sja1105_l2_lookup_entry l2_lookup = {0};
|
struct sja1105_l2_lookup_entry l2_lookup = {0};
|
||||||
struct sja1105_private *priv = ds->priv;
|
struct sja1105_private *priv = ds->priv;
|
||||||
@ -827,10 +827,10 @@ static int sja1105_fdb_add(struct dsa_switch *ds, int port,
|
|||||||
int last_unused = -1;
|
int last_unused = -1;
|
||||||
int bin, way;
|
int bin, way;
|
||||||
|
|
||||||
bin = sja1105_fdb_hash(priv, addr, vid);
|
bin = sja1105et_fdb_hash(priv, addr, vid);
|
||||||
|
|
||||||
way = sja1105_is_fdb_entry_in_bin(priv, bin, addr, vid,
|
way = sja1105et_is_fdb_entry_in_bin(priv, bin, addr, vid,
|
||||||
&l2_lookup, &last_unused);
|
&l2_lookup, &last_unused);
|
||||||
if (way >= 0) {
|
if (way >= 0) {
|
||||||
/* We have an FDB entry. Is our port in the destination
|
/* We have an FDB entry. Is our port in the destination
|
||||||
* mask? If yes, we need to do nothing. If not, we need
|
* mask? If yes, we need to do nothing. If not, we need
|
||||||
@ -874,17 +874,17 @@ static int sja1105_fdb_add(struct dsa_switch *ds, int port,
|
|||||||
true);
|
true);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int sja1105_fdb_del(struct dsa_switch *ds, int port,
|
int sja1105et_fdb_del(struct dsa_switch *ds, int port,
|
||||||
const unsigned char *addr, u16 vid)
|
const unsigned char *addr, u16 vid)
|
||||||
{
|
{
|
||||||
struct sja1105_l2_lookup_entry l2_lookup = {0};
|
struct sja1105_l2_lookup_entry l2_lookup = {0};
|
||||||
struct sja1105_private *priv = ds->priv;
|
struct sja1105_private *priv = ds->priv;
|
||||||
int index, bin, way;
|
int index, bin, way;
|
||||||
bool keep;
|
bool keep;
|
||||||
|
|
||||||
bin = sja1105_fdb_hash(priv, addr, vid);
|
bin = sja1105et_fdb_hash(priv, addr, vid);
|
||||||
way = sja1105_is_fdb_entry_in_bin(priv, bin, addr, vid,
|
way = sja1105et_is_fdb_entry_in_bin(priv, bin, addr, vid,
|
||||||
&l2_lookup, NULL);
|
&l2_lookup, NULL);
|
||||||
if (way < 0)
|
if (way < 0)
|
||||||
return 0;
|
return 0;
|
||||||
index = sja1105et_fdb_index(bin, way);
|
index = sja1105et_fdb_index(bin, way);
|
||||||
@ -905,6 +905,34 @@ static int sja1105_fdb_del(struct dsa_switch *ds, int port,
|
|||||||
index, &l2_lookup, keep);
|
index, &l2_lookup, keep);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int sja1105pqrs_fdb_add(struct dsa_switch *ds, int port,
|
||||||
|
const unsigned char *addr, u16 vid)
|
||||||
|
{
|
||||||
|
return -EOPNOTSUPP;
|
||||||
|
}
|
||||||
|
|
||||||
|
int sja1105pqrs_fdb_del(struct dsa_switch *ds, int port,
|
||||||
|
const unsigned char *addr, u16 vid)
|
||||||
|
{
|
||||||
|
return -EOPNOTSUPP;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int sja1105_fdb_add(struct dsa_switch *ds, int port,
|
||||||
|
const unsigned char *addr, u16 vid)
|
||||||
|
{
|
||||||
|
struct sja1105_private *priv = ds->priv;
|
||||||
|
|
||||||
|
return priv->info->fdb_add_cmd(ds, port, addr, vid);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int sja1105_fdb_del(struct dsa_switch *ds, int port,
|
||||||
|
const unsigned char *addr, u16 vid)
|
||||||
|
{
|
||||||
|
struct sja1105_private *priv = ds->priv;
|
||||||
|
|
||||||
|
return priv->info->fdb_del_cmd(ds, port, addr, vid);
|
||||||
|
}
|
||||||
|
|
||||||
static int sja1105_fdb_dump(struct dsa_switch *ds, int port,
|
static int sja1105_fdb_dump(struct dsa_switch *ds, int port,
|
||||||
dsa_fdb_dump_cb_t *cb, void *data)
|
dsa_fdb_dump_cb_t *cb, void *data)
|
||||||
{
|
{
|
||||||
|
@ -541,6 +541,8 @@ struct sja1105_info sja1105e_info = {
|
|||||||
.static_ops = sja1105e_table_ops,
|
.static_ops = sja1105e_table_ops,
|
||||||
.dyn_ops = sja1105et_dyn_ops,
|
.dyn_ops = sja1105et_dyn_ops,
|
||||||
.reset_cmd = sja1105et_reset_cmd,
|
.reset_cmd = sja1105et_reset_cmd,
|
||||||
|
.fdb_add_cmd = sja1105et_fdb_add,
|
||||||
|
.fdb_del_cmd = sja1105et_fdb_del,
|
||||||
.regs = &sja1105et_regs,
|
.regs = &sja1105et_regs,
|
||||||
.name = "SJA1105E",
|
.name = "SJA1105E",
|
||||||
};
|
};
|
||||||
@ -550,6 +552,8 @@ struct sja1105_info sja1105t_info = {
|
|||||||
.static_ops = sja1105t_table_ops,
|
.static_ops = sja1105t_table_ops,
|
||||||
.dyn_ops = sja1105et_dyn_ops,
|
.dyn_ops = sja1105et_dyn_ops,
|
||||||
.reset_cmd = sja1105et_reset_cmd,
|
.reset_cmd = sja1105et_reset_cmd,
|
||||||
|
.fdb_add_cmd = sja1105et_fdb_add,
|
||||||
|
.fdb_del_cmd = sja1105et_fdb_del,
|
||||||
.regs = &sja1105et_regs,
|
.regs = &sja1105et_regs,
|
||||||
.name = "SJA1105T",
|
.name = "SJA1105T",
|
||||||
};
|
};
|
||||||
@ -559,6 +563,8 @@ struct sja1105_info sja1105p_info = {
|
|||||||
.static_ops = sja1105p_table_ops,
|
.static_ops = sja1105p_table_ops,
|
||||||
.dyn_ops = sja1105pqrs_dyn_ops,
|
.dyn_ops = sja1105pqrs_dyn_ops,
|
||||||
.reset_cmd = sja1105pqrs_reset_cmd,
|
.reset_cmd = sja1105pqrs_reset_cmd,
|
||||||
|
.fdb_add_cmd = sja1105pqrs_fdb_add,
|
||||||
|
.fdb_del_cmd = sja1105pqrs_fdb_del,
|
||||||
.regs = &sja1105pqrs_regs,
|
.regs = &sja1105pqrs_regs,
|
||||||
.name = "SJA1105P",
|
.name = "SJA1105P",
|
||||||
};
|
};
|
||||||
@ -568,6 +574,8 @@ struct sja1105_info sja1105q_info = {
|
|||||||
.static_ops = sja1105q_table_ops,
|
.static_ops = sja1105q_table_ops,
|
||||||
.dyn_ops = sja1105pqrs_dyn_ops,
|
.dyn_ops = sja1105pqrs_dyn_ops,
|
||||||
.reset_cmd = sja1105pqrs_reset_cmd,
|
.reset_cmd = sja1105pqrs_reset_cmd,
|
||||||
|
.fdb_add_cmd = sja1105pqrs_fdb_add,
|
||||||
|
.fdb_del_cmd = sja1105pqrs_fdb_del,
|
||||||
.regs = &sja1105pqrs_regs,
|
.regs = &sja1105pqrs_regs,
|
||||||
.name = "SJA1105Q",
|
.name = "SJA1105Q",
|
||||||
};
|
};
|
||||||
@ -577,6 +585,8 @@ struct sja1105_info sja1105r_info = {
|
|||||||
.static_ops = sja1105r_table_ops,
|
.static_ops = sja1105r_table_ops,
|
||||||
.dyn_ops = sja1105pqrs_dyn_ops,
|
.dyn_ops = sja1105pqrs_dyn_ops,
|
||||||
.reset_cmd = sja1105pqrs_reset_cmd,
|
.reset_cmd = sja1105pqrs_reset_cmd,
|
||||||
|
.fdb_add_cmd = sja1105pqrs_fdb_add,
|
||||||
|
.fdb_del_cmd = sja1105pqrs_fdb_del,
|
||||||
.regs = &sja1105pqrs_regs,
|
.regs = &sja1105pqrs_regs,
|
||||||
.name = "SJA1105R",
|
.name = "SJA1105R",
|
||||||
};
|
};
|
||||||
@ -587,5 +597,7 @@ struct sja1105_info sja1105s_info = {
|
|||||||
.dyn_ops = sja1105pqrs_dyn_ops,
|
.dyn_ops = sja1105pqrs_dyn_ops,
|
||||||
.regs = &sja1105pqrs_regs,
|
.regs = &sja1105pqrs_regs,
|
||||||
.reset_cmd = sja1105pqrs_reset_cmd,
|
.reset_cmd = sja1105pqrs_reset_cmd,
|
||||||
|
.fdb_add_cmd = sja1105pqrs_fdb_add,
|
||||||
|
.fdb_del_cmd = sja1105pqrs_fdb_del,
|
||||||
.name = "SJA1105S",
|
.name = "SJA1105S",
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user