0001
0002
0003
0004
0005
0006
0007
0008
0009
0010 #ifndef __LINUX_CDNS3_DEBUG
0011 #define __LINUX_CDNS3_DEBUG
0012
0013 #include "core.h"
0014
0015 static inline char *cdns3_decode_usb_irq(char *str,
0016 enum usb_device_speed speed,
0017 u32 usb_ists)
0018 {
0019 int ret;
0020
0021 ret = sprintf(str, "IRQ %08x = ", usb_ists);
0022
0023 if (usb_ists & (USB_ISTS_CON2I | USB_ISTS_CONI)) {
0024 ret += sprintf(str + ret, "Connection %s\n",
0025 usb_speed_string(speed));
0026 }
0027 if (usb_ists & USB_ISTS_DIS2I || usb_ists & USB_ISTS_DISI)
0028 ret += sprintf(str + ret, "Disconnection ");
0029 if (usb_ists & USB_ISTS_L2ENTI)
0030 ret += sprintf(str + ret, "suspended ");
0031 if (usb_ists & USB_ISTS_L1ENTI)
0032 ret += sprintf(str + ret, "L1 enter ");
0033 if (usb_ists & USB_ISTS_L1EXTI)
0034 ret += sprintf(str + ret, "L1 exit ");
0035 if (usb_ists & USB_ISTS_L2ENTI)
0036 ret += sprintf(str + ret, "L2 enter ");
0037 if (usb_ists & USB_ISTS_L2EXTI)
0038 ret += sprintf(str + ret, "L2 exit ");
0039 if (usb_ists & USB_ISTS_U3EXTI)
0040 ret += sprintf(str + ret, "U3 exit ");
0041 if (usb_ists & USB_ISTS_UWRESI)
0042 ret += sprintf(str + ret, "Warm Reset ");
0043 if (usb_ists & USB_ISTS_UHRESI)
0044 ret += sprintf(str + ret, "Hot Reset ");
0045 if (usb_ists & USB_ISTS_U2RESI)
0046 ret += sprintf(str + ret, "Reset");
0047
0048 return str;
0049 }
0050
0051 static inline char *cdns3_decode_ep_irq(char *str,
0052 u32 ep_sts,
0053 const char *ep_name)
0054 {
0055 int ret;
0056
0057 ret = sprintf(str, "IRQ for %s: %08x ", ep_name, ep_sts);
0058
0059 if (ep_sts & EP_STS_SETUP)
0060 ret += sprintf(str + ret, "SETUP ");
0061 if (ep_sts & EP_STS_IOC)
0062 ret += sprintf(str + ret, "IOC ");
0063 if (ep_sts & EP_STS_ISP)
0064 ret += sprintf(str + ret, "ISP ");
0065 if (ep_sts & EP_STS_DESCMIS)
0066 ret += sprintf(str + ret, "DESCMIS ");
0067 if (ep_sts & EP_STS_STREAMR)
0068 ret += sprintf(str + ret, "STREAMR ");
0069 if (ep_sts & EP_STS_MD_EXIT)
0070 ret += sprintf(str + ret, "MD_EXIT ");
0071 if (ep_sts & EP_STS_TRBERR)
0072 ret += sprintf(str + ret, "TRBERR ");
0073 if (ep_sts & EP_STS_NRDY)
0074 ret += sprintf(str + ret, "NRDY ");
0075 if (ep_sts & EP_STS_PRIME)
0076 ret += sprintf(str + ret, "PRIME ");
0077 if (ep_sts & EP_STS_SIDERR)
0078 ret += sprintf(str + ret, "SIDERRT ");
0079 if (ep_sts & EP_STS_OUTSMM)
0080 ret += sprintf(str + ret, "OUTSMM ");
0081 if (ep_sts & EP_STS_ISOERR)
0082 ret += sprintf(str + ret, "ISOERR ");
0083 if (ep_sts & EP_STS_IOT)
0084 ret += sprintf(str + ret, "IOT ");
0085
0086 return str;
0087 }
0088
0089 static inline char *cdns3_decode_epx_irq(char *str,
0090 char *ep_name,
0091 u32 ep_sts)
0092 {
0093 return cdns3_decode_ep_irq(str, ep_sts, ep_name);
0094 }
0095
0096 static inline char *cdns3_decode_ep0_irq(char *str,
0097 int dir,
0098 u32 ep_sts)
0099 {
0100 return cdns3_decode_ep_irq(str, ep_sts,
0101 dir ? "ep0IN" : "ep0OUT");
0102 }
0103
0104
0105
0106
0107
0108
0109
0110 static inline char *cdns3_dbg_ring(struct cdns3_endpoint *priv_ep,
0111 struct cdns3_trb *ring, char *str)
0112 {
0113 dma_addr_t addr = priv_ep->trb_pool_dma;
0114 struct cdns3_trb *trb;
0115 int trb_per_sector;
0116 int ret = 0;
0117 int i;
0118
0119 trb_per_sector = GET_TRBS_PER_SEGMENT(priv_ep->type);
0120
0121 trb = &priv_ep->trb_pool[priv_ep->dequeue];
0122 ret += sprintf(str + ret, "\n\t\tRing contents for %s:", priv_ep->name);
0123
0124 ret += sprintf(str + ret,
0125 "\n\t\tRing deq index: %d, trb: %p (virt), 0x%llx (dma)\n",
0126 priv_ep->dequeue, trb,
0127 (unsigned long long)cdns3_trb_virt_to_dma(priv_ep, trb));
0128
0129 trb = &priv_ep->trb_pool[priv_ep->enqueue];
0130 ret += sprintf(str + ret,
0131 "\t\tRing enq index: %d, trb: %p (virt), 0x%llx (dma)\n",
0132 priv_ep->enqueue, trb,
0133 (unsigned long long)cdns3_trb_virt_to_dma(priv_ep, trb));
0134
0135 ret += sprintf(str + ret,
0136 "\t\tfree trbs: %d, CCS=%d, PCS=%d\n",
0137 priv_ep->free_trbs, priv_ep->ccs, priv_ep->pcs);
0138
0139 if (trb_per_sector > TRBS_PER_SEGMENT)
0140 trb_per_sector = TRBS_PER_SEGMENT;
0141
0142 if (trb_per_sector > TRBS_PER_SEGMENT) {
0143 sprintf(str + ret, "\t\tTransfer ring %d too big\n",
0144 trb_per_sector);
0145 return str;
0146 }
0147
0148 for (i = 0; i < trb_per_sector; ++i) {
0149 trb = &ring[i];
0150 ret += sprintf(str + ret,
0151 "\t\t@%pad %08x %08x %08x\n", &addr,
0152 le32_to_cpu(trb->buffer),
0153 le32_to_cpu(trb->length),
0154 le32_to_cpu(trb->control));
0155 addr += sizeof(*trb);
0156 }
0157
0158 return str;
0159 }
0160
0161 #endif