[PATCH net-next v2 5/5] net: dsa: motorcomm: Add TC prio support
From: David Yang
Date: Thu Oct 01 2026 - 16:52:32 EST
The HW supports fewer ACL priorities than TC does. Notice the default
priority for flower is 49152 and catchall filter has priority 65535, so
scale the priority accordingly and reject the ones that do not map onto
a hardware priority.
Signed-off-by: David Yang <mmyangfl@xxxxxxxxx>
---
drivers/net/dsa/motorcomm/tc.c | 19 ++++++++++++++++++-
drivers/net/dsa/motorcomm/tc.h | 1 +
2 files changed, 19 insertions(+), 1 deletion(-)
diff --git a/drivers/net/dsa/motorcomm/tc.c b/drivers/net/dsa/motorcomm/tc.c
index 95ed0f245b1f..c5581e85208f 100644
--- a/drivers/net/dsa/motorcomm/tc.c
+++ b/drivers/net/dsa/motorcomm/tc.c
@@ -1029,7 +1029,10 @@ yt921x_acl_rule_ext_parse_flow(struct yt921x_acl_rule_ext *ruleext, int port,
const struct flow_cls_offload *cls, bool ingress,
struct yt921x_priv *priv)
{
+ const unsigned int scale = (U16_MAX + 1) / YT921X_ACL_ORD_NUM;
struct netlink_ext_ack *extack = cls->common.extack;
+ u32 prio = cls->common.prio;
+ u32 ord;
int res;
if (!ingress) {
@@ -1042,6 +1045,20 @@ yt921x_acl_rule_ext_parse_flow(struct yt921x_acl_rule_ext *ruleext, int port,
return -EOPNOTSUPP;
}
+ /* TC prio can't be 0 & TC lowest first -> HW highest first
+ * map 1...U16_MAX to (ACL_ORD_NUM - 1)...0
+ */
+ if (prio == U16_MAX) {
+ ord = 0;
+ } else if (!(prio % scale)) {
+ ord = YT921X_ACL_ORD_NUM - prio / scale;
+ } else {
+ NL_SET_ERR_MSG_FMT_MOD(extack,
+ "Invalid priority %u, must be a multiple of %u or 65535",
+ prio, scale);
+ return -EOPNOTSUPP;
+ }
+
res = yt921x_acl_rule_ext_parse_flow_action(ruleext, cls, priv, port);
if (res)
return res;
@@ -1049,7 +1066,7 @@ yt921x_acl_rule_ext_parse_flow(struct yt921x_acl_rule_ext *ruleext, int port,
if (res)
return res;
- yt921x_acl_rule_set_ports(&ruleext->r, 0, BIT(port));
+ yt921x_acl_rule_set_ports(&ruleext->r, ord, BIT(port));
ruleext->r.tag = cls->cookie;
ruleext->r.type = TC_SETUP_CLSFLOWER;
return 0;
diff --git a/drivers/net/dsa/motorcomm/tc.h b/drivers/net/dsa/motorcomm/tc.h
index 2a811127ec8c..99d4abf5dacd 100644
--- a/drivers/net/dsa/motorcomm/tc.h
+++ b/drivers/net/dsa/motorcomm/tc.h
@@ -331,6 +331,7 @@ enum yt921x_l4_type {
#define YT921X_ACL_ENT_PER_BLK 8
#define YT921X_ACL_NUM 384
+#define YT921X_ACL_ORD_NUM 512
#define YT921X_UDF_NUM 8
struct yt921x_acl_entry {
--
2.53.0