ref: 0aefe37ed56172da2bd21c10acd930f7cb968288
parent: 847e01fd2d44688d04b84194da084bc63f73118d
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)
--
⑨