net: dsa: ksz: added the generic port_stp_state_set function
authorArun Ramadoss <arun.ramadoss@microchip.com>
Sun, 24 Apr 2022 11:28:31 +0000 (16:58 +0530)
committerPaolo Abeni <pabeni@redhat.com>
Tue, 26 Apr 2022 08:19:34 +0000 (10:19 +0200)
The ksz8795 and ksz9477 uses the same algorithm for the
port_stp_state_set function except the register address is different. So
moved the algorithm to the ksz_common.c and used the dev_ops for
register read and write. This function can also used for the lan937x
part. Hence making it generic for all the parts.

Signed-off-by: Arun Ramadoss <arun.ramadoss@microchip.com>
Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
Link: https://lore.kernel.org/r/20220424112831.11504-1-arun.ramadoss@microchip.com
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
drivers/net/dsa/microchip/ksz8795.c
drivers/net/dsa/microchip/ksz8795_reg.h
drivers/net/dsa/microchip/ksz9477.c
drivers/net/dsa/microchip/ksz9477_reg.h
drivers/net/dsa/microchip/ksz_common.c
drivers/net/dsa/microchip/ksz_common.h

index b2752978cb0919ec998f75ff329c55bb7e6e0f41..f91deea9368e113a820ed9fcc7b17fffdda7dd6a 100644 (file)
@@ -1027,40 +1027,7 @@ static void ksz8_cfg_port_member(struct ksz_device *dev, int port, u8 member)
 
 static void ksz8_port_stp_state_set(struct dsa_switch *ds, int port, u8 state)
 {
-       struct ksz_device *dev = ds->priv;
-       struct ksz_port *p;
-       u8 data;
-
-       ksz_pread8(dev, port, P_STP_CTRL, &data);
-       data &= ~(PORT_TX_ENABLE | PORT_RX_ENABLE | PORT_LEARN_DISABLE);
-
-       switch (state) {
-       case BR_STATE_DISABLED:
-               data |= PORT_LEARN_DISABLE;
-               break;
-       case BR_STATE_LISTENING:
-               data |= (PORT_RX_ENABLE | PORT_LEARN_DISABLE);
-               break;
-       case BR_STATE_LEARNING:
-               data |= PORT_RX_ENABLE;
-               break;
-       case BR_STATE_FORWARDING:
-               data |= (PORT_TX_ENABLE | PORT_RX_ENABLE);
-               break;
-       case BR_STATE_BLOCKING:
-               data |= PORT_LEARN_DISABLE;
-               break;
-       default:
-               dev_err(ds->dev, "invalid STP state: %d\n", state);
-               return;
-       }
-
-       ksz_pwrite8(dev, port, P_STP_CTRL, data);
-
-       p = &dev->ports[port];
-       p->stp_state = state;
-
-       ksz_update_port_member(dev, port);
+       ksz_port_stp_state_set(ds, port, state, P_STP_CTRL);
 }
 
 static void ksz8_flush_dyn_mac_table(struct ksz_device *dev, int port)
index d74defcd86b44f32eaa0b91e36241afd6f95418e..4109433b6b6c2e7af0888821132cdd9fd4f39051 100644 (file)
 #define PORT_DISCARD_NON_VID           BIT(5)
 #define PORT_FORCE_FLOW_CTRL           BIT(4)
 #define PORT_BACK_PRESSURE             BIT(3)
-#define PORT_TX_ENABLE                 BIT(2)
-#define PORT_RX_ENABLE                 BIT(1)
-#define PORT_LEARN_DISABLE             BIT(0)
 
 #define REG_PORT_1_CTRL_3              0x13
 #define REG_PORT_2_CTRL_3              0x23
