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