1 /* 2 BAREOS® - Backup Archiving REcovery Open Sourced 3 4 Copyright (C) 2011-2012 Planets Communications B.V. 5 Copyright (C) 2013-2018 Bareos GmbH & Co. KG 6 7 This program is Free Software; you can redistribute it and/or 8 modify it under the terms of version three of the GNU Affero General Public 9 License as published by the Free Software Foundation and included 10 in the file LICENSE. 11 12 This program is distributed in the hope that it will be useful, but 13 WITHOUT ANY WARRANTY; without even the implied warranty of 14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 15 Affero General Public License for more details. 16 17 You should have received a copy of the GNU Affero General Public License 18 along with this program; if not, write to the Free Software 19 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 20 02110-1301, USA. 21 */ 22 23 /* 24 * Marco van Wieringen, March 2012 25 */ 26 27 #ifndef BAREOS_LIB_SCSI_LLI_H_ 28 #define BAREOS_LIB_SCSI_LLI_H_ 1 29 30 /* 31 * Device Inquiry Response 32 */ 33 typedef struct { 34 #if HAVE_BIG_ENDIAN 35 uint8_t peripheralQualifier : 3; 36 uint8_t periphrealDeviceType : 5; 37 uint8_t RMB : 1; 38 uint8_t res_bits_1 : 7; 39 #else 40 uint8_t periphrealDeviceType : 5; 41 uint8_t peripheralQualifier : 3; 42 uint8_t res_bits_1 : 7; 43 uint8_t RMB : 1; 44 #endif 45 uint8_t Version[1]; 46 #if HAVE_BIG_ENDIAN 47 uint8_t obs_bits_1 : 2; 48 uint8_t NORMACA : 1; 49 uint8_t HISUP : 1; 50 uint8_t responseDataFormat : 4; 51 #else 52 uint8_t responseDataFormat : 4; 53 uint8_t HISUP : 1; 54 uint8_t NORMACA : 1; 55 uint8_t obs_bits_1 : 2; 56 #endif 57 uint8_t additionalLength[1]; 58 #if HAVE_BIG_ENDIAN 59 uint8_t SCCS : 1; 60 uint8_t ACC : 1; 61 uint8_t TPGS : 2; 62 uint8_t threePC : 1; 63 uint8_t res_bits_2 : 2; 64 uint8_t protect : 1; 65 uint8_t obs_bits_2 : 1; 66 uint8_t ENCSERV : 1; 67 uint8_t VS : 1; 68 uint8_t MULTIP : 1; 69 uint8_t MCHNGR : 1; 70 uint8_t obs_bits_3 : 2; 71 uint8_t ADDR16 : 1; 72 uint8_t obs_bits_4 : 2; 73 uint8_t WBUS16 : 1; 74 uint8_t SYNC : 1; 75 uint8_t obs_bits_5 : 2; 76 uint8_t CMDQUE : 1; 77 uint8_t VS2 : 1; 78 #else 79 uint8_t protect : 1; 80 uint8_t res_bits_2 : 2; 81 uint8_t threePC : 1; 82 uint8_t TPGS : 2; 83 uint8_t ACC : 1; 84 uint8_t SCCS : 1; 85 uint8_t ADDR16 : 1; 86 uint8_t obs_bits_3 : 2; 87 uint8_t MCHNGR : 1; 88 uint8_t MULTIP : 1; 89 uint8_t VS : 1; 90 uint8_t ENCSERV : 1; 91 uint8_t obs_bits_2 : 1; 92 uint8_t VS2 : 1; 93 uint8_t CMDQUE : 1; 94 uint8_t obs_bits_5 : 2; 95 uint8_t SYNC : 1; 96 uint8_t WBUS16 : 1; 97 uint8_t obs_bits_4 : 2; 98 #endif 99 uint8_t vendor[8]; 100 uint8_t productID[16]; 101 uint8_t productRev[4]; 102 uint8_t SN[7]; 103 uint8_t venderUnique[12]; 104 #if HAVE_BIG_ENDIAN 105 uint8_t res_bits_3 : 4; 106 uint8_t CLOCKING : 2; 107 uint8_t QAS : 1; 108 uint8_t IUS : 1; 109 #else 110 uint8_t IUS : 1; 111 uint8_t QAS : 1; 112 uint8_t CLOCKING : 2; 113 uint8_t res_bits_3 : 4; 114 #endif 115 uint8_t res_bits_4[1]; 116 uint8_t versionDescriptor[16]; 117 uint8_t res_bits_5[22]; 118 uint8_t copyright[1]; 119 } SCSI_PAGE_INQ; 120 121 /* 122 * Sense Data Response 123 */ 124 typedef struct { 125 #if HAVE_BIG_ENDIAN 126 uint8_t valid : 1; 127 uint8_t responseCode : 7; 128 #else 129 uint8_t responseCode : 7; 130 uint8_t valid : 1; 131 #endif 132 uint8_t res_bits_1; 133 #if HAVE_BIG_ENDIAN 134 uint8_t filemark : 1; 135 uint8_t EOM : 1; 136 uint8_t ILI : 1; 137 uint8_t res_bits_2 : 1; 138 uint8_t senseKey : 4; 139 #else 140 uint8_t senseKey : 4; 141 uint8_t res_bits_2 : 1; 142 uint8_t ILI : 1; 143 uint8_t EOM : 1; 144 uint8_t filemark : 1; 145 #endif 146 uint8_t information[4]; 147 uint8_t addSenseLen; 148 uint8_t cmdSpecificInfo[4]; 149 uint8_t addSenseCode; 150 uint8_t addSenseCodeQual; 151 uint8_t fieldRepUnitCode; 152 #if HAVE_BIG_ENDIAN 153 uint8_t sim : 3; /* system information message */ 154 uint8_t bpv : 1; /* bit pointer valid */ 155 uint8_t resvd2 : 2; 156 uint8_t cd : 1; /* control/data */ 157 uint8_t SKSV : 1; 158 #else 159 uint8_t SKSV : 1; 160 uint8_t cd : 1; /* control/data */ 161 uint8_t resvd2 : 2; 162 uint8_t bpv : 1; /* bit pointer valid */ 163 uint8_t sim : 3; /* system information message */ 164 #endif 165 uint8_t field[2]; /* field pointer */ 166 uint8_t addSenseData[109]; 167 } SCSI_PAGE_SENSE; 168 169 bool RecvScsiCmdPage(int fd, 170 const char* device_name, 171 void* cdb, 172 unsigned int cdb_len, 173 void* cmd_page, 174 unsigned int cmd_page_len); 175 bool send_scsi_cmd_page(int fd, 176 const char* device_name, 177 void* cdb, 178 unsigned int cdb_len, 179 void* cmd_page, 180 unsigned int cmd_page_len); 181 bool CheckScsiAtEod(int fd); 182 #endif /* BAREOS_LIB_SCSI_LLI_H_ */ 183