@@ -844,12 +844,14 @@ struct ath12k_hw_group {
struct ath12k_hw *ah[ATH12K_GROUP_MAX_RADIO];
u8 num_hw;
bool mlo_capable;
+ bool hw_link_id_init_done;
};
struct ath12k_wsi_info {
u32 group_id;
u32 num_devices;
u32 index;
+ u32 hw_link_id_base;
};
/* Master structure to hold the hw data which may be used in core module */
@@ -2016,6 +2016,25 @@ static const struct qmi_elem_info qmi_wlanfw_wlan_ini_resp_msg_v01_ei[] = {
},
};
+static void ath12k_host_cap_hw_link_id_init(struct ath12k_hw_group *ag)
+{
+ struct ath12k_base *ab, *partner_ab;
+ int i, j, hw_id_base;
+
+ for (i = 0; i < ag->num_devices; i++) {
+ hw_id_base = 0;
+ ab = ag->ab[i];
+ for (j = 0; j < ag->num_devices; j++) {
+ partner_ab = ag->ab[j];
+ if (partner_ab->wsi_info.index >= ab->wsi_info.index)
+ continue;
+ hw_id_base += partner_ab->qmi.num_radios;
+ }
+ ab->wsi_info.hw_link_id_base = hw_id_base;
+ }
+ ag->hw_link_id_init_done = true;
+}
+
static int ath12k_host_cap_parse_mlo(struct ath12k_base *ab,
struct qmi_wlanfw_host_cap_req_msg_v01 *req)
{
@@ -2060,7 +2079,17 @@ 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);
+
+ if (!ag->hw_link_id_init_done)
+ ath12k_host_cap_hw_link_id_init(ag);
+
for (i = 0; i < ag->num_devices; i++) {
info = &req->mlo_chip_info[i];
partner_ab = ag->ab[i];
@@ -2074,13 +2103,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_info.hw_link_id_base + 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++;
}
}