aboutsummaryrefslogtreecommitdiff
path: root/sys/dev/ixl/ixl_txrx.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/dev/ixl/ixl_txrx.c')
-rwxr-xr-xsys/dev/ixl/ixl_txrx.c11
1 files changed, 11 insertions, 0 deletions
diff --git a/sys/dev/ixl/ixl_txrx.c b/sys/dev/ixl/ixl_txrx.c
index b804c76f9840..ea43af85ae59 100755
--- a/sys/dev/ixl/ixl_txrx.c
+++ b/sys/dev/ixl/ixl_txrx.c
@@ -238,6 +238,11 @@ ixl_xmit(struct ixl_queue *que, struct mbuf **m_headp)
maxsegs = IXL_MAX_TSO_SEGS;
if (ixl_tso_detect_sparse(m_head)) {
m = m_defrag(m_head, M_NOWAIT);
+ if (m == NULL) {
+ m_freem(*m_headp);
+ *m_headp = NULL;
+ return (ENOBUFS);
+ }
*m_headp = m;
}
}
@@ -791,6 +796,7 @@ ixl_txeof(struct ixl_queue *que)
mtx_assert(&txr->mtx, MA_OWNED);
+
/* These are not the descriptors you seek, move along :) */
if (txr->avail == que->num_desc) {
que->busy = 0;
@@ -1186,6 +1192,9 @@ skip_head:
rxr->bytes = 0;
rxr->discard = FALSE;
+ wr32(vsi->hw, rxr->tail, que->num_desc - 1);
+ ixl_flush(vsi->hw);
+
#if defined(INET6) || defined(INET)
/*
** Now set up the LRO interface:
@@ -1365,6 +1374,7 @@ ixl_rxeof(struct ixl_queue *que, int count)
IXL_RX_LOCK(rxr);
+
for (i = rxr->next_check; count != 0;) {
struct mbuf *sendmp, *mh, *mp;
u32 rsc, status, error;
@@ -1660,3 +1670,4 @@ ixl_get_counter(if_t ifp, ift_counter cnt)
}
}
#endif
+