[RFC PATCH 5/6] wifi: ath12k: assign unique hardware link IDs during QMI host cap

Raj Kumar Bhagat
2024-10-23T06:04:55Z

From: Aditya Kumar Singh <quic_adisi@quicinc.com>

Currently, in the QMI host capability, the device index, the number of
local links, and the corresponding hardware link IDs are sent. The hardware
link ID assignment is based on the local variable hw_link_id, which starts
from 0 and ranges up to num_local_links in the device. Starting from 0 is
not ideal because it can result in the same link ID being assigned to
different devices in certain scenarios (for example split mac). Hence, for
MLO to function seamlessly, the hardware link IDs across devices need to
be unique.

To address this, a previous change already read the device ID from the
Device Tree (DT) and stored it. This device ID will now be used as the
starting index for the hardware link IDs. This ensures that the hardware
link IDs assigned are unique across all devices.

While at it, add debug prints to clearly show the MLO capability
advertisement sent during QMI host capability exchange.

Signed-off-by: Aditya Kumar Singh <quic_adisi@quicinc.com>
Signed-off-by: Kalle Valo <quic_kvalo@quicinc.com>
---
drivers/net/wireless/ath/ath12k/qmi.c | 18 +++++++++++++++---
1 file changed, 15 insertions(+), 3 deletions(-)

diff --git a/drivers/net/wireless/ath/ath12k/qmi.c b/drivers/net/wireless/ath/ath12k/qmi.c
index 689171b7b19f..24aa74fa1c85 100644
--- a/drivers/net/wireless/ath/ath12k/qmi.c
+++ b/drivers/net/wireless/ath/ath12k/qmi.c
@@ -2060,6 +2060,12 @@ static int ath12k_host_cap_parse_mlo(struct ath12k_base *ab,
req->mlo_num_chips_valid = 1;
req->mlo_num_chips = ag->num_devices;

+ ath12k_dbg(ab, ATH12K_DBG_QMI, "MLO Capability advertisement:");
+ ath12k_dbg(ab, ATH12K_DBG_QMI, " * device_id: %d", req->mlo_chip_id);
+ ath12k_dbg(ab, ATH12K_DBG_QMI, " * group_id: %d", req->mlo_group_id);
+ ath12k_dbg(ab, ATH12K_DBG_QMI, " * num_devices: %d", req->mlo_num_chips);
+ ath12k_dbg(ab, ATH12K_DBG_QMI, " * Devices info:");
+
mutex_lock(&ag->mutex_lock);
for (i = 0; i < ag->num_devices; i++) {
info = &req->mlo_chip_info[i];
@@ -2074,13 +2080,19 @@ static int ath12k_host_cap_parse_mlo(struct ath12k_base *ab,
info->chip_id = partner_ab->device_id;
info->num_local_links = partner_ab->qmi.num_radios;

- ath12k_dbg(ab, ATH12K_DBG_QMI, "MLO device id %d num_link %d\n",
- info->chip_id, info->num_local_links);
+ ath12k_dbg(ab, ATH12K_DBG_QMI, " * device_id: %d",
+ info->chip_id);
+ ath12k_dbg(ab, ATH12K_DBG_QMI, " * num_links: %d",
+ info->num_local_links);

for (j = 0; j < info->num_local_links; j++) {
- info->hw_link_id[j] = hw_link_id;
+ info->hw_link_id[j] = partner_ab->wsi_index + j;
info->valid_mlo_link_id[j] = 1;

+ ath12k_dbg(ab, ATH12K_DBG_QMI,
+ " * hw_link_id: %d\n",
+ info->hw_link_id[j]);
+
hw_link_id++;
}
}
--
2.34.1