1 #ifndef SG_CMDS_EXTRA_H
2 #define SG_CMDS_EXTRA_H
3 
4 /*
5  * Copyright (c) 2004-2018 Douglas Gilbert.
6  * All rights reserved.
7  * Use of this source code is governed by a BSD-style
8  * license that can be found in the BSD_LICENSE file.
9  */
10 
11 #include <stdint.h>
12 
13 #ifdef __cplusplus
14 extern "C" {
15 #endif
16 
17 /* Note: all functions that have an 'int timeout_secs' argument will use
18  * that value if it is > 0. Otherwise they will set an internal default
19  * which is currently 60 seconds. This timeout is typically applied in the
20  * SCSI stack above the initiator. If it goes off then the SCSI command is
21  * aborted and there can be other unwelcome side effects. Note that some
22  * commands (e.g. FORMAT UNIT and the Third Party copy commands) can take
23  * a lot longer than the default timeout. */
24 
25 
26 /* Invokes a ATA PASS-THROUGH (12, 16 or 32) SCSI command (SAT). This is
27  * selected by the cdb_len argument that can take values of 12, 16 or 32
28  * only (else -1 is returned). The byte at offset 0 (and bytes 0 to 9
29  * inclusive for ATA PT(32)) pointed to be cdbp are ignored and apart from
30  * the control byte, the rest is copied into an internal cdb which is then
31  * sent to the device. The control byte is byte 11 for ATA PT(12), byte 15
32  * for ATA PT(16) and byte 1 for ATA PT(32). If timeout_secs <= 0 then the
33  * timeout is set to 60 seconds. For data in or out transfers set dinp or
34  * doutp, and dlen to the number of bytes to transfer. If dlen is zero then
35  * no data transfer is assumed. If sense buffer obtained then it is written
36  * to sensep, else sensep[0] is set to 0x0. If ATA return descriptor is
37  * obtained then written to ata_return_dp, else ata_return_dp[0] is set to
38  * 0x0. Either sensep or ata_return_dp (or both) may be NULL pointers.
39  * Returns SCSI status value (>= 0) or -1 if other error. Users are
40  * expected to check the sense buffer themselves. If available the data in
41  * resid is written to residp. Note in SAT-2 and later, fixed format sense
42  * data may be placed in *sensep in which case sensep[0]==0x70, prior to
43  * SAT-2 descriptor sense format was required (i.e. sensep[0]==0x72).
44  */
45 int sg_ll_ata_pt(int sg_fd, const unsigned char * cdbp, int cdb_len,
46                  int timeout_secs,  void * dinp, void * doutp, int dlen,
47                  unsigned char * sensep, int max_sense_len,
48                  unsigned char * ata_return_dp, int max_ata_return_len,
49                  int * residp, int verbose);
50 
51 /* Invokes a FORMAT UNIT (SBC-3) command. Return of 0 -> success,
52  * SG_LIB_CAT_INVALID_OP -> Format unit not supported,
53  * SG_LIB_CAT_ILLEGAL_REQ -> bad field in cdb, SG_LIB_CAT_UNIT_ATTENTION,
54  * SG_LIB_CAT_NOT_READY -> device not ready, SG_LIB_CAT_ABORTED_COMMAND,
55  * -1 -> other failure. Note that sg_ll_format_unit2() and
56  * sg_ll_format_unit_v2() are the same, both add the ffmt argument. */
57 int sg_ll_format_unit(int sg_fd, int fmtpinfo, bool longlist, bool fmtdata,
58                       bool cmplist, int dlist_format, int timeout_secs,
59                       void * paramp, int param_len, bool noisy, int verbose);
60 int sg_ll_format_unit2(int sg_fd, int fmtpinfo, bool longlist, bool fmtdata,
61                        bool cmplist, int dlist_format, int ffmt,
62                        int timeout_secs, void * paramp, int param_len,
63                        bool noisy, int verbose);
64 int sg_ll_format_unit_v2(int sg_fd, int fmtpinfo, bool longlist, bool fmtdata,
65                          bool cmplist, int dlist_format, int ffmt,
66                          int timeout_secs, void * paramp, int param_len,
67                          bool noisy, int verbose);
68 
69 /* Invokes a SCSI GET LBA STATUS(16) or GET LBA STATUS(32) command (SBC).
70  * Returns 0 -> success,
71  * SG_LIB_CAT_INVALID_OP -> GET LBA STATUS(16 or 32) not supported,
72  * SG_LIB_CAT_ILLEGAL_REQ -> bad field in cdb, SG_LIB_CAT_ABORTED_COMMAND,
73  * SG_LIB_CAT_NOT_READY -> device not ready, -1 -> other failure.
74  * sg_ll_get_lba_status() calls the 16 byte variant with rt=0 . */
75 int sg_ll_get_lba_status(int sg_fd, uint64_t start_llba, void * resp,
76                          int alloc_len, bool noisy, int verbose);
77 int sg_ll_get_lba_status16(int sg_fd, uint64_t start_llba, uint8_t rt,
78                            void * resp, int alloc_len, bool noisy,
79                            int verbose);
80 int sg_ll_get_lba_status32(int sg_fd, uint64_t start_llba, uint32_t scan_len,
81                            uint32_t element_id, uint8_t rt,
82                            void * resp, int alloc_len, bool noisy,
83                            int verbose);
84 
85 /* Invokes a SCSI PERSISTENT RESERVE IN command (SPC). Returns 0
86  * when successful, SG_LIB_CAT_INVALID_OP if command not supported,
87  * SG_LIB_CAT_ILLEGAL_REQ if field in cdb not supported,
88  * SG_LIB_CAT_UNIT_ATTENTION, SG_LIB_CAT_ABORTED_COMMAND, else -1 */
89 int sg_ll_persistent_reserve_in(int sg_fd, int rq_servact, void * resp,
90                                 int mx_resp_len, bool noisy, int verbose);
91 
92 /* Invokes a SCSI PERSISTENT RESERVE OUT command (SPC). Returns 0
93  * when successful, SG_LIB_CAT_INVALID_OP if command not supported,
94  * SG_LIB_CAT_ILLEGAL_REQ if field in cdb not supported,
95  * SG_LIB_CAT_UNIT_ATTENTION, SG_LIB_CAT_ABORTED_COMMAND, else -1 */
96 int sg_ll_persistent_reserve_out(int sg_fd, int rq_servact, int rq_scope,
97                                  unsigned int rq_type, void * paramp,
98                                  int param_len, bool noisy, int verbose);
99 
100 /* Invokes a SCSI READ BLOCK LIMITS command. Return of 0 -> success,
101  * SG_LIB_CAT_INVALID_OP -> READ BLOCK LIMITS not supported,
102  * SG_LIB_CAT_ILLEGAL_REQ -> bad field in cdb, SG_LIB_CAT_ABORTED_COMMAND,
103  * SG_LIB_NOT_READY (shouldn't happen), -1 -> other failure */
104 int sg_ll_read_block_limits(int sg_fd, void * resp, int mx_resp_len,
105                             bool noisy, int verbose);
106 
107 /* Invokes a SCSI READ BUFFER command (SPC). Return of 0 ->
108  * success, SG_LIB_CAT_INVALID_OP -> invalid opcode,
109  * SG_LIB_CAT_ILLEGAL_REQ -> bad field in cdb, SG_LIB_CAT_UNIT_ATTENTION,
110  * SG_LIB_CAT_NOT_READY -> device not ready, SG_LIB_CAT_ABORTED_COMMAND,
111  * -1 -> other failure */
112 int sg_ll_read_buffer(int sg_fd, int mode, int buffer_id, int buffer_offset,
113                       void * resp, int mx_resp_len, bool noisy, int verbose);
114 
115 /* Invokes a SCSI READ DEFECT DATA (10) command (SBC). Return of 0 ->
116  * success, SG_LIB_CAT_INVALID_OP -> invalid opcode,
117  * SG_LIB_CAT_ILLEGAL_REQ -> bad field in cdb, SG_LIB_CAT_UNIT_ATTENTION,
118  * SG_LIB_CAT_NOT_READY -> device not ready, SG_LIB_CAT_ABORTED_COMMAND,
119  * -1 -> other failure */
120 int sg_ll_read_defect10(int sg_fd, bool req_plist, bool req_glist,
121                         int dl_format, void * resp, int mx_resp_len,
122                         bool noisy, int verbose);
123 
124 /* Invokes a SCSI READ LONG (10) command (SBC). Note that 'xfer_len'
125  * is in bytes. Returns 0 -> success,
126  * SG_LIB_CAT_INVALID_OP -> READ LONG(10) not supported,
127  * SG_LIB_CAT_ILLEGAL_REQ -> bad field in cdb,
128  * SG_LIB_CAT_ILLEGAL_REQ_WITH_INFO -> bad field in cdb, with info
129  * field written to 'offsetp', SG_LIB_CAT_UNIT_ATTENTION,
130  * SG_LIB_CAT_NOT_READY -> device not ready, SG_LIB_CAT_ABORTED_COMMAND,
131  * -1 -> other failure */
132 int sg_ll_read_long10(int sg_fd, bool pblock, bool correct, unsigned int lba,
133                       void * resp, int xfer_len, int * offsetp, bool noisy,
134                       int verbose);
135 
136 /* Invokes a SCSI READ LONG (16) command (SBC). Note that 'xfer_len'
137  * is in bytes. Returns 0 -> success,
138  * SG_LIB_CAT_INVALID_OP -> READ LONG(16) not supported,
139  * SG_LIB_CAT_ILLEGAL_REQ -> bad field in cdb,
140  * SG_LIB_CAT_ILLEGAL_REQ_WITH_INFO -> bad field in cdb, with info
141  * field written to 'offsetp', SG_LIB_CAT_UNIT_ATTENTION,
142  * SG_LIB_CAT_NOT_READY -> device not ready, SG_LIB_CAT_ABORTED_COMMAND,
143  *  -1 -> other failure */
144 int sg_ll_read_long16(int sg_fd, bool pblock, bool correct, uint64_t llba,
145                       void * resp, int xfer_len, int * offsetp, bool noisy,
146                       int verbose);
147 
148 /* Invokes a SCSI READ MEDIA SERIAL NUMBER command. Return of 0 -> success,
149  * SG_LIB_CAT_INVALID_OP -> Read media serial number not supported,
150  * SG_LIB_CAT_ILLEGAL_REQ -> bad field in cdb, SG_LIB_CAT_UNIT_ATTENTION,
151  * SG_LIB_CAT_NOT_READY -> device not ready, SG_LIB_CAT_ABORTED_COMMAND,
152  * -1 -> other failure */
153 int sg_ll_read_media_serial_num(int sg_fd, void * resp, int mx_resp_len,
154                                 bool noisy, int verbose);
155 
156 /* Invokes a SCSI REASSIGN BLOCKS command.  Return of 0 -> success,
157  * SG_LIB_CAT_INVALID_OP -> invalid opcode, SG_LIB_CAT_UNIT_ATTENTION,
158  * SG_LIB_CAT_ILLEGAL_REQ -> bad field in cdb, SG_LIB_CAT_ABORTED_COMMAND,
159  * SG_LIB_CAT_NOT_READY -> device not ready, -1 -> other failure */
160 int sg_ll_reassign_blocks(int sg_fd, bool longlba, bool longlist,
161                           void * paramp, int param_len, bool noisy,
162                           int verbose);
163 
164 /* Invokes a SCSI RECEIVE DIAGNOSTIC RESULTS command. Return of 0 -> success,
165  * SG_LIB_CAT_INVALID_OP -> Receive diagnostic results not supported,
166  * SG_LIB_CAT_ILLEGAL_REQ -> bad field in cdb, SG_LIB_CAT_UNIT_ATTENTION,
167  * SG_LIB_CAT_NOT_READY -> device not ready, SG_LIB_CAT_ABORTED_COMMAND,
168  * -1 -> other failure */
169 int sg_ll_receive_diag(int sg_fd, bool pcv, int pg_code, void * resp,
170                        int mx_resp_len, bool noisy, int verbose);
171 
172 /* Same as sg_ll_receive_diag() but with added timeout_secs and residp
173  * arguments. Adds the ability to set the command abort timeout
174  * and the ability to report the residual count. If timeout_secs is zero
175  * or less the default command abort timeout (60 seconds) is used.
176  * If residp is non-NULL then the residual value is written where residp
177  * points. A residual value of 0 implies mx_resp_len bytes have be written
178  * where resp points. If the residual value equals mx_resp_len then no
179  * bytes have been written. */
180 int sg_ll_receive_diag_v2(int sg_fd, bool pcv, int pg_code, void * resp,
181                           int mx_resp_len, int timeout_secs, int * residp,
182                           bool noisy, int verbose);
183 
184 /* Invokes a SCSI REPORT IDENTIFYING INFORMATION command. This command was
185  * called REPORT DEVICE IDENTIFIER prior to spc4r07. Return of 0 -> success,
186  * SG_LIB_CAT_INVALID_OP -> Report identifying information not supported,
187  * SG_LIB_CAT_ILLEGAL_REQ -> bad field in cdb, SG_LIB_CAT_UNIT_ATTENTION,
188  * SG_LIB_CAT_NOT_READY -> device not ready, SG_LIB_CAT_ABORTED_COMMAND,
189  * -1 -> other failure */
190 int sg_ll_report_id_info(int sg_fd, int itype, void * resp, int max_resp_len,
191                          bool noisy, int verbose);
192 
193 /* Invokes a SCSI REPORT TARGET PORT GROUPS command. Return of 0 -> success,
194  * SG_LIB_CAT_INVALID_OP -> Report Target Port Groups not supported,
195  * SG_LIB_CAT_ILLEGAL_REQ -> bad field in cdb, SG_LIB_CAT_ABORTED_COMMAND,
196  * SG_LIB_CAT_UNIT_ATTENTION, -1 -> other failure */
197 int sg_ll_report_tgt_prt_grp(int sg_fd, void * resp, int mx_resp_len,
198                              bool noisy, int verbose);
199 int sg_ll_report_tgt_prt_grp2(int sg_fd, void * resp, int mx_resp_len,
200                               bool extended, bool noisy, int verbose);
201 
202 /* Invokes a SCSI SET TARGET PORT GROUPS command. Return of 0 -> success,
203  * SG_LIB_CAT_INVALID_OP -> Report Target Port Groups not supported,
204  * SG_LIB_CAT_ILLEGAL_REQ -> bad field in cdb, SG_LIB_CAT_ABORTED_COMMAND,
205  * SG_LIB_CAT_UNIT_ATTENTION, -1 -> other failure */
206 int sg_ll_set_tgt_prt_grp(int sg_fd, void * paramp, int param_len, bool noisy,
207                           int verbose);
208 
209 /* Invokes a SCSI REPORT REFERRALS command. Return of 0 -> success,
210  * SG_LIB_CAT_INVALID_OP -> Report Referrals not supported,
211  * SG_LIB_CAT_ILLEGAL_REQ -> bad field in cdb, SG_LIB_CAT_ABORTED_COMMAND,
212  * SG_LIB_CAT_UNIT_ATTENTION, -1 -> other failure */
213 int sg_ll_report_referrals(int sg_fd, uint64_t start_llba, bool one_seg,
214                            void * resp, int mx_resp_len, bool noisy,
215                            int verbose);
216 
217 /* Invokes a SCSI SEND DIAGNOSTIC command. Foreground, extended self tests can
218  * take a long time, if so set long_duration flag in which case the timeout
219  * is set to 7200 seconds; if the value of long_duration is > 7200 then that
220  * value is taken as the timeout value in seconds. Return of 0 -> success,
221  * SG_LIB_CAT_INVALID_OP -> Send diagnostic not supported,
222  * SG_LIB_CAT_ILLEGAL_REQ -> bad field in cdb, SG_LIB_CAT_UNIT_ATTENTION,
223  * SG_LIB_CAT_NOT_READY -> device not ready, SG_LIB_CAT_ABORTED_COMMAND,
224  * -1 -> other failure */
225 int sg_ll_send_diag(int sg_fd, int st_code, bool pf_bit, bool st_bit,
226                     bool devofl_bit, bool unitofl_bit, int long_duration,
227                     void * paramp, int param_len, bool noisy, int verbose);
228 
229 /* Invokes a SCSI SET IDENTIFYING INFORMATION command. This command was
230  * called SET DEVICE IDENTIFIER prior to spc4r07. Return of 0 -> success,
231  * SG_LIB_CAT_INVALID_OP -> Set identifying information not supported,
232  * SG_LIB_CAT_ILLEGAL_REQ -> bad field in cdb, SG_LIB_CAT_UNIT_ATTENTION,
233  * SG_LIB_CAT_NOT_READY -> device not ready, SG_LIB_CAT_ABORTED_COMMAND,
234  * -1 -> other failure */
235 int sg_ll_set_id_info(int sg_fd, int itype, void * paramp, int param_len,
236                       bool noisy, int verbose);
237 
238 /* Invokes a SCSI UNMAP (SBC-3) command. Return of 0 -> success,
239  * SG_LIB_CAT_INVALID_OP -> command not supported,
240  * SG_LIB_CAT_ILLEGAL_REQ -> bad field in cdb, SG_LIB_CAT_ABORTED_COMMAND,
241  * SG_LIB_CAT_UNIT_ATTENTION, -1 -> other failure */
242 int sg_ll_unmap(int sg_fd, int group_num, int timeout_secs, void * paramp,
243                 int param_len, bool noisy, int verbose);
244 /* Invokes a SCSI UNMAP (SBC-3) command. Version 2 adds anchor field
245  * (sbc3r22). Otherwise same as sg_ll_unmap() . */
246 int sg_ll_unmap_v2(int sg_fd, bool anchor, int group_num, int timeout_secs,
247                    void * paramp, int param_len, bool noisy, int verbose);
248 
249 /* Invokes a SCSI VERIFY (10) command (SBC and MMC).
250  * Note that 'veri_len' is in blocks while 'data_out_len' is in bytes.
251  * Returns of 0 -> success,
252  * SG_LIB_CAT_INVALID_OP -> Verify(10) not supported,
253  * SG_LIB_CAT_ILLEGAL_REQ -> bad field in cdb, SG_LIB_CAT_UNIT_ATTENTION,
254  * SG_LIB_CAT_MEDIUM_HARD -> medium or hardware error, no valid info,
255  * SG_LIB_CAT_MEDIUM_HARD_WITH_INFO -> as previous, with valid info,
256  * SG_LIB_CAT_NOT_READY -> device not ready, SG_LIB_CAT_ABORTED_COMMAND,
257  * SG_LIB_CAT_MISCOMPARE, -1 -> other failure */
258 int sg_ll_verify10(int sg_fd, int vrprotect, bool dpo, int bytechk,
259                    unsigned int lba, int veri_len, void * data_out,
260                    int data_out_len, unsigned int * infop, bool noisy,
261                    int verbose);
262 
263 /* Invokes a SCSI VERIFY (16) command (SBC).
264  * Note that 'veri_len' is in blocks while 'data_out_len' is in bytes.
265  * Returns of 0 -> success,
266  * SG_LIB_CAT_INVALID_OP -> Verify(16) not supported,
267  * SG_LIB_CAT_ILLEGAL_REQ -> bad field in cdb, SG_LIB_CAT_UNIT_ATTENTION,
268  * SG_LIB_CAT_MEDIUM_HARD -> medium or hardware error, no valid info,
269  * SG_LIB_CAT_MEDIUM_HARD_WITH_INFO -> as previous, with valid info,
270  * SG_LIB_CAT_NOT_READY -> device not ready, SG_LIB_CAT_ABORTED_COMMAND,
271  * SG_LIB_CAT_MISCOMPARE, -1 -> other failure */
272 int sg_ll_verify16(int sg_fd, int vrprotect, bool dpo, int bytechk,
273                    uint64_t llba, int veri_len, int group_num,
274                    void * data_out, int data_out_len, uint64_t * infop,
275                    bool noisy, int verbose);
276 
277 /* Invokes a SCSI WRITE BUFFER command (SPC). Return of 0 ->
278  * success, SG_LIB_CAT_INVALID_OP -> invalid opcode,
279  * SG_LIB_CAT_ILLEGAL_REQ -> bad field in cdb, SG_LIB_CAT_UNIT_ATTENTION,
280  * SG_LIB_CAT_NOT_READY -> device not ready, SG_LIB_CAT_ABORTED_COMMAND,
281  * -1 -> other failure */
282 int sg_ll_write_buffer(int sg_fd, int mode, int buffer_id, int buffer_offset,
283                        void * paramp, int param_len, bool noisy, int verbose);
284 
285 /* Invokes a SCSI WRITE BUFFER command (SPC). Return of 0 ->
286  * success, SG_LIB_CAT_INVALID_OP -> invalid opcode,
287  * SG_LIB_CAT_ILLEGAL_REQ -> bad field in cdb, SG_LIB_CAT_UNIT_ATTENTION,
288  * SG_LIB_CAT_NOT_READY -> device not ready, SG_LIB_CAT_ABORTED_COMMAND,
289  * -1 -> other failure. Adds mode specific field (spc4r32) and timeout
290  *  to command abort to override default of 60 seconds. If timeout_secs is
291  *  0 or less then the default timeout is used instead. */
292 int
293 sg_ll_write_buffer_v2(int sg_fd, int mode, int m_specific, int buffer_id,
294                       uint32_t buffer_offset, void * paramp,
295                       uint32_t param_len, int timeout_secs, bool noisy,
296                       int verbose);
297 
298 /* Invokes a SCSI WRITE LONG (10) command (SBC). Note that 'xfer_len'
299  * is in bytes. Returns 0 -> success,
300  * SG_LIB_CAT_INVALID_OP -> WRITE LONG(10) not supported,
301  * SG_LIB_CAT_ILLEGAL_REQ -> bad field in cdb,
302  * SG_LIB_CAT_ILLEGAL_REQ_WITH_INFO -> bad field in cdb, with info
303  * field written to 'offsetp', SG_LIB_CAT_UNIT_ATTENTION,
304  * SG_LIB_CAT_NOT_READY -> device not ready, SG_LIB_CAT_ABORTED_COMMAND,
305  * -1 -> other failure */
306 int sg_ll_write_long10(int sg_fd, bool cor_dis, bool wr_uncor, bool pblock,
307                        unsigned int lba, void * data_out, int xfer_len,
308                        int * offsetp, bool noisy, int verbose);
309 
310 /* Invokes a SCSI WRITE LONG (16) command (SBC). Note that 'xfer_len'
311  * is in bytes. Returns 0 -> success,
312  * SG_LIB_CAT_INVALID_OP -> WRITE LONG(16) not supported,
313  * SG_LIB_CAT_ILLEGAL_REQ -> bad field in cdb,
314  * SG_LIB_CAT_ILLEGAL_REQ_WITH_INFO -> bad field in cdb, with info
315  * field written to 'offsetp', SG_LIB_CAT_UNIT_ATTENTION,
316  * SG_LIB_CAT_NOT_READY -> device not ready, SG_LIB_CAT_ABORTED_COMMAND,
317  * -1 -> other failure */
318 int sg_ll_write_long16(int sg_fd, bool cor_dis, bool wr_uncor, bool pblock,
319                        uint64_t llba, void * data_out, int xfer_len,
320                        int * offsetp, bool noisy, int verbose);
321 
322 /* Invokes a SPC-3 SCSI RECEIVE COPY RESULTS command. In SPC-4 this function
323  * supports all service action variants of the THIRD-PARTY COPY IN opcode.
324  * SG_LIB_CAT_INVALID_OP -> Receive copy results not supported,
325  * SG_LIB_CAT_ILLEGAL_REQ -> bad field in cdb, SG_LIB_CAT_UNIT_ATTENTION,
326  * SG_LIB_CAT_NOT_READY -> device not ready, SG_LIB_CAT_ABORTED_COMMAND,
327  * -1 -> other failure */
328 int sg_ll_receive_copy_results(int sg_fd, int sa, int list_id, void * resp,
329                                int mx_resp_len, bool noisy, int verbose);
330 
331 /* Invokes a SCSI EXTENDED COPY(LID1) command. For EXTENDED COPY(LID4)
332  * including POPULATE TOKEN and WRITE USING TOKEN use
333  * sg_ll_3party_copy_out().  Return of 0 -> success,
334  * SG_LIB_CAT_INVALID_OP -> Extended copy not supported,
335  * SG_LIB_CAT_ILLEGAL_REQ -> bad field in cdb, SG_LIB_CAT_UNIT_ATTENTION,
336  * SG_LIB_CAT_NOT_READY -> device not ready, SG_LIB_CAT_ABORTED_COMMAND,
337  * -1 -> other failure */
338 int sg_ll_extended_copy(int sg_fd, void * paramp, int param_len, bool noisy,
339                         int verbose);
340 
341 /* Handles various service actions associated with opcode 0x83 which is
342  * called THIRD PARTY COPY OUT. These include the EXTENDED COPY(LID4),
343  * POPULATE TOKEN and WRITE USING TOKEN commands. Return of 0 -> success,
344  * SG_LIB_CAT_INVALID_OP -> opcode 0x83 not supported,
345  * SG_LIB_CAT_ILLEGAL_REQ -> bad field in cdb, SG_LIB_CAT_UNIT_ATTENTION,
346  * SG_LIB_CAT_NOT_READY -> device not ready, SG_LIB_CAT_ABORTED_COMMAND,
347  * -1 -> other failure */
348 int sg_ll_3party_copy_out(int sg_fd, int sa, unsigned int list_id,
349                           int group_num, int timeout_secs, void * paramp,
350                           int param_len, bool noisy, int verbose);
351 
352 /* Invokes a SCSI PRE-FETCH(10), PRE-FETCH(16) or SEEK(10) command (SBC).
353  * Returns 0 -> success, 25 (SG_LIB_CAT_CONDITION_MET), various SG_LIB_CAT_*
354  * positive values or -1 -> other errors. Note that CONDITION MET status
355  * is returned when immed=true and num_blocks can fit in device's cache,
356  * somewaht strangely, GOOD status (return 0) is returned if num_blocks
357  * cannot fit in device's cache. If do_seek10==true then does a SEEK(10)
358  * command with given lba, if that LBA is < 2**32 . Unclear what SEEK(10)
359  * does, assume it is like PRE-FETCH. If timeout_secs is 0 (or less) then
360  * use DEF_PT_TIMEOUT (60 seconds) as command timeout. */
361 int sg_ll_pre_fetch_x(int sg_fd, bool do_seek10, bool cdb16, bool immed,
362                       uint64_t lba, uint32_t num_blocks, int group_num,
363                       int timeout_secs, bool noisy, int verbose);
364 
365 #ifdef __cplusplus
366 }
367 #endif
368 
369 #endif
370