diff options
author | Sara Sharon <sara.sharon@intel.com> | 2016-07-04 04:52:07 -0400 |
---|---|---|
committer | Luca Coelho <luciano.coelho@intel.com> | 2016-08-29 16:39:42 -0400 |
commit | d975d72016bb2540eff3018c3c0dd96688711748 (patch) | |
tree | 94b1878376d887df15948599b7cc03cc010ab22a /drivers/net/wireless/intel | |
parent | 8e160ab83a32a16cd45d82778aca1ec3e51b802b (diff) |
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>
Diffstat (limited to 'drivers/net/wireless/intel')
-rw-r--r-- | drivers/net/wireless/intel/iwlwifi/mvm/fw-api.h | 8 | ||||
-rw-r--r-- | drivers/net/wireless/intel/iwlwifi/mvm/fw.c | 28 | ||||
-rw-r--r-- | drivers/net/wireless/intel/iwlwifi/mvm/mvm.h | 6 |
3 files changed, 32 insertions, 10 deletions
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/fw-api.h b/drivers/net/wireless/intel/iwlwifi/mvm/fw-api.h index 71076f02796e..57b574b2a092 100644 --- a/drivers/net/wireless/intel/iwlwifi/mvm/fw-api.h +++ b/drivers/net/wireless/intel/iwlwifi/mvm/fw-api.h | |||
@@ -482,13 +482,17 @@ struct iwl_nvm_access_cmd { | |||
482 | * @block_size: the block size in powers of 2 | 482 | * @block_size: the block size in powers of 2 |
483 | * @block_num: number of blocks specified in the command. | 483 | * @block_num: number of blocks specified in the command. |
484 | * @device_phy_addr: virtual addresses from device side | 484 | * @device_phy_addr: virtual addresses from device side |
485 | * 32 bit address for API version 1, 64 bit address for API version 2. | ||
485 | */ | 486 | */ |
486 | struct iwl_fw_paging_cmd { | 487 | struct iwl_fw_paging_cmd { |
487 | __le32 flags; | 488 | __le32 flags; |
488 | __le32 block_size; | 489 | __le32 block_size; |
489 | __le32 block_num; | 490 | __le32 block_num; |
490 | __le32 device_phy_addr[NUM_OF_FW_PAGING_BLOCKS]; | 491 | union { |
491 | } __packed; /* FW_PAGING_BLOCK_CMD_API_S_VER_1 */ | 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 */ | ||
492 | 496 | ||
493 | /* | 497 | /* |
494 | * Fw items ID's | 498 | * Fw items ID's |
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/fw.c b/drivers/net/wireless/intel/iwlwifi/mvm/fw.c index 7e0cdbf8bf74..47e8e70dcfac 100644 --- a/drivers/net/wireless/intel/iwlwifi/mvm/fw.c +++ b/drivers/net/wireless/intel/iwlwifi/mvm/fw.c | |||
@@ -385,9 +385,7 @@ static int iwl_save_fw_paging(struct iwl_mvm *mvm, | |||
385 | /* send paging cmd to FW in case CPU2 has paging image */ | 385 | /* send paging cmd to FW in case CPU2 has paging image */ |
386 | static int iwl_send_paging_cmd(struct iwl_mvm *mvm, const struct fw_img *fw) | 386 | static int iwl_send_paging_cmd(struct iwl_mvm *mvm, const struct fw_img *fw) |
387 | { | 387 | { |
388 | int blk_idx; | 388 | struct iwl_fw_paging_cmd paging_cmd = { |
389 | __le32 dev_phy_addr; | ||
390 | struct iwl_fw_paging_cmd fw_paging_cmd = { | ||
391 | .flags = | 389 | .flags = |
392 | cpu_to_le32(PAGING_CMD_IS_SECURED | | 390 | cpu_to_le32(PAGING_CMD_IS_SECURED | |
393 | PAGING_CMD_IS_ENABLED | | 391 | PAGING_CMD_IS_ENABLED | |
@@ -396,18 +394,32 @@ static int iwl_send_paging_cmd(struct iwl_mvm *mvm, const struct fw_img *fw) | |||
396 | .block_size = cpu_to_le32(BLOCK_2_EXP_SIZE), | 394 | .block_size = cpu_to_le32(BLOCK_2_EXP_SIZE), |
397 | .block_num = cpu_to_le32(mvm->num_of_paging_blk), | 395 | .block_num = cpu_to_le32(mvm->num_of_paging_blk), |
398 | }; | 396 | }; |
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; | ||
399 | 402 | ||
400 | /* loop for for all paging blocks + CSS block */ | 403 | /* loop for for all paging blocks + CSS block */ |
401 | for (blk_idx = 0; blk_idx < mvm->num_of_paging_blk + 1; blk_idx++) { | 404 | for (blk_idx = 0; blk_idx < mvm->num_of_paging_blk + 1; blk_idx++) { |
402 | dev_phy_addr = | 405 | dma_addr_t addr = mvm->fw_paging_db[blk_idx].fw_paging_phys; |
403 | cpu_to_le32(mvm->fw_paging_db[blk_idx].fw_paging_phys >> | 406 | |
404 | PAGE_2_EXP_SIZE); | 407 | addr = addr >> PAGE_2_EXP_SIZE; |
405 | fw_paging_cmd.device_phy_addr[blk_idx] = dev_phy_addr; | 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 | } | ||
406 | } | 418 | } |
407 | 419 | ||
408 | return iwl_mvm_send_cmd_pdu(mvm, iwl_cmd_id(FW_PAGING_BLOCK_CMD, | 420 | return iwl_mvm_send_cmd_pdu(mvm, iwl_cmd_id(FW_PAGING_BLOCK_CMD, |
409 | IWL_ALWAYS_LONG_GROUP, 0), | 421 | IWL_ALWAYS_LONG_GROUP, 0), |
410 | 0, sizeof(fw_paging_cmd), &fw_paging_cmd); | 422 | 0, size, &paging_cmd); |
411 | } | 423 | } |
412 | 424 | ||
413 | /* | 425 | /* |
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/mvm.h b/drivers/net/wireless/intel/iwlwifi/mvm/mvm.h index 0b0855ae092e..28ebc12f1fe0 100644 --- a/drivers/net/wireless/intel/iwlwifi/mvm/mvm.h +++ b/drivers/net/wireless/intel/iwlwifi/mvm/mvm.h | |||
@@ -1192,6 +1192,12 @@ static inline bool iwl_mvm_has_new_rx_api(struct iwl_mvm *mvm) | |||
1192 | IWL_UCODE_TLV_CAPA_MULTI_QUEUE_RX_SUPPORT); | 1192 | IWL_UCODE_TLV_CAPA_MULTI_QUEUE_RX_SUPPORT); |
1193 | } | 1193 | } |
1194 | 1194 | ||
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 | |||
1195 | static inline bool iwl_mvm_is_tt_in_fw(struct iwl_mvm *mvm) | 1201 | static inline bool iwl_mvm_is_tt_in_fw(struct iwl_mvm *mvm) |
1196 | { | 1202 | { |
1197 | #ifdef CONFIG_THERMAL | 1203 | #ifdef CONFIG_THERMAL |