mirror of https://gitee.com/openkylin/qemu.git
usb destroy API change (Lonnie Mendez)
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@2066 c046a42c-6fe2-441c-8c8c-71466251a162
This commit is contained in:
parent
3b2ccc57c7
commit
059809e451
18
hw/usb-hid.c
18
hw/usb-hid.c
|
@ -323,16 +323,10 @@ static int usb_tablet_poll(USBMouseState *s, uint8_t *buf, int len)
|
|||
return l;
|
||||
}
|
||||
|
||||
static void usb_mouse_handle_reset(USBDevice *dev, int destroy)
|
||||
static void usb_mouse_handle_reset(USBDevice *dev)
|
||||
{
|
||||
USBMouseState *s = (USBMouseState *)dev;
|
||||
|
||||
if (destroy) {
|
||||
qemu_add_mouse_event_handler(NULL, NULL, 0);
|
||||
qemu_free(s);
|
||||
return;
|
||||
}
|
||||
|
||||
s->dx = 0;
|
||||
s->dy = 0;
|
||||
s->dz = 0;
|
||||
|
@ -506,6 +500,14 @@ static int usb_mouse_handle_data(USBDevice *dev, int pid,
|
|||
return ret;
|
||||
}
|
||||
|
||||
static void usb_mouse_handle_destroy(USBDevice *dev)
|
||||
{
|
||||
USBMouseState *s = (USBMouseState *)dev;
|
||||
|
||||
qemu_add_mouse_event_handler(NULL, NULL, 0);
|
||||
qemu_free(s);
|
||||
}
|
||||
|
||||
USBDevice *usb_tablet_init(void)
|
||||
{
|
||||
USBMouseState *s;
|
||||
|
@ -519,6 +521,7 @@ USBDevice *usb_tablet_init(void)
|
|||
s->dev.handle_reset = usb_mouse_handle_reset;
|
||||
s->dev.handle_control = usb_mouse_handle_control;
|
||||
s->dev.handle_data = usb_mouse_handle_data;
|
||||
s->dev.handle_destroy = usb_mouse_handle_destroy;
|
||||
s->kind = USB_TABLET;
|
||||
|
||||
pstrcpy(s->dev.devname, sizeof(s->dev.devname), "QEMU USB Tablet");
|
||||
|
@ -539,6 +542,7 @@ USBDevice *usb_mouse_init(void)
|
|||
s->dev.handle_reset = usb_mouse_handle_reset;
|
||||
s->dev.handle_control = usb_mouse_handle_control;
|
||||
s->dev.handle_data = usb_mouse_handle_data;
|
||||
s->dev.handle_destroy = usb_mouse_handle_destroy;
|
||||
s->kind = USB_MOUSE;
|
||||
|
||||
pstrcpy(s->dev.devname, sizeof(s->dev.devname), "QEMU USB Mouse");
|
||||
|
|
12
hw/usb-hub.c
12
hw/usb-hub.c
|
@ -199,11 +199,9 @@ static void usb_hub_attach(USBPort *port1, USBDevice *dev)
|
|||
}
|
||||
}
|
||||
|
||||
static void usb_hub_handle_reset(USBDevice *dev, int destroy)
|
||||
static void usb_hub_handle_reset(USBDevice *dev)
|
||||
{
|
||||
/* XXX: do it */
|
||||
if (destroy)
|
||||
qemu_free(dev);
|
||||
}
|
||||
|
||||
static int usb_hub_handle_control(USBDevice *dev, int request, int value,
|
||||
|
@ -525,6 +523,13 @@ static int usb_hub_handle_packet(USBDevice *dev, int pid,
|
|||
return usb_generic_handle_packet(dev, pid, devaddr, devep, data, len);
|
||||
}
|
||||
|
||||
static void usb_hub_handle_destroy(USBDevice *dev)
|
||||
{
|
||||
USBHubState *s = (USBHubState *)dev;
|
||||
|
||||
qemu_free(s);
|
||||
}
|
||||
|
||||
USBDevice *usb_hub_init(int nb_ports)
|
||||
{
|
||||
USBHubState *s;
|
||||
|
@ -543,6 +548,7 @@ USBDevice *usb_hub_init(int nb_ports)
|
|||
s->dev.handle_reset = usb_hub_handle_reset;
|
||||
s->dev.handle_control = usb_hub_handle_control;
|
||||
s->dev.handle_data = usb_hub_handle_data;
|
||||
s->dev.handle_destroy = usb_hub_handle_destroy;
|
||||
|
||||
pstrcpy(s->dev.devname, sizeof(s->dev.devname), "QEMU USB Hub");
|
||||
|
||||
|
|
16
hw/usb-msd.c
16
hw/usb-msd.c
|
@ -112,16 +112,12 @@ static void usb_msd_command_complete(void *opaque, uint32_t tag, int fail)
|
|||
s->mode = USB_MSDM_CSW;
|
||||
}
|
||||
|
||||
static void usb_msd_handle_reset(USBDevice *dev, int destroy)
|
||||
static void usb_msd_handle_reset(USBDevice *dev)
|
||||
{
|
||||
MSDState *s = (MSDState *)dev;
|
||||
|
||||
DPRINTF("Reset\n");
|
||||
s->mode = USB_MSDM_CBW;
|
||||
if (destroy) {
|
||||
scsi_disk_destroy(s->scsi_dev);
|
||||
qemu_free(s);
|
||||
}
|
||||
}
|
||||
|
||||
static int usb_msd_handle_control(USBDevice *dev, int request, int value,
|
||||
|
@ -369,6 +365,13 @@ static int usb_msd_handle_data(USBDevice *dev, int pid, uint8_t devep,
|
|||
return ret;
|
||||
}
|
||||
|
||||
static void usb_msd_handle_destroy(USBDevice *dev)
|
||||
{
|
||||
MSDState *s = (MSDState *)dev;
|
||||
|
||||
scsi_disk_destroy(s->scsi_dev);
|
||||
qemu_free(s);
|
||||
}
|
||||
|
||||
USBDevice *usb_msd_init(const char *filename)
|
||||
{
|
||||
|
@ -388,11 +391,12 @@ USBDevice *usb_msd_init(const char *filename)
|
|||
s->dev.handle_reset = usb_msd_handle_reset;
|
||||
s->dev.handle_control = usb_msd_handle_control;
|
||||
s->dev.handle_data = usb_msd_handle_data;
|
||||
s->dev.handle_destroy = usb_msd_handle_destroy;
|
||||
|
||||
snprintf(s->dev.devname, sizeof(s->dev.devname), "QEMU USB MSD(%.16s)",
|
||||
filename);
|
||||
|
||||
s->scsi_dev = scsi_disk_init(bdrv, usb_msd_command_complete, s);
|
||||
usb_msd_handle_reset((USBDevice *)s, 0);
|
||||
usb_msd_handle_reset((USBDevice *)s);
|
||||
return (USBDevice *)s;
|
||||
}
|
||||
|
|
5
hw/usb.c
5
hw/usb.c
|
@ -55,10 +55,7 @@ int usb_generic_handle_packet(USBDevice *s, int pid,
|
|||
s->remote_wakeup = 0;
|
||||
s->addr = 0;
|
||||
s->state = USB_STATE_DEFAULT;
|
||||
s->handle_reset(s, 0);
|
||||
break;
|
||||
case USB_MSG_DESTROY:
|
||||
s->handle_reset(s, 1);
|
||||
s->handle_reset(s);
|
||||
break;
|
||||
case USB_TOKEN_SETUP:
|
||||
if (s->state < USB_STATE_DEFAULT || devaddr != s->addr)
|
||||
|
|
5
hw/usb.h
5
hw/usb.h
|
@ -29,7 +29,6 @@
|
|||
#define USB_MSG_ATTACH 0x100
|
||||
#define USB_MSG_DETACH 0x101
|
||||
#define USB_MSG_RESET 0x102
|
||||
#define USB_MSG_DESTROY 0x103
|
||||
|
||||
#define USB_RET_NODEV (-1)
|
||||
#define USB_RET_NAK (-2)
|
||||
|
@ -117,12 +116,14 @@ struct USBDevice {
|
|||
int (*handle_packet)(USBDevice *dev, int pid,
|
||||
uint8_t devaddr, uint8_t devep,
|
||||
uint8_t *data, int len);
|
||||
void (*handle_destroy)(USBDevice *dev);
|
||||
|
||||
int speed;
|
||||
|
||||
/* The following fields are used by the generic USB device
|
||||
layer. They are here just to avoid creating a new structure for
|
||||
them. */
|
||||
void (*handle_reset)(USBDevice *dev, int destroy);
|
||||
void (*handle_reset)(USBDevice *dev);
|
||||
int (*handle_control)(USBDevice *dev, int request, int value,
|
||||
int index, int length, uint8_t *data);
|
||||
int (*handle_data)(USBDevice *dev, int pid, uint8_t devep,
|
||||
|
|
20
usb-linux.c
20
usb-linux.c
|
@ -58,16 +58,8 @@ typedef struct USBHostDevice {
|
|||
int fd;
|
||||
} USBHostDevice;
|
||||
|
||||
static void usb_host_handle_reset(USBDevice *dev, int destroy)
|
||||
static void usb_host_handle_reset(USBDevice *dev)
|
||||
{
|
||||
USBHostDevice *s = (USBHostDevice *)dev;
|
||||
|
||||
if (destroy) {
|
||||
if (s->fd >= 0)
|
||||
close(s->fd);
|
||||
qemu_free(s);
|
||||
return;
|
||||
}
|
||||
#if 0
|
||||
USBHostDevice *s = (USBHostDevice *)dev;
|
||||
/* USBDEVFS_RESET, but not the first time as it has already be
|
||||
|
@ -76,6 +68,15 @@ static void usb_host_handle_reset(USBDevice *dev, int destroy)
|
|||
#endif
|
||||
}
|
||||
|
||||
static void usb_host_handle_destroy(USBDevice *dev)
|
||||
{
|
||||
USBHostDevice *s = (USBHostDevice *)dev;
|
||||
|
||||
if (s->fd >= 0)
|
||||
close(s->fd);
|
||||
qemu_free(s);
|
||||
}
|
||||
|
||||
static int usb_host_handle_control(USBDevice *dev,
|
||||
int request,
|
||||
int value,
|
||||
|
@ -244,6 +245,7 @@ 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;
|
||||
dev->dev.handle_destroy = usb_host_handle_destroy;
|
||||
|
||||
if (product_name[0] == '\0')
|
||||
snprintf(dev->dev.devname, sizeof(dev->dev.devname),
|
||||
|
|
3
vl.c
3
vl.c
|
@ -3781,6 +3781,7 @@ static int usb_device_del(const char *devname)
|
|||
{
|
||||
USBPort *port;
|
||||
USBPort **lastp;
|
||||
USBDevice *dev;
|
||||
int bus_num, addr;
|
||||
const char *p;
|
||||
|
||||
|
@ -3805,8 +3806,10 @@ static int usb_device_del(const char *devname)
|
|||
if (!port)
|
||||
return -1;
|
||||
|
||||
dev = port->dev;
|
||||
*lastp = port->next;
|
||||
usb_attach(port, NULL);
|
||||
dev->handle_destroy(dev);
|
||||
port->next = free_usb_ports;
|
||||
free_usb_ports = port;
|
||||
return 0;
|
||||
|
|
Loading…
Reference in New Issue