d139b9bd0e
Some of our virtual SCSI hosts don't have a proper bus parent at the top, which can be a problem for doing DMA on them This patch makes the host device cache a pointer to the physical bus device and provides an extra API for setting it (the normal API picks it up from the parent). This patch also modifies the qla2xxx and lpfc vport logic to use the new DMA host setting API. Acked-By: James Smart <james.smart@emulex.com> Cc: Stable Tree <stable@kernel.org> Signed-off-by: James Bottomley <James.Bottomley@suse.de>
50 lines
1.1 KiB
C
50 lines
1.1 KiB
C
/*
|
|
* SCSI library functions depending on DMA
|
|
*/
|
|
|
|
#include <linux/blkdev.h>
|
|
#include <linux/device.h>
|
|
#include <linux/kernel.h>
|
|
|
|
#include <scsi/scsi.h>
|
|
#include <scsi/scsi_cmnd.h>
|
|
#include <scsi/scsi_device.h>
|
|
#include <scsi/scsi_host.h>
|
|
|
|
/**
|
|
* scsi_dma_map - perform DMA mapping against command's sg lists
|
|
* @cmd: scsi command
|
|
*
|
|
* Returns the number of sg lists actually used, zero if the sg lists
|
|
* is NULL, or -ENOMEM if the mapping failed.
|
|
*/
|
|
int scsi_dma_map(struct scsi_cmnd *cmd)
|
|
{
|
|
int nseg = 0;
|
|
|
|
if (scsi_sg_count(cmd)) {
|
|
struct device *dev = cmd->device->host->dma_dev;
|
|
|
|
nseg = dma_map_sg(dev, scsi_sglist(cmd), scsi_sg_count(cmd),
|
|
cmd->sc_data_direction);
|
|
if (unlikely(!nseg))
|
|
return -ENOMEM;
|
|
}
|
|
return nseg;
|
|
}
|
|
EXPORT_SYMBOL(scsi_dma_map);
|
|
|
|
/**
|
|
* scsi_dma_unmap - unmap command's sg lists mapped by scsi_dma_map
|
|
* @cmd: scsi command
|
|
*/
|
|
void scsi_dma_unmap(struct scsi_cmnd *cmd)
|
|
{
|
|
if (scsi_sg_count(cmd)) {
|
|
struct device *dev = cmd->device->host->dma_dev;
|
|
|
|
dma_unmap_sg(dev, scsi_sglist(cmd), scsi_sg_count(cmd),
|
|
cmd->sc_data_direction);
|
|
}
|
|
}
|
|
EXPORT_SYMBOL(scsi_dma_unmap);
|