xhci: trace: transfers

Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
This commit is contained in:
Gerd Hoffmann 2012-05-11 14:27:08 +02:00
parent c1f6b49326
commit 97df650bb9
2 changed files with 16 additions and 8 deletions

View File

@ -1402,12 +1402,14 @@ static int xhci_setup_packet(XHCITransfer *xfer, USBDevice *dev)
static int xhci_complete_packet(XHCITransfer *xfer, int ret) static int xhci_complete_packet(XHCITransfer *xfer, int ret)
{ {
if (ret == USB_RET_ASYNC) { if (ret == USB_RET_ASYNC) {
trace_usb_xhci_xfer_async(xfer);
xfer->running_async = 1; xfer->running_async = 1;
xfer->running_retry = 0; xfer->running_retry = 0;
xfer->complete = 0; xfer->complete = 0;
xfer->cancelled = 0; xfer->cancelled = 0;
return 0; return 0;
} else if (ret == USB_RET_NAK) { } else if (ret == USB_RET_NAK) {
trace_usb_xhci_xfer_nak(xfer);
xfer->running_async = 0; xfer->running_async = 0;
xfer->running_retry = 1; xfer->running_retry = 1;
xfer->complete = 0; xfer->complete = 0;
@ -1422,10 +1424,12 @@ static int xhci_complete_packet(XHCITransfer *xfer, int ret)
if (ret >= 0) { if (ret >= 0) {
xfer->status = CC_SUCCESS; xfer->status = CC_SUCCESS;
xhci_xfer_data(xfer, xfer->data, ret, xfer->in_xfer, 0, 1); xhci_xfer_data(xfer, xfer->data, ret, xfer->in_xfer, 0, 1);
trace_usb_xhci_xfer_success(xfer, ret);
return 0; return 0;
} }
/* error */ /* error */
trace_usb_xhci_xfer_error(xfer, ret);
switch (ret) { switch (ret) {
case USB_RET_NODEV: case USB_RET_NODEV:
xfer->status = CC_USB_TRANSACTION_ERROR; xfer->status = CC_USB_TRANSACTION_ERROR;
@ -1461,11 +1465,12 @@ static int xhci_fire_ctl_transfer(XHCIState *xhci, XHCITransfer *xfer)
USBDevice *dev; USBDevice *dev;
int ret; int ret;
DPRINTF("xhci_fire_ctl_transfer(slot=%d)\n", xfer->slotid);
trb_setup = &xfer->trbs[0]; trb_setup = &xfer->trbs[0];
trb_status = &xfer->trbs[xfer->trb_count-1]; trb_status = &xfer->trbs[xfer->trb_count-1];
trace_usb_xhci_xfer_start(xfer, xfer->slotid, xfer->epid,
trb_setup->parameter >> 48);
/* at most one Event Data TRB allowed after STATUS */ /* at most one Event Data TRB allowed after STATUS */
if (TRB_TYPE(*trb_status) == TR_EVDATA && xfer->trb_count > 2) { if (TRB_TYPE(*trb_status) == TR_EVDATA && xfer->trb_count > 2) {
trb_status--; trb_status--;
@ -1606,15 +1611,14 @@ static int xhci_fire_transfer(XHCIState *xhci, XHCITransfer *xfer, XHCIEPContext
unsigned int length = 0; unsigned int length = 0;
XHCITRB *trb; XHCITRB *trb;
DPRINTF("xhci_fire_transfer(slotid=%d,epid=%d)\n", xfer->slotid, xfer->epid);
for (i = 0; i < xfer->trb_count; i++) { for (i = 0; i < xfer->trb_count; i++) {
trb = &xfer->trbs[i]; trb = &xfer->trbs[i];
if (TRB_TYPE(*trb) == TR_NORMAL || TRB_TYPE(*trb) == TR_ISOCH) { if (TRB_TYPE(*trb) == TR_NORMAL || TRB_TYPE(*trb) == TR_ISOCH) {
length += trb->status & 0x1ffff; length += trb->status & 0x1ffff;
} }
} }
DPRINTF("xhci: total TD length=%d\n", length);
trace_usb_xhci_xfer_start(xfer, xfer->slotid, xfer->epid, length);
if (!epctx->has_bg) { if (!epctx->has_bg) {
xfer->data_length = length; xfer->data_length = length;
@ -1670,15 +1674,13 @@ static void xhci_kick_ep(XHCIState *xhci, unsigned int slotid, unsigned int epid
XHCITransfer *xfer = epctx->retry; XHCITransfer *xfer = epctx->retry;
int result; int result;
DPRINTF("xhci: retry nack'ed transfer ...\n"); trace_usb_xhci_xfer_retry(xfer);
assert(xfer->running_retry); assert(xfer->running_retry);
xhci_setup_packet(xfer, xfer->packet.ep->dev); xhci_setup_packet(xfer, xfer->packet.ep->dev);
result = usb_handle_packet(xfer->packet.ep->dev, &xfer->packet); result = usb_handle_packet(xfer->packet.ep->dev, &xfer->packet);
if (result == USB_RET_NAK) { if (result == USB_RET_NAK) {
DPRINTF("xhci: ... xfer still nacked\n");
return; return;
} }
DPRINTF("xhci: ... result %d\n", result);
xhci_complete_packet(xfer, result); xhci_complete_packet(xfer, result);
assert(!xfer->running_retry); assert(!xfer->running_retry);
epctx->retry = NULL; epctx->retry = NULL;

View File

@ -311,6 +311,12 @@ usb_xhci_ep_disable(uint32_t slotid, uint32_t epid) "slotid %d, epid %d"
usb_xhci_ep_kick(uint32_t slotid, uint32_t epid) "slotid %d, epid %d" usb_xhci_ep_kick(uint32_t slotid, uint32_t epid) "slotid %d, epid %d"
usb_xhci_ep_stop(uint32_t slotid, uint32_t epid) "slotid %d, epid %d" usb_xhci_ep_stop(uint32_t slotid, uint32_t epid) "slotid %d, epid %d"
usb_xhci_ep_reset(uint32_t slotid, uint32_t epid) "slotid %d, epid %d" usb_xhci_ep_reset(uint32_t slotid, uint32_t epid) "slotid %d, epid %d"
usb_xhci_xfer_start(void *xfer, uint32_t slotid, uint32_t epid, uint32_t length) "%p: slotid %d, epid %d, length %d"
usb_xhci_xfer_async(void *xfer) "%p"
usb_xhci_xfer_nak(void *xfer) "%p"
usb_xhci_xfer_retry(void *xfer) "%p"
usb_xhci_xfer_success(void *xfer, uint32_t bytes) "%p: len %d"
usb_xhci_xfer_error(void *xfer, uint32_t ret) "%p: ret %d"
# hw/usb/desc.c # hw/usb/desc.c
usb_desc_device(int addr, int len, int ret) "dev %d query device, len %d, ret %d" usb_desc_device(int addr, int len, int ret) "dev %d query device, len %d, ret %d"