diff options
author | John W. Linville <linville@tuxdriver.com> | 2013-08-09 15:06:28 -0400 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2013-08-09 15:06:28 -0400 |
commit | 4f0544489215fc78cccb96f8e3d0f078ae965297 (patch) | |
tree | 69e71db0cf005a68ab1b70f33ae0462fd94152fc /drivers/net/wireless/iwlwifi | |
parent | 2952f6ef5195ea76279f7370f0a6571867e54438 (diff) | |
parent | 5a6e0cf70743f30c17ccb5f228db9a124b0e7477 (diff) |
Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless
Diffstat (limited to 'drivers/net/wireless/iwlwifi')
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-prph.h | 2 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/mvm/d3.c | 15 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/mvm/fw-api-scan.h | 1 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/mvm/mac80211.c | 42 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/mvm/scan.c | 11 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/mvm/sta.c | 11 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/pcie/drv.c | 1 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/pcie/rx.c | 8 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/pcie/trans.c | 5 |
9 files changed, 57 insertions, 39 deletions
diff --git a/drivers/net/wireless/iwlwifi/iwl-prph.h b/drivers/net/wireless/iwlwifi/iwl-prph.h index ff8cc75c189d..a70c7b9d9bad 100644 --- a/drivers/net/wireless/iwlwifi/iwl-prph.h +++ b/drivers/net/wireless/iwlwifi/iwl-prph.h | |||
@@ -97,6 +97,8 @@ | |||
97 | 97 | ||
98 | #define APMG_PCIDEV_STT_VAL_L1_ACT_DIS (0x00000800) | 98 | #define APMG_PCIDEV_STT_VAL_L1_ACT_DIS (0x00000800) |
99 | 99 | ||
100 | #define APMG_RTC_INT_STT_RFKILL (0x10000000) | ||
101 | |||
100 | /* Device system time */ | 102 | /* Device system time */ |
101 | #define DEVICE_SYSTEM_TIME_REG 0xA0206C | 103 | #define DEVICE_SYSTEM_TIME_REG 0xA0206C |
102 | 104 | ||
diff --git a/drivers/net/wireless/iwlwifi/mvm/d3.c b/drivers/net/wireless/iwlwifi/mvm/d3.c index ebf7f9468926..d0d7a20266e6 100644 --- a/drivers/net/wireless/iwlwifi/mvm/d3.c +++ b/drivers/net/wireless/iwlwifi/mvm/d3.c | |||
@@ -134,7 +134,7 @@ struct wowlan_key_data { | |||
134 | struct iwl_wowlan_rsc_tsc_params_cmd *rsc_tsc; | 134 | struct iwl_wowlan_rsc_tsc_params_cmd *rsc_tsc; |
135 | struct iwl_wowlan_tkip_params_cmd *tkip; | 135 | struct iwl_wowlan_tkip_params_cmd *tkip; |
136 | bool error, use_rsc_tsc, use_tkip; | 136 | bool error, use_rsc_tsc, use_tkip; |
137 | int gtk_key_idx; | 137 | int wep_key_idx; |
138 | }; | 138 | }; |
139 | 139 | ||
140 | static void iwl_mvm_wowlan_program_keys(struct ieee80211_hw *hw, | 140 | static void iwl_mvm_wowlan_program_keys(struct ieee80211_hw *hw, |
@@ -188,8 +188,8 @@ static void iwl_mvm_wowlan_program_keys(struct ieee80211_hw *hw, | |||
188 | wkc.wep_key.key_offset = 0; | 188 | wkc.wep_key.key_offset = 0; |
189 | } else { | 189 | } else { |
190 | /* others start at 1 */ | 190 | /* others start at 1 */ |
191 | data->gtk_key_idx++; | 191 | data->wep_key_idx++; |
192 | wkc.wep_key.key_offset = data->gtk_key_idx; | 192 | wkc.wep_key.key_offset = data->wep_key_idx; |
193 | } | 193 | } |
194 | 194 | ||
195 | ret = iwl_mvm_send_cmd_pdu(mvm, WEP_KEY, CMD_SYNC, | 195 | ret = iwl_mvm_send_cmd_pdu(mvm, WEP_KEY, CMD_SYNC, |
@@ -316,8 +316,13 @@ static void iwl_mvm_wowlan_program_keys(struct ieee80211_hw *hw, | |||
316 | mvm->ptk_ivlen = key->iv_len; | 316 | mvm->ptk_ivlen = key->iv_len; |
317 | mvm->ptk_icvlen = key->icv_len; | 317 | mvm->ptk_icvlen = key->icv_len; |
318 | } else { | 318 | } else { |
319 | data->gtk_key_idx++; | 319 | /* |
320 | key->hw_key_idx = data->gtk_key_idx; | 320 | * firmware only supports TSC/RSC for a single key, |
321 | * so if there are multiple keep overwriting them | ||
322 | * with new ones -- this relies on mac80211 doing | ||
323 | * list_add_tail(). | ||
324 | */ | ||
325 | key->hw_key_idx = 1; | ||
321 | mvm->gtk_ivlen = key->iv_len; | 326 | mvm->gtk_ivlen = key->iv_len; |
322 | mvm->gtk_icvlen = key->icv_len; | 327 | mvm->gtk_icvlen = key->icv_len; |
323 | } | 328 | } |
diff --git a/drivers/net/wireless/iwlwifi/mvm/fw-api-scan.h b/drivers/net/wireless/iwlwifi/mvm/fw-api-scan.h index c33ff8e61f4f..83cb9b992ea4 100644 --- a/drivers/net/wireless/iwlwifi/mvm/fw-api-scan.h +++ b/drivers/net/wireless/iwlwifi/mvm/fw-api-scan.h | |||
@@ -69,7 +69,6 @@ | |||
69 | /* Scan Commands, Responses, Notifications */ | 69 | /* Scan Commands, Responses, Notifications */ |
70 | 70 | ||
71 | /* Masks for iwl_scan_channel.type flags */ | 71 | /* Masks for iwl_scan_channel.type flags */ |
72 | #define SCAN_CHANNEL_TYPE_PASSIVE 0 | ||
73 | #define SCAN_CHANNEL_TYPE_ACTIVE BIT(0) | 72 | #define SCAN_CHANNEL_TYPE_ACTIVE BIT(0) |
74 | #define SCAN_CHANNEL_NARROW_BAND BIT(22) | 73 | #define SCAN_CHANNEL_NARROW_BAND BIT(22) |
75 | 74 | ||
diff --git a/drivers/net/wireless/iwlwifi/mvm/mac80211.c b/drivers/net/wireless/iwlwifi/mvm/mac80211.c index fc61b274780c..785c782b166f 100644 --- a/drivers/net/wireless/iwlwifi/mvm/mac80211.c +++ b/drivers/net/wireless/iwlwifi/mvm/mac80211.c | |||
@@ -514,6 +514,27 @@ static int iwl_mvm_mac_add_interface(struct ieee80211_hw *hw, | |||
514 | goto out_unlock; | 514 | goto out_unlock; |
515 | 515 | ||
516 | /* | 516 | /* |
517 | * TODO: remove this temporary code. | ||
518 | * Currently MVM FW supports power management only on single MAC. | ||
519 | * If new interface added, disable PM on existing interface. | ||
520 | * P2P device is a special case, since it is handled by FW similary to | ||
521 | * scan. If P2P deviced is added, PM remains enabled on existing | ||
522 | * interface. | ||
523 | * Note: the method below does not count the new interface being added | ||
524 | * at this moment. | ||
525 | */ | ||
526 | if (vif->type != NL80211_IFTYPE_P2P_DEVICE) | ||
527 | mvm->vif_count++; | ||
528 | if (mvm->vif_count > 1) { | ||
529 | IWL_DEBUG_MAC80211(mvm, | ||
530 | "Disable power on existing interfaces\n"); | ||
531 | ieee80211_iterate_active_interfaces_atomic( | ||
532 | mvm->hw, | ||
533 | IEEE80211_IFACE_ITER_NORMAL, | ||
534 | iwl_mvm_pm_disable_iterator, mvm); | ||
535 | } | ||
536 | |||
537 | /* | ||
517 | * The AP binding flow can be done only after the beacon | 538 | * The AP binding flow can be done only after the beacon |
518 | * template is configured (which happens only in the mac80211 | 539 | * template is configured (which happens only in the mac80211 |
519 | * start_ap() flow), and adding the broadcast station can happen | 540 | * start_ap() flow), and adding the broadcast station can happen |
@@ -537,27 +558,6 @@ static int iwl_mvm_mac_add_interface(struct ieee80211_hw *hw, | |||
537 | goto out_unlock; | 558 | goto out_unlock; |
538 | } | 559 | } |
539 | 560 | ||
540 | /* | ||
541 | * TODO: remove this temporary code. | ||
542 | * Currently MVM FW supports power management only on single MAC. | ||
543 | * If new interface added, disable PM on existing interface. | ||
544 | * P2P device is a special case, since it is handled by FW similary to | ||
545 | * scan. If P2P deviced is added, PM remains enabled on existing | ||
546 | * interface. | ||
547 | * Note: the method below does not count the new interface being added | ||
548 | * at this moment. | ||
549 | */ | ||
550 | if (vif->type != NL80211_IFTYPE_P2P_DEVICE) | ||
551 | mvm->vif_count++; | ||
552 | if (mvm->vif_count > 1) { | ||
553 | IWL_DEBUG_MAC80211(mvm, | ||
554 | "Disable power on existing interfaces\n"); | ||
555 | ieee80211_iterate_active_interfaces_atomic( | ||
556 | mvm->hw, | ||
557 | IEEE80211_IFACE_ITER_NORMAL, | ||
558 | iwl_mvm_pm_disable_iterator, mvm); | ||
559 | } | ||
560 | |||
561 | ret = iwl_mvm_mac_ctxt_add(mvm, vif); | 561 | ret = iwl_mvm_mac_ctxt_add(mvm, vif); |
562 | if (ret) | 562 | if (ret) |
563 | goto out_release; | 563 | goto out_release; |
diff --git a/drivers/net/wireless/iwlwifi/mvm/scan.c b/drivers/net/wireless/iwlwifi/mvm/scan.c index 14c1b457ca50..9a7ab8495300 100644 --- a/drivers/net/wireless/iwlwifi/mvm/scan.c +++ b/drivers/net/wireless/iwlwifi/mvm/scan.c | |||
@@ -178,19 +178,12 @@ static void iwl_mvm_scan_fill_channels(struct iwl_scan_cmd *cmd, | |||
178 | struct iwl_scan_channel *chan = (struct iwl_scan_channel *) | 178 | struct iwl_scan_channel *chan = (struct iwl_scan_channel *) |
179 | (cmd->data + le16_to_cpu(cmd->tx_cmd.len)); | 179 | (cmd->data + le16_to_cpu(cmd->tx_cmd.len)); |
180 | int i; | 180 | int i; |
181 | __le32 chan_type_value; | ||
182 | |||
183 | if (req->n_ssids > 0) | ||
184 | chan_type_value = cpu_to_le32(BIT(req->n_ssids) - 1); | ||
185 | else | ||
186 | chan_type_value = SCAN_CHANNEL_TYPE_PASSIVE; | ||
187 | 181 | ||
188 | for (i = 0; i < cmd->channel_count; i++) { | 182 | for (i = 0; i < cmd->channel_count; i++) { |
189 | chan->channel = cpu_to_le16(req->channels[i]->hw_value); | 183 | chan->channel = cpu_to_le16(req->channels[i]->hw_value); |
184 | chan->type = cpu_to_le32(BIT(req->n_ssids) - 1); | ||
190 | if (req->channels[i]->flags & IEEE80211_CHAN_PASSIVE_SCAN) | 185 | if (req->channels[i]->flags & IEEE80211_CHAN_PASSIVE_SCAN) |
191 | chan->type = SCAN_CHANNEL_TYPE_PASSIVE; | 186 | chan->type &= cpu_to_le32(~SCAN_CHANNEL_TYPE_ACTIVE); |
192 | else | ||
193 | chan->type = chan_type_value; | ||
194 | chan->active_dwell = cpu_to_le16(active_dwell); | 187 | chan->active_dwell = cpu_to_le16(active_dwell); |
195 | chan->passive_dwell = cpu_to_le16(passive_dwell); | 188 | chan->passive_dwell = cpu_to_le16(passive_dwell); |
196 | chan->iteration_count = cpu_to_le16(1); | 189 | chan->iteration_count = cpu_to_le16(1); |
diff --git a/drivers/net/wireless/iwlwifi/mvm/sta.c b/drivers/net/wireless/iwlwifi/mvm/sta.c index 8b302774b70c..44add291531b 100644 --- a/drivers/net/wireless/iwlwifi/mvm/sta.c +++ b/drivers/net/wireless/iwlwifi/mvm/sta.c | |||
@@ -914,6 +914,7 @@ int iwl_mvm_sta_tx_agg_flush(struct iwl_mvm *mvm, struct ieee80211_vif *vif, | |||
914 | struct iwl_mvm_sta *mvmsta = (void *)sta->drv_priv; | 914 | struct iwl_mvm_sta *mvmsta = (void *)sta->drv_priv; |
915 | struct iwl_mvm_tid_data *tid_data = &mvmsta->tid_data[tid]; | 915 | struct iwl_mvm_tid_data *tid_data = &mvmsta->tid_data[tid]; |
916 | u16 txq_id; | 916 | u16 txq_id; |
917 | enum iwl_mvm_agg_state old_state; | ||
917 | 918 | ||
918 | /* | 919 | /* |
919 | * First set the agg state to OFF to avoid calling | 920 | * First set the agg state to OFF to avoid calling |
@@ -923,13 +924,17 @@ int iwl_mvm_sta_tx_agg_flush(struct iwl_mvm *mvm, struct ieee80211_vif *vif, | |||
923 | txq_id = tid_data->txq_id; | 924 | txq_id = tid_data->txq_id; |
924 | IWL_DEBUG_TX_QUEUES(mvm, "Flush AGG: sta %d tid %d q %d state %d\n", | 925 | IWL_DEBUG_TX_QUEUES(mvm, "Flush AGG: sta %d tid %d q %d state %d\n", |
925 | mvmsta->sta_id, tid, txq_id, tid_data->state); | 926 | mvmsta->sta_id, tid, txq_id, tid_data->state); |
927 | old_state = tid_data->state; | ||
926 | tid_data->state = IWL_AGG_OFF; | 928 | tid_data->state = IWL_AGG_OFF; |
927 | spin_unlock_bh(&mvmsta->lock); | 929 | spin_unlock_bh(&mvmsta->lock); |
928 | 930 | ||
929 | if (iwl_mvm_flush_tx_path(mvm, BIT(txq_id), true)) | 931 | if (old_state >= IWL_AGG_ON) { |
930 | IWL_ERR(mvm, "Couldn't flush the AGG queue\n"); | 932 | if (iwl_mvm_flush_tx_path(mvm, BIT(txq_id), true)) |
933 | IWL_ERR(mvm, "Couldn't flush the AGG queue\n"); | ||
934 | |||
935 | iwl_trans_txq_disable(mvm->trans, tid_data->txq_id); | ||
936 | } | ||
931 | 937 | ||
932 | iwl_trans_txq_disable(mvm->trans, tid_data->txq_id); | ||
933 | mvm->queue_to_mac80211[tid_data->txq_id] = | 938 | mvm->queue_to_mac80211[tid_data->txq_id] = |
934 | IWL_INVALID_MAC80211_QUEUE; | 939 | IWL_INVALID_MAC80211_QUEUE; |
935 | 940 | ||
diff --git a/drivers/net/wireless/iwlwifi/pcie/drv.c b/drivers/net/wireless/iwlwifi/pcie/drv.c index db6be2491d7c..c96070fa93e4 100644 --- a/drivers/net/wireless/iwlwifi/pcie/drv.c +++ b/drivers/net/wireless/iwlwifi/pcie/drv.c | |||
@@ -130,6 +130,7 @@ static DEFINE_PCI_DEVICE_TABLE(iwl_hw_card_ids) = { | |||
130 | {IWL_PCI_DEVICE(0x423C, 0x1306, iwl5150_abg_cfg)}, /* Half Mini Card */ | 130 | {IWL_PCI_DEVICE(0x423C, 0x1306, iwl5150_abg_cfg)}, /* Half Mini Card */ |
131 | {IWL_PCI_DEVICE(0x423C, 0x1221, iwl5150_agn_cfg)}, /* Mini Card */ | 131 | {IWL_PCI_DEVICE(0x423C, 0x1221, iwl5150_agn_cfg)}, /* Mini Card */ |
132 | {IWL_PCI_DEVICE(0x423C, 0x1321, iwl5150_agn_cfg)}, /* Half Mini Card */ | 132 | {IWL_PCI_DEVICE(0x423C, 0x1321, iwl5150_agn_cfg)}, /* Half Mini Card */ |
133 | {IWL_PCI_DEVICE(0x423C, 0x1326, iwl5150_abg_cfg)}, /* Half Mini Card */ | ||
133 | 134 | ||
134 | {IWL_PCI_DEVICE(0x423D, 0x1211, iwl5150_agn_cfg)}, /* Mini Card */ | 135 | {IWL_PCI_DEVICE(0x423D, 0x1211, iwl5150_agn_cfg)}, /* Mini Card */ |
135 | {IWL_PCI_DEVICE(0x423D, 0x1311, iwl5150_agn_cfg)}, /* Half Mini Card */ | 136 | {IWL_PCI_DEVICE(0x423D, 0x1311, iwl5150_agn_cfg)}, /* Half Mini Card */ |
diff --git a/drivers/net/wireless/iwlwifi/pcie/rx.c b/drivers/net/wireless/iwlwifi/pcie/rx.c index 5fdb4eea146d..68837d4e9fa0 100644 --- a/drivers/net/wireless/iwlwifi/pcie/rx.c +++ b/drivers/net/wireless/iwlwifi/pcie/rx.c | |||
@@ -888,6 +888,14 @@ irqreturn_t iwl_pcie_irq_handler(int irq, void *dev_id) | |||
888 | 888 | ||
889 | iwl_op_mode_hw_rf_kill(trans->op_mode, hw_rfkill); | 889 | iwl_op_mode_hw_rf_kill(trans->op_mode, hw_rfkill); |
890 | if (hw_rfkill) { | 890 | if (hw_rfkill) { |
891 | /* | ||
892 | * Clear the interrupt in APMG if the NIC is going down. | ||
893 | * Note that when the NIC exits RFkill (else branch), we | ||
894 | * can't access prph and the NIC will be reset in | ||
895 | * start_hw anyway. | ||
896 | */ | ||
897 | iwl_write_prph(trans, APMG_RTC_INT_STT_REG, | ||
898 | APMG_RTC_INT_STT_RFKILL); | ||
891 | set_bit(STATUS_RFKILL, &trans_pcie->status); | 899 | set_bit(STATUS_RFKILL, &trans_pcie->status); |
892 | if (test_and_clear_bit(STATUS_HCMD_ACTIVE, | 900 | if (test_and_clear_bit(STATUS_HCMD_ACTIVE, |
893 | &trans_pcie->status)) | 901 | &trans_pcie->status)) |
diff --git a/drivers/net/wireless/iwlwifi/pcie/trans.c b/drivers/net/wireless/iwlwifi/pcie/trans.c index cec0c8991285..805e303dc4d9 100644 --- a/drivers/net/wireless/iwlwifi/pcie/trans.c +++ b/drivers/net/wireless/iwlwifi/pcie/trans.c | |||
@@ -670,6 +670,11 @@ static int iwl_trans_pcie_start_hw(struct iwl_trans *trans) | |||
670 | return err; | 670 | return err; |
671 | } | 671 | } |
672 | 672 | ||
673 | /* Reset the entire device */ | ||
674 | iwl_set_bit(trans, CSR_RESET, CSR_RESET_REG_FLAG_SW_RESET); | ||
675 | |||
676 | usleep_range(10, 15); | ||
677 | |||
673 | iwl_pcie_apm_init(trans); | 678 | iwl_pcie_apm_init(trans); |
674 | 679 | ||
675 | /* From now on, the op_mode will be kept updated about RF kill state */ | 680 | /* From now on, the op_mode will be kept updated about RF kill state */ |