3.5.3-stable review
Subsystems (27)
Greg Kroah-Hartman
maintainercover 3.5.3-stable review
From: Greg KH <[email protected]>
This is the start of the stable review cycle for the 3.5.3 release. There are 47 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 Wed Aug 22 03:58:29 UTC 2012. 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.5.3-rc1.gz
and the diffstat can be found below.
thanks,
greg k-h
-------------
Makefile | 4 +- arch/s390/kernel/compat_linux.c | 2 - arch/s390/kernel/compat_wrapper.S | 4 +- arch/x86/kvm/emulate.c | 4 +- arch/x86/kvm/i8259.c | 17 ++ arch/x86/kvm/vmx.c | 90 +++++++-- arch/x86/kvm/x86.c | 4 + arch/x86/xen/p2m.c | 5 + drivers/base/core.c | 9 +- drivers/dma/imx-dma.c | 36 ++-- drivers/gpu/drm/i915/i915_sysfs.c | 12 ++ drivers/gpu/drm/i915/intel_display.c | 11 -- drivers/gpu/drm/i915/intel_dp.c | 18 +- drivers/gpu/drm/i915/intel_ringbuffer.c | 7 +- drivers/gpu/drm/mgag200/mgag200_mode.c | 12 +- drivers/gpu/drm/nouveau/nvc0_pm.c | 2 +- drivers/gpu/drm/nouveau/nvd0_display.c | 2 +- drivers/gpu/drm/radeon/atombios_crtc.c | 14 +- drivers/gpu/drm/radeon/evergreen.c | 71 ++----- drivers/gpu/drm/radeon/evergreen_cs.c | 6 +- drivers/gpu/drm/radeon/evergreend.h | 2 + drivers/gpu/drm/radeon/ni.c | 14 +- drivers/gpu/drm/radeon/r600_cs.c | 6 +- drivers/gpu/drm/radeon/radeon_asic.h | 8 +- drivers/gpu/drm/radeon/radeon_drv.c | 3 +- drivers/gpu/drm/radeon/radeon_legacy_crtc.c | 4 + drivers/gpu/drm/radeon/radeon_mode.h | 1 + drivers/gpu/drm/radeon/rv515.c | 13 -- drivers/gpu/drm/radeon/si.c | 14 +- drivers/infiniband/ulp/srp/ib_srp.c | 87 ++++++--- drivers/net/wireless/rt2x00/rt2800usb.c | 1 + drivers/staging/comedi/drivers.c | 2 +- drivers/tty/serial/pmac_zilog.c | 12 +- drivers/usb/gadget/u_ether.c | 6 + drivers/usb/host/pci-quirks.c | 7 + drivers/usb/host/pci-quirks.h | 1 + drivers/usb/host/xhci-pci.c | 10 + drivers/usb/host/xhci-ring.c | 36 ++-- drivers/usb/host/xhci.c | 8 +- drivers/usb/host/xhci.h | 1 + drivers/usb/serial/ftdi_sio.c | 1 + drivers/usb/serial/ftdi_sio_ids.h | 7 + drivers/usb/serial/mos7840.c | 9 +- drivers/usb/serial/option.c | 281 +++++++++++----------------- fs/ext4/balloc.c | 62 +++--- fs/ext4/bitmap.c | 1 - fs/ext4/extents.c | 1 + fs/ext4/super.c | 6 + fs/fuse/file.c | 2 +- fs/jbd2/journal.c | 3 +- include/drm/drm_pciids.h | 3 + include/linux/jbd2.h | 1 + include/linux/usb.h | 21 +++ security/yama/yama_lsm.c | 10 +- 54 files changed, 562 insertions(+), 412 deletions(-)
Greg Kroah-Hartman
maintainerPATCH 1/46 s390/compat: fix compat wrappers for process_vm system calls
From: Greg KH <[email protected]>
3.5-stable review patch. If anyone has any objections, please let me know.
------------------
From: Heiko Carstens <[email protected]>
commit 82aabdb6f1eb61e0034ec23901480f5dd23db7c4 upstream.
The compat wrappers incorrectly called the non compat versions of the system process_vm system calls.
--- arch/s390/kernel/compat_wrapper.S | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
arch/s390/kernel/compat_wrapper.S +2 -2
@@ -1636,7 +1636,7 @@ ENTRY(compat_sys_process_vm_readv_wrappe llgfr %r6,%r6 # unsigned long llgf %r0,164(%r15) # unsigned long stg %r0,160(%r15) - jg sys_process_vm_readv + jg compat_sys_process_vm_readv ENTRY(compat_sys_process_vm_writev_wrapper) lgfr %r2,%r2 # compat_pid_t
@@ -1646,4 +1646,4 @@ ENTRY(compat_sys_process_vm_writev_wrapp llgfr %r6,%r6 # unsigned long llgf %r0,164(%r15) # unsigned long stg %r0,160(%r15) - jg sys_process_vm_writev + jg compat_sys_process_vm_writev
Greg Kroah-Hartman
maintainerPATCH 2/46 s390/compat: fix mmap compat system calls
In reply to Greg Kroah-HartmanFrom: Greg KH <[email protected]>
3.5-stable review patch. If anyone has any objections, please let me know.
------------------
From: Heiko Carstens <[email protected]>
commit e85871218513c54f7dfdb6009043cb638f2fecbe upstream.
The native 31 bit and the compat behaviour for the mmap system calls differ:
In native 31 bit mode the passed in address for the mmap system call will be unmodified passed to sys_mmap_pgoff().
In compat mode however the passed in address will be modified with compat_ptr() which masks out the most significant bit.
The result is that in native 31 bit mode each mmap request (with MAP_FIXED) will fail where the most significat bit is set, while in compat mode it may succeed.
This odd behaviour was introduced with d3815898 "[S390] mmap: add missing compat_ptr conversion to both mmap compat syscalls".
To restore a consistent behaviour accross native and compat mode this patch functionally reverts the above mentioned commit.
--- arch/s390/kernel/compat_linux.c | 2 -- 1 file changed, 2 deletions(-)
arch/s390/kernel/compat_linux.c +0 -2
@@ -622,7 +622,6 @@ asmlinkage unsigned long old32_mmap(strureturn -EFAULT ;if (a.offset & ~PAGE_MASK )return -EINVAL ; - a.addr = (unsigned long )compat_ptr (a.addr);return sys_mmap_pgoff (a.addr, a.len, a.prot, a.flags, a.fd, a.offset >>PAGE_SHIFT ); }
@@ -633,7 +632,6 @@ asmlinkage long sys32_mmap2(struct mmap_if (copy_from_user (&a, arg,sizeof (a)))return -EFAULT ; - a.addr = (unsigned long )compat_ptr (a.addr);return sys_mmap_pgoff (a.addr, a.len, a.prot, a.flags, a.fd, a.offset); }
Greg Kroah-Hartman
maintainerPATCH 3/46 nouveau: fixup scanout enable in nvc0_pm
In reply to Greg Kroah-HartmanFrom: Greg KH <[email protected]>
3.5-stable review patch. If anyone has any objections, please let me know.
------------------
From: Maarten Lankhorst <[email protected]>
commit 44b9f44e111c1e4a50bff66a642cc7c5cb59af4e upstream.
Fixes screen being black after changing performance level.
--- drivers/gpu/drm/nouveau/nvc0_pm.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/nouveau/nvc0_pm.c +1 -1
@@ -557,7 +557,7 @@ prog_mem(struct drm_device *dev, structnouveau_mem_exec (&exec, info->perflvl);if (dev_priv->chipset <0xd0 ) -nv_wr32 (dev,0x611200 ,0x00003300 ); +nv_wr32 (dev,0x611200 ,0x00003330 );else nv_wr32 (dev,0x62c000 ,0x03030300 ); }
Greg Kroah-Hartman
maintainerPATCH 4/46 drm/mgag200: fix G200ER pll picking algorithm
In reply to Greg Kroah-HartmanFrom: Greg KH <[email protected]>
3.5-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dave Airlie <[email protected]>
commit 9830605d4c070b16ec5c24a75503877cc7698409 upstream.
The original code was misported from the X driver,
a) an int went to unsigned int, breaking the downward counting testm code
b) the port did the vco/computed clock bits completely wrong.
This fixes an infinite loop on modprobe on some Dell servers with the G200ER chipset variant.
Found in internal testing.
--- drivers/gpu/drm/mgag200/mgag200_mode.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-)
drivers/gpu/drm/mgag200/mgag200_mode.c +7 -5
@@ -468,10 +468,11 @@ static int mga_g200er_set_plls(struct mg {unsigned int vcomax, vcomin, pllreffreq;unsigned int delta, tmpdelta; -unsigned int testr, testn, testm, testo; +int testr, testn, testm, testo;unsigned int p, m, n; -unsigned int computed; +unsigned int computed, vco;int tmp; +const unsigned int m_div_val[] = {1 ,2 ,4 ,8 }; m = n = p =0 ; vcomax =1488000 ;
@@ -490,12 +491,13 @@ static int mga_g200er_set_plls(struct mgif (delta ==0 )break ;for (testo =5 ; testo <33 ; testo++) { - computed = pllreffreq * (testn +1 ) / + vco = pllreffreq * (testn +1 ) / (testr +1 ); -if (computed < vcomin) +if (vco < vcomin)continue ; -if (computed > vcomax) +if (vco > vcomax)continue ; + computed = vco / (m_div_val[testm] * (testo +1 ));if (computed > clock) tmpdelta = computed - clock;else
Greg Kroah-Hartman
maintainerPATCH 5/46 dma: imx-dma: Fix kernel crash due to missing clock conversion
In reply to Greg Kroah-HartmanFrom: Greg KH <[email protected]>
3.5-stable review patch. If anyone has any objections, please let me know.
------------------
From: Fabio Estevam <[email protected]>
commit a2367db2ec5e7fc6fe93e221e0fcdee81b053daf upstream.
With the new i.MX clock infrastructure we need to request the dma clocks
seperately: ahb and ipg clocks.
This fixes the following kernel crash and make audio to be functional again:
root@freescale /home$ aplay audio48k16S.wav
Playing WAVE 'audio48k16S.wav' : Signed 16 bit Little Endian, Rate 48000 Hz, Stereo
Unable to handle kernel NULL pointer dereference at virtual address 00000000 pgd = c7b74000 [00000000] *pgd=a7bb5831, *pte=00000000, *ppte=00000000 Internal error: Oops: 17 [#1] PREEMPT ARM Modules linked in: CPU: 0 Not tainted (3.5.0-rc5-next-20120702-00007-g3028b64 #1128) PC is at snd_dmaengine_pcm_get_chan+0x8/0x10 LR is at snd_imx_pcm_hw_params+0x18/0xdc pc : [<c02d3cf8>] lr : [<c02e95ec>] psr: a0000013
sp : c7b45e30 ip : ffffffff fp : c7ae58e0
r10: 00000000 r9 : c7ae981c r8 : c7b88800
r7 : c7ae5a60 r6 : c7ae5b20 r5 : c7ae9810 r4 : c7afa060 r3 : 00000000 r2 : 00000001 r1 : c7b88800 r0 : c7afa060
Flags: NzCv IRQs on FIQs on Mode SVC_32 ISA ARM Segment user
Control: 0005317f Table: a7b74000 DAC: 00000015 Process aplay (pid: 701, stack limit = 0xc7b44270)
Stack: (0xc7b45e30 to 0xc7b46000)
5e20: 00100000 00000029 c7b88800 c02db870
5e40: c7ae5a60 c02d4594 00000010 01ae5a60 c7ae5a60 c7ae9810 c7ae9810 c7afa060
5e60: c7ae5b20 c7ae5a60 c7b88800 c02e3ef0 c02e3e08 c7b1e400 c7afa060 c7b88800
5e80: 00000000 c0014da8 c7b44000 00000000 bec566ac c02cd400 c7afa060 c7afa060
5ea0: bec56800 c7b88800 c0014da8 c02cdd7c c04ee710 c04ee7b8 00000003 c005fc74
5ec0: 00000000 7fffffff c7b45f00 c7afa060 c7b67420 c7ba3070 00000004 c0014da8
5ee0: c7b44000 00000000 bec566ac c02ced88 c04e95f8 b6f5ab04 c7b45fb0 0145a468
5f00: 0145a600 bec566bc bec56800 c7b67420 c7ba3070 c00d499c c7b45f18 c7b45f18
5f20: 0000001a 00000004 00000001 c7b44000 c0527f40 00000009 00000008 00000000
5f40: c7b44000 c002c9ec 00000001 c04f0ab0 c04ebec0 00000101 00000000 0000000a
5f60: 60000093 c7b67420 bec56800 c25c4111 00000004 c0014da8 c7b44000 00000000
5f80: bec566ac c00d4f38 b6ffb658 00000000 c0522d80 0145a468 b6fd5000 0145a418
5fa0: 00000036 c0014c00 0145a468 b6fd5000 00000004 c25c4111 bec56800 00020001
5fc0: 0145a468 b6fd5000 0145a418 00000036 0145a468 0145a600 bec566bc bec566ac
5fe0: 0145a468 bec56388 b6f65ce4 b6dcebec 20000010 00000004 00000000 00000000 [<c02d3cf8>] (snd_dmaengine_pcm_get_chan+0x8/0x10) from [<c02e95ec>] (snd_imx_pcm_hw_params+0x18/0xdc) [<c02e95ec>] (snd_imx_pcm_hw_params+0x18/0xdc) from [<c02e3ef0>] (soc_pcm_hw_params+0xe8/0x1f0) [<c02e3ef0>] (soc_pcm_hw_params+0xe8/0x1f0) from [<c02cd400>] (snd_pcm_hw_params+0x124/0x474) [<c02cd400>] (snd_pcm_hw_params+0x124/0x474) from [<c02cdd7c>] (snd_pcm_common_ioctl1+0x4b4/0xf74) [<c02cdd7c>] (snd_pcm_common_ioctl1+0x4b4/0xf74) from [<c02ced88>] (snd_pcm_playback_ioctl1+0x30/0x510) [<c02ced88>] (snd_pcm_playback_ioctl1+0x30/0x510) from [<c00d499c>] (do_vfs_ioctl+0x80/0x5e4) [<c00d499c>] (do_vfs_ioctl+0x80/0x5e4) from [<c00d4f38>] (sys_ioctl+0x38/0x60) [<c00d4f38>] (sys_ioctl+0x38/0x60) from [<c0014c00>] (ret_fast_syscall+0x0/0x2c)
Code: e593000c e12fff1e e59030a0 e59330bc (e5930000) ---[ end trace fa518c8ba3a74e97 ]--
--- drivers/dma/imx-dma.c | 36 +++++++++++++++++++++++++----------- 1 file changed, 25 insertions(+), 11 deletions(-)
drivers/dma/imx-dma.c +25 -11
@@ -172,7 +172,8 @@ struct imxdma_engine {struct device_dma_parameters dma_parms;struct dma_device dma_device;void __iomem *base; -struct clk *dma_clk; +struct clk *dma_ahb; +struct clk *dma_ipg;spinlock_t lock;struct imx_dma_2d_config slots_2d[IMX_DMA_2D_SLOTS ];struct imxdma_channel channel[IMX_DMA_CHANNELS ];
@@ -976,10 +977,20 @@ static int __init imxdma_probe(struct plreturn 0 ; } - imxdma->dma_clk =clk_get (NULL ,"dma" ); -if (IS_ERR (imxdma->dma_clk)) -return PTR_ERR (imxdma->dma_clk); -clk_enable (imxdma->dma_clk); + imxdma->dma_ipg =devm_clk_get (&pdev->dev,"ipg" ); +if (IS_ERR (imxdma->dma_ipg)) { + ret =PTR_ERR (imxdma->dma_ipg); + goto err_clk; + } + + imxdma->dma_ahb =devm_clk_get (&pdev->dev,"ahb" ); +if (IS_ERR (imxdma->dma_ahb)) { + ret =PTR_ERR (imxdma->dma_ahb); + goto err_clk; + } + +clk_prepare_enable (imxdma->dma_ipg); +clk_prepare_enable (imxdma->dma_ahb);/* reset DMA module */ imx_dmav1_writel (imxdma,DCR_DRST ,DMA_DCR );
@@ -988,16 +999,14 @@ static int __init imxdma_probe(struct pl ret =request_irq (MX1_DMA_INT , dma_irq_handler,0 ,"DMA" , imxdma);if (ret) {dev_warn (imxdma->dev,"Can't register IRQ for DMA\n" ); -kfree (imxdma); -return ret; + goto err_enable; } ret =request_irq (MX1_DMA_ERR , imxdma_err_handler,0 ,"DMA" , imxdma);if (ret) {dev_warn (imxdma->dev,"Can't register ERRIRQ for DMA\n" );free_irq (MX1_DMA_INT ,NULL ); -kfree (imxdma); -return ret; + goto err_enable; } }
@@ -1094,7 +1103,10 @@ err_init:free_irq (MX1_DMA_INT ,NULL );free_irq (MX1_DMA_ERR ,NULL ); } - +err_enable: +clk_disable_unprepare (imxdma->dma_ipg); +clk_disable_unprepare (imxdma->dma_ahb); +err_clk:kfree (imxdma);return ret; }
@@ -1114,7 +1126,9 @@ static int __exit imxdma_remove(struct pfree_irq (MX1_DMA_ERR ,NULL ); } -kfree (imxdma); +clk_disable_unprepare (imxdma->dma_ipg); +clk_disable_unprepare (imxdma->dma_ahb); +kfree (imxdma);return 0 ; }
Greg Kroah-Hartman
maintainerPATCH 6/46 fuse: verify all ioctl retry iov elements
In reply to Greg Kroah-HartmanFrom: Greg KH <[email protected]>
3.5-stable review patch. If anyone has any objections, please let me know.
------------------
From: Zach Brown <[email protected]>
commit fb6ccff667712c46b4501b920ea73a326e49626a upstream.
Commit 7572777eef78ebdee1ecb7c258c0ef94d35bad16 attempted to verify that the total iovec from the client doesn't overflow iov_length() but it only checked the first element. The iovec could still overflow by starting with a small element. The obvious fix is to check all the elements.
The overflow case doesn't look dangerous to the kernel as the copy is limited by the length after the overflow. This fix restores the intention of returning an error instead of successfully copying less than the iovec represented.
I found this by code inspection. I built it but don't have a test case. I'm cc:ing stable because the initial commit did as well.
--- fs/fuse/file.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
fs/fuse/file.c +1 -1
@@ -1700,7 +1700,7 @@ static int fuse_verify_ioctl_iov(structsize_t n;u32 max =FUSE_MAX_PAGES_PER_REQ <<PAGE_SHIFT ; -for (n =0 ; n < count; n++) { +for (n =0 ; n < count; n++, iov++) {if (iov->iov_len > (size_t ) max)return -ENOMEM ; max -= iov->iov_len;
Greg Kroah-Hartman
maintainerPATCH 7/46 xen/p2m: Reserve 8MB of _brk space for P2M leafs when populating back.
In reply to Greg Kroah-HartmanFrom: Greg KH <[email protected]>
3.5-stable review patch. If anyone has any objections, please let me know.
------------------
From: Konrad Rzeszutek Wilk <[email protected]>
commit 5bc6f9888db5739abfa0cae279b4b442e4db8049 upstream.
When we release pages back during bootup:
Freeing 9d-100 pfn range: 99 pages freed Freeing 9cf36-9d0d2 pfn range: 412 pages freed Freeing 9f6bd-9f6bf pfn range: 2 pages freed Freeing 9f714-9f7bf pfn range: 171 pages freed Freeing 9f7e0-9f7ff pfn range: 31 pages freed Freeing 9f800-100000 pfn range: 395264 pages freed Released 395979 pages of unused memory
We then try to populate those pages back. In the P2M tree however the space for those leafs must be reserved - as such we use extend_brk. We reserve 8MB of _brk space, which means we can fit over 1048576 PFNs - which is more than we should ever need.
Without this, on certain compilation of the kernel we would hit:
(XEN) domain_crash_sync called from entry.S
(XEN) CPU: 0
(XEN) RIP: e033:[<ffffffff818aad3b>]
(XEN) RFLAGS: 0000000000000206 EM: 1 CONTEXT: pv guest
(XEN) rax: ffffffff81a7c000 rbx: 000000000000003d rcx: 0000000000001000 (XEN) rdx: ffffffff81a7b000 rsi: 0000000000001000 rdi: 0000000000001000 (XEN) rbp: ffffffff81801cd8 rsp: ffffffff81801c98 r8: 0000000000100000 (XEN) r9: ffffffff81a7a000 r10: 0000000000000001 r11: 0000000000000003 (XEN) r12: 0000000000000004 r13: 0000000000000004 r14: 000000000000003d (XEN) r15: 00000000000001e8 cr0: 000000008005003b cr4: 00000000000006f0 (XEN) cr3: 0000000125803000 cr2: 0000000000000000
(XEN) ds: 0000 es: 0000 fs: 0000 gs: 0000 ss: e02b cs: e033
(XEN) Guest stack trace from rsp=ffffffff81801c98:
.. which is extend_brk hitting a BUG_ON.
Interestingly enough, most of the time we are not going to hit this b/c the _brk space is quite large (v3.5):
ffffffff81a25000 B __brk_base
ffffffff81e43000 B __brk_limit
= ~4MB.
vs earlier kernels (with this back-ported), the space is smaller:
ffffffff81a25000 B __brk_base
ffffffff81a7b000 B __brk_limit
= 344 kBytes.
where we would certainly hit this and hit extend_brk.
Note that git commit c3d93f880197953f86ab90d9da4744e926b38e33 (xen: populate correct number of pages when across mem boundary (v2)) exposed this bug).
[v1: Made it 8MB of _brk space instead of 4MB per Jan's suggestion]
--- arch/x86/xen/p2m.c | 5 +++++ 1 file changed, 5 insertions(+)
arch/x86/xen/p2m.c +5 -0
@@ -194,6 +194,11 @@ RESERVE_BRK(p2m_mid_mfn, PAGE_SIZE * (MA* boundary violation will require three middle nodes. */ RESERVE_BRK (p2m_mid_identity,PAGE_SIZE *2 *3 ); +/* When we populate back during bootup, the amount of pages can vary. The +* max we have is seen is 395979, but that does not mean it can't be more. +* But some machines can have 3GB I/O holes even. So lets reserve enough +* for 4GB of I/O and E820 holes. */ +RESERVE_BRK (p2m_populated,PMD_SIZE *4 );static inline unsigned p2m_top_index (unsigned long pfn) {BUG_ON (pfn >=MAX_P2M_PFN );
Greg Kroah-Hartman
maintainerPATCH 8/46 drm/i915: prefer wide & slow to fast & narrow in DP configs
In reply to Greg Kroah-HartmanFrom: Greg KH <[email protected]>
3.5-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jesse Barnes <[email protected]>
commit 2514bc510d0c3aadcc5204056bb440fa36845147 upstream.
High frequency link configurations have the potential to cause trouble with long and/or cheap cables, so prefer slow and wide configurations instead. This patch has the potential to cause trouble for eDP configurations that lie about available lanes, so if we run into that we can make it conditional on eDP.
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=45801
--- drivers/gpu/drm/i915/intel_dp.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/gpu/drm/i915/intel_dp.c +2 -2
@@ -726,8 +726,8 @@ intel_dp_mode_fixup(struct drm_encoder * bpp = adjusted_mode->private_flags &INTEL_MODE_DP_FORCE_6BPC ?18 :24 ; mode_rate =intel_dp_link_required (mode->clock, bpp); -for (lane_count =1 ; lane_count <= max_lane_count; lane_count <<=1 ) { -for (clock =0 ; clock <= max_clock; clock++) { +for (clock =0 ; clock <= max_clock; clock++) { +for (lane_count =1 ; lane_count <= max_lane_count; lane_count <<=1 ) {int link_avail =intel_dp_max_data_rate (intel_dp_link_clock (bws[clock]), lane_count);if (mode_rate <= link_avail) {
Greg Kroah-Hartman
maintainerPATCH 9/46 drm/nvd0/disp: mask off high 16 bit of negative cursor x-coordinate
In reply to Greg Kroah-HartmanFrom: Greg KH <[email protected]>
3.5-stable review patch. If anyone has any objections, please let me know.
------------------
From: Christoph Bumiller <[email protected]>
commit af5e7d84b0ec45b2b614b0d6e3657cbdceaa21f9 upstream.
--- drivers/gpu/drm/nouveau/nvd0_display.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/nouveau/nvd0_display.c +1 -1
@@ -790,7 +790,7 @@ nvd0_crtc_cursor_move(struct drm_crtc *cstruct nouveau_crtc *nv_crtc =nouveau_crtc (crtc);int ch =EVO_CURS (nv_crtc->index); -evo_piow (crtc->dev, ch,0x0084 , (y <<16 ) | x); +evo_piow (crtc->dev, ch,0x0084 , (y <<16 ) | (x &0xffff ));evo_piow (crtc->dev, ch,0x0080 ,0x00000000 );return 0 ; }
Greg Kroah-Hartman
maintainerPATCH 10/46 drm/i915: correctly order the ring init sequence
In reply to Greg Kroah-HartmanFrom: Greg KH <[email protected]>
3.5-stable review patch. If anyone has any objections, please let me know.
------------------
From: Daniel Vetter <[email protected]>
commit 0d8957c8a90bbb5d34fab9a304459448a5131e06 upstream.
We may only start to set up the new register values after having confirmed that the ring is truely off. Otherwise the hw might lose the newly written register values. This is caught later on in the init sequence, when we check whether the register writes have stuck.
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=50522
--- drivers/gpu/drm/i915/intel_ringbuffer.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)
drivers/gpu/drm/i915/intel_ringbuffer.c +5 -2
@@ -280,8 +280,6 @@ static int init_ring_common(struct intelI915_WRITE_HEAD (ring,0 ); ring->write_tail (ring,0 ); -/* Initialize the ring. */ -I915_WRITE_START (ring, obj->gtt_offset); head =I915_READ_HEAD (ring) &HEAD_ADDR ;/* G45 ring initialization fails to reset head to zero */
@@ -307,6 +305,11 @@ static int init_ring_common(struct intel } } +/* Initialize the ring. This must happen _after_ we've cleared the ring +* registers with the above sequence (the readback of the HEAD registers +* also enforces ordering), otherwise the hw might lose the new ring +* register values. */ +I915_WRITE_START (ring, obj->gtt_offset);I915_WRITE_CTL (ring, ((ring->size -PAGE_SIZE ) &RING_NR_PAGES ) |RING_VALID );
Greg Kroah-Hartman
maintainerPATCH 11/46 drm/i915: ignore eDP bpc settings from vbt
In reply to Greg Kroah-HartmanFrom: Greg KH <[email protected]>
3.5-stable review patch. If anyone has any objections, please let me know.
------------------
From: Daniel Vetter <[email protected]>
commit 4344b813f105a19f793f1fd93ad775b784648b95 upstream.
This has originally been introduced to not oversubscribe the dp links in
commit 885a5fb5b120a5c7e0b3baad7b0feb5a89f76c18
Author: Zhenyu Wang <[email protected]> Date: Tue Jan 12 05:38:31 2010 +0800
drm/i915: fix pixel color depth setting on eDP
Since then we've fixed up the dp link bandwidth calculation code and should now automatically fall back to 6bpc dithering. So this is unnecessary.
Furthermore it seems to break the new MacbookPro with retina display, hence let's just rip this out.
--
Testing feedback highgly welcome, and thanks for Benoit for finding out that the bpc computations are busted.
-Daniel
--- drivers/gpu/drm/i915/intel_display.c | 11 ----------- 1 file changed, 11 deletions(-)
drivers/gpu/drm/i915/intel_display.c +0 -11
@@ -3581,17 +3581,6 @@ static bool intel_choose_pipe_bpp_dithercontinue ; } -if (intel_encoder->type ==INTEL_OUTPUT_EDP ) { -/* Use VBT settings if we have an eDP panel */ -unsigned int edp_bpc = dev_priv->edp.bpp /3 ; - -if (edp_bpc < display_bpc) { -DRM_DEBUG_KMS ("clamping display bpc (was %d) to eDP (%d)\n" , display_bpc, edp_bpc); - display_bpc = edp_bpc; - } -continue ; - } -/* Not one of the known troublemakers, check the EDID */ list_for_each_entry (connector, &dev->mode_config.connector_list, head) {
Greg Kroah-Hartman
maintainerPATCH 12/46 drm/i915: reorder edp disabling to fix ivb MacBook Air
In reply to Greg Kroah-HartmanFrom: Greg KH <[email protected]>
3.5-stable review patch. If anyone has any objections, please let me know.
------------------
From: Daniel Vetter <[email protected]>
commit 35a38556d900b9cb5dfa2529c93944b847f8a8a4 upstream.
eDP is tons of fun. It turns out that at least the new MacBook Air 5,1 model absolutely doesn't like the new force vdd dance we've introduced in
commit 6cb49835da0426f69a2931bc2a0a8156344b0e41
Author: Daniel Vetter <[email protected]> Date: Sun May 20 17:14:50 2012 +0200
drm/i915: enable vdd when switching off the eDP panel
But that patch also tried to fix some neat edp sequence issue with the force_vdd timings. Closer inspection reveals that we've raised force_vdd only to do the aux channel communication dp_sink_dpms. If we move the edp_panel_off below that, we don't need any force_vdd for the disable sequence, which makes the Air happy.
Unfortunately the reporter of the original bug that the above commit fixed is travelling, so we can't test whether this regresses things. But my theory is that since we don't check for any power-off -> force_vdd-on delays in edp_panel_vdd_on, this was the actual root-cause of this failure. With that force_vdd dance completely eliminated, I'm hopeful the original bug stays fixed, too.
For reference the old bug, which hopefully doesn't get broken by this:
https://bugzilla.kernel.org/show_bug.cgi?id=43163
In any case, regression fixers win over plain bugfixes, so this needs to go in asap.
v2: The crucial pieces seems to be to clear the force_vdd flag uncoditionally, too, in edp_panel_off. Looks like this is left behind by the firmware somehow.
v3: The Apple firmware seems to switch off the panel on it's own, hence we still need to keep force_vdd on, but properly clear it when switching the panel off.
Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=45671
--- drivers/gpu/drm/i915/intel_dp.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-)
drivers/gpu/drm/i915/intel_dp.c +7 -7
@@ -1171,10 +1171,14 @@ static void ironlake_edp_panel_off(strucWARN (!intel_dp->want_panel_vdd,"Need VDD to turn off panel\n" ); pp =ironlake_get_pp_control (dev_priv); - pp &= ~(POWER_TARGET_ON |PANEL_POWER_RESET |EDP_BLC_ENABLE ); +/* We need to switch off panel power _and_ force vdd, for otherwise some +* panels get very unhappy and cease to work. */ + pp &= ~(POWER_TARGET_ON |EDP_FORCE_VDD |PANEL_POWER_RESET |EDP_BLC_ENABLE );I915_WRITE (PCH_PP_CONTROL , pp);POSTING_READ (PCH_PP_CONTROL ); + intel_dp->want_panel_vdd = false; +ironlake_wait_panel_off (intel_dp); }
@@ -1284,11 +1288,9 @@ static void intel_dp_prepare(struct drm_* ensure that we have vdd while we switch off the panel. */ ironlake_edp_panel_vdd_on (intel_dp);ironlake_edp_backlight_off (intel_dp); -ironlake_edp_panel_off (intel_dp); -intel_dp_sink_dpms (intel_dp,DRM_MODE_DPMS_ON ); +ironlake_edp_panel_off (intel_dp);intel_dp_link_down (intel_dp); -ironlake_edp_panel_vdd_off (intel_dp, false); }static void intel_dp_commit (struct drm_encoder *encoder)
@@ -1323,11 +1325,9 @@ intel_dp_dpms(struct drm_encoder *encode/* Switching the panel off requires vdd. */ ironlake_edp_panel_vdd_on (intel_dp);ironlake_edp_backlight_off (intel_dp); -ironlake_edp_panel_off (intel_dp); -intel_dp_sink_dpms (intel_dp, mode); +ironlake_edp_panel_off (intel_dp);intel_dp_link_down (intel_dp); -ironlake_edp_panel_vdd_off (intel_dp, false);if (is_cpu_edp (intel_dp))ironlake_edp_pll_off (encoder);
Greg Kroah-Hartman
maintainerPATCH 13/46 drm/radeon: properly handle crtc powergating
In reply to Greg Kroah-HartmanFrom: Greg KH <[email protected]>
3.5-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alex Deucher <[email protected]>
commit 6c0ae2ab85fc4a95cae82047a7db1f688a7737ab upstream.
Need to make sure the crtc is gated on before modesetting. Explicitly gate the crtc on in prepare() and set a flag so that the dpms functions don't gate it off during mode set.
Noticed by sylware on IRC.
--- drivers/gpu/drm/radeon/atombios_crtc.c | 14 ++++++++++++-- drivers/gpu/drm/radeon/radeon_legacy_crtc.c | 4 ++++ drivers/gpu/drm/radeon/radeon_mode.h | 1 + 3 files changed, 17 insertions(+), 2 deletions(-)
drivers/gpu/drm/radeon/atombios_crtc.c +12 -2
@@ -259,7 +259,7 @@ void atombios_crtc_dpms(struct drm_crtc/* adjust pm to dpms changes BEFORE enabling crtcs */ radeon_pm_compute_clocks (rdev);/* disable crtc pair power gating before programming */ -if (ASIC_IS_DCE6 (rdev)) +if (ASIC_IS_DCE6 (rdev) && !radeon_crtc->in_mode_set)atombios_powergate_crtc (crtc,ATOM_DISABLE );atombios_enable_crtc (crtc,ATOM_ENABLE );if (ASIC_IS_DCE3 (rdev) && !ASIC_IS_DCE6 (rdev))
@@ -279,7 +279,7 @@ void atombios_crtc_dpms(struct drm_crtcatombios_enable_crtc (crtc,ATOM_DISABLE ); radeon_crtc->enabled = false;/* power gating is per-pair */ -if (ASIC_IS_DCE6 (rdev)) { +if (ASIC_IS_DCE6 (rdev) && !radeon_crtc->in_mode_set) {struct drm_crtc *other_crtc;struct radeon_crtc *other_radeon_crtc;list_for_each_entry (other_crtc, &rdev->ddev->mode_config.crtc_list, head) {
@@ -1639,18 +1639,28 @@ static bool atombios_crtc_mode_fixup(strstatic void atombios_crtc_prepare (struct drm_crtc *crtc) {struct radeon_crtc *radeon_crtc =to_radeon_crtc (crtc); +struct drm_device *dev = crtc->dev; +struct radeon_device *rdev = dev->dev_private; + radeon_crtc->in_mode_set = true;/* pick pll */ radeon_crtc->pll_id =radeon_atom_pick_pll (crtc); +/* disable crtc pair power gating before programming */ +if (ASIC_IS_DCE6 (rdev)) +atombios_powergate_crtc (crtc,ATOM_DISABLE ); +atombios_lock_crtc (crtc,ATOM_ENABLE );atombios_crtc_dpms (crtc,DRM_MODE_DPMS_OFF ); }static void atombios_crtc_commit (struct drm_crtc *crtc) { +struct radeon_crtc *radeon_crtc =to_radeon_crtc (crtc); +atombios_crtc_dpms (crtc,DRM_MODE_DPMS_ON );atombios_lock_crtc (crtc,ATOM_DISABLE ); + radeon_crtc->in_mode_set = false; }static void atombios_crtc_disable (struct drm_crtc *crtc)
drivers/gpu/drm/radeon/radeon_legacy_crtc.c +4 -0
@@ -1025,9 +1025,11 @@ static int radeon_crtc_mode_set(struct dstatic void radeon_crtc_prepare (struct drm_crtc *crtc) { +struct radeon_crtc *radeon_crtc =to_radeon_crtc (crtc);struct drm_device *dev = crtc->dev;struct drm_crtc *crtci; + radeon_crtc->in_mode_set = true;/* * The hardware wedges sometimes if you reconfigure one CRTC * whilst another is running (see fdo bug #24611).
@@ -1038,6 +1040,7 @@ static void radeon_crtc_prepare(struct dstatic void radeon_crtc_commit (struct drm_crtc *crtc) { +struct radeon_crtc *radeon_crtc =to_radeon_crtc (crtc);struct drm_device *dev = crtc->dev;struct drm_crtc *crtci;
@@ -1048,6 +1051,7 @@ static void radeon_crtc_commit(struct drif (crtci->enabled)radeon_crtc_dpms (crtci,DRM_MODE_DPMS_ON ); } + radeon_crtc->in_mode_set = false; }static const struct drm_crtc_helper_funcs legacy_helper_funcs = {
drivers/gpu/drm/radeon/radeon_mode.h +1 -0
@@ -275,6 +275,7 @@ struct radeon_crtc {u16 lut_r[256 ], lut_g[256 ], lut_b[256 ];bool enabled;bool can_tile; +bool in_mode_set;uint32_t crtc_offset;struct drm_gem_object *cursor_bo;uint64_t cursor_addr;
Greg Kroah-Hartman
maintainerPATCH 14/46 drm/radeon: do not reenable crtc after moving vram start address
In reply to Greg Kroah-HartmanFrom: Greg KH <[email protected]>
3.5-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jerome Glisse <[email protected]>
commit 81ee8fb6b52ec69eeed37fe7943446af1dccecc5 upstream.
It seems we can not update the crtc scanout address. After disabling crtc, update to base address do not take effect after crtc being reenable leading to at least frame being scanout from the old crtc base address. Disabling crtc display request lead to same behavior.
So after changing the vram address if we don't keep crtc disabled we will have the GPU trying to read some random system memory address with some iommu this will broke the crtc engine and will lead to broken display and iommu error message.
So to avoid this, disable crtc. For flicker less boot we will need to avoid moving the vram start address.
This patch should also fix :
https://bugs.freedesktop.org/show_bug.cgi?id=42373
--- drivers/gpu/drm/radeon/evergreen.c | 57 ----------------------------------- drivers/gpu/drm/radeon/radeon_asic.h | 8 +--- drivers/gpu/drm/radeon/rv515.c | 13 ------- 3 files changed, 2 insertions(+), 76 deletions(-)
drivers/gpu/drm/radeon/evergreen.c +0 -57
@@ -1117,24 +1117,8 @@ void evergreen_agp_enable(struct radeon_void evergreen_mc_stop (struct radeon_device *rdev,struct evergreen_mc_save *save) { - save->vga_control[0 ] =RREG32 (D1VGA_CONTROL ); - save->vga_control[1 ] =RREG32 (D2VGA_CONTROL ); save->vga_render_control =RREG32 (VGA_RENDER_CONTROL ); save->vga_hdp_control =RREG32 (VGA_HDP_CONTROL ); - save->crtc_control[0 ] =RREG32 (EVERGREEN_CRTC_CONTROL +EVERGREEN_CRTC0_REGISTER_OFFSET ); - save->crtc_control[1 ] =RREG32 (EVERGREEN_CRTC_CONTROL +EVERGREEN_CRTC1_REGISTER_OFFSET ); -if (rdev->num_crtc >=4 ) { - save->vga_control[2 ] =RREG32 (EVERGREEN_D3VGA_CONTROL ); - save->vga_control[3 ] =RREG32 (EVERGREEN_D4VGA_CONTROL ); - save->crtc_control[2 ] =RREG32 (EVERGREEN_CRTC_CONTROL +EVERGREEN_CRTC2_REGISTER_OFFSET ); - save->crtc_control[3 ] =RREG32 (EVERGREEN_CRTC_CONTROL +EVERGREEN_CRTC3_REGISTER_OFFSET ); - } -if (rdev->num_crtc >=6 ) { - save->vga_control[4 ] =RREG32 (EVERGREEN_D5VGA_CONTROL ); - save->vga_control[5 ] =RREG32 (EVERGREEN_D6VGA_CONTROL ); - save->crtc_control[4 ] =RREG32 (EVERGREEN_CRTC_CONTROL +EVERGREEN_CRTC4_REGISTER_OFFSET ); - save->crtc_control[5 ] =RREG32 (EVERGREEN_CRTC_CONTROL +EVERGREEN_CRTC5_REGISTER_OFFSET ); - }/* Stop all video */ WREG32 (VGA_RENDER_CONTROL ,0 );
@@ -1245,47 +1229,6 @@ void evergreen_mc_resume(struct radeon_d/* Unlock host access */ WREG32 (VGA_HDP_CONTROL , save->vga_hdp_control);mdelay (1 ); -/* Restore video state */ -WREG32 (D1VGA_CONTROL , save->vga_control[0 ]); -WREG32 (D2VGA_CONTROL , save->vga_control[1 ]); -if (rdev->num_crtc >=4 ) { -WREG32 (EVERGREEN_D3VGA_CONTROL , save->vga_control[2 ]); -WREG32 (EVERGREEN_D4VGA_CONTROL , save->vga_control[3 ]); - } -if (rdev->num_crtc >=6 ) { -WREG32 (EVERGREEN_D5VGA_CONTROL , save->vga_control[4 ]); -WREG32 (EVERGREEN_D6VGA_CONTROL , save->vga_control[5 ]); - } -WREG32 (EVERGREEN_CRTC_UPDATE_LOCK +EVERGREEN_CRTC0_REGISTER_OFFSET ,1 ); -WREG32 (EVERGREEN_CRTC_UPDATE_LOCK +EVERGREEN_CRTC1_REGISTER_OFFSET ,1 ); -if (rdev->num_crtc >=4 ) { -WREG32 (EVERGREEN_CRTC_UPDATE_LOCK +EVERGREEN_CRTC2_REGISTER_OFFSET ,1 ); -WREG32 (EVERGREEN_CRTC_UPDATE_LOCK +EVERGREEN_CRTC3_REGISTER_OFFSET ,1 ); - } -if (rdev->num_crtc >=6 ) { -WREG32 (EVERGREEN_CRTC_UPDATE_LOCK +EVERGREEN_CRTC4_REGISTER_OFFSET ,1 ); -WREG32 (EVERGREEN_CRTC_UPDATE_LOCK +EVERGREEN_CRTC5_REGISTER_OFFSET ,1 ); - } -WREG32 (EVERGREEN_CRTC_CONTROL +EVERGREEN_CRTC0_REGISTER_OFFSET , save->crtc_control[0 ]); -WREG32 (EVERGREEN_CRTC_CONTROL +EVERGREEN_CRTC1_REGISTER_OFFSET , save->crtc_control[1 ]); -if (rdev->num_crtc >=4 ) { -WREG32 (EVERGREEN_CRTC_CONTROL +EVERGREEN_CRTC2_REGISTER_OFFSET , save->crtc_control[2 ]); -WREG32 (EVERGREEN_CRTC_CONTROL +EVERGREEN_CRTC3_REGISTER_OFFSET , save->crtc_control[3 ]); - } -if (rdev->num_crtc >=6 ) { -WREG32 (EVERGREEN_CRTC_CONTROL +EVERGREEN_CRTC4_REGISTER_OFFSET , save->crtc_control[4 ]); -WREG32 (EVERGREEN_CRTC_CONTROL +EVERGREEN_CRTC5_REGISTER_OFFSET , save->crtc_control[5 ]); - } -WREG32 (EVERGREEN_CRTC_UPDATE_LOCK +EVERGREEN_CRTC0_REGISTER_OFFSET ,0 ); -WREG32 (EVERGREEN_CRTC_UPDATE_LOCK +EVERGREEN_CRTC1_REGISTER_OFFSET ,0 ); -if (rdev->num_crtc >=4 ) { -WREG32 (EVERGREEN_CRTC_UPDATE_LOCK +EVERGREEN_CRTC2_REGISTER_OFFSET ,0 ); -WREG32 (EVERGREEN_CRTC_UPDATE_LOCK +EVERGREEN_CRTC3_REGISTER_OFFSET ,0 ); - } -if (rdev->num_crtc >=6 ) { -WREG32 (EVERGREEN_CRTC_UPDATE_LOCK +EVERGREEN_CRTC4_REGISTER_OFFSET ,0 ); -WREG32 (EVERGREEN_CRTC_UPDATE_LOCK +EVERGREEN_CRTC5_REGISTER_OFFSET ,0 ); - }WREG32 (VGA_RENDER_CONTROL , save->vga_render_control); }
drivers/gpu/drm/radeon/radeon_asic.h +2 -6
@@ -256,13 +256,10 @@ extern int rs690_mc_wait_for_idle(struct* rv515 */ struct rv515_mc_save { -u32 d1vga_control; -u32 d2vga_control;u32 vga_render_control;u32 vga_hdp_control; -u32 d1crtc_control; -u32 d2crtc_control; }; +int rv515_init (struct radeon_device *rdev);void rv515_fini (struct radeon_device *rdev);uint32_t rv515_mc_rreg (struct radeon_device *rdev,uint32_t reg);
@@ -389,11 +386,10 @@ void r700_cp_fini(struct radeon_device ** evergreen */ struct evergreen_mc_save { -u32 vga_control[6 ];u32 vga_render_control;u32 vga_hdp_control; -u32 crtc_control[6 ]; }; +void evergreen_pcie_gart_tlb_flush (struct radeon_device *rdev);int evergreen_init (struct radeon_device *rdev);void evergreen_fini (struct radeon_device *rdev);
drivers/gpu/drm/radeon/rv515.c +0 -13
@@ -281,12 +281,8 @@ int rv515_debugfs_ga_info_init(struct ravoid rv515_mc_stop (struct radeon_device *rdev,struct rv515_mc_save *save) { - save->d1vga_control =RREG32 (R_000330_D1VGA_CONTROL ); - save->d2vga_control =RREG32 (R_000338_D2VGA_CONTROL ); save->vga_render_control =RREG32 (R_000300_VGA_RENDER_CONTROL ); save->vga_hdp_control =RREG32 (R_000328_VGA_HDP_CONTROL ); - save->d1crtc_control =RREG32 (R_006080_D1CRTC_CONTROL ); - save->d2crtc_control =RREG32 (R_006880_D2CRTC_CONTROL );/* Stop all video */ WREG32 (R_0068E8_D2CRTC_UPDATE_LOCK ,0 );
@@ -311,15 +307,6 @@ void rv515_mc_resume(struct radeon_devic/* Unlock host access */ WREG32 (R_000328_VGA_HDP_CONTROL , save->vga_hdp_control);mdelay (1 ); -/* Restore video state */ -WREG32 (R_000330_D1VGA_CONTROL , save->d1vga_control); -WREG32 (R_000338_D2VGA_CONTROL , save->d2vga_control); -WREG32 (R_0060E8_D1CRTC_UPDATE_LOCK ,1 ); -WREG32 (R_0068E8_D2CRTC_UPDATE_LOCK ,1 ); -WREG32 (R_006080_D1CRTC_CONTROL , save->d1crtc_control); -WREG32 (R_006880_D2CRTC_CONTROL , save->d2crtc_control); -WREG32 (R_0060E8_D1CRTC_UPDATE_LOCK ,0 ); -WREG32 (R_0068E8_D2CRTC_UPDATE_LOCK ,0 );WREG32 (R_000300_VGA_RENDER_CONTROL , save->vga_render_control); }
Greg Kroah-Hartman
maintainerPATCH 15/46 drm/i915: make rc6 in sysfs functions conditional
In reply to Greg Kroah-HartmanFrom: Greg KH <[email protected]>
3.5-stable review patch. If anyone has any objections, please let me know.
------------------
From: Hunt Xu <[email protected]>
commit 5ab3633d6907018b0b830a720e877c3884d679c3 upstream.
Commit 0136db586c028f71e7cc21cc183064ff0d5919c8 merges rc6 information into the power group. However, when compiled with CONFIG_PM not set, modprobing i915 would taint since power_group_name is defined as NULL.
This patch makes these rc6 in sysfs functions conditional upon the definition of the CONFIG_PM macro to avoid the above-mentioned problem.
Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=45181
--- drivers/gpu/drm/i915/i915_sysfs.c | 12 ++++++++++++ 1 file changed, 12 insertions(+)
drivers/gpu/drm/i915/i915_sysfs.c +12 -0
@@ -31,6 +31,7 @@#include <linux/sysfs.h> #include "i915_drv.h" +#ifdef CONFIG_PM static u32 calc_residency (struct drm_device *dev,const u32 reg) {struct drm_i915_private *dev_priv = dev->dev_private;
@@ -109,3 +110,14 @@ void i915_teardown_sysfs(struct drm_devi {sysfs_unmerge_group (&dev->primary->kdev.kobj, &rc6_attr_group); } +#else +void i915_setup_sysfs (struct drm_device *dev) +{ +return ; +} + +void i915_teardown_sysfs (struct drm_device *dev) +{ +return ; +} +#endif /* CONFIG_PM */
Greg Kroah-Hartman
maintainerPATCH 16/46 drm/radeon: add some new SI pci ids
In reply to Greg Kroah-HartmanFrom: Greg KH <[email protected]>
3.5-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alex Deucher <[email protected]>
commit 2f292004dd1fb005788dc0a9cdd5559812ed866e upstream.
--- include/drm/drm_pciids.h | 3 +++ 1 file changed, 3 insertions(+)
include/drm/drm_pciids.h +3 -0
@@ -213,9 +213,12 @@ {0x1002, 0x6800, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_PITCAIRN|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ {0x1002, 0x6801, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_PITCAIRN|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ {0x1002, 0x6802, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_PITCAIRN|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \ + {0x1002, 0x6806, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_PITCAIRN|RADEON_NEW_MEMMAP}, \ {0x1002, 0x6808, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_PITCAIRN|RADEON_NEW_MEMMAP}, \ {0x1002, 0x6809, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_PITCAIRN|RADEON_NEW_MEMMAP}, \ {0x1002, 0x6810, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_PITCAIRN|RADEON_NEW_MEMMAP}, \ + {0x1002, 0x6816, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_PITCAIRN|RADEON_NEW_MEMMAP}, \ + {0x1002, 0x6817, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_PITCAIRN|RADEON_NEW_MEMMAP}, \ {0x1002, 0x6818, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_PITCAIRN|RADEON_NEW_MEMMAP}, \ {0x1002, 0x6819, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_PITCAIRN|RADEON_NEW_MEMMAP}, \ {0x1002, 0x6820, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_VERDE|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP}, \
Greg Kroah-Hartman
maintainerPATCH 17/46 drm/radeon: fix bank tiling parameters on cayman
In reply to Greg Kroah-HartmanFrom: Greg KH <[email protected]>
3.5-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alex Deucher <[email protected]>
commit 5b23c9045a8b61352986270b2d109edf5085e113 upstream.
Handle the 16 bank case.
--- drivers/gpu/drm/radeon/ni.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-)
drivers/gpu/drm/radeon/ni.c +11 -3
@@ -574,10 +574,18 @@ static void cayman_gpu_init(struct radeoif (rdev->flags &RADEON_IS_IGP ) rdev->config.cayman.tile_config |=1 <<4 ;else { -if ((mc_arb_ramcfg &NOOFBANK_MASK ) >>NOOFBANK_SHIFT ) - rdev->config.cayman.tile_config |=1 <<4 ; -else +switch ((mc_arb_ramcfg &NOOFBANK_MASK ) >>NOOFBANK_SHIFT ) { +case 0 :/* four banks */ rdev->config.cayman.tile_config |=0 <<4 ; +break ; +case 1 :/* eight banks */ + rdev->config.cayman.tile_config |=1 <<4 ; +break ; +case 2 :/* sixteen banks */ +default : + rdev->config.cayman.tile_config |=2 <<4 ; +break ; + } } rdev->config.cayman.tile_config |= ((gb_addr_config &PIPE_INTERLEAVE_SIZE_MASK ) >>PIPE_INTERLEAVE_SIZE_SHIFT ) <<8 ;
Greg Kroah-Hartman
maintainerPATCH 18/46 drm/radeon: fix bank tiling parameters on SI
In reply to Greg Kroah-HartmanFrom: Greg KH <[email protected]>
3.5-stable review patch. If anyone has any objections, please let me know.
------------------
From: Christian König <[email protected]>
commit dca571a6a4edda1f61ba7ecb47431a22245490a3 upstream.
The sixteen bank case wasn't handled here, leading to GPU crashes because of userspace miscalculation.
--- drivers/gpu/drm/radeon/si.c | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-)
drivers/gpu/drm/radeon/si.c +12 -4
@@ -1639,11 +1639,19 @@ static void si_gpu_init(struct radeon_de/* XXX what about 12? */ rdev->config.si.tile_config |= (3 <<0 );break ; - } -if ((mc_arb_ramcfg &NOOFBANK_MASK ) >>NOOFBANK_SHIFT ) - rdev->config.si.tile_config |=1 <<4 ; -else + } +switch ((mc_arb_ramcfg &NOOFBANK_MASK ) >>NOOFBANK_SHIFT ) { +case 0 :/* four banks */ rdev->config.si.tile_config |=0 <<4 ; +break ; +case 1 :/* eight banks */ + rdev->config.si.tile_config |=1 <<4 ; +break ; +case 2 :/* sixteen banks */ +default : + rdev->config.si.tile_config |=2 <<4 ; +break ; + } rdev->config.si.tile_config |= ((gb_addr_config &PIPE_INTERLEAVE_SIZE_MASK ) >>PIPE_INTERLEAVE_SIZE_SHIFT ) <<8 ; rdev->config.si.tile_config |=
Greg Kroah-Hartman
maintainerPATCH 19/46 drm/radeon: fix bank tiling parameters on evergreen
In reply to Greg Kroah-HartmanFrom: Greg KH <[email protected]>
3.5-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alex Deucher <[email protected]>
commit c8d15edc17d836686d1f071e564800e1a2724fa6 upstream.
Handle the 16 bank case.
--- drivers/gpu/drm/radeon/evergreen.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-)
drivers/gpu/drm/radeon/evergreen.c +11 -3
@@ -1801,10 +1801,18 @@ static void evergreen_gpu_init(struct raif (rdev->flags &RADEON_IS_IGP ) rdev->config.evergreen.tile_config |=1 <<4 ;else { -if ((mc_arb_ramcfg &NOOFBANK_MASK ) >>NOOFBANK_SHIFT ) - rdev->config.evergreen.tile_config |=1 <<4 ; -else +switch ((mc_arb_ramcfg &NOOFBANK_MASK ) >>NOOFBANK_SHIFT ) { +case 0 :/* four banks */ rdev->config.evergreen.tile_config |=0 <<4 ; +break ; +case 1 :/* eight banks */ + rdev->config.evergreen.tile_config |=1 <<4 ; +break ; +case 2 :/* sixteen banks */ +default : + rdev->config.evergreen.tile_config |=2 <<4 ; +break ; + } } rdev->config.evergreen.tile_config |=0 <<8 ; rdev->config.evergreen.tile_config |=
Greg Kroah-Hartman
maintainerPATCH 20/46 drm/radeon/kms: allow "invalid" DB formats as a means to disable DB
In reply to Greg Kroah-HartmanFrom: Greg KH <[email protected]>
3.5-stable review patch. If anyone has any objections, please let me know.
------------------
From: Marek Olšák <[email protected]>
commit 0f457e488c79922dfd646f94ed058764f7ba758c upstream.
--- drivers/gpu/drm/radeon/evergreen_cs.c | 6 ++++-- drivers/gpu/drm/radeon/evergreend.h | 2 ++ drivers/gpu/drm/radeon/r600_cs.c | 6 ++++-- drivers/gpu/drm/radeon/radeon_drv.c | 3 ++- 4 files changed, 12 insertions(+), 5 deletions(-)
drivers/gpu/drm/radeon/evergreen_cs.c +4 -2
@@ -961,13 +961,15 @@ static int evergreen_cs_track_check(struif (track->db_dirty) {/* Check stencil buffer */ -if (G_028800_STENCIL_ENABLE (track->db_depth_control)) { +if (G_028044_FORMAT (track->db_s_info) !=V_028044_STENCIL_INVALID && +G_028800_STENCIL_ENABLE (track->db_depth_control)) { r =evergreen_cs_track_validate_stencil (p);if (r)return r; }/* Check depth buffer */ -if (G_028800_Z_ENABLE (track->db_depth_control)) { +if (G_028040_FORMAT (track->db_z_info) !=V_028040_Z_INVALID && +G_028800_Z_ENABLE (track->db_depth_control)) { r =evergreen_cs_track_validate_depth (p);if (r)return r;
drivers/gpu/drm/radeon/evergreend.h +2 -0
@@ -1273,6 +1273,8 @@#define S_028044_FORMAT (x) (((x) & 0x1) << 0)#define G_028044_FORMAT (x) (((x) >> 0) & 0x1)#define C_028044_FORMAT 0xFFFFFFFE +#define V_028044_STENCIL_INVALID 0 +#define V_028044_STENCIL_8 1#define G_028044_TILE_SPLIT (x) (((x) >> 8) & 0x7)#define DB_Z_READ_BASE 0x28048#define DB_STENCIL_READ_BASE 0x2804c
drivers/gpu/drm/radeon/r600_cs.c +4 -2
@@ -764,8 +764,10 @@ static int r600_cs_track_check(struct ra }/* Check depth buffer */ -if (track->db_dirty && (G_028800_STENCIL_ENABLE (track->db_depth_control) || -G_028800_Z_ENABLE (track->db_depth_control))) { +if (track->db_dirty && +G_028010_FORMAT (track->db_depth_info) !=V_028010_DEPTH_INVALID && + (G_028800_STENCIL_ENABLE (track->db_depth_control) || +G_028800_Z_ENABLE (track->db_depth_control))) { r =r600_cs_track_validate_db (p);if (r)return r;
drivers/gpu/drm/radeon/radeon_drv.c +2 -1
@@ -59,9 +59,10 @@* 2.15.0 - add max_pipes query * 2.16.0 - fix evergreen 2D tiled surface calculation * 2.17.0 - add STRMOUT_BASE_UPDATE for r7xx +* 2.18.0 - r600-eg: allow "invalid" DB formats */ #define KMS_DRIVER_MAJOR 2 -#define KMS_DRIVER_MINOR 17 +#define KMS_DRIVER_MINOR 18#define KMS_DRIVER_PATCHLEVEL 0int radeon_driver_load_kms (struct drm_device *dev,unsigned long flags);int radeon_driver_unload_kms (struct drm_device *dev);
Greg Kroah-Hartman
maintainerPATCH 21/46 Yama: access task_struct->comm directly
In reply to Greg Kroah-HartmanFrom: Greg KH <[email protected]>
3.5-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kees Cook <[email protected]>
commit 7612bfeecc197bbb6629842b5c6ff1967f0a9b70 upstream.
The core ptrace access checking routine holds a task lock, and when reporting a failure, Yama takes a separate task lock. To avoid a potential deadlock with two ptracers taking the opposite locks, do not use get_task_comm() and just use ->comm directly since accuracy is not important for the report.
--- security/yama/yama_lsm.c | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-)
security/yama/yama_lsm.c +2 -8
@@ -279,12 +279,9 @@ static int yama_ptrace_access_check(stru }if (rc) { -char name[sizeof (current->comm)];printk_ratelimited (KERN_NOTICE "ptrace of pid %d was attempted by: %s (pid %d)\n" , - child->pid, -get_task_comm (name, current), - current->pid); + child->pid, current->comm, current->pid); }return rc;
@@ -319,12 +316,9 @@ static int yama_ptrace_traceme(struct ta }if (rc) { -char name[sizeof (current->comm)];printk_ratelimited (KERN_NOTICE "ptraceme of pid %d was attempted by: %s (pid %d)\n" , - current->pid, -get_task_comm (name, parent), - parent->pid); + current->pid, parent->comm, parent->pid); }return rc;
Greg Kroah-Hartman
maintainerPATCH 22/46 ext4: make sure the journal sb is written in ext4_clear_journal_err()
In reply to Greg Kroah-HartmanFrom: Greg KH <[email protected]>
3.5-stable review patch. If anyone has any objections, please let me know.
------------------
From: Theodore Ts'o <[email protected]>
commit d796c52ef0b71a988364f6109aeb63d79c5b116b upstream.
After we transfer set the EXT4_ERROR_FS bit in the file system superblock, it's not enough to call jbd2_journal_clear_err() to clear the error indication from journal superblock --- we need to call jbd2_journal_update_sb_errno() as well. Otherwise, when the root file system is mounted read-only, the journal is replayed, and the error indicator is transferred to the superblock --- but the s_errno field in the jbd2 superblock is left set (since although we cleared it in memory, we never flushed it out to disk).
This can end up confusing e2fsck. We should make e2fsck more robust in this case, but the kernel shouldn't be leaving things in this confused state, either.
--- fs/ext4/super.c | 1 + fs/jbd2/journal.c | 3 ++- include/linux/jbd2.h | 1 + 3 files changed, 4 insertions(+), 1 deletion(-)
fs/ext4/super.c +1 -0
@@ -4406,6 +4406,7 @@ static void ext4_clear_journal_err(strucext4_commit_super (sb,1 );jbd2_journal_clear_err (journal); +jbd2_journal_update_sb_errno (journal); } }
fs/jbd2/journal.c +2 -1
@@ -1377,7 +1377,7 @@ static void jbd2_mark_journal_empty(jour* Update a journal's errno. Write updated superblock to disk waiting for IO * to complete. */ -static void jbd2_journal_update_sb_errno (journal_t *journal) +void jbd2_journal_update_sb_errno (journal_t *journal) {journal_superblock_t *sb = journal->j_superblock;
@@ -1390,6 +1390,7 @@ static void jbd2_journal_update_sb_errnojbd2_write_superblock (journal,WRITE_SYNC ); } +EXPORT_SYMBOL (jbd2_journal_update_sb_errno);/* * Read the superblock for a given journal, performing initial
include/linux/jbd2.h +1 -0
@@ -1125,6 +1125,7 @@ extern int jbd2_journal_destroy (jextern int jbd2_journal_recover (journal_t *journal);extern int jbd2_journal_wipe (journal_t *,int );extern int jbd2_journal_skip_recovery (journal_t *); +extern void jbd2_journal_update_sb_errno (journal_t *);extern void jbd2_journal_update_sb_log_tail (journal_t *,tid_t ,unsigned long ,int );extern void __jbd2_journal_abort_hard (journal_t *);
Greg Kroah-Hartman
maintainerPATCH 23/46 ext4: avoid kmemcheck complaint from reading uninitialized memory
In reply to Greg Kroah-HartmanFrom: Greg KH <[email protected]>
3.5-stable review patch. If anyone has any objections, please let me know.
------------------
From: Theodore Ts'o <[email protected]>
commit 7e731bc9a12339f344cddf82166b82633d99dd86 upstream.
Commit 03179fe923 introduced a kmemcheck complaint in ext4_da_get_block_prep() because we save and restore ei->i_da_metadata_calc_last_lblock even though it is left uninitialized in the case where i_da_metadata_calc_len is zero.
This doesn't hurt anything, but silencing the kmemcheck complaint makes it easier for people to find real bugs.
Addresses https://bugzilla.kernel.org/show_bug.cgi?id=45631
(which is marked as a regression).
--- fs/ext4/super.c | 1 + 1 file changed, 1 insertion(+)
fs/ext4/super.c +1 -0
@@ -976,6 +976,7 @@ static struct inode *ext4_alloc_inode(st ei->i_reserved_meta_blocks =0 ; ei->i_allocated_meta_blocks =0 ; ei->i_da_metadata_calc_len =0 ; + ei->i_da_metadata_calc_last_lblock =0 ;spin_lock_init (&(ei->i_block_reservation_lock));#ifdef CONFIG_QUOTA ei->i_reserved_quota =0 ;
Greg Kroah-Hartman
maintainerPATCH 24/46 ext4: dont call ext4_error while block group is locked
In reply to Greg Kroah-HartmanFrom: Greg KH <[email protected]>
3.5-stable review patch. If anyone has any objections, please let me know.
------------------
From: Theodore Ts'o <[email protected]>
commit 7a4c5de27efa4c2ecca87af0a3deea63446367e2 upstream.
While in ext4_validate_block_bitmap(), if an block allocation bitmap is found to be invalid, we call ext4_error() while the block group is still locked. This causes ext4_commit_super() to call a function which might sleep while in an atomic context.
There's no need to keep the block group locked at this point, so hoist the ext4_error() call up to ext4_validate_block_bitmap() and release the block group spinlock before calling ext4_error().
The reported stack trace can be found at:
http://article.gmane.org/gmane.comp.file-systems.ext4/33731
--- fs/ext4/balloc.c | 62 ++++++++++++++++++++++++++++++++----------------------- fs/ext4/bitmap.c | 1 2 files changed, 37 insertions(+), 26 deletions(-)
fs/ext4/balloc.c +37 -25
@@ -280,14 +280,18 @@ struct ext4_group_desc * ext4_get_group_return desc; } -static int ext4_valid_block_bitmap (struct super_block *sb, -struct ext4_group_desc *desc, -unsigned int block_group, -struct buffer_head *bh) +/* +* Return the block number which was discovered to be invalid, or 0 if +* the block bitmap is valid. +*/ +static ext4_fsblk_t ext4_valid_block_bitmap (struct super_block *sb, +struct ext4_group_desc *desc, +unsigned int block_group, +struct buffer_head *bh) {ext4_grpblk_t offset;ext4_grpblk_t next_zero_bit; -ext4_fsblk_t bitmap_blk; +ext4_fsblk_t blk;ext4_fsblk_t group_first_block;if (EXT4_HAS_INCOMPAT_FEATURE (sb,EXT4_FEATURE_INCOMPAT_FLEX_BG )) {
@@ -297,37 +301,33 @@ static int ext4_valid_block_bitmap(struc* or it has to also read the block group where the bitmaps * are located to verify they are set. */ -return 1 ; +return 0 ; } group_first_block =ext4_group_first_block_no (sb, block_group);/* check whether block bitmap block number is set */ - bitmap_blk =ext4_block_bitmap (sb, desc); - offset = bitmap_blk - group_first_block; + blk =ext4_block_bitmap (sb, desc); + offset = blk - group_first_block;if (!ext4_test_bit (offset, bh->b_data))/* bad block bitmap */ - goto err_out; +return blk;/* check whether the inode bitmap block number is set */ - bitmap_blk =ext4_inode_bitmap (sb, desc); - offset = bitmap_blk - group_first_block; + blk =ext4_inode_bitmap (sb, desc); + offset = blk - group_first_block;if (!ext4_test_bit (offset, bh->b_data))/* bad block bitmap */ - goto err_out; +return blk;/* check whether the inode table block number is set */ - bitmap_blk =ext4_inode_table (sb, desc); - offset = bitmap_blk - group_first_block; + blk =ext4_inode_table (sb, desc); + offset = blk - group_first_block; next_zero_bit =ext4_find_next_zero_bit (bh->b_data, offset +EXT4_SB (sb)->s_itb_per_group, offset); -if (next_zero_bit >= offset +EXT4_SB (sb)->s_itb_per_group) -/* good bitmap for inode tables */ -return 1 ; - -err_out: -ext4_error (sb,"Invalid block bitmap - block_group = %d, block = %llu" , - block_group, bitmap_blk); +if (next_zero_bit < offset +EXT4_SB (sb)->s_itb_per_group) +/* bad bitmap for inode tables */ +return blk;return 0 ; }
@@ -336,14 +336,26 @@ void ext4_validate_block_bitmap(struct sunsigned int block_group, struct buffer_head *bh) { + ext4_fsblk_t blk; +if (buffer_verified (bh))return ;ext4_lock_group (sb, block_group); -if (ext4_valid_block_bitmap (sb, desc, block_group, bh) && -ext4_block_bitmap_csum_verify (sb, block_group, desc, bh, -EXT4_BLOCKS_PER_GROUP (sb) /8 )) -set_buffer_verified (bh); + blk =ext4_valid_block_bitmap (sb, desc, block_group, bh); +if (unlikely (blk !=0 )) { +ext4_unlock_group (sb, block_group); +ext4_error (sb,"bg %u: block %llu: invalid block bitmap" , + block_group, blk); +return ; + } +if (unlikely (!ext4_block_bitmap_csum_verify (sb, block_group, + desc, bh,EXT4_BLOCKS_PER_GROUP (sb) /8 ))) { +ext4_unlock_group (sb, block_group); +ext4_error (sb,"bg %u: bad block bitmap checksum" , block_group); +return ; + } +set_buffer_verified (bh);ext4_unlock_group (sb, block_group); }
fs/ext4/bitmap.c +0 -1
@@ -86,7 +86,6 @@ int ext4_block_bitmap_csum_verify(structif (provided == calculated)return 1 ; -ext4_error (sb,"Bad block bitmap checksum: block_group = %u" , group);return 0 ; }
Greg Kroah-Hartman
maintainerPATCH 25/46 ext4: fix long mount times on very big file systems
In reply to Greg Kroah-HartmanFrom: Greg KH <[email protected]>
3.5-stable review patch. If anyone has any objections, please let me know.
------------------
From: Theodore Ts'o <[email protected]>
commit 0548bbb85337e532ca2ed697c3e9b227ff2ed4b4 upstream.
Commit 8aeb00ff85a: "ext4: fix overhead calculation used by ext4_statfs()" introduced a O(n**2) calculation which makes very large file systems take forever to mount. Fix this with an optimization for non-bigalloc file systems. (For bigalloc file systems the overhead needs to be set in the the superblock.)
--- fs/ext4/super.c | 4 ++++ 1 file changed, 4 insertions(+)
fs/ext4/super.c +4 -0
@@ -3110,6 +3110,10 @@ static int count_overhead(struct super_bext4_group_t i, ngroups =ext4_get_groups_count (sb);int s, j, count =0 ; +if (!EXT4_HAS_RO_COMPAT_FEATURE (sb,EXT4_FEATURE_RO_COMPAT_BIGALLOC )) +return (ext4_bg_has_super (sb, grp) +ext4_bg_num_gdb (sb, grp) + + sbi->s_itb_per_group +2 ); + first_block =le32_to_cpu (sbi->s_es->s_first_data_block) + (grp *EXT4_BLOCKS_PER_GROUP (sb)); last_block = first_block +EXT4_BLOCKS_PER_GROUP (sb) -1 ;
Greg Kroah-Hartman
maintainerPATCH 26/46 ext4: fix kernel BUG on large-scale rm -rf commands
In reply to Greg Kroah-HartmanFrom: Greg KH <[email protected]>
3.5-stable review patch. If anyone has any objections, please let me know.
------------------
From: Theodore Ts'o <[email protected]>
commit 89a4e48f8479f8145eca9698f39fe188c982212f upstream.
Commit 968dee7722: "ext4: fix hole punch failure when depth is greater than 0" introduced a regression in v3.5.1/v3.6-rc1 which caused kernel crashes when users ran run "rm -rf" on large directory hierarchy on ext4 filesystems on RAID devices:
BUG: unable to handle kernel NULL pointer dereference at 0000000000000028
Process rm (pid: 18229, threadinfo ffff8801276bc000, task ffff880123631710)
Call Trace:
[<ffffffff81236483>] ? __ext4_handle_dirty_metadata+0x83/0x110
[<ffffffff812353d3>] ext4_ext_truncate+0x193/0x1d0
[<ffffffff8120a8cf>] ? ext4_mark_inode_dirty+0x7f/0x1f0
[<ffffffff81207e05>] ext4_truncate+0xf5/0x100
[<ffffffff8120cd51>] ext4_evict_inode+0x461/0x490
[<ffffffff811a1312>] evict+0xa2/0x1a0
[<ffffffff811a1513>] iput+0x103/0x1f0
[<ffffffff81196d84>] do_unlinkat+0x154/0x1c0
[<ffffffff8118cc3a>] ? sys_newfstatat+0x2a/0x40
[<ffffffff81197b0b>] sys_unlinkat+0x1b/0x50
[<ffffffff816135e9>] system_call_fastpath+0x16/0x1b
Code: 8b 4d 20 0f b7 41 02 48 8d 04 40 48 8d 04 81 49 89 45 18 0f b7 49 02 48 83 c1 01 49 89 4d 00 e9 ae f8 ff ff 0f 1f 00 49 8b 45 28 <48> 8b 40 28 49 89 45 20 e9 85 f8 ff ff 0f 1f 80 00 00 00
RIP [<ffffffff81233164>] ext4_ext_remove_space+0xa34/0xdf0This could be reproduced as follows:
The problem in commit 968dee7722 was that caused the variable 'i' to be left uninitialized if the truncate required more space than was available in the journal. This resulted in the function ext4_ext_truncate_extend_restart() returning -EAGAIN, which caused ext4_ext_remove_space() to restart the truncate operation after starting a new jbd2 handle.
--- fs/ext4/extents.c | 1 + 1 file changed, 1 insertion(+)
fs/ext4/extents.c +1 -0
@@ -2663,6 +2663,7 @@ cont: } path[0 ].p_depth = depth; path[0 ].p_hdr =ext_inode_hdr (inode); + i =0 ;if (ext4_ext_check (inode, path[0 ].p_hdr, depth)) { err = -EIO ;
Greg Kroah-Hartman
maintainerPATCH 27/46 xhci: Add Etron XHCI_TRUST_TX_LENGTH quirk.
In reply to Greg Kroah-HartmanFrom: Greg KH <[email protected]>
3.5-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sarah Sharp <[email protected]>
commit 5cb7df2b2d3afee7638b3ef23a5bcb89c6f07bd9 upstream.
Gary reports that with recent kernels, he notices more xHCI driver warnings:
xhci_hcd 0000:03:00.0: WARN Successful completion on short TX: needs XHCI_TRUST_TX_LENGTH quirk?
We think his Etron xHCI host controller may have the same buggy behavior as the Fresco Logic xHCI host. When a short transfer is received, the host will mark the transfer as successfully completed when it should be marking it with a short completion.
Fix this by turning on the XHCI_TRUST_TX_LENGTH quirk when the Etron host is discovered. Note that Gary has revision 1, but if Etron fixes this bug in future revisions, the quirk will have no effect.
This patch should be backported to kernels as old as 2.6.36, that contain a backported version of commit 1530bbc6272d9da1e39ef8e06190d42c13a02733 "xhci: Add new short TX quirk for Fresco Logic host."
--- drivers/usb/host/xhci-pci.c | 1 + 1 file changed, 1 insertion(+)
drivers/usb/host/xhci-pci.c +1 -0
@@ -99,6 +99,7 @@ static void xhci_pci_quirks(struct devic pdev->device == PCI_DEVICE_ID_ASROCK_P67) { xhci->quirks |=XHCI_RESET_ON_RESUME ;xhci_dbg (xhci,"QUIRK: Resetting on resume\n" ); + xhci->quirks |=XHCI_TRUST_TX_LENGTH ; }if (pdev->vendor ==PCI_VENDOR_ID_VIA ) xhci->quirks |=XHCI_RESET_ON_RESUME ;
Greg Kroah-Hartman
maintainerPATCH 28/46 xhci: Increase reset timeout for Renesas 720201 host.
In reply to Greg Kroah-HartmanFrom: Greg KH <[email protected]>
3.5-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sarah Sharp <[email protected]>
commit 22ceac191211cf6688b1bf6ecd93c8b6bf80ed9b upstream.
The NEC/Renesas 720201 xHCI host controller does not complete its reset within 250 milliseconds. In fact, it takes about 9 seconds to reset the host controller, and 1 second for the host to be ready for doorbell rings. Extend the reset and CNR polling timeout to 10 seconds each.
This patch should be backported to kernels as old as 2.6.31, that contain the commit 66d4eadd8d067269ea8fead1a50fe87c2979a80d "USB: xhci:
BIOS handoff and HW initialization."
--- drivers/usb/host/xhci.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
drivers/usb/host/xhci.c +3 -2
@@ -166,7 +166,7 @@ int xhci_reset(struct xhci_hcd *xhci)xhci_writel (xhci, command, &xhci->op_regs->command); ret =handshake (xhci, &xhci->op_regs->command, -CMD_RESET ,0 ,250 *1000 ); +CMD_RESET ,0 ,10 *1000 *1000 );if (ret)return ret;
@@ -175,7 +175,8 @@ int xhci_reset(struct xhci_hcd *xhci)* xHCI cannot write to any doorbells or operational registers other * than status until the "Controller Not Ready" flag is cleared. */ - ret =handshake (xhci, &xhci->op_regs->status,STS_CNR ,0 ,250 *1000 ); + ret =handshake (xhci, &xhci->op_regs->status, +STS_CNR ,0 ,10 *1000 *1000 );for (i =0 ; i <2 ; ++i) { xhci->bus_state[i].port_c_suspend =0 ;
Greg Kroah-Hartman
maintainerPATCH 29/46 xhci: Switch PPT ports to EHCI on shutdown.
In reply to Greg Kroah-HartmanFrom: Greg KH <[email protected]>
3.5-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sarah Sharp <[email protected]>
commit e95829f474f0db3a4d940cae1423783edd966027 upstream.
The Intel desktop boards DH77EB and DH77DF have a hardware issue that can be worked around by BIOS. If the USB ports are switched to xHCI on shutdown, the xHCI host will send a spurious interrupt, which will wake the system. Some BIOS will work around this, but not all.
The bug can be avoided if the USB ports are switched back to EHCI on shutdown. The Intel Windows driver switches the ports back to EHCI, so change the Linux xHCI driver to do the same.
Unfortunately, we can't tell the two effected boards apart from other working motherboards, because the vendors will change the DMI strings for the DH77EB and DH77DF boards to their own custom names. One example is Compulab's mini-desktop, the Intense-PC. Instead, key off the Panther Point xHCI host PCI vendor and device ID, and switch the ports over for all PPT xHCI hosts.
The only impact this will have on non-effected boards is to add a couple hundred milliseconds delay on boot when the BIOS has to switch the ports over from EHCI to xHCI.
This patch should be backported to kernels as old as 3.0, that contain the commit 69e848c2090aebba5698a1620604c7dccb448684 "Intel xhci: Support EHCI/xHCI port switching."
--- drivers/usb/host/pci-quirks.c | 7 +++++++ drivers/usb/host/pci-quirks.h | 1 + drivers/usb/host/xhci-pci.c | 9 +++++++++ drivers/usb/host/xhci.c | 3 +++ drivers/usb/host/xhci.h | 1 + 5 files changed, 21 insertions(+)
drivers/usb/host/pci-quirks.c +7 -0
@@ -800,6 +800,13 @@ void usb_enable_xhci_ports(struct pci_de }EXPORT_SYMBOL_GPL (usb_enable_xhci_ports); +void usb_disable_xhci_ports (struct pci_dev *xhci_pdev) +{ +pci_write_config_dword (xhci_pdev,USB_INTEL_USB3_PSSEN ,0x0 ); +pci_write_config_dword (xhci_pdev,USB_INTEL_XUSB2PR ,0x0 ); +} +EXPORT_SYMBOL_GPL (usb_disable_xhci_ports); +/** * PCI Quirks for xHCI. *
drivers/usb/host/pci-quirks.h +1 -0
@@ -10,6 +10,7 @@ void usb_amd_quirk_pll_disable(void);void usb_amd_quirk_pll_enable (void );bool usb_is_intel_switchable_xhci (struct pci_dev *pdev);void usb_enable_xhci_ports (struct pci_dev *xhci_pdev); +void usb_disable_xhci_ports (struct pci_dev *xhci_pdev);#else static inline void usb_amd_quirk_pll_disable (void ) {}static inline void usb_amd_quirk_pll_enable (void ) {}
drivers/usb/host/xhci-pci.c +9 -0
@@ -94,6 +94,15 @@ static void xhci_pci_quirks(struct devic xhci->quirks |=XHCI_EP_LIMIT_QUIRK ; xhci->limit_active_eps =64 ; xhci->quirks |=XHCI_SW_BW_CHECKING ; +/* +* PPT desktop boards DH77EB and DH77DF will power back on after +* a few seconds of being shutdown. The fix for this is to +* switch the ports from xHCI to EHCI on shutdown. We can't use +* DMI information to find those particular boards (since each +* vendor will change the board name), so we have to key off all +* PPT chipsets. +*/ + xhci->quirks |=XHCI_SPURIOUS_REBOOT ; }if (pdev->vendor ==PCI_VENDOR_ID_ETRON && pdev->device ==PCI_DEVICE_ID_ASROCK_P67 ) {
drivers/usb/host/xhci.c +3 -0
@@ -659,6 +659,9 @@ void xhci_shutdown(struct usb_hcd *hcd) {struct xhci_hcd *xhci =hcd_to_xhci (hcd); +if (xhci->quirks &&XHCI_SPURIOUS_REBOOT ) +usb_disable_xhci_ports (to_pci_dev (hcd->self.controller)); +spin_lock_irq (&xhci->lock);xhci_halt (xhci);spin_unlock_irq (&xhci->lock);
drivers/usb/host/xhci.h +1 -0
@@ -1494,6 +1494,7 @@ struct xhci_hcd {#define XHCI_TRUST_TX_LENGTH (1 << 10)#define XHCI_LPM_SUPPORT (1 << 11)#define XHCI_INTEL_HOST (1 << 12) +#define XHCI_SPURIOUS_REBOOT (1 << 13)unsigned int num_active_eps;unsigned int limit_active_eps;/* There are two roothubs to keep track of bus suspend info for */
Greg Kroah-Hartman
maintainerPATCH 30/46 xhci: Fix bug after deq ptr set to link TRB.
In reply to Greg Kroah-HartmanFrom: Greg KH <[email protected]>
3.5-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sarah Sharp <[email protected]>
commit 50d0206fcaea3e736f912fd5b00ec6233fb4ce44 upstream.
This patch fixes a particularly nasty bug that was revealed by the ring expansion patches. The bug has been present since the very beginning of the xHCI driver history, and could have caused general protection faults from bad memory accesses.
The first thing to note is that a Set TR Dequeue Pointer command can move the dequeue pointer to a link TRB, if the canceled or stalled transfer TD ended just before a link TRB. The function to increment the dequeue pointer, inc_deq, was written before cancellation and stall support was added. It assumed that the dequeue pointer could never point to a link TRB. It would unconditionally increment the dequeue pointer at the start of the function, check if the pointer was now on a link TRB, and move it to the top of the next segment if so.
This means that if a Set TR Dequeue Point command moved the dequeue pointer to a link TRB, a subsequent call to inc_deq() would move the pointer off the segment and into la-la-land. It would then read from that memory to determine if it was a link TRB. Other functions would often call inc_deq() until the dequeue pointer matched some other pointer, which means this function would quite happily read all of system memory before wrapping around to the right pointer value.
Often, there would be another endpoint segment from a different ring allocated from the same DMA pool, which would be contiguous to the segment inc_deq just stepped off of. inc_deq would eventually find the link TRB in that segment, and blindly move the dequeue pointer back to the top of the correct ring segment.
The only reason the original code worked at all is because there was only one ring segment. With the ring expansion patches, the dequeue pointer would eventually wrap into place, but the dequeue segment would be out-of-sync. On the second TD after the dequeue pointer was moved to a link TRB, trb_in_td() would fail (because the dequeue pointer and dequeue segment were out-of-sync), and this message would appear:
ERROR Transfer event TRB DMA ptr not part of current TD
This fixes bugzilla entry 4333 (option-based modem unhappy on USB 3.0
port: "Transfer event TRB DMA ptr not part of current TD", "rejecting I/O to offline device"),
https://bugzilla.kernel.org/show_bug.cgi?id=43333
and possibly other general protection fault bugs as well.
This patch should be backported to kernels as old as 2.6.31. A separate patch will be created for kernels older than 3.4, since inc_deq was modified in 3.4 and this patch will not apply.
--- drivers/usb/host/xhci-ring.c | 36 ++++++++++++++++++++++-------------- 1 file changed, 22 insertions(+), 14 deletions(-)
drivers/usb/host/xhci-ring.c +22 -14
@@ -145,29 +145,37 @@ static void next_trb(struct xhci_hcd *xh*/ static void inc_deq (struct xhci_hcd *xhci,struct xhci_ring *ring) { -union xhci_trb *next;unsigned long long addr; ring->deq_updates++; -/* If this is not event ring, there is one more usable TRB */ +/* +* If this is not event ring, and the dequeue pointer +* is not on a link TRB, there is one more usable TRB +*/ if (ring->type !=TYPE_EVENT && !last_trb (xhci, ring, ring->deq_seg, ring->dequeue)) ring->num_trbs_free++; - next = ++(ring->dequeue); -/* Update the dequeue pointer further if that was a link TRB or we're at -* the end of an event ring segment (which doesn't have link TRBS) -*/ -while (last_trb (xhci, ring, ring->deq_seg, next)) { -if (ring->type ==TYPE_EVENT &&last_trb_on_last_seg (xhci, - ring, ring->deq_seg, next)) { - ring->cycle_state = (ring->cycle_state ?0 :1 ); +do { +/* +* Update the dequeue pointer further if that was a link TRB or +* we're at the end of an event ring segment (which doesn't have +* link TRBS) +*/ +if (last_trb (xhci, ring, ring->deq_seg, ring->dequeue)) { +if (ring->type ==TYPE_EVENT && +last_trb_on_last_seg (xhci, ring, + ring->deq_seg, ring->dequeue)) { + ring->cycle_state = (ring->cycle_state ?0 :1 ); + } + ring->deq_seg = ring->deq_seg->next; + ring->dequeue = ring->deq_seg->trbs; + }else { + ring->dequeue++; } - ring->deq_seg = ring->deq_seg->next; - ring->dequeue = ring->deq_seg->trbs; - next = ring->dequeue; - } + }while (last_trb (xhci, ring, ring->deq_seg, ring->dequeue)); + addr = (unsigned long long )xhci_trb_virt_to_dma (ring->deq_seg, ring->dequeue); }
Greg Kroah-Hartman
maintainerPATCH 31/46 drivers-core: make structured logging play nice with dynamic-debug
In reply to Greg Kroah-HartmanFrom: Greg KH <[email protected]>
3.5-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jim Cromie <[email protected]>
commit af7f2158fdee9d7f55b793b09f8170a3391f889a upstream.
commit c4e00daaa96d3a0786f1f4fe6456281c60ef9a16 changed __dev_printk in a way that broke dynamic-debug's ability to control the dynamic prefix of dev_dbg(dev,..), but not dev_dbg(NULL,..) or pr_debug(..), which is why it wasnt noticed sooner.
When dev==NULL, __dev_printk() just calls printk(), which just works. But otherwise, it assumed that level was always a string like "<L>" and just plucked out the 'L', ignoring the rest. However, dynamic_emit_prefix() adds "[tid] module:func:line:" to the string, those additions all got lost.
--- drivers/base/core.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-)
drivers/base/core.c +7 -2
@@ -1848,6 +1848,7 @@ int __dev_printk(const char *level, cons struct va_format *vaf) {char dict[128 ]; +const char *level_extra ="" ;size_t dictlen =0 ;const char *subsys;
@@ -1894,10 +1895,14 @@ int __dev_printk(const char *level, cons "DEVICE=+%s:%s", subsys, dev_name(dev)); } skip: +if (level[3 ]) + level_extra = &level[3 ];/* skip past "<L>" */ +return printk_emit (0 , level[1 ] -'0' , dictlen ? dict :NULL , dictlen, -"%s %s: %pV" , -dev_driver_string (dev),dev_name (dev), vaf); +"%s %s: %s%pV" , +dev_driver_string (dev),dev_name (dev), + level_extra, vaf); }EXPORT_SYMBOL (__dev_printk);
Greg Kroah-Hartman
maintainerPATCH 32/46 staging: comedi: Fix reversed test in comedi_device_attach()
In reply to Greg Kroah-HartmanFrom: Greg KH <[email protected]>
3.5-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ian Abbott <[email protected]>
commit 80eb7a506fdcea08f86c9dfc7c638303bf02a3c8 upstream.
Commit 3902a370281d2f2b130f141e8cf94eab40125769 (staging: comedi:
refactor comedi_device_attach() a bit) by yours truly introduced an inverted logic bug in comedi_device_attach() for the case where the driver expects the device to be configured by driver name rather than board name. The result of a strcmp() is being tested incorrectly. Fix it.
Thanks to Stephen N Chivers for discovering the bug and suggesting the fix.
--- drivers/staging/comedi/drivers.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/staging/comedi/drivers.c +1 -1
@@ -144,7 +144,7 @@ int comedi_device_attach(struct comedi_d dev->board_ptr =comedi_recognize (driv, it->board_name);if (dev->board_ptr)break ; - }else if (strcmp (driv->driver_name, it->board_name)) + }else if (strcmp (driv->driver_name, it->board_name) ==0 )break ;module_put (driv->module); }
Greg Kroah-Hartman
maintainerPATCH 33/46 USB: add USB_VENDOR_AND_INTERFACE_INFO() macro
In reply to Greg Kroah-HartmanFrom: Greg KH <[email protected]>
3.5-stable review patch. If anyone has any objections, please let me know.
------------------
From: Gustavo Padovan <[email protected]>
commit d81a5d1956731c453b85c141458d4ff5d6cc5366 upstream.
A lot of Broadcom Bluetooth devices provides vendor specific interface class and we are getting flooded by patches adding new device support. This change will help us enable support for any other Broadcom with vendor specific device that arrives in the future.
Only the product id changes for those devices, so this macro would be perfect for us:
{ USB_VENDOR_AND_INTERFACE_INFO(0x0a5c, 0xff, 0x01, 0x01) }
--- include/linux/usb.h | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+)
include/linux/usb.h +21 -0
@@ -828,6 +828,27 @@ static inline int usb_make_path(struct u .bInterfaceSubClass = (sc), \ .bInterfaceProtocol = (pr) +/** +* USB_VENDOR_AND_INTERFACE_INFO - describe a specific usb vendor with a class of usb interfaces +* @vend: the 16 bit USB Vendor ID +* @cl: bInterfaceClass value +* @sc: bInterfaceSubClass value +* @pr: bInterfaceProtocol value +* +* This macro is used to create a struct usb_device_id that matches a +* specific vendor with a specific class of interfaces. +* +* This is especially useful when explicitly matching devices that have +* vendor specific bDeviceClass values, but standards-compliant interfaces. + */ +#define USB_VENDOR_AND_INTERFACE_INFO (vend, cl, sc, pr) \ + .match_flags = USB_DEVICE_ID_MATCH_INT_INFO \ + | USB_DEVICE_ID_MATCH_VENDOR, \ + .idVendor = (vend), \ + .bInterfaceClass = (cl), \ + .bInterfaceSubClass = (sc), \ + .bInterfaceProtocol = (pr) +/* ----------------------------------------------------------------------- */ /* Stuff for dynamic usb ids */
Greg Kroah-Hartman
maintainerPATCH 34/46 USB: support the new interfaces of Huawei Data Card devices in option driver
In reply to Greg Kroah-HartmanFrom: Greg KH <[email protected]>
3.5-stable review patch. If anyone has any objections, please let me know.
------------------
From: fangxiaozhi <[email protected]>
commit ee6f827df9107139e8960326e49e1376352ced4d upstream.
In this patch, we add new declarations into option.c to support the new interfaces of Huawei Data Card devices. And at the same time, remove the redundant declarations from option.c.
--- drivers/usb/serial/option.c | 279 +++++++++++++++++--------------------------- 1 file changed, 111 insertions(+), 168 deletions(-)
drivers/usb/serial/option.c +111 -168
@@ -80,85 +80,9 @@ static void option_instat_callback(struc#define OPTION_PRODUCT_GTM380_MODEM 0x7201#define HUAWEI_VENDOR_ID 0x12D1 -#define HUAWEI_PRODUCT_E600 0x1001 -#define HUAWEI_PRODUCT_E220 0x1003 -#define HUAWEI_PRODUCT_E220BIS 0x1004 -#define HUAWEI_PRODUCT_E1401 0x1401 -#define HUAWEI_PRODUCT_E1402 0x1402 -#define HUAWEI_PRODUCT_E1403 0x1403 -#define HUAWEI_PRODUCT_E1404 0x1404 -#define HUAWEI_PRODUCT_E1405 0x1405 -#define HUAWEI_PRODUCT_E1406 0x1406 -#define HUAWEI_PRODUCT_E1407 0x1407 -#define HUAWEI_PRODUCT_E1408 0x1408 -#define HUAWEI_PRODUCT_E1409 0x1409 -#define HUAWEI_PRODUCT_E140A 0x140A -#define HUAWEI_PRODUCT_E140B 0x140B -#define HUAWEI_PRODUCT_E140C 0x140C -#define HUAWEI_PRODUCT_E140D 0x140D -#define HUAWEI_PRODUCT_E140E 0x140E -#define HUAWEI_PRODUCT_E140F 0x140F -#define HUAWEI_PRODUCT_E1410 0x1410 -#define HUAWEI_PRODUCT_E1411 0x1411 -#define HUAWEI_PRODUCT_E1412 0x1412 -#define HUAWEI_PRODUCT_E1413 0x1413 -#define HUAWEI_PRODUCT_E1414 0x1414 -#define HUAWEI_PRODUCT_E1415 0x1415 -#define HUAWEI_PRODUCT_E1416 0x1416 -#define HUAWEI_PRODUCT_E1417 0x1417 -#define HUAWEI_PRODUCT_E1418 0x1418 -#define HUAWEI_PRODUCT_E1419 0x1419 -#define HUAWEI_PRODUCT_E141A 0x141A -#define HUAWEI_PRODUCT_E141B 0x141B -#define HUAWEI_PRODUCT_E141C 0x141C -#define HUAWEI_PRODUCT_E141D 0x141D -#define HUAWEI_PRODUCT_E141E 0x141E -#define HUAWEI_PRODUCT_E141F 0x141F -#define HUAWEI_PRODUCT_E1420 0x1420 -#define HUAWEI_PRODUCT_E1421 0x1421 -#define HUAWEI_PRODUCT_E1422 0x1422 -#define HUAWEI_PRODUCT_E1423 0x1423 -#define HUAWEI_PRODUCT_E1424 0x1424 -#define HUAWEI_PRODUCT_E1425 0x1425 -#define HUAWEI_PRODUCT_E1426 0x1426 -#define HUAWEI_PRODUCT_E1427 0x1427 -#define HUAWEI_PRODUCT_E1428 0x1428 -#define HUAWEI_PRODUCT_E1429 0x1429 -#define HUAWEI_PRODUCT_E142A 0x142A -#define HUAWEI_PRODUCT_E142B 0x142B -#define HUAWEI_PRODUCT_E142C 0x142C -#define HUAWEI_PRODUCT_E142D 0x142D -#define HUAWEI_PRODUCT_E142E 0x142E -#define HUAWEI_PRODUCT_E142F 0x142F -#define HUAWEI_PRODUCT_E1430 0x1430 -#define HUAWEI_PRODUCT_E1431 0x1431 -#define HUAWEI_PRODUCT_E1432 0x1432 -#define HUAWEI_PRODUCT_E1433 0x1433 -#define HUAWEI_PRODUCT_E1434 0x1434 -#define HUAWEI_PRODUCT_E1435 0x1435 -#define HUAWEI_PRODUCT_E1436 0x1436 -#define HUAWEI_PRODUCT_E1437 0x1437 -#define HUAWEI_PRODUCT_E1438 0x1438 -#define HUAWEI_PRODUCT_E1439 0x1439 -#define HUAWEI_PRODUCT_E143A 0x143A -#define HUAWEI_PRODUCT_E143B 0x143B -#define HUAWEI_PRODUCT_E143C 0x143C -#define HUAWEI_PRODUCT_E143D 0x143D -#define HUAWEI_PRODUCT_E143E 0x143E -#define HUAWEI_PRODUCT_E143F 0x143F#define HUAWEI_PRODUCT_K4505 0x1464#define HUAWEI_PRODUCT_K3765 0x1465 -#define HUAWEI_PRODUCT_E14AC 0x14AC -#define HUAWEI_PRODUCT_K3806 0x14AE#define HUAWEI_PRODUCT_K4605 0x14C6 -#define HUAWEI_PRODUCT_K5005 0x14C8 -#define HUAWEI_PRODUCT_K3770 0x14C9 -#define HUAWEI_PRODUCT_K3771 0x14CA -#define HUAWEI_PRODUCT_K4510 0x14CB -#define HUAWEI_PRODUCT_K4511 0x14CC -#define HUAWEI_PRODUCT_ETS1220 0x1803 -#define HUAWEI_PRODUCT_E353 0x1506 -#define HUAWEI_PRODUCT_E173S 0x1C05#define QUANTA_VENDOR_ID 0x0408#define QUANTA_PRODUCT_Q101 0xEA02
@@ -615,104 +539,123 @@ static const struct usb_device_id option { USB_DEVICE(QUANTA_VENDOR_ID, QUANTA_PRODUCT_GLX) }, { USB_DEVICE(QUANTA_VENDOR_ID, QUANTA_PRODUCT_GKE) }, { USB_DEVICE(QUANTA_VENDOR_ID, QUANTA_PRODUCT_GLE) }, - { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E600, 0xff, 0xff, 0xff) }, - { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E220, 0xff, 0xff, 0xff) }, - { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E220BIS, 0xff, 0xff, 0xff) }, - { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1401, 0xff, 0xff, 0xff) }, - { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1402, 0xff, 0xff, 0xff) }, - { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1403, 0xff, 0xff, 0xff) }, - { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1404, 0xff, 0xff, 0xff) }, - { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1405, 0xff, 0xff, 0xff) }, - { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1406, 0xff, 0xff, 0xff) }, - { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1407, 0xff, 0xff, 0xff) }, - { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1408, 0xff, 0xff, 0xff) }, - { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1409, 0xff, 0xff, 0xff) }, - { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E140A, 0xff, 0xff, 0xff) }, - { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E140B, 0xff, 0xff, 0xff) }, - { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E140C, 0xff, 0xff, 0xff) }, - { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E140D, 0xff, 0xff, 0xff) }, - { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E140E, 0xff, 0xff, 0xff) }, - { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E140F, 0xff, 0xff, 0xff) }, - { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1410, 0xff, 0xff, 0xff) }, - { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1411, 0xff, 0xff, 0xff) }, - { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1412, 0xff, 0xff, 0xff) }, - { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1413, 0xff, 0xff, 0xff) }, - { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1414, 0xff, 0xff, 0xff) }, - { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1415, 0xff, 0xff, 0xff) }, - { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1416, 0xff, 0xff, 0xff) }, - { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1417, 0xff, 0xff, 0xff) }, - { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1418, 0xff, 0xff, 0xff) }, - { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1419, 0xff, 0xff, 0xff) }, - { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E141A, 0xff, 0xff, 0xff) }, - { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E141B, 0xff, 0xff, 0xff) }, - { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E141C, 0xff, 0xff, 0xff) }, - { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E141D, 0xff, 0xff, 0xff) }, - { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E141E, 0xff, 0xff, 0xff) }, - { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E141F, 0xff, 0xff, 0xff) }, - { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1420, 0xff, 0xff, 0xff) }, - { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1421, 0xff, 0xff, 0xff) }, - { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1422, 0xff, 0xff, 0xff) }, - { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1423, 0xff, 0xff, 0xff) }, - { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1424, 0xff, 0xff, 0xff) }, - { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1425, 0xff, 0xff, 0xff) }, - { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1426, 0xff, 0xff, 0xff) }, - { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1427, 0xff, 0xff, 0xff) }, - { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1428, 0xff, 0xff, 0xff) }, - { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1429, 0xff, 0xff, 0xff) }, - { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E142A, 0xff, 0xff, 0xff) }, - { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E142B, 0xff, 0xff, 0xff) }, - { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E142C, 0xff, 0xff, 0xff) }, - { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E142D, 0xff, 0xff, 0xff) }, - { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E142E, 0xff, 0xff, 0xff) }, - { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E142F, 0xff, 0xff, 0xff) }, - { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1430, 0xff, 0xff, 0xff) }, - { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1431, 0xff, 0xff, 0xff) }, - { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1432, 0xff, 0xff, 0xff) }, - { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1433, 0xff, 0xff, 0xff) }, - { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1434, 0xff, 0xff, 0xff) }, - { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1435, 0xff, 0xff, 0xff) }, - { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1436, 0xff, 0xff, 0xff) }, - { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1437, 0xff, 0xff, 0xff) }, - { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1438, 0xff, 0xff, 0xff) }, - { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1439, 0xff, 0xff, 0xff) }, - { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E143A, 0xff, 0xff, 0xff) }, - { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E143B, 0xff, 0xff, 0xff) }, - { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E143C, 0xff, 0xff, 0xff) }, - { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E143D, 0xff, 0xff, 0xff) }, - { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E143E, 0xff, 0xff, 0xff) }, - { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E143F, 0xff, 0xff, 0xff) }, - { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E173S, 0xff, 0xff, 0xff) }, { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_K4505, 0xff, 0xff, 0xff), .driver_info = (kernel_ulong_t) &huawei_cdc12_blacklist }, { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_K3765, 0xff, 0xff, 0xff), .driver_info = (kernel_ulong_t) &huawei_cdc12_blacklist }, - { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_ETS1220, 0xff, 0xff, 0xff) }, - { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E14AC, 0xff, 0xff, 0xff) }, - { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_K3806, 0xff, 0xff, 0xff) }, { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_K4605, 0xff, 0xff, 0xff), .driver_info = (kernel_ulong_t) &huawei_cdc12_blacklist }, - { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_K4605, 0xff, 0x01, 0x31) }, - { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_K4605, 0xff, 0x01, 0x32) }, - { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_K5005, 0xff, 0x01, 0x31) }, - { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_K5005, 0xff, 0x01, 0x32) }, - { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_K5005, 0xff, 0x01, 0x33) }, - { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_K3770, 0xff, 0x02, 0x31) }, - { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_K3770, 0xff, 0x02, 0x32) }, - { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_K3771, 0xff, 0x02, 0x31) }, - { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_K3771, 0xff, 0x02, 0x32) }, - { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_K4510, 0xff, 0x01, 0x31) }, - { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_K4510, 0xff, 0x01, 0x32) }, - { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_K4511, 0xff, 0x01, 0x31) }, - { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_K4511, 0xff, 0x01, 0x32) }, - { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E353, 0xff, 0x01, 0x01) }, - { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E353, 0xff, 0x01, 0x02) }, - { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E353, 0xff, 0x01, 0x03) }, - { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E353, 0xff, 0x01, 0x10) }, - { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E353, 0xff, 0x01, 0x12) }, - { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E353, 0xff, 0x01, 0x13) }, - { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E353, 0xff, 0x02, 0x01) }, /* E398 3G Modem */ - { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E353, 0xff, 0x02, 0x02) }, /* E398 3G PC UI Interface */ - { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E353, 0xff, 0x02, 0x03) }, /* E398 3G Application Interface */ + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0xff, 0xff) }, + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x01, 0x01) }, + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x01, 0x02) }, + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x01, 0x03) }, + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x01, 0x04) }, + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x01, 0x05) }, + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x01, 0x06) }, + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x01, 0x0A) }, + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x01, 0x0B) }, + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x01, 0x0D) }, + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x01, 0x0E) }, + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x01, 0x0F) }, + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x01, 0x10) }, + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x01, 0x12) }, + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x01, 0x13) }, + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x01, 0x14) }, + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x01, 0x15) }, + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x01, 0x17) }, + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x01, 0x18) }, + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x01, 0x19) }, + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x01, 0x1A) }, + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x01, 0x1B) }, + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x01, 0x1C) }, + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x01, 0x31) }, + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x01, 0x32) }, + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x01, 0x33) }, + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x01, 0x34) }, + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x01, 0x35) }, + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x01, 0x36) }, + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x01, 0x3A) }, + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x01, 0x3B) }, + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x01, 0x3D) }, + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x01, 0x3E) }, + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x01, 0x3F) }, + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x01, 0x48) }, + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x01, 0x49) }, + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x01, 0x4A) }, + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x01, 0x4B) }, + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x01, 0x4C) }, + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x01, 0x61) }, + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x01, 0x62) }, + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x01, 0x63) }, + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x01, 0x64) }, + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x01, 0x65) }, + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x01, 0x66) }, + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x01, 0x6A) }, + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x01, 0x6B) }, + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x01, 0x6D) }, + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x01, 0x6E) }, + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x01, 0x6F) }, + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x01, 0x78) }, + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x01, 0x79) }, + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x01, 0x7A) }, + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x01, 0x7B) }, + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x01, 0x7C) }, + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x02, 0x01) }, + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x02, 0x02) }, + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x02, 0x03) }, + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x02, 0x04) }, + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x02, 0x05) }, + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x02, 0x06) }, + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x02, 0x0A) }, + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x02, 0x0B) }, + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x02, 0x0D) }, + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x02, 0x0E) }, + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x02, 0x0F) }, + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x02, 0x10) }, + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x02, 0x12) }, + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x02, 0x13) }, + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x02, 0x14) }, + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x02, 0x15) }, + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x02, 0x17) }, + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x02, 0x18) }, + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x02, 0x19) }, + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x02, 0x1A) }, + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x02, 0x1B) }, + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x02, 0x1C) }, + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x02, 0x31) }, + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x02, 0x32) }, + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x02, 0x33) }, + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x02, 0x34) }, + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x02, 0x35) }, + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x02, 0x36) }, + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x02, 0x3A) }, + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x02, 0x3B) }, + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x02, 0x3D) }, + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x02, 0x3E) }, + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x02, 0x3F) }, + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x02, 0x48) }, + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x02, 0x49) }, + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x02, 0x4A) }, + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x02, 0x4B) }, + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x02, 0x4C) }, + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x02, 0x61) }, + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x02, 0x62) }, + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x02, 0x63) }, + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x02, 0x64) }, + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x02, 0x65) }, + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x02, 0x66) }, + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x02, 0x6A) }, + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x02, 0x6B) }, + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x02, 0x6D) }, + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x02, 0x6E) }, + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x02, 0x6F) }, + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x02, 0x78) }, + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x02, 0x79) }, + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x02, 0x7A) }, + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x02, 0x7B) }, + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x02, 0x7C) }, + + { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_V640) }, { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_V620) }, { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_V740) },
Greg Kroah-Hartman
maintainerPATCH 35/46 USB: option: add ZTE K5006-Z
In reply to Greg Kroah-HartmanFrom: Greg KH <[email protected]>
3.5-stable review patch. If anyone has any objections, please let me know.
------------------
From: Bjørn Mork <[email protected]>
commit f1b5c997e68533df1f96dcd3068a231bca495603 upstream.
The ZTE (Vodafone) K5006-Z use the following
interface layout:
00 DIAG
01 secondary
02 modem
03 networkcard
04 storage
Ignoring interface #3 which is handled by the qmi_wwan driver.
--- drivers/usb/serial/option.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/usb/serial/option.c +2 -0
@@ -886,6 +886,8 @@ static const struct usb_device_id option { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1010, 0xff, 0xff, 0xff), .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1012, 0xff, 0xff, 0xff) }, + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1018, 0xff, 0xff, 0xff), + .driver_info = (kernel_ulong_t)&net_intf3_blacklist }, { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1057, 0xff, 0xff, 0xff) }, { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1058, 0xff, 0xff, 0xff) }, { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1059, 0xff, 0xff, 0xff) },
Greg Kroah-Hartman
maintainerPATCH 36/46 USB: ftdi_sio: Add VID/PID for Kondo Serial USB
In reply to Greg Kroah-HartmanFrom: Greg KH <[email protected]>
3.5-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ozan Çağlayan <[email protected]>
commit 7724a1edbe463b06d4e7831a41149ba095b16c53 upstream.
This adds VID/PID for Kondo Kagaku Co. Ltd. Serial USB Adapter interface:
http://www.kondo-robot.com/EN/wp/?cat=28
Tested by controlling an RCB3 board using libRCB3.
--- drivers/usb/serial/ftdi_sio.c | 1 + drivers/usb/serial/ftdi_sio_ids.h | 7 +++++++ 2 files changed, 8 insertions(+)
drivers/usb/serial/ftdi_sio.c +1 -0
@@ -811,6 +811,7 @@ static struct usb_device_id id_table_com { USB_DEVICE(LARSENBRUSGAARD_VID, LB_ALTITRACK_PID) }, { USB_DEVICE(GN_OTOMETRICS_VID, AURICAL_USB_PID) }, { USB_DEVICE(PI_VID, PI_E861_PID) }, + { USB_DEVICE(KONDO_VID, KONDO_USB_SERIAL_PID) }, { USB_DEVICE(BAYER_VID, BAYER_CONTOUR_CABLE_PID) }, { USB_DEVICE(FTDI_VID, MARVELL_OPENRD_PID), .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
drivers/usb/serial/ftdi_sio_ids.h +7 -0
@@ -795,6 +795,13 @@#define PI_E861_PID 0x1008/* E-861 piezo controller USB connection */ /* +* Kondo Kagaku Co.Ltd. +* http://www.kondo-robot.com/EN +*/ +#define KONDO_VID 0x165c +#define KONDO_USB_SERIAL_PID 0x0002 + +/* * Bayer Ascensia Contour blood glucose meter USB-converter cable. * http://winglucofacts.com/cables/ */
Greg Kroah-Hartman
maintainerPATCH 37/46 usb: serial: mos7840: Fixup mos7840_chars_in_buffer()
In reply to Greg Kroah-HartmanFrom: Greg KH <[email protected]>
3.5-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mark Ferrell <[email protected]>
commit 5c263b92f828af6a8cf54041db45ceae5af8f2ab upstream.
* Use the buffer content length as opposed to the total buffer size. This can be a real problem when using the mos7840 as a usb serial-console as all kernel output is truncated during boot.
--- drivers/usb/serial/mos7840.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-)
drivers/usb/serial/mos7840.c +6 -3
@@ -1232,9 +1232,12 @@ static int mos7840_chars_in_buffer(strucreturn 0 ;spin_lock_irqsave (&mos7840_port->pool_lock, flags); -for (i =0 ; i <NUM_URBS ; ++i) -if (mos7840_port->busy[i]) - chars +=URB_TRANSFER_BUFFER_SIZE ; +for (i =0 ; i <NUM_URBS ; ++i) { +if (mos7840_port->busy[i]) { +struct urb *urb = mos7840_port->write_urb_pool[i]; + chars += urb->transfer_buffer_length; + } + }spin_unlock_irqrestore (&mos7840_port->pool_lock, flags);dbg ("%s - returns %d" , __func__, chars);return chars;
Greg Kroah-Hartman
maintainerPATCH 38/46 usb: gadget: u_ether: fix kworker 100% CPU issue with still used interfaces in eth_stop
In reply to Greg Kroah-HartmanFrom: Greg KH <[email protected]>
3.5-stable review patch. If anyone has any objections, please let me know.
------------------
From: Michael Grzeschik <[email protected]>
commit b1b552a69b8805e7e338074a9e8b670b4a795218 upstream.
This patch fixes an issue introduced by patch:
72c973d usb: gadget: add usb_endpoint_descriptor to struct usb_ep
Without this patch we see a kworker taking 100% CPU, after this sequence:
- Connect gadget to a windows host
- load g_ether
- ifconfig up <ip>; ifconfig down; ifconfig up
- ping <windows host>
The "ifconfig down" results in calling eth_stop(), which will call usb_ep_disable() and, if the carrier is still ok, usb_ep_enable():
usb_ep_disable(link->in_ep);
usb_ep_disable(link->out_ep);
if (netif_carrier_ok(net)) {
usb_ep_enable(link->in_ep);
usb_ep_enable(link->out_ep);
}The ep should stay enabled, but will not, as ep_disable set the desc pointer to NULL, therefore the subsequent ep_enable will fail. This leads to permanent rescheduling of the eth_work() worker as usb_ep_queue() (called by the worker) will fail due to the unconfigured endpoint.
We fix this issue by saving the ep descriptors and re-assign them before usb_ep_enable().
--- drivers/usb/gadget/u_ether.c | 6 ++++++ 1 file changed, 6 insertions(+)
drivers/usb/gadget/u_ether.c +6 -0
@@ -669,6 +669,8 @@ static int eth_stop(struct net_device *nspin_lock_irqsave (&dev->lock, flags);if (dev->port_usb) {struct gether *link = dev->port_usb; +const struct usb_endpoint_descriptor *in; +const struct usb_endpoint_descriptor *out;if (link->close) link->close (link);
@@ -682,10 +684,14 @@ static int eth_stop(struct net_device *n* their own pace; the network stack can handle old packets. * For the moment we leave this here, since it works. */ + in = link->in_ep->desc; + out = link->out_ep->desc;usb_ep_disable (link->in_ep);usb_ep_disable (link->out_ep);if (netif_carrier_ok (net)) {DBG (dev,"host still using in/out endpoints\n" ); + link->in_ep->desc = in; + link->out_ep->desc = out;usb_ep_enable (link->in_ep);usb_ep_enable (link->out_ep); }
Greg Kroah-Hartman
maintainerPATCH 39/46 rt2x00: Add support for BUFFALO WLI-UC-GNM2 to rt2800usb.
In reply to Greg Kroah-HartmanFrom: Greg KH <[email protected]>
3.5-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jeongdo Son <[email protected]>
commit a769f9577232afe2c754606a83aad85127e7052a upstream.
This is a RT3070 based device.
--- drivers/net/wireless/rt2x00/rt2800usb.c | 1 + 1 file changed, 1 insertion(+)
drivers/net/wireless/rt2x00/rt2800usb.c +1 -0
@@ -971,6 +971,7 @@ static struct usb_device_id rt2800usb_de { USB_DEVICE(0x0411, 0x015d) }, { USB_DEVICE(0x0411, 0x016f) }, { USB_DEVICE(0x0411, 0x01a2) }, + { USB_DEVICE(0x0411, 0x01ee) },/* Corega */ { USB_DEVICE(0x07aa, 0x002f) }, { USB_DEVICE(0x07aa, 0x003c) },
Greg Kroah-Hartman
maintainerPATCH 40/46 KVM: PIC: call ack notifiers for irqs that are dropped form irr
In reply to Greg Kroah-HartmanFrom: Greg KH <[email protected]>
3.5-stable review patch. If anyone has any objections, please let me know.
------------------
From: Gleb Natapov <[email protected]>
(cherry picked from commit aea218f3cbbcaac249b6b2c98930a00d6d931f1e)
After commit 242ec97c358256 PIT interrupts are no longer delivered after PIC reset. It happens because PIT injects interrupt only if previous one was acked, but since on PIC reset it is dropped from irr it will never be delivered and hence acknowledged. Fix that by calling ack notifier on PIC reset.
--- arch/x86/kvm/i8259.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+)
arch/x86/kvm/i8259.c +17 -0
@@ -305,6 +305,11 @@ static void pic_ioport_write(void *opaqu addr &=1 ;if (addr ==0 ) {if (val &0x10 ) { +u8 edge_irr = s->irr & ~s->elcr; +int i; +bool found; +struct kvm_vcpu *vcpu; + s->init4 = val &1 ; s->last_irr =0 ; s->irr &= s->elcr;
@@ -322,6 +327,18 @@ static void pic_ioport_write(void *opaquif (val &0x08 )pr_pic_unimpl ("level sensitive irq not supported" ); + +kvm_for_each_vcpu (i, vcpu, s->pics_state->kvm) +if (kvm_apic_accept_pic_intr (vcpu)) { + found = true; +break ; + } + + +if (found) +for (irq =0 ; irq <PIC_NUM_PINS /2 ; irq++) +if (edge_irr & (1 << irq)) +pic_clear_isr (s, irq); }else if (val &0x08 ) {if (val &0x04 ) s->poll =1 ;
Re: [ 40/46] KVM: PIC: call ack notifiers for irqs that are dropped form irr
Quoted 8 lines · Greg Kroah-Hartman
From: Greg KH <[email protected]>
3.5-stable review patch. If anyone has any objections, please let me know.
------------------
From: Gleb Natapov <[email protected]>
Quoted 7 lines
(cherry picked from commit
aea218f3cbbcaac249b6b2c98930a00d6d931f1e)After commit
242ec97c358256PIT interrupts are no longer delivered after PIC reset. It happens because PIT injects interrupt only if previous one was acked, but since on PIC reset it is dropped from irr it will never be delivered and hence acknowledged. Fix that by calling ack notifier on PIC reset.
[...]
Based on the commit blamed for the regression, I think this is needed for 3.4 as well.
Ben.
Signature · 2 lines
Ben Hutchings Experience is what causes a person to make new mistakes instead of old ones.
Greg Kroah-Hartman
maintainerRe: [ 40/46] KVM: PIC: call ack notifiers for irqs that are dropped form irr
Quoted 16 lines · Ben Hutchings
Quoted 8 lines · Greg Kroah-Hartman
From: Greg KH <[email protected]>
3.5-stable review patch. If anyone has any objections, please let me know.
------------------
From: Gleb Natapov <[email protected]>
Quoted 7 lines
(cherry picked from commit
aea218f3cbbcaac249b6b2c98930a00d6d931f1e)After commit
242ec97c358256PIT interrupts are no longer delivered after PIC reset. It happens because PIT injects interrupt only if previous one was acked, but since on PIC reset it is dropped from irr it will never be delivered and hence acknowledged. Fix that by calling ack notifier on PIC reset.
Quoted 4 lines
[...]
Based on the commit blamed for the regression, I think this is needed for 3.4 as well.
That's up to Avi and Marcelo, as I do not apply any KVM patches to any stable tree unless they say so (as they have asked in the past.)
Avi and Marcelo?
greg k-h
Greg Kroah-Hartman
maintainerPATCH 41/46 KVM: x86: apply kvmclock offset to guest wall clock time
In reply to Greg Kroah-HartmanFrom: Greg KH <[email protected]>
3.5-stable review patch. If anyone has any objections, please let me know.
------------------
From: Bruce Rogers <[email protected]>
(cherry picked from commit 4b6486659a7defef82ea51b276024b3aa357fefc)
When a guest migrates to a new host, the system time difference from the previous host is used in the updates to the kvmclock system time visible to the guest, resulting in a continuation of correct kvmclock based guest timekeeping.
The wall clock component of the kvmclock provided time is currently not updated with this same time offset. Since the Linux guest caches the wall clock based time, this discrepency is not noticed until the guest is rebooted. After reboot the guest's time calculations are off.
This patch adjusts the wall clock by the kvmclock_offset, resulting in correct guest time after a reboot.
--- arch/x86/kvm/x86.c | 4 ++++ 1 file changed, 4 insertions(+)
arch/x86/kvm/x86.c +4 -0
@@ -907,6 +907,10 @@ static void kvm_write_wall_clock(struct*/ getboottime (&boot); +if (kvm->arch.kvmclock_offset) { +struct timespec ts =ns_to_timespec (kvm->arch.kvmclock_offset); + boot =timespec_sub (boot, ts); + } wc.sec = boot.tv_sec; wc.nsec = boot.tv_nsec; wc.version = version;
Greg Kroah-Hartman
maintainerPATCH 42/46 KVM: VMX: Fix ds/es corruption on i386 with preemption
In reply to Greg Kroah-HartmanFrom: Greg KH <[email protected]>
3.5-stable review patch. If anyone has any objections, please let me know.
------------------
From: Avi Kivity <[email protected]>
(cherry picked from commit aa67f6096c19bcdb1951ef88be3cf3d2118809dc)
Commit b2da15ac26a0c ("KVM: VMX: Optimize %ds, %es reload") broke i386 in the following scenario:
vcpu_load
...
vmx_save_host_state
vmx_vcpu_run
(ds.rpl, es.rpl cleared by hardware)
interrupt
push ds, es # pushes bad ds, es
schedule
vmx_vcpu_put
vmx_load_host_state
reload ds, es (with __USER_DS)
pop ds, es # of other thread's stack
iret
# other thread runs
interrupt
push ds, es
schedule # back in vcpu thread
pop ds, es # now with rpl=0
iret
...
vcpu_put
resume_userspace
iret # clears ds, es due to mismatched rpl(instead of resume_userspace, we might return with SYSEXIT and then take an exception; when the exception IRETs we end up with cleared ds, es)
Fix by avoiding the optimization on i386 and reloading ds, es on the lightweight exit path.
--- arch/x86/kvm/vmx.c | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-)
arch/x86/kvm/vmx.c +13 -7
@@ -1470,13 +1470,6 @@ static void __vmx_load_host_state(structloadsegment (ds, vmx->host_state.ds_sel); loadsegment(es, vmx->host_state.es_sel); } -#else -/* -* The sysexit path does not restore ds/es, so we must set them to -* a reasonable value ourselves. -*/ -loadsegment (ds, __USER_DS); -loadsegment (es, __USER_DS);#endif reload_tss ();#ifdef CONFIG_X86_64
@@ -6273,6 +6266,19 @@ static void __noclone vmx_vcpu_run(struc#endif ); +#ifndef CONFIG_X86_64 +/* +* The sysexit path does not restore ds/es, so we must set them to +* a reasonable value ourselves. +* +* We can't defer this to vmx_load_host_state() since that function +* may be executed in interrupt context, which saves and restore segments +* around it, nullifying its effect. +*/ +loadsegment (ds, __USER_DS); +loadsegment (es, __USER_DS); +#endif + vcpu->arch.regs_avail = ~((1 <<VCPU_REGS_RIP ) | (1 <<VCPU_REGS_RSP ) | (1 <<VCPU_EXREG_RFLAGS ) | (1 << VCPU_EXREG_CPL)
Greg Kroah-Hartman
maintainerPATCH 43/46 KVM: x86 emulator: fix byte-sized MOVZX/MOVSX
In reply to Greg Kroah-HartmanFrom: Greg KH <[email protected]>
3.5-stable review patch. If anyone has any objections, please let me know.
------------------
From: Avi Kivity <[email protected]>
(cherry picked from commit 361cad2b50a2c92b91b6f568db860fabad3bf149)
Commit 2adb5ad9fe1 removed ByteOp from MOVZX/MOVSX, replacing them by SrcMem8, but neglected to fix the dependency in the emulation code on ByteOp. This caused the instruction not to have any effect in some circumstances.
Fix by replacing the check for ByteOp with the equivalent src.op_bytes == 1.
--- arch/x86/kvm/emulate.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
arch/x86/kvm/emulate.c +2 -2
@@ -4426,12 +4426,12 @@ twobyte_insn:break ; case 0xb6 ... 0xb7: /* movzx */ ctxt->dst.bytes = ctxt->op_bytes; - ctxt->dst.val = (ctxt->d & ByteOp) ? (u8 ) ctxt->src.val + ctxt->dst.val = (ctxt->src.bytes ==1 ) ? (u8 ) ctxt->src.val : (u16 ) ctxt->src.val;break ; case 0xbe ... 0xbf: /* movsx */ ctxt->dst.bytes = ctxt->op_bytes; - ctxt->dst.val = (ctxt->d & ByteOp) ? (s8 ) ctxt->src.val : + ctxt->dst.val = (ctxt->src.bytes ==1 ) ? (s8 ) ctxt->src.val : (s16 ) ctxt->src.val;break ; case 0xc0 ... 0xc1: /* xadd */
Re: [ 43/46] KVM: x86 emulator: fix byte-sized MOVZX/MOVSX
Quoted 8 lines · Greg Kroah-Hartman
From: Greg KH <[email protected]>
3.5-stable review patch. If anyone has any objections, please let me know.
------------------
From: Avi Kivity <[email protected]>
Quoted 8 lines
(cherry picked from commit
361cad2b50a2c92b91b6f568db860fabad3bf149)Commit
2adb5ad9fe1removed ByteOp from MOVZX/MOVSX, replacing them by SrcMem8, but neglected to fix the dependency in the emulation code on ByteOp. This caused the instruction not to have any effect in some circumstances.Fix by replacing the check for ByteOp with the equivalent src.op_bytes == 1.
[...]
Also needed for 3.4, based on the commit that's blamed.
Ben.
Signature · 2 lines
Ben Hutchings Experience is what causes a person to make new mistakes instead of old ones.
Greg Kroah-Hartman
maintainerPATCH 44/46 KVM: VMX: Fix KVM_SET_SREGS with big real mode segments
In reply to Greg Kroah-HartmanFrom: Greg KH <[email protected]>
3.5-stable review patch. If anyone has any objections, please let me know.
------------------
From: Orit Wasserman <[email protected]>
(cherry picked from commit b246dd5df139501b974bd6b28f7815e53b3a792f)
For example migration between Westmere and Nehelem hosts, caught in big real mode.
The code that fixes the segments for real mode guest was moved from enter_rmode to vmx_set_segments. enter_rmode calls vmx_set_segments for each segment.
--- arch/x86/kvm/vmx.c | 74 ++++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 60 insertions(+), 14 deletions(-)
arch/x86/kvm/vmx.c +60 -14
@@ -615,6 +615,10 @@ static void kvm_cpu_vmxon(u64 addr);static void kvm_cpu_vmxoff (void );static void vmx_set_cr3 (struct kvm_vcpu *vcpu,unsigned long cr3);static int vmx_set_tss_addr (struct kvm *kvm,unsigned int addr); +static void vmx_set_segment (struct kvm_vcpu *vcpu, +struct kvm_segment *var,int seg); +static void vmx_get_segment (struct kvm_vcpu *vcpu, +struct kvm_segment *var,int seg); static DEFINE_PER_CPU(struct vmcs *, vmxarea); static DEFINE_PER_CPU(struct vmcs *, current_vmcs);
@@ -2763,6 +2767,7 @@ static void enter_rmode(struct kvm_vcpu {unsigned long flags;struct vcpu_vmx *vmx =to_vmx (vcpu); +struct kvm_segment var;if (enable_unrestricted_guest)return ;
@@ -2806,20 +2811,23 @@ static void enter_rmode(struct kvm_vcpuif (emulate_invalid_guest_state) goto continue_rmode; -vmcs_write16 (GUEST_SS_SELECTOR ,vmcs_readl (GUEST_SS_BASE ) >>4 ); -vmcs_write32 (GUEST_SS_LIMIT ,0xffff ); -vmcs_write32 (GUEST_SS_AR_BYTES ,0xf3 ); - -vmcs_write32 (GUEST_CS_AR_BYTES ,0xf3 ); -vmcs_write32 (GUEST_CS_LIMIT ,0xffff ); -if (vmcs_readl (GUEST_CS_BASE ) ==0xffff0000 ) -vmcs_writel (GUEST_CS_BASE ,0xf0000 ); -vmcs_write16 (GUEST_CS_SELECTOR ,vmcs_readl (GUEST_CS_BASE ) >>4 ); - -fix_rmode_seg (VCPU_SREG_ES , &vmx->rmode.es); -fix_rmode_seg (VCPU_SREG_DS , &vmx->rmode.ds); -fix_rmode_seg (VCPU_SREG_GS , &vmx->rmode.gs); -fix_rmode_seg (VCPU_SREG_FS , &vmx->rmode.fs); +vmx_get_segment (vcpu, &var,VCPU_SREG_SS ); +vmx_set_segment (vcpu, &var,VCPU_SREG_SS ); + +vmx_get_segment (vcpu, &var,VCPU_SREG_CS ); +vmx_set_segment (vcpu, &var,VCPU_SREG_CS ); + +vmx_get_segment (vcpu, &var,VCPU_SREG_ES ); +vmx_set_segment (vcpu, &var,VCPU_SREG_ES ); + +vmx_get_segment (vcpu, &var,VCPU_SREG_DS ); +vmx_set_segment (vcpu, &var,VCPU_SREG_DS ); + +vmx_get_segment (vcpu, &var,VCPU_SREG_GS ); +vmx_set_segment (vcpu, &var,VCPU_SREG_GS ); + +vmx_get_segment (vcpu, &var,VCPU_SREG_FS ); +vmx_set_segment (vcpu, &var,VCPU_SREG_FS ); continue_rmode:kvm_mmu_reset_context (vcpu);
@@ -3222,6 +3230,44 @@ static void vmx_set_segment(struct kvm_vvmcs_write32 (sf->ar_bytes, ar);__clear_bit (VCPU_EXREG_CPL , (ulong *)&vcpu->arch.regs_avail); + +/* +* Fix segments for real mode guest in hosts that don't have +* "unrestricted_mode" or it was disabled. +* This is done to allow migration of the guests from hosts with +* unrestricted guest like Westmere to older host that don't have +* unrestricted guest like Nehelem. +*/ +if (!enable_unrestricted_guest && vmx->rmode.vm86_active) { +switch (seg) { +case VCPU_SREG_CS : +vmcs_write32 (GUEST_CS_AR_BYTES ,0xf3 ); +vmcs_write32 (GUEST_CS_LIMIT ,0xffff ); +if (vmcs_readl (GUEST_CS_BASE ) ==0xffff0000 ) +vmcs_writel (GUEST_CS_BASE ,0xf0000 ); +vmcs_write16 (GUEST_CS_SELECTOR , +vmcs_readl (GUEST_CS_BASE ) >>4 ); +break ; +case VCPU_SREG_ES : +fix_rmode_seg (VCPU_SREG_ES , &vmx->rmode.es); +break ; +case VCPU_SREG_DS : +fix_rmode_seg (VCPU_SREG_DS , &vmx->rmode.ds); +break ; +case VCPU_SREG_GS : +fix_rmode_seg (VCPU_SREG_GS , &vmx->rmode.gs); +break ; +case VCPU_SREG_FS : +fix_rmode_seg (VCPU_SREG_FS , &vmx->rmode.fs); +break ; +case VCPU_SREG_SS : +vmcs_write16 (GUEST_SS_SELECTOR , +vmcs_readl (GUEST_SS_BASE ) >>4 ); +vmcs_write32 (GUEST_SS_LIMIT ,0xffff ); +vmcs_write32 (GUEST_SS_AR_BYTES ,0xf3 ); +break ; + } + } }static void vmx_get_cs_db_l_bits (struct kvm_vcpu *vcpu,int *db,int *l)
Greg Kroah-Hartman
maintainerPATCH 45/46 pmac_zilog,kdb: Fix console poll hook to return instead of loop
In reply to Greg Kroah-HartmanFrom: Greg KH <[email protected]>
3.5-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jason Wessel <[email protected]>
commit 38f8eefccf3a23c4058a570fa2938a4f553cf8e0 upstream.
kdb <-> kgdb transitioning does not work properly with this UART driver because the get character routine loops indefinitely as opposed to returning NO_POLL_CHAR per the expectation of the KDB I/O driver API.
The symptom is a kernel hang when trying to switch debug modes.
--- drivers/tty/serial/pmac_zilog.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-)
drivers/tty/serial/pmac_zilog.c +9 -3
@@ -1348,10 +1348,16 @@ static int pmz_verify_port(struct uart_pstatic int pmz_poll_get_char (struct uart_port *port) {struct uart_pmac_port *uap = (struct uart_pmac_port *)port; +int tries =2 ; -while ((read_zsreg (uap,R0 ) & Rx_CH_AV) ==0 ) -udelay (5 ); -return read_zsdata (uap); +while (tries) { +if ((read_zsreg (uap,R0 ) & Rx_CH_AV) !=0 ) +return read_zsdata (uap); +if (tries--) +udelay (5 ); + } + +return NO_POLL_CHAR ; }static void pmz_poll_put_char (struct uart_port *port,unsigned char c)
Greg Kroah-Hartman
maintainerPATCH 46/46 IB/srp: Fix a race condition
In reply to Greg Kroah-HartmanFrom: Greg KH <[email protected]>
3.5-stable review patch. If anyone has any objections, please let me know.
------------------
From: Bart Van Assche <[email protected]>
commit 220329916c72ee3d54ae7262b215a050f04a18fc upstream.
Avoid a crash caused by the scmnd->scsi_done(scmnd) call in srp_process_rsp() being invoked with scsi_done == NULL. This can happen if a reply is received during or after a command abort.
Reference: http://marc.info/?l=linux-rdma&m=134314367801595
--- drivers/infiniband/ulp/srp/ib_srp.c | 87 ++++++++++++++++++++++++++---------- 1 file changed, 63 insertions(+), 24 deletions(-)
drivers/infiniband/ulp/srp/ib_srp.c +63 -24
@@ -586,24 +586,62 @@ static void srp_unmap_data(struct scsi_c scmnd->sc_data_direction); } -static void srp_remove_req (struct srp_target_port *target, -struct srp_request *req,s32 req_lim_delta) +/** +* srp_claim_req - Take ownership of the scmnd associated with a request. +* @target: SRP target port. +* @req: SRP request. +* @scmnd: If NULL, take ownership of @req->scmnd. If not NULL, only take +* ownership of @req->scmnd if it equals @scmnd. +* +* Return value: +* Either NULL or a pointer to the SCSI command the caller became owner of. +*/ +static struct scsi_cmnd *srp_claim_req (struct srp_target_port *target, +struct srp_request *req, +struct scsi_cmnd *scmnd) {unsigned long flags; -srp_unmap_data (req->scmnd, target, req); +spin_lock_irqsave (&target->lock, flags); +if (!scmnd) { + scmnd = req->scmnd; + req->scmnd =NULL ; + }else if (req->scmnd == scmnd) { + req->scmnd =NULL ; + }else { + scmnd =NULL ; + } +spin_unlock_irqrestore (&target->lock, flags); + +return scmnd; +} + +/** +* srp_free_req() - Unmap data and add request to the free request list. +*/ +static void srp_free_req (struct srp_target_port *target, +struct srp_request *req,struct scsi_cmnd *scmnd, +s32 req_lim_delta) +{ +unsigned long flags; + +srp_unmap_data (scmnd, target, req); +spin_lock_irqsave (&target->lock, flags); target->req_lim += req_lim_delta; - req->scmnd =NULL ;list_add_tail (&req->list, &target->free_reqs);spin_unlock_irqrestore (&target->lock, flags); }static void srp_reset_req (struct srp_target_port *target,struct srp_request *req) { - req->scmnd->result =DID_RESET <<16 ; - req->scmnd->scsi_done (req->scmnd); -srp_remove_req (target, req,0 ); +struct scsi_cmnd *scmnd =srp_claim_req (target, req,NULL ); + +if (scmnd) { + scmnd->result =DID_RESET <<16 ; + scmnd->scsi_done (scmnd); +srp_free_req (target, req, scmnd,0 ); + } }static int srp_reconnect_target (struct srp_target_port *target)
@@ -1073,11 +1111,18 @@ static void srp_process_rsp(struct srp_tcomplete (&target->tsk_mgmt_done); }else { req = &target->req_ring[rsp->tag]; - scmnd = req->scmnd; -if (!scmnd) + scmnd =srp_claim_req (target, req,NULL ); +if (!scmnd) {shost_printk (KERN_ERR , target->scsi_host,"Null scmnd for RSP w/tag %016llx\n" , (unsigned long long ) rsp->tag); + +spin_lock_irqsave (&target->lock, flags); + target->req_lim +=be32_to_cpu (rsp->req_lim_delta); +spin_unlock_irqrestore (&target->lock, flags); + +return ; + } scmnd->result = rsp->status;if (rsp->flags &SRP_RSP_FLAG_SNSVALID ) {
@@ -1092,7 +1137,9 @@ static void srp_process_rsp(struct srp_telse if (rsp->flags & (SRP_RSP_FLAG_DIOVER |SRP_RSP_FLAG_DIUNDER ))scsi_set_resid (scmnd,be32_to_cpu (rsp->data_in_res_cnt)); -srp_remove_req (target, req,be32_to_cpu (rsp->req_lim_delta)); +srp_free_req (target, req, scmnd, +be32_to_cpu (rsp->req_lim_delta)); + scmnd->host_scribble =NULL ; scmnd->scsi_done (scmnd); }
@@ -1631,25 +1678,17 @@ static int srp_abort(struct scsi_cmnd *s {struct srp_target_port *target =host_to_target (scmnd->device->host);struct srp_request *req = (struct srp_request *) scmnd->host_scribble; -int ret =SUCCESS ;shost_printk (KERN_ERR , target->scsi_host,"SRP abort called\n" ); -if (!req || target->qp_in_error) -return FAILED ; -if (srp_send_tsk_mgmt (target, req->index, scmnd->device->lun, -SRP_TSK_ABORT_TASK )) +if (!req || target->qp_in_error || !srp_claim_req (target, req, scmnd))return FAILED ; +srp_send_tsk_mgmt (target, req->index, scmnd->device->lun, +SRP_TSK_ABORT_TASK ); +srp_free_req (target, req, scmnd,0 ); + scmnd->result =DID_ABORT <<16 ; -if (req->scmnd) { -if (!target->tsk_mgmt_status) { -srp_remove_req (target, req,0 ); - scmnd->result =DID_ABORT <<16 ; - }else - ret =FAILED ; - } - -return ret; +return SUCCESS ; }static int srp_reset_device (struct scsi_cmnd *scmnd)
(CC: J. Bruce Fields)
Greg,
it looks like a fix for a regression in NFS is not mentioned in this patch even though it was supposedly sent to -stable:
http://lkml.indiana.edu/hypermail/linux/kernel/1208.2/00594.html
I tried to locate the patch in git but could not find it anywhere. As far as I can tell the fix works; in my case I noticed repeatable hangs when trying to "move files to the trash" in XFCE and these hangs are now gone. Have not noticed any negative side effects either.
thanks
Holger
Greg KH
maintainerQuoted 4 lines · Holger Hoffstaette
(CC: J. Bruce Fields)
Greg,
Quoted 8 lines
it looks like a fix for a regression in NFS is not mentioned in this patch even though it was supposedly sent to -stable:
http://lkml.indiana.edu/hypermail/linux/kernel/1208.2/00594.htmlI tried to locate the patch in git but could not find it anywhere. As far as I can tell the fix works; in my case I noticed repeatable hangs when trying to "move files to the trash" in XFCE and these hangs are now gone. Have not noticed any negative side effects either.
Is the patch you reference above in Linus's tree? That is a requirement before I can accept it into a stable release (please read Documentation/stable_kernel_rules.txt for the details.)
greg k-h
Quoted 9 lines · Greg KH
Quoted 8 lines · Holger Hoffstaette
(CC: J. Bruce Fields)
Greg,
it looks like a fix for a regression in NFS is not mentioned in this patch even though it was supposedly sent to -stable:
http://lkml.indiana.edu/hypermail/linux/kernel/1208.2/00594.html
Quoted 8 lines
Quoted 4 lines
I tried to locate the patch in git but could not find it anywhere. As far as I can tell the fix works; in my case I noticed repeatable hangs when trying to "move files to the trash" in XFCE and these hangs are now gone. Have not noticed any negative side effects either.
Is the patch you reference above in Linus's tree? That is a requirement before I can accept it into a stable release (please read
Documentation/stable_kernel_rules.txtfor the details.)
Right, Holger, the way this works is I queue these things up for Linus but don't necessarily submit them right away. Bug me (not Greg) if I haven't done that in a couple days.
--b.
Quoted 4 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 3.5.3 release. There are 47 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.
3.5.3-rc1 hangs my machine on boot (can reboot with CTRL-ALT-DEL). All other kernels are/has been fine, incl. latest 3.5.2 and 3.6-rc1.
There's nothing in the logs, but you can see a screenshot here:
http://www.fritha.org/hang.jpg
Here it stops, and I have to reboot.
Quoting myself here..
Quoted 2 lines · Heinz Diehl
3.5.3-rc1 hangs my machine on boot (can reboot with CTRL-ALT-DEL). All other kernels are/has been fine, incl. latest 3.5.2 and 3.6-rc1.
...to let you know that my problem is solved, and it was _not_ kernel related. I can't tell what it was which blocked a proper boot, but after reverting some of the patches of the 3.5.3-rc1 upgrade without success, I updated the whole machine and did a BIOS reset, and the problem was immediately gone.
So just ignore my previous mail. 3.5.3-rc1 boots fine now. Sorry for the noise!
I would like to see commit 2064db725cc6d4ea19a24c138bc37939b63e3ae6 (drm/nv86/fifo: suspend fix) cherry-picked to the 3.5 kernel series, it makes suspend work again on my machine. Could you please queue this up for 3.5.4?
Apologies for thread hijacking, my attempts to directly send the request to [email protected] failed (mail seems to have disappeared in the bit bucket). :-(
Cheers,
Sven