mirror of https://github.com/xemu-project/xemu.git
usb-storage: use qdev for -usbdevice
Hook up usb_msd_init. Also rework handling of encrypted block devices, move the code out vl.c. Signed-off-by: Gerd Hoffmann <kraxel@redhat.com> Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
This commit is contained in:
parent
61e094c049
commit
b3e461d3d6
33
hw/usb-msd.c
33
hw/usb-msd.c
|
@ -14,6 +14,7 @@
|
||||||
#include "block.h"
|
#include "block.h"
|
||||||
#include "scsi-disk.h"
|
#include "scsi-disk.h"
|
||||||
#include "console.h"
|
#include "console.h"
|
||||||
|
#include "monitor.h"
|
||||||
|
|
||||||
//#define DEBUG_MSD
|
//#define DEBUG_MSD
|
||||||
|
|
||||||
|
@ -508,6 +509,16 @@ static int usb_msd_handle_data(USBDevice *dev, USBPacket *p)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void usb_msd_password_cb(void *opaque, int err)
|
||||||
|
{
|
||||||
|
MSDState *s = opaque;
|
||||||
|
|
||||||
|
if (!err)
|
||||||
|
usb_device_attach(&s->dev);
|
||||||
|
else
|
||||||
|
qdev_unplug(&s->dev.qdev);
|
||||||
|
}
|
||||||
|
|
||||||
static int usb_msd_initfn(USBDevice *dev)
|
static int usb_msd_initfn(USBDevice *dev)
|
||||||
{
|
{
|
||||||
MSDState *s = DO_UPCAST(MSDState, dev, dev);
|
MSDState *s = DO_UPCAST(MSDState, dev, dev);
|
||||||
|
@ -522,10 +533,21 @@ static int usb_msd_initfn(USBDevice *dev)
|
||||||
s->scsi_dev = scsi_bus_legacy_add_drive(&s->bus, s->dinfo, 0);
|
s->scsi_dev = scsi_bus_legacy_add_drive(&s->bus, s->dinfo, 0);
|
||||||
s->bus.qbus.allow_hotplug = 0;
|
s->bus.qbus.allow_hotplug = 0;
|
||||||
usb_msd_handle_reset(dev);
|
usb_msd_handle_reset(dev);
|
||||||
|
|
||||||
|
if (bdrv_key_required(s->dinfo->bdrv)) {
|
||||||
|
if (s->dev.qdev.hotplugged) {
|
||||||
|
monitor_read_bdrv_key_start(cur_mon, s->dinfo->bdrv,
|
||||||
|
usb_msd_password_cb, s);
|
||||||
|
s->dev.auto_attach = 0;
|
||||||
|
} else {
|
||||||
|
autostart = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
USBDevice *usb_msd_init(const char *filename)
|
static USBDevice *usb_msd_init(const char *filename)
|
||||||
{
|
{
|
||||||
static int nr=0;
|
static int nr=0;
|
||||||
char id[8];
|
char id[8];
|
||||||
|
@ -577,13 +599,6 @@ USBDevice *usb_msd_init(const char *filename)
|
||||||
return dev;
|
return dev;
|
||||||
}
|
}
|
||||||
|
|
||||||
BlockDriverState *usb_msd_get_bdrv(USBDevice *dev)
|
|
||||||
{
|
|
||||||
MSDState *s = (MSDState *)dev;
|
|
||||||
|
|
||||||
return s->dinfo->bdrv;
|
|
||||||
}
|
|
||||||
|
|
||||||
static struct USBDeviceInfo msd_info = {
|
static struct USBDeviceInfo msd_info = {
|
||||||
.qdev.name = "QEMU USB MSD",
|
.qdev.name = "QEMU USB MSD",
|
||||||
.qdev.alias = "usb-storage",
|
.qdev.alias = "usb-storage",
|
||||||
|
@ -593,6 +608,8 @@ static struct USBDeviceInfo msd_info = {
|
||||||
.handle_reset = usb_msd_handle_reset,
|
.handle_reset = usb_msd_handle_reset,
|
||||||
.handle_control = usb_msd_handle_control,
|
.handle_control = usb_msd_handle_control,
|
||||||
.handle_data = usb_msd_handle_data,
|
.handle_data = usb_msd_handle_data,
|
||||||
|
.usbdevice_name = "disk",
|
||||||
|
.usbdevice_init = usb_msd_init,
|
||||||
.qdev.props = (Property[]) {
|
.qdev.props = (Property[]) {
|
||||||
DEFINE_PROP_DRIVE("drive", MSDState, dinfo),
|
DEFINE_PROP_DRIVE("drive", MSDState, dinfo),
|
||||||
DEFINE_PROP_END_OF_LIST(),
|
DEFINE_PROP_END_OF_LIST(),
|
||||||
|
|
4
hw/usb.h
4
hw/usb.h
|
@ -256,10 +256,6 @@ void usb_host_info(Monitor *mon);
|
||||||
/* usb-hid.c */
|
/* usb-hid.c */
|
||||||
void usb_hid_datain_cb(USBDevice *dev, void *opaque, void (*datain)(void *));
|
void usb_hid_datain_cb(USBDevice *dev, void *opaque, void (*datain)(void *));
|
||||||
|
|
||||||
/* usb-msd.c */
|
|
||||||
USBDevice *usb_msd_init(const char *filename);
|
|
||||||
BlockDriverState *usb_msd_get_bdrv(USBDevice *dev);
|
|
||||||
|
|
||||||
/* usb-net.c */
|
/* usb-net.c */
|
||||||
USBDevice *usb_net_init(NICInfo *nd);
|
USBDevice *usb_net_init(NICInfo *nd);
|
||||||
|
|
||||||
|
|
25
vl.c
25
vl.c
|
@ -2517,16 +2517,6 @@ static void smp_parse(const char *optarg)
|
||||||
/***********************************************************/
|
/***********************************************************/
|
||||||
/* USB devices */
|
/* USB devices */
|
||||||
|
|
||||||
static void usb_msd_password_cb(void *opaque, int err)
|
|
||||||
{
|
|
||||||
USBDevice *dev = opaque;
|
|
||||||
|
|
||||||
if (!err)
|
|
||||||
usb_device_attach(dev);
|
|
||||||
else
|
|
||||||
dev->info->handle_destroy(dev);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int usb_device_add(const char *devname, int is_hotplug)
|
static int usb_device_add(const char *devname, int is_hotplug)
|
||||||
{
|
{
|
||||||
const char *p;
|
const char *p;
|
||||||
|
@ -2543,21 +2533,6 @@ static int usb_device_add(const char *devname, int is_hotplug)
|
||||||
/* the other ones */
|
/* the other ones */
|
||||||
if (strstart(devname, "host:", &p)) {
|
if (strstart(devname, "host:", &p)) {
|
||||||
dev = usb_host_device_open(p);
|
dev = usb_host_device_open(p);
|
||||||
} else if (strstart(devname, "disk:", &p)) {
|
|
||||||
BlockDriverState *bs;
|
|
||||||
|
|
||||||
dev = usb_msd_init(p);
|
|
||||||
if (!dev)
|
|
||||||
return -1;
|
|
||||||
bs = usb_msd_get_bdrv(dev);
|
|
||||||
if (bdrv_key_required(bs)) {
|
|
||||||
autostart = 0;
|
|
||||||
if (is_hotplug) {
|
|
||||||
monitor_read_bdrv_key_start(cur_mon, bs, usb_msd_password_cb,
|
|
||||||
dev);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else if (strstart(devname, "net:", &p)) {
|
} else if (strstart(devname, "net:", &p)) {
|
||||||
QemuOpts *opts;
|
QemuOpts *opts;
|
||||||
int idx;
|
int idx;
|
||||||
|
|
Loading…
Reference in New Issue