diff options
author | Johannes Berg <johannes.berg@intel.com> | 2012-06-13 03:01:22 -0400 |
---|---|---|
committer | Johannes Berg <johannes.berg@intel.com> | 2012-06-13 03:01:28 -0400 |
commit | 627ae3ddd6f929b4496502318a8896729fc37839 (patch) | |
tree | 269fc2ea3b49c16864e97ee6b2ed0e7530bed79a /drivers/net/wireless/iwlwifi | |
parent | 7bc057ffb5078d3e7f391ef2357f4ab01b9694e0 (diff) | |
parent | a59f975a78f0606a3a364939dfa9b949d5f87521 (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.c | 3 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/dvm/sta.c | 2 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-drv.c | 10 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-prph.h | 1 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/pcie/6000.c | 23 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/pcie/trans.c | 5 |
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 | |||
246 | const struct iwl_cfg iwl6035_2agn_cfg = { | 265 | const 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 | ||