Lines Matching +full:cmd +full:- +full:timeout +full:- +full:ms

1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause
4 * Copyright (c) 2008-2022 Hans Petter Selasky.
5 * Copyright (c) 2021-2022 Idwer Vollering.
129 #define ERR_CSW_FAILED -1
170 usb_timeout_t data_timeout; /* ms */
208 .timeout = 4 * USB_MS_HZ, /* 4 seconds */
218 .timeout = 4 * USB_MS_HZ, /* 4 seconds */
227 .timeout = 1 * USB_MS_HZ, /* 1 second */
237 .timeout = 4 * USB_MS_HZ, /* 4 seconds */
246 .timeout = 1 * USB_MS_HZ, /* 1 second */
256 .timeout = 1 * USB_MS_HZ, /* 1 second */
268 .timeout = 1 * USB_MS_HZ, /* 1 second */
275 sc->error = error; in bbb_done()
276 sc->state = ST_COMMAND; in bbb_done()
277 sc->status_try = 1; in bbb_done()
278 cv_signal(&sc->cv); in bbb_done()
284 sc->state = xfer_index; in bbb_transfer_start()
285 usbd_transfer_start(sc->xfer[xfer_index]); in bbb_transfer_start()
294 if (usbd_clear_stall_callback(xfer, sc->xfer[stall_xfer])) { in bbb_data_clear_stall_callback()
316 (sc, ((sc->dir == DIR_IN) ? ST_DATA_RD : in bbb_command_callback()
317 (sc->dir == DIR_OUT) ? ST_DATA_WR : in bbb_command_callback()
322 sc->status_try = 0; in bbb_command_callback()
323 tag = UGETDW(sc->cbw->dCBWTag) + 1; in bbb_command_callback()
324 USETDW(sc->cbw->dCBWSignature, CBWSIGNATURE); in bbb_command_callback()
325 USETDW(sc->cbw->dCBWTag, tag); in bbb_command_callback()
326 USETDW(sc->cbw->dCBWDataTransferLength, (uint32_t)sc->data_len); in bbb_command_callback()
327 sc->cbw->bCBWFlags = ((sc->dir == DIR_IN) ? CBWFLAGS_IN : CBWFLAGS_OUT); in bbb_command_callback()
328 sc->cbw->bCBWLUN = sc->lun; in bbb_command_callback()
329 sc->cbw->bCDBLength = sc->cmd_len; in bbb_command_callback()
330 if (sc->cbw->bCDBLength > sizeof(sc->cbw->CBWCDB)) { in bbb_command_callback()
331 sc->cbw->bCDBLength = sizeof(sc->cbw->CBWCDB); in bbb_command_callback()
356 sc->data_rem -= actlen; in bbb_data_read_callback()
357 sc->data_ptr += actlen; in bbb_data_read_callback()
358 sc->actlen += actlen; in bbb_data_read_callback()
362 sc->data_rem = 0; in bbb_data_read_callback()
366 max_bulk, sc->data_rem); in bbb_data_read_callback()
368 if (sc->data_rem == 0) { in bbb_data_read_callback()
372 if (max_bulk > sc->data_rem) { in bbb_data_read_callback()
373 max_bulk = sc->data_rem; in bbb_data_read_callback()
375 usbd_xfer_set_timeout(xfer, sc->data_timeout); in bbb_data_read_callback()
376 usbd_xfer_set_frame_data(xfer, 0, sc->data_ptr, max_bulk); in bbb_data_read_callback()
408 sc->data_rem -= actlen; in bbb_data_write_callback()
409 sc->data_ptr += actlen; in bbb_data_write_callback()
410 sc->actlen += actlen; in bbb_data_write_callback()
414 sc->data_rem = 0; in bbb_data_write_callback()
418 max_bulk, sc->data_rem); in bbb_data_write_callback()
420 if (sc->data_rem == 0) { in bbb_data_write_callback()
424 if (max_bulk > sc->data_rem) { in bbb_data_write_callback()
425 max_bulk = sc->data_rem; in bbb_data_write_callback()
427 usbd_xfer_set_timeout(xfer, sc->data_timeout); in bbb_data_write_callback()
428 usbd_xfer_set_frame_data(xfer, 0, sc->data_ptr, max_bulk); in bbb_data_write_callback()
465 } else if (sc->csw->bCSWStatus == CSWSTATUS_GOOD) { in bbb_status_callback()
480 usbd_errstr(error), sc->status_try); in bbb_status_callback()
482 if (error == USB_ERR_CANCELLED || sc->status_try) { in bbb_status_callback()
485 sc->status_try = 1; in bbb_status_callback()
503 sc->data_rem -= actlen; in bbb_raw_write_callback()
504 sc->data_ptr += actlen; in bbb_raw_write_callback()
505 sc->actlen += actlen; in bbb_raw_write_callback()
509 sc->data_rem = 0; in bbb_raw_write_callback()
513 max_bulk, sc->data_rem); in bbb_raw_write_callback()
515 if (sc->data_rem == 0) { in bbb_raw_write_callback()
519 if (max_bulk > sc->data_rem) { in bbb_raw_write_callback()
520 max_bulk = sc->data_rem; in bbb_raw_write_callback()
522 usbd_xfer_set_timeout(xfer, sc->data_timeout); in bbb_raw_write_callback()
523 usbd_xfer_set_frame_data(xfer, 0, sc->data_ptr, max_bulk); in bbb_raw_write_callback()
533 /*------------------------------------------------------------------------*
534 * bbb_command_start - execute a SCSI command synchronously
539 *------------------------------------------------------------------------*/
545 sc->lun = lun; in bbb_command_start()
546 sc->dir = data_len ? dir : DIR_NONE; in bbb_command_start()
547 sc->data_ptr = data_ptr; in bbb_command_start()
548 sc->data_len = data_len; in bbb_command_start()
549 sc->data_rem = data_len; in bbb_command_start()
550 sc->data_timeout = (data_timeout + USB_MS_HZ); in bbb_command_start()
551 sc->actlen = 0; in bbb_command_start()
552 sc->error = 0; in bbb_command_start()
553 sc->cmd_len = cmd_len; in bbb_command_start()
554 memset(&sc->cbw->CBWCDB, 0, sizeof(sc->cbw->CBWCDB)); in bbb_command_start()
555 memcpy(&sc->cbw->CBWCDB, cmd_ptr, cmd_len); in bbb_command_start()
556 DPRINTFN(1, "SCSI cmd = %*D\n", (int)cmd_len, (char *)sc->cbw->CBWCDB, ":"); in bbb_command_start()
558 USB_MTX_LOCK(&sc->mtx); in bbb_command_start()
559 usbd_transfer_start(sc->xfer[sc->state]); in bbb_command_start()
561 while (usbd_transfer_pending(sc->xfer[sc->state])) { in bbb_command_start()
562 cv_wait(&sc->cv, &sc->mtx); in bbb_command_start()
564 USB_MTX_UNLOCK(&sc->mtx); in bbb_command_start()
565 return (sc->error); in bbb_command_start()
568 /*------------------------------------------------------------------------*
569 * bbb_raw_write - write a raw BULK message synchronously
574 *------------------------------------------------------------------------*/
579 sc->data_ptr = __DECONST(void *, data_ptr); in bbb_raw_write()
580 sc->data_len = data_len; in bbb_raw_write()
581 sc->data_rem = data_len; in bbb_raw_write()
582 sc->data_timeout = (data_timeout + USB_MS_HZ); in bbb_raw_write()
583 sc->actlen = 0; in bbb_raw_write()
584 sc->error = 0; in bbb_raw_write()
589 USB_MTX_LOCK(&sc->mtx); in bbb_raw_write()
590 usbd_transfer_start(sc->xfer[0]); in bbb_raw_write()
591 while (usbd_transfer_pending(sc->xfer[0])) in bbb_raw_write()
592 cv_wait(&sc->cv, &sc->mtx); in bbb_raw_write()
593 USB_MTX_UNLOCK(&sc->mtx); in bbb_raw_write()
594 return (sc->error); in bbb_raw_write()
611 /* Prevent re-enumeration */ in bbb_attach()
628 id = iface->idesc; in bbb_attach()
629 if (id == NULL || id->bInterfaceClass != bInterfaceClass) in bbb_attach()
632 switch (id->bInterfaceClass) { in bbb_attach()
634 switch (id->bInterfaceSubClass) { in bbb_attach()
643 switch (id->bInterfaceProtocol) { in bbb_attach()
654 switch (id->bInterfaceSubClass) { in bbb_attach()
668 mtx_init(&sc->mtx, "USB autoinstall", NULL, MTX_DEF); in bbb_attach()
669 cv_init(&sc->cv, "WBBB"); in bbb_attach()
671 err = usbd_transfer_setup(udev, &iface_index, sc->xfer, pconfig, in bbb_attach()
672 nconfig, sc, &sc->mtx); in bbb_attach()
677 switch (id->bInterfaceClass) { in bbb_attach()
680 sc->buffer = usbd_xfer_get_frame_buffer( in bbb_attach()
681 sc->xfer[ST_DATA_RD], 0); in bbb_attach()
682 sc->buffer_size = in bbb_attach()
683 usbd_xfer_max_len(sc->xfer[ST_DATA_RD]); in bbb_attach()
684 sc->cbw = usbd_xfer_get_frame_buffer( in bbb_attach()
685 sc->xfer[ST_COMMAND], 0); in bbb_attach()
686 sc->csw = usbd_xfer_get_frame_buffer( in bbb_attach()
687 sc->xfer[ST_STATUS], 0); in bbb_attach()
698 usbd_transfer_unsetup(sc->xfer, ST_MAX); in bbb_detach()
699 mtx_destroy(&sc->mtx); in bbb_detach()
700 cv_destroy(&sc->cv); in bbb_detach()
704 /*------------------------------------------------------------------------*
708 * 1: This interface is an auto install disk (CD-ROM)
710 *------------------------------------------------------------------------*/
715 uint8_t timeout; in usb_iface_is_cdrom() local
725 timeout = 4; /* tries */ in usb_iface_is_cdrom()
726 while (--timeout) { in usb_iface_is_cdrom()
727 err = bbb_command_start(sc, DIR_IN, 0, sc->buffer, in usb_iface_is_cdrom()
731 if (err == 0 && sc->actlen > 0) { in usb_iface_is_cdrom()
732 sid_type = sc->buffer[0] & 0x1F; in usb_iface_is_cdrom()
750 /* The Get Max Lun command is a class-specific request. */ in usb_msc_get_max_lun()
766 UGETW(udev->ddesc.idVendor), \
767 UGETW(udev->ddesc.idProduct)); \
770 UGETW(udev->ddesc.idVendor), \
771 UGETW(udev->ddesc.idProduct)); \
782 uint8_t timeout; in usb_msc_auto_quirk() local
807 for (timeout = 4; timeout != 0; timeout--) { in usb_msc_auto_quirk()
808 err = bbb_command_start(sc, DIR_IN, 0, sc->buffer, in usb_msc_auto_quirk()
812 if (err == 0 && sc->actlen > 0) { in usb_msc_auto_quirk()
813 sid_type = sc->buffer[0] & 0x1F; in usb_msc_auto_quirk()
860 timeout = 1; in usb_msc_auto_quirk()
880 err = bbb_command_start(sc, DIR_IN, 0, sc->buffer, 8, in usb_msc_auto_quirk()
888 err = bbb_command_start(sc, DIR_IN, 0, sc->buffer, 8, in usb_msc_auto_quirk()
893 if (timeout--) in usb_msc_auto_quirk()
918 err = bbb_command_start(sc, DIR_IN, 0, sc->buffer, in usb_msc_auto_quirk()
929 err = bbb_command_start(sc, DIR_IN, 0, sc->buffer, in usb_msc_auto_quirk()
954 /* Need to re-enumerate the device to clear its state. */ in usb_msc_auto_quirk()
1023 err = bbb_command_start(sc, DIR_IN, 0, sc->buffer, in usb_msc_eject()
1024 sc->buffer_size, &scsi_tct_eject, in usb_msc_eject()
1059 uint8_t cmd[10]; in usb_msc_read_10() local
1062 cmd[0] = 0x28; /* READ_10 */ in usb_msc_read_10()
1063 cmd[1] = 0; in usb_msc_read_10()
1064 cmd[2] = lba >> 24; in usb_msc_read_10()
1065 cmd[3] = lba >> 16; in usb_msc_read_10()
1066 cmd[4] = lba >> 8; in usb_msc_read_10()
1067 cmd[5] = lba >> 0; in usb_msc_read_10()
1068 cmd[6] = 0; in usb_msc_read_10()
1069 cmd[7] = blocks >> 8; in usb_msc_read_10()
1070 cmd[8] = blocks; in usb_msc_read_10()
1071 cmd[9] = 0; in usb_msc_read_10()
1078 blocks * SCSI_FIXED_BLOCK_SIZE, cmd, 10, USB_MS_HZ); in usb_msc_read_10()
1090 uint8_t cmd[10]; in usb_msc_write_10() local
1093 cmd[0] = 0x2a; /* WRITE_10 */ in usb_msc_write_10()
1094 cmd[1] = 0; in usb_msc_write_10()
1095 cmd[2] = lba >> 24; in usb_msc_write_10()
1096 cmd[3] = lba >> 16; in usb_msc_write_10()
1097 cmd[4] = lba >> 8; in usb_msc_write_10()
1098 cmd[5] = lba >> 0; in usb_msc_write_10()
1099 cmd[6] = 0; in usb_msc_write_10()
1100 cmd[7] = blocks >> 8; in usb_msc_write_10()
1101 cmd[8] = blocks; in usb_msc_write_10()
1102 cmd[9] = 0; in usb_msc_write_10()
1109 blocks * SCSI_FIXED_BLOCK_SIZE, cmd, 10, USB_MS_HZ); in usb_msc_write_10()
1127 err = bbb_command_start(sc, DIR_IN, 0, sc->buffer, 8, in usb_msc_read_capacity()
1132 (sc->buffer[0] << 24) | in usb_msc_read_capacity()
1133 (sc->buffer[1] << 16) | in usb_msc_read_capacity()
1134 (sc->buffer[2] << 8) | in usb_msc_read_capacity()
1135 (sc->buffer[3]); in usb_msc_read_capacity()
1138 (sc->buffer[4] << 24) | in usb_msc_read_capacity()
1139 (sc->buffer[5] << 16) | in usb_msc_read_capacity()
1140 (sc->buffer[6] << 8) | in usb_msc_read_capacity()
1141 (sc->buffer[7]); in usb_msc_read_capacity()