david/ipxe
david
/
ipxe
Archived
1
0
Fork 0
This repository has been archived on 2020-12-06. You can view files and clone it, but cannot push or open issues or pull requests.
ipxe/src/include/ipxe/fcp.h

167 lines
3.7 KiB
C

#ifndef _IPXE_FCP_H
#define _IPXE_FCP_H
/**
* @file
*
* Fibre Channel Protocol
*
*/
FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
#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 */