summaryrefslogtreecommitdiffstats
path: root/src/include
diff options
context:
space:
mode:
authorMichael Brown2006-05-19 02:20:08 +0200
committerMichael Brown2006-05-19 02:20:08 +0200
commita280587cdeecb1ae96f56cd14d6e61b060aeee9e (patch)
treead63da1bb140a264d0fa44d0e4e3a8da09583538 /src/include
parentAll uses iscsi_state were removed some time ago; removing the (diff)
downloadipxe-a280587cdeecb1ae96f56cd14d6e61b060aeee9e.tar.gz
ipxe-a280587cdeecb1ae96f56cd14d6e61b060aeee9e.tar.xz
ipxe-a280587cdeecb1ae96f56cd14d6e61b060aeee9e.zip
iSCSI writes seem to be working (at least, the ethereal trace shows no
errors; still need to verify data integrity). SCSI response PDUs are handled: status and sense data (if available) are returned via the scsi_command structure. Updated iSCSI session parameter usage.
Diffstat (limited to 'src/include')
-rw-r--r--src/include/gpxe/iscsi.h138
-rw-r--r--src/include/gpxe/scsi.h10
2 files changed, 116 insertions, 32 deletions
diff --git a/src/include/gpxe/iscsi.h b/src/include/gpxe/iscsi.h
index 0419f0681..c1161de95 100644
--- a/src/include/gpxe/iscsi.h
+++ b/src/include/gpxe/iscsi.h
@@ -85,33 +85,6 @@ struct iscsi_bhs_common {
* iSCSI basic header segment common request fields
*
*/
-struct iscsi_bhs_common_request {
- /** Opcode */
- uint8_t opcode;
- /** Flags */
- uint8_t flags;
- /** Fields specific to the PDU type */
- uint8_t other_a[2];
- /** Segment lengths */
- union iscsi_segment_lengths lengths;
- /** Fields specific to the PDU type */
- uint8_t other_b[8];
- /** Initiator Task Tag */
- uint32_t itt;
- /** Fields specific to the PDU type */
- uint8_t other_c[4];
- /** Command sequence number */
- uint32_t cmdsn;
- /** Expected status sequence number */
- uint32_t expstatsn;
- /** Fields specific to the PDU type */
- uint8_t other_d[16];
-};
-
-/**
- * iSCSI basic header segment common request fields
- *
- */
struct iscsi_bhs_common_response {
/** Opcode */
uint8_t opcode;
@@ -328,8 +301,16 @@ struct iscsi_bhs_scsi_response {
/** SCSI target failure */
#define ISCSI_RESPONSE_TARGET_FAILURE 0x01
+/** SCSI sense response code offset
+ *
+ * The SCSI response may contain unsolicited sense data in the data
+ * segment. If it does, this is the offset to the sense response code
+ * byte, which is the only byte we care about.
+ */
+#define ISCSI_SENSE_RESPONSE_CODE_OFFSET 2
+
/**
- * iSCSI data in basic header segment
+ * iSCSI data-in basic header segment
*
*/
struct iscsi_bhs_data_in {
@@ -363,7 +344,7 @@ struct iscsi_bhs_data_in {
uint32_t residual_count;
};
-/** Data in opcode */
+/** Data-in opcode */
#define ISCSI_OPCODE_DATA_IN 0x25
/** Data requires acknowledgement */
@@ -375,21 +356,94 @@ struct iscsi_bhs_data_in {
/** Data underflow occurred */
#define ISCSI_DATA_FLAG_UNDERFLOW 0x02
-/** SCSI status code and verflow/underflow flags are valid */
+/** SCSI status code and overflow/underflow flags are valid */
#define ISCSI_DATA_FLAG_STATUS 0x01
/**
+ * iSCSI data-out basic header segment
+ *
+ */
+struct iscsi_bhs_data_out {
+ /** Opcode */
+ uint8_t opcode;
+ /** Flags */
+ uint8_t flags;
+ /** Reserved */
+ uint16_t reserved_a;
+ /** Segment lengths */
+ union iscsi_segment_lengths lengths;
+ /** Logical Unit Number */
+ uint64_t lun;
+ /** Initiator Task Tag */
+ uint32_t itt;
+ /** Target Transfer Tag */
+ uint32_t ttt;
+ /** Reserved */
+ uint32_t reserved_b;
+ /** Expected status sequence number */
+ uint32_t expstatsn;
+ /** Reserved */
+ uint32_t reserved_c;
+ /** Data sequence number */
+ uint32_t datasn;
+ /** Buffer offset */
+ uint32_t offset;
+ /** Reserved */
+ uint32_t reserved_d;
+};
+
+/** Data-out opcode */
+#define ISCSI_OPCODE_DATA_OUT 0x05
+
+/**
+ * iSCSI request to transfer basic header segment
+ *
+ */
+struct iscsi_bhs_r2t {
+ /** Opcode */
+ uint8_t opcode;
+ /** Flags */
+ uint8_t flags;
+ /** Reserved */
+ uint16_t reserved_a;
+ /** Segment lengths */
+ union iscsi_segment_lengths lengths;
+ /** Logical Unit Number */
+ uint64_t lun;
+ /** Initiator Task Tag */
+ uint32_t itt;
+ /** Target Transfer Tag */
+ uint32_t ttt;
+ /** Status sequence number */
+ uint32_t statsn;
+ /** Expected command sequence number */
+ uint32_t expcmdsn;
+ /** Maximum command sequence number */
+ uint32_t maxcmdsn;
+ /** R2T sequence number */
+ uint32_t r2tsn;
+ /** Buffer offset */
+ uint32_t offset;
+ /** Desired data transfer length */
+ uint32_t len;
+};
+
+/** R2T opcode */
+#define ISCSI_OPCODE_R2T 0x31
+
+/**
* An iSCSI basic header segment
*/
union iscsi_bhs {
struct iscsi_bhs_common common;
- struct iscsi_bhs_common_request common_request;
struct iscsi_bhs_common_response common_response;
struct iscsi_bhs_login_request login_request;
struct iscsi_bhs_login_response login_response;
struct iscsi_bhs_scsi_command scsi_command;
struct iscsi_bhs_scsi_response scsi_response;
struct iscsi_bhs_data_in data_in;
+ struct iscsi_bhs_data_out data_out;
+ struct iscsi_bhs_r2t r2t;
unsigned char bytes[ sizeof ( struct iscsi_bhs_common ) ];
};
@@ -452,9 +506,29 @@ struct iscsi_session {
/** Initiator task tag
*
* This is the tag of the current command. It is incremented
- * whenever a final response PDU is received.
+ * whenever a new command is started.
*/
uint32_t itt;
+ /** Target transfer tag
+ *
+ * This is the tag attached to a sequence of data-out PDUs in
+ * response to an R2T.
+ */
+ uint32_t ttt;
+ /**
+ * Transfer offset
+ *
+ * This is the offset for an in-progress sequence of data-out
+ * PDUs in response to an R2T.
+ */
+ uint32_t transfer_offset;
+ /**
+ * Transfer length
+ *
+ * This is the length for an in-progress sequence of data-out
+ * PDUs in response to an R2T.
+ */
+ uint32_t transfer_len;
/** Command sequence number
*
* This is the sequence number of the current command, used to
diff --git a/src/include/gpxe/scsi.h b/src/include/gpxe/scsi.h
index db57e8913..dea39e162 100644
--- a/src/include/gpxe/scsi.h
+++ b/src/include/gpxe/scsi.h
@@ -136,6 +136,10 @@ struct scsi_command {
* Must be zero if @c data_in is NULL
*/
size_t data_in_len;
+ /** SCSI statua code */
+ uint8_t status;
+ /** SCSI sense response code */
+ uint8_t sense_response;
};
/** A SCSI device */
@@ -154,6 +158,12 @@ struct scsi_device {
* @v scsi SCSI device
* @v command SCSI command
* @ret rc Return status code
+ *
+ * Note that a successful return status code indicates only
+ * that the SCSI command completed. The caller must check the
+ * status field in the command structure to see if, for
+ * example, the device returned CHECK CONDITION or some other
+ * non-success status code.
*/
int ( * command ) ( struct scsi_device *scsi,
struct scsi_command *command );