Skip to content

Commit de6dd62

Browse files
rarun-mchpPaolo Abeni
authored andcommitted
net: dsa: ksz: added the generic port_stp_state_set function
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 <[email protected]> Reviewed-by: Florian Fainelli <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Paolo Abeni <[email protected]>
1 parent fb0a43f commit de6dd62

File tree

6 files changed

+49
-73
lines changed

6 files changed

+49
-73
lines changed

drivers/net/dsa/microchip/ksz8795.c

Lines changed: 1 addition & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1027,40 +1027,7 @@ static void ksz8_cfg_port_member(struct ksz_device *dev, int port, u8 member)
10271027

10281028
static void ksz8_port_stp_state_set(struct dsa_switch *ds, int port, u8 state)
10291029
{
1030-
struct ksz_device *dev = ds->priv;
1031-
struct ksz_port *p;
1032-
u8 data;
1033-
1034-
ksz_pread8(dev, port, P_STP_CTRL, &data);
1035-
data &= ~(PORT_TX_ENABLE | PORT_RX_ENABLE | PORT_LEARN_DISABLE);
1036-
1037-
switch (state) {
1038-
case BR_STATE_DISABLED:
1039-
data |= PORT_LEARN_DISABLE;
1040-
break;
1041-
case BR_STATE_LISTENING:
1042-
data |= (PORT_RX_ENABLE | PORT_LEARN_DISABLE);
1043-
break;
1044-
case BR_STATE_LEARNING:
1045-
data |= PORT_RX_ENABLE;
1046-
break;
1047-
case BR_STATE_FORWARDING:
1048-
data |= (PORT_TX_ENABLE | PORT_RX_ENABLE);
1049-
break;
1050-
case BR_STATE_BLOCKING:
1051-
data |= PORT_LEARN_DISABLE;
1052-
break;
1053-
default:
1054-
dev_err(ds->dev, "invalid STP state: %d\n", state);
1055-
return;
1056-
}
1057-
1058-
ksz_pwrite8(dev, port, P_STP_CTRL, data);
1059-
1060-
p = &dev->ports[port];
1061-
p->stp_state = state;
1062-
1063-
ksz_update_port_member(dev, port);
1030+
ksz_port_stp_state_set(ds, port, state, P_STP_CTRL);
10641031
}
10651032

10661033
static void ksz8_flush_dyn_mac_table(struct ksz_device *dev, int port)

drivers/net/dsa/microchip/ksz8795_reg.h

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -160,9 +160,6 @@
160160
#define PORT_DISCARD_NON_VID BIT(5)
161161
#define PORT_FORCE_FLOW_CTRL BIT(4)
162162
#define PORT_BACK_PRESSURE BIT(3)
163-
#define PORT_TX_ENABLE BIT(2)
164-
#define PORT_RX_ENABLE BIT(1)
165-
#define PORT_LEARN_DISABLE BIT(0)
166163

167164
#define REG_PORT_1_CTRL_3 0x13
168165
#define REG_PORT_2_CTRL_3 0x23

drivers/net/dsa/microchip/ksz9477.c

