From: Greg Kroah-Hartman Date: Wed, 7 Mar 2007 01:30:27 +0000 (-0800) Subject: more 2.6.20-stable patches added X-Git-Tag: v2.6.20.2~16 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=95c21306412f53207d31fbfab41c8c9eb2926ada;p=thirdparty%2Fkernel%2Fstable-queue.git more 2.6.20-stable patches added --- diff --git a/queue-2.6.20/dvb-cxusb-fix-firmware-patch-for-big-endian-systems.patch b/queue-2.6.20/dvb-cxusb-fix-firmware-patch-for-big-endian-systems.patch new file mode 100644 index 00000000000..28c0c4b4e47 --- /dev/null +++ b/queue-2.6.20/dvb-cxusb-fix-firmware-patch-for-big-endian-systems.patch @@ -0,0 +1,39 @@ +From stable-bounces@linux.kernel.org Sat Mar 3 06:37:39 2007 +From: Jin-Bong lee +Date: Sat, 03 Mar 2007 09:36:05 -0500 +Subject: DVB: cxusb: fix firmware patch for big endian systems +To: stable@kernel.org +Cc: v4l-dvb maintainer list +Message-ID: <45E987D5.8080200@linuxtv.org> + + +From: Jin-Bong lee + +Without this patch, the device will not be detected after firmware download +on big endian systems. + +(cherry picked from commit 1d1370a48ca285ebe197ecd3197a8d5f161bc291) + +Signed-off-by: Jin-Bong lee +Signed-off-by: Michael Krufky +Signed-off-by: Mauro Carvalho Chehab +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/media/dvb/dvb-usb/cxusb.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +--- linux-2.6.20.1.orig/drivers/media/dvb/dvb-usb/cxusb.c ++++ linux-2.6.20.1/drivers/media/dvb/dvb-usb/cxusb.c +@@ -469,9 +469,9 @@ static int bluebird_patch_dvico_firmware + fw->data[BLUEBIRD_01_ID_OFFSET + 1] == USB_VID_DVICO >> 8) { + + fw->data[BLUEBIRD_01_ID_OFFSET + 2] = +- udev->descriptor.idProduct + 1; ++ le16_to_cpu(udev->descriptor.idProduct) + 1; + fw->data[BLUEBIRD_01_ID_OFFSET + 3] = +- udev->descriptor.idProduct >> 8; ++ le16_to_cpu(udev->descriptor.idProduct) >> 8; + + return usb_cypress_load_firmware(udev, fw, CYPRESS_FX2); + } diff --git a/queue-2.6.20/dvb-digitv-open-nxt6000-i2c_gate-for-tded4-tuner-handling.patch b/queue-2.6.20/dvb-digitv-open-nxt6000-i2c_gate-for-tded4-tuner-handling.patch new file mode 100644 index 00000000000..9f7683bd3f4 --- /dev/null +++ b/queue-2.6.20/dvb-digitv-open-nxt6000-i2c_gate-for-tded4-tuner-handling.patch @@ -0,0 +1,36 @@ +From stable-bounces@linux.kernel.org Sat Mar 3 06:37:44 2007 +From: Michael Krufky +Date: Sat, 03 Mar 2007 09:36:09 -0500 +Subject: DVB: digitv: open nxt6000 i2c_gate for TDED4 tuner handling +To: stable@kernel.org +Cc: v4l-dvb maintainer list , Linux Kernel Mailing List +Message-ID: <45E987D9.9000808@linuxtv.org> + +From: Michael Krufky + +dvb-pll normally opens the i2c gate before attempting to communicate with +the pll, but the code for this device is not using dvb-pll. This should +be cleaned up in the future, but for now, just open the i2c gate at the +appropriate place in order to fix this driver bug. + +(cherry picked from commit 2fe22dcdc79b8dd34e61a3f1231caffd6180a626) + +Signed-off-by: Michael Krufky +Signed-off-by: Mauro Carvalho Chehab +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/media/dvb/dvb-usb/digitv.c | 2 ++ + 1 file changed, 2 insertions(+) + +--- linux-2.6.20.1.orig/drivers/media/dvb/dvb-usb/digitv.c ++++ linux-2.6.20.1/drivers/media/dvb/dvb-usb/digitv.c +@@ -119,6 +119,8 @@ static int digitv_nxt6000_tuner_set_para + struct dvb_usb_adapter *adap = fe->dvb->priv; + u8 b[5]; + dvb_usb_tuner_calc_regs(fe,fep,b, 5); ++ if (fe->ops.i2c_gate_ctrl) ++ fe->ops.i2c_gate_ctrl(fe, 1); + return digitv_ctrl_msg(adap->dev, USB_WRITE_TUNER, 0, &b[1], 4, NULL, 0); + } + diff --git a/queue-2.6.20/dvbdev-fix-illegal-re-usage-of-fileoperations-struct.patch b/queue-2.6.20/dvbdev-fix-illegal-re-usage-of-fileoperations-struct.patch new file mode 100644 index 00000000000..ccf2ddcdc01 --- /dev/null +++ b/queue-2.6.20/dvbdev-fix-illegal-re-usage-of-fileoperations-struct.patch @@ -0,0 +1,72 @@ +From stable-bounces@linux.kernel.org Sat Mar 3 06:37:14 2007 +From: Michael Krufky +Date: Sat, 03 Mar 2007 09:35:48 -0500 +Subject: dvbdev: fix illegal re-usage of fileoperations struct +To: stable@kernel.org +Cc: v4l-dvb maintainer list , Linux Kernel Mailing List +Message-ID: <45E987C4.8040302@linuxtv.org> + +From: Marcel Siegert + +Arjan van de Ven reported an illegal re-usage of +the fileoperations struct if more than one dvb device (e.g. frontend) is +present. + +This patch fixes this issue. + +It allocates a new fileoperations struct each time a device is +registered and copies the default template fileops. + +(backported from commit b61901024776b25ce7b8edc31bb1757c7382a88e) + +Signed-off-by: Marcel Siegert +Signed-off-by: Mauro Carvalho Chehab +Signed-off-by: Michael Krufky +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/media/dvb/dvb-core/dvbdev.c | 13 +++++++++++++ + 1 file changed, 13 insertions(+) + +--- linux-2.6.20.1.orig/drivers/media/dvb/dvb-core/dvbdev.c ++++ linux-2.6.20.1/drivers/media/dvb/dvb-core/dvbdev.c +@@ -200,6 +200,8 @@ int dvb_register_device(struct dvb_adapt + const struct dvb_device *template, void *priv, int type) + { + struct dvb_device *dvbdev; ++ struct file_operations *dvbdevfops; ++ + int id; + + if (mutex_lock_interruptible(&dvbdev_register_lock)) +@@ -219,12 +221,22 @@ int dvb_register_device(struct dvb_adapt + return -ENOMEM; + } + ++ dvbdevfops = kzalloc(sizeof(struct file_operations), GFP_KERNEL); ++ ++ if (!dvbdevfops) { ++ kfree (dvbdev); ++ mutex_unlock(&dvbdev_register_lock); ++ return -ENOMEM; ++ } ++ + memcpy(dvbdev, template, sizeof(struct dvb_device)); + dvbdev->type = type; + dvbdev->id = id; + dvbdev->adapter = adap; + dvbdev->priv = priv; ++ dvbdev->fops = dvbdevfops; + ++ memcpy(dvbdev->fops, template->fops, sizeof(struct file_operations)); + dvbdev->fops->owner = adap->module; + + list_add_tail (&dvbdev->list_head, &adap->device_list); +@@ -252,6 +264,7 @@ void dvb_unregister_device(struct dvb_de + dvbdev->type, dvbdev->id))); + + list_del (&dvbdev->list_head); ++ kfree (dvbdev->fops); + kfree (dvbdev); + } + EXPORT_SYMBOL(dvb_unregister_device); diff --git a/queue-2.6.20/fix-posix-cpu-timer-breakage-caused-by-stale-p-last_ran-value.patch b/queue-2.6.20/fix-posix-cpu-timer-breakage-caused-by-stale-p-last_ran-value.patch new file mode 100644 index 00000000000..0e4dfef8fad --- /dev/null +++ b/queue-2.6.20/fix-posix-cpu-timer-breakage-caused-by-stale-p-last_ran-value.patch @@ -0,0 +1,41 @@ +From tglx@linutronix.de Wed Feb 21 16:28:30 2007 +From: Thomas Gleixner +Date: Thu, 22 Feb 2007 01:33:29 +0100 +Subject: Fix posix-cpu-timer breakage caused by stale p->last_ran value +To: Andrew Morton +Cc: Ingo Molnar , john stultz , Roman Zippel , Mike Galbraith , Ken Chen , balducci@units.it, Greg KH +Message-ID: <1172104409.25076.165.camel@localhost.localdomain> + +From: Thomas Gleixner + +Problem description at: +http://bugzilla.kernel.org/show_bug.cgi?id=8048 + +Commit b18ec80396834497933d77b81ec0918519f4e2a7 + [PATCH] sched: improve migration accuracy +optimized the scheduler time calculations, but broke posix-cpu-timers. + +The problem is that the p->last_ran value is not updated after a context +switch. So a subsequent call to current_sched_time() calculates with a +stale p->last_ran value, i.e. accounts the full time, which the task was +scheduled away. + +Signed-off-by: Thomas Gleixner +Acked-by: Ingo Molnar +Signed-off-by: Greg Kroah-Hartman + +--- + kernel/sched.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- linux-2.6.20.1.orig/kernel/sched.c ++++ linux-2.6.20.1/kernel/sched.c +@@ -3547,7 +3547,7 @@ switch_tasks: + + sched_info_switch(prev, next); + if (likely(prev != next)) { +- next->timestamp = now; ++ next->timestamp = next->last_ran = now; + rq->nr_switches++; + rq->curr = next; + ++*switch_count; diff --git a/queue-2.6.20/fix-umask-when-noacl-kernel-meets-extn-tuned-for-acls.patch b/queue-2.6.20/fix-umask-when-noacl-kernel-meets-extn-tuned-for-acls.patch new file mode 100644 index 00000000000..5f9b526286c --- /dev/null +++ b/queue-2.6.20/fix-umask-when-noacl-kernel-meets-extn-tuned-for-acls.patch @@ -0,0 +1,90 @@ +From stable-bounces@linux.kernel.org Fri Feb 23 13:55:02 2007 +From: Hugh Dickins +Date: Fri, 23 Feb 2007 21:53:49 +0000 (GMT) +Subject: fix umask when noACL kernel meets extN tuned for ACLs +To: Greg KH +Cc: Chris Wright , Tigran Aivazian , stable@kernel.org, Andreas Gruenbacher +Message-ID: + +From: Hugh Dickins + +Fix insecure default behaviour reported by Tigran Aivazian: if an ext2 +or ext3 or ext4 filesystem is tuned to mount with "acl", but mounted by +a kernel built without ACL support, then umask was ignored when creating +inodes - though root or user has umask 022, touch creates files as 0666, +and mkdir creates directories as 0777. + +This appears to have worked right until 2.6.11, when a fix to the default +mode on symlinks (always 0777) assumed VFS applies umask: which it does, +unless the mount is marked for ACLs; but ext[234] set MS_POSIXACL in +s_flags according to s_mount_opt set according to def_mount_opts. + +We could revert to the 2.6.10 ext[234]_init_acl (adding an S_ISLNK test); +but other filesystems only set MS_POSIXACL when ACLs are configured. We +could fix this at another level; but it seems most robust to avoid setting +the s_mount_opt flag in the first place (at the expense of more ifdefs). + +Likewise don't set the XATTR_USER flag when built without XATTR support. + +Signed-off-by: Hugh Dickins +Acked-by: Andreas Gruenbacher +Cc: Tigran Aivazian +Signed-off-by: Greg Kroah-Hartman + +--- + fs/ext2/super.c | 4 ++++ + fs/ext3/super.c | 4 ++++ + fs/ext4/super.c | 4 ++++ + 3 files changed, 12 insertions(+) + +--- linux-2.6.20.1.orig/fs/ext2/super.c ++++ linux-2.6.20.1/fs/ext2/super.c +@@ -708,10 +708,14 @@ static int ext2_fill_super(struct super_ + set_opt(sbi->s_mount_opt, GRPID); + if (def_mount_opts & EXT2_DEFM_UID16) + set_opt(sbi->s_mount_opt, NO_UID32); ++#ifdef CONFIG_EXT2_FS_XATTR + if (def_mount_opts & EXT2_DEFM_XATTR_USER) + set_opt(sbi->s_mount_opt, XATTR_USER); ++#endif ++#ifdef CONFIG_EXT2_FS_POSIX_ACL + if (def_mount_opts & EXT2_DEFM_ACL) + set_opt(sbi->s_mount_opt, POSIX_ACL); ++#endif + + if (le16_to_cpu(sbi->s_es->s_errors) == EXT2_ERRORS_PANIC) + set_opt(sbi->s_mount_opt, ERRORS_PANIC); +--- linux-2.6.20.1.orig/fs/ext3/super.c ++++ linux-2.6.20.1/fs/ext3/super.c +@@ -1459,10 +1459,14 @@ static int ext3_fill_super (struct super + set_opt(sbi->s_mount_opt, GRPID); + if (def_mount_opts & EXT3_DEFM_UID16) + set_opt(sbi->s_mount_opt, NO_UID32); ++#ifdef CONFIG_EXT3_FS_XATTR + if (def_mount_opts & EXT3_DEFM_XATTR_USER) + set_opt(sbi->s_mount_opt, XATTR_USER); ++#endif ++#ifdef CONFIG_EXT3_FS_POSIX_ACL + if (def_mount_opts & EXT3_DEFM_ACL) + set_opt(sbi->s_mount_opt, POSIX_ACL); ++#endif + if ((def_mount_opts & EXT3_DEFM_JMODE) == EXT3_DEFM_JMODE_DATA) + sbi->s_mount_opt |= EXT3_MOUNT_JOURNAL_DATA; + else if ((def_mount_opts & EXT3_DEFM_JMODE) == EXT3_DEFM_JMODE_ORDERED) +--- linux-2.6.20.1.orig/fs/ext4/super.c ++++ linux-2.6.20.1/fs/ext4/super.c +@@ -1518,10 +1518,14 @@ static int ext4_fill_super (struct super + set_opt(sbi->s_mount_opt, GRPID); + if (def_mount_opts & EXT4_DEFM_UID16) + set_opt(sbi->s_mount_opt, NO_UID32); ++#ifdef CONFIG_EXT4DEV_FS_XATTR + if (def_mount_opts & EXT4_DEFM_XATTR_USER) + set_opt(sbi->s_mount_opt, XATTR_USER); ++#endif ++#ifdef CONFIG_EXT4DEV_FS_POSIX_ACL + if (def_mount_opts & EXT4_DEFM_ACL) + set_opt(sbi->s_mount_opt, POSIX_ACL); ++#endif + if ((def_mount_opts & EXT4_DEFM_JMODE) == EXT4_DEFM_JMODE_DATA) + sbi->s_mount_opt |= EXT4_MOUNT_JOURNAL_DATA; + else if ((def_mount_opts & EXT4_DEFM_JMODE) == EXT4_DEFM_JMODE_ORDERED) diff --git a/queue-2.6.20/sata_sil-ignore-and-clear-spurious-irqs-while-executing-commands-by-polling.patch b/queue-2.6.20/sata_sil-ignore-and-clear-spurious-irqs-while-executing-commands-by-polling.patch new file mode 100644 index 00000000000..7f21ee9ea6d --- /dev/null +++ b/queue-2.6.20/sata_sil-ignore-and-clear-spurious-irqs-while-executing-commands-by-polling.patch @@ -0,0 +1,46 @@ +From stable-bounces@linux.kernel.org Sat Feb 24 05:32:07 2007 +From: Tejun Heo +Date: Sat, 24 Feb 2007 22:30:36 +0900 +Subject: sata_sil: ignore and clear spurious IRQs while executing commands by polling +To: Jeff Garzik , +Cc: stable@kernel.org +Message-ID: <20070224133036.GB20322@htj.dyndns.org> +Content-Disposition: inline + + +sata_sil used to trigger HSM error if IRQ occurs during polling +command. This didn't matter because polling wasn't used in sata_sil. +However, as of 2.6.20, all IDENTIFYs are performed by polling and +device detection sometimes fails due to spurious IRQ. This patch +makes sata_sil ignore and clear spurious IRQ while executing commands +by polling. + +This fixes bug#7996 and IMHO should also be included in -stable. + +Signed-off-by: Tejun Heo +Cc: Jeff Garzik +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/ata/sata_sil.c | 8 +++++++- + 1 file changed, 7 insertions(+), 1 deletion(-) + +--- linux-2.6.20.1.orig/drivers/ata/sata_sil.c ++++ linux-2.6.20.1/drivers/ata/sata_sil.c +@@ -383,9 +383,15 @@ static void sil_host_intr(struct ata_por + goto freeze; + } + +- if (unlikely(!qc || qc->tf.ctl & ATA_NIEN)) ++ if (unlikely(!qc)) + goto freeze; + ++ if (unlikely(qc->tf.flags & ATA_TFLAG_POLLING)) { ++ /* this sometimes happens, just clear IRQ */ ++ ata_chk_status(ap); ++ return; ++ } ++ + /* Check whether we are expecting interrupt in this state */ + switch (ap->hsm_task_state) { + case HSM_ST_FIRST: diff --git a/queue-2.6.20/series b/queue-2.6.20/series index 5b8f2fceee2..63e6629f6bd 100644 --- a/queue-2.6.20/series +++ b/queue-2.6.20/series @@ -44,3 +44,15 @@ x86-don-t-require-the-vdso-for-handling-a.out-signals.patch i386-fix-broken-config_compat_vdso-on-i386.patch bcm43xx-fix-for-4309.patch md-fix-raid10-recovery-problem.patch +dvbdev-fix-illegal-re-usage-of-fileoperations-struct.patch +v4l-pvrusb2-fix-video-corruption-on-stream-start.patch +v4l-pvrusb2-handle-larger-cx2341x-firmware-images.patch +dvb-cxusb-fix-firmware-patch-for-big-endian-systems.patch +dvb-digitv-open-nxt6000-i2c_gate-for-tded4-tuner-handling.patch +v4l-fix-cx25840-firmware-loading.patch +v4l-cx88-blackbird-allow-usage-of-376836-and-262144-sized-firmware-images.patch +fix-posix-cpu-timer-breakage-caused-by-stale-p-last_ran-value.patch +swsusp-fix-possible-oops-in-userland-interface.patch +sata_sil-ignore-and-clear-spurious-irqs-while-executing-commands-by-polling.patch +fix-umask-when-noacl-kernel-meets-extn-tuned-for-acls.patch +uml-fix-2.6.20-hang.patch diff --git a/queue-2.6.20/swsusp-fix-possible-oops-in-userland-interface.patch b/queue-2.6.20/swsusp-fix-possible-oops-in-userland-interface.patch new file mode 100644 index 00000000000..fcff616c698 --- /dev/null +++ b/queue-2.6.20/swsusp-fix-possible-oops-in-userland-interface.patch @@ -0,0 +1,75 @@ +From stable-bounces@linux.kernel.org Sat Feb 24 14:15:16 2007 +From: "Rafael J. Wysocki" +Date: Sat, 24 Feb 2007 23:06:43 +0100 +Subject: swsusp: Fix possible oops in userland interface +To: stable@kernel.org +Cc: Stefan Seyfried , Pavel Machek +Message-ID: <200702242306.44445.rjw@sisk.pl> +Content-Disposition: inline + +From: Stefan Seyfried + +Fix the Oops occuring when SNAPSHOT_PMOPS or SNAPSHOT_S2RAM ioctl is called on +a system without pm_ops defined (eg. a non-ACPI kernel on x86 PC). + +Signed-off-by: Stefan Seyfried +Signed-off-by: Rafael J. Wysocki +Acked-by: Pavel Machek +Signed-off-by: Greg Kroah-Hartman + + +--- + kernel/power/user.c | 19 ++++++++++++------- + 1 file changed, 12 insertions(+), 7 deletions(-) + +--- linux-2.6.20.1.orig/kernel/power/user.c ++++ linux-2.6.20.1/kernel/power/user.c +@@ -292,7 +292,7 @@ static int snapshot_ioctl(struct inode * + break; + } + +- if (pm_ops->prepare) { ++ if (pm_ops && pm_ops->prepare) { + error = pm_ops->prepare(PM_SUSPEND_MEM); + if (error) + goto OutS3; +@@ -311,7 +311,7 @@ static int snapshot_ioctl(struct inode * + device_resume(); + } + resume_console(); +- if (pm_ops->finish) ++ if (pm_ops && pm_ops->finish) + pm_ops->finish(PM_SUSPEND_MEM); + + OutS3: +@@ -322,20 +322,25 @@ static int snapshot_ioctl(struct inode * + switch (arg) { + + case PMOPS_PREPARE: +- if (pm_ops->prepare) { ++ if (pm_ops && pm_ops->prepare) + error = pm_ops->prepare(PM_SUSPEND_DISK); +- } ++ else ++ error = -ENOSYS; + break; + + case PMOPS_ENTER: + kernel_shutdown_prepare(SYSTEM_SUSPEND_DISK); +- error = pm_ops->enter(PM_SUSPEND_DISK); ++ if (pm_ops && pm_ops->enter) ++ error = pm_ops->enter(PM_SUSPEND_DISK); ++ else ++ error = -ENOSYS; + break; + + case PMOPS_FINISH: +- if (pm_ops && pm_ops->finish) { ++ if (pm_ops && pm_ops->finish) + pm_ops->finish(PM_SUSPEND_DISK); +- } ++ else ++ error = -ENOSYS; + break; + + default: diff --git a/queue-2.6.20/uml-fix-2.6.20-hang.patch b/queue-2.6.20/uml-fix-2.6.20-hang.patch new file mode 100644 index 00000000000..065b09d4513 --- /dev/null +++ b/queue-2.6.20/uml-fix-2.6.20-hang.patch @@ -0,0 +1,119 @@ +From stable-bounces@linux.kernel.org Thu Feb 22 08:58:01 2007 +From: Jeff Dike +Date: Thu, 22 Feb 2007 11:48:38 -0500 +Subject: UML - Fix 2.6.20 hang +To: stable@kernel.org, linux-kernel@vger.kernel.org +Cc: Blaisorblade , user-mode-linux-devel@lists.sourceforge.net +Message-ID: <20070222164838.GA3396@ccure.user-mode-linux.org> +Content-Disposition: inline + +From: Jeff Dike + +A previous cleanup misused need_poll, which had a fairly broken +interface. It implemented a growable array, changing the used +elements count itself, but leaving it up to the caller to fill in the +actual elements, including the entire array if the array had to be +reallocated. This worked because the previous users were switching +between two such structures, and the elements were copied from the +inactive array to the active array after making sure the active array +had enough room. + +maybe_sigio_broken was made to use need_poll, but it was operating on +a single array, so when the buffer was reallocated, the previous +contents were lost. + +This patch makes need_poll implement more sane semantics. It merely +assures that the array is of the proper size and that the contents are +preserved. It is up to the caller to adjust the used elements count +and to ensure that the proper elements are resent. + +This manifested itself as a hang in 2.6.20 as the uninitialized buffer +convinced UML that one of its own file descriptors didn't support +SIGIO and needed to be watched by poll in a separate thread. The +result was an interrupt flood as control traffic over this descriptor +sparked interrupts, which resulted in more control traffic, ad nauseum. + +Signed-off-by: Jeff Dike +Signed-off-by: Greg Kroah-Hartman + +--- + arch/um/os-Linux/sigio.c | 38 ++++++++++++++++++++------------------ + 1 file changed, 20 insertions(+), 18 deletions(-) + +--- linux-2.6.20.1.orig/arch/um/os-Linux/sigio.c ++++ linux-2.6.20.1/arch/um/os-Linux/sigio.c +@@ -97,20 +97,22 @@ static int write_sigio_thread(void *unus + + static int need_poll(struct pollfds *polls, int n) + { +- if(n <= polls->size){ +- polls->used = n; ++ struct pollfd *new; ++ ++ if(n <= polls->size) + return 0; +- } +- kfree(polls->poll); +- polls->poll = um_kmalloc_atomic(n * sizeof(struct pollfd)); +- if(polls->poll == NULL){ ++ ++ new = um_kmalloc_atomic(n * sizeof(struct pollfd)); ++ if(new == NULL){ + printk("need_poll : failed to allocate new pollfds\n"); +- polls->size = 0; +- polls->used = 0; + return -ENOMEM; + } ++ ++ memcpy(new, polls->poll, polls->used * sizeof(struct pollfd)); ++ kfree(polls->poll); ++ ++ polls->poll = new; + polls->size = n; +- polls->used = n; + return 0; + } + +@@ -171,15 +173,15 @@ int add_sigio_fd(int fd) + goto out; + } + +- n = current_poll.used + 1; +- err = need_poll(&next_poll, n); ++ n = current_poll.used; ++ err = need_poll(&next_poll, n + 1); + if(err) + goto out; + +- for(i = 0; i < current_poll.used; i++) +- next_poll.poll[i] = current_poll.poll[i]; +- +- next_poll.poll[n - 1] = *p; ++ memcpy(next_poll.poll, current_poll.poll, ++ current_poll.used * sizeof(struct pollfd)); ++ next_poll.poll[n] = *p; ++ next_poll.used = n + 1; + update_thread(); + out: + sigio_unlock(); +@@ -214,6 +216,7 @@ int ignore_sigio_fd(int fd) + if(p->fd != fd) + next_poll.poll[n++] = *p; + } ++ next_poll.used = current_poll.used - 1; + + update_thread(); + out: +@@ -331,10 +334,9 @@ void maybe_sigio_broken(int fd, int read + + sigio_lock(); + err = need_poll(&all_sigio_fds, all_sigio_fds.used + 1); +- if(err){ +- printk("maybe_sigio_broken - failed to add pollfd\n"); ++ if(err) + goto out; +- } ++ + all_sigio_fds.poll[all_sigio_fds.used++] = + ((struct pollfd) { .fd = fd, + .events = read ? POLLIN : POLLOUT, diff --git a/queue-2.6.20/v4l-cx88-blackbird-allow-usage-of-376836-and-262144-sized-firmware-images.patch b/queue-2.6.20/v4l-cx88-blackbird-allow-usage-of-376836-and-262144-sized-firmware-images.patch new file mode 100644 index 00000000000..f4b46037e2e --- /dev/null +++ b/queue-2.6.20/v4l-cx88-blackbird-allow-usage-of-376836-and-262144-sized-firmware-images.patch @@ -0,0 +1,77 @@ +From stable-bounces@linux.kernel.org Sat Mar 3 06:37:57 2007 +From: Michael Krufky +Date: Sat, 03 Mar 2007 09:36:15 -0500 +Subject: V4L: cx88-blackbird: allow usage of 376836 and 262144 sized firmware images +To: stable@kernel.org +Cc: v4l-dvb maintainer list +Message-ID: <45E987DF.3060903@linuxtv.org> + + +From: Michael Krufky + +This updates the cx88-blackbird driver to be able to use the new cx23416 +firmware image released by Hauppauge Computer Works, while retaining +compatibility with the older firmware images. +cx2341x firmware can be downloaded at: http://dl.ivtvdriver.org/ivtv/firmware/ + +(cherry picked from commit af70dbd3346999570db73b3bc3d4f7b7c004f2ea) + +Signed-off-by: Michael Krufky +Signed-off-by: Mauro Carvalho Chehab +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/media/video/cx88/cx88-blackbird.c | 14 +++++++++----- + drivers/media/video/cx88/cx88.h | 1 + + 2 files changed, 10 insertions(+), 5 deletions(-) + +--- linux-2.6.20.1.orig/drivers/media/video/cx88/cx88-blackbird.c ++++ linux-2.6.20.1/drivers/media/video/cx88/cx88-blackbird.c +@@ -53,7 +53,8 @@ MODULE_PARM_DESC(debug,"enable debug mes + + /* ------------------------------------------------------------------ */ + +-#define BLACKBIRD_FIRM_IMAGE_SIZE 256*1024 ++#define OLD_BLACKBIRD_FIRM_IMAGE_SIZE 262144 ++#define BLACKBIRD_FIRM_IMAGE_SIZE 376836 + + /* defines below are from ivtv-driver.h */ + +@@ -401,7 +402,7 @@ static int blackbird_find_mailbox(struct + u32 value; + int i; + +- for (i = 0; i < BLACKBIRD_FIRM_IMAGE_SIZE; i++) { ++ for (i = 0; i < dev->fw_size; i++) { + memory_read(dev->core, i, &value); + if (value == signature[signaturecnt]) + signaturecnt++; +@@ -449,12 +450,15 @@ static int blackbird_load_firmware(struc + return -1; + } + +- if (firmware->size != BLACKBIRD_FIRM_IMAGE_SIZE) { +- dprintk(0, "ERROR: Firmware size mismatch (have %zd, expected %d)\n", +- firmware->size, BLACKBIRD_FIRM_IMAGE_SIZE); ++ if ((firmware->size != BLACKBIRD_FIRM_IMAGE_SIZE) && ++ (firmware->size != OLD_BLACKBIRD_FIRM_IMAGE_SIZE)) { ++ dprintk(0, "ERROR: Firmware size mismatch (have %zd, expected %d or %d)\n", ++ firmware->size, BLACKBIRD_FIRM_IMAGE_SIZE, ++ OLD_BLACKBIRD_FIRM_IMAGE_SIZE); + release_firmware(firmware); + return -1; + } ++ dev->fw_size = firmware->size; + + if (0 != memcmp(firmware->data, magic, 8)) { + dprintk(0, "ERROR: Firmware magic mismatch, wrong file?\n"); +--- linux-2.6.20.1.orig/drivers/media/video/cx88/cx88.h ++++ linux-2.6.20.1/drivers/media/video/cx88/cx88.h +@@ -459,6 +459,7 @@ struct cx8802_dev { + u32 mailbox; + int width; + int height; ++ int fw_size; + + /* for dvb only */ + struct videobuf_dvb dvb; diff --git a/queue-2.6.20/v4l-fix-cx25840-firmware-loading.patch b/queue-2.6.20/v4l-fix-cx25840-firmware-loading.patch new file mode 100644 index 00000000000..879e525775a --- /dev/null +++ b/queue-2.6.20/v4l-fix-cx25840-firmware-loading.patch @@ -0,0 +1,60 @@ +From stable-bounces@linux.kernel.org Sat Mar 3 06:37:50 2007 +From: Hans Verkuil +Date: Sat, 03 Mar 2007 09:36:11 -0500 +Subject: V4L: fix cx25840 firmware loading +To: stable@kernel.org +Cc: v4l-dvb maintainer list +Message-ID: <45E987DB.1070502@linuxtv.org> + + +From: Hans Verkuil +Date: Thu, 15 Feb 2007 03:40:34 -0300 +Subject: [PATCH] V4L: fix cx25840 firmware loading + +Due to changes in the i2c handling in 2.6.20 this cx25840 bug surfaced, +causing the firmware load to fail for the ivtv driver. The correct +sequence is to first attach the i2c client, then use the client's +device to load the firmware. + +(cherry picked from commit d55c7aec666658495e5b57a6b194c8c2a1ac255f) + +Signed-off-by: Hans Verkuil +Acked-by: Mike Isely +Signed-off-by: Mauro Carvalho Chehab +Signed-off-by: Michael Krufky +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/media/video/cx25840/cx25840-core.c | 4 ++-- + drivers/media/video/cx25840/cx25840-firmware.c | 2 +- + 2 files changed, 3 insertions(+), 3 deletions(-) + +--- linux-2.6.20.1.orig/drivers/media/video/cx25840/cx25840-core.c ++++ linux-2.6.20.1/drivers/media/video/cx25840/cx25840-core.c +@@ -907,13 +907,13 @@ static int cx25840_detect_client(struct + state->vbi_line_offset = 8; + state->id = id; + ++ i2c_attach_client(client); ++ + if (state->is_cx25836) + cx25836_initialize(client); + else + cx25840_initialize(client, 1); + +- i2c_attach_client(client); +- + return 0; + } + +--- linux-2.6.20.1.orig/drivers/media/video/cx25840/cx25840-firmware.c ++++ linux-2.6.20.1/drivers/media/video/cx25840/cx25840-firmware.c +@@ -37,7 +37,7 @@ + */ + #define FWSEND 48 + +-#define FWDEV(x) &((x)->adapter->dev) ++#define FWDEV(x) &((x)->dev) + + static char *firmware = FWFILE; + diff --git a/queue-2.6.20/v4l-pvrusb2-fix-video-corruption-on-stream-start.patch b/queue-2.6.20/v4l-pvrusb2-fix-video-corruption-on-stream-start.patch new file mode 100644 index 00000000000..7337e108d63 --- /dev/null +++ b/queue-2.6.20/v4l-pvrusb2-fix-video-corruption-on-stream-start.patch @@ -0,0 +1,85 @@ +From stable-bounces@linux.kernel.org Sat Mar 3 06:37:14 2007 +From: Michael Krufky +Date: Sat, 03 Mar 2007 09:35:54 -0500 +Subject: V4L: pvrusb2: Fix video corruption on stream start +To: stable@kernel.org +Cc: v4l-dvb maintainer list , Linux Kernel Mailing List +Message-ID: <45E987CA.90407@linuxtv.org> + +From: Mike Isely + +This introduces some extra cx23416 commands when streaming is +started. The addition of these commands fix random sporadic video +corruption that can take place when the video stream is temporarily +disrupted through loss of signal (e.g. changing the channel in the RF +tuner). + +This fix is already in the upstream driver source and has proven +itself there; this is a backport for the 2.6.20.y kernel series. + +(backported from commit 6fe7d2c4660174110c6872cacc4fc2acb6e00acf) + +Signed-off-by: Mike Isely +Signed-off-by: Michael Krufky +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/media/video/pvrusb2/pvrusb2-encoder.c | 40 ++++++++++++++++++++++++++ + 1 file changed, 40 insertions(+) + +--- linux-2.6.20.1.orig/drivers/media/video/pvrusb2/pvrusb2-encoder.c ++++ linux-2.6.20.1/drivers/media/video/pvrusb2/pvrusb2-encoder.c +@@ -288,6 +288,44 @@ static int pvr2_encoder_vcmd(struct pvr2 + return pvr2_encoder_cmd(hdw,cmd,args,0,data); + } + ++ ++/* This implements some extra setup for the encoder that seems to be ++ specific to the PVR USB2 hardware. */ ++int pvr2_encoder_prep_config(struct pvr2_hdw *hdw) ++{ ++ int ret = 0; ++ int encMisc3Arg = 0; ++ ++ /* Mike Isely 22-Feb-2007 The windows driver ++ sends the following list of ENC_MISC commands (for both ++ 24xxx and 29xxx devices). Meanings are not entirely clear, ++ however without the ENC_MISC(3,encMisc3Arg) command then we risk ++ random perpetual video corruption whenever the video input ++ breaks up for a moment (like when switching channels). */ ++ ++ ++ /* This ENC_MISC(3,encMisc3Arg) command is critical - without ++ it there will eventually be video corruption. Also, the ++ 29xxx case is strange - the Windows driver is passing 1 ++ regardless of device type but if we have 1 for 29xxx device ++ the video turns sluggish. */ ++ switch (hdw->hdw_type) { ++ case PVR2_HDW_TYPE_24XXX: encMisc3Arg = 1; break; ++ case PVR2_HDW_TYPE_29XXX: encMisc3Arg = 0; break; ++ default: break; ++ } ++ ret |= pvr2_encoder_vcmd(hdw, CX2341X_ENC_MISC,4, 3, ++ encMisc3Arg,0,0); ++ ++ ret |= pvr2_encoder_vcmd(hdw, CX2341X_ENC_MISC,4, 8,0,0,0); ++ ++ ret |= pvr2_encoder_vcmd(hdw, CX2341X_ENC_MISC,4, 0,3,0,0); ++ ret |= pvr2_encoder_vcmd(hdw, CX2341X_ENC_MISC,4,15,0,0,0); ++ ++ return ret; ++} ++ ++ + int pvr2_encoder_configure(struct pvr2_hdw *hdw) + { + int ret; +@@ -302,6 +340,8 @@ int pvr2_encoder_configure(struct pvr2_h + + ret = 0; + ++ ret |= pvr2_encoder_prep_config(hdw); ++ + if (!ret) ret = pvr2_encoder_vcmd( + hdw,CX2341X_ENC_SET_NUM_VSYNC_LINES, 2, + 0xf0, 0xf0); diff --git a/queue-2.6.20/v4l-pvrusb2-handle-larger-cx2341x-firmware-images.patch b/queue-2.6.20/v4l-pvrusb2-handle-larger-cx2341x-firmware-images.patch new file mode 100644 index 00000000000..a48f3d2c6c6 --- /dev/null +++ b/queue-2.6.20/v4l-pvrusb2-handle-larger-cx2341x-firmware-images.patch @@ -0,0 +1,88 @@ +From stable-bounces@linux.kernel.org Sat Mar 3 06:37:30 2007 +From: Michael Krufky +Date: Sat, 03 Mar 2007 09:36:02 -0500 +Subject: V4L: pvrusb2: Handle larger cx2341x firmware images +To: stable@kernel.org +Cc: v4l-dvb maintainer list +Message-ID: <45E987D2.6050603@linuxtv.org> + +From: Mike Isely + +Rework the cx23416 firmware loader so that it longer requires the +firmware size to be a multiple of 8KB. Until recently all cx2341x +firmware images were exactly 256KB, but newer firmware is larger than +that and also appears to have arbitrary size. We still must check +against a multiple of 4 bytes (because the cx23416 itself uses a 32 +bit word size). + +This fix is already in the upstream driver source and has proven +itself there; this is a backport for the 2.6.20.y kernel series. + +(backported from commit 90060d32ca0a941b158994f78e60d0381871c84b) + +Signed-off-by: Mike Isely +Signed-off-by: Michael Krufky +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/media/video/pvrusb2/pvrusb2-hdw.c | 31 ++++++++++++++++-------------- + 1 file changed, 17 insertions(+), 14 deletions(-) + +--- linux-2.6.20.1.orig/drivers/media/video/pvrusb2/pvrusb2-hdw.c ++++ linux-2.6.20.1/drivers/media/video/pvrusb2/pvrusb2-hdw.c +@@ -1041,7 +1041,7 @@ int pvr2_upload_firmware2(struct pvr2_hd + { + const struct firmware *fw_entry = NULL; + void *fw_ptr; +- unsigned int pipe, fw_len, fw_done; ++ unsigned int pipe, fw_len, fw_done, bcnt, icnt; + int actual_length; + int ret = 0; + int fwidx; +@@ -1093,11 +1093,11 @@ int pvr2_upload_firmware2(struct pvr2_hd + + fw_len = fw_entry->size; + +- if (fw_len % FIRMWARE_CHUNK_SIZE) { ++ if (fw_len % sizeof(u32)) { + pvr2_trace(PVR2_TRACE_ERROR_LEGS, + "size of %s firmware" +- " must be a multiple of 8192B", +- fw_files[fwidx]); ++ " must be a multiple of %zu bytes", ++ fw_files[fwidx],sizeof(u32)); + release_firmware(fw_entry); + return -1; + } +@@ -1112,18 +1112,21 @@ int pvr2_upload_firmware2(struct pvr2_hd + + pipe = usb_sndbulkpipe(hdw->usb_dev, PVR2_FIRMWARE_ENDPOINT); + +- for (fw_done = 0 ; (fw_done < fw_len) && !ret ; +- fw_done += FIRMWARE_CHUNK_SIZE ) { +- int i; +- memcpy(fw_ptr, fw_entry->data + fw_done, FIRMWARE_CHUNK_SIZE); +- /* Usbsnoop log shows that we must swap bytes... */ +- for (i = 0; i < FIRMWARE_CHUNK_SIZE/4 ; i++) +- ((u32 *)fw_ptr)[i] = ___swab32(((u32 *)fw_ptr)[i]); ++ fw_done = 0; ++ for (fw_done = 0; fw_done < fw_len;) { ++ bcnt = fw_len - fw_done; ++ if (bcnt > FIRMWARE_CHUNK_SIZE) bcnt = FIRMWARE_CHUNK_SIZE; ++ memcpy(fw_ptr, fw_entry->data + fw_done, bcnt); ++ /* Usbsnoop log shows that we must swap bytes... */ ++ for (icnt = 0; icnt < bcnt/4 ; icnt++) ++ ((u32 *)fw_ptr)[icnt] = ++ ___swab32(((u32 *)fw_ptr)[icnt]); + +- ret |= usb_bulk_msg(hdw->usb_dev, pipe, fw_ptr, +- FIRMWARE_CHUNK_SIZE, ++ ret |= usb_bulk_msg(hdw->usb_dev, pipe, fw_ptr,bcnt, + &actual_length, HZ); +- ret |= (actual_length != FIRMWARE_CHUNK_SIZE); ++ ret |= (actual_length != bcnt); ++ if (ret) break; ++ fw_done += bcnt; + } + + trace_firmware("upload of %s : %i / %i ",