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-next-2.6
Conflicts: drivers/net/wireless/iwlwifi/iwl-commands.h
This commit is contained in:
commit
2a88e7e559
52 changed files with 1708 additions and 4290 deletions
|
|
@ -1154,10 +1154,6 @@ static int ieee80211_set_txq_params(struct wiphy *wiphy,
|
|||
return -EINVAL;
|
||||
}
|
||||
|
||||
/* enable WMM or activate new settings */
|
||||
local->hw.conf.flags |= IEEE80211_CONF_QOS;
|
||||
drv_config(local, IEEE80211_CONF_CHANGE_QOS);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -29,7 +29,7 @@ void ieee80211_ht_cap_ie_to_sta_ht_cap(struct ieee80211_supported_band *sband,
|
|||
|
||||
memset(ht_cap, 0, sizeof(*ht_cap));
|
||||
|
||||
if (!ht_cap_ie)
|
||||
if (!ht_cap_ie || !sband->ht_cap.ht_supported)
|
||||
return;
|
||||
|
||||
ht_cap->ht_supported = true;
|
||||
|
|
|
|||
|
|
@ -43,6 +43,8 @@ static void ieee80211_rx_mgmt_auth_ibss(struct ieee80211_sub_if_data *sdata,
|
|||
{
|
||||
u16 auth_alg, auth_transaction, status_code;
|
||||
|
||||
lockdep_assert_held(&sdata->u.ibss.mtx);
|
||||
|
||||
if (len < 24 + 6)
|
||||
return;
|
||||
|
||||
|
|
@ -78,6 +80,8 @@ static void __ieee80211_sta_join_ibss(struct ieee80211_sub_if_data *sdata,
|
|||
u32 bss_change;
|
||||
u8 supp_rates[IEEE80211_MAX_SUPP_RATES];
|
||||
|
||||
lockdep_assert_held(&ifibss->mtx);
|
||||
|
||||
/* Reset own TSF to allow time synchronization work. */
|
||||
drv_reset_tsf(local);
|
||||
|
||||
|
|
@ -205,6 +209,8 @@ static void ieee80211_sta_join_ibss(struct ieee80211_sub_if_data *sdata,
|
|||
int i, j;
|
||||
u16 beacon_int = cbss->beacon_interval;
|
||||
|
||||
lockdep_assert_held(&sdata->u.ibss.mtx);
|
||||
|
||||
if (beacon_int < 10)
|
||||
beacon_int = 10;
|
||||
|
||||
|
|
@ -449,6 +455,8 @@ static int ieee80211_sta_active_ibss(struct ieee80211_sub_if_data *sdata)
|
|||
int active = 0;
|
||||
struct sta_info *sta;
|
||||
|
||||
lockdep_assert_held(&sdata->u.ibss.mtx);
|
||||
|
||||
rcu_read_lock();
|
||||
|
||||
list_for_each_entry_rcu(sta, &local->sta_list, list) {
|
||||
|
|
@ -473,6 +481,8 @@ static void ieee80211_sta_merge_ibss(struct ieee80211_sub_if_data *sdata)
|
|||
{
|
||||
struct ieee80211_if_ibss *ifibss = &sdata->u.ibss;
|
||||
|
||||
lockdep_assert_held(&ifibss->mtx);
|
||||
|
||||
mod_timer(&ifibss->timer,
|
||||
round_jiffies(jiffies + IEEE80211_IBSS_MERGE_INTERVAL));
|
||||
|
||||
|
|
@ -505,6 +515,8 @@ static void ieee80211_sta_create_ibss(struct ieee80211_sub_if_data *sdata)
|
|||
u16 capability;
|
||||
int i;
|
||||
|
||||
lockdep_assert_held(&ifibss->mtx);
|
||||
|
||||
if (ifibss->fixed_bssid) {
|
||||
memcpy(bssid, ifibss->bssid, ETH_ALEN);
|
||||
} else {
|
||||
|
|
@ -549,6 +561,8 @@ static void ieee80211_sta_find_ibss(struct ieee80211_sub_if_data *sdata)
|
|||
int active_ibss;
|
||||
u16 capability;
|
||||
|
||||
lockdep_assert_held(&ifibss->mtx);
|
||||
|
||||
active_ibss = ieee80211_sta_active_ibss(sdata);
|
||||
#ifdef CONFIG_MAC80211_IBSS_DEBUG
|
||||
printk(KERN_DEBUG "%s: sta_find_ibss (active_ibss=%d)\n",
|
||||
|
|
@ -637,6 +651,8 @@ static void ieee80211_rx_mgmt_probe_req(struct ieee80211_sub_if_data *sdata,
|
|||
struct ieee80211_mgmt *resp;
|
||||
u8 *pos, *end;
|
||||
|
||||
lockdep_assert_held(&ifibss->mtx);
|
||||
|
||||
if (ifibss->state != IEEE80211_IBSS_MLME_JOINED ||
|
||||
len < 24 + 2 || !ifibss->presp)
|
||||
return;
|
||||
|
|
@ -740,6 +756,8 @@ void ieee80211_ibss_rx_queued_mgmt(struct ieee80211_sub_if_data *sdata,
|
|||
mgmt = (struct ieee80211_mgmt *) skb->data;
|
||||
fc = le16_to_cpu(mgmt->frame_control);
|
||||
|
||||
mutex_lock(&sdata->u.ibss.mtx);
|
||||
|
||||
switch (fc & IEEE80211_FCTL_STYPE) {
|
||||
case IEEE80211_STYPE_PROBE_REQ:
|
||||
ieee80211_rx_mgmt_probe_req(sdata, mgmt, skb->len);
|
||||
|
|
@ -756,14 +774,23 @@ void ieee80211_ibss_rx_queued_mgmt(struct ieee80211_sub_if_data *sdata,
|
|||
ieee80211_rx_mgmt_auth_ibss(sdata, mgmt, skb->len);
|
||||
break;
|
||||
}
|
||||
|
||||
mutex_unlock(&sdata->u.ibss.mtx);
|
||||
}
|
||||
|
||||
void ieee80211_ibss_work(struct ieee80211_sub_if_data *sdata)
|
||||
{
|
||||
struct ieee80211_if_ibss *ifibss = &sdata->u.ibss;
|
||||
|
||||
if (!test_and_clear_bit(IEEE80211_IBSS_REQ_RUN, &ifibss->request))
|
||||
return;
|
||||
mutex_lock(&ifibss->mtx);
|
||||
|
||||
/*
|
||||
* Work could be scheduled after scan or similar
|
||||
* when we aren't even joined (or trying) with a
|
||||
* network.
|
||||
*/
|
||||
if (!ifibss->ssid_len)
|
||||
goto out;
|
||||
|
||||
switch (ifibss->state) {
|
||||
case IEEE80211_IBSS_MLME_SEARCH:
|
||||
|
|
@ -776,15 +803,9 @@ void ieee80211_ibss_work(struct ieee80211_sub_if_data *sdata)
|
|||
WARN_ON(1);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void ieee80211_queue_ibss_work(struct ieee80211_sub_if_data *sdata)
|
||||
{
|
||||
struct ieee80211_if_ibss *ifibss = &sdata->u.ibss;
|
||||
struct ieee80211_local *local = sdata->local;
|
||||
|
||||
set_bit(IEEE80211_IBSS_REQ_RUN, &ifibss->request);
|
||||
ieee80211_queue_work(&local->hw, &sdata->work);
|
||||
out:
|
||||
mutex_unlock(&ifibss->mtx);
|
||||
}
|
||||
|
||||
static void ieee80211_ibss_timer(unsigned long data)
|
||||
|
|
@ -799,7 +820,7 @@ static void ieee80211_ibss_timer(unsigned long data)
|
|||
return;
|
||||
}
|
||||
|
||||
ieee80211_queue_ibss_work(sdata);
|
||||
ieee80211_queue_work(&local->hw, &sdata->work);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
|
|
@ -828,6 +849,7 @@ void ieee80211_ibss_setup_sdata(struct ieee80211_sub_if_data *sdata)
|
|||
|
||||
setup_timer(&ifibss->timer, ieee80211_ibss_timer,
|
||||
(unsigned long) sdata);
|
||||
mutex_init(&ifibss->mtx);
|
||||
}
|
||||
|
||||
/* scan finished notification */
|
||||
|
|
@ -841,10 +863,8 @@ void ieee80211_ibss_notify_scan_completed(struct ieee80211_local *local)
|
|||
continue;
|
||||
if (sdata->vif.type != NL80211_IFTYPE_ADHOC)
|
||||
continue;
|
||||
if (!sdata->u.ibss.ssid_len)
|
||||
continue;
|
||||
sdata->u.ibss.last_scan_completed = jiffies;
|
||||
ieee80211_queue_ibss_work(sdata);
|
||||
ieee80211_queue_work(&local->hw, &sdata->work);
|
||||
}
|
||||
mutex_unlock(&local->iflist_mtx);
|
||||
}
|
||||
|
|
@ -854,6 +874,17 @@ int ieee80211_ibss_join(struct ieee80211_sub_if_data *sdata,
|
|||
{
|
||||
struct sk_buff *skb;
|
||||
|
||||
skb = dev_alloc_skb(sdata->local->hw.extra_tx_headroom +
|
||||
36 /* bitrates */ +
|
||||
34 /* SSID */ +
|
||||
3 /* DS params */ +
|
||||
4 /* IBSS params */ +
|
||||
params->ie_len);
|
||||
if (!skb)
|
||||
return -ENOMEM;
|
||||
|
||||
mutex_lock(&sdata->u.ibss.mtx);
|
||||
|
||||
if (params->bssid) {
|
||||
memcpy(sdata->u.ibss.bssid, params->bssid, ETH_ALEN);
|
||||
sdata->u.ibss.fixed_bssid = true;
|
||||
|
|
@ -882,35 +913,19 @@ int ieee80211_ibss_join(struct ieee80211_sub_if_data *sdata,
|
|||
sdata->u.ibss.ie_len = params->ie_len;
|
||||
}
|
||||
|
||||
skb = dev_alloc_skb(sdata->local->hw.extra_tx_headroom +
|
||||
36 /* bitrates */ +
|
||||
34 /* SSID */ +
|
||||
3 /* DS params */ +
|
||||
4 /* IBSS params */ +
|
||||
params->ie_len);
|
||||
if (!skb)
|
||||
return -ENOMEM;
|
||||
|
||||
sdata->u.ibss.skb = skb;
|
||||
sdata->u.ibss.state = IEEE80211_IBSS_MLME_SEARCH;
|
||||
sdata->u.ibss.ibss_join_req = jiffies;
|
||||
|
||||
memcpy(sdata->u.ibss.ssid, params->ssid, IEEE80211_MAX_SSID_LEN);
|
||||
|
||||
/*
|
||||
* The ssid_len setting below is used to see whether
|
||||
* we are active, and we need all other settings
|
||||
* before that may get visible.
|
||||
*/
|
||||
mb();
|
||||
|
||||
sdata->u.ibss.ssid_len = params->ssid_len;
|
||||
|
||||
ieee80211_recalc_idle(sdata->local);
|
||||
|
||||
set_bit(IEEE80211_IBSS_REQ_RUN, &sdata->u.ibss.request);
|
||||
ieee80211_queue_work(&sdata->local->hw, &sdata->work);
|
||||
|
||||
mutex_unlock(&sdata->u.ibss.mtx);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -921,7 +936,9 @@ int ieee80211_ibss_leave(struct ieee80211_sub_if_data *sdata)
|
|||
struct ieee80211_local *local = sdata->local;
|
||||
struct cfg80211_bss *cbss;
|
||||
u16 capability;
|
||||
int active_ibss = 0;
|
||||
int active_ibss;
|
||||
|
||||
mutex_lock(&sdata->u.ibss.mtx);
|
||||
|
||||
active_ibss = ieee80211_sta_active_ibss(sdata);
|
||||
|
||||
|
|
@ -943,11 +960,6 @@ int ieee80211_ibss_leave(struct ieee80211_sub_if_data *sdata)
|
|||
}
|
||||
}
|
||||
|
||||
del_timer_sync(&sdata->u.ibss.timer);
|
||||
clear_bit(IEEE80211_IBSS_REQ_RUN, &sdata->u.ibss.request);
|
||||
cancel_work_sync(&sdata->work);
|
||||
clear_bit(IEEE80211_IBSS_REQ_RUN, &sdata->u.ibss.request);
|
||||
|
||||
sta_info_flush(sdata->local, sdata);
|
||||
|
||||
/* remove beacon */
|
||||
|
|
@ -964,6 +976,10 @@ int ieee80211_ibss_leave(struct ieee80211_sub_if_data *sdata)
|
|||
memset(sdata->u.ibss.bssid, 0, ETH_ALEN);
|
||||
sdata->u.ibss.ssid_len = 0;
|
||||
|
||||
del_timer_sync(&sdata->u.ibss.timer);
|
||||
|
||||
mutex_unlock(&sdata->u.ibss.mtx);
|
||||
|
||||
ieee80211_recalc_idle(sdata->local);
|
||||
|
||||
return 0;
|
||||
|
|
|
|||
|
|
@ -377,14 +377,11 @@ struct ieee80211_if_managed {
|
|||
int last_cqm_event_signal;
|
||||
};
|
||||
|
||||
enum ieee80211_ibss_request {
|
||||
IEEE80211_IBSS_REQ_RUN = 0,
|
||||
};
|
||||
|
||||
struct ieee80211_if_ibss {
|
||||
struct timer_list timer;
|
||||
|
||||
unsigned long request;
|
||||
struct mutex mtx;
|
||||
|
||||
unsigned long last_scan_completed;
|
||||
|
||||
u32 basic_rates;
|
||||
|
|
|
|||
|
|
@ -249,6 +249,8 @@ static int ieee80211_open(struct net_device *dev)
|
|||
local->fif_other_bss++;
|
||||
|
||||
ieee80211_configure_filter(local);
|
||||
|
||||
netif_carrier_on(dev);
|
||||
break;
|
||||
default:
|
||||
res = drv_add_interface(local, &sdata->vif);
|
||||
|
|
@ -741,7 +743,7 @@ static void ieee80211_iface_work(struct work_struct *work)
|
|||
int len = skb->len;
|
||||
|
||||
mutex_lock(&local->sta_mtx);
|
||||
sta = sta_info_get(sdata, mgmt->sa);
|
||||
sta = sta_info_get_bss(sdata, mgmt->sa);
|
||||
if (sta) {
|
||||
switch (mgmt->u.action.u.addba_req.action_code) {
|
||||
case WLAN_ACTION_ADDBA_REQ:
|
||||
|
|
@ -782,7 +784,7 @@ static void ieee80211_iface_work(struct work_struct *work)
|
|||
* right, so terminate the session.
|
||||
*/
|
||||
mutex_lock(&local->sta_mtx);
|
||||
sta = sta_info_get(sdata, mgmt->sa);
|
||||
sta = sta_info_get_bss(sdata, mgmt->sa);
|
||||
if (sta) {
|
||||
u16 tid = *ieee80211_get_qos_ctl(hdr) &
|
||||
IEEE80211_QOS_CTL_TID_MASK;
|
||||
|
|
|
|||
|
|
@ -698,10 +698,11 @@ void ieee80211_dynamic_ps_timer(unsigned long data)
|
|||
|
||||
/* MLME */
|
||||
static void ieee80211_sta_wmm_params(struct ieee80211_local *local,
|
||||
struct ieee80211_if_managed *ifmgd,
|
||||
struct ieee80211_sub_if_data *sdata,
|
||||
u8 *wmm_param, size_t wmm_param_len)
|
||||
{
|
||||
struct ieee80211_tx_queue_params params;
|
||||
struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
|
||||
size_t left;
|
||||
int count;
|
||||
u8 *pos, uapsd_queues = 0;
|
||||
|
|
@ -790,8 +791,8 @@ static void ieee80211_sta_wmm_params(struct ieee80211_local *local,
|
|||
}
|
||||
|
||||
/* enable WMM or activate new settings */
|
||||
local->hw.conf.flags |= IEEE80211_CONF_QOS;
|
||||
drv_config(local, IEEE80211_CONF_CHANGE_QOS);
|
||||
sdata->vif.bss_conf.qos = true;
|
||||
ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_QOS);
|
||||
}
|
||||
|
||||
static u32 ieee80211_handle_bss_capability(struct ieee80211_sub_if_data *sdata,
|
||||
|
|
@ -1325,7 +1326,7 @@ static bool ieee80211_assoc_success(struct ieee80211_work *wk,
|
|||
}
|
||||
|
||||
if (elems.wmm_param)
|
||||
ieee80211_sta_wmm_params(local, ifmgd, elems.wmm_param,
|
||||
ieee80211_sta_wmm_params(local, sdata, elems.wmm_param,
|
||||
elems.wmm_param_len);
|
||||
else
|
||||
ieee80211_set_wmm_default(sdata);
|
||||
|
|
@ -1597,7 +1598,7 @@ static void ieee80211_rx_mgmt_beacon(struct ieee80211_sub_if_data *sdata,
|
|||
ieee80211_rx_bss_info(sdata, mgmt, len, rx_status, &elems,
|
||||
true);
|
||||
|
||||
ieee80211_sta_wmm_params(local, ifmgd, elems.wmm_param,
|
||||
ieee80211_sta_wmm_params(local, sdata, elems.wmm_param,
|
||||
elems.wmm_param_len);
|
||||
}
|
||||
|
||||
|
|
@ -2030,6 +2031,8 @@ int ieee80211_mgd_auth(struct ieee80211_sub_if_data *sdata,
|
|||
auth_alg = WLAN_AUTH_OPEN;
|
||||
break;
|
||||
case NL80211_AUTHTYPE_SHARED_KEY:
|
||||
if (IS_ERR(sdata->local->wep_tx_tfm))
|
||||
return -EOPNOTSUPP;
|
||||
auth_alg = WLAN_AUTH_SHARED_KEY;
|
||||
break;
|
||||
case NL80211_AUTHTYPE_FT:
|
||||
|
|
|
|||
|
|
@ -803,8 +803,8 @@ void ieee80211_set_wmm_default(struct ieee80211_sub_if_data *sdata)
|
|||
|
||||
/* after reinitialize QoS TX queues setting to default,
|
||||
* disable QoS at all */
|
||||
local->hw.conf.flags &= ~IEEE80211_CONF_QOS;
|
||||
drv_config(local, IEEE80211_CONF_CHANGE_QOS);
|
||||
sdata->vif.bss_conf.qos = sdata->vif.type != NL80211_IFTYPE_STATION;
|
||||
ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_QOS);
|
||||
}
|
||||
|
||||
void ieee80211_sta_def_wmm_params(struct ieee80211_sub_if_data *sdata,
|
||||
|
|
@ -1161,7 +1161,8 @@ int ieee80211_reconfig(struct ieee80211_local *local)
|
|||
BSS_CHANGED_BASIC_RATES |
|
||||
BSS_CHANGED_BEACON_INT |
|
||||
BSS_CHANGED_BSSID |
|
||||
BSS_CHANGED_CQM;
|
||||
BSS_CHANGED_CQM |
|
||||
BSS_CHANGED_QOS;
|
||||
|
||||
switch (sdata->vif.type) {
|
||||
case NL80211_IFTYPE_STATION:
|
||||
|
|
|
|||
|
|
@ -32,13 +32,16 @@ int ieee80211_wep_init(struct ieee80211_local *local)
|
|||
|
||||
local->wep_tx_tfm = crypto_alloc_blkcipher("ecb(arc4)", 0,
|
||||
CRYPTO_ALG_ASYNC);
|
||||
if (IS_ERR(local->wep_tx_tfm))
|
||||
if (IS_ERR(local->wep_tx_tfm)) {
|
||||
local->wep_rx_tfm = ERR_PTR(-EINVAL);
|
||||
return PTR_ERR(local->wep_tx_tfm);
|
||||
}
|
||||
|
||||
local->wep_rx_tfm = crypto_alloc_blkcipher("ecb(arc4)", 0,
|
||||
CRYPTO_ALG_ASYNC);
|
||||
if (IS_ERR(local->wep_rx_tfm)) {
|
||||
crypto_free_blkcipher(local->wep_tx_tfm);
|
||||
local->wep_tx_tfm = ERR_PTR(-EINVAL);
|
||||
return PTR_ERR(local->wep_rx_tfm);
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue