176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#ifndef _GPXE_SRP_H 276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define _GPXE_SRP_H 376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** @file 576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * SCSI RDMA Protocol 776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 1076d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanFILE_LICENCE ( BSD2 ); 1176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 1276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <stdint.h> 1376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <byteswap.h> 1476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <gpxe/iobuf.h> 1576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <gpxe/xfer.h> 1676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <gpxe/scsi.h> 1776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 1876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/***************************************************************************** 1976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 2076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Common fields 2176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 2276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ***************************************************************************** 2376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 2476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 2576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** An SRP information unit tag */ 2676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstruct srp_tag { 2776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint32_t dwords[2]; 2876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} __attribute__ (( packed )); 2976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 3076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** An SRP port ID */ 3176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstruct srp_port_id { 3276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint8_t bytes[16]; 3376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} __attribute__ (( packed )); 3476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 3576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** An SRP port ID pair */ 3676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstruct srp_port_ids { 3776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /** Initiator port ID */ 3876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman struct srp_port_id initiator; 3976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /** Target port ID */ 4076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman struct srp_port_id target; 4176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} __attribute__ (( packed )); 4276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 4376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** SRP information unit common fields */ 4476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstruct srp_common { 4576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /** Information unit type */ 4676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint8_t type; 4776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /** Reserved */ 4876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint8_t reserved0[7]; 4976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /** Tag */ 5076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman struct srp_tag tag; 5176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} __attribute__ (( packed )); 5276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 5376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/***************************************************************************** 5476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 5576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Login request 5676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 5776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ***************************************************************************** 5876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 5976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 6076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** An SRP login request information unit */ 6176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstruct srp_login_req { 6276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /** Information unit type 6376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 6476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * This must be @c SRP_LOGIN_REQ 6576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 6676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint8_t type; 6776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /** Reserved */ 6876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint8_t reserved0[7]; 6976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /** Tag */ 7076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman struct srp_tag tag; 7176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /** Requested maximum initiator to target IU length */ 7276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint32_t max_i_t_iu_len; 7376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /** Reserved */ 7476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint8_t reserved1[4]; 7576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /** Required buffer formats 7676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 7776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * This is the bitwise OR of one or more @c 7876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * SRP_LOGIN_REQ_FMT_XXX constants. 7976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 8076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint16_t required_buffer_formats; 8176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /** Flags 8276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 8376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * This is the bitwise OR of zero or more @c 8476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * SRP_LOGIN_REQ_FLAG_XXX and @c SRP_LOGIN_REQ_MCA_XXX 8576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * constants. 8676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 8776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint8_t flags; 8876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /** Reserved */ 8976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint8_t reserved2[5]; 9076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /** Initiator and target port identifiers */ 9176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman struct srp_port_ids port_ids; 9276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} __attribute__ (( packed )); 9376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 9476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Type of an SRP login request */ 9576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_LOGIN_REQ 0x00 9676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 9776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Require indirect data buffer descriptor format */ 9876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_LOGIN_REQ_FMT_IDBD 0x04 9976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 10076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Require direct data buffer descriptor format */ 10176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_LOGIN_REQ_FMT_DDBD 0x02 10276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 10376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Use solicited notification for asynchronous events */ 10476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_LOGIN_REQ_FLAG_AESOLNT 0x40 10576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 10676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Use solicited notification for credit request */ 10776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_LOGIN_REQ_FLAG_CRSOLNT 0x20 10876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 10976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Use solicited notification for logouts */ 11076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_LOGIN_REQ_FLAG_LOSOLNT 0x10 11176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 11276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Multi-channel action mask */ 11376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_LOGIN_REQ_MCA_MASK 0x03 11476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 11576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Single RDMA channel operation */ 11676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_LOGIN_REQ_MCA_SINGLE_CHANNEL 0x00 11776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 11876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Multiple independent RDMA channel operation */ 11976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_LOGIN_REQ_MCA_MULTIPLE_CHANNELS 0x01 12076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 12176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/***************************************************************************** 12276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 12376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Login response 12476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 12576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ***************************************************************************** 12676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 12776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 12876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** An SRP login response */ 12976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstruct srp_login_rsp { 13076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /** Information unit type 13176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 13276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * This must be @c SRP_LOGIN_RSP 13376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 13476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint8_t type; 13576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /** Reserved */ 13676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint8_t reserved0[3]; 13776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /** Request limit delta */ 13876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint32_t request_limit_delta; 13976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /** Tag */ 14076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman struct srp_tag tag; 14176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /** Maximum initiator to target IU length */ 14276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint32_t max_i_t_iu_len; 14376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /** Maximum target to initiator IU length */ 14476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint32_t max_t_i_iu_len; 14576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /** Supported buffer formats 14676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 14776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * This is the bitwise OR of one or more @c 14876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * SRP_LOGIN_RSP_FMT_XXX constants. 14976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 15076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint16_t supported_buffer_formats; 15176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /** Flags 15276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 15376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * This is the bitwise OR of zero or more @c 15476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * SRP_LOGIN_RSP_FLAG_XXX and @c SRP_LOGIN_RSP_MCR_XXX 15576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * constants. 15676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 15776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint8_t flags; 15876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /** Reserved */ 15976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint8_t reserved1[25]; 16076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} __attribute__ (( packed )); 16176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 16276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Type of an SRP login response */ 16376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_LOGIN_RSP 0xc0 16476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 16576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Indirect data buffer descriptor format supported */ 16676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_LOGIN_RSP_FMT_IDBD 0x04 16776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 16876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Direct data buffer descriptor format supported */ 16976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_LOGIN_RSP_FMT_DDBD 0x02 17076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 17176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Solicited notification is supported */ 17276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_LOGIN_RSP_FLAG_SOLNTSUP 0x10 17376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 17476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Multi-channel result mask */ 17576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_LOGIN_RSP_MCR_MASK 0x03 17676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 17776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** No existing RDMA channels were associated with the same I_T nexus */ 17876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_LOGIN_RSP_MCR_NO_EXISTING_CHANNELS 0x00 17976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 18076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** One or more existing RDMA channels were terminated */ 18176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_LOGIN_RSP_MCR_EXISTING_CHANNELS_TERMINATED 0x01 18276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 18376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** One or more existing RDMA channels continue to operate independently */ 18476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_LOGIN_RSP_MCR_EXISTING_CHANNELS_CONTINUE 0x02 18576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 18676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/***************************************************************************** 18776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 18876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Login rejection 18976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 19076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ***************************************************************************** 19176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 19276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 19376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** An SRP login rejection */ 19476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstruct srp_login_rej { 19576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /** Information unit type 19676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 19776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * This must be @c SRP_LOGIN_REJ 19876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 19976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint8_t type; 20076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /** Reserved */ 20176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint8_t reserved0[3]; 20276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /** Reason 20376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 20476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * This is a @c SRP_LOGIN_REJ_REASON_XXX constant. 20576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 20676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint32_t reason; 20776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /** Tag */ 20876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman struct srp_tag tag; 20976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /** Reserved */ 21076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint8_t reserved1[8]; 21176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /** Supported buffer formats 21276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 21376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * This is the bitwise OR of one or more @c 21476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * SRP_LOGIN_REJ_FMT_XXX constants. 21576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 21676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint16_t supported_buffer_formats; 21776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /** Reserved */ 21876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint8_t reserved2[6]; 21976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} __attribute__ (( packed )); 22076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 22176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Type of an SRP login rejection */ 22276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_LOGIN_REJ 0xc2 22376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 22476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Unable to establish RDMA channel, no reason specified */ 22576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_LOGIN_REJ_REASON_UNKNOWN 0x00010000UL 22676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 22776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Insufficient RDMA channel resources */ 22876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_LOGIN_REJ_REASON_INSUFFICIENT_RESOURCES 0x00010001UL 22976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 23076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Requested maximum initiator to target IU length value too large */ 23176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_LOGIN_REJ_REASON_BAD_MAX_I_T_IU_LEN 0x00010002UL 23276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 23376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Unable to associate RDMA channel with specified I_T nexus */ 23476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_LOGIN_REJ_REASON_CANNOT_ASSOCIATE 0x00010003UL 23576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 23676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** One or more requested data buffer descriptor formats are not supported */ 23776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_LOGIN_REJ_REASON_UNSUPPORTED_BUFFER_FORMAT 0x00010004UL 23876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 23976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** SRP target port does not support multiple RDMA channels per I_T nexus */ 24076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_LOGIN_REJ_REASON_NO_MULTIPLE_CHANNELS 0x00010005UL 24176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 24276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** RDMA channel limit reached for this initiator */ 24376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_LOGIN_REJ_REASON_NO_MORE_CHANNELS 0x00010006UL 24476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 24576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Indirect data buffer descriptor format supported */ 24676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_LOGIN_REJ_FMT_IDBD 0x04 24776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 24876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Direct data buffer descriptor format supported */ 24976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_LOGIN_REJ_FMT_DDBD 0x02 25076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 25176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/***************************************************************************** 25276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 25376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Initiator logout 25476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 25576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ***************************************************************************** 25676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 25776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 25876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** An SRP initiator logout request */ 25976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstruct srp_i_logout { 26076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /** Information unit type 26176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 26276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * This must be @c SRP_I_LOGOUT 26376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 26476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint8_t type; 26576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /** Reserved */ 26676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint8_t reserved0[7]; 26776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /** Tag */ 26876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman struct srp_tag tag; 26976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} __attribute__ (( packed )); 27076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 27176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Type of an SRP initiator logout request */ 27276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_I_LOGOUT 0x03 27376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 27476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/***************************************************************************** 27576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 27676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Target logout 27776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 27876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ***************************************************************************** 27976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 28076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 28176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** An SRP target logout request */ 28276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstruct srp_t_logout { 28376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /** Information unit type 28476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 28576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * This must be @c SRP_T_LOGOUT 28676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 28776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint8_t type; 28876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /** Flags 28976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 29076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * This is the bitwise OR of zero or more @c 29176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * SRP_T_LOGOUT_FLAG_XXX constants. 29276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 29376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint8_t flags; 29476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /** Reserved */ 29576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint8_t reserved0[2]; 29676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /** Reason 29776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 29876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * This is a @c SRP_T_LOGOUT_REASON_XXX constant. 29976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 30076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint32_t reason; 30176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /** Tag */ 30276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman struct srp_tag tag; 30376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} __attribute__ (( packed )); 30476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 30576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Type of an SRP target logout request */ 30676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_T_LOGOUT 0x80 30776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 30876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** The initiator specified solicited notification of logouts */ 30976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_T_LOGOUT_FLAG_SOLNT 0x01 31076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 31176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** No reason specified */ 31276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_T_LOGOUT_REASON_UNKNOWN 0x00000000UL 31376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 31476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Inactive RDMA channel (reclaiming resources) */ 31576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_T_LOGOUT_REASON_INACTIVE 0x00000001UL 31676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 31776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Invalid information unit type code received by SRP target port */ 31876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_T_LOGOUT_REASON_INVALID_TYPE 0x00000002UL 31976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 32076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** SRP initiator port sent response with no corresponding request */ 32176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_T_LOGOUT_REASON_SPURIOUS_RESPONSE 0x00000003UL 32276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 32376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** RDMA channel disconnected due to multi-channel action code in new login */ 32476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_T_LOGOUT_REASON_MCA 0x00000004UL 32576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 32676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Unsuppported format code value specified in data-out buffer descriptor */ 32776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_T_LOGOUT_UNSUPPORTED_DATA_OUT_FORMAT 0x00000005UL 32876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 32976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Unsuppported format code value specified in data-in buffer descriptor */ 33076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_T_LOGOUT_UNSUPPORTED_DATA_IN_FORMAT 0x00000006UL 33176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 33276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Invalid length for IU type */ 33376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_T_LOGOUT_INVALID_IU_LEN 0x00000008UL 33476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 33576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/***************************************************************************** 33676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 33776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Task management 33876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 33976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ***************************************************************************** 34076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 34176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 34276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** An SRP task management request */ 34376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstruct srp_tsk_mgmt { 34476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /** Information unit type 34576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 34676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * This must be @c SRP_TSK_MGMT 34776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 34876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint8_t type; 34976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /** Flags 35076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 35176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * This is the bitwise OR of zero or more 35276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @c SRP_TSK_MGMT_FLAG_XXX constants. 35376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 35476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint8_t flags; 35576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /** Reserved */ 35676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint8_t reserved0[6]; 35776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /** Tag */ 35876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman struct srp_tag tag; 35976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /** Reserved */ 36076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint8_t reserved1[4]; 36176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /** Logical unit number */ 36276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman struct scsi_lun lun; 36376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /** Reserved */ 36476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint8_t reserved2[2]; 36576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /** Task management function 36676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 36776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * This is a @c SRP_TASK_MGMT_FUNC_XXX constant 36876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 36976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint8_t function; 37076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /** Reserved */ 37176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint8_t reserved3[1]; 37276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /** Tag of task to be managed */ 37376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman struct srp_tag managed_tag; 37476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /** Reserved */ 37576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint8_t reserved4[8]; 37676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} __attribute__ (( packed )); 37776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 37876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Type of an SRP task management request */ 37976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_TSK_MGMT 0x01 38076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 38176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Use solicited notification for unsuccessful completions */ 38276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_TSK_MGMT_FLAG_UCSOLNT 0x04 38376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 38476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Use solicited notification for successful completions */ 38576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_TSK_MGMT_FLAG_SCSOLNT 0x02 38676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 38776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** The task manager shall perform an ABORT TASK function */ 38876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_TSK_MGMT_FUNC_ABORT_TASK 0x01 38976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 39076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** The task manager shall perform an ABORT TASK SET function */ 39176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_TSK_MGMT_FUNC_ABORT_TASK_SET 0x02 39276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 39376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** The task manager shall perform a CLEAR TASK SET function */ 39476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_TSK_MGMT_FUNC_CLEAR_TASK_SET 0x04 39576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 39676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** The task manager shall perform a LOGICAL UNIT RESET function */ 39776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_TSK_MGMT_FUNC_LOGICAL_UNIT_RESET 0x08 39876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 39976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** The task manager shall perform a CLEAR ACA function */ 40076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_TSK_MGMT_FUNC_CLEAR_ACA 0x40 40176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 40276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/***************************************************************************** 40376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 40476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * SCSI command 40576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 40676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ***************************************************************************** 40776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 40876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 40976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** An SRP SCSI command */ 41076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstruct srp_cmd { 41176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /** Information unit type 41276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 41376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * This must be @c SRP_CMD 41476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 41576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint8_t type; 41676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /** Flags 41776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 41876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * This is the bitwise OR of zero or more @c SRP_CMD_FLAG_XXX 41976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * constants. 42076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 42176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint8_t flags; 42276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /** Reserved */ 42376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint8_t reserved0[3]; 42476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /** Data buffer descriptor formats 42576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 42676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * This is the bitwise OR of one @c SRP_CMD_DO_FMT_XXX and one @c 42776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * SRP_CMD_DI_FMT_XXX constant. 42876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 42976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint8_t data_buffer_formats; 43076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /** Data-out buffer descriptor count */ 43176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint8_t data_out_buffer_count; 43276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /** Data-in buffer descriptor count */ 43376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint8_t data_in_buffer_count; 43476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /** Tag */ 43576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman struct srp_tag tag; 43676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /** Reserved */ 43776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint8_t reserved1[4]; 43876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /** Logical unit number */ 43976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman struct scsi_lun lun; 44076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /** Reserved */ 44176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint8_t reserved2[1]; 44276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /** Task attribute 44376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 44476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * This is a @c SRP_CMD_TASK_ATTR_XXX constant. 44576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 44676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint8_t task_attr; 44776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /** Reserved */ 44876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint8_t reserved3[1]; 44976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /** Additional CDB length */ 45076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint8_t additional_cdb_len; 45176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /** Command data block */ 45276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman union scsi_cdb cdb; 45376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} __attribute__ (( packed )); 45476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 45576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Type of an SRP SCSI command */ 45676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_CMD 0x02 45776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 45876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Use solicited notification for unsuccessful completions */ 45976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_CMD_FLAG_UCSOLNT 0x04 46076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 46176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Use solicited notification for successful completions */ 46276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_CMD_FLAG_SCSOLNT 0x02 46376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 46476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Data-out buffer format mask */ 46576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_CMD_DO_FMT_MASK 0xf0 46676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 46776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Direct data-out buffer format */ 46876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_CMD_DO_FMT_DIRECT 0x10 46976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 47076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Indirect data-out buffer format */ 47176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_CMD_DO_FMT_INDIRECT 0x20 47276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 47376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Data-in buffer format mask */ 47476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_CMD_DI_FMT_MASK 0x0f 47576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 47676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Direct data-in buffer format */ 47776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_CMD_DI_FMT_DIRECT 0x01 47876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 47976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Indirect data-in buffer format */ 48076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_CMD_DI_FMT_INDIRECT 0x02 48176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 48276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Use the rules for a simple task attribute */ 48376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_CMD_TASK_ATTR_SIMPLE 0x00 48476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 48576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Use the rules for a head of queue task attribute */ 48676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_CMD_TASK_ATTR_QUEUE_HEAD 0x01 48776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 48876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Use the rules for an ordered task attribute */ 48976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_CMD_TASK_ATTR_ORDERED 0x02 49076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 49176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Use the rules for an automatic contingent allegiance task attribute */ 49276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_CMD_TASK_ATTR_AUTOMATIC_CONTINGENT_ALLEGIANCE 0x08 49376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 49476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** An SRP memory descriptor */ 49576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstruct srp_memory_descriptor { 49676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /** Virtual address */ 49776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint64_t address; 49876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /** Memory handle */ 49976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint32_t handle; 50076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /** Data length */ 50176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint32_t len; 50276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} __attribute__ (( packed )); 50376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 50476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/***************************************************************************** 50576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 50676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * SCSI response 50776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 50876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ***************************************************************************** 50976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 51076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 51176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** An SRP SCSI response */ 51276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstruct srp_rsp { 51376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /** Information unit type 51476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 51576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * This must be @c SRP_RSP 51676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 51776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint8_t type; 51876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /** Flags 51976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 52076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * This is the bitwise OR of zero or more @c SRP_RSP_FLAG_XXX 52176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * constants. 52276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 52376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint8_t flags; 52476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /** Reserved */ 52576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint8_t reserved0[2]; 52676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /** Request limit delta */ 52776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint32_t request_limit_delta; 52876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /** Tag */ 52976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman struct srp_tag tag; 53076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /** Reserved */ 53176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint8_t reserved1[2]; 53276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /** Valid fields 53376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 53476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * This is the bitwise OR of zero or more @c SRP_RSP_VALID_XXX 53576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * constants. 53676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 53776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint8_t valid; 53876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /** Status 53976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 54076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * This is the SCSI status code. 54176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 54276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint8_t status; 54376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /** Data-out residual count */ 54476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint32_t data_out_residual_count; 54576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /** Data-in residual count */ 54676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint32_t data_in_residual_count; 54776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /** Sense data list length */ 54876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint32_t sense_data_len; 54976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /** Response data list length */ 55076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint32_t response_data_len; 55176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} __attribute__ (( packed )); 55276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 55376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Type of an SRP SCSI response */ 55476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_RSP 0xc1 55576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 55676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** The initiator specified solicited notification of this response */ 55776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_RSP_FLAG_SOLNT 0x01 55876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 55976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Data-in residual count field is valid and represents an underflow */ 56076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_RSP_VALID_DIUNDER 0x20 56176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 56276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Data-in residual count field is valid and represents an overflow */ 56376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_RSP_VALID_DIOVER 0x10 56476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 56576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Data-out residual count field is valid and represents an underflow */ 56676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_RSP_VALID_DOUNDER 0x08 56776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 56876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Data-out residual count field is valid and represents an overflow */ 56976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_RSP_VALID_DOOVER 0x04 57076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 57176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Sense data list length field is valid */ 57276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_RSP_VALID_SNSVALID 0x02 57376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 57476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Response data list length field is valid */ 57576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_RSP_VALID_RSPVALID 0x01 57676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 57776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** 57876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Get response data portion of SCSI response 57976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 58076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @v rsp SCSI response 58176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @ret response_data Response data, or NULL if not present 58276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 58376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic inline void * srp_rsp_response_data ( struct srp_rsp *rsp ) { 58476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return ( ( rsp->valid & SRP_RSP_VALID_RSPVALID ) ? 58576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ( ( ( void * ) rsp ) + sizeof ( *rsp ) ) : NULL ); 58676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 58776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 58876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** 58976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Get length of response data portion of SCSI response 59076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 59176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @v rsp SCSI response 59276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @ret response_data_len Response data length 59376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 59476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic inline size_t srp_rsp_response_data_len ( struct srp_rsp *rsp ) { 59576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return ( ( rsp->valid & SRP_RSP_VALID_RSPVALID ) ? 59676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ntohl ( rsp->response_data_len ) : 0 ); 59776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 59876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 59976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** 60076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Get sense data portion of SCSI response 60176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 60276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @v rsp SCSI response 60376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @ret sense_data Sense data, or NULL if not present 60476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 60576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic inline void * srp_rsp_sense_data ( struct srp_rsp *rsp ) { 60676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return ( ( rsp->valid & SRP_RSP_VALID_SNSVALID ) ? 60776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ( ( ( void * ) rsp ) + sizeof ( *rsp ) + 60876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman srp_rsp_response_data_len ( rsp ) ) : NULL ); 60976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 61076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 61176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** 61276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Get length of sense data portion of SCSI response 61376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 61476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @v rsp SCSI response 61576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @ret sense_data_len Sense data length 61676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 61776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic inline size_t srp_rsp_sense_data_len ( struct srp_rsp *rsp ) { 61876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return ( ( rsp->valid & SRP_RSP_VALID_SNSVALID ) ? 61976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ntohl ( rsp->sense_data_len ) : 0 ); 62076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 62176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 62276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/***************************************************************************** 62376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 62476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Credit request 62576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 62676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ***************************************************************************** 62776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 62876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 62976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** An SRP credit request */ 63076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstruct srp_cred_req { 63176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /** Information unit type 63276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 63376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * This must be @c SRP_CRED_REQ 63476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 63576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint8_t type; 63676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /** Flags 63776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 63876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * This is the bitwise OR of zero or more 63976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @c SRP_CRED_REQ_FLAG_XXX constants. 64076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 64176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint8_t flags; 64276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /** Reserved */ 64376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint8_t reserved0[2]; 64476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /** Request limit delta */ 64576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint32_t request_limit_delta; 64676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /** Tag */ 64776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman struct srp_tag tag; 64876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} __attribute__ (( packed )); 64976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 65076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Type of an SRP credit request */ 65176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_CRED_REQ 0x81 65276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 65376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** The initiator specified solicited notification of credit requests */ 65476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_CRED_REQ_FLAG_SOLNT 0x01 65576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 65676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/***************************************************************************** 65776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 65876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Credit response 65976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 66076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ***************************************************************************** 66176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 66276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 66376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** An SRP credit response */ 66476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstruct srp_cred_rsp { 66576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /** Information unit type 66676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 66776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * This must be @c SRP_CRED_RSP 66876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 66976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint8_t type; 67076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /** Reserved */ 67176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint8_t reserved0[7]; 67276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /** Tag */ 67376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman struct srp_tag tag; 67476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} __attribute__ (( packed )); 67576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 67676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Type of an SRP credit response */ 67776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_CRED_RSP 0x41 67876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 67976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/***************************************************************************** 68076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 68176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Asynchronous event request 68276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 68376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ***************************************************************************** 68476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 68576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 68676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** An SRP asynchronous event request */ 68776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstruct srp_aer_req { 68876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /** Information unit type 68976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 69076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * This must be @c SRP_AER_REQ 69176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 69276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint8_t type; 69376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /** Flags 69476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 69576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * This is the bitwise OR of zero or more @c 69676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * SRP_AER_REQ_FLAG_XXX constants. 69776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 69876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint8_t flags; 69976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /** Reserved */ 70076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint8_t reserved0[2]; 70176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /** Request limit delta */ 70276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint32_t request_limit_delta; 70376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /** Tag */ 70476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman struct srp_tag tag; 70576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /** Reserved */ 70676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint8_t reserved1[4]; 70776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /** Logical unit number */ 70876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman struct scsi_lun lun; 70976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /** Sense data list length */ 71076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint32_t sense_data_len; 71176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /** Reserved */ 71276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint8_t reserved2[4]; 71376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} __attribute__ (( packed )); 71476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 71576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Type of an SRP asynchronous event request */ 71676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_AER_REQ 0x82 71776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 71876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** The initiator specified solicited notification of asynchronous events */ 71976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_AER_REQ_FLAG_SOLNT 0x01 72076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 72176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** 72276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Get sense data portion of asynchronous event request 72376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 72476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @v aer_req SRP asynchronous event request 72576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @ret sense_data Sense data 72676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 72776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic inline __always_inline void * 72876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmansrp_aer_req_sense_data ( struct srp_aer_req *aer_req ) { 72976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return ( ( ( void * ) aer_req ) + sizeof ( *aer_req ) ); 73076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 73176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 73276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** 73376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Get length of sense data portion of asynchronous event request 73476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 73576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @v aer_req SRP asynchronous event request 73676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @ret sense_data_len Sense data length 73776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 73876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic inline __always_inline size_t 73976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmansrp_aer_req_sense_data_len ( struct srp_aer_req *aer_req ) { 74076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return ( ntohl ( aer_req->sense_data_len ) ); 74176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 74276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 74376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/***************************************************************************** 74476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 74576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Asynchronous event response 74676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 74776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ***************************************************************************** 74876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 74976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 75076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** An SRP asynchronous event response */ 75176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstruct srp_aer_rsp { 75276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /** Information unit type 75376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 75476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * This must be @c SRP_AER_RSP 75576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 75676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint8_t type; 75776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /** Reserved */ 75876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint8_t reserved0[7]; 75976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /** Tag */ 76076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman struct srp_tag tag; 76176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} __attribute__ (( packed )); 76276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 76376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Type of an SRP asynchronous event response */ 76476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_AER_RSP 0x42 76576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 76676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/***************************************************************************** 76776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 76876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Information units 76976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 77076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ***************************************************************************** 77176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 77276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 77376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Maximum length of any initiator-to-target IU that we will send 77476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 77576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * The longest IU is a SRP_CMD with no additional CDB and two direct 77676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * data buffer descriptors, which comes to 80 bytes. 77776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 77876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_MAX_I_T_IU_LEN 80 77976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 78076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/***************************************************************************** 78176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 78276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * SRP device 78376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 78476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ***************************************************************************** 78576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 78676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 78776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstruct srp_device; 78876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 78976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** An SRP transport type */ 79076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstruct srp_transport_type { 79176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /** Length of transport private data */ 79276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman size_t priv_len; 79376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /** Parse root path 79476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 79576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @v srp SRP device 79676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @v root_path Root path 79776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @ret Return status code 79876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 79976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman int ( * parse_root_path ) ( struct srp_device *srp, 80076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman const char *root_path ); 80176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /** Connect SRP session 80276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 80376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @v srp SRP device 80476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @ret rc Return status code 80576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 80676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * This method should open the underlying socket. 80776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 80876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman int ( * connect ) ( struct srp_device *srp ); 80976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman}; 81076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 81176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** An SRP device */ 81276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstruct srp_device { 81376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /** Reference count */ 81476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman struct refcnt refcnt; 81576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 81676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /** Initiator and target port IDs */ 81776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman struct srp_port_ids port_ids; 81876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /** Logical unit number */ 81976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman struct scsi_lun lun; 82076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /** Memory handle */ 82176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman uint32_t memory_handle; 82276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 82376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /** Current state 82476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 82576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * This is the bitwise-OR of zero or more @c SRP_STATE_XXX 82676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * flags. 82776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 82876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman unsigned int state; 82976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /** Retry counter */ 83076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman unsigned int retry_count; 83176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /** Current SCSI command */ 83276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman struct scsi_command *command; 83376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 83476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /** Underlying data transfer interface */ 83576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman struct xfer_interface socket; 83676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 83776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /** Transport type */ 83876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman struct srp_transport_type *transport; 83976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /** Transport private data */ 84076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman char transport_priv[0]; 84176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman}; 84276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 84376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** 84476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Get SRP transport private data 84576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 84676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @v srp SRP device 84776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @ret priv SRP transport private data 84876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 84976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic inline __always_inline void * 85076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmansrp_transport_priv ( struct srp_device *srp ) { 85176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return ( ( void * ) srp->transport_priv ); 85276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 85376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 85476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** SRP state flags */ 85576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanenum srp_state { 85676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /** Underlying socket is open */ 85776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman SRP_STATE_SOCKET_OPEN = 0x0001, 85876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /** Session is logged in */ 85976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman SRP_STATE_LOGGED_IN = 0x0002, 86076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman}; 86176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 86276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Maximum number of SRP retry attempts */ 86376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define SRP_MAX_RETRIES 3 86476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 86576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanextern int srp_attach ( struct scsi_device *scsi, const char *root_path ); 86676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanextern void srp_detach ( struct scsi_device *scsi ); 86776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 86876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#endif /* _GPXE_SRP_H */ 869