File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / smartmontools / os_qnxnto.h
Revision 1.1.1.2 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Mon Jul 22 01:17:35 2013 UTC (10 years, 10 months ago) by misho
Branches: smartmontools, elwix, MAIN
CVS tags: v6_2, v6_1p0, v6_1, HEAD
6.1

    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
   15:  * (for example COPYING); if not, write to the Free Software Foundation,
   16:  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
   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_
   26: #define OS_QNXNTO_H_CVSID "$Id: os_qnxnto.h,v 1.1.1.2 2013/07/22 01:17:35 misho Exp $\n"
   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: //----------------------------------------------------------------------------------------------------------
   47: typedef struct _ata_pass_thru   ATA_PASS_THRU;
   48: typedef struct _eide_identify   EIDE_IDENTIFY;
   49: typedef struct _ata_sense       ATA_SENSE;
   50: 
   51: typedef void CCB;
   52: struct _sim_hba;
   53: struct _resmgr_context;
   54: 
   55: 
   56: typedef 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.
  148: typedef 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).
  166: typedef 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: 
  175: typedef 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: 
  191: typedef 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: 
  288: typedef 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: 
  888: struct _ata_sense
  889:  {
  890:   SCSI_SENSE_DESCRIPTOR	       sense;
  891:   ATA_STATUS_DESCRIPTOR	       desc;
  892:  };
  893: //----------------------------------------------------------------------------------------------------------
  894: 
  895: 
  896: #endif /* OS_QNXNTO_H_ */

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>