mirror of
https://github.com/torvalds/linux.git
synced 2026-06-04 12:35:52 +02:00
wifi: ath12k: fix firmware assert during insmod in memory segment mode
In segment memory mode, firmware allocates memory segments of size 2 MB. This 2 MB memory is used by firmware for the number of peers. This number of peer is sent from host to firmware during WMI init command. For single-phy the number of peers sent is TARGET_NUM_PEERS_SINGLE = 529 (512 + 17). While for split-phy number of peers sent to firmware is TARGET_NUM_PEERS_DBS = 2 *(512 + 17) = 1058. With this 1058 number of peers firmware is unable to allocate memory in 2 MB segment and firmware crash is observed. Hence, fix this firmware crash by reducing the number of stations TARGET_NUM_STATIONS for split-phy. Tested-on: QCN9274 hw2.0 PCI WLAN.WBE.1.1.1-00188-QCAHKSWPL_SILICONZ-1 Tested-on: QCN9274 hw2.0 PCI WLAN.WBE.1.0.1-00029-QCAHKSWPL_SILICONZ-1 Tested-on: WCN7850 hw2.0 PCI WLAN.HMT.1.0.c5-00481-QCAHMTSWPL_V1.0_V2.0_SILICONZ-3 Signed-off-by: Aaradhana Sahu <quic_aarasahu@quicinc.com> Co-developed-by: Raj Kumar Bhagat <quic_rajkbhag@quicinc.com> Signed-off-by: Raj Kumar Bhagat <quic_rajkbhag@quicinc.com> Acked-by: Jeff Johnson <quic_jjohnson@quicinc.com> Signed-off-by: Kalle Valo <quic_kvalo@quicinc.com> Link: https://msgid.link/20240129065724.2310207-7-quic_rajkbhag@quicinc.com
This commit is contained in:
parent
94e8235c67
commit
664a1c96b2
|
|
@ -510,6 +510,33 @@ int ath12k_core_fetch_regdb(struct ath12k_base *ab, struct ath12k_board_data *bd
|
|||
return ret;
|
||||
}
|
||||
|
||||
u32 ath12k_core_get_max_station_per_radio(struct ath12k_base *ab)
|
||||
{
|
||||
if (ab->num_radios == 2)
|
||||
return TARGET_NUM_STATIONS_DBS;
|
||||
else if (ab->num_radios == 3)
|
||||
return TARGET_NUM_PEERS_PDEV_DBS_SBS;
|
||||
return TARGET_NUM_STATIONS_SINGLE;
|
||||
}
|
||||
|
||||
u32 ath12k_core_get_max_peers_per_radio(struct ath12k_base *ab)
|
||||
{
|
||||
if (ab->num_radios == 2)
|
||||
return TARGET_NUM_PEERS_PDEV_DBS;
|
||||
else if (ab->num_radios == 3)
|
||||
return TARGET_NUM_PEERS_PDEV_DBS_SBS;
|
||||
return TARGET_NUM_PEERS_PDEV_SINGLE;
|
||||
}
|
||||
|
||||
u32 ath12k_core_get_max_num_tids(struct ath12k_base *ab)
|
||||
{
|
||||
if (ab->num_radios == 2)
|
||||
return TARGET_NUM_TIDS(DBS);
|
||||
else if (ab->num_radios == 3)
|
||||
return TARGET_NUM_TIDS(DBS_SBS);
|
||||
return TARGET_NUM_TIDS(SINGLE);
|
||||
}
|
||||
|
||||
static void ath12k_core_stop(struct ath12k_base *ab)
|
||||
{
|
||||
if (!test_bit(ATH12K_FLAG_CRASH_FLUSH, &ab->dev_flags))
|
||||
|
|
|
|||
|
|
@ -869,6 +869,9 @@ int ath12k_core_suspend(struct ath12k_base *ab);
|
|||
|
||||
const struct firmware *ath12k_core_firmware_request(struct ath12k_base *ab,
|
||||
const char *filename);
|
||||
u32 ath12k_core_get_max_station_per_radio(struct ath12k_base *ab);
|
||||
u32 ath12k_core_get_max_peers_per_radio(struct ath12k_base *ab);
|
||||
u32 ath12k_core_get_max_num_tids(struct ath12k_base *ab);
|
||||
|
||||
static inline const char *ath12k_scan_state_str(enum ath12k_scan_state state)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -17,19 +17,30 @@
|
|||
/* Num VDEVS per radio */
|
||||
#define TARGET_NUM_VDEVS (16 + 1)
|
||||
|
||||
#define TARGET_NUM_PEERS_PDEV (512 + TARGET_NUM_VDEVS)
|
||||
#define TARGET_NUM_PEERS_PDEV_SINGLE (TARGET_NUM_STATIONS_SINGLE + \
|
||||
TARGET_NUM_VDEVS)
|
||||
#define TARGET_NUM_PEERS_PDEV_DBS (TARGET_NUM_STATIONS_DBS + \
|
||||
TARGET_NUM_VDEVS)
|
||||
#define TARGET_NUM_PEERS_PDEV_DBS_SBS (TARGET_NUM_STATIONS_DBS_SBS + \
|
||||
TARGET_NUM_VDEVS)
|
||||
|
||||
/* Num of peers for Single Radio mode */
|
||||
#define TARGET_NUM_PEERS_SINGLE (TARGET_NUM_PEERS_PDEV)
|
||||
#define TARGET_NUM_PEERS_SINGLE (TARGET_NUM_PEERS_PDEV_SINGLE)
|
||||
|
||||
/* Num of peers for DBS */
|
||||
#define TARGET_NUM_PEERS_DBS (2 * TARGET_NUM_PEERS_PDEV)
|
||||
#define TARGET_NUM_PEERS_DBS (2 * TARGET_NUM_PEERS_PDEV_DBS)
|
||||
|
||||
/* Num of peers for DBS_SBS */
|
||||
#define TARGET_NUM_PEERS_DBS_SBS (3 * TARGET_NUM_PEERS_PDEV)
|
||||
#define TARGET_NUM_PEERS_DBS_SBS (3 * TARGET_NUM_PEERS_PDEV_DBS_SBS)
|
||||
|
||||
/* Max num of stations (per radio) */
|
||||
#define TARGET_NUM_STATIONS 512
|
||||
/* Max num of stations for Single Radio mode */
|
||||
#define TARGET_NUM_STATIONS_SINGLE 512
|
||||
|
||||
/* Max num of stations for DBS */
|
||||
#define TARGET_NUM_STATIONS_DBS 128
|
||||
|
||||
/* Max num of stations for DBS_SBS */
|
||||
#define TARGET_NUM_STATIONS_DBS_SBS 128
|
||||
|
||||
#define TARGET_NUM_PEERS(x) TARGET_NUM_PEERS_##x
|
||||
#define TARGET_NUM_PEER_KEYS 2
|
||||
|
|
|
|||
|
|
@ -7624,8 +7624,8 @@ static int ath12k_mac_setup_register(struct ath12k *ar,
|
|||
ath12k_mac_setup_ht_vht_cap(ar, cap, ht_cap);
|
||||
ath12k_mac_setup_sband_iftype_data(ar, cap);
|
||||
|
||||
ar->max_num_stations = TARGET_NUM_STATIONS;
|
||||
ar->max_num_peers = TARGET_NUM_PEERS_PDEV;
|
||||
ar->max_num_stations = ath12k_core_get_max_station_per_radio(ar->ab);
|
||||
ar->max_num_peers = ath12k_core_get_max_peers_per_radio(ar->ab);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -179,18 +179,9 @@ void ath12k_wmi_init_qcn9274(struct ath12k_base *ab,
|
|||
struct ath12k_wmi_resource_config_arg *config)
|
||||
{
|
||||
config->num_vdevs = ab->num_radios * TARGET_NUM_VDEVS;
|
||||
|
||||
if (ab->num_radios == 2) {
|
||||
config->num_peers = TARGET_NUM_PEERS(DBS);
|
||||
config->num_tids = TARGET_NUM_TIDS(DBS);
|
||||
} else if (ab->num_radios == 3) {
|
||||
config->num_peers = TARGET_NUM_PEERS(DBS_SBS);
|
||||
config->num_tids = TARGET_NUM_TIDS(DBS_SBS);
|
||||
} else {
|
||||
/* Control should not reach here */
|
||||
config->num_peers = TARGET_NUM_PEERS(SINGLE);
|
||||
config->num_tids = TARGET_NUM_TIDS(SINGLE);
|
||||
}
|
||||
config->num_peers = ab->num_radios *
|
||||
ath12k_core_get_max_peers_per_radio(ab);
|
||||
config->num_tids = ath12k_core_get_max_num_tids(ab);
|
||||
config->num_offload_peers = TARGET_NUM_OFFLD_PEERS;
|
||||
config->num_offload_reorder_buffs = TARGET_NUM_OFFLD_REORDER_BUFFS;
|
||||
config->num_peer_keys = TARGET_NUM_PEER_KEYS;
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user