Lines Matching +full:async +full:- +full:prefix
1 // SPDX-License-Identifier: GPL-2.0
6 * Copyright Hans de Goede <hdegoede@redhat.com> for Red Hat, Inc. 2013 - 2016
30 #include "uas-detect.h"
49 struct work_struct scan_work; /* for async scanning */
82 static void uas_log_cmd_state(struct scsi_cmnd *cmnd, const char *prefix,
107 spin_lock_irqsave(&devinfo->lock, flags); in uas_do_work()
109 if (devinfo->resetting) in uas_do_work()
112 for (i = 0; i < devinfo->qdepth; i++) { in uas_do_work()
113 if (!devinfo->cmnd[i]) in uas_do_work()
116 cmnd = devinfo->cmnd[i]; in uas_do_work()
119 if (!(cmdinfo->state & IS_IN_WORK_LIST)) in uas_do_work()
122 err = uas_submit_urbs(cmnd, cmnd->device->hostdata); in uas_do_work()
124 cmdinfo->state &= ~IS_IN_WORK_LIST; in uas_do_work()
126 queue_work(workqueue, &devinfo->work); in uas_do_work()
129 spin_unlock_irqrestore(&devinfo->lock, flags); in uas_do_work()
136 struct Scsi_Host *shost = usb_get_intfdata(devinfo->intf); in uas_scan_work()
138 dev_dbg(&devinfo->intf->dev, "starting scan\n"); in uas_scan_work()
140 dev_dbg(&devinfo->intf->dev, "scan complete\n"); in uas_scan_work()
146 struct uas_dev_info *devinfo = cmnd->device->hostdata; in uas_add_work()
148 lockdep_assert_held(&devinfo->lock); in uas_add_work()
149 cmdinfo->state |= IS_IN_WORK_LIST; in uas_add_work()
150 queue_work(workqueue, &devinfo->work); in uas_add_work()
160 spin_lock_irqsave(&devinfo->lock, flags); in uas_zap_pending()
161 for (i = 0; i < devinfo->qdepth; i++) { in uas_zap_pending()
162 if (!devinfo->cmnd[i]) in uas_zap_pending()
165 cmnd = devinfo->cmnd[i]; in uas_zap_pending()
169 cmdinfo->state &= ~COMMAND_INFLIGHT; in uas_zap_pending()
170 cmnd->result = result << 16; in uas_zap_pending()
174 spin_unlock_irqrestore(&devinfo->lock, flags); in uas_zap_pending()
179 struct sense_iu *sense_iu = urb->transfer_buffer; in uas_sense()
180 struct scsi_device *sdev = cmnd->device; in uas_sense()
182 if (urb->actual_length > 16) { in uas_sense()
183 unsigned len = be16_to_cpup(&sense_iu->len); in uas_sense()
184 if (len + 16 != urb->actual_length) { in uas_sense()
185 int newlen = min(len + 16, urb->actual_length) - 16; in uas_sense()
191 urb->actual_length, len, newlen); in uas_sense()
194 memcpy(cmnd->sense_buffer, sense_iu->sense, len); in uas_sense()
197 cmnd->result = sense_iu->status; in uas_sense()
200 static void uas_log_cmd_state(struct scsi_cmnd *cmnd, const char *prefix, in uas_log_cmd_state() argument
205 if (status == -ENODEV) /* too late */ in uas_log_cmd_state()
209 "%s %d uas-tag %d inflight:%s%s%s%s%s%s%s%s%s%s%s%s ", in uas_log_cmd_state()
210 prefix, status, ci->uas_tag, in uas_log_cmd_state()
211 (ci->state & SUBMIT_STATUS_URB) ? " s-st" : "", in uas_log_cmd_state()
212 (ci->state & ALLOC_DATA_IN_URB) ? " a-in" : "", in uas_log_cmd_state()
213 (ci->state & SUBMIT_DATA_IN_URB) ? " s-in" : "", in uas_log_cmd_state()
214 (ci->state & ALLOC_DATA_OUT_URB) ? " a-out" : "", in uas_log_cmd_state()
215 (ci->state & SUBMIT_DATA_OUT_URB) ? " s-out" : "", in uas_log_cmd_state()
216 (ci->state & ALLOC_CMD_URB) ? " a-cmd" : "", in uas_log_cmd_state()
217 (ci->state & SUBMIT_CMD_URB) ? " s-cmd" : "", in uas_log_cmd_state()
218 (ci->state & COMMAND_INFLIGHT) ? " CMD" : "", in uas_log_cmd_state()
219 (ci->state & DATA_IN_URB_INFLIGHT) ? " IN" : "", in uas_log_cmd_state()
220 (ci->state & DATA_OUT_URB_INFLIGHT) ? " OUT" : "", in uas_log_cmd_state()
221 (ci->state & COMMAND_ABORTED) ? " abort" : "", in uas_log_cmd_state()
222 (ci->state & IS_IN_WORK_LIST) ? " work" : ""); in uas_log_cmd_state()
235 if (cmdinfo->state & SUBMIT_CMD_URB) in uas_free_unsubmitted_urbs()
236 usb_free_urb(cmdinfo->cmd_urb); in uas_free_unsubmitted_urbs()
239 if (!(cmdinfo->state & DATA_IN_URB_INFLIGHT)) in uas_free_unsubmitted_urbs()
240 usb_free_urb(cmdinfo->data_in_urb); in uas_free_unsubmitted_urbs()
241 if (!(cmdinfo->state & DATA_OUT_URB_INFLIGHT)) in uas_free_unsubmitted_urbs()
242 usb_free_urb(cmdinfo->data_out_urb); in uas_free_unsubmitted_urbs()
248 struct uas_dev_info *devinfo = (void *)cmnd->device->hostdata; in uas_try_complete()
250 lockdep_assert_held(&devinfo->lock); in uas_try_complete()
251 if (cmdinfo->state & (COMMAND_INFLIGHT | in uas_try_complete()
255 return -EBUSY; in uas_try_complete()
256 devinfo->cmnd[cmdinfo->uas_tag - 1] = NULL; in uas_try_complete()
268 cmdinfo->state |= direction | SUBMIT_STATUS_URB; in uas_xfer_data()
269 err = uas_submit_urbs(cmnd, cmnd->device->hostdata); in uas_xfer_data()
277 u8 response_code = riu->response_code; in uas_evaluate_response_iu()
300 struct iu *iu = urb->transfer_buffer; in uas_stat_cmplt()
301 struct Scsi_Host *shost = urb->context; in uas_stat_cmplt()
302 struct uas_dev_info *devinfo = (struct uas_dev_info *)shost->hostdata; in uas_stat_cmplt()
309 int status = urb->status; in uas_stat_cmplt()
312 spin_lock_irqsave(&devinfo->lock, flags); in uas_stat_cmplt()
314 if (devinfo->resetting) in uas_stat_cmplt()
318 if (status != -ENOENT && status != -ECONNRESET && status != -ESHUTDOWN) in uas_stat_cmplt()
319 dev_err(&urb->dev->dev, "stat urb: status %d\n", status); in uas_stat_cmplt()
323 idx = be16_to_cpup(&iu->tag) - 1; in uas_stat_cmplt()
324 if (idx >= MAX_CMNDS || !devinfo->cmnd[idx]) { in uas_stat_cmplt()
325 dev_err(&urb->dev->dev, in uas_stat_cmplt()
326 "stat urb: no pending cmd for uas-tag %d\n", idx + 1); in uas_stat_cmplt()
330 cmnd = devinfo->cmnd[idx]; in uas_stat_cmplt()
333 if (!(cmdinfo->state & COMMAND_INFLIGHT)) { in uas_stat_cmplt()
338 switch (iu->iu_id) { in uas_stat_cmplt()
341 if (cmnd->result != 0) { in uas_stat_cmplt()
343 data_in_urb = usb_get_urb(cmdinfo->data_in_urb); in uas_stat_cmplt()
344 data_out_urb = usb_get_urb(cmdinfo->data_out_urb); in uas_stat_cmplt()
346 cmdinfo->state &= ~COMMAND_INFLIGHT; in uas_stat_cmplt()
350 if (!cmdinfo->data_in_urb || in uas_stat_cmplt()
351 (cmdinfo->state & DATA_IN_URB_INFLIGHT)) { in uas_stat_cmplt()
358 if (!cmdinfo->data_out_urb || in uas_stat_cmplt()
359 (cmdinfo->state & DATA_OUT_URB_INFLIGHT)) { in uas_stat_cmplt()
366 cmdinfo->state &= ~COMMAND_INFLIGHT; in uas_stat_cmplt()
370 data_in_urb = usb_get_urb(cmdinfo->data_in_urb); in uas_stat_cmplt()
371 data_out_urb = usb_get_urb(cmdinfo->data_out_urb); in uas_stat_cmplt()
376 uas_log_cmd_state(cmnd, "bogus IU", iu->iu_id); in uas_stat_cmplt()
380 spin_unlock_irqrestore(&devinfo->lock, flags); in uas_stat_cmplt()
395 struct scsi_cmnd *cmnd = urb->context; in uas_data_cmplt()
397 struct uas_dev_info *devinfo = (void *)cmnd->device->hostdata; in uas_data_cmplt()
398 struct scsi_data_buffer *sdb = &cmnd->sdb; in uas_data_cmplt()
400 int status = urb->status; in uas_data_cmplt()
402 spin_lock_irqsave(&devinfo->lock, flags); in uas_data_cmplt()
404 if (cmdinfo->data_in_urb == urb) { in uas_data_cmplt()
405 cmdinfo->state &= ~DATA_IN_URB_INFLIGHT; in uas_data_cmplt()
406 cmdinfo->data_in_urb = NULL; in uas_data_cmplt()
407 } else if (cmdinfo->data_out_urb == urb) { in uas_data_cmplt()
408 cmdinfo->state &= ~DATA_OUT_URB_INFLIGHT; in uas_data_cmplt()
409 cmdinfo->data_out_urb = NULL; in uas_data_cmplt()
412 if (devinfo->resetting) in uas_data_cmplt()
416 if (cmdinfo->state & SUBMIT_CMD_URB) { in uas_data_cmplt()
422 if (status != -ENOENT && status != -ECONNRESET && status != -ESHUTDOWN) in uas_data_cmplt()
425 scsi_set_resid(cmnd, sdb->length); in uas_data_cmplt()
428 scsi_set_resid(cmnd, sdb->length - urb->actual_length); in uas_data_cmplt()
433 spin_unlock_irqrestore(&devinfo->lock, flags); in uas_data_cmplt()
438 if (urb->status) in uas_cmd_cmplt()
439 dev_err(&urb->dev->dev, "cmd cmplt err %d\n", urb->status); in uas_cmd_cmplt()
448 struct usb_device *udev = devinfo->udev; in uas_alloc_data_urb()
451 struct scsi_data_buffer *sdb = &cmnd->sdb; in uas_alloc_data_urb()
453 ? devinfo->data_in_pipe : devinfo->data_out_pipe; in uas_alloc_data_urb()
457 usb_fill_bulk_urb(urb, udev, pipe, NULL, sdb->length, in uas_alloc_data_urb()
459 if (devinfo->use_streams) in uas_alloc_data_urb()
460 urb->stream_id = cmdinfo->uas_tag; in uas_alloc_data_urb()
461 urb->num_sgs = udev->bus->sg_tablesize ? sdb->table.nents : 0; in uas_alloc_data_urb()
462 urb->sg = sdb->table.sgl; in uas_alloc_data_urb()
470 struct usb_device *udev = devinfo->udev; in uas_alloc_sense_urb()
482 usb_fill_bulk_urb(urb, udev, devinfo->status_pipe, iu, sizeof(*iu), in uas_alloc_sense_urb()
483 uas_stat_cmplt, cmnd->device->host); in uas_alloc_sense_urb()
484 if (devinfo->use_streams) in uas_alloc_sense_urb()
485 urb->stream_id = cmdinfo->uas_tag; in uas_alloc_sense_urb()
486 urb->transfer_flags |= URB_FREE_BUFFER; in uas_alloc_sense_urb()
497 struct usb_device *udev = devinfo->udev; in uas_alloc_cmd_urb()
498 struct scsi_device *sdev = cmnd->device; in uas_alloc_cmd_urb()
507 len = cmnd->cmd_len - 16; in uas_alloc_cmd_urb()
515 iu->iu_id = IU_ID_COMMAND; in uas_alloc_cmd_urb()
516 iu->tag = cpu_to_be16(cmdinfo->uas_tag); in uas_alloc_cmd_urb()
517 iu->prio_attr = UAS_SIMPLE_TAG; in uas_alloc_cmd_urb()
518 iu->len = len; in uas_alloc_cmd_urb()
519 int_to_scsilun(sdev->lun, &iu->lun); in uas_alloc_cmd_urb()
520 memcpy(iu->cdb, cmnd->cmnd, cmnd->cmd_len); in uas_alloc_cmd_urb()
522 usb_fill_bulk_urb(urb, udev, devinfo->cmd_pipe, iu, sizeof(*iu) + len, in uas_alloc_cmd_urb()
524 urb->transfer_flags |= URB_FREE_BUFFER; in uas_alloc_cmd_urb()
540 struct uas_dev_info *devinfo = cmnd->device->hostdata; in uas_submit_sense_urb()
546 return -ENOMEM; in uas_submit_sense_urb()
547 usb_anchor_urb(urb, &devinfo->sense_urbs); in uas_submit_sense_urb()
563 lockdep_assert_held(&devinfo->lock); in uas_submit_urbs()
564 if (cmdinfo->state & SUBMIT_STATUS_URB) { in uas_submit_urbs()
568 cmdinfo->state &= ~SUBMIT_STATUS_URB; in uas_submit_urbs()
571 if (cmdinfo->state & ALLOC_DATA_IN_URB) { in uas_submit_urbs()
572 cmdinfo->data_in_urb = uas_alloc_data_urb(devinfo, GFP_ATOMIC, in uas_submit_urbs()
574 if (!cmdinfo->data_in_urb) in uas_submit_urbs()
575 return -ENOMEM; in uas_submit_urbs()
576 cmdinfo->state &= ~ALLOC_DATA_IN_URB; in uas_submit_urbs()
579 if (cmdinfo->state & SUBMIT_DATA_IN_URB) { in uas_submit_urbs()
580 usb_anchor_urb(cmdinfo->data_in_urb, &devinfo->data_urbs); in uas_submit_urbs()
581 err = usb_submit_urb(cmdinfo->data_in_urb, GFP_ATOMIC); in uas_submit_urbs()
583 usb_unanchor_urb(cmdinfo->data_in_urb); in uas_submit_urbs()
587 cmdinfo->state &= ~SUBMIT_DATA_IN_URB; in uas_submit_urbs()
588 cmdinfo->state |= DATA_IN_URB_INFLIGHT; in uas_submit_urbs()
591 if (cmdinfo->state & ALLOC_DATA_OUT_URB) { in uas_submit_urbs()
592 cmdinfo->data_out_urb = uas_alloc_data_urb(devinfo, GFP_ATOMIC, in uas_submit_urbs()
594 if (!cmdinfo->data_out_urb) in uas_submit_urbs()
595 return -ENOMEM; in uas_submit_urbs()
596 cmdinfo->state &= ~ALLOC_DATA_OUT_URB; in uas_submit_urbs()
599 if (cmdinfo->state & SUBMIT_DATA_OUT_URB) { in uas_submit_urbs()
600 usb_anchor_urb(cmdinfo->data_out_urb, &devinfo->data_urbs); in uas_submit_urbs()
601 err = usb_submit_urb(cmdinfo->data_out_urb, GFP_ATOMIC); in uas_submit_urbs()
603 usb_unanchor_urb(cmdinfo->data_out_urb); in uas_submit_urbs()
607 cmdinfo->state &= ~SUBMIT_DATA_OUT_URB; in uas_submit_urbs()
608 cmdinfo->state |= DATA_OUT_URB_INFLIGHT; in uas_submit_urbs()
611 if (cmdinfo->state & ALLOC_CMD_URB) { in uas_submit_urbs()
612 cmdinfo->cmd_urb = uas_alloc_cmd_urb(devinfo, GFP_ATOMIC, cmnd); in uas_submit_urbs()
613 if (!cmdinfo->cmd_urb) in uas_submit_urbs()
614 return -ENOMEM; in uas_submit_urbs()
615 cmdinfo->state &= ~ALLOC_CMD_URB; in uas_submit_urbs()
618 if (cmdinfo->state & SUBMIT_CMD_URB) { in uas_submit_urbs()
619 usb_anchor_urb(cmdinfo->cmd_urb, &devinfo->cmd_urbs); in uas_submit_urbs()
620 err = usb_submit_urb(cmdinfo->cmd_urb, GFP_ATOMIC); in uas_submit_urbs()
622 usb_unanchor_urb(cmdinfo->cmd_urb); in uas_submit_urbs()
626 cmdinfo->cmd_urb = NULL; in uas_submit_urbs()
627 cmdinfo->state &= ~SUBMIT_CMD_URB; in uas_submit_urbs()
628 cmdinfo->state |= COMMAND_INFLIGHT; in uas_submit_urbs()
636 struct scsi_device *sdev = cmnd->device; in uas_queuecommand_lck()
637 struct uas_dev_info *devinfo = sdev->hostdata; in uas_queuecommand_lck()
642 /* Re-check scsi_block_requests now that we've the host-lock */ in uas_queuecommand_lck()
643 if (cmnd->device->host->host_self_blocked) in uas_queuecommand_lck()
646 if ((devinfo->flags & US_FL_NO_ATA_1X) && in uas_queuecommand_lck()
647 (cmnd->cmnd[0] == ATA_12 || cmnd->cmnd[0] == ATA_16)) { in uas_queuecommand_lck()
648 memcpy(cmnd->sense_buffer, usb_stor_sense_invalidCDB, in uas_queuecommand_lck()
650 cmnd->result = SAM_STAT_CHECK_CONDITION; in uas_queuecommand_lck()
655 spin_lock_irqsave(&devinfo->lock, flags); in uas_queuecommand_lck()
657 if (devinfo->resetting) { in uas_queuecommand_lck()
663 /* Find a free uas-tag */ in uas_queuecommand_lck()
664 for (idx = 0; idx < devinfo->qdepth; idx++) { in uas_queuecommand_lck()
665 if (!devinfo->cmnd[idx]) in uas_queuecommand_lck()
668 if (idx == devinfo->qdepth) { in uas_queuecommand_lck()
669 spin_unlock_irqrestore(&devinfo->lock, flags); in uas_queuecommand_lck()
674 cmdinfo->uas_tag = idx + 1; /* uas-tag == usb-stream-id, so 1 based */ in uas_queuecommand_lck()
675 cmdinfo->state = SUBMIT_STATUS_URB | ALLOC_CMD_URB | SUBMIT_CMD_URB; in uas_queuecommand_lck()
677 switch (cmnd->sc_data_direction) { in uas_queuecommand_lck()
679 cmdinfo->state |= ALLOC_DATA_IN_URB | SUBMIT_DATA_IN_URB; in uas_queuecommand_lck()
682 cmdinfo->state |= ALLOC_DATA_IN_URB | SUBMIT_DATA_IN_URB; in uas_queuecommand_lck()
685 cmdinfo->state |= ALLOC_DATA_OUT_URB | SUBMIT_DATA_OUT_URB; in uas_queuecommand_lck()
691 if (!devinfo->use_streams) in uas_queuecommand_lck()
692 cmdinfo->state &= ~(SUBMIT_DATA_IN_URB | SUBMIT_DATA_OUT_URB); in uas_queuecommand_lck()
700 if (err == -ENODEV) { in uas_queuecommand_lck()
707 if (cmdinfo->state & SUBMIT_STATUS_URB) { in uas_queuecommand_lck()
708 spin_unlock_irqrestore(&devinfo->lock, flags); in uas_queuecommand_lck()
714 devinfo->cmnd[idx] = cmnd; in uas_queuecommand_lck()
716 spin_unlock_irqrestore(&devinfo->lock, flags); in uas_queuecommand_lck()
730 struct uas_dev_info *devinfo = (void *)cmnd->device->hostdata; in DEF_SCSI_QCMD()
735 spin_lock_irqsave(&devinfo->lock, flags); in DEF_SCSI_QCMD()
740 cmdinfo->state |= COMMAND_ABORTED; in DEF_SCSI_QCMD()
743 devinfo->cmnd[cmdinfo->uas_tag - 1] = NULL; in DEF_SCSI_QCMD()
744 if (cmdinfo->state & DATA_IN_URB_INFLIGHT) in DEF_SCSI_QCMD()
745 data_in_urb = usb_get_urb(cmdinfo->data_in_urb); in DEF_SCSI_QCMD()
746 if (cmdinfo->state & DATA_OUT_URB_INFLIGHT) in DEF_SCSI_QCMD()
747 data_out_urb = usb_get_urb(cmdinfo->data_out_urb); in DEF_SCSI_QCMD()
751 spin_unlock_irqrestore(&devinfo->lock, flags); in DEF_SCSI_QCMD()
767 struct scsi_device *sdev = cmnd->device; in uas_eh_device_reset_handler()
768 struct uas_dev_info *devinfo = sdev->hostdata; in uas_eh_device_reset_handler()
769 struct usb_device *udev = devinfo->udev; in uas_eh_device_reset_handler()
773 err = usb_lock_device_for_reset(udev, devinfo->intf); in uas_eh_device_reset_handler()
775 shost_printk(KERN_ERR, sdev->host, in uas_eh_device_reset_handler()
780 shost_printk(KERN_INFO, sdev->host, "%s start\n", __func__); in uas_eh_device_reset_handler()
782 spin_lock_irqsave(&devinfo->lock, flags); in uas_eh_device_reset_handler()
783 devinfo->resetting = 1; in uas_eh_device_reset_handler()
784 spin_unlock_irqrestore(&devinfo->lock, flags); in uas_eh_device_reset_handler()
786 usb_kill_anchored_urbs(&devinfo->cmd_urbs); in uas_eh_device_reset_handler()
787 usb_kill_anchored_urbs(&devinfo->sense_urbs); in uas_eh_device_reset_handler()
788 usb_kill_anchored_urbs(&devinfo->data_urbs); in uas_eh_device_reset_handler()
793 spin_lock_irqsave(&devinfo->lock, flags); in uas_eh_device_reset_handler()
794 devinfo->resetting = 0; in uas_eh_device_reset_handler()
795 spin_unlock_irqrestore(&devinfo->lock, flags); in uas_eh_device_reset_handler()
800 shost_printk(KERN_INFO, sdev->host, "%s FAILED err %d\n", in uas_eh_device_reset_handler()
805 shost_printk(KERN_INFO, sdev->host, "%s success\n", __func__); in uas_eh_device_reset_handler()
812 dev_to_shost(starget->dev.parent)->hostdata; in uas_target_alloc()
814 if (devinfo->flags & US_FL_NO_REPORT_LUNS) in uas_target_alloc()
815 starget->no_report_luns = 1; in uas_target_alloc()
823 (struct uas_dev_info *)sdev->host->hostdata; in uas_sdev_init()
829 sdev->sdev_bflags |= BLIST_SKIP_IO_HINTS; in uas_sdev_init()
831 sdev->hostdata = devinfo; in uas_sdev_init()
838 struct uas_dev_info *devinfo = sdev->hostdata; in uas_sdev_configure()
840 if (devinfo->flags & US_FL_MAX_SECTORS_64) in uas_sdev_configure()
841 lim->max_hw_sectors = 64; in uas_sdev_configure()
842 else if (devinfo->flags & US_FL_MAX_SECTORS_240) in uas_sdev_configure()
843 lim->max_hw_sectors = 240; in uas_sdev_configure()
845 if (devinfo->flags & US_FL_NO_REPORT_OPCODES) in uas_sdev_configure()
846 sdev->no_report_opcodes = 1; in uas_sdev_configure()
848 /* A few buggy USB-ATA bridges don't understand FUA */ in uas_sdev_configure()
849 if (devinfo->flags & US_FL_BROKEN_FUA) in uas_sdev_configure()
850 sdev->broken_fua = 1; in uas_sdev_configure()
853 if (devinfo->flags & US_FL_ALWAYS_SYNC) { in uas_sdev_configure()
854 sdev->skip_ms_page_3f = 1; in uas_sdev_configure()
855 sdev->skip_ms_page_8 = 1; in uas_sdev_configure()
856 sdev->wce_default_on = 1; in uas_sdev_configure()
860 if (devinfo->flags & US_FL_NO_READ_CAPACITY_16) in uas_sdev_configure()
861 sdev->no_read_capacity_16 = 1; in uas_sdev_configure()
864 if (devinfo->flags & US_FL_NO_SAME) in uas_sdev_configure()
865 sdev->no_write_same = 1; in uas_sdev_configure()
871 if (devinfo->flags & US_FL_FIX_CAPACITY) in uas_sdev_configure()
872 sdev->fix_capacity = 1; in uas_sdev_configure()
877 if (devinfo->flags & US_FL_CAPACITY_HEURISTICS) in uas_sdev_configure()
878 sdev->guess_capacity = 1; in uas_sdev_configure()
885 sdev->read_before_ms = 1; in uas_sdev_configure()
890 * is write-protected. Now that we tell the sd driver in uas_sdev_configure()
891 * to do a 192-byte transfer with this command the in uas_sdev_configure()
894 * devices are write-enabled. in uas_sdev_configure()
896 if (devinfo->flags & US_FL_NO_WP_DETECT) in uas_sdev_configure()
897 sdev->skip_ms_page_3f = 1; in uas_sdev_configure()
899 scsi_change_queue_depth(sdev, devinfo->qdepth - 2); in uas_sdev_configure()
912 .this_id = -1,
920 .dma_boundary = PAGE_SIZE - 1,
947 return -ENODEV; in uas_switch_interface()
949 return usb_set_interface(udev, alt->desc.bInterfaceNumber, in uas_switch_interface()
950 alt->desc.bAlternateSetting); in uas_switch_interface()
956 struct usb_device *udev = devinfo->udev; in uas_configure_endpoints()
959 r = uas_find_endpoints(devinfo->intf->cur_altsetting, eps); in uas_configure_endpoints()
963 devinfo->cmd_pipe = usb_sndbulkpipe(udev, in uas_configure_endpoints()
964 usb_endpoint_num(&eps[0]->desc)); in uas_configure_endpoints()
965 devinfo->status_pipe = usb_rcvbulkpipe(udev, in uas_configure_endpoints()
966 usb_endpoint_num(&eps[1]->desc)); in uas_configure_endpoints()
967 devinfo->data_in_pipe = usb_rcvbulkpipe(udev, in uas_configure_endpoints()
968 usb_endpoint_num(&eps[2]->desc)); in uas_configure_endpoints()
969 devinfo->data_out_pipe = usb_sndbulkpipe(udev, in uas_configure_endpoints()
970 usb_endpoint_num(&eps[3]->desc)); in uas_configure_endpoints()
972 if (udev->speed < USB_SPEED_SUPER) { in uas_configure_endpoints()
973 devinfo->qdepth = 32; in uas_configure_endpoints()
974 devinfo->use_streams = 0; in uas_configure_endpoints()
976 devinfo->qdepth = usb_alloc_streams(devinfo->intf, eps + 1, in uas_configure_endpoints()
978 if (devinfo->qdepth < 0) in uas_configure_endpoints()
979 return devinfo->qdepth; in uas_configure_endpoints()
980 devinfo->use_streams = 1; in uas_configure_endpoints()
988 struct usb_device *udev = devinfo->udev; in uas_free_streams()
991 eps[0] = usb_pipe_endpoint(udev, devinfo->status_pipe); in uas_free_streams()
992 eps[1] = usb_pipe_endpoint(udev, devinfo->data_in_pipe); in uas_free_streams()
993 eps[2] = usb_pipe_endpoint(udev, devinfo->data_out_pipe); in uas_free_streams()
994 usb_free_streams(devinfo->intf, eps, 3, GFP_NOIO); in uas_free_streams()
999 int result = -ENOMEM; in uas_probe()
1006 return -ENODEV; in uas_probe()
1009 return -ENODEV; in uas_probe()
1016 shost->max_cmd_len = 16 + 252; in uas_probe()
1017 shost->max_id = 1; in uas_probe()
1018 shost->max_lun = 256; in uas_probe()
1019 shost->max_channel = 0; in uas_probe()
1020 shost->sg_tablesize = udev->bus->sg_tablesize; in uas_probe()
1022 devinfo = (struct uas_dev_info *)shost->hostdata; in uas_probe()
1023 devinfo->intf = intf; in uas_probe()
1024 devinfo->udev = udev; in uas_probe()
1025 devinfo->resetting = 0; in uas_probe()
1026 devinfo->shutdown = 0; in uas_probe()
1027 devinfo->flags = dev_flags; in uas_probe()
1028 init_usb_anchor(&devinfo->cmd_urbs); in uas_probe()
1029 init_usb_anchor(&devinfo->sense_urbs); in uas_probe()
1030 init_usb_anchor(&devinfo->data_urbs); in uas_probe()
1031 spin_lock_init(&devinfo->lock); in uas_probe()
1032 INIT_WORK(&devinfo->work, uas_do_work); in uas_probe()
1033 INIT_WORK(&devinfo->scan_work, uas_scan_work); in uas_probe()
1043 shost->can_queue = devinfo->qdepth - 2; in uas_probe()
1046 result = scsi_add_host(shost, &intf->dev); in uas_probe()
1050 /* Submit the delayed_work for SCSI-device scanning */ in uas_probe()
1051 schedule_work(&devinfo->scan_work); in uas_probe()
1059 usb_set_interface(udev, intf->altsetting[0].desc.bInterfaceNumber, 0); in uas_probe()
1070 spin_lock_irqsave(&devinfo->lock, flags); in uas_cmnd_list_empty()
1072 for (i = 0; i < devinfo->qdepth; i++) { in uas_cmnd_list_empty()
1073 if (devinfo->cmnd[i]) { in uas_cmnd_list_empty()
1079 spin_unlock_irqrestore(&devinfo->lock, flags); in uas_cmnd_list_empty()
1085 * Wait for any pending cmnds to complete, on usb-2 sense_urbs may temporarily
1086 * get empty while there still is more work to do due to sense-urbs completing
1096 flush_work(&devinfo->work); in uas_wait_for_pending_cmnds()
1098 r = usb_wait_anchor_empty_timeout(&devinfo->sense_urbs, 5000); in uas_wait_for_pending_cmnds()
1100 return -ETIME; in uas_wait_for_pending_cmnds()
1102 r = usb_wait_anchor_empty_timeout(&devinfo->data_urbs, 500); in uas_wait_for_pending_cmnds()
1104 return -ETIME; in uas_wait_for_pending_cmnds()
1107 return -ETIME; in uas_wait_for_pending_cmnds()
1116 struct uas_dev_info *devinfo = (struct uas_dev_info *)shost->hostdata; in uas_pre_reset()
1119 if (devinfo->shutdown) in uas_pre_reset()
1123 spin_lock_irqsave(shost->host_lock, flags); in uas_pre_reset()
1125 spin_unlock_irqrestore(shost->host_lock, flags); in uas_pre_reset()
1141 struct uas_dev_info *devinfo = (struct uas_dev_info *)shost->hostdata; in uas_post_reset()
1145 if (devinfo->shutdown) in uas_post_reset()
1149 if (err && err != -ENODEV) in uas_post_reset()
1155 spin_lock_irqsave(shost->host_lock, flags); in uas_post_reset()
1157 spin_unlock_irqrestore(shost->host_lock, flags); in uas_post_reset()
1167 struct uas_dev_info *devinfo = (struct uas_dev_info *)shost->hostdata; in uas_suspend()
1171 return -ETIME; in uas_suspend()
1185 struct uas_dev_info *devinfo = (struct uas_dev_info *)shost->hostdata; in uas_reset_resume()
1194 return -EIO; in uas_reset_resume()
1197 spin_lock_irqsave(shost->host_lock, flags); in uas_reset_resume()
1199 spin_unlock_irqrestore(shost->host_lock, flags); in uas_reset_resume()
1207 struct uas_dev_info *devinfo = (struct uas_dev_info *)shost->hostdata; in uas_disconnect()
1210 spin_lock_irqsave(&devinfo->lock, flags); in uas_disconnect()
1211 devinfo->resetting = 1; in uas_disconnect()
1212 spin_unlock_irqrestore(&devinfo->lock, flags); in uas_disconnect()
1214 cancel_work_sync(&devinfo->work); in uas_disconnect()
1215 usb_kill_anchored_urbs(&devinfo->cmd_urbs); in uas_disconnect()
1216 usb_kill_anchored_urbs(&devinfo->sense_urbs); in uas_disconnect()
1217 usb_kill_anchored_urbs(&devinfo->data_urbs); in uas_disconnect()
1222 * or wait for the SCSI-scanning routine to stop. in uas_disconnect()
1224 cancel_work_sync(&devinfo->scan_work); in uas_disconnect()
1232 * Put the device back in usb-storage mode on shutdown, as some BIOS-es
1234 * necessary as some devices won't revert to usb-storage mode without it.
1240 struct uas_dev_info *devinfo = (struct uas_dev_info *)shost->hostdata; in uas_shutdown()
1245 devinfo->shutdown = 1; in uas_shutdown()
1247 usb_set_interface(udev, intf->altsetting[0].desc.bInterfaceNumber, 0); in uas_shutdown()
1270 return -ENOMEM; in uas_init()
1275 return -ENOMEM; in uas_init()