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.
This commit is contained in:
dfr 2004-06-14 09:34:20 +00:00
parent 354d3a90e8
commit c8eeaa3f96
2 changed files with 17 additions and 4 deletions

View File

@ -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);
}

View File

@ -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 */