Skip to content

Commit 26f3a02

Browse files
Carl HuangKalle Valo
authored andcommitted
ath11k: allocate smaller chunks of memory for firmware
On x86 it's sometimes difficult to allocate a large contigous DMA memory, so instead allocate blocks of small chunk memory. In ath11k_qmi_msg_mem_request_cb() the error handling was cleaned up to avoid an unused variable warning. Also changed the test from (ret < 0) to just (ret) as the functions don't return any positive values. Tested-on: QCA6390 hw2.0 PCI WLAN.HST.1.0.1-01740-QCAHSTSWPLZ_V2_TO_X86-1 Tested-on: IPQ8074 hw2.0 AHB WLAN.HK.2.1.0.1-01238-QCAHKSWPL_SILICONZ-2 Signed-off-by: Carl Huang <[email protected]> Signed-off-by: Kalle Valo <[email protected]> Link: https://lore.kernel.org/r/[email protected]
1 parent 2c3960c commit 26f3a02

File tree

1 file changed

+30
-12
lines changed
  • drivers/net/wireless/ath/ath11k

1 file changed

+30
-12
lines changed

drivers/net/wireless/ath/ath11k/qmi.c

Lines changed: 30 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1640,19 +1640,30 @@ static int ath11k_qmi_respond_fw_mem_request(struct ath11k_base *ab)
16401640

16411641
memset(&resp, 0, sizeof(resp));
16421642

1643-
req->mem_seg_len = ab->qmi.mem_seg_count;
1643+
/* For QCA6390 by default FW requests a block of ~4M contiguous
1644+
* DMA memory, it's hard to allocate from OS. So host returns
1645+
* failure to FW and FW will then request mulitple blocks of small
1646+
* chunk size memory.
1647+
*/
1648+
if (!ab->bus_params.fixed_mem_region && ab->qmi.mem_seg_count <= 2) {
1649+
ath11k_dbg(ab, ATH11K_DBG_QMI, "qmi delays mem_request %d\n",
1650+
ab->qmi.mem_seg_count);
1651+
memset(req, 0, sizeof(*req));
1652+
} else {
1653+
req->mem_seg_len = ab->qmi.mem_seg_count;
1654+
1655+
for (i = 0; i < req->mem_seg_len ; i++) {
1656+
req->mem_seg[i].addr = ab->qmi.target_mem[i].paddr;
1657+
req->mem_seg[i].size = ab->qmi.target_mem[i].size;
1658+
req->mem_seg[i].type = ab->qmi.target_mem[i].type;
1659+
}
1660+
}
16441661

16451662
ret = qmi_txn_init(&ab->qmi.handle, &txn,
16461663
qmi_wlanfw_respond_mem_resp_msg_v01_ei, &resp);
16471664
if (ret < 0)
16481665
goto out;
16491666

1650-
for (i = 0; i < req->mem_seg_len ; i++) {
1651-
req->mem_seg[i].addr = ab->qmi.target_mem[i].paddr;
1652-
req->mem_seg[i].size = ab->qmi.target_mem[i].size;
1653-
req->mem_seg[i].type = ab->qmi.target_mem[i].type;
1654-
}
1655-
16561667
ret = qmi_send_request(&ab->qmi.handle, NULL, &txn,
16571668
QMI_WLANFW_RESPOND_MEM_REQ_V01,
16581669
QMI_WLANFW_RESPOND_MEM_REQ_MSG_V01_MAX_LEN,
@@ -2411,13 +2422,20 @@ static void ath11k_qmi_msg_mem_request_cb(struct qmi_handle *qmi_hdl,
24112422
msg->mem_seg[i].type, msg->mem_seg[i].size);
24122423
}
24132424

2414-
if (ab->bus_params.fixed_mem_region)
2425+
if (ab->bus_params.fixed_mem_region) {
24152426
ret = ath11k_qmi_assign_target_mem_chunk(ab);
2416-
else
2427+
if (ret) {
2428+
ath11k_warn(ab, "qmi failed to assign target memory: %d\n",
2429+
ret);
2430+
return;
2431+
}
2432+
} else if (msg->mem_seg_len > 2) {
24172433
ret = ath11k_qmi_alloc_target_mem_chunk(ab);
2418-
if (ret < 0) {
2419-
ath11k_warn(ab, "qmi failed to alloc target memory:%d\n", ret);
2420-
return;
2434+
if (ret) {
2435+
ath11k_warn(ab, "qmi failed to alloc target memory: %d\n",
2436+
ret);
2437+
return;
2438+
}
24212439
}
24222440

24232441
ath11k_qmi_driver_event_post(qmi, ATH11K_QMI_EVENT_REQUEST_MEM, NULL);

0 commit comments

Comments
 (0)