Skip to content

Commit 63743d8

Browse files
xiaoguangwuEddie Dong
authored andcommitted
DM USB: xHCI: WA for an isochronous crash issue
The current xHCI mediator doesn't well support disable endpoint command. This patch is one workaround for disable endpoint command to avoid xHCI mediator to continue handle already dropped data. Tracked-On: #2927 Signed-off-by: Xiaoguang Wu <xiaoguang.wu@intel.com> Acked-by: Yu Wang <yu1.wang@intel.com>
1 parent f0e7ce6 commit 63743d8

File tree

3 files changed

+14
-0
lines changed

3 files changed

+14
-0
lines changed

devicemodel/hw/pci/xhci.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1606,6 +1606,7 @@ pci_xhci_init_ep(struct pci_xhci_dev_emu *dev, int epid)
16061606
USB_DATA_XFER_INIT(devep->ep_xfer);
16071607
devep->ep_xfer->dev = (void *)dev;
16081608
devep->ep_xfer->epid = epid;
1609+
devep->ep_xfer->magic = USB_DROPPED_XFER_MAGIC;
16091610
} else
16101611
return -1;
16111612
}
@@ -1631,6 +1632,7 @@ pci_xhci_disable_ep(struct pci_xhci_dev_emu *dev, int epid)
16311632
free(devep->ep_sctx_trbs);
16321633

16331634
if (devep->ep_xfer != NULL) {
1635+
memset(devep->ep_xfer, 0, sizeof(*devep->ep_xfer));
16341636
free(devep->ep_xfer);
16351637
devep->ep_xfer = NULL;
16361638
}

devicemodel/hw/platform/usb_pmapper.c

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,15 @@ usb_dev_comp_req(struct libusb_transfer *libusb_xfer)
190190

191191
/* async transfer */
192192
xfer = req->xfer;
193+
if (xfer->magic != USB_DROPPED_XFER_MAGIC)
194+
/* FIXME: if magic is not what we expected, which means it is
195+
* reset by Disable Endpoint command, hence this xfer from
196+
* callback function should be discarded. This is a workaround
197+
* and a formal implementation for Disable Endpoint command
198+
* will replace this WA.
199+
*/
200+
goto out;
201+
193202
assert(xfer);
194203
assert(xfer->dev);
195204

devicemodel/include/usb_core.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,7 @@ struct usb_data_xfer_block {
160160
};
161161

162162
struct usb_data_xfer {
163+
uint64_t magic;
163164
struct usb_data_xfer_block data[USB_MAX_XFER_BLOCKS];
164165
struct usb_device_request *ureq; /* setup ctl request */
165166
int ndata; /* # of data items */
@@ -242,6 +243,8 @@ enum USB_ERRCODE {
242243
#define USB_NATIVE_NUM_PORT 20
243244
#define USB_NATIVE_NUM_BUS 4
244245

246+
#define USB_DROPPED_XFER_MAGIC 0xaaaaaaaa55555555
247+
245248
extern int usb_log_level;
246249
static inline int usb_get_log_level(void) { return usb_log_level; }
247250
static inline void usb_set_log_level(int level) { usb_log_level = level; }

0 commit comments

Comments
 (0)