USB bus numbering is based on directly dealing with bitmaps and
defines a separate list of busses.
This can be simplified and unified by using existing idr functionality.

Signed-off-by: Heiner Kallweit <hkallwe...@gmail.com>
---
 drivers/usb/core/devices.c      | 10 ++--------
 drivers/usb/core/hcd.c          | 21 ++++++---------------
 drivers/usb/core/usb.c          |  1 +
 drivers/usb/host/r8a66597-hcd.c |  9 ++-------
 drivers/usb/mon/mon_main.c      |  5 ++---
 include/linux/usb.h             |  1 -
 include/linux/usb/hcd.h         |  3 ++-
 7 files changed, 15 insertions(+), 35 deletions(-)

diff --git a/drivers/usb/core/devices.c b/drivers/usb/core/devices.c
index 2a3bbdf..f4c5962 100644
--- a/drivers/usb/core/devices.c
+++ b/drivers/usb/core/devices.c
@@ -110,13 +110,6 @@ static const char format_endpt[] =
 /* E:  Ad=xx(s) Atr=xx(ssss) MxPS=dddd Ivl=D?s */
   "E:  Ad=%02x(%c) Atr=%02x(%-4s) MxPS=%4d Ivl=%d%cs\n";
 
-
-/*
- * Need access to the driver and USB bus lists.
- * extern struct list_head usb_bus_list;
- * However, these will come from functions that return ptrs to each of them.
- */
-
 /*
  * Wait for an connect/disconnect event to happen. We initialize
  * the event counter with an odd number, and each event will increment
@@ -616,6 +609,7 @@ static ssize_t usb_device_read(struct file *file, char 
__user *buf,
        struct usb_bus *bus;
        ssize_t ret, total_written = 0;
        loff_t skip_bytes = *ppos;
+       int id;
 
        if (*ppos < 0)
                return -EINVAL;
@@ -626,7 +620,7 @@ static ssize_t usb_device_read(struct file *file, char 
__user *buf,
 
        mutex_lock(&usb_bus_list_lock);
        /* print devices for all busses */
