diff options
author | dfr <dfr@FreeBSD.org> | 2004-06-14 09:34:20 +0000 |
---|---|---|
committer | dfr <dfr@FreeBSD.org> | 2004-06-14 09:34:20 +0000 |
commit | c8eeaa3f96986892a586a683b030200986cd5900 (patch) | |
tree | a02e0a69ed09f195feb4dfa378bc1ac1e48a9173 | |
parent | 354d3a90e8366f6bab6d947f39edb251cb2719e5 (diff) | |
download | FreeBSD-src-c8eeaa3f96986892a586a683b030200986cd5900.zip FreeBSD-src-c8eeaa3f96986892a586a683b030200986cd5900.tar.gz |
If we run out of transmission labels, just re-queue the packet for later
instead of printing endless error messages on the console and discarding
the packet.
-rw-r--r-- | sys/dev/firewire/firewire.c | 7 | ||||
-rw-r--r-- | sys/dev/firewire/if_fwip.c | 14 |
2 files changed, 17 insertions, 4 deletions
diff --git a/sys/dev/firewire/firewire.c b/sys/dev/firewire/firewire.c index 03d28de..6342a18 100644 --- a/sys/dev/firewire/firewire.c +++ b/sys/dev/firewire/firewire.c @@ -248,8 +248,8 @@ fw_asyreq(struct firewire_comm *fc, int sub, struct fw_xfer *xfer) } if (info->flag & FWTI_TLABEL) { - if((tl = fw_get_tlabel(fc, xfer)) == -1 ) - return EIO; + if ((tl = fw_get_tlabel(fc, xfer)) == -1) + return EAGAIN; fp->mode.hdr.tlrt = tl << 2; } @@ -1739,7 +1739,8 @@ fw_get_tlabel(struct firewire_comm *fc, struct fw_xfer *xfer) } splx(s); - printf("fw_get_tlabel: no free tlabel\n"); + if (firewire_debug > 1) + printf("fw_get_tlabel: no free tlabel\n"); return(-1); } diff --git a/sys/dev/firewire/if_fwip.c b/sys/dev/firewire/if_fwip.c index 27af6e0..3ce186c 100644 --- a/sys/dev/firewire/if_fwip.c +++ b/sys/dev/firewire/if_fwip.c @@ -552,6 +552,7 @@ fwip_async_output(struct fwip_softc *fwip, struct ifnet *ifp) struct fw_xferq *xferq; struct fw_pkt *fp; uint16_t nodeid; + int error; int i = 0; GIANT_REQUIRED; @@ -666,7 +667,18 @@ fwip_async_output(struct fwip_softc *fwip, struct ifnet *ifp) xfer->send.pay_len = m->m_pkthdr.len; - if (fw_asyreq(fc, -1, xfer) != 0) { + error = fw_asyreq(fc, -1, xfer); + if (error == EAGAIN) { + /* + * We ran out of tlabels - requeue the packet + * for later transmission. + */ + xfer->mbuf = 0; + STAILQ_INSERT_TAIL(&fwip->xferlist, xfer, link); + IF_PREPEND(&ifp->if_snd, m); + break; + } + if (error) { /* error */ ifp->if_oerrors ++; /* XXX set error code */ |