| /*****************************************************************************/ |
| /* 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 SRP_VERSION "16.a" |
| |
| #define PACKED __attribute__((packed)) |
| |
| enum srp_types { |
| SRP_LOGIN_REQ_TYPE = 0x00, |
| SRP_LOGIN_RSP_TYPE = 0xC0, |
| SRP_LOGIN_REJ_TYPE = 0xC2, |
| 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 |