1 /* 2 * SCSI library functions depending on DMA 3 */ 4 5 #include <linux/blkdev.h> 6 #include <linux/device.h> 7 #include <linux/export.h> 8 #include <linux/kernel.h> 9 10 #include <scsi/scsi.h> 11 #include <scsi/scsi_cmnd.h> 12 #include <scsi/scsi_device.h> 13 #include <scsi/scsi_host.h> 14 15 /** 16 * scsi_dma_map - perform DMA mapping against command's sg lists 17 * @cmd: scsi command 18 * 19 * Returns the number of sg lists actually used, zero if the sg lists 20 * is NULL, or -ENOMEM if the mapping failed. 21 */ 22 int scsi_dma_map(struct scsi_cmnd *cmd) 23 { 24 int nseg = 0; 25 26 if (scsi_sg_count(cmd)) { 27 struct device *dev = cmd->device->host->dma_dev; 28 29 nseg = dma_map_sg(dev, scsi_sglist(cmd), scsi_sg_count(cmd), 30 cmd->sc_data_direction); 31 if (unlikely(!nseg)) 32 return -ENOMEM; 33 } 34 return nseg; 35 } 36 EXPORT_SYMBOL(scsi_dma_map); 37 38 /** 39 * scsi_dma_unmap - unmap command's sg lists mapped by scsi_dma_map 40 * @cmd: scsi command 41 */ 42 void scsi_dma_unmap(struct scsi_cmnd *cmd) 43 { 44 if (scsi_sg_count(cmd)) { 45 struct device *dev = cmd->device->host->dma_dev; 46 47 dma_unmap_sg(dev, scsi_sglist(cmd), scsi_sg_count(cmd), 48 cmd->sc_data_direction); 49 } 50 } 51 EXPORT_SYMBOL(scsi_dma_unmap); 52