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