fixed memory leak in bcm driver
This commit is contained in:
parent
8f6173c8bd
commit
61a8b5c803
|
@ -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);
|
||||||
|
|
Loading…
Reference in a new issue