-       list_for_each_entry(bus, &usb_bus_list, bus_list) {
+       idr_for_each_entry(&usb_bus_idr, bus, id) {
                /* recurse through all children of the root hub */
                if (!bus_to_hcd(bus)->rh_registered)
                        continue;
diff --git a/drivers/usb/core/hcd.c b/drivers/usb/core/hcd.c
index 1c102d6..08f5ea5 100644
--- a/drivers/usb/core/hcd.c
+++ b/drivers/usb/core/hcd.c
@@ -90,12 +90,11 @@ unsigned long usb_hcds_loaded;
 EXPORT_SYMBOL_GPL(usb_hcds_loaded);
 
 /* host controllers we manage */
-LIST_HEAD (usb_bus_list);
-EXPORT_SYMBOL_GPL (usb_bus_list);
+DEFINE_IDR (usb_bus_idr);
+EXPORT_SYMBOL_GPL (usb_bus_idr);
 
 /* used when allocating bus numbers */
 #define USB_MAXBUS             64
-static DECLARE_BITMAP(busmap, USB_MAXBUS);
 
 /* used when updating list of hcds */
 DEFINE_MUTEX(usb_bus_list_lock);       /* exported only for usbfs */
@@ -967,8 +966,6 @@ static void usb_bus_init (struct usb_bus *bus)
        bus->bandwidth_int_reqs  = 0;
        bus->bandwidth_isoc_reqs = 0;
        mutex_init(&bus->usb_address0_mutex);
-
-       INIT_LIST_HEAD (&bus->bus_list);
 }
 
 /*-------------------------------------------------------------------------*/
@@ -989,16 +986,12 @@ static int usb_register_bus(struct usb_bus *bus)
        int busnum;
 
        mutex_lock(&usb_bus_list_lock);
-       busnum = find_next_zero_bit(busmap, USB_MAXBUS, 1);
-       if (busnum >= USB_MAXBUS) {
-               printk (KERN_ERR "%s: too many buses\n", usbcore_name);
+       busnum = idr_alloc(&usb_bus_idr, bus, 1, USB_MAXBUS, GFP_KERNEL);
+       if (busnum < 0) {
+               pr_err("%s: failed to get bus number\n", usbcore_name);
                goto error_find_busnum;
        }
-       set_bit(busnum, busmap);
        bus->busnum = busnum;
-
-       /* Add it to the local list of buses */
-       list_add (&bus->bus_list, &usb_bus_list);
        mutex_unlock(&usb_bus_list_lock);
 
        usb_notify_add_bus(bus);
@@ -1030,12 +1023,10 @@ static void usb_deregister_bus (struct usb_bus *bus)
         * itself up
         */
        mutex_lock(&usb_bus_list_lock);
-       list_del (&bus->bus_list);
+       idr_remove(&usb_bus_idr, bus->busnum);
        mutex_unlock(&usb_bus_list_lock);
 
        usb_notify_remove_bus(bus);
-
-       clear_bit(bus->busnum, busmap);
 }
 
 /**
diff --git a/drivers/usb/core/usb.c b/drivers/usb/core/usb.c
index f8bbd0b..17f8230 100644
--- a/drivers/usb/core/usb.c
+++ b/drivers/usb/core/usb.c
@@ -1114,6 +1114,7 @@ static void __exit usb_exit(void)
        bus_unregister(&usb_bus_type);
        usb_acpi_unregister();
        usb_debugfs_cleanup();
+       idr_destroy(&usb_bus_idr);
 }
 
 subsys_initcall(usb_init);
diff --git a/drivers/usb/host/r8a66597-hcd.c b/drivers/usb/host/r8a66597-hcd.c
index 4cbd063..1ef8873 100644
--- a/drivers/usb/host/r8a66597-hcd.c
+++ b/drivers/usb/host/r8a66597-hcd.c
@@ -2099,13 +2099,8 @@ static void r8a66597_check_detect_child(struct r8a66597 
*r8a66597,
 
        memset(now_map, 0, sizeof(now_map));
 
-       list_for_each_entry(bus, &usb_bus_list, bus_list) {
-               if (!bus->root_hub)
-                       continue;
-
-               if (bus->busnum != hcd->self.busnum)
-                       continue;
-
+       bus = idr_find(&usb_bus_idr, hcd->self.busnum);
+       if (bus && bus->root_hub) {
                collect_usb_address_map(bus->root_hub, now_map);
                update_usb_address_map(r8a66597, bus->root_hub, now_map);
        }
diff --git a/drivers/usb/mon/mon_main.c b/drivers/usb/mon/mon_main.c
index f7c292f..e589dd4 100644
--- a/drivers/usb/mon/mon_main.c
+++ b/drivers/usb/mon/mon_main.c
@@ -349,7 +349,7 @@ struct mon_bus *mon_bus_lookup(unsigned int num)
 static int __init mon_init(void)
 {
        struct usb_bus *ubus;
-       int rc;
+       int rc, id;
 
        if ((rc = mon_text_init()) != 0)
                goto err_text;
@@ -366,9 +366,8 @@ static int __init mon_init(void)
        // MOD_INC_USE_COUNT(which_module?);
 
        mutex_lock(&usb_bus_list_lock);
-       list_for_each_entry (ubus, &usb_bus_list, bus_list) {
+       idr_for_each_entry(&usb_bus_idr, ubus, id)
                mon_bus_init(ubus);
-       }
        usb_register_notify(&mon_nb);
        mutex_unlock(&usb_bus_list_lock);
        return 0;
diff --git a/include/linux/usb.h b/include/linux/usb.h
index b9a2807..0e3c074 100644
--- a/include/linux/usb.h
+++ b/include/linux/usb.h
@@ -375,7 +375,6 @@ struct usb_bus {
        struct usb_devmap devmap;       /* device address allocation map */
        struct usb_device *root_hub;    /* Root hub */
        struct usb_bus *hs_companion;   /* Companion EHCI bus, if any */
-       struct list_head bus_list;      /* list of busses */
 
        struct mutex usb_address0_mutex; /* unaddressed device mutex */
 
diff --git a/include/linux/usb/hcd.h b/include/linux/usb/hcd.h
index f89c24b..6ba0702 100644
--- a/include/linux/usb/hcd.h
+++ b/include/linux/usb/hcd.h
@@ -23,6 +23,7 @@
 
 #include <linux/rwsem.h>
 #include <linux/interrupt.h>
+#include <linux/idr.h>
 
 #define MAX_TOPO_LEVEL         6
 
@@ -630,7 +631,7 @@ extern void usb_set_device_state(struct usb_device *udev,
 
 /* exported only within usbcore */
 
-extern struct list_head usb_bus_list;
+extern struct idr usb_bus_idr;
 extern struct mutex usb_bus_list_lock;
 extern wait_queue_head_t usb_kill_urb_queue;
 
-- 
2.6.4

--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to