- 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 at host template. Signed-off-by: Boaz Harrosh <bharrosh@xxxxxxxxxxx> --- drivers/scsi/BusLogic.c | 24 +++++++++++------------- drivers/scsi/BusLogic.h | 1 + 2 files changed, 12 insertions(+), 13 deletions(-) diff --git a/drivers/scsi/BusLogic.c b/drivers/scsi/BusLogic.c index 4d3ebb1..5b076f3 100644 --- a/drivers/scsi/BusLogic.c +++ b/drivers/scsi/BusLogic.c @@ -42,17 +42,19 @@ #include <linux/spinlock.h> #include <linux/jiffies.h> #include <linux/dma-mapping.h> -#include <scsi/scsicam.h> #include <asm/dma.h> #include <asm/io.h> #include <asm/system.h> +#include <scsi/scsicam.h> #include <scsi/scsi.h> #include <scsi/scsi_cmnd.h> #include <scsi/scsi_device.h> #include <scsi/scsi_host.h> #include <scsi/scsi_tcq.h> +#include <scsi/scsi_eh.h> + #include "BusLogic.h" #include "FlashPoint.c" @@ -309,6 +311,7 @@ static void BusLogic_DeallocateCCB(struct BusLogic_CCB *CCB) pci_unmap_single(HostAdapter->PCI_Device, CCB->SenseDataPointer, CCB->SenseDataLength, PCI_DMA_FROMDEVICE); + scsi_return_sense(CCB->Command, CCB->sense_buffer); CCB->Command = NULL; CCB->Status = BusLogic_CCB_Free; CCB->Next = HostAdapter->Free_CCBs; @@ -2627,7 +2630,7 @@ static void BusLogic_ProcessCompletedCCBs(struct BusLogic_HostAdapter *HostAdapt BusLogic_Notice("\n", HostAdapter); BusLogic_Notice("Sense ", HostAdapter); for (i = 0; i < CCB->SenseDataLength; i++) - BusLogic_Notice(" %02X", HostAdapter, Command->sense_buffer[i]); + BusLogic_Notice(" %02X", HostAdapter, CCB->sense_buffer[i]); BusLogic_Notice("\n", HostAdapter); } } @@ -2816,16 +2819,6 @@ static int BusLogic_QueueCommand(struct scsi_cmnd *Command, void (*CompletionRou int Count; struct BusLogic_CCB *CCB; /* - SCSI REQUEST_SENSE commands will be executed automatically by the Host - Adapter for any errors, so they should not be executed explicitly unless - the Sense Data is zero indicating that no error occurred. - */ - if (CDB[0] == REQUEST_SENSE && Command->sense_buffer[0] != 0) { - Command->result = DID_OK << 16; - CompletionRoutine(Command); - return 0; - } - /* Allocate a CCB from the Host Adapter's free list. In the unlikely event that there are none available and memory allocation fails, wait 1 second and try again. If that fails, the Host Adapter is probably hung so signal @@ -2948,7 +2941,10 @@ static int BusLogic_QueueCommand(struct scsi_cmnd *Command, void (*CompletionRou } memcpy(CCB->CDB, CDB, CDB_Length); CCB->SenseDataLength = SCSI_SENSE_BUFFERSIZE; - CCB->SenseDataPointer = pci_map_single(HostAdapter->PCI_Device, Command->sense_buffer, CCB->SenseDataLength, PCI_DMA_FROMDEVICE); + CCB->sense_buffer = scsi_make_sense(Command); + CCB->SenseDataPointer = pci_map_single(HostAdapter->PCI_Device, + CCB->sense_buffer, CCB->SenseDataLength, + PCI_DMA_FROMDEVICE); CCB->Command = Command; Command->scsi_done = CompletionRoutine; if (BusLogic_MultiMasterHostAdapterP(HostAdapter)) { @@ -3575,6 +3571,8 @@ static struct scsi_host_template Bus_Logic_template = { .unchecked_isa_dma = 1, .max_sectors = 128, .use_clustering = ENABLE_CLUSTERING, + .pre_allocate_sense = 1, + .sense_buffsize = SCSI_SENSE_BUFFERSIZE, }; /* diff --git a/drivers/scsi/BusLogic.h b/drivers/scsi/BusLogic.h index bfbfb5c..6e0a131 100644 --- a/drivers/scsi/BusLogic.h +++ b/drivers/scsi/BusLogic.h @@ -890,6 +890,7 @@ struct BusLogic_CCB { struct BusLogic_CCB *NextAll; struct BusLogic_ScatterGatherSegment ScatterGatherList[BusLogic_ScatterGatherLimit]; + u8 *sense_buffer; }; /* -- 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