ether79c970: fix mistake

fix bug introduced by amd64 support:

forgot to update ring index i on receive. surprisingly
this was working until there where more than one packet
to process. sorry.

ilock the controller while processing rings. this should
be fixed and use kprocs instead.
This commit is contained in:
cinap_lenrek 2014-06-09 07:21:36 +02:00
parent 01b5ac1402
commit 858d3e39ab

View file

@ -404,6 +404,7 @@ intrloop:
* until a descriptor is encountered still owned by the chip.
*/
if(csr0 & Rint){
ilock(ctlr);
i = ctlr->rdrx;
dre = &ctlr->rdr[i];
while(!(dre->md1 & Own)){
@ -435,16 +436,17 @@ intrloop:
dre->md2 = 0;
dre->md1 = Own|(-Rbsize & 0xFFFF);
ctlr->rdrx = NEXT(ctlr->rdrx, Nrdre);
dre = &ctlr->rdr[ctlr->rdrx];
i = ctlr->rdrx = NEXT(ctlr->rdrx, Nrdre);
dre = &ctlr->rdr[i];
}
iunlock(ctlr);
}
/*
* Transmitter interrupt: wakeup anyone waiting for a free descriptor.
*/
if(csr0 & Tint){
lock(ctlr);
ilock(ctlr);
while(ctlr->ntq){
i = ctlr->tdri;
dre = &ctlr->tdr[i];
@ -474,7 +476,7 @@ intrloop:
ctlr->tdri = NEXT(ctlr->tdri, Ntdre);
}
txstart(ether);
unlock(ctlr);
iunlock(ctlr);
}
goto intrloop;
}