ath11k: Assign free_vdev_map value before ieee80211_register_hw
Firmware crash is seen randomly, because of sending wrong vdev_id in vdev_create command. This is due to free_vdev_map value being 0. free_vdev_map is getting assigned after ieee80211_register_hw. In some race conditions, add_interface api is getting called before assigning value to free_vdev_map. Fix this by assigning free_vdev_map before ieee80211_register_hw. Also, moved ar->cc_freq_hz and ar->txmgmt_idr initialization before ieee80211_register_hw to avoid such race conditions. Tested-on: IPQ8074 hw2.0 AHB WLAN.HK.2.5.0.1-00948-QCAHKSWPL_SILICONZ-1 Tested-on: QCN9074 hw1.0 PCI WLAN.HK.2.4.0.1-01734-QCAHKSWPL_SILICONZ-1 Signed-off-by: Seevalamuthu Mariappan <seevalam@codeaurora.org> Signed-off-by: Jouni Malinen <jouni@codeaurora.org> Signed-off-by: Kalle Valo <kvalo@codeaurora.org> Link: https://lore.kernel.org/r/20210721212029.142388-6-jouni@codeaurora.org
This commit is contained in:
parent
8717db7ee8
commit
3c79cb4d63
|
@ -7701,6 +7701,10 @@ int ath11k_mac_register(struct ath11k_base *ab)
|
|||
if (test_bit(ATH11K_FLAG_REGISTERED, &ab->dev_flags))
|
||||
return 0;
|
||||
|
||||
/* Initialize channel counters frequency value in hertz */
|
||||
ab->cc_freq_hz = IPQ8074_CC_FREQ_HERTZ;
|
||||
ab->free_vdev_map = (1LL << (ab->num_radios * TARGET_NUM_VDEVS)) - 1;
|
||||
|
||||
for (i = 0; i < ab->num_radios; i++) {
|
||||
pdev = &ab->pdevs[i];
|
||||
ar = pdev->ar;
|
||||
|
@ -7711,18 +7715,14 @@ int ath11k_mac_register(struct ath11k_base *ab)
|
|||
ar->mac_addr[4] += i;
|
||||
}
|
||||
|
||||
idr_init(&ar->txmgmt_idr);
|
||||
spin_lock_init(&ar->txmgmt_idr_lock);
|
||||
|
||||
ret = __ath11k_mac_register(ar);
|
||||
if (ret)
|
||||
goto err_cleanup;
|
||||
|
||||
idr_init(&ar->txmgmt_idr);
|
||||
spin_lock_init(&ar->txmgmt_idr_lock);
|
||||
}
|
||||
|
||||
/* Initialize channel counters frequency value in hertz */
|
||||
ab->cc_freq_hz = IPQ8074_CC_FREQ_HERTZ;
|
||||
ab->free_vdev_map = (1LL << (ab->num_radios * TARGET_NUM_VDEVS)) - 1;
|
||||
|
||||
return 0;
|
||||
|
||||
err_cleanup:
|
||||
|
|
Loading…
Reference in New Issue