storvsc: Rather than look for sets of specific protocol versions, make decisions...
[firefly-linux-kernel-4.4.55.git] / drivers / scsi / storvsc_drv.c
index 3c6584ff65c1979b6119c4edce15e6d35eb3957f..05f6f970826ed4a701fd95634f763265ac9a2360 100644 (file)
@@ -426,7 +426,6 @@ static void storvsc_host_scan(struct work_struct *work)
        struct storvsc_scan_work *wrk;
        struct Scsi_Host *host;
        struct scsi_device *sdev;
-       unsigned long flags;
 
        wrk = container_of(work, struct storvsc_scan_work, work);
        host = wrk->host;
@@ -443,14 +442,8 @@ static void storvsc_host_scan(struct work_struct *work)
         * may have been removed this way.
         */
        mutex_lock(&host->scan_mutex);
-       spin_lock_irqsave(host->host_lock, flags);
-       list_for_each_entry(sdev, &host->__devices, siblings) {
-               spin_unlock_irqrestore(host->host_lock, flags);
+       shost_for_each_device(sdev, host)
                scsi_test_unit_ready(sdev, 1, 1, NULL);
-               spin_lock_irqsave(host->host_lock, flags);
-               continue;
-       }
-       spin_unlock_irqrestore(host->host_lock, flags);
        mutex_unlock(&host->scan_mutex);
        /*
         * Now scan the host to discover LUNs that may have been added.
@@ -988,8 +981,7 @@ static int storvsc_channel_init(struct hv_device *device)
         * support multi-channel.
         */
        max_chns = vstor_packet->storage_channel_properties.max_channel_cnt;
-       if ((vmbus_proto_version != VERSION_WIN7) &&
-          (vmbus_proto_version != VERSION_WS2008))  {
+       if (vmbus_proto_version >= VERSION_WIN8) {
                if (vstor_packet->storage_channel_properties.flags &
                    STORAGE_CHANNEL_SUPPORTS_MULTI_CHANNEL)
                        process_sub_channels = true;
@@ -1598,10 +1590,18 @@ static int storvsc_queuecommand(struct Scsi_Host *host, struct scsi_cmnd *scmnd)
                vm_srb->data_in = READ_TYPE;
                vm_srb->win8_extension.srb_flags |= SRB_FLAGS_DATA_IN;
                break;
-       default:
+       case DMA_NONE:
                vm_srb->data_in = UNKNOWN_TYPE;
                vm_srb->win8_extension.srb_flags |= SRB_FLAGS_NO_DATA_TRANSFER;
                break;
+       default:
+               /*
+                * This is DMA_BIDIRECTIONAL or something else we are never
+                * supposed to see here.
+                */
+               WARN(1, "Unexpected data direction: %d\n",
+                    scmnd->sc_data_direction);
+               return -EINVAL;
        }
 
 
@@ -1758,9 +1758,7 @@ static int storvsc_probe(struct hv_device *device,
         * set state to properly communicate with the host.
         */
 
-       switch (vmbus_proto_version) {
-       case VERSION_WS2008:
-       case VERSION_WIN7:
+       if (vmbus_proto_version < VERSION_WIN8) {
                sense_buffer_size = PRE_WIN8_STORVSC_SENSE_BUFFER_SIZE;
                vmscsi_size_delta = sizeof(struct vmscsi_win8_extension);
                vmstor_current_major = VMSTOR_WIN7_MAJOR;
@@ -1768,8 +1766,7 @@ static int storvsc_probe(struct hv_device *device,
                max_luns_per_target = STORVSC_IDE_MAX_LUNS_PER_TARGET;
                max_targets = STORVSC_IDE_MAX_TARGETS;
                max_channels = STORVSC_IDE_MAX_CHANNELS;
-               break;
-       default:
+       } else {
                sense_buffer_size = POST_WIN7_STORVSC_SENSE_BUFFER_SIZE;
                vmscsi_size_delta = 0;
                vmstor_current_major = VMSTOR_WIN8_MAJOR;
@@ -1783,7 +1780,6 @@ static int storvsc_probe(struct hv_device *device,
                 * VCPUs in the guest.
                 */
                max_sub_channels = (num_cpus / storvsc_vcpus_per_sub_channel);
-               break;
        }
 
        scsi_driver.can_queue = (max_outstanding_req_per_channel *