Subversion Repositories planix.SVN

Rev

Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

#include <u.h>
#include <libc.h>
#include <disk.h>
#include "scsireq.h"

long
SRblank(ScsiReq *rp, uchar type, uchar track)
{
        uchar cmd[12];

        memset(cmd, 0, sizeof(cmd));
        cmd[0] = ScmdBlank;
        cmd[1] = type;
        cmd[2] = track>>24;
        cmd[3] = track>>16;
        cmd[4] = track>>8;
        cmd[5] = track;
        rp->cmd.p = cmd;
        rp->cmd.count = sizeof(cmd);
        rp->data.p = cmd;
        rp->data.count = 0;
        rp->data.write = 1;
        return SRrequest(rp);
}

long
SRsynccache(ScsiReq *rp)
{
        uchar cmd[10];

        memset(cmd, 0, sizeof(cmd));
        cmd[0] = ScmdSynccache;
        rp->cmd.p = cmd;
        rp->cmd.count = sizeof(cmd);
        rp->data.p = cmd;
        rp->data.count = 0;
        rp->data.write = 1;
        return SRrequest(rp);
}

long
SRTOC(ScsiReq *rp, void *data, int nbytes, uchar format, uchar track)
{
        uchar cmd[10];

        memset(cmd, 0, sizeof(cmd));
        cmd[0] = ScmdRTOC;
        cmd[2] = format;
        cmd[6] = track;
        cmd[7] = nbytes>>8;
        cmd[8] = nbytes;
        rp->cmd.p = cmd;
        rp->cmd.count = sizeof(cmd);
        rp->data.p = data;
        rp->data.count = nbytes;
        rp->data.write = 0;
        return SRrequest(rp);
}

long
SRrdiscinfo(ScsiReq *rp, void *data, int nbytes)
{
        uchar cmd[10];

        memset(cmd, 0, sizeof(cmd));
        cmd[0] = ScmdRdiscinfo;
        cmd[7] = nbytes>>8;
        cmd[8] = nbytes;
        rp->cmd.p = cmd;
        rp->cmd.count = sizeof(cmd);
        rp->data.p = data;
        rp->data.count = nbytes;
        rp->data.write = 0;
        return SRrequest(rp);
}

long
SRrtrackinfo(ScsiReq *rp, void *data, int nbytes, int track)
{
        uchar cmd[10];

        memset(cmd, 0, sizeof(cmd));
        cmd[0] = ScmdRtrackinfo;
        cmd[1] = 0x01;
        cmd[2] = track>>24;
        cmd[3] = track>>16;
        cmd[4] = track>>8;
        cmd[5] = track;
        cmd[7] = nbytes>>8;
        cmd[8] = nbytes;
        rp->cmd.p = cmd;
        rp->cmd.count = sizeof(cmd);
        rp->data.p = data;
        rp->data.count = nbytes;
        rp->data.write = 0;
        return SRrequest(rp);
}

long
SRfwaddr(ScsiReq *rp, uchar track, uchar mode, uchar npa, uchar *data)
{
        uchar cmd[10];

        memset(cmd, 0, sizeof(cmd));
        cmd[0] = ScmdFwaddr;
        cmd[2] = track;
        cmd[3] = mode;
        cmd[7] = npa;
        rp->cmd.p = cmd;
        rp->cmd.count = sizeof(cmd);
        rp->data.p = data;
        rp->data.count = MaxDirData;
        rp->data.write = 0;
        return SRrequest(rp);
}

long
SRtreserve(ScsiReq *rp, long nbytes)
{
        uchar cmd[10];
        long n;

        if((nbytes % rp->lbsize)){
                rp->status = Status_BADARG;
                return -1;
        }
        memset(cmd, 0, sizeof(cmd));
        cmd[0] = ScmdTreserve;
        n = nbytes/rp->lbsize;
        cmd[5] = n>>24;
        cmd[6] = n>>16;
        cmd[7] = n>>8;
        cmd[8] = n;
        rp->cmd.p = cmd;
        rp->cmd.count = sizeof(cmd);
        rp->data.p = cmd;
        rp->data.count = 0;
        rp->data.write = 1;
        return SRrequest(rp);
}

long
SRtinfo(ScsiReq *rp, uchar track, uchar *data)
{
        uchar cmd[10];

        memset(cmd, 0, sizeof(cmd));
        cmd[0] = ScmdTinfo;
        cmd[5] = track;
        cmd[8] = MaxDirData;
        rp->cmd.p = cmd;
        rp->cmd.count = sizeof(cmd);
        rp->data.p = data;
        rp->data.count = MaxDirData;
        rp->data.write = 0;
        return SRrequest(rp);
}

long
SRwtrack(ScsiReq *rp, void *buf, long nbytes, uchar track, uchar mode)
{
        uchar cmd[10];
        long m, n;

        if((nbytes % rp->lbsize) || nbytes > maxiosize){
                rp->status = Status_BADARG;
                return -1;
        }
        memset(cmd, 0, sizeof(cmd));
        cmd[0] = ScmdTwrite;
        cmd[5] = track;
        cmd[6] = mode;
        n = nbytes/rp->lbsize;
        cmd[7] = n>>8;
        cmd[8] = n;
        rp->cmd.p = cmd;
        rp->cmd.count = sizeof(cmd);
        rp->data.p = buf;
        rp->data.count = nbytes;
        rp->data.write = 1;
        m = SRrequest(rp);
        if(m < 0)
                return -1;
        rp->offset += n;
        return m;
}

long
SRmload(ScsiReq *rp, uchar code)
{
        uchar cmd[12];

        memset(cmd, 0, sizeof(cmd));
        cmd[0] = ScmdMload;
        cmd[8] = code;
        rp->cmd.p = cmd;
        rp->cmd.count = sizeof(cmd);
        rp->data.p = cmd;
        rp->data.count = 0;
        rp->data.write = 1;
        return SRrequest(rp);
}

long
SRfixation(ScsiReq *rp, uchar type)
{
        uchar cmd[10];

        memset(cmd, 0, sizeof(cmd));
        cmd[0] = ScmdFixation;
        cmd[8] = type;
        rp->cmd.p = cmd;
        rp->cmd.count = sizeof(cmd);
        rp->data.p = cmd;
        rp->data.count = 0;
        rp->data.write = 1;
        return SRrequest(rp);
}