[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 06/18] usb-host: claim port
From: |
Gerd Hoffmann |
Subject: |
[Qemu-devel] [PATCH 06/18] usb-host: claim port |
Date: |
Fri, 2 Sep 2011 11:56:35 +0200 |
When configured to pass through a specific host port (using hostbus and
hostport properties), try to claim the port if supported by the kernel.
That will avoid any kernel drivers binding to devices plugged into that
port. It will not stop any userspace apps (such as usb_modeswitch)
access the device via usbfs though.
Signed-off-by: Gerd Hoffmann <address@hidden>
---
trace-events | 1 +
usb-linux.c | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 58 insertions(+), 0 deletions(-)
diff --git a/trace-events b/trace-events
index f48cb85..5535e56 100644
--- a/trace-events
+++ b/trace-events
@@ -266,6 +266,7 @@ disable usb_host_ep_stop_iso(int bus, int addr, int ep)
"dev %d:%d, ep %d"
disable usb_host_reset(int bus, int addr) "dev %d:%d"
disable usb_host_auto_scan_enabled(void)
disable usb_host_auto_scan_disabled(void)
+disable usb_host_claim_port(int bus, int hub, int port) "bus %d, hub addr %d,
port %d"
# hw/scsi-bus.c
disable scsi_req_alloc(int target, int lun, int tag) "target %d lun %d tag %d"
diff --git a/usb-linux.c b/usb-linux.c
index a903023..ce0eadd 100644
--- a/usb-linux.c
+++ b/usb-linux.c
@@ -115,6 +115,7 @@ struct USBAutoFilter {
typedef struct USBHostDevice {
USBDevice dev;
int fd;
+ int hub_fd;
uint8_t descr[8192];
int descr_len;
@@ -525,6 +526,9 @@ static void usb_host_handle_destroy(USBDevice *dev)
USBHostDevice *s = (USBHostDevice *)dev;
usb_host_close(s);
+ if (s->hub_fd != -1) {
+ close(s->hub_fd);
+ }
QTAILQ_REMOVE(&hostdevs, s, next);
qemu_remove_exit_notifier(&s->exit);
}
@@ -1266,10 +1270,63 @@ static int usb_host_initfn(USBDevice *dev)
dev->auto_attach = 0;
s->fd = -1;
+ s->hub_fd = -1;
+
QTAILQ_INSERT_TAIL(&hostdevs, s, next);
s->exit.notify = usb_host_exit_notifier;
qemu_add_exit_notifier(&s->exit);
usb_host_auto_check(NULL);
+
+#ifdef USBDEVFS_CLAIM_PORT
+ if (s->match.bus_num != 0 && s->match.port != NULL) {
+ char *h, hub_name[64], line[1024];
+ int hub_addr, portnr, ret;
+
+ snprintf(hub_name, sizeof(hub_name), "%d-%s",
+ s->match.bus_num, s->match.port);
+
+ /* try strip off last ".$portnr" to get hub */
+ h = strrchr(hub_name, '.');
+ if (h != NULL) {
+ portnr = atoi(h+1);
+ *h = '\0';
+ } else {
+ /* no dot in there -> it is the root hub */
+ snprintf(hub_name, sizeof(hub_name), "usb%d",
+ s->match.bus_num);
+ portnr = atoi(s->match.port);
+ }
+
+ if (!usb_host_read_file(line, sizeof(line), "devnum",
+ hub_name)) {
+ goto out;
+ }
+ if (sscanf(line, "%d", &hub_addr) != 1) {
+ goto out;
+ }
+
+ if (!usb_host_device_path) {
+ goto out;
+ }
+ snprintf(line, sizeof(line), "%s/%03d/%03d",
+ usb_host_device_path, s->match.bus_num, hub_addr);
+ s->hub_fd = open(line, O_RDWR | O_NONBLOCK);
+ if (s->hub_fd < 0) {
+ goto out;
+ }
+
+ ret = ioctl(s->hub_fd, USBDEVFS_CLAIM_PORT, &portnr);
+ if (ret < 0) {
+ close(s->hub_fd);
+ s->hub_fd = -1;
+ goto out;
+ }
+
+ trace_usb_host_claim_port(s->match.bus_num, hub_addr, portnr);
+ }
+out:
+#endif
+
return 0;
}
--
1.7.1
- [Qemu-devel] [PULL] usb patch queue, Gerd Hoffmann, 2011/09/02
- [Qemu-devel] [PATCH 03/18] usb-host: fix halted endpoints, Gerd Hoffmann, 2011/09/02
- [Qemu-devel] [PATCH 02/18] usb-host: reapurb error report fix, Gerd Hoffmann, 2011/09/02
- [Qemu-devel] [PATCH 04/18] usb-host: limit open retries, Gerd Hoffmann, 2011/09/02
- [Qemu-devel] [PATCH 01/18] usb-host: start tracing support, Gerd Hoffmann, 2011/09/02
- [Qemu-devel] [PATCH 11/18] usb: fix use after free, Gerd Hoffmann, 2011/09/02
- [Qemu-devel] [PATCH 13/18] usb-ccid: remote wakeup support, Gerd Hoffmann, 2011/09/02
- [Qemu-devel] [PATCH 10/18] usb-host: parse port in /proc/bus/usb/devices scan, Gerd Hoffmann, 2011/09/02
- [Qemu-devel] [PATCH 09/18] usb-host: constify port, Gerd Hoffmann, 2011/09/02
- [Qemu-devel] [PATCH 05/18] usb-host: fix configuration tracking., Gerd Hoffmann, 2011/09/02
- [Qemu-devel] [PATCH 06/18] usb-host: claim port,
Gerd Hoffmann <=
- [Qemu-devel] [PATCH 08/18] usb-ehci: handle siTDs, Gerd Hoffmann, 2011/09/02
- [Qemu-devel] [PATCH 07/18] usb-host: endpoint table fixup, Gerd Hoffmann, 2011/09/02
- [Qemu-devel] [PATCH 15/18] usb-host: tag as unmigratable, Gerd Hoffmann, 2011/09/02
- [Qemu-devel] [PATCH 17/18] usb-musb: Take a DeviceState* in init function, Gerd Hoffmann, 2011/09/02
- [Qemu-devel] [PATCH 16/18] usb: Remove leading underscores from __musb_irq_max, Gerd Hoffmann, 2011/09/02
- [Qemu-devel] [PATCH 12/18] usb-ccid: switch to USBDesc*, Gerd Hoffmann, 2011/09/02
- [Qemu-devel] [PATCH 14/18] usb: claim port at device initialization time., Gerd Hoffmann, 2011/09/02
- [Qemu-devel] [PATCH 18/18] usb-musb: Add reset function, Gerd Hoffmann, 2011/09/02
- Re: [Qemu-devel] [PULL] usb patch queue, Gerd Hoffmann, 2011/09/07
- Re: [Qemu-devel] [PULL] usb patch queue, Anthony Liguori, 2011/09/08