diff options
Diffstat (limited to 'drivers/scsi/BusLogic.c')
-rw-r--r-- | drivers/scsi/BusLogic.c | 51 |
1 files changed, 21 insertions, 30 deletions
diff --git a/drivers/scsi/BusLogic.c b/drivers/scsi/BusLogic.c index 96f4cab07614..9b206176f717 100644 --- a/drivers/scsi/BusLogic.c +++ b/drivers/scsi/BusLogic.c | |||
@@ -304,18 +304,10 @@ static struct BusLogic_CCB *BusLogic_AllocateCCB(struct BusLogic_HostAdapter | |||
304 | static void BusLogic_DeallocateCCB(struct BusLogic_CCB *CCB) | 304 | static void BusLogic_DeallocateCCB(struct BusLogic_CCB *CCB) |
305 | { | 305 | { |
306 | struct BusLogic_HostAdapter *HostAdapter = CCB->HostAdapter; | 306 | struct BusLogic_HostAdapter *HostAdapter = CCB->HostAdapter; |
307 | struct scsi_cmnd *cmd = CCB->Command; | ||
308 | 307 | ||
309 | if (cmd->use_sg != 0) { | 308 | scsi_dma_unmap(CCB->Command); |
310 | pci_unmap_sg(HostAdapter->PCI_Device, | ||
311 | (struct scatterlist *)cmd->request_buffer, | ||
312 | cmd->use_sg, cmd->sc_data_direction); | ||
313 | } else if (cmd->request_bufflen != 0) { | ||
314 | pci_unmap_single(HostAdapter->PCI_Device, CCB->DataPointer, | ||
315 | CCB->DataLength, cmd->sc_data_direction); | ||
316 | } | ||
317 | pci_unmap_single(HostAdapter->PCI_Device, CCB->SenseDataPointer, | 309 | pci_unmap_single(HostAdapter->PCI_Device, CCB->SenseDataPointer, |
318 | CCB->SenseDataLength, PCI_DMA_FROMDEVICE); | 310 | CCB->SenseDataLength, PCI_DMA_FROMDEVICE); |
319 | 311 | ||
320 | CCB->Command = NULL; | 312 | CCB->Command = NULL; |
321 | CCB->Status = BusLogic_CCB_Free; | 313 | CCB->Status = BusLogic_CCB_Free; |
@@ -2648,7 +2640,8 @@ static void BusLogic_ProcessCompletedCCBs(struct BusLogic_HostAdapter *HostAdapt | |||
2648 | */ | 2640 | */ |
2649 | if (CCB->CDB[0] == INQUIRY && CCB->CDB[1] == 0 && CCB->HostAdapterStatus == BusLogic_CommandCompletedNormally) { | 2641 | if (CCB->CDB[0] == INQUIRY && CCB->CDB[1] == 0 && CCB->HostAdapterStatus == BusLogic_CommandCompletedNormally) { |
2650 | struct BusLogic_TargetFlags *TargetFlags = &HostAdapter->TargetFlags[CCB->TargetID]; | 2642 | struct BusLogic_TargetFlags *TargetFlags = &HostAdapter->TargetFlags[CCB->TargetID]; |
2651 | struct SCSI_Inquiry *InquiryResult = (struct SCSI_Inquiry *) Command->request_buffer; | 2643 | struct SCSI_Inquiry *InquiryResult = |
2644 | (struct SCSI_Inquiry *) scsi_sglist(Command); | ||
2652 | TargetFlags->TargetExists = true; | 2645 | TargetFlags->TargetExists = true; |
2653 | TargetFlags->TaggedQueuingSupported = InquiryResult->CmdQue; | 2646 | TargetFlags->TaggedQueuingSupported = InquiryResult->CmdQue; |
2654 | TargetFlags->WideTransfersSupported = InquiryResult->WBus16; | 2647 | TargetFlags->WideTransfersSupported = InquiryResult->WBus16; |
@@ -2819,9 +2812,8 @@ static int BusLogic_QueueCommand(struct scsi_cmnd *Command, void (*CompletionRou | |||
2819 | int CDB_Length = Command->cmd_len; | 2812 | int CDB_Length = Command->cmd_len; |
2820 | int TargetID = Command->device->id; | 2813 | int TargetID = Command->device->id; |
2821 | int LogicalUnit = Command->device->lun; | 2814 | int LogicalUnit = Command->device->lun; |
2822 | void *BufferPointer = Command->request_buffer; | 2815 | int BufferLength = scsi_bufflen(Command); |
2823 | int BufferLength = Command->request_bufflen; | 2816 | int Count; |
2824 | int SegmentCount = Command->use_sg; | ||
2825 | struct BusLogic_CCB *CCB; | 2817 | struct BusLogic_CCB *CCB; |
2826 | /* | 2818 | /* |
2827 | SCSI REQUEST_SENSE commands will be executed automatically by the Host | 2819 | 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 | return 0; | 2843 | return 0; |
2852 | } | 2844 | } |
2853 | } | 2845 | } |
2846 | |||
2854 | /* | 2847 | /* |
2855 | Initialize the fields in the BusLogic Command Control Block (CCB). | 2848 | Initialize the fields in the BusLogic Command Control Block (CCB). |
2856 | */ | 2849 | */ |
2857 | if (SegmentCount == 0 && BufferLength != 0) { | 2850 | Count = scsi_dma_map(Command); |
2858 | CCB->Opcode = BusLogic_InitiatorCCB; | 2851 | BUG_ON(Count < 0); |
2859 | CCB->DataLength = BufferLength; | 2852 | if (Count) { |
2860 | CCB->DataPointer = pci_map_single(HostAdapter->PCI_Device, | 2853 | struct scatterlist *sg; |
2861 | BufferPointer, BufferLength, | 2854 | int i; |
2862 | Command->sc_data_direction); | 2855 | |
2863 | } else if (SegmentCount != 0) { | ||
2864 | struct scatterlist *ScatterList = (struct scatterlist *) BufferPointer; | ||
2865 | int Segment, Count; | ||
2866 | |||
2867 | Count = pci_map_sg(HostAdapter->PCI_Device, ScatterList, SegmentCount, | ||
2868 | Command->sc_data_direction); | ||
2869 | CCB->Opcode = BusLogic_InitiatorCCB_ScatterGather; | 2856 | CCB->Opcode = BusLogic_InitiatorCCB_ScatterGather; |
2870 | CCB->DataLength = Count * sizeof(struct BusLogic_ScatterGatherSegment); | 2857 | CCB->DataLength = Count * sizeof(struct BusLogic_ScatterGatherSegment); |
2871 | if (BusLogic_MultiMasterHostAdapterP(HostAdapter)) | 2858 | if (BusLogic_MultiMasterHostAdapterP(HostAdapter)) |
2872 | CCB->DataPointer = (unsigned int) CCB->DMA_Handle + ((unsigned long) &CCB->ScatterGatherList - (unsigned long) CCB); | 2859 | CCB->DataPointer = (unsigned int) CCB->DMA_Handle + ((unsigned long) &CCB->ScatterGatherList - (unsigned long) CCB); |
2873 | else | 2860 | else |
2874 | CCB->DataPointer = Virtual_to_32Bit_Virtual(CCB->ScatterGatherList); | 2861 | CCB->DataPointer = Virtual_to_32Bit_Virtual(CCB->ScatterGatherList); |
2875 | for (Segment = 0; Segment < Count; Segment++) { | 2862 | |
2876 | CCB->ScatterGatherList[Segment].SegmentByteCount = sg_dma_len(ScatterList + Segment); | 2863 | scsi_for_each_sg(Command, sg, Count, i) { |
2877 | CCB->ScatterGatherList[Segment].SegmentDataPointer = sg_dma_address(ScatterList + Segment); | 2864 | CCB->ScatterGatherList[i].SegmentByteCount = |
2865 | sg_dma_len(sg); | ||
2866 | CCB->ScatterGatherList[i].SegmentDataPointer = | ||
2867 | sg_dma_address(sg); | ||
2878 | } | 2868 | } |
2879 | } else { | 2869 | } else if (!Count) { |
2880 | CCB->Opcode = BusLogic_InitiatorCCB; | 2870 | CCB->Opcode = BusLogic_InitiatorCCB; |
2881 | CCB->DataLength = BufferLength; | 2871 | CCB->DataLength = BufferLength; |
2882 | CCB->DataPointer = 0; | 2872 | CCB->DataPointer = 0; |
2883 | } | 2873 | } |
2874 | |||
2884 | switch (CDB[0]) { | 2875 | switch (CDB[0]) { |
2885 | case READ_6: | 2876 | case READ_6: |
2886 | case READ_10: | 2877 | case READ_10: |