Commit 5363de75 authored by Heiner Kallweit's avatar Heiner Kallweit Committed by Greg Kroah-Hartman

usb: core: switch bus numbering to using idr

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: default avatarHeiner Kallweit <hkallweit1@gmail.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent d7854041
...@@ -110,13 +110,6 @@ static const char format_endpt[] = ...@@ -110,13 +110,6 @@ static const char format_endpt[] =
/* E: Ad=xx(s) Atr=xx(ssss) MxPS=dddd Ivl=D?s */ /* 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"; "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 * Wait for an connect/disconnect event to happen. We initialize
* the event counter with an odd number, and each event will increment * the event counter with an odd number, and each event will increment
...@@ -618,6 +611,7 @@ static ssize_t usb_device_read(struct file *file, char __user *buf, ...@@ -618,6 +611,7 @@ static ssize_t usb_device_read(struct file *file, char __user *buf,
struct usb_bus *bus; struct usb_bus *bus;
ssize_t ret, total_written = 0; ssize_t ret, total_written = 0;
loff_t skip_bytes = *ppos; loff_t skip_bytes = *ppos;
int id;
if (*ppos < 0) if (*ppos < 0)
return -EINVAL; return -EINVAL;
...@@ -628,7 +622,7 @@ static ssize_t usb_device_read(struct file *file, char __user *buf, ...@@ -628,7 +622,7 @@ static ssize_t usb_device_read(struct file *file, char __user *buf,
mutex_lock(&usb_bus_list_lock); mutex_lock(&usb_bus_list_lock);
/* print devices for all busses */ /* 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 */ /* recurse through all children of the root hub */
if (!bus_to_hcd(bus)->rh_registered) if (!bus_to_hcd(bus)->rh_registered)
continue; continue;
......
...@@ -90,12 +90,11 @@ unsigned long usb_hcds_loaded; ...@@ -90,12 +90,11 @@ unsigned long usb_hcds_loaded;
EXPORT_SYMBOL_GPL(usb_hcds_loaded); EXPORT_SYMBOL_GPL(usb_hcds_loaded);
/* host controllers we manage */ /* host controllers we manage */
LIST_HEAD (usb_bus_list); DEFINE_IDR (usb_bus_idr);
EXPORT_SYMBOL_GPL (usb_bus_list); EXPORT_SYMBOL_GPL (usb_bus_idr);
/* used when allocating bus numbers */ /* used when allocating bus numbers */
#define USB_MAXBUS 64 #define USB_MAXBUS 64
static DECLARE_BITMAP(busmap, USB_MAXBUS);
/* used when updating list of hcds */ /* used when updating list of hcds */
DEFINE_MUTEX(usb_bus_list_lock); /* exported only for usbfs */ DEFINE_MUTEX(usb_bus_list_lock); /* exported only for usbfs */
...@@ -996,8 +995,6 @@ static void usb_bus_init (struct usb_bus *bus) ...@@ -996,8 +995,6 @@ static void usb_bus_init (struct usb_bus *bus)
bus->bandwidth_int_reqs = 0; bus->bandwidth_int_reqs = 0;
bus->bandwidth_isoc_reqs = 0; bus->bandwidth_isoc_reqs = 0;
mutex_init(&bus->usb_address0_mutex); mutex_init(&bus->usb_address0_mutex);
INIT_LIST_HEAD (&bus->bus_list);
} }
/*-------------------------------------------------------------------------*/ /*-------------------------------------------------------------------------*/
...@@ -1018,16 +1015,12 @@ static int usb_register_bus(struct usb_bus *bus) ...@@ -1018,16 +1015,12 @@ static int usb_register_bus(struct usb_bus *bus)
int busnum; int busnum;
mutex_lock(&usb_bus_list_lock); mutex_lock(&usb_bus_list_lock);
busnum = find_next_zero_bit(busmap, USB_MAXBUS, 1); busnum = idr_alloc(&usb_bus_idr, bus, 1, USB_MAXBUS, GFP_KERNEL);
if (busnum >= USB_MAXBUS) { if (busnum < 0) {
printk (KERN_ERR "%s: too many buses\n", usbcore_name); pr_err("%s: failed to get bus number\n", usbcore_name);
goto error_find_busnum; goto error_find_busnum;
} }
set_bit(busnum, busmap);
bus->busnum = busnum; 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); mutex_unlock(&usb_bus_list_lock);
usb_notify_add_bus(bus); usb_notify_add_bus(bus);
...@@ -1059,12 +1052,10 @@ static void usb_deregister_bus (struct usb_bus *bus) ...@@ -1059,12 +1052,10 @@ static void usb_deregister_bus (struct usb_bus *bus)
* itself up * itself up
*/ */
mutex_lock(&usb_bus_list_lock); mutex_lock(&usb_bus_list_lock);
list_del (&bus->bus_list); idr_remove(&usb_bus_idr, bus->busnum);
mutex_unlock(&usb_bus_list_lock); mutex_unlock(&usb_bus_list_lock);
usb_notify_remove_bus(bus); usb_notify_remove_bus(bus);
clear_bit(bus->busnum, busmap);
} }
/** /**
......
...@@ -1115,6 +1115,7 @@ static void __exit usb_exit(void) ...@@ -1115,6 +1115,7 @@ static void __exit usb_exit(void)
bus_unregister(&usb_bus_type); bus_unregister(&usb_bus_type);
usb_acpi_unregister(); usb_acpi_unregister();
usb_debugfs_cleanup(); usb_debugfs_cleanup();
idr_destroy(&usb_bus_idr);
} }
subsys_initcall(usb_init); subsys_initcall(usb_init);
......
...@@ -2099,13 +2099,8 @@ static void r8a66597_check_detect_child(struct r8a66597 *r8a66597, ...@@ -2099,13 +2099,8 @@ static void r8a66597_check_detect_child(struct r8a66597 *r8a66597,
memset(now_map, 0, sizeof(now_map)); memset(now_map, 0, sizeof(now_map));
list_for_each_entry(bus, &usb_bus_list, bus_list) { bus = idr_find(&usb_bus_idr, hcd->self.busnum);
if (!bus->root_hub) if (bus && bus->root_hub) {
continue;
if (bus->busnum != hcd->self.busnum)
continue;
collect_usb_address_map(bus->root_hub, now_map); collect_usb_address_map(bus->root_hub, now_map);
update_usb_address_map(r8a66597, bus->root_hub, now_map); update_usb_address_map(r8a66597, bus->root_hub, now_map);
} }
......
...@@ -349,7 +349,7 @@ struct mon_bus *mon_bus_lookup(unsigned int num) ...@@ -349,7 +349,7 @@ struct mon_bus *mon_bus_lookup(unsigned int num)
static int __init mon_init(void) static int __init mon_init(void)
{ {
struct usb_bus *ubus; struct usb_bus *ubus;
int rc; int rc, id;
if ((rc = mon_text_init()) != 0) if ((rc = mon_text_init()) != 0)
goto err_text; goto err_text;
...@@ -366,9 +366,8 @@ static int __init mon_init(void) ...@@ -366,9 +366,8 @@ static int __init mon_init(void)
// MOD_INC_USE_COUNT(which_module?); // MOD_INC_USE_COUNT(which_module?);
mutex_lock(&usb_bus_list_lock); 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); mon_bus_init(ubus);
}
usb_register_notify(&mon_nb); usb_register_notify(&mon_nb);
mutex_unlock(&usb_bus_list_lock); mutex_unlock(&usb_bus_list_lock);
return 0; return 0;
......
...@@ -375,7 +375,6 @@ struct usb_bus { ...@@ -375,7 +375,6 @@ struct usb_bus {
struct usb_devmap devmap; /* device address allocation map */ struct usb_devmap devmap; /* device address allocation map */
struct usb_device *root_hub; /* Root hub */ struct usb_device *root_hub; /* Root hub */
struct usb_bus *hs_companion; /* Companion EHCI bus, if any */ 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 */ struct mutex usb_address0_mutex; /* unaddressed device mutex */
......
...@@ -23,6 +23,7 @@ ...@@ -23,6 +23,7 @@
#include <linux/rwsem.h> #include <linux/rwsem.h>
#include <linux/interrupt.h> #include <linux/interrupt.h>
#include <linux/idr.h>
#define MAX_TOPO_LEVEL 6 #define MAX_TOPO_LEVEL 6
...@@ -630,7 +631,7 @@ extern void usb_set_device_state(struct usb_device *udev, ...@@ -630,7 +631,7 @@ extern void usb_set_device_state(struct usb_device *udev,
/* exported only within usbcore */ /* 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 struct mutex usb_bus_list_lock;
extern wait_queue_head_t usb_kill_urb_queue; extern wait_queue_head_t usb_kill_urb_queue;
......
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