|
@@ -838,59 +838,48 @@ out:
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
-static void iwl_mvm_get_shared_mem_conf(struct iwl_mvm *mvm)
|
|
|
+static void iwl_mvm_parse_shared_mem_a000(struct iwl_mvm *mvm,
|
|
|
+ struct iwl_rx_packet *pkt)
|
|
|
{
|
|
|
- struct iwl_host_cmd cmd = {
|
|
|
- .flags = CMD_WANT_SKB,
|
|
|
- .data = { NULL, },
|
|
|
- .len = { 0, },
|
|
|
- };
|
|
|
- struct iwl_shared_mem_cfg *mem_cfg;
|
|
|
- struct iwl_rx_packet *pkt;
|
|
|
- u32 i;
|
|
|
+ struct iwl_shared_mem_cfg *mem_cfg = (void *)pkt->data;
|
|
|
+ int i;
|
|
|
|
|
|
- lockdep_assert_held(&mvm->mutex);
|
|
|
+ mvm->shared_mem_cfg.num_txfifo_entries =
|
|
|
+ ARRAY_SIZE(mvm->shared_mem_cfg.txfifo_size);
|
|
|
+ for (i = 0; i < ARRAY_SIZE(mem_cfg->txfifo_size); i++)
|
|
|
+ mvm->shared_mem_cfg.txfifo_size[i] =
|
|
|
+ le32_to_cpu(mem_cfg->txfifo_size[i]);
|
|
|
+ for (i = 0; i < ARRAY_SIZE(mvm->shared_mem_cfg.rxfifo_size); i++)
|
|
|
+ mvm->shared_mem_cfg.rxfifo_size[i] =
|
|
|
+ le32_to_cpu(mem_cfg->rxfifo_size[i]);
|
|
|
|
|
|
- if (fw_has_capa(&mvm->fw->ucode_capa,
|
|
|
- IWL_UCODE_TLV_CAPA_EXTEND_SHARED_MEM_CFG))
|
|
|
- cmd.id = iwl_cmd_id(SHARED_MEM_CFG_CMD, SYSTEM_GROUP, 0);
|
|
|
- else
|
|
|
- cmd.id = SHARED_MEM_CFG;
|
|
|
+ BUILD_BUG_ON(sizeof(mvm->shared_mem_cfg.internal_txfifo_size) !=
|
|
|
+ sizeof(mem_cfg->internal_txfifo_size));
|
|
|
|
|
|
- if (WARN_ON(iwl_mvm_send_cmd(mvm, &cmd)))
|
|
|
- return;
|
|
|
+ for (i = 0; i < ARRAY_SIZE(mvm->shared_mem_cfg.internal_txfifo_size);
|
|
|
+ i++)
|
|
|
+ mvm->shared_mem_cfg.internal_txfifo_size[i] =
|
|
|
+ le32_to_cpu(mem_cfg->internal_txfifo_size[i]);
|
|
|
+}
|
|
|
|
|
|
- pkt = cmd.resp_pkt;
|
|
|
- mem_cfg = (void *)pkt->data;
|
|
|
-
|
|
|
- mvm->shared_mem_cfg.shared_mem_addr =
|
|
|
- le32_to_cpu(mem_cfg->shared_mem_addr);
|
|
|
- mvm->shared_mem_cfg.shared_mem_size =
|
|
|
- le32_to_cpu(mem_cfg->shared_mem_size);
|
|
|
- mvm->shared_mem_cfg.sample_buff_addr =
|
|
|
- le32_to_cpu(mem_cfg->sample_buff_addr);
|
|
|
- mvm->shared_mem_cfg.sample_buff_size =
|
|
|
- le32_to_cpu(mem_cfg->sample_buff_size);
|
|
|
- mvm->shared_mem_cfg.txfifo_addr = le32_to_cpu(mem_cfg->txfifo_addr);
|
|
|
- for (i = 0; i < ARRAY_SIZE(mvm->shared_mem_cfg.txfifo_size); i++)
|
|
|
+static void iwl_mvm_parse_shared_mem(struct iwl_mvm *mvm,
|
|
|
+ struct iwl_rx_packet *pkt)
|
|
|
+{
|
|
|
+ struct iwl_shared_mem_cfg_v1 *mem_cfg = (void *)pkt->data;
|
|
|
+ int i;
|
|
|
+
|
|
|
+ mvm->shared_mem_cfg.num_txfifo_entries =
|
|
|
+ ARRAY_SIZE(mvm->shared_mem_cfg.txfifo_size);
|
|
|
+ for (i = 0; i < ARRAY_SIZE(mem_cfg->txfifo_size); i++)
|
|
|
mvm->shared_mem_cfg.txfifo_size[i] =
|
|
|
le32_to_cpu(mem_cfg->txfifo_size[i]);
|
|
|
for (i = 0; i < ARRAY_SIZE(mvm->shared_mem_cfg.rxfifo_size); i++)
|
|
|
mvm->shared_mem_cfg.rxfifo_size[i] =
|
|
|
le32_to_cpu(mem_cfg->rxfifo_size[i]);
|
|
|
- mvm->shared_mem_cfg.page_buff_addr =
|
|
|
- le32_to_cpu(mem_cfg->page_buff_addr);
|
|
|
- mvm->shared_mem_cfg.page_buff_size =
|
|
|
- le32_to_cpu(mem_cfg->page_buff_size);
|
|
|
|
|
|
- /* new API has more data */
|
|
|
+ /* new API has more data, from rxfifo_addr field and on */
|
|
|
if (fw_has_capa(&mvm->fw->ucode_capa,
|
|
|
IWL_UCODE_TLV_CAPA_EXTEND_SHARED_MEM_CFG)) {
|
|
|
- mvm->shared_mem_cfg.rxfifo_addr =
|
|
|
- le32_to_cpu(mem_cfg->rxfifo_addr);
|
|
|
- mvm->shared_mem_cfg.internal_txfifo_addr =
|
|
|
- le32_to_cpu(mem_cfg->internal_txfifo_addr);
|
|
|
-
|
|
|
BUILD_BUG_ON(sizeof(mvm->shared_mem_cfg.internal_txfifo_size) !=
|
|
|
sizeof(mem_cfg->internal_txfifo_size));
|
|
|
|
|
@@ -900,6 +889,33 @@ static void iwl_mvm_get_shared_mem_conf(struct iwl_mvm *mvm)
|
|
|
mvm->shared_mem_cfg.internal_txfifo_size[i] =
|
|
|
le32_to_cpu(mem_cfg->internal_txfifo_size[i]);
|
|
|
}
|
|
|
+}
|
|
|
+
|
|
|
+static void iwl_mvm_get_shared_mem_conf(struct iwl_mvm *mvm)
|
|
|
+{
|
|
|
+ struct iwl_host_cmd cmd = {
|
|
|
+ .flags = CMD_WANT_SKB,
|
|
|
+ .data = { NULL, },
|
|
|
+ .len = { 0, },
|
|
|
+ };
|
|
|
+ struct iwl_rx_packet *pkt;
|
|
|
+
|
|
|
+ lockdep_assert_held(&mvm->mutex);
|
|
|
+
|
|
|
+ if (fw_has_capa(&mvm->fw->ucode_capa,
|
|
|
+ IWL_UCODE_TLV_CAPA_EXTEND_SHARED_MEM_CFG))
|
|
|
+ cmd.id = iwl_cmd_id(SHARED_MEM_CFG_CMD, SYSTEM_GROUP, 0);
|
|
|
+ else
|
|
|
+ cmd.id = SHARED_MEM_CFG;
|
|
|
+
|
|
|
+ if (WARN_ON(iwl_mvm_send_cmd(mvm, &cmd)))
|
|
|
+ return;
|
|
|
+
|
|
|
+ pkt = cmd.resp_pkt;
|
|
|
+ if (iwl_mvm_has_new_tx_api(mvm))
|
|
|
+ iwl_mvm_parse_shared_mem_a000(mvm, pkt);
|
|
|
+ else
|
|
|
+ iwl_mvm_parse_shared_mem(mvm, pkt);
|
|
|
|
|
|
IWL_DEBUG_INFO(mvm, "SHARED MEM CFG: got memory offsets/sizes\n");
|
|
|
|