Hello Michal,
On Thu, Aug 9, 2012 at 12:55 AM, Michal Nazarewicz <[email protected]> wrote:
> Kernel Newbie <[email protected]> writes:
>> In the 3.4 kernel, we have observed that the RNDIS function driver clears
>> the string id reference to 0 during unbind. And, during bind, we see that
>> the rndis_init() itself is initiated only when the RNDIS string id reference
>> is 0. Is this ok?
>>
>> The issue behind this query is:
>> As rndis is requesting a new string id during every bind, during dynamic
>> function switches (e.g. enable tethering/disable tethering) RNDIS gets a
>> new string id for its descriptor from the composite framework. When
>> connecting
>> to a Windows host, due to the string id changes, the device manager treats
>> this as a new instance of the device and requests for driver installation
>> during every connect.
>
> If you reconfigure the whole composite gadget, what guarantee do you
> have that those ID's will be available? They could be assigned to
> completely unrelated strings.
>
Ok. In that case, the other gadget drivers follow the same behavior
during unbind right? e.g. f_acm or f_ecm drivers should also reset
their id's to 0 during unbind? Please correct me if my understanding
is wrong.
Thanks,
Balakumar R
>> When I did the below changes, the above issue is not seen anymore. Can
>> you provide
>> your views on this?
>>
>> --Change--
>> diff --git a/drivers/usb/gadget/f_rndis.c b/drivers/usb/gadget/f_rndis.c
>> index 6cfbb5b..3c12c42 100644
>> --- a/drivers/usb/gadget/f_rndis.c
>> +++ b/drivers/usb/gadget/f_rndis.c
>> @@ -820,7 +820,7 @@ rndis_unbind(struct usb_configuration *c, struct
>> usb_function *f)
>>
>> rndis_deregister(rndis->config);
>> rndis_exit();
>> - rndis_string_defs[0].id = 0;
>>
>> if (gadget_is_superspeed(c->cdev->gadget))
>> usb_free_descriptors(f->ss_descriptors);
>> @@ -869,14 +869,13 @@ rndis_bind_config_vendor(struct
>> usb_configuration *c, u8 ethaddr[ETH_ALEN],
>> if (!can_support_rndis(c) || !ethaddr)
>> return -EINVAL;
>>
>> + /* ... and setup RNDIS itself */
>> + status = rndis_init();
>> + if (status < 0)
>> + return status;
>> +
>> /* maybe allocate device-global string IDs */
>> if (rndis_string_defs[0].id == 0) {
>> -
>> - /* ... and setup RNDIS itself */
>> - status = rndis_init();
>> - if (status < 0)
>> - return status;
>> -
>> /* control interface label */
>> status = usb_string_id(c->cdev);
>> if (status < 0)
>> --End--
>>
>> Thanks,
>> Balakumar R
>> --
>> To unsubscribe from this list: send the line "unsubscribe linux-usb" in
>> the body of a message to [email protected]
>> More majordomo info at http://vger.kernel.org/majordomo-info.html
>
> --
> Best regards, _ _
> .o. | Liege of Serenely Enlightened Majesty of o' \,=./ `o
> ..o | Computer Science, Michał “mina86” Nazarewicz (o o)
> ooo +----<email/xmpp: [email protected]>--------------ooO--(_)--Ooo--
>
--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html