summaryrefslogtreecommitdiffstats
path: root/src/net/tcp/iscsi.c
diff options
context:
space:
mode:
authorMichael Brown2007-07-08 20:33:26 +0200
committerMichael Brown2007-07-08 20:33:26 +0200
commitedd1b173a7702104eeac1c028632ff6eebc10023 (patch)
treecd4ba63d4d6511438e0db5b1a12fcea4ef57461a /src/net/tcp/iscsi.c
parentEverything except the SCSI interface should now be present (diff)
downloadipxe-edd1b173a7702104eeac1c028632ff6eebc10023.tar.gz
ipxe-edd1b173a7702104eeac1c028632ff6eebc10023.tar.xz
ipxe-edd1b173a7702104eeac1c028632ff6eebc10023.zip
Code in place to use a hypothetical SCSI interface.
Diffstat (limited to 'src/net/tcp/iscsi.c')
-rw-r--r--src/net/tcp/iscsi.c31
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