Skip to content

Commit d975d72

Browse files
sara-slucacoelho
authored andcommitted
iwlwifi: mvm: support new paging command format
For a000 devices there is a support of 64 bit DMA addressing. The paging command was changed accordingly - support it. Signed-off-by: Sara Sharon <sara.sharon@intel.com> Signed-off-by: Luca Coelho <luciano.coelho@intel.com>
1 parent 8e160ab commit d975d72

File tree

3 files changed

+32
-10
lines changed

3 files changed

+32
-10
lines changed

drivers/net/wireless/intel/iwlwifi/mvm/fw-api.h

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -482,13 +482,17 @@ struct iwl_nvm_access_cmd {
482482
* @block_size: the block size in powers of 2
483483
* @block_num: number of blocks specified in the command.
484484
* @device_phy_addr: virtual addresses from device side
485+
* 32 bit address for API version 1, 64 bit address for API version 2.
485486
*/
486487
struct iwl_fw_paging_cmd {
487488
__le32 flags;
488489
__le32 block_size;
489490
__le32 block_num;
490-
__le32 device_phy_addr[NUM_OF_FW_PAGING_BLOCKS];
491-
} __packed; /* FW_PAGING_BLOCK_CMD_API_S_VER_1 */
491+
union {
492+
__le32 addr32[NUM_OF_FW_PAGING_BLOCKS];
493+
__le64 addr64[NUM_OF_FW_PAGING_BLOCKS];
494+
} device_phy_addr;
495+
} __packed; /* FW_PAGING_BLOCK_CMD_API_S_VER_2 */
492496

493497
/*
494498
* Fw items ID's

drivers/net/wireless/intel/iwlwifi/mvm/fw.c

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -385,9 +385,7 @@ static int iwl_save_fw_paging(struct iwl_mvm *mvm,
385385
/* send paging cmd to FW in case CPU2 has paging image */
386386
static int iwl_send_paging_cmd(struct iwl_mvm *mvm, const struct fw_img *fw)
387387
{
388-
int blk_idx;
389-
__le32 dev_phy_addr;
390-
struct iwl_fw_paging_cmd fw_paging_cmd = {
388+
struct iwl_fw_paging_cmd paging_cmd = {
391389
.flags =
392390
cpu_to_le32(PAGING_CMD_IS_SECURED |
393391
PAGING_CMD_IS_ENABLED |
@@ -396,18 +394,32 @@ static int iwl_send_paging_cmd(struct iwl_mvm *mvm, const struct fw_img *fw)
396394
.block_size = cpu_to_le32(BLOCK_2_EXP_SIZE),
397395
.block_num = cpu_to_le32(mvm->num_of_paging_blk),
398396
};
397+
int blk_idx, size = sizeof(paging_cmd);
398+
399+
/* A bit hard coded - but this is the old API and will be deprecated */
400+
if (!iwl_mvm_has_new_tx_api(mvm))
401+
size -= NUM_OF_FW_PAGING_BLOCKS * 4;
399402

400403
/* loop for for all paging blocks + CSS block */
401404
for (blk_idx = 0; blk_idx < mvm->num_of_paging_blk + 1; blk_idx++) {
402-
dev_phy_addr =
403-
cpu_to_le32(mvm->fw_paging_db[blk_idx].fw_paging_phys >>
404-
PAGE_2_EXP_SIZE);
405-
fw_paging_cmd.device_phy_addr[blk_idx] = dev_phy_addr;
405+
dma_addr_t addr = mvm->fw_paging_db[blk_idx].fw_paging_phys;
406+
407+
addr = addr >> PAGE_2_EXP_SIZE;
408+
409+
if (iwl_mvm_has_new_tx_api(mvm)) {
410+
__le64 phy_addr = cpu_to_le64(addr);
411+
412+
paging_cmd.device_phy_addr.addr64[blk_idx] = phy_addr;
413+
} else {
414+
__le32 phy_addr = cpu_to_le32(addr);
415+
416+
paging_cmd.device_phy_addr.addr32[blk_idx] = phy_addr;
417+
}
406418
}
407419

408420
return iwl_mvm_send_cmd_pdu(mvm, iwl_cmd_id(FW_PAGING_BLOCK_CMD,
409421
IWL_ALWAYS_LONG_GROUP, 0),
410-
0, sizeof(fw_paging_cmd), &fw_paging_cmd);
422+
0, size, &paging_cmd);
411423
}
412424

413425
/*

drivers/net/wireless/intel/iwlwifi/mvm/mvm.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1192,6 +1192,12 @@ static inline bool iwl_mvm_has_new_rx_api(struct iwl_mvm *mvm)
11921192
IWL_UCODE_TLV_CAPA_MULTI_QUEUE_RX_SUPPORT);
11931193
}
11941194

1195+
static inline bool iwl_mvm_has_new_tx_api(struct iwl_mvm *mvm)
1196+
{
1197+
/* TODO - replace with TLV once defined */
1198+
return mvm->trans->cfg->use_tfh;
1199+
}
1200+
11951201
static inline bool iwl_mvm_is_tt_in_fw(struct iwl_mvm *mvm)
11961202
{
11971203
#ifdef CONFIG_THERMAL

0 commit comments

Comments
 (0)