net: dsa: add a "tx_fwd_offload" argument to ->port_bridge_join
This is a preparation patch for the removal of the DSA switch methods ->port_bridge_tx_fwd_offload() and ->port_bridge_tx_fwd_unoffload(). The plan is for the switch to report whether it offloads TX forwarding directly as a response to the ->port_bridge_join() method. This change deals with the noisy portion of converting all existing function prototypes to take this new boolean pointer argument. The bool is placed in the cross-chip notifier structure for bridge join, and a reference to it is provided to drivers. In the next change, DSA will then actually look at this value instead of calling ->port_bridge_tx_fwd_offload(). Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com> Reviewed-by: Alvin Šipraga <alsi@bang-olufsen.dk> Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
Родитель
d3eed0e57d
Коммит
b079922ba2
|
@ -1860,7 +1860,8 @@ int b53_mdb_del(struct dsa_switch *ds, int port,
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(b53_mdb_del);
|
EXPORT_SYMBOL(b53_mdb_del);
|
||||||
|
|
||||||
int b53_br_join(struct dsa_switch *ds, int port, struct dsa_bridge bridge)
|
int b53_br_join(struct dsa_switch *ds, int port, struct dsa_bridge bridge,
|
||||||
|
bool *tx_fwd_offload)
|
||||||
{
|
{
|
||||||
struct b53_device *dev = ds->priv;
|
struct b53_device *dev = ds->priv;
|
||||||
s8 cpu_port = dsa_to_port(ds, port)->cpu_dp->index;
|
s8 cpu_port = dsa_to_port(ds, port)->cpu_dp->index;
|
||||||
|
|
|
@ -324,7 +324,8 @@ void b53_get_strings(struct dsa_switch *ds, int port, u32 stringset,
|
||||||
void b53_get_ethtool_stats(struct dsa_switch *ds, int port, uint64_t *data);
|
void b53_get_ethtool_stats(struct dsa_switch *ds, int port, uint64_t *data);
|
||||||
int b53_get_sset_count(struct dsa_switch *ds, int port, int sset);
|
int b53_get_sset_count(struct dsa_switch *ds, int port, int sset);
|
||||||
void b53_get_ethtool_phy_stats(struct dsa_switch *ds, int port, uint64_t *data);
|
void b53_get_ethtool_phy_stats(struct dsa_switch *ds, int port, uint64_t *data);
|
||||||
int b53_br_join(struct dsa_switch *ds, int port, struct dsa_bridge bridge);
|
int b53_br_join(struct dsa_switch *ds, int port, struct dsa_bridge bridge,
|
||||||
|
bool *tx_fwd_offload);
|
||||||
void b53_br_leave(struct dsa_switch *ds, int port, struct dsa_bridge bridge);
|
void b53_br_leave(struct dsa_switch *ds, int port, struct dsa_bridge bridge);
|
||||||
void b53_br_set_stp_state(struct dsa_switch *ds, int port, u8 state);
|
void b53_br_set_stp_state(struct dsa_switch *ds, int port, u8 state);
|
||||||
void b53_br_fast_age(struct dsa_switch *ds, int port);
|
void b53_br_fast_age(struct dsa_switch *ds, int port);
|
||||||
|
|
|
@ -167,7 +167,8 @@ static int dsa_loop_phy_write(struct dsa_switch *ds, int port,
|
||||||
}
|
}
|
||||||
|
|
||||||
static int dsa_loop_port_bridge_join(struct dsa_switch *ds, int port,
|
static int dsa_loop_port_bridge_join(struct dsa_switch *ds, int port,
|
||||||
struct dsa_bridge bridge)
|
struct dsa_bridge bridge,
|
||||||
|
bool *tx_fwd_offload)
|
||||||
{
|
{
|
||||||
dev_dbg(ds->dev, "%s: port: %d, bridge: %s\n",
|
dev_dbg(ds->dev, "%s: port: %d, bridge: %s\n",
|
||||||
__func__, port, bridge.dev->name);
|
__func__, port, bridge.dev->name);
|
||||||
|
|
|
@ -674,7 +674,8 @@ static int hellcreek_bridge_flags(struct dsa_switch *ds, int port,
|
||||||
}
|
}
|
||||||
|
|
||||||
static int hellcreek_port_bridge_join(struct dsa_switch *ds, int port,
|
static int hellcreek_port_bridge_join(struct dsa_switch *ds, int port,
|
||||||
struct dsa_bridge bridge)
|
struct dsa_bridge bridge,
|
||||||
|
bool *tx_fwd_offload)
|
||||||
{
|
{
|
||||||
struct hellcreek *hellcreek = ds->priv;
|
struct hellcreek *hellcreek = ds->priv;
|
||||||
|
|
||||||
|
|
|
@ -1103,7 +1103,8 @@ static void lan9303_port_disable(struct dsa_switch *ds, int port)
|
||||||
}
|
}
|
||||||
|
|
||||||
static int lan9303_port_bridge_join(struct dsa_switch *ds, int port,
|
static int lan9303_port_bridge_join(struct dsa_switch *ds, int port,
|
||||||
struct dsa_bridge bridge)
|
struct dsa_bridge bridge,
|
||||||
|
bool *tx_fwd_offload)
|
||||||
{
|
{
|
||||||
struct lan9303 *chip = ds->priv;
|
struct lan9303 *chip = ds->priv;
|
||||||
|
|
||||||
|
|
|
@ -1146,7 +1146,8 @@ static int gswip_vlan_remove(struct gswip_priv *priv,
|
||||||
}
|
}
|
||||||
|
|
||||||
static int gswip_port_bridge_join(struct dsa_switch *ds, int port,
|
static int gswip_port_bridge_join(struct dsa_switch *ds, int port,
|
||||||
struct dsa_bridge bridge)
|
struct dsa_bridge bridge,
|
||||||
|
bool *tx_fwd_offload)
|
||||||
{
|
{
|
||||||
struct net_device *br = bridge.dev;
|
struct net_device *br = bridge.dev;
|
||||||
struct gswip_priv *priv = ds->priv;
|
struct gswip_priv *priv = ds->priv;
|
||||||
|
|
|
@ -192,7 +192,8 @@ void ksz_get_ethtool_stats(struct dsa_switch *ds, int port, uint64_t *buf)
|
||||||
EXPORT_SYMBOL_GPL(ksz_get_ethtool_stats);
|
EXPORT_SYMBOL_GPL(ksz_get_ethtool_stats);
|
||||||
|
|
||||||
int ksz_port_bridge_join(struct dsa_switch *ds, int port,
|
int ksz_port_bridge_join(struct dsa_switch *ds, int port,
|
||||||
struct dsa_bridge bridge)
|
struct dsa_bridge bridge,
|
||||||
|
bool *tx_fwd_offload)
|
||||||
{
|
{
|
||||||
/* port_stp_state_set() will be called after to put the port in
|
/* port_stp_state_set() will be called after to put the port in
|
||||||
* appropriate state so there is no need to do anything.
|
* appropriate state so there is no need to do anything.
|
||||||
|
|
|
@ -155,7 +155,7 @@ void ksz_mac_link_down(struct dsa_switch *ds, int port, unsigned int mode,
|
||||||
int ksz_sset_count(struct dsa_switch *ds, int port, int sset);
|
int ksz_sset_count(struct dsa_switch *ds, int port, int sset);
|
||||||
void ksz_get_ethtool_stats(struct dsa_switch *ds, int port, uint64_t *buf);
|
void ksz_get_ethtool_stats(struct dsa_switch *ds, int port, uint64_t *buf);
|
||||||
int ksz_port_bridge_join(struct dsa_switch *ds, int port,
|
int ksz_port_bridge_join(struct dsa_switch *ds, int port,
|
||||||
struct dsa_bridge bridge);
|
struct dsa_bridge bridge, bool *tx_fwd_offload);
|
||||||
void ksz_port_bridge_leave(struct dsa_switch *ds, int port,
|
void ksz_port_bridge_leave(struct dsa_switch *ds, int port,
|
||||||
struct dsa_bridge bridge);
|
struct dsa_bridge bridge);
|
||||||
void ksz_port_fast_age(struct dsa_switch *ds, int port);
|
void ksz_port_fast_age(struct dsa_switch *ds, int port);
|
||||||
|
|
|
@ -1186,7 +1186,7 @@ mt7530_port_bridge_flags(struct dsa_switch *ds, int port,
|
||||||
|
|
||||||
static int
|
static int
|
||||||
mt7530_port_bridge_join(struct dsa_switch *ds, int port,
|
mt7530_port_bridge_join(struct dsa_switch *ds, int port,
|
||||||
struct dsa_bridge bridge)
|
struct dsa_bridge bridge, bool *tx_fwd_offload)
|
||||||
{
|
{
|
||||||
struct dsa_port *dp = dsa_to_port(ds, port), *other_dp;
|
struct dsa_port *dp = dsa_to_port(ds, port), *other_dp;
|
||||||
u32 port_bitmap = BIT(MT7530_CPU_PORT);
|
u32 port_bitmap = BIT(MT7530_CPU_PORT);
|
||||||
|
|
|
@ -2442,7 +2442,8 @@ static int mv88e6xxx_bridge_map(struct mv88e6xxx_chip *chip,
|
||||||
}
|
}
|
||||||
|
|
||||||
static int mv88e6xxx_port_bridge_join(struct dsa_switch *ds, int port,
|
static int mv88e6xxx_port_bridge_join(struct dsa_switch *ds, int port,
|
||||||
struct dsa_bridge bridge)
|
struct dsa_bridge bridge,
|
||||||
|
bool *tx_fwd_offload)
|
||||||
{
|
{
|
||||||
struct mv88e6xxx_chip *chip = ds->priv;
|
struct mv88e6xxx_chip *chip = ds->priv;
|
||||||
int err;
|
int err;
|
||||||
|
|
|
@ -706,7 +706,7 @@ static int felix_bridge_flags(struct dsa_switch *ds, int port,
|
||||||
}
|
}
|
||||||
|
|
||||||
static int felix_bridge_join(struct dsa_switch *ds, int port,
|
static int felix_bridge_join(struct dsa_switch *ds, int port,
|
||||||
struct dsa_bridge bridge)
|
struct dsa_bridge bridge, bool *tx_fwd_offload)
|
||||||
{
|
{
|
||||||
struct ocelot *ocelot = ds->priv;
|
struct ocelot *ocelot = ds->priv;
|
||||||
|
|
||||||
|
|
|
@ -1811,7 +1811,8 @@ qca8k_port_stp_state_set(struct dsa_switch *ds, int port, u8 state)
|
||||||
}
|
}
|
||||||
|
|
||||||
static int qca8k_port_bridge_join(struct dsa_switch *ds, int port,
|
static int qca8k_port_bridge_join(struct dsa_switch *ds, int port,
|
||||||
struct dsa_bridge bridge)
|
struct dsa_bridge bridge,
|
||||||
|
bool *tx_fwd_offload)
|
||||||
{
|
{
|
||||||
struct qca8k_priv *priv = (struct qca8k_priv *)ds->priv;
|
struct qca8k_priv *priv = (struct qca8k_priv *)ds->priv;
|
||||||
int port_mask, cpu_port;
|
int port_mask, cpu_port;
|
||||||
|
|
|
@ -1186,7 +1186,8 @@ rtl8366rb_port_disable(struct dsa_switch *ds, int port)
|
||||||
|
|
||||||
static int
|
static int
|
||||||
rtl8366rb_port_bridge_join(struct dsa_switch *ds, int port,
|
rtl8366rb_port_bridge_join(struct dsa_switch *ds, int port,
|
||||||
struct dsa_bridge bridge)
|
struct dsa_bridge bridge,
|
||||||
|
bool *tx_fwd_offload)
|
||||||
{
|
{
|
||||||
struct realtek_smi *smi = ds->priv;
|
struct realtek_smi *smi = ds->priv;
|
||||||
unsigned int port_bitmap = 0;
|
unsigned int port_bitmap = 0;
|
||||||
|
|
|
@ -2074,7 +2074,8 @@ static void sja1105_bridge_stp_state_set(struct dsa_switch *ds, int port,
|
||||||
}
|
}
|
||||||
|
|
||||||
static int sja1105_bridge_join(struct dsa_switch *ds, int port,
|
static int sja1105_bridge_join(struct dsa_switch *ds, int port,
|
||||||
struct dsa_bridge bridge)
|
struct dsa_bridge bridge,
|
||||||
|
bool *tx_fwd_offload)
|
||||||
{
|
{
|
||||||
return sja1105_bridge_member(ds, port, bridge, true);
|
return sja1105_bridge_member(ds, port, bridge, true);
|
||||||
}
|
}
|
||||||
|
|
|
@ -540,7 +540,7 @@ static int xrs700x_bridge_common(struct dsa_switch *ds, int port,
|
||||||
}
|
}
|
||||||
|
|
||||||
static int xrs700x_bridge_join(struct dsa_switch *ds, int port,
|
static int xrs700x_bridge_join(struct dsa_switch *ds, int port,
|
||||||
struct dsa_bridge bridge)
|
struct dsa_bridge bridge, bool *tx_fwd_offload)
|
||||||
{
|
{
|
||||||
return xrs700x_bridge_common(ds, port, bridge, true);
|
return xrs700x_bridge_common(ds, port, bridge, true);
|
||||||
}
|
}
|
||||||
|
|
|
@ -822,7 +822,8 @@ struct dsa_switch_ops {
|
||||||
*/
|
*/
|
||||||
int (*set_ageing_time)(struct dsa_switch *ds, unsigned int msecs);
|
int (*set_ageing_time)(struct dsa_switch *ds, unsigned int msecs);
|
||||||
int (*port_bridge_join)(struct dsa_switch *ds, int port,
|
int (*port_bridge_join)(struct dsa_switch *ds, int port,
|
||||||
struct dsa_bridge bridge);
|
struct dsa_bridge bridge,
|
||||||
|
bool *tx_fwd_offload);
|
||||||
void (*port_bridge_leave)(struct dsa_switch *ds, int port,
|
void (*port_bridge_leave)(struct dsa_switch *ds, int port,
|
||||||
struct dsa_bridge bridge);
|
struct dsa_bridge bridge);
|
||||||
/* Called right after .port_bridge_join() */
|
/* Called right after .port_bridge_join() */
|
||||||
|
|
|
@ -56,6 +56,7 @@ struct dsa_notifier_bridge_info {
|
||||||
int tree_index;
|
int tree_index;
|
||||||
int sw_index;
|
int sw_index;
|
||||||
int port;
|
int port;
|
||||||
|
bool tx_fwd_offload;
|
||||||
};
|
};
|
||||||
|
|
||||||
/* DSA_NOTIFIER_FDB_* */
|
/* DSA_NOTIFIER_FDB_* */
|
||||||
|
|
|
@ -95,7 +95,8 @@ static int dsa_switch_bridge_join(struct dsa_switch *ds,
|
||||||
if (!ds->ops->port_bridge_join)
|
if (!ds->ops->port_bridge_join)
|
||||||
return -EOPNOTSUPP;
|
return -EOPNOTSUPP;
|
||||||
|
|
||||||
err = ds->ops->port_bridge_join(ds, info->port, info->bridge);
|
err = ds->ops->port_bridge_join(ds, info->port, info->bridge,
|
||||||
|
&info->tx_fwd_offload);
|
||||||
if (err)
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
Загрузка…
Ссылка в новой задаче