From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from [140.186.70.92] (port=55626 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1P4Hxz-0006Uu-2R for qemu-devel@nongnu.org; Fri, 08 Oct 2010 14:46:52 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1P4Huh-00083w-Kc for qemu-devel@nongnu.org; Fri, 08 Oct 2010 14:43:28 -0400 Received: from mail-qw0-f45.google.com ([209.85.216.45]:34961) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1P4Huh-00083s-IM for qemu-devel@nongnu.org; Fri, 08 Oct 2010 14:43:27 -0400 Received: by qwk4 with SMTP id 4so940946qwk.4 for ; Fri, 08 Oct 2010 11:43:26 -0700 (PDT) Message-ID: <4CAF664B.5090704@codemonkey.ws> Date: Fri, 08 Oct 2010 13:43:23 -0500 From: Anthony Liguori MIME-Version: 1.0 Subject: Re: [Qemu-devel] [PATCH] monitor: add usb_detach References: <20101005164029.92f21cb3.alevy@redhat.com> In-Reply-To: <20101005164029.92f21cb3.alevy@redhat.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Alon Levy Cc: qemu-devel@nongnu.org How is this different than usb_del? Is it that it detaches it but does not delete the device? Regards, Anthony Liguori On 10/05/2010 09:40 AM, Alon Levy wrote: > Signed-off-by: Alon Levy > > --- > qemu-monitor.hx | 17 +++++++++++++++++ > sysemu.h | 1 + > vl.c | 41 +++++++++++++++++++++++++++++++++++++++++ > 3 files changed, 59 insertions(+), 0 deletions(-) > > diff --git a/qemu-monitor.hx b/qemu-monitor.hx > index 49bcd8d..9c792a9 100644 > --- a/qemu-monitor.hx > +++ b/qemu-monitor.hx > @@ -711,6 +711,23 @@ command @code{info usb} to see the devices you can remove. > ETEXI > > { > + .name = "usb_detach", > + .args_type = "devname:s", > + .params = "device", > + .help = "detach USB device 'bus.addr'", > + .mhandler.cmd = do_usb_detach, > + }, > + > +STEXI > +@item usb_detach @var{devname} > +@findex usb_detach > + > +Detach the USB device @var{devname} from the QEMU virtual USB > +hub. @var{devname} has the syntax @code{bus.addr}. Use the monitor > +command @code{info usb} to see the devices you can detach. > +ETEXI > + > + { > .name = "device_add", > .args_type = "device:O", > .params = "driver[,prop=value][,...]", > diff --git a/sysemu.h b/sysemu.h > index a1f6466..ac68863 100644 > --- a/sysemu.h > +++ b/sysemu.h > @@ -183,6 +183,7 @@ extern struct soundhw soundhw[]; > > void do_usb_add(Monitor *mon, const QDict *qdict); > void do_usb_del(Monitor *mon, const QDict *qdict); > +void do_usb_detach(Monitor *mon, const QDict *qdict); > void usb_info(Monitor *mon); > > void rtc_change_mon_event(struct tm *tm); > diff --git a/vl.c b/vl.c > index d352d18..6cfa009 100644 > --- a/vl.c > +++ b/vl.c > @@ -891,6 +891,47 @@ void do_usb_del(Monitor *mon, const QDict *qdict) > } > } > > +static USBDevice *usb_device_from_bus_dot_addr(const char *devname) > +{ > + int bus_num, addr; > + const char *p; > + USBBus *bus; > + USBPort *port; > + > + if (!usb_enabled) { > + return NULL; > + } > + p = strchr(devname, '.'); > + if (!p) { > + return NULL; > + } > + bus_num = strtoul(devname, NULL, 0); > + addr = strtoul(p + 1, NULL, 0); > + bus = usb_bus_find(bus_num); > + if (!bus) { > + return NULL; > + } > + QTAILQ_FOREACH(port,&bus->used, next) { > + if (port->dev->addr == addr) { > + break; > + } > + } > + if (!port) { > + return NULL; > + } > + return port->dev; > +} > + > +void do_usb_detach(Monitor *mon, const QDict *qdict) > +{ > + const char *devname = qdict_get_str(qdict, "devname"); > + USBDevice *dev = usb_device_from_bus_dot_addr(devname); > + > + if (dev == NULL || usb_device_detach(dev)< 0) { > + error_report("could not detach USB device '%s'", devname); > + } > +} > + > /***********************************************************/ > /* PCMCIA/Cardbus */ > >