From cfb767e9cbda4fddde30be94b4e4e5cfe5413646 Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Fri, 13 Feb 2009 15:14:22 -0800 Subject: [PATCH] .27 patches --- ...-thinko-causing-berkeley-db-slowdown.patch | 53 +++++ ...n-correct-setting-of-valid-rx_chains.patch | 30 +++ ...l-doc-fix-syscall-wrapper-processing.patch | 104 ++++++++ ...in-lockd-s-handling-of-blocked-locks.patch | 59 +++++ ...bd-fix-i-o-hang-on-disconnected-nbds.patch | 66 +++++ ...rt_serial-don-t-bind-netmos-ibm-0299.patch | 38 +++ ...ext-system-for-vsx-old-ucontext-size.patch | 225 ++++++++++++++++++ ...mapping-functions-to-use-phys_addr_t.patch | 55 +++++ queue-2.6.27/series | 15 ++ .../syscall-define-fix-uml-compile-bug.patch | 89 +++++++ .../w1-w1-temp-calculation-overflow-fix.patch | 38 +++ .../write-back-fix-nr_to_write-counter.patch | 69 ++++++ .../writeback-fix-break-condition.patch | 66 +++++ ...ing-paravirt_release_pmd-in-pgd_dtor.patch | 61 +++++ ...dding-0ace-0xa211-as-a-zd1211-device.patch | 33 +++ ...-as-uw2453_rf-for-tp-link-wn322-422g.patch | 37 +++ 16 files changed, 1038 insertions(+) create mode 100644 queue-2.6.27/fix-page-writeback-thinko-causing-berkeley-db-slowdown.patch create mode 100644 queue-2.6.27/iwlwifi-scan-correct-setting-of-valid-rx_chains.patch create mode 100644 queue-2.6.27/kernel-doc-fix-syscall-wrapper-processing.patch create mode 100644 queue-2.6.27/lockd-fix-regression-in-lockd-s-handling-of-blocked-locks.patch create mode 100644 queue-2.6.27/nbd-fix-i-o-hang-on-disconnected-nbds.patch create mode 100644 queue-2.6.27/parport-parport_serial-don-t-bind-netmos-ibm-0299.patch create mode 100644 queue-2.6.27/powerpc-fix-swapcontext-system-for-vsx-old-ucontext-size.patch create mode 100644 queue-2.6.27/powerpc-fsl-booke-fix-mapping-functions-to-use-phys_addr_t.patch create mode 100644 queue-2.6.27/series create mode 100644 queue-2.6.27/syscall-define-fix-uml-compile-bug.patch create mode 100644 queue-2.6.27/w1-w1-temp-calculation-overflow-fix.patch create mode 100644 queue-2.6.27/write-back-fix-nr_to_write-counter.patch create mode 100644 queue-2.6.27/writeback-fix-break-condition.patch create mode 100644 queue-2.6.27/x86-vmi-put-a-missing-paravirt_release_pmd-in-pgd_dtor.patch create mode 100644 queue-2.6.27/zd1211rw-adding-0ace-0xa211-as-a-zd1211-device.patch create mode 100644 queue-2.6.27/zd1211rw-treat-maxim_new_rf-as-uw2453_rf-for-tp-link-wn322-422g.patch diff --git a/queue-2.6.27/fix-page-writeback-thinko-causing-berkeley-db-slowdown.patch b/queue-2.6.27/fix-page-writeback-thinko-causing-berkeley-db-slowdown.patch new file mode 100644 index 00000000000..b2b6fccf6fa --- /dev/null +++ b/queue-2.6.27/fix-page-writeback-thinko-causing-berkeley-db-slowdown.patch @@ -0,0 +1,53 @@ +From 3a4c6800f31ea8395628af5e7e490270ee5d0585 Mon Sep 17 00:00:00 2001 +From: Nick Piggin +Date: Thu, 12 Feb 2009 04:34:23 +0100 +Subject: Fix page writeback thinko, causing Berkeley DB slowdown + +From: Nick Piggin + +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 +Reported-and-tested-by: Jan Kara +Signed-off-by: Linus Torvalds +Signed-off-by: Greg Kroah-Hartman + +--- + 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 diff --git a/queue-2.6.27/iwlwifi-scan-correct-setting-of-valid-rx_chains.patch b/queue-2.6.27/iwlwifi-scan-correct-setting-of-valid-rx_chains.patch new file mode 100644 index 00000000000..7256f0d2112 --- /dev/null +++ b/queue-2.6.27/iwlwifi-scan-correct-setting-of-valid-rx_chains.patch @@ -0,0 +1,30 @@ +From d588be6bae40f7965f1b681a4dbc3254411787b9 Mon Sep 17 00:00:00 2001 +From: Tomas Winkler +Date: Mon, 6 Oct 2008 16:05:29 +0800 +Subject: iwlwifi: scan correct setting of valid rx_chains + +From: Tomas Winkler + +commit d588be6bae40f7965f1b681a4dbc3254411787b9 upstream. + +This patch sets rx_chain bitmap correctly according hw configuration. + +Signed-off-by: Tomas Winkler +Signed-off-by: John W. Linville +Signed-off-by: Greg Kroah-Hartman + +--- + 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); + diff --git a/queue-2.6.27/kernel-doc-fix-syscall-wrapper-processing.patch b/queue-2.6.27/kernel-doc-fix-syscall-wrapper-processing.patch new file mode 100644 index 00000000000..4c6766a4108 --- /dev/null +++ b/queue-2.6.27/kernel-doc-fix-syscall-wrapper-processing.patch @@ -0,0 +1,104 @@ +From b4870bc5ee8c7a37541a3eb1208b5c76c13a078a Mon Sep 17 00:00:00 2001 +From: Randy Dunlap +Date: Wed, 11 Feb 2009 13:04:33 -0800 +Subject: kernel-doc: fix syscall wrapper processing + +From: Randy Dunlap + +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 +Signed-off-by: Andrew Morton +Signed-off-by: Linus Torvalds +Signed-off-by: Greg Kroah-Hartman + +--- + 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(); + } + } diff --git a/queue-2.6.27/lockd-fix-regression-in-lockd-s-handling-of-blocked-locks.patch b/queue-2.6.27/lockd-fix-regression-in-lockd-s-handling-of-blocked-locks.patch new file mode 100644 index 00000000000..5f308770fe9 --- /dev/null +++ b/queue-2.6.27/lockd-fix-regression-in-lockd-s-handling-of-blocked-locks.patch @@ -0,0 +1,59 @@ +From 9d9b87c1218be78ddecbc85ec3bb91c79c1d56ab Mon Sep 17 00:00:00 2001 +From: J. Bruce Fields +Date: Wed, 4 Feb 2009 17:35:38 -0500 +Subject: lockd: fix regression in lockd's handling of blocked locks + +From: J. Bruce Fields + +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 +Reported-by: Frank van Maarseveen +Cc: Miklos Szeredi +Signed-off-by: J. Bruce Fields +Signed-off-by: Greg Kroah-Hartman + +--- + 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 */ diff --git a/queue-2.6.27/nbd-fix-i-o-hang-on-disconnected-nbds.patch b/queue-2.6.27/nbd-fix-i-o-hang-on-disconnected-nbds.patch new file mode 100644 index 00000000000..006f3ec186e --- /dev/null +++ b/queue-2.6.27/nbd-fix-i-o-hang-on-disconnected-nbds.patch @@ -0,0 +1,66 @@ +From 4d48a542b42747c36a5937447d9c3de7c897ea50 Mon Sep 17 00:00:00 2001 +From: Paul Clements +Date: Wed, 11 Feb 2009 13:04:45 -0800 +Subject: nbd: fix I/O hang on disconnected nbds + +From: Paul Clements + +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 +Reported-by: Jon Nelson +Acked-by: Pavel Machek +Signed-off-by: Andrew Morton +Signed-off-by: Linus Torvalds +Signed-off-by: Greg Kroah-Hartman + +--- + 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); diff --git a/queue-2.6.27/parport-parport_serial-don-t-bind-netmos-ibm-0299.patch b/queue-2.6.27/parport-parport_serial-don-t-bind-netmos-ibm-0299.patch new file mode 100644 index 00000000000..5cd4a25cc67 --- /dev/null +++ b/queue-2.6.27/parport-parport_serial-don-t-bind-netmos-ibm-0299.patch @@ -0,0 +1,38 @@ +From 3abdbf90a3ffb006108c831c56b092e35483b6ec Mon Sep 17 00:00:00 2001 +From: Jiri Slaby +Date: Wed, 11 Feb 2009 13:04:40 -0800 +Subject: parport: parport_serial, don't bind netmos ibm 0299 + +From: Jiri Slaby + +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 +Signed-off-by: Andrew Morton +Signed-off-by: Linus Torvalds +Signed-off-by: Greg Kroah-Hartman + +--- + 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

