3.4.90-stable review
Subsystems (2)
Greg Kroah-Hartman
maintainercover 3.4.90-stable review
This is the start of the stable review cycle for the 3.4.90 release. There are 22 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Tue May 13 19:20:50 UTC 2014. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
kernel.org/pub/linux/kernel/v3.0/stable-review/patch-3.4.90-rc1.gz
and the diffstat can be found below.
thanks,
greg k-h
-------------
Pseudo-Shortlog of commits:
Greg Kroah-Hartman <[email protected]>
Linux 3.4.90-rc1
Mike Snitzer <[email protected]>
dm thin: fix dangling bio in process_deferred_bios error path
Giacomo Comes <[email protected]>
Skip intel_crt_init for Dell XPS 8700
Dan Carpenter <[email protected]>
mtd: sm_ftl: heap corruption in sm_create_sysfs_attributes()
Dan Carpenter <[email protected]>
mtd: nuc900_nand: NULL dereference in nuc900_nand_enable()
Mikulas Patocka <[email protected]>
tgafb: fix data copying
Marek Vasut <[email protected]>
gpio: mxs: Allow for recursive enable_irq_wake() call
Larry Finger <[email protected]>
rtlwifi: rtl8192se: Fix too long disable of IRQs
Larry Finger <[email protected]>
rtlwifi: rtl8192cu: Fix too long disable of IRQs
Jeff Layton <[email protected]>
locks: allow __break_lease to sleep even when break_time is 0
Dan Williams <[email protected]>
libata/ahci: accommodate tag ordered controllers
Rafał Miłecki <[email protected]>
b43: Fix machine check error due to improper access of B43_MMIO_PSM_PHY_HDR
Mikulas Patocka <[email protected]>
mach64: fix cursor when character width is not a multiple of 8 pixels
Mikulas Patocka <[email protected]>
mach64: use unaligned access
Mikulas Patocka <[email protected]>
matroxfb: restore the registers M_ACCESS and M_PITCH
Mikulas Patocka <[email protected]>
framebuffer: fix cfb_copyarea
Ard Biesheuvel <[email protected]>
crypto: ghash-clmulni-intel - use C implementation for setkey()
Tyler Stachecki <[email protected]>
mpt2sas: Don't disable device twice at suspend.
Rusty Russell <[email protected]>
virtio_balloon: don't softlockup on huge balloon changes.
Huacai Chen <[email protected]>
MIPS: Hibernate: Flush TLB entries in swsusp_arch_resume()
Matthew Daley <[email protected]>
floppy: don't write kernel-only members to FDRAWCMD ioctl output
Matthew Daley <[email protected]>
floppy: ignore kernel-only members in FDRAWCMD ioctl input
Tomoki Sekiyama <[email protected]>
drivers/tty/hvc: don't free hvc_console_setup after init
-------------
Diffstat:
Makefile | 4 +- arch/mips/power/hibernate.S | 1 + arch/x86/crypto/ghash-clmulni-intel_asm.S | 28 --- arch/x86/crypto/ghash-clmulni-intel_glue.c | 14 +- drivers/ata/libata-core.c | 21 ++- drivers/block/floppy.c | 11 +- drivers/gpio/gpio-mxs.c | 3 +- drivers/gpu/drm/i915/intel_crt.c | 8 + drivers/md/dm-thin.c | 2 +- drivers/mtd/nand/nuc900_nand.c | 2 +- drivers/mtd/sm_ftl.c | 11 +- drivers/net/wireless/b43/phy_n.c | 14 +- drivers/net/wireless/rtlwifi/rtl8192cu/hw.c | 15 +- drivers/net/wireless/rtlwifi/rtl8192se/hw.c | 27 ++- drivers/scsi/mpt2sas/mpt2sas_scsih.c | 1 - drivers/tty/hvc/hvc_console.c | 2 +- drivers/video/aty/mach64_accel.c | 3 +- drivers/video/aty/mach64_cursor.c | 22 ++- drivers/video/cfbcopyarea.c | 153 ++++++++-------- drivers/video/matrox/matroxfb_accel.c | 38 ++-- drivers/video/matrox/matroxfb_base.h | 2 + drivers/video/tgafb.c | 264 ++++++---------------------- drivers/virtio/virtio_balloon.c | 6 + fs/locks.c | 7 +- include/linux/libata.h | 1 + 25 files changed, 280 insertions(+), 380 deletions(-)
Greg Kroah-Hartman
maintainerPATCH 1/22 drivers/tty/hvc: dont free hvc_console_setup after init
3.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tomoki Sekiyama <[email protected]>
commit 501fed45b7e8836ee9373f4d31e2d85e3db6103a upstream.
When 'console=hvc0' is specified to the kernel parameter in x86 KVM guest, hvc console is setup within a kthread. However, that will cause SEGV and the boot will fail when the driver is builtin to the kernel, because currently hvc_console_setup() is annotated with '__init'. This patch removes '__init' to boot the guest successfully with 'console=hvc0'.
--- drivers/tty/hvc/hvc_console.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/tty/hvc/hvc_console.c +1 -1
@@ -190,7 +190,7 @@ static struct tty_driver *hvc_console_dereturn hvc_driver; } -static int __init hvc_console_setup (struct console *co,char *options) +static int hvc_console_setup (struct console *co,char *options) {if (co->index <0 || co->index >=MAX_NR_HVC_CONSOLES )return -ENODEV ;
Greg Kroah-Hartman
maintainerPATCH 2/22 floppy: ignore kernel-only members in FDRAWCMD ioctl input
In reply to Greg Kroah-Hartman3.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Matthew Daley <[email protected]>
commit ef87dbe7614341c2e7bfe8d32fcb7028cc97442c upstream.
Always clear out these floppy_raw_cmd struct members after copying the entire structure from userspace so that the in-kernel version is always valid and never left in an interdeterminate state.
--- drivers/block/floppy.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
drivers/block/floppy.c +3 -3
@@ -3112,10 +3112,11 @@ loop:return -ENOMEM ; *rcmd = ptr; ret =copy_from_user (ptr, param,sizeof (*ptr)); -if (ret) -return -EFAULT ; ptr->next =NULL ; ptr->buffer_length =0 ; + ptr->kernel_data =NULL ; +if (ret) +return -EFAULT ; param +=sizeof (struct floppy_raw_cmd );if (ptr->cmd_count >33 )/* the command may now also take up the space
@@ -3131,7 +3132,6 @@ loop:for (i =0 ; i <16 ; i++) ptr->reply[i] =0 ; ptr->resultcode =0 ; - ptr->kernel_data =NULL ;if (ptr->flags & (FD_RAW_READ |FD_RAW_WRITE )) {if (ptr->length <=0 )
Greg Kroah-Hartman
maintainerPATCH 3/22 floppy: dont write kernel-only members to FDRAWCMD ioctl output
In reply to Greg Kroah-Hartman3.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Matthew Daley <[email protected]>
commit 2145e15e0557a01b9195d1c7199a1b92cb9be81f upstream.
Do not leak kernel-only floppy_raw_cmd structure members to userspace. This includes the linked-list pointer and the pointer to the allocated DMA space.
--- drivers/block/floppy.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
drivers/block/floppy.c +4 -1
@@ -3058,7 +3058,10 @@ static int raw_cmd_copyout(int cmd, voidint ret;while (ptr) { - ret =copy_to_user (param, ptr,sizeof (*ptr)); +struct floppy_raw_cmd cmd = *ptr; + cmd.next =NULL ; + cmd.kernel_data =NULL ; + ret =copy_to_user (param, &cmd,sizeof (cmd));if (ret)return -EFAULT ; param +=sizeof (struct floppy_raw_cmd );
Greg Kroah-Hartman
maintainerPATCH 4/22 MIPS: Hibernate: Flush TLB entries in swsusp_arch_resume()
In reply to Greg Kroah-Hartman3.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Huacai Chen <[email protected]>
commit c14af233fbe279d0e561ecf84f1208b1bae087ef upstream.
The original MIPS hibernate code flushes cache and TLB entries in swsusp_arch_resume(). But they are removed in Commit 44eeab67416711 (MIPS: Hibernation: Remove SMP TLB and cacheflushing code.). A cross- CPU flush is surely unnecessary because all but the local CPU have already been disabled. But a local flush (at least the TLB flush) is needed. When we do hibernation on Loongson-3 with an E1000E NIC, it is very easy to produce a kernel panic (kernel page fault, or unaligned access). The root cause is E1000E driver use vzalloc_node() to allocate pages, the stale TLB entries of the booting kernel will be misused by the resumed target kernel.
Patchwork: https://patchwork.linux-mips.org/patch/6643/
--- arch/mips/power/hibernate.S | 1 + 1 file changed, 1 insertion(+)
arch/mips/power/hibernate.S +1 -0
@@ -44,6 +44,7 @@ LEAF(swsusp_arch_resume) bne t1, t3, 1b PTR_L t0, PBE_NEXT(t0) bnez t0, 0b + jal local_flush_tlb_all /* Avoid TLB mismatch after kernel resume */ PTR_LA t0, saved_regs PTR_L ra, PT_R31(t0) PTR_L sp, PT_R29(t0)
Greg Kroah-Hartman
maintainerPATCH 5/22 virtio_balloon: dont softlockup on huge balloon changes.
In reply to Greg Kroah-Hartman3.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Rusty Russell <[email protected]>
commit 1f74ef0f2d7d692fcd615621e0e734c3e7771413 upstream.
When adding or removing 100G from a balloon:
BUG: soft lockup - CPU#0 stuck for 22s! [vballoon:367]
We have a wait_event_interruptible(), but the condition is always true (more ballooning to do) so we don't ever sleep. We also have a wait_event() for the host to ack, but that is also always true as QEMU is synchronous for balloon operations.
--- drivers/virtio/virtio_balloon.c | 6 ++++++ 1 file changed, 6 insertions(+)
drivers/virtio/virtio_balloon.c +6 -0
@@ -305,6 +305,12 @@ static int balloon(void *_vballoon)else if (diff <0 )leak_balloon (vb, -diff);update_balloon_size (vb); + +/* +* For large balloon changes, we could spend a lot of time +* and always have work to do. Be nice if preempt disabled. +*/ +cond_resched (); }return 0 ; }
Greg Kroah-Hartman
maintainerPATCH 6/22 mpt2sas: Dont disable device twice at suspend.
In reply to Greg Kroah-Hartman3.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tyler Stachecki <[email protected]>
commit af61e27c3f77c7623b5335590ae24b6a5c323e22 upstream.
On suspend, _scsih_suspend calls mpt2sas_base_free_resources, which in turn calls pci_disable_device if the device is enabled prior to suspending. However, _scsih_suspend also calls pci_disable_device itself.
Thus, in the event that the device is enabled prior to suspending, pci_disable_device will be called twice. This patch removes the duplicate call to pci_disable_device in _scsi_suspend as it is both unnecessary and results in a kernel oops.
--- drivers/scsi/mpt2sas/mpt2sas_scsih.c | 1 - 1 file changed, 1 deletion(-)
drivers/scsi/mpt2sas/mpt2sas_scsih.c +0 -1
@@ -8086,7 +8086,6 @@ _scsih_suspend(struct pci_dev *pdev, pm_mpt2sas_base_free_resources (ioc);pci_save_state (pdev); -pci_disable_device (pdev);pci_set_power_state (pdev, device_state);return 0 ; }
Greg Kroah-Hartman
maintainerPATCH 7/22 crypto: ghash-clmulni-intel - use C implementation for setkey()
In reply to Greg Kroah-Hartman3.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ard Biesheuvel <[email protected]>
commit 8ceee72808d1ae3fb191284afc2257a2be964725 upstream.
The GHASH setkey() function uses SSE registers but fails to call kernel_fpu_begin()/kernel_fpu_end(). Instead of adding these calls, and then having to deal with the restriction that they cannot be called from interrupt context, move the setkey() implementation to the C domain.
Note that setkey() does not use any particular SSE features and is not expected to become a performance bottleneck.
--- arch/x86/crypto/ghash-clmulni-intel_asm.S | 28 ---------------------------- arch/x86/crypto/ghash-clmulni-intel_glue.c | 14 +++++++++++--- 2 files changed, 11 insertions(+), 31 deletions(-)
arch/x86/crypto/ghash-clmulni-intel_asm.S +0 -28
@@ -24,10 +24,6 @@ .align 16 .Lbswap_mask: .octa 0x000102030405060708090a0b0c0d0e0f -.Lpoly: - .octa 0xc2000000000000000000000000000001 -.Ltwo_one: - .octa 0x00000001000000000000000000000001 #define DATA %xmm0 #define SHASH %xmm1
@@ -131,27 +127,3 @@ ENTRY(clmul_ghash_update) movups DATA, (%rdi) .Lupdate_just_ret: ret - -/* - * void clmul_ghash_setkey(be128 *shash, const u8 *key); - * - * Calculate hash_key << 1 mod poly - */ -ENTRY(clmul_ghash_setkey) - movaps .Lbswap_mask, BSWAP - movups (%rsi), %xmm0 - PSHUFB_XMM BSWAP %xmm0 - movaps %xmm0, %xmm1 - psllq $1, %xmm0 - psrlq $63, %xmm1 - movaps %xmm1, %xmm2 - pslldq $8, %xmm1 - psrldq $8, %xmm2 - por %xmm1, %xmm0 - # reduction - pshufd $0b00100100, %xmm2, %xmm1 - pcmpeqd .Ltwo_one, %xmm1 - pand .Lpoly, %xmm1 - pxor %xmm1, %xmm0 - movups %xmm0, (%rdi) - ret
arch/x86/crypto/ghash-clmulni-intel_glue.c +11 -3
@@ -30,8 +30,6 @@ void clmul_ghash_mul(char *dst, const bevoid clmul_ghash_update (char *dst,const char *src,unsigned int srclen,const be128 *shash); -void clmul_ghash_setkey (be128 *shash,const u8 *key); -struct ghash_async_ctx {struct cryptd_ahash *cryptd_tfm; };
@@ -58,13 +56,23 @@ static int ghash_setkey(struct crypto_sh const u8 *key, unsigned int keylen) {struct ghash_ctx *ctx =crypto_shash_ctx (tfm); +be128 *x = (be128 *)key; +u64 a, b;if (keylen !=GHASH_BLOCK_SIZE ) {crypto_shash_set_flags (tfm,CRYPTO_TFM_RES_BAD_KEY_LEN );return -EINVAL ; } -clmul_ghash_setkey (&ctx->shash, key); +/* perform multiplication by 'x' in GF(2^128) */ + a =be64_to_cpu (x->a); + b =be64_to_cpu (x->b); + + ctx->shash.a = (__be64)((b <<1 ) | (a >>63 )); + ctx->shash.b = (__be64)((a <<1 ) | (b >>63 )); + +if (a >>63 ) + ctx->shash.b ^=cpu_to_be64 (0xc2 );return 0 ; }
Greg Kroah-Hartman
maintainerPATCH 8/22 framebuffer: fix cfb_copyarea
In reply to Greg Kroah-Hartman3.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mikulas Patocka <[email protected]>
commit 00a9d699bc85052d2d3ed56251cd928024ce06a3 upstream.
The function cfb_copyarea is buggy when the copy operation is not aligned on long boundary (4 bytes on 32-bit machines, 8 bytes on 64-bit machines).
How to reproduce:
- use x86-64 machine
- use a framebuffer driver without acceleration (for example uvesafb)
- set the framebuffer to 8-bit depth
(for example fbset -a 1024x768-60 -depth 8)
- load a font with character width that is not a multiple of 8 pixels
note: the console-tools package cannot load a font that has width different from 8 pixels. You need to install the packages "kbd" and "console-terminus" and use the program "setfont" to set font width (for example: setfont Uni2-Terminus20x10)
- move some text left and right on the bash command line and you get a screen corruption
To expose more bugs, put this line to the end of uvesafb_init_info:info->flags |= FBINFO_HWACCEL_COPYAREA | FBINFO_READS_FAST;
- Now framebuffer console will use cfb_copyarea for console scrolling. You get a screen corruption when console is scrolled.
This patch is a rewrite of cfb_copyarea. It fixes the bugs, with this patch, console scrolling in 8-bit depth with a font width that is not a multiple of 8 pixels works fine.
The cfb_copyarea code was very buggy and it looks like it was written and never tried with non-8-pixel font.
--- drivers/video/cfbcopyarea.c | 153 ++++++++++++++++++++++---------------------- 1 file changed, 78 insertions(+), 75 deletions(-)
drivers/video/cfbcopyarea.c +78 -75
@@ -43,13 +43,22 @@*/ static void -bitcpy (struct fb_info *p,unsigned long __iomem *dst,int dst_idx, -const unsigned long __iomem *src,int src_idx,int bits, +bitcpy (struct fb_info *p,unsigned long __iomem *dst,unsigned dst_idx, +const unsigned long __iomem *src,unsigned src_idx,int bits,unsigned n,u32 bswapmask) {unsigned long first, last;int const shift = dst_idx-src_idx; -int left, right; + +#if 0 +/* +* If you suspect bug in this function, compare it with this simple +* memmove implementation. +*/ +fb_memmove ((char *)dst + ((dst_idx & (bits -1 ))) /8 , + (char *)src + ((src_idx & (bits -1 ))) /8 , n /8 ); +return ; +#endif first =fb_shifted_pixels_mask_long (p, dst_idx, bswapmask); last = ~fb_shifted_pixels_mask_long (p, (dst_idx+n) % bits, bswapmask);
@@ -98,9 +107,8 @@ bitcpy(struct fb_info *p, unsigned longunsigned long d0, d1;int m; - right = shift & (bits -1 ); - left = -shift & (bits -1 ); - bswapmask &= shift; +int const left = shift & (bits -1 ); +int const right = -shift & (bits -1 );if (dst_idx+n <= bits) {// Single destination word
@@ -110,15 +118,15 @@ bitcpy(struct fb_info *p, unsigned long d0 =fb_rev_pixels_in_long (d0, bswapmask);if (shift >0 ) {// Single source word - d0 >>= right; + d0 <<= left; }else if (src_idx+n <= bits) {// Single source word - d0 <<= left; + d0 >>= right; }else {// 2 source words d1 =FB_READL (src +1 ); d1 =fb_rev_pixels_in_long (d1, bswapmask); - d0 = d0<<left | d1>>right; + d0 = d0 >> right | d1 << left; } d0 =fb_rev_pixels_in_long (d0, bswapmask);FB_WRITEL (comp (d0,FB_READL (dst), first), dst);
@@ -135,60 +143,59 @@ bitcpy(struct fb_info *p, unsigned longif (shift >0 ) {// Single source word d1 = d0; - d0 >>= right; - dst++; + d0 <<= left; n -= bits - dst_idx; }else {// 2 source words d1 =FB_READL (src++); d1 =fb_rev_pixels_in_long (d1, bswapmask); - d0 = d0<<left | d1>>right; - dst++; + d0 = d0 >> right | d1 << left; n -= bits - dst_idx; } d0 =fb_rev_pixels_in_long (d0, bswapmask);FB_WRITEL (comp (d0,FB_READL (dst), first), dst); d0 = d1; + dst++;// Main chunk m = n % bits; n /= bits;while ((n >=4 ) && !bswapmask) { d1 =FB_READL (src++); -FB_WRITEL (d0 << left | d1 >> right, dst++); +FB_WRITEL (d0 >> right | d1 << left, dst++); d0 = d1; d1 =FB_READL (src++); -FB_WRITEL (d0 << left | d1 >> right, dst++); +FB_WRITEL (d0 >> right | d1 << left, dst++); d0 = d1; d1 =FB_READL (src++); -FB_WRITEL (d0 << left | d1 >> right, dst++); +FB_WRITEL (d0 >> right | d1 << left, dst++); d0 = d1; d1 =FB_READL (src++); -FB_WRITEL (d0 << left | d1 >> right, dst++); +FB_WRITEL (d0 >> right | d1 << left, dst++); d0 = d1; n -=4 ; }while (n--) { d1 =FB_READL (src++); d1 =fb_rev_pixels_in_long (d1, bswapmask); - d0 = d0 << left | d1 >> right; + d0 = d0 >> right | d1 << left; d0 =fb_rev_pixels_in_long (d0, bswapmask);FB_WRITEL (d0, dst++); d0 = d1; }// Trailing bits -if (last) { -if (m <= right) { +if (m) { +if (m <= bits - right) {// Single source word - d0 <<= left; + d0 >>= right; }else {// 2 source words d1 =FB_READL (src); d1 =fb_rev_pixels_in_long (d1, bswapmask); - d0 = d0<<left | d1>>right; + d0 = d0 >> right | d1 << left; } d0 =fb_rev_pixels_in_long (d0, bswapmask);FB_WRITEL (comp (d0,FB_READL (dst), last), dst);
@@ -202,43 +209,46 @@ bitcpy(struct fb_info *p, unsigned long*/ static void -bitcpy_rev (struct fb_info *p,unsigned long __iomem *dst,int dst_idx, -const unsigned long __iomem *src,int src_idx,int bits, +bitcpy_rev (struct fb_info *p,unsigned long __iomem *dst,unsigned dst_idx, +const unsigned long __iomem *src,unsigned src_idx,int bits,unsigned n,u32 bswapmask) {unsigned long first, last;int shift; - dst += (n-1 )/bits; - src += (n-1 )/bits; -if ((n-1 ) % bits) { - dst_idx += (n-1 ) % bits; - dst += dst_idx >> (ffs (bits) -1 ); - dst_idx &= bits -1 ; - src_idx += (n-1 ) % bits; - src += src_idx >> (ffs (bits) -1 ); - src_idx &= bits -1 ; - } +#if 0 +/* +* If you suspect bug in this function, compare it with this simple +* memmove implementation. +*/ +fb_memmove ((char *)dst + ((dst_idx & (bits -1 ))) /8 , + (char *)src + ((src_idx & (bits -1 ))) /8 , n /8 ); +return ; +#endif + + dst += (dst_idx + n -1 ) / bits; + src += (src_idx + n -1 ) / bits; + dst_idx = (dst_idx + n -1 ) % bits; + src_idx = (src_idx + n -1 ) % bits; shift = dst_idx-src_idx; - first =fb_shifted_pixels_mask_long (p, bits -1 - dst_idx, bswapmask); - last = ~fb_shifted_pixels_mask_long (p, bits -1 - ((dst_idx-n) % bits), - bswapmask); + first = ~fb_shifted_pixels_mask_long (p, (dst_idx +1 ) % bits, bswapmask); + last =fb_shifted_pixels_mask_long (p, (bits + dst_idx +1 - n) % bits, bswapmask);if (!shift) {// Same alignment for source and dest if ((unsigned long )dst_idx+1 >= n) {// Single word -if (last) - first &= last; -FB_WRITEL (comp (FB_READL (src),FB_READL (dst), first), dst); +if (first) + last &= first; +FB_WRITEL (comp (FB_READL (src),FB_READL (dst), last), dst); }else {// Multiple destination words // Leading bits -if (first != ~0UL ) { +if (first) {FB_WRITEL (comp (FB_READL (src),FB_READL (dst), first), dst); dst--; src--;
@@ -262,7 +272,7 @@ bitcpy_rev(struct fb_info *p, unsigned lFB_WRITEL (FB_READL (src--), dst--);// Trailing bits -if (last) +if (last !=-1UL )FB_WRITEL (comp (FB_READL (src),FB_READL (dst), last), dst); } }else {
@@ -270,29 +280,28 @@ bitcpy_rev(struct fb_info *p, unsigned lunsigned long d0, d1;int m; -int const left = -shift & (bits-1 ); -int const right = shift & (bits-1 ); - bswapmask &= shift; +int const left = shift & (bits-1 ); +int const right = -shift & (bits-1 );if ((unsigned long )dst_idx+1 >= n) {// Single destination word -if (last) - first &= last; +if (first) + last &= first; d0 =FB_READL (src);if (shift <0 ) {// Single source word - d0 <<= left; + d0 >>= right; }else if (1 +(unsigned long )src_idx >= n) {// Single source word - d0 >>= right; + d0 <<= left; }else {// 2 source words d1 =FB_READL (src -1 ); d1 =fb_rev_pixels_in_long (d1, bswapmask); - d0 = d0>>right | d1<<left; + d0 = d0 << left | d1 >> right; } d0 =fb_rev_pixels_in_long (d0, bswapmask); -FB_WRITEL (comp (d0,FB_READL (dst), first), dst); +FB_WRITEL (comp (d0,FB_READL (dst), last), dst); }else {// Multiple destination words /** We must always remember the last value read, because in case
@@ -307,12 +316,12 @@ bitcpy_rev(struct fb_info *p, unsigned lif (shift <0 ) {// Single source word d1 = d0; - d0 <<= left; + d0 >>= right; }else {// 2 source words d1 =FB_READL (src--); d1 =fb_rev_pixels_in_long (d1, bswapmask); - d0 = d0>>right | d1<<left; + d0 = d0 << left | d1 >> right; } d0 =fb_rev_pixels_in_long (d0, bswapmask);FB_WRITEL (comp (d0,FB_READL (dst), first), dst);
@@ -325,39 +334,39 @@ bitcpy_rev(struct fb_info *p, unsigned l n /= bits;while ((n >=4 ) && !bswapmask) { d1 =FB_READL (src--); -FB_WRITEL (d0 >> right | d1 << left, dst--); +FB_WRITEL (d0 << left | d1 >> right, dst--); d0 = d1; d1 =FB_READL (src--); -FB_WRITEL (d0 >> right | d1 << left, dst--); +FB_WRITEL (d0 << left | d1 >> right, dst--); d0 = d1; d1 =FB_READL (src--); -FB_WRITEL (d0 >> right | d1 << left, dst--); +FB_WRITEL (d0 << left | d1 >> right, dst--); d0 = d1; d1 =FB_READL (src--); -FB_WRITEL (d0 >> right | d1 << left, dst--); +FB_WRITEL (d0 << left | d1 >> right, dst--); d0 = d1; n -=4 ; }while (n--) { d1 =FB_READL (src--); d1 =fb_rev_pixels_in_long (d1, bswapmask); - d0 = d0 >> right | d1 << left; + d0 = d0 << left | d1 >> right; d0 =fb_rev_pixels_in_long (d0, bswapmask);FB_WRITEL (d0, dst--); d0 = d1; }// Trailing bits -if (last) { -if (m <= left) { +if (m) { +if (m <= bits - left) {// Single source word - d0 >>= right; + d0 <<= left; }else {// 2 source words d1 =FB_READL (src); d1 =fb_rev_pixels_in_long (d1, bswapmask); - d0 = d0>>right | d1<<left; + d0 = d0 << left | d1 >> right; } d0 =fb_rev_pixels_in_long (d0, bswapmask);FB_WRITEL (comp (d0,FB_READL (dst), last), dst);
@@ -371,9 +380,9 @@ void cfb_copyarea(struct fb_info *p, conu32 dx = area->dx, dy = area->dy, sx = area->sx, sy = area->sy;u32 height = area->height, width = area->width;unsigned long const bits_per_line = p->fix.line_length*8u ; -unsigned long __iomem *dst =NULL , *src =NULL ; +unsigned long __iomem *base =NULL ;int bits =BITS_PER_LONG , bytes = bits >>3 ; -int dst_idx =0 , src_idx =0 , rev_copy =0 ; +unsigned dst_idx =0 , src_idx =0 , rev_copy =0 ;u32 bswapmask =fb_compute_bswapmask (p);if (p->state !=FBINFO_STATE_RUNNING )
@@ -389,7 +398,7 @@ void cfb_copyarea(struct fb_info *p, con// split the base of the framebuffer into a long-aligned address and the // index of the first bit - dst = src = (unsigned long __iomem *)((unsigned long )p->screen_base & ~(bytes-1 )); + base = (unsigned long __iomem *)((unsigned long )p->screen_base & ~(bytes-1 )); dst_idx = src_idx =8 *((unsigned long )p->screen_base & (bytes-1 ));// add offset of source and target area dst_idx += dy*bits_per_line + dx*p->var.bits_per_pixel;
@@ -402,20 +411,14 @@ void cfb_copyarea(struct fb_info *p, conwhile (height--) { dst_idx -= bits_per_line; src_idx -= bits_per_line; - dst += dst_idx >> (ffs (bits) -1 ); - dst_idx &= (bytes -1 ); - src += src_idx >> (ffs (bits) -1 ); - src_idx &= (bytes -1 ); -bitcpy_rev (p, dst, dst_idx, src, src_idx, bits, +bitcpy_rev (p, base + (dst_idx / bits), dst_idx % bits, + base + (src_idx / bits), src_idx % bits, bits, width*p->var.bits_per_pixel, bswapmask); } }else {while (height--) { - dst += dst_idx >> (ffs (bits) -1 ); - dst_idx &= (bytes -1 ); - src += src_idx >> (ffs (bits) -1 ); - src_idx &= (bytes -1 ); -bitcpy (p, dst, dst_idx, src, src_idx, bits, +bitcpy (p, base + (dst_idx / bits), dst_idx % bits, + base + (src_idx / bits), src_idx % bits, bits, width*p->var.bits_per_pixel, bswapmask); dst_idx += bits_per_line; src_idx += bits_per_line;
Greg Kroah-Hartman
maintainerPATCH 9/22 matroxfb: restore the registers M_ACCESS and M_PITCH
In reply to Greg Kroah-Hartman3.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mikulas Patocka <[email protected]>
commit a772d4736641ec1b421ad965e13457c17379fc86 upstream.
When X11 is running and the user switches back to console, the card modifies the content of registers M_MACCESS and M_PITCH in periodic intervals.
This patch fixes it by restoring the content of these registers before issuing any accelerator command.
--- drivers/video/matrox/matroxfb_accel.c | 38 +++++++++++++++++++++++++--------- drivers/video/matrox/matroxfb_base.h | 2 + 2 files changed, 30 insertions(+), 10 deletions(-)
drivers/video/matrox/matroxfb_accel.c +28 -10
@@ -192,10 +192,18 @@ void matrox_cfbX_init(struct matrox_fb_i minfo->accel.m_dwg_rect =M_DWG_TRAP |M_DWG_SOLID |M_DWG_ARZERO |M_DWG_SGNZERO |M_DWG_SHIFTZERO ;if (isMilleniumII (minfo)) minfo->accel.m_dwg_rect |=M_DWG_TRANSC ; minfo->accel.m_opmode = mopmode; + minfo->accel.m_access = maccess; + minfo->accel.m_pitch = mpitch; }EXPORT_SYMBOL (matrox_cfbX_init); +static void matrox_accel_restore_maccess (struct matrox_fb_info *minfo) +{ +mga_outl (M_MACCESS , minfo->accel.m_access); +mga_outl (M_PITCH , minfo->accel.m_pitch); +} +static void matrox_accel_bmove (struct matrox_fb_info *minfo,int vxres,int sy,int sx,int dy,int dx,int height,int width) {
@@ -207,7 +215,8 @@ static void matrox_accel_bmove(struct maCRITBEGIN if ((dy < sy) || ((dy == sy) && (dx <= sx))) { -mga_fifo (2 ); +mga_fifo (4 ); +matrox_accel_restore_maccess (minfo);mga_outl (M_DWGCTL ,M_DWG_BITBLT |M_DWG_SHIFTZERO |M_DWG_SGNZERO |M_DWG_BFCOL |M_DWG_REPLACE );mga_outl (M_AR5 , vxres);
@@ -215,7 +224,8 @@ static void matrox_accel_bmove(struct ma start = sy*vxres+sx+curr_ydstorg (minfo); end = start+width; }else { -mga_fifo (3 ); +mga_fifo (5 ); +matrox_accel_restore_maccess (minfo);mga_outl (M_DWGCTL ,M_DWG_BITBLT |M_DWG_SHIFTZERO |M_DWG_BFCOL |M_DWG_REPLACE );mga_outl (M_SGN ,5 );mga_outl (M_AR5 , -vxres);
@@ -224,7 +234,8 @@ static void matrox_accel_bmove(struct ma start = end+width; dy += height-1 ; } -mga_fifo (4 ); +mga_fifo (6 ); +matrox_accel_restore_maccess (minfo);mga_outl (M_AR0 , end);mga_outl (M_AR3 , start);mga_outl (M_FXBNDRY , ((dx+width)<<16 ) | dx);
@@ -246,7 +257,8 @@ static void matrox_accel_bmove_lin(strucCRITBEGIN if ((dy < sy) || ((dy == sy) && (dx <= sx))) { -mga_fifo (2 ); +mga_fifo (4 ); +matrox_accel_restore_maccess (minfo);mga_outl (M_DWGCTL ,M_DWG_BITBLT |M_DWG_SHIFTZERO |M_DWG_SGNZERO |M_DWG_BFCOL |M_DWG_REPLACE );mga_outl (M_AR5 , vxres);
@@ -254,7 +266,8 @@ static void matrox_accel_bmove_lin(struc start = sy*vxres+sx+curr_ydstorg (minfo); end = start+width; }else { -mga_fifo (3 ); +mga_fifo (5 ); +matrox_accel_restore_maccess (minfo);mga_outl (M_DWGCTL ,M_DWG_BITBLT |M_DWG_SHIFTZERO |M_DWG_BFCOL |M_DWG_REPLACE );mga_outl (M_SGN ,5 );mga_outl (M_AR5 , -vxres);
@@ -263,7 +276,8 @@ static void matrox_accel_bmove_lin(struc start = end+width; dy += height-1 ; } -mga_fifo (5 ); +mga_fifo (7 ); +matrox_accel_restore_maccess (minfo);mga_outl (M_AR0 , end);mga_outl (M_AR3 , start);mga_outl (M_FXBNDRY , ((dx+width)<<16 ) | dx);
@@ -298,7 +312,8 @@ static void matroxfb_accel_clear(structCRITBEGIN - mga_fifo(5); + mga_fifo(7); +matrox_accel_restore_maccess (minfo);mga_outl (M_DWGCTL , minfo->accel.m_dwg_rect |M_DWG_REPLACE );mga_outl (M_FCOL , color);mga_outl (M_FXBNDRY , ((sx + width) <<16 ) | sx);
@@ -341,7 +356,8 @@ static void matroxfb_cfb4_clear(struct m width >>=1 ; sx >>=1 ;if (width) { -mga_fifo (5 ); +mga_fifo (7 ); +matrox_accel_restore_maccess (minfo);mga_outl (M_DWGCTL , minfo->accel.m_dwg_rect |M_DWG_REPLACE2 );mga_outl (M_FCOL , bgx);mga_outl (M_FXBNDRY , ((sx + width) <<16 ) | sx);
@@ -415,7 +431,8 @@ static void matroxfb_1bpp_imageblit(struCRITBEGIN - mga_fifo(3); + mga_fifo(5); +matrox_accel_restore_maccess (minfo);if (easy)mga_outl (M_DWGCTL ,M_DWG_ILOAD |M_DWG_SGNZERO |M_DWG_SHIFTZERO |M_DWG_BMONOWF |M_DWG_LINEAR |M_DWG_REPLACE );else
@@ -425,7 +442,8 @@ static void matroxfb_1bpp_imageblit(stru fxbndry = ((xx + width -1 ) <<16 ) | xx; mmio = minfo->mmio.vbase; -mga_fifo (6 ); +mga_fifo (8 ); +matrox_accel_restore_maccess (minfo);mga_writel (mmio,M_FXBNDRY , fxbndry);mga_writel (mmio,M_AR0 , ar0);mga_writel (mmio,M_AR3 ,0 );
drivers/video/matrox/matroxfb_base.h +2 -0
@@ -307,6 +307,8 @@ struct matrox_accel_data {#endif u_int32_t m_dwg_rect;u_int32_t m_opmode; +u_int32_t m_access; +u_int32_t m_pitch; };struct v4l2_queryctrl ;
Greg Kroah-Hartman
maintainerPATCH 10/22 mach64: use unaligned access
In reply to Greg Kroah-Hartman3.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mikulas Patocka <[email protected]>
commit c29dd8696dc5dbd50b3ac441b8a26751277ba520 upstream.
This patch fixes mach64 to use unaligned access to the font bitmap.
This fixes unaligned access warning on sparc64 when 14x8 font is loaded.
On x86(64), unaligned access is handled in hardware, so both functions le32_to_cpup and get_unaligned_le32 perform the same operation.
On RISC machines, unaligned access is not handled in hardware, so we better use get_unaligned_le32 to avoid the unaligned trap and warning.
--- drivers/video/aty/mach64_accel.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/video/aty/mach64_accel.c +2 -1
@@ -4,6 +4,7 @@*/ #include <linux/delay.h> +#include <asm/unaligned.h> #include <linux/fb.h> #include <video/mach64.h> #include "atyfb.h"
@@ -419,7 +420,7 @@ void atyfb_imageblit(struct fb_info *infu32 *pbitmap, dwords = (src_bytes +3 ) /4 ;for (pbitmap = (u32 *)(image->data); dwords; dwords--, pbitmap++) {wait_for_fifo (1 , par); -aty_st_le32 (HOST_DATA0 ,le32_to_cpup (pbitmap), par); +aty_st_le32 (HOST_DATA0 ,get_unaligned_le32 (pbitmap), par); } }
Greg Kroah-Hartman
maintainerPATCH 11/22 mach64: fix cursor when character width is not a multiple of 8 pixels
In reply to Greg Kroah-Hartman3.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mikulas Patocka <[email protected]>
commit 43751a1b8ee2e70ce392bf31ef3133da324e68b3 upstream.
This patch fixes the hardware cursor on mach64 when font width is not a multiple of 8 pixels.
If you load such a font, the cursor is expanded to the next 8-byte boundary and a part of the next character after the cursor is not visible.
For example, when you load a font with 12-pixel width, the cursor width is 16 pixels and when the cursor is displayed, 4 pixels of the next character are not visible.
The reason is this: atyfb_cursor is called with proper parameters to load an image that is 12-pixel wide. However, the number is aligned on the next 8-pixel boundary on the line
"unsigned int width = (cursor->image.width + 7) >> 3;" and the whole function acts as it is was loading a 16-pixel image.
This patch fixes it so that the value written to the framebuffer is padded with 0xaaaa (the transparent pattern) when the image size it not a multiple of 8 pixels. The transparent pattern causes that the cursor will not interfere with the next character.
--- drivers/video/aty/mach64_cursor.c | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-)
drivers/video/aty/mach64_cursor.c +16 -6
@@ -5,6 +5,7 @@#include <linux/fb.h> #include <linux/init.h> #include <linux/string.h> +#include "../fb_draw.h" #include <asm/io.h>
@@ -157,24 +158,33 @@ static int atyfb_cursor(struct fb_info *for (i =0 ; i < height; i++) {for (j =0 ; j < width; j++) { +u16 l =0xaaaa ; b = *src++; m = *msk++;switch (cursor->rop) {case ROP_XOR :// Upper 4 bits of mask data -fb_writeb (cursor_bits_lookup[(b ^ m) >>4 ], dst++); + l = cursor_bits_lookup[(b ^ m) >>4 ] |// Lower 4 bits of mask -fb_writeb (cursor_bits_lookup[(b ^ m) &0x0f ], - dst++); + (cursor_bits_lookup[(b ^ m) &0x0f ] <<8 );break ;case ROP_COPY :// Upper 4 bits of mask data -fb_writeb (cursor_bits_lookup[(b & m) >>4 ], dst++); + l = cursor_bits_lookup[(b & m) >>4 ] |// Lower 4 bits of mask -fb_writeb (cursor_bits_lookup[(b & m) &0x0f ], - dst++); + (cursor_bits_lookup[(b & m) &0x0f ] <<8 );break ; } +/* +* If cursor size is not a multiple of 8 characters +* we must pad it with transparent pattern (0xaaaa). +*/ +if ((j +1 ) *8 > cursor->image.width) { + l =comp (l,0xaaaa , + (1 << ((cursor->image.width &7 ) *2 )) -1 ); + } +fb_writeb (l &0xff , dst++); +fb_writeb (l >>8 , dst++); } dst += offset; }
Greg Kroah-Hartman
maintainerPATCH 12/22 b43: Fix machine check error due to improper access of B43_MMIO_PSM_PHY_HDR
In reply to Greg Kroah-Hartman3.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Rafał Miłecki <[email protected]>
commit 12cd43c6ed6da7bf7c5afbd74da6959cda6d056b upstream.
Register B43_MMIO_PSM_PHY_HDR is 16 bit one, so accessing it with 32b functions isn't safe. On my machine it causes delayed (!) CPU exception:
Disabling lock debugging due to kernel taint
mce: [Hardware Error]: CPU 0: Machine Check Exception: 4 Bank 4: b200000000070f0f
mce: [Hardware Error]: TSC 164083803dc
mce: [Hardware Error]: PROCESSOR 2:20fc2 TIME 1396650505 SOCKET 0 APIC 0 microcode 0
mce: [Hardware Error]: Run the above through 'mcelog --ascii'
mce: [Hardware Error]: Machine check: Processor context corrupt
Kernel panic - not syncing: Fatal machine check on current CPU
Kernel Offset: 0x0 from 0xffffffff81000000 (relocation range: 0xffffffff80000000-0xffffffff9fffffff)
--- drivers/net/wireless/b43/phy_n.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-)
drivers/net/wireless/b43/phy_n.c +7 -7
@@ -4599,22 +4599,22 @@ static void b43_nphy_channel_setup(strucint ch = new_channel->hw_value;u16 old_band_5ghz; -u32 tmp32; +u16 tmp16; old_band_5ghz =b43_phy_read (dev,B43_NPHY_BANDCTL ) &B43_NPHY_BANDCTL_5GHZ ;if (new_channel->band ==IEEE80211_BAND_5GHZ && !old_band_5ghz) { - tmp32 =b43_read32 (dev,B43_MMIO_PSM_PHY_HDR ); -b43_write32 (dev,B43_MMIO_PSM_PHY_HDR , tmp32 |4 ); + tmp16 =b43_read16 (dev,B43_MMIO_PSM_PHY_HDR ); +b43_write16 (dev,B43_MMIO_PSM_PHY_HDR , tmp16 |4 );b43_phy_set (dev,B43_PHY_B_BBCFG ,0xC000 ); -b43_write32 (dev,B43_MMIO_PSM_PHY_HDR , tmp32); +b43_write16 (dev,B43_MMIO_PSM_PHY_HDR , tmp16);b43_phy_set (dev,B43_NPHY_BANDCTL ,B43_NPHY_BANDCTL_5GHZ ); }else if (new_channel->band ==IEEE80211_BAND_2GHZ && old_band_5ghz) {b43_phy_mask (dev,B43_NPHY_BANDCTL , ~B43_NPHY_BANDCTL_5GHZ ); - tmp32 =b43_read32 (dev,B43_MMIO_PSM_PHY_HDR ); -b43_write32 (dev,B43_MMIO_PSM_PHY_HDR , tmp32 |4 ); + tmp16 =b43_read16 (dev,B43_MMIO_PSM_PHY_HDR ); +b43_write16 (dev,B43_MMIO_PSM_PHY_HDR , tmp16 |4 );b43_phy_mask (dev,B43_PHY_B_BBCFG ,0x3FFF ); -b43_write32 (dev,B43_MMIO_PSM_PHY_HDR , tmp32); +b43_write16 (dev,B43_MMIO_PSM_PHY_HDR , tmp16); }b43_chantab_phy_upload (dev, e);
Greg Kroah-Hartman
maintainerPATCH 13/22 libata/ahci: accommodate tag ordered controllers
In reply to Greg Kroah-Hartman3.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dan Williams <[email protected]>
commit 8a4aeec8d2d6a3edeffbdfae451cdf05cbf0fefd upstream.
The AHCI spec allows implementations to issue commands in tag order rather than FIFO order:
5.3.2.12 P:SelectCmd
HBA sets pSlotLoc = (pSlotLoc + 1) mod (CAP.NCS + 1) or HBA selects the command to issue that has had the PxCI bit set to '1' longer than any other command pending to be issued.
The result is that commands posted sequentially (time-wise) may play out of sequence when issued by hardware.
This behavior has likely been hidden by drives that arrange for commands to complete in issue order. However, it appears recent drives (two from different vendors that we have found so far) inflict out-of-order completions as a matter of course. So, we need to take care to maintain ordered submission, otherwise we risk triggering a drive to fall out of sequential-io automation and back to random-io processing, which incurs large latency and degrades throughput.
This issue was found in simple benchmarks where QD=2 seq-write performance was 30-50% *greater* than QD=32 seq-write performance.
Tagging for -stable and making the change globally since it has a low risk-to-reward ratio. Also, word is that recent versions of an unnamed OS also does it this way now. So, drives in the field are already experienced with this tag ordering scheme.
--- drivers/ata/libata-core.c | 21 +++++++++++++-------- include/linux/libata.h | 1 + 2 files changed, 14 insertions(+), 8 deletions(-)
drivers/ata/libata-core.c +13 -8
@@ -4700,21 +4700,26 @@ void swap_buf_le16(u16 *buf, unsigned instatic struct ata_queued_cmd *ata_qc_new (struct ata_port *ap) {struct ata_queued_cmd *qc =NULL ; -unsigned int i; +unsigned int i, tag;/* no command while frozen */ if (unlikely (ap->pflags &ATA_PFLAG_FROZEN ))return NULL ; -/* the last tag is reserved for internal command. */ -for (i =0 ; i <ATA_MAX_QUEUE -1 ; i++) -if (!test_and_set_bit (i, &ap->qc_allocated)) { - qc =__ata_qc_from_tag (ap, i); +for (i =0 ; i <ATA_MAX_QUEUE ; i++) { + tag = (i + ap->last_tag +1 ) %ATA_MAX_QUEUE ; + +/* the last tag is reserved for internal command. */ +if (tag ==ATA_TAG_INTERNAL ) +continue ; + +if (!test_and_set_bit (tag, &ap->qc_allocated)) { + qc =__ata_qc_from_tag (ap, tag); + qc->tag = tag; + ap->last_tag = tag;break ; } - -if (qc) - qc->tag = i; + }return qc; }
include/linux/libata.h +1 -0
@@ -762,6 +762,7 @@ struct ata_port {unsigned long qc_allocated;unsigned int qc_active;int nr_active_links;/* #links with active qcs */ +unsigned int last_tag;/* track next tag hw expects */ struct ata_link link;/* host default link */ struct ata_link *slave_link;/* see ata_slave_link_init() */
Greg Kroah-Hartman
maintainerPATCH 14/22 locks: allow __break_lease to sleep even when break_time is 0
In reply to Greg Kroah-Hartman3.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jeff Layton <[email protected]>
commit 4991a628a789dc5954e98e79476d9808812292ec upstream.
A fl->fl_break_time of 0 has a special meaning to the lease break code that basically means "never break the lease". knfsd uses this to ensure that leases don't disappear out from under it.
Unfortunately, the code in __break_lease can end up passing this value to wait_event_interruptible as a timeout, which prevents it from going to sleep at all. This causes __break_lease to spin in a tight loop and causes soft lockups.
Fix this by ensuring that we pass a minimum value of 1 as a timeout instead.
--- fs/locks.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-)
fs/locks.c +3 -4
@@ -1253,11 +1253,10 @@ int __break_lease(struct inode *inode, u restart: break_time = flock->fl_break_time; -if (break_time !=0 ) { +if (break_time !=0 ) break_time -= jiffies; -if (break_time ==0 ) - break_time++; - } +if (break_time ==0 ) + break_time++;locks_insert_block (flock, new_fl);unlock_flocks (); error = wait_event_interruptible_timeout(new_fl->fl_wait,
Greg Kroah-Hartman
maintainerPATCH 15/22 rtlwifi: rtl8192cu: Fix too long disable of IRQs
In reply to Greg Kroah-Hartman3.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Larry Finger <[email protected]>
commit a53268be0cb9763f11da4f6fe3fb924cbe3a7d4a upstream.
In commit f78bccd79ba3cd9d9664981b501d57bdb81ab8a4 entitled "rtlwifi:
rtl8192ce: Fix too long disable of IRQs", Olivier Langlois <[email protected]> fixed a problem caused by an extra long disabling of interrupts. This patch makes the same fix for rtl8192cu.
--- drivers/net/wireless/rtlwifi/rtl8192cu/hw.c | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-)
drivers/net/wireless/rtlwifi/rtl8192cu/hw.c +14 -1
@@ -985,6 +985,17 @@ int rtl92cu_hw_init(struct ieee80211_hwstruct rtl_ps_ctl *ppsc =rtl_psc (rtl_priv (hw));int err =0 ;static bool iqk_initialized; +unsigned long flags; + +/* As this function can take a very long time (up to 350 ms) +* and can be called with irqs disabled, reenable the irqs +* to let the other devices continue being serviced. +* +* It is safe doing so since our own interrupts will only be enabled +* in a subsequent step. +*/ +local_save_flags (flags); +local_irq_enable (); rtlhal->hw_type =HARDWARE_TYPE_RTL8192CU ; err =_rtl92cu_init_mac (hw);
@@ -997,7 +1008,7 @@ int rtl92cu_hw_init(struct ieee80211_hwRT_TRACE (rtlpriv,COMP_ERR ,DBG_WARNING ,"Failed to download FW. Init HW without FW now..\n" ); err =1 ; -return err; + goto exit; } rtlhal->last_hmeboxnum =0 ;/* h2c */ _rtl92cu_phy_param_tab_init (hw);
@@ -1034,6 +1045,8 @@ int rtl92cu_hw_init(struct ieee80211_hw_InitPABias (hw);_update_mac_setting (hw);rtl92c_dm_init (hw); +exit: +local_irq_restore (flags);return err; }
Greg Kroah-Hartman
maintainerPATCH 16/22 rtlwifi: rtl8192se: Fix too long disable of IRQs
In reply to Greg Kroah-Hartman3.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Larry Finger <[email protected]>
commit 2610decdd0b3808ba20471a999835cfee5275f98 upstream.
In commit f78bccd79ba3cd9d9664981b501d57bdb81ab8a4 entitled "rtlwifi:
rtl8192ce: Fix too long disable of IRQs", Olivier Langlois <[email protected]> fixed a problem caused by an extra long disabling of interrupts. This patch makes the same fix for rtl8192se.
--- drivers/net/wireless/rtlwifi/rtl8192se/hw.c | 27 +++++++++++++++++++++------ 1 file changed, 21 insertions(+), 6 deletions(-)
drivers/net/wireless/rtlwifi/rtl8192se/hw.c +21 -6
@@ -922,7 +922,7 @@ int rtl92se_hw_init(struct ieee80211_hwstruct rtl_pci *rtlpci =rtl_pcidev (rtl_pcipriv (hw));struct rtl_efuse *rtlefuse =rtl_efuse (rtl_priv (hw));u8 tmp_byte =0 ; - +unsigned long flags;bool rtstatus = true;u8 tmp_u1b;int err = false;
@@ -934,6 +934,16 @@ int rtl92se_hw_init(struct ieee80211_hw rtlpci->being_init_adapter = true; +/* As this function can take a very long time (up to 350 ms) +* and can be called with irqs disabled, reenable the irqs +* to let the other devices continue being serviced. +* +* It is safe doing so since our own interrupts will only be enabled +* in a subsequent step. +*/ +local_save_flags (flags); +local_irq_enable (); + rtlpriv->intf_ops->disable_aspm (hw);/* 1. MAC Initialize */
@@ -951,7 +961,8 @@ int rtl92se_hw_init(struct ieee80211_hwRT_TRACE (rtlpriv,COMP_ERR ,DBG_WARNING ,"Failed to download FW. Init HW without FW now... " "Please copy FW into /lib/firmware/rtlwifi\n" ); -return 1 ; + err =1 ; + goto exit; }/* After FW download, we have to reset MAC register */
@@ -964,7 +975,8 @@ int rtl92se_hw_init(struct ieee80211_hw/* 3. Initialize MAC/PHY Config by MACPHY_reg.txt */ if (!rtl92s_phy_mac_config (hw)) {RT_TRACE (rtlpriv,COMP_ERR ,DBG_EMERG ,"MAC Config failed\n" ); -return rtstatus; + err = rtstatus; + goto exit; }/* Make sure BB/RF write OK. We should prevent enter IPS. radio off. */
@@ -974,7 +986,8 @@ int rtl92se_hw_init(struct ieee80211_hw/* 4. Initialize BB After MAC Config PHY_reg.txt, AGC_Tab.txt */ if (!rtl92s_phy_bb_config (hw)) {RT_TRACE (rtlpriv,COMP_INIT ,DBG_EMERG ,"BB Config failed\n" ); -return rtstatus; + err = rtstatus; + goto exit; }/* 5. Initiailze RF RAIO_A.txt RF RAIO_B.txt */
@@ -1010,7 +1023,8 @@ int rtl92se_hw_init(struct ieee80211_hwif (!rtl92s_phy_rf_config (hw)) {RT_TRACE (rtlpriv,COMP_INIT ,DBG_DMESG ,"RF Config failed\n" ); -return rtstatus; + err = rtstatus; + goto exit; }/* After read predefined TXT, we must set BB/MAC/RF
@@ -1084,8 +1098,9 @@ int rtl92se_hw_init(struct ieee80211_hw rtlpriv->cfg->ops->led_control (hw,LED_CTL_POWER_ON );rtl92s_dm_init (hw); +exit: +local_irq_restore (flags); rtlpci->being_init_adapter = false; -return err; }
Greg Kroah-Hartman
maintainerPATCH 17/22 gpio: mxs: Allow for recursive enable_irq_wake() call
In reply to Greg Kroah-Hartman3.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Marek Vasut <[email protected]>
commit a585f87c863e4e1d496459d382b802bf5ebe3717 upstream.
The scenario here is that someone calls enable_irq_wake() from somewhere in the code. This will result in the lockdep producing a backtrace as can be seen below. In my case, this problem is triggered when using the wl1271 (TI WlCore) driver found in drivers/net/wireless/ti/ .
The problem cause is rather obvious from the backtrace, but let's outline the dependency. enable_irq_wake() grabs the IRQ buslock in irq_set_irq_wake(), which in turns calls mxs_gpio_set_wake_irq() . But mxs_gpio_set_wake_irq() calls enable_irq_wake() again on the one-level-higher IRQ , thus it tries to grab the IRQ buslock again in irq_set_irq_wake() . Because the spinlock in irq_set_irq_wake()->irq_get_desc_buslock()->__irq_get_desc_lock() is not marked as recursive, lockdep will spew the stuff below.
We know we can safely re-enter the lock, so use IRQ_GC_INIT_NESTED_LOCK to fix the spew.
=============================================
[ INFO: possible recursive locking detected ] 3.10.33-00012-gf06b763-dirty #61 Not tainted
---------------------------------------------
kworker/0:1/18 is trying to acquire lock:
(&irq_desc_lock_class){-.-...}, at: [<c00685f0>] __irq_get_desc_lock+0x48/0x88
but task is already holding lock:
(&irq_desc_lock_class){-.-...}, at: [<c00685f0>] __irq_get_desc_lock+0x48/0x88
other info that might help us debug this:
Possible unsafe locking scenario:
CPU0
---- lock(&irq_desc_lock_class);
lock(&irq_desc_lock_class);
*** DEADLOCK ***
May be due to missing lock nesting notation
3 locks held by kworker/0:1/18:
#0: (events){.+.+.+}, at: [<c0036308>] process_one_work+0x134/0x4a4
#1: ((&fw_work->work)){+.+.+.}, at: [<c0036308>] process_one_work+0x134/0x4a4
#2: (&irq_desc_lock_class){-.-...}, at: [<c00685f0>] __irq_get_desc_lock+0x48/0x88stack backtrace: CPU: 0 PID: 18 Comm: kworker/0:1 Not tainted 3.10.33-00012-gf06b763-dirty #61 Workqueue: events request_firmware_work_func [<c0013eb4>] (unwind_backtrace+0x0/0xf0) from [<c0011c74>] (show_stack+0x10/0x14) [<c0011c74>] (show_stack+0x10/0x14) from [<c005bb08>] (__lock_acquire+0x140c/0x1a64) [<c005bb08>] (__lock_acquire+0x140c/0x1a64) from [<c005c6a8>] (lock_acquire+0x9c/0x104) [<c005c6a8>] (lock_acquire+0x9c/0x104) from [<c051d5a4>] (_raw_spin_lock_irqsave+0x44/0x58) [<c051d5a4>] (_raw_spin_lock_irqsave+0x44/0x58) from [<c00685f0>] (__irq_get_desc_lock+0x48/0x88) [<c00685f0>] (__irq_get_desc_lock+0x48/0x88) from [<c0068e78>] (irq_set_irq_wake+0x20/0xf4) [<c0068e78>] (irq_set_irq_wake+0x20/0xf4) from [<c027260c>] (mxs_gpio_set_wake_irq+0x1c/0x24) [<c027260c>] (mxs_gpio_set_wake_irq+0x1c/0x24) from [<c0068cf4>] (set_irq_wake_real+0x30/0x44) [<c0068cf4>] (set_irq_wake_real+0x30/0x44) from [<c0068ee4>] (irq_set_irq_wake+0x8c/0xf4) [<c0068ee4>] (irq_set_irq_wake+0x8c/0xf4) from [<c0310748>] (wlcore_nvs_cb+0x10c/0x97c) [<c0310748>] (wlcore_nvs_cb+0x10c/0x97c) from [<c02be5e8>] (request_firmware_work_func+0x38/0x58) [<c02be5e8>] (request_firmware_work_func+0x38/0x58) from [<c0036394>] (process_one_work+0x1c0/0x4a4) [<c0036394>] (process_one_work+0x1c0/0x4a4) from [<c0036a4c>] (worker_thread+0x138/0x394) [<c0036a4c>] (worker_thread+0x138/0x394) from [<c003cb74>] (kthread+0xa4/0xb0) [<c003cb74>] (kthread+0xa4/0xb0) from [<c000ee00>] (ret_from_fork+0x14/0x34) wlcore: loaded
--- drivers/gpio/gpio-mxs.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/gpio/gpio-mxs.c +2 -1
@@ -167,7 +167,8 @@ static void __init mxs_gpio_init_gc(stru ct->regs.ack =PINCTRL_IRQSTAT (port->id) +MXS_CLR ; ct->regs.mask =PINCTRL_IRQEN (port->id); -irq_setup_generic_chip (gc,IRQ_MSK (32 ),0 ,IRQ_NOREQUEST ,0 ); +irq_setup_generic_chip (gc,IRQ_MSK (32 ),IRQ_GC_INIT_NESTED_LOCK , +IRQ_NOREQUEST ,0 ); }static int mxs_gpio_to_irq (struct gpio_chip *gc,unsigned offset)
Greg Kroah-Hartman
maintainerPATCH 18/22 tgafb: fix data copying
In reply to Greg Kroah-Hartman3.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mikulas Patocka <[email protected]>
commit 6b0df6827bb6fcacb158dff29ad0a62d6418b534 upstream.
The functions for data copying copyarea_foreward_8bpp and copyarea_backward_8bpp are buggy, they produce screen corruption.
This patch fixes the functions and moves the logic to one function "copyarea_8bpp". For simplicity, the function only handles copying that is aligned on 8 pixes. If we copy an unaligned area, generic function cfb_copyarea is used.
--- drivers/video/tgafb.c | 264 +++++++++----------------------------------------- 1 file changed, 51 insertions(+), 213 deletions(-)
drivers/video/tgafb.c +51 -213
@@ -1146,222 +1146,57 @@ copyarea_line_32bpp(struct fb_info *info__raw_writel (TGA_MODE_SBM_24BPP |TGA_MODE_SIMPLE , tga_regs+TGA_MODE_REG ); } -/* The general case of forward copy in 8bpp mode. */ +/* The (almost) general case of backward copy in 8bpp mode. */ static inline void -copyarea_foreward_8bpp (struct fb_info *info,u32 dx,u32 dy,u32 sx,u32 sy, -u32 height,u32 width,u32 line_length) +copyarea_8bpp (struct fb_info *info,u32 dx,u32 dy,u32 sx,u32 sy, +u32 height,u32 width,u32 line_length, +const struct fb_copyarea *area) {struct tga_par *par = (struct tga_par *) info->par; -unsigned long i, copied, left; -unsigned long dpos, spos, dalign, salign, yincr; -u32 smask_first, dmask_first, dmask_last; -int pixel_shift, need_prime, need_second; -unsigned long n64, n32, xincr_first; +unsigned i, yincr; +int depos, sepos, backward, last_step, step; +u32 mask_last; +unsigned n32;void __iomem *tga_regs;void __iomem *tga_fb; - yincr = line_length; -if (dy > sy) { - dy += height -1 ; - sy += height -1 ; - yincr = -yincr; - } - -/* Compute the offsets and alignments in the frame buffer. -More than anything else, these control how we do copies. */ - dpos = dy * line_length + dx; - spos = sy * line_length + sx; - dalign = dpos &7 ; - salign = spos &7 ; - dpos &=-8 ; - spos &=-8 ; - -/* Compute the value for the PIXELSHIFT register. This controls -both non-co-aligned source and destination and copy direction. */ -if (dalign >= salign) - pixel_shift = dalign - salign; -else - pixel_shift =8 - (salign - dalign); - -/* Figure out if we need an additional priming step for the -residue register. */ - need_prime = (salign > dalign); -if (need_prime) - dpos -=8 ; - -/* Begin by copying the leading unaligned destination. Copy enough -to make the next destination address 32-byte aligned. */ - copied =32 - (dalign + (dpos &31 )); -if (copied ==32 ) - copied =0 ; - xincr_first = (copied +7 ) &-8 ; - smask_first = dmask_first = (1ul << copied) -1 ; - smask_first <<= salign; - dmask_first <<= dalign + need_prime*8 ; -if (need_prime && copied >24 ) - copied -=8 ; - left = width - copied; - -/* Care for small copies. */ -if (copied > width) { -u32 t; - t = (1ul << width) -1 ; - t <<= dalign + need_prime*8 ; - dmask_first &= t; - left =0 ; - } - -/* Attempt to use 64-byte copies. This is only possible if the -source and destination are co-aligned at 64 bytes. */ - n64 = need_second =0 ; -if ((dpos &63 ) == (spos &63 ) - && (height ==1 || line_length %64 ==0 )) { -/* We may need a 32-byte copy to ensure 64 byte alignment. */ - need_second = (dpos + xincr_first) &63 ; -if ((need_second &32 ) != need_second) -printk (KERN_ERR "tgafb: need_second wrong\n" ); -if (left >= need_second +64 ) { - left -= need_second; - n64 = left /64 ; - left %=64 ; - }else - need_second =0 ; - } - -/* Copy trailing full 32-byte sections. This will be the main -loop if the 64 byte loop can't be used. */ - n32 = left /32 ; - left %=32 ; - -/* Copy the trailing unaligned destination. */ - dmask_last = (1ul << left) -1 ; - - tga_regs = par->tga_regs_base; - tga_fb = par->tga_fb_base; - -/* Set up the MODE and PIXELSHIFT registers. */ -__raw_writel (TGA_MODE_SBM_8BPP |TGA_MODE_COPY , tga_regs+TGA_MODE_REG ); -__raw_writel (pixel_shift, tga_regs+TGA_PIXELSHIFT_REG ); -wmb (); - -for (i =0 ; i < height; ++i) { -unsigned long j; -void __iomem *sfb; -void __iomem *dfb; - - sfb = tga_fb + spos; - dfb = tga_fb + dpos; -if (dmask_first) { -__raw_writel (smask_first, sfb); -wmb (); -__raw_writel (dmask_first, dfb); -wmb (); - sfb += xincr_first; - dfb += xincr_first; - } - -if (need_second) { -__raw_writel (0xffffffff , sfb); -wmb (); -__raw_writel (0xffffffff , dfb); -wmb (); - sfb +=32 ; - dfb +=32 ; - } - -if (n64 && (((unsigned long )sfb | (unsigned long )dfb) &63 )) -printk (KERN_ERR -"tgafb: misaligned copy64 (s:%p, d:%p)\n" , - sfb, dfb); - -for (j =0 ; j < n64; ++j) { -__raw_writel (sfb - tga_fb, tga_regs+TGA_COPY64_SRC ); -wmb (); -__raw_writel (dfb - tga_fb, tga_regs+TGA_COPY64_DST ); -wmb (); - sfb +=64 ; - dfb +=64 ; - } - -for (j =0 ; j < n32; ++j) { -__raw_writel (0xffffffff , sfb); -wmb (); -__raw_writel (0xffffffff , dfb); -wmb (); - sfb +=32 ; - dfb +=32 ; - } - -if (dmask_last) { -__raw_writel (0xffffffff , sfb); -wmb (); -__raw_writel (dmask_last, dfb); -wmb (); - } - - spos += yincr; - dpos += yincr; +/* Do acceleration only if we are aligned on 8 pixels */ +if ((dx | sx | width) &7 ) { +cfb_copyarea (info, area); +return ; } -/* Reset the MODE register to normal. */ -__raw_writel (TGA_MODE_SBM_8BPP |TGA_MODE_SIMPLE , tga_regs+TGA_MODE_REG ); -} - -/* The (almost) general case of backward copy in 8bpp mode. */ -static inline void -copyarea_backward_8bpp (struct fb_info *info,u32 dx,u32 dy,u32 sx,u32 sy, -u32 height,u32 width,u32 line_length, -const struct fb_copyarea *area) -{ -struct tga_par *par = (struct tga_par *) info->par; -unsigned long i, left, yincr; -unsigned long depos, sepos, dealign, sealign; -u32 mask_first, mask_last; -unsigned long n32; -void __iomem *tga_regs; -void __iomem *tga_fb; - yincr = line_length;if (dy > sy) { dy += height -1 ; sy += height -1 ; yincr = -yincr; } + backward = dy == sy && dx > sx && dx < sx + width;/* Compute the offsets and alignments in the frame buffer. More than anything else, these control how we do copies. */ - depos = dy * line_length + dx + width; - sepos = sy * line_length + sx + width; - dealign = depos &7 ; - sealign = sepos &7 ; - -/* ??? The documentation appears to be incorrect (or very -misleading) wrt how pixel shifting works in backward copy -mode, i.e. when PIXELSHIFT is negative. I give up for now. -Do handle the common case of co-aligned backward copies, -but frob everything else back on generic code. */ -if (dealign != sealign) { -cfb_copyarea (info, area); -return ; - } - -/* We begin the copy with the trailing pixels of the -unaligned destination. */ - mask_first = (1ul << dealign) -1 ; - left = width - dealign; - -/* Care for small copies. */ -if (dealign > width) { - mask_first ^= (1ul << (dealign - width)) -1 ; - left =0 ; - } + depos = dy * line_length + dx; + sepos = sy * line_length + sx; +if (backward) + depos += width, sepos += width;/* Next copy full words at a time. */ - n32 = left /32 ; - left %=32 ; + n32 = width /32 ; + last_step = width %32 ;/* Finally copy the unaligned head of the span. */ - mask_last =-1 << (32 - left); + mask_last = (1ul << last_step) -1 ; + +if (!backward) { + step =32 ; + last_step =32 ; + }else { + step =-32 ; + last_step = -last_step; + sepos -=32 ; + depos -=32 ; + } tga_regs = par->tga_regs_base; tga_fb = par->tga_fb_base;
@@ -1378,25 +1213,33 @@ copyarea_backward_8bpp(struct fb_info *i sfb = tga_fb + sepos; dfb = tga_fb + depos; -if (mask_first) { -__raw_writel (mask_first, sfb); -wmb (); -__raw_writel (mask_first, dfb); -wmb (); - } -for (j =0 ; j < n32; ++j) { - sfb -=32 ; - dfb -=32 ; +for (j =0 ; j < n32; j++) { +if (j <2 && j +1 < n32 && !backward && + !(((unsigned long )sfb | (unsigned long )dfb) &63 )) { +do { +__raw_writel (sfb - tga_fb, tga_regs+TGA_COPY64_SRC ); +wmb (); +__raw_writel (dfb - tga_fb, tga_regs+TGA_COPY64_DST ); +wmb (); + sfb +=64 ; + dfb +=64 ; + j +=2 ; + }while (j +1 < n32); + j--; +continue ; + }__raw_writel (0xffffffff , sfb);wmb ();__raw_writel (0xffffffff , dfb);wmb (); + sfb += step; + dfb += step; }if (mask_last) { - sfb -=32 ; - dfb -=32 ; + sfb += last_step - step; + dfb += last_step - step;__raw_writel (mask_last, sfb);wmb ();__raw_writel (mask_last, dfb);
@@ -1457,14 +1300,9 @@ tgafb_copyarea(struct fb_info *info, conelse if (bpp ==32 )cfb_copyarea (info, area); -/* Detect overlapping source and destination that requires -a backward copy. */ -else if (dy == sy && dx > sx && dx < sx + width) -copyarea_backward_8bpp (info, dx, dy, sx, sy, height, - width, line_length, area);else -copyarea_foreward_8bpp (info, dx, dy, sx, sy, height, - width, line_length); +copyarea_8bpp (info, dx, dy, sx, sy, height, + width, line_length, area); }
Greg Kroah-Hartman
maintainerPATCH 19/22 mtd: nuc900_nand: NULL dereference in nuc900_nand_enable()
In reply to Greg Kroah-Hartman3.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dan Carpenter <[email protected]>
commit c69dbbf3335a21aae74376d7e5db50a486d52439 upstream.
Instead of writing to "nand->reg + REG_FMICSR" we write to "REG_FMICSR" which is NULL and not a valid register.
--- drivers/mtd/nand/nuc900_nand.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/mtd/nand/nuc900_nand.c +1 -1
@@ -250,7 +250,7 @@ static void nuc900_nand_enable(struct nu val =__raw_readl (nand->reg +REG_FMICSR );if (!(val &NAND_EN )) -__raw_writel (val |NAND_EN ,REG_FMICSR ); +__raw_writel (val |NAND_EN , nand->reg +REG_FMICSR ); val =__raw_readl (nand->reg +REG_SMCSR );
Greg Kroah-Hartman
maintainerPATCH 20/22 mtd: sm_ftl: heap corruption in sm_create_sysfs_attributes()
In reply to Greg Kroah-Hartman3.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dan Carpenter <[email protected]>
commit b4c233057771581698a13694ab6f33b48ce837dc upstream.
We always put a NUL terminator one space past the end of the "vendor" buffer. Walter Harms also pointed out that this should just use kstrndup().
--- drivers/mtd/sm_ftl.c | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-)
drivers/mtd/sm_ftl.c +4 -7
@@ -59,15 +59,12 @@ struct attribute_group *sm_create_sysfs_struct attribute_group *attr_group;struct attribute **attributes;struct sm_sysfs_attribute *vendor_attribute; +char *vendor; -int vendor_len =strnlen (ftl->cis_buffer +SM_CIS_VENDOR_OFFSET , -SM_SMALL_PAGE -SM_CIS_VENDOR_OFFSET ); - -char *vendor =kmalloc (vendor_len,GFP_KERNEL ); + vendor =kstrndup (ftl->cis_buffer +SM_CIS_VENDOR_OFFSET , +SM_SMALL_PAGE -SM_CIS_VENDOR_OFFSET ,GFP_KERNEL );if (!vendor) goto error1; -memcpy (vendor, ftl->cis_buffer +SM_CIS_VENDOR_OFFSET , vendor_len); - vendor[vendor_len] =0 ;/* Initialize sysfs attributes */ vendor_attribute =
@@ -78,7 +75,7 @@ struct attribute_group *sm_create_sysfs_sysfs_attr_init (&vendor_attribute->dev_attr.attr); vendor_attribute->data = vendor; - vendor_attribute->len = vendor_len; + vendor_attribute->len =strlen (vendor); vendor_attribute->dev_attr.attr.name ="vendor" ; vendor_attribute->dev_attr.attr.mode =S_IRUGO ; vendor_attribute->dev_attr.show = sm_attr_show;
Greg Kroah-Hartman
maintainerPATCH 21/22 Skip intel_crt_init for Dell XPS 8700
In reply to Greg Kroah-Hartman3.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Giacomo Comes <[email protected]>
commit 10b6ee4a87811a110cb01eaca01eb04da6801baf upstream.
The Dell XPS 8700 has a onboard Display port and HDMI port and no VGA port. The call intel_crt_init freeze the machine, so skip such call.
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=73559
--- drivers/gpu/drm/i915/intel_crt.c | 8 ++++++++ 1 file changed, 8 insertions(+)
drivers/gpu/drm/i915/intel_crt.c +8 -0
@@ -579,6 +579,14 @@ static const struct dmi_system_id intel_ DMI_MATCH(DMI_PRODUCT_NAME, "ZGB"), }, }, + { + .callback = intel_no_crt_dmi_callback, + .ident = "DELL XPS 8700", + .matches = { + DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."), + DMI_MATCH(DMI_PRODUCT_NAME, "XPS 8700"), + }, + }, { } };
Greg Kroah-Hartman
maintainerPATCH 22/22 dm thin: fix dangling bio in process_deferred_bios error path
In reply to Greg Kroah-Hartman3.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mike Snitzer <[email protected]>
commit fe76cd88e654124d1431bb662a0fc6e99ca811a5 upstream.
If unable to ensure_next_mapping() we must add the current bio, which was removed from the @bios list via bio_list_pop, back to the deferred_bios list before all the remaining @bios.
--- drivers/md/dm-thin.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/md/dm-thin.c +1 -1
@@ -1446,9 +1446,9 @@ static void process_deferred_bios(struct*/ if (ensure_next_mapping (pool)) {spin_lock_irqsave (&pool->lock, flags); +bio_list_add (&pool->deferred_bios, bio);bio_list_merge (&pool->deferred_bios, &bios);spin_unlock_irqrestore (&pool->lock, flags); -break ; }
Quoted 8 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 3.4.90 release. There are 22 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Tue May 13 19:20:50 UTC 2014. Anything received after that time might be too late.
Build results:
total: 120 pass: 97 skipped: 18 fail: 5
Qemu tests all passed.
Results are as expected.
Details are available at http://server.roeck-us.net:8010/builders.
Guenter
Quoted 8 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 3.4.90 release. There are 22 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Tue May 13 19:20:50 UTC 2014. Anything received after that time might be too late.
Quoted 8 lines
The whole patch series can be found in one patch at:
kernel.org/pub/linux/kernel/v3.0/stable-review/patch-3.4.90-rc1.gzand the diffstat can be found below.
thanks,
greg k-h
Compiled and booted on my test systems. No dmesg regressions.
-- Shuah
Signature · 4 lines
Shuah Khan Senior Linux Kernel Developer - Open Source Group Samsung Research America(Silicon Valley) [email protected] | (970) 672-0658