17689e82efdb636e8a076a1293b977bce313110c5Cornelia Huck/* 27689e82efdb636e8a076a1293b977bce313110c5Cornelia Huck * SCSI library functions depending on DMA 37689e82efdb636e8a076a1293b977bce313110c5Cornelia Huck */ 47689e82efdb636e8a076a1293b977bce313110c5Cornelia Huck 57689e82efdb636e8a076a1293b977bce313110c5Cornelia Huck#include <linux/blkdev.h> 67689e82efdb636e8a076a1293b977bce313110c5Cornelia Huck#include <linux/device.h> 709703660edf83b8b6d175440bf745f30580d85abPaul Gortmaker#include <linux/export.h> 87689e82efdb636e8a076a1293b977bce313110c5Cornelia Huck#include <linux/kernel.h> 97689e82efdb636e8a076a1293b977bce313110c5Cornelia Huck 107689e82efdb636e8a076a1293b977bce313110c5Cornelia Huck#include <scsi/scsi.h> 117689e82efdb636e8a076a1293b977bce313110c5Cornelia Huck#include <scsi/scsi_cmnd.h> 127689e82efdb636e8a076a1293b977bce313110c5Cornelia Huck#include <scsi/scsi_device.h> 137689e82efdb636e8a076a1293b977bce313110c5Cornelia Huck#include <scsi/scsi_host.h> 147689e82efdb636e8a076a1293b977bce313110c5Cornelia Huck 157689e82efdb636e8a076a1293b977bce313110c5Cornelia Huck/** 167689e82efdb636e8a076a1293b977bce313110c5Cornelia Huck * scsi_dma_map - perform DMA mapping against command's sg lists 177689e82efdb636e8a076a1293b977bce313110c5Cornelia Huck * @cmd: scsi command 187689e82efdb636e8a076a1293b977bce313110c5Cornelia Huck * 197689e82efdb636e8a076a1293b977bce313110c5Cornelia Huck * Returns the number of sg lists actually used, zero if the sg lists 207689e82efdb636e8a076a1293b977bce313110c5Cornelia Huck * is NULL, or -ENOMEM if the mapping failed. 217689e82efdb636e8a076a1293b977bce313110c5Cornelia Huck */ 227689e82efdb636e8a076a1293b977bce313110c5Cornelia Huckint scsi_dma_map(struct scsi_cmnd *cmd) 237689e82efdb636e8a076a1293b977bce313110c5Cornelia Huck{ 247689e82efdb636e8a076a1293b977bce313110c5Cornelia Huck int nseg = 0; 257689e82efdb636e8a076a1293b977bce313110c5Cornelia Huck 267689e82efdb636e8a076a1293b977bce313110c5Cornelia Huck if (scsi_sg_count(cmd)) { 27d139b9bd0e52dda14fd13412e7096e68b56d0076James Bottomley struct device *dev = cmd->device->host->dma_dev; 287689e82efdb636e8a076a1293b977bce313110c5Cornelia Huck 297689e82efdb636e8a076a1293b977bce313110c5Cornelia Huck nseg = dma_map_sg(dev, scsi_sglist(cmd), scsi_sg_count(cmd), 307689e82efdb636e8a076a1293b977bce313110c5Cornelia Huck cmd->sc_data_direction); 317689e82efdb636e8a076a1293b977bce313110c5Cornelia Huck if (unlikely(!nseg)) 327689e82efdb636e8a076a1293b977bce313110c5Cornelia Huck return -ENOMEM; 337689e82efdb636e8a076a1293b977bce313110c5Cornelia Huck } 347689e82efdb636e8a076a1293b977bce313110c5Cornelia Huck return nseg; 357689e82efdb636e8a076a1293b977bce313110c5Cornelia Huck} 367689e82efdb636e8a076a1293b977bce313110c5Cornelia HuckEXPORT_SYMBOL(scsi_dma_map); 377689e82efdb636e8a076a1293b977bce313110c5Cornelia Huck 387689e82efdb636e8a076a1293b977bce313110c5Cornelia Huck/** 397689e82efdb636e8a076a1293b977bce313110c5Cornelia Huck * scsi_dma_unmap - unmap command's sg lists mapped by scsi_dma_map 407689e82efdb636e8a076a1293b977bce313110c5Cornelia Huck * @cmd: scsi command 417689e82efdb636e8a076a1293b977bce313110c5Cornelia Huck */ 427689e82efdb636e8a076a1293b977bce313110c5Cornelia Huckvoid scsi_dma_unmap(struct scsi_cmnd *cmd) 437689e82efdb636e8a076a1293b977bce313110c5Cornelia Huck{ 447689e82efdb636e8a076a1293b977bce313110c5Cornelia Huck if (scsi_sg_count(cmd)) { 45d139b9bd0e52dda14fd13412e7096e68b56d0076James Bottomley struct device *dev = cmd->device->host->dma_dev; 467689e82efdb636e8a076a1293b977bce313110c5Cornelia Huck 477689e82efdb636e8a076a1293b977bce313110c5Cornelia Huck dma_unmap_sg(dev, scsi_sglist(cmd), scsi_sg_count(cmd), 487689e82efdb636e8a076a1293b977bce313110c5Cornelia Huck cmd->sc_data_direction); 497689e82efdb636e8a076a1293b977bce313110c5Cornelia Huck } 507689e82efdb636e8a076a1293b977bce313110c5Cornelia Huck} 517689e82efdb636e8a076a1293b977bce313110c5Cornelia HuckEXPORT_SYMBOL(scsi_dma_unmap); 52