We can just dma map the sense buffer passed with the scsi command,
and that gets us out of the nasty business of doing dma coherent
allocations from irq context.

Signed-off-by: Christoph Hellwig <h...@lst.de>
---
 drivers/scsi/pmcraid.c | 24 ++++++++----------------
 1 file changed, 8 insertions(+), 16 deletions(-)

diff --git a/drivers/scsi/pmcraid.c b/drivers/scsi/pmcraid.c
index 3ba606420247..401e543f1723 100644
--- a/drivers/scsi/pmcraid.c
+++ b/drivers/scsi/pmcraid.c
@@ -846,16 +846,9 @@ static void pmcraid_erp_done(struct pmcraid_cmd *cmd)
                            cmd->ioa_cb->ioarcb.cdb[0], ioasc);
        }
 
-       /* if we had allocated sense buffers for request sense, copy the sense
-        * release the buffers
-        */
-       if (cmd->sense_buffer != NULL) {
-               memcpy(scsi_cmd->sense_buffer,
-                      cmd->sense_buffer,
-                      SCSI_SENSE_BUFFERSIZE);
-               pci_free_consistent(pinstance->pdev,
-                                   SCSI_SENSE_BUFFERSIZE,
-                                   cmd->sense_buffer, cmd->sense_buffer_dma);
+       if (cmd->sense_buffer) {
+               dma_unmap_single(&pinstance->pdev->dev, cmd->sense_buffer_dma,
+                                SCSI_SENSE_BUFFERSIZE, DMA_FROM_DEVICE);
                cmd->sense_buffer = NULL;
                cmd->sense_buffer_dma = 0;
        }
@@ -2444,13 +2437,12 @@ static void pmcraid_request_sense(struct pmcraid_cmd 
*cmd)
 {
        struct pmcraid_ioarcb *ioarcb = &cmd->ioa_cb->ioarcb;
        struct pmcraid_ioadl_desc *ioadl = ioarcb->add_data.u.ioadl;
+       struct device *dev = &cmd->drv_inst->pdev->dev;
 
-       /* allocate DMAable memory for sense buffers */
-       cmd->sense_buffer = pci_alloc_consistent(cmd->drv_inst->pdev,
-                                                SCSI_SENSE_BUFFERSIZE,
-                                                &cmd->sense_buffer_dma);
-
-       if (cmd->sense_buffer == NULL) {
+       cmd->sense_buffer = cmd->scsi_cmd->sense_buffer;
+       cmd->sense_buffer_dma = dma_map_single(dev, cmd->sense_buffer,
+                       SCSI_SENSE_BUFFERSIZE, DMA_FROM_DEVICE);
+       if (dma_mapping_error(dev, cmd->sense_buffer_dma)) {
                pmcraid_err
                        ("couldn't allocate sense buffer for request sense\n");
                pmcraid_erp_done(cmd);
-- 
2.19.1

Reply via email to