0001
0002
0003
0004
0005
0006
0007 #include <linux/elf.h>
0008
0009 #include "qmi.h"
0010 #include "core.h"
0011 #include "debug.h"
0012 #include <linux/of.h>
0013 #include <linux/of_address.h>
0014 #include <linux/ioport.h>
0015 #include <linux/firmware.h>
0016 #include <linux/of_device.h>
0017 #include <linux/of_irq.h>
0018
0019 #define SLEEP_CLOCK_SELECT_INTERNAL_BIT 0x02
0020 #define HOST_CSTATE_BIT 0x04
0021 #define PLATFORM_CAP_PCIE_GLOBAL_RESET 0x08
0022
0023 #define FW_BUILD_ID_MASK "QC_IMAGE_VERSION_STRING="
0024
0025 bool ath11k_cold_boot_cal = 1;
0026 EXPORT_SYMBOL(ath11k_cold_boot_cal);
0027 module_param_named(cold_boot_cal, ath11k_cold_boot_cal, bool, 0644);
0028 MODULE_PARM_DESC(cold_boot_cal,
0029 "Decrease the channel switch time but increase the driver load time (Default: true)");
0030
0031 static struct qmi_elem_info qmi_wlanfw_host_cap_req_msg_v01_ei[] = {
0032 {
0033 .data_type = QMI_OPT_FLAG,
0034 .elem_len = 1,
0035 .elem_size = sizeof(u8),
0036 .array_type = NO_ARRAY,
0037 .tlv_type = 0x10,
0038 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
0039 num_clients_valid),
0040 },
0041 {
0042 .data_type = QMI_UNSIGNED_4_BYTE,
0043 .elem_len = 1,
0044 .elem_size = sizeof(u32),
0045 .array_type = NO_ARRAY,
0046 .tlv_type = 0x10,
0047 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
0048 num_clients),
0049 },
0050 {
0051 .data_type = QMI_OPT_FLAG,
0052 .elem_len = 1,
0053 .elem_size = sizeof(u8),
0054 .array_type = NO_ARRAY,
0055 .tlv_type = 0x11,
0056 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
0057 wake_msi_valid),
0058 },
0059 {
0060 .data_type = QMI_UNSIGNED_4_BYTE,
0061 .elem_len = 1,
0062 .elem_size = sizeof(u32),
0063 .array_type = NO_ARRAY,
0064 .tlv_type = 0x11,
0065 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
0066 wake_msi),
0067 },
0068 {
0069 .data_type = QMI_OPT_FLAG,
0070 .elem_len = 1,
0071 .elem_size = sizeof(u8),
0072 .array_type = NO_ARRAY,
0073 .tlv_type = 0x12,
0074 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
0075 gpios_valid),
0076 },
0077 {
0078 .data_type = QMI_DATA_LEN,
0079 .elem_len = 1,
0080 .elem_size = sizeof(u8),
0081 .array_type = NO_ARRAY,
0082 .tlv_type = 0x12,
0083 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
0084 gpios_len),
0085 },
0086 {
0087 .data_type = QMI_UNSIGNED_4_BYTE,
0088 .elem_len = QMI_WLFW_MAX_NUM_GPIO_V01,
0089 .elem_size = sizeof(u32),
0090 .array_type = VAR_LEN_ARRAY,
0091 .tlv_type = 0x12,
0092 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
0093 gpios),
0094 },
0095 {
0096 .data_type = QMI_OPT_FLAG,
0097 .elem_len = 1,
0098 .elem_size = sizeof(u8),
0099 .array_type = NO_ARRAY,
0100 .tlv_type = 0x13,
0101 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
0102 nm_modem_valid),
0103 },
0104 {
0105 .data_type = QMI_UNSIGNED_1_BYTE,
0106 .elem_len = 1,
0107 .elem_size = sizeof(u8),
0108 .array_type = NO_ARRAY,
0109 .tlv_type = 0x13,
0110 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
0111 nm_modem),
0112 },
0113 {
0114 .data_type = QMI_OPT_FLAG,
0115 .elem_len = 1,
0116 .elem_size = sizeof(u8),
0117 .array_type = NO_ARRAY,
0118 .tlv_type = 0x14,
0119 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
0120 bdf_support_valid),
0121 },
0122 {
0123 .data_type = QMI_UNSIGNED_1_BYTE,
0124 .elem_len = 1,
0125 .elem_size = sizeof(u8),
0126 .array_type = NO_ARRAY,
0127 .tlv_type = 0x14,
0128 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
0129 bdf_support),
0130 },
0131 {
0132 .data_type = QMI_OPT_FLAG,
0133 .elem_len = 1,
0134 .elem_size = sizeof(u8),
0135 .array_type = NO_ARRAY,
0136 .tlv_type = 0x15,
0137 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
0138 bdf_cache_support_valid),
0139 },
0140 {
0141 .data_type = QMI_UNSIGNED_1_BYTE,
0142 .elem_len = 1,
0143 .elem_size = sizeof(u8),
0144 .array_type = NO_ARRAY,
0145 .tlv_type = 0x15,
0146 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
0147 bdf_cache_support),
0148 },
0149 {
0150 .data_type = QMI_OPT_FLAG,
0151 .elem_len = 1,
0152 .elem_size = sizeof(u8),
0153 .array_type = NO_ARRAY,
0154 .tlv_type = 0x16,
0155 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
0156 m3_support_valid),
0157 },
0158 {
0159 .data_type = QMI_UNSIGNED_1_BYTE,
0160 .elem_len = 1,
0161 .elem_size = sizeof(u8),
0162 .array_type = NO_ARRAY,
0163 .tlv_type = 0x16,
0164 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
0165 m3_support),
0166 },
0167 {
0168 .data_type = QMI_OPT_FLAG,
0169 .elem_len = 1,
0170 .elem_size = sizeof(u8),
0171 .array_type = NO_ARRAY,
0172 .tlv_type = 0x17,
0173 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
0174 m3_cache_support_valid),
0175 },
0176 {
0177 .data_type = QMI_UNSIGNED_1_BYTE,
0178 .elem_len = 1,
0179 .elem_size = sizeof(u8),
0180 .array_type = NO_ARRAY,
0181 .tlv_type = 0x17,
0182 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
0183 m3_cache_support),
0184 },
0185 {
0186 .data_type = QMI_OPT_FLAG,
0187 .elem_len = 1,
0188 .elem_size = sizeof(u8),
0189 .array_type = NO_ARRAY,
0190 .tlv_type = 0x18,
0191 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
0192 cal_filesys_support_valid),
0193 },
0194 {
0195 .data_type = QMI_UNSIGNED_1_BYTE,
0196 .elem_len = 1,
0197 .elem_size = sizeof(u8),
0198 .array_type = NO_ARRAY,
0199 .tlv_type = 0x18,
0200 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
0201 cal_filesys_support),
0202 },
0203 {
0204 .data_type = QMI_OPT_FLAG,
0205 .elem_len = 1,
0206 .elem_size = sizeof(u8),
0207 .array_type = NO_ARRAY,
0208 .tlv_type = 0x19,
0209 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
0210 cal_cache_support_valid),
0211 },
0212 {
0213 .data_type = QMI_UNSIGNED_1_BYTE,
0214 .elem_len = 1,
0215 .elem_size = sizeof(u8),
0216 .array_type = NO_ARRAY,
0217 .tlv_type = 0x19,
0218 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
0219 cal_cache_support),
0220 },
0221 {
0222 .data_type = QMI_OPT_FLAG,
0223 .elem_len = 1,
0224 .elem_size = sizeof(u8),
0225 .array_type = NO_ARRAY,
0226 .tlv_type = 0x1A,
0227 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
0228 cal_done_valid),
0229 },
0230 {
0231 .data_type = QMI_UNSIGNED_1_BYTE,
0232 .elem_len = 1,
0233 .elem_size = sizeof(u8),
0234 .array_type = NO_ARRAY,
0235 .tlv_type = 0x1A,
0236 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
0237 cal_done),
0238 },
0239 {
0240 .data_type = QMI_OPT_FLAG,
0241 .elem_len = 1,
0242 .elem_size = sizeof(u8),
0243 .array_type = NO_ARRAY,
0244 .tlv_type = 0x1B,
0245 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
0246 mem_bucket_valid),
0247 },
0248 {
0249 .data_type = QMI_UNSIGNED_4_BYTE,
0250 .elem_len = 1,
0251 .elem_size = sizeof(u32),
0252 .array_type = NO_ARRAY,
0253 .tlv_type = 0x1B,
0254 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
0255 mem_bucket),
0256 },
0257 {
0258 .data_type = QMI_OPT_FLAG,
0259 .elem_len = 1,
0260 .elem_size = sizeof(u8),
0261 .array_type = NO_ARRAY,
0262 .tlv_type = 0x1C,
0263 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
0264 mem_cfg_mode_valid),
0265 },
0266 {
0267 .data_type = QMI_UNSIGNED_1_BYTE,
0268 .elem_len = 1,
0269 .elem_size = sizeof(u8),
0270 .array_type = NO_ARRAY,
0271 .tlv_type = 0x1C,
0272 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
0273 mem_cfg_mode),
0274 },
0275 {
0276 .data_type = QMI_EOTI,
0277 .array_type = NO_ARRAY,
0278 .tlv_type = QMI_COMMON_TLV_TYPE,
0279 },
0280 };
0281
0282 static struct qmi_elem_info qmi_wlanfw_host_cap_resp_msg_v01_ei[] = {
0283 {
0284 .data_type = QMI_STRUCT,
0285 .elem_len = 1,
0286 .elem_size = sizeof(struct qmi_response_type_v01),
0287 .array_type = NO_ARRAY,
0288 .tlv_type = 0x02,
0289 .offset = offsetof(struct qmi_wlanfw_host_cap_resp_msg_v01, resp),
0290 .ei_array = qmi_response_type_v01_ei,
0291 },
0292 {
0293 .data_type = QMI_EOTI,
0294 .array_type = NO_ARRAY,
0295 .tlv_type = QMI_COMMON_TLV_TYPE,
0296 },
0297 };
0298
0299 static struct qmi_elem_info qmi_wlanfw_ind_register_req_msg_v01_ei[] = {
0300 {
0301 .data_type = QMI_OPT_FLAG,
0302 .elem_len = 1,
0303 .elem_size = sizeof(u8),
0304 .array_type = NO_ARRAY,
0305 .tlv_type = 0x10,
0306 .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01,
0307 fw_ready_enable_valid),
0308 },
0309 {
0310 .data_type = QMI_UNSIGNED_1_BYTE,
0311 .elem_len = 1,
0312 .elem_size = sizeof(u8),
0313 .array_type = NO_ARRAY,
0314 .tlv_type = 0x10,
0315 .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01,
0316 fw_ready_enable),
0317 },
0318 {
0319 .data_type = QMI_OPT_FLAG,
0320 .elem_len = 1,
0321 .elem_size = sizeof(u8),
0322 .array_type = NO_ARRAY,
0323 .tlv_type = 0x11,
0324 .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01,
0325 initiate_cal_download_enable_valid),
0326 },
0327 {
0328 .data_type = QMI_UNSIGNED_1_BYTE,
0329 .elem_len = 1,
0330 .elem_size = sizeof(u8),
0331 .array_type = NO_ARRAY,
0332 .tlv_type = 0x11,
0333 .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01,
0334 initiate_cal_download_enable),
0335 },
0336 {
0337 .data_type = QMI_OPT_FLAG,
0338 .elem_len = 1,
0339 .elem_size = sizeof(u8),
0340 .array_type = NO_ARRAY,
0341 .tlv_type = 0x12,
0342 .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01,
0343 initiate_cal_update_enable_valid),
0344 },
0345 {
0346 .data_type = QMI_UNSIGNED_1_BYTE,
0347 .elem_len = 1,
0348 .elem_size = sizeof(u8),
0349 .array_type = NO_ARRAY,
0350 .tlv_type = 0x12,
0351 .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01,
0352 initiate_cal_update_enable),
0353 },
0354 {
0355 .data_type = QMI_OPT_FLAG,
0356 .elem_len = 1,
0357 .elem_size = sizeof(u8),
0358 .array_type = NO_ARRAY,
0359 .tlv_type = 0x13,
0360 .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01,
0361 msa_ready_enable_valid),
0362 },
0363 {
0364 .data_type = QMI_UNSIGNED_1_BYTE,
0365 .elem_len = 1,
0366 .elem_size = sizeof(u8),
0367 .array_type = NO_ARRAY,
0368 .tlv_type = 0x13,
0369 .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01,
0370 msa_ready_enable),
0371 },
0372 {
0373 .data_type = QMI_OPT_FLAG,
0374 .elem_len = 1,
0375 .elem_size = sizeof(u8),
0376 .array_type = NO_ARRAY,
0377 .tlv_type = 0x14,
0378 .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01,
0379 pin_connect_result_enable_valid),
0380 },
0381 {
0382 .data_type = QMI_UNSIGNED_1_BYTE,
0383 .elem_len = 1,
0384 .elem_size = sizeof(u8),
0385 .array_type = NO_ARRAY,
0386 .tlv_type = 0x14,
0387 .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01,
0388 pin_connect_result_enable),
0389 },
0390 {
0391 .data_type = QMI_OPT_FLAG,
0392 .elem_len = 1,
0393 .elem_size = sizeof(u8),
0394 .array_type = NO_ARRAY,
0395 .tlv_type = 0x15,
0396 .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01,
0397 client_id_valid),
0398 },
0399 {
0400 .data_type = QMI_UNSIGNED_4_BYTE,
0401 .elem_len = 1,
0402 .elem_size = sizeof(u32),
0403 .array_type = NO_ARRAY,
0404 .tlv_type = 0x15,
0405 .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01,
0406 client_id),
0407 },
0408 {
0409 .data_type = QMI_OPT_FLAG,
0410 .elem_len = 1,
0411 .elem_size = sizeof(u8),
0412 .array_type = NO_ARRAY,
0413 .tlv_type = 0x16,
0414 .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01,
0415 request_mem_enable_valid),
0416 },
0417 {
0418 .data_type = QMI_UNSIGNED_1_BYTE,
0419 .elem_len = 1,
0420 .elem_size = sizeof(u8),
0421 .array_type = NO_ARRAY,
0422 .tlv_type = 0x16,
0423 .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01,
0424 request_mem_enable),
0425 },
0426 {
0427 .data_type = QMI_OPT_FLAG,
0428 .elem_len = 1,
0429 .elem_size = sizeof(u8),
0430 .array_type = NO_ARRAY,
0431 .tlv_type = 0x17,
0432 .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01,
0433 fw_mem_ready_enable_valid),
0434 },
0435 {
0436 .data_type = QMI_UNSIGNED_1_BYTE,
0437 .elem_len = 1,
0438 .elem_size = sizeof(u8),
0439 .array_type = NO_ARRAY,
0440 .tlv_type = 0x17,
0441 .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01,
0442 fw_mem_ready_enable),
0443 },
0444 {
0445 .data_type = QMI_OPT_FLAG,
0446 .elem_len = 1,
0447 .elem_size = sizeof(u8),
0448 .array_type = NO_ARRAY,
0449 .tlv_type = 0x18,
0450 .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01,
0451 fw_init_done_enable_valid),
0452 },
0453 {
0454 .data_type = QMI_UNSIGNED_1_BYTE,
0455 .elem_len = 1,
0456 .elem_size = sizeof(u8),
0457 .array_type = NO_ARRAY,
0458 .tlv_type = 0x18,
0459 .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01,
0460 fw_init_done_enable),
0461 },
0462
0463 {
0464 .data_type = QMI_OPT_FLAG,
0465 .elem_len = 1,
0466 .elem_size = sizeof(u8),
0467 .array_type = NO_ARRAY,
0468 .tlv_type = 0x19,
0469 .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01,
0470 rejuvenate_enable_valid),
0471 },
0472 {
0473 .data_type = QMI_UNSIGNED_1_BYTE,
0474 .elem_len = 1,
0475 .elem_size = sizeof(u8),
0476 .array_type = NO_ARRAY,
0477 .tlv_type = 0x19,
0478 .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01,
0479 rejuvenate_enable),
0480 },
0481 {
0482 .data_type = QMI_OPT_FLAG,
0483 .elem_len = 1,
0484 .elem_size = sizeof(u8),
0485 .array_type = NO_ARRAY,
0486 .tlv_type = 0x1A,
0487 .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01,
0488 xo_cal_enable_valid),
0489 },
0490 {
0491 .data_type = QMI_UNSIGNED_1_BYTE,
0492 .elem_len = 1,
0493 .elem_size = sizeof(u8),
0494 .array_type = NO_ARRAY,
0495 .tlv_type = 0x1A,
0496 .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01,
0497 xo_cal_enable),
0498 },
0499 {
0500 .data_type = QMI_OPT_FLAG,
0501 .elem_len = 1,
0502 .elem_size = sizeof(u8),
0503 .array_type = NO_ARRAY,
0504 .tlv_type = 0x1B,
0505 .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01,
0506 cal_done_enable_valid),
0507 },
0508 {
0509 .data_type = QMI_UNSIGNED_1_BYTE,
0510 .elem_len = 1,
0511 .elem_size = sizeof(u8),
0512 .array_type = NO_ARRAY,
0513 .tlv_type = 0x1B,
0514 .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01,
0515 cal_done_enable),
0516 },
0517 {
0518 .data_type = QMI_EOTI,
0519 .array_type = NO_ARRAY,
0520 .tlv_type = QMI_COMMON_TLV_TYPE,
0521 },
0522 };
0523
0524 static struct qmi_elem_info qmi_wlanfw_ind_register_resp_msg_v01_ei[] = {
0525 {
0526 .data_type = QMI_STRUCT,
0527 .elem_len = 1,
0528 .elem_size = sizeof(struct qmi_response_type_v01),
0529 .array_type = NO_ARRAY,
0530 .tlv_type = 0x02,
0531 .offset = offsetof(struct qmi_wlanfw_ind_register_resp_msg_v01,
0532 resp),
0533 .ei_array = qmi_response_type_v01_ei,
0534 },
0535 {
0536 .data_type = QMI_OPT_FLAG,
0537 .elem_len = 1,
0538 .elem_size = sizeof(u8),
0539 .array_type = NO_ARRAY,
0540 .tlv_type = 0x10,
0541 .offset = offsetof(struct qmi_wlanfw_ind_register_resp_msg_v01,
0542 fw_status_valid),
0543 },
0544 {
0545 .data_type = QMI_UNSIGNED_8_BYTE,
0546 .elem_len = 1,
0547 .elem_size = sizeof(u64),
0548 .array_type = NO_ARRAY,
0549 .tlv_type = 0x10,
0550 .offset = offsetof(struct qmi_wlanfw_ind_register_resp_msg_v01,
0551 fw_status),
0552 },
0553 {
0554 .data_type = QMI_EOTI,
0555 .array_type = NO_ARRAY,
0556 .tlv_type = QMI_COMMON_TLV_TYPE,
0557 },
0558 };
0559
0560 static struct qmi_elem_info qmi_wlanfw_mem_cfg_s_v01_ei[] = {
0561 {
0562 .data_type = QMI_UNSIGNED_8_BYTE,
0563 .elem_len = 1,
0564 .elem_size = sizeof(u64),
0565 .array_type = NO_ARRAY,
0566 .tlv_type = 0,
0567 .offset = offsetof(struct qmi_wlanfw_mem_cfg_s_v01, offset),
0568 },
0569 {
0570 .data_type = QMI_UNSIGNED_4_BYTE,
0571 .elem_len = 1,
0572 .elem_size = sizeof(u32),
0573 .array_type = NO_ARRAY,
0574 .tlv_type = 0,
0575 .offset = offsetof(struct qmi_wlanfw_mem_cfg_s_v01, size),
0576 },
0577 {
0578 .data_type = QMI_UNSIGNED_1_BYTE,
0579 .elem_len = 1,
0580 .elem_size = sizeof(u8),
0581 .array_type = NO_ARRAY,
0582 .tlv_type = 0,
0583 .offset = offsetof(struct qmi_wlanfw_mem_cfg_s_v01, secure_flag),
0584 },
0585 {
0586 .data_type = QMI_EOTI,
0587 .array_type = NO_ARRAY,
0588 .tlv_type = QMI_COMMON_TLV_TYPE,
0589 },
0590 };
0591
0592 static struct qmi_elem_info qmi_wlanfw_mem_seg_s_v01_ei[] = {
0593 {
0594 .data_type = QMI_UNSIGNED_4_BYTE,
0595 .elem_len = 1,
0596 .elem_size = sizeof(u32),
0597 .array_type = NO_ARRAY,
0598 .tlv_type = 0,
0599 .offset = offsetof(struct qmi_wlanfw_mem_seg_s_v01,
0600 size),
0601 },
0602 {
0603 .data_type = QMI_SIGNED_4_BYTE_ENUM,
0604 .elem_len = 1,
0605 .elem_size = sizeof(enum qmi_wlanfw_mem_type_enum_v01),
0606 .array_type = NO_ARRAY,
0607 .tlv_type = 0,
0608 .offset = offsetof(struct qmi_wlanfw_mem_seg_s_v01, type),
0609 },
0610 {
0611 .data_type = QMI_DATA_LEN,
0612 .elem_len = 1,
0613 .elem_size = sizeof(u8),
0614 .array_type = NO_ARRAY,
0615 .tlv_type = 0,
0616 .offset = offsetof(struct qmi_wlanfw_mem_seg_s_v01, mem_cfg_len),
0617 },
0618 {
0619 .data_type = QMI_STRUCT,
0620 .elem_len = QMI_WLANFW_MAX_NUM_MEM_CFG_V01,
0621 .elem_size = sizeof(struct qmi_wlanfw_mem_cfg_s_v01),
0622 .array_type = VAR_LEN_ARRAY,
0623 .tlv_type = 0,
0624 .offset = offsetof(struct qmi_wlanfw_mem_seg_s_v01, mem_cfg),
0625 .ei_array = qmi_wlanfw_mem_cfg_s_v01_ei,
0626 },
0627 {
0628 .data_type = QMI_EOTI,
0629 .array_type = NO_ARRAY,
0630 .tlv_type = QMI_COMMON_TLV_TYPE,
0631 },
0632 };
0633
0634 static struct qmi_elem_info qmi_wlanfw_request_mem_ind_msg_v01_ei[] = {
0635 {
0636 .data_type = QMI_DATA_LEN,
0637 .elem_len = 1,
0638 .elem_size = sizeof(u8),
0639 .array_type = NO_ARRAY,
0640 .tlv_type = 0x01,
0641 .offset = offsetof(struct qmi_wlanfw_request_mem_ind_msg_v01,
0642 mem_seg_len),
0643 },
0644 {
0645 .data_type = QMI_STRUCT,
0646 .elem_len = ATH11K_QMI_WLANFW_MAX_NUM_MEM_SEG_V01,
0647 .elem_size = sizeof(struct qmi_wlanfw_mem_seg_s_v01),
0648 .array_type = VAR_LEN_ARRAY,
0649 .tlv_type = 0x01,
0650 .offset = offsetof(struct qmi_wlanfw_request_mem_ind_msg_v01,
0651 mem_seg),
0652 .ei_array = qmi_wlanfw_mem_seg_s_v01_ei,
0653 },
0654 {
0655 .data_type = QMI_EOTI,
0656 .array_type = NO_ARRAY,
0657 .tlv_type = QMI_COMMON_TLV_TYPE,
0658 },
0659 };
0660
0661 static struct qmi_elem_info qmi_wlanfw_mem_seg_resp_s_v01_ei[] = {
0662 {
0663 .data_type = QMI_UNSIGNED_8_BYTE,
0664 .elem_len = 1,
0665 .elem_size = sizeof(u64),
0666 .array_type = NO_ARRAY,
0667 .tlv_type = 0,
0668 .offset = offsetof(struct qmi_wlanfw_mem_seg_resp_s_v01, addr),
0669 },
0670 {
0671 .data_type = QMI_UNSIGNED_4_BYTE,
0672 .elem_len = 1,
0673 .elem_size = sizeof(u32),
0674 .array_type = NO_ARRAY,
0675 .tlv_type = 0,
0676 .offset = offsetof(struct qmi_wlanfw_mem_seg_resp_s_v01, size),
0677 },
0678 {
0679 .data_type = QMI_SIGNED_4_BYTE_ENUM,
0680 .elem_len = 1,
0681 .elem_size = sizeof(enum qmi_wlanfw_mem_type_enum_v01),
0682 .array_type = NO_ARRAY,
0683 .tlv_type = 0,
0684 .offset = offsetof(struct qmi_wlanfw_mem_seg_resp_s_v01, type),
0685 },
0686 {
0687 .data_type = QMI_UNSIGNED_1_BYTE,
0688 .elem_len = 1,
0689 .elem_size = sizeof(u8),
0690 .array_type = NO_ARRAY,
0691 .tlv_type = 0,
0692 .offset = offsetof(struct qmi_wlanfw_mem_seg_resp_s_v01, restore),
0693 },
0694 {
0695 .data_type = QMI_EOTI,
0696 .array_type = NO_ARRAY,
0697 .tlv_type = QMI_COMMON_TLV_TYPE,
0698 },
0699 };
0700
0701 static struct qmi_elem_info qmi_wlanfw_respond_mem_req_msg_v01_ei[] = {
0702 {
0703 .data_type = QMI_DATA_LEN,
0704 .elem_len = 1,
0705 .elem_size = sizeof(u8),
0706 .array_type = NO_ARRAY,
0707 .tlv_type = 0x01,
0708 .offset = offsetof(struct qmi_wlanfw_respond_mem_req_msg_v01,
0709 mem_seg_len),
0710 },
0711 {
0712 .data_type = QMI_STRUCT,
0713 .elem_len = ATH11K_QMI_WLANFW_MAX_NUM_MEM_SEG_V01,
0714 .elem_size = sizeof(struct qmi_wlanfw_mem_seg_resp_s_v01),
0715 .array_type = VAR_LEN_ARRAY,
0716 .tlv_type = 0x01,
0717 .offset = offsetof(struct qmi_wlanfw_respond_mem_req_msg_v01,
0718 mem_seg),
0719 .ei_array = qmi_wlanfw_mem_seg_resp_s_v01_ei,
0720 },
0721 {
0722 .data_type = QMI_EOTI,
0723 .array_type = NO_ARRAY,
0724 .tlv_type = QMI_COMMON_TLV_TYPE,
0725 },
0726 };
0727
0728 static struct qmi_elem_info qmi_wlanfw_respond_mem_resp_msg_v01_ei[] = {
0729 {
0730 .data_type = QMI_STRUCT,
0731 .elem_len = 1,
0732 .elem_size = sizeof(struct qmi_response_type_v01),
0733 .array_type = NO_ARRAY,
0734 .tlv_type = 0x02,
0735 .offset = offsetof(struct qmi_wlanfw_respond_mem_resp_msg_v01,
0736 resp),
0737 .ei_array = qmi_response_type_v01_ei,
0738 },
0739 {
0740 .data_type = QMI_EOTI,
0741 .array_type = NO_ARRAY,
0742 .tlv_type = QMI_COMMON_TLV_TYPE,
0743 },
0744 };
0745
0746 static struct qmi_elem_info qmi_wlanfw_cap_req_msg_v01_ei[] = {
0747 {
0748 .data_type = QMI_EOTI,
0749 .array_type = NO_ARRAY,
0750 .tlv_type = QMI_COMMON_TLV_TYPE,
0751 },
0752 };
0753
0754 static struct qmi_elem_info qmi_wlanfw_device_info_req_msg_v01_ei[] = {
0755 {
0756 .data_type = QMI_EOTI,
0757 .array_type = NO_ARRAY,
0758 .tlv_type = QMI_COMMON_TLV_TYPE,
0759 },
0760 };
0761
0762 static struct qmi_elem_info qmi_wlfw_device_info_resp_msg_v01_ei[] = {
0763 {
0764 .data_type = QMI_STRUCT,
0765 .elem_len = 1,
0766 .elem_size = sizeof(struct qmi_response_type_v01),
0767 .array_type = NO_ARRAY,
0768 .tlv_type = 0x02,
0769 .offset = offsetof(struct qmi_wlanfw_device_info_resp_msg_v01,
0770 resp),
0771 .ei_array = qmi_response_type_v01_ei,
0772 },
0773 {
0774 .data_type = QMI_OPT_FLAG,
0775 .elem_len = 1,
0776 .elem_size = sizeof(u8),
0777 .array_type = NO_ARRAY,
0778 .tlv_type = 0x10,
0779 .offset = offsetof(struct qmi_wlanfw_device_info_resp_msg_v01,
0780 bar_addr_valid),
0781 },
0782 {
0783 .data_type = QMI_UNSIGNED_8_BYTE,
0784 .elem_len = 1,
0785 .elem_size = sizeof(u64),
0786 .array_type = NO_ARRAY,
0787 .tlv_type = 0x10,
0788 .offset = offsetof(struct qmi_wlanfw_device_info_resp_msg_v01,
0789 bar_addr),
0790 },
0791 {
0792 .data_type = QMI_OPT_FLAG,
0793 .elem_len = 1,
0794 .elem_size = sizeof(u8),
0795 .array_type = NO_ARRAY,
0796 .tlv_type = 0x11,
0797 .offset = offsetof(struct qmi_wlanfw_device_info_resp_msg_v01,
0798 bar_size_valid),
0799 },
0800 {
0801 .data_type = QMI_UNSIGNED_4_BYTE,
0802 .elem_len = 1,
0803 .elem_size = sizeof(u32),
0804 .array_type = NO_ARRAY,
0805 .tlv_type = 0x11,
0806 .offset = offsetof(struct qmi_wlanfw_device_info_resp_msg_v01,
0807 bar_size),
0808 },
0809 {
0810 .data_type = QMI_EOTI,
0811 .array_type = NO_ARRAY,
0812 .tlv_type = QMI_COMMON_TLV_TYPE,
0813 },
0814 };
0815
0816 static struct qmi_elem_info qmi_wlanfw_rf_chip_info_s_v01_ei[] = {
0817 {
0818 .data_type = QMI_UNSIGNED_4_BYTE,
0819 .elem_len = 1,
0820 .elem_size = sizeof(u32),
0821 .array_type = NO_ARRAY,
0822 .tlv_type = 0,
0823 .offset = offsetof(struct qmi_wlanfw_rf_chip_info_s_v01,
0824 chip_id),
0825 },
0826 {
0827 .data_type = QMI_UNSIGNED_4_BYTE,
0828 .elem_len = 1,
0829 .elem_size = sizeof(u32),
0830 .array_type = NO_ARRAY,
0831 .tlv_type = 0,
0832 .offset = offsetof(struct qmi_wlanfw_rf_chip_info_s_v01,
0833 chip_family),
0834 },
0835 {
0836 .data_type = QMI_EOTI,
0837 .array_type = NO_ARRAY,
0838 .tlv_type = QMI_COMMON_TLV_TYPE,
0839 },
0840 };
0841
0842 static struct qmi_elem_info qmi_wlanfw_rf_board_info_s_v01_ei[] = {
0843 {
0844 .data_type = QMI_UNSIGNED_4_BYTE,
0845 .elem_len = 1,
0846 .elem_size = sizeof(u32),
0847 .array_type = NO_ARRAY,
0848 .tlv_type = 0,
0849 .offset = offsetof(struct qmi_wlanfw_rf_board_info_s_v01,
0850 board_id),
0851 },
0852 {
0853 .data_type = QMI_EOTI,
0854 .array_type = NO_ARRAY,
0855 .tlv_type = QMI_COMMON_TLV_TYPE,
0856 },
0857 };
0858
0859 static struct qmi_elem_info qmi_wlanfw_soc_info_s_v01_ei[] = {
0860 {
0861 .data_type = QMI_UNSIGNED_4_BYTE,
0862 .elem_len = 1,
0863 .elem_size = sizeof(u32),
0864 .array_type = NO_ARRAY,
0865 .tlv_type = 0,
0866 .offset = offsetof(struct qmi_wlanfw_soc_info_s_v01, soc_id),
0867 },
0868 {
0869 .data_type = QMI_EOTI,
0870 .array_type = NO_ARRAY,
0871 .tlv_type = QMI_COMMON_TLV_TYPE,
0872 },
0873 };
0874
0875 static struct qmi_elem_info qmi_wlanfw_fw_version_info_s_v01_ei[] = {
0876 {
0877 .data_type = QMI_UNSIGNED_4_BYTE,
0878 .elem_len = 1,
0879 .elem_size = sizeof(u32),
0880 .array_type = NO_ARRAY,
0881 .tlv_type = 0,
0882 .offset = offsetof(struct qmi_wlanfw_fw_version_info_s_v01,
0883 fw_version),
0884 },
0885 {
0886 .data_type = QMI_STRING,
0887 .elem_len = ATH11K_QMI_WLANFW_MAX_TIMESTAMP_LEN_V01 + 1,
0888 .elem_size = sizeof(char),
0889 .array_type = NO_ARRAY,
0890 .tlv_type = 0,
0891 .offset = offsetof(struct qmi_wlanfw_fw_version_info_s_v01,
0892 fw_build_timestamp),
0893 },
0894 {
0895 .data_type = QMI_EOTI,
0896 .array_type = NO_ARRAY,
0897 .tlv_type = QMI_COMMON_TLV_TYPE,
0898 },
0899 };
0900
0901 static struct qmi_elem_info qmi_wlanfw_cap_resp_msg_v01_ei[] = {
0902 {
0903 .data_type = QMI_STRUCT,
0904 .elem_len = 1,
0905 .elem_size = sizeof(struct qmi_response_type_v01),
0906 .array_type = NO_ARRAY,
0907 .tlv_type = 0x02,
0908 .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01, resp),
0909 .ei_array = qmi_response_type_v01_ei,
0910 },
0911 {
0912 .data_type = QMI_OPT_FLAG,
0913 .elem_len = 1,
0914 .elem_size = sizeof(u8),
0915 .array_type = NO_ARRAY,
0916 .tlv_type = 0x10,
0917 .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01,
0918 chip_info_valid),
0919 },
0920 {
0921 .data_type = QMI_STRUCT,
0922 .elem_len = 1,
0923 .elem_size = sizeof(struct qmi_wlanfw_rf_chip_info_s_v01),
0924 .array_type = NO_ARRAY,
0925 .tlv_type = 0x10,
0926 .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01,
0927 chip_info),
0928 .ei_array = qmi_wlanfw_rf_chip_info_s_v01_ei,
0929 },
0930 {
0931 .data_type = QMI_OPT_FLAG,
0932 .elem_len = 1,
0933 .elem_size = sizeof(u8),
0934 .array_type = NO_ARRAY,
0935 .tlv_type = 0x11,
0936 .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01,
0937 board_info_valid),
0938 },
0939 {
0940 .data_type = QMI_STRUCT,
0941 .elem_len = 1,
0942 .elem_size = sizeof(struct qmi_wlanfw_rf_board_info_s_v01),
0943 .array_type = NO_ARRAY,
0944 .tlv_type = 0x11,
0945 .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01,
0946 board_info),
0947 .ei_array = qmi_wlanfw_rf_board_info_s_v01_ei,
0948 },
0949 {
0950 .data_type = QMI_OPT_FLAG,
0951 .elem_len = 1,
0952 .elem_size = sizeof(u8),
0953 .array_type = NO_ARRAY,
0954 .tlv_type = 0x12,
0955 .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01,
0956 soc_info_valid),
0957 },
0958 {
0959 .data_type = QMI_STRUCT,
0960 .elem_len = 1,
0961 .elem_size = sizeof(struct qmi_wlanfw_soc_info_s_v01),
0962 .array_type = NO_ARRAY,
0963 .tlv_type = 0x12,
0964 .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01,
0965 soc_info),
0966 .ei_array = qmi_wlanfw_soc_info_s_v01_ei,
0967 },
0968 {
0969 .data_type = QMI_OPT_FLAG,
0970 .elem_len = 1,
0971 .elem_size = sizeof(u8),
0972 .array_type = NO_ARRAY,
0973 .tlv_type = 0x13,
0974 .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01,
0975 fw_version_info_valid),
0976 },
0977 {
0978 .data_type = QMI_STRUCT,
0979 .elem_len = 1,
0980 .elem_size = sizeof(struct qmi_wlanfw_fw_version_info_s_v01),
0981 .array_type = NO_ARRAY,
0982 .tlv_type = 0x13,
0983 .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01,
0984 fw_version_info),
0985 .ei_array = qmi_wlanfw_fw_version_info_s_v01_ei,
0986 },
0987 {
0988 .data_type = QMI_OPT_FLAG,
0989 .elem_len = 1,
0990 .elem_size = sizeof(u8),
0991 .array_type = NO_ARRAY,
0992 .tlv_type = 0x14,
0993 .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01,
0994 fw_build_id_valid),
0995 },
0996 {
0997 .data_type = QMI_STRING,
0998 .elem_len = ATH11K_QMI_WLANFW_MAX_BUILD_ID_LEN_V01 + 1,
0999 .elem_size = sizeof(char),
1000 .array_type = NO_ARRAY,
1001 .tlv_type = 0x14,
1002 .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01,
1003 fw_build_id),
1004 },
1005 {
1006 .data_type = QMI_OPT_FLAG,
1007 .elem_len = 1,
1008 .elem_size = sizeof(u8),
1009 .array_type = NO_ARRAY,
1010 .tlv_type = 0x15,
1011 .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01,
1012 num_macs_valid),
1013 },
1014 {
1015 .data_type = QMI_UNSIGNED_1_BYTE,
1016 .elem_len = 1,
1017 .elem_size = sizeof(u8),
1018 .array_type = NO_ARRAY,
1019 .tlv_type = 0x15,
1020 .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01,
1021 num_macs),
1022 },
1023 {
1024 .data_type = QMI_OPT_FLAG,
1025 .elem_len = 1,
1026 .elem_size = sizeof(u8),
1027 .array_type = NO_ARRAY,
1028 .tlv_type = 0x16,
1029 .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01,
1030 voltage_mv_valid),
1031 },
1032 {
1033 .data_type = QMI_UNSIGNED_4_BYTE,
1034 .elem_len = 1,
1035 .elem_size = sizeof(u32),
1036 .array_type = NO_ARRAY,
1037 .tlv_type = 0x16,
1038 .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01,
1039 voltage_mv),
1040 },
1041 {
1042 .data_type = QMI_OPT_FLAG,
1043 .elem_len = 1,
1044 .elem_size = sizeof(u8),
1045 .array_type = NO_ARRAY,
1046 .tlv_type = 0x17,
1047 .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01,
1048 time_freq_hz_valid),
1049 },
1050 {
1051 .data_type = QMI_UNSIGNED_4_BYTE,
1052 .elem_len = 1,
1053 .elem_size = sizeof(u32),
1054 .array_type = NO_ARRAY,
1055 .tlv_type = 0x17,
1056 .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01,
1057 time_freq_hz),
1058 },
1059 {
1060 .data_type = QMI_OPT_FLAG,
1061 .elem_len = 1,
1062 .elem_size = sizeof(u8),
1063 .array_type = NO_ARRAY,
1064 .tlv_type = 0x18,
1065 .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01,
1066 otp_version_valid),
1067 },
1068 {
1069 .data_type = QMI_UNSIGNED_4_BYTE,
1070 .elem_len = 1,
1071 .elem_size = sizeof(u32),
1072 .array_type = NO_ARRAY,
1073 .tlv_type = 0x18,
1074 .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01,
1075 otp_version),
1076 },
1077 {
1078 .data_type = QMI_OPT_FLAG,
1079 .elem_len = 1,
1080 .elem_size = sizeof(u8),
1081 .array_type = NO_ARRAY,
1082 .tlv_type = 0x19,
1083 .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01,
1084 eeprom_read_timeout_valid),
1085 },
1086 {
1087 .data_type = QMI_UNSIGNED_4_BYTE,
1088 .elem_len = 1,
1089 .elem_size = sizeof(u32),
1090 .array_type = NO_ARRAY,
1091 .tlv_type = 0x19,
1092 .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01,
1093 eeprom_read_timeout),
1094 },
1095 {
1096 .data_type = QMI_EOTI,
1097 .array_type = NO_ARRAY,
1098 .tlv_type = QMI_COMMON_TLV_TYPE,
1099 },
1100 };
1101
1102 static struct qmi_elem_info qmi_wlanfw_bdf_download_req_msg_v01_ei[] = {
1103 {
1104 .data_type = QMI_UNSIGNED_1_BYTE,
1105 .elem_len = 1,
1106 .elem_size = sizeof(u8),
1107 .array_type = NO_ARRAY,
1108 .tlv_type = 0x01,
1109 .offset = offsetof(struct qmi_wlanfw_bdf_download_req_msg_v01,
1110 valid),
1111 },
1112 {
1113 .data_type = QMI_OPT_FLAG,
1114 .elem_len = 1,
1115 .elem_size = sizeof(u8),
1116 .array_type = NO_ARRAY,
1117 .tlv_type = 0x10,
1118 .offset = offsetof(struct qmi_wlanfw_bdf_download_req_msg_v01,
1119 file_id_valid),
1120 },
1121 {
1122 .data_type = QMI_SIGNED_4_BYTE_ENUM,
1123 .elem_len = 1,
1124 .elem_size = sizeof(enum qmi_wlanfw_cal_temp_id_enum_v01),
1125 .array_type = NO_ARRAY,
1126 .tlv_type = 0x10,
1127 .offset = offsetof(struct qmi_wlanfw_bdf_download_req_msg_v01,
1128 file_id),
1129 },
1130 {
1131 .data_type = QMI_OPT_FLAG,
1132 .elem_len = 1,
1133 .elem_size = sizeof(u8),
1134 .array_type = NO_ARRAY,
1135 .tlv_type = 0x11,
1136 .offset = offsetof(struct qmi_wlanfw_bdf_download_req_msg_v01,
1137 total_size_valid),
1138 },
1139 {
1140 .data_type = QMI_UNSIGNED_4_BYTE,
1141 .elem_len = 1,
1142 .elem_size = sizeof(u32),
1143 .array_type = NO_ARRAY,
1144 .tlv_type = 0x11,
1145 .offset = offsetof(struct qmi_wlanfw_bdf_download_req_msg_v01,
1146 total_size),
1147 },
1148 {
1149 .data_type = QMI_OPT_FLAG,
1150 .elem_len = 1,
1151 .elem_size = sizeof(u8),
1152 .array_type = NO_ARRAY,
1153 .tlv_type = 0x12,
1154 .offset = offsetof(struct qmi_wlanfw_bdf_download_req_msg_v01,
1155 seg_id_valid),
1156 },
1157 {
1158 .data_type = QMI_UNSIGNED_4_BYTE,
1159 .elem_len = 1,
1160 .elem_size = sizeof(u32),
1161 .array_type = NO_ARRAY,
1162 .tlv_type = 0x12,
1163 .offset = offsetof(struct qmi_wlanfw_bdf_download_req_msg_v01,
1164 seg_id),
1165 },
1166 {
1167 .data_type = QMI_OPT_FLAG,
1168 .elem_len = 1,
1169 .elem_size = sizeof(u8),
1170 .array_type = NO_ARRAY,
1171 .tlv_type = 0x13,
1172 .offset = offsetof(struct qmi_wlanfw_bdf_download_req_msg_v01,
1173 data_valid),
1174 },
1175 {
1176 .data_type = QMI_DATA_LEN,
1177 .elem_len = 1,
1178 .elem_size = sizeof(u16),
1179 .array_type = NO_ARRAY,
1180 .tlv_type = 0x13,
1181 .offset = offsetof(struct qmi_wlanfw_bdf_download_req_msg_v01,
1182 data_len),
1183 },
1184 {
1185 .data_type = QMI_UNSIGNED_1_BYTE,
1186 .elem_len = QMI_WLANFW_MAX_DATA_SIZE_V01,
1187 .elem_size = sizeof(u8),
1188 .array_type = VAR_LEN_ARRAY,
1189 .tlv_type = 0x13,
1190 .offset = offsetof(struct qmi_wlanfw_bdf_download_req_msg_v01,
1191 data),
1192 },
1193 {
1194 .data_type = QMI_OPT_FLAG,
1195 .elem_len = 1,
1196 .elem_size = sizeof(u8),
1197 .array_type = NO_ARRAY,
1198 .tlv_type = 0x14,
1199 .offset = offsetof(struct qmi_wlanfw_bdf_download_req_msg_v01,
1200 end_valid),
1201 },
1202 {
1203 .data_type = QMI_UNSIGNED_1_BYTE,
1204 .elem_len = 1,
1205 .elem_size = sizeof(u8),
1206 .array_type = NO_ARRAY,
1207 .tlv_type = 0x14,
1208 .offset = offsetof(struct qmi_wlanfw_bdf_download_req_msg_v01,
1209 end),
1210 },
1211 {
1212 .data_type = QMI_OPT_FLAG,
1213 .elem_len = 1,
1214 .elem_size = sizeof(u8),
1215 .array_type = NO_ARRAY,
1216 .tlv_type = 0x15,
1217 .offset = offsetof(struct qmi_wlanfw_bdf_download_req_msg_v01,
1218 bdf_type_valid),
1219 },
1220 {
1221 .data_type = QMI_UNSIGNED_1_BYTE,
1222 .elem_len = 1,
1223 .elem_size = sizeof(u8),
1224 .array_type = NO_ARRAY,
1225 .tlv_type = 0x15,
1226 .offset = offsetof(struct qmi_wlanfw_bdf_download_req_msg_v01,
1227 bdf_type),
1228 },
1229
1230 {
1231 .data_type = QMI_EOTI,
1232 .array_type = NO_ARRAY,
1233 .tlv_type = QMI_COMMON_TLV_TYPE,
1234 },
1235 };
1236
1237 static struct qmi_elem_info qmi_wlanfw_bdf_download_resp_msg_v01_ei[] = {
1238 {
1239 .data_type = QMI_STRUCT,
1240 .elem_len = 1,
1241 .elem_size = sizeof(struct qmi_response_type_v01),
1242 .array_type = NO_ARRAY,
1243 .tlv_type = 0x02,
1244 .offset = offsetof(struct qmi_wlanfw_bdf_download_resp_msg_v01,
1245 resp),
1246 .ei_array = qmi_response_type_v01_ei,
1247 },
1248 {
1249 .data_type = QMI_EOTI,
1250 .array_type = NO_ARRAY,
1251 .tlv_type = QMI_COMMON_TLV_TYPE,
1252 },
1253 };
1254
1255 static struct qmi_elem_info qmi_wlanfw_m3_info_req_msg_v01_ei[] = {
1256 {
1257 .data_type = QMI_UNSIGNED_8_BYTE,
1258 .elem_len = 1,
1259 .elem_size = sizeof(u64),
1260 .array_type = NO_ARRAY,
1261 .tlv_type = 0x01,
1262 .offset = offsetof(struct qmi_wlanfw_m3_info_req_msg_v01, addr),
1263 },
1264 {
1265 .data_type = QMI_UNSIGNED_4_BYTE,
1266 .elem_len = 1,
1267 .elem_size = sizeof(u32),
1268 .array_type = NO_ARRAY,
1269 .tlv_type = 0x02,
1270 .offset = offsetof(struct qmi_wlanfw_m3_info_req_msg_v01, size),
1271 },
1272 {
1273 .data_type = QMI_EOTI,
1274 .array_type = NO_ARRAY,
1275 .tlv_type = QMI_COMMON_TLV_TYPE,
1276 },
1277 };
1278
1279 static struct qmi_elem_info qmi_wlanfw_m3_info_resp_msg_v01_ei[] = {
1280 {
1281 .data_type = QMI_STRUCT,
1282 .elem_len = 1,
1283 .elem_size = sizeof(struct qmi_response_type_v01),
1284 .array_type = NO_ARRAY,
1285 .tlv_type = 0x02,
1286 .offset = offsetof(struct qmi_wlanfw_m3_info_resp_msg_v01, resp),
1287 .ei_array = qmi_response_type_v01_ei,
1288 },
1289 {
1290 .data_type = QMI_EOTI,
1291 .array_type = NO_ARRAY,
1292 .tlv_type = QMI_COMMON_TLV_TYPE,
1293 },
1294 };
1295
1296 static struct qmi_elem_info qmi_wlanfw_ce_tgt_pipe_cfg_s_v01_ei[] = {
1297 {
1298 .data_type = QMI_UNSIGNED_4_BYTE,
1299 .elem_len = 1,
1300 .elem_size = sizeof(u32),
1301 .array_type = NO_ARRAY,
1302 .tlv_type = 0,
1303 .offset = offsetof(struct qmi_wlanfw_ce_tgt_pipe_cfg_s_v01,
1304 pipe_num),
1305 },
1306 {
1307 .data_type = QMI_SIGNED_4_BYTE_ENUM,
1308 .elem_len = 1,
1309 .elem_size = sizeof(enum qmi_wlanfw_pipedir_enum_v01),
1310 .array_type = NO_ARRAY,
1311 .tlv_type = 0,
1312 .offset = offsetof(struct qmi_wlanfw_ce_tgt_pipe_cfg_s_v01,
1313 pipe_dir),
1314 },
1315 {
1316 .data_type = QMI_UNSIGNED_4_BYTE,
1317 .elem_len = 1,
1318 .elem_size = sizeof(u32),
1319 .array_type = NO_ARRAY,
1320 .tlv_type = 0,
1321 .offset = offsetof(struct qmi_wlanfw_ce_tgt_pipe_cfg_s_v01,
1322 nentries),
1323 },
1324 {
1325 .data_type = QMI_UNSIGNED_4_BYTE,
1326 .elem_len = 1,
1327 .elem_size = sizeof(u32),
1328 .array_type = NO_ARRAY,
1329 .tlv_type = 0,
1330 .offset = offsetof(struct qmi_wlanfw_ce_tgt_pipe_cfg_s_v01,
1331 nbytes_max),
1332 },
1333 {
1334 .data_type = QMI_UNSIGNED_4_BYTE,
1335 .elem_len = 1,
1336 .elem_size = sizeof(u32),
1337 .array_type = NO_ARRAY,
1338 .tlv_type = 0,
1339 .offset = offsetof(struct qmi_wlanfw_ce_tgt_pipe_cfg_s_v01,
1340 flags),
1341 },
1342 {
1343 .data_type = QMI_EOTI,
1344 .array_type = NO_ARRAY,
1345 .tlv_type = QMI_COMMON_TLV_TYPE,
1346 },
1347 };
1348
1349 static struct qmi_elem_info qmi_wlanfw_ce_svc_pipe_cfg_s_v01_ei[] = {
1350 {
1351 .data_type = QMI_UNSIGNED_4_BYTE,
1352 .elem_len = 1,
1353 .elem_size = sizeof(u32),
1354 .array_type = NO_ARRAY,
1355 .tlv_type = 0,
1356 .offset = offsetof(struct qmi_wlanfw_ce_svc_pipe_cfg_s_v01,
1357 service_id),
1358 },
1359 {
1360 .data_type = QMI_SIGNED_4_BYTE_ENUM,
1361 .elem_len = 1,
1362 .elem_size = sizeof(enum qmi_wlanfw_pipedir_enum_v01),
1363 .array_type = NO_ARRAY,
1364 .tlv_type = 0,
1365 .offset = offsetof(struct qmi_wlanfw_ce_svc_pipe_cfg_s_v01,
1366 pipe_dir),
1367 },
1368 {
1369 .data_type = QMI_UNSIGNED_4_BYTE,
1370 .elem_len = 1,
1371 .elem_size = sizeof(u32),
1372 .array_type = NO_ARRAY,
1373 .tlv_type = 0,
1374 .offset = offsetof(struct qmi_wlanfw_ce_svc_pipe_cfg_s_v01,
1375 pipe_num),
1376 },
1377 {
1378 .data_type = QMI_EOTI,
1379 .array_type = NO_ARRAY,
1380 .tlv_type = QMI_COMMON_TLV_TYPE,
1381 },
1382 };
1383
1384 static struct qmi_elem_info qmi_wlanfw_shadow_reg_cfg_s_v01_ei[] = {
1385 {
1386 .data_type = QMI_UNSIGNED_2_BYTE,
1387 .elem_len = 1,
1388 .elem_size = sizeof(u16),
1389 .array_type = NO_ARRAY,
1390 .tlv_type = 0,
1391 .offset = offsetof(struct qmi_wlanfw_shadow_reg_cfg_s_v01, id),
1392 },
1393 {
1394 .data_type = QMI_UNSIGNED_2_BYTE,
1395 .elem_len = 1,
1396 .elem_size = sizeof(u16),
1397 .array_type = NO_ARRAY,
1398 .tlv_type = 0,
1399 .offset = offsetof(struct qmi_wlanfw_shadow_reg_cfg_s_v01,
1400 offset),
1401 },
1402 {
1403 .data_type = QMI_EOTI,
1404 .array_type = QMI_COMMON_TLV_TYPE,
1405 },
1406 };
1407
1408 static struct qmi_elem_info qmi_wlanfw_shadow_reg_v2_cfg_s_v01_ei[] = {
1409 {
1410 .data_type = QMI_UNSIGNED_4_BYTE,
1411 .elem_len = 1,
1412 .elem_size = sizeof(u32),
1413 .array_type = NO_ARRAY,
1414 .tlv_type = 0,
1415 .offset = offsetof(struct qmi_wlanfw_shadow_reg_v2_cfg_s_v01,
1416 addr),
1417 },
1418 {
1419 .data_type = QMI_EOTI,
1420 .array_type = NO_ARRAY,
1421 .tlv_type = QMI_COMMON_TLV_TYPE,
1422 },
1423 };
1424
1425 static struct qmi_elem_info qmi_wlanfw_wlan_mode_req_msg_v01_ei[] = {
1426 {
1427 .data_type = QMI_UNSIGNED_4_BYTE,
1428 .elem_len = 1,
1429 .elem_size = sizeof(u32),
1430 .array_type = NO_ARRAY,
1431 .tlv_type = 0x01,
1432 .offset = offsetof(struct qmi_wlanfw_wlan_mode_req_msg_v01,
1433 mode),
1434 },
1435 {
1436 .data_type = QMI_OPT_FLAG,
1437 .elem_len = 1,
1438 .elem_size = sizeof(u8),
1439 .array_type = NO_ARRAY,
1440 .tlv_type = 0x10,
1441 .offset = offsetof(struct qmi_wlanfw_wlan_mode_req_msg_v01,
1442 hw_debug_valid),
1443 },
1444 {
1445 .data_type = QMI_UNSIGNED_1_BYTE,
1446 .elem_len = 1,
1447 .elem_size = sizeof(u8),
1448 .array_type = NO_ARRAY,
1449 .tlv_type = 0x10,
1450 .offset = offsetof(struct qmi_wlanfw_wlan_mode_req_msg_v01,
1451 hw_debug),
1452 },
1453 {
1454 .data_type = QMI_EOTI,
1455 .array_type = NO_ARRAY,
1456 .tlv_type = QMI_COMMON_TLV_TYPE,
1457 },
1458 };
1459
1460 static struct qmi_elem_info qmi_wlanfw_wlan_mode_resp_msg_v01_ei[] = {
1461 {
1462 .data_type = QMI_STRUCT,
1463 .elem_len = 1,
1464 .elem_size = sizeof(struct qmi_response_type_v01),
1465 .array_type = NO_ARRAY,
1466 .tlv_type = 0x02,
1467 .offset = offsetof(struct qmi_wlanfw_wlan_mode_resp_msg_v01,
1468 resp),
1469 .ei_array = qmi_response_type_v01_ei,
1470 },
1471 {
1472 .data_type = QMI_EOTI,
1473 .array_type = NO_ARRAY,
1474 .tlv_type = QMI_COMMON_TLV_TYPE,
1475 },
1476 };
1477
1478 static struct qmi_elem_info qmi_wlanfw_wlan_cfg_req_msg_v01_ei[] = {
1479 {
1480 .data_type = QMI_OPT_FLAG,
1481 .elem_len = 1,
1482 .elem_size = sizeof(u8),
1483 .array_type = NO_ARRAY,
1484 .tlv_type = 0x10,
1485 .offset = offsetof(struct qmi_wlanfw_wlan_cfg_req_msg_v01,
1486 host_version_valid),
1487 },
1488 {
1489 .data_type = QMI_STRING,
1490 .elem_len = QMI_WLANFW_MAX_STR_LEN_V01 + 1,
1491 .elem_size = sizeof(char),
1492 .array_type = NO_ARRAY,
1493 .tlv_type = 0x10,
1494 .offset = offsetof(struct qmi_wlanfw_wlan_cfg_req_msg_v01,
1495 host_version),
1496 },
1497 {
1498 .data_type = QMI_OPT_FLAG,
1499 .elem_len = 1,
1500 .elem_size = sizeof(u8),
1501 .array_type = NO_ARRAY,
1502 .tlv_type = 0x11,
1503 .offset = offsetof(struct qmi_wlanfw_wlan_cfg_req_msg_v01,
1504 tgt_cfg_valid),
1505 },
1506 {
1507 .data_type = QMI_DATA_LEN,
1508 .elem_len = 1,
1509 .elem_size = sizeof(u8),
1510 .array_type = NO_ARRAY,
1511 .tlv_type = 0x11,
1512 .offset = offsetof(struct qmi_wlanfw_wlan_cfg_req_msg_v01,
1513 tgt_cfg_len),
1514 },
1515 {
1516 .data_type = QMI_STRUCT,
1517 .elem_len = QMI_WLANFW_MAX_NUM_CE_V01,
1518 .elem_size = sizeof(
1519 struct qmi_wlanfw_ce_tgt_pipe_cfg_s_v01),
1520 .array_type = VAR_LEN_ARRAY,
1521 .tlv_type = 0x11,
1522 .offset = offsetof(struct qmi_wlanfw_wlan_cfg_req_msg_v01,
1523 tgt_cfg),
1524 .ei_array = qmi_wlanfw_ce_tgt_pipe_cfg_s_v01_ei,
1525 },
1526 {
1527 .data_type = QMI_OPT_FLAG,
1528 .elem_len = 1,
1529 .elem_size = sizeof(u8),
1530 .array_type = NO_ARRAY,
1531 .tlv_type = 0x12,
1532 .offset = offsetof(struct qmi_wlanfw_wlan_cfg_req_msg_v01,
1533 svc_cfg_valid),
1534 },
1535 {
1536 .data_type = QMI_DATA_LEN,
1537 .elem_len = 1,
1538 .elem_size = sizeof(u8),
1539 .array_type = NO_ARRAY,
1540 .tlv_type = 0x12,
1541 .offset = offsetof(struct qmi_wlanfw_wlan_cfg_req_msg_v01,
1542 svc_cfg_len),
1543 },
1544 {
1545 .data_type = QMI_STRUCT,
1546 .elem_len = QMI_WLANFW_MAX_NUM_SVC_V01,
1547 .elem_size = sizeof(struct qmi_wlanfw_ce_svc_pipe_cfg_s_v01),
1548 .array_type = VAR_LEN_ARRAY,
1549 .tlv_type = 0x12,
1550 .offset = offsetof(struct qmi_wlanfw_wlan_cfg_req_msg_v01,
1551 svc_cfg),
1552 .ei_array = qmi_wlanfw_ce_svc_pipe_cfg_s_v01_ei,
1553 },
1554 {
1555 .data_type = QMI_OPT_FLAG,
1556 .elem_len = 1,
1557 .elem_size = sizeof(u8),
1558 .array_type = NO_ARRAY,
1559 .tlv_type = 0x13,
1560 .offset = offsetof(struct qmi_wlanfw_wlan_cfg_req_msg_v01,
1561 shadow_reg_valid),
1562 },
1563 {
1564 .data_type = QMI_DATA_LEN,
1565 .elem_len = 1,
1566 .elem_size = sizeof(u8),
1567 .array_type = NO_ARRAY,
1568 .tlv_type = 0x13,
1569 .offset = offsetof(struct qmi_wlanfw_wlan_cfg_req_msg_v01,
1570 shadow_reg_len),
1571 },
1572 {
1573 .data_type = QMI_STRUCT,
1574 .elem_len = QMI_WLANFW_MAX_NUM_SHADOW_REG_V01,
1575 .elem_size = sizeof(struct qmi_wlanfw_shadow_reg_cfg_s_v01),
1576 .array_type = VAR_LEN_ARRAY,
1577 .tlv_type = 0x13,
1578 .offset = offsetof(struct qmi_wlanfw_wlan_cfg_req_msg_v01,
1579 shadow_reg),
1580 .ei_array = qmi_wlanfw_shadow_reg_cfg_s_v01_ei,
1581 },
1582 {
1583 .data_type = QMI_OPT_FLAG,
1584 .elem_len = 1,
1585 .elem_size = sizeof(u8),
1586 .array_type = NO_ARRAY,
1587 .tlv_type = 0x14,
1588 .offset = offsetof(struct qmi_wlanfw_wlan_cfg_req_msg_v01,
1589 shadow_reg_v2_valid),
1590 },
1591 {
1592 .data_type = QMI_DATA_LEN,
1593 .elem_len = 1,
1594 .elem_size = sizeof(u8),
1595 .array_type = NO_ARRAY,
1596 .tlv_type = 0x14,
1597 .offset = offsetof(struct qmi_wlanfw_wlan_cfg_req_msg_v01,
1598 shadow_reg_v2_len),
1599 },
1600 {
1601 .data_type = QMI_STRUCT,
1602 .elem_len = QMI_WLANFW_MAX_NUM_SHADOW_REG_V2_V01,
1603 .elem_size = sizeof(struct qmi_wlanfw_shadow_reg_v2_cfg_s_v01),
1604 .array_type = VAR_LEN_ARRAY,
1605 .tlv_type = 0x14,
1606 .offset = offsetof(struct qmi_wlanfw_wlan_cfg_req_msg_v01,
1607 shadow_reg_v2),
1608 .ei_array = qmi_wlanfw_shadow_reg_v2_cfg_s_v01_ei,
1609 },
1610 {
1611 .data_type = QMI_EOTI,
1612 .array_type = NO_ARRAY,
1613 .tlv_type = QMI_COMMON_TLV_TYPE,
1614 },
1615 };
1616
1617 static struct qmi_elem_info qmi_wlanfw_wlan_cfg_resp_msg_v01_ei[] = {
1618 {
1619 .data_type = QMI_STRUCT,
1620 .elem_len = 1,
1621 .elem_size = sizeof(struct qmi_response_type_v01),
1622 .array_type = NO_ARRAY,
1623 .tlv_type = 0x02,
1624 .offset = offsetof(struct qmi_wlanfw_wlan_cfg_resp_msg_v01, resp),
1625 .ei_array = qmi_response_type_v01_ei,
1626 },
1627 {
1628 .data_type = QMI_EOTI,
1629 .array_type = NO_ARRAY,
1630 .tlv_type = QMI_COMMON_TLV_TYPE,
1631 },
1632 };
1633
1634 static struct qmi_elem_info qmi_wlanfw_mem_ready_ind_msg_v01_ei[] = {
1635 {
1636 .data_type = QMI_EOTI,
1637 .array_type = NO_ARRAY,
1638 },
1639 };
1640
1641 static struct qmi_elem_info qmi_wlanfw_fw_ready_ind_msg_v01_ei[] = {
1642 {
1643 .data_type = QMI_EOTI,
1644 .array_type = NO_ARRAY,
1645 },
1646 };
1647
1648 static struct qmi_elem_info qmi_wlanfw_cold_boot_cal_done_ind_msg_v01_ei[] = {
1649 {
1650 .data_type = QMI_EOTI,
1651 .array_type = NO_ARRAY,
1652 },
1653 };
1654
1655 static struct qmi_elem_info qmi_wlanfw_wlan_ini_req_msg_v01_ei[] = {
1656 {
1657 .data_type = QMI_OPT_FLAG,
1658 .elem_len = 1,
1659 .elem_size = sizeof(u8),
1660 .array_type = NO_ARRAY,
1661 .tlv_type = 0x10,
1662 .offset = offsetof(struct qmi_wlanfw_wlan_ini_req_msg_v01,
1663 enablefwlog_valid),
1664 },
1665 {
1666 .data_type = QMI_UNSIGNED_1_BYTE,
1667 .elem_len = 1,
1668 .elem_size = sizeof(u8),
1669 .array_type = NO_ARRAY,
1670 .tlv_type = 0x10,
1671 .offset = offsetof(struct qmi_wlanfw_wlan_ini_req_msg_v01,
1672 enablefwlog),
1673 },
1674 {
1675 .data_type = QMI_EOTI,
1676 .array_type = NO_ARRAY,
1677 .tlv_type = QMI_COMMON_TLV_TYPE,
1678 },
1679 };
1680
1681 static struct qmi_elem_info qmi_wlanfw_wlan_ini_resp_msg_v01_ei[] = {
1682 {
1683 .data_type = QMI_STRUCT,
1684 .elem_len = 1,
1685 .elem_size = sizeof(struct qmi_response_type_v01),
1686 .array_type = NO_ARRAY,
1687 .tlv_type = 0x02,
1688 .offset = offsetof(struct qmi_wlanfw_wlan_ini_resp_msg_v01,
1689 resp),
1690 .ei_array = qmi_response_type_v01_ei,
1691 },
1692 {
1693 .data_type = QMI_EOTI,
1694 .array_type = NO_ARRAY,
1695 .tlv_type = QMI_COMMON_TLV_TYPE,
1696 },
1697 };
1698
1699 static int ath11k_qmi_host_cap_send(struct ath11k_base *ab)
1700 {
1701 struct qmi_wlanfw_host_cap_req_msg_v01 req;
1702 struct qmi_wlanfw_host_cap_resp_msg_v01 resp;
1703 struct qmi_txn txn;
1704 int ret = 0;
1705
1706 memset(&req, 0, sizeof(req));
1707 memset(&resp, 0, sizeof(resp));
1708
1709 req.num_clients_valid = 1;
1710 req.num_clients = 1;
1711 req.mem_cfg_mode = ab->qmi.target_mem_mode;
1712 req.mem_cfg_mode_valid = 1;
1713 req.bdf_support_valid = 1;
1714 req.bdf_support = 1;
1715
1716 if (ab->hw_params.m3_fw_support) {
1717 req.m3_support_valid = 1;
1718 req.m3_support = 1;
1719 req.m3_cache_support_valid = 1;
1720 req.m3_cache_support = 1;
1721 } else {
1722 req.m3_support_valid = 0;
1723 req.m3_support = 0;
1724 req.m3_cache_support_valid = 0;
1725 req.m3_cache_support = 0;
1726 }
1727
1728 req.cal_done_valid = 1;
1729 req.cal_done = ab->qmi.cal_done;
1730
1731 if (ab->hw_params.internal_sleep_clock) {
1732 req.nm_modem_valid = 1;
1733
1734
1735 req.nm_modem |= HOST_CSTATE_BIT;
1736
1737
1738
1739
1740
1741
1742 req.nm_modem |= SLEEP_CLOCK_SELECT_INTERNAL_BIT;
1743 }
1744
1745 if (ab->hw_params.global_reset)
1746 req.nm_modem |= PLATFORM_CAP_PCIE_GLOBAL_RESET;
1747
1748 ath11k_dbg(ab, ATH11K_DBG_QMI, "qmi host cap request\n");
1749
1750 ret = qmi_txn_init(&ab->qmi.handle, &txn,
1751 qmi_wlanfw_host_cap_resp_msg_v01_ei, &resp);
1752 if (ret < 0)
1753 goto out;
1754
1755 ret = qmi_send_request(&ab->qmi.handle, NULL, &txn,
1756 QMI_WLANFW_HOST_CAP_REQ_V01,
1757 QMI_WLANFW_HOST_CAP_REQ_MSG_V01_MAX_LEN,
1758 qmi_wlanfw_host_cap_req_msg_v01_ei, &req);
1759 if (ret < 0) {
1760 qmi_txn_cancel(&txn);
1761 ath11k_warn(ab, "failed to send host capability request: %d\n", ret);
1762 goto out;
1763 }
1764
1765 ret = qmi_txn_wait(&txn, msecs_to_jiffies(ATH11K_QMI_WLANFW_TIMEOUT_MS));
1766 if (ret < 0)
1767 goto out;
1768
1769 if (resp.resp.result != QMI_RESULT_SUCCESS_V01) {
1770 ath11k_warn(ab, "host capability request failed: %d %d\n",
1771 resp.resp.result, resp.resp.error);
1772 ret = -EINVAL;
1773 goto out;
1774 }
1775
1776 out:
1777 return ret;
1778 }
1779
1780 static int ath11k_qmi_fw_ind_register_send(struct ath11k_base *ab)
1781 {
1782 struct qmi_wlanfw_ind_register_req_msg_v01 *req;
1783 struct qmi_wlanfw_ind_register_resp_msg_v01 *resp;
1784 struct qmi_handle *handle = &ab->qmi.handle;
1785 struct qmi_txn txn;
1786 int ret;
1787
1788 req = kzalloc(sizeof(*req), GFP_KERNEL);
1789 if (!req)
1790 return -ENOMEM;
1791
1792 resp = kzalloc(sizeof(*resp), GFP_KERNEL);
1793 if (!resp) {
1794 ret = -ENOMEM;
1795 goto resp_out;
1796 }
1797
1798 req->client_id_valid = 1;
1799 req->client_id = QMI_WLANFW_CLIENT_ID;
1800 req->fw_ready_enable_valid = 1;
1801 req->fw_ready_enable = 1;
1802 req->cal_done_enable_valid = 1;
1803 req->cal_done_enable = 1;
1804 req->fw_init_done_enable_valid = 1;
1805 req->fw_init_done_enable = 1;
1806
1807 req->pin_connect_result_enable_valid = 0;
1808 req->pin_connect_result_enable = 0;
1809
1810
1811
1812
1813
1814 if (!ab->hw_params.fixed_fw_mem) {
1815 req->request_mem_enable_valid = 1;
1816 req->request_mem_enable = 1;
1817 req->fw_mem_ready_enable_valid = 1;
1818 req->fw_mem_ready_enable = 1;
1819 }
1820
1821 ret = qmi_txn_init(handle, &txn,
1822 qmi_wlanfw_ind_register_resp_msg_v01_ei, resp);
1823 if (ret < 0)
1824 goto out;
1825
1826 ath11k_dbg(ab, ATH11K_DBG_QMI, "qmi indication register request\n");
1827
1828 ret = qmi_send_request(&ab->qmi.handle, NULL, &txn,
1829 QMI_WLANFW_IND_REGISTER_REQ_V01,
1830 QMI_WLANFW_IND_REGISTER_REQ_MSG_V01_MAX_LEN,
1831 qmi_wlanfw_ind_register_req_msg_v01_ei, req);
1832 if (ret < 0) {
1833 qmi_txn_cancel(&txn);
1834 ath11k_warn(ab, "failed to send indication register request: %d\n",
1835 ret);
1836 goto out;
1837 }
1838
1839 ret = qmi_txn_wait(&txn, msecs_to_jiffies(ATH11K_QMI_WLANFW_TIMEOUT_MS));
1840 if (ret < 0) {
1841 ath11k_warn(ab, "failed to register fw indication: %d\n", ret);
1842 goto out;
1843 }
1844
1845 if (resp->resp.result != QMI_RESULT_SUCCESS_V01) {
1846 ath11k_warn(ab, "firmware indication register request failed: %d %d\n",
1847 resp->resp.result, resp->resp.error);
1848 ret = -EINVAL;
1849 goto out;
1850 }
1851
1852 out:
1853 kfree(resp);
1854 resp_out:
1855 kfree(req);
1856 return ret;
1857 }
1858
1859 static int ath11k_qmi_respond_fw_mem_request(struct ath11k_base *ab)
1860 {
1861 struct qmi_wlanfw_respond_mem_req_msg_v01 *req;
1862 struct qmi_wlanfw_respond_mem_resp_msg_v01 resp;
1863 struct qmi_txn txn;
1864 int ret = 0, i;
1865 bool delayed;
1866
1867 req = kzalloc(sizeof(*req), GFP_KERNEL);
1868 if (!req)
1869 return -ENOMEM;
1870
1871 memset(&resp, 0, sizeof(resp));
1872
1873
1874
1875
1876
1877
1878 if (!(ab->hw_params.fixed_mem_region ||
1879 test_bit(ATH11K_FLAG_FIXED_MEM_RGN, &ab->dev_flags)) &&
1880 ab->qmi.target_mem_delayed) {
1881 delayed = true;
1882 ath11k_dbg(ab, ATH11K_DBG_QMI, "qmi delays mem_request %d\n",
1883 ab->qmi.mem_seg_count);
1884 memset(req, 0, sizeof(*req));
1885 } else {
1886 delayed = false;
1887 req->mem_seg_len = ab->qmi.mem_seg_count;
1888
1889 for (i = 0; i < req->mem_seg_len ; i++) {
1890 req->mem_seg[i].addr = ab->qmi.target_mem[i].paddr;
1891 req->mem_seg[i].size = ab->qmi.target_mem[i].size;
1892 req->mem_seg[i].type = ab->qmi.target_mem[i].type;
1893 ath11k_dbg(ab, ATH11K_DBG_QMI,
1894 "qmi req mem_seg[%d] %pad %u %u\n", i,
1895 &ab->qmi.target_mem[i].paddr,
1896 ab->qmi.target_mem[i].size,
1897 ab->qmi.target_mem[i].type);
1898 }
1899 }
1900
1901 ret = qmi_txn_init(&ab->qmi.handle, &txn,
1902 qmi_wlanfw_respond_mem_resp_msg_v01_ei, &resp);
1903 if (ret < 0)
1904 goto out;
1905
1906 ath11k_dbg(ab, ATH11K_DBG_QMI, "qmi respond memory request delayed %i\n",
1907 delayed);
1908
1909 ret = qmi_send_request(&ab->qmi.handle, NULL, &txn,
1910 QMI_WLANFW_RESPOND_MEM_REQ_V01,
1911 QMI_WLANFW_RESPOND_MEM_REQ_MSG_V01_MAX_LEN,
1912 qmi_wlanfw_respond_mem_req_msg_v01_ei, req);
1913 if (ret < 0) {
1914 qmi_txn_cancel(&txn);
1915 ath11k_warn(ab, "failed to respond qmi memory request: %d\n",
1916 ret);
1917 goto out;
1918 }
1919
1920 ret = qmi_txn_wait(&txn, msecs_to_jiffies(ATH11K_QMI_WLANFW_TIMEOUT_MS));
1921 if (ret < 0) {
1922 ath11k_warn(ab, "failed to wait qmi memory request: %d\n", ret);
1923 goto out;
1924 }
1925
1926 if (resp.resp.result != QMI_RESULT_SUCCESS_V01) {
1927
1928
1929
1930 if (delayed && resp.resp.error == 0)
1931 goto out;
1932
1933 ath11k_warn(ab, "qmi respond memory request failed: %d %d\n",
1934 resp.resp.result, resp.resp.error);
1935 ret = -EINVAL;
1936 goto out;
1937 }
1938 out:
1939 kfree(req);
1940 return ret;
1941 }
1942
1943 static void ath11k_qmi_free_target_mem_chunk(struct ath11k_base *ab)
1944 {
1945 int i;
1946
1947 for (i = 0; i < ab->qmi.mem_seg_count; i++) {
1948 if ((ab->hw_params.fixed_mem_region ||
1949 test_bit(ATH11K_FLAG_FIXED_MEM_RGN, &ab->dev_flags)) &&
1950 ab->qmi.target_mem[i].iaddr)
1951 iounmap(ab->qmi.target_mem[i].iaddr);
1952
1953 if (!ab->qmi.target_mem[i].vaddr)
1954 continue;
1955
1956 dma_free_coherent(ab->dev,
1957 ab->qmi.target_mem[i].size,
1958 ab->qmi.target_mem[i].vaddr,
1959 ab->qmi.target_mem[i].paddr);
1960 ab->qmi.target_mem[i].vaddr = NULL;
1961 }
1962 }
1963
1964 static int ath11k_qmi_alloc_target_mem_chunk(struct ath11k_base *ab)
1965 {
1966 int i;
1967 struct target_mem_chunk *chunk;
1968
1969 ab->qmi.target_mem_delayed = false;
1970
1971 for (i = 0; i < ab->qmi.mem_seg_count; i++) {
1972 chunk = &ab->qmi.target_mem[i];
1973
1974
1975
1976
1977 if (chunk->vaddr) {
1978 if (chunk->prev_type == chunk->type ||
1979 chunk->prev_size == chunk->size)
1980 continue;
1981
1982
1983 dma_free_coherent(ab->dev, chunk->size,
1984 chunk->vaddr, chunk->paddr);
1985 chunk->vaddr = NULL;
1986 }
1987
1988 chunk->vaddr = dma_alloc_coherent(ab->dev,
1989 chunk->size,
1990 &chunk->paddr,
1991 GFP_KERNEL | __GFP_NOWARN);
1992 if (!chunk->vaddr) {
1993 if (ab->qmi.mem_seg_count <= ATH11K_QMI_FW_MEM_REQ_SEGMENT_CNT) {
1994 ath11k_dbg(ab, ATH11K_DBG_QMI,
1995 "qmi dma allocation failed (%d B type %u), will try later with small size\n",
1996 chunk->size,
1997 chunk->type);
1998 ath11k_qmi_free_target_mem_chunk(ab);
1999 ab->qmi.target_mem_delayed = true;
2000 return 0;
2001 }
2002
2003 ath11k_err(ab, "failed to allocate dma memory for qmi (%d B type %u)\n",
2004 chunk->size,
2005 chunk->type);
2006 return -EINVAL;
2007 }
2008 chunk->prev_type = chunk->type;
2009 chunk->prev_size = chunk->size;
2010 }
2011
2012 return 0;
2013 }
2014
2015 static int ath11k_qmi_assign_target_mem_chunk(struct ath11k_base *ab)
2016 {
2017 struct device *dev = ab->dev;
2018 struct device_node *hremote_node = NULL;
2019 struct resource res;
2020 u32 host_ddr_sz;
2021 int i, idx, ret;
2022
2023 for (i = 0, idx = 0; i < ab->qmi.mem_seg_count; i++) {
2024 switch (ab->qmi.target_mem[i].type) {
2025 case HOST_DDR_REGION_TYPE:
2026 hremote_node = of_parse_phandle(dev->of_node, "memory-region", 0);
2027 if (!hremote_node) {
2028 ath11k_dbg(ab, ATH11K_DBG_QMI,
2029 "qmi fail to get hremote_node\n");
2030 return -ENODEV;
2031 }
2032
2033 ret = of_address_to_resource(hremote_node, 0, &res);
2034 of_node_put(hremote_node);
2035 if (ret) {
2036 ath11k_dbg(ab, ATH11K_DBG_QMI,
2037 "qmi fail to get reg from hremote\n");
2038 return ret;
2039 }
2040
2041 if (res.end - res.start + 1 < ab->qmi.target_mem[i].size) {
2042 ath11k_dbg(ab, ATH11K_DBG_QMI,
2043 "qmi fail to assign memory of sz\n");
2044 return -EINVAL;
2045 }
2046
2047 ab->qmi.target_mem[idx].paddr = res.start;
2048 ab->qmi.target_mem[idx].iaddr =
2049 ioremap(ab->qmi.target_mem[idx].paddr,
2050 ab->qmi.target_mem[i].size);
2051 ab->qmi.target_mem[idx].size = ab->qmi.target_mem[i].size;
2052 host_ddr_sz = ab->qmi.target_mem[i].size;
2053 ab->qmi.target_mem[idx].type = ab->qmi.target_mem[i].type;
2054 idx++;
2055 break;
2056 case BDF_MEM_REGION_TYPE:
2057 ab->qmi.target_mem[idx].paddr = ab->hw_params.bdf_addr;
2058 ab->qmi.target_mem[idx].vaddr = NULL;
2059 ab->qmi.target_mem[idx].size = ab->qmi.target_mem[i].size;
2060 ab->qmi.target_mem[idx].type = ab->qmi.target_mem[i].type;
2061 idx++;
2062 break;
2063 case CALDB_MEM_REGION_TYPE:
2064 if (ab->qmi.target_mem[i].size > ATH11K_QMI_CALDB_SIZE) {
2065 ath11k_warn(ab, "qmi mem size is low to load caldata\n");
2066 return -EINVAL;
2067 }
2068
2069 if (ath11k_cold_boot_cal && ab->hw_params.cold_boot_calib) {
2070 if (hremote_node) {
2071 ab->qmi.target_mem[idx].paddr =
2072 res.start + host_ddr_sz;
2073 ab->qmi.target_mem[idx].iaddr =
2074 ioremap(ab->qmi.target_mem[idx].paddr,
2075 ab->qmi.target_mem[i].size);
2076 } else {
2077 ab->qmi.target_mem[idx].paddr =
2078 ATH11K_QMI_CALDB_ADDRESS;
2079 }
2080 } else {
2081 ab->qmi.target_mem[idx].paddr = 0;
2082 ab->qmi.target_mem[idx].vaddr = NULL;
2083 }
2084 ab->qmi.target_mem[idx].size = ab->qmi.target_mem[i].size;
2085 ab->qmi.target_mem[idx].type = ab->qmi.target_mem[i].type;
2086 idx++;
2087 break;
2088 default:
2089 ath11k_warn(ab, "qmi ignore invalid mem req type %d\n",
2090 ab->qmi.target_mem[i].type);
2091 break;
2092 }
2093 }
2094 ab->qmi.mem_seg_count = idx;
2095
2096 return 0;
2097 }
2098
2099 static int ath11k_qmi_request_device_info(struct ath11k_base *ab)
2100 {
2101 struct qmi_wlanfw_device_info_req_msg_v01 req = {};
2102 struct qmi_wlanfw_device_info_resp_msg_v01 resp = {};
2103 struct qmi_txn txn;
2104 void __iomem *bar_addr_va;
2105 int ret;
2106
2107
2108 if (!ab->hw_params.hybrid_bus_type)
2109 return 0;
2110
2111 ret = qmi_txn_init(&ab->qmi.handle, &txn,
2112 qmi_wlfw_device_info_resp_msg_v01_ei, &resp);
2113 if (ret < 0)
2114 goto out;
2115
2116 ret = qmi_send_request(&ab->qmi.handle, NULL, &txn,
2117 QMI_WLANFW_DEVICE_INFO_REQ_V01,
2118 QMI_WLANFW_DEVICE_INFO_REQ_MSG_V01_MAX_LEN,
2119 qmi_wlanfw_device_info_req_msg_v01_ei, &req);
2120 if (ret < 0) {
2121 qmi_txn_cancel(&txn);
2122 ath11k_warn(ab, "failed to send qmi target device info request: %d\n",
2123 ret);
2124 goto out;
2125 }
2126
2127 ret = qmi_txn_wait(&txn, msecs_to_jiffies(ATH11K_QMI_WLANFW_TIMEOUT_MS));
2128 if (ret < 0) {
2129 ath11k_warn(ab, "failed to wait qmi target device info request: %d\n",
2130 ret);
2131 goto out;
2132 }
2133
2134 if (resp.resp.result != QMI_RESULT_SUCCESS_V01) {
2135 ath11k_warn(ab, "qmi device info request failed: %d %d\n",
2136 resp.resp.result, resp.resp.error);
2137 ret = -EINVAL;
2138 goto out;
2139 }
2140
2141 if (!resp.bar_addr_valid || !resp.bar_size_valid) {
2142 ath11k_warn(ab, "qmi device info response invalid: %d %d\n",
2143 resp.resp.result, resp.resp.error);
2144 ret = -EINVAL;
2145 goto out;
2146 }
2147
2148 if (!resp.bar_addr ||
2149 resp.bar_size != ATH11K_QMI_DEVICE_BAR_SIZE) {
2150 ath11k_warn(ab, "qmi device info invalid address and size: %llu %u\n",
2151 resp.bar_addr, resp.bar_size);
2152 ret = -EINVAL;
2153 goto out;
2154 }
2155
2156 bar_addr_va = devm_ioremap(ab->dev, resp.bar_addr, resp.bar_size);
2157
2158 if (!bar_addr_va) {
2159 ath11k_warn(ab, "qmi device info ioremap failed\n");
2160 ab->mem_len = 0;
2161 ret = -EIO;
2162 goto out;
2163 }
2164
2165 ab->mem = bar_addr_va;
2166 ab->mem_len = resp.bar_size;
2167
2168 return 0;
2169 out:
2170 return ret;
2171 }
2172
2173 static int ath11k_qmi_request_target_cap(struct ath11k_base *ab)
2174 {
2175 struct qmi_wlanfw_cap_req_msg_v01 req;
2176 struct qmi_wlanfw_cap_resp_msg_v01 resp;
2177 struct qmi_txn txn;
2178 int ret = 0;
2179 int r;
2180 char *fw_build_id;
2181 int fw_build_id_mask_len;
2182
2183 memset(&req, 0, sizeof(req));
2184 memset(&resp, 0, sizeof(resp));
2185
2186 ret = qmi_txn_init(&ab->qmi.handle, &txn, qmi_wlanfw_cap_resp_msg_v01_ei,
2187 &resp);
2188 if (ret < 0)
2189 goto out;
2190
2191 ath11k_dbg(ab, ATH11K_DBG_QMI, "qmi target cap request\n");
2192
2193 ret = qmi_send_request(&ab->qmi.handle, NULL, &txn,
2194 QMI_WLANFW_CAP_REQ_V01,
2195 QMI_WLANFW_CAP_REQ_MSG_V01_MAX_LEN,
2196 qmi_wlanfw_cap_req_msg_v01_ei, &req);
2197 if (ret < 0) {
2198 qmi_txn_cancel(&txn);
2199 ath11k_warn(ab, "failed to send qmi cap request: %d\n",
2200 ret);
2201 goto out;
2202 }
2203
2204 ret = qmi_txn_wait(&txn, msecs_to_jiffies(ATH11K_QMI_WLANFW_TIMEOUT_MS));
2205 if (ret < 0) {
2206 ath11k_warn(ab, "failed to wait qmi cap request: %d\n", ret);
2207 goto out;
2208 }
2209
2210 if (resp.resp.result != QMI_RESULT_SUCCESS_V01) {
2211 ath11k_warn(ab, "qmi cap request failed: %d %d\n",
2212 resp.resp.result, resp.resp.error);
2213 ret = -EINVAL;
2214 goto out;
2215 }
2216
2217 if (resp.chip_info_valid) {
2218 ab->qmi.target.chip_id = resp.chip_info.chip_id;
2219 ab->qmi.target.chip_family = resp.chip_info.chip_family;
2220 }
2221
2222 if (resp.board_info_valid)
2223 ab->qmi.target.board_id = resp.board_info.board_id;
2224 else
2225 ab->qmi.target.board_id = 0xFF;
2226
2227 if (resp.soc_info_valid)
2228 ab->qmi.target.soc_id = resp.soc_info.soc_id;
2229
2230 if (resp.fw_version_info_valid) {
2231 ab->qmi.target.fw_version = resp.fw_version_info.fw_version;
2232 strscpy(ab->qmi.target.fw_build_timestamp,
2233 resp.fw_version_info.fw_build_timestamp,
2234 sizeof(ab->qmi.target.fw_build_timestamp));
2235 }
2236
2237 if (resp.fw_build_id_valid)
2238 strscpy(ab->qmi.target.fw_build_id, resp.fw_build_id,
2239 sizeof(ab->qmi.target.fw_build_id));
2240
2241 if (resp.eeprom_read_timeout_valid) {
2242 ab->qmi.target.eeprom_caldata =
2243 resp.eeprom_read_timeout;
2244 ath11k_dbg(ab, ATH11K_DBG_QMI, "qmi cal data supported from eeprom\n");
2245 }
2246
2247 fw_build_id = ab->qmi.target.fw_build_id;
2248 fw_build_id_mask_len = strlen(FW_BUILD_ID_MASK);
2249 if (!strncmp(fw_build_id, FW_BUILD_ID_MASK, fw_build_id_mask_len))
2250 fw_build_id = fw_build_id + fw_build_id_mask_len;
2251
2252 ath11k_info(ab, "chip_id 0x%x chip_family 0x%x board_id 0x%x soc_id 0x%x\n",
2253 ab->qmi.target.chip_id, ab->qmi.target.chip_family,
2254 ab->qmi.target.board_id, ab->qmi.target.soc_id);
2255
2256 ath11k_info(ab, "fw_version 0x%x fw_build_timestamp %s fw_build_id %s",
2257 ab->qmi.target.fw_version,
2258 ab->qmi.target.fw_build_timestamp,
2259 fw_build_id);
2260
2261 r = ath11k_core_check_smbios(ab);
2262 if (r)
2263 ath11k_dbg(ab, ATH11K_DBG_QMI, "SMBIOS bdf variant name not set.\n");
2264
2265 r = ath11k_core_check_dt(ab);
2266 if (r)
2267 ath11k_dbg(ab, ATH11K_DBG_QMI, "DT bdf variant name not set.\n");
2268
2269 out:
2270 return ret;
2271 }
2272
2273 static int ath11k_qmi_load_file_target_mem(struct ath11k_base *ab,
2274 const u8 *data, u32 len, u8 type)
2275 {
2276 struct qmi_wlanfw_bdf_download_req_msg_v01 *req;
2277 struct qmi_wlanfw_bdf_download_resp_msg_v01 resp;
2278 struct qmi_txn txn;
2279 const u8 *temp = data;
2280 void __iomem *bdf_addr = NULL;
2281 int ret;
2282 u32 remaining = len;
2283
2284 req = kzalloc(sizeof(*req), GFP_KERNEL);
2285 if (!req)
2286 return -ENOMEM;
2287
2288 memset(&resp, 0, sizeof(resp));
2289
2290 if (ab->hw_params.fixed_bdf_addr) {
2291 bdf_addr = ioremap(ab->hw_params.bdf_addr, ab->hw_params.fw.board_size);
2292 if (!bdf_addr) {
2293 ath11k_warn(ab, "qmi ioremap error for bdf_addr\n");
2294 ret = -EIO;
2295 goto err_free_req;
2296 }
2297 }
2298
2299 while (remaining) {
2300 req->valid = 1;
2301 req->file_id_valid = 1;
2302 req->file_id = ab->qmi.target.board_id;
2303 req->total_size_valid = 1;
2304 req->total_size = remaining;
2305 req->seg_id_valid = 1;
2306 req->data_valid = 1;
2307 req->bdf_type = type;
2308 req->bdf_type_valid = 1;
2309 req->end_valid = 1;
2310 req->end = 0;
2311
2312 if (remaining > QMI_WLANFW_MAX_DATA_SIZE_V01) {
2313 req->data_len = QMI_WLANFW_MAX_DATA_SIZE_V01;
2314 } else {
2315 req->data_len = remaining;
2316 req->end = 1;
2317 }
2318
2319 if (ab->hw_params.fixed_bdf_addr ||
2320 type == ATH11K_QMI_FILE_TYPE_EEPROM) {
2321 req->data_valid = 0;
2322 req->end = 1;
2323 req->data_len = ATH11K_QMI_MAX_BDF_FILE_NAME_SIZE;
2324 } else {
2325 memcpy(req->data, temp, req->data_len);
2326 }
2327
2328 if (ab->hw_params.fixed_bdf_addr) {
2329 if (type == ATH11K_QMI_FILE_TYPE_CALDATA)
2330 bdf_addr += ab->hw_params.fw.cal_offset;
2331
2332 memcpy_toio(bdf_addr, temp, len);
2333 }
2334
2335 ret = qmi_txn_init(&ab->qmi.handle, &txn,
2336 qmi_wlanfw_bdf_download_resp_msg_v01_ei,
2337 &resp);
2338 if (ret < 0)
2339 goto err_iounmap;
2340
2341 ath11k_dbg(ab, ATH11K_DBG_QMI, "qmi bdf download req fixed addr type %d\n",
2342 type);
2343
2344 ret = qmi_send_request(&ab->qmi.handle, NULL, &txn,
2345 QMI_WLANFW_BDF_DOWNLOAD_REQ_V01,
2346 QMI_WLANFW_BDF_DOWNLOAD_REQ_MSG_V01_MAX_LEN,
2347 qmi_wlanfw_bdf_download_req_msg_v01_ei, req);
2348 if (ret < 0) {
2349 qmi_txn_cancel(&txn);
2350 goto err_iounmap;
2351 }
2352
2353 ret = qmi_txn_wait(&txn, msecs_to_jiffies(ATH11K_QMI_WLANFW_TIMEOUT_MS));
2354 if (ret < 0) {
2355 ath11k_warn(ab, "failed to wait board file download request: %d\n",
2356 ret);
2357 goto err_iounmap;
2358 }
2359
2360 if (resp.resp.result != QMI_RESULT_SUCCESS_V01) {
2361 ath11k_warn(ab, "board file download request failed: %d %d\n",
2362 resp.resp.result, resp.resp.error);
2363 ret = -EINVAL;
2364 goto err_iounmap;
2365 }
2366
2367 if (ab->hw_params.fixed_bdf_addr ||
2368 type == ATH11K_QMI_FILE_TYPE_EEPROM) {
2369 remaining = 0;
2370 } else {
2371 remaining -= req->data_len;
2372 temp += req->data_len;
2373 req->seg_id++;
2374 ath11k_dbg(ab, ATH11K_DBG_QMI, "qmi bdf download request remaining %i\n",
2375 remaining);
2376 }
2377 }
2378
2379 err_iounmap:
2380 if (ab->hw_params.fixed_bdf_addr)
2381 iounmap(bdf_addr);
2382
2383 err_free_req:
2384 kfree(req);
2385
2386 return ret;
2387 }
2388
2389 static int ath11k_qmi_load_bdf_qmi(struct ath11k_base *ab,
2390 bool regdb)
2391 {
2392 struct device *dev = ab->dev;
2393 char filename[ATH11K_QMI_MAX_BDF_FILE_NAME_SIZE];
2394 const struct firmware *fw_entry;
2395 struct ath11k_board_data bd;
2396 u32 fw_size, file_type;
2397 int ret = 0, bdf_type;
2398 const u8 *tmp;
2399
2400 memset(&bd, 0, sizeof(bd));
2401
2402 if (regdb) {
2403 ret = ath11k_core_fetch_regdb(ab, &bd);
2404 } else {
2405 ret = ath11k_core_fetch_bdf(ab, &bd);
2406 if (ret)
2407 ath11k_warn(ab, "qmi failed to fetch board file: %d\n", ret);
2408 }
2409
2410 if (ret)
2411 goto out;
2412
2413 if (regdb)
2414 bdf_type = ATH11K_QMI_BDF_TYPE_REGDB;
2415 else if (bd.len >= SELFMAG && memcmp(bd.data, ELFMAG, SELFMAG) == 0)
2416 bdf_type = ATH11K_QMI_BDF_TYPE_ELF;
2417 else
2418 bdf_type = ATH11K_QMI_BDF_TYPE_BIN;
2419
2420 ath11k_dbg(ab, ATH11K_DBG_QMI, "qmi bdf_type %d\n", bdf_type);
2421
2422 fw_size = min_t(u32, ab->hw_params.fw.board_size, bd.len);
2423
2424 ret = ath11k_qmi_load_file_target_mem(ab, bd.data, fw_size, bdf_type);
2425 if (ret < 0) {
2426 ath11k_warn(ab, "qmi failed to load bdf file\n");
2427 goto out;
2428 }
2429
2430
2431 if (bdf_type == ATH11K_QMI_BDF_TYPE_ELF || bdf_type == ATH11K_QMI_BDF_TYPE_REGDB)
2432 goto out;
2433
2434 if (ab->qmi.target.eeprom_caldata) {
2435 file_type = ATH11K_QMI_FILE_TYPE_EEPROM;
2436 tmp = filename;
2437 fw_size = ATH11K_QMI_MAX_BDF_FILE_NAME_SIZE;
2438 } else {
2439 file_type = ATH11K_QMI_FILE_TYPE_CALDATA;
2440
2441
2442 snprintf(filename, sizeof(filename), "cal-%s-%s.bin",
2443 ath11k_bus_str(ab->hif.bus), dev_name(dev));
2444 fw_entry = ath11k_core_firmware_request(ab, filename);
2445 if (!IS_ERR(fw_entry))
2446 goto success;
2447
2448 fw_entry = ath11k_core_firmware_request(ab, ATH11K_DEFAULT_CAL_FILE);
2449 if (IS_ERR(fw_entry)) {
2450 ret = PTR_ERR(fw_entry);
2451 ath11k_warn(ab,
2452 "qmi failed to load CAL data file:%s\n",
2453 filename);
2454 goto out;
2455 }
2456 success:
2457 fw_size = min_t(u32, ab->hw_params.fw.board_size, fw_entry->size);
2458 tmp = fw_entry->data;
2459 }
2460
2461 ret = ath11k_qmi_load_file_target_mem(ab, tmp, fw_size, file_type);
2462 if (ret < 0) {
2463 ath11k_warn(ab, "qmi failed to load caldata\n");
2464 goto out_qmi_cal;
2465 }
2466
2467 ath11k_dbg(ab, ATH11K_DBG_QMI, "qmi caldata type: %u\n", file_type);
2468
2469 out_qmi_cal:
2470 if (!ab->qmi.target.eeprom_caldata)
2471 release_firmware(fw_entry);
2472 out:
2473 ath11k_core_free_bdf(ab, &bd);
2474 ath11k_dbg(ab, ATH11K_DBG_QMI, "qmi BDF download sequence completed\n");
2475
2476 return ret;
2477 }
2478
2479 static int ath11k_qmi_m3_load(struct ath11k_base *ab)
2480 {
2481 struct m3_mem_region *m3_mem = &ab->qmi.m3_mem;
2482 const struct firmware *fw;
2483 char path[100];
2484 int ret;
2485
2486 fw = ath11k_core_firmware_request(ab, ATH11K_M3_FILE);
2487 if (IS_ERR(fw)) {
2488 ret = PTR_ERR(fw);
2489 ath11k_core_create_firmware_path(ab, ATH11K_M3_FILE,
2490 path, sizeof(path));
2491 ath11k_err(ab, "failed to load %s: %d\n", path, ret);
2492 return ret;
2493 }
2494
2495 if (m3_mem->vaddr || m3_mem->size)
2496 goto skip_m3_alloc;
2497
2498 m3_mem->vaddr = dma_alloc_coherent(ab->dev,
2499 fw->size, &m3_mem->paddr,
2500 GFP_KERNEL);
2501 if (!m3_mem->vaddr) {
2502 ath11k_err(ab, "failed to allocate memory for M3 with size %zu\n",
2503 fw->size);
2504 release_firmware(fw);
2505 return -ENOMEM;
2506 }
2507
2508 skip_m3_alloc:
2509 memcpy(m3_mem->vaddr, fw->data, fw->size);
2510 m3_mem->size = fw->size;
2511 release_firmware(fw);
2512
2513 return 0;
2514 }
2515
2516 static void ath11k_qmi_m3_free(struct ath11k_base *ab)
2517 {
2518 struct m3_mem_region *m3_mem = &ab->qmi.m3_mem;
2519
2520 if (!ab->hw_params.m3_fw_support || !m3_mem->vaddr)
2521 return;
2522
2523 dma_free_coherent(ab->dev, m3_mem->size,
2524 m3_mem->vaddr, m3_mem->paddr);
2525 m3_mem->vaddr = NULL;
2526 m3_mem->size = 0;
2527 }
2528
2529 static int ath11k_qmi_wlanfw_m3_info_send(struct ath11k_base *ab)
2530 {
2531 struct m3_mem_region *m3_mem = &ab->qmi.m3_mem;
2532 struct qmi_wlanfw_m3_info_req_msg_v01 req;
2533 struct qmi_wlanfw_m3_info_resp_msg_v01 resp;
2534 struct qmi_txn txn;
2535 int ret = 0;
2536
2537 memset(&req, 0, sizeof(req));
2538 memset(&resp, 0, sizeof(resp));
2539
2540 if (ab->hw_params.m3_fw_support) {
2541 ret = ath11k_qmi_m3_load(ab);
2542 if (ret) {
2543 ath11k_err(ab, "failed to load m3 firmware: %d", ret);
2544 return ret;
2545 }
2546
2547 req.addr = m3_mem->paddr;
2548 req.size = m3_mem->size;
2549 } else {
2550 req.addr = 0;
2551 req.size = 0;
2552 }
2553
2554 ret = qmi_txn_init(&ab->qmi.handle, &txn,
2555 qmi_wlanfw_m3_info_resp_msg_v01_ei, &resp);
2556 if (ret < 0)
2557 goto out;
2558
2559 ath11k_dbg(ab, ATH11K_DBG_QMI, "qmi m3 info req\n");
2560
2561 ret = qmi_send_request(&ab->qmi.handle, NULL, &txn,
2562 QMI_WLANFW_M3_INFO_REQ_V01,
2563 QMI_WLANFW_M3_INFO_REQ_MSG_V01_MAX_MSG_LEN,
2564 qmi_wlanfw_m3_info_req_msg_v01_ei, &req);
2565 if (ret < 0) {
2566 qmi_txn_cancel(&txn);
2567 ath11k_warn(ab, "failed to send m3 information request: %d\n",
2568 ret);
2569 goto out;
2570 }
2571
2572 ret = qmi_txn_wait(&txn, msecs_to_jiffies(ATH11K_QMI_WLANFW_TIMEOUT_MS));
2573 if (ret < 0) {
2574 ath11k_warn(ab, "failed to wait m3 information request: %d\n", ret);
2575 goto out;
2576 }
2577
2578 if (resp.resp.result != QMI_RESULT_SUCCESS_V01) {
2579 ath11k_warn(ab, "m3 info request failed: %d %d\n",
2580 resp.resp.result, resp.resp.error);
2581 ret = -EINVAL;
2582 goto out;
2583 }
2584 out:
2585 return ret;
2586 }
2587
2588 static int ath11k_qmi_wlanfw_mode_send(struct ath11k_base *ab,
2589 u32 mode)
2590 {
2591 struct qmi_wlanfw_wlan_mode_req_msg_v01 req;
2592 struct qmi_wlanfw_wlan_mode_resp_msg_v01 resp;
2593 struct qmi_txn txn;
2594 int ret = 0;
2595
2596 memset(&req, 0, sizeof(req));
2597 memset(&resp, 0, sizeof(resp));
2598
2599 req.mode = mode;
2600 req.hw_debug_valid = 1;
2601 req.hw_debug = 0;
2602
2603 ret = qmi_txn_init(&ab->qmi.handle, &txn,
2604 qmi_wlanfw_wlan_mode_resp_msg_v01_ei, &resp);
2605 if (ret < 0)
2606 goto out;
2607
2608 ath11k_dbg(ab, ATH11K_DBG_QMI, "qmi wlan mode req mode %d\n", mode);
2609
2610 ret = qmi_send_request(&ab->qmi.handle, NULL, &txn,
2611 QMI_WLANFW_WLAN_MODE_REQ_V01,
2612 QMI_WLANFW_WLAN_MODE_REQ_MSG_V01_MAX_LEN,
2613 qmi_wlanfw_wlan_mode_req_msg_v01_ei, &req);
2614 if (ret < 0) {
2615 qmi_txn_cancel(&txn);
2616 ath11k_warn(ab, "failed to send wlan mode request (mode %d): %d\n",
2617 mode, ret);
2618 goto out;
2619 }
2620
2621 ret = qmi_txn_wait(&txn, msecs_to_jiffies(ATH11K_QMI_WLANFW_TIMEOUT_MS));
2622 if (ret < 0) {
2623 if (mode == ATH11K_FIRMWARE_MODE_OFF && ret == -ENETRESET) {
2624 ath11k_warn(ab, "WLFW service is dis-connected\n");
2625 return 0;
2626 }
2627 ath11k_warn(ab, "failed to wait wlan mode request (mode %d): %d\n",
2628 mode, ret);
2629 goto out;
2630 }
2631
2632 if (resp.resp.result != QMI_RESULT_SUCCESS_V01) {
2633 ath11k_warn(ab, "wlan mode request failed (mode: %d): %d %d\n",
2634 mode, resp.resp.result, resp.resp.error);
2635 ret = -EINVAL;
2636 goto out;
2637 }
2638
2639 out:
2640 return ret;
2641 }
2642
2643 static int ath11k_qmi_wlanfw_wlan_cfg_send(struct ath11k_base *ab)
2644 {
2645 struct qmi_wlanfw_wlan_cfg_req_msg_v01 *req;
2646 struct qmi_wlanfw_wlan_cfg_resp_msg_v01 resp;
2647 struct ce_pipe_config *ce_cfg;
2648 struct service_to_pipe *svc_cfg;
2649 struct qmi_txn txn;
2650 int ret = 0, pipe_num;
2651
2652 ce_cfg = (struct ce_pipe_config *)ab->qmi.ce_cfg.tgt_ce;
2653 svc_cfg = (struct service_to_pipe *)ab->qmi.ce_cfg.svc_to_ce_map;
2654
2655 req = kzalloc(sizeof(*req), GFP_KERNEL);
2656 if (!req)
2657 return -ENOMEM;
2658
2659 memset(&resp, 0, sizeof(resp));
2660
2661 req->host_version_valid = 1;
2662 strscpy(req->host_version, ATH11K_HOST_VERSION_STRING,
2663 sizeof(req->host_version));
2664
2665 req->tgt_cfg_valid = 1;
2666
2667 req->tgt_cfg_len = ab->qmi.ce_cfg.tgt_ce_len;
2668 for (pipe_num = 0; pipe_num < req->tgt_cfg_len ; pipe_num++) {
2669 req->tgt_cfg[pipe_num].pipe_num = ce_cfg[pipe_num].pipenum;
2670 req->tgt_cfg[pipe_num].pipe_dir = ce_cfg[pipe_num].pipedir;
2671 req->tgt_cfg[pipe_num].nentries = ce_cfg[pipe_num].nentries;
2672 req->tgt_cfg[pipe_num].nbytes_max = ce_cfg[pipe_num].nbytes_max;
2673 req->tgt_cfg[pipe_num].flags = ce_cfg[pipe_num].flags;
2674 }
2675
2676 req->svc_cfg_valid = 1;
2677
2678 req->svc_cfg_len = ab->qmi.ce_cfg.svc_to_ce_map_len;
2679 for (pipe_num = 0; pipe_num < req->svc_cfg_len; pipe_num++) {
2680 req->svc_cfg[pipe_num].service_id = svc_cfg[pipe_num].service_id;
2681 req->svc_cfg[pipe_num].pipe_dir = svc_cfg[pipe_num].pipedir;
2682 req->svc_cfg[pipe_num].pipe_num = svc_cfg[pipe_num].pipenum;
2683 }
2684 req->shadow_reg_valid = 0;
2685
2686
2687 if (ab->hw_params.supports_shadow_regs) {
2688 req->shadow_reg_v2_valid = 1;
2689 req->shadow_reg_v2_len = min_t(u32,
2690 ab->qmi.ce_cfg.shadow_reg_v2_len,
2691 QMI_WLANFW_MAX_NUM_SHADOW_REG_V2_V01);
2692 memcpy(&req->shadow_reg_v2, ab->qmi.ce_cfg.shadow_reg_v2,
2693 sizeof(u32) * req->shadow_reg_v2_len);
2694 } else {
2695 req->shadow_reg_v2_valid = 0;
2696 }
2697
2698 ret = qmi_txn_init(&ab->qmi.handle, &txn,
2699 qmi_wlanfw_wlan_cfg_resp_msg_v01_ei, &resp);
2700 if (ret < 0)
2701 goto out;
2702
2703 ath11k_dbg(ab, ATH11K_DBG_QMI, "qmi wlan cfg req\n");
2704
2705 ret = qmi_send_request(&ab->qmi.handle, NULL, &txn,
2706 QMI_WLANFW_WLAN_CFG_REQ_V01,
2707 QMI_WLANFW_WLAN_CFG_REQ_MSG_V01_MAX_LEN,
2708 qmi_wlanfw_wlan_cfg_req_msg_v01_ei, req);
2709 if (ret < 0) {
2710 qmi_txn_cancel(&txn);
2711 ath11k_warn(ab, "failed to send wlan config request: %d\n",
2712 ret);
2713 goto out;
2714 }
2715
2716 ret = qmi_txn_wait(&txn, msecs_to_jiffies(ATH11K_QMI_WLANFW_TIMEOUT_MS));
2717 if (ret < 0) {
2718 ath11k_warn(ab, "failed to wait wlan config request: %d\n", ret);
2719 goto out;
2720 }
2721
2722 if (resp.resp.result != QMI_RESULT_SUCCESS_V01) {
2723 ath11k_warn(ab, "wlan config request failed: %d %d\n",
2724 resp.resp.result, resp.resp.error);
2725 ret = -EINVAL;
2726 goto out;
2727 }
2728
2729 out:
2730 kfree(req);
2731 return ret;
2732 }
2733
2734 static int ath11k_qmi_wlanfw_wlan_ini_send(struct ath11k_base *ab, bool enable)
2735 {
2736 int ret;
2737 struct qmi_txn txn;
2738 struct qmi_wlanfw_wlan_ini_req_msg_v01 req = {};
2739 struct qmi_wlanfw_wlan_ini_resp_msg_v01 resp = {};
2740
2741 req.enablefwlog_valid = true;
2742 req.enablefwlog = enable ? 1 : 0;
2743
2744 ret = qmi_txn_init(&ab->qmi.handle, &txn,
2745 qmi_wlanfw_wlan_ini_resp_msg_v01_ei, &resp);
2746 if (ret < 0)
2747 goto out;
2748
2749 ret = qmi_send_request(&ab->qmi.handle, NULL, &txn,
2750 QMI_WLANFW_WLAN_INI_REQ_V01,
2751 QMI_WLANFW_WLAN_INI_REQ_MSG_V01_MAX_LEN,
2752 qmi_wlanfw_wlan_ini_req_msg_v01_ei, &req);
2753 if (ret < 0) {
2754 ath11k_warn(ab, "qmi failed to send wlan ini request, err = %d\n",
2755 ret);
2756 qmi_txn_cancel(&txn);
2757 goto out;
2758 }
2759
2760 ret = qmi_txn_wait(&txn, msecs_to_jiffies(ATH11K_QMI_WLANFW_TIMEOUT_MS));
2761 if (ret < 0) {
2762 ath11k_warn(ab, "qmi failed wlan ini request, err = %d\n", ret);
2763 goto out;
2764 }
2765
2766 if (resp.resp.result != QMI_RESULT_SUCCESS_V01) {
2767 ath11k_warn(ab, "qmi wlan ini request failed, result: %d, err: %d\n",
2768 resp.resp.result, resp.resp.error);
2769 ret = -EINVAL;
2770 }
2771
2772 out:
2773 return ret;
2774 }
2775
2776 void ath11k_qmi_firmware_stop(struct ath11k_base *ab)
2777 {
2778 int ret;
2779
2780 ath11k_dbg(ab, ATH11K_DBG_QMI, "qmi firmware stop\n");
2781
2782 ret = ath11k_qmi_wlanfw_mode_send(ab, ATH11K_FIRMWARE_MODE_OFF);
2783 if (ret < 0) {
2784 ath11k_warn(ab, "qmi failed to send wlan mode off: %d\n", ret);
2785 return;
2786 }
2787 }
2788
2789 int ath11k_qmi_firmware_start(struct ath11k_base *ab,
2790 u32 mode)
2791 {
2792 int ret;
2793
2794 ath11k_dbg(ab, ATH11K_DBG_QMI, "qmi firmware start\n");
2795
2796 if (ab->hw_params.fw_wmi_diag_event) {
2797 ret = ath11k_qmi_wlanfw_wlan_ini_send(ab, true);
2798 if (ret < 0) {
2799 ath11k_warn(ab, "qmi failed to send wlan fw ini:%d\n", ret);
2800 return ret;
2801 }
2802 }
2803
2804 ret = ath11k_qmi_wlanfw_wlan_cfg_send(ab);
2805 if (ret < 0) {
2806 ath11k_warn(ab, "qmi failed to send wlan cfg: %d\n", ret);
2807 return ret;
2808 }
2809
2810 ret = ath11k_qmi_wlanfw_mode_send(ab, mode);
2811 if (ret < 0) {
2812 ath11k_warn(ab, "qmi failed to send wlan fw mode: %d\n", ret);
2813 return ret;
2814 }
2815
2816 return 0;
2817 }
2818
2819 static int ath11k_qmi_process_coldboot_calibration(struct ath11k_base *ab)
2820 {
2821 int timeout;
2822 int ret;
2823
2824 ret = ath11k_qmi_wlanfw_mode_send(ab, ATH11K_FIRMWARE_MODE_COLD_BOOT);
2825 if (ret < 0) {
2826 ath11k_warn(ab, "qmi failed to send wlan fw mode: %d\n", ret);
2827 return ret;
2828 }
2829
2830 ath11k_dbg(ab, ATH11K_DBG_QMI, "Coldboot calibration wait started\n");
2831
2832 timeout = wait_event_timeout(ab->qmi.cold_boot_waitq,
2833 (ab->qmi.cal_done == 1),
2834 ATH11K_COLD_BOOT_FW_RESET_DELAY);
2835 if (timeout <= 0) {
2836 ath11k_warn(ab, "coldboot calibration timed out\n");
2837 return 0;
2838 }
2839
2840 ath11k_dbg(ab, ATH11K_DBG_QMI, "Coldboot calibration done\n");
2841
2842 return 0;
2843 }
2844
2845 static int
2846 ath11k_qmi_driver_event_post(struct ath11k_qmi *qmi,
2847 enum ath11k_qmi_event_type type,
2848 void *data)
2849 {
2850 struct ath11k_qmi_driver_event *event;
2851
2852 event = kzalloc(sizeof(*event), GFP_ATOMIC);
2853 if (!event)
2854 return -ENOMEM;
2855
2856 event->type = type;
2857 event->data = data;
2858
2859 spin_lock(&qmi->event_lock);
2860 list_add_tail(&event->list, &qmi->event_list);
2861 spin_unlock(&qmi->event_lock);
2862
2863 queue_work(qmi->event_wq, &qmi->event_work);
2864
2865 return 0;
2866 }
2867
2868 static int ath11k_qmi_event_mem_request(struct ath11k_qmi *qmi)
2869 {
2870 struct ath11k_base *ab = qmi->ab;
2871 int ret;
2872
2873 ret = ath11k_qmi_respond_fw_mem_request(ab);
2874 if (ret < 0) {
2875 ath11k_warn(ab, "qmi failed to respond fw mem req: %d\n", ret);
2876 return ret;
2877 }
2878
2879 return ret;
2880 }
2881
2882 static int ath11k_qmi_event_load_bdf(struct ath11k_qmi *qmi)
2883 {
2884 struct ath11k_base *ab = qmi->ab;
2885 int ret;
2886
2887 ret = ath11k_qmi_request_target_cap(ab);
2888 if (ret < 0) {
2889 ath11k_warn(ab, "failed to request qmi target capabilities: %d\n",
2890 ret);
2891 return ret;
2892 }
2893
2894 ret = ath11k_qmi_request_device_info(ab);
2895 if (ret < 0) {
2896 ath11k_warn(ab, "failed to request qmi device info: %d\n", ret);
2897 return ret;
2898 }
2899
2900 if (ab->hw_params.supports_regdb)
2901 ath11k_qmi_load_bdf_qmi(ab, true);
2902
2903 ret = ath11k_qmi_load_bdf_qmi(ab, false);
2904 if (ret < 0) {
2905 ath11k_warn(ab, "failed to load board data file: %d\n", ret);
2906 return ret;
2907 }
2908
2909 return 0;
2910 }
2911
2912 static int ath11k_qmi_event_server_arrive(struct ath11k_qmi *qmi)
2913 {
2914 struct ath11k_base *ab = qmi->ab;
2915 int ret;
2916
2917 ret = ath11k_qmi_fw_ind_register_send(ab);
2918 if (ret < 0) {
2919 ath11k_warn(ab, "failed to send qmi firmware indication: %d\n",
2920 ret);
2921 return ret;
2922 }
2923
2924 ret = ath11k_qmi_host_cap_send(ab);
2925 if (ret < 0) {
2926 ath11k_warn(ab, "failed to send qmi host cap: %d\n", ret);
2927 return ret;
2928 }
2929
2930 if (!ab->hw_params.fixed_fw_mem)
2931 return ret;
2932
2933 ret = ath11k_qmi_event_load_bdf(qmi);
2934 if (ret < 0) {
2935 ath11k_warn(ab, "qmi failed to download BDF:%d\n", ret);
2936 return ret;
2937 }
2938
2939 return ret;
2940 }
2941
2942 static void ath11k_qmi_msg_mem_request_cb(struct qmi_handle *qmi_hdl,
2943 struct sockaddr_qrtr *sq,
2944 struct qmi_txn *txn,
2945 const void *data)
2946 {
2947 struct ath11k_qmi *qmi = container_of(qmi_hdl, struct ath11k_qmi, handle);
2948 struct ath11k_base *ab = qmi->ab;
2949 const struct qmi_wlanfw_request_mem_ind_msg_v01 *msg = data;
2950 int i, ret;
2951
2952 ath11k_dbg(ab, ATH11K_DBG_QMI, "qmi firmware request memory request\n");
2953
2954 if (msg->mem_seg_len == 0 ||
2955 msg->mem_seg_len > ATH11K_QMI_WLANFW_MAX_NUM_MEM_SEG_V01)
2956 ath11k_warn(ab, "invalid memory segment length: %u\n",
2957 msg->mem_seg_len);
2958
2959 ab->qmi.mem_seg_count = msg->mem_seg_len;
2960
2961 for (i = 0; i < qmi->mem_seg_count ; i++) {
2962 ab->qmi.target_mem[i].type = msg->mem_seg[i].type;
2963 ab->qmi.target_mem[i].size = msg->mem_seg[i].size;
2964 ath11k_dbg(ab, ATH11K_DBG_QMI, "qmi mem seg type %d size %d\n",
2965 msg->mem_seg[i].type, msg->mem_seg[i].size);
2966 }
2967
2968 if (ab->hw_params.fixed_mem_region ||
2969 test_bit(ATH11K_FLAG_FIXED_MEM_RGN, &ab->dev_flags)) {
2970 ret = ath11k_qmi_assign_target_mem_chunk(ab);
2971 if (ret) {
2972 ath11k_warn(ab, "failed to assign qmi target memory: %d\n",
2973 ret);
2974 return;
2975 }
2976 } else {
2977 ret = ath11k_qmi_alloc_target_mem_chunk(ab);
2978 if (ret) {
2979 ath11k_warn(ab, "failed to allocate qmi target memory: %d\n",
2980 ret);
2981 return;
2982 }
2983 }
2984
2985 ath11k_qmi_driver_event_post(qmi, ATH11K_QMI_EVENT_REQUEST_MEM, NULL);
2986 }
2987
2988 static void ath11k_qmi_msg_mem_ready_cb(struct qmi_handle *qmi_hdl,
2989 struct sockaddr_qrtr *sq,
2990 struct qmi_txn *txn,
2991 const void *decoded)
2992 {
2993 struct ath11k_qmi *qmi = container_of(qmi_hdl, struct ath11k_qmi, handle);
2994 struct ath11k_base *ab = qmi->ab;
2995
2996 ath11k_dbg(ab, ATH11K_DBG_QMI, "qmi firmware memory ready indication\n");
2997 ath11k_qmi_driver_event_post(qmi, ATH11K_QMI_EVENT_FW_MEM_READY, NULL);
2998 }
2999
3000 static void ath11k_qmi_msg_fw_ready_cb(struct qmi_handle *qmi_hdl,
3001 struct sockaddr_qrtr *sq,
3002 struct qmi_txn *txn,
3003 const void *decoded)
3004 {
3005 struct ath11k_qmi *qmi = container_of(qmi_hdl, struct ath11k_qmi, handle);
3006 struct ath11k_base *ab = qmi->ab;
3007
3008 ath11k_dbg(ab, ATH11K_DBG_QMI, "qmi firmware ready\n");
3009 ath11k_qmi_driver_event_post(qmi, ATH11K_QMI_EVENT_FW_READY, NULL);
3010 }
3011
3012 static void ath11k_qmi_msg_cold_boot_cal_done_cb(struct qmi_handle *qmi_hdl,
3013 struct sockaddr_qrtr *sq,
3014 struct qmi_txn *txn,
3015 const void *decoded)
3016 {
3017 struct ath11k_qmi *qmi = container_of(qmi_hdl,
3018 struct ath11k_qmi, handle);
3019 struct ath11k_base *ab = qmi->ab;
3020
3021 ab->qmi.cal_done = 1;
3022 wake_up(&ab->qmi.cold_boot_waitq);
3023 ath11k_dbg(ab, ATH11K_DBG_QMI, "qmi cold boot calibration done\n");
3024 }
3025
3026 static const struct qmi_msg_handler ath11k_qmi_msg_handlers[] = {
3027 {
3028 .type = QMI_INDICATION,
3029 .msg_id = QMI_WLFW_REQUEST_MEM_IND_V01,
3030 .ei = qmi_wlanfw_request_mem_ind_msg_v01_ei,
3031 .decoded_size = sizeof(struct qmi_wlanfw_request_mem_ind_msg_v01),
3032 .fn = ath11k_qmi_msg_mem_request_cb,
3033 },
3034 {
3035 .type = QMI_INDICATION,
3036 .msg_id = QMI_WLFW_FW_MEM_READY_IND_V01,
3037 .ei = qmi_wlanfw_mem_ready_ind_msg_v01_ei,
3038 .decoded_size = sizeof(struct qmi_wlanfw_fw_mem_ready_ind_msg_v01),
3039 .fn = ath11k_qmi_msg_mem_ready_cb,
3040 },
3041 {
3042 .type = QMI_INDICATION,
3043 .msg_id = QMI_WLFW_FW_READY_IND_V01,
3044 .ei = qmi_wlanfw_fw_ready_ind_msg_v01_ei,
3045 .decoded_size = sizeof(struct qmi_wlanfw_fw_ready_ind_msg_v01),
3046 .fn = ath11k_qmi_msg_fw_ready_cb,
3047 },
3048 {
3049 .type = QMI_INDICATION,
3050 .msg_id = QMI_WLFW_COLD_BOOT_CAL_DONE_IND_V01,
3051 .ei = qmi_wlanfw_cold_boot_cal_done_ind_msg_v01_ei,
3052 .decoded_size =
3053 sizeof(struct qmi_wlanfw_fw_cold_cal_done_ind_msg_v01),
3054 .fn = ath11k_qmi_msg_cold_boot_cal_done_cb,
3055 },
3056 };
3057
3058 static int ath11k_qmi_ops_new_server(struct qmi_handle *qmi_hdl,
3059 struct qmi_service *service)
3060 {
3061 struct ath11k_qmi *qmi = container_of(qmi_hdl, struct ath11k_qmi, handle);
3062 struct ath11k_base *ab = qmi->ab;
3063 struct sockaddr_qrtr *sq = &qmi->sq;
3064 int ret;
3065
3066 sq->sq_family = AF_QIPCRTR;
3067 sq->sq_node = service->node;
3068 sq->sq_port = service->port;
3069
3070 ret = kernel_connect(qmi_hdl->sock, (struct sockaddr *)sq,
3071 sizeof(*sq), 0);
3072 if (ret) {
3073 ath11k_warn(ab, "failed to connect to qmi remote service: %d\n", ret);
3074 return ret;
3075 }
3076
3077 ath11k_dbg(ab, ATH11K_DBG_QMI, "qmi wifi fw qmi service connected\n");
3078 ath11k_qmi_driver_event_post(qmi, ATH11K_QMI_EVENT_SERVER_ARRIVE, NULL);
3079
3080 return ret;
3081 }
3082
3083 static void ath11k_qmi_ops_del_server(struct qmi_handle *qmi_hdl,
3084 struct qmi_service *service)
3085 {
3086 struct ath11k_qmi *qmi = container_of(qmi_hdl, struct ath11k_qmi, handle);
3087 struct ath11k_base *ab = qmi->ab;
3088
3089 ath11k_dbg(ab, ATH11K_DBG_QMI, "qmi wifi fw del server\n");
3090 ath11k_qmi_driver_event_post(qmi, ATH11K_QMI_EVENT_SERVER_EXIT, NULL);
3091 }
3092
3093 static const struct qmi_ops ath11k_qmi_ops = {
3094 .new_server = ath11k_qmi_ops_new_server,
3095 .del_server = ath11k_qmi_ops_del_server,
3096 };
3097
3098 static void ath11k_qmi_driver_event_work(struct work_struct *work)
3099 {
3100 struct ath11k_qmi *qmi = container_of(work, struct ath11k_qmi,
3101 event_work);
3102 struct ath11k_qmi_driver_event *event;
3103 struct ath11k_base *ab = qmi->ab;
3104 int ret;
3105
3106 spin_lock(&qmi->event_lock);
3107 while (!list_empty(&qmi->event_list)) {
3108 event = list_first_entry(&qmi->event_list,
3109 struct ath11k_qmi_driver_event, list);
3110 list_del(&event->list);
3111 spin_unlock(&qmi->event_lock);
3112
3113 if (test_bit(ATH11K_FLAG_UNREGISTERING, &ab->dev_flags)) {
3114 kfree(event);
3115 return;
3116 }
3117
3118 switch (event->type) {
3119 case ATH11K_QMI_EVENT_SERVER_ARRIVE:
3120 ret = ath11k_qmi_event_server_arrive(qmi);
3121 if (ret < 0)
3122 set_bit(ATH11K_FLAG_QMI_FAIL, &ab->dev_flags);
3123 break;
3124 case ATH11K_QMI_EVENT_SERVER_EXIT:
3125 set_bit(ATH11K_FLAG_CRASH_FLUSH, &ab->dev_flags);
3126 set_bit(ATH11K_FLAG_RECOVERY, &ab->dev_flags);
3127 break;
3128 case ATH11K_QMI_EVENT_REQUEST_MEM:
3129 ret = ath11k_qmi_event_mem_request(qmi);
3130 if (ret < 0)
3131 set_bit(ATH11K_FLAG_QMI_FAIL, &ab->dev_flags);
3132 break;
3133 case ATH11K_QMI_EVENT_FW_MEM_READY:
3134 ret = ath11k_qmi_event_load_bdf(qmi);
3135 if (ret < 0) {
3136 set_bit(ATH11K_FLAG_QMI_FAIL, &ab->dev_flags);
3137 break;
3138 }
3139
3140 ret = ath11k_qmi_wlanfw_m3_info_send(ab);
3141 if (ret < 0) {
3142 ath11k_warn(ab,
3143 "failed to send qmi m3 info req: %d\n", ret);
3144 set_bit(ATH11K_FLAG_QMI_FAIL, &ab->dev_flags);
3145 }
3146
3147 break;
3148 case ATH11K_QMI_EVENT_FW_READY:
3149 clear_bit(ATH11K_FLAG_QMI_FAIL, &ab->dev_flags);
3150 if (test_bit(ATH11K_FLAG_REGISTERED, &ab->dev_flags)) {
3151 ath11k_hal_dump_srng_stats(ab);
3152 queue_work(ab->workqueue, &ab->restart_work);
3153 break;
3154 }
3155
3156 if (ath11k_cold_boot_cal && ab->qmi.cal_done == 0 &&
3157 ab->hw_params.cold_boot_calib) {
3158 ath11k_qmi_process_coldboot_calibration(ab);
3159 } else {
3160 clear_bit(ATH11K_FLAG_CRASH_FLUSH,
3161 &ab->dev_flags);
3162 clear_bit(ATH11K_FLAG_RECOVERY, &ab->dev_flags);
3163 ret = ath11k_core_qmi_firmware_ready(ab);
3164 if (ret) {
3165 set_bit(ATH11K_FLAG_QMI_FAIL, &ab->dev_flags);
3166 break;
3167 }
3168 set_bit(ATH11K_FLAG_REGISTERED, &ab->dev_flags);
3169 }
3170
3171 break;
3172 case ATH11K_QMI_EVENT_COLD_BOOT_CAL_DONE:
3173 break;
3174 default:
3175 ath11k_warn(ab, "invalid qmi event type: %d", event->type);
3176 break;
3177 }
3178 kfree(event);
3179 spin_lock(&qmi->event_lock);
3180 }
3181 spin_unlock(&qmi->event_lock);
3182 }
3183
3184 int ath11k_qmi_init_service(struct ath11k_base *ab)
3185 {
3186 int ret;
3187
3188 memset(&ab->qmi.target, 0, sizeof(struct target_info));
3189 memset(&ab->qmi.target_mem, 0, sizeof(struct target_mem_chunk));
3190 ab->qmi.ab = ab;
3191
3192 ab->qmi.target_mem_mode = ab->hw_params.fw_mem_mode;
3193 ret = qmi_handle_init(&ab->qmi.handle, ATH11K_QMI_RESP_LEN_MAX,
3194 &ath11k_qmi_ops, ath11k_qmi_msg_handlers);
3195 if (ret < 0) {
3196 ath11k_warn(ab, "failed to initialize qmi handle: %d\n", ret);
3197 return ret;
3198 }
3199
3200 ab->qmi.event_wq = alloc_workqueue("ath11k_qmi_driver_event",
3201 WQ_UNBOUND, 1);
3202 if (!ab->qmi.event_wq) {
3203 ath11k_err(ab, "failed to allocate workqueue\n");
3204 return -EFAULT;
3205 }
3206
3207 INIT_LIST_HEAD(&ab->qmi.event_list);
3208 spin_lock_init(&ab->qmi.event_lock);
3209 INIT_WORK(&ab->qmi.event_work, ath11k_qmi_driver_event_work);
3210
3211 ret = qmi_add_lookup(&ab->qmi.handle, ATH11K_QMI_WLFW_SERVICE_ID_V01,
3212 ATH11K_QMI_WLFW_SERVICE_VERS_V01,
3213 ab->qmi.service_ins_id);
3214 if (ret < 0) {
3215 ath11k_warn(ab, "failed to add qmi lookup: %d\n", ret);
3216 destroy_workqueue(ab->qmi.event_wq);
3217 return ret;
3218 }
3219
3220 return ret;
3221 }
3222
3223 void ath11k_qmi_deinit_service(struct ath11k_base *ab)
3224 {
3225 qmi_handle_release(&ab->qmi.handle);
3226 cancel_work_sync(&ab->qmi.event_work);
3227 destroy_workqueue(ab->qmi.event_wq);
3228 ath11k_qmi_m3_free(ab);
3229 ath11k_qmi_free_target_mem_chunk(ab);
3230 }
3231 EXPORT_SYMBOL(ath11k_qmi_deinit_service);
3232
3233 void ath11k_qmi_free_resource(struct ath11k_base *ab)
3234 {
3235 ath11k_qmi_free_target_mem_chunk(ab);
3236 ath11k_qmi_m3_free(ab);
3237 }