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