--- /dev/null
+From 8b59560a3baf2e7c24e0fb92ea5d09eca92805db Mon Sep 17 00:00:00 2001
+From: Shaohua Li <shaohua.li@intel.com>
+Date: Thu, 28 Aug 2008 10:02:03 +0800
+Subject: ACPI: dock: avoid check _STA method
+
+From: Shaohua Li <shaohua.li@intel.com>
+
+commit 8b59560a3baf2e7c24e0fb92ea5d09eca92805db upstream.
+
+In some BIOSes, every _STA method call will send a notification again,
+this cause freeze. And in some BIOSes, it appears _STA should be called
+after _DCK. This tries to avoid calls _STA, and still keep the device
+present check.
+
+http://bugzilla.kernel.org/show_bug.cgi?id=10431
+
+Signed-off-by: Shaohua Li <shaohua.li@intel.com>
+Signed-off-by: Len Brown <len.brown@intel.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/acpi/dock.c | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+--- a/drivers/acpi/dock.c
++++ b/drivers/acpi/dock.c
+@@ -604,14 +604,17 @@ static int handle_eject_request(struct d
+ static void dock_notify(acpi_handle handle, u32 event, void *data)
+ {
+ struct dock_station *ds = data;
++ struct acpi_device *tmp;
+
+ switch (event) {
+ case ACPI_NOTIFY_BUS_CHECK:
+- if (!dock_in_progress(ds) && dock_present(ds)) {
++ if (!dock_in_progress(ds) && acpi_bus_get_device(ds->handle,
++ &tmp)) {
+ begin_dock(ds);
+ dock(ds);
+ if (!dock_present(ds)) {
+ printk(KERN_ERR PREFIX "Unable to dock!\n");
++ complete_dock(ds);
+ break;
+ }
+ atomic_notifier_call_chain(&dock_notifier_list,
--- /dev/null
+From 69fc7eed5f56bce15b239e5110de2575a6970df4 Mon Sep 17 00:00:00 2001
+From: Dmitry Baryshkov <dbaryshkov@gmail.com>
+Date: Thu, 9 Oct 2008 16:58:13 +0100
+Subject: ARM: 5300/1: fixup spitz reset during boot
+
+From: Dmitry Baryshkov <dbaryshkov@gmail.com>
+
+commit 69fc7eed5f56bce15b239e5110de2575a6970df4 upstream
+
+Some machines don't have the pullup/down on their reset
+pin, so configuring the reset generating pin as input makes
+them reset immediately. Fix that by making reset pin direction
+configurable.
+
+This fixes the boot problem on Sharp Zaurus c3000
+
+Signed-off-by: Dmitry Baryshkov <dbaryshkov@gmail.com>
+Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
+Signed-off-by: Pavel Machek <pavel@suse.cz>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ arch/arm/mach-pxa/include/mach/reset.h | 9 ++++++---
+ arch/arm/mach-pxa/reset.c | 9 ++++++---
+ arch/arm/mach-pxa/spitz.c | 2 +-
+ arch/arm/mach-pxa/tosa.c | 2 +-
+ 4 files changed, 14 insertions(+), 8 deletions(-)
+
+--- a/arch/arm/mach-pxa/include/mach/reset.h
++++ b/arch/arm/mach-pxa/include/mach/reset.h
+@@ -10,9 +10,12 @@
+ extern unsigned int reset_status;
+ extern void clear_reset_status(unsigned int mask);
+
+-/*
+- * register GPIO as reset generator
++/**
++ * init_gpio_reset() - register GPIO as reset generator
++ *
++ * @gpio - gpio nr
++ * @output - set gpio as out/low instead of input during normal work
+ */
+-extern int init_gpio_reset(int gpio);
++extern int init_gpio_reset(int gpio, int output);
+
+ #endif /* __ASM_ARCH_RESET_H */
+--- a/arch/arm/mach-pxa/reset.c
++++ b/arch/arm/mach-pxa/reset.c
+@@ -20,7 +20,7 @@ static void do_hw_reset(void);
+
+ static int reset_gpio = -1;
+
+-int init_gpio_reset(int gpio)
++int init_gpio_reset(int gpio, int output)
+ {
+ int rc;
+
+@@ -30,9 +30,12 @@ int init_gpio_reset(int gpio)
+ goto out;
+ }
+
+- rc = gpio_direction_input(gpio);
++ if (output)
++ rc = gpio_direction_output(gpio, 0);
++ else
++ rc = gpio_direction_input(gpio);
+ if (rc) {
+- printk(KERN_ERR "Can't configure reset_gpio for input\n");
++ printk(KERN_ERR "Can't configure reset_gpio\n");
+ gpio_free(gpio);
+ goto out;
+ }
+--- a/arch/arm/mach-pxa/spitz.c
++++ b/arch/arm/mach-pxa/spitz.c
+@@ -548,7 +548,7 @@ static void spitz_restart(char mode)
+
+ static void __init common_init(void)
+ {
+- init_gpio_reset(SPITZ_GPIO_ON_RESET);
++ init_gpio_reset(SPITZ_GPIO_ON_RESET, 1);
+ pm_power_off = spitz_poweroff;
+ arm_pm_restart = spitz_restart;
+
+--- a/arch/arm/mach-pxa/tosa.c
++++ b/arch/arm/mach-pxa/tosa.c
+@@ -781,7 +781,7 @@ static void __init tosa_init(void)
+ gpio_set_wake(MFP_PIN_GPIO1, 1);
+ /* We can't pass to gpio-keys since it will drop the Reset altfunc */
+
+- init_gpio_reset(TOSA_GPIO_ON_RESET);
++ init_gpio_reset(TOSA_GPIO_ON_RESET, 0);
+
+ pm_power_off = tosa_poweroff;
+ arm_pm_restart = tosa_restart;
--- /dev/null
+From 2197d18ded232ef6eef63cce57b6b21eddf1b7b6 Mon Sep 17 00:00:00 2001
+From: Andrey Borzenkov <arvidjaar@mail.ru>
+Date: Thu, 6 Nov 2008 12:53:15 -0800
+Subject: cpqarry: fix return value of cpqarray_init()
+
+From: Andrey Borzenkov <arvidjaar@mail.ru>
+
+commit 2197d18ded232ef6eef63cce57b6b21eddf1b7b6 upstream.
+
+As reported by Dick Gevers on Compaq ProLiant:
+
+Oct 13 18:06:51 dvgcpl kernel: Compaq SMART2 Driver (v 2.6.0)
+Oct 13 18:06:51 dvgcpl kernel: sys_init_module: 'cpqarray'->init
+suspiciously returned 1, it should follow 0/-E convention
+Oct 13 18:06:51 dvgcpl kernel: sys_init_module: loading module anyway...
+Oct 13 18:06:51 dvgcpl kernel: Pid: 315, comm: modprobe Not tainted
+2.6.27-desktop-0.rc8.2mnb #1
+Oct 13 18:06:51 dvgcpl kernel: [<c0380612>] ? printk+0x18/0x1e
+Oct 13 18:06:51 dvgcpl kernel: [<c0158f85>] sys_init_module+0x155/0x1c0
+Oct 13 18:06:51 dvgcpl kernel: [<c0103f06>] syscall_call+0x7/0xb
+Oct 13 18:06:51 dvgcpl kernel: =======================
+
+Make it return 0 on success and -ENODEV if no array was found.
+
+Reported-by: Dick Gevers <dvgevers@xs4all.nl>
+Signed-off-by: Andrey Borzenkov <arvidjaar@mail.ru>
+Cc: Jens Axboe <jens.axboe@oracle.com>
+Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
+Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/block/cpqarray.c | 7 ++++++-
+ 1 file changed, 6 insertions(+), 1 deletion(-)
+
+--- a/drivers/block/cpqarray.c
++++ b/drivers/block/cpqarray.c
+@@ -567,7 +567,12 @@ static int __init cpqarray_init(void)
+ num_cntlrs_reg++;
+ }
+
+- return(num_cntlrs_reg);
++ if (num_cntlrs_reg)
++ return 0;
++ else {
++ pci_unregister_driver(&cpqarray_pci_driver);
++ return -ENODEV;
++ }
+ }
+
+ /* Function to find the first free pointer into our hba[] array */
--- /dev/null
+From 14b5433606289dbc5b6fd70ced11462f80e95003 Mon Sep 17 00:00:00 2001
+From: Reinette Chatre <reinette.chatre@intel.com>
+Date: Tue, 4 Nov 2008 12:21:35 -0800
+Subject: iwl3945: do not send scan command if channel count zero
+
+From: Reinette Chatre <reinette.chatre@intel.com>
+
+commit 14b5433606289dbc5b6fd70ced11462f80e95003 upstream.
+
+Do not send scan command if no channels to scan.
+
+This avoids a Microcode error as reported in:
+http://www.intellinuxwireless.org/bugzilla/show_bug.cgi?id=1650
+http://bugzilla.kernel.org/show_bug.cgi?id=11806
+http://marc.info/?l=linux-wireless&m=122437145211886&w=2
+
+Signed-off-by: Reinette Chatre <reinette.chatre@intel.com>
+Signed-off-by: John W. Linville <linville@tuxdriver.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/net/wireless/iwlwifi/iwl3945-base.c | 5 +++++
+ 1 file changed, 5 insertions(+)
+
+--- a/drivers/net/wireless/iwlwifi/iwl3945-base.c
++++ b/drivers/net/wireless/iwlwifi/iwl3945-base.c
+@@ -6259,6 +6259,11 @@ static void iwl3945_bg_request_scan(stru
+ direct_mask,
+ (void *)&scan->data[le16_to_cpu(scan->tx_cmd.len)]);
+
++ if (scan->channel_count == 0) {
++ IWL_DEBUG_SCAN("channel count %d\n", scan->channel_count);
++ goto done;
++ }
++
+ cmd.len += le16_to_cpu(scan->tx_cmd.len) +
+ scan->channel_count * sizeof(struct iwl3945_scan_channel);
+ cmd.data = scan;
--- /dev/null
+From d54bc4e3fc5c56600a13c9ebc0a7e1077ac05d59 Mon Sep 17 00:00:00 2001
+From: Zhu, Yi <yi.zhu@intel.com>
+Date: Tue, 4 Nov 2008 12:21:36 -0800
+Subject: [PATCH] iwl3945: fix deadlock on suspend
+
+From: Zhu Yi <yi.zhu@intel.com>
+
+commit d54bc4e3fc5c56600a13c9ebc0a7e1077ac05d59 upstream.
+
+This patch fixes iwl3945 deadlock during suspend by moving notify_mac out
+of iwl3945 mutex. This is a portion of the same fix for iwlwifi by Tomas.
+
+Signed-off-by: Zhu Yi <yi.zhu@intel.com>
+Signed-off-by: Tomas Winkler <tomas.winkler@intel.com>
+Signed-off-by: Reinette Chatre <reinette.chatre@intel.com>
+Signed-off-by: John W. Linville <linville@tuxdriver.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/net/wireless/iwlwifi/iwl3945-base.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- a/drivers/net/wireless/iwlwifi/iwl3945-base.c
++++ b/drivers/net/wireless/iwlwifi/iwl3945-base.c
+@@ -5761,7 +5761,6 @@ static void iwl3945_alive_start(struct i
+ if (priv->error_recovering)
+ iwl3945_error_recovery(priv);
+
+- ieee80211_notify_mac(priv->hw, IEEE80211_NOTIFY_RE_ASSOC);
+ return;
+
+ restart:
+@@ -6006,6 +6005,7 @@ static void iwl3945_bg_alive_start(struc
+ mutex_lock(&priv->mutex);
+ iwl3945_alive_start(priv);
+ mutex_unlock(&priv->mutex);
++ ieee80211_notify_mac(priv->hw, IEEE80211_NOTIFY_RE_ASSOC);
+ }
+
+ static void iwl3945_bg_rf_kill(struct work_struct *work)
--- /dev/null
+From c90a74bae10dc2a4677d1bd06b6400db229d3e1e Mon Sep 17 00:00:00 2001
+From: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
+Date: Wed, 3 Sep 2008 11:26:50 +0800
+Subject: iwlwifi: allow association on radar channel in power save
+
+From: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
+
+commit c90a74bae10dc2a4677d1bd06b6400db229d3e1e upstream
+
+This patch disables power save upon association and enables it back
+after association. This allows to associate to AP on a radar channel
+if power save is enabled.
+
+Radar and passive channels are not allowed for TX (required for association)
+unless RX is received but PS may close the radio and no RX will be received
+effectively failing association.
+
+Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
+Signed-off-by: Mohamed Abbas <mohamed.abbas@intel.com>
+Signed-off-by: Tomas Winkler <tomas.winkler@intel.com>
+Signed-off-by: Zhu Yi <yi.zhu@intel.com>
+Signed-off-by: John W. Linville <linville@tuxdriver.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/net/wireless/iwlwifi/iwl-agn.c | 24 +++++++++++++++----
+ drivers/net/wireless/iwlwifi/iwl-dev.h | 1
+ drivers/net/wireless/iwlwifi/iwl-power.c | 39 ++++++++++++++++++++++++++++++-
+ drivers/net/wireless/iwlwifi/iwl-power.h | 4 ++-
+ 4 files changed, 61 insertions(+), 7 deletions(-)
+
+--- a/drivers/net/wireless/iwlwifi/iwl-agn.c
++++ b/drivers/net/wireless/iwlwifi/iwl-agn.c
+@@ -2486,6 +2486,7 @@ static void iwl4965_post_associate(struc
+ if (!priv->vif || !priv->is_open)
+ return;
+
++ iwl_power_cancel_timeout(priv);
+ iwl_scan_cancel_timeout(priv, 200);
+
+ conf = ieee80211_get_hw_conf(priv->hw);
+@@ -2550,10 +2551,6 @@ static void iwl4965_post_associate(struc
+ break;
+ }
+
+- /* Enable Rx differential gain and sensitivity calibrations */
+- iwl_chain_noise_reset(priv);
+- priv->start_calib = 1;
+-
+ if (priv->iw_mode == IEEE80211_IF_TYPE_IBSS)
+ priv->assoc_station_added = 1;
+
+@@ -2561,7 +2558,12 @@ static void iwl4965_post_associate(struc
+ iwl_activate_qos(priv, 0);
+ spin_unlock_irqrestore(&priv->lock, flags);
+
+- iwl_power_update_mode(priv, 0);
++ iwl_power_enable_management(priv);
++
++ /* Enable Rx differential gain and sensitivity calibrations */
++ iwl_chain_noise_reset(priv);
++ priv->start_calib = 1;
++
+ /* we have just associated, don't start scan too early */
+ priv->next_scan_jiffies = jiffies + IWL_DELAY_NEXT_SCAN;
+ }
+@@ -3548,6 +3550,16 @@ static void iwl4965_mac_reset_tsf(struct
+ /* Per mac80211.h: This is only used in IBSS mode... */
+ if (priv->iw_mode != IEEE80211_IF_TYPE_IBSS) {
+
++ /* switch to CAM during association period.
++ * the ucode will block any association/authentication
++ * frome during assiciation period if it can not hear
++ * the AP because of PM. the timer enable PM back is
++ * association do not complete
++ */
++ if (priv->hw->conf.channel->flags & (IEEE80211_CHAN_PASSIVE_SCAN |
++ IEEE80211_CHAN_RADAR))
++ iwl_power_disable_management(priv, 3000);
++
+ IWL_DEBUG_MAC80211("leave - not in IBSS\n");
+ mutex_unlock(&priv->mutex);
+ return;
+@@ -4085,6 +4097,7 @@ static void iwl_setup_deferred_work(stru
+ /* FIXME : remove when resolved PENDING */
+ INIT_WORK(&priv->scan_completed, iwl_bg_scan_completed);
+ iwl_setup_scan_deferred_work(priv);
++ iwl_setup_power_deferred_work(priv);
+
+ if (priv->cfg->ops->lib->setup_deferred_work)
+ priv->cfg->ops->lib->setup_deferred_work(priv);
+@@ -4104,6 +4117,7 @@ static void iwl_cancel_deferred_work(str
+
+ cancel_delayed_work_sync(&priv->init_alive_start);
+ cancel_delayed_work(&priv->scan_check);
++ cancel_delayed_work_sync(&priv->set_power_save);
+ cancel_delayed_work(&priv->alive_start);
+ cancel_work_sync(&priv->beacon_update);
+ del_timer_sync(&priv->statistics_periodic);
+--- a/drivers/net/wireless/iwlwifi/iwl-dev.h
++++ b/drivers/net/wireless/iwlwifi/iwl-dev.h
+@@ -1047,6 +1047,7 @@ struct iwl_priv {
+
+ struct tasklet_struct irq_tasklet;
+
++ struct delayed_work set_power_save;
+ struct delayed_work init_alive_start;
+ struct delayed_work alive_start;
+ struct delayed_work scan_check;
+--- a/drivers/net/wireless/iwlwifi/iwl-power.c
++++ b/drivers/net/wireless/iwlwifi/iwl-power.c
+@@ -324,7 +324,7 @@ EXPORT_SYMBOL(iwl_power_update_mode);
+ * this will be usefull for rate scale to disable PM during heavy
+ * Tx/Rx activities
+ */
+-int iwl_power_disable_management(struct iwl_priv *priv)
++int iwl_power_disable_management(struct iwl_priv *priv, u32 ms)
+ {
+ u16 prev_mode;
+ int ret = 0;
+@@ -337,6 +337,11 @@ int iwl_power_disable_management(struct
+ ret = iwl_power_update_mode(priv, 0);
+ priv->power_data.power_disabled = 1;
+ priv->power_data.user_power_setting = prev_mode;
++ cancel_delayed_work(&priv->set_power_save);
++ if (ms)
++ queue_delayed_work(priv->workqueue, &priv->set_power_save,
++ msecs_to_jiffies(ms));
++
+
+ return ret;
+ }
+@@ -431,3 +436,35 @@ int iwl_power_temperature_change(struct
+ return ret;
+ }
+ EXPORT_SYMBOL(iwl_power_temperature_change);
++
++static void iwl_bg_set_power_save(struct work_struct *work)
++{
++ struct iwl_priv *priv = container_of(work,
++ struct iwl_priv, set_power_save.work);
++ IWL_DEBUG(IWL_DL_STATE, "update power\n");
++
++ if (test_bit(STATUS_EXIT_PENDING, &priv->status))
++ return;
++
++ mutex_lock(&priv->mutex);
++
++ /* on starting association we disable power managment
++ * until association, if association failed then this
++ * timer will expire and enable PM again.
++ */
++ if (!iwl_is_associated(priv))
++ iwl_power_enable_management(priv);
++
++ mutex_unlock(&priv->mutex);
++}
++void iwl_setup_power_deferred_work(struct iwl_priv *priv)
++{
++ INIT_DELAYED_WORK(&priv->set_power_save, iwl_bg_set_power_save);
++}
++EXPORT_SYMBOL(iwl_setup_power_deferred_work);
++
++void iwl_power_cancel_timeout(struct iwl_priv *priv)
++{
++ cancel_delayed_work(&priv->set_power_save);
++}
++EXPORT_SYMBOL(iwl_power_cancel_timeout);
+--- a/drivers/net/wireless/iwlwifi/iwl-power.h
++++ b/drivers/net/wireless/iwlwifi/iwl-power.h
+@@ -78,8 +78,10 @@ struct iwl_power_mgr {
+ u8 power_disabled; /* flag to disable using power saving level */
+ };
+
++void iwl_setup_power_deferred_work(struct iwl_priv *priv);
++void iwl_power_cancel_timeout(struct iwl_priv *priv);
+ int iwl_power_update_mode(struct iwl_priv *priv, u8 refresh);
+-int iwl_power_disable_management(struct iwl_priv *priv);
++int iwl_power_disable_management(struct iwl_priv *priv, u32 ms);
+ int iwl_power_enable_management(struct iwl_priv *priv);
+ int iwl_power_set_user_mode(struct iwl_priv *priv, u16 mode);
+ int iwl_power_set_system_mode(struct iwl_priv *priv, u16 mode);
--- /dev/null
+From 681c0050ea3ac2e90c83d5af397d73eed848a372 Mon Sep 17 00:00:00 2001
+From: Ron Rindjunsky <ron.rindjunsky@intel.com>
+Date: Wed, 3 Sep 2008 11:26:25 +0800
+Subject: iwlwifi: allow consecutive scans in unassociated state
+
+From: Ron Rindjunsky <ron.rindjunsky@intel.com>
+
+commit 681c0050ea3ac2e90c83d5af397d73eed848a372 upstream
+
+This patch allows consecutive scans requests when driver is in
+unassociated state.
+
+Signed-off-by: Ron Rindjunsky <ron.rindjunsky@intel.com>
+Signed-off-by: Esti Kummer <ester.kummer@intel.com>
+Signed-off-by: Tomas Winkler <tomas.winkler@intel.com>
+Signed-off-by: Zhu Yi <yi.zhu@intel.com>
+Signed-off-by: John W. Linville <linville@tuxdriver.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/net/wireless/iwlwifi/iwl-agn.c | 8 +++++---
+ 1 file changed, 5 insertions(+), 3 deletions(-)
+
+--- a/drivers/net/wireless/iwlwifi/iwl-agn.c
++++ b/drivers/net/wireless/iwlwifi/iwl-agn.c
+@@ -3214,13 +3214,15 @@ static int iwl4965_mac_hw_scan(struct ie
+
+ /* we don't schedule scan within next_scan_jiffies period */
+ if (priv->next_scan_jiffies &&
+- time_after(priv->next_scan_jiffies, jiffies)) {
++ time_after(priv->next_scan_jiffies, jiffies)) {
++ IWL_DEBUG_SCAN("scan rejected: within next scan period\n");
+ rc = -EAGAIN;
+ goto out_unlock;
+ }
+ /* if we just finished scan ask for delay */
+- if (priv->last_scan_jiffies && time_after(priv->last_scan_jiffies +
+- IWL_DELAY_NEXT_SCAN, jiffies)) {
++ if (iwl_is_associated(priv) && priv->last_scan_jiffies &&
++ time_after(priv->last_scan_jiffies + IWL_DELAY_NEXT_SCAN, jiffies)) {
++ IWL_DEBUG_SCAN("scan rejected: within previous scan period\n");
+ rc = -EAGAIN;
+ goto out_unlock;
+ }
--- /dev/null
+From 8d09a5e1c36d0dec5728e6c8b0bb5412de09b27b Mon Sep 17 00:00:00 2001
+From: Tomas Winkler <tomas.winkler@intel.com>
+Date: Wed, 24 Sep 2008 13:57:46 +0800
+Subject: iwlwifi: don't fail if scan is issued too early
+
+From: Tomas Winkler <tomas.winkler@intel.com>
+
+commit 8d09a5e1c36d0dec5728e6c8b0bb5412de09b27b upstream
+
+This patch returns success and empty scan on scans requests that were
+rejected because issued too early. The cached bss list from previous
+scanning will be returned by mac80211.
+
+Signed-off-by: Tomas Winkler <tomas.winkler@intel.com>
+Signed-off-by: Zhu Yi <yi.zhu@intel.com>
+Signed-off-by: John W. Linville <linville@tuxdriver.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/net/wireless/iwlwifi/iwl-agn.c | 12 +++++++++---
+ drivers/net/wireless/iwlwifi/iwl-scan.c | 8 +-------
+ 2 files changed, 10 insertions(+), 10 deletions(-)
+
+--- a/drivers/net/wireless/iwlwifi/iwl-agn.c
++++ b/drivers/net/wireless/iwlwifi/iwl-agn.c
+@@ -3213,20 +3213,26 @@ static int iwl4965_mac_hw_scan(struct ie
+ goto out_unlock;
+ }
+
+- /* we don't schedule scan within next_scan_jiffies period */
++ /* We don't schedule scan within next_scan_jiffies period.
++ * Avoid scanning during possible EAPOL exchange, return
++ * success immediately.
++ */
+ if (priv->next_scan_jiffies &&
+ time_after(priv->next_scan_jiffies, jiffies)) {
+ IWL_DEBUG_SCAN("scan rejected: within next scan period\n");
+- rc = -EAGAIN;
++ queue_work(priv->workqueue, &priv->scan_completed);
++ rc = 0;
+ goto out_unlock;
+ }
+ /* if we just finished scan ask for delay */
+ if (iwl_is_associated(priv) && priv->last_scan_jiffies &&
+ time_after(priv->last_scan_jiffies + IWL_DELAY_NEXT_SCAN, jiffies)) {
+ IWL_DEBUG_SCAN("scan rejected: within previous scan period\n");
+- rc = -EAGAIN;
++ queue_work(priv->workqueue, &priv->scan_completed);
++ rc = 0;
+ goto out_unlock;
+ }
++
+ if (len) {
+ IWL_DEBUG_SCAN("direct scan for %s [%d]\n ",
+ iwl_escape_essid(ssid, len), (int)len);
+--- a/drivers/net/wireless/iwlwifi/iwl-scan.c
++++ b/drivers/net/wireless/iwlwifi/iwl-scan.c
+@@ -464,11 +464,6 @@ void iwl_init_scan_params(struct iwl_pri
+
+ int iwl_scan_initiate(struct iwl_priv *priv)
+ {
+- if (priv->iw_mode == IEEE80211_IF_TYPE_AP) {
+- IWL_ERROR("APs don't scan.\n");
+- return 0;
+- }
+-
+ if (!iwl_is_ready_rf(priv)) {
+ IWL_DEBUG_SCAN("Aborting scan due to not ready.\n");
+ return -EIO;
+@@ -480,8 +475,7 @@ int iwl_scan_initiate(struct iwl_priv *p
+ }
+
+ if (test_bit(STATUS_SCAN_ABORTING, &priv->status)) {
+- IWL_DEBUG_SCAN("Scan request while abort pending. "
+- "Queuing.\n");
++ IWL_DEBUG_SCAN("Scan request while abort pending\n");
+ return -EAGAIN;
+ }
+
--- /dev/null
+From 10d0bd56966571d0324dfd9bbb8aa913a60bef5f Mon Sep 17 00:00:00 2001
+From: Tomas Winkler <tomas.winkler@intel.com>
+Date: Wed, 29 Oct 2008 01:03:01 +0200
+Subject: iwlwifi: fix suspend to RAM in iwlwifi
+
+From: Tomas Winkler <tomas.winkler@intel.com>
+
+commit 10d0bd56966571d0324dfd9bbb8aa913a60bef5f upstream
+
+This patch fixes suspend to RAM after by moving
+notify_mac out of iwlwifi mutex
+
+http://bugzilla.kernel.org/show_bug.cgi?id=11845
+
+Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
+Signed-off-by: Tomas Winkler <tomas.winkler@intel.com>
+Tested-by: Carlos R. Mafra <crmafra2@gmail.com>
+Tested-by: Christian Borntraeger <borntraeger@de.ibm.com>
+Cc: Rafael J. Wysocki <rjw@sisk.pl>
+Signed-off-by: John W. Linville <linville@tuxdriver.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/net/wireless/iwlwifi/iwl-agn.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- a/drivers/net/wireless/iwlwifi/iwl-agn.c
++++ b/drivers/net/wireless/iwlwifi/iwl-agn.c
+@@ -2090,7 +2090,6 @@ static void iwl_alive_start(struct iwl_p
+ iwl4965_error_recovery(priv);
+
+ iwl_power_update_mode(priv, 1);
+- ieee80211_notify_mac(priv->hw, IEEE80211_NOTIFY_RE_ASSOC);
+
+ if (test_and_clear_bit(STATUS_MODE_PENDING, &priv->status))
+ iwl4965_set_mode(priv, priv->iw_mode);
+@@ -2342,6 +2341,7 @@ static void iwl_bg_alive_start(struct wo
+ mutex_lock(&priv->mutex);
+ iwl_alive_start(priv);
+ mutex_unlock(&priv->mutex);
++ ieee80211_notify_mac(priv->hw, IEEE80211_NOTIFY_RE_ASSOC);
+ }
+
+ static void iwl4965_bg_rf_kill(struct work_struct *work)
--- /dev/null
+From 6e21f2c109edd746a10e08186484bae8168cdd0c Mon Sep 17 00:00:00 2001
+From: Tomas Winkler <tomas.winkler@intel.com>
+Date: Wed, 3 Sep 2008 11:26:37 +0800
+Subject: iwlwifi: generic init calibrations framework
+
+From: Tomas Winkler <tomas.winkler@intel.com>
+
+commit 6e21f2c109edd746a10e08186484bae8168cdd0c upstream
+
+This patch allows variable number of init calibrations and allows
+addition new HW.
+
+This patch also fixes critical bug. Only last calibration result
+was applied. On reception of one calibration result all the calibration
+was freed.
+
+Signed-off-by: Tomas Winkler <tomas.winkler@intel.com>
+Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
+Signed-off-by: Zhu Yi <yi.zhu@intel.com>
+Signed-off-by: John W. Linville <linville@tuxdriver.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/net/wireless/iwlwifi/iwl-5000-hw.h | 7 +++
+ drivers/net/wireless/iwlwifi/iwl-5000.c | 63 ++++-------------------------
+ drivers/net/wireless/iwlwifi/iwl-calib.c | 60 +++++++++++++++++++++++++++
+ drivers/net/wireless/iwlwifi/iwl-core.c | 19 --------
+ drivers/net/wireless/iwlwifi/iwl-core.h | 8 +++
+ drivers/net/wireless/iwlwifi/iwl-dev.h | 14 ++----
+ 6 files changed, 90 insertions(+), 81 deletions(-)
+
+--- a/drivers/net/wireless/iwlwifi/iwl-5000.c
++++ b/drivers/net/wireless/iwlwifi/iwl-5000.c
+@@ -445,48 +445,6 @@ static int iwl5000_send_Xtal_calib(struc
+ sizeof(cal_cmd), &cal_cmd);
+ }
+
+-static int iwl5000_send_calib_results(struct iwl_priv *priv)
+-{
+- int ret = 0;
+-
+- struct iwl_host_cmd hcmd = {
+- .id = REPLY_PHY_CALIBRATION_CMD,
+- .meta.flags = CMD_SIZE_HUGE,
+- };
+-
+- if (priv->calib_results.lo_res) {
+- hcmd.len = priv->calib_results.lo_res_len;
+- hcmd.data = priv->calib_results.lo_res;
+- ret = iwl_send_cmd_sync(priv, &hcmd);
+-
+- if (ret)
+- goto err;
+- }
+-
+- if (priv->calib_results.tx_iq_res) {
+- hcmd.len = priv->calib_results.tx_iq_res_len;
+- hcmd.data = priv->calib_results.tx_iq_res;
+- ret = iwl_send_cmd_sync(priv, &hcmd);
+-
+- if (ret)
+- goto err;
+- }
+-
+- if (priv->calib_results.tx_iq_perd_res) {
+- hcmd.len = priv->calib_results.tx_iq_perd_res_len;
+- hcmd.data = priv->calib_results.tx_iq_perd_res;
+- ret = iwl_send_cmd_sync(priv, &hcmd);
+-
+- if (ret)
+- goto err;
+- }
+-
+- return 0;
+-err:
+- IWL_ERROR("Error %d\n", ret);
+- return ret;
+-}
+-
+ static int iwl5000_send_calib_cfg(struct iwl_priv *priv)
+ {
+ struct iwl5000_calib_cfg_cmd calib_cfg_cmd;
+@@ -511,33 +469,30 @@ static void iwl5000_rx_calib_result(stru
+ struct iwl_rx_packet *pkt = (void *)rxb->skb->data;
+ struct iwl5000_calib_hdr *hdr = (struct iwl5000_calib_hdr *)pkt->u.raw;
+ int len = le32_to_cpu(pkt->len) & FH_RSCSR_FRAME_SIZE_MSK;
+-
+- iwl_free_calib_results(priv);
++ int index;
+
+ /* reduce the size of the length field itself */
+ len -= 4;
+
++ /* Define the order in which the results will be sent to the runtime
++ * uCode. iwl_send_calib_results sends them in a row according to their
++ * index. We sort them here */
+ switch (hdr->op_code) {
+ case IWL5000_PHY_CALIBRATE_LO_CMD:
+- priv->calib_results.lo_res = kzalloc(len, GFP_ATOMIC);
+- priv->calib_results.lo_res_len = len;
+- memcpy(priv->calib_results.lo_res, pkt->u.raw, len);
++ index = IWL5000_CALIB_LO;
+ break;
+ case IWL5000_PHY_CALIBRATE_TX_IQ_CMD:
+- priv->calib_results.tx_iq_res = kzalloc(len, GFP_ATOMIC);
+- priv->calib_results.tx_iq_res_len = len;
+- memcpy(priv->calib_results.tx_iq_res, pkt->u.raw, len);
++ index = IWL5000_CALIB_TX_IQ;
+ break;
+ case IWL5000_PHY_CALIBRATE_TX_IQ_PERD_CMD:
+- priv->calib_results.tx_iq_perd_res = kzalloc(len, GFP_ATOMIC);
+- priv->calib_results.tx_iq_perd_res_len = len;
+- memcpy(priv->calib_results.tx_iq_perd_res, pkt->u.raw, len);
++ index = IWL5000_CALIB_TX_IQ_PERD;
+ break;
+ default:
+ IWL_ERROR("Unknown calibration notification %d\n",
+ hdr->op_code);
+ return;
+ }
++ iwl_calib_set(&priv->calib_results[index], pkt->u.raw, len);
+ }
+
+ static void iwl5000_rx_calib_complete(struct iwl_priv *priv,
+@@ -832,7 +787,7 @@ static int iwl5000_alive_notify(struct i
+ iwl5000_send_Xtal_calib(priv);
+
+ if (priv->ucode_type == UCODE_RT)
+- iwl5000_send_calib_results(priv);
++ iwl_send_calib_results(priv);
+
+ return 0;
+ }
+--- a/drivers/net/wireless/iwlwifi/iwl-5000-hw.h
++++ b/drivers/net/wireless/iwlwifi/iwl-5000-hw.h
+@@ -129,6 +129,13 @@ struct iwl5000_shared {
+ __le32 padding2;
+ } __attribute__ ((packed));
+
++/* calibrations defined for 5000 */
++/* defines the order in which results should be sent to the runtime uCode */
++enum iwl5000_calib {
++ IWL5000_CALIB_LO,
++ IWL5000_CALIB_TX_IQ,
++ IWL5000_CALIB_TX_IQ_PERD,
++};
+
+ #endif /* __iwl_5000_hw_h__ */
+
+--- a/drivers/net/wireless/iwlwifi/iwl-calib.c
++++ b/drivers/net/wireless/iwlwifi/iwl-calib.c
+@@ -66,6 +66,66 @@
+ #include "iwl-core.h"
+ #include "iwl-calib.h"
+
++/*****************************************************************************
++ * INIT calibrations framework
++ *****************************************************************************/
++
++ int iwl_send_calib_results(struct iwl_priv *priv)
++{
++ int ret = 0;
++ int i = 0;
++
++ struct iwl_host_cmd hcmd = {
++ .id = REPLY_PHY_CALIBRATION_CMD,
++ .meta.flags = CMD_SIZE_HUGE,
++ };
++
++ for (i = 0; i < IWL_CALIB_MAX; i++)
++ if (priv->calib_results[i].buf) {
++ hcmd.len = priv->calib_results[i].buf_len;
++ hcmd.data = priv->calib_results[i].buf;
++ ret = iwl_send_cmd_sync(priv, &hcmd);
++ if (ret)
++ goto err;
++ }
++
++ return 0;
++err:
++ IWL_ERROR("Error %d iteration %d\n", ret, i);
++ return ret;
++}
++EXPORT_SYMBOL(iwl_send_calib_results);
++
++int iwl_calib_set(struct iwl_calib_result *res, const u8 *buf, int len)
++{
++ if (res->buf_len != len) {
++ kfree(res->buf);
++ res->buf = kzalloc(len, GFP_ATOMIC);
++ }
++ if (unlikely(res->buf == NULL))
++ return -ENOMEM;
++
++ res->buf_len = len;
++ memcpy(res->buf, buf, len);
++ return 0;
++}
++EXPORT_SYMBOL(iwl_calib_set);
++
++void iwl_calib_free_results(struct iwl_priv *priv)
++{
++ int i;
++
++ for (i = 0; i < IWL_CALIB_MAX; i++) {
++ kfree(priv->calib_results[i].buf);
++ priv->calib_results[i].buf = NULL;
++ priv->calib_results[i].buf_len = 0;
++ }
++}
++
++/*****************************************************************************
++ * RUNTIME calibrations framework
++ *****************************************************************************/
++
+ /* "false alarms" are signals that our DSP tries to lock onto,
+ * but then determines that they are either noise, or transmissions
+ * from a distant wireless network (also "noise", really) that get
+--- a/drivers/net/wireless/iwlwifi/iwl-core.c
++++ b/drivers/net/wireless/iwlwifi/iwl-core.c
+@@ -956,22 +956,6 @@ err:
+ }
+ EXPORT_SYMBOL(iwl_init_drv);
+
+-void iwl_free_calib_results(struct iwl_priv *priv)
+-{
+- kfree(priv->calib_results.lo_res);
+- priv->calib_results.lo_res = NULL;
+- priv->calib_results.lo_res_len = 0;
+-
+- kfree(priv->calib_results.tx_iq_res);
+- priv->calib_results.tx_iq_res = NULL;
+- priv->calib_results.tx_iq_res_len = 0;
+-
+- kfree(priv->calib_results.tx_iq_perd_res);
+- priv->calib_results.tx_iq_perd_res = NULL;
+- priv->calib_results.tx_iq_perd_res_len = 0;
+-}
+-EXPORT_SYMBOL(iwl_free_calib_results);
+-
+ int iwl_set_tx_power(struct iwl_priv *priv, s8 tx_power, bool force)
+ {
+ int ret = 0;
+@@ -999,10 +983,9 @@ int iwl_set_tx_power(struct iwl_priv *pr
+ }
+ EXPORT_SYMBOL(iwl_set_tx_power);
+
+-
+ void iwl_uninit_drv(struct iwl_priv *priv)
+ {
+- iwl_free_calib_results(priv);
++ iwl_calib_free_results(priv);
+ iwlcore_free_geos(priv);
+ iwl_free_channel_map(priv);
+ kfree(priv->scan);
+--- a/drivers/net/wireless/iwlwifi/iwl-core.h
++++ b/drivers/net/wireless/iwlwifi/iwl-core.h
+@@ -186,7 +186,6 @@ struct ieee80211_hw *iwl_alloc_all(struc
+ void iwl_hw_detect(struct iwl_priv *priv);
+
+ void iwl_clear_stations_table(struct iwl_priv *priv);
+-void iwl_free_calib_results(struct iwl_priv *priv);
+ void iwl_reset_qos(struct iwl_priv *priv);
+ void iwl_set_rxon_chain(struct iwl_priv *priv);
+ int iwl_set_rxon_channel(struct iwl_priv *priv,
+@@ -291,6 +290,13 @@ int iwl_scan_initiate(struct iwl_priv *p
+ void iwl_setup_rx_scan_handlers(struct iwl_priv *priv);
+ void iwl_setup_scan_deferred_work(struct iwl_priv *priv);
+
++/*******************************************************************************
++ * Calibrations - implemented in iwl-calib.c
++ ******************************************************************************/
++int iwl_send_calib_results(struct iwl_priv *priv);
++int iwl_calib_set(struct iwl_calib_result *res, const u8 *buf, int len);
++void iwl_calib_free_results(struct iwl_priv *priv);
++
+ /*****************************************************
+ * S e n d i n g H o s t C o m m a n d s *
+ *****************************************************/
+--- a/drivers/net/wireless/iwlwifi/iwl-dev.h
++++ b/drivers/net/wireless/iwlwifi/iwl-dev.h
+@@ -745,13 +745,10 @@ struct statistics_general_data {
+ u32 beacon_energy_c;
+ };
+
+-struct iwl_calib_results {
+- void *tx_iq_res;
+- void *tx_iq_perd_res;
+- void *lo_res;
+- u32 tx_iq_res_len;
+- u32 tx_iq_perd_res_len;
+- u32 lo_res_len;
++/* Opaque calibration results */
++struct iwl_calib_result {
++ void *buf;
++ size_t buf_len;
+ };
+
+ enum ucode_type {
+@@ -813,6 +810,7 @@ enum {
+
+
+ #define IWL_MAX_NUM_QUEUES 20 /* FIXME: do dynamic allocation */
++#define IWL_CALIB_MAX 3
+
+ struct iwl_priv {
+
+@@ -857,7 +855,7 @@ struct iwl_priv {
+ s32 last_temperature;
+
+ /* init calibration results */
+- struct iwl_calib_results calib_results;
++ struct iwl_calib_result calib_results[IWL_CALIB_MAX];
+
+ /* Scan related variables */
+ unsigned long last_scan_jiffies;
--- /dev/null
+From 42eb7c644afcdbcd7eac4d862046230856fbf531 Mon Sep 17 00:00:00 2001
+From: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
+Date: Wed, 17 Sep 2008 10:10:05 +0800
+Subject: iwlwifi: remove HT flags from RXON when not in HT anymore
+
+From: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
+
+commit 42eb7c644afcdbcd7eac4d862046230856fbf531 upstream.
+
+This patch removes the HT flags from RXON when moving from HT to legacy.
+This avoids keeping those flags set and possibly miss configuring firmware.
+
+If we are configured in HT, fat channel: channel 1 above, and move later
+to legacy channel 11, we need to clear the FAT channel control flags in
+RXON. If we don't, the firmware will understand this as channel 11 above
+which is not possible due to regulatory constraints, leading to firmware
+crash.
+
+Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
+Reviewed-by: Tomas Winkler <tomas.winkler@intel.com>
+Signed-off-by: Zhu Yi <yi.zhu@intel.com>
+Signed-off-by: John W. Linville <linville@tuxdriver.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/net/wireless/iwlwifi/iwl-agn.c | 3 +--
+ drivers/net/wireless/iwlwifi/iwl-core.c | 8 +++++++-
+ 2 files changed, 8 insertions(+), 3 deletions(-)
+
+--- a/drivers/net/wireless/iwlwifi/iwl-agn.c
++++ b/drivers/net/wireless/iwlwifi/iwl-agn.c
+@@ -2504,8 +2504,7 @@ static void iwl4965_post_associate(struc
+
+ priv->staging_rxon.filter_flags |= RXON_FILTER_ASSOC_MSK;
+
+- if (priv->current_ht_config.is_ht)
+- iwl_set_rxon_ht(priv, &priv->current_ht_config);
++ iwl_set_rxon_ht(priv, &priv->current_ht_config);
+
+ iwl_set_rxon_chain(priv);
+ priv->staging_rxon.assoc_id = cpu_to_le16(priv->assoc_id);
+--- a/drivers/net/wireless/iwlwifi/iwl-core.c
++++ b/drivers/net/wireless/iwlwifi/iwl-core.c
+@@ -646,8 +646,14 @@ void iwl_set_rxon_ht(struct iwl_priv *pr
+ struct iwl_rxon_cmd *rxon = &priv->staging_rxon;
+ u32 val;
+
+- if (!ht_info->is_ht)
++ if (!ht_info->is_ht) {
++ rxon->flags &= ~(RXON_FLG_CHANNEL_MODE_MIXED_MSK |
++ RXON_FLG_CHANNEL_MODE_PURE_40_MSK |
++ RXON_FLG_CTRL_CHANNEL_LOC_HI_MSK |
++ RXON_FLG_FAT_PROT_MSK |
++ RXON_FLG_HT_PROT_MSK);
+ return;
++ }
+
+ /* Set up channel bandwidth: 20 MHz only, or 20/40 mixed if fat ok */
+ if (iwl_is_fat_tx_allowed(priv, NULL))
--- /dev/null
+From 093d874c02e8d3091aa38596faf0ff2bfd4f0ceb Mon Sep 17 00:00:00 2001
+From: Tomas Winkler <tomas.winkler@intel.com>
+Date: Fri, 26 Sep 2008 15:09:34 +0800
+Subject: iwlwifi: use correct DMA_MASK
+
+From: Tomas Winkler <tomas.winkler@intel.com>
+
+commit 093d874c02e8d3091aa38596faf0ff2bfd4f0ceb upstream
+
+Use correct DMA_MASK: 4964 and 5000 support 36 bit addresses for
+pci express memory access.
+
+Signed-off-by: Tomas Winkler <tomas.winkler@intel.com>
+Signed-off-by: Zhu Yi <yi.zhu@intel.com>
+Signed-off-by: John W. Linville <linville@tuxdriver.com>
+
+---
+ drivers/net/wireless/iwlwifi/iwl-agn.c | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+--- a/drivers/net/wireless/iwlwifi/iwl-agn.c
++++ b/drivers/net/wireless/iwlwifi/iwl-agn.c
+@@ -4225,13 +4225,13 @@ static int iwl4965_pci_probe(struct pci_
+
+ pci_set_master(pdev);
+
+- err = pci_set_dma_mask(pdev, DMA_64BIT_MASK);
++ err = pci_set_dma_mask(pdev, DMA_BIT_MASK(36));
+ if (!err)
+- err = pci_set_consistent_dma_mask(pdev, DMA_64BIT_MASK);
++ err = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(36));
+ if (err) {
+- err = pci_set_dma_mask(pdev, DMA_32BIT_MASK);
++ err = pci_set_dma_mask(pdev, DMA_BIT_MASK(32));
+ if (!err)
+- err = pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK);
++ err = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(32));
+ /* both attempts failed: */
+ if (err) {
+ printk(KERN_WARNING "%s: No suitable DMA available.\n",
hwmon-applesmc-add-support-for-macbook-5.patch
hwmon-applesmc-add-support-for-macbook-pro-5.patch
hwmon-applesmc-add-support-for-imac-8.patch
+iwlwifi-allow-consecutive-scans-in-unassociated-state.patch
+iwlwifi-allow-association-on-radar-channel-in-power-save.patch
+iwlwifi-remove-ht-flags-from-rxon-when-not-in-ht-anymore.patch
+iwlwifi-don-t-fail-if-scan-is-issued-too-early.patch
+iwlwifi-use-correct-dma_mask.patch
+iwlwifi-fix-suspend-to-ram-in-iwlwifi.patch
+iwlwifi-generic-init-calibrations-framework.patch
+zd1211rw-add-2-device-ids.patch
+iwl3945-fix-deadlock-on-suspend.patch
+iwl3945-do-not-send-scan-command-if-channel-count-zero.patch
+cpqarry-fix-return-value-of-cpqarray_init.patch
+acpi-dock-avoid-check-_sta-method.patch
+arm-5300-1-fixup-spitz-reset-during-boot.patch
--- /dev/null
+From 0feec9dfe7b8880ab3b4c38d7cc4107dd706ea7f Mon Sep 17 00:00:00 2001
+From: Daniel Drake <dsd@gentoo.org>
+Date: Sat, 1 Nov 2008 17:03:48 +0000
+Subject: zd1211rw: Add 2 device IDs
+
+From: Daniel Drake <dsd@gentoo.org>
+
+commit 0feec9dfe7b8880ab3b4c38d7cc4107dd706ea7f upstream.
+
+07fa/1196
+Bewan BWIFI-USB54AR: Tested by night1308, this device is a ZD1211B with
+an AL2230S radio.
+
+0ace/b215
+HP 802.11abg: Tested by Robert Philippe
+
+Signed-off-by: John W. Linville <linville@tuxdriver.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/net/wireless/zd1211rw/zd_usb.c | 2 ++
+ 1 file changed, 2 insertions(+)
+
+--- a/drivers/net/wireless/zd1211rw/zd_usb.c
++++ b/drivers/net/wireless/zd1211rw/zd_usb.c
+@@ -61,6 +61,7 @@ static struct usb_device_id usb_ids[] =
+ { USB_DEVICE(0x0105, 0x145f), .driver_info = DEVICE_ZD1211 },
+ /* ZD1211B */
+ { USB_DEVICE(0x0ace, 0x1215), .driver_info = DEVICE_ZD1211B },
++ { USB_DEVICE(0x0ace, 0xb215), .driver_info = DEVICE_ZD1211B },
+ { USB_DEVICE(0x157e, 0x300d), .driver_info = DEVICE_ZD1211B },
+ { USB_DEVICE(0x079b, 0x0062), .driver_info = DEVICE_ZD1211B },
+ { USB_DEVICE(0x1582, 0x6003), .driver_info = DEVICE_ZD1211B },
+@@ -82,6 +83,7 @@ static struct usb_device_id usb_ids[] =
+ { USB_DEVICE(0x0cde, 0x001a), .driver_info = DEVICE_ZD1211B },
+ { USB_DEVICE(0x0586, 0x340a), .driver_info = DEVICE_ZD1211B },
+ { USB_DEVICE(0x0471, 0x1237), .driver_info = DEVICE_ZD1211B },
++ { USB_DEVICE(0x07fa, 0x1196), .driver_info = DEVICE_ZD1211B },
+ /* "Driverless" devices that need ejecting */
+ { USB_DEVICE(0x0ace, 0x2011), .driver_info = DEVICE_INSTALLER },
+ { USB_DEVICE(0x0ace, 0x20ff), .driver_info = DEVICE_INSTALLER },