17dd7cddfSDavid du Colombier #include <u.h>
27dd7cddfSDavid du Colombier #include <libc.h>
3*fd362a73SDavid du Colombier #include <disk.h>
47dd7cddfSDavid du Colombier #include "scsireq.h"
57dd7cddfSDavid du Colombier
67dd7cddfSDavid du Colombier long
SRblank(ScsiReq * rp,uchar type,uchar track)77dd7cddfSDavid du Colombier SRblank(ScsiReq *rp, uchar type, uchar track)
87dd7cddfSDavid du Colombier {
97dd7cddfSDavid du Colombier uchar cmd[12];
107dd7cddfSDavid du Colombier
117dd7cddfSDavid du Colombier memset(cmd, 0, sizeof(cmd));
127dd7cddfSDavid du Colombier cmd[0] = ScmdBlank;
137dd7cddfSDavid du Colombier cmd[1] = type;
147dd7cddfSDavid du Colombier cmd[2] = track>>24;
157dd7cddfSDavid du Colombier cmd[3] = track>>16;
167dd7cddfSDavid du Colombier cmd[4] = track>>8;
177dd7cddfSDavid du Colombier cmd[5] = track;
187dd7cddfSDavid du Colombier rp->cmd.p = cmd;
197dd7cddfSDavid du Colombier rp->cmd.count = sizeof(cmd);
207dd7cddfSDavid du Colombier rp->data.p = cmd;
217dd7cddfSDavid du Colombier rp->data.count = 0;
227dd7cddfSDavid du Colombier rp->data.write = 1;
237dd7cddfSDavid du Colombier return SRrequest(rp);
247dd7cddfSDavid du Colombier }
257dd7cddfSDavid du Colombier
267dd7cddfSDavid du Colombier long
SRsynccache(ScsiReq * rp)277dd7cddfSDavid du Colombier SRsynccache(ScsiReq *rp)
287dd7cddfSDavid du Colombier {
297dd7cddfSDavid du Colombier uchar cmd[10];
307dd7cddfSDavid du Colombier
317dd7cddfSDavid du Colombier memset(cmd, 0, sizeof(cmd));
327dd7cddfSDavid du Colombier cmd[0] = ScmdSynccache;
337dd7cddfSDavid du Colombier rp->cmd.p = cmd;
347dd7cddfSDavid du Colombier rp->cmd.count = sizeof(cmd);
357dd7cddfSDavid du Colombier rp->data.p = cmd;
367dd7cddfSDavid du Colombier rp->data.count = 0;
377dd7cddfSDavid du Colombier rp->data.write = 1;
387dd7cddfSDavid du Colombier return SRrequest(rp);
397dd7cddfSDavid du Colombier }
407dd7cddfSDavid du Colombier
417dd7cddfSDavid du Colombier long
SRTOC(ScsiReq * rp,void * data,int nbytes,uchar format,uchar track)427dd7cddfSDavid du Colombier SRTOC(ScsiReq *rp, void *data, int nbytes, uchar format, uchar track)
437dd7cddfSDavid du Colombier {
447dd7cddfSDavid du Colombier uchar cmd[10];
457dd7cddfSDavid du Colombier
467dd7cddfSDavid du Colombier memset(cmd, 0, sizeof(cmd));
477dd7cddfSDavid du Colombier cmd[0] = ScmdRTOC;
487dd7cddfSDavid du Colombier cmd[2] = format;
497dd7cddfSDavid du Colombier cmd[6] = track;
507dd7cddfSDavid du Colombier cmd[7] = nbytes>>8;
517dd7cddfSDavid du Colombier cmd[8] = nbytes;
527dd7cddfSDavid du Colombier rp->cmd.p = cmd;
537dd7cddfSDavid du Colombier rp->cmd.count = sizeof(cmd);
547dd7cddfSDavid du Colombier rp->data.p = data;
557dd7cddfSDavid du Colombier rp->data.count = nbytes;
567dd7cddfSDavid du Colombier rp->data.write = 0;
577dd7cddfSDavid du Colombier return SRrequest(rp);
587dd7cddfSDavid du Colombier }
597dd7cddfSDavid du Colombier
607dd7cddfSDavid du Colombier long
SRrdiscinfo(ScsiReq * rp,void * data,int nbytes)617dd7cddfSDavid du Colombier SRrdiscinfo(ScsiReq *rp, void *data, int nbytes)
627dd7cddfSDavid du Colombier {
637dd7cddfSDavid du Colombier uchar cmd[10];
647dd7cddfSDavid du Colombier
657dd7cddfSDavid du Colombier memset(cmd, 0, sizeof(cmd));
667dd7cddfSDavid du Colombier cmd[0] = ScmdRdiscinfo;
677dd7cddfSDavid du Colombier cmd[7] = nbytes>>8;
687dd7cddfSDavid du Colombier cmd[8] = nbytes;
697dd7cddfSDavid du Colombier rp->cmd.p = cmd;
707dd7cddfSDavid du Colombier rp->cmd.count = sizeof(cmd);
717dd7cddfSDavid du Colombier rp->data.p = data;
727dd7cddfSDavid du Colombier rp->data.count = nbytes;
737dd7cddfSDavid du Colombier rp->data.write = 0;
747dd7cddfSDavid du Colombier return SRrequest(rp);
757dd7cddfSDavid du Colombier }
767dd7cddfSDavid du Colombier
777dd7cddfSDavid du Colombier long
SRrtrackinfo(ScsiReq * rp,void * data,int nbytes,int track)787dd7cddfSDavid du Colombier SRrtrackinfo(ScsiReq *rp, void *data, int nbytes, int track)
797dd7cddfSDavid du Colombier {
807dd7cddfSDavid du Colombier uchar cmd[10];
817dd7cddfSDavid du Colombier
827dd7cddfSDavid du Colombier memset(cmd, 0, sizeof(cmd));
837dd7cddfSDavid du Colombier cmd[0] = ScmdRtrackinfo;
847dd7cddfSDavid du Colombier cmd[1] = 0x01;
857dd7cddfSDavid du Colombier cmd[2] = track>>24;
867dd7cddfSDavid du Colombier cmd[3] = track>>16;
877dd7cddfSDavid du Colombier cmd[4] = track>>8;
887dd7cddfSDavid du Colombier cmd[5] = track;
897dd7cddfSDavid du Colombier cmd[7] = nbytes>>8;
907dd7cddfSDavid du Colombier cmd[8] = nbytes;
917dd7cddfSDavid du Colombier rp->cmd.p = cmd;
927dd7cddfSDavid du Colombier rp->cmd.count = sizeof(cmd);
937dd7cddfSDavid du Colombier rp->data.p = data;
947dd7cddfSDavid du Colombier rp->data.count = nbytes;
957dd7cddfSDavid du Colombier rp->data.write = 0;
967dd7cddfSDavid du Colombier return SRrequest(rp);
977dd7cddfSDavid du Colombier }
987dd7cddfSDavid du Colombier
997dd7cddfSDavid du Colombier long
SRfwaddr(ScsiReq * rp,uchar track,uchar mode,uchar npa,uchar * data)1007dd7cddfSDavid du Colombier SRfwaddr(ScsiReq *rp, uchar track, uchar mode, uchar npa, uchar *data)
1017dd7cddfSDavid du Colombier {
1027dd7cddfSDavid du Colombier uchar cmd[10];
1037dd7cddfSDavid du Colombier
1047dd7cddfSDavid du Colombier memset(cmd, 0, sizeof(cmd));
1057dd7cddfSDavid du Colombier cmd[0] = ScmdFwaddr;
1067dd7cddfSDavid du Colombier cmd[2] = track;
1077dd7cddfSDavid du Colombier cmd[3] = mode;
1087dd7cddfSDavid du Colombier cmd[7] = npa;
1097dd7cddfSDavid du Colombier rp->cmd.p = cmd;
1107dd7cddfSDavid du Colombier rp->cmd.count = sizeof(cmd);
1117dd7cddfSDavid du Colombier rp->data.p = data;
1127dd7cddfSDavid du Colombier rp->data.count = MaxDirData;
1137dd7cddfSDavid du Colombier rp->data.write = 0;
1147dd7cddfSDavid du Colombier return SRrequest(rp);
1157dd7cddfSDavid du Colombier }
1167dd7cddfSDavid du Colombier
1177dd7cddfSDavid du Colombier long
SRtreserve(ScsiReq * rp,long nbytes)1187dd7cddfSDavid du Colombier SRtreserve(ScsiReq *rp, long nbytes)
1197dd7cddfSDavid du Colombier {
1207dd7cddfSDavid du Colombier uchar cmd[10];
1217dd7cddfSDavid du Colombier long n;
1227dd7cddfSDavid du Colombier
1237dd7cddfSDavid du Colombier if((nbytes % rp->lbsize)){
1247dd7cddfSDavid du Colombier rp->status = Status_BADARG;
1257dd7cddfSDavid du Colombier return -1;
1267dd7cddfSDavid du Colombier }
1277dd7cddfSDavid du Colombier memset(cmd, 0, sizeof(cmd));
1287dd7cddfSDavid du Colombier cmd[0] = ScmdTreserve;
1297dd7cddfSDavid du Colombier n = nbytes/rp->lbsize;
1307dd7cddfSDavid du Colombier cmd[5] = n>>24;
1317dd7cddfSDavid du Colombier cmd[6] = n>>16;
1327dd7cddfSDavid du Colombier cmd[7] = n>>8;
1337dd7cddfSDavid du Colombier cmd[8] = n;
1347dd7cddfSDavid du Colombier rp->cmd.p = cmd;
1357dd7cddfSDavid du Colombier rp->cmd.count = sizeof(cmd);
1367dd7cddfSDavid du Colombier rp->data.p = cmd;
1377dd7cddfSDavid du Colombier rp->data.count = 0;
1387dd7cddfSDavid du Colombier rp->data.write = 1;
1397dd7cddfSDavid du Colombier return SRrequest(rp);
1407dd7cddfSDavid du Colombier }
1417dd7cddfSDavid du Colombier
1427dd7cddfSDavid du Colombier long
SRtinfo(ScsiReq * rp,uchar track,uchar * data)1437dd7cddfSDavid du Colombier SRtinfo(ScsiReq *rp, uchar track, uchar *data)
1447dd7cddfSDavid du Colombier {
1457dd7cddfSDavid du Colombier uchar cmd[10];
1467dd7cddfSDavid du Colombier
1477dd7cddfSDavid du Colombier memset(cmd, 0, sizeof(cmd));
1487dd7cddfSDavid du Colombier cmd[0] = ScmdTinfo;
1497dd7cddfSDavid du Colombier cmd[5] = track;
1507dd7cddfSDavid du Colombier cmd[8] = MaxDirData;
1517dd7cddfSDavid du Colombier rp->cmd.p = cmd;
1527dd7cddfSDavid du Colombier rp->cmd.count = sizeof(cmd);
1537dd7cddfSDavid du Colombier rp->data.p = data;
1547dd7cddfSDavid du Colombier rp->data.count = MaxDirData;
1557dd7cddfSDavid du Colombier rp->data.write = 0;
1567dd7cddfSDavid du Colombier return SRrequest(rp);
1577dd7cddfSDavid du Colombier }
1587dd7cddfSDavid du Colombier
1597dd7cddfSDavid du Colombier long
SRwtrack(ScsiReq * rp,void * buf,long nbytes,uchar track,uchar mode)1607dd7cddfSDavid du Colombier SRwtrack(ScsiReq *rp, void *buf, long nbytes, uchar track, uchar mode)
1617dd7cddfSDavid du Colombier {
1627dd7cddfSDavid du Colombier uchar cmd[10];
1637dd7cddfSDavid du Colombier long m, n;
1647dd7cddfSDavid du Colombier
165e6dcbf51SDavid du Colombier if((nbytes % rp->lbsize) || nbytes > maxiosize){
1667dd7cddfSDavid du Colombier rp->status = Status_BADARG;
1677dd7cddfSDavid du Colombier return -1;
1687dd7cddfSDavid du Colombier }
1697dd7cddfSDavid du Colombier memset(cmd, 0, sizeof(cmd));
1707dd7cddfSDavid du Colombier cmd[0] = ScmdTwrite;
1717dd7cddfSDavid du Colombier cmd[5] = track;
1727dd7cddfSDavid du Colombier cmd[6] = mode;
1737dd7cddfSDavid du Colombier n = nbytes/rp->lbsize;
1747dd7cddfSDavid du Colombier cmd[7] = n>>8;
1757dd7cddfSDavid du Colombier cmd[8] = n;
1767dd7cddfSDavid du Colombier rp->cmd.p = cmd;
1777dd7cddfSDavid du Colombier rp->cmd.count = sizeof(cmd);
1787dd7cddfSDavid du Colombier rp->data.p = buf;
1797dd7cddfSDavid du Colombier rp->data.count = nbytes;
1807dd7cddfSDavid du Colombier rp->data.write = 1;
1817dd7cddfSDavid du Colombier m = SRrequest(rp);
1827dd7cddfSDavid du Colombier if(m < 0)
1837dd7cddfSDavid du Colombier return -1;
1847dd7cddfSDavid du Colombier rp->offset += n;
1857dd7cddfSDavid du Colombier return m;
1867dd7cddfSDavid du Colombier }
1877dd7cddfSDavid du Colombier
1887dd7cddfSDavid du Colombier long
SRmload(ScsiReq * rp,uchar code)1897dd7cddfSDavid du Colombier SRmload(ScsiReq *rp, uchar code)
1907dd7cddfSDavid du Colombier {
1917dd7cddfSDavid du Colombier uchar cmd[12];
1927dd7cddfSDavid du Colombier
1937dd7cddfSDavid du Colombier memset(cmd, 0, sizeof(cmd));
1947dd7cddfSDavid du Colombier cmd[0] = ScmdMload;
1957dd7cddfSDavid du Colombier cmd[8] = code;
1967dd7cddfSDavid du Colombier rp->cmd.p = cmd;
1977dd7cddfSDavid du Colombier rp->cmd.count = sizeof(cmd);
1987dd7cddfSDavid du Colombier rp->data.p = cmd;
1997dd7cddfSDavid du Colombier rp->data.count = 0;
2007dd7cddfSDavid du Colombier rp->data.write = 1;
2017dd7cddfSDavid du Colombier return SRrequest(rp);
2027dd7cddfSDavid du Colombier }
2037dd7cddfSDavid du Colombier
2047dd7cddfSDavid du Colombier long
SRfixation(ScsiReq * rp,uchar type)2057dd7cddfSDavid du Colombier SRfixation(ScsiReq *rp, uchar type)
2067dd7cddfSDavid du Colombier {
2077dd7cddfSDavid du Colombier uchar cmd[10];
2087dd7cddfSDavid du Colombier
2097dd7cddfSDavid du Colombier memset(cmd, 0, sizeof(cmd));
2107dd7cddfSDavid du Colombier cmd[0] = ScmdFixation;
2117dd7cddfSDavid du Colombier cmd[8] = type;
2127dd7cddfSDavid du Colombier rp->cmd.p = cmd;
2137dd7cddfSDavid du Colombier rp->cmd.count = sizeof(cmd);
2147dd7cddfSDavid du Colombier rp->data.p = cmd;
2157dd7cddfSDavid du Colombier rp->data.count = 0;
2167dd7cddfSDavid du Colombier rp->data.write = 1;
2177dd7cddfSDavid du Colombier return SRrequest(rp);
2187dd7cddfSDavid du Colombier }
219