mirror of
https://github.com/mii443/qemu.git
synced 2025-12-13 13:58:47 +00:00
Merge remote-tracking branch 'remotes/kraxel/tags/usb-20180518-pull-request' into staging
usb: two smartcard reader fixes. # gpg: Signature made Fri 18 May 2018 08:50:01 BST # gpg: using RSA key 4CB6D8EED3E87138 # gpg: Good signature from "Gerd Hoffmann (work) <kraxel@redhat.com>" # gpg: aka "Gerd Hoffmann <gerd@kraxel.org>" # gpg: aka "Gerd Hoffmann (private) <kraxel@gmail.com>" # Primary key fingerprint: A032 8CFF B93A 17A7 9901 FE7D 4CB6 D8EE D3E8 7138 * remotes/kraxel/tags/usb-20180518-pull-request: hw/usb/dev-smartcard-reader: Handle 64 B USB packets ccid-card-passthru: fix regression in realize() Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
@@ -345,7 +345,7 @@ static void passthru_realize(CCIDCardState *base, Error **errp)
|
|||||||
card->vscard_in_pos = 0;
|
card->vscard_in_pos = 0;
|
||||||
card->vscard_in_hdr = 0;
|
card->vscard_in_hdr = 0;
|
||||||
if (qemu_chr_fe_backend_connected(&card->cs)) {
|
if (qemu_chr_fe_backend_connected(&card->cs)) {
|
||||||
error_setg(errp, "ccid-card-passthru: initing chardev");
|
DPRINTF(card, D_INFO, "ccid-card-passthru: initing chardev");
|
||||||
qemu_chr_fe_set_handlers(&card->cs,
|
qemu_chr_fe_set_handlers(&card->cs,
|
||||||
ccid_card_vscard_can_read,
|
ccid_card_vscard_can_read,
|
||||||
ccid_card_vscard_read,
|
ccid_card_vscard_read,
|
||||||
|
|||||||
@@ -1064,7 +1064,8 @@ err:
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ccid_bulk_in_copy_to_guest(USBCCIDState *s, USBPacket *p)
|
static void ccid_bulk_in_copy_to_guest(USBCCIDState *s, USBPacket *p,
|
||||||
|
unsigned int max_packet_size)
|
||||||
{
|
{
|
||||||
int len = 0;
|
int len = 0;
|
||||||
|
|
||||||
@@ -1072,10 +1073,13 @@ static void ccid_bulk_in_copy_to_guest(USBCCIDState *s, USBPacket *p)
|
|||||||
if (s->current_bulk_in != NULL) {
|
if (s->current_bulk_in != NULL) {
|
||||||
len = MIN(s->current_bulk_in->len - s->current_bulk_in->pos,
|
len = MIN(s->current_bulk_in->len - s->current_bulk_in->pos,
|
||||||
p->iov.size);
|
p->iov.size);
|
||||||
|
if (len) {
|
||||||
usb_packet_copy(p, s->current_bulk_in->data +
|
usb_packet_copy(p, s->current_bulk_in->data +
|
||||||
s->current_bulk_in->pos, len);
|
s->current_bulk_in->pos, len);
|
||||||
|
}
|
||||||
s->current_bulk_in->pos += len;
|
s->current_bulk_in->pos += len;
|
||||||
if (s->current_bulk_in->pos == s->current_bulk_in->len) {
|
if (s->current_bulk_in->pos == s->current_bulk_in->len
|
||||||
|
&& len != max_packet_size) {
|
||||||
ccid_bulk_in_release(s);
|
ccid_bulk_in_release(s);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@@ -1107,7 +1111,7 @@ static void ccid_handle_data(USBDevice *dev, USBPacket *p)
|
|||||||
case USB_TOKEN_IN:
|
case USB_TOKEN_IN:
|
||||||
switch (p->ep->nr) {
|
switch (p->ep->nr) {
|
||||||
case CCID_BULK_IN_EP:
|
case CCID_BULK_IN_EP:
|
||||||
ccid_bulk_in_copy_to_guest(s, p);
|
ccid_bulk_in_copy_to_guest(s, p, dev->ep_ctl.max_packet_size);
|
||||||
break;
|
break;
|
||||||
case CCID_INT_IN_EP:
|
case CCID_INT_IN_EP:
|
||||||
if (s->notify_slot_change) {
|
if (s->notify_slot_change) {
|
||||||
|
|||||||
Reference in New Issue
Block a user