--- zzzz-none-000/linux-4.4.271/drivers/usb/core/usb.c 2021-06-03 06:22:09.000000000 +0000 +++ hawkeye-5590-750/linux-4.4.271/drivers/usb/core/usb.c 2023-04-19 10:22:29.000000000 +0000 @@ -66,8 +66,13 @@ EXPORT_SYMBOL_GPL(usb_disabled); #ifdef CONFIG_PM +#ifdef CONFIG_AVM_USB_PM +static int usb_autosuspend_delay = 60; /* Default delay value, + * in seconds */ +#else static int usb_autosuspend_delay = 2; /* Default delay value, * in seconds */ +#endif module_param_named(autosuspend, usb_autosuspend_delay, int, 0644); MODULE_PARM_DESC(autosuspend, "default autosuspend delay"); @@ -789,6 +794,71 @@ } EXPORT_SYMBOL_GPL(__usb_get_extra_descriptor); +static struct usb_device *match_device_name(struct usb_device *dev, + const char *name) +{ + struct usb_device *ret_dev = NULL; + struct usb_device *childdev = NULL; + int child; + + dev_dbg(&dev->dev, "check for name %s ...\n", name); + + /* see if this device matches */ + if (strcmp(dev_name(&dev->dev), name) == 0 ) { + dev_dbg(&dev->dev, "matched this device!\n"); + ret_dev = usb_get_dev(dev); + goto exit; + } + /* look through all of the children of this device */ + usb_hub_for_each_child(dev, child, childdev) { + if (childdev) { + usb_lock_device(childdev); + ret_dev = match_device_name(childdev, name); + usb_unlock_device(childdev); + if (ret_dev) + goto exit; + } + } +exit: + return ret_dev; +} + +/** + * usb_find_device_by_name - find a specific usb device in the system + * @name: the name of the device to find + * + * Returns a pointer to a struct usb_device if such a specified usb + * device is present in the system currently. The usage count of the + * device will be incremented if a device is found. Make sure to call + * usb_put_dev() when the caller is finished with the device. + * + * If a device with the specified bus id is not found, NULL is returned. + */ +struct usb_device *usb_find_device_by_name(const char *name) +{ + struct list_head *buslist; + struct usb_bus *bus; + struct usb_device *dev = NULL; + + mutex_lock(&usb_bus_list_lock); + for (buslist = usb_bus_list.next; + buslist != &usb_bus_list; + buslist = buslist->next) { + bus = container_of(buslist, struct usb_bus, bus_list); + if (!bus->root_hub) + continue; + usb_lock_device(bus->root_hub); + dev = match_device_name(bus->root_hub, name); + usb_unlock_device(bus->root_hub); + if (dev) + goto exit; + } +exit: + mutex_unlock(&usb_bus_list_lock); + return dev; +} +EXPORT_SYMBOL_GPL(usb_find_device_by_name); + /** * usb_alloc_coherent - allocate dma-consistent buffer for URB_NO_xxx_DMA_MAP * @dev: device the buffer will be used with