From 55515a30d2e583908145817df2fdf31fa04b4401 Mon Sep 17 00:00:00 2001 From: Steven Matthews Date: Tue, 22 Aug 2017 13:27:02 -0400 Subject: [PATCH] staging: unisys: include: fix improper use of dma_data_direction 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 Signed-off-by: David Kershner Reviewed-by: Tim Sell Signed-off-by: Greg Kroah-Hartman --- drivers/staging/unisys/include/iochannel.h | 15 ++++++++--- .../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 d2ef70549fab..53259d611bd3 100644 --- a/drivers/staging/unisys/include/iochannel.h +++ b/drivers/staging/unisys/include/iochannel.h @@ -28,7 +28,7 @@ */ #include -#include + #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 2a4248ac7d1e..29efdf9ed7ec 100644 --- a/drivers/staging/unisys/visorhba/visorhba_main.c +++ b/drivers/staging/unisys/visorhba/visorhba_main.c @@ -477,6 +477,29 @@ static const char *visorhba_get_info(struct Scsi_Host *shp) return "visorhba"; } +/* + * 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 @@ -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);