NAME

     controller, disk, tape, at,  bios,  esdi,  aha1540,  ncr810,
     dosfile, fatfile - controllers, disks and tapes


DESCRIPTION

     The cn* family of devices  refer  to  drivers  that  control
     disks,  disk  like  devices,  and tapes.  MINIX 3 contains a
     number of drivers for several different controllers.   These
     controllers  can  have  disks,  cdroms and tapes attached to
     them.  Boot Monitor  variables  specify  which  drivers  are
     activated using the variables c0, c1, etc.  The names of the
     devices in /dev that correspond with  the  driver  for  con-
     troller 0 are all named beginning with c0.

     For each controller, the minor device numbers are  organized
     as follows:

          minor      device    what?                        obsolete
          0          d0        disk 0                       hd0
          1          d0p0      disk 0, partition 0          hd1
          2          d0p1      disk 0, partition 1          hd2
          3          d0p2      disk 0, partition 2          hd3
          4          d0p3      disk 0, partition 3          hd4
          5          d1        disk 1                       hd5
          6          d1p0      disk 1, partition 0          hd6
          7          d1p1      disk 1, partition 1          hd7
          8          d1p2      disk 1, partition 2          hd8
          9          d1p3      disk 1, partition 3          hd9
          ...        ...
          39         d7p3      disk 7, partition 3          hd39

          64         t0n       tape 0, non-rewinding
          65         t0        tape 0, rewind on close
          66         t1n       tape 1, non-rewinding
          67         t1        tape 1, rewind on close
          ...        ...
          78         t7n       tape 7, non-rewinding
          79         t7        tape 7, rewind on close

          120        r0        raw access device 0
          121        r1        raw access device 1
          ...        ...
          127        r7        raw access device 7

          128        d0p0s0    disk 0, part 0, subpart 0    hd1a
          129        d0p0s1    disk 0, part 0, subpart 1    hd1b
          130        d0p0s2    disk 0, part 0, subpart 2    hd1c
          131        d0p0s3    disk 0, part 0, subpart 3    hd1d
          132        d0p1s0    disk 0, part 1, subpart 0    hd2a
          ...        ...
          144        d1p0s0    disk 1, part 0, subpart 0    hd6a
          ...        ...
          255        d7p3s3    disk 7, part 3, subpart 3    hd39d

     The device names  in  /dev  also  name  the  controller,  of
     course,  so the usual place for the MINIX 3 root device, the
     first subpartition of the second partition of disk 0 on con-
     troller  0  is  /dev/c0d0p1s0.  Note that everything is num-
     bered from 0!  The first controller  is  controller  0,  the
     first disk is disk 0, etc.  So the second partition is p1.

     The fourth column in the table above shows the disk  devices
     names  that  were  used  by previous versions of MINIX 3 for
     what is now controller  0.   These  devices  are  no  longer
     present in /dev.

  Disks
     Most disks are arrays of 512 byte sectors.  The disk devices
     are  normally block devices, which means they are block buf-
     fered by the MINIX 3  file  system  cache  using  1024  byte
     blocks.   The  FS  cache  allows I/O at any byte offset, and
     takes  care  of  cutting  and  pasting   incomplete   blocks
     together.  If one creates a character device for a disk dev-
     ice, then I/O must be in multiples of the disk block size.

     For each disk there is a device that covers the entire disk,
     these  are  named c0d0, c0d1, etc, up to c0d7 for controller
     0.  If a partition table is placed in the  first  sector  of
     the  disk,  then  the  disk is subdivided into regions named
     partitions.  Up to four partitions  may  be  defined,  named
     c0d0p0 to c0d0p3 for disk 0 on controller 0.  To make things
     interesting you can also place  a  partition  table  in  the
     first  sector of a MINIX 3 partition, which divides the par-
     tition into up to four subpartitions.  Normally MINIX  3  is
     installed  into  a single partition, with the root, swap and
     /usr file systems in subpartitions.

     If a partition is an extended partition then it  contains  a
     linked  list of partition tables each of which may specify a
     logical partition.  Up to four of these  logical  partitions
     are presented by the driver as subpartitions of the extended
     partition.

     A sector containing a partition table starts with 446  bytes
     of boot code, followed by four partition table entries of 16
     bytes each, and ends with the magic  number  0xAA55  (little
     endian,  so first 0x55 then 0xAA.)  Partition table informa-
     tion is defined in <ibm/partition.h>:

     /* Description of entry in the partition table.  */

     struct part_entry {
       unsigned char bootind;       /* boot indicator 0/ACTIVE_FLAG      */
       unsigned char start_head;    /* head value for first sector       */
       unsigned char start_sec;     /* sector value + high 2 cyl bits    */
       unsigned char start_cyl;     /* low 8 cylinder bits               */
       unsigned char sysind;        /* system indicator                  */
       unsigned char last_head;     /* h/s/c for the last sector         */
       unsigned char last_sec;
       unsigned char last_cyl;
       unsigned long lowsec;        /* logical first sector              */
       unsigned long size;          /* size of partition in sectors      */
     };

     #define ACTIVE_FLAG     0x80   /* value for active in bootind field */
     #define NR_PARTITIONS   4      /* number of entries in table        */
     #define PART_TABLE_OFF  0x1BE  /* offset of table in boot sector    */

     /* Partition types (sysind). */
     #define NO_PART         0x00   /* unused entry */
     #define MINIX_PART      0x81   /* MINIX 3 partition type */

     The cylinder numbers are encoded in a very strange way, bits
     8  and 9 are in the high two bits of the sector number.  The
     sector numbers count from 1, not 0!   More  useful  are  the
     lowsec  and  size fields however, they simply give the loca-
     tion of the partition  as  an  absolute  sector  offset  and
     length within the drive.

     The partition table entry defined above is specific  to  IBM
     type  disks.  The device drivers use another partition entry
     structure to pass information on a partition.  This is  what
     <minix/partition.h> looks like:

     struct partition {
       u64_t base;              /* byte offset to the partition start */
       u64_t size;              /* number of bytes in the partition */
       unsigned cylinders;      /* disk geometry for partitioning */
       unsigned heads;
       unsigned sectors;
     };

     The base and size fields are the byte offset and length of a
     partition.   The  geometry of the disk is also given for the
     benefit of partition table editors.  This information can be
     obtained from an open disk device with the call:

          ioctl(fd, DIOCGETP, &entry);

     One can change the placement of the device to the lowsec and
     size  fields  of  entry  by using the DIOCSETP call instead.
     Only the base and size fields are used for DIOCSETP.

     The partition tables when read from disk by the  driver  are
     checked and truncated to fit within the primary partition or
     drive.  The first sector  is  normally  left  free  for  the
     partition table.

     The partition tables are read when the in-use  count  (opens
     and  mounts)  changes  from  0  to  1.   So  an idle disk is
     automatically repartitioned on the next access.  This  means
     that DIOCSETP only has effect if the disk is in use.

  Disk-like devices
     Devices like a CD-ROM are treated as  read-only  disks,  and
     can  be accessed using disk devices.  A CD-ROM usually has a
     block size of 2048 bytes, but the  driver  knows  this,  and
     allows  one to read at any byte offset by reading what isn't
     needed into a scratch buffer.

  Tapes
     There are two kinds of  tape  devices:   Non-rewinding,  and
     rewind-on-close.   The  non-rewinding devices treat the tape
     as a series of files.  The rewind-on-close devices  look  at
     the  tape as a single file, and when you close such a device
     the tape is told to rewind.  See mt(1), and  mtio(4)  for  a
     description  of  the  commands that may be sent to the tape,
     either from the command prompt or from a program.

     There are two kinds of  tape  drives:   Fixed  and  variable
     block size tape drives.  Examples of the first kind are car-
     tridge tapes, with a fixed 512 bytes block size.  An Exabyte
     tape  drive  has  a variable block size, with a minimum of 1
     byte and a maximum of 245760 bytes (see the documentation of
     such  devices.)  The maximum is truncated to 32767 bytes for
     Minix-86 and 61440 bytes for Minix-vmd, because  the  driver
     can't move more bytes in a single request.

     A read or write to a fixed block size tape must be a precise
     multiple of the block size, any other count gives results in
     an I/O error.  A read from a variable block sized tape  must
     be  large enough to accept the block that is read, otherwise
     an I/O error will be returned.  A  write  can  be  any  size
     above  the  minimum,  creating a block of that size.  If the
     write count is larger than the maximum block size then  more
     blocks  are  written until the count becomes zero.  The last
     block must be larger than  the  minimum  of  course.   (This
     minimum is often as small as 1 byte, as for the Exabyte.)

     The mt blksize command may be used to select a  fixed  block
     size  for  a  variable block sized tape.  This will speed up
     I/O considerably for small block sizes.  (Some  systems  can
     only use fixed mode and will write an Exabyte tape with 1024
     byte blocks, which read very slow in variable mode.)

     A tape is a sequence of blocks and filemarks.  A tape may be
     opened and blocks may be read from it upto a filemark, after
     that all further reads return 0.  After the tape  is  closed
     and  reopened one can read the blocks following the filemark
     if using a non-rewinding device.  This makes the  tape  look
     like a sequence of files.

     If a tape has been written to or opened in write-only  mode,
     then  a  filemark  is  written if the tape is closed or if a
     space command is issued.  No extra filemark  is  written  if
     the drive is instructed to write filemarks.

  Raw Access Devices
     Under Minix-vmd one can use the raw access devices  to  pro-
     gram  a  SCSI  device entirely from user mode.  The disk and
     tape devices probe for devices when opened, start disks  and
     load  tapes,  but  the raw access devices do nothing at all.
     Given an open file descriptor to any SCSI  character  device
     (not  just the raw access devices) one can use the following
     ioctl:

          ioctl(fd, SCIOCCMD, &scsicmd)

     The structure whose address is passed as the third  argument
     is defined in <sys/scsi.h> as follows:

          struct scsicmd {
            void                     *cmd;
            size_t                   cmdlen;
            void                     *buf;
            size_t                   buflen;
            void                     *sense;
            size_t                   senselen;
            int                      dir;
          };

     Cmd and cmdlen hold the address  and  length  of  an  object
     holding  a  Group  0  or Group 1 SCSI command.  The next two
     fields describe a buffer of at most 8 kilobytes used in  the
     data  in  or out phase.  Dir is 0 if data is to be read from
     the device, 1 if data is written  to  the  device.   If  the
     ioctl  succeeds  then 0 is returned, otherwise -1 with errno
     set to EIO and the request sense info returned in the buffer
     described  by  the  sense and senselen fields.  If the sense
     key is zero on error then a  host  adapter  error  occurred,
     this  means that the device is most likely turned off or not
     present.


