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@kernel.org/ Signed-off-by: Til Kaiser --- 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