[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