DRIVERS

     By setting the Boot variables c0 to c3 under MINIX 3, or  c0
     to  c4  under  Minix-vmd one attaches a set of disk and tape
     devices to a driver.  See boot(8) for a list of  boot  vari-
     ables  that  configure each of these drivers.  The following
     drivers are available:

  at
     The standard IBM/AT  disk  driver  that  also  supports  IDE
     disks.   This  is  the default driver for controller 0 on AT
     class machines.  (Most PCs are in that class.)

  bios
     A disk driver that uses BIOS calls to do disk I/O.  This  is
     the  default  driver  on  anything  but an AT.  (Old XTs and
     PS/2s.)  On an XT this is the best driver you can  use,  but
     on  any  other  machine  this  driver  may be somewhat slow,
     because the system has to switch out of  protected  mode  to
     make  a  BIOS  call.   On  a fast enough machine with a high
     enough setting of DMA_SECTORS (see config(8)) it works  well
     enough.

  esdi
     A hard disk driver for use on some PS/2 models.

  xt (MINIX 3 only)
     A hard disk driver for IBM/XT type hard disks.   Useful  for
     old  286  based  machines that have such a disk.  On XTs you
     are better off with the bios driver.

  aha1540
     A SCSI driver for the  Adaptec  1540  host  adapter  family,
     which  includes the 1540, 1540A, 1540B, 1540C, 1540CF, 1640,
     and 1740.  Also supported is the compatible BusLogic 545.

  ncr810
     This will eventually  become  a  Symbios  810  SCSI  driver.
     (Formerly owned by NCR.)  KJB has read the docs on this card
     three times, but has still done nothing, the lazy bum.

  dosfile
     The "DOS file as disk" driver that is used when MINIX  3  is
     running  under DOS.  It treats a large DOS file as a MINIX 3
     disk.  Only primary partitions are supported, there  are  no
     subpartitions.   This  is the default driver when MINIX 3 is
     started under DOS.

  fatfile
     Uses a large file on a FAT file system as a disk.  It  needs
     one  of  the  other disk drivers to do the actual I/O.  This
     driver only knows how to interpret a FAT file system to find
     the file to use.  With a fast native disk driver this driver
     is much faster than the dosfile driver.


