aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/intel
diff options
context:
space:
mode:
authorSara Sharon <sara.sharon@intel.com>2016-07-04 04:52:07 -0400
committerLuca Coelho <luciano.coelho@intel.com>2016-08-29 16:39:42 -0400
commitd975d72016bb2540eff3018c3c0dd96688711748 (patch)
tree94b1878376d887df15948599b7cc03cc010ab22a /drivers/net/wireless/intel
parent8e160ab83a32a16cd45d82778aca1ec3e51b802b (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.h8
-rw-r--r--drivers/net/wireless/intel/iwlwifi/mvm/fw.c28
-rw-r--r--drivers/net/wireless/intel/iwlwifi/mvm/mvm.h6
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*/
486struct iwl_fw_paging_cmd { 487struct 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 */
386static int iwl_send_paging_cmd(struct iwl_mvm *mvm, const struct fw_img *fw) 386static 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
1195static 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
1195static inline bool iwl_mvm_is_tt_in_fw(struct iwl_mvm *mvm) 1201static inline bool iwl_mvm_is_tt_in_fw(struct iwl_mvm *mvm)
1196{ 1202{
1197#ifdef CONFIG_THERMAL 1203#ifdef CONFIG_THERMAL