usbohci: virtual box fix from richard miller
This commit is contained in:
parent
3cf8b41f8b
commit
9e65fced98
1 changed files with 15 additions and 11 deletions
|
@ -1146,10 +1146,10 @@ qhinterrupt(Ctlr *, Ep *ep, Qio *io, Td *td, int)
|
|||
switch(err){
|
||||
case Tddataovr: /* Overrun is not an error */
|
||||
case Tdok:
|
||||
/* can't make this assertion in virtualbox */
|
||||
// if(td->cbp != 0)
|
||||
// panic("ohci: full packet but cbp != 0");
|
||||
break;
|
||||
/* virtualbox doesn't always report underflow on short packets */
|
||||
if(td->cbp == 0)
|
||||
break;
|
||||
/* fall through */
|
||||
case Tddataund:
|
||||
/* short input packets are ok */
|
||||
if(mode == OREAD){
|
||||
|
@ -1338,12 +1338,16 @@ epgettd(Ep *ep, Qio *io, Td **dtdp, int flags, void *a, int count)
|
|||
Td *td, *dtd;
|
||||
Block *bp;
|
||||
|
||||
if(ep->maxpkt > 0x2000)
|
||||
panic("ohci: max packet > two pages");
|
||||
if(ep->maxpkt < count)
|
||||
error("maxpkt too short");
|
||||
bp = allocb(ep->maxpkt); /* panics if no mem */
|
||||
assert(bp != nil);
|
||||
if(count <= BY2PG)
|
||||
bp = allocb(count);
|
||||
else{
|
||||
if(count > 2*BY2PG)
|
||||
panic("ohci: transfer > two pages");
|
||||
/* maximum of one physical page crossing allowed */
|
||||
bp = allocb(count+BY2PG);
|
||||
bp->rp = (uchar*)PGROUND((uintptr)bp->rp);
|
||||
bp->wp = bp->rp;
|
||||
}
|
||||
dtd = *dtdp;
|
||||
td = dtd;
|
||||
td->bp = bp;
|
||||
|
@ -1494,7 +1498,7 @@ epio(Ep *ep, Qio *io, void *a, long count, int mustlock)
|
|||
ltd = td0 = ed->tds;
|
||||
load = tot = 0;
|
||||
do{
|
||||
n = ep->maxpkt;
|
||||
n = 2*BY2PG;
|
||||
if(count-tot < n)
|
||||
n = count-tot;
|
||||
if(c != nil && io->tok != Tdtokin)
|
||||
|
|
Loading…
Reference in a new issue