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 <steven.matthews@unisys.com>
Signed-off-by: David Kershner <david.kershner@unisys.com>
Reviewed-by: Tim Sell <timothy.sell@unisys.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
Steven Matthews 2017-08-22 13:27:02 -04:00 committed by Greg Kroah-Hartman
parent 12cbd49043
commit 55515a30d2
2 changed files with 37 additions and 4 deletions

View File

@ -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;

View File

@ -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);