root/scsi/scsi_disk.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


    1 /*      $OpenBSD: scsi_disk.h,v 1.22 2007/06/23 19:19:49 krw Exp $      */
    2 /*      $NetBSD: scsi_disk.h,v 1.10 1996/07/05 16:19:05 christos Exp $  */
    3 
    4 /*
    5  * SCSI interface description
    6  */
    7 
    8 /*
    9  * Some lines of this file come from a file of the name "scsi.h"
   10  * distributed by OSF as part of mach2.5,
   11  *  so the following disclaimer has been kept.
   12  *
   13  * Copyright 1990 by Open Software Foundation,
   14  * Grenoble, FRANCE
   15  *
   16  *              All Rights Reserved
   17  * 
   18  *   Permission to use, copy, modify, and distribute this software and
   19  * its documentation for any purpose and without fee is hereby granted,
   20  * provided that the above copyright notice appears in all copies and
   21  * that both the copyright notice and this permission notice appear in
   22  * supporting documentation, and that the name of OSF or Open Software
   23  * Foundation not be used in advertising or publicity pertaining to
   24  * distribution of the software without specific, written prior
   25  * permission.
   26  * 
   27  *   OSF DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE
   28  * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS,
   29  * IN NO EVENT SHALL OSF BE LIABLE FOR ANY SPECIAL, INDIRECT, OR
   30  * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
   31  * LOSS OF USE, DATA OR PROFITS, WHETHER IN ACTION OF CONTRACT,
   32  * NEGLIGENCE, OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
   33  * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
   34  */
   35 
   36 /*
   37  * Largely written by Julian Elischer (julian@tfs.com)
   38  * for TRW Financial Systems.
   39  *
   40  * TRW Financial Systems, in accordance with their agreement with Carnegie
   41  * Mellon University, makes this software available to CMU to distribute
   42  * or use in any manner that they see fit as long as this message is kept with 
   43  * the software. For this reason TFS also grants any other persons or
   44  * organisations permission to use or modify this software.
   45  *
   46  * TFS supplies this software to be publicly redistributed
   47  * on the understanding that TFS is not responsible for the correct
   48  * functioning of this software in any circumstances.
   49  *
   50  * Ported to run under 386BSD by Julian Elischer (julian@tfs.com) Sept 1992
   51  */
   52 
   53 /*
   54  * SCSI command format
   55  */
   56 
   57 #ifndef _SCSI_SCSI_DISK_H
   58 #define _SCSI_SCSI_DISK_H 1
   59 
   60 /*
   61  * XXX Is this also used by ATAPI?
   62  */
   63 #define FORMAT_UNIT             0x04
   64 struct scsi_format_unit {
   65         u_int8_t opcode;
   66         u_int8_t flags;
   67 #define SFU_DLF_MASK    0x07
   68 #define SFU_CMPLST      0x08
   69 #define SFU_FMTDATA     0x10
   70         u_int8_t vendor_specific;
   71         u_int8_t interleave[2];
   72         u_int8_t control;
   73 };
   74 
   75 /*
   76  * If the FmtData bit is set, a FORMAT UNIT parameter list is transferred
   77  * to the target during the DATA OUT phase.  The parameter list includes
   78  *
   79  *      Defect list header
   80  *      Initialization pattern descriptor (if any)
   81  *      Defect descriptor(s) (if any)
   82  */
   83 
   84 struct scsi_format_unit_defect_list_header {
   85         u_int8_t reserved;
   86         u_int8_t flags;
   87 #define DLH_VS          0x01            /* vendor specific */
   88 #define DLH_IMMED       0x02            /* immediate return */
   89 #define DLH_DSP         0x04            /* disable saving parameters */
   90 #define DLH_IP          0x08            /* initialization pattern */
   91 #define DLH_STPF        0x10            /* stop format */
   92 #define DLH_DCRT        0x20            /* disable certification */
   93 #define DLH_DPRY        0x40            /* disable primary */
   94 #define DLH_FOV         0x80            /* format options valid */
   95         u_int8_t defect_lst_len[2];
   96 };
   97 
   98 /*
   99  * See Table 117 of the SCSI-2 specification for a description of
  100  * the IP modifier.
  101  */
  102 struct scsi_initialization_pattern_descriptor {
  103         u_int8_t ip_modifier;
  104         u_int8_t pattern_type;
  105 #define IP_TYPE_DEFAULT         0x01
  106 #define IP_TYPE_REPEAT          0x01
  107                                 /* 0x02 -> 0x7f: reserved */
  108                                 /* 0x80 -> 0xff: vendor-specific */
  109         u_int8_t pattern_length[2];
  110 #if 0
  111         u_int8_t pattern[...];
  112 #endif
  113 };
  114 
  115 /*
  116  * Defect desciptors.  These are used as the defect lists in the FORMAT UNIT
  117  * and READ DEFECT DATA commands, and as the translate page of the
  118  * SEND DIAGNOSTIC and RECEIVE DIAGNOSTIC RESULTS commands.
  119  */
  120 
  121 /* Block format */
  122 struct scsi_defect_descriptor_bf {
  123         u_int8_t block_address[4];
  124 };
  125 
  126 /* Bytes from index format */
  127 struct scsi_defect_descriptor_bfif {
  128         u_int8_t cylinder[2];
  129         u_int8_t head;
  130         u_int8_t bytes_from_index[2];
  131 };
  132 
  133 /* Physical sector format */
  134 struct scsi_defect_descriptor_psf {
  135         u_int8_t cylinder[2];
  136         u_int8_t head;
  137         u_int8_t sector[2];
  138 };
  139 
  140 
  141 struct scsi_reassign_blocks {
  142         u_int8_t opcode;
  143         u_int8_t byte2;
  144         u_int8_t unused[3];
  145         u_int8_t control;
  146 };
  147 
  148 /*
  149  * XXX Is this also used by ATAPI?
  150  */
  151 #define REZERO_UNIT             0x01
  152 struct scsi_rezero_unit {
  153         u_int8_t opcode;
  154         u_int8_t byte2;
  155         u_int8_t reserved[3];
  156         u_int8_t control;
  157 };
  158 
  159 struct scsi_rw {
  160         u_int8_t opcode;
  161         u_int8_t addr[3];
  162 #define SRW_TOPADDR     0x1F    /* only 5 bits here */
  163         u_int8_t length;
  164         u_int8_t control;
  165 };
  166 
  167 struct scsi_rw_big {
  168         u_int8_t opcode;
  169         u_int8_t byte2;
  170 #define SRWB_RELADDR    0x01
  171         u_int8_t addr[4];
  172         u_int8_t reserved;
  173         u_int8_t length[2];
  174         u_int8_t control;
  175 };
  176 
  177 struct scsi_rw_12 {
  178         u_int8_t opcode;
  179         u_int8_t byte2;
  180         u_int8_t addr[4];
  181         u_int8_t length[4];
  182         u_int8_t reserved;
  183         u_int8_t control;
  184 };
  185 
  186 struct scsi_rw_16 {
  187         u_int8_t opcode;
  188         u_int8_t byte2;
  189         u_int8_t addr[8];
  190         u_int8_t length[4];
  191         u_int8_t reserved;
  192         u_int8_t control;
  193 };
  194 
  195 struct scsi_read_capacity {
  196         u_int8_t opcode;
  197         u_int8_t byte2;
  198         u_int8_t addr[4];
  199         u_int8_t unused[3];
  200         u_int8_t control;
  201 };
  202 
  203 struct scsi_read_capacity_16 {
  204         u_int8_t opcode;
  205         u_int8_t byte2;
  206 #define SRC16_SERVICE_ACTION    0x10
  207         u_int8_t addr[8];
  208         u_int8_t length[4];
  209         u_int8_t reserved;
  210         u_int8_t control;
  211 };
  212 
  213 struct scsi_start_stop {
  214         u_int8_t opcode;
  215         u_int8_t byte2;
  216         u_int8_t unused[2];
  217         u_int8_t how;
  218 #define SSS_STOP                0x00
  219 #define SSS_START               0x01
  220 #define SSS_LOEJ                0x02
  221         u_int8_t control;
  222 };
  223 
  224 
  225 /*
  226  * XXX Does ATAPI have an equivalent?
  227  */
  228 #define SYNCHRONIZE_CACHE               0x35
  229 struct scsi_synchronize_cache {
  230         u_int8_t opcode;
  231         u_int8_t flags;
  232 #define SSC_RELADR      0x01
  233 #define SSC_IMMED       0x02
  234         u_int8_t addr[4];
  235         u_int8_t reserved;
  236         u_int8_t length[2];
  237         u_int8_t control;
  238 };
  239 
  240 
  241 
  242 /*
  243  * Disk specific opcodes
  244  */
  245 #define REASSIGN_BLOCKS         0x07
  246 #define READ_COMMAND            0x08
  247 #define WRITE_COMMAND           0x0a
  248 #define READ_CAPACITY           0x25
  249 #define READ_CAPACITY_16        0x9e
  250 #define READ_BIG                0x28
  251 #define WRITE_BIG               0x2a
  252 #define READ_12                 0xa8
  253 #define WRITE_12                0xaa
  254 #define READ_16                 0x88
  255 #define WRITE_16                0x8a
  256 #define SYNCHRONIZE_CACHE       0x35
  257 
  258 
  259 struct scsi_read_cap_data {
  260         u_int8_t addr[4];
  261         u_int8_t length[4];
  262 };
  263 
  264 struct scsi_read_cap_data_16 {
  265         u_int8_t addr[8];
  266         u_int8_t length[4];
  267         u_int8_t p_type_prot;
  268         u_int8_t logical_per_phys;
  269         u_int8_t lowest_aligned[2];
  270         u_int8_t reserved[16];
  271 };
  272 
  273 struct scsi_reassign_blocks_data {
  274         u_int8_t reserved[2];
  275         u_int8_t length[2];
  276         struct {
  277                 u_int8_t dlbaddr[4];
  278         } defect_descriptor[1];
  279 };
  280 
  281 /* Only the lower 6 bits of the pg_code field are used for page #. */
  282 #define DISK_PGCODE(pg, n)      ((pg) != NULL) && (((pg)->pg_code & 0x3f) == n)
  283 #define PAGE_DISK_FORMAT        3
  284 #define PAGE_RIGID_GEOMETRY     4
  285 #define PAGE_FLEX_GEOMETRY      5
  286 #define PAGE_REDUCED_GEOMETRY   6
  287 
  288 struct page_disk_format {
  289         u_int8_t pg_code;       /* page code (should be 3) */
  290         u_int8_t pg_length;     /* page length (should be 0x16) */
  291         u_int8_t trk_z[2];      /* tracks per zone */
  292         u_int8_t alt_sec[2];    /* alternate sectors per zone */
  293         u_int8_t alt_trk_z[2];  /* alternate tracks per zone */
  294         u_int8_t alt_trk_v[2];  /* alternate tracks per volume */
  295         u_int8_t ph_sec_t[2];   /* physical sectors per track */
  296         u_int8_t bytes_s[2];    /* bytes per sector */
  297         u_int8_t interleave[2]; /* interleave */
  298         u_int8_t trk_skew[2];   /* track skew factor */
  299         u_int8_t cyl_skew[2];   /* cylinder skew */
  300         u_int8_t flags;         /* various */
  301 #define DISK_FMT_SURF   0x10
  302 #define DISK_FMT_RMB    0x20
  303 #define DISK_FMT_HSEC   0x40
  304 #define DISK_FMT_SSEC   0x80
  305         u_int8_t reserved1;
  306         u_int8_t reserved2;
  307         u_int8_t reserved3;
  308 };
  309 
  310 struct page_rigid_geometry {
  311         u_int8_t pg_code;       /* page code (should be 4) */
  312         u_int8_t pg_length;     /* page length (should be 0x12 or 0x16) */
  313         u_int8_t ncyl[3];       /* number of cylinders */
  314         u_int8_t nheads;        /* number of heads */
  315         u_int8_t st_cyl_wp[3];  /* starting cyl., write precomp */
  316         u_int8_t st_cyl_rwc[3]; /* starting cyl., red. write cur */
  317         u_int8_t driv_step[2];  /* drive step rate */
  318         u_int8_t land_zone[3];  /* landing zone cylinder */
  319         u_int8_t sp_sync_ctl;   /* spindle synch control */
  320 #define SPINDLE_SYNCH_MASK      0x03    /* mask of valid bits */
  321 #define SPINDLE_SYNCH_NONE      0x00    /* synch disabled or not supported */
  322 #define SPINDLE_SYNCH_SLAVE     0x01    /* disk is a slave */
  323 #define SPINDLE_SYNCH_MASTER    0x02    /* disk is a master */
  324 #define SPINDLE_SYNCH_MCONTROL  0x03    /* disk is a master control */
  325         u_int8_t rot_offset;    /* rotational offset (for spindle synch) */
  326         u_int8_t reserved1;
  327         u_int8_t rpm[2];        /* media rotation speed */
  328         u_int8_t reserved2;
  329         u_int8_t reserved3;
  330 };
  331 
  332 struct page_flex_geometry {
  333         u_int8_t pg_code;       /* page code (should be 5) */
  334         u_int8_t pg_length;     /* page length (should be 0x1a or 0x1e) */
  335         u_int8_t xfr_rate[2];
  336         u_int8_t nheads;        /* number of heads */
  337         u_int8_t ph_sec_tr;     /* physical sectors per track */
  338         u_int8_t bytes_s[2];    /* bytes per sector */
  339         u_int8_t ncyl[2];       /* number of cylinders */
  340         u_int8_t st_cyl_wp[2];  /* start cyl., write precomp */
  341         u_int8_t st_cyl_rwc[2]; /* start cyl., red. write cur */
  342         u_int8_t driv_step[2];  /* drive step rate */
  343         u_int8_t driv_step_w;   /* drive step pulse width */
  344         u_int8_t head_settle[2];/* head settle delay */
  345         u_int8_t motor_on;      /* motor on delay */
  346         u_int8_t motor_off;     /* motor off delay */
  347         u_int8_t flags;         /* various flags */
  348 #define MOTOR_ON                0x20    /* motor on (pin 16)? */
  349 #define START_AT_SECTOR_1       0x40    /* start at sector 1  */
  350 #define READY_VALID             0x20    /* RDY (pin 34) valid */
  351         u_int8_t step_p_cyl;    /* step pulses per cylinder */
  352         u_int8_t write_pre;     /* write precompensation */
  353         u_int8_t head_load;     /* head load delay */
  354         u_int8_t head_unload;   /* head unload delay */
  355         u_int8_t pin_34_2;      /* pin 34 (6) pin 2 (7/11) definition */
  356         u_int8_t pin_4_1;       /* pin 4 (8/9) pin 1 (13) definition */
  357         u_int8_t rpm[2];        /* media rotation speed */
  358         u_int8_t reserved1;
  359         u_int8_t reserved2;
  360 };
  361 
  362 struct page_reduced_geometry {
  363         u_int8_t pg_code;       /* page code (should be 6) */
  364         u_int8_t pg_length;     /* page length (should be 0x0B) */
  365         u_int8_t wcd;           /* bit 0 = write cache disable */
  366         u_int8_t bytes_s[2];    /* bytes per sector */
  367         u_int8_t sectors[5];    /* total number of sectors */
  368         u_int8_t pow_perf;      /* power/performance level */
  369         u_int8_t flags;         /* various */
  370 #define LOCK_DISABLED   0x1
  371 #define FORMAT_DISABLED 0x2
  372 #define WRITE_DISABLED  0x4
  373 #define READ_DISABLED   0x8
  374         u_int8_t reserved;
  375 };
  376 #endif /* _SCSI_SCSI_DISK_H */

/* [<][>][^][v][top][bottom][index][help] */