diff options
author | Eran Harary <eran.harary@intel.com> | 2014-05-11 01:11:34 -0400 |
---|---|---|
committer | Emmanuel Grumbach <emmanuel.grumbach@intel.com> | 2014-05-14 04:35:49 -0400 |
commit | 91479b64c9f1b35cf3c2a3a284380117db1598ee (patch) | |
tree | 7d709a5df114fcd54594c3417853d4e4dc75339b /drivers/net/wireless/iwlwifi | |
parent | 1a095d30d1a4aa6249715a92c20327f6b7cefb56 (diff) |
iwlwifi: allow dynamic configuration of internal memory
New transport need to configure internal memory based on
the data in the (enlarged) alive notification from the
firmware. Add a transport API for this.
Signed-off-by: Eran Harary <eran.harary@intel.com>
Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
Diffstat (limited to 'drivers/net/wireless/iwlwifi')
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-fw.h | 5 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-trans.h | 13 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/mvm/fw.c | 11 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/mvm/mvm.h | 1 |
4 files changed, 30 insertions, 0 deletions
diff --git a/drivers/net/wireless/iwlwifi/iwl-fw.h b/drivers/net/wireless/iwlwifi/iwl-fw.h index 6fea27c0dd8e..d5ed1500afd5 100644 --- a/drivers/net/wireless/iwlwifi/iwl-fw.h +++ b/drivers/net/wireless/iwlwifi/iwl-fw.h | |||
@@ -196,6 +196,11 @@ struct fw_img { | |||
196 | bool is_dual_cpus; | 196 | bool is_dual_cpus; |
197 | }; | 197 | }; |
198 | 198 | ||
199 | struct iwl_sf_region { | ||
200 | u32 addr; | ||
201 | u32 size; | ||
202 | }; | ||
203 | |||
199 | /* uCode version contains 4 values: Major/Minor/API/Serial */ | 204 | /* uCode version contains 4 values: Major/Minor/API/Serial */ |
200 | #define IWL_UCODE_MAJOR(ver) (((ver) & 0xFF000000) >> 24) | 205 | #define IWL_UCODE_MAJOR(ver) (((ver) & 0xFF000000) >> 24) |
201 | #define IWL_UCODE_MINOR(ver) (((ver) & 0x00FF0000) >> 16) | 206 | #define IWL_UCODE_MINOR(ver) (((ver) & 0x00FF0000) >> 16) |
diff --git a/drivers/net/wireless/iwlwifi/iwl-trans.h b/drivers/net/wireless/iwlwifi/iwl-trans.h index c57d3666e05c..34d49e171fb4 100644 --- a/drivers/net/wireless/iwlwifi/iwl-trans.h +++ b/drivers/net/wireless/iwlwifi/iwl-trans.h | |||
@@ -473,6 +473,8 @@ struct iwl_trans_ops { | |||
473 | void (*op_mode_leave)(struct iwl_trans *iwl_trans); | 473 | void (*op_mode_leave)(struct iwl_trans *iwl_trans); |
474 | int (*start_fw)(struct iwl_trans *trans, const struct fw_img *fw, | 474 | int (*start_fw)(struct iwl_trans *trans, const struct fw_img *fw, |
475 | bool run_in_rfkill); | 475 | bool run_in_rfkill); |
476 | int (*update_sf)(struct iwl_trans *trans, | ||
477 | struct iwl_sf_region *st_fwrd_space); | ||
476 | void (*fw_alive)(struct iwl_trans *trans, u32 scd_addr); | 478 | void (*fw_alive)(struct iwl_trans *trans, u32 scd_addr); |
477 | void (*stop_device)(struct iwl_trans *trans); | 479 | void (*stop_device)(struct iwl_trans *trans); |
478 | 480 | ||
@@ -636,6 +638,17 @@ static inline int iwl_trans_start_fw(struct iwl_trans *trans, | |||
636 | return trans->ops->start_fw(trans, fw, run_in_rfkill); | 638 | return trans->ops->start_fw(trans, fw, run_in_rfkill); |
637 | } | 639 | } |
638 | 640 | ||
641 | static inline int iwl_trans_update_sf(struct iwl_trans *trans, | ||
642 | struct iwl_sf_region *st_fwrd_space) | ||
643 | { | ||
644 | might_sleep(); | ||
645 | |||
646 | if (trans->ops->update_sf) | ||
647 | return trans->ops->update_sf(trans, st_fwrd_space); | ||
648 | |||
649 | return 0; | ||
650 | } | ||
651 | |||
639 | static inline void iwl_trans_stop_device(struct iwl_trans *trans) | 652 | static inline void iwl_trans_stop_device(struct iwl_trans *trans) |
640 | { | 653 | { |
641 | might_sleep(); | 654 | might_sleep(); |
diff --git a/drivers/net/wireless/iwlwifi/mvm/fw.c b/drivers/net/wireless/iwlwifi/mvm/fw.c index 2cb72656f587..883e702152d5 100644 --- a/drivers/net/wireless/iwlwifi/mvm/fw.c +++ b/drivers/net/wireless/iwlwifi/mvm/fw.c | |||
@@ -137,6 +137,8 @@ static bool iwl_alive_fn(struct iwl_notif_wait_data *notif_wait, | |||
137 | alive_data->scd_base_addr = le32_to_cpu(palive2->scd_base_ptr); | 137 | alive_data->scd_base_addr = le32_to_cpu(palive2->scd_base_ptr); |
138 | mvm->umac_error_event_table = | 138 | mvm->umac_error_event_table = |
139 | le32_to_cpu(palive2->error_info_addr); | 139 | le32_to_cpu(palive2->error_info_addr); |
140 | mvm->sf_space.addr = le32_to_cpu(palive2->st_fwrd_addr); | ||
141 | mvm->sf_space.size = le32_to_cpu(palive2->st_fwrd_size); | ||
140 | 142 | ||
141 | alive_data->valid = le16_to_cpu(palive2->status) == | 143 | alive_data->valid = le16_to_cpu(palive2->status) == |
142 | IWL_ALIVE_STATUS_OK; | 144 | IWL_ALIVE_STATUS_OK; |
@@ -180,6 +182,7 @@ static int iwl_mvm_load_ucode_wait_alive(struct iwl_mvm *mvm, | |||
180 | int ret, i; | 182 | int ret, i; |
181 | enum iwl_ucode_type old_type = mvm->cur_ucode; | 183 | enum iwl_ucode_type old_type = mvm->cur_ucode; |
182 | static const u8 alive_cmd[] = { MVM_ALIVE }; | 184 | static const u8 alive_cmd[] = { MVM_ALIVE }; |
185 | struct iwl_sf_region st_fwrd_space; | ||
183 | 186 | ||
184 | fw = iwl_get_ucode_image(mvm, ucode_type); | 187 | fw = iwl_get_ucode_image(mvm, ucode_type); |
185 | if (WARN_ON(!fw)) | 188 | if (WARN_ON(!fw)) |
@@ -215,6 +218,14 @@ static int iwl_mvm_load_ucode_wait_alive(struct iwl_mvm *mvm, | |||
215 | return -EIO; | 218 | return -EIO; |
216 | } | 219 | } |
217 | 220 | ||
221 | /* | ||
222 | * update the sdio allocation according to the pointer we get in the | ||
223 | * alive notification. | ||
224 | */ | ||
225 | st_fwrd_space.addr = mvm->sf_space.addr; | ||
226 | st_fwrd_space.size = mvm->sf_space.size; | ||
227 | ret = iwl_trans_update_sf(mvm->trans, &st_fwrd_space); | ||
228 | |||
218 | iwl_trans_fw_alive(mvm->trans, alive_data.scd_base_addr); | 229 | iwl_trans_fw_alive(mvm->trans, alive_data.scd_base_addr); |
219 | 230 | ||
220 | /* | 231 | /* |
diff --git a/drivers/net/wireless/iwlwifi/mvm/mvm.h b/drivers/net/wireless/iwlwifi/mvm/mvm.h index a7d27fb37044..5d2effb4832a 100644 --- a/drivers/net/wireless/iwlwifi/mvm/mvm.h +++ b/drivers/net/wireless/iwlwifi/mvm/mvm.h | |||
@@ -490,6 +490,7 @@ struct iwl_mvm { | |||
490 | u32 log_event_table; | 490 | u32 log_event_table; |
491 | u32 umac_error_event_table; | 491 | u32 umac_error_event_table; |
492 | bool support_umac_log; | 492 | bool support_umac_log; |
493 | struct iwl_sf_region sf_space; | ||
493 | 494 | ||
494 | u32 ampdu_ref; | 495 | u32 ampdu_ref; |
495 | 496 | ||