Commit 55515a30 authored by Steven Matthews's avatar Steven Matthews Committed by Greg Kroah-Hartman
Browse files

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: default avatarSteven Matthews <steven.matthews@unisys.com>
Signed-off-by: default avatarDavid Kershner <david.kershner@unisys.com>
Reviewed-by: default avatarTim Sell <timothy.sell@unisys.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 12cbd490
Loading
Loading
Loading
Loading
+12 −3
Original line number Diff line number Diff line
@@ -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;
+25 −1
Original line number Diff line number Diff line
@@ -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);