aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/iwlwifi
diff options
context:
space:
mode:
authorEran Harary <eran.harary@intel.com>2014-05-11 01:11:34 -0400
committerEmmanuel Grumbach <emmanuel.grumbach@intel.com>2014-05-14 04:35:49 -0400
commit91479b64c9f1b35cf3c2a3a284380117db1598ee (patch)
tree7d709a5df114fcd54594c3417853d4e4dc75339b /drivers/net/wireless/iwlwifi
parent1a095d30d1a4aa6249715a92c20327f6b7cefb56 (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.h5
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-trans.h13
-rw-r--r--drivers/net/wireless/iwlwifi/mvm/fw.c11
-rw-r--r--drivers/net/wireless/iwlwifi/mvm/mvm.h1
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
199struct 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
641static 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
639static inline void iwl_trans_stop_device(struct iwl_trans *trans) 652static 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