mirror of
https://github.com/nxp-imx/linux-imx.git
synced 2025-12-22 18:37:35 +01:00
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: Heiner Kallweit <hkallweit1@gmail.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
d785404198
commit
5363de7530
|
|
@ -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,
|
||||||
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,
|
||||||
|
|
||||||
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;
|
||||||
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)
|
||||||
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)
|
||||||
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)
|
||||||
* 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)
|
||||||
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,
|
||||||
|
|
||||||
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)
|
||||||
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)
|
||||||
// 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 {
|
||||||
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 @@
|
||||||
|
|
||||||
#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,
|
||||||
|
|
||||||
/* 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;
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user