summaryrefslogtreecommitdiffstats
path: root/sys/dev
diff options
context:
space:
mode:
authorwpaul <wpaul@FreeBSD.org>2001-07-12 22:51:59 +0000
committerwpaul <wpaul@FreeBSD.org>2001-07-12 22:51:59 +0000
commit025e912e14514c7cfe14df4e17284702d8fa8cdf (patch)
treef6d710f3051780a2029f47a2c420c6af83b85c31 /sys/dev
parent7201ca4535df35d2dcf654a42ffae52146ba948a (diff)
downloadFreeBSD-src-025e912e14514c7cfe14df4e17284702d8fa8cdf.zip
FreeBSD-src-025e912e14514c7cfe14df4e17284702d8fa8cdf.tar.gz
Deal with the condition where we lose link in the middle of transmitting
a bunch of frames. In this case, the dc_link flag is cleared, and dc_start() stops draining the if_snd send queue, which results in lots of 'no buffers available' errors being reported to applications. The whole idea behind not draining the send queue until the link comes up was to avoid having the gratuitous ARP being lost while we're waiting for autoneg to complete after the interface is first brought up. As an optimization, change the test in dc_start() so that we only bail if dc_link is not set _and_ there are less than 10 packets in the send queue. If the queue has many frames in it, we need to drain them. If the queue has a small number of frames in it, we can hold off on sending them until the link comes up. MFC after: 1 week
Diffstat (limited to 'sys/dev')
-rw-r--r--sys/dev/dc/if_dc.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/sys/dev/dc/if_dc.c b/sys/dev/dc/if_dc.c
index ec18090..7bf23e1 100644
--- a/sys/dev/dc/if_dc.c
+++ b/sys/dev/dc/if_dc.c
@@ -2953,7 +2953,7 @@ static void dc_start(ifp)
DC_LOCK(sc);
- if (!sc->dc_link) {
+ if (!sc->dc_link && ifp->if_snd.ifq_len < 10) {
DC_UNLOCK(sc);
return;
}
OpenPOWER on IntegriCloud