aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/iwlwifi
diff options
context:
space:
mode:
authorJohannes Berg <johannes.berg@intel.com>2012-06-13 03:01:22 -0400
committerJohannes Berg <johannes.berg@intel.com>2012-06-13 03:01:28 -0400
commit627ae3ddd6f929b4496502318a8896729fc37839 (patch)
tree269fc2ea3b49c16864e97ee6b2ed0e7530bed79a /drivers/net/wireless/iwlwifi
parent7bc057ffb5078d3e7f391ef2357f4ab01b9694e0 (diff)
parenta59f975a78f0606a3a364939dfa9b949d5f87521 (diff)
Merge remote-tracking branch 'wireless-next/master' into iwlwifi-next
Diffstat (limited to 'drivers/net/wireless/iwlwifi')
-rw-r--r--drivers/net/wireless/iwlwifi/dvm/mac80211.c3
-rw-r--r--drivers/net/wireless/iwlwifi/dvm/sta.c2
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-drv.c10
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-prph.h1
-rw-r--r--drivers/net/wireless/iwlwifi/pcie/6000.c23
-rw-r--r--drivers/net/wireless/iwlwifi/pcie/trans.c5
6 files changed, 40 insertions, 4 deletions
diff --git a/drivers/net/wireless/iwlwifi/dvm/mac80211.c b/drivers/net/wireless/iwlwifi/dvm/mac80211.c
index 7f49526222a8..9d2374862314 100644
--- a/drivers/net/wireless/iwlwifi/dvm/mac80211.c
+++ b/drivers/net/wireless/iwlwifi/dvm/mac80211.c
@@ -201,6 +201,7 @@ int iwlagn_mac_setup_register(struct iwl_priv *priv,
201 WIPHY_FLAG_DISABLE_BEACON_HINTS | 201 WIPHY_FLAG_DISABLE_BEACON_HINTS |
202 WIPHY_FLAG_IBSS_RSN; 202 WIPHY_FLAG_IBSS_RSN;
203 203
204#ifdef CONFIG_PM_SLEEP
204 if (priv->fw->img[IWL_UCODE_WOWLAN].sec[0].len && 205 if (priv->fw->img[IWL_UCODE_WOWLAN].sec[0].len &&
205 priv->trans->ops->wowlan_suspend && 206 priv->trans->ops->wowlan_suspend &&
206 device_can_wakeup(priv->trans->dev)) { 207 device_can_wakeup(priv->trans->dev)) {
@@ -219,6 +220,7 @@ int iwlagn_mac_setup_register(struct iwl_priv *priv,
219 hw->wiphy->wowlan.pattern_max_len = 220 hw->wiphy->wowlan.pattern_max_len =
220 IWLAGN_WOWLAN_MAX_PATTERN_LEN; 221 IWLAGN_WOWLAN_MAX_PATTERN_LEN;
221 } 222 }
223#endif
222 224
223 if (iwlwifi_mod_params.power_save) 225 if (iwlwifi_mod_params.power_save)
224 hw->wiphy->flags |= WIPHY_FLAG_PS_ON_BY_DEFAULT; 226 hw->wiphy->flags |= WIPHY_FLAG_PS_ON_BY_DEFAULT;
@@ -251,6 +253,7 @@ int iwlagn_mac_setup_register(struct iwl_priv *priv,
251 ret = ieee80211_register_hw(priv->hw); 253 ret = ieee80211_register_hw(priv->hw);
252 if (ret) { 254 if (ret) {
253 IWL_ERR(priv, "Failed to register hw (error %d)\n", ret); 255 IWL_ERR(priv, "Failed to register hw (error %d)\n", ret);
256 iwl_leds_exit(priv);
254 return ret; 257 return ret;
255 } 258 }
256 priv->mac80211_registered = 1; 259 priv->mac80211_registered = 1;
diff --git a/drivers/net/wireless/iwlwifi/dvm/sta.c b/drivers/net/wireless/iwlwifi/dvm/sta.c
index 286ce4e18068..b29b798f7550 100644
--- a/drivers/net/wireless/iwlwifi/dvm/sta.c
+++ b/drivers/net/wireless/iwlwifi/dvm/sta.c
@@ -1251,7 +1251,7 @@ int iwl_remove_dynamic_key(struct iwl_priv *priv,
1251 key_flags |= STA_KEY_MULTICAST_MSK; 1251 key_flags |= STA_KEY_MULTICAST_MSK;
1252 1252
1253 sta_cmd.key.key_flags = key_flags; 1253 sta_cmd.key.key_flags = key_flags;
1254 sta_cmd.key.key_offset = WEP_INVALID_OFFSET; 1254 sta_cmd.key.key_offset = keyconf->hw_key_idx;
1255 sta_cmd.sta.modify_mask = STA_MODIFY_KEY_MASK; 1255 sta_cmd.sta.modify_mask = STA_MODIFY_KEY_MASK;
1256 sta_cmd.mode = STA_CONTROL_MODIFY_MSK; 1256 sta_cmd.mode = STA_CONTROL_MODIFY_MSK;
1257 1257
diff --git a/drivers/net/wireless/iwlwifi/iwl-drv.c b/drivers/net/wireless/iwlwifi/iwl-drv.c
index 67c9668d2e37..80898bb808b5 100644
--- a/drivers/net/wireless/iwlwifi/iwl-drv.c
+++ b/drivers/net/wireless/iwlwifi/iwl-drv.c
@@ -899,7 +899,6 @@ static void iwl_ucode_callback(const struct firmware *ucode_raw, void *context)
899 899
900 /* We have our copies now, allow OS release its copies */ 900 /* We have our copies now, allow OS release its copies */
901 release_firmware(ucode_raw); 901 release_firmware(ucode_raw);
902 complete(&drv->request_firmware_complete);
903 902
904 mutex_lock(&iwlwifi_opmode_table_mtx); 903 mutex_lock(&iwlwifi_opmode_table_mtx);
905 op = &iwlwifi_opmode_table[DVM_OP_MODE]; 904 op = &iwlwifi_opmode_table[DVM_OP_MODE];
@@ -910,11 +909,20 @@ static void iwl_ucode_callback(const struct firmware *ucode_raw, void *context)
910 if (op->ops) { 909 if (op->ops) {
911 const struct iwl_op_mode_ops *ops = op->ops; 910 const struct iwl_op_mode_ops *ops = op->ops;
912 drv->op_mode = ops->start(drv->trans, drv->cfg, &drv->fw); 911 drv->op_mode = ops->start(drv->trans, drv->cfg, &drv->fw);
912
913 if (!drv->op_mode)
914 goto out_unbind;
913 } else { 915 } else {
914 request_module_nowait("%s", op->name); 916 request_module_nowait("%s", op->name);
915 } 917 }
916 mutex_unlock(&iwlwifi_opmode_table_mtx); 918 mutex_unlock(&iwlwifi_opmode_table_mtx);
917 919
920 /*
921 * Complete the firmware request last so that
922 * a driver unbind (stop) doesn't run while we
923 * are doing the start() above.
924 */
925 complete(&drv->request_firmware_complete);
918 return; 926 return;
919 927
920 try_again: 928 try_again:
diff --git a/drivers/net/wireless/iwlwifi/iwl-prph.h b/drivers/net/wireless/iwlwifi/iwl-prph.h
index a9f0415916c7..9253ef1dba72 100644
--- a/drivers/net/wireless/iwlwifi/iwl-prph.h
+++ b/drivers/net/wireless/iwlwifi/iwl-prph.h
@@ -224,6 +224,7 @@
224#define SCD_TXFACT (SCD_BASE + 0x10) 224#define SCD_TXFACT (SCD_BASE + 0x10)
225#define SCD_ACTIVE (SCD_BASE + 0x14) 225#define SCD_ACTIVE (SCD_BASE + 0x14)
226#define SCD_QUEUECHAIN_SEL (SCD_BASE + 0xe8) 226#define SCD_QUEUECHAIN_SEL (SCD_BASE + 0xe8)
227#define SCD_CHAINEXT_EN (SCD_BASE + 0x244)
227#define SCD_AGGR_SEL (SCD_BASE + 0x248) 228#define SCD_AGGR_SEL (SCD_BASE + 0x248)
228#define SCD_INTERRUPT_MASK (SCD_BASE + 0x108) 229#define SCD_INTERRUPT_MASK (SCD_BASE + 0x108)
229 230
diff --git a/drivers/net/wireless/iwlwifi/pcie/6000.c b/drivers/net/wireless/iwlwifi/pcie/6000.c
index 8dd8a6fe61e8..cb08ba03aae7 100644
--- a/drivers/net/wireless/iwlwifi/pcie/6000.c
+++ b/drivers/net/wireless/iwlwifi/pcie/6000.c
@@ -35,17 +35,20 @@
35#define IWL6000_UCODE_API_MAX 6 35#define IWL6000_UCODE_API_MAX 6
36#define IWL6050_UCODE_API_MAX 5 36#define IWL6050_UCODE_API_MAX 5
37#define IWL6000G2_UCODE_API_MAX 6 37#define IWL6000G2_UCODE_API_MAX 6
38#define IWL6035_UCODE_API_MAX 6
38 39
39/* Oldest version we won't warn about */ 40/* Oldest version we won't warn about */
40#define IWL6000_UCODE_API_OK 4 41#define IWL6000_UCODE_API_OK 4
41#define IWL6000G2_UCODE_API_OK 5 42#define IWL6000G2_UCODE_API_OK 5
42#define IWL6050_UCODE_API_OK 5 43#define IWL6050_UCODE_API_OK 5
43#define IWL6000G2B_UCODE_API_OK 6 44#define IWL6000G2B_UCODE_API_OK 6
45#define IWL6035_UCODE_API_OK 6
44 46
45/* Lowest firmware API version supported */ 47/* Lowest firmware API version supported */
46#define IWL6000_UCODE_API_MIN 4 48#define IWL6000_UCODE_API_MIN 4
47#define IWL6050_UCODE_API_MIN 4 49#define IWL6050_UCODE_API_MIN 4
48#define IWL6000G2_UCODE_API_MIN 4 50#define IWL6000G2_UCODE_API_MIN 5
51#define IWL6035_UCODE_API_MIN 6
49 52
50/* EEPROM versions */ 53/* EEPROM versions */
51#define EEPROM_6000_TX_POWER_VERSION (4) 54#define EEPROM_6000_TX_POWER_VERSION (4)
@@ -243,9 +246,25 @@ const struct iwl_cfg iwl6030_2bg_cfg = {
243 IWL_DEVICE_6030, 246 IWL_DEVICE_6030,
244}; 247};
245 248
249#define IWL_DEVICE_6035 \
250 .fw_name_pre = IWL6030_FW_PRE, \
251 .ucode_api_max = IWL6035_UCODE_API_MAX, \
252 .ucode_api_ok = IWL6035_UCODE_API_OK, \
253 .ucode_api_min = IWL6035_UCODE_API_MIN, \
254 .device_family = IWL_DEVICE_FAMILY_6030, \
255 .max_inst_size = IWL60_RTC_INST_SIZE, \
256 .max_data_size = IWL60_RTC_DATA_SIZE, \
257 .eeprom_ver = EEPROM_6030_EEPROM_VERSION, \
258 .eeprom_calib_ver = EEPROM_6030_TX_POWER_VERSION, \
259 .base_params = &iwl6000_g2_base_params, \
260 .bt_params = &iwl6000_bt_params, \
261 .need_temp_offset_calib = true, \
262 .led_mode = IWL_LED_RF_STATE, \
263 .adv_pm = true
264
246const struct iwl_cfg iwl6035_2agn_cfg = { 265const struct iwl_cfg iwl6035_2agn_cfg = {
247 .name = "Intel(R) Centrino(R) Advanced-N 6235 AGN", 266 .name = "Intel(R) Centrino(R) Advanced-N 6235 AGN",
248 IWL_DEVICE_6030, 267 IWL_DEVICE_6035,
249 .ht_params = &iwl6000_ht_params, 268 .ht_params = &iwl6000_ht_params,
250}; 269};
251 270
diff --git a/drivers/net/wireless/iwlwifi/pcie/trans.c b/drivers/net/wireless/iwlwifi/pcie/trans.c
index 9db8c6eaa153..cc935168ae52 100644
--- a/drivers/net/wireless/iwlwifi/pcie/trans.c
+++ b/drivers/net/wireless/iwlwifi/pcie/trans.c
@@ -1083,6 +1083,11 @@ static void iwl_tx_start(struct iwl_trans *trans)
1083 iwl_write_prph(trans, SCD_DRAM_BASE_ADDR, 1083 iwl_write_prph(trans, SCD_DRAM_BASE_ADDR,
1084 trans_pcie->scd_bc_tbls.dma >> 10); 1084 trans_pcie->scd_bc_tbls.dma >> 10);
1085 1085
1086 /* The chain extension of the SCD doesn't work well. This feature is
1087 * enabled by default by the HW, so we need to disable it manually.
1088 */
1089 iwl_write_prph(trans, SCD_CHAINEXT_EN, 0);
1090
1086 for (i = 0; i < trans_pcie->n_q_to_fifo; i++) { 1091 for (i = 0; i < trans_pcie->n_q_to_fifo; i++) {
1087 int fifo = trans_pcie->setup_q_to_fifo[i]; 1092 int fifo = trans_pcie->setup_q_to_fifo[i];
1088 1093