diff options
author | Endre Kollar <taxy443@gmail.com> | 2010-07-27 12:39:30 +0200 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2010-07-27 11:06:29 -0700 |
commit | aa5873e96271611ae55586f65e49ea1fab90cb88 (patch) | |
tree | b2a0c0b5d06976b262e4403225d6ca3bc8380daf /drivers/staging/usbip/stub_main.c | |
parent | 125ed824d3d03f5c470cf98aca757fd9423c49ab (diff) |
Staging: usbip: fix multiple interfaces
The stub_probe function instantiates an stub_dev object for all
interfaces. Wich causes a problem. The stub_dev object belongs to their
own interfaces. This patch creates the sdev object at the first
stub_probe call, the other calls associate the interfaces to this.
Signed-off-by: Endre Kollar <taxy443@gmail.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers/staging/usbip/stub_main.c')
-rw-r--r-- | drivers/staging/usbip/stub_main.c | 65 |
1 files changed, 52 insertions, 13 deletions
diff --git a/drivers/staging/usbip/stub_main.c b/drivers/staging/usbip/stub_main.c index 6665cefe573b..f3a40968aae2 100644 --- a/drivers/staging/usbip/stub_main.c +++ b/drivers/staging/usbip/stub_main.c @@ -41,8 +41,7 @@ struct kmem_cache *stub_priv_cache; * remote host. */ #define MAX_BUSID 16 -#define BUSID_SIZE 20 -static char busid_table[MAX_BUSID][BUSID_SIZE]; +static struct bus_id_priv busid_table[MAX_BUSID]; static spinlock_t busid_table_lock; @@ -53,8 +52,8 @@ int match_busid(const char *busid) spin_lock(&busid_table_lock); for (i = 0; i < MAX_BUSID; i++) - if (busid_table[i][0]) - if (!strncmp(busid_table[i], busid, BUSID_SIZE)) { + if (busid_table[i].name[0]) + if (!strncmp(busid_table[i].name, busid, BUSID_SIZE)) { /* already registerd */ spin_unlock(&busid_table_lock); return 0; @@ -65,6 +64,25 @@ int match_busid(const char *busid) return 1; } +struct bus_id_priv *get_busid_priv(const char *busid) +{ + int i; + + spin_lock(&busid_table_lock); + + for (i = 0; i < MAX_BUSID; i++) + if (busid_table[i].name[0]) + if (!strncmp(busid_table[i].name, busid, BUSID_SIZE)) { + /* already registerd */ + spin_unlock(&busid_table_lock); + return &(busid_table[i]); + } + + spin_unlock(&busid_table_lock); + + return NULL; +} + static ssize_t show_match_busid(struct device_driver *drv, char *buf) { int i; @@ -73,8 +91,8 @@ static ssize_t show_match_busid(struct device_driver *drv, char *buf) spin_lock(&busid_table_lock); for (i = 0; i < MAX_BUSID; i++) - if (busid_table[i][0]) - out += sprintf(out, "%s ", busid_table[i]); + if (busid_table[i].name[0]) + out += sprintf(out, "%s ", busid_table[i].name); spin_unlock(&busid_table_lock); @@ -93,8 +111,11 @@ static int add_match_busid(char *busid) spin_lock(&busid_table_lock); for (i = 0; i < MAX_BUSID; i++) - if (!busid_table[i][0]) { - strncpy(busid_table[i], busid, BUSID_SIZE); + if (!busid_table[i].name[0]) { + strncpy(busid_table[i].name, busid, BUSID_SIZE); + if ((busid_table[i].status != STUB_BUSID_ALLOC) && + (busid_table[i].status != STUB_BUSID_REMOV)) + busid_table[i].status = STUB_BUSID_ADDED; spin_unlock(&busid_table_lock); return 0; } @@ -104,16 +125,21 @@ static int add_match_busid(char *busid) return -1; } -static int del_match_busid(char *busid) +int del_match_busid(char *busid) { int i; spin_lock(&busid_table_lock); for (i = 0; i < MAX_BUSID; i++) - if (!strncmp(busid_table[i], busid, BUSID_SIZE)) { + if (!strncmp(busid_table[i].name, busid, BUSID_SIZE)) { /* found */ - memset(busid_table[i], 0, BUSID_SIZE); + if (busid_table[i].status == STUB_BUSID_OTHER) + memset(busid_table[i].name, 0, BUSID_SIZE); + if ((busid_table[i].status != STUB_BUSID_OTHER) && + (busid_table[i].status != STUB_BUSID_ADDED)) { + busid_table[i].status = STUB_BUSID_REMOV; + } spin_unlock(&busid_table_lock); return 0; } @@ -122,6 +148,20 @@ static int del_match_busid(char *busid) return -1; } +static void init_busid_table(void) +{ + int i; + + + for (i = 0; i < MAX_BUSID; i++) { + memset(busid_table[i].name, 0, BUSID_SIZE); + busid_table[i].status = STUB_BUSID_OTHER; + busid_table[i].interf_count = 0; + busid_table[i].sdev = NULL; + busid_table[i].shutdown_busid = 0; + } + spin_lock_init(&busid_table_lock); +} static ssize_t store_match_busid(struct device_driver *dev, const char *buf, size_t count) @@ -261,8 +301,7 @@ static int __init usb_stub_init(void) printk(KERN_INFO KBUILD_MODNAME ":" DRIVER_DESC ":" DRIVER_VERSION "\n"); - memset(busid_table, 0, sizeof(busid_table)); - spin_lock_init(&busid_table_lock); + init_busid_table(); ret = driver_create_file(&stub_driver.drvwrap.driver, &driver_attr_match_busid); |