diff options
author | cinap_lenrek <cinap_lenrek@felloff.net> | 2014-06-09 07:21:36 +0200 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@felloff.net> | 2014-06-09 07:21:36 +0200 |
commit | 858d3e39ab7e792c1d6e853ed699aeb5faf7d47c (patch) | |
tree | 6ef217407c2d3ca6ae0bd0420b6b548501f97465 | |
parent | 01b5ac14024a26f4f1771bc7027e146e86f9c2c3 (diff) |
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.
-rw-r--r-- | sys/src/9/pc/ether79c970.c | 10 |
1 files 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; } |