- Use a pre allocated, DMA mapped, sense buffer at each command, Using the scsi_make_sense() API. And scsi_return_sense() when done. - Set .pre_allocate_sense && .sense_buffsize at host template. Signed-off-by: Boaz Harrosh <bharrosh@xxxxxxxxxxx> --- drivers/scsi/initio.c | 12 +++++++++--- drivers/scsi/initio.h | 1 + 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/drivers/scsi/initio.c b/drivers/scsi/initio.c index 40e9875..b32a145 100644 --- a/drivers/scsi/initio.c +++ b/drivers/scsi/initio.c @@ -102,6 +102,7 @@ #include <scsi/scsi_device.h> #include <scsi/scsi_host.h> #include <scsi/scsi_tcq.h> +#include <scsi/scsi_eh.h> #include "initio.h" @@ -2578,8 +2579,9 @@ static void initio_build_scb(struct initio_host * host, struct scsi_ctrl_blk * c cblk->flags |= SCF_SENSE; /* Turn on auto request sense */ + cblk->sense_buffer = scsi_make_sense(cmnd); /* Map the sense buffer into bus memory */ - dma_addr = dma_map_single(&host->pci_dev->dev, cmnd->sense_buffer, + dma_addr = dma_map_single(&host->pci_dev->dev, cblk->sense_buffer, SENSE_SIZE, DMA_FROM_DEVICE); cblk->senseptr = cpu_to_le32((u32)dma_addr); cblk->senselen = cpu_to_le32(SENSE_SIZE); @@ -2733,7 +2735,8 @@ static int i91u_biosparam(struct scsi_device *sdev, struct block_device *dev, * was mapped originally as part of initio_build_scb */ -static void i91u_unmap_scb(struct pci_dev *pci_dev, struct scsi_cmnd *cmnd) +static void i91u_unmap_scb(struct pci_dev *pci_dev, struct scsi_ctrl_blk *cblk, + struct scsi_cmnd *cmnd) { /* auto sense buffer */ if (cmnd->SCp.ptr) { @@ -2741,6 +2744,7 @@ static void i91u_unmap_scb(struct pci_dev *pci_dev, struct scsi_cmnd *cmnd) (dma_addr_t)((unsigned long)cmnd->SCp.ptr), SENSE_SIZE, DMA_FROM_DEVICE); cmnd->SCp.ptr = NULL; + scsi_return_sense(cmnd, cblk->sense_buffer); } /* request buffer */ @@ -2817,7 +2821,7 @@ static void i91uSCBPost(u8 * host_mem, u8 * cblk_mem) cmnd->result = cblk->tastat | (cblk->hastat << 16); WARN_ON(cmnd == NULL); - i91u_unmap_scb(host->pci_dev, cmnd); + i91u_unmap_scb(host->pci_dev, cblk, cmnd); cmnd->scsi_done(cmnd); /* Notify system DONE */ initio_release_scb(host, cblk); /* Release SCB for current channel */ } @@ -2833,6 +2837,8 @@ static struct scsi_host_template initio_template = { .sg_tablesize = SG_ALL, .cmd_per_lun = 1, .use_clustering = ENABLE_CLUSTERING, + .pre_allocate_sense = 1, + .sense_buffsize = SCSI_SENSE_BUFFERSIZE, }; static int initio_probe_one(struct pci_dev *pdev, diff --git a/drivers/scsi/initio.h b/drivers/scsi/initio.h index cb48efa..9e4a79d 100644 --- a/drivers/scsi/initio.h +++ b/drivers/scsi/initio.h @@ -384,6 +384,7 @@ struct scsi_ctrl_blk { void (*post) (u8 *, u8 *); /*4C POST routine */ struct scsi_cmnd *srb; /*50 SRB Pointer */ struct sg_entry sglist[TOTAL_SG_ENTRY]; /*54 Start of SG list */ + u8 *sense_buffer; }; /* Bit Definition for status */ -- 1.5.3.3 - To unsubscribe from this list: send the line "unsubscribe linux-scsi" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html