mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-29 11:11:45 -04:00
Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless
This commit is contained in:
commit
4f05444892
38 changed files with 246 additions and 148 deletions
|
|
@ -1,6 +1,6 @@
|
|||
config ATH10K
|
||||
tristate "Atheros 802.11ac wireless cards support"
|
||||
depends on MAC80211
|
||||
depends on MAC80211 && HAS_DMA
|
||||
select ATH_COMMON
|
||||
---help---
|
||||
This module adds support for wireless adapters based on
|
||||
|
|
|
|||
|
|
@ -1093,8 +1093,11 @@ static void brcmf_link_down(struct brcmf_cfg80211_vif *vif)
|
|||
brcmf_dbg(INFO, "Call WLC_DISASSOC to stop excess roaming\n ");
|
||||
err = brcmf_fil_cmd_data_set(vif->ifp,
|
||||
BRCMF_C_DISASSOC, NULL, 0);
|
||||
if (err)
|
||||
if (err) {
|
||||
brcmf_err("WLC_DISASSOC failed (%d)\n", err);
|
||||
cfg80211_disconnected(vif->wdev.netdev, 0,
|
||||
NULL, 0, GFP_KERNEL);
|
||||
}
|
||||
clear_bit(BRCMF_VIF_STATUS_CONNECTED, &vif->sme_state);
|
||||
}
|
||||
clear_bit(BRCMF_VIF_STATUS_CONNECTING, &vif->sme_state);
|
||||
|
|
|
|||
|
|
@ -1406,11 +1406,8 @@ static void cw1200_do_unjoin(struct cw1200_common *priv)
|
|||
if (!priv->join_status)
|
||||
goto done;
|
||||
|
||||
if (priv->join_status > CW1200_JOIN_STATUS_IBSS) {
|
||||
wiphy_err(priv->hw->wiphy, "Unexpected: join status: %d\n",
|
||||
priv->join_status);
|
||||
BUG_ON(1);
|
||||
}
|
||||
if (priv->join_status == CW1200_JOIN_STATUS_AP)
|
||||
goto done;
|
||||
|
||||
cancel_work_sync(&priv->update_filtering_work);
|
||||
cancel_work_sync(&priv->set_beacon_wakeup_period_work);
|
||||
|
|
|
|||
|
|
@ -4466,12 +4466,12 @@ il4965_irq_tasklet(struct il_priv *il)
|
|||
* is killed. Hence update the killswitch state here. The
|
||||
* rfkill handler will care about restarting if needed.
|
||||
*/
|
||||
if (!test_bit(S_ALIVE, &il->status)) {
|
||||
if (hw_rf_kill)
|
||||
set_bit(S_RFKILL, &il->status);
|
||||
else
|
||||
clear_bit(S_RFKILL, &il->status);
|
||||
if (hw_rf_kill) {
|
||||
set_bit(S_RFKILL, &il->status);
|
||||
} else {
|
||||
clear_bit(S_RFKILL, &il->status);
|
||||
wiphy_rfkill_set_hw_state(il->hw->wiphy, hw_rf_kill);
|
||||
il_force_reset(il, true);
|
||||
}
|
||||
|
||||
handled |= CSR_INT_BIT_RF_KILL;
|
||||
|
|
@ -5340,6 +5340,9 @@ il4965_alive_start(struct il_priv *il)
|
|||
|
||||
il->active_rate = RATES_MASK;
|
||||
|
||||
il_power_update_mode(il, true);
|
||||
D_INFO("Updated power mode\n");
|
||||
|
||||
if (il_is_associated(il)) {
|
||||
struct il_rxon_cmd *active_rxon =
|
||||
(struct il_rxon_cmd *)&il->active;
|
||||
|
|
@ -5370,9 +5373,6 @@ il4965_alive_start(struct il_priv *il)
|
|||
D_INFO("ALIVE processing complete.\n");
|
||||
wake_up(&il->wait_command_queue);
|
||||
|
||||
il_power_update_mode(il, true);
|
||||
D_INFO("Updated power mode\n");
|
||||
|
||||
return;
|
||||
|
||||
restart:
|
||||
|
|
|
|||
|
|
@ -4660,6 +4660,7 @@ il_force_reset(struct il_priv *il, bool external)
|
|||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(il_force_reset);
|
||||
|
||||
int
|
||||
il_mac_change_interface(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
|
||||
|
|
|
|||
|
|
@ -97,6 +97,8 @@
|
|||
|
||||
#define APMG_PCIDEV_STT_VAL_L1_ACT_DIS (0x00000800)
|
||||
|
||||
#define APMG_RTC_INT_STT_RFKILL (0x10000000)
|
||||
|
||||
/* Device system time */
|
||||
#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_tkip_params_cmd *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,
|
||||
|
|
@ -188,8 +188,8 @@ static void iwl_mvm_wowlan_program_keys(struct ieee80211_hw *hw,
|
|||
wkc.wep_key.key_offset = 0;
|
||||
} else {
|
||||
/* others start at 1 */
|
||||
data->gtk_key_idx++;
|
||||
wkc.wep_key.key_offset = data->gtk_key_idx;
|
||||
data->wep_key_idx++;
|
||||
wkc.wep_key.key_offset = data->wep_key_idx;
|
||||
}
|
||||
|
||||
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_icvlen = key->icv_len;
|
||||
} 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_icvlen = key->icv_len;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -69,7 +69,6 @@
|
|||
/* Scan Commands, Responses, Notifications */
|
||||
|
||||
/* Masks for iwl_scan_channel.type flags */
|
||||
#define SCAN_CHANNEL_TYPE_PASSIVE 0
|
||||
#define SCAN_CHANNEL_TYPE_ACTIVE BIT(0)
|
||||
#define SCAN_CHANNEL_NARROW_BAND BIT(22)
|
||||
|
||||
|
|
|
|||
|
|
@ -513,6 +513,27 @@ static int iwl_mvm_mac_add_interface(struct ieee80211_hw *hw,
|
|||
if (ret)
|
||||
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
|
||||
* template is configured (which happens only in the mac80211
|
||||
|
|
@ -537,27 +558,6 @@ static int iwl_mvm_mac_add_interface(struct ieee80211_hw *hw,
|
|||
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);
|
||||
if (ret)
|
||||
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 *)
|
||||
(cmd->data + le16_to_cpu(cmd->tx_cmd.len));
|
||||
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++) {
|
||||
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)
|
||||
chan->type = SCAN_CHANNEL_TYPE_PASSIVE;
|
||||
else
|
||||
chan->type = chan_type_value;
|
||||
chan->type &= cpu_to_le32(~SCAN_CHANNEL_TYPE_ACTIVE);
|
||||
chan->active_dwell = cpu_to_le16(active_dwell);
|
||||
chan->passive_dwell = cpu_to_le16(passive_dwell);
|
||||
chan->iteration_count = cpu_to_le16(1);
|
||||
|
|
|
|||
|
|
@ -914,6 +914,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_tid_data *tid_data = &mvmsta->tid_data[tid];
|
||||
u16 txq_id;
|
||||
enum iwl_mvm_agg_state old_state;
|
||||
|
||||
/*
|
||||
* 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,
|
|||
txq_id = tid_data->txq_id;
|
||||
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);
|
||||
old_state = tid_data->state;
|
||||
tid_data->state = IWL_AGG_OFF;
|
||||
spin_unlock_bh(&mvmsta->lock);
|
||||
|
||||
if (iwl_mvm_flush_tx_path(mvm, BIT(txq_id), true))
|
||||
IWL_ERR(mvm, "Couldn't flush the AGG queue\n");
|
||||
if (old_state >= IWL_AGG_ON) {
|
||||
if (iwl_mvm_flush_tx_path(mvm, BIT(txq_id), true))
|
||||
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] =
|
||||
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, 0x1221, iwl5150_agn_cfg)}, /* 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, 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);
|
||||
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);
|
||||
if (test_and_clear_bit(STATUS_HCMD_ACTIVE,
|
||||
&trans_pcie->status))
|
||||
|
|
|
|||
|
|
@ -670,6 +670,11 @@ static int iwl_trans_pcie_start_hw(struct iwl_trans *trans)
|
|||
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);
|
||||
|
||||
/* From now on, the op_mode will be kept updated about RF kill state */
|
||||
|
|
|
|||
|
|
@ -1727,9 +1727,9 @@ mwifiex_cfg80211_connect(struct wiphy *wiphy, struct net_device *dev,
|
|||
struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev);
|
||||
int ret;
|
||||
|
||||
if (priv->bss_mode != NL80211_IFTYPE_STATION) {
|
||||
if (GET_BSS_ROLE(priv) != MWIFIEX_BSS_ROLE_STA) {
|
||||
wiphy_err(wiphy,
|
||||
"%s: reject infra assoc request in non-STA mode\n",
|
||||
"%s: reject infra assoc request in non-STA role\n",
|
||||
dev->name);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -447,7 +447,8 @@ u32 mwifiex_get_supported_rates(struct mwifiex_private *priv, u8 *rates)
|
|||
u32 k = 0;
|
||||
struct mwifiex_adapter *adapter = priv->adapter;
|
||||
|
||||
if (priv->bss_mode == NL80211_IFTYPE_STATION) {
|
||||
if (priv->bss_mode == NL80211_IFTYPE_STATION ||
|
||||
priv->bss_mode == NL80211_IFTYPE_P2P_CLIENT) {
|
||||
switch (adapter->config_bands) {
|
||||
case BAND_B:
|
||||
dev_dbg(adapter->dev, "info: infra band=%d "
|
||||
|
|
|
|||
|
|
@ -1291,8 +1291,10 @@ int mwifiex_associate(struct mwifiex_private *priv,
|
|||
{
|
||||
u8 current_bssid[ETH_ALEN];
|
||||
|
||||
/* Return error if the adapter or table entry is not marked as infra */
|
||||
if ((priv->bss_mode != NL80211_IFTYPE_STATION) ||
|
||||
/* Return error if the adapter is not STA role or table entry
|
||||
* is not marked as infra.
|
||||
*/
|
||||
if ((GET_BSS_ROLE(priv) != MWIFIEX_BSS_ROLE_STA) ||
|
||||
(bss_desc->bss_mode != NL80211_IFTYPE_STATION))
|
||||
return -1;
|
||||
|
||||
|
|
|
|||
|
|
@ -1636,8 +1636,8 @@ static int mwifiex_sdio_host_to_card(struct mwifiex_adapter *adapter,
|
|||
/* Allocate buffer and copy payload */
|
||||
blk_size = MWIFIEX_SDIO_BLOCK_SIZE;
|
||||
buf_block_len = (pkt_len + blk_size - 1) / blk_size;
|
||||
*(u16 *) &payload[0] = (u16) pkt_len;
|
||||
*(u16 *) &payload[2] = type;
|
||||
*(__le16 *)&payload[0] = cpu_to_le16((u16)pkt_len);
|
||||
*(__le16 *)&payload[2] = cpu_to_le16(type);
|
||||
|
||||
/*
|
||||
* This is SDIO specific header
|
||||
|
|
|
|||
|
|
@ -257,10 +257,10 @@ int mwifiex_bss_start(struct mwifiex_private *priv, struct cfg80211_bss *bss,
|
|||
goto done;
|
||||
}
|
||||
|
||||
if (priv->bss_mode == NL80211_IFTYPE_STATION) {
|
||||
if (priv->bss_mode == NL80211_IFTYPE_STATION ||
|
||||
priv->bss_mode == NL80211_IFTYPE_P2P_CLIENT) {
|
||||
u8 config_bands;
|
||||
|
||||
/* Infra mode */
|
||||
ret = mwifiex_deauthenticate(priv, NULL);
|
||||
if (ret)
|
||||
goto done;
|
||||
|
|
|
|||
|
|
@ -936,13 +936,8 @@ void rt2x00queue_index_inc(struct queue_entry *entry, enum queue_index index)
|
|||
spin_unlock_irqrestore(&queue->index_lock, irqflags);
|
||||
}
|
||||
|
||||
void rt2x00queue_pause_queue(struct data_queue *queue)
|
||||
void rt2x00queue_pause_queue_nocheck(struct data_queue *queue)
|
||||
{
|
||||
if (!test_bit(DEVICE_STATE_PRESENT, &queue->rt2x00dev->flags) ||
|
||||
!test_bit(QUEUE_STARTED, &queue->flags) ||
|
||||
test_and_set_bit(QUEUE_PAUSED, &queue->flags))
|
||||
return;
|
||||
|
||||
switch (queue->qid) {
|
||||
case QID_AC_VO:
|
||||
case QID_AC_VI:
|
||||
|
|
@ -958,6 +953,15 @@ void rt2x00queue_pause_queue(struct data_queue *queue)
|
|||
break;
|
||||
}
|
||||
}
|
||||
void rt2x00queue_pause_queue(struct data_queue *queue)
|
||||
{
|
||||
if (!test_bit(DEVICE_STATE_PRESENT, &queue->rt2x00dev->flags) ||
|
||||
!test_bit(QUEUE_STARTED, &queue->flags) ||
|
||||
test_and_set_bit(QUEUE_PAUSED, &queue->flags))
|
||||
return;
|
||||
|
||||
rt2x00queue_pause_queue_nocheck(queue);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(rt2x00queue_pause_queue);
|
||||
|
||||
void rt2x00queue_unpause_queue(struct data_queue *queue)
|
||||
|
|
@ -1019,7 +1023,7 @@ void rt2x00queue_stop_queue(struct data_queue *queue)
|
|||
return;
|
||||
}
|
||||
|
||||
rt2x00queue_pause_queue(queue);
|
||||
rt2x00queue_pause_queue_nocheck(queue);
|
||||
|
||||
queue->rt2x00dev->ops->lib->stop_queue(queue);
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue