Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
linux
Commits
d84cebb6
Commit
d84cebb6
authored
Jul 24, 2002
by
Doug Ledford
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
[PATCH] Fix the BusLogic driver in 2.5.x
parent
2c0a3925
Changes
2
Show whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
183 additions
and
116 deletions
+183
-116
drivers/scsi/BusLogic.c
drivers/scsi/BusLogic.c
+165
-102
drivers/scsi/BusLogic.h
drivers/scsi/BusLogic.h
+18
-14
No files found.
drivers/scsi/BusLogic.c
View file @
d84cebb6
...
...
@@ -26,10 +26,8 @@
*/
#define BusLogic_DriverVersion "2.1.15"
#define BusLogic_DriverDate "17 August 1998"
#error Please convert me to Documentation/DMA-mapping.txt
#define BusLogic_DriverVersion "2.1.16"
#define BusLogic_DriverDate "18 July 2002"
#include <linux/version.h>
#include <linux/module.h>
...
...
@@ -48,6 +46,7 @@
#include <asm/dma.h>
#include <asm/io.h>
#include <asm/system.h>
/* #include <scsi/scsicam.h> This include file is currently busted */
#include "scsi.h"
#include "hosts.h"
#include "sd.h"
...
...
@@ -225,15 +224,19 @@ static void BusLogic_UnregisterHostAdapter(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
;
unsigned
int
offset
=
0
;
memset
(
BlockPointer
,
0
,
BlockSize
);
CCB
->
AllocationGroupHead
=
true
;
CCB
->
AllocationGroupHead
=
BlockPointerHandle
;
CCB
->
AllocationGroupSize
=
BlockSize
;
while
((
BlockSize
-=
sizeof
(
BusLogic_CCB_T
))
>=
0
)
{
CCB
->
Status
=
BusLogic_CCB_Free
;
CCB
->
HostAdapter
=
HostAdapter
;
CCB
->
DMA_Handle
=
(
BusLogic_BusAddress_T
)
BlockPointerHandle
+
offset
;
if
(
BusLogic_FlashPointHostAdapterP
(
HostAdapter
))
{
CCB
->
CallbackFunction
=
BusLogic_QueueCompletedCCB
;
...
...
@@ -245,6 +248,7 @@ static void BusLogic_InitializeCCBs(BusLogic_HostAdapter_T *HostAdapter,
HostAdapter
->
All_CCBs
=
CCB
;
HostAdapter
->
AllocatedCCBs
++
;
CCB
++
;
offset
+=
sizeof
(
BusLogic_CCB_T
);
}
}
...
...
@@ -256,19 +260,20 @@ static void BusLogic_InitializeCCBs(BusLogic_HostAdapter_T *HostAdapter,
static
boolean
BusLogic_CreateInitialCCBs
(
BusLogic_HostAdapter_T
*
HostAdapter
)
{
int
BlockSize
=
BusLogic_CCB_AllocationGroupSize
*
sizeof
(
BusLogic_CCB_T
);
void
*
BlockPointer
;
dma_addr_t
BlockPointerHandle
;
while
(
HostAdapter
->
AllocatedCCBs
<
HostAdapter
->
InitialCCBs
)
{
void
*
BlockPointer
=
kmalloc
(
BlockSize
,
(
HostAdapter
->
BounceBuffersRequired
?
GFP_ATOMIC
|
GFP_DMA
:
GFP_ATOMIC
));
BlockPointer
=
pci_alloc_consistent
(
HostAdapter
->
PCI_Device
,
BlockSize
,
&
BlockPointerHandle
);
if
(
BlockPointer
==
NULL
)
{
BusLogic_Error
(
"UNABLE TO ALLOCATE CCB GROUP - DETACHING
\n
"
,
HostAdapter
);
return
false
;
}
BusLogic_InitializeCCBs
(
HostAdapter
,
BlockPointer
,
BlockSize
);
BusLogic_InitializeCCBs
(
HostAdapter
,
BlockPointer
,
BlockSize
,
BlockPointerHandle
);
}
return
true
;
}
...
...
@@ -280,15 +285,25 @@ static boolean BusLogic_CreateInitialCCBs(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
->
Free_CCBs
=
NULL
;
while
((
CCB
=
NextCCB
)
!=
NULL
)
{
NextCCB
=
CCB
->
NextAll
;
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,
{
int
BlockSize
=
BusLogic_CCB_AllocationGroupSize
*
sizeof
(
BusLogic_CCB_T
);
int
PreviouslyAllocated
=
HostAdapter
->
AllocatedCCBs
;
void
*
BlockPointer
;
dma_addr_t
BlockPointerHandle
;
if
(
AdditionalCCBs
<=
0
)
return
;
while
(
HostAdapter
->
AllocatedCCBs
-
PreviouslyAllocated
<
AdditionalCCBs
)
{
void
*
BlockPointer
=
kmalloc
(
BlockSize
,
(
HostAdapter
->
BounceBuffersRequired
?
GFP_ATOMIC
|
GFP_DMA
:
GFP_ATOMIC
));
BlockPointer
=
pci_alloc_consistent
(
HostAdapter
->
PCI_Device
,
BlockSize
,
&
BlockPointerHandle
);
if
(
BlockPointer
==
NULL
)
break
;
BusLogic_InitializeCCBs
(
HostAdapter
,
BlockPointer
,
BlockSize
);
BusLogic_InitializeCCBs
(
HostAdapter
,
BlockPointer
,
BlockSize
,
BlockPointerHandle
);
}
if
(
HostAdapter
->
AllocatedCCBs
>
PreviouslyAllocated
)
{
...
...
@@ -379,6 +395,21 @@ static BusLogic_CCB_T *BusLogic_AllocateCCB(BusLogic_HostAdapter_T
static
void
BusLogic_DeallocateCCB
(
BusLogic_CCB_T
*
CCB
)
{
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
->
Status
=
BusLogic_CCB_Free
;
CCB
->
Next
=
HostAdapter
->
Free_CCBs
;
...
...
@@ -431,8 +462,8 @@ static int BusLogic_Command(BusLogic_HostAdapter_T *HostAdapter,
*/
if
(
!
HostAdapter
->
IRQ_ChannelAcquired
)
{
save_flags
(
ProcessorFlags
);
cli
();
local_irq_save
(
ProcessorFlags
);
local_irq_disable
();
}
/*
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,
*/
Done:
if
(
!
HostAdapter
->
IRQ_ChannelAcquired
)
restore_flags
(
ProcessorFlags
);
local_irq_restore
(
ProcessorFlags
);
return
Result
;
}
...
...
@@ -643,6 +674,7 @@ static void BusLogic_AppendProbeAddressISA(BusLogic_IO_Address_T IO_Address)
ProbeInfo
->
HostAdapterType
=
BusLogic_MultiMaster
;
ProbeInfo
->
HostAdapterBusType
=
BusLogic_ISA_Bus
;
ProbeInfo
->
IO_Address
=
IO_Address
;
ProbeInfo
->
PCI_Device
=
NULL
;
}
...
...
@@ -769,8 +801,8 @@ static int BusLogic_InitializeMultiMasterProbeInfo(BusLogic_HostAdapter_T
BusLogic_HostAdapter_T
*
HostAdapter
=
PrototypeHostAdapter
;
BusLogic_PCIHostAdapterInformation_T
PCIHostAdapterInformation
;
BusLogic_ModifyIOAddressRequest_T
ModifyIOAddressRequest
;
unsigned
char
Bus
=
PCI_Device
->
bus
->
number
;
unsigned
char
Device
=
PCI_Device
->
devfn
>>
3
;
unsigned
char
Bus
;
unsigned
char
Device
;
unsigned
int
IRQ_Channel
;
unsigned
long
BaseAddress0
;
unsigned
long
BaseAddress1
;
...
...
@@ -780,6 +812,11 @@ static int BusLogic_InitializeMultiMasterProbeInfo(BusLogic_HostAdapter_T
if
(
pci_enable_device
(
PCI_Device
))
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
);
...
...
@@ -889,6 +926,7 @@ static int BusLogic_InitializeMultiMasterProbeInfo(BusLogic_HostAdapter_T
PrimaryProbeInfo
->
Bus
=
Bus
;
PrimaryProbeInfo
->
Device
=
Device
;
PrimaryProbeInfo
->
IRQ_Channel
=
IRQ_Channel
;
PrimaryProbeInfo
->
PCI_Device
=
PCI_Device
;
PCIMultiMasterCount
++
;
}
else
if
(
BusLogic_ProbeInfoCount
<
BusLogic_MaxHostAdapters
)
...
...
@@ -902,6 +940,7 @@ static int BusLogic_InitializeMultiMasterProbeInfo(BusLogic_HostAdapter_T
ProbeInfo
->
Bus
=
Bus
;
ProbeInfo
->
Device
=
Device
;
ProbeInfo
->
IRQ_Channel
=
IRQ_Channel
;
ProbeInfo
->
PCI_Device
=
PCI_Device
;
NonPrimaryPCIMultiMasterCount
++
;
PCIMultiMasterCount
++
;
}
...
...
@@ -978,14 +1017,22 @@ static int BusLogic_InitializeMultiMasterProbeInfo(BusLogic_HostAdapter_T
PCI_DEVICE_ID_BUSLOGIC_MULTIMASTER_NC
,
PCI_Device
))
!=
NULL
)
{
unsigned
char
Bus
=
PCI_Device
->
bus
->
number
;
unsigned
char
Device
=
PCI_Device
->
devfn
>>
3
;
unsigned
int
IRQ_Channel
=
PCI_Device
->
irq
;
BusLogic_IO_Address_T
IO_Address
=
pci_resource_start
(
PCI_Device
,
0
)
;
unsigned
char
Bus
;
unsigned
char
Device
;
unsigned
int
IRQ_Channel
;
BusLogic_IO_Address_T
IO_Address
;
if
(
pci_enable_device
(
PCI_Device
))
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
;
for
(
i
=
0
;
i
<
BusLogic_ProbeInfoCount
;
i
++
)
{
...
...
@@ -998,6 +1045,7 @@ static int BusLogic_InitializeMultiMasterProbeInfo(BusLogic_HostAdapter_T
ProbeInfo
->
Bus
=
Bus
;
ProbeInfo
->
Device
=
Device
;
ProbeInfo
->
IRQ_Channel
=
IRQ_Channel
;
ProbeInfo
->
PCI_Device
=
PCI_Device
;
break
;
}
}
...
...
@@ -1025,17 +1073,25 @@ static int BusLogic_InitializeFlashPointProbeInfo(BusLogic_HostAdapter_T
PCI_DEVICE_ID_BUSLOGIC_FLASHPOINT
,
PCI_Device
))
!=
NULL
)
{
unsigned
char
Bus
=
PCI_Device
->
bus
->
number
;
unsigned
char
Device
=
PCI_Device
->
devfn
>>
3
;
unsigned
int
IRQ_Channel
=
PCI_Device
->
irq
;
unsigned
long
BaseAddress0
=
pci_resource_start
(
PCI_Device
,
0
)
;
unsigned
long
BaseAddress1
=
pci_resource_start
(
PCI_Device
,
1
)
;
BusLogic_IO_Address_T
IO_Address
=
BaseAddress0
;
BusLogic_PCI_Address_T
PCI_Address
=
BaseAddress1
;
unsigned
char
Bus
;
unsigned
char
Device
;
unsigned
int
IRQ_Channel
;
unsigned
long
BaseAddress0
;
unsigned
long
BaseAddress1
;
BusLogic_IO_Address_T
IO_Address
;
BusLogic_PCI_Address_T
PCI_Address
;
if
(
pci_enable_device
(
PCI_Device
))
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
if
(
pci_resource_flags
(
PCI_Device
,
0
)
&
IORESOURCE_MEM
)
{
...
...
@@ -1080,6 +1136,7 @@ static int BusLogic_InitializeFlashPointProbeInfo(BusLogic_HostAdapter_T
ProbeInfo
->
Bus
=
Bus
;
ProbeInfo
->
Device
=
Device
;
ProbeInfo
->
IRQ_Channel
=
IRQ_Channel
;
ProbeInfo
->
PCI_Device
=
PCI_Device
;
FlashPointCount
++
;
}
else
BusLogic_Warning
(
"BusLogic: Too many Host Adapters "
...
...
@@ -2299,6 +2356,16 @@ static void BusLogic_ReleaseResources(BusLogic_HostAdapter_T *HostAdapter)
*/
if
(
HostAdapter
->
DMA_ChannelAcquired
)
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
/*
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
=
(
BusLogic_OutgoingMailbox_T
*
)
HostAdapter
->
MailboxSpace
;
HostAdapter
->
LastOutgoingMailbox
=
...
...
@@ -2351,6 +2424,7 @@ static boolean BusLogic_InitializeHostAdapter(BusLogic_HostAdapter_T
HostAdapter
->
LastIncomingMailbox
=
HostAdapter
->
FirstIncomingMailbox
+
HostAdapter
->
MailboxCount
-
1
;
HostAdapter
->
NextIncomingMailbox
=
HostAdapter
->
FirstIncomingMailbox
;
/*
Initialize the Outgoing and Incoming Mailbox structures.
*/
...
...
@@ -2363,7 +2437,7 @@ static boolean BusLogic_InitializeHostAdapter(BusLogic_HostAdapter_T
*/
ExtendedMailboxRequest
.
MailboxCount
=
HostAdapter
->
MailboxCount
;
ExtendedMailboxRequest
.
BaseMailboxAddress
=
Virtual_to_Bus
(
HostAdapter
->
FirstOutgoingMailbox
)
;
(
BusLogic_BusAddress_T
)
HostAdapter
->
MailboxSpaceHandle
;
if
(
BusLogic_Command
(
HostAdapter
,
BusLogic_InitializeExtendedMailbox
,
&
ExtendedMailboxRequest
,
sizeof
(
ExtendedMailboxRequest
),
NULL
,
0
)
<
0
)
...
...
@@ -2838,7 +2912,8 @@ int BusLogic_DetectHostAdapter(SCSI_Host_Template_T *HostTemplate)
HostAdapter
->
AddressCount
,
HostAdapter
->
FullModelName
))
{
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_ReleaseResources
(
HostAdapter
);
BusLogic_UnregisterHostAdapter
(
HostAdapter
);
...
...
@@ -3013,6 +3088,13 @@ static void BusLogic_ScanIncomingMailboxes(BusLogic_HostAdapter_T *HostAdapter)
while
((
CompletionCode
=
NextIncomingMailbox
->
CompletionCode
)
!=
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
*
)
Bus_to_Virtual
(
NextIncomingMailbox
->
CCB
);
if
(
CompletionCode
!=
BusLogic_AbortedCommandNotFound
)
...
...
@@ -3285,7 +3367,6 @@ static void BusLogic_InterruptHandler(int IRQ_Channel,
BusLogic_ResetHostAdapter
(
HostAdapter
,
NULL
,
0
);
HostAdapter
->
HostAdapterExternalReset
=
false
;
HostAdapter
->
HostAdapterInternalError
=
false
;
scsi_mark_host_reset
(
HostAdapter
->
SCSI_Host
);
}
/*
Release exclusive access to Host Adapter.
...
...
@@ -3315,7 +3396,7 @@ static boolean BusLogic_WriteOutgoingMailbox(BusLogic_HostAdapter_T
the Host Adapter is operating asynchronously and the locking code
does not protect against simultaneous access by the Host Adapter.
*/
NextOutgoingMailbox
->
CCB
=
Virtual_to_Bus
(
CCB
)
;
NextOutgoingMailbox
->
CCB
=
CCB
->
DMA_Handle
;
NextOutgoingMailbox
->
ActionCode
=
ActionCode
;
BusLogic_StartMailboxCommand
(
HostAdapter
);
if
(
++
NextOutgoingMailbox
>
HostAdapter
->
LastOutgoingMailbox
)
...
...
@@ -3354,7 +3435,6 @@ int BusLogic_QueueCommand(SCSI_Command_T *Command,
void
*
BufferPointer
=
Command
->
request_buffer
;
int
BufferLength
=
Command
->
request_bufflen
;
int
SegmentCount
=
Command
->
use_sg
;
ProcessorFlags_T
ProcessorFlags
;
BusLogic_CCB_T
*
CCB
;
/*
SCSI REQUEST_SENSE commands will be executed automatically by the Host
...
...
@@ -3367,10 +3447,6 @@ int BusLogic_QueueCommand(SCSI_Command_T *Command,
CompletionRoutine
(
Command
);
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
that there are none available and memory allocation fails, wait 1 second
...
...
@@ -3380,41 +3456,56 @@ int BusLogic_QueueCommand(SCSI_Command_T *Command,
CCB
=
BusLogic_AllocateCCB
(
HostAdapter
);
if
(
CCB
==
NULL
)
{
BusLogic_ReleaseHostAdapterLock
(
HostAdapter
);
BusLogic_Delay
(
1
);
BusLogic_AcquireHostAdapterLock
(
HostAdapter
);
CCB
=
BusLogic_AllocateCCB
(
HostAdapter
);
if
(
CCB
==
NULL
)
{
Command
->
result
=
DID_ERROR
<<
16
;
CompletionRoutine
(
Command
);
goto
Done
;
return
0
;
}
}
/*
Initialize the fields in the BusLogic Command Control Block (CCB).
*/
if
(
SegmentCount
==
0
)
if
(
SegmentCount
==
0
&&
BufferLength
!=
0
)
{
CCB
->
Opcode
=
BusLogic_InitiatorCCB
;
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
;
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
->
DataLength
=
Segment
Count
*
sizeof
(
BusLogic_ScatterGatherSegment_T
);
CCB
->
DataLength
=
Count
*
sizeof
(
BusLogic_ScatterGatherSegment_T
);
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
);
for
(
Segment
=
0
;
Segment
<
Segment
Count
;
Segment
++
)
for
(
Segment
=
0
;
Segment
<
Count
;
Segment
++
)
{
CCB
->
ScatterGatherList
[
Segment
].
SegmentByteCount
=
ScatterList
[
Segment
].
length
;
sg_dma_len
(
ScatterList
+
Segment
)
;
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
])
{
case
READ_6
:
...
...
@@ -3440,7 +3531,6 @@ int BusLogic_QueueCommand(SCSI_Command_T *Command,
break
;
}
CCB
->
CDB_Length
=
CDB_Length
;
CCB
->
SenseDataLength
=
sizeof
(
Command
->
sense_buffer
);
CCB
->
HostAdapterStatus
=
0
;
CCB
->
TargetDeviceStatus
=
0
;
CCB
->
TargetID
=
TargetID
;
...
...
@@ -3507,7 +3597,11 @@ int BusLogic_QueueCommand(SCSI_Command_T *Command,
}
}
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
;
Command
->
scsi_done
=
CompletionRoutine
;
if
(
BusLogic_MultiMasterHostAdapterP
(
HostAdapter
))
...
...
@@ -3523,9 +3617,11 @@ int BusLogic_QueueCommand(SCSI_Command_T *Command,
if
(
!
BusLogic_WriteOutgoingMailbox
(
HostAdapter
,
BusLogic_MailboxStartCommand
,
CCB
))
{
BusLogic_ReleaseHostAdapterLock
(
HostAdapter
);
BusLogic_Warning
(
"Unable to write Outgoing Mailbox - "
"Pausing for 1 second
\n
"
,
HostAdapter
);
BusLogic_Delay
(
1
);
BusLogic_AcquireHostAdapterLock
(
HostAdapter
);
if
(
!
BusLogic_WriteOutgoingMailbox
(
HostAdapter
,
BusLogic_MailboxStartCommand
,
CCB
))
{
...
...
@@ -3553,11 +3649,6 @@ int BusLogic_QueueCommand(SCSI_Command_T *Command,
if
(
CCB
->
Status
==
BusLogic_CCB_Completed
)
BusLogic_ProcessCompletedCCBs
(
HostAdapter
);
}
/*
Release exclusive access to Host Adapter.
*/
Done:
BusLogic_ReleaseHostAdapterLock
(
HostAdapter
,
&
ProcessorFlags
);
return
0
;
}
...
...
@@ -3571,15 +3662,10 @@ int BusLogic_AbortCommand(SCSI_Command_T *Command)
BusLogic_HostAdapter_T
*
HostAdapter
=
(
BusLogic_HostAdapter_T
*
)
Command
->
host
->
hostdata
;
int
TargetID
=
Command
->
target
;
ProcessorFlags_T
ProcessorFlags
;
BusLogic_CCB_T
*
CCB
;
int
Result
;
BusLogic_IncrementErrorCounter
(
&
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.
*/
...
...
@@ -3587,8 +3673,7 @@ int BusLogic_AbortCommand(SCSI_Command_T *Command)
{
BusLogic_Warning
(
"Unable to Abort Command to Target %d - "
"Already Completed
\n
"
,
HostAdapter
,
TargetID
);
Result
=
SCSI_ABORT_NOT_RUNNING
;
goto
Done
;
return
SCSI_ABORT_NOT_RUNNING
;
}
/*
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)
{
BusLogic_Warning
(
"Unable to Abort Command to Target %d - "
"No CCB Found
\n
"
,
HostAdapter
,
TargetID
);
Result
=
SCSI_ABORT_NOT_RUNNING
;
goto
Done
;
return
SCSI_ABORT_NOT_RUNNING
;
}
else
if
(
CCB
->
Status
==
BusLogic_CCB_Completed
)
{
BusLogic_Warning
(
"Unable to Abort Command to Target %d - "
"CCB Completed
\n
"
,
HostAdapter
,
TargetID
);
Result
=
SCSI_ABORT_NOT_RUNNING
;
goto
Done
;
return
SCSI_ABORT_NOT_RUNNING
;
}
else
if
(
CCB
->
Status
==
BusLogic_CCB_Reset
)
{
BusLogic_Warning
(
"Unable to Abort Command to Target %d - "
"CCB Reset
\n
"
,
HostAdapter
,
TargetID
);
Result
=
SCSI_ABORT_PENDING
;
goto
Done
;
return
SCSI_ABORT_PENDING
;
}
if
(
BusLogic_MultiMasterHostAdapterP
(
HostAdapter
))
{
...
...
@@ -3676,11 +3758,6 @@ int BusLogic_AbortCommand(SCSI_Command_T *Command)
Result
=
SCSI_ABORT_SUCCESS
;
}
}
/*
Release exclusive access to Host Adapter.
*/
Done:
BusLogic_ReleaseHostAdapterLock
(
HostAdapter
,
&
ProcessorFlags
);
return
Result
;
}
...
...
@@ -3694,7 +3771,6 @@ static int BusLogic_ResetHostAdapter(BusLogic_HostAdapter_T *HostAdapter,
SCSI_Command_T
*
Command
,
unsigned
int
ResetFlags
)
{
ProcessorFlags_T
ProcessorFlags
;
BusLogic_CCB_T
*
CCB
;
int
TargetID
,
Result
;
boolean
HardReset
;
...
...
@@ -3715,10 +3791,6 @@ static int BusLogic_ResetHostAdapter(BusLogic_HostAdapter_T *HostAdapter,
.
HostAdapterResetsRequested
);
HardReset
=
true
;
}
/*
Acquire exclusive access to Host Adapter.
*/
BusLogic_AcquireHostAdapterLock
(
HostAdapter
,
&
ProcessorFlags
);
/*
If this is an Asynchronous Reset and this Command has already completed,
then no Reset is necessary.
...
...
@@ -3804,7 +3876,11 @@ static int BusLogic_ResetHostAdapter(BusLogic_HostAdapter_T *HostAdapter,
already been marked Reset and so a reentrant call will return Pending.
*/
if
(
HardReset
)
{
BusLogic_ReleaseHostAdapterLock
(
HostAdapter
);
BusLogic_Delay
(
HostAdapter
->
BusSettleTime
);
BusLogic_AcquireHostAdapterLock
(
HostAdapter
);
}
/*
If this is a Synchronous Reset, perform completion processing for
the Command being Reset.
...
...
@@ -3837,11 +3913,7 @@ static int BusLogic_ResetHostAdapter(BusLogic_HostAdapter_T *HostAdapter,
HostAdapter
->
LastResetCompleted
[
TargetID
]
=
jiffies
;
}
Result
=
SCSI_RESET_SUCCESS
|
SCSI_RESET_HOST_RESET
;
/*
Release exclusive access to Host Adapter.
*/
Done:
BusLogic_ReleaseHostAdapterLock
(
HostAdapter
,
&
ProcessorFlags
);
return
Result
;
}
...
...
@@ -3857,14 +3929,9 @@ static int BusLogic_SendBusDeviceReset(BusLogic_HostAdapter_T *HostAdapter,
{
int
TargetID
=
Command
->
target
;
BusLogic_CCB_T
*
CCB
,
*
XCCB
;
ProcessorFlags_T
ProcessorFlags
;
int
Result
=
-
1
;
BusLogic_IncrementErrorCounter
(
&
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,
then no Reset is necessary.
...
...
@@ -4026,10 +4093,6 @@ static int BusLogic_SendBusDeviceReset(BusLogic_HostAdapter_T *HostAdapter,
Done:
if
(
Result
<
0
)
Result
=
BusLogic_ResetHostAdapter
(
HostAdapter
,
Command
,
ResetFlags
);
/*
Release exclusive access to Host Adapter.
*/
BusLogic_ReleaseHostAdapterLock
(
HostAdapter
,
&
ProcessorFlags
);
return
Result
;
}
...
...
@@ -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
the BIOS, and a warning may be displayed.
*/
int
BusLogic_BIOSDiskParameters
(
SCSI_Disk_T
*
Disk
,
struct
block_device
*
bdev
,
unsigned
char
*
scsi_bios_ptable
(
struct
block_device
*
);
int
BusLogic_BIOSDiskParameters
(
SCSI_Disk_T
*
Disk
,
struct
block_device
*
Device
,
int
*
Parameters
)
{
BusLogic_HostAdapter_T
*
HostAdapter
=
...
...
@@ -4138,7 +4201,7 @@ int BusLogic_BIOSDiskParameters(SCSI_Disk_T *Disk, struct block_device *bdev,
}
DiskParameters
->
Cylinders
=
Disk
->
capacity
/
(
DiskParameters
->
Heads
*
DiskParameters
->
Sectors
);
buf
=
scsi_bios_ptable
(
bdev
);
buf
=
scsi_bios_ptable
(
Device
);
if
(
buf
==
NULL
)
return
0
;
/*
If the boot sector partition table flag is valid, search for a partition
...
...
drivers/scsi/BusLogic.h
View file @
d84cebb6
...
...
@@ -57,7 +57,8 @@ extern int BusLogic_QueueCommand(SCSI_Command_T *,
void
(
*
CompletionRoutine
)(
SCSI_Command_T
*
));
extern
int
BusLogic_AbortCommand
(
SCSI_Command_T
*
);
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
);
...
...
@@ -371,6 +372,7 @@ typedef struct BusLogic_ProbeInfo
BusLogic_HostAdapterBusType_T
HostAdapterBusType
;
BusLogic_IO_Address_T
IO_Address
;
BusLogic_PCI_Address_T
PCI_Address
;
PCI_Device_T
*
PCI_Device
;
unsigned
char
Bus
;
unsigned
char
Device
;
unsigned
char
IRQ_Channel
;
...
...
@@ -1191,7 +1193,9 @@ typedef struct BusLogic_CCB
/*
BusLogic Linux Driver Defined Portion.
*/
boolean
AllocationGroupHead
;
dma_addr_t
AllocationGroupHead
;
unsigned
int
AllocationGroupSize
;
BusLogic_BusAddress_T
DMA_Handle
;
BusLogic_CCB_Status_T
Status
;
unsigned
long
SerialNumber
;
SCSI_Command_T
*
Command
;
...
...
@@ -1355,6 +1359,7 @@ FlashPoint_Info_T;
typedef
struct
BusLogic_HostAdapter
{
SCSI_Host_T
*
SCSI_Host
;
PCI_Device_T
*
PCI_Device
;
BusLogic_HostAdapterType_T
HostAdapterType
;
BusLogic_HostAdapterBusType_T
HostAdapterBusType
;
BusLogic_IO_Address_T
IO_Address
;
...
...
@@ -1443,9 +1448,13 @@ typedef struct BusLogic_HostAdapter
BusLogic_IncomingMailbox_T
*
LastIncomingMailbox
;
BusLogic_IncomingMailbox_T
*
NextIncomingMailbox
;
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_IncomingMailbox_T
))];
+ sizeof(BusLogic_IncomingMailbox_T))];
*/
char
MessageBuffer
[
BusLogic_MessageBufferSize
];
}
BusLogic_HostAdapter_T
;
...
...
@@ -1504,9 +1513,9 @@ SCSI_Inquiry_T;
*/
static
inline
void
BusLogic_AcquireHostAdapterLock
(
BusLogic_HostAdapter_T
*
HostAdapter
,
ProcessorFlags_T
*
ProcessorFlags
)
void
BusLogic_AcquireHostAdapterLock
(
BusLogic_HostAdapter_T
*
HostAdapter
)
{
spin_lock_irq
(
HostAdapter
->
SCSI_Host
->
host_lock
);
}
...
...
@@ -1515,9 +1524,9 @@ void BusLogic_AcquireHostAdapterLock(BusLogic_HostAdapter_T *HostAdapter,
*/
static
inline
void
BusLogic_ReleaseHostAdapterLock
(
BusLogic_HostAdapter_T
*
HostAdapter
,
ProcessorFlags_T
*
ProcessorFlags
)
void
BusLogic_ReleaseHostAdapterLock
(
BusLogic_HostAdapter_T
*
HostAdapter
)
{
spin_unlock_irq
(
HostAdapter
->
SCSI_Host
->
host_lock
);
}
...
...
@@ -1648,12 +1657,7 @@ void BusLogic_StartMailboxCommand(BusLogic_HostAdapter_T *HostAdapter)
static
inline
void
BusLogic_Delay
(
int
Seconds
)
{
int
Milliseconds
=
1000
*
Seconds
;
unsigned
long
ProcessorFlags
;
save_flags
(
ProcessorFlags
);
sti
();
while
(
--
Milliseconds
>=
0
)
udelay
(
1000
);
restore_flags
(
ProcessorFlags
);
mdelay
(
1000
*
Seconds
);
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment