Compare commits

..

4 Commits

Author SHA1 Message Date
Gerd Hoffmann
92fdfa4bef Revert "xhci: set timer to retry xfers"
This reverts commit 4e8cfbe114.

We should not poll via timer, and with ccid being fixed
to properly notify us about pending transfers we don't have to.

Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
2015-07-17 13:20:53 +02:00
Gerd Hoffmann
86d7e214c2 usb-ccid: add missing wakeup calls
Properly notify the host adapter that we have
data pending, so it doesn't has to poll us.

Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
2015-07-17 13:20:53 +02:00
Gerd Hoffmann
cfda2cef3d usb-ccid: fix 61b4887b41
QOMification dropped the parent device lookup, fix it.

Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
2015-07-17 13:19:59 +02:00
6110ce59af Re-attach usb device to kernel while usb_host_open fails
Signed-off-by: Lin Ma <lma@suse.com>
Reviewed-by: Gonglei <arei.gonglei@huawei.com>
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
2015-07-16 17:39:13 +02:00
8 changed files with 21 additions and 41 deletions

View File

@@ -239,7 +239,7 @@ static void hid_keyboard_event(DeviceState *dev, QemuConsole *src,
static void hid_keyboard_process_keycode(HIDState *hs) static void hid_keyboard_process_keycode(HIDState *hs)
{ {
uint8_t hid_code, index, key; uint8_t hid_code, key;
int i, keycode, slot; int i, keycode, slot;
if (hs->n == 0) { if (hs->n == 0) {
@@ -249,8 +249,7 @@ static void hid_keyboard_process_keycode(HIDState *hs)
keycode = hs->kbd.keycodes[slot]; keycode = hs->kbd.keycodes[slot];
key = keycode & 0x7f; key = keycode & 0x7f;
index = key | ((hs->kbd.modifiers & (1 << 8)) >> 1); hid_code = hid_usage_keys[key | ((hs->kbd.modifiers >> 1) & (1 << 7))];
hid_code = hid_usage_keys[index];
hs->kbd.modifiers &= ~(1 << 8); hs->kbd.modifiers &= ~(1 << 8);
switch (hid_code) { switch (hid_code) {
@@ -258,41 +257,18 @@ static void hid_keyboard_process_keycode(HIDState *hs)
return; return;
case 0xe0: case 0xe0:
assert(key == 0x1d);
if (hs->kbd.modifiers & (1 << 9)) { if (hs->kbd.modifiers & (1 << 9)) {
/* The hid_codes for the 0xe1/0x1d scancode sequence are 0xe9/0xe0. hs->kbd.modifiers ^= 3 << 8;
* Here we're processing the second hid_code. By dropping bit 9
* and setting bit 8, the scancode after 0x1d will access the
* second half of the table.
*/
hs->kbd.modifiers ^= (1 << 8) | (1 << 9);
return; return;
} }
/* fall through to process Ctrl_L */
case 0xe1 ... 0xe7: case 0xe1 ... 0xe7:
/* Ctrl_L/Ctrl_R, Shift_L/Shift_R, Alt_L/Alt_R, Win_L/Win_R.
* Handle releases here, or fall through to process presses.
*/
if (keycode & (1 << 7)) { if (keycode & (1 << 7)) {
hs->kbd.modifiers &= ~(1 << (hid_code & 0x0f)); hs->kbd.modifiers &= ~(1 << (hid_code & 0x0f));
return; return;
} }
/* fall through */ case 0xe8 ... 0xef:
case 0xe8 ... 0xe9:
/* USB modifiers are just 1 byte long. Bits 8 and 9 of
* hs->kbd.modifiers implement a state machine that detects the
* 0xe0 and 0xe1/0x1d sequences. These bits do not follow the
* usual rules where bit 7 marks released keys; they are cleared
* elsewhere in the function as the state machine dictates.
*/
hs->kbd.modifiers |= 1 << (hid_code & 0x0f); hs->kbd.modifiers |= 1 << (hid_code & 0x0f);
return; return;
case 0xea ... 0xef:
abort();
default:
break;
} }
if (keycode & (1 << 7)) { if (keycode & (1 << 7)) {

View File

@@ -308,7 +308,6 @@ static void virtio_input_hid_handle_status(VirtIOInput *vinput,
static Property virtio_input_hid_properties[] = { static Property virtio_input_hid_properties[] = {
DEFINE_PROP_STRING("display", VirtIOInputHID, display), DEFINE_PROP_STRING("display", VirtIOInputHID, display),
DEFINE_PROP_UINT32("head", VirtIOInputHID, head, 0), DEFINE_PROP_UINT32("head", VirtIOInputHID, head, 0),
DEFINE_PROP_END_OF_LIST(),
}; };
static void virtio_input_hid_class_init(ObjectClass *klass, void *data) static void virtio_input_hid_class_init(ObjectClass *klass, void *data)

View File

@@ -11,7 +11,6 @@
#include "hw/virtio/virtio.h" #include "hw/virtio/virtio.h"
#include "hw/virtio/virtio-input.h" #include "hw/virtio/virtio-input.h"
#include <sys/ioctl.h>
#include "standard-headers/linux/input.h" #include "standard-headers/linux/input.h"
/* ----------------------------------------------------------------- */ /* ----------------------------------------------------------------- */

View File

@@ -283,6 +283,7 @@ typedef struct CCIDBus {
typedef struct USBCCIDState { typedef struct USBCCIDState {
USBDevice dev; USBDevice dev;
USBEndpoint *intr; USBEndpoint *intr;
USBEndpoint *bulk;
CCIDBus bus; CCIDBus bus;
CCIDCardState *card; CCIDCardState *card;
BulkIn bulk_in_pending[BULK_IN_PENDING_NUM]; /* circular */ BulkIn bulk_in_pending[BULK_IN_PENDING_NUM]; /* circular */
@@ -769,6 +770,7 @@ static void ccid_write_slot_status(USBCCIDState *s, CCID_Header *recv)
h->b.bError = s->bError; h->b.bError = s->bError;
h->bClockStatus = CLOCK_STATUS_RUNNING; h->bClockStatus = CLOCK_STATUS_RUNNING;
ccid_reset_error_status(s); ccid_reset_error_status(s);
usb_wakeup(s->bulk, 0);
} }
static void ccid_write_parameters(USBCCIDState *s, CCID_Header *recv) static void ccid_write_parameters(USBCCIDState *s, CCID_Header *recv)
@@ -789,6 +791,7 @@ static void ccid_write_parameters(USBCCIDState *s, CCID_Header *recv)
h->bProtocolNum = s->bProtocolNum; h->bProtocolNum = s->bProtocolNum;
h->abProtocolDataStructure = s->abProtocolDataStructure; h->abProtocolDataStructure = s->abProtocolDataStructure;
ccid_reset_error_status(s); ccid_reset_error_status(s);
usb_wakeup(s->bulk, 0);
} }
static void ccid_write_data_block(USBCCIDState *s, uint8_t slot, uint8_t seq, static void ccid_write_data_block(USBCCIDState *s, uint8_t slot, uint8_t seq,
@@ -810,6 +813,7 @@ static void ccid_write_data_block(USBCCIDState *s, uint8_t slot, uint8_t seq,
} }
memcpy(p->abData, data, len); memcpy(p->abData, data, len);
ccid_reset_error_status(s); ccid_reset_error_status(s);
usb_wakeup(s->bulk, 0);
} }
static void ccid_report_error_failed(USBCCIDState *s, uint8_t error) static void ccid_report_error_failed(USBCCIDState *s, uint8_t error)
@@ -1184,7 +1188,7 @@ void ccid_card_send_apdu_to_guest(CCIDCardState *card,
uint8_t *apdu, uint32_t len) uint8_t *apdu, uint32_t len)
{ {
DeviceState *qdev = DEVICE(card); DeviceState *qdev = DEVICE(card);
USBDevice *dev = USB_DEVICE(qdev); USBDevice *dev = USB_DEVICE(qdev->parent_bus->parent);
USBCCIDState *s = USB_CCID_DEV(dev); USBCCIDState *s = USB_CCID_DEV(dev);
Answer *answer; Answer *answer;
@@ -1207,7 +1211,7 @@ void ccid_card_send_apdu_to_guest(CCIDCardState *card,
void ccid_card_card_removed(CCIDCardState *card) void ccid_card_card_removed(CCIDCardState *card)
{ {
DeviceState *qdev = DEVICE(card); DeviceState *qdev = DEVICE(card);
USBDevice *dev = USB_DEVICE(qdev); USBDevice *dev = USB_DEVICE(qdev->parent_bus->parent);
USBCCIDState *s = USB_CCID_DEV(dev); USBCCIDState *s = USB_CCID_DEV(dev);
ccid_on_slot_change(s, false); ccid_on_slot_change(s, false);
@@ -1218,7 +1222,7 @@ void ccid_card_card_removed(CCIDCardState *card)
int ccid_card_ccid_attach(CCIDCardState *card) int ccid_card_ccid_attach(CCIDCardState *card)
{ {
DeviceState *qdev = DEVICE(card); DeviceState *qdev = DEVICE(card);
USBDevice *dev = USB_DEVICE(qdev); USBDevice *dev = USB_DEVICE(qdev->parent_bus->parent);
USBCCIDState *s = USB_CCID_DEV(dev); USBCCIDState *s = USB_CCID_DEV(dev);
DPRINTF(s, 1, "CCID Attach\n"); DPRINTF(s, 1, "CCID Attach\n");
@@ -1231,7 +1235,7 @@ int ccid_card_ccid_attach(CCIDCardState *card)
void ccid_card_ccid_detach(CCIDCardState *card) void ccid_card_ccid_detach(CCIDCardState *card)
{ {
DeviceState *qdev = DEVICE(card); DeviceState *qdev = DEVICE(card);
USBDevice *dev = USB_DEVICE(qdev); USBDevice *dev = USB_DEVICE(qdev->parent_bus->parent);
USBCCIDState *s = USB_CCID_DEV(dev); USBCCIDState *s = USB_CCID_DEV(dev);
DPRINTF(s, 1, "CCID Detach\n"); DPRINTF(s, 1, "CCID Detach\n");
@@ -1244,7 +1248,7 @@ void ccid_card_ccid_detach(CCIDCardState *card)
void ccid_card_card_error(CCIDCardState *card, uint64_t error) void ccid_card_card_error(CCIDCardState *card, uint64_t error)
{ {
DeviceState *qdev = DEVICE(card); DeviceState *qdev = DEVICE(card);
USBDevice *dev = USB_DEVICE(qdev); USBDevice *dev = USB_DEVICE(qdev->parent_bus->parent);
USBCCIDState *s = USB_CCID_DEV(dev); USBCCIDState *s = USB_CCID_DEV(dev);
s->bmCommandStatus = COMMAND_STATUS_FAILED; s->bmCommandStatus = COMMAND_STATUS_FAILED;
@@ -1263,7 +1267,7 @@ void ccid_card_card_error(CCIDCardState *card, uint64_t error)
void ccid_card_card_inserted(CCIDCardState *card) void ccid_card_card_inserted(CCIDCardState *card)
{ {
DeviceState *qdev = DEVICE(card); DeviceState *qdev = DEVICE(card);
USBDevice *dev = USB_DEVICE(qdev); USBDevice *dev = USB_DEVICE(qdev->parent_bus->parent);
USBCCIDState *s = USB_CCID_DEV(dev); USBCCIDState *s = USB_CCID_DEV(dev);
s->bmCommandStatus = COMMAND_STATUS_NO_ERROR; s->bmCommandStatus = COMMAND_STATUS_NO_ERROR;
@@ -1275,7 +1279,7 @@ static int ccid_card_exit(DeviceState *qdev)
{ {
int ret = 0; int ret = 0;
CCIDCardState *card = CCID_CARD(qdev); CCIDCardState *card = CCID_CARD(qdev);
USBDevice *dev = USB_DEVICE(qdev); USBDevice *dev = USB_DEVICE(qdev->parent_bus->parent);
USBCCIDState *s = USB_CCID_DEV(dev); USBCCIDState *s = USB_CCID_DEV(dev);
if (ccid_card_inserted(s)) { if (ccid_card_inserted(s)) {
@@ -1289,7 +1293,7 @@ static int ccid_card_exit(DeviceState *qdev)
static int ccid_card_init(DeviceState *qdev) static int ccid_card_init(DeviceState *qdev)
{ {
CCIDCardState *card = CCID_CARD(qdev); CCIDCardState *card = CCID_CARD(qdev);
USBDevice *dev = USB_DEVICE(qdev); USBDevice *dev = USB_DEVICE(qdev->parent_bus->parent);
USBCCIDState *s = USB_CCID_DEV(dev); USBCCIDState *s = USB_CCID_DEV(dev);
int ret = 0; int ret = 0;
@@ -1319,6 +1323,7 @@ static void ccid_realize(USBDevice *dev, Error **errp)
NULL); NULL);
qbus_set_hotplug_handler(BUS(&s->bus), DEVICE(dev), &error_abort); qbus_set_hotplug_handler(BUS(&s->bus), DEVICE(dev), &error_abort);
s->intr = usb_ep_get(dev, USB_TOKEN_IN, CCID_INT_IN_EP); s->intr = usb_ep_get(dev, USB_TOKEN_IN, CCID_INT_IN_EP);
s->bulk = usb_ep_get(dev, USB_TOKEN_IN, CCID_BULK_IN_EP);
s->card = NULL; s->card = NULL;
s->migration_state = MIGRATION_NONE; s->migration_state = MIGRATION_NONE;
s->migration_target_ip = 0; s->migration_target_ip = 0;

View File

@@ -2222,8 +2222,6 @@ static void xhci_kick_ep(XHCIState *xhci, unsigned int slotid,
if (xfer->running_retry) { if (xfer->running_retry) {
DPRINTF("xhci: xfer nacked, stopping schedule\n"); DPRINTF("xhci: xfer nacked, stopping schedule\n");
epctx->retry = xfer; epctx->retry = xfer;
timer_mod(epctx->kick_timer, qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) +
epctx->interval * 125000);
break; break;
} }
} }

View File

@@ -889,6 +889,9 @@ static int usb_host_open(USBHostDevice *s, libusb_device *dev)
fail: fail:
trace_usb_host_open_failure(bus_num, addr); trace_usb_host_open_failure(bus_num, addr);
if (s->dh != NULL) { if (s->dh != NULL) {
usb_host_release_interfaces(s);
libusb_reset_device(s->dh);
usb_host_attach_kernel(s);
libusb_close(s->dh); libusb_close(s->dh);
s->dh = NULL; s->dh = NULL;
s->dev = NULL; s->dev = NULL;

View File

@@ -10,6 +10,7 @@
#include <sys/time.h> #include <sys/time.h>
#include <sys/ioctl.h>
#include <sys/types.h> #include <sys/types.h>
#include "standard-headers/linux/types.h" #include "standard-headers/linux/types.h"

View File

@@ -56,7 +56,6 @@ cp_virtio() {
-e 's/__bitwise__//' \ -e 's/__bitwise__//' \
-e 's/__attribute__((packed))/QEMU_PACKED/' \ -e 's/__attribute__((packed))/QEMU_PACKED/' \
-e 's/__inline__/inline/' \ -e 's/__inline__/inline/' \
-e '/sys\/ioctl.h/d' \
"$f" > "$to/$header"; "$f" > "$to/$header";
done done
fi fi