1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 * or http://www.opensolaris.org/os/licensing. 10 * See the License for the specific language governing permissions 11 * and limitations under the License. 12 * 13 * When distributing Covered Code, include this CDDL HEADER in each 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 * If applicable, add the following below this CDDL HEADER, with the 16 * fields enclosed by brackets "[]" replaced with your own identifying 17 * information: Portions Copyright [yyyy] [name of copyright owner] 18 * 19 * CDDL HEADER END 20 */ 21 /* 22 * Copyright 2008 Sun Microsystems, Inc. All rights reserved. 23 * Use is subject to license terms. 24 */ 25 26 #ifndef _FCP_UTIL_H 27 #define _FCP_UTIL_H 28 29 30 31 #ifdef __cplusplus 32 extern "C" { 33 #endif 34 35 #include <sys/types.h> 36 37 38 #define FCP_TGT_INQUIRY 0x01 39 #define FCP_TGT_CREATE 0x02 40 #define FCP_TGT_DELETE 0x04 41 #define FCP_TGT_SEND_SCSI 0x08 42 #define FCP_STATE_COUNT 0x10 43 #define FCP_GET_TARGET_MAPPINGS 0x11 44 45 struct fcp_ioctl { 46 minor_t fp_minor; 47 uint32_t listlen; 48 caddr_t list; 49 }; 50 51 struct device_data { 52 la_wwn_t dev_pwwn; 53 int dev_status; 54 int dev_lun_cnt; 55 uchar_t dev0_type; 56 }; 57 58 struct fcp_scsi_cmd { 59 uint32_t scsi_fc_port_num; 60 la_wwn_t scsi_fc_pwwn; 61 uint32_t scsi_fc_status; 62 uint32_t scsi_fc_rspcode; 63 uchar_t scsi_pkt_state; 64 uchar_t scsi_pkt_action; 65 uint32_t scsi_pkt_reason; 66 uint64_t scsi_lun; 67 uint32_t scsi_flags; 68 uint32_t scsi_timeout; 69 caddr_t scsi_cdbbufaddr; 70 uint32_t scsi_cdblen; 71 caddr_t scsi_bufaddr; 72 uint32_t scsi_buflen; 73 int32_t scsi_bufresid; 74 uint32_t scsi_bufstatus; 75 caddr_t scsi_rqbufaddr; 76 uint32_t scsi_rqlen; 77 int32_t scsi_rqresid; 78 }; 79 80 typedef struct fc_hba_mapping_entry { 81 char targetDriver[MAXPATHLEN]; 82 uint32_t d_id; 83 uint32_t busNumber; 84 uint32_t targetNumber; 85 uint32_t osLUN; 86 uint64_t samLUN; 87 la_wwn_t NodeWWN; 88 la_wwn_t PortWWN; 89 uint8_t guid[256]; 90 } fc_hba_mapping_entry_t; 91 92 #define FC_HBA_TARGET_MAPPINGS_VERSION 1 93 typedef struct fc_hba_target_mappings { 94 uint32_t version; 95 uint32_t numLuns; 96 uint64_t reserved; 97 fc_hba_mapping_entry_t entries[1]; 98 } fc_hba_target_mappings_t; 99 100 /* 101 * flags for scsi_flags field of fcp_scsi_cmd structure 102 */ 103 #define FCP_SCSI_READ 0x0001 /* get data from device */ 104 105 106 #if defined(_SYSCALL32) 107 /* 108 * 32 bit variant of fcp_ioctl and fcp_scsi_cmd 109 * used only in the driver. 110 */ 111 112 #if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4 113 #pragma pack(4) 114 #endif 115 116 struct fcp32_ioctl { 117 minor_t fp_minor; 118 uint32_t listlen; 119 caddr32_t list; 120 }; 121 122 struct fcp32_scsi_cmd { 123 uint32_t scsi_fc_port_num; 124 la_wwn_t scsi_fc_pwwn; 125 uint32_t scsi_fc_status; 126 uint32_t scsi_fc_rspcode; 127 uchar_t scsi_pkt_state; 128 uchar_t scsi_pkt_action; 129 uint32_t scsi_pkt_reason; 130 uint64_t scsi_lun; 131 uint32_t scsi_flags; 132 uint32_t scsi_timeout; 133 caddr32_t scsi_cdbbufaddr; 134 uint32_t scsi_cdblen; 135 caddr32_t scsi_bufaddr; 136 uint32_t scsi_buflen; 137 int32_t scsi_bufresid; 138 uint32_t scsi_bufstatus; 139 caddr32_t scsi_rqbufaddr; 140 uint32_t scsi_rqlen; 141 int32_t scsi_rqresid; 142 }; 143 144 #if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4 145 #pragma pack() 146 #endif 147 148 #define FCP32_SCSI_CMD_TO_FCP_SCSI_CMD(cmd32, cmd) \ 149 (cmd)->scsi_fc_port_num = (cmd32)->scsi_fc_port_num; \ 150 bcopy(&((cmd32)->scsi_fc_pwwn), &((cmd)->scsi_fc_pwwn), \ 151 sizeof ((cmd)->scsi_fc_pwwn)); \ 152 (cmd)->scsi_fc_status = (cmd32)->scsi_fc_status; \ 153 (cmd)->scsi_fc_rspcode = (cmd32)->scsi_fc_rspcode; \ 154 (cmd)->scsi_pkt_state = (cmd32)->scsi_pkt_state; \ 155 (cmd)->scsi_pkt_action = (cmd32)->scsi_pkt_action; \ 156 (cmd)->scsi_pkt_reason = (cmd32)->scsi_pkt_reason; \ 157 (cmd)->scsi_lun = (cmd32)->scsi_lun; \ 158 (cmd)->scsi_flags = (cmd32)->scsi_flags; \ 159 (cmd)->scsi_timeout = (cmd32)->scsi_timeout; \ 160 (cmd)->scsi_cdbbufaddr = (caddr_t)(long)(cmd32)->scsi_cdbbufaddr; \ 161 (cmd)->scsi_cdblen = (cmd32)->scsi_cdblen; \ 162 (cmd)->scsi_bufaddr = (caddr_t)(long)(cmd32)->scsi_bufaddr; \ 163 (cmd)->scsi_buflen = (cmd32)->scsi_buflen; \ 164 (cmd)->scsi_bufresid = (cmd32)->scsi_bufresid; \ 165 (cmd)->scsi_bufstatus = (cmd32)->scsi_bufstatus; \ 166 (cmd)->scsi_rqbufaddr = (caddr_t)(long)(cmd32)->scsi_rqbufaddr; \ 167 (cmd)->scsi_rqlen = (cmd32)->scsi_rqlen; \ 168 (cmd)->scsi_rqresid = (cmd32)->scsi_rqresid; 169 170 #define FCP_SCSI_CMD_TO_FCP32_SCSI_CMD(cmd, cmd32) \ 171 (cmd32)->scsi_fc_port_num = (cmd)->scsi_fc_port_num; \ 172 bcopy(&((cmd)->scsi_fc_pwwn), &((cmd32)->scsi_fc_pwwn), \ 173 sizeof ((cmd32)->scsi_fc_pwwn)); \ 174 (cmd32)->scsi_fc_status = (cmd)->scsi_fc_status; \ 175 (cmd32)->scsi_fc_rspcode = (cmd)->scsi_fc_rspcode; \ 176 (cmd32)->scsi_pkt_state = (cmd)->scsi_pkt_state; \ 177 (cmd32)->scsi_pkt_action = (cmd)->scsi_pkt_action; \ 178 (cmd32)->scsi_pkt_reason = (cmd)->scsi_pkt_reason; \ 179 (cmd32)->scsi_lun = (cmd)->scsi_lun; \ 180 (cmd32)->scsi_flags = (cmd)->scsi_flags; \ 181 (cmd32)->scsi_timeout = (cmd)->scsi_timeout; \ 182 (cmd32)->scsi_cdbbufaddr = (caddr32_t)(long)(cmd)->scsi_cdbbufaddr; \ 183 (cmd32)->scsi_cdblen = (cmd)->scsi_cdblen; \ 184 (cmd32)->scsi_bufaddr = (caddr32_t)(long)(cmd)->scsi_bufaddr; \ 185 (cmd32)->scsi_buflen = (cmd)->scsi_buflen; \ 186 (cmd32)->scsi_bufresid = (cmd)->scsi_bufresid; \ 187 (cmd32)->scsi_bufstatus = (cmd)->scsi_bufstatus; \ 188 (cmd32)->scsi_rqbufaddr = (caddr32_t)(long)(cmd)->scsi_rqbufaddr; \ 189 (cmd32)->scsi_rqlen = (cmd)->scsi_rqlen; \ 190 (cmd32)->scsi_rqresid = (cmd)->scsi_rqresid; 191 192 #endif /* _SYSCALL32 */ 193 194 #if !defined(__lint) 195 _NOTE(SCHEME_PROTECTS_DATA("Unshared Data", device_data)) 196 _NOTE(SCHEME_PROTECTS_DATA("Unshared Data", fcp_scsi_cmd)) 197 #endif /* __lint */ 198 199 #ifdef __cplusplus 200 } 201 #endif 202 203 #endif /* _FCP_UTIL_H */ 204