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
nexedi
linux
Commits
974a9d19
Commit
974a9d19
authored
Feb 15, 2003
by
Russell King
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
[ARM] Update Acorn SCSI drivers
Update Acorn SCSI drivers for the recent SCSI device ID/Lun changes.
parent
eb36c22e
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
160 additions
and
119 deletions
+160
-119
drivers/acorn/scsi/acornscsi.c
drivers/acorn/scsi/acornscsi.c
+54
-54
drivers/acorn/scsi/fas216.c
drivers/acorn/scsi/fas216.c
+100
-59
drivers/acorn/scsi/queue.c
drivers/acorn/scsi/queue.c
+4
-4
drivers/acorn/scsi/scsi.h
drivers/acorn/scsi/scsi.h
+2
-2
No files found.
drivers/acorn/scsi/acornscsi.c
View file @
974a9d19
...
...
@@ -116,7 +116,7 @@
#ifdef DEBUG_TARGET
#define DBG(cmd,xxx...) \
if (cmd->
target
== DEBUG_TARGET) { \
if (cmd->
device->id
== DEBUG_TARGET) { \
xxx; \
}
#else
...
...
@@ -575,7 +575,7 @@ static
char
acornscsi_target
(
AS_Host
*
host
)
{
if
(
host
->
SCpnt
)
return
'0'
+
host
->
SCpnt
->
target
;
return
'0'
+
host
->
SCpnt
->
device
->
id
;
return
'H'
;
}
...
...
@@ -742,7 +742,7 @@ intr_ret_t acornscsi_kick(AS_Host *host)
* In this case, we don't want to write to the registers
*/
if
(
!
(
sbic_arm_read
(
host
->
scsi
.
io_port
,
ASR
)
&
(
ASR_INT
|
ASR_BSY
|
ASR_CIP
)))
{
sbic_arm_write
(
host
->
scsi
.
io_port
,
DESTID
,
SCpnt
->
target
);
sbic_arm_write
(
host
->
scsi
.
io_port
,
DESTID
,
SCpnt
->
device
->
id
);
sbic_arm_write
(
host
->
scsi
.
io_port
,
CMND
,
CMND_SELWITHATN
);
}
...
...
@@ -759,7 +759,7 @@ intr_ret_t acornscsi_kick(AS_Host *host)
#if (DEBUG & (DEBUG_ABORT|DEBUG_CONNECT))
DBG
(
SCpnt
,
printk
(
"scsi%d.%c: starting cmd %02X
\n
"
,
host
->
host
->
host_no
,
'0'
+
SCpnt
->
target
,
host
->
host
->
host_no
,
'0'
+
SCpnt
->
device
->
id
,
SCpnt
->
cmnd
[
0
]));
#endif
...
...
@@ -775,7 +775,7 @@ intr_ret_t acornscsi_kick(AS_Host *host)
SCpnt
->
tag
=
SCpnt
->
device
->
current_tag
;
}
else
#endif
set_bit
(
SCpnt
->
target
*
8
+
SCpnt
->
lun
,
host
->
busyluns
);
set_bit
(
SCpnt
->
device
->
id
*
8
+
SCpnt
->
device
->
lun
,
host
->
busyluns
);
host
->
stats
.
removes
+=
1
;
...
...
@@ -868,7 +868,7 @@ void acornscsi_done(AS_Host *host, Scsi_Cmnd **SCpntp, unsigned int result)
host
->
host
->
host_no
,
SCpnt
->
result
);
print_command
(
SCpnt
->
cmnd
);
acornscsi_dumpdma
(
host
,
"done"
);
acornscsi_dumplog
(
host
,
SCpnt
->
target
);
acornscsi_dumplog
(
host
,
SCpnt
->
device
->
id
);
SCpnt
->
result
&=
0xffff
;
SCpnt
->
result
|=
DID_ERROR
<<
16
;
}
...
...
@@ -878,7 +878,7 @@ void acornscsi_done(AS_Host *host, Scsi_Cmnd **SCpntp, unsigned int result)
if
(
!
SCpnt
->
scsi_done
)
panic
(
"scsi%d.H: null scsi_done function in acornscsi_done"
,
host
->
host
->
host_no
);
clear_bit
(
SCpnt
->
target
*
8
+
SCpnt
->
lun
,
host
->
busyluns
);
clear_bit
(
SCpnt
->
device
->
id
*
8
+
SCpnt
->
device
->
lun
,
host
->
busyluns
);
SCpnt
->
scsi_done
(
SCpnt
);
}
else
...
...
@@ -1035,7 +1035,7 @@ void acornscsi_dma_setup(AS_Host *host, dmadir_t direction)
if
(
direction
==
DMA_OUT
)
{
#if (DEBUG & DEBUG_NO_WRITE)
if
(
NO_WRITE
&
(
1
<<
host
->
SCpnt
->
target
))
{
if
(
NO_WRITE
&
(
1
<<
host
->
SCpnt
->
device
->
id
))
{
printk
(
KERN_CRIT
"scsi%d.%c: I can't handle DMA_OUT!
\n
"
,
host
->
host
->
host_no
,
acornscsi_target
(
host
));
return
;
...
...
@@ -1511,7 +1511,7 @@ void acornscsi_message(AS_Host *host)
if
(
host
->
scsi
.
phase
!=
PHASE_STATUSIN
)
{
printk
(
KERN_ERR
"scsi%d.%c: command complete following non-status in phase?
\n
"
,
host
->
host
->
host_no
,
acornscsi_target
(
host
));
acornscsi_dumplog
(
host
,
host
->
SCpnt
->
target
);
acornscsi_dumplog
(
host
,
host
->
SCpnt
->
device
->
id
);
}
host
->
scsi
.
phase
=
PHASE_DONE
;
host
->
scsi
.
SCp
.
Message
=
message
[
0
];
...
...
@@ -1567,8 +1567,8 @@ void acornscsi_message(AS_Host *host)
* transfer. Re-initiate sync transfer negociation now, and if
* we got a REJECT in response to SDTR, then it'll be set to DONE.
*/
if (host->device[host->SCpnt->
target
].sync_state == SYNC_SENT_REQUEST)
host->device[host->SCpnt->
target
].sync_state = SYNC_NEGOCIATE;
if (host->device[host->SCpnt->
device->id
].sync_state == SYNC_SENT_REQUEST)
host->device[host->SCpnt->
device->id
].sync_state = SYNC_NEGOCIATE;
#endif
/*
...
...
@@ -1591,7 +1591,7 @@ void acornscsi_message(AS_Host *host)
printk
(
KERN_NOTICE
"scsi%d.%c: disabling tagged queueing
\n
"
,
host
->
host
->
host_no
,
acornscsi_target
(
host
));
host
->
SCpnt
->
device
->
tagged_queue
=
0
;
set_bit
(
host
->
SCpnt
->
target
*
8
+
host
->
SCpnt
->
lun
,
host
->
busyluns
);
set_bit
(
host
->
SCpnt
->
device
->
id
*
8
+
host
->
SCpnt
->
device
->
lun
,
host
->
busyluns
);
break
;
#endif
case
EXTENDED_MESSAGE
|
(
EXTENDED_SDTR
<<
8
):
...
...
@@ -1600,9 +1600,9 @@ void acornscsi_message(AS_Host *host)
*/
printk
(
KERN_NOTICE
"scsi%d.%c: Using asynchronous transfer
\n
"
,
host
->
host
->
host_no
,
acornscsi_target
(
host
));
host
->
device
[
host
->
SCpnt
->
target
].
sync_xfer
=
SYNCHTRANSFER_2DBA
;
host
->
device
[
host
->
SCpnt
->
target
].
sync_state
=
SYNC_ASYNCHRONOUS
;
sbic_arm_write
(
host
->
scsi
.
io_port
,
SYNCHTRANSFER
,
host
->
device
[
host
->
SCpnt
->
target
].
sync_xfer
);
host
->
device
[
host
->
SCpnt
->
device
->
id
].
sync_xfer
=
SYNCHTRANSFER_2DBA
;
host
->
device
[
host
->
SCpnt
->
device
->
id
].
sync_state
=
SYNC_ASYNCHRONOUS
;
sbic_arm_write
(
host
->
scsi
.
io_port
,
SYNCHTRANSFER
,
host
->
device
[
host
->
SCpnt
->
device
->
id
].
sync_xfer
);
break
;
default:
...
...
@@ -1625,18 +1625,18 @@ void acornscsi_message(AS_Host *host)
switch
(
message
[
2
])
{
#ifdef CONFIG_SCSI_ACORNSCSI_SYNC
case
EXTENDED_SDTR
:
if
(
host
->
device
[
host
->
SCpnt
->
target
].
sync_state
==
SYNC_SENT_REQUEST
)
{
if
(
host
->
device
[
host
->
SCpnt
->
device
->
id
].
sync_state
==
SYNC_SENT_REQUEST
)
{
/*
* We requested synchronous transfers. This isn't quite right...
* We can only say if this succeeded if we proceed on to execute the
* command from this message. If we get a MESSAGE PARITY ERROR,
* and the target retries fail, then we fallback to asynchronous mode
*/
host
->
device
[
host
->
SCpnt
->
target
].
sync_state
=
SYNC_COMPLETED
;
host
->
device
[
host
->
SCpnt
->
device
->
id
].
sync_state
=
SYNC_COMPLETED
;
printk
(
KERN_NOTICE
"scsi%d.%c: Using synchronous transfer, offset %d, %d ns
\n
"
,
host
->
host
->
host_no
,
acornscsi_target
(
host
),
message
[
4
],
message
[
3
]
*
4
);
host
->
device
[
host
->
SCpnt
->
target
].
sync_xfer
=
host
->
device
[
host
->
SCpnt
->
device
->
id
].
sync_xfer
=
calc_sync_xfer
(
message
[
3
]
*
4
,
message
[
4
]);
}
else
{
unsigned
char
period
,
length
;
...
...
@@ -1649,10 +1649,10 @@ void acornscsi_message(AS_Host *host)
length
=
min_t
(
unsigned
int
,
message
[
4
],
sdtr_size
);
msgqueue_addmsg
(
&
host
->
scsi
.
msgs
,
5
,
EXTENDED_MESSAGE
,
3
,
EXTENDED_SDTR
,
period
,
length
);
host
->
device
[
host
->
SCpnt
->
target
].
sync_xfer
=
host
->
device
[
host
->
SCpnt
->
device
->
id
].
sync_xfer
=
calc_sync_xfer
(
period
*
4
,
length
);
}
sbic_arm_write
(
host
->
scsi
.
io_port
,
SYNCHTRANSFER
,
host
->
device
[
host
->
SCpnt
->
target
].
sync_xfer
);
sbic_arm_write
(
host
->
scsi
.
io_port
,
SYNCHTRANSFER
,
host
->
device
[
host
->
SCpnt
->
device
->
id
].
sync_xfer
);
break
;
#else
/* We do not accept synchronous transfers. Respond with a
...
...
@@ -1738,8 +1738,8 @@ void acornscsi_buildmessages(AS_Host *host)
#endif
msgqueue_addmsg
(
&
host
->
scsi
.
msgs
,
1
,
IDENTIFY
(
host
->
device
[
host
->
SCpnt
->
target
].
disconnect_ok
,
host
->
SCpnt
->
lun
));
IDENTIFY
(
host
->
device
[
host
->
SCpnt
->
device
->
id
].
disconnect_ok
,
host
->
SCpnt
->
device
->
lun
));
#if 0
/* does the device need the current command aborted */
...
...
@@ -1764,8 +1764,8 @@ void acornscsi_buildmessages(AS_Host *host)
#endif
#ifdef CONFIG_SCSI_ACORNSCSI_SYNC
if
(
host
->
device
[
host
->
SCpnt
->
target
].
sync_state
==
SYNC_NEGOCIATE
)
{
host
->
device
[
host
->
SCpnt
->
target
].
sync_state
=
SYNC_SENT_REQUEST
;
if
(
host
->
device
[
host
->
SCpnt
->
device
->
id
].
sync_state
==
SYNC_NEGOCIATE
)
{
host
->
device
[
host
->
SCpnt
->
device
->
id
].
sync_state
=
SYNC_SENT_REQUEST
;
msgqueue_addmsg
(
&
host
->
scsi
.
msgs
,
5
,
EXTENDED_MESSAGE
,
3
,
EXTENDED_SDTR
,
sdtr_period
/
4
,
sdtr_size
);
...
...
@@ -1792,7 +1792,7 @@ int acornscsi_starttransfer(AS_Host *host)
residual
=
host
->
SCpnt
->
request_bufflen
-
host
->
scsi
.
SCp
.
scsi_xferred
;
sbic_arm_write
(
host
->
scsi
.
io_port
,
SYNCHTRANSFER
,
host
->
device
[
host
->
SCpnt
->
target
].
sync_xfer
);
sbic_arm_write
(
host
->
scsi
.
io_port
,
SYNCHTRANSFER
,
host
->
device
[
host
->
SCpnt
->
device
->
id
].
sync_xfer
);
sbic_arm_writenext
(
host
->
scsi
.
io_port
,
residual
>>
16
);
sbic_arm_writenext
(
host
->
scsi
.
io_port
,
residual
>>
8
);
sbic_arm_writenext
(
host
->
scsi
.
io_port
,
residual
);
...
...
@@ -1828,7 +1828,7 @@ int acornscsi_reconnect(AS_Host *host)
if
(
host
->
SCpnt
&&
!
host
->
scsi
.
disconnectable
)
{
printk
(
KERN_ERR
"scsi%d.%d: reconnected while command in "
"progress to target %d?
\n
"
,
host
->
host
->
host_no
,
target
,
host
->
SCpnt
->
target
);
host
->
host
->
host_no
,
target
,
host
->
SCpnt
->
device
->
id
);
host
->
SCpnt
=
NULL
;
}
...
...
@@ -1839,7 +1839,7 @@ int acornscsi_reconnect(AS_Host *host)
host
->
scsi
.
reconnected
.
tag
=
0
;
if
(
host
->
scsi
.
disconnectable
&&
host
->
SCpnt
&&
host
->
SCpnt
->
target
==
target
&&
host
->
SCpnt
->
lun
==
lun
)
host
->
SCpnt
->
device
->
id
==
target
&&
host
->
SCpnt
->
device
->
lun
==
lun
)
ok
=
1
;
if
(
!
ok
&&
queue_probetgtlun
(
&
host
->
queues
.
disconnected
,
target
,
lun
))
...
...
@@ -1876,9 +1876,9 @@ int acornscsi_reconnect_finish(AS_Host *host)
{
if
(
host
->
scsi
.
disconnectable
&&
host
->
SCpnt
)
{
host
->
scsi
.
disconnectable
=
0
;
if
(
host
->
SCpnt
->
target
==
host
->
scsi
.
reconnected
.
target
&&
host
->
SCpnt
->
lun
==
host
->
scsi
.
reconnected
.
lun
&&
host
->
SCpnt
->
tag
==
host
->
scsi
.
reconnected
.
tag
)
{
if
(
host
->
SCpnt
->
device
->
id
==
host
->
scsi
.
reconnected
.
target
&&
host
->
SCpnt
->
device
->
lun
==
host
->
scsi
.
reconnected
.
lun
&&
host
->
SCpnt
->
tag
==
host
->
scsi
.
reconnected
.
tag
)
{
#if (DEBUG & (DEBUG_QUEUES|DEBUG_DISCON))
DBG
(
host
->
SCpnt
,
printk
(
"scsi%d.%c: reconnected"
,
host
->
host
->
host_no
,
acornscsi_target
(
host
)));
...
...
@@ -1992,7 +1992,7 @@ intr_ret_t acornscsi_sbicintr(AS_Host *host, int in_irq)
ADD_STATUS
(
8
,
ssr
,
host
->
scsi
.
phase
,
in_irq
);
if
(
host
->
SCpnt
&&
!
host
->
scsi
.
disconnectable
)
ADD_STATUS
(
host
->
SCpnt
->
target
,
ssr
,
host
->
scsi
.
phase
,
in_irq
);
ADD_STATUS
(
host
->
SCpnt
->
device
->
id
,
ssr
,
host
->
scsi
.
phase
,
in_irq
);
switch
(
ssr
)
{
case
0x00
:
/* reset state - not advanced */
...
...
@@ -2030,7 +2030,7 @@ intr_ret_t acornscsi_sbicintr(AS_Host *host, int in_irq)
break
;
ssr
=
sbic_arm_read
(
host
->
scsi
.
io_port
,
SSR
);
ADD_STATUS
(
8
,
ssr
,
host
->
scsi
.
phase
,
1
);
ADD_STATUS
(
host
->
SCpnt
->
target
,
ssr
,
host
->
scsi
.
phase
,
1
);
ADD_STATUS
(
host
->
SCpnt
->
device
->
id
,
ssr
,
host
->
scsi
.
phase
,
1
);
goto
connected
;
case
0x42
:
/* select timed out */
...
...
@@ -2049,7 +2049,7 @@ intr_ret_t acornscsi_sbicintr(AS_Host *host, int in_irq)
default:
printk
(
KERN_ERR
"scsi%d.%c: PHASE_CONNECTING, SSR %02X?
\n
"
,
host
->
host
->
host_no
,
acornscsi_target
(
host
),
ssr
);
acornscsi_dumplog
(
host
,
host
->
SCpnt
?
host
->
SCpnt
->
target
:
8
);
acornscsi_dumplog
(
host
,
host
->
SCpnt
?
host
->
SCpnt
->
device
->
id
:
8
);
acornscsi_abortcmd
(
host
,
host
->
SCpnt
->
tag
);
}
return
INTR_PROCESSING
;
...
...
@@ -2085,7 +2085,7 @@ intr_ret_t acornscsi_sbicintr(AS_Host *host, int in_irq)
default:
printk
(
KERN_ERR
"scsi%d.%c: PHASE_CONNECTED, SSR %02X?
\n
"
,
host
->
host
->
host_no
,
acornscsi_target
(
host
),
ssr
);
acornscsi_dumplog
(
host
,
host
->
SCpnt
?
host
->
SCpnt
->
target
:
8
);
acornscsi_dumplog
(
host
,
host
->
SCpnt
?
host
->
SCpnt
->
device
->
id
:
8
);
acornscsi_abortcmd
(
host
,
host
->
SCpnt
->
tag
);
}
return
INTR_PROCESSING
;
...
...
@@ -2123,7 +2123,7 @@ intr_ret_t acornscsi_sbicintr(AS_Host *host, int in_irq)
default:
printk
(
KERN_ERR
"scsi%d.%c: PHASE_MSGOUT, SSR %02X?
\n
"
,
host
->
host
->
host_no
,
acornscsi_target
(
host
),
ssr
);
acornscsi_dumplog
(
host
,
host
->
SCpnt
?
host
->
SCpnt
->
target
:
8
);
acornscsi_dumplog
(
host
,
host
->
SCpnt
?
host
->
SCpnt
->
device
->
id
:
8
);
}
return
INTR_PROCESSING
;
...
...
@@ -2168,7 +2168,7 @@ intr_ret_t acornscsi_sbicintr(AS_Host *host, int in_irq)
default:
printk
(
KERN_ERR
"scsi%d.%c: PHASE_COMMAND, SSR %02X?
\n
"
,
host
->
host
->
host_no
,
acornscsi_target
(
host
),
ssr
);
acornscsi_dumplog
(
host
,
host
->
SCpnt
?
host
->
SCpnt
->
target
:
8
);
acornscsi_dumplog
(
host
,
host
->
SCpnt
?
host
->
SCpnt
->
device
->
id
:
8
);
}
return
INTR_PROCESSING
;
...
...
@@ -2181,7 +2181,7 @@ intr_ret_t acornscsi_sbicintr(AS_Host *host, int in_irq)
}
else
{
printk
(
KERN_ERR
"scsi%d.%c: PHASE_DISCONNECT, SSR %02X instead of disconnect?
\n
"
,
host
->
host
->
host_no
,
acornscsi_target
(
host
),
ssr
);
acornscsi_dumplog
(
host
,
host
->
SCpnt
?
host
->
SCpnt
->
target
:
8
);
acornscsi_dumplog
(
host
,
host
->
SCpnt
?
host
->
SCpnt
->
device
->
id
:
8
);
}
return
INTR_NEXT_COMMAND
;
...
...
@@ -2191,7 +2191,7 @@ intr_ret_t acornscsi_sbicintr(AS_Host *host, int in_irq)
else
{
printk
(
KERN_ERR
"scsi%d.%c: PHASE_IDLE, SSR %02X while idle?
\n
"
,
host
->
host
->
host_no
,
acornscsi_target
(
host
),
ssr
);
acornscsi_dumplog
(
host
,
host
->
SCpnt
?
host
->
SCpnt
->
target
:
8
);
acornscsi_dumplog
(
host
,
host
->
SCpnt
?
host
->
SCpnt
->
device
->
id
:
8
);
}
return
INTR_PROCESSING
;
...
...
@@ -2206,7 +2206,7 @@ intr_ret_t acornscsi_sbicintr(AS_Host *host, int in_irq)
*/
if
(
ssr
!=
0x8f
&&
!
acornscsi_reconnect_finish
(
host
))
return
INTR_IDLE
;
ADD_STATUS
(
host
->
SCpnt
->
target
,
ssr
,
host
->
scsi
.
phase
,
in_irq
);
ADD_STATUS
(
host
->
SCpnt
->
device
->
id
,
ssr
,
host
->
scsi
.
phase
,
in_irq
);
switch
(
ssr
)
{
case
0x88
:
/* data out phase */
/* -> PHASE_DATAOUT */
...
...
@@ -2251,7 +2251,7 @@ intr_ret_t acornscsi_sbicintr(AS_Host *host, int in_irq)
default:
printk
(
KERN_ERR
"scsi%d.%c: PHASE_RECONNECTED, SSR %02X after reconnect?
\n
"
,
host
->
host
->
host_no
,
acornscsi_target
(
host
),
ssr
);
acornscsi_dumplog
(
host
,
host
->
SCpnt
?
host
->
SCpnt
->
target
:
8
);
acornscsi_dumplog
(
host
,
host
->
SCpnt
?
host
->
SCpnt
->
device
->
id
:
8
);
}
return
INTR_PROCESSING
;
...
...
@@ -2300,7 +2300,7 @@ intr_ret_t acornscsi_sbicintr(AS_Host *host, int in_irq)
default:
printk
(
KERN_ERR
"scsi%d.%c: PHASE_DATAIN, SSR %02X?
\n
"
,
host
->
host
->
host_no
,
acornscsi_target
(
host
),
ssr
);
acornscsi_dumplog
(
host
,
host
->
SCpnt
?
host
->
SCpnt
->
target
:
8
);
acornscsi_dumplog
(
host
,
host
->
SCpnt
?
host
->
SCpnt
->
device
->
id
:
8
);
}
return
INTR_PROCESSING
;
...
...
@@ -2352,7 +2352,7 @@ intr_ret_t acornscsi_sbicintr(AS_Host *host, int in_irq)
default:
printk
(
KERN_ERR
"scsi%d.%c: PHASE_DATAOUT, SSR %02X?
\n
"
,
host
->
host
->
host_no
,
acornscsi_target
(
host
),
ssr
);
acornscsi_dumplog
(
host
,
host
->
SCpnt
?
host
->
SCpnt
->
target
:
8
);
acornscsi_dumplog
(
host
,
host
->
SCpnt
?
host
->
SCpnt
->
device
->
id
:
8
);
}
return
INTR_PROCESSING
;
...
...
@@ -2373,7 +2373,7 @@ intr_ret_t acornscsi_sbicintr(AS_Host *host, int in_irq)
default:
printk
(
KERN_ERR
"scsi%d.%c: PHASE_STATUSIN, SSR %02X instead of MESSAGE_IN?
\n
"
,
host
->
host
->
host_no
,
acornscsi_target
(
host
),
ssr
);
acornscsi_dumplog
(
host
,
host
->
SCpnt
?
host
->
SCpnt
->
target
:
8
);
acornscsi_dumplog
(
host
,
host
->
SCpnt
?
host
->
SCpnt
->
device
->
id
:
8
);
}
return
INTR_PROCESSING
;
...
...
@@ -2396,14 +2396,14 @@ intr_ret_t acornscsi_sbicintr(AS_Host *host, int in_irq)
case
0x85
:
printk
(
"scsi%d.%c: strange message in disconnection
\n
"
,
host
->
host
->
host_no
,
acornscsi_target
(
host
));
acornscsi_dumplog
(
host
,
host
->
SCpnt
?
host
->
SCpnt
->
target
:
8
);
acornscsi_dumplog
(
host
,
host
->
SCpnt
?
host
->
SCpnt
->
device
->
id
:
8
);
acornscsi_done
(
host
,
&
host
->
SCpnt
,
DID_ERROR
);
break
;
default:
printk
(
KERN_ERR
"scsi%d.%c: PHASE_MSGIN, SSR %02X after message in?
\n
"
,
host
->
host
->
host_no
,
acornscsi_target
(
host
),
ssr
);
acornscsi_dumplog
(
host
,
host
->
SCpnt
?
host
->
SCpnt
->
target
:
8
);
acornscsi_dumplog
(
host
,
host
->
SCpnt
?
host
->
SCpnt
->
device
->
id
:
8
);
}
return
INTR_PROCESSING
;
...
...
@@ -2421,7 +2421,7 @@ intr_ret_t acornscsi_sbicintr(AS_Host *host, int in_irq)
default:
printk
(
KERN_ERR
"scsi%d.%c: PHASE_DONE, SSR %02X instead of disconnect?
\n
"
,
host
->
host
->
host_no
,
acornscsi_target
(
host
),
ssr
);
acornscsi_dumplog
(
host
,
host
->
SCpnt
?
host
->
SCpnt
->
target
:
8
);
acornscsi_dumplog
(
host
,
host
->
SCpnt
?
host
->
SCpnt
->
device
->
id
:
8
);
}
return
INTR_PROCESSING
;
...
...
@@ -2447,14 +2447,14 @@ intr_ret_t acornscsi_sbicintr(AS_Host *host, int in_irq)
default:
printk
(
KERN_ERR
"scsi%d.%c: PHASE_ABORTED, SSR %02X?
\n
"
,
host
->
host
->
host_no
,
acornscsi_target
(
host
),
ssr
);
acornscsi_dumplog
(
host
,
host
->
SCpnt
?
host
->
SCpnt
->
target
:
8
);
acornscsi_dumplog
(
host
,
host
->
SCpnt
?
host
->
SCpnt
->
device
->
id
:
8
);
}
return
INTR_PROCESSING
;
default:
printk
(
KERN_ERR
"scsi%d.%c: unknown driver phase %d
\n
"
,
host
->
host
->
host_no
,
acornscsi_target
(
host
),
ssr
);
acornscsi_dumplog
(
host
,
host
->
SCpnt
?
host
->
SCpnt
->
target
:
8
);
acornscsi_dumplog
(
host
,
host
->
SCpnt
?
host
->
SCpnt
->
device
->
id
:
8
);
}
return
INTR_PROCESSING
;
}
...
...
@@ -2531,9 +2531,9 @@ int acornscsi_queuecmd(Scsi_Cmnd *SCpnt, void (*done)(Scsi_Cmnd *))
}
#if (DEBUG & DEBUG_NO_WRITE)
if
(
acornscsi_cmdtype
(
SCpnt
->
cmnd
[
0
])
==
CMD_WRITE
&&
(
NO_WRITE
&
(
1
<<
SCpnt
->
target
)))
{
if
(
acornscsi_cmdtype
(
SCpnt
->
cmnd
[
0
])
==
CMD_WRITE
&&
(
NO_WRITE
&
(
1
<<
SCpnt
->
device
->
id
)))
{
printk
(
KERN_CRIT
"scsi%d.%c: WRITE attempted with NO_WRITE flag set
\n
"
,
SCpnt
->
host
->
host_no
,
'0'
+
SCpnt
->
target
);
SCpnt
->
host
->
host_no
,
'0'
+
SCpnt
->
device
->
id
);
SCpnt
->
result
=
DID_NO_CONNECT
<<
16
;
done
(
SCpnt
);
return
0
;
...
...
@@ -2708,7 +2708,7 @@ int acornscsi_abort(Scsi_Cmnd *SCpnt)
printk
(
KERN_WARNING
"acornscsi_abort: "
);
print_sbic_status
(
asr
,
ssr
,
host
->
scsi
.
phase
);
acornscsi_dumplog
(
host
,
SCpnt
->
target
);
acornscsi_dumplog
(
host
,
SCpnt
->
device
->
id
);
}
#endif
...
...
@@ -2724,7 +2724,7 @@ int acornscsi_abort(Scsi_Cmnd *SCpnt)
//#if (DEBUG & DEBUG_ABORT)
printk
(
"clear "
);
//#endif
clear_bit
(
SCpnt
->
target
*
8
+
SCpnt
->
lun
,
host
->
busyluns
);
clear_bit
(
SCpnt
->
device
->
id
*
8
+
SCpnt
->
device
->
lun
,
host
->
busyluns
);
/*
* We found the command, and cleared it out. Either
...
...
@@ -2758,7 +2758,7 @@ int acornscsi_abort(Scsi_Cmnd *SCpnt)
*/
default:
case
res_not_running
:
acornscsi_dumplog
(
host
,
SCpnt
->
target
);
acornscsi_dumplog
(
host
,
SCpnt
->
device
->
id
);
#if (DEBUG & DEBUG_ABORT)
result
=
SCSI_ABORT_SNOOZE
;
#else
...
...
@@ -2796,7 +2796,7 @@ int acornscsi_reset(Scsi_Cmnd *SCpnt, unsigned int reset_flags)
printk
(
KERN_WARNING
"acornscsi_reset: "
);
print_sbic_status
(
asr
,
ssr
,
host
->
scsi
.
phase
);
acornscsi_dumplog
(
host
,
SCpnt
->
target
);
acornscsi_dumplog
(
host
,
SCpnt
->
device
->
id
);
}
#endif
...
...
drivers/acorn/scsi/fas216.c
View file @
974a9d19
...
...
@@ -96,6 +96,47 @@
static
int
level_mask
=
LOG_ERROR
;
static
int
__init
fas216_log_setup
(
char
*
str
)
{
char
*
s
;
level_mask
=
0
;
while
((
s
=
strsep
(
&
str
,
","
))
!=
NULL
)
{
switch
(
s
[
0
])
{
case
'a'
:
if
(
strcmp
(
s
,
"all"
)
==
0
)
level_mask
|=
-
1
;
break
;
case
'b'
:
if
(
strncmp
(
s
,
"bus"
,
3
)
==
0
)
level_mask
|=
LOG_BUSSERVICE
;
if
(
strncmp
(
s
,
"buf"
,
3
)
==
0
)
level_mask
|=
LOG_BUFFER
;
break
;
case
'c'
:
level_mask
|=
LOG_CONNECT
;
break
;
case
'e'
:
level_mask
|=
LOG_ERROR
;
break
;
case
'm'
:
level_mask
|=
LOG_MESSAGES
;
break
;
case
'n'
:
if
(
strcmp
(
s
,
"none"
)
==
0
)
level_mask
=
0
;
break
;
case
's'
:
level_mask
|=
LOG_FUNCTIONDONE
;
break
;
}
}
return
1
;
}
__setup
(
"fas216_logging="
,
fas216_log_setup
);
static
inline
unsigned
char
fas216_readb
(
FAS216_Info
*
info
,
unsigned
int
reg
)
{
unsigned
int
off
=
reg
<<
info
->
scsi
.
io_shift
;
...
...
@@ -244,7 +285,7 @@ static const char *fas216_drv_phase(FAS216_Info *info)
static
char
fas216_target
(
FAS216_Info
*
info
)
{
if
(
info
->
SCpnt
)
return
'0'
+
info
->
SCpnt
->
target
;
return
'0'
+
info
->
SCpnt
->
device
->
id
;
else
return
'H'
;
}
...
...
@@ -267,7 +308,7 @@ fas216_log_command(FAS216_Info *info, int level, Scsi_Cmnd *SCpnt, char *fmt, ..
return
;
va_start
(
args
,
fmt
);
fas216_do_log
(
info
,
'0'
+
SCpnt
->
target
,
fmt
,
args
);
fas216_do_log
(
info
,
'0'
+
SCpnt
->
device
->
id
,
fmt
,
args
);
va_end
(
args
);
printk
(
" CDB: "
);
...
...
@@ -495,7 +536,7 @@ static void fas216_set_sync(FAS216_Info *info, int target)
*/
static
void
fas216_handlesync
(
FAS216_Info
*
info
,
char
*
msg
)
{
struct
fas216_device
*
dev
=
&
info
->
device
[
info
->
SCpnt
->
target
];
struct
fas216_device
*
dev
=
&
info
->
device
[
info
->
SCpnt
->
device
->
id
];
enum
{
sync
,
async
,
none
,
reject
}
res
=
none
;
#ifdef SCSI2_SYNC
...
...
@@ -578,7 +619,7 @@ static void fas216_handlesync(FAS216_Info *info, char *msg)
dev
->
period
=
msg
[
3
];
dev
->
sof
=
msg
[
4
];
dev
->
stp
=
fas216_syncperiod
(
info
,
msg
[
3
]
*
4
);
fas216_set_sync
(
info
,
info
->
SCpnt
->
target
);
fas216_set_sync
(
info
,
info
->
SCpnt
->
device
->
id
);
break
;
case
reject
:
...
...
@@ -591,7 +632,7 @@ static void fas216_handlesync(FAS216_Info *info, char *msg)
dev
->
period
=
info
->
ifcfg
.
asyncperiod
/
4
;
dev
->
sof
=
0
;
dev
->
stp
=
info
->
scsi
.
async_stp
;
fas216_set_sync
(
info
,
info
->
SCpnt
->
target
);
fas216_set_sync
(
info
,
info
->
SCpnt
->
device
->
id
);
break
;
case
none
:
...
...
@@ -608,7 +649,7 @@ static void fas216_handlesync(FAS216_Info *info, char *msg)
*/
static
void
fas216_handlewide
(
FAS216_Info
*
info
,
char
*
msg
)
{
struct
fas216_device
*
dev
=
&
info
->
device
[
info
->
SCpnt
->
target
];
struct
fas216_device
*
dev
=
&
info
->
device
[
info
->
SCpnt
->
device
->
id
];
enum
{
wide
,
bit8
,
none
,
reject
}
res
=
none
;
#ifdef SCSI2_WIDE
...
...
@@ -725,7 +766,7 @@ static void fas216_updateptrs(FAS216_Info *info, int bytes_transferred)
bytes_transferred
-=
SCp
->
this_residual
;
if
(
!
next_SCp
(
SCp
)
&&
bytes_transferred
)
{
printk
(
KERN_WARNING
"scsi%d.%c: out of buffers
\n
"
,
info
->
host
->
host_no
,
'0'
+
info
->
SCpnt
->
target
);
info
->
host
->
host_no
,
'0'
+
info
->
SCpnt
->
device
->
id
);
return
;
}
}
...
...
@@ -848,7 +889,7 @@ static void fas216_transfer(FAS216_Info *info)
* use DMA mode. If we are using asynchronous transfers, we may
* use DMA mode or PIO mode.
*/
if
(
info
->
device
[
info
->
SCpnt
->
target
].
sof
)
if
(
info
->
device
[
info
->
SCpnt
->
device
->
id
].
sof
)
dmatype
=
fasdma_real_all
;
else
dmatype
=
fasdma_pio
;
...
...
@@ -1023,10 +1064,10 @@ fas216_reselected_intr(FAS216_Info *info)
info
->
origSCpnt
=
SCpnt
;
info
->
SCpnt
=
NULL
;
if
(
info
->
device
[
SCpnt
->
target
].
wide_state
==
neg_inprogress
)
info
->
device
[
SCpnt
->
target
].
wide_state
=
neg_wait
;
if
(
info
->
device
[
SCpnt
->
target
].
sync_state
==
neg_inprogress
)
info
->
device
[
SCpnt
->
target
].
sync_state
=
neg_wait
;
if
(
info
->
device
[
SCpnt
->
device
->
id
].
wide_state
==
neg_inprogress
)
info
->
device
[
SCpnt
->
device
->
id
].
wide_state
=
neg_wait
;
if
(
info
->
device
[
SCpnt
->
device
->
id
].
sync_state
==
neg_inprogress
)
info
->
device
[
SCpnt
->
device
->
id
].
sync_state
=
neg_wait
;
}
fas216_log
(
info
,
LOG_CONNECT
,
"reconnect phase=%02X"
,
info
->
scsi
.
phase
);
...
...
@@ -1073,7 +1114,7 @@ fas216_reselected_intr(FAS216_Info *info)
ok
=
0
;
if
(
info
->
scsi
.
disconnectable
&&
info
->
SCpnt
&&
info
->
SCpnt
->
target
==
target
&&
info
->
SCpnt
->
lun
==
identify_msg
)
info
->
SCpnt
->
device
->
id
==
target
&&
info
->
SCpnt
->
device
->
lun
==
identify_msg
)
ok
=
1
;
if
(
!
ok
&&
queue_probetgtlun
(
&
info
->
queues
.
disconnected
,
target
,
identify_msg
))
...
...
@@ -1118,15 +1159,15 @@ fas216_finish_reconnect(FAS216_Info *info)
fas216_checkmagic
(
info
);
fas216_log
(
info
,
LOG_CONNECT
,
"Connected: %1x %1x %02x, reconnected: %1x %1x %02x"
,
info
->
SCpnt
->
target
,
info
->
SCpnt
->
lun
,
info
->
SCpnt
->
tag
,
info
->
SCpnt
->
device
->
id
,
info
->
SCpnt
->
device
->
lun
,
info
->
SCpnt
->
tag
,
info
->
scsi
.
reconnected
.
target
,
info
->
scsi
.
reconnected
.
lun
,
info
->
scsi
.
reconnected
.
tag
);
if
(
info
->
scsi
.
disconnectable
&&
info
->
SCpnt
)
{
info
->
scsi
.
disconnectable
=
0
;
if
(
info
->
SCpnt
->
target
==
info
->
scsi
.
reconnected
.
target
&&
info
->
SCpnt
->
lun
==
info
->
scsi
.
reconnected
.
lun
&&
info
->
SCpnt
->
tag
==
info
->
scsi
.
reconnected
.
tag
)
{
if
(
info
->
SCpnt
->
device
->
id
==
info
->
scsi
.
reconnected
.
target
&&
info
->
SCpnt
->
device
->
lun
==
info
->
scsi
.
reconnected
.
lun
&&
info
->
SCpnt
->
tag
==
info
->
scsi
.
reconnected
.
tag
)
{
fas216_log
(
info
,
LOG_CONNECT
,
"reconnected"
);
}
else
{
queue_add_cmd_tail
(
&
info
->
queues
.
disconnected
,
info
->
SCpnt
);
...
...
@@ -1617,13 +1658,13 @@ static void fas216_busservice_intr(FAS216_Info *info, unsigned int stat, unsigne
* set of messages. If we have more than one byte to
* send, we need to assert ATN again.
*/
if
(
info
->
device
[
info
->
SCpnt
->
target
].
parity_check
)
{
if
(
info
->
device
[
info
->
SCpnt
->
device
->
id
].
parity_check
)
{
/*
* We were testing... good, the device
* supports parity checking.
*/
info
->
device
[
info
->
SCpnt
->
target
].
parity_check
=
0
;
info
->
device
[
info
->
SCpnt
->
target
].
parity_enabled
=
1
;
info
->
device
[
info
->
SCpnt
->
device
->
id
].
parity_check
=
0
;
info
->
device
[
info
->
SCpnt
->
device
->
id
].
parity_enabled
=
1
;
fas216_writeb
(
info
,
REG_CNTL1
,
info
->
scsi
.
cfg
[
0
]);
}
...
...
@@ -1831,11 +1872,11 @@ static void __fas216_start_command(FAS216_Info *info, Scsi_Cmnd *SCpnt)
fas216_cmd
(
info
,
CMD_FLUSHFIFO
);
/* load bus-id and timeout */
fas216_writeb
(
info
,
REG_SDID
,
BUSID
(
SCpnt
->
target
));
fas216_writeb
(
info
,
REG_SDID
,
BUSID
(
SCpnt
->
device
->
id
));
fas216_writeb
(
info
,
REG_STIM
,
info
->
ifcfg
.
select_timeout
);
/* synchronous transfers */
fas216_set_sync
(
info
,
SCpnt
->
target
);
fas216_set_sync
(
info
,
SCpnt
->
device
->
id
);
tot_msglen
=
msgqueue_msglength
(
&
info
->
scsi
.
msgs
);
...
...
@@ -1845,7 +1886,7 @@ static void __fas216_start_command(FAS216_Info *info, Scsi_Cmnd *SCpnt)
int
msgnr
=
0
,
i
;
printk
(
"scsi%d.%c: message out: "
,
info
->
host
->
host_no
,
'0'
+
SCpnt
->
target
);
info
->
host
->
host_no
,
'0'
+
SCpnt
->
device
->
id
);
while
((
msg
=
msgqueue_getmsg
(
&
info
->
scsi
.
msgs
,
msgnr
++
))
!=
NULL
)
{
printk
(
"{ "
);
for
(
i
=
0
;
i
<
msg
->
length
;
i
++
)
...
...
@@ -1923,7 +1964,7 @@ static void fas216_start_command(FAS216_Info *info, Scsi_Cmnd *SCpnt)
info
->
SCpnt
=
SCpnt
;
info
->
dma
.
transfer_type
=
fasdma_none
;
if
(
parity_test
(
info
,
SCpnt
->
target
))
if
(
parity_test
(
info
,
SCpnt
->
device
->
id
))
fas216_writeb
(
info
,
REG_CNTL1
,
info
->
scsi
.
cfg
[
0
]
|
CNTL1_PTE
);
else
fas216_writeb
(
info
,
REG_CNTL1
,
info
->
scsi
.
cfg
[
0
]);
...
...
@@ -1932,13 +1973,13 @@ static void fas216_start_command(FAS216_Info *info, Scsi_Cmnd *SCpnt)
* Don't allow request sense commands to disconnect.
*/
disconnect_ok
=
SCpnt
->
cmnd
[
0
]
!=
REQUEST_SENSE
&&
info
->
device
[
SCpnt
->
target
].
disconnect_ok
;
info
->
device
[
SCpnt
->
device
->
id
].
disconnect_ok
;
/*
* build outgoing message bytes
*/
msgqueue_flush
(
&
info
->
scsi
.
msgs
);
msgqueue_addmsg
(
&
info
->
scsi
.
msgs
,
1
,
IDENTIFY
(
disconnect_ok
,
SCpnt
->
lun
));
msgqueue_addmsg
(
&
info
->
scsi
.
msgs
,
1
,
IDENTIFY
(
disconnect_ok
,
SCpnt
->
device
->
lun
));
/*
* add tag message if required
...
...
@@ -1948,8 +1989,8 @@ static void fas216_start_command(FAS216_Info *info, Scsi_Cmnd *SCpnt)
do
{
#ifdef SCSI2_WIDE
if
(
info
->
device
[
SCpnt
->
target
].
wide_state
==
neg_wait
)
{
info
->
device
[
SCpnt
->
target
].
wide_state
=
neg_inprogress
;
if
(
info
->
device
[
SCpnt
->
device
->
id
].
wide_state
==
neg_wait
)
{
info
->
device
[
SCpnt
->
device
->
id
].
wide_state
=
neg_inprogress
;
msgqueue_addmsg
(
&
info
->
scsi
.
msgs
,
4
,
EXTENDED_MESSAGE
,
2
,
EXTENDED_WDTR
,
info
->
ifcfg
.
wide_max_size
);
...
...
@@ -1957,11 +1998,11 @@ static void fas216_start_command(FAS216_Info *info, Scsi_Cmnd *SCpnt)
}
#endif
#ifdef SCSI2_SYNC
if
((
info
->
device
[
SCpnt
->
target
].
sync_state
==
neg_wait
||
info
->
device
[
SCpnt
->
target
].
sync_state
==
neg_complete
)
&&
if
((
info
->
device
[
SCpnt
->
device
->
id
].
sync_state
==
neg_wait
||
info
->
device
[
SCpnt
->
device
->
id
].
sync_state
==
neg_complete
)
&&
(
SCpnt
->
cmnd
[
0
]
==
REQUEST_SENSE
||
SCpnt
->
cmnd
[
0
]
==
INQUIRY
))
{
info
->
device
[
SCpnt
->
target
].
sync_state
=
neg_inprogress
;
info
->
device
[
SCpnt
->
device
->
id
].
sync_state
=
neg_inprogress
;
msgqueue_addmsg
(
&
info
->
scsi
.
msgs
,
5
,
EXTENDED_MESSAGE
,
3
,
EXTENDED_SDTR
,
1000
/
info
->
ifcfg
.
clockrate
,
...
...
@@ -1988,7 +2029,7 @@ static void fas216_allocate_tag(FAS216_Info *info, Scsi_Cmnd *SCpnt)
SCpnt
->
tag
=
SCpnt
->
device
->
current_tag
;
}
else
#endif
set_bit
(
SCpnt
->
target
*
8
+
SCpnt
->
lun
,
info
->
busyluns
);
set_bit
(
SCpnt
->
device
->
id
*
8
+
SCpnt
->
device
->
lun
,
info
->
busyluns
);
info
->
stats
.
removes
+=
1
;
switch
(
SCpnt
->
cmnd
[
0
])
{
...
...
@@ -2033,11 +2074,11 @@ static void fas216_do_bus_device_reset(FAS216_Info *info, Scsi_Cmnd *SCpnt)
fas216_cmd
(
info
,
CMD_FLUSHFIFO
);
/* load bus-id and timeout */
fas216_writeb
(
info
,
REG_SDID
,
BUSID
(
SCpnt
->
target
));
fas216_writeb
(
info
,
REG_SDID
,
BUSID
(
SCpnt
->
device
->
id
));
fas216_writeb
(
info
,
REG_STIM
,
info
->
ifcfg
.
select_timeout
);
/* synchronous transfers */
fas216_set_sync
(
info
,
SCpnt
->
target
);
fas216_set_sync
(
info
,
SCpnt
->
device
->
id
);
msg
=
msgqueue_getmsg
(
&
info
->
scsi
.
msgs
,
0
);
...
...
@@ -2102,7 +2143,7 @@ static void fas216_kick(FAS216_Info *info)
if
(
info
->
scsi
.
disconnectable
&&
info
->
SCpnt
)
{
fas216_log
(
info
,
LOG_CONNECT
,
"moved command for %d to disconnected queue"
,
info
->
SCpnt
->
target
);
info
->
SCpnt
->
device
->
id
);
queue_add_cmd_tail
(
&
info
->
queues
.
disconnected
,
info
->
SCpnt
);
info
->
scsi
.
disconnectable
=
0
;
info
->
SCpnt
=
NULL
;
...
...
@@ -2155,7 +2196,7 @@ fas216_devicereset_done(FAS216_Info *info, Scsi_Cmnd *SCpnt, unsigned int result
static
void
fas216_rq_sns_done
(
FAS216_Info
*
info
,
Scsi_Cmnd
*
SCpnt
,
unsigned
int
result
)
{
fas216_log_target
(
info
,
LOG_CONNECT
,
SCpnt
->
target
,
fas216_log_target
(
info
,
LOG_CONNECT
,
SCpnt
->
device
->
id
,
"request sense complete, result=0x%04x%02x%02x"
,
result
,
SCpnt
->
SCp
.
Message
,
SCpnt
->
SCp
.
Status
);
...
...
@@ -2166,7 +2207,7 @@ fas216_rq_sns_done(FAS216_Info *info, Scsi_Cmnd *SCpnt, unsigned int result)
* confuse the higher levels.
*/
memset
(
SCpnt
->
sense_buffer
,
0
,
sizeof
(
SCpnt
->
sense_buffer
));
//printk("scsi%d.%c: sense buffer: ", info->host->host_no, '0' + SCpnt->
target
);
//printk("scsi%d.%c: sense buffer: ", info->host->host_no, '0' + SCpnt->
device->id
);
//{ int i; for (i = 0; i < 32; i++) printk("%02x ", SCpnt->sense_buffer[i]); printk("\n"); }
/*
* Note that we don't set SCpnt->result, since that should
...
...
@@ -2235,7 +2276,7 @@ fas216_std_done(FAS216_Info *info, Scsi_Cmnd *SCpnt, unsigned int result)
default:
printk
(
KERN_ERR
"scsi%d.%c: incomplete data transfer "
"detected: res=%08X ptr=%p len=%X CDB: "
,
info
->
host
->
host_no
,
'0'
+
SCpnt
->
target
,
info
->
host
->
host_no
,
'0'
+
SCpnt
->
device
->
id
,
SCpnt
->
result
,
info
->
scsi
.
SCp
.
ptr
,
info
->
scsi
.
SCp
.
this_residual
);
print_command
(
SCpnt
->
cmnd
);
...
...
@@ -2259,11 +2300,11 @@ fas216_std_done(FAS216_Info *info, Scsi_Cmnd *SCpnt, unsigned int result)
if
(
SCpnt
->
cmnd
[
0
]
==
REQUEST_SENSE
)
goto
done
;
fas216_log_target
(
info
,
LOG_CONNECT
,
SCpnt
->
target
,
fas216_log_target
(
info
,
LOG_CONNECT
,
SCpnt
->
device
->
id
,
"requesting sense"
);
memset
(
SCpnt
->
cmnd
,
0
,
sizeof
(
SCpnt
->
cmnd
));
SCpnt
->
cmnd
[
0
]
=
REQUEST_SENSE
;
SCpnt
->
cmnd
[
1
]
=
SCpnt
->
lun
<<
5
;
SCpnt
->
cmnd
[
1
]
=
SCpnt
->
device
->
lun
<<
5
;
SCpnt
->
cmnd
[
4
]
=
sizeof
(
SCpnt
->
sense_buffer
);
SCpnt
->
cmd_len
=
COMMAND_SIZE
(
SCpnt
->
cmnd
[
0
]);
SCpnt
->
SCp
.
buffer
=
NULL
;
...
...
@@ -2285,7 +2326,7 @@ fas216_std_done(FAS216_Info *info, Scsi_Cmnd *SCpnt, unsigned int result)
*/
if
(
info
->
reqSCpnt
)
printk
(
KERN_WARNING
"scsi%d.%c: loosing request command
\n
"
,
info
->
host
->
host_no
,
'0'
+
SCpnt
->
target
);
info
->
host
->
host_no
,
'0'
+
SCpnt
->
device
->
id
);
info
->
reqSCpnt
=
SCpnt
;
}
...
...
@@ -2324,7 +2365,7 @@ static void fas216_done(FAS216_Info *info, unsigned int result)
if
(
info
->
scsi
.
SCp
.
ptr
&&
info
->
scsi
.
SCp
.
this_residual
==
0
)
{
printk
(
"scsi%d.%c: zero bytes left to transfer, but "
"buffer pointer still valid: ptr=%p len=%08x CDB: "
,
info
->
host
->
host_no
,
'0'
+
SCpnt
->
target
,
info
->
host
->
host_no
,
'0'
+
SCpnt
->
device
->
id
,
info
->
scsi
.
SCp
.
ptr
,
info
->
scsi
.
SCp
.
this_residual
);
info
->
scsi
.
SCp
.
ptr
=
NULL
;
print_command
(
SCpnt
->
cmnd
);
...
...
@@ -2335,8 +2376,8 @@ static void fas216_done(FAS216_Info *info, unsigned int result)
* the sense information, fas216_kick will re-assert the busy
* status.
*/
info
->
device
[
SCpnt
->
target
].
parity_check
=
0
;
clear_bit
(
SCpnt
->
target
*
8
+
SCpnt
->
lun
,
info
->
busyluns
);
info
->
device
[
SCpnt
->
device
->
id
].
parity_check
=
0
;
clear_bit
(
SCpnt
->
device
->
id
*
8
+
SCpnt
->
device
->
lun
,
info
->
busyluns
);
fn
=
(
void
(
*
)(
FAS216_Info
*
,
Scsi_Cmnd
*
,
unsigned
int
))
SCpnt
->
host_scribble
;
fn
(
info
,
SCpnt
,
result
);
...
...
@@ -2365,7 +2406,7 @@ static void fas216_done(FAS216_Info *info, unsigned int result)
*/
int
fas216_queue_command
(
Scsi_Cmnd
*
SCpnt
,
void
(
*
done
)(
Scsi_Cmnd
*
))
{
FAS216_Info
*
info
=
(
FAS216_Info
*
)
SCpnt
->
host
->
hostdata
;
FAS216_Info
*
info
=
(
FAS216_Info
*
)
SCpnt
->
device
->
host
->
hostdata
;
int
result
;
fas216_checkmagic
(
info
);
...
...
@@ -2412,7 +2453,7 @@ int fas216_queue_command(Scsi_Cmnd *SCpnt, void (*done)(Scsi_Cmnd *))
*/
static
void
fas216_internal_done
(
Scsi_Cmnd
*
SCpnt
)
{
FAS216_Info
*
info
=
(
FAS216_Info
*
)
SCpnt
->
host
->
hostdata
;
FAS216_Info
*
info
=
(
FAS216_Info
*
)
SCpnt
->
device
->
host
->
hostdata
;
fas216_checkmagic
(
info
);
...
...
@@ -2429,7 +2470,7 @@ static void fas216_internal_done(Scsi_Cmnd *SCpnt)
*/
int
fas216_command
(
Scsi_Cmnd
*
SCpnt
)
{
FAS216_Info
*
info
=
(
FAS216_Info
*
)
SCpnt
->
host
->
hostdata
;
FAS216_Info
*
info
=
(
FAS216_Info
*
)
SCpnt
->
device
->
host
->
hostdata
;
fas216_checkmagic
(
info
);
...
...
@@ -2555,7 +2596,7 @@ static enum res_find fas216_find_command(FAS216_Info *info, Scsi_Cmnd *SCpnt)
* been set.
*/
info
->
origSCpnt
=
NULL
;
clear_bit
(
SCpnt
->
target
*
8
+
SCpnt
->
lun
,
info
->
busyluns
);
clear_bit
(
SCpnt
->
device
->
id
*
8
+
SCpnt
->
device
->
lun
,
info
->
busyluns
);
printk
(
"waiting for execution "
);
res
=
res_success
;
}
else
...
...
@@ -2574,7 +2615,7 @@ static enum res_find fas216_find_command(FAS216_Info *info, Scsi_Cmnd *SCpnt)
*/
int
fas216_eh_abort
(
Scsi_Cmnd
*
SCpnt
)
{
FAS216_Info
*
info
=
(
FAS216_Info
*
)
SCpnt
->
host
->
hostdata
;
FAS216_Info
*
info
=
(
FAS216_Info
*
)
SCpnt
->
device
->
host
->
hostdata
;
int
result
=
FAILED
;
fas216_checkmagic
(
info
);
...
...
@@ -2631,9 +2672,9 @@ int fas216_eh_abort(Scsi_Cmnd *SCpnt)
*/
int
fas216_eh_device_reset
(
Scsi_Cmnd
*
SCpnt
)
{
FAS216_Info
*
info
=
(
FAS216_Info
*
)
SCpnt
->
host
->
hostdata
;
FAS216_Info
*
info
=
(
FAS216_Info
*
)
SCpnt
->
device
->
host
->
hostdata
;
unsigned
long
flags
;
int
i
,
res
=
FAILED
,
target
=
SCpnt
->
target
;
int
i
,
res
=
FAILED
,
target
=
SCpnt
->
device
->
id
;
fas216_log
(
info
,
LOG_ERROR
,
"device reset for target %d"
,
target
);
...
...
@@ -2647,7 +2688,7 @@ int fas216_eh_device_reset(Scsi_Cmnd *SCpnt)
* and we need a bus reset.
*/
if
(
info
->
SCpnt
&&
!
info
->
scsi
.
disconnectable
&&
info
->
SCpnt
->
target
==
SCpnt
->
target
)
info
->
SCpnt
->
device
->
id
==
SCpnt
->
device
->
id
)
break
;
/*
...
...
@@ -2658,9 +2699,9 @@ int fas216_eh_device_reset(Scsi_Cmnd *SCpnt)
*/
queue_remove_all_target
(
&
info
->
queues
.
issue
,
target
);
queue_remove_all_target
(
&
info
->
queues
.
disconnected
,
target
);
if
(
info
->
origSCpnt
&&
info
->
origSCpnt
->
target
==
target
)
if
(
info
->
origSCpnt
&&
info
->
origSCpnt
->
device
->
id
==
target
)
info
->
origSCpnt
=
NULL
;
if
(
info
->
reqSCpnt
&&
info
->
reqSCpnt
->
target
==
target
)
if
(
info
->
reqSCpnt
&&
info
->
reqSCpnt
->
device
->
id
==
target
)
info
->
reqSCpnt
=
NULL
;
for
(
i
=
0
;
i
<
8
;
i
++
)
clear_bit
(
target
*
8
+
i
,
info
->
busyluns
);
...
...
@@ -2712,7 +2753,7 @@ int fas216_eh_device_reset(Scsi_Cmnd *SCpnt)
*/
int
fas216_eh_bus_reset
(
Scsi_Cmnd
*
SCpnt
)
{
FAS216_Info
*
info
=
(
FAS216_Info
*
)
SCpnt
->
host
->
hostdata
;
FAS216_Info
*
info
=
(
FAS216_Info
*
)
SCpnt
->
device
->
host
->
hostdata
;
unsigned
long
flags
;
Scsi_Device
*
SDpnt
;
...
...
@@ -2750,9 +2791,9 @@ int fas216_eh_bus_reset(Scsi_Cmnd *SCpnt)
queue_remove_all_target
(
&
info
->
queues
.
issue
,
SDpnt
->
id
);
queue_remove_all_target
(
&
info
->
queues
.
disconnected
,
SDpnt
->
id
);
if
(
info
->
origSCpnt
&&
info
->
origSCpnt
->
target
==
SDpnt
->
id
)
if
(
info
->
origSCpnt
&&
info
->
origSCpnt
->
device
->
id
==
SDpnt
->
id
)
info
->
origSCpnt
=
NULL
;
if
(
info
->
reqSCpnt
&&
info
->
reqSCpnt
->
target
==
SDpnt
->
id
)
if
(
info
->
reqSCpnt
&&
info
->
reqSCpnt
->
device
->
id
==
SDpnt
->
id
)
info
->
reqSCpnt
=
NULL
;
info
->
SCpnt
=
NULL
;
...
...
@@ -2809,12 +2850,12 @@ static void fas216_init_chip(FAS216_Info *info)
*/
int
fas216_eh_host_reset
(
Scsi_Cmnd
*
SCpnt
)
{
FAS216_Info
*
info
=
(
FAS216_Info
*
)
SCpnt
->
host
->
hostdata
;
FAS216_Info
*
info
=
(
FAS216_Info
*
)
SCpnt
->
device
->
host
->
hostdata
;
fas216_checkmagic
(
info
);
printk
(
"scsi%d.%c: %s: resetting host
\n
"
,
info
->
host
->
host_no
,
'0'
+
SCpnt
->
target
,
__FUNCTION__
);
info
->
host
->
host_no
,
'0'
+
SCpnt
->
device
->
id
,
__FUNCTION__
);
/*
* Reset the SCSI chip.
...
...
drivers/acorn/scsi/queue.c
View file @
974a9d19
...
...
@@ -170,7 +170,7 @@ Scsi_Cmnd *queue_remove_exclude(Queue_t *queue, unsigned long *exclude)
spin_lock_irqsave
(
&
queue
->
queue_lock
,
flags
);
list_for_each
(
l
,
&
queue
->
head
)
{
QE_t
*
q
=
list_entry
(
l
,
QE_t
,
list
);
if
(
!
test_bit
(
q
->
SCpnt
->
target
*
8
+
q
->
SCpnt
->
lun
,
exclude
))
{
if
(
!
test_bit
(
q
->
SCpnt
->
device
->
id
*
8
+
q
->
SCpnt
->
device
->
lun
,
exclude
))
{
SCpnt
=
__queue_remove
(
queue
,
l
);
break
;
}
...
...
@@ -217,7 +217,7 @@ Scsi_Cmnd *queue_remove_tgtluntag (Queue_t *queue, int target, int lun, int tag)
spin_lock_irqsave
(
&
queue
->
queue_lock
,
flags
);
list_for_each
(
l
,
&
queue
->
head
)
{
QE_t
*
q
=
list_entry
(
l
,
QE_t
,
list
);
if
(
q
->
SCpnt
->
target
==
target
&&
q
->
SCpnt
->
lun
==
lun
&&
if
(
q
->
SCpnt
->
device
->
id
==
target
&&
q
->
SCpnt
->
device
->
lun
==
lun
&&
q
->
SCpnt
->
tag
==
tag
)
{
SCpnt
=
__queue_remove
(
queue
,
l
);
break
;
...
...
@@ -243,7 +243,7 @@ void queue_remove_all_target(Queue_t *queue, int target)
spin_lock_irqsave
(
&
queue
->
queue_lock
,
flags
);
list_for_each
(
l
,
&
queue
->
head
)
{
QE_t
*
q
=
list_entry
(
l
,
QE_t
,
list
);
if
(
q
->
SCpnt
->
target
==
target
)
if
(
q
->
SCpnt
->
device
->
id
==
target
)
__queue_remove
(
queue
,
l
);
}
spin_unlock_irqrestore
(
&
queue
->
queue_lock
,
flags
);
...
...
@@ -267,7 +267,7 @@ int queue_probetgtlun (Queue_t *queue, int target, int lun)
spin_lock_irqsave
(
&
queue
->
queue_lock
,
flags
);
list_for_each
(
l
,
&
queue
->
head
)
{
QE_t
*
q
=
list_entry
(
l
,
QE_t
,
list
);
if
(
q
->
SCpnt
->
target
==
target
&&
q
->
SCpnt
->
lun
==
lun
)
{
if
(
q
->
SCpnt
->
device
->
id
==
target
&&
q
->
SCpnt
->
device
->
lun
==
lun
)
{
found
=
1
;
break
;
}
...
...
drivers/acorn/scsi/scsi.h
View file @
974a9d19
...
...
@@ -92,8 +92,8 @@ static inline void init_SCp(Scsi_Cmnd *SCpnt)
if
(
SCpnt
->
request_bufflen
!=
len
)
printk
(
KERN_WARNING
"scsi%d.%c: bad request buffer "
"length %d, should be %ld
\n
"
,
SCpnt
->
host
->
host_no
,
'0'
+
SCpnt
->
target
,
SCpnt
->
request_bufflen
,
len
);
"length %d, should be %ld
\n
"
,
SCpnt
->
device
->
host
->
host_no
,
'0'
+
SCpnt
->
device
->
id
,
SCpnt
->
request_bufflen
,
len
);
SCpnt
->
request_bufflen
=
len
;
#endif
}
else
{
...
...
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