if (!dram->paging) {
WARN_ON(dram->paging_cnt); return;
}
/* free paging*/ for (i = 0; i < dram->paging_cnt; i++)
dma_free_coherent(trans->dev, dram->paging[i].size,
dram->paging[i].block,
dram->paging[i].physical);
int iwl_pcie_init_fw_sec(struct iwl_trans *trans, conststruct fw_img *fw, struct iwl_context_info_dram_nonfseq *ctxt_dram)
{ struct iwl_self_init_dram *dram = &trans->init_dram; int i, ret, lmac_cnt, umac_cnt, paging_cnt;
if (WARN(dram->paging, "paging shouldn't already be initialized (%d pages)\n",
dram->paging_cnt))
iwl_pcie_ctxt_info_free_paging(trans);
lmac_cnt = iwl_pcie_get_num_sections(fw, 0); /* add 1 due to separator */
umac_cnt = iwl_pcie_get_num_sections(fw, lmac_cnt + 1); /* add 2 due to separators */
paging_cnt = iwl_pcie_get_num_sections(fw, lmac_cnt + umac_cnt + 2);
dram->fw = kcalloc(umac_cnt + lmac_cnt, sizeof(*dram->fw), GFP_KERNEL); if (!dram->fw) return -ENOMEM;
dram->paging = kcalloc(paging_cnt, sizeof(*dram->paging), GFP_KERNEL); if (!dram->paging) return -ENOMEM;
/* initialize lmac sections */ for (i = 0; i < lmac_cnt; i++) {
ret = iwl_pcie_ctxt_info_alloc_dma(trans, fw->sec[i].data,
fw->sec[i].len,
&dram->fw[dram->fw_cnt]); if (ret) return ret;
ctxt_dram->lmac_img[i] =
cpu_to_le64(dram->fw[dram->fw_cnt].physical);
dram->fw_cnt++;
}
/* initialize umac sections */ for (i = 0; i < umac_cnt; i++) { /* access FW with +1 to make up for lmac separator */
ret = iwl_pcie_ctxt_info_alloc_dma(trans,
fw->sec[dram->fw_cnt + 1].data,
fw->sec[dram->fw_cnt + 1].len,
&dram->fw[dram->fw_cnt]); if (ret) return ret;
ctxt_dram->umac_img[i] =
cpu_to_le64(dram->fw[dram->fw_cnt].physical);
dram->fw_cnt++;
}
/* * Initialize paging. * Paging memory isn't stored in dram->fw as the umac and lmac - it is * stored separately. * This is since the timing of its release is different - * while fw memory can be released on alive, the paging memory can be * freed only when the device goes down. * Given that, the logic here in accessing the fw image is a bit * different - fw_cnt isn't changing so loop counter is added to it.
*/ for (i = 0; i < paging_cnt; i++) { /* access FW with +2 to make up for lmac & umac separators */ int fw_idx = dram->fw_cnt + i + 2;
ret = iwl_pcie_ctxt_info_alloc_dma(trans, fw->sec[fw_idx].data,
fw->sec[fw_idx].len,
&dram->paging[i]); if (ret) return ret;
/* allocate ucode sections in dram and set addresses */
ret = iwl_pcie_init_fw_sec(trans, img, &ctxt_info->dram); if (ret) {
dma_free_coherent(trans->dev, sizeof(*trans_pcie->ctxt_info),
ctxt_info, trans_pcie->ctxt_info_dma_addr); return ret;
}
trans_pcie->ctxt_info = ctxt_info;
iwl_enable_fw_load_int_ctx_info(trans, false);
/* Configure debug, if exists */ if (iwl_pcie_dbg_on(trans))
iwl_pcie_apply_destination(trans);
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.