mirror of
https://git.proxmox.com/git/qemu
synced 2025-06-15 14:32:03 +00:00
usb: Pass the packet to the device's handle_control callback
This allows using the generic usb_generic_handle_packet function from device code which does ASYNC control requests (such as the linux host pass through code). Signed-off-by: Hans de Goede <hdegoede@redhat.com>
This commit is contained in:
parent
8656954aed
commit
007fd62f4d
@ -323,7 +323,7 @@ static void bt_hid_control_transaction(struct bt_hid_device_s *s,
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
s->proto = parameter;
|
s->proto = parameter;
|
||||||
s->usbdev->info->handle_control(s->usbdev, SET_PROTOCOL, s->proto, 0, 0,
|
s->usbdev->info->handle_control(s->usbdev, NULL, SET_PROTOCOL, s->proto, 0, 0,
|
||||||
NULL);
|
NULL);
|
||||||
ret = BT_HS_SUCCESSFUL;
|
ret = BT_HS_SUCCESSFUL;
|
||||||
break;
|
break;
|
||||||
@ -333,7 +333,7 @@ static void bt_hid_control_transaction(struct bt_hid_device_s *s,
|
|||||||
ret = BT_HS_ERR_INVALID_PARAMETER;
|
ret = BT_HS_ERR_INVALID_PARAMETER;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
s->usbdev->info->handle_control(s->usbdev, GET_IDLE, 0, 0, 1,
|
s->usbdev->info->handle_control(s->usbdev, NULL, GET_IDLE, 0, 0, 1,
|
||||||
s->control->sdu_out(s->control, 1));
|
s->control->sdu_out(s->control, 1));
|
||||||
s->control->sdu_submit(s->control);
|
s->control->sdu_submit(s->control);
|
||||||
break;
|
break;
|
||||||
@ -346,7 +346,7 @@ static void bt_hid_control_transaction(struct bt_hid_device_s *s,
|
|||||||
|
|
||||||
/* We don't need to know about the Idle Rate here really,
|
/* We don't need to know about the Idle Rate here really,
|
||||||
* so just pass it on to the device. */
|
* so just pass it on to the device. */
|
||||||
ret = s->usbdev->info->handle_control(s->usbdev,
|
ret = s->usbdev->info->handle_control(s->usbdev, NULL,
|
||||||
SET_IDLE, data[1], 0, 0, NULL) ?
|
SET_IDLE, data[1], 0, 0, NULL) ?
|
||||||
BT_HS_SUCCESSFUL : BT_HS_ERR_INVALID_PARAMETER;
|
BT_HS_SUCCESSFUL : BT_HS_ERR_INVALID_PARAMETER;
|
||||||
/* XXX: Does this generate a handshake? */
|
/* XXX: Does this generate a handshake? */
|
||||||
|
@ -372,13 +372,13 @@ static void usb_bt_handle_reset(USBDevice *dev)
|
|||||||
s->altsetting = 0;
|
s->altsetting = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int usb_bt_handle_control(USBDevice *dev, int request, int value,
|
static int usb_bt_handle_control(USBDevice *dev, USBPacket *p,
|
||||||
int index, int length, uint8_t *data)
|
int request, int value, int index, int length, uint8_t *data)
|
||||||
{
|
{
|
||||||
struct USBBtState *s = (struct USBBtState *) dev->opaque;
|
struct USBBtState *s = (struct USBBtState *) dev->opaque;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
ret = usb_desc_handle_control(dev, request, value, index, length, data);
|
ret = usb_desc_handle_control(dev, p, request, value, index, length, data);
|
||||||
if (ret >= 0) {
|
if (ret >= 0) {
|
||||||
switch (request) {
|
switch (request) {
|
||||||
case DeviceRequest | USB_REQ_GET_CONFIGURATION:
|
case DeviceRequest | USB_REQ_GET_CONFIGURATION:
|
||||||
|
@ -602,8 +602,8 @@ static void ccid_handle_reset(USBDevice *dev)
|
|||||||
ccid_reset(s);
|
ccid_reset(s);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int ccid_handle_control(USBDevice *dev, int request, int value,
|
static int ccid_handle_control(USBDevice *dev, USBPacket *p, int request,
|
||||||
int index, int length, uint8_t *data)
|
int value, int index, int length, uint8_t *data)
|
||||||
{
|
{
|
||||||
USBCCIDState *s = DO_UPCAST(USBCCIDState, dev, dev);
|
USBCCIDState *s = DO_UPCAST(USBCCIDState, dev, dev);
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
@ -390,8 +390,8 @@ int usb_desc_get_descriptor(USBDevice *dev, int value, uint8_t *dest, size_t len
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
int usb_desc_handle_control(USBDevice *dev, int request, int value,
|
int usb_desc_handle_control(USBDevice *dev, USBPacket *p,
|
||||||
int index, int length, uint8_t *data)
|
int request, int value, int index, int length, uint8_t *data)
|
||||||
{
|
{
|
||||||
const USBDesc *desc = dev->info->usb_desc;
|
const USBDesc *desc = dev->info->usb_desc;
|
||||||
int i, ret = -1;
|
int i, ret = -1;
|
||||||
|
@ -106,7 +106,7 @@ void usb_desc_set_string(USBDevice *dev, uint8_t index, const char *str);
|
|||||||
const char *usb_desc_get_string(USBDevice *dev, uint8_t index);
|
const char *usb_desc_get_string(USBDevice *dev, uint8_t index);
|
||||||
int usb_desc_string(USBDevice *dev, int index, uint8_t *dest, size_t len);
|
int usb_desc_string(USBDevice *dev, int index, uint8_t *dest, size_t len);
|
||||||
int usb_desc_get_descriptor(USBDevice *dev, int value, uint8_t *dest, size_t len);
|
int usb_desc_get_descriptor(USBDevice *dev, int value, uint8_t *dest, size_t len);
|
||||||
int usb_desc_handle_control(USBDevice *dev, int request, int value,
|
int usb_desc_handle_control(USBDevice *dev, USBPacket *p,
|
||||||
int index, int length, uint8_t *data);
|
int request, int value, int index, int length, uint8_t *data);
|
||||||
|
|
||||||
#endif /* QEMU_HW_USB_DESC_H */
|
#endif /* QEMU_HW_USB_DESC_H */
|
||||||
|
@ -727,13 +727,13 @@ static void usb_hid_set_next_idle(USBHIDState *s, int64_t curtime)
|
|||||||
s->next_idle_clock = curtime + (get_ticks_per_sec() * s->idle * 4) / 1000;
|
s->next_idle_clock = curtime + (get_ticks_per_sec() * s->idle * 4) / 1000;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int usb_hid_handle_control(USBDevice *dev, int request, int value,
|
static int usb_hid_handle_control(USBDevice *dev, USBPacket *p,
|
||||||
int index, int length, uint8_t *data)
|
int request, int value, int index, int length, uint8_t *data)
|
||||||
{
|
{
|
||||||
USBHIDState *s = (USBHIDState *)dev;
|
USBHIDState *s = (USBHIDState *)dev;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
ret = usb_desc_handle_control(dev, request, value, index, length, data);
|
ret = usb_desc_handle_control(dev, p, request, value, index, length, data);
|
||||||
if (ret >= 0) {
|
if (ret >= 0) {
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -285,13 +285,13 @@ static void usb_hub_handle_reset(USBDevice *dev)
|
|||||||
/* XXX: do it */
|
/* XXX: do it */
|
||||||
}
|
}
|
||||||
|
|
||||||
static int usb_hub_handle_control(USBDevice *dev, int request, int value,
|
static int usb_hub_handle_control(USBDevice *dev, USBPacket *p,
|
||||||
int index, int length, uint8_t *data)
|
int request, int value, int index, int length, uint8_t *data)
|
||||||
{
|
{
|
||||||
USBHubState *s = (USBHubState *)dev;
|
USBHubState *s = (USBHubState *)dev;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
ret = usb_desc_handle_control(dev, request, value, index, length, data);
|
ret = usb_desc_handle_control(dev, p, request, value, index, length, data);
|
||||||
if (ret >= 0) {
|
if (ret >= 0) {
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -272,13 +272,13 @@ static void usb_msd_handle_reset(USBDevice *dev)
|
|||||||
s->mode = USB_MSDM_CBW;
|
s->mode = USB_MSDM_CBW;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int usb_msd_handle_control(USBDevice *dev, int request, int value,
|
static int usb_msd_handle_control(USBDevice *dev, USBPacket *p,
|
||||||
int index, int length, uint8_t *data)
|
int request, int value, int index, int length, uint8_t *data)
|
||||||
{
|
{
|
||||||
MSDState *s = (MSDState *)dev;
|
MSDState *s = (MSDState *)dev;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
ret = usb_desc_handle_control(dev, request, value, index, length, data);
|
ret = usb_desc_handle_control(dev, p, request, value, index, length, data);
|
||||||
if (ret >= 0) {
|
if (ret >= 0) {
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -1042,13 +1042,13 @@ static void usb_net_handle_reset(USBDevice *dev)
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
static int usb_net_handle_control(USBDevice *dev, int request, int value,
|
static int usb_net_handle_control(USBDevice *dev, USBPacket *p,
|
||||||
int index, int length, uint8_t *data)
|
int request, int value, int index, int length, uint8_t *data)
|
||||||
{
|
{
|
||||||
USBNetState *s = (USBNetState *) dev;
|
USBNetState *s = (USBNetState *) dev;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
ret = usb_desc_handle_control(dev, request, value, index, length, data);
|
ret = usb_desc_handle_control(dev, p, request, value, index, length, data);
|
||||||
if (ret >= 0) {
|
if (ret >= 0) {
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -219,14 +219,14 @@ static uint8_t usb_get_modem_lines(USBSerialState *s)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int usb_serial_handle_control(USBDevice *dev, int request, int value,
|
static int usb_serial_handle_control(USBDevice *dev, USBPacket *p,
|
||||||
int index, int length, uint8_t *data)
|
int request, int value, int index, int length, uint8_t *data)
|
||||||
{
|
{
|
||||||
USBSerialState *s = (USBSerialState *)dev;
|
USBSerialState *s = (USBSerialState *)dev;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
DPRINTF("got control %x, value %x\n",request, value);
|
DPRINTF("got control %x, value %x\n",request, value);
|
||||||
ret = usb_desc_handle_control(dev, request, value, index, length, data);
|
ret = usb_desc_handle_control(dev, p, request, value, index, length, data);
|
||||||
if (ret >= 0) {
|
if (ret >= 0) {
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -250,13 +250,13 @@ static void usb_wacom_handle_reset(USBDevice *dev)
|
|||||||
s->mode = WACOM_MODE_HID;
|
s->mode = WACOM_MODE_HID;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int usb_wacom_handle_control(USBDevice *dev, int request, int value,
|
static int usb_wacom_handle_control(USBDevice *dev, USBPacket *p,
|
||||||
int index, int length, uint8_t *data)
|
int request, int value, int index, int length, uint8_t *data)
|
||||||
{
|
{
|
||||||
USBWacomState *s = (USBWacomState *) dev;
|
USBWacomState *s = (USBWacomState *) dev;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
ret = usb_desc_handle_control(dev, request, value, index, length, data);
|
ret = usb_desc_handle_control(dev, p, request, value, index, length, data);
|
||||||
if (ret >= 0) {
|
if (ret >= 0) {
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
9
hw/usb.c
9
hw/usb.c
@ -84,7 +84,7 @@ static int do_token_setup(USBDevice *s, USBPacket *p)
|
|||||||
index = (s->setup_buf[5] << 8) | s->setup_buf[4];
|
index = (s->setup_buf[5] << 8) | s->setup_buf[4];
|
||||||
|
|
||||||
if (s->setup_buf[0] & USB_DIR_IN) {
|
if (s->setup_buf[0] & USB_DIR_IN) {
|
||||||
ret = s->info->handle_control(s, request, value, index,
|
ret = s->info->handle_control(s, p, request, value, index,
|
||||||
s->setup_len, s->data_buf);
|
s->setup_len, s->data_buf);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
@ -123,9 +123,12 @@ static int do_token_in(USBDevice *s, USBPacket *p)
|
|||||||
switch(s->setup_state) {
|
switch(s->setup_state) {
|
||||||
case SETUP_STATE_ACK:
|
case SETUP_STATE_ACK:
|
||||||
if (!(s->setup_buf[0] & USB_DIR_IN)) {
|
if (!(s->setup_buf[0] & USB_DIR_IN)) {
|
||||||
s->setup_state = SETUP_STATE_IDLE;
|
ret = s->info->handle_control(s, p, request, value, index,
|
||||||
ret = s->info->handle_control(s, request, value, index,
|
|
||||||
s->setup_len, s->data_buf);
|
s->setup_len, s->data_buf);
|
||||||
|
if (ret == USB_RET_ASYNC) {
|
||||||
|
return USB_RET_ASYNC;
|
||||||
|
}
|
||||||
|
s->setup_state = SETUP_STATE_IDLE;
|
||||||
if (ret > 0)
|
if (ret > 0)
|
||||||
return 0;
|
return 0;
|
||||||
return ret;
|
return ret;
|
||||||
|
2
hw/usb.h
2
hw/usb.h
@ -214,7 +214,7 @@ struct USBDeviceInfo {
|
|||||||
*
|
*
|
||||||
* Returns length or one of the USB_RET_ codes.
|
* Returns length or one of the USB_RET_ codes.
|
||||||
*/
|
*/
|
||||||
int (*handle_control)(USBDevice *dev, int request, int value,
|
int (*handle_control)(USBDevice *dev, USBPacket *p, int request, int value,
|
||||||
int index, int length, uint8_t *data);
|
int index, int length, uint8_t *data);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -126,6 +126,7 @@ static void usb_host_handle_reset(USBDevice *dev)
|
|||||||
* and return appropriate response
|
* and return appropriate response
|
||||||
*/
|
*/
|
||||||
static int usb_host_handle_control(USBDevice *dev,
|
static int usb_host_handle_control(USBDevice *dev,
|
||||||
|
USBPacket *p,
|
||||||
int request,
|
int request,
|
||||||
int value,
|
int value,
|
||||||
int index,
|
int index,
|
||||||
|
Loading…
Reference in New Issue
Block a user