dpaa2-switch: fix the translation between the bridge and dpsw STP states
authorIoana Ciornei <ioana.ciornei@nxp.com>
Tue, 30 Mar 2021 14:54:15 +0000 (17:54 +0300)
committerDavid S. Miller <davem@davemloft.net>
Wed, 31 Mar 2021 00:18:26 +0000 (17:18 -0700)
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>
drivers/net/ethernet/freescale/dpaa2/dpaa2-switch.c

index a9b30a7..073316d 100644 (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;