home *** CD-ROM | disk | FTP | other *** search
/ OpenStep 4.2J (Developer) / os42jdev.iso / NextDeveloper / Headers / bsd / dev / fd_extern.h < prev    next >
Text File  |  1997-04-27  |  19KB  |  699 lines

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