]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
more .27 patches
authorGreg Kroah-Hartman <gregkh@suse.de>
Tue, 11 Nov 2008 20:13:37 +0000 (12:13 -0800)
committerGreg Kroah-Hartman <gregkh@suse.de>
Tue, 11 Nov 2008 20:13:37 +0000 (12:13 -0800)
14 files changed:
queue-2.6.27/acpi-dock-avoid-check-_sta-method.patch [new file with mode: 0644]
queue-2.6.27/arm-5300-1-fixup-spitz-reset-during-boot.patch [new file with mode: 0644]
queue-2.6.27/cpqarry-fix-return-value-of-cpqarray_init.patch [new file with mode: 0644]
queue-2.6.27/iwl3945-do-not-send-scan-command-if-channel-count-zero.patch [new file with mode: 0644]
queue-2.6.27/iwl3945-fix-deadlock-on-suspend.patch [new file with mode: 0644]
queue-2.6.27/iwlwifi-allow-association-on-radar-channel-in-power-save.patch [new file with mode: 0644]
queue-2.6.27/iwlwifi-allow-consecutive-scans-in-unassociated-state.patch [new file with mode: 0644]
queue-2.6.27/iwlwifi-don-t-fail-if-scan-is-issued-too-early.patch [new file with mode: 0644]
queue-2.6.27/iwlwifi-fix-suspend-to-ram-in-iwlwifi.patch [new file with mode: 0644]
queue-2.6.27/iwlwifi-generic-init-calibrations-framework.patch [new file with mode: 0644]
queue-2.6.27/iwlwifi-remove-ht-flags-from-rxon-when-not-in-ht-anymore.patch [new file with mode: 0644]
queue-2.6.27/iwlwifi-use-correct-dma_mask.patch [new file with mode: 0644]
queue-2.6.27/series
queue-2.6.27/zd1211rw-add-2-device-ids.patch [new file with mode: 0644]

diff --git a/queue-2.6.27/acpi-dock-avoid-check-_sta-method.patch b/queue-2.6.27/acpi-dock-avoid-check-_sta-method.patch
new file mode 100644 (file)
index 0000000..f9d80bf
--- /dev/null
@@ -0,0 +1,45 @@
+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,
diff --git a/queue-2.6.27/arm-5300-1-fixup-spitz-reset-during-boot.patch b/queue-2.6.27/arm-5300-1-fixup-spitz-reset-during-boot.patch
new file mode 100644 (file)
index 0000000..24638f0
--- /dev/null
@@ -0,0 +1,94 @@
+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;
diff --git a/queue-2.6.27/cpqarry-fix-return-value-of-cpqarray_init.patch b/queue-2.6.27/cpqarry-fix-return-value-of-cpqarray_init.patch
new file mode 100644 (file)
index 0000000..b8fb68c
--- /dev/null
@@ -0,0 +1,51 @@
+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 */
diff --git a/queue-2.6.27/iwl3945-do-not-send-scan-command-if-channel-count-zero.patch b/queue-2.6.27/iwl3945-do-not-send-scan-command-if-channel-count-zero.patch
new file mode 100644 (file)
index 0000000..7f7fd11
--- /dev/null
@@ -0,0 +1,38 @@
+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;
diff --git a/queue-2.6.27/iwl3945-fix-deadlock-on-suspend.patch b/queue-2.6.27/iwl3945-fix-deadlock-on-suspend.patch
new file mode 100644 (file)
index 0000000..2339deb
--- /dev/null
@@ -0,0 +1,40 @@
+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)
diff --git a/queue-2.6.27/iwlwifi-allow-association-on-radar-channel-in-power-save.patch b/queue-2.6.27/iwlwifi-allow-association-on-radar-channel-in-power-save.patch
new file mode 100644 (file)
index 0000000..e97e205
--- /dev/null
@@ -0,0 +1,182 @@
+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);
diff --git a/queue-2.6.27/iwlwifi-allow-consecutive-scans-in-unassociated-state.patch b/queue-2.6.27/iwlwifi-allow-consecutive-scans-in-unassociated-state.patch
new file mode 100644 (file)
index 0000000..6520f54
--- /dev/null
@@ -0,0 +1,44 @@
+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;
+       }
diff --git a/queue-2.6.27/iwlwifi-don-t-fail-if-scan-is-issued-too-early.patch b/queue-2.6.27/iwlwifi-don-t-fail-if-scan-is-issued-too-early.patch
new file mode 100644 (file)
index 0000000..74d3252
--- /dev/null
@@ -0,0 +1,79 @@
+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;
+       }
diff --git a/queue-2.6.27/iwlwifi-fix-suspend-to-ram-in-iwlwifi.patch b/queue-2.6.27/iwlwifi-fix-suspend-to-ram-in-iwlwifi.patch
new file mode 100644 (file)
index 0000000..08b68d5
--- /dev/null
@@ -0,0 +1,44 @@
+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)
diff --git a/queue-2.6.27/iwlwifi-generic-init-calibrations-framework.patch b/queue-2.6.27/iwlwifi-generic-init-calibrations-framework.patch
new file mode 100644 (file)
index 0000000..8ea9c87
--- /dev/null
@@ -0,0 +1,316 @@
+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;
diff --git a/queue-2.6.27/iwlwifi-remove-ht-flags-from-rxon-when-not-in-ht-anymore.patch b/queue-2.6.27/iwlwifi-remove-ht-flags-from-rxon-when-not-in-ht-anymore.patch
new file mode 100644 (file)
index 0000000..463f343
--- /dev/null
@@ -0,0 +1,59 @@
+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))
diff --git a/queue-2.6.27/iwlwifi-use-correct-dma_mask.patch b/queue-2.6.27/iwlwifi-use-correct-dma_mask.patch
new file mode 100644 (file)
index 0000000..6542fe0
--- /dev/null
@@ -0,0 +1,40 @@
+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",
index 6bff131e65531b86597d54d0ca16e3968c345b02..1baa0c14b15bdc5920502910094380265a26f2fe 100644 (file)
@@ -31,3 +31,16 @@ hwmon-applesmc-add-support-for-imac-5.patch
 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
diff --git a/queue-2.6.27/zd1211rw-add-2-device-ids.patch b/queue-2.6.27/zd1211rw-add-2-device-ids.patch
new file mode 100644 (file)
index 0000000..cd589b7
--- /dev/null
@@ -0,0 +1,41 @@
+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 },