]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - sys/cam/ctl/ctl_cmd_table.c
MFC r287621: Reimplement CTL High Availability.
[FreeBSD/FreeBSD.git] / sys / cam / ctl / ctl_cmd_table.c
1 /*-
2  * Copyright (c) 2003, 2004, 2005, 2009 Silicon Graphics International Corp.
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions, and the following disclaimer,
10  *    without modification.
11  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
12  *    substantially similar to the "NO WARRANTY" disclaimer below
13  *    ("Disclaimer") and any redistribution must be conditioned upon
14  *    including a substantially similar Disclaimer requirement for further
15  *    binary redistribution.
16  *
17  * NO WARRANTY
18  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
21  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
23  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
24  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
25  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
26  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
27  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28  * POSSIBILITY OF SUCH DAMAGES.
29  *
30  * $Id: //depot/users/kenm/FreeBSD-test2/sys/cam/ctl/ctl_cmd_table.c#4 $
31  * $FreeBSD$
32  */
33 /*
34  * CAM Target Layer command table.
35  *
36  * Author: Ken Merry <ken@FreeBSD.org>, Kim Le
37  */
38
39 #include <sys/cdefs.h>
40 #include <sys/param.h>
41 #include <sys/systm.h>
42 #include <sys/kernel.h>
43 #include <sys/types.h>
44 #include <sys/malloc.h>
45 #include <sys/condvar.h>
46 #include <sys/queue.h>
47 #include <sys/sysctl.h>
48
49 #include <cam/scsi/scsi_all.h>
50 #include <cam/scsi/scsi_da.h>
51 #include <cam/ctl/ctl_io.h>
52 #include <cam/ctl/ctl.h>
53 #include <cam/ctl/ctl_frontend.h>
54 #include <cam/ctl/ctl_backend.h>
55 #include <cam/ctl/ctl_ioctl.h>
56 #include <cam/ctl/ctl_ha.h>
57 #include <cam/ctl/ctl_private.h>
58
59 /*
60  * Whenever support for a new command is added, it should be added to these
61  * tables.
62  */
63
64 /* 5E PERSISTENT RESERVE IN */
65 const struct ctl_cmd_entry ctl_cmd_table_5e[32] =
66 {
67 /* 00 READ KEYS */
68 {ctl_persistent_reserve_in, CTL_SERIDX_RES, CTL_CMD_FLAG_ALLOW_ON_RESV |
69                                                 CTL_CMD_FLAG_OK_ON_BOTH |
70                                                 CTL_CMD_FLAG_OK_ON_STOPPED |
71                                                 CTL_CMD_FLAG_OK_ON_INOPERABLE |
72                                                 CTL_CMD_FLAG_OK_ON_STANDBY |
73                                                 CTL_FLAG_DATA_IN |
74                                                 CTL_CMD_FLAG_ALLOW_ON_PR_RESV,
75  CTL_LUN_PAT_NONE,
76  10, { 0x00, 0, 0, 0, 0, 0, 0xff, 0xff, 0x07}},
77
78 /* 01 READ RESERVATION */
79 {ctl_persistent_reserve_in, CTL_SERIDX_RES, CTL_CMD_FLAG_ALLOW_ON_RESV |
80                                                 CTL_CMD_FLAG_OK_ON_BOTH |
81                                                 CTL_CMD_FLAG_OK_ON_STOPPED |
82                                                 CTL_CMD_FLAG_OK_ON_INOPERABLE |
83                                                 CTL_CMD_FLAG_OK_ON_STANDBY |
84                                                 CTL_FLAG_DATA_IN |
85                                                 CTL_CMD_FLAG_ALLOW_ON_PR_RESV,
86  CTL_LUN_PAT_NONE,
87  10, { 0x01, 0, 0, 0, 0, 0, 0xff, 0xff, 0x07}},
88
89 /* 02 REPORT CAPABILITIES */
90 {ctl_persistent_reserve_in, CTL_SERIDX_INQ, CTL_CMD_FLAG_ALLOW_ON_RESV |
91                                             CTL_CMD_FLAG_OK_ON_BOTH |
92                                             CTL_CMD_FLAG_OK_ON_STOPPED |
93                                             CTL_CMD_FLAG_OK_ON_INOPERABLE |
94                                             CTL_CMD_FLAG_OK_ON_STANDBY |
95                                             CTL_FLAG_DATA_IN |
96                                             CTL_CMD_FLAG_ALLOW_ON_PR_RESV,
97  CTL_LUN_PAT_NONE,
98  10, { 0x02, 0, 0, 0, 0, 0, 0xff, 0xff, 0x07}},
99
100 /* 03 READ FULL STATUS */
101 {ctl_persistent_reserve_in, CTL_SERIDX_INQ, CTL_CMD_FLAG_ALLOW_ON_RESV |
102                                             CTL_CMD_FLAG_OK_ON_BOTH |
103                                             CTL_CMD_FLAG_OK_ON_STOPPED |
104                                             CTL_CMD_FLAG_OK_ON_INOPERABLE |
105                                             CTL_CMD_FLAG_OK_ON_STANDBY |
106                                             CTL_FLAG_DATA_IN |
107                                             CTL_CMD_FLAG_ALLOW_ON_PR_RESV,
108  CTL_LUN_PAT_NONE,
109  10, { 0x03, 0, 0, 0, 0, 0, 0xff, 0xff, 0x07}},
110
111 /* 04-1f */
112 };
113
114 /* 5F PERSISTENT RESERVE OUT */
115 const struct ctl_cmd_entry ctl_cmd_table_5f[32] =
116 {
117 /* 00 REGISTER */
118 {ctl_persistent_reserve_out, CTL_SERIDX_RES, CTL_CMD_FLAG_ALLOW_ON_RESV |
119                                                 CTL_CMD_FLAG_OK_ON_BOTH |
120                                                 CTL_CMD_FLAG_OK_ON_STOPPED |
121                                                 CTL_CMD_FLAG_OK_ON_INOPERABLE |
122                                                 CTL_CMD_FLAG_OK_ON_STANDBY |
123                                                 CTL_FLAG_DATA_OUT |
124                                                 CTL_CMD_FLAG_ALLOW_ON_PR_RESV,
125  CTL_LUN_PAT_NONE,
126  10, { 0x00, 0xff, 0, 0, 0xff, 0xff, 0xff, 0xff, 0x07}},
127
128 /* 01 RESERVE */
129 {ctl_persistent_reserve_out, CTL_SERIDX_RES, CTL_CMD_FLAG_ALLOW_ON_RESV |
130                                                 CTL_CMD_FLAG_OK_ON_BOTH |
131                                                 CTL_CMD_FLAG_OK_ON_STOPPED |
132                                                 CTL_CMD_FLAG_OK_ON_INOPERABLE |
133                                                 CTL_CMD_FLAG_OK_ON_STANDBY |
134                                                 CTL_FLAG_DATA_OUT |
135                                                 CTL_CMD_FLAG_ALLOW_ON_PR_RESV,
136  CTL_LUN_PAT_NONE,
137  10, { 0x01, 0xff, 0, 0, 0xff, 0xff, 0xff, 0xff, 0x07}},
138
139 /* 02 RELEASE */
140 {ctl_persistent_reserve_out, CTL_SERIDX_RES, CTL_CMD_FLAG_ALLOW_ON_RESV |
141                                                 CTL_CMD_FLAG_OK_ON_BOTH |
142                                                 CTL_CMD_FLAG_OK_ON_STOPPED |
143                                                 CTL_CMD_FLAG_OK_ON_INOPERABLE |
144                                                 CTL_CMD_FLAG_OK_ON_STANDBY |
145                                                 CTL_FLAG_DATA_OUT |
146                                                 CTL_CMD_FLAG_ALLOW_ON_PR_RESV,
147  CTL_LUN_PAT_NONE,
148  10, { 0x02, 0xff, 0, 0, 0xff, 0xff, 0xff, 0xff, 0x07}},
149
150 /* 03 CLEAR */
151 {ctl_persistent_reserve_out, CTL_SERIDX_RES, CTL_CMD_FLAG_ALLOW_ON_RESV |
152                                                 CTL_CMD_FLAG_OK_ON_BOTH |
153                                                 CTL_CMD_FLAG_OK_ON_STOPPED |
154                                                 CTL_CMD_FLAG_OK_ON_INOPERABLE |
155                                                 CTL_CMD_FLAG_OK_ON_STANDBY |
156                                                 CTL_FLAG_DATA_OUT |
157                                                 CTL_CMD_FLAG_ALLOW_ON_PR_RESV,
158  CTL_LUN_PAT_NONE,
159  10, { 0x03, 0xff, 0, 0, 0xff, 0xff, 0xff, 0xff, 0x07}},
160
161 /* 04 PREEMPT */
162 {ctl_persistent_reserve_out, CTL_SERIDX_RES, CTL_CMD_FLAG_ALLOW_ON_RESV |
163                                                 CTL_CMD_FLAG_OK_ON_BOTH |
164                                                 CTL_CMD_FLAG_OK_ON_STOPPED |
165                                                 CTL_CMD_FLAG_OK_ON_INOPERABLE |
166                                                 CTL_CMD_FLAG_OK_ON_STANDBY |
167                                                 CTL_FLAG_DATA_OUT |
168                                                 CTL_CMD_FLAG_ALLOW_ON_PR_RESV,
169  CTL_LUN_PAT_NONE,
170  10, { 0x04, 0xff, 0, 0, 0xff, 0xff, 0xff, 0xff, 0x07}},
171
172 /* 05 PREEMPT AND ABORT */
173 {ctl_persistent_reserve_out, CTL_SERIDX_RES, CTL_CMD_FLAG_ALLOW_ON_RESV |
174                                                 CTL_CMD_FLAG_OK_ON_BOTH |
175                                                 CTL_CMD_FLAG_OK_ON_STOPPED |
176                                                 CTL_CMD_FLAG_OK_ON_INOPERABLE |
177                                                 CTL_CMD_FLAG_OK_ON_STANDBY |
178                                                 CTL_FLAG_DATA_OUT |
179                                                 CTL_CMD_FLAG_ALLOW_ON_PR_RESV,
180  CTL_LUN_PAT_NONE,
181  10, { 0x05, 0xff, 0, 0, 0xff, 0xff, 0xff, 0xff, 0x07}},
182
183 /* 06 REGISTER AND IGNORE EXISTING KEY */
184 {ctl_persistent_reserve_out, CTL_SERIDX_RES, CTL_CMD_FLAG_ALLOW_ON_RESV |
185                                                 CTL_CMD_FLAG_OK_ON_BOTH |
186                                                 CTL_CMD_FLAG_OK_ON_STOPPED |
187                                                 CTL_CMD_FLAG_OK_ON_INOPERABLE |
188                                                 CTL_CMD_FLAG_OK_ON_STANDBY |
189                                                 CTL_FLAG_DATA_OUT |
190                                                 CTL_CMD_FLAG_ALLOW_ON_PR_RESV,
191  CTL_LUN_PAT_NONE,
192  10, { 0x06, 0xff, 0, 0, 0xff, 0xff, 0xff, 0xff, 0x07}},
193
194 /* 07 REGISTER AND MOVE */
195 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
196
197 /* 08-1f */
198 };
199
200 /* 83 EXTENDED COPY */
201 const struct ctl_cmd_entry ctl_cmd_table_83[32] =
202 {
203 /* 00 EXTENDED COPY (LID1) */
204 {ctl_extended_copy_lid1, CTL_SERIDX_RD_CAP, CTL_CMD_FLAG_OK_ON_BOTH |
205                                             CTL_FLAG_DATA_OUT,
206  CTL_LUN_PAT_NONE,
207  16, { 0x00, 0, 0, 0, 0, 0, 0, 0, 0, 0xff, 0xff, 0xff, 0xff, 0, 0x07}},
208
209 /* 01 EXTENDED COPY (LID4) */
210 {ctl_extended_copy_lid4, CTL_SERIDX_RD_CAP, CTL_CMD_FLAG_OK_ON_BOTH |
211                                             CTL_FLAG_DATA_OUT,
212  CTL_LUN_PAT_NONE,
213  16, { 0x01, 0, 0, 0, 0, 0, 0, 0, 0, 0xff, 0xff, 0xff, 0xff, 0, 0x07}},
214
215 /* 02 */
216 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
217
218 /* 03 */
219 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
220
221 /* 04 */
222 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
223
224 /* 05 */
225 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
226
227 /* 06 */
228 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
229
230 /* 07 */
231 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
232
233 /* 08 */
234 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
235
236 /* 09 */
237 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
238
239 /* 0A */
240 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
241
242 /* 0B */
243 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
244
245 /* 0C */
246 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
247
248 /* 0D */
249 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
250
251 /* 0E */
252 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
253
254 /* 0F */
255 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
256
257 /* 10 POPULATE TOKEN */
258 {ctl_populate_token, CTL_SERIDX_RD_CAP, CTL_CMD_FLAG_OK_ON_SLUN |
259                                         CTL_FLAG_DATA_OUT |
260                                         CTL_CMD_FLAG_ALLOW_ON_PR_WRESV,
261  CTL_LUN_PAT_NONE,
262  16, { 0x10, 0, 0, 0, 0, 0xff, 0xff, 0xff, 0xff,
263        0xff, 0xff, 0xff, 0xff, 0, 0x07}},
264
265 /* 11 WRITE USING TOKEN */
266 {ctl_write_using_token, CTL_SERIDX_RD_CAP, CTL_CMD_FLAG_OK_ON_SLUN |
267                                         CTL_FLAG_DATA_OUT,
268  CTL_LUN_PAT_NONE,
269  16, { 0x11, 0, 0, 0, 0, 0xff, 0xff, 0xff, 0xff,
270        0xff, 0xff, 0xff, 0xff, 0, 0x07}},
271
272 /* 12 */
273 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
274
275 /* 13 */
276 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
277
278 /* 14 */
279 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
280
281 /* 15 */
282 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
283
284 /* 16 */
285 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
286
287 /* 17 */
288 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
289
290 /* 18 */
291 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
292
293 /* 19 */
294 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
295
296 /* 1A */
297 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
298
299 /* 1B */
300 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
301
302 /* 1C COPY OPERATION ABORT */
303 {ctl_copy_operation_abort, CTL_SERIDX_RD_CAP, CTL_CMD_FLAG_OK_ON_BOTH |
304                                               CTL_FLAG_DATA_NONE,
305  CTL_LUN_PAT_NONE,
306  16, { 0x1c, 0xff, 0xff, 0xff, 0xff, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x07}},
307 };
308
309 /* 84 RECEIVE COPY STATUS */
310 const struct ctl_cmd_entry ctl_cmd_table_84[32] =
311 {
312 /* 00 RECEIVE COPY STATUS (LID1) */
313 {ctl_receive_copy_status_lid1, CTL_SERIDX_RD_CAP,
314  CTL_CMD_FLAG_OK_ON_BOTH |
315  CTL_FLAG_DATA_IN |
316  CTL_CMD_FLAG_ALLOW_ON_PR_RESV,
317  CTL_LUN_PAT_NONE,
318  16, {0x00, 0xff, 0, 0, 0, 0, 0, 0, 0, 0xff, 0xff, 0xff, 0xff, 0, 0x07}},
319
320 /* 01 RECEIVE COPY DATA (LID1) */
321 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
322
323 /* 02 */
324 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
325
326 /* 03 RECEIVE COPY OPERATING PARAMETERS */
327 {ctl_receive_copy_operating_parameters, CTL_SERIDX_RD_CAP,
328  CTL_CMD_FLAG_OK_ON_BOTH |
329  CTL_CMD_FLAG_OK_ON_STOPPED |
330  CTL_CMD_FLAG_OK_ON_INOPERABLE |
331  CTL_CMD_FLAG_OK_ON_STANDBY |
332  CTL_FLAG_DATA_IN |
333  CTL_CMD_FLAG_ALLOW_ON_PR_RESV,
334  CTL_LUN_PAT_NONE,
335  16, {0x03, 0, 0, 0, 0, 0, 0, 0, 0, 0xff, 0xff, 0xff, 0xff, 0, 0x07}},
336
337 /* 04 RECEIVE COPY FAILURE DETAILS (LID1) */
338 {ctl_receive_copy_failure_details, CTL_SERIDX_RD_CAP,
339  CTL_CMD_FLAG_OK_ON_BOTH |
340  CTL_FLAG_DATA_IN |
341  CTL_CMD_FLAG_ALLOW_ON_PR_RESV,
342  CTL_LUN_PAT_NONE,
343  16, {0x04, 0xff, 0, 0, 0, 0, 0, 0, 0, 0xff, 0xff, 0xff, 0xff, 0, 0x07}},
344
345 /* 05 RECEIVE COPY STATUS (LID4) */
346 {ctl_receive_copy_status_lid4, CTL_SERIDX_RD_CAP,
347  CTL_CMD_FLAG_OK_ON_BOTH |
348  CTL_FLAG_DATA_IN |
349  CTL_CMD_FLAG_ALLOW_ON_PR_RESV,
350  CTL_LUN_PAT_NONE,
351  16, {0x05, 0xff, 0xff, 0xff, 0xff, 0, 0, 0, 0, 0xff, 0xff, 0xff, 0xff, 0, 0x07}},
352
353 /* 06 RECEIVE COPY DATA (LID4)*/
354 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
355
356 /* 07 RECEIVE ROD TOKEN INFORMATION */
357 {ctl_receive_rod_token_information, CTL_SERIDX_RD_CAP,
358  CTL_CMD_FLAG_OK_ON_BOTH |
359  CTL_FLAG_DATA_IN |
360  CTL_CMD_FLAG_ALLOW_ON_PR_RESV,
361  CTL_LUN_PAT_NONE,
362  16, {0x07, 0xff, 0xff, 0xff, 0xff, 0, 0, 0, 0, 0xff, 0xff, 0xff, 0xff, 0, 0x07}},
363
364 /* 08 REPORT ALL ROD TOKENS */
365 {ctl_report_all_rod_tokens, CTL_SERIDX_RD_CAP,
366  CTL_CMD_FLAG_OK_ON_BOTH |
367  CTL_FLAG_DATA_IN |
368  CTL_CMD_FLAG_ALLOW_ON_PR_RESV,
369  CTL_LUN_PAT_NONE,
370  16, {0x08, 0, 0, 0, 0, 0, 0, 0, 0, 0xff, 0xff, 0xff, 0xff, 0, 0x07}},
371 };
372
373 /* 9E SERVICE ACTION IN(16) */
374 const struct ctl_cmd_entry ctl_cmd_table_9e[32] =
375 {
376 /* 00 */
377 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
378
379 /* 01 */
380 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
381
382 /* 02 */
383 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
384
385 /* 03 */
386 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
387
388 /* 04 */
389 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
390
391 /* 05 */
392 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
393
394 /* 06 */
395 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
396
397 /* 07 */
398 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
399
400 /* 08 */
401 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
402
403 /* 09 */
404 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
405
406 /* 0A */
407 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
408
409 /* 0B */
410 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
411
412 /* 0C */
413 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
414
415 /* 0D */
416 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
417
418 /* 0E */
419 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
420
421 /* 0F */
422 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
423
424 /* 10 READ CAPACITY(16) */
425 {ctl_read_capacity_16, CTL_SERIDX_RD_CAP, CTL_CMD_FLAG_OK_ON_SLUN |
426                                           CTL_CMD_FLAG_OK_ON_STOPPED |
427                                           CTL_CMD_FLAG_OK_ON_INOPERABLE |
428                                           CTL_FLAG_DATA_IN |
429                                           CTL_CMD_FLAG_ALLOW_ON_PR_RESV,
430  CTL_LUN_PAT_READCAP,
431  16, {0x10, 0, 0, 0, 0, 0, 0, 0, 0, 0xff, 0xff, 0xff, 0xff, 0, 0x07}},
432
433 /* 11 */
434 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
435
436 /* 12 GET LBA STATUS */
437 {ctl_get_lba_status, CTL_SERIDX_READ, CTL_CMD_FLAG_OK_ON_SLUN |
438                                       CTL_FLAG_DATA_IN |
439                                       CTL_CMD_FLAG_ALLOW_ON_PR_WRESV,
440  CTL_LUN_PAT_READ | CTL_LUN_PAT_RANGE,
441  16, {0x12, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
442     0xff, 0xff, 0xff, 0xff, 0, 0x07}},
443
444 /* 13-1f */
445 };
446
447 /* A3 MAINTENANCE IN */
448 const struct ctl_cmd_entry ctl_cmd_table_a3[32] =
449 {
450 /* 00 */
451 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
452
453 /* 01 */
454 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
455
456 /* 02 */
457 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
458
459 /* 03 */
460 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
461
462 /* 04 */
463 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
464
465 /* 05 */
466 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
467
468 /* 06 */
469 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
470
471 /* 07 */
472 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
473
474 /* 08 */
475 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
476
477 /* 09 */
478 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
479
480 /* 0A REPORT TARGET PORT GROUPS */
481 {ctl_report_tagret_port_groups, CTL_SERIDX_INQ, CTL_CMD_FLAG_OK_ON_BOTH |
482                                                 CTL_CMD_FLAG_OK_ON_STOPPED |
483                                                 CTL_CMD_FLAG_OK_ON_INOPERABLE |
484                                                 CTL_CMD_FLAG_OK_ON_STANDBY |
485                                                 CTL_CMD_FLAG_OK_ON_UNAVAIL |
486                                                 CTL_FLAG_DATA_IN |
487                                                 CTL_CMD_FLAG_ALLOW_ON_PR_RESV,
488  CTL_LUN_PAT_NONE,
489  12, {0x0a, 0, 0, 0, 0, 0xff, 0xff, 0xff, 0xff, 0, 0x07}},
490
491 /* 0B */
492 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
493
494 /* 0C REPORT SUPPORTED_OPCODES */
495 {ctl_report_supported_opcodes, CTL_SERIDX_INQ, CTL_CMD_FLAG_OK_ON_BOTH |
496                                                 CTL_CMD_FLAG_OK_ON_STOPPED |
497                                                 CTL_CMD_FLAG_OK_ON_INOPERABLE |
498                                                 CTL_CMD_FLAG_OK_ON_STANDBY |
499                                                 CTL_CMD_FLAG_OK_ON_UNAVAIL |
500                                                 CTL_FLAG_DATA_IN |
501                                                 CTL_CMD_FLAG_ALLOW_ON_PR_RESV,
502  CTL_LUN_PAT_NONE,
503  12, {0x0c, 0x87, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0, 0x07}},
504
505 /* 0D REPORT SUPPORTED_TASK MANAGEMENT FUNCTIONS */
506 {ctl_report_supported_tmf, CTL_SERIDX_INQ, CTL_CMD_FLAG_OK_ON_BOTH |
507                                            CTL_CMD_FLAG_OK_ON_STOPPED |
508                                            CTL_CMD_FLAG_OK_ON_INOPERABLE |
509                                            CTL_CMD_FLAG_OK_ON_STANDBY |
510                                            CTL_CMD_FLAG_OK_ON_UNAVAIL |
511                                            CTL_FLAG_DATA_IN |
512                                            CTL_CMD_FLAG_ALLOW_ON_PR_RESV,
513  CTL_LUN_PAT_NONE,
514  12, {0x0d, 0, 0, 0, 0, 0xff, 0xff, 0xff, 0xff, 0, 0x07}},
515
516 /* 0E */
517 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
518
519 /* 0F REPORT TIMESTAMP */
520 {ctl_report_timestamp, CTL_SERIDX_INQ, CTL_CMD_FLAG_OK_ON_BOTH |
521                                         CTL_CMD_FLAG_OK_ON_STOPPED |
522                                         CTL_CMD_FLAG_OK_ON_INOPERABLE |
523                                         CTL_CMD_FLAG_OK_ON_STANDBY |
524                                         CTL_CMD_FLAG_OK_ON_UNAVAIL |
525                                         CTL_FLAG_DATA_IN |
526                                         CTL_CMD_FLAG_ALLOW_ON_PR_RESV,
527  CTL_LUN_PAT_NONE,
528  12, {0x0f, 0, 0, 0, 0, 0xff, 0xff, 0xff, 0xff, 0, 0x07}},
529
530 /* 10-1f */
531 };
532
533 const struct ctl_cmd_entry ctl_cmd_table[256] =
534 {
535 /* 00 TEST UNIT READY */
536 {ctl_tur, CTL_SERIDX_TUR, CTL_CMD_FLAG_OK_ON_BOTH |
537                           CTL_FLAG_DATA_NONE |
538                           CTL_CMD_FLAG_ALLOW_ON_PR_RESV,
539  CTL_LUN_PAT_TUR, 6, {0, 0, 0, 0, 0x07}},
540
541 /* 01 REWIND */
542 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
543
544 /* 02 */
545 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
546
547 /* 03 REQUEST SENSE */
548 {ctl_request_sense, CTL_SERIDX_RQ_SNS, CTL_FLAG_DATA_IN |
549                                        CTL_CMD_FLAG_OK_ON_ALL_LUNS |
550                                        CTL_CMD_FLAG_ALLOW_ON_RESV |
551                                        CTL_CMD_FLAG_NO_SENSE |
552                                        CTL_CMD_FLAG_OK_ON_STOPPED |
553                                        CTL_CMD_FLAG_OK_ON_INOPERABLE |
554                                        CTL_CMD_FLAG_OK_ON_STANDBY |
555                                        CTL_CMD_FLAG_OK_ON_UNAVAIL |
556                                        CTL_CMD_FLAG_ALLOW_ON_PR_RESV,
557  CTL_LUN_PAT_NONE, 6, {0x01, 0, 0, 0xff, 0x07}},
558
559 /* 04 FORMAT UNIT */
560 {ctl_format, CTL_SERIDX_FORMAT, CTL_CMD_FLAG_OK_ON_SLUN |
561                                 CTL_CMD_FLAG_OK_ON_INOPERABLE |
562                                 CTL_FLAG_DATA_OUT,
563  CTL_LUN_PAT_NONE, 6, {0xff, 0, 0, 0, 0x07}},
564
565 /* 05 READ BLOCK LIMITS */
566 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
567
568 /* 06 */
569 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
570
571 /* 07 REASSIGN BLOCKS */
572 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
573
574 /* 08 READ(6) */
575 {ctl_read_write, CTL_SERIDX_READ, CTL_CMD_FLAG_OK_ON_SLUN |
576                                   CTL_FLAG_DATA_IN |
577                                   CTL_CMD_FLAG_ALLOW_ON_PR_WRESV,
578  CTL_LUN_PAT_READ | CTL_LUN_PAT_RANGE, 6, {0x1f, 0xff, 0xff, 0xff, 0x07}},
579
580 /* 09 */
581 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
582
583 /* 0A WRITE(6) */
584 {ctl_read_write, CTL_SERIDX_WRITE, CTL_CMD_FLAG_OK_ON_SLUN |
585                                    CTL_FLAG_DATA_OUT,
586  CTL_LUN_PAT_WRITE | CTL_LUN_PAT_RANGE, 6, {0x1f, 0xff, 0xff, 0xff, 0x07}},
587
588 /* 0B SEEK(6) */
589 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
590
591 /* 0C */
592 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
593
594 /* 0D */
595 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
596
597 /* 0E */
598 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
599
600 /* 0F READ REVERSE(6) */
601 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
602
603 /* 10 WRITE FILEMARKS(6) */
604 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
605
606 /* 11 SPACE(6) */
607 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
608
609 /* 12 INQUIRY */
610 {ctl_inquiry, CTL_SERIDX_INQ, CTL_CMD_FLAG_OK_ON_ALL_LUNS |
611                               CTL_CMD_FLAG_ALLOW_ON_RESV |
612                               CTL_CMD_FLAG_NO_SENSE |
613                               CTL_CMD_FLAG_OK_ON_STOPPED |
614                               CTL_CMD_FLAG_OK_ON_INOPERABLE |
615                               CTL_CMD_FLAG_OK_ON_STANDBY |
616                               CTL_CMD_FLAG_OK_ON_UNAVAIL |
617                               CTL_FLAG_DATA_IN |
618                               CTL_CMD_FLAG_ALLOW_ON_PR_RESV,
619  CTL_LUN_PAT_NONE, 6, {0xe1, 0xff, 0xff, 0xff, 0x07}},
620
621 /* 13 */
622 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
623
624 /* 14 RECOVER BUFFERED DATA */
625 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
626
627 /* 15 MODE SELECT(6) */
628 {ctl_mode_select, CTL_SERIDX_MD_SEL, CTL_CMD_FLAG_OK_ON_BOTH |
629                                      CTL_CMD_FLAG_OK_ON_STOPPED |
630                                      CTL_CMD_FLAG_OK_ON_INOPERABLE |
631                                      CTL_CMD_FLAG_OK_ON_STANDBY |
632                                      CTL_FLAG_DATA_OUT,
633  CTL_LUN_PAT_NONE, 6, {0x11, 0, 0, 0xff, 0x07}},
634
635 /* 16 RESERVE(6) */
636 {ctl_scsi_reserve, CTL_SERIDX_RES, CTL_CMD_FLAG_ALLOW_ON_RESV |
637                                     CTL_CMD_FLAG_OK_ON_BOTH |
638                                     CTL_CMD_FLAG_OK_ON_STOPPED |
639                                     CTL_CMD_FLAG_OK_ON_INOPERABLE |
640                                     CTL_CMD_FLAG_OK_ON_STANDBY |
641                                     CTL_FLAG_DATA_OUT,
642  CTL_LUN_PAT_NONE, 6, {0, 0, 0, 0, 0x07}},
643
644 /* 17 RELEASE(6) */
645 {ctl_scsi_release, CTL_SERIDX_RES, CTL_CMD_FLAG_ALLOW_ON_RESV |
646                                    CTL_CMD_FLAG_OK_ON_BOTH |
647                                    CTL_CMD_FLAG_OK_ON_STOPPED |
648                                    CTL_CMD_FLAG_OK_ON_INOPERABLE |
649                                    CTL_CMD_FLAG_OK_ON_STANDBY |
650                                    CTL_FLAG_DATA_NONE,
651  CTL_LUN_PAT_NONE, 6, {0, 0, 0, 0, 0x07}},
652
653 /* 18 COPY */
654 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
655
656 /* 19 ERASE(6) */
657 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
658
659 /* 1A MODE SENSE(6) */
660 {ctl_mode_sense, CTL_SERIDX_MD_SNS, CTL_CMD_FLAG_OK_ON_BOTH |
661                                     CTL_CMD_FLAG_OK_ON_STOPPED |
662                                     CTL_CMD_FLAG_OK_ON_INOPERABLE |
663                                     CTL_CMD_FLAG_OK_ON_STANDBY |
664                                     CTL_FLAG_DATA_IN |
665                                     CTL_CMD_FLAG_ALLOW_ON_PR_WRESV,
666  CTL_LUN_PAT_NONE, 6, {0x08, 0xff, 0xff, 0xff, 0x07}},
667
668 /* 1B START STOP UNIT */
669 {ctl_start_stop, CTL_SERIDX_START, CTL_CMD_FLAG_OK_ON_SLUN |
670                                    CTL_CMD_FLAG_OK_ON_STOPPED |
671                                    CTL_CMD_FLAG_OK_ON_INOPERABLE |
672                                    CTL_FLAG_DATA_NONE |
673                                    CTL_CMD_FLAG_ALLOW_ON_PR_RESV,
674  CTL_LUN_PAT_NONE, 6, {0x01, 0, 0, 0x03, 0x07}},
675
676 /* 1C RECEIVE DIAGNOSTIC RESULTS */
677 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
678
679 /* 1D SEND DIAGNOSTIC */
680 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
681
682 /* 1E PREVENT ALLOW MEDIUM REMOVAL */
683 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
684
685 /* 1F */
686 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
687
688 /* 20 */
689 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
690
691 /* 21 */
692 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
693
694 /* 22 */
695 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
696
697 /* 23 */
698 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
699
700 /* 24 SET WINDOW */
701 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
702
703 /* 25 READ CAPACITY(10) */
704 {ctl_read_capacity, CTL_SERIDX_RD_CAP, CTL_CMD_FLAG_OK_ON_SLUN|
705                                        CTL_CMD_FLAG_OK_ON_STOPPED |
706                                        CTL_CMD_FLAG_OK_ON_INOPERABLE |
707                                        CTL_FLAG_DATA_IN |
708                                        CTL_CMD_FLAG_ALLOW_ON_PR_RESV,
709  CTL_LUN_PAT_READCAP, 10, {0, 0, 0, 0, 0, 0, 0, 0, 0x07}},
710
711 /* 26 */
712 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
713
714 /* 27 */
715 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
716
717 /* 28 READ(10) */
718 {ctl_read_write, CTL_SERIDX_READ, CTL_CMD_FLAG_OK_ON_SLUN |
719                                   CTL_FLAG_DATA_IN |
720                                   CTL_CMD_FLAG_ALLOW_ON_PR_WRESV,
721  CTL_LUN_PAT_READ | CTL_LUN_PAT_RANGE,
722  10, {0x1a, 0xff, 0xff, 0xff, 0xff, 0, 0xff, 0xff, 0x07}},
723
724 /* 29 READ GENERATION */
725 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
726
727 /* 2A WRITE(10) */
728 {ctl_read_write, CTL_SERIDX_WRITE, CTL_CMD_FLAG_OK_ON_SLUN| CTL_FLAG_DATA_OUT,
729  CTL_LUN_PAT_WRITE | CTL_LUN_PAT_RANGE,
730  10, {0x1a, 0xff, 0xff, 0xff, 0xff, 0, 0xff, 0xff, 0x07}},
731
732 /* 2B SEEK(10) */
733 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
734
735 /* 2C ERASE(10) */
736 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
737
738 /* 2D READ UPDATED BLOCK */
739 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
740
741 /* 2E WRITE AND VERIFY(10) */
742 {ctl_read_write, CTL_SERIDX_WRITE, CTL_CMD_FLAG_OK_ON_SLUN| CTL_FLAG_DATA_OUT,
743  CTL_LUN_PAT_WRITE | CTL_LUN_PAT_RANGE,
744  10, {0x12, 0xff, 0xff, 0xff, 0xff, 0, 0xff, 0xff, 0x07}},
745
746 /* 2F VERIFY(10) */
747 {ctl_verify, CTL_SERIDX_READ, CTL_CMD_FLAG_OK_ON_SLUN |
748                               CTL_FLAG_DATA_OUT |
749                               CTL_CMD_FLAG_ALLOW_ON_PR_WRESV,
750  CTL_LUN_PAT_READ | CTL_LUN_PAT_RANGE,
751  10, {0x16, 0xff, 0xff, 0xff, 0xff, 0, 0xff, 0xff, 0x07}},
752
753 /* 30 SEARCH DATA HIGH(10) */
754 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
755
756 /* 31 SEARCH DATA EQUAL(10) */
757 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
758
759 /* 32 SEARCH DATA LOW(10) */
760 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
761
762 /* 33 SET LIMITS(10) */
763 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
764
765 /* 34 PRE-FETCH(10) */
766 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
767
768 /* 35 SYNCHRONIZE CACHE(10) */
769 {ctl_sync_cache, CTL_SERIDX_SYNC, CTL_CMD_FLAG_OK_ON_SLUN |
770                                   CTL_FLAG_DATA_NONE,
771  CTL_LUN_PAT_NONE,
772  10, {0x02, 0xff, 0xff, 0xff, 0xff, 0, 0xff, 0xff, 0x07}},
773
774 /* 36 LOCK UNLOCK CACHE(10) */
775 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
776
777 /* 37 READ DEFECT DATA(10) */
778 {ctl_read_defect, CTL_SERIDX_MD_SNS, CTL_CMD_FLAG_OK_ON_SLUN |
779                                      CTL_FLAG_DATA_IN |
780                                      CTL_CMD_FLAG_ALLOW_ON_PR_WRESV,
781  CTL_LUN_PAT_NONE,
782  10, {0, 0x1f, 0, 0, 0, 0, 0xff, 0xff, 0x07}},
783
784 /* 38 MEDIUM SCAN */
785 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
786
787 /* 39 COMPARE */
788 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
789
790 /* 3A COPY AND VERIFY */
791 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
792
793 /* 3B WRITE BUFFER */
794 {ctl_write_buffer, CTL_SERIDX_MD_SEL, CTL_CMD_FLAG_OK_ON_BOTH |
795                                       CTL_CMD_FLAG_OK_ON_STOPPED |
796                                       CTL_CMD_FLAG_OK_ON_INOPERABLE |
797                                       CTL_CMD_FLAG_OK_ON_STANDBY |
798                                       CTL_FLAG_DATA_OUT,
799  CTL_LUN_PAT_NONE,
800  10, {0x1f, 0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07}},
801
802 /* 3C READ BUFFER */
803 {ctl_read_buffer, CTL_SERIDX_MD_SNS, CTL_CMD_FLAG_OK_ON_BOTH |
804                                      CTL_CMD_FLAG_OK_ON_STOPPED |
805                                      CTL_CMD_FLAG_OK_ON_INOPERABLE |
806                                      CTL_CMD_FLAG_OK_ON_STANDBY |
807                                      CTL_FLAG_DATA_IN |
808                                      CTL_CMD_FLAG_ALLOW_ON_PR_WRESV,
809  CTL_LUN_PAT_NONE,
810  10, {0x1f, 0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07}},
811
812 /* 3D UPDATE BLOCK */
813 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
814
815 /* 3E READ LONG */
816 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
817
818 /* 3F WRITE LONG */
819 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
820
821 /* 40 CHANGE DEFINITION */
822 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
823
824 /* 41 WRITE SAME(10) */
825 {ctl_write_same, CTL_SERIDX_WRITE, CTL_CMD_FLAG_OK_ON_SLUN |
826                                    CTL_FLAG_DATA_OUT,
827  CTL_LUN_PAT_WRITE | CTL_LUN_PAT_RANGE,
828  10, {0x1a, 0xff, 0xff, 0xff, 0xff, 0, 0xff, 0xff, 0x07}},
829
830 /* 42 READ SUB-CHANNEL / UNMAP */
831 {ctl_unmap, CTL_SERIDX_UNMAP, CTL_CMD_FLAG_OK_ON_SLUN | CTL_FLAG_DATA_OUT,
832  CTL_LUN_PAT_WRITE,
833  10, {1, 0, 0, 0, 0, 0, 0xff, 0xff, 0x07}},
834
835 /* 43 READ TOC/PMA/ATIP */
836 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
837
838 /* 44 REPORT DENSITY SUPPORT */
839 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
840
841 /* 45 PLAY AUDIO(10) */
842 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
843
844 /* 46 GET CONFIGURATION */
845 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
846
847 /* 47 PLAY AUDIO MSF */
848 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
849
850 /* 48 PLAY AUDIO TRACK INDEX */
851 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
852
853 /* 49 PLAY TRACK RELATIVE(10) */
854 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
855
856 /* 4A GET EVENT STATUS NOTIFICATION */
857 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
858
859 /* 4B PAUSE/RESUME */
860 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
861
862 /* 4C LOG SELECT */
863 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
864
865 /* 4D LOG SENSE */
866 {ctl_log_sense, CTL_SERIDX_LOG_SNS, CTL_CMD_FLAG_OK_ON_SLUN |
867                                     CTL_FLAG_DATA_IN |
868                                     CTL_CMD_FLAG_ALLOW_ON_PR_RESV,
869  CTL_LUN_PAT_NONE, 10, {0, 0xff, 0xff, 0, 0xff, 0xff, 0xff, 0xff, 0x07} },
870
871 /* 4E STOP PLAY/SCAN */
872 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
873
874 /* 4F */
875 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
876
877 /* 50 XDWRITE(10) */
878 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
879
880 /* 51 XPWRITE(10) */
881 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
882
883 /* 52 XDREAD(10) */
884 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
885
886 /* 53 RESERVE TRACK */
887 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
888
889 /* 54 SEND OPC INFORMATION */
890 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
891
892 /* 55 MODE SELECT(10) */
893 {ctl_mode_select, CTL_SERIDX_MD_SEL, CTL_CMD_FLAG_OK_ON_BOTH |
894                                      CTL_CMD_FLAG_OK_ON_STOPPED |
895                                      CTL_CMD_FLAG_OK_ON_INOPERABLE |
896                                      CTL_CMD_FLAG_OK_ON_STANDBY |
897                                      CTL_FLAG_DATA_OUT,
898  CTL_LUN_PAT_NONE, 10, {0x11, 0, 0, 0, 0, 0, 0xff, 0xff, 0x07} },
899
900 /* 56 RESERVE(10) */
901 {ctl_scsi_reserve, CTL_SERIDX_RES, CTL_CMD_FLAG_ALLOW_ON_RESV |
902                                     CTL_CMD_FLAG_OK_ON_BOTH |
903                                     CTL_CMD_FLAG_OK_ON_STOPPED |
904                                     CTL_CMD_FLAG_OK_ON_INOPERABLE |
905                                     CTL_CMD_FLAG_OK_ON_STANDBY |
906                                     CTL_FLAG_DATA_OUT,
907  CTL_LUN_PAT_NONE, 10, {0x02, 0, 0xff, 0, 0, 0, 0xff, 0xff, 0x07} },
908
909 /* 57 RELEASE(10) */
910 {ctl_scsi_release, CTL_SERIDX_RES, CTL_CMD_FLAG_ALLOW_ON_RESV |
911                                    CTL_CMD_FLAG_OK_ON_BOTH |
912                                    CTL_CMD_FLAG_OK_ON_STOPPED |
913                                    CTL_CMD_FLAG_OK_ON_INOPERABLE |
914                                    CTL_CMD_FLAG_OK_ON_STANDBY |
915                                    CTL_FLAG_DATA_OUT,
916  CTL_LUN_PAT_NONE, 10, {0x02, 0, 0xff, 0, 0, 0, 0xff, 0xff, 0x07} },
917
918 /* 58 REPAIR TRACK */
919 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
920
921 /* 59 READ MASTER CUE */
922 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
923
924 /* 5A MODE SENSE(10) */
925 {ctl_mode_sense, CTL_SERIDX_MD_SNS, CTL_CMD_FLAG_OK_ON_BOTH |
926                                     CTL_CMD_FLAG_OK_ON_STOPPED |
927                                     CTL_CMD_FLAG_OK_ON_INOPERABLE |
928                                     CTL_CMD_FLAG_OK_ON_STANDBY |
929                                     CTL_FLAG_DATA_IN |
930                                     CTL_CMD_FLAG_ALLOW_ON_PR_WRESV,
931  CTL_LUN_PAT_NONE, 10, {0x18, 0xff, 0xff, 0, 0, 0, 0xff, 0xff, 0x07} },
932
933 /* 5B CLOSE TRACK/SESSION */
934 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
935
936 /* 5C READ BUFFER CAPACITY */
937 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
938
939 /* 5D SEND CUE SHEET */
940 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
941
942 /* 5E PERSISTENT RESERVE IN */
943 {__DECONST(ctl_opfunc *, ctl_cmd_table_5e), CTL_SERIDX_INVLD, CTL_CMD_FLAG_SA5,
944  CTL_LUN_PAT_NONE},
945
946 /* 5F PERSISTENT RESERVE OUT */
947 {__DECONST(ctl_opfunc *, ctl_cmd_table_5f), CTL_SERIDX_INVLD, CTL_CMD_FLAG_SA5,
948  CTL_LUN_PAT_NONE},
949
950 /* 60 */
951 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
952
953 /* 61 */
954 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
955
956 /* 62 */
957 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
958
959 /* 63 */
960 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
961
962 /* 64 */
963 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
964
965 /* 65 */
966 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
967
968 /* 66 */
969 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
970
971 /* 67 */
972 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
973
974 /* 68 */
975 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
976
977 /* 69 */
978 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
979
980 /* 6A */
981 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
982
983 /* 6B */
984 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
985
986 /* 6C */
987 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
988
989 /* 6D */
990 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
991
992 /* 6E */
993 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
994
995 /* 6F */
996 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
997
998 /* 70 */
999 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
1000
1001 /* 71 */
1002 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
1003
1004 /* 72 */
1005 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
1006
1007 /* 73 */
1008 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
1009
1010 /* 74 */
1011 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
1012
1013 /* 75 */
1014 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
1015
1016 /* 76 */
1017 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
1018
1019 /* 77 */
1020 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
1021
1022 /* 78 */
1023 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
1024
1025 /* 79 */
1026 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
1027
1028 /* 7A */
1029 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
1030
1031 /* 7B */
1032 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
1033
1034 /* 7C */
1035 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
1036
1037 /* 7D */
1038 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
1039
1040 /* 7E */
1041 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
1042
1043 /* 7F */
1044 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
1045
1046 /* 80 XDWRITE EXTENDED(16) */
1047 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
1048
1049 /* 81 REBUILD(16) */
1050 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
1051
1052 /* 82 REGENERATE(16) */
1053 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
1054
1055 /* 83 EXTENDED COPY */
1056 {__DECONST(ctl_opfunc *, ctl_cmd_table_83), CTL_SERIDX_INVLD, CTL_CMD_FLAG_SA5,
1057  CTL_LUN_PAT_NONE},
1058
1059 /* 84 RECEIVE COPY RESULTS */
1060 {__DECONST(ctl_opfunc *, ctl_cmd_table_84), CTL_SERIDX_INVLD, CTL_CMD_FLAG_SA5,
1061  CTL_LUN_PAT_NONE},
1062
1063 /* 85 */
1064 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
1065
1066 /* 86 ACCESS CONTROL IN */
1067 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
1068
1069 /* 87 ACCESS CONTROL OUT */
1070 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
1071
1072 /* 88 READ(16) */
1073 {ctl_read_write, CTL_SERIDX_READ, CTL_CMD_FLAG_OK_ON_SLUN | CTL_FLAG_DATA_IN |
1074                                   CTL_CMD_FLAG_ALLOW_ON_PR_WRESV,
1075  CTL_LUN_PAT_READ | CTL_LUN_PAT_RANGE,
1076  16, {0x1a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1077       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0, 0x07}},
1078
1079 /* 89 COMPARE AND WRITE */
1080 {ctl_cnw, CTL_SERIDX_WRITE, CTL_CMD_FLAG_OK_ON_SLUN| CTL_FLAG_DATA_OUT,
1081  CTL_LUN_PAT_WRITE | CTL_LUN_PAT_RANGE,
1082  16, {0x18, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1083       0xff, 0xff, 0, 0, 0, 0xff, 0, 0x07}},
1084
1085 /* 8A WRITE(16) */
1086 {ctl_read_write, CTL_SERIDX_WRITE, CTL_CMD_FLAG_OK_ON_SLUN| CTL_FLAG_DATA_OUT,
1087  CTL_LUN_PAT_WRITE | CTL_LUN_PAT_RANGE,
1088  16, {0x1a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1089       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0, 0x07}},
1090
1091 /* 8B */
1092 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
1093
1094 /* 8C READ ATTRIBUTE */
1095 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
1096
1097 /* 8D WRITE ATTRIBUTE */
1098 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
1099
1100 /* 8E WRITE AND VERIFY(16) */
1101 {ctl_read_write, CTL_SERIDX_WRITE, CTL_CMD_FLAG_OK_ON_SLUN| CTL_FLAG_DATA_OUT,
1102  CTL_LUN_PAT_WRITE | CTL_LUN_PAT_RANGE,
1103  16, {0x12, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1104       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0, 0x07}},
1105
1106 /* 8F VERIFY(16) */
1107 {ctl_verify, CTL_SERIDX_READ, CTL_CMD_FLAG_OK_ON_SLUN |
1108                               CTL_FLAG_DATA_OUT |
1109                               CTL_CMD_FLAG_ALLOW_ON_PR_WRESV,
1110  CTL_LUN_PAT_READ | CTL_LUN_PAT_RANGE,
1111  16, {0x16, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1112       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0, 0x07}},
1113
1114 /* 90 PRE-FETCH(16) */
1115 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
1116
1117 /* 91 SYNCHRONIZE CACHE(16) */
1118 {ctl_sync_cache, CTL_SERIDX_SYNC, CTL_CMD_FLAG_OK_ON_SLUN |
1119                                   CTL_FLAG_DATA_NONE,
1120  CTL_LUN_PAT_NONE,
1121  16, {0x02, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1122       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0, 0x07}},
1123
1124 /* 92 LOCK UNLOCK CACHE(16) */
1125 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
1126
1127 /* 93 WRITE SAME(16) */
1128 {ctl_write_same, CTL_SERIDX_WRITE, CTL_CMD_FLAG_OK_ON_SLUN |
1129                                    CTL_FLAG_DATA_OUT,
1130  CTL_LUN_PAT_WRITE | CTL_LUN_PAT_RANGE,
1131  16, {0x1b, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1132       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0, 0x07}},
1133
1134 /* 94 */
1135 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
1136
1137 /* 95 */
1138 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
1139
1140 /* 96 */
1141 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
1142
1143 /* 97 */
1144 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
1145
1146 /* 98 */
1147 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
1148
1149 /* 99 */
1150 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
1151
1152 /* 9A */
1153 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
1154
1155 /* 9B */
1156 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
1157
1158 /* 9C WRITE ATOMIC (16) */
1159 {ctl_read_write, CTL_SERIDX_WRITE, CTL_CMD_FLAG_OK_ON_SLUN| CTL_FLAG_DATA_OUT,
1160  CTL_LUN_PAT_WRITE | CTL_LUN_PAT_RANGE,
1161  16, {0x18, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1162       0xff, 0xff, 0, 0, 0xff, 0xff, 0, 0x07}},
1163
1164 /* 9D */
1165 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
1166
1167 /* 9E SERVICE ACTION IN(16) */
1168 {__DECONST(ctl_opfunc *, ctl_cmd_table_9e), CTL_SERIDX_INVLD, CTL_CMD_FLAG_SA5,
1169  CTL_LUN_PAT_NONE},
1170
1171 /* 9F SERVICE ACTION OUT(16) */
1172 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
1173
1174 /* A0 REPORT LUNS */
1175 {ctl_report_luns, CTL_SERIDX_INQ, CTL_CMD_FLAG_OK_ON_ALL_LUNS |
1176                                   CTL_CMD_FLAG_ALLOW_ON_RESV |
1177                                   CTL_CMD_FLAG_NO_SENSE |
1178                                   CTL_CMD_FLAG_OK_ON_STOPPED |
1179                                   CTL_CMD_FLAG_OK_ON_INOPERABLE |
1180                                   CTL_CMD_FLAG_OK_ON_STANDBY |
1181                                   CTL_CMD_FLAG_OK_ON_UNAVAIL |
1182                                   CTL_FLAG_DATA_IN |
1183                                   CTL_CMD_FLAG_ALLOW_ON_PR_RESV,
1184  CTL_LUN_PAT_NONE,
1185  12, {0, 0xff, 0, 0, 0, 0xff, 0xff, 0xff, 0xff, 0, 0x07}},
1186
1187 /* A1 BLANK */
1188 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
1189
1190 /* A2 SEND EVENT */
1191 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
1192
1193 /* A3 MAINTENANCE IN */
1194 {__DECONST(ctl_opfunc *, ctl_cmd_table_a3), CTL_SERIDX_INVLD, CTL_CMD_FLAG_SA5,
1195  CTL_LUN_PAT_NONE},
1196
1197 /* A4 MAINTENANCE OUT */
1198 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
1199
1200 /* A5 MOVE MEDIUM */
1201 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
1202
1203 /* A6 EXCHANGE MEDIUM */
1204 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
1205
1206 /* A7 MOVE MEDIUM ATTACHED */
1207 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
1208
1209 /* A8 READ(12) */
1210 {ctl_read_write, CTL_SERIDX_READ, CTL_CMD_FLAG_OK_ON_SLUN | CTL_FLAG_DATA_IN |
1211                                   CTL_CMD_FLAG_ALLOW_ON_PR_WRESV,
1212  CTL_LUN_PAT_READ | CTL_LUN_PAT_RANGE,
1213  12, {0x1a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0, 0x07}},
1214
1215 /* A9 PLAY TRACK RELATIVE(12) */
1216 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
1217
1218 /* AA WRITE(12) */
1219 {ctl_read_write, CTL_SERIDX_WRITE, CTL_CMD_FLAG_OK_ON_SLUN| CTL_FLAG_DATA_OUT,
1220  CTL_LUN_PAT_WRITE | CTL_LUN_PAT_RANGE,
1221  12, {0x1a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0, 0x07}},
1222
1223 /* AB SERVICE ACTION IN(12) */
1224 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
1225
1226 /* AC ERASE(12) */
1227 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
1228
1229 /* AD READ DVD STRUCTURE */
1230 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
1231
1232 /* AE WRITE AND VERIFY(12) */
1233 {ctl_read_write, CTL_SERIDX_WRITE, CTL_CMD_FLAG_OK_ON_SLUN| CTL_FLAG_DATA_OUT,
1234  CTL_LUN_PAT_WRITE | CTL_LUN_PAT_RANGE,
1235  12, {0x12, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0, 0x07}},
1236
1237 /* AF VERIFY(12) */
1238 {ctl_verify, CTL_SERIDX_READ, CTL_CMD_FLAG_OK_ON_SLUN |
1239                               CTL_FLAG_DATA_OUT |
1240                               CTL_CMD_FLAG_ALLOW_ON_PR_WRESV,
1241  CTL_LUN_PAT_READ | CTL_LUN_PAT_RANGE,
1242  12, {0x16, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0, 0x07}},
1243
1244 /* B0 SEARCH DATA HIGH(12) */
1245 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
1246
1247 /* B1 SEARCH DATA EQUAL(12) */
1248 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
1249
1250 /* B2 SEARCH DATA LOW(12) */
1251 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
1252
1253 /* B3 SET LIMITS(12) */
1254 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
1255
1256 /* B4 READ ELEMENT STATUS ATTACHED */
1257 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
1258
1259 /* B5 REQUEST VOLUME ELEMENT ADDRESS */
1260 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
1261
1262 /* B6 SEND VOLUME TAG */
1263 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
1264
1265 /* B7 READ DEFECT DATA(12) */
1266 {ctl_read_defect, CTL_SERIDX_MD_SNS, CTL_CMD_FLAG_OK_ON_SLUN |
1267                                      CTL_FLAG_DATA_IN |
1268                                      CTL_CMD_FLAG_ALLOW_ON_PR_WRESV,
1269  CTL_LUN_PAT_NONE,
1270  12, {0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0, 0x07}},
1271
1272 /* B8 READ ELEMENT STATUS */
1273 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
1274
1275 /* B9 READ CD MSF */
1276 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
1277
1278 /* BA REDUNDANCY GROUP IN */
1279 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
1280
1281 /* BB REDUNDANCY GROUP OUT */
1282 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
1283
1284 /* BC SPARE IN */
1285 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
1286
1287 /* BD SPARE OUT */
1288 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
1289
1290 /* BE VOLUME SET IN */
1291 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
1292
1293 /* BF VOLUME SET OUT */
1294 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
1295
1296 /* C0 */
1297 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
1298
1299 /* C1 */
1300 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
1301
1302 /* C2 */
1303 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
1304
1305 /* C3 */
1306 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
1307
1308 /* C4 */
1309 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
1310
1311 /* C5 */
1312 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
1313
1314 /* C6 */
1315 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
1316
1317 /* C7 */
1318 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
1319
1320 /* C8 */
1321 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
1322
1323 /* C9 */
1324 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
1325
1326 /* CA */
1327 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
1328
1329 /* CB */
1330 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
1331
1332 /* CC */
1333 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
1334
1335 /* CD */
1336 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
1337
1338 /* CE */
1339 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
1340
1341 /* CF */
1342 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
1343
1344 /* D0 */
1345 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
1346
1347 /* D1 */
1348 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
1349
1350 /* D2 */
1351 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
1352
1353 /* D3 */
1354 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
1355
1356 /* D4 */
1357 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
1358
1359 /* D5 */
1360 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
1361
1362 /* D6 */
1363 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
1364
1365 /* D7 */
1366 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
1367
1368 /* D8 */
1369 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
1370
1371 /* D9 */
1372 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
1373
1374 /* DA */
1375 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
1376
1377 /* DB */
1378 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
1379
1380 /* DC */
1381 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
1382
1383 /* DD */
1384 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
1385
1386 /* DE */
1387 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
1388
1389 /* DF */
1390 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
1391
1392 /* E0 */
1393 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
1394
1395 /* E1 */
1396 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
1397
1398 /* E2 */
1399 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
1400
1401 /* E3 */
1402 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
1403
1404 /* E4 */
1405 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
1406
1407 /* E5 */
1408 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
1409
1410 /* E6 */
1411 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
1412
1413 /* E7 */
1414 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
1415
1416 /* E8 */
1417 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
1418
1419 /* E9 */
1420 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
1421
1422 /* EA */
1423 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
1424
1425 /* EB */
1426 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
1427
1428 /* EC */
1429 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
1430
1431 /* ED */
1432 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
1433
1434 /* EE */
1435 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
1436
1437 /* EF */
1438 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
1439
1440 /* F0 */
1441 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
1442
1443 /* F1 */
1444 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
1445
1446 /* F2 */
1447 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
1448
1449 /* F3 */
1450 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
1451
1452 /* F4 */
1453 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
1454
1455 /* F5 */
1456 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
1457
1458 /* F6 */
1459 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
1460
1461 /* F7 */
1462 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
1463
1464 /* F8 */
1465 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
1466
1467 /* F9 */
1468 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
1469
1470 /* FA */
1471 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
1472
1473 /* FB */
1474 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
1475
1476 /* FC */
1477 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
1478
1479 /* FD */
1480 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
1481
1482 /* FE */
1483 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE},
1484
1485 /* FF */
1486 {NULL, CTL_SERIDX_INVLD, CTL_CMD_FLAG_NONE, CTL_LUN_PAT_NONE}
1487
1488 };