.. | .. |
---|
34 | 34 | |
---|
35 | 35 | #include "usb.h" |
---|
36 | 36 | |
---|
| 37 | +#include <trace/hooks/usb.h> |
---|
37 | 38 | |
---|
38 | 39 | /* |
---|
39 | 40 | * Adds a new dynamic USBdevice ID to this driver, |
---|
.. | .. |
---|
261 | 262 | */ |
---|
262 | 263 | if (!udriver->supports_autosuspend) |
---|
263 | 264 | error = usb_autoresume_device(udev); |
---|
| 265 | + if (error) |
---|
| 266 | + return error; |
---|
264 | 267 | |
---|
265 | | - if (!error) |
---|
266 | | - error = udriver->probe(udev); |
---|
| 268 | + if (udriver->generic_subclass) |
---|
| 269 | + error = usb_generic_driver_probe(udev); |
---|
| 270 | + if (error) |
---|
| 271 | + return error; |
---|
| 272 | + |
---|
| 273 | + /* Probe the USB device with the driver in hand, but only |
---|
| 274 | + * defer to a generic driver in case the current USB |
---|
| 275 | + * device driver has an id_table or a match function; i.e., |
---|
| 276 | + * when the device driver was explicitly matched against |
---|
| 277 | + * a device. |
---|
| 278 | + * |
---|
| 279 | + * If the device driver does not have either of these, |
---|
| 280 | + * then we assume that it can bind to any device and is |
---|
| 281 | + * not truly a more specialized/non-generic driver, so a |
---|
| 282 | + * return value of -ENODEV should not force the device |
---|
| 283 | + * to be handled by the generic USB driver, as there |
---|
| 284 | + * can still be another, more specialized, device driver. |
---|
| 285 | + * |
---|
| 286 | + * This accommodates the usbip driver. |
---|
| 287 | + * |
---|
| 288 | + * TODO: What if, in the future, there are multiple |
---|
| 289 | + * specialized USB device drivers for a particular device? |
---|
| 290 | + * In such cases, there is a need to try all matching |
---|
| 291 | + * specialised device drivers prior to setting the |
---|
| 292 | + * use_generic_driver bit. |
---|
| 293 | + */ |
---|
| 294 | + error = udriver->probe(udev); |
---|
| 295 | + if (error == -ENODEV && udriver != &usb_generic_driver && |
---|
| 296 | + (udriver->id_table || udriver->match)) { |
---|
| 297 | + udev->use_generic_driver = 1; |
---|
| 298 | + return -EPROBE_DEFER; |
---|
| 299 | + } |
---|
267 | 300 | return error; |
---|
268 | 301 | } |
---|
269 | 302 | |
---|
.. | .. |
---|
273 | 306 | struct usb_device *udev = to_usb_device(dev); |
---|
274 | 307 | struct usb_device_driver *udriver = to_usb_device_driver(dev->driver); |
---|
275 | 308 | |
---|
276 | | - udriver->disconnect(udev); |
---|
| 309 | + if (udriver->disconnect) |
---|
| 310 | + udriver->disconnect(udev); |
---|
| 311 | + if (udriver->generic_subclass) |
---|
| 312 | + usb_generic_driver_disconnect(udev); |
---|
277 | 313 | if (!udriver->supports_autosuspend) |
---|
278 | 314 | usb_autosuspend_device(udev); |
---|
279 | 315 | return 0; |
---|
.. | .. |
---|
505 | 541 | struct usb_interface *iface, void *priv) |
---|
506 | 542 | { |
---|
507 | 543 | struct device *dev; |
---|
508 | | - struct usb_device *udev; |
---|
509 | 544 | int retval = 0; |
---|
510 | 545 | |
---|
511 | 546 | if (!iface) |
---|
.. | .. |
---|
518 | 553 | /* reject claim if interface is not authorized */ |
---|
519 | 554 | if (!iface->authorized) |
---|
520 | 555 | return -ENODEV; |
---|
521 | | - |
---|
522 | | - udev = interface_to_usbdev(iface); |
---|
523 | 556 | |
---|
524 | 557 | dev->driver = &driver->drvwrap.driver; |
---|
525 | 558 | usb_set_intfdata(iface, priv); |
---|
.. | .. |
---|
793 | 826 | } |
---|
794 | 827 | EXPORT_SYMBOL_GPL(usb_match_id); |
---|
795 | 828 | |
---|
| 829 | +const struct usb_device_id *usb_device_match_id(struct usb_device *udev, |
---|
| 830 | + const struct usb_device_id *id) |
---|
| 831 | +{ |
---|
| 832 | + if (!id) |
---|
| 833 | + return NULL; |
---|
| 834 | + |
---|
| 835 | + for (; id->idVendor || id->idProduct ; id++) { |
---|
| 836 | + if (usb_match_device(udev, id)) |
---|
| 837 | + return id; |
---|
| 838 | + } |
---|
| 839 | + |
---|
| 840 | + return NULL; |
---|
| 841 | +} |
---|
| 842 | + |
---|
| 843 | +bool usb_driver_applicable(struct usb_device *udev, |
---|
| 844 | + struct usb_device_driver *udrv) |
---|
| 845 | +{ |
---|
| 846 | + if (udrv->id_table && udrv->match) |
---|
| 847 | + return usb_device_match_id(udev, udrv->id_table) != NULL && |
---|
| 848 | + udrv->match(udev); |
---|
| 849 | + |
---|
| 850 | + if (udrv->id_table) |
---|
| 851 | + return usb_device_match_id(udev, udrv->id_table) != NULL; |
---|
| 852 | + |
---|
| 853 | + if (udrv->match) |
---|
| 854 | + return udrv->match(udev); |
---|
| 855 | + |
---|
| 856 | + return false; |
---|
| 857 | +} |
---|
| 858 | + |
---|
796 | 859 | static int usb_device_match(struct device *dev, struct device_driver *drv) |
---|
797 | 860 | { |
---|
798 | 861 | /* devices and interfaces are handled separately */ |
---|
799 | 862 | if (is_usb_device(dev)) { |
---|
| 863 | + struct usb_device *udev; |
---|
| 864 | + struct usb_device_driver *udrv; |
---|
800 | 865 | |
---|
801 | 866 | /* interface drivers never match devices */ |
---|
802 | 867 | if (!is_usb_device_driver(drv)) |
---|
803 | 868 | return 0; |
---|
804 | 869 | |
---|
805 | | - /* TODO: Add real matching code */ |
---|
806 | | - return 1; |
---|
| 870 | + udev = to_usb_device(dev); |
---|
| 871 | + udrv = to_usb_device_driver(drv); |
---|
| 872 | + |
---|
| 873 | + /* If the device driver under consideration does not have a |
---|
| 874 | + * id_table or a match function, then let the driver's probe |
---|
| 875 | + * function decide. |
---|
| 876 | + */ |
---|
| 877 | + if (!udrv->id_table && !udrv->match) |
---|
| 878 | + return 1; |
---|
| 879 | + |
---|
| 880 | + return usb_driver_applicable(udev, udrv); |
---|
807 | 881 | |
---|
808 | 882 | } else if (is_usb_interface(dev)) { |
---|
809 | 883 | struct usb_interface *intf; |
---|
.. | .. |
---|
870 | 944 | return 0; |
---|
871 | 945 | } |
---|
872 | 946 | |
---|
| 947 | +static int __usb_bus_reprobe_drivers(struct device *dev, void *data) |
---|
| 948 | +{ |
---|
| 949 | + struct usb_device_driver *new_udriver = data; |
---|
| 950 | + struct usb_device *udev; |
---|
| 951 | + int ret; |
---|
| 952 | + |
---|
| 953 | + /* Don't reprobe if current driver isn't usb_generic_driver */ |
---|
| 954 | + if (dev->driver != &usb_generic_driver.drvwrap.driver) |
---|
| 955 | + return 0; |
---|
| 956 | + |
---|
| 957 | + udev = to_usb_device(dev); |
---|
| 958 | + if (!usb_driver_applicable(udev, new_udriver)) |
---|
| 959 | + return 0; |
---|
| 960 | + |
---|
| 961 | + ret = device_reprobe(dev); |
---|
| 962 | + if (ret && ret != -EPROBE_DEFER) |
---|
| 963 | + dev_err(dev, "Failed to reprobe device (error %d)\n", ret); |
---|
| 964 | + |
---|
| 965 | + return 0; |
---|
| 966 | +} |
---|
| 967 | + |
---|
873 | 968 | /** |
---|
874 | 969 | * usb_register_device_driver - register a USB device (not interface) driver |
---|
875 | 970 | * @new_udriver: USB operations for the device driver |
---|
.. | .. |
---|
895 | 990 | new_udriver->drvwrap.driver.probe = usb_probe_device; |
---|
896 | 991 | new_udriver->drvwrap.driver.remove = usb_unbind_device; |
---|
897 | 992 | new_udriver->drvwrap.driver.owner = owner; |
---|
| 993 | + new_udriver->drvwrap.driver.dev_groups = new_udriver->dev_groups; |
---|
898 | 994 | |
---|
899 | 995 | retval = driver_register(&new_udriver->drvwrap.driver); |
---|
900 | 996 | |
---|
901 | | - if (!retval) |
---|
| 997 | + if (!retval) { |
---|
902 | 998 | pr_info("%s: registered new device driver %s\n", |
---|
903 | 999 | usbcore_name, new_udriver->name); |
---|
904 | | - else |
---|
905 | | - printk(KERN_ERR "%s: error %d registering device " |
---|
906 | | - " driver %s\n", |
---|
| 1000 | + /* |
---|
| 1001 | + * Check whether any device could be better served with |
---|
| 1002 | + * this new driver |
---|
| 1003 | + */ |
---|
| 1004 | + bus_for_each_dev(&usb_bus_type, NULL, new_udriver, |
---|
| 1005 | + __usb_bus_reprobe_drivers); |
---|
| 1006 | + } else { |
---|
| 1007 | + pr_err("%s: error %d registering device driver %s\n", |
---|
907 | 1008 | usbcore_name, retval, new_udriver->name); |
---|
| 1009 | + } |
---|
908 | 1010 | |
---|
909 | 1011 | return retval; |
---|
910 | 1012 | } |
---|
.. | .. |
---|
957 | 1059 | new_driver->drvwrap.driver.remove = usb_unbind_interface; |
---|
958 | 1060 | new_driver->drvwrap.driver.owner = owner; |
---|
959 | 1061 | new_driver->drvwrap.driver.mod_name = mod_name; |
---|
| 1062 | + new_driver->drvwrap.driver.dev_groups = new_driver->dev_groups; |
---|
960 | 1063 | spin_lock_init(&new_driver->dynids.lock); |
---|
961 | 1064 | INIT_LIST_HEAD(&new_driver->dynids.list); |
---|
962 | 1065 | |
---|
.. | .. |
---|
977 | 1080 | out_newid: |
---|
978 | 1081 | driver_unregister(&new_driver->drvwrap.driver); |
---|
979 | 1082 | |
---|
980 | | - printk(KERN_ERR "%s: error %d registering interface " |
---|
981 | | - " driver %s\n", |
---|
982 | | - usbcore_name, retval, new_driver->name); |
---|
| 1083 | + pr_err("%s: error %d registering interface driver %s\n", |
---|
| 1084 | + usbcore_name, retval, new_driver->name); |
---|
983 | 1085 | goto out; |
---|
984 | 1086 | } |
---|
985 | 1087 | EXPORT_SYMBOL_GPL(usb_register_driver); |
---|
.. | .. |
---|
1150 | 1252 | udev->do_remote_wakeup = 0; |
---|
1151 | 1253 | udriver = &usb_generic_driver; |
---|
1152 | 1254 | } |
---|
1153 | | - status = udriver->suspend(udev, msg); |
---|
| 1255 | + if (udriver->suspend) |
---|
| 1256 | + status = udriver->suspend(udev, msg); |
---|
| 1257 | + if (status == 0 && udriver->generic_subclass) |
---|
| 1258 | + status = usb_generic_driver_suspend(udev, msg); |
---|
1154 | 1259 | |
---|
1155 | 1260 | done: |
---|
1156 | 1261 | dev_vdbg(&udev->dev, "%s: status %d\n", __func__, status); |
---|
.. | .. |
---|
1182 | 1287 | udev->reset_resume = 1; |
---|
1183 | 1288 | |
---|
1184 | 1289 | udriver = to_usb_device_driver(udev->dev.driver); |
---|
1185 | | - status = udriver->resume(udev, msg); |
---|
| 1290 | + if (udriver->generic_subclass) |
---|
| 1291 | + status = usb_generic_driver_resume(udev, msg); |
---|
| 1292 | + if (status == 0 && udriver->resume) |
---|
| 1293 | + status = udriver->resume(udev, msg); |
---|
1186 | 1294 | |
---|
1187 | 1295 | done: |
---|
1188 | 1296 | dev_vdbg(&udev->dev, "%s: status %d\n", __func__, status); |
---|
.. | .. |
---|
1296 | 1404 | int status = 0; |
---|
1297 | 1405 | int i = 0, n = 0; |
---|
1298 | 1406 | struct usb_interface *intf; |
---|
| 1407 | + int bypass = 0; |
---|
1299 | 1408 | |
---|
1300 | 1409 | if (udev->state == USB_STATE_NOTATTACHED || |
---|
1301 | 1410 | udev->state == USB_STATE_SUSPENDED) |
---|
| 1411 | + goto done; |
---|
| 1412 | + |
---|
| 1413 | + trace_android_vh_usb_dev_suspend(udev, msg, &bypass); |
---|
| 1414 | + if (bypass) |
---|
1302 | 1415 | goto done; |
---|
1303 | 1416 | |
---|
1304 | 1417 | /* Suspend all the interfaces and then udev itself */ |
---|
.. | .. |
---|
1397 | 1510 | int status = 0; |
---|
1398 | 1511 | int i; |
---|
1399 | 1512 | struct usb_interface *intf; |
---|
| 1513 | + int bypass = 0; |
---|
1400 | 1514 | |
---|
1401 | 1515 | if (udev->state == USB_STATE_NOTATTACHED) { |
---|
1402 | 1516 | status = -ENODEV; |
---|
1403 | 1517 | goto done; |
---|
1404 | 1518 | } |
---|
| 1519 | + |
---|
| 1520 | + trace_android_vh_usb_dev_resume(udev, msg, &bypass); |
---|
| 1521 | + if (bypass) |
---|
| 1522 | + goto done; |
---|
| 1523 | + |
---|
1405 | 1524 | udev->can_submit = 1; |
---|
1406 | 1525 | |
---|
1407 | 1526 | /* Resume the device */ |
---|
.. | .. |
---|
1458 | 1577 | struct usb_device *udev = to_usb_device(dev); |
---|
1459 | 1578 | int r; |
---|
1460 | 1579 | |
---|
1461 | | - if (udev->bus->skip_resume && udev->state == USB_STATE_SUSPENDED) |
---|
1462 | | - return 0; |
---|
1463 | | - |
---|
1464 | 1580 | unbind_no_pm_drivers_interfaces(udev); |
---|
1465 | 1581 | |
---|
1466 | 1582 | /* From now on we are sure all drivers support suspend/resume |
---|
.. | .. |
---|
1496 | 1612 | { |
---|
1497 | 1613 | struct usb_device *udev = to_usb_device(dev); |
---|
1498 | 1614 | int status; |
---|
1499 | | - |
---|
1500 | | - /* |
---|
1501 | | - * Some buses would like to keep their devices in suspend |
---|
1502 | | - * state after system resume. Their resume happen when |
---|
1503 | | - * a remote wakeup is detected or interface driver start |
---|
1504 | | - * I/O. |
---|
1505 | | - */ |
---|
1506 | | - if (udev->bus->skip_resume) |
---|
1507 | | - return 0; |
---|
1508 | 1615 | |
---|
1509 | 1616 | /* For all calls, take the device back to full power and |
---|
1510 | 1617 | * tell the PM core in case it was autosuspended previously. |
---|