dpaa2-switch: fix the translation between the bridge and dpsw STP states

The numerical values used for STP states are different between the
bridge and the MC ABI therefore, the direct usage of the
BR_STATE_* macros directly in the structures passed to the firmware is
incorrect.

Create a separate function that translates between the bridge STP states
and the enum that holds the STP state as seen by the Management Complex.

Signed-off-by: Ioana Ciornei <ioana.ciornei@nxp.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Ioana Ciornei 2021-03-30 17:54:15 +03:00 committed by David S. Miller
parent e48792a9ec
commit 6aa6791d1a
1 changed files with 20 additions and 3 deletions

View File

@ -318,17 +318,34 @@ static int dpaa2_switch_port_add_vlan(struct ethsw_port_priv *port_priv,
return 0;
}
static enum dpsw_stp_state br_stp_state_to_dpsw(u8 state)
{
switch (state) {
case BR_STATE_DISABLED:
return DPSW_STP_STATE_DISABLED;
case BR_STATE_LISTENING:
return DPSW_STP_STATE_LISTENING;
case BR_STATE_LEARNING:
return DPSW_STP_STATE_LEARNING;
case BR_STATE_FORWARDING:
return DPSW_STP_STATE_FORWARDING;
case BR_STATE_BLOCKING:
return DPSW_STP_STATE_BLOCKING;
default:
return DPSW_STP_STATE_DISABLED;
}
}
static int dpaa2_switch_port_set_stp_state(struct ethsw_port_priv *port_priv, u8 state)
{
struct dpsw_stp_cfg stp_cfg = {
.state = state,
};
struct dpsw_stp_cfg stp_cfg = {0};
int err;
u16 vid;
if (!netif_running(port_priv->netdev) || state == port_priv->stp_state)
return 0; /* Nothing to do */
stp_cfg.state = br_stp_state_to_dpsw(state);
for (vid = 0; vid <= VLAN_VID_MASK; vid++) {
if (port_priv->vlans[vid] & ETHSW_VLAN_MEMBER) {
stp_cfg.vlan_id = vid;