The problems about the dynamic id loading in Linux usb drivers.

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

 



Dear Greg KH:

    How are you?

    I am sorry to trouble you about the problem about the USB serial driver dynamic ID loading.

    We have a composite device with new PID, which the current linux current can not support.

    So we want to make the linux kernel can support it with the dynamic ID feature, but not the static ID feature.

    I rebuild the linux kernel source code, such as 2.6.25.5, and change the dynamic ID feature switch "no_dynamic_id"of usb-serial.c and option.c from 1 into 0.
     static struct usb_driver usb_serial_driver = {
         .name =  "usbserial",
         .probe = usb_serial_probe,
         .disconnect = usb_serial_disconnect,
         .suspend = usb_serial_suspend,
         .resume = usb_serial_resume,
         .no_dynamic_id =  0,/*its default value is 1*/
};

     After rebuilded, I reboot the system, then plug our device into system, before or after running the following command sequences:
       modprobe usbserial
       echo 12d1 140c > /sys/bus/usb/drivers/usbserial/new_id

     Then I find the system will run the function of store_new_id(), which is in ../core/driver.c, but not in ../serial/bus.c, then usb_store_new_id() is called to add the dynamic ID into the dynamic list of usbserial, then tries to attach usbserial driver to the usb devices in the bus.

     Howerver, while the probe function of usbserial driver to match the interfaces of device, the match_dynamic_id function, which is implemented in ../serial/usb-serial.c, will return NULL, because of there is no ids in the dynamic list of usbserial.

     So I am confused, the new id is be added to the dynamic list by store_new_id function, which is in ../core/driver.c, but not in ../serial/bus.c, but while probing, the dynamic list is still NULL? 

     Can you help me to find the problems what it is?

     By the way, can you tell me, why the store_new_id function which is in ../core/driver.c is called, but the store_new_id function which is in ../serial/bus.c will not be called? It also is declared in ../serial/bus.c as follows:
     static struct driver_attribute drv_attrs[] = {
         __ATTR(new_id, S_IWUSR, NULL, store_new_id),
         __ATTR_NULL,
     };

     Waiting for your reply soon.

     Thanks very much.

Best Regards,

Franko Fang
2009-1-24
******************************************************************************************
 This email and its attachments contain confidential information from HUAWEI, which is intended only for the person or entity whose address is listed above. Any use of the information contained here in any way (including, but not limited to, total or partial disclosure, reproduction, or dissemination) by persons other than the intended recipient(s) is prohibited. If you receive this email in error, please notify the sender by phone or email
 immediately and delete it!
 *****************************************************************************************
--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux Media]     [Linux Input]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Old Linux USB Devel Archive]

  Powered by Linux