[kernel] r11942 - in dists/sid/linux-2.6/debian: . patches/bugfix/all/stable patches/series
Bastian Blank
waldi at alioth.debian.org
Sat Aug 2 07:03:49 UTC 2008
Author: waldi
Date: Sat Aug 2 07:03:47 2008
New Revision: 11942
Log:
Add stable release 2.6.26.1.
* debian/changelog: Update.
* debian/patches/bugfix/all/stable/2.6.26.1.patch: Add.
* debian/patches/series/2: Add new patch.
Added:
dists/sid/linux-2.6/debian/patches/bugfix/all/stable/2.6.26.1.patch
dists/sid/linux-2.6/debian/patches/series/2
Modified:
dists/sid/linux-2.6/debian/changelog
Modified: dists/sid/linux-2.6/debian/changelog
==============================================================================
--- dists/sid/linux-2.6/debian/changelog (original)
+++ dists/sid/linux-2.6/debian/changelog Sat Aug 2 07:03:47 2008
@@ -2,6 +2,69 @@
* [powerpc] Install arch/powerpc/lib/crtsavres.o into the headers, it is
used during module linking.
+ * Add stable release 2.6.26.1:
+ - Fix off-by-one error in iov_iter_advance()
+ - ath5k: don't enable MSI, we cannot handle it yet
+ - b43legacy: Release mutex in error handling code
+ - cpufreq acpi: only call _PPC after cpufreq ACPI init funcs got called already
+ - VFS: increase pseudo-filesystem block size to PAGE_SIZE
+ - markers: fix markers read barrier for multiple probes
+ - tmpfs: fix kernel BUG in shmem_delete_inode
+ - mpc52xx_psc_spi: fix block transfer
+ - ixgbe: remove device ID for unsupported device
+ - UML - Fix boot crash
+ - eCryptfs: use page_alloc not kmalloc to get a page of memory
+ - x86: fix kernel_physical_mapping_init() for large x86 systems
+ - DVB: cx23885: SRAM changes for the 885 and 887 silicon parts
+ - DVB: cx23885: Reallocated the sram to avoid concurrent VIDB/C issues
+ - DVB: cx23885: DVB Transport cards using DVB port VIDB/TS1 did not stream
+ - DVB: cx23885: Ensure PAD_CTRL is always reset to a sensible default
+ - V4L: cx23885: Bugfix for concurrent use of /dev/video0 and /dev/video1
+ - V4L: saa7134: Copy tuner data earlier to avoid overwriting manual tuner type
+ - V4L: uvcvideo: Add support for Medion Akoya Mini E1210 integrated webcam
+ - V4L: uvcvideo: Make input device support optional
+ - V4L: uvcvideo: Don't free URB buffers on suspend
+ - V4L: uvcvideo: Use GFP_NOIO when allocating memory during resume
+ - V4L: uvcvideo: Fix a buffer overflow in format descriptor parsing
+ - DVB: dib0700: add support for Hauppauge Nova-TD Stick 52009
+ - V4L: cx18: Upgrade to newer firmware & update documentation
+ - ALSA: trident - pause s/pdif output
+ - myri10ge: do not use mgp->max_intr_slots before loading the firmware
+ - myri10ge: do not forget to setup the single slice pointers
+ - iop-adma: fix platform driver hotplug/coldplug
+ - sparc64: Do not define BIO_VMERGE_BOUNDARY.
+ - sparc64: Fix cpufreq notifier registry.
+ - sparc64: Fix lockdep issues in LDC protocol layer.
+ - tcp: Clear probes_out more aggressively in tcp_ack().
+ - ARM: fix fls() for 64-bit arguments
+ - vmlinux.lds: move __attribute__((__cold__)) functions back into final .text section
+ - rtc-at91rm9200: avoid spurious irqs
+ - ide-cd: fix oops when using growisofs
+ - x86: fix crash due to missing debugctlmsr on AMD K6-3
+ - cpusets: fix wrong domain attr updates
+ - proc: fix /proc/*/pagemap some more
+ - Fix build on COMPAT platforms when CONFIG_EPOLL is disabled
+ - markers: fix duplicate modpost entry
+ - x86, suspend, acpi: enter Big Real Mode
+ - USB: fix usb serial pm counter decrement for disconnected interfaces
+ - x86 reboot quirks: add Dell Precision WorkStation T5400
+ - Fix typos from signal_32/64.h merge
+ - rcu: fix rcu_try_flip_waitack_needed() to prevent grace-period stall
+ - Patch Upstream: x86 ptrace: fix PTRACE_GETFPXREGS error
+ - KVM: MMU: Fix potential race setting upper shadow ptes on nonpae hosts
+ - KVM: MMU: nuke shadowed pgtable pages and ptes on memslot destruction
+ - KVM: x86 emulator: Fix HLT instruction
+ - KVM: VMX: Add ept_sync_context in flush_tlb
+ - KVM: mmu_shrink: kvm_mmu_zap_page requires slots_lock to be held
+ - KVM: SVM: fix suspend/resume support
+ - KVM: VMX: Fix a wrong usage of vmcs_config
+ - isofs: fix minor filesystem corruption
+ - quota: fix possible infinite loop in quota code
+ - hdlcdrv: Fix CRC calculation.
+ - ipv6: __KERNEL__ ifdef struct ipv6_devconf
+ - ipv6: use timer pending
+ - udplite: Protection against coverage value wrap-around
+ - pxamci: trivial fix of DMA alignment register bit clearing
-- Bastian Blank <waldi at debian.org> Thu, 31 Jul 2008 19:45:03 +0200
Added: dists/sid/linux-2.6/debian/patches/bugfix/all/stable/2.6.26.1.patch
==============================================================================
--- (empty file)
+++ dists/sid/linux-2.6/debian/patches/bugfix/all/stable/2.6.26.1.patch Sat Aug 2 07:03:47 2008
@@ -0,0 +1,2187 @@
+diff --git a/Documentation/networking/udplite.txt b/Documentation/networking/udplite.txt
+index 3870f28..855d8da 100644
+--- a/Documentation/networking/udplite.txt
++++ b/Documentation/networking/udplite.txt
+@@ -148,7 +148,7 @@
+ getsockopt(sockfd, SOL_SOCKET, SO_NO_CHECK, &value, ...);
+
+ is meaningless (as in TCP). Packets with a zero checksum field are
+- illegal (cf. RFC 3828, sec. 3.1) will be silently discarded.
++ illegal (cf. RFC 3828, sec. 3.1) and will be silently discarded.
+
+ 4) Fragmentation
+
+diff --git a/Documentation/video4linux/cx18.txt b/Documentation/video4linux/cx18.txt
+index 6842c26..63f3aef 100644
+--- a/Documentation/video4linux/cx18.txt
++++ b/Documentation/video4linux/cx18.txt
+@@ -23,14 +23,8 @@ encoder chip:
+
+ Firmware:
+
+-The firmware needs to be extracted from the Windows Hauppauge HVR-1600
+-driver, available here:
++You can obtain the firmware files here:
+
+-http://hauppauge.lightpath.net/software/install_cd/hauppauge_cd_3.4d1.zip
++http://dl.ivtvdriver.org/ivtv/firmware/cx18-firmware.tar.gz
+
+-Unzip, then copy the following files to the firmware directory
+-and rename them as follows:
+-
+-Drivers/Driver18/hcw18apu.rom -> v4l-cx23418-apu.fw
+-Drivers/Driver18/hcw18enc.rom -> v4l-cx23418-cpu.fw
+-Drivers/Driver18/hcw18mlC.rom -> v4l-cx23418-dig.fw
++Untar and copy the .fw files to your firmware directory.
+diff --git a/Makefile b/Makefile
+index e3c5eb6..c536d7b 100644
+diff --git a/arch/ia64/kvm/kvm-ia64.c b/arch/ia64/kvm/kvm-ia64.c
+index 318b811..5152ba0 100644
+--- a/arch/ia64/kvm/kvm-ia64.c
++++ b/arch/ia64/kvm/kvm-ia64.c
+@@ -1460,6 +1460,9 @@ int kvm_arch_set_memory_region(struct kvm *kvm,
+ return 0;
+ }
+
++void kvm_arch_flush_shadow(struct kvm *kvm)
++{
++}
+
+ long kvm_arch_dev_ioctl(struct file *filp,
+ unsigned int ioctl, unsigned long arg)
+diff --git a/arch/powerpc/kvm/powerpc.c b/arch/powerpc/kvm/powerpc.c
+index 777e0f3..1eaa3e4 100644
+--- a/arch/powerpc/kvm/powerpc.c
++++ b/arch/powerpc/kvm/powerpc.c
+@@ -167,6 +167,10 @@ int kvm_arch_set_memory_region(struct kvm *kvm,
+ return 0;
+ }
+
++void kvm_arch_flush_shadow(struct kvm *kvm)
++{
++}
++
+ struct kvm_vcpu *kvm_arch_vcpu_create(struct kvm *kvm, unsigned int id)
+ {
+ struct kvm_vcpu *vcpu;
+diff --git a/arch/powerpc/platforms/cell/cbe_cpufreq_pmi.c b/arch/powerpc/platforms/cell/cbe_cpufreq_pmi.c
+index 69288f6..3233fe8 100644
+--- a/arch/powerpc/platforms/cell/cbe_cpufreq_pmi.c
++++ b/arch/powerpc/platforms/cell/cbe_cpufreq_pmi.c
+@@ -96,6 +96,12 @@ static int pmi_notifier(struct notifier_block *nb,
+ struct cpufreq_frequency_table *cbe_freqs;
+ u8 node;
+
++ /* Should this really be called for CPUFREQ_ADJUST, CPUFREQ_INCOMPATIBLE
++ * and CPUFREQ_NOTIFY policy events?)
++ */
++ if (event == CPUFREQ_START)
++ return 0;
++
+ cbe_freqs = cpufreq_frequency_get_table(policy->cpu);
+ node = cbe_cpu_to_node(policy->cpu);
+
+diff --git a/arch/s390/kvm/kvm-s390.c b/arch/s390/kvm/kvm-s390.c
+index 6558b09..b19c170 100644
+--- a/arch/s390/kvm/kvm-s390.c
++++ b/arch/s390/kvm/kvm-s390.c
+@@ -672,6 +672,10 @@ int kvm_arch_set_memory_region(struct kvm *kvm,
+ return 0;
+ }
+
++void kvm_arch_flush_shadow(struct kvm *kvm)
++{
++}
++
+ gfn_t unalias_gfn(struct kvm *kvm, gfn_t gfn)
+ {
+ return gfn;
+diff --git a/arch/sparc64/kernel/irq.c b/arch/sparc64/kernel/irq.c
+index b441a26..c481673 100644
+--- a/arch/sparc64/kernel/irq.c
++++ b/arch/sparc64/kernel/irq.c
+@@ -621,8 +621,9 @@ unsigned int sun4v_build_irq(u32 devhandle, unsigned int devino)
+ unsigned int sun4v_build_virq(u32 devhandle, unsigned int devino)
+ {
+ struct irq_handler_data *data;
+- struct ino_bucket *bucket;
+ unsigned long hv_err, cookie;
++ struct ino_bucket *bucket;
++ struct irq_desc *desc;
+ unsigned int virt_irq;
+
+ bucket = kzalloc(sizeof(struct ino_bucket), GFP_ATOMIC);
+@@ -643,6 +644,13 @@ unsigned int sun4v_build_virq(u32 devhandle, unsigned int devino)
+ if (unlikely(!data))
+ return 0;
+
++ /* In order to make the LDC channel startup sequence easier,
++ * especially wrt. locking, we do not let request_irq() enable
++ * the interrupt.
++ */
++ desc = irq_desc + virt_irq;
++ desc->status |= IRQ_NOAUTOEN;
++
+ set_irq_chip_data(virt_irq, data);
+
+ /* Catch accidental accesses to these things. IMAP/ICLR handling
+diff --git a/arch/sparc64/kernel/ldc.c b/arch/sparc64/kernel/ldc.c
+index 63969f6..d689823 100644
+--- a/arch/sparc64/kernel/ldc.c
++++ b/arch/sparc64/kernel/ldc.c
+@@ -1,6 +1,6 @@
+ /* ldc.c: Logical Domain Channel link-layer protocol driver.
+ *
+- * Copyright (C) 2007 David S. Miller <davem at davemloft.net>
++ * Copyright (C) 2007, 2008 David S. Miller <davem at davemloft.net>
+ */
+
+ #include <linux/kernel.h>
+@@ -23,8 +23,8 @@
+
+ #define DRV_MODULE_NAME "ldc"
+ #define PFX DRV_MODULE_NAME ": "
+-#define DRV_MODULE_VERSION "1.0"
+-#define DRV_MODULE_RELDATE "June 25, 2007"
++#define DRV_MODULE_VERSION "1.1"
++#define DRV_MODULE_RELDATE "July 22, 2008"
+
+ static char version[] __devinitdata =
+ DRV_MODULE_NAME ".c:v" DRV_MODULE_VERSION " (" DRV_MODULE_RELDATE ")\n";
+@@ -1235,13 +1235,9 @@ int ldc_bind(struct ldc_channel *lp, const char *name)
+ unsigned long hv_err, flags;
+ int err = -EINVAL;
+
+- spin_lock_irqsave(&lp->lock, flags);
+-
+- if (!name)
+- goto out_err;
+-
+- if (lp->state != LDC_STATE_INIT)
+- goto out_err;
++ if (!name ||
++ (lp->state != LDC_STATE_INIT))
++ return -EINVAL;
+
+ snprintf(lp->rx_irq_name, LDC_IRQ_NAME_MAX, "%s RX", name);
+ snprintf(lp->tx_irq_name, LDC_IRQ_NAME_MAX, "%s TX", name);
+@@ -1250,25 +1246,32 @@ int ldc_bind(struct ldc_channel *lp, const char *name)
+ IRQF_SAMPLE_RANDOM | IRQF_SHARED,
+ lp->rx_irq_name, lp);
+ if (err)
+- goto out_err;
++ return err;
+
+ err = request_irq(lp->cfg.tx_irq, ldc_tx,
+ IRQF_SAMPLE_RANDOM | IRQF_SHARED,
+ lp->tx_irq_name, lp);
+- if (err)
+- goto out_free_rx_irq;
++ if (err) {
++ free_irq(lp->cfg.rx_irq, lp);
++ return err;
++ }
++
+
++ spin_lock_irqsave(&lp->lock, flags);
++
++ enable_irq(lp->cfg.rx_irq);
++ enable_irq(lp->cfg.tx_irq);
+
+ lp->flags |= LDC_FLAG_REGISTERED_IRQS;
+
+ err = -ENODEV;
+ hv_err = sun4v_ldc_tx_qconf(lp->id, 0, 0);
+ if (hv_err)
+- goto out_free_tx_irq;
++ goto out_free_irqs;
+
+ hv_err = sun4v_ldc_tx_qconf(lp->id, lp->tx_ra, lp->tx_num_entries);
+ if (hv_err)
+- goto out_free_tx_irq;
++ goto out_free_irqs;
+
+ hv_err = sun4v_ldc_rx_qconf(lp->id, 0, 0);
+ if (hv_err)
+@@ -1304,14 +1307,11 @@ out_unmap_rx:
+ out_unmap_tx:
+ sun4v_ldc_tx_qconf(lp->id, 0, 0);
+
+-out_free_tx_irq:
++out_free_irqs:
+ lp->flags &= ~LDC_FLAG_REGISTERED_IRQS;
+ free_irq(lp->cfg.tx_irq, lp);
+-
+-out_free_rx_irq:
+ free_irq(lp->cfg.rx_irq, lp);
+
+-out_err:
+ spin_unlock_irqrestore(&lp->lock, flags);
+
+ return err;
+diff --git a/arch/sparc64/kernel/time.c b/arch/sparc64/kernel/time.c
+index e5d2389..f464023 100644
+--- a/arch/sparc64/kernel/time.c
++++ b/arch/sparc64/kernel/time.c
+@@ -883,6 +883,16 @@ static struct notifier_block sparc64_cpufreq_notifier_block = {
+ .notifier_call = sparc64_cpufreq_notifier
+ };
+
++static int __init register_sparc64_cpufreq_notifier(void)
++{
++
++ cpufreq_register_notifier(&sparc64_cpufreq_notifier_block,
++ CPUFREQ_TRANSITION_NOTIFIER);
++ return 0;
++}
++
++core_initcall(register_sparc64_cpufreq_notifier);
++
+ #endif /* CONFIG_CPU_FREQ */
+
+ static int sparc64_next_event(unsigned long delta,
+@@ -1049,11 +1059,6 @@ void __init time_init(void)
+ sparc64_clockevent.mult, sparc64_clockevent.shift);
+
+ setup_sparc64_timer();
+-
+-#ifdef CONFIG_CPU_FREQ
+- cpufreq_register_notifier(&sparc64_cpufreq_notifier_block,
+- CPUFREQ_TRANSITION_NOTIFIER);
+-#endif
+ }
+
+ unsigned long long sched_clock(void)
+diff --git a/arch/um/include/init.h b/arch/um/include/init.h
+index b00a957..37dd097 100644
+--- a/arch/um/include/init.h
++++ b/arch/um/include/init.h
+@@ -45,6 +45,8 @@ typedef void (*exitcall_t)(void);
+ # define __section(S) __attribute__ ((__section__(#S)))
+ #endif
+
++#if __GNUC__ == 3
++
+ #if __GNUC_MINOR__ >= 3
+ # define __used __attribute__((__used__))
+ #else
+@@ -52,6 +54,12 @@ typedef void (*exitcall_t)(void);
+ #endif
+
+ #else
++#if __GNUC__ == 4
++# define __used __attribute__((__used__))
++#endif
++#endif
++
++#else
+ #include <linux/compiler.h>
+ #endif
+ /* These are for everybody (although not all archs will actually
+diff --git a/arch/x86/Kconfig.cpu b/arch/x86/Kconfig.cpu
+index 2ad6301..dd138a2 100644
+--- a/arch/x86/Kconfig.cpu
++++ b/arch/x86/Kconfig.cpu
+@@ -414,4 +414,4 @@ config X86_MINIMUM_CPU_FAMILY
+
+ config X86_DEBUGCTLMSR
+ def_bool y
+- depends on !(M586MMX || M586TSC || M586 || M486 || M386)
++ depends on !(MK6 || MWINCHIPC6 || MWINCHIP2 || MWINCHIP3D || MCYRIXIII || M586MMX || M586TSC || M586 || M486 || M386)
+diff --git a/arch/x86/kernel/acpi/sleep.c b/arch/x86/kernel/acpi/sleep.c
+index 36af01f..130711f 100644
+--- a/arch/x86/kernel/acpi/sleep.c
++++ b/arch/x86/kernel/acpi/sleep.c
+@@ -23,6 +23,15 @@ static unsigned long acpi_realmode;
+ static char temp_stack[10240];
+ #endif
+
++/* XXX: this macro should move to asm-x86/segment.h and be shared with the
++ boot code... */
++#define GDT_ENTRY(flags, base, limit) \
++ (((u64)(base & 0xff000000) << 32) | \
++ ((u64)flags << 40) | \
++ ((u64)(limit & 0x00ff0000) << 32) | \
++ ((u64)(base & 0x00ffffff) << 16) | \
++ ((u64)(limit & 0x0000ffff)))
++
+ /**
+ * acpi_save_state_mem - save kernel state
+ *
+@@ -58,11 +67,11 @@ int acpi_save_state_mem(void)
+ ((char *)&header->wakeup_gdt - (char *)acpi_realmode))
+ << 16);
+ /* GDT[1]: real-mode-like code segment */
+- header->wakeup_gdt[1] = (0x009bULL << 40) +
+- ((u64)acpi_wakeup_address << 16) + 0xffff;
++ header->wakeup_gdt[1] =
++ GDT_ENTRY(0x809b, acpi_wakeup_address, 0xfffff);
+ /* GDT[2]: real-mode-like data segment */
+- header->wakeup_gdt[2] = (0x0093ULL << 40) +
+- ((u64)acpi_wakeup_address << 16) + 0xffff;
++ header->wakeup_gdt[2] =
++ GDT_ENTRY(0x8093, acpi_wakeup_address, 0xfffff);
+
+ #ifndef CONFIG_64BIT
+ store_gdt((struct desc_ptr *)&header->pmode_gdt);
+diff --git a/arch/x86/kernel/i387.c b/arch/x86/kernel/i387.c
+index 95e80e5..eb9ddd8 100644
+--- a/arch/x86/kernel/i387.c
++++ b/arch/x86/kernel/i387.c
+@@ -162,7 +162,7 @@ int xfpregs_get(struct task_struct *target, const struct user_regset *regset,
+ int ret;
+
+ if (!cpu_has_fxsr)
+- return -EIO;
++ return -ENODEV;
+
+ ret = init_fpu(target);
+ if (ret)
+@@ -179,7 +179,7 @@ int xfpregs_set(struct task_struct *target, const struct user_regset *regset,
+ int ret;
+
+ if (!cpu_has_fxsr)
+- return -EIO;
++ return -ENODEV;
+
+ ret = init_fpu(target);
+ if (ret)
+diff --git a/arch/x86/kernel/ptrace.c b/arch/x86/kernel/ptrace.c
+index a7835f2..77040b6 100644
+--- a/arch/x86/kernel/ptrace.c
++++ b/arch/x86/kernel/ptrace.c
+@@ -943,13 +943,13 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
+ return copy_regset_to_user(child, &user_x86_32_view,
+ REGSET_XFP,
+ 0, sizeof(struct user_fxsr_struct),
+- datap);
++ datap) ? -EIO : 0;
+
+ case PTRACE_SETFPXREGS: /* Set the child extended FPU state. */
+ return copy_regset_from_user(child, &user_x86_32_view,
+ REGSET_XFP,
+ 0, sizeof(struct user_fxsr_struct),
+- datap);
++ datap) ? -EIO : 0;
+ #endif
+
+ #if defined CONFIG_X86_32 || defined CONFIG_IA32_EMULATION
+diff --git a/arch/x86/kernel/reboot.c b/arch/x86/kernel/reboot.c
+index f6be7d5..d834b36 100644
+--- a/arch/x86/kernel/reboot.c
++++ b/arch/x86/kernel/reboot.c
+@@ -177,6 +177,14 @@ static struct dmi_system_id __initdata reboot_dmi_table[] = {
+ DMI_MATCH(DMI_PRODUCT_NAME, "PowerEdge 2400"),
+ },
+ },
++ { /* Handle problems with rebooting on Dell T5400's */
++ .callback = set_bios_reboot,
++ .ident = "Dell Precision T5400",
++ .matches = {
++ DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
++ DMI_MATCH(DMI_PRODUCT_NAME, "Precision WorkStation T5400"),
++ },
++ },
+ { /* Handle problems with rebooting on HP laptops */
+ .callback = set_bios_reboot,
+ .ident = "HP Compaq Laptop",
+diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c
+index 7e7c396..c26d811 100644
+--- a/arch/x86/kvm/mmu.c
++++ b/arch/x86/kvm/mmu.c
+@@ -1171,9 +1171,10 @@ static int __direct_map(struct kvm_vcpu *vcpu, gpa_t v, int write,
+ return -ENOMEM;
+ }
+
+- table[index] = __pa(new_table->spt)
+- | PT_PRESENT_MASK | PT_WRITABLE_MASK
+- | shadow_user_mask | shadow_x_mask;
++ set_shadow_pte(&table[index],
++ __pa(new_table->spt)
++ | PT_PRESENT_MASK | PT_WRITABLE_MASK
++ | shadow_user_mask | shadow_x_mask);
+ }
+ table_addr = table[index] & PT64_BASE_ADDR_MASK;
+ }
+@@ -1968,6 +1969,8 @@ static int mmu_shrink(int nr_to_scan, gfp_t gfp_mask)
+ list_for_each_entry(kvm, &vm_list, vm_list) {
+ int npages;
+
++ if (!down_read_trylock(&kvm->slots_lock))
++ continue;
+ spin_lock(&kvm->mmu_lock);
+ npages = kvm->arch.n_alloc_mmu_pages -
+ kvm->arch.n_free_mmu_pages;
+@@ -1980,6 +1983,7 @@ static int mmu_shrink(int nr_to_scan, gfp_t gfp_mask)
+ nr_to_scan--;
+
+ spin_unlock(&kvm->mmu_lock);
++ up_read(&kvm->slots_lock);
+ }
+ if (kvm_freed)
+ list_move_tail(&kvm_freed->vm_list, &vm_list);
+diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c
+index 6b0d5fa..06992d6 100644
+--- a/arch/x86/kvm/svm.c
++++ b/arch/x86/kvm/svm.c
+@@ -270,19 +270,11 @@ static int has_svm(void)
+
+ static void svm_hardware_disable(void *garbage)
+ {
+- struct svm_cpu_data *svm_data
+- = per_cpu(svm_data, raw_smp_processor_id());
+-
+- if (svm_data) {
+- uint64_t efer;
++ uint64_t efer;
+
+- wrmsrl(MSR_VM_HSAVE_PA, 0);
+- rdmsrl(MSR_EFER, efer);
+- wrmsrl(MSR_EFER, efer & ~MSR_EFER_SVME_MASK);
+- per_cpu(svm_data, raw_smp_processor_id()) = NULL;
+- __free_page(svm_data->save_area);
+- kfree(svm_data);
+- }
++ wrmsrl(MSR_VM_HSAVE_PA, 0);
++ rdmsrl(MSR_EFER, efer);
++ wrmsrl(MSR_EFER, efer & ~MSR_EFER_SVME_MASK);
+ }
+
+ static void svm_hardware_enable(void *garbage)
+@@ -321,6 +313,19 @@ static void svm_hardware_enable(void *garbage)
+ page_to_pfn(svm_data->save_area) << PAGE_SHIFT);
+ }
+
++static void svm_cpu_uninit(int cpu)
++{
++ struct svm_cpu_data *svm_data
++ = per_cpu(svm_data, raw_smp_processor_id());
++
++ if (!svm_data)
++ return;
++
++ per_cpu(svm_data, raw_smp_processor_id()) = NULL;
++ __free_page(svm_data->save_area);
++ kfree(svm_data);
++}
++
+ static int svm_cpu_init(int cpu)
+ {
+ struct svm_cpu_data *svm_data;
+@@ -458,6 +463,11 @@ err:
+
+ static __exit void svm_hardware_unsetup(void)
+ {
++ int cpu;
++
++ for_each_online_cpu(cpu)
++ svm_cpu_uninit(cpu);
++
+ __free_pages(pfn_to_page(iopm_base >> PAGE_SHIFT), IOPM_ALLOC_ORDER);
+ iopm_base = 0;
+ }
+diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c
+index 540e951..2ce9063 100644
+--- a/arch/x86/kvm/vmx.c
++++ b/arch/x86/kvm/vmx.c
+@@ -88,6 +88,7 @@ static inline struct vcpu_vmx *to_vmx(struct kvm_vcpu *vcpu)
+ }
+
+ static int init_rmode(struct kvm *kvm);
++static u64 construct_eptp(unsigned long root_hpa);
+
+ static DEFINE_PER_CPU(struct vmcs *, vmxarea);
+ static DEFINE_PER_CPU(struct vmcs *, current_vmcs);
+@@ -1389,6 +1390,8 @@ static void exit_lmode(struct kvm_vcpu *vcpu)
+ static void vmx_flush_tlb(struct kvm_vcpu *vcpu)
+ {
+ vpid_sync_vcpu_all(to_vmx(vcpu));
++ if (vm_need_ept())
++ ept_sync_context(construct_eptp(vcpu->arch.mmu.root_hpa));
+ }
+
+ static void vmx_decache_cr4_guest_bits(struct kvm_vcpu *vcpu)
+@@ -1420,7 +1423,7 @@ static void ept_update_paging_mode_cr0(unsigned long *hw_cr0,
+ if (!(cr0 & X86_CR0_PG)) {
+ /* From paging/starting to nonpaging */
+ vmcs_write32(CPU_BASED_VM_EXEC_CONTROL,
+- vmcs_config.cpu_based_exec_ctrl |
++ vmcs_read32(CPU_BASED_VM_EXEC_CONTROL) |
+ (CPU_BASED_CR3_LOAD_EXITING |
+ CPU_BASED_CR3_STORE_EXITING));
+ vcpu->arch.cr0 = cr0;
+@@ -1430,7 +1433,7 @@ static void ept_update_paging_mode_cr0(unsigned long *hw_cr0,
+ } else if (!is_paging(vcpu)) {
+ /* From nonpaging to paging */
+ vmcs_write32(CPU_BASED_VM_EXEC_CONTROL,
+- vmcs_config.cpu_based_exec_ctrl &
++ vmcs_read32(CPU_BASED_VM_EXEC_CONTROL) &
+ ~(CPU_BASED_CR3_LOAD_EXITING |
+ CPU_BASED_CR3_STORE_EXITING));
+ vcpu->arch.cr0 = cr0;
+diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
+index 63a77ca..5a7406e 100644
+--- a/arch/x86/kvm/x86.c
++++ b/arch/x86/kvm/x86.c
+@@ -4016,6 +4016,11 @@ int kvm_arch_set_memory_region(struct kvm *kvm,
+ return 0;
+ }
+
++void kvm_arch_flush_shadow(struct kvm *kvm)
++{
++ kvm_mmu_zap_all(kvm);
++}
++
+ int kvm_arch_vcpu_runnable(struct kvm_vcpu *vcpu)
+ {
+ return vcpu->arch.mp_state == KVM_MP_STATE_RUNNABLE
+diff --git a/arch/x86/kvm/x86_emulate.c b/arch/x86/kvm/x86_emulate.c
+index 932f216..d41b9bc 100644
+--- a/arch/x86/kvm/x86_emulate.c
++++ b/arch/x86/kvm/x86_emulate.c
+@@ -1666,7 +1666,7 @@ special_insn:
+ break;
+ case 0xf4: /* hlt */
+ ctxt->vcpu->arch.halt_request = 1;
+- goto done;
++ break;
+ case 0xf5: /* cmc */
+ /* complement carry flag from eflags reg */
+ ctxt->eflags ^= EFLG_CF;
+diff --git a/arch/x86/mm/init_64.c b/arch/x86/mm/init_64.c
+index 819dad9..7b27710 100644
+--- a/arch/x86/mm/init_64.c
++++ b/arch/x86/mm/init_64.c
+@@ -579,7 +579,7 @@ unsigned long __init_refok init_memory_mapping(unsigned long start, unsigned lon
+ else
+ pud = alloc_low_page(&pud_phys);
+
+- next = start + PGDIR_SIZE;
++ next = (start + PGDIR_SIZE) & PGDIR_MASK;
+ if (next > end)
+ next = end;
+ last_map_addr = phys_pud_init(pud, __pa(start), __pa(next));
+diff --git a/drivers/acpi/processor_perflib.c b/drivers/acpi/processor_perflib.c
+index d80b2d1..8c06a53 100644
+--- a/drivers/acpi/processor_perflib.c
++++ b/drivers/acpi/processor_perflib.c
+@@ -64,7 +64,13 @@ static DEFINE_MUTEX(performance_mutex);
+ * policy is adjusted accordingly.
+ */
+
+-static unsigned int ignore_ppc = 0;
++/* ignore_ppc:
++ * -1 -> cpufreq low level drivers not initialized -> _PSS, etc. not called yet
++ * ignore _PPC
++ * 0 -> cpufreq low level drivers initialized -> consider _PPC values
++ * 1 -> ignore _PPC totally -> forced by user through boot param
++ */
++static unsigned int ignore_ppc = -1;
+ module_param(ignore_ppc, uint, 0644);
+ MODULE_PARM_DESC(ignore_ppc, "If the frequency of your machine gets wrongly" \
+ "limited by BIOS, this should help");
+@@ -72,7 +78,7 @@ MODULE_PARM_DESC(ignore_ppc, "If the frequency of your machine gets wrongly" \
+ #define PPC_REGISTERED 1
+ #define PPC_IN_USE 2
+
+-static int acpi_processor_ppc_status = 0;
++static int acpi_processor_ppc_status;
+
+ static int acpi_processor_ppc_notifier(struct notifier_block *nb,
+ unsigned long event, void *data)
+@@ -81,6 +87,11 @@ static int acpi_processor_ppc_notifier(struct notifier_block *nb,
+ struct acpi_processor *pr;
+ unsigned int ppc = 0;
+
++ if (event == CPUFREQ_START && ignore_ppc <= 0) {
++ ignore_ppc = 0;
++ return 0;
++ }
++
+ if (ignore_ppc)
+ return 0;
+
+diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c
+index 1d41496..0471ef5 100644
+--- a/drivers/cpufreq/cpufreq.c
++++ b/drivers/cpufreq/cpufreq.c
+@@ -825,6 +825,9 @@ static int cpufreq_add_dev(struct sys_device *sys_dev)
+ policy->user_policy.min = policy->cpuinfo.min_freq;
+ policy->user_policy.max = policy->cpuinfo.max_freq;
+
++ blocking_notifier_call_chain(&cpufreq_policy_notifier_list,
++ CPUFREQ_START, policy);
++
+ #ifdef CONFIG_SMP
+
+ #ifdef CONFIG_HOTPLUG_CPU
+diff --git a/drivers/dma/iop-adma.c b/drivers/dma/iop-adma.c
+index 0ec0f43..4e6b052 100644
+--- a/drivers/dma/iop-adma.c
++++ b/drivers/dma/iop-adma.c
+@@ -1387,6 +1387,8 @@ static void iop_chan_start_null_xor(struct iop_adma_chan *iop_chan)
+ spin_unlock_bh(&iop_chan->lock);
+ }
+
++MODULE_ALIAS("platform:iop-adma");
++
+ static struct platform_driver iop_adma_driver = {
+ .probe = iop_adma_probe,
+ .remove = iop_adma_remove,
+diff --git a/drivers/ide/ide-cd.c b/drivers/ide/ide-cd.c
+index 68e7f19..0cc854e 100644
+--- a/drivers/ide/ide-cd.c
++++ b/drivers/ide/ide-cd.c
+@@ -1308,13 +1308,30 @@ static int cdrom_read_capacity(ide_drive_t *drive, unsigned long *capacity,
+ req.cmd_flags |= REQ_QUIET;
+
+ stat = ide_cd_queue_pc(drive, &req);
+- if (stat == 0) {
+- *capacity = 1 + be32_to_cpu(capbuf.lba);
+- *sectors_per_frame =
+- be32_to_cpu(capbuf.blocklen) >> SECTOR_BITS;
++ if (stat)
++ return stat;
++
++ /*
++ * Sanity check the given block size
++ */
++ switch (capbuf.blocklen) {
++ case __constant_cpu_to_be32(512):
++ case __constant_cpu_to_be32(1024):
++ case __constant_cpu_to_be32(2048):
++ case __constant_cpu_to_be32(4096):
++ break;
++ default:
++ printk(KERN_ERR "%s: weird block size %u\n",
++ drive->name, capbuf.blocklen);
++ printk(KERN_ERR "%s: default to 2kb block size\n",
++ drive->name);
++ capbuf.blocklen = __constant_cpu_to_be32(2048);
++ break;
+ }
+
+- return stat;
++ *capacity = 1 + be32_to_cpu(capbuf.lba);
++ *sectors_per_frame = be32_to_cpu(capbuf.blocklen) >> SECTOR_BITS;
++ return 0;
+ }
+
+ static int cdrom_read_tocentry(ide_drive_t *drive, int trackno, int msf_flag,
+diff --git a/drivers/media/dvb/dvb-usb/dib0700_devices.c b/drivers/media/dvb/dvb-usb/dib0700_devices.c
+index c4d40fe..3dd20bf 100644
+--- a/drivers/media/dvb/dvb-usb/dib0700_devices.c
++++ b/drivers/media/dvb/dvb-usb/dib0700_devices.c
+@@ -1117,6 +1117,7 @@ struct usb_device_id dib0700_usb_id_table[] = {
+ { USB_DEVICE(USB_VID_TERRATEC, USB_PID_TERRATEC_CINERGY_HT_EXPRESS) },
+ { USB_DEVICE(USB_VID_TERRATEC, USB_PID_TERRATEC_CINERGY_T_XXS) },
+ { USB_DEVICE(USB_VID_LEADTEK, USB_PID_WINFAST_DTV_DONGLE_STK7700P_2) },
++ { USB_DEVICE(USB_VID_HAUPPAUGE, USB_PID_HAUPPAUGE_NOVA_TD_STICK_52009) },
+ { 0 } /* Terminating entry */
+ };
+ MODULE_DEVICE_TABLE(usb, dib0700_usb_id_table);
+@@ -1372,7 +1373,7 @@ struct dvb_usb_device_properties dib0700_devices[] = {
+ }
+ },
+
+- .num_device_descs = 2,
++ .num_device_descs = 3,
+ .devices = {
+ { "DiBcom STK7070PD reference design",
+ { &dib0700_usb_id_table[17], NULL },
+@@ -1381,6 +1382,10 @@ struct dvb_usb_device_properties dib0700_devices[] = {
+ { "Pinnacle PCTV Dual DVB-T Diversity Stick",
+ { &dib0700_usb_id_table[18], NULL },
+ { NULL },
++ },
++ { "Hauppauge Nova-TD Stick (52009)",
++ { &dib0700_usb_id_table[35], NULL },
++ { NULL },
+ }
+ }
+ }, { DIB0700_DEFAULT_DEVICE_PROPERTIES,
+diff --git a/drivers/media/dvb/dvb-usb/dvb-usb-ids.h b/drivers/media/dvb/dvb-usb/dvb-usb-ids.h
+index 34245d1..31ded10 100644
+--- a/drivers/media/dvb/dvb-usb/dvb-usb-ids.h
++++ b/drivers/media/dvb/dvb-usb/dvb-usb-ids.h
+@@ -132,6 +132,7 @@
+ #define USB_PID_HAUPPAUGE_NOVA_T_STICK_3 0x7070
+ #define USB_PID_HAUPPAUGE_MYTV_T 0x7080
+ #define USB_PID_HAUPPAUGE_NOVA_TD_STICK 0x9580
++#define USB_PID_HAUPPAUGE_NOVA_TD_STICK_52009 0x5200
+ #define USB_PID_AVERMEDIA_EXPRESS 0xb568
+ #define USB_PID_AVERMEDIA_VOLAR 0xa807
+ #define USB_PID_AVERMEDIA_VOLAR_2 0xb808
+diff --git a/drivers/media/video/Kconfig b/drivers/media/video/Kconfig
+index 5ccb0ae..e00717d 100644
+--- a/drivers/media/video/Kconfig
++++ b/drivers/media/video/Kconfig
+@@ -793,13 +793,7 @@ menuconfig V4L_USB_DRIVERS
+
+ if V4L_USB_DRIVERS && USB
+
+-config USB_VIDEO_CLASS
+- tristate "USB Video Class (UVC)"
+- ---help---
+- Support for the USB Video Class (UVC). Currently only video
+- input devices, such as webcams, are supported.
+-
+- For more information see: <http://linux-uvc.berlios.de/>
++source "drivers/media/video/uvc/Kconfig"
+
+ source "drivers/media/video/pvrusb2/Kconfig"
+
+diff --git a/drivers/media/video/cx18/cx18-firmware.c b/drivers/media/video/cx18/cx18-firmware.c
+index 2694ce3..9dda2ca 100644
+--- a/drivers/media/video/cx18/cx18-firmware.c
++++ b/drivers/media/video/cx18/cx18-firmware.c
+@@ -90,7 +90,7 @@
+ #define CX18_DSP0_INTERRUPT_MASK 0xd0004C
+
+ /* Encoder/decoder firmware sizes */
+-#define CX18_FW_CPU_SIZE (174716)
++#define CX18_FW_CPU_SIZE (158332)
+ #define CX18_FW_APU_SIZE (141200)
+
+ #define APU_ROM_SYNC1 0x6D676553 /* "mgeS" */
+diff --git a/drivers/media/video/cx23885/cx23885-core.c b/drivers/media/video/cx23885/cx23885-core.c
+index c4cc2f3..ad143f1 100644
+--- a/drivers/media/video/cx23885/cx23885-core.c
++++ b/drivers/media/video/cx23885/cx23885-core.c
+@@ -76,6 +76,117 @@ LIST_HEAD(cx23885_devlist);
+ * 0x00010ea0 0x00010xxx Free
+ */
+
++static struct sram_channel cx23885_sram_channels[] = {
++ [SRAM_CH01] = {
++ .name = "VID A",
++ .cmds_start = 0x10000,
++ .ctrl_start = 0x10380,
++ .cdt = 0x104c0,
++ .fifo_start = 0x40,
++ .fifo_size = 0x2800,
++ .ptr1_reg = DMA1_PTR1,
++ .ptr2_reg = DMA1_PTR2,
++ .cnt1_reg = DMA1_CNT1,
++ .cnt2_reg = DMA1_CNT2,
++ },
++ [SRAM_CH02] = {
++ .name = "ch2",
++ .cmds_start = 0x0,
++ .ctrl_start = 0x0,
++ .cdt = 0x0,
++ .fifo_start = 0x0,
++ .fifo_size = 0x0,
++ .ptr1_reg = DMA2_PTR1,
++ .ptr2_reg = DMA2_PTR2,
++ .cnt1_reg = DMA2_CNT1,
++ .cnt2_reg = DMA2_CNT2,
++ },
++ [SRAM_CH03] = {
++ .name = "TS1 B",
++ .cmds_start = 0x100A0,
++ .ctrl_start = 0x10400,
++ .cdt = 0x10580,
++ .fifo_start = 0x5000,
++ .fifo_size = 0x1000,
++ .ptr1_reg = DMA3_PTR1,
++ .ptr2_reg = DMA3_PTR2,
++ .cnt1_reg = DMA3_CNT1,
++ .cnt2_reg = DMA3_CNT2,
++ },
++ [SRAM_CH04] = {
++ .name = "ch4",
++ .cmds_start = 0x0,
++ .ctrl_start = 0x0,
++ .cdt = 0x0,
++ .fifo_start = 0x0,
++ .fifo_size = 0x0,
++ .ptr1_reg = DMA4_PTR1,
++ .ptr2_reg = DMA4_PTR2,
++ .cnt1_reg = DMA4_CNT1,
++ .cnt2_reg = DMA4_CNT2,
++ },
++ [SRAM_CH05] = {
++ .name = "ch5",
++ .cmds_start = 0x0,
++ .ctrl_start = 0x0,
++ .cdt = 0x0,
++ .fifo_start = 0x0,
++ .fifo_size = 0x0,
++ .ptr1_reg = DMA5_PTR1,
++ .ptr2_reg = DMA5_PTR2,
++ .cnt1_reg = DMA5_CNT1,
++ .cnt2_reg = DMA5_CNT2,
++ },
++ [SRAM_CH06] = {
++ .name = "TS2 C",
++ .cmds_start = 0x10140,
++ .ctrl_start = 0x10440,
++ .cdt = 0x105e0,
++ .fifo_start = 0x6000,
++ .fifo_size = 0x1000,
++ .ptr1_reg = DMA5_PTR1,
++ .ptr2_reg = DMA5_PTR2,
++ .cnt1_reg = DMA5_CNT1,
++ .cnt2_reg = DMA5_CNT2,
++ },
++ [SRAM_CH07] = {
++ .name = "ch7",
++ .cmds_start = 0x0,
++ .ctrl_start = 0x0,
++ .cdt = 0x0,
++ .fifo_start = 0x0,
++ .fifo_size = 0x0,
++ .ptr1_reg = DMA6_PTR1,
++ .ptr2_reg = DMA6_PTR2,
++ .cnt1_reg = DMA6_CNT1,
++ .cnt2_reg = DMA6_CNT2,
++ },
++ [SRAM_CH08] = {
++ .name = "ch8",
++ .cmds_start = 0x0,
++ .ctrl_start = 0x0,
++ .cdt = 0x0,
++ .fifo_start = 0x0,
++ .fifo_size = 0x0,
++ .ptr1_reg = DMA7_PTR1,
++ .ptr2_reg = DMA7_PTR2,
++ .cnt1_reg = DMA7_CNT1,
++ .cnt2_reg = DMA7_CNT2,
++ },
++ [SRAM_CH09] = {
++ .name = "ch9",
++ .cmds_start = 0x0,
++ .ctrl_start = 0x0,
++ .cdt = 0x0,
++ .fifo_start = 0x0,
++ .fifo_size = 0x0,
++ .ptr1_reg = DMA8_PTR1,
++ .ptr2_reg = DMA8_PTR2,
++ .cnt1_reg = DMA8_CNT1,
++ .cnt2_reg = DMA8_CNT2,
++ },
++};
++
+ static struct sram_channel cx23887_sram_channels[] = {
+ [SRAM_CH01] = {
+ .name = "VID A",
+@@ -104,8 +215,8 @@ static struct sram_channel cx23887_sram_channels[] = {
+ [SRAM_CH03] = {
+ .name = "TS1 B",
+ .cmds_start = 0x100A0,
+- .ctrl_start = 0x10780,
+- .cdt = 0x10400,
++ .ctrl_start = 0x10630,
++ .cdt = 0x10870,
+ .fifo_start = 0x5000,
+ .fifo_size = 0x1000,
+ .ptr1_reg = DMA3_PTR1,
+@@ -140,7 +251,7 @@ static struct sram_channel cx23887_sram_channels[] = {
+ [SRAM_CH06] = {
+ .name = "TS2 C",
+ .cmds_start = 0x10140,
+- .ctrl_start = 0x10680,
++ .ctrl_start = 0x10670,
+ .cdt = 0x108d0,
+ .fifo_start = 0x6000,
+ .fifo_size = 0x1000,
+@@ -460,6 +571,7 @@ static void cx23885_reset(struct cx23885_dev *dev)
+ cx_write(AUDIO_INT_INT_STAT, 0xffffffff);
+ cx_write(AUDIO_EXT_INT_STAT, 0xffffffff);
+ cx_write(CLK_DELAY, cx_read(CLK_DELAY) & 0x80000000);
++ cx_write(PAD_CTRL, 0x00500300);
+
+ mdelay(100);
+
+@@ -625,7 +737,6 @@ static int cx23885_dev_setup(struct cx23885_dev *dev)
+ atomic_inc(&dev->refcount);
+
+ dev->nr = cx23885_devcount++;
+- dev->sram_channels = cx23887_sram_channels;
+ sprintf(dev->name, "cx23885[%d]", dev->nr);
+
+ mutex_lock(&devlist);
+@@ -637,11 +748,13 @@ static int cx23885_dev_setup(struct cx23885_dev *dev)
+ dev->bridge = CX23885_BRIDGE_887;
+ /* Apply a sensible clock frequency for the PCIe bridge */
+ dev->clk_freq = 25000000;
++ dev->sram_channels = cx23887_sram_channels;
+ } else
+ if(dev->pci->device == 0x8852) {
+ dev->bridge = CX23885_BRIDGE_885;
+ /* Apply a sensible clock frequency for the PCIe bridge */
+ dev->clk_freq = 28000000;
++ dev->sram_channels = cx23885_sram_channels;
+ } else
+ BUG();
+
+@@ -1042,6 +1155,9 @@ static int cx23885_start_dma(struct cx23885_tsport *port,
+ dprintk(1, "%s() w: %d, h: %d, f: %d\n", __func__,
+ buf->vb.width, buf->vb.height, buf->vb.field);
+
++ /* Stop the fifo and risc engine for this port */
++ cx_clear(port->reg_dma_ctl, port->dma_ctl_val);
++
+ /* setup fifo + format */
+ cx23885_sram_channel_setup(dev,
+ &dev->sram_channels[ port->sram_chno ],
+@@ -1083,7 +1199,21 @@ static int cx23885_start_dma(struct cx23885_tsport *port,
+ cx_write(port->reg_gpcnt_ctl, 3);
+ q->count = 1;
+
+- if (cx23885_boards[dev->board].portb & CX23885_MPEG_ENCODER) {
++ /* Set VIDB pins to input */
++ if (cx23885_boards[dev->board].portb == CX23885_MPEG_DVB) {
++ reg = cx_read(PAD_CTRL);
++ reg &= ~0x3; /* Clear TS1_OE & TS1_SOP_OE */
++ cx_write(PAD_CTRL, reg);
++ }
++
++ /* Set VIDC pins to input */
++ if (cx23885_boards[dev->board].portc == CX23885_MPEG_DVB) {
++ reg = cx_read(PAD_CTRL);
++ reg &= ~0x4; /* Clear TS2_SOP_OE */
++ cx_write(PAD_CTRL, reg);
++ }
++
++ if (cx23885_boards[dev->board].portb == CX23885_MPEG_ENCODER) {
+
+ reg = cx_read(PAD_CTRL);
+ reg = reg & ~0x1; /* Clear TS1_OE */
+@@ -1133,7 +1263,7 @@ static int cx23885_stop_dma(struct cx23885_tsport *port)
+ cx_clear(port->reg_ts_int_msk, port->ts_int_msk_val);
+ cx_clear(port->reg_dma_ctl, port->dma_ctl_val);
+
+- if (cx23885_boards[dev->board].portb & CX23885_MPEG_ENCODER) {
++ if (cx23885_boards[dev->board].portb == CX23885_MPEG_ENCODER) {
+
+ reg = cx_read(PAD_CTRL);
+
+diff --git a/drivers/media/video/saa7134/saa7134-cards.c b/drivers/media/video/saa7134/saa7134-cards.c
+index 2618cfa..0227cf9 100644
+--- a/drivers/media/video/saa7134/saa7134-cards.c
++++ b/drivers/media/video/saa7134/saa7134-cards.c
+@@ -5703,9 +5703,6 @@ int saa7134_board_init2(struct saa7134_dev *dev)
+ unsigned char buf;
+ int board;
+
+- dev->tuner_type = saa7134_boards[dev->board].tuner_type;
+- dev->tuner_addr = saa7134_boards[dev->board].tuner_addr;
+-
+ switch (dev->board) {
+ case SAA7134_BOARD_BMK_MPEX_NOTUNER:
+ case SAA7134_BOARD_BMK_MPEX_TUNER:
+diff --git a/drivers/media/video/saa7134/saa7134-core.c b/drivers/media/video/saa7134/saa7134-core.c
+index 2c19cd0..69f340d 100644
+--- a/drivers/media/video/saa7134/saa7134-core.c
++++ b/drivers/media/video/saa7134/saa7134-core.c
+@@ -946,11 +946,12 @@ static int __devinit saa7134_initdev(struct pci_dev *pci_dev,
+ dev->board = SAA7134_BOARD_UNKNOWN;
+ }
+ dev->autodetected = card[dev->nr] != dev->board;
+- dev->tuner_type = saa7134_boards[dev->board].tuner_type;
++ dev->tuner_type = saa7134_boards[dev->board].tuner_type;
++ dev->tuner_addr = saa7134_boards[dev->board].tuner_addr;
+ dev->tda9887_conf = saa7134_boards[dev->board].tda9887_conf;
+ if (UNSET != tuner[dev->nr])
+ dev->tuner_type = tuner[dev->nr];
+- printk(KERN_INFO "%s: subsystem: %04x:%04x, board: %s [card=%d,%s]\n",
++ printk(KERN_INFO "%s: subsystem: %04x:%04x, board: %s [card=%d,%s]\n",
+ dev->name,pci_dev->subsystem_vendor,
+ pci_dev->subsystem_device,saa7134_boards[dev->board].name,
+ dev->board, dev->autodetected ?
+diff --git a/drivers/media/video/uvc/Kconfig b/drivers/media/video/uvc/Kconfig
+new file mode 100644
+index 0000000..c2d9760
+--- /dev/null
++++ b/drivers/media/video/uvc/Kconfig
+@@ -0,0 +1,17 @@
++config USB_VIDEO_CLASS
++ tristate "USB Video Class (UVC)"
++ ---help---
++ Support for the USB Video Class (UVC). Currently only video
++ input devices, such as webcams, are supported.
++
++ For more information see: <http://linux-uvc.berlios.de/>
++
++config USB_VIDEO_CLASS_INPUT_EVDEV
++ bool "UVC input events device support"
++ default y
++ depends on USB_VIDEO_CLASS && INPUT
++ ---help---
++ This option makes USB Video Class devices register an input device
++ to report button events.
++
++ If you are in doubt, say Y.
+diff --git a/drivers/media/video/uvc/uvc_driver.c b/drivers/media/video/uvc/uvc_driver.c
+index 60ced58..9d954d2 100644
+--- a/drivers/media/video/uvc/uvc_driver.c
++++ b/drivers/media/video/uvc/uvc_driver.c
+@@ -298,7 +298,8 @@ static int uvc_parse_format(struct uvc_device *dev,
+ switch (buffer[2]) {
+ case VS_FORMAT_UNCOMPRESSED:
+ case VS_FORMAT_FRAME_BASED:
+- if (buflen < 27) {
++ n = buffer[2] == VS_FORMAT_UNCOMPRESSED ? 27 : 28;
++ if (buflen < n) {
+ uvc_trace(UVC_TRACE_DESCR, "device %d videostreaming"
+ "interface %d FORMAT error\n",
+ dev->udev->devnum,
+@@ -1891,6 +1892,15 @@ static struct usb_device_id uvc_ids[] = {
+ .bInterfaceSubClass = 1,
+ .bInterfaceProtocol = 0,
+ .driver_info = UVC_QUIRK_PROBE_MINMAX },
++ /* Medion Akoya Mini E1210 */
++ { .match_flags = USB_DEVICE_ID_MATCH_DEVICE
++ | USB_DEVICE_ID_MATCH_INT_INFO,
++ .idVendor = 0x5986,
++ .idProduct = 0x0141,
++ .bInterfaceClass = USB_CLASS_VIDEO,
++ .bInterfaceSubClass = 1,
++ .bInterfaceProtocol = 0,
++ .driver_info = UVC_QUIRK_PROBE_MINMAX },
+ /* Acer OrbiCam - Unknown vendor */
+ { .match_flags = USB_DEVICE_ID_MATCH_DEVICE
+ | USB_DEVICE_ID_MATCH_INT_INFO,
+diff --git a/drivers/media/video/uvc/uvc_status.c b/drivers/media/video/uvc/uvc_status.c
+index be9084e..eb2f970 100644
+--- a/drivers/media/video/uvc/uvc_status.c
++++ b/drivers/media/video/uvc/uvc_status.c
+@@ -22,6 +22,7 @@
+ /* --------------------------------------------------------------------------
+ * Input device
+ */
++#ifdef CONFIG_USB_VIDEO_CLASS_INPUT_EVDEV
+ static int uvc_input_init(struct uvc_device *dev)
+ {
+ struct usb_device *udev = dev->udev;
+@@ -67,6 +68,19 @@ static void uvc_input_cleanup(struct uvc_device *dev)
+ input_unregister_device(dev->input);
+ }
+
++static void uvc_input_report_key(struct uvc_device *dev, unsigned int code,
++ int value)
++{
++ if (dev->input)
++ input_report_key(dev->input, code, value);
++}
++
++#else
++#define uvc_input_init(dev)
++#define uvc_input_cleanup(dev)
++#define uvc_input_report_key(dev, code, value)
++#endif /* CONFIG_USB_VIDEO_CLASS_INPUT_EVDEV */
++
+ /* --------------------------------------------------------------------------
+ * Status interrupt endpoint
+ */
+@@ -83,8 +97,7 @@ static void uvc_event_streaming(struct uvc_device *dev, __u8 *data, int len)
+ return;
+ uvc_trace(UVC_TRACE_STATUS, "Button (intf %u) %s len %d\n",
+ data[1], data[3] ? "pressed" : "released", len);
+- if (dev->input)
+- input_report_key(dev->input, BTN_0, data[3]);
++ uvc_input_report_key(dev, BTN_0, data[3]);
+ } else {
+ uvc_trace(UVC_TRACE_STATUS, "Stream %u error event %02x %02x "
+ "len %d.\n", data[1], data[2], data[3], len);
+@@ -203,5 +216,5 @@ int uvc_status_resume(struct uvc_device *dev)
+ if (dev->int_urb == NULL)
+ return 0;
+
+- return usb_submit_urb(dev->int_urb, GFP_KERNEL);
++ return usb_submit_urb(dev->int_urb, GFP_NOIO);
+ }
+diff --git a/drivers/media/video/uvc/uvc_video.c b/drivers/media/video/uvc/uvc_video.c
+index 6faf1fb..817af2e 100644
+--- a/drivers/media/video/uvc/uvc_video.c
++++ b/drivers/media/video/uvc/uvc_video.c
+@@ -554,9 +554,56 @@ static void uvc_video_complete(struct urb *urb)
+ }
+
+ /*
++ * Free transfer buffers.
++ */
++static void uvc_free_urb_buffers(struct uvc_video_device *video)
++{
++ unsigned int i;
++
++ for (i = 0; i < UVC_URBS; ++i) {
++ if (video->urb_buffer[i]) {
++ usb_buffer_free(video->dev->udev, video->urb_size,
++ video->urb_buffer[i], video->urb_dma[i]);
++ video->urb_buffer[i] = NULL;
++ }
++ }
++
++ video->urb_size = 0;
++}
++
++/*
++ * Allocate transfer buffers. This function can be called with buffers
++ * already allocated when resuming from suspend, in which case it will
++ * return without touching the buffers.
++ *
++ * Return 0 on success or -ENOMEM when out of memory.
++ */
++static int uvc_alloc_urb_buffers(struct uvc_video_device *video,
++ unsigned int size)
++{
++ unsigned int i;
++
++ /* Buffers are already allocated, bail out. */
++ if (video->urb_size)
++ return 0;
++
++ for (i = 0; i < UVC_URBS; ++i) {
++ video->urb_buffer[i] = usb_buffer_alloc(video->dev->udev,
++ size, GFP_KERNEL, &video->urb_dma[i]);
++ if (video->urb_buffer[i] == NULL) {
++ uvc_free_urb_buffers(video);
++ return -ENOMEM;
++ }
++ }
++
++ video->urb_size = size;
++ return 0;
++}
++
++/*
+ * Uninitialize isochronous/bulk URBs and free transfer buffers.
+ */
+-static void uvc_uninit_video(struct uvc_video_device *video)
++static void uvc_uninit_video(struct uvc_video_device *video, int free_buffers)
+ {
+ struct urb *urb;
+ unsigned int i;
+@@ -566,19 +613,12 @@ static void uvc_uninit_video(struct uvc_video_device *video)
+ continue;
+
+ usb_kill_urb(urb);
+- /* urb->transfer_buffer_length is not touched by USB core, so
+- * we can use it here as the buffer length.
+- */
+- if (video->urb_buffer[i]) {
+- usb_buffer_free(video->dev->udev,
+- urb->transfer_buffer_length,
+- video->urb_buffer[i], urb->transfer_dma);
+- video->urb_buffer[i] = NULL;
+- }
+-
+ usb_free_urb(urb);
+ video->urb[i] = NULL;
+ }
++
++ if (free_buffers)
++ uvc_free_urb_buffers(video);
+ }
+
+ /*
+@@ -586,7 +626,7 @@ static void uvc_uninit_video(struct uvc_video_device *video)
+ * is given by the endpoint.
+ */
+ static int uvc_init_video_isoc(struct uvc_video_device *video,
+- struct usb_host_endpoint *ep)
++ struct usb_host_endpoint *ep, gfp_t gfp_flags)
+ {
+ struct urb *urb;
+ unsigned int npackets, i, j;
+@@ -610,18 +650,13 @@ static int uvc_init_video_isoc(struct uvc_video_device *video,
+
+ size = npackets * psize;
+
++ if (uvc_alloc_urb_buffers(video, size) < 0)
++ return -ENOMEM;
++
+ for (i = 0; i < UVC_URBS; ++i) {
+- urb = usb_alloc_urb(npackets, GFP_KERNEL);
++ urb = usb_alloc_urb(npackets, gfp_flags);
+ if (urb == NULL) {
+- uvc_uninit_video(video);
+- return -ENOMEM;
+- }
+-
+- video->urb_buffer[i] = usb_buffer_alloc(video->dev->udev,
+- size, GFP_KERNEL, &urb->transfer_dma);
+- if (video->urb_buffer[i] == NULL) {
+- usb_free_urb(urb);
+- uvc_uninit_video(video);
++ uvc_uninit_video(video, 1);
+ return -ENOMEM;
+ }
+
+@@ -632,6 +667,7 @@ static int uvc_init_video_isoc(struct uvc_video_device *video,
+ urb->transfer_flags = URB_ISO_ASAP | URB_NO_TRANSFER_DMA_MAP;
+ urb->interval = ep->desc.bInterval;
+ urb->transfer_buffer = video->urb_buffer[i];
++ urb->transfer_dma = video->urb_dma[i];
+ urb->complete = uvc_video_complete;
+ urb->number_of_packets = npackets;
+ urb->transfer_buffer_length = size;
+@@ -652,7 +688,7 @@ static int uvc_init_video_isoc(struct uvc_video_device *video,
+ * given by the endpoint.
+ */
+ static int uvc_init_video_bulk(struct uvc_video_device *video,
+- struct usb_host_endpoint *ep)
++ struct usb_host_endpoint *ep, gfp_t gfp_flags)
+ {
+ struct urb *urb;
+ unsigned int pipe, i;
+@@ -671,20 +707,15 @@ static int uvc_init_video_bulk(struct uvc_video_device *video,
+ if (size > psize * UVC_MAX_ISO_PACKETS)
+ size = psize * UVC_MAX_ISO_PACKETS;
+
++ if (uvc_alloc_urb_buffers(video, size) < 0)
++ return -ENOMEM;
++
+ pipe = usb_rcvbulkpipe(video->dev->udev, ep->desc.bEndpointAddress);
+
+ for (i = 0; i < UVC_URBS; ++i) {
+- urb = usb_alloc_urb(0, GFP_KERNEL);
++ urb = usb_alloc_urb(0, gfp_flags);
+ if (urb == NULL) {
+- uvc_uninit_video(video);
+- return -ENOMEM;
+- }
+-
+- video->urb_buffer[i] = usb_buffer_alloc(video->dev->udev,
+- size, GFP_KERNEL, &urb->transfer_dma);
+- if (video->urb_buffer[i] == NULL) {
+- usb_free_urb(urb);
+- uvc_uninit_video(video);
++ uvc_uninit_video(video, 1);
+ return -ENOMEM;
+ }
+
+@@ -692,6 +723,7 @@ static int uvc_init_video_bulk(struct uvc_video_device *video,
+ video->urb_buffer[i], size, uvc_video_complete,
+ video);
+ urb->transfer_flags = URB_NO_TRANSFER_DMA_MAP;
++ urb->transfer_dma = video->urb_dma[i];
+
+ video->urb[i] = urb;
+ }
+@@ -702,7 +734,7 @@ static int uvc_init_video_bulk(struct uvc_video_device *video,
+ /*
+ * Initialize isochronous/bulk URBs and allocate transfer buffers.
+ */
+-static int uvc_init_video(struct uvc_video_device *video)
++static int uvc_init_video(struct uvc_video_device *video, gfp_t gfp_flags)
+ {
+ struct usb_interface *intf = video->streaming->intf;
+ struct usb_host_interface *alts;
+@@ -747,7 +779,7 @@ static int uvc_init_video(struct uvc_video_device *video)
+ if ((ret = usb_set_interface(video->dev->udev, intfnum, i)) < 0)
+ return ret;
+
+- ret = uvc_init_video_isoc(video, ep);
++ ret = uvc_init_video_isoc(video, ep, gfp_flags);
+ } else {
+ /* Bulk endpoint, proceed to URB initialization. */
+ ep = uvc_find_endpoint(&intf->altsetting[0],
+@@ -755,7 +787,7 @@ static int uvc_init_video(struct uvc_video_device *video)
+ if (ep == NULL)
+ return -EIO;
+
+- ret = uvc_init_video_bulk(video, ep);
++ ret = uvc_init_video_bulk(video, ep, gfp_flags);
+ }
+
+ if (ret < 0)
+@@ -763,10 +795,10 @@ static int uvc_init_video(struct uvc_video_device *video)
+
+ /* Submit the URBs. */
+ for (i = 0; i < UVC_URBS; ++i) {
+- if ((ret = usb_submit_urb(video->urb[i], GFP_KERNEL)) < 0) {
++ if ((ret = usb_submit_urb(video->urb[i], gfp_flags)) < 0) {
+ uvc_printk(KERN_ERR, "Failed to submit URB %u "
+ "(%d).\n", i, ret);
+- uvc_uninit_video(video);
++ uvc_uninit_video(video, 1);
+ return ret;
+ }
+ }
+@@ -791,7 +823,7 @@ int uvc_video_suspend(struct uvc_video_device *video)
+ return 0;
+
+ video->frozen = 1;
+- uvc_uninit_video(video);
++ uvc_uninit_video(video, 0);
+ usb_set_interface(video->dev->udev, video->streaming->intfnum, 0);
+ return 0;
+ }
+@@ -818,7 +850,7 @@ int uvc_video_resume(struct uvc_video_device *video)
+ if (!uvc_queue_streaming(&video->queue))
+ return 0;
+
+- if ((ret = uvc_init_video(video)) < 0)
++ if ((ret = uvc_init_video(video, GFP_NOIO)) < 0)
+ uvc_queue_enable(&video->queue, 0);
+
+ return ret;
+@@ -920,7 +952,7 @@ int uvc_video_enable(struct uvc_video_device *video, int enable)
+ int ret;
+
+ if (!enable) {
+- uvc_uninit_video(video);
++ uvc_uninit_video(video, 1);
+ usb_set_interface(video->dev->udev,
+ video->streaming->intfnum, 0);
+ uvc_queue_enable(&video->queue, 0);
+@@ -930,5 +962,5 @@ int uvc_video_enable(struct uvc_video_device *video, int enable)
+ if ((ret = uvc_queue_enable(&video->queue, 1)) < 0)
+ return ret;
+
+- return uvc_init_video(video);
++ return uvc_init_video(video, GFP_KERNEL);
+ }
+diff --git a/drivers/media/video/uvc/uvcvideo.h b/drivers/media/video/uvc/uvcvideo.h
+index a995a78..2444b8a 100644
+--- a/drivers/media/video/uvc/uvcvideo.h
++++ b/drivers/media/video/uvc/uvcvideo.h
+@@ -602,6 +602,8 @@ struct uvc_video_device {
+
+ struct urb *urb[UVC_URBS];
+ char *urb_buffer[UVC_URBS];
++ dma_addr_t urb_dma[UVC_URBS];
++ unsigned int urb_size;
+
+ __u8 last_fid;
+ };
+diff --git a/drivers/mmc/host/pxamci.c b/drivers/mmc/host/pxamci.c
+index d89475d..5c35e63 100644
+--- a/drivers/mmc/host/pxamci.c
++++ b/drivers/mmc/host/pxamci.c
+@@ -177,7 +177,7 @@ static void pxamci_setup_data(struct pxamci_host *host, struct mmc_data *data)
+ if (dalgn)
+ DALGN |= (1 << host->dma);
+ else
+- DALGN &= (1 << host->dma);
++ DALGN &= ~(1 << host->dma);
+ DDADR(host->dma) = host->sg_dma;
+ DCSR(host->dma) = DCSR_RUN;
+ }
+diff --git a/drivers/net/hamradio/hdlcdrv.c b/drivers/net/hamradio/hdlcdrv.c
+index ae9629f..c258a05 100644
+--- a/drivers/net/hamradio/hdlcdrv.c
++++ b/drivers/net/hamradio/hdlcdrv.c
+@@ -88,6 +88,7 @@
+ static inline void append_crc_ccitt(unsigned char *buffer, int len)
+ {
+ unsigned int crc = crc_ccitt(0xffff, buffer, len) ^ 0xffff;
++ buffer += len;
+ *buffer++ = crc;
+ *buffer++ = crc >> 8;
+ }
+diff --git a/drivers/net/ixgbe/ixgbe_main.c b/drivers/net/ixgbe/ixgbe_main.c
+index 8f04609..e248f80 100644
+--- a/drivers/net/ixgbe/ixgbe_main.c
++++ b/drivers/net/ixgbe/ixgbe_main.c
+@@ -70,8 +70,6 @@ static struct pci_device_id ixgbe_pci_tbl[] = {
+ board_82598 },
+ {PCI_VDEVICE(INTEL, IXGBE_DEV_ID_82598AF_SINGLE_PORT),
+ board_82598 },
+- {PCI_VDEVICE(INTEL, IXGBE_DEV_ID_82598AT_DUAL_PORT),
+- board_82598 },
+ {PCI_VDEVICE(INTEL, IXGBE_DEV_ID_82598EB_CX4),
+ board_82598 },
+
+diff --git a/drivers/net/myri10ge/myri10ge.c b/drivers/net/myri10ge/myri10ge.c
+index e0d76c7..9e28d91 100644
+--- a/drivers/net/myri10ge/myri10ge.c
++++ b/drivers/net/myri10ge/myri10ge.c
+@@ -3126,6 +3126,8 @@ static int myri10ge_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
+
+ mgp = netdev_priv(netdev);
+ mgp->dev = netdev;
++ mgp->ss.mgp = mgp;
++ mgp->ss.dev = mgp->dev;
+ netif_napi_add(netdev, &mgp->ss.napi, myri10ge_poll, myri10ge_napi_weight);
+ mgp->pdev = pdev;
+ mgp->csum_flag = MXGEFW_FLAGS_CKSUM;
+@@ -3213,26 +3215,26 @@ static int myri10ge_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
+ for (i = 0; i < ETH_ALEN; i++)
+ netdev->dev_addr[i] = mgp->mac_addr[i];
+
+- /* allocate rx done ring */
+- bytes = mgp->max_intr_slots * sizeof(*mgp->ss.rx_done.entry);
+- mgp->ss.rx_done.entry = dma_alloc_coherent(&pdev->dev, bytes,
+- &mgp->ss.rx_done.bus, GFP_KERNEL);
+- if (mgp->ss.rx_done.entry == NULL)
+- goto abort_with_ioremap;
+- memset(mgp->ss.rx_done.entry, 0, bytes);
+-
+ myri10ge_select_firmware(mgp);
+
+ status = myri10ge_load_firmware(mgp);
+ if (status != 0) {
+ dev_err(&pdev->dev, "failed to load firmware\n");
+- goto abort_with_rx_done;
++ goto abort_with_ioremap;
+ }
+
++ /* allocate rx done ring */
++ bytes = mgp->max_intr_slots * sizeof(*mgp->ss.rx_done.entry);
++ mgp->ss.rx_done.entry = dma_alloc_coherent(&pdev->dev, bytes,
++ &mgp->ss.rx_done.bus, GFP_KERNEL);
++ if (mgp->ss.rx_done.entry == NULL)
++ goto abort_with_firmware;
++ memset(mgp->ss.rx_done.entry, 0, bytes);
++
+ status = myri10ge_reset(mgp);
+ if (status != 0) {
+ dev_err(&pdev->dev, "failed reset\n");
+- goto abort_with_firmware;
++ goto abort_with_rx_done;
+ }
+
+ pci_set_drvdata(pdev, mgp);
+@@ -3258,7 +3260,7 @@ static int myri10ge_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
+ * is set to correct value if MSI is enabled */
+ status = myri10ge_request_irq(mgp);
+ if (status != 0)
+- goto abort_with_firmware;
++ goto abort_with_rx_done;
+ netdev->irq = pdev->irq;
+ myri10ge_free_irq(mgp);
+
+@@ -3287,14 +3289,14 @@ static int myri10ge_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
+ abort_with_state:
+ pci_restore_state(pdev);
+
+-abort_with_firmware:
+- myri10ge_dummy_rdma(mgp, 0);
+-
+ abort_with_rx_done:
+ bytes = mgp->max_intr_slots * sizeof(*mgp->ss.rx_done.entry);
+ dma_free_coherent(&pdev->dev, bytes,
+ mgp->ss.rx_done.entry, mgp->ss.rx_done.bus);
+
++abort_with_firmware:
++ myri10ge_dummy_rdma(mgp, 0);
++
+ abort_with_ioremap:
+ iounmap(mgp->sram);
+
+diff --git a/drivers/net/wireless/ath5k/base.c b/drivers/net/wireless/ath5k/base.c
+index 635b9ac..e57905c 100644
+--- a/drivers/net/wireless/ath5k/base.c
++++ b/drivers/net/wireless/ath5k/base.c
+@@ -487,9 +487,6 @@ ath5k_pci_probe(struct pci_dev *pdev,
+ /* Set private data */
+ pci_set_drvdata(pdev, hw);
+
+- /* Enable msi for devices that support it */
+- pci_enable_msi(pdev);
+-
+ /* Setup interrupt handler */
+ ret = request_irq(pdev->irq, ath5k_intr, IRQF_SHARED, "ath", sc);
+ if (ret) {
+@@ -567,7 +564,6 @@ err_ah:
+ err_irq:
+ free_irq(pdev->irq, sc);
+ err_free:
+- pci_disable_msi(pdev);
+ ieee80211_free_hw(hw);
+ err_map:
+ pci_iounmap(pdev, mem);
+@@ -589,7 +585,6 @@ ath5k_pci_remove(struct pci_dev *pdev)
+ ath5k_detach(pdev, hw);
+ ath5k_hw_detach(sc->ah);
+ free_irq(pdev->irq, sc);
+- pci_disable_msi(pdev);
+ pci_iounmap(pdev, sc->iobase);
+ pci_release_region(pdev, 0);
+ pci_disable_device(pdev);
+diff --git a/drivers/net/wireless/b43legacy/main.c b/drivers/net/wireless/b43legacy/main.c
+index 3e612d0..9bba3ec 100644
+--- a/drivers/net/wireless/b43legacy/main.c
++++ b/drivers/net/wireless/b43legacy/main.c
+@@ -3862,10 +3862,10 @@ static int b43legacy_resume(struct ssb_device *dev)
+ goto out;
+ }
+ }
+- mutex_unlock(&wl->mutex);
+
+ b43legacydbg(wl, "Device resumed.\n");
+ out:
++ mutex_unlock(&wl->mutex);
+ return err;
+ }
+
+diff --git a/drivers/rtc/rtc-at91rm9200.c b/drivers/rtc/rtc-at91rm9200.c
+index 39e64ab..67c7a01 100644
+--- a/drivers/rtc/rtc-at91rm9200.c
++++ b/drivers/rtc/rtc-at91rm9200.c
+@@ -175,8 +175,10 @@ static int at91_rtc_setalarm(struct device *dev, struct rtc_wkalrm *alrm)
+ | BIN2BCD(tm.tm_mday) << 24
+ | AT91_RTC_DATEEN | AT91_RTC_MTHEN);
+
+- if (alrm->enabled)
++ if (alrm->enabled) {
++ at91_sys_write(AT91_RTC_SCCR, AT91_RTC_ALARM);
+ at91_sys_write(AT91_RTC_IER, AT91_RTC_ALARM);
++ }
+
+ pr_debug("%s(): %4d-%02d-%02d %02d:%02d:%02d\n", __func__,
+ at91_alarm_year, tm.tm_mon, tm.tm_mday, tm.tm_hour,
+@@ -195,28 +197,22 @@ static int at91_rtc_ioctl(struct device *dev, unsigned int cmd,
+
+ pr_debug("%s(): cmd=%08x, arg=%08lx.\n", __func__, cmd, arg);
+
++ /* important: scrub old status before enabling IRQs */
+ switch (cmd) {
+ case RTC_AIE_OFF: /* alarm off */
+ at91_sys_write(AT91_RTC_IDR, AT91_RTC_ALARM);
+ break;
+ case RTC_AIE_ON: /* alarm on */
++ at91_sys_write(AT91_RTC_SCCR, AT91_RTC_ALARM);
+ at91_sys_write(AT91_RTC_IER, AT91_RTC_ALARM);
+ break;
+ case RTC_UIE_OFF: /* update off */
+- case RTC_PIE_OFF: /* periodic off */
+ at91_sys_write(AT91_RTC_IDR, AT91_RTC_SECEV);
+ break;
+ case RTC_UIE_ON: /* update on */
+- case RTC_PIE_ON: /* periodic on */
++ at91_sys_write(AT91_RTC_SCCR, AT91_RTC_SECEV);
+ at91_sys_write(AT91_RTC_IER, AT91_RTC_SECEV);
+ break;
+- case RTC_IRQP_READ: /* read periodic alarm frequency */
+- ret = put_user(AT91_RTC_FREQ, (unsigned long *) arg);
+- break;
+- case RTC_IRQP_SET: /* set periodic alarm frequency */
+- if (arg != AT91_RTC_FREQ)
+- ret = -EINVAL;
+- break;
+ default:
+ ret = -ENOIOCTLCMD;
+ break;
+diff --git a/drivers/spi/mpc52xx_psc_spi.c b/drivers/spi/mpc52xx_psc_spi.c
+index 681d623..d8a1f91 100644
+--- a/drivers/spi/mpc52xx_psc_spi.c
++++ b/drivers/spi/mpc52xx_psc_spi.c
+@@ -148,7 +148,6 @@ static int mpc52xx_psc_spi_transfer_rxtx(struct spi_device *spi,
+ unsigned rfalarm;
+ unsigned send_at_once = MPC52xx_PSC_BUFSIZE;
+ unsigned recv_at_once;
+- unsigned bpw = mps->bits_per_word / 8;
+
+ if (!t->tx_buf && !t->rx_buf && t->len)
+ return -EINVAL;
+@@ -164,22 +163,15 @@ static int mpc52xx_psc_spi_transfer_rxtx(struct spi_device *spi,
+ }
+
+ dev_dbg(&spi->dev, "send %d bytes...\n", send_at_once);
+- if (tx_buf) {
+- for (; send_at_once; sb++, send_at_once--) {
+- /* set EOF flag */
+- if (mps->bits_per_word
+- && (sb + 1) % bpw == 0)
+- out_8(&psc->ircr2, 0x01);
++ for (; send_at_once; sb++, send_at_once--) {
++ /* set EOF flag before the last word is sent */
++ if (send_at_once == 1)
++ out_8(&psc->ircr2, 0x01);
++
++ if (tx_buf)
+ out_8(&psc->mpc52xx_psc_buffer_8, tx_buf[sb]);
+- }
+- } else {
+- for (; send_at_once; sb++, send_at_once--) {
+- /* set EOF flag */
+- if (mps->bits_per_word
+- && ((sb + 1) % bpw) == 0)
+- out_8(&psc->ircr2, 0x01);
++ else
+ out_8(&psc->mpc52xx_psc_buffer_8, 0);
+- }
+ }
+
+
+diff --git a/drivers/usb/serial/usb-serial.c b/drivers/usb/serial/usb-serial.c
+index 0cb0d77..db1db4c 100644
+--- a/drivers/usb/serial/usb-serial.c
++++ b/drivers/usb/serial/usb-serial.c
+@@ -283,7 +283,10 @@ static void serial_close(struct tty_struct *tty, struct file * filp)
+ }
+
+ if (port->open_count == 0) {
+- usb_autopm_put_interface(port->serial->interface);
++ mutex_lock(&port->serial->disc_mutex);
++ if (!port->serial->disconnected)
++ usb_autopm_put_interface(port->serial->interface);
++ mutex_unlock(&port->serial->disc_mutex);
+ module_put(port->serial->type->driver.owner);
+ }
+
+diff --git a/fs/dquot.c b/fs/dquot.c
+index 5ac77da..ad88cf6 100644
+--- a/fs/dquot.c
++++ b/fs/dquot.c
+@@ -562,6 +562,8 @@ static struct shrinker dqcache_shrinker = {
+ */
+ static void dqput(struct dquot *dquot)
+ {
++ int ret;
++
+ if (!dquot)
+ return;
+ #ifdef __DQUOT_PARANOIA
+@@ -594,7 +596,19 @@ we_slept:
+ if (test_bit(DQ_ACTIVE_B, &dquot->dq_flags) && dquot_dirty(dquot)) {
+ spin_unlock(&dq_list_lock);
+ /* Commit dquot before releasing */
+- dquot->dq_sb->dq_op->write_dquot(dquot);
++ ret = dquot->dq_sb->dq_op->write_dquot(dquot);
++ if (ret < 0) {
++ printk(KERN_ERR "VFS: cannot write quota structure on "
++ "device %s (error %d). Quota may get out of "
++ "sync!\n", dquot->dq_sb->s_id, ret);
++ /*
++ * We clear dirty bit anyway, so that we avoid
++ * infinite loop here
++ */
++ spin_lock(&dq_list_lock);
++ clear_dquot_dirty(dquot);
++ spin_unlock(&dq_list_lock);
++ }
+ goto we_slept;
+ }
+ /* Clear flag in case dquot was inactive (something bad happened) */
+diff --git a/fs/ecryptfs/crypto.c b/fs/ecryptfs/crypto.c
+index e2832bc..a82e0cb 100644
+--- a/fs/ecryptfs/crypto.c
++++ b/fs/ecryptfs/crypto.c
+@@ -474,8 +474,8 @@ int ecryptfs_encrypt_page(struct page *page)
+ {
+ struct inode *ecryptfs_inode;
+ struct ecryptfs_crypt_stat *crypt_stat;
+- char *enc_extent_virt = NULL;
+- struct page *enc_extent_page;
++ char *enc_extent_virt;
++ struct page *enc_extent_page = NULL;
+ loff_t extent_offset;
+ int rc = 0;
+
+@@ -491,14 +491,14 @@ int ecryptfs_encrypt_page(struct page *page)
+ page->index);
+ goto out;
+ }
+- enc_extent_virt = kmalloc(PAGE_CACHE_SIZE, GFP_USER);
+- if (!enc_extent_virt) {
++ enc_extent_page = alloc_page(GFP_USER);
++ if (!enc_extent_page) {
+ rc = -ENOMEM;
+ ecryptfs_printk(KERN_ERR, "Error allocating memory for "
+ "encrypted extent\n");
+ goto out;
+ }
+- enc_extent_page = virt_to_page(enc_extent_virt);
++ enc_extent_virt = kmap(enc_extent_page);
+ for (extent_offset = 0;
+ extent_offset < (PAGE_CACHE_SIZE / crypt_stat->extent_size);
+ extent_offset++) {
+@@ -526,7 +526,10 @@ int ecryptfs_encrypt_page(struct page *page)
+ }
+ }
+ out:
+- kfree(enc_extent_virt);
++ if (enc_extent_page) {
++ kunmap(enc_extent_page);
++ __free_page(enc_extent_page);
++ }
+ return rc;
+ }
+
+@@ -608,8 +611,8 @@ int ecryptfs_decrypt_page(struct page *page)
+ {
+ struct inode *ecryptfs_inode;
+ struct ecryptfs_crypt_stat *crypt_stat;
+- char *enc_extent_virt = NULL;
+- struct page *enc_extent_page;
++ char *enc_extent_virt;
++ struct page *enc_extent_page = NULL;
+ unsigned long extent_offset;
+ int rc = 0;
+
+@@ -626,14 +629,14 @@ int ecryptfs_decrypt_page(struct page *page)
+ page->index);
+ goto out;
+ }
+- enc_extent_virt = kmalloc(PAGE_CACHE_SIZE, GFP_USER);
+- if (!enc_extent_virt) {
++ enc_extent_page = alloc_page(GFP_USER);
++ if (!enc_extent_page) {
+ rc = -ENOMEM;
+ ecryptfs_printk(KERN_ERR, "Error allocating memory for "
+ "encrypted extent\n");
+ goto out;
+ }
+- enc_extent_page = virt_to_page(enc_extent_virt);
++ enc_extent_virt = kmap(enc_extent_page);
+ for (extent_offset = 0;
+ extent_offset < (PAGE_CACHE_SIZE / crypt_stat->extent_size);
+ extent_offset++) {
+@@ -661,7 +664,10 @@ int ecryptfs_decrypt_page(struct page *page)
+ }
+ }
+ out:
+- kfree(enc_extent_virt);
++ if (enc_extent_page) {
++ kunmap(enc_extent_page);
++ __free_page(enc_extent_page);
++ }
+ return rc;
+ }
+
+diff --git a/fs/isofs/rock.c b/fs/isofs/rock.c
+index 6bd48f0..c2fb2dd 100644
+--- a/fs/isofs/rock.c
++++ b/fs/isofs/rock.c
+@@ -209,6 +209,11 @@ repeat:
+
+ while (rs.len > 2) { /* There may be one byte for padding somewhere */
+ rr = (struct rock_ridge *)rs.chr;
++ /*
++ * Ignore rock ridge info if rr->len is out of range, but
++ * don't return -EIO because that would make the file
++ * invisible.
++ */
+ if (rr->len < 3)
+ goto out; /* Something got screwed up here */
+ sig = isonum_721(rs.chr);
+@@ -216,8 +221,12 @@ repeat:
+ goto eio;
+ rs.chr += rr->len;
+ rs.len -= rr->len;
++ /*
++ * As above, just ignore the rock ridge info if rr->len
++ * is bogus.
++ */
+ if (rs.len < 0)
+- goto eio; /* corrupted isofs */
++ goto out; /* Something got screwed up here */
+
+ switch (sig) {
+ case SIG('R', 'R'):
+@@ -307,6 +316,11 @@ parse_rock_ridge_inode_internal(struct iso_directory_record *de,
+ repeat:
+ while (rs.len > 2) { /* There may be one byte for padding somewhere */
+ rr = (struct rock_ridge *)rs.chr;
++ /*
++ * Ignore rock ridge info if rr->len is out of range, but
++ * don't return -EIO because that would make the file
++ * invisible.
++ */
+ if (rr->len < 3)
+ goto out; /* Something got screwed up here */
+ sig = isonum_721(rs.chr);
+@@ -314,8 +328,12 @@ repeat:
+ goto eio;
+ rs.chr += rr->len;
+ rs.len -= rr->len;
++ /*
++ * As above, just ignore the rock ridge info if rr->len
++ * is bogus.
++ */
+ if (rs.len < 0)
+- goto eio; /* corrupted isofs */
++ goto out; /* Something got screwed up here */
+
+ switch (sig) {
+ #ifndef CONFIG_ZISOFS /* No flag for SF or ZF */
+diff --git a/fs/libfs.c b/fs/libfs.c
+index baeb71e..1add676 100644
+--- a/fs/libfs.c
++++ b/fs/libfs.c
+@@ -216,8 +216,8 @@ int get_sb_pseudo(struct file_system_type *fs_type, char *name,
+
+ s->s_flags = MS_NOUSER;
+ s->s_maxbytes = ~0ULL;
+- s->s_blocksize = 1024;
+- s->s_blocksize_bits = 10;
++ s->s_blocksize = PAGE_SIZE;
++ s->s_blocksize_bits = PAGE_SHIFT;
+ s->s_magic = magic;
+ s->s_op = ops ? ops : &simple_super_operations;
+ s->s_time_gran = 1;
+diff --git a/fs/proc/task_mmu.c b/fs/proc/task_mmu.c
+index c492449..1eaa39a 100644
+--- a/fs/proc/task_mmu.c
++++ b/fs/proc/task_mmu.c
+@@ -636,7 +636,7 @@ static ssize_t pagemap_read(struct file *file, char __user *buf,
+ struct pagemapread pm;
+ int pagecount;
+ int ret = -ESRCH;
+- struct mm_walk pagemap_walk;
++ struct mm_walk pagemap_walk = {};
+ unsigned long src;
+ unsigned long svpfn;
+ unsigned long start_vaddr;
+diff --git a/include/asm-arm/bitops.h b/include/asm-arm/bitops.h
+index 5c60bfc..9a1db20 100644
+--- a/include/asm-arm/bitops.h
++++ b/include/asm-arm/bitops.h
+@@ -277,9 +277,16 @@ static inline int constant_fls(int x)
+ * the clz instruction for much better code efficiency.
+ */
+
+-#define fls(x) \
++#define __fls(x) \
+ ( __builtin_constant_p(x) ? constant_fls(x) : \
+ ({ int __r; asm("clz\t%0, %1" : "=r"(__r) : "r"(x) : "cc"); 32-__r; }) )
++
++/* Implement fls() in C so that 64-bit args are suitably truncated */
++static inline int fls(int x)
++{
++ return __fls(x);
++}
++
+ #define ffs(x) ({ unsigned long __t = (x); fls(__t & -__t); })
+ #define __ffs(x) (ffs(x) - 1)
+ #define ffz(x) __ffs( ~(x) )
+diff --git a/include/asm-generic/vmlinux.lds.h b/include/asm-generic/vmlinux.lds.h
+index f054778..5a544bf 100644
+--- a/include/asm-generic/vmlinux.lds.h
++++ b/include/asm-generic/vmlinux.lds.h
+@@ -204,6 +204,7 @@
+ * during second ld run in second ld pass when generating System.map */
+ #define TEXT_TEXT \
+ ALIGN_FUNCTION(); \
++ *(.text.hot) \
+ *(.text) \
+ *(.ref.text) \
+ *(.text.init.refok) \
+@@ -213,7 +214,8 @@
+ CPU_KEEP(init.text) \
+ CPU_KEEP(exit.text) \
+ MEM_KEEP(init.text) \
+- MEM_KEEP(exit.text)
++ MEM_KEEP(exit.text) \
++ *(.text.unlikely)
+
+
+ /* sched.text is aling to function alignment to secure we have same
+diff --git a/include/asm-sparc64/io.h b/include/asm-sparc64/io.h
+index 3158960..38e7ba6 100644
+--- a/include/asm-sparc64/io.h
++++ b/include/asm-sparc64/io.h
+@@ -16,7 +16,6 @@
+ /* BIO layer definitions. */
+ extern unsigned long kern_base, kern_size;
+ #define page_to_phys(page) (page_to_pfn(page) << PAGE_SHIFT)
+-#define BIO_VMERGE_BOUNDARY 8192
+
+ static inline u8 _inb(unsigned long addr)
+ {
+diff --git a/include/asm-x86/signal.h b/include/asm-x86/signal.h
+index f15186d..6dac493 100644
+--- a/include/asm-x86/signal.h
++++ b/include/asm-x86/signal.h
+@@ -181,12 +181,12 @@ typedef struct sigaltstack {
+ #ifdef __KERNEL__
+ #include <asm/sigcontext.h>
+
+-#ifdef __386__
++#ifdef __i386__
+
+ #define __HAVE_ARCH_SIG_BITOPS
+
+ #define sigaddset(set,sig) \
+- (__builtin_constantp(sig) \
++ (__builtin_constant_p(sig) \
+ ? __const_sigaddset((set), (sig)) \
+ : __gen_sigaddset((set), (sig)))
+
+diff --git a/include/linux/cpufreq.h b/include/linux/cpufreq.h
+index e7e91db..07cb761 100644
+--- a/include/linux/cpufreq.h
++++ b/include/linux/cpufreq.h
+@@ -109,6 +109,7 @@ struct cpufreq_policy {
+ #define CPUFREQ_ADJUST (0)
+ #define CPUFREQ_INCOMPATIBLE (1)
+ #define CPUFREQ_NOTIFY (2)
++#define CPUFREQ_START (3)
+
+ #define CPUFREQ_SHARED_TYPE_NONE (0) /* None */
+ #define CPUFREQ_SHARED_TYPE_HW (1) /* HW does needed coordination */
+diff --git a/include/linux/ipv6.h b/include/linux/ipv6.h
+index cde056e..0bfd97f 100644
+--- a/include/linux/ipv6.h
++++ b/include/linux/ipv6.h
+@@ -123,6 +123,7 @@ struct ipv6hdr {
+ struct in6_addr daddr;
+ };
+
++#ifdef __KERNEL__
+ /*
+ * This structure contains configuration options per IPv6 link.
+ */
+@@ -165,6 +166,7 @@ struct ipv6_devconf {
+ #endif
+ void *sysctl;
+ };
++#endif
+
+ /* index values for the variables in ipv6_devconf */
+ enum {
+diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h
+index de9d1df..d413e89 100644
+--- a/include/linux/kvm_host.h
++++ b/include/linux/kvm_host.h
+@@ -166,6 +166,7 @@ int kvm_arch_set_memory_region(struct kvm *kvm,
+ struct kvm_userspace_memory_region *mem,
+ struct kvm_memory_slot old,
+ int user_alloc);
++void kvm_arch_flush_shadow(struct kvm *kvm);
+ gfn_t unalias_gfn(struct kvm *kvm, gfn_t gfn);
+ struct page *gfn_to_page(struct kvm *kvm, gfn_t gfn);
+ unsigned long gfn_to_hva(struct kvm *kvm, gfn_t gfn);
+diff --git a/kernel/cpuset.c b/kernel/cpuset.c
+index 798b3ab..2a028f5 100644
+--- a/kernel/cpuset.c
++++ b/kernel/cpuset.c
+@@ -679,7 +679,9 @@ restart:
+ if (apn == b->pn) {
+ cpus_or(*dp, *dp, b->cpus_allowed);
+ b->pn = -1;
+- update_domain_attr(dattr, b);
++ if (dattr)
++ update_domain_attr(dattr
++ + nslot, b);
+ }
+ }
+ nslot++;
+diff --git a/kernel/marker.c b/kernel/marker.c
+index b5a9fe1..39e7596 100644
+--- a/kernel/marker.c
++++ b/kernel/marker.c
+@@ -127,6 +127,11 @@ void marker_probe_cb(const struct marker *mdata, void *call_private,
+ struct marker_probe_closure *multi;
+ int i;
+ /*
++ * Read mdata->ptype before mdata->multi.
++ */
++ smp_rmb();
++ multi = mdata->multi;
++ /*
+ * multi points to an array, therefore accessing the array
+ * depends on reading multi. However, even in this case,
+ * we must insure that the pointer is read _before_ the array
+@@ -134,7 +139,6 @@ void marker_probe_cb(const struct marker *mdata, void *call_private,
+ * in the fast path, so put the explicit barrier here.
+ */
+ smp_read_barrier_depends();
+- multi = mdata->multi;
+ for (i = 0; multi[i].func; i++) {
+ va_start(args, fmt);
+ multi[i].func(multi[i].probe_private, call_private, fmt,
+@@ -177,6 +181,11 @@ void marker_probe_cb_noarg(const struct marker *mdata,
+ struct marker_probe_closure *multi;
+ int i;
+ /*
++ * Read mdata->ptype before mdata->multi.
++ */
++ smp_rmb();
++ multi = mdata->multi;
++ /*
+ * multi points to an array, therefore accessing the array
+ * depends on reading multi. However, even in this case,
+ * we must insure that the pointer is read _before_ the array
+@@ -184,7 +193,6 @@ void marker_probe_cb_noarg(const struct marker *mdata,
+ * in the fast path, so put the explicit barrier here.
+ */
+ smp_read_barrier_depends();
+- multi = mdata->multi;
+ for (i = 0; multi[i].func; i++)
+ multi[i].func(multi[i].probe_private, call_private, fmt,
+ &args);
+diff --git a/kernel/rcupreempt.c b/kernel/rcupreempt.c
+index 41d275a..379c25e 100644
+--- a/kernel/rcupreempt.c
++++ b/kernel/rcupreempt.c
+@@ -567,7 +567,7 @@ rcu_try_flip_waitack_needed(int cpu)
+ * that this CPU already acknowledged the counter.
+ */
+
+- if ((curr - snap) > 2 || (snap & 0x1) == 0)
++ if ((curr - snap) > 2 || (curr & 0x1) == 0)
+ return 0;
+
+ /* We need this CPU to explicitly acknowledge the counter flip. */
+diff --git a/kernel/sys_ni.c b/kernel/sys_ni.c
+index 5b9b467..0fea0ee 100644
+--- a/kernel/sys_ni.c
++++ b/kernel/sys_ni.c
+@@ -59,6 +59,7 @@ cond_syscall(sys_epoll_create);
+ cond_syscall(sys_epoll_ctl);
+ cond_syscall(sys_epoll_wait);
+ cond_syscall(sys_epoll_pwait);
++cond_syscall(compat_sys_epoll_pwait);
+ cond_syscall(sys_semget);
+ cond_syscall(sys_semop);
+ cond_syscall(sys_semtimedop);
+diff --git a/mm/filemap.c b/mm/filemap.c
+index 1e6a7d3..4f32423 100644
+--- a/mm/filemap.c
++++ b/mm/filemap.c
+@@ -1778,7 +1778,7 @@ void iov_iter_advance(struct iov_iter *i, size_t bytes)
+ * The !iov->iov_len check ensures we skip over unlikely
+ * zero-length segments (without overruning the iovec).
+ */
+- while (bytes || unlikely(!iov->iov_len && i->count)) {
++ while (bytes || unlikely(i->count && !iov->iov_len)) {
+ int copy;
+
+ copy = min(bytes, iov->iov_len - base);
+diff --git a/mm/shmem.c b/mm/shmem.c
+index e2a6ae1..8f8412b 100644
+--- a/mm/shmem.c
++++ b/mm/shmem.c
+@@ -1503,7 +1503,6 @@ shmem_get_inode(struct super_block *sb, int mode, dev_t dev)
+ inode->i_uid = current->fsuid;
+ inode->i_gid = current->fsgid;
+ inode->i_blocks = 0;
+- inode->i_mapping->a_ops = &shmem_aops;
+ inode->i_mapping->backing_dev_info = &shmem_backing_dev_info;
+ inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME;
+ inode->i_generation = get_seconds();
+@@ -1518,6 +1517,7 @@ shmem_get_inode(struct super_block *sb, int mode, dev_t dev)
+ init_special_inode(inode, mode, dev);
+ break;
+ case S_IFREG:
++ inode->i_mapping->a_ops = &shmem_aops;
+ inode->i_op = &shmem_inode_operations;
+ inode->i_fop = &shmem_file_operations;
+ mpol_shared_policy_init(&info->policy,
+@@ -1907,6 +1907,7 @@ static int shmem_symlink(struct inode *dir, struct dentry *dentry, const char *s
+ return error;
+ }
+ unlock_page(page);
++ inode->i_mapping->a_ops = &shmem_aops;
+ inode->i_op = &shmem_symlink_inode_operations;
+ kaddr = kmap_atomic(page, KM_USER0);
+ memcpy(kaddr, symname, len);
+diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c
+index cad73b7..c443a7f 100644
+--- a/net/ipv4/tcp_input.c
++++ b/net/ipv4/tcp_input.c
+@@ -3273,6 +3273,7 @@ static int tcp_ack(struct sock *sk, struct sk_buff *skb, int flag)
+ * log. Something worked...
+ */
+ sk->sk_err_soft = 0;
++ icsk->icsk_probes_out = 0;
+ tp->rcv_tstamp = tcp_time_stamp;
+ prior_packets = tp->packets_out;
+ if (!prior_packets)
+@@ -3305,8 +3306,6 @@ static int tcp_ack(struct sock *sk, struct sk_buff *skb, int flag)
+ return 1;
+
+ no_queue:
+- icsk->icsk_probes_out = 0;
+-
+ /* If this ack opens up a zero window, clear backoff. It was
+ * being used to time the probes, and is probably far higher than
+ * it needs to be for normal retransmission.
+diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c
+index 56fcda3..9f3f7ba 100644
+--- a/net/ipv4/udp.c
++++ b/net/ipv4/udp.c
+@@ -1319,6 +1319,8 @@ int udp_lib_setsockopt(struct sock *sk, int level, int optname,
+ return -ENOPROTOOPT;
+ if (val != 0 && val < 8) /* Illegal coverage: use default (8) */
+ val = 8;
++ else if (val > USHORT_MAX)
++ val = USHORT_MAX;
+ up->pcslen = val;
+ up->pcflag |= UDPLITE_SEND_CC;
+ break;
+@@ -1331,6 +1333,8 @@ int udp_lib_setsockopt(struct sock *sk, int level, int optname,
+ return -ENOPROTOOPT;
+ if (val != 0 && val < 8) /* Avoid silly minimal values. */
+ val = 8;
++ else if (val > USHORT_MAX)
++ val = USHORT_MAX;
+ up->pcrlen = val;
+ up->pcflag |= UDPLITE_RECV_CC;
+ break;
+diff --git a/net/ipv6/ip6_fib.c b/net/ipv6/ip6_fib.c
+index 1ee4fa1..918fde4 100644
+--- a/net/ipv6/ip6_fib.c
++++ b/net/ipv6/ip6_fib.c
+@@ -663,7 +663,7 @@ static int fib6_add_rt2node(struct fib6_node *fn, struct rt6_info *rt,
+
+ static __inline__ void fib6_start_gc(struct net *net, struct rt6_info *rt)
+ {
+- if (net->ipv6.ip6_fib_timer->expires == 0 &&
++ if (!timer_pending(net->ipv6.ip6_fib_timer) &&
+ (rt->rt6i_flags & (RTF_EXPIRES|RTF_CACHE)))
+ mod_timer(net->ipv6.ip6_fib_timer, jiffies +
+ net->ipv6.sysctl.ip6_rt_gc_interval);
+@@ -671,7 +671,7 @@ static __inline__ void fib6_start_gc(struct net *net, struct rt6_info *rt)
+
+ void fib6_force_start_gc(struct net *net)
+ {
+- if (net->ipv6.ip6_fib_timer->expires == 0)
++ if (!timer_pending(net->ipv6.ip6_fib_timer))
+ mod_timer(net->ipv6.ip6_fib_timer, jiffies +
+ net->ipv6.sysctl.ip6_rt_gc_interval);
+ }
+diff --git a/scripts/Makefile.modpost b/scripts/Makefile.modpost
+index 17092d6..9ee9783 100644
+--- a/scripts/Makefile.modpost
++++ b/scripts/Makefile.modpost
+@@ -101,6 +101,7 @@ quiet_cmd_kernel-mod = MODPOST $@
+ cmd_kernel-mod = $(modpost) $@
+
+ vmlinux.o: FORCE
++ @rm -fr $(kernelmarkersfile)
+ $(call cmd,kernel-mod)
+
+ # Declare generated files as targets for modpost
+diff --git a/scripts/mod/modpost.c b/scripts/mod/modpost.c
+index a07f91a..8f038e6 100644
+--- a/scripts/mod/modpost.c
++++ b/scripts/mod/modpost.c
+@@ -1992,7 +1992,8 @@ static void read_markers(const char *fname)
+ mod->skip = 1;
+ }
+
+- add_marker(mod, marker, fmt);
++ if (!mod->skip)
++ add_marker(mod, marker, fmt);
+ }
+ return;
+ fail:
+diff --git a/sound/pci/trident/trident_main.c b/sound/pci/trident/trident_main.c
+index bbcee2c..a69b420 100644
+--- a/sound/pci/trident/trident_main.c
++++ b/sound/pci/trident/trident_main.c
+@@ -1590,7 +1590,10 @@ static int snd_trident_trigger(struct snd_pcm_substream *substream,
+ if (spdif_flag) {
+ if (trident->device != TRIDENT_DEVICE_ID_SI7018) {
+ outl(trident->spdif_pcm_bits, TRID_REG(trident, NX_SPCSTATUS));
+- outb(trident->spdif_pcm_ctrl, TRID_REG(trident, NX_SPCTRL_SPCSO + 3));
++ val = trident->spdif_pcm_ctrl;
++ if (!go)
++ val &= ~(0x28);
++ outb(val, TRID_REG(trident, NX_SPCTRL_SPCSO + 3));
+ } else {
+ outl(trident->spdif_pcm_bits, TRID_REG(trident, SI_SPDIF_CS));
+ val = inl(TRID_REG(trident, SI_SERIAL_INTF_CTRL)) | SPDIF_EN;
+diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
+index 2d29e26..0262847 100644
+--- a/virt/kvm/kvm_main.c
++++ b/virt/kvm/kvm_main.c
+@@ -377,6 +377,9 @@ int __kvm_set_memory_region(struct kvm *kvm,
+ if (mem->slot >= kvm->nmemslots)
+ kvm->nmemslots = mem->slot + 1;
+
++ if (!npages)
++ kvm_arch_flush_shadow(kvm);
++
+ *memslot = new;
+
+ r = kvm_arch_set_memory_region(kvm, mem, old, user_alloc);
Added: dists/sid/linux-2.6/debian/patches/series/2
==============================================================================
--- (empty file)
+++ dists/sid/linux-2.6/debian/patches/series/2 Sat Aug 2 07:03:47 2008
@@ -0,0 +1,2 @@
+- bugfix/all/x86-acpi-sleep-x61s.patch
++ bugfix/all/stable/2.6.26.1.patch
More information about the Kernel-svn-changes
mailing list