diff --git a/sys/include/disk.h b/sys/include/disk.h index b8fdb49..bf6fa73 100644 --- a/sys/include/disk.h +++ b/sys/include/disk.h @@ -1,6 +1,8 @@ #pragma src "/sys/src/libdisk" #pragma lib "libdisk.a" +#include + /* SCSI interface */ typedef struct Scsi Scsi; struct Scsi { @@ -59,71 +61,6 @@ enum { Gdisk, Gguess, }; -enum { /* SCSI command codes */ - ScmdTur = 0x00, /* test unit ready */ - ScmdRewind = 0x01, /* rezero/rewind */ - ScmdRsense = 0x03, /* request sense */ - ScmdFormat = 0x04, /* format unit */ - ScmdRblimits = 0x05, /* read block limits */ - ScmdRead = 0x08, /* read */ - ScmdWrite = 0x0A, /* write */ - ScmdSeek = 0x0B, /* seek */ - ScmdFmark = 0x10, /* write filemarks */ - ScmdSpace = 0x11, /* space forward/backward */ - ScmdInq = 0x12, /* inquiry */ - ScmdMselect6 = 0x15, /* mode select */ - ScmdMselect10 = 0x55, /* mode select */ - ScmdMsense6 = 0x1A, /* mode sense */ - ScmdMsense10 = 0x5A, /* mode sense */ - ScmdStart = 0x1B, /* start/stop unit */ - ScmdRcapacity = 0x25, /* read capacity */ - ScmdRcapacity16 = 0x9e, /* long read capacity */ - ScmdRformatcap = 0x23, /* read format capacity */ - ScmdExtread = 0x28, /* extended read (10 bytes) */ - ScmdRead16 = 0x88, /* long read (16 bytes) */ - ScmdExtwrite = 0x2A, /* extended write (10 bytes) */ - ScmdExtwritever = 0x2E, /* extended write and verify (10) */ - ScmdWrite16 = 0x8A, /* long write (16 bytes) */ - ScmdExtseek = 0x2B, /* extended seek */ - - ScmdSynccache = 0x35, /* flush cache */ - ScmdRTOC = 0x43, /* read TOC data */ - ScmdRdiscinfo = 0x51, /* read disc information */ - ScmdRtrackinfo = 0x52, /* read track information */ - ScmdReserve = 0x53, /* reserve track */ - ScmdBlank = 0xA1, /* blank *-RW media */ - - ScmdCDpause = 0x4B, /* pause/resume */ - ScmdCDstop = 0x4E, /* stop play/scan */ - ScmdCDplay = 0xA5, /* play audio */ - ScmdCDload = 0xA6, /* load/unload */ - ScmdCDscan = 0xBA, /* fast forward/reverse */ - ScmdCDstatus = 0xBD, /* mechanism status */ - Scmdgetconf = 0x46, /* get configuration */ - - ScmdEInitialise = 0x07, /* initialise element status */ - ScmdMMove = 0xA5, /* move medium */ - ScmdEStatus = 0xB8, /* read element status */ - ScmdMExchange = 0xA6, /* exchange medium */ - ScmdEposition = 0x2B, /* position to element */ - - ScmdReadDVD = 0xAD, /* read dvd structure */ - ScmdReportKey = 0xA4, /* read dvd key */ - ScmdSendKey = 0xA3, /* write dvd key */ - - ScmdClosetracksess= 0x5B, - ScmdRead12 = 0xA8, - ScmdSetcdspeed = 0xBB, - ScmdReadcd = 0xBE, - - /* vendor-specific */ - ScmdFwaddr = 0xE2, /* first writeable address */ - ScmdTreserve = 0xE4, /* reserve track */ - ScmdTinfo = 0xE5, /* read track info */ - ScmdTwrite = 0xE6, /* write track */ - ScmdMload = 0xE7, /* medium load/unload */ - ScmdFixation = 0xE9, /* fixation */ -}; /* proto file parsing */ typedef void Protoenum(char *new, char *old, Dir *d, void *a); diff --git a/sys/include/diskcmd.h b/sys/include/diskcmd.h new file mode 100644 index 0000000..0c0fbe0 --- /dev/null +++ b/sys/include/diskcmd.h @@ -0,0 +1,66 @@ +enum { /* SCSI command codes */ + ScmdTur = 0x00, /* test unit ready */ + ScmdRewind = 0x01, /* rezero/rewind */ + ScmdRsense = 0x03, /* request sense */ + ScmdFormat = 0x04, /* format unit */ + ScmdRblimits = 0x05, /* read block limits */ + ScmdRead = 0x08, /* read */ + ScmdWrite = 0x0A, /* write */ + ScmdSeek = 0x0B, /* seek */ + ScmdFmark = 0x10, /* write filemarks */ + ScmdSpace = 0x11, /* space forward/backward */ + ScmdInq = 0x12, /* inquiry */ + ScmdMselect6 = 0x15, /* mode select */ + ScmdMselect10 = 0x55, /* mode select */ + ScmdMsense6 = 0x1A, /* mode sense */ + ScmdMsense10 = 0x5A, /* mode sense */ + ScmdStart = 0x1B, /* start/stop unit */ + ScmdRcapacity = 0x25, /* read capacity */ + ScmdRcapacity16 = 0x9e, /* long read capacity */ + ScmdRformatcap = 0x23, /* read format capacity */ + ScmdExtread = 0x28, /* extended read (10 bytes) */ + ScmdRead16 = 0x88, /* long read (16 bytes) */ + ScmdExtwrite = 0x2A, /* extended write (10 bytes) */ + ScmdExtwritever = 0x2E, /* extended write and verify (10) */ + ScmdWrite16 = 0x8A, /* long write (16 bytes) */ + ScmdExtseek = 0x2B, /* extended seek */ + + ScmdSynccache = 0x35, /* flush cache */ + ScmdSynccache16 = 0x91, /* flush cache (16) */ + ScmdRTOC = 0x43, /* read TOC data */ + ScmdRdiscinfo = 0x51, /* read disc information */ + ScmdRtrackinfo = 0x52, /* read track information */ + ScmdReserve = 0x53, /* reserve track */ + ScmdBlank = 0xA1, /* blank *-RW media */ + + ScmdCDpause = 0x4B, /* pause/resume */ + ScmdCDstop = 0x4E, /* stop play/scan */ + ScmdCDplay = 0xA5, /* play audio */ + ScmdCDload = 0xA6, /* load/unload */ + ScmdCDscan = 0xBA, /* fast forward/reverse */ + ScmdCDstatus = 0xBD, /* mechanism status */ + Scmdgetconf = 0x46, /* get configuration */ + + ScmdEInitialise = 0x07, /* initialise element status */ + ScmdMMove = 0xA5, /* move medium */ + ScmdEStatus = 0xB8, /* read element status */ + ScmdMExchange = 0xA6, /* exchange medium */ + ScmdEposition = 0x2B, /* position to element */ + + ScmdReadDVD = 0xAD, /* read dvd structure */ + ScmdReportKey = 0xA4, /* read dvd key */ + ScmdSendKey = 0xA3, /* write dvd key */ + + ScmdClosetracksess= 0x5B, + ScmdRead12 = 0xA8, + ScmdSetcdspeed = 0xBB, + ScmdReadcd = 0xBE, + + /* vendor-specific */ + ScmdFwaddr = 0xE2, /* first writeable address */ + ScmdTreserve = 0xE4, /* reserve track */ + ScmdTinfo = 0xE5, /* read track info */ + ScmdTwrite = 0xE6, /* write track */ + ScmdMload = 0xE7, /* medium load/unload */ + ScmdFixation = 0xE9, /* fixation */ +}; diff --git a/sys/src/9/pc/sdata.c b/sys/src/9/pc/sdata.c index f821f20..aaf2de7 100644 --- a/sys/src/9/pc/sdata.c +++ b/sys/src/9/pc/sdata.c @@ -1503,17 +1503,17 @@ atagenio(Drive* drive, uchar* cmd, int clen) * Fail any command with a LUN except INQUIRY which * will return 'logical unit not supported'. */ - if((cmd[1]>>5) && cmd[0] != 0x12) + if((cmd[1]>>5) && cmd[0] != ScmdInq) return atasetsense(drive, SDcheck, 0x05, 0x25, 0); switch(cmd[0]){ default: return atasetsense(drive, SDcheck, 0x05, 0x20, 0); - case 0x00: /* test unit ready */ + case ScmdTur: /* test unit ready */ return SDok; - case 0x03: /* request sense */ + case ScmdRsense: /* request sense */ if(cmd[4] < sizeof(drive->sense)) len = cmd[4]; else @@ -1524,7 +1524,7 @@ atagenio(Drive* drive, uchar* cmd, int clen) } return SDok; - case 0x12: /* inquiry */ + case ScmdInq: /* inquiry */ if(cmd[4] < sizeof(drive->inquiry)) len = cmd[4]; else @@ -1535,14 +1535,14 @@ atagenio(Drive* drive, uchar* cmd, int clen) } return SDok; - case 0x1B: /* start/stop unit */ + case ScmdStart: /* start/stop unit */ /* * NOP for now, can use the power management feature * set later. */ return SDok; - case 0x25: /* read capacity */ + case ScmdRcapacity: /* read capacity */ if((cmd[1] & 0x01) || cmd[2] || cmd[3]) return atasetsense(drive, SDcheck, 0x05, 0x24, 0); if(drive->data == nil || drive->dlen < 8) @@ -1564,7 +1564,7 @@ atagenio(Drive* drive, uchar* cmd, int clen) drive->data += 8; return SDok; - case 0x9E: /* long read capacity */ + case ScmdRcapacity16: if((cmd[1] & 0x01) || cmd[2] || cmd[3]) return atasetsense(drive, SDcheck, 0x05, 0x24, 0); if(drive->data == nil || drive->dlen < 8) @@ -1590,14 +1590,14 @@ atagenio(Drive* drive, uchar* cmd, int clen) drive->data += 12; return SDok; - case 0x28: /* read (10) */ - case 0x88: /* long read (16) */ - case 0x2a: /* write (10) */ - case 0x8a: /* long write (16) */ - case 0x2e: /* write and verify (10) */ + case ScmdExtread: + case ScmdExtwrite: + case ScmdExtwritever: + case ScmdRead16: + case ScmdWrite16: break; - case 0x5A: + case ScmdMsense10: return atamodesense(drive, cmd); } @@ -1690,8 +1690,8 @@ atario(SDreq* r) * effort. Read/write(6) are easy. */ switch(r->cmd[0]){ - case 0x08: /* read */ - case 0x0A: /* write */ + case ScmdRead: + case ScmdWrite: cmdp = cmd10; memset(cmdp, 0, sizeof(cmd10)); cmdp[0] = r->cmd[0]|0x20; diff --git a/sys/src/9/pc/sdiahci.c b/sys/src/9/pc/sdiahci.c index 224d9b7..29e142f 100644 --- a/sys/src/9/pc/sdiahci.c +++ b/sys/src/9/pc/sdiahci.c @@ -1526,7 +1526,7 @@ ahcibuild(Drive *d, uchar *cmd, void *data, int n, vlong lba) static uchar tab[2][2] = { 0xc8, 0x25, 0xca, 0x35, }; pm = &d->portm; - dir = *cmd != 0x28; + dir = *cmd != ScmdExtread; llba = pm->feat&Dllba? 1: 0; acmd = tab[dir][llba]; qlock(pm); @@ -1772,10 +1772,10 @@ retry: case SDperworm: case SDpercd: switch(cmd[0]){ - case 0x0a: /* write (6?) */ - case 0x2a: /* write (10) */ - case 0x8a: /* long write (16) */ - case 0x2e: /* write and verify (10) */ + case ScmdWrite: + case ScmdExtwrite: + case ScmdExtwritever: + case ScmdWrite16: wormwrite = 1; break; } @@ -1822,7 +1822,7 @@ iario(SDreq *r) name = d->unit->name; p = d->port; - if(r->cmd[0] == 0x35 || r->cmd[0] == 0x91){ + if(*cmd == ScmdSynccache || *cmd == ScmdSynccache16){ if(flushcache(d) == 0) return sdsetsense(r, SDok, 0, 0, 0); return sdsetsense(r, SDcheck, 3, 0xc, 2); @@ -1833,7 +1833,7 @@ iario(SDreq *r) return i; } - if(*cmd != 0x28 && *cmd != 0x2a){ + if(*cmd != ScmdExtread && *cmd != ScmdExtwrite){ print("%s: bad cmd %.2#ux\n", name, cmd[0]); r->status = SDcheck; return SDcheck; diff --git a/sys/src/9/pcboot/sdbios.c b/sys/src/9/pcboot/sdbios.c index f1a738f..4c76cf7 100644 --- a/sys/src/9/pcboot/sdbios.c +++ b/sys/src/9/pcboot/sdbios.c @@ -20,7 +20,6 @@ #include "../port/netif.h" #include "../port/sd.h" #include "dosfs.h" -#include long biosread0(Bootfs *, void *, long); vlong biosseek(Bootfs *fs, vlong off); diff --git a/sys/src/9/port/devsd.c b/sys/src/9/port/devsd.c index 58de1a8..c7edd3f 100644 --- a/sys/src/9/port/devsd.c +++ b/sys/src/9/port/devsd.c @@ -964,8 +964,8 @@ sdfakescsi(SDreq *r, void *info, int ilen) * Rewrite read(6)/write(6) into read(10)/write(10). */ switch(cmd[0]){ - case 0x08: /* read */ - case 0x0A: /* write */ + case ScmdRead: + case ScmdWrite: cmd[9] = 0; cmd[8] = cmd[4]; cmd[7] = 0; @@ -984,17 +984,17 @@ sdfakescsi(SDreq *r, void *info, int ilen) * Fail any command with a LUN except INQUIRY which * will return 'logical unit not supported'. */ - if((cmd[1]>>5) && cmd[0] != 0x12) + if((cmd[1]>>5) && cmd[0] != ScmdInq) return sdsetsense(r, SDcheck, 0x05, 0x25, 0); switch(cmd[0]){ default: return sdsetsense(r, SDcheck, 0x05, 0x20, 0); - case 0x00: /* test unit ready */ + case ScmdTur: /* test unit ready */ return sdsetsense(r, SDok, 0, 0, 0); - case 0x03: /* request sense */ + case ScmdRsense: /* request sense */ if(cmd[4] < sizeof unit->sense) len = cmd[4]; else @@ -1005,7 +1005,7 @@ sdfakescsi(SDreq *r, void *info, int ilen) } return sdsetsense(r, SDok, 0, 0, 0); - case 0x12: /* inquiry */ + case ScmdInq: /* inquiry */ if(cmd[4] < sizeof unit->inquiry) len = cmd[4]; else @@ -1016,13 +1016,13 @@ sdfakescsi(SDreq *r, void *info, int ilen) } return sdsetsense(r, SDok, 0, 0, 0); - case 0x1B: /* start/stop unit */ + case ScmdStart: /* start/stop unit */ /* * nop for now, can use power management later. */ return sdsetsense(r, SDok, 0, 0, 0); - case 0x25: /* read capacity */ + case ScmdRcapacity: /* read capacity */ if((cmd[1] & 0x01) || cmd[2] || cmd[3]) return sdsetsense(r, SDcheck, 0x05, 0x24, 0); if(r->data == nil || r->dlen < 8) @@ -1045,7 +1045,7 @@ sdfakescsi(SDreq *r, void *info, int ilen) r->rlen = p - (uchar*)r->data; return sdsetsense(r, SDok, 0, 0, 0); - case 0x9E: /* long read capacity */ + case ScmdRcapacity16: /* long read capacity */ if((cmd[1] & 0x01) || cmd[2] || cmd[3]) return sdsetsense(r, SDcheck, 0x05, 0x24, 0); if(r->data == nil || r->dlen < 8) @@ -1071,13 +1071,13 @@ sdfakescsi(SDreq *r, void *info, int ilen) r->rlen = p - (uchar*)r->data; return sdsetsense(r, SDok, 0, 0, 0); - case 0x5A: /* mode sense */ + case ScmdMsense10: /* mode sense */ return sdmodesense(r, cmd, info, ilen); - case 0x28: /* read */ - case 0x2A: /* write */ - case 0x88: /* read16 */ - case 0x8a: /* write16 */ + case ScmdExtread: + case ScmdExtwrite: + case ScmdRead16: + case ScmdWrite16: return SDnostatus; } } diff --git a/sys/src/9/port/sd.h b/sys/src/9/port/sd.h index 2c8659c..51e0eab 100644 --- a/sys/src/9/port/sd.h +++ b/sys/src/9/port/sd.h @@ -1,6 +1,8 @@ /* * Storage Device. */ +#include + typedef struct SDev SDev; typedef struct SDifc SDifc; typedef struct SDio SDio; diff --git a/sys/src/9/port/sdaoe.c b/sys/src/9/port/sdaoe.c old mode 100644 new mode 100755 index 8a8ecdb..6bd7916 --- a/sys/src/9/port/sdaoe.c +++ b/sys/src/9/port/sdaoe.c @@ -447,14 +447,13 @@ aoerio(SDreq *r) cmd = r->cmd; name = unit->name; - if(r->cmd[0] == 0x35 || r->cmd[0] == 0x91){ + if(*cmd == ScmdSynccache || *cmd == ScmdSynccache16) // qlock(c); // i = flushcache(); // qunlock(c); // if(i == 0) // return sdsetsense(r, SDok, 0, 0, 0); return sdsetsense(r, SDcheck, 3, 0xc, 2); - } if((i = sdfakescsi(r, c->ident, sizeof c->ident)) != SDnostatus){ r->status = i; @@ -462,12 +461,12 @@ aoerio(SDreq *r) } switch(*cmd){ - case 0x88: - case 0x28: + case ScmdRead16: + case ScmdExtread: rio = devtab[c->c->type]->read; break; - case 0x8a: - case 0x2a: + case ScmdWrite16: + case ScmdExtwrite: rio = devtab[c->c->type]->write; break; default: diff --git a/sys/src/9/port/sdscsi.c b/sys/src/9/port/sdscsi.c index 3bacbe6..28807fa 100644 --- a/sys/src/9/port/sdscsi.c +++ b/sys/src/9/port/sdscsi.c @@ -202,7 +202,7 @@ scsionline(SDunit* unit) */ r->write = 0; memset(r->cmd, 0, sizeof(r->cmd)); - r->cmd[0] = 0x25; + r->cmd[0] = ScmdRcapacity; r->cmd[1] = r->lun<<5; r->clen = 10; r->data = p; @@ -310,9 +310,9 @@ scsifmt10(SDreq *r, int write, int lun, ulong nb, uvlong bno) c = r->cmd; if(write == 0) - c[0] = 0x28; + c[0] = ScmdExtread; else - c[0] = 0x2A; + c[0] = ScmdExtwrite; c[1] = lun<<5; c[2] = bno>>24; c[3] = bno>>16; @@ -333,9 +333,9 @@ scsifmt16(SDreq *r, int write, int lun, ulong nb, uvlong bno) c = r->cmd; if(write == 0) - c[0] = 0x88; + c[0] = ScmdRead16; else - c[0] = 0x8A; + c[0] = ScmdWrite16; c[1] = lun<<5; /* so wrong */ c[2] = bno>>56; c[3] = bno>>48;