1. 26 Sep, 2013 14 commits
    • Shengzhou Liu's avatar
      USB: fsl/ehci: fix failure of checking PHY_CLK_VALID during reinitialization · eee41b49
      Shengzhou Liu authored
      In case of usb phy reinitialization:
      e.g. insmod usb-module(usb works well) -> rmmod usb-module -> insmod usb-module
      It found the PHY_CLK_VALID bit didn't work if it's not with the power-on reset.
      So we just check PHY_CLK_VALID bit during the stage with POR, this can be met
      by the tricky of checking FSL_SOC_USB_PRICTRL register.
      Signed-off-by: default avatarShengzhou Liu <Shengzhou.Liu@freescale.com>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      eee41b49
    • Al Viro's avatar
      USB: Fix breakage in ffs_fs_mount() · 2606b28a
      Al Viro authored
      	There's a bunch of failure exits in ffs_fs_mount() with
      seriously broken recovery logics.  Most of that appears to stem
      from misunderstanding of the ->kill_sb() semantics; unlike
      ->put_super() it is called for *all* superblocks of given type,
      no matter how (in)complete the setup had been.  ->put_super()
      is called only if ->s_root is not NULL; any failure prior to
      setting ->s_root will have the call of ->put_super() skipped.
      ->kill_sb(), OTOH, awaits every superblock that has come from
      sget().
      
      Current behaviour of ffs_fs_mount():
      
      We have struct ffs_sb_fill_data data on stack there.  We do
      	ffs_dev = functionfs_acquire_dev_callback(dev_name);
      and store that in data.private_data.  Then we call mount_nodev(),
      passing it ffs_sb_fill() as a callback.  That will either fail
      outright, or manage to call ffs_sb_fill().  There we allocate an
      instance of struct ffs_data, slap the value of ffs_dev (picked
      from data.private_data) into ffs->private_data and overwrite
      data.private_data by storing ffs into an overlapping member
      (data.ffs_data).  Then we store ffs into sb->s_fs_info and attempt
      to set the rest of the things up (root inode, root dentry, then
      create /ep0 there).  Any of those might fail.  Should that
      happen, we get ffs_fs_kill_sb() called before mount_nodev()
      returns.  If mount_nodev() fails for any reason whatsoever,
      we proceed to
      	functionfs_release_dev_callback(data.ffs_data);
      
      That's broken in a lot of ways.  Suppose the thing has failed in
      allocation of e.g. root inode or dentry.  We have
      	functionfs_release_dev_callback(ffs);
      	ffs_data_put(ffs);
      done by ffs_fs_kill_sb() (ffs accessed via sb->s_fs_info), followed by
      	functionfs_release_dev_callback(ffs);
      from ffs_fs_mount() (via data.ffs_data).  Note that the second
      functionfs_release_dev_callback() has every chance to be done to freed memory.
      
      Suppose we fail *before* root inode allocation.  What happens then?
      ffs_fs_kill_sb() doesn't do anything to ffs (it's either not called at all,
      or it doesn't have a pointer to ffs stored in sb->s_fs_info).  And
      	functionfs_release_dev_callback(data.ffs_data);
      is called by ffs_fs_mount(), but here we are in nasal daemon country - we
      are reading from a member of union we'd never stored into.  In practice,
      we'll get what we used to store into the overlapping field, i.e. ffs_dev.
      And then we get screwed, since we treat it (struct gfs_ffs_obj * in
      disguise, returned by functionfs_acquire_dev_callback()) as struct
      ffs_data *, pick what would've been ffs_data ->private_data from it
      (*well* past the actual end of the struct gfs_ffs_obj - struct ffs_data
      is much bigger) and poke in whatever it points to.
      
      FWIW, there's a minor leak on top of all that in case if ffs_sb_fill()
      fails on kstrdup() - ffs is obviously forgotten.
      
      The thing is, there is no point in playing all those games with union.
      Just allocate and initialize ffs_data *before* calling mount_nodev() and
      pass a pointer to it via data.ffs_data.  And once it's stored in
      sb->s_fs_info, clear data.ffs_data, so that ffs_fs_mount() knows that
      it doesn't need to kill the sucker manually - from that point on
      we'll have it done by ->kill_sb().
      Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
      Acked-by: default avatarMichal Nazarewicz <mina86@mina86.com>
      Cc: stable <stable@vger.kernel.org> # 3.3+
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      2606b28a
    • Ramneek Mehresh's avatar
      fsl/usb: Resolve PHY_CLK_VLD instability issue for ULPI phy · ad1260e9
      Ramneek Mehresh authored
      For controller versions greater than 1.6, setting ULPI_PHY_CLK_SEL
      bit when USB_EN bit is already set causes instability issues with
      PHY_CLK_VLD bit. So USB_EN is set only for IP controller version
      below 1.6 before setting ULPI_PHY_CLK_SEL bit
      Signed-off-by: default avatarRamneek Mehresh <ramneek.mehresh@freescale.com>
      Cc: stable <stable@vger.kernel.org>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      ad1260e9
    • Kurt Garloff's avatar
      usb/core/devio.c: Don't reject control message to endpoint with wrong direction bit · 831abf76
      Kurt Garloff authored
      Trying to read data from the Pegasus Technologies NoteTaker (0e20:0101)
      [1] with the Windows App (EasyNote) works natively but fails when
      Windows is running under KVM (and the USB device handed to KVM).
      
      The reason is a USB control message
       usb 4-2.2: control urb: bRequestType=22 bRequest=09 wValue=0200 wIndex=0001 wLength=0008
      This goes to endpoint address 0x01 (wIndex); however, endpoint address
      0x01 does not exist. There is an endpoint 0x81 though (same number,
      but other direction); the app may have meant that endpoint instead.
      
      The kernel thus rejects the IO and thus we see the failure.
      
      Apparently, Linux is more strict here than Windows ... we can't change
      the Win app easily, so that's a problem.
      
      It seems that the Win app/driver is buggy here and the driver does not
      behave fully according to the USB HID class spec that it claims to
      belong to.  The device seems to happily deal with that though (and
      seems to not really care about this value much).
      
      So the question is whether the Linux kernel should filter here.
      Rejecting has the risk that somewhat non-compliant userspace apps/
      drivers (most likely in a virtual machine) are prevented from working.
      Not rejecting has the risk of confusing an overly sensitive device with
      such a transfer. Given the fact that Windows does not filter it makes
      this risk rather small though.
      
      The patch makes the kernel more tolerant: If the endpoint address in
      wIndex does not exist, but an endpoint with toggled direction bit does,
      it will let the transfer through. (It does NOT change the message.)
      
      With attached patch, the app in Windows in KVM works.
       usb 4-2.2: check_ctrlrecip: process 13073 (qemu-kvm) requesting ep 01 but needs 81
      
      I suspect this will mostly affect apps in virtual environments; as on
      Linux the apps would have been adapted to the stricter handling of the
      kernel. I have done that for mine[2].
      
      [1] http://www.pegatech.com/
      [2] https://sourceforge.net/projects/notetakerpen/Signed-off-by: default avatarKurt Garloff <kurt@garloff.de>
      Acked-by: default avatarAlan Stern <stern@rowland.harvard.edu>
      Cc: stable <stable@vger.kernel.org>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      831abf76
    • Geert Uytterhoeven's avatar
      usb: chipidea: USB_CHIPIDEA should depend on HAS_DMA · 2c740336
      Geert Uytterhoeven authored
      If NO_DMA=y:
      
      drivers/built-in.o: In function `dma_set_coherent_mask':
      include/linux/dma-mapping.h:93: undefined reference to `dma_supported'
      Reviewed-and-tested-by: default avatarPeter Chen <peter.chen@freescale.com>
      Signed-off-by: default avatarGeert Uytterhoeven <geert@linux-m68k.org>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      2c740336
    • Peter Chen's avatar
      usb: chipidea: udc: free pending TD at removal procedure · e7ef5265
      Peter Chen authored
      There is a pending TD which is not freed after request finishes,
      we do this due to a controller bug. This TD needs to be freed when
      the driver is removed. It prints below error message when unload
      chipidea driver at current code:
      "ci_hdrc ci_hdrc.0: dma_pool_destroy ci_hw_td, b0001000 busy"
      It indicates the buffer at dma pool are still in use.
      
      This commit will free the pending TD at driver's removal procedure,
      it can fix the problem described above.
      Acked-by: default avatarMichael Grzeschik <m.grzeschik@pengutronix.de>
      Signed-off-by: default avatarPeter Chen <peter.chen@freescale.com>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      e7ef5265
    • Peter Chen's avatar
      usb: chipidea: imx: Add usb_phy_shutdown at probe's error path · 3a254fea
      Peter Chen authored
      If not, the PHY will be active even the controller is not in use.
      We find this issue due to the PHY's clock refcount is not correct
      due to -EPROBE_DEFER return after phy's init.
      Signed-off-by: default avatarPeter Chen <peter.chen@freescale.com>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      3a254fea
    • Peter Chen's avatar
      usb: chipidea: Fix memleak for ci->hw_bank.regmap when removal · 222bed9b
      Peter Chen authored
      It needs to free ci->hw_bank.regmap explicitly since it is not managed
      resource.
      Signed-off-by: default avatarPeter Chen <peter.chen@freescale.com>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      222bed9b
    • Peter Chen's avatar
      usb: chipidea: udc: fix the oops after rmmod gadget · f84839da
      Peter Chen authored
      When we rmmod gadget, the ci->driver needs to be cleared.
      Otherwise, when we plug in usb cable again, the driver will
      consider gadget is there, and go to enumeration procedure,
      but in fact, it was removed.
      
      ci_hdrc ci_hdrc.0: Connected to host
      Unable to handle kernel paging request at virtual address 7f02a42c
      pgd = 80004000
      [7f02a42c] *pgd=3f13d811, *pte=00000000, *ppte=00000000
      Internal error: Oops: 7 [#1] SMP ARM
      Modules linked in: usb_f_acm u_serial libcomposite configfs [last unloaded: g_serial]
      CPU: 0 PID: 0 Comm: swapper/0 Not tainted 3.10.0+ #42
      task: 807dba88 ti: 807d0000 task.ti: 807d0000
      PC is at udc_irq+0x8fc/0xea4
      LR is at l2x0_cache_sync+0x5c/0x6c
      pc : [<803de7f4>]    lr : [<8001d0f0>]    psr: 20000193
      sp : 807d1d98  ip : 807d1d80  fp : 807d1df4
      r10: af809900  r9 : 808184d4  r8 : 00080001
      r7 : 00082001  r6 : afb711f8  r5 : afb71010  r4 : ffffffea
      r3 : 7f02a41c  r2 : afb71010  r1 : 807d1dc0  r0 : afb71068
      Flags: nzCv  IRQs off  FIQs on  Mode SVC_32  ISA ARM  Segment kernel
      Control: 10c53c7d  Table: 3f01804a  DAC: 00000017
      Process swapper/0 (pid: 0, stack limit = 0x807d0238)
      Stack: (0x807d1d98 to 0x807d2000)
      1d80:                                                       00000000 afb71014
      1da0: 000040f6 00000000 00000001 00000000 00007530 00000000 afb71010 001dcd65
      1dc0: 01000680 00400000 807d1e2c afb71010 0000004e 00000000 00000000 0000004b
      1de0: 808184d4 af809900 807d1e0c 807d1df8 803dbc24 803ddf04 afba75c0 0000004e
      1e00: 807d1e44 807d1e10 8007a19c 803dbb9c 8108e7e0 8108e7e0 9ceddce0 af809900
      1e20: 0000004e 807d0000 0000004b 00000000 00000010 00000000 807d1e5c 807d1e48
      1e40: 8007a334 8007a154 af809900 0000004e 807d1e74 807d1e60 8007d3b4 8007a2f0
      1e60: 0000004b 807cce3c 807d1e8c 807d1e78 80079b08 8007d300 00000180 807d8ba0
      1e80: 807d1eb4 807d1e90 8000eef4 80079aec 00000000 f400010c 807d8ce4 807d1ed8
      1ea0: f4000100 96d5c75d 807d1ed4 807d1eb8 80008600 8000eeac 8042699c 60000013
      1ec0: ffffffff 807d1f0c 807d1f54 807d1ed8 8000e180 800085dc 807d1f20 00000046
      1ee0: 9cedd275 00000010 8108f080 807de294 00000001 807de248 96d5c75d 00000010
      1f00: 00000000 807d1f54 00000000 807d1f20 8005ff54 8042699c 60000013 ffffffff
      1f20: 9cedd275 00000010 00000005 8108f080 8108f080 00000001 807de248 8086bd00
      1f40: 807d0000 00000001 807d1f7c 807d1f58 80426af0 80426950 807d0000 00000000
      1f60: 808184c0 808184c0 807d8954 805b886c 807d1f8c 807d1f80 8000f294 80426a44
      1f80: 807d1fac 807d1f90 8005f110 8000f288 807d1fac 807d8908 805b4748 807dc86c
      1fa0: 807d1fbc 807d1fb0 805aa58c 8005f068 807d1ff4 807d1fc0 8077c860 805aa530
      1fc0: ffffffff ffffffff 8077c330 00000000 00000000 807bef88 00000000 10c53c7d
      1fe0: 807d88d0 807bef84 00000000 807d1ff8 10008074 8077c594 00000000 00000000
      Backtrace:
      [<803ddef8>] (udc_irq+0x0/0xea4) from [<803dbc24>] (ci_irq+0x94/0x14c)
      [<803dbb90>] (ci_irq+0x0/0x14c) from [<8007a19c>] (handle_irq_event_percpu+0x54/0x19c)
       r5:0000004e r4:afba75c0
       [<8007a148>] (handle_irq_event_percpu+0x0/0x19c) from [<8007a334>] (handle_irq_event+0x50/0x70)
      [<8007a2e4>] (handle_irq_event+0x0/0x70) from [<8007d3b4>] (handle_fasteoi_irq+0xc0/0x16c)
       r5:0000004e r4:af809900
       [<8007d2f4>] (handle_fasteoi_irq+0x0/0x16c) from [<80079b08>] (generic_handle_irq+0x28/0x38)
       r5:807cce3c r4:0000004b
       [<80079ae0>] (generic_handle_irq+0x0/0x38) from [<8000eef4>] (handle_IRQ+0x54/0xb4)
       r4:807d8ba0 r3:00000180
       [<8000eea0>] (handle_IRQ+0x0/0xb4) from [<80008600>] (gic_handle_irq+0x30/0x64)
       r8:96d5c75d r7:f4000100 r6:807d1ed8 r5:807d8ce4 r4:f400010c
       r3:00000000
       [<800085d0>] (gic_handle_irq+0x0/0x64) from [<8000e180>] (__irq_svc+0x40/0x54)
      Exception stack(0x807d1ed8 to 0x807d1f20)
      1ec0:                                                       807d1f20 00000046
      1ee0: 9cedd275 00000010 8108f080 807de294 00000001 807de248 96d5c75d 00000010
      1f00: 00000000 807d1f54 00000000 807d1f20 8005ff54 8042699c 60000013 ffffffff
       r7:807d1f0c r6:ffffffff r5:60000013 r4:8042699c
       [<80426944>] (cpuidle_enter_state+0x0/0xf4) from [<80426af0>] (cpuidle_idle_call+0xb8/0x174)
       r9:00000001 r8:807d0000 r7:8086bd00 r6:807de248 r5:00000001
       r4:8108f080
       [<80426a38>] (cpuidle_idle_call+0x0/0x174) from [<8000f294>] (arch_cpu_idle+0x18/0x5c)
      [<8000f27c>] (arch_cpu_idle+0x0/0x5c) from [<8005f110>] (cpu_startup_entry+0xb4/0x148)
      [<8005f05c>] (cpu_startup_entry+0x0/0x148) from [<805aa58c>] (rest_init+0x68/0x80)
       r7:807dc86c
       [<805aa524>] (rest_init+0x0/0x80) from [<8077c860>] (start_kernel+0x2d8/0x334)
      [<8077c588>] (start_kernel+0x0/0x334) from [<10008074>] (0x10008074)
      Code: e59031e0 e51b203c e24b1034 e2820058 (e5933010)
      ---[ end trace f874b2c5533c04bc ]---
      Kernel panic - not syncing: Fatal exception in interrupt
      Tested-by: default avatarMarek Vasut <marex@denx.de>
      Acked-by: default avatarShawn Guo <shawn.guo@linaro.org>
      Signed-off-by: default avatarPeter Chen <peter.chen@freescale.com>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      f84839da
    • Alan Stern's avatar
      USB: fix PM config symbol in uhci-hcd, ehci-hcd, and xhci-hcd · f875fdbf
      Alan Stern authored
      Since uhci-hcd, ehci-hcd, and xhci-hcd support runtime PM, the .pm
      field in their pci_driver structures should be protected by CONFIG_PM
      rather than CONFIG_PM_SLEEP.  The corresponding change has already
      been made for ohci-hcd.
      
      Without this change, controllers won't do runtime suspend if system
      suspend or hibernation isn't enabled.
      Signed-off-by: default avatarAlan Stern <stern@rowland.harvard.edu>
      CC: Sarah Sharp <sarah.a.sharp@linux.intel.com>
      CC: <stable@vger.kernel.org>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      f875fdbf
    • Alan Stern's avatar
      USB: OHCI: accept very late isochronous URBs · a8693424
      Alan Stern authored
      Commit 24f53137 (USB: EHCI: accept very late isochronous URBs)
      changed the isochronous API provided by ehci-hcd.  URBs submitted too
      late, so that the time slots for all their packets have already
      expired, are no longer rejected outright.  Instead the submission is
      accepted, and the URB completes normally with a -EXDEV error for each
      packet.  This is what client drivers expect.
      
      This patch implements the same policy in ohci-hcd.  The change is more
      complicated than it was in ehci-hcd, because ohci-hcd doesn't scan for
      isochronous completions in the same way as ehci-hcd does.  Rather, it
      depends on the hardware adding completed TDs to a "done queue".  Some
      OHCI controller don't handle this properly when a TD's time slot has
      already expired, so we have to avoid adding such TDs to the schedule
      in the first place.  As a result, if the URB was submitted too late
      then none of its TDs will get put on the schedule, so none of them
      will end up on the done queue, so the driver will never realize that
      the URB should be completed.
      
      To solve this problem, the patch adds one to urb_priv->td_cnt for such
      URBs, making it larger than urb_priv->length (td_cnt already gets set
      to the number of TD's that had to be skipped because their slots have
      expired).  Each time an URB is given back, the finish_urb() routine
      looks to see if urb_priv->td_cnt for the next URB on the same endpoint
      is marked in this way.  If so, it gives back the next URB right away.
      
      This should be applied to all kernels containing commit 815fa7b9
      (USB: OHCI: fix logic for scheduling isochronous URBs).
      Signed-off-by: default avatarAlan Stern <stern@rowland.harvard.edu>
      CC: <stable@vger.kernel.org>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      a8693424
    • Alan Stern's avatar
      USB: UHCI: accept very late isochronous URBs · bef073b0
      Alan Stern authored
      Commit 24f53137 (USB: EHCI: accept very late isochronous URBs)
      changed the isochronous API provided by ehci-hcd.  URBs submitted too
      late, so that the time slots for all their packets have already
      expired, are no longer rejected outright.  Instead the submission is
      accepted, and the URB completes normally with a -EXDEV error for each
      packet.  This is what client drivers expect.
      
      This patch implements the same policy in uhci-hcd.  It should be
      applied to all kernels containing commit c44b2250 (UHCI: implement
      new semantics for URB_ISO_ASAP).
      Signed-off-by: default avatarAlan Stern <stern@rowland.harvard.edu>
      CC: <stable@vger.kernel.org>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      bef073b0
    • Alan Stern's avatar
      USB: iMX21: accept very late isochronous URBs · 8937669f
      Alan Stern authored
      Commit 24f53137 (USB: EHCI: accept very late isochronous URBs)
      changed the isochronous API provided by ehci-hcd.  URBs submitted too
      late, so that the time slots for all their packets have already
      expired, are no longer rejected outright.  Instead the submission is
      accepted, and the URB completes normally with a -EXDEV error for each
      packet.  This is what client drivers expect.
      
      The same policy should be implemented in imx21-hcd, but I don't know
      enough about the hardware to do it.  As a second-best substitute, this
      patch treats very late isochronous submissions as though the
      URB_ISO_ASAP flag were set.  I don't have any way to test this change,
      unfortunately.
      Signed-off-by: default avatarAlan Stern <stern@rowland.harvard.edu>
      CC: Sascha Hauer <kernel@pengutronix.de>
      CC: Martin Fuzzey <mfuzzey@gmail.com>
      Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      8937669f
    • Greg Kroah-Hartman's avatar
      Merge tag 'for-usb-linus-2013-09-23' of... · eefb3dd7
      Greg Kroah-Hartman authored
      Merge tag 'for-usb-linus-2013-09-23' of git://git.kernel.org/pub/scm/linux/kernel/git/sarah/xhci into usb-linus
      
      Sarah writes:
      
      xhci: Bug fixes for 3.12.
      
      Hi Greg,
      
      Here's five bug fixes for 3.12.
      
      The first two bugs fix issues with the command cancellation handling,
      which can lead to oopses or the xHCI driver attempting to handle
      previously-completed transfers.  People have been running into oopses
      and odd behavior with command cancellation for a couple kernel releases,
      so they're marked for stable.
      
      The third patch fixes an issue with USB remote wakeup under xHCI that
      can only be reproduced under ChromeOS.  As discussed, this fix is not
      urgent, and isn't marked for stable.
      
      The fourth patch fixes a race condition between URB cancellation and
      userspace clearing an endpoint stall.  The fifth patch removes some
      annoying dmesg spam when a USB 3.0 device is disconnected, by avoiding
      sending a Set SEL request.
      
      Sarah Sharp
      eefb3dd7
  2. 23 Sep, 2013 9 commits
    • Xenia Ragiadakou's avatar
      usbcore: check usb device's state before sending a Set SEL control transfer · 38d7f688
      Xenia Ragiadakou authored
      Set SEL control urbs cannot be sent to a device in unconfigured state.
      This patch adds a check in usb_req_set_sel() to ensure the usb device's
      state is USB_STATE_CONFIGURED.
      Signed-off-by: default avatarXenia Ragiadakou <burzalodowa@gmail.com>
      Reported-by: default avatarMartin MOKREJS <mmokrejs@gmail.com>
      Suggested-by: default avatarSarah Sharp <sarah.a.sharp@linux.intel.com>
      Signed-off-by: default avatarSarah Sharp <sarah.a.sharp@linux.intel.com>
      38d7f688
    • Florian Wolter's avatar
      xhci: Fix race between ep halt and URB cancellation · 526867c3
      Florian Wolter authored
      The halted state of a endpoint cannot be cleared over CLEAR_HALT from a
      user process, because the stopped_td variable was overwritten in the
      handle_stopped_endpoint() function. So the xhci_endpoint_reset() function will
      refuse the reset and communication with device can not run over this endpoint.
      https://bugzilla.kernel.org/show_bug.cgi?id=60699Signed-off-by: default avatarFlorian Wolter <wolly84@web.de>
      Signed-off-by: default avatarSarah Sharp <sarah.a.sharp@linux.intel.com>
      526867c3
    • Sarah Sharp's avatar
      usb: Fix xHCI host issues on remote wakeup. · 8b3d4570
      Sarah Sharp authored
      When a device signals remote wakeup on a roothub, and the suspend change
      bit is set, the host controller driver must not give control back to the
      USB core until the port goes back into the active state.
      
      EHCI accomplishes this by waiting in the get port status function until
      the PORT_RESUME bit is cleared:
      
                              /* stop resume signaling */
                              temp &= ~(PORT_RWC_BITS | PORT_SUSPEND | PORT_RESUME);
                              ehci_writel(ehci, temp, status_reg);
                              clear_bit(wIndex, &ehci->resuming_ports);
                              retval = ehci_handshake(ehci, status_reg,
                                              PORT_RESUME, 0, 2000 /* 2msec */);
      
      Similarly, the xHCI host should wait until the port goes into U0, before
      passing control up to the USB core.  When the port transitions from the
      RExit state to U0, the xHCI driver will get a port status change event.
      We need to wait for that event before passing control up to the USB
      core.
      
      After the port transitions to the active state, the USB core should time
      a recovery interval before it talks to the device.  The length of that
      recovery interval is TRSMRCY, 10 ms, mentioned in the USB 2.0 spec,
      section 7.1.7.7.  The previous xHCI code (which did not wait for the
      port to go into U0) would cause the USB core to violate that recovery
      interval.
      
      This bug caused numerous USB device disconnects on remote wakeup under
      ChromeOS and a Lynx Point LP xHCI host that takes up to 20 ms to move
      from RExit to U0.  ChromeOS is very aggressive about power savings, and
      sets the autosuspend_delay to 100 ms, and disables USB persist.
      
      I attempted to replicate this bug with Ubuntu 12.04, but could not.  I
      used Ubuntu 12.04 on the same platform, with the same BIOS that the bug
      was triggered on ChromeOS with.  I also changed the USB sysfs settings
      as described above, but still could not reproduce the bug under Ubuntu.
      It may be that ChromeOS userspace triggers this bug through additional
      settings.
      Signed-off-by: default avatarSarah Sharp <sarah.a.sharp@linux.intel.com>
      8b3d4570
    • Mathias Nyman's avatar
      xhci: Ensure a command structure points to the correct trb on the command ring · ec7e43e2
      Mathias Nyman authored
      If a command on the command ring needs to be cancelled before it is handled
      it can be turned to a no-op operation when the ring is stopped.
      We want to store the command ring enqueue pointer in the command structure
      when the command in enqueued for the cancellation case.
      
      Some commands used to store the command ring dequeue pointers instead of enqueue
      (these often worked because enqueue happends to equal dequeue quite often)
      
      Other commands correctly used the enqueue pointer but did not check if it pointed
      to a valid trb or a link trb, this caused for example stop endpoint command to timeout in
      xhci_stop_device() in about 2% of suspend/resume cases.
      
      This should also solve some weird behavior happening in command cancellation cases.
      
      This patch is based on a patch submitted by Sarah Sharp to linux-usb, but
      then forgotten:
          http://marc.info/?l=linux-usb&m=136269803207465&w=2
      
      This patch should be backported to kernels as old as 3.7, that contain
      the commit b92cc66c "xHCI: add aborting
      command ring function"
      Signed-off-by: default avatarMathias Nyman <mathias.nyman@linux.intel.com>
      Signed-off-by: default avatarSarah Sharp <sarah.a.sharp@linux.intel.com>
      Cc: stable@vger.kernel.org
      ec7e43e2
    • Mathias Nyman's avatar
      xhci: Fix oops happening after address device timeout · 284d2055
      Mathias Nyman authored
      When a command times out, the command ring is first aborted,
      and then stopped. If the command ring is empty when it is stopped
      the stop event will point to next command which is not yet set.
      xHCI tries to handle this next event often causing an oops.
      
      Don't handle command completion events on stopped cmd ring if ring is
      empty.
      
      This patch should be backported to kernels as old as 3.7, that contain
      the commit b92cc66c "xHCI: add aborting
      command ring function"
      Signed-off-by: default avatarMathias Nyman <mathias.nyman@linux.intel.com>
      Reported-by: default avatarGiovanni <giovanni.nervi@yahoo.com>
      Signed-off-by: default avatarSarah Sharp <sarah.a.sharp@linux.intel.com>
      Cc: stable@vger.kernel.org
      284d2055
    • Linus Torvalds's avatar
      Linux 3.12-rc2 · 4a10c2ac
      Linus Torvalds authored
      4a10c2ac
    • Linus Torvalds's avatar
      Merge tag 'staging-3.12-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging · 9d23108d
      Linus Torvalds authored
      Pull staging fixes from Greg KH:
       "Here are a number of small staging tree and iio driver fixes.  Nothing
        major, just lots of little things"
      
      * tag 'staging-3.12-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging: (34 commits)
        iio:buffer_cb: Add missing iio_buffer_init()
        iio: Prevent race between IIO chardev opening and IIO device free
        iio: fix: Keep a reference to the IIO device for open file descriptors
        iio: Stop sampling when the device is removed
        iio: Fix crash when scan_bytes is computed with active_scan_mask == NULL
        iio: Fix mcp4725 dev-to-indio_dev conversion in suspend/resume
        iio: Fix bma180 dev-to-indio_dev conversion in suspend/resume
        iio: Fix tmp006 dev-to-indio_dev conversion in suspend/resume
        iio: iio_device_add_event_sysfs() bugfix
        staging: iio: ade7854-spi: Fix return value
        staging:iio:hmc5843: Fix measurement conversion
        iio: isl29018: Fix uninitialized value
        staging:iio:dummy fix kfifo_buf kconfig dependency issue if kfifo modular and buffer enabled for built in dummy driver.
        iio: at91: fix adc_clk overflow
        staging: line6: add bounds check in snd_toneport_source_put()
        Staging: comedi: Fix dependencies for drivers misclassified as PCI
        staging: r8188eu: Adjust RX gain
        staging: r8188eu: Fix smatch warning in core/rtw_ieee80211.
        staging: r8188eu: Fix smatch error in core/rtw_mlme_ext.c
        staging: r8188eu: Fix Smatch off-by-one warning in hal/rtl8188e_hal_init.c
        ...
      9d23108d
    • Linus Torvalds's avatar
      Merge tag 'usb-3.12-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb · e04a0a5a
      Linus Torvalds authored
      Pull USB fixes from Greg KH:
       "Here are a number of small USB fixes for 3.12-rc2.
      
        One is a revert of a EHCI change that isn't quite ready for 3.12.
        Others are minor things, gadget fixes, Kconfig fixes, and some quirks
        and documentation updates.
      
        All have been in linux-next for a bit"
      
      * tag 'usb-3.12-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb:
        USB: pl2303: distinguish between original and cloned HX chips
        USB: Faraday fotg210: fix email addresses
        USB: fix typo in usb serial simple driver Kconfig
        Revert "USB: EHCI: support running URB giveback in tasklet context"
        usb: s3c-hsotg: do not disconnect gadget when receiving ErlySusp intr
        usb: s3c-hsotg: fix unregistration function
        usb: gadget: f_mass_storage: reset endpoint driver data when disabled
        usb: host: fsl-mph-dr-of: Staticize local symbols
        usb: gadget: f_eem: Staticize eem_alloc
        usb: gadget: f_ecm: Staticize ecm_alloc
        usb: phy: omap-usb3: Fix return value
        usb: dwc3: gadget: avoid memory leak when failing to allocate all eps
        usb: dwc3: remove extcon dependency
        usb: gadget: add '__ref' for rndis_config_register() and cdc_config_register()
        usb: dwc3: pci: add support for BayTrail
        usb: gadget: cdc2: fix conversion to new interface of f_ecm
        usb: gadget: fix a bug and a WARN_ON in dummy-hcd
        usb: gadget: mv_u3d_core: fix violation of locking discipline in mv_u3d_ep_disable()
      e04a0a5a
    • Linus Torvalds's avatar
      Merge branch 'drm-fixes' of git://people.freedesktop.org/~airlied/linux · d8524ae9
      Linus Torvalds authored
      Pull drm fixes from Dave Airlie:
       - some small fixes for msm and exynos
       - a regression revert affecting nouveau users with old userspace
       - intel pageflip deadlock and gpu hang fixes, hsw modesetting hangs
      
      * 'drm-fixes' of git://people.freedesktop.org/~airlied/linux: (22 commits)
        Revert "drm: mark context support as a legacy subsystem"
        drm/i915: Don't enable the cursor on a disable pipe
        drm/i915: do not update cursor in crtc mode set
        drm/exynos: fix return value check in lowlevel_buffer_allocate()
        drm/exynos: Fix address space warnings in exynos_drm_fbdev.c
        drm/exynos: Fix address space warning in exynos_drm_buf.c
        drm/exynos: Remove redundant OF dependency
        drm/msm: drop unnecessary set_need_resched()
        drm/i915: kill set_need_resched
        drm/msm: fix potential NULL pointer dereference
        drm/i915/dvo: set crtc timings again for panel fixed modes
        drm/i915/sdvo: Robustify the dtd<->drm_mode conversions
        drm/msm: workaround for missing irq
        drm/msm: return -EBUSY if bo still active
        drm/msm: fix return value check in ERR_PTR()
        drm/msm: fix cmdstream size check
        drm/msm: hangcheck harder
        drm/msm: handle read vs write fences
        drm/i915/sdvo: Fully translate sync flags in the dtd->mode conversion
        drm/i915: Use proper print format for debug prints
        ...
      d8524ae9
  3. 22 Sep, 2013 3 commits
    • Linus Torvalds's avatar
      Merge branch 'for-3.12/core' of git://git.kernel.dk/linux-block · 68cf8d0c
      Linus Torvalds authored
      Pull block IO fixes from Jens Axboe:
       "After merge window, no new stuff this time only a collection of neatly
        confined and simple fixes"
      
      * 'for-3.12/core' of git://git.kernel.dk/linux-block:
        cfq: explicitly use 64bit divide operation for 64bit arguments
        block: Add nr_bios to block_rq_remap tracepoint
        If the queue is dying then we only call the rq->end_io callout. This leaves bios setup on the request, because the caller assumes when the blk_execute_rq_nowait/blk_execute_rq call has completed that the rq->bios have been cleaned up.
        bio-integrity: Fix use of bs->bio_integrity_pool after free
        blkcg: relocate root_blkg setting and clearing
        block: Convert kmalloc_node(...GFP_ZERO...) to kzalloc_node(...)
        block: trace all devices plug operation
      68cf8d0c
    • Linus Torvalds's avatar
      Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mason/linux-btrfs · 0fbf2cc9
      Linus Torvalds authored
      Pull btrfs fixes from Chris Mason:
       "These are mostly bug fixes and a two small performance fixes.  The
        most important of the bunch are Josef's fix for a snapshotting
        regression and Mark's update to fix compile problems on arm"
      
      * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mason/linux-btrfs: (25 commits)
        Btrfs: create the uuid tree on remount rw
        btrfs: change extent-same to copy entire argument struct
        Btrfs: dir_inode_operations should use btrfs_update_time also
        btrfs: Add btrfs: prefix to kernel log output
        btrfs: refuse to remount read-write after abort
        Btrfs: btrfs_ioctl_default_subvol: Revert back to toplevel subvolume when arg is 0
        Btrfs: don't leak transaction in btrfs_sync_file()
        Btrfs: add the missing mutex unlock in write_all_supers()
        Btrfs: iput inode on allocation failure
        Btrfs: remove space_info->reservation_progress
        Btrfs: kill delay_iput arg to the wait_ordered functions
        Btrfs: fix worst case calculator for space usage
        Revert "Btrfs: rework the overcommit logic to be based on the total size"
        Btrfs: improve replacing nocow extents
        Btrfs: drop dir i_size when adding new names on replay
        Btrfs: replay dir_index items before other items
        Btrfs: check roots last log commit when checking if an inode has been logged
        Btrfs: actually log directory we are fsync()'ing
        Btrfs: actually limit the size of delalloc range
        Btrfs: allocate the free space by the existed max extent size when ENOSPC
        ...
      0fbf2cc9
    • Anatol Pomozov's avatar
      cfq: explicitly use 64bit divide operation for 64bit arguments · f3cff25f
      Anatol Pomozov authored
      'samples' is 64bit operant, but do_div() second parameter is 32.
      do_div silently truncates high 32 bits and calculated result
      is invalid.
      
      In case if low 32bit of 'samples' are zeros then do_div() produces
      kernel crash.
      Signed-off-by: default avatarAnatol Pomozov <anatol.pomozov@gmail.com>
      Acked-by: default avatarTejun Heo <tj@kernel.org>
      Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
      f3cff25f
  4. 21 Sep, 2013 14 commits