Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-2.6
This commit is contained in:
commit
bcfe3c2046
13 changed files with 61 additions and 25 deletions
|
@ -679,7 +679,7 @@ static u8 ath_rc_get_highest_rix(struct ath_softc *sc,
|
||||||
return rate;
|
return rate;
|
||||||
|
|
||||||
if (rate_table->info[rate].valid_single_stream &&
|
if (rate_table->info[rate].valid_single_stream &&
|
||||||
!(ath_rc_priv->ht_cap & WLAN_RC_DS_FLAG));
|
!(ath_rc_priv->ht_cap & WLAN_RC_DS_FLAG))
|
||||||
return rate;
|
return rate;
|
||||||
|
|
||||||
/* This should not happen */
|
/* This should not happen */
|
||||||
|
|
|
@ -1157,8 +1157,9 @@ struct b43_dmaring *parse_cookie(struct b43_wldev *dev, u16 cookie, int *slot)
|
||||||
}
|
}
|
||||||
|
|
||||||
static int dma_tx_fragment(struct b43_dmaring *ring,
|
static int dma_tx_fragment(struct b43_dmaring *ring,
|
||||||
struct sk_buff *skb)
|
struct sk_buff **in_skb)
|
||||||
{
|
{
|
||||||
|
struct sk_buff *skb = *in_skb;
|
||||||
const struct b43_dma_ops *ops = ring->ops;
|
const struct b43_dma_ops *ops = ring->ops;
|
||||||
struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
|
struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
|
||||||
u8 *header;
|
u8 *header;
|
||||||
|
@ -1224,8 +1225,14 @@ static int dma_tx_fragment(struct b43_dmaring *ring,
|
||||||
}
|
}
|
||||||
|
|
||||||
memcpy(skb_put(bounce_skb, skb->len), skb->data, skb->len);
|
memcpy(skb_put(bounce_skb, skb->len), skb->data, skb->len);
|
||||||
|
memcpy(bounce_skb->cb, skb->cb, sizeof(skb->cb));
|
||||||
|
bounce_skb->dev = skb->dev;
|
||||||
|
skb_set_queue_mapping(bounce_skb, skb_get_queue_mapping(skb));
|
||||||
|
info = IEEE80211_SKB_CB(bounce_skb);
|
||||||
|
|
||||||
dev_kfree_skb_any(skb);
|
dev_kfree_skb_any(skb);
|
||||||
skb = bounce_skb;
|
skb = bounce_skb;
|
||||||
|
*in_skb = bounce_skb;
|
||||||
meta->skb = skb;
|
meta->skb = skb;
|
||||||
meta->dmaaddr = map_descbuffer(ring, skb->data, skb->len, 1);
|
meta->dmaaddr = map_descbuffer(ring, skb->data, skb->len, 1);
|
||||||
if (b43_dma_mapping_error(ring, meta->dmaaddr, skb->len, 1)) {
|
if (b43_dma_mapping_error(ring, meta->dmaaddr, skb->len, 1)) {
|
||||||
|
@ -1355,7 +1362,11 @@ int b43_dma_tx(struct b43_wldev *dev, struct sk_buff *skb)
|
||||||
* static, so we don't need to store it per frame. */
|
* static, so we don't need to store it per frame. */
|
||||||
ring->queue_prio = skb_get_queue_mapping(skb);
|
ring->queue_prio = skb_get_queue_mapping(skb);
|
||||||
|
|
||||||
err = dma_tx_fragment(ring, skb);
|
/* dma_tx_fragment might reallocate the skb, so invalidate pointers pointing
|
||||||
|
* into the skb data or cb now. */
|
||||||
|
hdr = NULL;
|
||||||
|
info = NULL;
|
||||||
|
err = dma_tx_fragment(ring, &skb);
|
||||||
if (unlikely(err == -ENOKEY)) {
|
if (unlikely(err == -ENOKEY)) {
|
||||||
/* Drop this packet, as we don't have the encryption key
|
/* Drop this packet, as we don't have the encryption key
|
||||||
* anymore and must not transmit it unencrypted. */
|
* anymore and must not transmit it unencrypted. */
|
||||||
|
|
|
@ -6325,8 +6325,10 @@ static int ipw2100_pci_init_one(struct pci_dev *pci_dev,
|
||||||
|
|
||||||
fail:
|
fail:
|
||||||
if (dev) {
|
if (dev) {
|
||||||
if (registered)
|
if (registered) {
|
||||||
|
unregister_ieee80211(priv->ieee);
|
||||||
unregister_netdev(dev);
|
unregister_netdev(dev);
|
||||||
|
}
|
||||||
|
|
||||||
ipw2100_hw_stop_adapter(priv);
|
ipw2100_hw_stop_adapter(priv);
|
||||||
|
|
||||||
|
@ -6383,6 +6385,7 @@ static void __devexit ipw2100_pci_remove_one(struct pci_dev *pci_dev)
|
||||||
/* Unregister the device first - this results in close()
|
/* Unregister the device first - this results in close()
|
||||||
* being called if the device is open. If we free storage
|
* being called if the device is open. If we free storage
|
||||||
* first, then close() will crash. */
|
* first, then close() will crash. */
|
||||||
|
unregister_ieee80211(priv->ieee);
|
||||||
unregister_netdev(dev);
|
unregister_netdev(dev);
|
||||||
|
|
||||||
/* ipw2100_down will ensure that there is no more pending work
|
/* ipw2100_down will ensure that there is no more pending work
|
||||||
|
|
|
@ -11821,6 +11821,7 @@ static int __devinit ipw_pci_probe(struct pci_dev *pdev,
|
||||||
if (err) {
|
if (err) {
|
||||||
IPW_ERROR("Failed to register promiscuous network "
|
IPW_ERROR("Failed to register promiscuous network "
|
||||||
"device (error %d).\n", err);
|
"device (error %d).\n", err);
|
||||||
|
unregister_ieee80211(priv->ieee);
|
||||||
unregister_netdev(priv->net_dev);
|
unregister_netdev(priv->net_dev);
|
||||||
goto out_remove_sysfs;
|
goto out_remove_sysfs;
|
||||||
}
|
}
|
||||||
|
@ -11871,6 +11872,7 @@ static void __devexit ipw_pci_remove(struct pci_dev *pdev)
|
||||||
|
|
||||||
mutex_unlock(&priv->mutex);
|
mutex_unlock(&priv->mutex);
|
||||||
|
|
||||||
|
unregister_ieee80211(priv->ieee);
|
||||||
unregister_netdev(priv->net_dev);
|
unregister_netdev(priv->net_dev);
|
||||||
|
|
||||||
if (priv->rxq) {
|
if (priv->rxq) {
|
||||||
|
|
|
@ -1020,6 +1020,7 @@ static inline int libipw_is_cck_rate(u8 rate)
|
||||||
/* ieee80211.c */
|
/* ieee80211.c */
|
||||||
extern void free_ieee80211(struct net_device *dev, int monitor);
|
extern void free_ieee80211(struct net_device *dev, int monitor);
|
||||||
extern struct net_device *alloc_ieee80211(int sizeof_priv, int monitor);
|
extern struct net_device *alloc_ieee80211(int sizeof_priv, int monitor);
|
||||||
|
extern void unregister_ieee80211(struct libipw_device *ieee);
|
||||||
extern int libipw_change_mtu(struct net_device *dev, int new_mtu);
|
extern int libipw_change_mtu(struct net_device *dev, int new_mtu);
|
||||||
|
|
||||||
extern void libipw_networks_age(struct libipw_device *ieee,
|
extern void libipw_networks_age(struct libipw_device *ieee,
|
||||||
|
|
|
@ -235,14 +235,17 @@ void free_ieee80211(struct net_device *dev, int monitor)
|
||||||
libipw_networks_free(ieee);
|
libipw_networks_free(ieee);
|
||||||
|
|
||||||
/* free cfg80211 resources */
|
/* free cfg80211 resources */
|
||||||
if (!monitor) {
|
if (!monitor)
|
||||||
|
wiphy_free(ieee->wdev.wiphy);
|
||||||
|
|
||||||
|
free_netdev(dev);
|
||||||
|
}
|
||||||
|
|
||||||
|
void unregister_ieee80211(struct libipw_device *ieee)
|
||||||
|
{
|
||||||
wiphy_unregister(ieee->wdev.wiphy);
|
wiphy_unregister(ieee->wdev.wiphy);
|
||||||
kfree(ieee->a_band.channels);
|
kfree(ieee->a_band.channels);
|
||||||
kfree(ieee->bg_band.channels);
|
kfree(ieee->bg_band.channels);
|
||||||
wiphy_free(ieee->wdev.wiphy);
|
|
||||||
}
|
|
||||||
|
|
||||||
free_netdev(dev);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_LIBIPW_DEBUG
|
#ifdef CONFIG_LIBIPW_DEBUG
|
||||||
|
@ -330,3 +333,4 @@ module_init(libipw_init);
|
||||||
|
|
||||||
EXPORT_SYMBOL(alloc_ieee80211);
|
EXPORT_SYMBOL(alloc_ieee80211);
|
||||||
EXPORT_SYMBOL(free_ieee80211);
|
EXPORT_SYMBOL(free_ieee80211);
|
||||||
|
EXPORT_SYMBOL(unregister_ieee80211);
|
||||||
|
|
|
@ -508,7 +508,7 @@ static int __if_usb_submit_rx_urb(struct if_usb_card *cardp,
|
||||||
/* Fill the receive configuration URB and initialise the Rx call back */
|
/* Fill the receive configuration URB and initialise the Rx call back */
|
||||||
usb_fill_bulk_urb(cardp->rx_urb, cardp->udev,
|
usb_fill_bulk_urb(cardp->rx_urb, cardp->udev,
|
||||||
usb_rcvbulkpipe(cardp->udev, cardp->ep_in),
|
usb_rcvbulkpipe(cardp->udev, cardp->ep_in),
|
||||||
(void *) (skb->tail + (size_t) IPFIELD_ALIGN_OFFSET),
|
skb->data + IPFIELD_ALIGN_OFFSET,
|
||||||
MRVDRV_ETH_RX_PACKET_BUFFER_SIZE, callbackfn,
|
MRVDRV_ETH_RX_PACKET_BUFFER_SIZE, callbackfn,
|
||||||
cardp);
|
cardp);
|
||||||
|
|
||||||
|
|
|
@ -2389,10 +2389,13 @@ static struct usb_device_id rt73usb_device_table[] = {
|
||||||
{ USB_DEVICE(0x13b1, 0x0023), USB_DEVICE_DATA(&rt73usb_ops) },
|
{ USB_DEVICE(0x13b1, 0x0023), USB_DEVICE_DATA(&rt73usb_ops) },
|
||||||
{ USB_DEVICE(0x13b1, 0x0028), USB_DEVICE_DATA(&rt73usb_ops) },
|
{ USB_DEVICE(0x13b1, 0x0028), USB_DEVICE_DATA(&rt73usb_ops) },
|
||||||
/* MSI */
|
/* MSI */
|
||||||
|
{ USB_DEVICE(0x0db0, 0x4600), USB_DEVICE_DATA(&rt73usb_ops) },
|
||||||
{ USB_DEVICE(0x0db0, 0x6877), USB_DEVICE_DATA(&rt73usb_ops) },
|
{ USB_DEVICE(0x0db0, 0x6877), USB_DEVICE_DATA(&rt73usb_ops) },
|
||||||
{ USB_DEVICE(0x0db0, 0x6874), USB_DEVICE_DATA(&rt73usb_ops) },
|
{ USB_DEVICE(0x0db0, 0x6874), USB_DEVICE_DATA(&rt73usb_ops) },
|
||||||
{ USB_DEVICE(0x0db0, 0xa861), USB_DEVICE_DATA(&rt73usb_ops) },
|
{ USB_DEVICE(0x0db0, 0xa861), USB_DEVICE_DATA(&rt73usb_ops) },
|
||||||
{ USB_DEVICE(0x0db0, 0xa874), USB_DEVICE_DATA(&rt73usb_ops) },
|
{ USB_DEVICE(0x0db0, 0xa874), USB_DEVICE_DATA(&rt73usb_ops) },
|
||||||
|
/* Ovislink */
|
||||||
|
{ USB_DEVICE(0x1b75, 0x7318), USB_DEVICE_DATA(&rt73usb_ops) },
|
||||||
/* Ralink */
|
/* Ralink */
|
||||||
{ USB_DEVICE(0x04bb, 0x093d), USB_DEVICE_DATA(&rt73usb_ops) },
|
{ USB_DEVICE(0x04bb, 0x093d), USB_DEVICE_DATA(&rt73usb_ops) },
|
||||||
{ USB_DEVICE(0x148f, 0x2573), USB_DEVICE_DATA(&rt73usb_ops) },
|
{ USB_DEVICE(0x148f, 0x2573), USB_DEVICE_DATA(&rt73usb_ops) },
|
||||||
|
@ -2420,6 +2423,8 @@ static struct usb_device_id rt73usb_device_table[] = {
|
||||||
/* Planex */
|
/* Planex */
|
||||||
{ USB_DEVICE(0x2019, 0xab01), USB_DEVICE_DATA(&rt73usb_ops) },
|
{ USB_DEVICE(0x2019, 0xab01), USB_DEVICE_DATA(&rt73usb_ops) },
|
||||||
{ USB_DEVICE(0x2019, 0xab50), USB_DEVICE_DATA(&rt73usb_ops) },
|
{ USB_DEVICE(0x2019, 0xab50), USB_DEVICE_DATA(&rt73usb_ops) },
|
||||||
|
/* WideTell */
|
||||||
|
{ USB_DEVICE(0x7167, 0x3840), USB_DEVICE_DATA(&rt73usb_ops) },
|
||||||
/* Zcom */
|
/* Zcom */
|
||||||
{ USB_DEVICE(0x0cde, 0x001c), USB_DEVICE_DATA(&rt73usb_ops) },
|
{ USB_DEVICE(0x0cde, 0x001c), USB_DEVICE_DATA(&rt73usb_ops) },
|
||||||
/* ZyXEL */
|
/* ZyXEL */
|
||||||
|
|
|
@ -666,26 +666,25 @@ void ieee80211_process_addba_resp(struct ieee80211_local *local,
|
||||||
|
|
||||||
state = &sta->ampdu_mlme.tid_state_tx[tid];
|
state = &sta->ampdu_mlme.tid_state_tx[tid];
|
||||||
|
|
||||||
|
del_timer_sync(&sta->ampdu_mlme.tid_tx[tid]->addba_resp_timer);
|
||||||
|
|
||||||
spin_lock_bh(&sta->lock);
|
spin_lock_bh(&sta->lock);
|
||||||
|
|
||||||
if (!(*state & HT_ADDBA_REQUESTED_MSK)) {
|
if (!(*state & HT_ADDBA_REQUESTED_MSK))
|
||||||
spin_unlock_bh(&sta->lock);
|
goto timer_still_needed;
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (mgmt->u.action.u.addba_resp.dialog_token !=
|
if (mgmt->u.action.u.addba_resp.dialog_token !=
|
||||||
sta->ampdu_mlme.tid_tx[tid]->dialog_token) {
|
sta->ampdu_mlme.tid_tx[tid]->dialog_token) {
|
||||||
spin_unlock_bh(&sta->lock);
|
|
||||||
#ifdef CONFIG_MAC80211_HT_DEBUG
|
#ifdef CONFIG_MAC80211_HT_DEBUG
|
||||||
printk(KERN_DEBUG "wrong addBA response token, tid %d\n", tid);
|
printk(KERN_DEBUG "wrong addBA response token, tid %d\n", tid);
|
||||||
#endif /* CONFIG_MAC80211_HT_DEBUG */
|
#endif /* CONFIG_MAC80211_HT_DEBUG */
|
||||||
return;
|
goto timer_still_needed;
|
||||||
}
|
}
|
||||||
|
|
||||||
del_timer_sync(&sta->ampdu_mlme.tid_tx[tid]->addba_resp_timer);
|
|
||||||
#ifdef CONFIG_MAC80211_HT_DEBUG
|
#ifdef CONFIG_MAC80211_HT_DEBUG
|
||||||
printk(KERN_DEBUG "switched off addBA timer for tid %d \n", tid);
|
printk(KERN_DEBUG "switched off addBA timer for tid %d \n", tid);
|
||||||
#endif /* CONFIG_MAC80211_HT_DEBUG */
|
#endif /* CONFIG_MAC80211_HT_DEBUG */
|
||||||
|
|
||||||
if (le16_to_cpu(mgmt->u.action.u.addba_resp.status)
|
if (le16_to_cpu(mgmt->u.action.u.addba_resp.status)
|
||||||
== WLAN_STATUS_SUCCESS) {
|
== WLAN_STATUS_SUCCESS) {
|
||||||
u8 curstate = *state;
|
u8 curstate = *state;
|
||||||
|
@ -699,5 +698,11 @@ void ieee80211_process_addba_resp(struct ieee80211_local *local,
|
||||||
} else {
|
} else {
|
||||||
___ieee80211_stop_tx_ba_session(sta, tid, WLAN_BACK_INITIATOR);
|
___ieee80211_stop_tx_ba_session(sta, tid, WLAN_BACK_INITIATOR);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
goto out;
|
||||||
|
|
||||||
|
timer_still_needed:
|
||||||
|
add_timer(&sta->ampdu_mlme.tid_tx[tid]->addba_resp_timer);
|
||||||
|
out:
|
||||||
spin_unlock_bh(&sta->lock);
|
spin_unlock_bh(&sta->lock);
|
||||||
}
|
}
|
||||||
|
|
|
@ -72,6 +72,9 @@ static int ieee80211_change_iface(struct wiphy *wiphy,
|
||||||
struct ieee80211_sub_if_data *sdata;
|
struct ieee80211_sub_if_data *sdata;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
if (netif_running(dev))
|
||||||
|
return -EBUSY;
|
||||||
|
|
||||||
if (!nl80211_type_check(type))
|
if (!nl80211_type_check(type))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
|
@ -81,9 +84,6 @@ static int ieee80211_change_iface(struct wiphy *wiphy,
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
if (netif_running(sdata->dev))
|
|
||||||
return -EBUSY;
|
|
||||||
|
|
||||||
if (ieee80211_vif_is_mesh(&sdata->vif) && params->mesh_id_len)
|
if (ieee80211_vif_is_mesh(&sdata->vif) && params->mesh_id_len)
|
||||||
ieee80211_sdata_set_mesh_id(sdata,
|
ieee80211_sdata_set_mesh_id(sdata,
|
||||||
params->mesh_id_len,
|
params->mesh_id_len,
|
||||||
|
|
|
@ -153,7 +153,7 @@ void ieee80211_process_delba(struct ieee80211_sub_if_data *sdata,
|
||||||
if (net_ratelimit())
|
if (net_ratelimit())
|
||||||
printk(KERN_DEBUG "delba from %pM (%s) tid %d reason code %d\n",
|
printk(KERN_DEBUG "delba from %pM (%s) tid %d reason code %d\n",
|
||||||
mgmt->sa, initiator ? "initiator" : "recipient", tid,
|
mgmt->sa, initiator ? "initiator" : "recipient", tid,
|
||||||
mgmt->u.action.u.delba.reason_code);
|
le16_to_cpu(mgmt->u.action.u.delba.reason_code));
|
||||||
#endif /* CONFIG_MAC80211_HT_DEBUG */
|
#endif /* CONFIG_MAC80211_HT_DEBUG */
|
||||||
|
|
||||||
if (initiator == WLAN_BACK_INITIATOR)
|
if (initiator == WLAN_BACK_INITIATOR)
|
||||||
|
|
|
@ -73,6 +73,7 @@ static void __ieee80211_sta_join_ibss(struct ieee80211_sub_if_data *sdata,
|
||||||
struct ieee80211_mgmt *mgmt;
|
struct ieee80211_mgmt *mgmt;
|
||||||
u8 *pos;
|
u8 *pos;
|
||||||
struct ieee80211_supported_band *sband;
|
struct ieee80211_supported_band *sband;
|
||||||
|
struct cfg80211_bss *bss;
|
||||||
u32 bss_change;
|
u32 bss_change;
|
||||||
u8 supp_rates[IEEE80211_MAX_SUPP_RATES];
|
u8 supp_rates[IEEE80211_MAX_SUPP_RATES];
|
||||||
|
|
||||||
|
@ -177,8 +178,9 @@ static void __ieee80211_sta_join_ibss(struct ieee80211_sub_if_data *sdata,
|
||||||
mod_timer(&ifibss->timer,
|
mod_timer(&ifibss->timer,
|
||||||
round_jiffies(jiffies + IEEE80211_IBSS_MERGE_INTERVAL));
|
round_jiffies(jiffies + IEEE80211_IBSS_MERGE_INTERVAL));
|
||||||
|
|
||||||
cfg80211_inform_bss_frame(local->hw.wiphy, local->hw.conf.channel,
|
bss = cfg80211_inform_bss_frame(local->hw.wiphy, local->hw.conf.channel,
|
||||||
mgmt, skb->len, 0, GFP_KERNEL);
|
mgmt, skb->len, 0, GFP_KERNEL);
|
||||||
|
cfg80211_put_bss(bss);
|
||||||
cfg80211_ibss_joined(sdata->dev, ifibss->bssid, GFP_KERNEL);
|
cfg80211_ibss_joined(sdata->dev, ifibss->bssid, GFP_KERNEL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -165,7 +165,7 @@ void cfg80211_conn_work(struct work_struct *work)
|
||||||
struct cfg80211_registered_device *rdev =
|
struct cfg80211_registered_device *rdev =
|
||||||
container_of(work, struct cfg80211_registered_device, conn_work);
|
container_of(work, struct cfg80211_registered_device, conn_work);
|
||||||
struct wireless_dev *wdev;
|
struct wireless_dev *wdev;
|
||||||
u8 bssid[ETH_ALEN];
|
u8 bssid_buf[ETH_ALEN], *bssid = NULL;
|
||||||
|
|
||||||
rtnl_lock();
|
rtnl_lock();
|
||||||
cfg80211_lock_rdev(rdev);
|
cfg80211_lock_rdev(rdev);
|
||||||
|
@ -181,7 +181,10 @@ void cfg80211_conn_work(struct work_struct *work)
|
||||||
wdev_unlock(wdev);
|
wdev_unlock(wdev);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
memcpy(bssid, wdev->conn->params.bssid, ETH_ALEN);
|
if (wdev->conn->params.bssid) {
|
||||||
|
memcpy(bssid_buf, wdev->conn->params.bssid, ETH_ALEN);
|
||||||
|
bssid = bssid_buf;
|
||||||
|
}
|
||||||
if (cfg80211_conn_do_work(wdev))
|
if (cfg80211_conn_do_work(wdev))
|
||||||
__cfg80211_connect_result(
|
__cfg80211_connect_result(
|
||||||
wdev->netdev, bssid,
|
wdev->netdev, bssid,
|
||||||
|
|
Loading…
Add table
Reference in a new issue