usb: dwc2: gadget: report disconnection after reset
If usb bus is reset without a physical disconnection, all endpoints will remain open. Call s3c_hsotg_disconnect() from reset handler to report a disconnect to gadget framework. hsotg->connected is checked in s3c_hsotg_disconnect() before processing disconnect. In some cases, USBRst is seen before EnumDone and after it as well. So move setting of hsotg->connected to set-address to avoid reporting extra disconnection in this case. Tested-by: Robert Baldyga <r.baldyga@samsung.com> Acked-by: Paul Zimmerman <paulz@synopsys.com> Signed-off-by: Mian Yousaf Kaukab <yousaf.kaukab@intel.com> Signed-off-by: Felipe Balbi <balbi@ti.com>hifive-unleashed-5.1
parent
1b7a66b4d3
commit
6d713c1531
|
@ -1103,6 +1103,7 @@ static void s3c_hsotg_process_control(struct dwc2_hsotg *hsotg,
|
||||||
if ((ctrl->bRequestType & USB_TYPE_MASK) == USB_TYPE_STANDARD) {
|
if ((ctrl->bRequestType & USB_TYPE_MASK) == USB_TYPE_STANDARD) {
|
||||||
switch (ctrl->bRequest) {
|
switch (ctrl->bRequest) {
|
||||||
case USB_REQ_SET_ADDRESS:
|
case USB_REQ_SET_ADDRESS:
|
||||||
|
hsotg->connected = 1;
|
||||||
dcfg = readl(hsotg->regs + DCFG);
|
dcfg = readl(hsotg->regs + DCFG);
|
||||||
dcfg &= ~DCFG_DEVADDR_MASK;
|
dcfg &= ~DCFG_DEVADDR_MASK;
|
||||||
dcfg |= (le16_to_cpu(ctrl->wValue) <<
|
dcfg |= (le16_to_cpu(ctrl->wValue) <<
|
||||||
|
@ -2305,7 +2306,6 @@ irq_retry:
|
||||||
writel(GINTSTS_ENUMDONE, hsotg->regs + GINTSTS);
|
writel(GINTSTS_ENUMDONE, hsotg->regs + GINTSTS);
|
||||||
|
|
||||||
s3c_hsotg_irq_enumdone(hsotg);
|
s3c_hsotg_irq_enumdone(hsotg);
|
||||||
hsotg->connected = 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (gintsts & (GINTSTS_OEPINT | GINTSTS_IEPINT)) {
|
if (gintsts & (GINTSTS_OEPINT | GINTSTS_IEPINT)) {
|
||||||
|
@ -2343,6 +2343,9 @@ irq_retry:
|
||||||
|
|
||||||
writel(GINTSTS_USBRST, hsotg->regs + GINTSTS);
|
writel(GINTSTS_USBRST, hsotg->regs + GINTSTS);
|
||||||
|
|
||||||
|
/* Report disconnection if it is not already done. */
|
||||||
|
s3c_hsotg_disconnect(hsotg);
|
||||||
|
|
||||||
if (usb_status & GOTGCTL_BSESVLD) {
|
if (usb_status & GOTGCTL_BSESVLD) {
|
||||||
if (time_after(jiffies, hsotg->last_rst +
|
if (time_after(jiffies, hsotg->last_rst +
|
||||||
msecs_to_jiffies(200))) {
|
msecs_to_jiffies(200))) {
|
||||||
|
|
Loading…
Reference in New Issue