FILE
smem.c
File preview with syntax highlighting.
linux-6.19.14/drivers/net/wireless/intel/iwlwifi/fw/smem.c
1// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause 2/* 3 * Copyright (C) 2012-2014, 2018-2021, 2025 Intel Corporation 4 * Copyright (C) 2013-2015 Intel Mobile Communications GmbH 5 * Copyright (C) 2016-2017 Intel Deutschland GmbH 6 */ 7#include "iwl-drv.h" 8#include "runtime.h" 9#include "dbg.h" 10#include "fw/api/commands.h" 11 12static void iwl_parse_shared_mem_22000(struct iwl_fw_runtime *fwrt, 13 struct iwl_rx_packet *pkt) 14{ 15 struct iwl_shared_mem_cfg *mem_cfg = (void *)pkt->data; 16 int i, lmac; 17 int lmac_num = le32_to_cpu(mem_cfg->lmac_num); 18 u8 api_ver = iwl_fw_lookup_notif_ver(fwrt->fw, SYSTEM_GROUP, 19 SHARED_MEM_CFG_CMD, 0); 20 21 /* Note: notification has 3 entries, but we only expect 2 */ 22 if (IWL_FW_CHECK(fwrt, lmac_num > ARRAY_SIZE(fwrt->smem_cfg.lmac), 23 "FW advertises %d LMACs\n", lmac_num)) 24 return; 25 26 fwrt->smem_cfg.num_lmacs = lmac_num; 27 fwrt->smem_cfg.num_txfifo_entries = 28 ARRAY_SIZE(mem_cfg->lmac_smem[0].txfifo_size); 29 fwrt->smem_cfg.rxfifo2_size = le32_to_cpu(mem_cfg->rxfifo2_size); 30 31 if (api_ver >= 4 && 32 !IWL_FW_CHECK(fwrt, iwl_rx_packet_payload_len(pkt) < sizeof(*mem_cfg), 33 "bad shared mem notification size\n")) { 34 fwrt->smem_cfg.rxfifo2_control_size = 35 le32_to_cpu(mem_cfg->rxfifo2_control_size); 36 } 37 38 for (lmac = 0; lmac < lmac_num; lmac++) { 39 struct iwl_shared_mem_lmac_cfg *lmac_cfg = 40 &mem_cfg->lmac_smem[lmac]; 41 42 for (i = 0; i < ARRAY_SIZE(lmac_cfg->txfifo_size); i++) 43 fwrt->smem_cfg.lmac[lmac].txfifo_size[i] = 44 le32_to_cpu(lmac_cfg->txfifo_size[i]); 45 fwrt->smem_cfg.lmac[lmac].rxfifo1_size = 46 le32_to_cpu(lmac_cfg->rxfifo1_size); 47 } 48} 49 50static void iwl_parse_shared_mem(struct iwl_fw_runtime *fwrt, 51 struct iwl_rx_packet *pkt) 52{ 53 struct iwl_shared_mem_cfg_v2 *mem_cfg = (void *)pkt->data; 54 int i; 55 56 fwrt->smem_cfg.num_lmacs = 1; 57 58 fwrt->smem_cfg.num_txfifo_entries = ARRAY_SIZE(mem_cfg->txfifo_size); 59 for (i = 0; i < ARRAY_SIZE(mem_cfg->txfifo_size); i++) 60 fwrt->smem_cfg.lmac[0].txfifo_size[i] = 61 le32_to_cpu(mem_cfg->txfifo_size[i]); 62 63 fwrt->smem_cfg.lmac[0].rxfifo1_size = 64 le32_to_cpu(mem_cfg->rxfifo_size[0]); 65 fwrt->smem_cfg.rxfifo2_size = le32_to_cpu(mem_cfg->rxfifo_size[1]); 66 67 /* new API has more data, from rxfifo_addr field and on */ 68 if (fw_has_capa(&fwrt->fw->ucode_capa, 69 IWL_UCODE_TLV_CAPA_EXTEND_SHARED_MEM_CFG)) { 70 BUILD_BUG_ON(sizeof(fwrt->smem_cfg.internal_txfifo_size) != 71 sizeof(mem_cfg->internal_txfifo_size)); 72 73 fwrt->smem_cfg.internal_txfifo_addr = 74 le32_to_cpu(mem_cfg->internal_txfifo_addr); 75 76 for (i = 0; 77 i < ARRAY_SIZE(fwrt->smem_cfg.internal_txfifo_size); 78 i++) 79 fwrt->smem_cfg.internal_txfifo_size[i] = 80 le32_to_cpu(mem_cfg->internal_txfifo_size[i]); 81 } 82} 83 84void iwl_get_shared_mem_conf(struct iwl_fw_runtime *fwrt) 85{ 86 struct iwl_host_cmd cmd = { 87 .flags = CMD_WANT_SKB, 88 .data = { NULL, }, 89 .len = { 0, }, 90 }; 91 struct iwl_rx_packet *pkt; 92 int ret; 93 94 if (fw_has_capa(&fwrt->fw->ucode_capa, 95 IWL_UCODE_TLV_CAPA_EXTEND_SHARED_MEM_CFG)) 96 cmd.id = WIDE_ID(SYSTEM_GROUP, SHARED_MEM_CFG_CMD); 97 else 98 cmd.id = SHARED_MEM_CFG; 99 100 ret = iwl_trans_send_cmd(fwrt->trans, &cmd); 101 102 if (ret) { 103 WARN(ret != -ERFKILL, 104 "Could not send the SMEM command: %d\n", ret); 105 return; 106 } 107 108 pkt = cmd.resp_pkt; 109 if (fwrt->trans->mac_cfg->device_family >= IWL_DEVICE_FAMILY_22000) 110 iwl_parse_shared_mem_22000(fwrt, pkt); 111 else 112 iwl_parse_shared_mem(fwrt, pkt); 113 114 IWL_DEBUG_INFO(fwrt, "SHARED MEM CFG: got memory offsets/sizes\n"); 115 116 iwl_free_resp(&cmd); 117} 118IWL_EXPORT_SYMBOL(iwl_get_shared_mem_conf);
~/
Read-only file preview.