Subversion Repositories planix.SVN

Rev

Blame | Last modification | View Log | RSS feed

enum {
        Maxtrack        = 200,
        Ntrack          = Maxtrack+1,
        BScdrom         = 2048,         /* mmc data block size */
        BScdda          = 2352,
        BScdxa          = 2336,
        BSmax           = 2352,

        Maxfeatures     = 512,

        /* scsi peripheral device types, SPC-3 §6.4.2 */
        TypeDA          = 0,            /* Direct Access (SBC) */
        TypeSA          = 1,            /* Sequential Access (SSC) */
        TypeWO          = 4,            /* Worm (SBC)*/
        TypeCD          = 5,            /* CD/DVD/BD (MMC) */
        TypeMO          = 7,            /* rewriteable Magneto-Optical (SBC) */
        TypeMC          = 8,            /* Medium Changer (SMC) */

        /* MMC device types */
        Mmcnone = 0,
        Mmccd,
        Mmcdvdminus,
        Mmcdvdplus,
        Mmcbd,

        /* disc or track types */
        TypeNone        = 0,
        TypeAudio,
        TypeAwritable,
        TypeData,
        TypeDwritable,
        TypeDisk,
        TypeBlank,

        /* disc writability classes */
        Readonly        = 0,            /* -ROM */
        Write1,                         /* -R: write once only */
        Erasewrite,                     /* -R[WE]: erase then write */
        Ram,                            /* -RAM: read & write unrestricted */

        /* tri-state flags */
        Unset           = -1,
        No,
        Yes,

        /* offsets in Pagcapmechsts mode page; see MMC-3 §5.5.10 */
        Capread         = 2,
        Capwrite        = 3,
        Capmisc         = 5,

        /* device capabilities in Pagcapmechsts mode page */
        Capcdr          = 1<<0,         /* bytes 2 & 3 */
        Capcdrw         = 1<<1,
        Captestwr       = 1<<2,
        Capdvdrom       = 1<<3,
        Capdvdr         = 1<<4,
        Capdvdram       = 1<<5,
        Capcdda         = 1<<0,         /* Capmisc bits */
        Caprw           = 1<<2,

        /* Pagwrparams mode page offsets */
        Wpwrtype        = 2,            /* write type */
        Wptrkmode,                      /* track mode */
        Wpdatblktype,
        Wpsessfmt       = 8,
        Wppktsz         = 10,           /* BE ulong: # user data blks/fixed pkt */

        /* Pagwrparams bits */
        Bufe    = 1<<6, /* Wpwrtype: buffer under-run free recording enable */
        /* Wptrkmode */
        Msbits  = 3<<6,         /* multisession field */
        Msnonext= 0<<6,         /* no next border nor session */
        Mscdnonext= 1<<6,       /* cd special: no next session */
        Msnext  = 3<<6,         /* next session or border allowed */
        Fp      = 1<<5,         /* pay attention to Wppktsz */

        /* close track session cdb bits */
        Closetrack      = 1,
        Closesessfinal  = 2,    /* close session / finalize disc */
        Closefinaldvdrw = 3,    /* dvd-rw special: finalize */
        /* dvd+r dl special: close session, write extended lead-out */
        Closesessextdvdrdl = 4,
        Closefinal30mm  = 5,    /* dvd+r special: finalize with ≥30mm radius */
        Closedvdrbdfinal= 6,    /* dvd+r, bd-r special: finalize */

        /* read toc format values */
        Tocfmttoc       = 0,
        Tocfmtsessnos   = 1,
        Tocfmtqleadin   = 2,
        Tocfmtqpma      = 3,
        Tocfmtatip      = 4,
        Tocfmtcdtext    = 5,

        /* read toc cdb[1] bit */
        Msfbit  = 1<<1,

        /* write types, MMC-6 §7.5.4.9 */
        Wtpkt   = 0,            /* a.k.a. incremental */
        Wttrackonce,
        Wtsessonce,             /* a.k.a. disc-at-once */
        Wtraw,
        Wtlayerjump,

        /* track modes (determine: are these also track types?) */
        Tmcdda  = 0,            /* audio cdda */
        Tm2audio,               /* 2 audio channels */
        Tmunintr = 4,           /* data, recorded uninterrupted */
        Tmintr,                 /* data, recorded interrupted (dvd default) */

        /* data block types */
        Dbraw = 0,              /* 2352 bytes */
        Db2kdata = 8,           /* mode 1: 2K of user data */
        Db2336,                 /* mode 2: 2336 bytes of user data */

        /* session formats */
        Sfdata  = 0,
        Sfcdi   = 0x10,
        Sfcdxa  = 0x20,

