freebsd-nq/sys/dev
Bill Paul 73bf949c34 It appears that under certain circumstances that I still can't quite pin
down, the dc driver and receiver can fall out of sync with one another,
resulting in a condition where the chip continues to receive packets
but the driver never notices. Normally, the receive handler checks each
descriptor starting from the current producer index to see if the chip
has relinquished ownership, indicating that a packet has been received.
The driver hands the packet off to ether_input() and then prepares the
descriptor to receive another frame before moving on to the next
descriptor in the ring. But sometimes, the chip appears to skip a
descriptor. This leaves the driver testing the status word in a descriptor
that never gets updated. The driver still gets "RX done" interrupts but
never advances further into the RX ring, until the ring fills up and the
chip interrupts again to signal an error condition. Sometimes, the
driver will remain in this desynchronized state, resulting in spotty
performance until the interface is reset.

Fortunately, it's fairly simple to detect this condition: if we call
the rxeof routine but the number of received packets doesn't increase,
we suspect that there could be a problem. In this case, we call a new
routine called dc_rx_resync(), which scans ahead in the RX ring to see
if there's a frame waiting for us somewhere beyond that the driver thinks
is the current producer index. If it finds one, it bumps up the index
and calls the rxeof handler again to snarf up the packet and bring the
driver back in sync with the chip. (It may actually do this several times
in the event that there's more than one "hole" in the ring.)

So far the only card supported by if_dc which has exhibited this problem
is a LinkSys LNE100TX v2.0 (82c115 PNIC II), and it only seems to happen
on one particular system, however the fix is general enough and has low
enough overhead that we may as well apply it for all supported chipsets.
I also implemented the same fix for the 3Com xl driver, which is apparently
vulnerable to the same problem.

Problem originally noted and patch tested by: Matt Dillon
2000-01-03 15:28:47 +00:00
..
advansys Move the declaration of panic() from sys/systm.h to sys/param.h. 1999-09-26 18:19:49 +00:00
aha MIN unused, so kill it 1999-10-25 04:28:53 +00:00
ahb $Id$ -> $FreeBSD$ 1999-08-28 01:08:13 +00:00
aic Adjust data pointers for untransmitted bytes in fifos when there's phase 1999-12-16 16:11:49 +00:00
aic7xxx Change #ifdef KERNEL to #ifdef _KERNEL in the public headers. "KERNEL" 1999-12-29 04:46:21 +00:00
amd Properly set the alignment argument to bus_dma_tag_create(). If we 1999-08-16 01:52:21 +00:00
amr Fix a printf format problem on the Alpha, where size_t == unsigned long, 1999-12-12 20:53:31 +00:00
ar Add explicit null entries for new entrypoints. 1999-12-01 09:34:14 +00:00
ata Add support for VIA 82C596 controller 2000-01-03 10:26:59 +00:00
atkbdc Change #ifdef KERNEL to #ifdef _KERNEL in the public headers. "KERNEL" 1999-12-29 04:46:21 +00:00
bktr Change #ifdef KERNEL to #ifdef _KERNEL in the public headers. "KERNEL" 1999-12-29 04:46:21 +00:00
buslogic * Add struct resource_list* argument to resource_list_alloc and 1999-10-12 21:35:51 +00:00
cardbus Sync to latest cardbusdevs file 1999-11-18 07:22:59 +00:00
ccd Remove unused variable 1999-12-21 08:20:36 +00:00
cs Remove NBPF conditionality of bpf calls in most of our network drivers. 1999-09-25 12:06:01 +00:00
cy Introduce ttyread() and ttywrite() which do the canonical thing. 1999-09-28 11:45:31 +00:00
dc It appears that under certain circumstances that I still can't quite pin 2000-01-03 15:28:47 +00:00
de Remove NBPF conditionality of bpf calls in most of our network drivers. 1999-09-25 12:06:01 +00:00
dec $Id$ -> $FreeBSD$ 1999-08-28 01:08:13 +00:00
dgb Introduce ttyread() and ttywrite() which do the canonical thing. 1999-09-28 11:45:31 +00:00
dpt Change #ifdef KERNEL to #ifdef _KERNEL in the public headers. "KERNEL" 1999-12-29 04:46:21 +00:00
ed Fix pccard ed driver, I think. 1999-12-10 07:22:53 +00:00
eisa Remove the 'ivars' arguement to device_add_child() and 1999-12-03 08:41:24 +00:00
en remove unused #include, add $FreeBSD$ 1999-10-11 19:14:37 +00:00
ep kill debug printf that says detach 1999-12-10 07:24:39 +00:00
ex Fix bus_setup_intr(); I changed exintr() to take a pointer to ex_softc 1999-11-03 15:45:14 +00:00
fb Change #ifdef KERNEL to #ifdef _KERNEL in the public headers. "KERNEL" 1999-12-29 04:46:21 +00:00
fdc Added following modes: 1999-12-28 07:38:38 +00:00
fe Make release is now falling over in if_fe.c due to Warner's pccard changes: 1999-10-25 17:04:17 +00:00
fxp Make the fxp driver work on alpha, rather than panic the machine on boot 1999-09-30 19:03:12 +00:00
hea Incorrect uses of NULL changed to 0 1999-12-21 08:24:35 +00:00
hfa Remove five now unused fields from struct cdevsw. They should never 1999-09-25 18:24:47 +00:00
ic $Id$ -> $FreeBSD$ 1999-08-28 01:08:13 +00:00
ida Revamp the devstat priority system. All disks now have the same priority. 1999-12-08 04:45:23 +00:00
ie Hid silly unknown board types message behind if (bootverbose). This 1999-10-11 18:53:59 +00:00
iicbus Change #ifdef KERNEL to #ifdef _KERNEL in the public headers. "KERNEL" 1999-12-29 04:46:21 +00:00
isp Add in missing ENABLE TARGET MODE opcode. 1999-12-27 08:47:11 +00:00
joy Recognize the CSC0101 ID for the Thinkpad series. 1999-12-30 20:07:20 +00:00
kbd Change #ifdef KERNEL to #ifdef _KERNEL in the public headers. "KERNEL" 1999-12-29 04:46:21 +00:00
lnc Remove NBPF conditionality of bpf calls in most of our network drivers. 1999-09-25 12:06:01 +00:00
mc146818
mca Remove the 'ivars' arguement to device_add_child() and 1999-12-03 08:41:24 +00:00
mcd Remove five now unused fields from struct cdevsw. They should never 1999-09-25 18:24:47 +00:00
md Initialize type correctly. 1999-12-01 10:20:21 +00:00
mii Change #ifdef KERNEL to #ifdef _KERNEL in the public headers. "KERNEL" 1999-12-29 04:46:21 +00:00
mlx Fix the firmware build number output (again). 1999-12-25 01:45:22 +00:00
mse - Remove cdevsw_add(). 1999-10-06 13:03:09 +00:00
pccard Connect interrupts and start processing them. We panic on card removal 2000-01-03 06:45:16 +00:00
pcf Remove the 'ivars' arguement to device_add_child() and 1999-12-03 08:41:24 +00:00
pci Make the usb and ide/ata device identification a little saner. Rather than 1999-12-10 17:44:22 +00:00
pcic Connect interrupts and start processing them. We panic on card removal 2000-01-03 06:45:16 +00:00
pdq Remove NBPF conditionality of bpf calls in most of our network drivers. 1999-09-25 12:06:01 +00:00
ppbus Change #ifdef KERNEL to #ifdef _KERNEL in the public headers. "KERNEL" 1999-12-29 04:46:21 +00:00
ppc $Id$ -> $FreeBSD$ 1999-08-28 01:08:13 +00:00
rc Introduce ttyread() and ttywrite() which do the canonical thing. 1999-09-28 11:45:31 +00:00
rp Introduce ttyread() and ttywrite() which do the canonical thing. 1999-09-28 11:45:31 +00:00
scd Remove five now unused fields from struct cdevsw. They should never 1999-09-25 18:24:47 +00:00
sf Modify the Adaptec "starfire" driver to reset the PHY on the MII bus 1999-12-05 20:02:45 +00:00
si Fix some -Wunused warnings 1999-11-18 08:43:58 +00:00
sio Recognize the GVC0505 (GVC 56k Faxmodem) as a sio device. 1999-12-27 05:02:25 +00:00
sk Call sk_start() at the end of sk_intr() if there's packets in the 1999-09-25 04:50:27 +00:00
smbus Remove the 'ivars' arguement to device_add_child() and 1999-12-03 08:41:24 +00:00
sn Two nits and disable isa probe due to its overly agressive claiming of 1999-12-28 01:07:16 +00:00
snp Remove cdevsw_add() - the make_dev() calls are already there. 1999-11-18 06:39:47 +00:00
sound Do not start/stop DMA transfer if it is already started/stopped. 2000-01-03 05:26:12 +00:00
speaker Move isfoo() and friends to the newly created sys/ctype.h. 1999-11-03 17:54:26 +00:00
sr Add explicit null entries for new entrypoints. 1999-12-01 09:34:14 +00:00
streams Rename remove_dev() to destroy_dev(). 1999-11-08 07:44:01 +00:00
sym - Add device entry for the next generation of C1010 device 2000-01-01 15:24:44 +00:00
syscons - Remember the keyboard repeat delay and rate. 1999-12-13 09:31:43 +00:00
ti As suggested by phk, unconditionalize BPF support in these drivers. Since 1999-09-23 03:32:57 +00:00
tx Change incorrect NULLs to 0s 1999-12-21 11:14:12 +00:00
usb Change #ifdef KERNEL to #ifdef _KERNEL in the public headers. "KERNEL" 1999-12-29 04:46:21 +00:00
vinum Don't forget the 'stripe' and 'mirror' keywords when we turn debugging 1999-12-30 07:13:22 +00:00
vn Fix a panic when doing non-multiples of PAGE_SIZE or misaligned transfers 1999-12-28 07:32:34 +00:00
vr Change contigmalloc() lower memory bound from 1MB to 0 to improve 1999-09-25 17:29:02 +00:00
vx Remove NBPF conditionality of bpf calls in most of our network drivers. 1999-09-25 12:06:01 +00:00
wi Change #ifdef KERNEL to #ifdef _KERNEL in the public headers. "KERNEL" 1999-12-29 04:46:21 +00:00
wl Remove NBPF conditionality of bpf calls in most of our network drivers. 1999-09-25 12:06:01 +00:00
xe Disable old PCCARD_MODULE code. 1999-10-29 17:28:09 +00:00