Merge branch 'for-john' of git://git.kernel.org/pub/scm/linux/kernel/git/iwlwifi/iwlwifi-fixes
This commit is contained in:
commit
718803d161
|
@ -97,6 +97,8 @@
|
||||||
|
|
||||||
#define APMG_PCIDEV_STT_VAL_L1_ACT_DIS (0x00000800)
|
#define APMG_PCIDEV_STT_VAL_L1_ACT_DIS (0x00000800)
|
||||||
|
|
||||||
|
#define APMG_RTC_INT_STT_RFKILL (0x10000000)
|
||||||
|
|
||||||
/* Device system time */
|
/* Device system time */
|
||||||
#define DEVICE_SYSTEM_TIME_REG 0xA0206C
|
#define DEVICE_SYSTEM_TIME_REG 0xA0206C
|
||||||
|
|
||||||
|
|
|
@ -134,7 +134,7 @@ struct wowlan_key_data {
|
||||||
struct iwl_wowlan_rsc_tsc_params_cmd *rsc_tsc;
|
struct iwl_wowlan_rsc_tsc_params_cmd *rsc_tsc;
|
||||||
struct iwl_wowlan_tkip_params_cmd *tkip;
|
struct iwl_wowlan_tkip_params_cmd *tkip;
|
||||||
bool error, use_rsc_tsc, use_tkip;
|
bool error, use_rsc_tsc, use_tkip;
|
||||||
int gtk_key_idx;
|
int wep_key_idx;
|
||||||
};
|
};
|
||||||
|
|
||||||
static void iwl_mvm_wowlan_program_keys(struct ieee80211_hw *hw,
|
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,
|
||||||
wkc.wep_key.key_offset = 0;
|
wkc.wep_key.key_offset = 0;
|
||||||
} else {
|
} else {
|
||||||
/* others start at 1 */
|
/* others start at 1 */
|
||||||
data->gtk_key_idx++;
|
data->wep_key_idx++;
|
||||||
wkc.wep_key.key_offset = data->gtk_key_idx;
|
wkc.wep_key.key_offset = data->wep_key_idx;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = iwl_mvm_send_cmd_pdu(mvm, WEP_KEY, CMD_SYNC,
|
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,
|
||||||
mvm->ptk_ivlen = key->iv_len;
|
mvm->ptk_ivlen = key->iv_len;
|
||||||
mvm->ptk_icvlen = key->icv_len;
|
mvm->ptk_icvlen = key->icv_len;
|
||||||
} else {
|
} else {
|
||||||
data->gtk_key_idx++;
|
/*
|
||||||
key->hw_key_idx = data->gtk_key_idx;
|
* firmware only supports TSC/RSC for a single key,
|
||||||
|
* so if there are multiple keep overwriting them
|
||||||
|
* with new ones -- this relies on mac80211 doing
|
||||||
|
* list_add_tail().
|
||||||
|
*/
|
||||||
|
key->hw_key_idx = 1;
|
||||||
mvm->gtk_ivlen = key->iv_len;
|
mvm->gtk_ivlen = key->iv_len;
|
||||||
mvm->gtk_icvlen = key->icv_len;
|
mvm->gtk_icvlen = key->icv_len;
|
||||||
}
|
}
|
||||||
|
|
|
@ -69,7 +69,6 @@
|
||||||
/* Scan Commands, Responses, Notifications */
|
/* Scan Commands, Responses, Notifications */
|
||||||
|
|
||||||
/* Masks for iwl_scan_channel.type flags */
|
/* Masks for iwl_scan_channel.type flags */
|
||||||
#define SCAN_CHANNEL_TYPE_PASSIVE 0
|
|
||||||
#define SCAN_CHANNEL_TYPE_ACTIVE BIT(0)
|
#define SCAN_CHANNEL_TYPE_ACTIVE BIT(0)
|
||||||
#define SCAN_CHANNEL_NARROW_BAND BIT(22)
|
#define SCAN_CHANNEL_NARROW_BAND BIT(22)
|
||||||
|
|
||||||
|
|
|
@ -511,6 +511,27 @@ static int iwl_mvm_mac_add_interface(struct ieee80211_hw *hw,
|
||||||
if (ret)
|
if (ret)
|
||||||
goto out_unlock;
|
goto out_unlock;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* TODO: remove this temporary code.
|
||||||
|
* Currently MVM FW supports power management only on single MAC.
|
||||||
|
* If new interface added, disable PM on existing interface.
|
||||||
|
* P2P device is a special case, since it is handled by FW similary to
|
||||||
|
* scan. If P2P deviced is added, PM remains enabled on existing
|
||||||
|
* interface.
|
||||||
|
* Note: the method below does not count the new interface being added
|
||||||
|
* at this moment.
|
||||||
|
*/
|
||||||
|
if (vif->type != NL80211_IFTYPE_P2P_DEVICE)
|
||||||
|
mvm->vif_count++;
|
||||||
|
if (mvm->vif_count > 1) {
|
||||||
|
IWL_DEBUG_MAC80211(mvm,
|
||||||
|
"Disable power on existing interfaces\n");
|
||||||
|
ieee80211_iterate_active_interfaces_atomic(
|
||||||
|
mvm->hw,
|
||||||
|
IEEE80211_IFACE_ITER_NORMAL,
|
||||||
|
iwl_mvm_pm_disable_iterator, mvm);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The AP binding flow can be done only after the beacon
|
* The AP binding flow can be done only after the beacon
|
||||||
* template is configured (which happens only in the mac80211
|
* template is configured (which happens only in the mac80211
|
||||||
|
@ -534,27 +555,6 @@ static int iwl_mvm_mac_add_interface(struct ieee80211_hw *hw,
|
||||||
goto out_unlock;
|
goto out_unlock;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* TODO: remove this temporary code.
|
|
||||||
* Currently MVM FW supports power management only on single MAC.
|
|
||||||
* If new interface added, disable PM on existing interface.
|
|
||||||
* P2P device is a special case, since it is handled by FW similary to
|
|
||||||
* scan. If P2P deviced is added, PM remains enabled on existing
|
|
||||||
* interface.
|
|
||||||
* Note: the method below does not count the new interface being added
|
|
||||||
* at this moment.
|
|
||||||
*/
|
|
||||||
if (vif->type != NL80211_IFTYPE_P2P_DEVICE)
|
|
||||||
mvm->vif_count++;
|
|
||||||
if (mvm->vif_count > 1) {
|
|
||||||
IWL_DEBUG_MAC80211(mvm,
|
|
||||||
"Disable power on existing interfaces\n");
|
|
||||||
ieee80211_iterate_active_interfaces_atomic(
|
|
||||||
mvm->hw,
|
|
||||||
IEEE80211_IFACE_ITER_NORMAL,
|
|
||||||
iwl_mvm_pm_disable_iterator, mvm);
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = iwl_mvm_mac_ctxt_add(mvm, vif);
|
ret = iwl_mvm_mac_ctxt_add(mvm, vif);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto out_release;
|
goto out_release;
|
||||||
|
|
|
@ -178,19 +178,12 @@ static void iwl_mvm_scan_fill_channels(struct iwl_scan_cmd *cmd,
|
||||||
struct iwl_scan_channel *chan = (struct iwl_scan_channel *)
|
struct iwl_scan_channel *chan = (struct iwl_scan_channel *)
|
||||||
(cmd->data + le16_to_cpu(cmd->tx_cmd.len));
|
(cmd->data + le16_to_cpu(cmd->tx_cmd.len));
|
||||||
int i;
|
int i;
|
||||||
__le32 chan_type_value;
|
|
||||||
|
|
||||||
if (req->n_ssids > 0)
|
|
||||||
chan_type_value = cpu_to_le32(BIT(req->n_ssids) - 1);
|
|
||||||
else
|
|
||||||
chan_type_value = SCAN_CHANNEL_TYPE_PASSIVE;
|
|
||||||
|
|
||||||
for (i = 0; i < cmd->channel_count; i++) {
|
for (i = 0; i < cmd->channel_count; i++) {
|
||||||
chan->channel = cpu_to_le16(req->channels[i]->hw_value);
|
chan->channel = cpu_to_le16(req->channels[i]->hw_value);
|
||||||
|
chan->type = cpu_to_le32(BIT(req->n_ssids) - 1);
|
||||||
if (req->channels[i]->flags & IEEE80211_CHAN_PASSIVE_SCAN)
|
if (req->channels[i]->flags & IEEE80211_CHAN_PASSIVE_SCAN)
|
||||||
chan->type = SCAN_CHANNEL_TYPE_PASSIVE;
|
chan->type &= cpu_to_le32(~SCAN_CHANNEL_TYPE_ACTIVE);
|
||||||
else
|
|
||||||
chan->type = chan_type_value;
|
|
||||||
chan->active_dwell = cpu_to_le16(active_dwell);
|
chan->active_dwell = cpu_to_le16(active_dwell);
|
||||||
chan->passive_dwell = cpu_to_le16(passive_dwell);
|
chan->passive_dwell = cpu_to_le16(passive_dwell);
|
||||||
chan->iteration_count = cpu_to_le16(1);
|
chan->iteration_count = cpu_to_le16(1);
|
||||||
|
|
|
@ -915,6 +915,7 @@ int iwl_mvm_sta_tx_agg_flush(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
|
||||||
struct iwl_mvm_sta *mvmsta = (void *)sta->drv_priv;
|
struct iwl_mvm_sta *mvmsta = (void *)sta->drv_priv;
|
||||||
struct iwl_mvm_tid_data *tid_data = &mvmsta->tid_data[tid];
|
struct iwl_mvm_tid_data *tid_data = &mvmsta->tid_data[tid];
|
||||||
u16 txq_id;
|
u16 txq_id;
|
||||||
|
enum iwl_mvm_agg_state old_state;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* First set the agg state to OFF to avoid calling
|
* First set the agg state to OFF to avoid calling
|
||||||
|
@ -924,13 +925,17 @@ int iwl_mvm_sta_tx_agg_flush(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
|
||||||
txq_id = tid_data->txq_id;
|
txq_id = tid_data->txq_id;
|
||||||
IWL_DEBUG_TX_QUEUES(mvm, "Flush AGG: sta %d tid %d q %d state %d\n",
|
IWL_DEBUG_TX_QUEUES(mvm, "Flush AGG: sta %d tid %d q %d state %d\n",
|
||||||
mvmsta->sta_id, tid, txq_id, tid_data->state);
|
mvmsta->sta_id, tid, txq_id, tid_data->state);
|
||||||
|
old_state = tid_data->state;
|
||||||
tid_data->state = IWL_AGG_OFF;
|
tid_data->state = IWL_AGG_OFF;
|
||||||
spin_unlock_bh(&mvmsta->lock);
|
spin_unlock_bh(&mvmsta->lock);
|
||||||
|
|
||||||
|
if (old_state >= IWL_AGG_ON) {
|
||||||
if (iwl_mvm_flush_tx_path(mvm, BIT(txq_id), true))
|
if (iwl_mvm_flush_tx_path(mvm, BIT(txq_id), true))
|
||||||
IWL_ERR(mvm, "Couldn't flush the AGG queue\n");
|
IWL_ERR(mvm, "Couldn't flush the AGG queue\n");
|
||||||
|
|
||||||
iwl_trans_txq_disable(mvm->trans, tid_data->txq_id);
|
iwl_trans_txq_disable(mvm->trans, tid_data->txq_id);
|
||||||
|
}
|
||||||
|
|
||||||
mvm->queue_to_mac80211[tid_data->txq_id] =
|
mvm->queue_to_mac80211[tid_data->txq_id] =
|
||||||
IWL_INVALID_MAC80211_QUEUE;
|
IWL_INVALID_MAC80211_QUEUE;
|
||||||
|
|
||||||
|
|
|
@ -130,6 +130,7 @@ static DEFINE_PCI_DEVICE_TABLE(iwl_hw_card_ids) = {
|
||||||
{IWL_PCI_DEVICE(0x423C, 0x1306, iwl5150_abg_cfg)}, /* Half Mini Card */
|
{IWL_PCI_DEVICE(0x423C, 0x1306, iwl5150_abg_cfg)}, /* Half Mini Card */
|
||||||
{IWL_PCI_DEVICE(0x423C, 0x1221, iwl5150_agn_cfg)}, /* Mini Card */
|
{IWL_PCI_DEVICE(0x423C, 0x1221, iwl5150_agn_cfg)}, /* Mini Card */
|
||||||
{IWL_PCI_DEVICE(0x423C, 0x1321, iwl5150_agn_cfg)}, /* Half Mini Card */
|
{IWL_PCI_DEVICE(0x423C, 0x1321, iwl5150_agn_cfg)}, /* Half Mini Card */
|
||||||
|
{IWL_PCI_DEVICE(0x423C, 0x1326, iwl5150_abg_cfg)}, /* Half Mini Card */
|
||||||
|
|
||||||
{IWL_PCI_DEVICE(0x423D, 0x1211, iwl5150_agn_cfg)}, /* Mini Card */
|
{IWL_PCI_DEVICE(0x423D, 0x1211, iwl5150_agn_cfg)}, /* Mini Card */
|
||||||
{IWL_PCI_DEVICE(0x423D, 0x1311, iwl5150_agn_cfg)}, /* Half Mini Card */
|
{IWL_PCI_DEVICE(0x423D, 0x1311, iwl5150_agn_cfg)}, /* Half Mini Card */
|
||||||
|
|
|
@ -888,6 +888,14 @@ irqreturn_t iwl_pcie_irq_handler(int irq, void *dev_id)
|
||||||
|
|
||||||
iwl_op_mode_hw_rf_kill(trans->op_mode, hw_rfkill);
|
iwl_op_mode_hw_rf_kill(trans->op_mode, hw_rfkill);
|
||||||
if (hw_rfkill) {
|
if (hw_rfkill) {
|
||||||
|
/*
|
||||||
|
* Clear the interrupt in APMG if the NIC is going down.
|
||||||
|
* Note that when the NIC exits RFkill (else branch), we
|
||||||
|
* can't access prph and the NIC will be reset in
|
||||||
|
* start_hw anyway.
|
||||||
|
*/
|
||||||
|
iwl_write_prph(trans, APMG_RTC_INT_STT_REG,
|
||||||
|
APMG_RTC_INT_STT_RFKILL);
|
||||||
set_bit(STATUS_RFKILL, &trans_pcie->status);
|
set_bit(STATUS_RFKILL, &trans_pcie->status);
|
||||||
if (test_and_clear_bit(STATUS_HCMD_ACTIVE,
|
if (test_and_clear_bit(STATUS_HCMD_ACTIVE,
|
||||||
&trans_pcie->status))
|
&trans_pcie->status))
|
||||||
|
|
|
@ -670,6 +670,11 @@ static int iwl_trans_pcie_start_hw(struct iwl_trans *trans)
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Reset the entire device */
|
||||||
|
iwl_set_bit(trans, CSR_RESET, CSR_RESET_REG_FLAG_SW_RESET);
|
||||||
|
|
||||||
|
usleep_range(10, 15);
|
||||||
|
|
||||||
iwl_pcie_apm_init(trans);
|
iwl_pcie_apm_init(trans);
|
||||||
|
|
||||||
/* From now on, the op_mode will be kept updated about RF kill state */
|
/* From now on, the op_mode will be kept updated about RF kill state */
|
||||||
|
|
Loading…
Reference in New Issue