]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - drivers/scsi/vmw_pvscsi.c
Merge tag 'for-linus-5.6-ofs1' of git://git.kernel.org/pub/scm/linux/kernel/git/hubca...
[linux.git] / drivers / scsi / vmw_pvscsi.c
index 70008816c91f283200431e2ed8c4f17389527e5c..c3f010df641efa1b569fb014046af4b954b3243d 100644 (file)
@@ -365,7 +365,7 @@ static int pvscsi_map_buffers(struct pvscsi_adapter *adapter,
                int segs = scsi_dma_map(cmd);
 
                if (segs == -ENOMEM) {
-                       scmd_printk(KERN_ERR, cmd,
+                       scmd_printk(KERN_DEBUG, cmd,
                                    "vmw_pvscsi: Failed to map cmd sglist for DMA.\n");
                        return -ENOMEM;
                } else if (segs > 1) {
@@ -392,7 +392,7 @@ static int pvscsi_map_buffers(struct pvscsi_adapter *adapter,
                ctx->dataPA = dma_map_single(&adapter->dev->dev, sg, bufflen,
                                             cmd->sc_data_direction);
                if (dma_mapping_error(&adapter->dev->dev, ctx->dataPA)) {
-                       scmd_printk(KERN_ERR, cmd,
+                       scmd_printk(KERN_DEBUG, cmd,
                                    "vmw_pvscsi: Failed to map direct data buffer for DMA.\n");
                        return -ENOMEM;
                }
@@ -402,6 +402,17 @@ static int pvscsi_map_buffers(struct pvscsi_adapter *adapter,
        return 0;
 }
 
+/*
+ * The device incorrectly doesn't clear the first byte of the sense
+ * buffer in some cases. We have to do it ourselves.
+ * Otherwise we run into trouble when SWIOTLB is forced.
+ */
+static void pvscsi_patch_sense(struct scsi_cmnd *cmd)
+{
+       if (cmd->sense_buffer)
+               cmd->sense_buffer[0] = 0;
+}
+
 static void pvscsi_unmap_buffers(const struct pvscsi_adapter *adapter,
                                 struct pvscsi_ctx *ctx)
 {
@@ -544,6 +555,8 @@ static void pvscsi_complete_request(struct pvscsi_adapter *adapter,
        cmd = ctx->cmd;
        abort_cmp = ctx->abort_cmp;
        pvscsi_unmap_buffers(adapter, ctx);
+       if (sdstat != SAM_STAT_CHECK_CONDITION)
+               pvscsi_patch_sense(cmd);
        pvscsi_release_context(adapter, ctx);
        if (abort_cmp) {
                /*
@@ -712,7 +725,7 @@ static int pvscsi_queue_ring(struct pvscsi_adapter *adapter,
                                cmd->sense_buffer, SCSI_SENSE_BUFFERSIZE,
                                DMA_FROM_DEVICE);
                if (dma_mapping_error(&adapter->dev->dev, ctx->sensePA)) {
-                       scmd_printk(KERN_ERR, cmd,
+                       scmd_printk(KERN_DEBUG, cmd,
                                    "vmw_pvscsi: Failed to map sense buffer for DMA.\n");
                        ctx->sensePA = 0;
                        return -ENOMEM;
@@ -873,6 +886,7 @@ static void pvscsi_reset_all(struct pvscsi_adapter *adapter)
                        scmd_printk(KERN_ERR, cmd,
                                    "Forced reset on cmd %p\n", cmd);
                        pvscsi_unmap_buffers(adapter, ctx);
+                       pvscsi_patch_sense(cmd);
                        pvscsi_release_context(adapter, ctx);
                        cmd->result = (DID_RESET << 16);
                        cmd->scsi_done(cmd);