From: Steven Matthews <steven.matth...@unisys.com>

Replace use of standard Linux dma_data_direction with a Unisys-
specific uis_dma_data_direction and provide a function to convert
from the latter to the former.  This is necessary because Unisys
s-Par depends on the exact format of this field in multiple OSs
and languages, and so using the standard version creates an
unnecessary dependency between the kernel and s-Par.

Signed-off-by: Steven Matthews <steven.matth...@unisys.com>
Signed-off-by: David Kershner <david.kersh...@unisys.com>
Reviewed-by: Tim Sell <timothy.s...@unisys.com>
---
 drivers/staging/unisys/include/iochannel.h      | 15 ++++++++--
 drivers/staging/unisys/visorhba/visorhba_main.c | 26 +++++++++++++++++-
 2 files changed, 37 insertions(+), 4 deletions(-)

diff --git a/drivers/staging/unisys/include/iochannel.h 
b/drivers/staging/unisys/include/iochannel.h
index d2ef705..53259d6 100644
--- a/drivers/staging/unisys/include/iochannel.h
+++ b/drivers/staging/unisys/include/iochannel.h
@@ -28,7 +28,7 @@
  */
 
 #include <linux/uuid.h>
-#include <linux/dma-direction.h>
+
 #include "channel.h"
 
 /*
@@ -60,6 +60,15 @@
 
 /* Size of cdb - i.e., SCSI cmnd */
 #define MAX_CMND_SIZE 16
+
+/* Unisys-specific DMA direction values */
+enum uis_dma_data_direction {
+       UIS_DMA_BIDIRECTIONAL = 0,
+       UIS_DMA_TO_DEVICE = 1,
+       UIS_DMA_FROM_DEVICE = 2,
+       UIS_DMA_NONE = 3
+};
+
 #define MAX_SENSE_SIZE 64
 #define MAX_PHYS_INFO 64
 
@@ -182,7 +191,7 @@ struct vhba_config_max {
  * @bufflen:           Length of data to be transferred out or in.
  * @guest_phys_entries:        Number of entries in scatter-gather list.
  * @struct gpi_list:   Physical address information for each fragment.
- * @enum data_dir:     Direction of the data, if any.
+ * @data_dir:          Direction of the data, if any.
  * @struct vdest:      Identifies the virtual hba, id, channel, lun to which
  *                     cmd was sent.
  * @linuxstat:         Original Linux status used by Linux vdisk.
@@ -205,7 +214,7 @@ struct uiscmdrsp_scsi {
        u32 bufflen;
        u16 guest_phys_entries;
        struct guest_phys_info gpi_list[MAX_PHYS_INFO];
-       enum dma_data_direction data_dir;
+       u32 data_dir;
        struct uisscsi_dest vdest;
        /* Needed to queue the rsp back to cmd originator. */
        int linuxstat;
diff --git a/drivers/staging/unisys/visorhba/visorhba_main.c 
b/drivers/staging/unisys/visorhba/visorhba_main.c
index 2a4248a..29efdf9 100644
--- a/drivers/staging/unisys/visorhba/visorhba_main.c
+++ b/drivers/staging/unisys/visorhba/visorhba_main.c
@@ -478,6 +478,29 @@ static const char *visorhba_get_info(struct Scsi_Host *shp)
 }
 
 /*
+ * dma_data_dir_linux_to_spar - convert dma_data_direction value to
+ *                             Unisys-specific equivalent
+ * @d: dma direction value to convert
+ *
+ * Returns the Unisys-specific dma direction value corresponding to @d
+ */
+static u32 dma_data_dir_linux_to_spar(enum dma_data_direction d)
+{
+       switch (d) {
+       case DMA_BIDIRECTIONAL:
+               return UIS_DMA_BIDIRECTIONAL;
+       case DMA_TO_DEVICE:
+               return UIS_DMA_TO_DEVICE;
+       case DMA_FROM_DEVICE:
+               return UIS_DMA_FROM_DEVICE;
+       case DMA_NONE:
+               return UIS_DMA_NONE;
+       default:
+               return UIS_DMA_NONE;
+       }
+}
+
+/*
  * visorhba_queue_command_lck - Queues command to the Service Partition
  * @scsicmd:           Command to be queued
  * @vsiorhba_cmnd_done: Done command to call when scsicmd is returned
@@ -525,7 +548,8 @@ static int visorhba_queue_command_lck(struct scsi_cmnd 
*scsicmd,
        cmdrsp->scsi.vdest.id = scsidev->id;
        cmdrsp->scsi.vdest.lun = scsidev->lun;
        /* save datadir */
-       cmdrsp->scsi.data_dir = scsicmd->sc_data_direction;
+       cmdrsp->scsi.data_dir =
+               dma_data_dir_linux_to_spar(scsicmd->sc_data_direction);
        memcpy(cmdrsp->scsi.cmnd, cdb, MAX_CMND_SIZE);
        cmdrsp->scsi.bufflen = scsi_bufflen(scsicmd);
 
-- 
git-series 0.9.1
_______________________________________________
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel

Reply via email to