xref: /freebsd/sys/dev/usb/controller/musb_otg.c (revision d6b92ffa)
1 /* $FreeBSD$ */
2 /*-
3  * Copyright (c) 2008 Hans Petter Selasky. All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  *
14  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24  * SUCH DAMAGE.
25  */
26 
27 /*
28  * Thanks to Mentor Graphics for providing a reference driver for this USB chip
29  * at their homepage.
30  */
31 
32 /*
33  * This file contains the driver for the Mentor Graphics Inventra USB
34  * 2.0 High Speed Dual-Role controller.
35  *
36  */
37 
38 #ifdef USB_GLOBAL_INCLUDE_FILE
39 #include USB_GLOBAL_INCLUDE_FILE
40 #else
41 #include <sys/stdint.h>
42 #include <sys/stddef.h>
43 #include <sys/param.h>
44 #include <sys/queue.h>
45 #include <sys/types.h>
46 #include <sys/systm.h>
47 #include <sys/kernel.h>
48 #include <sys/bus.h>
49 #include <sys/module.h>
50 #include <sys/lock.h>
51 #include <sys/mutex.h>
52 #include <sys/condvar.h>
53 #include <sys/sysctl.h>
54 #include <sys/sx.h>
55 #include <sys/unistd.h>
56 #include <sys/callout.h>
57 #include <sys/malloc.h>
58 #include <sys/priv.h>
59 
60 #include <dev/usb/usb.h>
61 #include <dev/usb/usbdi.h>
62 
63 #define	USB_DEBUG_VAR musbotgdebug
64 
65 #include <dev/usb/usb_core.h>
66 #include <dev/usb/usb_debug.h>
67 #include <dev/usb/usb_busdma.h>
68 #include <dev/usb/usb_process.h>
69 #include <dev/usb/usb_transfer.h>
70 #include <dev/usb/usb_device.h>
71 #include <dev/usb/usb_hub.h>
72 #include <dev/usb/usb_util.h>
73 
74 #include <dev/usb/usb_controller.h>
75 #include <dev/usb/usb_bus.h>
76 #endif			/* USB_GLOBAL_INCLUDE_FILE */
77 
78 #include <dev/usb/controller/musb_otg.h>
79 
80 #define	MUSBOTG_INTR_ENDPT 1
81 
82 #define	MUSBOTG_BUS2SC(bus) \
83    ((struct musbotg_softc *)(((uint8_t *)(bus)) - \
84    USB_P2U(&(((struct musbotg_softc *)0)->sc_bus))))
85 
86 #define	MUSBOTG_PC2SC(pc) \
87    MUSBOTG_BUS2SC(USB_DMATAG_TO_XROOT((pc)->tag_parent)->bus)
88 
89 #ifdef USB_DEBUG
90 static int musbotgdebug = 0;
91 
92 static SYSCTL_NODE(_hw_usb, OID_AUTO, musbotg, CTLFLAG_RW, 0, "USB musbotg");
93 SYSCTL_INT(_hw_usb_musbotg, OID_AUTO, debug, CTLFLAG_RWTUN,
94     &musbotgdebug, 0, "Debug level");
95 #endif
96 
97 #define	MAX_NAK_TO	16
98 
99 /* prototypes */
100 
101 static const struct usb_bus_methods musbotg_bus_methods;
102 static const struct usb_pipe_methods musbotg_device_bulk_methods;
103 static const struct usb_pipe_methods musbotg_device_ctrl_methods;
104 static const struct usb_pipe_methods musbotg_device_intr_methods;
105 static const struct usb_pipe_methods musbotg_device_isoc_methods;
106 
107 /* Control transfers: Device mode */
108 static musbotg_cmd_t musbotg_dev_ctrl_setup_rx;
109 static musbotg_cmd_t musbotg_dev_ctrl_data_rx;
110 static musbotg_cmd_t musbotg_dev_ctrl_data_tx;
111 static musbotg_cmd_t musbotg_dev_ctrl_status;
112 
113 /* Control transfers: Host mode */
114 static musbotg_cmd_t musbotg_host_ctrl_setup_tx;
115 static musbotg_cmd_t musbotg_host_ctrl_data_rx;
116 static musbotg_cmd_t musbotg_host_ctrl_data_tx;
117 static musbotg_cmd_t musbotg_host_ctrl_status_rx;
118 static musbotg_cmd_t musbotg_host_ctrl_status_tx;
119 
120 /* Bulk, Interrupt, Isochronous: Device mode */
121 static musbotg_cmd_t musbotg_dev_data_rx;
122 static musbotg_cmd_t musbotg_dev_data_tx;
123 
124 /* Bulk, Interrupt, Isochronous: Host mode */
125 static musbotg_cmd_t musbotg_host_data_rx;
126 static musbotg_cmd_t musbotg_host_data_tx;
127 
128 static void	musbotg_device_done(struct usb_xfer *, usb_error_t);
129 static void	musbotg_do_poll(struct usb_bus *);
130 static void	musbotg_standard_done(struct usb_xfer *);
131 static void	musbotg_interrupt_poll(struct musbotg_softc *);
132 static void	musbotg_root_intr(struct musbotg_softc *);
133 static int	musbotg_channel_alloc(struct musbotg_softc *, struct musbotg_td *td, uint8_t);
134 static void	musbotg_channel_free(struct musbotg_softc *, struct musbotg_td *td);
135 static void	musbotg_ep_int_set(struct musbotg_softc *sc, int channel, int on);
136 
137 /*
138  * Here is a configuration that the chip supports.
139  */
140 static const struct usb_hw_ep_profile musbotg_ep_profile[1] = {
141 
142 	[0] = {
143 		.max_in_frame_size = 64,/* fixed */
144 		.max_out_frame_size = 64,	/* fixed */
145 		.is_simplex = 1,
146 		.support_control = 1,
147 	}
148 };
149 
150 static int
151 musbotg_channel_alloc(struct musbotg_softc *sc, struct musbotg_td *td, uint8_t is_tx)
152 {
153 	int ch;
154 	int ep;
155 
156 	ep = td->ep_no;
157 
158 	/* In device mode each EP got its own channel */
159 	if (sc->sc_mode == MUSB2_DEVICE_MODE) {
160 		musbotg_ep_int_set(sc, ep, 1);
161 		return (ep);
162 	}
163 
164 	/*
165 	 * All control transactions go through EP0
166 	 */
167 	if (ep == 0) {
168 		if (sc->sc_channel_mask & (1 << 0))
169 			return (-1);
170 		sc->sc_channel_mask |= (1 << 0);
171 		musbotg_ep_int_set(sc, ep, 1);
172 		return (0);
173 	}
174 
175 	for (ch = sc->sc_ep_max; ch != 0; ch--) {
176 		if (sc->sc_channel_mask & (1 << ch))
177 			continue;
178 
179 		/* check FIFO size requirement */
180 		if (is_tx) {
181 			if (td->max_frame_size >
182 			    sc->sc_hw_ep_profile[ch].max_in_frame_size)
183 				continue;
184 		} else {
185 			if (td->max_frame_size >
186 			    sc->sc_hw_ep_profile[ch].max_out_frame_size)
187 				continue;
188 		}
189 		sc->sc_channel_mask |= (1 << ch);
190 		musbotg_ep_int_set(sc, ch, 1);
191 		return (ch);
192 	}
193 
194 	DPRINTFN(-1, "No available channels. Mask: %04x\n",  sc->sc_channel_mask);
195 
196 	return (-1);
197 }
198 
199 static void
200 musbotg_channel_free(struct musbotg_softc *sc, struct musbotg_td *td)
201 {
202 
203 	DPRINTFN(1, "ep_no=%d\n", td->channel);
204 
205 	if (sc->sc_mode == MUSB2_DEVICE_MODE)
206 		return;
207 
208 	if (td == NULL)
209 		return;
210 	if (td->channel == -1)
211 		return;
212 
213 	musbotg_ep_int_set(sc, td->channel, 0);
214 	sc->sc_channel_mask &= ~(1 << td->channel);
215 
216 	td->channel = -1;
217 }
218 
219 static void
220 musbotg_get_hw_ep_profile(struct usb_device *udev,
221     const struct usb_hw_ep_profile **ppf, uint8_t ep_addr)
222 {
223 	struct musbotg_softc *sc;
224 
225 	sc = MUSBOTG_BUS2SC(udev->bus);
226 
227 	if (ep_addr == 0) {
228 		/* control endpoint */
229 		*ppf = musbotg_ep_profile;
230 	} else if (ep_addr <= sc->sc_ep_max) {
231 		/* other endpoints */
232 		*ppf = sc->sc_hw_ep_profile + ep_addr;
233 	} else {
234 		*ppf = NULL;
235 	}
236 }
237 
238 static void
239 musbotg_clocks_on(struct musbotg_softc *sc)
240 {
241 	if (sc->sc_flags.clocks_off &&
242 	    sc->sc_flags.port_powered) {
243 
244 		DPRINTFN(4, "\n");
245 
246 		if (sc->sc_clocks_on) {
247 			(sc->sc_clocks_on) (sc->sc_clocks_arg);
248 		}
249 		sc->sc_flags.clocks_off = 0;
250 
251 		/* XXX enable Transceiver */
252 	}
253 }
254 
255 static void
256 musbotg_clocks_off(struct musbotg_softc *sc)
257 {
258 	if (!sc->sc_flags.clocks_off) {
259 
260 		DPRINTFN(4, "\n");
261 
262 		/* XXX disable Transceiver */
263 
264 		if (sc->sc_clocks_off) {
265 			(sc->sc_clocks_off) (sc->sc_clocks_arg);
266 		}
267 		sc->sc_flags.clocks_off = 1;
268 	}
269 }
270 
271 static void
272 musbotg_pull_common(struct musbotg_softc *sc, uint8_t on)
273 {
274 	uint8_t temp;
275 
276 	temp = MUSB2_READ_1(sc, MUSB2_REG_POWER);
277 	if (on)
278 		temp |= MUSB2_MASK_SOFTC;
279 	else
280 		temp &= ~MUSB2_MASK_SOFTC;
281 
282 	MUSB2_WRITE_1(sc, MUSB2_REG_POWER, temp);
283 }
284 
285 static void
286 musbotg_pull_up(struct musbotg_softc *sc)
287 {
288 	/* pullup D+, if possible */
289 
290 	if (!sc->sc_flags.d_pulled_up &&
291 	    sc->sc_flags.port_powered) {
292 		sc->sc_flags.d_pulled_up = 1;
293 		musbotg_pull_common(sc, 1);
294 	}
295 }
296 
297 static void
298 musbotg_pull_down(struct musbotg_softc *sc)
299 {
300 	/* pulldown D+, if possible */
301 
302 	if (sc->sc_flags.d_pulled_up) {
303 		sc->sc_flags.d_pulled_up = 0;
304 		musbotg_pull_common(sc, 0);
305 	}
306 }
307 
308 static void
309 musbotg_suspend_host(struct musbotg_softc *sc)
310 {
311 	uint8_t temp;
312 
313 	if (sc->sc_flags.status_suspend) {
314 		return;
315 	}
316 
317 	temp = MUSB2_READ_1(sc, MUSB2_REG_POWER);
318 	temp |= MUSB2_MASK_SUSPMODE;
319 	MUSB2_WRITE_1(sc, MUSB2_REG_POWER, temp);
320 	sc->sc_flags.status_suspend = 1;
321 }
322 
323 static void
324 musbotg_wakeup_host(struct musbotg_softc *sc)
325 {
326 	uint8_t temp;
327 
328 	if (!(sc->sc_flags.status_suspend)) {
329 		return;
330 	}
331 
332 	temp = MUSB2_READ_1(sc, MUSB2_REG_POWER);
333 	temp &= ~MUSB2_MASK_SUSPMODE;
334 	temp |= MUSB2_MASK_RESUME;
335 	MUSB2_WRITE_1(sc, MUSB2_REG_POWER, temp);
336 
337 	/* wait 20 milliseconds */
338 	/* Wait for reset to complete. */
339 	usb_pause_mtx(&sc->sc_bus.bus_mtx, hz / 50);
340 
341 	temp = MUSB2_READ_1(sc, MUSB2_REG_POWER);
342 	temp &= ~MUSB2_MASK_RESUME;
343 	MUSB2_WRITE_1(sc, MUSB2_REG_POWER, temp);
344 
345 	sc->sc_flags.status_suspend = 0;
346 }
347 
348 static void
349 musbotg_wakeup_peer(struct musbotg_softc *sc)
350 {
351 	uint8_t temp;
352 
353 	if (!(sc->sc_flags.status_suspend)) {
354 		return;
355 	}
356 
357 	temp = MUSB2_READ_1(sc, MUSB2_REG_POWER);
358 	temp |= MUSB2_MASK_RESUME;
359 	MUSB2_WRITE_1(sc, MUSB2_REG_POWER, temp);
360 
361 	/* wait 8 milliseconds */
362 	/* Wait for reset to complete. */
363 	usb_pause_mtx(&sc->sc_bus.bus_mtx, hz / 125);
364 
365 	temp = MUSB2_READ_1(sc, MUSB2_REG_POWER);
366 	temp &= ~MUSB2_MASK_RESUME;
367 	MUSB2_WRITE_1(sc, MUSB2_REG_POWER, temp);
368 }
369 
370 static void
371 musbotg_set_address(struct musbotg_softc *sc, uint8_t addr)
372 {
373 	DPRINTFN(4, "addr=%d\n", addr);
374 	addr &= 0x7F;
375 	MUSB2_WRITE_1(sc, MUSB2_REG_FADDR, addr);
376 }
377 
378 static uint8_t
379 musbotg_dev_ctrl_setup_rx(struct musbotg_td *td)
380 {
381 	struct musbotg_softc *sc;
382 	struct usb_device_request req;
383 	uint16_t count;
384 	uint8_t csr;
385 
386 	/* get pointer to softc */
387 	sc = MUSBOTG_PC2SC(td->pc);
388 
389 	if (td->channel == -1)
390 		td->channel = musbotg_channel_alloc(sc, td, 0);
391 
392 	/* EP0 is busy, wait */
393 	if (td->channel == -1)
394 		return (1);
395 
396 	DPRINTFN(1, "ep_no=%d\n", td->channel);
397 
398 	/* select endpoint 0 */
399 	MUSB2_WRITE_1(sc, MUSB2_REG_EPINDEX, 0);
400 
401 	/* read out FIFO status */
402 	csr = MUSB2_READ_1(sc, MUSB2_REG_TXCSRL);
403 
404 	DPRINTFN(4, "csr=0x%02x\n", csr);
405 
406 	/*
407 	 * NOTE: If DATAEND is set we should not call the
408 	 * callback, hence the status stage is not complete.
409 	 */
410 	if (csr & MUSB2_MASK_CSR0L_DATAEND) {
411 		/* do not stall at this point */
412 		td->did_stall = 1;
413 		/* wait for interrupt */
414 		DPRINTFN(1, "CSR0 DATAEND\n");
415 		goto not_complete;
416 	}
417 
418 	if (csr & MUSB2_MASK_CSR0L_SENTSTALL) {
419 		/* clear SENTSTALL */
420 		MUSB2_WRITE_1(sc, MUSB2_REG_TXCSRL, 0);
421 		/* get latest status */
422 		csr = MUSB2_READ_1(sc, MUSB2_REG_TXCSRL);
423 		/* update EP0 state */
424 		sc->sc_ep0_busy = 0;
425 	}
426 	if (csr & MUSB2_MASK_CSR0L_SETUPEND) {
427 		/* clear SETUPEND */
428 		MUSB2_WRITE_1(sc, MUSB2_REG_TXCSRL,
429 		    MUSB2_MASK_CSR0L_SETUPEND_CLR);
430 		/* get latest status */
431 		csr = MUSB2_READ_1(sc, MUSB2_REG_TXCSRL);
432 		/* update EP0 state */
433 		sc->sc_ep0_busy = 0;
434 	}
435 	if (sc->sc_ep0_busy) {
436 		DPRINTFN(1, "EP0 BUSY\n");
437 		goto not_complete;
438 	}
439 	if (!(csr & MUSB2_MASK_CSR0L_RXPKTRDY)) {
440 		goto not_complete;
441 	}
442 	/* get the packet byte count */
443 	count = MUSB2_READ_2(sc, MUSB2_REG_RXCOUNT);
444 
445 	/* verify data length */
446 	if (count != td->remainder) {
447 		DPRINTFN(1, "Invalid SETUP packet "
448 		    "length, %d bytes\n", count);
449 		MUSB2_WRITE_1(sc, MUSB2_REG_TXCSRL,
450 		      MUSB2_MASK_CSR0L_RXPKTRDY_CLR);
451 		/* don't clear stall */
452 		td->did_stall = 1;
453 		goto not_complete;
454 	}
455 	if (count != sizeof(req)) {
456 		DPRINTFN(1, "Unsupported SETUP packet "
457 		    "length, %d bytes\n", count);
458 		MUSB2_WRITE_1(sc, MUSB2_REG_TXCSRL,
459 		      MUSB2_MASK_CSR0L_RXPKTRDY_CLR);
460 		/* don't clear stall */
461 		td->did_stall = 1;
462 		goto not_complete;
463 	}
464 	/* clear did stall flag */
465 	td->did_stall = 0;
466 
467 	/* receive data */
468 	bus_space_read_multi_1(sc->sc_io_tag, sc->sc_io_hdl,
469 	    MUSB2_REG_EPFIFO(0), (void *)&req, sizeof(req));
470 
471 	/* copy data into real buffer */
472 	usbd_copy_in(td->pc, 0, &req, sizeof(req));
473 
474 	td->offset = sizeof(req);
475 	td->remainder = 0;
476 
477 	/* set pending command */
478 	sc->sc_ep0_cmd = MUSB2_MASK_CSR0L_RXPKTRDY_CLR;
479 
480 	/* we need set stall or dataend after this */
481 	sc->sc_ep0_busy = 1;
482 
483 	/* sneak peek the set address */
484 	if ((req.bmRequestType == UT_WRITE_DEVICE) &&
485 	    (req.bRequest == UR_SET_ADDRESS)) {
486 		sc->sc_dv_addr = req.wValue[0] & 0x7F;
487 	} else {
488 		sc->sc_dv_addr = 0xFF;
489 	}
490 
491 	musbotg_channel_free(sc, td);
492 	return (0);			/* complete */
493 
494 not_complete:
495 	/* abort any ongoing transfer */
496 	if (!td->did_stall) {
497 		DPRINTFN(4, "stalling\n");
498 		MUSB2_WRITE_1(sc, MUSB2_REG_TXCSRL,
499 		    MUSB2_MASK_CSR0L_SENDSTALL);
500 		td->did_stall = 1;
501 	}
502 	return (1);			/* not complete */
503 }
504 
505 static uint8_t
506 musbotg_host_ctrl_setup_tx(struct musbotg_td *td)
507 {
508 	struct musbotg_softc *sc;
509 	struct usb_device_request req;
510 	uint8_t csr, csrh;
511 
512 	/* get pointer to softc */
513 	sc = MUSBOTG_PC2SC(td->pc);
514 
515 	if (td->channel == -1)
516 		td->channel = musbotg_channel_alloc(sc, td, 1);
517 
518 	/* EP0 is busy, wait */
519 	if (td->channel == -1)
520 		return (1);
521 
522 	DPRINTFN(1, "ep_no=%d\n", td->channel);
523 
524 	/* select endpoint 0 */
525 	MUSB2_WRITE_1(sc, MUSB2_REG_EPINDEX, 0);
526 
527 	/* read out FIFO status */
528 	csr = MUSB2_READ_1(sc, MUSB2_REG_TXCSRL);
529 	DPRINTFN(4, "csr=0x%02x\n", csr);
530 
531 	/* Not ready yet yet */
532 	if (csr & MUSB2_MASK_CSR0L_TXPKTRDY)
533 		return (1);
534 
535 	/* Failed */
536 	if (csr & (MUSB2_MASK_CSR0L_RXSTALL |
537 	    MUSB2_MASK_CSR0L_ERROR))
538 	{
539 		/* Clear status bit */
540 		MUSB2_WRITE_1(sc, MUSB2_REG_TXCSRL, 0);
541 		DPRINTFN(1, "error bit set, csr=0x%02x\n", csr);
542 		td->error = 1;
543 	}
544 
545 	if (csr & MUSB2_MASK_CSR0L_NAKTIMO) {
546 		DPRINTFN(1, "NAK timeout\n");
547 
548 		if (csr & MUSB2_MASK_CSR0L_TXFIFONEMPTY) {
549 			csrh = MUSB2_READ_1(sc, MUSB2_REG_TXCSRH);
550 			csrh |= MUSB2_MASK_CSR0H_FFLUSH;
551 			MUSB2_WRITE_1(sc, MUSB2_REG_TXCSRH, csrh);
552 			csr = MUSB2_READ_1(sc, MUSB2_REG_TXCSRL);
553 			if (csr & MUSB2_MASK_CSR0L_TXFIFONEMPTY) {
554 				csrh = MUSB2_READ_1(sc, MUSB2_REG_TXCSRH);
555 				csrh |= MUSB2_MASK_CSR0H_FFLUSH;
556 				MUSB2_WRITE_1(sc, MUSB2_REG_TXCSRH, csrh);
557 				csr = MUSB2_READ_1(sc, MUSB2_REG_TXCSRL);
558 			}
559 		}
560 
561 		csr &= ~MUSB2_MASK_CSR0L_NAKTIMO;
562 		MUSB2_WRITE_1(sc, MUSB2_REG_TXCSRL, csr);
563 
564 		td->error = 1;
565 	}
566 
567 	if (td->error) {
568 		musbotg_channel_free(sc, td);
569 		return (0);
570 	}
571 
572 	/* Fifo is not empty and there is no NAK timeout */
573 	if (csr & MUSB2_MASK_CSR0L_TXPKTRDY)
574 		return (1);
575 
576 	/* check if we are complete */
577 	if (td->remainder == 0) {
578 		/* we are complete */
579 		musbotg_channel_free(sc, td);
580 		return (0);
581 	}
582 
583 	/* copy data into real buffer */
584 	usbd_copy_out(td->pc, 0, &req, sizeof(req));
585 
586 	/* send data */
587 	bus_space_write_multi_1(sc->sc_io_tag, sc->sc_io_hdl,
588 	    MUSB2_REG_EPFIFO(0), (void *)&req, sizeof(req));
589 
590 	/* update offset and remainder */
591 	td->offset += sizeof(req);
592 	td->remainder -= sizeof(req);
593 
594 
595 	MUSB2_WRITE_1(sc, MUSB2_REG_TXNAKLIMIT, MAX_NAK_TO);
596 	MUSB2_WRITE_1(sc, MUSB2_REG_TXFADDR(0), td->dev_addr);
597 	MUSB2_WRITE_1(sc, MUSB2_REG_TXHADDR(0), td->haddr);
598 	MUSB2_WRITE_1(sc, MUSB2_REG_TXHUBPORT(0), td->hport);
599 	MUSB2_WRITE_1(sc, MUSB2_REG_TXTI, td->transfer_type);
600 
601 	/* write command */
602 	MUSB2_WRITE_1(sc, MUSB2_REG_TXCSRL,
603 	    MUSB2_MASK_CSR0L_TXPKTRDY |
604 	    MUSB2_MASK_CSR0L_SETUPPKT);
605 
606 	/* Just to be consistent, not used above */
607 	td->transaction_started = 1;
608 
609 	return (1);			/* in progress */
610 }
611 
612 /* Control endpoint only data handling functions (RX/TX/SYNC) */
613 
614 static uint8_t
615 musbotg_dev_ctrl_data_rx(struct musbotg_td *td)
616 {
617 	struct usb_page_search buf_res;
618 	struct musbotg_softc *sc;
619 	uint16_t count;
620 	uint8_t csr;
621 	uint8_t got_short;
622 
623 	/* get pointer to softc */
624 	sc = MUSBOTG_PC2SC(td->pc);
625 
626 	/* select endpoint 0 */
627 	MUSB2_WRITE_1(sc, MUSB2_REG_EPINDEX, 0);
628 
629 	/* check if a command is pending */
630 	if (sc->sc_ep0_cmd) {
631 		MUSB2_WRITE_1(sc, MUSB2_REG_TXCSRL, sc->sc_ep0_cmd);
632 		sc->sc_ep0_cmd = 0;
633 	}
634 	/* read out FIFO status */
635 	csr = MUSB2_READ_1(sc, MUSB2_REG_TXCSRL);
636 
637 	DPRINTFN(4, "csr=0x%02x\n", csr);
638 
639 	got_short = 0;
640 
641 	if (csr & (MUSB2_MASK_CSR0L_SETUPEND |
642 	    MUSB2_MASK_CSR0L_SENTSTALL)) {
643 		if (td->remainder == 0) {
644 			/*
645 			 * We are actually complete and have
646 			 * received the next SETUP
647 			 */
648 			DPRINTFN(4, "faking complete\n");
649 			return (0);	/* complete */
650 		}
651 		/*
652 	         * USB Host Aborted the transfer.
653 	         */
654 		td->error = 1;
655 		return (0);		/* complete */
656 	}
657 	if (!(csr & MUSB2_MASK_CSR0L_RXPKTRDY)) {
658 		return (1);		/* not complete */
659 	}
660 	/* get the packet byte count */
661 	count = MUSB2_READ_2(sc, MUSB2_REG_RXCOUNT);
662 
663 	/* verify the packet byte count */
664 	if (count != td->max_frame_size) {
665 		if (count < td->max_frame_size) {
666 			/* we have a short packet */
667 			td->short_pkt = 1;
668 			got_short = 1;
669 		} else {
670 			/* invalid USB packet */
671 			td->error = 1;
672 			return (0);	/* we are complete */
673 		}
674 	}
675 	/* verify the packet byte count */
676 	if (count > td->remainder) {
677 		/* invalid USB packet */
678 		td->error = 1;
679 		return (0);		/* we are complete */
680 	}
681 	while (count > 0) {
682 		uint32_t temp;
683 
684 		usbd_get_page(td->pc, td->offset, &buf_res);
685 
686 		/* get correct length */
687 		if (buf_res.length > count) {
688 			buf_res.length = count;
689 		}
690 		/* check for unaligned memory address */
691 		if (USB_P2U(buf_res.buffer) & 3) {
692 
693 			temp = count & ~3;
694 
695 			if (temp) {
696 				/* receive data 4 bytes at a time */
697 				bus_space_read_multi_4(sc->sc_io_tag, sc->sc_io_hdl,
698 				    MUSB2_REG_EPFIFO(0), sc->sc_bounce_buf,
699 				    temp / 4);
700 			}
701 			temp = count & 3;
702 			if (temp) {
703 				/* receive data 1 byte at a time */
704 				bus_space_read_multi_1(sc->sc_io_tag, sc->sc_io_hdl,
705 				    MUSB2_REG_EPFIFO(0),
706 				    (void *)(&sc->sc_bounce_buf[count / 4]), temp);
707 			}
708 			usbd_copy_in(td->pc, td->offset,
709 			    sc->sc_bounce_buf, count);
710 
711 			/* update offset and remainder */
712 			td->offset += count;
713 			td->remainder -= count;
714 			break;
715 		}
716 		/* check if we can optimise */
717 		if (buf_res.length >= 4) {
718 
719 			/* receive data 4 bytes at a time */
720 			bus_space_read_multi_4(sc->sc_io_tag, sc->sc_io_hdl,
721 			    MUSB2_REG_EPFIFO(0), buf_res.buffer,
722 			    buf_res.length / 4);
723 
724 			temp = buf_res.length & ~3;
725 
726 			/* update counters */
727 			count -= temp;
728 			td->offset += temp;
729 			td->remainder -= temp;
730 			continue;
731 		}
732 		/* receive data */
733 		bus_space_read_multi_1(sc->sc_io_tag, sc->sc_io_hdl,
734 		    MUSB2_REG_EPFIFO(0), buf_res.buffer, buf_res.length);
735 
736 		/* update counters */
737 		count -= buf_res.length;
738 		td->offset += buf_res.length;
739 		td->remainder -= buf_res.length;
740 	}
741 
742 	/* check if we are complete */
743 	if ((td->remainder == 0) || got_short) {
744 		if (td->short_pkt) {
745 			/* we are complete */
746 			sc->sc_ep0_cmd = MUSB2_MASK_CSR0L_RXPKTRDY_CLR;
747 			return (0);
748 		}
749 		/* else need to receive a zero length packet */
750 	}
751 	/* write command - need more data */
752 	MUSB2_WRITE_1(sc, MUSB2_REG_TXCSRL,
753 	    MUSB2_MASK_CSR0L_RXPKTRDY_CLR);
754 	return (1);			/* not complete */
755 }
756 
757 static uint8_t
758 musbotg_dev_ctrl_data_tx(struct musbotg_td *td)
759 {
760 	struct usb_page_search buf_res;
761 	struct musbotg_softc *sc;
762 	uint16_t count;
763 	uint8_t csr;
764 
765 	/* get pointer to softc */
766 	sc = MUSBOTG_PC2SC(td->pc);
767 
768 	/* select endpoint 0 */
769 	MUSB2_WRITE_1(sc, MUSB2_REG_EPINDEX, 0);
770 
771 	/* check if a command is pending */
772 	if (sc->sc_ep0_cmd) {
773 		MUSB2_WRITE_1(sc, MUSB2_REG_TXCSRL, sc->sc_ep0_cmd);
774 		sc->sc_ep0_cmd = 0;
775 	}
776 	/* read out FIFO status */
777 	csr = MUSB2_READ_1(sc, MUSB2_REG_TXCSRL);
778 
779 	DPRINTFN(4, "csr=0x%02x\n", csr);
780 
781 	if (csr & (MUSB2_MASK_CSR0L_SETUPEND |
782 	    MUSB2_MASK_CSR0L_SENTSTALL)) {
783 		/*
784 	         * The current transfer was aborted
785 	         * by the USB Host
786 	         */
787 		td->error = 1;
788 		return (0);		/* complete */
789 	}
790 	if (csr & MUSB2_MASK_CSR0L_TXPKTRDY) {
791 		return (1);		/* not complete */
792 	}
793 	count = td->max_frame_size;
794 	if (td->remainder < count) {
795 		/* we have a short packet */
796 		td->short_pkt = 1;
797 		count = td->remainder;
798 	}
799 	while (count > 0) {
800 		uint32_t temp;
801 
802 		usbd_get_page(td->pc, td->offset, &buf_res);
803 
804 		/* get correct length */
805 		if (buf_res.length > count) {
806 			buf_res.length = count;
807 		}
808 		/* check for unaligned memory address */
809 		if (USB_P2U(buf_res.buffer) & 3) {
810 
811 			usbd_copy_out(td->pc, td->offset,
812 			    sc->sc_bounce_buf, count);
813 
814 			temp = count & ~3;
815 
816 			if (temp) {
817 				/* transmit data 4 bytes at a time */
818 				bus_space_write_multi_4(sc->sc_io_tag, sc->sc_io_hdl,
819 				    MUSB2_REG_EPFIFO(0), sc->sc_bounce_buf,
820 				    temp / 4);
821 			}
822 			temp = count & 3;
823 			if (temp) {
824 				/* receive data 1 byte at a time */
825 				bus_space_write_multi_1(sc->sc_io_tag, sc->sc_io_hdl,
826 				    MUSB2_REG_EPFIFO(0),
827 				    ((void *)&sc->sc_bounce_buf[count / 4]), temp);
828 			}
829 			/* update offset and remainder */
830 			td->offset += count;
831 			td->remainder -= count;
832 			break;
833 		}
834 		/* check if we can optimise */
835 		if (buf_res.length >= 4) {
836 
837 			/* transmit data 4 bytes at a time */
838 			bus_space_write_multi_4(sc->sc_io_tag, sc->sc_io_hdl,
839 			    MUSB2_REG_EPFIFO(0), buf_res.buffer,
840 			    buf_res.length / 4);
841 
842 			temp = buf_res.length & ~3;
843 
844 			/* update counters */
845 			count -= temp;
846 			td->offset += temp;
847 			td->remainder -= temp;
848 			continue;
849 		}
850 		/* transmit data */
851 		bus_space_write_multi_1(sc->sc_io_tag, sc->sc_io_hdl,
852 		    MUSB2_REG_EPFIFO(0), buf_res.buffer, buf_res.length);
853 
854 		/* update counters */
855 		count -= buf_res.length;
856 		td->offset += buf_res.length;
857 		td->remainder -= buf_res.length;
858 	}
859 
860 	/* check remainder */
861 	if (td->remainder == 0) {
862 		if (td->short_pkt) {
863 			sc->sc_ep0_cmd = MUSB2_MASK_CSR0L_TXPKTRDY;
864 			return (0);	/* complete */
865 		}
866 		/* else we need to transmit a short packet */
867 	}
868 	/* write command */
869 	MUSB2_WRITE_1(sc, MUSB2_REG_TXCSRL,
870 	    MUSB2_MASK_CSR0L_TXPKTRDY);
871 
872 	return (1);			/* not complete */
873 }
874 
875 static uint8_t
876 musbotg_host_ctrl_data_rx(struct musbotg_td *td)
877 {
878 	struct usb_page_search buf_res;
879 	struct musbotg_softc *sc;
880 	uint16_t count;
881 	uint8_t csr;
882 	uint8_t got_short;
883 
884 	/* get pointer to softc */
885 	sc = MUSBOTG_PC2SC(td->pc);
886 
887 	if (td->channel == -1)
888 		td->channel = musbotg_channel_alloc(sc, td, 0);
889 
890 	/* EP0 is busy, wait */
891 	if (td->channel == -1)
892 		return (1);
893 
894 	DPRINTFN(1, "ep_no=%d\n", td->channel);
895 
896 	/* select endpoint 0 */
897 	MUSB2_WRITE_1(sc, MUSB2_REG_EPINDEX, 0);
898 
899 	/* read out FIFO status */
900 	csr = MUSB2_READ_1(sc, MUSB2_REG_TXCSRL);
901 
902 	DPRINTFN(4, "csr=0x%02x\n", csr);
903 
904 	got_short = 0;
905 	if (!td->transaction_started) {
906 		td->transaction_started = 1;
907 
908 		MUSB2_WRITE_1(sc, MUSB2_REG_RXNAKLIMIT, MAX_NAK_TO);
909 
910 		MUSB2_WRITE_1(sc, MUSB2_REG_RXFADDR(0),
911 		    td->dev_addr);
912 		MUSB2_WRITE_1(sc, MUSB2_REG_RXHADDR(0), td->haddr);
913 		MUSB2_WRITE_1(sc, MUSB2_REG_RXHUBPORT(0), td->hport);
914 		MUSB2_WRITE_1(sc, MUSB2_REG_RXTI, td->transfer_type);
915 
916 		MUSB2_WRITE_1(sc, MUSB2_REG_TXCSRL,
917 		    MUSB2_MASK_CSR0L_REQPKT);
918 
919 		return (1);
920 	}
921 
922 	if (csr & MUSB2_MASK_CSR0L_NAKTIMO) {
923 		csr &= ~MUSB2_MASK_CSR0L_REQPKT;
924 		MUSB2_WRITE_1(sc, MUSB2_REG_TXCSRL, csr);
925 
926 		csr &= ~MUSB2_MASK_CSR0L_NAKTIMO;
927 		MUSB2_WRITE_1(sc, MUSB2_REG_TXCSRL, csr);
928 
929 		td->error = 1;
930 	}
931 
932 	/* Failed */
933 	if (csr & (MUSB2_MASK_CSR0L_RXSTALL |
934 	    MUSB2_MASK_CSR0L_ERROR))
935 	{
936 		/* Clear status bit */
937 		MUSB2_WRITE_1(sc, MUSB2_REG_TXCSRL, 0);
938 		DPRINTFN(1, "error bit set, csr=0x%02x\n", csr);
939 		td->error = 1;
940 	}
941 
942 	if (td->error) {
943 		musbotg_channel_free(sc, td);
944 		return (0);	/* we are complete */
945 	}
946 
947 	if (!(csr & MUSB2_MASK_CSR0L_RXPKTRDY))
948 		return (1); /* not yet */
949 
950 	/* get the packet byte count */
951 	count = MUSB2_READ_2(sc, MUSB2_REG_RXCOUNT);
952 
953 	/* verify the packet byte count */
954 	if (count != td->max_frame_size) {
955 		if (count < td->max_frame_size) {
956 			/* we have a short packet */
957 			td->short_pkt = 1;
958 			got_short = 1;
959 		} else {
960 			/* invalid USB packet */
961 			td->error = 1;
962 			musbotg_channel_free(sc, td);
963 			return (0);	/* we are complete */
964 		}
965 	}
966 	/* verify the packet byte count */
967 	if (count > td->remainder) {
968 		/* invalid USB packet */
969 		td->error = 1;
970 		musbotg_channel_free(sc, td);
971 		return (0);		/* we are complete */
972 	}
973 	while (count > 0) {
974 		uint32_t temp;
975 
976 		usbd_get_page(td->pc, td->offset, &buf_res);
977 
978 		/* get correct length */
979 		if (buf_res.length > count) {
980 			buf_res.length = count;
981 		}
982 		/* check for unaligned memory address */
983 		if (USB_P2U(buf_res.buffer) & 3) {
984 
985 			temp = count & ~3;
986 
987 			if (temp) {
988 				/* receive data 4 bytes at a time */
989 				bus_space_read_multi_4(sc->sc_io_tag, sc->sc_io_hdl,
990 				    MUSB2_REG_EPFIFO(0), sc->sc_bounce_buf,
991 				    temp / 4);
992 			}
993 			temp = count & 3;
994 			if (temp) {
995 				/* receive data 1 byte at a time */
996 				bus_space_read_multi_1(sc->sc_io_tag, sc->sc_io_hdl,
997 				    MUSB2_REG_EPFIFO(0),
998 				    (void *)(&sc->sc_bounce_buf[count / 4]), temp);
999 			}
1000 			usbd_copy_in(td->pc, td->offset,
1001 			    sc->sc_bounce_buf, count);
1002 
1003 			/* update offset and remainder */
1004 			td->offset += count;
1005 			td->remainder -= count;
1006 			break;
1007 		}
1008 		/* check if we can optimise */
1009 		if (buf_res.length >= 4) {
1010 
1011 			/* receive data 4 bytes at a time */
1012 			bus_space_read_multi_4(sc->sc_io_tag, sc->sc_io_hdl,
1013 			    MUSB2_REG_EPFIFO(0), buf_res.buffer,
1014 			    buf_res.length / 4);
1015 
1016 			temp = buf_res.length & ~3;
1017 
1018 			/* update counters */
1019 			count -= temp;
1020 			td->offset += temp;
1021 			td->remainder -= temp;
1022 			continue;
1023 		}
1024 		/* receive data */
1025 		bus_space_read_multi_1(sc->sc_io_tag, sc->sc_io_hdl,
1026 		    MUSB2_REG_EPFIFO(0), buf_res.buffer, buf_res.length);
1027 
1028 		/* update counters */
1029 		count -= buf_res.length;
1030 		td->offset += buf_res.length;
1031 		td->remainder -= buf_res.length;
1032 	}
1033 
1034 	csr &= ~MUSB2_MASK_CSR0L_RXPKTRDY;
1035 	MUSB2_WRITE_1(sc, MUSB2_REG_TXCSRL, csr);
1036 
1037 	/* check if we are complete */
1038 	if ((td->remainder == 0) || got_short) {
1039 		if (td->short_pkt) {
1040 			/* we are complete */
1041 
1042 			musbotg_channel_free(sc, td);
1043 			return (0);
1044 		}
1045 		/* else need to receive a zero length packet */
1046 	}
1047 
1048 	td->transaction_started = 1;
1049 	MUSB2_WRITE_1(sc, MUSB2_REG_TXCSRL,
1050 	    MUSB2_MASK_CSR0L_REQPKT);
1051 
1052 	return (1);			/* not complete */
1053 }
1054 
1055 static uint8_t
1056 musbotg_host_ctrl_data_tx(struct musbotg_td *td)
1057 {
1058 	struct usb_page_search buf_res;
1059 	struct musbotg_softc *sc;
1060 	uint16_t count;
1061 	uint8_t csr, csrh;
1062 
1063 	/* get pointer to softc */
1064 	sc = MUSBOTG_PC2SC(td->pc);
1065 
1066 	if (td->channel == -1)
1067 		td->channel = musbotg_channel_alloc(sc, td, 1);
1068 
1069 	/* No free EPs */
1070 	if (td->channel == -1)
1071 		return (1);
1072 
1073 	DPRINTFN(1, "ep_no=%d\n", td->channel);
1074 
1075 	/* select endpoint */
1076 	MUSB2_WRITE_1(sc, MUSB2_REG_EPINDEX, 0);
1077 
1078 	/* read out FIFO status */
1079 	csr = MUSB2_READ_1(sc, MUSB2_REG_TXCSRL);
1080 	DPRINTFN(4, "csr=0x%02x\n", csr);
1081 
1082 	if (csr & (MUSB2_MASK_CSR0L_RXSTALL |
1083 	    MUSB2_MASK_CSR0L_ERROR)) {
1084 		/* clear status bits */
1085 		MUSB2_WRITE_1(sc, MUSB2_REG_TXCSRL, 0);
1086 		td->error = 1;
1087 	}
1088 
1089 	if (csr & MUSB2_MASK_CSR0L_NAKTIMO ) {
1090 
1091 		if (csr & MUSB2_MASK_CSR0L_TXFIFONEMPTY) {
1092 			csrh = MUSB2_READ_1(sc, MUSB2_REG_TXCSRH);
1093 			csrh |= MUSB2_MASK_CSR0H_FFLUSH;
1094 			MUSB2_WRITE_1(sc, MUSB2_REG_TXCSRH, csrh);
1095 			csr = MUSB2_READ_1(sc, MUSB2_REG_TXCSRL);
1096 			if (csr & MUSB2_MASK_CSR0L_TXFIFONEMPTY) {
1097 				csrh = MUSB2_READ_1(sc, MUSB2_REG_TXCSRH);
1098 				csrh |= MUSB2_MASK_CSR0H_FFLUSH;
1099 				MUSB2_WRITE_1(sc, MUSB2_REG_TXCSRH, csrh);
1100 				csr = MUSB2_READ_1(sc, MUSB2_REG_TXCSRL);
1101 			}
1102 		}
1103 
1104 		csr &= ~MUSB2_MASK_CSR0L_NAKTIMO;
1105 		MUSB2_WRITE_1(sc, MUSB2_REG_TXCSRL, csr);
1106 
1107 		td->error = 1;
1108 	}
1109 
1110 
1111 	if (td->error) {
1112 		musbotg_channel_free(sc, td);
1113 		return (0);	/* complete */
1114 	}
1115 
1116 	/*
1117 	 * Wait while FIFO is empty.
1118 	 * Do not flush it because it will cause transactions
1119 	 * with size more then packet size. It might upset
1120 	 * some devices
1121 	 */
1122 	if (csr & MUSB2_MASK_CSR0L_TXFIFONEMPTY)
1123 		return (1);
1124 
1125 	/* Packet still being processed */
1126 	if (csr & MUSB2_MASK_CSR0L_TXPKTRDY)
1127 		return (1);
1128 
1129 	if (td->transaction_started) {
1130 		/* check remainder */
1131 		if (td->remainder == 0) {
1132 			if (td->short_pkt) {
1133 				musbotg_channel_free(sc, td);
1134 				return (0);	/* complete */
1135 			}
1136 			/* else we need to transmit a short packet */
1137 		}
1138 
1139 		/* We're not complete - more transactions required */
1140 		td->transaction_started = 0;
1141 	}
1142 
1143 	/* check for short packet */
1144 	count = td->max_frame_size;
1145 	if (td->remainder < count) {
1146 		/* we have a short packet */
1147 		td->short_pkt = 1;
1148 		count = td->remainder;
1149 	}
1150 
1151 	while (count > 0) {
1152 		uint32_t temp;
1153 
1154 		usbd_get_page(td->pc, td->offset, &buf_res);
1155 
1156 		/* get correct length */
1157 		if (buf_res.length > count) {
1158 			buf_res.length = count;
1159 		}
1160 		/* check for unaligned memory address */
1161 		if (USB_P2U(buf_res.buffer) & 3) {
1162 
1163 			usbd_copy_out(td->pc, td->offset,
1164 			    sc->sc_bounce_buf, count);
1165 
1166 			temp = count & ~3;
1167 
1168 			if (temp) {
1169 				/* transmit data 4 bytes at a time */
1170 				bus_space_write_multi_4(sc->sc_io_tag,
1171 				    sc->sc_io_hdl, MUSB2_REG_EPFIFO(0),
1172 				    sc->sc_bounce_buf, temp / 4);
1173 			}
1174 			temp = count & 3;
1175 			if (temp) {
1176 				/* receive data 1 byte at a time */
1177 				bus_space_write_multi_1(sc->sc_io_tag, sc->sc_io_hdl,
1178 				    MUSB2_REG_EPFIFO(0),
1179 				    ((void *)&sc->sc_bounce_buf[count / 4]), temp);
1180 			}
1181 			/* update offset and remainder */
1182 			td->offset += count;
1183 			td->remainder -= count;
1184 			break;
1185 		}
1186 		/* check if we can optimise */
1187 		if (buf_res.length >= 4) {
1188 
1189 			/* transmit data 4 bytes at a time */
1190 			bus_space_write_multi_4(sc->sc_io_tag, sc->sc_io_hdl,
1191 			    MUSB2_REG_EPFIFO(0), buf_res.buffer,
1192 			    buf_res.length / 4);
1193 
1194 			temp = buf_res.length & ~3;
1195 
1196 			/* update counters */
1197 			count -= temp;
1198 			td->offset += temp;
1199 			td->remainder -= temp;
1200 			continue;
1201 		}
1202 		/* transmit data */
1203 		bus_space_write_multi_1(sc->sc_io_tag, sc->sc_io_hdl,
1204 		    MUSB2_REG_EPFIFO(0), buf_res.buffer,
1205 		    buf_res.length);
1206 
1207 		/* update counters */
1208 		count -= buf_res.length;
1209 		td->offset += buf_res.length;
1210 		td->remainder -= buf_res.length;
1211 	}
1212 
1213 	/* Function address */
1214 	MUSB2_WRITE_1(sc, MUSB2_REG_TXFADDR(0), td->dev_addr);
1215 	MUSB2_WRITE_1(sc, MUSB2_REG_TXHADDR(0), td->haddr);
1216 	MUSB2_WRITE_1(sc, MUSB2_REG_TXHUBPORT(0), td->hport);
1217 	MUSB2_WRITE_1(sc, MUSB2_REG_TXTI, td->transfer_type);
1218 
1219 	/* TX NAK timeout */
1220 	MUSB2_WRITE_1(sc, MUSB2_REG_TXNAKLIMIT, MAX_NAK_TO);
1221 
1222 	/* write command */
1223 	MUSB2_WRITE_1(sc, MUSB2_REG_TXCSRL,
1224 	    MUSB2_MASK_CSR0L_TXPKTRDY);
1225 
1226 	td->transaction_started = 1;
1227 
1228 	return (1);			/* not complete */
1229 }
1230 
1231 static uint8_t
1232 musbotg_dev_ctrl_status(struct musbotg_td *td)
1233 {
1234 	struct musbotg_softc *sc;
1235 	uint8_t csr;
1236 
1237 	/* get pointer to softc */
1238 	sc = MUSBOTG_PC2SC(td->pc);
1239 
1240 	/* select endpoint 0 */
1241 	MUSB2_WRITE_1(sc, MUSB2_REG_EPINDEX, 0);
1242 
1243 	if (sc->sc_ep0_busy) {
1244 		sc->sc_ep0_busy = 0;
1245 		sc->sc_ep0_cmd |= MUSB2_MASK_CSR0L_DATAEND;
1246 		MUSB2_WRITE_1(sc, MUSB2_REG_TXCSRL, sc->sc_ep0_cmd);
1247 		sc->sc_ep0_cmd = 0;
1248 	}
1249 	/* read out FIFO status */
1250 	csr = MUSB2_READ_1(sc, MUSB2_REG_TXCSRL);
1251 
1252 	DPRINTFN(4, "csr=0x%02x\n", csr);
1253 
1254 	if (csr & MUSB2_MASK_CSR0L_DATAEND) {
1255 		/* wait for interrupt */
1256 		return (1);		/* not complete */
1257 	}
1258 	if (sc->sc_dv_addr != 0xFF) {
1259 		/* write function address */
1260 		musbotg_set_address(sc, sc->sc_dv_addr);
1261 	}
1262 
1263 	musbotg_channel_free(sc, td);
1264 	return (0);			/* complete */
1265 }
1266 
1267 static uint8_t
1268 musbotg_host_ctrl_status_rx(struct musbotg_td *td)
1269 {
1270 	struct musbotg_softc *sc;
1271 	uint8_t csr, csrh;
1272 
1273 	/* get pointer to softc */
1274 	sc = MUSBOTG_PC2SC(td->pc);
1275 
1276 	if (td->channel == -1)
1277 		td->channel = musbotg_channel_alloc(sc, td, 0);
1278 
1279 	/* EP0 is busy, wait */
1280 	if (td->channel == -1)
1281 		return (1);
1282 
1283 	DPRINTFN(1, "ep_no=%d\n", td->channel);
1284 
1285 	/* select endpoint 0 */
1286 	MUSB2_WRITE_1(sc, MUSB2_REG_EPINDEX, 0);
1287 
1288 	if (!td->transaction_started) {
1289 		MUSB2_WRITE_1(sc, MUSB2_REG_RXFADDR(0),
1290 		    td->dev_addr);
1291 
1292 		MUSB2_WRITE_1(sc, MUSB2_REG_RXHADDR(0), td->haddr);
1293 		MUSB2_WRITE_1(sc, MUSB2_REG_RXHUBPORT(0), td->hport);
1294 		MUSB2_WRITE_1(sc, MUSB2_REG_RXTI, td->transfer_type);
1295 
1296 		/* RX NAK timeout */
1297 		MUSB2_WRITE_1(sc, MUSB2_REG_RXNAKLIMIT, MAX_NAK_TO);
1298 
1299 		td->transaction_started = 1;
1300 
1301 		/* Disable PING */
1302 		csrh = MUSB2_READ_1(sc, MUSB2_REG_RXCSRH);
1303 		csrh |= MUSB2_MASK_CSR0H_PING_DIS;
1304 		MUSB2_WRITE_1(sc, MUSB2_REG_RXCSRH, csrh);
1305 
1306 		/* write command */
1307 		MUSB2_WRITE_1(sc, MUSB2_REG_TXCSRL,
1308 		    MUSB2_MASK_CSR0L_STATUSPKT |
1309 		    MUSB2_MASK_CSR0L_REQPKT);
1310 
1311 		return (1); /* Just started */
1312 
1313 	}
1314 
1315 	csr = MUSB2_READ_1(sc, MUSB2_REG_TXCSRL);
1316 
1317 	DPRINTFN(4, "IN STATUS csr=0x%02x\n", csr);
1318 
1319 	if (csr & MUSB2_MASK_CSR0L_RXPKTRDY) {
1320 		MUSB2_WRITE_1(sc, MUSB2_REG_TXCSRL,
1321 		    MUSB2_MASK_CSR0L_RXPKTRDY_CLR);
1322 		musbotg_channel_free(sc, td);
1323 		return (0); /* complete */
1324 	}
1325 
1326 	if (csr & MUSB2_MASK_CSR0L_NAKTIMO) {
1327 		csr &= ~ (MUSB2_MASK_CSR0L_STATUSPKT |
1328 		    MUSB2_MASK_CSR0L_REQPKT);
1329 		MUSB2_WRITE_1(sc, MUSB2_REG_TXCSRL, csr);
1330 
1331 		csr &= ~MUSB2_MASK_CSR0L_NAKTIMO;
1332 		MUSB2_WRITE_1(sc, MUSB2_REG_TXCSRL, csr);
1333 		td->error = 1;
1334 	}
1335 
1336 	/* Failed */
1337 	if (csr & (MUSB2_MASK_CSR0L_RXSTALL |
1338 	    MUSB2_MASK_CSR0L_ERROR))
1339 	{
1340 		/* Clear status bit */
1341 		MUSB2_WRITE_1(sc, MUSB2_REG_TXCSRL, 0);
1342 		DPRINTFN(1, "error bit set, csr=0x%02x\n", csr);
1343 		td->error = 1;
1344 	}
1345 
1346 	if (td->error) {
1347 		musbotg_channel_free(sc, td);
1348 		return (0);
1349 	}
1350 
1351 	return (1);			/* Not ready yet */
1352 }
1353 
1354 static uint8_t
1355 musbotg_host_ctrl_status_tx(struct musbotg_td *td)
1356 {
1357 	struct musbotg_softc *sc;
1358 	uint8_t csr;
1359 
1360 	/* get pointer to softc */
1361 	sc = MUSBOTG_PC2SC(td->pc);
1362 
1363 	if (td->channel == -1)
1364 		td->channel = musbotg_channel_alloc(sc, td, 1);
1365 
1366 	/* EP0 is busy, wait */
1367 	if (td->channel == -1)
1368 		return (1);
1369 
1370 	DPRINTFN(1, "ep_no=%d/%d [%d@%d.%d/%02x]\n", td->channel, td->transaction_started,
1371 			td->dev_addr,td->haddr,td->hport, td->transfer_type);
1372 
1373 	/* select endpoint 0 */
1374 	MUSB2_WRITE_1(sc, MUSB2_REG_EPINDEX, 0);
1375 
1376 	csr = MUSB2_READ_1(sc, MUSB2_REG_TXCSRL);
1377 	DPRINTFN(4, "csr=0x%02x\n", csr);
1378 
1379 	/* Not yet */
1380 	if (csr & MUSB2_MASK_CSR0L_TXPKTRDY)
1381 		return (1);
1382 
1383 	/* Failed */
1384 	if (csr & (MUSB2_MASK_CSR0L_RXSTALL |
1385 	    MUSB2_MASK_CSR0L_ERROR))
1386 	{
1387 		/* Clear status bit */
1388 		MUSB2_WRITE_1(sc, MUSB2_REG_TXCSRL, 0);
1389 		DPRINTFN(1, "error bit set, csr=0x%02x\n", csr);
1390 		td->error = 1;
1391 		musbotg_channel_free(sc, td);
1392 		return (0); /* complete */
1393 	}
1394 
1395 	if (td->transaction_started) {
1396 		musbotg_channel_free(sc, td);
1397 		return (0); /* complete */
1398 	}
1399 
1400 	MUSB2_WRITE_1(sc, MUSB2_REG_RXCSRH, MUSB2_MASK_CSR0H_PING_DIS);
1401 
1402 	MUSB2_WRITE_1(sc, MUSB2_REG_TXFADDR(0), td->dev_addr);
1403 	MUSB2_WRITE_1(sc, MUSB2_REG_TXHADDR(0), td->haddr);
1404 	MUSB2_WRITE_1(sc, MUSB2_REG_TXHUBPORT(0), td->hport);
1405 	MUSB2_WRITE_1(sc, MUSB2_REG_TXTI, td->transfer_type);
1406 
1407 	/* TX NAK timeout */
1408 	MUSB2_WRITE_1(sc, MUSB2_REG_TXNAKLIMIT, MAX_NAK_TO);
1409 
1410 	td->transaction_started = 1;
1411 
1412 	/* write command */
1413 	MUSB2_WRITE_1(sc, MUSB2_REG_TXCSRL,
1414 	    MUSB2_MASK_CSR0L_STATUSPKT |
1415 	    MUSB2_MASK_CSR0L_TXPKTRDY);
1416 
1417 	return (1);			/* wait for interrupt */
1418 }
1419 
1420 static uint8_t
1421 musbotg_dev_data_rx(struct musbotg_td *td)
1422 {
1423 	struct usb_page_search buf_res;
1424 	struct musbotg_softc *sc;
1425 	uint16_t count;
1426 	uint8_t csr;
1427 	uint8_t to;
1428 	uint8_t got_short;
1429 
1430 	to = 8;				/* don't loop forever! */
1431 	got_short = 0;
1432 
1433 	/* get pointer to softc */
1434 	sc = MUSBOTG_PC2SC(td->pc);
1435 
1436 	if (td->channel == -1)
1437 		td->channel = musbotg_channel_alloc(sc, td, 0);
1438 
1439 	/* EP0 is busy, wait */
1440 	if (td->channel == -1)
1441 		return (1);
1442 
1443 	/* select endpoint */
1444 	MUSB2_WRITE_1(sc, MUSB2_REG_EPINDEX, td->channel);
1445 
1446 repeat:
1447 	/* read out FIFO status */
1448 	csr = MUSB2_READ_1(sc, MUSB2_REG_RXCSRL);
1449 
1450 	DPRINTFN(4, "csr=0x%02x\n", csr);
1451 
1452 	/* clear overrun */
1453 	if (csr & MUSB2_MASK_CSRL_RXOVERRUN) {
1454 		/* make sure we don't clear "RXPKTRDY" */
1455 		MUSB2_WRITE_1(sc, MUSB2_REG_RXCSRL,
1456 		    MUSB2_MASK_CSRL_RXPKTRDY);
1457 	}
1458 
1459 	/* check status */
1460 	if (!(csr & MUSB2_MASK_CSRL_RXPKTRDY))
1461 		return (1); /* not complete */
1462 
1463 	/* get the packet byte count */
1464 	count = MUSB2_READ_2(sc, MUSB2_REG_RXCOUNT);
1465 
1466 	DPRINTFN(4, "count=0x%04x\n", count);
1467 
1468 	/*
1469 	 * Check for short or invalid packet:
1470 	 */
1471 	if (count != td->max_frame_size) {
1472 		if (count < td->max_frame_size) {
1473 			/* we have a short packet */
1474 			td->short_pkt = 1;
1475 			got_short = 1;
1476 		} else {
1477 			/* invalid USB packet */
1478 			td->error = 1;
1479 			musbotg_channel_free(sc, td);
1480 			return (0);	/* we are complete */
1481 		}
1482 	}
1483 	/* verify the packet byte count */
1484 	if (count > td->remainder) {
1485 		/* invalid USB packet */
1486 		td->error = 1;
1487 		musbotg_channel_free(sc, td);
1488 		return (0);		/* we are complete */
1489 	}
1490 	while (count > 0) {
1491 		uint32_t temp;
1492 
1493 		usbd_get_page(td->pc, td->offset, &buf_res);
1494 
1495 		/* get correct length */
1496 		if (buf_res.length > count) {
1497 			buf_res.length = count;
1498 		}
1499 		/* check for unaligned memory address */
1500 		if (USB_P2U(buf_res.buffer) & 3) {
1501 
1502 			temp = count & ~3;
1503 
1504 			if (temp) {
1505 				/* receive data 4 bytes at a time */
1506 				bus_space_read_multi_4(sc->sc_io_tag, sc->sc_io_hdl,
1507 				    MUSB2_REG_EPFIFO(td->channel), sc->sc_bounce_buf,
1508 				    temp / 4);
1509 			}
1510 			temp = count & 3;
1511 			if (temp) {
1512 				/* receive data 1 byte at a time */
1513 				bus_space_read_multi_1(sc->sc_io_tag,
1514 				    sc->sc_io_hdl, MUSB2_REG_EPFIFO(td->channel),
1515 				    ((void *)&sc->sc_bounce_buf[count / 4]), temp);
1516 			}
1517 			usbd_copy_in(td->pc, td->offset,
1518 			    sc->sc_bounce_buf, count);
1519 
1520 			/* update offset and remainder */
1521 			td->offset += count;
1522 			td->remainder -= count;
1523 			break;
1524 		}
1525 		/* check if we can optimise */
1526 		if (buf_res.length >= 4) {
1527 
1528 			/* receive data 4 bytes at a time */
1529 			bus_space_read_multi_4(sc->sc_io_tag, sc->sc_io_hdl,
1530 			    MUSB2_REG_EPFIFO(td->channel), buf_res.buffer,
1531 			    buf_res.length / 4);
1532 
1533 			temp = buf_res.length & ~3;
1534 
1535 			/* update counters */
1536 			count -= temp;
1537 			td->offset += temp;
1538 			td->remainder -= temp;
1539 			continue;
1540 		}
1541 		/* receive data */
1542 		bus_space_read_multi_1(sc->sc_io_tag, sc->sc_io_hdl,
1543 		    MUSB2_REG_EPFIFO(td->channel), buf_res.buffer,
1544 		    buf_res.length);
1545 
1546 		/* update counters */
1547 		count -= buf_res.length;
1548 		td->offset += buf_res.length;
1549 		td->remainder -= buf_res.length;
1550 	}
1551 
1552 	/* clear status bits */
1553 	MUSB2_WRITE_1(sc, MUSB2_REG_RXCSRL, 0);
1554 
1555 	/* check if we are complete */
1556 	if ((td->remainder == 0) || got_short) {
1557 		if (td->short_pkt) {
1558 			/* we are complete */
1559 			musbotg_channel_free(sc, td);
1560 			return (0);
1561 		}
1562 		/* else need to receive a zero length packet */
1563 	}
1564 	if (--to) {
1565 		goto repeat;
1566 	}
1567 	return (1);			/* not complete */
1568 }
1569 
1570 static uint8_t
1571 musbotg_dev_data_tx(struct musbotg_td *td)
1572 {
1573 	struct usb_page_search buf_res;
1574 	struct musbotg_softc *sc;
1575 	uint16_t count;
1576 	uint8_t csr;
1577 	uint8_t to;
1578 
1579 	to = 8;				/* don't loop forever! */
1580 
1581 	/* get pointer to softc */
1582 	sc = MUSBOTG_PC2SC(td->pc);
1583 
1584 	if (td->channel == -1)
1585 		td->channel = musbotg_channel_alloc(sc, td, 1);
1586 
1587 	/* EP0 is busy, wait */
1588 	if (td->channel == -1)
1589 		return (1);
1590 
1591 	/* select endpoint */
1592 	MUSB2_WRITE_1(sc, MUSB2_REG_EPINDEX, td->channel);
1593 
1594 repeat:
1595 
1596 	/* read out FIFO status */
1597 	csr = MUSB2_READ_1(sc, MUSB2_REG_TXCSRL);
1598 
1599 	DPRINTFN(4, "csr=0x%02x\n", csr);
1600 
1601 	if (csr & (MUSB2_MASK_CSRL_TXINCOMP |
1602 	    MUSB2_MASK_CSRL_TXUNDERRUN)) {
1603 		/* clear status bits */
1604 		MUSB2_WRITE_1(sc, MUSB2_REG_TXCSRL, 0);
1605 	}
1606 	if (csr & MUSB2_MASK_CSRL_TXPKTRDY) {
1607 		return (1);		/* not complete */
1608 	}
1609 	/* check for short packet */
1610 	count = td->max_frame_size;
1611 	if (td->remainder < count) {
1612 		/* we have a short packet */
1613 		td->short_pkt = 1;
1614 		count = td->remainder;
1615 	}
1616 	while (count > 0) {
1617 		uint32_t temp;
1618 
1619 		usbd_get_page(td->pc, td->offset, &buf_res);
1620 
1621 		/* get correct length */
1622 		if (buf_res.length > count) {
1623 			buf_res.length = count;
1624 		}
1625 		/* check for unaligned memory address */
1626 		if (USB_P2U(buf_res.buffer) & 3) {
1627 
1628 			usbd_copy_out(td->pc, td->offset,
1629 			    sc->sc_bounce_buf, count);
1630 
1631 			temp = count & ~3;
1632 
1633 			if (temp) {
1634 				/* transmit data 4 bytes at a time */
1635 				bus_space_write_multi_4(sc->sc_io_tag,
1636 				    sc->sc_io_hdl, MUSB2_REG_EPFIFO(td->channel),
1637 				    sc->sc_bounce_buf, temp / 4);
1638 			}
1639 			temp = count & 3;
1640 			if (temp) {
1641 				/* receive data 1 byte at a time */
1642 				bus_space_write_multi_1(sc->sc_io_tag, sc->sc_io_hdl,
1643 				    MUSB2_REG_EPFIFO(td->channel),
1644 				    ((void *)&sc->sc_bounce_buf[count / 4]), temp);
1645 			}
1646 			/* update offset and remainder */
1647 			td->offset += count;
1648 			td->remainder -= count;
1649 			break;
1650 		}
1651 		/* check if we can optimise */
1652 		if (buf_res.length >= 4) {
1653 
1654 			/* transmit data 4 bytes at a time */
1655 			bus_space_write_multi_4(sc->sc_io_tag, sc->sc_io_hdl,
1656 			    MUSB2_REG_EPFIFO(td->channel), buf_res.buffer,
1657 			    buf_res.length / 4);
1658 
1659 			temp = buf_res.length & ~3;
1660 
1661 			/* update counters */
1662 			count -= temp;
1663 			td->offset += temp;
1664 			td->remainder -= temp;
1665 			continue;
1666 		}
1667 		/* transmit data */
1668 		bus_space_write_multi_1(sc->sc_io_tag, sc->sc_io_hdl,
1669 		    MUSB2_REG_EPFIFO(td->channel), buf_res.buffer,
1670 		    buf_res.length);
1671 
1672 		/* update counters */
1673 		count -= buf_res.length;
1674 		td->offset += buf_res.length;
1675 		td->remainder -= buf_res.length;
1676 	}
1677 
1678 	/* Max packet size */
1679 	MUSB2_WRITE_2(sc, MUSB2_REG_TXMAXP, td->reg_max_packet);
1680 
1681 	/* write command */
1682 	MUSB2_WRITE_1(sc, MUSB2_REG_TXCSRL,
1683 	    MUSB2_MASK_CSRL_TXPKTRDY);
1684 
1685 	/* check remainder */
1686 	if (td->remainder == 0) {
1687 		if (td->short_pkt) {
1688 			musbotg_channel_free(sc, td);
1689 			return (0);	/* complete */
1690 		}
1691 		/* else we need to transmit a short packet */
1692 	}
1693 	if (--to) {
1694 		goto repeat;
1695 	}
1696 	return (1);			/* not complete */
1697 }
1698 
1699 static uint8_t
1700 musbotg_host_data_rx(struct musbotg_td *td)
1701 {
1702 	struct usb_page_search buf_res;
1703 	struct musbotg_softc *sc;
1704 	uint16_t count;
1705 	uint8_t csr, csrh;
1706 	uint8_t to;
1707 	uint8_t got_short;
1708 
1709 	/* get pointer to softc */
1710 	sc = MUSBOTG_PC2SC(td->pc);
1711 
1712 	if (td->channel == -1)
1713 		td->channel = musbotg_channel_alloc(sc, td, 0);
1714 
1715 	/* No free EPs */
1716 	if (td->channel == -1)
1717 		return (1);
1718 
1719 	DPRINTFN(1, "ep_no=%d\n", td->channel);
1720 
1721 	to = 8;				/* don't loop forever! */
1722 	got_short = 0;
1723 
1724 	/* select endpoint */
1725 	MUSB2_WRITE_1(sc, MUSB2_REG_EPINDEX, td->channel);
1726 
1727 repeat:
1728 	/* read out FIFO status */
1729 	csr = MUSB2_READ_1(sc, MUSB2_REG_RXCSRL);
1730 	DPRINTFN(4, "csr=0x%02x\n", csr);
1731 
1732 	if (!td->transaction_started) {
1733 		/* Function address */
1734 		MUSB2_WRITE_1(sc, MUSB2_REG_RXFADDR(td->channel),
1735 		    td->dev_addr);
1736 
1737 		/* SPLIT transaction */
1738 		MUSB2_WRITE_1(sc, MUSB2_REG_RXHADDR(td->channel),
1739 		    td->haddr);
1740 		MUSB2_WRITE_1(sc, MUSB2_REG_RXHUBPORT(td->channel),
1741 		    td->hport);
1742 
1743 		/* RX NAK timeout */
1744 		if (td->transfer_type & MUSB2_MASK_TI_PROTO_ISOC)
1745 			MUSB2_WRITE_1(sc, MUSB2_REG_RXNAKLIMIT, 0);
1746 		else
1747 			MUSB2_WRITE_1(sc, MUSB2_REG_RXNAKLIMIT, MAX_NAK_TO);
1748 
1749 		/* Protocol, speed, device endpoint */
1750 		MUSB2_WRITE_1(sc, MUSB2_REG_RXTI, td->transfer_type);
1751 
1752 		/* Max packet size */
1753 		MUSB2_WRITE_2(sc, MUSB2_REG_RXMAXP, td->reg_max_packet);
1754 
1755 		/* Data Toggle */
1756 		csrh = MUSB2_READ_1(sc, MUSB2_REG_RXCSRH);
1757 		DPRINTFN(4, "csrh=0x%02x\n", csrh);
1758 
1759 		csrh |= MUSB2_MASK_CSRH_RXDT_WREN;
1760 		if (td->toggle)
1761 			csrh |= MUSB2_MASK_CSRH_RXDT_VAL;
1762 		else
1763 			csrh &= ~MUSB2_MASK_CSRH_RXDT_VAL;
1764 
1765 		/* Set data toggle */
1766 		MUSB2_WRITE_1(sc, MUSB2_REG_RXCSRH, csrh);
1767 
1768 		/* write command */
1769 		MUSB2_WRITE_1(sc, MUSB2_REG_RXCSRL,
1770 		    MUSB2_MASK_CSRL_RXREQPKT);
1771 
1772 		td->transaction_started = 1;
1773 		return (1);
1774 	}
1775 
1776 	/* clear NAK timeout */
1777 	if (csr & MUSB2_MASK_CSRL_RXNAKTO) {
1778 		DPRINTFN(4, "NAK Timeout\n");
1779 		if (csr & MUSB2_MASK_CSRL_RXREQPKT) {
1780 			csr &= ~MUSB2_MASK_CSRL_RXREQPKT;
1781 			MUSB2_WRITE_1(sc, MUSB2_REG_RXCSRL, csr);
1782 
1783 			csr &= ~MUSB2_MASK_CSRL_RXNAKTO;
1784 			MUSB2_WRITE_1(sc, MUSB2_REG_RXCSRL, csr);
1785 		}
1786 
1787 		td->error = 1;
1788 	}
1789 
1790 	if (csr & MUSB2_MASK_CSRL_RXERROR) {
1791 		DPRINTFN(4, "RXERROR\n");
1792 		td->error = 1;
1793 	}
1794 
1795 	if (csr & MUSB2_MASK_CSRL_RXSTALL) {
1796 		DPRINTFN(4, "RXSTALL\n");
1797 		td->error = 1;
1798 	}
1799 
1800 	if (td->error) {
1801 		musbotg_channel_free(sc, td);
1802 		return (0);	/* we are complete */
1803 	}
1804 
1805 	if (!(csr & MUSB2_MASK_CSRL_RXPKTRDY)) {
1806 		/* No data available yet */
1807 		return (1);
1808 	}
1809 
1810 	td->toggle ^= 1;
1811 	/* get the packet byte count */
1812 	count = MUSB2_READ_2(sc, MUSB2_REG_RXCOUNT);
1813 	DPRINTFN(4, "count=0x%04x\n", count);
1814 
1815 	/*
1816 	 * Check for short or invalid packet:
1817 	 */
1818 	if (count != td->max_frame_size) {
1819 		if (count < td->max_frame_size) {
1820 			/* we have a short packet */
1821 			td->short_pkt = 1;
1822 			got_short = 1;
1823 		} else {
1824 			/* invalid USB packet */
1825 			td->error = 1;
1826 			musbotg_channel_free(sc, td);
1827 			return (0);	/* we are complete */
1828 		}
1829 	}
1830 
1831 	/* verify the packet byte count */
1832 	if (count > td->remainder) {
1833 		/* invalid USB packet */
1834 		td->error = 1;
1835 		musbotg_channel_free(sc, td);
1836 		return (0);		/* we are complete */
1837 	}
1838 
1839 	while (count > 0) {
1840 		uint32_t temp;
1841 
1842 		usbd_get_page(td->pc, td->offset, &buf_res);
1843 
1844 		/* get correct length */
1845 		if (buf_res.length > count) {
1846 			buf_res.length = count;
1847 		}
1848 		/* check for unaligned memory address */
1849 		if (USB_P2U(buf_res.buffer) & 3) {
1850 
1851 			temp = count & ~3;
1852 
1853 			if (temp) {
1854 				/* receive data 4 bytes at a time */
1855 				bus_space_read_multi_4(sc->sc_io_tag, sc->sc_io_hdl,
1856 				    MUSB2_REG_EPFIFO(td->channel), sc->sc_bounce_buf,
1857 				    temp / 4);
1858 			}
1859 			temp = count & 3;
1860 			if (temp) {
1861 				/* receive data 1 byte at a time */
1862 				bus_space_read_multi_1(sc->sc_io_tag,
1863 				    sc->sc_io_hdl, MUSB2_REG_EPFIFO(td->channel),
1864 				    ((void *)&sc->sc_bounce_buf[count / 4]), temp);
1865 			}
1866 			usbd_copy_in(td->pc, td->offset,
1867 			    sc->sc_bounce_buf, count);
1868 
1869 			/* update offset and remainder */
1870 			td->offset += count;
1871 			td->remainder -= count;
1872 			break;
1873 		}
1874 		/* check if we can optimise */
1875 		if (buf_res.length >= 4) {
1876 
1877 			/* receive data 4 bytes at a time */
1878 			bus_space_read_multi_4(sc->sc_io_tag, sc->sc_io_hdl,
1879 			    MUSB2_REG_EPFIFO(td->channel), buf_res.buffer,
1880 			    buf_res.length / 4);
1881 
1882 			temp = buf_res.length & ~3;
1883 
1884 			/* update counters */
1885 			count -= temp;
1886 			td->offset += temp;
1887 			td->remainder -= temp;
1888 			continue;
1889 		}
1890 		/* receive data */
1891 		bus_space_read_multi_1(sc->sc_io_tag, sc->sc_io_hdl,
1892 		    MUSB2_REG_EPFIFO(td->channel), buf_res.buffer,
1893 		    buf_res.length);
1894 
1895 		/* update counters */
1896 		count -= buf_res.length;
1897 		td->offset += buf_res.length;
1898 		td->remainder -= buf_res.length;
1899 	}
1900 
1901 	/* clear status bits */
1902 	MUSB2_WRITE_1(sc, MUSB2_REG_RXCSRL, 0);
1903 
1904 	/* check if we are complete */
1905 	if ((td->remainder == 0) || got_short) {
1906 		if (td->short_pkt) {
1907 			/* we are complete */
1908 			musbotg_channel_free(sc, td);
1909 			return (0);
1910 		}
1911 		/* else need to receive a zero length packet */
1912 	}
1913 
1914 	/* Reset transaction state and restart */
1915 	td->transaction_started = 0;
1916 
1917 	if (--to)
1918 		goto repeat;
1919 
1920 	return (1);			/* not complete */
1921 }
1922 
1923 static uint8_t
1924 musbotg_host_data_tx(struct musbotg_td *td)
1925 {
1926 	struct usb_page_search buf_res;
1927 	struct musbotg_softc *sc;
1928 	uint16_t count;
1929 	uint8_t csr, csrh;
1930 
1931 	/* get pointer to softc */
1932 	sc = MUSBOTG_PC2SC(td->pc);
1933 
1934 	if (td->channel == -1)
1935 		td->channel = musbotg_channel_alloc(sc, td, 1);
1936 
1937 	/* No free EPs */
1938 	if (td->channel == -1)
1939 		return (1);
1940 
1941 	DPRINTFN(1, "ep_no=%d\n", td->channel);
1942 
1943 	/* select endpoint */
1944 	MUSB2_WRITE_1(sc, MUSB2_REG_EPINDEX, td->channel);
1945 
1946 	/* read out FIFO status */
1947 	csr = MUSB2_READ_1(sc, MUSB2_REG_TXCSRL);
1948 	DPRINTFN(4, "csr=0x%02x\n", csr);
1949 
1950 	if (csr & (MUSB2_MASK_CSRL_TXSTALLED |
1951 	    MUSB2_MASK_CSRL_TXERROR)) {
1952 		/* clear status bits */
1953 		MUSB2_WRITE_1(sc, MUSB2_REG_TXCSRL, 0);
1954 		td->error = 1;
1955 		musbotg_channel_free(sc, td);
1956 		return (0);	/* complete */
1957 	}
1958 
1959 	if (csr & MUSB2_MASK_CSRL_TXNAKTO) {
1960 		/*
1961 		 * Flush TX FIFO before clearing NAK TO
1962 		 */
1963 		if (csr & MUSB2_MASK_CSRL_TXFIFONEMPTY) {
1964 			csr |= MUSB2_MASK_CSRL_TXFFLUSH;
1965 			MUSB2_WRITE_1(sc, MUSB2_REG_TXCSRL, csr);
1966 			csr = MUSB2_READ_1(sc, MUSB2_REG_TXCSRL);
1967 			if (csr & MUSB2_MASK_CSRL_TXFIFONEMPTY) {
1968 				csr |= MUSB2_MASK_CSRL_TXFFLUSH;
1969 				MUSB2_WRITE_1(sc, MUSB2_REG_TXCSRL, csr);
1970 				csr = MUSB2_READ_1(sc, MUSB2_REG_TXCSRL);
1971 			}
1972 		}
1973 
1974 		csr &= ~MUSB2_MASK_CSRL_TXNAKTO;
1975 		MUSB2_WRITE_1(sc, MUSB2_REG_TXCSRL, csr);
1976 
1977 		td->error = 1;
1978 		musbotg_channel_free(sc, td);
1979 		return (0);	/* complete */
1980 	}
1981 
1982 	/*
1983 	 * Wait while FIFO is empty.
1984 	 * Do not flush it because it will cause transactions
1985 	 * with size more then packet size. It might upset
1986 	 * some devices
1987 	 */
1988 	if (csr & MUSB2_MASK_CSRL_TXFIFONEMPTY)
1989 		return (1);
1990 
1991 	/* Packet still being processed */
1992 	if (csr & MUSB2_MASK_CSRL_TXPKTRDY)
1993 		return (1);
1994 
1995 	if (td->transaction_started) {
1996 		/* check remainder */
1997 		if (td->remainder == 0) {
1998 			if (td->short_pkt) {
1999 				musbotg_channel_free(sc, td);
2000 				return (0);	/* complete */
2001 			}
2002 			/* else we need to transmit a short packet */
2003 		}
2004 
2005 		/* We're not complete - more transactions required */
2006 		td->transaction_started = 0;
2007 	}
2008 
2009 	/* check for short packet */
2010 	count = td->max_frame_size;
2011 	if (td->remainder < count) {
2012 		/* we have a short packet */
2013 		td->short_pkt = 1;
2014 		count = td->remainder;
2015 	}
2016 
2017 	while (count > 0) {
2018 		uint32_t temp;
2019 
2020 		usbd_get_page(td->pc, td->offset, &buf_res);
2021 
2022 		/* get correct length */
2023 		if (buf_res.length > count) {
2024 			buf_res.length = count;
2025 		}
2026 		/* check for unaligned memory address */
2027 		if (USB_P2U(buf_res.buffer) & 3) {
2028 
2029 			usbd_copy_out(td->pc, td->offset,
2030 			    sc->sc_bounce_buf, count);
2031 
2032 			temp = count & ~3;
2033 
2034 			if (temp) {
2035 				/* transmit data 4 bytes at a time */
2036 				bus_space_write_multi_4(sc->sc_io_tag,
2037 				    sc->sc_io_hdl, MUSB2_REG_EPFIFO(td->channel),
2038 				    sc->sc_bounce_buf, temp / 4);
2039 			}
2040 			temp = count & 3;
2041 			if (temp) {
2042 				/* receive data 1 byte at a time */
2043 				bus_space_write_multi_1(sc->sc_io_tag, sc->sc_io_hdl,
2044 				    MUSB2_REG_EPFIFO(td->channel),
2045 				    ((void *)&sc->sc_bounce_buf[count / 4]), temp);
2046 			}
2047 			/* update offset and remainder */
2048 			td->offset += count;
2049 			td->remainder -= count;
2050 			break;
2051 		}
2052 		/* check if we can optimise */
2053 		if (buf_res.length >= 4) {
2054 
2055 			/* transmit data 4 bytes at a time */
2056 			bus_space_write_multi_4(sc->sc_io_tag, sc->sc_io_hdl,
2057 			    MUSB2_REG_EPFIFO(td->channel), buf_res.buffer,
2058 			    buf_res.length / 4);
2059 
2060 			temp = buf_res.length & ~3;
2061 
2062 			/* update counters */
2063 			count -= temp;
2064 			td->offset += temp;
2065 			td->remainder -= temp;
2066 			continue;
2067 		}
2068 		/* transmit data */
2069 		bus_space_write_multi_1(sc->sc_io_tag, sc->sc_io_hdl,
2070 		    MUSB2_REG_EPFIFO(td->channel), buf_res.buffer,
2071 		    buf_res.length);
2072 
2073 		/* update counters */
2074 		count -= buf_res.length;
2075 		td->offset += buf_res.length;
2076 		td->remainder -= buf_res.length;
2077 	}
2078 
2079 	/* Function address */
2080 	MUSB2_WRITE_1(sc, MUSB2_REG_TXFADDR(td->channel),
2081 	    td->dev_addr);
2082 
2083 	/* SPLIT transaction */
2084 	MUSB2_WRITE_1(sc, MUSB2_REG_TXHADDR(td->channel),
2085 	    td->haddr);
2086 	MUSB2_WRITE_1(sc, MUSB2_REG_TXHUBPORT(td->channel),
2087 	    td->hport);
2088 
2089 	/* TX NAK timeout */
2090 	if (td->transfer_type & MUSB2_MASK_TI_PROTO_ISOC)
2091 		MUSB2_WRITE_1(sc, MUSB2_REG_TXNAKLIMIT, 0);
2092 	else
2093 		MUSB2_WRITE_1(sc, MUSB2_REG_TXNAKLIMIT, MAX_NAK_TO);
2094 
2095 	/* Protocol, speed, device endpoint */
2096 	MUSB2_WRITE_1(sc, MUSB2_REG_TXTI, td->transfer_type);
2097 
2098 	/* Max packet size */
2099 	MUSB2_WRITE_2(sc, MUSB2_REG_TXMAXP, td->reg_max_packet);
2100 
2101 	if (!td->transaction_started) {
2102 		csrh = MUSB2_READ_1(sc, MUSB2_REG_TXCSRH);
2103 		DPRINTFN(4, "csrh=0x%02x\n", csrh);
2104 
2105 		csrh |= MUSB2_MASK_CSRH_TXDT_WREN;
2106 		if (td->toggle)
2107 			csrh |= MUSB2_MASK_CSRH_TXDT_VAL;
2108 		else
2109 			csrh &= ~MUSB2_MASK_CSRH_TXDT_VAL;
2110 
2111 		/* Set data toggle */
2112 		MUSB2_WRITE_1(sc, MUSB2_REG_TXCSRH, csrh);
2113 	}
2114 
2115 	/* write command */
2116 	MUSB2_WRITE_1(sc, MUSB2_REG_TXCSRL,
2117 	    MUSB2_MASK_CSRL_TXPKTRDY);
2118 
2119 	/* Update Data Toggle */
2120 	td->toggle ^= 1;
2121 	td->transaction_started = 1;
2122 
2123 	return (1);			/* not complete */
2124 }
2125 
2126 static uint8_t
2127 musbotg_xfer_do_fifo(struct usb_xfer *xfer)
2128 {
2129 	struct musbotg_softc *sc;
2130 	struct musbotg_td *td;
2131 
2132 	DPRINTFN(8, "\n");
2133 	sc = MUSBOTG_BUS2SC(xfer->xroot->bus);
2134 
2135 	td = xfer->td_transfer_cache;
2136 	while (1) {
2137 
2138 		if ((td->func) (td)) {
2139 			/* operation in progress */
2140 			break;
2141 		}
2142 
2143 		if (((void *)td) == xfer->td_transfer_last) {
2144 			goto done;
2145 		}
2146 		if (td->error) {
2147 			goto done;
2148 		} else if (td->remainder > 0) {
2149 			/*
2150 			 * We had a short transfer. If there is no alternate
2151 			 * next, stop processing !
2152 			 */
2153 			if (!td->alt_next) {
2154 				goto done;
2155 			}
2156 		}
2157 		/*
2158 		 * Fetch the next transfer descriptor and transfer
2159 		 * some flags to the next transfer descriptor
2160 		 */
2161 		td = td->obj_next;
2162 		xfer->td_transfer_cache = td;
2163 	}
2164 
2165 	return (1);			/* not complete */
2166 done:
2167 	/* compute all actual lengths */
2168 	musbotg_standard_done(xfer);
2169 
2170 	return (0);			/* complete */
2171 }
2172 
2173 static void
2174 musbotg_interrupt_poll(struct musbotg_softc *sc)
2175 {
2176 	struct usb_xfer *xfer;
2177 
2178 repeat:
2179 	TAILQ_FOREACH(xfer, &sc->sc_bus.intr_q.head, wait_entry) {
2180 		if (!musbotg_xfer_do_fifo(xfer)) {
2181 			/* queue has been modified */
2182 			goto repeat;
2183 		}
2184 	}
2185 }
2186 
2187 void
2188 musbotg_vbus_interrupt(struct musbotg_softc *sc, uint8_t is_on)
2189 {
2190 	DPRINTFN(4, "vbus = %u\n", is_on);
2191 
2192 	USB_BUS_LOCK(&sc->sc_bus);
2193 	if (is_on) {
2194 		if (!sc->sc_flags.status_vbus) {
2195 			sc->sc_flags.status_vbus = 1;
2196 
2197 			/* complete root HUB interrupt endpoint */
2198 			musbotg_root_intr(sc);
2199 		}
2200 	} else {
2201 		if (sc->sc_flags.status_vbus) {
2202 			sc->sc_flags.status_vbus = 0;
2203 			sc->sc_flags.status_bus_reset = 0;
2204 			sc->sc_flags.status_suspend = 0;
2205 			sc->sc_flags.change_suspend = 0;
2206 			sc->sc_flags.change_connect = 1;
2207 
2208 			/* complete root HUB interrupt endpoint */
2209 			musbotg_root_intr(sc);
2210 		}
2211 	}
2212 
2213 	USB_BUS_UNLOCK(&sc->sc_bus);
2214 }
2215 
2216 void
2217 musbotg_connect_interrupt(struct musbotg_softc *sc)
2218 {
2219 	USB_BUS_LOCK(&sc->sc_bus);
2220 	sc->sc_flags.change_connect = 1;
2221 
2222 	/* complete root HUB interrupt endpoint */
2223 	musbotg_root_intr(sc);
2224 	USB_BUS_UNLOCK(&sc->sc_bus);
2225 }
2226 
2227 void
2228 musbotg_interrupt(struct musbotg_softc *sc,
2229     uint16_t rxstat, uint16_t txstat, uint8_t stat)
2230 {
2231 	uint16_t rx_status;
2232 	uint16_t tx_status;
2233 	uint8_t usb_status;
2234 	uint8_t temp;
2235 	uint8_t to = 2;
2236 
2237 	USB_BUS_LOCK(&sc->sc_bus);
2238 
2239 repeat:
2240 
2241 	/* read all interrupt registers */
2242 	usb_status = MUSB2_READ_1(sc, MUSB2_REG_INTUSB);
2243 
2244 	/* read all FIFO interrupts */
2245 	rx_status = MUSB2_READ_2(sc, MUSB2_REG_INTRX);
2246 	tx_status = MUSB2_READ_2(sc, MUSB2_REG_INTTX);
2247 	rx_status |= rxstat;
2248 	tx_status |= txstat;
2249 	usb_status |= stat;
2250 
2251 	/* Clear platform flags after first time */
2252 	rxstat = 0;
2253 	txstat = 0;
2254 	stat = 0;
2255 
2256 	/* check for any bus state change interrupts */
2257 
2258 	if (usb_status & (MUSB2_MASK_IRESET |
2259 	    MUSB2_MASK_IRESUME | MUSB2_MASK_ISUSP |
2260 	    MUSB2_MASK_ICONN | MUSB2_MASK_IDISC |
2261 	    MUSB2_MASK_IVBUSERR)) {
2262 
2263 		DPRINTFN(4, "real bus interrupt 0x%08x\n", usb_status);
2264 
2265 		if (usb_status & MUSB2_MASK_IRESET) {
2266 
2267 			/* set correct state */
2268 			sc->sc_flags.status_bus_reset = 1;
2269 			sc->sc_flags.status_suspend = 0;
2270 			sc->sc_flags.change_suspend = 0;
2271 			sc->sc_flags.change_connect = 1;
2272 
2273 			/* determine line speed */
2274 			temp = MUSB2_READ_1(sc, MUSB2_REG_POWER);
2275 			if (temp & MUSB2_MASK_HSMODE)
2276 				sc->sc_flags.status_high_speed = 1;
2277 			else
2278 				sc->sc_flags.status_high_speed = 0;
2279 
2280 			/*
2281 			 * After reset all interrupts are on and we need to
2282 			 * turn them off!
2283 			 */
2284 			temp = MUSB2_MASK_IRESET;
2285 			/* disable resume interrupt */
2286 			temp &= ~MUSB2_MASK_IRESUME;
2287 			/* enable suspend interrupt */
2288 			temp |= MUSB2_MASK_ISUSP;
2289 			MUSB2_WRITE_1(sc, MUSB2_REG_INTUSBE, temp);
2290 			/* disable TX and RX interrupts */
2291 			MUSB2_WRITE_2(sc, MUSB2_REG_INTTXE, 0);
2292 			MUSB2_WRITE_2(sc, MUSB2_REG_INTRXE, 0);
2293 		}
2294 		/*
2295 	         * If RXRSM and RXSUSP is set at the same time we interpret
2296 	         * that like RESUME. Resume is set when there is at least 3
2297 	         * milliseconds of inactivity on the USB BUS.
2298 	         */
2299 		if (usb_status & MUSB2_MASK_IRESUME) {
2300 			if (sc->sc_flags.status_suspend) {
2301 				sc->sc_flags.status_suspend = 0;
2302 				sc->sc_flags.change_suspend = 1;
2303 
2304 				temp = MUSB2_READ_1(sc, MUSB2_REG_INTUSBE);
2305 				/* disable resume interrupt */
2306 				temp &= ~MUSB2_MASK_IRESUME;
2307 				/* enable suspend interrupt */
2308 				temp |= MUSB2_MASK_ISUSP;
2309 				MUSB2_WRITE_1(sc, MUSB2_REG_INTUSBE, temp);
2310 			}
2311 		} else if (usb_status & MUSB2_MASK_ISUSP) {
2312 			if (!sc->sc_flags.status_suspend) {
2313 				sc->sc_flags.status_suspend = 1;
2314 				sc->sc_flags.change_suspend = 1;
2315 
2316 				temp = MUSB2_READ_1(sc, MUSB2_REG_INTUSBE);
2317 				/* disable suspend interrupt */
2318 				temp &= ~MUSB2_MASK_ISUSP;
2319 				/* enable resume interrupt */
2320 				temp |= MUSB2_MASK_IRESUME;
2321 				MUSB2_WRITE_1(sc, MUSB2_REG_INTUSBE, temp);
2322 			}
2323 		}
2324 		if (usb_status &
2325 		    (MUSB2_MASK_ICONN | MUSB2_MASK_IDISC))
2326 			sc->sc_flags.change_connect = 1;
2327 
2328 		/*
2329 		 * Host Mode: There is no IRESET so assume bus is
2330 		 * always in reset state once device is connected.
2331 		 */
2332 		if (sc->sc_mode == MUSB2_HOST_MODE) {
2333 		    /* check for VBUS error in USB host mode */
2334 		    if (usb_status & MUSB2_MASK_IVBUSERR) {
2335 			temp = MUSB2_READ_1(sc, MUSB2_REG_DEVCTL);
2336 			temp |= MUSB2_MASK_SESS;
2337 			MUSB2_WRITE_1(sc, MUSB2_REG_DEVCTL, temp);
2338 		    }
2339 		    if (usb_status & MUSB2_MASK_ICONN)
2340 			sc->sc_flags.status_bus_reset = 1;
2341 		    if (usb_status & MUSB2_MASK_IDISC)
2342 			sc->sc_flags.status_bus_reset = 0;
2343 		}
2344 
2345 		/* complete root HUB interrupt endpoint */
2346 		musbotg_root_intr(sc);
2347 	}
2348 	/* check for any endpoint interrupts */
2349 
2350 	if (rx_status || tx_status) {
2351 		DPRINTFN(4, "real endpoint interrupt "
2352 		    "rx=0x%04x, tx=0x%04x\n", rx_status, tx_status);
2353 	}
2354 	/* poll one time regardless of FIFO status */
2355 
2356 	musbotg_interrupt_poll(sc);
2357 
2358 	if (--to)
2359 		goto repeat;
2360 
2361 	USB_BUS_UNLOCK(&sc->sc_bus);
2362 }
2363 
2364 static void
2365 musbotg_setup_standard_chain_sub(struct musbotg_std_temp *temp)
2366 {
2367 	struct musbotg_td *td;
2368 
2369 	/* get current Transfer Descriptor */
2370 	td = temp->td_next;
2371 	temp->td = td;
2372 
2373 	/* prepare for next TD */
2374 	temp->td_next = td->obj_next;
2375 
2376 	/* fill out the Transfer Descriptor */
2377 	td->func = temp->func;
2378 	td->pc = temp->pc;
2379 	td->offset = temp->offset;
2380 	td->remainder = temp->len;
2381 	td->error = 0;
2382 	td->transaction_started = 0;
2383 	td->did_stall = temp->did_stall;
2384 	td->short_pkt = temp->short_pkt;
2385 	td->alt_next = temp->setup_alt_next;
2386 	td->channel = temp->channel;
2387 	td->dev_addr = temp->dev_addr;
2388 	td->haddr = temp->haddr;
2389 	td->hport = temp->hport;
2390 	td->transfer_type = temp->transfer_type;
2391 }
2392 
2393 static void
2394 musbotg_setup_standard_chain(struct usb_xfer *xfer)
2395 {
2396 	struct musbotg_std_temp temp;
2397 	struct musbotg_softc *sc;
2398 	struct musbotg_td *td;
2399 	uint32_t x;
2400 	uint8_t ep_no;
2401 	uint8_t xfer_type;
2402 	enum usb_dev_speed speed;
2403 	int tx;
2404 	int dev_addr;
2405 
2406 	DPRINTFN(8, "addr=%d endpt=%d sumlen=%d speed=%d\n",
2407 	    xfer->address, UE_GET_ADDR(xfer->endpointno),
2408 	    xfer->sumlen, usbd_get_speed(xfer->xroot->udev));
2409 
2410 	sc = MUSBOTG_BUS2SC(xfer->xroot->bus);
2411 	ep_no = (xfer->endpointno & UE_ADDR);
2412 
2413 	temp.max_frame_size = xfer->max_frame_size;
2414 
2415 	td = xfer->td_start[0];
2416 	xfer->td_transfer_first = td;
2417 	xfer->td_transfer_cache = td;
2418 
2419 	/* setup temp */
2420 	dev_addr = xfer->address;
2421 
2422 	xfer_type = xfer->endpoint->edesc->bmAttributes & UE_XFERTYPE;
2423 
2424 	temp.pc = NULL;
2425 	temp.td = NULL;
2426 	temp.td_next = xfer->td_start[0];
2427 	temp.offset = 0;
2428 	temp.setup_alt_next = xfer->flags_int.short_frames_ok ||
2429 	    xfer->flags_int.isochronous_xfr;
2430 	temp.did_stall = !xfer->flags_int.control_stall;
2431 	temp.channel = -1;
2432 	temp.dev_addr = dev_addr;
2433 	temp.haddr = xfer->xroot->udev->hs_hub_addr;
2434 	temp.hport = xfer->xroot->udev->hs_port_no;
2435 
2436 	if (xfer->flags_int.usb_mode == USB_MODE_HOST) {
2437 		speed =  usbd_get_speed(xfer->xroot->udev);
2438 
2439 		switch (speed) {
2440 			case USB_SPEED_LOW:
2441 				temp.transfer_type = MUSB2_MASK_TI_SPEED_LO;
2442 				break;
2443 			case USB_SPEED_FULL:
2444 				temp.transfer_type = MUSB2_MASK_TI_SPEED_FS;
2445 				break;
2446 			case USB_SPEED_HIGH:
2447 				temp.transfer_type = MUSB2_MASK_TI_SPEED_HS;
2448 				break;
2449 			default:
2450 				temp.transfer_type = 0;
2451 				DPRINTFN(-1, "Invalid USB speed: %d\n", speed);
2452 				break;
2453 		}
2454 
2455 		switch (xfer_type) {
2456 			case UE_CONTROL:
2457 				temp.transfer_type |= MUSB2_MASK_TI_PROTO_CTRL;
2458 				break;
2459 			case UE_ISOCHRONOUS:
2460 				temp.transfer_type |= MUSB2_MASK_TI_PROTO_ISOC;
2461 				break;
2462 			case UE_BULK:
2463 				temp.transfer_type |= MUSB2_MASK_TI_PROTO_BULK;
2464 				break;
2465 			case UE_INTERRUPT:
2466 				temp.transfer_type |= MUSB2_MASK_TI_PROTO_INTR;
2467 				break;
2468 			default:
2469 				DPRINTFN(-1, "Invalid USB transfer type: %d\n",
2470 						xfer_type);
2471 				break;
2472 		}
2473 
2474 		temp.transfer_type |= ep_no;
2475 		td->toggle = xfer->endpoint->toggle_next;
2476 	}
2477 
2478 	/* check if we should prepend a setup message */
2479 
2480 	if (xfer->flags_int.control_xfr) {
2481 		if (xfer->flags_int.control_hdr) {
2482 
2483 			if (xfer->flags_int.usb_mode == USB_MODE_DEVICE)
2484 				temp.func = &musbotg_dev_ctrl_setup_rx;
2485 			else
2486 				temp.func = &musbotg_host_ctrl_setup_tx;
2487 
2488 			temp.len = xfer->frlengths[0];
2489 			temp.pc = xfer->frbuffers + 0;
2490 			temp.short_pkt = temp.len ? 1 : 0;
2491 
2492 			musbotg_setup_standard_chain_sub(&temp);
2493 		}
2494 		x = 1;
2495 	} else {
2496 		x = 0;
2497 	}
2498 
2499 	tx = 0;
2500 
2501 	if (x != xfer->nframes) {
2502 		if (xfer->endpointno & UE_DIR_IN)
2503 		    	tx = 1;
2504 
2505 		if (xfer->flags_int.usb_mode == USB_MODE_HOST) {
2506 			tx = !tx;
2507 
2508 			if (tx) {
2509 				if (xfer->flags_int.control_xfr)
2510 					temp.func = &musbotg_host_ctrl_data_tx;
2511 				else
2512 					temp.func = &musbotg_host_data_tx;
2513 			} else {
2514 				if (xfer->flags_int.control_xfr)
2515 					temp.func = &musbotg_host_ctrl_data_rx;
2516 				else
2517 					temp.func = &musbotg_host_data_rx;
2518 			}
2519 
2520 		} else {
2521 			if (tx) {
2522 				if (xfer->flags_int.control_xfr)
2523 					temp.func = &musbotg_dev_ctrl_data_tx;
2524 				else
2525 					temp.func = &musbotg_dev_data_tx;
2526 			} else {
2527 				if (xfer->flags_int.control_xfr)
2528 					temp.func = &musbotg_dev_ctrl_data_rx;
2529 				else
2530 					temp.func = &musbotg_dev_data_rx;
2531 			}
2532 		}
2533 
2534 		/* setup "pc" pointer */
2535 		temp.pc = xfer->frbuffers + x;
2536 	}
2537 	while (x != xfer->nframes) {
2538 
2539 		/* DATA0 / DATA1 message */
2540 
2541 		temp.len = xfer->frlengths[x];
2542 
2543 		x++;
2544 
2545 		if (x == xfer->nframes) {
2546 			if (xfer->flags_int.control_xfr) {
2547 				if (xfer->flags_int.control_act) {
2548 					temp.setup_alt_next = 0;
2549 				}
2550 			} else {
2551 				temp.setup_alt_next = 0;
2552 			}
2553 		}
2554 		if (temp.len == 0) {
2555 
2556 			/* make sure that we send an USB packet */
2557 
2558 			temp.short_pkt = 0;
2559 
2560 		} else {
2561 
2562 			if (xfer->flags_int.isochronous_xfr) {
2563 				/* isochronous data transfer */
2564 				/* don't force short */
2565 				temp.short_pkt = 1;
2566 			} else {
2567 				/* regular data transfer */
2568 				temp.short_pkt = (xfer->flags.force_short_xfer ? 0 : 1);
2569 			}
2570 		}
2571 
2572 		musbotg_setup_standard_chain_sub(&temp);
2573 
2574 		if (xfer->flags_int.isochronous_xfr) {
2575 			temp.offset += temp.len;
2576 		} else {
2577 			/* get next Page Cache pointer */
2578 			temp.pc = xfer->frbuffers + x;
2579 		}
2580 	}
2581 
2582 	/* check for control transfer */
2583 	if (xfer->flags_int.control_xfr) {
2584 
2585 		/* always setup a valid "pc" pointer for status and sync */
2586 		temp.pc = xfer->frbuffers + 0;
2587 		temp.len = 0;
2588 		temp.short_pkt = 0;
2589 		temp.setup_alt_next = 0;
2590 
2591 		/* check if we should append a status stage */
2592 		if (!xfer->flags_int.control_act) {
2593 			/*
2594 			 * Send a DATA1 message and invert the current
2595 			 * endpoint direction.
2596 			 */
2597 			if (sc->sc_mode == MUSB2_DEVICE_MODE)
2598 				temp.func = &musbotg_dev_ctrl_status;
2599 			else {
2600 				if (xfer->endpointno & UE_DIR_IN)
2601 					temp.func = musbotg_host_ctrl_status_tx;
2602 				else
2603 					temp.func = musbotg_host_ctrl_status_rx;
2604 			}
2605 			musbotg_setup_standard_chain_sub(&temp);
2606 		}
2607 	}
2608 	/* must have at least one frame! */
2609 	td = temp.td;
2610 	xfer->td_transfer_last = td;
2611 }
2612 
2613 static void
2614 musbotg_timeout(void *arg)
2615 {
2616 	struct usb_xfer *xfer = arg;
2617 
2618 	DPRINTFN(1, "xfer=%p\n", xfer);
2619 
2620 	USB_BUS_LOCK_ASSERT(xfer->xroot->bus, MA_OWNED);
2621 
2622 	/* transfer is transferred */
2623 	musbotg_device_done(xfer, USB_ERR_TIMEOUT);
2624 }
2625 
2626 static void
2627 musbotg_ep_int_set(struct musbotg_softc *sc, int channel, int on)
2628 {
2629 	uint16_t temp;
2630 
2631 	/*
2632 	 * Only enable the endpoint interrupt when we are
2633 	 * actually waiting for data, hence we are dealing
2634 	 * with level triggered interrupts !
2635 	 */
2636 	DPRINTFN(1, "ep_no=%d, on=%d\n", channel, on);
2637 
2638 	if (channel == -1)
2639 		return;
2640 
2641 	if (channel == 0) {
2642 		temp = MUSB2_READ_2(sc, MUSB2_REG_INTTXE);
2643 		if (on)
2644 			temp |= MUSB2_MASK_EPINT(0);
2645 		else
2646 			temp &= ~MUSB2_MASK_EPINT(0);
2647 
2648 		MUSB2_WRITE_2(sc, MUSB2_REG_INTTXE, temp);
2649 	} else {
2650 		temp = MUSB2_READ_2(sc, MUSB2_REG_INTRXE);
2651 		if (on)
2652 			temp |= MUSB2_MASK_EPINT(channel);
2653 		else
2654 			temp &= ~MUSB2_MASK_EPINT(channel);
2655 		MUSB2_WRITE_2(sc, MUSB2_REG_INTRXE, temp);
2656 
2657 		temp = MUSB2_READ_2(sc, MUSB2_REG_INTTXE);
2658 		if (on)
2659 			temp |= MUSB2_MASK_EPINT(channel);
2660 		else
2661 			temp &= ~MUSB2_MASK_EPINT(channel);
2662 		MUSB2_WRITE_2(sc, MUSB2_REG_INTTXE, temp);
2663 	}
2664 
2665 	if (sc->sc_ep_int_set)
2666 		sc->sc_ep_int_set(sc, channel, on);
2667 }
2668 
2669 static void
2670 musbotg_start_standard_chain(struct usb_xfer *xfer)
2671 {
2672 	DPRINTFN(8, "\n");
2673 
2674 	/* poll one time */
2675 	if (musbotg_xfer_do_fifo(xfer)) {
2676 
2677 		DPRINTFN(14, "enabled interrupts on endpoint\n");
2678 
2679 		/* put transfer on interrupt queue */
2680 		usbd_transfer_enqueue(&xfer->xroot->bus->intr_q, xfer);
2681 
2682 		/* start timeout, if any */
2683 		if (xfer->timeout != 0) {
2684 			usbd_transfer_timeout_ms(xfer,
2685 			    &musbotg_timeout, xfer->timeout);
2686 		}
2687 	}
2688 }
2689 
2690 static void
2691 musbotg_root_intr(struct musbotg_softc *sc)
2692 {
2693 	DPRINTFN(8, "\n");
2694 
2695 	USB_BUS_LOCK_ASSERT(&sc->sc_bus, MA_OWNED);
2696 
2697 	/* set port bit */
2698 	sc->sc_hub_idata[0] = 0x02;	/* we only have one port */
2699 
2700 	uhub_root_intr(&sc->sc_bus, sc->sc_hub_idata,
2701 	    sizeof(sc->sc_hub_idata));
2702 }
2703 
2704 static usb_error_t
2705 musbotg_standard_done_sub(struct usb_xfer *xfer)
2706 {
2707 	struct musbotg_td *td;
2708 	uint32_t len;
2709 	uint8_t error;
2710 
2711 	DPRINTFN(8, "\n");
2712 
2713 	td = xfer->td_transfer_cache;
2714 
2715 	do {
2716 		len = td->remainder;
2717 
2718 		xfer->endpoint->toggle_next = td->toggle;
2719 
2720 		if (xfer->aframes != xfer->nframes) {
2721 			/*
2722 		         * Verify the length and subtract
2723 		         * the remainder from "frlengths[]":
2724 		         */
2725 			if (len > xfer->frlengths[xfer->aframes]) {
2726 				td->error = 1;
2727 			} else {
2728 				xfer->frlengths[xfer->aframes] -= len;
2729 			}
2730 		}
2731 		/* Check for transfer error */
2732 		if (td->error) {
2733 			/* the transfer is finished */
2734 			error = 1;
2735 			td = NULL;
2736 			break;
2737 		}
2738 		/* Check for short transfer */
2739 		if (len > 0) {
2740 			if (xfer->flags_int.short_frames_ok ||
2741 			    xfer->flags_int.isochronous_xfr) {
2742 				/* follow alt next */
2743 				if (td->alt_next) {
2744 					td = td->obj_next;
2745 				} else {
2746 					td = NULL;
2747 				}
2748 			} else {
2749 				/* the transfer is finished */
2750 				td = NULL;
2751 			}
2752 			error = 0;
2753 			break;
2754 		}
2755 		td = td->obj_next;
2756 
2757 		/* this USB frame is complete */
2758 		error = 0;
2759 		break;
2760 
2761 	} while (0);
2762 
2763 	/* update transfer cache */
2764 
2765 	xfer->td_transfer_cache = td;
2766 
2767 	return (error ?
2768 	    USB_ERR_STALLED : USB_ERR_NORMAL_COMPLETION);
2769 }
2770 
2771 static void
2772 musbotg_standard_done(struct usb_xfer *xfer)
2773 {
2774 	usb_error_t err = 0;
2775 
2776 	DPRINTFN(12, "xfer=%p endpoint=%p transfer done\n",
2777 	    xfer, xfer->endpoint);
2778 
2779 	/* reset scanner */
2780 
2781 	xfer->td_transfer_cache = xfer->td_transfer_first;
2782 
2783 	if (xfer->flags_int.control_xfr) {
2784 
2785 		if (xfer->flags_int.control_hdr) {
2786 
2787 			err = musbotg_standard_done_sub(xfer);
2788 		}
2789 		xfer->aframes = 1;
2790 
2791 		if (xfer->td_transfer_cache == NULL) {
2792 			goto done;
2793 		}
2794 	}
2795 	while (xfer->aframes != xfer->nframes) {
2796 
2797 		err = musbotg_standard_done_sub(xfer);
2798 		xfer->aframes++;
2799 
2800 		if (xfer->td_transfer_cache == NULL) {
2801 			goto done;
2802 		}
2803 	}
2804 
2805 	if (xfer->flags_int.control_xfr &&
2806 	    !xfer->flags_int.control_act) {
2807 
2808 		err = musbotg_standard_done_sub(xfer);
2809 	}
2810 done:
2811 	musbotg_device_done(xfer, err);
2812 }
2813 
2814 /*------------------------------------------------------------------------*
2815  *	musbotg_device_done
2816  *
2817  * NOTE: this function can be called more than one time on the
2818  * same USB transfer!
2819  *------------------------------------------------------------------------*/
2820 static void
2821 musbotg_device_done(struct usb_xfer *xfer, usb_error_t error)
2822 {
2823 	struct musbotg_td *td;
2824 	struct musbotg_softc *sc;
2825 
2826 	USB_BUS_LOCK_ASSERT(xfer->xroot->bus, MA_OWNED);
2827 
2828 	DPRINTFN(1, "xfer=%p, endpoint=%p, error=%d\n",
2829 	    xfer, xfer->endpoint, error);
2830 
2831 	DPRINTFN(14, "disabled interrupts on endpoint\n");
2832 
2833 	sc = MUSBOTG_BUS2SC(xfer->xroot->bus);
2834 	td = xfer->td_transfer_cache;
2835 
2836 	if (td && (td->channel != -1))
2837 		musbotg_channel_free(sc, td);
2838 
2839 	/* dequeue transfer and start next transfer */
2840 	usbd_transfer_done(xfer, error);
2841 }
2842 
2843 static void
2844 musbotg_xfer_stall(struct usb_xfer *xfer)
2845 {
2846 	musbotg_device_done(xfer, USB_ERR_STALLED);
2847 }
2848 
2849 static void
2850 musbotg_set_stall(struct usb_device *udev,
2851     struct usb_endpoint *ep, uint8_t *did_stall)
2852 {
2853 	struct musbotg_softc *sc;
2854 	uint8_t ep_no;
2855 
2856 	USB_BUS_LOCK_ASSERT(udev->bus, MA_OWNED);
2857 
2858 	DPRINTFN(4, "endpoint=%p\n", ep);
2859 
2860 	/* set FORCESTALL */
2861 	sc = MUSBOTG_BUS2SC(udev->bus);
2862 
2863 	ep_no = (ep->edesc->bEndpointAddress & UE_ADDR);
2864 
2865 	/* select endpoint */
2866 	MUSB2_WRITE_1(sc, MUSB2_REG_EPINDEX, ep_no);
2867 
2868 	if (ep->edesc->bEndpointAddress & UE_DIR_IN) {
2869 		MUSB2_WRITE_1(sc, MUSB2_REG_TXCSRL,
2870 		    MUSB2_MASK_CSRL_TXSENDSTALL);
2871 	} else {
2872 		MUSB2_WRITE_1(sc, MUSB2_REG_RXCSRL,
2873 		    MUSB2_MASK_CSRL_RXSENDSTALL);
2874 	}
2875 }
2876 
2877 static void
2878 musbotg_clear_stall_sub(struct musbotg_softc *sc, uint16_t wMaxPacket,
2879     uint8_t ep_no, uint8_t ep_type, uint8_t ep_dir)
2880 {
2881 	uint16_t mps;
2882 	uint16_t temp;
2883 	uint8_t csr;
2884 
2885 	if (ep_type == UE_CONTROL) {
2886 		/* clearing stall is not needed */
2887 		return;
2888 	}
2889 	/* select endpoint */
2890 	MUSB2_WRITE_1(sc, MUSB2_REG_EPINDEX, ep_no);
2891 
2892 	/* compute max frame size */
2893 	mps = wMaxPacket & 0x7FF;
2894 	switch ((wMaxPacket >> 11) & 3) {
2895 	case 1:
2896 		mps *= 2;
2897 		break;
2898 	case 2:
2899 		mps *= 3;
2900 		break;
2901 	default:
2902 		break;
2903 	}
2904 
2905 	if (ep_dir == UE_DIR_IN) {
2906 
2907 		temp = 0;
2908 
2909 		/* Configure endpoint */
2910 		switch (ep_type) {
2911 		case UE_INTERRUPT:
2912 			MUSB2_WRITE_2(sc, MUSB2_REG_TXMAXP, wMaxPacket);
2913 			MUSB2_WRITE_1(sc, MUSB2_REG_TXCSRH,
2914 			    MUSB2_MASK_CSRH_TXMODE | temp);
2915 			break;
2916 		case UE_ISOCHRONOUS:
2917 			MUSB2_WRITE_2(sc, MUSB2_REG_TXMAXP, wMaxPacket);
2918 			MUSB2_WRITE_1(sc, MUSB2_REG_TXCSRH,
2919 			    MUSB2_MASK_CSRH_TXMODE |
2920 			    MUSB2_MASK_CSRH_TXISO | temp);
2921 			break;
2922 		case UE_BULK:
2923 			MUSB2_WRITE_2(sc, MUSB2_REG_TXMAXP, wMaxPacket);
2924 			MUSB2_WRITE_1(sc, MUSB2_REG_TXCSRH,
2925 			    MUSB2_MASK_CSRH_TXMODE | temp);
2926 			break;
2927 		default:
2928 			break;
2929 		}
2930 
2931 		/* Need to flush twice in case of double bufring */
2932 		csr = MUSB2_READ_1(sc, MUSB2_REG_TXCSRL);
2933 		if (csr & MUSB2_MASK_CSRL_TXFIFONEMPTY) {
2934 			MUSB2_WRITE_1(sc, MUSB2_REG_TXCSRL,
2935 			    MUSB2_MASK_CSRL_TXFFLUSH);
2936 			csr = MUSB2_READ_1(sc, MUSB2_REG_TXCSRL);
2937 			if (csr & MUSB2_MASK_CSRL_TXFIFONEMPTY) {
2938 				MUSB2_WRITE_1(sc, MUSB2_REG_TXCSRL,
2939 				    MUSB2_MASK_CSRL_TXFFLUSH);
2940 				csr = MUSB2_READ_1(sc, MUSB2_REG_TXCSRL);
2941 			}
2942 		}
2943 		/* reset data toggle */
2944 		MUSB2_WRITE_1(sc, MUSB2_REG_TXCSRL,
2945 		    MUSB2_MASK_CSRL_TXDT_CLR);
2946 		MUSB2_WRITE_1(sc, MUSB2_REG_TXCSRL, 0);
2947 		csr = MUSB2_READ_1(sc, MUSB2_REG_TXCSRL);
2948 
2949 		/* set double/single buffering */
2950 		temp = MUSB2_READ_2(sc, MUSB2_REG_TXDBDIS);
2951 		if (mps <= (sc->sc_hw_ep_profile[ep_no].
2952 		    max_in_frame_size / 2)) {
2953 			/* double buffer */
2954 			temp &= ~(1 << ep_no);
2955 		} else {
2956 			/* single buffer */
2957 			temp |= (1 << ep_no);
2958 		}
2959 		MUSB2_WRITE_2(sc, MUSB2_REG_TXDBDIS, temp);
2960 
2961 		/* clear sent stall */
2962 		if (csr & MUSB2_MASK_CSRL_TXSENTSTALL) {
2963 			MUSB2_WRITE_1(sc, MUSB2_REG_TXCSRL, 0);
2964 			csr = MUSB2_READ_1(sc, MUSB2_REG_TXCSRL);
2965 		}
2966 	} else {
2967 
2968 		temp = 0;
2969 
2970 		/* Configure endpoint */
2971 		switch (ep_type) {
2972 		case UE_INTERRUPT:
2973 			MUSB2_WRITE_2(sc, MUSB2_REG_RXMAXP, wMaxPacket);
2974 			MUSB2_WRITE_1(sc, MUSB2_REG_RXCSRH,
2975 			    MUSB2_MASK_CSRH_RXNYET | temp);
2976 			break;
2977 		case UE_ISOCHRONOUS:
2978 			MUSB2_WRITE_2(sc, MUSB2_REG_RXMAXP, wMaxPacket);
2979 			MUSB2_WRITE_1(sc, MUSB2_REG_RXCSRH,
2980 			    MUSB2_MASK_CSRH_RXNYET |
2981 			    MUSB2_MASK_CSRH_RXISO | temp);
2982 			break;
2983 		case UE_BULK:
2984 			MUSB2_WRITE_2(sc, MUSB2_REG_RXMAXP, wMaxPacket);
2985 			MUSB2_WRITE_1(sc, MUSB2_REG_RXCSRH, temp);
2986 			break;
2987 		default:
2988 			break;
2989 		}
2990 
2991 		/* Need to flush twice in case of double bufring */
2992 		csr = MUSB2_READ_1(sc, MUSB2_REG_RXCSRL);
2993 		if (csr & MUSB2_MASK_CSRL_RXPKTRDY) {
2994 			MUSB2_WRITE_1(sc, MUSB2_REG_RXCSRL,
2995 			    MUSB2_MASK_CSRL_RXFFLUSH);
2996 			csr = MUSB2_READ_1(sc, MUSB2_REG_RXCSRL);
2997 			if (csr & MUSB2_MASK_CSRL_RXPKTRDY) {
2998 				MUSB2_WRITE_1(sc, MUSB2_REG_RXCSRL,
2999 				    MUSB2_MASK_CSRL_RXFFLUSH);
3000 				csr = MUSB2_READ_1(sc, MUSB2_REG_RXCSRL);
3001 			}
3002 		}
3003 		/* reset data toggle */
3004 		MUSB2_WRITE_1(sc, MUSB2_REG_RXCSRL,
3005 		    MUSB2_MASK_CSRL_RXDT_CLR);
3006 		MUSB2_WRITE_1(sc, MUSB2_REG_RXCSRL, 0);
3007 		csr = MUSB2_READ_1(sc, MUSB2_REG_RXCSRL);
3008 
3009 		/* set double/single buffering */
3010 		temp = MUSB2_READ_2(sc, MUSB2_REG_RXDBDIS);
3011 		if (mps <= (sc->sc_hw_ep_profile[ep_no].
3012 		    max_out_frame_size / 2)) {
3013 			/* double buffer */
3014 			temp &= ~(1 << ep_no);
3015 		} else {
3016 			/* single buffer */
3017 			temp |= (1 << ep_no);
3018 		}
3019 		MUSB2_WRITE_2(sc, MUSB2_REG_RXDBDIS, temp);
3020 
3021 		/* clear sent stall */
3022 		if (csr & MUSB2_MASK_CSRL_RXSENTSTALL) {
3023 			MUSB2_WRITE_1(sc, MUSB2_REG_RXCSRL, 0);
3024 		}
3025 	}
3026 }
3027 
3028 static void
3029 musbotg_clear_stall(struct usb_device *udev, struct usb_endpoint *ep)
3030 {
3031 	struct musbotg_softc *sc;
3032 	struct usb_endpoint_descriptor *ed;
3033 
3034 	DPRINTFN(4, "endpoint=%p\n", ep);
3035 
3036 	USB_BUS_LOCK_ASSERT(udev->bus, MA_OWNED);
3037 
3038 	/* check mode */
3039 	if (udev->flags.usb_mode != USB_MODE_DEVICE) {
3040 		/* not supported */
3041 		return;
3042 	}
3043 	/* get softc */
3044 	sc = MUSBOTG_BUS2SC(udev->bus);
3045 
3046 	/* get endpoint descriptor */
3047 	ed = ep->edesc;
3048 
3049 	/* reset endpoint */
3050 	musbotg_clear_stall_sub(sc,
3051 	    UGETW(ed->wMaxPacketSize),
3052 	    (ed->bEndpointAddress & UE_ADDR),
3053 	    (ed->bmAttributes & UE_XFERTYPE),
3054 	    (ed->bEndpointAddress & (UE_DIR_IN | UE_DIR_OUT)));
3055 }
3056 
3057 usb_error_t
3058 musbotg_init(struct musbotg_softc *sc)
3059 {
3060 	struct usb_hw_ep_profile *pf;
3061 	uint16_t offset;
3062 	uint8_t nrx;
3063 	uint8_t ntx;
3064 	uint8_t temp;
3065 	uint8_t fsize;
3066 	uint8_t frx;
3067 	uint8_t ftx;
3068 	uint8_t dynfifo;
3069 
3070 	DPRINTFN(1, "start\n");
3071 
3072 	/* set up the bus structure */
3073 	sc->sc_bus.usbrev = USB_REV_2_0;
3074 	sc->sc_bus.methods = &musbotg_bus_methods;
3075 
3076 	USB_BUS_LOCK(&sc->sc_bus);
3077 
3078 	/* turn on clocks */
3079 
3080 	if (sc->sc_clocks_on) {
3081 		(sc->sc_clocks_on) (sc->sc_clocks_arg);
3082 	}
3083 
3084 	/* wait a little for things to stabilise */
3085 	usb_pause_mtx(&sc->sc_bus.bus_mtx, hz / 1000);
3086 
3087 	/* disable all interrupts */
3088 
3089 	temp = MUSB2_READ_1(sc, MUSB2_REG_DEVCTL);
3090 	DPRINTF("pre-DEVCTL=0x%02x\n", temp);
3091 
3092 	MUSB2_WRITE_1(sc, MUSB2_REG_INTUSBE, 0);
3093 	MUSB2_WRITE_2(sc, MUSB2_REG_INTTXE, 0);
3094 	MUSB2_WRITE_2(sc, MUSB2_REG_INTRXE, 0);
3095 
3096 	/* disable pullup */
3097 
3098 	musbotg_pull_common(sc, 0);
3099 
3100 	/* wait a little bit (10ms) */
3101 	usb_pause_mtx(&sc->sc_bus.bus_mtx, hz / 100);
3102 
3103 
3104 	/* disable double packet buffering */
3105 	MUSB2_WRITE_2(sc, MUSB2_REG_RXDBDIS, 0xFFFF);
3106 	MUSB2_WRITE_2(sc, MUSB2_REG_TXDBDIS, 0xFFFF);
3107 
3108 	/* enable HighSpeed and ISO Update flags */
3109 
3110 	MUSB2_WRITE_1(sc, MUSB2_REG_POWER,
3111 	    MUSB2_MASK_HSENAB | MUSB2_MASK_ISOUPD);
3112 
3113 	if (sc->sc_mode == MUSB2_DEVICE_MODE) {
3114 		/* clear Session bit, if set */
3115 		temp = MUSB2_READ_1(sc, MUSB2_REG_DEVCTL);
3116 		temp &= ~MUSB2_MASK_SESS;
3117 		MUSB2_WRITE_1(sc, MUSB2_REG_DEVCTL, temp);
3118 	} else {
3119 		/* Enter session for Host mode */
3120 		temp = MUSB2_READ_1(sc, MUSB2_REG_DEVCTL);
3121 		temp |= MUSB2_MASK_SESS;
3122 		MUSB2_WRITE_1(sc, MUSB2_REG_DEVCTL, temp);
3123 	}
3124 
3125 	/* wait a little for things to stabilise */
3126 	usb_pause_mtx(&sc->sc_bus.bus_mtx, hz / 10);
3127 
3128 	DPRINTF("DEVCTL=0x%02x\n", temp);
3129 
3130 	/* disable testmode */
3131 
3132 	MUSB2_WRITE_1(sc, MUSB2_REG_TESTMODE, 0);
3133 
3134 	/* set default value */
3135 
3136 	MUSB2_WRITE_1(sc, MUSB2_REG_MISC, 0);
3137 
3138 	/* select endpoint index 0 */
3139 
3140 	MUSB2_WRITE_1(sc, MUSB2_REG_EPINDEX, 0);
3141 
3142 	/* read out number of endpoints */
3143 
3144 	nrx =
3145 	    (MUSB2_READ_1(sc, MUSB2_REG_EPINFO) / 16);
3146 
3147 	ntx =
3148 	    (MUSB2_READ_1(sc, MUSB2_REG_EPINFO) % 16);
3149 
3150 	/* these numbers exclude the control endpoint */
3151 
3152 	DPRINTFN(2, "RX/TX endpoints: %u/%u\n", nrx, ntx);
3153 
3154 	sc->sc_ep_max = (nrx > ntx) ? nrx : ntx;
3155 	if (sc->sc_ep_max == 0) {
3156 		DPRINTFN(2, "ERROR: Looks like the clocks are off!\n");
3157 	}
3158 	/* read out configuration data */
3159 
3160 	sc->sc_conf_data = MUSB2_READ_1(sc, MUSB2_REG_CONFDATA);
3161 
3162 	DPRINTFN(2, "Config Data: 0x%02x\n",
3163 	    sc->sc_conf_data);
3164 
3165 	dynfifo = (sc->sc_conf_data & MUSB2_MASK_CD_DYNFIFOSZ) ? 1 : 0;
3166 
3167 	if (dynfifo) {
3168 		device_printf(sc->sc_bus.bdev, "Dynamic FIFO sizing detected, "
3169 		    "assuming 16Kbytes of FIFO RAM\n");
3170 	}
3171 
3172 	DPRINTFN(2, "HW version: 0x%04x\n",
3173 	    MUSB2_READ_1(sc, MUSB2_REG_HWVERS));
3174 
3175 	/* initialise endpoint profiles */
3176 
3177 	offset = 0;
3178 
3179 	for (temp = 1; temp <= sc->sc_ep_max; temp++) {
3180 		pf = sc->sc_hw_ep_profile + temp;
3181 
3182 		/* select endpoint */
3183 		MUSB2_WRITE_1(sc, MUSB2_REG_EPINDEX, temp);
3184 
3185 		fsize = MUSB2_READ_1(sc, MUSB2_REG_FSIZE);
3186 		frx = (fsize & MUSB2_MASK_RX_FSIZE) / 16;
3187 		ftx = (fsize & MUSB2_MASK_TX_FSIZE);
3188 
3189 		DPRINTF("Endpoint %u FIFO size: IN=%u, OUT=%u, DYN=%d\n",
3190 		    temp, ftx, frx, dynfifo);
3191 
3192 		if (dynfifo) {
3193 			if (frx && (temp <= nrx)) {
3194 				if (temp == 1) {
3195 					frx = 12;	/* 4K */
3196 					MUSB2_WRITE_1(sc, MUSB2_REG_RXFIFOSZ,
3197 					    MUSB2_VAL_FIFOSZ_4096 |
3198 					    MUSB2_MASK_FIFODB);
3199 				} else if (temp < 8) {
3200 					frx = 10;	/* 1K */
3201 					MUSB2_WRITE_1(sc, MUSB2_REG_RXFIFOSZ,
3202 					    MUSB2_VAL_FIFOSZ_512 |
3203 					    MUSB2_MASK_FIFODB);
3204 				} else {
3205 					frx = 7;	/* 128 bytes */
3206 					MUSB2_WRITE_1(sc, MUSB2_REG_RXFIFOSZ,
3207 					    MUSB2_VAL_FIFOSZ_128);
3208 				}
3209 
3210 				MUSB2_WRITE_2(sc, MUSB2_REG_RXFIFOADD,
3211 				    offset >> 3);
3212 
3213 				offset += (1 << frx);
3214 			}
3215 			if (ftx && (temp <= ntx)) {
3216 				if (temp == 1) {
3217 					ftx = 12;	/* 4K */
3218 					MUSB2_WRITE_1(sc, MUSB2_REG_TXFIFOSZ,
3219 	 				    MUSB2_VAL_FIFOSZ_4096 |
3220 	 				    MUSB2_MASK_FIFODB);
3221 				} else if (temp < 8) {
3222 					ftx = 10;	/* 1K */
3223 					MUSB2_WRITE_1(sc, MUSB2_REG_TXFIFOSZ,
3224 	 				    MUSB2_VAL_FIFOSZ_512 |
3225 	 				    MUSB2_MASK_FIFODB);
3226 				} else {
3227 					ftx = 7;	/* 128 bytes */
3228 					MUSB2_WRITE_1(sc, MUSB2_REG_TXFIFOSZ,
3229 	 				    MUSB2_VAL_FIFOSZ_128);
3230 				}
3231 
3232 				MUSB2_WRITE_2(sc, MUSB2_REG_TXFIFOADD,
3233 				    offset >> 3);
3234 
3235 				offset += (1 << ftx);
3236 			}
3237 		}
3238 
3239 		if (frx && ftx && (temp <= nrx) && (temp <= ntx)) {
3240 			pf->max_in_frame_size = 1 << ftx;
3241 			pf->max_out_frame_size = 1 << frx;
3242 			pf->is_simplex = 0;	/* duplex */
3243 			pf->support_multi_buffer = 1;
3244 			pf->support_bulk = 1;
3245 			pf->support_interrupt = 1;
3246 			pf->support_isochronous = 1;
3247 			pf->support_in = 1;
3248 			pf->support_out = 1;
3249 		} else if (frx && (temp <= nrx)) {
3250 			pf->max_out_frame_size = 1 << frx;
3251 			pf->max_in_frame_size = 0;
3252 			pf->is_simplex = 1;	/* simplex */
3253 			pf->support_multi_buffer = 1;
3254 			pf->support_bulk = 1;
3255 			pf->support_interrupt = 1;
3256 			pf->support_isochronous = 1;
3257 			pf->support_out = 1;
3258 		} else if (ftx && (temp <= ntx)) {
3259 			pf->max_in_frame_size = 1 << ftx;
3260 			pf->max_out_frame_size = 0;
3261 			pf->is_simplex = 1;	/* simplex */
3262 			pf->support_multi_buffer = 1;
3263 			pf->support_bulk = 1;
3264 			pf->support_interrupt = 1;
3265 			pf->support_isochronous = 1;
3266 			pf->support_in = 1;
3267 		}
3268 	}
3269 
3270 	DPRINTFN(2, "Dynamic FIFO size = %d bytes\n", offset);
3271 
3272 	/* turn on default interrupts */
3273 
3274 	if (sc->sc_mode == MUSB2_HOST_MODE)
3275 		MUSB2_WRITE_1(sc, MUSB2_REG_INTUSBE, 0xff);
3276 	else
3277 		MUSB2_WRITE_1(sc, MUSB2_REG_INTUSBE,
3278 		    MUSB2_MASK_IRESET);
3279 
3280 	musbotg_clocks_off(sc);
3281 
3282 	USB_BUS_UNLOCK(&sc->sc_bus);
3283 
3284 	/* catch any lost interrupts */
3285 
3286 	musbotg_do_poll(&sc->sc_bus);
3287 
3288 	return (0);			/* success */
3289 }
3290 
3291 void
3292 musbotg_uninit(struct musbotg_softc *sc)
3293 {
3294 	USB_BUS_LOCK(&sc->sc_bus);
3295 
3296 	/* disable all interrupts */
3297 	MUSB2_WRITE_1(sc, MUSB2_REG_INTUSBE, 0);
3298 	MUSB2_WRITE_2(sc, MUSB2_REG_INTTXE, 0);
3299 	MUSB2_WRITE_2(sc, MUSB2_REG_INTRXE, 0);
3300 
3301 	sc->sc_flags.port_powered = 0;
3302 	sc->sc_flags.status_vbus = 0;
3303 	sc->sc_flags.status_bus_reset = 0;
3304 	sc->sc_flags.status_suspend = 0;
3305 	sc->sc_flags.change_suspend = 0;
3306 	sc->sc_flags.change_connect = 1;
3307 
3308 	musbotg_pull_down(sc);
3309 	musbotg_clocks_off(sc);
3310 	USB_BUS_UNLOCK(&sc->sc_bus);
3311 }
3312 
3313 static void
3314 musbotg_do_poll(struct usb_bus *bus)
3315 {
3316 	struct musbotg_softc *sc = MUSBOTG_BUS2SC(bus);
3317 
3318 	USB_BUS_LOCK(&sc->sc_bus);
3319 	musbotg_interrupt_poll(sc);
3320 	USB_BUS_UNLOCK(&sc->sc_bus);
3321 }
3322 
3323 /*------------------------------------------------------------------------*
3324  * musbotg bulk support
3325  *------------------------------------------------------------------------*/
3326 static void
3327 musbotg_device_bulk_open(struct usb_xfer *xfer)
3328 {
3329 	return;
3330 }
3331 
3332 static void
3333 musbotg_device_bulk_close(struct usb_xfer *xfer)
3334 {
3335 	musbotg_device_done(xfer, USB_ERR_CANCELLED);
3336 }
3337 
3338 static void
3339 musbotg_device_bulk_enter(struct usb_xfer *xfer)
3340 {
3341 	return;
3342 }
3343 
3344 static void
3345 musbotg_device_bulk_start(struct usb_xfer *xfer)
3346 {
3347 	/* setup TDs */
3348 	musbotg_setup_standard_chain(xfer);
3349 	musbotg_start_standard_chain(xfer);
3350 }
3351 
3352 static const struct usb_pipe_methods musbotg_device_bulk_methods =
3353 {
3354 	.open = musbotg_device_bulk_open,
3355 	.close = musbotg_device_bulk_close,
3356 	.enter = musbotg_device_bulk_enter,
3357 	.start = musbotg_device_bulk_start,
3358 };
3359 
3360 /*------------------------------------------------------------------------*
3361  * musbotg control support
3362  *------------------------------------------------------------------------*/
3363 static void
3364 musbotg_device_ctrl_open(struct usb_xfer *xfer)
3365 {
3366 	return;
3367 }
3368 
3369 static void
3370 musbotg_device_ctrl_close(struct usb_xfer *xfer)
3371 {
3372 	musbotg_device_done(xfer, USB_ERR_CANCELLED);
3373 }
3374 
3375 static void
3376 musbotg_device_ctrl_enter(struct usb_xfer *xfer)
3377 {
3378 	return;
3379 }
3380 
3381 static void
3382 musbotg_device_ctrl_start(struct usb_xfer *xfer)
3383 {
3384 	/* setup TDs */
3385 	musbotg_setup_standard_chain(xfer);
3386 	musbotg_start_standard_chain(xfer);
3387 }
3388 
3389 static const struct usb_pipe_methods musbotg_device_ctrl_methods =
3390 {
3391 	.open = musbotg_device_ctrl_open,
3392 	.close = musbotg_device_ctrl_close,
3393 	.enter = musbotg_device_ctrl_enter,
3394 	.start = musbotg_device_ctrl_start,
3395 };
3396 
3397 /*------------------------------------------------------------------------*
3398  * musbotg interrupt support
3399  *------------------------------------------------------------------------*/
3400 static void
3401 musbotg_device_intr_open(struct usb_xfer *xfer)
3402 {
3403 	return;
3404 }
3405 
3406 static void
3407 musbotg_device_intr_close(struct usb_xfer *xfer)
3408 {
3409 	musbotg_device_done(xfer, USB_ERR_CANCELLED);
3410 }
3411 
3412 static void
3413 musbotg_device_intr_enter(struct usb_xfer *xfer)
3414 {
3415 	return;
3416 }
3417 
3418 static void
3419 musbotg_device_intr_start(struct usb_xfer *xfer)
3420 {
3421 	/* setup TDs */
3422 	musbotg_setup_standard_chain(xfer);
3423 	musbotg_start_standard_chain(xfer);
3424 }
3425 
3426 static const struct usb_pipe_methods musbotg_device_intr_methods =
3427 {
3428 	.open = musbotg_device_intr_open,
3429 	.close = musbotg_device_intr_close,
3430 	.enter = musbotg_device_intr_enter,
3431 	.start = musbotg_device_intr_start,
3432 };
3433 
3434 /*------------------------------------------------------------------------*
3435  * musbotg full speed isochronous support
3436  *------------------------------------------------------------------------*/
3437 static void
3438 musbotg_device_isoc_open(struct usb_xfer *xfer)
3439 {
3440 	return;
3441 }
3442 
3443 static void
3444 musbotg_device_isoc_close(struct usb_xfer *xfer)
3445 {
3446 	musbotg_device_done(xfer, USB_ERR_CANCELLED);
3447 }
3448 
3449 static void
3450 musbotg_device_isoc_enter(struct usb_xfer *xfer)
3451 {
3452 	struct musbotg_softc *sc = MUSBOTG_BUS2SC(xfer->xroot->bus);
3453 	uint32_t temp;
3454 	uint32_t nframes;
3455 	uint32_t fs_frames;
3456 
3457 	DPRINTFN(5, "xfer=%p next=%d nframes=%d\n",
3458 	    xfer, xfer->endpoint->isoc_next, xfer->nframes);
3459 
3460 	/* get the current frame index */
3461 
3462 	nframes = MUSB2_READ_2(sc, MUSB2_REG_FRAME);
3463 
3464 	/*
3465 	 * check if the frame index is within the window where the frames
3466 	 * will be inserted
3467 	 */
3468 	temp = (nframes - xfer->endpoint->isoc_next) & MUSB2_MASK_FRAME;
3469 
3470 	if (usbd_get_speed(xfer->xroot->udev) == USB_SPEED_HIGH) {
3471 		fs_frames = (xfer->nframes + 7) / 8;
3472 	} else {
3473 		fs_frames = xfer->nframes;
3474 	}
3475 
3476 	if ((xfer->endpoint->is_synced == 0) ||
3477 	    (temp < fs_frames)) {
3478 		/*
3479 		 * If there is data underflow or the pipe queue is
3480 		 * empty we schedule the transfer a few frames ahead
3481 		 * of the current frame position. Else two isochronous
3482 		 * transfers might overlap.
3483 		 */
3484 		xfer->endpoint->isoc_next = (nframes + 3) & MUSB2_MASK_FRAME;
3485 		xfer->endpoint->is_synced = 1;
3486 		DPRINTFN(2, "start next=%d\n", xfer->endpoint->isoc_next);
3487 	}
3488 	/*
3489 	 * compute how many milliseconds the insertion is ahead of the
3490 	 * current frame position:
3491 	 */
3492 	temp = (xfer->endpoint->isoc_next - nframes) & MUSB2_MASK_FRAME;
3493 
3494 	/*
3495 	 * pre-compute when the isochronous transfer will be finished:
3496 	 */
3497 	xfer->isoc_time_complete =
3498 	    usb_isoc_time_expand(&sc->sc_bus, nframes) + temp +
3499 	    fs_frames;
3500 
3501 	/* compute frame number for next insertion */
3502 	xfer->endpoint->isoc_next += fs_frames;
3503 
3504 	/* setup TDs */
3505 	musbotg_setup_standard_chain(xfer);
3506 }
3507 
3508 static void
3509 musbotg_device_isoc_start(struct usb_xfer *xfer)
3510 {
3511 	/* start TD chain */
3512 	musbotg_start_standard_chain(xfer);
3513 }
3514 
3515 static const struct usb_pipe_methods musbotg_device_isoc_methods =
3516 {
3517 	.open = musbotg_device_isoc_open,
3518 	.close = musbotg_device_isoc_close,
3519 	.enter = musbotg_device_isoc_enter,
3520 	.start = musbotg_device_isoc_start,
3521 };
3522 
3523 /*------------------------------------------------------------------------*
3524  * musbotg root control support
3525  *------------------------------------------------------------------------*
3526  * Simulate a hardware HUB by handling all the necessary requests.
3527  *------------------------------------------------------------------------*/
3528 
3529 static const struct usb_device_descriptor musbotg_devd = {
3530 	.bLength = sizeof(struct usb_device_descriptor),
3531 	.bDescriptorType = UDESC_DEVICE,
3532 	.bcdUSB = {0x00, 0x02},
3533 	.bDeviceClass = UDCLASS_HUB,
3534 	.bDeviceSubClass = UDSUBCLASS_HUB,
3535 	.bDeviceProtocol = UDPROTO_HSHUBSTT,
3536 	.bMaxPacketSize = 64,
3537 	.bcdDevice = {0x00, 0x01},
3538 	.iManufacturer = 1,
3539 	.iProduct = 2,
3540 	.bNumConfigurations = 1,
3541 };
3542 
3543 static const struct usb_device_qualifier musbotg_odevd = {
3544 	.bLength = sizeof(struct usb_device_qualifier),
3545 	.bDescriptorType = UDESC_DEVICE_QUALIFIER,
3546 	.bcdUSB = {0x00, 0x02},
3547 	.bDeviceClass = UDCLASS_HUB,
3548 	.bDeviceSubClass = UDSUBCLASS_HUB,
3549 	.bDeviceProtocol = UDPROTO_FSHUB,
3550 	.bMaxPacketSize0 = 0,
3551 	.bNumConfigurations = 0,
3552 };
3553 
3554 static const struct musbotg_config_desc musbotg_confd = {
3555 	.confd = {
3556 		.bLength = sizeof(struct usb_config_descriptor),
3557 		.bDescriptorType = UDESC_CONFIG,
3558 		.wTotalLength[0] = sizeof(musbotg_confd),
3559 		.bNumInterface = 1,
3560 		.bConfigurationValue = 1,
3561 		.iConfiguration = 0,
3562 		.bmAttributes = UC_SELF_POWERED,
3563 		.bMaxPower = 0,
3564 	},
3565 	.ifcd = {
3566 		.bLength = sizeof(struct usb_interface_descriptor),
3567 		.bDescriptorType = UDESC_INTERFACE,
3568 		.bNumEndpoints = 1,
3569 		.bInterfaceClass = UICLASS_HUB,
3570 		.bInterfaceSubClass = UISUBCLASS_HUB,
3571 		.bInterfaceProtocol = 0,
3572 	},
3573 	.endpd = {
3574 		.bLength = sizeof(struct usb_endpoint_descriptor),
3575 		.bDescriptorType = UDESC_ENDPOINT,
3576 		.bEndpointAddress = (UE_DIR_IN | MUSBOTG_INTR_ENDPT),
3577 		.bmAttributes = UE_INTERRUPT,
3578 		.wMaxPacketSize[0] = 8,
3579 		.bInterval = 255,
3580 	},
3581 };
3582 
3583 #define	HSETW(ptr, val) ptr = { (uint8_t)(val), (uint8_t)((val) >> 8) }
3584 
3585 static const struct usb_hub_descriptor_min musbotg_hubd = {
3586 	.bDescLength = sizeof(musbotg_hubd),
3587 	.bDescriptorType = UDESC_HUB,
3588 	.bNbrPorts = 1,
3589 	HSETW(.wHubCharacteristics, (UHD_PWR_NO_SWITCH | UHD_OC_INDIVIDUAL)),
3590 	.bPwrOn2PwrGood = 50,
3591 	.bHubContrCurrent = 0,
3592 	.DeviceRemovable = {0},		/* port is removable */
3593 };
3594 
3595 #define	STRING_VENDOR \
3596   "M\0e\0n\0t\0o\0r\0 \0G\0r\0a\0p\0h\0i\0c\0s"
3597 
3598 #define	STRING_PRODUCT \
3599   "O\0T\0G\0 \0R\0o\0o\0t\0 \0H\0U\0B"
3600 
3601 USB_MAKE_STRING_DESC(STRING_VENDOR, musbotg_vendor);
3602 USB_MAKE_STRING_DESC(STRING_PRODUCT, musbotg_product);
3603 
3604 static usb_error_t
3605 musbotg_roothub_exec(struct usb_device *udev,
3606     struct usb_device_request *req, const void **pptr, uint16_t *plength)
3607 {
3608 	struct musbotg_softc *sc = MUSBOTG_BUS2SC(udev->bus);
3609 	const void *ptr;
3610 	uint16_t len;
3611 	uint16_t value;
3612 	uint16_t index;
3613 	uint8_t reg;
3614 	usb_error_t err;
3615 
3616 	USB_BUS_LOCK_ASSERT(&sc->sc_bus, MA_OWNED);
3617 
3618 	/* buffer reset */
3619 	ptr = (const void *)&sc->sc_hub_temp;
3620 	len = 0;
3621 	err = 0;
3622 
3623 	value = UGETW(req->wValue);
3624 	index = UGETW(req->wIndex);
3625 
3626 	/* demultiplex the control request */
3627 
3628 	switch (req->bmRequestType) {
3629 	case UT_READ_DEVICE:
3630 		switch (req->bRequest) {
3631 		case UR_GET_DESCRIPTOR:
3632 			goto tr_handle_get_descriptor;
3633 		case UR_GET_CONFIG:
3634 			goto tr_handle_get_config;
3635 		case UR_GET_STATUS:
3636 			goto tr_handle_get_status;
3637 		default:
3638 			goto tr_stalled;
3639 		}
3640 		break;
3641 
3642 	case UT_WRITE_DEVICE:
3643 		switch (req->bRequest) {
3644 		case UR_SET_ADDRESS:
3645 			goto tr_handle_set_address;
3646 		case UR_SET_CONFIG:
3647 			goto tr_handle_set_config;
3648 		case UR_CLEAR_FEATURE:
3649 			goto tr_valid;	/* nop */
3650 		case UR_SET_DESCRIPTOR:
3651 			goto tr_valid;	/* nop */
3652 		case UR_SET_FEATURE:
3653 		default:
3654 			goto tr_stalled;
3655 		}
3656 		break;
3657 
3658 	case UT_WRITE_ENDPOINT:
3659 		switch (req->bRequest) {
3660 		case UR_CLEAR_FEATURE:
3661 			switch (UGETW(req->wValue)) {
3662 			case UF_ENDPOINT_HALT:
3663 				goto tr_handle_clear_halt;
3664 			case UF_DEVICE_REMOTE_WAKEUP:
3665 				goto tr_handle_clear_wakeup;
3666 			default:
3667 				goto tr_stalled;
3668 			}
3669 			break;
3670 		case UR_SET_FEATURE:
3671 			switch (UGETW(req->wValue)) {
3672 			case UF_ENDPOINT_HALT:
3673 				goto tr_handle_set_halt;
3674 			case UF_DEVICE_REMOTE_WAKEUP:
3675 				goto tr_handle_set_wakeup;
3676 			default:
3677 				goto tr_stalled;
3678 			}
3679 			break;
3680 		case UR_SYNCH_FRAME:
3681 			goto tr_valid;	/* nop */
3682 		default:
3683 			goto tr_stalled;
3684 		}
3685 		break;
3686 
3687 	case UT_READ_ENDPOINT:
3688 		switch (req->bRequest) {
3689 		case UR_GET_STATUS:
3690 			goto tr_handle_get_ep_status;
3691 		default:
3692 			goto tr_stalled;
3693 		}
3694 		break;
3695 
3696 	case UT_WRITE_INTERFACE:
3697 		switch (req->bRequest) {
3698 		case UR_SET_INTERFACE:
3699 			goto tr_handle_set_interface;
3700 		case UR_CLEAR_FEATURE:
3701 			goto tr_valid;	/* nop */
3702 		case UR_SET_FEATURE:
3703 		default:
3704 			goto tr_stalled;
3705 		}
3706 		break;
3707 
3708 	case UT_READ_INTERFACE:
3709 		switch (req->bRequest) {
3710 		case UR_GET_INTERFACE:
3711 			goto tr_handle_get_interface;
3712 		case UR_GET_STATUS:
3713 			goto tr_handle_get_iface_status;
3714 		default:
3715 			goto tr_stalled;
3716 		}
3717 		break;
3718 
3719 	case UT_WRITE_CLASS_INTERFACE:
3720 	case UT_WRITE_VENDOR_INTERFACE:
3721 		/* XXX forward */
3722 		break;
3723 
3724 	case UT_READ_CLASS_INTERFACE:
3725 	case UT_READ_VENDOR_INTERFACE:
3726 		/* XXX forward */
3727 		break;
3728 
3729 	case UT_WRITE_CLASS_DEVICE:
3730 		switch (req->bRequest) {
3731 		case UR_CLEAR_FEATURE:
3732 			goto tr_valid;
3733 		case UR_SET_DESCRIPTOR:
3734 		case UR_SET_FEATURE:
3735 			break;
3736 		default:
3737 			goto tr_stalled;
3738 		}
3739 		break;
3740 
3741 	case UT_WRITE_CLASS_OTHER:
3742 		switch (req->bRequest) {
3743 		case UR_CLEAR_FEATURE:
3744 			goto tr_handle_clear_port_feature;
3745 		case UR_SET_FEATURE:
3746 			goto tr_handle_set_port_feature;
3747 		case UR_CLEAR_TT_BUFFER:
3748 		case UR_RESET_TT:
3749 		case UR_STOP_TT:
3750 			goto tr_valid;
3751 
3752 		default:
3753 			goto tr_stalled;
3754 		}
3755 		break;
3756 
3757 	case UT_READ_CLASS_OTHER:
3758 		switch (req->bRequest) {
3759 		case UR_GET_TT_STATE:
3760 			goto tr_handle_get_tt_state;
3761 		case UR_GET_STATUS:
3762 			goto tr_handle_get_port_status;
3763 		default:
3764 			goto tr_stalled;
3765 		}
3766 		break;
3767 
3768 	case UT_READ_CLASS_DEVICE:
3769 		switch (req->bRequest) {
3770 		case UR_GET_DESCRIPTOR:
3771 			goto tr_handle_get_class_descriptor;
3772 		case UR_GET_STATUS:
3773 			goto tr_handle_get_class_status;
3774 
3775 		default:
3776 			goto tr_stalled;
3777 		}
3778 		break;
3779 	default:
3780 		goto tr_stalled;
3781 	}
3782 	goto tr_valid;
3783 
3784 tr_handle_get_descriptor:
3785 	switch (value >> 8) {
3786 	case UDESC_DEVICE:
3787 		if (value & 0xff) {
3788 			goto tr_stalled;
3789 		}
3790 		len = sizeof(musbotg_devd);
3791 		ptr = (const void *)&musbotg_devd;
3792 		goto tr_valid;
3793 	case UDESC_DEVICE_QUALIFIER:
3794 		if (value & 0xff) {
3795 			goto tr_stalled;
3796 		}
3797 		len = sizeof(musbotg_odevd);
3798 		ptr = (const void *)&musbotg_odevd;
3799 		goto tr_valid;
3800 	case UDESC_CONFIG:
3801 		if (value & 0xff) {
3802 			goto tr_stalled;
3803 		}
3804 		len = sizeof(musbotg_confd);
3805 		ptr = (const void *)&musbotg_confd;
3806 		goto tr_valid;
3807 	case UDESC_STRING:
3808 		switch (value & 0xff) {
3809 		case 0:		/* Language table */
3810 			len = sizeof(usb_string_lang_en);
3811 			ptr = (const void *)&usb_string_lang_en;
3812 			goto tr_valid;
3813 
3814 		case 1:		/* Vendor */
3815 			len = sizeof(musbotg_vendor);
3816 			ptr = (const void *)&musbotg_vendor;
3817 			goto tr_valid;
3818 
3819 		case 2:		/* Product */
3820 			len = sizeof(musbotg_product);
3821 			ptr = (const void *)&musbotg_product;
3822 			goto tr_valid;
3823 		default:
3824 			break;
3825 		}
3826 		break;
3827 	default:
3828 		goto tr_stalled;
3829 	}
3830 	goto tr_stalled;
3831 
3832 tr_handle_get_config:
3833 	len = 1;
3834 	sc->sc_hub_temp.wValue[0] = sc->sc_conf;
3835 	goto tr_valid;
3836 
3837 tr_handle_get_status:
3838 	len = 2;
3839 	USETW(sc->sc_hub_temp.wValue, UDS_SELF_POWERED);
3840 	goto tr_valid;
3841 
3842 tr_handle_set_address:
3843 	if (value & 0xFF00) {
3844 		goto tr_stalled;
3845 	}
3846 	sc->sc_rt_addr = value;
3847 	goto tr_valid;
3848 
3849 tr_handle_set_config:
3850 	if (value >= 2) {
3851 		goto tr_stalled;
3852 	}
3853 	sc->sc_conf = value;
3854 	goto tr_valid;
3855 
3856 tr_handle_get_interface:
3857 	len = 1;
3858 	sc->sc_hub_temp.wValue[0] = 0;
3859 	goto tr_valid;
3860 
3861 tr_handle_get_tt_state:
3862 tr_handle_get_class_status:
3863 tr_handle_get_iface_status:
3864 tr_handle_get_ep_status:
3865 	len = 2;
3866 	USETW(sc->sc_hub_temp.wValue, 0);
3867 	goto tr_valid;
3868 
3869 tr_handle_set_halt:
3870 tr_handle_set_interface:
3871 tr_handle_set_wakeup:
3872 tr_handle_clear_wakeup:
3873 tr_handle_clear_halt:
3874 	goto tr_valid;
3875 
3876 tr_handle_clear_port_feature:
3877 	if (index != 1) {
3878 		goto tr_stalled;
3879 	}
3880 	DPRINTFN(8, "UR_CLEAR_PORT_FEATURE on port %d\n", index);
3881 
3882 	switch (value) {
3883 	case UHF_PORT_SUSPEND:
3884 		if (sc->sc_mode == MUSB2_HOST_MODE)
3885 			musbotg_wakeup_host(sc);
3886 		else
3887 			musbotg_wakeup_peer(sc);
3888 		break;
3889 
3890 	case UHF_PORT_ENABLE:
3891 		sc->sc_flags.port_enabled = 0;
3892 		break;
3893 
3894 	case UHF_C_PORT_ENABLE:
3895 		sc->sc_flags.change_enabled = 0;
3896 		break;
3897 
3898 	case UHF_C_PORT_OVER_CURRENT:
3899 		sc->sc_flags.change_over_current = 0;
3900 		break;
3901 
3902 	case UHF_C_PORT_RESET:
3903 		sc->sc_flags.change_reset = 0;
3904 		break;
3905 
3906 	case UHF_PORT_TEST:
3907 	case UHF_PORT_INDICATOR:
3908 		/* nops */
3909 		break;
3910 
3911 	case UHF_PORT_POWER:
3912 		sc->sc_flags.port_powered = 0;
3913 		musbotg_pull_down(sc);
3914 		musbotg_clocks_off(sc);
3915 		break;
3916 	case UHF_C_PORT_CONNECTION:
3917 		sc->sc_flags.change_connect = 0;
3918 		break;
3919 	case UHF_C_PORT_SUSPEND:
3920 		sc->sc_flags.change_suspend = 0;
3921 		break;
3922 	default:
3923 		err = USB_ERR_IOERROR;
3924 		goto done;
3925 	}
3926 	goto tr_valid;
3927 
3928 tr_handle_set_port_feature:
3929 	if (index != 1) {
3930 		goto tr_stalled;
3931 	}
3932 	DPRINTFN(8, "UR_SET_PORT_FEATURE\n");
3933 
3934 	switch (value) {
3935 	case UHF_PORT_ENABLE:
3936 		sc->sc_flags.port_enabled = 1;
3937 		break;
3938 	case UHF_PORT_SUSPEND:
3939 		if (sc->sc_mode == MUSB2_HOST_MODE)
3940 			musbotg_suspend_host(sc);
3941 		break;
3942 
3943 	case UHF_PORT_RESET:
3944 		if (sc->sc_mode == MUSB2_HOST_MODE) {
3945 			reg = MUSB2_READ_1(sc, MUSB2_REG_POWER);
3946 			reg |= MUSB2_MASK_RESET;
3947 			MUSB2_WRITE_1(sc, MUSB2_REG_POWER, reg);
3948 
3949 			/* Wait for 20 msec */
3950 			usb_pause_mtx(&sc->sc_bus.bus_mtx, hz / 5);
3951 
3952 			reg = MUSB2_READ_1(sc, MUSB2_REG_POWER);
3953 			reg &= ~MUSB2_MASK_RESET;
3954 			MUSB2_WRITE_1(sc, MUSB2_REG_POWER, reg);
3955 
3956 			/* determine line speed */
3957 			reg = MUSB2_READ_1(sc, MUSB2_REG_POWER);
3958 			if (reg & MUSB2_MASK_HSMODE)
3959 				sc->sc_flags.status_high_speed = 1;
3960 			else
3961 				sc->sc_flags.status_high_speed = 0;
3962 
3963 			sc->sc_flags.change_reset = 1;
3964 		} else
3965 			err = USB_ERR_IOERROR;
3966 		break;
3967 
3968 	case UHF_PORT_TEST:
3969 	case UHF_PORT_INDICATOR:
3970 		/* nops */
3971 		break;
3972 	case UHF_PORT_POWER:
3973 		sc->sc_flags.port_powered = 1;
3974 		break;
3975 	default:
3976 		err = USB_ERR_IOERROR;
3977 		goto done;
3978 	}
3979 	goto tr_valid;
3980 
3981 tr_handle_get_port_status:
3982 
3983 	DPRINTFN(8, "UR_GET_PORT_STATUS\n");
3984 
3985 	if (index != 1) {
3986 		goto tr_stalled;
3987 	}
3988 	if (sc->sc_flags.status_vbus) {
3989 		musbotg_clocks_on(sc);
3990 		musbotg_pull_up(sc);
3991 	} else {
3992 		musbotg_pull_down(sc);
3993 		musbotg_clocks_off(sc);
3994 	}
3995 
3996 	/* Select Device Side Mode */
3997 	if (sc->sc_mode == MUSB2_DEVICE_MODE)
3998 		value = UPS_PORT_MODE_DEVICE;
3999 	else
4000 		value = 0;
4001 
4002 	if (sc->sc_flags.status_high_speed) {
4003 		value |= UPS_HIGH_SPEED;
4004 	}
4005 	if (sc->sc_flags.port_powered) {
4006 		value |= UPS_PORT_POWER;
4007 	}
4008 	if (sc->sc_flags.port_enabled) {
4009 		value |= UPS_PORT_ENABLED;
4010 	}
4011 
4012 	if (sc->sc_flags.port_over_current)
4013 		value |= UPS_OVERCURRENT_INDICATOR;
4014 
4015 	if (sc->sc_flags.status_vbus &&
4016 	    sc->sc_flags.status_bus_reset) {
4017 		value |= UPS_CURRENT_CONNECT_STATUS;
4018 	}
4019 	if (sc->sc_flags.status_suspend) {
4020 		value |= UPS_SUSPEND;
4021 	}
4022 	USETW(sc->sc_hub_temp.ps.wPortStatus, value);
4023 
4024 	value = 0;
4025 
4026 	if (sc->sc_flags.change_connect) {
4027 		value |= UPS_C_CONNECT_STATUS;
4028 
4029 		if (sc->sc_mode == MUSB2_DEVICE_MODE) {
4030 			if (sc->sc_flags.status_vbus &&
4031 			    sc->sc_flags.status_bus_reset) {
4032 				/* reset EP0 state */
4033 				sc->sc_ep0_busy = 0;
4034 				sc->sc_ep0_cmd = 0;
4035 			}
4036 		}
4037 	}
4038 	if (sc->sc_flags.change_suspend)
4039 		value |= UPS_C_SUSPEND;
4040 	if (sc->sc_flags.change_reset)
4041 		value |= UPS_C_PORT_RESET;
4042 	if (sc->sc_flags.change_over_current)
4043 		value |= UPS_C_OVERCURRENT_INDICATOR;
4044 
4045 	USETW(sc->sc_hub_temp.ps.wPortChange, value);
4046 	len = sizeof(sc->sc_hub_temp.ps);
4047 	goto tr_valid;
4048 
4049 tr_handle_get_class_descriptor:
4050 	if (value & 0xFF) {
4051 		goto tr_stalled;
4052 	}
4053 	ptr = (const void *)&musbotg_hubd;
4054 	len = sizeof(musbotg_hubd);
4055 	goto tr_valid;
4056 
4057 tr_stalled:
4058 	err = USB_ERR_STALLED;
4059 tr_valid:
4060 done:
4061 	*plength = len;
4062 	*pptr = ptr;
4063 	return (err);
4064 }
4065 
4066 static void
4067 musbotg_xfer_setup(struct usb_setup_params *parm)
4068 {
4069 	struct musbotg_softc *sc;
4070 	struct usb_xfer *xfer;
4071 	void *last_obj;
4072 	uint32_t ntd;
4073 	uint32_t n;
4074 	uint8_t ep_no;
4075 
4076 	sc = MUSBOTG_BUS2SC(parm->udev->bus);
4077 	xfer = parm->curr_xfer;
4078 
4079 	/*
4080 	 * NOTE: This driver does not use any of the parameters that
4081 	 * are computed from the following values. Just set some
4082 	 * reasonable dummies:
4083 	 */
4084 	parm->hc_max_packet_size = 0x400;
4085 	parm->hc_max_frame_size = 0xc00;
4086 
4087 	if ((parm->methods == &musbotg_device_isoc_methods) ||
4088 	    (parm->methods == &musbotg_device_intr_methods))
4089 		parm->hc_max_packet_count = 3;
4090 	else
4091 		parm->hc_max_packet_count = 1;
4092 
4093 	usbd_transfer_setup_sub(parm);
4094 
4095 	/*
4096 	 * compute maximum number of TDs
4097 	 */
4098 	if (parm->methods == &musbotg_device_ctrl_methods) {
4099 
4100 		ntd = xfer->nframes + 1 /* STATUS */ + 1 /* SYNC */ ;
4101 
4102 	} else if (parm->methods == &musbotg_device_bulk_methods) {
4103 
4104 		ntd = xfer->nframes + 1 /* SYNC */ ;
4105 
4106 	} else if (parm->methods == &musbotg_device_intr_methods) {
4107 
4108 		ntd = xfer->nframes + 1 /* SYNC */ ;
4109 
4110 	} else if (parm->methods == &musbotg_device_isoc_methods) {
4111 
4112 		ntd = xfer->nframes + 1 /* SYNC */ ;
4113 
4114 	} else {
4115 
4116 		ntd = 0;
4117 	}
4118 
4119 	/*
4120 	 * check if "usbd_transfer_setup_sub" set an error
4121 	 */
4122 	if (parm->err) {
4123 		return;
4124 	}
4125 	/*
4126 	 * allocate transfer descriptors
4127 	 */
4128 	last_obj = NULL;
4129 
4130 	ep_no = xfer->endpointno & UE_ADDR;
4131 
4132 	/*
4133 	 * Check for a valid endpoint profile in USB device mode:
4134 	 */
4135 	if (xfer->flags_int.usb_mode == USB_MODE_DEVICE) {
4136 		const struct usb_hw_ep_profile *pf;
4137 
4138 		musbotg_get_hw_ep_profile(parm->udev, &pf, ep_no);
4139 
4140 		if (pf == NULL) {
4141 			/* should not happen */
4142 			parm->err = USB_ERR_INVAL;
4143 			return;
4144 		}
4145 	}
4146 
4147 	/* align data */
4148 	parm->size[0] += ((-parm->size[0]) & (USB_HOST_ALIGN - 1));
4149 
4150 	for (n = 0; n != ntd; n++) {
4151 
4152 		struct musbotg_td *td;
4153 
4154 		if (parm->buf) {
4155 
4156 			td = USB_ADD_BYTES(parm->buf, parm->size[0]);
4157 
4158 			/* init TD */
4159 			td->max_frame_size = xfer->max_frame_size;
4160 			td->reg_max_packet = xfer->max_packet_size |
4161 			    ((xfer->max_packet_count - 1) << 11);
4162 			td->ep_no = ep_no;
4163 			td->obj_next = last_obj;
4164 
4165 			last_obj = td;
4166 		}
4167 		parm->size[0] += sizeof(*td);
4168 	}
4169 
4170 	xfer->td_start[0] = last_obj;
4171 }
4172 
4173 static void
4174 musbotg_xfer_unsetup(struct usb_xfer *xfer)
4175 {
4176 	return;
4177 }
4178 
4179 static void
4180 musbotg_get_dma_delay(struct usb_device *udev, uint32_t *pus)
4181 {
4182 	struct musbotg_softc *sc = MUSBOTG_BUS2SC(udev->bus);
4183 
4184 	if (sc->sc_mode == MUSB2_HOST_MODE)
4185 	        *pus = 2000;                   /* microseconds */
4186 	else
4187 		*pus = 0;
4188 }
4189 
4190 static void
4191 musbotg_ep_init(struct usb_device *udev, struct usb_endpoint_descriptor *edesc,
4192     struct usb_endpoint *ep)
4193 {
4194 	struct musbotg_softc *sc = MUSBOTG_BUS2SC(udev->bus);
4195 
4196 	DPRINTFN(2, "endpoint=%p, addr=%d, endpt=%d, mode=%d (%d)\n",
4197 	    ep, udev->address,
4198 	    edesc->bEndpointAddress, udev->flags.usb_mode,
4199 	    sc->sc_rt_addr);
4200 
4201 	if (udev->device_index != sc->sc_rt_addr) {
4202 		switch (edesc->bmAttributes & UE_XFERTYPE) {
4203 		case UE_CONTROL:
4204 			ep->methods = &musbotg_device_ctrl_methods;
4205 			break;
4206 		case UE_INTERRUPT:
4207 			ep->methods = &musbotg_device_intr_methods;
4208 			break;
4209 		case UE_ISOCHRONOUS:
4210 			ep->methods = &musbotg_device_isoc_methods;
4211 			break;
4212 		case UE_BULK:
4213 			ep->methods = &musbotg_device_bulk_methods;
4214 			break;
4215 		default:
4216 			/* do nothing */
4217 			break;
4218 		}
4219 	}
4220 }
4221 
4222 static void
4223 musbotg_set_hw_power_sleep(struct usb_bus *bus, uint32_t state)
4224 {
4225 	struct musbotg_softc *sc = MUSBOTG_BUS2SC(bus);
4226 
4227 	switch (state) {
4228 	case USB_HW_POWER_SUSPEND:
4229 		musbotg_uninit(sc);
4230 		break;
4231 	case USB_HW_POWER_SHUTDOWN:
4232 		musbotg_uninit(sc);
4233 		break;
4234 	case USB_HW_POWER_RESUME:
4235 		musbotg_init(sc);
4236 		break;
4237 	default:
4238 		break;
4239 	}
4240 }
4241 
4242 static const struct usb_bus_methods musbotg_bus_methods =
4243 {
4244 	.endpoint_init = &musbotg_ep_init,
4245 	.get_dma_delay = &musbotg_get_dma_delay,
4246 	.xfer_setup = &musbotg_xfer_setup,
4247 	.xfer_unsetup = &musbotg_xfer_unsetup,
4248 	.get_hw_ep_profile = &musbotg_get_hw_ep_profile,
4249 	.xfer_stall = &musbotg_xfer_stall,
4250 	.set_stall = &musbotg_set_stall,
4251 	.clear_stall = &musbotg_clear_stall,
4252 	.roothub_exec = &musbotg_roothub_exec,
4253 	.xfer_poll = &musbotg_do_poll,
4254 	.set_hw_power_sleep = &musbotg_set_hw_power_sleep,
4255 };
4256