[PATCH] USB ohci-hcd driver update
[opensuse:kernel.git] / drivers / usb / hcd / ohci-dbg.c
1 /*
2  * OHCI HCD (Host Controller Driver) for USB.
3  * 
4  * (C) Copyright 1999 Roman Weissgaerber <weissg@vienna.at>
5  * (C) Copyright 2000-2002 David Brownell <dbrownell@users.sourceforge.net>
6  * 
7  * This file is licenced under the GPL.
8  * $Id: ohci-dbg.c,v 1.2 2002/01/19 00:15:45 dbrownell Exp $
9  */
10  
11 /*-------------------------------------------------------------------------*/
12  
13 #ifdef DEBUG
14
15 #define pipestring(pipe) ({ char *temp; \
16         switch (usb_pipetype (pipe)) { \
17         case PIPE_CONTROL:      temp = "CTRL"; break; \
18         case PIPE_BULK:         temp = "BULK"; break; \
19         case PIPE_INTERRUPT:    temp = "INTR"; break; \
20         default:                temp = "ISOC"; break; \
21         }; temp;})
22
23 /* debug| print the main components of an URB     
24  * small: 0) header + data packets 1) just header
25  */
26 static void urb_print (struct urb * urb, char * str, int small)
27 {
28         unsigned int pipe= urb->pipe;
29         
30         if (!urb->dev || !urb->dev->bus) {
31                 dbg("%s URB: no dev", str);
32                 return;
33         }
34         
35 #ifndef OHCI_VERBOSE_DEBUG
36         if (urb->status != 0)
37 #endif
38         dbg("%s:[%4x] dev:%d,ep=%d-%c,%s,flags:%4x,len:%d/%d,stat:%d", 
39                     str,
40                     usb_get_current_frame_number (urb->dev), 
41                     usb_pipedevice (pipe),
42                     usb_pipeendpoint (pipe), 
43                     usb_pipeout (pipe)? 'O': 'I',
44                     pipestring (pipe),
45                     urb->transfer_flags, 
46                     urb->actual_length, 
47                     urb->transfer_buffer_length,
48                     urb->status);
49
50 #ifdef  OHCI_VERBOSE_DEBUG
51         if (!small) {
52                 int i, len;
53
54                 if (usb_pipecontrol (pipe)) {
55                         printk (KERN_DEBUG __FILE__ ": cmd(8):");
56                         for (i = 0; i < 8 ; i++) 
57                                 printk (" %02x", ((__u8 *) urb->setup_packet) [i]);
58                         printk ("\n");
59                 }
60                 if (urb->transfer_buffer_length > 0 && urb->transfer_buffer) {
61                         printk (KERN_DEBUG __FILE__ ": data(%d/%d):", 
62                                 urb->actual_length, 
63                                 urb->transfer_buffer_length);
64                         len = usb_pipeout (pipe)? 
65                                                 urb->transfer_buffer_length: urb->actual_length;
66                         for (i = 0; i < 16 && i < len; i++) 
67                                 printk (" %02x", ((__u8 *) urb->transfer_buffer) [i]);
68                         printk ("%s stat:%d\n", i < len? "...": "", urb->status);
69                 }
70         } 
71 #endif
72 }
73
74 static inline struct ed *
75 dma_to_ed (struct ohci_hcd *hc, dma_addr_t ed_dma);
76
77 #ifdef OHCI_VERBOSE_DEBUG
78 /* print non-empty branches of the periodic ed tree */
79 void ohci_dump_periodic (struct ohci_hcd *ohci, char *label)
80 {
81         int i, j;
82         u32 *ed_p;
83         int printed = 0;
84
85         for (i= 0; i < 32; i++) {
86                 j = 5;
87                 ed_p = &(ohci->hcca->int_table [i]);
88                 if (*ed_p == 0)
89                         continue;
90                 printed = 1;
91                 printk (KERN_DEBUG "%s, ohci %s frame %2d:",
92                                 label, ohci->hcd.bus_name, i);
93                 while (*ed_p != 0 && j--) {
94                         struct ed *ed = dma_to_ed (ohci, le32_to_cpup(ed_p));
95                         printk (" %p/%08x;", ed, ed->hwINFO);
96                         ed_p = &ed->hwNextED;
97                 }
98                 printk ("\n");
99         }
100         if (!printed)
101                 printk (KERN_DEBUG "%s, ohci %s, empty periodic schedule\n",
102                                 label, ohci->hcd.bus_name);
103 }
104 #endif
105
106 static void ohci_dump_intr_mask (char *label, __u32 mask)
107 {
108         dbg ("%s: 0x%08x%s%s%s%s%s%s%s%s%s",
109                 label,
110                 mask,
111                 (mask & OHCI_INTR_MIE) ? " MIE" : "",
112                 (mask & OHCI_INTR_OC) ? " OC" : "",
113                 (mask & OHCI_INTR_RHSC) ? " RHSC" : "",
114                 (mask & OHCI_INTR_FNO) ? " FNO" : "",
115                 (mask & OHCI_INTR_UE) ? " UE" : "",
116                 (mask & OHCI_INTR_RD) ? " RD" : "",
117                 (mask & OHCI_INTR_SF) ? " SF" : "",
118                 (mask & OHCI_INTR_WDH) ? " WDH" : "",
119                 (mask & OHCI_INTR_SO) ? " SO" : ""
120                 );
121 }
122
123 static void maybe_print_eds (char *label, __u32 value)
124 {
125         if (value)
126                 dbg ("%s %08x", label, value);
127 }
128
129 static char *hcfs2string (int state)
130 {
131         switch (state) {
132                 case OHCI_USB_RESET:    return "reset";
133                 case OHCI_USB_RESUME:   return "resume";
134                 case OHCI_USB_OPER:     return "operational";
135                 case OHCI_USB_SUSPEND:  return "suspend";
136         }
137         return "?";
138 }
139
140 // dump control and status registers
141 static void ohci_dump_status (struct ohci_hcd *controller)
142 {
143         struct ohci_regs        *regs = controller->regs;
144         __u32                   temp;
145
146         temp = readl (&regs->revision) & 0xff;
147         dbg ("OHCI %d.%d, %s legacy support registers",
148                 0x03 & (temp >> 4), (temp & 0x0f),
149                 (temp & 0x10) ? "with" : "NO");
150
151         temp = readl (&regs->control);
152         dbg ("control: 0x%08x%s%s%s HCFS=%s%s%s%s%s CBSR=%d", temp,
153                 (temp & OHCI_CTRL_RWE) ? " RWE" : "",
154                 (temp & OHCI_CTRL_RWC) ? " RWC" : "",
155                 (temp & OHCI_CTRL_IR) ? " IR" : "",
156                 hcfs2string (temp & OHCI_CTRL_HCFS),
157                 (temp & OHCI_CTRL_BLE) ? " BLE" : "",
158                 (temp & OHCI_CTRL_CLE) ? " CLE" : "",
159                 (temp & OHCI_CTRL_IE) ? " IE" : "",
160                 (temp & OHCI_CTRL_PLE) ? " PLE" : "",
161                 temp & OHCI_CTRL_CBSR
162                 );
163
164         temp = readl (&regs->cmdstatus);
165         dbg ("cmdstatus: 0x%08x SOC=%d%s%s%s%s", temp,
166                 (temp & OHCI_SOC) >> 16,
167                 (temp & OHCI_OCR) ? " OCR" : "",
168                 (temp & OHCI_BLF) ? " BLF" : "",
169                 (temp & OHCI_CLF) ? " CLF" : "",
170                 (temp & OHCI_HCR) ? " HCR" : ""
171                 );
172
173         ohci_dump_intr_mask ("intrstatus", readl (&regs->intrstatus));
174         ohci_dump_intr_mask ("intrenable", readl (&regs->intrenable));
175         // intrdisable always same as intrenable
176         // ohci_dump_intr_mask ("intrdisable", readl (&regs->intrdisable));
177
178         maybe_print_eds ("ed_periodcurrent", readl (&regs->ed_periodcurrent));
179
180         maybe_print_eds ("ed_controlhead", readl (&regs->ed_controlhead));
181         maybe_print_eds ("ed_controlcurrent", readl (&regs->ed_controlcurrent));
182
183         maybe_print_eds ("ed_bulkhead", readl (&regs->ed_bulkhead));
184         maybe_print_eds ("ed_bulkcurrent", readl (&regs->ed_bulkcurrent));
185
186         maybe_print_eds ("donehead", readl (&regs->donehead));
187 }
188
189 static void ohci_dump_roothub (struct ohci_hcd *controller, int verbose)
190 {
191         __u32                   temp, ndp, i;
192
193         temp = roothub_a (controller);
194         ndp = (temp & RH_A_NDP);
195
196         if (verbose) {
197                 dbg ("roothub.a: %08x POTPGT=%d%s%s%s%s%s NDP=%d", temp,
198                         ((temp & RH_A_POTPGT) >> 24) & 0xff,
199                         (temp & RH_A_NOCP) ? " NOCP" : "",
200                         (temp & RH_A_OCPM) ? " OCPM" : "",
201                         (temp & RH_A_DT) ? " DT" : "",
202                         (temp & RH_A_NPS) ? " NPS" : "",
203                         (temp & RH_A_PSM) ? " PSM" : "",
204                         ndp
205                         );
206                 temp = roothub_b (controller);
207                 dbg ("roothub.b: %08x PPCM=%04x DR=%04x",
208                         temp,
209                         (temp & RH_B_PPCM) >> 16,
210                         (temp & RH_B_DR)
211                         );
212                 temp = roothub_status (controller);
213                 dbg ("roothub.status: %08x%s%s%s%s%s%s",
214                         temp,
215                         (temp & RH_HS_CRWE) ? " CRWE" : "",
216                         (temp & RH_HS_OCIC) ? " OCIC" : "",
217                         (temp & RH_HS_LPSC) ? " LPSC" : "",
218                         (temp & RH_HS_DRWE) ? " DRWE" : "",
219                         (temp & RH_HS_OCI) ? " OCI" : "",
220                         (temp & RH_HS_LPS) ? " LPS" : ""
221                         );
222         }
223         
224         for (i = 0; i < ndp; i++) {
225                 temp = roothub_portstatus (controller, i);
226                 dbg_port (controller, "", i, temp);
227         }
228 }
229
230 static void ohci_dump (struct ohci_hcd *controller, int verbose)
231 {
232         dbg ("OHCI controller %s state", controller->hcd.bus_name);
233
234         // dumps some of the state we know about
235         ohci_dump_status (controller);
236 #ifdef OHCI_VERBOSE_DEBUG
237         if (verbose)
238                 ohci_dump_periodic (controller, "hcca");
239 #endif
240         dbg ("hcca frame #%04x", controller->hcca->frame_no);
241         ohci_dump_roothub (controller, 1);
242 }
243
244
245 #endif
246