diff options
-rw-r--r-- | freed-ora/current/f16/kernel.spec | 16 | ||||
-rw-r--r-- | freed-ora/current/f16/linux-3.4.10-queue.patch | 2464 | ||||
-rw-r--r-- | freed-ora/current/f16/patch-3.4-gnu-3.4.10-gnu.xz.sign | 7 | ||||
-rw-r--r-- | freed-ora/current/f16/patch-3.4-gnu-3.4.9-gnu.xz.sign | 7 | ||||
-rw-r--r-- | freed-ora/current/f16/sources | 1 |
5 files changed, 16 insertions, 2479 deletions
diff --git a/freed-ora/current/f16/kernel.spec b/freed-ora/current/f16/kernel.spec index eda36b7e6..50d710323 100644 --- a/freed-ora/current/f16/kernel.spec +++ b/freed-ora/current/f16/kernel.spec @@ -54,7 +54,7 @@ Summary: The Linux kernel # For non-released -rc kernels, this will be appended after the rcX and # gitX tags, so a 3 here would become part of release "0.rcX.gitX.3" # -%global baserelease 2 +%global baserelease 1 %global fedora_build %{baserelease} # base_sublevel is the kernel version we're starting with and patching @@ -104,7 +104,7 @@ Summary: The Linux kernel %if 0%{?released_kernel} # Do we have a -stable update to apply? -%define stable_update 9 +%define stable_update 10 # Is it a -stable RC? %define stable_rc 0 # Set rpm version accordingly @@ -770,9 +770,6 @@ Patch22072: tcp-Apply-device-TSO-segment-limit-earlier.patch Patch22075: af_netlink-credentials-cve-2012-3520.patch -#Patches from the 3.4.10 stable queue -Patch22100: linux-3.4.10-queue.patch - # END OF PATCH DEFINITIONS %endif @@ -1433,9 +1430,6 @@ ApplyPatch tcp-Apply-device-TSO-segment-limit-earlier.patch ApplyPatch af_netlink-credentials-cve-2012-3520.patch -#Patches from the 3.4.10 stable queue -ApplyPatch linux-3.4.10-queue.patch - # END OF PATCH APPLICATIONS %endif @@ -2134,6 +2128,12 @@ fi # and build. %changelog +* Thu Sep 6 2012 Alexandre Oliva <lxoliva@fsfla.org> -libre +- GNU Linux-libre 3.4.10 + +* Wed Sep 05 2012 Josh Boyer <jwboyer@redhat.com> 3.4.10-1 +- Linux v3.4.10 + * Thu Aug 23 2012 Justin M. Forbes <jforbes@redhat.com> 3.4.9-2 - af_netlink: force credentials passing [CVE-2012-3520] - Add patches from 3.4.10 queue diff --git a/freed-ora/current/f16/linux-3.4.10-queue.patch b/freed-ora/current/f16/linux-3.4.10-queue.patch deleted file mode 100644 index 72cfb19f5..000000000 --- a/freed-ora/current/f16/linux-3.4.10-queue.patch +++ /dev/null @@ -1,2464 +0,0 @@ -From a2367db2ec5e7fc6fe93e221e0fcdee81b053daf Mon Sep 17 00:00:00 2001 -From: Fabio Estevam <festevam@gmail.com> -Date: Tue, 3 Jul 2012 15:33:29 -0300 -Subject: dma: imx-dma: Fix kernel crash due to missing clock conversion - -From: Fabio Estevam <festevam@gmail.com> - -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 ]-- - -Reported-by: Javier Martin <javier.martin@vista-silicon.com> -Signed-off-by: Fabio Estevam <fabio.estevam@freescale.com> -Acked-by: Sascha Hauer <s.hauer@pengutronix.de> -Signed-off-by: Vinod Koul <vinod.koul@linux.intel.com> -Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> - ---- - drivers/dma/imx-dma.c | 36 +++++++++++++++++++++++++----------- - 1 file changed, 25 insertions(+), 11 deletions(-) - ---- a/drivers/dma/imx-dma.c -+++ b/drivers/dma/imx-dma.c -@@ -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 pl - return 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 p - free_irq(MX1_DMA_ERR, NULL); - } - -- kfree(imxdma); -+ clk_disable_unprepare(imxdma->dma_ipg); -+ clk_disable_unprepare(imxdma->dma_ahb); -+ kfree(imxdma); - - return 0; - } -From 0d8957c8a90bbb5d34fab9a304459448a5131e06 Mon Sep 17 00:00:00 2001 -From: Daniel Vetter <daniel.vetter@ffwll.ch> -Date: Tue, 7 Aug 2012 09:54:14 +0200 -Subject: drm/i915: correctly order the ring init sequence - -From: Daniel Vetter <daniel.vetter@ffwll.ch> - -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. - -Reviewed-by: Jani Nikula <jani.nikula@intel.com> -Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=50522 -Tested-by: Yang Guang <guang.a.yang@intel.com> -Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch> -Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> - ---- - drivers/gpu/drm/i915/intel_ringbuffer.c | 7 +++++-- - 1 file changed, 5 insertions(+), 2 deletions(-) - ---- a/drivers/gpu/drm/i915/intel_ringbuffer.c -+++ b/drivers/gpu/drm/i915/intel_ringbuffer.c -@@ -258,8 +258,6 @@ static int init_ring_common(struct intel - I915_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 */ -@@ -285,6 +283,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); -From 4344b813f105a19f793f1fd93ad775b784648b95 Mon Sep 17 00:00:00 2001 -From: Daniel Vetter <daniel.vetter@ffwll.ch> -Date: Fri, 10 Aug 2012 11:10:20 +0200 -Subject: drm/i915: ignore eDP bpc settings from vbt - -From: Daniel Vetter <daniel.vetter@ffwll.ch> - -commit 4344b813f105a19f793f1fd93ad775b784648b95 upstream. - -This has originally been introduced to not oversubscribe the dp links -in - -commit 885a5fb5b120a5c7e0b3baad7b0feb5a89f76c18 -Author: Zhenyu Wang <zhenyuw@linux.intel.com> -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. - -Reported-by: Benoit Gschwind <gschwind@gnu-log.net> -Cc: Benoit Gschwind <gschwind@gnu-log.net> -Cc: Francois Rigaut <frigaut@gmail.com> -Tested-by: Benoit Gschwind <gschwind@gnu-log.net> -Tested-by: Bernhard Froemel <froemel at vmars tuwien.ac.at> -Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch> -Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> - --- - -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(-) - ---- a/drivers/gpu/drm/i915/intel_display.c -+++ b/drivers/gpu/drm/i915/intel_display.c -@@ -4982,17 +4982,6 @@ static bool intel_choose_pipe_bpp_dither - continue; - } - -- 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) { -From 2514bc510d0c3aadcc5204056bb440fa36845147 Mon Sep 17 00:00:00 2001 -From: Jesse Barnes <jbarnes@virtuousgeek.org> -Date: Thu, 21 Jun 2012 15:13:50 -0700 -Subject: drm/i915: prefer wide & slow to fast & narrow in DP configs - -From: Jesse Barnes <jbarnes@virtuousgeek.org> - -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 -Tested-by: peter@colberg.org -Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org> -Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch> -Cc: Jonathan Nieder <jrnieder@gmail.com> -Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> - ---- - drivers/gpu/drm/i915/intel_dp.c | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - ---- a/drivers/gpu/drm/i915/intel_dp.c -+++ b/drivers/gpu/drm/i915/intel_dp.c -@@ -712,8 +712,8 @@ intel_dp_mode_fixup(struct drm_encoder * - - bpp = adjusted_mode->private_flags & INTEL_MODE_DP_FORCE_6BPC ? 18 : 24; - -- 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 (intel_dp_link_required(mode->clock, bpp) -From 35a38556d900b9cb5dfa2529c93944b847f8a8a4 Mon Sep 17 00:00:00 2001 -From: Daniel Vetter <daniel.vetter@ffwll.ch> -Date: Sun, 12 Aug 2012 22:17:14 +0200 -Subject: drm/i915: reorder edp disabling to fix ivb MacBook Air - -From: Daniel Vetter <daniel.vetter@ffwll.ch> - -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 <daniel.vetter@ffwll.ch> -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 -Tested-by: Roberto Romer <sildurin@gmail.com> -Tested-by: Daniel Wagner <wagi@monom.org> -Tested-by: Keith Packard <keithp@keithp.com> -Cc: Keith Packard <keithp@keithp.com> -Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch> -Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> - ---- - drivers/gpu/drm/i915/intel_dp.c | 14 +++++++------- - 1 file changed, 7 insertions(+), 7 deletions(-) - ---- a/drivers/gpu/drm/i915/intel_dp.c -+++ b/drivers/gpu/drm/i915/intel_dp.c -@@ -1156,10 +1156,14 @@ static void ironlake_edp_panel_off(struc - WARN(!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); - } - -@@ -1269,11 +1273,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) -@@ -1308,11 +1310,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); -From af5e7d84b0ec45b2b614b0d6e3657cbdceaa21f9 Mon Sep 17 00:00:00 2001 -From: Christoph Bumiller <e0425955@student.tuwien.ac.at> -Date: Thu, 26 Jul 2012 20:53:19 +0200 -Subject: drm/nvd0/disp: mask off high 16 bit of negative cursor x-coordinate - -From: Christoph Bumiller <e0425955@student.tuwien.ac.at> - -commit af5e7d84b0ec45b2b614b0d6e3657cbdceaa21f9 upstream. - -Signed-off-by: Christoph Bumiller <e0425955@student.tuwien.ac.at> -Signed-off-by: Ben Skeggs <bskeggs@redhat.com> -Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> - ---- - drivers/gpu/drm/nouveau/nvd0_display.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - ---- a/drivers/gpu/drm/nouveau/nvd0_display.c -+++ b/drivers/gpu/drm/nouveau/nvd0_display.c -@@ -790,7 +790,7 @@ nvd0_crtc_cursor_move(struct drm_crtc *c - struct 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; - } -From 2f292004dd1fb005788dc0a9cdd5559812ed866e Mon Sep 17 00:00:00 2001 -From: Alex Deucher <alexander.deucher@amd.com> -Date: Mon, 6 Aug 2012 10:03:59 -0400 -Subject: drm/radeon: add some new SI pci ids - -From: Alex Deucher <alexander.deucher@amd.com> - -commit 2f292004dd1fb005788dc0a9cdd5559812ed866e upstream. - -Signed-off-by: Alex Deucher <alexander.deucher@amd.com> -Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> - ---- - include/drm/drm_pciids.h | 3 +++ - 1 file changed, 3 insertions(+) - ---- a/include/drm/drm_pciids.h -+++ b/include/drm/drm_pciids.h -@@ -217,9 +217,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}, \ -From 81ee8fb6b52ec69eeed37fe7943446af1dccecc5 Mon Sep 17 00:00:00 2001 -From: Jerome Glisse <jglisse@redhat.com> -Date: Fri, 27 Jul 2012 16:32:24 -0400 -Subject: drm/radeon: do not reenable crtc after moving vram start address - -From: Jerome Glisse <jglisse@redhat.com> - -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 - -Signed-off-by: Jerome Glisse <jglisse@redhat.com> -Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> - ---- - 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(-) - ---- a/drivers/gpu/drm/radeon/evergreen.c -+++ b/drivers/gpu/drm/radeon/evergreen.c -@@ -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); - } - ---- a/drivers/gpu/drm/radeon/radeon_asic.h -+++ b/drivers/gpu/drm/radeon/radeon_asic.h -@@ -262,13 +262,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); -@@ -401,11 +398,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); ---- a/drivers/gpu/drm/radeon/rv515.c -+++ b/drivers/gpu/drm/radeon/rv515.c -@@ -281,12 +281,8 @@ int rv515_debugfs_ga_info_init(struct ra - - void 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); - } - -From 5b23c9045a8b61352986270b2d109edf5085e113 Mon Sep 17 00:00:00 2001 -From: Alex Deucher <alexander.deucher@amd.com> -Date: Tue, 31 Jul 2012 11:05:11 -0400 -Subject: drm/radeon: fix bank tiling parameters on cayman - -From: Alex Deucher <alexander.deucher@amd.com> - -commit 5b23c9045a8b61352986270b2d109edf5085e113 upstream. - -Handle the 16 bank case. - -Signed-off-by: Alex Deucher <alexander.deucher@amd.com> -Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> - ---- - drivers/gpu/drm/radeon/ni.c | 14 +++++++++++--- - 1 file changed, 11 insertions(+), 3 deletions(-) - ---- a/drivers/gpu/drm/radeon/ni.c -+++ b/drivers/gpu/drm/radeon/ni.c -@@ -880,10 +880,18 @@ static void cayman_gpu_init(struct radeo - if (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; -From c8d15edc17d836686d1f071e564800e1a2724fa6 Mon Sep 17 00:00:00 2001 -From: Alex Deucher <alexander.deucher@amd.com> -Date: Tue, 31 Jul 2012 11:01:10 -0400 -Subject: drm/radeon: fix bank tiling parameters on evergreen - -From: Alex Deucher <alexander.deucher@amd.com> - -commit c8d15edc17d836686d1f071e564800e1a2724fa6 upstream. - -Handle the 16 bank case. - -Signed-off-by: Alex Deucher <alexander.deucher@amd.com> -Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> - ---- - drivers/gpu/drm/radeon/evergreen.c | 14 +++++++++++--- - 1 file changed, 11 insertions(+), 3 deletions(-) - ---- a/drivers/gpu/drm/radeon/evergreen.c -+++ b/drivers/gpu/drm/radeon/evergreen.c -@@ -2085,10 +2085,18 @@ static void evergreen_gpu_init(struct ra - if (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 |= - ((mc_arb_ramcfg & BURSTLENGTH_MASK) >> BURSTLENGTH_SHIFT) << 8; -From 6c0ae2ab85fc4a95cae82047a7db1f688a7737ab Mon Sep 17 00:00:00 2001 -From: Alex Deucher <alexander.deucher@amd.com> -Date: Thu, 26 Jul 2012 13:38:52 -0400 -Subject: drm/radeon: properly handle crtc powergating - -From: Alex Deucher <alexander.deucher@amd.com> - -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. - -Signed-off-by: Alex Deucher <alexander.deucher@amd.com> -Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> - ---- - 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(-) - ---- a/drivers/gpu/drm/radeon/atombios_crtc.c -+++ b/drivers/gpu/drm/radeon/atombios_crtc.c -@@ -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_crtc - atombios_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) { -@@ -1634,18 +1634,28 @@ static bool atombios_crtc_mode_fixup(str - static 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) ---- a/drivers/gpu/drm/radeon/radeon_legacy_crtc.c -+++ b/drivers/gpu/drm/radeon/radeon_legacy_crtc.c -@@ -1025,9 +1025,11 @@ static int radeon_crtc_mode_set(struct d - - static 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 d - - static 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 dr - if (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 = { ---- a/drivers/gpu/drm/radeon/radeon_mode.h -+++ b/drivers/gpu/drm/radeon/radeon_mode.h -@@ -266,6 +266,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; -From 7e731bc9a12339f344cddf82166b82633d99dd86 Mon Sep 17 00:00:00 2001 -From: Theodore Ts'o <tytso@mit.edu> -Date: Sun, 5 Aug 2012 23:28:16 -0400 -Subject: ext4: avoid kmemcheck complaint from reading uninitialized memory - -From: Theodore Ts'o <tytso@mit.edu> - -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). - -Signed-off-by: "Theodore Ts'o" <tytso@mit.edu> -Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> - ---- - fs/ext4/super.c | 1 + - 1 file changed, 1 insertion(+) - ---- a/fs/ext4/super.c -+++ b/fs/ext4/super.c -@@ -932,6 +932,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; -From 89a4e48f8479f8145eca9698f39fe188c982212f Mon Sep 17 00:00:00 2001 -From: Theodore Ts'o <tytso@mit.edu> -Date: Fri, 17 Aug 2012 08:54:52 -0400 -Subject: ext4: fix kernel BUG on large-scale rm -rf commands -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -From: Theodore Ts'o <tytso@mit.edu> - -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/0xdf0 - -This 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. - -Reported-by: Maciej Żenczykowski <maze@google.com> -Reported-by: Marti Raudsepp <marti@juffo.org> -Tested-by: Fengguang Wu <fengguang.wu@intel.com> -Signed-off-by: "Theodore Ts'o" <tytso@mit.edu> -Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> - ---- - fs/ext4/extents.c | 1 + - 1 file changed, 1 insertion(+) - ---- a/fs/ext4/extents.c -+++ b/fs/ext4/extents.c -@@ -2596,6 +2596,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; -From 0548bbb85337e532ca2ed697c3e9b227ff2ed4b4 Mon Sep 17 00:00:00 2001 -From: Theodore Ts'o <tytso@mit.edu> -Date: Thu, 16 Aug 2012 11:59:04 -0400 -Subject: ext4: fix long mount times on very big file systems - -From: Theodore Ts'o <tytso@mit.edu> - -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.) - -Signed-off-by: "Theodore Ts'o" <tytso@mit.edu> -Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> - ---- - fs/ext4/super.c | 4 ++++ - 1 file changed, 4 insertions(+) - ---- a/fs/ext4/super.c -+++ b/fs/ext4/super.c -@@ -2969,6 +2969,10 @@ static int count_overhead(struct super_b - ext4_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; -From d796c52ef0b71a988364f6109aeb63d79c5b116b Mon Sep 17 00:00:00 2001 -From: Theodore Ts'o <tytso@mit.edu> -Date: Sun, 5 Aug 2012 19:04:57 -0400 -Subject: ext4: make sure the journal sb is written in ext4_clear_journal_err() - -From: Theodore Ts'o <tytso@mit.edu> - -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. - -Signed-off-by: "Theodore Ts'o" <tytso@mit.edu> -Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> - ---- - fs/ext4/super.c | 1 + - fs/jbd2/journal.c | 3 ++- - include/linux/jbd2.h | 1 + - 3 files changed, 4 insertions(+), 1 deletion(-) - ---- a/fs/ext4/super.c -+++ b/fs/ext4/super.c -@@ -4227,6 +4227,7 @@ static void ext4_clear_journal_err(struc - ext4_commit_super(sb, 1); - - jbd2_journal_clear_err(journal); -+ jbd2_journal_update_sb_errno(journal); - } - } - ---- a/fs/jbd2/journal.c -+++ b/fs/jbd2/journal.c -@@ -1340,7 +1340,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; - -@@ -1352,6 +1352,7 @@ static void jbd2_journal_update_sb_errno - - jbd2_write_superblock(journal, WRITE_SYNC); - } -+EXPORT_SYMBOL(jbd2_journal_update_sb_errno); - - /* - * Read the superblock for a given journal, performing initial ---- a/include/linux/jbd2.h -+++ b/include/linux/jbd2.h -@@ -1091,6 +1091,7 @@ extern int jbd2_journal_destroy (j - extern 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 *); -From fb6ccff667712c46b4501b920ea73a326e49626a Mon Sep 17 00:00:00 2001 -From: Zach Brown <zab@redhat.com> -Date: Tue, 24 Jul 2012 12:10:11 -0700 -Subject: fuse: verify all ioctl retry iov elements - -From: Zach Brown <zab@redhat.com> - -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. - -Signed-off-by: Zach Brown <zab@redhat.com> -Signed-off-by: Miklos Szeredi <mszeredi@suse.cz> -Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> - ---- - fs/fuse/file.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - ---- a/fs/fuse/file.c -+++ b/fs/fuse/file.c -@@ -1698,7 +1698,7 @@ static int fuse_verify_ioctl_iov(struct - size_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; -From 220329916c72ee3d54ae7262b215a050f04a18fc Mon Sep 17 00:00:00 2001 -From: Bart Van Assche <bvanassche@acm.org> -Date: Tue, 14 Aug 2012 13:18:53 +0000 -Subject: IB/srp: Fix a race condition - -From: Bart Van Assche <bvanassche@acm.org> - -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. - -Reported-by: Joseph Glanville <joseph.glanville@orionvm.com.au> -Reference: http://marc.info/?l=linux-rdma&m=134314367801595 -Acked-by: David Dillow <dillowda@ornl.gov> -Signed-off-by: Bart Van Assche <bvanassche@acm.org> -Signed-off-by: Roland Dreier <roland@purestorage.com> -Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> - ---- - drivers/infiniband/ulp/srp/ib_srp.c | 87 ++++++++++++++++++++++++++---------- - 1 file changed, 63 insertions(+), 24 deletions(-) - ---- a/drivers/infiniband/ulp/srp/ib_srp.c -+++ b/drivers/infiniband/ulp/srp/ib_srp.c -@@ -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_t - complete(&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_t - else 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) -From 38f8eefccf3a23c4058a570fa2938a4f553cf8e0 Mon Sep 17 00:00:00 2001 -From: Jason Wessel <jason.wessel@windriver.com> -Date: Sun, 12 Aug 2012 07:16:43 -0500 -Subject: pmac_zilog,kdb: Fix console poll hook to return instead of loop - -From: Jason Wessel <jason.wessel@windriver.com> - -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. - -Signed-off-by: Jason Wessel <jason.wessel@windriver.com> -Cc: Alan Cox <alan@linux.intel.com> -Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> -Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> - ---- - drivers/tty/serial/pmac_zilog.c | 12 +++++++++--- - 1 file changed, 9 insertions(+), 3 deletions(-) - ---- a/drivers/tty/serial/pmac_zilog.c -+++ b/drivers/tty/serial/pmac_zilog.c -@@ -1348,10 +1348,16 @@ static int pmz_verify_port(struct uart_p - static 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) -From a769f9577232afe2c754606a83aad85127e7052a Mon Sep 17 00:00:00 2001 -From: Jeongdo Son <sohn9086@gmail.com> -Date: Fri, 15 Jun 2012 02:28:01 +0900 -Subject: rt2x00: Add support for BUFFALO WLI-UC-GNM2 to rt2800usb. - -From: Jeongdo Son <sohn9086@gmail.com> - -commit a769f9577232afe2c754606a83aad85127e7052a upstream. - -This is a RT3070 based device. - -Signed-off-by: Jeongdo Son <sohn9086@gmail.com> -Signed-off-by: John W. Linville <linville@tuxdriver.com> -Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> - ---- - drivers/net/wireless/rt2x00/rt2800usb.c | 1 + - 1 file changed, 1 insertion(+) - ---- a/drivers/net/wireless/rt2x00/rt2800usb.c -+++ b/drivers/net/wireless/rt2x00/rt2800usb.c -@@ -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) }, -From 82aabdb6f1eb61e0034ec23901480f5dd23db7c4 Mon Sep 17 00:00:00 2001 -From: Heiko Carstens <heiko.carstens@de.ibm.com> -Date: Tue, 7 Aug 2012 09:48:13 +0200 -Subject: s390/compat: fix compat wrappers for process_vm system calls - -From: Heiko Carstens <heiko.carstens@de.ibm.com> - -commit 82aabdb6f1eb61e0034ec23901480f5dd23db7c4 upstream. - -The compat wrappers incorrectly called the non compat versions of -the system process_vm system calls. - -Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com> -Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com> -Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> - ---- - arch/s390/kernel/compat_wrapper.S | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - ---- a/arch/s390/kernel/compat_wrapper.S -+++ b/arch/s390/kernel/compat_wrapper.S -@@ -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 -From e85871218513c54f7dfdb6009043cb638f2fecbe Mon Sep 17 00:00:00 2001 -From: Heiko Carstens <heiko.carstens@de.ibm.com> -Date: Wed, 8 Aug 2012 09:32:20 +0200 -Subject: s390/compat: fix mmap compat system calls - -From: Heiko Carstens <heiko.carstens@de.ibm.com> - -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. - -Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com> -Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com> -Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> - ---- - arch/s390/kernel/compat_linux.c | 2 -- - 1 file changed, 2 deletions(-) - ---- a/arch/s390/kernel/compat_linux.c -+++ b/arch/s390/kernel/compat_linux.c -@@ -612,7 +612,6 @@ asmlinkage unsigned long old32_mmap(stru - return -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); - } -@@ -623,7 +622,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); - } - -From d81a5d1956731c453b85c141458d4ff5d6cc5366 Mon Sep 17 00:00:00 2001 -From: Gustavo Padovan <gustavo.padovan@collabora.co.uk> -Date: Tue, 10 Jul 2012 19:10:06 -0300 -Subject: USB: add USB_VENDOR_AND_INTERFACE_INFO() macro - -From: Gustavo Padovan <gustavo.padovan@collabora.co.uk> - -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) } - -Signed-off-by: Marcel Holtmann <marcel@holtmann.org> -Signed-off-by: Gustavo Padovan <gustavo.padovan@collabora.co.uk> -Acked-by: Henrik Rydberg <rydberg@bitmath.se> -Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> - ---- - include/linux/usb.h | 21 +++++++++++++++++++++ - 1 file changed, 21 insertions(+) - ---- a/include/linux/usb.h -+++ b/include/linux/usb.h -@@ -783,6 +783,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 */ -From 7724a1edbe463b06d4e7831a41149ba095b16c53 Mon Sep 17 00:00:00 2001 -From: Ozan Çağlayan <ozancag@gmail.com> -Date: Fri, 10 Aug 2012 17:25:10 +0300 -Subject: USB: ftdi_sio: Add VID/PID for Kondo Serial USB - -From: Ozan Çağlayan <ozancag@gmail.com> - -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. - -Signed-off-by: Ozan Çağlayan <ozancag@gmail.com> -Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> - ---- - drivers/usb/serial/ftdi_sio.c | 1 + - drivers/usb/serial/ftdi_sio_ids.h | 7 +++++++ - 2 files changed, 8 insertions(+) - ---- a/drivers/usb/serial/ftdi_sio.c -+++ b/drivers/usb/serial/ftdi_sio.c -@@ -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 }, ---- a/drivers/usb/serial/ftdi_sio_ids.h -+++ b/drivers/usb/serial/ftdi_sio_ids.h -@@ -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/ - */ -From b1b552a69b8805e7e338074a9e8b670b4a795218 Mon Sep 17 00:00:00 2001 -From: Michael Grzeschik <m.grzeschik@pengutronix.de> -Date: Wed, 8 Aug 2012 11:48:10 +0200 -Subject: usb: gadget: u_ether: fix kworker 100% CPU issue with still used interfaces in eth_stop - -From: Michael Grzeschik <m.grzeschik@pengutronix.de> - -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(). - -Cc: Tatyana Brokhman <tlinder@codeaurora.org> -Signed-off-by: Michael Grzeschik <m.grzeschik@pengutronix.de> -Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de> -Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> - ---- - drivers/usb/gadget/u_ether.c | 6 ++++++ - 1 file changed, 6 insertions(+) - ---- a/drivers/usb/gadget/u_ether.c -+++ b/drivers/usb/gadget/u_ether.c -@@ -669,6 +669,8 @@ static int eth_stop(struct net_device *n - spin_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); - } -From f1b5c997e68533df1f96dcd3068a231bca495603 Mon Sep 17 00:00:00 2001 -From: Bjørn Mork <bjorn@mork.no> -Date: Wed, 15 Aug 2012 15:43:33 +0200 -Subject: USB: option: add ZTE K5006-Z - -From: Bjørn Mork <bjorn@mork.no> - -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. - -Signed-off-by: Bjørn Mork <bjorn@mork.no> -Cc: Thomas Schäfer <tschaefer@t-online.de> -Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> - ---- - drivers/usb/serial/option.c | 2 ++ - 1 file changed, 2 insertions(+) - ---- a/drivers/usb/serial/option.c -+++ b/drivers/usb/serial/option.c -@@ -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) }, -From 5c263b92f828af6a8cf54041db45ceae5af8f2ab Mon Sep 17 00:00:00 2001 -From: Mark Ferrell <mferrell@uplogix.com> -Date: Tue, 24 Jul 2012 14:15:13 -0500 -Subject: usb: serial: mos7840: Fixup mos7840_chars_in_buffer() - -From: Mark Ferrell <mferrell@uplogix.com> - -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. - -Signed-off-by: Mark Ferrell <mferrell@uplogix.com> -Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> - ---- - drivers/usb/serial/mos7840.c | 9 ++++++--- - 1 file changed, 6 insertions(+), 3 deletions(-) - ---- a/drivers/usb/serial/mos7840.c -+++ b/drivers/usb/serial/mos7840.c -@@ -1189,9 +1189,12 @@ static int mos7840_chars_in_buffer(struc - } - - 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; -From ee6f827df9107139e8960326e49e1376352ced4d Mon Sep 17 00:00:00 2001 -From: fangxiaozhi <huananhu@huawei.com> -Date: Wed, 8 Aug 2012 09:24:45 +0000 -Subject: USB: support the new interfaces of Huawei Data Card devices in option driver - -From: fangxiaozhi <huananhu@huawei.com> - -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. - -Signed-off-by: fangxiaozhi <huananhu@huawei.com> -Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> - ---- - drivers/usb/serial/option.c | 279 +++++++++++++++++--------------------------- - 1 file changed, 111 insertions(+), 168 deletions(-) - ---- a/drivers/usb/serial/option.c -+++ b/drivers/usb/serial/option.c -@@ -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) }, -From b9e0d95c041ca2d7ad297ee37c2e9cfab67a188f Mon Sep 17 00:00:00 2001 -From: Stefano Stabellini <stefano.stabellini@eu.citrix.com> -Date: Wed, 23 May 2012 18:57:20 +0100 -Subject: xen: mark local pages as FOREIGN in the m2p_override - -From: Stefano Stabellini <stefano.stabellini@eu.citrix.com> - -commit b9e0d95c041ca2d7ad297ee37c2e9cfab67a188f upstream. - -When the frontend and the backend reside on the same domain, even if we -add pages to the m2p_override, these pages will never be returned by -mfn_to_pfn because the check "get_phys_to_machine(pfn) != mfn" will -always fail, so the pfn of the frontend will be returned instead -(resulting in a deadlock because the frontend pages are already locked). - -INFO: task qemu-system-i38:1085 blocked for more than 120 seconds. -"echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. -qemu-system-i38 D ffff8800cfc137c0 0 1085 1 0x00000000 - ffff8800c47ed898 0000000000000282 ffff8800be4596b0 00000000000137c0 - ffff8800c47edfd8 ffff8800c47ec010 00000000000137c0 00000000000137c0 - ffff8800c47edfd8 00000000000137c0 ffffffff82213020 ffff8800be4596b0 -Call Trace: - [<ffffffff81101ee0>] ? __lock_page+0x70/0x70 - [<ffffffff81a0fdd9>] schedule+0x29/0x70 - [<ffffffff81a0fe80>] io_schedule+0x60/0x80 - [<ffffffff81101eee>] sleep_on_page+0xe/0x20 - [<ffffffff81a0e1ca>] __wait_on_bit_lock+0x5a/0xc0 - [<ffffffff81101ed7>] __lock_page+0x67/0x70 - [<ffffffff8106f750>] ? autoremove_wake_function+0x40/0x40 - [<ffffffff811867e6>] ? bio_add_page+0x36/0x40 - [<ffffffff8110b692>] set_page_dirty_lock+0x52/0x60 - [<ffffffff81186021>] bio_set_pages_dirty+0x51/0x70 - [<ffffffff8118c6b4>] do_blockdev_direct_IO+0xb24/0xeb0 - [<ffffffff811e71a0>] ? ext3_get_blocks_handle+0xe00/0xe00 - [<ffffffff8118ca95>] __blockdev_direct_IO+0x55/0x60 - [<ffffffff811e71a0>] ? ext3_get_blocks_handle+0xe00/0xe00 - [<ffffffff811e91c8>] ext3_direct_IO+0xf8/0x390 - [<ffffffff811e71a0>] ? ext3_get_blocks_handle+0xe00/0xe00 - [<ffffffff81004b60>] ? xen_mc_flush+0xb0/0x1b0 - [<ffffffff81104027>] generic_file_aio_read+0x737/0x780 - [<ffffffff813bedeb>] ? gnttab_map_refs+0x15b/0x1e0 - [<ffffffff811038f0>] ? find_get_pages+0x150/0x150 - [<ffffffff8119736c>] aio_rw_vect_retry+0x7c/0x1d0 - [<ffffffff811972f0>] ? lookup_ioctx+0x90/0x90 - [<ffffffff81198856>] aio_run_iocb+0x66/0x1a0 - [<ffffffff811998b8>] do_io_submit+0x708/0xb90 - [<ffffffff81199d50>] sys_io_submit+0x10/0x20 - [<ffffffff81a18d69>] system_call_fastpath+0x16/0x1b - -The explanation is in the comment within the code: - -We need to do this because the pages shared by the frontend -(xen-blkfront) can be already locked (lock_page, called by -do_read_cache_page); when the userspace backend tries to use them -with direct_IO, mfn_to_pfn returns the pfn of the frontend, so -do_blockdev_direct_IO is going to try to lock the same pages -again resulting in a deadlock. - -A simplified call graph looks like this: - -pygrub QEMU ------------------------------------------------ -do_read_cache_page io_submit - | | -lock_page ext3_direct_IO - | - bio_add_page - | - lock_page - -Internally the xen-blkback uses m2p_add_override to swizzle (temporarily) -a 'struct page' to have a different MFN (so that it can point to another -guest). It also can easily find out whether another pfn corresponding -to the mfn exists in the m2p, and can set the FOREIGN bit -in the p2m, making sure that mfn_to_pfn returns the pfn of the backend. - -This allows the backend to perform direct_IO on these pages, but as a -side effect prevents the frontend from using get_user_pages_fast on -them while they are being shared with the backend. - -Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com> -Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> -Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> - ---- - arch/x86/xen/p2m.c | 36 ++++++++++++++++++++++++++++++++++++ - 1 file changed, 36 insertions(+) - ---- a/arch/x86/xen/p2m.c -+++ b/arch/x86/xen/p2m.c -@@ -686,6 +686,7 @@ int m2p_add_override(unsigned long mfn, - unsigned long uninitialized_var(address); - unsigned level; - pte_t *ptep = NULL; -+ int ret = 0; - - pfn = page_to_pfn(page); - if (!PageHighMem(page)) { -@@ -721,6 +722,24 @@ int m2p_add_override(unsigned long mfn, - list_add(&page->lru, &m2p_overrides[mfn_hash(mfn)]); - spin_unlock_irqrestore(&m2p_override_lock, flags); - -+ /* p2m(m2p(mfn)) == mfn: the mfn is already present somewhere in -+ * this domain. Set the FOREIGN_FRAME_BIT in the p2m for the other -+ * pfn so that the following mfn_to_pfn(mfn) calls will return the -+ * pfn from the m2p_override (the backend pfn) instead. -+ * We need to do this because the pages shared by the frontend -+ * (xen-blkfront) can be already locked (lock_page, called by -+ * do_read_cache_page); when the userspace backend tries to use them -+ * with direct_IO, mfn_to_pfn returns the pfn of the frontend, so -+ * do_blockdev_direct_IO is going to try to lock the same pages -+ * again resulting in a deadlock. -+ * As a side effect get_user_pages_fast might not be safe on the -+ * frontend pages while they are being shared with the backend, -+ * because mfn_to_pfn (that ends up being called by GUPF) will -+ * return the backend pfn rather than the frontend pfn. */ -+ ret = __get_user(pfn, &machine_to_phys_mapping[mfn]); -+ if (ret == 0 && get_phys_to_machine(pfn) == mfn) -+ set_phys_to_machine(pfn, FOREIGN_FRAME(mfn)); -+ - return 0; - } - EXPORT_SYMBOL_GPL(m2p_add_override); -@@ -732,6 +751,7 @@ int m2p_remove_override(struct page *pag - unsigned long uninitialized_var(address); - unsigned level; - pte_t *ptep = NULL; -+ int ret = 0; - - pfn = page_to_pfn(page); - mfn = get_phys_to_machine(pfn); -@@ -801,6 +821,22 @@ int m2p_remove_override(struct page *pag - } else - set_phys_to_machine(pfn, page->index); - -+ /* p2m(m2p(mfn)) == FOREIGN_FRAME(mfn): the mfn is already present -+ * somewhere in this domain, even before being added to the -+ * m2p_override (see comment above in m2p_add_override). -+ * If there are no other entries in the m2p_override corresponding -+ * to this mfn, then remove the FOREIGN_FRAME_BIT from the p2m for -+ * the original pfn (the one shared by the frontend): the backend -+ * cannot do any IO on this page anymore because it has been -+ * unshared. Removing the FOREIGN_FRAME_BIT from the p2m entry of -+ * the original pfn causes mfn_to_pfn(mfn) to return the frontend -+ * pfn again. */ -+ mfn &= ~FOREIGN_FRAME_BIT; -+ ret = __get_user(pfn, &machine_to_phys_mapping[mfn]); -+ if (ret == 0 && get_phys_to_machine(pfn) == FOREIGN_FRAME(mfn) && -+ m2p_find_override(mfn) == NULL) -+ set_phys_to_machine(pfn, mfn); -+ - return 0; - } - EXPORT_SYMBOL_GPL(m2p_remove_override); -From 5cb7df2b2d3afee7638b3ef23a5bcb89c6f07bd9 Mon Sep 17 00:00:00 2001 -From: Sarah Sharp <sarah.a.sharp@linux.intel.com> -Date: Mon, 2 Jul 2012 13:36:23 -0700 -Subject: xhci: Add Etron XHCI_TRUST_TX_LENGTH quirk. - -From: Sarah Sharp <sarah.a.sharp@linux.intel.com> - -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." - -Signed-off-by: Sarah Sharp <sarah.a.sharp@linux.intel.com> -Reported-by: Gary E. Miller <gem@rellim.com> -Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> - ---- - drivers/usb/host/xhci-pci.c | 1 + - 1 file changed, 1 insertion(+) - ---- a/drivers/usb/host/xhci-pci.c -+++ b/drivers/usb/host/xhci-pci.c -@@ -95,6 +95,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; -From 50d0206fcaea3e736f912fd5b00ec6233fb4ce44 Mon Sep 17 00:00:00 2001 -From: Sarah Sharp <sarah.a.sharp@linux.intel.com> -Date: Thu, 26 Jul 2012 12:03:59 -0700 -Subject: xhci: Fix bug after deq ptr set to link TRB. - -From: Sarah Sharp <sarah.a.sharp@linux.intel.com> - -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. - -Signed-off-by: Sarah Sharp <sarah.a.sharp@linux.intel.com> -Tested-by: James Ettle <theholyettlz@googlemail.com> -Tested-by: Matthew Hall <mhall@mhcomputing.net> -Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> - ---- - drivers/usb/host/xhci-ring.c | 36 ++++++++++++++++++++++-------------- - 1 file changed, 22 insertions(+), 14 deletions(-) - ---- a/drivers/usb/host/xhci-ring.c -+++ b/drivers/usb/host/xhci-ring.c -@@ -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); - } - -From 22ceac191211cf6688b1bf6ecd93c8b6bf80ed9b Mon Sep 17 00:00:00 2001 -From: Sarah Sharp <sarah.a.sharp@linux.intel.com> -Date: Mon, 23 Jul 2012 16:06:08 -0700 -Subject: xhci: Increase reset timeout for Renesas 720201 host. - -From: Sarah Sharp <sarah.a.sharp@linux.intel.com> - -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." - -Signed-off-by: Sarah Sharp <sarah.a.sharp@linux.intel.com> -Reported-by: Edwin Klein Mentink <e.kleinmentink@zonnet.nl> -Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> - ---- - drivers/usb/host/xhci.c | 5 +++-- - 1 file changed, 3 insertions(+), 2 deletions(-) - ---- a/drivers/usb/host/xhci.c -+++ b/drivers/usb/host/xhci.c -@@ -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; -From e95829f474f0db3a4d940cae1423783edd966027 Mon Sep 17 00:00:00 2001 -From: Sarah Sharp <sarah.a.sharp@linux.intel.com> -Date: Mon, 23 Jul 2012 18:59:30 +0300 -Subject: xhci: Switch PPT ports to EHCI on shutdown. - -From: Sarah Sharp <sarah.a.sharp@linux.intel.com> - -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." - -Signed-off-by: Sarah Sharp <sarah.a.sharp@linux.intel.com> -Reported-by: Denis Turischev <denis@compulab.co.il> -Tested-by: Denis Turischev <denis@compulab.co.il> -Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> - ---- - 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(+) - ---- a/drivers/usb/host/pci-quirks.c -+++ b/drivers/usb/host/pci-quirks.c -@@ -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. - * ---- a/drivers/usb/host/pci-quirks.h -+++ b/drivers/usb/host/pci-quirks.h -@@ -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) {} ---- a/drivers/usb/host/xhci-pci.c -+++ b/drivers/usb/host/xhci-pci.c -@@ -90,6 +90,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) { ---- a/drivers/usb/host/xhci.c -+++ b/drivers/usb/host/xhci.c -@@ -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); ---- a/drivers/usb/host/xhci.h -+++ b/drivers/usb/host/xhci.h -@@ -1486,6 +1486,7 @@ struct xhci_hcd { - #define XHCI_SW_BW_CHECKING (1 << 8) - #define XHCI_AMD_0x96_HOST (1 << 9) - #define XHCI_TRUST_TX_LENGTH (1 << 10) -+#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 */ diff --git a/freed-ora/current/f16/patch-3.4-gnu-3.4.10-gnu.xz.sign b/freed-ora/current/f16/patch-3.4-gnu-3.4.10-gnu.xz.sign new file mode 100644 index 000000000..79b8c1adf --- /dev/null +++ b/freed-ora/current/f16/patch-3.4-gnu-3.4.10-gnu.xz.sign @@ -0,0 +1,7 @@ +-----BEGIN PGP SIGNATURE----- +Version: GnuPG v2.0.18 (GNU/Linux) + +iEYEABECAAYFAlA73cEACgkQvLfPh359R6c2/wCfdaTkzgzIxzvh2+lkUtUfvBEm +N0IAoJ/2yOYm2gumfYa+Kg6J0azRGMLA +=NdKJ +-----END PGP SIGNATURE----- diff --git a/freed-ora/current/f16/patch-3.4-gnu-3.4.9-gnu.xz.sign b/freed-ora/current/f16/patch-3.4-gnu-3.4.9-gnu.xz.sign deleted file mode 100644 index db9b3b878..000000000 --- a/freed-ora/current/f16/patch-3.4-gnu-3.4.9-gnu.xz.sign +++ /dev/null @@ -1,7 +0,0 @@ ------BEGIN PGP SIGNATURE----- -Version: GnuPG v2.0.18 (GNU/Linux) - -iEYEABECAAYFAlAsDmsACgkQvLfPh359R6fL4gCfTKKhYbKsFSH6zomLualEXteb -G28Anjvle/bBHx0wFa89ixOzn34T/xCx -=w1RY ------END PGP SIGNATURE----- diff --git a/freed-ora/current/f16/sources b/freed-ora/current/f16/sources index 0ea65caa0..c59029843 100644 --- a/freed-ora/current/f16/sources +++ b/freed-ora/current/f16/sources @@ -1 +1,2 @@ a5e128ca059cceb8b69148b41ff4ac6f linux-libre-3.4-gnu.tar.xz +bf1581a4b88e4641d6ce73d56751e8d7 patch-3.4-gnu-3.4.10-gnu.xz |