index 8222c8a6c5ec56969a7edd951a46215d0e0220f8..4f617fee9a4ef9c36b16d01b3ecc04c10224779a 100644 (file)
@@ -517,38 +517,7 @@ static void ksz9477_cfg_port_member(struct ksz_device *dev, int port,
 static void ksz9477_port_stp_state_set(struct dsa_switch *ds, int port,
                                       u8 state)
 {
-       struct ksz_device *dev = ds->priv;
-       struct ksz_port *p = &dev->ports[port];
-       u8 data;
-
-       ksz_pread8(dev, port, P_STP_CTRL, &data);
-       data &= ~(PORT_TX_ENABLE | PORT_RX_ENABLE | PORT_LEARN_DISABLE);
-
-       switch (state) {
-       case BR_STATE_DISABLED:
-               data |= PORT_LEARN_DISABLE;
-               break;
-       case BR_STATE_LISTENING:
-               data |= (PORT_RX_ENABLE | PORT_LEARN_DISABLE);
-               break;
-       case BR_STATE_LEARNING:
-               data |= PORT_RX_ENABLE;
-               break;
-       case BR_STATE_FORWARDING:
-               data |= (PORT_TX_ENABLE | PORT_RX_ENABLE);
-               break;
-       case BR_STATE_BLOCKING:
-               data |= PORT_LEARN_DISABLE;
-               break;
-       default:
-               dev_err(ds->dev, "invalid STP state: %d\n", state);
-               return;
-       }
-
-       ksz_pwrite8(dev, port, P_STP_CTRL, data);
-       p->stp_state = state;
-
-       ksz_update_port_member(dev, port);
+       ksz_port_stp_state_set(ds, port, state, P_STP_CTRL);
 }
 
 static void ksz9477_flush_dyn_mac_table(struct ksz_device *dev, int port)
index 0bd58467181f222074436b3e535384a3c59a7357..7a2c8d4767aff80b03f7d6a511033cddcde28e6a 100644 (file)
 
 #define REG_PORT_LUE_MSTP_STATE                0x0B04
 
-#define PORT_TX_ENABLE                 BIT(2)
-#define PORT_RX_ENABLE                 BIT(1)
-#define PORT_LEARN_DISABLE             BIT(0)
-
 /* C - PTP */
 
 #define REG_PTP_PORT_RX_DELAY__2       0x0C00
index 8014b18d93914f4564aef1324a2bad7e42470cde..9b9f570ebb0b68b4df81b2d59f5d5ae414a013b6 100644 (file)
@@ -372,6 +372,46 @@ int ksz_enable_port(struct dsa_switch *ds, int port, struct phy_device *phy)
 }
 EXPORT_SYMBOL_GPL(ksz_enable_port);
 
+void ksz_port_stp_state_set(struct dsa_switch *ds, int port,
+                           u8 state, int reg)
+{
+       struct ksz_device *dev = ds->priv;
+       struct ksz_port *p;
+       u8 data;
+
+       ksz_pread8(dev, port, reg, &data);
+       data &= ~(PORT_TX_ENABLE | PORT_RX_ENABLE | PORT_LEARN_DISABLE);
+
+       switch (state) {
+       case BR_STATE_DISABLED:
+               data |= PORT_LEARN_DISABLE;
+               break;
+       case BR_STATE_LISTENING:
+               data |= (PORT_RX_ENABLE | PORT_LEARN_DISABLE);
+               break;
+       case BR_STATE_LEARNING:
+               data |= PORT_RX_ENABLE;
+               break;
+       case BR_STATE_FORWARDING:
+               data |= (PORT_TX_ENABLE | PORT_RX_ENABLE);
+               break;
+       case BR_STATE_BLOCKING:
+               data |= PORT_LEARN_DISABLE;
+               break;
+       default:
+               dev_err(ds->dev, "invalid STP state: %d\n", state);
+               return;
+       }
+
+       ksz_pwrite8(dev, port, reg, data);
+
+       p = &dev->ports[port];
+       p->stp_state = state;
+
+       ksz_update_port_member(dev, port);
+}
+EXPORT_SYMBOL_GPL(ksz_port_stp_state_set);
+
 struct ksz_device *ksz_switch_alloc(struct device *base, void *priv)
 {
        struct dsa_switch *ds;
index 485d4a948c386f40a6d5cf10d7c3e527c37b641f..4d978832c44801e6d442c2f05208198623dcde44 100644 (file)
@@ -165,6 +165,8 @@ int ksz_port_bridge_join(struct dsa_switch *ds, int port,
                         struct netlink_ext_ack *extack);
 void ksz_port_bridge_leave(struct dsa_switch *ds, int port,
                           struct dsa_bridge bridge);
+void ksz_port_stp_state_set(struct dsa_switch *ds, int port,
+                           u8 state, int reg);
 void ksz_port_fast_age(struct dsa_switch *ds, int port);
 int ksz_port_fdb_dump(struct dsa_switch *ds, int port, dsa_fdb_dump_cb_t *cb,
                      void *data);
@@ -292,6 +294,11 @@ static inline void ksz_regmap_unlock(void *__mtx)
        mutex_unlock(mtx);
 }
 
+/* STP State Defines */
+#define PORT_TX_ENABLE                 BIT(2)
+#define PORT_RX_ENABLE                 BIT(1)
+#define PORT_LEARN_DISABLE             BIT(0)
+
 /* Regmap tables generation */
 #define KSZ_SPI_OP_RD          3
 #define KSZ_SPI_OP_WR          2