        /* Cache control bits in mode page 8 byte 2 */
        Ccrcd   = 1<<0,         /* read cache disabled */
        Ccmf    = 1<<1,         /* multiplication factor */
        Ccwce   = 1<<2,         /* writeback cache enabled */
        Ccsize  = 1<<3, /* use `cache segment size', not `# of cache segments' */
        Ccdisc  = 1<<4,         /* discontinuity */
        Cccap   = 1<<5,         /* caching analysis permitted */
        Ccabpf  = 1<<6,         /* abort pre-fetch */
        Ccic    = 1<<7,         /* initiator control */

        /* drive->cap bits */
        Cwrite  = 1<<0,
        Ccdda   = 1<<1,

        CDNblock = 12,          /* chosen for CD */
        DVDNblock = 16,         /* DVD ECC block is 16 sectors */
        BDNblock = 32,          /* BD ECC block (`cluster') is 32 sectors */
                                /* BD-R are write-once in increments of 64KB */
        /*
         * make a single transfer fit in a 9P rpc.  if we don't do this,
         * remote access (e.g., via /mnt/term/dev/sd*) fails mysteriously.
         */
        Readblock = 8192/BScdrom,
};

typedef struct Buf Buf;
typedef struct Dev Dev;
typedef struct Drive Drive;
typedef struct Msf Msf;         /* minute, second, frame */
typedef struct Otrack Otrack;
typedef struct Track Track;
typedef schar Tristate;

struct Msf {
        int     m;
        int     s;
        int     f;
};

struct Track
{
        /* initialized while obtaining the toc (gettoc) */
        vlong   size;           /* total size in bytes */
        long    bs;             /* block size in bytes */
        ulong   beg;            /* beginning block number */
        ulong   end;            /* ending block number */
        int     type;
        Msf     mbeg;
        Msf     mend;

        /* initialized by fs */
        char    name[32];
        int     mode;
        ulong   mtime;
};

struct DTrack                   /* not used */
{
        uchar   name[32];
        uchar   beg[4];         /* msf value; only used for audio */
        uchar   end[4];         /* msf value; only used for audio */
        uchar   size[8];
        uchar   magic[4];
};

struct Otrack
{
        Track   *track;
        Drive   *drive;
        int     nchange;
        int     omode;
        Buf     *buf;

        int     nref;           /* kept by file server */
};

struct Dev
{
        Otrack* (*openrd)(Drive *d, int trackno);
        Otrack* (*create)(Drive *d, int bs);
        long    (*read)(Otrack *t, void *v, long n, vlong off);
        long    (*write)(Otrack *t, void *v, long n);
        void    (*close)(Otrack *t);
        int     (*gettoc)(Drive*);
        int     (*fixate)(Drive *d);
        char*   (*ctl)(Drive *d, int argc, char **argv);
        char*   (*setspeed)(Drive *d, int r, int w);
};

struct Drive
{
        QLock;
        Scsi;

        int     type;                   /* scsi peripheral device type: Type?? */

        /* disc characteristics */
        int     mmctype;                /* cd, dvd, or bd */
        char    *dvdtype;               /* name of dvd flavour */
        char    *laysfx;                /* layer suffix (e.g., -dl) */
        int     firsttrack;
        int     invistrack;
        int     ntrack;
        int     nchange;                /* compare with the members in Scsi */
        ulong   changetime;             /* " */
        int     relearn;                /* need to re-learn the disc? */
        int     nameok;
        int     writeok;                /* writable disc? */
        /*
         * we could combine these attributes into a single variable except
         * that we discover them separately sometimes.
         */
        Tristate recordable;            /* writable by burning? */
        Tristate erasable;              /* writable after erasing? */

        Track   track[Ntrack];
        ulong   end;                    /* # of blks on current disc */
        ulong   cap;                    /* drive capabilities */
        uchar   blkbuf[BScdda];

        int     maxreadspeed;
        int     maxwritespeed;
        int     readspeed;
        int     writespeed;
        Dev;

        uchar   features[Maxfeatures/8];

        void *aux;              /* kept by driver */
};

struct Buf
{
        uchar   *data;          /* buffer */
        vlong   off;            /* data[0] at offset off in file */
        int     bs;             /* block size */
        long    ndata;          /* no. valid bytes in data */
        int     nblock;         /* total buffer size in blocks */
        int     omode;          /* OREAD, OWRITE */
        long    (*fn)(Buf*, void*, long, ulong); /* read, write */

        /* used only by client */
        Otrack  *otrack;
};

extern int      vflag;