From 858d3e39ab7e792c1d6e853ed699aeb5faf7d47c Mon Sep 17 00:00:00 2001 From: cinap_lenrek Date: Mon, 9 Jun 2014 07:21:36 +0200 Subject: 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. --- sys/src/9/pc/ether79c970.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/sys/src/9/pc/ether79c970.c b/sys/src/9/pc/ether79c970.c index e77b1cd3b..bb1741201 100644 --- a/sys/src/9/pc/ether79c970.c +++ b/sys/src/9/pc/ether79c970.c @@ -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; } -- cgit v1.2.3