All of lore.kernel.org
 help / color / mirror / Atom feed
From: Thinh Nguyen <Thinh.Nguyen@synopsys.com>
To: Elson Roy Serrao <quic_eserrao@quicinc.com>
Cc: "gregkh@linuxfoundation.org" <gregkh@linuxfoundation.org>,
	"balbi@kernel.org" <balbi@kernel.org>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
	"linux-usb@vger.kernel.org" <linux-usb@vger.kernel.org>,
	"quic_wcheng@quicinc.com" <quic_wcheng@quicinc.com>,
	"quic_jackp@quicinc.com" <quic_jackp@quicinc.com>
Subject: Re: [PATCH v10 5/5] usb: gadget: f_ecm: Add suspend/resume and remote wakeup support
Date: Wed, 15 Mar 2023 21:15:43 +0000	[thread overview]
Message-ID: <20230315211542.z6oc2zfgpnrixgi5@synopsys.com> (raw)
In-Reply-To: <20230315194733.yjp5ddymehxm6abl@synopsys.com>

On Wed, Mar 15, 2023, Thinh Nguyen wrote:
> On Wed, Mar 15, 2023, Elson Roy Serrao wrote:
> > When host sends a suspend notification to the device, handle
> > the suspend callbacks in the function driver. Enhanced super
> > speed devices can support function suspend feature to put the
> > function in suspend state. Handle function suspend callback.
> > 
> > Depending on the remote wakeup capability the device can either
> > trigger a remote wakeup or wait for the host initiated resume to
> > start data transfer again.
> > 
> > Signed-off-by: Elson Roy Serrao <quic_eserrao@quicinc.com>
> > ---
> >  drivers/usb/gadget/function/f_ecm.c   | 77 +++++++++++++++++++++++++++++++++++
> >  drivers/usb/gadget/function/u_ether.c | 63 ++++++++++++++++++++++++++++
> >  drivers/usb/gadget/function/u_ether.h |  4 ++
> >  3 files changed, 144 insertions(+)
> > 
> > diff --git a/drivers/usb/gadget/function/f_ecm.c b/drivers/usb/gadget/function/f_ecm.c
> > index a7ab30e..fea07ab 100644
> > --- a/drivers/usb/gadget/function/f_ecm.c
> > +++ b/drivers/usb/gadget/function/f_ecm.c
> > @@ -633,6 +633,8 @@ static void ecm_disable(struct usb_function *f)
> >  
> >  	usb_ep_disable(ecm->notify);
> >  	ecm->notify->desc = NULL;
> > +	f->func_suspended = false;
> > +	f->func_wakeup_armed = false;
> >  }
> >  
> >  /*-------------------------------------------------------------------------*/
> > @@ -885,6 +887,77 @@ static struct usb_function_instance *ecm_alloc_inst(void)
> >  	return &opts->func_inst;
> >  }
> >  
> > +static void ecm_suspend(struct usb_function *f)
> > +{
> > +	struct f_ecm *ecm = func_to_ecm(f);
> > +	struct usb_composite_dev *cdev = ecm->port.func.config->cdev;
> > +
> > +	if (f->func_suspended) {
> > +		DBG(cdev, "Function already suspended\n");
> > +		return;
> > +	}
> > +
> > +	DBG(cdev, "ECM Suspend\n");
> > +
> > +	gether_suspend(&ecm->port);
> > +}
> > +
> > +static void ecm_resume(struct usb_function *f)
> > +{
> > +	struct f_ecm *ecm = func_to_ecm(f);
> > +	struct usb_composite_dev *cdev = ecm->port.func.config->cdev;
> > +
> > +	/*
> > +	 * If the function is in USB3 Function Suspend state, resume is
> > +	 * canceled. In this case resume is done by a Function Resume request.
> > +	 */
> > +	if (f->func_suspended)
> > +		return;
> > +
> > +	DBG(cdev, "ECM Resume\n");
> > +
> > +	gether_resume(&ecm->port);
> > +}
> > +
> > +static int ecm_get_status(struct usb_function *f)
> > +{
> > +	struct usb_configuration *c = f->config;
> > +
> > +	/* D0 and D1 bit set to 0 if device is not wakeup capable */
> > +	if (!(USB_CONFIG_ATT_WAKEUP & c->bmAttributes))
> > +		return 0;
> > +
> > +	return (f->func_wakeup_armed ? USB_INTRF_STAT_FUNC_RW : 0) |
> > +		USB_INTRF_STAT_FUNC_RW_CAP;
> > +}
> > +
> > +static int ecm_func_suspend(struct usb_function *f, u8 options)
> > +{
> > +	struct usb_configuration *c = f->config;
> > +
> > +	DBG(c->cdev, "func susp %u cmd\n", options);
> > +
> > +	/* Respond with negative errno if request is not supported */
> > +	if (!(USB_CONFIG_ATT_WAKEUP & c->bmAttributes))
> > +		return -EINVAL;
> 
> We only need to return early if the host tries to enable remote wake
> while the device isn't capable of it:
> 
> 	wakeup_sel = !!(options & (USB_INTRF_FUNC_SUSPEND_RW >> 8));
> 	if (wakeup_sel && !(USB_CONFIG_ATT_WAKEUP & c->bmAttributes))
> 		return -EINVAL;
> 
> 	f->func_wakeup_armed = wakeup_sel;
> 

Also, I notice that we can't differentiate between ClearFeature() and
SetFeature() in f->func_suspend(). Perhaps we should handle arming the
remote wakeup in the composite layer so we can set/clear the remote
wake. It's common across multiple devices. It's probably better to be
there.

Thanks,
Thinh

  reply	other threads:[~2023-03-15 21:16 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-03-15 19:29 [PATCH v10 0/5] Add function suspend/resume and remote wakeup support Elson Roy Serrao
2023-03-15 19:29 ` [PATCH v10 1/5] usb: gadget: Properly configure the device for remote wakeup Elson Roy Serrao
2023-03-15 19:29 ` [PATCH v10 2/5] usb: dwc3: Add remote wakeup handling Elson Roy Serrao
2023-03-15 19:29 ` [PATCH v10 3/5] usb: gadget: Add function wakeup support Elson Roy Serrao
2023-03-15 19:29 ` [PATCH v10 4/5] usb: dwc3: Add function suspend and " Elson Roy Serrao
2023-03-15 19:29 ` [PATCH v10 5/5] usb: gadget: f_ecm: Add suspend/resume and remote " Elson Roy Serrao
2023-03-15 19:47   ` Thinh Nguyen
2023-03-15 21:15     ` Thinh Nguyen [this message]
2023-03-15 22:41       ` Elson Serrao
2023-03-15 23:01         ` Thinh Nguyen

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20230315211542.z6oc2zfgpnrixgi5@synopsys.com \
    --to=thinh.nguyen@synopsys.com \
    --cc=balbi@kernel.org \
    --cc=gregkh@linuxfoundation.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-usb@vger.kernel.org \
    --cc=quic_eserrao@quicinc.com \
    --cc=quic_jackp@quicinc.com \
    --cc=quic_wcheng@quicinc.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.