1*e67f3b95SDavid du Colombier /* this file is also included by usb/disk and cdfs */ 2e6dcbf51SDavid du Colombier typedef struct Umsc Umsc; 3e6dcbf51SDavid du Colombier #pragma incomplete Umsc 4e6dcbf51SDavid du Colombier 53e12c5d1SDavid du Colombier enum { /* fundamental constants/defaults */ 63e12c5d1SDavid du Colombier NTargetID = 8, /* number of target IDs */ 73e12c5d1SDavid du Colombier CtlrID = 7, /* default controller target ID */ 83e12c5d1SDavid du Colombier MaxDirData = 255, /* max. direct data returned */ 93e12c5d1SDavid du Colombier LBsize = 512, /* default logical-block size */ 103e12c5d1SDavid du Colombier }; 113e12c5d1SDavid du Colombier 123e12c5d1SDavid du Colombier typedef struct { 133e12c5d1SDavid du Colombier uchar *p; 143e12c5d1SDavid du Colombier long count; 153e12c5d1SDavid du Colombier uchar write; 163e12c5d1SDavid du Colombier } ScsiPtr; 173e12c5d1SDavid du Colombier 183e12c5d1SDavid du Colombier typedef struct { 197dd7cddfSDavid du Colombier int flags; 207dd7cddfSDavid du Colombier char *unit; /* unit directory */ 217dd7cddfSDavid du Colombier int lun; 223e12c5d1SDavid du Colombier ulong lbsize; 23208510e1SDavid du Colombier ulong offset; /* in blocks of lbsize bytes */ 247dd7cddfSDavid du Colombier int fd; 25e6dcbf51SDavid du Colombier Umsc *umsc; /* lun */ 263e12c5d1SDavid du Colombier ScsiPtr cmd; 273e12c5d1SDavid du Colombier ScsiPtr data; 287dd7cddfSDavid du Colombier int status; /* returned status */ 293e12c5d1SDavid du Colombier uchar sense[MaxDirData]; /* returned sense data */ 303e12c5d1SDavid du Colombier uchar inquiry[MaxDirData]; /* returned inquiry data */ 31e29d4813SDavid du Colombier int readblock; /* flag: read a block since open */ 323e12c5d1SDavid du Colombier } ScsiReq; 333e12c5d1SDavid du Colombier 34e29d4813SDavid du Colombier enum { /* software flags */ 357dd7cddfSDavid du Colombier Fopen = 0x0001, /* open */ 367dd7cddfSDavid du Colombier Fseqdev = 0x0002, /* sequential-access device */ 377dd7cddfSDavid du Colombier Fwritten = 0x0004, /* device written */ 387dd7cddfSDavid du Colombier Fronly = 0x0008, /* device is read-only */ 397dd7cddfSDavid du Colombier Fwormdev = 0x0010, /* write-once read-multiple device */ 407dd7cddfSDavid du Colombier Fprintdev = 0x0020, /* printer */ 417dd7cddfSDavid du Colombier Fbfixed = 0x0040, /* fixed block size */ 427dd7cddfSDavid du Colombier Fchanger = 0x0080, /* medium-changer device */ 437dd7cddfSDavid du Colombier Finqok = 0x0100, /* inquiry data is OK */ 4480ee5cbfSDavid du Colombier Fmode6 = 0x0200, /* use 6-byte modeselect */ 453ff48bf5SDavid du Colombier Frw10 = 0x0400, /* use 10-byte read/write */ 46e6dcbf51SDavid du Colombier Fusb = 0x0800, /* USB transparent scsi */ 477dd7cddfSDavid du Colombier }; 487dd7cddfSDavid du Colombier 497dd7cddfSDavid du Colombier enum { 507dd7cddfSDavid du Colombier STnomem =-4, /* buffer allocation failed */ 517dd7cddfSDavid du Colombier STharderr =-3, /* controller error of some kind */ 527dd7cddfSDavid du Colombier STtimeout =-2, /* bus timeout */ 537dd7cddfSDavid du Colombier STok = 0, /* good */ 547dd7cddfSDavid du Colombier STcheck = 0x02, /* check condition */ 557dd7cddfSDavid du Colombier STcondmet = 0x04, /* condition met/good */ 567dd7cddfSDavid du Colombier STbusy = 0x08, /* busy */ 577dd7cddfSDavid du Colombier STintok = 0x10, /* intermediate/good */ 587dd7cddfSDavid du Colombier STintcondmet = 0x14, /* intermediate/condition met/good */ 597dd7cddfSDavid du Colombier STresconf = 0x18, /* reservation conflict */ 607dd7cddfSDavid du Colombier STterminated = 0x22, /* command terminated */ 617dd7cddfSDavid du Colombier STqfull = 0x28, /* queue full */ 623e12c5d1SDavid du Colombier }; 633e12c5d1SDavid du Colombier 643e12c5d1SDavid du Colombier enum { /* status */ 653e12c5d1SDavid du Colombier Status_SD = 0x80, /* sense-data available */ 663e12c5d1SDavid du Colombier Status_SW = 0x83, /* internal software error */ 673e12c5d1SDavid du Colombier Status_BADARG = 0x84, /* bad argument to request */ 683e12c5d1SDavid du Colombier Status_RO = 0x85, /* device is read-only */ 693e12c5d1SDavid du Colombier }; 703e12c5d1SDavid du Colombier 71e29d4813SDavid du Colombier enum { 72e29d4813SDavid du Colombier /* sense data byte 0 */ 73e29d4813SDavid du Colombier Sd0valid = 0x80, /* valid sense data present */ 74e29d4813SDavid du Colombier 75e29d4813SDavid du Colombier /* sense data byte 2 */ 76e29d4813SDavid du Colombier /* incorrect-length indicator, difference in bytes 3—6 */ 77e29d4813SDavid du Colombier Sd2ili = 0x20, 78e29d4813SDavid du Colombier Sd2eom = 0x40, /* end of medium (tape) */ 79e29d4813SDavid du Colombier Sd2filemark = 0x80, /* at a filemark (tape) */ 80e29d4813SDavid du Colombier 81e29d4813SDavid du Colombier /* command byte 1 */ 82e29d4813SDavid du Colombier Cmd1fixed = 1, /* use fixed-length blocks */ 83e29d4813SDavid du Colombier Cmd1sili = 2, /* don't set Sd2ili */ 84e29d4813SDavid du Colombier 85e29d4813SDavid du Colombier /* limit of block #s in 24-bit ccbs */ 86e29d4813SDavid du Colombier Max24off = (1<<21) - 1, /* 2ⁱ - 1 */ 87e29d4813SDavid du Colombier 88e29d4813SDavid du Colombier /* mode pages */ 89e29d4813SDavid du Colombier Allmodepages = 0x3F, 90e29d4813SDavid du Colombier }; 91e29d4813SDavid du Colombier 92e29d4813SDavid du Colombier /* p arguments should be of type uchar* */ 93e29d4813SDavid du Colombier #define GETBELONG(p) ((ulong)(p)[0]<<24 | (ulong)(p)[1]<<16 | (p)[2]<<8 | (p)[3]) 94e29d4813SDavid du Colombier #define PUTBELONG(p, ul) ((p)[0] = (ul)>>24, (p)[1] = (ul)>>16, \ 95e29d4813SDavid du Colombier (p)[2] = (ul)>>8, (p)[3] = (ul)) 96e29d4813SDavid du Colombier #define GETBE24(p) ((ulong)(p)[0]<<16 | (p)[1]<<8 | (p)[2]) 97e29d4813SDavid du Colombier #define PUTBE24(p, ul) ((p)[0] = (ul)>>16, (p)[1] = (ul)>>8, (p)[2] = (ul)) 98e29d4813SDavid du Colombier 99e6dcbf51SDavid du Colombier extern long maxiosize; 1003e12c5d1SDavid du Colombier 101e6dcbf51SDavid du Colombier long SRready(ScsiReq*); 102e6dcbf51SDavid du Colombier long SRrewind(ScsiReq*); 103e6dcbf51SDavid du Colombier long SRreqsense(ScsiReq*); 104e6dcbf51SDavid du Colombier long SRformat(ScsiReq*); 105e6dcbf51SDavid du Colombier long SRrblimits(ScsiReq*, uchar*); 106e6dcbf51SDavid du Colombier long SRread(ScsiReq*, void*, long); 107e6dcbf51SDavid du Colombier long SRwrite(ScsiReq*, void*, long); 108e6dcbf51SDavid du Colombier long SRseek(ScsiReq*, long, int); 109e6dcbf51SDavid du Colombier long SRfilemark(ScsiReq*, ulong); 110e6dcbf51SDavid du Colombier long SRspace(ScsiReq*, uchar, long); 111e6dcbf51SDavid du Colombier long SRinquiry(ScsiReq*); 112e6dcbf51SDavid du Colombier long SRmodeselect6(ScsiReq*, uchar*, long); 113e6dcbf51SDavid du Colombier long SRmodeselect10(ScsiReq*, uchar*, long); 114e6dcbf51SDavid du Colombier long SRmodesense6(ScsiReq*, uchar, uchar*, long); 115e6dcbf51SDavid du Colombier long SRmodesense10(ScsiReq*, uchar, uchar*, long); 116e6dcbf51SDavid du Colombier long SRstart(ScsiReq*, uchar); 117e6dcbf51SDavid du Colombier long SRrcapacity(ScsiReq*, uchar*); 1187dd7cddfSDavid du Colombier 119e6dcbf51SDavid du Colombier long SRblank(ScsiReq*, uchar, uchar); /* MMC CD-R/CD-RW commands */ 120e6dcbf51SDavid du Colombier long SRsynccache(ScsiReq*); 121e6dcbf51SDavid du Colombier long SRTOC(ScsiReq*, void*, int, uchar, uchar); 122e6dcbf51SDavid du Colombier long SRrdiscinfo(ScsiReq*, void*, int); 123e6dcbf51SDavid du Colombier long SRrtrackinfo(ScsiReq*, void*, int, int); 1247dd7cddfSDavid du Colombier 125e6dcbf51SDavid du Colombier long SRcdpause(ScsiReq*, int); /* MMC CD audio commands */ 126e6dcbf51SDavid du Colombier long SRcdstop(ScsiReq*); 127e6dcbf51SDavid du Colombier long SRcdload(ScsiReq*, int, int); 128e6dcbf51SDavid du Colombier long SRcdplay(ScsiReq*, int, long, long); 129e6dcbf51SDavid du Colombier long SRcdstatus(ScsiReq*, uchar*, int); 130e6dcbf51SDavid du Colombier long SRgetconf(ScsiReq*, uchar*, int); 1313e12c5d1SDavid du Colombier 132e6dcbf51SDavid du Colombier /* old CD-R/CD-RW commands */ 133e6dcbf51SDavid du Colombier long SRfwaddr(ScsiReq*, uchar, uchar, uchar, uchar*); 134e6dcbf51SDavid du Colombier long SRtreserve(ScsiReq*, long); 135e6dcbf51SDavid du Colombier long SRtinfo(ScsiReq*, uchar, uchar*); 136e6dcbf51SDavid du Colombier long SRwtrack(ScsiReq*, void*, long, uchar, uchar); 137e6dcbf51SDavid du Colombier long SRmload(ScsiReq*, uchar); 138e6dcbf51SDavid du Colombier long SRfixation(ScsiReq*, uchar); 1397dd7cddfSDavid du Colombier 140e6dcbf51SDavid du Colombier long SReinitialise(ScsiReq*); /* CHANGER commands */ 141e6dcbf51SDavid du Colombier long SRestatus(ScsiReq*, uchar, uchar*, int); 142e6dcbf51SDavid du Colombier long SRmmove(ScsiReq*, int, int, int, int); 1433e12c5d1SDavid du Colombier 144e6dcbf51SDavid du Colombier long SRrequest(ScsiReq*); 145e6dcbf51SDavid du Colombier int SRclose(ScsiReq*); 146e6dcbf51SDavid du Colombier int SRopenraw(ScsiReq*, char*); 147e6dcbf51SDavid du Colombier int SRopen(ScsiReq*, char*); 148219b2ee8SDavid du Colombier 149e6dcbf51SDavid du Colombier void makesense(ScsiReq*); 150e6dcbf51SDavid du Colombier 151e6dcbf51SDavid du Colombier long umsrequest(struct Umsc*, ScsiPtr*, ScsiPtr*, int*); 152