17dd7cddfSDavid du Colombier #pragma src "/sys/src/libdisk" 27dd7cddfSDavid du Colombier #pragma lib "libdisk.a" 37dd7cddfSDavid du Colombier 47dd7cddfSDavid du Colombier /* SCSI interface */ 57dd7cddfSDavid du Colombier typedef struct Scsi Scsi; 67dd7cddfSDavid du Colombier struct Scsi { 780ee5cbfSDavid du Colombier QLock; 87dd7cddfSDavid du Colombier char* inquire; 97dd7cddfSDavid du Colombier int rawfd; 107dd7cddfSDavid du Colombier int nchange; 117dd7cddfSDavid du Colombier ulong changetime; 127dd7cddfSDavid du Colombier }; 137dd7cddfSDavid du Colombier 147dd7cddfSDavid du Colombier enum { 157dd7cddfSDavid du Colombier Sread = 0, 167dd7cddfSDavid du Colombier Swrite, 177dd7cddfSDavid du Colombier Snone, 187dd7cddfSDavid du Colombier }; 197dd7cddfSDavid du Colombier 207dd7cddfSDavid du Colombier char* scsierror(int, int); 217dd7cddfSDavid du Colombier int scsicmd(Scsi*, uchar*, int, void*, int, int); 227dd7cddfSDavid du Colombier int scsi(Scsi*, uchar*, int, void*, int, int); 237dd7cddfSDavid du Colombier Scsi* openscsi(char*); 24af6a38e6SDavid du Colombier void closescsi(Scsi*); 257dd7cddfSDavid du Colombier int scsiready(Scsi*); 267dd7cddfSDavid du Colombier 277dd7cddfSDavid du Colombier extern int scsiverbose; 287dd7cddfSDavid du Colombier 297dd7cddfSDavid du Colombier /* disk partition interface */ 307dd7cddfSDavid du Colombier typedef struct Disk Disk; 317dd7cddfSDavid du Colombier struct Disk { 327dd7cddfSDavid du Colombier char *prefix; 339a747e4fSDavid du Colombier char *part; 347dd7cddfSDavid du Colombier int fd; 357dd7cddfSDavid du Colombier int wfd; 367dd7cddfSDavid du Colombier int ctlfd; 377dd7cddfSDavid du Colombier int rdonly; 387dd7cddfSDavid du Colombier int type; 397dd7cddfSDavid du Colombier 407dd7cddfSDavid du Colombier vlong secs; 417dd7cddfSDavid du Colombier vlong secsize; 427dd7cddfSDavid du Colombier vlong size; 437dd7cddfSDavid du Colombier vlong offset; /* within larger disk, perhaps */ 447dd7cddfSDavid du Colombier int width; /* of disk size in bytes as decimal string */ 457dd7cddfSDavid du Colombier int c; 467dd7cddfSDavid du Colombier int h; 477dd7cddfSDavid du Colombier int s; 487dd7cddfSDavid du Colombier int chssrc; 497dd7cddfSDavid du Colombier }; 507dd7cddfSDavid du Colombier 517dd7cddfSDavid du Colombier Disk* opendisk(char*, int, int); 527dd7cddfSDavid du Colombier 537dd7cddfSDavid du Colombier enum { 547dd7cddfSDavid du Colombier Tfile = 0, 557dd7cddfSDavid du Colombier Tsd, 567dd7cddfSDavid du Colombier Tfloppy, 577dd7cddfSDavid du Colombier 587dd7cddfSDavid du Colombier Gpart = 0, /* partition info source */ 597dd7cddfSDavid du Colombier Gdisk, 607dd7cddfSDavid du Colombier Gguess, 617dd7cddfSDavid du Colombier }; 62fd362a73SDavid du Colombier enum { /* SCSI command codes */ 63fd362a73SDavid du Colombier ScmdTur = 0x00, /* test unit ready */ 64fd362a73SDavid du Colombier ScmdRewind = 0x01, /* rezero/rewind */ 65fd362a73SDavid du Colombier ScmdRsense = 0x03, /* request sense */ 66fd362a73SDavid du Colombier ScmdFormat = 0x04, /* format unit */ 67fd362a73SDavid du Colombier ScmdRblimits = 0x05, /* read block limits */ 68fd362a73SDavid du Colombier ScmdRead = 0x08, /* read */ 69fd362a73SDavid du Colombier ScmdWrite = 0x0A, /* write */ 70fd362a73SDavid du Colombier ScmdSeek = 0x0B, /* seek */ 71fd362a73SDavid du Colombier ScmdFmark = 0x10, /* write filemarks */ 72fd362a73SDavid du Colombier ScmdSpace = 0x11, /* space forward/backward */ 73fd362a73SDavid du Colombier ScmdInq = 0x12, /* inquiry */ 74fd362a73SDavid du Colombier ScmdMselect6 = 0x15, /* mode select */ 75fd362a73SDavid du Colombier ScmdMselect10 = 0x55, /* mode select */ 76fd362a73SDavid du Colombier ScmdMsense6 = 0x1A, /* mode sense */ 77fd362a73SDavid du Colombier ScmdMsense10 = 0x5A, /* mode sense */ 78fd362a73SDavid du Colombier ScmdStart = 0x1B, /* start/stop unit */ 79fd362a73SDavid du Colombier ScmdRcapacity = 0x25, /* read capacity */ 80fd362a73SDavid du Colombier ScmdRcapacity16 = 0x9e, /* long read capacity */ 81*27522402SDavid du Colombier ScmdRformatcap = 0x23, /* read format capacity */ 82fd362a73SDavid du Colombier ScmdExtread = 0x28, /* extended read (10 bytes) */ 83fd362a73SDavid du Colombier ScmdRead16 = 0x88, /* long read (16 bytes) */ 84fd362a73SDavid du Colombier ScmdExtwrite = 0x2A, /* extended write (10 bytes) */ 85*27522402SDavid du Colombier ScmdExtwritever = 0x2E, /* extended write and verify (10) */ 86*27522402SDavid du Colombier ScmdWrite16 = 0x8A, /* long write (16 bytes) */ 87fd362a73SDavid du Colombier ScmdExtseek = 0x2B, /* extended seek */ 88fd362a73SDavid du Colombier 89fd362a73SDavid du Colombier ScmdSynccache = 0x35, /* flush cache */ 90fd362a73SDavid du Colombier ScmdRTOC = 0x43, /* read TOC data */ 91fd362a73SDavid du Colombier ScmdRdiscinfo = 0x51, /* read disc information */ 92fd362a73SDavid du Colombier ScmdRtrackinfo = 0x52, /* read track information */ 93fd362a73SDavid du Colombier ScmdReserve = 0x53, /* reserve track */ 94fd362a73SDavid du Colombier ScmdBlank = 0xA1, /* blank *-RW media */ 95fd362a73SDavid du Colombier 96fd362a73SDavid du Colombier ScmdCDpause = 0x4B, /* pause/resume */ 97fd362a73SDavid du Colombier ScmdCDstop = 0x4E, /* stop play/scan */ 98fd362a73SDavid du Colombier ScmdCDplay = 0xA5, /* play audio */ 99fd362a73SDavid du Colombier ScmdCDload = 0xA6, /* load/unload */ 100fd362a73SDavid du Colombier ScmdCDscan = 0xBA, /* fast forward/reverse */ 101fd362a73SDavid du Colombier ScmdCDstatus = 0xBD, /* mechanism status */ 102fd362a73SDavid du Colombier Scmdgetconf = 0x46, /* get configuration */ 103fd362a73SDavid du Colombier 104fd362a73SDavid du Colombier ScmdEInitialise = 0x07, /* initialise element status */ 105fd362a73SDavid du Colombier ScmdMMove = 0xA5, /* move medium */ 106fd362a73SDavid du Colombier ScmdEStatus = 0xB8, /* read element status */ 107fd362a73SDavid du Colombier ScmdMExchange = 0xA6, /* exchange medium */ 108fd362a73SDavid du Colombier ScmdEposition = 0x2B, /* position to element */ 109fd362a73SDavid du Colombier 110fd362a73SDavid du Colombier ScmdReadDVD = 0xAD, /* read dvd structure */ 111fd362a73SDavid du Colombier ScmdReportKey = 0xA4, /* read dvd key */ 112fd362a73SDavid du Colombier ScmdSendKey = 0xA3, /* write dvd key */ 113fd362a73SDavid du Colombier 114fd362a73SDavid du Colombier ScmdClosetracksess= 0x5B, 115fd362a73SDavid du Colombier ScmdRead12 = 0xA8, 116fd362a73SDavid du Colombier ScmdSetcdspeed = 0xBB, 117fd362a73SDavid du Colombier ScmdReadcd = 0xBE, 118fd362a73SDavid du Colombier 119fd362a73SDavid du Colombier /* vendor-specific */ 120fd362a73SDavid du Colombier ScmdFwaddr = 0xE2, /* first writeable address */ 121fd362a73SDavid du Colombier ScmdTreserve = 0xE4, /* reserve track */ 122fd362a73SDavid du Colombier ScmdTinfo = 0xE5, /* read track info */ 123fd362a73SDavid du Colombier ScmdTwrite = 0xE6, /* write track */ 124fd362a73SDavid du Colombier ScmdMload = 0xE7, /* medium load/unload */ 125fd362a73SDavid du Colombier ScmdFixation = 0xE9, /* fixation */ 126fd362a73SDavid du Colombier }; 1277dd7cddfSDavid du Colombier 1287dd7cddfSDavid du Colombier /* proto file parsing */ 1297dd7cddfSDavid du Colombier typedef void Protoenum(char *new, char *old, Dir *d, void *a); 1307dd7cddfSDavid du Colombier typedef void Protowarn(char *msg, void *a); 1317dd7cddfSDavid du Colombier int rdproto(char*, char*, Protoenum*, Protowarn*, void*); 132