Skip to content

Commit

Permalink
ath11k: Add QMI changes for WCN6750
Browse files Browse the repository at this point in the history
In the case of WCN6750, FW doesn't request for DDR memory
via QMI, instead it uses a fixed 12MB reserved Memory region
in the DDR which is called as MSA region. As a result, QMI
message sequence is not same as other ath11k supported devices.

Also, M3 firmware will be bundled into the FW and will be
downloaded to the target as part of Q6 boot.

This is the QMI flow in the case of WCN6750,

1) QMI firmware indication REQ/RESP
2) QMI host capability REQ/RESP
3) QMI target capability REQ/RESP
4) QMI device info REQ/RESP
5) QMI BDF download
6) QMI FW ready

Tested-on: WCN6750 hw1.0 AHB WLAN.MSL.1.0.1-00887-QCAMSLSWPLZ-1
Tested-on: WCN6855 hw2.0 PCI WLAN.HSP.1.1-01720.1-QCAHSPSWPL_V1_V2_SILICONZ_LITE-1
Tested-on: QCN9074 hw1.0 PCI WLAN.HK.2.5.0.1-01100-QCAHKSWPL_SILICONZ-1
Tested-on: IPQ8074 hw2.0 AHB WLAN.HK.2.4.0.1-00192-QCAHKSWPL_SILICONZ-1

Signed-off-by: Manikanta Pubbisetty <quic_mpubbise@quicinc.com>
Signed-off-by: Kalle Valo <quic_kvalo@quicinc.com>
Link: https://lore.kernel.org/r/20220429170502.20080-7-quic_mpubbise@quicinc.com
  • Loading branch information
