From: Veeraiyan Chidambaram <veeraiyan.chidambaram@in.bosch.com> In RCAR3 USB 3.0 Function, if host is detached an interrupt will be generated and Suspended state bit is set in interrupt status register. Interrupt handler will call driver->suspend(composite_suspend) if suspended state bit is set. composite_suspend will call ffs_func_suspend which will post FUNCTIONFS_SUSPEND and will be consumed by user space application via /dev/ep0. To be able to detect the host detach, USB_INT_1_B2_SPND to cover the Suspended bit of the B2_SPND_OUT[9] from the USB Status Register (USB_STA) register and perform appropriate action in the usb3_irq_epc_int_1 function. Without this commit, disconnection of the phone from R-Car-H3 ES2.0 Salvator-X CN11 port is not recognized and reverse role switch does not happen. If phone is connected again it does not enumerate. With this commit, disconnection will be recognized and reverse role switch will happen. If phone is connected again it will enumerate properly and will become visible in the output of 'lsusb'. Signed-off-by: Veeraiyan Chidambaram <veeraiyan.chidambaram@in.bosch.com> --- drivers/usb/gadget/udc/renesas_usb3.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/drivers/usb/gadget/udc/renesas_usb3.c b/drivers/usb/gadget/udc/renesas_usb3.c index eaa3339b30a2..4ec703e302f5 100644 --- a/drivers/usb/gadget/udc/renesas_usb3.c +++ b/drivers/usb/gadget/udc/renesas_usb3.c @@ -767,6 +767,19 @@ static void usb3_irq_epc_int_1_resume(struct renesas_usb3 *usb3) usb3_transition_to_default_state(usb3, false); } +static void usb3_irq_epc_int_1_suspend(struct renesas_usb3 *usb3) +{ + usb3_disable_irq_1(usb3, USB_INT_1_B2_SPND); + + if (usb3->driver && + usb3->driver->suspend && + usb3->gadget.speed != USB_SPEED_UNKNOWN && + usb3->gadget.state != USB_STATE_NOTATTACHED) { + usb3->driver->suspend(&usb3->gadget); + usb_gadget_set_state(&usb3->gadget, USB_STATE_SUSPENDED); + } +} + static void usb3_irq_epc_int_1_disable(struct renesas_usb3 *usb3) { usb3_stop_usb3_connection(usb3); @@ -852,6 +865,9 @@ static void usb3_irq_epc_int_1(struct renesas_usb3 *usb3, u32 int_sta_1) if (int_sta_1 & USB_INT_1_B2_RSUM) usb3_irq_epc_int_1_resume(usb3); + if (int_sta_1 & USB_INT_1_B2_SPND) + usb3_irq_epc_int_1_suspend(usb3); + if (int_sta_1 & USB_INT_1_SPEED) usb3_irq_epc_int_1_speed(usb3); -- 2.7.4
Hi Veeraiyan, Thank you very much for the patch! I didn't realize that using USB_INT_1_B2_SPND can resolve such a behavior. I'd like to apply this patch into upstream, but I have some comments below. > From: Veeraiyan Chidambaram, Sent: Wednesday, September 4, 2019 6:24 PM > > In RCAR3 USB 3.0 Function, if host is detached an interrupt I'd like to replace "RCAR3" with "R-Car Gen3". > will be generated and Suspended state bit is set in interrupt status > register. Interrupt handler will call driver->suspend(composite_suspend) > if suspended state bit is set. composite_suspend will call > ffs_func_suspend which will post FUNCTIONFS_SUSPEND and will be consumed > by user space application via /dev/ep0. > > To be able to detect the host detach, USB_INT_1_B2_SPND to cover the > Suspended bit of the B2_SPND_OUT[9] from the USB Status Register > (USB_STA) register and perform appropriate action in the > usb3_irq_epc_int_1 function. > > Without this commit, disconnection of the phone from R-Car-H3 ES2.0 s/R-Car-H3/R-Car H3/ > Salvator-X CN11 port is not recognized and reverse role switch does > not happen. If phone is connected again it does not enumerate. > > With this commit, disconnection will be recognized and reverse role > switch will happen. If phone is connected again it will enumerate IIUC, reverse role switch will happen by a user space application. Is it correct? > properly and will become visible in the output of 'lsusb'. > > Signed-off-by: Veeraiyan Chidambaram <veeraiyan.chidambaram@in.bosch.com> > --- > drivers/usb/gadget/udc/renesas_usb3.c | 16 ++++++++++++++++ > 1 file changed, 16 insertions(+) > > diff --git a/drivers/usb/gadget/udc/renesas_usb3.c b/drivers/usb/gadget/udc/renesas_usb3.c > index eaa3339b30a2..4ec703e302f5 100644 > --- a/drivers/usb/gadget/udc/renesas_usb3.c > +++ b/drivers/usb/gadget/udc/renesas_usb3.c > @@ -767,6 +767,19 @@ static void usb3_irq_epc_int_1_resume(struct renesas_usb3 *usb3) > usb3_transition_to_default_state(usb3, false); > } > > +static void usb3_irq_epc_int_1_suspend(struct renesas_usb3 *usb3) > +{ > + usb3_disable_irq_1(usb3, USB_INT_1_B2_SPND); > + > + if (usb3->driver && > + usb3->driver->suspend && > + usb3->gadget.speed != USB_SPEED_UNKNOWN && > + usb3->gadget.state != USB_STATE_NOTATTACHED) { > + usb3->driver->suspend(&usb3->gadget); > + usb_gadget_set_state(&usb3->gadget, USB_STATE_SUSPENDED); I'd like to change the conditions like below if it still works on your environment. This is because I'd like to set the gadget state if other gadget driver except f_fs is used anyway. After that, a user also can recognize the state by using /sys/devices/platform/soc/ee020000.usb/udc/ee020000.usb/state even if the use doesn't use f_fs driver. if (usb3->gadget.speed != USB_SPEED_UNKNOWN && usb3->gadget.state != USB_STATE_NOTATTACHED) { if (usb3->driver && usb3->driver->suspend) usb3->driver->suspend(&usb3->gadget); usb_gadget_set_state(&usb3->gadget, USB_STATE_SUSPENDED); } Best regards, Yoshihiro Shimoda
Hi Shimoda-san, Thanks a lot for your feedback. On Wed, Sep 04, 2019 at 12:08:39PM +0000, Yoshihiro Shimoda wrote: > Hi Veeraiyan, > > Thank you very much for the patch! I didn't realize that using USB_INT_1_B2_SPND > can resolve such a behavior. I'd like to apply this patch into upstream, but > I have some comments below. > > > From: Veeraiyan Chidambaram, Sent: Wednesday, September 4, 2019 6:24 PM > > > > In RCAR3 USB 3.0 Function, if host is detached an interrupt > > I'd like to replace "RCAR3" with "R-Car Gen3". Yes . I agree > > Without this commit, disconnection of the phone from R-Car-H3 ES2.0 > > s/R-Car-H3/R-Car H3/ Yes . I agree > IIUC, reverse role switch will happen by a user space application. > Is it correct? Yes, understanding is correct and made the change in commit message. > I'd like to change the conditions like below if it still works on your environment. > This is because I'd like to set the gadget state if other gadget driver except f_fs > is used anyway. After that, a user also can recognize the state by using > /sys/devices/platform/soc/ee020000.usb/udc/ee020000.usb/state even if the use > doesn't use f_fs driver. > > if (usb3->gadget.speed != USB_SPEED_UNKNOWN && > usb3->gadget.state != USB_STATE_NOTATTACHED) { > if (usb3->driver && usb3->driver->suspend) > usb3->driver->suspend(&usb3->gadget); > usb_gadget_set_state(&usb3->gadget, USB_STATE_SUSPENDED); > } Above change worked in our environment. I prepare patch for this > Best regards, > Yoshihiro Shimoda >
From: Veeraiyan Chidambaram <veeraiyan.chidambaram@in.bosch.com> In R-Car Gen3 USB 3.0 Function, if host is detached an interrupt will be generated and Suspended state bit is set in interrupt status register. Interrupt handler will call driver->suspend(composite_suspend) if suspended state bit is set. composite_suspend will call ffs_func_suspend which will post FUNCTIONFS_SUSPEND and will be consumed by user space application via /dev/ep0. To be able to detect the host detach, USB_INT_1_B2_SPND to cover the Suspended bit of the B2_SPND_OUT[9] from the USB Status Register (USB_STA) register and perform appropriate action in the usb3_irq_epc_int_1 function. Without this commit, disconnection of the phone from R-Car H3 ES2.0 Salvator-X CN11 port is not recognized and reverse role switch does not happen. If phone is connected again it does not enumerate. With this commit, disconnection will be recognized and reverse role switch will happen by a user space application. If phone is connected again it will enumerate properly and will become visible in the output of 'lsusb'. Signed-off-by: Veeraiyan Chidambaram <veeraiyan.chidambaram@in.bosch.com> --- drivers/usb/gadget/udc/renesas_usb3.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/drivers/usb/gadget/udc/renesas_usb3.c b/drivers/usb/gadget/udc/renesas_usb3.c index eaa3339b30a2..8d5207afdad9 100644 --- a/drivers/usb/gadget/udc/renesas_usb3.c +++ b/drivers/usb/gadget/udc/renesas_usb3.c @@ -767,6 +767,20 @@ static void usb3_irq_epc_int_1_resume(struct renesas_usb3 *usb3) usb3_transition_to_default_state(usb3, false); } +static void usb3_irq_epc_int_1_suspend(struct renesas_usb3 *usb3) +{ + usb3_disable_irq_1(usb3, USB_INT_1_B2_SPND); + + if (usb3->driver && + usb3->driver->suspend && + usb3->gadget.speed != USB_SPEED_UNKNOWN && + usb3->gadget.state != USB_STATE_NOTATTACHED) { + if (usb3->driver && usb3->driver->suspend) + usb3->driver->suspend(&usb3->gadget); + usb_gadget_set_state(&usb3->gadget, USB_STATE_SUSPENDED); + } +} + static void usb3_irq_epc_int_1_disable(struct renesas_usb3 *usb3) { usb3_stop_usb3_connection(usb3); @@ -852,6 +866,9 @@ static void usb3_irq_epc_int_1(struct renesas_usb3 *usb3, u32 int_sta_1) if (int_sta_1 & USB_INT_1_B2_RSUM) usb3_irq_epc_int_1_resume(usb3); + if (int_sta_1 & USB_INT_1_B2_SPND) + usb3_irq_epc_int_1_suspend(usb3); + if (int_sta_1 & USB_INT_1_SPEED) usb3_irq_epc_int_1_speed(usb3); -- 2.7.4
Hi Veeraiyan, Thank you for the patch! > From: Veeraiyan Chidambaram, Sent: Wednesday, September 4, 2019 11:48 PM <snip> > --- a/drivers/usb/gadget/udc/renesas_usb3.c > +++ b/drivers/usb/gadget/udc/renesas_usb3.c > @@ -767,6 +767,20 @@ static void usb3_irq_epc_int_1_resume(struct renesas_usb3 *usb3) > usb3_transition_to_default_state(usb3, false); > } > > +static void usb3_irq_epc_int_1_suspend(struct renesas_usb3 *usb3) > +{ > + usb3_disable_irq_1(usb3, USB_INT_1_B2_SPND); > + > + if (usb3->driver && > + usb3->driver->suspend && As I mentioned on v1 patch [1], I'd like to remove these conditions. After fixed it, Reviewed-by: Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com> [1] https://patchwork.kernel.org/patch/11129797/#22862513 Best regards, Yoshihiro Shimoda > + usb3->gadget.speed != USB_SPEED_UNKNOWN && > + usb3->gadget.state != USB_STATE_NOTATTACHED) { > + if (usb3->driver && usb3->driver->suspend) > + usb3->driver->suspend(&usb3->gadget); > + usb_gadget_set_state(&usb3->gadget, USB_STATE_SUSPENDED); > + } > +} > + > static void usb3_irq_epc_int_1_disable(struct renesas_usb3 *usb3) > { > usb3_stop_usb3_connection(usb3); > @@ -852,6 +866,9 @@ static void usb3_irq_epc_int_1(struct renesas_usb3 *usb3, u32 int_sta_1) > if (int_sta_1 & USB_INT_1_B2_RSUM) > usb3_irq_epc_int_1_resume(usb3); > > + if (int_sta_1 & USB_INT_1_B2_SPND) > + usb3_irq_epc_int_1_suspend(usb3); > + > if (int_sta_1 & USB_INT_1_SPEED) > usb3_irq_epc_int_1_speed(usb3); > > -- > 2.7.4
Hello Shimoda-san, Thanks a lot . On Thu, Sep 05, 2019 at 02:09:42AM +0000, Yoshihiro Shimoda wrote: > Hi Veeraiyan, > > Thank you for the patch! > > > From: Veeraiyan Chidambaram, Sent: Wednesday, September 4, 2019 11:48 PM > <snip> > > --- a/drivers/usb/gadget/udc/renesas_usb3.c > > +++ b/drivers/usb/gadget/udc/renesas_usb3.c > > @@ -767,6 +767,20 @@ static void usb3_irq_epc_int_1_resume(struct renesas_usb3 *usb3) > > usb3_transition_to_default_state(usb3, false); > > } > > > > +static void usb3_irq_epc_int_1_suspend(struct renesas_usb3 *usb3) > > +{ > > + usb3_disable_irq_1(usb3, USB_INT_1_B2_SPND); > > + > > + if (usb3->driver && > > + usb3->driver->suspend && > > As I mentioned on v1 patch [1], I'd like to remove these conditions. > After fixed it, > > Reviewed-by: Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com> > > [1] https://patchwork.kernel.org/patch/11129797/#22862513 I have create V2 patch [1], please review. [1] https://patchwork.kernel.org/patch/11132433/ Best regards, Veeraiyan chidambaram > Yoshihiro Shimoda > > > + usb3->gadget.speed != USB_SPEED_UNKNOWN && > > + usb3->gadget.state != USB_STATE_NOTATTACHED) { > > + if (usb3->driver && usb3->driver->suspend) > > + usb3->driver->suspend(&usb3->gadget); > > + usb_gadget_set_state(&usb3->gadget, USB_STATE_SUSPENDED); > > + } > > +} > > + > > static void usb3_irq_epc_int_1_disable(struct renesas_usb3 *usb3) > > { > > usb3_stop_usb3_connection(usb3); > > @@ -852,6 +866,9 @@ static void usb3_irq_epc_int_1(struct renesas_usb3 *usb3, u32 int_sta_1) > > if (int_sta_1 & USB_INT_1_B2_RSUM) > > usb3_irq_epc_int_1_resume(usb3); > > > > + if (int_sta_1 & USB_INT_1_B2_SPND) > > + usb3_irq_epc_int_1_suspend(usb3); > > + > > if (int_sta_1 & USB_INT_1_SPEED) > > usb3_irq_epc_int_1_speed(usb3); > > > > -- > > 2.7.4 >
Hello Shimoda-san, Please ignore my previous V2 patch [1] and take V3 patch[2]. sorry for the inconvenience. [1] https://patchwork.kernel.org/patch/11132433/ [2] https://patchwork.kernel.org/patch/11132489/ Best regards, Veeraiyan Chidambaram On Thu, Sep 05, 2019 at 02:09:42AM +0000, Yoshihiro Shimoda wrote: > Hi Veeraiyan, > > Thank you for the patch! > > > From: Veeraiyan Chidambaram, Sent: Wednesday, September 4, 2019 11:48 PM > <snip> > > --- a/drivers/usb/gadget/udc/renesas_usb3.c > > +++ b/drivers/usb/gadget/udc/renesas_usb3.c > > @@ -767,6 +767,20 @@ static void usb3_irq_epc_int_1_resume(struct renesas_usb3 *usb3) > > usb3_transition_to_default_state(usb3, false); > > } > > > > +static void usb3_irq_epc_int_1_suspend(struct renesas_usb3 *usb3) > > +{ > > + usb3_disable_irq_1(usb3, USB_INT_1_B2_SPND); > > + > > + if (usb3->driver && > > + usb3->driver->suspend && > > As I mentioned on v1 patch [1], I'd like to remove these conditions. > After fixed it, > > Reviewed-by: Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com> > > [1] https://patchwork.kernel.org/patch/11129797/#22862513 > > Best regards, > Yoshihiro Shimoda > > > + usb3->gadget.speed != USB_SPEED_UNKNOWN && > > + usb3->gadget.state != USB_STATE_NOTATTACHED) { > > + if (usb3->driver && usb3->driver->suspend) > > + usb3->driver->suspend(&usb3->gadget); > > + usb_gadget_set_state(&usb3->gadget, USB_STATE_SUSPENDED); > > + } > > +} > > + > > static void usb3_irq_epc_int_1_disable(struct renesas_usb3 *usb3) > > { > > usb3_stop_usb3_connection(usb3); > > @@ -852,6 +866,9 @@ static void usb3_irq_epc_int_1(struct renesas_usb3 *usb3, u32 int_sta_1) > > if (int_sta_1 & USB_INT_1_B2_RSUM) > > usb3_irq_epc_int_1_resume(usb3); > > > > + if (int_sta_1 & USB_INT_1_B2_SPND) > > + usb3_irq_epc_int_1_suspend(usb3); > > + > > if (int_sta_1 & USB_INT_1_SPEED) > > usb3_irq_epc_int_1_speed(usb3); > > > > -- > > 2.7.4 >