summaryrefslogtreecommitdiffstats
path: root/src/include/ipxe/fcp.h
diff options
context:
space:
mode:
authorMichael Brown2010-09-15 04:08:47 +0200
committerMichael Brown2010-09-15 04:20:26 +0200
commitd2a2618d76b6ec82dd3cec6fe492d3a2fed87591 (patch)
tree01b32a877efa173dc1ba5166579f2e0009e2aa14 /src/include/ipxe/fcp.h
parent[fc] Add Fibre Channel management commands (diff)
downloadipxe-d2a2618d76b6ec82dd3cec6fe492d3a2fed87591.tar.gz
ipxe-d2a2618d76b6ec82dd3cec6fe492d3a2fed87591.tar.xz
ipxe-d2a2618d76b6ec82dd3cec6fe492d3a2fed87591.zip
[fcp] Add support for the Fibre Channel Protocol
The Fibre Channel Protocol provides a mechanism for transporting SCSI commands via a Fibre Channel fabric. Signed-off-by: Michael Brown <mcb30@ipxe.org>
Diffstat (limited to 'src/include/ipxe/fcp.h')
-rw-r--r--src/include/ipxe/fcp.h166
1 files changed, 166 insertions, 0 deletions
diff --git a/src/include/ipxe/fcp.h b/src/include/ipxe/fcp.h
new file mode 100644
index 00000000..f6922bc7
--- /dev/null
+++ b/src/include/ipxe/fcp.h
@@ -0,0 +1,166 @@
+#ifndef _IPXE_FCP_H
+#define _IPXE_FCP_H
+
+/**
+ * @file
+ *
+ * Fibre Channel Protocol
+ *
+ */
+
+FILE_LICENCE ( GPL2_OR_LATER );
+
+#include <stdint.h>
+#include <ipxe/fc.h>
+#include <ipxe/fcels.h>
+#include <ipxe/scsi.h>
+
+/** An FCP command IU */
+struct fcp_cmnd {
+ /** SCSI LUN */
+ struct scsi_lun lun;
+ /** Command reference number */
+ uint8_t ref;
+ /** Priority and task attributes */
+ uint8_t priority;
+ /** Task management flags */
+ uint8_t flags;
+ /** Direction */
+ uint8_t dirn;
+ /** SCSI CDB */
+ union scsi_cdb cdb;
+ /** Data length */
+ uint32_t len;
+} __attribute__ (( packed ));
+
+/** Command includes data-out */
+#define FCP_CMND_WRDATA 0x01
+
+/** Command includes data-in */
+#define FCP_CMND_RDDATA 0x02
+
+/** FCP tag magic marker */
+#define FCP_TAG_MAGIC 0x18ae0000
+
+/** An FCP transfer ready IU */
+struct fcp_xfer_rdy {
+ /** Relative offset of data */
+ uint32_t offset;
+ /** Burst length */
+ uint32_t len;
+ /** Reserved */
+ uint32_t reserved;
+} __attribute__ (( packed ));
+
+/** An FCP response IU */
+struct fcp_rsp {
+ /** Reserved */
+ uint8_t reserved[8];
+ /** Retry delay timer */
+ uint16_t retry_delay;
+ /** Flags */
+ uint8_t flags;
+ /** SCSI status code */
+ uint8_t status;
+ /** Residual data count */
+ uint32_t residual;
+ /** Sense data length */
+ uint32_t sense_len;
+ /** Response data length */
+ uint32_t response_len;
+} __attribute__ (( packed ));
+
+/** Response length field is valid */
+#define FCP_RSP_RESPONSE_LEN_VALID 0x01
+
+/** Sense length field is valid */
+#define FCP_RSP_SENSE_LEN_VALID 0x02
+
+/** Residual represents overrun */
+#define FCP_RSP_RESIDUAL_OVERRUN 0x04
+
+/** Residual represents underrun */
+#define FCP_RSP_RESIDUAL_UNDERRUN 0x08
+
+/**
+ * Get response data portion of FCP response
+ *
+ * @v rsp FCP response
+ * @ret response_data Response data, or NULL if not present
+ */
+static inline void * fcp_rsp_response_data ( struct fcp_rsp *rsp ) {
+ return ( ( rsp->flags & FCP_RSP_RESPONSE_LEN_VALID ) ?
+ ( ( ( void * ) rsp ) + sizeof ( *rsp ) ) : NULL );
+}
+
+/**
+ * Get length of response data portion of FCP response
+ *
+ * @v rsp FCP response
+ * @ret response_data_len Response data length
+ */
+static inline size_t fcp_rsp_response_data_len ( struct fcp_rsp *rsp ) {
+ return ( ( rsp->flags & FCP_RSP_RESPONSE_LEN_VALID ) ?
+ ntohl ( rsp->response_len ) : 0 );
+}
+
+/**
+ * Get sense data portion of FCP response
+ *
+ * @v rsp FCP response
+ * @ret sense_data Sense data, or NULL if not present
+ */
+static inline void * fcp_rsp_sense_data ( struct fcp_rsp *rsp ) {
+ return ( ( rsp->flags & FCP_RSP_SENSE_LEN_VALID ) ?
+ ( ( ( void * ) rsp ) + sizeof ( *rsp ) +
+ fcp_rsp_response_data_len ( rsp ) ) : NULL );
+}
+
+/**
+ * Get length of sense data portion of FCP response
+ *
+ * @v rsp FCP response
+ * @ret sense_data_len Sense data length
+ */
+static inline size_t fcp_rsp_sense_data_len ( struct fcp_rsp *rsp ) {
+ return ( ( rsp->flags & FCP_RSP_SENSE_LEN_VALID ) ?
+ ntohl ( rsp->sense_len ) : 0 );
+}
+
+/** An FCP PRLI service parameter page */
+struct fcp_prli_service_parameters {
+ /** Flags */
+ uint32_t flags;
+} __attribute__ (( packed ));
+
+/** Write FCP_XFER_RDY disabled */
+#define FCP_PRLI_NO_WRITE_RDY 0x0001
+
+/** Read FCP_XFER_RDY disabled */
+#define FCP_PRLI_NO_READ_RDY 0x0002
+
+/** Has target functionality */
+#define FCP_PRLI_TARGET 0x0010
+
+/** Has initiator functionality */
+#define FCP_PRLI_INITIATOR 0x0020
+
+/** Data overlay allowed */
+#define FCP_PRLI_OVERLAY 0x0040
+
+/** Confirm completion allowed */
+#define FCP_PRLI_CONF 0x0080
+
+/** Retransmission supported */
+#define FCP_PRLI_RETRY 0x0100
+
+/** Task retry identification */
+#define FCP_PRLI_TASK_RETRY 0x0200
+
+/** REC ELS supported */
+#define FCP_PRLI_REC 0x0400
+
+/** Enhanced discovery supported */
+#define FCP_PRLI_ENH_DISC 0x0800
+
+#endif /* _IPXE_FCP_H */