aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/usb/storage
diff options
context:
space:
mode:
authorHans de Goede <hdegoede@redhat.com>2013-11-07 02:52:42 -0500
committerSarah Sharp <sarah.a.sharp@linux.intel.com>2014-03-04 18:38:25 -0500
commit876285cc9cf418f626375f28bb0fc5d88012f12d (patch)
treed1f2a2fa077b121b882a55d1906308b03da6bcc6 /drivers/usb/storage
parent673331c87c492898a9152f3754f3174128e1514a (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.c60
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
429static 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
423static struct urb *uas_alloc_data_urb(struct uas_dev_info *devinfo, gfp_t gfp, 440static 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
563static struct urb *uas_submit_sense_urb(struct Scsi_Host *shost, 582static 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,