is the number of diff --git a/queue-2.6.27/powerpc-fix-swapcontext-system-for-vsx-old-ucontext-size.patch b/queue-2.6.27/powerpc-fix-swapcontext-system-for-vsx-old-ucontext-size.patch new file mode 100644 index 00000000000..4651aaba26b --- /dev/null +++ b/queue-2.6.27/powerpc-fix-swapcontext-system-for-vsx-old-ucontext-size.patch @@ -0,0 +1,225 @@ +From 16c29d180becc5bdf92fd0fc7314a44a671b5f4e Mon Sep 17 00:00:00 2001 +From: Michael Neuling +Date: Thu, 23 Oct 2008 00:42:36 +0000 +Subject: powerpc: Fix swapcontext system for VSX + old ucontext size + +From: Michael Neuling + +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 +Signed-off-by: Paul Mackerras +Cc: Benjamin Herrenschmidt +Signed-off-by: Greg Kroah-Hartman + +--- + 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; diff --git a/queue-2.6.27/powerpc-fsl-booke-fix-mapping-functions-to-use-phys_addr_t.patch b/queue-2.6.27/powerpc-fsl-booke-fix-mapping-functions-to-use-phys_addr_t.patch new file mode 100644 index 00000000000..383b79d91c3 --- /dev/null +++ b/queue-2.6.27/powerpc-fsl-booke-fix-mapping-functions-to-use-phys_addr_t.patch @@ -0,0 +1,55 @@ +From 6c24b17453c8dc444a746e45b8a404498fc9fcf7 Mon Sep 17 00:00:00 2001 +From: Kumar Gala +Date: Mon, 9 Feb 2009 21:08:07 -0600 +Subject: powerpc/fsl-booke: Fix mapping functions to use phys_addr_t + +From: Kumar Gala + +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 +Signed-off-by: Greg Kroah-Hartman + +--- + 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) diff --git a/queue-2.6.27/series b/queue-2.6.27/series new file mode 100644 index 00000000000..1fcb5ecb4e7 --- /dev/null +++ b/queue-2.6.27/series @@ -0,0 +1,15 @@ +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 diff --git a/queue-2.6.27/syscall-define-fix-uml-compile-bug.patch b/queue-2.6.27/syscall-define-fix-uml-compile-bug.patch new file mode 100644 index 00000000000..404682aaffd --- /dev/null +++ b/queue-2.6.27/syscall-define-fix-uml-compile-bug.patch @@ -0,0 +1,89 @@ +From 6c5979631b4b03c9288776562c18036765e398c1 Mon Sep 17 00:00:00 2001 +From: Heiko Carstens +Date: Wed, 11 Feb 2009 13:04:38 -0800 +Subject: syscall define: fix uml compile bug + +From: Heiko Carstens + +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 +Cc: Geert Uytterhoeven +Cc: Al Viro +Reviewed-by: WANG Cong +Signed-off-by: Andrew Morton +Signed-off-by: Linus Torvalds +Signed-off-by: Greg Kroah-Hartman + +--- + 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 */ + diff --git a/queue-2.6.27/w1-w1-temp-calculation-overflow-fix.patch b/queue-2.6.27/w1-w1-temp-calculation-overflow-fix.patch new file mode 100644 index 00000000000..2ab4fe7599d --- /dev/null +++ b/queue-2.6.27/w1-w1-temp-calculation-overflow-fix.patch @@ -0,0 +1,38 @@ +From 507e2fbaaacb6f164b4125b87c5002f95143174b Mon Sep 17 00:00:00 2001 +From: Ian Dall +Date: Wed, 11 Feb 2009 13:04:46 -0800 +Subject: w1: w1 temp calculation overflow fix + +From: Ian Dall + +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 +Signed-off-by: Evgeniy Polyakov +Signed-off-by: Andrew Morton +Signed-off-by: Linus Torvalds +Signed-off-by: Greg Kroah-Hartman + +--- + 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; + } diff --git a/queue-2.6.27/write-back-fix-nr_to_write-counter.patch b/queue-2.6.27/write-back-fix-nr_to_write-counter.patch new file mode 100644 index 00000000000..400d661d837 --- /dev/null +++ b/queue-2.6.27/write-back-fix-nr_to_write-counter.patch @@ -0,0 +1,69 @@ +From dcf6a79dda5cc2a2bec183e50d829030c0972aaa Mon Sep 17 00:00:00 2001 +From: Artem Bityutskiy +Date: Mon, 2 Feb 2009 18:33:49 +0200 +Subject: write-back: fix nr_to_write counter + +From: Artem Bityutskiy + +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 +Acked-by: Nick Piggin +Cc: Andrew Morton +Signed-off-by: Linus Torvalds +Signed-off-by: Greg Kroah-Hartman + +--- + 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; diff --git a/queue-2.6.27/writeback-fix-break-condition.patch b/queue-2.6.27/writeback-fix-break-condition.patch new file mode 100644 index 00000000000..99561ed8742 --- /dev/null +++ b/queue-2.6.27/writeback-fix-break-condition.patch @@ -0,0 +1,66 @@ +From 89e1219004b3657cc014521663eeef0744f1c99d Mon Sep 17 00:00:00 2001 +From: Federico Cuello +Date: Wed, 11 Feb 2009 13:04:39 -0800 +Subject: writeback: fix break condition + +From: Federico Cuello + +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 +Acked-by: Nick Piggin +Signed-off-by: Andrew Morton +Signed-off-by: Linus Torvalds +Signed-off-by: Greg Kroah-Hartman + +--- + 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)) { diff --git a/queue-2.6.27/x86-vmi-put-a-missing-paravirt_release_pmd-in-pgd_dtor.patch b/queue-2.6.27/x86-vmi-put-a-missing-paravirt_release_pmd-in-pgd_dtor.patch new file mode 100644 index 00000000000..18b755be351 --- /dev/null +++ b/queue-2.6.27/x86-vmi-put-a-missing-paravirt_release_pmd-in-pgd_dtor.patch @@ -0,0 +1,61 @@ +From 55a8ba4b7f76bebd7e8ce3f74c04b140627a1bad Mon Sep 17 00:00:00 2001 +From: Alok Kataria +Date: Fri, 6 Feb 2009 10:29:35 -0800 +Subject: x86, vmi: put a missing paravirt_release_pmd in pgd_dtor + +From: Alok Kataria + +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 +Acked-by: Jeremy Fitzhardinge +Signed-off-by: Ingo Molnar +Signed-off-by: Greg Kroah-Hartman + +--- + 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 */ diff --git a/queue-2.6.27/zd1211rw-adding-0ace-0xa211-as-a-zd1211-device.patch b/queue-2.6.27/zd1211rw-adding-0ace-0xa211-as-a-zd1211-device.patch new file mode 100644 index 00000000000..b16984e5396 --- /dev/null +++ b/queue-2.6.27/zd1211rw-adding-0ace-0xa211-as-a-zd1211-device.patch @@ -0,0 +1,33 @@ +From 14990c69b5f51dd57b4e0e2373de50239ac861e2 Mon Sep 17 00:00:00 2001 +From: Hin-Tak Leung +Date: Sun, 8 Feb 2009 02:13:56 +0000 +Subject: zd1211rw: adding 0ace:0xa211 as a ZD1211 device + +From: Hin-Tak Leung + +commit 14990c69b5f51dd57b4e0e2373de50239ac861e2 upstream. + +Christoph Biedl 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 +Tested-by: Christoph Biedl +Signed-off-by: John W. Linville +Signed-off-by: Greg Kroah-Hartman + +--- + 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 }, diff --git a/queue-2.6.27/zd1211rw-treat-maxim_new_rf-as-uw2453_rf-for-tp-link-wn322-422g.patch b/queue-2.6.27/zd1211rw-treat-maxim_new_rf-as-uw2453_rf-for-tp-link-wn322-422g.patch new file mode 100644 index 00000000000..37f140b1d60 --- /dev/null +++ b/queue-2.6.27/zd1211rw-treat-maxim_new_rf-as-uw2453_rf-for-tp-link-wn322-422g.patch @@ -0,0 +1,37 @@ +From efb43f4b2ccf8066abc3920a0e6858e4350a65c7 Mon Sep 17 00:00:00 2001 +From: Hin-Tak Leung +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 + +commit efb43f4b2ccf8066abc3920a0e6858e4350a65c7 upstream. + +Three people (Petr Mensik +["si" should be U+0161 U+00ED], Stephen Ho +on zd1211-devs and Ismael Ojeda Perez +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 +Tested-by: Petr Mensik +Tested-by: Stephen Ho +Tested-by: Ismael Ojeda Perez +Signed-off-by: John W. Linville +Signed-off-by: Greg Kroah-Hartman + +--- + 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; -- 2.47.3