1. 25 11月, 2014 6 次提交
  2. 18 11月, 2014 4 次提交
    • G
      usb: musb: core: Disable the Interrupts till BABBLE is fully handled · f905bc68
      George Cherian 提交于
      Disable the MUSB interrupts till MUSB is recovered fully from BABBLE
      condition. There are chances that we could get multiple interrupts
      till the time the babble recover work gets scheduled. Sometimes
      this could even end up in an endless loop making MUSB itself unusable.
      Reported-by: NFelipe Balbi <balbi@ti.com>
      Signed-off-by: NGeorge Cherian <george.cherian@ti.com>
      Signed-off-by: NFelipe Balbi <balbi@ti.com>
      f905bc68
    • S
      usb: musb: musb_cppi41: recognize HS devices in hostmode · 1eec34e9
      Sebastian Andrzej Siewior 提交于
      There is a poll loop for max 25us for HS devices. Now guess what, I
      tested it in gadget mode and forgot about the little detail. Nobody seem
      to have it noticed…
      This patch adds the missing logic for hostmode so it is recognized in
      host and device mode properly.
      
      Fixes: 50aea6fc ("usb: musb: cppi41: fire hrtimer according to
      programmed channel length")
      Signed-off-by: NSebastian Andrzej Siewior <bigeasy@linutronix.de>
      Signed-off-by: NFelipe Balbi <balbi@ti.com>
      1eec34e9
    • R
      usb: musb: replace hard coded registers with defines · c2365ce5
      Roman Byshko 提交于
      musb registers can be dumped using the file regdump
      which is created in debugfs. Up to now  hard coded
      register addresses are used for that. Different glue
      layers however have different register addresses. The
      patch addresses this issue by substituting bare register
      addresses with defines.
      Signed-off-by: NRoman Byshko <rbyshko@gmail.com>
      Signed-off-by: NFelipe Balbi <balbi@ti.com>
      c2365ce5
    • S
      usb: musb: core: make sure musb is in RPM_ACTIVE on resume · a1fc1920
      Sebastian Andrzej Siewior 提交于
      On am335x-evm with musb in host mode and using it as a wakeup source the
      following happens once the CPU comes out of suspend to ram:
      |PM: Wakeup source MPU_WAKE
      |PM: noirq resume of devices complete after 15.453 msecs
      |PM: early resume of devices complete after 2.222 msecs
      |PM: resume of devices complete after 507.351 msecs
      |Restarting tasks ...
      |------------[ cut here ]------------
      |WARNING: CPU: 0 PID: 322 at drivers/usb/core/urb.c:339 usb_submit_urb+0x494/0x4c8()
      |URB cc0db380 submitted while active
      |[<c0348e64>] (usb_submit_urb) from [<c0340f94>] (hub_activate+0x2b8/0x49c)
      |[<c0340f94>] (hub_activate) from [<c03411dc>] (hub_resume+0x14/0x1c)
      |[<c03411dc>] (hub_resume) from [<c034be10>] (usb_resume_interface.isra.4+0xdc/0x110)
      |[<c034be10>] (usb_resume_interface.isra.4) from [<c034beb0>] (usb_resume_both+0x6c/0x13c)
      |[<c034beb0>] (usb_resume_both) from [<c034cca4>] (usb_runtime_resume+0x10/0x14)
      |[<c034cca4>] (usb_runtime_resume) from [<c02bbd80>] (__rpm_callback+0x2c/0x60)
      |[<c02bbd80>] (__rpm_callback) from [<c02bbdd4>] (rpm_callback+0x20/0x74)
      |[<c02bbdd4>] (rpm_callback) from [<c02bcc48>] (rpm_resume+0x380/0x548)
      |[<c02bcc48>] (rpm_resume) from [<c02bcb00>] (rpm_resume+0x238/0x548)
      |[<c02bcb00>] (rpm_resume) from [<c02bd08c>] (__pm_runtime_resume+0x64/0x94)
      |[<c02bd08c>] (__pm_runtime_resume) from [<c034b5a4>] (usb_autopm_get_interface+0x18/0x5c)
      |[<c034b5a4>] (usb_autopm_get_interface) from [<c03438b8>] (hub_thread+0x10c/0x115c)
      |[<c03438b8>] (hub_thread) from [<c005a70c>] (kthread+0xbc/0xd8)
      |---[ end trace 036aa5fe78203142 ]---
      |hub 1-0:1.0: activate --> -16
      |hub 2-0:1.0: activate --> -16
      
      The reason for this backtrace is the attempt of the USB code to resume
      the HUB twice and thus enqueue the status URB twice.
      Alan Stern was a great help by explaining how the USB code supposed to
      work and what is most likely the problem. The root problem is that after
      resume the musb runtime-suspend state remains RPM_SUSPENDED.
      According to git log it RPM was added for the omap2430 platform. If I
      understand it correct the omap2430 invokes a get on musb once a cable is
      connected and a put once the cable is gone. In between the device could
      go auto-idle/off. Not sure what happens when the device goes into suspend
      but then I guess it was gadget only.
      On DSPS I see only a get in probe and put in remove function. This would
      forbid RPM from working but then the devices enterns suspended state
      anyway :)
      
      To get rid of this warning, I set the device state to RPM_ACTIVE which
      the expected state.
      
      Cc: Alan Stern <stern@rowland.harvard.edu>
      Cc: <stable@vger.kernel.org>
      Signed-off-by: NSebastian Andrzej Siewior <bigeasy@linutronix.de>
      Signed-off-by: NFelipe Balbi <balbi@ti.com>
      a1fc1920
  3. 11 11月, 2014 1 次提交
  4. 06 11月, 2014 2 次提交
    • S
      usb: musb: try a race-free wakeup · baadd52f
      Sebastian Andrzej Siewior 提交于
      Attaching a keyboard, using it as a wakeup via
      |for f in $(find /sys/devices/ocp.3/47400000.usb -name wakeup)
      |do
      |	echo enabled > $f
      |done
      
      going into standby
      |  echo standby >  /sys/power/state
      
      and now a wake up by a pressing a key.
      What happens is that the system wakes up but the USB device is dead. The
      USB stack tries to send a few control URBs but nothing comes back.
      Eventually it gaves up and the device remains dead:
      |[  632.559678] PM: Wakeup source USB1_PHY
      |[  632.581074] PM: noirq resume of devices complete after 21.261 msecs
      |[  632.607521] PM: early resume of devices complete after 10.360 msecs
      |[  632.616854] net eth2: initializing cpsw version 1.12 (0)
      |[  632.704126] net eth2: phy found : id is : 0x4dd074
      |[  636.704048] libphy: 4a101000.mdio:00 - Link is Up - 1000/Full
      |[  638.444620] usb 1-1: reset low-speed USB device number 2 using musb-hdrc
      |[  653.713435] usb 1-1: device descriptor read/64, error -110
      |[  669.093435] usb 1-1: device descriptor read/64, error -110
      |[  669.473424] usb 1-1: reset low-speed USB device number 2 using musb-hdrc
      |[  684.743436] usb 1-1: device descriptor read/64, error -110
      |[  690.065097] PM: resume of devices complete after 57450.744 msecs
      |[  690.076601] PM: Finishing wakeup.
      |[  690.076627] Restarting tasks ...
      
      It seems that since we got woken up via MUSB_INTR_RESUME the
      musb_host_finish_resume() callback is executed before the
      resume-callbacks of the PHY and glue layer are invoked. If I delay it
      until the glue layer resumed then I don't see this problem.
      
      I also move musb_host_resume_root_hub() into that callback since I don't
      see any reason in doing anything resume-link if there are still pieces
      not restored.
      Signed-off-by: NSebastian Andrzej Siewior <bigeasy@linutronix.de>
      Signed-off-by: NFelipe Balbi <balbi@ti.com>
      baadd52f
    • S
      usb: musb: core: check link status on resume · b87fd2f7
      Sebastian Andrzej Siewior 提交于
      The am335x-evmsk support two kinds of suspend:
      - standby
        the USB device remains powered while the system goes into suspend
      
      - mem
        the USB device becomes powerless while the system goes into suspend.
      
      In the "standby" case the device resumes quickly. In the "mem" case the
      system hangs for a few seconds. It seems to me that the USB-device has
      no address (it was disconnected) and the USB stack thinks that it is
      fully operational and GetPortStatus returns the status from before the
      suspend so it is not a big help here.
      
      This adds a check in the resume path to see if the device mode (A or B)
      and the speed is the same. If the device went missing between
      suspend/resume (VBUS went down) then MUSB seems to go into B mode and
      HS/FS bits are cleared. In that case we clear the port1_status bits and
      assume a disconnect. Once the stack learns this it does a "logical
      disconnect" and removes the USB-device quickly. Should the device remain
      connected during the suspend then MUSB will receives a "CONNECT" interrupt.
      Signed-off-by: NSebastian Andrzej Siewior <bigeasy@linutronix.de>
      Signed-off-by: NFelipe Balbi <balbi@ti.com>
      b87fd2f7
  5. 04 11月, 2014 15 次提交
  6. 23 10月, 2014 3 次提交
    • S
      usb: musb: musb_dsps: fix NULL pointer in suspend · f042e9cb
      Sebastian Andrzej Siewior 提交于
      So testing managed to configure musb in DMA mode but not load the
      matching cppi41 driver for DMA. This results in
      
      |musb-hdrc musb-hdrc.0.auto: Failed to request rx1.
      |musb-hdrc musb-hdrc.0.auto: musb_init_controller failed with status -517
      |platform musb-hdrc.0.auto: Driver musb-hdrc requests probe deferral
      
      which is "okay". Once the driver is loaded we re-try probing and
      everyone is happy. Until then if you try suspend say
          echo mem > /sys/power/state
      then you go boom
      
      |Unable to handle kernel NULL pointer dereference at virtual address 000003a4
      |pgd = cf50c000
      |[000003a4] *pgd=8f6a3831, *pte=00000000, *ppte=00000000
      |Internal error: Oops: 17 [#1] ARM
      |PC is at dsps_suspend+0x18/0x9c [musb_dsps]
      |LR is at dsps_suspend+0x18/0x9c [musb_dsps]
      |pc : [<bf08e268>] lr : [<bf08e268>] psr: a0000013
      |sp : cbd97e00 ip : c0af4394 fp : 00000000
      |r10: c0831d90 r9 : 00000002 r8 : cf6da410
      |r7 : c03ba4dc r6 : bf08f224 r5 : 00000000 r4 : cbc5fcd0
      |r3 : bf08e250 r2 : bf08f264 r1 : cf6da410 r0 : 00000000
      |[<bf08e268>] (dsps_suspend [musb_dsps]) from [<c03ba508>] (platform_pm_suspend+0x2c/0x54)
      |Code: e1a04000 e9900041 e2800010 eb4caa8e (e59053a4)
      
      because platform_get_drvdata(glue->musb) returns a NULL pointer as long as the
      device is not fully probed.
      Tested-by: NGeorge Cherian <george.cherian@ti.com>
      Signed-off-by: NSebastian Andrzej Siewior <bigeasy@linutronix.de>
      Signed-off-by: NFelipe Balbi <balbi@ti.com>
      f042e9cb
    • S
      usb: musb: dsps: start OTG timer on resume again · 53185b3a
      Sebastian Andrzej Siewior 提交于
      Commit 468bcc2a ("usb: musb: dsps: kill OTG timer on suspend") stopped
      the timer in suspend path but forgot the re-enable it in the resume
      path. This patch fixes the behaviour.
      
      Cc: <stable@vger.kernel.org> # v3.14+
      Fixes 468bcc2a "usb: musb: dsps: kill OTG timer on suspend"
      Signed-off-by: NSebastian Andrzej Siewior <bigeasy@linutronix.de>
      Signed-off-by: NFelipe Balbi <balbi@ti.com>
      53185b3a
    • T
      usb: musb: cppi41: restart hrtimer only if not yet done · d2e6d62c
      Thomas Gleixner 提交于
      commit c58d80f5 ("usb: musb: Ensure that cppi41 timer gets armed on
      premature DMA TX irq") fixed hrtimer scheduling bug. There is one left
      which does not trigger that often.
      The following scenario is still possible:
      
          lock(&x->lock);
          hrtimer_start(&x->t);
          unlock(&x->lock);
      
      expires:
          t->function();
                                      lock(&x->lock);
          lock(&x->lock);             if (!hrtimer_queued(&x->t))
                                              hrtimer_start(&x->t);
                                      unlock(&x->lock);
      
          if (!list_empty(x->early_tx_list))
                 ret = HRTIMER_RESTART;
      ->         hrtimer_forward_now(...)
          } else
                 ret = HRTIMER_NORESTART;
      
          unlock(&x->lock);
      
      and the timer callback returns HRTIMER_RESTART for an armed timer. This
      is wrong and we run into the BUG_ON() in __run_hrtimer().
      This can happens on SMP or PREEMPT-RT.
      The patch fixes the problem by only starting the timer if the timer is
      not yet queued.
      
      Cc: stable@vger.kernel.org
      Reported-by: NTorben Hohn <torbenh@linutronix.de>
      Signed-off-by: NThomas Gleixner <tglx@linutronix.de>
      [bigeasy: collected information and created a patch + description based
                on it]
      Signed-off-by: NSebastian Andrzej Siewior <bigeasy@linutronix.de>
      Signed-off-by: NFelipe Balbi <balbi@ti.com>
      d2e6d62c
  7. 25 9月, 2014 1 次提交
  8. 24 9月, 2014 2 次提交
  9. 16 9月, 2014 1 次提交
  10. 05 9月, 2014 1 次提交
  11. 03 9月, 2014 1 次提交
  12. 19 8月, 2014 1 次提交
  13. 16 7月, 2014 2 次提交