scsi: pm8001: switch to generic DMA API

Switch from the legacy PCI DMA API to the generic DMA API.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Johannes Thumshirn <jthumshirn@suse.de>
Reviewed-by: Jack Wang <jinpu.wang@profitbricks.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
This commit is contained in:
Christoph Hellwig 2018-10-10 19:59:50 +02:00 committed by Martin K. Petersen
parent 03676e1d31
commit f73bdebdf0
4 changed files with 31 additions and 49 deletions

View File

@ -2420,7 +2420,7 @@ mpi_sata_completion(struct pm8001_hba_info *pm8001_ha, void *piomb)
sata_resp = &psataPayload->sata_resp[0]; sata_resp = &psataPayload->sata_resp[0];
resp = (struct ata_task_resp *)ts->buf; resp = (struct ata_task_resp *)ts->buf;
if (t->ata_task.dma_xfer == 0 && if (t->ata_task.dma_xfer == 0 &&
t->data_dir == PCI_DMA_FROMDEVICE) { t->data_dir == DMA_FROM_DEVICE) {
len = sizeof(struct pio_setup_fis); len = sizeof(struct pio_setup_fis);
PM8001_IO_DBG(pm8001_ha, PM8001_IO_DBG(pm8001_ha,
pm8001_printk("PIO read len = %d\n", len)); pm8001_printk("PIO read len = %d\n", len));
@ -4203,12 +4203,12 @@ static int process_oq(struct pm8001_hba_info *pm8001_ha, u8 vec)
return ret; return ret;
} }
/* PCI_DMA_... to our direction translation. */ /* DMA_... to our direction translation. */
static const u8 data_dir_flags[] = { static const u8 data_dir_flags[] = {
[PCI_DMA_BIDIRECTIONAL] = DATA_DIR_BYRECIPIENT,/* UNSPECIFIED */ [DMA_BIDIRECTIONAL] = DATA_DIR_BYRECIPIENT, /* UNSPECIFIED */
[PCI_DMA_TODEVICE] = DATA_DIR_OUT,/* OUTBOUND */ [DMA_TO_DEVICE] = DATA_DIR_OUT, /* OUTBOUND */
[PCI_DMA_FROMDEVICE] = DATA_DIR_IN,/* INBOUND */ [DMA_FROM_DEVICE] = DATA_DIR_IN, /* INBOUND */
[PCI_DMA_NONE] = DATA_DIR_NONE,/* NO TRANSFER */ [DMA_NONE] = DATA_DIR_NONE, /* NO TRANSFER */
}; };
void void
pm8001_chip_make_sg(struct scatterlist *scatter, int nr, void *prd) pm8001_chip_make_sg(struct scatterlist *scatter, int nr, void *prd)
@ -4255,13 +4255,13 @@ static int pm8001_chip_smp_req(struct pm8001_hba_info *pm8001_ha,
* DMA-map SMP request, response buffers * DMA-map SMP request, response buffers
*/ */
sg_req = &task->smp_task.smp_req; sg_req = &task->smp_task.smp_req;
elem = dma_map_sg(pm8001_ha->dev, sg_req, 1, PCI_DMA_TODEVICE); elem = dma_map_sg(pm8001_ha->dev, sg_req, 1, DMA_TO_DEVICE);
if (!elem) if (!elem)
return -ENOMEM; return -ENOMEM;
req_len = sg_dma_len(sg_req); req_len = sg_dma_len(sg_req);
sg_resp = &task->smp_task.smp_resp; sg_resp = &task->smp_task.smp_resp;
elem = dma_map_sg(pm8001_ha->dev, sg_resp, 1, PCI_DMA_FROMDEVICE); elem = dma_map_sg(pm8001_ha->dev, sg_resp, 1, DMA_FROM_DEVICE);
if (!elem) { if (!elem) {
rc = -ENOMEM; rc = -ENOMEM;
goto err_out; goto err_out;
@ -4294,10 +4294,10 @@ static int pm8001_chip_smp_req(struct pm8001_hba_info *pm8001_ha,
err_out_2: err_out_2:
dma_unmap_sg(pm8001_ha->dev, &ccb->task->smp_task.smp_resp, 1, dma_unmap_sg(pm8001_ha->dev, &ccb->task->smp_task.smp_resp, 1,
PCI_DMA_FROMDEVICE); DMA_FROM_DEVICE);
err_out: err_out:
dma_unmap_sg(pm8001_ha->dev, &ccb->task->smp_task.smp_req, 1, dma_unmap_sg(pm8001_ha->dev, &ccb->task->smp_task.smp_req, 1,
PCI_DMA_TODEVICE); DMA_TO_DEVICE);
return rc; return rc;
} }
@ -4376,7 +4376,7 @@ static int pm8001_chip_sata_req(struct pm8001_hba_info *pm8001_ha,
u32 opc = OPC_INB_SATA_HOST_OPSTART; u32 opc = OPC_INB_SATA_HOST_OPSTART;
memset(&sata_cmd, 0, sizeof(sata_cmd)); memset(&sata_cmd, 0, sizeof(sata_cmd));
circularQ = &pm8001_ha->inbnd_q_tbl[0]; circularQ = &pm8001_ha->inbnd_q_tbl[0];
if (task->data_dir == PCI_DMA_NONE) { if (task->data_dir == DMA_NONE) {
ATAP = 0x04; /* no data*/ ATAP = 0x04; /* no data*/
PM8001_IO_DBG(pm8001_ha, pm8001_printk("no data\n")); PM8001_IO_DBG(pm8001_ha, pm8001_printk("no data\n"));
} else if (likely(!task->ata_task.device_control_reg_update)) { } else if (likely(!task->ata_task.device_control_reg_update)) {

View File

@ -152,7 +152,7 @@ static void pm8001_free(struct pm8001_hba_info *pm8001_ha)
for (i = 0; i < USI_MAX_MEMCNT; i++) { for (i = 0; i < USI_MAX_MEMCNT; i++) {
if (pm8001_ha->memoryMap.region[i].virt_ptr != NULL) { if (pm8001_ha->memoryMap.region[i].virt_ptr != NULL) {
pci_free_consistent(pm8001_ha->pdev, dma_free_coherent(&pm8001_ha->pdev->dev,
(pm8001_ha->memoryMap.region[i].total_len + (pm8001_ha->memoryMap.region[i].total_len +
pm8001_ha->memoryMap.region[i].alignment), pm8001_ha->memoryMap.region[i].alignment),
pm8001_ha->memoryMap.region[i].virt_ptr, pm8001_ha->memoryMap.region[i].virt_ptr,
@ -501,30 +501,12 @@ static int pci_go_44(struct pci_dev *pdev)
{ {
int rc; int rc;
if (!pci_set_dma_mask(pdev, DMA_BIT_MASK(44))) { rc = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(44));
rc = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(44));
if (rc) {
rc = pci_set_consistent_dma_mask(pdev,
DMA_BIT_MASK(32));
if (rc) {
dev_printk(KERN_ERR, &pdev->dev,
"44-bit DMA enable failed\n");
return rc;
}
}
} else {
rc = pci_set_dma_mask(pdev, DMA_BIT_MASK(32));
if (rc) { if (rc) {
rc = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(32));
if (rc)
dev_printk(KERN_ERR, &pdev->dev, dev_printk(KERN_ERR, &pdev->dev,
"32-bit DMA enable failed\n"); "32-bit DMA enable failed\n");
return rc;
}
rc = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(32));
if (rc) {
dev_printk(KERN_ERR, &pdev->dev,
"32-bit consistent DMA enable failed\n");
return rc;
}
} }
return rc; return rc;
} }

View File

@ -116,8 +116,8 @@ int pm8001_mem_alloc(struct pci_dev *pdev, void **virt_addr,
u64 align_offset = 0; u64 align_offset = 0;
if (align) if (align)
align_offset = (dma_addr_t)align - 1; align_offset = (dma_addr_t)align - 1;
mem_virt_alloc = pci_zalloc_consistent(pdev, mem_size + align, mem_virt_alloc = dma_zalloc_coherent(&pdev->dev, mem_size + align,
&mem_dma_handle); &mem_dma_handle, GFP_KERNEL);
if (!mem_virt_alloc) { if (!mem_virt_alloc) {
pm8001_printk("memory allocation error\n"); pm8001_printk("memory allocation error\n");
return -1; return -1;
@ -533,9 +533,9 @@ void pm8001_ccb_task_free(struct pm8001_hba_info *pm8001_ha,
switch (task->task_proto) { switch (task->task_proto) {
case SAS_PROTOCOL_SMP: case SAS_PROTOCOL_SMP:
dma_unmap_sg(pm8001_ha->dev, &task->smp_task.smp_resp, 1, dma_unmap_sg(pm8001_ha->dev, &task->smp_task.smp_resp, 1,
PCI_DMA_FROMDEVICE); DMA_FROM_DEVICE);
dma_unmap_sg(pm8001_ha->dev, &task->smp_task.smp_req, 1, dma_unmap_sg(pm8001_ha->dev, &task->smp_task.smp_req, 1,
PCI_DMA_TODEVICE); DMA_TO_DEVICE);
break; break;
case SAS_PROTOCOL_SATA: case SAS_PROTOCOL_SATA:

View File

@ -2133,7 +2133,7 @@ mpi_sata_completion(struct pm8001_hba_info *pm8001_ha, void *piomb)
sata_resp = &psataPayload->sata_resp[0]; sata_resp = &psataPayload->sata_resp[0];
resp = (struct ata_task_resp *)ts->buf; resp = (struct ata_task_resp *)ts->buf;
if (t->ata_task.dma_xfer == 0 && if (t->ata_task.dma_xfer == 0 &&
t->data_dir == PCI_DMA_FROMDEVICE) { t->data_dir == DMA_FROM_DEVICE) {
len = sizeof(struct pio_setup_fis); len = sizeof(struct pio_setup_fis);
PM8001_IO_DBG(pm8001_ha, PM8001_IO_DBG(pm8001_ha,
pm8001_printk("PIO read len = %d\n", len)); pm8001_printk("PIO read len = %d\n", len));
@ -3855,12 +3855,12 @@ static int process_oq(struct pm8001_hba_info *pm8001_ha, u8 vec)
return ret; return ret;
} }
/* PCI_DMA_... to our direction translation. */ /* DMA_... to our direction translation. */
static const u8 data_dir_flags[] = { static const u8 data_dir_flags[] = {
[PCI_DMA_BIDIRECTIONAL] = DATA_DIR_BYRECIPIENT,/* UNSPECIFIED */ [DMA_BIDIRECTIONAL] = DATA_DIR_BYRECIPIENT, /* UNSPECIFIED */
[PCI_DMA_TODEVICE] = DATA_DIR_OUT,/* OUTBOUND */ [DMA_TO_DEVICE] = DATA_DIR_OUT, /* OUTBOUND */
[PCI_DMA_FROMDEVICE] = DATA_DIR_IN,/* INBOUND */ [DMA_FROM_DEVICE] = DATA_DIR_IN, /* INBOUND */
[PCI_DMA_NONE] = DATA_DIR_NONE,/* NO TRANSFER */ [DMA_NONE] = DATA_DIR_NONE, /* NO TRANSFER */
}; };
static void build_smp_cmd(u32 deviceID, __le32 hTag, static void build_smp_cmd(u32 deviceID, __le32 hTag,
@ -3902,13 +3902,13 @@ static int pm80xx_chip_smp_req(struct pm8001_hba_info *pm8001_ha,
* DMA-map SMP request, response buffers * DMA-map SMP request, response buffers
*/ */
sg_req = &task->smp_task.smp_req; sg_req = &task->smp_task.smp_req;
elem = dma_map_sg(pm8001_ha->dev, sg_req, 1, PCI_DMA_TODEVICE); elem = dma_map_sg(pm8001_ha->dev, sg_req, 1, DMA_TO_DEVICE);
if (!elem) if (!elem)
return -ENOMEM; return -ENOMEM;
req_len = sg_dma_len(sg_req); req_len = sg_dma_len(sg_req);
sg_resp = &task->smp_task.smp_resp; sg_resp = &task->smp_task.smp_resp;
elem = dma_map_sg(pm8001_ha->dev, sg_resp, 1, PCI_DMA_FROMDEVICE); elem = dma_map_sg(pm8001_ha->dev, sg_resp, 1, DMA_FROM_DEVICE);
if (!elem) { if (!elem) {
rc = -ENOMEM; rc = -ENOMEM;
goto err_out; goto err_out;
@ -3999,10 +3999,10 @@ static int pm80xx_chip_smp_req(struct pm8001_hba_info *pm8001_ha,
err_out_2: err_out_2:
dma_unmap_sg(pm8001_ha->dev, &ccb->task->smp_task.smp_resp, 1, dma_unmap_sg(pm8001_ha->dev, &ccb->task->smp_task.smp_resp, 1,
PCI_DMA_FROMDEVICE); DMA_FROM_DEVICE);
err_out: err_out:
dma_unmap_sg(pm8001_ha->dev, &ccb->task->smp_task.smp_req, 1, dma_unmap_sg(pm8001_ha->dev, &ccb->task->smp_task.smp_req, 1,
PCI_DMA_TODEVICE); DMA_TO_DEVICE);
return rc; return rc;
} }
@ -4226,7 +4226,7 @@ static int pm80xx_chip_sata_req(struct pm8001_hba_info *pm8001_ha,
q_index = (u32) (pm8001_ha_dev->id & 0x00ffffff) % PM8001_MAX_INB_NUM; q_index = (u32) (pm8001_ha_dev->id & 0x00ffffff) % PM8001_MAX_INB_NUM;
circularQ = &pm8001_ha->inbnd_q_tbl[q_index]; circularQ = &pm8001_ha->inbnd_q_tbl[q_index];
if (task->data_dir == PCI_DMA_NONE) { if (task->data_dir == DMA_NONE) {
ATAP = 0x04; /* no data*/ ATAP = 0x04; /* no data*/
PM8001_IO_DBG(pm8001_ha, pm8001_printk("no data\n")); PM8001_IO_DBG(pm8001_ha, pm8001_printk("no data\n"));
} else if (likely(!task->ata_task.device_control_reg_update)) { } else if (likely(!task->ata_task.device_control_reg_update)) {