Sync ACPICA with Intel's version 20170831.
[dragonfly.git] / sys / bus / u4b / usb_handle_request.c
blob82180caee4d011a9d7dcd006bd57b0db046fa63e
1 /* $FreeBSD: head/sys/dev/usb/usb_handle_request.c 246759 2013-02-13 12:35:17Z hselasky $ */
2 /*-
3 * Copyright (c) 2008 Hans Petter Selasky. All rights reserved.
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
14 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24 * SUCH DAMAGE.
27 #include <sys/stdint.h>
28 #include <sys/param.h>
29 #include <sys/queue.h>
30 #include <sys/types.h>
31 #include <sys/systm.h>
32 #include <sys/kernel.h>
33 #include <sys/bus.h>
34 #include <sys/module.h>
35 #include <sys/lock.h>
36 #include <sys/mutex.h>
37 #include <sys/condvar.h>
38 #include <sys/sysctl.h>
39 #include <sys/unistd.h>
40 #include <sys/callout.h>
41 #include <sys/malloc.h>
42 #include <sys/priv.h>
44 #include <bus/u4b/usb.h>
45 #include <bus/u4b/usbdi.h>
46 #include <bus/u4b/usbdi_util.h>
47 #include "usb_if.h"
49 #define USB_DEBUG_VAR usb_debug
51 #include <bus/u4b/usb_core.h>
52 #include <bus/u4b/usb_process.h>
53 #include <bus/u4b/usb_busdma.h>
54 #include <bus/u4b/usb_transfer.h>
55 #include <bus/u4b/usb_device.h>
56 #include <bus/u4b/usb_debug.h>
57 #include <bus/u4b/usb_dynamic.h>
58 #include <bus/u4b/usb_hub.h>
60 #include <bus/u4b/usb_controller.h>
61 #include <bus/u4b/usb_bus.h>
63 /* function prototypes */
65 static uint8_t usb_handle_get_stall(struct usb_device *, uint8_t);
66 static usb_error_t usb_handle_remote_wakeup(struct usb_xfer *, uint8_t);
67 static usb_error_t usb_handle_request(struct usb_xfer *);
68 static usb_error_t usb_handle_set_config(struct usb_xfer *, uint8_t);
69 static usb_error_t usb_handle_set_stall(struct usb_xfer *, uint8_t,
70 uint8_t);
71 static usb_error_t usb_handle_iface_request(struct usb_xfer *, void **,
72 uint16_t *, struct usb_device_request, uint16_t,
73 uint8_t);
75 /*------------------------------------------------------------------------*
76 * usb_handle_request_callback
78 * This function is the USB callback for generic USB Device control
79 * transfers.
80 *------------------------------------------------------------------------*/
81 void
82 usb_handle_request_callback(struct usb_xfer *xfer, usb_error_t error)
84 usb_error_t err;
86 /* check the current transfer state */
88 switch (USB_GET_STATE(xfer)) {
89 case USB_ST_SETUP:
90 case USB_ST_TRANSFERRED:
92 /* handle the request */
93 err = usb_handle_request(xfer);
95 if (err) {
97 if (err == USB_ERR_BAD_CONTEXT) {
98 /* we need to re-setup the control transfer */
99 usb_needs_explore(xfer->xroot->bus, 0);
100 break;
102 goto tr_restart;
104 usbd_transfer_submit(xfer);
105 break;
107 default:
108 /* check if a control transfer is active */
109 if (xfer->flags_int.control_rem != 0xFFFF) {
110 /* handle the request */
111 err = usb_handle_request(xfer);
113 if (xfer->error != USB_ERR_CANCELLED) {
114 /* should not happen - try stalling */
115 goto tr_restart;
117 break;
119 return;
121 tr_restart:
123 * If a control transfer is active, stall it, and wait for the
124 * next control transfer.
126 usbd_xfer_set_frame_len(xfer, 0, sizeof(struct usb_device_request));
127 xfer->nframes = 1;
128 xfer->flags.manual_status = 1;
129 xfer->flags.force_short_xfer = 0;
130 usbd_xfer_set_stall(xfer); /* cancel previous transfer, if any */
131 usbd_transfer_submit(xfer);
134 /*------------------------------------------------------------------------*
135 * usb_handle_set_config
137 * Returns:
138 * 0: Success
139 * Else: Failure
140 *------------------------------------------------------------------------*/
141 static usb_error_t
142 usb_handle_set_config(struct usb_xfer *xfer, uint8_t conf_no)
144 struct usb_device *udev = xfer->xroot->udev;
145 usb_error_t err = 0;
146 uint8_t do_unlock;
149 * We need to protect against other threads doing probe and
150 * attach:
152 USB_XFER_UNLOCK(xfer);
154 /* Prevent re-enumeration */
155 do_unlock = usbd_enum_lock(udev);
157 if (conf_no == USB_UNCONFIG_NO) {
158 conf_no = USB_UNCONFIG_INDEX;
159 } else {
161 * The relationship between config number and config index
162 * is very simple in our case:
164 conf_no--;
167 if (usbd_set_config_index(udev, conf_no)) {
168 DPRINTF("set config %d failed\n", conf_no);
169 err = USB_ERR_STALLED;
170 goto done;
172 if (usb_probe_and_attach(udev, USB_IFACE_INDEX_ANY)) {
173 DPRINTF("probe and attach failed\n");
174 err = USB_ERR_STALLED;
175 goto done;
177 done:
178 if (do_unlock)
179 usbd_enum_unlock(udev);
180 USB_XFER_LOCK(xfer);
181 return (err);
184 static usb_error_t
185 usb_check_alt_setting(struct usb_device *udev,
186 struct usb_interface *iface, uint8_t alt_index)
188 uint8_t do_unlock;
189 usb_error_t err = 0;
191 /* Prevent re-enumeration */
192 do_unlock = usbd_enum_lock(udev);
194 if (alt_index >= usbd_get_no_alts(udev->cdesc, iface->idesc))
195 err = USB_ERR_INVAL;
197 if (do_unlock)
198 usbd_enum_unlock(udev);
200 return (err);
203 /*------------------------------------------------------------------------*
204 * usb_handle_iface_request
206 * Returns:
207 * 0: Success
208 * Else: Failure
209 *------------------------------------------------------------------------*/
210 static usb_error_t
211 usb_handle_iface_request(struct usb_xfer *xfer,
212 void **ppdata, uint16_t *plen,
213 struct usb_device_request req, uint16_t off, uint8_t state)
215 struct usb_interface *iface;
216 struct usb_interface *iface_parent; /* parent interface */
217 struct usb_device *udev = xfer->xroot->udev;
218 int error;
219 uint8_t iface_index;
220 uint8_t temp_state;
221 uint8_t do_unlock;
223 if ((req.bmRequestType & 0x1F) == UT_INTERFACE) {
224 iface_index = req.wIndex[0]; /* unicast */
225 } else {
226 iface_index = 0; /* broadcast */
230 * We need to protect against other threads doing probe and
231 * attach:
233 USB_XFER_UNLOCK(xfer);
235 /* Prevent re-enumeration */
236 do_unlock = usbd_enum_lock(udev);
238 error = ENXIO;
240 tr_repeat:
241 iface = usbd_get_iface(udev, iface_index);
242 if ((iface == NULL) ||
243 (iface->idesc == NULL)) {
244 /* end of interfaces non-existing interface */
245 goto tr_stalled;
247 /* set initial state */
249 temp_state = state;
251 /* forward request to interface, if any */
253 if ((error != 0) &&
254 (error != ENOTTY) &&
255 (iface->subdev != NULL) &&
256 device_is_attached(iface->subdev)) {
257 #if 0
258 DEVMETHOD(usb_handle_request, NULL); /* dummy */
259 #endif
260 error = USB_HANDLE_REQUEST(iface->subdev,
261 &req, ppdata, plen,
262 off, &temp_state);
264 iface_parent = usbd_get_iface(udev, iface->parent_iface_index);
266 if ((iface_parent == NULL) ||
267 (iface_parent->idesc == NULL)) {
268 /* non-existing interface */
269 iface_parent = NULL;
271 /* forward request to parent interface, if any */
273 if ((error != 0) &&
274 (error != ENOTTY) &&
275 (iface_parent != NULL) &&
276 (iface_parent->subdev != NULL) &&
277 ((req.bmRequestType & 0x1F) == UT_INTERFACE) &&
278 (iface_parent->subdev != iface->subdev) &&
279 device_is_attached(iface_parent->subdev)) {
280 error = USB_HANDLE_REQUEST(iface_parent->subdev,
281 &req, ppdata, plen, off, &temp_state);
283 if (error == 0) {
284 /* negativly adjust pointer and length */
285 *ppdata = ((uint8_t *)(*ppdata)) - off;
286 *plen += off;
288 if ((state == USB_HR_NOT_COMPLETE) &&
289 (temp_state == USB_HR_COMPLETE_OK))
290 goto tr_short;
291 else
292 goto tr_valid;
293 } else if (error == ENOTTY) {
294 goto tr_stalled;
296 if ((req.bmRequestType & 0x1F) != UT_INTERFACE) {
297 iface_index++; /* iterate */
298 goto tr_repeat;
300 if (state != USB_HR_NOT_COMPLETE) {
301 /* we are complete */
302 goto tr_valid;
304 switch (req.bmRequestType) {
305 case UT_WRITE_INTERFACE:
306 switch (req.bRequest) {
307 case UR_SET_INTERFACE:
309 * We assume that the endpoints are the same
310 * accross the alternate settings.
312 * Reset the endpoints, because re-attaching
313 * only a part of the device is not possible.
315 error = usb_check_alt_setting(udev,
316 iface, req.wValue[0]);
317 if (error) {
318 DPRINTF("alt setting does not exist %s\n",
319 usbd_errstr(error));
320 goto tr_stalled;
322 error = usb_reset_iface_endpoints(udev, iface_index);
323 if (error) {
324 DPRINTF("alt setting failed %s\n",
325 usbd_errstr(error));
326 goto tr_stalled;
328 /* update the current alternate setting */
329 iface->alt_index = req.wValue[0];
330 break;
332 default:
333 goto tr_stalled;
335 break;
337 case UT_READ_INTERFACE:
338 switch (req.bRequest) {
339 case UR_GET_INTERFACE:
340 *ppdata = &iface->alt_index;
341 *plen = 1;
342 break;
344 default:
345 goto tr_stalled;
347 break;
348 default:
349 goto tr_stalled;
351 tr_valid:
352 if (do_unlock)
353 usbd_enum_unlock(udev);
354 USB_XFER_LOCK(xfer);
355 return (0);
357 tr_short:
358 if (do_unlock)
359 usbd_enum_unlock(udev);
360 USB_XFER_LOCK(xfer);
361 return (USB_ERR_SHORT_XFER);
363 tr_stalled:
364 if (do_unlock)
365 usbd_enum_unlock(udev);
366 USB_XFER_LOCK(xfer);
367 return (USB_ERR_STALLED);
370 /*------------------------------------------------------------------------*
371 * usb_handle_stall
373 * Returns:
374 * 0: Success
375 * Else: Failure
376 *------------------------------------------------------------------------*/
377 static usb_error_t
378 usb_handle_set_stall(struct usb_xfer *xfer, uint8_t ep, uint8_t do_stall)
380 struct usb_device *udev = xfer->xroot->udev;
381 usb_error_t err;
383 USB_XFER_UNLOCK(xfer);
384 err = usbd_set_endpoint_stall(udev,
385 usbd_get_ep_by_addr(udev, ep), do_stall);
386 USB_XFER_LOCK(xfer);
387 return (err);
390 /*------------------------------------------------------------------------*
391 * usb_handle_get_stall
393 * Returns:
394 * 0: Success
395 * Else: Failure
396 *------------------------------------------------------------------------*/
397 static uint8_t
398 usb_handle_get_stall(struct usb_device *udev, uint8_t ea_val)
400 struct usb_endpoint *ep;
401 uint8_t halted;
403 ep = usbd_get_ep_by_addr(udev, ea_val);
404 if (ep == NULL) {
405 /* nothing to do */
406 return (0);
408 USB_BUS_LOCK(udev->bus);
409 halted = ep->is_stalled;
410 USB_BUS_UNLOCK(udev->bus);
412 return (halted);
415 /*------------------------------------------------------------------------*
416 * usb_handle_remote_wakeup
418 * Returns:
419 * 0: Success
420 * Else: Failure
421 *------------------------------------------------------------------------*/
422 static usb_error_t
423 usb_handle_remote_wakeup(struct usb_xfer *xfer, uint8_t is_on)
425 struct usb_device *udev;
426 struct usb_bus *bus;
428 udev = xfer->xroot->udev;
429 bus = udev->bus;
431 USB_BUS_LOCK(bus);
433 if (is_on) {
434 udev->flags.remote_wakeup = 1;
435 } else {
436 udev->flags.remote_wakeup = 0;
439 USB_BUS_UNLOCK(bus);
441 #if USB_HAVE_POWERD
442 /* In case we are out of sync, update the power state. */
443 usb_bus_power_update(udev->bus);
444 #endif
445 return (0); /* success */
448 /*------------------------------------------------------------------------*
449 * usb_handle_request
451 * Internal state sequence:
453 * USB_HR_NOT_COMPLETE -> USB_HR_COMPLETE_OK v USB_HR_COMPLETE_ERR
455 * Returns:
456 * 0: Ready to start hardware
457 * Else: Stall current transfer, if any
458 *------------------------------------------------------------------------*/
459 static usb_error_t
460 usb_handle_request(struct usb_xfer *xfer)
462 struct usb_device_request req;
463 struct usb_device *udev;
464 const void *src_zcopy; /* zero-copy source pointer */
465 const void *src_mcopy; /* non zero-copy source pointer */
466 uint16_t off; /* data offset */
467 uint16_t rem; /* data remainder */
468 uint16_t max_len; /* max fragment length */
469 uint16_t wValue;
470 uint8_t state;
471 uint8_t is_complete = 1;
472 usb_error_t err;
473 union {
474 uWord wStatus;
475 uint8_t buf[2];
476 } temp;
479 * Filter the USB transfer state into
480 * something which we understand:
483 switch (USB_GET_STATE(xfer)) {
484 case USB_ST_SETUP:
485 state = USB_HR_NOT_COMPLETE;
487 if (!xfer->flags_int.control_act) {
488 /* nothing to do */
489 goto tr_stalled;
491 break;
492 case USB_ST_TRANSFERRED:
493 if (!xfer->flags_int.control_act) {
494 state = USB_HR_COMPLETE_OK;
495 } else {
496 state = USB_HR_NOT_COMPLETE;
498 break;
499 default:
500 state = USB_HR_COMPLETE_ERR;
501 break;
504 /* reset frame stuff */
506 usbd_xfer_set_frame_len(xfer, 0, 0);
508 usbd_xfer_set_frame_offset(xfer, 0, 0);
509 usbd_xfer_set_frame_offset(xfer, sizeof(req), 1);
511 /* get the current request, if any */
513 usbd_copy_out(xfer->frbuffers, 0, &req, sizeof(req));
515 if (xfer->flags_int.control_rem == 0xFFFF) {
516 /* first time - not initialised */
517 rem = UGETW(req.wLength);
518 off = 0;
519 } else {
520 /* not first time - initialised */
521 rem = xfer->flags_int.control_rem;
522 off = UGETW(req.wLength) - rem;
525 /* set some defaults */
527 max_len = 0;
528 src_zcopy = NULL;
529 src_mcopy = NULL;
530 udev = xfer->xroot->udev;
532 /* get some request fields decoded */
534 wValue = UGETW(req.wValue);
536 DPRINTF("req 0x%02x 0x%02x 0x%04x 0x%04x "
537 "off=0x%x rem=0x%x, state=%d\n", req.bmRequestType,
538 req.bRequest, wValue, UGETW(req.wIndex), off, rem, state);
540 /* demultiplex the control request */
542 switch (req.bmRequestType) {
543 case UT_READ_DEVICE:
544 if (state != USB_HR_NOT_COMPLETE) {
545 break;
547 switch (req.bRequest) {
548 case UR_GET_DESCRIPTOR:
549 goto tr_handle_get_descriptor;
550 case UR_GET_CONFIG:
551 goto tr_handle_get_config;
552 case UR_GET_STATUS:
553 goto tr_handle_get_status;
554 default:
555 goto tr_stalled;
557 break;
559 case UT_WRITE_DEVICE:
560 switch (req.bRequest) {
561 case UR_SET_ADDRESS:
562 goto tr_handle_set_address;
563 case UR_SET_CONFIG:
564 goto tr_handle_set_config;
565 case UR_CLEAR_FEATURE:
566 switch (wValue) {
567 case UF_DEVICE_REMOTE_WAKEUP:
568 goto tr_handle_clear_wakeup;
569 default:
570 goto tr_stalled;
572 break;
573 case UR_SET_FEATURE:
574 switch (wValue) {
575 case UF_DEVICE_REMOTE_WAKEUP:
576 goto tr_handle_set_wakeup;
577 default:
578 goto tr_stalled;
580 break;
581 default:
582 goto tr_stalled;
584 break;
586 case UT_WRITE_ENDPOINT:
587 switch (req.bRequest) {
588 case UR_CLEAR_FEATURE:
589 switch (wValue) {
590 case UF_ENDPOINT_HALT:
591 goto tr_handle_clear_halt;
592 default:
593 goto tr_stalled;
595 break;
596 case UR_SET_FEATURE:
597 switch (wValue) {
598 case UF_ENDPOINT_HALT:
599 goto tr_handle_set_halt;
600 default:
601 goto tr_stalled;
603 break;
604 default:
605 goto tr_stalled;
607 break;
609 case UT_READ_ENDPOINT:
610 switch (req.bRequest) {
611 case UR_GET_STATUS:
612 goto tr_handle_get_ep_status;
613 default:
614 goto tr_stalled;
616 break;
617 default:
618 /* we use "USB_ADD_BYTES" to de-const the src_zcopy */
619 err = usb_handle_iface_request(xfer,
620 USB_ADD_BYTES(&src_zcopy, 0),
621 &max_len, req, off, state);
622 if (err == 0) {
623 is_complete = 0;
624 goto tr_valid;
625 } else if (err == USB_ERR_SHORT_XFER) {
626 goto tr_valid;
629 * Reset zero-copy pointer and max length
630 * variable in case they were unintentionally
631 * set:
633 src_zcopy = NULL;
634 max_len = 0;
637 * Check if we have a vendor specific
638 * descriptor:
640 goto tr_handle_get_descriptor;
642 goto tr_valid;
644 tr_handle_get_descriptor:
645 err = (usb_temp_get_desc_p) (udev, &req, &src_zcopy, &max_len);
646 if (err)
647 goto tr_stalled;
648 if (src_zcopy == NULL)
649 goto tr_stalled;
650 goto tr_valid;
652 tr_handle_get_config:
653 temp.buf[0] = udev->curr_config_no;
654 src_mcopy = temp.buf;
655 max_len = 1;
656 goto tr_valid;
658 tr_handle_get_status:
660 wValue = 0;
662 USB_BUS_LOCK(udev->bus);
663 if (udev->flags.remote_wakeup) {
664 wValue |= UDS_REMOTE_WAKEUP;
666 if (udev->flags.self_powered) {
667 wValue |= UDS_SELF_POWERED;
669 USB_BUS_UNLOCK(udev->bus);
671 USETW(temp.wStatus, wValue);
672 src_mcopy = temp.wStatus;
673 max_len = sizeof(temp.wStatus);
674 goto tr_valid;
676 tr_handle_set_address:
677 if (state == USB_HR_NOT_COMPLETE) {
678 if (wValue >= 0x80) {
679 /* invalid value */
680 goto tr_stalled;
681 } else if (udev->curr_config_no != 0) {
682 /* we are configured ! */
683 goto tr_stalled;
685 } else if (state != USB_HR_NOT_COMPLETE) {
686 udev->address = (wValue & 0x7F);
687 goto tr_bad_context;
689 goto tr_valid;
691 tr_handle_set_config:
692 if (state == USB_HR_NOT_COMPLETE) {
693 if (usb_handle_set_config(xfer, req.wValue[0])) {
694 goto tr_stalled;
697 goto tr_valid;
699 tr_handle_clear_halt:
700 if (state == USB_HR_NOT_COMPLETE) {
701 if (usb_handle_set_stall(xfer, req.wIndex[0], 0)) {
702 goto tr_stalled;
705 goto tr_valid;
707 tr_handle_clear_wakeup:
708 if (state == USB_HR_NOT_COMPLETE) {
709 if (usb_handle_remote_wakeup(xfer, 0)) {
710 goto tr_stalled;
713 goto tr_valid;
715 tr_handle_set_halt:
716 if (state == USB_HR_NOT_COMPLETE) {
717 if (usb_handle_set_stall(xfer, req.wIndex[0], 1)) {
718 goto tr_stalled;
721 goto tr_valid;
723 tr_handle_set_wakeup:
724 if (state == USB_HR_NOT_COMPLETE) {
725 if (usb_handle_remote_wakeup(xfer, 1)) {
726 goto tr_stalled;
729 goto tr_valid;
731 tr_handle_get_ep_status:
732 if (state == USB_HR_NOT_COMPLETE) {
733 temp.wStatus[0] =
734 usb_handle_get_stall(udev, req.wIndex[0]);
735 temp.wStatus[1] = 0;
736 src_mcopy = temp.wStatus;
737 max_len = sizeof(temp.wStatus);
739 goto tr_valid;
741 tr_valid:
742 if (state != USB_HR_NOT_COMPLETE) {
743 goto tr_stalled;
745 /* subtract offset from length */
747 max_len -= off;
749 /* Compute the real maximum data length */
751 if (max_len > xfer->max_data_length) {
752 max_len = usbd_xfer_max_len(xfer);
754 if (max_len > rem) {
755 max_len = rem;
758 * If the remainder is greater than the maximum data length,
759 * we need to truncate the value for the sake of the
760 * comparison below:
762 if (rem > xfer->max_data_length) {
763 rem = usbd_xfer_max_len(xfer);
765 if ((rem != max_len) && (is_complete != 0)) {
767 * If we don't transfer the data we can transfer, then
768 * the transfer is short !
770 xfer->flags.force_short_xfer = 1;
771 xfer->nframes = 2;
772 } else {
774 * Default case
776 xfer->flags.force_short_xfer = 0;
777 xfer->nframes = max_len ? 2 : 1;
779 if (max_len > 0) {
780 if (src_mcopy) {
781 src_mcopy = USB_ADD_BYTES(src_mcopy, off);
782 usbd_copy_in(xfer->frbuffers + 1, 0,
783 src_mcopy, max_len);
784 usbd_xfer_set_frame_len(xfer, 1, max_len);
785 } else {
786 usbd_xfer_set_frame_data(xfer, 1,
787 USB_ADD_BYTES(src_zcopy, off), max_len);
789 } else {
790 /* the end is reached, send status */
791 xfer->flags.manual_status = 0;
792 usbd_xfer_set_frame_len(xfer, 1, 0);
794 DPRINTF("success\n");
795 return (0); /* success */
797 tr_stalled:
798 DPRINTF("%s\n", (state != USB_HR_NOT_COMPLETE) ?
799 "complete" : "stalled");
800 return (USB_ERR_STALLED);
802 tr_bad_context:
803 DPRINTF("bad context\n");
804 return (USB_ERR_BAD_CONTEXT);