From ee2f2ccc2fbd06bd00cb400f36a56db19e6641c3 Mon Sep 17 00:00:00 2001 From: Doug Rabson Date: Mon, 14 Jun 2004 09:34:20 +0000 Subject: [PATCH] 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. --- sys/dev/firewire/firewire.c | 7 ++++--- 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 03d28de3ab3..6342a1867fa 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 27af6e0fd31..3ce186cdb4b 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 */