Lines Matching +full:segment +full:- +full:gpios

1 // SPDX-License-Identifier: BSD-3-Clause-Clear
3 * Copyright (c) 2018-2019 The Linux Foundation. All rights reserved.
4 * Copyright (c) 2021-2024 Qualcomm Innovation Center, Inc. All rights reserved.
94 gpios),
1721 req.mem_cfg_mode = ab->qmi.target_mem_mode; in ath11k_qmi_host_cap_send()
1726 if (ab->hw_params.m3_fw_support) { in ath11k_qmi_host_cap_send()
1739 req.cal_done = ab->qmi.cal_done; in ath11k_qmi_host_cap_send()
1741 if (ab->hw_params.internal_sleep_clock) { in ath11k_qmi_host_cap_send()
1744 /* Notify firmware that this is non-qualcomm platform. */ in ath11k_qmi_host_cap_send()
1749 * non-qualcomm platforms should select internal sleep in ath11k_qmi_host_cap_send()
1755 if (ab->hw_params.global_reset) in ath11k_qmi_host_cap_send()
1762 ret = qmi_txn_init(&ab->qmi.handle, &txn, in ath11k_qmi_host_cap_send()
1767 ret = qmi_send_request(&ab->qmi.handle, NULL, &txn, in ath11k_qmi_host_cap_send()
1784 ret = -EINVAL; in ath11k_qmi_host_cap_send()
1796 struct qmi_handle *handle = &ab->qmi.handle; in ath11k_qmi_fw_ind_register_send()
1802 return -ENOMEM; in ath11k_qmi_fw_ind_register_send()
1806 ret = -ENOMEM; in ath11k_qmi_fw_ind_register_send()
1810 req->client_id_valid = 1; in ath11k_qmi_fw_ind_register_send()
1811 req->client_id = QMI_WLANFW_CLIENT_ID; in ath11k_qmi_fw_ind_register_send()
1812 req->fw_ready_enable_valid = 1; in ath11k_qmi_fw_ind_register_send()
1813 req->fw_ready_enable = 1; in ath11k_qmi_fw_ind_register_send()
1814 req->cal_done_enable_valid = 1; in ath11k_qmi_fw_ind_register_send()
1815 req->cal_done_enable = 1; in ath11k_qmi_fw_ind_register_send()
1816 req->fw_init_done_enable_valid = 1; in ath11k_qmi_fw_ind_register_send()
1817 req->fw_init_done_enable = 1; in ath11k_qmi_fw_ind_register_send()
1819 req->pin_connect_result_enable_valid = 0; in ath11k_qmi_fw_ind_register_send()
1820 req->pin_connect_result_enable = 0; in ath11k_qmi_fw_ind_register_send()
1826 if (!ab->hw_params.fixed_fw_mem) { in ath11k_qmi_fw_ind_register_send()
1827 req->request_mem_enable_valid = 1; in ath11k_qmi_fw_ind_register_send()
1828 req->request_mem_enable = 1; in ath11k_qmi_fw_ind_register_send()
1829 req->fw_mem_ready_enable_valid = 1; in ath11k_qmi_fw_ind_register_send()
1830 req->fw_mem_ready_enable = 1; in ath11k_qmi_fw_ind_register_send()
1840 ret = qmi_send_request(&ab->qmi.handle, NULL, &txn, in ath11k_qmi_fw_ind_register_send()
1857 if (resp->resp.result != QMI_RESULT_SUCCESS_V01) { in ath11k_qmi_fw_ind_register_send()
1859 resp->resp.result, resp->resp.error); in ath11k_qmi_fw_ind_register_send()
1860 ret = -EINVAL; in ath11k_qmi_fw_ind_register_send()
1881 return -ENOMEM; in ath11k_qmi_respond_fw_mem_request()
1890 if (!(ab->hw_params.fixed_mem_region || in ath11k_qmi_respond_fw_mem_request()
1891 test_bit(ATH11K_FLAG_FIXED_MEM_RGN, &ab->dev_flags)) && in ath11k_qmi_respond_fw_mem_request()
1892 ab->qmi.target_mem_delayed) { in ath11k_qmi_respond_fw_mem_request()
1895 ab->qmi.mem_seg_count); in ath11k_qmi_respond_fw_mem_request()
1899 req->mem_seg_len = ab->qmi.mem_seg_count; in ath11k_qmi_respond_fw_mem_request()
1901 for (i = 0; i < req->mem_seg_len ; i++) { in ath11k_qmi_respond_fw_mem_request()
1902 req->mem_seg[i].addr = ab->qmi.target_mem[i].paddr; in ath11k_qmi_respond_fw_mem_request()
1903 req->mem_seg[i].size = ab->qmi.target_mem[i].size; in ath11k_qmi_respond_fw_mem_request()
1904 req->mem_seg[i].type = ab->qmi.target_mem[i].type; in ath11k_qmi_respond_fw_mem_request()
1907 &ab->qmi.target_mem[i].paddr, in ath11k_qmi_respond_fw_mem_request()
1908 ab->qmi.target_mem[i].size, in ath11k_qmi_respond_fw_mem_request()
1909 ab->qmi.target_mem[i].type); in ath11k_qmi_respond_fw_mem_request()
1913 ret = qmi_txn_init(&ab->qmi.handle, &txn, in ath11k_qmi_respond_fw_mem_request()
1921 ret = qmi_send_request(&ab->qmi.handle, NULL, &txn, in ath11k_qmi_respond_fw_mem_request()
1947 ret = -EINVAL; in ath11k_qmi_respond_fw_mem_request()
1959 for (i = 0; i < ab->qmi.mem_seg_count; i++) { in ath11k_qmi_free_target_mem_chunk()
1960 if (!ab->qmi.target_mem[i].anyaddr) in ath11k_qmi_free_target_mem_chunk()
1963 if (ab->hw_params.fixed_mem_region || in ath11k_qmi_free_target_mem_chunk()
1964 test_bit(ATH11K_FLAG_FIXED_MEM_RGN, &ab->dev_flags)) { in ath11k_qmi_free_target_mem_chunk()
1965 iounmap(ab->qmi.target_mem[i].iaddr); in ath11k_qmi_free_target_mem_chunk()
1966 ab->qmi.target_mem[i].iaddr = NULL; in ath11k_qmi_free_target_mem_chunk()
1970 dma_free_coherent(ab->dev, in ath11k_qmi_free_target_mem_chunk()
1971 ab->qmi.target_mem[i].prev_size, in ath11k_qmi_free_target_mem_chunk()
1972 ab->qmi.target_mem[i].vaddr, in ath11k_qmi_free_target_mem_chunk()
1973 ab->qmi.target_mem[i].paddr); in ath11k_qmi_free_target_mem_chunk()
1974 ab->qmi.target_mem[i].vaddr = NULL; in ath11k_qmi_free_target_mem_chunk()
1983 ab->qmi.target_mem_delayed = false; in ath11k_qmi_alloc_target_mem_chunk()
1985 for (i = 0; i < ab->qmi.mem_seg_count; i++) { in ath11k_qmi_alloc_target_mem_chunk()
1986 chunk = &ab->qmi.target_mem[i]; in ath11k_qmi_alloc_target_mem_chunk()
1991 if (chunk->vaddr) { in ath11k_qmi_alloc_target_mem_chunk()
1992 if (chunk->prev_type == chunk->type && in ath11k_qmi_alloc_target_mem_chunk()
1993 chunk->prev_size == chunk->size) in ath11k_qmi_alloc_target_mem_chunk()
1997 dma_free_coherent(ab->dev, chunk->prev_size, in ath11k_qmi_alloc_target_mem_chunk()
1998 chunk->vaddr, chunk->paddr); in ath11k_qmi_alloc_target_mem_chunk()
1999 chunk->vaddr = NULL; in ath11k_qmi_alloc_target_mem_chunk()
2002 chunk->vaddr = dma_alloc_coherent(ab->dev, in ath11k_qmi_alloc_target_mem_chunk()
2003 chunk->size, in ath11k_qmi_alloc_target_mem_chunk()
2004 &chunk->paddr, in ath11k_qmi_alloc_target_mem_chunk()
2006 if (!chunk->vaddr) { in ath11k_qmi_alloc_target_mem_chunk()
2007 if (ab->qmi.mem_seg_count <= ATH11K_QMI_FW_MEM_REQ_SEGMENT_CNT) { in ath11k_qmi_alloc_target_mem_chunk()
2010 chunk->size, in ath11k_qmi_alloc_target_mem_chunk()
2011 chunk->type); in ath11k_qmi_alloc_target_mem_chunk()
2013 ab->qmi.target_mem_delayed = true; in ath11k_qmi_alloc_target_mem_chunk()
2018 chunk->size, in ath11k_qmi_alloc_target_mem_chunk()
2019 chunk->type); in ath11k_qmi_alloc_target_mem_chunk()
2020 return -EINVAL; in ath11k_qmi_alloc_target_mem_chunk()
2022 chunk->prev_type = chunk->type; in ath11k_qmi_alloc_target_mem_chunk()
2023 chunk->prev_size = chunk->size; in ath11k_qmi_alloc_target_mem_chunk()
2031 struct device *dev = ab->dev; in ath11k_qmi_assign_target_mem_chunk()
2037 for (i = 0, idx = 0; i < ab->qmi.mem_seg_count; i++) { in ath11k_qmi_assign_target_mem_chunk()
2038 switch (ab->qmi.target_mem[i].type) { in ath11k_qmi_assign_target_mem_chunk()
2040 hremote_node = of_parse_phandle(dev->of_node, "memory-region", 0); in ath11k_qmi_assign_target_mem_chunk()
2044 return -ENODEV; in ath11k_qmi_assign_target_mem_chunk()
2055 if (res.end - res.start + 1 < ab->qmi.target_mem[i].size) { in ath11k_qmi_assign_target_mem_chunk()
2058 return -EINVAL; in ath11k_qmi_assign_target_mem_chunk()
2061 ab->qmi.target_mem[idx].paddr = res.start; in ath11k_qmi_assign_target_mem_chunk()
2062 ab->qmi.target_mem[idx].iaddr = in ath11k_qmi_assign_target_mem_chunk()
2063 ioremap(ab->qmi.target_mem[idx].paddr, in ath11k_qmi_assign_target_mem_chunk()
2064 ab->qmi.target_mem[i].size); in ath11k_qmi_assign_target_mem_chunk()
2065 if (!ab->qmi.target_mem[idx].iaddr) in ath11k_qmi_assign_target_mem_chunk()
2066 return -EIO; in ath11k_qmi_assign_target_mem_chunk()
2068 ab->qmi.target_mem[idx].size = ab->qmi.target_mem[i].size; in ath11k_qmi_assign_target_mem_chunk()
2069 host_ddr_sz = ab->qmi.target_mem[i].size; in ath11k_qmi_assign_target_mem_chunk()
2070 ab->qmi.target_mem[idx].type = ab->qmi.target_mem[i].type; in ath11k_qmi_assign_target_mem_chunk()
2074 ab->qmi.target_mem[idx].paddr = ab->hw_params.bdf_addr; in ath11k_qmi_assign_target_mem_chunk()
2075 ab->qmi.target_mem[idx].iaddr = NULL; in ath11k_qmi_assign_target_mem_chunk()
2076 ab->qmi.target_mem[idx].size = ab->qmi.target_mem[i].size; in ath11k_qmi_assign_target_mem_chunk()
2077 ab->qmi.target_mem[idx].type = ab->qmi.target_mem[i].type; in ath11k_qmi_assign_target_mem_chunk()
2081 if (ab->qmi.target_mem[i].size > ATH11K_QMI_CALDB_SIZE) { in ath11k_qmi_assign_target_mem_chunk()
2083 return -EINVAL; in ath11k_qmi_assign_target_mem_chunk()
2088 ab->qmi.target_mem[idx].paddr = in ath11k_qmi_assign_target_mem_chunk()
2090 ab->qmi.target_mem[idx].iaddr = in ath11k_qmi_assign_target_mem_chunk()
2091 ioremap(ab->qmi.target_mem[idx].paddr, in ath11k_qmi_assign_target_mem_chunk()
2092 ab->qmi.target_mem[i].size); in ath11k_qmi_assign_target_mem_chunk()
2093 if (!ab->qmi.target_mem[idx].iaddr) in ath11k_qmi_assign_target_mem_chunk()
2094 return -EIO; in ath11k_qmi_assign_target_mem_chunk()
2096 ab->qmi.target_mem[idx].paddr = in ath11k_qmi_assign_target_mem_chunk()
2098 ab->qmi.target_mem[idx].iaddr = NULL; in ath11k_qmi_assign_target_mem_chunk()
2101 ab->qmi.target_mem[idx].paddr = 0; in ath11k_qmi_assign_target_mem_chunk()
2102 ab->qmi.target_mem[idx].iaddr = NULL; in ath11k_qmi_assign_target_mem_chunk()
2104 ab->qmi.target_mem[idx].size = ab->qmi.target_mem[i].size; in ath11k_qmi_assign_target_mem_chunk()
2105 ab->qmi.target_mem[idx].type = ab->qmi.target_mem[i].type; in ath11k_qmi_assign_target_mem_chunk()
2110 ab->qmi.target_mem[i].type); in ath11k_qmi_assign_target_mem_chunk()
2114 ab->qmi.mem_seg_count = idx; in ath11k_qmi_assign_target_mem_chunk()
2128 if (!ab->hw_params.hybrid_bus_type) in ath11k_qmi_request_device_info()
2131 ret = qmi_txn_init(&ab->qmi.handle, &txn, in ath11k_qmi_request_device_info()
2136 ret = qmi_send_request(&ab->qmi.handle, NULL, &txn, in ath11k_qmi_request_device_info()
2157 ret = -EINVAL; in ath11k_qmi_request_device_info()
2164 ret = -EINVAL; in ath11k_qmi_request_device_info()
2172 ret = -EINVAL; in ath11k_qmi_request_device_info()
2176 bar_addr_va = devm_ioremap(ab->dev, resp.bar_addr, resp.bar_size); in ath11k_qmi_request_device_info()
2180 ab->mem_len = 0; in ath11k_qmi_request_device_info()
2181 ret = -EIO; in ath11k_qmi_request_device_info()
2185 ab->mem = bar_addr_va; in ath11k_qmi_request_device_info()
2186 ab->mem_len = resp.bar_size; in ath11k_qmi_request_device_info()
2188 if (!ab->hw_params.ce_remap) in ath11k_qmi_request_device_info()
2189 ab->mem_ce = ab->mem; in ath11k_qmi_request_device_info()
2209 ret = qmi_txn_init(&ab->qmi.handle, &txn, qmi_wlanfw_cap_resp_msg_v01_ei, in ath11k_qmi_request_target_cap()
2216 ret = qmi_send_request(&ab->qmi.handle, NULL, &txn, in ath11k_qmi_request_target_cap()
2236 ret = -EINVAL; in ath11k_qmi_request_target_cap()
2241 ab->qmi.target.chip_id = resp.chip_info.chip_id; in ath11k_qmi_request_target_cap()
2242 ab->qmi.target.chip_family = resp.chip_info.chip_family; in ath11k_qmi_request_target_cap()
2246 ab->qmi.target.board_id = resp.board_info.board_id; in ath11k_qmi_request_target_cap()
2248 ab->qmi.target.board_id = 0xFF; in ath11k_qmi_request_target_cap()
2251 ab->qmi.target.soc_id = resp.soc_info.soc_id; in ath11k_qmi_request_target_cap()
2254 ab->qmi.target.fw_version = resp.fw_version_info.fw_version; in ath11k_qmi_request_target_cap()
2255 strscpy(ab->qmi.target.fw_build_timestamp, in ath11k_qmi_request_target_cap()
2257 sizeof(ab->qmi.target.fw_build_timestamp)); in ath11k_qmi_request_target_cap()
2261 strscpy(ab->qmi.target.fw_build_id, resp.fw_build_id, in ath11k_qmi_request_target_cap()
2262 sizeof(ab->qmi.target.fw_build_id)); in ath11k_qmi_request_target_cap()
2265 ab->qmi.target.eeprom_caldata = in ath11k_qmi_request_target_cap()
2270 fw_build_id = ab->qmi.target.fw_build_id; in ath11k_qmi_request_target_cap()
2276 ab->qmi.target.chip_id, ab->qmi.target.chip_family, in ath11k_qmi_request_target_cap()
2277 ab->qmi.target.board_id, ab->qmi.target.soc_id); in ath11k_qmi_request_target_cap()
2280 ab->qmi.target.fw_version, in ath11k_qmi_request_target_cap()
2281 ab->qmi.target.fw_build_timestamp, in ath11k_qmi_request_target_cap()
2309 return -ENOMEM; in ath11k_qmi_load_file_target_mem()
2313 if (ab->hw_params.fixed_bdf_addr) { in ath11k_qmi_load_file_target_mem()
2314 bdf_addr = ioremap(ab->hw_params.bdf_addr, ab->hw_params.fw.board_size); in ath11k_qmi_load_file_target_mem()
2317 ret = -EIO; in ath11k_qmi_load_file_target_mem()
2323 req->valid = 1; in ath11k_qmi_load_file_target_mem()
2324 req->file_id_valid = 1; in ath11k_qmi_load_file_target_mem()
2325 req->file_id = ab->qmi.target.board_id; in ath11k_qmi_load_file_target_mem()
2326 req->total_size_valid = 1; in ath11k_qmi_load_file_target_mem()
2327 req->total_size = remaining; in ath11k_qmi_load_file_target_mem()
2328 req->seg_id_valid = 1; in ath11k_qmi_load_file_target_mem()
2329 req->data_valid = 1; in ath11k_qmi_load_file_target_mem()
2330 req->bdf_type = type; in ath11k_qmi_load_file_target_mem()
2331 req->bdf_type_valid = 1; in ath11k_qmi_load_file_target_mem()
2332 req->end_valid = 1; in ath11k_qmi_load_file_target_mem()
2333 req->end = 0; in ath11k_qmi_load_file_target_mem()
2336 req->data_len = QMI_WLANFW_MAX_DATA_SIZE_V01; in ath11k_qmi_load_file_target_mem()
2338 req->data_len = remaining; in ath11k_qmi_load_file_target_mem()
2339 req->end = 1; in ath11k_qmi_load_file_target_mem()
2342 if (ab->hw_params.fixed_bdf_addr || in ath11k_qmi_load_file_target_mem()
2344 req->data_valid = 0; in ath11k_qmi_load_file_target_mem()
2345 req->end = 1; in ath11k_qmi_load_file_target_mem()
2346 req->data_len = ATH11K_QMI_MAX_BDF_FILE_NAME_SIZE; in ath11k_qmi_load_file_target_mem()
2348 memcpy(req->data, temp, req->data_len); in ath11k_qmi_load_file_target_mem()
2351 if (ab->hw_params.fixed_bdf_addr) { in ath11k_qmi_load_file_target_mem()
2353 bdf_addr += ab->hw_params.fw.cal_offset; in ath11k_qmi_load_file_target_mem()
2358 ret = qmi_txn_init(&ab->qmi.handle, &txn, in ath11k_qmi_load_file_target_mem()
2367 ret = qmi_send_request(&ab->qmi.handle, NULL, &txn, in ath11k_qmi_load_file_target_mem()
2386 ret = -EINVAL; in ath11k_qmi_load_file_target_mem()
2390 if (ab->hw_params.fixed_bdf_addr || in ath11k_qmi_load_file_target_mem()
2394 remaining -= req->data_len; in ath11k_qmi_load_file_target_mem()
2395 temp += req->data_len; in ath11k_qmi_load_file_target_mem()
2396 req->seg_id++; in ath11k_qmi_load_file_target_mem()
2403 if (ab->hw_params.fixed_bdf_addr) in ath11k_qmi_load_file_target_mem()
2415 struct device *dev = ab->dev; in ath11k_qmi_load_bdf_qmi()
2445 fw_size = min_t(u32, ab->hw_params.fw.board_size, bd.len); in ath11k_qmi_load_bdf_qmi()
2457 if (ab->qmi.target.eeprom_caldata) { in ath11k_qmi_load_bdf_qmi()
2464 /* cal-<bus>-<id>.bin */ in ath11k_qmi_load_bdf_qmi()
2465 snprintf(filename, sizeof(filename), "cal-%s-%s.bin", in ath11k_qmi_load_bdf_qmi()
2466 ath11k_bus_str(ab->hif.bus), dev_name(dev)); in ath11k_qmi_load_bdf_qmi()
2488 fw_size = min_t(u32, ab->hw_params.fw.board_size, fw_entry->size); in ath11k_qmi_load_bdf_qmi()
2489 tmp = fw_entry->data; in ath11k_qmi_load_bdf_qmi()
2501 if (!ab->qmi.target.eeprom_caldata) in ath11k_qmi_load_bdf_qmi()
2512 struct m3_mem_region *m3_mem = &ab->qmi.m3_mem; in ath11k_qmi_m3_load()
2519 if (m3_mem->vaddr) in ath11k_qmi_m3_load()
2523 if (ab->fw.m3_data && ab->fw.m3_len > 0) { in ath11k_qmi_m3_load()
2524 /* firmware-N.bin had a m3 firmware file so use that */ in ath11k_qmi_m3_load()
2525 m3_data = ab->fw.m3_data; in ath11k_qmi_m3_load()
2526 m3_len = ab->fw.m3_len; in ath11k_qmi_m3_load()
2528 /* No m3 file in firmware-N.bin so try to request old in ath11k_qmi_m3_load()
2540 m3_data = fw->data; in ath11k_qmi_m3_load()
2541 m3_len = fw->size; in ath11k_qmi_m3_load()
2544 m3_mem->vaddr = dma_alloc_coherent(ab->dev, in ath11k_qmi_m3_load()
2545 m3_len, &m3_mem->paddr, in ath11k_qmi_m3_load()
2547 if (!m3_mem->vaddr) { in ath11k_qmi_m3_load()
2549 fw->size); in ath11k_qmi_m3_load()
2550 ret = -ENOMEM; in ath11k_qmi_m3_load()
2554 memcpy(m3_mem->vaddr, m3_data, m3_len); in ath11k_qmi_m3_load()
2555 m3_mem->size = m3_len; in ath11k_qmi_m3_load()
2567 struct m3_mem_region *m3_mem = &ab->qmi.m3_mem; in ath11k_qmi_m3_free()
2569 if (!ab->hw_params.m3_fw_support || !m3_mem->vaddr) in ath11k_qmi_m3_free()
2572 dma_free_coherent(ab->dev, m3_mem->size, in ath11k_qmi_m3_free()
2573 m3_mem->vaddr, m3_mem->paddr); in ath11k_qmi_m3_free()
2574 m3_mem->vaddr = NULL; in ath11k_qmi_m3_free()
2575 m3_mem->size = 0; in ath11k_qmi_m3_free()
2582 struct m3_mem_region *m3_mem = &ab->qmi.m3_mem; in ath11k_qmi_wlanfw_m3_info_send()
2591 if (ab->hw_params.m3_fw_support) { in ath11k_qmi_wlanfw_m3_info_send()
2598 req.addr = m3_mem->paddr; in ath11k_qmi_wlanfw_m3_info_send()
2599 req.size = m3_mem->size; in ath11k_qmi_wlanfw_m3_info_send()
2605 ret = qmi_txn_init(&ab->qmi.handle, &txn, in ath11k_qmi_wlanfw_m3_info_send()
2612 ret = qmi_send_request(&ab->qmi.handle, NULL, &txn, in ath11k_qmi_wlanfw_m3_info_send()
2632 ret = -EINVAL; in ath11k_qmi_wlanfw_m3_info_send()
2654 ret = qmi_txn_init(&ab->qmi.handle, &txn, in ath11k_qmi_wlanfw_mode_send()
2661 ret = qmi_send_request(&ab->qmi.handle, NULL, &txn, in ath11k_qmi_wlanfw_mode_send()
2674 if (mode == ATH11K_FIRMWARE_MODE_OFF && ret == -ENETRESET) { in ath11k_qmi_wlanfw_mode_send()
2675 ath11k_warn(ab, "WLFW service is dis-connected\n"); in ath11k_qmi_wlanfw_mode_send()
2686 ret = -EINVAL; in ath11k_qmi_wlanfw_mode_send()
2703 ce_cfg = (struct ce_pipe_config *)ab->qmi.ce_cfg.tgt_ce; in ath11k_qmi_wlanfw_wlan_cfg_send()
2704 svc_cfg = (struct service_to_pipe *)ab->qmi.ce_cfg.svc_to_ce_map; in ath11k_qmi_wlanfw_wlan_cfg_send()
2708 return -ENOMEM; in ath11k_qmi_wlanfw_wlan_cfg_send()
2712 req->host_version_valid = 1; in ath11k_qmi_wlanfw_wlan_cfg_send()
2713 strscpy(req->host_version, ATH11K_HOST_VERSION_STRING, in ath11k_qmi_wlanfw_wlan_cfg_send()
2714 sizeof(req->host_version)); in ath11k_qmi_wlanfw_wlan_cfg_send()
2716 req->tgt_cfg_valid = 1; in ath11k_qmi_wlanfw_wlan_cfg_send()
2718 req->tgt_cfg_len = ab->qmi.ce_cfg.tgt_ce_len; in ath11k_qmi_wlanfw_wlan_cfg_send()
2719 for (pipe_num = 0; pipe_num < req->tgt_cfg_len ; pipe_num++) { in ath11k_qmi_wlanfw_wlan_cfg_send()
2720 req->tgt_cfg[pipe_num].pipe_num = ce_cfg[pipe_num].pipenum; in ath11k_qmi_wlanfw_wlan_cfg_send()
2721 req->tgt_cfg[pipe_num].pipe_dir = ce_cfg[pipe_num].pipedir; in ath11k_qmi_wlanfw_wlan_cfg_send()
2722 req->tgt_cfg[pipe_num].nentries = ce_cfg[pipe_num].nentries; in ath11k_qmi_wlanfw_wlan_cfg_send()
2723 req->tgt_cfg[pipe_num].nbytes_max = ce_cfg[pipe_num].nbytes_max; in ath11k_qmi_wlanfw_wlan_cfg_send()
2724 req->tgt_cfg[pipe_num].flags = ce_cfg[pipe_num].flags; in ath11k_qmi_wlanfw_wlan_cfg_send()
2727 req->svc_cfg_valid = 1; in ath11k_qmi_wlanfw_wlan_cfg_send()
2729 req->svc_cfg_len = ab->qmi.ce_cfg.svc_to_ce_map_len; in ath11k_qmi_wlanfw_wlan_cfg_send()
2730 for (pipe_num = 0; pipe_num < req->svc_cfg_len; pipe_num++) { in ath11k_qmi_wlanfw_wlan_cfg_send()
2731 req->svc_cfg[pipe_num].service_id = svc_cfg[pipe_num].service_id; in ath11k_qmi_wlanfw_wlan_cfg_send()
2732 req->svc_cfg[pipe_num].pipe_dir = svc_cfg[pipe_num].pipedir; in ath11k_qmi_wlanfw_wlan_cfg_send()
2733 req->svc_cfg[pipe_num].pipe_num = svc_cfg[pipe_num].pipenum; in ath11k_qmi_wlanfw_wlan_cfg_send()
2735 req->shadow_reg_valid = 0; in ath11k_qmi_wlanfw_wlan_cfg_send()
2738 if (ab->hw_params.supports_shadow_regs) { in ath11k_qmi_wlanfw_wlan_cfg_send()
2739 req->shadow_reg_v2_valid = 1; in ath11k_qmi_wlanfw_wlan_cfg_send()
2740 req->shadow_reg_v2_len = min_t(u32, in ath11k_qmi_wlanfw_wlan_cfg_send()
2741 ab->qmi.ce_cfg.shadow_reg_v2_len, in ath11k_qmi_wlanfw_wlan_cfg_send()
2743 memcpy(&req->shadow_reg_v2, ab->qmi.ce_cfg.shadow_reg_v2, in ath11k_qmi_wlanfw_wlan_cfg_send()
2744 sizeof(u32) * req->shadow_reg_v2_len); in ath11k_qmi_wlanfw_wlan_cfg_send()
2746 req->shadow_reg_v2_valid = 0; in ath11k_qmi_wlanfw_wlan_cfg_send()
2749 ret = qmi_txn_init(&ab->qmi.handle, &txn, in ath11k_qmi_wlanfw_wlan_cfg_send()
2756 ret = qmi_send_request(&ab->qmi.handle, NULL, &txn, in ath11k_qmi_wlanfw_wlan_cfg_send()
2776 ret = -EINVAL; in ath11k_qmi_wlanfw_wlan_cfg_send()
2795 ret = qmi_txn_init(&ab->qmi.handle, &txn, in ath11k_qmi_wlanfw_wlan_ini_send()
2800 ret = qmi_send_request(&ab->qmi.handle, NULL, &txn, in ath11k_qmi_wlanfw_wlan_ini_send()
2820 ret = -EINVAL; in ath11k_qmi_wlanfw_wlan_ini_send()
2847 if (ab->hw_params.fw_wmi_diag_event) { in ath11k_qmi_firmware_start()
2875 ab->hw_params.cbcal_restart_fw == 0) in ath11k_qmi_fwreset_from_cold_boot()
2880 time_left = wait_event_timeout(ab->qmi.cold_boot_waitq, in ath11k_qmi_fwreset_from_cold_boot()
2881 (ab->qmi.cal_done == 1), in ath11k_qmi_fwreset_from_cold_boot()
2886 return -ETIMEDOUT; in ath11k_qmi_fwreset_from_cold_boot()
2910 time_left = wait_event_timeout(ab->qmi.cold_boot_waitq, in ath11k_qmi_process_coldboot_calibration()
2911 (ab->qmi.cal_done == 1), in ath11k_qmi_process_coldboot_calibration()
2932 return -ENOMEM; in ath11k_qmi_driver_event_post()
2934 event->type = type; in ath11k_qmi_driver_event_post()
2935 event->data = data; in ath11k_qmi_driver_event_post()
2937 spin_lock(&qmi->event_lock); in ath11k_qmi_driver_event_post()
2938 list_add_tail(&event->list, &qmi->event_list); in ath11k_qmi_driver_event_post()
2939 spin_unlock(&qmi->event_lock); in ath11k_qmi_driver_event_post()
2941 queue_work(qmi->event_wq, &qmi->event_work); in ath11k_qmi_driver_event_post()
2948 struct ath11k_base *ab = qmi->ab; in ath11k_qmi_event_mem_request()
2962 struct ath11k_base *ab = qmi->ab; in ath11k_qmi_event_load_bdf()
2978 if (ab->hw_params.supports_regdb) in ath11k_qmi_event_load_bdf()
2992 struct ath11k_base *ab = qmi->ab; in ath11k_qmi_event_server_arrive()
3008 if (!ab->hw_params.fixed_fw_mem) in ath11k_qmi_event_server_arrive()
3026 struct ath11k_base *ab = qmi->ab; in ath11k_qmi_msg_mem_request_cb()
3032 if (msg->mem_seg_len == 0 || in ath11k_qmi_msg_mem_request_cb()
3033 msg->mem_seg_len > ATH11K_QMI_WLANFW_MAX_NUM_MEM_SEG_V01) in ath11k_qmi_msg_mem_request_cb()
3034 ath11k_warn(ab, "invalid memory segment length: %u\n", in ath11k_qmi_msg_mem_request_cb()
3035 msg->mem_seg_len); in ath11k_qmi_msg_mem_request_cb()
3037 ab->qmi.mem_seg_count = msg->mem_seg_len; in ath11k_qmi_msg_mem_request_cb()
3039 for (i = 0; i < qmi->mem_seg_count ; i++) { in ath11k_qmi_msg_mem_request_cb()
3040 ab->qmi.target_mem[i].type = msg->mem_seg[i].type; in ath11k_qmi_msg_mem_request_cb()
3041 ab->qmi.target_mem[i].size = msg->mem_seg[i].size; in ath11k_qmi_msg_mem_request_cb()
3043 msg->mem_seg[i].type, msg->mem_seg[i].size); in ath11k_qmi_msg_mem_request_cb()
3046 if (ab->hw_params.fixed_mem_region || in ath11k_qmi_msg_mem_request_cb()
3047 test_bit(ATH11K_FLAG_FIXED_MEM_RGN, &ab->dev_flags)) { in ath11k_qmi_msg_mem_request_cb()
3072 struct ath11k_base *ab = qmi->ab; in ath11k_qmi_msg_mem_ready_cb()
3084 struct ath11k_base *ab = qmi->ab; in ath11k_qmi_msg_fw_ready_cb()
3088 if (!ab->qmi.cal_done) { in ath11k_qmi_msg_fw_ready_cb()
3089 ab->qmi.cal_done = 1; in ath11k_qmi_msg_fw_ready_cb()
3090 wake_up(&ab->qmi.cold_boot_waitq); in ath11k_qmi_msg_fw_ready_cb()
3103 struct ath11k_base *ab = qmi->ab; in ath11k_qmi_msg_cold_boot_cal_done_cb()
3105 ab->qmi.cal_done = 1; in ath11k_qmi_msg_cold_boot_cal_done_cb()
3106 wake_up(&ab->qmi.cold_boot_waitq); in ath11k_qmi_msg_cold_boot_cal_done_cb()
3117 struct ath11k_base *ab = qmi->ab; in ath11k_qmi_msg_fw_init_done_cb()
3170 struct ath11k_base *ab = qmi->ab; in ath11k_qmi_ops_new_server()
3171 struct sockaddr_qrtr *sq = &qmi->sq; in ath11k_qmi_ops_new_server()
3174 sq->sq_family = AF_QIPCRTR; in ath11k_qmi_ops_new_server()
3175 sq->sq_node = service->node; in ath11k_qmi_ops_new_server()
3176 sq->sq_port = service->port; in ath11k_qmi_ops_new_server()
3178 ret = kernel_connect(qmi_hdl->sock, (struct sockaddr *)sq, in ath11k_qmi_ops_new_server()
3195 struct ath11k_base *ab = qmi->ab; in ath11k_qmi_ops_del_server()
3211 struct ath11k_base *ab = qmi->ab; in ath11k_qmi_driver_event_work()
3214 spin_lock(&qmi->event_lock); in ath11k_qmi_driver_event_work()
3215 while (!list_empty(&qmi->event_list)) { in ath11k_qmi_driver_event_work()
3216 event = list_first_entry(&qmi->event_list, in ath11k_qmi_driver_event_work()
3218 list_del(&event->list); in ath11k_qmi_driver_event_work()
3219 spin_unlock(&qmi->event_lock); in ath11k_qmi_driver_event_work()
3221 if (test_bit(ATH11K_FLAG_UNREGISTERING, &ab->dev_flags)) { in ath11k_qmi_driver_event_work()
3226 switch (event->type) { in ath11k_qmi_driver_event_work()
3230 set_bit(ATH11K_FLAG_QMI_FAIL, &ab->dev_flags); in ath11k_qmi_driver_event_work()
3233 set_bit(ATH11K_FLAG_CRASH_FLUSH, &ab->dev_flags); in ath11k_qmi_driver_event_work()
3234 set_bit(ATH11K_FLAG_RECOVERY, &ab->dev_flags); in ath11k_qmi_driver_event_work()
3236 if (!ab->is_reset) in ath11k_qmi_driver_event_work()
3242 set_bit(ATH11K_FLAG_QMI_FAIL, &ab->dev_flags); in ath11k_qmi_driver_event_work()
3247 set_bit(ATH11K_FLAG_QMI_FAIL, &ab->dev_flags); in ath11k_qmi_driver_event_work()
3255 set_bit(ATH11K_FLAG_QMI_FAIL, &ab->dev_flags); in ath11k_qmi_driver_event_work()
3260 clear_bit(ATH11K_FLAG_QMI_FAIL, &ab->dev_flags); in ath11k_qmi_driver_event_work()
3261 if (test_bit(ATH11K_FLAG_REGISTERED, &ab->dev_flags)) { in ath11k_qmi_driver_event_work()
3262 if (ab->is_reset) in ath11k_qmi_driver_event_work()
3264 queue_work(ab->workqueue, &ab->restart_work); in ath11k_qmi_driver_event_work()
3268 if (ab->qmi.cal_done == 0 && in ath11k_qmi_driver_event_work()
3273 &ab->dev_flags); in ath11k_qmi_driver_event_work()
3274 clear_bit(ATH11K_FLAG_RECOVERY, &ab->dev_flags); in ath11k_qmi_driver_event_work()
3277 set_bit(ATH11K_FLAG_QMI_FAIL, &ab->dev_flags); in ath11k_qmi_driver_event_work()
3280 set_bit(ATH11K_FLAG_REGISTERED, &ab->dev_flags); in ath11k_qmi_driver_event_work()
3290 if (ab->hw_params.cbcal_restart_fw) in ath11k_qmi_driver_event_work()
3294 &ab->dev_flags); in ath11k_qmi_driver_event_work()
3295 clear_bit(ATH11K_FLAG_RECOVERY, &ab->dev_flags); in ath11k_qmi_driver_event_work()
3297 set_bit(ATH11K_FLAG_REGISTERED, &ab->dev_flags); in ath11k_qmi_driver_event_work()
3303 ath11k_warn(ab, "invalid qmi event type: %d", event->type); in ath11k_qmi_driver_event_work()
3307 spin_lock(&qmi->event_lock); in ath11k_qmi_driver_event_work()
3309 spin_unlock(&qmi->event_lock); in ath11k_qmi_driver_event_work()
3316 memset(&ab->qmi.target, 0, sizeof(struct target_info)); in ath11k_qmi_init_service()
3317 memset(&ab->qmi.target_mem, 0, sizeof(struct target_mem_chunk)); in ath11k_qmi_init_service()
3318 ab->qmi.ab = ab; in ath11k_qmi_init_service()
3320 ab->qmi.target_mem_mode = ab->hw_params.fw_mem_mode; in ath11k_qmi_init_service()
3321 ret = qmi_handle_init(&ab->qmi.handle, ATH11K_QMI_RESP_LEN_MAX, in ath11k_qmi_init_service()
3328 ab->qmi.event_wq = alloc_ordered_workqueue("ath11k_qmi_driver_event", 0); in ath11k_qmi_init_service()
3329 if (!ab->qmi.event_wq) { in ath11k_qmi_init_service()
3331 return -EFAULT; in ath11k_qmi_init_service()
3334 INIT_LIST_HEAD(&ab->qmi.event_list); in ath11k_qmi_init_service()
3335 spin_lock_init(&ab->qmi.event_lock); in ath11k_qmi_init_service()
3336 INIT_WORK(&ab->qmi.event_work, ath11k_qmi_driver_event_work); in ath11k_qmi_init_service()
3338 ret = qmi_add_lookup(&ab->qmi.handle, ATH11K_QMI_WLFW_SERVICE_ID_V01, in ath11k_qmi_init_service()
3340 ab->qmi.service_ins_id); in ath11k_qmi_init_service()
3343 destroy_workqueue(ab->qmi.event_wq); in ath11k_qmi_init_service()
3352 qmi_handle_release(&ab->qmi.handle); in ath11k_qmi_deinit_service()
3353 cancel_work_sync(&ab->qmi.event_work); in ath11k_qmi_deinit_service()
3354 destroy_workqueue(ab->qmi.event_wq); in ath11k_qmi_deinit_service()