uas: Reduce number of function arguments for uas_alloc_foo functions
[firefly-linux-kernel-4.4.55.git] / drivers / usb / storage / uas.c
index 816f566586282dfcb3d070b43d033558fb7edd2d..d1dbe8833b4aca445db23a5d43a69d7c96030a51 100644 (file)
@@ -328,6 +328,16 @@ static void uas_stat_cmplt(struct urb *urb)
                }
                uas_xfer_data(urb, cmnd, SUBMIT_DATA_OUT_URB);
                break;
+       case IU_ID_RESPONSE:
+               uas_log_cmd_state(cmnd, "unexpected response iu",
+                                 ((struct response_iu *)iu)->response_code);
+               /* Error, cancel data transfers */
+               data_in_urb = usb_get_urb(cmdinfo->data_in_urb);
+               data_out_urb = usb_get_urb(cmdinfo->data_out_urb);
+               cmdinfo->state &= ~COMMAND_INFLIGHT;
+               cmnd->result = DID_ERROR << 16;
+               uas_try_complete(cmnd, __func__);
+               break;
        default:
                uas_log_cmd_state(cmnd, "bogus IU", iu->iu_id);
        }
@@ -402,20 +412,22 @@ static void uas_cmd_cmplt(struct urb *urb)
 }
 
 static struct urb *uas_alloc_data_urb(struct uas_dev_info *devinfo, gfp_t gfp,
-                                     unsigned int pipe, u16 stream_id,
                                      struct scsi_cmnd *cmnd,
                                      enum dma_data_direction dir)
 {
        struct usb_device *udev = devinfo->udev;
+       struct uas_cmd_info *cmdinfo = (void *)&cmnd->SCp;
        struct urb *urb = usb_alloc_urb(0, gfp);
        struct scsi_data_buffer *sdb = (dir == DMA_FROM_DEVICE)
                ? scsi_in(cmnd) : scsi_out(cmnd);
+       unsigned int pipe = (dir == DMA_FROM_DEVICE)
+               ? devinfo->data_in_pipe : devinfo->data_out_pipe;
 
        if (!urb)
                goto out;
        usb_fill_bulk_urb(urb, udev, pipe, NULL, sdb->length,
                          uas_data_cmplt, cmnd);
-       urb->stream_id = stream_id;
+       urb->stream_id = cmdinfo->stream;
        urb->num_sgs = udev->bus->sg_tablesize ? sdb->table.nents : 0;
        urb->sg = sdb->table.sgl;
  out:
@@ -423,9 +435,10 @@ static struct urb *uas_alloc_data_urb(struct uas_dev_info *devinfo, gfp_t gfp,
 }
 
 static struct urb *uas_alloc_sense_urb(struct uas_dev_info *devinfo, gfp_t gfp,
-                                      struct Scsi_Host *shost, u16 stream_id)
+                                      struct scsi_cmnd *cmnd)
 {
        struct usb_device *udev = devinfo->udev;
+       struct uas_cmd_info *cmdinfo = (void *)&cmnd->SCp;
        struct urb *urb = usb_alloc_urb(0, gfp);
        struct sense_iu *iu;
 
@@ -437,8 +450,8 @@ static struct urb *uas_alloc_sense_urb(struct uas_dev_info *devinfo, gfp_t gfp,
                goto free;
 
        usb_fill_bulk_urb(urb, udev, devinfo->status_pipe, iu, sizeof(*iu),
-                                               uas_stat_cmplt, shost);
-       urb->stream_id = stream_id;
+                         uas_stat_cmplt, cmnd->device->host);
+       urb->stream_id = cmdinfo->stream;
        urb->transfer_flags |= URB_FREE_BUFFER;
  out:
        return urb;
@@ -490,15 +503,13 @@ static struct urb *uas_alloc_cmd_urb(struct uas_dev_info *devinfo, gfp_t gfp,
  * daft to me.
  */
 
-static struct urb *uas_submit_sense_urb(struct scsi_cmnd *cmnd,
-                                       gfp_t gfp, unsigned int stream)
+static struct urb *uas_submit_sense_urb(struct scsi_cmnd *cmnd, gfp_t gfp)
 {
-       struct Scsi_Host *shost = cmnd->device->host;
-       struct uas_dev_info *devinfo = (struct uas_dev_info *)shost->hostdata;
+       struct uas_dev_info *devinfo = cmnd->device->hostdata;
        struct urb *urb;
        int err;
 
-       urb = uas_alloc_sense_urb(devinfo, gfp, shost, stream);
+       urb = uas_alloc_sense_urb(devinfo, gfp, cmnd);
        if (!urb)
                return NULL;
        usb_anchor_urb(urb, &devinfo->sense_urbs);
@@ -521,7 +532,7 @@ static int uas_submit_urbs(struct scsi_cmnd *cmnd,
 
        lockdep_assert_held(&devinfo->lock);
        if (cmdinfo->state & SUBMIT_STATUS_URB) {
-               urb = uas_submit_sense_urb(cmnd, gfp, cmdinfo->stream);
+               urb = uas_submit_sense_urb(cmnd, gfp);
                if (!urb)
                        return SCSI_MLQUEUE_DEVICE_BUSY;
                cmdinfo->state &= ~SUBMIT_STATUS_URB;
@@ -529,8 +540,7 @@ static int uas_submit_urbs(struct scsi_cmnd *cmnd,
 
        if (cmdinfo->state & ALLOC_DATA_IN_URB) {
                cmdinfo->data_in_urb = uas_alloc_data_urb(devinfo, gfp,
-                                       devinfo->data_in_pipe, cmdinfo->stream,
-                                       cmnd, DMA_FROM_DEVICE);
+                                                       cmnd, DMA_FROM_DEVICE);
                if (!cmdinfo->data_in_urb)
                        return SCSI_MLQUEUE_DEVICE_BUSY;
                cmdinfo->state &= ~ALLOC_DATA_IN_URB;
@@ -550,8 +560,7 @@ static int uas_submit_urbs(struct scsi_cmnd *cmnd,
 
        if (cmdinfo->state & ALLOC_DATA_OUT_URB) {
                cmdinfo->data_out_urb = uas_alloc_data_urb(devinfo, gfp,
-                                       devinfo->data_out_pipe, cmdinfo->stream,
-                                       cmnd, DMA_TO_DEVICE);
+                                                       cmnd, DMA_TO_DEVICE);
                if (!cmdinfo->data_out_urb)
                        return SCSI_MLQUEUE_DEVICE_BUSY;
                cmdinfo->state &= ~ALLOC_DATA_OUT_URB;
@@ -750,7 +759,8 @@ static int uas_eh_bus_reset_handler(struct scsi_cmnd *cmnd)
        usb_unlock_device(udev);
 
        if (err) {
-               shost_printk(KERN_INFO, sdev->host, "%s FAILED\n", __func__);
+               shost_printk(KERN_INFO, sdev->host, "%s FAILED err %d\n",
+                            __func__, err);
                return FAILED;
        }
 
@@ -1024,13 +1034,16 @@ static int uas_post_reset(struct usb_interface *intf)
        struct Scsi_Host *shost = usb_get_intfdata(intf);
        struct uas_dev_info *devinfo = (struct uas_dev_info *)shost->hostdata;
        unsigned long flags;
+       int err;
 
        if (devinfo->shutdown)
                return 0;
 
-       if (uas_configure_endpoints(devinfo) != 0) {
+       err = uas_configure_endpoints(devinfo);
+       if (err) {
                shost_printk(KERN_ERR, shost,
-                            "%s: alloc streams error after reset", __func__);
+                            "%s: alloc streams error %d after reset",
+                            __func__, err);
                return 1;
        }
 
@@ -1066,10 +1079,13 @@ static int uas_reset_resume(struct usb_interface *intf)
        struct Scsi_Host *shost = usb_get_intfdata(intf);
        struct uas_dev_info *devinfo = (struct uas_dev_info *)shost->hostdata;
        unsigned long flags;
+       int err;
 
-       if (uas_configure_endpoints(devinfo) != 0) {
+       err = uas_configure_endpoints(devinfo);
+       if (err) {
                shost_printk(KERN_ERR, shost,
-                            "%s: alloc streams error after reset", __func__);
+                            "%s: alloc streams error %d after reset",
+                            __func__, err);
                return -EIO;
        }