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
f4e7ddb6
Commit
f4e7ddb6
authored
Jun 26, 2004
by
Guennadi Liakhovetski
Committed by
James Bottomley
Jun 26, 2004
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
[PATCH] kill obsolete typedefs and wrappers from tmscsim
Signed-off-by:
James Bottomley
<
James.Bottomley@SteelEye.com
>
parent
f51608c8
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
462 additions
and
554 deletions
+462
-554
drivers/scsi/scsiiom.c
drivers/scsi/scsiiom.c
+153
-154
drivers/scsi/tmscsim.c
drivers/scsi/tmscsim.c
+196
-239
drivers/scsi/tmscsim.h
drivers/scsi/tmscsim.h
+113
-161
No files found.
drivers/scsi/scsiiom.c
View file @
f4e7ddb6
...
...
@@ -6,7 +6,7 @@
***********************************************************************/
/* $Id: scsiiom.c,v 2.55.2.17 2000/12/20 00:39:37 garloff Exp $ */
static
void
__inline__
dc390_freetag
(
PDCB
pDCB
,
PSRB
pSRB
)
dc390_freetag
(
struct
dc390_dcb
*
pDCB
,
struct
dc390_srb
*
pSRB
)
{
if
(
pSRB
->
TagNumber
<
255
)
{
pDCB
->
TagMask
&=
~
(
1
<<
pSRB
->
TagNumber
);
/* free tag mask */
...
...
@@ -15,10 +15,10 @@ dc390_freetag (PDCB pDCB, PSRB pSRB)
}
static
UCHAR
dc390_StartSCSI
(
PACB
pACB
,
PDCB
pDCB
,
PSRB
pSRB
)
static
u8
dc390_StartSCSI
(
struct
dc390_acb
*
pACB
,
struct
dc390_dcb
*
pDCB
,
struct
dc390_srb
*
pSRB
)
{
UCHAR
cmd
;
UCHAR
disc_allowed
,
try_sync_nego
;
u8
cmd
;
u8
disc_allowed
,
try_sync_nego
;
pSRB
->
ScsiPhase
=
SCSI_NOP0
;
...
...
@@ -69,7 +69,7 @@ dc390_StartSCSI( PACB pACB, PDCB pDCB, PSRB pSRB )
/* Change 99/05/31: Don't use tags when not disconnecting (BUSY) */
if
((
pDCB
->
SyncMode
&
EN_TAG_QUEUEING
)
&&
disc_allowed
)
{
UCHAR
tag_no
=
0
;
u8
tag_no
=
0
;
while
((
1
<<
tag_no
)
&
pDCB
->
TagMask
)
tag_no
++
;
if
(
tag_no
>=
sizeof
(
pDCB
->
TagMask
)
*
8
||
tag_no
>=
pDCB
->
MaxCommand
)
{
printk
(
KERN_WARNING
"DC390: Out of tags for Dev. %02x %02x
\n
"
,
pDCB
->
TargetID
,
pDCB
->
TargetLUN
);
...
...
@@ -92,7 +92,7 @@ dc390_StartSCSI( PACB pACB, PDCB pDCB, PSRB pSRB )
if
(
try_sync_nego
)
{
UCHAR
Sync_Off
=
pDCB
->
SyncOffset
;
u8
Sync_Off
=
pDCB
->
SyncOffset
;
DEBUG0
(
printk
(
KERN_INFO
"DC390: NEW Sync Nego code triggered (%i %i)
\n
"
,
pDCB
->
TargetID
,
pDCB
->
TargetLUN
));
pSRB
->
MsgOutBuf
[
0
]
=
EXTENDED_MESSAGE
;
pSRB
->
MsgOutBuf
[
1
]
=
3
;
...
...
@@ -121,8 +121,8 @@ dc390_StartSCSI( PACB pACB, PDCB pDCB, PSRB pSRB )
}
else
/* write cmnd to bus */
{
PUCHAR
ptr
;
UCHAR
i
;
ptr
=
(
PUCHAR
)
pSRB
->
pcmd
->
cmnd
;
u8
*
ptr
;
u8
i
;
ptr
=
(
u8
*
)
pSRB
->
pcmd
->
cmnd
;
for
(
i
=
0
;
i
<
pSRB
->
pcmd
->
cmd_len
;
i
++
)
DC390_write8
(
ScsiFifo
,
*
(
ptr
++
));
}
...
...
@@ -154,18 +154,17 @@ dc390_StartSCSI( PACB pACB, PDCB pDCB, PSRB pSRB )
#if DMA_INT
/* This is similar to AM53C974.c ... */
static
UCHAR
dc390_dma_intr
(
PACB
pACB
)
static
u8
dc390_dma_intr
(
struct
dc390_acb
*
pACB
)
{
PSRB
pSRB
;
UCHAR
dstate
;
DEBUG0
(
USHORT
pstate
;
PDEVDECL1
);
struct
dc390_srb
*
pSRB
;
u8
dstate
;
DEBUG0
(
u16
pstate
;
struct
pci_dev
*
pdev
=
pACB
->
pdev
);
DEBUG0
(
PDEVSET1
);
DEBUG0
(
PCI_READ_CONFIG_WORD
(
PDEV
,
PCI_STATUS
,
&
pstate
));
DEBUG0
(
pci_read_config_word
(
pdev
,
PCI_STATUS
,
&
pstate
));
DEBUG0
(
if
(
pstate
&
(
PCI_STATUS_SIG_SYSTEM_ERROR
|
PCI_STATUS_DETECTED_PARITY
))
\
{
printk
(
KERN_WARNING
"DC390: PCI state = %04x!
\n
"
,
pstate
);
\
PCI_WRITE_CONFIG_WORD
(
PDEV
,
PCI_STATUS
,
(
PCI_STATUS_SIG_SYSTEM_ERROR
|
PCI_STATUS_DETECTED_PARITY
));});
pci_write_config_word
(
pdev
,
PCI_STATUS
,
(
PCI_STATUS_SIG_SYSTEM_ERROR
|
PCI_STATUS_DETECTED_PARITY
));});
dstate
=
DC390_read8
(
DMA_Status
);
...
...
@@ -179,7 +178,7 @@ dc390_dma_intr (PACB pACB)
}
if
(
dstate
&
DMA_XFER_DONE
)
{
UINT
residual
,
xferCnt
;
int
ctr
=
6000000
;
u32
residual
,
xferCnt
;
int
ctr
=
6000000
;
if
(
!
(
DC390_read8
(
DMA_Cmd
)
&
READ_DIRECTION
))
{
do
...
...
@@ -217,18 +216,18 @@ dc390_dma_intr (PACB pACB)
static
irqreturn_t
__inline__
DC390_Interrupt
(
int
irq
,
void
*
dev_id
,
struct
pt_regs
*
regs
)
{
PACB
pACB
,
pACB2
;
PDCB
pDCB
;
PSRB
pSRB
;
UCHAR
sstatus
=
0
;
UCHAR
phase
;
void
(
*
stateV
)(
PACB
,
PSRB
,
PUCHAR
);
UCHAR
istate
,
istatus
;
struct
dc390_acb
*
pACB
,
*
pACB2
;
struct
dc390_dcb
*
pDCB
;
struct
dc390_srb
*
pSRB
;
u8
sstatus
=
0
;
u8
phase
;
void
(
*
stateV
)(
struct
dc390_acb
*
,
struct
dc390_srb
*
,
u8
*
);
u8
istate
,
istatus
;
#if DMA_INT
UCHAR
dstatus
;
u8
dstatus
;
#endif
pACB
=
(
PACB
)
dev_id
;
pACB
=
(
struct
dc390_acb
*
)
dev_id
;
for
(
pACB2
=
dc390_pACB_start
;
(
pACB2
&&
pACB2
!=
pACB
);
pACB2
=
pACB2
->
pNextACB
);
if
(
!
pACB2
)
{
...
...
@@ -323,7 +322,7 @@ DC390_Interrupt( int irq, void *dev_id, struct pt_regs *regs)
(
*
stateV
)(
pACB
,
pSRB
,
&
sstatus
);
pSRB
->
ScsiPhase
=
sstatus
&
7
;
phase
=
(
UCHAR
)
sstatus
&
7
;
phase
=
(
u8
)
sstatus
&
7
;
DEBUG1
(
printk
(
KERN_INFO
"DC390: [%i]%s(1) (%02x)
\n
"
,
phase
,
dc390_p1_str
[
phase
],
sstatus
));
stateV
=
(
void
*
)
dc390_phase1
[
phase
];
(
*
stateV
)(
pACB
,
pSRB
,
&
sstatus
);
...
...
@@ -345,12 +344,12 @@ static irqreturn_t do_DC390_Interrupt( int irq, void *dev_id, struct pt_regs *re
}
static
void
dc390_DataOut_0
(
PACB
pACB
,
PSRB
pSRB
,
PUCHAR
psstatus
)
dc390_DataOut_0
(
struct
dc390_acb
*
pACB
,
struct
dc390_srb
*
pSRB
,
u8
*
psstatus
)
{
UCHAR
sstatus
;
PSGL
psgl
;
UINT
ResidCnt
,
xferCnt
;
UCHAR
dstate
=
0
;
u8
sstatus
;
struct
scatterlist
*
psgl
;
u32
ResidCnt
,
xferCnt
;
u8
dstate
=
0
;
sstatus
=
*
psstatus
;
...
...
@@ -390,10 +389,10 @@ dc390_DataOut_0( PACB pACB, PSRB pSRB, PUCHAR psstatus)
}
else
{
ResidCnt
=
(
UINT
)
DC390_read8
(
Current_Fifo
)
&
0x1f
;
ResidCnt
|=
(
UINT
)
DC390_read8
(
CtcReg_High
)
<<
16
;
ResidCnt
|=
(
UINT
)
DC390_read8
(
CtcReg_Mid
)
<<
8
;
ResidCnt
+=
(
UINT
)
DC390_read8
(
CtcReg_Low
);
ResidCnt
=
(
u32
)
DC390_read8
(
Current_Fifo
)
&
0x1f
;
ResidCnt
|=
(
u32
)
DC390_read8
(
CtcReg_High
)
<<
16
;
ResidCnt
|=
(
u32
)
DC390_read8
(
CtcReg_Mid
)
<<
8
;
ResidCnt
+=
(
u32
)
DC390_read8
(
CtcReg_Low
);
xferCnt
=
pSRB
->
SGToBeXferLen
-
ResidCnt
;
pSRB
->
SGBusAddr
+=
xferCnt
;
...
...
@@ -409,13 +408,13 @@ dc390_DataOut_0( PACB pACB, PSRB pSRB, PUCHAR psstatus)
}
static
void
dc390_DataIn_0
(
PACB
pACB
,
PSRB
pSRB
,
PUCHAR
psstatus
)
dc390_DataIn_0
(
struct
dc390_acb
*
pACB
,
struct
dc390_srb
*
pSRB
,
u8
*
psstatus
)
{
UCHAR
sstatus
,
residual
,
bval
;
PSGL
psgl
;
UINT
ResidCnt
,
i
;
ULONG
xferCnt
;
PUCHAR
ptr
;
u8
sstatus
,
residual
,
bval
;
struct
scatterlist
*
psgl
;
u32
ResidCnt
,
i
;
unsigned
long
xferCnt
;
u8
*
ptr
;
sstatus
=
*
psstatus
;
...
...
@@ -443,9 +442,9 @@ dc390_DataIn_0( PACB pACB, PSRB pSRB, PUCHAR psstatus)
}
dc390_laststatus
&=
~
0xff000000
;
dc390_laststatus
|=
dstate
<<
24
;
DEBUG1
(
ResidCnt
=
((
ULONG
)
DC390_read8
(
CtcReg_High
)
<<
16
)
\
+
((
ULONG
)
DC390_read8
(
CtcReg_Mid
)
<<
8
)
\
+
((
ULONG
)
DC390_read8
(
CtcReg_Low
)));
DEBUG1
(
ResidCnt
=
((
unsigned
long
)
DC390_read8
(
CtcReg_High
)
<<
16
)
\
+
((
unsigned
long
)
DC390_read8
(
CtcReg_Mid
)
<<
8
)
\
+
((
unsigned
long
)
DC390_read8
(
CtcReg_Low
)));
DEBUG1
(
printk
(
KERN_DEBUG
"Count_2_Zero (ResidCnt=%i,ToBeXfer=%li),"
,
ResidCnt
,
pSRB
->
SGToBeXferLen
));
DC390_write8
(
DMA_Cmd
,
READ_DIRECTION
+
DMA_IDLE_CMD
);
/* | DMA_INT */
...
...
@@ -501,11 +500,11 @@ dc390_DataIn_0( PACB pACB, PSRB pSRB, PUCHAR psstatus)
dc390_laststatus
&=
~
0xff000000
;
dc390_laststatus
|=
bval
<<
24
;
DEBUG1
(
printk
(
KERN_DEBUG
"Blast: Read %i times DMA_Status %02x"
,
0xa000
-
i
,
bval
));
ResidCnt
=
(
UINT
)
DC390_read8
(
CtcReg_High
);
ResidCnt
=
(
u32
)
DC390_read8
(
CtcReg_High
);
ResidCnt
<<=
8
;
ResidCnt
|=
(
UINT
)
DC390_read8
(
CtcReg_Mid
);
ResidCnt
|=
(
u32
)
DC390_read8
(
CtcReg_Mid
);
ResidCnt
<<=
8
;
ResidCnt
|=
(
UINT
)
DC390_read8
(
CtcReg_Low
);
ResidCnt
|=
(
u32
)
DC390_read8
(
CtcReg_Low
);
xferCnt
=
pSRB
->
SGToBeXferLen
-
ResidCnt
;
pSRB
->
SGBusAddr
+=
xferCnt
;
...
...
@@ -515,7 +514,7 @@ dc390_DataIn_0( PACB pACB, PSRB pSRB, PUCHAR psstatus)
if
(
residual
)
{
bval
=
DC390_read8
(
ScsiFifo
);
/* get one residual byte */
ptr
=
(
PUCHAR
)
bus_to_virt
(
pSRB
->
SGBusAddr
);
ptr
=
(
u8
*
)
bus_to_virt
(
pSRB
->
SGBusAddr
);
*
ptr
=
bval
;
pSRB
->
SGBusAddr
++
;
xferCnt
++
;
pSRB
->
TotalXferredLen
++
;
...
...
@@ -534,12 +533,12 @@ dc390_DataIn_0( PACB pACB, PSRB pSRB, PUCHAR psstatus)
}
static
void
dc390_Command_0
(
PACB
pACB
,
PSRB
pSRB
,
PUCHAR
psstatus
)
dc390_Command_0
(
struct
dc390_acb
*
pACB
,
struct
dc390_srb
*
pSRB
,
u8
*
psstatus
)
{
}
static
void
dc390_Status_0
(
PACB
pACB
,
PSRB
pSRB
,
PUCHAR
psstatus
)
dc390_Status_0
(
struct
dc390_acb
*
pACB
,
struct
dc390_srb
*
pSRB
,
u8
*
psstatus
)
{
pSRB
->
TargetStatus
=
DC390_read8
(
ScsiFifo
);
...
...
@@ -552,7 +551,7 @@ dc390_Status_0( PACB pACB, PSRB pSRB, PUCHAR psstatus)
}
static
void
dc390_MsgOut_0
(
PACB
pACB
,
PSRB
pSRB
,
PUCHAR
psstatus
)
dc390_MsgOut_0
(
struct
dc390_acb
*
pACB
,
struct
dc390_srb
*
pSRB
,
u8
*
psstatus
)
{
if
(
pSRB
->
SRBState
&
(
SRB_UNEXPECT_RESEL
+
SRB_ABORT_SENT
)
)
*
psstatus
=
SCSI_NOP0
;
...
...
@@ -561,7 +560,7 @@ dc390_MsgOut_0( PACB pACB, PSRB pSRB, PUCHAR psstatus)
static
void
__inline__
dc390_reprog
(
PACB
pACB
,
PDCB
pDCB
)
dc390_reprog
(
struct
dc390_acb
*
pACB
,
struct
dc390_dcb
*
pDCB
)
{
DC390_write8
(
Sync_Period
,
pDCB
->
SyncPeriod
);
DC390_write8
(
Sync_Offset
,
pDCB
->
SyncOffset
);
...
...
@@ -573,7 +572,7 @@ dc390_reprog (PACB pACB, PDCB pDCB)
#ifdef DC390_DEBUG0
static
void
dc390_printMsg
(
UCHAR
*
MsgBuf
,
UCHAR
len
)
dc390_printMsg
(
u8
*
MsgBuf
,
u8
len
)
{
int
i
;
printk
(
" %02x"
,
MsgBuf
[
0
]);
...
...
@@ -587,7 +586,7 @@ dc390_printMsg (UCHAR *MsgBuf, UCHAR len)
/* reject_msg */
static
void
__inline__
dc390_MsgIn_reject
(
PACB
pACB
,
PSRB
pSRB
)
dc390_MsgIn_reject
(
struct
dc390_acb
*
pACB
,
struct
dc390_srb
*
pSRB
)
{
pSRB
->
MsgOutBuf
[
0
]
=
MESSAGE_REJECT
;
pSRB
->
MsgCnt
=
1
;
DC390_ENABLE_MSGOUT
;
...
...
@@ -596,18 +595,18 @@ dc390_MsgIn_reject (PACB pACB, PSRB pSRB)
/* abort command */
static
void
__inline__
dc390_EnableMsgOut_Abort
(
PACB
pACB
,
PSRB
pSRB
)
dc390_EnableMsgOut_Abort
(
struct
dc390_acb
*
pACB
,
struct
dc390_srb
*
pSRB
)
{
pSRB
->
MsgOutBuf
[
0
]
=
ABORT
;
pSRB
->
MsgCnt
=
1
;
DC390_ENABLE_MSGOUT
;
pSRB
->
pSRBDCB
->
DCBFlag
&=
~
ABORT_DEV_
;
}
static
PSRB
dc390_MsgIn_QTag
(
PACB
pACB
,
PDCB
pDCB
,
UCHAR
tag
)
static
struct
dc390_srb
*
dc390_MsgIn_QTag
(
struct
dc390_acb
*
pACB
,
struct
dc390_dcb
*
pDCB
,
u8
tag
)
{
PSRB
lastSRB
=
pDCB
->
pGoingLast
;
PSRB
pSRB
=
pDCB
->
pGoingSRB
;
struct
dc390_srb
*
lastSRB
=
pDCB
->
pGoingLast
;
struct
dc390_srb
*
pSRB
=
pDCB
->
pGoingSRB
;
if
(
pSRB
)
{
...
...
@@ -645,9 +644,9 @@ dc390_MsgIn_QTag (PACB pACB, PDCB pDCB, UCHAR tag)
/* set async transfer mode */
static
void
dc390_MsgIn_set_async
(
PACB
pACB
,
PSRB
pSRB
)
dc390_MsgIn_set_async
(
struct
dc390_acb
*
pACB
,
struct
dc390_srb
*
pSRB
)
{
PDCB
pDCB
=
pSRB
->
pSRBDCB
;
struct
dc390_dcb
*
pDCB
=
pSRB
->
pSRBDCB
;
if
(
!
(
pSRB
->
SRBState
&
DO_SYNC_NEGO
))
printk
(
KERN_INFO
"DC390: Target %i initiates Non-Sync?
\n
"
,
pDCB
->
TargetID
);
pSRB
->
SRBState
&=
~
DO_SYNC_NEGO
;
...
...
@@ -663,13 +662,13 @@ dc390_MsgIn_set_async (PACB pACB, PSRB pSRB)
/* set sync transfer mode */
static
void
dc390_MsgIn_set_sync
(
PACB
pACB
,
PSRB
pSRB
)
dc390_MsgIn_set_sync
(
struct
dc390_acb
*
pACB
,
struct
dc390_srb
*
pSRB
)
{
UCHAR
bval
;
USHORT
wval
,
wval1
;
PDCB
pDCB
=
pSRB
->
pSRBDCB
;
UCHAR
oldsyncperiod
=
pDCB
->
SyncPeriod
;
UCHAR
oldsyncoffset
=
pDCB
->
SyncOffset
;
u8
bval
;
u16
wval
,
wval1
;
struct
dc390_dcb
*
pDCB
=
pSRB
->
pSRBDCB
;
u8
oldsyncperiod
=
pDCB
->
SyncPeriod
;
u8
oldsyncoffset
=
pDCB
->
SyncOffset
;
if
(
!
(
pSRB
->
SRBState
&
DO_SYNC_NEGO
))
{
...
...
@@ -702,7 +701,7 @@ dc390_MsgIn_set_sync (PACB pACB, PSRB pSRB)
pDCB
->
SyncOffset
|=
pSRB
->
MsgInBuf
[
4
];
pDCB
->
NegoPeriod
=
pSRB
->
MsgInBuf
[
3
];
wval
=
(
USHORT
)
pSRB
->
MsgInBuf
[
3
];
wval
=
(
u16
)
pSRB
->
MsgInBuf
[
3
];
wval
=
wval
<<
2
;
wval
-=
3
;
wval1
=
wval
/
25
;
/* compute speed */
if
(
(
wval1
*
25
)
!=
wval
)
wval1
++
;
bval
=
FAST_CLK
+
FAST_SCSI
;
/* fast clock / fast scsi */
...
...
@@ -722,7 +721,7 @@ dc390_MsgIn_set_sync (PACB pACB, PSRB pSRB)
}
pDCB
->
CtrlR3
=
bval
;
pDCB
->
SyncPeriod
=
(
UCHAR
)
wval1
;
pDCB
->
SyncPeriod
=
(
u8
)
wval1
;
if
((
oldsyncperiod
!=
wval1
||
oldsyncoffset
!=
pDCB
->
SyncOffset
)
&&
pDCB
->
TargetLUN
==
0
)
{
...
...
@@ -738,20 +737,20 @@ dc390_MsgIn_set_sync (PACB pACB, PSRB pSRB)
/* handle RESTORE_PTR */
/* I presume, this command is already mapped, so, have to remap. */
static
void
dc390_restore_ptr
(
PACB
pACB
,
PSRB
pSRB
)
dc390_restore_ptr
(
struct
dc390_acb
*
pACB
,
struct
dc390_srb
*
pSRB
)
{
Scsi_Cmnd
*
pcmd
=
pSRB
->
pcmd
;
PSGL
psgl
;
struct
scsi_cmnd
*
pcmd
=
pSRB
->
pcmd
;
struct
scatterlist
*
psgl
;
pSRB
->
TotalXferredLen
=
0
;
pSRB
->
SGIndex
=
0
;
if
(
pcmd
->
use_sg
)
{
pSRB
->
pSegmentList
=
(
PSGL
)
pcmd
->
request_buffer
;
pSRB
->
pSegmentList
=
(
struct
scatterlist
*
)
pcmd
->
request_buffer
;
psgl
=
pSRB
->
pSegmentList
;
//dc390_pci_sync(pSRB);
while
(
pSRB
->
TotalXferredLen
+
(
ULONG
)
sg_dma_len
(
psgl
)
<
pSRB
->
Saved_Ptr
)
while
(
pSRB
->
TotalXferredLen
+
(
unsigned
long
)
sg_dma_len
(
psgl
)
<
pSRB
->
Saved_Ptr
)
{
pSRB
->
TotalXferredLen
+=
(
ULONG
)
sg_dma_len
(
psgl
);
pSRB
->
TotalXferredLen
+=
(
unsigned
long
)
sg_dma_len
(
psgl
);
pSRB
->
SGIndex
++
;
if
(
pSRB
->
SGIndex
<
pSRB
->
SGcount
)
{
...
...
@@ -773,7 +772,7 @@ dc390_restore_ptr (PACB pACB, PSRB pSRB)
sg_dma_len
(
&
pSRB
->
Segmentx
)
=
pcmd
->
request_bufflen
-
pSRB
->
Saved_Ptr
;
pSRB
->
SGcount
=
1
;
pSRB
->
pSegmentList
=
(
PSGL
)
&
pSRB
->
Segmentx
;
pSRB
->
pSegmentList
=
(
struct
scatterlist
*
)
&
pSRB
->
Segmentx
;
}
else
{
pSRB
->
SGcount
=
0
;
printk
(
KERN_INFO
"DC390: RESTORE_PTR message for Transfer without Scatter-Gather ??
\n
"
);
...
...
@@ -792,8 +791,8 @@ dc390_restore_ptr (PACB pACB, PSRB pSRB)
/* The old implementation was correct. Sigh! */
/* Check if the message is complete */
static
UCHAR
__inline__
dc390_MsgIn_complete
(
UCHAR
*
msgbuf
,
UINT
len
)
static
u8
__inline__
dc390_MsgIn_complete
(
u8
*
msgbuf
,
u32
len
)
{
if
(
*
msgbuf
==
EXTENDED_MESSAGE
)
{
...
...
@@ -809,9 +808,9 @@ dc390_MsgIn_complete (UCHAR *msgbuf, UINT len)
/* read and eval received messages */
static
void
dc390_MsgIn_0
(
PACB
pACB
,
PSRB
pSRB
,
PUCHAR
psstatus
)
dc390_MsgIn_0
(
struct
dc390_acb
*
pACB
,
struct
dc390_srb
*
pSRB
,
u8
*
psstatus
)
{
PDCB
pDCB
=
pACB
->
pActiveDCB
;
struct
dc390_dcb
*
pDCB
=
pACB
->
pActiveDCB
;
/* Read the msg */
...
...
@@ -856,7 +855,7 @@ dc390_MsgIn_0( PACB pACB, PSRB pSRB, PUCHAR psstatus)
// nothing has to be done
case
COMMAND_COMPLETE
:
break
;
// SAVE POINTER may be ignored as we have the
PSRB
associated with the
// SAVE POINTER may be ignored as we have the
struct dc390_srb*
associated with the
// scsi command. Thanks, Gerard, for pointing it out.
case
SAVE_POINTERS
:
pSRB
->
Saved_Ptr
=
pSRB
->
TotalXferredLen
;
...
...
@@ -883,11 +882,11 @@ dc390_MsgIn_0( PACB pACB, PSRB pSRB, PUCHAR psstatus)
static
void
dc390_DataIO_Comm
(
PACB
pACB
,
PSRB
pSRB
,
UCHAR
ioDir
)
dc390_DataIO_Comm
(
struct
dc390_acb
*
pACB
,
struct
dc390_srb
*
pSRB
,
u8
ioDir
)
{
PSGL
psgl
;
ULONG
lval
;
PDCB
pDCB
=
pACB
->
pActiveDCB
;
struct
scatterlist
*
psgl
;
unsigned
long
lval
;
struct
dc390_dcb
*
pDCB
=
pACB
->
pActiveDCB
;
if
(
pSRB
==
pACB
->
pTmpSRB
)
{
...
...
@@ -913,11 +912,11 @@ dc390_DataIO_Comm( PACB pACB, PSRB pSRB, UCHAR ioDir)
}
lval
=
pSRB
->
SGToBeXferLen
;
DEBUG1
(
printk
(
KERN_DEBUG
" DC390: Start transfer: %li bytes (address %08lx)
\n
"
,
lval
,
pSRB
->
SGBusAddr
));
DC390_write8
(
CtcReg_Low
,
(
UCHAR
)
lval
);
DC390_write8
(
CtcReg_Low
,
(
u8
)
lval
);
lval
>>=
8
;
DC390_write8
(
CtcReg_Mid
,
(
UCHAR
)
lval
);
DC390_write8
(
CtcReg_Mid
,
(
u8
)
lval
);
lval
>>=
8
;
DC390_write8
(
CtcReg_High
,
(
UCHAR
)
lval
);
DC390_write8
(
CtcReg_High
,
(
u8
)
lval
);
DC390_write32
(
DMA_XferCnt
,
pSRB
->
SGToBeXferLen
);
DC390_write32
(
DMA_XferAddr
,
pSRB
->
SGBusAddr
);
...
...
@@ -956,36 +955,36 @@ dc390_DataIO_Comm( PACB pACB, PSRB pSRB, UCHAR ioDir)
static
void
dc390_DataOutPhase
(
PACB
pACB
,
PSRB
pSRB
,
PUCHAR
psstatus
)
dc390_DataOutPhase
(
struct
dc390_acb
*
pACB
,
struct
dc390_srb
*
pSRB
,
u8
*
psstatus
)
{
dc390_DataIO_Comm
(
pACB
,
pSRB
,
WRITE_DIRECTION
);
}
static
void
dc390_DataInPhase
(
PACB
pACB
,
PSRB
pSRB
,
PUCHAR
psstatus
)
dc390_DataInPhase
(
struct
dc390_acb
*
pACB
,
struct
dc390_srb
*
pSRB
,
u8
*
psstatus
)
{
dc390_DataIO_Comm
(
pACB
,
pSRB
,
READ_DIRECTION
);
}
static
void
dc390_CommandPhase
(
PACB
pACB
,
PSRB
pSRB
,
PUCHAR
psstatus
)
dc390_CommandPhase
(
struct
dc390_acb
*
pACB
,
struct
dc390_srb
*
pSRB
,
u8
*
psstatus
)
{
PDCB
pDCB
;
UCHAR
i
,
cnt
;
PUCHAR
ptr
;
struct
dc390_dcb
*
pDCB
;
u8
i
,
cnt
;
u8
*
ptr
;
DC390_write8
(
ScsiCmd
,
RESET_ATN_CMD
);
DC390_write8
(
ScsiCmd
,
CLEAR_FIFO_CMD
);
if
(
!
(
pSRB
->
SRBFlag
&
AUTO_REQSENSE
)
)
{
cnt
=
(
UCHAR
)
pSRB
->
pcmd
->
cmd_len
;
ptr
=
(
PUCHAR
)
pSRB
->
pcmd
->
cmnd
;
cnt
=
(
u8
)
pSRB
->
pcmd
->
cmd_len
;
ptr
=
(
u8
*
)
pSRB
->
pcmd
->
cmnd
;
for
(
i
=
0
;
i
<
cnt
;
i
++
)
DC390_write8
(
ScsiFifo
,
*
(
ptr
++
));
}
else
{
UCHAR
bval
=
0
;
u8
bval
=
0
;
DC390_write8
(
ScsiFifo
,
REQUEST_SENSE
);
pDCB
=
pACB
->
pActiveDCB
;
DC390_write8
(
ScsiFifo
,
pDCB
->
TargetLUN
<<
5
);
...
...
@@ -1000,7 +999,7 @@ dc390_CommandPhase( PACB pACB, PSRB pSRB, PUCHAR psstatus)
}
static
void
dc390_StatusPhase
(
PACB
pACB
,
PSRB
pSRB
,
PUCHAR
psstatus
)
dc390_StatusPhase
(
struct
dc390_acb
*
pACB
,
struct
dc390_srb
*
pSRB
,
u8
*
psstatus
)
{
DC390_write8
(
ScsiCmd
,
CLEAR_FIFO_CMD
);
pSRB
->
SRBState
=
SRB_STATUS
;
...
...
@@ -1009,11 +1008,11 @@ dc390_StatusPhase( PACB pACB, PSRB pSRB, PUCHAR psstatus)
}
static
void
dc390_MsgOutPhase
(
PACB
pACB
,
PSRB
pSRB
,
PUCHAR
psstatus
)
dc390_MsgOutPhase
(
struct
dc390_acb
*
pACB
,
struct
dc390_srb
*
pSRB
,
u8
*
psstatus
)
{
UCHAR
bval
,
i
,
cnt
;
PUCHAR
ptr
;
PDCB
pDCB
;
u8
bval
,
i
,
cnt
;
u8
*
ptr
;
struct
dc390_dcb
*
pDCB
;
DC390_write8
(
ScsiCmd
,
CLEAR_FIFO_CMD
);
pDCB
=
pACB
->
pActiveDCB
;
...
...
@@ -1022,7 +1021,7 @@ dc390_MsgOutPhase( PACB pACB, PSRB pSRB, PUCHAR psstatus)
cnt
=
pSRB
->
MsgCnt
;
if
(
cnt
)
{
ptr
=
(
PUCHAR
)
pSRB
->
MsgOutBuf
;
ptr
=
(
u8
*
)
pSRB
->
MsgOutBuf
;
for
(
i
=
0
;
i
<
cnt
;
i
++
)
DC390_write8
(
ScsiFifo
,
*
(
ptr
++
));
pSRB
->
MsgCnt
=
0
;
...
...
@@ -1062,7 +1061,7 @@ dc390_MsgOutPhase( PACB pACB, PSRB pSRB, PUCHAR psstatus)
}
static
void
dc390_MsgInPhase
(
PACB
pACB
,
PSRB
pSRB
,
PUCHAR
psstatus
)
dc390_MsgInPhase
(
struct
dc390_acb
*
pACB
,
struct
dc390_srb
*
pSRB
,
u8
*
psstatus
)
{
DC390_write8
(
ScsiCmd
,
CLEAR_FIFO_CMD
);
if
(
!
(
pSRB
->
SRBState
&
SRB_MSGIN
)
)
...
...
@@ -1075,21 +1074,21 @@ dc390_MsgInPhase( PACB pACB, PSRB pSRB, PUCHAR psstatus)
}
static
void
dc390_Nop_0
(
PACB
pACB
,
PSRB
pSRB
,
PUCHAR
psstatus
)
dc390_Nop_0
(
struct
dc390_acb
*
pACB
,
struct
dc390_srb
*
pSRB
,
u8
*
psstatus
)
{
}
static
void
dc390_Nop_1
(
PACB
pACB
,
PSRB
pSRB
,
PUCHAR
psstatus
)
dc390_Nop_1
(
struct
dc390_acb
*
pACB
,
struct
dc390_srb
*
pSRB
,
u8
*
psstatus
)
{
}
static
void
dc390_SetXferRate
(
PACB
pACB
,
PDCB
pDCB
)
dc390_SetXferRate
(
struct
dc390_acb
*
pACB
,
struct
dc390_dcb
*
pDCB
)
{
UCHAR
bval
,
i
,
cnt
;
PDCB
ptr
;
u8
bval
,
i
,
cnt
;
struct
dc390_dcb
*
ptr
;
if
(
!
(
pDCB
->
TargetLUN
)
)
{
...
...
@@ -1117,11 +1116,11 @@ dc390_SetXferRate( PACB pACB, PDCB pDCB )
static
void
dc390_Disconnect
(
PACB
pACB
)
dc390_Disconnect
(
struct
dc390_acb
*
pACB
)
{
PDCB
pDCB
;
PSRB
pSRB
,
psrb
;
UCHAR
i
,
cnt
;
struct
dc390_dcb
*
pDCB
;
struct
dc390_srb
*
pSRB
,
*
psrb
;
u8
i
,
cnt
;
DEBUG0
(
printk
(
KERN_INFO
"DISC,"
));
...
...
@@ -1198,11 +1197,11 @@ dc390_Disconnect( PACB pACB )
static
void
dc390_Reselect
(
PACB
pACB
)
dc390_Reselect
(
struct
dc390_acb
*
pACB
)
{
PDCB
pDCB
;
PSRB
pSRB
;
UCHAR
id
,
lun
;
struct
dc390_dcb
*
pDCB
;
struct
dc390_srb
*
pSRB
;
u8
id
,
lun
;
DEBUG0
(
printk
(
KERN_INFO
"RSEL,"
));
pACB
->
Connected
=
1
;
...
...
@@ -1283,10 +1282,10 @@ dc390_Reselect( PACB pACB )
DC390_write8
(
ScsiCmd
,
MSG_ACCEPTED_CMD
);
/* ;to release the /ACK signal */
}
static
UCHAR
__inline__
static
u8
__inline__
dc390_tagq_blacklist
(
char
*
name
)
{
UCHAR
i
;
u8
i
;
for
(
i
=
0
;
i
<
BADDEVCNT
;
i
++
)
if
(
memcmp
(
name
,
dc390_baddevname1
[
i
],
28
)
==
0
)
return
1
;
...
...
@@ -1295,7 +1294,7 @@ dc390_tagq_blacklist (char* name)
static
void
dc390_disc_tagq_set
(
PDCB
pDCB
,
PSCSI_INQDATA
ptr
)
dc390_disc_tagq_set
(
struct
dc390_dcb
*
pDCB
,
PSCSI_INQDATA
ptr
)
{
/* Check for SCSI format (ANSI and Response data format) */
if
(
(
ptr
->
Vers
&
0x07
)
>=
2
||
(
ptr
->
RDF
&
0x0F
)
==
2
)
...
...
@@ -1317,9 +1316,9 @@ dc390_disc_tagq_set (PDCB pDCB, PSCSI_INQDATA ptr)
static
void
dc390_add_dev
(
PACB
pACB
,
PDCB
pDCB
,
PSCSI_INQDATA
ptr
)
dc390_add_dev
(
struct
dc390_acb
*
pACB
,
struct
dc390_dcb
*
pDCB
,
PSCSI_INQDATA
ptr
)
{
UCHAR
bval1
=
ptr
->
DevType
&
SCSI_DEVTYPE
;
u8
bval1
=
ptr
->
DevType
&
SCSI_DEVTYPE
;
pDCB
->
DevType
=
bval1
;
/* if (bval1 == TYPE_DISK || bval1 == TYPE_MOD) */
dc390_disc_tagq_set
(
pDCB
,
ptr
);
...
...
@@ -1327,22 +1326,24 @@ dc390_add_dev (PACB pACB, PDCB pDCB, PSCSI_INQDATA ptr)
static
void
dc390_SRBdone
(
PACB
pACB
,
PDCB
pDCB
,
PSRB
pSRB
)
dc390_SRBdone
(
struct
dc390_acb
*
pACB
,
struct
dc390_dcb
*
pDCB
,
struct
dc390_srb
*
pSRB
)
{
UCHAR
bval
,
status
,
i
;
PSCSICMD
pcmd
;
u8
bval
,
status
,
i
;
struct
scsi_cmnd
*
pcmd
;
PSCSI_INQDATA
ptr
;
PSGL
ptr2
;
ULONG
swlval
;
struct
scatterlist
*
ptr2
;
unsigned
long
swlval
;
pcmd
=
pSRB
->
pcmd
;
/* KG: Moved pci_unmap here */
dc390_pci_unmap
(
pSRB
);
status
=
pSRB
->
TargetStatus
;
ptr
=
(
PSCSI_INQDATA
)
(
pcmd
->
request_buffer
);
if
(
pcmd
->
use_sg
)
ptr
=
(
PSCSI_INQDATA
)
(
page_address
(((
PSGL
)
ptr
)
->
page
)
+
((
PSGL
)
ptr
)
->
offset
);
if
(
pcmd
->
use_sg
)
{
ptr2
=
(
struct
scatterlist
*
)
(
pcmd
->
request_buffer
);
ptr
=
(
PSCSI_INQDATA
)
(
page_address
(
ptr2
->
page
)
+
ptr2
->
offset
);
}
else
ptr
=
(
PSCSI_INQDATA
)
(
pcmd
->
request_buffer
);
DEBUG0
(
printk
(
" SRBdone (%02x,%08x), SRB %p, pid %li
\n
"
,
status
,
pcmd
->
result
,
\
pSRB
,
pcmd
->
pid
));
...
...
@@ -1379,7 +1380,7 @@ dc390_SRBdone( PACB pACB, PDCB pDCB, PSRB pSRB )
}
if
(
pSRB
->
RetryCnt
==
0
)
{
//(
UINT
)(pSRB->pcmd->cmnd[0]) = pSRB->Segment0[0];
//(
u32
)(pSRB->pcmd->cmnd[0]) = pSRB->Segment0[0];
pSRB
->
TotalXferredLen
=
pSRB
->
SavedTotXLen
;
if
(
(
pSRB
->
TotalXferredLen
)
&&
(
pSRB
->
TotalXferredLen
>=
pcmd
->
underflow
)
)
...
...
@@ -1387,7 +1388,7 @@ dc390_SRBdone( PACB pACB, PDCB pDCB, PSRB pSRB )
else
pcmd
->
result
=
MK_RES_LNX
(
DRIVER_SENSE
,
DID_OK
,
0
,
CHECK_CONDITION
);
REMOVABLEDEBUG
(
printk
(
KERN_INFO
"Cmd=%02x,Result=%08x,XferL=%08x
\n
"
,
pSRB
->
pcmd
->
cmnd
[
0
],
\
(
UINT
)
pcmd
->
result
,
(
UINT
)
pSRB
->
TotalXferredLen
));
(
u32
)
pcmd
->
result
,
(
u32
)
pSRB
->
TotalXferredLen
));
goto
ckc_e
;
}
else
/* Retry */
...
...
@@ -1395,19 +1396,17 @@ dc390_SRBdone( PACB pACB, PDCB pDCB, PSRB pSRB )
pSRB
->
RetryCnt
--
;
pSRB
->
AdaptStatus
=
0
;
pSRB
->
TargetStatus
=
0
;
//*((PUINT) &(pSRB->CmdBlock[0])) = pSRB->Segment0[0];
//*((PUINT) &(pSRB->CmdBlock[4])) = pSRB->Segment0[1];
/* Don't retry on TEST_UNIT_READY */
if
(
pSRB
->
pcmd
->
cmnd
[
0
]
==
TEST_UNIT_READY
/* || pSRB->pcmd->cmnd[0] == START_STOP */
)
{
pcmd
->
result
=
MK_RES_LNX
(
DRIVER_SENSE
,
DID_OK
,
0
,
CHECK_CONDITION
);
REMOVABLEDEBUG
(
printk
(
KERN_INFO
"Cmd=%02x, Result=%08x, XferL=%08x
\n
"
,
pSRB
->
pcmd
->
cmnd
[
0
],
\
(
UINT
)
pcmd
->
result
,
(
UINT
)
pSRB
->
TotalXferredLen
));
(
u32
)
pcmd
->
result
,
(
u32
)
pSRB
->
TotalXferredLen
));
goto
ckc_e
;
}
SET_RES_DRV
(
pcmd
->
result
,
DRIVER_SENSE
);
pcmd
->
use_sg
=
pSRB
->
SavedSGCount
;
//pSRB->ScsiCmdLen = (
UCHAR
) (pSRB->Segment1[0] >> 8);
//pSRB->ScsiCmdLen = (
u8
) (pSRB->Segment1[0] >> 8);
DEBUG0
(
printk
(
"DC390: RETRY pid %li (%02x), target %02i-%02i
\n
"
,
pcmd
->
pid
,
pcmd
->
cmnd
[
0
],
pcmd
->
device
->
id
,
pcmd
->
device
->
lun
));
pSRB
->
SGIndex
=
0
;
pSRB
->
TotalXferredLen
=
0
;
...
...
@@ -1437,14 +1436,14 @@ dc390_SRBdone( PACB pACB, PDCB pDCB, PSRB pSRB )
ptr2
++
;
}
REMOVABLEDEBUG
(
printk
(
KERN_INFO
"XferredLen=%08x,NotXferLen=%08x
\n
"
,
\
(
UINT
)
pSRB
->
TotalXferredLen
,
(
UINT
)
swlval
));
(
u32
)
pSRB
->
TotalXferredLen
,
(
u32
)
swlval
));
}
dc390_RequestSense
(
pACB
,
pDCB
,
pSRB
);
return
;
}
else
if
(
status_byte
(
status
)
==
QUEUE_FULL
)
{
bval
=
(
UCHAR
)
pDCB
->
GoingSRBCnt
;
bval
=
(
u8
)
pDCB
->
GoingSRBCnt
;
bval
--
;
pDCB
->
MaxCommand
=
bval
;
dc390_freetag
(
pDCB
,
pSRB
);
...
...
@@ -1569,12 +1568,12 @@ dc390_SRBdone( PACB pACB, PDCB pDCB, PSRB pSRB )
/* Remove all SRBs from Going list and inform midlevel */
static
void
dc390_DoingSRB_Done
(
PACB
pACB
,
PSCSICMD
cmd
)
dc390_DoingSRB_Done
(
struct
dc390_acb
*
pACB
,
struct
scsi_cmnd
*
cmd
)
{
PDCB
pDCB
,
pdcb
;
PSRB
psrb
,
psrb2
;
UCHAR
i
;
PSCSICMD
pcmd
;
struct
dc390_dcb
*
pDCB
,
*
pdcb
;
struct
dc390_srb
*
psrb
,
*
psrb2
;
u8
i
;
struct
scsi_cmnd
*
pcmd
;
pDCB
=
pACB
->
pLinkDCB
;
pdcb
=
pDCB
;
...
...
@@ -1610,7 +1609,7 @@ dc390_DoingSRB_Done( PACB pACB, PSCSICMD cmd )
static
void
dc390_ResetSCSIBus
(
PACB
pACB
)
dc390_ResetSCSIBus
(
struct
dc390_acb
*
pACB
)
{
//DC390_write8 (ScsiCmd, RST_DEVICE_CMD);
//udelay (250);
...
...
@@ -1625,7 +1624,7 @@ dc390_ResetSCSIBus( PACB pACB )
}
static
void
dc390_ScsiRstDetect
(
PACB
pACB
)
dc390_ScsiRstDetect
(
struct
dc390_acb
*
pACB
)
{
printk
(
"DC390: Rst_Detect: laststat = %08x
\n
"
,
dc390_laststatus
);
//DEBUG0(printk(KERN_INFO "RST_DETECT,"));
...
...
@@ -1658,9 +1657,9 @@ dc390_ScsiRstDetect( PACB pACB )
static
void
__inline__
dc390_RequestSense
(
PACB
pACB
,
PDCB
pDCB
,
PSRB
pSRB
)
dc390_RequestSense
(
struct
dc390_acb
*
pACB
,
struct
dc390_dcb
*
pDCB
,
struct
dc390_srb
*
pSRB
)
{
PSCSICMD
pcmd
;
struct
scsi_cmnd
*
pcmd
;
pcmd
=
pSRB
->
pcmd
;
...
...
@@ -1668,9 +1667,9 @@ dc390_RequestSense( PACB pACB, PDCB pDCB, PSRB pSRB )
pcmd
->
cmnd
[
0
],
pDCB
->
TargetID
,
pDCB
->
TargetLUN
));
pSRB
->
SRBFlag
|=
AUTO_REQSENSE
;
//pSRB->Segment0[0] = (
UINT
) pSRB->CmdBlock[0];
//pSRB->Segment0[1] = (
UINT
) pSRB->CmdBlock[4];
//pSRB->Segment1[0] = ((
UINT
)(pcmd->cmd_len) << 8) + pSRB->SGcount;
//pSRB->Segment0[0] = (
u32
) pSRB->CmdBlock[0];
//pSRB->Segment0[1] = (
u32
) pSRB->CmdBlock[4];
//pSRB->Segment1[0] = ((
u32
)(pcmd->cmd_len) << 8) + pSRB->SGcount;
//pSRB->Segment1[1] = pSRB->TotalXferredLen;
pSRB
->
SavedSGCount
=
pcmd
->
use_sg
;
pSRB
->
SavedTotXLen
=
pSRB
->
TotalXferredLen
;
...
...
@@ -1683,8 +1682,8 @@ dc390_RequestSense( PACB pACB, PDCB pDCB, PSRB pSRB )
//pSRB->CmdBlock[0] = REQUEST_SENSE;
//pSRB->CmdBlock[1] = pDCB->TargetLUN << 5;
//(
USHORT
) pSRB->CmdBlock[2] = 0;
//(
USHORT
) pSRB->CmdBlock[4] = sizeof(pcmd->sense_buffer);
//(
u16
) pSRB->CmdBlock[2] = 0;
//(
u16
) pSRB->CmdBlock[4] = sizeof(pcmd->sense_buffer);
//pSRB->ScsiCmdLen = 6;
pSRB
->
TotalXferredLen
=
0
;
...
...
@@ -1698,7 +1697,7 @@ dc390_RequestSense( PACB pACB, PDCB pDCB, PSRB pSRB )
static
void
__inline__
dc390_InvalidCmd
(
PACB
pACB
)
dc390_InvalidCmd
(
struct
dc390_acb
*
pACB
)
{
if
(
pACB
->
pActiveDCB
->
pActiveSRB
->
SRBState
&
(
SRB_START_
+
SRB_MSGOUT
)
)
DC390_write8
(
ScsiCmd
,
CLEAR_FIFO_CMD
);
...
...
drivers/scsi/tmscsim.c
View file @
f4e7ddb6
...
...
@@ -221,11 +221,8 @@
#endif
#define DCBDEBUG1(x) C_NOP
/* Includes */
#include <linux/config.h>
#include <linux/module.h>
#include <asm/dma.h>
#include <asm/io.h>
#include <asm/system.h>
#include <linux/delay.h>
#include <linux/signal.h>
#include <linux/sched.h>
...
...
@@ -235,44 +232,30 @@
#include <linux/pci.h>
#include <linux/proc_fs.h>
#include <linux/string.h>
#include <linux/ctype.h>
#include <linux/mm.h>
#include <linux/config.h>
#include <linux/version.h>
#include <linux/blkdev.h>
#include <linux/timer.h>
#include <linux/interrupt.h>
#include <linux/init.h>
#include <linux/spinlock.h>
#include <asm/io.h>
#if 0
#include <scsi/scsi.h>
#include <scsi/scsi_cmnd.h>
#include <scsi/scsi_device.h>
#else
#include "scsi.h"
#endif
#include <scsi/scsi_host.h>
#include <linux/stat.h>
#include <scsi/scsicam.h>
#include "dc390.h"
#define PCI_DEVICE_ID_AMD53C974 PCI_DEVICE_ID_AMD_SCSI
/* Locking */
/* Note: Starting from 2.1.9x, the mid-level scsi code issues a
* spinlock_irqsave (&io_request_lock) before calling the driver's
* routines, so we don't need to lock, except in the IRQ handler.
* The policy 3, let the midlevel scsi code do the io_request_locks
* and us locking on a driver specific lock, shouldn't hurt anybody; it
* just causes a minor performance degradation for setting the locks.
*/
/* spinlock things
* level 3: lock on both adapter specific locks and (global) io_request_lock
* level 2: lock on adapter specific locks only
* level 1: rely on the locking of the mid level code (io_request_lock)
* undef : traditional save_flags; cli; restore_flags;
*/
#include <linux/init.h>
#include <linux/spinlock.h>
static
struct
pci_device_id
tmscsim_pci_tbl
[]
=
{
static
struct
pci_device_id
tmscsim_pci_tbl
[]
=
{
{
.
vendor
=
PCI_VENDOR_ID_AMD
,
.
device
=
PCI_DEVICE_ID_AMD53C974
,
...
...
@@ -283,62 +266,47 @@ static struct pci_device_id tmscsim_pci_tbl[] = {
};
MODULE_DEVICE_TABLE
(
pci
,
tmscsim_pci_tbl
);
/* These macros are used for uniform access to 2.0.x and 2.1.x PCI config space*/
#define PDEV pdev
#define PDEVDECL struct pci_dev *pdev
#define PDEVDECL0 struct pci_dev *pdev = NULL
#define PDEVDECL1 struct pci_dev *pdev
#define PDEVSET pACB->pdev=pdev
#define PDEVSET1 pdev=pACB->pdev
#define PCI_WRITE_CONFIG_BYTE(pd, rv, bv) pci_write_config_byte (pd, rv, bv)
#define PCI_READ_CONFIG_BYTE(pd, rv, bv) pci_read_config_byte (pd, rv, bv)
#define PCI_WRITE_CONFIG_WORD(pd, rv, bv) pci_write_config_word (pd, rv, bv)
#define PCI_READ_CONFIG_WORD(pd, rv, bv) pci_read_config_word (pd, rv, bv)
#define PCI_PRESENT (1)
#define PCI_GET_IO_AND_IRQ do{io_port = pci_resource_start (pdev, 0); irq = pdev->irq;} while(0)
#include "tmscsim.h"
static
UCHAR
dc390_StartSCSI
(
PACB
pACB
,
PDCB
pDCB
,
PSRB
pSRB
);
static
void
dc390_DataOut_0
(
PACB
pACB
,
PSRB
pSRB
,
PUCHAR
psstatus
);
static
void
dc390_DataIn_0
(
PACB
pACB
,
PSRB
pSRB
,
PUCHAR
psstatus
);
static
void
dc390_Command_0
(
PACB
pACB
,
PSRB
pSRB
,
PUCHAR
psstatus
);
static
void
dc390_Status_0
(
PACB
pACB
,
PSRB
pSRB
,
PUCHAR
psstatus
);
static
void
dc390_MsgOut_0
(
PACB
pACB
,
PSRB
pSRB
,
PUCHAR
psstatus
);
static
void
dc390_MsgIn_0
(
PACB
pACB
,
PSRB
pSRB
,
PUCHAR
psstatus
);
static
void
dc390_DataOutPhase
(
PACB
pACB
,
PSRB
pSRB
,
PUCHAR
psstatus
);
static
void
dc390_DataInPhase
(
PACB
pACB
,
PSRB
pSRB
,
PUCHAR
psstatus
);
static
void
dc390_CommandPhase
(
PACB
pACB
,
PSRB
pSRB
,
PUCHAR
psstatus
);
static
void
dc390_StatusPhase
(
PACB
pACB
,
PSRB
pSRB
,
PUCHAR
psstatus
);
static
void
dc390_MsgOutPhase
(
PACB
pACB
,
PSRB
pSRB
,
PUCHAR
psstatus
);
static
void
dc390_MsgInPhase
(
PACB
pACB
,
PSRB
pSRB
,
PUCHAR
psstatus
);
static
void
dc390_Nop_0
(
PACB
pACB
,
PSRB
pSRB
,
PUCHAR
psstatus
);
static
void
dc390_Nop_1
(
PACB
pACB
,
PSRB
pSRB
,
PUCHAR
psstatus
);
static
void
dc390_SetXferRate
(
PACB
pACB
,
PDCB
pDCB
);
static
void
dc390_Disconnect
(
PACB
pACB
);
static
void
dc390_Reselect
(
PACB
pACB
);
static
void
dc390_SRBdone
(
PACB
pACB
,
PDCB
pDCB
,
PSRB
pSRB
);
static
void
dc390_DoingSRB_Done
(
PACB
pACB
,
PSCSICMD
cmd
);
static
void
dc390_ScsiRstDetect
(
PACB
pACB
);
static
void
dc390_ResetSCSIBus
(
PACB
pACB
);
static
void
__inline__
dc390_RequestSense
(
PACB
pACB
,
PDCB
pDCB
,
PSRB
pSRB
);
static
void
__inline__
dc390_InvalidCmd
(
PACB
pACB
);
static
void
__inline__
dc390_EnableMsgOut_Abort
(
PACB
,
PSRB
);
static
u8
dc390_StartSCSI
(
struct
dc390_acb
*
pACB
,
struct
dc390_dcb
*
pDCB
,
struct
dc390_srb
*
pSRB
);
static
void
dc390_DataOut_0
(
struct
dc390_acb
*
pACB
,
struct
dc390_srb
*
pSRB
,
u8
*
psstatus
);
static
void
dc390_DataIn_0
(
struct
dc390_acb
*
pACB
,
struct
dc390_srb
*
pSRB
,
u8
*
psstatus
);
static
void
dc390_Command_0
(
struct
dc390_acb
*
pACB
,
struct
dc390_srb
*
pSRB
,
u8
*
psstatus
);
static
void
dc390_Status_0
(
struct
dc390_acb
*
pACB
,
struct
dc390_srb
*
pSRB
,
u8
*
psstatus
);
static
void
dc390_MsgOut_0
(
struct
dc390_acb
*
pACB
,
struct
dc390_srb
*
pSRB
,
u8
*
psstatus
);
static
void
dc390_MsgIn_0
(
struct
dc390_acb
*
pACB
,
struct
dc390_srb
*
pSRB
,
u8
*
psstatus
);
static
void
dc390_DataOutPhase
(
struct
dc390_acb
*
pACB
,
struct
dc390_srb
*
pSRB
,
u8
*
psstatus
);
static
void
dc390_DataInPhase
(
struct
dc390_acb
*
pACB
,
struct
dc390_srb
*
pSRB
,
u8
*
psstatus
);
static
void
dc390_CommandPhase
(
struct
dc390_acb
*
pACB
,
struct
dc390_srb
*
pSRB
,
u8
*
psstatus
);
static
void
dc390_StatusPhase
(
struct
dc390_acb
*
pACB
,
struct
dc390_srb
*
pSRB
,
u8
*
psstatus
);
static
void
dc390_MsgOutPhase
(
struct
dc390_acb
*
pACB
,
struct
dc390_srb
*
pSRB
,
u8
*
psstatus
);
static
void
dc390_MsgInPhase
(
struct
dc390_acb
*
pACB
,
struct
dc390_srb
*
pSRB
,
u8
*
psstatus
);
static
void
dc390_Nop_0
(
struct
dc390_acb
*
pACB
,
struct
dc390_srb
*
pSRB
,
u8
*
psstatus
);
static
void
dc390_Nop_1
(
struct
dc390_acb
*
pACB
,
struct
dc390_srb
*
pSRB
,
u8
*
psstatus
);
static
void
dc390_SetXferRate
(
struct
dc390_acb
*
pACB
,
struct
dc390_dcb
*
pDCB
);
static
void
dc390_Disconnect
(
struct
dc390_acb
*
pACB
);
static
void
dc390_Reselect
(
struct
dc390_acb
*
pACB
);
static
void
dc390_SRBdone
(
struct
dc390_acb
*
pACB
,
struct
dc390_dcb
*
pDCB
,
struct
dc390_srb
*
pSRB
);
static
void
dc390_DoingSRB_Done
(
struct
dc390_acb
*
pACB
,
struct
scsi_cmnd
*
cmd
);
static
void
dc390_ScsiRstDetect
(
struct
dc390_acb
*
pACB
);
static
void
dc390_ResetSCSIBus
(
struct
dc390_acb
*
pACB
);
static
void
__inline__
dc390_RequestSense
(
struct
dc390_acb
*
pACB
,
struct
dc390_dcb
*
pDCB
,
struct
dc390_srb
*
pSRB
);
static
void
__inline__
dc390_InvalidCmd
(
struct
dc390_acb
*
pACB
);
static
void
__inline__
dc390_EnableMsgOut_Abort
(
struct
dc390_acb
*
,
struct
dc390_srb
*
);
static
irqreturn_t
do_DC390_Interrupt
(
int
,
void
*
,
struct
pt_regs
*
);
static
int
dc390_initAdapter
(
PSH
psh
,
ULONG
io_port
,
UCHAR
Irq
,
UCHAR
index
);
static
void
dc390_updateDCB
(
PACB
pACB
,
PDCB
pDCB
);
static
int
dc390_initAdapter
(
struct
Scsi_Host
*
psh
,
unsigned
long
io_port
,
u8
Irq
,
u8
index
);
static
void
dc390_updateDCB
(
struct
dc390_acb
*
pACB
,
struct
dc390_dcb
*
pDCB
);
static
int
DC390_proc_info
(
struct
Scsi_Host
*
shpnt
,
char
*
buffer
,
char
**
start
,
off_t
offset
,
int
length
,
int
inout
);
static
PACB
dc390_pACB_start
=
NULL
;
static
PACB
dc390_pACB_current
=
NULL
;
static
ULONG
dc390_lastabortedpid
=
0
;
static
UINT
dc390_laststatus
=
0
;
static
UCHAR
dc390_adapterCnt
=
0
;
static
struct
dc390_acb
*
dc390_pACB_start
=
NULL
;
static
struct
dc390_acb
*
dc390_pACB_current
=
NULL
;
static
unsigned
long
dc390_lastabortedpid
=
0
;
static
u32
dc390_laststatus
=
0
;
static
u8
dc390_adapterCnt
=
0
;
/* Startup values, to be overriden on the commandline */
static
int
tmscsim
[]
=
{
-
2
,
-
2
,
-
2
,
-
2
,
-
2
,
-
2
};
...
...
@@ -351,7 +319,7 @@ MODULE_DESCRIPTION("SCSI host adapter driver for Tekram DC390 and other AMD53C97
MODULE_LICENSE
(
"GPL"
);
MODULE_SUPPORTED_DEVICE
(
"sd,sr,sg,st"
);
static
PVOID
dc390_phase0
[]
=
{
static
void
*
dc390_phase0
[]
=
{
dc390_DataOut_0
,
dc390_DataIn_0
,
dc390_Command_0
,
...
...
@@ -363,7 +331,7 @@ static PVOID dc390_phase0[]={
dc390_Nop_1
};
static
PVOID
dc390_phase1
[]
=
{
static
void
*
dc390_phase1
[]
=
{
dc390_DataOutPhase
,
dc390_DataInPhase
,
dc390_CommandPhase
,
...
...
@@ -402,15 +370,15 @@ static char* dc390_p1_str[] = {
#endif
/* Devices erroneously pretending to be able to do TagQ */
static
UCHAR
dc390_baddevname1
[
2
][
28
]
=
{
static
u8
dc390_baddevname1
[
2
][
28
]
=
{
"SEAGATE ST3390N 9546"
,
"HP C3323-300 4269"
};
#define BADDEVCNT 2
static
char
*
dc390_adapname
=
"DC390"
;
static
UCHAR
dc390_eepromBuf
[
MAX_ADAPTER_NUM
][
EE_LEN
];
static
UCHAR
dc390_clock_period1
[]
=
{
4
,
5
,
6
,
7
,
8
,
10
,
13
,
20
};
static
UCHAR
dc390_clock_speed
[]
=
{
100
,
80
,
67
,
57
,
50
,
40
,
31
,
20
};
static
u8
dc390_eepromBuf
[
MAX_ADAPTER_NUM
][
EE_LEN
];
static
u8
dc390_clock_period1
[]
=
{
4
,
5
,
6
,
7
,
8
,
10
,
13
,
20
};
static
u8
dc390_clock_speed
[]
=
{
100
,
80
,
67
,
57
,
50
,
40
,
31
,
20
};
/***********************************************************************
* Functions for access to DC390 EEPROM
...
...
@@ -419,46 +387,45 @@ static UCHAR dc390_clock_speed[] = {100,80,67,57,50, 40, 31, 20};
**********************************************************************/
static
void
__devinit
dc390_EnDisableCE
(
UCHAR
mode
,
PDEVDECL
,
PUCHAR
regval
)
static
void
__devinit
dc390_EnDisableCE
(
u8
mode
,
struct
pci_dev
*
pdev
,
u8
*
regval
)
{
UCHAR
bval
;
u8
bval
;
bval
=
0
;
if
(
mode
==
ENABLE_CE
)
*
regval
=
0xc0
;
else
*
regval
=
0x80
;
PCI_WRITE_CONFIG_BYTE
(
PDEV
,
*
regval
,
bval
);
pci_write_config_byte
(
pdev
,
*
regval
,
bval
);
if
(
mode
==
DISABLE_CE
)
PCI_WRITE_CONFIG_BYTE
(
PDEV
,
*
regval
,
bval
);
pci_write_config_byte
(
pdev
,
*
regval
,
bval
);
udelay
(
160
);
}
/* Override EEprom values with explicitly set values */
static
void
__devinit
dc390_EEprom_Override
(
UCHAR
index
)
static
void
__devinit
dc390_EEprom_Override
(
u8
index
)
{
PUCHAR
ptr
;
UCHAR
id
;
ptr
=
(
PUCHAR
)
dc390_eepromBuf
[
index
];
u8
*
ptr
=
(
u8
*
)
dc390_eepromBuf
[
index
];
u8
id
;
/* Adapter Settings */
if
(
tmscsim
[
0
]
!=
-
2
)
ptr
[
EE_ADAPT_SCSI_ID
]
=
(
UCHAR
)
tmscsim
[
0
];
/* Adapter ID */
ptr
[
EE_ADAPT_SCSI_ID
]
=
(
u8
)
tmscsim
[
0
];
/* Adapter ID */
if
(
tmscsim
[
3
]
!=
-
2
)
ptr
[
EE_MODE2
]
=
(
UCHAR
)
tmscsim
[
3
];
ptr
[
EE_MODE2
]
=
(
u8
)
tmscsim
[
3
];
if
(
tmscsim
[
5
]
!=
-
2
)
ptr
[
EE_DELAY
]
=
tmscsim
[
5
];
/* Reset delay */
if
(
tmscsim
[
4
]
!=
-
2
)
ptr
[
EE_TAG_CMD_NUM
]
=
(
UCHAR
)
tmscsim
[
4
];
/* Tagged Cmds */
ptr
[
EE_TAG_CMD_NUM
]
=
(
u8
)
tmscsim
[
4
];
/* Tagged Cmds */
/* Device Settings */
for
(
id
=
0
;
id
<
MAX_SCSI_ID
;
id
++
)
{
if
(
tmscsim
[
2
]
!=
-
2
)
ptr
[
id
<<
2
]
=
(
UCHAR
)
tmscsim
[
2
];
/* EE_MODE1 */
ptr
[
id
<<
2
]
=
(
u8
)
tmscsim
[
2
];
/* EE_MODE1 */
if
(
tmscsim
[
1
]
!=
-
2
)
ptr
[(
id
<<
2
)
+
1
]
=
(
UCHAR
)
tmscsim
[
1
];
/* EE_Speed */
ptr
[(
id
<<
2
)
+
1
]
=
(
u8
)
tmscsim
[
1
];
/* EE_Speed */
}
}
...
...
@@ -527,36 +494,36 @@ static int __init dc390_setup (char *str)
__setup
(
"tmscsim="
,
dc390_setup
);
#endif
static
void
__devinit
dc390_EEpromOutDI
(
PDEVDECL
,
PUCHAR
regval
,
UCHAR
Carry
)
static
void
__devinit
dc390_EEpromOutDI
(
struct
pci_dev
*
pdev
,
u8
*
regval
,
u8
Carry
)
{
UCHAR
bval
;
u8
bval
;
bval
=
0
;
if
(
Carry
)
{
bval
=
0x40
;
*
regval
=
0x80
;
PCI_WRITE_CONFIG_BYTE
(
PDEV
,
*
regval
,
bval
);
pci_write_config_byte
(
pdev
,
*
regval
,
bval
);
}
udelay
(
160
);
bval
|=
0x80
;
PCI_WRITE_CONFIG_BYTE
(
PDEV
,
*
regval
,
bval
);
pci_write_config_byte
(
pdev
,
*
regval
,
bval
);
udelay
(
160
);
bval
=
0
;
PCI_WRITE_CONFIG_BYTE
(
PDEV
,
*
regval
,
bval
);
pci_write_config_byte
(
pdev
,
*
regval
,
bval
);
udelay
(
160
);
}
static
UCHAR
__devinit
dc390_EEpromInDO
(
PDEVDECL
)
static
u8
__devinit
dc390_EEpromInDO
(
struct
pci_dev
*
pdev
)
{
UCHAR
bval
;
u8
bval
;
PCI_WRITE_CONFIG_BYTE
(
PDEV
,
0x80
,
0x80
);
pci_write_config_byte
(
pdev
,
0x80
,
0x80
);
udelay
(
160
);
PCI_WRITE_CONFIG_BYTE
(
PDEV
,
0x80
,
0x40
);
pci_write_config_byte
(
pdev
,
0x80
,
0x40
);
udelay
(
160
);
PCI_READ_CONFIG_BYTE
(
PDEV
,
0x00
,
&
bval
);
pci_read_config_byte
(
pdev
,
0x00
,
&
bval
);
if
(
bval
==
0x22
)
return
(
1
);
else
...
...
@@ -564,68 +531,68 @@ static UCHAR __devinit dc390_EEpromInDO( PDEVDECL )
}
static
USHORT
__devinit
dc390_EEpromGetData1
(
PDEVDECL
)
static
u16
__devinit
dc390_EEpromGetData1
(
struct
pci_dev
*
pdev
)
{
UCHAR
i
;
UCHAR
carryFlag
;
USHORT
wval
;
u8
i
;
u8
carryFlag
;
u16
wval
;
wval
=
0
;
for
(
i
=
0
;
i
<
16
;
i
++
)
{
wval
<<=
1
;
carryFlag
=
dc390_EEpromInDO
(
PDEV
);
carryFlag
=
dc390_EEpromInDO
(
pdev
);
wval
|=
carryFlag
;
}
return
(
wval
);
}
static
void
__devinit
dc390_Prepare
(
PDEVDECL
,
PUCHAR
regval
,
UCHAR
EEpromCmd
)
static
void
__devinit
dc390_Prepare
(
struct
pci_dev
*
pdev
,
u8
*
regval
,
u8
EEpromCmd
)
{
UCHAR
i
,
j
;
UCHAR
carryFlag
;
u8
i
,
j
;
u8
carryFlag
;
carryFlag
=
1
;
j
=
0x80
;
for
(
i
=
0
;
i
<
9
;
i
++
)
{
dc390_EEpromOutDI
(
PDEV
,
regval
,
carryFlag
);
dc390_EEpromOutDI
(
pdev
,
regval
,
carryFlag
);
carryFlag
=
(
EEpromCmd
&
j
)
?
1
:
0
;
j
>>=
1
;
}
}
static
void
__devinit
dc390_ReadEEprom
(
PDEVDECL
,
PUSHORT
ptr
)
static
void
__devinit
dc390_ReadEEprom
(
struct
pci_dev
*
pdev
,
u16
*
ptr
)
{
UCHAR
regval
,
cmd
;
UCHAR
i
;
u8
regval
,
cmd
;
u8
i
;
cmd
=
EEPROM_READ
;
for
(
i
=
0
;
i
<
0x40
;
i
++
)
{
dc390_EnDisableCE
(
ENABLE_CE
,
PDEV
,
&
regval
);
dc390_Prepare
(
PDEV
,
&
regval
,
cmd
++
);
*
ptr
++
=
dc390_EEpromGetData1
(
PDEV
);
dc390_EnDisableCE
(
DISABLE_CE
,
PDEV
,
&
regval
);
dc390_EnDisableCE
(
ENABLE_CE
,
pdev
,
&
regval
);
dc390_Prepare
(
pdev
,
&
regval
,
cmd
++
);
*
ptr
++
=
dc390_EEpromGetData1
(
pdev
);
dc390_EnDisableCE
(
DISABLE_CE
,
pdev
,
&
regval
);
}
}
static
void
__devinit
dc390_interpret_delay
(
UCHAR
index
)
static
void
__devinit
dc390_interpret_delay
(
u8
index
)
{
char
interpd
[]
=
{
1
,
3
,
5
,
10
,
16
,
30
,
60
,
120
};
dc390_eepromBuf
[
index
][
EE_DELAY
]
=
interpd
[
dc390_eepromBuf
[
index
][
EE_DELAY
]];
}
static
UCHAR
__devinit
dc390_CheckEEpromCheckSum
(
PDEVDECL
,
UCHAR
index
)
static
u8
__devinit
dc390_CheckEEpromCheckSum
(
struct
pci_dev
*
pdev
,
u8
index
)
{
UCHAR
i
;
u8
i
;
char
EEbuf
[
128
];
USHORT
wval
,
*
ptr
=
(
PUSHORT
)
EEbuf
;
u16
wval
,
*
ptr
=
(
u16
*
)
EEbuf
;
dc390_ReadEEprom
(
PDEV
,
ptr
);
dc390_ReadEEprom
(
pdev
,
ptr
);
memcpy
(
dc390_eepromBuf
[
index
],
EEbuf
,
EE_ADAPT_SCSI_ID
);
memcpy
(
&
dc390_eepromBuf
[
index
][
EE_ADAPT_SCSI_ID
],
&
EEbuf
[
REAL_EE_ADAPT_SCSI_ID
],
EE_LEN
-
EE_ADAPT_SCSI_ID
);
...
...
@@ -643,9 +610,9 @@ static UCHAR __devinit dc390_CheckEEpromCheckSum( PDEVDECL, UCHAR index )
* (DCBs, SRBs, Queueing)
*
**********************************************************************/
static
PDCB
__inline__
dc390_findDCB
(
PACB
pACB
,
UCHAR
id
,
UCHAR
lun
)
static
struct
dc390_dcb
__inline__
*
dc390_findDCB
(
struct
dc390_acb
*
pACB
,
u8
id
,
u8
lun
)
{
PDCB
pDCB
=
pACB
->
pLinkDCB
;
if
(
!
pDCB
)
return
0
;
struct
dc390_dcb
*
pDCB
=
pACB
->
pLinkDCB
;
if
(
!
pDCB
)
return
0
;
while
(
pDCB
->
TargetID
!=
id
||
pDCB
->
TargetLUN
!=
lun
)
{
pDCB
=
pDCB
->
pNextDCB
;
...
...
@@ -675,26 +642,10 @@ static PDCB __inline__ dc390_findDCB ( PACB pACB, UCHAR id, UCHAR lun)
* Lists are managed using two pointers and eventually a counter
*/
#if 0
/* Look for a SCSI cmd in a SRB queue */
static PSRB dc390_find_cmd_in_SRBq (PSCSICMD cmd, PSRB queue)
{
PSRB q = queue;
while (q)
{
if (q->pcmd == cmd) return q;
q = q->pNextSRB;
if (q == queue) return 0;
}
return q;
}
#endif
/* Return next free SRB */
static
__inline__
PSRB
dc390_Free_get
(
PACB
pACB
)
static
__inline__
struct
dc390_srb
*
dc390_Free_get
(
struct
dc390_acb
*
pACB
)
{
PSRB
pSRB
;
struct
dc390_srb
*
pSRB
;
pSRB
=
pACB
->
pFreeSRB
;
DEBUG0
(
printk
(
"DC390: Get Free SRB %p
\n
"
,
pSRB
));
...
...
@@ -708,7 +659,7 @@ static __inline__ PSRB dc390_Free_get ( PACB pACB )
}
/* Insert SRB oin top of free list */
static
__inline__
void
dc390_Free_insert
(
PACB
pACB
,
PSRB
pSRB
)
static
__inline__
void
dc390_Free_insert
(
struct
dc390_acb
*
pACB
,
struct
dc390_srb
*
pSRB
)
{
DEBUG0
(
printk
(
"DC390: Free SRB %p
\n
"
,
pSRB
));
pSRB
->
pNextSRB
=
pACB
->
pFreeSRB
;
...
...
@@ -717,7 +668,7 @@ static __inline__ void dc390_Free_insert (PACB pACB, PSRB pSRB)
/* Inserts a SRB to the top of the Waiting list */
static
__inline__
void
dc390_Waiting_insert
(
PDCB
pDCB
,
PSRB
pSRB
)
static
__inline__
void
dc390_Waiting_insert
(
struct
dc390_dcb
*
pDCB
,
struct
dc390_srb
*
pSRB
)
{
DEBUG0
(
printk
(
"DC390: Insert pSRB %p cmd %li to Waiting
\n
"
,
pSRB
,
pSRB
->
pcmd
->
pid
));
pSRB
->
pNextSRB
=
pDCB
->
pWaitingSRB
;
...
...
@@ -729,7 +680,7 @@ static __inline__ void dc390_Waiting_insert ( PDCB pDCB, PSRB pSRB )
/* Queue SRB to waiting list */
static
__inline__
void
dc390_Waiting_append
(
PDCB
pDCB
,
PSRB
pSRB
)
static
__inline__
void
dc390_Waiting_append
(
struct
dc390_dcb
*
pDCB
,
struct
dc390_srb
*
pSRB
)
{
DEBUG0
(
printk
(
"DC390: Append pSRB %p cmd %li to Waiting
\n
"
,
pSRB
,
pSRB
->
pcmd
->
pid
));
if
(
pDCB
->
pWaitingSRB
)
...
...
@@ -743,7 +694,7 @@ static __inline__ void dc390_Waiting_append ( PDCB pDCB, PSRB pSRB)
pDCB
->
pDCBACB
->
CmdInQ
++
;
}
static
__inline__
void
dc390_Going_append
(
PDCB
pDCB
,
PSRB
pSRB
)
static
__inline__
void
dc390_Going_append
(
struct
dc390_dcb
*
pDCB
,
struct
dc390_srb
*
pSRB
)
{
pDCB
->
GoingSRBCnt
++
;
DEBUG0
(
printk
(
"DC390: Append SRB %p to Going
\n
"
,
pSRB
));
...
...
@@ -758,14 +709,14 @@ static __inline__ void dc390_Going_append (PDCB pDCB, PSRB pSRB)
pSRB
->
pNextSRB
=
NULL
;
}
static
__inline__
void
dc390_Going_remove
(
PDCB
pDCB
,
PSRB
pSRB
)
static
__inline__
void
dc390_Going_remove
(
struct
dc390_dcb
*
pDCB
,
struct
dc390_srb
*
pSRB
)
{
DEBUG0
(
printk
(
"DC390: Remove SRB %p from Going
\n
"
,
pSRB
));
if
(
pSRB
==
pDCB
->
pGoingSRB
)
pDCB
->
pGoingSRB
=
pSRB
->
pNextSRB
;
else
{
PSRB
psrb
=
pDCB
->
pGoingSRB
;
struct
dc390_srb
*
psrb
=
pDCB
->
pGoingSRB
;
while
(
psrb
&&
psrb
->
pNextSRB
!=
pSRB
)
psrb
=
psrb
->
pNextSRB
;
if
(
!
psrb
)
...
...
@@ -778,7 +729,7 @@ static __inline__ void dc390_Going_remove (PDCB pDCB, PSRB pSRB)
}
/* Moves SRB from Going list to the top of Waiting list */
static
void
dc390_Going_to_Waiting
(
PDCB
pDCB
,
PSRB
pSRB
)
static
void
dc390_Going_to_Waiting
(
struct
dc390_dcb
*
pDCB
,
struct
dc390_srb
*
pSRB
)
{
DEBUG0
(
printk
(
KERN_INFO
"DC390: Going_to_Waiting (SRB %p) pid = %li
\n
"
,
pSRB
,
pSRB
->
pcmd
->
pid
));
/* Remove SRB from Going */
...
...
@@ -789,7 +740,7 @@ static void dc390_Going_to_Waiting ( PDCB pDCB, PSRB pSRB )
}
/* Moves first SRB from Waiting list to Going list */
static
__inline__
void
dc390_Waiting_to_Going
(
PDCB
pDCB
,
PSRB
pSRB
)
static
__inline__
void
dc390_Waiting_to_Going
(
struct
dc390_dcb
*
pDCB
,
struct
dc390_srb
*
pSRB
)
{
/* Remove from waiting list */
DEBUG0
(
printk
(
"DC390: Remove SRB %p from head of Waiting
\n
"
,
pSRB
));
...
...
@@ -801,7 +752,7 @@ static __inline__ void dc390_Waiting_to_Going ( PDCB pDCB, PSRB pSRB )
static
void
DC390_waiting_timed_out
(
unsigned
long
ptr
);
/* Sets the timer to wake us up */
static
void
dc390_waiting_timer
(
PACB
pACB
,
unsigned
long
to
)
static
void
dc390_waiting_timer
(
struct
dc390_acb
*
pACB
,
unsigned
long
to
)
{
if
(
timer_pending
(
&
pACB
->
Waiting_Timer
))
return
;
init_timer
(
&
pACB
->
Waiting_Timer
);
...
...
@@ -816,10 +767,10 @@ static void dc390_waiting_timer (PACB pACB, unsigned long to)
/* Send the next command from the waiting list to the bus */
static
void
dc390_Waiting_process
(
PACB
pACB
)
static
void
dc390_Waiting_process
(
struct
dc390_acb
*
pACB
)
{
PDCB
ptr
,
ptr1
;
PSRB
pSRB
;
struct
dc390_dcb
*
ptr
,
*
ptr1
;
struct
dc390_srb
*
pSRB
;
if
(
(
pACB
->
pActiveDCB
)
||
(
pACB
->
ACBFlag
&
(
RESET_DETECT
+
RESET_DONE
+
RESET_DEV
)
)
)
return
;
...
...
@@ -854,7 +805,7 @@ static void dc390_Waiting_process ( PACB pACB )
/* Wake up waiting queue */
static
void
DC390_waiting_timed_out
(
unsigned
long
ptr
)
{
PACB
pACB
=
(
PACB
)
ptr
;
struct
dc390_acb
*
pACB
=
(
struct
dc390_acb
*
)
ptr
;
unsigned
long
iflags
;
DEBUG0
(
printk
(
"DC390: Debug: Waiting queue woken up by timer!
\n
"
));
spin_lock_irqsave
(
pACB
->
pScsiHost
->
host_lock
,
iflags
);
...
...
@@ -863,15 +814,15 @@ static void DC390_waiting_timed_out (unsigned long ptr)
}
/***********************************************************************
* Function: static void dc390_SendSRB (
PACB pACB, PSRB
pSRB)
* Function: static void dc390_SendSRB (
struct dc390_acb* pACB, struct dc390_srb*
pSRB)
*
* Purpose: Send SCSI Request Block (pSRB) to adapter (pACB)
*
***********************************************************************/
static
void
dc390_SendSRB
(
PACB
pACB
,
PSRB
pSRB
)
static
void
dc390_SendSRB
(
struct
dc390_acb
*
pACB
,
struct
dc390_srb
*
pSRB
)
{
PDCB
pDCB
;
struct
dc390_dcb
*
pDCB
;
pDCB
=
pSRB
->
pSRBDCB
;
if
(
(
pDCB
->
MaxCommand
<=
pDCB
->
GoingSRBCnt
)
||
(
pACB
->
pActiveDCB
)
||
...
...
@@ -913,10 +864,10 @@ static struct scatterlist* dc390_sg_build_single(struct scatterlist *sg, void *a
}
/* Create pci mapping */
static
int
dc390_pci_map
(
PSRB
pSRB
)
static
int
dc390_pci_map
(
struct
dc390_srb
*
pSRB
)
{
int
error
=
0
;
Scsi_C
mnd
*
pcmd
=
pSRB
->
pcmd
;
struct
scsi_c
mnd
*
pcmd
=
pSRB
->
pcmd
;
struct
pci_dev
*
pdev
=
pSRB
->
pSRBDCB
->
pDCBACB
->
pdev
;
dc390_cmd_scp_t
*
cmdp
=
((
dc390_cmd_scp_t
*
)(
&
pcmd
->
SCp
));
...
...
@@ -933,9 +884,9 @@ static int dc390_pci_map (PSRB pSRB)
DEBUG1
(
printk
(
"%s(): Mapped sense buffer %p at %x
\n
"
,
__FUNCTION__
,
pcmd
->
sense_buffer
,
cmdp
->
saved_dma_handle
));
/* Map SG list */
}
else
if
(
pcmd
->
use_sg
)
{
pSRB
->
pSegmentList
=
(
PSGL
)
pcmd
->
request_buffer
;
pSRB
->
pSegmentList
=
(
struct
scatterlist
*
)
pcmd
->
request_buffer
;
pSRB
->
SGcount
=
pci_map_sg
(
pdev
,
pSRB
->
pSegmentList
,
pcmd
->
use_sg
,
scsi_to_pci_dma_dir
(
pcmd
->
sc_data_direction
)
);
pcmd
->
sc_data_direction
);
/* TODO: error handling */
if
(
!
pSRB
->
SGcount
)
error
=
1
;
...
...
@@ -945,7 +896,7 @@ static int dc390_pci_map (PSRB pSRB)
}
else
if
(
pcmd
->
request_buffer
&&
pcmd
->
request_bufflen
)
{
pSRB
->
pSegmentList
=
dc390_sg_build_single
(
&
pSRB
->
Segmentx
,
pcmd
->
request_buffer
,
pcmd
->
request_bufflen
);
pSRB
->
SGcount
=
pci_map_sg
(
pdev
,
pSRB
->
pSegmentList
,
1
,
scsi_to_pci_dma_dir
(
pcmd
->
sc_data_direction
)
);
pcmd
->
sc_data_direction
);
cmdp
->
saved_dma_handle
=
sg_dma_address
(
pSRB
->
pSegmentList
);
/* TODO: error handling */
...
...
@@ -960,9 +911,9 @@ static int dc390_pci_map (PSRB pSRB)
}
/* Remove pci mapping */
static
void
dc390_pci_unmap
(
PSRB
pSRB
)
static
void
dc390_pci_unmap
(
struct
dc390_srb
*
pSRB
)
{
Scsi_Cmnd
*
pcmd
=
pSRB
->
pcmd
;
struct
scsi_cmnd
*
pcmd
=
pSRB
->
pcmd
;
struct
pci_dev
*
pdev
=
pSRB
->
pSRBDCB
->
pDCBACB
->
pdev
;
DEBUG1
(
dc390_cmd_scp_t
*
cmdp
=
((
dc390_cmd_scp_t
*
)(
&
pcmd
->
SCp
)));
...
...
@@ -970,24 +921,24 @@ static void dc390_pci_unmap (PSRB pSRB)
pci_unmap_sg
(
pdev
,
&
pSRB
->
Segmentx
,
1
,
DMA_FROM_DEVICE
);
DEBUG1
(
printk
(
"%s(): Unmapped sense buffer at %x
\n
"
,
__FUNCTION__
,
cmdp
->
saved_dma_handle
));
}
else
if
(
pcmd
->
use_sg
)
{
pci_unmap_sg
(
pdev
,
pcmd
->
request_buffer
,
pcmd
->
use_sg
,
scsi_to_pci_dma_dir
(
pcmd
->
sc_data_direction
)
);
pci_unmap_sg
(
pdev
,
pcmd
->
request_buffer
,
pcmd
->
use_sg
,
pcmd
->
sc_data_direction
);
DEBUG1
(
printk
(
"%s(): Unmapped SG at %p with %d elements
\n
"
,
__FUNCTION__
,
pcmd
->
request_buffer
,
pcmd
->
use_sg
));
}
else
if
(
pcmd
->
request_buffer
&&
pcmd
->
request_bufflen
)
{
pci_unmap_sg
(
pdev
,
&
pSRB
->
Segmentx
,
1
,
scsi_to_pci_dma_dir
(
pcmd
->
sc_data_direction
)
);
pci_unmap_sg
(
pdev
,
&
pSRB
->
Segmentx
,
1
,
pcmd
->
sc_data_direction
);
DEBUG1
(
printk
(
"%s(): Unmapped request buffer at %x
\n
"
,
__FUNCTION__
,
cmdp
->
saved_dma_handle
));
}
}
/***********************************************************************
* Function: static void dc390_BuildSRB (Scsi_Cmd *pcmd,
PDCB
pDCB,
*
PSRB
pSRB)
* Function: static void dc390_BuildSRB (Scsi_Cmd *pcmd,
struct dc390_dcb*
pDCB,
*
struct dc390_srb*
pSRB)
*
* Purpose: Prepare SRB for being sent to Device DCB w/ command *pcmd
*
***********************************************************************/
static
void
dc390_BuildSRB
(
Scsi_Cmnd
*
pcmd
,
PDCB
pDCB
,
PSRB
pSRB
)
static
void
dc390_BuildSRB
(
struct
scsi_cmnd
*
pcmd
,
struct
dc390_dcb
*
pDCB
,
struct
dc390_srb
*
pSRB
)
{
pSRB
->
pSRBDCB
=
pDCB
;
pSRB
->
pcmd
=
pcmd
;
...
...
@@ -1015,8 +966,8 @@ static void dc390_BuildSRB (Scsi_Cmnd* pcmd, PDCB pDCB, PSRB pSRB)
}
/***********************************************************************
* Function : static int DC390_queue_command (
Scsi_C
mnd *cmd,
* void (*done)(
Scsi_C
mnd *))
* Function : static int DC390_queue_command (
struct scsi_c
mnd *cmd,
* void (*done)(
struct scsi_c
mnd *))
*
* Purpose : enqueues a SCSI command
*
...
...
@@ -1033,11 +984,12 @@ static void dc390_BuildSRB (Scsi_Cmnd* pcmd, PDCB pDCB, PSRB pSRB)
*
***********************************************************************/
static
int
DC390_queue_command
(
Scsi_Cmnd
*
cmd
,
void
(
*
done
)(
Scsi_Cmnd
*
))
static
int
DC390_queue_command
(
struct
scsi_cmnd
*
cmd
,
void
(
*
done
)(
struct
scsi_cmnd
*
))
{
PDCB
pDCB
=
(
PDCB
)
cmd
->
device
->
hostdata
;
PSRB
pSRB
;
PACB
pACB
=
(
PACB
)
cmd
->
device
->
host
->
hostdata
;
struct
dc390_dcb
*
pDCB
=
(
struct
dc390_dcb
*
)
cmd
->
device
->
hostdata
;
struct
dc390_srb
*
pSRB
;
struct
dc390_acb
*
pACB
=
(
struct
dc390_acb
*
)
cmd
->
device
->
host
->
hostdata
;
DEBUG0
(
/* if(pACB->scan_devices) */
\
printk
(
KERN_INFO
"DC390: Queue Cmd=%02x,Tgt=%d,LUN=%d (pid=%li), buffer=%p
\n
"
,
\
...
...
@@ -1181,7 +1133,7 @@ static int DC390_bios_param (struct scsi_device *sdev, struct block_device *bdev
sector_t
capacity
,
int
geom
[])
{
int
heads
,
sectors
,
cylinders
;
PACB
pACB
=
(
PACB
)
sdev
->
host
->
hostdata
;
struct
dc390_acb
*
pACB
=
(
struct
dc390_acb
*
)
sdev
->
host
->
hostdata
;
int
ret_code
=
-
1
;
int
size
=
capacity
;
unsigned
char
*
buf
;
...
...
@@ -1221,9 +1173,11 @@ static int DC390_bios_param (struct scsi_device *sdev, struct block_device *bdev
}
#endif
static
void
dc390_dumpinfo
(
PACB
pACB
,
PDCB
pDCB
,
PSRB
pSRB
)
static
void
dc390_dumpinfo
(
struct
dc390_acb
*
pACB
,
struct
dc390_dcb
*
pDCB
,
struct
dc390_srb
*
pSRB
)
{
USHORT
pstat
;
PDEVDECL1
;
struct
pci_dev
*
pdev
;
u16
pstat
;
if
(
!
pDCB
)
pDCB
=
pACB
->
pActiveDCB
;
if
(
!
pSRB
&&
pDCB
)
pSRB
=
pDCB
->
pActiveSRB
;
...
...
@@ -1257,14 +1211,16 @@ static void dc390_dumpinfo (PACB pACB, PDCB pDCB, PSRB pSRB)
DC390_read32
(
DMA_Wk_ByteCntr
),
DC390_read32
(
DMA_Wk_AddrCntr
),
DC390_read8
(
DMA_Status
),
DC390_read32
(
DMA_ScsiBusCtrl
));
DC390_write32
(
DMA_ScsiBusCtrl
,
EN_INT_ON_PCI_ABORT
);
PDEVSET1
;
PCI_READ_CONFIG_WORD
(
PDEV
,
PCI_STATUS
,
&
pstat
);
pdev
=
pACB
->
pdev
;
pci_read_config_word
(
pdev
,
PCI_STATUS
,
&
pstat
);
printk
(
"DC390: Register dump: PCI Status: %04x
\n
"
,
pstat
);
printk
(
"DC390: In case of driver trouble read linux/Documentation/scsi/tmscsim.txt
\n
"
);
}
/***********************************************************************
* Function : int DC390_abort (
Scsi_C
mnd *cmd)
* Function : int DC390_abort (
struct scsi_c
mnd *cmd)
*
* Purpose : Abort an errant SCSI command
*
...
...
@@ -1275,14 +1231,14 @@ static void dc390_dumpinfo (PACB pACB, PDCB pDCB, PSRB pSRB)
* Status: Buggy !
***********************************************************************/
static
int
DC390_abort
(
Scsi_C
mnd
*
cmd
)
static
int
DC390_abort
(
struct
scsi_c
mnd
*
cmd
)
{
PDCB
pDCB
=
(
PDCB
)
cmd
->
device
->
hostdata
;
PSRB
pSRB
,
psrb
;
UINT
count
,
i
;
struct
dc390_dcb
*
pDCB
=
(
struct
dc390_dcb
*
)
cmd
->
device
->
hostdata
;
struct
dc390_srb
*
pSRB
,
*
psrb
;
u32
count
,
i
;
int
status
;
//
ULONG
sbac;
PACB
pACB
=
(
PACB
)
cmd
->
device
->
host
->
hostdata
;
//
unsigned long
sbac;
struct
dc390_acb
*
pACB
=
(
struct
dc390_acb
*
)
cmd
->
device
->
host
->
hostdata
;
printk
(
"DC390: Abort command (pid %li, Device %02i-%02i)
\n
"
,
cmd
->
pid
,
cmd
->
device
->
id
,
cmd
->
device
->
lun
);
...
...
@@ -1406,9 +1362,9 @@ static int DC390_abort (Scsi_Cmnd *cmd)
}
static
void
dc390_ResetDevParam
(
PACB
pACB
)
static
void
dc390_ResetDevParam
(
struct
dc390_acb
*
pACB
)
{
PDCB
pDCB
,
pdcb
;
struct
dc390_dcb
*
pDCB
,
*
pdcb
;
pDCB
=
pACB
->
pLinkDCB
;
if
(
!
pDCB
)
return
;
...
...
@@ -1431,11 +1387,11 @@ static void dc390_ResetDevParam( PACB pACB )
#if 0
/* Moves all SRBs from Going to Waiting for all DCBs */
static void dc390_RecoverSRB(
PACB
pACB )
static void dc390_RecoverSRB(
struct dc390_acb*
pACB )
{
PDCB pDCB,
pdcb;
PSRB psrb,
psrb2;
UINT
cnt, i;
struct dc390_dcb *pDCB, *
pdcb;
struct dc390_srb *psrb, *
psrb2;
u32
cnt, i;
pDCB = pACB->pLinkDCB;
if( !pDCB ) return;
...
...
@@ -1470,7 +1426,7 @@ static void dc390_RecoverSRB( PACB pACB )
#endif
/***********************************************************************
* Function : int DC390_reset (
Scsi_C
mnd *cmd, ...)
* Function : int DC390_reset (
struct scsi_c
mnd *cmd, ...)
*
* Purpose : perform a hard reset on the SCSI bus
*
...
...
@@ -1480,10 +1436,10 @@ static void dc390_RecoverSRB( PACB pACB )
* Returns : 0 on success.
***********************************************************************/
static
int
DC390_reset
(
Scsi_C
mnd
*
cmd
)
static
int
DC390_reset
(
struct
scsi_c
mnd
*
cmd
)
{
UCHAR
bval
;
PACB
pACB
=
(
PACB
)
cmd
->
device
->
host
->
hostdata
;
u8
bval
;
struct
dc390_acb
*
pACB
=
(
struct
dc390_acb
*
)
cmd
->
device
->
host
->
hostdata
;
printk
(
KERN_INFO
"DC390: RESET ... "
);
...
...
@@ -1526,7 +1482,7 @@ static int DC390_reset (Scsi_Cmnd *cmd)
* Purpose : Set the configuration dependent DCB parameters
***********************************************************************/
static
void
dc390_updateDCB
(
PACB
pACB
,
PDCB
pDCB
)
static
void
dc390_updateDCB
(
struct
dc390_acb
*
pACB
,
struct
dc390_dcb
*
pDCB
)
{
pDCB
->
SyncMode
&=
EN_TAG_QUEUEING
|
SYNC_NEGO_DONE
/*| EN_ATN_STOP*/
;
if
(
pDCB
->
DevMode
&
TAG_QUEUEING_
)
{
...
...
@@ -1558,15 +1514,15 @@ static void dc390_updateDCB (PACB pACB, PDCB pDCB)
* Inputs : psrb - pointer to this scsi request block structure
***********************************************************************/
static
void
__inline__
dc390_initSRB
(
PSRB
psrb
)
static
void
__inline__
dc390_initSRB
(
struct
dc390_srb
*
psrb
)
{
/* psrb->PhysSRB = virt_to_phys( psrb ); */
}
static
void
dc390_linkSRB
(
PACB
pACB
)
static
void
dc390_linkSRB
(
struct
dc390_acb
*
pACB
)
{
UINT
count
,
i
;
u32
count
,
i
;
count
=
pACB
->
SRBCount
;
for
(
i
=
0
;
i
<
count
;
i
++
)
...
...
@@ -1589,10 +1545,10 @@ static void dc390_linkSRB( PACB pACB )
* io_port, Irq, index: Resources and adapter index
***********************************************************************/
static
void
__devinit
dc390_initACB
(
PSH
psh
,
ULONG
io_port
,
UCHAR
Irq
,
UCHAR
index
)
static
void
__devinit
dc390_initACB
(
struct
Scsi_Host
*
psh
,
unsigned
long
io_port
,
u8
Irq
,
u8
index
)
{
PACB
pACB
;
UCHAR
i
;
struct
dc390_acb
*
pACB
;
u8
i
;
psh
->
can_queue
=
MAX_CMD_QUEUE
;
psh
->
cmd_per_lun
=
MAX_CMD_PER_LUN
;
...
...
@@ -1605,10 +1561,10 @@ static void __devinit dc390_initACB (PSH psh, ULONG io_port, UCHAR Irq, UCHAR in
psh
->
dma_channel
=
-
1
;
psh
->
last_reset
=
jiffies
;
pACB
=
(
PACB
)
psh
->
hostdata
;
pACB
=
(
struct
dc390_acb
*
)
psh
->
hostdata
;
pACB
->
pScsiHost
=
psh
;
pACB
->
IOPortBase
=
(
USHORT
)
io_port
;
pACB
->
IOPortBase
=
(
u16
)
io_port
;
pACB
->
IRQLevel
=
Irq
;
DEBUG0
(
printk
(
KERN_INFO
"DC390: Adapter index %i, ID %i, IO 0x%08x, IRQ 0x%02x
\n
"
,
\
...
...
@@ -1660,13 +1616,13 @@ static void __devinit dc390_initACB (PSH psh, ULONG io_port, UCHAR Irq, UCHAR in
* Outputs: 0 on success, -1 on error
***********************************************************************/
static
int
__devinit
dc390_initAdapter
(
PSH
psh
,
ULONG
io_port
,
UCHAR
Irq
,
UCHAR
index
)
static
int
__devinit
dc390_initAdapter
(
struct
Scsi_Host
*
psh
,
unsigned
long
io_port
,
u8
Irq
,
u8
index
)
{
PACB
pACB
,
pACB2
;
UCHAR
dstate
;
struct
dc390_acb
*
pACB
,
*
pACB2
;
u8
dstate
;
int
i
;
pACB
=
(
PACB
)
psh
->
hostdata
;
pACB
=
(
struct
dc390_acb
*
)
psh
->
hostdata
;
if
(
request_region
(
io_port
,
psh
->
n_io_port
,
"tmscsim"
)
==
NULL
)
{
printk
(
KERN_ERR
"DC390: register IO ports error!
\n
"
);
...
...
@@ -1731,13 +1687,14 @@ static int __devinit dc390_initAdapter (PSH psh, ULONG io_port, UCHAR Irq, UCHAR
}
static
void
__devinit
dc390_set_pci_cfg
(
PDEVDECL
)
static
void
__devinit
dc390_set_pci_cfg
(
struct
pci_dev
*
pdev
)
{
USHORT
cmd
;
PCI_READ_CONFIG_WORD
(
PDEV
,
PCI_COMMAND
,
&
cmd
);
u16
cmd
;
pci_read_config_word
(
pdev
,
PCI_COMMAND
,
&
cmd
);
cmd
|=
PCI_COMMAND_SERR
|
PCI_COMMAND_PARITY
|
PCI_COMMAND_IO
;
PCI_WRITE_CONFIG_WORD
(
PDEV
,
PCI_COMMAND
,
cmd
);
PCI_WRITE_CONFIG_WORD
(
PDEV
,
PCI_STATUS
,
(
PCI_STATUS_SIG_SYSTEM_ERROR
|
PCI_STATUS_DETECTED_PARITY
));
pci_write_config_word
(
pdev
,
PCI_COMMAND
,
cmd
);
pci_write_config_word
(
pdev
,
PCI_STATUS
,
(
PCI_STATUS_SIG_SYSTEM_ERROR
|
PCI_STATUS_DETECTED_PARITY
));
}
/**
...
...
@@ -1748,15 +1705,15 @@ static void __devinit dc390_set_pci_cfg (PDEVDECL)
*/
static
int
dc390_slave_alloc
(
struct
scsi_device
*
scsi_device
)
{
PACB
pACB
=
(
PACB
)
scsi_device
->
host
->
hostdata
;
PDCB
pDCB
,
pDCB2
=
0
;
struct
dc390_acb
*
pACB
=
(
struct
dc390_acb
*
)
scsi_device
->
host
->
hostdata
;
struct
dc390_dcb
*
pDCB
,
*
pDCB2
=
0
;
uint
id
=
scsi_device
->
id
;
uint
lun
=
scsi_device
->
lun
;
pDCB
=
kmalloc
(
sizeof
(
DC390_DCB
),
GFP_KERNEL
);
pDCB
=
kmalloc
(
sizeof
(
struct
dc390_dcb
),
GFP_KERNEL
);
if
(
!
pDCB
)
return
-
ENOMEM
;
memset
(
pDCB
,
0
,
sizeof
(
DC390_DCB
));
memset
(
pDCB
,
0
,
sizeof
(
struct
dc390_dcb
));
if
(
!
pACB
->
DCBCnt
++
)
{
pACB
->
pLinkDCB
=
pDCB
;
...
...
@@ -1816,9 +1773,9 @@ static int dc390_slave_alloc(struct scsi_device *scsi_device)
*/
static
void
dc390_slave_destroy
(
struct
scsi_device
*
scsi_device
)
{
PACB
pACB
=
(
PACB
)
scsi_device
->
host
->
hostdata
;
PDCB
pDCB
=
(
PDCB
)
scsi_device
->
hostdata
;
PDCB
pPrevDCB
=
pACB
->
pLinkDCB
;
struct
dc390_acb
*
pACB
=
(
struct
dc390_acb
*
)
scsi_device
->
host
->
hostdata
;
struct
dc390_dcb
*
pDCB
=
(
struct
dc390_dcb
*
)
scsi_device
->
hostdata
;
struct
dc390_dcb
*
pPrevDCB
=
pACB
->
pLinkDCB
;
pACB
->
scan_devices
=
0
;
...
...
@@ -1853,12 +1810,12 @@ static void dc390_slave_destroy(struct scsi_device *scsi_device)
static
int
dc390_slave_configure
(
struct
scsi_device
*
scsi_device
)
{
PACB
pACB
=
(
PACB
)
scsi_device
->
host
->
hostdata
;
struct
dc390_acb
*
pACB
=
(
struct
dc390_acb
*
)
scsi_device
->
host
->
hostdata
;
pACB
->
scan_devices
=
0
;
return
0
;
}
static
Scsi_Host_T
emplate
driver_template
=
{
static
struct
scsi_host_t
emplate
driver_template
=
{
.
module
=
THIS_MODULE
,
.
proc_name
=
"tmscsim"
,
.
proc_info
=
DC390_proc_info
,
...
...
@@ -1883,7 +1840,7 @@ static int __devinit dc390_init_one(struct pci_dev *dev,
struct
Scsi_Host
*
scsi_host
;
unsigned
long
io_port
;
u8
irq
;
PACB
pACB
;
struct
dc390_acb
*
pACB
;
int
ret
=
-
ENOMEM
;
if
(
pci_enable_device
(
dev
))
...
...
@@ -1893,11 +1850,11 @@ static int __devinit dc390_init_one(struct pci_dev *dev,
irq
=
dev
->
irq
;
/* allocate scsi host information (includes out adapter) */
scsi_host
=
scsi_host_alloc
(
&
driver_template
,
sizeof
(
struct
_ACB
));
scsi_host
=
scsi_host_alloc
(
&
driver_template
,
sizeof
(
struct
dc390_acb
));
if
(
!
scsi_host
)
goto
nomem
;
pACB
=
(
PACB
)
scsi_host
->
hostdata
;
pACB
=
(
struct
dc390_acb
*
)
scsi_host
->
hostdata
;
if
(
dc390_CheckEEpromCheckSum
(
dev
,
dc390_adapterCnt
))
{
int
speed
;
...
...
@@ -1910,13 +1867,13 @@ static int __devinit dc390_init_one(struct pci_dev *dev,
printk
(
KERN_INFO
"DC390: Used defaults: AdaptID=%i, SpeedIdx=%i (%i.%i MHz),"
" DevMode=0x%02x, AdaptMode=0x%02x, TaggedCmnds=%i (%i), DelayReset=%is
\n
"
,
tmscsim
[
0
],
tmscsim
[
1
],
speed
/
10
,
speed
%
10
,
(
UCHAR
)
tmscsim
[
2
],
(
UCHAR
)
tmscsim
[
3
],
tmscsim
[
4
],
2
<<
(
tmscsim
[
4
]),
tmscsim
[
5
]);
(
u8
)
tmscsim
[
2
],
(
u8
)
tmscsim
[
3
],
tmscsim
[
4
],
2
<<
(
tmscsim
[
4
]),
tmscsim
[
5
]);
}
else
{
dc390_check_for_safe_settings
();
dc390_EEprom_Override
(
dc390_adapterCnt
);
}
DEBUG0
(
printk
(
KERN_INFO
"DC390: pSH = %8x, Index %02i
\n
"
,
(
UINT
)
scsi_host
,
dc390_adapterCnt
));
DEBUG0
(
printk
(
KERN_INFO
"DC390: pSH = %8x, Index %02i
\n
"
,
(
u32
)
scsi_host
,
dc390_adapterCnt
));
dc390_initACB
(
scsi_host
,
io_port
,
irq
,
dc390_adapterCnt
);
...
...
@@ -1959,7 +1916,7 @@ static void __devexit dc390_remove_one(struct pci_dev *dev)
{
struct
Scsi_Host
*
scsi_host
=
pci_get_drvdata
(
dev
);
unsigned
long
iflags
;
PACB
pACB
=
(
PACB
)
scsi_host
->
hostdata
;
struct
dc390_acb
*
pACB
=
(
struct
dc390_acb
*
)
scsi_host
->
hostdata
;
u8
bval
;
scsi_remove_host
(
scsi_host
);
...
...
@@ -2014,19 +1971,19 @@ static int DC390_proc_info (struct Scsi_Host *shpnt, char *buffer, char **start,
{
int
dev
,
spd
,
spd1
;
char
*
pos
=
buffer
;
PACB
pACB
;
PDCB
pDCB
;
struct
dc390_acb
*
pACB
;
struct
dc390_dcb
*
pDCB
;
pACB
=
dc390_pACB_start
;
while
(
pACB
!=
(
PACB
)
-
1
)
while
(
pACB
!=
(
struct
dc390_acb
*
)
-
1
)
{
if
(
shpnt
==
pACB
->
pScsiHost
)
break
;
pACB
=
pACB
->
pNextACB
;
}
if
(
pACB
==
(
PACB
)
-
1
)
return
(
-
ESRCH
);
if
(
pACB
==
(
struct
dc390_acb
*
)
-
1
)
return
(
-
ESRCH
);
if
(
inout
)
/* Has data been written to the file ? */
return
-
ENOSYS
;
...
...
@@ -2087,7 +2044,7 @@ static int DC390_proc_info (struct Scsi_Host *shpnt, char *buffer, char **start,
for
(
dev
=
0
;
dev
<
pACB
->
DCBCnt
;
dev
++
)
{
PSRB
pSRB
;
struct
dc390_srb
*
pSRB
;
if
(
pDCB
->
WaitSRBCnt
)
SPRINTF
(
"DCB (%02i-%i): Waiting: %i:"
,
pDCB
->
TargetID
,
pDCB
->
TargetLUN
,
pDCB
->
WaitSRBCnt
);
...
...
drivers/scsi/tmscsim.h
View file @
f4e7ddb6
...
...
@@ -29,215 +29,167 @@ typedef u16 USHORT; /* 16 bits */
typedef
u32
UINT
;
/* 32 bits */
typedef
unsigned
long
ULONG
;
/* 32/64 bits */
typedef
UCHAR
*
PUCHAR
;
typedef
USHORT
*
PUSHORT
;
typedef
UINT
*
PUINT
;
typedef
ULONG
*
PULONG
;
typedef
Scsi_Host_Template
*
PSHT
;
typedef
struct
Scsi_Host
*
PSH
;
typedef
Scsi_Device
*
PSCSIDEV
;
typedef
Scsi_Cmnd
*
PSCSICMD
;
typedef
void
*
PVOID
;
typedef
struct
scatterlist
*
PSGL
,
SGL
;
/*;-----------------------------------------------------------------------*/
typedef
struct
_SyncMsg
{
UCHAR
ExtendMsg
;
UCHAR
ExtMsgLen
;
UCHAR
SyncXferReq
;
UCHAR
Period
;
UCHAR
ReqOffset
;
}
SyncMsg
;
/*;-----------------------------------------------------------------------*/
typedef
struct
_Capacity
{
ULONG
BlockCount
;
ULONG
BlockLength
;
}
Capacity
;
/*;-----------------------------------------------------------------------*/
typedef
struct
_SGentry
{
ULONG
SGXferDataPtr
;
ULONG
SGXferDataLen
;
}
SGentry
;
typedef
struct
_SGentry1
{
ULONG
SGXLen
;
ULONG
SGXPtr
;
}
SGentry1
,
*
PSGE
;
/*
;-----------------------------------------------------------------------
; SCSI Request Block
;-----------------------------------------------------------------------
*/
struct
_SRB
struct
dc390_srb
{
//
UCHAR
CmdBlock[12];
//
u8
CmdBlock[12];
struct
_SRB
*
pNextSRB
;
struct
_DCB
*
pSRBDCB
;
PSCSICMD
pcmd
;
PSGL
pSegmentList
;
struct
dc390_srb
*
pNextSRB
;
struct
dc390_dcb
*
pSRBDCB
;
struct
scsi_cmnd
*
pcmd
;
struct
scatterlist
*
pSegmentList
;
/* 0x10: */
SGL
Segmentx
;
/* make a one entry of S/G list table */
struct
scatterlist
Segmentx
;
/* make a one entry of S/G list table */
/* 0x1c: */
ULONG
SGBusAddr
;
/*;a segment starting address as seen by AM53C974A*/
ULONG
SGToBeXferLen
;
/*; to be xfer length */
ULONG
TotalXferredLen
;
ULONG
SavedTotXLen
;
UINT
SRBState
;
unsigned
long
SGBusAddr
;
/*;a segment starting address as seen by AM53C974A*/
unsigned
long
SGToBeXferLen
;
/*; to be xfer length */
unsigned
long
TotalXferredLen
;
unsigned
long
SavedTotXLen
;
u32
SRBState
;
/* 0x30: */
UCHAR
SRBStatus
;
UCHAR
SRBFlag
;
/*; b0-AutoReqSense,b6-Read,b7-write */
u8
SRBStatus
;
u8
SRBFlag
;
/*; b0-AutoReqSense,b6-Read,b7-write */
/*; b4-settimeout,b5-Residual valid */
UCHAR
AdaptStatus
;
UCHAR
TargetStatus
;
u8
AdaptStatus
;
u8
TargetStatus
;
UCHAR
ScsiPhase
;
UCHAR
TagNumber
;
UCHAR
SGIndex
;
UCHAR
SGcount
;
u8
ScsiPhase
;
u8
TagNumber
;
u8
SGIndex
;
u8
SGcount
;
/* 0x38: */
UCHAR
MsgCnt
;
UCHAR
EndMessage
;
UCHAR
RetryCnt
;
UCHAR
SavedSGCount
;
u8
MsgCnt
;
u8
EndMessage
;
u8
RetryCnt
;
u8
SavedSGCount
;
ULONG
Saved_Ptr
;
unsigned
long
Saved_Ptr
;
/* 0x40: */
UCHAR
MsgInBuf
[
6
];
UCHAR
MsgOutBuf
[
6
];
u8
MsgInBuf
[
6
];
u8
MsgOutBuf
[
6
];
//
UCHAR
IORBFlag; /*;81h-Reset, 2-retry */
//
u8
IORBFlag; /*;81h-Reset, 2-retry */
/* 0x4c: */
};
typedef
struct
_SRB
DC390_SRB
,
*
PSRB
;
/*
;-----------------------------------------------------------------------
; Device Control Block
;-----------------------------------------------------------------------
*/
struct
_DCB
struct
dc390_dcb
{
struct
_DCB
*
pNextDCB
;
struct
_ACB
*
pDCBACB
;
/* Aborted Commands */
//PSCSICMD AboIORBhead;
//PSCSICMD AboIORBtail;
//ULONG AboIORBcnt;
struct
dc390_dcb
*
pNextDCB
;
struct
dc390_acb
*
pDCBACB
;
/* 0x08: */
/* Queued SRBs */
PSRB
pWaitingSRB
;
PSRB
pWaitLast
;
PSRB
pGoingSRB
;
PSRB
pGoingLast
;
PSRB
pActiveSRB
;
UCHAR
WaitSRBCnt
;
/* Not used */
UCHAR
GoingSRBCnt
;
struct
dc390_srb
*
pWaitingSRB
;
struct
dc390_srb
*
pWaitLast
;
struct
dc390_srb
*
pGoingSRB
;
struct
dc390_srb
*
pGoingLast
;
struct
dc390_srb
*
pActiveSRB
;
u8
WaitSRBCnt
;
/* Not used */
u8
GoingSRBCnt
;
UCHAR
DevType
;
UCHAR
MaxCommand
;
u8
DevType
;
u8
MaxCommand
;
/* 0x20: */
UINT
TagMask
;
u32
TagMask
;
UCHAR
TargetID
;
/*; SCSI Target ID (SCSI Only) */
UCHAR
TargetLUN
;
/*; SCSI Log. Unit (SCSI Only) */
UCHAR
DevMode
;
UCHAR
DCBFlag
;
u8
TargetID
;
/*; SCSI Target ID (SCSI Only) */
u8
TargetLUN
;
/*; SCSI Log. Unit (SCSI Only) */
u8
DevMode
;
u8
DCBFlag
;
UCHAR
CtrlR1
;
UCHAR
CtrlR3
;
UCHAR
CtrlR4
;
UCHAR
Inquiry7
;
u8
CtrlR1
;
u8
CtrlR3
;
u8
CtrlR4
;
u8
Inquiry7
;
/* 0x2c: */
UCHAR
SyncMode
;
/*; 0:async mode */
UCHAR
NegoPeriod
;
/*;for nego. */
UCHAR
SyncPeriod
;
/*;for reg. */
UCHAR
SyncOffset
;
/*;for reg. and nego.(low nibble) */
u8
SyncMode
;
/*; 0:async mode */
u8
NegoPeriod
;
/*;for nego. */
u8
SyncPeriod
;
/*;for reg. */
u8
SyncOffset
;
/*;for reg. and nego.(low nibble) */
/* 0x30:*/
//
UCHAR
InqDataBuf[8];
//
UCHAR
CapacityBuf[8];
//
u8
InqDataBuf[8];
//
u8
CapacityBuf[8];
///* 0x40: */
};
typedef
struct
_DCB
DC390_DCB
,
*
PDCB
;
/*
;-----------------------------------------------------------------------
; Adapter Control Block
;-----------------------------------------------------------------------
*/
struct
_ACB
struct
dc390_acb
{
PSH
pScsiHost
;
struct
_ACB
*
pNextACB
;
USHORT
IOPortBase
;
UCHAR
IRQLevel
;
UCHAR
status
;
UCHAR
SRBCount
;
UCHAR
AdapterIndex
;
/*; nth Adapter this driver */
UCHAR
DCBCnt
;
UCHAR
TagMaxNum
;
UCHAR
ACBFlag
;
UCHAR
Gmode2
;
UCHAR
scan_devices
;
PDCB
pLinkDCB
;
PDCB
pLastDCB
;
PDCB
pDCBRunRobin
;
PDCB
pActiveDCB
;
PSRB
pFreeSRB
;
PSRB
pTmpSRB
;
UCHAR
msgin123
[
4
];
UCHAR
DCBmap
[
MAX_SCSI_ID
];
UCHAR
Connected
;
UCHAR
pad
;
struct
Scsi_Host
*
pScsiHost
;
struct
dc390_acb
*
pNextACB
;
u16
IOPortBase
;
u8
IRQLevel
;
u8
status
;
u8
SRBCount
;
u8
AdapterIndex
;
/*; nth Adapter this driver */
u8
DCBCnt
;
u8
TagMaxNum
;
u8
ACBFlag
;
u8
Gmode2
;
u8
scan_devices
;
struct
dc390_dcb
*
pLinkDCB
;
struct
dc390_dcb
*
pLastDCB
;
struct
dc390_dcb
*
pDCBRunRobin
;
struct
dc390_dcb
*
pActiveDCB
;
struct
dc390_srb
*
pFreeSRB
;
struct
dc390_srb
*
pTmpSRB
;
u8
msgin123
[
4
];
u8
DCBmap
[
MAX_SCSI_ID
];
u8
Connected
;
u8
pad
;
#if defined(USE_SPINLOCKS) && USE_SPINLOCKS > 1 && (defined(CONFIG_SMP) || DEBUG_SPINLOCKS > 0)
spinlock_t
lock
;
#endif
UCHAR
sel_timeout
;
UCHAR
glitch_cfg
;
u8
sel_timeout
;
u8
glitch_cfg
;
UCHAR
MsgLen
;
UCHAR
Ignore_IRQ
;
/* Not used */
u8
MsgLen
;
u8
Ignore_IRQ
;
/* Not used */
PDEVDECL1
;
/* Pointer to PCI cfg. space */
struct
pci_dev
*
pdev
;
ULONG
Cmds
;
UINT
SelLost
;
UINT
SelConn
;
UINT
CmdInQ
;
UINT
CmdOutOfSRB
;
unsigned
long
Cmds
;
u32
SelLost
;
u32
SelConn
;
u32
CmdInQ
;
u32
CmdOutOfSRB
;
struct
timer_list
Waiting_Timer
;
DC390_SRB
TmpSRB
;
DC390_SRB
SRB_array
[
MAX_SRB_CNT
];
/* 50 SRBs */
struct
dc390_srb
TmpSRB
;
struct
dc390_srb
SRB_array
[
MAX_SRB_CNT
];
/* 50 SRBs */
};
typedef
struct
_ACB
DC390_ACB
,
*
PACB
;
/*;-----------------------------------------------------------------------*/
...
...
@@ -402,17 +354,17 @@ typedef struct {
typedef
struct
_SCSIInqData
{
/* INQUIRY */
UCHAR
DevType
;
/* Periph Qualifier & Periph Dev Type*/
UCHAR
RMB_TypeMod
;
/* rem media bit & Dev Type Modifier */
UCHAR
Vers
;
/* ISO, ECMA, & ANSI versions */
UCHAR
RDF
;
/* AEN, TRMIOP, & response data format*/
UCHAR
AddLen
;
/* length of additional data */
UCHAR
Res1
;
/* reserved */
UCHAR
Res2
;
/* reserved */
UCHAR
Flags
;
/* RelADr,Wbus32,Wbus16,Sync,etc. */
UCHAR
VendorID
[
8
];
/* Vendor Identification */
UCHAR
ProductID
[
16
];
/* Product Identification */
UCHAR
ProductRev
[
4
];
/* Product Revision */
u8
DevType
;
/* Periph Qualifier & Periph Dev Type*/
u8
RMB_TypeMod
;
/* rem media bit & Dev Type Modifier */
u8
Vers
;
/* ISO, ECMA, & ANSI versions */
u8
RDF
;
/* AEN, TRMIOP, & response data format*/
u8
AddLen
;
/* length of additional data */
u8
Res1
;
/* reserved */
u8
Res2
;
/* reserved */
u8
Flags
;
/* RelADr,Wbus32,Wbus16,Sync,etc. */
u8
VendorID
[
8
];
/* Vendor Identification */
u8
ProductID
[
16
];
/* Product Identification */
u8
ProductRev
[
4
];
/* Product Revision */
}
SCSI_INQDATA
,
*
PSCSI_INQDATA
;
...
...
@@ -461,10 +413,10 @@ typedef struct _SCSIInqData { /* INQUIRY */
*/
typedef
struct
_EEprom
{
UCHAR
EE_MODE1
;
UCHAR
EE_SPEED
;
UCHAR
xx1
;
UCHAR
xx2
;
u8
EE_MODE1
;
u8
EE_SPEED
;
u8
xx1
;
u8
xx2
;
}
EEprom
,
*
PEEprom
;
#define REAL_EE_ADAPT_SCSI_ID 64
...
...
@@ -676,7 +628,7 @@ UCHAR xx2;
(inb (pACB->IOPortBase + (address)))
#define DC390_read8_(address, base) \
(inb ((
USHORT
)(base) + (address)))
(inb ((
u16
)(base) + (address)))
#define DC390_read16(address) \
(inw (pACB->IOPortBase + (address)))
...
...
@@ -688,7 +640,7 @@ UCHAR xx2;
outb ((value), pACB->IOPortBase + (address))
#define DC390_write8_(address,value,base) \
outb ((value), (
USHORT
)(base) + (address))
outb ((value), (
u16
)(base) + (address))
#define DC390_write16(address,value) \
outw ((value), pACB->IOPortBase + (address))
...
...
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