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
ad13d5f4
Commit
ad13d5f4
authored
Mar 01, 2002
by
James Bottomley
Browse files
Options
Browse Files
Download
Plain Diff
Merge mulgrave.(none):/home/jejb/BK/linux-2.5
into mulgrave.(none):/home/jejb/BK/scsi-2.5
parents
c39e9205
c60eeb1f
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
166 additions
and
5 deletions
+166
-5
drivers/scsi/scsi.c
drivers/scsi/scsi.c
+93
-0
drivers/scsi/scsi.h
drivers/scsi/scsi.h
+10
-0
drivers/scsi/scsi_error.c
drivers/scsi/scsi_error.c
+58
-5
drivers/scsi/scsi_syms.c
drivers/scsi/scsi_syms.c
+5
-0
No files found.
drivers/scsi/scsi.c
View file @
ad13d5f4
...
@@ -164,6 +164,11 @@ const char *const scsi_device_types[MAX_SCSI_DEVICE_CODE] =
...
@@ -164,6 +164,11 @@ const char *const scsi_device_types[MAX_SCSI_DEVICE_CODE] =
extern
void
scsi_times_out
(
Scsi_Cmnd
*
SCpnt
);
extern
void
scsi_times_out
(
Scsi_Cmnd
*
SCpnt
);
void
scsi_build_commandblocks
(
Scsi_Device
*
SDpnt
);
void
scsi_build_commandblocks
(
Scsi_Device
*
SDpnt
);
/*
* Private interface into the new error handling code.
*/
extern
int
scsi_new_reset
(
Scsi_Cmnd
*
SCpnt
,
unsigned
int
flag
);
/*
/*
* Function: scsi_initialize_queue()
* Function: scsi_initialize_queue()
*
*
...
@@ -2662,6 +2667,94 @@ void scsi_free_host_dev(Scsi_Device * SDpnt)
...
@@ -2662,6 +2667,94 @@ void scsi_free_host_dev(Scsi_Device * SDpnt)
kfree
(
SDpnt
);
kfree
(
SDpnt
);
}
}
/*
* Function: scsi_reset_provider_done_command
*
* Purpose: Dummy done routine.
*
* Notes: Some low level drivers will call scsi_done and end up here,
* others won't bother.
* We don't want the bogus command used for the bus/device
* reset to find its way into the mid-layer so we intercept
* it here.
*/
static
void
scsi_reset_provider_done_command
(
Scsi_Cmnd
*
SCpnt
)
{
}
/*
* Function: scsi_reset_provider
*
* Purpose: Send requested reset to a bus or device at any phase.
*
* Arguments: device - device to send reset to
* flag - reset type (see scsi.h)
*
* Returns: SUCCESS/FAILURE.
*
* Notes: This is used by the SCSI Generic driver to provide
* Bus/Device reset capability.
*/
int
scsi_reset_provider
(
Scsi_Device
*
dev
,
int
flag
)
{
Scsi_Cmnd
SC
,
*
SCpnt
=
&
SC
;
int
rtn
;
memset
(
&
SCpnt
->
eh_timeout
,
0
,
sizeof
(
SCpnt
->
eh_timeout
));
SCpnt
->
host
=
dev
->
host
;
SCpnt
->
device
=
dev
;
SCpnt
->
target
=
dev
->
id
;
SCpnt
->
lun
=
dev
->
lun
;
SCpnt
->
channel
=
dev
->
channel
;
SCpnt
->
request
.
rq_status
=
RQ_SCSI_BUSY
;
SCpnt
->
request
.
waiting
=
NULL
;
SCpnt
->
use_sg
=
0
;
SCpnt
->
old_use_sg
=
0
;
SCpnt
->
old_cmd_len
=
0
;
SCpnt
->
underflow
=
0
;
SCpnt
->
transfersize
=
0
;
SCpnt
->
resid
=
0
;
SCpnt
->
serial_number
=
0
;
SCpnt
->
serial_number_at_timeout
=
0
;
SCpnt
->
host_scribble
=
NULL
;
SCpnt
->
next
=
NULL
;
SCpnt
->
state
=
SCSI_STATE_INITIALIZING
;
SCpnt
->
owner
=
SCSI_OWNER_MIDLEVEL
;
memset
(
&
SCpnt
->
cmnd
,
'\0'
,
sizeof
(
SCpnt
->
cmnd
));
SCpnt
->
scsi_done
=
scsi_reset_provider_done_command
;
SCpnt
->
done
=
NULL
;
SCpnt
->
reset_chain
=
NULL
;
SCpnt
->
buffer
=
NULL
;
SCpnt
->
bufflen
=
0
;
SCpnt
->
request_buffer
=
NULL
;
SCpnt
->
request_bufflen
=
0
;
SCpnt
->
internal_timeout
=
NORMAL_TIMEOUT
;
SCpnt
->
abort_reason
=
DID_ABORT
;
SCpnt
->
cmd_len
=
0
;
SCpnt
->
sc_data_direction
=
SCSI_DATA_UNKNOWN
;
SCpnt
->
sc_request
=
NULL
;
SCpnt
->
sc_magic
=
SCSI_CMND_MAGIC
;
/*
* Sometimes the command can get back into the timer chain,
* so use the pid as an identifier.
*/
SCpnt
->
pid
=
0
;
rtn
=
scsi_new_reset
(
SCpnt
,
flag
);
scsi_delete_timer
(
SCpnt
);
return
rtn
;
}
/*
/*
* Overrides for Emacs so that we follow Linus's tabbing style.
* Overrides for Emacs so that we follow Linus's tabbing style.
* Emacs will notice this stuff at the end of the file and automatically
* Emacs will notice this stuff at the end of the file and automatically
...
...
drivers/scsi/scsi.h
View file @
ad13d5f4
...
@@ -834,6 +834,16 @@ struct scsi_cmnd {
...
@@ -834,6 +834,16 @@ struct scsi_cmnd {
current->state = TASK_RUNNING; \
current->state = TASK_RUNNING; \
}; }
}; }
/*
* old style reset request from external source
* (private to sg.c and scsi_error.c, supplied by scsi_obsolete.c)
*/
#define SCSI_TRY_RESET_DEVICE 1
#define SCSI_TRY_RESET_BUS 2
#define SCSI_TRY_RESET_HOST 3
extern
int
scsi_reset_provider
(
Scsi_Device
*
,
int
);
#endif
#endif
/*
/*
...
...
drivers/scsi/scsi_error.c
View file @
ad13d5f4
...
@@ -979,15 +979,24 @@ int scsi_decide_disposition(Scsi_Cmnd * SCpnt)
...
@@ -979,15 +979,24 @@ int scsi_decide_disposition(Scsi_Cmnd * SCpnt)
case
DID_SOFT_ERROR
:
case
DID_SOFT_ERROR
:
goto
maybe_retry
;
goto
maybe_retry
;
case
DID_ERROR
:
if
(
msg_byte
(
SCpnt
->
result
)
==
COMMAND_COMPLETE
&&
status_byte
(
SCpnt
->
result
)
==
RESERVATION_CONFLICT
)
/*
* execute reservation conflict processing code
* lower down
*/
break
;
/* FALLTHROUGH */
case
DID_BUS_BUSY
:
case
DID_BUS_BUSY
:
case
DID_PARITY
:
case
DID_PARITY
:
case
DID_ERROR
:
goto
maybe_retry
;
goto
maybe_retry
;
case
DID_TIME_OUT
:
case
DID_TIME_OUT
:
/*
/*
* When we scan the bus, we get timeout messages for
* When we scan the bus, we get timeout messages for
* these commands if there is no device available.
* these commands if there is no device available.
* Other hosts report DID_NO_CONNECT for the same thing.
* Other hosts report DID_NO_CONNECT for the same thing.
*/
*/
if
((
SCpnt
->
cmnd
[
0
]
==
TEST_UNIT_READY
||
if
((
SCpnt
->
cmnd
[
0
]
==
TEST_UNIT_READY
||
SCpnt
->
cmnd
[
0
]
==
INQUIRY
))
{
SCpnt
->
cmnd
[
0
]
==
INQUIRY
))
{
...
@@ -1048,8 +1057,13 @@ int scsi_decide_disposition(Scsi_Cmnd * SCpnt)
...
@@ -1048,8 +1057,13 @@ int scsi_decide_disposition(Scsi_Cmnd * SCpnt)
*/
*/
return
SUCCESS
;
return
SUCCESS
;
case
BUSY
:
case
BUSY
:
case
RESERVATION_CONFLICT
:
goto
maybe_retry
;
goto
maybe_retry
;
case
RESERVATION_CONFLICT
:
printk
(
"scsi%d (%d,%d,%d) : RESERVATION CONFLICT
\n
"
,
SCpnt
->
host
->
host_no
,
SCpnt
->
channel
,
SCpnt
->
device
->
id
,
SCpnt
->
device
->
lun
);
return
SUCCESS
;
/* causes immediate I/O error */
default:
default:
return
FAILED
;
return
FAILED
;
}
}
...
@@ -1949,6 +1963,45 @@ void scsi_error_handler(void *data)
...
@@ -1949,6 +1963,45 @@ void scsi_error_handler(void *data)
up
(
host
->
eh_notify
);
up
(
host
->
eh_notify
);
}
}
/*
* Function: scsi_new_reset
*
* Purpose: Send requested reset to a bus or device at any phase.
*
* Arguments: SCpnt - command ptr to send reset with (usually a dummy)
* flag - reset type (see scsi.h)
*
* Returns: SUCCESS/FAILURE.
*
* Notes: This is used by the SCSI Generic driver to provide
* Bus/Device reset capability.
*/
int
scsi_new_reset
(
Scsi_Cmnd
*
SCpnt
,
int
flag
)
{
int
rtn
;
switch
(
flag
)
{
case
SCSI_TRY_RESET_DEVICE
:
rtn
=
scsi_try_bus_device_reset
(
SCpnt
,
0
);
if
(
rtn
==
SUCCESS
)
break
;
/* FALLTHROUGH */
case
SCSI_TRY_RESET_BUS
:
rtn
=
scsi_try_bus_reset
(
SCpnt
);
if
(
rtn
==
SUCCESS
)
break
;
/* FALLTHROUGH */
case
SCSI_TRY_RESET_HOST
:
rtn
=
scsi_try_host_reset
(
SCpnt
);
break
;
default:
rtn
=
FAILED
;
}
return
rtn
;
}
/*
/*
* Overrides for Emacs so that we follow Linus's tabbing style.
* Overrides for Emacs so that we follow Linus's tabbing style.
* Emacs will notice this stuff at the end of the file and automatically
* Emacs will notice this stuff at the end of the file and automatically
...
...
drivers/scsi/scsi_syms.c
View file @
ad13d5f4
...
@@ -80,6 +80,11 @@ EXPORT_SYMBOL(scsi_end_request);
...
@@ -80,6 +80,11 @@ EXPORT_SYMBOL(scsi_end_request);
EXPORT_SYMBOL
(
scsi_register_blocked_host
);
EXPORT_SYMBOL
(
scsi_register_blocked_host
);
EXPORT_SYMBOL
(
scsi_deregister_blocked_host
);
EXPORT_SYMBOL
(
scsi_deregister_blocked_host
);
/*
* This symbol is for the highlevel drivers (e.g. sg) only.
*/
EXPORT_SYMBOL
(
scsi_reset_provider
);
/*
/*
* These are here only while I debug the rest of the scsi stuff.
* These are here only while I debug the rest of the scsi stuff.
*/
*/
...
...
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