Lines Matching +full:usb +full:- +full:attach
1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause
50 #include <dev/usb/usb.h>
51 #include <dev/usb/usbdi.h>
52 #include <dev/usb/usbdi_util.h>
57 #include <dev/usb/usb_core.h>
58 #include <dev/usb/usb_process.h>
59 #include <dev/usb/usb_busdma.h>
60 #include <dev/usb/usb_transfer.h>
61 #include <dev/usb/usb_device.h>
62 #include <dev/usb/usb_debug.h>
63 #include <dev/usb/usb_dynamic.h>
64 #include <dev/usb/usb_hub.h>
66 #include <dev/usb/usb_controller.h>
67 #include <dev/usb/usb_bus.h>
82 /*------------------------------------------------------------------------*
85 * This function is the USB callback for generic USB Device control
87 *------------------------------------------------------------------------*/
104 /* we need to re-setup the control transfer */ in usb_handle_request_callback()
105 usb_needs_explore(xfer->xroot->bus, 0); in usb_handle_request_callback()
115 if (xfer->flags_int.control_rem != 0xFFFF) { in usb_handle_request_callback()
119 if (xfer->error != USB_ERR_CANCELLED) { in usb_handle_request_callback()
120 /* should not happen - try stalling */ in usb_handle_request_callback()
133 xfer->nframes = 1; in usb_handle_request_callback()
134 xfer->flags.manual_status = 1; in usb_handle_request_callback()
135 xfer->flags.force_short_xfer = 0; in usb_handle_request_callback()
140 /*------------------------------------------------------------------------*
146 *------------------------------------------------------------------------*/
150 struct usb_device *udev = xfer->xroot->udev; in usb_handle_set_config()
156 * attach: in usb_handle_set_config()
160 /* Prevent re-enumeration */ in usb_handle_set_config()
170 conf_no--; in usb_handle_set_config()
179 DPRINTF("probe and attach failed\n"); in usb_handle_set_config()
197 /* Prevent re-enumeration */ in usb_check_alt_setting()
200 if (alt_index >= usbd_get_no_alts(udev->cdesc, iface->idesc)) in usb_check_alt_setting()
209 /*------------------------------------------------------------------------*
215 *------------------------------------------------------------------------*/
223 struct usb_device *udev = xfer->xroot->udev; in usb_handle_iface_request()
237 * attach: in usb_handle_iface_request()
241 /* Prevent re-enumeration */ in usb_handle_iface_request()
249 (iface->idesc == NULL)) { in usb_handle_iface_request()
250 /* end of interfaces non-existing interface */ in usb_handle_iface_request()
261 (iface->subdev != NULL) && in usb_handle_iface_request()
262 device_is_attached(iface->subdev)) { in usb_handle_iface_request()
266 error = USB_HANDLE_REQUEST(iface->subdev, in usb_handle_iface_request()
270 iface_parent = usbd_get_iface(udev, iface->parent_iface_index); in usb_handle_iface_request()
273 (iface_parent->idesc == NULL)) { in usb_handle_iface_request()
274 /* non-existing interface */ in usb_handle_iface_request()
282 (iface_parent->subdev != NULL) && in usb_handle_iface_request()
284 (iface_parent->subdev != iface->subdev) && in usb_handle_iface_request()
285 device_is_attached(iface_parent->subdev)) { in usb_handle_iface_request()
286 error = USB_HANDLE_REQUEST(iface_parent->subdev, in usb_handle_iface_request()
291 *ppdata = ((uint8_t *)(*ppdata)) - off; in usb_handle_iface_request()
318 * Reset the endpoints, because re-attaching in usb_handle_iface_request()
335 iface->alt_index = req.wValue[0]; in usb_handle_iface_request()
346 *ppdata = &iface->alt_index; in usb_handle_iface_request()
376 /*------------------------------------------------------------------------*
382 *------------------------------------------------------------------------*/
386 struct usb_device *udev = xfer->xroot->udev; in usb_handle_set_stall()
396 /*------------------------------------------------------------------------*
402 *------------------------------------------------------------------------*/
414 USB_BUS_LOCK(udev->bus); in usb_handle_get_stall()
415 halted = ep->is_stalled; in usb_handle_get_stall()
416 USB_BUS_UNLOCK(udev->bus); in usb_handle_get_stall()
421 /*------------------------------------------------------------------------*
427 *------------------------------------------------------------------------*/
434 udev = xfer->xroot->udev; in usb_handle_remote_wakeup()
435 bus = udev->bus; in usb_handle_remote_wakeup()
440 udev->flags.remote_wakeup = 1; in usb_handle_remote_wakeup()
442 udev->flags.remote_wakeup = 0; in usb_handle_remote_wakeup()
449 usb_bus_power_update(udev->bus); in usb_handle_remote_wakeup()
454 /*------------------------------------------------------------------------*
459 * USB_HR_NOT_COMPLETE -> USB_HR_COMPLETE_OK v USB_HR_COMPLETE_ERR
464 *------------------------------------------------------------------------*/
470 const void *src_zcopy; /* zero-copy source pointer */ in usb_handle_request()
471 const void *src_mcopy; /* non zero-copy source pointer */ in usb_handle_request()
485 * Filter the USB transfer state into in usb_handle_request()
493 if (!xfer->flags_int.control_act) { in usb_handle_request()
499 if (!xfer->flags_int.control_act) { in usb_handle_request()
519 usbd_copy_out(xfer->frbuffers, 0, &req, sizeof(req)); in usb_handle_request()
521 if (xfer->flags_int.control_rem == 0xFFFF) { in usb_handle_request()
522 /* first time - not initialised */ in usb_handle_request()
526 /* not first time - initialised */ in usb_handle_request()
527 rem = xfer->flags_int.control_rem; in usb_handle_request()
528 off = UGETW(req.wLength) - rem; in usb_handle_request()
536 udev = xfer->xroot->udev; in usb_handle_request()
624 /* we use "USB_ADD_BYTES" to de-const the src_zcopy */ in usb_handle_request()
635 * Reset zero-copy pointer and max length in usb_handle_request()
659 temp.buf[0] = udev->curr_config_no; in usb_handle_request()
668 USB_BUS_LOCK(udev->bus); in usb_handle_request()
669 if (udev->flags.remote_wakeup) { in usb_handle_request()
672 if (udev->flags.self_powered) { in usb_handle_request()
675 USB_BUS_UNLOCK(udev->bus); in usb_handle_request()
687 } else if (udev->curr_config_no != 0) { in usb_handle_request()
692 udev->address = (wValue & 0x7F); in usb_handle_request()
753 max_len -= off; in usb_handle_request()
757 if (max_len > xfer->max_data_length) { in usb_handle_request()
768 if (rem > xfer->max_data_length) { in usb_handle_request()
776 xfer->flags.force_short_xfer = 1; in usb_handle_request()
777 xfer->nframes = 2; in usb_handle_request()
782 xfer->flags.force_short_xfer = 0; in usb_handle_request()
783 xfer->nframes = max_len ? 2 : 1; in usb_handle_request()
788 usbd_copy_in(xfer->frbuffers + 1, 0, in usb_handle_request()
797 xfer->flags.manual_status = 0; in usb_handle_request()