Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-2.6
Conflicts: net/mac80211/mlme.c
This commit is contained in:
commit
abf52f86aa
13 changed files with 96 additions and 18 deletions
10
MAINTAINERS
10
MAINTAINERS
|
@ -2966,20 +2966,14 @@ F: drivers/net/ixgb/
|
||||||
F: drivers/net/ixgbe/
|
F: drivers/net/ixgbe/
|
||||||
|
|
||||||
INTEL PRO/WIRELESS 2100 NETWORK CONNECTION SUPPORT
|
INTEL PRO/WIRELESS 2100 NETWORK CONNECTION SUPPORT
|
||||||
M: Reinette Chatre <reinette.chatre@intel.com>
|
|
||||||
M: Intel Linux Wireless <ilw@linux.intel.com>
|
|
||||||
L: linux-wireless@vger.kernel.org
|
L: linux-wireless@vger.kernel.org
|
||||||
W: http://ipw2100.sourceforge.net
|
S: Orphan
|
||||||
S: Odd Fixes
|
|
||||||
F: Documentation/networking/README.ipw2100
|
F: Documentation/networking/README.ipw2100
|
||||||
F: drivers/net/wireless/ipw2x00/ipw2100.*
|
F: drivers/net/wireless/ipw2x00/ipw2100.*
|
||||||
|
|
||||||
INTEL PRO/WIRELESS 2915ABG NETWORK CONNECTION SUPPORT
|
INTEL PRO/WIRELESS 2915ABG NETWORK CONNECTION SUPPORT
|
||||||
M: Reinette Chatre <reinette.chatre@intel.com>
|
|
||||||
M: Intel Linux Wireless <ilw@linux.intel.com>
|
|
||||||
L: linux-wireless@vger.kernel.org
|
L: linux-wireless@vger.kernel.org
|
||||||
W: http://ipw2200.sourceforge.net
|
S: Orphan
|
||||||
S: Odd Fixes
|
|
||||||
F: Documentation/networking/README.ipw2200
|
F: Documentation/networking/README.ipw2200
|
||||||
F: drivers/net/wireless/ipw2x00/ipw2200.*
|
F: drivers/net/wireless/ipw2x00/ipw2200.*
|
||||||
|
|
||||||
|
|
|
@ -594,6 +594,7 @@ static int prism2_config(struct pcmcia_device *link)
|
||||||
local_info_t *local;
|
local_info_t *local;
|
||||||
int ret = 1;
|
int ret = 1;
|
||||||
struct hostap_cs_priv *hw_priv;
|
struct hostap_cs_priv *hw_priv;
|
||||||
|
unsigned long flags;
|
||||||
|
|
||||||
PDEBUG(DEBUG_FLOW, "prism2_config()\n");
|
PDEBUG(DEBUG_FLOW, "prism2_config()\n");
|
||||||
|
|
||||||
|
@ -625,9 +626,15 @@ static int prism2_config(struct pcmcia_device *link)
|
||||||
local->hw_priv = hw_priv;
|
local->hw_priv = hw_priv;
|
||||||
hw_priv->link = link;
|
hw_priv->link = link;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Make sure the IRQ handler cannot proceed until at least
|
||||||
|
* dev->base_addr is initialized.
|
||||||
|
*/
|
||||||
|
spin_lock_irqsave(&local->irq_init_lock, flags);
|
||||||
|
|
||||||
ret = pcmcia_request_irq(link, prism2_interrupt);
|
ret = pcmcia_request_irq(link, prism2_interrupt);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto failed;
|
goto failed_unlock;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This actually configures the PCMCIA socket -- setting up
|
* This actually configures the PCMCIA socket -- setting up
|
||||||
|
@ -636,11 +643,13 @@ static int prism2_config(struct pcmcia_device *link)
|
||||||
*/
|
*/
|
||||||
ret = pcmcia_request_configuration(link, &link->conf);
|
ret = pcmcia_request_configuration(link, &link->conf);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto failed;
|
goto failed_unlock;
|
||||||
|
|
||||||
dev->irq = link->irq;
|
dev->irq = link->irq;
|
||||||
dev->base_addr = link->io.BasePort1;
|
dev->base_addr = link->io.BasePort1;
|
||||||
|
|
||||||
|
spin_unlock_irqrestore(&local->irq_init_lock, flags);
|
||||||
|
|
||||||
/* Finally, report what we've done */
|
/* Finally, report what we've done */
|
||||||
printk(KERN_INFO "%s: index 0x%02x: ",
|
printk(KERN_INFO "%s: index 0x%02x: ",
|
||||||
dev_info, link->conf.ConfigIndex);
|
dev_info, link->conf.ConfigIndex);
|
||||||
|
@ -667,6 +676,8 @@ static int prism2_config(struct pcmcia_device *link)
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
|
failed_unlock:
|
||||||
|
spin_unlock_irqrestore(&local->irq_init_lock, flags);
|
||||||
failed:
|
failed:
|
||||||
kfree(hw_priv);
|
kfree(hw_priv);
|
||||||
prism2_release((u_long)link);
|
prism2_release((u_long)link);
|
||||||
|
|
|
@ -2621,6 +2621,18 @@ static irqreturn_t prism2_interrupt(int irq, void *dev_id)
|
||||||
iface = netdev_priv(dev);
|
iface = netdev_priv(dev);
|
||||||
local = iface->local;
|
local = iface->local;
|
||||||
|
|
||||||
|
/* Detect early interrupt before driver is fully configued */
|
||||||
|
spin_lock(&local->irq_init_lock);
|
||||||
|
if (!dev->base_addr) {
|
||||||
|
if (net_ratelimit()) {
|
||||||
|
printk(KERN_DEBUG "%s: Interrupt, but dev not configured\n",
|
||||||
|
dev->name);
|
||||||
|
}
|
||||||
|
spin_unlock(&local->irq_init_lock);
|
||||||
|
return IRQ_HANDLED;
|
||||||
|
}
|
||||||
|
spin_unlock(&local->irq_init_lock);
|
||||||
|
|
||||||
prism2_io_debug_add(dev, PRISM2_IO_DEBUG_CMD_INTERRUPT, 0, 0);
|
prism2_io_debug_add(dev, PRISM2_IO_DEBUG_CMD_INTERRUPT, 0, 0);
|
||||||
|
|
||||||
if (local->func->card_present && !local->func->card_present(local)) {
|
if (local->func->card_present && !local->func->card_present(local)) {
|
||||||
|
@ -3138,6 +3150,7 @@ prism2_init_local_data(struct prism2_helper_functions *funcs, int card_idx,
|
||||||
spin_lock_init(&local->cmdlock);
|
spin_lock_init(&local->cmdlock);
|
||||||
spin_lock_init(&local->baplock);
|
spin_lock_init(&local->baplock);
|
||||||
spin_lock_init(&local->lock);
|
spin_lock_init(&local->lock);
|
||||||
|
spin_lock_init(&local->irq_init_lock);
|
||||||
mutex_init(&local->rid_bap_mtx);
|
mutex_init(&local->rid_bap_mtx);
|
||||||
|
|
||||||
if (card_idx < 0 || card_idx >= MAX_PARM_DEVICES)
|
if (card_idx < 0 || card_idx >= MAX_PARM_DEVICES)
|
||||||
|
|
|
@ -654,7 +654,7 @@ struct local_info {
|
||||||
rwlock_t iface_lock; /* hostap_interfaces read lock; use write lock
|
rwlock_t iface_lock; /* hostap_interfaces read lock; use write lock
|
||||||
* when removing entries from the list.
|
* when removing entries from the list.
|
||||||
* TX and RX paths can use read lock. */
|
* TX and RX paths can use read lock. */
|
||||||
spinlock_t cmdlock, baplock, lock;
|
spinlock_t cmdlock, baplock, lock, irq_init_lock;
|
||||||
struct mutex rid_bap_mtx;
|
struct mutex rid_bap_mtx;
|
||||||
u16 infofid; /* MAC buffer id for info frame */
|
u16 infofid; /* MAC buffer id for info frame */
|
||||||
/* txfid, intransmitfid, next_txtid, and next_alloc are protected by
|
/* txfid, intransmitfid, next_txtid, and next_alloc are protected by
|
||||||
|
|
|
@ -1147,6 +1147,7 @@ static void iwlagn_tx_status(struct iwl_priv *priv, struct sk_buff *skb)
|
||||||
struct ieee80211_sta *sta;
|
struct ieee80211_sta *sta;
|
||||||
struct iwl_station_priv *sta_priv;
|
struct iwl_station_priv *sta_priv;
|
||||||
|
|
||||||
|
rcu_read_lock();
|
||||||
sta = ieee80211_find_sta(priv->vif, hdr->addr1);
|
sta = ieee80211_find_sta(priv->vif, hdr->addr1);
|
||||||
if (sta) {
|
if (sta) {
|
||||||
sta_priv = (void *)sta->drv_priv;
|
sta_priv = (void *)sta->drv_priv;
|
||||||
|
@ -1155,6 +1156,7 @@ static void iwlagn_tx_status(struct iwl_priv *priv, struct sk_buff *skb)
|
||||||
atomic_dec_return(&sta_priv->pending_frames) == 0)
|
atomic_dec_return(&sta_priv->pending_frames) == 0)
|
||||||
ieee80211_sta_block_awake(priv->hw, sta, false);
|
ieee80211_sta_block_awake(priv->hw, sta, false);
|
||||||
}
|
}
|
||||||
|
rcu_read_unlock();
|
||||||
|
|
||||||
ieee80211_tx_status_irqsafe(priv->hw, skb);
|
ieee80211_tx_status_irqsafe(priv->hw, skb);
|
||||||
}
|
}
|
||||||
|
@ -1322,6 +1324,11 @@ void iwlagn_rx_reply_compressed_ba(struct iwl_priv *priv,
|
||||||
sta_id = ba_resp->sta_id;
|
sta_id = ba_resp->sta_id;
|
||||||
tid = ba_resp->tid;
|
tid = ba_resp->tid;
|
||||||
agg = &priv->stations[sta_id].tid[tid].agg;
|
agg = &priv->stations[sta_id].tid[tid].agg;
|
||||||
|
if (unlikely(agg->txq_id != scd_flow)) {
|
||||||
|
IWL_ERR(priv, "BA scd_flow %d does not match txq_id %d\n",
|
||||||
|
scd_flow, agg->txq_id);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
/* Find index just before block-ack window */
|
/* Find index just before block-ack window */
|
||||||
index = iwl_queue_dec_wrap(ba_resp_scd_ssn & 0xff, txq->q.n_bd);
|
index = iwl_queue_dec_wrap(ba_resp_scd_ssn & 0xff, txq->q.n_bd);
|
||||||
|
|
|
@ -3465,10 +3465,12 @@ static int iwlagn_mac_sta_add(struct ieee80211_hw *hw,
|
||||||
int ret;
|
int ret;
|
||||||
u8 sta_id;
|
u8 sta_id;
|
||||||
|
|
||||||
sta_priv->common.sta_id = IWL_INVALID_STATION;
|
|
||||||
|
|
||||||
IWL_DEBUG_INFO(priv, "received request to add station %pM\n",
|
IWL_DEBUG_INFO(priv, "received request to add station %pM\n",
|
||||||
sta->addr);
|
sta->addr);
|
||||||
|
mutex_lock(&priv->mutex);
|
||||||
|
IWL_DEBUG_INFO(priv, "proceeding to add station %pM\n",
|
||||||
|
sta->addr);
|
||||||
|
sta_priv->common.sta_id = IWL_INVALID_STATION;
|
||||||
|
|
||||||
atomic_set(&sta_priv->pending_frames, 0);
|
atomic_set(&sta_priv->pending_frames, 0);
|
||||||
if (vif->type == NL80211_IFTYPE_AP)
|
if (vif->type == NL80211_IFTYPE_AP)
|
||||||
|
@ -3480,6 +3482,7 @@ static int iwlagn_mac_sta_add(struct ieee80211_hw *hw,
|
||||||
IWL_ERR(priv, "Unable to add station %pM (%d)\n",
|
IWL_ERR(priv, "Unable to add station %pM (%d)\n",
|
||||||
sta->addr, ret);
|
sta->addr, ret);
|
||||||
/* Should we return success if return code is EEXIST ? */
|
/* Should we return success if return code is EEXIST ? */
|
||||||
|
mutex_unlock(&priv->mutex);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3489,6 +3492,7 @@ static int iwlagn_mac_sta_add(struct ieee80211_hw *hw,
|
||||||
IWL_DEBUG_INFO(priv, "Initializing rate scaling for station %pM\n",
|
IWL_DEBUG_INFO(priv, "Initializing rate scaling for station %pM\n",
|
||||||
sta->addr);
|
sta->addr);
|
||||||
iwl_rs_rate_init(priv, sta, sta_id);
|
iwl_rs_rate_init(priv, sta, sta_id);
|
||||||
|
mutex_unlock(&priv->mutex);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -500,6 +500,7 @@ void iwl_bg_abort_scan(struct work_struct *work)
|
||||||
|
|
||||||
mutex_lock(&priv->mutex);
|
mutex_lock(&priv->mutex);
|
||||||
|
|
||||||
|
cancel_delayed_work_sync(&priv->scan_check);
|
||||||
set_bit(STATUS_SCAN_ABORTING, &priv->status);
|
set_bit(STATUS_SCAN_ABORTING, &priv->status);
|
||||||
iwl_send_scan_abort(priv);
|
iwl_send_scan_abort(priv);
|
||||||
|
|
||||||
|
|
|
@ -1373,10 +1373,14 @@ int iwl_mac_sta_remove(struct ieee80211_hw *hw,
|
||||||
|
|
||||||
IWL_DEBUG_INFO(priv, "received request to remove station %pM\n",
|
IWL_DEBUG_INFO(priv, "received request to remove station %pM\n",
|
||||||
sta->addr);
|
sta->addr);
|
||||||
|
mutex_lock(&priv->mutex);
|
||||||
|
IWL_DEBUG_INFO(priv, "proceeding to remove station %pM\n",
|
||||||
|
sta->addr);
|
||||||
ret = iwl_remove_station(priv, sta_common->sta_id, sta->addr);
|
ret = iwl_remove_station(priv, sta_common->sta_id, sta->addr);
|
||||||
if (ret)
|
if (ret)
|
||||||
IWL_ERR(priv, "Error removing station %pM\n",
|
IWL_ERR(priv, "Error removing station %pM\n",
|
||||||
sta->addr);
|
sta->addr);
|
||||||
|
mutex_unlock(&priv->mutex);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(iwl_mac_sta_remove);
|
EXPORT_SYMBOL(iwl_mac_sta_remove);
|
||||||
|
|
|
@ -3363,10 +3363,13 @@ static int iwl3945_mac_sta_add(struct ieee80211_hw *hw,
|
||||||
bool is_ap = vif->type == NL80211_IFTYPE_STATION;
|
bool is_ap = vif->type == NL80211_IFTYPE_STATION;
|
||||||
u8 sta_id;
|
u8 sta_id;
|
||||||
|
|
||||||
sta_priv->common.sta_id = IWL_INVALID_STATION;
|
|
||||||
|
|
||||||
IWL_DEBUG_INFO(priv, "received request to add station %pM\n",
|
IWL_DEBUG_INFO(priv, "received request to add station %pM\n",
|
||||||
sta->addr);
|
sta->addr);
|
||||||
|
mutex_lock(&priv->mutex);
|
||||||
|
IWL_DEBUG_INFO(priv, "proceeding to add station %pM\n",
|
||||||
|
sta->addr);
|
||||||
|
sta_priv->common.sta_id = IWL_INVALID_STATION;
|
||||||
|
|
||||||
|
|
||||||
ret = iwl_add_station_common(priv, sta->addr, is_ap, &sta->ht_cap,
|
ret = iwl_add_station_common(priv, sta->addr, is_ap, &sta->ht_cap,
|
||||||
&sta_id);
|
&sta_id);
|
||||||
|
@ -3374,6 +3377,7 @@ static int iwl3945_mac_sta_add(struct ieee80211_hw *hw,
|
||||||
IWL_ERR(priv, "Unable to add station %pM (%d)\n",
|
IWL_ERR(priv, "Unable to add station %pM (%d)\n",
|
||||||
sta->addr, ret);
|
sta->addr, ret);
|
||||||
/* Should we return success if return code is EEXIST ? */
|
/* Should we return success if return code is EEXIST ? */
|
||||||
|
mutex_unlock(&priv->mutex);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3383,6 +3387,7 @@ static int iwl3945_mac_sta_add(struct ieee80211_hw *hw,
|
||||||
IWL_DEBUG_INFO(priv, "Initializing rate scaling for station %pM\n",
|
IWL_DEBUG_INFO(priv, "Initializing rate scaling for station %pM\n",
|
||||||
sta->addr);
|
sta->addr);
|
||||||
iwl3945_rs_rate_init(priv, sta, sta_id);
|
iwl3945_rs_rate_init(priv, sta, sta_id);
|
||||||
|
mutex_unlock(&priv->mutex);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -549,7 +549,7 @@ int lbtf_rx(struct lbtf_private *priv, struct sk_buff *skb)
|
||||||
|
|
||||||
prxpd = (struct rxpd *) skb->data;
|
prxpd = (struct rxpd *) skb->data;
|
||||||
|
|
||||||
stats.flag = 0;
|
memset(&stats, 0, sizeof(stats));
|
||||||
if (!(prxpd->status & cpu_to_le16(MRVDRV_RXPD_STATUS_OK)))
|
if (!(prxpd->status & cpu_to_le16(MRVDRV_RXPD_STATUS_OK)))
|
||||||
stats.flag |= RX_FLAG_FAILED_FCS_CRC;
|
stats.flag |= RX_FLAG_FAILED_FCS_CRC;
|
||||||
stats.freq = priv->cur_freq;
|
stats.freq = priv->cur_freq;
|
||||||
|
|
|
@ -41,6 +41,8 @@ static DEFINE_PCI_DEVICE_TABLE(p54p_table) = {
|
||||||
{ PCI_DEVICE(0x1260, 0x3877) },
|
{ PCI_DEVICE(0x1260, 0x3877) },
|
||||||
/* Intersil PRISM Javelin/Xbow Wireless LAN adapter */
|
/* Intersil PRISM Javelin/Xbow Wireless LAN adapter */
|
||||||
{ PCI_DEVICE(0x1260, 0x3886) },
|
{ PCI_DEVICE(0x1260, 0x3886) },
|
||||||
|
/* Intersil PRISM Xbow Wireless LAN adapter (Symbol AP-300) */
|
||||||
|
{ PCI_DEVICE(0x1260, 0xffff) },
|
||||||
{ },
|
{ },
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -1704,8 +1704,45 @@ void ieee80211_sta_rx_queued_mgmt(struct ieee80211_sub_if_data *sdata,
|
||||||
mutex_unlock(&ifmgd->mtx);
|
mutex_unlock(&ifmgd->mtx);
|
||||||
|
|
||||||
if (skb->len >= 24 + 2 /* mgmt + deauth reason */ &&
|
if (skb->len >= 24 + 2 /* mgmt + deauth reason */ &&
|
||||||
(fc & IEEE80211_FCTL_STYPE) == IEEE80211_STYPE_DEAUTH)
|
(fc & IEEE80211_FCTL_STYPE) == IEEE80211_STYPE_DEAUTH) {
|
||||||
|
struct ieee80211_local *local = sdata->local;
|
||||||
|
struct ieee80211_work *wk;
|
||||||
|
|
||||||
|
mutex_lock(&local->work_mtx);
|
||||||
|
list_for_each_entry(wk, &local->work_list, list) {
|
||||||
|
if (wk->sdata != sdata)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (wk->type != IEEE80211_WORK_ASSOC)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (memcmp(mgmt->bssid, wk->filter_ta, ETH_ALEN))
|
||||||
|
continue;
|
||||||
|
if (memcmp(mgmt->sa, wk->filter_ta, ETH_ALEN))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Printing the message only here means we can't
|
||||||
|
* spuriously print it, but it also means that it
|
||||||
|
* won't be printed when the frame comes in before
|
||||||
|
* we even tried to associate or in similar cases.
|
||||||
|
*
|
||||||
|
* Ultimately, I suspect cfg80211 should print the
|
||||||
|
* messages instead.
|
||||||
|
*/
|
||||||
|
printk(KERN_DEBUG
|
||||||
|
"%s: deauthenticated from %pM (Reason: %u)\n",
|
||||||
|
sdata->name, mgmt->bssid,
|
||||||
|
le16_to_cpu(mgmt->u.deauth.reason_code));
|
||||||
|
|
||||||
|
list_del_rcu(&wk->list);
|
||||||
|
free_work(wk);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
mutex_unlock(&local->work_mtx);
|
||||||
|
|
||||||
cfg80211_send_deauth(sdata->dev, (u8 *)mgmt, skb->len);
|
cfg80211_send_deauth(sdata->dev, (u8 *)mgmt, skb->len);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ieee80211_sta_timer(unsigned long data)
|
static void ieee80211_sta_timer(unsigned long data)
|
||||||
|
|
|
@ -715,7 +715,7 @@ static void ieee80211_work_rx_queued_mgmt(struct ieee80211_local *local,
|
||||||
struct ieee80211_rx_status *rx_status;
|
struct ieee80211_rx_status *rx_status;
|
||||||
struct ieee80211_mgmt *mgmt;
|
struct ieee80211_mgmt *mgmt;
|
||||||
struct ieee80211_work *wk;
|
struct ieee80211_work *wk;
|
||||||
enum work_action rma;
|
enum work_action rma = WORK_ACT_NONE;
|
||||||
u16 fc;
|
u16 fc;
|
||||||
|
|
||||||
rx_status = (struct ieee80211_rx_status *) skb->cb;
|
rx_status = (struct ieee80211_rx_status *) skb->cb;
|
||||||
|
|
Loading…
Add table
Reference in a new issue