diff options
author | Jeff Garzik <jeff@garzik.org> | 2007-10-19 23:04:50 -0400 |
---|---|---|
committer | Jeff Garzik <jeff@garzik.org> | 2007-10-19 23:04:50 -0400 |
commit | fe2520094d88018423dfc42b3cd0015f74e8adea (patch) | |
tree | 859b78d64961ad92873e835ad1520caeb34b292f /drivers | |
parent | c9b2ca735a7685fa8aafd17b3cf3f9f20449d10b (diff) | |
parent | 1f06862e11f23ebc99438c592be9c92560d78548 (diff) |
Merge branch 'fixes-jgarzik' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-2.6 into upstream
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/net/wireless/b43/main.c | 5 | ||||
-rw-r--r-- | drivers/net/wireless/b43legacy/main.c | 2 | ||||
-rw-r--r-- | drivers/net/wireless/ipw2100.c | 39 | ||||
-rw-r--r-- | drivers/net/wireless/ipw2100.h | 4 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-3945-rs.c | 3 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-3945.c | 1 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-4965-rs.c | 13 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-4965.c | 2 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl3945-base.c | 44 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl4965-base.c | 52 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwlwifi.h | 7 | ||||
-rw-r--r-- | drivers/net/wireless/p54common.c | 2 | ||||
-rw-r--r-- | drivers/net/wireless/rt2x00/rt2x00dev.c | 2 | ||||
-rw-r--r-- | drivers/net/wireless/rt2x00/rt73usb.c | 1 | ||||
-rw-r--r-- | drivers/net/wireless/rtl8187_dev.c | 35 | ||||
-rw-r--r-- | drivers/net/wireless/zd1201.c | 4 | ||||
-rw-r--r-- | drivers/net/wireless/zd1211rw/zd_usb.c | 7 |
17 files changed, 137 insertions, 86 deletions
diff --git a/drivers/net/wireless/b43/main.c b/drivers/net/wireless/b43/main.c index c141a264ac45..9d9ff76a9bc6 100644 --- a/drivers/net/wireless/b43/main.c +++ b/drivers/net/wireless/b43/main.c | |||
@@ -49,7 +49,6 @@ | |||
49 | #include "pio.h" | 49 | #include "pio.h" |
50 | #include "sysfs.h" | 50 | #include "sysfs.h" |
51 | #include "xmit.h" | 51 | #include "xmit.h" |
52 | #include "sysfs.h" | ||
53 | #include "lo.h" | 52 | #include "lo.h" |
54 | #include "pcmcia.h" | 53 | #include "pcmcia.h" |
55 | 54 | ||
@@ -3495,7 +3494,7 @@ static int b43_start(struct ieee80211_hw *hw) | |||
3495 | struct b43_wl *wl = hw_to_b43_wl(hw); | 3494 | struct b43_wl *wl = hw_to_b43_wl(hw); |
3496 | struct b43_wldev *dev = wl->current_dev; | 3495 | struct b43_wldev *dev = wl->current_dev; |
3497 | int did_init = 0; | 3496 | int did_init = 0; |
3498 | int err; | 3497 | int err = 0; |
3499 | 3498 | ||
3500 | mutex_lock(&wl->mutex); | 3499 | mutex_lock(&wl->mutex); |
3501 | 3500 | ||
@@ -3521,7 +3520,7 @@ static int b43_start(struct ieee80211_hw *hw) | |||
3521 | return err; | 3520 | return err; |
3522 | } | 3521 | } |
3523 | 3522 | ||
3524 | void b43_stop(struct ieee80211_hw *hw) | 3523 | static void b43_stop(struct ieee80211_hw *hw) |
3525 | { | 3524 | { |
3526 | struct b43_wl *wl = hw_to_b43_wl(hw); | 3525 | struct b43_wl *wl = hw_to_b43_wl(hw); |
3527 | struct b43_wldev *dev = wl->current_dev; | 3526 | struct b43_wldev *dev = wl->current_dev; |
diff --git a/drivers/net/wireless/b43legacy/main.c b/drivers/net/wireless/b43legacy/main.c index f0749510bcd7..d09479e816cd 100644 --- a/drivers/net/wireless/b43legacy/main.c +++ b/drivers/net/wireless/b43legacy/main.c | |||
@@ -3306,7 +3306,7 @@ static int b43legacy_start(struct ieee80211_hw *hw) | |||
3306 | struct b43legacy_wl *wl = hw_to_b43legacy_wl(hw); | 3306 | struct b43legacy_wl *wl = hw_to_b43legacy_wl(hw); |
3307 | struct b43legacy_wldev *dev = wl->current_dev; | 3307 | struct b43legacy_wldev *dev = wl->current_dev; |
3308 | int did_init = 0; | 3308 | int did_init = 0; |
3309 | int err; | 3309 | int err = 0; |
3310 | 3310 | ||
3311 | mutex_lock(&wl->mutex); | 3311 | mutex_lock(&wl->mutex); |
3312 | 3312 | ||
diff --git a/drivers/net/wireless/ipw2100.c b/drivers/net/wireless/ipw2100.c index 2d46a16c0945..2fa8eed86dc1 100644 --- a/drivers/net/wireless/ipw2100.c +++ b/drivers/net/wireless/ipw2100.c | |||
@@ -2105,12 +2105,46 @@ static void isr_indicate_rf_kill(struct ipw2100_priv *priv, u32 status) | |||
2105 | queue_delayed_work(priv->workqueue, &priv->rf_kill, round_jiffies(HZ)); | 2105 | queue_delayed_work(priv->workqueue, &priv->rf_kill, round_jiffies(HZ)); |
2106 | } | 2106 | } |
2107 | 2107 | ||
2108 | static void send_scan_event(void *data) | ||
2109 | { | ||
2110 | struct ipw2100_priv *priv = data; | ||
2111 | union iwreq_data wrqu; | ||
2112 | |||
2113 | wrqu.data.length = 0; | ||
2114 | wrqu.data.flags = 0; | ||
2115 | wireless_send_event(priv->net_dev, SIOCGIWSCAN, &wrqu, NULL); | ||
2116 | } | ||
2117 | |||
2118 | static void ipw2100_scan_event_later(struct work_struct *work) | ||
2119 | { | ||
2120 | send_scan_event(container_of(work, struct ipw2100_priv, | ||
2121 | scan_event_later.work)); | ||
2122 | } | ||
2123 | |||
2124 | static void ipw2100_scan_event_now(struct work_struct *work) | ||
2125 | { | ||
2126 | send_scan_event(container_of(work, struct ipw2100_priv, | ||
2127 | scan_event_now)); | ||
2128 | } | ||
2129 | |||
2108 | static void isr_scan_complete(struct ipw2100_priv *priv, u32 status) | 2130 | static void isr_scan_complete(struct ipw2100_priv *priv, u32 status) |
2109 | { | 2131 | { |
2110 | IPW_DEBUG_SCAN("scan complete\n"); | 2132 | IPW_DEBUG_SCAN("scan complete\n"); |
2111 | /* Age the scan results... */ | 2133 | /* Age the scan results... */ |
2112 | priv->ieee->scans++; | 2134 | priv->ieee->scans++; |
2113 | priv->status &= ~STATUS_SCANNING; | 2135 | priv->status &= ~STATUS_SCANNING; |
2136 | |||
2137 | /* Only userspace-requested scan completion events go out immediately */ | ||
2138 | if (!priv->user_requested_scan) { | ||
2139 | if (!delayed_work_pending(&priv->scan_event_later)) | ||
2140 | queue_delayed_work(priv->workqueue, | ||
2141 | &priv->scan_event_later, | ||
2142 | round_jiffies(msecs_to_jiffies(4000))); | ||
2143 | } else { | ||
2144 | priv->user_requested_scan = 0; | ||
2145 | cancel_delayed_work(&priv->scan_event_later); | ||
2146 | queue_work(priv->workqueue, &priv->scan_event_now); | ||
2147 | } | ||
2114 | } | 2148 | } |
2115 | 2149 | ||
2116 | #ifdef CONFIG_IPW2100_DEBUG | 2150 | #ifdef CONFIG_IPW2100_DEBUG |
@@ -4378,6 +4412,7 @@ static void ipw2100_kill_workqueue(struct ipw2100_priv *priv) | |||
4378 | cancel_delayed_work(&priv->wx_event_work); | 4412 | cancel_delayed_work(&priv->wx_event_work); |
4379 | cancel_delayed_work(&priv->hang_check); | 4413 | cancel_delayed_work(&priv->hang_check); |
4380 | cancel_delayed_work(&priv->rf_kill); | 4414 | cancel_delayed_work(&priv->rf_kill); |
4415 | cancel_delayed_work(&priv->scan_event_later); | ||
4381 | destroy_workqueue(priv->workqueue); | 4416 | destroy_workqueue(priv->workqueue); |
4382 | priv->workqueue = NULL; | 4417 | priv->workqueue = NULL; |
4383 | } | 4418 | } |
@@ -6121,6 +6156,8 @@ static struct net_device *ipw2100_alloc_device(struct pci_dev *pci_dev, | |||
6121 | INIT_DELAYED_WORK(&priv->wx_event_work, ipw2100_wx_event_work); | 6156 | INIT_DELAYED_WORK(&priv->wx_event_work, ipw2100_wx_event_work); |
6122 | INIT_DELAYED_WORK(&priv->hang_check, ipw2100_hang_check); | 6157 | INIT_DELAYED_WORK(&priv->hang_check, ipw2100_hang_check); |
6123 | INIT_DELAYED_WORK(&priv->rf_kill, ipw2100_rf_kill); | 6158 | INIT_DELAYED_WORK(&priv->rf_kill, ipw2100_rf_kill); |
6159 | INIT_WORK(&priv->scan_event_now, ipw2100_scan_event_now); | ||
6160 | INIT_DELAYED_WORK(&priv->scan_event_later, ipw2100_scan_event_later); | ||
6124 | 6161 | ||
6125 | tasklet_init(&priv->irq_tasklet, (void (*)(unsigned long)) | 6162 | tasklet_init(&priv->irq_tasklet, (void (*)(unsigned long)) |
6126 | ipw2100_irq_tasklet, (unsigned long)priv); | 6163 | ipw2100_irq_tasklet, (unsigned long)priv); |
@@ -7425,6 +7462,8 @@ static int ipw2100_wx_set_scan(struct net_device *dev, | |||
7425 | } | 7462 | } |
7426 | 7463 | ||
7427 | IPW_DEBUG_WX("Initiating scan...\n"); | 7464 | IPW_DEBUG_WX("Initiating scan...\n"); |
7465 | |||
7466 | priv->user_requested_scan = 1; | ||
7428 | if (ipw2100_set_scan_options(priv) || ipw2100_start_scan(priv)) { | 7467 | if (ipw2100_set_scan_options(priv) || ipw2100_start_scan(priv)) { |
7429 | IPW_DEBUG_WX("Start scan failed.\n"); | 7468 | IPW_DEBUG_WX("Start scan failed.\n"); |
7430 | 7469 | ||
diff --git a/drivers/net/wireless/ipw2100.h b/drivers/net/wireless/ipw2100.h index de7d384d38af..1ee3348aedd9 100644 --- a/drivers/net/wireless/ipw2100.h +++ b/drivers/net/wireless/ipw2100.h | |||
@@ -588,6 +588,10 @@ struct ipw2100_priv { | |||
588 | struct delayed_work wx_event_work; | 588 | struct delayed_work wx_event_work; |
589 | struct delayed_work hang_check; | 589 | struct delayed_work hang_check; |
590 | struct delayed_work rf_kill; | 590 | struct delayed_work rf_kill; |
591 | struct work_struct scan_event_now; | ||
592 | struct delayed_work scan_event_later; | ||
593 | |||
594 | int user_requested_scan; | ||
591 | 595 | ||
592 | u32 interrupts; | 596 | u32 interrupts; |
593 | int tx_interrupts; | 597 | int tx_interrupts; |
diff --git a/drivers/net/wireless/iwlwifi/iwl-3945-rs.c b/drivers/net/wireless/iwlwifi/iwl-3945-rs.c index f4aabcf480e4..262ab0b55824 100644 --- a/drivers/net/wireless/iwlwifi/iwl-3945-rs.c +++ b/drivers/net/wireless/iwlwifi/iwl-3945-rs.c | |||
@@ -37,9 +37,6 @@ | |||
37 | 37 | ||
38 | #include <linux/workqueue.h> | 38 | #include <linux/workqueue.h> |
39 | 39 | ||
40 | #include <net/mac80211.h> | ||
41 | #include <linux/wireless.h> | ||
42 | |||
43 | #define IWL 3945 | 40 | #define IWL 3945 |
44 | 41 | ||
45 | #include "../net/mac80211/ieee80211_rate.h" | 42 | #include "../net/mac80211/ieee80211_rate.h" |
diff --git a/drivers/net/wireless/iwlwifi/iwl-3945.c b/drivers/net/wireless/iwlwifi/iwl-3945.c index acb38750535f..19bcb01e2784 100644 --- a/drivers/net/wireless/iwlwifi/iwl-3945.c +++ b/drivers/net/wireless/iwlwifi/iwl-3945.c | |||
@@ -38,7 +38,6 @@ | |||
38 | #include <net/mac80211.h> | 38 | #include <net/mac80211.h> |
39 | 39 | ||
40 | #include <linux/etherdevice.h> | 40 | #include <linux/etherdevice.h> |
41 | #include <linux/delay.h> | ||
42 | 41 | ||
43 | #define IWL 3945 | 42 | #define IWL 3945 |
44 | 43 | ||
diff --git a/drivers/net/wireless/iwlwifi/iwl-4965-rs.c b/drivers/net/wireless/iwlwifi/iwl-4965-rs.c index 287c75705c44..8dc78c0bf1ff 100644 --- a/drivers/net/wireless/iwlwifi/iwl-4965-rs.c +++ b/drivers/net/wireless/iwlwifi/iwl-4965-rs.c | |||
@@ -36,9 +36,6 @@ | |||
36 | 36 | ||
37 | #include <linux/workqueue.h> | 37 | #include <linux/workqueue.h> |
38 | 38 | ||
39 | #include <net/mac80211.h> | ||
40 | #include <linux/wireless.h> | ||
41 | |||
42 | #define IWL 4965 | 39 | #define IWL 4965 |
43 | 40 | ||
44 | #include "../net/mac80211/ieee80211_rate.h" | 41 | #include "../net/mac80211/ieee80211_rate.h" |
@@ -2024,12 +2021,18 @@ static int open_file_generic(struct inode *inode, struct file *file) | |||
2024 | static void rs_dbgfs_set_mcs(struct iwl_rate_scale_priv *rs_priv, | 2021 | static void rs_dbgfs_set_mcs(struct iwl_rate_scale_priv *rs_priv, |
2025 | struct iwl_rate *mcs, int index) | 2022 | struct iwl_rate *mcs, int index) |
2026 | { | 2023 | { |
2027 | const u32 cck_rate = 0x820A; | 2024 | u32 base_rate; |
2025 | |||
2026 | if (rs_priv->phymode == (u8) MODE_IEEE80211A) | ||
2027 | base_rate = 0x800D; | ||
2028 | else | ||
2029 | base_rate = 0x820A; | ||
2030 | |||
2028 | if (rs_priv->dbg_fixed.rate_n_flags) { | 2031 | if (rs_priv->dbg_fixed.rate_n_flags) { |
2029 | if (index < 12) | 2032 | if (index < 12) |
2030 | mcs->rate_n_flags = rs_priv->dbg_fixed.rate_n_flags; | 2033 | mcs->rate_n_flags = rs_priv->dbg_fixed.rate_n_flags; |
2031 | else | 2034 | else |
2032 | mcs->rate_n_flags = cck_rate; | 2035 | mcs->rate_n_flags = base_rate; |
2033 | IWL_DEBUG_RATE("Fixed rate ON\n"); | 2036 | IWL_DEBUG_RATE("Fixed rate ON\n"); |
2034 | return; | 2037 | return; |
2035 | } | 2038 | } |
diff --git a/drivers/net/wireless/iwlwifi/iwl-4965.c b/drivers/net/wireless/iwlwifi/iwl-4965.c index b50d20267c8a..557deebca1b9 100644 --- a/drivers/net/wireless/iwlwifi/iwl-4965.c +++ b/drivers/net/wireless/iwlwifi/iwl-4965.c | |||
@@ -35,9 +35,7 @@ | |||
35 | #include <linux/netdevice.h> | 35 | #include <linux/netdevice.h> |
36 | #include <linux/wireless.h> | 36 | #include <linux/wireless.h> |
37 | #include <net/mac80211.h> | 37 | #include <net/mac80211.h> |
38 | #include <linux/netdevice.h> | ||
39 | #include <linux/etherdevice.h> | 38 | #include <linux/etherdevice.h> |
40 | #include <linux/delay.h> | ||
41 | 39 | ||
42 | #define IWL 4965 | 40 | #define IWL 4965 |
43 | 41 | ||
diff --git a/drivers/net/wireless/iwlwifi/iwl3945-base.c b/drivers/net/wireless/iwlwifi/iwl3945-base.c index 75e3b5c3f155..83019d1d7ccc 100644 --- a/drivers/net/wireless/iwlwifi/iwl3945-base.c +++ b/drivers/net/wireless/iwlwifi/iwl3945-base.c | |||
@@ -48,8 +48,6 @@ | |||
48 | #include <linux/netdevice.h> | 48 | #include <linux/netdevice.h> |
49 | #include <linux/wireless.h> | 49 | #include <linux/wireless.h> |
50 | #include <linux/firmware.h> | 50 | #include <linux/firmware.h> |
51 | #include <linux/skbuff.h> | ||
52 | #include <linux/netdevice.h> | ||
53 | #include <linux/etherdevice.h> | 51 | #include <linux/etherdevice.h> |
54 | #include <linux/if_arp.h> | 52 | #include <linux/if_arp.h> |
55 | 53 | ||
@@ -1749,21 +1747,22 @@ static void iwl_unset_hw_setting(struct iwl_priv *priv) | |||
1749 | * return : set the bit for each supported rate insert in ie | 1747 | * return : set the bit for each supported rate insert in ie |
1750 | */ | 1748 | */ |
1751 | static u16 iwl_supported_rate_to_ie(u8 *ie, u16 supported_rate, | 1749 | static u16 iwl_supported_rate_to_ie(u8 *ie, u16 supported_rate, |
1752 | u16 basic_rate, int max_count) | 1750 | u16 basic_rate, int *left) |
1753 | { | 1751 | { |
1754 | u16 ret_rates = 0, bit; | 1752 | u16 ret_rates = 0, bit; |
1755 | int i; | 1753 | int i; |
1756 | u8 *rates; | 1754 | u8 *cnt = ie; |
1757 | 1755 | u8 *rates = ie + 1; | |
1758 | rates = &(ie[1]); | ||
1759 | 1756 | ||
1760 | for (bit = 1, i = 0; i < IWL_RATE_COUNT; i++, bit <<= 1) { | 1757 | for (bit = 1, i = 0; i < IWL_RATE_COUNT; i++, bit <<= 1) { |
1761 | if (bit & supported_rate) { | 1758 | if (bit & supported_rate) { |
1762 | ret_rates |= bit; | 1759 | ret_rates |= bit; |
1763 | rates[*ie] = iwl_rates[i].ieee | | 1760 | rates[*cnt] = iwl_rates[i].ieee | |
1764 | ((bit & basic_rate) ? 0x80 : 0x00); | 1761 | ((bit & basic_rate) ? 0x80 : 0x00); |
1765 | *ie = *ie + 1; | 1762 | (*cnt)++; |
1766 | if (*ie >= max_count) | 1763 | (*left)--; |
1764 | if ((*left <= 0) || | ||
1765 | (*cnt >= IWL_SUPPORTED_RATES_IE_LEN)) | ||
1767 | break; | 1766 | break; |
1768 | } | 1767 | } |
1769 | } | 1768 | } |
@@ -1780,7 +1779,7 @@ static u16 iwl_fill_probe_req(struct iwl_priv *priv, | |||
1780 | { | 1779 | { |
1781 | int len = 0; | 1780 | int len = 0; |
1782 | u8 *pos = NULL; | 1781 | u8 *pos = NULL; |
1783 | u16 ret_rates; | 1782 | u16 active_rates, ret_rates, cck_rates; |
1784 | 1783 | ||
1785 | /* Make sure there is enough space for the probe request, | 1784 | /* Make sure there is enough space for the probe request, |
1786 | * two mandatory IEs and the data */ | 1785 | * two mandatory IEs and the data */ |
@@ -1825,19 +1824,27 @@ static u16 iwl_fill_probe_req(struct iwl_priv *priv, | |||
1825 | left -= 2; | 1824 | left -= 2; |
1826 | if (left < 0) | 1825 | if (left < 0) |
1827 | return 0; | 1826 | return 0; |
1827 | |||
1828 | /* ... fill it in... */ | 1828 | /* ... fill it in... */ |
1829 | *pos++ = WLAN_EID_SUPP_RATES; | 1829 | *pos++ = WLAN_EID_SUPP_RATES; |
1830 | *pos = 0; | 1830 | *pos = 0; |
1831 | ret_rates = priv->active_rate = priv->rates_mask; | 1831 | |
1832 | priv->active_rate = priv->rates_mask; | ||
1833 | active_rates = priv->active_rate; | ||
1832 | priv->active_rate_basic = priv->rates_mask & IWL_BASIC_RATES_MASK; | 1834 | priv->active_rate_basic = priv->rates_mask & IWL_BASIC_RATES_MASK; |
1833 | 1835 | ||
1834 | iwl_supported_rate_to_ie(pos, priv->active_rate, | 1836 | cck_rates = IWL_CCK_RATES_MASK & active_rates; |
1835 | priv->active_rate_basic, left); | 1837 | ret_rates = iwl_supported_rate_to_ie(pos, cck_rates, |
1838 | priv->active_rate_basic, &left); | ||
1839 | active_rates &= ~ret_rates; | ||
1840 | |||
1841 | ret_rates = iwl_supported_rate_to_ie(pos, active_rates, | ||
1842 | priv->active_rate_basic, &left); | ||
1843 | active_rates &= ~ret_rates; | ||
1844 | |||
1836 | len += 2 + *pos; | 1845 | len += 2 + *pos; |
1837 | pos += (*pos) + 1; | 1846 | pos += (*pos) + 1; |
1838 | ret_rates = ~ret_rates & priv->active_rate; | 1847 | if (active_rates == 0) |
1839 | |||
1840 | if (ret_rates == 0) | ||
1841 | goto fill_end; | 1848 | goto fill_end; |
1842 | 1849 | ||
1843 | /* fill in supported extended rate */ | 1850 | /* fill in supported extended rate */ |
@@ -1848,7 +1855,8 @@ static u16 iwl_fill_probe_req(struct iwl_priv *priv, | |||
1848 | /* ... fill it in... */ | 1855 | /* ... fill it in... */ |
1849 | *pos++ = WLAN_EID_EXT_SUPP_RATES; | 1856 | *pos++ = WLAN_EID_EXT_SUPP_RATES; |
1850 | *pos = 0; | 1857 | *pos = 0; |
1851 | iwl_supported_rate_to_ie(pos, ret_rates, priv->active_rate_basic, left); | 1858 | iwl_supported_rate_to_ie(pos, active_rates, |
1859 | priv->active_rate_basic, &left); | ||
1852 | if (*pos > 0) | 1860 | if (*pos > 0) |
1853 | len += 2 + *pos; | 1861 | len += 2 + *pos; |
1854 | 1862 | ||
diff --git a/drivers/net/wireless/iwlwifi/iwl4965-base.c b/drivers/net/wireless/iwlwifi/iwl4965-base.c index b1a6e39f7821..5e1279263b22 100644 --- a/drivers/net/wireless/iwlwifi/iwl4965-base.c +++ b/drivers/net/wireless/iwlwifi/iwl4965-base.c | |||
@@ -48,8 +48,6 @@ | |||
48 | #include <linux/netdevice.h> | 48 | #include <linux/netdevice.h> |
49 | #include <linux/wireless.h> | 49 | #include <linux/wireless.h> |
50 | #include <linux/firmware.h> | 50 | #include <linux/firmware.h> |
51 | #include <linux/skbuff.h> | ||
52 | #include <linux/netdevice.h> | ||
53 | #include <linux/etherdevice.h> | 51 | #include <linux/etherdevice.h> |
54 | #include <linux/if_arp.h> | 52 | #include <linux/if_arp.h> |
55 | 53 | ||
@@ -1802,21 +1800,22 @@ static void iwl_unset_hw_setting(struct iwl_priv *priv) | |||
1802 | * return : set the bit for each supported rate insert in ie | 1800 | * return : set the bit for each supported rate insert in ie |
1803 | */ | 1801 | */ |
1804 | static u16 iwl_supported_rate_to_ie(u8 *ie, u16 supported_rate, | 1802 | static u16 iwl_supported_rate_to_ie(u8 *ie, u16 supported_rate, |
1805 | u16 basic_rate, int max_count) | 1803 | u16 basic_rate, int *left) |
1806 | { | 1804 | { |
1807 | u16 ret_rates = 0, bit; | 1805 | u16 ret_rates = 0, bit; |
1808 | int i; | 1806 | int i; |
1809 | u8 *rates; | 1807 | u8 *cnt = ie; |
1810 | 1808 | u8 *rates = ie + 1; | |
1811 | rates = &(ie[1]); | ||
1812 | 1809 | ||
1813 | for (bit = 1, i = 0; i < IWL_RATE_COUNT; i++, bit <<= 1) { | 1810 | for (bit = 1, i = 0; i < IWL_RATE_COUNT; i++, bit <<= 1) { |
1814 | if (bit & supported_rate) { | 1811 | if (bit & supported_rate) { |
1815 | ret_rates |= bit; | 1812 | ret_rates |= bit; |
1816 | rates[*ie] = iwl_rates[i].ieee | | 1813 | rates[*cnt] = iwl_rates[i].ieee | |
1817 | ((bit & basic_rate) ? 0x80 : 0x00); | 1814 | ((bit & basic_rate) ? 0x80 : 0x00); |
1818 | *ie = *ie + 1; | 1815 | (*cnt)++; |
1819 | if (*ie >= max_count) | 1816 | (*left)--; |
1817 | if ((*left <= 0) || | ||
1818 | (*cnt >= IWL_SUPPORTED_RATES_IE_LEN)) | ||
1820 | break; | 1819 | break; |
1821 | } | 1820 | } |
1822 | } | 1821 | } |
@@ -1839,7 +1838,7 @@ static u16 iwl_fill_probe_req(struct iwl_priv *priv, | |||
1839 | { | 1838 | { |
1840 | int len = 0; | 1839 | int len = 0; |
1841 | u8 *pos = NULL; | 1840 | u8 *pos = NULL; |
1842 | u16 ret_rates; | 1841 | u16 active_rates, ret_rates, cck_rates; |
1843 | 1842 | ||
1844 | /* Make sure there is enough space for the probe request, | 1843 | /* Make sure there is enough space for the probe request, |
1845 | * two mandatory IEs and the data */ | 1844 | * two mandatory IEs and the data */ |
@@ -1884,19 +1883,27 @@ static u16 iwl_fill_probe_req(struct iwl_priv *priv, | |||
1884 | left -= 2; | 1883 | left -= 2; |
1885 | if (left < 0) | 1884 | if (left < 0) |
1886 | return 0; | 1885 | return 0; |
1886 | |||
1887 | /* ... fill it in... */ | 1887 | /* ... fill it in... */ |
1888 | *pos++ = WLAN_EID_SUPP_RATES; | 1888 | *pos++ = WLAN_EID_SUPP_RATES; |
1889 | *pos = 0; | 1889 | *pos = 0; |
1890 | ret_rates = priv->active_rate = priv->rates_mask; | 1890 | |
1891 | priv->active_rate = priv->rates_mask; | ||
1892 | active_rates = priv->active_rate; | ||
1891 | priv->active_rate_basic = priv->rates_mask & IWL_BASIC_RATES_MASK; | 1893 | priv->active_rate_basic = priv->rates_mask & IWL_BASIC_RATES_MASK; |
1892 | 1894 | ||
1893 | iwl_supported_rate_to_ie(pos, priv->active_rate, | 1895 | cck_rates = IWL_CCK_RATES_MASK & active_rates; |
1894 | priv->active_rate_basic, left); | 1896 | ret_rates = iwl_supported_rate_to_ie(pos, cck_rates, |
1897 | priv->active_rate_basic, &left); | ||
1898 | active_rates &= ~ret_rates; | ||
1899 | |||
1900 | ret_rates = iwl_supported_rate_to_ie(pos, active_rates, | ||
1901 | priv->active_rate_basic, &left); | ||
1902 | active_rates &= ~ret_rates; | ||
1903 | |||
1895 | len += 2 + *pos; | 1904 | len += 2 + *pos; |
1896 | pos += (*pos) + 1; | 1905 | pos += (*pos) + 1; |
1897 | ret_rates = ~ret_rates & priv->active_rate; | 1906 | if (active_rates == 0) |
1898 | |||
1899 | if (ret_rates == 0) | ||
1900 | goto fill_end; | 1907 | goto fill_end; |
1901 | 1908 | ||
1902 | /* fill in supported extended rate */ | 1909 | /* fill in supported extended rate */ |
@@ -1907,7 +1914,8 @@ static u16 iwl_fill_probe_req(struct iwl_priv *priv, | |||
1907 | /* ... fill it in... */ | 1914 | /* ... fill it in... */ |
1908 | *pos++ = WLAN_EID_EXT_SUPP_RATES; | 1915 | *pos++ = WLAN_EID_EXT_SUPP_RATES; |
1909 | *pos = 0; | 1916 | *pos = 0; |
1910 | iwl_supported_rate_to_ie(pos, ret_rates, priv->active_rate_basic, left); | 1917 | iwl_supported_rate_to_ie(pos, active_rates, |
1918 | priv->active_rate_basic, &left); | ||
1911 | if (*pos > 0) | 1919 | if (*pos > 0) |
1912 | len += 2 + *pos; | 1920 | len += 2 + *pos; |
1913 | 1921 | ||
@@ -4494,13 +4502,13 @@ static u8 ratio2dB[100] = { | |||
4494 | * Conversion assumes that levels are voltages (20*log), not powers (10*log). */ | 4502 | * Conversion assumes that levels are voltages (20*log), not powers (10*log). */ |
4495 | int iwl_calc_db_from_ratio(int sig_ratio) | 4503 | int iwl_calc_db_from_ratio(int sig_ratio) |
4496 | { | 4504 | { |
4497 | /* Anything above 1000:1 just report as 60 dB */ | 4505 | /* 1000:1 or higher just report as 60 dB */ |
4498 | if (sig_ratio > 1000) | 4506 | if (sig_ratio >= 1000) |
4499 | return 60; | 4507 | return 60; |
4500 | 4508 | ||
4501 | /* Above 100:1, divide by 10 and use table, | 4509 | /* 100:1 or higher, divide by 10 and use table, |
4502 | * add 20 dB to make up for divide by 10 */ | 4510 | * add 20 dB to make up for divide by 10 */ |
4503 | if (sig_ratio > 100) | 4511 | if (sig_ratio >= 100) |
4504 | return (20 + (int)ratio2dB[sig_ratio/10]); | 4512 | return (20 + (int)ratio2dB[sig_ratio/10]); |
4505 | 4513 | ||
4506 | /* We shouldn't see this */ | 4514 | /* We shouldn't see this */ |
diff --git a/drivers/net/wireless/iwlwifi/iwlwifi.h b/drivers/net/wireless/iwlwifi/iwlwifi.h index e0b97c341215..432ce887807f 100644 --- a/drivers/net/wireless/iwlwifi/iwlwifi.h +++ b/drivers/net/wireless/iwlwifi/iwlwifi.h | |||
@@ -39,18 +39,13 @@ struct iwl_priv; | |||
39 | /* Hardware specific file defines the PCI IDs table for that hardware module */ | 39 | /* Hardware specific file defines the PCI IDs table for that hardware module */ |
40 | extern struct pci_device_id iwl_hw_card_ids[]; | 40 | extern struct pci_device_id iwl_hw_card_ids[]; |
41 | 41 | ||
42 | #include "iwl-hw.h" | ||
42 | #if IWL == 3945 | 43 | #if IWL == 3945 |
43 | |||
44 | #define DRV_NAME "iwl3945" | 44 | #define DRV_NAME "iwl3945" |
45 | #include "iwl-hw.h" | ||
46 | #include "iwl-3945-hw.h" | 45 | #include "iwl-3945-hw.h" |
47 | |||
48 | #elif IWL == 4965 | 46 | #elif IWL == 4965 |
49 | |||
50 | #define DRV_NAME "iwl4965" | 47 | #define DRV_NAME "iwl4965" |
51 | #include "iwl-hw.h" | ||
52 | #include "iwl-4965-hw.h" | 48 | #include "iwl-4965-hw.h" |
53 | |||
54 | #endif | 49 | #endif |
55 | 50 | ||
56 | #include "iwl-prph.h" | 51 | #include "iwl-prph.h" |
diff --git a/drivers/net/wireless/p54common.c b/drivers/net/wireless/p54common.c index 2c63cf0ad2cd..1437db0cf4b2 100644 --- a/drivers/net/wireless/p54common.c +++ b/drivers/net/wireless/p54common.c | |||
@@ -577,7 +577,7 @@ static int p54_set_filter(struct ieee80211_hw *dev, u16 filter_type, | |||
577 | struct p54_tx_control_filter *filter; | 577 | struct p54_tx_control_filter *filter; |
578 | 578 | ||
579 | hdr = kzalloc(sizeof(*hdr) + sizeof(*filter) + | 579 | hdr = kzalloc(sizeof(*hdr) + sizeof(*filter) + |
580 | priv->tx_hdr_len, GFP_KERNEL); | 580 | priv->tx_hdr_len, GFP_ATOMIC); |
581 | if (!hdr) | 581 | if (!hdr) |
582 | return -ENOMEM; | 582 | return -ENOMEM; |
583 | 583 | ||
diff --git a/drivers/net/wireless/rt2x00/rt2x00dev.c b/drivers/net/wireless/rt2x00/rt2x00dev.c index bb6f46cfbb9f..ff399f8083e9 100644 --- a/drivers/net/wireless/rt2x00/rt2x00dev.c +++ b/drivers/net/wireless/rt2x00/rt2x00dev.c | |||
@@ -550,7 +550,7 @@ void rt2x00lib_write_tx_desc(struct rt2x00_dev *rt2x00dev, | |||
550 | /* | 550 | /* |
551 | * Check if we need to set the Length Extension | 551 | * Check if we need to set the Length Extension |
552 | */ | 552 | */ |
553 | if (bitrate == 110 && residual <= 3) | 553 | if (bitrate == 110 && residual <= 30) |
554 | desc.service |= 0x80; | 554 | desc.service |= 0x80; |
555 | } | 555 | } |
556 | 556 | ||
diff --git a/drivers/net/wireless/rt2x00/rt73usb.c b/drivers/net/wireless/rt2x00/rt73usb.c index 3e42759473c3..46c8c0840a65 100644 --- a/drivers/net/wireless/rt2x00/rt73usb.c +++ b/drivers/net/wireless/rt2x00/rt73usb.c | |||
@@ -2029,6 +2029,7 @@ static struct usb_device_id rt73usb_device_table[] = { | |||
2029 | { USB_DEVICE(0x050d, 0x7050), USB_DEVICE_DATA(&rt73usb_ops) }, | 2029 | { USB_DEVICE(0x050d, 0x7050), USB_DEVICE_DATA(&rt73usb_ops) }, |
2030 | { USB_DEVICE(0x050d, 0x705a), USB_DEVICE_DATA(&rt73usb_ops) }, | 2030 | { USB_DEVICE(0x050d, 0x705a), USB_DEVICE_DATA(&rt73usb_ops) }, |
2031 | { USB_DEVICE(0x050d, 0x905b), USB_DEVICE_DATA(&rt73usb_ops) }, | 2031 | { USB_DEVICE(0x050d, 0x905b), USB_DEVICE_DATA(&rt73usb_ops) }, |
2032 | { USB_DEVICE(0x050d, 0x905c), USB_DEVICE_DATA(&rt73usb_ops) }, | ||
2032 | /* Billionton */ | 2033 | /* Billionton */ |
2033 | { USB_DEVICE(0x1631, 0xc019), USB_DEVICE_DATA(&rt73usb_ops) }, | 2034 | { USB_DEVICE(0x1631, 0xc019), USB_DEVICE_DATA(&rt73usb_ops) }, |
2034 | /* Buffalo */ | 2035 | /* Buffalo */ |
diff --git a/drivers/net/wireless/rtl8187_dev.c b/drivers/net/wireless/rtl8187_dev.c index 0ef887dd2867..de61c8fe6492 100644 --- a/drivers/net/wireless/rtl8187_dev.c +++ b/drivers/net/wireless/rtl8187_dev.c | |||
@@ -131,7 +131,8 @@ static int rtl8187_tx(struct ieee80211_hw *dev, struct sk_buff *skb, | |||
131 | struct rtl8187_tx_hdr *hdr; | 131 | struct rtl8187_tx_hdr *hdr; |
132 | struct rtl8187_tx_info *info; | 132 | struct rtl8187_tx_info *info; |
133 | struct urb *urb; | 133 | struct urb *urb; |
134 | u32 tmp; | 134 | __le16 rts_dur = 0; |
135 | u32 flags; | ||
135 | 136 | ||
136 | urb = usb_alloc_urb(0, GFP_ATOMIC); | 137 | urb = usb_alloc_urb(0, GFP_ATOMIC); |
137 | if (!urb) { | 138 | if (!urb) { |
@@ -139,24 +140,24 @@ static int rtl8187_tx(struct ieee80211_hw *dev, struct sk_buff *skb, | |||
139 | return 0; | 140 | return 0; |
140 | } | 141 | } |
141 | 142 | ||
142 | hdr = (struct rtl8187_tx_hdr *)skb_push(skb, sizeof(*hdr)); | 143 | flags = skb->len; |
143 | tmp = skb->len - sizeof(*hdr); | 144 | flags |= RTL8187_TX_FLAG_NO_ENCRYPT; |
144 | tmp |= RTL8187_TX_FLAG_NO_ENCRYPT; | 145 | flags |= control->rts_cts_rate << 19; |
145 | tmp |= control->rts_cts_rate << 19; | 146 | flags |= control->tx_rate << 24; |
146 | tmp |= control->tx_rate << 24; | 147 | if (ieee80211_get_morefrag((struct ieee80211_hdr *)skb->data)) |
147 | if (ieee80211_get_morefrag((struct ieee80211_hdr *)skb)) | 148 | flags |= RTL8187_TX_FLAG_MORE_FRAG; |
148 | tmp |= RTL8187_TX_FLAG_MORE_FRAG; | ||
149 | if (control->flags & IEEE80211_TXCTL_USE_RTS_CTS) { | 149 | if (control->flags & IEEE80211_TXCTL_USE_RTS_CTS) { |
150 | tmp |= RTL8187_TX_FLAG_RTS; | 150 | flags |= RTL8187_TX_FLAG_RTS; |
151 | hdr->rts_duration = | 151 | rts_dur = ieee80211_rts_duration(dev, priv->if_id, skb->len, control); |
152 | ieee80211_rts_duration(dev, priv->if_id, skb->len, control); | ||
153 | } | 152 | } |
154 | if (control->flags & IEEE80211_TXCTL_USE_CTS_PROTECT) | 153 | if (control->flags & IEEE80211_TXCTL_USE_CTS_PROTECT) |
155 | tmp |= RTL8187_TX_FLAG_CTS; | 154 | flags |= RTL8187_TX_FLAG_CTS; |
156 | hdr->flags = cpu_to_le32(tmp); | 155 | |
156 | hdr = (struct rtl8187_tx_hdr *)skb_push(skb, sizeof(*hdr)); | ||
157 | hdr->flags = cpu_to_le32(flags); | ||
157 | hdr->len = 0; | 158 | hdr->len = 0; |
158 | tmp = control->retry_limit << 8; | 159 | hdr->rts_duration = rts_dur; |
159 | hdr->retry = cpu_to_le32(tmp); | 160 | hdr->retry = cpu_to_le32(control->retry_limit << 8); |
160 | 161 | ||
161 | info = (struct rtl8187_tx_info *)skb->cb; | 162 | info = (struct rtl8187_tx_info *)skb->cb; |
162 | info->control = kmemdup(control, sizeof(*control), GFP_ATOMIC); | 163 | info->control = kmemdup(control, sizeof(*control), GFP_ATOMIC); |
@@ -587,8 +588,6 @@ static void rtl8187_configure_filter(struct ieee80211_hw *dev, | |||
587 | 588 | ||
588 | *total_flags = 0; | 589 | *total_flags = 0; |
589 | 590 | ||
590 | if (changed_flags & FIF_PROMISC_IN_BSS) | ||
591 | priv->rx_conf ^= RTL818X_RX_CONF_NICMAC; | ||
592 | if (changed_flags & FIF_ALLMULTI) | 591 | if (changed_flags & FIF_ALLMULTI) |
593 | priv->rx_conf ^= RTL818X_RX_CONF_MULTICAST; | 592 | priv->rx_conf ^= RTL818X_RX_CONF_MULTICAST; |
594 | if (changed_flags & FIF_FCSFAIL) | 593 | if (changed_flags & FIF_FCSFAIL) |
@@ -601,8 +600,6 @@ static void rtl8187_configure_filter(struct ieee80211_hw *dev, | |||
601 | if (mc_count > 0) | 600 | if (mc_count > 0) |
602 | priv->rx_conf |= RTL818X_RX_CONF_MULTICAST; | 601 | priv->rx_conf |= RTL818X_RX_CONF_MULTICAST; |
603 | 602 | ||
604 | if (priv->rx_conf & RTL818X_RX_CONF_NICMAC) | ||
605 | *total_flags |= FIF_PROMISC_IN_BSS; | ||
606 | if (priv->rx_conf & RTL818X_RX_CONF_MULTICAST) | 603 | if (priv->rx_conf & RTL818X_RX_CONF_MULTICAST) |
607 | *total_flags |= FIF_ALLMULTI; | 604 | *total_flags |= FIF_ALLMULTI; |
608 | if (priv->rx_conf & RTL818X_RX_CONF_FCS) | 605 | if (priv->rx_conf & RTL818X_RX_CONF_FCS) |
diff --git a/drivers/net/wireless/zd1201.c b/drivers/net/wireless/zd1201.c index 935b144d9b56..d5c0c66188ca 100644 --- a/drivers/net/wireless/zd1201.c +++ b/drivers/net/wireless/zd1201.c | |||
@@ -327,8 +327,8 @@ static void zd1201_usbrx(struct urb *urb) | |||
327 | memcpy(skb_put(skb, 6), &data[datalen-8], 6); | 327 | memcpy(skb_put(skb, 6), &data[datalen-8], 6); |
328 | memcpy(skb_put(skb, 2), &data[datalen-24], 2); | 328 | memcpy(skb_put(skb, 2), &data[datalen-24], 2); |
329 | memcpy(skb_put(skb, len), data, len); | 329 | memcpy(skb_put(skb, len), data, len); |
330 | skb->dev->last_rx = jiffies; | ||
331 | skb->protocol = eth_type_trans(skb, zd->dev); | 330 | skb->protocol = eth_type_trans(skb, zd->dev); |
331 | skb->dev->last_rx = jiffies; | ||
332 | zd->stats.rx_packets++; | 332 | zd->stats.rx_packets++; |
333 | zd->stats.rx_bytes += skb->len; | 333 | zd->stats.rx_bytes += skb->len; |
334 | netif_rx(skb); | 334 | netif_rx(skb); |
@@ -384,8 +384,8 @@ static void zd1201_usbrx(struct urb *urb) | |||
384 | memcpy(skb_put(skb, 2), &data[6], 2); | 384 | memcpy(skb_put(skb, 2), &data[6], 2); |
385 | memcpy(skb_put(skb, len), data+8, len); | 385 | memcpy(skb_put(skb, len), data+8, len); |
386 | } | 386 | } |
387 | skb->dev->last_rx = jiffies; | ||
388 | skb->protocol = eth_type_trans(skb, zd->dev); | 387 | skb->protocol = eth_type_trans(skb, zd->dev); |
388 | skb->dev->last_rx = jiffies; | ||
389 | zd->stats.rx_packets++; | 389 | zd->stats.rx_packets++; |
390 | zd->stats.rx_bytes += skb->len; | 390 | zd->stats.rx_bytes += skb->len; |
391 | netif_rx(skb); | 391 | netif_rx(skb); |
diff --git a/drivers/net/wireless/zd1211rw/zd_usb.c b/drivers/net/wireless/zd1211rw/zd_usb.c index b0684f965761..c755b6923812 100644 --- a/drivers/net/wireless/zd1211rw/zd_usb.c +++ b/drivers/net/wireless/zd1211rw/zd_usb.c | |||
@@ -1044,14 +1044,17 @@ error: | |||
1044 | static void disconnect(struct usb_interface *intf) | 1044 | static void disconnect(struct usb_interface *intf) |
1045 | { | 1045 | { |
1046 | struct net_device *netdev = zd_intf_to_netdev(intf); | 1046 | struct net_device *netdev = zd_intf_to_netdev(intf); |
1047 | struct zd_mac *mac = zd_netdev_mac(netdev); | 1047 | struct zd_mac *mac; |
1048 | struct zd_usb *usb = &mac->chip.usb; | 1048 | struct zd_usb *usb; |
1049 | 1049 | ||
1050 | /* Either something really bad happened, or we're just dealing with | 1050 | /* Either something really bad happened, or we're just dealing with |
1051 | * a DEVICE_INSTALLER. */ | 1051 | * a DEVICE_INSTALLER. */ |
1052 | if (netdev == NULL) | 1052 | if (netdev == NULL) |
1053 | return; | 1053 | return; |
1054 | 1054 | ||
1055 | mac = zd_netdev_mac(netdev); | ||
1056 | usb = &mac->chip.usb; | ||
1057 | |||
1055 | dev_dbg_f(zd_usb_dev(usb), "\n"); | 1058 | dev_dbg_f(zd_usb_dev(usb), "\n"); |
1056 | 1059 | ||
1057 | zd_netdev_disconnect(netdev); | 1060 | zd_netdev_disconnect(netdev); |