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; }
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; }
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; }
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; }
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; }
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; }