summaryrefslogtreecommitdiff
path: root/usb-linux.c
diff options
context:
space:
mode:
authorbellard <bellard@c046a42c-6fe2-441c-8c8c-71466251a162>2006-06-26 21:00:51 +0000
committerbellard <bellard@c046a42c-6fe2-441c-8c8c-71466251a162>2006-06-26 21:00:51 +0000
commit1f6e24e73ccdca64864da009a21f5b7051d200a1 (patch)
tree864894ca89ebfaaa5ae6bc2332a588ae331ea554 /usb-linux.c
parent3e382bc84ce93df505b48fc4e305fcc5f4ac4567 (diff)
downloadqemu-1f6e24e73ccdca64864da009a21f5b7051d200a1.tar.gz
display device identifier string for user with info usb (Lonnie Mendez)
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@2029 c046a42c-6fe2-441c-8c8c-71466251a162
Diffstat (limited to 'usb-linux.c')
-rw-r--r--usb-linux.c30
1 files changed, 27 insertions, 3 deletions
diff --git a/usb-linux.c b/usb-linux.c
index 8009a1b608..aa1ded23d0 100644
--- a/usb-linux.c
+++ b/usb-linux.c
@@ -44,11 +44,13 @@ typedef int USBScanFunc(void *opaque, int bus_num, int addr, int class_id,
int vendor_id, int product_id,
const char *product_name, int speed);
static int usb_host_find_device(int *pbus_num, int *paddr,
+ char *product_name, int product_name_size,
const char *devname);
//#define DEBUG
#define USBDEVFS_PATH "/proc/bus/usb"
+#define PRODUCT_NAME_SZ 32
typedef struct USBHostDevice {
USBDevice dev;
@@ -145,8 +147,11 @@ USBDevice *usb_host_device_open(const char *devname)
char buf[1024];
int descr_len, dev_descr_len, config_descr_len, nb_interfaces;
int bus_num, addr;
+ char product_name[PRODUCT_NAME_SZ];
- if (usb_host_find_device(&bus_num, &addr, devname) < 0)
+ if (usb_host_find_device(&bus_num, &addr,
+ product_name, sizeof(product_name),
+ devname) < 0)
return NULL;
snprintf(buf, sizeof(buf), USBDEVFS_PATH "/%03d/%03d",
@@ -230,6 +235,14 @@ USBDevice *usb_host_device_open(const char *devname)
dev->dev.handle_reset = usb_host_handle_reset;
dev->dev.handle_control = usb_host_handle_control;
dev->dev.handle_data = usb_host_handle_data;
+
+ if (product_name[0] == '\0')
+ snprintf(dev->dev.devname, sizeof(dev->dev.devname),
+ "host:%s", devname);
+ else
+ pstrcpy(dev->dev.devname, sizeof(dev->dev.devname),
+ product_name);
+
return (USBDevice *)dev;
}
@@ -337,6 +350,7 @@ typedef struct FindDeviceState {
int product_id;
int bus_num;
int addr;
+ char product_name[PRODUCT_NAME_SZ];
} FindDeviceState;
static int usb_host_find_device_scan(void *opaque, int bus_num, int addr,
@@ -345,8 +359,11 @@ static int usb_host_find_device_scan(void *opaque, int bus_num, int addr,
const char *product_name, int speed)
{
FindDeviceState *s = opaque;
- if (vendor_id == s->vendor_id &&
- product_id == s->product_id) {
+ if ((vendor_id == s->vendor_id &&
+ product_id == s->product_id) ||
+ (bus_num == s->bus_num &&
+ addr == s->addr)) {
+ pstrcpy(s->product_name, PRODUCT_NAME_SZ, product_name);
s->bus_num = bus_num;
s->addr = addr;
return 1;
@@ -359,6 +376,7 @@ static int usb_host_find_device_scan(void *opaque, int bus_num, int addr,
'bus.addr' (decimal numbers) or
'vendor_id:product_id' (hexa numbers) */
static int usb_host_find_device(int *pbus_num, int *paddr,
+ char *product_name, int product_name_size,
const char *devname)
{
const char *p;
@@ -369,6 +387,11 @@ static int usb_host_find_device(int *pbus_num, int *paddr,
if (p) {
*pbus_num = strtoul(devname, NULL, 0);
*paddr = strtoul(p + 1, NULL, 0);
+ fs.bus_num = *pbus_num;
+ fs.addr = *paddr;
+ ret = usb_host_scan(&fs, usb_host_find_device_scan);
+ if (ret)
+ pstrcpy(product_name, product_name_size, fs.product_name);
return 0;
}
p = strchr(devname, ':');
@@ -379,6 +402,7 @@ static int usb_host_find_device(int *pbus_num, int *paddr,
if (ret) {
*pbus_num = fs.bus_num;
*paddr = fs.addr;
+ pstrcpy(product_name, product_name_size, fs.product_name);
return 0;
}
}