USB: core: Use device_driver directly in struct usb_driver and usb_device_driver
authorYajun Deng <yajun.deng@linux.dev>
Thu, 4 Jan 2024 03:28:22 +0000 (11:28 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 4 Jan 2024 15:06:32 +0000 (16:06 +0100)
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: Yajun Deng <yajun.deng@linux.dev>
Acked-by: Alan Stern <stern@rowland.harvard.edu>
Link: https://lore.kernel.org/r/20240104032822.1896596-1-yajun.deng@linux.dev
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
13 files changed:
drivers/bluetooth/btusb.c
drivers/net/can/usb/peak_usb/pcan_usb_core.c
drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c
drivers/net/wireless/marvell/mwifiex/usb.c
drivers/usb/core/driver.c
drivers/usb/core/usb.c
drivers/usb/core/usb.h
drivers/usb/misc/onboard_usb_hub.c
drivers/usb/serial/bus.c
drivers/usb/serial/usb-serial.c
drivers/usb/storage/uas.c
drivers/usb/usbip/stub_main.c
include/linux/usb.h

index b8e9de887b5de44e4968590b29e268de8d7917cd..02b3b1825403ae0bd821c9556dafb436d03b54eb 100644 (file)
@@ -4790,10 +4790,8 @@ static struct usb_driver btusb_driver = {
        .disable_hub_initiated_lpm = 1,
 
 #ifdef CONFIG_DEV_COREDUMP
-       .drvwrap = {
-               .driver = {
-                       .coredump = btusb_coredump,
-               },
+       .driver = {
+               .coredump = btusb_coredump,
        },
 #endif
 };
index 24ad9f593a7736fde6e2e0299fd80df5233ddf9c..1efa39e134f4ccefd6d3ab7717171fda86611d22 100644 (file)
@@ -1143,7 +1143,7 @@ static void __exit peak_usb_exit(void)
        int err;
 
        /* 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);
        if (err)
                pr_err("%s: failed to stop all can devices (err %d)\n",
index 2178675ae1a44d0e04afdd4d26ad6aa0625da8cf..0ccf735316c24dc1bb06ae0999327a04ea76d212 100644 (file)
@@ -1581,7 +1581,7 @@ static int brcmf_usb_reset_device(struct device *dev, void *notused)
 
 void brcmf_usb_exit(void)
 {
-       struct device_driver *drv = &brcmf_usbdrvr.drvwrap.driver;
+       struct device_driver *drv = &brcmf_usbdrvr.driver;
        int ret;
 
        brcmf_dbg(USB, "Enter\n");
index d3ab9572e71157f4436c7c7f429617070ef4b674..515e6db410f28aefc63a5587dbb274866b053482 100644 (file)
@@ -687,7 +687,7 @@ static struct usb_driver mwifiex_usb_driver = {
        .suspend = mwifiex_usb_suspend,
        .resume = mwifiex_usb_resume,
        .soft_unbind = 1,
-       .drvwrap.driver = {
+       .driver = {
                .coredump = mwifiex_usb_coredump,
        },
 };
index 1dc0c041304383c7c639f03909dc3a0142d89b66..e01b1913d02bf68aa3dd3ad4e3a30adb11585c5f 100644 (file)
@@ -189,13 +189,13 @@ static int usb_create_newid_files(struct usb_driver *usb_drv)
                goto exit;
 
        if (usb_drv->probe != NULL) {
-               error = driver_create_file(&usb_drv->drvwrap.driver,
+               error = driver_create_file(&usb_drv->driver,
                                           &driver_attr_new_id);
                if (error == 0) {
-                       error = driver_create_file(&usb_drv->drvwrap.driver,
+                       error = driver_create_file(&usb_drv->driver,
                                        &driver_attr_remove_id);
                        if (error)
-                               driver_remove_file(&usb_drv->drvwrap.driver,
+                               driver_remove_file(&usb_drv->driver,
                                                &driver_attr_new_id);
                }
        }
@@ -209,9 +209,9 @@ static void usb_remove_newid_files(struct usb_driver *usb_drv)
                return;
 
        if (usb_drv->probe != NULL) {
-               driver_remove_file(&usb_drv->drvwrap.driver,
+               driver_remove_file(&usb_drv->driver,
                                &driver_attr_remove_id);
-               driver_remove_file(&usb_drv->drvwrap.driver,
+               driver_remove_file(&usb_drv->driver,
                                   &driver_attr_new_id);
        }
 }
@@ -552,7 +552,7 @@ int usb_driver_claim_interface(struct usb_driver *driver,
        if (!iface->authorized)
                return -ENODEV;
 
-       dev->driver = &driver->drvwrap.driver;
+       dev->driver = &driver->driver;
        usb_set_intfdata(iface, data);
        iface->needs_binding = 0;
 
@@ -615,7 +615,7 @@ void usb_driver_release_interface(struct usb_driver *driver,
        struct device *dev = &iface->dev;
 
        /* 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;
 
        /* don't release from within disconnect() */
@@ -950,7 +950,7 @@ static int __usb_bus_reprobe_drivers(struct device *dev, void *data)
        int ret;
 
        /* 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;
 
        udev = to_usb_device(dev);
@@ -964,6 +964,11 @@ static int __usb_bus_reprobe_drivers(struct device *dev, void *data)
        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
  * @new_udriver: USB operations for the device driver
@@ -983,15 +988,14 @@ int usb_register_device_driver(struct usb_device_driver *new_udriver,
        if (usb_disabled())
                return -ENODEV;
 
-       new_udriver->drvwrap.for_devices = 1;
-       new_udriver->drvwrap.driver.name = new_udriver->name;
-       new_udriver->drvwrap.driver.bus = &usb_bus_type;
-       new_udriver->drvwrap.driver.probe = usb_probe_device;
-       new_udriver->drvwrap.driver.remove = usb_unbind_device;
-       new_udriver->drvwrap.driver.owner = owner;
-       new_udriver->drvwrap.driver.dev_groups = new_udriver->dev_groups;
+       new_udriver->driver.name = new_udriver->name;
+       new_udriver->driver.bus = &usb_bus_type;
+       new_udriver->driver.probe = usb_probe_device;
+       new_udriver->driver.remove = usb_unbind_device;
+       new_udriver->driver.owner = owner;
+       new_udriver->driver.dev_groups = new_udriver->dev_groups;
 
-       retval = driver_register(&new_udriver->drvwrap.driver);
+       retval = driver_register(&new_udriver->driver);
 
        if (!retval) {
                pr_info("%s: registered new device driver %s\n",
@@ -1023,7 +1027,7 @@ void usb_deregister_device_driver(struct usb_device_driver *udriver)
        pr_info("%s: deregistering device driver %s\n",
                        usbcore_name, udriver->name);
 
-       driver_unregister(&udriver->drvwrap.driver);
+       driver_unregister(&udriver->driver);
 }
 EXPORT_SYMBOL_GPL(usb_deregister_device_driver);
 
@@ -1051,18 +1055,17 @@ int usb_register_driver(struct usb_driver *new_driver, struct module *owner,
        if (usb_disabled())
                return -ENODEV;
 
-       new_driver->drvwrap.for_devices = 0;
-       new_driver->drvwrap.driver.name = new_driver->name;
-       new_driver->drvwrap.driver.bus = &usb_bus_type;
-       new_driver->drvwrap.driver.probe = usb_probe_interface;
-       new_driver->drvwrap.driver.remove = usb_unbind_interface;
-       new_driver->drvwrap.driver.owner = owner;
-       new_driver->drvwrap.driver.mod_name = mod_name;
-       new_driver->drvwrap.driver.dev_groups = new_driver->dev_groups;
+       new_driver->driver.name = new_driver->name;
+       new_driver->driver.bus = &usb_bus_type;
+       new_driver->driver.probe = usb_probe_interface;
+       new_driver->driver.remove = usb_unbind_interface;
+       new_driver->driver.owner = owner;
+       new_driver->driver.mod_name = mod_name;
+       new_driver->driver.dev_groups = new_driver->dev_groups;
        spin_lock_init(&new_driver->dynids.lock);
        INIT_LIST_HEAD(&new_driver->dynids.list);
 
-       retval = driver_register(&new_driver->drvwrap.driver);
+       retval = driver_register(&new_driver->driver);
        if (retval)
                goto out;
 
@@ -1077,7 +1080,7 @@ out:
        return retval;
 
 out_newid:
-       driver_unregister(&new_driver->drvwrap.driver);
+       driver_unregister(&new_driver->driver);
 
        pr_err("%s: error %d registering interface driver %s\n",
                usbcore_name, retval, new_driver->name);
@@ -1102,7 +1105,7 @@ void usb_deregister(struct usb_driver *driver)
                        usbcore_name, driver->name);
 
        usb_remove_newid_files(driver);
-       driver_unregister(&driver->drvwrap.driver);
+       driver_unregister(&driver->driver);
        usb_free_dynids(driver);
 }
 EXPORT_SYMBOL_GPL(usb_deregister);
index 2a938cf47ccd6239dd0f1a9d8eed95618de75d64..dc8d9228a5e759775cc16b0a1bbacf514235b396 100644 (file)
@@ -431,7 +431,7 @@ struct usb_interface *usb_find_interface(struct usb_driver *drv, int minor)
        struct device *dev;
 
        argb.minor = minor;
-       argb.drv = &drv->drvwrap.driver;
+       argb.drv = &drv->driver;
 
        dev = bus_find_device(&usb_bus_type, NULL, &argb, __find_interface);
 
index 60363153fc3f38aed322182bc46357ca5ca6ec74..bfecb50773b6b61d04b9d696faaab7350c9644a6 100644 (file)
@@ -175,13 +175,7 @@ static inline int is_root_hub(struct usb_device *udev)
        return (udev->parent == NULL);
 }
 
-/* Do the same for device drivers and interface drivers. */
-
-static inline int is_usb_device_driver(struct device_driver *drv)
-{
-       return container_of(drv, struct usbdrv_wrap, driver)->
-                       for_devices;
-}
+extern bool is_usb_device_driver(const struct device_driver *drv);
 
 /* for labeling diagnostics */
 extern const char *usbcore_name;
index c09fb6bd7d7d7fba969b7a357737cebd25955f78..0dd2b032c90b9bc6196ab7a3752e327c18a61fb0 100644 (file)
@@ -244,7 +244,7 @@ static void onboard_hub_attach_usb_driver(struct work_struct *work)
 {
        int err;
 
-       err = driver_attach(&onboard_hub_usbdev_driver.drvwrap.driver);
+       err = driver_attach(&onboard_hub_usbdev_driver.driver);
        if (err)
                pr_err("Failed to attach USB driver: %pe\n", ERR_PTR(err));
 }
index 3eb8dc3a1a8f529fdb2d2e66a376aa3fb1da191e..6c812d01b37d7b57e0f229ed52315f79271bdde5 100644 (file)
@@ -113,7 +113,7 @@ static ssize_t new_id_store(struct device_driver *driver,
        if (retval >= 0 && usb_drv->usb_driver != NULL)
                retval = usb_store_new_id(&usb_drv->usb_driver->dynids,
                                          usb_drv->usb_driver->id_table,
-                                         &usb_drv->usb_driver->drvwrap.driver,
+                                         &usb_drv->usb_driver->driver,
                                          buf, count);
        return retval;
 }
index 17b09f03ef84594cf47698d6964fc80a77b0a0dc..f1e91eb7f8a4136e5f657748889be250193ea32a 100644 (file)
@@ -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 */
        udriver->id_table = id_table;
-       rc = driver_attach(&udriver->drvwrap.driver);
+       rc = driver_attach(&udriver->driver);
        return 0;
 
 err_deregister_drivers:
index 696bb0b2359922dedf4921bf233a23560629a46e..9707f53cfda9c08507082ac33b69b5d146c6927f 100644 (file)
@@ -1246,7 +1246,7 @@ static struct usb_driver uas_driver = {
        .suspend = uas_suspend,
        .resume = uas_resume,
        .reset_resume = uas_reset_resume,
-       .drvwrap.driver.shutdown = uas_shutdown,
+       .driver.shutdown = uas_shutdown,
        .id_table = uas_usb_ids,
 };
 
index 0a6624d37929e85f1771d16df64a72ce92a2c623..79110a69d697c1e7fe511739b564659a46f24815 100644 (file)
@@ -377,14 +377,14 @@ static int __init usbip_host_init(void)
                goto err_usb_register;
        }
 
-       ret = driver_create_file(&stub_driver.drvwrap.driver,
+       ret = driver_create_file(&stub_driver.driver,
                                 &driver_attr_match_busid);
        if (ret) {
                pr_err("driver_create_file failed\n");
                goto err_create_file;
        }
 
-       ret = driver_create_file(&stub_driver.drvwrap.driver,
+       ret = driver_create_file(&stub_driver.driver,
                                 &driver_attr_rebind);
        if (ret) {
                pr_err("driver_create_file failed\n");
@@ -402,10 +402,10 @@ err_usb_register:
 
 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_remove_file(&stub_driver.drvwrap.driver,
+       driver_remove_file(&stub_driver.driver,
                           &driver_attr_rebind);
 
        /*
index 07556341ba2b425aba48ac120bcec247f7b3b7f4..9e52179872a50dd3598afc606b4c524caa51ed1d 100644 (file)
@@ -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);
 
-/**
- * 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
  * @name: The driver name should be unique among USB drivers,
@@ -1193,7 +1183,7 @@ struct usbdrv_wrap {
  *     is bound to the driver.
  * @dynids: used internally to hold the list of dynamically added device
  *     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
  *     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
@@ -1241,13 +1231,13 @@ struct usb_driver {
        const struct attribute_group **dev_groups;
 
        struct usb_dynids dynids;
-       struct usbdrv_wrap drvwrap;
+       struct device_driver driver;
        unsigned int no_dynamic_id:1;
        unsigned int supports_autosuspend:1;
        unsigned int disable_hub_initiated_lpm: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
@@ -1268,7 +1258,7 @@ struct usb_driver {
  *     on to call the normal usb_choose_configuration().
  * @dev_groups: Attributes attached to the device that will be created once it
  *     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
  *     probe() time.
  * @supports_autosuspend: if set to 0, the USB core will not allow autosuspend
@@ -1277,7 +1267,7 @@ struct usb_driver {
  *     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.
  *
- * 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.
  */
 struct usb_device_driver {
@@ -1293,13 +1283,13 @@ struct usb_device_driver {
        int (*choose_configuration) (struct usb_device *udev);
 
        const struct attribute_group **dev_groups;
-       struct usbdrv_wrap drvwrap;
+       struct device_driver driver;
        const struct usb_device_id *id_table;
        unsigned int supports_autosuspend:1;
        unsigned int generic_subclass:1;
 };
 #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