On 9/20/2017 11:57 PM, John Stultz wrote: > We've found that while in host mode, using Android, if one runs > the command: > stop adbd > > The existing usb devices being utilized in host mode are disconnected. > This is most visible with usb networking devices. > > This seems to be due to adbd closing the file: > /dev/usb-ffs/adb/ep0 > Which calls ffs_ep0_release() and the following backtrace: > > [<ffffff800875a430>] dwc2_hsotg_ep_disable+0x148/0x150 > [<ffffff800875a498>] dwc2_hsotg_udc_stop+0x60/0x110 > [<ffffff8008787950>] usb_gadget_remove_driver+0x58/0x78 > [<ffffff80087879e4>] usb_gadget_unregister_driver+0x74/0xe8 > [<ffffff80087850c0>] unregister_gadget+0x28/0x58 > [<ffffff800878511c>] unregister_gadget_item+0x2c/0x40 > [<ffffff8008790ea8>] ffs_data_clear+0xe8/0xf8 > [<ffffff8008790ed8>] ffs_data_reset+0x20/0x58 > [<ffffff8008793218>] ffs_data_closed+0x98/0xe8 > [<ffffff80087932d8>] ffs_ep0_release+0x20/0x30 > > Then when dwc2_hsotg_ep_disable() is called, we call > kill_all_requests() which causes a bunch of the following > messages: > > dwc2 f72c0000.usb: Mode Mismatch Interrupt: currently in Host mode > dwc2 f72c0000.usb: Mode Mismatch Interrupt: currently in Host mode > dwc2 f72c0000.usb: Mode Mismatch Interrupt: currently in Host mode > dwc2 f72c0000.usb: Mode Mismatch Interrupt: currently in Host mode > dwc2 f72c0000.usb: Mode Mismatch Interrupt: currently in Host mode > dwc2 f72c0000.usb: Mode Mismatch Interrupt: currently in Host mode > dwc2 f72c0000.usb: Mode Mismatch Interrupt: currently in Host mode > dwc2 f72c0000.usb: Mode Mismatch Interrupt: currently in Host mode > init: Service 'adbd' (pid 1915) killed by signal 9 > init: Sending signal 9 to service 'adbd' (pid 1915) process group... > init: Successfully killed process cgroup uid 0 pid 1915 in 0ms > init: processing action (init.svc.adbd=stopped) from (/init.usb.configfs.rc:15) > dwc2 f72c0000.usb: dwc2_hc_chhltd_intr_dma: Channel 8 - ChHltd set, but reason is unknown > dwc2 f72c0000.usb: hcint 0x00000002, intsts 0x04200029 > dwc2 f72c0000.usb: dwc2_hc_chhltd_intr_dma: Channel 12 - ChHltd set, but reason is unknown > dwc2 f72c0000.usb: hcint 0x00000002, intsts 0x04200029 > dwc2 f72c0000.usb: dwc2_hc_chhltd_intr_dma: Channel 15 - ChHltd set, but reason is unknown > dwc2 f72c0000.usb: hcint 0x00000002, intsts 0x04200029 > dwc2 f72c0000.usb: dwc2_hc_chhltd_intr_dma: Channel 3 - ChHltd set, but reason is unknown > dwc2 f72c0000.usb: hcint 0x00000002, intsts 0x04200029 > dwc2 f72c0000.usb: dwc2_hc_chhltd_intr_dma: Channel 4 - ChHltd set, but reason is unknown > dwc2 f72c0000.usb: hcint 0x00000002, intsts 0x04200029 > dwc2 f72c0000.usb: dwc2_update_urb_state_abn(): trimming xfer length > > And the usb devices connected are basically hung at this point. > > It seems like if we're in host mode, we probably shouldn't run > the dwc2_hostg_ep_disable logic, so this patch returns an error > in that case. > > With this patch (along with the two previous patches mailed out > earlier: > https://urldefense.proofpoint.com/v2/url?u=https-3A__lkml.org_lkml_2017_8_3_1008&d=DwIBAg&c=DPL6_X_6JkXFx7AXWqB0tg&r=6z9Al9FrHR_ZqbbtSAsD16pvOL2S3XHxQnSzq8kusyI&m=YbED3GZFyun_ID3-6Off3kdvd9xTUepWt4lzd2__ZSs&s=65BnVw7lagEfnyuD2WHnFlGTUnjvPHWyFiwL_F1vwfE&e= > https://urldefense.proofpoint.com/v2/url?u=https-3A__lkml.org_lkml_2017_8_3_1010&d=DwIBAg&c=DPL6_X_6JkXFx7AXWqB0tg&r=6z9Al9FrHR_ZqbbtSAsD16pvOL2S3XHxQnSzq8kusyI&m=YbED3GZFyun_ID3-6Off3kdvd9xTUepWt4lzd2__ZSs&s=MdrOhV0i6kRrV2mHK5zHIwE1eF21MsTkHIjvsV2k7uw&e= > ), we avoid the mismatched interrupts and connected usb devices > continue to function. > > I'm not sure if some other solution would be better here, but this seems > to work, so I wanted to send it out for input on what the right approach > should be. > > Cc: Wei Xu <xuwei5@xxxxxxxxxxxxx> > Cc: Guodong Xu <guodong.xu@xxxxxxxxxx> > Cc: Amit Pundir <amit.pundir@xxxxxxxxxx> > Cc: YongQin Liu <yongqin.liu@xxxxxxxxxx> > Cc: John Youn <johnyoun@xxxxxxxxxxxx> > Cc: Minas Harutyunyan <Minas.Harutyunyan@xxxxxxxxxxxx> > Cc: Douglas Anderson <dianders@xxxxxxxxxxxx> > Cc: Chen Yu <chenyu56@xxxxxxxxxx> > Cc: Felipe Balbi <felipe.balbi@xxxxxxxxxxxxxxx> > Cc: Greg Kroah-Hartman <gregkh@xxxxxxxxxxxxxxxxxxx> > Cc: linux-usb@xxxxxxxxxxxxxxx > Reported-by: YongQin Liu <yongqin.liu@xxxxxxxxxx> > Signed-off-by: John Stultz <john.stultz@xxxxxxxxxx> > --- > drivers/usb/dwc2/gadget.c | 5 +++++ > 1 file changed, 5 insertions(+) > > diff --git a/drivers/usb/dwc2/gadget.c b/drivers/usb/dwc2/gadget.c > index 0d8e09c..7fd0e38 100644 > --- a/drivers/usb/dwc2/gadget.c > +++ b/drivers/usb/dwc2/gadget.c > @@ -4004,6 +4004,11 @@ static int dwc2_hsotg_ep_disable(struct usb_ep *ep) > return -EINVAL; > } > > + if (hsotg->op_state != OTG_STATE_B_PERIPHERAL) { > + dev_err(hsotg->dev, "%s: called in host mode?\n", __func__); > + return -EINVAL; > + } > + > epctrl_reg = dir_in ? DIEPCTL(index) : DOEPCTL(index); > > spin_lock_irqsave(&hsotg->lock, flags); > Tested by: Minas Harutyunyan <hminas@xxxxxxxxxxxx> -- To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html