- 论坛徽章:
- 0
|
我看 USB 模块, 有一个地方, 有点疑惑. 请诸位帮忙解答下.
<drivers/usb/storage/usb.c 中间定义了 usb_storage_driver, 声明如下:- static struct usb_driver usb_storage_driver = {
- .name = "usb-storage",
- .probe = storage_probe,
- .disconnect = usb_stor_disconnect,
- .suspend = usb_stor_suspend,
- .resume = usb_stor_resume,
- .reset_resume = usb_stor_reset_resume,
- .pre_reset = usb_stor_pre_reset,
- .post_reset = usb_stor_post_reset,
- .id_table = usb_storage_usb_ids,
- .supports_autosuspend = 1,
- .soft_unbind = 1,
- };
复制代码 而其中 storage_probe 函数的定义形式如下:- static int storage_probe(struct usb_interface *intf,
- const struct usb_device_id *id)
复制代码 <drivers/usb/core/hub.c> 中有一个函数调用过程如下- hub_thread() -> hub_events() -> hub_port_connect_change() ->usb_new_device() -> device_add()
复制代码 函数 usb_new_device 传递给 device_add 函数的参数是- err = device_add(&udev->dev);
复制代码 其中 udev 是 usb_device 类型.
在 device_add 函数中会去匹配 usb bus 上的 driver. 如果匹配上了, 就会调用 driver 的 probe 函数.
调用路径为:- device_add() -> bus_probe_device() -> device_attach() -> __device_attach() -> driver_probe_device() -> really_probe()
复制代码 其中 really_probe 函数定义如下:- static int really_probe(struct device *dev, struct device_driver *drv)
- {
- int ret = 0;
- atomic_inc(&probe_count);
- pr_debug("bus: '%s': %s: probing driver %s with device %s\n",
- drv->bus->name, __func__, drv->name, dev_name(dev));
- WARN_ON(!list_empty(&dev->devres_head));
- dev->driver = drv;
- if (driver_sysfs_add(dev)) {
- printk(KERN_ERR "%s: driver_sysfs_add(%s) failed\n",
- __func__, dev_name(dev));
- goto probe_failed;
- }
- if (dev->bus->probe) {
- ret = dev->bus->probe(dev);
- if (ret)
- goto probe_failed;
- } else if (drv->probe) {
- ret = drv->probe(dev);
- if (ret)
- goto probe_failed;
- }
- driver_bound(dev);
- ret = 1;
- pr_debug("bus: '%s': %s: bound device %s to driver %s\n",
- drv->bus->name, __func__, dev_name(dev), drv->name);
- goto done;
- probe_failed:
- devres_release_all(dev);
- driver_sysfs_remove(dev);
- dev->driver = NULL;
- if (ret != -ENODEV && ret != -ENXIO) {
- /* driver matched but the probe failed */
- printk(KERN_WARNING
- "%s: probe of %s failed with error %d\n",
- drv->name, dev_name(dev), ret);
- }
- /*
- * Ignore errors returned by ->probe so that the next driver can try
- * its luck.
- */
- ret = 0;
- done:
- atomic_dec(&probe_count);
- wake_up(&probe_waitqueue);
- return ret;
- }
复制代码 我的疑惑在于:
当有U盘插入设备时: 由于 usb bus 并没有定义 probe 函数, 那么会调用 driver 的 probe 函数, 也应该就是 storage_probe 函数.
而storage_probe函数需要的两个参数类型和really_probe 传递给 probe 的不一致.
请问这中间是如何协调的? 还是调用的 probe 函数是 usb-core 的 probe, usb-core 的probe 再去调用 usb-storage 的 probe 的呢?
|
|