Commit d84cebb6 authored by Doug Ledford's avatar Doug Ledford

[PATCH] Fix the BusLogic driver in 2.5.x

parent 2c0a3925
...@@ -26,10 +26,8 @@ ...@@ -26,10 +26,8 @@
*/ */
#define BusLogic_DriverVersion "2.1.15" #define BusLogic_DriverVersion "2.1.16"
#define BusLogic_DriverDate "17 August 1998" #define BusLogic_DriverDate "18 July 2002"
#error Please convert me to Documentation/DMA-mapping.txt
#include <linux/version.h> #include <linux/version.h>
#include <linux/module.h> #include <linux/module.h>
...@@ -48,6 +46,7 @@ ...@@ -48,6 +46,7 @@
#include <asm/dma.h> #include <asm/dma.h>
#include <asm/io.h> #include <asm/io.h>
#include <asm/system.h> #include <asm/system.h>
/* #include <scsi/scsicam.h> This include file is currently busted */
#include "scsi.h" #include "scsi.h"
#include "hosts.h" #include "hosts.h"
#include "sd.h" #include "sd.h"
...@@ -225,15 +224,19 @@ static void BusLogic_UnregisterHostAdapter(BusLogic_HostAdapter_T *HostAdapter) ...@@ -225,15 +224,19 @@ static void BusLogic_UnregisterHostAdapter(BusLogic_HostAdapter_T *HostAdapter)
*/ */
static void BusLogic_InitializeCCBs(BusLogic_HostAdapter_T *HostAdapter, static void BusLogic_InitializeCCBs(BusLogic_HostAdapter_T *HostAdapter,
void *BlockPointer, int BlockSize) void *BlockPointer, int BlockSize,
dma_addr_t BlockPointerHandle)
{ {
BusLogic_CCB_T *CCB = (BusLogic_CCB_T *) BlockPointer; BusLogic_CCB_T *CCB = (BusLogic_CCB_T *) BlockPointer;
unsigned int offset = 0;
memset(BlockPointer, 0, BlockSize); memset(BlockPointer, 0, BlockSize);
CCB->AllocationGroupHead = true; CCB->AllocationGroupHead = BlockPointerHandle;
CCB->AllocationGroupSize = BlockSize;
while ((BlockSize -= sizeof(BusLogic_CCB_T)) >= 0) while ((BlockSize -= sizeof(BusLogic_CCB_T)) >= 0)
{ {
CCB->Status = BusLogic_CCB_Free; CCB->Status = BusLogic_CCB_Free;
CCB->HostAdapter = HostAdapter; CCB->HostAdapter = HostAdapter;
CCB->DMA_Handle = (BusLogic_BusAddress_T)BlockPointerHandle + offset;
if (BusLogic_FlashPointHostAdapterP(HostAdapter)) if (BusLogic_FlashPointHostAdapterP(HostAdapter))
{ {
CCB->CallbackFunction = BusLogic_QueueCompletedCCB; CCB->CallbackFunction = BusLogic_QueueCompletedCCB;
...@@ -245,6 +248,7 @@ static void BusLogic_InitializeCCBs(BusLogic_HostAdapter_T *HostAdapter, ...@@ -245,6 +248,7 @@ static void BusLogic_InitializeCCBs(BusLogic_HostAdapter_T *HostAdapter,
HostAdapter->All_CCBs = CCB; HostAdapter->All_CCBs = CCB;
HostAdapter->AllocatedCCBs++; HostAdapter->AllocatedCCBs++;
CCB++; CCB++;
offset += sizeof(BusLogic_CCB_T);
} }
} }
...@@ -256,19 +260,20 @@ static void BusLogic_InitializeCCBs(BusLogic_HostAdapter_T *HostAdapter, ...@@ -256,19 +260,20 @@ static void BusLogic_InitializeCCBs(BusLogic_HostAdapter_T *HostAdapter,
static boolean BusLogic_CreateInitialCCBs(BusLogic_HostAdapter_T *HostAdapter) static boolean BusLogic_CreateInitialCCBs(BusLogic_HostAdapter_T *HostAdapter)
{ {
int BlockSize = BusLogic_CCB_AllocationGroupSize * sizeof(BusLogic_CCB_T); int BlockSize = BusLogic_CCB_AllocationGroupSize * sizeof(BusLogic_CCB_T);
void *BlockPointer;
dma_addr_t BlockPointerHandle;
while (HostAdapter->AllocatedCCBs < HostAdapter->InitialCCBs) while (HostAdapter->AllocatedCCBs < HostAdapter->InitialCCBs)
{ {
void *BlockPointer = kmalloc(BlockSize, BlockPointer = pci_alloc_consistent(HostAdapter->PCI_Device, BlockSize,
(HostAdapter->BounceBuffersRequired &BlockPointerHandle);
? GFP_ATOMIC | GFP_DMA
: GFP_ATOMIC));
if (BlockPointer == NULL) if (BlockPointer == NULL)
{ {
BusLogic_Error("UNABLE TO ALLOCATE CCB GROUP - DETACHING\n", BusLogic_Error("UNABLE TO ALLOCATE CCB GROUP - DETACHING\n",
HostAdapter); HostAdapter);
return false; return false;
} }
BusLogic_InitializeCCBs(HostAdapter, BlockPointer, BlockSize); BusLogic_InitializeCCBs(HostAdapter, BlockPointer, BlockSize,
BlockPointerHandle);
} }
return true; return true;
} }
...@@ -280,15 +285,25 @@ static boolean BusLogic_CreateInitialCCBs(BusLogic_HostAdapter_T *HostAdapter) ...@@ -280,15 +285,25 @@ static boolean BusLogic_CreateInitialCCBs(BusLogic_HostAdapter_T *HostAdapter)
static void BusLogic_DestroyCCBs(BusLogic_HostAdapter_T *HostAdapter) static void BusLogic_DestroyCCBs(BusLogic_HostAdapter_T *HostAdapter)
{ {
BusLogic_CCB_T *NextCCB = HostAdapter->All_CCBs, *CCB; BusLogic_CCB_T *NextCCB = HostAdapter->All_CCBs, *CCB, *Last_CCB = NULL;
HostAdapter->All_CCBs = NULL; HostAdapter->All_CCBs = NULL;
HostAdapter->Free_CCBs = NULL; HostAdapter->Free_CCBs = NULL;
while ((CCB = NextCCB) != NULL) while ((CCB = NextCCB) != NULL)
{ {
NextCCB = CCB->NextAll; NextCCB = CCB->NextAll;
if (CCB->AllocationGroupHead) if (CCB->AllocationGroupHead)
kfree(CCB); {
if (Last_CCB)
pci_free_consistent(HostAdapter->PCI_Device,
Last_CCB->AllocationGroupSize, Last_CCB,
Last_CCB->AllocationGroupHead);
Last_CCB = CCB;
}
} }
if (Last_CCB)
pci_free_consistent(HostAdapter->PCI_Device,
Last_CCB->AllocationGroupSize, Last_CCB,
Last_CCB->AllocationGroupHead);
} }
...@@ -305,15 +320,16 @@ static void BusLogic_CreateAdditionalCCBs(BusLogic_HostAdapter_T *HostAdapter, ...@@ -305,15 +320,16 @@ static void BusLogic_CreateAdditionalCCBs(BusLogic_HostAdapter_T *HostAdapter,
{ {
int BlockSize = BusLogic_CCB_AllocationGroupSize * sizeof(BusLogic_CCB_T); int BlockSize = BusLogic_CCB_AllocationGroupSize * sizeof(BusLogic_CCB_T);
int PreviouslyAllocated = HostAdapter->AllocatedCCBs; int PreviouslyAllocated = HostAdapter->AllocatedCCBs;
void *BlockPointer;
dma_addr_t BlockPointerHandle;
if (AdditionalCCBs <= 0) return; if (AdditionalCCBs <= 0) return;
while (HostAdapter->AllocatedCCBs - PreviouslyAllocated < AdditionalCCBs) while (HostAdapter->AllocatedCCBs - PreviouslyAllocated < AdditionalCCBs)
{ {
void *BlockPointer = kmalloc(BlockSize, BlockPointer = pci_alloc_consistent(HostAdapter->PCI_Device, BlockSize,
(HostAdapter->BounceBuffersRequired &BlockPointerHandle);
? GFP_ATOMIC | GFP_DMA
: GFP_ATOMIC));
if (BlockPointer == NULL) break; if (BlockPointer == NULL) break;
BusLogic_InitializeCCBs(HostAdapter, BlockPointer, BlockSize); BusLogic_InitializeCCBs(HostAdapter, BlockPointer, BlockSize,
BlockPointerHandle);
} }
if (HostAdapter->AllocatedCCBs > PreviouslyAllocated) if (HostAdapter->AllocatedCCBs > PreviouslyAllocated)
{ {
...@@ -379,6 +395,21 @@ static BusLogic_CCB_T *BusLogic_AllocateCCB(BusLogic_HostAdapter_T ...@@ -379,6 +395,21 @@ static BusLogic_CCB_T *BusLogic_AllocateCCB(BusLogic_HostAdapter_T
static void BusLogic_DeallocateCCB(BusLogic_CCB_T *CCB) static void BusLogic_DeallocateCCB(BusLogic_CCB_T *CCB)
{ {
BusLogic_HostAdapter_T *HostAdapter = CCB->HostAdapter; BusLogic_HostAdapter_T *HostAdapter = CCB->HostAdapter;
if (CCB->Command->use_sg != 0)
{
pci_unmap_sg(HostAdapter->PCI_Device,
(SCSI_ScatterList_T *)CCB->Command->request_buffer,
CCB->Command->use_sg,
scsi_to_pci_dma_dir(CCB->Command->sc_data_direction));
}
else if (CCB->Command->request_bufflen != 0)
{
pci_unmap_single(HostAdapter->PCI_Device, CCB->DataPointer,
CCB->DataLength,
scsi_to_pci_dma_dir(CCB->Command->sc_data_direction));
}
pci_unmap_single(HostAdapter->PCI_Device, CCB->SenseDataPointer,
CCB->SenseDataLength, PCI_DMA_FROMDEVICE);
CCB->Command = NULL; CCB->Command = NULL;
CCB->Status = BusLogic_CCB_Free; CCB->Status = BusLogic_CCB_Free;
CCB->Next = HostAdapter->Free_CCBs; CCB->Next = HostAdapter->Free_CCBs;
...@@ -431,8 +462,8 @@ static int BusLogic_Command(BusLogic_HostAdapter_T *HostAdapter, ...@@ -431,8 +462,8 @@ static int BusLogic_Command(BusLogic_HostAdapter_T *HostAdapter,
*/ */
if (!HostAdapter->IRQ_ChannelAcquired) if (!HostAdapter->IRQ_ChannelAcquired)
{ {
save_flags(ProcessorFlags); local_irq_save(ProcessorFlags);
cli(); local_irq_disable();
} }
/* /*
Wait for the Host Adapter Ready bit to be set and the Command/Parameter Wait for the Host Adapter Ready bit to be set and the Command/Parameter
...@@ -624,7 +655,7 @@ static int BusLogic_Command(BusLogic_HostAdapter_T *HostAdapter, ...@@ -624,7 +655,7 @@ static int BusLogic_Command(BusLogic_HostAdapter_T *HostAdapter,
*/ */
Done: Done:
if (!HostAdapter->IRQ_ChannelAcquired) if (!HostAdapter->IRQ_ChannelAcquired)
restore_flags(ProcessorFlags); local_irq_restore(ProcessorFlags);
return Result; return Result;
} }
...@@ -643,6 +674,7 @@ static void BusLogic_AppendProbeAddressISA(BusLogic_IO_Address_T IO_Address) ...@@ -643,6 +674,7 @@ static void BusLogic_AppendProbeAddressISA(BusLogic_IO_Address_T IO_Address)
ProbeInfo->HostAdapterType = BusLogic_MultiMaster; ProbeInfo->HostAdapterType = BusLogic_MultiMaster;
ProbeInfo->HostAdapterBusType = BusLogic_ISA_Bus; ProbeInfo->HostAdapterBusType = BusLogic_ISA_Bus;
ProbeInfo->IO_Address = IO_Address; ProbeInfo->IO_Address = IO_Address;
ProbeInfo->PCI_Device = NULL;
} }
...@@ -769,8 +801,8 @@ static int BusLogic_InitializeMultiMasterProbeInfo(BusLogic_HostAdapter_T ...@@ -769,8 +801,8 @@ static int BusLogic_InitializeMultiMasterProbeInfo(BusLogic_HostAdapter_T
BusLogic_HostAdapter_T *HostAdapter = PrototypeHostAdapter; BusLogic_HostAdapter_T *HostAdapter = PrototypeHostAdapter;
BusLogic_PCIHostAdapterInformation_T PCIHostAdapterInformation; BusLogic_PCIHostAdapterInformation_T PCIHostAdapterInformation;
BusLogic_ModifyIOAddressRequest_T ModifyIOAddressRequest; BusLogic_ModifyIOAddressRequest_T ModifyIOAddressRequest;
unsigned char Bus = PCI_Device->bus->number; unsigned char Bus;
unsigned char Device = PCI_Device->devfn >> 3; unsigned char Device;
unsigned int IRQ_Channel; unsigned int IRQ_Channel;
unsigned long BaseAddress0; unsigned long BaseAddress0;
unsigned long BaseAddress1; unsigned long BaseAddress1;
...@@ -780,6 +812,11 @@ static int BusLogic_InitializeMultiMasterProbeInfo(BusLogic_HostAdapter_T ...@@ -780,6 +812,11 @@ static int BusLogic_InitializeMultiMasterProbeInfo(BusLogic_HostAdapter_T
if (pci_enable_device(PCI_Device)) if (pci_enable_device(PCI_Device))
continue; continue;
if (pci_set_dma_mask(PCI_Device, (u64)0xffffffff))
continue;
Bus = PCI_Device->bus->number;
Device = PCI_Device->devfn >> 3;
IRQ_Channel = PCI_Device->irq; IRQ_Channel = PCI_Device->irq;
IO_Address = BaseAddress0 = pci_resource_start(PCI_Device, 0); IO_Address = BaseAddress0 = pci_resource_start(PCI_Device, 0);
PCI_Address = BaseAddress1 = pci_resource_start(PCI_Device, 1); PCI_Address = BaseAddress1 = pci_resource_start(PCI_Device, 1);
...@@ -889,6 +926,7 @@ static int BusLogic_InitializeMultiMasterProbeInfo(BusLogic_HostAdapter_T ...@@ -889,6 +926,7 @@ static int BusLogic_InitializeMultiMasterProbeInfo(BusLogic_HostAdapter_T
PrimaryProbeInfo->Bus = Bus; PrimaryProbeInfo->Bus = Bus;
PrimaryProbeInfo->Device = Device; PrimaryProbeInfo->Device = Device;
PrimaryProbeInfo->IRQ_Channel = IRQ_Channel; PrimaryProbeInfo->IRQ_Channel = IRQ_Channel;
PrimaryProbeInfo->PCI_Device = PCI_Device;
PCIMultiMasterCount++; PCIMultiMasterCount++;
} }
else if (BusLogic_ProbeInfoCount < BusLogic_MaxHostAdapters) else if (BusLogic_ProbeInfoCount < BusLogic_MaxHostAdapters)
...@@ -902,6 +940,7 @@ static int BusLogic_InitializeMultiMasterProbeInfo(BusLogic_HostAdapter_T ...@@ -902,6 +940,7 @@ static int BusLogic_InitializeMultiMasterProbeInfo(BusLogic_HostAdapter_T
ProbeInfo->Bus = Bus; ProbeInfo->Bus = Bus;
ProbeInfo->Device = Device; ProbeInfo->Device = Device;
ProbeInfo->IRQ_Channel = IRQ_Channel; ProbeInfo->IRQ_Channel = IRQ_Channel;
ProbeInfo->PCI_Device = PCI_Device;
NonPrimaryPCIMultiMasterCount++; NonPrimaryPCIMultiMasterCount++;
PCIMultiMasterCount++; PCIMultiMasterCount++;
} }
...@@ -978,14 +1017,22 @@ static int BusLogic_InitializeMultiMasterProbeInfo(BusLogic_HostAdapter_T ...@@ -978,14 +1017,22 @@ static int BusLogic_InitializeMultiMasterProbeInfo(BusLogic_HostAdapter_T
PCI_DEVICE_ID_BUSLOGIC_MULTIMASTER_NC, PCI_DEVICE_ID_BUSLOGIC_MULTIMASTER_NC,
PCI_Device)) != NULL) PCI_Device)) != NULL)
{ {
unsigned char Bus = PCI_Device->bus->number; unsigned char Bus;
unsigned char Device = PCI_Device->devfn >> 3; unsigned char Device;
unsigned int IRQ_Channel = PCI_Device->irq; unsigned int IRQ_Channel;
BusLogic_IO_Address_T IO_Address = pci_resource_start(PCI_Device, 0); BusLogic_IO_Address_T IO_Address;
if (pci_enable_device(PCI_Device)) if (pci_enable_device(PCI_Device))
continue; continue;
if (pci_set_dma_mask(PCI_Device, (u64)0xffffffff))
continue;
Bus = PCI_Device->bus->number;
Device = PCI_Device->devfn >> 3;
IRQ_Channel = PCI_Device->irq;
IO_Address = pci_resource_start(PCI_Device, 0);
if (IO_Address == 0 || IRQ_Channel == 0) continue; if (IO_Address == 0 || IRQ_Channel == 0) continue;
for (i = 0; i < BusLogic_ProbeInfoCount; i++) for (i = 0; i < BusLogic_ProbeInfoCount; i++)
{ {
...@@ -998,6 +1045,7 @@ static int BusLogic_InitializeMultiMasterProbeInfo(BusLogic_HostAdapter_T ...@@ -998,6 +1045,7 @@ static int BusLogic_InitializeMultiMasterProbeInfo(BusLogic_HostAdapter_T
ProbeInfo->Bus = Bus; ProbeInfo->Bus = Bus;
ProbeInfo->Device = Device; ProbeInfo->Device = Device;
ProbeInfo->IRQ_Channel = IRQ_Channel; ProbeInfo->IRQ_Channel = IRQ_Channel;
ProbeInfo->PCI_Device = PCI_Device;
break; break;
} }
} }
...@@ -1025,17 +1073,25 @@ static int BusLogic_InitializeFlashPointProbeInfo(BusLogic_HostAdapter_T ...@@ -1025,17 +1073,25 @@ static int BusLogic_InitializeFlashPointProbeInfo(BusLogic_HostAdapter_T
PCI_DEVICE_ID_BUSLOGIC_FLASHPOINT, PCI_DEVICE_ID_BUSLOGIC_FLASHPOINT,
PCI_Device)) != NULL) PCI_Device)) != NULL)
{ {
unsigned char Bus = PCI_Device->bus->number; unsigned char Bus;
unsigned char Device = PCI_Device->devfn >> 3; unsigned char Device;
unsigned int IRQ_Channel = PCI_Device->irq; unsigned int IRQ_Channel;
unsigned long BaseAddress0 = pci_resource_start(PCI_Device, 0); unsigned long BaseAddress0;
unsigned long BaseAddress1 = pci_resource_start(PCI_Device, 1); unsigned long BaseAddress1;
BusLogic_IO_Address_T IO_Address = BaseAddress0; BusLogic_IO_Address_T IO_Address;
BusLogic_PCI_Address_T PCI_Address = BaseAddress1; BusLogic_PCI_Address_T PCI_Address;
if (pci_enable_device(PCI_Device)) if (pci_enable_device(PCI_Device))
continue; continue;
if (pci_set_dma_mask(PCI_Device, (u64)0xffffffff))
continue;
Bus = PCI_Device->bus->number;
Device = PCI_Device->devfn >> 3;
IRQ_Channel = PCI_Device->irq;
IO_Address = BaseAddress0 = pci_resource_start(PCI_Device, 0);
PCI_Address = BaseAddress1 = pci_resource_start(PCI_Device, 1);
#ifndef CONFIG_SCSI_OMIT_FLASHPOINT #ifndef CONFIG_SCSI_OMIT_FLASHPOINT
if (pci_resource_flags(PCI_Device, 0) & IORESOURCE_MEM) if (pci_resource_flags(PCI_Device, 0) & IORESOURCE_MEM)
{ {
...@@ -1080,6 +1136,7 @@ static int BusLogic_InitializeFlashPointProbeInfo(BusLogic_HostAdapter_T ...@@ -1080,6 +1136,7 @@ static int BusLogic_InitializeFlashPointProbeInfo(BusLogic_HostAdapter_T
ProbeInfo->Bus = Bus; ProbeInfo->Bus = Bus;
ProbeInfo->Device = Device; ProbeInfo->Device = Device;
ProbeInfo->IRQ_Channel = IRQ_Channel; ProbeInfo->IRQ_Channel = IRQ_Channel;
ProbeInfo->PCI_Device = PCI_Device;
FlashPointCount++; FlashPointCount++;
} }
else BusLogic_Warning("BusLogic: Too many Host Adapters " else BusLogic_Warning("BusLogic: Too many Host Adapters "
...@@ -2299,6 +2356,16 @@ static void BusLogic_ReleaseResources(BusLogic_HostAdapter_T *HostAdapter) ...@@ -2299,6 +2356,16 @@ static void BusLogic_ReleaseResources(BusLogic_HostAdapter_T *HostAdapter)
*/ */
if (HostAdapter->DMA_ChannelAcquired) if (HostAdapter->DMA_ChannelAcquired)
free_dma(HostAdapter->DMA_Channel); free_dma(HostAdapter->DMA_Channel);
/*
Release any allocated memory structs not released elsewhere
*/
if (HostAdapter->MailboxSpace)
pci_free_consistent(HostAdapter->PCI_Device, HostAdapter->MailboxSize,
HostAdapter->MailboxSpace,
HostAdapter->MailboxSpaceHandle);
HostAdapter->MailboxSpace = NULL;
HostAdapter->MailboxSpaceHandle = 0;
HostAdapter->MailboxSize = 0;
} }
...@@ -2341,6 +2408,12 @@ static boolean BusLogic_InitializeHostAdapter(BusLogic_HostAdapter_T ...@@ -2341,6 +2408,12 @@ static boolean BusLogic_InitializeHostAdapter(BusLogic_HostAdapter_T
/* /*
Initialize the Outgoing and Incoming Mailbox pointers. Initialize the Outgoing and Incoming Mailbox pointers.
*/ */
HostAdapter->MailboxSize = HostAdapter->MailboxCount *
(sizeof(BusLogic_OutgoingMailbox_T) + sizeof(BusLogic_IncomingMailbox_T));
HostAdapter->MailboxSpace = pci_alloc_consistent(HostAdapter->PCI_Device,
HostAdapter->MailboxSize, &HostAdapter->MailboxSpaceHandle);
if (HostAdapter->MailboxSpace == NULL)
return BusLogic_Failure(HostAdapter, "MAILBOX ALLOCATION");
HostAdapter->FirstOutgoingMailbox = HostAdapter->FirstOutgoingMailbox =
(BusLogic_OutgoingMailbox_T *) HostAdapter->MailboxSpace; (BusLogic_OutgoingMailbox_T *) HostAdapter->MailboxSpace;
HostAdapter->LastOutgoingMailbox = HostAdapter->LastOutgoingMailbox =
...@@ -2351,6 +2424,7 @@ static boolean BusLogic_InitializeHostAdapter(BusLogic_HostAdapter_T ...@@ -2351,6 +2424,7 @@ static boolean BusLogic_InitializeHostAdapter(BusLogic_HostAdapter_T
HostAdapter->LastIncomingMailbox = HostAdapter->LastIncomingMailbox =
HostAdapter->FirstIncomingMailbox + HostAdapter->MailboxCount - 1; HostAdapter->FirstIncomingMailbox + HostAdapter->MailboxCount - 1;
HostAdapter->NextIncomingMailbox = HostAdapter->FirstIncomingMailbox; HostAdapter->NextIncomingMailbox = HostAdapter->FirstIncomingMailbox;
/* /*
Initialize the Outgoing and Incoming Mailbox structures. Initialize the Outgoing and Incoming Mailbox structures.
*/ */
...@@ -2363,7 +2437,7 @@ static boolean BusLogic_InitializeHostAdapter(BusLogic_HostAdapter_T ...@@ -2363,7 +2437,7 @@ static boolean BusLogic_InitializeHostAdapter(BusLogic_HostAdapter_T
*/ */
ExtendedMailboxRequest.MailboxCount = HostAdapter->MailboxCount; ExtendedMailboxRequest.MailboxCount = HostAdapter->MailboxCount;
ExtendedMailboxRequest.BaseMailboxAddress = ExtendedMailboxRequest.BaseMailboxAddress =
Virtual_to_Bus(HostAdapter->FirstOutgoingMailbox); (BusLogic_BusAddress_T) HostAdapter->MailboxSpaceHandle;
if (BusLogic_Command(HostAdapter, BusLogic_InitializeExtendedMailbox, if (BusLogic_Command(HostAdapter, BusLogic_InitializeExtendedMailbox,
&ExtendedMailboxRequest, &ExtendedMailboxRequest,
sizeof(ExtendedMailboxRequest), NULL, 0) < 0) sizeof(ExtendedMailboxRequest), NULL, 0) < 0)
...@@ -2838,7 +2912,8 @@ int BusLogic_DetectHostAdapter(SCSI_Host_Template_T *HostTemplate) ...@@ -2838,7 +2912,8 @@ int BusLogic_DetectHostAdapter(SCSI_Host_Template_T *HostTemplate)
HostAdapter->AddressCount, HostAdapter->AddressCount,
HostAdapter->FullModelName)) { HostAdapter->FullModelName)) {
printk(KERN_WARNING "BusLogic: Release and re-register of " printk(KERN_WARNING "BusLogic: Release and re-register of "
"port 0x%04lx failed \n", HostAdapter->IO_Address); "port 0x%04lx failed \n",
(unsigned long)HostAdapter->IO_Address);
BusLogic_DestroyCCBs(HostAdapter); BusLogic_DestroyCCBs(HostAdapter);
BusLogic_ReleaseResources(HostAdapter); BusLogic_ReleaseResources(HostAdapter);
BusLogic_UnregisterHostAdapter(HostAdapter); BusLogic_UnregisterHostAdapter(HostAdapter);
...@@ -3013,6 +3088,13 @@ static void BusLogic_ScanIncomingMailboxes(BusLogic_HostAdapter_T *HostAdapter) ...@@ -3013,6 +3088,13 @@ static void BusLogic_ScanIncomingMailboxes(BusLogic_HostAdapter_T *HostAdapter)
while ((CompletionCode = NextIncomingMailbox->CompletionCode) != while ((CompletionCode = NextIncomingMailbox->CompletionCode) !=
BusLogic_IncomingMailboxFree) BusLogic_IncomingMailboxFree)
{ {
/*
We are only allowed to do this because we limit our architectures we
run on to machines where bus_to_virt() actually works. There *needs*
to be a dma_addr_to_virt() in the new PCI DMA mapping interface to
replace bus_to_virt() or else this code is going to become very
innefficient.
*/
BusLogic_CCB_T *CCB = (BusLogic_CCB_T *) BusLogic_CCB_T *CCB = (BusLogic_CCB_T *)
Bus_to_Virtual(NextIncomingMailbox->CCB); Bus_to_Virtual(NextIncomingMailbox->CCB);
if (CompletionCode != BusLogic_AbortedCommandNotFound) if (CompletionCode != BusLogic_AbortedCommandNotFound)
...@@ -3285,7 +3367,6 @@ static void BusLogic_InterruptHandler(int IRQ_Channel, ...@@ -3285,7 +3367,6 @@ static void BusLogic_InterruptHandler(int IRQ_Channel,
BusLogic_ResetHostAdapter(HostAdapter, NULL, 0); BusLogic_ResetHostAdapter(HostAdapter, NULL, 0);
HostAdapter->HostAdapterExternalReset = false; HostAdapter->HostAdapterExternalReset = false;
HostAdapter->HostAdapterInternalError = false; HostAdapter->HostAdapterInternalError = false;
scsi_mark_host_reset(HostAdapter->SCSI_Host);
} }
/* /*
Release exclusive access to Host Adapter. Release exclusive access to Host Adapter.
...@@ -3315,7 +3396,7 @@ static boolean BusLogic_WriteOutgoingMailbox(BusLogic_HostAdapter_T ...@@ -3315,7 +3396,7 @@ static boolean BusLogic_WriteOutgoingMailbox(BusLogic_HostAdapter_T
the Host Adapter is operating asynchronously and the locking code the Host Adapter is operating asynchronously and the locking code
does not protect against simultaneous access by the Host Adapter. does not protect against simultaneous access by the Host Adapter.
*/ */
NextOutgoingMailbox->CCB = Virtual_to_Bus(CCB); NextOutgoingMailbox->CCB = CCB->DMA_Handle;
NextOutgoingMailbox->ActionCode = ActionCode; NextOutgoingMailbox->ActionCode = ActionCode;
BusLogic_StartMailboxCommand(HostAdapter); BusLogic_StartMailboxCommand(HostAdapter);
if (++NextOutgoingMailbox > HostAdapter->LastOutgoingMailbox) if (++NextOutgoingMailbox > HostAdapter->LastOutgoingMailbox)
...@@ -3354,7 +3435,6 @@ int BusLogic_QueueCommand(SCSI_Command_T *Command, ...@@ -3354,7 +3435,6 @@ int BusLogic_QueueCommand(SCSI_Command_T *Command,
void *BufferPointer = Command->request_buffer; void *BufferPointer = Command->request_buffer;
int BufferLength = Command->request_bufflen; int BufferLength = Command->request_bufflen;
int SegmentCount = Command->use_sg; int SegmentCount = Command->use_sg;
ProcessorFlags_T ProcessorFlags;
BusLogic_CCB_T *CCB; BusLogic_CCB_T *CCB;
/* /*
SCSI REQUEST_SENSE commands will be executed automatically by the Host SCSI REQUEST_SENSE commands will be executed automatically by the Host
...@@ -3367,10 +3447,6 @@ int BusLogic_QueueCommand(SCSI_Command_T *Command, ...@@ -3367,10 +3447,6 @@ int BusLogic_QueueCommand(SCSI_Command_T *Command,
CompletionRoutine(Command); CompletionRoutine(Command);
return 0; return 0;
} }
/*
Acquire exclusive access to Host Adapter.
*/
BusLogic_AcquireHostAdapterLock(HostAdapter, &ProcessorFlags);
/* /*
Allocate a CCB from the Host Adapter's free list. In the unlikely event 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 that there are none available and memory allocation fails, wait 1 second
...@@ -3380,41 +3456,56 @@ int BusLogic_QueueCommand(SCSI_Command_T *Command, ...@@ -3380,41 +3456,56 @@ int BusLogic_QueueCommand(SCSI_Command_T *Command,
CCB = BusLogic_AllocateCCB(HostAdapter); CCB = BusLogic_AllocateCCB(HostAdapter);
if (CCB == NULL) if (CCB == NULL)
{ {
BusLogic_ReleaseHostAdapterLock(HostAdapter);
BusLogic_Delay(1); BusLogic_Delay(1);
BusLogic_AcquireHostAdapterLock(HostAdapter);
CCB = BusLogic_AllocateCCB(HostAdapter); CCB = BusLogic_AllocateCCB(HostAdapter);
if (CCB == NULL) if (CCB == NULL)
{ {
Command->result = DID_ERROR << 16; Command->result = DID_ERROR << 16;
CompletionRoutine(Command); CompletionRoutine(Command);
goto Done; 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) if (SegmentCount == 0 && BufferLength != 0)
{ {
CCB->Opcode = BusLogic_InitiatorCCB; CCB->Opcode = BusLogic_InitiatorCCB;
CCB->DataLength = BufferLength; CCB->DataLength = BufferLength;
CCB->DataPointer = Virtual_to_Bus(BufferPointer); CCB->DataPointer =
pci_map_single(HostAdapter->PCI_Device, BufferPointer, BufferLength,
scsi_to_pci_dma_dir(Command->sc_data_direction));
} }
else else if (SegmentCount != 0)
{ {
SCSI_ScatterList_T *ScatterList = (SCSI_ScatterList_T *) BufferPointer; SCSI_ScatterList_T *ScatterList = (SCSI_ScatterList_T *) BufferPointer;
int Segment; int Segment, Count;
Count = pci_map_sg(HostAdapter->PCI_Device, ScatterList, SegmentCount,
scsi_to_pci_dma_dir(Command->sc_data_direction));
CCB->Opcode = BusLogic_InitiatorCCB_ScatterGather; CCB->Opcode = BusLogic_InitiatorCCB_ScatterGather;
CCB->DataLength = SegmentCount * sizeof(BusLogic_ScatterGatherSegment_T); CCB->DataLength = Count * sizeof(BusLogic_ScatterGatherSegment_T);
if (BusLogic_MultiMasterHostAdapterP(HostAdapter)) if (BusLogic_MultiMasterHostAdapterP(HostAdapter))
CCB->DataPointer = Virtual_to_Bus(CCB->ScatterGatherList); CCB->DataPointer = (unsigned int)CCB->DMA_Handle +
((unsigned int)&CCB->ScatterGatherList -
(unsigned int)CCB);
else CCB->DataPointer = Virtual_to_32Bit_Virtual(CCB->ScatterGatherList); else CCB->DataPointer = Virtual_to_32Bit_Virtual(CCB->ScatterGatherList);
for (Segment = 0; Segment < SegmentCount; Segment++) for (Segment = 0; Segment < Count; Segment++)
{ {
CCB->ScatterGatherList[Segment].SegmentByteCount = CCB->ScatterGatherList[Segment].SegmentByteCount =
ScatterList[Segment].length; sg_dma_len(ScatterList+Segment);
CCB->ScatterGatherList[Segment].SegmentDataPointer = CCB->ScatterGatherList[Segment].SegmentDataPointer =
Virtual_to_Bus(ScatterList[Segment].address); sg_dma_address(ScatterList+Segment);
} }
} }
else
{
CCB->Opcode = BusLogic_InitiatorCCB;
CCB->DataLength = BufferLength;
CCB->DataPointer = 0;
}
switch (CDB[0]) switch (CDB[0])
{ {
case READ_6: case READ_6:
...@@ -3440,7 +3531,6 @@ int BusLogic_QueueCommand(SCSI_Command_T *Command, ...@@ -3440,7 +3531,6 @@ int BusLogic_QueueCommand(SCSI_Command_T *Command,
break; break;
} }
CCB->CDB_Length = CDB_Length; CCB->CDB_Length = CDB_Length;
CCB->SenseDataLength = sizeof(Command->sense_buffer);
CCB->HostAdapterStatus = 0; CCB->HostAdapterStatus = 0;
CCB->TargetDeviceStatus = 0; CCB->TargetDeviceStatus = 0;
CCB->TargetID = TargetID; CCB->TargetID = TargetID;
...@@ -3507,7 +3597,11 @@ int BusLogic_QueueCommand(SCSI_Command_T *Command, ...@@ -3507,7 +3597,11 @@ int BusLogic_QueueCommand(SCSI_Command_T *Command,
} }
} }
memcpy(CCB->CDB, CDB, CDB_Length); memcpy(CCB->CDB, CDB, CDB_Length);
CCB->SenseDataPointer = Virtual_to_Bus(&Command->sense_buffer); CCB->SenseDataLength = sizeof(Command->sense_buffer);
CCB->SenseDataPointer = pci_map_single(HostAdapter->PCI_Device,
Command->sense_buffer,
CCB->SenseDataLength,
PCI_DMA_FROMDEVICE);
CCB->Command = Command; CCB->Command = Command;
Command->scsi_done = CompletionRoutine; Command->scsi_done = CompletionRoutine;
if (BusLogic_MultiMasterHostAdapterP(HostAdapter)) if (BusLogic_MultiMasterHostAdapterP(HostAdapter))
...@@ -3523,9 +3617,11 @@ int BusLogic_QueueCommand(SCSI_Command_T *Command, ...@@ -3523,9 +3617,11 @@ int BusLogic_QueueCommand(SCSI_Command_T *Command,
if (!BusLogic_WriteOutgoingMailbox( if (!BusLogic_WriteOutgoingMailbox(
HostAdapter, BusLogic_MailboxStartCommand, CCB)) HostAdapter, BusLogic_MailboxStartCommand, CCB))
{ {
BusLogic_ReleaseHostAdapterLock(HostAdapter);
BusLogic_Warning("Unable to write Outgoing Mailbox - " BusLogic_Warning("Unable to write Outgoing Mailbox - "
"Pausing for 1 second\n", HostAdapter); "Pausing for 1 second\n", HostAdapter);
BusLogic_Delay(1); BusLogic_Delay(1);
BusLogic_AcquireHostAdapterLock(HostAdapter);
if (!BusLogic_WriteOutgoingMailbox( if (!BusLogic_WriteOutgoingMailbox(
HostAdapter, BusLogic_MailboxStartCommand, CCB)) HostAdapter, BusLogic_MailboxStartCommand, CCB))
{ {
...@@ -3553,11 +3649,6 @@ int BusLogic_QueueCommand(SCSI_Command_T *Command, ...@@ -3553,11 +3649,6 @@ int BusLogic_QueueCommand(SCSI_Command_T *Command,
if (CCB->Status == BusLogic_CCB_Completed) if (CCB->Status == BusLogic_CCB_Completed)
BusLogic_ProcessCompletedCCBs(HostAdapter); BusLogic_ProcessCompletedCCBs(HostAdapter);
} }
/*
Release exclusive access to Host Adapter.
*/
Done:
BusLogic_ReleaseHostAdapterLock(HostAdapter, &ProcessorFlags);
return 0; return 0;
} }
...@@ -3571,15 +3662,10 @@ int BusLogic_AbortCommand(SCSI_Command_T *Command) ...@@ -3571,15 +3662,10 @@ int BusLogic_AbortCommand(SCSI_Command_T *Command)
BusLogic_HostAdapter_T *HostAdapter = BusLogic_HostAdapter_T *HostAdapter =
(BusLogic_HostAdapter_T *) Command->host->hostdata; (BusLogic_HostAdapter_T *) Command->host->hostdata;
int TargetID = Command->target; int TargetID = Command->target;
ProcessorFlags_T ProcessorFlags;
BusLogic_CCB_T *CCB; BusLogic_CCB_T *CCB;
int Result; int Result;
BusLogic_IncrementErrorCounter( BusLogic_IncrementErrorCounter(
&HostAdapter->TargetStatistics[TargetID].CommandAbortsRequested); &HostAdapter->TargetStatistics[TargetID].CommandAbortsRequested);
/*
Acquire exclusive access to Host Adapter.
*/
BusLogic_AcquireHostAdapterLock(HostAdapter, &ProcessorFlags);
/* /*
If this Command has already completed, then no Abort is necessary. If this Command has already completed, then no Abort is necessary.
*/ */
...@@ -3587,8 +3673,7 @@ int BusLogic_AbortCommand(SCSI_Command_T *Command) ...@@ -3587,8 +3673,7 @@ int BusLogic_AbortCommand(SCSI_Command_T *Command)
{ {
BusLogic_Warning("Unable to Abort Command to Target %d - " BusLogic_Warning("Unable to Abort Command to Target %d - "
"Already Completed\n", HostAdapter, TargetID); "Already Completed\n", HostAdapter, TargetID);
Result = SCSI_ABORT_NOT_RUNNING; return SCSI_ABORT_NOT_RUNNING;
goto Done;
} }
/* /*
Attempt to find an Active CCB for this Command. If no Active CCB for this Attempt to find an Active CCB for this Command. If no Active CCB for this
...@@ -3600,22 +3685,19 @@ int BusLogic_AbortCommand(SCSI_Command_T *Command) ...@@ -3600,22 +3685,19 @@ int BusLogic_AbortCommand(SCSI_Command_T *Command)
{ {
BusLogic_Warning("Unable to Abort Command to Target %d - " BusLogic_Warning("Unable to Abort Command to Target %d - "
"No CCB Found\n", HostAdapter, TargetID); "No CCB Found\n", HostAdapter, TargetID);
Result = SCSI_ABORT_NOT_RUNNING; return SCSI_ABORT_NOT_RUNNING;
goto Done;
} }
else if (CCB->Status == BusLogic_CCB_Completed) else if (CCB->Status == BusLogic_CCB_Completed)
{ {
BusLogic_Warning("Unable to Abort Command to Target %d - " BusLogic_Warning("Unable to Abort Command to Target %d - "
"CCB Completed\n", HostAdapter, TargetID); "CCB Completed\n", HostAdapter, TargetID);
Result = SCSI_ABORT_NOT_RUNNING; return SCSI_ABORT_NOT_RUNNING;
goto Done;
} }
else if (CCB->Status == BusLogic_CCB_Reset) else if (CCB->Status == BusLogic_CCB_Reset)
{ {
BusLogic_Warning("Unable to Abort Command to Target %d - " BusLogic_Warning("Unable to Abort Command to Target %d - "
"CCB Reset\n", HostAdapter, TargetID); "CCB Reset\n", HostAdapter, TargetID);
Result = SCSI_ABORT_PENDING; return SCSI_ABORT_PENDING;
goto Done;
} }
if (BusLogic_MultiMasterHostAdapterP(HostAdapter)) if (BusLogic_MultiMasterHostAdapterP(HostAdapter))
{ {
...@@ -3676,11 +3758,6 @@ int BusLogic_AbortCommand(SCSI_Command_T *Command) ...@@ -3676,11 +3758,6 @@ int BusLogic_AbortCommand(SCSI_Command_T *Command)
Result = SCSI_ABORT_SUCCESS; Result = SCSI_ABORT_SUCCESS;
} }
} }
/*
Release exclusive access to Host Adapter.
*/
Done:
BusLogic_ReleaseHostAdapterLock(HostAdapter, &ProcessorFlags);
return Result; return Result;
} }
...@@ -3694,7 +3771,6 @@ static int BusLogic_ResetHostAdapter(BusLogic_HostAdapter_T *HostAdapter, ...@@ -3694,7 +3771,6 @@ static int BusLogic_ResetHostAdapter(BusLogic_HostAdapter_T *HostAdapter,
SCSI_Command_T *Command, SCSI_Command_T *Command,
unsigned int ResetFlags) unsigned int ResetFlags)
{ {
ProcessorFlags_T ProcessorFlags;
BusLogic_CCB_T *CCB; BusLogic_CCB_T *CCB;
int TargetID, Result; int TargetID, Result;
boolean HardReset; boolean HardReset;
...@@ -3715,10 +3791,6 @@ static int BusLogic_ResetHostAdapter(BusLogic_HostAdapter_T *HostAdapter, ...@@ -3715,10 +3791,6 @@ static int BusLogic_ResetHostAdapter(BusLogic_HostAdapter_T *HostAdapter,
.HostAdapterResetsRequested); .HostAdapterResetsRequested);
HardReset = true; HardReset = true;
} }
/*
Acquire exclusive access to Host Adapter.
*/
BusLogic_AcquireHostAdapterLock(HostAdapter, &ProcessorFlags);
/* /*
If this is an Asynchronous Reset and this Command has already completed, If this is an Asynchronous Reset and this Command has already completed,
then no Reset is necessary. then no Reset is necessary.
...@@ -3804,7 +3876,11 @@ static int BusLogic_ResetHostAdapter(BusLogic_HostAdapter_T *HostAdapter, ...@@ -3804,7 +3876,11 @@ static int BusLogic_ResetHostAdapter(BusLogic_HostAdapter_T *HostAdapter,
already been marked Reset and so a reentrant call will return Pending. already been marked Reset and so a reentrant call will return Pending.
*/ */
if (HardReset) if (HardReset)
{
BusLogic_ReleaseHostAdapterLock(HostAdapter);
BusLogic_Delay(HostAdapter->BusSettleTime); BusLogic_Delay(HostAdapter->BusSettleTime);
BusLogic_AcquireHostAdapterLock(HostAdapter);
}
/* /*
If this is a Synchronous Reset, perform completion processing for If this is a Synchronous Reset, perform completion processing for
the Command being Reset. the Command being Reset.
...@@ -3837,11 +3913,7 @@ static int BusLogic_ResetHostAdapter(BusLogic_HostAdapter_T *HostAdapter, ...@@ -3837,11 +3913,7 @@ static int BusLogic_ResetHostAdapter(BusLogic_HostAdapter_T *HostAdapter,
HostAdapter->LastResetCompleted[TargetID] = jiffies; HostAdapter->LastResetCompleted[TargetID] = jiffies;
} }
Result = SCSI_RESET_SUCCESS | SCSI_RESET_HOST_RESET; Result = SCSI_RESET_SUCCESS | SCSI_RESET_HOST_RESET;
/*
Release exclusive access to Host Adapter.
*/
Done: Done:
BusLogic_ReleaseHostAdapterLock(HostAdapter, &ProcessorFlags);
return Result; return Result;
} }
...@@ -3857,14 +3929,9 @@ static int BusLogic_SendBusDeviceReset(BusLogic_HostAdapter_T *HostAdapter, ...@@ -3857,14 +3929,9 @@ static int BusLogic_SendBusDeviceReset(BusLogic_HostAdapter_T *HostAdapter,
{ {
int TargetID = Command->target; int TargetID = Command->target;
BusLogic_CCB_T *CCB, *XCCB; BusLogic_CCB_T *CCB, *XCCB;
ProcessorFlags_T ProcessorFlags;
int Result = -1; int Result = -1;
BusLogic_IncrementErrorCounter( BusLogic_IncrementErrorCounter(
&HostAdapter->TargetStatistics[TargetID].BusDeviceResetsRequested); &HostAdapter->TargetStatistics[TargetID].BusDeviceResetsRequested);
/*
Acquire exclusive access to Host Adapter.
*/
BusLogic_AcquireHostAdapterLock(HostAdapter, &ProcessorFlags);
/* /*
If this is an Asynchronous Reset and this Command has already completed, If this is an Asynchronous Reset and this Command has already completed,
then no Reset is necessary. then no Reset is necessary.
...@@ -4026,10 +4093,6 @@ static int BusLogic_SendBusDeviceReset(BusLogic_HostAdapter_T *HostAdapter, ...@@ -4026,10 +4093,6 @@ static int BusLogic_SendBusDeviceReset(BusLogic_HostAdapter_T *HostAdapter,
Done: Done:
if (Result < 0) if (Result < 0)
Result = BusLogic_ResetHostAdapter(HostAdapter, Command, ResetFlags); Result = BusLogic_ResetHostAdapter(HostAdapter, Command, ResetFlags);
/*
Release exclusive access to Host Adapter.
*/
BusLogic_ReleaseHostAdapterLock(HostAdapter, &ProcessorFlags);
return Result; return Result;
} }
...@@ -4109,8 +4172,8 @@ int BusLogic_ResetCommand(SCSI_Command_T *Command, unsigned int ResetFlags) ...@@ -4109,8 +4172,8 @@ int BusLogic_ResetCommand(SCSI_Command_T *Command, unsigned int ResetFlags)
table, then the translation inferred from the partition table will be used by table, then the translation inferred from the partition table will be used by
the BIOS, and a warning may be displayed. the BIOS, and a warning may be displayed.
*/ */
unsigned char *scsi_bios_ptable(struct block_device *);
int BusLogic_BIOSDiskParameters(SCSI_Disk_T *Disk, struct block_device *bdev, int BusLogic_BIOSDiskParameters(SCSI_Disk_T *Disk, struct block_device *Device,
int *Parameters) int *Parameters)
{ {
BusLogic_HostAdapter_T *HostAdapter = BusLogic_HostAdapter_T *HostAdapter =
...@@ -4138,7 +4201,7 @@ int BusLogic_BIOSDiskParameters(SCSI_Disk_T *Disk, struct block_device *bdev, ...@@ -4138,7 +4201,7 @@ int BusLogic_BIOSDiskParameters(SCSI_Disk_T *Disk, struct block_device *bdev,
} }
DiskParameters->Cylinders = DiskParameters->Cylinders =
Disk->capacity / (DiskParameters->Heads * DiskParameters->Sectors); Disk->capacity / (DiskParameters->Heads * DiskParameters->Sectors);
buf = scsi_bios_ptable(bdev); buf = scsi_bios_ptable(Device);
if (buf == NULL) return 0; if (buf == NULL) return 0;
/* /*
If the boot sector partition table flag is valid, search for a partition If the boot sector partition table flag is valid, search for a partition
......
...@@ -57,7 +57,8 @@ extern int BusLogic_QueueCommand(SCSI_Command_T *, ...@@ -57,7 +57,8 @@ extern int BusLogic_QueueCommand(SCSI_Command_T *,
void (*CompletionRoutine)(SCSI_Command_T *)); void (*CompletionRoutine)(SCSI_Command_T *));
extern int BusLogic_AbortCommand(SCSI_Command_T *); extern int BusLogic_AbortCommand(SCSI_Command_T *);
extern int BusLogic_ResetCommand(SCSI_Command_T *, unsigned int); extern int BusLogic_ResetCommand(SCSI_Command_T *, unsigned int);
extern int BusLogic_BIOSDiskParameters(SCSI_Disk_T *, struct block_device *, int *); extern int BusLogic_BIOSDiskParameters(SCSI_Disk_T *, struct block_device *,
int *);
extern int BusLogic_ProcDirectoryInfo(char *, char **, off_t, int, int, int); extern int BusLogic_ProcDirectoryInfo(char *, char **, off_t, int, int, int);
...@@ -371,6 +372,7 @@ typedef struct BusLogic_ProbeInfo ...@@ -371,6 +372,7 @@ typedef struct BusLogic_ProbeInfo
BusLogic_HostAdapterBusType_T HostAdapterBusType; BusLogic_HostAdapterBusType_T HostAdapterBusType;
BusLogic_IO_Address_T IO_Address; BusLogic_IO_Address_T IO_Address;
BusLogic_PCI_Address_T PCI_Address; BusLogic_PCI_Address_T PCI_Address;
PCI_Device_T *PCI_Device;
unsigned char Bus; unsigned char Bus;
unsigned char Device; unsigned char Device;
unsigned char IRQ_Channel; unsigned char IRQ_Channel;
...@@ -1191,7 +1193,9 @@ typedef struct BusLogic_CCB ...@@ -1191,7 +1193,9 @@ typedef struct BusLogic_CCB
/* /*
BusLogic Linux Driver Defined Portion. BusLogic Linux Driver Defined Portion.
*/ */
boolean AllocationGroupHead; dma_addr_t AllocationGroupHead;
unsigned int AllocationGroupSize;
BusLogic_BusAddress_T DMA_Handle;
BusLogic_CCB_Status_T Status; BusLogic_CCB_Status_T Status;
unsigned long SerialNumber; unsigned long SerialNumber;
SCSI_Command_T *Command; SCSI_Command_T *Command;
...@@ -1355,6 +1359,7 @@ FlashPoint_Info_T; ...@@ -1355,6 +1359,7 @@ FlashPoint_Info_T;
typedef struct BusLogic_HostAdapter typedef struct BusLogic_HostAdapter
{ {
SCSI_Host_T *SCSI_Host; SCSI_Host_T *SCSI_Host;
PCI_Device_T *PCI_Device;
BusLogic_HostAdapterType_T HostAdapterType; BusLogic_HostAdapterType_T HostAdapterType;
BusLogic_HostAdapterBusType_T HostAdapterBusType; BusLogic_HostAdapterBusType_T HostAdapterBusType;
BusLogic_IO_Address_T IO_Address; BusLogic_IO_Address_T IO_Address;
...@@ -1443,9 +1448,13 @@ typedef struct BusLogic_HostAdapter ...@@ -1443,9 +1448,13 @@ typedef struct BusLogic_HostAdapter
BusLogic_IncomingMailbox_T *LastIncomingMailbox; BusLogic_IncomingMailbox_T *LastIncomingMailbox;
BusLogic_IncomingMailbox_T *NextIncomingMailbox; BusLogic_IncomingMailbox_T *NextIncomingMailbox;
BusLogic_TargetStatistics_T TargetStatistics[BusLogic_MaxTargetDevices]; BusLogic_TargetStatistics_T TargetStatistics[BusLogic_MaxTargetDevices];
unsigned char MailboxSpace[BusLogic_MaxMailboxes unsigned char *MailboxSpace;
dma_addr_t MailboxSpaceHandle;
unsigned int MailboxSize;
unsigned long CCB_Offset;
/* [BusLogic_MaxMailboxes
* (sizeof(BusLogic_OutgoingMailbox_T) * (sizeof(BusLogic_OutgoingMailbox_T)
+ sizeof(BusLogic_IncomingMailbox_T))]; + sizeof(BusLogic_IncomingMailbox_T))]; */
char MessageBuffer[BusLogic_MessageBufferSize]; char MessageBuffer[BusLogic_MessageBufferSize];
} }
BusLogic_HostAdapter_T; BusLogic_HostAdapter_T;
...@@ -1504,9 +1513,9 @@ SCSI_Inquiry_T; ...@@ -1504,9 +1513,9 @@ SCSI_Inquiry_T;
*/ */
static inline static inline
void BusLogic_AcquireHostAdapterLock(BusLogic_HostAdapter_T *HostAdapter, void BusLogic_AcquireHostAdapterLock(BusLogic_HostAdapter_T *HostAdapter)
ProcessorFlags_T *ProcessorFlags)
{ {
spin_lock_irq(HostAdapter->SCSI_Host->host_lock);
} }
...@@ -1515,9 +1524,9 @@ void BusLogic_AcquireHostAdapterLock(BusLogic_HostAdapter_T *HostAdapter, ...@@ -1515,9 +1524,9 @@ void BusLogic_AcquireHostAdapterLock(BusLogic_HostAdapter_T *HostAdapter,
*/ */
static inline static inline
void BusLogic_ReleaseHostAdapterLock(BusLogic_HostAdapter_T *HostAdapter, void BusLogic_ReleaseHostAdapterLock(BusLogic_HostAdapter_T *HostAdapter)
ProcessorFlags_T *ProcessorFlags)
{ {
spin_unlock_irq(HostAdapter->SCSI_Host->host_lock);
} }
...@@ -1648,12 +1657,7 @@ void BusLogic_StartMailboxCommand(BusLogic_HostAdapter_T *HostAdapter) ...@@ -1648,12 +1657,7 @@ void BusLogic_StartMailboxCommand(BusLogic_HostAdapter_T *HostAdapter)
static inline void BusLogic_Delay(int Seconds) static inline void BusLogic_Delay(int Seconds)
{ {
int Milliseconds = 1000 * Seconds; mdelay(1000 * Seconds);
unsigned long ProcessorFlags;
save_flags(ProcessorFlags);
sti();
while (--Milliseconds >= 0) udelay(1000);
restore_flags(ProcessorFlags);
} }
......
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