Manikanta Pubbisetty authored and Kalle Valo committed May 2, 2022
1 parent 676f890 commit 73d3e71
Show file tree
Hide file tree
Showing 3 changed files with 56 additions and 28 deletions.
7 changes: 7 additions & 0 deletions drivers/net/wireless/ath/ath11k/core.c
Original file line number Diff line number Diff line change
Expand Up @@ -109,6 +109,7 @@ static const struct ath11k_hw_params ath11k_hw_params[] = {
.hybrid_bus_type = false,
.dp_window_idx = 0,
.ce_window_idx = 0,
.fixed_fw_mem = false,
},
{
.hw_rev = ATH11K_HW_IPQ6018_HW10,
Expand Down Expand Up @@ -183,6 +184,7 @@ static const struct ath11k_hw_params ath11k_hw_params[] = {
.hybrid_bus_type = false,
.dp_window_idx = 0,
.ce_window_idx = 0,
.fixed_fw_mem = false,
},
{
.name = "qca6390 hw2.0",
Expand Down Expand Up @@ -256,6 +258,7 @@ static const struct ath11k_hw_params ath11k_hw_params[] = {
.hybrid_bus_type = false,
.dp_window_idx = 0,
.ce_window_idx = 0,
.fixed_fw_mem = false,
},
{
.name = "qcn9074 hw1.0",
Expand Down Expand Up @@ -329,6 +332,7 @@ static const struct ath11k_hw_params ath11k_hw_params[] = {
.hybrid_bus_type = false,
.dp_window_idx = 3,
.ce_window_idx = 2,
.fixed_fw_mem = false,
},
{
.name = "wcn6855 hw2.0",
Expand Down Expand Up @@ -402,6 +406,7 @@ static const struct ath11k_hw_params ath11k_hw_params[] = {
.hybrid_bus_type = false,
.dp_window_idx = 0,
.ce_window_idx = 0,
.fixed_fw_mem = false,
},
{
.name = "wcn6855 hw2.1",
Expand Down Expand Up @@ -474,6 +479,7 @@ static const struct ath11k_hw_params ath11k_hw_params[] = {
.hybrid_bus_type = false,
.dp_window_idx = 0,
.ce_window_idx = 0,
.fixed_fw_mem = false,
},
{
.name = "wcn6750 hw1.0",
Expand Down Expand Up @@ -543,6 +549,7 @@ static const struct ath11k_hw_params ath11k_hw_params[] = {
.hybrid_bus_type = true,
.dp_window_idx = 1,
.ce_window_idx = 2,
.fixed_fw_mem = true,
},
};

Expand Down
1 change: 1 addition & 0 deletions drivers/net/wireless/ath/ath11k/hw.h
Original file line number Diff line number Diff line change
Expand Up @@ -203,6 +203,7 @@ struct ath11k_hw_params {
bool hybrid_bus_type;
u8 dp_window_idx;
u8 ce_window_idx;
bool fixed_fw_mem;
};

struct ath11k_hw_ops {
Expand Down
76 changes: 48 additions & 28 deletions drivers/net/wireless/ath/ath11k/qmi.c
Original file line number Diff line number Diff line change
Expand Up @@ -1799,10 +1799,6 @@ static int ath11k_qmi_fw_ind_register_send(struct ath11k_base *ab)
req->client_id = QMI_WLANFW_CLIENT_ID;
req->fw_ready_enable_valid = 1;
req->fw_ready_enable = 1;
req->request_mem_enable_valid = 1;
req->request_mem_enable = 1;
req->fw_mem_ready_enable_valid = 1;
req->fw_mem_ready_enable = 1;
req->cal_done_enable_valid = 1;
req->cal_done_enable = 1;
req->fw_init_done_enable_valid = 1;
Expand All @@ -1811,6 +1807,17 @@ static int ath11k_qmi_fw_ind_register_send(struct ath11k_base *ab)
req->pin_connect_result_enable_valid = 0;
req->pin_connect_result_enable = 0;

/* WCN6750 doesn't request for DDR memory via QMI,
* instead it uses a fixed 12MB reserved memory
* region in DDR.
*/
if (!ab->hw_params.fixed_fw_mem) {
req->request_mem_enable_valid = 1;
req->request_mem_enable = 1;
req->fw_mem_ready_enable_valid = 1;
req->fw_mem_ready_enable = 1;
}

ret = qmi_txn_init(handle, &txn,
qmi_wlanfw_ind_register_resp_msg_v01_ei, resp);
if (ret < 0)
Expand Down Expand Up @@ -2840,27 +2847,6 @@ ath11k_qmi_driver_event_post(struct ath11k_qmi *qmi,
return 0;
}

static int ath11k_qmi_event_server_arrive(struct ath11k_qmi *qmi)
{
struct ath11k_base *ab = qmi->ab;
int ret;

ret = ath11k_qmi_fw_ind_register_send(ab);
if (ret < 0) {
ath11k_warn(ab, "failed to send qmi firmware indication: %d\n",
ret);
return ret;
}

ret = ath11k_qmi_host_cap_send(ab);
if (ret < 0) {
ath11k_warn(ab, "failed to send qmi host cap: %d\n", ret);
return ret;
}

return ret;
}

static int ath11k_qmi_event_mem_request(struct ath11k_qmi *qmi)
{
struct ath11k_base *ab = qmi->ab;
Expand Down Expand Up @@ -2902,9 +2888,33 @@ static int ath11k_qmi_event_load_bdf(struct ath11k_qmi *qmi)
return ret;
}

ret = ath11k_qmi_wlanfw_m3_info_send(ab);
return 0;
}

static int ath11k_qmi_event_server_arrive(struct ath11k_qmi *qmi)
{
struct ath11k_base *ab = qmi->ab;
int ret;

ret = ath11k_qmi_fw_ind_register_send(ab);
if (ret < 0) {
ath11k_warn(ab, "failed to send qmi firmware indication: %d\n",
ret);
return ret;
}

ret = ath11k_qmi_host_cap_send(ab);
if (ret < 0) {
ath11k_warn(ab, "failed to send qmi m3 info req: %d\n", ret);
ath11k_warn(ab, "failed to send qmi host cap: %d\n", ret);
return ret;
}

if (!ab->hw_params.fixed_fw_mem)
return ret;

ret = ath11k_qmi_event_load_bdf(qmi);
if (ret < 0) {
ath11k_warn(ab, "qmi failed to download BDF:%d\n", ret);
return ret;
}

Expand Down Expand Up @@ -3104,8 +3114,18 @@ static void ath11k_qmi_driver_event_work(struct work_struct *work)
break;
case ATH11K_QMI_EVENT_FW_MEM_READY:
ret = ath11k_qmi_event_load_bdf(qmi);
if (ret < 0)
if (ret < 0) {
set_bit(ATH11K_FLAG_QMI_FAIL, &ab->dev_flags);
break;
}

ret = ath11k_qmi_wlanfw_m3_info_send(ab);
if (ret < 0) {
ath11k_warn(ab,
"failed to send qmi m3 info req: %d\n", ret);
set_bit(ATH11K_FLAG_QMI_FAIL, &ab->dev_flags);
}

break;
case ATH11K_QMI_EVENT_FW_READY:
clear_bit(ATH11K_FLAG_QMI_FAIL, &ab->dev_flags);
Expand Down

0 comments on commit 73d3e71

Please sign in to comment.