These changes are the raw update to linux-4.4.6-rt14. Kernel sources
[kvmfornfv.git] / kernel / drivers / usb / storage / uas.c
index 6d3122a..5c66d3f 100644 (file)
@@ -257,17 +257,16 @@ static void uas_stat_cmplt(struct urb *urb)
        struct uas_cmd_info *cmdinfo;
        unsigned long flags;
        unsigned int idx;
+       int status = urb->status;
 
        spin_lock_irqsave(&devinfo->lock, flags);
 
        if (devinfo->resetting)
                goto out;
 
-       if (urb->status) {
-               if (urb->status != -ENOENT && urb->status != -ECONNRESET) {
-                       dev_err(&urb->dev->dev, "stat urb: status %d\n",
-                               urb->status);
-               }
+       if (status) {
+               if (status != -ENOENT && status != -ECONNRESET && status != -ESHUTDOWN)
+                       dev_err(&urb->dev->dev, "stat urb: status %d\n", status);
                goto out;
        }
 
@@ -348,6 +347,7 @@ static void uas_data_cmplt(struct urb *urb)
        struct uas_dev_info *devinfo = (void *)cmnd->device->hostdata;
        struct scsi_data_buffer *sdb = NULL;
        unsigned long flags;
+       int status = urb->status;
 
        spin_lock_irqsave(&devinfo->lock, flags);
 
@@ -374,9 +374,9 @@ static void uas_data_cmplt(struct urb *urb)
                goto out;
        }
 
-       if (urb->status) {
-               if (urb->status != -ENOENT && urb->status != -ECONNRESET)
-                       uas_log_cmd_state(cmnd, "data cmplt err", urb->status);
+       if (status) {
+               if (status != -ENOENT && status != -ECONNRESET && status != -ESHUTDOWN)
+                       uas_log_cmd_state(cmnd, "data cmplt err", status);
                /* error: no data transfered */
                sdb->resid = sdb->length;
        } else {
@@ -796,6 +796,10 @@ static int uas_slave_configure(struct scsi_device *sdev)
        if (devinfo->flags & US_FL_NO_REPORT_OPCODES)
                sdev->no_report_opcodes = 1;
 
+       /* A few buggy USB-ATA bridges don't understand FUA */
+       if (devinfo->flags & US_FL_BROKEN_FUA)
+               sdev->broken_fua = 1;
+
        scsi_change_queue_depth(sdev, devinfo->qdepth - 2);
        return 0;
 }
@@ -811,9 +815,7 @@ static struct scsi_host_template uas_host_template = {
        .can_queue = 65536,     /* Is there a limit on the _host_ ? */
        .this_id = -1,
        .sg_tablesize = SG_NONE,
-       .cmd_per_lun = 1,       /* until we override it */
        .skip_settle_delay = 1,
-       .use_blk_tags = 1,
 };
 
 #define UNUSUAL_DEV(id_vendor, id_product, bcdDeviceMin, bcdDeviceMax, \
@@ -930,10 +932,6 @@ static int uas_probe(struct usb_interface *intf, const struct usb_device_id *id)
        if (result)
                goto set_alt0;
 
-       result = scsi_init_shared_tag_map(shost, devinfo->qdepth - 2);
-       if (result)
-               goto free_streams;
-
        usb_set_intfdata(intf, shost);
        result = scsi_add_host(shost, &intf->dev);
        if (result)