1/* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 * or http://www.opensolaris.org/os/licensing. 10 * See the License for the specific language governing permissions 11 * and limitations under the License. 12 * 13 * When distributing Covered Code, include this CDDL HEADER in each 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 * If applicable, add the following below this CDDL HEADER, with the 16 * fields enclosed by brackets "[]" replaced with your own identifying 17 * information: Portions Copyright [yyyy] [name of copyright owner] 18 * 19 * CDDL HEADER END 20 */ 21 22/* 23 * Copyright 2008 Sun Microsystems, Inc. All rights reserved. 24 * Use is subject to license terms. 25 */ 26 27#ifndef _SYS_DKTP_DADKIO_H 28#define _SYS_DKTP_DADKIO_H 29 30#ifdef __cplusplus 31extern "C" { 32#endif 33 34/* direct coupled disk driver ioctl command */ 35#define DIOCTL_GETGEOM 1 /* get logical disk geometry */ 36#define DIOCTL_GETPHYGEOM 2 /* get physical disk geometry */ 37#define DIOCTL_GETMODEL 3 /* get model number */ 38#define DIOCTL_GETSERIAL 4 /* get serial number */ 39#define DIOCTL_RWCMD 5 /* read/write a disk */ 40#define DIOCTL_GETWCE 6 /* get write cache enabled state */ 41 42#if !defined(BLKADDR_TYPE) 43#define BLKADDR_TYPE 44#if defined(_EXTVTOC) 45typedef unsigned long blkaddr_t; 46typedef unsigned int blkaddr32_t; 47#else 48typedef daddr_t blkaddr_t; 49typedef daddr32_t blkaddr32_t; 50#endif 51#endif 52 53/* 54 * arg structure for DIOCTL_GETMODEL and DIOCTL_GETSERIAL 55 * On input to the ioctl, is_size contains the size of the buffer 56 * pointed to by is_buf; 57 * On return, is_size contains the number of characters needed to 58 * represent the string. This may be more than the input value, in 59 * which case the caller can choose to 60 * 1. Use the truncated string as is 61 * 2. Allocate a buffer of is_size+1 bytes to hold the string 62 */ 63#ifdef _SYSCALL32 64typedef struct dadk_ioc_string32 65{ 66 caddr32_t is_buf; /* pointer to character array */ 67 int is_size; /* string length */ 68} dadk_ioc_string32_t; 69#endif /* _SYSCALL32 */ 70 71typedef struct dadk_ioc_string 72{ 73 caddr_t is_buf; /* pointer to character array */ 74 int is_size; /* string length */ 75} dadk_ioc_string_t; 76 77/* direct coupled disk driver command */ 78#define DCMD_READ 1 /* Read Sectors/Blocks */ 79#define DCMD_WRITE 2 /* Write Sectors/Blocks */ 80#define DCMD_FMTTRK 3 /* Format Tracks */ 81#define DCMD_FMTDRV 4 /* Format entire drive */ 82#define DCMD_RECAL 5 /* Recalibrate */ 83#define DCMD_SEEK 6 /* Seek to Cylinder */ 84#define DCMD_RDVER 7 /* Read Verify sectors on disk */ 85#define DCMD_GETDEF 8 /* Read manufacturers defect list */ 86/* cd-rom commands */ 87#define DCMD_LOCK 9 /* Lock door */ 88#define DCMD_UNLOCK 10 /* Unlock door */ 89#define DCMD_START_MOTOR 11 /* Start motor */ 90#define DCMD_STOP_MOTOR 12 /* Stop motor */ 91#define DCMD_EJECT 13 /* Eject medium */ 92#define DCMD_UPDATE_GEOM 14 /* Update geometry */ 93#define DCMD_GET_STATE 15 /* Get removable disk status */ 94#define DCMD_PAUSE 16 /* cdrom pause */ 95#define DCMD_RESUME 17 /* cdrom resume */ 96#define DCMD_PLAYTRKIND 18 /* cdrom play by track and index */ 97#define DCMD_PLAYMSF 19 /* cdrom play msf */ 98#define DCMD_SUBCHNL 20 /* cdrom sub channel */ 99#define DCMD_READMODE1 21 /* cdrom read mode 1 */ 100#define DCMD_READTOCHDR 22 /* cdrom read table of contents header */ 101#define DCMD_READTOCENT 23 /* cdrom read table of contents entry */ 102#define DCMD_READOFFSET 24 /* cdrom read offset */ 103#define DCMD_READMODE2 25 /* cdrom mode 2 */ 104#define DCMD_VOLCTRL 26 /* cdrom volume control */ 105/* additional disk commands */ 106#define DCMD_FLUSH_CACHE 27 /* flush write cache to physical medium */ 107 108/* driver error code */ 109#define DERR_SUCCESS 0 /* success */ 110#define DERR_AMNF 1 /* address mark not found */ 111#define DERR_TKONF 2 /* track 0 not found */ 112#define DERR_ABORT 3 /* aborted command */ 113#define DERR_DWF 4 /* write fault */ 114#define DERR_IDNF 5 /* ID not found */ 115#define DERR_BUSY 6 /* drive busy */ 116#define DERR_UNC 7 /* uncorrectable data error */ 117#define DERR_BBK 8 /* bad block detected */ 118#define DERR_INVCDB 9 /* invalid cdb */ 119#define DERR_HARD 10 /* hard device error - no retry */ 120/* 121 * atapi additional error codes 122 */ 123#define DERR_ILI 11 /* Illegal length indication */ 124#define DERR_EOM 12 /* End of media detected */ 125#define DERR_MCR 13 /* Media change requested */ 126/* 127 * atapi (SCSI) sense key errors 128 */ 129#define DERR_RECOVER 14 /* Recovered from error */ 130#define DERR_NOTREADY 15 /* Device not ready */ 131#define DERR_MEDIUM 16 /* Medium error */ 132#define DERR_HW 17 /* Hardware error */ 133#define DERR_ILL 18 /* Illegal request */ 134#define DERR_UNIT_ATTN 19 /* Unit attention */ 135#define DERR_DATA_PROT 20 /* Data protection */ 136#define DERR_MISCOMP 21 /* Miscompare */ 137#define DERR_ICRC 22 /* Interface CRC error -- new driver */ 138 /* error code in ATA-4 and newer */ 139#define DERR_RESV 23 /* Reserved */ 140 141struct dadkio_derr { 142 int d_action; 143 int d_severity; 144}; 145 146/* 147 * dadkio_rwcmd cmd 148 */ 149 150#define DADKIO_RWCMD_READ 1 /* read command */ 151#define DADKIO_RWCMD_WRITE 2 /* write command */ 152 153/* 154 * dadkio_rwcmd flags 155 */ 156#define DADKIO_FLAG_SILENT 0x01 /* driver should not */ 157 /* generate any warning */ 158 /* or error console msgs */ 159#define DADKIO_FLAG_RESERVED 0x02 /* reserved/not used */ 160 161 162#define DADKIO_ERROR_INFO_LEN 128 163 164/* 165 * dadkio_status status value. 166 */ 167struct dadkio_status { 168 int status; 169 ulong_t resid; 170 int failed_blk_is_valid; 171 blkaddr_t failed_blk; 172 int fru_code_is_valid; 173 int fru_code; 174 char add_error_info[DADKIO_ERROR_INFO_LEN]; 175}; 176 177#ifdef _SYSCALL32 178struct dadkio_status32 { 179 int status; 180 uint32_t resid; 181 int failed_blk_is_valid; 182 blkaddr32_t failed_blk; 183 int fru_code_is_valid; 184 int fru_code; 185 char add_error_info[DADKIO_ERROR_INFO_LEN]; 186}; 187#endif /* _SYSCALL32 */ 188 189/* 190 * Used by read/write ioctl (DKIOCTL_RWCMD) 191 */ 192struct dadkio_rwcmd { 193 int cmd; 194 int flags; 195 blkaddr_t blkaddr; 196 uint_t buflen; 197 caddr_t bufaddr; 198 struct dadkio_status status; 199}; 200 201#ifdef _SYSCALL32 202struct dadkio_rwcmd32 { 203 int cmd; 204 int flags; 205 blkaddr32_t blkaddr; 206 uint_t buflen; 207 caddr32_t bufaddr; 208 struct dadkio_status32 status; 209}; 210#endif /* _SYSCALL32 */ 211 212/* 213 * dadkio_status status values 214 */ 215#define DADKIO_STAT_NO_ERROR 0 /* cmd was successful */ 216#define DADKIO_STAT_NOT_READY 1 /* device not ready */ 217#define DADKIO_STAT_MEDIUM_ERROR 2 /* error on medium */ 218#define DADKIO_STAT_HARDWARE_ERROR 3 /* other hardware error */ 219#define DADKIO_STAT_ILLEGAL_REQUEST 4 /* illegal request */ 220#define DADKIO_STAT_ILLEGAL_ADDRESS 5 /* illegal block address */ 221#define DADKIO_STAT_WRITE_PROTECTED 6 /* device write-protected */ 222#define DADKIO_STAT_TIMED_OUT 7 /* no response from device */ 223#define DADKIO_STAT_PARITY 8 /* parity error in data */ 224#define DADKIO_STAT_BUS_ERROR 9 /* error on bus */ 225#define DADKIO_STAT_SOFT_ERROR 10 /* data recovered via ECC */ 226#define DADKIO_STAT_NO_RESOURCES 11 /* no resources for cmd */ 227#define DADKIO_STAT_NOT_FORMATTED 12 /* device is not formatted */ 228#define DADKIO_STAT_RESERVED 13 /* device is reserved */ 229#define DADKIO_STAT_NOT_SUPPORTED 14 /* feature not supported */ 230 231 232#ifdef __cplusplus 233} 234#endif 235 236#endif /* _SYS_DKTP_DADKIO_H */ 237