mirror of https://gitee.com/openkylin/linux.git
Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless
This commit is contained in:
commit
1c659a4475
|
@ -31,6 +31,12 @@ config B43_BCMA
|
||||||
depends on B43 && BCMA
|
depends on B43 && BCMA
|
||||||
default y
|
default y
|
||||||
|
|
||||||
|
config B43_BCMA_EXTRA
|
||||||
|
bool "Hardware support that overlaps with the brcmsmac driver"
|
||||||
|
depends on B43_BCMA
|
||||||
|
default n if BRCMSMAC || BRCMSMAC_MODULE
|
||||||
|
default y
|
||||||
|
|
||||||
config B43_SSB
|
config B43_SSB
|
||||||
bool
|
bool
|
||||||
depends on B43 && SSB
|
depends on B43 && SSB
|
||||||
|
|
|
@ -116,8 +116,10 @@ MODULE_PARM_DESC(pio, "Use PIO accesses by default: 0=DMA, 1=PIO");
|
||||||
#ifdef CONFIG_B43_BCMA
|
#ifdef CONFIG_B43_BCMA
|
||||||
static const struct bcma_device_id b43_bcma_tbl[] = {
|
static const struct bcma_device_id b43_bcma_tbl[] = {
|
||||||
BCMA_CORE(BCMA_MANUF_BCM, BCMA_CORE_80211, 0x11, BCMA_ANY_CLASS),
|
BCMA_CORE(BCMA_MANUF_BCM, BCMA_CORE_80211, 0x11, BCMA_ANY_CLASS),
|
||||||
|
#ifdef CONFIG_B43_BCMA_EXTRA
|
||||||
BCMA_CORE(BCMA_MANUF_BCM, BCMA_CORE_80211, 0x17, BCMA_ANY_CLASS),
|
BCMA_CORE(BCMA_MANUF_BCM, BCMA_CORE_80211, 0x17, BCMA_ANY_CLASS),
|
||||||
BCMA_CORE(BCMA_MANUF_BCM, BCMA_CORE_80211, 0x18, BCMA_ANY_CLASS),
|
BCMA_CORE(BCMA_MANUF_BCM, BCMA_CORE_80211, 0x18, BCMA_ANY_CLASS),
|
||||||
|
#endif
|
||||||
BCMA_CORE(BCMA_MANUF_BCM, BCMA_CORE_80211, 0x1D, BCMA_ANY_CLASS),
|
BCMA_CORE(BCMA_MANUF_BCM, BCMA_CORE_80211, 0x1D, BCMA_ANY_CLASS),
|
||||||
BCMA_CORETABLE_END
|
BCMA_CORETABLE_END
|
||||||
};
|
};
|
||||||
|
|
|
@ -7981,13 +7981,21 @@ int brcms_c_get_curband(struct brcms_c_info *wlc)
|
||||||
|
|
||||||
void brcms_c_wait_for_tx_completion(struct brcms_c_info *wlc, bool drop)
|
void brcms_c_wait_for_tx_completion(struct brcms_c_info *wlc, bool drop)
|
||||||
{
|
{
|
||||||
|
int timeout = 20;
|
||||||
|
|
||||||
/* flush packet queue when requested */
|
/* flush packet queue when requested */
|
||||||
if (drop)
|
if (drop)
|
||||||
brcmu_pktq_flush(&wlc->pkt_queue->q, false, NULL, NULL);
|
brcmu_pktq_flush(&wlc->pkt_queue->q, false, NULL, NULL);
|
||||||
|
|
||||||
/* wait for queue and DMA fifos to run dry */
|
/* wait for queue and DMA fifos to run dry */
|
||||||
while (!pktq_empty(&wlc->pkt_queue->q) || brcms_txpktpendtot(wlc) > 0)
|
while (!pktq_empty(&wlc->pkt_queue->q) || brcms_txpktpendtot(wlc) > 0) {
|
||||||
brcms_msleep(wlc->wl, 1);
|
brcms_msleep(wlc->wl, 1);
|
||||||
|
|
||||||
|
if (--timeout == 0)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
WARN_ON_ONCE(timeout == 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void brcms_c_set_beacon_listen_interval(struct brcms_c_info *wlc, u8 interval)
|
void brcms_c_set_beacon_listen_interval(struct brcms_c_info *wlc, u8 interval)
|
||||||
|
|
|
@ -227,7 +227,7 @@ KEY_OPS(key);
|
||||||
void ieee80211_debugfs_key_add(struct ieee80211_key *key)
|
void ieee80211_debugfs_key_add(struct ieee80211_key *key)
|
||||||
{
|
{
|
||||||
static int keycount;
|
static int keycount;
|
||||||
char buf[50];
|
char buf[100];
|
||||||
struct sta_info *sta;
|
struct sta_info *sta;
|
||||||
|
|
||||||
if (!key->local->debugfs.keys)
|
if (!key->local->debugfs.keys)
|
||||||
|
@ -244,7 +244,8 @@ void ieee80211_debugfs_key_add(struct ieee80211_key *key)
|
||||||
|
|
||||||
sta = key->sta;
|
sta = key->sta;
|
||||||
if (sta) {
|
if (sta) {
|
||||||
sprintf(buf, "../../stations/%pM", sta->sta.addr);
|
sprintf(buf, "../../netdev:%s/stations/%pM",
|
||||||
|
sta->sdata->name, sta->sta.addr);
|
||||||
key->debugfs.stalink =
|
key->debugfs.stalink =
|
||||||
debugfs_create_symlink("station", key->debugfs.dir, buf);
|
debugfs_create_symlink("station", key->debugfs.dir, buf);
|
||||||
}
|
}
|
||||||
|
|
|
@ -119,12 +119,12 @@ static int mesh_path_sel_frame_tx(enum mpath_frame_type action, u8 flags,
|
||||||
int hdr_len = offsetof(struct ieee80211_mgmt, u.action.u.mesh_action) +
|
int hdr_len = offsetof(struct ieee80211_mgmt, u.action.u.mesh_action) +
|
||||||
sizeof(mgmt->u.action.u.mesh_action);
|
sizeof(mgmt->u.action.u.mesh_action);
|
||||||
|
|
||||||
skb = dev_alloc_skb(local->hw.extra_tx_headroom +
|
skb = dev_alloc_skb(local->tx_headroom +
|
||||||
hdr_len +
|
hdr_len +
|
||||||
2 + 37); /* max HWMP IE */
|
2 + 37); /* max HWMP IE */
|
||||||
if (!skb)
|
if (!skb)
|
||||||
return -1;
|
return -1;
|
||||||
skb_reserve(skb, local->hw.extra_tx_headroom);
|
skb_reserve(skb, local->tx_headroom);
|
||||||
mgmt = (struct ieee80211_mgmt *) skb_put(skb, hdr_len);
|
mgmt = (struct ieee80211_mgmt *) skb_put(skb, hdr_len);
|
||||||
memset(mgmt, 0, hdr_len);
|
memset(mgmt, 0, hdr_len);
|
||||||
mgmt->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT |
|
mgmt->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT |
|
||||||
|
@ -250,12 +250,12 @@ int mesh_path_error_tx(u8 ttl, u8 *target, __le32 target_sn,
|
||||||
if (time_before(jiffies, ifmsh->next_perr))
|
if (time_before(jiffies, ifmsh->next_perr))
|
||||||
return -EAGAIN;
|
return -EAGAIN;
|
||||||
|
|
||||||
skb = dev_alloc_skb(local->hw.extra_tx_headroom +
|
skb = dev_alloc_skb(local->tx_headroom +
|
||||||
hdr_len +
|
hdr_len +
|
||||||
2 + 15 /* PERR IE */);
|
2 + 15 /* PERR IE */);
|
||||||
if (!skb)
|
if (!skb)
|
||||||
return -1;
|
return -1;
|
||||||
skb_reserve(skb, local->tx_headroom + local->hw.extra_tx_headroom);
|
skb_reserve(skb, local->tx_headroom);
|
||||||
mgmt = (struct ieee80211_mgmt *) skb_put(skb, hdr_len);
|
mgmt = (struct ieee80211_mgmt *) skb_put(skb, hdr_len);
|
||||||
memset(mgmt, 0, hdr_len);
|
memset(mgmt, 0, hdr_len);
|
||||||
mgmt->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT |
|
mgmt->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT |
|
||||||
|
|
|
@ -172,7 +172,7 @@ static int mesh_plink_frame_tx(struct ieee80211_sub_if_data *sdata,
|
||||||
int hdr_len = offsetof(struct ieee80211_mgmt, u.action.u.self_prot) +
|
int hdr_len = offsetof(struct ieee80211_mgmt, u.action.u.self_prot) +
|
||||||
sizeof(mgmt->u.action.u.self_prot);
|
sizeof(mgmt->u.action.u.self_prot);
|
||||||
|
|
||||||
skb = dev_alloc_skb(local->hw.extra_tx_headroom +
|
skb = dev_alloc_skb(local->tx_headroom +
|
||||||
hdr_len +
|
hdr_len +
|
||||||
2 + /* capability info */
|
2 + /* capability info */
|
||||||
2 + /* AID */
|
2 + /* AID */
|
||||||
|
@ -186,7 +186,7 @@ static int mesh_plink_frame_tx(struct ieee80211_sub_if_data *sdata,
|
||||||
sdata->u.mesh.ie_len);
|
sdata->u.mesh.ie_len);
|
||||||
if (!skb)
|
if (!skb)
|
||||||
return -1;
|
return -1;
|
||||||
skb_reserve(skb, local->hw.extra_tx_headroom);
|
skb_reserve(skb, local->tx_headroom);
|
||||||
mgmt = (struct ieee80211_mgmt *) skb_put(skb, hdr_len);
|
mgmt = (struct ieee80211_mgmt *) skb_put(skb, hdr_len);
|
||||||
memset(mgmt, 0, hdr_len);
|
memset(mgmt, 0, hdr_len);
|
||||||
mgmt->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT |
|
mgmt->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT |
|
||||||
|
|
|
@ -2750,7 +2750,6 @@ int ieee80211_mgd_deauth(struct ieee80211_sub_if_data *sdata,
|
||||||
{
|
{
|
||||||
struct ieee80211_local *local = sdata->local;
|
struct ieee80211_local *local = sdata->local;
|
||||||
struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
|
struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
|
||||||
struct ieee80211_work *wk;
|
|
||||||
u8 bssid[ETH_ALEN];
|
u8 bssid[ETH_ALEN];
|
||||||
bool assoc_bss = false;
|
bool assoc_bss = false;
|
||||||
|
|
||||||
|
@ -2763,30 +2762,47 @@ int ieee80211_mgd_deauth(struct ieee80211_sub_if_data *sdata,
|
||||||
assoc_bss = true;
|
assoc_bss = true;
|
||||||
} else {
|
} else {
|
||||||
bool not_auth_yet = false;
|
bool not_auth_yet = false;
|
||||||
|
struct ieee80211_work *tmp, *wk = NULL;
|
||||||
|
|
||||||
mutex_unlock(&ifmgd->mtx);
|
mutex_unlock(&ifmgd->mtx);
|
||||||
|
|
||||||
mutex_lock(&local->mtx);
|
mutex_lock(&local->mtx);
|
||||||
list_for_each_entry(wk, &local->work_list, list) {
|
list_for_each_entry(tmp, &local->work_list, list) {
|
||||||
if (wk->sdata != sdata)
|
if (tmp->sdata != sdata)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (wk->type != IEEE80211_WORK_DIRECT_PROBE &&
|
if (tmp->type != IEEE80211_WORK_DIRECT_PROBE &&
|
||||||
wk->type != IEEE80211_WORK_AUTH &&
|
tmp->type != IEEE80211_WORK_AUTH &&
|
||||||
wk->type != IEEE80211_WORK_ASSOC &&
|
tmp->type != IEEE80211_WORK_ASSOC &&
|
||||||
wk->type != IEEE80211_WORK_ASSOC_BEACON_WAIT)
|
tmp->type != IEEE80211_WORK_ASSOC_BEACON_WAIT)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (memcmp(req->bss->bssid, wk->filter_ta, ETH_ALEN))
|
if (memcmp(req->bss->bssid, tmp->filter_ta, ETH_ALEN))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
not_auth_yet = wk->type == IEEE80211_WORK_DIRECT_PROBE;
|
not_auth_yet = tmp->type == IEEE80211_WORK_DIRECT_PROBE;
|
||||||
list_del_rcu(&wk->list);
|
list_del_rcu(&tmp->list);
|
||||||
free_work(wk);
|
synchronize_rcu();
|
||||||
|
wk = tmp;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
mutex_unlock(&local->mtx);
|
mutex_unlock(&local->mtx);
|
||||||
|
|
||||||
|
if (wk && wk->type == IEEE80211_WORK_ASSOC) {
|
||||||
|
/* clean up dummy sta & TX sync */
|
||||||
|
sta_info_destroy_addr(wk->sdata, wk->filter_ta);
|
||||||
|
if (wk->assoc.synced)
|
||||||
|
drv_finish_tx_sync(local, wk->sdata,
|
||||||
|
wk->filter_ta,
|
||||||
|
IEEE80211_TX_SYNC_ASSOC);
|
||||||
|
} else if (wk && wk->type == IEEE80211_WORK_AUTH) {
|
||||||
|
if (wk->probe_auth.synced)
|
||||||
|
drv_finish_tx_sync(local, wk->sdata,
|
||||||
|
wk->filter_ta,
|
||||||
|
IEEE80211_TX_SYNC_AUTH);
|
||||||
|
}
|
||||||
|
kfree(wk);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If somebody requests authentication and we haven't
|
* If somebody requests authentication and we haven't
|
||||||
* sent out an auth frame yet there's no need to send
|
* sent out an auth frame yet there's no need to send
|
||||||
|
|
Loading…
Reference in New Issue