Subject: CVS commit: src/sys/dev/ic
To: None <source-changes@NetBSD.org>
From: David Young <dyoung@netbsd.org>
List: source-changes
Date: 01/06/2007 08:27:54
Module Name:	src
Committed By:	dyoung
Date:		Sat Jan  6 08:27:53 UTC 2007

Modified Files:
	src/sys/dev/ic: rtw.c rtwreg.h rtwvar.h

Log Message:
I have made a small change that suppresses "recovery" from (spurious?)
tx timeouts on the beacon queue.  The driver's recovery process
badly disrupts the MAC's receiver.  This needs a closer look, later.

Every other fix is by Charles M. Hannum.  Charles writes:

"With these, the device is quite stable under load, does not experience
xmit timeouts, no longer mysteriously freezes, and does not spew
a lot of garbage.  It does, however, continue to get some "tx fifo
underflow"s.

global, SYSCTL_SETUP():
a) Removed unused sysctl variables.

rtw_io_enable():
b) Change rtw_io_enable to take a softc, and make it call
   rtw_txring_fixup().
c) Enable the PCI multiple read/write bit.
d) Always reset rdb_next to 0 when starting the receive engine.

rtw_intr_rx():
e) When processing receive packets, store the next pointer in rdb_next
   and read it back on the next round, to fix a race condition vs.
   rtw_tune() during AP discovery and association.
f) Remove the special "skip to 0th descriptor" code, because it is no
   longer needed.

rtw_collect_txring():
g) In the "force" case, stop when we catch up to the hardware xmit
   pointer.

rtw_intr_beacon():
h) Resetting tdb_next here looked fishy to me, in light of changes in
   rtw_collect_txring().  XXX However, this is the one part I haven't
   tested.

rtw_txring_fixup():
i) Add function and line arguments, so we can print out information
   about the caller.
j) In addition to reading the hardware pointer, skip over any
   additional packets with OWN set -- we may have queued more.

rtw_rxring_fixup():
k) Remove this, because it's completely wrong.

rtw_intr_ioerror():
l) Don't handle receive overruns here; handle them in the normal receive
   path.  Also changed RTW_INTR_RX and RTW_INTR_IOERROR accordingly.
m) Do not fiddle with CR; the transmit engine is still running just
   fine.
n) Do not fiddle with IMR; it was unnecessary.
o) Don't touch the receive engine at all; not necessary now that we're
   leaving CR alone.
p) Remove the rtw_do_chip_reset case; it was dangerous and not actually
   used.

rtw_intr():
q) Don't mask off ISR bits when we pass down the ISR value; it's not
   necessary, and sometimes the other bits useful in debugging output.

rtw_seg_too_short():
r) Don't spew here; the caller will do it if necessary.  (Stops spewage
   in an expected case.)

rtw_rxdesc_blk:
s) Minor change to make the elements have the same order as txdesc_blk.

general:
t) Added a bunch of debugging output, #ifdef RTW_DIAG, that was useful
   while investigating the ring management problems.  Also moved
   rtw_txring_fixup() into RTW_DIAG, as I believe the transmit pointer
   is always kept in sync now, and the function has potential race
   conditions.


To generate a diff of this commit:
cvs rdiff -r1.82 -r1.83 src/sys/dev/ic/rtw.c
cvs rdiff -r1.22 -r1.23 src/sys/dev/ic/rtwreg.h
cvs rdiff -r1.29 -r1.30 src/sys/dev/ic/rtwvar.h

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.