sl811hs.c revision 1.58 1 1.58 skrll /* $NetBSD: sl811hs.c,v 1.58 2016/05/08 07:48:24 skrll Exp $ */
2 1.1 isaki
3 1.1 isaki /*
4 1.12 kiyohara * Not (c) 2007 Matthew Orgass
5 1.36 skrll * This file is public domain, meaning anyone can make any use of part or all
6 1.36 skrll * of this file including copying into other works without credit. Any use,
7 1.36 skrll * modified or not, is solely the responsibility of the user. If this file is
8 1.36 skrll * part of a collection then use in the collection is governed by the terms of
9 1.12 kiyohara * the collection.
10 1.12 kiyohara */
11 1.12 kiyohara
12 1.12 kiyohara /*
13 1.12 kiyohara * Cypress/ScanLogic SL811HS/T USB Host Controller
14 1.12 kiyohara * Datasheet, Errata, and App Note available at www.cypress.com
15 1.12 kiyohara *
16 1.36 skrll * Uses: Ratoc CFU1U PCMCIA USB Host Controller, Nereid X68k USB HC, ISA
17 1.12 kiyohara * HCs. The Ratoc CFU2 uses a different chip.
18 1.1 isaki *
19 1.36 skrll * This chip puts the serial in USB. It implements USB by means of an eight
20 1.36 skrll * bit I/O interface. It can be used for ISA, PCMCIA/CF, parallel port,
21 1.36 skrll * serial port, or any eight bit interface. It has 256 bytes of memory, the
22 1.36 skrll * first 16 of which are used for register access. There are two sets of
23 1.36 skrll * registers for sending individual bus transactions. Because USB is polled,
24 1.36 skrll * this organization means that some amount of card access must often be made
25 1.36 skrll * when devices are attached, even if when they are not directly being used.
26 1.36 skrll * A per-ms frame interrupt is necessary and many devices will poll with a
27 1.12 kiyohara * per-frame bulk transfer.
28 1.1 isaki *
29 1.36 skrll * It is possible to write a little over two bytes to the chip (auto
30 1.36 skrll * incremented) per full speed byte time on the USB. Unfortunately,
31 1.36 skrll * auto-increment does not work reliably so write and bus speed is
32 1.12 kiyohara * approximately the same for full speed devices.
33 1.12 kiyohara *
34 1.36 skrll * In addition to the 240 byte packet size limit for isochronous transfers,
35 1.36 skrll * this chip has no means of determining the current frame number other than
36 1.36 skrll * getting all 1ms SOF interrupts, which is not always possible even on a fast
37 1.36 skrll * system. Isochronous transfers guarantee that transfers will never be
38 1.36 skrll * retried in a later frame, so this can cause problems with devices beyond
39 1.36 skrll * the difficulty in actually performing the transfer most frames. I tried
40 1.36 skrll * implementing isoc transfers and was able to play CD-derrived audio via an
41 1.12 kiyohara * iMic on a 2GHz PC, however it would still be interrupted at times and
42 1.36 skrll * once interrupted, would stay out of sync. All isoc support has been
43 1.12 kiyohara * removed.
44 1.12 kiyohara *
45 1.36 skrll * BUGS: all chip revisions have problems with low speed devices through hubs.
46 1.36 skrll * The chip stops generating SOF with hubs that send SE0 during SOF. See
47 1.36 skrll * comment in dointr(). All performance enhancing features of this chip seem
48 1.12 kiyohara * not to work properly, most confirmed buggy in errata doc.
49 1.1 isaki *
50 1.1 isaki */
51 1.1 isaki
52 1.1 isaki /*
53 1.36 skrll * The hard interrupt is the main entry point. Start, callbacks, and repeat
54 1.12 kiyohara * are the only others called frequently.
55 1.12 kiyohara *
56 1.36 skrll * Since this driver attaches to pcmcia, card removal at any point should be
57 1.12 kiyohara * expected and not cause panics or infinite loops.
58 1.1 isaki */
59 1.12 kiyohara
60 1.34 skrll /*
61 1.34 skrll * XXX TODO:
62 1.12 kiyohara * copy next output packet while transfering
63 1.12 kiyohara * usb suspend
64 1.12 kiyohara * could keep track of known values of all buffer space?
65 1.12 kiyohara * combined print/log function for errors
66 1.12 kiyohara *
67 1.48 skrll * ub_usepolling support is untested and may not work
68 1.1 isaki */
69 1.1 isaki
70 1.1 isaki #include <sys/cdefs.h>
71 1.58 skrll __KERNEL_RCSID(0, "$NetBSD: sl811hs.c,v 1.58 2016/05/08 07:48:24 skrll Exp $");
72 1.26 isaki
73 1.26 isaki #include "opt_slhci.h"
74 1.1 isaki
75 1.56 skrll #ifdef _KERNEL_OPT
76 1.56 skrll #include "opt_usb.h"
77 1.56 skrll #endif
78 1.56 skrll
79 1.1 isaki #include <sys/param.h>
80 1.56 skrll
81 1.53 skrll #include <sys/bus.h>
82 1.53 skrll #include <sys/cpu.h>
83 1.53 skrll #include <sys/device.h>
84 1.53 skrll #include <sys/gcq.h>
85 1.53 skrll #include <sys/intr.h>
86 1.1 isaki #include <sys/kernel.h>
87 1.53 skrll #include <sys/kmem.h>
88 1.1 isaki #include <sys/proc.h>
89 1.12 kiyohara #include <sys/queue.h>
90 1.56 skrll #include <sys/sysctl.h>
91 1.53 skrll #include <sys/systm.h>
92 1.1 isaki
93 1.1 isaki #include <dev/usb/usb.h>
94 1.1 isaki #include <dev/usb/usbdi.h>
95 1.1 isaki #include <dev/usb/usbdivar.h>
96 1.56 skrll #include <dev/usb/usbhist.h>
97 1.1 isaki #include <dev/usb/usb_mem.h>
98 1.1 isaki #include <dev/usb/usbdevs.h>
99 1.48 skrll #include <dev/usb/usbroothub.h>
100 1.1 isaki
101 1.1 isaki #include <dev/ic/sl811hsreg.h>
102 1.1 isaki #include <dev/ic/sl811hsvar.h>
103 1.1 isaki
104 1.12 kiyohara #define Q_CB 0 /* Control/Bulk */
105 1.12 kiyohara #define Q_NEXT_CB 1
106 1.12 kiyohara #define Q_MAX_XFER Q_CB
107 1.12 kiyohara #define Q_CALLBACKS 2
108 1.12 kiyohara #define Q_MAX Q_CALLBACKS
109 1.12 kiyohara
110 1.12 kiyohara #define F_AREADY (0x00000001)
111 1.12 kiyohara #define F_BREADY (0x00000002)
112 1.12 kiyohara #define F_AINPROG (0x00000004)
113 1.12 kiyohara #define F_BINPROG (0x00000008)
114 1.12 kiyohara #define F_LOWSPEED (0x00000010)
115 1.12 kiyohara #define F_UDISABLED (0x00000020) /* Consider disabled for USB */
116 1.12 kiyohara #define F_NODEV (0x00000040)
117 1.12 kiyohara #define F_ROOTINTR (0x00000080)
118 1.12 kiyohara #define F_REALPOWER (0x00000100) /* Actual power state */
119 1.12 kiyohara #define F_POWER (0x00000200) /* USB reported power state */
120 1.12 kiyohara #define F_ACTIVE (0x00000400)
121 1.12 kiyohara #define F_CALLBACK (0x00000800) /* Callback scheduled */
122 1.12 kiyohara #define F_SOFCHECK1 (0x00001000)
123 1.12 kiyohara #define F_SOFCHECK2 (0x00002000)
124 1.12 kiyohara #define F_CRESET (0x00004000) /* Reset done not reported */
125 1.12 kiyohara #define F_CCONNECT (0x00008000) /* Connect change not reported */
126 1.12 kiyohara #define F_RESET (0x00010000)
127 1.12 kiyohara #define F_ISOC_WARNED (0x00020000)
128 1.12 kiyohara #define F_LSVH_WARNED (0x00040000)
129 1.12 kiyohara
130 1.12 kiyohara #define F_DISABLED (F_NODEV|F_UDISABLED)
131 1.12 kiyohara #define F_CHANGE (F_CRESET|F_CCONNECT)
132 1.12 kiyohara
133 1.12 kiyohara #ifdef SLHCI_TRY_LSVH
134 1.12 kiyohara unsigned int slhci_try_lsvh = 1;
135 1.12 kiyohara #else
136 1.12 kiyohara unsigned int slhci_try_lsvh = 0;
137 1.12 kiyohara #endif
138 1.12 kiyohara
139 1.12 kiyohara #define ADR 0
140 1.12 kiyohara #define LEN 1
141 1.12 kiyohara #define PID 2
142 1.12 kiyohara #define DEV 3
143 1.12 kiyohara #define STAT 2
144 1.12 kiyohara #define CONT 3
145 1.12 kiyohara
146 1.12 kiyohara #define A 0
147 1.12 kiyohara #define B 1
148 1.12 kiyohara
149 1.36 skrll static const uint8_t slhci_tregs[2][4] =
150 1.12 kiyohara {{SL11_E0ADDR, SL11_E0LEN, SL11_E0PID, SL11_E0DEV },
151 1.12 kiyohara {SL11_E1ADDR, SL11_E1LEN, SL11_E1PID, SL11_E1DEV }};
152 1.12 kiyohara
153 1.12 kiyohara #define PT_ROOT_CTRL 0
154 1.12 kiyohara #define PT_ROOT_INTR 1
155 1.12 kiyohara #define PT_CTRL_SETUP 2
156 1.12 kiyohara #define PT_CTRL_DATA 3
157 1.12 kiyohara #define PT_CTRL_STATUS 4
158 1.12 kiyohara #define PT_INTR 5
159 1.12 kiyohara #define PT_BULK 6
160 1.12 kiyohara #define PT_MAX 6
161 1.12 kiyohara
162 1.12 kiyohara #ifdef SLHCI_DEBUG
163 1.12 kiyohara #define SLHCI_MEM_ACCOUNTING
164 1.12 kiyohara static const char *
165 1.12 kiyohara pnames(int ptype)
166 1.12 kiyohara {
167 1.36 skrll static const char * const names[] = { "ROOT Ctrl", "ROOT Intr",
168 1.12 kiyohara "Control (setup)", "Control (data)", "Control (status)",
169 1.12 kiyohara "Interrupt", "Bulk", "BAD PTYPE" };
170 1.12 kiyohara
171 1.12 kiyohara KASSERT(sizeof(names) / sizeof(names[0]) == PT_MAX + 2);
172 1.12 kiyohara if (ptype > PT_MAX)
173 1.12 kiyohara ptype = PT_MAX + 1;
174 1.12 kiyohara return names[ptype];
175 1.12 kiyohara }
176 1.12 kiyohara #endif
177 1.12 kiyohara
178 1.34 skrll /*
179 1.34 skrll * Maximum allowable reserved bus time. Since intr/isoc transfers have
180 1.37 skrll * unconditional priority, this is all that ensures control and bulk transfers
181 1.37 skrll * get a chance. It is a single value for all frames since all transfers can
182 1.37 skrll * use multiple consecutive frames if an error is encountered. Note that it
183 1.37 skrll * is not really possible to fill the bus with transfers, so this value should
184 1.37 skrll * be on the low side. Defaults to giving a warning unless SLHCI_NO_OVERTIME
185 1.34 skrll * is defined. Full time is 12000 - END_BUSTIME.
186 1.34 skrll */
187 1.12 kiyohara #ifndef SLHCI_RESERVED_BUSTIME
188 1.12 kiyohara #define SLHCI_RESERVED_BUSTIME 5000
189 1.12 kiyohara #endif
190 1.12 kiyohara
191 1.34 skrll /*
192 1.34 skrll * Rate for "exceeds reserved bus time" warnings (default) or errors.
193 1.37 skrll * Warnings only happen when an endpoint open causes the time to go above
194 1.34 skrll * SLHCI_RESERVED_BUSTIME, not if it is already above.
195 1.34 skrll */
196 1.12 kiyohara #ifndef SLHCI_OVERTIME_WARNING_RATE
197 1.12 kiyohara #define SLHCI_OVERTIME_WARNING_RATE { 60, 0 } /* 60 seconds */
198 1.12 kiyohara #endif
199 1.12 kiyohara static const struct timeval reserved_warn_rate = SLHCI_OVERTIME_WARNING_RATE;
200 1.12 kiyohara
201 1.12 kiyohara /* Rate for overflow warnings */
202 1.12 kiyohara #ifndef SLHCI_OVERFLOW_WARNING_RATE
203 1.12 kiyohara #define SLHCI_OVERFLOW_WARNING_RATE { 60, 0 } /* 60 seconds */
204 1.12 kiyohara #endif
205 1.12 kiyohara static const struct timeval overflow_warn_rate = SLHCI_OVERFLOW_WARNING_RATE;
206 1.12 kiyohara
207 1.34 skrll /*
208 1.34 skrll * For EOF, the spec says 42 bit times, plus (I think) a possible hub skew of
209 1.12 kiyohara * 20 bit times. By default leave 66 bit times to start the transfer beyond
210 1.12 kiyohara * the required time. Units are full-speed bit times (a bit over 5us per 64).
211 1.34 skrll * Only multiples of 64 are significant.
212 1.34 skrll */
213 1.12 kiyohara #define SLHCI_STANDARD_END_BUSTIME 128
214 1.12 kiyohara #ifndef SLHCI_EXTRA_END_BUSTIME
215 1.12 kiyohara #define SLHCI_EXTRA_END_BUSTIME 0
216 1.12 kiyohara #endif
217 1.12 kiyohara
218 1.12 kiyohara #define SLHCI_END_BUSTIME (SLHCI_STANDARD_END_BUSTIME+SLHCI_EXTRA_END_BUSTIME)
219 1.12 kiyohara
220 1.34 skrll /*
221 1.34 skrll * This is an approximation of the USB worst-case timings presented on p. 54 of
222 1.37 skrll * the USB 1.1 spec translated to full speed bit times.
223 1.37 skrll * FS = full speed with handshake, FSII = isoc in, FSIO = isoc out,
224 1.34 skrll * FSI = isoc (worst case), LS = low speed
225 1.34 skrll */
226 1.12 kiyohara #define SLHCI_FS_CONST 114
227 1.12 kiyohara #define SLHCI_FSII_CONST 92
228 1.12 kiyohara #define SLHCI_FSIO_CONST 80
229 1.12 kiyohara #define SLHCI_FSI_CONST 92
230 1.12 kiyohara #define SLHCI_LS_CONST 804
231 1.12 kiyohara #ifndef SLHCI_PRECICE_BUSTIME
232 1.34 skrll /*
233 1.34 skrll * These values are < 3% too high (compared to the multiply and divide) for
234 1.34 skrll * max sized packets.
235 1.34 skrll */
236 1.12 kiyohara #define SLHCI_FS_DATA_TIME(len) (((u_int)(len)<<3)+(len)+((len)>>1))
237 1.12 kiyohara #define SLHCI_LS_DATA_TIME(len) (((u_int)(len)<<6)+((u_int)(len)<<4))
238 1.12 kiyohara #else
239 1.12 kiyohara #define SLHCI_FS_DATA_TIME(len) (56*(len)/6)
240 1.12 kiyohara #define SLHCI_LS_DATA_TIME(len) (449*(len)/6)
241 1.12 kiyohara #endif
242 1.12 kiyohara
243 1.34 skrll /*
244 1.34 skrll * Set SLHCI_WAIT_SIZE to the desired maximum size of single FS transfer
245 1.12 kiyohara * to poll for after starting a transfer. 64 gets all full speed transfers.
246 1.36 skrll * Note that even if 0 polling will occur if data equal or greater than the
247 1.12 kiyohara * transfer size is copied to the chip while the transfer is in progress.
248 1.12 kiyohara * Setting SLHCI_WAIT_TIME to -12000 will disable polling.
249 1.12 kiyohara */
250 1.12 kiyohara #ifndef SLHCI_WAIT_SIZE
251 1.12 kiyohara #define SLHCI_WAIT_SIZE 8
252 1.12 kiyohara #endif
253 1.12 kiyohara #ifndef SLHCI_WAIT_TIME
254 1.12 kiyohara #define SLHCI_WAIT_TIME (SLHCI_FS_CONST + \
255 1.12 kiyohara SLHCI_FS_DATA_TIME(SLHCI_WAIT_SIZE))
256 1.12 kiyohara #endif
257 1.12 kiyohara const int slhci_wait_time = SLHCI_WAIT_TIME;
258 1.1 isaki
259 1.12 kiyohara #ifndef SLHCI_MAX_RETRIES
260 1.12 kiyohara #define SLHCI_MAX_RETRIES 3
261 1.12 kiyohara #endif
262 1.1 isaki
263 1.12 kiyohara /* Check IER values for corruption after this many unrecognized interrupts. */
264 1.12 kiyohara #ifndef SLHCI_IER_CHECK_FREQUENCY
265 1.1 isaki #ifdef SLHCI_DEBUG
266 1.12 kiyohara #define SLHCI_IER_CHECK_FREQUENCY 1
267 1.1 isaki #else
268 1.12 kiyohara #define SLHCI_IER_CHECK_FREQUENCY 100
269 1.1 isaki #endif
270 1.12 kiyohara #endif
271 1.12 kiyohara
272 1.12 kiyohara /* Note that buffer points to the start of the buffer for this transfer. */
273 1.12 kiyohara struct slhci_pipe {
274 1.12 kiyohara struct usbd_pipe pipe;
275 1.12 kiyohara struct usbd_xfer *xfer; /* xfer in progress */
276 1.12 kiyohara uint8_t *buffer; /* I/O buffer (if needed) */
277 1.12 kiyohara struct gcq ap; /* All pipes */
278 1.12 kiyohara struct gcq to; /* Timeout list */
279 1.12 kiyohara struct gcq xq; /* Xfer queues */
280 1.12 kiyohara unsigned int pflags; /* Pipe flags */
281 1.12 kiyohara #define PF_GONE (0x01) /* Pipe is on disabled device */
282 1.12 kiyohara #define PF_TOGGLE (0x02) /* Data toggle status */
283 1.12 kiyohara #define PF_LS (0x04) /* Pipe is low speed */
284 1.12 kiyohara #define PF_PREAMBLE (0x08) /* Needs preamble */
285 1.12 kiyohara Frame to_frame; /* Frame number for timeout */
286 1.12 kiyohara Frame frame; /* Frame number for intr xfer */
287 1.12 kiyohara Frame lastframe; /* Previous frame number for intr */
288 1.12 kiyohara uint16_t bustime; /* Worst case bus time usage */
289 1.12 kiyohara uint16_t newbustime[2]; /* new bustimes (see index below) */
290 1.12 kiyohara uint8_t tregs[4]; /* ADR, LEN, PID, DEV */
291 1.12 kiyohara uint8_t newlen[2]; /* 0 = short data, 1 = ctrl data */
292 1.12 kiyohara uint8_t newpid; /* for ctrl */
293 1.12 kiyohara uint8_t wantshort; /* last xfer must be short */
294 1.12 kiyohara uint8_t control; /* Host control register settings */
295 1.12 kiyohara uint8_t nerrs; /* Current number of errors */
296 1.12 kiyohara uint8_t ptype; /* Pipe type */
297 1.12 kiyohara };
298 1.1 isaki
299 1.48 skrll #define SLHCI_BUS2SC(bus) ((bus)->ub_hcpriv)
300 1.48 skrll #define SLHCI_PIPE2SC(pipe) SLHCI_BUS2SC((pipe)->up_dev->ud_bus)
301 1.48 skrll #define SLHCI_XFER2SC(xfer) SLHCI_BUS2SC((xfer)->ux_bus)
302 1.48 skrll
303 1.48 skrll #define SLHCI_PIPE2SPIPE(pipe) ((struct slhci_pipe *)(pipe))
304 1.55 skrll #define SLHCI_XFER2SPIPE(xfer) SLHCI_PIPE2SPIPE((xfer)->ux_pipe)
305 1.55 skrll
306 1.55 skrll #define SLHCI_XFER_TYPE(x) (SLHCI_XFER2SPIPE(xfer)->ptype)
307 1.48 skrll
308 1.12 kiyohara #ifdef SLHCI_PROFILE_TRANSFER
309 1.12 kiyohara #if defined(__mips__)
310 1.34 skrll /*
311 1.34 skrll * MIPS cycle counter does not directly count cpu cycles but is a different
312 1.34 skrll * fraction of cpu cycles depending on the cpu.
313 1.34 skrll */
314 1.48 skrll typedef uint32_t cc_type;
315 1.12 kiyohara #define CC_TYPE_FMT "%u"
316 1.12 kiyohara #define slhci_cc_set(x) __asm volatile ("mfc0 %[cc], $9\n\tnop\n\tnop\n\tnop" \
317 1.12 kiyohara : [cc] "=r"(x))
318 1.12 kiyohara #elif defined(__i386__)
319 1.48 skrll typedef uint64_t cc_type;
320 1.12 kiyohara #define CC_TYPE_FMT "%llu"
321 1.12 kiyohara #define slhci_cc_set(x) __asm volatile ("rdtsc" : "=A"(x))
322 1.12 kiyohara #else
323 1.12 kiyohara #error "SLHCI_PROFILE_TRANSFER not implemented on this MACHINE_ARCH (see sys/dev/ic/sl811hs.c)"
324 1.12 kiyohara #endif
325 1.12 kiyohara struct slhci_cc_time {
326 1.12 kiyohara cc_type start;
327 1.12 kiyohara cc_type stop;
328 1.12 kiyohara unsigned int miscdata;
329 1.12 kiyohara };
330 1.12 kiyohara #ifndef SLHCI_N_TIMES
331 1.12 kiyohara #define SLHCI_N_TIMES 200
332 1.12 kiyohara #endif
333 1.12 kiyohara struct slhci_cc_times {
334 1.12 kiyohara struct slhci_cc_time times[SLHCI_N_TIMES];
335 1.12 kiyohara int current;
336 1.12 kiyohara int wraparound;
337 1.1 isaki };
338 1.1 isaki
339 1.12 kiyohara static struct slhci_cc_times t_ab[2];
340 1.12 kiyohara static struct slhci_cc_times t_abdone;
341 1.12 kiyohara static struct slhci_cc_times t_copy_to_dev;
342 1.12 kiyohara static struct slhci_cc_times t_copy_from_dev;
343 1.12 kiyohara static struct slhci_cc_times t_intr;
344 1.12 kiyohara static struct slhci_cc_times t_lock;
345 1.12 kiyohara static struct slhci_cc_times t_delay;
346 1.12 kiyohara static struct slhci_cc_times t_hard_int;
347 1.12 kiyohara static struct slhci_cc_times t_callback;
348 1.12 kiyohara
349 1.12 kiyohara static inline void
350 1.12 kiyohara start_cc_time(struct slhci_cc_times *times, unsigned int misc) {
351 1.12 kiyohara times->times[times->current].miscdata = misc;
352 1.12 kiyohara slhci_cc_set(times->times[times->current].start);
353 1.12 kiyohara }
354 1.12 kiyohara static inline void
355 1.12 kiyohara stop_cc_time(struct slhci_cc_times *times) {
356 1.12 kiyohara slhci_cc_set(times->times[times->current].stop);
357 1.12 kiyohara if (++times->current >= SLHCI_N_TIMES) {
358 1.12 kiyohara times->current = 0;
359 1.12 kiyohara times->wraparound = 1;
360 1.12 kiyohara }
361 1.12 kiyohara }
362 1.12 kiyohara
363 1.12 kiyohara void slhci_dump_cc_times(int);
364 1.12 kiyohara
365 1.12 kiyohara void
366 1.12 kiyohara slhci_dump_cc_times(int n) {
367 1.12 kiyohara struct slhci_cc_times *times;
368 1.12 kiyohara int i;
369 1.12 kiyohara
370 1.12 kiyohara switch (n) {
371 1.12 kiyohara default:
372 1.12 kiyohara case 0:
373 1.12 kiyohara printf("USBA start transfer to intr:\n");
374 1.12 kiyohara times = &t_ab[A];
375 1.12 kiyohara break;
376 1.12 kiyohara case 1:
377 1.12 kiyohara printf("USBB start transfer to intr:\n");
378 1.12 kiyohara times = &t_ab[B];
379 1.12 kiyohara break;
380 1.12 kiyohara case 2:
381 1.12 kiyohara printf("abdone:\n");
382 1.12 kiyohara times = &t_abdone;
383 1.12 kiyohara break;
384 1.12 kiyohara case 3:
385 1.12 kiyohara printf("copy to device:\n");
386 1.12 kiyohara times = &t_copy_to_dev;
387 1.12 kiyohara break;
388 1.12 kiyohara case 4:
389 1.12 kiyohara printf("copy from device:\n");
390 1.12 kiyohara times = &t_copy_from_dev;
391 1.12 kiyohara break;
392 1.12 kiyohara case 5:
393 1.12 kiyohara printf("intr to intr:\n");
394 1.12 kiyohara times = &t_intr;
395 1.12 kiyohara break;
396 1.12 kiyohara case 6:
397 1.12 kiyohara printf("lock to release:\n");
398 1.12 kiyohara times = &t_lock;
399 1.12 kiyohara break;
400 1.12 kiyohara case 7:
401 1.12 kiyohara printf("delay time:\n");
402 1.12 kiyohara times = &t_delay;
403 1.12 kiyohara break;
404 1.12 kiyohara case 8:
405 1.12 kiyohara printf("hard interrupt enter to exit:\n");
406 1.12 kiyohara times = &t_hard_int;
407 1.12 kiyohara break;
408 1.12 kiyohara case 9:
409 1.12 kiyohara printf("callback:\n");
410 1.12 kiyohara times = &t_callback;
411 1.12 kiyohara break;
412 1.12 kiyohara }
413 1.12 kiyohara
414 1.12 kiyohara if (times->wraparound)
415 1.12 kiyohara for (i = times->current + 1; i < SLHCI_N_TIMES; i++)
416 1.36 skrll printf("start " CC_TYPE_FMT " stop " CC_TYPE_FMT
417 1.36 skrll " difference %8i miscdata %#x\n",
418 1.36 skrll times->times[i].start, times->times[i].stop,
419 1.36 skrll (int)(times->times[i].stop -
420 1.12 kiyohara times->times[i].start), times->times[i].miscdata);
421 1.12 kiyohara
422 1.12 kiyohara for (i = 0; i < times->current; i++)
423 1.36 skrll printf("start " CC_TYPE_FMT " stop " CC_TYPE_FMT
424 1.36 skrll " difference %8i miscdata %#x\n", times->times[i].start,
425 1.36 skrll times->times[i].stop, (int)(times->times[i].stop -
426 1.12 kiyohara times->times[i].start), times->times[i].miscdata);
427 1.12 kiyohara }
428 1.12 kiyohara #else
429 1.12 kiyohara #define start_cc_time(x, y)
430 1.12 kiyohara #define stop_cc_time(x)
431 1.12 kiyohara #endif /* SLHCI_PROFILE_TRANSFER */
432 1.12 kiyohara
433 1.36 skrll typedef usbd_status (*LockCallFunc)(struct slhci_softc *, struct slhci_pipe
434 1.12 kiyohara *, struct usbd_xfer *);
435 1.12 kiyohara
436 1.48 skrll struct usbd_xfer * slhci_allocx(struct usbd_bus *, unsigned int);
437 1.12 kiyohara void slhci_freex(struct usbd_bus *, struct usbd_xfer *);
438 1.41 skrll static void slhci_get_lock(struct usbd_bus *, kmutex_t **);
439 1.12 kiyohara
440 1.12 kiyohara usbd_status slhci_transfer(struct usbd_xfer *);
441 1.12 kiyohara usbd_status slhci_start(struct usbd_xfer *);
442 1.12 kiyohara usbd_status slhci_root_start(struct usbd_xfer *);
443 1.12 kiyohara usbd_status slhci_open(struct usbd_pipe *);
444 1.12 kiyohara
445 1.48 skrll static int slhci_roothub_ctrl(struct usbd_bus *, usb_device_request_t *,
446 1.48 skrll void *, int);
447 1.48 skrll
448 1.34 skrll /*
449 1.34 skrll * slhci_supported_rev, slhci_preinit, slhci_attach, slhci_detach,
450 1.34 skrll * slhci_activate
451 1.34 skrll */
452 1.12 kiyohara
453 1.12 kiyohara void slhci_abort(struct usbd_xfer *);
454 1.12 kiyohara void slhci_close(struct usbd_pipe *);
455 1.12 kiyohara void slhci_clear_toggle(struct usbd_pipe *);
456 1.12 kiyohara void slhci_poll(struct usbd_bus *);
457 1.12 kiyohara void slhci_done(struct usbd_xfer *);
458 1.12 kiyohara void slhci_void(void *);
459 1.12 kiyohara
460 1.12 kiyohara /* lock entry functions */
461 1.12 kiyohara
462 1.12 kiyohara #ifdef SLHCI_MEM_ACCOUNTING
463 1.12 kiyohara void slhci_mem_use(struct usbd_bus *, int);
464 1.12 kiyohara #endif
465 1.12 kiyohara
466 1.12 kiyohara void slhci_reset_entry(void *);
467 1.36 skrll usbd_status slhci_lock_call(struct slhci_softc *, LockCallFunc,
468 1.12 kiyohara struct slhci_pipe *, struct usbd_xfer *);
469 1.12 kiyohara void slhci_start_entry(struct slhci_softc *, struct slhci_pipe *);
470 1.12 kiyohara void slhci_callback_entry(void *arg);
471 1.41 skrll void slhci_do_callback(struct slhci_softc *, struct usbd_xfer *);
472 1.12 kiyohara
473 1.12 kiyohara /* slhci_intr */
474 1.12 kiyohara
475 1.41 skrll void slhci_main(struct slhci_softc *);
476 1.12 kiyohara
477 1.12 kiyohara /* in lock functions */
478 1.12 kiyohara
479 1.12 kiyohara static void slhci_write(struct slhci_softc *, uint8_t, uint8_t);
480 1.12 kiyohara static uint8_t slhci_read(struct slhci_softc *, uint8_t);
481 1.12 kiyohara static void slhci_write_multi(struct slhci_softc *, uint8_t, uint8_t *, int);
482 1.12 kiyohara static void slhci_read_multi(struct slhci_softc *, uint8_t, uint8_t *, int);
483 1.12 kiyohara
484 1.12 kiyohara static void slhci_waitintr(struct slhci_softc *, int);
485 1.12 kiyohara static int slhci_dointr(struct slhci_softc *);
486 1.12 kiyohara static void slhci_abdone(struct slhci_softc *, int);
487 1.12 kiyohara static void slhci_tstart(struct slhci_softc *);
488 1.12 kiyohara static void slhci_dotransfer(struct slhci_softc *);
489 1.12 kiyohara
490 1.41 skrll static void slhci_callback(struct slhci_softc *);
491 1.12 kiyohara static void slhci_enter_xfer(struct slhci_softc *, struct slhci_pipe *);
492 1.12 kiyohara static void slhci_enter_xfers(struct slhci_softc *);
493 1.12 kiyohara static void slhci_queue_timed(struct slhci_softc *, struct slhci_pipe *);
494 1.12 kiyohara static void slhci_xfer_timer(struct slhci_softc *, struct slhci_pipe *);
495 1.12 kiyohara
496 1.12 kiyohara static void slhci_do_repeat(struct slhci_softc *, struct usbd_xfer *);
497 1.12 kiyohara static void slhci_callback_schedule(struct slhci_softc *);
498 1.12 kiyohara static void slhci_do_callback_schedule(struct slhci_softc *);
499 1.12 kiyohara #if 0
500 1.41 skrll void slhci_pollxfer(struct slhci_softc *, struct usbd_xfer *); /* XXX */
501 1.12 kiyohara #endif
502 1.12 kiyohara
503 1.36 skrll static usbd_status slhci_do_poll(struct slhci_softc *, struct slhci_pipe *,
504 1.12 kiyohara struct usbd_xfer *);
505 1.36 skrll static usbd_status slhci_lsvh_warn(struct slhci_softc *, struct slhci_pipe *,
506 1.12 kiyohara struct usbd_xfer *);
507 1.36 skrll static usbd_status slhci_isoc_warn(struct slhci_softc *, struct slhci_pipe *,
508 1.12 kiyohara struct usbd_xfer *);
509 1.36 skrll static usbd_status slhci_open_pipe(struct slhci_softc *, struct slhci_pipe *,
510 1.12 kiyohara struct usbd_xfer *);
511 1.36 skrll static usbd_status slhci_close_pipe(struct slhci_softc *, struct slhci_pipe *,
512 1.12 kiyohara struct usbd_xfer *);
513 1.36 skrll static usbd_status slhci_do_abort(struct slhci_softc *, struct slhci_pipe *,
514 1.12 kiyohara struct usbd_xfer *);
515 1.36 skrll static usbd_status slhci_halt(struct slhci_softc *, struct slhci_pipe *,
516 1.12 kiyohara struct usbd_xfer *);
517 1.12 kiyohara
518 1.12 kiyohara static void slhci_intrchange(struct slhci_softc *, uint8_t);
519 1.12 kiyohara static void slhci_drain(struct slhci_softc *);
520 1.12 kiyohara static void slhci_reset(struct slhci_softc *);
521 1.36 skrll static int slhci_reserve_bustime(struct slhci_softc *, struct slhci_pipe *,
522 1.12 kiyohara int);
523 1.12 kiyohara static void slhci_insert(struct slhci_softc *);
524 1.12 kiyohara
525 1.12 kiyohara static usbd_status slhci_clear_feature(struct slhci_softc *, unsigned int);
526 1.12 kiyohara static usbd_status slhci_set_feature(struct slhci_softc *, unsigned int);
527 1.12 kiyohara static void slhci_get_status(struct slhci_softc *, usb_port_status_t *);
528 1.36 skrll static usbd_status slhci_root(struct slhci_softc *, struct slhci_pipe *,
529 1.12 kiyohara struct usbd_xfer *);
530 1.12 kiyohara
531 1.56 skrll #define SLHCIHIST_FUNC() USBHIST_FUNC()
532 1.56 skrll #define SLHCIHIST_CALLED() USBHIST_CALLED(slhcidebug)
533 1.56 skrll
534 1.12 kiyohara #ifdef SLHCI_DEBUG
535 1.12 kiyohara void slhci_log_buffer(struct usbd_xfer *);
536 1.12 kiyohara void slhci_log_req(usb_device_request_t *);
537 1.12 kiyohara void slhci_log_req_hub(usb_device_request_t *);
538 1.12 kiyohara void slhci_log_dumpreg(void);
539 1.12 kiyohara void slhci_log_xfer(struct usbd_xfer *);
540 1.12 kiyohara void slhci_log_spipe(struct slhci_pipe *);
541 1.12 kiyohara void slhci_print_intr(void);
542 1.12 kiyohara void slhci_log_sc(void);
543 1.12 kiyohara void slhci_log_slreq(struct slhci_pipe *);
544 1.12 kiyohara
545 1.12 kiyohara /* Constified so you can read the values from ddb */
546 1.12 kiyohara const int SLHCI_D_TRACE = 0x0001;
547 1.12 kiyohara const int SLHCI_D_MSG = 0x0002;
548 1.12 kiyohara const int SLHCI_D_XFER = 0x0004;
549 1.12 kiyohara const int SLHCI_D_MEM = 0x0008;
550 1.12 kiyohara const int SLHCI_D_INTR = 0x0010;
551 1.12 kiyohara const int SLHCI_D_SXFER = 0x0020;
552 1.12 kiyohara const int SLHCI_D_ERR = 0x0080;
553 1.12 kiyohara const int SLHCI_D_BUF = 0x0100;
554 1.12 kiyohara const int SLHCI_D_SOFT = 0x0200;
555 1.12 kiyohara const int SLHCI_D_WAIT = 0x0400;
556 1.12 kiyohara const int SLHCI_D_ROOT = 0x0800;
557 1.12 kiyohara /* SOF/NAK alone normally ignored, SOF also needs D_INTR */
558 1.12 kiyohara const int SLHCI_D_SOF = 0x1000;
559 1.12 kiyohara const int SLHCI_D_NAK = 0x2000;
560 1.12 kiyohara
561 1.51 skrll int slhcidebug = 0x1cbc; /* 0xc8c; */ /* 0xffff; */ /* 0xd8c; */
562 1.12 kiyohara
563 1.56 skrll SYSCTL_SETUP(sysctl_hw_slhci_setup, "sysctl hw.slhci setup")
564 1.56 skrll {
565 1.56 skrll int err;
566 1.56 skrll const struct sysctlnode *rnode;
567 1.56 skrll const struct sysctlnode *cnode;
568 1.56 skrll
569 1.56 skrll err = sysctl_createv(clog, 0, NULL, &rnode,
570 1.56 skrll CTLFLAG_PERMANENT, CTLTYPE_NODE, "slhci",
571 1.56 skrll SYSCTL_DESCR("slhci global controls"),
572 1.56 skrll NULL, 0, NULL, 0, CTL_HW, CTL_CREATE, CTL_EOL);
573 1.56 skrll
574 1.56 skrll if (err)
575 1.56 skrll goto fail;
576 1.56 skrll
577 1.56 skrll /* control debugging printfs */
578 1.56 skrll err = sysctl_createv(clog, 0, &rnode, &cnode,
579 1.56 skrll CTLFLAG_PERMANENT|CTLFLAG_READWRITE, CTLTYPE_INT,
580 1.56 skrll "debug", SYSCTL_DESCR("Enable debugging output"),
581 1.56 skrll NULL, 0, &slhcidebug, sizeof(slhcidebug), CTL_CREATE, CTL_EOL);
582 1.56 skrll if (err)
583 1.56 skrll goto fail;
584 1.56 skrll
585 1.56 skrll return;
586 1.56 skrll fail:
587 1.56 skrll aprint_error("%s: sysctl_createv failed (err = %d)\n", __func__, err);
588 1.56 skrll }
589 1.28 mrg
590 1.56 skrll struct slhci_softc *ssc;
591 1.12 kiyohara
592 1.51 skrll #define SLHCI_DEXEC(x, y) do { if ((slhcidebug & SLHCI_ ## x)) { y; } \
593 1.12 kiyohara } while (/*CONSTCOND*/ 0)
594 1.56 skrll #define DDOLOG(f, a, b, c, d) do { KERNHIST_LOG(usbhist, f, a, b, c, d); \
595 1.12 kiyohara } while (/*CONSTCOND*/0)
596 1.12 kiyohara #define DLOG(x, f, a, b, c, d) SLHCI_DEXEC(x, DDOLOG(f, a, b, c, d))
597 1.34 skrll /*
598 1.34 skrll * DLOGFLAG8 is a macro not a function so that flag name expressions are not
599 1.37 skrll * evaluated unless the flag bit is set (which could save a register read).
600 1.37 skrll * x is debug mask, y is flag identifier, z is flag variable,
601 1.34 skrll * a-h are flag names (must evaluate to string constants, msb first).
602 1.34 skrll */
603 1.12 kiyohara #define DDOLOGFLAG8(y, z, a, b, c, d, e, f, g, h) do { uint8_t _DLF8 = (z); \
604 1.56 skrll if (_DLF8 & 0xf0) KERNHIST_LOG(usbhist, y " %s %s %s %s", _DLF8 & 0x80 ? \
605 1.12 kiyohara (a) : "", _DLF8 & 0x40 ? (b) : "", _DLF8 & 0x20 ? (c) : "", _DLF8 & 0x10 ? \
606 1.56 skrll (d) : ""); if (_DLF8 & 0x0f) KERNHIST_LOG(usbhist, y " %s %s %s %s", \
607 1.12 kiyohara _DLF8 & 0x08 ? (e) : "", _DLF8 & 0x04 ? (f) : "", _DLF8 & 0x02 ? (g) : "", \
608 1.12 kiyohara _DLF8 & 0x01 ? (h) : ""); \
609 1.12 kiyohara } while (/*CONSTCOND*/ 0)
610 1.12 kiyohara #define DLOGFLAG8(x, y, z, a, b, c, d, e, f, g, h) \
611 1.12 kiyohara SLHCI_DEXEC(x, DDOLOGFLAG8(y, z, a, b, c, d, e, f, g, h))
612 1.34 skrll /*
613 1.34 skrll * DDOLOGBUF logs a buffer up to 8 bytes at a time. No identifier so that we
614 1.34 skrll * can make it a real function.
615 1.34 skrll */
616 1.12 kiyohara static void
617 1.12 kiyohara DDOLOGBUF(uint8_t *buf, unsigned int length)
618 1.12 kiyohara {
619 1.56 skrll SLHCIHIST_FUNC(); SLHCIHIST_CALLED();
620 1.12 kiyohara int i;
621 1.12 kiyohara
622 1.12 kiyohara for(i=0; i+8 <= length; i+=8)
623 1.12 kiyohara DDOLOG("%.4x %.4x %.4x %.4x", (buf[i] << 8) | buf[i+1],
624 1.12 kiyohara (buf[i+2] << 8) | buf[i+3], (buf[i+4] << 8) | buf[i+5],
625 1.12 kiyohara (buf[i+6] << 8) | buf[i+7]);
626 1.12 kiyohara if (length == i+7)
627 1.12 kiyohara DDOLOG("%.4x %.4x %.4x %.2x", (buf[i] << 8) | buf[i+1],
628 1.12 kiyohara (buf[i+2] << 8) | buf[i+3], (buf[i+4] << 8) | buf[i+5],
629 1.12 kiyohara buf[i+6]);
630 1.12 kiyohara else if (length == i+6)
631 1.12 kiyohara DDOLOG("%.4x %.4x %.4x", (buf[i] << 8) | buf[i+1],
632 1.12 kiyohara (buf[i+2] << 8) | buf[i+3], (buf[i+4] << 8) | buf[i+5], 0);
633 1.12 kiyohara else if (length == i+5)
634 1.12 kiyohara DDOLOG("%.4x %.4x %.2x", (buf[i] << 8) | buf[i+1],
635 1.12 kiyohara (buf[i+2] << 8) | buf[i+3], buf[i+4], 0);
636 1.12 kiyohara else if (length == i+4)
637 1.12 kiyohara DDOLOG("%.4x %.4x", (buf[i] << 8) | buf[i+1],
638 1.12 kiyohara (buf[i+2] << 8) | buf[i+3], 0,0);
639 1.12 kiyohara else if (length == i+3)
640 1.12 kiyohara DDOLOG("%.4x %.2x", (buf[i] << 8) | buf[i+1], buf[i+2], 0,0);
641 1.12 kiyohara else if (length == i+2)
642 1.12 kiyohara DDOLOG("%.4x", (buf[i] << 8) | buf[i+1], 0,0,0);
643 1.12 kiyohara else if (length == i+1)
644 1.12 kiyohara DDOLOG("%.2x", buf[i], 0,0,0);
645 1.12 kiyohara }
646 1.12 kiyohara #define DLOGBUF(x, b, l) SLHCI_DEXEC(x, DDOLOGBUF(b, l))
647 1.12 kiyohara #else /* now !SLHCI_DEBUG */
648 1.56 skrll #define slhcidebug 0
649 1.12 kiyohara #define slhci_log_spipe(spipe) ((void)0)
650 1.12 kiyohara #define slhci_log_xfer(xfer) ((void)0)
651 1.12 kiyohara #define SLHCI_DEXEC(x, y) ((void)0)
652 1.12 kiyohara #define DDOLOG(f, a, b, c, d) ((void)0)
653 1.12 kiyohara #define DLOG(x, f, a, b, c, d) ((void)0)
654 1.12 kiyohara #define DDOLOGFLAG8(y, z, a, b, c, d, e, f, g, h) ((void)0)
655 1.12 kiyohara #define DLOGFLAG8(x, y, z, a, b, c, d, e, f, g, h) ((void)0)
656 1.12 kiyohara #define DDOLOGBUF(b, l) ((void)0)
657 1.12 kiyohara #define DLOGBUF(x, b, l) ((void)0)
658 1.12 kiyohara #endif /* SLHCI_DEBUG */
659 1.12 kiyohara
660 1.12 kiyohara #ifdef DIAGNOSTIC
661 1.12 kiyohara #define LK_SLASSERT(exp, sc, spipe, xfer, ext) do { \
662 1.12 kiyohara if (!(exp)) { \
663 1.12 kiyohara printf("%s: assertion %s failed line %u function %s!" \
664 1.12 kiyohara " halted\n", SC_NAME(sc), #exp, __LINE__, __func__);\
665 1.12 kiyohara DDOLOG("%s: assertion %s failed line %u function %s!" \
666 1.12 kiyohara " halted\n", SC_NAME(sc), #exp, __LINE__, __func__);\
667 1.12 kiyohara slhci_halt(sc, spipe, xfer); \
668 1.12 kiyohara ext; \
669 1.12 kiyohara } \
670 1.12 kiyohara } while (/*CONSTCOND*/0)
671 1.12 kiyohara #define UL_SLASSERT(exp, sc, spipe, xfer, ext) do { \
672 1.12 kiyohara if (!(exp)) { \
673 1.12 kiyohara printf("%s: assertion %s failed line %u function %s!" \
674 1.12 kiyohara " halted\n", SC_NAME(sc), #exp, __LINE__, __func__); \
675 1.12 kiyohara DDOLOG("%s: assertion %s failed line %u function %s!" \
676 1.12 kiyohara " halted\n", SC_NAME(sc), #exp, __LINE__, __func__); \
677 1.12 kiyohara slhci_lock_call(sc, &slhci_halt, spipe, xfer); \
678 1.12 kiyohara ext; \
679 1.12 kiyohara } \
680 1.12 kiyohara } while (/*CONSTCOND*/0)
681 1.12 kiyohara #else
682 1.12 kiyohara #define LK_SLASSERT(exp, sc, spipe, xfer, ext) ((void)0)
683 1.12 kiyohara #define UL_SLASSERT(exp, sc, spipe, xfer, ext) ((void)0)
684 1.12 kiyohara #endif
685 1.12 kiyohara
686 1.12 kiyohara const struct usbd_bus_methods slhci_bus_methods = {
687 1.48 skrll .ubm_open = slhci_open,
688 1.48 skrll .ubm_softint= slhci_void,
689 1.48 skrll .ubm_dopoll = slhci_poll,
690 1.48 skrll .ubm_allocx = slhci_allocx,
691 1.48 skrll .ubm_freex = slhci_freex,
692 1.48 skrll .ubm_getlock = slhci_get_lock,
693 1.48 skrll .ubm_rhctrl = slhci_roothub_ctrl,
694 1.1 isaki };
695 1.1 isaki
696 1.12 kiyohara const struct usbd_pipe_methods slhci_pipe_methods = {
697 1.48 skrll .upm_transfer = slhci_transfer,
698 1.48 skrll .upm_start = slhci_start,
699 1.48 skrll .upm_abort = slhci_abort,
700 1.48 skrll .upm_close = slhci_close,
701 1.48 skrll .upm_cleartoggle = slhci_clear_toggle,
702 1.48 skrll .upm_done = slhci_done,
703 1.1 isaki };
704 1.1 isaki
705 1.12 kiyohara const struct usbd_pipe_methods slhci_root_methods = {
706 1.48 skrll .upm_transfer = slhci_transfer,
707 1.48 skrll .upm_start = slhci_root_start,
708 1.48 skrll .upm_abort = slhci_abort,
709 1.48 skrll .upm_close = (void (*)(struct usbd_pipe *))slhci_void, /* XXX safe? */
710 1.48 skrll .upm_cleartoggle = slhci_clear_toggle,
711 1.48 skrll .upm_done = slhci_done,
712 1.1 isaki };
713 1.1 isaki
714 1.12 kiyohara /* Queue inlines */
715 1.12 kiyohara
716 1.12 kiyohara #define GOT_FIRST_TO(tvar, t) \
717 1.12 kiyohara GCQ_GOT_FIRST_TYPED(tvar, &(t)->to, struct slhci_pipe, to)
718 1.12 kiyohara
719 1.12 kiyohara #define FIND_TO(var, t, tvar, cond) \
720 1.12 kiyohara GCQ_FIND_TYPED(var, &(t)->to, tvar, struct slhci_pipe, to, cond)
721 1.12 kiyohara
722 1.12 kiyohara #define FOREACH_AP(var, t, tvar) \
723 1.12 kiyohara GCQ_FOREACH_TYPED(var, &(t)->ap, tvar, struct slhci_pipe, ap)
724 1.1 isaki
725 1.12 kiyohara #define GOT_FIRST_TIMED_COND(tvar, t, cond) \
726 1.12 kiyohara GCQ_GOT_FIRST_COND_TYPED(tvar, &(t)->timed, struct slhci_pipe, xq, cond)
727 1.1 isaki
728 1.12 kiyohara #define GOT_FIRST_CB(tvar, t) \
729 1.12 kiyohara GCQ_GOT_FIRST_TYPED(tvar, &(t)->q[Q_CB], struct slhci_pipe, xq)
730 1.1 isaki
731 1.12 kiyohara #define DEQUEUED_CALLBACK(tvar, t) \
732 1.12 kiyohara GCQ_DEQUEUED_FIRST_TYPED(tvar, &(t)->q[Q_CALLBACKS], struct slhci_pipe, xq)
733 1.1 isaki
734 1.12 kiyohara #define FIND_TIMED(var, t, tvar, cond) \
735 1.12 kiyohara GCQ_FIND_TYPED(var, &(t)->timed, tvar, struct slhci_pipe, xq, cond)
736 1.1 isaki
737 1.12 kiyohara #define DEQUEUED_WAITQ(tvar, sc) \
738 1.12 kiyohara GCQ_DEQUEUED_FIRST_TYPED(tvar, &(sc)->sc_waitq, struct slhci_pipe, xq)
739 1.1 isaki
740 1.12 kiyohara static inline void
741 1.12 kiyohara enter_waitq(struct slhci_softc *sc, struct slhci_pipe *spipe)
742 1.1 isaki {
743 1.12 kiyohara gcq_insert_tail(&sc->sc_waitq, &spipe->xq);
744 1.1 isaki }
745 1.1 isaki
746 1.1 isaki static inline void
747 1.12 kiyohara enter_q(struct slhci_transfers *t, struct slhci_pipe *spipe, int i)
748 1.1 isaki {
749 1.12 kiyohara gcq_insert_tail(&t->q[i], &spipe->xq);
750 1.1 isaki }
751 1.1 isaki
752 1.1 isaki static inline void
753 1.12 kiyohara enter_callback(struct slhci_transfers *t, struct slhci_pipe *spipe)
754 1.1 isaki {
755 1.12 kiyohara gcq_insert_tail(&t->q[Q_CALLBACKS], &spipe->xq);
756 1.1 isaki }
757 1.1 isaki
758 1.1 isaki static inline void
759 1.12 kiyohara enter_all_pipes(struct slhci_transfers *t, struct slhci_pipe *spipe)
760 1.1 isaki {
761 1.12 kiyohara gcq_insert_tail(&t->ap, &spipe->ap);
762 1.1 isaki }
763 1.1 isaki
764 1.12 kiyohara /* Start out of lock functions. */
765 1.12 kiyohara
766 1.12 kiyohara struct usbd_xfer *
767 1.48 skrll slhci_allocx(struct usbd_bus *bus, unsigned int nframes)
768 1.1 isaki {
769 1.56 skrll SLHCIHIST_FUNC(); SLHCIHIST_CALLED();
770 1.12 kiyohara struct usbd_xfer *xfer;
771 1.12 kiyohara
772 1.48 skrll xfer = kmem_zalloc(sizeof(*xfer), KM_SLEEP);
773 1.1 isaki
774 1.12 kiyohara DLOG(D_MEM, "allocx %p", xfer, 0,0,0);
775 1.12 kiyohara
776 1.12 kiyohara #ifdef SLHCI_MEM_ACCOUNTING
777 1.12 kiyohara slhci_mem_use(bus, 1);
778 1.12 kiyohara #endif
779 1.12 kiyohara #ifdef DIAGNOSTIC
780 1.12 kiyohara if (xfer != NULL)
781 1.48 skrll xfer->ux_state = XFER_BUSY;
782 1.12 kiyohara #endif
783 1.12 kiyohara return xfer;
784 1.12 kiyohara }
785 1.12 kiyohara
786 1.12 kiyohara void
787 1.12 kiyohara slhci_freex(struct usbd_bus *bus, struct usbd_xfer *xfer)
788 1.12 kiyohara {
789 1.56 skrll SLHCIHIST_FUNC(); SLHCIHIST_CALLED();
790 1.48 skrll DLOG(D_MEM, "freex xfer %p spipe %p", xfer, xfer->ux_pipe,0,0);
791 1.1 isaki
792 1.12 kiyohara #ifdef SLHCI_MEM_ACCOUNTING
793 1.12 kiyohara slhci_mem_use(bus, -1);
794 1.12 kiyohara #endif
795 1.12 kiyohara #ifdef DIAGNOSTIC
796 1.48 skrll if (xfer->ux_state != XFER_BUSY) {
797 1.48 skrll struct slhci_softc *sc = SLHCI_BUS2SC(bus);
798 1.36 skrll printf("%s: slhci_freex: xfer=%p not busy, %#08x halted\n",
799 1.48 skrll SC_NAME(sc), xfer, xfer->ux_state);
800 1.36 skrll DDOLOG("%s: slhci_freex: xfer=%p not busy, %#08x halted\n",
801 1.48 skrll SC_NAME(sc), xfer, xfer->ux_state, 0);
802 1.12 kiyohara slhci_lock_call(sc, &slhci_halt, NULL, NULL);
803 1.12 kiyohara return;
804 1.1 isaki }
805 1.48 skrll xfer->ux_state = XFER_FREE;
806 1.12 kiyohara #endif
807 1.1 isaki
808 1.48 skrll kmem_free(xfer, sizeof(*xfer));
809 1.12 kiyohara }
810 1.1 isaki
811 1.41 skrll static void
812 1.41 skrll slhci_get_lock(struct usbd_bus *bus, kmutex_t **lock)
813 1.41 skrll {
814 1.48 skrll struct slhci_softc *sc = SLHCI_BUS2SC(bus);
815 1.41 skrll
816 1.41 skrll *lock = &sc->sc_lock;
817 1.41 skrll }
818 1.41 skrll
819 1.12 kiyohara usbd_status
820 1.12 kiyohara slhci_transfer(struct usbd_xfer *xfer)
821 1.12 kiyohara {
822 1.56 skrll SLHCIHIST_FUNC(); SLHCIHIST_CALLED();
823 1.48 skrll struct slhci_softc *sc = SLHCI_XFER2SC(xfer);
824 1.12 kiyohara usbd_status error;
825 1.1 isaki
826 1.36 skrll DLOG(D_TRACE, "%s transfer xfer %p spipe %p ",
827 1.48 skrll pnames(SLHCI_XFER_TYPE(xfer)), xfer, xfer->ux_pipe,0);
828 1.1 isaki
829 1.12 kiyohara /* Insert last in queue */
830 1.41 skrll mutex_enter(&sc->sc_lock);
831 1.12 kiyohara error = usb_insert_transfer(xfer);
832 1.41 skrll mutex_exit(&sc->sc_lock);
833 1.12 kiyohara if (error) {
834 1.12 kiyohara if (error != USBD_IN_PROGRESS)
835 1.36 skrll DLOG(D_ERR, "usb_insert_transfer returns %d!", error,
836 1.12 kiyohara 0,0,0);
837 1.12 kiyohara return error;
838 1.12 kiyohara }
839 1.1 isaki
840 1.12 kiyohara /*
841 1.12 kiyohara * Pipe isn't running (otherwise error would be USBD_INPROG),
842 1.12 kiyohara * so start it first.
843 1.12 kiyohara */
844 1.1 isaki
845 1.34 skrll /*
846 1.41 skrll * Start will take the lock.
847 1.34 skrll */
848 1.48 skrll error = xfer->ux_pipe->up_methods->upm_start(SIMPLEQ_FIRST(&xfer->ux_pipe->up_queue));
849 1.1 isaki
850 1.12 kiyohara return error;
851 1.1 isaki }
852 1.1 isaki
853 1.12 kiyohara /* It is not safe for start to return anything other than USBD_INPROG. */
854 1.12 kiyohara usbd_status
855 1.12 kiyohara slhci_start(struct usbd_xfer *xfer)
856 1.1 isaki {
857 1.56 skrll SLHCIHIST_FUNC(); SLHCIHIST_CALLED();
858 1.48 skrll struct slhci_softc *sc = SLHCI_XFER2SC(xfer);
859 1.48 skrll struct usbd_pipe *pipe = xfer->ux_pipe;
860 1.48 skrll struct slhci_pipe *spipe = SLHCI_PIPE2SPIPE(pipe);
861 1.41 skrll struct slhci_transfers *t = &sc->sc_transfers;
862 1.48 skrll usb_endpoint_descriptor_t *ed = pipe->up_endpoint->ue_edesc;
863 1.12 kiyohara unsigned int max_packet;
864 1.12 kiyohara
865 1.41 skrll mutex_enter(&sc->sc_lock);
866 1.12 kiyohara
867 1.12 kiyohara max_packet = UGETW(ed->wMaxPacketSize);
868 1.12 kiyohara
869 1.36 skrll DLOG(D_TRACE, "%s start xfer %p spipe %p length %d",
870 1.48 skrll pnames(spipe->ptype), xfer, spipe, xfer->ux_length);
871 1.12 kiyohara
872 1.12 kiyohara /* root transfers use slhci_root_start */
873 1.12 kiyohara
874 1.12 kiyohara KASSERT(spipe->xfer == NULL); /* not SLASSERT */
875 1.12 kiyohara
876 1.48 skrll xfer->ux_actlen = 0;
877 1.48 skrll xfer->ux_status = USBD_IN_PROGRESS;
878 1.12 kiyohara
879 1.12 kiyohara spipe->xfer = xfer;
880 1.12 kiyohara
881 1.12 kiyohara spipe->nerrs = 0;
882 1.12 kiyohara spipe->frame = t->frame;
883 1.12 kiyohara spipe->control = SL11_EPCTRL_ARM_ENABLE;
884 1.48 skrll spipe->tregs[DEV] = pipe->up_dev->ud_addr;
885 1.36 skrll spipe->tregs[PID] = spipe->newpid = UE_GET_ADDR(ed->bEndpointAddress)
886 1.36 skrll | (UE_GET_DIR(ed->bEndpointAddress) == UE_DIR_IN ? SL11_PID_IN :
887 1.12 kiyohara SL11_PID_OUT);
888 1.48 skrll spipe->newlen[0] = xfer->ux_length % max_packet;
889 1.48 skrll spipe->newlen[1] = min(xfer->ux_length, max_packet);
890 1.12 kiyohara
891 1.12 kiyohara if (spipe->ptype == PT_BULK || spipe->ptype == PT_INTR) {
892 1.12 kiyohara if (spipe->pflags & PF_TOGGLE)
893 1.12 kiyohara spipe->control |= SL11_EPCTRL_DATATOGGLE;
894 1.12 kiyohara spipe->tregs[LEN] = spipe->newlen[1];
895 1.36 skrll if (spipe->tregs[LEN])
896 1.48 skrll spipe->buffer = xfer->ux_buf;
897 1.12 kiyohara else
898 1.12 kiyohara spipe->buffer = NULL;
899 1.12 kiyohara spipe->lastframe = t->frame;
900 1.12 kiyohara #if defined(DEBUG) || defined(SLHCI_DEBUG)
901 1.36 skrll if (__predict_false(spipe->ptype == PT_INTR &&
902 1.48 skrll xfer->ux_length > spipe->tregs[LEN])) {
903 1.12 kiyohara printf("%s: Long INTR transfer not supported!\n",
904 1.36 skrll SC_NAME(sc));
905 1.12 kiyohara DDOLOG("%s: Long INTR transfer not supported!\n",
906 1.12 kiyohara SC_NAME(sc), 0,0,0);
907 1.48 skrll xfer->ux_status = USBD_INVAL;
908 1.12 kiyohara }
909 1.1 isaki #endif
910 1.12 kiyohara } else {
911 1.12 kiyohara /* ptype may be currently set to any control transfer type. */
912 1.12 kiyohara SLHCI_DEXEC(D_TRACE, slhci_log_xfer(xfer));
913 1.1 isaki
914 1.12 kiyohara /* SETUP contains IN/OUT bits also */
915 1.12 kiyohara spipe->tregs[PID] |= SL11_PID_SETUP;
916 1.12 kiyohara spipe->tregs[LEN] = 8;
917 1.48 skrll spipe->buffer = (uint8_t *)&xfer->ux_request;
918 1.12 kiyohara DLOGBUF(D_XFER, spipe->buffer, spipe->tregs[LEN]);
919 1.12 kiyohara spipe->ptype = PT_CTRL_SETUP;
920 1.12 kiyohara spipe->newpid &= ~SL11_PID_BITS;
921 1.48 skrll if (xfer->ux_length == 0 || (xfer->ux_request.bmRequestType &
922 1.12 kiyohara UT_READ))
923 1.12 kiyohara spipe->newpid |= SL11_PID_IN;
924 1.12 kiyohara else
925 1.12 kiyohara spipe->newpid |= SL11_PID_OUT;
926 1.12 kiyohara }
927 1.12 kiyohara
928 1.48 skrll if (xfer->ux_flags & USBD_FORCE_SHORT_XFER && spipe->tregs[LEN] ==
929 1.12 kiyohara max_packet && (spipe->newpid & SL11_PID_BITS) == SL11_PID_OUT)
930 1.12 kiyohara spipe->wantshort = 1;
931 1.12 kiyohara else
932 1.12 kiyohara spipe->wantshort = 0;
933 1.12 kiyohara
934 1.34 skrll /*
935 1.34 skrll * The goal of newbustime and newlen is to avoid bustime calculation
936 1.37 skrll * in the interrupt. The calculations are not too complex, but they
937 1.37 skrll * complicate the conditional logic somewhat and doing them all in the
938 1.37 skrll * same place shares constants. Index 0 is "short length" for bulk and
939 1.37 skrll * ctrl data and 1 is "full length" for ctrl data (bulk/intr are
940 1.34 skrll * already set to full length).
941 1.34 skrll */
942 1.12 kiyohara if (spipe->pflags & PF_LS) {
943 1.34 skrll /*
944 1.48 skrll * Setting PREAMBLE for directly connected LS devices will
945 1.34 skrll * lock up the chip.
946 1.34 skrll */
947 1.12 kiyohara if (spipe->pflags & PF_PREAMBLE)
948 1.12 kiyohara spipe->control |= SL11_EPCTRL_PREAMBLE;
949 1.12 kiyohara if (max_packet <= 8) {
950 1.36 skrll spipe->bustime = SLHCI_LS_CONST +
951 1.12 kiyohara SLHCI_LS_DATA_TIME(spipe->tregs[LEN]);
952 1.36 skrll spipe->newbustime[0] = SLHCI_LS_CONST +
953 1.12 kiyohara SLHCI_LS_DATA_TIME(spipe->newlen[0]);
954 1.36 skrll spipe->newbustime[1] = SLHCI_LS_CONST +
955 1.12 kiyohara SLHCI_LS_DATA_TIME(spipe->newlen[1]);
956 1.12 kiyohara } else
957 1.48 skrll xfer->ux_status = USBD_INVAL;
958 1.12 kiyohara } else {
959 1.48 skrll UL_SLASSERT(pipe->up_dev->ud_speed == USB_SPEED_FULL, sc,
960 1.12 kiyohara spipe, xfer, return USBD_IN_PROGRESS);
961 1.12 kiyohara if (max_packet <= SL11_MAX_PACKET_SIZE) {
962 1.36 skrll spipe->bustime = SLHCI_FS_CONST +
963 1.12 kiyohara SLHCI_FS_DATA_TIME(spipe->tregs[LEN]);
964 1.36 skrll spipe->newbustime[0] = SLHCI_FS_CONST +
965 1.12 kiyohara SLHCI_FS_DATA_TIME(spipe->newlen[0]);
966 1.36 skrll spipe->newbustime[1] = SLHCI_FS_CONST +
967 1.12 kiyohara SLHCI_FS_DATA_TIME(spipe->newlen[1]);
968 1.12 kiyohara } else
969 1.48 skrll xfer->ux_status = USBD_INVAL;
970 1.12 kiyohara }
971 1.12 kiyohara
972 1.34 skrll /*
973 1.34 skrll * The datasheet incorrectly indicates that DIRECTION is for
974 1.37 skrll * "transmit to host". It is for OUT and SETUP. The app note
975 1.34 skrll * describes its use correctly.
976 1.34 skrll */
977 1.37 skrll if ((spipe->tregs[PID] & SL11_PID_BITS) != SL11_PID_IN)
978 1.12 kiyohara spipe->control |= SL11_EPCTRL_DIRECTION;
979 1.12 kiyohara
980 1.12 kiyohara slhci_start_entry(sc, spipe);
981 1.1 isaki
982 1.41 skrll mutex_exit(&sc->sc_lock);
983 1.41 skrll
984 1.12 kiyohara return USBD_IN_PROGRESS;
985 1.12 kiyohara }
986 1.1 isaki
987 1.12 kiyohara usbd_status
988 1.12 kiyohara slhci_root_start(struct usbd_xfer *xfer)
989 1.12 kiyohara {
990 1.58 skrll SLHCIHIST_FUNC(); SLHCIHIST_CALLED();
991 1.12 kiyohara struct slhci_softc *sc;
992 1.12 kiyohara struct slhci_pipe *spipe;
993 1.1 isaki
994 1.48 skrll spipe = SLHCI_PIPE2SPIPE(xfer->ux_pipe);
995 1.48 skrll sc = SLHCI_XFER2SC(xfer);
996 1.1 isaki
997 1.12 kiyohara return slhci_lock_call(sc, &slhci_root, spipe, xfer);
998 1.1 isaki }
999 1.1 isaki
1000 1.1 isaki usbd_status
1001 1.12 kiyohara slhci_open(struct usbd_pipe *pipe)
1002 1.1 isaki {
1003 1.56 skrll SLHCIHIST_FUNC(); SLHCIHIST_CALLED();
1004 1.12 kiyohara struct usbd_device *dev;
1005 1.12 kiyohara struct slhci_softc *sc;
1006 1.12 kiyohara struct slhci_pipe *spipe;
1007 1.12 kiyohara usb_endpoint_descriptor_t *ed;
1008 1.12 kiyohara unsigned int max_packet, pmaxpkt;
1009 1.48 skrll uint8_t rhaddr;
1010 1.12 kiyohara
1011 1.48 skrll dev = pipe->up_dev;
1012 1.48 skrll sc = SLHCI_PIPE2SC(pipe);
1013 1.48 skrll spipe = SLHCI_PIPE2SPIPE(pipe);
1014 1.48 skrll ed = pipe->up_endpoint->ue_edesc;
1015 1.48 skrll rhaddr = dev->ud_bus->ub_rhaddr;
1016 1.12 kiyohara
1017 1.12 kiyohara DLOG(D_TRACE, "slhci_open(addr=%d,ep=%d,rootaddr=%d)",
1018 1.48 skrll dev->ud_addr, ed->bEndpointAddress, rhaddr, 0);
1019 1.12 kiyohara
1020 1.12 kiyohara spipe->pflags = 0;
1021 1.12 kiyohara spipe->frame = 0;
1022 1.12 kiyohara spipe->lastframe = 0;
1023 1.12 kiyohara spipe->xfer = NULL;
1024 1.12 kiyohara spipe->buffer = NULL;
1025 1.12 kiyohara
1026 1.12 kiyohara gcq_init(&spipe->ap);
1027 1.12 kiyohara gcq_init(&spipe->to);
1028 1.12 kiyohara gcq_init(&spipe->xq);
1029 1.12 kiyohara
1030 1.34 skrll /*
1031 1.34 skrll * The endpoint descriptor will not have been set up yet in the case
1032 1.37 skrll * of the standard control pipe, so the max packet checks are also
1033 1.34 skrll * necessary in start.
1034 1.34 skrll */
1035 1.12 kiyohara
1036 1.12 kiyohara max_packet = UGETW(ed->wMaxPacketSize);
1037 1.12 kiyohara
1038 1.48 skrll if (dev->ud_speed == USB_SPEED_LOW) {
1039 1.12 kiyohara spipe->pflags |= PF_LS;
1040 1.48 skrll if (dev->ud_myhub->ud_addr != rhaddr) {
1041 1.12 kiyohara spipe->pflags |= PF_PREAMBLE;
1042 1.12 kiyohara if (!slhci_try_lsvh)
1043 1.36 skrll return slhci_lock_call(sc, &slhci_lsvh_warn,
1044 1.12 kiyohara spipe, NULL);
1045 1.12 kiyohara }
1046 1.12 kiyohara pmaxpkt = 8;
1047 1.12 kiyohara } else
1048 1.12 kiyohara pmaxpkt = SL11_MAX_PACKET_SIZE;
1049 1.12 kiyohara
1050 1.12 kiyohara if (max_packet > pmaxpkt) {
1051 1.36 skrll DLOG(D_ERR, "packet too large! size %d spipe %p", max_packet,
1052 1.12 kiyohara spipe, 0,0);
1053 1.12 kiyohara return USBD_INVAL;
1054 1.12 kiyohara }
1055 1.1 isaki
1056 1.48 skrll if (dev->ud_addr == rhaddr) {
1057 1.1 isaki switch (ed->bEndpointAddress) {
1058 1.1 isaki case USB_CONTROL_ENDPOINT:
1059 1.12 kiyohara spipe->ptype = PT_ROOT_CTRL;
1060 1.48 skrll pipe->up_interval = 0;
1061 1.48 skrll pipe->up_methods = &roothub_ctrl_methods;
1062 1.1 isaki break;
1063 1.48 skrll case UE_DIR_IN | USBROOTHUB_INTR_ENDPT:
1064 1.12 kiyohara spipe->ptype = PT_ROOT_INTR;
1065 1.48 skrll pipe->up_interval = 1;
1066 1.48 skrll pipe->up_methods = &slhci_root_methods;
1067 1.1 isaki break;
1068 1.1 isaki default:
1069 1.12 kiyohara printf("%s: Invalid root endpoint!\n", SC_NAME(sc));
1070 1.36 skrll DDOLOG("%s: Invalid root endpoint!\n", SC_NAME(sc),
1071 1.12 kiyohara 0,0,0);
1072 1.1 isaki return USBD_INVAL;
1073 1.1 isaki }
1074 1.12 kiyohara return USBD_NORMAL_COMPLETION;
1075 1.1 isaki } else {
1076 1.1 isaki switch (ed->bmAttributes & UE_XFERTYPE) {
1077 1.1 isaki case UE_CONTROL:
1078 1.12 kiyohara spipe->ptype = PT_CTRL_SETUP;
1079 1.48 skrll pipe->up_interval = 0;
1080 1.1 isaki break;
1081 1.1 isaki case UE_INTERRUPT:
1082 1.12 kiyohara spipe->ptype = PT_INTR;
1083 1.48 skrll if (pipe->up_interval == USBD_DEFAULT_INTERVAL)
1084 1.48 skrll pipe->up_interval = ed->bInterval;
1085 1.1 isaki break;
1086 1.1 isaki case UE_ISOCHRONOUS:
1087 1.36 skrll return slhci_lock_call(sc, &slhci_isoc_warn, spipe,
1088 1.12 kiyohara NULL);
1089 1.1 isaki case UE_BULK:
1090 1.12 kiyohara spipe->ptype = PT_BULK;
1091 1.48 skrll pipe->up_interval = 0;
1092 1.1 isaki break;
1093 1.1 isaki }
1094 1.12 kiyohara
1095 1.36 skrll DLOG(D_MSG, "open pipe %s interval %d", pnames(spipe->ptype),
1096 1.48 skrll pipe->up_interval, 0,0);
1097 1.12 kiyohara
1098 1.48 skrll pipe->up_methods = __UNCONST(&slhci_pipe_methods);
1099 1.12 kiyohara
1100 1.12 kiyohara return slhci_lock_call(sc, &slhci_open_pipe, spipe, NULL);
1101 1.1 isaki }
1102 1.1 isaki }
1103 1.1 isaki
1104 1.12 kiyohara int
1105 1.12 kiyohara slhci_supported_rev(uint8_t rev)
1106 1.1 isaki {
1107 1.48 skrll return rev >= SLTYPE_SL811HS_R12 && rev <= SLTYPE_SL811HS_R15;
1108 1.1 isaki }
1109 1.1 isaki
1110 1.34 skrll /*
1111 1.34 skrll * Must be called before the ISR is registered. Interrupts can be shared so
1112 1.37 skrll * slhci_intr could be called as soon as the ISR is registered.
1113 1.34 skrll * Note max_current argument is actual current, but stored as current/2
1114 1.34 skrll */
1115 1.1 isaki void
1116 1.36 skrll slhci_preinit(struct slhci_softc *sc, PowerFunc pow, bus_space_tag_t iot,
1117 1.29 kiyohara bus_space_handle_t ioh, uint16_t max_current, uint32_t stride)
1118 1.1 isaki {
1119 1.12 kiyohara struct slhci_transfers *t;
1120 1.12 kiyohara int i;
1121 1.12 kiyohara
1122 1.12 kiyohara t = &sc->sc_transfers;
1123 1.12 kiyohara
1124 1.41 skrll mutex_init(&sc->sc_lock, MUTEX_DEFAULT, IPL_SOFTUSB);
1125 1.57 skrll mutex_init(&sc->sc_intr_lock, MUTEX_DEFAULT, IPL_USB);
1126 1.41 skrll
1127 1.12 kiyohara /* sc->sc_ier = 0; */
1128 1.12 kiyohara /* t->rootintr = NULL; */
1129 1.12 kiyohara t->flags = F_NODEV|F_UDISABLED;
1130 1.12 kiyohara t->pend = INT_MAX;
1131 1.12 kiyohara KASSERT(slhci_wait_time != INT_MAX);
1132 1.12 kiyohara t->len[0] = t->len[1] = -1;
1133 1.12 kiyohara if (max_current > 500)
1134 1.12 kiyohara max_current = 500;
1135 1.12 kiyohara t->max_current = (uint8_t)(max_current / 2);
1136 1.12 kiyohara sc->sc_enable_power = pow;
1137 1.12 kiyohara sc->sc_iot = iot;
1138 1.12 kiyohara sc->sc_ioh = ioh;
1139 1.12 kiyohara sc->sc_stride = stride;
1140 1.12 kiyohara
1141 1.12 kiyohara KASSERT(Q_MAX+1 == sizeof(t->q) / sizeof(t->q[0]));
1142 1.12 kiyohara
1143 1.12 kiyohara for (i = 0; i <= Q_MAX; i++)
1144 1.12 kiyohara gcq_init_head(&t->q[i]);
1145 1.12 kiyohara gcq_init_head(&t->timed);
1146 1.12 kiyohara gcq_init_head(&t->to);
1147 1.12 kiyohara gcq_init_head(&t->ap);
1148 1.12 kiyohara gcq_init_head(&sc->sc_waitq);
1149 1.1 isaki }
1150 1.1 isaki
1151 1.12 kiyohara int
1152 1.12 kiyohara slhci_attach(struct slhci_softc *sc)
1153 1.1 isaki {
1154 1.41 skrll struct slhci_transfers *t;
1155 1.41 skrll const char *rev;
1156 1.41 skrll
1157 1.41 skrll t = &sc->sc_transfers;
1158 1.41 skrll
1159 1.41 skrll /* Detect and check the controller type */
1160 1.41 skrll t->sltype = SL11_GET_REV(slhci_read(sc, SL11_REV));
1161 1.41 skrll
1162 1.41 skrll /* SL11H not supported */
1163 1.41 skrll if (!slhci_supported_rev(t->sltype)) {
1164 1.41 skrll if (t->sltype == SLTYPE_SL11H)
1165 1.41 skrll printf("%s: SL11H unsupported or bus error!\n",
1166 1.41 skrll SC_NAME(sc));
1167 1.41 skrll else
1168 1.41 skrll printf("%s: Unknown chip revision!\n", SC_NAME(sc));
1169 1.12 kiyohara return -1;
1170 1.41 skrll }
1171 1.41 skrll
1172 1.41 skrll callout_init(&sc->sc_timer, CALLOUT_MPSAFE);
1173 1.41 skrll callout_setfunc(&sc->sc_timer, slhci_reset_entry, sc);
1174 1.41 skrll
1175 1.41 skrll /*
1176 1.41 skrll * It is not safe to call the soft interrupt directly as
1177 1.48 skrll * usb_schedsoftintr does in the ub_usepolling case (due to locking).
1178 1.41 skrll */
1179 1.41 skrll sc->sc_cb_softintr = softint_establish(SOFTINT_NET,
1180 1.41 skrll slhci_callback_entry, sc);
1181 1.41 skrll
1182 1.41 skrll #ifdef SLHCI_DEBUG
1183 1.41 skrll ssc = sc;
1184 1.41 skrll #endif
1185 1.41 skrll
1186 1.41 skrll if (t->sltype == SLTYPE_SL811HS_R12)
1187 1.54 skrll rev = "(rev 1.2)";
1188 1.41 skrll else if (t->sltype == SLTYPE_SL811HS_R14)
1189 1.54 skrll rev = "(rev 1.4 or 1.5)";
1190 1.41 skrll else
1191 1.54 skrll rev = "(unknown revision)";
1192 1.41 skrll
1193 1.41 skrll aprint_normal("%s: ScanLogic SL811HS/T USB Host Controller %s\n",
1194 1.41 skrll SC_NAME(sc), rev);
1195 1.41 skrll
1196 1.41 skrll aprint_normal("%s: Max Current %u mA (value by code, not by probe)\n",
1197 1.41 skrll SC_NAME(sc), t->max_current * 2);
1198 1.41 skrll
1199 1.41 skrll #if defined(SLHCI_DEBUG) || defined(SLHCI_NO_OVERTIME) || \
1200 1.41 skrll defined(SLHCI_TRY_LSVH) || defined(SLHCI_PROFILE_TRANSFER)
1201 1.41 skrll aprint_normal("%s: driver options:"
1202 1.41 skrll #ifdef SLHCI_DEBUG
1203 1.41 skrll " SLHCI_DEBUG"
1204 1.41 skrll #endif
1205 1.41 skrll #ifdef SLHCI_TRY_LSVH
1206 1.41 skrll " SLHCI_TRY_LSVH"
1207 1.41 skrll #endif
1208 1.41 skrll #ifdef SLHCI_NO_OVERTIME
1209 1.41 skrll " SLHCI_NO_OVERTIME"
1210 1.41 skrll #endif
1211 1.41 skrll #ifdef SLHCI_PROFILE_TRANSFER
1212 1.41 skrll " SLHCI_PROFILE_TRANSFER"
1213 1.41 skrll #endif
1214 1.41 skrll "\n", SC_NAME(sc));
1215 1.41 skrll #endif
1216 1.48 skrll sc->sc_bus.ub_revision = USBREV_1_1;
1217 1.48 skrll sc->sc_bus.ub_methods = __UNCONST(&slhci_bus_methods);
1218 1.48 skrll sc->sc_bus.ub_pipesize = sizeof(struct slhci_pipe);
1219 1.48 skrll sc->sc_bus.ub_usedma = false;
1220 1.41 skrll
1221 1.41 skrll if (!sc->sc_enable_power)
1222 1.41 skrll t->flags |= F_REALPOWER;
1223 1.41 skrll
1224 1.41 skrll t->flags |= F_ACTIVE;
1225 1.1 isaki
1226 1.12 kiyohara /* Attach usb and uhub. */
1227 1.12 kiyohara sc->sc_child = config_found(SC_DEV(sc), &sc->sc_bus, usbctlprint);
1228 1.1 isaki
1229 1.12 kiyohara if (!sc->sc_child)
1230 1.12 kiyohara return -1;
1231 1.12 kiyohara else
1232 1.12 kiyohara return 0;
1233 1.1 isaki }
1234 1.1 isaki
1235 1.12 kiyohara int
1236 1.12 kiyohara slhci_detach(struct slhci_softc *sc, int flags)
1237 1.1 isaki {
1238 1.12 kiyohara struct slhci_transfers *t;
1239 1.12 kiyohara int ret;
1240 1.1 isaki
1241 1.12 kiyohara t = &sc->sc_transfers;
1242 1.12 kiyohara
1243 1.12 kiyohara /* By this point bus access is no longer allowed. */
1244 1.12 kiyohara
1245 1.12 kiyohara KASSERT(!(t->flags & F_ACTIVE));
1246 1.12 kiyohara
1247 1.34 skrll /*
1248 1.34 skrll * To be MPSAFE is not sufficient to cancel callouts and soft
1249 1.13 kiyohara * interrupts and assume they are dead since the code could already be
1250 1.34 skrll * running or about to run. Wait until they are known to be done.
1251 1.34 skrll */
1252 1.12 kiyohara while (t->flags & (F_RESET|F_CALLBACK))
1253 1.12 kiyohara tsleep(&sc, PPAUSE, "slhci_detach", hz);
1254 1.12 kiyohara
1255 1.16 ad softint_disestablish(sc->sc_cb_softintr);
1256 1.12 kiyohara
1257 1.41 skrll mutex_destroy(&sc->sc_lock);
1258 1.41 skrll mutex_destroy(&sc->sc_intr_lock);
1259 1.41 skrll
1260 1.12 kiyohara ret = 0;
1261 1.12 kiyohara
1262 1.12 kiyohara if (sc->sc_child)
1263 1.12 kiyohara ret = config_detach(sc->sc_child, flags);
1264 1.12 kiyohara
1265 1.12 kiyohara #ifdef SLHCI_MEM_ACCOUNTING
1266 1.56 skrll SLHCIHIST_FUNC(); SLHCIHIST_CALLED();
1267 1.12 kiyohara if (sc->sc_mem_use) {
1268 1.12 kiyohara printf("%s: Memory still in use after detach! mem_use (count)"
1269 1.12 kiyohara " = %d\n", SC_NAME(sc), sc->sc_mem_use);
1270 1.12 kiyohara DDOLOG("%s: Memory still in use after detach! mem_use (count)"
1271 1.12 kiyohara " = %d\n", SC_NAME(sc), sc->sc_mem_use, 0,0);
1272 1.12 kiyohara }
1273 1.12 kiyohara #endif
1274 1.12 kiyohara
1275 1.12 kiyohara return ret;
1276 1.12 kiyohara }
1277 1.12 kiyohara
1278 1.12 kiyohara int
1279 1.23 cegger slhci_activate(device_t self, enum devact act)
1280 1.12 kiyohara {
1281 1.24 dyoung struct slhci_softc *sc = device_private(self);
1282 1.12 kiyohara
1283 1.24 dyoung switch (act) {
1284 1.24 dyoung case DVACT_DEACTIVATE:
1285 1.24 dyoung slhci_lock_call(sc, &slhci_halt, NULL, NULL);
1286 1.24 dyoung return 0;
1287 1.24 dyoung default:
1288 1.12 kiyohara return EOPNOTSUPP;
1289 1.24 dyoung }
1290 1.12 kiyohara }
1291 1.1 isaki
1292 1.1 isaki void
1293 1.12 kiyohara slhci_abort(struct usbd_xfer *xfer)
1294 1.1 isaki {
1295 1.56 skrll SLHCIHIST_FUNC(); SLHCIHIST_CALLED();
1296 1.12 kiyohara struct slhci_softc *sc;
1297 1.12 kiyohara struct slhci_pipe *spipe;
1298 1.12 kiyohara
1299 1.48 skrll spipe = SLHCI_PIPE2SPIPE(xfer->ux_pipe);
1300 1.12 kiyohara
1301 1.12 kiyohara if (spipe == NULL)
1302 1.12 kiyohara goto callback;
1303 1.12 kiyohara
1304 1.48 skrll sc = SLHCI_XFER2SC(xfer);
1305 1.12 kiyohara
1306 1.46 joerg KASSERT(mutex_owned(&sc->sc_lock));
1307 1.46 joerg
1308 1.36 skrll DLOG(D_TRACE, "%s abort xfer %p spipe %p spipe->xfer %p",
1309 1.12 kiyohara pnames(spipe->ptype), xfer, spipe, spipe->xfer);
1310 1.12 kiyohara
1311 1.12 kiyohara slhci_lock_call(sc, &slhci_do_abort, spipe, xfer);
1312 1.1 isaki
1313 1.12 kiyohara callback:
1314 1.48 skrll xfer->ux_status = USBD_CANCELLED;
1315 1.41 skrll /* Abort happens at IPL_USB. */
1316 1.12 kiyohara usb_transfer_complete(xfer);
1317 1.1 isaki }
1318 1.1 isaki
1319 1.12 kiyohara void
1320 1.12 kiyohara slhci_close(struct usbd_pipe *pipe)
1321 1.1 isaki {
1322 1.56 skrll SLHCIHIST_FUNC(); SLHCIHIST_CALLED();
1323 1.12 kiyohara struct slhci_softc *sc;
1324 1.12 kiyohara struct slhci_pipe *spipe;
1325 1.1 isaki
1326 1.48 skrll sc = SLHCI_PIPE2SC(pipe);
1327 1.48 skrll spipe = SLHCI_PIPE2SPIPE(pipe);
1328 1.1 isaki
1329 1.36 skrll DLOG(D_TRACE, "%s close spipe %p spipe->xfer %p",
1330 1.12 kiyohara pnames(spipe->ptype), spipe, spipe->xfer, 0);
1331 1.1 isaki
1332 1.12 kiyohara slhci_lock_call(sc, &slhci_close_pipe, spipe, NULL);
1333 1.1 isaki }
1334 1.1 isaki
1335 1.1 isaki void
1336 1.12 kiyohara slhci_clear_toggle(struct usbd_pipe *pipe)
1337 1.1 isaki {
1338 1.56 skrll SLHCIHIST_FUNC(); SLHCIHIST_CALLED();
1339 1.12 kiyohara struct slhci_pipe *spipe;
1340 1.12 kiyohara
1341 1.48 skrll spipe = SLHCI_PIPE2SPIPE(pipe);
1342 1.12 kiyohara
1343 1.36 skrll DLOG(D_TRACE, "%s toggle spipe %p", pnames(spipe->ptype),
1344 1.12 kiyohara spipe,0,0);
1345 1.1 isaki
1346 1.12 kiyohara spipe->pflags &= ~PF_TOGGLE;
1347 1.2 isaki
1348 1.2 isaki #ifdef DIAGNOSTIC
1349 1.12 kiyohara if (spipe->xfer != NULL) {
1350 1.36 skrll struct slhci_softc *sc = (struct slhci_softc
1351 1.48 skrll *)pipe->up_dev->ud_bus;
1352 1.12 kiyohara
1353 1.36 skrll printf("%s: Clear toggle on transfer in progress! halted\n",
1354 1.12 kiyohara SC_NAME(sc));
1355 1.36 skrll DDOLOG("%s: Clear toggle on transfer in progress! halted\n",
1356 1.12 kiyohara SC_NAME(sc), 0,0,0);
1357 1.12 kiyohara slhci_halt(sc, NULL, NULL);
1358 1.2 isaki }
1359 1.2 isaki #endif
1360 1.1 isaki }
1361 1.1 isaki
1362 1.1 isaki void
1363 1.12 kiyohara slhci_poll(struct usbd_bus *bus) /* XXX necessary? */
1364 1.1 isaki {
1365 1.56 skrll SLHCIHIST_FUNC(); SLHCIHIST_CALLED();
1366 1.12 kiyohara struct slhci_softc *sc;
1367 1.12 kiyohara
1368 1.48 skrll sc = SLHCI_BUS2SC(bus);
1369 1.12 kiyohara
1370 1.12 kiyohara DLOG(D_TRACE, "slhci_poll", 0,0,0,0);
1371 1.12 kiyohara
1372 1.12 kiyohara slhci_lock_call(sc, &slhci_do_poll, NULL, NULL);
1373 1.1 isaki }
1374 1.1 isaki
1375 1.12 kiyohara void
1376 1.12 kiyohara slhci_done(struct usbd_xfer *xfer)
1377 1.12 kiyohara {
1378 1.12 kiyohara /* xfer may not be valid here */
1379 1.12 kiyohara }
1380 1.1 isaki
1381 1.12 kiyohara void
1382 1.12 kiyohara slhci_void(void *v) {}
1383 1.1 isaki
1384 1.12 kiyohara /* End out of lock functions. Start lock entry functions. */
1385 1.1 isaki
1386 1.12 kiyohara #ifdef SLHCI_MEM_ACCOUNTING
1387 1.12 kiyohara void
1388 1.12 kiyohara slhci_mem_use(struct usbd_bus *bus, int val)
1389 1.12 kiyohara {
1390 1.48 skrll struct slhci_softc *sc = SLHCI_BUS2SC(bus);
1391 1.1 isaki
1392 1.41 skrll mutex_enter(&sc->sc_intr_lock);
1393 1.12 kiyohara sc->sc_mem_use += val;
1394 1.41 skrll mutex_exit(&sc->sc_intr_lock);
1395 1.12 kiyohara }
1396 1.12 kiyohara #endif
1397 1.1 isaki
1398 1.12 kiyohara void
1399 1.12 kiyohara slhci_reset_entry(void *arg)
1400 1.1 isaki {
1401 1.41 skrll struct slhci_softc *sc = arg;
1402 1.12 kiyohara
1403 1.41 skrll mutex_enter(&sc->sc_intr_lock);
1404 1.12 kiyohara slhci_reset(sc);
1405 1.34 skrll /*
1406 1.39 skrll * We cannot call the callback directly since we could then be reset
1407 1.37 skrll * again before finishing and need the callout delay for timing.
1408 1.37 skrll * Scheduling the callout again before we exit would defeat the reap
1409 1.37 skrll * mechanism since we could be unlocked while the reset flag is not
1410 1.34 skrll * set. The callback code will check the wait queue.
1411 1.34 skrll */
1412 1.12 kiyohara slhci_callback_schedule(sc);
1413 1.41 skrll mutex_exit(&sc->sc_intr_lock);
1414 1.1 isaki }
1415 1.1 isaki
1416 1.1 isaki usbd_status
1417 1.36 skrll slhci_lock_call(struct slhci_softc *sc, LockCallFunc lcf, struct slhci_pipe
1418 1.12 kiyohara *spipe, struct usbd_xfer *xfer)
1419 1.12 kiyohara {
1420 1.12 kiyohara usbd_status ret;
1421 1.12 kiyohara
1422 1.41 skrll mutex_enter(&sc->sc_intr_lock);
1423 1.12 kiyohara ret = (*lcf)(sc, spipe, xfer);
1424 1.41 skrll slhci_main(sc);
1425 1.41 skrll mutex_exit(&sc->sc_intr_lock);
1426 1.12 kiyohara
1427 1.12 kiyohara return ret;
1428 1.12 kiyohara }
1429 1.12 kiyohara
1430 1.12 kiyohara void
1431 1.12 kiyohara slhci_start_entry(struct slhci_softc *sc, struct slhci_pipe *spipe)
1432 1.1 isaki {
1433 1.12 kiyohara struct slhci_transfers *t;
1434 1.1 isaki
1435 1.41 skrll mutex_enter(&sc->sc_intr_lock);
1436 1.12 kiyohara t = &sc->sc_transfers;
1437 1.1 isaki
1438 1.41 skrll if (!(t->flags & (F_AINPROG|F_BINPROG))) {
1439 1.12 kiyohara slhci_enter_xfer(sc, spipe);
1440 1.12 kiyohara slhci_dotransfer(sc);
1441 1.41 skrll slhci_main(sc);
1442 1.12 kiyohara } else {
1443 1.12 kiyohara enter_waitq(sc, spipe);
1444 1.1 isaki }
1445 1.41 skrll mutex_exit(&sc->sc_intr_lock);
1446 1.1 isaki }
1447 1.1 isaki
1448 1.12 kiyohara void
1449 1.12 kiyohara slhci_callback_entry(void *arg)
1450 1.1 isaki {
1451 1.56 skrll SLHCIHIST_FUNC(); SLHCIHIST_CALLED();
1452 1.12 kiyohara struct slhci_softc *sc;
1453 1.12 kiyohara struct slhci_transfers *t;
1454 1.1 isaki
1455 1.41 skrll sc = (struct slhci_softc *)arg;
1456 1.1 isaki
1457 1.41 skrll mutex_enter(&sc->sc_intr_lock);
1458 1.12 kiyohara t = &sc->sc_transfers;
1459 1.12 kiyohara DLOG(D_SOFT, "callback_entry flags %#x", t->flags, 0,0,0);
1460 1.1 isaki
1461 1.12 kiyohara repeat:
1462 1.41 skrll slhci_callback(sc);
1463 1.1 isaki
1464 1.12 kiyohara if (!gcq_empty(&sc->sc_waitq)) {
1465 1.12 kiyohara slhci_enter_xfers(sc);
1466 1.12 kiyohara slhci_dotransfer(sc);
1467 1.12 kiyohara slhci_waitintr(sc, 0);
1468 1.12 kiyohara goto repeat;
1469 1.12 kiyohara }
1470 1.1 isaki
1471 1.12 kiyohara t->flags &= ~F_CALLBACK;
1472 1.41 skrll mutex_exit(&sc->sc_intr_lock);
1473 1.1 isaki }
1474 1.1 isaki
1475 1.1 isaki void
1476 1.41 skrll slhci_do_callback(struct slhci_softc *sc, struct usbd_xfer *xfer)
1477 1.1 isaki {
1478 1.43 skrll KASSERT(mutex_owned(&sc->sc_intr_lock));
1479 1.12 kiyohara
1480 1.12 kiyohara int repeat;
1481 1.12 kiyohara
1482 1.12 kiyohara start_cc_time(&t_callback, (u_int)xfer);
1483 1.41 skrll mutex_exit(&sc->sc_intr_lock);
1484 1.12 kiyohara
1485 1.41 skrll mutex_enter(&sc->sc_lock);
1486 1.48 skrll repeat = xfer->ux_pipe->up_repeat;
1487 1.12 kiyohara usb_transfer_complete(xfer);
1488 1.41 skrll mutex_exit(&sc->sc_lock);
1489 1.12 kiyohara
1490 1.41 skrll mutex_enter(&sc->sc_intr_lock);
1491 1.12 kiyohara stop_cc_time(&t_callback);
1492 1.12 kiyohara
1493 1.48 skrll if (repeat && !sc->sc_bus.ub_usepolling)
1494 1.12 kiyohara slhci_do_repeat(sc, xfer);
1495 1.1 isaki }
1496 1.1 isaki
1497 1.12 kiyohara int
1498 1.12 kiyohara slhci_intr(void *arg)
1499 1.1 isaki {
1500 1.58 skrll SLHCIHIST_FUNC(); SLHCIHIST_CALLED();
1501 1.41 skrll struct slhci_softc *sc = arg;
1502 1.12 kiyohara int ret;
1503 1.12 kiyohara
1504 1.12 kiyohara start_cc_time(&t_hard_int, (unsigned int)arg);
1505 1.41 skrll mutex_enter(&sc->sc_intr_lock);
1506 1.12 kiyohara
1507 1.12 kiyohara ret = slhci_dointr(sc);
1508 1.41 skrll slhci_main(sc);
1509 1.41 skrll mutex_exit(&sc->sc_intr_lock);
1510 1.12 kiyohara
1511 1.12 kiyohara stop_cc_time(&t_hard_int);
1512 1.12 kiyohara return ret;
1513 1.1 isaki }
1514 1.1 isaki
1515 1.12 kiyohara /* called with main lock only held, returns with locks released. */
1516 1.1 isaki void
1517 1.41 skrll slhci_main(struct slhci_softc *sc)
1518 1.1 isaki {
1519 1.58 skrll SLHCIHIST_FUNC(); SLHCIHIST_CALLED();
1520 1.12 kiyohara struct slhci_transfers *t;
1521 1.12 kiyohara
1522 1.12 kiyohara t = &sc->sc_transfers;
1523 1.1 isaki
1524 1.44 skrll KASSERT(mutex_owned(&sc->sc_intr_lock));
1525 1.1 isaki
1526 1.12 kiyohara waitcheck:
1527 1.12 kiyohara slhci_waitintr(sc, slhci_wait_time);
1528 1.1 isaki
1529 1.1 isaki /*
1530 1.48 skrll * The direct call is needed in the ub_usepolling and disabled cases
1531 1.36 skrll * since the soft interrupt is not available. In the disabled case,
1532 1.36 skrll * this code can be reached from the usb detach, after the reaping of
1533 1.41 skrll * the soft interrupt. That test could be !F_ACTIVE, but there is no
1534 1.41 skrll * reason not to make the callbacks directly in the other DISABLED
1535 1.41 skrll * cases.
1536 1.1 isaki */
1537 1.12 kiyohara if ((t->flags & F_ROOTINTR) || !gcq_empty(&t->q[Q_CALLBACKS])) {
1538 1.48 skrll if (__predict_false(sc->sc_bus.ub_usepolling ||
1539 1.41 skrll t->flags & F_DISABLED))
1540 1.41 skrll slhci_callback(sc);
1541 1.12 kiyohara else
1542 1.12 kiyohara slhci_callback_schedule(sc);
1543 1.12 kiyohara }
1544 1.12 kiyohara
1545 1.12 kiyohara if (!gcq_empty(&sc->sc_waitq)) {
1546 1.12 kiyohara slhci_enter_xfers(sc);
1547 1.12 kiyohara slhci_dotransfer(sc);
1548 1.12 kiyohara goto waitcheck;
1549 1.12 kiyohara }
1550 1.1 isaki }
1551 1.1 isaki
1552 1.12 kiyohara /* End lock entry functions. Start in lock function. */
1553 1.12 kiyohara
1554 1.12 kiyohara /* Register read/write routines and barriers. */
1555 1.12 kiyohara #ifdef SLHCI_BUS_SPACE_BARRIERS
1556 1.12 kiyohara #define BSB(a, b, c, d, e) bus_space_barrier(a, b, c, d, BUS_SPACE_BARRIER_ # e)
1557 1.12 kiyohara #define BSB_SYNC(a, b, c, d) bus_space_barrier(a, b, c, d, BUS_SPACE_BARRIER_SYNC)
1558 1.12 kiyohara #else /* now !SLHCI_BUS_SPACE_BARRIERS */
1559 1.47 christos #define BSB(a, b, c, d, e) __USE(d)
1560 1.12 kiyohara #define BSB_SYNC(a, b, c, d)
1561 1.12 kiyohara #endif /* SLHCI_BUS_SPACE_BARRIERS */
1562 1.12 kiyohara
1563 1.12 kiyohara static void
1564 1.12 kiyohara slhci_write(struct slhci_softc *sc, uint8_t addr, uint8_t data)
1565 1.1 isaki {
1566 1.12 kiyohara bus_size_t paddr, pdata, pst, psz;
1567 1.12 kiyohara bus_space_tag_t iot;
1568 1.12 kiyohara bus_space_handle_t ioh;
1569 1.12 kiyohara
1570 1.12 kiyohara paddr = pst = 0;
1571 1.12 kiyohara pdata = sc->sc_stride;
1572 1.12 kiyohara psz = pdata * 2;
1573 1.12 kiyohara iot = sc->sc_iot;
1574 1.12 kiyohara ioh = sc->sc_ioh;
1575 1.12 kiyohara
1576 1.12 kiyohara bus_space_write_1(iot, ioh, paddr, addr);
1577 1.12 kiyohara BSB(iot, ioh, pst, psz, WRITE_BEFORE_WRITE);
1578 1.12 kiyohara bus_space_write_1(iot, ioh, pdata, data);
1579 1.12 kiyohara BSB(iot, ioh, pst, psz, WRITE_BEFORE_WRITE);
1580 1.12 kiyohara }
1581 1.12 kiyohara
1582 1.12 kiyohara static uint8_t
1583 1.12 kiyohara slhci_read(struct slhci_softc *sc, uint8_t addr)
1584 1.12 kiyohara {
1585 1.12 kiyohara bus_size_t paddr, pdata, pst, psz;
1586 1.12 kiyohara bus_space_tag_t iot;
1587 1.12 kiyohara bus_space_handle_t ioh;
1588 1.12 kiyohara uint8_t data;
1589 1.12 kiyohara
1590 1.12 kiyohara paddr = pst = 0;
1591 1.12 kiyohara pdata = sc->sc_stride;
1592 1.12 kiyohara psz = pdata * 2;
1593 1.12 kiyohara iot = sc->sc_iot;
1594 1.12 kiyohara ioh = sc->sc_ioh;
1595 1.12 kiyohara
1596 1.12 kiyohara bus_space_write_1(iot, ioh, paddr, addr);
1597 1.12 kiyohara BSB(iot, ioh, pst, psz, WRITE_BEFORE_READ);
1598 1.12 kiyohara data = bus_space_read_1(iot, ioh, pdata);
1599 1.12 kiyohara BSB(iot, ioh, pst, psz, READ_BEFORE_WRITE);
1600 1.12 kiyohara return data;
1601 1.12 kiyohara }
1602 1.1 isaki
1603 1.12 kiyohara #if 0 /* auto-increment mode broken, see errata doc */
1604 1.12 kiyohara static void
1605 1.12 kiyohara slhci_write_multi(struct slhci_softc *sc, uint8_t addr, uint8_t *buf, int l)
1606 1.12 kiyohara {
1607 1.12 kiyohara bus_size_t paddr, pdata, pst, psz;
1608 1.12 kiyohara bus_space_tag_t iot;
1609 1.12 kiyohara bus_space_handle_t ioh;
1610 1.12 kiyohara
1611 1.12 kiyohara paddr = pst = 0;
1612 1.12 kiyohara pdata = sc->sc_stride;
1613 1.12 kiyohara psz = pdata * 2;
1614 1.12 kiyohara iot = sc->sc_iot;
1615 1.12 kiyohara ioh = sc->sc_ioh;
1616 1.12 kiyohara
1617 1.12 kiyohara bus_space_write_1(iot, ioh, paddr, addr);
1618 1.12 kiyohara BSB(iot, ioh, pst, psz, WRITE_BEFORE_WRITE);
1619 1.12 kiyohara bus_space_write_multi_1(iot, ioh, pdata, buf, l);
1620 1.12 kiyohara BSB(iot, ioh, pst, psz, WRITE_BEFORE_WRITE);
1621 1.12 kiyohara }
1622 1.1 isaki
1623 1.12 kiyohara static void
1624 1.12 kiyohara slhci_read_multi(struct slhci_softc *sc, uint8_t addr, uint8_t *buf, int l)
1625 1.12 kiyohara {
1626 1.12 kiyohara bus_size_t paddr, pdata, pst, psz;
1627 1.12 kiyohara bus_space_tag_t iot;
1628 1.12 kiyohara bus_space_handle_t ioh;
1629 1.12 kiyohara
1630 1.12 kiyohara paddr = pst = 0;
1631 1.12 kiyohara pdata = sc->sc_stride;
1632 1.12 kiyohara psz = pdata * 2;
1633 1.12 kiyohara iot = sc->sc_iot;
1634 1.12 kiyohara ioh = sc->sc_ioh;
1635 1.12 kiyohara
1636 1.12 kiyohara bus_space_write_1(iot, ioh, paddr, addr);
1637 1.12 kiyohara BSB(iot, ioh, pst, psz, WRITE_BEFORE_READ);
1638 1.12 kiyohara bus_space_read_multi_1(iot, ioh, pdata, buf, l);
1639 1.12 kiyohara BSB(iot, ioh, pst, psz, READ_BEFORE_WRITE);
1640 1.1 isaki }
1641 1.12 kiyohara #else
1642 1.1 isaki static void
1643 1.12 kiyohara slhci_write_multi(struct slhci_softc *sc, uint8_t addr, uint8_t *buf, int l)
1644 1.1 isaki {
1645 1.12 kiyohara #if 1
1646 1.12 kiyohara for (; l; addr++, buf++, l--)
1647 1.12 kiyohara slhci_write(sc, addr, *buf);
1648 1.12 kiyohara #else
1649 1.12 kiyohara bus_size_t paddr, pdata, pst, psz;
1650 1.12 kiyohara bus_space_tag_t iot;
1651 1.12 kiyohara bus_space_handle_t ioh;
1652 1.12 kiyohara
1653 1.12 kiyohara paddr = pst = 0;
1654 1.12 kiyohara pdata = sc->sc_stride;
1655 1.12 kiyohara psz = pdata * 2;
1656 1.12 kiyohara iot = sc->sc_iot;
1657 1.12 kiyohara ioh = sc->sc_ioh;
1658 1.12 kiyohara
1659 1.12 kiyohara for (; l; addr++, buf++, l--) {
1660 1.12 kiyohara bus_space_write_1(iot, ioh, paddr, addr);
1661 1.12 kiyohara BSB(iot, ioh, pst, psz, WRITE_BEFORE_WRITE);
1662 1.12 kiyohara bus_space_write_1(iot, ioh, pdata, *buf);
1663 1.12 kiyohara BSB(iot, ioh, pst, psz, WRITE_BEFORE_WRITE);
1664 1.12 kiyohara }
1665 1.12 kiyohara #endif
1666 1.1 isaki }
1667 1.1 isaki
1668 1.1 isaki static void
1669 1.12 kiyohara slhci_read_multi(struct slhci_softc *sc, uint8_t addr, uint8_t *buf, int l)
1670 1.1 isaki {
1671 1.12 kiyohara #if 1
1672 1.12 kiyohara for (; l; addr++, buf++, l--)
1673 1.12 kiyohara *buf = slhci_read(sc, addr);
1674 1.12 kiyohara #else
1675 1.12 kiyohara bus_size_t paddr, pdata, pst, psz;
1676 1.12 kiyohara bus_space_tag_t iot;
1677 1.12 kiyohara bus_space_handle_t ioh;
1678 1.12 kiyohara
1679 1.12 kiyohara paddr = pst = 0;
1680 1.12 kiyohara pdata = sc->sc_stride;
1681 1.12 kiyohara psz = pdata * 2;
1682 1.12 kiyohara iot = sc->sc_iot;
1683 1.12 kiyohara ioh = sc->sc_ioh;
1684 1.12 kiyohara
1685 1.12 kiyohara for (; l; addr++, buf++, l--) {
1686 1.12 kiyohara bus_space_write_1(iot, ioh, paddr, addr);
1687 1.12 kiyohara BSB(iot, ioh, pst, psz, WRITE_BEFORE_READ);
1688 1.12 kiyohara *buf = bus_space_read_1(iot, ioh, pdata);
1689 1.12 kiyohara BSB(iot, ioh, pst, psz, READ_BEFORE_WRITE);
1690 1.12 kiyohara }
1691 1.12 kiyohara #endif
1692 1.12 kiyohara }
1693 1.12 kiyohara #endif
1694 1.12 kiyohara
1695 1.34 skrll /*
1696 1.34 skrll * After calling waitintr it is necessary to either call slhci_callback or
1697 1.37 skrll * schedule the callback if necessary. The callback cannot be called directly
1698 1.37 skrll * from the hard interrupt since it interrupts at a high IPL and callbacks
1699 1.34 skrll * can do copyout and such.
1700 1.34 skrll */
1701 1.12 kiyohara static void
1702 1.12 kiyohara slhci_waitintr(struct slhci_softc *sc, int wait_time)
1703 1.12 kiyohara {
1704 1.56 skrll SLHCIHIST_FUNC(); SLHCIHIST_CALLED();
1705 1.12 kiyohara struct slhci_transfers *t;
1706 1.12 kiyohara
1707 1.12 kiyohara t = &sc->sc_transfers;
1708 1.12 kiyohara
1709 1.44 skrll KASSERT(mutex_owned(&sc->sc_intr_lock));
1710 1.12 kiyohara
1711 1.48 skrll if (__predict_false(sc->sc_bus.ub_usepolling))
1712 1.12 kiyohara wait_time = 12000;
1713 1.12 kiyohara
1714 1.12 kiyohara while (t->pend <= wait_time) {
1715 1.36 skrll DLOG(D_WAIT, "waiting... frame %d pend %d flags %#x",
1716 1.12 kiyohara t->frame, t->pend, t->flags, 0);
1717 1.12 kiyohara LK_SLASSERT(t->flags & F_ACTIVE, sc, NULL, NULL, return);
1718 1.36 skrll LK_SLASSERT(t->flags & (F_AINPROG|F_BINPROG), sc, NULL, NULL,
1719 1.12 kiyohara return);
1720 1.12 kiyohara slhci_dointr(sc);
1721 1.12 kiyohara }
1722 1.12 kiyohara }
1723 1.12 kiyohara
1724 1.12 kiyohara static int
1725 1.12 kiyohara slhci_dointr(struct slhci_softc *sc)
1726 1.12 kiyohara {
1727 1.56 skrll SLHCIHIST_FUNC(); SLHCIHIST_CALLED();
1728 1.12 kiyohara struct slhci_transfers *t;
1729 1.12 kiyohara struct slhci_pipe *tosp;
1730 1.12 kiyohara uint8_t r;
1731 1.12 kiyohara
1732 1.12 kiyohara t = &sc->sc_transfers;
1733 1.12 kiyohara
1734 1.44 skrll KASSERT(mutex_owned(&sc->sc_intr_lock));
1735 1.12 kiyohara
1736 1.12 kiyohara if (sc->sc_ier == 0)
1737 1.12 kiyohara return 0;
1738 1.12 kiyohara
1739 1.12 kiyohara r = slhci_read(sc, SL11_ISR);
1740 1.12 kiyohara
1741 1.12 kiyohara #ifdef SLHCI_DEBUG
1742 1.51 skrll if (slhcidebug & SLHCI_D_INTR && r & sc->sc_ier &&
1743 1.51 skrll ((r & ~(SL11_ISR_SOF|SL11_ISR_DATA)) || slhcidebug &
1744 1.12 kiyohara SLHCI_D_SOF)) {
1745 1.12 kiyohara uint8_t e, f;
1746 1.12 kiyohara
1747 1.12 kiyohara e = slhci_read(sc, SL11_IER);
1748 1.12 kiyohara f = slhci_read(sc, SL11_CTRL);
1749 1.12 kiyohara DDOLOG("Flags=%#x IER=%#x ISR=%#x", t->flags, e, r, 0);
1750 1.36 skrll DDOLOGFLAG8("Status=", r, "D+", (f & SL11_CTRL_SUSPEND) ?
1751 1.36 skrll "RESUME" : "NODEV", "INSERT", "SOF", "res", "BABBLE",
1752 1.12 kiyohara "USBB", "USBA");
1753 1.12 kiyohara }
1754 1.12 kiyohara #endif
1755 1.12 kiyohara
1756 1.40 skrll /*
1757 1.40 skrll * check IER for corruption occasionally. Assume that the above
1758 1.40 skrll * sc_ier == 0 case works correctly.
1759 1.40 skrll */
1760 1.12 kiyohara if (__predict_false(sc->sc_ier_check++ > SLHCI_IER_CHECK_FREQUENCY)) {
1761 1.12 kiyohara sc->sc_ier_check = 0;
1762 1.12 kiyohara if (sc->sc_ier != slhci_read(sc, SL11_IER)) {
1763 1.36 skrll printf("%s: IER value corrupted! halted\n",
1764 1.12 kiyohara SC_NAME(sc));
1765 1.36 skrll DDOLOG("%s: IER value corrupted! halted\n",
1766 1.12 kiyohara SC_NAME(sc), 0,0,0);
1767 1.36 skrll slhci_halt(sc, NULL, NULL);
1768 1.12 kiyohara return 1;
1769 1.12 kiyohara }
1770 1.12 kiyohara }
1771 1.12 kiyohara
1772 1.12 kiyohara r &= sc->sc_ier;
1773 1.12 kiyohara
1774 1.12 kiyohara if (r == 0)
1775 1.12 kiyohara return 0;
1776 1.12 kiyohara
1777 1.12 kiyohara sc->sc_ier_check = 0;
1778 1.12 kiyohara
1779 1.12 kiyohara slhci_write(sc, SL11_ISR, r);
1780 1.12 kiyohara BSB_SYNC(sc->iot, sc->ioh, sc->pst, sc->psz);
1781 1.12 kiyohara
1782 1.12 kiyohara /* If we have an insertion event we do not care about anything else. */
1783 1.12 kiyohara if (__predict_false(r & SL11_ISR_INSERT)) {
1784 1.12 kiyohara slhci_insert(sc);
1785 1.12 kiyohara return 1;
1786 1.12 kiyohara }
1787 1.12 kiyohara
1788 1.12 kiyohara stop_cc_time(&t_intr);
1789 1.12 kiyohara start_cc_time(&t_intr, r);
1790 1.12 kiyohara
1791 1.12 kiyohara if (r & SL11_ISR_SOF) {
1792 1.12 kiyohara t->frame++;
1793 1.12 kiyohara
1794 1.12 kiyohara gcq_merge_tail(&t->q[Q_CB], &t->q[Q_NEXT_CB]);
1795 1.12 kiyohara
1796 1.34 skrll /*
1797 1.34 skrll * SOFCHECK flags are cleared in tstart. Two flags are needed
1798 1.37 skrll * since the first SOF interrupt processed after the transfer
1799 1.37 skrll * is started might have been generated before the transfer
1800 1.34 skrll * was started.
1801 1.34 skrll */
1802 1.37 skrll if (__predict_false(t->flags & F_SOFCHECK2 && t->flags &
1803 1.12 kiyohara (F_AINPROG|F_BINPROG))) {
1804 1.12 kiyohara printf("%s: Missed transfer completion. halted\n",
1805 1.12 kiyohara SC_NAME(sc));
1806 1.12 kiyohara DDOLOG("%s: Missed transfer completion. halted\n",
1807 1.12 kiyohara SC_NAME(sc), 0,0,0);
1808 1.12 kiyohara slhci_halt(sc, NULL, NULL);
1809 1.12 kiyohara return 1;
1810 1.12 kiyohara } else if (t->flags & F_SOFCHECK1) {
1811 1.12 kiyohara t->flags |= F_SOFCHECK2;
1812 1.12 kiyohara } else
1813 1.12 kiyohara t->flags |= F_SOFCHECK1;
1814 1.12 kiyohara
1815 1.12 kiyohara if (t->flags & F_CHANGE)
1816 1.12 kiyohara t->flags |= F_ROOTINTR;
1817 1.12 kiyohara
1818 1.12 kiyohara while (__predict_true(GOT_FIRST_TO(tosp, t)) &&
1819 1.12 kiyohara __predict_false(tosp->to_frame <= t->frame)) {
1820 1.48 skrll tosp->xfer->ux_status = USBD_TIMEOUT;
1821 1.12 kiyohara slhci_do_abort(sc, tosp, tosp->xfer);
1822 1.12 kiyohara enter_callback(t, tosp);
1823 1.12 kiyohara }
1824 1.12 kiyohara
1825 1.34 skrll /*
1826 1.34 skrll * Start any waiting transfers right away. If none, we will
1827 1.34 skrll * start any new transfers later.
1828 1.34 skrll */
1829 1.12 kiyohara slhci_tstart(sc);
1830 1.12 kiyohara }
1831 1.12 kiyohara
1832 1.12 kiyohara if (r & (SL11_ISR_USBA|SL11_ISR_USBB)) {
1833 1.12 kiyohara int ab;
1834 1.12 kiyohara
1835 1.36 skrll if ((r & (SL11_ISR_USBA|SL11_ISR_USBB)) ==
1836 1.12 kiyohara (SL11_ISR_USBA|SL11_ISR_USBB)) {
1837 1.12 kiyohara if (!(t->flags & (F_AINPROG|F_BINPROG)))
1838 1.12 kiyohara return 1; /* presume card pulled */
1839 1.12 kiyohara
1840 1.36 skrll LK_SLASSERT((t->flags & (F_AINPROG|F_BINPROG)) !=
1841 1.12 kiyohara (F_AINPROG|F_BINPROG), sc, NULL, NULL, return 1);
1842 1.12 kiyohara
1843 1.34 skrll /*
1844 1.34 skrll * This should never happen (unless card removal just
1845 1.12 kiyohara * occurred) but appeared frequently when both
1846 1.36 skrll * transfers were started at the same time and was
1847 1.36 skrll * accompanied by data corruption. It still happens
1848 1.36 skrll * at times. I have not seen data correption except
1849 1.36 skrll * when the STATUS bit gets set, which now causes the
1850 1.36 skrll * driver to halt, however this should still not
1851 1.36 skrll * happen so the warning is kept. See comment in
1852 1.12 kiyohara * abdone, below.
1853 1.12 kiyohara */
1854 1.12 kiyohara printf("%s: Transfer reported done but not started! "
1855 1.12 kiyohara "Verify data integrity if not detaching. "
1856 1.12 kiyohara " flags %#x r %x\n", SC_NAME(sc), t->flags, r);
1857 1.12 kiyohara
1858 1.12 kiyohara if (!(t->flags & F_AINPROG))
1859 1.12 kiyohara r &= ~SL11_ISR_USBA;
1860 1.12 kiyohara else
1861 1.12 kiyohara r &= ~SL11_ISR_USBB;
1862 1.12 kiyohara }
1863 1.12 kiyohara t->pend = INT_MAX;
1864 1.12 kiyohara
1865 1.12 kiyohara if (r & SL11_ISR_USBA)
1866 1.12 kiyohara ab = A;
1867 1.36 skrll else
1868 1.12 kiyohara ab = B;
1869 1.12 kiyohara
1870 1.34 skrll /*
1871 1.34 skrll * This happens when a low speed device is attached to
1872 1.37 skrll * a hub with chip rev 1.5. SOF stops, but a few transfers
1873 1.12 kiyohara * still work before causing this error.
1874 1.12 kiyohara */
1875 1.12 kiyohara if (!(t->flags & (ab ? F_BINPROG : F_AINPROG))) {
1876 1.36 skrll printf("%s: %s done but not in progress! halted\n",
1877 1.12 kiyohara SC_NAME(sc), ab ? "B" : "A");
1878 1.36 skrll DDOLOG("%s: %s done but not in progress! halted\n",
1879 1.12 kiyohara SC_NAME(sc), ab ? "B" : "A", 0,0);
1880 1.12 kiyohara slhci_halt(sc, NULL, NULL);
1881 1.12 kiyohara return 1;
1882 1.12 kiyohara }
1883 1.12 kiyohara
1884 1.12 kiyohara t->flags &= ~(ab ? F_BINPROG : F_AINPROG);
1885 1.12 kiyohara slhci_tstart(sc);
1886 1.12 kiyohara stop_cc_time(&t_ab[ab]);
1887 1.12 kiyohara start_cc_time(&t_abdone, t->flags);
1888 1.12 kiyohara slhci_abdone(sc, ab);
1889 1.12 kiyohara stop_cc_time(&t_abdone);
1890 1.12 kiyohara }
1891 1.12 kiyohara
1892 1.12 kiyohara slhci_dotransfer(sc);
1893 1.12 kiyohara
1894 1.12 kiyohara return 1;
1895 1.12 kiyohara }
1896 1.12 kiyohara
1897 1.12 kiyohara static void
1898 1.12 kiyohara slhci_abdone(struct slhci_softc *sc, int ab)
1899 1.12 kiyohara {
1900 1.56 skrll SLHCIHIST_FUNC(); SLHCIHIST_CALLED();
1901 1.12 kiyohara struct slhci_transfers *t;
1902 1.12 kiyohara struct slhci_pipe *spipe;
1903 1.12 kiyohara struct usbd_xfer *xfer;
1904 1.36 skrll uint8_t status, buf_start;
1905 1.12 kiyohara uint8_t *target_buf;
1906 1.12 kiyohara unsigned int actlen;
1907 1.12 kiyohara int head;
1908 1.12 kiyohara
1909 1.12 kiyohara t = &sc->sc_transfers;
1910 1.12 kiyohara
1911 1.44 skrll KASSERT(mutex_owned(&sc->sc_intr_lock));
1912 1.12 kiyohara
1913 1.12 kiyohara DLOG(D_TRACE, "ABDONE flags %#x", t->flags, 0,0,0);
1914 1.12 kiyohara
1915 1.36 skrll DLOG(D_MSG, "DONE %s spipe %p len %d xfer %p", ab ? "B" : "A",
1916 1.36 skrll t->spipe[ab], t->len[ab], t->spipe[ab] ?
1917 1.12 kiyohara t->spipe[ab]->xfer : NULL);
1918 1.12 kiyohara
1919 1.12 kiyohara spipe = t->spipe[ab];
1920 1.12 kiyohara
1921 1.34 skrll /*
1922 1.34 skrll * skip this one if aborted; do not call return from the rest of the
1923 1.34 skrll * function unless halting, else t->len will not be cleared.
1924 1.34 skrll */
1925 1.12 kiyohara if (spipe == NULL)
1926 1.12 kiyohara goto done;
1927 1.12 kiyohara
1928 1.12 kiyohara t->spipe[ab] = NULL;
1929 1.12 kiyohara
1930 1.12 kiyohara xfer = spipe->xfer;
1931 1.12 kiyohara
1932 1.12 kiyohara gcq_remove(&spipe->to);
1933 1.12 kiyohara
1934 1.12 kiyohara LK_SLASSERT(xfer != NULL, sc, spipe, NULL, return);
1935 1.12 kiyohara
1936 1.12 kiyohara status = slhci_read(sc, slhci_tregs[ab][STAT]);
1937 1.12 kiyohara
1938 1.12 kiyohara /*
1939 1.36 skrll * I saw no status or remaining length greater than the requested
1940 1.36 skrll * length in early driver versions in circumstances I assumed caused
1941 1.36 skrll * excess power draw. I am no longer able to reproduce this when
1942 1.36 skrll * causing excess power draw circumstances.
1943 1.36 skrll *
1944 1.36 skrll * Disabling a power check and attaching aue to a keyboard and hub
1945 1.36 skrll * that is directly attached (to CFU1U, 100mA max, aue 160mA, keyboard
1946 1.36 skrll * 98mA) sometimes works and sometimes fails to configure. After
1947 1.36 skrll * removing the aue and attaching a self-powered umass dvd reader
1948 1.36 skrll * (unknown if it draws power from the host also) soon a single Error
1949 1.36 skrll * status occurs then only timeouts. The controller soon halts freeing
1950 1.36 skrll * memory due to being ONQU instead of BUSY. This may be the same
1951 1.36 skrll * basic sequence that caused the no status/bad length errors. The
1952 1.36 skrll * umass device seems to work (better at least) with the keyboard hub
1953 1.36 skrll * when not first attaching aue (tested once reading an approximately
1954 1.12 kiyohara * 200MB file).
1955 1.36 skrll *
1956 1.36 skrll * Overflow can indicate that the device and host disagree about how
1957 1.36 skrll * much data has been transfered. This may indicate a problem at any
1958 1.36 skrll * point during the transfer, not just when the error occurs. It may
1959 1.12 kiyohara * indicate data corruption. A warning message is printed.
1960 1.12 kiyohara *
1961 1.36 skrll * Trying to use both A and B transfers at the same time results in
1962 1.36 skrll * incorrect transfer completion ISR reports and the status will then
1963 1.36 skrll * include SL11_EPSTAT_SETUP, which is apparently set while the
1964 1.36 skrll * transfer is in progress. I also noticed data corruption, even
1965 1.36 skrll * after waiting for the transfer to complete. The driver now avoids
1966 1.12 kiyohara * trying to start both at the same time.
1967 1.12 kiyohara *
1968 1.36 skrll * I had accidently initialized the B registers before they were valid
1969 1.36 skrll * in some driver versions. Since every other performance enhancing
1970 1.36 skrll * feature has been confirmed buggy in the errata doc, I have not
1971 1.12 kiyohara * tried both transfers at once again with the documented
1972 1.12 kiyohara * initialization order.
1973 1.36 skrll *
1974 1.36 skrll * However, I have seen this problem again ("done but not started"
1975 1.36 skrll * errors), which in some cases cases the SETUP status bit to remain
1976 1.36 skrll * set on future transfers. In other cases, the SETUP bit is not set
1977 1.36 skrll * and no data corruption occurs. This occured while using both umass
1978 1.36 skrll * and aue on a powered hub (maybe triggered by some local activity
1979 1.36 skrll * also) and needs several reads of the 200MB file to trigger. The
1980 1.12 kiyohara * driver now halts if SETUP is detected.
1981 1.12 kiyohara */
1982 1.12 kiyohara
1983 1.12 kiyohara actlen = 0;
1984 1.12 kiyohara
1985 1.12 kiyohara if (__predict_false(!status)) {
1986 1.12 kiyohara DDOLOG("no status! xfer %p spipe %p", xfer, spipe, 0,0);
1987 1.12 kiyohara printf("%s: no status! halted\n", SC_NAME(sc));
1988 1.12 kiyohara slhci_halt(sc, spipe, xfer);
1989 1.12 kiyohara return;
1990 1.36 skrll }
1991 1.12 kiyohara
1992 1.12 kiyohara #ifdef SLHCI_DEBUG
1993 1.51 skrll if (slhcidebug & SLHCI_D_NAK || (status & SL11_EPSTAT_ERRBITS) !=
1994 1.12 kiyohara SL11_EPSTAT_NAK)
1995 1.36 skrll DLOGFLAG8(D_XFER, "STATUS=", status, "STALL", "NAK",
1996 1.36 skrll "Overflow", "Setup", "Data Toggle", "Timeout", "Error",
1997 1.12 kiyohara "ACK");
1998 1.12 kiyohara #endif
1999 1.12 kiyohara
2000 1.12 kiyohara if (!(status & SL11_EPSTAT_ERRBITS)) {
2001 1.12 kiyohara unsigned int cont;
2002 1.12 kiyohara cont = slhci_read(sc, slhci_tregs[ab][CONT]);
2003 1.12 kiyohara if (cont != 0)
2004 1.36 skrll DLOG(D_XFER, "cont %d len %d", cont,
2005 1.12 kiyohara spipe->tregs[LEN], 0,0);
2006 1.12 kiyohara if (__predict_false(cont > spipe->tregs[LEN])) {
2007 1.48 skrll DDOLOG("cont > len! cont %d len %d xfer->ux_length %d "
2008 1.48 skrll "spipe %p", cont, spipe->tregs[LEN], xfer->ux_length,
2009 1.12 kiyohara spipe);
2010 1.48 skrll printf("%s: cont > len! cont %d len %d xfer->ux_length "
2011 1.36 skrll "%d", SC_NAME(sc), cont, spipe->tregs[LEN],
2012 1.48 skrll xfer->ux_length);
2013 1.12 kiyohara slhci_halt(sc, spipe, xfer);
2014 1.12 kiyohara return;
2015 1.12 kiyohara } else {
2016 1.12 kiyohara spipe->nerrs = 0;
2017 1.12 kiyohara actlen = spipe->tregs[LEN] - cont;
2018 1.12 kiyohara }
2019 1.12 kiyohara }
2020 1.12 kiyohara
2021 1.12 kiyohara /* Actual copyin done after starting next transfer. */
2022 1.12 kiyohara if (actlen && (spipe->tregs[PID] & SL11_PID_BITS) == SL11_PID_IN) {
2023 1.12 kiyohara target_buf = spipe->buffer;
2024 1.12 kiyohara buf_start = spipe->tregs[ADR];
2025 1.12 kiyohara } else {
2026 1.12 kiyohara target_buf = NULL;
2027 1.12 kiyohara buf_start = 0; /* XXX gcc uninitialized warnings */
2028 1.12 kiyohara }
2029 1.12 kiyohara
2030 1.12 kiyohara if (status & SL11_EPSTAT_ERRBITS) {
2031 1.12 kiyohara status &= SL11_EPSTAT_ERRBITS;
2032 1.12 kiyohara if (status & SL11_EPSTAT_SETUP) {
2033 1.12 kiyohara printf("%s: Invalid controller state detected! "
2034 1.12 kiyohara "halted\n", SC_NAME(sc));
2035 1.12 kiyohara DDOLOG("%s: Invalid controller state detected! "
2036 1.12 kiyohara "halted\n", SC_NAME(sc), 0,0,0);
2037 1.12 kiyohara slhci_halt(sc, spipe, xfer);
2038 1.12 kiyohara return;
2039 1.48 skrll } else if (__predict_false(sc->sc_bus.ub_usepolling)) {
2040 1.12 kiyohara if (status == SL11_EPSTAT_STALL)
2041 1.48 skrll xfer->ux_status = USBD_STALLED;
2042 1.12 kiyohara else if (status == SL11_EPSTAT_TIMEOUT)
2043 1.48 skrll xfer->ux_status = USBD_TIMEOUT;
2044 1.12 kiyohara else if (status == SL11_EPSTAT_NAK)
2045 1.48 skrll xfer->ux_status = USBD_TIMEOUT; /*XXX*/
2046 1.12 kiyohara else
2047 1.48 skrll xfer->ux_status = USBD_IOERROR;
2048 1.12 kiyohara head = Q_CALLBACKS;
2049 1.12 kiyohara } else if (status == SL11_EPSTAT_NAK) {
2050 1.48 skrll if (spipe->pipe.up_interval) {
2051 1.36 skrll spipe->lastframe = spipe->frame =
2052 1.48 skrll t->frame + spipe->pipe.up_interval;
2053 1.12 kiyohara slhci_queue_timed(sc, spipe);
2054 1.12 kiyohara goto queued;
2055 1.12 kiyohara }
2056 1.12 kiyohara head = Q_NEXT_CB;
2057 1.36 skrll } else if (++spipe->nerrs > SLHCI_MAX_RETRIES ||
2058 1.12 kiyohara status == SL11_EPSTAT_STALL) {
2059 1.12 kiyohara if (status == SL11_EPSTAT_STALL)
2060 1.48 skrll xfer->ux_status = USBD_STALLED;
2061 1.12 kiyohara else if (status == SL11_EPSTAT_TIMEOUT)
2062 1.48 skrll xfer->ux_status = USBD_TIMEOUT;
2063 1.12 kiyohara else
2064 1.48 skrll xfer->ux_status = USBD_IOERROR;
2065 1.12 kiyohara
2066 1.12 kiyohara DLOG(D_ERR, "Max retries reached! status %#x "
2067 1.48 skrll "xfer->ux_status %#x", status, xfer->ux_status, 0,0);
2068 1.36 skrll DLOGFLAG8(D_ERR, "STATUS=", status, "STALL",
2069 1.36 skrll "NAK", "Overflow", "Setup", "Data Toggle",
2070 1.12 kiyohara "Timeout", "Error", "ACK");
2071 1.12 kiyohara
2072 1.12 kiyohara if (status == SL11_EPSTAT_OVERFLOW &&
2073 1.36 skrll ratecheck(&sc->sc_overflow_warn_rate,
2074 1.12 kiyohara &overflow_warn_rate)) {
2075 1.12 kiyohara printf("%s: Overflow condition: "
2076 1.36 skrll "data corruption possible\n",
2077 1.12 kiyohara SC_NAME(sc));
2078 1.12 kiyohara DDOLOG("%s: Overflow condition: "
2079 1.36 skrll "data corruption possible\n",
2080 1.12 kiyohara SC_NAME(sc), 0,0,0);
2081 1.12 kiyohara }
2082 1.12 kiyohara head = Q_CALLBACKS;
2083 1.12 kiyohara } else {
2084 1.12 kiyohara head = Q_NEXT_CB;
2085 1.12 kiyohara }
2086 1.12 kiyohara } else if (spipe->ptype == PT_CTRL_SETUP) {
2087 1.12 kiyohara spipe->tregs[PID] = spipe->newpid;
2088 1.12 kiyohara
2089 1.48 skrll if (xfer->ux_length) {
2090 1.36 skrll LK_SLASSERT(spipe->newlen[1] != 0, sc, spipe, xfer,
2091 1.12 kiyohara return);
2092 1.12 kiyohara spipe->tregs[LEN] = spipe->newlen[1];
2093 1.12 kiyohara spipe->bustime = spipe->newbustime[1];
2094 1.48 skrll spipe->buffer = xfer->ux_buf;
2095 1.12 kiyohara spipe->ptype = PT_CTRL_DATA;
2096 1.12 kiyohara } else {
2097 1.12 kiyohara status_setup:
2098 1.12 kiyohara /* CTRL_DATA swaps direction in PID then jumps here */
2099 1.12 kiyohara spipe->tregs[LEN] = 0;
2100 1.12 kiyohara if (spipe->pflags & PF_LS)
2101 1.12 kiyohara spipe->bustime = SLHCI_LS_CONST;
2102 1.12 kiyohara else
2103 1.12 kiyohara spipe->bustime = SLHCI_FS_CONST;
2104 1.12 kiyohara spipe->ptype = PT_CTRL_STATUS;
2105 1.12 kiyohara spipe->buffer = NULL;
2106 1.12 kiyohara }
2107 1.12 kiyohara
2108 1.12 kiyohara /* Status or first data packet must be DATA1. */
2109 1.12 kiyohara spipe->control |= SL11_EPCTRL_DATATOGGLE;
2110 1.12 kiyohara if ((spipe->tregs[PID] & SL11_PID_BITS) == SL11_PID_IN)
2111 1.12 kiyohara spipe->control &= ~SL11_EPCTRL_DIRECTION;
2112 1.36 skrll else
2113 1.12 kiyohara spipe->control |= SL11_EPCTRL_DIRECTION;
2114 1.12 kiyohara
2115 1.12 kiyohara head = Q_CB;
2116 1.12 kiyohara } else if (spipe->ptype == PT_CTRL_STATUS) {
2117 1.12 kiyohara head = Q_CALLBACKS;
2118 1.12 kiyohara } else { /* bulk, intr, control data */
2119 1.48 skrll xfer->ux_actlen += actlen;
2120 1.12 kiyohara spipe->control ^= SL11_EPCTRL_DATATOGGLE;
2121 1.12 kiyohara
2122 1.48 skrll if (actlen == spipe->tregs[LEN] && (xfer->ux_length >
2123 1.48 skrll xfer->ux_actlen || spipe->wantshort)) {
2124 1.12 kiyohara spipe->buffer += actlen;
2125 1.48 skrll LK_SLASSERT(xfer->ux_length >= xfer->ux_actlen, sc,
2126 1.12 kiyohara spipe, xfer, return);
2127 1.48 skrll if (xfer->ux_length - xfer->ux_actlen < actlen) {
2128 1.12 kiyohara spipe->wantshort = 0;
2129 1.12 kiyohara spipe->tregs[LEN] = spipe->newlen[0];
2130 1.12 kiyohara spipe->bustime = spipe->newbustime[0];
2131 1.48 skrll LK_SLASSERT(xfer->ux_actlen +
2132 1.48 skrll spipe->tregs[LEN] == xfer->ux_length, sc,
2133 1.12 kiyohara spipe, xfer, return);
2134 1.12 kiyohara }
2135 1.12 kiyohara head = Q_CB;
2136 1.12 kiyohara } else if (spipe->ptype == PT_CTRL_DATA) {
2137 1.12 kiyohara spipe->tregs[PID] ^= SLHCI_PID_SWAP_IN_OUT;
2138 1.12 kiyohara goto status_setup;
2139 1.12 kiyohara } else {
2140 1.12 kiyohara if (spipe->ptype == PT_INTR) {
2141 1.36 skrll spipe->lastframe +=
2142 1.48 skrll spipe->pipe.up_interval;
2143 1.34 skrll /*
2144 1.34 skrll * If ack, we try to keep the
2145 1.37 skrll * interrupt rate by using lastframe
2146 1.34 skrll * instead of the current frame.
2147 1.34 skrll */
2148 1.12 kiyohara spipe->frame = spipe->lastframe +
2149 1.48 skrll spipe->pipe.up_interval;
2150 1.12 kiyohara }
2151 1.12 kiyohara
2152 1.34 skrll /*
2153 1.34 skrll * Set the toggle for the next transfer. It
2154 1.37 skrll * has already been toggled above, so the
2155 1.37 skrll * current setting will apply to the next
2156 1.34 skrll * transfer.
2157 1.34 skrll */
2158 1.12 kiyohara if (spipe->control & SL11_EPCTRL_DATATOGGLE)
2159 1.12 kiyohara spipe->pflags |= PF_TOGGLE;
2160 1.12 kiyohara else
2161 1.12 kiyohara spipe->pflags &= ~PF_TOGGLE;
2162 1.12 kiyohara
2163 1.12 kiyohara head = Q_CALLBACKS;
2164 1.12 kiyohara }
2165 1.12 kiyohara }
2166 1.12 kiyohara
2167 1.12 kiyohara if (head == Q_CALLBACKS) {
2168 1.12 kiyohara gcq_remove(&spipe->to);
2169 1.12 kiyohara
2170 1.48 skrll if (xfer->ux_status == USBD_IN_PROGRESS) {
2171 1.48 skrll LK_SLASSERT(xfer->ux_actlen <= xfer->ux_length, sc,
2172 1.12 kiyohara spipe, xfer, return);
2173 1.48 skrll xfer->ux_status = USBD_NORMAL_COMPLETION;
2174 1.12 kiyohara #if 0 /* usb_transfer_complete will do this */
2175 1.48 skrll if (xfer->ux_length == xfer->ux_actlen || xfer->ux_flags &
2176 1.12 kiyohara USBD_SHORT_XFER_OK)
2177 1.48 skrll xfer->ux_status = USBD_NORMAL_COMPLETION;
2178 1.12 kiyohara else
2179 1.48 skrll xfer->ux_status = USBD_SHORT_XFER;
2180 1.12 kiyohara #endif
2181 1.12 kiyohara }
2182 1.12 kiyohara }
2183 1.12 kiyohara
2184 1.12 kiyohara enter_q(t, spipe, head);
2185 1.12 kiyohara
2186 1.12 kiyohara queued:
2187 1.12 kiyohara if (target_buf != NULL) {
2188 1.12 kiyohara slhci_dotransfer(sc);
2189 1.12 kiyohara start_cc_time(&t_copy_from_dev, actlen);
2190 1.12 kiyohara slhci_read_multi(sc, buf_start, target_buf, actlen);
2191 1.12 kiyohara stop_cc_time(&t_copy_from_dev);
2192 1.12 kiyohara DLOGBUF(D_BUF, target_buf, actlen);
2193 1.12 kiyohara t->pend -= SLHCI_FS_CONST + SLHCI_FS_DATA_TIME(actlen);
2194 1.12 kiyohara }
2195 1.12 kiyohara
2196 1.12 kiyohara done:
2197 1.12 kiyohara t->len[ab] = -1;
2198 1.12 kiyohara }
2199 1.12 kiyohara
2200 1.12 kiyohara static void
2201 1.12 kiyohara slhci_tstart(struct slhci_softc *sc)
2202 1.12 kiyohara {
2203 1.12 kiyohara struct slhci_transfers *t;
2204 1.12 kiyohara struct slhci_pipe *spipe;
2205 1.12 kiyohara int remaining_bustime;
2206 1.12 kiyohara
2207 1.12 kiyohara t = &sc->sc_transfers;
2208 1.12 kiyohara
2209 1.44 skrll KASSERT(mutex_owned(&sc->sc_intr_lock));
2210 1.12 kiyohara
2211 1.12 kiyohara if (!(t->flags & (F_AREADY|F_BREADY)))
2212 1.12 kiyohara return;
2213 1.12 kiyohara
2214 1.12 kiyohara if (t->flags & (F_AINPROG|F_BINPROG|F_DISABLED))
2215 1.12 kiyohara return;
2216 1.12 kiyohara
2217 1.34 skrll /*
2218 1.34 skrll * We have about 6 us to get from the bus time check to
2219 1.37 skrll * starting the transfer or we might babble or the chip might fail to
2220 1.37 skrll * signal transfer complete. This leaves no time for any other
2221 1.25 rmind * interrupts.
2222 1.25 rmind */
2223 1.12 kiyohara remaining_bustime = (int)(slhci_read(sc, SL811_CSOF)) << 6;
2224 1.12 kiyohara remaining_bustime -= SLHCI_END_BUSTIME;
2225 1.12 kiyohara
2226 1.34 skrll /*
2227 1.34 skrll * Start one transfer only, clearing any aborted transfers that are
2228 1.37 skrll * not yet in progress and skipping missed isoc. It is easier to copy
2229 1.37 skrll * & paste most of the A/B sections than to make the logic work
2230 1.34 skrll * otherwise and this allows better constant use.
2231 1.34 skrll */
2232 1.12 kiyohara if (t->flags & F_AREADY) {
2233 1.12 kiyohara spipe = t->spipe[A];
2234 1.12 kiyohara if (spipe == NULL) {
2235 1.12 kiyohara t->flags &= ~F_AREADY;
2236 1.12 kiyohara t->len[A] = -1;
2237 1.12 kiyohara } else if (remaining_bustime >= spipe->bustime) {
2238 1.12 kiyohara t->flags &= ~(F_AREADY|F_SOFCHECK1|F_SOFCHECK2);
2239 1.12 kiyohara t->flags |= F_AINPROG;
2240 1.12 kiyohara start_cc_time(&t_ab[A], spipe->tregs[LEN]);
2241 1.12 kiyohara slhci_write(sc, SL11_E0CTRL, spipe->control);
2242 1.12 kiyohara goto pend;
2243 1.36 skrll }
2244 1.12 kiyohara }
2245 1.12 kiyohara if (t->flags & F_BREADY) {
2246 1.12 kiyohara spipe = t->spipe[B];
2247 1.12 kiyohara if (spipe == NULL) {
2248 1.12 kiyohara t->flags &= ~F_BREADY;
2249 1.12 kiyohara t->len[B] = -1;
2250 1.12 kiyohara } else if (remaining_bustime >= spipe->bustime) {
2251 1.12 kiyohara t->flags &= ~(F_BREADY|F_SOFCHECK1|F_SOFCHECK2);
2252 1.12 kiyohara t->flags |= F_BINPROG;
2253 1.12 kiyohara start_cc_time(&t_ab[B], spipe->tregs[LEN]);
2254 1.12 kiyohara slhci_write(sc, SL11_E1CTRL, spipe->control);
2255 1.12 kiyohara pend:
2256 1.12 kiyohara t->pend = spipe->bustime;
2257 1.12 kiyohara }
2258 1.12 kiyohara }
2259 1.12 kiyohara }
2260 1.12 kiyohara
2261 1.12 kiyohara static void
2262 1.12 kiyohara slhci_dotransfer(struct slhci_softc *sc)
2263 1.12 kiyohara {
2264 1.56 skrll SLHCIHIST_FUNC(); SLHCIHIST_CALLED();
2265 1.12 kiyohara struct slhci_transfers *t;
2266 1.12 kiyohara struct slhci_pipe *spipe;
2267 1.12 kiyohara int ab, i;
2268 1.12 kiyohara
2269 1.12 kiyohara t = &sc->sc_transfers;
2270 1.12 kiyohara
2271 1.44 skrll KASSERT(mutex_owned(&sc->sc_intr_lock));
2272 1.12 kiyohara
2273 1.12 kiyohara while ((t->len[A] == -1 || t->len[B] == -1) &&
2274 1.36 skrll (GOT_FIRST_TIMED_COND(spipe, t, spipe->frame <= t->frame) ||
2275 1.12 kiyohara GOT_FIRST_CB(spipe, t))) {
2276 1.12 kiyohara LK_SLASSERT(spipe->xfer != NULL, sc, spipe, NULL, return);
2277 1.36 skrll LK_SLASSERT(spipe->ptype != PT_ROOT_CTRL && spipe->ptype !=
2278 1.36 skrll PT_ROOT_INTR, sc, spipe, NULL, return);
2279 1.36 skrll
2280 1.36 skrll /* Check that this transfer can fit in the remaining memory. */
2281 1.37 skrll if (t->len[A] + t->len[B] + spipe->tregs[LEN] + 1 >
2282 1.12 kiyohara SL11_MAX_PACKET_SIZE) {
2283 1.12 kiyohara DLOG(D_XFER, "Transfer does not fit. alen %d blen %d "
2284 1.37 skrll "len %d", t->len[A], t->len[B], spipe->tregs[LEN],
2285 1.12 kiyohara 0);
2286 1.12 kiyohara return;
2287 1.12 kiyohara }
2288 1.12 kiyohara
2289 1.12 kiyohara gcq_remove(&spipe->xq);
2290 1.12 kiyohara
2291 1.12 kiyohara if (t->len[A] == -1) {
2292 1.12 kiyohara ab = A;
2293 1.12 kiyohara spipe->tregs[ADR] = SL11_BUFFER_START;
2294 1.12 kiyohara } else {
2295 1.12 kiyohara ab = B;
2296 1.37 skrll spipe->tregs[ADR] = SL11_BUFFER_END -
2297 1.12 kiyohara spipe->tregs[LEN];
2298 1.12 kiyohara }
2299 1.12 kiyohara
2300 1.12 kiyohara t->len[ab] = spipe->tregs[LEN];
2301 1.12 kiyohara
2302 1.37 skrll if (spipe->tregs[LEN] && (spipe->tregs[PID] & SL11_PID_BITS)
2303 1.12 kiyohara != SL11_PID_IN) {
2304 1.37 skrll start_cc_time(&t_copy_to_dev,
2305 1.12 kiyohara spipe->tregs[LEN]);
2306 1.37 skrll slhci_write_multi(sc, spipe->tregs[ADR],
2307 1.12 kiyohara spipe->buffer, spipe->tregs[LEN]);
2308 1.12 kiyohara stop_cc_time(&t_copy_to_dev);
2309 1.37 skrll t->pend -= SLHCI_FS_CONST +
2310 1.12 kiyohara SLHCI_FS_DATA_TIME(spipe->tregs[LEN]);
2311 1.12 kiyohara }
2312 1.12 kiyohara
2313 1.37 skrll DLOG(D_MSG, "NEW TRANSFER %s flags %#x alen %d blen %d",
2314 1.12 kiyohara ab ? "B" : "A", t->flags, t->len[0], t->len[1]);
2315 1.12 kiyohara
2316 1.12 kiyohara if (spipe->tregs[LEN])
2317 1.12 kiyohara i = 0;
2318 1.12 kiyohara else
2319 1.12 kiyohara i = 1;
2320 1.12 kiyohara
2321 1.12 kiyohara for (; i <= 3; i++)
2322 1.12 kiyohara if (t->current_tregs[ab][i] != spipe->tregs[i]) {
2323 1.12 kiyohara t->current_tregs[ab][i] = spipe->tregs[i];
2324 1.37 skrll slhci_write(sc, slhci_tregs[ab][i],
2325 1.12 kiyohara spipe->tregs[i]);
2326 1.12 kiyohara }
2327 1.12 kiyohara
2328 1.37 skrll DLOG(D_SXFER, "Transfer len %d pid %#x dev %d type %s",
2329 1.37 skrll spipe->tregs[LEN], spipe->tregs[PID], spipe->tregs[DEV],
2330 1.12 kiyohara pnames(spipe->ptype));
2331 1.12 kiyohara
2332 1.12 kiyohara t->spipe[ab] = spipe;
2333 1.12 kiyohara t->flags |= ab ? F_BREADY : F_AREADY;
2334 1.12 kiyohara
2335 1.12 kiyohara slhci_tstart(sc);
2336 1.12 kiyohara }
2337 1.12 kiyohara }
2338 1.12 kiyohara
2339 1.34 skrll /*
2340 1.34 skrll * slhci_callback is called after the lock is taken from splusb.
2341 1.34 skrll */
2342 1.12 kiyohara static void
2343 1.41 skrll slhci_callback(struct slhci_softc *sc)
2344 1.12 kiyohara {
2345 1.56 skrll SLHCIHIST_FUNC(); SLHCIHIST_CALLED();
2346 1.12 kiyohara struct slhci_transfers *t;
2347 1.12 kiyohara struct slhci_pipe *spipe;
2348 1.12 kiyohara struct usbd_xfer *xfer;
2349 1.12 kiyohara
2350 1.12 kiyohara t = &sc->sc_transfers;
2351 1.12 kiyohara
2352 1.44 skrll KASSERT(mutex_owned(&sc->sc_intr_lock));
2353 1.12 kiyohara
2354 1.12 kiyohara DLOG(D_SOFT, "CB flags %#x", t->flags, 0,0,0);
2355 1.12 kiyohara for (;;) {
2356 1.12 kiyohara if (__predict_false(t->flags & F_ROOTINTR)) {
2357 1.12 kiyohara t->flags &= ~F_ROOTINTR;
2358 1.12 kiyohara if (t->rootintr != NULL) {
2359 1.12 kiyohara u_char *p;
2360 1.12 kiyohara
2361 1.48 skrll p = t->rootintr->ux_buf;
2362 1.12 kiyohara p[0] = 2;
2363 1.48 skrll t->rootintr->ux_actlen = 1;
2364 1.48 skrll t->rootintr->ux_status = USBD_NORMAL_COMPLETION;
2365 1.12 kiyohara xfer = t->rootintr;
2366 1.12 kiyohara goto do_callback;
2367 1.12 kiyohara }
2368 1.37 skrll }
2369 1.12 kiyohara
2370 1.12 kiyohara
2371 1.12 kiyohara if (!DEQUEUED_CALLBACK(spipe, t))
2372 1.12 kiyohara return;
2373 1.12 kiyohara
2374 1.12 kiyohara xfer = spipe->xfer;
2375 1.12 kiyohara LK_SLASSERT(xfer != NULL, sc, spipe, NULL, return);
2376 1.12 kiyohara spipe->xfer = NULL;
2377 1.12 kiyohara DLOG(D_XFER, "xfer callback length %d actlen %d spipe %x "
2378 1.48 skrll "type %s", xfer->ux_length, xfer->ux_actlen, spipe,
2379 1.12 kiyohara pnames(spipe->ptype));
2380 1.12 kiyohara do_callback:
2381 1.41 skrll slhci_do_callback(sc, xfer);
2382 1.12 kiyohara }
2383 1.12 kiyohara }
2384 1.12 kiyohara
2385 1.12 kiyohara static void
2386 1.12 kiyohara slhci_enter_xfer(struct slhci_softc *sc, struct slhci_pipe *spipe)
2387 1.12 kiyohara {
2388 1.56 skrll SLHCIHIST_FUNC(); SLHCIHIST_CALLED();
2389 1.12 kiyohara struct slhci_transfers *t;
2390 1.12 kiyohara
2391 1.12 kiyohara t = &sc->sc_transfers;
2392 1.12 kiyohara
2393 1.41 skrll KASSERT(mutex_owned(&sc->sc_intr_lock));
2394 1.12 kiyohara
2395 1.37 skrll if (__predict_false(t->flags & F_DISABLED) ||
2396 1.12 kiyohara __predict_false(spipe->pflags & PF_GONE)) {
2397 1.12 kiyohara DLOG(D_MSG, "slhci_enter_xfer: DISABLED or GONE", 0,0,0,0);
2398 1.48 skrll spipe->xfer->ux_status = USBD_CANCELLED;
2399 1.12 kiyohara }
2400 1.12 kiyohara
2401 1.48 skrll if (spipe->xfer->ux_status == USBD_IN_PROGRESS) {
2402 1.48 skrll if (spipe->xfer->ux_timeout) {
2403 1.48 skrll spipe->to_frame = t->frame + spipe->xfer->ux_timeout;
2404 1.37 skrll slhci_xfer_timer(sc, spipe);
2405 1.12 kiyohara }
2406 1.48 skrll if (spipe->pipe.up_interval)
2407 1.12 kiyohara slhci_queue_timed(sc, spipe);
2408 1.12 kiyohara else
2409 1.12 kiyohara enter_q(t, spipe, Q_CB);
2410 1.12 kiyohara } else
2411 1.12 kiyohara enter_callback(t, spipe);
2412 1.12 kiyohara }
2413 1.12 kiyohara
2414 1.12 kiyohara static void
2415 1.12 kiyohara slhci_enter_xfers(struct slhci_softc *sc)
2416 1.12 kiyohara {
2417 1.12 kiyohara struct slhci_pipe *spipe;
2418 1.12 kiyohara
2419 1.44 skrll KASSERT(mutex_owned(&sc->sc_intr_lock));
2420 1.12 kiyohara
2421 1.12 kiyohara while (DEQUEUED_WAITQ(spipe, sc))
2422 1.12 kiyohara slhci_enter_xfer(sc, spipe);
2423 1.12 kiyohara }
2424 1.12 kiyohara
2425 1.12 kiyohara static void
2426 1.12 kiyohara slhci_queue_timed(struct slhci_softc *sc, struct slhci_pipe *spipe)
2427 1.12 kiyohara {
2428 1.12 kiyohara struct slhci_transfers *t;
2429 1.12 kiyohara struct gcq *q;
2430 1.12 kiyohara struct slhci_pipe *spp;
2431 1.12 kiyohara
2432 1.12 kiyohara t = &sc->sc_transfers;
2433 1.12 kiyohara
2434 1.41 skrll KASSERT(mutex_owned(&sc->sc_intr_lock));
2435 1.12 kiyohara
2436 1.12 kiyohara FIND_TIMED(q, t, spp, spp->frame > spipe->frame);
2437 1.12 kiyohara gcq_insert_before(q, &spipe->xq);
2438 1.12 kiyohara }
2439 1.12 kiyohara
2440 1.12 kiyohara static void
2441 1.12 kiyohara slhci_xfer_timer(struct slhci_softc *sc, struct slhci_pipe *spipe)
2442 1.12 kiyohara {
2443 1.12 kiyohara struct slhci_transfers *t;
2444 1.12 kiyohara struct gcq *q;
2445 1.12 kiyohara struct slhci_pipe *spp;
2446 1.12 kiyohara
2447 1.12 kiyohara t = &sc->sc_transfers;
2448 1.12 kiyohara
2449 1.41 skrll KASSERT(mutex_owned(&sc->sc_intr_lock));
2450 1.12 kiyohara
2451 1.12 kiyohara FIND_TO(q, t, spp, spp->to_frame >= spipe->to_frame);
2452 1.12 kiyohara gcq_insert_before(q, &spipe->to);
2453 1.12 kiyohara }
2454 1.12 kiyohara
2455 1.12 kiyohara static void
2456 1.12 kiyohara slhci_do_repeat(struct slhci_softc *sc, struct usbd_xfer *xfer)
2457 1.12 kiyohara {
2458 1.56 skrll SLHCIHIST_FUNC(); SLHCIHIST_CALLED();
2459 1.12 kiyohara struct slhci_transfers *t;
2460 1.12 kiyohara struct slhci_pipe *spipe;
2461 1.12 kiyohara
2462 1.12 kiyohara t = &sc->sc_transfers;
2463 1.48 skrll spipe = SLHCI_PIPE2SPIPE(xfer->ux_pipe);
2464 1.12 kiyohara
2465 1.12 kiyohara if (xfer == t->rootintr)
2466 1.12 kiyohara return;
2467 1.12 kiyohara
2468 1.12 kiyohara DLOG(D_TRACE, "REPEAT: xfer %p actlen %d frame %u now %u",
2469 1.48 skrll xfer, xfer->ux_actlen, spipe->frame, sc->sc_transfers.frame);
2470 1.12 kiyohara
2471 1.48 skrll xfer->ux_actlen = 0;
2472 1.12 kiyohara spipe->xfer = xfer;
2473 1.37 skrll if (spipe->tregs[LEN])
2474 1.48 skrll KASSERT(spipe->buffer == xfer->ux_buf);
2475 1.12 kiyohara slhci_queue_timed(sc, spipe);
2476 1.12 kiyohara slhci_dotransfer(sc);
2477 1.12 kiyohara }
2478 1.12 kiyohara
2479 1.12 kiyohara static void
2480 1.12 kiyohara slhci_callback_schedule(struct slhci_softc *sc)
2481 1.12 kiyohara {
2482 1.12 kiyohara struct slhci_transfers *t;
2483 1.12 kiyohara
2484 1.12 kiyohara t = &sc->sc_transfers;
2485 1.12 kiyohara
2486 1.44 skrll KASSERT(mutex_owned(&sc->sc_intr_lock));
2487 1.12 kiyohara
2488 1.12 kiyohara if (t->flags & F_ACTIVE)
2489 1.12 kiyohara slhci_do_callback_schedule(sc);
2490 1.12 kiyohara }
2491 1.12 kiyohara
2492 1.12 kiyohara static void
2493 1.12 kiyohara slhci_do_callback_schedule(struct slhci_softc *sc)
2494 1.12 kiyohara {
2495 1.12 kiyohara struct slhci_transfers *t;
2496 1.12 kiyohara
2497 1.12 kiyohara t = &sc->sc_transfers;
2498 1.12 kiyohara
2499 1.44 skrll KASSERT(mutex_owned(&sc->sc_intr_lock));
2500 1.12 kiyohara
2501 1.12 kiyohara if (!(t->flags & F_CALLBACK)) {
2502 1.12 kiyohara t->flags |= F_CALLBACK;
2503 1.16 ad softint_schedule(sc->sc_cb_softintr);
2504 1.12 kiyohara }
2505 1.12 kiyohara }
2506 1.12 kiyohara
2507 1.12 kiyohara #if 0
2508 1.41 skrll /* must be called with lock taken from IPL_USB */
2509 1.12 kiyohara /* XXX static */ void
2510 1.41 skrll slhci_pollxfer(struct slhci_softc *sc, struct usbd_xfer *xfer)
2511 1.12 kiyohara {
2512 1.44 skrll KASSERT(mutex_owned(&sc->sc_intr_lock));
2513 1.12 kiyohara slhci_dotransfer(sc);
2514 1.12 kiyohara do {
2515 1.12 kiyohara slhci_dointr(sc);
2516 1.48 skrll } while (xfer->ux_status == USBD_IN_PROGRESS);
2517 1.41 skrll slhci_do_callback(sc, xfer);
2518 1.12 kiyohara }
2519 1.12 kiyohara #endif
2520 1.12 kiyohara
2521 1.12 kiyohara static usbd_status
2522 1.37 skrll slhci_do_poll(struct slhci_softc *sc, struct slhci_pipe *spipe, struct
2523 1.12 kiyohara usbd_xfer *xfer)
2524 1.12 kiyohara {
2525 1.12 kiyohara slhci_waitintr(sc, 0);
2526 1.12 kiyohara
2527 1.12 kiyohara return USBD_NORMAL_COMPLETION;
2528 1.12 kiyohara }
2529 1.12 kiyohara
2530 1.12 kiyohara static usbd_status
2531 1.37 skrll slhci_lsvh_warn(struct slhci_softc *sc, struct slhci_pipe *spipe, struct
2532 1.12 kiyohara usbd_xfer *xfer)
2533 1.12 kiyohara {
2534 1.56 skrll SLHCIHIST_FUNC(); SLHCIHIST_CALLED();
2535 1.12 kiyohara struct slhci_transfers *t;
2536 1.12 kiyohara
2537 1.12 kiyohara t = &sc->sc_transfers;
2538 1.12 kiyohara
2539 1.12 kiyohara if (!(t->flags & F_LSVH_WARNED)) {
2540 1.12 kiyohara printf("%s: Low speed device via hub disabled, "
2541 1.12 kiyohara "see slhci(4)\n", SC_NAME(sc));
2542 1.12 kiyohara DDOLOG("%s: Low speed device via hub disabled, "
2543 1.12 kiyohara "see slhci(4)\n", SC_NAME(sc), 0,0,0);
2544 1.12 kiyohara t->flags |= F_LSVH_WARNED;
2545 1.12 kiyohara }
2546 1.12 kiyohara return USBD_INVAL;
2547 1.12 kiyohara }
2548 1.12 kiyohara
2549 1.12 kiyohara static usbd_status
2550 1.37 skrll slhci_isoc_warn(struct slhci_softc *sc, struct slhci_pipe *spipe, struct
2551 1.12 kiyohara usbd_xfer *xfer)
2552 1.12 kiyohara {
2553 1.56 skrll SLHCIHIST_FUNC(); SLHCIHIST_CALLED();
2554 1.12 kiyohara struct slhci_transfers *t;
2555 1.12 kiyohara
2556 1.12 kiyohara t = &sc->sc_transfers;
2557 1.12 kiyohara
2558 1.12 kiyohara if (!(t->flags & F_ISOC_WARNED)) {
2559 1.12 kiyohara printf("%s: ISOC transfer not supported "
2560 1.12 kiyohara "(see slhci(4))\n", SC_NAME(sc));
2561 1.12 kiyohara DDOLOG("%s: ISOC transfer not supported "
2562 1.12 kiyohara "(see slhci(4))\n", SC_NAME(sc), 0,0,0);
2563 1.12 kiyohara t->flags |= F_ISOC_WARNED;
2564 1.12 kiyohara }
2565 1.12 kiyohara return USBD_INVAL;
2566 1.12 kiyohara }
2567 1.12 kiyohara
2568 1.12 kiyohara static usbd_status
2569 1.37 skrll slhci_open_pipe(struct slhci_softc *sc, struct slhci_pipe *spipe, struct
2570 1.12 kiyohara usbd_xfer *xfer)
2571 1.12 kiyohara {
2572 1.12 kiyohara struct slhci_transfers *t;
2573 1.12 kiyohara struct usbd_pipe *pipe;
2574 1.12 kiyohara
2575 1.12 kiyohara t = &sc->sc_transfers;
2576 1.12 kiyohara pipe = &spipe->pipe;
2577 1.12 kiyohara
2578 1.12 kiyohara if (t->flags & F_DISABLED)
2579 1.12 kiyohara return USBD_CANCELLED;
2580 1.48 skrll else if (pipe->up_interval && !slhci_reserve_bustime(sc, spipe, 1))
2581 1.12 kiyohara return USBD_PENDING_REQUESTS;
2582 1.12 kiyohara else {
2583 1.12 kiyohara enter_all_pipes(t, spipe);
2584 1.12 kiyohara return USBD_NORMAL_COMPLETION;
2585 1.12 kiyohara }
2586 1.12 kiyohara }
2587 1.12 kiyohara
2588 1.12 kiyohara static usbd_status
2589 1.37 skrll slhci_close_pipe(struct slhci_softc *sc, struct slhci_pipe *spipe, struct
2590 1.12 kiyohara usbd_xfer *xfer)
2591 1.12 kiyohara {
2592 1.12 kiyohara struct usbd_pipe *pipe;
2593 1.12 kiyohara
2594 1.12 kiyohara pipe = &spipe->pipe;
2595 1.12 kiyohara
2596 1.48 skrll if (pipe->up_interval && spipe->ptype != PT_ROOT_INTR)
2597 1.12 kiyohara slhci_reserve_bustime(sc, spipe, 0);
2598 1.12 kiyohara gcq_remove(&spipe->ap);
2599 1.12 kiyohara return USBD_NORMAL_COMPLETION;
2600 1.12 kiyohara }
2601 1.12 kiyohara
2602 1.12 kiyohara static usbd_status
2603 1.37 skrll slhci_do_abort(struct slhci_softc *sc, struct slhci_pipe *spipe, struct
2604 1.12 kiyohara usbd_xfer *xfer)
2605 1.12 kiyohara {
2606 1.12 kiyohara struct slhci_transfers *t;
2607 1.12 kiyohara
2608 1.12 kiyohara t = &sc->sc_transfers;
2609 1.12 kiyohara
2610 1.41 skrll KASSERT(mutex_owned(&sc->sc_intr_lock));
2611 1.12 kiyohara
2612 1.12 kiyohara if (spipe->xfer == xfer) {
2613 1.12 kiyohara if (spipe->ptype == PT_ROOT_INTR) {
2614 1.12 kiyohara if (t->rootintr == spipe->xfer) /* XXX assert? */
2615 1.12 kiyohara t->rootintr = NULL;
2616 1.12 kiyohara } else {
2617 1.12 kiyohara gcq_remove(&spipe->to);
2618 1.12 kiyohara gcq_remove(&spipe->xq);
2619 1.12 kiyohara
2620 1.12 kiyohara if (t->spipe[A] == spipe) {
2621 1.12 kiyohara t->spipe[A] = NULL;
2622 1.12 kiyohara if (!(t->flags & F_AINPROG))
2623 1.12 kiyohara t->len[A] = -1;
2624 1.12 kiyohara } else if (t->spipe[B] == spipe) {
2625 1.12 kiyohara t->spipe[B] = NULL;
2626 1.12 kiyohara if (!(t->flags & F_BINPROG))
2627 1.12 kiyohara t->len[B] = -1;
2628 1.12 kiyohara }
2629 1.12 kiyohara }
2630 1.12 kiyohara
2631 1.48 skrll if (xfer->ux_status != USBD_TIMEOUT) {
2632 1.12 kiyohara spipe->xfer = NULL;
2633 1.48 skrll spipe->pipe.up_repeat = 0; /* XXX timeout? */
2634 1.12 kiyohara }
2635 1.12 kiyohara }
2636 1.12 kiyohara
2637 1.12 kiyohara return USBD_NORMAL_COMPLETION;
2638 1.12 kiyohara }
2639 1.12 kiyohara
2640 1.34 skrll /*
2641 1.41 skrll * Called to deactivate or stop use of the controller instead of panicking.
2642 1.12 kiyohara * Will cancel the xfer correctly even when not on a list.
2643 1.12 kiyohara */
2644 1.12 kiyohara static usbd_status
2645 1.48 skrll slhci_halt(struct slhci_softc *sc, struct slhci_pipe *spipe,
2646 1.48 skrll struct usbd_xfer *xfer)
2647 1.12 kiyohara {
2648 1.56 skrll SLHCIHIST_FUNC(); SLHCIHIST_CALLED();
2649 1.12 kiyohara struct slhci_transfers *t;
2650 1.12 kiyohara
2651 1.44 skrll KASSERT(mutex_owned(&sc->sc_intr_lock));
2652 1.12 kiyohara
2653 1.12 kiyohara t = &sc->sc_transfers;
2654 1.12 kiyohara
2655 1.12 kiyohara DDOLOG("Halt! sc %p spipe %p xfer %p", sc, spipe, xfer, 0);
2656 1.12 kiyohara
2657 1.12 kiyohara if (spipe != NULL)
2658 1.12 kiyohara slhci_log_spipe(spipe);
2659 1.12 kiyohara
2660 1.12 kiyohara if (xfer != NULL)
2661 1.12 kiyohara slhci_log_xfer(xfer);
2662 1.12 kiyohara
2663 1.37 skrll if (spipe != NULL && xfer != NULL && spipe->xfer == xfer &&
2664 1.37 skrll !gcq_onlist(&spipe->xq) && t->spipe[A] != spipe && t->spipe[B] !=
2665 1.12 kiyohara spipe) {
2666 1.48 skrll xfer->ux_status = USBD_CANCELLED;
2667 1.12 kiyohara enter_callback(t, spipe);
2668 1.12 kiyohara }
2669 1.12 kiyohara
2670 1.12 kiyohara if (t->flags & F_ACTIVE) {
2671 1.12 kiyohara slhci_intrchange(sc, 0);
2672 1.34 skrll /*
2673 1.34 skrll * leave power on when halting in case flash devices or disks
2674 1.37 skrll * are attached, which may be writing and could be damaged
2675 1.37 skrll * by abrupt power loss. The root hub clear power feature
2676 1.12 kiyohara * should still work after halting.
2677 1.12 kiyohara */
2678 1.12 kiyohara }
2679 1.12 kiyohara
2680 1.12 kiyohara t->flags &= ~F_ACTIVE;
2681 1.12 kiyohara t->flags |= F_UDISABLED;
2682 1.12 kiyohara if (!(t->flags & F_NODEV))
2683 1.12 kiyohara t->flags |= F_NODEV|F_CCONNECT|F_ROOTINTR;
2684 1.12 kiyohara slhci_drain(sc);
2685 1.1 isaki
2686 1.12 kiyohara /* One last callback for the drain and device removal. */
2687 1.12 kiyohara slhci_do_callback_schedule(sc);
2688 1.1 isaki
2689 1.12 kiyohara return USBD_NORMAL_COMPLETION;
2690 1.1 isaki }
2691 1.1 isaki
2692 1.34 skrll /*
2693 1.34 skrll * There are three interrupt states: no interrupts during reset and after
2694 1.37 skrll * device deactivation, INSERT only for no device present but power on, and
2695 1.12 kiyohara * SOF, INSERT, ADONE, and BDONE when device is present.
2696 1.12 kiyohara */
2697 1.1 isaki static void
2698 1.12 kiyohara slhci_intrchange(struct slhci_softc *sc, uint8_t new_ier)
2699 1.1 isaki {
2700 1.41 skrll KASSERT(mutex_owned(&sc->sc_intr_lock));
2701 1.12 kiyohara if (sc->sc_ier != new_ier) {
2702 1.12 kiyohara sc->sc_ier = new_ier;
2703 1.12 kiyohara slhci_write(sc, SL11_IER, new_ier);
2704 1.12 kiyohara BSB_SYNC(sc->iot, sc->ioh, sc->pst, sc->psz);
2705 1.12 kiyohara }
2706 1.1 isaki }
2707 1.1 isaki
2708 1.34 skrll /*
2709 1.34 skrll * Drain: cancel all pending transfers and put them on the callback list and
2710 1.34 skrll * set the UDISABLED flag. UDISABLED is cleared only by reset.
2711 1.34 skrll */
2712 1.12 kiyohara static void
2713 1.12 kiyohara slhci_drain(struct slhci_softc *sc)
2714 1.1 isaki {
2715 1.56 skrll SLHCIHIST_FUNC(); SLHCIHIST_CALLED();
2716 1.12 kiyohara struct slhci_transfers *t;
2717 1.12 kiyohara struct slhci_pipe *spipe;
2718 1.12 kiyohara struct gcq *q;
2719 1.12 kiyohara int i;
2720 1.1 isaki
2721 1.44 skrll KASSERT(mutex_owned(&sc->sc_intr_lock));
2722 1.1 isaki
2723 1.12 kiyohara t = &sc->sc_transfers;
2724 1.1 isaki
2725 1.12 kiyohara DLOG(D_MSG, "DRAIN flags %#x", t->flags, 0,0,0);
2726 1.1 isaki
2727 1.12 kiyohara t->pend = INT_MAX;
2728 1.1 isaki
2729 1.12 kiyohara for (i=0; i<=1; i++) {
2730 1.12 kiyohara t->len[i] = -1;
2731 1.12 kiyohara if (t->spipe[i] != NULL) {
2732 1.12 kiyohara enter_callback(t, t->spipe[i]);
2733 1.12 kiyohara t->spipe[i] = NULL;
2734 1.12 kiyohara }
2735 1.1 isaki }
2736 1.1 isaki
2737 1.12 kiyohara /* Merge the queues into the callback queue. */
2738 1.12 kiyohara gcq_merge_tail(&t->q[Q_CALLBACKS], &t->q[Q_CB]);
2739 1.12 kiyohara gcq_merge_tail(&t->q[Q_CALLBACKS], &t->q[Q_NEXT_CB]);
2740 1.12 kiyohara gcq_merge_tail(&t->q[Q_CALLBACKS], &t->timed);
2741 1.1 isaki
2742 1.34 skrll /*
2743 1.34 skrll * Cancel all pipes. Note that not all of these may be on the
2744 1.34 skrll * callback queue yet; some could be in slhci_start, for example.
2745 1.34 skrll */
2746 1.12 kiyohara FOREACH_AP(q, t, spipe) {
2747 1.27 kiyohara spipe->pflags |= PF_GONE;
2748 1.48 skrll spipe->pipe.up_repeat = 0;
2749 1.48 skrll spipe->pipe.up_aborting = 1;
2750 1.12 kiyohara if (spipe->xfer != NULL)
2751 1.48 skrll spipe->xfer->ux_status = USBD_CANCELLED;
2752 1.1 isaki }
2753 1.1 isaki
2754 1.12 kiyohara gcq_remove_all(&t->to);
2755 1.1 isaki
2756 1.12 kiyohara t->flags |= F_UDISABLED;
2757 1.12 kiyohara t->flags &= ~(F_AREADY|F_BREADY|F_AINPROG|F_BINPROG|F_LOWSPEED);
2758 1.1 isaki }
2759 1.1 isaki
2760 1.34 skrll /*
2761 1.34 skrll * RESET: SL11_CTRL_RESETENGINE=1 and SL11_CTRL_JKSTATE=0 for 50ms
2762 1.12 kiyohara * reconfigure SOF after reset, must wait 2.5us before USB bus activity (SOF)
2763 1.37 skrll * check attached device speed.
2764 1.37 skrll * must wait 100ms before USB transaction according to app note, 10ms
2765 1.12 kiyohara * by spec. uhub does this delay
2766 1.12 kiyohara *
2767 1.12 kiyohara * Started from root hub set feature reset, which does step one.
2768 1.48 skrll * ub_usepolling will call slhci_reset directly, otherwise the callout goes
2769 1.12 kiyohara * through slhci_reset_entry.
2770 1.12 kiyohara */
2771 1.12 kiyohara void
2772 1.12 kiyohara slhci_reset(struct slhci_softc *sc)
2773 1.1 isaki {
2774 1.56 skrll SLHCIHIST_FUNC(); SLHCIHIST_CALLED();
2775 1.12 kiyohara struct slhci_transfers *t;
2776 1.27 kiyohara struct slhci_pipe *spipe;
2777 1.27 kiyohara struct gcq *q;
2778 1.12 kiyohara uint8_t r, pol, ctrl;
2779 1.1 isaki
2780 1.12 kiyohara t = &sc->sc_transfers;
2781 1.41 skrll KASSERT(mutex_owned(&sc->sc_intr_lock));
2782 1.1 isaki
2783 1.12 kiyohara stop_cc_time(&t_delay);
2784 1.1 isaki
2785 1.12 kiyohara KASSERT(t->flags & F_ACTIVE);
2786 1.1 isaki
2787 1.12 kiyohara start_cc_time(&t_delay, 0);
2788 1.12 kiyohara stop_cc_time(&t_delay);
2789 1.1 isaki
2790 1.12 kiyohara slhci_write(sc, SL11_CTRL, 0);
2791 1.12 kiyohara start_cc_time(&t_delay, 3);
2792 1.12 kiyohara DELAY(3);
2793 1.12 kiyohara stop_cc_time(&t_delay);
2794 1.12 kiyohara slhci_write(sc, SL11_ISR, 0xff);
2795 1.1 isaki
2796 1.12 kiyohara r = slhci_read(sc, SL11_ISR);
2797 1.1 isaki
2798 1.12 kiyohara if (r & SL11_ISR_INSERT)
2799 1.12 kiyohara slhci_write(sc, SL11_ISR, SL11_ISR_INSERT);
2800 1.1 isaki
2801 1.12 kiyohara if (r & SL11_ISR_NODEV) {
2802 1.12 kiyohara DLOG(D_MSG, "NC", 0,0,0,0);
2803 1.34 skrll /*
2804 1.34 skrll * Normally, the hard interrupt insert routine will issue
2805 1.37 skrll * CCONNECT, however we need to do it here if the detach
2806 1.34 skrll * happened during reset.
2807 1.34 skrll */
2808 1.12 kiyohara if (!(t->flags & F_NODEV))
2809 1.12 kiyohara t->flags |= F_CCONNECT|F_ROOTINTR|F_NODEV;
2810 1.12 kiyohara slhci_intrchange(sc, SL11_IER_INSERT);
2811 1.12 kiyohara } else {
2812 1.12 kiyohara if (t->flags & F_NODEV)
2813 1.12 kiyohara t->flags |= F_CCONNECT;
2814 1.12 kiyohara t->flags &= ~(F_NODEV|F_LOWSPEED);
2815 1.12 kiyohara if (r & SL11_ISR_DATA) {
2816 1.12 kiyohara DLOG(D_MSG, "FS", 0,0,0,0);
2817 1.12 kiyohara pol = ctrl = 0;
2818 1.12 kiyohara } else {
2819 1.12 kiyohara DLOG(D_MSG, "LS", 0,0,0,0);
2820 1.12 kiyohara pol = SL811_CSOF_POLARITY;
2821 1.12 kiyohara ctrl = SL11_CTRL_LOWSPEED;
2822 1.12 kiyohara t->flags |= F_LOWSPEED;
2823 1.12 kiyohara }
2824 1.1 isaki
2825 1.12 kiyohara /* Enable SOF auto-generation */
2826 1.12 kiyohara t->frame = 0; /* write to SL811_CSOF will reset frame */
2827 1.12 kiyohara slhci_write(sc, SL11_SOFTIME, 0xe0);
2828 1.12 kiyohara slhci_write(sc, SL811_CSOF, pol|SL811_CSOF_MASTER|0x2e);
2829 1.12 kiyohara slhci_write(sc, SL11_CTRL, ctrl|SL11_CTRL_ENABLESOF);
2830 1.12 kiyohara
2831 1.34 skrll /*
2832 1.34 skrll * According to the app note, ARM must be set
2833 1.37 skrll * for SOF generation to work. We initialize all
2834 1.34 skrll * USBA registers here for current_tregs.
2835 1.34 skrll */
2836 1.12 kiyohara slhci_write(sc, SL11_E0ADDR, SL11_BUFFER_START);
2837 1.12 kiyohara slhci_write(sc, SL11_E0LEN, 0);
2838 1.12 kiyohara slhci_write(sc, SL11_E0PID, SL11_PID_SOF);
2839 1.12 kiyohara slhci_write(sc, SL11_E0DEV, 0);
2840 1.12 kiyohara slhci_write(sc, SL11_E0CTRL, SL11_EPCTRL_ARM);
2841 1.12 kiyohara
2842 1.34 skrll /*
2843 1.34 skrll * Initialize B registers. This can't be done earlier since
2844 1.37 skrll * they are not valid until the SL811_CSOF register is written
2845 1.34 skrll * above due to SL11H compatability.
2846 1.34 skrll */
2847 1.12 kiyohara slhci_write(sc, SL11_E1ADDR, SL11_BUFFER_END - 8);
2848 1.12 kiyohara slhci_write(sc, SL11_E1LEN, 0);
2849 1.12 kiyohara slhci_write(sc, SL11_E1PID, 0);
2850 1.12 kiyohara slhci_write(sc, SL11_E1DEV, 0);
2851 1.12 kiyohara
2852 1.12 kiyohara t->current_tregs[0][ADR] = SL11_BUFFER_START;
2853 1.12 kiyohara t->current_tregs[0][LEN] = 0;
2854 1.12 kiyohara t->current_tregs[0][PID] = SL11_PID_SOF;
2855 1.12 kiyohara t->current_tregs[0][DEV] = 0;
2856 1.12 kiyohara t->current_tregs[1][ADR] = SL11_BUFFER_END - 8;
2857 1.12 kiyohara t->current_tregs[1][LEN] = 0;
2858 1.12 kiyohara t->current_tregs[1][PID] = 0;
2859 1.12 kiyohara t->current_tregs[1][DEV] = 0;
2860 1.12 kiyohara
2861 1.12 kiyohara /* SOF start will produce USBA interrupt */
2862 1.12 kiyohara t->len[A] = 0;
2863 1.12 kiyohara t->flags |= F_AINPROG;
2864 1.12 kiyohara
2865 1.12 kiyohara slhci_intrchange(sc, SLHCI_NORMAL_INTERRUPTS);
2866 1.12 kiyohara }
2867 1.12 kiyohara
2868 1.12 kiyohara t->flags &= ~(F_UDISABLED|F_RESET);
2869 1.12 kiyohara t->flags |= F_CRESET|F_ROOTINTR;
2870 1.27 kiyohara FOREACH_AP(q, t, spipe) {
2871 1.27 kiyohara spipe->pflags &= ~PF_GONE;
2872 1.48 skrll spipe->pipe.up_aborting = 0;
2873 1.27 kiyohara }
2874 1.12 kiyohara DLOG(D_MSG, "RESET done flags %#x", t->flags, 0,0,0);
2875 1.1 isaki }
2876 1.1 isaki
2877 1.12 kiyohara /* returns 1 if succeeded, 0 if failed, reserve == 0 is unreserve */
2878 1.12 kiyohara static int
2879 1.37 skrll slhci_reserve_bustime(struct slhci_softc *sc, struct slhci_pipe *spipe, int
2880 1.12 kiyohara reserve)
2881 1.1 isaki {
2882 1.56 skrll SLHCIHIST_FUNC(); SLHCIHIST_CALLED();
2883 1.12 kiyohara struct slhci_transfers *t;
2884 1.12 kiyohara int bustime, max_packet;
2885 1.12 kiyohara
2886 1.44 skrll KASSERT(mutex_owned(&sc->sc_intr_lock));
2887 1.12 kiyohara
2888 1.12 kiyohara t = &sc->sc_transfers;
2889 1.48 skrll max_packet = UGETW(spipe->pipe.up_endpoint->ue_edesc->wMaxPacketSize);
2890 1.12 kiyohara
2891 1.12 kiyohara if (spipe->pflags & PF_LS)
2892 1.12 kiyohara bustime = SLHCI_LS_CONST + SLHCI_LS_DATA_TIME(max_packet);
2893 1.12 kiyohara else
2894 1.12 kiyohara bustime = SLHCI_FS_CONST + SLHCI_FS_DATA_TIME(max_packet);
2895 1.1 isaki
2896 1.12 kiyohara if (!reserve) {
2897 1.12 kiyohara t->reserved_bustime -= bustime;
2898 1.12 kiyohara #ifdef DIAGNOSTIC
2899 1.12 kiyohara if (t->reserved_bustime < 0) {
2900 1.37 skrll printf("%s: reserved_bustime %d < 0!\n",
2901 1.12 kiyohara SC_NAME(sc), t->reserved_bustime);
2902 1.37 skrll DDOLOG("%s: reserved_bustime %d < 0!\n",
2903 1.12 kiyohara SC_NAME(sc), t->reserved_bustime, 0,0);
2904 1.12 kiyohara t->reserved_bustime = 0;
2905 1.12 kiyohara }
2906 1.12 kiyohara #endif
2907 1.12 kiyohara return 1;
2908 1.12 kiyohara }
2909 1.1 isaki
2910 1.12 kiyohara if (t->reserved_bustime + bustime > SLHCI_RESERVED_BUSTIME) {
2911 1.37 skrll if (ratecheck(&sc->sc_reserved_warn_rate,
2912 1.12 kiyohara &reserved_warn_rate))
2913 1.12 kiyohara #ifdef SLHCI_NO_OVERTIME
2914 1.12 kiyohara {
2915 1.12 kiyohara printf("%s: Max reserved bus time exceeded! "
2916 1.12 kiyohara "Erroring request.\n", SC_NAME(sc));
2917 1.12 kiyohara DDOLOG("%s: Max reserved bus time exceeded! "
2918 1.12 kiyohara "Erroring request.\n", SC_NAME(sc), 0,0,0);
2919 1.12 kiyohara }
2920 1.12 kiyohara return 0;
2921 1.12 kiyohara #else
2922 1.12 kiyohara {
2923 1.37 skrll printf("%s: Reserved bus time exceeds %d!\n",
2924 1.12 kiyohara SC_NAME(sc), SLHCI_RESERVED_BUSTIME);
2925 1.37 skrll DDOLOG("%s: Reserved bus time exceeds %d!\n",
2926 1.12 kiyohara SC_NAME(sc), SLHCI_RESERVED_BUSTIME, 0,0);
2927 1.12 kiyohara }
2928 1.12 kiyohara #endif
2929 1.1 isaki }
2930 1.1 isaki
2931 1.12 kiyohara t->reserved_bustime += bustime;
2932 1.12 kiyohara return 1;
2933 1.1 isaki }
2934 1.1 isaki
2935 1.12 kiyohara /* Device insertion/removal interrupt */
2936 1.1 isaki static void
2937 1.12 kiyohara slhci_insert(struct slhci_softc *sc)
2938 1.1 isaki {
2939 1.56 skrll SLHCIHIST_FUNC(); SLHCIHIST_CALLED();
2940 1.12 kiyohara struct slhci_transfers *t;
2941 1.12 kiyohara
2942 1.12 kiyohara t = &sc->sc_transfers;
2943 1.1 isaki
2944 1.44 skrll KASSERT(mutex_owned(&sc->sc_intr_lock));
2945 1.1 isaki
2946 1.12 kiyohara if (t->flags & F_NODEV)
2947 1.12 kiyohara slhci_intrchange(sc, 0);
2948 1.12 kiyohara else {
2949 1.12 kiyohara slhci_drain(sc);
2950 1.12 kiyohara slhci_intrchange(sc, SL11_IER_INSERT);
2951 1.1 isaki }
2952 1.12 kiyohara t->flags ^= F_NODEV;
2953 1.12 kiyohara t->flags |= F_ROOTINTR|F_CCONNECT;
2954 1.12 kiyohara DLOG(D_MSG, "INSERT intr: flags after %#x", t->flags, 0,0,0);
2955 1.1 isaki }
2956 1.1 isaki
2957 1.12 kiyohara /*
2958 1.12 kiyohara * Data structures and routines to emulate the root hub.
2959 1.12 kiyohara */
2960 1.12 kiyohara
2961 1.1 isaki static usbd_status
2962 1.12 kiyohara slhci_clear_feature(struct slhci_softc *sc, unsigned int what)
2963 1.1 isaki {
2964 1.56 skrll SLHCIHIST_FUNC(); SLHCIHIST_CALLED();
2965 1.12 kiyohara struct slhci_transfers *t;
2966 1.12 kiyohara usbd_status error;
2967 1.1 isaki
2968 1.12 kiyohara t = &sc->sc_transfers;
2969 1.12 kiyohara error = USBD_NORMAL_COMPLETION;
2970 1.1 isaki
2971 1.44 skrll KASSERT(mutex_owned(&sc->sc_intr_lock));
2972 1.1 isaki
2973 1.12 kiyohara if (what == UHF_PORT_POWER) {
2974 1.12 kiyohara DLOG(D_MSG, "POWER_OFF", 0,0,0,0);
2975 1.12 kiyohara t->flags &= ~F_POWER;
2976 1.12 kiyohara if (!(t->flags & F_NODEV))
2977 1.12 kiyohara t->flags |= F_NODEV|F_CCONNECT|F_ROOTINTR;
2978 1.12 kiyohara /* for x68k Nereid USB controller */
2979 1.12 kiyohara if (sc->sc_enable_power && (t->flags & F_REALPOWER)) {
2980 1.12 kiyohara t->flags &= ~F_REALPOWER;
2981 1.12 kiyohara sc->sc_enable_power(sc, POWER_OFF);
2982 1.12 kiyohara }
2983 1.12 kiyohara slhci_intrchange(sc, 0);
2984 1.37 skrll slhci_drain(sc);
2985 1.12 kiyohara } else if (what == UHF_C_PORT_CONNECTION) {
2986 1.12 kiyohara t->flags &= ~F_CCONNECT;
2987 1.12 kiyohara } else if (what == UHF_C_PORT_RESET) {
2988 1.12 kiyohara t->flags &= ~F_CRESET;
2989 1.12 kiyohara } else if (what == UHF_PORT_ENABLE) {
2990 1.12 kiyohara slhci_drain(sc);
2991 1.12 kiyohara } else if (what != UHF_PORT_SUSPEND) {
2992 1.12 kiyohara DDOLOG("ClrPortFeatERR:value=%#.4x", what, 0,0,0);
2993 1.12 kiyohara error = USBD_IOERROR;
2994 1.12 kiyohara }
2995 1.1 isaki
2996 1.12 kiyohara return error;
2997 1.1 isaki }
2998 1.1 isaki
2999 1.1 isaki static usbd_status
3000 1.12 kiyohara slhci_set_feature(struct slhci_softc *sc, unsigned int what)
3001 1.1 isaki {
3002 1.56 skrll SLHCIHIST_FUNC(); SLHCIHIST_CALLED();
3003 1.12 kiyohara struct slhci_transfers *t;
3004 1.12 kiyohara uint8_t r;
3005 1.12 kiyohara
3006 1.12 kiyohara t = &sc->sc_transfers;
3007 1.12 kiyohara
3008 1.44 skrll KASSERT(mutex_owned(&sc->sc_intr_lock));
3009 1.12 kiyohara
3010 1.12 kiyohara if (what == UHF_PORT_RESET) {
3011 1.12 kiyohara if (!(t->flags & F_ACTIVE)) {
3012 1.37 skrll DDOLOG("SET PORT_RESET when not ACTIVE!",
3013 1.12 kiyohara 0,0,0,0);
3014 1.12 kiyohara return USBD_INVAL;
3015 1.12 kiyohara }
3016 1.12 kiyohara if (!(t->flags & F_POWER)) {
3017 1.12 kiyohara DDOLOG("SET PORT_RESET without PORT_POWER! flags %p",
3018 1.12 kiyohara t->flags, 0,0,0);
3019 1.12 kiyohara return USBD_INVAL;
3020 1.12 kiyohara }
3021 1.12 kiyohara if (t->flags & F_RESET)
3022 1.12 kiyohara return USBD_NORMAL_COMPLETION;
3023 1.12 kiyohara DLOG(D_MSG, "RESET flags %#x", t->flags, 0,0,0);
3024 1.12 kiyohara slhci_intrchange(sc, 0);
3025 1.37 skrll slhci_drain(sc);
3026 1.12 kiyohara slhci_write(sc, SL11_CTRL, SL11_CTRL_RESETENGINE);
3027 1.12 kiyohara /* usb spec says delay >= 10ms, app note 50ms */
3028 1.12 kiyohara start_cc_time(&t_delay, 50000);
3029 1.48 skrll if (sc->sc_bus.ub_usepolling) {
3030 1.12 kiyohara DELAY(50000);
3031 1.12 kiyohara slhci_reset(sc);
3032 1.12 kiyohara } else {
3033 1.12 kiyohara t->flags |= F_RESET;
3034 1.12 kiyohara callout_schedule(&sc->sc_timer, max(mstohz(50), 2));
3035 1.12 kiyohara }
3036 1.12 kiyohara } else if (what == UHF_PORT_SUSPEND) {
3037 1.12 kiyohara printf("%s: USB Suspend not implemented!\n", SC_NAME(sc));
3038 1.37 skrll DDOLOG("%s: USB Suspend not implemented!\n", SC_NAME(sc),
3039 1.12 kiyohara 0,0,0);
3040 1.12 kiyohara } else if (what == UHF_PORT_POWER) {
3041 1.12 kiyohara DLOG(D_MSG, "PORT_POWER", 0,0,0,0);
3042 1.12 kiyohara /* for x68k Nereid USB controller */
3043 1.12 kiyohara if (!(t->flags & F_ACTIVE))
3044 1.12 kiyohara return USBD_INVAL;
3045 1.12 kiyohara if (t->flags & F_POWER)
3046 1.12 kiyohara return USBD_NORMAL_COMPLETION;
3047 1.12 kiyohara if (!(t->flags & F_REALPOWER)) {
3048 1.12 kiyohara if (sc->sc_enable_power)
3049 1.12 kiyohara sc->sc_enable_power(sc, POWER_ON);
3050 1.12 kiyohara t->flags |= F_REALPOWER;
3051 1.12 kiyohara }
3052 1.12 kiyohara t->flags |= F_POWER;
3053 1.12 kiyohara r = slhci_read(sc, SL11_ISR);
3054 1.12 kiyohara if (r & SL11_ISR_INSERT)
3055 1.12 kiyohara slhci_write(sc, SL11_ISR, SL11_ISR_INSERT);
3056 1.12 kiyohara if (r & SL11_ISR_NODEV) {
3057 1.12 kiyohara slhci_intrchange(sc, SL11_IER_INSERT);
3058 1.12 kiyohara t->flags |= F_NODEV;
3059 1.12 kiyohara } else {
3060 1.12 kiyohara t->flags &= ~F_NODEV;
3061 1.12 kiyohara t->flags |= F_CCONNECT|F_ROOTINTR;
3062 1.12 kiyohara }
3063 1.12 kiyohara } else {
3064 1.12 kiyohara DDOLOG("SetPortFeatERR=%#.8x", what, 0,0,0);
3065 1.12 kiyohara return USBD_IOERROR;
3066 1.12 kiyohara }
3067 1.1 isaki
3068 1.1 isaki return USBD_NORMAL_COMPLETION;
3069 1.1 isaki }
3070 1.1 isaki
3071 1.1 isaki static void
3072 1.12 kiyohara slhci_get_status(struct slhci_softc *sc, usb_port_status_t *ps)
3073 1.1 isaki {
3074 1.56 skrll SLHCIHIST_FUNC(); SLHCIHIST_CALLED();
3075 1.12 kiyohara struct slhci_transfers *t;
3076 1.12 kiyohara unsigned int status, change;
3077 1.12 kiyohara
3078 1.12 kiyohara t = &sc->sc_transfers;
3079 1.12 kiyohara
3080 1.44 skrll KASSERT(mutex_owned(&sc->sc_intr_lock));
3081 1.1 isaki
3082 1.34 skrll /*
3083 1.34 skrll * We do not have a way to detect over current or bable and
3084 1.37 skrll * suspend is currently not implemented, so connect and reset
3085 1.34 skrll * are the only changes that need to be reported.
3086 1.34 skrll */
3087 1.12 kiyohara change = 0;
3088 1.12 kiyohara if (t->flags & F_CCONNECT)
3089 1.12 kiyohara change |= UPS_C_CONNECT_STATUS;
3090 1.12 kiyohara if (t->flags & F_CRESET)
3091 1.12 kiyohara change |= UPS_C_PORT_RESET;
3092 1.12 kiyohara
3093 1.12 kiyohara status = 0;
3094 1.12 kiyohara if (!(t->flags & F_NODEV))
3095 1.12 kiyohara status |= UPS_CURRENT_CONNECT_STATUS;
3096 1.12 kiyohara if (!(t->flags & F_UDISABLED))
3097 1.12 kiyohara status |= UPS_PORT_ENABLED;
3098 1.12 kiyohara if (t->flags & F_RESET)
3099 1.12 kiyohara status |= UPS_RESET;
3100 1.12 kiyohara if (t->flags & F_POWER)
3101 1.12 kiyohara status |= UPS_PORT_POWER;
3102 1.12 kiyohara if (t->flags & F_LOWSPEED)
3103 1.12 kiyohara status |= UPS_LOW_SPEED;
3104 1.37 skrll USETW(ps->wPortStatus, status);
3105 1.12 kiyohara USETW(ps->wPortChange, change);
3106 1.12 kiyohara DLOG(D_ROOT, "status=%#.4x, change=%#.4x", status, change, 0,0);
3107 1.1 isaki }
3108 1.1 isaki
3109 1.12 kiyohara static usbd_status
3110 1.48 skrll slhci_root(struct slhci_softc *sc, struct slhci_pipe *spipe,
3111 1.48 skrll struct usbd_xfer *xfer)
3112 1.1 isaki {
3113 1.56 skrll SLHCIHIST_FUNC(); SLHCIHIST_CALLED();
3114 1.12 kiyohara struct slhci_transfers *t;
3115 1.1 isaki
3116 1.12 kiyohara t = &sc->sc_transfers;
3117 1.1 isaki
3118 1.37 skrll LK_SLASSERT(spipe != NULL && xfer != NULL, sc, spipe, xfer, return
3119 1.12 kiyohara USBD_CANCELLED);
3120 1.1 isaki
3121 1.12 kiyohara DLOG(D_TRACE, "%s start", pnames(SLHCI_XFER_TYPE(xfer)), 0,0,0);
3122 1.44 skrll KASSERT(mutex_owned(&sc->sc_intr_lock));
3123 1.1 isaki
3124 1.48 skrll KASSERT(spipe->ptype == PT_ROOT_INTR);
3125 1.48 skrll LK_SLASSERT(t->rootintr == NULL, sc, spipe, xfer, return
3126 1.48 skrll USBD_CANCELLED);
3127 1.48 skrll t->rootintr = xfer;
3128 1.48 skrll if (t->flags & F_CHANGE)
3129 1.48 skrll t->flags |= F_ROOTINTR;
3130 1.48 skrll return USBD_IN_PROGRESS;
3131 1.48 skrll }
3132 1.1 isaki
3133 1.48 skrll static int
3134 1.48 skrll slhci_roothub_ctrl(struct usbd_bus *bus, usb_device_request_t *req,
3135 1.48 skrll void *buf, int buflen)
3136 1.48 skrll {
3137 1.56 skrll SLHCIHIST_FUNC(); SLHCIHIST_CALLED();
3138 1.48 skrll struct slhci_softc *sc = SLHCI_BUS2SC(bus);
3139 1.48 skrll struct slhci_transfers *t = &sc->sc_transfers;
3140 1.48 skrll usbd_status error = USBD_IOERROR; /* XXX should be STALL */
3141 1.48 skrll uint16_t len, value, index;
3142 1.48 skrll uint8_t type;
3143 1.48 skrll int actlen = 0;
3144 1.12 kiyohara
3145 1.12 kiyohara len = UGETW(req->wLength);
3146 1.12 kiyohara value = UGETW(req->wValue);
3147 1.12 kiyohara index = UGETW(req->wIndex);
3148 1.1 isaki
3149 1.37 skrll type = req->bmRequestType;
3150 1.1 isaki
3151 1.12 kiyohara SLHCI_DEXEC(D_TRACE, slhci_log_req_hub(req));
3152 1.1 isaki
3153 1.12 kiyohara /*
3154 1.12 kiyohara * USB requests for hubs have two basic types, standard and class.
3155 1.37 skrll * Each could potentially have recipients of device, interface,
3156 1.12 kiyohara * endpoint, or other. For the hub class, CLASS_OTHER means the port
3157 1.12 kiyohara * and CLASS_DEVICE means the hub. For standard requests, OTHER
3158 1.37 skrll * is not used. Standard request are described in section 9.4 of the
3159 1.37 skrll * standard, hub class requests in 11.16. Each request is either read
3160 1.12 kiyohara * or write.
3161 1.12 kiyohara *
3162 1.37 skrll * Clear Feature, Set Feature, and Status are defined for each of the
3163 1.37 skrll * used recipients. Get Descriptor and Set Descriptor are defined for
3164 1.37 skrll * both standard and hub class types with different descriptors.
3165 1.37 skrll * Other requests have only one defined recipient and type. These
3166 1.37 skrll * include: Get/Set Address, Get/Set Configuration, Get/Set Interface,
3167 1.37 skrll * and Synch Frame for standard requests and Get Bus State for hub
3168 1.12 kiyohara * class.
3169 1.12 kiyohara *
3170 1.37 skrll * When a device is first powered up it has address 0 until the
3171 1.12 kiyohara * address is set.
3172 1.37 skrll *
3173 1.37 skrll * Hubs are only allowed to support one interface and may not have
3174 1.37 skrll * isochronous endpoints. The results of the related requests are
3175 1.12 kiyohara * undefined.
3176 1.12 kiyohara *
3177 1.37 skrll * The standard requires invalid or unsupported requests to return
3178 1.37 skrll * STALL in the data stage, however this does not work well with
3179 1.12 kiyohara * current error handling. XXX
3180 1.12 kiyohara *
3181 1.12 kiyohara * Some unsupported fields:
3182 1.12 kiyohara * Clear Hub Feature is for C_HUB_LOCAL_POWER and C_HUB_OVER_CURRENT
3183 1.12 kiyohara * Set Device Features is for ENDPOINT_HALT and DEVICE_REMOTE_WAKEUP
3184 1.12 kiyohara * Get Bus State is optional sample of D- and D+ at EOF2
3185 1.12 kiyohara */
3186 1.1 isaki
3187 1.12 kiyohara switch (req->bRequest) {
3188 1.12 kiyohara /* Write Requests */
3189 1.12 kiyohara case UR_CLEAR_FEATURE:
3190 1.12 kiyohara if (type == UT_WRITE_CLASS_OTHER) {
3191 1.12 kiyohara if (index == 1 /* Port */)
3192 1.12 kiyohara error = slhci_clear_feature(sc, value);
3193 1.12 kiyohara else
3194 1.12 kiyohara DLOG(D_ROOT, "Clear Port Feature "
3195 1.12 kiyohara "index = %#.4x", index, 0,0,0);
3196 1.12 kiyohara }
3197 1.12 kiyohara break;
3198 1.12 kiyohara case UR_SET_FEATURE:
3199 1.12 kiyohara if (type == UT_WRITE_CLASS_OTHER) {
3200 1.12 kiyohara if (index == 1 /* Port */)
3201 1.12 kiyohara error = slhci_set_feature(sc, value);
3202 1.12 kiyohara else
3203 1.12 kiyohara DLOG(D_ROOT, "Set Port Feature "
3204 1.12 kiyohara "index = %#.4x", index, 0,0,0);
3205 1.12 kiyohara } else if (type != UT_WRITE_CLASS_DEVICE)
3206 1.12 kiyohara DLOG(D_ROOT, "Set Device Feature "
3207 1.12 kiyohara "ENDPOINT_HALT or DEVICE_REMOTE_WAKEUP "
3208 1.12 kiyohara "not supported", 0,0,0,0);
3209 1.12 kiyohara break;
3210 1.48 skrll
3211 1.12 kiyohara /* Read Requests */
3212 1.12 kiyohara case UR_GET_STATUS:
3213 1.12 kiyohara if (type == UT_READ_CLASS_OTHER) {
3214 1.12 kiyohara if (index == 1 /* Port */ && len == /* XXX >=? */
3215 1.12 kiyohara sizeof(usb_port_status_t)) {
3216 1.12 kiyohara slhci_get_status(sc, (usb_port_status_t *)
3217 1.12 kiyohara buf);
3218 1.12 kiyohara actlen = sizeof(usb_port_status_t);
3219 1.12 kiyohara error = USBD_NORMAL_COMPLETION;
3220 1.37 skrll } else
3221 1.37 skrll DLOG(D_ROOT, "Get Port Status index = %#.4x "
3222 1.12 kiyohara "len = %#.4x", index, len, 0,0);
3223 1.12 kiyohara } else if (type == UT_READ_CLASS_DEVICE) { /* XXX index? */
3224 1.12 kiyohara if (len == sizeof(usb_hub_status_t)) {
3225 1.37 skrll DLOG(D_ROOT, "Get Hub Status",
3226 1.12 kiyohara 0,0,0,0);
3227 1.12 kiyohara actlen = sizeof(usb_hub_status_t);
3228 1.12 kiyohara memset(buf, 0, actlen);
3229 1.12 kiyohara error = USBD_NORMAL_COMPLETION;
3230 1.12 kiyohara } else
3231 1.12 kiyohara DLOG(D_ROOT, "Get Hub Status bad len %#.4x",
3232 1.12 kiyohara len, 0,0,0);
3233 1.12 kiyohara }
3234 1.12 kiyohara break;
3235 1.12 kiyohara case UR_GET_DESCRIPTOR:
3236 1.12 kiyohara if (type == UT_READ_DEVICE) {
3237 1.12 kiyohara /* value is type (&0xff00) and index (0xff) */
3238 1.12 kiyohara if (value == (UDESC_DEVICE<<8)) {
3239 1.48 skrll usb_device_descriptor_t devd;
3240 1.48 skrll
3241 1.48 skrll actlen = min(buflen, sizeof(devd));
3242 1.48 skrll memcpy(&devd, buf, actlen);
3243 1.48 skrll USETW(devd.idVendor, USB_VENDOR_SCANLOGIC);
3244 1.48 skrll memcpy(buf, &devd, actlen);
3245 1.12 kiyohara error = USBD_NORMAL_COMPLETION;
3246 1.12 kiyohara } else if (value == (UDESC_CONFIG<<8)) {
3247 1.48 skrll struct usb_roothub_descriptors confd;
3248 1.48 skrll
3249 1.48 skrll actlen = min(buflen, sizeof(confd));
3250 1.48 skrll memcpy(&confd, buf, actlen);
3251 1.48 skrll
3252 1.48 skrll /* 2 mA units */
3253 1.48 skrll confd.urh_confd.bMaxPower = t->max_current;
3254 1.48 skrll memcpy(buf, &confd, actlen);
3255 1.12 kiyohara error = USBD_NORMAL_COMPLETION;
3256 1.12 kiyohara } else if (value == ((UDESC_STRING<<8)|1)) {
3257 1.12 kiyohara /* Vendor */
3258 1.20 isaki actlen = usb_makestrdesc((usb_string_descriptor_t *)
3259 1.12 kiyohara buf, len, "ScanLogic/Cypress");
3260 1.12 kiyohara error = USBD_NORMAL_COMPLETION;
3261 1.12 kiyohara } else if (value == ((UDESC_STRING<<8)|2)) {
3262 1.12 kiyohara /* Product */
3263 1.20 isaki actlen = usb_makestrdesc((usb_string_descriptor_t *)
3264 1.12 kiyohara buf, len, "SL811HS/T root hub");
3265 1.12 kiyohara error = USBD_NORMAL_COMPLETION;
3266 1.12 kiyohara } else
3267 1.12 kiyohara DDOLOG("Unknown Get Descriptor %#.4x",
3268 1.12 kiyohara value, 0,0,0);
3269 1.12 kiyohara } else if (type == UT_READ_CLASS_DEVICE) {
3270 1.12 kiyohara /* Descriptor number is 0 */
3271 1.12 kiyohara if (value == (UDESC_HUB<<8)) {
3272 1.48 skrll usb_hub_descriptor_t hubd;
3273 1.48 skrll
3274 1.48 skrll actlen = min(buflen, sizeof(hubd));
3275 1.48 skrll memcpy(&hubd, buf, actlen);
3276 1.48 skrll hubd.bHubContrCurrent =
3277 1.48 skrll 500 - t->max_current;
3278 1.48 skrll memcpy(buf, &hubd, actlen);
3279 1.12 kiyohara error = USBD_NORMAL_COMPLETION;
3280 1.12 kiyohara } else
3281 1.12 kiyohara DDOLOG("Unknown Get Hub Descriptor %#.4x",
3282 1.12 kiyohara value, 0,0,0);
3283 1.12 kiyohara }
3284 1.12 kiyohara break;
3285 1.48 skrll default:
3286 1.48 skrll /* default from usbroothub */
3287 1.48 skrll return buflen;
3288 1.1 isaki }
3289 1.1 isaki
3290 1.12 kiyohara if (error == USBD_NORMAL_COMPLETION)
3291 1.48 skrll return actlen;
3292 1.12 kiyohara
3293 1.48 skrll return -1;
3294 1.1 isaki }
3295 1.1 isaki
3296 1.12 kiyohara /* End in lock functions. Start debug functions. */
3297 1.12 kiyohara
3298 1.12 kiyohara #ifdef SLHCI_DEBUG
3299 1.1 isaki void
3300 1.12 kiyohara slhci_log_buffer(struct usbd_xfer *xfer)
3301 1.1 isaki {
3302 1.56 skrll SLHCIHIST_FUNC(); SLHCIHIST_CALLED();
3303 1.12 kiyohara u_char *buf;
3304 1.1 isaki
3305 1.48 skrll if(xfer->ux_length > 0 &&
3306 1.48 skrll UE_GET_DIR(xfer->ux_pipe->up_endpoint->ue_edesc->bEndpointAddress) ==
3307 1.12 kiyohara UE_DIR_IN) {
3308 1.48 skrll buf = xfer->ux_buf;
3309 1.48 skrll DDOLOGBUF(buf, xfer->ux_actlen);
3310 1.48 skrll DDOLOG("len %d actlen %d short %d", xfer->ux_length,
3311 1.48 skrll xfer->ux_actlen, xfer->ux_length - xfer->ux_actlen, 0);
3312 1.12 kiyohara }
3313 1.1 isaki }
3314 1.1 isaki
3315 1.1 isaki void
3316 1.12 kiyohara slhci_log_req(usb_device_request_t *r)
3317 1.1 isaki {
3318 1.56 skrll SLHCIHIST_FUNC(); SLHCIHIST_CALLED();
3319 1.12 kiyohara static const char *xmes[]={
3320 1.1 isaki "GETSTAT",
3321 1.1 isaki "CLRFEAT",
3322 1.1 isaki "res",
3323 1.1 isaki "SETFEAT",
3324 1.1 isaki "res",
3325 1.1 isaki "SETADDR",
3326 1.1 isaki "GETDESC",
3327 1.1 isaki "SETDESC",
3328 1.1 isaki "GETCONF",
3329 1.1 isaki "SETCONF",
3330 1.1 isaki "GETIN/F",
3331 1.1 isaki "SETIN/F",
3332 1.12 kiyohara "SYNC_FR",
3333 1.12 kiyohara "UNKNOWN"
3334 1.1 isaki };
3335 1.12 kiyohara int req, mreq, type, value, index, len;
3336 1.1 isaki
3337 1.1 isaki req = r->bRequest;
3338 1.12 kiyohara mreq = (req > 13) ? 13 : req;
3339 1.1 isaki type = r->bmRequestType;
3340 1.1 isaki value = UGETW(r->wValue);
3341 1.1 isaki index = UGETW(r->wIndex);
3342 1.1 isaki len = UGETW(r->wLength);
3343 1.1 isaki
3344 1.12 kiyohara DDOLOG("request: %s %#x", xmes[mreq], type, 0,0);
3345 1.12 kiyohara DDOLOG("request: r=%d,v=%d,i=%d,l=%d ", req, value, index, len);
3346 1.1 isaki }
3347 1.1 isaki
3348 1.1 isaki void
3349 1.12 kiyohara slhci_log_req_hub(usb_device_request_t *r)
3350 1.1 isaki {
3351 1.56 skrll SLHCIHIST_FUNC(); SLHCIHIST_CALLED();
3352 1.12 kiyohara static const struct {
3353 1.1 isaki int req;
3354 1.1 isaki int type;
3355 1.9 christos const char *str;
3356 1.1 isaki } conf[] = {
3357 1.1 isaki { 1, 0x20, "ClrHubFeat" },
3358 1.1 isaki { 1, 0x23, "ClrPortFeat" },
3359 1.1 isaki { 2, 0xa3, "GetBusState" },
3360 1.1 isaki { 6, 0xa0, "GetHubDesc" },
3361 1.1 isaki { 0, 0xa0, "GetHubStat" },
3362 1.1 isaki { 0, 0xa3, "GetPortStat" },
3363 1.1 isaki { 7, 0x20, "SetHubDesc" },
3364 1.1 isaki { 3, 0x20, "SetHubFeat" },
3365 1.1 isaki { 3, 0x23, "SetPortFeat" },
3366 1.1 isaki {-1, 0, NULL},
3367 1.1 isaki };
3368 1.1 isaki int i;
3369 1.1 isaki int value, index, len;
3370 1.12 kiyohara const char *str;
3371 1.1 isaki
3372 1.1 isaki value = UGETW(r->wValue);
3373 1.1 isaki index = UGETW(r->wIndex);
3374 1.1 isaki len = UGETW(r->wLength);
3375 1.1 isaki for (i = 0; ; i++) {
3376 1.12 kiyohara if (conf[i].req == -1 ) {
3377 1.12 kiyohara slhci_log_req(r);
3378 1.12 kiyohara return;
3379 1.12 kiyohara }
3380 1.1 isaki if (r->bmRequestType == conf[i].type && r->bRequest == conf[i].req) {
3381 1.12 kiyohara str = conf[i].str;
3382 1.1 isaki break;
3383 1.1 isaki }
3384 1.1 isaki }
3385 1.12 kiyohara DDOLOG("hub request: %s v=%d,i=%d,l=%d ", str, value, index, len);
3386 1.1 isaki }
3387 1.1 isaki
3388 1.1 isaki void
3389 1.12 kiyohara slhci_log_dumpreg(void)
3390 1.1 isaki {
3391 1.56 skrll SLHCIHIST_FUNC(); SLHCIHIST_CALLED();
3392 1.12 kiyohara uint8_t r;
3393 1.12 kiyohara unsigned int aaddr, alen, baddr, blen;
3394 1.12 kiyohara static u_char buf[240];
3395 1.12 kiyohara
3396 1.12 kiyohara r = slhci_read(ssc, SL11_E0CTRL);
3397 1.12 kiyohara DDOLOG("USB A Host Control = %#.2x", r, 0,0,0);
3398 1.37 skrll DDOLOGFLAG8("E0CTRL=", r, "Preamble", "Data Toggle", "SOF Sync",
3399 1.12 kiyohara "ISOC", "res", "Out", "Enable", "Arm");
3400 1.12 kiyohara aaddr = slhci_read(ssc, SL11_E0ADDR);
3401 1.12 kiyohara DDOLOG("USB A Base Address = %u", aaddr, 0,0,0);
3402 1.12 kiyohara alen = slhci_read(ssc, SL11_E0LEN);
3403 1.12 kiyohara DDOLOG("USB A Length = %u", alen, 0,0,0);
3404 1.12 kiyohara r = slhci_read(ssc, SL11_E0STAT);
3405 1.12 kiyohara DDOLOG("USB A Status = %#.2x", r, 0,0,0);
3406 1.12 kiyohara DDOLOGFLAG8("E0STAT=", r, "STALL", "NAK", "Overflow", "Setup",
3407 1.12 kiyohara "Data Toggle", "Timeout", "Error", "ACK");
3408 1.12 kiyohara r = slhci_read(ssc, SL11_E0CONT);
3409 1.12 kiyohara DDOLOG("USB A Remaining or Overflow Length = %u", r, 0,0,0);
3410 1.12 kiyohara r = slhci_read(ssc, SL11_E1CTRL);
3411 1.12 kiyohara DDOLOG("USB B Host Control = %#.2x", r, 0,0,0);
3412 1.37 skrll DDOLOGFLAG8("E1CTRL=", r, "Preamble", "Data Toggle", "SOF Sync",
3413 1.12 kiyohara "ISOC", "res", "Out", "Enable", "Arm");
3414 1.12 kiyohara baddr = slhci_read(ssc, SL11_E1ADDR);
3415 1.12 kiyohara DDOLOG("USB B Base Address = %u", baddr, 0,0,0);
3416 1.12 kiyohara blen = slhci_read(ssc, SL11_E1LEN);
3417 1.12 kiyohara DDOLOG("USB B Length = %u", blen, 0,0,0);
3418 1.12 kiyohara r = slhci_read(ssc, SL11_E1STAT);
3419 1.12 kiyohara DDOLOG("USB B Status = %#.2x", r, 0,0,0);
3420 1.12 kiyohara DDOLOGFLAG8("E1STAT=", r, "STALL", "NAK", "Overflow", "Setup",
3421 1.12 kiyohara "Data Toggle", "Timeout", "Error", "ACK");
3422 1.12 kiyohara r = slhci_read(ssc, SL11_E1CONT);
3423 1.12 kiyohara DDOLOG("USB B Remaining or Overflow Length = %u", r, 0,0,0);
3424 1.12 kiyohara
3425 1.12 kiyohara r = slhci_read(ssc, SL11_CTRL);
3426 1.12 kiyohara DDOLOG("Control = %#.2x", r, 0,0,0);
3427 1.37 skrll DDOLOGFLAG8("CTRL=", r, "res", "Suspend", "LOW Speed",
3428 1.12 kiyohara "J-K State Force", "Reset", "res", "res", "SOF");
3429 1.12 kiyohara r = slhci_read(ssc, SL11_IER);
3430 1.12 kiyohara DDOLOG("Interrupt Enable = %#.2x", r, 0,0,0);
3431 1.12 kiyohara DDOLOGFLAG8("IER=", r, "D+ **IER!**", "Device Detect/Resume",
3432 1.12 kiyohara "Insert/Remove", "SOF", "res", "res", "USBB", "USBA");
3433 1.12 kiyohara r = slhci_read(ssc, SL11_ISR);
3434 1.12 kiyohara DDOLOG("Interrupt Status = %#.2x", r, 0,0,0);
3435 1.12 kiyohara DDOLOGFLAG8("ISR=", r, "D+", "Device Detect/Resume",
3436 1.12 kiyohara "Insert/Remove", "SOF", "res", "res", "USBB", "USBA");
3437 1.12 kiyohara r = slhci_read(ssc, SL11_REV);
3438 1.12 kiyohara DDOLOG("Revision = %#.2x", r, 0,0,0);
3439 1.12 kiyohara r = slhci_read(ssc, SL811_CSOF);
3440 1.12 kiyohara DDOLOG("SOF Counter = %#.2x", r, 0,0,0);
3441 1.12 kiyohara
3442 1.37 skrll if (alen && aaddr >= SL11_BUFFER_START && aaddr < SL11_BUFFER_END &&
3443 1.12 kiyohara alen <= SL11_MAX_PACKET_SIZE && aaddr + alen <= SL11_BUFFER_END) {
3444 1.12 kiyohara slhci_read_multi(ssc, aaddr, buf, alen);
3445 1.12 kiyohara DDOLOG("USBA Buffer: start %u len %u", aaddr, alen, 0,0);
3446 1.12 kiyohara DDOLOGBUF(buf, alen);
3447 1.12 kiyohara } else if (alen)
3448 1.12 kiyohara DDOLOG("USBA Buffer Invalid", 0,0,0,0);
3449 1.12 kiyohara
3450 1.37 skrll if (blen && baddr >= SL11_BUFFER_START && baddr < SL11_BUFFER_END &&
3451 1.12 kiyohara blen <= SL11_MAX_PACKET_SIZE && baddr + blen <= SL11_BUFFER_END) {
3452 1.12 kiyohara slhci_read_multi(ssc, baddr, buf, blen);
3453 1.12 kiyohara DDOLOG("USBB Buffer: start %u len %u", baddr, blen, 0,0);
3454 1.12 kiyohara DDOLOGBUF(buf, blen);
3455 1.12 kiyohara } else if (blen)
3456 1.12 kiyohara DDOLOG("USBB Buffer Invalid", 0,0,0,0);
3457 1.1 isaki }
3458 1.1 isaki
3459 1.1 isaki void
3460 1.12 kiyohara slhci_log_xfer(struct usbd_xfer *xfer)
3461 1.1 isaki {
3462 1.56 skrll SLHCIHIST_FUNC(); SLHCIHIST_CALLED();
3463 1.12 kiyohara DDOLOG("xfer: length=%u, actlen=%u, flags=%#x, timeout=%u,",
3464 1.48 skrll xfer->ux_length, xfer->ux_actlen, xfer->ux_flags, xfer->ux_timeout);
3465 1.56 skrll DDOLOG("buffer=%p", xfer->ux_buf, 0,0,0);
3466 1.48 skrll slhci_log_req_hub(&xfer->ux_request);
3467 1.12 kiyohara }
3468 1.12 kiyohara
3469 1.12 kiyohara void
3470 1.12 kiyohara slhci_log_spipe(struct slhci_pipe *spipe)
3471 1.12 kiyohara {
3472 1.56 skrll SLHCIHIST_FUNC(); SLHCIHIST_CALLED();
3473 1.37 skrll DDOLOG("spipe %p onlists: %s %s %s", spipe, gcq_onlist(&spipe->ap) ?
3474 1.37 skrll "AP" : "", gcq_onlist(&spipe->to) ? "TO" : "",
3475 1.12 kiyohara gcq_onlist(&spipe->xq) ? "XQ" : "");
3476 1.12 kiyohara DDOLOG("spipe: xfer %p buffer %p pflags %#x ptype %s",
3477 1.12 kiyohara spipe->xfer, spipe->buffer, spipe->pflags, pnames(spipe->ptype));
3478 1.12 kiyohara }
3479 1.12 kiyohara
3480 1.12 kiyohara void
3481 1.12 kiyohara slhci_print_intr(void)
3482 1.12 kiyohara {
3483 1.12 kiyohara unsigned int ier, isr;
3484 1.12 kiyohara ier = slhci_read(ssc, SL11_IER);
3485 1.12 kiyohara isr = slhci_read(ssc, SL11_ISR);
3486 1.12 kiyohara printf("IER: %#x ISR: %#x \n", ier, isr);
3487 1.12 kiyohara }
3488 1.12 kiyohara
3489 1.12 kiyohara #if 0
3490 1.12 kiyohara void
3491 1.22 cegger slhci_log_sc(void)
3492 1.12 kiyohara {
3493 1.12 kiyohara struct slhci_transfers *t;
3494 1.12 kiyohara int i;
3495 1.12 kiyohara
3496 1.12 kiyohara t = &ssc->sc_transfers;
3497 1.12 kiyohara
3498 1.12 kiyohara DDOLOG("Flags=%#x", t->flags, 0,0,0);
3499 1.37 skrll DDOLOG("a = %p Alen=%d b = %p Blen=%d", t->spipe[0], t->len[0],
3500 1.12 kiyohara t->spipe[1], t->len[1]);
3501 1.12 kiyohara
3502 1.37 skrll for (i=0; i<=Q_MAX; i++)
3503 1.12 kiyohara DDOLOG("Q %d: %p", i, gcq_first(&t->q[i]), 0,0);
3504 1.12 kiyohara
3505 1.37 skrll DDOLOG("TIMED: %p", GCQ_ITEM(gcq_first(&t->to),
3506 1.12 kiyohara struct slhci_pipe, to), 0,0,0);
3507 1.12 kiyohara
3508 1.12 kiyohara DDOLOG("frame=%d rootintr=%p", t->frame, t->rootintr, 0,0);
3509 1.12 kiyohara
3510 1.48 skrll DDOLOG("ub_usepolling=%d", ssc->sc_bus.ub_usepolling, 0, 0, 0);
3511 1.12 kiyohara }
3512 1.12 kiyohara
3513 1.12 kiyohara void
3514 1.12 kiyohara slhci_log_slreq(struct slhci_pipe *r)
3515 1.12 kiyohara {
3516 1.12 kiyohara DDOLOG("next: %p", r->q.next.sqe_next, 0,0,0);
3517 1.12 kiyohara DDOLOG("xfer: %p", r->xfer, 0,0,0);
3518 1.12 kiyohara DDOLOG("buffer: %p", r->buffer, 0,0,0);
3519 1.12 kiyohara DDOLOG("bustime: %u", r->bustime, 0,0,0);
3520 1.12 kiyohara DDOLOG("control: %#x", r->control, 0,0,0);
3521 1.37 skrll DDOLOGFLAG8("control=", r->control, "Preamble", "Data Toggle",
3522 1.12 kiyohara "SOF Sync", "ISOC", "res", "Out", "Enable", "Arm");
3523 1.12 kiyohara DDOLOG("pid: %#x", r->tregs[PID], 0,0,0);
3524 1.12 kiyohara DDOLOG("dev: %u", r->tregs[DEV], 0,0,0);
3525 1.12 kiyohara DDOLOG("len: %u", r->tregs[LEN], 0,0,0);
3526 1.12 kiyohara
3527 1.12 kiyohara if (r->xfer)
3528 1.12 kiyohara slhci_log_xfer(r->xfer);
3529 1.1 isaki }
3530 1.12 kiyohara #endif
3531 1.1 isaki #endif /* SLHCI_DEBUG */
3532 1.12 kiyohara /* End debug functions. */
3533