fixed memory leak in bcm driver

This commit is contained in:
aiju 2011-07-19 18:56:41 +02:00
parent 8f6173c8bd
commit 61a8b5c803

View file

@ -326,18 +326,20 @@ bcmreceive(Ether *edev)
} }
static void static void
bcmtransclean(Ether *edev) bcmtransclean(Ether *edev, int dolock)
{ {
Ctlr *ctlr; Ctlr *ctlr;
ctlr = edev->ctlr; ctlr = edev->ctlr;
ilock(&ctlr->txlock); if(dolock)
ilock(&ctlr->txlock);
while(ctlr->sendcleani != (ctlr->status[4] >> 16)) { while(ctlr->sendcleani != (ctlr->status[4] >> 16)) {
freeb(ctlr->sends[ctlr->sendri]); freeb(ctlr->sends[ctlr->sendcleani]);
ctlr->sends[ctlr->sendri] = 0; ctlr->sends[ctlr->sendcleani] = 0;
ctlr->sendcleani = (ctlr->sendcleani + 1) & (SendRingLen - 1); ctlr->sendcleani = (ctlr->sendcleani + 1) & (SendRingLen - 1);
} }
iunlock(&ctlr->txlock); if(dolock)
iunlock(&ctlr->txlock);
} }
static void static void
@ -356,6 +358,11 @@ bcmtransmit(Ether *edev)
print("bcm: send queue full\n"); print("bcm: send queue full\n");
break; break;
} }
if(incr == ctlr->sendcleani) {
bcmtransclean(edev, 0);
if(incr == ctlr->sendcleani)
break;
}
bp = qget(edev->oq); bp = qget(edev->oq);
if(bp == nil) break; if(bp == nil) break;
next = ctlr->sendr + ctlr->sendri * 4; next = ctlr->sendr + ctlr->sendri * 4;
@ -414,7 +421,7 @@ bcminterrupt(Ureg*, void *arg)
if(status & LinkStateChange) checklink(edev); if(status & LinkStateChange) checklink(edev);
// print("bcm: interrupt %8ulx %8ulx\n", ctlr->status[2], ctlr->status[4]); // print("bcm: interrupt %8ulx %8ulx\n", ctlr->status[2], ctlr->status[4]);
bcmreceive(edev); bcmreceive(edev);
bcmtransclean(edev); bcmtransclean(edev, 1);
bcmtransmit(edev); bcmtransmit(edev);
csr32(ctlr, InterruptMailbox) = tag << 24; csr32(ctlr, InterruptMailbox) = tag << 24;
iunlock(&ctlr->imlock); iunlock(&ctlr->imlock);