Signed-off-by: Klaus Ripke <klaus.ri...@secunet.com> hw/usb/dev-smartcard-reader.c: Set some static values from ccid_properties.
--- hw/usb/dev-smartcard-reader.c | 35 ++++++++++++++++++++++++++++++----- 1 file changed, 30 insertions(+), 5 deletions(-) diff --git a/hw/usb/dev-smartcard-reader.c b/hw/usb/dev-smartcard- reader.c index 28164d89be..4002157773 100644 --- a/hw/usb/dev-smartcard-reader.c +++ b/hw/usb/dev-smartcard-reader.c @@ -311,6 +311,11 @@ struct USBCCIDState { uint8_t powered; uint8_t notify_slot_change; uint8_t debug; + /* the following are copied to static on initial realize */ + uint16_t vendor; + uint16_t product; + uint8_t maxslot; + uint8_t feat2; }; /* @@ -323,7 +328,11 @@ struct USBCCIDState { * 0dc3:1004 Athena Smartcard Solutions, Inc. */ -static const uint8_t qemu_ccid_descriptor[] = { +enum { + DESC_MAXSLOT = 4, + DESC_FEAT2 = 42 /* dwFeatures byte 2 */ +}; +static uint8_t qemu_ccid_descriptor[] = { /* Smart Card Device Class Descriptor */ 0x36, /* u8 bLength; */ 0x21, /* u8 bDescriptorType; Functional */ @@ -472,7 +481,7 @@ static const USBDescDevice desc_device = { }, }; -static const USBDesc desc_ccid = { +static USBDesc desc_ccid = { .id = { .idVendor = CCID_VENDOR_ID, .idProduct = CCID_PRODUCT_ID, @@ -1295,9 +1304,10 @@ static void ccid_card_realize(DeviceState *qdev, Error **errp) USBCCIDState *s = USB_CCID_DEV(dev); Error *local_err = NULL; - if (card->slot != 0) { - error_setg(errp, "usb-ccid supports one slot, can't add %d", - card->slot); + DPRINTF(s, D_VERBOSE, "%s: slot %d\n", __func__, card->slot); + if (card->slot > qemu_ccid_descriptor[DESC_MAXSLOT]) { + error_setg(errp, "usb-ccid supports %d slot, can't add %d", + qemu_ccid_descriptor[DESC_MAXSLOT] + 1, card- >slot); return; } if (s->card != NULL) { @@ -1317,6 +1327,14 @@ static void ccid_card_realize(DeviceState *qdev, Error **errp) static void ccid_realize(USBDevice *dev, Error **errp) { USBCCIDState *s = USB_CCID_DEV(dev); + static int initialized; + if (!initialized) { + desc_ccid.id.idVendor = s->vendor; + desc_ccid.id.idProduct = s->product; + qemu_ccid_descriptor[DESC_MAXSLOT] = s->maxslot; + qemu_ccid_descriptor[DESC_FEAT2] = s->feat2; + initialized = !0; + } usb_desc_create_serial(dev); usb_desc_init(dev); @@ -1339,6 +1357,8 @@ static void ccid_realize(USBDevice *dev, Error **errp) ccid_reset_parameters(s); ccid_reset(s); s->debug = parse_debug_env("QEMU_CCID_DEBUG", D_VERBOSE, s- >debug); + DPRINTF(s, D_VERBOSE, "ccid_realize %d %x %x %x %x\n", + initialized, s->vendor, s->product, s->maxslot, s->feat2); } static int ccid_post_load(void *opaque, int version_id) @@ -1434,9 +1454,14 @@ static const VMStateDescription ccid_vmstate = { static Property ccid_properties[] = { DEFINE_PROP_UINT8("debug", USBCCIDState, debug, 0), + DEFINE_PROP_UINT16("vendor", USBCCIDState, vendor, CCID_VENDOR_ID), + DEFINE_PROP_UINT16("product", USBCCIDState, product, CCID_PRODUCT_ID), + DEFINE_PROP_UINT8("maxslot", USBCCIDState, maxslot, 0), + DEFINE_PROP_UINT8("feat2", USBCCIDState, feat2, 0), DEFINE_PROP_END_OF_LIST(), }; + static void ccid_class_initfn(ObjectClass *klass, void *data) { DeviceClass *dc = DEVICE_CLASS(klass); -- 2.34.1 -- Klaus Ripke Senior Developer Public Authorities Division secunet Security Networks AG Telefon: +49 201 5454-2982