SAMA5: Add tracing support to the OHCI driver

This commit is contained in:
Gregory Nutt 2013-09-10 16:01:44 -06:00
parent 92aa5785bf
commit 9f3e2e3bec
3 changed files with 171 additions and 52 deletions

View File

@ -54,6 +54,7 @@
#include <nuttx/usb/usb.h> #include <nuttx/usb/usb.h>
#include <nuttx/usb/ohci.h> #include <nuttx/usb/ohci.h>
#include <nuttx/usb/usbhost.h> #include <nuttx/usb/usbhost.h>
#include <nuttx/usb/usbhost_trace.h>
#include <arch/irq.h> #include <arch/irq.h>
@ -1003,7 +1004,7 @@ static inline int sam_addinted(const FAR struct usbhost_epdesc_s *epdesc,
interval = sam_getinterval(epdesc->interval); interval = sam_getinterval(epdesc->interval);
ed->interval = interval; ed->interval = interval;
uvdbg("interval: %d->%d\n", epdesc->interval, interval); usbhost_vtrace2(OHCI_VTRACE2_INTERVAL, epdesc->interval, interval);
/* Get the offset associated with the ED direction. IN EDs get the even /* Get the offset associated with the ED direction. IN EDs get the even
* entries, OUT EDs get the odd entries. * entries, OUT EDs get the odd entries.
@ -1037,7 +1038,7 @@ static inline int sam_addinted(const FAR struct usbhost_epdesc_s *epdesc,
} }
} }
uvdbg("Min interval: %d offset: %d\n", interval, offset); usbhost_vtrace2(OHCI_VTRACE2_MININTERVAL, interval, offset);
/* Get the (physical) head of the first of the duplicated entries. The /* Get the (physical) head of the first of the duplicated entries. The
* first offset entry is always guaranteed to contain the common ED list * first offset entry is always guaranteed to contain the common ED list
@ -1062,7 +1063,7 @@ static inline int sam_addinted(const FAR struct usbhost_epdesc_s *epdesc,
physed = sam_physramaddr((uintptr_t)ed); physed = sam_physramaddr((uintptr_t)ed);
sam_setinttab((uint32_t)physed, interval, offset); sam_setinttab((uint32_t)physed, interval, offset);
uvdbg("head: %08x next: %08x\n", physed, physhead); usbhost_vtrace1(OHCI_VTRACE1_PHYSED, physed);
/* Re-enable periodic list processing */ /* Re-enable periodic list processing */
@ -1138,8 +1139,12 @@ static inline int sam_reminted(struct sam_ed_s *ed)
physhead = g_hcca.inttbl[offset]; physhead = g_hcca.inttbl[offset];
head = (struct sam_ed_s *)sam_virtramaddr((uintptr_t)physhead); head = (struct sam_ed_s *)sam_virtramaddr((uintptr_t)physhead);
#ifdef CONFIG_USBHOST_TRACE
usbhost_vtrace1(OHCI_VTRACE1_VIRTED, (uintptr_t)ed);
#else
uvdbg("ed: %08x head: %08x next: %08x offset: %d\n", uvdbg("ed: %08x head: %08x next: %08x offset: %d\n",
ed, physhead, head ? head->hw.nexted : 0, offset); ed, physhead, head ? head->hw.nexted : 0, offset);
#endif
/* Find the ED to be removed in the ED list */ /* Find the ED to be removed in the ED list */
@ -1174,8 +1179,12 @@ static inline int sam_reminted(struct sam_ed_s *ed)
prev->hw.nexted = ed->hw.nexted; prev->hw.nexted = ed->hw.nexted;
} }
#ifdef CONFIG_USBHOST_TRACE
usbhost_vtrace1(OHCI_VTRACE1_VIRTED, (uintptr_t)ed);
#else
uvdbg("ed: %08x head: %08x next: %08x\n", uvdbg("ed: %08x head: %08x next: %08x\n",
ed, physhead, head ? head->hw.nexted : 0); ed, physhead, head ? head->hw.nexted : 0);
#endif
/* Calculate the new minimum interval for this list */ /* Calculate the new minimum interval for this list */
@ -1188,7 +1197,7 @@ static inline int sam_reminted(struct sam_ed_s *ed)
} }
} }
uvdbg("Min interval: %d offset: %d\n", interval, offset); usbhost_vtrace2(OHCI_VTRACE2_MININTERVAL, interval, offset);
/* Save the new minimum interval */ /* Save the new minimum interval */
@ -1630,7 +1639,7 @@ static int sam_ctrltd(struct sam_rhport_s *rhport, uint32_t dirpid,
ret = sam_wdhwait(rhport, edctrl); ret = sam_wdhwait(rhport, edctrl);
if (ret != OK) if (ret != OK)
{ {
udbg("ERROR: Device disconnected\n"); usbhost_trace1(OHCI_TRACE1_DEVDISCONN, rhport->rhpndx + 1);
return ret; return ret;
} }
@ -1698,7 +1707,8 @@ static int sam_ctrltd(struct sam_rhport_s *rhport, uint32_t dirpid,
} }
else else
{ {
udbg("ERROR: Bad TD completion status: %d\n", edctrl->tdstatus); usbhost_trace2(OHCI_TRACE2_BADTDSTATUS, rhport->rhpndx + 1,
edctrl->tdstatus);
ret = -EIO; ret = -EIO;
} }
} }
@ -1733,12 +1743,12 @@ static void sam_rhsc_bottomhalf(void)
regaddr = SAM_USBHOST_RHPORTST(rhpndx+1); regaddr = SAM_USBHOST_RHPORTST(rhpndx+1);
rhportst = sam_getreg(regaddr); rhportst = sam_getreg(regaddr);
uvdbg("RHPORTST%d: %08x\n", rhpndx + 1, rhportst); usbhost_vtrace2(OHCI_VTRACE2_RHPORTST, rhpndx + 1, (uint16_t)rhportst);
if ((rhportst & OHCI_RHPORTST_CSC) != 0) if ((rhportst & OHCI_RHPORTST_CSC) != 0)
{ {
uint32_t rhstatus = sam_getreg(SAM_USBHOST_RHSTATUS); uint32_t rhstatus = sam_getreg(SAM_USBHOST_RHSTATUS);
uvdbg("Connect Status Change, RHSTATUS: %08x\n", rhstatus); usbhost_vtrace1(OHCI_VTRACE1_CSC, rhstatus);
/* If DRWE is set, Connect Status Change indicates a remote /* If DRWE is set, Connect Status Change indicates a remote
* wake-up event * wake-up event
@ -1746,7 +1756,7 @@ static void sam_rhsc_bottomhalf(void)
if (rhstatus & OHCI_RHSTATUS_DRWE) if (rhstatus & OHCI_RHSTATUS_DRWE)
{ {
uvdbg("DRWE: Remote wake-up\n"); usbhost_vtrace1(OHCI_VTRACE1_DRWE, rhstatus);
} }
/* Otherwise... Not a remote wake-up event */ /* Otherwise... Not a remote wake-up event */
@ -1765,8 +1775,8 @@ static void sam_rhsc_bottomhalf(void)
rhport->connected = true; rhport->connected = true;
uvdbg("RHPort%d connected, rhswait: %d\n", usbhost_vtrace2(OHCI_VTRACE2_CONNECTED,
rhpndx + 1, g_ohci.rhswait); rhpndx + 1, g_ohci.rhswait);
/* Notify any waiters */ /* Notify any waiters */
@ -1778,7 +1788,7 @@ static void sam_rhsc_bottomhalf(void)
} }
else else
{ {
uvdbg("Spurious status change (connected)\n"); usbhost_vtrace1(OHCI_VTRACE1_ALREADYCONN, rhportst);
} }
/* The LSDA (Low speed device attached) bit is valid /* The LSDA (Low speed device attached) bit is valid
@ -1786,7 +1796,7 @@ static void sam_rhsc_bottomhalf(void)
*/ */
rhport->lowspeed = (rhportst & OHCI_RHPORTST_LSDA) != 0; rhport->lowspeed = (rhportst & OHCI_RHPORTST_LSDA) != 0;
uvdbg("Speed: %s\n", rhport->lowspeed ? "LOW" : "FULL"); usbhost_vtrace1(OHCI_VTRACE1_SPEED, rhport->lowspeed);
} }
/* Check if we are now disconnected */ /* Check if we are now disconnected */
@ -1795,7 +1805,9 @@ static void sam_rhsc_bottomhalf(void)
{ {
/* Yes.. disconnect the device */ /* Yes.. disconnect the device */
uvdbg("RHport%d disconnected\n", rhpndx+1); usbhost_vtrace2(OHCI_VTRACE2_DISCONNECTED,
rhpndx + 1, g_ohci.rhswait);
rhport->connected = false; rhport->connected = false;
rhport->lowspeed = false; rhport->lowspeed = false;
@ -1821,7 +1833,7 @@ static void sam_rhsc_bottomhalf(void)
} }
else else
{ {
uvdbg("Spurious status change (disconnected)\n"); usbhost_vtrace1(OHCI_VTRACE1_ALREADYDISCONN, rhportst);
} }
} }
@ -1903,7 +1915,7 @@ static void sam_wdh_bottomhalf(void)
eplist = ed->eplist; eplist = ed->eplist;
DEBUGASSERT(eplist != NULL); DEBUGASSERT(eplist != NULL);
/* Also nvalidate the control ED so that it two will be re-read from /* Also invalidate the control ED so that it two will be re-read from
* memory. * memory.
*/ */
@ -1916,13 +1928,12 @@ static void sam_wdh_bottomhalf(void)
ed->tdstatus = (td->hw.ctrl & GTD_STATUS_CC_MASK) >> GTD_STATUS_CC_SHIFT; ed->tdstatus = (td->hw.ctrl & GTD_STATUS_CC_MASK) >> GTD_STATUS_CC_SHIFT;
#ifdef CONFIG_DEBUG_USB #if defined(CONFIG_DEBUG_USB) || defined(CONFIG_USBHOST_TRACE)
if (ed->tdstatus != TD_CC_NOERROR) if (ed->tdstatus != TD_CC_NOERROR)
{ {
/* The transfer failed for some reason... dump some diagnostic info. */ /* The transfer failed for some reason... dump some diagnostic info. */
udbg("ERROR: ED xfrtype: %d TD CTRL: %08x/CC: %d\n", usbhost_trace2(OHCI_TRACE2_WHDTDSTATUS, ed->tdstatus, ed->xfrtype);
ed->xfrtype, td->hw.ctrl, ed->tdstatus);
} }
#endif #endif
@ -1970,7 +1981,7 @@ static void sam_ohci_bottomhalf(void *arg)
{ {
/* Handle root hub status change on each root port */ /* Handle root hub status change on each root port */
uvdbg("Root Hub Status Change\n"); usbhost_vtrace1(OHCI_VTRACE1_RHSC, pending);
sam_rhsc_bottomhalf(); sam_rhsc_bottomhalf();
} }
@ -1983,7 +1994,7 @@ static void sam_ohci_bottomhalf(void *arg)
* in the preceding frame. * in the preceding frame.
*/ */
uvdbg("Writeback Done Head interrupt\n"); usbhost_vtrace1(OHCI_VTRACE1_WDHINTR, pending);
sam_wdh_bottomhalf(); sam_wdh_bottomhalf();
} }
@ -2002,12 +2013,12 @@ static void sam_ohci_bottomhalf(void *arg)
* interrupt will not be occurring). * interrupt will not be occurring).
*/ */
udbg("ERROR: Unrecoverable error. pending: %08x\n", pending); usbhost_trace1(OHCI_TRACE1_INTRUNRECOVERABLE, pending);
sam_wdh_bottomhalf(); sam_wdh_bottomhalf();
} }
else else
{ {
udbg("ERROR: Unhandled interrupts pending: %08x\n", pending); usbhost_trace1(OHCI_TRACE1_INTRUNHANDLED, pending);
} }
} }
#endif #endif
@ -2090,10 +2101,8 @@ static int sam_wait(FAR struct usbhost_connection_s *conn,
*/ */
irqrestore(flags); irqrestore(flags);
usbhost_vtrace2(OHCI_VTRACE2_WAKEUP,
uvdbg("RHPort%d connected: %s\n", rhpndx + 1, g_ohci.rhport[rhpndx].connected);
rhpndx + 1, g_ohci.rhport[rhpndx].connected ? "YES" : "NO");
return rhpndx; return rhpndx;
} }
} }
@ -2153,7 +2162,7 @@ static int sam_enumerate(FAR struct usbhost_connection_s *conn, int rhpndx)
{ {
/* No, return an error */ /* No, return an error */
uvdbg("Not connected\n"); usbhost_vtrace1(OHCI_VTRACE1_ENUMDISCONN, rhport->rhpndx + 1);
return -ENODEV; return -ENODEV;
} }
@ -2164,7 +2173,8 @@ static int sam_enumerate(FAR struct usbhost_connection_s *conn, int rhpndx)
ret = sam_ep0enqueue(rhport); ret = sam_ep0enqueue(rhport);
if (ret < 0) if (ret < 0)
{ {
udbg("ERROR: Failed to enqueue EP0\n"); usbhost_trace2(OHCI_TRACE2_EP0ENQUEUE_FAILED, rhport->rhpndx + 1,
-ret);
return ret; return ret;
} }
@ -2177,7 +2187,9 @@ static int sam_enumerate(FAR struct usbhost_connection_s *conn, int rhpndx)
up_mdelay(100); up_mdelay(100);
/* Put the root hub port in reset (the SAMA5 supports three downstream ports) */ /* Put the root hub port in reset (the SAMA5 supports three downstream
* ports)
*/
regaddr = SAM_USBHOST_RHPORTST(rhpndx+1); regaddr = SAM_USBHOST_RHPORTST(rhpndx+1);
sam_putreg(OHCI_RHPORTST_PRS, regaddr); sam_putreg(OHCI_RHPORTST_PRS, regaddr);
@ -2195,8 +2207,14 @@ static int sam_enumerate(FAR struct usbhost_connection_s *conn, int rhpndx)
* FunctionAddress (USB address) is set to the root hub port number for now. * FunctionAddress (USB address) is set to the root hub port number for now.
*/ */
uvdbg("Enumerate the device\n"); usbhost_vtrace2(OHCI_VTRACE2_CLASSENUM, rhpndx+1, rhpndx+1);
return usbhost_enumerate(&g_ohci.rhport[rhpndx].drvr, rhpndx+1, &rhport->class); ret = usbhost_enumerate(&g_ohci.rhport[rhpndx].drvr, rhpndx+1, &rhport->class);
if (ret < 0)
{
usbhost_trace2(OHCI_TRACE2_CLASSENUM_FAILED, rhpndx+1, -ret);
}
return ret;
} }
/************************************************************************************ /************************************************************************************
@ -2261,7 +2279,8 @@ static int sam_ep0configure(FAR struct usbhost_driver_s *drvr, uint8_t funcaddr,
(uintptr_t)edctrl + sizeof(struct ohci_ed_s) - 1); (uintptr_t)edctrl + sizeof(struct ohci_ed_s) - 1);
sam_givesem(&g_ohci.exclsem); sam_givesem(&g_ohci.exclsem);
uvdbg("RHPort%d EP0 CTRL: %08x\n", rhport->rhpndx + 1, edctrl->hw.ctrl); usbhost_vtrace2(OHCI_VTRACE2_EP0CONFIGURE,
rhport->rhpndx + 1, (uint16_t)edctrl->hw.ctrl);
return OK; return OK;
} }
@ -2339,7 +2358,7 @@ static int sam_epalloc(FAR struct usbhost_driver_s *drvr,
eplist = (struct sam_eplist_s *)kzalloc(sizeof(struct sam_eplist_s)); eplist = (struct sam_eplist_s *)kzalloc(sizeof(struct sam_eplist_s));
if (!eplist) if (!eplist)
{ {
udbg("ERROR: Failed to allocate EP list\n"); usbhost_trace1(OHCI_TRACE1_EPLISTALLOC_FAILED, 0);
goto errout; goto errout;
} }
@ -2358,14 +2377,14 @@ static int sam_epalloc(FAR struct usbhost_driver_s *drvr,
ed = sam_edalloc(); ed = sam_edalloc();
if (!ed) if (!ed)
{ {
udbg("ERROR: Failed to allocate ED\n"); usbhost_trace1(OHCI_TRACE1_EDALLOC_FAILED, 0);
goto errout_with_semaphore; goto errout_with_semaphore;
} }
td = sam_tdalloc(); td = sam_tdalloc();
if (!td) if (!td)
{ {
udbg("ERROR: Failed to allocate TD\n"); usbhost_trace1(OHCI_TRACE1_TDALLOC_FAILED, 0);
goto errout_with_ed; goto errout_with_ed;
} }
@ -2413,7 +2432,7 @@ static int sam_epalloc(FAR struct usbhost_driver_s *drvr,
#endif #endif
ed->eplist = eplist; ed->eplist = eplist;
uvdbg("EP%d CTRL: %08x\n", epdesc->addr, ed->hw.ctrl); usbhost_vtrace2(OHCI_VTRACE2_EPALLOC, epdesc->addr, (uint16_t)ed->hw.ctrl);
/* Configure the tail descriptor. */ /* Configure the tail descriptor. */
@ -2461,7 +2480,7 @@ static int sam_epalloc(FAR struct usbhost_driver_s *drvr,
{ {
/* No.. destroy it and report the error */ /* No.. destroy it and report the error */
udbg("ERROR: Failed to queue ED for transfer type: %d\n", ed->xfrtype); usbhost_trace2(OHCI_TRACE2_EDENQUEUE_FAILED, ed->xfrtype, -ret);
goto errout_with_td; goto errout_with_td;
} }
@ -2764,9 +2783,14 @@ static int sam_ctrlin(FAR struct usbhost_driver_s *drvr,
int ret; int ret;
DEBUGASSERT(rhport && req); DEBUGASSERT(rhport && req);
#ifdef CONFIG_USBHOST_TRACE
usbhost_vtrace2(OHCI_VTRACE2_CTRLIN, rhport->rhpndx + 1, req->req);
#else
uvdbg("RHPort%d type: %02x req: %02x value: %02x%02x index: %02x%02x len: %02x%02x\n", uvdbg("RHPort%d type: %02x req: %02x value: %02x%02x index: %02x%02x len: %02x%02x\n",
rhport->rhpndx + 1, req->type, req->req, req->value[1], req->value[0], rhport->rhpndx + 1, req->type, req->req, req->value[1], req->value[0],
req->index[1], req->index[0], req->len[1], req->len[0]); req->index[1], req->index[0], req->len[1], req->len[0]);
#endif
/* We must have exclusive access to EP0 and the control list */ /* We must have exclusive access to EP0 and the control list */
@ -2805,9 +2829,14 @@ static int sam_ctrlout(FAR struct usbhost_driver_s *drvr,
int ret; int ret;
DEBUGASSERT(rhport && req); DEBUGASSERT(rhport && req);
#ifdef CONFIG_USBHOST_TRACE
usbhost_vtrace2(OHCI_VTRACE2_CTRLOUT, rhport->rhpndx + 1, req->req);
#else
uvdbg("RHPort%d type: %02x req: %02x value: %02x%02x index: %02x%02x len: %02x%02x\n", uvdbg("RHPort%d type: %02x req: %02x value: %02x%02x index: %02x%02x len: %02x%02x\n",
rhport->rhpndx + 1, req->type, req->req, req->value[1], req->value[0], rhport->rhpndx + 1, req->type, req->req, req->value[1], req->value[0],
req->index[1], req->index[0], req->len[1], req->len[0]); req->index[1], req->index[0], req->len[1], req->len[0]);
#endif
/* We must have exclusive access to EP0 and the control list */ /* We must have exclusive access to EP0 and the control list */
@ -2887,12 +2916,18 @@ static int sam_transfer(FAR struct usbhost_driver_s *drvr, usbhost_ep_t ep,
ed = eplist->ed; ed = eplist->ed;
in = (ed->hw.ctrl & ED_CONTROL_D_MASK) == ED_CONTROL_D_IN; in = (ed->hw.ctrl & ED_CONTROL_D_MASK) == ED_CONTROL_D_IN;
#ifdef CONFIG_USBHOST_TRACE
usbhost_vtrace2(OHCI_VTRACE2_TRANSFER,
(ed->hw.ctrl & ED_CONTROL_EN_MASK) >> ED_CONTROL_EN_SHIFT,
(uint16_t)buflen);
#else
uvdbg("EP%d %s toggle: %d maxpacket: %d buflen: %d\n", uvdbg("EP%d %s toggle: %d maxpacket: %d buflen: %d\n",
(ed->hw.ctrl & ED_CONTROL_EN_MASK) >> ED_CONTROL_EN_SHIFT, (ed->hw.ctrl & ED_CONTROL_EN_MASK) >> ED_CONTROL_EN_SHIFT,
in ? "IN" : "OUT", in ? "IN" : "OUT",
(ed->hw.headp & ED_HEADP_C) != 0 ? 1 : 0, (ed->hw.headp & ED_HEADP_C) != 0 ? 1 : 0,
(ed->hw.ctrl & ED_CONTROL_MPS_MASK) >> ED_CONTROL_MPS_SHIFT, (ed->hw.ctrl & ED_CONTROL_MPS_MASK) >> ED_CONTROL_MPS_SHIFT,
buflen); buflen);
#endif
/* We must have exclusive access to the endpoint, the TD pool, the I/O buffer /* We must have exclusive access to the endpoint, the TD pool, the I/O buffer
* pool, the bulk and interrupt lists, and the HCCA interrupt table. * pool, the bulk and interrupt lists, and the HCCA interrupt table.
@ -2907,7 +2942,7 @@ static int sam_transfer(FAR struct usbhost_driver_s *drvr, usbhost_ep_t ep,
ret = sam_wdhwait(rhport, ed); ret = sam_wdhwait(rhport, ed);
if (ret != OK) if (ret != OK)
{ {
udbg("ERROR: Device disconnected\n"); usbhost_trace1(OHCI_TRACE1_DEVDISCONN, rhport->rhpndx + 1);
goto errout; goto errout;
} }
@ -2990,7 +3025,8 @@ static int sam_transfer(FAR struct usbhost_driver_s *drvr, usbhost_ep_t ep,
} }
else else
{ {
udbg("ERROR: Bad TD completion status: %d\n", ed->tdstatus); usbhost_trace2(OHCI_TRACE2_BADTDSTATUS, rhport->rhpndx + 1,
ed->tdstatus);
ret = ed->tdstatus == TD_CC_STALL ? -EPERM : -EIO; ret = ed->tdstatus == TD_CC_STALL ? -EPERM : -EIO;
} }
} }
@ -3150,7 +3186,7 @@ FAR struct usbhost_connection_s *sam_ohci_initialize(int controller)
* dedicated function * dedicated function
*/ */
uvdbg("Initializing OHCI Stack\n"); usbhost_vtrace1(OHCI_VTRACE1_INITIALIZING, 0);
/* Initialize all the HCCA to 0 */ /* Initialize all the HCCA to 0 */
@ -3256,7 +3292,7 @@ FAR struct usbhost_connection_s *sam_ohci_initialize(int controller)
if (irq_attach(SAM_IRQ_UHPHS, sam_ohci_tophalf) != 0) if (irq_attach(SAM_IRQ_UHPHS, sam_ohci_tophalf) != 0)
{ {
udbg("ERROR: Failed to attach IRQ\n"); usbhost_trace1(OHCI_TRACE1_IRQATTACH, SAM_IRQ_UHPHS);
return NULL; return NULL;
} }
@ -3290,8 +3326,8 @@ FAR struct usbhost_connection_s *sam_ohci_initialize(int controller)
regval = sam_getreg(SAM_USBHOST_RHPORTST(i)); regval = sam_getreg(SAM_USBHOST_RHPORTST(i));
g_ohci.rhport[i].connected = ((regval & OHCI_RHPORTST_CCS) != 0); g_ohci.rhport[i].connected = ((regval & OHCI_RHPORTST_CCS) != 0);
uvdbg("RHPort%d Device connected: %s\n", usbhost_vtrace2(OHCI_VTRACE2_INITCONNECTED,
i+1, g_ohci.rhport[i].connected ? "YES" : "NO"); i+1, g_ohci.rhport[i].connected);
} }
/* Enable interrupts at the interrupt controller. If ECHI is enabled, /* Enable interrupts at the interrupt controller. If ECHI is enabled,
@ -3302,7 +3338,7 @@ FAR struct usbhost_connection_s *sam_ohci_initialize(int controller)
#endif /* CONFIG_SAMA5_EHCI */ #endif /* CONFIG_SAMA5_EHCI */
uvdbg("USB OHCI Initialized\n"); usbhost_vtrace1(OHCI_VTRACE1_INITIALIZED, 0);
/* Initialize and return the connection interface */ /* Initialize and return the connection interface */
@ -3329,9 +3365,9 @@ int sam_ohci_tophalf(int irq, FAR void *context)
/* Read Interrupt Status and mask out interrupts that are not enabled. */ /* Read Interrupt Status and mask out interrupts that are not enabled. */
intst = sam_getreg(SAM_USBHOST_INTST); intst = sam_getreg(SAM_USBHOST_INTST);
inten = sam_getreg(SAM_USBHOST_INTEN); inten = sam_getreg(SAM_USBHOST_INTEN);
ullvdbg("INST: %08x INTEN: %08x\n", intst, inten); usbhost_vtrace1(OHCI_VTRACE1_INTRPENDING, intst & inten);
#ifdef CONFIG_SAMA5_EHCI #ifdef CONFIG_SAMA5_EHCI
/* Check the Master Interrupt Enable bit (MIE). It this function is called /* Check the Master Interrupt Enable bit (MIE). It this function is called

View File

@ -87,7 +87,28 @@ struct sam_usbhost_trace_s
static const struct sam_usbhost_trace_s g_trace1[TRACE1_NSTRINGS] = static const struct sam_usbhost_trace_s g_trace1[TRACE1_NSTRINGS] =
{ {
#ifdef CONFIG_SAMA5_OHCI #ifdef CONFIG_SAMA5_OHCI
TRENTRY(OHCI_TRACE1_DEVDISCONN, TR_OHCI, TR_FMT1, "OHCI ERROR: RHport%d Device disconnected\n"),
TRENTRY(OHCI_TRACE1_INTRUNRECOVERABLE, TR_OHCI, TR_FMT1, "OHCI ERROR: Unrecoverable error. pending: %06x\n"),
TRENTRY(OHCI_TRACE1_INTRUNHANDLED, TR_OHCI, TR_FMT1, "OHCI ERROR: Unhandled interrupts pending: %06x\n"),
TRENTRY(OHCI_TRACE1_EPLISTALLOC_FAILED, TR_OHCI, TR_FMT1, "OHCI ERROR: Failed to allocate EP list\n"),
TRENTRY(OHCI_TRACE1_EDALLOC_FAILED, TR_OHCI, TR_FMT1, "OHCI ERROR: Failed to allocate ED\n"),
TRENTRY(OHCI_TRACE1_TDALLOC_FAILED, TR_OHCI, TR_FMT1, "OHCI ERROR: Failed to allocate TD\n"),
TRENTRY(OHCI_TRACE1_IRQATTACH, TR_OHCI, TR_FMT1, "OHCI ERROR: Failed to attach IRQ%d\n"),
#ifdef CONFIG_USBHOST_TRACE_VERBOSE #ifdef CONFIG_USBHOST_TRACE_VERBOSE
TRENTRY(OHCI_VTRACE1_PHYSED, TR_OHCI, TR_FMT1, "OHCI physed: %06x\n"),
TRENTRY(OHCI_VTRACE1_VIRTED, TR_OHCI, TR_FMT1, "OHCI ed: %06x\n"),
TRENTRY(OHCI_VTRACE1_CSC, TR_OHCI, TR_FMT1, "OHCI Connect Status Change, RHSTATUS: %06x\n"),
TRENTRY(OHCI_VTRACE1_DRWE, TR_OHCI, TR_FMT1, "OHCI DRWE: Remote wake-up, RHSTATUS: %06x\n"),
TRENTRY(OHCI_VTRACE1_ALREADYCONN, TR_OHCI, TR_FMT1, "OHCI Already connected, RHPORTST%d: %06x\n"),
TRENTRY(OHCI_VTRACE1_SPEED, TR_OHCI, TR_FMT1, "OHCI Low speed: %d\n"),
TRENTRY(OHCI_VTRACE1_ALREADYDISCONN, TR_OHCI, TR_FMT1, "OHCI Already disconnected, RHPORTST%d: %06x\n"),
TRENTRY(OHCI_VTRACE1_RHSC, TR_OHCI, TR_FMT1, "OHCI Root Hub Status Change. Pending: %06x\n"),
TRENTRY(OHCI_VTRACE1_WDHINTR, TR_OHCI, TR_FMT1, "OHCI Writeback Done Head interrupt. Pending: %06x\n"),
TRENTRY(OHCI_VTRACE1_ENUMDISCONN, TR_OHCI, TR_FMT1, "OHCI RHport%dNot connected\n"),
TRENTRY(OHCI_VTRACE1_INITIALIZING, TR_OHCI, TR_FMT1, "OHCI Initializing Stack\n"),
TRENTRY(OHCI_VTRACE1_INITIALIZED, TR_OHCI, TR_FMT1, "OHCI Initialized\n"),
TRENTRY(OHCI_VTRACE1_INTRPENDING, TR_OHCI, TR_FMT1, "OHCI Interrupts pending: %06x\n"),
#endif #endif
#endif #endif
@ -117,6 +138,7 @@ static const struct sam_usbhost_trace_s g_trace1[TRACE1_NSTRINGS] =
TRENTRY(EHCI_TRACE1_RESET_FAILED, TR_EHCI, TR_FMT1, "EHCI ERROR: sam_reset failed: %d\n"), TRENTRY(EHCI_TRACE1_RESET_FAILED, TR_EHCI, TR_FMT1, "EHCI ERROR: sam_reset failed: %d\n"),
TRENTRY(EHCI_TRACE1_RUN_FAILED, TR_EHCI, TR_FMT1, "EHCI ERROR: EHCI Failed to run: USBSTS=%08x\n"), TRENTRY(EHCI_TRACE1_RUN_FAILED, TR_EHCI, TR_FMT1, "EHCI ERROR: EHCI Failed to run: USBSTS=%08x\n"),
TRENTRY(EHCI_TRACE1_IRQATTACH_FAILED, TR_EHCI, TR_FMT1, "EHCI ERROR: Failed to attach IRQ%d\n"), TRENTRY(EHCI_TRACE1_IRQATTACH_FAILED, TR_EHCI, TR_FMT1, "EHCI ERROR: Failed to attach IRQ%d\n"),
#ifdef CONFIG_USBHOST_TRACE_VERBOSE #ifdef CONFIG_USBHOST_TRACE_VERBOSE
TRENTRY(EHCI_VTRACE1_PORTSC_CSC, TR_EHCI, TR_FMT1, "EHCI Connect Status Change: %06x\n"), TRENTRY(EHCI_VTRACE1_PORTSC_CSC, TR_EHCI, TR_FMT1, "EHCI Connect Status Change: %06x\n"),
TRENTRY(EHCI_VTRACE1_PORTSC_CONNALREADY, TR_EHCI, TR_FMT1, "EHCI Already connected: %06x\n"), TRENTRY(EHCI_VTRACE1_PORTSC_CONNALREADY, TR_EHCI, TR_FMT1, "EHCI Already connected: %06x\n"),
@ -135,7 +157,26 @@ static const struct sam_usbhost_trace_s g_trace1[TRACE1_NSTRINGS] =
static const struct sam_usbhost_trace_s g_trace2[TRACE2_NSTRINGS] = static const struct sam_usbhost_trace_s g_trace2[TRACE2_NSTRINGS] =
{ {
#ifdef CONFIG_SAMA5_OHCI #ifdef CONFIG_SAMA5_OHCI
TRENTRY(OHCI_TRACE2_BADTDSTATUS, TR_OHCI, TR_FMT2, "OHCI ERROR: RHport%d Bad TD completion status: %d\n"),
TRENTRY(OHCI_TRACE2_WHDTDSTATUS, TR_OHCI, TR_FMT2, "OHCI ERROR: WHD Bad TD completion status: %d xfrtype: %d\n"),
TRENTRY(OHCI_TRACE2_EP0ENQUEUE_FAILED, TR_OHCI, TR_FMT2, "OHCI ERROR: RHport%d Failed to enqueue EP0: %d\n"),
TRENTRY(OHCI_TRACE2_EDENQUEUE_FAILED, TR_OHCI, TR_FMT2, "OHCI ERROR: Failed to queue ED for transfer type %d: %d\n"),
TRENTRY(OHCI_TRACE2_CLASSENUM_FAILED, TR_OHCI, TR_FMT2, "OHCI RHport%d usbhost_enumerate() failed: %d\n"),
#ifdef CONFIG_USBHOST_TRACE_VERBOSE #ifdef CONFIG_USBHOST_TRACE_VERBOSE
TRENTRY(OHCI_VTRACE2_INTERVAL, TR_OHCI, TR_FMT2, "OHCI interval: %d->%d\n"),
TRENTRY(OHCI_VTRACE2_MININTERVAL, TR_OHCI, TR_FMT2, "OHCI MIN interval: %d offset: %d\n"),
TRENTRY(OHCI_VTRACE2_RHPORTST, TR_OHCI, TR_FMT2, "OHCI RHPORTST%d: %04x\n"),
TRENTRY(OHCI_VTRACE2_CONNECTED, TR_OHCI, TR_FMT2, "OHCI RHPort%d connected, rhswait: %d\n"),
TRENTRY(OHCI_VTRACE2_DISCONNECTED, TR_OHCI, TR_FMT2, "OHCI RHPort%d disconnected, rhswait: %d\n"),
TRENTRY(OHCI_VTRACE2_WAKEUP, TR_OHCI, TR_FMT2, "OHCI RHPort%d connected: %d\n"),
TRENTRY(OHCI_VTRACE2_CLASSENUM, TR_OHCI, TR_FMT2, "OHCI RHPort%d: Enumerate the device, devaddr=%02x\n"),
TRENTRY(OHCI_VTRACE2_EP0CONFIGURE, TR_OHCI, TR_FMT2, "OHCI RHPort%d EP0 CTRL: %04x\n"),
TRENTRY(OHCI_VTRACE2_EPALLOC, TR_OHCI, TR_FMT2, "OHCI EP%d CTRL: %04x\n"),
TRENTRY(OHCI_VTRACE2_CTRLIN, TR_OHCI, TR_FMT2, "OHCI CTRLIN RHPort%d req: %02x\n"),
TRENTRY(OHCI_VTRACE2_CTRLOUT, TR_OHCI, TR_FMT2, "OHCI CTRLOUT RHPort%d req: %02x\n"),
TRENTRY(OHCI_VTRACE2_TRANSFER, TR_OHCI, TR_FMT2, "OHCI EP%d buflen: %d\n"),
TRENTRY(OHCI_VTRACE2_INITCONNECTED, TR_OHCI, TR_FMT2, "OHCI RHPort%d Device connected: %d\n"),
#endif #endif
#endif #endif

View File

@ -68,13 +68,36 @@
enum usbhost_trace1codes_e enum usbhost_trace1codes_e
{ {
__TRACE1_BASEVALUE = 0, /* This will force the first value to be 1 */
#ifdef CONFIG_SAMA5_OHCI #ifdef CONFIG_SAMA5_OHCI
OHCI_TRACE1_DEVDISCONN, /* OHCI ERROR: RHport Device disconnected */
OHCI_TRACE1_INTRUNRECOVERABLE, /* OHCI ERROR: Unrecoverable error */
OHCI_TRACE1_INTRUNHANDLED, /* OHCI ERROR: Unhandled interrupts */
OHCI_TRACE1_EPLISTALLOC_FAILED, /* OHCI ERROR: Failed to allocate EP list */
OHCI_TRACE1_EDALLOC_FAILED, /* OHCI ERROR: Failed to allocate ED */
OHCI_TRACE1_TDALLOC_FAILED, /* OHCI ERROR: Failed to allocate TD */
OHCI_TRACE1_IRQATTACH, /* OHCI ERROR: Failed to attach IRQ */
#ifdef CONFIG_USBHOST_TRACE_VERBOSE #ifdef CONFIG_USBHOST_TRACE_VERBOSE
OHCI_VTRACE1_PHYSED, /* OHCI physed */
OHCI_VTRACE1_VIRTED, /* OHCI ed */
OHCI_VTRACE1_CSC, /* OHCI Connect Status Change */
OHCI_VTRACE1_DRWE, /* OHCI DRWE: Remote wake-up */
OHCI_VTRACE1_ALREADYCONN, /* OHCI Already connected */
OHCI_VTRACE1_SPEED, /* OHCI Low speed */
OHCI_VTRACE1_ALREADYDISCONN, /* OHCI Already disconnected */
OHCI_VTRACE1_RHSC, /* OHCI Root Hub Status Change */
OHCI_VTRACE1_WDHINTR, /* OHCI Writeback Done Head interrupt */
OHCI_VTRACE1_ENUMDISCONN, /* OHCI RHport Not connected */
OHCI_VTRACE1_INITIALIZING, /* OHCI Initializing Stack */
OHCI_VTRACE1_INITIALIZED, /* OHCI Initialized */
OHCI_VTRACE1_INTRPENDING, /* OHCI Interrupts pending */
#endif #endif
#endif #endif
#ifdef CONFIG_SAMA5_EHCI #ifdef CONFIG_SAMA5_EHCI
EHCI_TRACE1_SYSTEMERROR = 0, /* EHCI ERROR: System error */ EHCI_TRACE1_SYSTEMERROR, /* EHCI ERROR: System error */
EHCI_TRACE1_QTDFOREACH_FAILED, /* EHCI ERROR: sam_qtd_foreach failed */ EHCI_TRACE1_QTDFOREACH_FAILED, /* EHCI ERROR: sam_qtd_foreach failed */
EHCI_TRACE1_QHALLOC_FAILED, /* EHCI ERROR: Failed to allocate a QH */ EHCI_TRACE1_QHALLOC_FAILED, /* EHCI ERROR: Failed to allocate a QH */
EHCI_TRACE1_BUFTOOBIG, /* EHCI ERROR: Buffer too big */ EHCI_TRACE1_BUFTOOBIG, /* EHCI ERROR: Buffer too big */
@ -114,10 +137,29 @@ enum usbhost_trace1codes_e
#endif #endif
#endif #endif
__TRACE1_NSTRINGS, __TRACE1_NSTRINGS, /* Separates the format 1 from the format 2 strings */
#ifdef CONFIG_SAMA5_OHCI #ifdef CONFIG_SAMA5_OHCI
OHCI_TRACE2_BADTDSTATUS, /* OHCI ERROR: RHport Bad TD completion status */
OHCI_TRACE2_WHDTDSTATUS, /* OHCI ERROR: WDH Bad TD completion status */
OHCI_TRACE2_EP0ENQUEUE_FAILED, /* OHCI ERROR: RHport Failed to enqueue EP0 */
OHCI_TRACE2_EDENQUEUE_FAILED, /* OHCI ERROR: Failed to queue ED for transfer type */
OHCI_TRACE2_CLASSENUM_FAILED, /* OHCI usbhost_enumerate() failed */
#ifdef CONFIG_USBHOST_TRACE_VERBOSE #ifdef CONFIG_USBHOST_TRACE_VERBOSE
OHCI_VTRACE2_INTERVAL, /* OHCI interval */
OHCI_VTRACE2_MININTERVAL, /* OHCI MIN interval/offset */
OHCI_VTRACE2_RHPORTST, /* OHCI RHPORTST */
OHCI_VTRACE2_CONNECTED, /* OHCI RHPort connected */
OHCI_VTRACE2_DISCONNECTED, /* OHCI RHPort disconnected */
OHCI_VTRACE2_WAKEUP, /* OHCI RHPort connected */
OHCI_VTRACE2_CLASSENUM, /* OHCI Enumerate the device */
OHCI_VTRACE2_EP0CONFIGURE, /* OHCI RHPort EP0 CTRL */
OHCI_VTRACE2_EPALLOC, /* OHCI EP CTRL */
OHCI_VTRACE2_CTRLIN, /* OHCI CTRLIN */
OHCI_VTRACE2_CTRLOUT, /* OHCI CTRLOUT */
OHCI_VTRACE2_TRANSFER, /* OHCI EP buflen */
OHCI_VTRACE2_INITCONNECTED, /* OHCI RHPort Device connected */
#endif #endif
#endif #endif
@ -142,14 +184,14 @@ enum usbhost_trace1codes_e
#endif #endif
#endif #endif
__TRACE2_NSTRINGS __TRACE2_NSTRINGS /* Total number of enumeration values */
}; };
#define TRACE1_FIRST 0 #define TRACE1_FIRST ((int)__TRACE1_BASEVALUE + 1)
#define TRACE1_INDEX(id) ((int)(id) - TRACE1_FIRST) #define TRACE1_INDEX(id) ((int)(id) - TRACE1_FIRST)
#define TRACE1_NSTRINGS TRACE1_INDEX(__TRACE1_NSTRINGS) #define TRACE1_NSTRINGS TRACE1_INDEX(__TRACE1_NSTRINGS)
#define TRACE2_FIRST (__TRACE1_NSTRINGS + 1) #define TRACE2_FIRST ((int)__TRACE1_NSTRINGS + 1)
#define TRACE2_INDEX(id) ((int)(id) - TRACE2_FIRST) #define TRACE2_INDEX(id) ((int)(id) - TRACE2_FIRST)
#define TRACE2_NSTRINGS TRACE2_INDEX(__TRACE2_NSTRINGS) #define TRACE2_NSTRINGS TRACE2_INDEX(__TRACE2_NSTRINGS)