mirror of
https://github.com/freebsd/freebsd-src
synced 2024-10-18 22:33:39 +00:00
Complete any pending Tx frames before attempting the next transmit
Also complete pending frames in the watchdog function when the EVENT_IDX feature was negotiated just in case the completion interrupt was postponed.
This commit is contained in:
parent
4142b1cbe5
commit
6e03f31982
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=255167
|
@ -592,6 +592,9 @@ vtnet_setup_features(struct vtnet_softc *sc)
|
|||
|
||||
vtnet_negotiate_features(sc);
|
||||
|
||||
if (virtio_with_feature(dev, VIRTIO_RING_F_EVENT_IDX))
|
||||
sc->vtnet_flags |= VTNET_FLAG_EVENT_IDX;
|
||||
|
||||
if (virtio_with_feature(dev, VIRTIO_NET_F_MAC)) {
|
||||
/* This feature should always be negotiated. */
|
||||
sc->vtnet_flags |= VTNET_FLAG_MAC;
|
||||
|
@ -2155,6 +2158,8 @@ vtnet_start_locked(struct vtnet_txq *txq, struct ifnet *ifp)
|
|||
sc->vtnet_link_active == 0)
|
||||
return;
|
||||
|
||||
vtnet_txq_eof(txq);
|
||||
|
||||
while (!IFQ_DRV_IS_EMPTY(&ifp->if_snd)) {
|
||||
if (virtqueue_full(vq))
|
||||
break;
|
||||
|
@ -2226,6 +2231,8 @@ vtnet_txq_mq_start_locked(struct vtnet_txq *txq, struct mbuf *m)
|
|||
return (error);
|
||||
}
|
||||
|
||||
vtnet_txq_eof(txq);
|
||||
|
||||
while ((m = drbr_peek(ifp, br)) != NULL) {
|
||||
error = vtnet_txq_encap(txq, &m);
|
||||
if (error) {
|
||||
|
@ -2471,6 +2478,8 @@ vtnet_watchdog(struct vtnet_txq *txq)
|
|||
sc = txq->vtntx_sc;
|
||||
|
||||
VTNET_TXQ_LOCK(txq);
|
||||
if (sc->vtnet_flags & VTNET_FLAG_EVENT_IDX)
|
||||
vtnet_txq_eof(txq);
|
||||
if (txq->vtntx_watchdog == 0 || --txq->vtntx_watchdog) {
|
||||
VTNET_TXQ_UNLOCK(txq);
|
||||
return (0);
|
||||
|
|
|
@ -138,6 +138,7 @@ struct vtnet_softc {
|
|||
#define VTNET_FLAG_MRG_RXBUFS 0x0080
|
||||
#define VTNET_FLAG_LRO_NOMRG 0x0100
|
||||
#define VTNET_FLAG_MULTIQ 0x0200
|
||||
#define VTNET_FLAG_EVENT_IDX 0x0400
|
||||
|
||||
int vtnet_link_active;
|
||||
int vtnet_hdr_size;
|
||||
|
|
Loading…
Reference in a new issue