1 /* $NetBSD: usbdi.c,v 1.106 2004/10/24 12:52:40 augustss Exp $ */
2 /* $FreeBSD: src/sys/dev/usb/usbdi.c,v 1.91.2.1 2005/12/15 00:36:00 iedowse Exp $ */
3 /* $DragonFly: src/sys/bus/usb/usbdi.c,v 1.18 2007/06/29 22:56:31 hasso Exp $ */
6 * Copyright (c) 1998 The NetBSD Foundation, Inc.
9 * This code is derived from software contributed to The NetBSD Foundation
10 * by Lennart Augustsson (lennart@augustsson.net) at
11 * Carlstedt Research & Technology.
13 * Redistribution and use in source and binary forms, with or without
14 * modification, are permitted provided that the following conditions
16 * 1. Redistributions of source code must retain the above copyright
17 * notice, this list of conditions and the following disclaimer.
18 * 2. Redistributions in binary form must reproduce the above copyright
19 * notice, this list of conditions and the following disclaimer in the
20 * documentation and/or other materials provided with the distribution.
21 * 3. All advertising materials mentioning features or use of this software
22 * must display the following acknowledgement:
23 * This product includes software developed by the NetBSD
24 * Foundation, Inc. and its contributors.
25 * 4. Neither the name of The NetBSD Foundation nor the names of its
26 * contributors may be used to endorse or promote products derived
27 * from this software without specific prior written permission.
29 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
30 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
31 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
32 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
33 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
34 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
35 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
36 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
37 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
38 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
39 * POSSIBILITY OF SUCH DAMAGE.
42 #include <sys/param.h>
43 #include <sys/systm.h>
44 #include <sys/module.h>
47 #if defined(DIAGNOSTIC) && defined(__i386__)
48 #include <machine/cpu.h>
50 #include <sys/malloc.h>
52 #include <sys/thread2.h>
54 #include <bus/usb/usb.h>
55 #include <bus/usb/usbdi.h>
56 #include <bus/usb/usbdi_util.h>
57 #include <bus/usb/usbdivar.h>
58 #include <bus/usb/usb_mem.h>
59 #include <bus/usb/usb_quirks.h>
61 #define delay(d) DELAY(d)
64 #define DPRINTF(x) if (usbdebug) kprintf x
65 #define DPRINTFN(n,x) if (usbdebug>(n)) kprintf x
72 static usbd_status
usbd_ar_pipe(usbd_pipe_handle pipe
);
73 static void usbd_do_request_async_cb
74 (usbd_xfer_handle
, usbd_private_handle
, usbd_status
);
75 static void usbd_start_next(usbd_pipe_handle pipe
);
76 static usbd_status usbd_open_pipe_ival
77 (usbd_interface_handle
, u_int8_t
, u_int8_t
, usbd_pipe_handle
*, int);
78 static int usbd_xfer_isread(usbd_xfer_handle xfer
);
80 static int usbd_nbuses
= 0;
95 usbd_xfer_isread(usbd_xfer_handle xfer
)
97 if (xfer
->rqflags
& URQ_REQUEST
)
98 return (xfer
->request
.bmRequestType
& UT_READ
);
100 return (xfer
->pipe
->endpoint
->edesc
->bEndpointAddress
&
106 usbd_dump_iface(struct usbd_interface
*iface
)
108 kprintf("usbd_dump_iface: iface=%p\n", iface
);
111 kprintf(" device=%p idesc=%p index=%d altindex=%d priv=%p\n",
112 iface
->device
, iface
->idesc
, iface
->index
, iface
->altindex
,
117 usbd_dump_device(struct usbd_device
*dev
)
119 kprintf("usbd_dump_device: dev=%p\n", dev
);
122 kprintf(" bus=%p default_pipe=%p\n", dev
->bus
, dev
->default_pipe
);
123 kprintf(" address=%d config=%d depth=%d speed=%d self_powered=%d "
124 "power=%d langid=%d\n",
125 dev
->address
, dev
->config
, dev
->depth
, dev
->speed
,
126 dev
->self_powered
, dev
->power
, dev
->langid
);
130 usbd_dump_endpoint(struct usbd_endpoint
*endp
)
132 kprintf("usbd_dump_endpoint: endp=%p\n", endp
);
135 kprintf(" edesc=%p refcnt=%d\n", endp
->edesc
, endp
->refcnt
);
137 kprintf(" bEndpointAddress=0x%02x\n",
138 endp
->edesc
->bEndpointAddress
);
142 usbd_dump_queue(usbd_pipe_handle pipe
)
144 usbd_xfer_handle xfer
;
146 kprintf("usbd_dump_queue: pipe=%p\n", pipe
);
147 STAILQ_FOREACH(xfer
, &pipe
->queue
, next
) {
148 kprintf(" xfer=%p\n", xfer
);
153 usbd_dump_pipe(usbd_pipe_handle pipe
)
155 kprintf("usbd_dump_pipe: pipe=%p\n", pipe
);
158 usbd_dump_iface(pipe
->iface
);
159 usbd_dump_device(pipe
->device
);
160 usbd_dump_endpoint(pipe
->endpoint
);
161 kprintf(" (usbd_dump_pipe:)\n refcnt=%d running=%d aborting=%d\n",
162 pipe
->refcnt
, pipe
->running
, pipe
->aborting
);
163 kprintf(" intrxfer=%p, repeat=%d, interval=%d\n",
164 pipe
->intrxfer
, pipe
->repeat
, pipe
->interval
);
169 usbd_open_pipe(usbd_interface_handle iface
, u_int8_t address
,
170 u_int8_t flags
, usbd_pipe_handle
*pipe
)
172 return (usbd_open_pipe_ival(iface
, address
, flags
, pipe
,
173 USBD_DEFAULT_INTERVAL
));
177 usbd_open_pipe_ival(usbd_interface_handle iface
, u_int8_t address
,
178 u_int8_t flags
, usbd_pipe_handle
*pipe
, int ival
)
181 struct usbd_endpoint
*ep
;
185 DPRINTFN(3,("usbd_open_pipe: iface=%p address=0x%x flags=0x%x\n",
186 iface
, address
, flags
));
188 for (i
= 0; i
< iface
->idesc
->bNumEndpoints
; i
++) {
189 ep
= &iface
->endpoints
[i
];
190 if (ep
->edesc
== NULL
)
191 return (USBD_IOERROR
);
192 if (ep
->edesc
->bEndpointAddress
== address
)
195 return (USBD_BAD_ADDRESS
);
197 if ((flags
& USBD_EXCLUSIVE_USE
) && ep
->refcnt
!= 0)
198 return (USBD_IN_USE
);
199 err
= usbd_setup_pipe(iface
->device
, iface
, ep
, ival
, &p
);
202 LIST_INSERT_HEAD(&iface
->pipes
, p
, next
);
204 return (USBD_NORMAL_COMPLETION
);
208 usbd_open_pipe_intr(usbd_interface_handle iface
, u_int8_t address
,
209 u_int8_t flags
, usbd_pipe_handle
*pipe
,
210 usbd_private_handle priv
, void *buffer
, u_int32_t len
,
211 usbd_callback cb
, int ival
)
214 usbd_xfer_handle xfer
;
215 usbd_pipe_handle ipipe
;
217 DPRINTFN(3,("usbd_open_pipe_intr: address=0x%x flags=0x%x len=%d\n",
218 address
, flags
, len
));
220 err
= usbd_open_pipe_ival(iface
, address
, USBD_EXCLUSIVE_USE
,
224 xfer
= usbd_alloc_xfer(iface
->device
);
229 usbd_setup_xfer(xfer
, ipipe
, priv
, buffer
, len
, flags
,
230 USBD_NO_TIMEOUT
, cb
);
231 ipipe
->intrxfer
= xfer
;
233 err
= usbd_transfer(xfer
);
235 if (err
!= USBD_IN_PROGRESS
&& err
)
237 return (USBD_NORMAL_COMPLETION
);
240 ipipe
->intrxfer
= NULL
;
242 usbd_free_xfer(xfer
);
244 usbd_close_pipe(ipipe
);
249 usbd_close_pipe(usbd_pipe_handle pipe
)
253 kprintf("usbd_close_pipe: pipe==NULL\n");
254 return (USBD_NORMAL_COMPLETION
);
258 if (--pipe
->refcnt
!= 0)
259 return (USBD_NORMAL_COMPLETION
);
260 if (! STAILQ_EMPTY(&pipe
->queue
))
261 return (USBD_PENDING_REQUESTS
);
262 LIST_REMOVE(pipe
, next
);
263 pipe
->endpoint
->refcnt
--;
264 pipe
->methods
->close(pipe
);
265 if (pipe
->intrxfer
!= NULL
)
266 usbd_free_xfer(pipe
->intrxfer
);
268 return (USBD_NORMAL_COMPLETION
);
272 usbd_transfer(usbd_xfer_handle xfer
)
274 usbd_pipe_handle pipe
= xfer
->pipe
;
275 usb_dma_t
*dmap
= &xfer
->dmabuf
;
279 DPRINTFN(5,("usbd_transfer: xfer=%p, flags=%d, pipe=%p, running=%d\n",
280 xfer
, xfer
->flags
, pipe
, pipe
->running
));
283 usbd_dump_queue(pipe
);
288 return (USBD_CANCELLED
);
291 /* If there is no buffer, allocate one. */
292 if (!(xfer
->rqflags
& URQ_DEV_DMABUF
) && size
!= 0) {
293 struct usbd_bus
*bus
= pipe
->device
->bus
;
296 if (xfer
->rqflags
& URQ_AUTO_DMABUF
)
297 kprintf("usbd_transfer: has old buffer!\n");
299 err
= bus
->methods
->allocm(bus
, dmap
, size
);
302 xfer
->rqflags
|= URQ_AUTO_DMABUF
;
305 /* Copy data if going out. */
306 if (!(xfer
->flags
& USBD_NO_COPY
) && size
!= 0 &&
307 !usbd_xfer_isread(xfer
))
308 memcpy(KERNADDR(dmap
, 0), xfer
->buffer
, size
);
310 err
= pipe
->methods
->transfer(xfer
);
312 if (err
!= USBD_IN_PROGRESS
&& err
) {
313 /* The transfer has not been queued, so free buffer. */
314 if (xfer
->rqflags
& URQ_AUTO_DMABUF
) {
315 struct usbd_bus
*bus
= pipe
->device
->bus
;
317 bus
->methods
->freem(bus
, &xfer
->dmabuf
);
318 xfer
->rqflags
&= ~URQ_AUTO_DMABUF
;
322 if (!(xfer
->flags
& USBD_SYNCHRONOUS
))
325 /* Sync transfer, wait for completion. */
326 if (err
!= USBD_IN_PROGRESS
)
330 if (pipe
->device
->bus
->use_polling
)
331 panic("usbd_transfer: not done");
332 tsleep(xfer
, 0, "usbsyn", 0);
335 return (xfer
->status
);
338 /* Like usbd_transfer(), but waits for completion. */
340 usbd_sync_transfer(usbd_xfer_handle xfer
)
342 xfer
->flags
|= USBD_SYNCHRONOUS
;
343 return (usbd_transfer(xfer
));
347 usbd_alloc_buffer(usbd_xfer_handle xfer
, u_int32_t size
)
349 struct usbd_bus
*bus
= xfer
->device
->bus
;
353 if (xfer
->rqflags
& (URQ_DEV_DMABUF
| URQ_AUTO_DMABUF
))
354 kprintf("usbd_alloc_buffer: xfer already has a buffer\n");
356 err
= bus
->methods
->allocm(bus
, &xfer
->dmabuf
, size
);
359 xfer
->rqflags
|= URQ_DEV_DMABUF
;
360 return (KERNADDR(&xfer
->dmabuf
, 0));
364 usbd_free_buffer(usbd_xfer_handle xfer
)
367 if (!(xfer
->rqflags
& (URQ_DEV_DMABUF
| URQ_AUTO_DMABUF
))) {
368 kprintf("usbd_free_buffer: no buffer\n");
372 xfer
->rqflags
&= ~(URQ_DEV_DMABUF
| URQ_AUTO_DMABUF
);
373 xfer
->device
->bus
->methods
->freem(xfer
->device
->bus
, &xfer
->dmabuf
);
377 usbd_get_buffer(usbd_xfer_handle xfer
)
379 if (!(xfer
->rqflags
& URQ_DEV_DMABUF
))
381 return (KERNADDR(&xfer
->dmabuf
, 0));
385 usbd_alloc_xfer(usbd_device_handle dev
)
387 usbd_xfer_handle xfer
;
389 xfer
= dev
->bus
->methods
->allocx(dev
->bus
);
393 callout_init(&xfer
->timeout_handle
);
394 DPRINTFN(5,("usbd_alloc_xfer() = %p\n", xfer
));
399 usbd_free_xfer(usbd_xfer_handle xfer
)
401 DPRINTFN(5,("usbd_free_xfer: %p\n", xfer
));
402 if (xfer
->rqflags
& (URQ_DEV_DMABUF
| URQ_AUTO_DMABUF
))
403 usbd_free_buffer(xfer
);
404 xfer
->device
->bus
->methods
->freex(xfer
->device
->bus
, xfer
);
405 return (USBD_NORMAL_COMPLETION
);
409 usbd_setup_xfer(usbd_xfer_handle xfer
, usbd_pipe_handle pipe
,
410 usbd_private_handle priv
, void *buffer
, u_int32_t length
,
411 u_int16_t flags
, u_int32_t timeout
,
412 usbd_callback callback
)
416 xfer
->buffer
= buffer
;
417 xfer
->length
= length
;
420 xfer
->timeout
= timeout
;
421 xfer
->status
= USBD_NOT_STARTED
;
422 xfer
->callback
= callback
;
423 xfer
->rqflags
&= ~URQ_REQUEST
;
428 usbd_setup_default_xfer(usbd_xfer_handle xfer
, usbd_device_handle dev
,
429 usbd_private_handle priv
, u_int32_t timeout
,
430 usb_device_request_t
*req
, void *buffer
,
431 u_int32_t length
, u_int16_t flags
,
432 usbd_callback callback
)
434 xfer
->pipe
= dev
->default_pipe
;
436 xfer
->buffer
= buffer
;
437 xfer
->length
= length
;
440 xfer
->timeout
= timeout
;
441 xfer
->status
= USBD_NOT_STARTED
;
442 xfer
->callback
= callback
;
443 xfer
->request
= *req
;
444 xfer
->rqflags
|= URQ_REQUEST
;
449 usbd_setup_isoc_xfer(usbd_xfer_handle xfer
, usbd_pipe_handle pipe
,
450 usbd_private_handle priv
, u_int16_t
*frlengths
,
451 u_int32_t nframes
, u_int16_t flags
, usbd_callback callback
)
459 xfer
->timeout
= USBD_NO_TIMEOUT
;
460 xfer
->status
= USBD_NOT_STARTED
;
461 xfer
->callback
= callback
;
462 xfer
->rqflags
&= ~URQ_REQUEST
;
463 xfer
->frlengths
= frlengths
;
464 xfer
->nframes
= nframes
;
468 usbd_get_xfer_status(usbd_xfer_handle xfer
, usbd_private_handle
*priv
,
469 void **buffer
, u_int32_t
*count
, usbd_status
*status
)
474 *buffer
= xfer
->buffer
;
476 *count
= xfer
->actlen
;
478 *status
= xfer
->status
;
482 usbd_get_speed(usbd_device_handle dev
)
487 usb_config_descriptor_t
*
488 usbd_get_config_descriptor(usbd_device_handle dev
)
492 kprintf("usbd_get_config_descriptor: dev == NULL\n");
499 usb_interface_descriptor_t
*
500 usbd_get_interface_descriptor(usbd_interface_handle iface
)
504 kprintf("usbd_get_interface_descriptor: dev == NULL\n");
508 return (iface
->idesc
);
511 usb_device_descriptor_t
*
512 usbd_get_device_descriptor(usbd_device_handle dev
)
514 return (&dev
->ddesc
);
517 usb_endpoint_descriptor_t
*
518 usbd_interface2endpoint_descriptor(usbd_interface_handle iface
, u_int8_t index
)
520 if (index
>= iface
->idesc
->bNumEndpoints
)
522 return (iface
->endpoints
[index
].edesc
);
526 usbd_abort_pipe(usbd_pipe_handle pipe
)
532 kprintf("usbd_close_pipe: pipe==NULL\n");
533 return (USBD_NORMAL_COMPLETION
);
537 err
= usbd_ar_pipe(pipe
);
543 usbd_abort_default_pipe(usbd_device_handle dev
)
545 return (usbd_abort_pipe(dev
->default_pipe
));
549 usbd_clear_endpoint_stall(usbd_pipe_handle pipe
)
551 usbd_device_handle dev
= pipe
->device
;
552 usb_device_request_t req
;
555 DPRINTFN(8, ("usbd_clear_endpoint_stall\n"));
558 * Clearing en endpoint stall resets the endpoint toggle, so
559 * do the same to the HC toggle.
561 pipe
->methods
->cleartoggle(pipe
);
563 req
.bmRequestType
= UT_WRITE_ENDPOINT
;
564 req
.bRequest
= UR_CLEAR_FEATURE
;
565 USETW(req
.wValue
, UF_ENDPOINT_HALT
);
566 USETW(req
.wIndex
, pipe
->endpoint
->edesc
->bEndpointAddress
);
567 USETW(req
.wLength
, 0);
568 err
= usbd_do_request(dev
, &req
, 0);
570 XXX should we
do this?
572 pipe
->state
= USBD_PIPE_ACTIVE
;
573 /* XXX activate pipe */
580 usbd_clear_endpoint_stall_async(usbd_pipe_handle pipe
)
582 usbd_device_handle dev
= pipe
->device
;
583 usb_device_request_t req
;
586 pipe
->methods
->cleartoggle(pipe
);
588 req
.bmRequestType
= UT_WRITE_ENDPOINT
;
589 req
.bRequest
= UR_CLEAR_FEATURE
;
590 USETW(req
.wValue
, UF_ENDPOINT_HALT
);
591 USETW(req
.wIndex
, pipe
->endpoint
->edesc
->bEndpointAddress
);
592 USETW(req
.wLength
, 0);
593 err
= usbd_do_request_async(dev
, &req
, 0);
598 usbd_clear_endpoint_toggle(usbd_pipe_handle pipe
)
600 pipe
->methods
->cleartoggle(pipe
);
604 usbd_endpoint_count(usbd_interface_handle iface
, u_int8_t
*count
)
607 if (iface
== NULL
|| iface
->idesc
== NULL
) {
608 kprintf("usbd_endpoint_count: NULL pointer\n");
612 *count
= iface
->idesc
->bNumEndpoints
;
613 return (USBD_NORMAL_COMPLETION
);
617 usbd_interface_count(usbd_device_handle dev
, u_int8_t
*count
)
619 if (dev
->cdesc
== NULL
)
620 return (USBD_NOT_CONFIGURED
);
621 *count
= dev
->cdesc
->bNumInterface
;
622 return (USBD_NORMAL_COMPLETION
);
626 usbd_interface2device_handle(usbd_interface_handle iface
,
627 usbd_device_handle
*dev
)
629 *dev
= iface
->device
;
633 usbd_device2interface_handle(usbd_device_handle dev
,
634 u_int8_t ifaceno
, usbd_interface_handle
*iface
)
636 if (dev
->cdesc
== NULL
)
637 return (USBD_NOT_CONFIGURED
);
638 if (ifaceno
>= dev
->cdesc
->bNumInterface
)
640 *iface
= &dev
->ifaces
[ifaceno
];
641 return (USBD_NORMAL_COMPLETION
);
645 usbd_pipe2device_handle(usbd_pipe_handle pipe
)
647 return (pipe
->device
);
652 usbd_set_interface(usbd_interface_handle iface
, int altidx
)
654 usb_device_request_t req
;
658 if (LIST_FIRST(&iface
->pipes
) != 0)
659 return (USBD_IN_USE
);
661 endpoints
= iface
->endpoints
;
662 err
= usbd_fill_iface_data(iface
->device
, iface
->index
, altidx
);
666 /* new setting works, we can free old endpoints */
667 if (endpoints
!= NULL
)
668 kfree(endpoints
, M_USB
);
671 if (iface
->idesc
== NULL
) {
672 kprintf("usbd_set_interface: NULL pointer\n");
677 req
.bmRequestType
= UT_WRITE_INTERFACE
;
678 req
.bRequest
= UR_SET_INTERFACE
;
679 USETW(req
.wValue
, iface
->idesc
->bAlternateSetting
);
680 USETW(req
.wIndex
, iface
->idesc
->bInterfaceNumber
);
681 USETW(req
.wLength
, 0);
682 return (usbd_do_request(iface
->device
, &req
, 0));
686 usbd_get_no_alts(usb_config_descriptor_t
*cdesc
, int ifaceno
)
688 char *p
= (char *)cdesc
;
689 char *end
= p
+ UGETW(cdesc
->wTotalLength
);
690 usb_interface_descriptor_t
*d
;
693 for (n
= 0; p
< end
; p
+= d
->bLength
) {
694 d
= (usb_interface_descriptor_t
*)p
;
695 if (p
+ d
->bLength
<= end
&&
696 d
->bDescriptorType
== UDESC_INTERFACE
&&
697 d
->bInterfaceNumber
== ifaceno
)
704 usbd_get_interface_altindex(usbd_interface_handle iface
)
706 return (iface
->altindex
);
710 usbd_get_interface(usbd_interface_handle iface
, u_int8_t
*aiface
)
712 usb_device_request_t req
;
714 req
.bmRequestType
= UT_READ_INTERFACE
;
715 req
.bRequest
= UR_GET_INTERFACE
;
716 USETW(req
.wValue
, 0);
717 USETW(req
.wIndex
, iface
->idesc
->bInterfaceNumber
);
718 USETW(req
.wLength
, 1);
719 return (usbd_do_request(iface
->device
, &req
, aiface
));
722 /*** Internal routines ***/
724 /* Dequeue all pipe operations, called from critical section. */
726 usbd_ar_pipe(usbd_pipe_handle pipe
)
728 usbd_xfer_handle xfer
;
730 DPRINTFN(2,("usbd_ar_pipe: pipe=%p\n", pipe
));
733 usbd_dump_queue(pipe
);
737 while ((xfer
= STAILQ_FIRST(&pipe
->queue
)) != NULL
) {
738 DPRINTFN(2,("usbd_ar_pipe: pipe=%p xfer=%p (methods=%p)\n",
739 pipe
, xfer
, pipe
->methods
));
740 /* Make the HC abort it (and invoke the callback). */
741 pipe
->methods
->abort(xfer
);
742 /* XXX only for non-0 usbd_clear_endpoint_stall(pipe); */
745 return (USBD_NORMAL_COMPLETION
);
748 /* Called from critical section */
750 usb_transfer_complete(usbd_xfer_handle xfer
)
752 usbd_pipe_handle pipe
= xfer
->pipe
;
753 usb_dma_t
*dmap
= &xfer
->dmabuf
;
754 int sync
= xfer
->flags
& USBD_SYNCHRONOUS
;
755 int erred
= xfer
->status
== USBD_CANCELLED
||
756 xfer
->status
== USBD_TIMEOUT
;
757 int repeat
= pipe
->repeat
;
760 DPRINTFN(5, ("usb_transfer_complete: pipe=%p xfer=%p status=%d "
761 "actlen=%d\n", pipe
, xfer
, xfer
->status
, xfer
->actlen
));
763 if (xfer
->busy_free
!= XFER_ONQU
) {
764 kprintf("usb_transfer_complete: xfer=%p not busy 0x%08x\n",
765 xfer
, xfer
->busy_free
);
772 kprintf("usbd_transfer_cb: pipe==0, xfer=%p\n", xfer
);
776 polling
= pipe
->device
->bus
->use_polling
;
781 if (!(xfer
->flags
& USBD_NO_COPY
) && xfer
->actlen
!= 0 &&
782 usbd_xfer_isread(xfer
)) {
784 if (xfer
->actlen
> xfer
->length
) {
785 kprintf("usb_transfer_complete: actlen > len %d > %d\n",
786 xfer
->actlen
, xfer
->length
);
787 xfer
->actlen
= xfer
->length
;
790 memcpy(xfer
->buffer
, KERNADDR(dmap
, 0), xfer
->actlen
);
793 /* if we allocated the buffer in usbd_transfer() we free it here. */
794 if (xfer
->rqflags
& URQ_AUTO_DMABUF
) {
796 struct usbd_bus
*bus
= pipe
->device
->bus
;
797 bus
->methods
->freem(bus
, dmap
);
798 xfer
->rqflags
&= ~URQ_AUTO_DMABUF
;
803 /* Remove request from queue. */
805 if (xfer
!= STAILQ_FIRST(&pipe
->queue
))
806 kprintf("usb_transfer_complete: bad dequeue %p != %p\n",
807 xfer
, STAILQ_FIRST(&pipe
->queue
));
808 xfer
->busy_free
= XFER_BUSY
;
810 STAILQ_REMOVE_HEAD(&pipe
->queue
, next
);
812 DPRINTFN(5,("usb_transfer_complete: repeat=%d new head=%p\n",
813 repeat
, STAILQ_FIRST(&pipe
->queue
)));
815 /* Count completed transfers. */
816 ++pipe
->device
->bus
->stats
.uds_requests
817 [pipe
->endpoint
->edesc
->bmAttributes
& UE_XFERTYPE
];
820 if (!xfer
->status
&& xfer
->actlen
< xfer
->length
&&
821 !(xfer
->flags
& USBD_SHORT_XFER_OK
)) {
822 DPRINTFN(-1,("usbd_transfer_cb: short transfer %d<%d\n",
823 xfer
->actlen
, xfer
->length
));
824 xfer
->status
= USBD_SHORT_XFER
;
828 * For repeat operations, call the callback first, as the xfer
829 * will not go away and the "done" method may modify it. Otherwise
830 * reverse the order in case the callback wants to free or reuse
833 * USBD_CALLBACK_LAST is set by the keyboard driver to ensure
834 * that the xfer is restarted prior to doing the callback.
835 * Otherwise a CTL-ALT-ESC into the debugger will leave the
836 * xfer inactive and the keyboard will stop working.
838 if (repeat
&& (xfer
->flags
& USBD_CALLBACK_LAST
) == 0) {
840 xfer
->callback(xfer
, xfer
->priv
, xfer
->status
);
841 pipe
->methods
->done(xfer
);
843 pipe
->methods
->done(xfer
);
845 xfer
->callback(xfer
, xfer
->priv
, xfer
->status
);
848 if (sync
&& !polling
)
852 /* XXX should we stop the queue on all errors? */
853 if (erred
&& pipe
->iface
!= NULL
) /* not control pipe */
856 usbd_start_next(pipe
);
861 usb_insert_transfer(usbd_xfer_handle xfer
)
863 usbd_pipe_handle pipe
= xfer
->pipe
;
866 DPRINTFN(5,("usb_insert_transfer: pipe=%p running=%d timeout=%d\n",
867 pipe
, pipe
->running
, xfer
->timeout
));
869 if (xfer
->busy_free
!= XFER_BUSY
) {
870 kprintf("usb_insert_transfer: xfer=%p not busy 0x%08x\n",
871 xfer
, xfer
->busy_free
);
874 xfer
->busy_free
= XFER_ONQU
;
877 STAILQ_INSERT_TAIL(&pipe
->queue
, xfer
, next
);
879 err
= USBD_IN_PROGRESS
;
882 err
= USBD_NORMAL_COMPLETION
;
888 /* Called from critical section */
890 usbd_start_next(usbd_pipe_handle pipe
)
892 usbd_xfer_handle xfer
;
897 kprintf("usbd_start_next: pipe == NULL\n");
900 if (pipe
->methods
== NULL
|| pipe
->methods
->start
== NULL
) {
901 kprintf("usbd_start_next: pipe=%p no start method\n", pipe
);
906 /* Get next request in queue. */
907 xfer
= STAILQ_FIRST(&pipe
->queue
);
908 DPRINTFN(5, ("usbd_start_next: pipe=%p, xfer=%p\n", pipe
, xfer
));
912 err
= pipe
->methods
->start(xfer
);
913 if (err
!= USBD_IN_PROGRESS
) {
914 kprintf("usbd_start_next: error=%d\n", err
);
922 usbd_do_request(usbd_device_handle dev
, usb_device_request_t
*req
, void *data
)
924 return (usbd_do_request_flags(dev
, req
, data
, 0, 0,
925 USBD_DEFAULT_TIMEOUT
));
929 usbd_do_request_flags(usbd_device_handle dev
, usb_device_request_t
*req
,
930 void *data
, u_int16_t flags
, int *actlen
, u_int32_t timo
)
932 return (usbd_do_request_flags_pipe(dev
, dev
->default_pipe
, req
,
933 data
, flags
, actlen
, timo
));
937 usbd_do_request_flags_pipe(usbd_device_handle dev
, usbd_pipe_handle pipe
,
938 usb_device_request_t
*req
, void *data
, u_int16_t flags
, int *actlen
,
941 usbd_xfer_handle xfer
;
945 KASSERT(mycpu
->gd_intr_nesting_level
== 0,
946 ("usbd_do_request: in interrupt context"));
947 if (dev
->bus
->intr_context
) {
948 kprintf("usbd_do_request: not in process context\n");
953 xfer
= usbd_alloc_xfer(dev
);
956 usbd_setup_default_xfer(xfer
, dev
, 0, timeout
, req
,
957 data
, UGETW(req
->wLength
), flags
, 0);
959 err
= usbd_sync_transfer(xfer
);
960 #if defined(USB_DEBUG) || defined(DIAGNOSTIC)
961 if (xfer
->actlen
> xfer
->length
)
962 DPRINTF(("usbd_do_request: overrun addr=%d type=0x%02x req=0x"
963 "%02x val=%d index=%d rlen=%d length=%d actlen=%d\n",
964 dev
->address
, xfer
->request
.bmRequestType
,
965 xfer
->request
.bRequest
, UGETW(xfer
->request
.wValue
),
966 UGETW(xfer
->request
.wIndex
),
967 UGETW(xfer
->request
.wLength
),
968 xfer
->length
, xfer
->actlen
));
971 *actlen
= xfer
->actlen
;
972 if (err
== USBD_STALLED
) {
974 * The control endpoint has stalled. Control endpoints
975 * should not halt, but some may do so anyway so clear
976 * any halt condition.
978 usb_device_request_t treq
;
983 treq
.bmRequestType
= UT_READ_ENDPOINT
;
984 treq
.bRequest
= UR_GET_STATUS
;
985 USETW(treq
.wValue
, 0);
986 USETW(treq
.wIndex
, 0);
987 USETW(treq
.wLength
, sizeof(usb_status_t
));
988 usbd_setup_default_xfer(xfer
, dev
, 0, USBD_DEFAULT_TIMEOUT
,
989 &treq
, &status
,sizeof(usb_status_t
),
991 nerr
= usbd_sync_transfer(xfer
);
994 s
= UGETW(status
.wStatus
);
995 DPRINTF(("usbd_do_request: status = 0x%04x\n", s
));
998 treq
.bmRequestType
= UT_WRITE_ENDPOINT
;
999 treq
.bRequest
= UR_CLEAR_FEATURE
;
1000 USETW(treq
.wValue
, UF_ENDPOINT_HALT
);
1001 USETW(treq
.wIndex
, 0);
1002 USETW(treq
.wLength
, 0);
1003 usbd_setup_default_xfer(xfer
, dev
, 0, USBD_DEFAULT_TIMEOUT
,
1004 &treq
, &status
, 0, 0, 0);
1005 nerr
= usbd_sync_transfer(xfer
);
1011 usbd_free_xfer(xfer
);
1016 usbd_do_request_async_cb(usbd_xfer_handle xfer
, usbd_private_handle priv
,
1019 #if defined(USB_DEBUG) || defined(DIAGNOSTIC)
1020 if (xfer
->actlen
> xfer
->length
)
1021 DPRINTF(("usbd_do_request: overrun addr=%d type=0x%02x req=0x"
1022 "%02x val=%d index=%d rlen=%d length=%d actlen=%d\n",
1023 xfer
->pipe
->device
->address
,
1024 xfer
->request
.bmRequestType
,
1025 xfer
->request
.bRequest
, UGETW(xfer
->request
.wValue
),
1026 UGETW(xfer
->request
.wIndex
),
1027 UGETW(xfer
->request
.wLength
),
1028 xfer
->length
, xfer
->actlen
));
1030 usbd_free_xfer(xfer
);
1034 * Execute a request without waiting for completion.
1035 * Can be used from interrupt context.
1038 usbd_do_request_async(usbd_device_handle dev
, usb_device_request_t
*req
,
1041 usbd_xfer_handle xfer
;
1044 xfer
= usbd_alloc_xfer(dev
);
1046 return (USBD_NOMEM
);
1047 usbd_setup_default_xfer(xfer
, dev
, 0, USBD_DEFAULT_TIMEOUT
, req
,
1048 data
, UGETW(req
->wLength
), 0, usbd_do_request_async_cb
);
1049 err
= usbd_transfer(xfer
);
1050 if (err
!= USBD_IN_PROGRESS
&& err
) {
1051 usbd_free_xfer(xfer
);
1054 return (USBD_NORMAL_COMPLETION
);
1057 const struct usbd_quirks
*
1058 usbd_get_quirks(usbd_device_handle dev
)
1062 kprintf("usbd_get_quirks: dev == NULL\n");
1066 return (dev
->quirks
);
1069 /* XXX do periodic free() of free list */
1072 * Called from keyboard driver when in polling mode.
1075 usbd_dopoll(usbd_interface_handle iface
)
1077 iface
->device
->bus
->methods
->do_poll(iface
->device
->bus
);
1081 usbd_set_polling(usbd_device_handle dev
, int on
)
1084 dev
->bus
->use_polling
++;
1086 dev
->bus
->use_polling
--;
1087 /* When polling we need to make sure there is nothing pending to do. */
1088 if (dev
->bus
->use_polling
)
1089 dev
->bus
->methods
->soft_intr(dev
->bus
);
1093 usb_endpoint_descriptor_t
*
1094 usbd_get_endpoint_descriptor(usbd_interface_handle iface
, u_int8_t address
)
1096 struct usbd_endpoint
*ep
;
1099 for (i
= 0; i
< iface
->idesc
->bNumEndpoints
; i
++) {
1100 ep
= &iface
->endpoints
[i
];
1101 if (ep
->edesc
->bEndpointAddress
== address
)
1102 return (iface
->endpoints
[i
].edesc
);
1108 * usbd_ratecheck() can limit the number of error messages that occurs.
1109 * When a device is unplugged it may take up to 0.25s for the hub driver
1110 * to notice it. If the driver continuosly tries to do I/O operations
1111 * this can generate a large number of messages.
1114 usbd_ratecheck(struct timeval
*last
)
1116 if (last
->tv_sec
== time_second
)
1118 last
->tv_sec
= time_second
;
1123 * Search for a vendor/product pair in an array. The item size is
1124 * given as an argument.
1126 const struct usb_devno
*
1127 usb_match_device(const struct usb_devno
*tbl
, u_int nentries
, u_int sz
,
1128 u_int16_t vendor
, u_int16_t product
)
1130 while (nentries
-- > 0) {
1131 u_int16_t tproduct
= tbl
->ud_product
;
1132 if (tbl
->ud_vendor
== vendor
&&
1133 (tproduct
== product
|| tproduct
== USB_PRODUCT_ANY
))
1135 tbl
= (const struct usb_devno
*)((const char *)tbl
+ sz
);
1142 usb_desc_iter_init(usbd_device_handle dev
, usbd_desc_iter_t
*iter
)
1144 const usb_config_descriptor_t
*cd
= usbd_get_config_descriptor(dev
);
1146 iter
->cur
= (const uByte
*)cd
;
1147 iter
->end
= (const uByte
*)cd
+ UGETW(cd
->wTotalLength
);
1150 const usb_descriptor_t
*
1151 usb_desc_iter_next(usbd_desc_iter_t
*iter
)
1153 const usb_descriptor_t
*desc
;
1155 if (iter
->cur
+ sizeof(usb_descriptor_t
) >= iter
->end
) {
1156 if (iter
->cur
!= iter
->end
)
1157 kprintf("usb_desc_iter_next: bad descriptor\n");
1160 desc
= (const usb_descriptor_t
*)iter
->cur
;
1161 if (desc
->bLength
== 0) {
1162 kprintf("usb_desc_iter_next: descriptor length = 0\n");
1165 iter
->cur
+= desc
->bLength
;
1166 if (iter
->cur
> iter
->end
) {
1167 kprintf("usb_desc_iter_next: descriptor length too large\n");
1174 usbd_get_string(usbd_device_handle dev
, int si
, char *buf
)
1176 int swap
= dev
->quirks
->uq_flags
& UQ_SWAP_UNICODE
;
1177 usb_string_descriptor_t us
;
1186 return (USBD_INVAL
);
1187 if (dev
->quirks
->uq_flags
& UQ_NO_STRINGS
)
1188 return (USBD_STALLED
);
1189 if (dev
->langid
== USBD_NOLANG
) {
1190 /* Set up default language */
1191 err
= usbd_get_string_desc(dev
, USB_LANGUAGE_TABLE
, 0, &us
,
1193 if (err
|| size
< 4) {
1194 DPRINTFN(-1,("usbd_get_string: getting lang failed, using 0\n"));
1195 dev
->langid
= 0; /* Well, just pick something then */
1197 /* Pick the first language as the default. */
1198 dev
->langid
= UGETW(us
.bString
[0]);
1201 err
= usbd_get_string_desc(dev
, si
, dev
->langid
, &us
, &size
);
1206 for (i
= 0; i
< n
; i
++) {
1207 c
= UGETW(us
.bString
[i
]);
1208 /* Convert from Unicode, handle buggy strings. */
1209 if ((c
& 0xff00) == 0)
1211 else if ((c
& 0x00ff) == 0 && swap
)
1217 return (USBD_NORMAL_COMPLETION
);
1221 usbd_driver_load(module_t mod
, int what
, void *arg
)
1223 /* XXX should implement something like a function that removes all generic devices */