[PATCH net 1/2] net: ethernet: qualcomm: ppe: Fix multicast queue admission control access

From: Til Kaiser

Date: Fri Oct 16 2026 - 11:13:54 EST


Multicast queues have global IDs 256 through 299, but their admission
control table has 44 entries indexed from zero. Using the global queue
ID accesses registers beyond that table, leaving the multicast
thresholds unconfigured. Subtract the unicast queue count when
addressing the multicast table. Keep the global IDs for enqueue and
dequeue operations.

Each multicast admission control entry contains three words at a 16-byte
stride. Limit the bulk accesses to those three words instead of
accessing five words, which also reaches the next entry.

The indexing issue was reported by Sashiko.

Fixes: 806268dc7efd ("net: ethernet: qualcomm: Initialize PPE queue management for IPQ9574")
Link: https://lore.kernel.org/netdev/179143027873.434549.15034517641240789690@xxxxxxxxxx/
Signed-off-by: Til Kaiser <mail@xxxxxxxx>
---
drivers/net/ethernet/qualcomm/ppe/ppe_config.c | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/drivers/net/ethernet/qualcomm/ppe/ppe_config.c b/drivers/net/ethernet/qualcomm/ppe/ppe_config.c
index 125b73be92b1..95b29db45580 100644
--- a/drivers/net/ethernet/qualcomm/ppe/ppe_config.c
+++ b/drivers/net/ethernet/qualcomm/ppe/ppe_config.c
@@ -1474,7 +1474,7 @@ static int ppe_config_qm(struct ppe_device *ppe_dev)
{
const struct ppe_qm_queue_config *queue_cfg;
int ret, i, queue_id, queue_cfg_count;
- u32 reg, multicast_queue_cfg[5];
+ u32 reg, multicast_queue_cfg[3];
u32 unicast_queue_cfg[4];
u32 group_cfg[3];

@@ -1530,8 +1530,11 @@ static int ppe_config_qm(struct ppe_device *ppe_dev)
if (ret)
goto qm_config_fail;
} else {
+ int mc_queue_id = queue_id -
+ PPE_AC_UNICAST_QUEUE_CFG_TBL_ENTRIES;
+
reg = PPE_AC_MULTICAST_QUEUE_CFG_TBL_ADDR +
- PPE_AC_MULTICAST_QUEUE_CFG_TBL_INC * queue_id;
+ PPE_AC_MULTICAST_QUEUE_CFG_TBL_INC * mc_queue_id;

ret = regmap_bulk_read(ppe_dev->regmap, reg,
multicast_queue_cfg,
--
2.56.0