diff options
author | Hans de Goede <hdegoede@redhat.com> | 2013-11-07 02:52:42 -0500 |
---|---|---|
committer | Sarah Sharp <sarah.a.sharp@linux.intel.com> | 2014-03-04 18:38:25 -0500 |
commit | 876285cc9cf418f626375f28bb0fc5d88012f12d (patch) | |
tree | d1f2a2fa077b121b882a55d1906308b03da6bcc6 /drivers/usb/storage | |
parent | 673331c87c492898a9152f3754f3174128e1514a (diff) |
uas: Improve error reporting
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Signed-off-by: Sarah Sharp <sarah.a.sharp@linux.intel.com>
Diffstat (limited to 'drivers/usb/storage')
-rw-r--r-- | drivers/usb/storage/uas.c | 60 |
1 files changed, 46 insertions, 14 deletions
diff --git a/drivers/usb/storage/uas.c b/drivers/usb/storage/uas.c index 6ec48c2daf45..f09205b162e4 100644 --- a/drivers/usb/storage/uas.c +++ b/drivers/usb/storage/uas.c | |||
@@ -411,6 +411,12 @@ static void uas_data_cmplt(struct urb *urb) | |||
411 | if (sdb == NULL) { | 411 | if (sdb == NULL) { |
412 | WARN_ON_ONCE(1); | 412 | WARN_ON_ONCE(1); |
413 | } else if (urb->status) { | 413 | } else if (urb->status) { |
414 | if (urb->status != -ECONNRESET) { | ||
415 | uas_log_cmd_state(cmnd, __func__); | ||
416 | scmd_printk(KERN_ERR, cmnd, | ||
417 | "data cmplt err %d stream %d\n", | ||
418 | urb->status, urb->stream_id); | ||
419 | } | ||
414 | /* error: no data transfered */ | 420 | /* error: no data transfered */ |
415 | sdb->resid = sdb->length; | 421 | sdb->resid = sdb->length; |
416 | } else { | 422 | } else { |
@@ -420,6 +426,17 @@ static void uas_data_cmplt(struct urb *urb) | |||
420 | spin_unlock_irqrestore(&devinfo->lock, flags); | 426 | spin_unlock_irqrestore(&devinfo->lock, flags); |
421 | } | 427 | } |
422 | 428 | ||
429 | static void uas_cmd_cmplt(struct urb *urb) | ||
430 | { | ||
431 | struct scsi_cmnd *cmnd = urb->context; | ||
432 | |||
433 | if (urb->status) { | ||
434 | uas_log_cmd_state(cmnd, __func__); | ||
435 | scmd_printk(KERN_ERR, cmnd, "cmd cmplt err %d\n", urb->status); | ||
436 | } | ||
437 | usb_free_urb(urb); | ||
438 | } | ||
439 | |||
423 | static struct urb *uas_alloc_data_urb(struct uas_dev_info *devinfo, gfp_t gfp, | 440 | static struct urb *uas_alloc_data_urb(struct uas_dev_info *devinfo, gfp_t gfp, |
424 | unsigned int pipe, u16 stream_id, | 441 | unsigned int pipe, u16 stream_id, |
425 | struct scsi_cmnd *cmnd, | 442 | struct scsi_cmnd *cmnd, |
@@ -497,7 +514,7 @@ static struct urb *uas_alloc_cmd_urb(struct uas_dev_info *devinfo, gfp_t gfp, | |||
497 | memcpy(iu->cdb, cmnd->cmnd, cmnd->cmd_len); | 514 | memcpy(iu->cdb, cmnd->cmnd, cmnd->cmd_len); |
498 | 515 | ||
499 | usb_fill_bulk_urb(urb, udev, devinfo->cmd_pipe, iu, sizeof(*iu) + len, | 516 | usb_fill_bulk_urb(urb, udev, devinfo->cmd_pipe, iu, sizeof(*iu) + len, |
500 | usb_free_urb, NULL); | 517 | uas_cmd_cmplt, cmnd); |
501 | urb->transfer_flags |= URB_FREE_BUFFER; | 518 | urb->transfer_flags |= URB_FREE_BUFFER; |
502 | out: | 519 | out: |
503 | return urb; | 520 | return urb; |
@@ -537,13 +554,15 @@ static int uas_submit_task_urb(struct scsi_cmnd *cmnd, gfp_t gfp, | |||
537 | } | 554 | } |
538 | 555 | ||
539 | usb_fill_bulk_urb(urb, udev, devinfo->cmd_pipe, iu, sizeof(*iu), | 556 | usb_fill_bulk_urb(urb, udev, devinfo->cmd_pipe, iu, sizeof(*iu), |
540 | usb_free_urb, NULL); | 557 | uas_cmd_cmplt, cmnd); |
541 | urb->transfer_flags |= URB_FREE_BUFFER; | 558 | urb->transfer_flags |= URB_FREE_BUFFER; |
542 | 559 | ||
543 | usb_anchor_urb(urb, &devinfo->cmd_urbs); | 560 | usb_anchor_urb(urb, &devinfo->cmd_urbs); |
544 | err = usb_submit_urb(urb, gfp); | 561 | err = usb_submit_urb(urb, gfp); |
545 | if (err) { | 562 | if (err) { |
546 | usb_unanchor_urb(urb); | 563 | usb_unanchor_urb(urb); |
564 | uas_log_cmd_state(cmnd, __func__); | ||
565 | scmd_printk(KERN_ERR, cmnd, "task submission err %d\n", err); | ||
547 | goto err; | 566 | goto err; |
548 | } | 567 | } |
549 | 568 | ||
@@ -560,20 +579,25 @@ err: | |||
560 | * daft to me. | 579 | * daft to me. |
561 | */ | 580 | */ |
562 | 581 | ||
563 | static struct urb *uas_submit_sense_urb(struct Scsi_Host *shost, | 582 | static struct urb *uas_submit_sense_urb(struct scsi_cmnd *cmnd, |
564 | gfp_t gfp, unsigned int stream) | 583 | gfp_t gfp, unsigned int stream) |
565 | { | 584 | { |
585 | struct Scsi_Host *shost = cmnd->device->host; | ||
566 | struct uas_dev_info *devinfo = (struct uas_dev_info *)shost->hostdata; | 586 | struct uas_dev_info *devinfo = (struct uas_dev_info *)shost->hostdata; |
567 | struct urb *urb; | 587 | struct urb *urb; |
588 | int err; | ||
568 | 589 | ||
569 | urb = uas_alloc_sense_urb(devinfo, gfp, shost, stream); | 590 | urb = uas_alloc_sense_urb(devinfo, gfp, shost, stream); |
570 | if (!urb) | 591 | if (!urb) |
571 | return NULL; | 592 | return NULL; |
572 | usb_anchor_urb(urb, &devinfo->sense_urbs); | 593 | usb_anchor_urb(urb, &devinfo->sense_urbs); |
573 | if (usb_submit_urb(urb, gfp)) { | 594 | err = usb_submit_urb(urb, gfp); |
595 | if (err) { | ||
574 | usb_unanchor_urb(urb); | 596 | usb_unanchor_urb(urb); |
597 | uas_log_cmd_state(cmnd, __func__); | ||
575 | shost_printk(KERN_INFO, shost, | 598 | shost_printk(KERN_INFO, shost, |
576 | "sense urb submission failure\n"); | 599 | "sense urb submission error %d stream %d\n", |
600 | err, stream); | ||
577 | usb_free_urb(urb); | 601 | usb_free_urb(urb); |
578 | return NULL; | 602 | return NULL; |
579 | } | 603 | } |
@@ -585,11 +609,11 @@ static int uas_submit_urbs(struct scsi_cmnd *cmnd, | |||
585 | { | 609 | { |
586 | struct uas_cmd_info *cmdinfo = (void *)&cmnd->SCp; | 610 | struct uas_cmd_info *cmdinfo = (void *)&cmnd->SCp; |
587 | struct urb *urb; | 611 | struct urb *urb; |
612 | int err; | ||
588 | 613 | ||
589 | WARN_ON_ONCE(!spin_is_locked(&devinfo->lock)); | 614 | WARN_ON_ONCE(!spin_is_locked(&devinfo->lock)); |
590 | if (cmdinfo->state & SUBMIT_STATUS_URB) { | 615 | if (cmdinfo->state & SUBMIT_STATUS_URB) { |
591 | urb = uas_submit_sense_urb(cmnd->device->host, gfp, | 616 | urb = uas_submit_sense_urb(cmnd, gfp, cmdinfo->stream); |
592 | cmdinfo->stream); | ||
593 | if (!urb) | 617 | if (!urb) |
594 | return SCSI_MLQUEUE_DEVICE_BUSY; | 618 | return SCSI_MLQUEUE_DEVICE_BUSY; |
595 | cmdinfo->state &= ~SUBMIT_STATUS_URB; | 619 | cmdinfo->state &= ~SUBMIT_STATUS_URB; |
@@ -606,10 +630,13 @@ static int uas_submit_urbs(struct scsi_cmnd *cmnd, | |||
606 | 630 | ||
607 | if (cmdinfo->state & SUBMIT_DATA_IN_URB) { | 631 | if (cmdinfo->state & SUBMIT_DATA_IN_URB) { |
608 | usb_anchor_urb(cmdinfo->data_in_urb, &devinfo->data_urbs); | 632 | usb_anchor_urb(cmdinfo->data_in_urb, &devinfo->data_urbs); |
609 | if (usb_submit_urb(cmdinfo->data_in_urb, gfp)) { | 633 | err = usb_submit_urb(cmdinfo->data_in_urb, gfp); |
634 | if (err) { | ||
610 | usb_unanchor_urb(cmdinfo->data_in_urb); | 635 | usb_unanchor_urb(cmdinfo->data_in_urb); |
636 | uas_log_cmd_state(cmnd, __func__); | ||
611 | scmd_printk(KERN_INFO, cmnd, | 637 | scmd_printk(KERN_INFO, cmnd, |
612 | "data in urb submission failure\n"); | 638 | "data in urb submission error %d stream %d\n", |
639 | err, cmdinfo->data_in_urb->stream_id); | ||
613 | return SCSI_MLQUEUE_DEVICE_BUSY; | 640 | return SCSI_MLQUEUE_DEVICE_BUSY; |
614 | } | 641 | } |
615 | cmdinfo->state &= ~SUBMIT_DATA_IN_URB; | 642 | cmdinfo->state &= ~SUBMIT_DATA_IN_URB; |
@@ -627,10 +654,13 @@ static int uas_submit_urbs(struct scsi_cmnd *cmnd, | |||
627 | 654 | ||
628 | if (cmdinfo->state & SUBMIT_DATA_OUT_URB) { | 655 | if (cmdinfo->state & SUBMIT_DATA_OUT_URB) { |
629 | usb_anchor_urb(cmdinfo->data_out_urb, &devinfo->data_urbs); | 656 | usb_anchor_urb(cmdinfo->data_out_urb, &devinfo->data_urbs); |
630 | if (usb_submit_urb(cmdinfo->data_out_urb, gfp)) { | 657 | err = usb_submit_urb(cmdinfo->data_out_urb, gfp); |
658 | if (err) { | ||
631 | usb_unanchor_urb(cmdinfo->data_out_urb); | 659 | usb_unanchor_urb(cmdinfo->data_out_urb); |
660 | uas_log_cmd_state(cmnd, __func__); | ||
632 | scmd_printk(KERN_INFO, cmnd, | 661 | scmd_printk(KERN_INFO, cmnd, |
633 | "data out urb submission failure\n"); | 662 | "data out urb submission error %d stream %d\n", |
663 | err, cmdinfo->data_out_urb->stream_id); | ||
634 | return SCSI_MLQUEUE_DEVICE_BUSY; | 664 | return SCSI_MLQUEUE_DEVICE_BUSY; |
635 | } | 665 | } |
636 | cmdinfo->state &= ~SUBMIT_DATA_OUT_URB; | 666 | cmdinfo->state &= ~SUBMIT_DATA_OUT_URB; |
@@ -646,10 +676,12 @@ static int uas_submit_urbs(struct scsi_cmnd *cmnd, | |||
646 | 676 | ||
647 | if (cmdinfo->state & SUBMIT_CMD_URB) { | 677 | if (cmdinfo->state & SUBMIT_CMD_URB) { |
648 | usb_anchor_urb(cmdinfo->cmd_urb, &devinfo->cmd_urbs); | 678 | usb_anchor_urb(cmdinfo->cmd_urb, &devinfo->cmd_urbs); |
649 | if (usb_submit_urb(cmdinfo->cmd_urb, gfp)) { | 679 | err = usb_submit_urb(cmdinfo->cmd_urb, gfp); |
680 | if (err) { | ||
650 | usb_unanchor_urb(cmdinfo->cmd_urb); | 681 | usb_unanchor_urb(cmdinfo->cmd_urb); |
682 | uas_log_cmd_state(cmnd, __func__); | ||
651 | scmd_printk(KERN_INFO, cmnd, | 683 | scmd_printk(KERN_INFO, cmnd, |
652 | "cmd urb submission failure\n"); | 684 | "cmd urb submission error %d\n", err); |
653 | return SCSI_MLQUEUE_DEVICE_BUSY; | 685 | return SCSI_MLQUEUE_DEVICE_BUSY; |
654 | } | 686 | } |
655 | cmdinfo->cmd_urb = NULL; | 687 | cmdinfo->cmd_urb = NULL; |
@@ -760,7 +792,7 @@ static int uas_eh_task_mgmt(struct scsi_cmnd *cmnd, | |||
760 | 792 | ||
761 | devinfo->running_task = 1; | 793 | devinfo->running_task = 1; |
762 | memset(&devinfo->response, 0, sizeof(devinfo->response)); | 794 | memset(&devinfo->response, 0, sizeof(devinfo->response)); |
763 | sense_urb = uas_submit_sense_urb(shost, GFP_NOIO, | 795 | sense_urb = uas_submit_sense_urb(cmnd, GFP_NOIO, |
764 | devinfo->use_streams ? tag : 0); | 796 | devinfo->use_streams ? tag : 0); |
765 | if (!sense_urb) { | 797 | if (!sense_urb) { |
766 | shost_printk(KERN_INFO, shost, | 798 | shost_printk(KERN_INFO, shost, |