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