diff options
author | Michael Brown <mcb30@etherboot.org> | 2007-07-08 19:33:26 +0100 |
---|---|---|
committer | Michael Brown <mcb30@etherboot.org> | 2007-07-08 19:33:26 +0100 |
commit | edd1b173a7702104eeac1c028632ff6eebc10023 (patch) | |
tree | cd4ba63d4d6511438e0db5b1a12fcea4ef57461a /src/net/tcp | |
parent | f2fa390ae608fe0fc38ed66c723f085f34cb0227 (diff) | |
download | ipxe-edd1b173a7702104eeac1c028632ff6eebc10023.tar.gz |
Code in place to use a hypothetical SCSI interface.
Diffstat (limited to 'src/net/tcp')
-rw-r--r-- | src/net/tcp/iscsi.c | 31 |
1 files changed, 23 insertions, 8 deletions
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 |