Annotation of kernel/bsd/dev/fd_extern.h, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
                      3:  *
                      4:  * @APPLE_LICENSE_HEADER_START@
                      5:  * 
                      6:  * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
                      7:  * Reserved.  This file contains Original Code and/or Modifications of
                      8:  * Original Code as defined in and that are subject to the Apple Public
                      9:  * Source License Version 1.1 (the "License").  You may not use this file
                     10:  * except in compliance with the License.  Please obtain a copy of the
                     11:  * License at http://www.apple.com/publicsource and read it before using
                     12:  * this file.
                     13:  * 
                     14:  * The Original Code and all software distributed under the License are
                     15:  * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
                     16:  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
                     17:  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
                     18:  * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
                     19:  * License for the specific language governing rights and limitations
                     20:  * under the License.
                     21:  * 
                     22:  * @APPLE_LICENSE_HEADER_END@
                     23:  */
                     24: 
                     25: /*     @(#)fd_extern.h  2.0    01/25/90        (c) 1990 NeXT   
                     26:  *
                     27:  * fd_vars.h -- Externally used data structures and constants for Floppy 
                     28:  *             Disk driver
                     29:  *
                     30:  * KERNEL VERSION
                     31:  *
                     32:  * HISTORY
                     33:  * 13-May-94   Dean Reece
                     34:  *     Added define and struct for FDIOCGCAPLIST to return possible
                     35:  *     format densities.  Enables workspace to build a menu.
                     36:  * 20-Mar-91   Doug Mitchell
                     37:  *     Made #importing  pmap.h and vm_map.h dependent on #ifdef KERNEL.
                     38:  * 25-Jan-90   Doug Mitchell at NeXT
                     39:  *     Created.
                     40:  *
                     41:  */
                     42:  
                     43: #ifndef        _FDEXTERN_
                     44: #define _FDEXTERN_
                     45: 
                     46: #import <sys/types.h>
                     47: #import <sys/ioctl.h>
                     48: #import <mach/boolean.h>
                     49: #import <mach/vm_param.h>
                     50: #define FD_CMDSIZE     0x10            /* max size of command passed to 
                     51:                                         * controller */
                     52: #define FD_STATSIZE    0x10            /* max size of status array returned
                     53:                                         * from controller */
                     54: #define        FD_MAX_CAP_LIST 8
                     55:                                         
                     56: typedef        int fd_return_t;                /* see FDR_xxx, below */
                     57: 
                     58: struct fd_drive_stat {
                     59:        u_char          media_id:2,     /* media type currently inserted. See
                     60:                                         * FD_MID_xxx, below. */
                     61:                        motor_on:1,     /* state of motor at I/O complete 
                     62:                                         * 1 = on; 0 = off */
                     63:                        write_prot:1,   /* write protect 1 = Write Protected */
                     64:                        drive_present:1,
                     65:                        rsvd1:3;        /* reserved */
                     66: };
                     67: 
                     68: /*
                     69:  * Format Capacity List struct.  Returned by FDIOCGCAPLIST ioctl as a list
                     70:  * of possible format capacities.  Entries are possible capacities
                     71:  * in 1k (1024) units.  List is null terminated, so the useful size is
                     72:  * (FD_MAX_CAP_LIST - 1).
                     73:  */
                     74: struct fd_cap_list {
                     75:        int             capacity[FD_MAX_CAP_LIST];
                     76: };
                     77: 
                     78: /*
                     79:  * I/O request struct. Used in DKIOCREQ ioctl to specify one command sequence
                     80:  * to be executed.
                     81:  */
                     82: struct fd_ioreq {
                     83:        /* 
                     84:         * inputs to driver:
                     85:         */
                     86:        u_char          density;        /* see FD_DENS_xxx, below */
                     87:        int             timeout;        /* I/O timeout in milliseconds. Used
                     88:                                         * in FDCMD_CMD_XFR commands only. */
                     89:        int             command;        /* see FDCMD_xxx, below */
                     90:        u_char          cmd_blk[FD_CMDSIZE];
                     91:                                        /* actual command bytes */
                     92:        u_int           num_cmd_bytes;  /* expected # of bytes in cmd_blk[] to
                     93:                                         * transfer */
                     94:        caddr_t         addrs;          /* source/dest of data */
                     95:        u_int           byte_count;     /* max # of data bytes to move */
                     96:        u_char          stat_blk[FD_STATSIZE];
                     97:                                        /* status returned from controller */
                     98:        u_int           num_stat_bytes; /* number of status bytes to transfer
                     99:                                         * to stat_blk[] */
                    100:        int             flags;          /* see FD_IOF_xxx, below */
                    101:        
                    102:        /*
                    103:         * outputs from driver:
                    104:         */
                    105:        fd_return_t     status;         /* FDR_SUCCESS, etc. */
                    106:        u_int           cmd_bytes_xfr;  /* # of command bytes actually moved */
                    107:        u_int           bytes_xfr;      /* # of data bytes actually moved */
                    108:        u_int           stat_bytes_xfr; /* # if status bytes moved to 
                    109:                                         * stat_blk[] */
                    110:        struct fd_drive_stat drive_stat; /* media ID, etc. */
                    111: 
                    112:        /*
                    113:         * used internally by driver
                    114:         */
                    115:        struct pmap     *pmap;          /* DMA is mapped by this */
                    116:        struct vm_map   *map;           /* map of requestor's task */
                    117:        u_char          unit;           /* drive # (relative to controller) */
                    118: };
                    119: 
                    120: typedef struct fd_ioreq fdIoReq_t;     
                    121: typedef struct fd_ioreq *fd_ioreq_t;
                    122: 
                    123: /*
                    124:  * fd_ioreq.command values 
                    125:  */
                    126: #define FDCMD_BAD              0x00    /* not used */
                    127: #define FDCMD_CMD_XFR          0x01    /* transfer command in fd_ioreq.cmd_blk
                    128:                                         */
                    129: #define FDCMD_EJECT            0x02    /* eject disk */
                    130: #define FDCMD_MOTOR_ON         0x03    /* motor on */
                    131: #define FDCMD_MOTOR_OFF                0x04    /* motor off */
                    132: #define FDCMD_GET_STATUS       0x05    /* Get status (media ID, motor state,
                    133:                                         * write protect) */
                    134: 
                    135: /*
                    136:  * fd_ioreq.density values. Some routines rely on these being in
                    137:  * cardinal order...
                    138:  */
                    139: #define FD_DENS_NONE   0               /* unformatted */
                    140: #define FD_DENS_1      1               /* 1 MByte/disk unformatted */
                    141: #define FD_DENS_2      2               /* 2 MByte/disk unformatted */
                    142: #define FD_DENS_4      3               /* 4 MByte/disk unformatted */
                    143: 
                    144: #if    i386
                    145: #define FD_DENS_DEFAULT        FD_DENS_2
                    146: #else
                    147: #define FD_DENS_DEFAULT FD_DENS_4
                    148: #endif
                    149: 
                    150: /*
                    151:  * fd_ioreq.flags values
                    152:  */
                    153: #define FD_IOF_DMA_DIR         0x00000002
                    154: #define FD_IOF_DMA_RD          0x00000002      /* DMA direction = device to
                    155:                                                 * host */
                    156: #define FD_IOF_DMA_WR          0x00000000      /* DMA direction = host to
                    157:                                                 * device */
                    158:                                                 
                    159: /*
                    160:  * fdr_return_t values
                    161:  */
                    162: #define FDR_SUCCESS            0       /* OK */
                    163: #define FDR_TIMEOUT            1       /* fd_ioreq.timeout exceeded */
                    164: #define FDR_MEMALLOC           2       /* couldn't allocate memory */
                    165: #define FDR_MEMFAIL            3       /* memory transfer error */
                    166: #define FDR_REJECT             4       /* bad field in fd_ioreq */
                    167: #define FDR_BADDRV             5       /* drive not present */
                    168: #define FDR_DATACRC            6       /* media error - data CRC */
                    169: #define FDR_HDRCRC             7       /* media error - header CRC */
                    170: #define FDR_MEDIA              8       /* misc. media error */
                    171: #define FDR_SEEK               9       /* seek error */
                    172: #define FDR_BADPHASE           10      /* controller changed phase 
                    173:                                         * unexpectedly */
                    174: #define FDR_DRIVE_FAIL         11      /* Basic Drive Failure */
                    175: #define FDR_NOHDR              12      /* Header Not Found */
                    176: #define FDR_WRTPROT            13      /* Disk Write Protected */
                    177: #define FDR_NO_ADDRS_MK                14      /* Missing Address Mark */
                    178: #define FDR_CNTRL_MK           15      /* Missing Control Mark */
                    179: #define FDR_NO_DATA_MK         16      /* Missing Data Mark */
                    180: #define FDR_CNTRL_REJECT       17      /* controller rejected command */
                    181: #define FDR_CNTRLR             18      /* Controller Handshake Error */
                    182: #define FDR_DMAOURUN           19      /* DMA Over/underrun */
                    183: #define FDR_VOLUNAVAIL         20      /* Requested Volume not available */
                    184: #define FDR_ALIGN              21      /* DMA alignment error */
                    185: #define FDR_DMA                        22      /* DMA error */
                    186: #define FDR_SPURIOUS           23      /* spurious interrupt */
                    187: 
                    188: /*
                    189:  * fd_drive_stat.media_id values
                    190:  */
                    191: #define FD_MID_NONE            0       /* no disk inserted */
                    192: #define FD_MID_1MB             3       /* 1 MByte unformatted */
                    193: #define FD_MID_2MB             2       /* 2 MByte unformatted */
                    194: #define FD_MID_4MB             1       /* 4 MBytes unformatted */
                    195: 
                    196: #if i386 || hppa
                    197: #define FD_MID_DEFAULT FD_MID_2MB
                    198: #ifdef KERNEL                             /* Maximum Number of bytes of data
                    199:                                                that can be transfered via DMA 
                    200:                                                using FDIOCREQ ioctl command
                    201:                                           */
                    202: 
                    203: #define FD_MAX_DMA_SIZE                PAGE_SIZE 
                    204: #else
                    205: #define FD_MAX_DMA_SIZE                vm_page_size 
                    206: #endif /* KERNEL */
                    207: #endif /* i386 || hppa */
                    208: 
                    209: /*
                    210:  * ioctl's specific to floppy disk
                    211:  */
                    212: #define        FDIOCREQ        _IOWR('f', 0, struct fd_ioreq)  /* cmd request */
                    213: #define FDIOCGFORM     _IOR ('f', 1, struct fd_format_info)
                    214:                                                        /* get format */
                    215: #define FDIOCSDENS     _IOW ('f', 2, int)              /* set density */
                    216: #define FDIOCSSIZE     _IOW ('f', 3, int)              /* set sector size */
                    217: #define FDIOCSGAPL     _IOW ('f', 4, int)              /* set Gap 3 length */
                    218: #define FDIOCRRW       _IOWR('f', 5, struct fd_rawio)  /* raw read/write */
                    219: #define FDIOCSIRETRY   _IOW ('f', 6, int)              /* set inner retry loop
                    220:                                                         * count */
                    221: #define FDIOCGIRETRY   _IOR ('f', 7, int)              /* get inner retry loop
                    222:                                                         * count */
                    223: #define FDIOCSORETRY   _IOW ('f', 8, int)              /* set outer retry loop
                    224:                                                         * count */
                    225: #define FDIOCGORETRY   _IOR ('f', 9, int)              /* get outer retry loop
                    226:                                                         * count */
                    227: #define        FDIOCGCAPLIST   _IOR ('f', 10, struct fd_cap_list)
                    228:                                /* get list of possible format capacities */
                    229: /*
                    230:  *     software registers passed to controller during command sequences 
                    231:  */
                    232:  
                    233: struct fd_rw_cmd {
                    234:        /*
                    235:         * 9 command bytes passed at start of read/write data
                    236:         */
                    237:         
                    238: #if    __LITTLE_ENDIAN__
                    239: 
                    240:        u_char  opcode:5,
                    241:                sk:1,                   /* skip sectors with deleted AM */
                    242:                mfm:1,                  /* MFM encoding */
                    243:                mt:1;                   /* multi track */
                    244:        u_char  drive_sel:2,            /* drive select */
                    245:                hds:1,                  /* head select */
                    246:                rsvd1:5;                /* reserved */
                    247:        u_char  cylinder;
                    248:        u_char  head;
                    249:        u_char  sector;
                    250:        u_char  sector_size;            /* 'n' in the Intel spec. */
                    251:        u_char  eot;                    /* sector # at end of track */
                    252:        u_char  gap_length;             /* gap length */
                    253:        u_char  dtl;                    /* special sector size */
                    254: 
                    255: #elif  __BIG_ENDIAN__
                    256: 
                    257:        u_char  mt:1,                   /* multitrack */
                    258:                mfm:1,                  /* MFM encoding */
                    259:                sk:1,                   /* skip sectors with deleted AM */
                    260:                opcode:5;
                    261:        u_char  rsvd1:5,                /* reserved */
                    262:                hds:1,                  /* head select */
                    263:                drive_sel:2;            /* drive select */
                    264:        u_char  cylinder;
                    265:        u_char  head;
                    266:        u_char  sector;
                    267:        u_char  sector_size;            /* 'n' in the Intel spec. */
                    268:        u_char  eot;                    /* sector # at end of track */
                    269:        u_char  gap_length;             /* gap length */
                    270:        u_char  dtl;                    /* special sector size */
                    271:        
                    272: #else
                    273: #error Floppy command / data structures are compiler sensitive
                    274: #endif
                    275: };
                    276: 
                    277: #define SIZEOF_RW_CMD  9               /* compiler yields 9 as sizeof this
                    278:                                         * struct */
                    279:                                         
                    280: struct fd_rw_stat {
                    281:        /* 
                    282:         * 7 status bytes passed at completion of read/write data 
                    283:         */
                    284: 
                    285:        u_char  stat0;
                    286:        u_char  stat1;
                    287:        u_char  stat2;
                    288:        u_char  cylinder;
                    289:        u_char  head;
                    290:        u_char  sector;
                    291:        u_char  sector_size;            /* 'n' in the Intel spec. */
                    292: };
                    293:  
                    294: #define SIZEOF_RW_STAT 7
                    295: 
                    296: struct fd_int_stat {
                    297:        /* 
                    298:         * result of Sense Interrupt Status command
                    299:         */
                    300:        u_char  stat0;  
                    301:        u_char  pcn;                    /* present cylinder & */
                    302: };
                    303: 
                    304: struct fd_seek_cmd {
                    305:        /* 
                    306:         * Seek command. Uses Sense Interrupt Status to get results.
                    307:         */
                    308:         
                    309: #if    __LITTLE_ENDIAN__
                    310: 
                    311:        u_char  opcode:6,               /* will be FCCMD_SEEK */
                    312:                dir:1,                  /* 1 == towards spindle for 
                    313:                                                relative seek*/
                    314:                relative:1;             /* 1 = relative */
                    315:        u_char  drive_sel:2,            /* drive select */
                    316:                hds:1,                  /* head select */
                    317:                rsvd1:5;                /* reserved */
                    318:        u_char  cyl;                    /* cylinder # or offset */
                    319:        
                    320: #elif  __BIG_ENDIAN__
                    321: 
                    322:        u_char  relative:1,             /* 1 = relative */
                    323:                dir:1,                  /* 1 == towards spindle */
                    324:                opcode:6;               /* will be FCCMD_SEEK */
                    325:        u_char  rsvd1:5,                /* reserved */
                    326:                hds:1,                  /* head select */
                    327:                drive_sel:2;            /* drive select */
                    328:        u_char  cyl;                    /* cylinder # or offset */
                    329:        
                    330: #else
                    331: #error Floppy command / data structures are compiler sensitive
                    332: #endif
                    333: };
                    334: 
                    335: #define SEEK_DIR_IN            1               /* seek towards spindle */
                    336: #define SEEK_DIR_OUT           0               /* seek away from spindle */
                    337: 
                    338: #define SIZEOF_SEEK_CMD                3
                    339: 
                    340: struct fd_recal_cmd {
                    341:        /* 
                    342:         * Recalibrate command. Uses Sense Interrupt Status to get results.
                    343:         */
                    344:        u_char  opcode;                 /* will be FCCMD_RECAL */
                    345:        
                    346: #if    __LITTLE_ENDIAN__
                    347: 
                    348:        u_char  drive_sel:2,            /* drive select */
                    349:                rsvd1:6;                /* reserved */
                    350:        
                    351: #elif  __BIG_ENDIAN__
                    352: 
                    353:        u_char  rsvd1:6,                /* reserved */
                    354:                drive_sel:2;            /* drive select */
                    355:        
                    356: #else
                    357: #error Floppy command / data structures are compiler sensitive
                    358: #endif
                    359: };
                    360:        
                    361: struct fd_configure_cmd {
                    362:        /*
                    363:         * configure command. No result bytes are returned.
                    364:         */
                    365:        u_char  opcode;                 /* will be FCCMD_CONFIGURE */
                    366:        u_char  rsvd1;                  /* must be 0 */
                    367:        u_char  conf_2;                 /* EIS, EFIFO, etc. */
                    368:        u_char  pretrk;                 /* write precomp track # */
                    369: };
                    370: 
                    371: /*
                    372:  * configure command fields 
                    373:  */
                    374: #define CF2_EIS                        0x40    /* enable implied seek */
                    375: #define CF2_EFIFO              0x20    /* enable FIFO. True Low. */
                    376: #define CF2_DPOLL              0x10    /* disable polling */
                    377: #define CF2_FIFO_DEFAULT       0x08    /* OUR default FIFO threshold */
                    378: #define CF_PRETRACK            0x00    /* OUR default precom track */
                    379: #define I82077_FIFO_SIZE       0x10    /* size of FIFO */
                    380: 
                    381: struct fd_specify_cmd {
                    382:        /*
                    383:         * Specify command. No result bytes are returned.
                    384:         */
                    385:        u_char  opcode;                 /* will be FCCMD_SPECIFY */
                    386:        
                    387: #if    __LITTLE_ENDIAN__
                    388: 
                    389:        u_char  hut:4,                  /* head unload time */
                    390:                srt:4;                  /* step rate */
                    391:        u_char  nd:1,                   /* Non-DMA mode */
                    392:                hlt:7;                  /* head load time */
                    393:        
                    394: #elif  __BIG_ENDIAN__
                    395: 
                    396:        u_char  srt:4,                  /* step rate */
                    397:                hut:4;                  /* head unload time */
                    398:        u_char  hlt:7,                  /* head load time */
                    399:                nd:1;                   /* Non-DMA mode */
                    400:        
                    401: #else
                    402: #error Floppy command / data structures are compiler sensitive
                    403: #endif
                    404: };
                    405: 
                    406: #define SIZEOF_SPECIFY_CMD     3
                    407: 
                    408: struct fd_readid_cmd {
                    409:        /* 
                    410:         * Read ID command. Returns status in an fd_rw_stat.
                    411:         */
                    412:         
                    413: #if    __LITTLE_ENDIAN__
                    414: 
                    415:        u_char  opcode:6,               /* Will be FCCMD_READID */
                    416:                mfm:1,
                    417:                rsvd1:1;
                    418:        u_char  drive_sel:2,            /* drive select */
                    419:                hds:1,                  /* head select */
                    420:                rsvd2:5;                /* reserved */
                    421:        
                    422: #elif  __BIG_ENDIAN__
                    423: 
                    424:        u_char  rsvd1:1,
                    425:                mfm:1,
                    426:                opcode:6;               /* Will be FCCMD_READID */
                    427:        u_char  rsvd2:5,                /* reserved */
                    428:                hds:1,                  /* head select */
                    429:                drive_sel:2;            /* drive select */
                    430:        
                    431: #else
                    432: #error Floppy command / data structures are compiler sensitive
                    433: #endif
                    434: };
                    435: 
                    436: struct fd_perpendicular_cmd {
                    437:        u_char  opcode;                 /* will be FCCMD_PERPENDICULAR */
                    438:        
                    439: #if    __LITTLE_ENDIAN__
                    440: 
                    441:        u_char  gap:1,
                    442:                wgate:1,
                    443:                rsvd1:6;                /* must be 0 */
                    444:        
                    445: #elif  __BIG_ENDIAN__
                    446: 
                    447:        u_char  rsvd1:6,                /* must be 0 */
                    448:                wgate:1,
                    449:                gap:1;
                    450:        
                    451: #else
                    452: #error Floppy command / data structures are compiler sensitive
                    453: #endif
                    454: };
                    455: 
                    456: struct fd_format_cmd {
                    457:        /*
                    458:         * Format track command. Returns status in an fd_rw_stat
                    459:         * (with undefined address fields).
                    460:         */
                    461:         
                    462: #if    __LITTLE_ENDIAN__
                    463: 
                    464:        u_char  opcode:6,               /* will be FCCMD_FORMAT */
                    465:                mfm:1,
                    466:                rsvd1:1;
                    467:        u_char  drive_sel:2,            /* drive select */
                    468:                hds:1,                  /* head select */
                    469:                rsvd2:5;                /* reserved */
                    470:        
                    471: #elif  __BIG_ENDIAN__
                    472: 
                    473:        u_char  rsvd1:1,
                    474:                mfm:1,
                    475:                opcode:6;               /* will be FCCMD_FORMAT */
                    476:        u_char  rsvd2:5,                /* reserved */
                    477:                hds:1,                  /* head select */
                    478:                drive_sel:2;            /* drive select */
                    479:        
                    480: #else
                    481: #error Floppy command / data structures are compiler sensitive
                    482: #endif
                    483:        u_char  n;                      /* sector size (2**n * 128 = sect_size)
                    484:                                         */
                    485:        u_char  sects_per_trk;
                    486:        u_char  gap_length;
                    487:        u_char  filler_data;            /* data field written with this byte */
                    488: };
                    489: 
                    490: struct fd_sense_drive_status_cmd {
                    491:        /*
                    492:         * returns one result byte which is basically status register 3
                    493:         */
                    494: 
                    495:        u_char  opcode;         /* will be FCCMD_DRIVE_STATUS */
                    496:        
                    497: #if    __LITTLE_ENDIAN__
                    498: 
                    499:        u_char  drive_sel:2,    /* drive select */
                    500:                hds:1,          /* head select */
                    501:                resvd2:5;       /* always zero */
                    502:        
                    503: #elif  __BIG_ENDIAN__
                    504: 
                    505:        u_char  resvd2:5,       /* always zero */
                    506:                hds:1,          /* head select */
                    507:                drive_sel:2;    /* drive select */
                    508:        
                    509: #else
                    510: #error Floppy command / data structures are compiler sensitive
                    511: #endif
                    512: };
                    513: 
                    514: /*
                    515:  *     software register values
                    516:  */
                    517:  
                    518: /*
                    519:  * cmd (command byte). Not all of these opcodes are used with the fd_rw_cmd 
                    520:  * struct...
                    521:  */
                    522: #define FCCMD_OPCODE_MASK      0x1F
                    523: #define        FCCMD_MULTITRACK        0x80
                    524: #define FCCMD_MFM              0x40            /* MFM flag */
                    525: #define FCCMD_SK               0x20            /* skip flag */
                    526: #define FCCMD_READ             0x06
                    527: #define FCCMD_READ_DELETE      0x0C
                    528: #define FCCMD_WRITE            0x05
                    529: #define FCCMD_WRITE_DELETE     0x09
                    530: #define FCCMD_READ_TRACK       0x02
                    531: #define FCCMD_VERIFY           0x16
                    532: #define FCCMD_VERSION          0x10
                    533: #define FCCMD_FORMAT           0x0D
                    534: #define FCCMD_RECAL            0x07
                    535: #define FCCMD_INTSTAT          0x08            /* sense interrupt status */
                    536: #define FCCMD_SPECIFY          0x03
                    537: #define FCCMD_DRIVE_STATUS     0x04
                    538: #define FCCMD_SEEK             0x0F
                    539: #define FCCMD_CONFIGURE                0x13
                    540: #define FCCMD_DUMPREG          0x0E
                    541: #define FCCMD_READID           0x0A            /* Read ID */
                    542: #define FCCMD_PERPENDICULAR    0x12            /* perpendicular recording mode
                    543:                                                 */
                    544: /* 
                    545:  * rws_stat0 (status register 0)
                    546:  */
                    547: #define SR0_INTCODE            0xC0    /* interrupt code - see INTCODE_xxx */
                    548: #define INTCODE_COMPLETE       0x00    /* normal I/O complete */
                    549: #define INTCODE_ABNORMAL       0x40    /* abnormal termination */
                    550: #define INTCODE_INVALID                0x80    /* Invalid command */
                    551: #define INTCODE_POLL_TERM      0xC0    /* abnormal termination caused by 
                    552:                                         * polling */
                    553: #define SR0_SEEKEND            0x20    /* Seek End */
                    554: #define SR0_EQ_CHECK           0x10    /* Equipment check (recal failed,
                    555:                                         *    seek beyond track 0, etc.) */
                    556: #define SR0_HEAD               0x04    /* current head address */
                    557: #define SR0_DRVSEL             0x03
                    558: #define SR0_DRVSEL1            0x02    /* Drive Select 1 */
                    559: #define SR0_DRVSEL0            0x01    /* Drive Select 0 */
                    560: 
                    561: /*
                    562:  * rws_stat1 (status register 1)
                    563:  */
                    564: #define SR1_EOCYL              0x80    /* end of cylinder */
                    565: #define SR1_CRCERR             0x20    /* data or ID CRC error */
                    566: #define SR1_OURUN              0x10    /* DMA over/underrun */
                    567: #define SR1_NOHDR              0x04    /* Header Not Found */
                    568: #define SR1_NOT_WRT            0x02    /* Not writable */
                    569: #define SR1_MISS_AM            0x01    /* Missing Address mark */
                    570: 
                    571: /*
                    572:  * rws_stat2 (status register 2)
                    573:  */
                    574: #define SR2_CNTRL_MK           0x40    /* control mark */
                    575: #define SR2_DATACRC            0x20    /* Data CRC error */
                    576: #define SR2_WRONG_CYL          0x10    /* wrong cylinder */
                    577: #define SR2_BAD_CYL            0x02    /* Bad cylinder */
                    578: #define SR2_MISS_AM            0x01    /* missing data mark */
                    579: 
                    580: /*
                    581:  * rws_stat3 (status register 3)
                    582:  */
                    583: #define SR3_WP                 0x40    /* write protected */
                    584: #define SR3_TRACK0             0x10    /* Track 0 */
                    585: #define SR3_HEAD               0x04    /* Head # */
                    586: #define SR3_DRVSEL1            0x02    /* same as status register 0?? */
                    587: #define SR3_DEVSEL0            0x01    
                    588: 
                    589: /*
                    590:  * disk info - maps media_id to tracks_per_cyl and num_cylinders.
                    591:  */
                    592: struct fd_disk_info {
                    593:        u_int   media_id;                       /* FD_MID_1MB, etc. */
                    594:        u_char  tracks_per_cyl;                 /* # of heads */
                    595:        u_int   num_cylinders;  
                    596:        u_int   max_density;                    /* maximum legal density.
                    597:                                                 * (FD_DENS_1, etc.) */
                    598: };
                    599: 
                    600: /*
                    601:  * sector size info - maps sector size to 82077 sector size code and
                    602:  * gap3 length.  Note that the controller must be programmed for different
                    603:  * gap3 size when formatting as opposed to reading or writing.  Since gap3
                    604:  * sizes may be dependent on the actual disk hardware, the fmt gap is
                    605:  * maintained here to avoid requiring the formatter to determine
                    606:  * the disk device type.
                    607:  */
                    608: struct fd_sectsize_info {
                    609:        u_int           sect_size;              /* in bytes */
                    610:        u_char          n;                      /* 82077 sectsize code */
                    611:        u_int           sects_per_trk;          /* physical sectors per trk */
                    612:        u_char          rw_gap_length;          /* Gap 3 for rw cmds */ 
                    613:        u_char          fmt_gap_length;         /* Gap 3 for fmt cmds */ 
                    614: };
                    615: 
                    616: typedef struct fd_sectsize_info fd_sectsize_info_t;
                    617: 
                    618: /*
                    619:  * density info - maps density to capacity. Note that a disk may be formatted
                    620:  * with a lower density than its max possible density.
                    621:  */
                    622: struct fd_density_info {
                    623:        u_int           density;                /* FD_DENS_1, etc. */
                    624:        u_int           capacity;               /* in bytes */
                    625:        boolean_t       mfm;                    /* TRUE = MFM encoding */
                    626: };
                    627: 
                    628: typedef struct fd_density_info fd_density_info_t;
                    629: 
                    630: /*
                    631:  * disk format info. Used with ioctl(FDIOCGFORM).
                    632:  */
                    633: struct fd_format_info {
                    634:        /*
                    635:         * the disk_info struct is always valid as long as a disk is
                    636:         * inserted.
                    637:         */
                    638:        struct fd_disk_info     disk_info;
                    639:        
                    640:        int                     flags;          /* See FFI_xxx, below */
                    641: 
                    642:        /*
                    643:         * the remainder is only valid if (flags & FFI_FORMATTED) is true.
                    644:         */
                    645:        struct fd_density_info  density_info;
                    646:        struct fd_sectsize_info sectsize_info;
                    647:        u_int                   total_sects;    /* total # of sectors on 
                    648:                                                 * disk */
                    649: };
                    650: 
                    651: /*
                    652:  * fd_format_info.flags fields
                    653:  */
                    654: #define FFI_FORMATTED          0x00000001      /* known disk format */
                    655: #define FFI_LABELVALID         0x00000002      /* Valid NeXT file system label
                    656:                                                 * present */
                    657: #define FFI_WRITEPROTECT       0x00000004      /* disk is write protected */
                    658:                                                 
                    659: struct format_data {
                    660:        /* 
                    661:         * one of these per sector. A Format command involves DMA'ing one of 
                    662:         * these for each sector on a track. The format command is executed
                    663:         * with a FDIOCREQ ioctl.
                    664:         */
                    665:        u_char cylinder;
                    666:        u_char head;
                    667:        u_char sector;
                    668:        u_char n;                       /* as in sector_size = 2**n * 128 */
                    669: };
                    670: 
                    671: /*
                    672:  * result of FCCMD_DUMPREG command
                    673:  */
                    674: struct fd_82077_regs {
                    675:        u_char  pcn[4];         /* cylinder # for drives 0..3 */
                    676:        u_char  srt:4,
                    677:                hut:4;
                    678:        u_char  hlt:7,
                    679:                nd:1;
                    680:        u_char  sc_eot;
                    681:        u_char  rsvd1;
                    682:        u_char  rsvd2:1,
                    683:                eis:1,
                    684:                efifo:1,
                    685:                poll:1,
                    686:                fifothr:4;
                    687:        u_char  pretrk;
                    688: };
                    689: 
                    690: /*
                    691:  * Used for FDIOCRRW - raw disk I/O 
                    692:  * -- no bad block mapping
                    693:  * -- no label required
                    694:  * -- no front porch 
                    695:  * -- block size = physical sector size
                    696:  */
                    697: struct fd_rawio {
                    698:        /*
                    699:         * Passed to driver
                    700:         */
                    701:        u_int           sector;
                    702:        u_int           sector_count;
                    703:        caddr_t         dma_addrs;
                    704:        boolean_t       read;           /* TRUE = read; FALSE = write */
                    705:        /*
                    706:         * Returned from driver
                    707:         */
                    708:        fd_return_t     status;         /* FDR_xxx (see above) */
                    709:        u_int           sects_xfr;      /* sectors actually moved */
                    710: };
                    711: 
                    712: /*
                    713:  * misc. hardware constants
                    714:  */
                    715: #define NUM_FD_HEADS   2               /* number of tracks/cylinder */
                    716: #define NUM_FD_CYL     80              /* cylinders/disk (is this actually a 
                    717:                                         * constant for all densities?) */
                    718: #define FD_PARK_TRACK  79              /* track to which to seek before
                    719:                                         * eject */
                    720: #define NUM_UNITS      4               /* max # of drives per controller */ 
                    721: 
                    722: #endif /* _FDEXTERN_ */

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.