53 lines · c
1// SPDX-License-Identifier: GPL-2.02/*3 * SCSI library functions depending on DMA4 */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 lists18 * @cmd: scsi command19 *20 * Returns the number of sg lists actually used, zero if the sg lists21 * 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_map41 * @cmd: scsi command42 */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);53