--- /dev/null
+From 3a4c6800f31ea8395628af5e7e490270ee5d0585 Mon Sep 17 00:00:00 2001
+From: Nick Piggin <npiggin@suse.de>
+Date: Thu, 12 Feb 2009 04:34:23 +0100
+Subject: Fix page writeback thinko, causing Berkeley DB slowdown
+
+From: Nick Piggin <npiggin@suse.de>
+
+commit 3a4c6800f31ea8395628af5e7e490270ee5d0585 upstream.
+
+A bug was introduced into write_cache_pages cyclic writeout by commit
+31a12666d8f0c22235297e1c1575f82061480029 ("mm: write_cache_pages cyclic
+fix"). The intention (and comments) is that we should cycle back and
+look for more dirty pages at the beginning of the file if there is no
+more work to be done.
+
+But the !done condition was dropped from the test. This means that any
+time the page writeout loop breaks (eg. due to nr_to_write == 0), we
+will set index to 0, then goto again. This will set done_index to
+index, then find done is set, so will proceed to the end of the
+function. When updating mapping->writeback_index for cyclic writeout,
+we now use done_index == 0, so we're always cycling back to 0.
+
+This seemed to be causing random mmap writes (slapadd and iozone) to
+start writing more pages from the LRU and writeout would slowdown, and
+caused bugzilla entry
+
+ http://bugzilla.kernel.org/show_bug.cgi?id=12604
+
+about Berkeley DB slowing down dramatically.
+
+With this patch, iozone random write performance is increased nearly
+5x on my system (iozone -B -r 4k -s 64k -s 512m -s 1200m on ext2).
+
+Signed-off-by: Nick Piggin <npiggin@suse.de>
+Reported-and-tested-by: Jan Kara <jack@suse.cz>
+Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ mm/page-writeback.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- a/mm/page-writeback.c
++++ b/mm/page-writeback.c
+@@ -1001,7 +1001,7 @@ continue_unlock:
+ pagevec_release(&pvec);
+ cond_resched();
+ }
+- if (!cycled) {
++ if (!cycled && !done) {
+ /*
+ * range_cyclic:
+ * We hit the last page and there is more work to be done: wrap
--- /dev/null
+From d588be6bae40f7965f1b681a4dbc3254411787b9 Mon Sep 17 00:00:00 2001
+From: Tomas Winkler <tomas.winkler@intel.com>
+Date: Mon, 6 Oct 2008 16:05:29 +0800
+Subject: iwlwifi: scan correct setting of valid rx_chains
+
+From: Tomas Winkler <tomas.winkler@intel.com>
+
+commit d588be6bae40f7965f1b681a4dbc3254411787b9 upstream.
+
+This patch sets rx_chain bitmap correctly according hw configuration.
+
+Signed-off-by: Tomas Winkler <tomas.winkler@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-scan.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- a/drivers/net/wireless/iwlwifi/iwl-scan.c
++++ b/drivers/net/wireless/iwlwifi/iwl-scan.c
+@@ -704,7 +704,7 @@ static void iwl_bg_request_scan(struct w
+ u16 cmd_len;
+ enum ieee80211_band band;
+ u8 n_probes = 2;
+- u8 rx_chain = 0x7; /* bitmap: ABC chains */
++ u8 rx_chain = priv->hw_params.valid_rx_ant;
+
+ conf = ieee80211_get_hw_conf(priv->hw);
+
--- /dev/null
+From b4870bc5ee8c7a37541a3eb1208b5c76c13a078a Mon Sep 17 00:00:00 2001
+From: Randy Dunlap <randy.dunlap@oracle.com>
+Date: Wed, 11 Feb 2009 13:04:33 -0800
+Subject: kernel-doc: fix syscall wrapper processing
+
+From: Randy Dunlap <randy.dunlap@oracle.com>
+
+commit b4870bc5ee8c7a37541a3eb1208b5c76c13a078a upstream.
+
+Fix kernel-doc processing of SYSCALL wrappers.
+
+The SYSCALL wrapper patches played havoc with kernel-doc for
+syscalls. Syscalls that were scanned for DocBook processing
+reported warnings like this one, for sys_tgkill:
+
+Warning(kernel/signal.c:2285): No description found for parameter 'tgkill'
+Warning(kernel/signal.c:2285): No description found for parameter 'pid_t'
+Warning(kernel/signal.c:2285): No description found for parameter 'int'
+
+because the macro parameters all "look like" function parameters,
+although they are not:
+
+/**
+ * sys_tgkill - send signal to one specific thread
+ * @tgid: the thread group ID of the thread
+ * @pid: the PID of the thread
+ * @sig: signal to be sent
+ *
+ * This syscall also checks the @tgid and returns -ESRCH even if the PID
+ * exists but it's not belonging to the target process anymore. This
+ * method solves the problem of threads exiting and PIDs getting reused.
+ */
+SYSCALL_DEFINE3(tgkill, pid_t, tgid, pid_t, pid, int, sig)
+{
+...
+
+This patch special-cases the handling SYSCALL_DEFINE* function
+prototypes by expanding them to
+ long sys_foobar(type1 arg1, type1 arg2, ...)
+
+Signed-off-by: Randy Dunlap <randy.dunlap@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>
+
+---
+ scripts/kernel-doc | 39 ++++++++++++++++++++++++++++++++++++++-
+ 1 file changed, 38 insertions(+), 1 deletion(-)
+
+--- a/scripts/kernel-doc
++++ b/scripts/kernel-doc
+@@ -1758,6 +1758,40 @@ sub reset_state {
+ $state = 0;
+ }
+
++sub syscall_munge() {
++ my $void = 0;
++
++ $prototype =~ s@[\r\n\t]+@ @gos; # strip newlines/CR's/tabs
++## if ($prototype =~ m/SYSCALL_DEFINE0\s*\(\s*(a-zA-Z0-9_)*\s*\)/) {
++ if ($prototype =~ m/SYSCALL_DEFINE0/) {
++ $void = 1;
++## $prototype = "long sys_$1(void)";
++ }
++
++ $prototype =~ s/SYSCALL_DEFINE.*\(/long sys_/; # fix return type & func name
++ if ($prototype =~ m/long (sys_.*?),/) {
++ $prototype =~ s/,/\(/;
++ } elsif ($void) {
++ $prototype =~ s/\)/\(void\)/;
++ }
++
++ # now delete all of the odd-number commas in $prototype
++ # so that arg types & arg names don't have a comma between them
++ my $count = 0;
++ my $len = length($prototype);
++ if ($void) {
++ $len = 0; # skip the for-loop
++ }
++ for (my $ix = 0; $ix < $len; $ix++) {
++ if (substr($prototype, $ix, 1) eq ',') {
++ $count++;
++ if ($count % 2 == 1) {
++ substr($prototype, $ix, 1) = ' ';
++ }
++ }
++ }
++}
++
+ sub process_state3_function($$) {
+ my $x = shift;
+ my $file = shift;
+@@ -1774,7 +1808,10 @@ sub process_state3_function($$) {
+ $prototype =~ s@/\*.*?\*/@@gos; # strip comments.
+ $prototype =~ s@[\r\n]+@ @gos; # strip newlines/cr's.
+ $prototype =~ s@^\s+@@gos; # strip leading spaces
+- dump_function($prototype,$file);
++ if ($prototype =~ /SYSCALL_DEFINE/) {
++ syscall_munge();
++ }
++ dump_function($prototype, $file);
+ reset_state();
+ }
+ }
--- /dev/null
+From 9d9b87c1218be78ddecbc85ec3bb91c79c1d56ab Mon Sep 17 00:00:00 2001
+From: J. Bruce Fields <bfields@citi.umich.edu>
+Date: Wed, 4 Feb 2009 17:35:38 -0500
+Subject: lockd: fix regression in lockd's handling of blocked locks
+
+From: J. Bruce Fields <bfields@citi.umich.edu>
+
+commit 9d9b87c1218be78ddecbc85ec3bb91c79c1d56ab upstream.
+
+If a client requests a blocking lock, is denied, then requests it again,
+then here in nlmsvc_lock() we will call vfs_lock_file() without FL_SLEEP
+set, because we've already queued a block and don't need the locks code
+to do it again.
+
+But that means vfs_lock_file() will return -EAGAIN instead of
+FILE_LOCK_DENIED. So we still need to translate that -EAGAIN return
+into a nlm_lck_blocked error in this case, and put ourselves back on
+lockd's block list.
+
+The bug was introduced by bde74e4bc64415b1 "locks: add special return
+value for asynchronous locks".
+
+Thanks to Frank van Maarseveen for the report; his original test
+case was essentially
+
+ for i in `seq 30`; do flock /nfsmount/foo sleep 10 & done
+
+Tested-by: Frank van Maarseveen <frankvm@frankvm.com>
+Reported-by: Frank van Maarseveen <frankvm@frankvm.com>
+Cc: Miklos Szeredi <mszeredi@suse.cz>
+Signed-off-by: J. Bruce Fields <bfields@citi.umich.edu>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ fs/lockd/svclock.c | 6 +++++-
+ 1 file changed, 5 insertions(+), 1 deletion(-)
+
+--- a/fs/lockd/svclock.c
++++ b/fs/lockd/svclock.c
+@@ -418,7 +418,7 @@ nlmsvc_lock(struct svc_rqst *rqstp, stru
+ goto out;
+ case -EAGAIN:
+ ret = nlm_lck_denied;
+- goto out;
++ break;
+ case FILE_LOCK_DEFERRED:
+ if (wait)
+ break;
+@@ -434,6 +434,10 @@ nlmsvc_lock(struct svc_rqst *rqstp, stru
+ goto out;
+ }
+
++ ret = nlm_lck_denied;
++ if (!wait)
++ goto out;
++
+ ret = nlm_lck_blocked;
+
+ /* Append to list of blocked */
--- /dev/null
+From 4d48a542b42747c36a5937447d9c3de7c897ea50 Mon Sep 17 00:00:00 2001
+From: Paul Clements <paul.clements@steeleye.com>
+Date: Wed, 11 Feb 2009 13:04:45 -0800
+Subject: nbd: fix I/O hang on disconnected nbds
+
+From: Paul Clements <paul.clements@steeleye.com>
+
+commit 4d48a542b42747c36a5937447d9c3de7c897ea50 upstream.
+
+Fix a problem that causes I/O to a disconnected (or partially initialized)
+nbd device to hang indefinitely. To reproduce:
+
+# ioctl NBD_SET_SIZE_BLOCKS /dev/nbd23 514048
+# dd if=/dev/nbd23 of=/dev/null bs=4096 count=1
+
+...hangs...
+
+This can also occur when an nbd device loses its nbd-client/server
+connection. Although we clear the queue of any outstanding I/Os after the
+client/server connection fails, any additional I/Os that get queued later
+will hang.
+
+This bug may also be the problem reported in this bug report:
+http://bugzilla.kernel.org/show_bug.cgi?id=12277
+
+Testing would need to be performed to determine if the two issues are the
+same.
+
+This problem was introduced by the new request handling thread code ("NBD:
+allow nbd to be used locally", 3/2008), which entered into mainline around
+2.6.25.
+
+The fix, which is fairly simple, is to restore the check for lo->sock
+being NULL in do_nbd_request. This causes I/O to an uninitialized nbd to
+immediately fail with an I/O error, as it did prior to the introduction of
+this bug.
+
+Signed-off-by: Paul Clements <paul.clements@steeleye.com>
+Reported-by: Jon Nelson <jnelson-kernel-bugzilla@jamponi.net>
+Acked-by: Pavel Machek <pavel@ucw.cz>
+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/nbd.c | 9 +++++++++
+ 1 file changed, 9 insertions(+)
+
+--- a/drivers/block/nbd.c
++++ b/drivers/block/nbd.c
+@@ -547,6 +547,15 @@ static void do_nbd_request(struct reques
+
+ BUG_ON(lo->magic != LO_MAGIC);
+
++ if (unlikely(!lo->sock)) {
++ printk(KERN_ERR "%s: Attempted send on closed socket\n",
++ lo->disk->disk_name);
++ req->errors++;
++ nbd_end_request(req);
++ spin_lock_irq(q->queue_lock);
++ continue;
++ }
++
+ spin_lock_irq(&lo->queue_lock);
+ list_add_tail(&req->queuelist, &lo->waiting_queue);
+ spin_unlock_irq(&lo->queue_lock);
--- /dev/null
+From 3abdbf90a3ffb006108c831c56b092e35483b6ec Mon Sep 17 00:00:00 2001
+From: Jiri Slaby <jirislaby@gmail.com>
+Date: Wed, 11 Feb 2009 13:04:40 -0800
+Subject: parport: parport_serial, don't bind netmos ibm 0299
+
+From: Jiri Slaby <jirislaby@gmail.com>
+
+commit 3abdbf90a3ffb006108c831c56b092e35483b6ec upstream.
+
+Since netmos 9835 with subids 0x1014(IBM):0x0299 is now bound with
+serial/8250_pci, because it has no parallel ports and subdevice id isn't
+in the expected form, return -ENODEV from probe function.
+
+This is performed in netmos preinit_hook.
+
+Signed-off-by: Jiri Slaby <jirislaby@gmail.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/parport/parport_serial.c | 5 +++++
+ 1 file changed, 5 insertions(+)
+
+--- a/drivers/parport/parport_serial.c
++++ b/drivers/parport/parport_serial.c
+@@ -64,6 +64,11 @@ struct parport_pc_pci {
+
+ static int __devinit netmos_parallel_init(struct pci_dev *dev, struct parport_pc_pci *card, int autoirq, int autodma)
+ {
++ /* the rule described below doesn't hold for this device */
++ if (dev->device == PCI_DEVICE_ID_NETMOS_9835 &&
++ dev->subsystem_vendor == PCI_VENDOR_ID_IBM &&
++ dev->subsystem_device == 0x0299)
++ return -ENODEV;
+ /*
+ * Netmos uses the subdevice ID to indicate the number of parallel
+ * and serial ports. The form is 0x00PS, where <P> is the number of
--- /dev/null
+From 16c29d180becc5bdf92fd0fc7314a44a671b5f4e Mon Sep 17 00:00:00 2001
+From: Michael Neuling <mikey@neuling.org>
+Date: Thu, 23 Oct 2008 00:42:36 +0000
+Subject: powerpc: Fix swapcontext system for VSX + old ucontext size
+
+From: Michael Neuling <mikey@neuling.org>
+
+commit 16c29d180becc5bdf92fd0fc7314a44a671b5f4e upstream.
+
+Since VSX support was added, we now have two sizes of ucontext_t;
+the older, smaller size without the extra VSX state, and the new
+larger size with the extra VSX state. A program using the
+sys_swapcontext system call and supplying smaller ucontext_t
+structures will currently get an EINVAL error if the task has
+used VSX (e.g. because of calling library code that uses VSX) and
+the old_ctx argument is non-NULL (i.e. the program is asking for
+its current context to be saved). Thus the program will start
+getting EINVAL errors on calls that previously worked.
+
+This commit changes this behaviour so that we don't send an EINVAL in
+this case. It will now return the smaller context but the VSX MSR bit
+will always be cleared to indicate that the ucontext_t doesn't include
+the extra VSX state, even if the task has executed VSX instructions.
+
+Both 32 and 64 bit cases are updated.
+
+[paulus@samba.org - also fix some access_ok() and get_user() calls]
+
+Thanks to Ben Herrenschmidt for noticing this problem.
+
+Signed-off-by: Michael Neuling <mikey@neuling.org>
+Signed-off-by: Paul Mackerras <paulus@samba.org>
+Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ arch/powerpc/kernel/signal_32.c | 36 +++++++++++++++---------------------
+ arch/powerpc/kernel/signal_64.c | 33 +++++++++++++++------------------
+ 2 files changed, 30 insertions(+), 39 deletions(-)
+
+--- a/arch/powerpc/kernel/signal_32.c
++++ b/arch/powerpc/kernel/signal_32.c
+@@ -410,7 +410,7 @@ inline unsigned long copy_fpr_from_user(
+ * altivec/spe instructions at some point.
+ */
+ static int save_user_regs(struct pt_regs *regs, struct mcontext __user *frame,
+- int sigret)
++ int sigret, int ctx_has_vsx_region)
+ {
+ unsigned long msr = regs->msr;
+
+@@ -451,7 +451,7 @@ static int save_user_regs(struct pt_regs
+ * the saved MSR value to indicate that frame->mc_vregs
+ * contains valid data
+ */
+- if (current->thread.used_vsr) {
++ if (current->thread.used_vsr && ctx_has_vsx_region) {
+ __giveup_vsx(current);
+ if (copy_vsx_to_user(&frame->mc_vsregs, current))
+ return 1;
+@@ -858,11 +858,11 @@ int handle_rt_signal32(unsigned long sig
+ frame = &rt_sf->uc.uc_mcontext;
+ addr = frame;
+ if (vdso32_rt_sigtramp && current->mm->context.vdso_base) {
+- if (save_user_regs(regs, frame, 0))
++ if (save_user_regs(regs, frame, 0, 1))
+ goto badframe;
+ regs->link = current->mm->context.vdso_base + vdso32_rt_sigtramp;
+ } else {
+- if (save_user_regs(regs, frame, __NR_rt_sigreturn))
++ if (save_user_regs(regs, frame, __NR_rt_sigreturn, 1))
+ goto badframe;
+ regs->link = (unsigned long) frame->tramp;
+ }
+@@ -936,12 +936,13 @@ long sys_swapcontext(struct ucontext __u
+ int ctx_size, int r6, int r7, int r8, struct pt_regs *regs)
+ {
+ unsigned char tmp;
++ int ctx_has_vsx_region = 0;
+
+ #ifdef CONFIG_PPC64
+ unsigned long new_msr = 0;
+
+ if (new_ctx &&
+- __get_user(new_msr, &new_ctx->uc_mcontext.mc_gregs[PT_MSR]))
++ get_user(new_msr, &new_ctx->uc_mcontext.mc_gregs[PT_MSR]))
+ return -EFAULT;
+ /*
+ * Check that the context is not smaller than the original
+@@ -956,16 +957,9 @@ long sys_swapcontext(struct ucontext __u
+ if ((ctx_size < sizeof(struct ucontext)) &&
+ (new_msr & MSR_VSX))
+ return -EINVAL;
+-#ifdef CONFIG_VSX
+- /*
+- * If userspace doesn't provide enough room for VSX data,
+- * but current thread has used VSX, we don't have anywhere
+- * to store the full context back into.
+- */
+- if ((ctx_size < sizeof(struct ucontext)) &&
+- (current->thread.used_vsr && old_ctx))
+- return -EINVAL;
+-#endif
++ /* Does the context have enough room to store VSX data? */
++ if (ctx_size >= sizeof(struct ucontext))
++ ctx_has_vsx_region = 1;
+ #else
+ /* Context size is for future use. Right now, we only make sure
+ * we are passed something we understand
+@@ -985,17 +979,17 @@ long sys_swapcontext(struct ucontext __u
+ */
+ mctx = (struct mcontext __user *)
+ ((unsigned long) &old_ctx->uc_mcontext & ~0xfUL);
+- if (!access_ok(VERIFY_WRITE, old_ctx, sizeof(*old_ctx))
+- || save_user_regs(regs, mctx, 0)
++ if (!access_ok(VERIFY_WRITE, old_ctx, ctx_size)
++ || save_user_regs(regs, mctx, 0, ctx_has_vsx_region)
+ || put_sigset_t(&old_ctx->uc_sigmask, ¤t->blocked)
+ || __put_user(to_user_ptr(mctx), &old_ctx->uc_regs))
+ return -EFAULT;
+ }
+ if (new_ctx == NULL)
+ return 0;
+- if (!access_ok(VERIFY_READ, new_ctx, sizeof(*new_ctx))
++ if (!access_ok(VERIFY_READ, new_ctx, ctx_size)
+ || __get_user(tmp, (u8 __user *) new_ctx)
+- || __get_user(tmp, (u8 __user *) (new_ctx + 1) - 1))
++ || __get_user(tmp, (u8 __user *) new_ctx + ctx_size - 1))
+ return -EFAULT;
+
+ /*
+@@ -1196,11 +1190,11 @@ int handle_signal32(unsigned long sig, s
+ goto badframe;
+
+ if (vdso32_sigtramp && current->mm->context.vdso_base) {
+- if (save_user_regs(regs, &frame->mctx, 0))
++ if (save_user_regs(regs, &frame->mctx, 0, 1))
+ goto badframe;
+ regs->link = current->mm->context.vdso_base + vdso32_sigtramp;
+ } else {
+- if (save_user_regs(regs, &frame->mctx, __NR_sigreturn))
++ if (save_user_regs(regs, &frame->mctx, __NR_sigreturn, 1))
+ goto badframe;
+ regs->link = (unsigned long) frame->mctx.tramp;
+ }
+--- a/arch/powerpc/kernel/signal_64.c
++++ b/arch/powerpc/kernel/signal_64.c
+@@ -74,7 +74,8 @@ static const char fmt64[] = KERN_INFO \
+ */
+
+ static long setup_sigcontext(struct sigcontext __user *sc, struct pt_regs *regs,
+- int signr, sigset_t *set, unsigned long handler)
++ int signr, sigset_t *set, unsigned long handler,
++ int ctx_has_vsx_region)
+ {
+ /* When CONFIG_ALTIVEC is set, we _always_ setup v_regs even if the
+ * process never used altivec yet (MSR_VEC is zero in pt_regs of
+@@ -121,7 +122,7 @@ static long setup_sigcontext(struct sigc
+ * then out to userspace. Update v_regs to point after the
+ * VMX data.
+ */
+- if (current->thread.used_vsr) {
++ if (current->thread.used_vsr && ctx_has_vsx_region) {
+ __giveup_vsx(current);
+ v_regs += ELF_NVRREG;
+ err |= copy_vsx_to_user(v_regs, current);
+@@ -284,9 +285,10 @@ int sys_swapcontext(struct ucontext __us
+ unsigned char tmp;
+ sigset_t set;
+ unsigned long new_msr = 0;
++ int ctx_has_vsx_region = 0;
+
+ if (new_ctx &&
+- __get_user(new_msr, &new_ctx->uc_mcontext.gp_regs[PT_MSR]))
++ get_user(new_msr, &new_ctx->uc_mcontext.gp_regs[PT_MSR]))
+ return -EFAULT;
+ /*
+ * Check that the context is not smaller than the original
+@@ -301,28 +303,23 @@ int sys_swapcontext(struct ucontext __us
+ if ((ctx_size < sizeof(struct ucontext)) &&
+ (new_msr & MSR_VSX))
+ return -EINVAL;
+-#ifdef CONFIG_VSX
+- /*
+- * If userspace doesn't provide enough room for VSX data,
+- * but current thread has used VSX, we don't have anywhere
+- * to store the full context back into.
+- */
+- if ((ctx_size < sizeof(struct ucontext)) &&
+- (current->thread.used_vsr && old_ctx))
+- return -EINVAL;
+-#endif
++ /* Does the context have enough room to store VSX data? */
++ if (ctx_size >= sizeof(struct ucontext))
++ ctx_has_vsx_region = 1;
++
+ if (old_ctx != NULL) {
+- if (!access_ok(VERIFY_WRITE, old_ctx, sizeof(*old_ctx))
+- || setup_sigcontext(&old_ctx->uc_mcontext, regs, 0, NULL, 0)
++ if (!access_ok(VERIFY_WRITE, old_ctx, ctx_size)
++ || setup_sigcontext(&old_ctx->uc_mcontext, regs, 0, NULL, 0,
++ ctx_has_vsx_region)
+ || __copy_to_user(&old_ctx->uc_sigmask,
+ ¤t->blocked, sizeof(sigset_t)))
+ return -EFAULT;
+ }
+ if (new_ctx == NULL)
+ return 0;
+- if (!access_ok(VERIFY_READ, new_ctx, sizeof(*new_ctx))
++ if (!access_ok(VERIFY_READ, new_ctx, ctx_size)
+ || __get_user(tmp, (u8 __user *) new_ctx)
+- || __get_user(tmp, (u8 __user *) (new_ctx + 1) - 1))
++ || __get_user(tmp, (u8 __user *) new_ctx + ctx_size - 1))
+ return -EFAULT;
+
+ /*
+@@ -425,7 +422,7 @@ int handle_rt_signal64(int signr, struct
+ &frame->uc.uc_stack.ss_flags);
+ err |= __put_user(current->sas_ss_size, &frame->uc.uc_stack.ss_size);
+ err |= setup_sigcontext(&frame->uc.uc_mcontext, regs, signr, NULL,
+- (unsigned long)ka->sa.sa_handler);
++ (unsigned long)ka->sa.sa_handler, 1);
+ err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set));
+ if (err)
+ goto badframe;
--- /dev/null
+From 6c24b17453c8dc444a746e45b8a404498fc9fcf7 Mon Sep 17 00:00:00 2001
+From: Kumar Gala <galak@kernel.crashing.org>
+Date: Mon, 9 Feb 2009 21:08:07 -0600
+Subject: powerpc/fsl-booke: Fix mapping functions to use phys_addr_t
+
+From: Kumar Gala <galak@kernel.crashing.org>
+
+commit 6c24b17453c8dc444a746e45b8a404498fc9fcf7 upstream.
+
+Fixed v_mapped_by_tlbcam() and p_mapped_by_tlbcam() to use phys_addr_t
+instead of unsigned long. In 36-bit physical mode we really need these
+functions to deal with phys_addr_t when trying to match a physical
+address or when returning one.
+
+Signed-off-by: Kumar Gala <galak@kernel.crashing.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ arch/powerpc/mm/fsl_booke_mmu.c | 4 ++--
+ arch/powerpc/mm/pgtable_32.c | 4 ++--
+ 2 files changed, 4 insertions(+), 4 deletions(-)
+
+--- a/arch/powerpc/mm/fsl_booke_mmu.c
++++ b/arch/powerpc/mm/fsl_booke_mmu.c
+@@ -80,7 +80,7 @@ extern unsigned int tlbcam_index;
+ /*
+ * Return PA for this VA if it is mapped by a CAM, or 0
+ */
+-unsigned long v_mapped_by_tlbcam(unsigned long va)
++phys_addr_t v_mapped_by_tlbcam(unsigned long va)
+ {
+ int b;
+ for (b = 0; b < tlbcam_index; ++b)
+@@ -92,7 +92,7 @@ unsigned long v_mapped_by_tlbcam(unsigne
+ /*
+ * Return VA for a given PA or 0 if not mapped
+ */
+-unsigned long p_mapped_by_tlbcam(unsigned long pa)
++unsigned long p_mapped_by_tlbcam(phys_addr_t pa)
+ {
+ int b;
+ for (b = 0; b < tlbcam_index; ++b)
+--- a/arch/powerpc/mm/pgtable_32.c
++++ b/arch/powerpc/mm/pgtable_32.c
+@@ -65,8 +65,8 @@ void setbat(int index, unsigned long vir
+
+ #ifdef HAVE_TLBCAM
+ extern unsigned int tlbcam_index;
+-extern unsigned long v_mapped_by_tlbcam(unsigned long va);
+-extern unsigned long p_mapped_by_tlbcam(unsigned long pa);
++extern phys_addr_t v_mapped_by_tlbcam(unsigned long va);
++extern unsigned long p_mapped_by_tlbcam(phys_addr_t pa);
+ #else /* !HAVE_TLBCAM */
+ #define v_mapped_by_tlbcam(x) (0UL)
+ #define p_mapped_by_tlbcam(x) (0UL)
--- /dev/null
+fix-page-writeback-thinko-causing-berkeley-db-slowdown.patch
+iwlwifi-scan-correct-setting-of-valid-rx_chains.patch
+kernel-doc-fix-syscall-wrapper-processing.patch
+lockd-fix-regression-in-lockd-s-handling-of-blocked-locks.patch
+nbd-fix-i-o-hang-on-disconnected-nbds.patch
+parport-parport_serial-don-t-bind-netmos-ibm-0299.patch
+powerpc-fix-swapcontext-system-for-vsx-old-ucontext-size.patch
+powerpc-fsl-booke-fix-mapping-functions-to-use-phys_addr_t.patch
+syscall-define-fix-uml-compile-bug.patch
+w1-w1-temp-calculation-overflow-fix.patch
+write-back-fix-nr_to_write-counter.patch
+writeback-fix-break-condition.patch
+x86-vmi-put-a-missing-paravirt_release_pmd-in-pgd_dtor.patch
+zd1211rw-adding-0ace-0xa211-as-a-zd1211-device.patch
+zd1211rw-treat-maxim_new_rf-as-uw2453_rf-for-tp-link-wn322-422g.patch
--- /dev/null
+From 6c5979631b4b03c9288776562c18036765e398c1 Mon Sep 17 00:00:00 2001
+From: Heiko Carstens <heiko.carstens@de.ibm.com>
+Date: Wed, 11 Feb 2009 13:04:38 -0800
+Subject: syscall define: fix uml compile bug
+
+From: Heiko Carstens <heiko.carstens@de.ibm.com>
+
+commit 6c5979631b4b03c9288776562c18036765e398c1 upstream.
+
+With the new system call defines we get this on uml:
+
+arch/um/sys-i386/built-in.o: In function `sys_call_table':
+(.rodata+0x308): undefined reference to `sys_sigprocmask'
+
+Reason for this is that uml passes the preprocessor option
+-Dsigprocmask=kernel_sigprocmask to gcc when compiling the kernel.
+This causes SYSCALL_DEFINE3(sigprocmask, ...) to be expanded to
+SYSCALL_DEFINEx(3, kernel_sigprocmask, ...) and finally to a system
+call named sys_kernel_sigprocmask. However sys_sigprocmask is missing
+because of this.
+
+To avoid macro expansion for the system call name just concatenate the
+name at first define instead of carrying it through severel levels.
+This was pointed out by Al Viro.
+
+Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com>
+Cc: Geert Uytterhoeven <geert@linux-m68k.org>
+Cc: Al Viro <viro@zeniv.linux.org.uk>
+Reviewed-by: WANG Cong <wangcong@zeuux.org>
+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>
+
+---
+ include/linux/syscalls.h | 28 ++++++++++++++--------------
+ 1 file changed, 14 insertions(+), 14 deletions(-)
+
+--- a/include/linux/syscalls.h
++++ b/include/linux/syscalls.h
+@@ -95,13 +95,13 @@ struct old_linux_dirent;
+ #define __SC_TEST5(t5, a5, ...) __SC_TEST(t5); __SC_TEST4(__VA_ARGS__)
+ #define __SC_TEST6(t6, a6, ...) __SC_TEST(t6); __SC_TEST5(__VA_ARGS__)
+
+-#define SYSCALL_DEFINE0(name) asmlinkage long sys_##name(void)
+-#define SYSCALL_DEFINE1(...) SYSCALL_DEFINEx(1, __VA_ARGS__)
+-#define SYSCALL_DEFINE2(...) SYSCALL_DEFINEx(2, __VA_ARGS__)
+-#define SYSCALL_DEFINE3(...) SYSCALL_DEFINEx(3, __VA_ARGS__)
+-#define SYSCALL_DEFINE4(...) SYSCALL_DEFINEx(4, __VA_ARGS__)
+-#define SYSCALL_DEFINE5(...) SYSCALL_DEFINEx(5, __VA_ARGS__)
+-#define SYSCALL_DEFINE6(...) SYSCALL_DEFINEx(6, __VA_ARGS__)
++#define SYSCALL_DEFINE0(name) asmlinkage long sys_##name(void)
++#define SYSCALL_DEFINE1(name, ...) SYSCALL_DEFINEx(1, _##name, __VA_ARGS__)
++#define SYSCALL_DEFINE2(name, ...) SYSCALL_DEFINEx(2, _##name, __VA_ARGS__)
++#define SYSCALL_DEFINE3(name, ...) SYSCALL_DEFINEx(3, _##name, __VA_ARGS__)
++#define SYSCALL_DEFINE4(name, ...) SYSCALL_DEFINEx(4, _##name, __VA_ARGS__)
++#define SYSCALL_DEFINE5(name, ...) SYSCALL_DEFINEx(5, _##name, __VA_ARGS__)
++#define SYSCALL_DEFINE6(name, ...) SYSCALL_DEFINEx(6, _##name, __VA_ARGS__)
+
+ #ifdef CONFIG_PPC64
+ #define SYSCALL_ALIAS(alias, name) \
+@@ -116,21 +116,21 @@ struct old_linux_dirent;
+
+ #define SYSCALL_DEFINE(name) static inline long SYSC_##name
+ #define SYSCALL_DEFINEx(x, name, ...) \
+- asmlinkage long sys_##name(__SC_DECL##x(__VA_ARGS__)); \
+- static inline long SYSC_##name(__SC_DECL##x(__VA_ARGS__)); \
+- asmlinkage long SyS_##name(__SC_LONG##x(__VA_ARGS__)) \
++ asmlinkage long sys##name(__SC_DECL##x(__VA_ARGS__)); \
++ static inline long SYSC##name(__SC_DECL##x(__VA_ARGS__)); \
++ asmlinkage long SyS##name(__SC_LONG##x(__VA_ARGS__)) \
+ { \
+ __SC_TEST##x(__VA_ARGS__); \
+- return (long) SYSC_##name(__SC_CAST##x(__VA_ARGS__)); \
++ return (long) SYSC##name(__SC_CAST##x(__VA_ARGS__)); \
+ } \
+- SYSCALL_ALIAS(sys_##name, SyS_##name); \
+- static inline long SYSC_##name(__SC_DECL##x(__VA_ARGS__))
++ SYSCALL_ALIAS(sys##name, SyS##name); \
++ static inline long SYSC##name(__SC_DECL##x(__VA_ARGS__))
+
+ #else /* CONFIG_HAVE_SYSCALL_WRAPPERS */
+
+ #define SYSCALL_DEFINE(name) asmlinkage long sys_##name
+ #define SYSCALL_DEFINEx(x, name, ...) \
+- asmlinkage long sys_##name(__SC_DECL##x(__VA_ARGS__))
++ asmlinkage long sys##name(__SC_DECL##x(__VA_ARGS__))
+
+ #endif /* CONFIG_HAVE_SYSCALL_WRAPPERS */
+
--- /dev/null
+From 507e2fbaaacb6f164b4125b87c5002f95143174b Mon Sep 17 00:00:00 2001
+From: Ian Dall <ian@beware.dropbear.id.au>
+Date: Wed, 11 Feb 2009 13:04:46 -0800
+Subject: w1: w1 temp calculation overflow fix
+
+From: Ian Dall <ian@beware.dropbear.id.au>
+
+commit 507e2fbaaacb6f164b4125b87c5002f95143174b upstream.
+
+Addresses http://bugzilla.kernel.org/show_bug.cgi?id=12646
+
+When the temperature exceeds 32767 milli-degrees the temperature overflows
+to -32768 millidegrees. These are bothe well within the -55 - +125 degree
+range for the sensor.
+
+Fix overflow in left-shift of a u8.
+
+Signed-off-by: Ian Dall <ian@beware.dropbear.id.au>
+Signed-off-by: Evgeniy Polyakov <zbr@ioremap.net>
+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/w1/slaves/w1_therm.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- a/drivers/w1/slaves/w1_therm.c
++++ b/drivers/w1/slaves/w1_therm.c
+@@ -113,7 +113,7 @@ static struct w1_therm_family_converter
+
+ static inline int w1_DS18B20_convert_temp(u8 rom[9])
+ {
+- s16 t = (rom[1] << 8) | rom[0];
++ int t = ((s16)rom[1] << 8) | rom[0];
+ t = t*1000/16;
+ return t;
+ }
--- /dev/null
+From dcf6a79dda5cc2a2bec183e50d829030c0972aaa Mon Sep 17 00:00:00 2001
+From: Artem Bityutskiy <Artem.Bityutskiy@nokia.com>
+Date: Mon, 2 Feb 2009 18:33:49 +0200
+Subject: write-back: fix nr_to_write counter
+
+From: Artem Bityutskiy <Artem.Bityutskiy@nokia.com>
+
+commit dcf6a79dda5cc2a2bec183e50d829030c0972aaa upstream.
+
+Commit 05fe478dd04e02fa230c305ab9b5616669821dd3 introduced some
+@wbc->nr_to_write breakage.
+
+It made the following changes:
+ 1. Decrement wbc->nr_to_write instead of nr_to_write
+ 2. Decrement wbc->nr_to_write _only_ if wbc->sync_mode == WB_SYNC_NONE
+ 3. If synced nr_to_write pages, stop only if if wbc->sync_mode ==
+ WB_SYNC_NONE, otherwise keep going.
+
+However, according to the commit message, the intention was to only make
+change 3. Change 1 is a bug. Change 2 does not seem to be necessary,
+and it breaks UBIFS expectations, so if needed, it should be done
+separately later. And change 2 does not seem to be documented in the
+commit message.
+
+This patch does the following:
+ 1. Undo changes 1 and 2
+ 2. Add a comment explaining change 3 (it very useful to have comments
+ in _code_, not only in the commit).
+
+Signed-off-by: Artem Bityutskiy <Artem.Bityutskiy@nokia.com>
+Acked-by: Nick Piggin <npiggin@suse.de>
+Cc: Andrew Morton <akpm@linux-foundation.org>
+Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ mm/page-writeback.c | 19 ++++++++++++++-----
+ 1 file changed, 14 insertions(+), 5 deletions(-)
+
+--- a/mm/page-writeback.c
++++ b/mm/page-writeback.c
+@@ -985,13 +985,22 @@ continue_unlock:
+ }
+ }
+
+- if (wbc->sync_mode == WB_SYNC_NONE) {
++ if (wbc->nr_to_write > 0)
+ wbc->nr_to_write--;
+- if (wbc->nr_to_write <= 0) {
+- done = 1;
+- break;
+- }
++ else if (wbc->sync_mode == WB_SYNC_NONE) {
++ /*
++ * We stop writing back only if we are not
++ * doing integrity sync. In case of integrity
++ * sync we have to keep going because someone
++ * may be concurrently dirtying pages, and we
++ * might have synced a lot of newly appeared
++ * dirty pages, but have not synced all of the
++ * old dirty pages.
++ */
++ done = 1;
++ break;
+ }
++
+ if (wbc->nonblocking && bdi_write_congested(bdi)) {
+ wbc->encountered_congestion = 1;
+ done = 1;
--- /dev/null
+From 89e1219004b3657cc014521663eeef0744f1c99d Mon Sep 17 00:00:00 2001
+From: Federico Cuello <fedux@lugmen.org.ar>
+Date: Wed, 11 Feb 2009 13:04:39 -0800
+Subject: writeback: fix break condition
+
+From: Federico Cuello <fedux@lugmen.org.ar>
+
+commit 89e1219004b3657cc014521663eeef0744f1c99d upstream.
+
+Commit dcf6a79dda5cc2a2bec183e50d829030c0972aaa ("write-back: fix
+nr_to_write counter") fixed nr_to_write counter, but didn't set the break
+condition properly.
+
+If nr_to_write == 0 after being decremented it will loop one more time
+before setting done = 1 and breaking the loop.
+
+[akpm@linux-foundation.org: coding-style fixes]
+Cc: Artem Bityutskiy <Artem.Bityutskiy@nokia.com>
+Acked-by: Nick Piggin <npiggin@suse.de>
+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>
+
+---
+ mm/page-writeback.c | 29 ++++++++++++++++-------------
+ 1 file changed, 16 insertions(+), 13 deletions(-)
+
+--- a/mm/page-writeback.c
++++ b/mm/page-writeback.c
+@@ -985,20 +985,23 @@ continue_unlock:
+ }
+ }
+
+- if (wbc->nr_to_write > 0)
++ if (wbc->nr_to_write > 0) {
+ wbc->nr_to_write--;
+- else if (wbc->sync_mode == WB_SYNC_NONE) {
+- /*
+- * We stop writing back only if we are not
+- * doing integrity sync. In case of integrity
+- * sync we have to keep going because someone
+- * may be concurrently dirtying pages, and we
+- * might have synced a lot of newly appeared
+- * dirty pages, but have not synced all of the
+- * old dirty pages.
+- */
+- done = 1;
+- break;
++ if (wbc->nr_to_write == 0 &&
++ wbc->sync_mode == WB_SYNC_NONE) {
++ /*
++ * We stop writing back only if we are
++ * not doing integrity sync. In case of
++ * integrity sync we have to keep going
++ * because someone may be concurrently
++ * dirtying pages, and we might have
++ * synced a lot of newly appeared dirty
++ * pages, but have not synced all of the
++ * old dirty pages.
++ */
++ done = 1;
++ break;
++ }
+ }
+
+ if (wbc->nonblocking && bdi_write_congested(bdi)) {
--- /dev/null
+From 55a8ba4b7f76bebd7e8ce3f74c04b140627a1bad Mon Sep 17 00:00:00 2001
+From: Alok Kataria <akataria@vmware.com>
+Date: Fri, 6 Feb 2009 10:29:35 -0800
+Subject: x86, vmi: put a missing paravirt_release_pmd in pgd_dtor
+
+From: Alok Kataria <akataria@vmware.com>
+
+commit 55a8ba4b7f76bebd7e8ce3f74c04b140627a1bad upstream.
+
+Commit 6194ba6ff6ccf8d5c54c857600843c67aa82c407 ("x86: don't special-case
+pmd allocations as much") made changes to the way we handle pmd allocations,
+and while doing that it dropped a call to paravirt_release_pd on the
+pgd page from the pgd_dtor code path.
+
+As a result of this missing release, the hypervisor is now unaware of the
+pgd page being freed, and as a result it ends up tracking this page as a
+page table page.
+
+After this the guest may start using the same page for other purposes, and
+depending on what use the page is put to, it may result in various performance
+and/or functional issues ( hangs, reboots).
+
+Since this release is only required for VMI, I now release the pgd page from
+the (vmi)_pgd_free hook.
+
+Signed-off-by: Alok N Kataria <akataria@vmware.com>
+Acked-by: Jeremy Fitzhardinge <jeremy@goop.org>
+Signed-off-by: Ingo Molnar <mingo@elte.hu>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ arch/x86/kernel/vmi_32.c | 11 +++++++++++
+ 1 file changed, 11 insertions(+)
+
+--- a/arch/x86/kernel/vmi_32.c
++++ b/arch/x86/kernel/vmi_32.c
+@@ -430,6 +430,16 @@ static void vmi_release_pmd(u32 pfn)
+ }
+
+ /*
++ * We use the pgd_free hook for releasing the pgd page:
++ */
++static void vmi_pgd_free(struct mm_struct *mm, pgd_t *pgd)
++{
++ unsigned long pfn = __pa(pgd) >> PAGE_SHIFT;
++
++ vmi_ops.release_page(pfn, VMI_PAGE_L2);
++}
++
++/*
+ * Helper macros for MMU update flags. We can defer updates until a flush
+ * or page invalidation only if the update is to the current address space
+ * (otherwise, there is no flush). We must check against init_mm, since
+@@ -881,6 +891,7 @@ static inline int __init activate_vmi(vo
+ if (vmi_ops.release_page) {
+ pv_mmu_ops.release_pte = vmi_release_pte;
+ pv_mmu_ops.release_pmd = vmi_release_pmd;
++ pv_mmu_ops.pgd_free = vmi_pgd_free;
+ }
+
+ /* Set linear is needed in all cases */
--- /dev/null
+From 14990c69b5f51dd57b4e0e2373de50239ac861e2 Mon Sep 17 00:00:00 2001
+From: Hin-Tak Leung <hintak.leung@gmail.com>
+Date: Sun, 8 Feb 2009 02:13:56 +0000
+Subject: zd1211rw: adding 0ace:0xa211 as a ZD1211 device
+
+From: Hin-Tak Leung <hintak.leung@gmail.com>
+
+commit 14990c69b5f51dd57b4e0e2373de50239ac861e2 upstream.
+
+Christoph Biedl <sourceforge.bnwi@manchmal.in-ulm.de> reported success
+in the sourceforge zd1211 mailing list on this addition. This product ID
+was supported by the vendor driver ZD1211LnxDrv 2.22.0.0 (and possibly
+earlier) and it probably should have been added earlier.
+
+Signed-off-by: Hin-Tak Leung <htl10@users.sourceforge.net>
+Tested-by: Christoph Biedl <sourceforge.bnwi@manchmal.in-ulm.de>
+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 | 1 +
+ 1 file changed, 1 insertion(+)
+
+--- a/drivers/net/wireless/zd1211rw/zd_usb.c
++++ b/drivers/net/wireless/zd1211rw/zd_usb.c
+@@ -37,6 +37,7 @@
+ static struct usb_device_id usb_ids[] = {
+ /* ZD1211 */
+ { USB_DEVICE(0x0ace, 0x1211), .driver_info = DEVICE_ZD1211 },
++ { USB_DEVICE(0x0ace, 0xa211), .driver_info = DEVICE_ZD1211 },
+ { USB_DEVICE(0x07b8, 0x6001), .driver_info = DEVICE_ZD1211 },
+ { USB_DEVICE(0x126f, 0xa006), .driver_info = DEVICE_ZD1211 },
+ { USB_DEVICE(0x6891, 0xa727), .driver_info = DEVICE_ZD1211 },
--- /dev/null
+From efb43f4b2ccf8066abc3920a0e6858e4350a65c7 Mon Sep 17 00:00:00 2001
+From: Hin-Tak Leung <hintak.leung@gmail.com>
+Date: Wed, 4 Feb 2009 23:40:43 +0000
+Subject: zd1211rw: treat MAXIM_NEW_RF(0x08) as UW2453_RF(0x09) for TP-Link WN322/422G
+
+From: Hin-Tak Leung <hintak.leung@gmail.com>
+
+commit efb43f4b2ccf8066abc3920a0e6858e4350a65c7 upstream.
+
+Three people (Petr Mensik <pihhan@cipis.net>
+["si" should be U+0161 U+00ED], Stephen Ho <stephenhoinhk@gmail.com>
+on zd1211-devs and Ismael Ojeda Perez <iojedaperez@gmail.com>
+on linux-wireless) reported success in getting TP-Link WN322G/WN422G
+working by treating MAXIM_NEW_RF(0x08) as UW2453_RF(0x09) for rf
+chip hardware initialization.
+
+Signed-off-by: Hin-Tak Leung <htl10@users.sourceforge.net>
+Tested-by: Petr Mensik <pihhan@cipis.net>
+Tested-by: Stephen Ho <stephenhoinhk@gmail.com>
+Tested-by: Ismael Ojeda Perez <iojedaperez@gmail.com>
+Signed-off-by: John W. Linville <linville@tuxdriver.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/net/wireless/zd1211rw/zd_rf.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+--- a/drivers/net/wireless/zd1211rw/zd_rf.c
++++ b/drivers/net/wireless/zd1211rw/zd_rf.c
+@@ -86,6 +86,7 @@ int zd_rf_init_hw(struct zd_rf *rf, u8 t
+ case AL7230B_RF:
+ r = zd_rf_init_al7230b(rf);
+ break;
++ case MAXIM_NEW_RF:
+ case UW2453_RF:
+ r = zd_rf_init_uw2453(rf);
+ break;