aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net
diff options
context:
space:
mode:
authorJohn W. Linville <linville@tuxdriver.com>2013-11-05 15:53:10 -0500
committerJohn W. Linville <linville@tuxdriver.com>2013-11-05 15:53:10 -0500
commitc046555966e4a3a75b731e05ece3b1d763ac56ae (patch)
tree2957e97a4052ca069ff7d05abf49e6b9647be9e7 /drivers/net
parentdce1ebabcb0ac12113487221663c2aba648dd244 (diff)
parentc92f06a1dea1e444213d860a20023f72c134e20a (diff)
Merge branch 'for-john' of git://git.kernel.org/pub/scm/linux/kernel/git/iwlwifi/iwlwifi-next
Diffstat (limited to 'drivers/net')
-rw-r--r--drivers/net/wireless/iwlwifi/dvm/ucode.c9
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-fw.h3
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-io.c1
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-trans.h2
-rw-r--r--drivers/net/wireless/iwlwifi/mvm/bt-coex.c8
-rw-r--r--drivers/net/wireless/iwlwifi/mvm/debugfs.c1
-rw-r--r--drivers/net/wireless/iwlwifi/mvm/fw.c8
-rw-r--r--drivers/net/wireless/iwlwifi/mvm/mac-ctxt.c8
-rw-r--r--drivers/net/wireless/iwlwifi/mvm/mac80211.c14
-rw-r--r--drivers/net/wireless/iwlwifi/mvm/mvm.h1
-rw-r--r--drivers/net/wireless/iwlwifi/mvm/ops.c2
-rw-r--r--drivers/net/wireless/iwlwifi/mvm/rx.c6
-rw-r--r--drivers/net/wireless/iwlwifi/pcie/tx.c9
13 files changed, 43 insertions, 29 deletions
diff --git a/drivers/net/wireless/iwlwifi/dvm/ucode.c b/drivers/net/wireless/iwlwifi/dvm/ucode.c
index 86270b69cd02..63637949a146 100644
--- a/drivers/net/wireless/iwlwifi/dvm/ucode.c
+++ b/drivers/net/wireless/iwlwifi/dvm/ucode.c
@@ -330,15 +330,14 @@ int iwl_load_ucode_wait_alive(struct iwl_priv *priv,
330 enum iwl_ucode_type old_type; 330 enum iwl_ucode_type old_type;
331 static const u8 alive_cmd[] = { REPLY_ALIVE }; 331 static const u8 alive_cmd[] = { REPLY_ALIVE };
332 332
333 old_type = priv->cur_ucode;
334 priv->cur_ucode = ucode_type;
335 fw = iwl_get_ucode_image(priv, ucode_type); 333 fw = iwl_get_ucode_image(priv, ucode_type);
334 if (WARN_ON(!fw))
335 return -EINVAL;
336 336
337 old_type = priv->cur_ucode;
338 priv->cur_ucode = ucode_type;
337 priv->ucode_loaded = false; 339 priv->ucode_loaded = false;
338 340
339 if (!fw)
340 return -EINVAL;
341
342 iwl_init_notification_wait(&priv->notif_wait, &alive_wait, 341 iwl_init_notification_wait(&priv->notif_wait, &alive_wait,
343 alive_cmd, ARRAY_SIZE(alive_cmd), 342 alive_cmd, ARRAY_SIZE(alive_cmd),
344 iwl_alive_fn, &alive_data); 343 iwl_alive_fn, &alive_data);
diff --git a/drivers/net/wireless/iwlwifi/iwl-fw.h b/drivers/net/wireless/iwlwifi/iwl-fw.h
index 87b66a821ec8..75db087120c3 100644
--- a/drivers/net/wireless/iwlwifi/iwl-fw.h
+++ b/drivers/net/wireless/iwlwifi/iwl-fw.h
@@ -100,7 +100,7 @@ enum iwl_ucode_tlv_flag {
100 IWL_UCODE_TLV_FLAGS_P2P = BIT(3), 100 IWL_UCODE_TLV_FLAGS_P2P = BIT(3),
101 IWL_UCODE_TLV_FLAGS_DW_BC_TABLE = BIT(4), 101 IWL_UCODE_TLV_FLAGS_DW_BC_TABLE = BIT(4),
102 IWL_UCODE_TLV_FLAGS_NEWBT_COEX = BIT(5), 102 IWL_UCODE_TLV_FLAGS_NEWBT_COEX = BIT(5),
103 IWL_UCODE_TLV_FLAGS_UAPSD = BIT(6), 103 IWL_UCODE_TLV_FLAGS_PM_CMD_SUPPORT = BIT(6),
104 IWL_UCODE_TLV_FLAGS_SHORT_BL = BIT(7), 104 IWL_UCODE_TLV_FLAGS_SHORT_BL = BIT(7),
105 IWL_UCODE_TLV_FLAGS_RX_ENERGY_API = BIT(8), 105 IWL_UCODE_TLV_FLAGS_RX_ENERGY_API = BIT(8),
106 IWL_UCODE_TLV_FLAGS_TIME_EVENT_API_V2 = BIT(9), 106 IWL_UCODE_TLV_FLAGS_TIME_EVENT_API_V2 = BIT(9),
@@ -113,6 +113,7 @@ enum iwl_ucode_tlv_flag {
113 IWL_UCODE_TLV_FLAGS_SCHED_SCAN = BIT(17), 113 IWL_UCODE_TLV_FLAGS_SCHED_SCAN = BIT(17),
114 IWL_UCODE_TLV_FLAGS_STA_KEY_CMD = BIT(19), 114 IWL_UCODE_TLV_FLAGS_STA_KEY_CMD = BIT(19),
115 IWL_UCODE_TLV_FLAGS_DEVICE_PS_CMD = BIT(20), 115 IWL_UCODE_TLV_FLAGS_DEVICE_PS_CMD = BIT(20),
116 IWL_UCODE_TLV_FLAGS_UAPSD_SUPPORT = BIT(24),
116}; 117};
117 118
118/* The default calibrate table size if not specified by firmware file */ 119/* The default calibrate table size if not specified by firmware file */
diff --git a/drivers/net/wireless/iwlwifi/iwl-io.c b/drivers/net/wireless/iwlwifi/iwl-io.c
index dfa4d2e3aaa2..ad8e19a56eca 100644
--- a/drivers/net/wireless/iwlwifi/iwl-io.c
+++ b/drivers/net/wireless/iwlwifi/iwl-io.c
@@ -34,7 +34,6 @@
34#include "iwl-csr.h" 34#include "iwl-csr.h"
35#include "iwl-debug.h" 35#include "iwl-debug.h"
36#include "iwl-fh.h" 36#include "iwl-fh.h"
37#include "iwl-csr.h"
38 37
39#define IWL_POLL_INTERVAL 10 /* microseconds */ 38#define IWL_POLL_INTERVAL 10 /* microseconds */
40 39
diff --git a/drivers/net/wireless/iwlwifi/iwl-trans.h b/drivers/net/wireless/iwlwifi/iwl-trans.h
index c6bac7c90b00..143292b4dbbf 100644
--- a/drivers/net/wireless/iwlwifi/iwl-trans.h
+++ b/drivers/net/wireless/iwlwifi/iwl-trans.h
@@ -344,7 +344,7 @@ struct iwl_trans_config {
344 u8 cmd_queue; 344 u8 cmd_queue;
345 u8 cmd_fifo; 345 u8 cmd_fifo;
346 const u8 *no_reclaim_cmds; 346 const u8 *no_reclaim_cmds;
347 int n_no_reclaim_cmds; 347 unsigned int n_no_reclaim_cmds;
348 348
349 bool rx_buf_size_8k; 349 bool rx_buf_size_8k;
350 bool bc_table_dword; 350 bool bc_table_dword;
diff --git a/drivers/net/wireless/iwlwifi/mvm/bt-coex.c b/drivers/net/wireless/iwlwifi/mvm/bt-coex.c
index 5b630f12bbff..5d066cbc5ac7 100644
--- a/drivers/net/wireless/iwlwifi/mvm/bt-coex.c
+++ b/drivers/net/wireless/iwlwifi/mvm/bt-coex.c
@@ -505,12 +505,16 @@ static int iwl_mvm_bt_coex_reduced_txp(struct iwl_mvm *mvm, u8 sta_id,
505 struct iwl_mvm_sta *mvmsta; 505 struct iwl_mvm_sta *mvmsta;
506 int ret; 506 int ret;
507 507
508 /* This can happen if the station has been removed right now */
509 if (sta_id == IWL_MVM_STATION_COUNT) 508 if (sta_id == IWL_MVM_STATION_COUNT)
510 return 0; 509 return 0;
511 510
512 sta = rcu_dereference_protected(mvm->fw_id_to_mac_id[sta_id], 511 sta = rcu_dereference_protected(mvm->fw_id_to_mac_id[sta_id],
513 lockdep_is_held(&mvm->mutex)); 512 lockdep_is_held(&mvm->mutex));
513
514 /* This can happen if the station has been removed right now */
515 if (IS_ERR_OR_NULL(sta))
516 return 0;
517
514 mvmsta = (void *)sta->drv_priv; 518 mvmsta = (void *)sta->drv_priv;
515 519
516 /* nothing to do */ 520 /* nothing to do */
@@ -751,7 +755,7 @@ static void iwl_mvm_bt_coex_notif_handle(struct iwl_mvm *mvm)
751 755
752 cmd.bt_secondary_ci = 756 cmd.bt_secondary_ci =
753 iwl_ci_mask[chan->def.chan->hw_value][ci_bw_idx]; 757 iwl_ci_mask[chan->def.chan->hw_value][ci_bw_idx];
754 cmd.secondary_ch_phy_id = *((u16 *)data.primary->drv_priv); 758 cmd.secondary_ch_phy_id = *((u16 *)data.secondary->drv_priv);
755 } 759 }
756 760
757 rcu_read_unlock(); 761 rcu_read_unlock();
diff --git a/drivers/net/wireless/iwlwifi/mvm/debugfs.c b/drivers/net/wireless/iwlwifi/mvm/debugfs.c
index 0675f0c8ef93..9864d713eb2c 100644
--- a/drivers/net/wireless/iwlwifi/mvm/debugfs.c
+++ b/drivers/net/wireless/iwlwifi/mvm/debugfs.c
@@ -342,6 +342,7 @@ static void iwl_dbgfs_update_pm(struct iwl_mvm *mvm,
342 case MVM_DEBUGFS_PM_DISABLE_POWER_OFF: 342 case MVM_DEBUGFS_PM_DISABLE_POWER_OFF:
343 IWL_DEBUG_POWER(mvm, "disable_power_off=%d\n", val); 343 IWL_DEBUG_POWER(mvm, "disable_power_off=%d\n", val);
344 dbgfs_pm->disable_power_off = val; 344 dbgfs_pm->disable_power_off = val;
345 break;
345 case MVM_DEBUGFS_PM_LPRX_ENA: 346 case MVM_DEBUGFS_PM_LPRX_ENA:
346 IWL_DEBUG_POWER(mvm, "lprx %s\n", val ? "enabled" : "disabled"); 347 IWL_DEBUG_POWER(mvm, "lprx %s\n", val ? "enabled" : "disabled");
347 dbgfs_pm->lprx_ena = val; 348 dbgfs_pm->lprx_ena = val;
diff --git a/drivers/net/wireless/iwlwifi/mvm/fw.c b/drivers/net/wireless/iwlwifi/mvm/fw.c
index 83fc5ca04433..70e5297646b2 100644
--- a/drivers/net/wireless/iwlwifi/mvm/fw.c
+++ b/drivers/net/wireless/iwlwifi/mvm/fw.c
@@ -151,13 +151,11 @@ static int iwl_mvm_load_ucode_wait_alive(struct iwl_mvm *mvm,
151 enum iwl_ucode_type old_type = mvm->cur_ucode; 151 enum iwl_ucode_type old_type = mvm->cur_ucode;
152 static const u8 alive_cmd[] = { MVM_ALIVE }; 152 static const u8 alive_cmd[] = { MVM_ALIVE };
153 153
154 mvm->cur_ucode = ucode_type;
155 fw = iwl_get_ucode_image(mvm, ucode_type); 154 fw = iwl_get_ucode_image(mvm, ucode_type);
156 155 if (WARN_ON(!fw))
157 mvm->ucode_loaded = false;
158
159 if (!fw)
160 return -EINVAL; 156 return -EINVAL;
157 mvm->cur_ucode = ucode_type;
158 mvm->ucode_loaded = false;
161 159
162 iwl_init_notification_wait(&mvm->notif_wait, &alive_wait, 160 iwl_init_notification_wait(&mvm->notif_wait, &alive_wait,
163 alive_cmd, ARRAY_SIZE(alive_cmd), 161 alive_cmd, ARRAY_SIZE(alive_cmd),
diff --git a/drivers/net/wireless/iwlwifi/mvm/mac-ctxt.c b/drivers/net/wireless/iwlwifi/mvm/mac-ctxt.c
index ab5a7ac90dcd..f41f9b079831 100644
--- a/drivers/net/wireless/iwlwifi/mvm/mac-ctxt.c
+++ b/drivers/net/wireless/iwlwifi/mvm/mac-ctxt.c
@@ -719,7 +719,9 @@ static int iwl_mvm_mac_ctxt_cmd_listener(struct iwl_mvm *mvm,
719 cmd.filter_flags = cpu_to_le32(MAC_FILTER_IN_PROMISC | 719 cmd.filter_flags = cpu_to_le32(MAC_FILTER_IN_PROMISC |
720 MAC_FILTER_IN_CONTROL_AND_MGMT | 720 MAC_FILTER_IN_CONTROL_AND_MGMT |
721 MAC_FILTER_IN_BEACON | 721 MAC_FILTER_IN_BEACON |
722 MAC_FILTER_IN_PROBE_REQUEST); 722 MAC_FILTER_IN_PROBE_REQUEST |
723 MAC_FILTER_IN_CRC32);
724 mvm->hw->flags |= IEEE80211_HW_RX_INCLUDES_FCS;
723 725
724 return iwl_mvm_mac_ctxt_send_cmd(mvm, &cmd); 726 return iwl_mvm_mac_ctxt_send_cmd(mvm, &cmd);
725} 727}
@@ -1122,6 +1124,10 @@ int iwl_mvm_mac_ctxt_remove(struct iwl_mvm *mvm, struct ieee80211_vif *vif)
1122 } 1124 }
1123 1125
1124 mvmvif->uploaded = false; 1126 mvmvif->uploaded = false;
1127
1128 if (vif->type == NL80211_IFTYPE_MONITOR)
1129 mvm->hw->flags &= ~IEEE80211_HW_RX_INCLUDES_FCS;
1130
1125 return 0; 1131 return 0;
1126} 1132}
1127 1133
diff --git a/drivers/net/wireless/iwlwifi/mvm/mac80211.c b/drivers/net/wireless/iwlwifi/mvm/mac80211.c
index f40685c3764e..74bc2c8af06d 100644
--- a/drivers/net/wireless/iwlwifi/mvm/mac80211.c
+++ b/drivers/net/wireless/iwlwifi/mvm/mac80211.c
@@ -164,8 +164,7 @@ int iwl_mvm_mac_setup_register(struct iwl_mvm *mvm)
164 IEEE80211_HW_TIMING_BEACON_ONLY | 164 IEEE80211_HW_TIMING_BEACON_ONLY |
165 IEEE80211_HW_CONNECTION_MONITOR | 165 IEEE80211_HW_CONNECTION_MONITOR |
166 IEEE80211_HW_SUPPORTS_DYNAMIC_SMPS | 166 IEEE80211_HW_SUPPORTS_DYNAMIC_SMPS |
167 IEEE80211_HW_SUPPORTS_STATIC_SMPS | 167 IEEE80211_HW_SUPPORTS_STATIC_SMPS;
168 IEEE80211_HW_SUPPORTS_UAPSD;
169 168
170 hw->queues = mvm->first_agg_queue; 169 hw->queues = mvm->first_agg_queue;
171 hw->offchannel_tx_hw_queue = IWL_MVM_OFFCHANNEL_QUEUE; 170 hw->offchannel_tx_hw_queue = IWL_MVM_OFFCHANNEL_QUEUE;
@@ -180,6 +179,12 @@ int iwl_mvm_mac_setup_register(struct iwl_mvm *mvm)
180 !iwlwifi_mod_params.sw_crypto) 179 !iwlwifi_mod_params.sw_crypto)
181 hw->flags |= IEEE80211_HW_MFP_CAPABLE; 180 hw->flags |= IEEE80211_HW_MFP_CAPABLE;
182 181
182 if (mvm->fw->ucode_capa.flags & IWL_UCODE_TLV_FLAGS_UAPSD_SUPPORT) {
183 hw->flags |= IEEE80211_HW_SUPPORTS_UAPSD;
184 hw->uapsd_queues = IWL_UAPSD_AC_INFO;
185 hw->uapsd_max_sp_len = IWL_UAPSD_MAX_SP;
186 }
187
183 hw->sta_data_size = sizeof(struct iwl_mvm_sta); 188 hw->sta_data_size = sizeof(struct iwl_mvm_sta);
184 hw->vif_data_size = sizeof(struct iwl_mvm_vif); 189 hw->vif_data_size = sizeof(struct iwl_mvm_vif);
185 hw->chanctx_data_size = sizeof(u16); 190 hw->chanctx_data_size = sizeof(u16);
@@ -204,8 +209,6 @@ int iwl_mvm_mac_setup_register(struct iwl_mvm *mvm)
204 209
205 hw->wiphy->max_remain_on_channel_duration = 10000; 210 hw->wiphy->max_remain_on_channel_duration = 10000;
206 hw->max_listen_interval = IWL_CONN_MAX_LISTEN_INTERVAL; 211 hw->max_listen_interval = IWL_CONN_MAX_LISTEN_INTERVAL;
207 hw->uapsd_queues = IWL_UAPSD_AC_INFO;
208 hw->uapsd_max_sp_len = IWL_UAPSD_MAX_SP;
209 212
210 /* Extract MAC address */ 213 /* Extract MAC address */
211 memcpy(mvm->addresses[0].addr, mvm->nvm_data->hw_addr, ETH_ALEN); 214 memcpy(mvm->addresses[0].addr, mvm->nvm_data->hw_addr, ETH_ALEN);
@@ -861,7 +864,8 @@ static void iwl_mvm_bss_info_changed_station(struct iwl_mvm *mvm,
861 /* reset rssi values */ 864 /* reset rssi values */
862 mvmvif->bf_data.ave_beacon_signal = 0; 865 mvmvif->bf_data.ave_beacon_signal = 0;
863 866
864 if (!(mvm->fw->ucode_capa.flags & IWL_UCODE_TLV_FLAGS_UAPSD)) { 867 if (!(mvm->fw->ucode_capa.flags &
868 IWL_UCODE_TLV_FLAGS_PM_CMD_SUPPORT)) {
865 /* Workaround for FW bug, otherwise FW disables device 869 /* Workaround for FW bug, otherwise FW disables device
866 * power save upon disassociation 870 * power save upon disassociation
867 */ 871 */
diff --git a/drivers/net/wireless/iwlwifi/mvm/mvm.h b/drivers/net/wireless/iwlwifi/mvm/mvm.h
index 6235cb729f5c..fed21ef4162d 100644
--- a/drivers/net/wireless/iwlwifi/mvm/mvm.h
+++ b/drivers/net/wireless/iwlwifi/mvm/mvm.h
@@ -73,7 +73,6 @@
73#include "iwl-trans.h" 73#include "iwl-trans.h"
74#include "iwl-notif-wait.h" 74#include "iwl-notif-wait.h"
75#include "iwl-eeprom-parse.h" 75#include "iwl-eeprom-parse.h"
76#include "iwl-trans.h"
77#include "sta.h" 76#include "sta.h"
78#include "fw-api.h" 77#include "fw-api.h"
79#include "constants.h" 78#include "constants.h"
diff --git a/drivers/net/wireless/iwlwifi/mvm/ops.c b/drivers/net/wireless/iwlwifi/mvm/ops.c
index 59b7cb3c6134..d86083c6f445 100644
--- a/drivers/net/wireless/iwlwifi/mvm/ops.c
+++ b/drivers/net/wireless/iwlwifi/mvm/ops.c
@@ -459,7 +459,7 @@ iwl_op_mode_mvm_start(struct iwl_trans *trans, const struct iwl_cfg *cfg,
459 if (err) 459 if (err)
460 goto out_unregister; 460 goto out_unregister;
461 461
462 if (mvm->fw->ucode_capa.flags & IWL_UCODE_TLV_FLAGS_UAPSD) 462 if (mvm->fw->ucode_capa.flags & IWL_UCODE_TLV_FLAGS_PM_CMD_SUPPORT)
463 mvm->pm_ops = &pm_mac_ops; 463 mvm->pm_ops = &pm_mac_ops;
464 else 464 else
465 mvm->pm_ops = &pm_legacy_ops; 465 mvm->pm_ops = &pm_legacy_ops;
diff --git a/drivers/net/wireless/iwlwifi/mvm/rx.c b/drivers/net/wireless/iwlwifi/mvm/rx.c
index a4af5019a496..3a1f3982109d 100644
--- a/drivers/net/wireless/iwlwifi/mvm/rx.c
+++ b/drivers/net/wireless/iwlwifi/mvm/rx.c
@@ -300,10 +300,14 @@ int iwl_mvm_rx_rx_mpdu(struct iwl_mvm *mvm, struct iwl_rx_cmd_buffer *rxb,
300 return 0; 300 return 0;
301 } 301 }
302 302
303 /*
304 * Keep packets with CRC errors (and with overrun) for monitor mode
305 * (otherwise the firmware discards them) but mark them as bad.
306 */
303 if (!(rx_pkt_status & RX_MPDU_RES_STATUS_CRC_OK) || 307 if (!(rx_pkt_status & RX_MPDU_RES_STATUS_CRC_OK) ||
304 !(rx_pkt_status & RX_MPDU_RES_STATUS_OVERRUN_OK)) { 308 !(rx_pkt_status & RX_MPDU_RES_STATUS_OVERRUN_OK)) {
305 IWL_DEBUG_RX(mvm, "Bad CRC or FIFO: 0x%08X.\n", rx_pkt_status); 309 IWL_DEBUG_RX(mvm, "Bad CRC or FIFO: 0x%08X.\n", rx_pkt_status);
306 return 0; 310 rx_status.flag |= RX_FLAG_FAILED_FCS_CRC;
307 } 311 }
308 312
309 /* This will be used in several places later */ 313 /* This will be used in several places later */
diff --git a/drivers/net/wireless/iwlwifi/pcie/tx.c b/drivers/net/wireless/iwlwifi/pcie/tx.c
index f644fcf861a8..059c5acad3a0 100644
--- a/drivers/net/wireless/iwlwifi/pcie/tx.c
+++ b/drivers/net/wireless/iwlwifi/pcie/tx.c
@@ -1499,12 +1499,11 @@ static int iwl_pcie_send_hcmd_sync(struct iwl_trans *trans,
1499 IWL_DEBUG_INFO(trans, "Attempting to send sync command %s\n", 1499 IWL_DEBUG_INFO(trans, "Attempting to send sync command %s\n",
1500 get_cmd_string(trans_pcie, cmd->id)); 1500 get_cmd_string(trans_pcie, cmd->id));
1501 1501
1502 if (WARN_ON(test_and_set_bit(STATUS_HCMD_ACTIVE, 1502 if (WARN(test_and_set_bit(STATUS_HCMD_ACTIVE,
1503 &trans_pcie->status))) { 1503 &trans_pcie->status),
1504 IWL_ERR(trans, "Command %s: a command is already active!\n", 1504 "Command %s: a command is already active!\n",
1505 get_cmd_string(trans_pcie, cmd->id)); 1505 get_cmd_string(trans_pcie, cmd->id)))
1506 return -EIO; 1506 return -EIO;
1507 }
1508 1507
1509 IWL_DEBUG_INFO(trans, "Setting HCMD_ACTIVE for command %s\n", 1508 IWL_DEBUG_INFO(trans, "Setting HCMD_ACTIVE for command %s\n",
1510 get_cmd_string(trans_pcie, cmd->id)); 1509 get_cmd_string(trans_pcie, cmd->id));