提交 fe252009 编写于 作者: J Jeff Garzik

Merge branch 'fixes-jgarzik' of...

Merge branch 'fixes-jgarzik' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-2.6 into upstream
...@@ -49,7 +49,6 @@ ...@@ -49,7 +49,6 @@
#include "pio.h" #include "pio.h"
#include "sysfs.h" #include "sysfs.h"
#include "xmit.h" #include "xmit.h"
#include "sysfs.h"
#include "lo.h" #include "lo.h"
#include "pcmcia.h" #include "pcmcia.h"
...@@ -3495,7 +3494,7 @@ static int b43_start(struct ieee80211_hw *hw) ...@@ -3495,7 +3494,7 @@ static int b43_start(struct ieee80211_hw *hw)
struct b43_wl *wl = hw_to_b43_wl(hw); struct b43_wl *wl = hw_to_b43_wl(hw);
struct b43_wldev *dev = wl->current_dev; struct b43_wldev *dev = wl->current_dev;
int did_init = 0; int did_init = 0;
int err; int err = 0;
mutex_lock(&wl->mutex); mutex_lock(&wl->mutex);
...@@ -3521,7 +3520,7 @@ static int b43_start(struct ieee80211_hw *hw) ...@@ -3521,7 +3520,7 @@ static int b43_start(struct ieee80211_hw *hw)
return err; return err;
} }
void b43_stop(struct ieee80211_hw *hw) static void b43_stop(struct ieee80211_hw *hw)
{ {
struct b43_wl *wl = hw_to_b43_wl(hw); struct b43_wl *wl = hw_to_b43_wl(hw);
struct b43_wldev *dev = wl->current_dev; struct b43_wldev *dev = wl->current_dev;
......
...@@ -3306,7 +3306,7 @@ static int b43legacy_start(struct ieee80211_hw *hw) ...@@ -3306,7 +3306,7 @@ static int b43legacy_start(struct ieee80211_hw *hw)
struct b43legacy_wl *wl = hw_to_b43legacy_wl(hw); struct b43legacy_wl *wl = hw_to_b43legacy_wl(hw);
struct b43legacy_wldev *dev = wl->current_dev; struct b43legacy_wldev *dev = wl->current_dev;
int did_init = 0; int did_init = 0;
int err; int err = 0;
mutex_lock(&wl->mutex); mutex_lock(&wl->mutex);
......
...@@ -2105,12 +2105,46 @@ static void isr_indicate_rf_kill(struct ipw2100_priv *priv, u32 status) ...@@ -2105,12 +2105,46 @@ static void isr_indicate_rf_kill(struct ipw2100_priv *priv, u32 status)
queue_delayed_work(priv->workqueue, &priv->rf_kill, round_jiffies(HZ)); queue_delayed_work(priv->workqueue, &priv->rf_kill, round_jiffies(HZ));
} }
static void send_scan_event(void *data)
{
struct ipw2100_priv *priv = data;
union iwreq_data wrqu;
wrqu.data.length = 0;
wrqu.data.flags = 0;
wireless_send_event(priv->net_dev, SIOCGIWSCAN, &wrqu, NULL);
}
static void ipw2100_scan_event_later(struct work_struct *work)
{
send_scan_event(container_of(work, struct ipw2100_priv,
scan_event_later.work));
}
static void ipw2100_scan_event_now(struct work_struct *work)
{
send_scan_event(container_of(work, struct ipw2100_priv,
scan_event_now));
}
static void isr_scan_complete(struct ipw2100_priv *priv, u32 status) static void isr_scan_complete(struct ipw2100_priv *priv, u32 status)
{ {
IPW_DEBUG_SCAN("scan complete\n"); IPW_DEBUG_SCAN("scan complete\n");
/* Age the scan results... */ /* Age the scan results... */
priv->ieee->scans++; priv->ieee->scans++;
priv->status &= ~STATUS_SCANNING; priv->status &= ~STATUS_SCANNING;
/* Only userspace-requested scan completion events go out immediately */
if (!priv->user_requested_scan) {
if (!delayed_work_pending(&priv->scan_event_later))
queue_delayed_work(priv->workqueue,
&priv->scan_event_later,
round_jiffies(msecs_to_jiffies(4000)));
} else {
priv->user_requested_scan = 0;
cancel_delayed_work(&priv->scan_event_later);
queue_work(priv->workqueue, &priv->scan_event_now);
}
} }
#ifdef CONFIG_IPW2100_DEBUG #ifdef CONFIG_IPW2100_DEBUG
...@@ -4378,6 +4412,7 @@ static void ipw2100_kill_workqueue(struct ipw2100_priv *priv) ...@@ -4378,6 +4412,7 @@ static void ipw2100_kill_workqueue(struct ipw2100_priv *priv)
cancel_delayed_work(&priv->wx_event_work); cancel_delayed_work(&priv->wx_event_work);
cancel_delayed_work(&priv->hang_check); cancel_delayed_work(&priv->hang_check);
cancel_delayed_work(&priv->rf_kill); cancel_delayed_work(&priv->rf_kill);
cancel_delayed_work(&priv->scan_event_later);
destroy_workqueue(priv->workqueue); destroy_workqueue(priv->workqueue);
priv->workqueue = NULL; priv->workqueue = NULL;
} }
...@@ -6121,6 +6156,8 @@ static struct net_device *ipw2100_alloc_device(struct pci_dev *pci_dev, ...@@ -6121,6 +6156,8 @@ static struct net_device *ipw2100_alloc_device(struct pci_dev *pci_dev,
INIT_DELAYED_WORK(&priv->wx_event_work, ipw2100_wx_event_work); INIT_DELAYED_WORK(&priv->wx_event_work, ipw2100_wx_event_work);
INIT_DELAYED_WORK(&priv->hang_check, ipw2100_hang_check); INIT_DELAYED_WORK(&priv->hang_check, ipw2100_hang_check);
INIT_DELAYED_WORK(&priv->rf_kill, ipw2100_rf_kill); INIT_DELAYED_WORK(&priv->rf_kill, ipw2100_rf_kill);
INIT_WORK(&priv->scan_event_now, ipw2100_scan_event_now);
INIT_DELAYED_WORK(&priv->scan_event_later, ipw2100_scan_event_later);
tasklet_init(&priv->irq_tasklet, (void (*)(unsigned long)) tasklet_init(&priv->irq_tasklet, (void (*)(unsigned long))
ipw2100_irq_tasklet, (unsigned long)priv); ipw2100_irq_tasklet, (unsigned long)priv);
...@@ -7425,6 +7462,8 @@ static int ipw2100_wx_set_scan(struct net_device *dev, ...@@ -7425,6 +7462,8 @@ static int ipw2100_wx_set_scan(struct net_device *dev,
} }
IPW_DEBUG_WX("Initiating scan...\n"); IPW_DEBUG_WX("Initiating scan...\n");
priv->user_requested_scan = 1;
if (ipw2100_set_scan_options(priv) || ipw2100_start_scan(priv)) { if (ipw2100_set_scan_options(priv) || ipw2100_start_scan(priv)) {
IPW_DEBUG_WX("Start scan failed.\n"); IPW_DEBUG_WX("Start scan failed.\n");
......
...@@ -588,6 +588,10 @@ struct ipw2100_priv { ...@@ -588,6 +588,10 @@ struct ipw2100_priv {
struct delayed_work wx_event_work; struct delayed_work wx_event_work;
struct delayed_work hang_check; struct delayed_work hang_check;
struct delayed_work rf_kill; struct delayed_work rf_kill;
struct work_struct scan_event_now;
struct delayed_work scan_event_later;
int user_requested_scan;
u32 interrupts; u32 interrupts;
int tx_interrupts; int tx_interrupts;
......
...@@ -37,9 +37,6 @@ ...@@ -37,9 +37,6 @@
#include <linux/workqueue.h> #include <linux/workqueue.h>
#include <net/mac80211.h>
#include <linux/wireless.h>
#define IWL 3945 #define IWL 3945
#include "../net/mac80211/ieee80211_rate.h" #include "../net/mac80211/ieee80211_rate.h"
......
...@@ -38,7 +38,6 @@ ...@@ -38,7 +38,6 @@
#include <net/mac80211.h> #include <net/mac80211.h>
#include <linux/etherdevice.h> #include <linux/etherdevice.h>
#include <linux/delay.h>
#define IWL 3945 #define IWL 3945
......
...@@ -36,9 +36,6 @@ ...@@ -36,9 +36,6 @@
#include <linux/workqueue.h> #include <linux/workqueue.h>
#include <net/mac80211.h>
#include <linux/wireless.h>
#define IWL 4965 #define IWL 4965
#include "../net/mac80211/ieee80211_rate.h" #include "../net/mac80211/ieee80211_rate.h"
...@@ -2024,12 +2021,18 @@ static int open_file_generic(struct inode *inode, struct file *file) ...@@ -2024,12 +2021,18 @@ static int open_file_generic(struct inode *inode, struct file *file)
static void rs_dbgfs_set_mcs(struct iwl_rate_scale_priv *rs_priv, static void rs_dbgfs_set_mcs(struct iwl_rate_scale_priv *rs_priv,
struct iwl_rate *mcs, int index) struct iwl_rate *mcs, int index)
{ {
const u32 cck_rate = 0x820A; u32 base_rate;
if (rs_priv->phymode == (u8) MODE_IEEE80211A)
base_rate = 0x800D;
else
base_rate = 0x820A;
if (rs_priv->dbg_fixed.rate_n_flags) { if (rs_priv->dbg_fixed.rate_n_flags) {
if (index < 12) if (index < 12)
mcs->rate_n_flags = rs_priv->dbg_fixed.rate_n_flags; mcs->rate_n_flags = rs_priv->dbg_fixed.rate_n_flags;
else else
mcs->rate_n_flags = cck_rate; mcs->rate_n_flags = base_rate;
IWL_DEBUG_RATE("Fixed rate ON\n"); IWL_DEBUG_RATE("Fixed rate ON\n");
return; return;
} }
......
...@@ -35,9 +35,7 @@ ...@@ -35,9 +35,7 @@
#include <linux/netdevice.h> #include <linux/netdevice.h>
#include <linux/wireless.h> #include <linux/wireless.h>
#include <net/mac80211.h> #include <net/mac80211.h>
#include <linux/netdevice.h>
#include <linux/etherdevice.h> #include <linux/etherdevice.h>
#include <linux/delay.h>
#define IWL 4965 #define IWL 4965
......
...@@ -48,8 +48,6 @@ ...@@ -48,8 +48,6 @@
#include <linux/netdevice.h> #include <linux/netdevice.h>
#include <linux/wireless.h> #include <linux/wireless.h>
#include <linux/firmware.h> #include <linux/firmware.h>
#include <linux/skbuff.h>
#include <linux/netdevice.h>
#include <linux/etherdevice.h> #include <linux/etherdevice.h>
#include <linux/if_arp.h> #include <linux/if_arp.h>
...@@ -1749,21 +1747,22 @@ static void iwl_unset_hw_setting(struct iwl_priv *priv) ...@@ -1749,21 +1747,22 @@ static void iwl_unset_hw_setting(struct iwl_priv *priv)
* return : set the bit for each supported rate insert in ie * return : set the bit for each supported rate insert in ie
*/ */
static u16 iwl_supported_rate_to_ie(u8 *ie, u16 supported_rate, static u16 iwl_supported_rate_to_ie(u8 *ie, u16 supported_rate,
u16 basic_rate, int max_count) u16 basic_rate, int *left)
{ {
u16 ret_rates = 0, bit; u16 ret_rates = 0, bit;
int i; int i;
u8 *rates; u8 *cnt = ie;
u8 *rates = ie + 1;
rates = &(ie[1]);
for (bit = 1, i = 0; i < IWL_RATE_COUNT; i++, bit <<= 1) { for (bit = 1, i = 0; i < IWL_RATE_COUNT; i++, bit <<= 1) {
if (bit & supported_rate) { if (bit & supported_rate) {
ret_rates |= bit; ret_rates |= bit;
rates[*ie] = iwl_rates[i].ieee | rates[*cnt] = iwl_rates[i].ieee |
((bit & basic_rate) ? 0x80 : 0x00); ((bit & basic_rate) ? 0x80 : 0x00);
*ie = *ie + 1; (*cnt)++;
if (*ie >= max_count) (*left)--;
if ((*left <= 0) ||
(*cnt >= IWL_SUPPORTED_RATES_IE_LEN))
break; break;
} }
} }
...@@ -1780,7 +1779,7 @@ static u16 iwl_fill_probe_req(struct iwl_priv *priv, ...@@ -1780,7 +1779,7 @@ static u16 iwl_fill_probe_req(struct iwl_priv *priv,
{ {
int len = 0; int len = 0;
u8 *pos = NULL; u8 *pos = NULL;
u16 ret_rates; u16 active_rates, ret_rates, cck_rates;
/* Make sure there is enough space for the probe request, /* Make sure there is enough space for the probe request,
* two mandatory IEs and the data */ * two mandatory IEs and the data */
...@@ -1825,19 +1824,27 @@ static u16 iwl_fill_probe_req(struct iwl_priv *priv, ...@@ -1825,19 +1824,27 @@ static u16 iwl_fill_probe_req(struct iwl_priv *priv,
left -= 2; left -= 2;
if (left < 0) if (left < 0)
return 0; return 0;
/* ... fill it in... */ /* ... fill it in... */
*pos++ = WLAN_EID_SUPP_RATES; *pos++ = WLAN_EID_SUPP_RATES;
*pos = 0; *pos = 0;
ret_rates = priv->active_rate = priv->rates_mask;
priv->active_rate = priv->rates_mask;
active_rates = priv->active_rate;
priv->active_rate_basic = priv->rates_mask & IWL_BASIC_RATES_MASK; priv->active_rate_basic = priv->rates_mask & IWL_BASIC_RATES_MASK;
iwl_supported_rate_to_ie(pos, priv->active_rate, cck_rates = IWL_CCK_RATES_MASK & active_rates;
priv->active_rate_basic, left); ret_rates = iwl_supported_rate_to_ie(pos, cck_rates,
priv->active_rate_basic, &left);
active_rates &= ~ret_rates;
ret_rates = iwl_supported_rate_to_ie(pos, active_rates,
priv->active_rate_basic, &left);
active_rates &= ~ret_rates;
len += 2 + *pos; len += 2 + *pos;
pos += (*pos) + 1; pos += (*pos) + 1;
ret_rates = ~ret_rates & priv->active_rate; if (active_rates == 0)
if (ret_rates == 0)
goto fill_end; goto fill_end;
/* fill in supported extended rate */ /* fill in supported extended rate */
...@@ -1848,7 +1855,8 @@ static u16 iwl_fill_probe_req(struct iwl_priv *priv, ...@@ -1848,7 +1855,8 @@ static u16 iwl_fill_probe_req(struct iwl_priv *priv,
/* ... fill it in... */ /* ... fill it in... */
*pos++ = WLAN_EID_EXT_SUPP_RATES; *pos++ = WLAN_EID_EXT_SUPP_RATES;
*pos = 0; *pos = 0;
iwl_supported_rate_to_ie(pos, ret_rates, priv->active_rate_basic, left); iwl_supported_rate_to_ie(pos, active_rates,
priv->active_rate_basic, &left);
if (*pos > 0) if (*pos > 0)
len += 2 + *pos; len += 2 + *pos;
......
...@@ -48,8 +48,6 @@ ...@@ -48,8 +48,6 @@
#include <linux/netdevice.h> #include <linux/netdevice.h>
#include <linux/wireless.h> #include <linux/wireless.h>
#include <linux/firmware.h> #include <linux/firmware.h>
#include <linux/skbuff.h>
#include <linux/netdevice.h>
#include <linux/etherdevice.h> #include <linux/etherdevice.h>
#include <linux/if_arp.h> #include <linux/if_arp.h>
...@@ -1802,21 +1800,22 @@ static void iwl_unset_hw_setting(struct iwl_priv *priv) ...@@ -1802,21 +1800,22 @@ static void iwl_unset_hw_setting(struct iwl_priv *priv)
* return : set the bit for each supported rate insert in ie * return : set the bit for each supported rate insert in ie
*/ */
static u16 iwl_supported_rate_to_ie(u8 *ie, u16 supported_rate, static u16 iwl_supported_rate_to_ie(u8 *ie, u16 supported_rate,
u16 basic_rate, int max_count) u16 basic_rate, int *left)
{ {
u16 ret_rates = 0, bit; u16 ret_rates = 0, bit;
int i; int i;
u8 *rates; u8 *cnt = ie;
u8 *rates = ie + 1;
rates = &(ie[1]);
for (bit = 1, i = 0; i < IWL_RATE_COUNT; i++, bit <<= 1) { for (bit = 1, i = 0; i < IWL_RATE_COUNT; i++, bit <<= 1) {
if (bit & supported_rate) { if (bit & supported_rate) {
ret_rates |= bit; ret_rates |= bit;
rates[*ie] = iwl_rates[i].ieee | rates[*cnt] = iwl_rates[i].ieee |
((bit & basic_rate) ? 0x80 : 0x00); ((bit & basic_rate) ? 0x80 : 0x00);
*ie = *ie + 1; (*cnt)++;
if (*ie >= max_count) (*left)--;
if ((*left <= 0) ||
(*cnt >= IWL_SUPPORTED_RATES_IE_LEN))
break; break;
} }
} }
...@@ -1839,7 +1838,7 @@ static u16 iwl_fill_probe_req(struct iwl_priv *priv, ...@@ -1839,7 +1838,7 @@ static u16 iwl_fill_probe_req(struct iwl_priv *priv,
{ {
int len = 0; int len = 0;
u8 *pos = NULL; u8 *pos = NULL;
u16 ret_rates; u16 active_rates, ret_rates, cck_rates;
/* Make sure there is enough space for the probe request, /* Make sure there is enough space for the probe request,
* two mandatory IEs and the data */ * two mandatory IEs and the data */
...@@ -1884,19 +1883,27 @@ static u16 iwl_fill_probe_req(struct iwl_priv *priv, ...@@ -1884,19 +1883,27 @@ static u16 iwl_fill_probe_req(struct iwl_priv *priv,
left -= 2; left -= 2;
if (left < 0) if (left < 0)
return 0; return 0;
/* ... fill it in... */ /* ... fill it in... */
*pos++ = WLAN_EID_SUPP_RATES; *pos++ = WLAN_EID_SUPP_RATES;
*pos = 0; *pos = 0;
ret_rates = priv->active_rate = priv->rates_mask;
priv->active_rate = priv->rates_mask;
active_rates = priv->active_rate;
priv->active_rate_basic = priv->rates_mask & IWL_BASIC_RATES_MASK; priv->active_rate_basic = priv->rates_mask & IWL_BASIC_RATES_MASK;
iwl_supported_rate_to_ie(pos, priv->active_rate, cck_rates = IWL_CCK_RATES_MASK & active_rates;
priv->active_rate_basic, left); ret_rates = iwl_supported_rate_to_ie(pos, cck_rates,
priv->active_rate_basic, &left);
active_rates &= ~ret_rates;
ret_rates = iwl_supported_rate_to_ie(pos, active_rates,
priv->active_rate_basic, &left);
active_rates &= ~ret_rates;
len += 2 + *pos; len += 2 + *pos;
pos += (*pos) + 1; pos += (*pos) + 1;
ret_rates = ~ret_rates & priv->active_rate; if (active_rates == 0)
if (ret_rates == 0)
goto fill_end; goto fill_end;
/* fill in supported extended rate */ /* fill in supported extended rate */
...@@ -1907,7 +1914,8 @@ static u16 iwl_fill_probe_req(struct iwl_priv *priv, ...@@ -1907,7 +1914,8 @@ static u16 iwl_fill_probe_req(struct iwl_priv *priv,
/* ... fill it in... */ /* ... fill it in... */
*pos++ = WLAN_EID_EXT_SUPP_RATES; *pos++ = WLAN_EID_EXT_SUPP_RATES;
*pos = 0; *pos = 0;
iwl_supported_rate_to_ie(pos, ret_rates, priv->active_rate_basic, left); iwl_supported_rate_to_ie(pos, active_rates,
priv->active_rate_basic, &left);
if (*pos > 0) if (*pos > 0)
len += 2 + *pos; len += 2 + *pos;
...@@ -4494,13 +4502,13 @@ static u8 ratio2dB[100] = { ...@@ -4494,13 +4502,13 @@ static u8 ratio2dB[100] = {
* Conversion assumes that levels are voltages (20*log), not powers (10*log). */ * Conversion assumes that levels are voltages (20*log), not powers (10*log). */
int iwl_calc_db_from_ratio(int sig_ratio) int iwl_calc_db_from_ratio(int sig_ratio)
{ {
/* Anything above 1000:1 just report as 60 dB */ /* 1000:1 or higher just report as 60 dB */
if (sig_ratio > 1000) if (sig_ratio >= 1000)
return 60; return 60;
/* Above 100:1, divide by 10 and use table, /* 100:1 or higher, divide by 10 and use table,
* add 20 dB to make up for divide by 10 */ * add 20 dB to make up for divide by 10 */
if (sig_ratio > 100) if (sig_ratio >= 100)
return (20 + (int)ratio2dB[sig_ratio/10]); return (20 + (int)ratio2dB[sig_ratio/10]);
/* We shouldn't see this */ /* We shouldn't see this */
......
...@@ -39,18 +39,13 @@ struct iwl_priv; ...@@ -39,18 +39,13 @@ struct iwl_priv;
/* Hardware specific file defines the PCI IDs table for that hardware module */ /* Hardware specific file defines the PCI IDs table for that hardware module */
extern struct pci_device_id iwl_hw_card_ids[]; extern struct pci_device_id iwl_hw_card_ids[];
#include "iwl-hw.h"
#if IWL == 3945 #if IWL == 3945
#define DRV_NAME "iwl3945" #define DRV_NAME "iwl3945"
#include "iwl-hw.h"
#include "iwl-3945-hw.h" #include "iwl-3945-hw.h"
#elif IWL == 4965 #elif IWL == 4965
#define DRV_NAME "iwl4965" #define DRV_NAME "iwl4965"
#include "iwl-hw.h"
#include "iwl-4965-hw.h" #include "iwl-4965-hw.h"
#endif #endif
#include "iwl-prph.h" #include "iwl-prph.h"
......
...@@ -577,7 +577,7 @@ static int p54_set_filter(struct ieee80211_hw *dev, u16 filter_type, ...@@ -577,7 +577,7 @@ static int p54_set_filter(struct ieee80211_hw *dev, u16 filter_type,
struct p54_tx_control_filter *filter; struct p54_tx_control_filter *filter;
hdr = kzalloc(sizeof(*hdr) + sizeof(*filter) + hdr = kzalloc(sizeof(*hdr) + sizeof(*filter) +
priv->tx_hdr_len, GFP_KERNEL); priv->tx_hdr_len, GFP_ATOMIC);
if (!hdr) if (!hdr)
return -ENOMEM; return -ENOMEM;
......
...@@ -550,7 +550,7 @@ void rt2x00lib_write_tx_desc(struct rt2x00_dev *rt2x00dev, ...@@ -550,7 +550,7 @@ void rt2x00lib_write_tx_desc(struct rt2x00_dev *rt2x00dev,
/* /*
* Check if we need to set the Length Extension * Check if we need to set the Length Extension
*/ */
if (bitrate == 110 && residual <= 3) if (bitrate == 110 && residual <= 30)
desc.service |= 0x80; desc.service |= 0x80;
} }
......
...@@ -2029,6 +2029,7 @@ static struct usb_device_id rt73usb_device_table[] = { ...@@ -2029,6 +2029,7 @@ static struct usb_device_id rt73usb_device_table[] = {
{ USB_DEVICE(0x050d, 0x7050), USB_DEVICE_DATA(&rt73usb_ops) }, { USB_DEVICE(0x050d, 0x7050), USB_DEVICE_DATA(&rt73usb_ops) },
{ USB_DEVICE(0x050d, 0x705a), USB_DEVICE_DATA(&rt73usb_ops) }, { USB_DEVICE(0x050d, 0x705a), USB_DEVICE_DATA(&rt73usb_ops) },
{ USB_DEVICE(0x050d, 0x905b), USB_DEVICE_DATA(&rt73usb_ops) }, { USB_DEVICE(0x050d, 0x905b), USB_DEVICE_DATA(&rt73usb_ops) },
{ USB_DEVICE(0x050d, 0x905c), USB_DEVICE_DATA(&rt73usb_ops) },
/* Billionton */ /* Billionton */
{ USB_DEVICE(0x1631, 0xc019), USB_DEVICE_DATA(&rt73usb_ops) }, { USB_DEVICE(0x1631, 0xc019), USB_DEVICE_DATA(&rt73usb_ops) },
/* Buffalo */ /* Buffalo */
......
...@@ -131,7 +131,8 @@ static int rtl8187_tx(struct ieee80211_hw *dev, struct sk_buff *skb, ...@@ -131,7 +131,8 @@ static int rtl8187_tx(struct ieee80211_hw *dev, struct sk_buff *skb,
struct rtl8187_tx_hdr *hdr; struct rtl8187_tx_hdr *hdr;
struct rtl8187_tx_info *info; struct rtl8187_tx_info *info;
struct urb *urb; struct urb *urb;
u32 tmp; __le16 rts_dur = 0;
u32 flags;
urb = usb_alloc_urb(0, GFP_ATOMIC); urb = usb_alloc_urb(0, GFP_ATOMIC);
if (!urb) { if (!urb) {
...@@ -139,24 +140,24 @@ static int rtl8187_tx(struct ieee80211_hw *dev, struct sk_buff *skb, ...@@ -139,24 +140,24 @@ static int rtl8187_tx(struct ieee80211_hw *dev, struct sk_buff *skb,
return 0; return 0;
} }
hdr = (struct rtl8187_tx_hdr *)skb_push(skb, sizeof(*hdr)); flags = skb->len;
tmp = skb->len - sizeof(*hdr); flags |= RTL8187_TX_FLAG_NO_ENCRYPT;
tmp |= RTL8187_TX_FLAG_NO_ENCRYPT; flags |= control->rts_cts_rate << 19;
tmp |= control->rts_cts_rate << 19; flags |= control->tx_rate << 24;
tmp |= control->tx_rate << 24; if (ieee80211_get_morefrag((struct ieee80211_hdr *)skb->data))
if (ieee80211_get_morefrag((struct ieee80211_hdr *)skb)) flags |= RTL8187_TX_FLAG_MORE_FRAG;
tmp |= RTL8187_TX_FLAG_MORE_FRAG;
if (control->flags & IEEE80211_TXCTL_USE_RTS_CTS) { if (control->flags & IEEE80211_TXCTL_USE_RTS_CTS) {
tmp |= RTL8187_TX_FLAG_RTS; flags |= RTL8187_TX_FLAG_RTS;
hdr->rts_duration = rts_dur = ieee80211_rts_duration(dev, priv->if_id, skb->len, control);
ieee80211_rts_duration(dev, priv->if_id, skb->len, control);
} }
if (control->flags & IEEE80211_TXCTL_USE_CTS_PROTECT) if (control->flags & IEEE80211_TXCTL_USE_CTS_PROTECT)
tmp |= RTL8187_TX_FLAG_CTS; flags |= RTL8187_TX_FLAG_CTS;
hdr->flags = cpu_to_le32(tmp);
hdr = (struct rtl8187_tx_hdr *)skb_push(skb, sizeof(*hdr));
hdr->flags = cpu_to_le32(flags);
hdr->len = 0; hdr->len = 0;
tmp = control->retry_limit << 8; hdr->rts_duration = rts_dur;
hdr->retry = cpu_to_le32(tmp); hdr->retry = cpu_to_le32(control->retry_limit << 8);
info = (struct rtl8187_tx_info *)skb->cb; info = (struct rtl8187_tx_info *)skb->cb;
info->control = kmemdup(control, sizeof(*control), GFP_ATOMIC); info->control = kmemdup(control, sizeof(*control), GFP_ATOMIC);
...@@ -587,8 +588,6 @@ static void rtl8187_configure_filter(struct ieee80211_hw *dev, ...@@ -587,8 +588,6 @@ static void rtl8187_configure_filter(struct ieee80211_hw *dev,
*total_flags = 0; *total_flags = 0;
if (changed_flags & FIF_PROMISC_IN_BSS)
priv->rx_conf ^= RTL818X_RX_CONF_NICMAC;
if (changed_flags & FIF_ALLMULTI) if (changed_flags & FIF_ALLMULTI)
priv->rx_conf ^= RTL818X_RX_CONF_MULTICAST; priv->rx_conf ^= RTL818X_RX_CONF_MULTICAST;
if (changed_flags & FIF_FCSFAIL) if (changed_flags & FIF_FCSFAIL)
...@@ -601,8 +600,6 @@ static void rtl8187_configure_filter(struct ieee80211_hw *dev, ...@@ -601,8 +600,6 @@ static void rtl8187_configure_filter(struct ieee80211_hw *dev,
if (mc_count > 0) if (mc_count > 0)
priv->rx_conf |= RTL818X_RX_CONF_MULTICAST; priv->rx_conf |= RTL818X_RX_CONF_MULTICAST;
if (priv->rx_conf & RTL818X_RX_CONF_NICMAC)
*total_flags |= FIF_PROMISC_IN_BSS;
if (priv->rx_conf & RTL818X_RX_CONF_MULTICAST) if (priv->rx_conf & RTL818X_RX_CONF_MULTICAST)
*total_flags |= FIF_ALLMULTI; *total_flags |= FIF_ALLMULTI;
if (priv->rx_conf & RTL818X_RX_CONF_FCS) if (priv->rx_conf & RTL818X_RX_CONF_FCS)
......
...@@ -327,8 +327,8 @@ static void zd1201_usbrx(struct urb *urb) ...@@ -327,8 +327,8 @@ static void zd1201_usbrx(struct urb *urb)
memcpy(skb_put(skb, 6), &data[datalen-8], 6); memcpy(skb_put(skb, 6), &data[datalen-8], 6);
memcpy(skb_put(skb, 2), &data[datalen-24], 2); memcpy(skb_put(skb, 2), &data[datalen-24], 2);
memcpy(skb_put(skb, len), data, len); memcpy(skb_put(skb, len), data, len);
skb->dev->last_rx = jiffies;
skb->protocol = eth_type_trans(skb, zd->dev); skb->protocol = eth_type_trans(skb, zd->dev);
skb->dev->last_rx = jiffies;
zd->stats.rx_packets++; zd->stats.rx_packets++;
zd->stats.rx_bytes += skb->len; zd->stats.rx_bytes += skb->len;
netif_rx(skb); netif_rx(skb);
...@@ -384,8 +384,8 @@ static void zd1201_usbrx(struct urb *urb) ...@@ -384,8 +384,8 @@ static void zd1201_usbrx(struct urb *urb)
memcpy(skb_put(skb, 2), &data[6], 2); memcpy(skb_put(skb, 2), &data[6], 2);
memcpy(skb_put(skb, len), data+8, len); memcpy(skb_put(skb, len), data+8, len);
} }
skb->dev->last_rx = jiffies;
skb->protocol = eth_type_trans(skb, zd->dev); skb->protocol = eth_type_trans(skb, zd->dev);
skb->dev->last_rx = jiffies;
zd->stats.rx_packets++; zd->stats.rx_packets++;
zd->stats.rx_bytes += skb->len; zd->stats.rx_bytes += skb->len;
netif_rx(skb); netif_rx(skb);
......
...@@ -1044,14 +1044,17 @@ static int probe(struct usb_interface *intf, const struct usb_device_id *id) ...@@ -1044,14 +1044,17 @@ static int probe(struct usb_interface *intf, const struct usb_device_id *id)
static void disconnect(struct usb_interface *intf) static void disconnect(struct usb_interface *intf)
{ {
struct net_device *netdev = zd_intf_to_netdev(intf); struct net_device *netdev = zd_intf_to_netdev(intf);
struct zd_mac *mac = zd_netdev_mac(netdev); struct zd_mac *mac;
struct zd_usb *usb = &mac->chip.usb; struct zd_usb *usb;
/* Either something really bad happened, or we're just dealing with /* Either something really bad happened, or we're just dealing with
* a DEVICE_INSTALLER. */ * a DEVICE_INSTALLER. */
if (netdev == NULL) if (netdev == NULL)
return; return;
mac = zd_netdev_mac(netdev);
usb = &mac->chip.usb;
dev_dbg_f(zd_usb_dev(usb), "\n"); dev_dbg_f(zd_usb_dev(usb), "\n");
zd_netdev_disconnect(netdev); zd_netdev_disconnect(netdev);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册