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

This commit is contained in:
David S. Miller 2010-06-16 13:41:55 -07:00
commit d8d326dc7a
12 changed files with 56 additions and 17 deletions

View file

@ -2978,20 +2978,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.*

View file

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

View file

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

View file

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

View file

@ -1299,6 +1299,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);

View file

@ -3391,10 +3391,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)
@ -3406,6 +3408,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;
} }
@ -3415,6 +3418,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;
} }

View file

@ -491,6 +491,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);

View file

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

View file

@ -3437,10 +3437,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);
@ -3448,6 +3451,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;
} }
@ -3457,6 +3461,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;
} }

View file

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

View file

@ -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) },
{ }, { },
}; };

View file

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