[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>
This commit is contained in:
parent
bf2657075d
commit
d2a2618d76
|
@ -22,3 +22,10 @@ FILE_LICENCE ( GPL2_OR_LATER );
|
||||||
#ifdef FCMGMT_CMD
|
#ifdef FCMGMT_CMD
|
||||||
REQUIRE_OBJECT ( fcmgmt_cmd );
|
REQUIRE_OBJECT ( fcmgmt_cmd );
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Drag in Fibre Channel-specific protocols
|
||||||
|
*/
|
||||||
|
#ifdef SANBOOT_PROTO_FCP
|
||||||
|
REQUIRE_OBJECT ( fcp );
|
||||||
|
#endif
|
||||||
|
|
|
@ -33,5 +33,6 @@ FILE_LICENCE ( GPL2_OR_LATER );
|
||||||
#define SANBOOT_PROTO_ISCSI /* iSCSI protocol */
|
#define SANBOOT_PROTO_ISCSI /* iSCSI protocol */
|
||||||
#define SANBOOT_PROTO_AOE /* AoE protocol */
|
#define SANBOOT_PROTO_AOE /* AoE protocol */
|
||||||
#define SANBOOT_PROTO_IB_SRP /* Infiniband SCSI RDMA protocol */
|
#define SANBOOT_PROTO_IB_SRP /* Infiniband SCSI RDMA protocol */
|
||||||
|
#define SANBOOT_PROTO_FCP /* Fibre Channel protocol */
|
||||||
|
|
||||||
#endif /* CONFIG_DEFAULTS_PCBIOS_H */
|
#endif /* CONFIG_DEFAULTS_PCBIOS_H */
|
||||||
|
|
|
@ -68,6 +68,7 @@ FILE_LICENCE ( GPL2_OR_LATER );
|
||||||
//#undef SANBOOT_PROTO_ISCSI /* iSCSI protocol */
|
//#undef SANBOOT_PROTO_ISCSI /* iSCSI protocol */
|
||||||
//#undef SANBOOT_PROTO_AOE /* AoE protocol */
|
//#undef SANBOOT_PROTO_AOE /* AoE protocol */
|
||||||
//#undef SANBOOT_PROTO_IB_SRP /* Infiniband SCSI RDMA protocol */
|
//#undef SANBOOT_PROTO_IB_SRP /* Infiniband SCSI RDMA protocol */
|
||||||
|
//#undef SANBOOT_PROTO_FCP /* Fibre Channel protocol */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* 802.11 cryptosystems and handshaking protocols
|
* 802.11 cryptosystems and handshaking protocols
|
||||||
|
|
|
@ -186,6 +186,7 @@ FILE_LICENCE ( GPL2_OR_LATER );
|
||||||
#define ERRFILE_eth_slow ( ERRFILE_NET | 0x002a0000 )
|
#define ERRFILE_eth_slow ( ERRFILE_NET | 0x002a0000 )
|
||||||
#define ERRFILE_fc ( ERRFILE_NET | 0x002b0000 )
|
#define ERRFILE_fc ( ERRFILE_NET | 0x002b0000 )
|
||||||
#define ERRFILE_fcels ( ERRFILE_NET | 0x002c0000 )
|
#define ERRFILE_fcels ( ERRFILE_NET | 0x002c0000 )
|
||||||
|
#define ERRFILE_fcp ( ERRFILE_NET | 0x002d0000 )
|
||||||
|
|
||||||
#define ERRFILE_image ( ERRFILE_IMAGE | 0x00000000 )
|
#define ERRFILE_image ( ERRFILE_IMAGE | 0x00000000 )
|
||||||
#define ERRFILE_elf ( ERRFILE_IMAGE | 0x00010000 )
|
#define ERRFILE_elf ( ERRFILE_IMAGE | 0x00010000 )
|
||||||
|
|
|
@ -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 */
|
File diff suppressed because it is too large
Load Diff
Reference in New Issue