Commit ddc914c7 authored by FUJITA Tomonori's avatar FUJITA Tomonori Committed by James Bottomley

[SCSI] BusLogic: convert to use the data buffer accessors

- remove the unnecessary map_single path.

- convert to use the new accessors for the sg lists and the
parameters.
Signed-off-by: default avatarFUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
Signed-off-by: default avatarJames Bottomley <James.Bottomley@SteelEye.com>
parent bc1ebfba
...@@ -304,18 +304,10 @@ static struct BusLogic_CCB *BusLogic_AllocateCCB(struct BusLogic_HostAdapter ...@@ -304,18 +304,10 @@ static struct BusLogic_CCB *BusLogic_AllocateCCB(struct BusLogic_HostAdapter
static void BusLogic_DeallocateCCB(struct BusLogic_CCB *CCB) static void BusLogic_DeallocateCCB(struct BusLogic_CCB *CCB)
{ {
struct BusLogic_HostAdapter *HostAdapter = CCB->HostAdapter; struct BusLogic_HostAdapter *HostAdapter = CCB->HostAdapter;
struct scsi_cmnd *cmd = CCB->Command;
if (cmd->use_sg != 0) { scsi_dma_unmap(CCB->Command);
pci_unmap_sg(HostAdapter->PCI_Device,
(struct scatterlist *)cmd->request_buffer,
cmd->use_sg, cmd->sc_data_direction);
} else if (cmd->request_bufflen != 0) {
pci_unmap_single(HostAdapter->PCI_Device, CCB->DataPointer,
CCB->DataLength, cmd->sc_data_direction);
}
pci_unmap_single(HostAdapter->PCI_Device, CCB->SenseDataPointer, pci_unmap_single(HostAdapter->PCI_Device, CCB->SenseDataPointer,
CCB->SenseDataLength, PCI_DMA_FROMDEVICE); CCB->SenseDataLength, PCI_DMA_FROMDEVICE);
CCB->Command = NULL; CCB->Command = NULL;
CCB->Status = BusLogic_CCB_Free; CCB->Status = BusLogic_CCB_Free;
...@@ -2648,7 +2640,8 @@ static void BusLogic_ProcessCompletedCCBs(struct BusLogic_HostAdapter *HostAdapt ...@@ -2648,7 +2640,8 @@ static void BusLogic_ProcessCompletedCCBs(struct BusLogic_HostAdapter *HostAdapt
*/ */
if (CCB->CDB[0] == INQUIRY && CCB->CDB[1] == 0 && CCB->HostAdapterStatus == BusLogic_CommandCompletedNormally) { if (CCB->CDB[0] == INQUIRY && CCB->CDB[1] == 0 && CCB->HostAdapterStatus == BusLogic_CommandCompletedNormally) {
struct BusLogic_TargetFlags *TargetFlags = &HostAdapter->TargetFlags[CCB->TargetID]; struct BusLogic_TargetFlags *TargetFlags = &HostAdapter->TargetFlags[CCB->TargetID];
struct SCSI_Inquiry *InquiryResult = (struct SCSI_Inquiry *) Command->request_buffer; struct SCSI_Inquiry *InquiryResult =
(struct SCSI_Inquiry *) scsi_sglist(Command);
TargetFlags->TargetExists = true; TargetFlags->TargetExists = true;
TargetFlags->TaggedQueuingSupported = InquiryResult->CmdQue; TargetFlags->TaggedQueuingSupported = InquiryResult->CmdQue;
TargetFlags->WideTransfersSupported = InquiryResult->WBus16; TargetFlags->WideTransfersSupported = InquiryResult->WBus16;
...@@ -2819,9 +2812,8 @@ static int BusLogic_QueueCommand(struct scsi_cmnd *Command, void (*CompletionRou ...@@ -2819,9 +2812,8 @@ static int BusLogic_QueueCommand(struct scsi_cmnd *Command, void (*CompletionRou
int CDB_Length = Command->cmd_len; int CDB_Length = Command->cmd_len;
int TargetID = Command->device->id; int TargetID = Command->device->id;
int LogicalUnit = Command->device->lun; int LogicalUnit = Command->device->lun;
void *BufferPointer = Command->request_buffer; int BufferLength = scsi_bufflen(Command);
int BufferLength = Command->request_bufflen; int Count;
int SegmentCount = Command->use_sg;
struct BusLogic_CCB *CCB; struct BusLogic_CCB *CCB;
/* /*
SCSI REQUEST_SENSE commands will be executed automatically by the Host SCSI REQUEST_SENSE commands will be executed automatically by the Host
...@@ -2851,36 +2843,35 @@ static int BusLogic_QueueCommand(struct scsi_cmnd *Command, void (*CompletionRou ...@@ -2851,36 +2843,35 @@ static int BusLogic_QueueCommand(struct scsi_cmnd *Command, void (*CompletionRou
return 0; return 0;
} }
} }
/* /*
Initialize the fields in the BusLogic Command Control Block (CCB). Initialize the fields in the BusLogic Command Control Block (CCB).
*/ */
if (SegmentCount == 0 && BufferLength != 0) { Count = scsi_dma_map(Command);
CCB->Opcode = BusLogic_InitiatorCCB; BUG_ON(Count < 0);
CCB->DataLength = BufferLength; if (Count) {
CCB->DataPointer = pci_map_single(HostAdapter->PCI_Device, struct scatterlist *sg;
BufferPointer, BufferLength, int i;
Command->sc_data_direction);
} else if (SegmentCount != 0) {
struct scatterlist *ScatterList = (struct scatterlist *) BufferPointer;
int Segment, Count;
Count = pci_map_sg(HostAdapter->PCI_Device, ScatterList, SegmentCount,
Command->sc_data_direction);
CCB->Opcode = BusLogic_InitiatorCCB_ScatterGather; CCB->Opcode = BusLogic_InitiatorCCB_ScatterGather;
CCB->DataLength = Count * sizeof(struct BusLogic_ScatterGatherSegment); CCB->DataLength = Count * sizeof(struct BusLogic_ScatterGatherSegment);
if (BusLogic_MultiMasterHostAdapterP(HostAdapter)) if (BusLogic_MultiMasterHostAdapterP(HostAdapter))
CCB->DataPointer = (unsigned int) CCB->DMA_Handle + ((unsigned long) &CCB->ScatterGatherList - (unsigned long) CCB); CCB->DataPointer = (unsigned int) CCB->DMA_Handle + ((unsigned long) &CCB->ScatterGatherList - (unsigned long) CCB);
else else
CCB->DataPointer = Virtual_to_32Bit_Virtual(CCB->ScatterGatherList); CCB->DataPointer = Virtual_to_32Bit_Virtual(CCB->ScatterGatherList);
for (Segment = 0; Segment < Count; Segment++) {
CCB->ScatterGatherList[Segment].SegmentByteCount = sg_dma_len(ScatterList + Segment); scsi_for_each_sg(Command, sg, Count, i) {
CCB->ScatterGatherList[Segment].SegmentDataPointer = sg_dma_address(ScatterList + Segment); CCB->ScatterGatherList[i].SegmentByteCount =
sg_dma_len(sg);
CCB->ScatterGatherList[i].SegmentDataPointer =
sg_dma_address(sg);
} }
} else { } else if (!Count) {
CCB->Opcode = BusLogic_InitiatorCCB; CCB->Opcode = BusLogic_InitiatorCCB;
CCB->DataLength = BufferLength; CCB->DataLength = BufferLength;
CCB->DataPointer = 0; CCB->DataPointer = 0;
} }
switch (CDB[0]) { switch (CDB[0]) {
case READ_6: case READ_6:
case READ_10: case READ_10:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment