Skip to content

Commit 75fe6b2

Browse files
0xharshalhauke
authored andcommitted
realtek: rtl930x: Add support for trapping management frames
Driver needs to configure management frame actions To support LLDP, EAPOL or MSTP, which needs to be trapped to the CPU instead of being forwarded Signed-off-by: Harshal Gohel <hg@simonwunderlich.de> Signed-off-by: Sharadanand Karanjkar <sk@simonwunderlich.de> Link: openwrt#19571 Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
1 parent 1b43658 commit 75fe6b2

3 files changed

Lines changed: 84 additions & 0 deletions

File tree

target/linux/realtek/files-6.12/drivers/net/dsa/rtl83xx/rtl838x.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -471,6 +471,7 @@ typedef enum {
471471
#define RTL931X_RMA_LLDP_CTRL (0x8918)
472472

473473
#define RTL930X_RMA_EAPOL_CTRL (0x9F08)
474+
#define RTL930X_SPCL_TRAP_PORT_CTRL (0xA1A0)
474475
#define RTL931X_RMA_EAPOL_CTRL (0x8930)
475476
#define RTL931X_TRAP_ARP_GRAT_PORT_ACT (0x8C04)
476477

target/linux/realtek/files-6.12/drivers/net/dsa/rtl83xx/rtl83xx.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -209,7 +209,10 @@ void rtl9300_dump_debug(void);
209209
void rtl930x_pie_rule_dump_raw(u32 r[]);
210210

211211
void rtl931x_print_matrix(void);
212+
213+
void rtldsa_930x_set_receive_management_action(int port, rma_ctrl_t type, action_type_t action);
212214
void rtl931x_set_receive_management_action(int port, rma_ctrl_t type, action_type_t action);
215+
213216
void rtl931x_sw_init(struct rtl838x_switch_priv *priv);
214217

215218
#endif /* _NET_DSA_RTL83XX_H */

target/linux/realtek/files-6.12/drivers/net/dsa/rtl83xx/rtl930x.c

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -657,6 +657,85 @@ static void rtl930x_write_mcast_pmask(int idx, u64 portmask)
657657
rtl_table_release(q);
658658
}
659659

660+
void rtldsa_930x_set_receive_management_action(int port, rma_ctrl_t type,
661+
action_type_t action)
662+
{
663+
u32 shift;
664+
u32 value;
665+
u32 reg;
666+
667+
/* hack for value mapping */
668+
if (type == GRATARP && action == COPY2CPU)
669+
action = TRAP2MASTERCPU;
670+
671+
/* PTP doesn't allow to flood to all ports */
672+
if (action == FLOODALL &&
673+
(type == PTP || type == PTP_UDP || type == PTP_ETH2)) {
674+
pr_warn("%s: Port flooding not supported for PTP\n", __func__);
675+
return;
676+
}
677+
678+
switch(action) {
679+
case FORWARD:
680+
value = 0;
681+
break;
682+
case DROP:
683+
value = 1;
684+
break;
685+
case TRAP2CPU:
686+
value = 2;
687+
break;
688+
case TRAP2MASTERCPU:
689+
value = 3;
690+
break;
691+
case FLOODALL:
692+
value = 4;
693+
break;
694+
default:
695+
return;
696+
}
697+
698+
switch(type) {
699+
case BPDU:
700+
reg = RTL930X_RMA_BPDU_CTRL + (port / 10) * 4;
701+
shift = (port % 10) * 3;
702+
sw_w32_mask(GENMASK(shift + 2, shift), value << shift, reg);
703+
break;
704+
case PTP:
705+
reg = RTL930X_RMA_PTP_CTRL + port * 4;
706+
707+
/* udp */
708+
sw_w32_mask(GENMASK(3, 2), value << 2, reg);
709+
710+
/* eth2 */
711+
sw_w32_mask(GENMASK(1, 0), value, reg);
712+
break;
713+
case PTP_UDP:
714+
reg = RTL930X_RMA_PTP_CTRL + port * 4;
715+
sw_w32_mask(GENMASK(3, 2), value << 2, reg);
716+
break;
717+
case PTP_ETH2:
718+
reg = RTL930X_RMA_PTP_CTRL + port * 4;
719+
sw_w32_mask(GENMASK(1, 0), value, reg);
720+
break;
721+
case LLDP:
722+
reg = RTL930X_RMA_LLDP_CTRL + (port / 10) * 4;
723+
shift = (port % 10) * 3;
724+
sw_w32_mask(GENMASK(shift + 2, shift), value << shift, reg);
725+
break;
726+
case EAPOL:
727+
reg = RTL930X_RMA_EAPOL_CTRL + (port / 10) * 4;
728+
shift = (port % 10) * 3;
729+
sw_w32_mask(GENMASK(shift + 2, shift), value << shift, reg);
730+
break;
731+
case GRATARP:
732+
reg = RTL930X_SPCL_TRAP_PORT_CTRL + (port / 16) * 4;
733+
shift = (port % 16) * 2;
734+
sw_w32_mask(GENMASK(shift + 1, shift), value << shift, reg);
735+
break;
736+
}
737+
}
738+
660739
static u64 rtl930x_traffic_get(int source)
661740
{
662741
u32 v;
@@ -2419,4 +2498,5 @@ const struct rtl838x_reg rtl930x_reg = {
24192498
.led_init = rtl930x_led_init,
24202499
.enable_learning = rtldsa_930x_enable_learning,
24212500
.enable_flood = rtldsa_930x_enable_flood,
2501+
.set_receive_management_action = rtldsa_930x_set_receive_management_action,
24222502
};

0 commit comments

Comments
 (0)