FILES

     /dev/c*d*                Disks devices.

     /dev/c*d*p*              Partitions.

     /dev/c*d*p*s*            Subpartitions.

     /dev/c*t*n, /dev/c*t*    Tapes.

     /dev/c*r*                Raw access devices.


SEE ALSO

     dd(1),  mt(1),  eject(1),   ioctl(2),   int64(3),   mtio(4),
     boot(8), config(8), monitor(8), part(8), repartition(8).


BUGS

     The subpartitioning is incompatible with the  MS-DOS  method
     of extended partitions.  The latter does not map well to the
     sparse minor device number space.

     The primary partition table is sorted by lowsec like  MS-DOS
     does,  subpartition  tables  are not.  Just think about what
     happens when you delete a partition in the MS-DOS scheme.

     Don't move a partition that is mounted or kept open by  some
     process.  The file system may write cached blocks to the new
     location.

     The BIOS driver is not slow at all on a buffered disk.

     Some IDE disks send an interrupt when they spin  down  under
     hardware  power  management.   The  driver  acknowledges the
     interrupt as it is supposed to  do  by  reading  the  status
     register.  The disk then spins up again...  You have to dis-
     able the spin down in the computer setup to fix the problem.


AUTHOR

     Kees J. Bot (kjb@cs.vu.nl)