[kernel] r18342 - in people/ukleinek/3.0-rt/linux-2.6/debian: . patches/bugfix/all/stable patches/series
Uwe Kleine-König
ukleinek-guest at alioth.debian.org
Fri Dec 2 18:55:38 UTC 2011
Author: ukleinek-guest
Date: Fri Dec 2 18:55:37 2011
New Revision: 18342
Log:
Add stable release 3.0.10
Added:
people/ukleinek/3.0-rt/linux-2.6/debian/patches/bugfix/all/stable/3.0.10.patch
people/ukleinek/3.0-rt/linux-2.6/debian/patches/series/6ptx3
Modified:
people/ukleinek/3.0-rt/linux-2.6/debian/changelog
Modified: people/ukleinek/3.0-rt/linux-2.6/debian/changelog
==============================================================================
--- people/ukleinek/3.0-rt/linux-2.6/debian/changelog Fri Dec 2 03:48:40 2011 (r18341)
+++ people/ukleinek/3.0-rt/linux-2.6/debian/changelog Fri Dec 2 18:55:37 2011 (r18342)
@@ -1,3 +1,11 @@
+linux-2.6 (3.0.0-6ptx3) unstable; urgency=low
+
+ * Add stable 3.0.10
+ 3.0.9-rt26 still applies on top of that and yields the same result as
+ 3.0.10-rt27.
+
+ -- Uwe Kleine-König <u.kleine-koenig at pengutronix.de> Wed, 23 Nov 2011 10:11:02 +0100
+
linux-2.6 (3.0.0-6ptx2) unstable; urgency=low
* [amd64] Update rt featureset to 3.0.9-rt26
Added: people/ukleinek/3.0-rt/linux-2.6/debian/patches/bugfix/all/stable/3.0.10.patch
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ people/ukleinek/3.0-rt/linux-2.6/debian/patches/bugfix/all/stable/3.0.10.patch Fri Dec 2 18:55:37 2011 (r18342)
@@ -0,0 +1,883 @@
+diff --git a/Makefile b/Makefile
+index 438c11a..36036d1 100644
+diff --git a/arch/powerpc/include/asm/sections.h b/arch/powerpc/include/asm/sections.h
+index 6fbce72..a0f358d 100644
+--- a/arch/powerpc/include/asm/sections.h
++++ b/arch/powerpc/include/asm/sections.h
+@@ -8,7 +8,7 @@
+
+ #ifdef __powerpc64__
+
+-extern char _end[];
++extern char __end_interrupts[];
+
+ static inline int in_kernel_text(unsigned long addr)
+ {
+diff --git a/arch/powerpc/include/asm/synch.h b/arch/powerpc/include/asm/synch.h
+index d7cab44..87878c6 100644
+--- a/arch/powerpc/include/asm/synch.h
++++ b/arch/powerpc/include/asm/synch.h
+@@ -13,6 +13,7 @@
+ extern unsigned int __start___lwsync_fixup, __stop___lwsync_fixup;
+ extern void do_lwsync_fixups(unsigned long value, void *fixup_start,
+ void *fixup_end);
++extern void do_final_fixups(void);
+
+ static inline void eieio(void)
+ {
+diff --git a/arch/powerpc/kernel/kvm.c b/arch/powerpc/kernel/kvm.c
+index b06bdae..ad892f7 100644
+--- a/arch/powerpc/kernel/kvm.c
++++ b/arch/powerpc/kernel/kvm.c
+@@ -131,7 +131,6 @@ static void kvm_patch_ins_b(u32 *inst, int addr)
+ /* On relocatable kernels interrupts handlers and our code
+ can be in different regions, so we don't patch them */
+
+- extern u32 __end_interrupts;
+ if ((ulong)inst < (ulong)&__end_interrupts)
+ return;
+ #endif
+diff --git a/arch/powerpc/kernel/setup_32.c b/arch/powerpc/kernel/setup_32.c
+index 620d792..c7e7b8c 100644
+--- a/arch/powerpc/kernel/setup_32.c
++++ b/arch/powerpc/kernel/setup_32.c
+@@ -107,6 +107,8 @@ notrace unsigned long __init early_init(unsigned long dt_ptr)
+ PTRRELOC(&__start___lwsync_fixup),
+ PTRRELOC(&__stop___lwsync_fixup));
+
++ do_final_fixups();
++
+ return KERNELBASE + offset;
+ }
+
+diff --git a/arch/powerpc/kernel/setup_64.c b/arch/powerpc/kernel/setup_64.c
+index a88bf27..7867fd1 100644
+--- a/arch/powerpc/kernel/setup_64.c
++++ b/arch/powerpc/kernel/setup_64.c
+@@ -352,6 +352,7 @@ void __init setup_system(void)
+ &__start___fw_ftr_fixup, &__stop___fw_ftr_fixup);
+ do_lwsync_fixups(cur_cpu_spec->cpu_features,
+ &__start___lwsync_fixup, &__stop___lwsync_fixup);
++ do_final_fixups();
+
+ /*
+ * Unflatten the device-tree passed by prom_init or kexec
+diff --git a/arch/powerpc/lib/feature-fixups.c b/arch/powerpc/lib/feature-fixups.c
+index 0d08d01..7a8a748 100644
+--- a/arch/powerpc/lib/feature-fixups.c
++++ b/arch/powerpc/lib/feature-fixups.c
+@@ -18,6 +18,8 @@
+ #include <linux/init.h>
+ #include <asm/cputable.h>
+ #include <asm/code-patching.h>
++#include <asm/page.h>
++#include <asm/sections.h>
+
+
+ struct fixup_entry {
+@@ -128,6 +130,27 @@ void do_lwsync_fixups(unsigned long value, void *fixup_start, void *fixup_end)
+ }
+ }
+
++void do_final_fixups(void)
++{
++#if defined(CONFIG_PPC64) && defined(CONFIG_RELOCATABLE)
++ int *src, *dest;
++ unsigned long length;
++
++ if (PHYSICAL_START == 0)
++ return;
++
++ src = (int *)(KERNELBASE + PHYSICAL_START);
++ dest = (int *)KERNELBASE;
++ length = (__end_interrupts - _stext) / sizeof(int);
++
++ while (length--) {
++ patch_instruction(dest, *src);
++ src++;
++ dest++;
++ }
++#endif
++}
++
+ #ifdef CONFIG_FTR_FIXUP_SELFTEST
+
+ #define check(x) \
+diff --git a/arch/powerpc/platforms/ps3/interrupt.c b/arch/powerpc/platforms/ps3/interrupt.c
+index 600ed2c..1aa478b 100644
+--- a/arch/powerpc/platforms/ps3/interrupt.c
++++ b/arch/powerpc/platforms/ps3/interrupt.c
+@@ -88,6 +88,7 @@ struct ps3_private {
+ struct ps3_bmp bmp __attribute__ ((aligned (PS3_BMP_MINALIGN)));
+ u64 ppe_id;
+ u64 thread_id;
++ unsigned long ipi_mask;
+ };
+
+ static DEFINE_PER_CPU(struct ps3_private, ps3_private);
+@@ -144,7 +145,11 @@ static void ps3_chip_unmask(struct irq_data *d)
+ static void ps3_chip_eoi(struct irq_data *d)
+ {
+ const struct ps3_private *pd = irq_data_get_irq_chip_data(d);
+- lv1_end_of_interrupt_ext(pd->ppe_id, pd->thread_id, d->irq);
++
++ /* non-IPIs are EOIed here. */
++
++ if (!test_bit(63 - d->irq, &pd->ipi_mask))
++ lv1_end_of_interrupt_ext(pd->ppe_id, pd->thread_id, d->irq);
+ }
+
+ /**
+@@ -691,6 +696,16 @@ void __init ps3_register_ipi_debug_brk(unsigned int cpu, unsigned int virq)
+ cpu, virq, pd->bmp.ipi_debug_brk_mask);
+ }
+
++void __init ps3_register_ipi_irq(unsigned int cpu, unsigned int virq)
++{
++ struct ps3_private *pd = &per_cpu(ps3_private, cpu);
++
++ set_bit(63 - virq, &pd->ipi_mask);
++
++ DBG("%s:%d: cpu %u, virq %u, ipi_mask %lxh\n", __func__, __LINE__,
++ cpu, virq, pd->ipi_mask);
++}
++
+ static unsigned int ps3_get_irq(void)
+ {
+ struct ps3_private *pd = &__get_cpu_var(ps3_private);
+@@ -720,6 +735,12 @@ static unsigned int ps3_get_irq(void)
+ BUG();
+ }
+ #endif
++
++ /* IPIs are EOIed here. */
++
++ if (test_bit(63 - plug, &pd->ipi_mask))
++ lv1_end_of_interrupt_ext(pd->ppe_id, pd->thread_id, plug);
++
+ return plug;
+ }
+
+diff --git a/arch/powerpc/platforms/ps3/platform.h b/arch/powerpc/platforms/ps3/platform.h
+index 9a196a8..1a633ed 100644
+--- a/arch/powerpc/platforms/ps3/platform.h
++++ b/arch/powerpc/platforms/ps3/platform.h
+@@ -43,6 +43,7 @@ void ps3_mm_shutdown(void);
+ void ps3_init_IRQ(void);
+ void ps3_shutdown_IRQ(int cpu);
+ void __init ps3_register_ipi_debug_brk(unsigned int cpu, unsigned int virq);
++void __init ps3_register_ipi_irq(unsigned int cpu, unsigned int virq);
+
+ /* smp */
+
+diff --git a/arch/powerpc/platforms/ps3/smp.c b/arch/powerpc/platforms/ps3/smp.c
+index 4c44794..f609345 100644
+--- a/arch/powerpc/platforms/ps3/smp.c
++++ b/arch/powerpc/platforms/ps3/smp.c
+@@ -94,6 +94,8 @@ static void __init ps3_smp_setup_cpu(int cpu)
+
+ if (result)
+ virqs[i] = NO_IRQ;
++ else
++ ps3_register_ipi_irq(cpu, virqs[i]);
+ }
+
+ ps3_register_ipi_debug_brk(cpu, virqs[PPC_MSG_DEBUGGER_BREAK]);
+diff --git a/arch/sh/include/asm/page.h b/arch/sh/include/asm/page.h
+index 822d608..abcc4dc 100644
+--- a/arch/sh/include/asm/page.h
++++ b/arch/sh/include/asm/page.h
+@@ -141,8 +141,13 @@ typedef struct page *pgtable_t;
+ #endif /* !__ASSEMBLY__ */
+
+ #ifdef CONFIG_UNCACHED_MAPPING
++#if defined(CONFIG_29BIT)
++#define UNCAC_ADDR(addr) P2SEGADDR(addr)
++#define CAC_ADDR(addr) P1SEGADDR(addr)
++#else
+ #define UNCAC_ADDR(addr) ((addr) - PAGE_OFFSET + uncached_start)
+ #define CAC_ADDR(addr) ((addr) - uncached_start + PAGE_OFFSET)
++#endif
+ #else
+ #define UNCAC_ADDR(addr) ((addr))
+ #define CAC_ADDR(addr) ((addr))
+diff --git a/arch/x86/platform/mrst/mrst.c b/arch/x86/platform/mrst/mrst.c
+index 7000e74..fe73276 100644
+--- a/arch/x86/platform/mrst/mrst.c
++++ b/arch/x86/platform/mrst/mrst.c
+@@ -678,36 +678,40 @@ static int __init sfi_parse_devs(struct sfi_table_header *table)
+ pentry = (struct sfi_device_table_entry *)sb->pentry;
+
+ for (i = 0; i < num; i++, pentry++) {
+- if (pentry->irq != (u8)0xff) { /* native RTE case */
++ int irq = pentry->irq;
++
++ if (irq != (u8)0xff) { /* native RTE case */
+ /* these SPI2 devices are not exposed to system as PCI
+ * devices, but they have separate RTE entry in IOAPIC
+ * so we have to enable them one by one here
+ */
+- ioapic = mp_find_ioapic(pentry->irq);
++ ioapic = mp_find_ioapic(irq);
+ irq_attr.ioapic = ioapic;
+- irq_attr.ioapic_pin = pentry->irq;
++ irq_attr.ioapic_pin = irq;
+ irq_attr.trigger = 1;
+ irq_attr.polarity = 1;
+- io_apic_set_pci_routing(NULL, pentry->irq, &irq_attr);
+- }
++ io_apic_set_pci_routing(NULL, irq, &irq_attr);
++ } else
++ irq = 0; /* No irq */
++
+ switch (pentry->type) {
+ case SFI_DEV_TYPE_IPC:
+ /* ID as IRQ is a hack that will go away */
+- pdev = platform_device_alloc(pentry->name, pentry->irq);
++ pdev = platform_device_alloc(pentry->name, irq);
+ if (pdev == NULL) {
+ pr_err("out of memory for SFI platform device '%s'.\n",
+ pentry->name);
+ continue;
+ }
+- install_irq_resource(pdev, pentry->irq);
++ install_irq_resource(pdev, irq);
+ pr_debug("info[%2d]: IPC bus, name = %16.16s, "
+- "irq = 0x%2x\n", i, pentry->name, pentry->irq);
++ "irq = 0x%2x\n", i, pentry->name, irq);
+ sfi_handle_ipc_dev(pdev);
+ break;
+ case SFI_DEV_TYPE_SPI:
+ memset(&spi_info, 0, sizeof(spi_info));
+ strncpy(spi_info.modalias, pentry->name, SFI_NAME_LEN);
+- spi_info.irq = pentry->irq;
++ spi_info.irq = irq;
+ spi_info.bus_num = pentry->host_num;
+ spi_info.chip_select = pentry->addr;
+ spi_info.max_speed_hz = pentry->max_freq;
+@@ -724,7 +728,7 @@ static int __init sfi_parse_devs(struct sfi_table_header *table)
+ memset(&i2c_info, 0, sizeof(i2c_info));
+ bus = pentry->host_num;
+ strncpy(i2c_info.type, pentry->name, SFI_NAME_LEN);
+- i2c_info.irq = pentry->irq;
++ i2c_info.irq = irq;
+ i2c_info.addr = pentry->addr;
+ pr_debug("info[%2d]: I2C bus = %d, name = %16.16s, "
+ "irq = 0x%2x, addr = 0x%x\n", i, bus,
+diff --git a/arch/x86/xen/enlighten.c b/arch/x86/xen/enlighten.c
+index 67d69f1..0fb662a 100644
+--- a/arch/x86/xen/enlighten.c
++++ b/arch/x86/xen/enlighten.c
+@@ -1337,7 +1337,7 @@ static int __cpuinit xen_hvm_cpu_notify(struct notifier_block *self,
+ int cpu = (long)hcpu;
+ switch (action) {
+ case CPU_UP_PREPARE:
+- per_cpu(xen_vcpu, cpu) = &HYPERVISOR_shared_info->vcpu_info[cpu];
++ xen_vcpu_setup(cpu);
+ if (xen_have_vector_callback)
+ xen_init_lock_cpu(cpu);
+ break;
+@@ -1367,7 +1367,6 @@ static void __init xen_hvm_guest_init(void)
+ xen_hvm_smp_init();
+ register_cpu_notifier(&xen_hvm_cpu_notifier);
+ xen_unplug_emulated_devices();
+- have_vcpu_info_placement = 0;
+ x86_init.irqs.intr_init = xen_init_IRQ;
+ xen_hvm_init_time_ops();
+ xen_hvm_init_mmu_ops();
+diff --git a/block/blk-map.c b/block/blk-map.c
+index e663ac2..164cd00 100644
+--- a/block/blk-map.c
++++ b/block/blk-map.c
+@@ -204,10 +204,11 @@ int blk_rq_map_user_iov(struct request_queue *q, struct request *rq,
+ if (!iov[i].iov_len)
+ return -EINVAL;
+
+- if (uaddr & queue_dma_alignment(q)) {
++ /*
++ * Keep going so we check length of all segments
++ */
++ if (uaddr & queue_dma_alignment(q))
+ unaligned = 1;
+- break;
+- }
+ }
+
+ if (unaligned || (q->dma_pad_mask & len) || map_data)
+diff --git a/drivers/gpu/drm/i915/i915_debugfs.c b/drivers/gpu/drm/i915/i915_debugfs.c
+index 0a893f7..e36efdc 100644
+--- a/drivers/gpu/drm/i915/i915_debugfs.c
++++ b/drivers/gpu/drm/i915/i915_debugfs.c
+@@ -865,7 +865,7 @@ static int i915_cur_delayinfo(struct seq_file *m, void *unused)
+ MEMSTAT_VID_SHIFT);
+ seq_printf(m, "Current P-state: %d\n",
+ (rgvstat & MEMSTAT_PSTATE_MASK) >> MEMSTAT_PSTATE_SHIFT);
+- } else if (IS_GEN6(dev)) {
++ } else if (IS_GEN6(dev) || IS_GEN7(dev)) {
+ u32 gt_perf_status = I915_READ(GEN6_GT_PERF_STATUS);
+ u32 rp_state_limits = I915_READ(GEN6_RP_STATE_LIMITS);
+ u32 rp_state_cap = I915_READ(GEN6_RP_STATE_CAP);
+diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
+index a087e1b..5548593 100644
+--- a/drivers/gpu/drm/i915/i915_gem.c
++++ b/drivers/gpu/drm/i915/i915_gem.c
+@@ -1475,7 +1475,7 @@ i915_gem_mmap_gtt(struct drm_file *file,
+
+ if (obj->base.size > dev_priv->mm.gtt_mappable_end) {
+ ret = -E2BIG;
+- goto unlock;
++ goto out;
+ }
+
+ if (obj->madv != I915_MADV_WILLNEED) {
+diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
+index 5609c06..cbf4c4c 100644
+--- a/drivers/gpu/drm/i915/intel_display.c
++++ b/drivers/gpu/drm/i915/intel_display.c
+@@ -7943,7 +7943,7 @@ void intel_modeset_init(struct drm_device *dev)
+ intel_init_emon(dev);
+ }
+
+- if (IS_GEN6(dev))
++ if (IS_GEN6(dev) || IS_GEN7(dev))
+ gen6_enable_rps(dev_priv);
+
+ INIT_WORK(&dev_priv->idle_work, intel_idle_update);
+@@ -7985,7 +7985,7 @@ void intel_modeset_cleanup(struct drm_device *dev)
+
+ if (IS_IRONLAKE_M(dev))
+ ironlake_disable_drps(dev);
+- if (IS_GEN6(dev))
++ if (IS_GEN6(dev) || IS_GEN7(dev))
+ gen6_disable_rps(dev);
+
+ if (IS_IRONLAKE_M(dev))
+diff --git a/drivers/gpu/drm/nouveau/nouveau_channel.c b/drivers/gpu/drm/nouveau/nouveau_channel.c
+index a7583a8..d31d355 100644
+--- a/drivers/gpu/drm/nouveau/nouveau_channel.c
++++ b/drivers/gpu/drm/nouveau/nouveau_channel.c
+@@ -159,6 +159,7 @@ nouveau_channel_alloc(struct drm_device *dev, struct nouveau_channel **chan_ret,
+ INIT_LIST_HEAD(&chan->nvsw.vbl_wait);
+ INIT_LIST_HEAD(&chan->nvsw.flip);
+ INIT_LIST_HEAD(&chan->fence.pending);
++ spin_lock_init(&chan->fence.lock);
+
+ /* Allocate DMA push buffer */
+ chan->pushbuf_bo = nouveau_channel_user_pushbuf_alloc(dev);
+diff --git a/drivers/gpu/drm/nouveau/nouveau_fence.c b/drivers/gpu/drm/nouveau/nouveau_fence.c
+index 7347075..56f06b0 100644
+--- a/drivers/gpu/drm/nouveau/nouveau_fence.c
++++ b/drivers/gpu/drm/nouveau/nouveau_fence.c
+@@ -542,8 +542,6 @@ nouveau_fence_channel_init(struct nouveau_channel *chan)
+ return ret;
+ }
+
+- INIT_LIST_HEAD(&chan->fence.pending);
+- spin_lock_init(&chan->fence.lock);
+ atomic_set(&chan->fence.last_sequence_irq, 0);
+ return 0;
+ }
+diff --git a/drivers/gpu/drm/radeon/atombios_dp.c b/drivers/gpu/drm/radeon/atombios_dp.c
+index b5628ce..3b77ad6 100644
+--- a/drivers/gpu/drm/radeon/atombios_dp.c
++++ b/drivers/gpu/drm/radeon/atombios_dp.c
+@@ -283,7 +283,7 @@ int radeon_dp_i2c_aux_ch(struct i2c_adapter *adapter, int mode,
+ }
+ }
+
+- DRM_ERROR("aux i2c too many retries, giving up\n");
++ DRM_DEBUG_KMS("aux i2c too many retries, giving up\n");
+ return -EREMOTEIO;
+ }
+
+diff --git a/drivers/leds/led-class.c b/drivers/leds/led-class.c
+index 661b692..6d5628b 100644
+--- a/drivers/leds/led-class.c
++++ b/drivers/leds/led-class.c
+@@ -270,11 +270,8 @@ void led_blink_set(struct led_classdev *led_cdev,
+ del_timer_sync(&led_cdev->blink_timer);
+
+ if (led_cdev->blink_set &&
+- !led_cdev->blink_set(led_cdev, delay_on, delay_off)) {
+- led_cdev->blink_delay_on = *delay_on;
+- led_cdev->blink_delay_off = *delay_off;
++ !led_cdev->blink_set(led_cdev, delay_on, delay_off))
+ return;
+- }
+
+ /* blink with 1 Hz as default if nothing specified */
+ if (!*delay_on && !*delay_off)
+diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c
+index e509147..cbb50d3 100644
+--- a/drivers/md/raid5.c
++++ b/drivers/md/raid5.c
+@@ -3120,12 +3120,16 @@ static void handle_stripe5(struct stripe_head *sh)
+ /* check if the array has lost two devices and, if so, some requests might
+ * need to be failed
+ */
+- if (s.failed > 1 && s.to_read+s.to_write+s.written)
+- handle_failed_stripe(conf, sh, &s, disks, &return_bi);
+- if (s.failed > 1 && s.syncing) {
+- md_done_sync(conf->mddev, STRIPE_SECTORS,0);
+- clear_bit(STRIPE_SYNCING, &sh->state);
+- s.syncing = 0;
++ if (s.failed > 1) {
++ sh->check_state = 0;
++ sh->reconstruct_state = 0;
++ if (s.to_read+s.to_write+s.written)
++ handle_failed_stripe(conf, sh, &s, disks, &return_bi);
++ if (s.syncing) {
++ md_done_sync(conf->mddev, STRIPE_SECTORS,0);
++ clear_bit(STRIPE_SYNCING, &sh->state);
++ s.syncing = 0;
++ }
+ }
+
+ /* might be able to return some write requests if the parity block
+@@ -3412,12 +3416,16 @@ static void handle_stripe6(struct stripe_head *sh)
+ /* check if the array has lost >2 devices and, if so, some requests
+ * might need to be failed
+ */
+- if (s.failed > 2 && s.to_read+s.to_write+s.written)
+- handle_failed_stripe(conf, sh, &s, disks, &return_bi);
+- if (s.failed > 2 && s.syncing) {
+- md_done_sync(conf->mddev, STRIPE_SECTORS,0);
+- clear_bit(STRIPE_SYNCING, &sh->state);
+- s.syncing = 0;
++ if (s.failed > 2) {
++ sh->check_state = 0;
++ sh->reconstruct_state = 0;
++ if (s.to_read+s.to_write+s.written)
++ handle_failed_stripe(conf, sh, &s, disks, &return_bi);
++ if (s.syncing) {
++ md_done_sync(conf->mddev, STRIPE_SECTORS,0);
++ clear_bit(STRIPE_SYNCING, &sh->state);
++ s.syncing = 0;
++ }
+ }
+
+ /*
+diff --git a/drivers/mfd/twl-core.c b/drivers/mfd/twl-core.c
+index b8f2a4e..b9188a2 100644
+--- a/drivers/mfd/twl-core.c
++++ b/drivers/mfd/twl-core.c
+@@ -109,7 +109,7 @@
+ #define twl_has_watchdog() false
+ #endif
+
+-#if defined(CONFIG_TWL4030_CODEC) || defined(CONFIG_TWL4030_CODEC_MODULE) ||\
++#if defined(CONFIG_MFD_TWL4030_AUDIO) || defined(CONFIG_MFD_TWL4030_AUDIO_MODULE) ||\
+ defined(CONFIG_SND_SOC_TWL6040) || defined(CONFIG_SND_SOC_TWL6040_MODULE)
+ #define twl_has_codec() true
+ #else
+diff --git a/drivers/net/wireless/b43/main.c b/drivers/net/wireless/b43/main.c
+index b1fe4fe..7c2e09a 100644
+--- a/drivers/net/wireless/b43/main.c
++++ b/drivers/net/wireless/b43/main.c
+@@ -2401,6 +2401,13 @@ static int b43_upload_microcode(struct b43_wldev *dev)
+ b43_print_fw_helptext(dev->wl, 1);
+ err = -EOPNOTSUPP;
+ goto error;
++ } else if (fwrev >= 598) {
++ b43err(dev->wl, "YOUR FIRMWARE IS TOO NEW. Support for "
++ "firmware 598 and up requires kernel 3.2 or newer. You "
++ "have to install older firmware or upgrade kernel.\n");
++ b43_print_fw_helptext(dev->wl, 1);
++ err = -EOPNOTSUPP;
++ goto error;
+ }
+ dev->fw.rev = fwrev;
+ dev->fw.patch = fwpatch;
+diff --git a/drivers/virtio/virtio_pci.c b/drivers/virtio/virtio_pci.c
+index 4bcc8b8..ecb9254 100644
+--- a/drivers/virtio/virtio_pci.c
++++ b/drivers/virtio/virtio_pci.c
+@@ -590,11 +590,11 @@ static struct virtio_config_ops virtio_pci_config_ops = {
+
+ static void virtio_pci_release_dev(struct device *_d)
+ {
+- struct virtio_device *dev = container_of(_d, struct virtio_device,
+- dev);
+- struct virtio_pci_device *vp_dev = to_vp_device(dev);
+-
+- kfree(vp_dev);
++ /*
++ * No need for a release method as we allocate/free
++ * all devices together with the pci devices.
++ * Provide an empty one to avoid getting a warning from core.
++ */
+ }
+
+ /* the PCI probing function */
+@@ -682,6 +682,7 @@ static void __devexit virtio_pci_remove(struct pci_dev *pci_dev)
+ pci_iounmap(pci_dev, vp_dev->ioaddr);
+ pci_release_regions(pci_dev);
+ pci_disable_device(pci_dev);
++ kfree(vp_dev);
+ }
+
+ #ifdef CONFIG_PM
+diff --git a/drivers/xen/gntalloc.c b/drivers/xen/gntalloc.c
+index f6832f4..e1c4c6e 100644
+--- a/drivers/xen/gntalloc.c
++++ b/drivers/xen/gntalloc.c
+@@ -135,7 +135,7 @@ static int add_grefs(struct ioctl_gntalloc_alloc_gref *op,
+ /* Grant foreign access to the page. */
+ gref->gref_id = gnttab_grant_foreign_access(op->domid,
+ pfn_to_mfn(page_to_pfn(gref->page)), readonly);
+- if (gref->gref_id < 0) {
++ if ((int)gref->gref_id < 0) {
+ rc = gref->gref_id;
+ goto undo;
+ }
+@@ -280,7 +280,7 @@ static long gntalloc_ioctl_alloc(struct gntalloc_file_private_data *priv,
+ goto out;
+ }
+
+- gref_ids = kzalloc(sizeof(gref_ids[0]) * op.count, GFP_TEMPORARY);
++ gref_ids = kcalloc(op.count, sizeof(gref_ids[0]), GFP_TEMPORARY);
+ if (!gref_ids) {
+ rc = -ENOMEM;
+ goto out;
+diff --git a/fs/hfs/trans.c b/fs/hfs/trans.c
+index e673a88..b1ce4c7 100644
+--- a/fs/hfs/trans.c
++++ b/fs/hfs/trans.c
+@@ -40,6 +40,8 @@ int hfs_mac2asc(struct super_block *sb, char *out, const struct hfs_name *in)
+
+ src = in->name;
+ srclen = in->len;
++ if (srclen > HFS_NAMELEN)
++ srclen = HFS_NAMELEN;
+ dst = out;
+ dstlen = HFS_MAX_NAMELEN;
+ if (nls_io) {
+diff --git a/include/drm/drm_pciids.h b/include/drm/drm_pciids.h
+index 3d53efd..f81676f 100644
+--- a/include/drm/drm_pciids.h
++++ b/include/drm/drm_pciids.h
+@@ -4,6 +4,7 @@
+ */
+ #define radeon_PCI_IDS \
+ {0x1002, 0x3150, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV380|RADEON_IS_MOBILITY}, \
++ {0x1002, 0x3151, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV380|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \
+ {0x1002, 0x3152, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV380|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \
+ {0x1002, 0x3154, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV380|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \
+ {0x1002, 0x3155, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV380|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \
+@@ -55,6 +56,7 @@
+ {0x1002, 0x4C64, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV250|RADEON_IS_MOBILITY}, \
+ {0x1002, 0x4C66, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV250|RADEON_IS_MOBILITY}, \
+ {0x1002, 0x4C67, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV250|RADEON_IS_MOBILITY}, \
++ {0x1002, 0x4C6E, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RV280|RADEON_IS_MOBILITY}, \
+ {0x1002, 0x4E44, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R300}, \
+ {0x1002, 0x4E45, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R300}, \
+ {0x1002, 0x4E46, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_R300}, \
+diff --git a/mm/backing-dev.c b/mm/backing-dev.c
+index e56fe35..b3b122f 100644
+--- a/mm/backing-dev.c
++++ b/mm/backing-dev.c
+@@ -686,6 +686,14 @@ void bdi_destroy(struct backing_dev_info *bdi)
+
+ bdi_unregister(bdi);
+
++ /*
++ * If bdi_unregister() had already been called earlier, the
++ * wakeup_timer could still be armed because bdi_prune_sb()
++ * can race with the bdi_wakeup_thread_delayed() calls from
++ * __mark_inode_dirty().
++ */
++ del_timer_sync(&bdi->wb.wakeup_timer);
++
+ for (i = 0; i < NR_BDI_STAT_ITEMS; i++)
+ percpu_counter_destroy(&bdi->bdi_stat[i]);
+
+diff --git a/security/keys/user_defined.c b/security/keys/user_defined.c
+index 5b366d7..69ff52c 100644
+--- a/security/keys/user_defined.c
++++ b/security/keys/user_defined.c
+@@ -102,7 +102,8 @@ int user_update(struct key *key, const void *data, size_t datalen)
+ key->expiry = 0;
+ }
+
+- kfree_rcu(zap, rcu);
++ if (zap)
++ kfree_rcu(zap, rcu);
+
+ error:
+ return ret;
+diff --git a/sound/pci/hda/hda_codec.c b/sound/pci/hda/hda_codec.c
+index 45b4a8d..2195851 100644
+--- a/sound/pci/hda/hda_codec.c
++++ b/sound/pci/hda/hda_codec.c
+@@ -2187,6 +2187,39 @@ int snd_hda_codec_reset(struct hda_codec *codec)
+ return 0;
+ }
+
++typedef int (*map_slave_func_t)(void *, struct snd_kcontrol *);
++
++/* apply the function to all matching slave ctls in the mixer list */
++static int map_slaves(struct hda_codec *codec, const char * const *slaves,
++ map_slave_func_t func, void *data)
++{
++ struct hda_nid_item *items;
++ const char * const *s;
++ int i, err;
++
++ items = codec->mixers.list;
++ for (i = 0; i < codec->mixers.used; i++) {
++ struct snd_kcontrol *sctl = items[i].kctl;
++ if (!sctl || !sctl->id.name ||
++ sctl->id.iface != SNDRV_CTL_ELEM_IFACE_MIXER)
++ continue;
++ for (s = slaves; *s; s++) {
++ if (!strcmp(sctl->id.name, *s)) {
++ err = func(data, sctl);
++ if (err)
++ return err;
++ break;
++ }
++ }
++ }
++ return 0;
++}
++
++static int check_slave_present(void *data, struct snd_kcontrol *sctl)
++{
++ return 1;
++}
++
+ /**
+ * snd_hda_add_vmaster - create a virtual master control and add slaves
+ * @codec: HD-audio codec
+@@ -2207,12 +2240,10 @@ int snd_hda_add_vmaster(struct hda_codec *codec, char *name,
+ unsigned int *tlv, const char * const *slaves)
+ {
+ struct snd_kcontrol *kctl;
+- const char * const *s;
+ int err;
+
+- for (s = slaves; *s && !snd_hda_find_mixer_ctl(codec, *s); s++)
+- ;
+- if (!*s) {
++ err = map_slaves(codec, slaves, check_slave_present, NULL);
++ if (err != 1) {
+ snd_printdd("No slave found for %s\n", name);
+ return 0;
+ }
+@@ -2223,23 +2254,10 @@ int snd_hda_add_vmaster(struct hda_codec *codec, char *name,
+ if (err < 0)
+ return err;
+
+- for (s = slaves; *s; s++) {
+- struct snd_kcontrol *sctl;
+- int i = 0;
+- for (;;) {
+- sctl = _snd_hda_find_mixer_ctl(codec, *s, i);
+- if (!sctl) {
+- if (!i)
+- snd_printdd("Cannot find slave %s, "
+- "skipped\n", *s);
+- break;
+- }
+- err = snd_ctl_add_slave(kctl, sctl);
+- if (err < 0)
+- return err;
+- i++;
+- }
+- }
++ err = map_slaves(codec, slaves, (map_slave_func_t)snd_ctl_add_slave,
++ kctl);
++ if (err < 0)
++ return err;
+ return 0;
+ }
+ EXPORT_SYMBOL_HDA(snd_hda_add_vmaster);
+diff --git a/sound/soc/codecs/wm8994.c b/sound/soc/codecs/wm8994.c
+index fb9f08a..2194912 100644
+--- a/sound/soc/codecs/wm8994.c
++++ b/sound/soc/codecs/wm8994.c
+@@ -56,7 +56,7 @@ static int wm8994_retune_mobile_base[] = {
+ static int wm8994_readable(struct snd_soc_codec *codec, unsigned int reg)
+ {
+ struct wm8994_priv *wm8994 = snd_soc_codec_get_drvdata(codec);
+- struct wm8994 *control = wm8994->control_data;
++ struct wm8994 *control = codec->control_data;
+
+ switch (reg) {
+ case WM8994_GPIO_1:
+diff --git a/sound/usb/mixer.c b/sound/usb/mixer.c
+index cdd19d7..0de7cbd 100644
+--- a/sound/usb/mixer.c
++++ b/sound/usb/mixer.c
+@@ -765,10 +765,60 @@ static void usb_mixer_elem_free(struct snd_kcontrol *kctl)
+ * interface to ALSA control for feature/mixer units
+ */
+
++/* volume control quirks */
++static void volume_control_quirks(struct usb_mixer_elem_info *cval,
++ struct snd_kcontrol *kctl)
++{
++ switch (cval->mixer->chip->usb_id) {
++ case USB_ID(0x0471, 0x0101):
++ case USB_ID(0x0471, 0x0104):
++ case USB_ID(0x0471, 0x0105):
++ case USB_ID(0x0672, 0x1041):
++ /* quirk for UDA1321/N101.
++ * note that detection between firmware 2.1.1.7 (N101)
++ * and later 2.1.1.21 is not very clear from datasheets.
++ * I hope that the min value is -15360 for newer firmware --jk
++ */
++ if (!strcmp(kctl->id.name, "PCM Playback Volume") &&
++ cval->min == -15616) {
++ snd_printk(KERN_INFO
++ "set volume quirk for UDA1321/N101 chip\n");
++ cval->max = -256;
++ }
++ break;
++
++ case USB_ID(0x046d, 0x09a4):
++ if (!strcmp(kctl->id.name, "Mic Capture Volume")) {
++ snd_printk(KERN_INFO
++ "set volume quirk for QuickCam E3500\n");
++ cval->min = 6080;
++ cval->max = 8768;
++ cval->res = 192;
++ }
++ break;
++
++ case USB_ID(0x046d, 0x0808):
++ case USB_ID(0x046d, 0x0809):
++ case USB_ID(0x046d, 0x0991):
++ /* Most audio usb devices lie about volume resolution.
++ * Most Logitech webcams have res = 384.
++ * Proboly there is some logitech magic behind this number --fishor
++ */
++ if (!strcmp(kctl->id.name, "Mic Capture Volume")) {
++ snd_printk(KERN_INFO
++ "set resolution quirk: cval->res = 384\n");
++ cval->res = 384;
++ }
++ break;
++
++ }
++}
++
+ /*
+ * retrieve the minimum and maximum values for the specified control
+ */
+-static int get_min_max(struct usb_mixer_elem_info *cval, int default_min)
++static int get_min_max_with_quirks(struct usb_mixer_elem_info *cval,
++ int default_min, struct snd_kcontrol *kctl)
+ {
+ /* for failsafe */
+ cval->min = default_min;
+@@ -844,6 +894,9 @@ static int get_min_max(struct usb_mixer_elem_info *cval, int default_min)
+ cval->initialized = 1;
+ }
+
++ if (kctl)
++ volume_control_quirks(cval, kctl);
++
+ /* USB descriptions contain the dB scale in 1/256 dB unit
+ * while ALSA TLV contains in 1/100 dB unit
+ */
+@@ -864,6 +917,7 @@ static int get_min_max(struct usb_mixer_elem_info *cval, int default_min)
+ return 0;
+ }
+
++#define get_min_max(cval, def) get_min_max_with_quirks(cval, def, NULL)
+
+ /* get a feature/mixer unit info */
+ static int mixer_ctl_feature_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
+@@ -881,8 +935,17 @@ static int mixer_ctl_feature_info(struct snd_kcontrol *kcontrol, struct snd_ctl_
+ uinfo->value.integer.min = 0;
+ uinfo->value.integer.max = 1;
+ } else {
+- if (! cval->initialized)
+- get_min_max(cval, 0);
++ if (!cval->initialized) {
++ get_min_max_with_quirks(cval, 0, kcontrol);
++ if (cval->initialized && cval->dBmin >= cval->dBmax) {
++ kcontrol->vd[0].access &=
++ ~(SNDRV_CTL_ELEM_ACCESS_TLV_READ |
++ SNDRV_CTL_ELEM_ACCESS_TLV_CALLBACK);
++ snd_ctl_notify(cval->mixer->chip->card,
++ SNDRV_CTL_EVENT_MASK_INFO,
++ &kcontrol->id);
++ }
++ }
+ uinfo->value.integer.min = 0;
+ uinfo->value.integer.max =
+ (cval->max - cval->min + cval->res - 1) / cval->res;
+@@ -1036,9 +1099,6 @@ static void build_feature_ctl(struct mixer_build *state, void *raw_desc,
+ cval->ch_readonly = readonly_mask;
+ }
+
+- /* get min/max values */
+- get_min_max(cval, 0);
+-
+ /* if all channels in the mask are marked read-only, make the control
+ * read-only. set_cur_mix_value() will check the mask again and won't
+ * issue write commands to read-only channels. */
+@@ -1060,6 +1120,9 @@ static void build_feature_ctl(struct mixer_build *state, void *raw_desc,
+ len = snd_usb_copy_string_desc(state, nameid,
+ kctl->id.name, sizeof(kctl->id.name));
+
++ /* get min/max values */
++ get_min_max_with_quirks(cval, 0, kctl);
++
+ switch (control) {
+ case UAC_FU_MUTE:
+ case UAC_FU_VOLUME:
+@@ -1109,51 +1172,6 @@ static void build_feature_ctl(struct mixer_build *state, void *raw_desc,
+ break;
+ }
+
+- /* volume control quirks */
+- switch (state->chip->usb_id) {
+- case USB_ID(0x0471, 0x0101):
+- case USB_ID(0x0471, 0x0104):
+- case USB_ID(0x0471, 0x0105):
+- case USB_ID(0x0672, 0x1041):
+- /* quirk for UDA1321/N101.
+- * note that detection between firmware 2.1.1.7 (N101)
+- * and later 2.1.1.21 is not very clear from datasheets.
+- * I hope that the min value is -15360 for newer firmware --jk
+- */
+- if (!strcmp(kctl->id.name, "PCM Playback Volume") &&
+- cval->min == -15616) {
+- snd_printk(KERN_INFO
+- "set volume quirk for UDA1321/N101 chip\n");
+- cval->max = -256;
+- }
+- break;
+-
+- case USB_ID(0x046d, 0x09a4):
+- if (!strcmp(kctl->id.name, "Mic Capture Volume")) {
+- snd_printk(KERN_INFO
+- "set volume quirk for QuickCam E3500\n");
+- cval->min = 6080;
+- cval->max = 8768;
+- cval->res = 192;
+- }
+- break;
+-
+- case USB_ID(0x046d, 0x0808):
+- case USB_ID(0x046d, 0x0809):
+- case USB_ID(0x046d, 0x0991):
+- /* Most audio usb devices lie about volume resolution.
+- * Most Logitech webcams have res = 384.
+- * Proboly there is some logitech magic behind this number --fishor
+- */
+- if (!strcmp(kctl->id.name, "Mic Capture Volume")) {
+- snd_printk(KERN_INFO
+- "set resolution quirk: cval->res = 384\n");
+- cval->res = 384;
+- }
+- break;
+-
+- }
+-
+ range = (cval->max - cval->min) / cval->res;
+ /* Are there devices with volume range more than 255? I use a bit more
+ * to be sure. 384 is a resolution magic number found on Logitech
Added: people/ukleinek/3.0-rt/linux-2.6/debian/patches/series/6ptx3
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ people/ukleinek/3.0-rt/linux-2.6/debian/patches/series/6ptx3 Fri Dec 2 18:55:37 2011 (r18342)
@@ -0,0 +1 @@
++ bugfix/all/stable/3.0.10.patch
More information about the Kernel-svn-changes
mailing list