RE: [PATCH v13 2/6] usb: dwc3: core: Host wake up support from system suspend

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Matthias,

> -----Original Message-----
> From: Matthias Kaehlcke <mka@xxxxxxxxxxxx>
> Sent: Saturday, April 16, 2022 6:00 AM
> To: Sandeep Maheswaram (Temp) (QUIC) <quic_c_sanm@xxxxxxxxxxx>
> Cc: Pavan Kumar Kondeti (QUIC) <quic_pkondeti@xxxxxxxxxxx>; Rob Herring
> <robh+dt@xxxxxxxxxx>; Andy Gross <agross@xxxxxxxxxx>;
> bjorn.andersson@xxxxxxxxxx; Greg Kroah-Hartman
> <gregkh@xxxxxxxxxxxxxxxxxxx>; Felipe Balbi <balbi@xxxxxxxxxx>; Stephen
> Boyd <swboyd@xxxxxxxxxxxx>; Doug Anderson
> <dianders@xxxxxxxxxxxx>; Mathias Nyman <mathias.nyman@xxxxxxxxx>;
> Krzysztof Kozlowski <krzysztof.kozlowski+dt@xxxxxxxxxx>;
> devicetree@xxxxxxxxxxxxxxx; linux-arm-msm@xxxxxxxxxxxxxxx; linux-
> usb@xxxxxxxxxxxxxxx; linux-kernel@xxxxxxxxxxxxxxx; Pratham Pratap (QUIC)
> <quic_ppratap@xxxxxxxxxxx>; Krishna Kurapati PSSNV (QUIC)
> <quic_kriskura@xxxxxxxxxxx>; Vidya Sagar Pulyala (Temp) (QUIC)
> <quic_vpulyala@xxxxxxxxxxx>
> Subject: Re: [PATCH v13 2/6] usb: dwc3: core: Host wake up support from
> system suspend
> 
> WARNING: This email originated from outside of Qualcomm. Please be wary
> of any links or attachments, and do not enable macros.
> 
> On Thu, Apr 14, 2022 at 11:27:31AM +0530, Sandeep Maheswaram (Temp)
> wrote:
> > Hi Matthias,
> >
> > On 4/13/2022 9:26 PM, Matthias Kaehlcke wrote:
> > > On Wed, Apr 13, 2022 at 02:38:33PM +0530, Sandeep Maheswaram
> (Temp) wrote:
> > > > Hi Matthias,
> > > >
> > > > On 4/13/2022 12:35 AM, Matthias Kaehlcke wrote:
> > > > > On Tue, Apr 12, 2022 at 12:08:02PM +0530, Sandeep Maheswaram
> (Temp) wrote:
> > > > > > Hi Pavan,
> > > > > >
> > > > > > On 4/12/2022 10:30 AM, Pavan Kondeti wrote:
> > > > > > > Hi Sandeep,
> > > > > > >
> > > > > > > On Tue, Apr 12, 2022 at 10:16:39AM +0530, Sandeep Maheswaram
> (Temp) wrote:
> > > > > > > > Hi Matthias,
> > > > > > > >
> > > > > > > > On 4/12/2022 2:24 AM, Matthias Kaehlcke wrote:
> > > > > > > > > On Tue, Apr 12, 2022 at 12:46:50AM +0530, Sandeep
> Maheswaram wrote:
> > > > > > > > > > During suspend read the status of all port and set hs
> > > > > > > > > > phy mode based on current speed. Use this hs phy mode
> > > > > > > > > > to configure wakeup interrupts in qcom glue driver.
> > > > > > > > > >
> > > > > > > > > > Check wakep-source property for dwc3 core node to set
> > > > > > > > > > the
> > > > > > > > > s/wakep/wakeup/
> > > > > > > > Okay. Will update in next version.
> > > > > > > > > > wakeup capability. Drop the device_init_wakeup call
> > > > > > > > > > from runtime suspend and resume.
> > > > > > > > > >
> > > > > > > > > > Also check during suspend if any wakeup capable
> > > > > > > > > > devices are connected to the controller (directly or
> > > > > > > > > > through hubs), if there are none set a flag to
> > > > > > > > > > indicate that the PHY is powered down during suspend.
> > > > > > > > > >
> > > > > > > > > > Signed-off-by: Sandeep Maheswaram
> > > > > > > > > > <quic_c_sanm@xxxxxxxxxxx>
> > > > > > > > > > ---
> > > > > > > > > A per-patch change log would be really helpful for
> > > > > > > > > reviewers, even if it doesn't include older versions.
> > > > > > > > Okay. Will update in next version.
> > > > > > > > > >     drivers/usb/dwc3/core.c | 33 ++++++++++++++++++++---
> ----------
> > > > > > > > > >     drivers/usb/dwc3/core.h |  4 ++++
> > > > > > > > > >     drivers/usb/dwc3/host.c | 25
> +++++++++++++++++++++++++
> > > > > > > > > >     3 files changed, 49 insertions(+), 13 deletions(-)
> > > > > > > > > >
> > > > > > > > > > diff --git a/drivers/usb/dwc3/core.c
> > > > > > > > > > b/drivers/usb/dwc3/core.c index 1170b80..effaa43
> > > > > > > > > > 100644
> > > > > > > > > > --- a/drivers/usb/dwc3/core.c
> > > > > > > > > > +++ b/drivers/usb/dwc3/core.c
> > > > > > > > > > @@ -32,6 +32,7 @@
> > > > > > > > > >     #include <linux/usb/gadget.h>
> > > > > > > > > >     #include <linux/usb/of.h>
> > > > > > > > > >     #include <linux/usb/otg.h>
> > > > > > > > > > +#include <linux/usb/hcd.h>
> > > > > > > > > >     #include "core.h"
> > > > > > > > > >     #include "gadget.h"
> > > > > > > > > > @@ -1723,6 +1724,7 @@ static int dwc3_probe(struct
> platform_device *pdev)
> > > > > > > > > >       platform_set_drvdata(pdev, dwc);
> > > > > > > > > >       dwc3_cache_hwparams(dwc);
> > > > > > > > > > +     device_init_wakeup(&pdev->dev,
> > > > > > > > > > + of_property_read_bool(dev->of_node,
> > > > > > > > > > + "wakeup-source"));
> > > > > > > > > >       spin_lock_init(&dwc->lock);
> > > > > > > > > >       mutex_init(&dwc->mutex); @@ -1865,6 +1867,7 @@
> > > > > > > > > > static int dwc3_suspend_common(struct dwc3 *dwc,
> pm_message_t msg)
> > > > > > > > > >     {
> > > > > > > > > >       unsigned long   flags;
> > > > > > > > > >       u32 reg;
> > > > > > > > > > +     struct usb_hcd  *hcd =
> > > > > > > > > > + platform_get_drvdata(dwc->xhci);
> > > > > > > > > >       switch (dwc->current_dr_role) {
> > > > > > > > > >       case DWC3_GCTL_PRTCAP_DEVICE:
> > > > > > > > > > @@ -1877,10 +1880,7 @@ static int
> dwc3_suspend_common(struct dwc3 *dwc, pm_message_t msg)
> > > > > > > > > >               dwc3_core_exit(dwc);
> > > > > > > > > >               break;
> > > > > > > > > >       case DWC3_GCTL_PRTCAP_HOST:
> > > > > > > > > > -             if (!PMSG_IS_AUTO(msg)) {
> > > > > > > > > > -                     dwc3_core_exit(dwc);
> > > > > > > > > > -                     break;
> > > > > > > > > > -             }
> > > > > > > > > > +             dwc3_check_phy_speed_mode(dwc);
> > > > > > > > > >               /* Let controller to suspend HSPHY before PHY driver
> suspends */
> > > > > > > > > >               if (dwc->dis_u2_susphy_quirk || @@
> > > > > > > > > > -1896,6 +1896,16 @@ static int
> dwc3_suspend_common(struct dwc3 *dwc, pm_message_t msg)
> > > > > > > > > >               phy_pm_runtime_put_sync(dwc-
> >usb2_generic_phy);
> > > > > > > > > >
> > > > > > > > > > phy_pm_runtime_put_sync(dwc->usb3_generic_phy);
> > > > > > > > > > +
> > > > > > > > > > +             if (!PMSG_IS_AUTO(msg)) {
> > > > > > > > > > +                     if (device_may_wakeup(dwc->dev) &&
> > > > > > > > > > +
> > > > > > > > > > + usb_wakeup_enabled_descendants(hcd->self.root_hub))
> > > > > > > > > > + {
> > > > > > > > > You did not answer my question on v12, reposting it:
> > > > > > > > >
> > > > > > > > >      Did you ever try whether you could use
> device_children_wakeup_capable() from
> > > > > > > > >      [1] instead of usb_wakeup_enabled_descendants()?
> > > > > > > > >
> > > > > > > > >      [1]
> > > > > > > > > https://patchwork.kernel.org/project/linux-usb/patch/163
> > > > > > > > > 5753224-23975-2-git-send-email-quic_c_sanm@xxxxxxxxxxx/#
> > > > > > > > > 24566065
> > > > > > > > Sorry ..I have replied in mail yesterday but it is not
> > > > > > > > showing up in patchwork link.
> > > > > > > >
> > > > > > > > Tried with  device_children_wakeup_capable(dwc->dev)
> > > > > > > > instead of usb_wakeup_enabled_descendants and it always
> > > > > > > > returns true even
> > > > > > > >
> > > > > > > > when no devices are connected.
> > > > > > > >
> > > > > > > What do you mean by when no devices are connected? There is
> > > > > > > always root hub connected and we should not power down the
> > > > > > > DWC3 here even when remote wakeup for root hub is enabled.
> > > > > > > Essentially
> > > > > > > usb_wakeup_enabled_descendants() returns true even without
> > > > > > > any physical devices connected.
> > > > > > >
> > > > > > > What does device_children_wakeup_capable() do? Sorry, I
> > > > > > > could not find this function definition.
> > > > > > >
> > > > > > > Thanks,
> > > > > > > Pavan
> > > > > > usb_wakeup_enabled_descendants() doesn't consider hubs. It
> > > > > > only returns true if any devices are connected with wakeup
> capability apart from hubs.
> > > > > Actually it considers hubs:
> > > > >
> > > > > unsigned usb_wakeup_enabled_descendants(struct usb_device
> *udev)
> > > > > {
> > > > >         struct usb_hub *hub = usb_hub_to_struct_hub(udev);
> > > > >
> > > > >         return udev->do_remote_wakeup +
> > > > >                 (hub ? hub->wakeup_enabled_descendants : 0); }
> > > > >
> > > > > 'udev' may or may not be a hub, if 'do_remote_wakeup' is set
> > > > > then the device is considered a wakeup enabled descendant.
> > > > >
> > > > > And for system suspebd 'do_remote_wakeup' is set based on the
> > > > > wakeup config of the device:
> > > > >
> > > > > static void choose_wakeup(struct usb_device *udev, pm_message_t
> > > > > msg) {
> > > > >         ...
> > > > >         w = device_may_wakeup(&udev->dev);
> > > > >         ...
> > > > >         udev->do_remote_wakeup = w; }
> > > > >
> > > > > I checked on three systems with different Linux distributions,
> > > > > on all of the wakeup flag of a connected hub is 'disabled'.
> > > > > Wakeup still works, so apparently that flag doesn't really have an
> impact for child ports.
> > > > >
> > > > > > If we consider hubs also dwc3 core exit and phy exit will never be
> called.
> > > > > >
> > > > > > device_children_wakeup_capable() implementation was shared by
> > > > > > Matthias in below thread
> > > > > > https://patchwork.kernel.org/project/linux-usb/patch/163575322
> > > > > > 4-23975-2-git-send-email-quic_c_sanm@xxxxxxxxxxx/#24566065
> > > > > >
> > > > > > Probably device_children_wakeup_capable() is returning true
> because it considers hubs also.
> > > > > I thought I did a basic test when I sent the patch, I did
> > > > > another (?) one with v13 of your patch set. In this tests with a
> > > > > hub connected the function returns true when an HID device is
> > > > > connected, and false when nothing is connected. The wakeup flag of
> the hub is disabled (default).
> > > > >
> > > > > Sandeep, are the wakeup flags of the child hub(s) set to
> > > > > 'enabled' on the system you tested on?
> > > > The wakeup flags of hub is 'disabled' on system I tested.
> > > >
> > > > What is the input param you are giving to
> device_children_wakeup_capable() function ?
> > > I passed '&hcd->self.root_hub->dev'
> >
> > Thanks. It is working with this change device_children_wakeup_capable
> > (&hcd->self.root_hub->dev).
> >
> > But I am not sure if it is better than usb_wakeup_enabled_descendants.
> > Still we are accessing xhci layer
> >
> > from dwc which Felipe suggested to avoid.
> 
> True, it still needs access to the data structure(s), even though it doesn't use
> a USB specific API.
> 
> Would be good to get feedback from Felipe on the current approach in
> general, we haven't heard from him in some time.

Will send the new version with device_children_wakeup_capable including your patch
And ask Felipe for his opinion.

Regards
Sandeep




[Index of Archives]     [Device Tree Compilter]     [Device Tree Spec]     [Linux Driver Backports]     [Video for Linux]     [Linux USB Devel]     [Linux PCI Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [XFree86]     [Yosemite Backpacking]


  Powered by Linux