17dd7cddfSDavid du Colombier #include <u.h>
27dd7cddfSDavid du Colombier #include <libc.h>
37dd7cddfSDavid du Colombier #include <bio.h>
4*fd362a73SDavid du Colombier #include <disk.h>
57dd7cddfSDavid du Colombier #include "scsireq.h"
67dd7cddfSDavid du Colombier
77dd7cddfSDavid du Colombier extern Biobuf bout;
87dd7cddfSDavid du Colombier
97dd7cddfSDavid du Colombier long
SRcdpause(ScsiReq * rp,int resume)107dd7cddfSDavid du Colombier SRcdpause(ScsiReq *rp, int resume)
117dd7cddfSDavid du Colombier {
127dd7cddfSDavid du Colombier uchar cmd[10];
137dd7cddfSDavid du Colombier
147dd7cddfSDavid du Colombier memset(cmd, 0, sizeof(cmd));
157dd7cddfSDavid du Colombier cmd[0] = ScmdCDpause;
167dd7cddfSDavid du Colombier cmd[8] = resume;
177dd7cddfSDavid du Colombier rp->cmd.p = cmd;
187dd7cddfSDavid du Colombier rp->cmd.count = sizeof(cmd);
197dd7cddfSDavid du Colombier rp->data.p = cmd;
207dd7cddfSDavid du Colombier rp->data.count = 0;
217dd7cddfSDavid du Colombier rp->data.write = 1;
227dd7cddfSDavid du Colombier return SRrequest(rp);
237dd7cddfSDavid du Colombier }
247dd7cddfSDavid du Colombier
257dd7cddfSDavid du Colombier long
SRcdstop(ScsiReq * rp)267dd7cddfSDavid du Colombier SRcdstop(ScsiReq *rp)
277dd7cddfSDavid du Colombier {
287dd7cddfSDavid du Colombier uchar cmd[10];
297dd7cddfSDavid du Colombier
307dd7cddfSDavid du Colombier memset(cmd, 0, sizeof(cmd));
317dd7cddfSDavid du Colombier cmd[0] = ScmdCDstop;
327dd7cddfSDavid du Colombier rp->cmd.p = cmd;
337dd7cddfSDavid du Colombier rp->cmd.count = sizeof(cmd);
347dd7cddfSDavid du Colombier rp->data.p = cmd;
357dd7cddfSDavid du Colombier rp->data.count = 0;
367dd7cddfSDavid du Colombier rp->data.write = 1;
377dd7cddfSDavid du Colombier return SRrequest(rp);
387dd7cddfSDavid du Colombier }
397dd7cddfSDavid du Colombier
407dd7cddfSDavid du Colombier static long
_SRcdplay(ScsiReq * rp,long lba,long length)417dd7cddfSDavid du Colombier _SRcdplay(ScsiReq *rp, long lba, long length)
427dd7cddfSDavid du Colombier {
437dd7cddfSDavid du Colombier uchar cmd[12];
447dd7cddfSDavid du Colombier
457dd7cddfSDavid du Colombier memset(cmd, 0, sizeof(cmd));
467dd7cddfSDavid du Colombier cmd[0] = ScmdCDplay;
477dd7cddfSDavid du Colombier cmd[2] = lba>>24;
487dd7cddfSDavid du Colombier cmd[3] = lba>>16;
497dd7cddfSDavid du Colombier cmd[4] = lba>>8;
507dd7cddfSDavid du Colombier cmd[5] = lba;
517dd7cddfSDavid du Colombier cmd[6] = length>>24;
527dd7cddfSDavid du Colombier cmd[7] = length>>16;
537dd7cddfSDavid du Colombier cmd[8] = length>>8;
547dd7cddfSDavid du Colombier cmd[9] = length;
557dd7cddfSDavid du Colombier rp->cmd.p = cmd;
567dd7cddfSDavid du Colombier rp->cmd.count = sizeof(cmd);
577dd7cddfSDavid du Colombier rp->data.p = cmd;
587dd7cddfSDavid du Colombier rp->data.count = 0;
597dd7cddfSDavid du Colombier rp->data.write = 1;
607dd7cddfSDavid du Colombier
617dd7cddfSDavid du Colombier return SRrequest(rp);
627dd7cddfSDavid du Colombier }
637dd7cddfSDavid du Colombier
647dd7cddfSDavid du Colombier static struct {
657dd7cddfSDavid du Colombier int trackno;
667dd7cddfSDavid du Colombier long lba;
677dd7cddfSDavid du Colombier long length;
687dd7cddfSDavid du Colombier } tracks[100];
697dd7cddfSDavid du Colombier static int ntracks;
707dd7cddfSDavid du Colombier
717dd7cddfSDavid du Colombier long
SRcdplay(ScsiReq * rp,int raw,long start,long length)727dd7cddfSDavid du Colombier SRcdplay(ScsiReq *rp, int raw, long start, long length)
737dd7cddfSDavid du Colombier {
747dd7cddfSDavid du Colombier uchar d[100*8+4], *p;
757dd7cddfSDavid du Colombier int lba, n, tdl;
767dd7cddfSDavid du Colombier
777dd7cddfSDavid du Colombier if(raw || start == 0)
787dd7cddfSDavid du Colombier return _SRcdplay(rp, start, length);
797dd7cddfSDavid du Colombier
807dd7cddfSDavid du Colombier ntracks = 0;
817dd7cddfSDavid du Colombier if(SRTOC(rp, d, sizeof(d), 0, 0) == -1){
827dd7cddfSDavid du Colombier if(rp->status == STok)
837dd7cddfSDavid du Colombier Bprint(&bout, "\t(probably empty)\n");
847dd7cddfSDavid du Colombier return -1;
857dd7cddfSDavid du Colombier }
867dd7cddfSDavid du Colombier tdl = (d[0]<<8)|d[1];
877dd7cddfSDavid du Colombier for(p = &d[4], n = tdl-2; n; n -= 8, p += 8){
887dd7cddfSDavid du Colombier tracks[ntracks].trackno = p[2];
897dd7cddfSDavid du Colombier lba = (p[4]<<24)|(p[5]<<16)|(p[6]<<8)|p[7];
907dd7cddfSDavid du Colombier tracks[ntracks].lba = lba;
917dd7cddfSDavid du Colombier if(ntracks > 0)
927dd7cddfSDavid du Colombier tracks[ntracks-1].length = lba-tracks[ntracks-1].lba;
937dd7cddfSDavid du Colombier ntracks++;
947dd7cddfSDavid du Colombier }
957dd7cddfSDavid du Colombier if(ntracks > 0)
967dd7cddfSDavid du Colombier tracks[ntracks-1].length = 0xFFFFFFFF;
977dd7cddfSDavid du Colombier
987dd7cddfSDavid du Colombier for(n = 0; n < ntracks; n++){
997dd7cddfSDavid du Colombier if(start != tracks[n].trackno)
1007dd7cddfSDavid du Colombier continue;
1017dd7cddfSDavid du Colombier return _SRcdplay(rp, tracks[n].lba, tracks[n].length);
1027dd7cddfSDavid du Colombier }
1037dd7cddfSDavid du Colombier
1047dd7cddfSDavid du Colombier return -1;
1057dd7cddfSDavid du Colombier }
1067dd7cddfSDavid du Colombier
1077dd7cddfSDavid du Colombier long
SRcdload(ScsiReq * rp,int load,int slot)1087dd7cddfSDavid du Colombier SRcdload(ScsiReq *rp, int load, int slot)
1097dd7cddfSDavid du Colombier {
1107dd7cddfSDavid du Colombier uchar cmd[12];
1117dd7cddfSDavid du Colombier
1127dd7cddfSDavid du Colombier memset(cmd, 0, sizeof(cmd));
1137dd7cddfSDavid du Colombier cmd[0] = ScmdCDload;
1147dd7cddfSDavid du Colombier if(load)
1157dd7cddfSDavid du Colombier cmd[4] = 0x03;
1167dd7cddfSDavid du Colombier else
1177dd7cddfSDavid du Colombier cmd[4] = 0x02;
1187dd7cddfSDavid du Colombier cmd[8] = slot;
1197dd7cddfSDavid du Colombier rp->cmd.p = cmd;
1207dd7cddfSDavid du Colombier rp->cmd.count = sizeof(cmd);
1217dd7cddfSDavid du Colombier rp->data.p = cmd;
1227dd7cddfSDavid du Colombier rp->data.count = 0;
1237dd7cddfSDavid du Colombier rp->data.write = 1;
1247dd7cddfSDavid du Colombier return SRrequest(rp);
1257dd7cddfSDavid du Colombier }
1267dd7cddfSDavid du Colombier
1277dd7cddfSDavid du Colombier long
SRcdstatus(ScsiReq * rp,uchar * list,int nbytes)1287dd7cddfSDavid du Colombier SRcdstatus(ScsiReq *rp, uchar *list, int nbytes)
1297dd7cddfSDavid du Colombier {
1307dd7cddfSDavid du Colombier uchar cmd[12];
1317dd7cddfSDavid du Colombier
1327dd7cddfSDavid du Colombier memset(cmd, 0, sizeof(cmd));
1337dd7cddfSDavid du Colombier cmd[0] = ScmdCDstatus;
1347dd7cddfSDavid du Colombier cmd[8] = nbytes>>8;
1357dd7cddfSDavid du Colombier cmd[9] = nbytes;
1367dd7cddfSDavid du Colombier rp->cmd.p = cmd;
1377dd7cddfSDavid du Colombier rp->cmd.count = sizeof(cmd);
1387dd7cddfSDavid du Colombier rp->data.p = list;
1397dd7cddfSDavid du Colombier rp->data.count = nbytes;
1407dd7cddfSDavid du Colombier rp->data.write = 0;
1417dd7cddfSDavid du Colombier return SRrequest(rp);
1427dd7cddfSDavid du Colombier }
1437dd7cddfSDavid du Colombier
1447dd7cddfSDavid du Colombier long
SRgetconf(ScsiReq * rp,uchar * list,int nbytes)1457dd7cddfSDavid du Colombier SRgetconf(ScsiReq *rp, uchar *list, int nbytes)
1467dd7cddfSDavid du Colombier {
1477dd7cddfSDavid du Colombier uchar cmd[10];
1487dd7cddfSDavid du Colombier
1497dd7cddfSDavid du Colombier memset(cmd, 0, sizeof(cmd));
1507dd7cddfSDavid du Colombier cmd[0] = Scmdgetconf;
1517dd7cddfSDavid du Colombier cmd[7] = nbytes>>8;
1527dd7cddfSDavid du Colombier cmd[8] = nbytes;
1537dd7cddfSDavid du Colombier rp->cmd.p = cmd;
1547dd7cddfSDavid du Colombier rp->cmd.count = sizeof(cmd);
1557dd7cddfSDavid du Colombier rp->data.p = list;
1567dd7cddfSDavid du Colombier rp->data.count = nbytes;
1577dd7cddfSDavid du Colombier rp->data.write = 0;
1587dd7cddfSDavid du Colombier return SRrequest(rp);
1597dd7cddfSDavid du Colombier }
160