Commit 649ea07fc25a for kernel

commit 649ea07fc25a17aa51bff710baac1ab161022a7c
Author: Lorenzo Bianconi <lorenzo@kernel.org>
Date:   Mon Jul 20 13:22:28 2026 +0200

    net: airoha: fix ETS channel derivation in airoha_tc_setup_qdisc_ets()

    Derive the hardware QoS channel from opt->parent instead of opt->handle
    in airoha_tc_setup_qdisc_ets(). The ETS qdisc handle is either
    user-specified or auto-allocated by qdisc_alloc_handle() and bears no
    relation to the HTB leaf classid that identifies the hardware channel.
    HTB derives the channel from TC_H_MIN(opt->classid), and ETS is always
    attached as a child of an HTB leaf, so its opt->parent matches that
    classid. Using opt->handle instead can cause two ETS qdiscs on different
    HTB leaves to collide on the same hardware channel, corrupting scheduler
    configuration and stats.

    Fixes: 20bf7d07c956 ("net: airoha: Add sched ETS offload support")
    Reviewed-by: Simon Horman <horms@kernel.org>
    Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
    Link: https://patch.msgid.link/20260720-airoha-ets-handle-fix-v2-1-6f7129ddc06f@kernel.org
    Signed-off-by: Jakub Kicinski <kuba@kernel.org>

diff --git a/drivers/net/ethernet/airoha/airoha_eth.c b/drivers/net/ethernet/airoha/airoha_eth.c
index 90aa8b0210bd..79418e682f71 100644
--- a/drivers/net/ethernet/airoha/airoha_eth.c
+++ b/drivers/net/ethernet/airoha/airoha_eth.c
@@ -2543,8 +2543,7 @@ static int airoha_tc_setup_qdisc_ets(struct net_device *dev,
 	if (opt->parent == TC_H_ROOT)
 		return -EINVAL;

-	channel = TC_H_MAJ(opt->handle) >> 16;
-	channel = channel % AIROHA_NUM_QOS_CHANNELS;
+	channel = TC_H_MIN(opt->parent) % AIROHA_NUM_QOS_CHANNELS;

 	switch (opt->command) {
 	case TC_ETS_REPLACE: