realtek: l3: move nexthop helper to new struture

Another two layer 3 functions that do not belong into the DSA
space. Move them over to the L3 configuration structure.

Link: https://github.com/openwrt/openwrt/pull/23963
Signed-off-by: Markus Stockhausen <markus.stockhausen@gmx.de>
This commit is contained in:
Markus Stockhausen
2026-06-28 08:46:37 +02:00
parent a74b29731c
commit b440cd00d1
4 changed files with 49 additions and 45 deletions
@@ -95,6 +95,49 @@ static void otto_l3_839x_route_write(struct otto_l3_ctrl *ctrl, int idx, struct
rtl_table_release(r);
}
/* Destination MAC and L3 egress interface ID of a nexthop entry from the SoC's L3_NEXTHOP table */
__maybe_unused
static void otto_l3_930x_get_nexthop(struct otto_l3_ctrl *ctrl,
int idx, u16 *dmac_id, u16 *interface)
{
struct table_reg *r = rtl_table_get(RTL9300_TBL_1, 3);
u32 v;
rtl_table_read(r, idx);
/* The table has a size of 1 register */
v = sw_r32(rtl_table_data(r, 0));
rtl_table_release(r);
*dmac_id = (v >> 7) & 0x7fff;
*interface = v & 0x7f;
}
/*
* Set the destination MAC and L3 egress interface ID for a nexthop entry in the SoC's L3_NEXTHOP
* table. The nexthop entry is identified by idx. dmac_id is the reference to the L2 entry in the
* L2 forwarding table, special values are
* 0x7ffe: TRAP2CPU
* 0x7ffd: TRAP2MASTERCPU
* 0x7fff: DMAC_ID_DROP
*/
__maybe_unused
static void otto_l3_930x_set_nexthop(struct otto_l3_ctrl *ctrl,
int idx, u16 dmac_id, u16 interface)
{
/* Access L3_NEXTHOP table (3) via register RTL9300_TBL_1 */
struct table_reg *r = rtl_table_get(RTL9300_TBL_1, 3);
dev_dbg(ctrl->dev, "Writing to L3_NEXTHOP table, index %d, dmac_id %d, interface %d\n",
idx, dmac_id, interface);
sw_w32(((dmac_id & 0x7fff) << 7) | (interface & 0x7f), rtl_table_data(r, 0));
dev_dbg(ctrl->dev, "value at index 0: %08x\n", sw_r32(rtl_table_data(r, 0)));
rtl_table_write(r, idx);
rtl_table_release(r);
}
/* Read a prefix route entry from the L3_PREFIX_ROUTE_IPUC table
* We currently only support IPv4 and IPv6 unicast route
*/
@@ -436,8 +479,8 @@ static int otto_l3_nexthop_update(struct otto_l3_ctrl *ctrl, __be32 ip_addr, u64
r->pr.fwd_act = PIE_ACT_ROUTE_UC;
}
if (priv->r->set_l3_nexthop)
priv->r->set_l3_nexthop(r->nh.id, r->nh.l2_id, r->nh.if_id);
if (ctrl->cfg->set_nexthop)
ctrl->cfg->set_nexthop(ctrl, r->nh.id, r->nh.l2_id, r->nh.if_id);
if (r->pr.id < 0) {
r->pr.packet_cntr = rtl83xx_packet_cntr_alloc(priv);
@@ -933,6 +976,8 @@ const struct otto_l3_config otto_l3_839x_cfg = {
const struct otto_l3_config otto_l3_930x_cfg = {
#ifdef CONFIG_NET_DSA_RTL83XX_RTL930X_L3_OFFLOAD
.get_nexthop = otto_l3_930x_get_nexthop,
.set_nexthop = otto_l3_930x_set_nexthop,
.route_read = otto_l3_930x_route_read,
.route_write = otto_l3_930x_route_write,
#endif
@@ -6,6 +6,8 @@
#include "rtl-otto.h"
struct otto_l3_config {
void (*get_nexthop)(struct otto_l3_ctrl *ctrl, int idx, u16 *dmac_id, u16 *interface);
void (*set_nexthop)(struct otto_l3_ctrl *ctrl, int idx, u16 dmac_id, u16 interface);
void (*route_read)(struct otto_l3_ctrl *ctrl, int idx, struct otto_l3_route *rt);
void (*route_write)(struct otto_l3_ctrl *ctrl, int idx, struct otto_l3_route *rt);
};
@@ -1439,8 +1439,6 @@ struct rtldsa_config {
void (*packet_cntr_clear)(int counter);
void (*host_route_write)(int idx, struct otto_l3_route *rt);
int (*l3_setup)(struct rtl838x_switch_priv *priv);
void (*set_l3_nexthop)(int idx, u16 dmac_id, u16 interface);
void (*get_l3_nexthop)(int idx, u16 *dmac_id, u16 *interface);
u64 (*get_l3_egress_mac)(u32 idx);
void (*set_l3_egress_mac)(u32 idx, u64 mac);
int (*find_l3_slot)(struct otto_l3_route *rt, bool must_exist);
@@ -1460,24 +1460,6 @@ static int rtl930x_find_l3_slot(struct otto_l3_route *rt, bool must_exist)
return -1;
}
/* Get the destination MAC and L3 egress interface ID of a nexthop entry from
* the SoC's L3_NEXTHOP table
*/
static void rtl930x_get_l3_nexthop(int idx, u16 *dmac_id, u16 *interface)
{
u32 v;
/* Read L3_NEXTHOP table (3) via register RTL9300_TBL_1 */
struct table_reg *r = rtl_table_get(RTL9300_TBL_1, 3);
rtl_table_read(r, idx);
/* The table has a size of 1 register */
v = sw_r32(rtl_table_data(r, 0));
rtl_table_release(r);
*dmac_id = (v >> 7) & 0x7fff;
*interface = v & 0x7f;
}
// Currently not used
// static int rtl930x_l3_mtu_del(struct rtl838x_switch_priv *priv, int mtu)
// {
@@ -1562,27 +1544,6 @@ static void rtl930x_get_l3_nexthop(int idx, u16 *dmac_id, u16 *interface)
// }
// }
/* Set the destination MAC and L3 egress interface ID for a nexthop entry in the SoC's
* L3_NEXTHOP table. The nexthop entry is identified by idx.
* dmac_id is the reference to the L2 entry in the L2 forwarding table, special values are
* 0x7ffe: TRAP2CPU
* 0x7ffd: TRAP2MASTERCPU
* 0x7fff: DMAC_ID_DROP
*/
static void rtl930x_set_l3_nexthop(int idx, u16 dmac_id, u16 interface)
{
/* Access L3_NEXTHOP table (3) via register RTL9300_TBL_1 */
struct table_reg *r = rtl_table_get(RTL9300_TBL_1, 3);
pr_debug("%s: Writing to L3_NEXTHOP table, index %d, dmac_id %d, interface %d\n",
__func__, idx, dmac_id, interface);
sw_w32(((dmac_id & 0x7fff) << 7) | (interface & 0x7f), rtl_table_data(r, 0));
pr_debug("%s: %08x\n", __func__, sw_r32(rtl_table_data(r, 0)));
rtl_table_write(r, idx);
rtl_table_release(r);
}
#endif /* CONFIG_NET_DSA_RTL83XX_RTL930X_L3_OFFLOAD */
static void rtl930x_pie_lookup_enable(struct rtl838x_switch_priv *priv, int index)
@@ -2742,8 +2703,6 @@ const struct rtldsa_config rtldsa_930x_cfg = {
#ifdef CONFIG_NET_DSA_RTL83XX_RTL930X_L3_OFFLOAD
.host_route_write = rtl930x_host_route_write,
.l3_setup = rtl930x_l3_setup,
.set_l3_nexthop = rtl930x_set_l3_nexthop,
.get_l3_nexthop = rtl930x_get_l3_nexthop,
.get_l3_egress_mac = rtl930x_get_l3_egress_mac,
.set_l3_egress_mac = rtl930x_set_l3_egress_mac,
.find_l3_slot = rtl930x_find_l3_slot,