static void atarw(Aoedev *d, Frame *f) { ulong bcnt; char extbit, writebit; Aoeata *ah; Srb *srb; extbit = 0x4; writebit = 0x10; srb = d->inprocess; bcnt = d->maxbcnt; if(bcnt > srb->len) bcnt = srb->len; f->nhdr = AOEATASZ; memset(f->hdr, 0, f->nhdr); ah = (Aoeata*)f->hdr; if(hset(d, f, ah, ACata) == -1) return; f->dp = srb->dp; f->bcnt = bcnt; f->lba = srb->sector; f->srb = srb; ah->scnt = bcnt / Aoesectsz; putlba(ah, f->lba); if(d->flag & Dllba) ah->aflag |= AAFext; else { extbit = 0; ah->lba[3] &= 0x0f; ah->lba[3] |= 0xe0; /* LBA bit+obsolete 0xa0 */ } if(srb->write){ ah->aflag |= AAFwrite; f->dlen = bcnt; }else{ writebit = 0; f->dlen = 0; } ah->cmdstat = 0x20 | writebit | extbit; /* mark tracking fields and load out */ srb->nout++; srb->dp = (uchar*)srb->dp + bcnt; srb->len -= bcnt; srb->sector += bcnt / Aoesectsz; if(srb->len == 0) d->inprocess = nil; d->nout++; f->dl->npkt++; if(waserror()){ f->tag = Tfree; d->inprocess = nil; nexterror(); } f->nl->dc->dev->bwrite(f->nl->dc, allocfb(f), 0); poperror(); }
static int resend(Aoedev *d, Frame *f) { ulong n; Aoeata *a; a = (Aoeata*)f->hdr; if(hset(d, f, a, a->cmd) == -1) return -1; n = f->bcnt; if(n > d->maxbcnt){ n = d->maxbcnt; /* mtu mismatch (jumbo fail?) */ if(f->dlen > n) f->dlen = n; } a->scnt = n / Aoesectsz; f->dl->resent++; f->dl->npkt++; if(waserror()) return -1; devtab[f->nl->dc->type]->bwrite(f->nl->dc, allocfb(f), 0); poperror(); return 0; }