Commit 49a78b05 authored by Yajun Deng's avatar Yajun Deng Committed by Greg Kroah-Hartman

USB: core: Use device_driver directly in struct usb_driver and usb_device_driver

There is usbdrv_wrap in struct usb_driver and usb_device_driver, it
contains device_driver and for_devices. for_devices is used to
distinguish between device drivers and interface drivers.

Like the is_usb_device(), it tests the type of the device. We can test
that if the probe of device_driver is equal to usb_probe_device in
is_usb_device_driver(), and then the struct usbdrv_wrap is no longer
needed.

Clean up struct usbdrv_wrap, use device_driver directly in struct
usb_driver and usb_device_driver. This makes the code cleaner.
Signed-off-by: default avatarYajun Deng <yajun.deng@linux.dev>
Acked-by: default avatarAlan Stern <stern@rowland.harvard.edu>
Link: https://lore.kernel.org/r/20240104032822.1896596-1-yajun.deng@linux.devSigned-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 33d4137d
...@@ -4790,11 +4790,9 @@ static struct usb_driver btusb_driver = { ...@@ -4790,11 +4790,9 @@ static struct usb_driver btusb_driver = {
.disable_hub_initiated_lpm = 1, .disable_hub_initiated_lpm = 1,
#ifdef CONFIG_DEV_COREDUMP #ifdef CONFIG_DEV_COREDUMP
.drvwrap = {
.driver = { .driver = {
.coredump = btusb_coredump, .coredump = btusb_coredump,
}, },
},
#endif #endif
}; };
......
...@@ -1143,7 +1143,7 @@ static void __exit peak_usb_exit(void) ...@@ -1143,7 +1143,7 @@ static void __exit peak_usb_exit(void)
int err; int err;
/* last chance do send any synchronous commands here */ /* last chance do send any synchronous commands here */
err = driver_for_each_device(&peak_usb_driver.drvwrap.driver, NULL, err = driver_for_each_device(&peak_usb_driver.driver, NULL,
NULL, peak_usb_do_device_exit); NULL, peak_usb_do_device_exit);
if (err) if (err)
pr_err("%s: failed to stop all can devices (err %d)\n", pr_err("%s: failed to stop all can devices (err %d)\n",
......
...@@ -1581,7 +1581,7 @@ static int brcmf_usb_reset_device(struct device *dev, void *notused) ...@@ -1581,7 +1581,7 @@ static int brcmf_usb_reset_device(struct device *dev, void *notused)
void brcmf_usb_exit(void) void brcmf_usb_exit(void)
{ {
struct device_driver *drv = &brcmf_usbdrvr.drvwrap.driver; struct device_driver *drv = &brcmf_usbdrvr.driver;
int ret; int ret;
brcmf_dbg(USB, "Enter\n"); brcmf_dbg(USB, "Enter\n");
......
...@@ -687,7 +687,7 @@ static struct usb_driver mwifiex_usb_driver = { ...@@ -687,7 +687,7 @@ static struct usb_driver mwifiex_usb_driver = {
.suspend = mwifiex_usb_suspend, .suspend = mwifiex_usb_suspend,
.resume = mwifiex_usb_resume, .resume = mwifiex_usb_resume,
.soft_unbind = 1, .soft_unbind = 1,
.drvwrap.driver = { .driver = {
.coredump = mwifiex_usb_coredump, .coredump = mwifiex_usb_coredump,
}, },
}; };
......
...@@ -189,13 +189,13 @@ static int usb_create_newid_files(struct usb_driver *usb_drv) ...@@ -189,13 +189,13 @@ static int usb_create_newid_files(struct usb_driver *usb_drv)
goto exit; goto exit;
if (usb_drv->probe != NULL) { if (usb_drv->probe != NULL) {
error = driver_create_file(&usb_drv->drvwrap.driver, error = driver_create_file(&usb_drv->driver,
&driver_attr_new_id); &driver_attr_new_id);
if (error == 0) { if (error == 0) {
error = driver_create_file(&usb_drv->drvwrap.driver, error = driver_create_file(&usb_drv->driver,
&driver_attr_remove_id); &driver_attr_remove_id);
if (error) if (error)
driver_remove_file(&usb_drv->drvwrap.driver, driver_remove_file(&usb_drv->driver,
&driver_attr_new_id); &driver_attr_new_id);
} }
} }
...@@ -209,9 +209,9 @@ static void usb_remove_newid_files(struct usb_driver *usb_drv) ...@@ -209,9 +209,9 @@ static void usb_remove_newid_files(struct usb_driver *usb_drv)
return; return;
if (usb_drv->probe != NULL) { if (usb_drv->probe != NULL) {
driver_remove_file(&usb_drv->drvwrap.driver, driver_remove_file(&usb_drv->driver,
&driver_attr_remove_id); &driver_attr_remove_id);
driver_remove_file(&usb_drv->drvwrap.driver, driver_remove_file(&usb_drv->driver,
&driver_attr_new_id); &driver_attr_new_id);
} }
} }
...@@ -552,7 +552,7 @@ int usb_driver_claim_interface(struct usb_driver *driver, ...@@ -552,7 +552,7 @@ int usb_driver_claim_interface(struct usb_driver *driver,
if (!iface->authorized) if (!iface->authorized)
return -ENODEV; return -ENODEV;
dev->driver = &driver->drvwrap.driver; dev->driver = &driver->driver;
usb_set_intfdata(iface, data); usb_set_intfdata(iface, data);
iface->needs_binding = 0; iface->needs_binding = 0;
...@@ -615,7 +615,7 @@ void usb_driver_release_interface(struct usb_driver *driver, ...@@ -615,7 +615,7 @@ void usb_driver_release_interface(struct usb_driver *driver,
struct device *dev = &iface->dev; struct device *dev = &iface->dev;
/* this should never happen, don't release something that's not ours */ /* this should never happen, don't release something that's not ours */
if (!dev->driver || dev->driver != &driver->drvwrap.driver) if (!dev->driver || dev->driver != &driver->driver)
return; return;
/* don't release from within disconnect() */ /* don't release from within disconnect() */
...@@ -950,7 +950,7 @@ static int __usb_bus_reprobe_drivers(struct device *dev, void *data) ...@@ -950,7 +950,7 @@ static int __usb_bus_reprobe_drivers(struct device *dev, void *data)
int ret; int ret;
/* Don't reprobe if current driver isn't usb_generic_driver */ /* Don't reprobe if current driver isn't usb_generic_driver */
if (dev->driver != &usb_generic_driver.drvwrap.driver) if (dev->driver != &usb_generic_driver.driver)
return 0; return 0;
udev = to_usb_device(dev); udev = to_usb_device(dev);
...@@ -964,6 +964,11 @@ static int __usb_bus_reprobe_drivers(struct device *dev, void *data) ...@@ -964,6 +964,11 @@ static int __usb_bus_reprobe_drivers(struct device *dev, void *data)
return 0; return 0;
} }
bool is_usb_device_driver(const struct device_driver *drv)
{
return drv->probe == usb_probe_device;
}
/** /**
* usb_register_device_driver - register a USB device (not interface) driver * usb_register_device_driver - register a USB device (not interface) driver
* @new_udriver: USB operations for the device driver * @new_udriver: USB operations for the device driver
...@@ -983,15 +988,14 @@ int usb_register_device_driver(struct usb_device_driver *new_udriver, ...@@ -983,15 +988,14 @@ int usb_register_device_driver(struct usb_device_driver *new_udriver,
if (usb_disabled()) if (usb_disabled())
return -ENODEV; return -ENODEV;
new_udriver->drvwrap.for_devices = 1; new_udriver->driver.name = new_udriver->name;
new_udriver->drvwrap.driver.name = new_udriver->name; new_udriver->driver.bus = &usb_bus_type;
new_udriver->drvwrap.driver.bus = &usb_bus_type; new_udriver->driver.probe = usb_probe_device;
new_udriver->drvwrap.driver.probe = usb_probe_device; new_udriver->driver.remove = usb_unbind_device;
new_udriver->drvwrap.driver.remove = usb_unbind_device; new_udriver->driver.owner = owner;
new_udriver->drvwrap.driver.owner = owner; new_udriver->driver.dev_groups = new_udriver->dev_groups;
new_udriver->drvwrap.driver.dev_groups = new_udriver->dev_groups;
retval = driver_register(&new_udriver->drvwrap.driver); retval = driver_register(&new_udriver->driver);
if (!retval) { if (!retval) {
pr_info("%s: registered new device driver %s\n", pr_info("%s: registered new device driver %s\n",
...@@ -1023,7 +1027,7 @@ void usb_deregister_device_driver(struct usb_device_driver *udriver) ...@@ -1023,7 +1027,7 @@ void usb_deregister_device_driver(struct usb_device_driver *udriver)
pr_info("%s: deregistering device driver %s\n", pr_info("%s: deregistering device driver %s\n",
usbcore_name, udriver->name); usbcore_name, udriver->name);
driver_unregister(&udriver->drvwrap.driver); driver_unregister(&udriver->driver);
} }
EXPORT_SYMBOL_GPL(usb_deregister_device_driver); EXPORT_SYMBOL_GPL(usb_deregister_device_driver);
...@@ -1051,18 +1055,17 @@ int usb_register_driver(struct usb_driver *new_driver, struct module *owner, ...@@ -1051,18 +1055,17 @@ int usb_register_driver(struct usb_driver *new_driver, struct module *owner,
if (usb_disabled()) if (usb_disabled())
return -ENODEV; return -ENODEV;
new_driver->drvwrap.for_devices = 0; new_driver->driver.name = new_driver->name;
new_driver->drvwrap.driver.name = new_driver->name; new_driver->driver.bus = &usb_bus_type;
new_driver->drvwrap.driver.bus = &usb_bus_type; new_driver->driver.probe = usb_probe_interface;
new_driver->drvwrap.driver.probe = usb_probe_interface; new_driver->driver.remove = usb_unbind_interface;
new_driver->drvwrap.driver.remove = usb_unbind_interface; new_driver->driver.owner = owner;
new_driver->drvwrap.driver.owner = owner; new_driver->driver.mod_name = mod_name;
new_driver->drvwrap.driver.mod_name = mod_name; new_driver->driver.dev_groups = new_driver->dev_groups;
new_driver->drvwrap.driver.dev_groups = new_driver->dev_groups;
spin_lock_init(&new_driver->dynids.lock); spin_lock_init(&new_driver->dynids.lock);
INIT_LIST_HEAD(&new_driver->dynids.list); INIT_LIST_HEAD(&new_driver->dynids.list);
retval = driver_register(&new_driver->drvwrap.driver); retval = driver_register(&new_driver->driver);
if (retval) if (retval)
goto out; goto out;
...@@ -1077,7 +1080,7 @@ int usb_register_driver(struct usb_driver *new_driver, struct module *owner, ...@@ -1077,7 +1080,7 @@ int usb_register_driver(struct usb_driver *new_driver, struct module *owner,
return retval; return retval;
out_newid: out_newid:
driver_unregister(&new_driver->drvwrap.driver); driver_unregister(&new_driver->driver);
pr_err("%s: error %d registering interface driver %s\n", pr_err("%s: error %d registering interface driver %s\n",
usbcore_name, retval, new_driver->name); usbcore_name, retval, new_driver->name);
...@@ -1102,7 +1105,7 @@ void usb_deregister(struct usb_driver *driver) ...@@ -1102,7 +1105,7 @@ void usb_deregister(struct usb_driver *driver)
usbcore_name, driver->name); usbcore_name, driver->name);
usb_remove_newid_files(driver); usb_remove_newid_files(driver);
driver_unregister(&driver->drvwrap.driver); driver_unregister(&driver->driver);
usb_free_dynids(driver); usb_free_dynids(driver);
} }
EXPORT_SYMBOL_GPL(usb_deregister); EXPORT_SYMBOL_GPL(usb_deregister);
......
...@@ -431,7 +431,7 @@ struct usb_interface *usb_find_interface(struct usb_driver *drv, int minor) ...@@ -431,7 +431,7 @@ struct usb_interface *usb_find_interface(struct usb_driver *drv, int minor)
struct device *dev; struct device *dev;
argb.minor = minor; argb.minor = minor;
argb.drv = &drv->drvwrap.driver; argb.drv = &drv->driver;
dev = bus_find_device(&usb_bus_type, NULL, &argb, __find_interface); dev = bus_find_device(&usb_bus_type, NULL, &argb, __find_interface);
......
...@@ -175,13 +175,7 @@ static inline int is_root_hub(struct usb_device *udev) ...@@ -175,13 +175,7 @@ static inline int is_root_hub(struct usb_device *udev)
return (udev->parent == NULL); return (udev->parent == NULL);
} }
/* Do the same for device drivers and interface drivers. */ extern bool is_usb_device_driver(const struct device_driver *drv);
static inline int is_usb_device_driver(struct device_driver *drv)
{
return container_of(drv, struct usbdrv_wrap, driver)->
for_devices;
}
/* for labeling diagnostics */ /* for labeling diagnostics */
extern const char *usbcore_name; extern const char *usbcore_name;
......
...@@ -244,7 +244,7 @@ static void onboard_hub_attach_usb_driver(struct work_struct *work) ...@@ -244,7 +244,7 @@ static void onboard_hub_attach_usb_driver(struct work_struct *work)
{ {
int err; int err;
err = driver_attach(&onboard_hub_usbdev_driver.drvwrap.driver); err = driver_attach(&onboard_hub_usbdev_driver.driver);
if (err) if (err)
pr_err("Failed to attach USB driver: %pe\n", ERR_PTR(err)); pr_err("Failed to attach USB driver: %pe\n", ERR_PTR(err));
} }
......
...@@ -113,7 +113,7 @@ static ssize_t new_id_store(struct device_driver *driver, ...@@ -113,7 +113,7 @@ static ssize_t new_id_store(struct device_driver *driver,
if (retval >= 0 && usb_drv->usb_driver != NULL) if (retval >= 0 && usb_drv->usb_driver != NULL)
retval = usb_store_new_id(&usb_drv->usb_driver->dynids, retval = usb_store_new_id(&usb_drv->usb_driver->dynids,
usb_drv->usb_driver->id_table, usb_drv->usb_driver->id_table,
&usb_drv->usb_driver->drvwrap.driver, &usb_drv->usb_driver->driver,
buf, count); buf, count);
return retval; return retval;
} }
......
...@@ -1521,7 +1521,7 @@ int usb_serial_register_drivers(struct usb_serial_driver *const serial_drivers[] ...@@ -1521,7 +1521,7 @@ int usb_serial_register_drivers(struct usb_serial_driver *const serial_drivers[]
/* Now set udriver's id_table and look for matches */ /* Now set udriver's id_table and look for matches */
udriver->id_table = id_table; udriver->id_table = id_table;
rc = driver_attach(&udriver->drvwrap.driver); rc = driver_attach(&udriver->driver);
return 0; return 0;
err_deregister_drivers: err_deregister_drivers:
......
...@@ -1246,7 +1246,7 @@ static struct usb_driver uas_driver = { ...@@ -1246,7 +1246,7 @@ static struct usb_driver uas_driver = {
.suspend = uas_suspend, .suspend = uas_suspend,
.resume = uas_resume, .resume = uas_resume,
.reset_resume = uas_reset_resume, .reset_resume = uas_reset_resume,
.drvwrap.driver.shutdown = uas_shutdown, .driver.shutdown = uas_shutdown,
.id_table = uas_usb_ids, .id_table = uas_usb_ids,
}; };
......
...@@ -377,14 +377,14 @@ static int __init usbip_host_init(void) ...@@ -377,14 +377,14 @@ static int __init usbip_host_init(void)
goto err_usb_register; goto err_usb_register;
} }
ret = driver_create_file(&stub_driver.drvwrap.driver, ret = driver_create_file(&stub_driver.driver,
&driver_attr_match_busid); &driver_attr_match_busid);
if (ret) { if (ret) {
pr_err("driver_create_file failed\n"); pr_err("driver_create_file failed\n");
goto err_create_file; goto err_create_file;
} }
ret = driver_create_file(&stub_driver.drvwrap.driver, ret = driver_create_file(&stub_driver.driver,
&driver_attr_rebind); &driver_attr_rebind);
if (ret) { if (ret) {
pr_err("driver_create_file failed\n"); pr_err("driver_create_file failed\n");
...@@ -402,10 +402,10 @@ static int __init usbip_host_init(void) ...@@ -402,10 +402,10 @@ static int __init usbip_host_init(void)
static void __exit usbip_host_exit(void) static void __exit usbip_host_exit(void)
{ {
driver_remove_file(&stub_driver.drvwrap.driver, driver_remove_file(&stub_driver.driver,
&driver_attr_match_busid); &driver_attr_match_busid);
driver_remove_file(&stub_driver.drvwrap.driver, driver_remove_file(&stub_driver.driver,
&driver_attr_rebind); &driver_attr_rebind);
/* /*
......
...@@ -1143,16 +1143,6 @@ extern ssize_t usb_store_new_id(struct usb_dynids *dynids, ...@@ -1143,16 +1143,6 @@ extern ssize_t usb_store_new_id(struct usb_dynids *dynids,
extern ssize_t usb_show_dynids(struct usb_dynids *dynids, char *buf); extern ssize_t usb_show_dynids(struct usb_dynids *dynids, char *buf);
/**
* struct usbdrv_wrap - wrapper for driver-model structure
* @driver: The driver-model core driver structure.
* @for_devices: Non-zero for device drivers, 0 for interface drivers.
*/
struct usbdrv_wrap {
struct device_driver driver;
int for_devices;
};
/** /**
* struct usb_driver - identifies USB interface driver to usbcore * struct usb_driver - identifies USB interface driver to usbcore
* @name: The driver name should be unique among USB drivers, * @name: The driver name should be unique among USB drivers,
...@@ -1193,7 +1183,7 @@ struct usbdrv_wrap { ...@@ -1193,7 +1183,7 @@ struct usbdrv_wrap {
* is bound to the driver. * is bound to the driver.
* @dynids: used internally to hold the list of dynamically added device * @dynids: used internally to hold the list of dynamically added device
* ids for this driver. * ids for this driver.
* @drvwrap: Driver-model core structure wrapper. * @driver: The driver-model core driver structure.
* @no_dynamic_id: if set to 1, the USB core will not allow dynamic ids to be * @no_dynamic_id: if set to 1, the USB core will not allow dynamic ids to be
* added to this driver by preventing the sysfs file from being created. * added to this driver by preventing the sysfs file from being created.
* @supports_autosuspend: if set to 0, the USB core will not allow autosuspend * @supports_autosuspend: if set to 0, the USB core will not allow autosuspend
...@@ -1241,13 +1231,13 @@ struct usb_driver { ...@@ -1241,13 +1231,13 @@ struct usb_driver {
const struct attribute_group **dev_groups; const struct attribute_group **dev_groups;
struct usb_dynids dynids; struct usb_dynids dynids;
struct usbdrv_wrap drvwrap; struct device_driver driver;
unsigned int no_dynamic_id:1; unsigned int no_dynamic_id:1;
unsigned int supports_autosuspend:1; unsigned int supports_autosuspend:1;
unsigned int disable_hub_initiated_lpm:1; unsigned int disable_hub_initiated_lpm:1;
unsigned int soft_unbind:1; unsigned int soft_unbind:1;
}; };
#define to_usb_driver(d) container_of(d, struct usb_driver, drvwrap.driver) #define to_usb_driver(d) container_of(d, struct usb_driver, driver)
/** /**
* struct usb_device_driver - identifies USB device driver to usbcore * struct usb_device_driver - identifies USB device driver to usbcore
...@@ -1268,7 +1258,7 @@ struct usb_driver { ...@@ -1268,7 +1258,7 @@ struct usb_driver {
* on to call the normal usb_choose_configuration(). * on to call the normal usb_choose_configuration().
* @dev_groups: Attributes attached to the device that will be created once it * @dev_groups: Attributes attached to the device that will be created once it
* is bound to the driver. * is bound to the driver.
* @drvwrap: Driver-model core structure wrapper. * @driver: The driver-model core driver structure.
* @id_table: used with @match() to select better matching driver at * @id_table: used with @match() to select better matching driver at
* probe() time. * probe() time.
* @supports_autosuspend: if set to 0, the USB core will not allow autosuspend * @supports_autosuspend: if set to 0, the USB core will not allow autosuspend
...@@ -1277,7 +1267,7 @@ struct usb_driver { ...@@ -1277,7 +1267,7 @@ struct usb_driver {
* resume and suspend functions will be called in addition to the driver's * resume and suspend functions will be called in addition to the driver's
* own, so this part of the setup does not need to be replicated. * own, so this part of the setup does not need to be replicated.
* *
* USB drivers must provide all the fields listed above except drvwrap, * USB drivers must provide all the fields listed above except driver,
* match, and id_table. * match, and id_table.
*/ */
struct usb_device_driver { struct usb_device_driver {
...@@ -1293,13 +1283,13 @@ struct usb_device_driver { ...@@ -1293,13 +1283,13 @@ struct usb_device_driver {
int (*choose_configuration) (struct usb_device *udev); int (*choose_configuration) (struct usb_device *udev);
const struct attribute_group **dev_groups; const struct attribute_group **dev_groups;
struct usbdrv_wrap drvwrap; struct device_driver driver;
const struct usb_device_id *id_table; const struct usb_device_id *id_table;
unsigned int supports_autosuspend:1; unsigned int supports_autosuspend:1;
unsigned int generic_subclass:1; unsigned int generic_subclass:1;
}; };
#define to_usb_device_driver(d) container_of(d, struct usb_device_driver, \ #define to_usb_device_driver(d) container_of(d, struct usb_device_driver, \
drvwrap.driver) driver)
/** /**
* struct usb_class_driver - identifies a USB driver that wants to use the USB major number * struct usb_class_driver - identifies a USB driver that wants to use the USB major number
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment