示例#1
0
static int
aoerio(SDreq *r)
{
    int i, count, rw;
    uvlong lba;
    Ctlr *c;
    SDunit *u;

    u = r->unit;
    c = u->dev->ctlr;
//	if(c->feat & Datapi)
//		return aoeriopkt(r, d);

    if(r->cmd[0] == 0x35 || r->cmd[0] == 0x91) {
        qlock(c);
        i = flushcache(c);
        qunlock(c);
        if(i == 0)
            return sdsetsense(r, SDok, 0, 0, 0);
        return sdsetsense(r, SDcheck, 3, 0xc, 2);
    }

    if((i = sdfakescsi(r)) != SDnostatus) {
        r->status = i;
        return i;
    }
    if((i = sdfakescsirw(r, &lba, &count, &rw)) != SDnostatus)
        return i;
    r->rlen = aoebio(u, r->lun, rw == SDwrite, r->data, count, lba);
    return r->status = SDok;
}
示例#2
0
文件: sdmmc.c 项目: srk-cmu/9problems
static int
mmcrio(SDreq *r)
{
	int i, rw, count;
	uvlong lba;

	if((i = sdfakescsi(r)) != SDnostatus)
		return r->status = i;
	if((i = sdfakescsirw(r, &lba, &count, &rw)) != SDnostatus)
		return i;
	r->rlen = mmcbio(r->unit, r->lun, rw == SDwrite, r->data, count, lba);
	return r->status = SDok;
}
示例#3
0
static int
looprio(SDreq *r)
{
	SDev *sdev;
	SDunit *unit;
	Ctlr *ctlr;
	uchar *cmd;
	uvlong lba;
	long count, n;
	Chan *c;
	int status;

	unit = r->unit;
	sdev = unit->dev;
	ctlr = sdev->ctlr;
	cmd = r->cmd;

	if((status = sdfakescsi(r, nil, 0)) != SDnostatus){
#warning "Need to check for SDcheck in sdloop.";
		/* XXX check for SDcheck here */
		r->status = status;
		return status;
	}

	switch(cmd[0]){
	case 0x28:	/* read */
	case 0x2A:	/* write */
		break;
	default:
		print("%s: bad cmd 0x%.2ux\n", unit->perm.name, cmd[0]);
		r->status = SDcheck;
		return SDcheck;
	}

	lba = (cmd[2]<<24)|(cmd[3]<<16)|(cmd[4]<<8)|cmd[5];
	count = (cmd[7]<<8)|cmd[8];
	if(r->data == nil)
		return SDok;
	if(r->dlen < count*512)
		count = r->dlen/512;

	c = ctlr->c;
	if(cmd[0] == 0x28)
		n = devtab[c->type]->read(c, r->data, count*512, lba*512);
	else
		n = devtab[c->type]->write(c, r->data, count*512, lba*512);
	r->rlen = n;
	return SDok;
}
示例#4
0
static int
looprio(SDreq *r)
{
	int i, count, rw;
	uvlong lba;
	SDunit *u;

	u = r->unit;

	if(r->cmd[0] == 0x35 || r->cmd[0] == 0x91)
		return sdsetsense(r, SDok, 0, 0, 0);

	if((i = sdfakescsi(r)) != SDnostatus)
		return r->status = i;
	if((i = sdfakescsirw(r, &lba, &count, &rw)) != SDnostatus)
		return i;
	r->rlen = loopbio(u, r->lun, rw == SDwrite, r->data, count, lba);
	return r->status = SDok;
}
示例#5
0
static int
viorio(SDreq *r)
{
	int i, count, rw;
	uvlong lba;
	SDunit *u;

	u = r->unit;
	if(r->cmd[0] == 0x35 || r->cmd[0] == 0x91){
		if(vioreq(u->dev->ctlr, 4, nil, 0, 0, 0) != 0)
			return sdsetsense(r, SDcheck, 3, 0xc, 2);
		return sdsetsense(r, SDok, 0, 0, 0);
	}
	if((i = sdfakescsi(r)) != SDnostatus)
		return r->status = i;
	if((i = sdfakescsirw(r, &lba, &count, &rw)) != SDnostatus)
		return i;
	r->rlen = viobio(u, r->lun, rw == SDwrite, r->data, count, lba);
	return r->status = SDok;
}
示例#6
0
static int
aoerio(SDreq *r)
{
	int i, count;
	uvlong lba;
	char *name;
	uchar *cmd;
	long (*rio)(Chan*, void*, long, vlong);
	Ctlr *c;
	SDunit *unit;

	unit = r->unit;
	c = unit->dev->ctlr;
//	if(c->feat & Datapi)
//		return aoeriopkt(r, d);

	cmd = r->cmd;
	name = unit->name;

	if(r->cmd[0] == 0x35 || r->cmd[0] == 0x91){
//		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;
		return i;
	}

	switch(*cmd){
	case 0x88:
	case 0x28:
		rio = devtab[c->c->type]->read;
		break;
	case 0x8a:
	case 0x2a:
		rio = devtab[c->c->type]->write;
		break;
	default:
		print("%s: bad cmd %#.2ux\n", name, cmd[0]);
		r->status = SDcheck;
		return SDcheck;
	}

	if(r->data == nil)
		return SDok;

	if(r->clen == 16){
		if(cmd[2] || cmd[3])
			return sdsetsense(r, SDcheck, 3, 0xc, 2);
		lba = (uvlong)cmd[4]<<40 | (uvlong)cmd[5]<<32;
		lba |=   cmd[6]<<24 |  cmd[7]<<16 |  cmd[8]<<8 | cmd[9];
		count = cmd[10]<<24 | cmd[11]<<16 | cmd[12]<<8 | cmd[13];
	}else{
		lba  = cmd[2]<<24 | cmd[3]<<16 | cmd[4]<<8 | cmd[5];
		count = cmd[7]<<8 | cmd[8];
	}

	count *= Aoesectsz;

	if(r->dlen < count)
		count = r->dlen & ~0x1ff;

	if(waserror()){
		if(strcmp(up->errstr, Echange) == 0 ||
		    strcmp(up->errstr, Eaoedown) == 0)
			unit->sectors = 0;
		nexterror();
	}
	r->rlen = rio(c->c, r->data, count, Aoesectsz * lba);
	poperror();
	r->status = SDok;
	return SDok;
}