You need to sign in or sign up before continuing.
提交 007fd62f 编写于 作者: H Hans de Goede 提交者: Gerd Hoffmann

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: NHans de Goede <hdegoede@redhat.com>
上级 8656954a
...@@ -323,7 +323,7 @@ static void bt_hid_control_transaction(struct bt_hid_device_s *s, ...@@ -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, ...@@ -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, ...@@ -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) ...@@ -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) ...@@ -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 ...@@ -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); ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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;
} }
......
...@@ -84,7 +84,7 @@ static int do_token_setup(USBDevice *s, USBPacket *p) ...@@ -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) ...@@ -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;
......
...@@ -214,7 +214,7 @@ struct USBDeviceInfo { ...@@ -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) ...@@ -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,
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册