From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753450AbbJZWNP (ORCPT ); Mon, 26 Oct 2015 18:13:15 -0400 Received: from sender163-mail.zoho.com ([74.201.84.163]:24054 "EHLO sender163-mail.zoho.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752733AbbJZWNM (ORCPT ); Mon, 26 Oct 2015 18:13:12 -0400 Subject: Re: [PATCH v4 1/7] usb: gadget: f_midi: Transmit data only when IN ep is enabled To: "Felipe F. Tonello" , linux-usb@vger.kernel.org References: <1445878509-12084-1-git-send-email-eu@felipetonello.com> <1445878509-12084-2-git-send-email-eu@felipetonello.com> Cc: linux-kernel@vger.kernel.org, Felipe Balbi , Greg Kroah-Hartman , Andrzej Pietrasiewicz , Clemens Ladisch From: Robert Baldyga Message-ID: <562EA570.8000309@hackerion.com> Date: Mon, 26 Oct 2015 23:13:04 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.2.0 MIME-Version: 1.0 In-Reply-To: <1445878509-12084-2-git-send-email-eu@felipetonello.com> Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi Felipe, On 10/26/2015 05:55 PM, Felipe F. Tonello wrote: > This makes sure f_midi doesn't try to enqueue data when the IN endpoint is > disabled, ie, USB cable is disconnected. > > Signed-off-by: Felipe F. Tonello > --- > drivers/usb/gadget/function/f_midi.c | 7 ++++++- > 1 file changed, 6 insertions(+), 1 deletion(-) > > diff --git a/drivers/usb/gadget/function/f_midi.c b/drivers/usb/gadget/function/f_midi.c > index edb84ca..e08f365 100644 > --- a/drivers/usb/gadget/function/f_midi.c > +++ b/drivers/usb/gadget/function/f_midi.c > @@ -87,6 +87,7 @@ struct f_midi { > int index; > char *id; > unsigned int buflen, qlen; > + bool in_ep_enabled; It's not necessary, you can use ep->enabled flag instead. > }; > > static inline struct f_midi *func_to_midi(struct usb_function *f) > @@ -332,6 +333,7 @@ static int f_midi_set_alt(struct usb_function *f, unsigned intf, unsigned alt) > err = f_midi_start_ep(midi, f, midi->in_ep); > if (err) > return err; > + midi->in_ep_enabled = true; > > err = f_midi_start_ep(midi, f, midi->out_ep); > if (err) > @@ -387,6 +389,8 @@ static void f_midi_disable(struct usb_function *f) > */ > usb_ep_disable(midi->in_ep); > usb_ep_disable(midi->out_ep); > + > + midi->in_ep_enabled = false; > } > > static int f_midi_snd_free(struct snd_device *device) > @@ -543,7 +547,7 @@ static void f_midi_transmit(struct f_midi *midi, struct usb_request *req) > } > } > > - if (req->length > 0) { > + if (req->length > 0 && midi->in_ep_enabled) { You should rather test it at the beginning of this function. Or, even better, when tasklet is scheduled, because tasklet is the only way this function can be called when endpoints are disabled. > int err; > > err = usb_ep_queue(ep, req, GFP_ATOMIC); > @@ -1158,6 +1162,7 @@ static struct usb_function *f_midi_alloc(struct usb_function_instance *fi) > midi->index = opts->index; > midi->buflen = opts->buflen; > midi->qlen = opts->qlen; > + midi->in_ep_enabled = false; > ++opts->refcnt; > mutex_unlock(&opts->lock); > > Best regards, Robert