Re: [PATCH v4 1/7] usb: gadget: f_midi: Transmit data only when IN ep is enabled

2015-10-27 Thread Felipe Ferreri Tonello
Hi Robert,

On 27/10/15 06:41, Robert Baldyga wrote:
> On 10/26/2015 11:49 PM, Felipe Tonello wrote:
>> Hi Robert,
>>
>> On Mon, Oct 26, 2015 at 10:13 PM, Robert Baldyga
>>  wrote:
>>> 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.
>>
>> There is no such flag in usb_ep struct[1].
>>
>> [1] http://lxr.free-electrons.com/source/include/linux/usb/gadget.h#L170
> 
> It's already in next branch of Felipe Balbi's tree.
> 
> Look here:
> https://git.kernel.org/cgit/linux/kernel/git/balbi/usb.git/

Cool. Thanks.

I though that this flag would be very useful, but didn't want to add to
the main struct as it seems no other driver cared about this flag. But
it is good to see that it is been merged now.

-- 
Felipe
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH v4 1/7] usb: gadget: f_midi: Transmit data only when IN ep is enabled

2015-10-27 Thread Robert Baldyga
On 10/26/2015 11:49 PM, Felipe Tonello wrote:
> Hi Robert,
> 
> On Mon, Oct 26, 2015 at 10:13 PM, Robert Baldyga
>  wrote:
>> 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.
> 
> There is no such flag in usb_ep struct[1].
> 
> [1] http://lxr.free-electrons.com/source/include/linux/usb/gadget.h#L170

It's already in next branch of Felipe Balbi's tree.

Look here:
https://git.kernel.org/cgit/linux/kernel/git/balbi/usb.git/

Best regards,
Robert

> 
>>
>>>  };
>>>
>>>  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.
> 
> Not in this case, because this function needs to consume the triggered
> data from ALSA, otherwise a timeout will happen (which is worse).
> Of course this is not the best solution, but it is an incremental improvement.
> 
> Patch 7 has the proper solution, which checks this flag at the
> beginning of the function as expected. Also, it is more optimal
> because it drops all substreams buffers, instead of copying it.
> 
>>
>>>   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(>lock);
>>>
>>>
>>
> 
> Felipe
> --
> To unsubscribe from this list: send the line "unsubscribe linux-usb" in
> the body of a message to majord...@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> 

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH v4 1/7] usb: gadget: f_midi: Transmit data only when IN ep is enabled

2015-10-27 Thread Robert Baldyga
On 10/26/2015 11:49 PM, Felipe Tonello wrote:
> Hi Robert,
> 
> On Mon, Oct 26, 2015 at 10:13 PM, Robert Baldyga
>  wrote:
>> 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.
> 
> There is no such flag in usb_ep struct[1].
> 
> [1] http://lxr.free-electrons.com/source/include/linux/usb/gadget.h#L170

It's already in next branch of Felipe Balbi's tree.

Look here:
https://git.kernel.org/cgit/linux/kernel/git/balbi/usb.git/

Best regards,
Robert

> 
>>
>>>  };
>>>
>>>  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.
> 
> Not in this case, because this function needs to consume the triggered
> data from ALSA, otherwise a timeout will happen (which is worse).
> Of course this is not the best solution, but it is an incremental improvement.
> 
> Patch 7 has the proper solution, which checks this flag at the
> beginning of the function as expected. Also, it is more optimal
> because it drops all substreams buffers, instead of copying it.
> 
>>
>>>   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(>lock);
>>>
>>>
>>
> 
> Felipe
> --
> To unsubscribe from this list: send the line "unsubscribe linux-usb" in
> the body of a message to majord...@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> 

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH v4 1/7] usb: gadget: f_midi: Transmit data only when IN ep is enabled

2015-10-27 Thread Felipe Ferreri Tonello
Hi Robert,

On 27/10/15 06:41, Robert Baldyga wrote:
> On 10/26/2015 11:49 PM, Felipe Tonello wrote:
>> Hi Robert,
>>
>> On Mon, Oct 26, 2015 at 10:13 PM, Robert Baldyga
>>  wrote:
>>> 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.
>>
>> There is no such flag in usb_ep struct[1].
>>
>> [1] http://lxr.free-electrons.com/source/include/linux/usb/gadget.h#L170
> 
> It's already in next branch of Felipe Balbi's tree.
> 
> Look here:
> https://git.kernel.org/cgit/linux/kernel/git/balbi/usb.git/

Cool. Thanks.

I though that this flag would be very useful, but didn't want to add to
the main struct as it seems no other driver cared about this flag. But
it is good to see that it is been merged now.

-- 
Felipe
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH v4 1/7] usb: gadget: f_midi: Transmit data only when IN ep is enabled

2015-10-26 Thread Felipe Tonello
Hi Robert,

On Mon, Oct 26, 2015 at 10:13 PM, Robert Baldyga
 wrote:
> 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.

There is no such flag in usb_ep struct[1].

[1] http://lxr.free-electrons.com/source/include/linux/usb/gadget.h#L170

>
>>  };
>>
>>  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.

Not in this case, because this function needs to consume the triggered
data from ALSA, otherwise a timeout will happen (which is worse).
Of course this is not the best solution, but it is an incremental improvement.

Patch 7 has the proper solution, which checks this flag at the
beginning of the function as expected. Also, it is more optimal
because it drops all substreams buffers, instead of copying it.

>
>>   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(>lock);
>>
>>
>

Felipe
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH v4 1/7] usb: gadget: f_midi: Transmit data only when IN ep is enabled

2015-10-26 Thread Robert Baldyga
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(>lock);
>  
> 

Best regards,
Robert

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCH v4 1/7] usb: gadget: f_midi: Transmit data only when IN ep is enabled

2015-10-26 Thread Felipe F. Tonello
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;
 };
 
 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) {
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(>lock);
 
-- 
2.1.4

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH v4 1/7] usb: gadget: f_midi: Transmit data only when IN ep is enabled

2015-10-26 Thread Felipe Tonello
Hi Robert,

On Mon, Oct 26, 2015 at 10:13 PM, Robert Baldyga
 wrote:
> 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.

There is no such flag in usb_ep struct[1].

[1] http://lxr.free-electrons.com/source/include/linux/usb/gadget.h#L170

>
>>  };
>>
>>  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.

Not in this case, because this function needs to consume the triggered
data from ALSA, otherwise a timeout will happen (which is worse).
Of course this is not the best solution, but it is an incremental improvement.

Patch 7 has the proper solution, which checks this flag at the
beginning of the function as expected. Also, it is more optimal
because it drops all substreams buffers, instead of copying it.

>
>>   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(>lock);
>>
>>
>

Felipe
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH v4 1/7] usb: gadget: f_midi: Transmit data only when IN ep is enabled

2015-10-26 Thread Robert Baldyga
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(>lock);
>  
> 

Best regards,
Robert

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCH v4 1/7] usb: gadget: f_midi: Transmit data only when IN ep is enabled

2015-10-26 Thread Felipe F. Tonello
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;
 };
 
 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) {
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(>lock);
 
-- 
2.1.4

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/