From edd1b173a7702104eeac1c028632ff6eebc10023 Mon Sep 17 00:00:00 2001 From: Michael Brown Date: Sun, 8 Jul 2007 19:33:26 +0100 Subject: [PATCH] Code in place to use a hypothetical SCSI interface. --- src/include/gpxe/iscsi.h | 5 +++++ src/net/tcp/iscsi.c | 31 +++++++++++++++++++++++-------- 2 files changed, 28 insertions(+), 8 deletions(-) diff --git a/src/include/gpxe/iscsi.h b/src/include/gpxe/iscsi.h index 7c2e4b18..03fc0641 100644 --- a/src/include/gpxe/iscsi.h +++ b/src/include/gpxe/iscsi.h @@ -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 diff --git a/src/net/tcp/iscsi.c b/src/net/tcp/iscsi.c index bad40458..f0f6db0b 100644 --- a/src/net/tcp/iscsi.c +++ b/src/net/tcp/iscsi.c @@ -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