ref: 9e65fced986d6dfcc3d00077c592ef5bc9138d0b
parent: 3cf8b41f8b91b4db26d41a1a6437ba2f9a631c86
author: cinap_lenrek <cinap_lenrek@centraldogma>
date: Fri Sep 2 10:11:23 EDT 2011
usbohci: virtual box fix from richard miller
--- a/sys/src/9/pc/usbohci.c
+++ b/sys/src/9/pc/usbohci.c
@@ -1146,10 +1146,10 @@
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 @@
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 @@
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)