On 09/22/2016 05:33 AM, Bin Liu wrote:

On Sun, Sep 18, 2016 at 06:50:18PM +0200, Hans de Goede wrote:
The sunxi musb has a bug where sometimes it will generate a babble
error on device disconnect instead of a disconnect irq. When this
happens the musb-controller switches from host mode to device mode
gets stuck in this state.

Clearing this requires reporting Vbus low for 200 or more ms, but
on some devices Vbus is simply always high (host-only mode, no Vbus

This commit calls sun4i_usb_phy_force_session_end() on babble errors
in host-mode, fixing the musb controller being stuck in this state
on systems without Vbus control; and also fixes the need to unplug
the usb-b -> usb-a cable to get out of this state on systems with
Vbus control.

Signed-off-by: Hans de Goede <hdego...@redhat.com>
 drivers/usb/musb/sunxi.c | 10 ++++++++++
 1 file changed, 10 insertions(+)

diff --git a/drivers/usb/musb/sunxi.c b/drivers/usb/musb/sunxi.c
index 1408245..5079d90 100644
--- a/drivers/usb/musb/sunxi.c
+++ b/drivers/usb/musb/sunxi.c
@@ -192,8 +192,18 @@ static irqreturn_t sunxi_musb_interrupt(int irq, void 
         * normally babble never happens treat it as disconnect.
        if ((musb->int_usb & MUSB_INTR_BABBLE) && is_host_active(musb)) {

musb_interrupt() handle BABBLE in host mode, and has a glue hook
musb_platform_recover() in musb_recover_from_babble().

Maybe you can use it?

Ah yes, I looked at this at the past, but that was before the babble
recover rework by Felipe Balbi which got commited on 2015-03-10.

With this rework the sunxi code should indeed be able to use the core
recovery, and we can use the musb_platform_recover() to force a
session end.

And thinking more about you're other remark, I do think I can
actually modify the sun4i phy_set_mode callback so that it can
be used for this.

I'll post a v2 with these changes soon-ish.



+               struct sunxi_glue *glue =
+                               dev_get_drvdata(musb->controller->parent);
+               dev_warn(musb->controller->parent, "babble, treating as 
                musb->int_usb &= ~MUSB_INTR_BABBLE;
                musb->int_usb |= MUSB_INTR_DISCONNECT;
+               /*
+                * Fix the musb controller sometimes getting stuck in
+                * bdevice state after a babble error.
+                */
+               sun4i_usb_phy_force_session_end(glue->phy);

As I commented in PATCH 1/2, can you somehow reuse
sun4i_usb_phy_set_mode() instead?


        if ((musb->int_usb & MUSB_INTR_RESET) && !is_host_active(musb)) {


To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to