david/ipxe
david
/
ipxe
Archived
1
0
Fork 0

Code in place to use a hypothetical SCSI interface.

This commit is contained in:
Michael Brown 2007-07-08 19:33:26 +01:00
parent f2fa390ae6
commit edd1b173a7
2 changed files with 28 additions and 8 deletions

View File

@ -589,6 +589,11 @@ struct iscsi_session {
* Set to NULL when command is complete.
*/
struct scsi_command *command;
/** SCSI command return code
*
* Set to -EINPROGRESS while command is processing.
*/
int rc;
/** Instant return code
*
* Set to a non-zero value if all requests should return

View File

@ -165,11 +165,8 @@ static void iscsi_scsi_done ( struct iscsi_session *iscsi, int rc ) {
assert ( iscsi->tx_state == ISCSI_TX_IDLE );
/* Clear current SCSI command */
iscsi->command = NULL;
/* Mark asynchronous operation as complete */
async_done ( &iscsi->async, rc );
iscsi->rc = rc;
}
/****************************************************************************
@ -1281,20 +1278,32 @@ static int iscsi_scsi_issue ( struct scsi_interface *scsi,
container_of ( scsi, struct iscsi_session, scsi );
int rc;
/* Record SCSI command */
iscsi->command = command;
/* Abort immediately if we have a recorded permanent failure */
if ( iscsi->instant_rc )
return iscsi->instant_rc;
if ( iscsi->instant_rc ) {
rc = iscsi->instant_rc;
goto done;
}
/* Issue command or open connection as appropriate */
if ( iscsi->status ) {
iscsi_start_command ( iscsi );
} else {
if ( ( rc = iscsi_open_connection ( iscsi ) ) != 0 )
return rc;
goto done;
}
return 0;
/* Wait for command to complete */
iscsi->rc = -EINPROGRESS;
while ( iscsi->rc == -EINPROGRESS )
step();
rc = iscsi->rc;
done:
iscsi->command = NULL;
return rc;
}
/**
@ -1311,6 +1320,12 @@ static void iscsi_scsi_detach ( struct scsi_interface *scsi, int rc ) {
process_del ( &iscsi->process );
}
/** iSCSI SCSI operations */
struct scsi_operations iscsi_scsi_operations = {
.detach = iscsi_scsi_detach,
.issue = iscsi_scsi_issue,
};
/****************************************************************************
*
* Instantiator