| /*****************************************************************************/ | 
 | /* srp.h -- SCSI RDMA Protocol definitions                                   */ | 
 | /*                                                                           */ | 
 | /* Written By: Colin Devilbis, IBM Corporation                               */ | 
 | /*                                                                           */ | 
 | /* Copyright (C) 2003 IBM Corporation                                        */ | 
 | /*                                                                           */ | 
 | /* This program is free software; you can redistribute it and/or modify      */ | 
 | /* it under the terms of the GNU General Public License as published by      */ | 
 | /* the Free Software Foundation; either version 2 of the License, or         */ | 
 | /* (at your option) any later version.                                       */ | 
 | /*                                                                           */ | 
 | /* This program is distributed in the hope that it will be useful,           */ | 
 | /* but WITHOUT ANY WARRANTY; without even the implied warranty of            */ | 
 | /* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the             */ | 
 | /* GNU General Public License for more details.                              */ | 
 | /*                                                                           */ | 
 | /* You should have received a copy of the GNU General Public License         */ | 
 | /* along with this program; if not, write to the Free Software               */ | 
 | /* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */ | 
 | /*                                                                           */ | 
 | /*                                                                           */ | 
 | /* This file contains structures and definitions for the SCSI RDMA Protocol  */ | 
 | /* (SRP) as defined in the T10 standard available at www.t10.org.  This      */ | 
 | /* file was based on the 16a version of the standard                         */ | 
 | /*                                                                           */ | 
 | /*****************************************************************************/ | 
 | #ifndef SRP_H | 
 | #define SRP_H | 
 |  | 
 | #define PACKED __attribute__((packed)) | 
 |  | 
 | enum srp_types { | 
 | 	SRP_LOGIN_REQ_TYPE = 0x00, | 
 | 	SRP_LOGIN_RSP_TYPE = 0xC0, | 
 | 	SRP_LOGIN_REJ_TYPE = 0x80, | 
 | 	SRP_I_LOGOUT_TYPE = 0x03, | 
 | 	SRP_T_LOGOUT_TYPE = 0x80, | 
 | 	SRP_TSK_MGMT_TYPE = 0x01, | 
 | 	SRP_CMD_TYPE = 0x02, | 
 | 	SRP_RSP_TYPE = 0xC1, | 
 | 	SRP_CRED_REQ_TYPE = 0x81, | 
 | 	SRP_CRED_RSP_TYPE = 0x41, | 
 | 	SRP_AER_REQ_TYPE = 0x82, | 
 | 	SRP_AER_RSP_TYPE = 0x42 | 
 | }; | 
 |  | 
 | enum srp_descriptor_formats { | 
 | 	SRP_NO_BUFFER = 0x00, | 
 | 	SRP_DIRECT_BUFFER = 0x01, | 
 | 	SRP_INDIRECT_BUFFER = 0x02 | 
 | }; | 
 |  | 
 | struct memory_descriptor { | 
 | 	u64 virtual_address; | 
 | 	u32 memory_handle; | 
 | 	u32 length; | 
 | }; | 
 |  | 
 | struct indirect_descriptor { | 
 | 	struct memory_descriptor head; | 
 | 	u32 total_length; | 
 | 	struct memory_descriptor list[1] PACKED; | 
 | }; | 
 |  | 
 | struct srp_generic { | 
 | 	u8 type; | 
 | 	u8 reserved1[7]; | 
 | 	u64 tag; | 
 | }; | 
 |  | 
 | struct srp_login_req { | 
 | 	u8 type; | 
 | 	u8 reserved1[7]; | 
 | 	u64 tag; | 
 | 	u32 max_requested_initiator_to_target_iulen; | 
 | 	u32 reserved2; | 
 | 	u16 required_buffer_formats; | 
 | 	u8 reserved3:6; | 
 | 	u8 multi_channel_action:2; | 
 | 	u8 reserved4; | 
 | 	u32 reserved5; | 
 | 	u8 initiator_port_identifier[16]; | 
 | 	u8 target_port_identifier[16]; | 
 | }; | 
 |  | 
 | struct srp_login_rsp { | 
 | 	u8 type; | 
 | 	u8 reserved1[3]; | 
 | 	u32 request_limit_delta; | 
 | 	u64 tag; | 
 | 	u32 max_initiator_to_target_iulen; | 
 | 	u32 max_target_to_initiator_iulen; | 
 | 	u16 supported_buffer_formats; | 
 | 	u8 reserved2:6; | 
 | 	u8 multi_channel_result:2; | 
 | 	u8 reserved3; | 
 | 	u8 reserved4[24]; | 
 | }; | 
 |  | 
 | struct srp_login_rej { | 
 | 	u8 type; | 
 | 	u8 reserved1[3]; | 
 | 	u32 reason; | 
 | 	u64 tag; | 
 | 	u64 reserved2; | 
 | 	u16 supported_buffer_formats; | 
 | 	u8 reserved3[6]; | 
 | }; | 
 |  | 
 | struct srp_i_logout { | 
 | 	u8 type; | 
 | 	u8 reserved1[7]; | 
 | 	u64 tag; | 
 | }; | 
 |  | 
 | struct srp_t_logout { | 
 | 	u8 type; | 
 | 	u8 reserved1[3]; | 
 | 	u32 reason; | 
 | 	u64 tag; | 
 | }; | 
 |  | 
 | struct srp_tsk_mgmt { | 
 | 	u8 type; | 
 | 	u8 reserved1[7]; | 
 | 	u64 tag; | 
 | 	u32 reserved2; | 
 | 	u64 lun PACKED; | 
 | 	u8 reserved3; | 
 | 	u8 reserved4; | 
 | 	u8 task_mgmt_flags; | 
 | 	u8 reserved5; | 
 | 	u64 managed_task_tag; | 
 | 	u64 reserved6; | 
 | }; | 
 |  | 
 | struct srp_cmd { | 
 | 	u8 type; | 
 | 	u32 reserved1 PACKED; | 
 | 	u8 data_out_format:4; | 
 | 	u8 data_in_format:4; | 
 | 	u8 data_out_count; | 
 | 	u8 data_in_count; | 
 | 	u64 tag; | 
 | 	u32 reserved2; | 
 | 	u64 lun PACKED; | 
 | 	u8 reserved3; | 
 | 	u8 reserved4:5; | 
 | 	u8 task_attribute:3; | 
 | 	u8 reserved5; | 
 | 	u8 additional_cdb_len; | 
 | 	u8 cdb[16]; | 
 | 	u8 additional_data[0x100 - 0x30]; | 
 | }; | 
 |  | 
 | struct srp_rsp { | 
 | 	u8 type; | 
 | 	u8 reserved1[3]; | 
 | 	u32 request_limit_delta; | 
 | 	u64 tag; | 
 | 	u16 reserved2; | 
 | 	u8 reserved3:2; | 
 | 	u8 diunder:1; | 
 | 	u8 diover:1; | 
 | 	u8 dounder:1; | 
 | 	u8 doover:1; | 
 | 	u8 snsvalid:1; | 
 | 	u8 rspvalid:1; | 
 | 	u8 status; | 
 | 	u32 data_in_residual_count; | 
 | 	u32 data_out_residual_count; | 
 | 	u32 sense_data_list_length; | 
 | 	u32 response_data_list_length; | 
 | 	u8 sense_and_response_data[18]; | 
 | }; | 
 |  | 
 | struct srp_cred_req { | 
 | 	u8 type; | 
 | 	u8 reserved1[3]; | 
 | 	u32 request_limit_delta; | 
 | 	u64 tag; | 
 | }; | 
 |  | 
 | struct srp_cred_rsp { | 
 | 	u8 type; | 
 | 	u8 reserved1[7]; | 
 | 	u64 tag; | 
 | }; | 
 |  | 
 | struct srp_aer_req { | 
 | 	u8 type; | 
 | 	u8 reserved1[3]; | 
 | 	u32 request_limit_delta; | 
 | 	u64 tag; | 
 | 	u32 reserved2; | 
 | 	u64 lun; | 
 | 	u32 sense_data_list_length; | 
 | 	u32 reserved3; | 
 | 	u8 sense_data[20]; | 
 | }; | 
 |  | 
 | struct srp_aer_rsp { | 
 | 	u8 type; | 
 | 	u8 reserved1[7]; | 
 | 	u64 tag; | 
 | }; | 
 |  | 
 | union srp_iu { | 
 | 	struct srp_generic generic; | 
 | 	struct srp_login_req login_req; | 
 | 	struct srp_login_rsp login_rsp; | 
 | 	struct srp_login_rej login_rej; | 
 | 	struct srp_i_logout i_logout; | 
 | 	struct srp_t_logout t_logout; | 
 | 	struct srp_tsk_mgmt tsk_mgmt; | 
 | 	struct srp_cmd cmd; | 
 | 	struct srp_rsp rsp; | 
 | 	struct srp_cred_req cred_req; | 
 | 	struct srp_cred_rsp cred_rsp; | 
 | 	struct srp_aer_req aer_req; | 
 | 	struct srp_aer_rsp aer_rsp; | 
 | }; | 
 |  | 
 | #endif |