Lines changed: 1 addition & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -517,38 +517,7 @@ static void ksz9477_cfg_port_member(struct ksz_device *dev, int port,
517517
static void ksz9477_port_stp_state_set(struct dsa_switch *ds, int port,
518518
u8 state)
519519
{
520-
struct ksz_device *dev = ds->priv;
521-
struct ksz_port *p = &dev->ports[port];
522-
u8 data;
523-
524-
ksz_pread8(dev, port, P_STP_CTRL, &data);
525-
data &= ~(PORT_TX_ENABLE | PORT_RX_ENABLE | PORT_LEARN_DISABLE);
526-
527-
switch (state) {
528-
case BR_STATE_DISABLED:
529-
data |= PORT_LEARN_DISABLE;
530-
break;
531-
case BR_STATE_LISTENING:
532-
data |= (PORT_RX_ENABLE | PORT_LEARN_DISABLE);
533-
break;
534-
case BR_STATE_LEARNING:
535-
data |= PORT_RX_ENABLE;
536-
break;
537-
case BR_STATE_FORWARDING:
538-
data |= (PORT_TX_ENABLE | PORT_RX_ENABLE);
539-
break;
540-
case BR_STATE_BLOCKING:
541-
data |= PORT_LEARN_DISABLE;
542-
break;
543-
default:
544-
dev_err(ds->dev, "invalid STP state: %d\n", state);
545-
return;
546-
}
547-
548-
ksz_pwrite8(dev, port, P_STP_CTRL, data);
549-
p->stp_state = state;
550-
551-
ksz_update_port_member(dev, port);
520+
ksz_port_stp_state_set(ds, port, state, P_STP_CTRL);
552521
}
553522

554523
static void ksz9477_flush_dyn_mac_table(struct ksz_device *dev, int port)

drivers/net/dsa/microchip/ksz9477_reg.h

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1586,10 +1586,6 @@
15861586

15871587
#define REG_PORT_LUE_MSTP_STATE 0x0B04
15881588

1589-
#define PORT_TX_ENABLE BIT(2)
1590-
#define PORT_RX_ENABLE BIT(1)
1591-
#define PORT_LEARN_DISABLE BIT(0)
1592-
15931589
/* C - PTP */
15941590

15951591
#define REG_PTP_PORT_RX_DELAY__2 0x0C00

drivers/net/dsa/microchip/ksz_common.c

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -372,6 +372,46 @@ int ksz_enable_port(struct dsa_switch *ds, int port, struct phy_device *phy)
372372
}
373373
EXPORT_SYMBOL_GPL(ksz_enable_port);
374374

375+
void ksz_port_stp_state_set(struct dsa_switch *ds, int port,
376+
u8 state, int reg)
377+
{
378+
struct ksz_device *dev = ds->priv;
379+
struct ksz_port *p;
380+
u8 data;
381+
382+
ksz_pread8(dev, port, reg, &data);
383+
data &= ~(PORT_TX_ENABLE | PORT_RX_ENABLE | PORT_LEARN_DISABLE);
384+
385+
switch (state) {
386+
case BR_STATE_DISABLED:
387+
data |= PORT_LEARN_DISABLE;
388+
break;
389+
case BR_STATE_LISTENING:
390+
data |= (PORT_RX_ENABLE | PORT_LEARN_DISABLE);
391+
break;
392+
case BR_STATE_LEARNING:
393+
data |= PORT_RX_ENABLE;
394+
break;
395+
case BR_STATE_FORWARDING:
396+
data |= (PORT_TX_ENABLE | PORT_RX_ENABLE);
397+
break;
398+
case BR_STATE_BLOCKING:
399+
data |= PORT_LEARN_DISABLE;
400+
break;
401+
default:
402+
dev_err(ds->dev, "invalid STP state: %d\n", state);
403+
return;
404+
}
405+
406+
ksz_pwrite8(dev, port, reg, data);
407+
408+
p = &dev->ports[port];
409+
p->stp_state = state;
410+
411+
ksz_update_port_member(dev, port);
412+
}
413+
EXPORT_SYMBOL_GPL(ksz_port_stp_state_set);
414+
375415
struct ksz_device *ksz_switch_alloc(struct device *base, void *priv)
376416
{
377417
struct dsa_switch *ds;

drivers/net/dsa/microchip/ksz_common.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,8 @@ int ksz_port_bridge_join(struct dsa_switch *ds, int port,
165165
struct netlink_ext_ack *extack);
166166
void ksz_port_bridge_leave(struct dsa_switch *ds, int port,
167167
struct dsa_bridge bridge);
168+
void ksz_port_stp_state_set(struct dsa_switch *ds, int port,
169+
u8 state, int reg);
168170
void ksz_port_fast_age(struct dsa_switch *ds, int port);
169171
int ksz_port_fdb_dump(struct dsa_switch *ds, int port, dsa_fdb_dump_cb_t *cb,
170172
void *data);
@@ -292,6 +294,11 @@ static inline void ksz_regmap_unlock(void *__mtx)
292294
mutex_unlock(mtx);
293295
}
294296

297+
/* STP State Defines */
298+
#define PORT_TX_ENABLE BIT(2)
299+
#define PORT_RX_ENABLE BIT(1)
300+
#define PORT_LEARN_DISABLE BIT(0)
301+
295302
/* Regmap tables generation */
296303
#define KSZ_SPI_OP_RD 3
297304
#define KSZ_SPI_OP_WR 2

0 commit comments

Comments
 (0)