1
0
Fork 0

Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless

hifive-unleashed-5.1
John W. Linville 2012-02-01 10:48:50 -05:00
commit 874239f51f
10 changed files with 58 additions and 23 deletions

View File

@ -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

View File

@ -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
}; };

View File

@ -7967,13 +7967,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)

View File

@ -972,11 +972,11 @@ void iwl_irq_tasklet(struct iwl_trans *trans)
} }
#endif #endif
spin_unlock_irqrestore(&trans->shrd->lock, flags);
/* saved interrupt in inta variable now we can reset trans_pcie->inta */ /* saved interrupt in inta variable now we can reset trans_pcie->inta */
trans_pcie->inta = 0; trans_pcie->inta = 0;
spin_unlock_irqrestore(&trans->shrd->lock, flags);
/* Now service all interrupt bits discovered above. */ /* Now service all interrupt bits discovered above. */
if (inta & CSR_INT_BIT_HW_ERR) { if (inta & CSR_INT_BIT_HW_ERR) {
IWL_ERR(trans, "Hardware error detected. Restarting.\n"); IWL_ERR(trans, "Hardware error detected. Restarting.\n");

View File

@ -225,9 +225,9 @@ KEY_OPS(key);
key, &key_##name##_ops); key, &key_##name##_ops);
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);
} }

View File

@ -81,6 +81,7 @@ static void __ieee80211_sta_join_ibss(struct ieee80211_sub_if_data *sdata,
sdata->drop_unencrypted = capability & WLAN_CAPABILITY_PRIVACY ? 1 : 0; sdata->drop_unencrypted = capability & WLAN_CAPABILITY_PRIVACY ? 1 : 0;
local->oper_channel = chan;
channel_type = ifibss->channel_type; channel_type = ifibss->channel_type;
if (channel_type > NL80211_CHAN_HT20 && if (channel_type > NL80211_CHAN_HT20 &&
!cfg80211_can_beacon_sec_chan(local->hw.wiphy, chan, channel_type)) !cfg80211_can_beacon_sec_chan(local->hw.wiphy, chan, channel_type))

View File

@ -1321,6 +1321,7 @@ u32 __ieee80211_recalc_idle(struct ieee80211_local *local)
continue; continue;
} }
/* count everything else */ /* count everything else */
sdata->vif.bss_conf.idle = false;
count++; count++;
} }

View File

@ -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 |

View File

@ -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 |

View File

@ -2759,7 +2759,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;
@ -2772,30 +2771,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