16e270446SBen Herrenschmidt /* 26e270446SBen Herrenschmidt * Copyright (c) 2005 Cisco Systems. All rights reserved. 36e270446SBen Herrenschmidt * 46e270446SBen Herrenschmidt * This software is available to you under a choice of one of two 56e270446SBen Herrenschmidt * licenses. You may choose to be licensed under the terms of the GNU 66e270446SBen Herrenschmidt * General Public License (GPL) Version 2, available from the file 76e270446SBen Herrenschmidt * COPYING in the main directory of this source tree, or the 86e270446SBen Herrenschmidt * OpenIB.org BSD license below: 96e270446SBen Herrenschmidt * 106e270446SBen Herrenschmidt * Redistribution and use in source and binary forms, with or 116e270446SBen Herrenschmidt * without modification, are permitted provided that the following 126e270446SBen Herrenschmidt * conditions are met: 136e270446SBen Herrenschmidt * 146e270446SBen Herrenschmidt * - Redistributions of source code must retain the above 156e270446SBen Herrenschmidt * copyright notice, this list of conditions and the following 166e270446SBen Herrenschmidt * disclaimer. 176e270446SBen Herrenschmidt * 186e270446SBen Herrenschmidt * - Redistributions in binary form must reproduce the above 196e270446SBen Herrenschmidt * copyright notice, this list of conditions and the following 206e270446SBen Herrenschmidt * disclaimer in the documentation and/or other materials 216e270446SBen Herrenschmidt * provided with the distribution. 226e270446SBen Herrenschmidt * 236e270446SBen Herrenschmidt * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 246e270446SBen Herrenschmidt * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 256e270446SBen Herrenschmidt * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 266e270446SBen Herrenschmidt * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 276e270446SBen Herrenschmidt * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 286e270446SBen Herrenschmidt * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 296e270446SBen Herrenschmidt * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 306e270446SBen Herrenschmidt * SOFTWARE. 316e270446SBen Herrenschmidt * 326e270446SBen Herrenschmidt */ 336e270446SBen Herrenschmidt 346e270446SBen Herrenschmidt #ifndef SCSI_SRP_H 356e270446SBen Herrenschmidt #define SCSI_SRP_H 366e270446SBen Herrenschmidt 376e270446SBen Herrenschmidt /* 386e270446SBen Herrenschmidt * Structures and constants for the SCSI RDMA Protocol (SRP) as 396e270446SBen Herrenschmidt * defined by the INCITS T10 committee. This file was written using 406e270446SBen Herrenschmidt * draft Revision 16a of the SRP standard. 416e270446SBen Herrenschmidt */ 426e270446SBen Herrenschmidt 436e270446SBen Herrenschmidt enum { 446e270446SBen Herrenschmidt 456e270446SBen Herrenschmidt SRP_LOGIN_REQ = 0x00, 466e270446SBen Herrenschmidt SRP_TSK_MGMT = 0x01, 476e270446SBen Herrenschmidt SRP_CMD = 0x02, 486e270446SBen Herrenschmidt SRP_I_LOGOUT = 0x03, 496e270446SBen Herrenschmidt SRP_LOGIN_RSP = 0xc0, 506e270446SBen Herrenschmidt SRP_RSP = 0xc1, 516e270446SBen Herrenschmidt SRP_LOGIN_REJ = 0xc2, 526e270446SBen Herrenschmidt SRP_T_LOGOUT = 0x80, 536e270446SBen Herrenschmidt SRP_CRED_REQ = 0x81, 546e270446SBen Herrenschmidt SRP_AER_REQ = 0x82, 556e270446SBen Herrenschmidt SRP_CRED_RSP = 0x41, 566e270446SBen Herrenschmidt SRP_AER_RSP = 0x42 576e270446SBen Herrenschmidt }; 586e270446SBen Herrenschmidt 596e270446SBen Herrenschmidt enum { 606e270446SBen Herrenschmidt SRP_BUF_FORMAT_DIRECT = 1 << 1, 616e270446SBen Herrenschmidt SRP_BUF_FORMAT_INDIRECT = 1 << 2 626e270446SBen Herrenschmidt }; 636e270446SBen Herrenschmidt 646e270446SBen Herrenschmidt enum { 656e270446SBen Herrenschmidt SRP_NO_DATA_DESC = 0, 666e270446SBen Herrenschmidt SRP_DATA_DESC_DIRECT = 1, 676e270446SBen Herrenschmidt SRP_DATA_DESC_INDIRECT = 2 686e270446SBen Herrenschmidt }; 696e270446SBen Herrenschmidt 706e270446SBen Herrenschmidt enum { 716e270446SBen Herrenschmidt SRP_TSK_ABORT_TASK = 0x01, 726e270446SBen Herrenschmidt SRP_TSK_ABORT_TASK_SET = 0x02, 736e270446SBen Herrenschmidt SRP_TSK_CLEAR_TASK_SET = 0x04, 746e270446SBen Herrenschmidt SRP_TSK_LUN_RESET = 0x08, 756e270446SBen Herrenschmidt SRP_TSK_CLEAR_ACA = 0x40 766e270446SBen Herrenschmidt }; 776e270446SBen Herrenschmidt 786e270446SBen Herrenschmidt enum srp_login_rej_reason { 796e270446SBen Herrenschmidt SRP_LOGIN_REJ_UNABLE_ESTABLISH_CHANNEL = 0x00010000, 806e270446SBen Herrenschmidt SRP_LOGIN_REJ_INSUFFICIENT_RESOURCES = 0x00010001, 816e270446SBen Herrenschmidt SRP_LOGIN_REJ_REQ_IT_IU_LENGTH_TOO_LARGE = 0x00010002, 826e270446SBen Herrenschmidt SRP_LOGIN_REJ_UNABLE_ASSOCIATE_CHANNEL = 0x00010003, 836e270446SBen Herrenschmidt SRP_LOGIN_REJ_UNSUPPORTED_DESCRIPTOR_FMT = 0x00010004, 846e270446SBen Herrenschmidt SRP_LOGIN_REJ_MULTI_CHANNEL_UNSUPPORTED = 0x00010005, 856e270446SBen Herrenschmidt SRP_LOGIN_REJ_CHANNEL_LIMIT_REACHED = 0x00010006 866e270446SBen Herrenschmidt }; 876e270446SBen Herrenschmidt 886e270446SBen Herrenschmidt enum { 896e270446SBen Herrenschmidt SRP_REV10_IB_IO_CLASS = 0xff00, 906e270446SBen Herrenschmidt SRP_REV16A_IB_IO_CLASS = 0x0100 916e270446SBen Herrenschmidt }; 926e270446SBen Herrenschmidt 93*eb37f146SAlexey Kardashevskiy enum { 94*eb37f146SAlexey Kardashevskiy SRP_TSK_MGMT_COMPLETE = 0x00, 95*eb37f146SAlexey Kardashevskiy SRP_TSK_MGMT_FIELDS_INVALID = 0x02, 96*eb37f146SAlexey Kardashevskiy SRP_TSK_MGMT_NOT_SUPPORTED = 0x04, 97*eb37f146SAlexey Kardashevskiy SRP_TSK_MGMT_FAILED = 0x05 98*eb37f146SAlexey Kardashevskiy }; 99*eb37f146SAlexey Kardashevskiy 1006e270446SBen Herrenschmidt struct srp_direct_buf { 1016e270446SBen Herrenschmidt uint64_t va; 1026e270446SBen Herrenschmidt uint32_t key; 1036e270446SBen Herrenschmidt uint32_t len; 1046e270446SBen Herrenschmidt }; 1056e270446SBen Herrenschmidt 1066e270446SBen Herrenschmidt /* 1076e270446SBen Herrenschmidt * We need the packed attribute because the SRP spec puts the list of 1086e270446SBen Herrenschmidt * descriptors at an offset of 20, which is not aligned to the size of 1096e270446SBen Herrenschmidt * struct srp_direct_buf. The whole structure must be packed to avoid 1106e270446SBen Herrenschmidt * having the 20-byte structure padded to 24 bytes on 64-bit architectures. 1116e270446SBen Herrenschmidt */ 1126e270446SBen Herrenschmidt struct srp_indirect_buf { 1136e270446SBen Herrenschmidt struct srp_direct_buf table_desc; 1146e270446SBen Herrenschmidt uint32_t len; 1156e270446SBen Herrenschmidt struct srp_direct_buf desc_list[0]; 116541dc0d4SStefan Weil } QEMU_PACKED; 1176e270446SBen Herrenschmidt 1186e270446SBen Herrenschmidt enum { 1196e270446SBen Herrenschmidt SRP_MULTICHAN_SINGLE = 0, 1206e270446SBen Herrenschmidt SRP_MULTICHAN_MULTI = 1 1216e270446SBen Herrenschmidt }; 1226e270446SBen Herrenschmidt 1236e270446SBen Herrenschmidt struct srp_login_req { 1246e270446SBen Herrenschmidt uint8_t opcode; 1256e270446SBen Herrenschmidt uint8_t reserved1[7]; 1266e270446SBen Herrenschmidt uint64_t tag; 1276e270446SBen Herrenschmidt uint32_t req_it_iu_len; 1286e270446SBen Herrenschmidt uint8_t reserved2[4]; 1296e270446SBen Herrenschmidt uint16_t req_buf_fmt; 1306e270446SBen Herrenschmidt uint8_t req_flags; 1316e270446SBen Herrenschmidt uint8_t reserved3[5]; 1326e270446SBen Herrenschmidt uint8_t initiator_port_id[16]; 1336e270446SBen Herrenschmidt uint8_t target_port_id[16]; 1346e270446SBen Herrenschmidt }; 1356e270446SBen Herrenschmidt 1366e270446SBen Herrenschmidt /* 1376e270446SBen Herrenschmidt * The SRP spec defines the size of the LOGIN_RSP structure to be 52 1386e270446SBen Herrenschmidt * bytes, so it needs to be packed to avoid having it padded to 56 1396e270446SBen Herrenschmidt * bytes on 64-bit architectures. 1406e270446SBen Herrenschmidt */ 1416e270446SBen Herrenschmidt struct srp_login_rsp { 1426e270446SBen Herrenschmidt uint8_t opcode; 1436e270446SBen Herrenschmidt uint8_t reserved1[3]; 1446e270446SBen Herrenschmidt uint32_t req_lim_delta; 1456e270446SBen Herrenschmidt uint64_t tag; 1466e270446SBen Herrenschmidt uint32_t max_it_iu_len; 1476e270446SBen Herrenschmidt uint32_t max_ti_iu_len; 1486e270446SBen Herrenschmidt uint16_t buf_fmt; 1496e270446SBen Herrenschmidt uint8_t rsp_flags; 1506e270446SBen Herrenschmidt uint8_t reserved2[25]; 151541dc0d4SStefan Weil } QEMU_PACKED; 1526e270446SBen Herrenschmidt 1536e270446SBen Herrenschmidt struct srp_login_rej { 1546e270446SBen Herrenschmidt uint8_t opcode; 1556e270446SBen Herrenschmidt uint8_t reserved1[3]; 1566e270446SBen Herrenschmidt uint32_t reason; 1576e270446SBen Herrenschmidt uint64_t tag; 1586e270446SBen Herrenschmidt uint8_t reserved2[8]; 1596e270446SBen Herrenschmidt uint16_t buf_fmt; 1606e270446SBen Herrenschmidt uint8_t reserved3[6]; 1616e270446SBen Herrenschmidt }; 1626e270446SBen Herrenschmidt 1636e270446SBen Herrenschmidt struct srp_i_logout { 1646e270446SBen Herrenschmidt uint8_t opcode; 1656e270446SBen Herrenschmidt uint8_t reserved[7]; 1666e270446SBen Herrenschmidt uint64_t tag; 1676e270446SBen Herrenschmidt }; 1686e270446SBen Herrenschmidt 1696e270446SBen Herrenschmidt struct srp_t_logout { 1706e270446SBen Herrenschmidt uint8_t opcode; 1716e270446SBen Herrenschmidt uint8_t sol_not; 1726e270446SBen Herrenschmidt uint8_t reserved[2]; 1736e270446SBen Herrenschmidt uint32_t reason; 1746e270446SBen Herrenschmidt uint64_t tag; 1756e270446SBen Herrenschmidt }; 1766e270446SBen Herrenschmidt 1776e270446SBen Herrenschmidt /* 1786e270446SBen Herrenschmidt * We need the packed attribute because the SRP spec only aligns the 1796e270446SBen Herrenschmidt * 8-byte LUN field to 4 bytes. 1806e270446SBen Herrenschmidt */ 1816e270446SBen Herrenschmidt struct srp_tsk_mgmt { 1826e270446SBen Herrenschmidt uint8_t opcode; 1836e270446SBen Herrenschmidt uint8_t sol_not; 1846e270446SBen Herrenschmidt uint8_t reserved1[6]; 1856e270446SBen Herrenschmidt uint64_t tag; 1866e270446SBen Herrenschmidt uint8_t reserved2[4]; 18793d3ad2aSStefan Weil uint64_t lun; 1886e270446SBen Herrenschmidt uint8_t reserved3[2]; 1896e270446SBen Herrenschmidt uint8_t tsk_mgmt_func; 1906e270446SBen Herrenschmidt uint8_t reserved4; 1916e270446SBen Herrenschmidt uint64_t task_tag; 1926e270446SBen Herrenschmidt uint8_t reserved5[8]; 19393d3ad2aSStefan Weil } QEMU_PACKED; 1946e270446SBen Herrenschmidt 1956e270446SBen Herrenschmidt /* 1966e270446SBen Herrenschmidt * We need the packed attribute because the SRP spec only aligns the 1976e270446SBen Herrenschmidt * 8-byte LUN field to 4 bytes. 1986e270446SBen Herrenschmidt */ 1996e270446SBen Herrenschmidt struct srp_cmd { 2006e270446SBen Herrenschmidt uint8_t opcode; 2016e270446SBen Herrenschmidt uint8_t sol_not; 2026e270446SBen Herrenschmidt uint8_t reserved1[3]; 2036e270446SBen Herrenschmidt uint8_t buf_fmt; 2046e270446SBen Herrenschmidt uint8_t data_out_desc_cnt; 2056e270446SBen Herrenschmidt uint8_t data_in_desc_cnt; 2066e270446SBen Herrenschmidt uint64_t tag; 2076e270446SBen Herrenschmidt uint8_t reserved2[4]; 20893d3ad2aSStefan Weil uint64_t lun; 2096e270446SBen Herrenschmidt uint8_t reserved3; 2106e270446SBen Herrenschmidt uint8_t task_attr; 2116e270446SBen Herrenschmidt uint8_t reserved4; 2126e270446SBen Herrenschmidt uint8_t add_cdb_len; 2136e270446SBen Herrenschmidt uint8_t cdb[16]; 2146e270446SBen Herrenschmidt uint8_t add_data[0]; 21593d3ad2aSStefan Weil } QEMU_PACKED; 2166e270446SBen Herrenschmidt 2176e270446SBen Herrenschmidt enum { 2186e270446SBen Herrenschmidt SRP_RSP_FLAG_RSPVALID = 1 << 0, 2196e270446SBen Herrenschmidt SRP_RSP_FLAG_SNSVALID = 1 << 1, 2206e270446SBen Herrenschmidt SRP_RSP_FLAG_DOOVER = 1 << 2, 2216e270446SBen Herrenschmidt SRP_RSP_FLAG_DOUNDER = 1 << 3, 2226e270446SBen Herrenschmidt SRP_RSP_FLAG_DIOVER = 1 << 4, 2236e270446SBen Herrenschmidt SRP_RSP_FLAG_DIUNDER = 1 << 5 2246e270446SBen Herrenschmidt }; 2256e270446SBen Herrenschmidt 2266e270446SBen Herrenschmidt /* 2276e270446SBen Herrenschmidt * The SRP spec defines the size of the RSP structure to be 36 bytes, 2286e270446SBen Herrenschmidt * so it needs to be packed to avoid having it padded to 40 bytes on 2296e270446SBen Herrenschmidt * 64-bit architectures. 2306e270446SBen Herrenschmidt */ 2316e270446SBen Herrenschmidt struct srp_rsp { 2326e270446SBen Herrenschmidt uint8_t opcode; 2336e270446SBen Herrenschmidt uint8_t sol_not; 2346e270446SBen Herrenschmidt uint8_t reserved1[2]; 2356e270446SBen Herrenschmidt uint32_t req_lim_delta; 2366e270446SBen Herrenschmidt uint64_t tag; 2376e270446SBen Herrenschmidt uint8_t reserved2[2]; 2386e270446SBen Herrenschmidt uint8_t flags; 2396e270446SBen Herrenschmidt uint8_t status; 2406e270446SBen Herrenschmidt uint32_t data_out_res_cnt; 2416e270446SBen Herrenschmidt uint32_t data_in_res_cnt; 2426e270446SBen Herrenschmidt uint32_t sense_data_len; 2436e270446SBen Herrenschmidt uint32_t resp_data_len; 2446e270446SBen Herrenschmidt uint8_t data[0]; 245541dc0d4SStefan Weil } QEMU_PACKED; 2466e270446SBen Herrenschmidt 2476e270446SBen Herrenschmidt #endif /* SCSI_SRP_H */ 248