home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Source Code 1993 July / THE_SOURCE_CODE_CD_ROM.iso / bsd_srcs / sys / tahoe / vba / vdreg.h < prev    next >
Encoding:
C/C++ Source or Header  |  1991-05-08  |  15.4 KB  |  459 lines

  1. /*
  2.  * Copyright (c) 1988 Regents of the University of California.
  3.  * All rights reserved.
  4.  *
  5.  * This code is derived from software contributed to Berkeley by
  6.  * Computer Consoles Inc.
  7.  *
  8.  * Redistribution and use in source and binary forms, with or without
  9.  * modification, are permitted provided that the following conditions
  10.  * are met:
  11.  * 1. Redistributions of source code must retain the above copyright
  12.  *    notice, this list of conditions and the following disclaimer.
  13.  * 2. Redistributions in binary form must reproduce the above copyright
  14.  *    notice, this list of conditions and the following disclaimer in the
  15.  *    documentation and/or other materials provided with the distribution.
  16.  * 3. All advertising materials mentioning features or use of this software
  17.  *    must display the following acknowledgement:
  18.  *    This product includes software developed by the University of
  19.  *    California, Berkeley and its contributors.
  20.  * 4. Neither the name of the University nor the names of its contributors
  21.  *    may be used to endorse or promote products derived from this software
  22.  *    without specific prior written permission.
  23.  *
  24.  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  25.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  26.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  27.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  28.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  29.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  30.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  31.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  32.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  33.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  34.  * SUCH DAMAGE.
  35.  *
  36.  *    @(#)vdreg.h    7.7 (Berkeley) 6/28/90
  37.  */
  38.  
  39. /*
  40.  * Versabus VDDC/SMDE disk controller definitions.
  41.  */
  42. #define    VDDC_SECSIZE    512    /* sector size for VDDC */
  43. #define    VD_MAXSECSIZE    1024    /* max sector size for SMD/E */
  44.  
  45. /*
  46.  * Controller communications block.
  47.  */
  48. struct vddevice {
  49.     u_long    vdcdr;        /* controller device register */
  50.     u_long    vdreset;    /* controller reset register */
  51.     u_long    vdcsr;        /* control-status register */
  52.     long    vdrstclr;    /* reset clear register */
  53.     u_short    vdstatus[16];    /* per-drive status register */
  54.     u_short    vdicf_status;    /* status change interupt control format */
  55.     u_short    vdicf_done;    /* interrupt complete control format */
  56.     u_short    vdicf_error;    /* interrupt error control format */
  57.     u_short    vdicf_success;    /* interrupt success control format */
  58.     u_short    vdtcf_mdcb;    /* mdcb transfer control format */
  59.     u_short    vdtcf_dcb;    /* dcb transfer control format */
  60.     u_short    vdtcf_trail;    /* trail transfer control format */
  61.     u_short    vdtcf_data;    /* data transfer control format */
  62.     u_long    vdccf;        /* controller configuration flags */
  63.     u_long    vdsecsize;    /* sector size */
  64.     u_short    vdfill0;
  65.     u_char    vdcylskew;    /* cylinder to cylinder skew factor */
  66.     u_char    vdtrackskew;    /* track to track skew factor */
  67.     u_long    vdfill1;
  68.     u_long    vddfr;        /* diagnostic flag register */
  69.     u_long    vddda;        /* diagnostic dump address */
  70. };
  71.  
  72. /* controller types */
  73. #define    VDTYPE_VDDC    1    /* old vddc controller (smd only) */
  74. #define    VDTYPE_SMDE    2    /* new smde controller (smd-e) */
  75.  
  76. /*
  77.  * Controller status definitions.
  78.  */
  79. #define    CS_SCS    0xf        /* status change source (drive number) */
  80. #define    CS_ELC    0x10        /* error on last command */
  81. #define    CS_ICC    0x60        /* interupt cause code */
  82. #define   ICC_NOI  0x00        /* no interupt */
  83. #define   ICC_DUN  0x20        /* no interupt */
  84. #define   ICC_ERR  0x40        /* no interupt */
  85. #define   ICC_SUC  0x60        /* no interupt */
  86. #define    CS_GO    0x80        /* go bit (controller busy) */
  87. #define    CS_BE    0x100        /* buss error */
  88. #define    CS_BOK    0x4000        /* board ok */
  89. #define    CS_SFL    0x8000        /* system fail */
  90. #define    CS_LEC    0xff000000    /* last error code */
  91.  
  92. /*
  93.  * Drive status definitions.
  94.  */
  95. #define    STA_UR    0x1        /* unit ready */
  96. #define    STA_OC    0x2        /* on cylinder */
  97. #define    STA_SE    0x4        /* seek error */
  98. #define    STA_DF    0x8        /* drive fault */
  99. #define    STA_WP    0x10        /* write protected */
  100. #define    STA_US    0x20        /* unit selected */
  101. #define    STA_TYPE    0x300    /* drive type: */
  102. #define    STA_SMD        0x000        /* SMD */
  103. #define    STA_ESDI    0x100        /* ESDI */
  104.  
  105. /*
  106.  * Interupt Control Field definitions.
  107.  */
  108. #define    ICF_IPL    0x7        /* interupt priority level */
  109. #define    ICF_IEN    0x8        /* interupt enable */
  110. #define    ICF_IV    0xff00        /* interupt vector */
  111.  
  112. /*
  113.  * Transfer Control Format definitions.
  114.  */
  115. #define    TCF_AM    0xff        /* Address Modifier */
  116. #define      AM_SNPDA   0x01    /* Standard Non-Privileged Data Access */
  117. #define      AM_SASA    0x81    /* Standard Ascending Sequential Access */
  118. #define      AM_ENPDA   0xf1    /* Extended Non-Privileged Data Access */
  119. #define      AM_EASA    0xe1    /* Extended Ascending Sequential Access */
  120. #define    TCF_BTE    0x800        /* Block Transfer Enable */
  121.  
  122. /*
  123.  * Controller Configuration Flags.
  124.  */
  125. #define    CCF_STS    0x1        /* sectors per track selectable */
  126. #define    CCF_EAV    0x2        /* enable auto vector */
  127. #define    CCF_ERR    0x4        /* enable reset register */
  128. #define CCF_RFE 0x8        /* recovery flag enable */
  129. #define    CCF_XMD    0x60        /* xmd transfer mode (bus size) */
  130. #define      XMD_8BIT  0x20    /*   do only 8 bit transfers */
  131. #define      XMD_16BIT 0x40    /*   do only 16 bit transfers */
  132. #define      XMD_32BIT 0x60    /*   do only 32 bit transfers */
  133. #define    CCF_DIU    0x80        /* disable initial update of DCB @cmd start */
  134. #define    CCF_BSZ    0x300        /* burst size */
  135. #define      BSZ_16WRD 0x000    /*   16 word transfer burst */
  136. #define      BSZ_12WRD 0x100    /*   12 word transfer burst */
  137. #define      BSZ_8WRD  0x200    /*   8 word transfer burst */
  138. #define      BSZ_4WRD  0x300    /*   4 word transfer burst */
  139. #define CCF_SEN    0x400        /* cylinder/track skew enable (for format) */
  140. #define    CCF_ENP    0x1000        /* enable parity */
  141. #define    CCF_EPE    0x2000        /* enable parity errors */
  142. #define    CCF_EDE    0x10000        /* error detection enable */
  143. #define    CCF_ECE    0x20000        /* error correction enable */
  144.  
  145. /*
  146.  * Diagnostic register definitions.
  147.  */
  148. #define    DIA_DC    0x7f        /* dump count mask */
  149. #define    DIA_DWR    0x80        /* dump write/read flag */
  150. #define    DIA_ARE    0x100        /* auto rebuild enable */
  151. #define    DIA_CEN    0x200        /* call enable flag */
  152. #define    DIA_KEY    0xAA550000    /* reset enable key */
  153.  
  154. /*
  155.  * Hardware interface flags, in dcb.devselect and d_devflags
  156.  */
  157. #define VD_ESDI    0x10        /* drive is on ESDI interface */
  158. #define    d_devflags    d_drivedata[0]        /* in disk label */
  159.  
  160. /*
  161.  * Error recovery flags.
  162.  */
  163. #define    VDRF_RTZ    0x0001    /* return to zero */
  164. #define    VDRF_OCF    0x0002    /* on cylinder false */
  165. #define    VDRF_OSP    0x0004    /* offset plus */
  166. #define    VDRF_OSM    0x0008    /* offset minus */
  167. #define    VDRF_DSE    0x0080    /* data strobe early */
  168. #define    VDRF_DSL    0x0100    /* data strobe late */
  169.  
  170. #define    VDRF_NONE    0
  171. #define    VDRF_NORMAL    (VDRF_RTZ|VDRF_OCF|VDRF_OSP|VDRF_OSM|VDRF_DSE|VDRF_DSL)
  172.  
  173. /*
  174.  * Perform a reset on the controller.
  175.  */
  176. #define    VDRESET(a,t) { \
  177.     if ((t) == VDTYPE_SMDE) { \
  178.         ((struct vddevice *)(a))->vddfr = DIA_KEY|DIA_CEN; \
  179.         ((struct vddevice *)(a))->vdcdr = (u_long)0xffffffff; \
  180.         DELAY(5000000); \
  181.     } else { \
  182.         ((struct vddevice *)(a))->vdreset = 0; \
  183.         DELAY(1500000); \
  184.     } \
  185. }
  186.  
  187. /*
  188.  * Abort a controller operation.
  189.  */
  190. #define    VDABORT(a,t) { \
  191.     if ((t) == VDTYPE_VDDC) { \
  192.         movow((a), (VDOP_ABORT&0xffff0000)>>16) ; \
  193.         movow((int)(a)+2, VDOP_ABORT&0xffff); \
  194.     } else \
  195.         ((struct vddevice *)(a))->vdcdr = (u_long)VDOP_ABORT; \
  196.     DELAY(1000000); \
  197. }
  198.  
  199. /*
  200.  * Start a command.
  201.  */
  202. #define VDGO(a,mdcb,t) {\
  203.     if ((t) == VDTYPE_VDDC) { \
  204.         movow((a), ((int)(mdcb)&0xffff0000)>>16) ; \
  205.         movow((int)((a))+2, (int)(mdcb)&0xffff); \
  206.     } else \
  207.         ((struct vddevice *)(a))->vdcdr = (mdcb); \
  208. }
  209.  
  210. /*
  211.  * MDCB layout.
  212.  */
  213. struct mdcb {
  214.     struct    dcb *mdcb_head;        /* first dcb in list */
  215.     struct    dcb *mdcb_busy;        /* dcb being processed */
  216.     struct    dcb *mdcb_intr;        /* dcb causing interrupt */
  217.     long    mdcb_status;        /* status of dcb in mdcb_busy */
  218. };
  219.  
  220. /*
  221.  * DCB definitions.
  222.  */
  223.  
  224. /*
  225.  * A disk address.
  226.  */
  227. typedef struct {
  228.     u_char    track;            /* all 8 bits */
  229.     u_char    sector;            /* all 8  bits */
  230.     u_short    cylinder;        /* low order 12 bits */
  231. } dskadr;
  232.  
  233. /*
  234.  * DCB trailer formats.
  235.  */
  236. /* read/write trailer */
  237. struct trrw {
  238.     u_long    memadr;        /* memory address */
  239.     u_long    wcount;        /* 16 bit word count */
  240.     dskadr    disk;        /* disk address */
  241. };
  242.  
  243. /* scatter/gather trailer */
  244. #define    VDMAXPAGES    (MAXPHYS / NBPG)
  245. struct trsg {
  246.     struct    trrw start_addr;
  247.     struct addr_chain {
  248.         u_long    nxt_addr;
  249.         u_long    nxt_len;
  250.     } addr_chain[VDMAXPAGES + 1];
  251. };
  252.  
  253. /* seek trailer format */
  254. struct trseek {
  255.     dskadr    skaddr;
  256. };
  257.  
  258. /* format trailer */
  259. struct trfmt {
  260.     char    *addr;        /* data buffer to be filled on sector*/
  261.     long    nsectors;    /* # of sectors to be formatted */
  262.     dskadr    disk;        /* disk physical address info */
  263.     dskadr  hdr;        /* header address info */
  264. };
  265.  
  266. /* reset/configure trailer */
  267. struct treset {
  268.     long    ncyl;        /* # cylinders */
  269.     long    nsurfaces;    /* # surfaces */
  270.     long    nsectors;    /* # sectors */
  271.     long    slip_sec;    /* # of slip sectors */
  272.     long    recovery;    /* recovery flags */
  273. };
  274.  
  275. /* ident trailer */
  276. struct trid {
  277.     long    name;
  278.     long    rev;
  279.     long    date;
  280. };
  281.  
  282. /*
  283.  * DCB layout.
  284.  */
  285. struct dcb {
  286.     struct    dcb *nxtdcb;    /* next dcb */
  287.     short    intflg;        /* interrupt settings and flags */
  288.     short    opcode;        /* DCB command code etc... */
  289.     long    operrsta;    /* error & status info */
  290.     short    fill;        /* not used */
  291.     char    devselect;    /* drive selection */
  292.     char    trailcnt;    /* trailer Word Count */
  293.     long    err_memadr;    /* error memory address */
  294.     u_char    err_code;    /* error codes for SMD/E */
  295.     char    fill2;        /* not used */
  296.     short    err_wcount;    /* error word count */
  297.     char    err_trk;    /* error track/sector */
  298.     char    err_sec;    /* error track/sector */
  299.     short    err_cyl;    /* error cylinder adr */
  300.     union {
  301.         struct    trid idtrail;    /* ident command trailer */
  302.         struct    trseek sktrail;    /* seek command trailer */
  303.         struct    trsg sgtrail;    /* scatter/gather trailer */
  304.         struct    trrw rwtrail;    /* read/write trailer */
  305.         struct    trfmt fmtrail;    /* format trailer */
  306.         struct    treset rstrail;    /* reset/configure trailer */
  307.     } trail;
  308. };
  309.  
  310. /*
  311.  * smaller DCB with seek trailer only (no scatter-gather).
  312.  */
  313. struct skdcb {
  314.     struct    dcb *nxtdcb;    /* next dcb */
  315.     short    intflg;        /* interrupt settings and flags */
  316.     short    opcode;        /* DCB command code etc... */
  317.     long    operrsta;    /* error & status info */
  318.     short    fill;        /* not used */
  319.     char    devselect;    /* drive selection */
  320.     char    trailcnt;    /* trailer Word Count */
  321.     long    err_memadr;    /* error memory address */
  322.     u_char    err_code;    /* error codes for SMD/E */
  323.     char    fill2;        /* not used */
  324.     short    err_wcount;    /* error word count */
  325.     char    err_trk;    /* error track/sector */
  326.     char    err_sec;    /* error track/sector */
  327.     short    err_cyl;    /* error cylinder adr */
  328.     union {
  329.         struct    trseek sktrail;    /* seek command trailer */
  330.     } trail;
  331. };
  332.  
  333. /*
  334.  * DCB command codes.
  335.  */
  336. #define    VDOP_RD        0x80        /* read data */
  337. #define    VDOP_FTR    0xc0        /* full track read */
  338. #define    VDOP_RAS    0x90        /* read and scatter */
  339. #define    VDOP_RDRAW    0x600        /* read unformatted disk sector */
  340. #define    VDOP_CMP    0xa0        /* compare */
  341. #define    VDOP_FTC    0xe0        /* full track compare */
  342. #define    VDOP_RHDE    0x180        /* read header, data & ecc */
  343. #define    VDOP_WD        0x00        /* write data */
  344. #define    VDOP_FTW    0x40        /* full track write */
  345. #define    VDOP_WTC    0x20        /* write then compare */
  346. #define    VDOP_FTWTC    0x60        /* full track write then compare */
  347. #define    VDOP_GAW    0x10        /* gather and write */
  348. #define    VDOP_WDE    0x100        /* write data & ecc */
  349. #define    VDOP_FSECT    0x900        /* format sector */
  350. #define    VDOP_GWC    0x30        /* gather write & compare */
  351. #define    VDOP_START    0x800        /* start drives */
  352. #define    VDOP_RELEASE    0xa00        /* stop drives */
  353. #define    VDOP_SEEK    0xb00        /* seek */
  354. #define    VDOP_INIT    0xc00        /* initialize controller */
  355. #define    VDOP_DIAG    0xd00        /* diagnose (self-test) controller */
  356. #define    VDOP_CONFIG    0xe00        /* reset & configure drive */
  357. #define    VDOP_STATUS    0xf00        /* get drive status */
  358. #define    VDOP_IDENT    0x700        /* identify controller */
  359. #define    VDOP_PROBE    0x500        /* probe drives and update status */
  360.  
  361. #define    VDOP_ABORT    0x80000000    /* abort current command */
  362.  
  363. /*
  364.  * DCB status definitions.
  365.  */
  366. #define    DCBS_HCRC    0x00000001    /* header crc error */
  367. #define    DCBS_HCE    0x00000002    /* header compare error */
  368. #define    DCBS_WPT    0x00000004    /* drive write protected */
  369. #define    DCBS_CHE    0x00000008    /* controller hardware error */
  370. #define    DCBS_SKI    0x00000010    /* seek incomplete */
  371. #define    DCBS_UDE    0x00000020    /* uncorrectable data error */
  372. #define    DCBS_OCYL    0x00000040    /* off cylinder */
  373. #define    DCBS_NRDY    0x00000080    /* drive not ready */
  374. #define    DCBS_ATA    0x00000100    /* alternate track accessed */
  375. #define    DCBS_SKS    0x00000200    /* seek started */
  376. #define    DCBS_IVA    0x00000400    /* invalid disk address error */
  377. #define    DCBS_NEM    0x00000800    /* non-existant memory error */
  378. #define    DCBS_DPE    0x00001000    /* memory data parity error */
  379. #define    DCBS_DCE    0x00002000    /* data compare error */
  380. #define    DCBS_DDI    0x00004000    /* ddi ready */
  381. #define    DCBS_OAB    0x00008000    /* operation aborted */
  382. #define    DCBS_DSE    0x00010000    /* data strobe early */
  383. #define    DCBS_DSL    0x00020000    /* data strobe late */
  384. #define    DCBS_TOP    0x00040000    /* track offset plus */
  385. #define    DCBS_TOM    0x00080000    /* track offset minus */
  386. #define    DCBS_CCD    0x00100000    /* controller corrected data */
  387. #define    DCBS_HARD    0x00200000    /* hard error */
  388. #define    DCBS_SOFT    0x00400000    /* soft error (retry succesful) */
  389. #define    DCBS_ERR    0x00800000    /* composite error */
  390. #define DCBS_IVC    0x01000000    /* invalid command error */
  391. /* bits 24-27 unused */
  392. #define    DCBS_BSY    0x10000000    /* controller busy */
  393. #define    DCBS_ICC    0x60000000    /* interrupt cause code */
  394. #define    DCBS_INT    0x80000000    /* interrupt generated for this dcb */
  395.  
  396. #define    VDERRBITS    "\20\1HCRC\2HCE\3WPT\4CHE\5DSKI\6UDE\7OCYL\10NRDY\
  397. \11ATA\12SKS\13IVA\14NEM\15DPE\16DCE\17DDI\20OAB\21DSE\22DSL\23TOP\24TOM\
  398. \25CCD\26HARD\27SOFT\30ERR\31IVC\35ABORTED\36FAIL\37COMPLETE\40STARTED"
  399.  
  400. /* drive related errors */
  401. #define    VDERR_DRIVE    (DCBS_SKI|DCBS_OCYL|DCBS_NRDY|DCBS_IVA)
  402. /* controller related errors */
  403. #define    VDERR_CTLR    (DCBS_CHE|DCBS_OAB|DCBS_IVC|DCBS_NEM)
  404. /* potentially recoverable errors */
  405. #define    VDERR_RETRY \
  406.     (VDERR_DRIVE|VDERR_CTLR|DCBS_DCE|DCBS_DPE|DCBS_HCRC|DCBS_HCE)
  407. /* uncorrected data errors */
  408. #define    VDERR_HARD    (VDERR_RETRY|DCBS_WPT|DCBS_UDE)
  409.  
  410. /*
  411.  * DCB status codes.
  412.  */
  413. #define    DCBS_ABORT    0x10000000    /* dcb aborted */
  414. #define    DCBS_FAIL    0x20000000    /* dcb unsuccesfully completed */
  415. #define    DCBS_DONE    0x40000000    /* dcb complete */
  416. #define    DCBS_START    0x80000000    /* dcb started */
  417.  
  418. /*
  419.  * DCB interrupt control.
  420.  */
  421. #define    DCBINT_NONE    0x0        /* don't interrupt */
  422. #define    DCBINT_ERR    0x2        /* interrupt on error */
  423. #define    DCBINT_SUC    0x1        /* interrupt on success */
  424. #define    DCBINT_DONE    (DCBINT_ERR|DCBINT_SUC)
  425. #define    DCBINT_PBA    0x4        /* proceed before acknowledge */
  426.  
  427. /*
  428.  * Sector formats.
  429.  */
  430. typedef union {
  431.     struct {
  432.         dskadr    hdr_addr;
  433.         short    smd_crc;
  434.     } smd;
  435.     struct {
  436.         dskadr    physical;
  437.         dskadr    logical;
  438.         long    smd_e_crc;
  439.     } smd_e;
  440. } fmt_hdr;
  441.  
  442. /* Sector Header bit assignments */
  443. #define    VDMF    0x8000        /* Manufacturer Fault 1=good sector */
  444. #define    VDUF    0x4000        /* User Fault 1=good sector */
  445. #define    VDALT    0x2000        /* Alternate Sector 1=alternate */
  446. #define    VDWPT    0x1000        /* Write Protect 1=Read Only Sector */
  447.  
  448. /* input register assignments for DIOCWFORMAT ioctl */
  449. #define    dk_op        df_reg[0]    /* opcode */
  450. #define    dk_althdr    df_reg[1]    /* alt. sect. dskadr, in an int! */
  451. #define    dk_fmtflags    df_reg[2]    /* header format flags */
  452.  
  453. /* output register assignments for DIOCWFORMAT ioctl */
  454. #define    dk_operrsta    df_reg[0]    /* dcb operrsta */
  455. #define    dk_ecodecnt    df_reg[1]    /* smd-e ecode and error word count */
  456. #define    dk_ecode(ecodecnt)    ((u_long)(ecodecnt) >> 2)
  457. #define    dk_errcnt(ecodecnt)    (((ecodecnt) & 0xffff) << 1)
  458. #define    dk_erraddr    df_reg[2]    /* error dskadr, in an int! */
  459.