]> git.proxmox.com Git - mirror_smartmontools-debian.git/blame - os_qnxnto.h
Imported Upstream version 6.1+svn3812
[mirror_smartmontools-debian.git] / os_qnxnto.h
CommitLineData
a23d5117
GI
1/*
2 * os_generic.h
3 *
4 * Home page of code is: http://smartmontools.sourceforge.net
5 *
6 * Copyright (C) Joerg Hering <smartmontools-support@lists.sourceforge.net>
7 * Copyright (C) 2003-8 Bruce Allen <smartmontools-support@lists.sourceforge.net>
8 *
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2, or (at your option)
12 * any later version.
13 *
14 * You should have received a copy of the GNU General Public License
ee38a438
GI
15 * (for example COPYING); if not, write to the Free Software Foundation,
16 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
a23d5117
GI
17 *
18 * This code was originally developed as a Senior Thesis by Michael Cornwell
19 * at the Concurrent Systems Laboratory (now part of the Storage Systems
20 * Research Center), Jack Baskin School of Engineering, University of
21 * California, Santa Cruz. http://ssrc.soe.ucsc.edu/
22 *
23 */
24#ifndef OS_QNXNTO_H_
25#define OS_QNXNTO_H_
ee38a438 26#define OS_QNXNTO_H_CVSID "$Id: os_qnxnto.h 3728 2012-12-13 17:57:50Z chrfranke $\n"
a23d5117
GI
27
28// Additional material should start here. Note: to keep the '-V' CVS
29// reporting option working as intended, you should only #include
30// system include files <something.h>. Local #include files
31// <"something.h"> should be #included in os_generic.c
32#include <sys/cpt.h>
33
34#ifndef __TYPES_H_INCLUDED
35#include <sys/types.h>
36#endif
37
38#include <stdio.h>
39#include <fcntl.h>
40#include <gulliver.h>
41#include <sys/cpt.h>
42#include <sys/dcmd_cam.h>
43#include <sys/cam_device.h>
44#include "atacmds.h"
45
46//----------------------------------------------------------------------------------------------------------
47typedef struct _ata_pass_thru ATA_PASS_THRU;
48typedef struct _eide_identify EIDE_IDENTIFY;
49typedef struct _ata_sense ATA_SENSE;
50
51typedef void CCB;
52struct _sim_hba;
53struct _resmgr_context;
54
55
56typedef struct _drive_attribute
57 {
58 int id;
59 int threshold;
60 char *name;
61 }DRIVE_ATTRIBUTE;
62
63//----------------------------------------------------------------------------------------------------------
64/* UNIVOS OSD defines and data structures. */
65
66#define INQLEN 36 /* Inquiry string length to store. */
67
68#define CAM_SUCCESS 0 /* For signaling general success */
69#define CAM_FAILURE 1 /* For signaling general failure */
70
71#define CAM_FALSE 0 /* General purpose flag value */
72#define CAM_TRUE 1 /* General purpose flag value */
73
74//----------------------------------------------------------------------------------------------------------
75// Group 3 and 4, command codes 60H-9FH are reserved
76#define SC_ATA_PT16 0x85 // ATA Pass-through
77//----------------------------------------------------------------------------------------------------------
78#define ATA_SMART_LBA_MID_SIG 0x4f
79#define ATA_SMART_LBA_HI_SIG 0xc2
80#define ATA_SMART_SIG 0xc24f
81//----------------------------------------------------------------------------------------------------------
82 struct _ata_pass_thru {
83 uchar_t opcode;
84#define ATA_PROTO_MSK 0x1e
85#define ATA_PROTO_RESPONSE (15 << 1)
86#define ATA_PROTO_FPDMA (12 << 1)
87#define ATA_PROTO_UDMA_DATA_OUT (11 << 1)
88#define ATA_PROTO_UDMA_DATA_IN (10 << 1)
89#define ATA_PROTO_DEVICE_RESET (9 << 1)
90#define ATA_PROTO_DEVICE_DIAGNOSTIC (8 << 1)
91#define ATA_PROTO_DMA_QUEUED (7 << 1)
92#define ATA_PROTO_DMA (6 << 1)
93#define ATA_PROTO_PIO_DATA_OUT (5 << 1)
94#define ATA_PROTO_PIO_DATA_IN (4 << 1)
95#define ATA_PROTO_DATA_NONE (3 << 1)
96#define ATA_PROTO_SRST (1 << 1)
97#define ATA_PROTO_HRST (0 << 1)
98#define ATA_PROTO_EXTEND 0x01
99 uchar_t protocol; // multiple count, protocol
100#define ATA_MCOUNT_MSK 0xe0
101
102#define ATA_FLG_CK_COND 0x20
103#define ATA_FLG_T_DIR 0x08 // data from device
104#define ATA_FLG_BYT_BLOK 0x04
105#define ATA_FLG_TLEN_STPSIU 0x03
106#define ATA_FLG_TLEN_SECTOR_COUNT 0x02
107#define ATA_FLG_TLEN_FEATURE 0x01
108 uchar_t flags;
109
110 uchar_t efeatures;
111 uchar_t features;
112 uchar_t esector_count;
113 uchar_t sector_count;
114 uchar_t elba_low;
115 uchar_t lba_low;
116 uchar_t elba_mid;
117 uchar_t lba_mid;
118 uchar_t elba_high;
119 uchar_t lba_high;
120 uchar_t device;
121 uchar_t command;
122 uchar_t control;
123 } ata_pass_thru_;
124//----------------------------------------------------------------------------------------------------------
125#define SENSE_DATA_FMT_DESCRIPTOR 0x02
126
127// Fixed Format Sense Data Structure
128// Note: The field "error" has the following format:
129// bit 7 - Address valid bit
130// bits 6-4 - Error class
131// bits 3-0 - Error code
132//
133// Error classes 0-6 are vendor unique and also indicate that the
134// sense data is in _nonextended_ format. (i.e. not usually used)
135// struct _scsi_nonextended_sense {
136// uchar_t sd_err;
137// ulong_t sd_block_address;
138// };
139//
140// An error class of 7 and an error code of 0 (70H) indicate SCSI-1
141// extended sense data format (or SCSI-2 sense data format).
142//
143// An error class of 7 and an error code of 1 (71H) indicate SCSI-2
144// deferred errors.
145//
146// Error codes 74H to 7EH are reserved and error code 7FH indicates
147// a vendor-specific sense data format.
148typedef struct _scsi_sense {
149 uchar_t error; // Error Code
150 uchar_t segment; // Segment number
151 uchar_t sense; // Sense key/flags
152 uchar_t info[4]; // Information (32bit big-endian value)
153 uchar_t asl; // Additional Sense Length
154 uchar_t csinfo[4]; // Command-Specific Information
155 uchar_t asc; // Additional Sense Code
156 uchar_t ascq; // Additional Sense Code Qualifier
157 uchar_t fruc; // Field Replaceable Unit Code
158 uchar_t sks; // Sense Key Specific
159 ushort_t sks_data; // Sense Key Specific Data (16bit big-endian)
160 ushort_t asb; // Additional Sense uchar_ts (Max 256-18)
161} SCSI_SENSE;
162
163// Descriptor Format Sense Data Structure
164// error code of 72 current, 73 deferred
165// extended sense data format (or SCSI-2 sense data format).
166typedef struct _scsi_sense_descriptor {
167 uchar_t error; // Error Code
168 uchar_t sense; // Sense key/flags
169 uchar_t asc; // Additional Sense Code
170 uchar_t ascq; // Additional Sense Code Qualifier
171 uchar_t rsvd[3];
172 uchar_t asl; // Additional Sense Length
173} SCSI_SENSE_DESCRIPTOR;
174
175typedef struct _scsi_sense_desriptor_header {
176 uchar_t descriptor_type;
177 uchar_t descriptor_len;
178} SCSI_SENSE_DESCRIPTOR_HEADER;
179
180#define SENSE_DTYPE_INFORMATION 0x00
181#define SENSE_DTYPE_CSI 0x01 // Command Specific Information
182#define SENSE_DTYPE_SKS 0x02 // Sense Key Specific
183#define SENSE_DTYPE_FRU 0x03 // Field Replaceable Unit
184#define SENSE_DTYPE_STREAM 0x04
185#define SENSE_DTYPE_BLOCK 0x05
186#define SENSE_DTYPE_OSD_OBJ_IDENT 0x06 // OSD Object Identification
187#define SENSE_DTYPE_OSD_INTEGRITY 0x07 // OSD Response Integrity Check Value
188#define SENSE_DTYPE_OSD_ATR_IDENT 0x08 // OSD Attribute Identification
189#define SENSE_DTYPE_ATA 0x09
190
191typedef struct _ata_status_descriptor {
192 uchar_t descriptor_type;
193#define ATA_SD_DLEN 0x0c
194 uchar_t descriptor_len; /* 0xc */
195#define ATA_SD_FLG_EXTEND 0x01
196 uchar_t flags;
197 uchar_t error;
198 uchar_t esector_count; /* (15:8) */
199 uchar_t sector_count; /* (7:0) */
200 uchar_t elba_low; /* (15:8) */
201 uchar_t lba_low; /* (7:0) */
202 uchar_t elba_mid; /* (15:8) */
203 uchar_t lba_mid; /* (7:0) */
204 uchar_t elba_high; /* (15:8) */
205 uchar_t lba_high; /* (7:0) */
206 uchar_t device;
207 uchar_t status;
208} ATA_STATUS_DESCRIPTOR;
209
210//----------------------------------------------------------------------------------------------------------
211// Sense Keys
212#define SK_MSK 0x0F // mask to sd_sense field for key
213
214#define SK_NO_SENSE 0 // No sense data (no error)
215 #define ASCQ_FILEMARK_DETECTED 0x01
216 #define ASCQ_EOPM_DETECTED 0x02 // End of Partition/Medium Detected
217 #define ASCQ_SETMARK_DETECTED 0x03
218 #define ASCQ_BOPM_DETECTED 0x04 // Beginning of Partition/Medium Detected
219
220#define SK_RECOVERED 1 // Recovered error
221 #define ASC_ATA_PASS_THRU 0x00
222 #define ASCQ_ATA_PASS_THRU_INFO_AVAIL 0x1d
223
224#define SK_NOT_RDY 2 // Device not ready
225 #define ASC_NO_SEEK_COMPLETE 0x02
226 #define ASC_NOT_READY 0x04
227 #define ASCQ_CAUSE_NOT_REPORTABLE 0x00
228 #define ASCQ_BECOMING_READY 0x01
229 #define ASCQ_INIT_COMMAND_REQUIRED 0x02
230 #define ASCQ_MANUAL_INTERVENTION_REQUIRED 0x03
231 #define ASCQ_FORMAT_IN_PROGRESS 0x04
232 #define ASCQ_UNKNOWN_CHANGED 0xff // NTO extension for fdc's
233 #define ASC_MEDIA_FORMAT 0x30 // bad format
234 #define ASC_MEDIA_NOT_PRESENT 0x3a
235 #define ASC_NOT_CONFIGURED 0x3e
236
237#define SK_MEDIUM 3 // Medium error
238 #define ASC_UNRECOVERABLE_READ_ERROR 0x11
239 #define ASC_RECORD_NOT_FOUND 0x14
240 #define ASCQ_RECORD_NOT_FOUND 0x01
241 #define ASC_UNABLE_TO_RECOVER_TOC 0x57
242 #define ASC_INCOMPATIBLE_MEDIUM 0x64
243
244#define SK_HARDWARE 4 // Hardware error
245 #define ASC_INTERNAL_TARGET_FAILURE 0x44
246 #define ASC_MEDIA_LOAD_EJECT_FAILURE 0x53
247 #define ASCQ_UNRECOVERABLE_CIRC 0x06
248
249#define SK_ILLEGAL 5 // Illegal Request (bad command)
250 #define ASC_INVALID_COMMAND 0x20
251 #define ASC_INVALID_FIELD 0x24
252 #define ASC_INVALID_FIELD_PARAMETER 0x26
253 #define ASC_COMMAND_SEQUENCE_ERROR 0x2c
254 #define ASCQ_READ_SCRAMBLED 0x03
255 #define ASC_ILLEGAL_MODE 0x64
256 #define ASC_COPY_PROTECTION 0x6f
257
258#define SK_UNIT_ATN 6 // Unit Attention
259 #define ASC_MEDIUM_CHANGED 0x28
260 #define ASC_BUS_RESET 0x29
261 #define ASC_INSUFFICIENT_TIME_FOR_OPERATION 0x2e
262 #define ASC_OPERATOR_REQUEST 0x5a
263 #define ASCQ_OPERATOR_MEDIUM_REMOVAL 0x01
264
265#define SK_DATA_PROT 7 // Data Protect
266 #define ASC_WRITE_PROTECTED 0x27
267
268#define SK_BLNK_CHK 8 // Blank Check
269#define SK_VENDOR 9 // Vendor Specific
270#define SK_CPY_ABORT 10 // Copy Aborted
271#define SK_CMD_ABORT 11 // Aborted Command
272#define SK_EQUAL 12 // Equal
273#define SK_VOL_OFL 13 // Volume Overflow
274#define SK_MISCMP 14 // Miscompare
275#define SK_RESERVED 15 // Reserved
276//----------------------------------------------------------------------------------------------------------
277// Command Descriptor Block structure definitions
278
279// CDB Flags
280#define CF_LINK 0x01 // Linked-command indication
281#define CF_FLAG 0x02 // Linked-command with flag bit
282#define CF_VENDOR0 0x40 // Vendor unique bits
283#define CF_VENDOR1 0x80
284
285#define CF_FUA 0x08
286#define CF_DPO 0x10
287
288typedef union _cdb {
289 // generic 6 byte command descriptor block
290 struct {
291 uchar_t opcode;
292 uchar_t lun_opt;
293 uchar_t lba_byte1;
294 uchar_t lba_byte0; // LSB
295 uchar_t transfer_len;
296 uchar_t control;
297 } gen6;
298
299 // generic 10 byte command descriptor block
300 struct {
301 uchar_t opcode;
302 uchar_t lun_opt;
303 uchar_t lba_byte3;
304 uchar_t lba_byte4;
305 uchar_t lba_byte1;
306 uchar_t lba_byte0;
307 uchar_t rsvd;
308 uchar_t transfer_len[2];
309 uchar_t control;
310 } gen10;
311
312 // generic 12 byte command descriptor block
313 struct {
314 uchar_t opcode;
315 uchar_t lun_opt;
316 uchar_t lba_byte3;
317 uchar_t lba_byte4;
318 uchar_t lba_byte1;
319 uchar_t lba_byte0;
320 uchar_t transfer_len[4];
321 uchar_t rsvd10;
322 uchar_t control;
323 } gen12;
324
325 struct _format_unit {
326 uchar_t op_code;
327#define FU_RSVD0 0xc0 // reserved bits
328#define FU_FMTDAT 0x10
329#define FU_CMPLIST 0x08
330 uchar_t defect_list_fmt;
331 uchar_t track_num;
332 ushort_t interleave;
333 uchar_t rsvd1[7];
334 } format_unit;
335
336 struct _format_unit_old {
337 uchar_t op_code;
338 uchar_t rsvd0;
339 uchar_t medium_type_code;
340 uchar_t rsvd1;
341 uchar_t interleave;
342 uchar_t rsvd2;
343#define FMT_RSVD3 0x80
344#define FMT_SECT_SIZE_CD 0x70
345#define FMT_IMMED 0x08
346#define FMT_HEAD 0x04
347#define FMT_ST 0x02
348#define FMT_CERT 0x01
349 uchar_t cert;
350 uchar_t track_addr;
351 uchar_t rsvd4[4];
352 } format_unit_old;
353
354#define RW_OPT_RELADR 0x01
355#define RW_OPT_CORRCT 0x02 // Disable Corrections
356#define RW_OPT_FUA 0x08 // Force Unit Access
357#define RW_OPT_DPO 0x10 // Disable Page Out
358 struct {
359 uchar_t opcode;
360 uchar_t lun_lba;
361 uchar_t lba[2];
362 uchar_t transfer_len;
363 uchar_t control;
364 } read_write6;
365
366 struct {
367 uchar_t opcode;
368 uchar_t lun_opt;
369 uchar_t lba[4];
370 uchar_t rsvd2;
371 uchar_t transfer_len[2];
372 uchar_t control;
373 } read_write10;
374
375 struct {
376 uchar_t opcode;
377 uchar_t lun_opt;
378 uchar_t lba[4];
379 uchar_t transfer_len[4];
380 uchar_t rsvd2;
381 uchar_t control;
382 } read_write12;
383
384#define MSEL_OPT_PF 0x10 // Page Format
385#define MSEL_OPT_SP 0x01 // Save Page
386 struct {
387 uchar_t opcode;
388 uchar_t lun_opt;
389 uchar_t rsvd2;
390 uchar_t rsvd3;
391 uchar_t param_length;
392 uchar_t control;
393 } mode_select;
394
395 struct {
396 uchar_t opcode;
397 uchar_t lun_opt;
398 uchar_t rsvd2;
399 uchar_t rsvd3;
400 uchar_t rsvd4;
401 uchar_t rsvd5;
402 uchar_t rsvd6;
403 uchar_t param_length[2];
404 uchar_t control;
405 } mode_select10;
406
407 struct {
408 uchar_t opcode;
409#define LS_OPT_SP 0x01 // Save Parameters
410#define LS_OPT_PCR 0x02 // Parameter Code Reset
411 uchar_t lun_opt;
412#define LS_PC_CUR_THRESHOLD 0x00
413#define LS_PC_CUR_CUMULATIVE 0x01
414#define LS_PC_DFLT_THRESHOLD 0x02
415#define LS_PC_DFLT_CUMULATIVE 0x03
416 uchar_t pc; // Page Control
417 uchar_t rsvd3;
418 uchar_t rsvd4;
419 uchar_t rsvd5;
420 uchar_t rsvd6;
421 uchar_t param_length[2];
422 uchar_t control;
423 } log_select;
424
425 struct {
426 uchar_t opcode;
427#define MSNS_OPT_DBD 0x08 // Disable Block Descriptors
428 uchar_t lun_opt;
429#define PC_CURRENT 0x00
430#define PC_CHANGEABLE 0x40
431#define PC_DEFAULT 0x80
432#define PC_SAVED 0xC0
433#define PC_MSK 0xC0
434 uchar_t pc_page;
435 uchar_t subpage;
436 uchar_t allocation_length;
437 uchar_t control;
438 } mode_sense;
439
440 struct _mode_sense10 {
441 uchar_t opcode;
442 uchar_t lun_opt;
443 uchar_t pc_page;
444 uchar_t subpage;
445 uchar_t rsvd4;
446 uchar_t rsvd5;
447 uchar_t rsvd6;
448 uchar_t allocation_length[2];
449 uchar_t control;
450 } mode_sense10;
451
452 struct {
453 uchar_t opcode;
454 uchar_t lun_opt;
455 uchar_t pc_page;
456 uchar_t rsvd3;
457 uchar_t rsvd4;
458 uchar_t parameter_pointer[2];
459 uchar_t allocation_length[2];
460 uchar_t control;
461 } log_sense;
462
463 struct {
464 uchar_t opcode;
465 uchar_t lun_opt;
466 uchar_t rsvd2;
467 uchar_t rsvd3;
468 uchar_t prevent;
469 uchar_t control;
470 } removal;
471
472 struct {
473 uchar_t opcode;
474#define LD_OPT_IMMED 0x01
475 uchar_t lun_opt;
476 uchar_t rsvd2;
477 uchar_t rsvd3;
478#define LD_CMD_START 0x01
479#define LD_CMD_LOEJ 0x02
480#define LD_CMD_STOP 0x00
481#define LD_CMD_EJECT 0x02
482#define LD_CMD_LOAD 0x03
483
484// Sequential-Access
485#define LD_CMD_SA_HOLD 0x08
486#define LD_CMD_SA_EOT 0x04
487#define LD_CMD_SA_RT 0x02 // re-tension
488#define LD_CMD_SA_LOEJ 0x01
489
490// Block
491#define LD_CMD_PC_MSK 0xf0
492#define LD_CMD_PC_NC 0
493#define LD_CMD_PC_ACTIVE 1
494#define LD_CMD_PC_IDLE 2
495#define LD_CMD_PC_STANDBY 3
496#define LD_CMD_PC_SLEEP 5
497
498 uchar_t cmd;
499 uchar_t control;
500 } load;
501
502 struct {
503 uchar_t opcode;
504 uchar_t lun_opt;
505#define SC_OPT_RELADR 0x01
506#define SC_OPT_IMMED 0x02
507 uchar_t lba[4];
508 uchar_t num_blocks[2];
509 uchar_t control;
510 } synchronize_cache;
511
512// cdrom commands
513 struct {
514 uchar_t opcode;
515 uchar_t rsvd1;
516 uchar_t rsvd2;
517 uchar_t rsvd3;
518 uchar_t rsvd4;
519 uchar_t rsvd5;
520 uchar_t rsvd6;
521 uchar_t allocation_length[2];
522 uchar_t control;
523 } read_disc_information;
524
525 struct {
526 uchar_t opcode;
527 uchar_t lun_opt;
528 uchar_t rsvd2;
529 uchar_t rsvd3;
530 uchar_t rsvd4;
531 uchar_t rsvd5;
532 uchar_t rsvd6;
533 uchar_t rsvd7;
534 uchar_t resume;
535 uchar_t control;
536 } pause_resume;
537
538 struct {
539 uchar_t opcode;
540 uchar_t lun_opt;
541 uchar_t rsvd2;
542 uchar_t start_minute;
543 uchar_t start_second;
544 uchar_t start_frame;
545 uchar_t end_minute;
546 uchar_t end_second;
547 uchar_t end_frame;
548 uchar_t control;
549 } play_audio_msf;
550
551 struct {
552 uchar_t opcode;
553 uchar_t lun_opt;
554 uchar_t rsvd2;
555 uchar_t rsvd3;
556 uchar_t start_track;
557 uchar_t start_index;
558 uchar_t rsvd6;
559 uchar_t end_track;
560 uchar_t end_index;
561 uchar_t control;
562 } play_audio_ti;
563
564 struct {
565 uchar_t opcode;
566#define CD_SCAN_DIR_FORWARD 0x00
567#define CD_SCAN_DIR_REVERSE 0x10
568 uchar_t opt;
569 uchar_t start_address[4];
570#define CD_SCAN_TYPE_LBA 0x00
571#define CD_SCAN_TYPE_MSF 0x40
572#define CD_SCAN_TYPE_TRK 0x80
573#define CD_SCAN_TYPE_MSK 0xc0
574 uchar_t rsvd6;
575 uchar_t rsvd7;
576 uchar_t rsvd8;
577 uchar_t type;
578 uchar_t rsvd10;
579 uchar_t rsvd11;
580 } cd_scan;
581
582 struct {
583 uchar_t opcode;
584#define RTOC_OPT_MSF 0x02
585 uchar_t lun_opt;
586#define RTOC_FMT_TOC 0x0
587#define RTOC_FMT_SESSION 0x1
588#define RTOC_FMT_QSUBCODE 0x2
589#define RTOC_FMT_QSUBCHNL 0x3
590#define RTOC_FMT_ATIP 0x4
591#define RTOC_FMT_CDTEXT 0x5
592 uchar_t format;
593 uchar_t rsvd3;
594 uchar_t rsvd4;
595 uchar_t rsvd5;
596 uchar_t start_track;
597 uchar_t allocation_length[2];
598#define RTOC_CNTL_FMT_SESSION 0x40
599 uchar_t control_format;
600 } read_toc;
601
602 struct {
603 uchar_t opcode;
604 uchar_t lun_opt;
605 uchar_t rsvd2[6];
606 uchar_t allocation_length[2];
607 uchar_t rsvd3[2];
608 } mechanism_status;
609
610 struct {
611 uchar_t opcode;
612#define EXCHANGE_OPT_IMMED 0x01
613 uchar_t lun_opt;
614 uchar_t rsvd2;
615 uchar_t rsvd3;
616#define EXCHANGE_CMD_START 0x01
617#define EXCHANGE_CMD_LOEJ 0x02
618 uchar_t cmd;
619 uchar_t rsvd5;
620 uchar_t rsvd6;
621 uchar_t rsvd7;
622 uchar_t slot;
623 uchar_t rsvd9;
624 uchar_t rsvd10;
625 uchar_t rsvd11;
626 } exchange;
627
628 struct {
629 uchar_t opcode;
630 uchar_t rt;
631 uchar_t feature_number[2];
632 uchar_t rsvd4;
633 uchar_t rsvd5;
634 uchar_t rsvd6;
635 uchar_t allocation_length[2];
636 uchar_t control;
637 } get_configuration;
638
639 struct {
640 uchar_t opcode;
641#define GE_OPT_POLLED 0x01
642 uchar_t opt;
643 uchar_t rsvd2;
644 uchar_t rsvd3;
645#define NCR_OPERATIONAL_CHANGE 0x02
646#define NCR_POWER_MANAGEMENT 0x04
647#define NCR_EXTERNAL_REQUEST 0x08
648#define NCR_MEDIA 0x10
649#define NCR_MULTI_INITIATOR 0x20
650#define NCR_DEVICE_BUSY 0x40
651 uchar_t ncr; // notification class request
652 uchar_t rsvd5;
653 uchar_t rsvd6;
654 uchar_t allocation_length[2];
655 uchar_t control;
656 } get_event;
657
658 struct {
659 uchar_t opcode;
660 uchar_t lun_opt;
661 uchar_t rsvd2;
662 uchar_t rsvd3;
663 uchar_t rsvd4;
664 uchar_t rsvd5;
665 uchar_t rsvd6;
666 uchar_t allocation_length[2];
667 uchar_t control;
668 } read_formated_capacities;
669
670 struct {
671 uchar_t opcode;
672 uchar_t lun_opt;
673 uchar_t read_speed[2];
674 uchar_t write_speed[2];
675 uchar_t rsvd2[6];
676 } cd_speed;
677
678 struct {
679 uchar_t opcode;
680#define RSCHNL_OPT_MSF 0x02
681 uchar_t lun_opt;
682#define RSCHNL_DATA_SUBQ 0x40
683 uchar_t data;
684 uchar_t data_format;
685 uchar_t rsvd4;
686 uchar_t rsvd5;
687 uchar_t track;
688 uchar_t allocation_length[2];
689 uchar_t control;
690 } read_subchannel;
691
692#define CD_FRAME_SYNC_SIZE 12
693#define CD_FRAME_HDR_SIZE 4
694#define CD_FRAME_SUB_HDR_SIZE 8
695#define CD_FRAME_EDC_SIZE 4
696#define CD_FRAME_ECC_SIZE 276
697#define CD_FRAME_AUX_SIZE 8
698#define CD_FRAME_ZERO_SIZE 8
699#define CD_FRAME_SPARE_SIZE 4
700#define CD_FRAME_C2_ERR_SIZE 294
701#define CD_FRAME_BLOCK_ERR_SIZE 2
702
703 struct {
704 uchar_t opcode;
705 uchar_t lun_stype;
706// expected sector type
707#define RDCD_EST_ANY_SECTOR (0 << 2)
708#define RDCD_EST_CDDA_SECTOR (1 << 2)
709#define RDCD_EST_YELLOW_MODE1_SECTOR (2 << 2)
710#define RDCD_EST_YELLOW_MODE2_SECTOR (3 << 2)
711#define RDCD_EST_XA_SECTOR (4 << 2)
712#define RDCD_EST_XA_FORM2_SECTOR (5 << 2)
713#define RDCD_EST_MSK (7 << 2)
714 uchar_t lba[4];
715 uchar_t transfer_len[3];
716 uchar_t flags;
717#define RDCD_FLG_SYNC 0x80
718#define RDCD_FLG_UDATA 0x10
719#define RDCD_FLG_ECC 0x08
720#define RDCD_FLG_CD_ERR 0x02
721#define RDCD_FLG_CD_BLOCK_ERR 0x04
722#define RDCD_FLG_HC_NONE ( 0x00 << 5 )
723#define RDCD_FLG_HC_HDR ( 0x01 << 5 )
724#define RDCD_FLG_HC_SUBHEADER ( 0x02 << 5 )
725#define RDCD_FLG_HC_ALL_HEADERS ( 0x03 << 5 )
726 uchar_t subch_selection;
727 uchar_t rsvd3;
728 } read_cd;
729
730 struct {
731 uchar_t opcode;
732 uchar_t lun_stype;
733 uchar_t rsvd2;
734 uchar_t start_minute;
735 uchar_t start_second;
736 uchar_t start_frame;
737 uchar_t end_minute;
738 uchar_t end_second;
739 uchar_t end_frame;
740 uchar_t flags;
741 uchar_t subch_selection;
742 uchar_t rsvd11;
743 } read_cd_msf;
744
745 struct _ata_pass_thru {
746 uchar_t opcode;
747#define ATA_PROTO_MSK 0x1e
748#define ATA_PROTO_RESPONSE (15 << 1)
749#define ATA_PROTO_FPDMA (12 << 1)
750#define ATA_PROTO_UDMA_DATA_OUT (11 << 1)
751#define ATA_PROTO_UDMA_DATA_IN (10 << 1)
752#define ATA_PROTO_DEVICE_RESET (9 << 1)
753#define ATA_PROTO_DEVICE_DIAGNOSTIC (8 << 1)
754#define ATA_PROTO_DMA_QUEUED (7 << 1)
755#define ATA_PROTO_DMA (6 << 1)
756#define ATA_PROTO_PIO_DATA_OUT (5 << 1)
757#define ATA_PROTO_PIO_DATA_IN (4 << 1)
758#define ATA_PROTO_DATA_NONE (3 << 1)
759#define ATA_PROTO_SRST (1 << 1)
760#define ATA_PROTO_HRST (0 << 1)
761#define ATA_PROTO_EXTEND 0x01
762 uchar_t protocol; // multiple count, protocol
763#define ATA_MCOUNT_MSK 0xe0
764
765#define ATA_FLG_CK_COND 0x20
766#define ATA_FLG_T_DIR 0x08 // data from device
767#define ATA_FLG_BYT_BLOK 0x04
768#define ATA_FLG_TLEN_STPSIU 0x03
769#define ATA_FLG_TLEN_SECTOR_COUNT 0x02
770#define ATA_FLG_TLEN_FEATURE 0x01
771 uchar_t flags;
772
773 uchar_t efeatures;
774 uchar_t features;
775 uchar_t esector_count;
776 uchar_t sector_count;
777 uchar_t elba_low;
778 uchar_t lba_low;
779 uchar_t elba_mid;
780 uchar_t lba_mid;
781 uchar_t elba_high;
782 uchar_t lba_high;
783 uchar_t device;
784 uchar_t command;
785 uchar_t control;
786 } ata_pass_thru;
787
788// sequential access commands
789 struct {
790 uchar_t opcode;
791#define ERASE_OPT_LONG 0x01
792 uchar_t opt;
793 uchar_t rsvd[3];
794 uchar_t control;
795 } erase;
796
797 struct {
798 uchar_t opcode;
799#define LOCATE_OPT_CP 0x2
800#define LOCATE_OPT_BT 0x4
801 uchar_t opt;
802 uchar_t rsvd2;
803 uchar_t ba[4]; // block address
804 uchar_t rsvd7;
805 uchar_t partition;
806 uchar_t control;
807 } locate;
808
809 struct {
810 uchar_t opcode;
811 uchar_t opt;
812 uchar_t rsvd2[3];
813 uchar_t control;
814 } read_block_limits;
815
816#define RP_OPT_BT 0x01 // block address type
817#define RP_OPT_LNG 0x02 // long format
818#define RP_OPT_TCLP 0x04 // total current logical position
819 struct {
820 uchar_t opcode;
821 uchar_t lun_opt;
822 uchar_t rsvd2[7];
823 uchar_t control;
824 } read_position;
825
826#define SRW_OPT_FIXED 0x01
827#define SRW_OPT_SILI 0x02
828 struct {
829 uchar_t opcode;
830 uchar_t opt;
831 uchar_t transfer_len[3];
832 uchar_t control;
833 } sa_read_write;
834
835 struct {
836 uchar_t opcode;
837 uchar_t opt;
838 uchar_t rsvd[3];
839 uchar_t control;
840 } rewind;
841
842 struct {
843 uchar_t opcode;
844#define SPACE_CODE_BLOCKS 0x00
845#define SPACE_CODE_FMRKS 0x01
846#define SPACE_CODE_SEQ_FMRKS 0x02
847#define SPACE_CODE_EOD 0x03
848#define SPACE_CODE_SMRKS 0x04
849#define SPACE_CODE_SEQ_SMRKS 0x05
850 uchar_t lun_code;
851 uchar_t count[3];
852 uchar_t control;
853 } space;
854
855 struct {
856 uchar_t opcode;
857#define WF_OPT_IMMED 0x01
858#define WF_OPT_WSMK 0x02
859 uchar_t opt;
860 uchar_t transfer_length[3];
861 uchar_t control;
862 } write_filemarks;
863
864 struct {
865 uchar_t opcode;
866#define RD_OPT_MEDIA 0x01
867 uchar_t opt;
868 uchar_t rsvd[5];
869 uchar_t allocation_length[2];
870 uchar_t control;
871 } report_density;
872
873 struct {
874 uchar_t opcode;
875#define FM_OPT_IMMED 0x01
876#define FM_OPT_VERIFY 0x02
877 uchar_t opt;
878#define FM_FMT_DFLT 0x00
879#define FM_FMT_PARTITION 0x01
880#define FM_FMT_FORMAT_PARTITION 0x02
881 uchar_t format;
882 uchar_t transfer_length[2];
883 uchar_t control;
884 } format_media;
885} CDB;
886//----------------------------------------------------------------------------------------------------------
887
888struct _ata_sense
889 {
890 SCSI_SENSE_DESCRIPTOR sense;
891 ATA_STATUS_DESCRIPTOR desc;
892 };
893//----------------------------------------------------------------------------------------------------------
894
895
896#endif /* OS_QNXNTO_H_ */