1*aef9ec39SRoland Dreier /* 2*aef9ec39SRoland Dreier * Copyright (c) 2005 Cisco Systems. All rights reserved. 3*aef9ec39SRoland Dreier * 4*aef9ec39SRoland Dreier * This software is available to you under a choice of one of two 5*aef9ec39SRoland Dreier * licenses. You may choose to be licensed under the terms of the GNU 6*aef9ec39SRoland Dreier * General Public License (GPL) Version 2, available from the file 7*aef9ec39SRoland Dreier * COPYING in the main directory of this source tree, or the 8*aef9ec39SRoland Dreier * OpenIB.org BSD license below: 9*aef9ec39SRoland Dreier * 10*aef9ec39SRoland Dreier * Redistribution and use in source and binary forms, with or 11*aef9ec39SRoland Dreier * without modification, are permitted provided that the following 12*aef9ec39SRoland Dreier * conditions are met: 13*aef9ec39SRoland Dreier * 14*aef9ec39SRoland Dreier * - Redistributions of source code must retain the above 15*aef9ec39SRoland Dreier * copyright notice, this list of conditions and the following 16*aef9ec39SRoland Dreier * disclaimer. 17*aef9ec39SRoland Dreier * 18*aef9ec39SRoland Dreier * - Redistributions in binary form must reproduce the above 19*aef9ec39SRoland Dreier * copyright notice, this list of conditions and the following 20*aef9ec39SRoland Dreier * disclaimer in the documentation and/or other materials 21*aef9ec39SRoland Dreier * provided with the distribution. 22*aef9ec39SRoland Dreier * 23*aef9ec39SRoland Dreier * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 24*aef9ec39SRoland Dreier * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 25*aef9ec39SRoland Dreier * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 26*aef9ec39SRoland Dreier * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 27*aef9ec39SRoland Dreier * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 28*aef9ec39SRoland Dreier * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 29*aef9ec39SRoland Dreier * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 30*aef9ec39SRoland Dreier * SOFTWARE. 31*aef9ec39SRoland Dreier * 32*aef9ec39SRoland Dreier * $Id$ 33*aef9ec39SRoland Dreier */ 34*aef9ec39SRoland Dreier 35*aef9ec39SRoland Dreier #ifndef SCSI_SRP_H 36*aef9ec39SRoland Dreier #define SCSI_SRP_H 37*aef9ec39SRoland Dreier 38*aef9ec39SRoland Dreier /* 39*aef9ec39SRoland Dreier * Structures and constants for the SCSI RDMA Protocol (SRP) as 40*aef9ec39SRoland Dreier * defined by the INCITS T10 committee. This file was written using 41*aef9ec39SRoland Dreier * draft Revision 16a of the SRP standard. 42*aef9ec39SRoland Dreier */ 43*aef9ec39SRoland Dreier 44*aef9ec39SRoland Dreier #include <linux/types.h> 45*aef9ec39SRoland Dreier 46*aef9ec39SRoland Dreier enum { 47*aef9ec39SRoland Dreier SRP_LOGIN_REQ = 0x00, 48*aef9ec39SRoland Dreier SRP_TSK_MGMT = 0x01, 49*aef9ec39SRoland Dreier SRP_CMD = 0x02, 50*aef9ec39SRoland Dreier SRP_I_LOGOUT = 0x03, 51*aef9ec39SRoland Dreier SRP_LOGIN_RSP = 0xc0, 52*aef9ec39SRoland Dreier SRP_RSP = 0xc1, 53*aef9ec39SRoland Dreier SRP_LOGIN_REJ = 0xc2, 54*aef9ec39SRoland Dreier SRP_T_LOGOUT = 0x80, 55*aef9ec39SRoland Dreier SRP_CRED_REQ = 0x81, 56*aef9ec39SRoland Dreier SRP_AER_REQ = 0x82, 57*aef9ec39SRoland Dreier SRP_CRED_RSP = 0x41, 58*aef9ec39SRoland Dreier SRP_AER_RSP = 0x42 59*aef9ec39SRoland Dreier }; 60*aef9ec39SRoland Dreier 61*aef9ec39SRoland Dreier enum { 62*aef9ec39SRoland Dreier SRP_BUF_FORMAT_DIRECT = 1 << 1, 63*aef9ec39SRoland Dreier SRP_BUF_FORMAT_INDIRECT = 1 << 2 64*aef9ec39SRoland Dreier }; 65*aef9ec39SRoland Dreier 66*aef9ec39SRoland Dreier enum { 67*aef9ec39SRoland Dreier SRP_NO_DATA_DESC = 0, 68*aef9ec39SRoland Dreier SRP_DATA_DESC_DIRECT = 1, 69*aef9ec39SRoland Dreier SRP_DATA_DESC_INDIRECT = 2 70*aef9ec39SRoland Dreier }; 71*aef9ec39SRoland Dreier 72*aef9ec39SRoland Dreier enum { 73*aef9ec39SRoland Dreier SRP_TSK_ABORT_TASK = 0x01, 74*aef9ec39SRoland Dreier SRP_TSK_ABORT_TASK_SET = 0x02, 75*aef9ec39SRoland Dreier SRP_TSK_CLEAR_TASK_SET = 0x04, 76*aef9ec39SRoland Dreier SRP_TSK_LUN_RESET = 0x08, 77*aef9ec39SRoland Dreier SRP_TSK_CLEAR_ACA = 0x40 78*aef9ec39SRoland Dreier }; 79*aef9ec39SRoland Dreier 80*aef9ec39SRoland Dreier enum srp_login_rej_reason { 81*aef9ec39SRoland Dreier SRP_LOGIN_REJ_UNABLE_ESTABLISH_CHANNEL = 0x00010000, 82*aef9ec39SRoland Dreier SRP_LOGIN_REJ_INSUFFICIENT_RESOURCES = 0x00010001, 83*aef9ec39SRoland Dreier SRP_LOGIN_REJ_REQ_IT_IU_LENGTH_TOO_LARGE = 0x00010002, 84*aef9ec39SRoland Dreier SRP_LOGIN_REJ_UNABLE_ASSOCIATE_CHANNEL = 0x00010003, 85*aef9ec39SRoland Dreier SRP_LOGIN_REJ_UNSUPPORTED_DESCRIPTOR_FMT = 0x00010004, 86*aef9ec39SRoland Dreier SRP_LOGIN_REJ_MULTI_CHANNEL_UNSUPPORTED = 0x00010005, 87*aef9ec39SRoland Dreier SRP_LOGIN_REJ_CHANNEL_LIMIT_REACHED = 0x00010006 88*aef9ec39SRoland Dreier }; 89*aef9ec39SRoland Dreier 90*aef9ec39SRoland Dreier struct srp_direct_buf { 91*aef9ec39SRoland Dreier __be64 va; 92*aef9ec39SRoland Dreier __be32 key; 93*aef9ec39SRoland Dreier __be32 len; 94*aef9ec39SRoland Dreier }; 95*aef9ec39SRoland Dreier 96*aef9ec39SRoland Dreier /* 97*aef9ec39SRoland Dreier * We need the packed attribute because the SRP spec puts the list of 98*aef9ec39SRoland Dreier * descriptors at an offset of 20, which is not aligned to the size 99*aef9ec39SRoland Dreier * of struct srp_direct_buf. 100*aef9ec39SRoland Dreier */ 101*aef9ec39SRoland Dreier struct srp_indirect_buf { 102*aef9ec39SRoland Dreier struct srp_direct_buf table_desc; 103*aef9ec39SRoland Dreier __be32 len; 104*aef9ec39SRoland Dreier struct srp_direct_buf desc_list[0] __attribute__((packed)); 105*aef9ec39SRoland Dreier }; 106*aef9ec39SRoland Dreier 107*aef9ec39SRoland Dreier enum { 108*aef9ec39SRoland Dreier SRP_MULTICHAN_SINGLE = 0, 109*aef9ec39SRoland Dreier SRP_MULTICHAN_MULTI = 1 110*aef9ec39SRoland Dreier }; 111*aef9ec39SRoland Dreier 112*aef9ec39SRoland Dreier struct srp_login_req { 113*aef9ec39SRoland Dreier u8 opcode; 114*aef9ec39SRoland Dreier u8 reserved1[7]; 115*aef9ec39SRoland Dreier u64 tag; 116*aef9ec39SRoland Dreier __be32 req_it_iu_len; 117*aef9ec39SRoland Dreier u8 reserved2[4]; 118*aef9ec39SRoland Dreier __be16 req_buf_fmt; 119*aef9ec39SRoland Dreier u8 req_flags; 120*aef9ec39SRoland Dreier u8 reserved3[5]; 121*aef9ec39SRoland Dreier u8 initiator_port_id[16]; 122*aef9ec39SRoland Dreier u8 target_port_id[16]; 123*aef9ec39SRoland Dreier }; 124*aef9ec39SRoland Dreier 125*aef9ec39SRoland Dreier struct srp_login_rsp { 126*aef9ec39SRoland Dreier u8 opcode; 127*aef9ec39SRoland Dreier u8 reserved1[3]; 128*aef9ec39SRoland Dreier __be32 req_lim_delta; 129*aef9ec39SRoland Dreier u64 tag; 130*aef9ec39SRoland Dreier __be32 max_it_iu_len; 131*aef9ec39SRoland Dreier __be32 max_ti_iu_len; 132*aef9ec39SRoland Dreier __be16 buf_fmt; 133*aef9ec39SRoland Dreier u8 rsp_flags; 134*aef9ec39SRoland Dreier u8 reserved2[25]; 135*aef9ec39SRoland Dreier }; 136*aef9ec39SRoland Dreier 137*aef9ec39SRoland Dreier struct srp_login_rej { 138*aef9ec39SRoland Dreier u8 opcode; 139*aef9ec39SRoland Dreier u8 reserved1[3]; 140*aef9ec39SRoland Dreier __be32 reason; 141*aef9ec39SRoland Dreier u64 tag; 142*aef9ec39SRoland Dreier u8 reserved2[8]; 143*aef9ec39SRoland Dreier __be16 buf_fmt; 144*aef9ec39SRoland Dreier u8 reserved3[6]; 145*aef9ec39SRoland Dreier }; 146*aef9ec39SRoland Dreier 147*aef9ec39SRoland Dreier struct srp_i_logout { 148*aef9ec39SRoland Dreier u8 opcode; 149*aef9ec39SRoland Dreier u8 reserved[7]; 150*aef9ec39SRoland Dreier u64 tag; 151*aef9ec39SRoland Dreier }; 152*aef9ec39SRoland Dreier 153*aef9ec39SRoland Dreier struct srp_t_logout { 154*aef9ec39SRoland Dreier u8 opcode; 155*aef9ec39SRoland Dreier u8 sol_not; 156*aef9ec39SRoland Dreier u8 reserved[2]; 157*aef9ec39SRoland Dreier __be32 reason; 158*aef9ec39SRoland Dreier u64 tag; 159*aef9ec39SRoland Dreier }; 160*aef9ec39SRoland Dreier 161*aef9ec39SRoland Dreier /* 162*aef9ec39SRoland Dreier * We need the packed attribute because the SRP spec only aligns the 163*aef9ec39SRoland Dreier * 8-byte LUN field to 4 bytes. 164*aef9ec39SRoland Dreier */ 165*aef9ec39SRoland Dreier struct srp_tsk_mgmt { 166*aef9ec39SRoland Dreier u8 opcode; 167*aef9ec39SRoland Dreier u8 sol_not; 168*aef9ec39SRoland Dreier u8 reserved1[6]; 169*aef9ec39SRoland Dreier u64 tag; 170*aef9ec39SRoland Dreier u8 reserved2[4]; 171*aef9ec39SRoland Dreier __be64 lun __attribute__((packed)); 172*aef9ec39SRoland Dreier u8 reserved3[2]; 173*aef9ec39SRoland Dreier u8 tsk_mgmt_func; 174*aef9ec39SRoland Dreier u8 reserved4; 175*aef9ec39SRoland Dreier u64 task_tag; 176*aef9ec39SRoland Dreier u8 reserved5[8]; 177*aef9ec39SRoland Dreier }; 178*aef9ec39SRoland Dreier 179*aef9ec39SRoland Dreier /* 180*aef9ec39SRoland Dreier * We need the packed attribute because the SRP spec only aligns the 181*aef9ec39SRoland Dreier * 8-byte LUN field to 4 bytes. 182*aef9ec39SRoland Dreier */ 183*aef9ec39SRoland Dreier struct srp_cmd { 184*aef9ec39SRoland Dreier u8 opcode; 185*aef9ec39SRoland Dreier u8 sol_not; 186*aef9ec39SRoland Dreier u8 reserved1[3]; 187*aef9ec39SRoland Dreier u8 buf_fmt; 188*aef9ec39SRoland Dreier u8 data_out_desc_cnt; 189*aef9ec39SRoland Dreier u8 data_in_desc_cnt; 190*aef9ec39SRoland Dreier u64 tag; 191*aef9ec39SRoland Dreier u8 reserved2[4]; 192*aef9ec39SRoland Dreier __be64 lun __attribute__((packed)); 193*aef9ec39SRoland Dreier u8 reserved3; 194*aef9ec39SRoland Dreier u8 task_attr; 195*aef9ec39SRoland Dreier u8 reserved4; 196*aef9ec39SRoland Dreier u8 add_cdb_len; 197*aef9ec39SRoland Dreier u8 cdb[16]; 198*aef9ec39SRoland Dreier u8 add_data[0]; 199*aef9ec39SRoland Dreier }; 200*aef9ec39SRoland Dreier 201*aef9ec39SRoland Dreier enum { 202*aef9ec39SRoland Dreier SRP_RSP_FLAG_RSPVALID = 1 << 0, 203*aef9ec39SRoland Dreier SRP_RSP_FLAG_SNSVALID = 1 << 1, 204*aef9ec39SRoland Dreier SRP_RSP_FLAG_DOOVER = 1 << 2, 205*aef9ec39SRoland Dreier SRP_RSP_FLAG_DOUNDER = 1 << 3, 206*aef9ec39SRoland Dreier SRP_RSP_FLAG_DIOVER = 1 << 4, 207*aef9ec39SRoland Dreier SRP_RSP_FLAG_DIUNDER = 1 << 5 208*aef9ec39SRoland Dreier }; 209*aef9ec39SRoland Dreier 210*aef9ec39SRoland Dreier struct srp_rsp { 211*aef9ec39SRoland Dreier u8 opcode; 212*aef9ec39SRoland Dreier u8 sol_not; 213*aef9ec39SRoland Dreier u8 reserved1[2]; 214*aef9ec39SRoland Dreier __be32 req_lim_delta; 215*aef9ec39SRoland Dreier u64 tag; 216*aef9ec39SRoland Dreier u8 reserved2[2]; 217*aef9ec39SRoland Dreier u8 flags; 218*aef9ec39SRoland Dreier u8 status; 219*aef9ec39SRoland Dreier __be32 data_out_res_cnt; 220*aef9ec39SRoland Dreier __be32 data_in_res_cnt; 221*aef9ec39SRoland Dreier __be32 sense_data_len; 222*aef9ec39SRoland Dreier __be32 resp_data_len; 223*aef9ec39SRoland Dreier u8 data[0]; 224*aef9ec39SRoland Dreier }; 225*aef9ec39SRoland Dreier 226*aef9ec39SRoland Dreier #endif /* SCSI_SRP_H */ 227