Current design cannot get physical USB device information without the creation of pci_xhci_dev_emu. This brings some dificulties in certain situations, hence struct usb_native_devinfo is introduced to describe neccessary information to solve this trouble.
Signed-off-by: Xiaoguang Wu <xiaoguang.wu@...> Reviewed-by: Liang Yang <liang3.yang@...> --- devicemodel/hw/pci/xhci.c | 31 ++++++++++++------------------- devicemodel/hw/platform/usb_pmapper.c | 14 +++++++++++++- devicemodel/include/usb_core.h | 10 ++++++++++ 3 files changed, 35 insertions(+), 20 deletions(-)
diff --git a/devicemodel/hw/pci/xhci.c b/devicemodel/hw/pci/xhci.c index 490219a..f12126b 100644 --- a/devicemodel/hw/pci/xhci.c +++ b/devicemodel/hw/pci/xhci.c @@ -469,23 +469,22 @@ pci_xhci_native_usb_dev_conn_cb(void *hci_data, void *dev_data) struct pci_xhci_dev_emu *de; struct pci_xhci_vdev *xdev; struct usb_devemu *ue; + struct usb_native_devinfo *di; int port_start, port_end; int slot_start, slot_end; int port, slot; void *ud; - uint8_t native_bus, native_pid, native_port; - uint16_t native_vid; - int native_speed; int intr = 1; xdev = hci_data; + di = dev_data; assert(xdev); assert(dev_data); assert(xdev->devices); assert(xdev->slots); - de = pci_xhci_dev_create(xdev, dev_data); + de = pci_xhci_dev_create(xdev, di->priv_data); if (!de) { UPRINTF(LFTL, "fail to create device\r\n"); return -1; @@ -499,26 +498,20 @@ pci_xhci_native_usb_dev_conn_cb(void *hci_data, void *dev_data) assert(ue); /* print physical information about new device */ - ue->ue_info(ud, USB_INFO_BUS, &native_bus, sizeof(native_bus)); - ue->ue_info(ud, USB_INFO_PORT, &native_port, sizeof(native_port)); - ue->ue_info(ud, USB_INFO_VID, &native_vid, sizeof(native_vid)); - ue->ue_info(ud, USB_INFO_PID, &native_pid, sizeof(native_pid)); - ue->ue_info(ud, USB_INFO_SPEED, &native_speed, sizeof(native_speed)); UPRINTF(LDBG, "%04x:%04x %d-%d connecting.\r\n", - native_vid, native_pid, native_bus, native_port); + di->vid, di->pid, di->bus, di->port); - if (!xdev->native_assign_ports[native_bus] || - !xdev->native_assign_ports[native_bus][native_port]) { + if (!xdev->native_assign_ports[di->bus] || + !xdev->native_assign_ports[di->bus][di->port]) { UPRINTF(LDBG, "%04x:%04x %d-%d doesn't belong to this vm, bye." - "\r\n", native_vid, native_pid, native_bus, - native_port); + "\r\n", di->vid, di->pid, di->bus, di->port); goto errout; } - UPRINTF(LDBG, "%04x:%04x %d-%d belong to this vm.\r\n", native_vid, - native_pid, native_bus, native_port); + UPRINTF(LDBG, "%04x:%04x %d-%d belong to this vm.\r\n", di->vid, + di->pid, di->bus, di->port); - if (ue->ue_usbver == 2) + if (di->bcd < 0x300) port_start = xdev->usb2_port_start; else port_start = xdev->usb3_port_start; @@ -550,11 +543,11 @@ pci_xhci_native_usb_dev_conn_cb(void *hci_data, void *dev_data) pci_xhci_reset_slot(xdev, slot); UPRINTF(LDBG, "%X:%X %d-%d locates in slot %d port %d.\r\n", - native_vid, native_pid, native_bus, native_port, + di->vid, di->pid, di->bus, di->port, slot, port); /* Trigger port change event for the arriving device */ - if (pci_xhci_port_connect(xdev, port, native_speed, intr)) + if (pci_xhci_port_connect(xdev, port, di->speed, intr)) UPRINTF(LFTL, "fail to report port event\n"); return 0; diff --git a/devicemodel/hw/platform/usb_pmapper.c b/devicemodel/hw/platform/usb_pmapper.c index 9f57f1c..a9c8608 100644 --- a/devicemodel/hw/platform/usb_pmapper.c +++ b/devicemodel/hw/platform/usb_pmapper.c @@ -1020,6 +1020,9 @@ static int usb_dev_native_sys_conn_cb(struct libusb_context *ctx, struct libusb_device *ldev, libusb_hotplug_event event, void *pdata) { + struct libusb_device_descriptor d; + struct usb_native_devinfo di; + UPRINTF(LDBG, "connect event\r\n"); if (!ctx || !ldev) { @@ -1027,8 +1030,17 @@ usb_dev_native_sys_conn_cb(struct libusb_context *ctx, struct libusb_device return -1; } + libusb_get_device_descriptor(ldev, &d); + di.bus = libusb_get_bus_number(ldev); + di.speed = libusb_get_device_speed(ldev); + di.port = libusb_get_port_number(ldev); + di.pid = d.idProduct; + di.vid = d.idVendor; + di.bcd = d.bcdUSB; + di.priv_data = ldev; + if (g_ctx.conn_cb) - g_ctx.conn_cb(g_ctx.hci_data, ldev); + g_ctx.conn_cb(g_ctx.hci_data, &di); return 0; } diff --git a/devicemodel/include/usb_core.h b/devicemodel/include/usb_core.h index 3a9648a..8727b8b 100644 --- a/devicemodel/include/usb_core.h +++ b/devicemodel/include/usb_core.h @@ -163,6 +163,16 @@ struct usb_data_xfer { pthread_mutex_t mtx; }; +struct usb_native_devinfo { + int speed; + uint8_t bus; + uint8_t port; + uint16_t bcd; + uint16_t pid; + uint16_t vid; + void *priv_data; +}; + enum USB_ERRCODE { USB_ACK, USB_NAK, -- 2.7.4
|
|
On 18-08-13 16:48:32, Wu, Xiaoguang wrote: Current design cannot get physical USB device information without the creation of pci_xhci_dev_emu. This brings some dificulties in dificulties? certain situations, hence struct usb_native_devinfo is introduced to describe neccessary information to solve this trouble.
Signed-off-by: Xiaoguang Wu <xiaoguang.wu@...> Reviewed-by: Liang Yang <liang3.yang@...> --- devicemodel/hw/pci/xhci.c | 31 ++++++++++++------------------- devicemodel/hw/platform/usb_pmapper.c | 14 +++++++++++++- devicemodel/include/usb_core.h | 10 ++++++++++ 3 files changed, 35 insertions(+), 20 deletions(-)
diff --git a/devicemodel/hw/pci/xhci.c b/devicemodel/hw/pci/xhci.c index 490219a..f12126b 100644 --- a/devicemodel/hw/pci/xhci.c +++ b/devicemodel/hw/pci/xhci.c @@ -469,23 +469,22 @@ pci_xhci_native_usb_dev_conn_cb(void *hci_data, void *dev_data) struct pci_xhci_dev_emu *de; struct pci_xhci_vdev *xdev; struct usb_devemu *ue; + struct usb_native_devinfo *di; int port_start, port_end; int slot_start, slot_end; int port, slot; void *ud; - uint8_t native_bus, native_pid, native_port; - uint16_t native_vid; - int native_speed; int intr = 1; xdev = hci_data; + di = dev_data; assert(xdev); assert(dev_data); assert(xdev->devices); assert(xdev->slots); - de = pci_xhci_dev_create(xdev, dev_data); + de = pci_xhci_dev_create(xdev, di->priv_data); if (!de) { UPRINTF(LFTL, "fail to create device\r\n"); return -1; @@ -499,26 +498,20 @@ pci_xhci_native_usb_dev_conn_cb(void *hci_data, void *dev_data) assert(ue); /* print physical information about new device */ - ue->ue_info(ud, USB_INFO_BUS, &native_bus, sizeof(native_bus)); - ue->ue_info(ud, USB_INFO_PORT, &native_port, sizeof(native_port)); - ue->ue_info(ud, USB_INFO_VID, &native_vid, sizeof(native_vid)); - ue->ue_info(ud, USB_INFO_PID, &native_pid, sizeof(native_pid)); - ue->ue_info(ud, USB_INFO_SPEED, &native_speed, sizeof(native_speed)); Then usb_dev_info is not useful now? Should we clear it? UPRINTF(LDBG, "%04x:%04x %d-%d connecting.\r\n", - native_vid, native_pid, native_bus, native_port); + di->vid, di->pid, di->bus, di->port); - if (!xdev->native_assign_ports[native_bus] || - !xdev->native_assign_ports[native_bus][native_port]) { + if (!xdev->native_assign_ports[di->bus] || + !xdev->native_assign_ports[di->bus][di->port]) { UPRINTF(LDBG, "%04x:%04x %d-%d doesn't belong to this vm, bye." - "\r\n", native_vid, native_pid, native_bus, - native_port); + "\r\n", di->vid, di->pid, di->bus, di->port); goto errout; } - UPRINTF(LDBG, "%04x:%04x %d-%d belong to this vm.\r\n", native_vid, - native_pid, native_bus, native_port); + UPRINTF(LDBG, "%04x:%04x %d-%d belong to this vm.\r\n", di->vid, + di->pid, di->bus, di->port); - if (ue->ue_usbver == 2) + if (di->bcd < 0x300) port_start = xdev->usb2_port_start; else port_start = xdev->usb3_port_start; @@ -550,11 +543,11 @@ pci_xhci_native_usb_dev_conn_cb(void *hci_data, void *dev_data) pci_xhci_reset_slot(xdev, slot); UPRINTF(LDBG, "%X:%X %d-%d locates in slot %d port %d.\r\n", - native_vid, native_pid, native_bus, native_port, + di->vid, di->pid, di->bus, di->port, slot, port); /* Trigger port change event for the arriving device */ - if (pci_xhci_port_connect(xdev, port, native_speed, intr)) + if (pci_xhci_port_connect(xdev, port, di->speed, intr)) UPRINTF(LFTL, "fail to report port event\n"); return 0; diff --git a/devicemodel/hw/platform/usb_pmapper.c b/devicemodel/hw/platform/usb_pmapper.c index 9f57f1c..a9c8608 100644 --- a/devicemodel/hw/platform/usb_pmapper.c +++ b/devicemodel/hw/platform/usb_pmapper.c @@ -1020,6 +1020,9 @@ static int usb_dev_native_sys_conn_cb(struct libusb_context *ctx, struct libusb_device *ldev, libusb_hotplug_event event, void *pdata) { + struct libusb_device_descriptor d; + struct usb_native_devinfo di; + UPRINTF(LDBG, "connect event\r\n"); if (!ctx || !ldev) { @@ -1027,8 +1030,17 @@ usb_dev_native_sys_conn_cb(struct libusb_context *ctx, struct libusb_device return -1; } + libusb_get_device_descriptor(ldev, &d); + di.bus = libusb_get_bus_number(ldev); + di.speed = libusb_get_device_speed(ldev); + di.port = libusb_get_port_number(ldev); + di.pid = d.idProduct; + di.vid = d.idVendor; + di.bcd = d.bcdUSB; + di.priv_data = ldev; + if (g_ctx.conn_cb) - g_ctx.conn_cb(g_ctx.hci_data, ldev); + g_ctx.conn_cb(g_ctx.hci_data, &di); return 0; } diff --git a/devicemodel/include/usb_core.h b/devicemodel/include/usb_core.h index 3a9648a..8727b8b 100644 --- a/devicemodel/include/usb_core.h +++ b/devicemodel/include/usb_core.h @@ -163,6 +163,16 @@ struct usb_data_xfer { pthread_mutex_t mtx; }; +struct usb_native_devinfo { + int speed; + uint8_t bus; + uint8_t port; + uint16_t bcd; + uint16_t pid; + uint16_t vid; + void *priv_data; +}; This new structure is confused to me. There has already one structure struct usb_dev which included native usb device information. Why define a new one? Should we refine the struct usb_dev to replace these native description members? + enum USB_ERRCODE { USB_ACK, USB_NAK, -- 2.7.4
|
|
On 18-08-13 21:37:26, Yu Wang wrote: On 18-08-13 16:48:32, Wu, Xiaoguang wrote:
Current design cannot get physical USB device information without the creation of pci_xhci_dev_emu. This brings some dificulties in dificulties? xgwu: will change, thanks.
certain situations, hence struct usb_native_devinfo is introduced to describe neccessary information to solve this trouble.
Signed-off-by: Xiaoguang Wu <xiaoguang.wu@...> Reviewed-by: Liang Yang <liang3.yang@...> --- devicemodel/hw/pci/xhci.c | 31 ++++++++++++------------------- devicemodel/hw/platform/usb_pmapper.c | 14 +++++++++++++- devicemodel/include/usb_core.h | 10 ++++++++++ 3 files changed, 35 insertions(+), 20 deletions(-)
diff --git a/devicemodel/hw/pci/xhci.c b/devicemodel/hw/pci/xhci.c index 490219a..f12126b 100644 --- a/devicemodel/hw/pci/xhci.c +++ b/devicemodel/hw/pci/xhci.c @@ -469,23 +469,22 @@ pci_xhci_native_usb_dev_conn_cb(void *hci_data, void *dev_data) struct pci_xhci_dev_emu *de; struct pci_xhci_vdev *xdev; struct usb_devemu *ue; + struct usb_native_devinfo *di; int port_start, port_end; int slot_start, slot_end; int port, slot; void *ud; - uint8_t native_bus, native_pid, native_port; - uint16_t native_vid; - int native_speed; int intr = 1; xdev = hci_data; + di = dev_data; assert(xdev); assert(dev_data); assert(xdev->devices); assert(xdev->slots); - de = pci_xhci_dev_create(xdev, dev_data); + de = pci_xhci_dev_create(xdev, di->priv_data); if (!de) { UPRINTF(LFTL, "fail to create device\r\n"); return -1; @@ -499,26 +498,20 @@ pci_xhci_native_usb_dev_conn_cb(void *hci_data, void *dev_data) assert(ue); /* print physical information about new device */ - ue->ue_info(ud, USB_INFO_BUS, &native_bus, sizeof(native_bus)); - ue->ue_info(ud, USB_INFO_PORT, &native_port, sizeof(native_port)); - ue->ue_info(ud, USB_INFO_VID, &native_vid, sizeof(native_vid)); - ue->ue_info(ud, USB_INFO_PID, &native_pid, sizeof(native_pid)); - ue->ue_info(ud, USB_INFO_SPEED, &native_speed, sizeof(native_speed)); Then usb_dev_info is not useful now? Should we clear it?
xgwu: try to change, thanks.
UPRINTF(LDBG, "%04x:%04x %d-%d connecting.\r\n", - native_vid, native_pid, native_bus, native_port); + di->vid, di->pid, di->bus, di->port); - if (!xdev->native_assign_ports[native_bus] || - !xdev->native_assign_ports[native_bus][native_port]) { + if (!xdev->native_assign_ports[di->bus] || + !xdev->native_assign_ports[di->bus][di->port]) { UPRINTF(LDBG, "%04x:%04x %d-%d doesn't belong to this vm, bye." - "\r\n", native_vid, native_pid, native_bus, - native_port); + "\r\n", di->vid, di->pid, di->bus, di->port); goto errout; } - UPRINTF(LDBG, "%04x:%04x %d-%d belong to this vm.\r\n", native_vid, - native_pid, native_bus, native_port); + UPRINTF(LDBG, "%04x:%04x %d-%d belong to this vm.\r\n", di->vid, + di->pid, di->bus, di->port); - if (ue->ue_usbver == 2) + if (di->bcd < 0x300) port_start = xdev->usb2_port_start; else port_start = xdev->usb3_port_start; @@ -550,11 +543,11 @@ pci_xhci_native_usb_dev_conn_cb(void *hci_data, void *dev_data) pci_xhci_reset_slot(xdev, slot); UPRINTF(LDBG, "%X:%X %d-%d locates in slot %d port %d.\r\n", - native_vid, native_pid, native_bus, native_port, + di->vid, di->pid, di->bus, di->port, slot, port); /* Trigger port change event for the arriving device */ - if (pci_xhci_port_connect(xdev, port, native_speed, intr)) + if (pci_xhci_port_connect(xdev, port, di->speed, intr)) UPRINTF(LFTL, "fail to report port event\n"); return 0; diff --git a/devicemodel/hw/platform/usb_pmapper.c b/devicemodel/hw/platform/usb_pmapper.c index 9f57f1c..a9c8608 100644 --- a/devicemodel/hw/platform/usb_pmapper.c +++ b/devicemodel/hw/platform/usb_pmapper.c @@ -1020,6 +1020,9 @@ static int usb_dev_native_sys_conn_cb(struct libusb_context *ctx, struct libusb_device *ldev, libusb_hotplug_event event, void *pdata) { + struct libusb_device_descriptor d; + struct usb_native_devinfo di; + UPRINTF(LDBG, "connect event\r\n"); if (!ctx || !ldev) { @@ -1027,8 +1030,17 @@ usb_dev_native_sys_conn_cb(struct libusb_context *ctx, struct libusb_device return -1; } + libusb_get_device_descriptor(ldev, &d); + di.bus = libusb_get_bus_number(ldev); + di.speed = libusb_get_device_speed(ldev); + di.port = libusb_get_port_number(ldev); + di.pid = d.idProduct; + di.vid = d.idVendor; + di.bcd = d.bcdUSB; + di.priv_data = ldev; + if (g_ctx.conn_cb) - g_ctx.conn_cb(g_ctx.hci_data, ldev); + g_ctx.conn_cb(g_ctx.hci_data, &di); return 0; } diff --git a/devicemodel/include/usb_core.h b/devicemodel/include/usb_core.h index 3a9648a..8727b8b 100644 --- a/devicemodel/include/usb_core.h +++ b/devicemodel/include/usb_core.h @@ -163,6 +163,16 @@ struct usb_data_xfer { pthread_mutex_t mtx; }; +struct usb_native_devinfo { + int speed; + uint8_t bus; + uint8_t port; + uint16_t bcd; + uint16_t pid; + uint16_t vid; + void *priv_data; +}; This new structure is confused to me. There has already one structure struct usb_dev which included native usb device information. Why define a new one? Should we refine the struct usb_dev to replace these native description members?
xgwu: try to merge them as one.thanks.
+ enum USB_ERRCODE { USB_ACK, USB_NAK, -- 2.7.4
|
|