Deleted Added
full compact
cxgb_sge.c (206109) cxgb_sge.c (207688)
1/**************************************************************************
2
3Copyright (c) 2007-2009, Chelsio Inc.
4All rights reserved.
5
6Redistribution and use in source and binary forms, with or without
7modification, are permitted provided that the following conditions are met:
8

--- 14 unchanged lines hidden (view full) ---

23INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26POSSIBILITY OF SUCH DAMAGE.
27
28***************************************************************************/
29
30#include <sys/cdefs.h>
1/**************************************************************************
2
3Copyright (c) 2007-2009, Chelsio Inc.
4All rights reserved.
5
6Redistribution and use in source and binary forms, with or without
7modification, are permitted provided that the following conditions are met:
8

--- 14 unchanged lines hidden (view full) ---

23INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26POSSIBILITY OF SUCH DAMAGE.
27
28***************************************************************************/
29
30#include <sys/cdefs.h>
31__FBSDID("$FreeBSD: head/sys/dev/cxgb/cxgb_sge.c 206109 2010-04-02 17:50:52Z np $");
31__FBSDID("$FreeBSD: head/sys/dev/cxgb/cxgb_sge.c 207688 2010-05-05 22:52:06Z np $");
32
33#include "opt_inet.h"
34
35#include <sys/param.h>
36#include <sys/systm.h>
37#include <sys/kernel.h>
38#include <sys/module.h>
39#include <sys/bus.h>

--- 651 unchanged lines hidden (view full) ---

691static void
692refill_fl(adapter_t *sc, struct sge_fl *q, int n)
693{
694 struct rx_sw_desc *sd = &q->sdesc[q->pidx];
695 struct rx_desc *d = &q->desc[q->pidx];
696 struct refill_fl_cb_arg cb_arg;
697 struct mbuf *m;
698 caddr_t cl;
32
33#include "opt_inet.h"
34
35#include <sys/param.h>
36#include <sys/systm.h>
37#include <sys/kernel.h>
38#include <sys/module.h>
39#include <sys/bus.h>

--- 651 unchanged lines hidden (view full) ---

691static void
692refill_fl(adapter_t *sc, struct sge_fl *q, int n)
693{
694 struct rx_sw_desc *sd = &q->sdesc[q->pidx];
695 struct rx_desc *d = &q->desc[q->pidx];
696 struct refill_fl_cb_arg cb_arg;
697 struct mbuf *m;
698 caddr_t cl;
699 int err, count = 0;
699 int err;
700
701 cb_arg.error = 0;
702 while (n--) {
703 /*
704 * We only allocate a cluster, mbuf allocation happens after rx
705 */
706 if (q->zone == zone_pack) {
707 if ((m = m_getcl(M_NOWAIT, MT_NOINIT, M_PKTHDR)) == NULL)

--- 41 unchanged lines hidden (view full) ---

749
750 if (++q->pidx == q->size) {
751 q->pidx = 0;
752 q->gen ^= 1;
753 sd = q->sdesc;
754 d = q->desc;
755 }
756 q->credits++;
700
701 cb_arg.error = 0;
702 while (n--) {
703 /*
704 * We only allocate a cluster, mbuf allocation happens after rx
705 */
706 if (q->zone == zone_pack) {
707 if ((m = m_getcl(M_NOWAIT, MT_NOINIT, M_PKTHDR)) == NULL)

--- 41 unchanged lines hidden (view full) ---

749
750 if (++q->pidx == q->size) {
751 q->pidx = 0;
752 q->gen ^= 1;
753 sd = q->sdesc;
754 d = q->desc;
755 }
756 q->credits++;
757 count++;
757 q->db_pending++;
758 }
759
760done:
758 }
759
760done:
761 if (count)
761 if (q->db_pending >= 32) {
762 q->db_pending = 0;
762 t3_write_reg(sc, A_SG_KDOORBELL, V_EGRCNTX(q->cntxt_id));
763 t3_write_reg(sc, A_SG_KDOORBELL, V_EGRCNTX(q->cntxt_id));
764 }
763}
764
765
766/**
767 * free_rx_bufs - free the Rx buffers on an SGE free list
768 * @sc: the controle softc
769 * @q: the SGE free list to clean up
770 *

--- 34 unchanged lines hidden (view full) ---

805__refill_fl(adapter_t *adap, struct sge_fl *fl)
806{
807 refill_fl(adap, fl, min(16U, fl->size - fl->credits));
808}
809
810static __inline void
811__refill_fl_lt(adapter_t *adap, struct sge_fl *fl, int max)
812{
765}
766
767
768/**
769 * free_rx_bufs - free the Rx buffers on an SGE free list
770 * @sc: the controle softc
771 * @q: the SGE free list to clean up
772 *

--- 34 unchanged lines hidden (view full) ---

807__refill_fl(adapter_t *adap, struct sge_fl *fl)
808{
809 refill_fl(adap, fl, min(16U, fl->size - fl->credits));
810}
811
812static __inline void
813__refill_fl_lt(adapter_t *adap, struct sge_fl *fl, int max)
814{
813 if ((fl->size - fl->credits) < max)
814 refill_fl(adap, fl, min(max, fl->size - fl->credits));
815 uint32_t reclaimable = fl->size - fl->credits;
816
817 if (reclaimable > 0)
818 refill_fl(adap, fl, min(max, reclaimable));
815}
816
817/**
818 * recycle_rx_buf - recycle a receive buffer
819 * @adapter: the adapter
820 * @q: the SGE free list
821 * @idx: index of buffer to recycle
822 *

--- 433 unchanged lines hidden (view full) ---

1256 * Ring the doorbell if a Tx queue is asleep. There is a natural race,
1257 * where the HW is going to sleep just after we checked, however,
1258 * then the interrupt handler will detect the outstanding TX packet
1259 * and ring the doorbell for us.
1260 *
1261 * When GTS is disabled we unconditionally ring the doorbell.
1262 */
1263static __inline void
819}
820
821/**
822 * recycle_rx_buf - recycle a receive buffer
823 * @adapter: the adapter
824 * @q: the SGE free list
825 * @idx: index of buffer to recycle
826 *

--- 433 unchanged lines hidden (view full) ---

1260 * Ring the doorbell if a Tx queue is asleep. There is a natural race,
1261 * where the HW is going to sleep just after we checked, however,
1262 * then the interrupt handler will detect the outstanding TX packet
1263 * and ring the doorbell for us.
1264 *
1265 * When GTS is disabled we unconditionally ring the doorbell.
1266 */
1267static __inline void
1264check_ring_tx_db(adapter_t *adap, struct sge_txq *q)
1268check_ring_tx_db(adapter_t *adap, struct sge_txq *q, int mustring)
1265{
1266#if USE_GTS
1267 clear_bit(TXQ_LAST_PKT_DB, &q->flags);
1268 if (test_and_set_bit(TXQ_RUNNING, &q->flags) == 0) {
1269 set_bit(TXQ_LAST_PKT_DB, &q->flags);
1270#ifdef T3_TRACE
1271 T3_TRACE1(adap->tb[q->cntxt_id & 7], "doorbell Tx, cntxt %d",
1272 q->cntxt_id);
1273#endif
1274 t3_write_reg(adap, A_SG_KDOORBELL,
1275 F_SELEGRCNTX | V_EGRCNTX(q->cntxt_id));
1276 }
1277#else
1269{
1270#if USE_GTS
1271 clear_bit(TXQ_LAST_PKT_DB, &q->flags);
1272 if (test_and_set_bit(TXQ_RUNNING, &q->flags) == 0) {
1273 set_bit(TXQ_LAST_PKT_DB, &q->flags);
1274#ifdef T3_TRACE
1275 T3_TRACE1(adap->tb[q->cntxt_id & 7], "doorbell Tx, cntxt %d",
1276 q->cntxt_id);
1277#endif
1278 t3_write_reg(adap, A_SG_KDOORBELL,
1279 F_SELEGRCNTX | V_EGRCNTX(q->cntxt_id));
1280 }
1281#else
1278 wmb(); /* write descriptors before telling HW */
1279 t3_write_reg(adap, A_SG_KDOORBELL,
1280 F_SELEGRCNTX | V_EGRCNTX(q->cntxt_id));
1282 if (mustring || ++q->db_pending >= 32) {
1283 wmb(); /* write descriptors before telling HW */
1284 t3_write_reg(adap, A_SG_KDOORBELL,
1285 F_SELEGRCNTX | V_EGRCNTX(q->cntxt_id));
1286 q->db_pending = 0;
1287 }
1281#endif
1282}
1283
1284static __inline void
1285wr_gen2(struct tx_desc *d, unsigned int gen)
1286{
1287#if SGE_NUM_GENBITS == 2
1288 d->flit[TX_DESC_FLITS - 1] = htobe64(gen);

--- 186 unchanged lines hidden (view full) ---

1475 V_WR_SGLSFLT(flits)) |
1476 htonl(V_WR_OP(FW_WROPCODE_TUNNEL_TX_PKT) | txqs.compl);
1477 wr_lo = htonl(V_WR_LEN(flits) |
1478 V_WR_GEN(txqs.gen)) | htonl(V_WR_TID(txq->token));
1479 set_wr_hdr(wrp, wr_hi, wr_lo);
1480 wmb();
1481 ETHER_BPF_MTAP(pi->ifp, m0);
1482 wr_gen2(txd, txqs.gen);
1288#endif
1289}
1290
1291static __inline void
1292wr_gen2(struct tx_desc *d, unsigned int gen)
1293{
1294#if SGE_NUM_GENBITS == 2
1295 d->flit[TX_DESC_FLITS - 1] = htobe64(gen);

--- 186 unchanged lines hidden (view full) ---

1482 V_WR_SGLSFLT(flits)) |
1483 htonl(V_WR_OP(FW_WROPCODE_TUNNEL_TX_PKT) | txqs.compl);
1484 wr_lo = htonl(V_WR_LEN(flits) |
1485 V_WR_GEN(txqs.gen)) | htonl(V_WR_TID(txq->token));
1486 set_wr_hdr(wrp, wr_hi, wr_lo);
1487 wmb();
1488 ETHER_BPF_MTAP(pi->ifp, m0);
1489 wr_gen2(txd, txqs.gen);
1483 check_ring_tx_db(sc, txq);
1490 check_ring_tx_db(sc, txq, 0);
1484 return (0);
1485 } else if (tso_info) {
1486 int eth_type;
1487 struct cpl_tx_pkt_lso *hdr = (struct cpl_tx_pkt_lso *)txd;
1488 struct ether_header *eh;
1489 struct ip *ip;
1490 struct tcphdr *tcp;
1491

--- 46 unchanged lines hidden (view full) ---

1538 V_WR_OP(FW_WROPCODE_TUNNEL_TX_PKT) |
1539 F_WR_SOP | F_WR_EOP | txqs.compl);
1540 wr_lo = htonl(V_WR_LEN(flits) |
1541 V_WR_GEN(txqs.gen) | V_WR_TID(txq->token));
1542 set_wr_hdr(&hdr->wr, wr_hi, wr_lo);
1543 wmb();
1544 ETHER_BPF_MTAP(pi->ifp, m0);
1545 wr_gen2(txd, txqs.gen);
1491 return (0);
1492 } else if (tso_info) {
1493 int eth_type;
1494 struct cpl_tx_pkt_lso *hdr = (struct cpl_tx_pkt_lso *)txd;
1495 struct ether_header *eh;
1496 struct ip *ip;
1497 struct tcphdr *tcp;
1498

--- 46 unchanged lines hidden (view full) ---

1545 V_WR_OP(FW_WROPCODE_TUNNEL_TX_PKT) |
1546 F_WR_SOP | F_WR_EOP | txqs.compl);
1547 wr_lo = htonl(V_WR_LEN(flits) |
1548 V_WR_GEN(txqs.gen) | V_WR_TID(txq->token));
1549 set_wr_hdr(&hdr->wr, wr_hi, wr_lo);
1550 wmb();
1551 ETHER_BPF_MTAP(pi->ifp, m0);
1552 wr_gen2(txd, txqs.gen);
1546 check_ring_tx_db(sc, txq);
1553 check_ring_tx_db(sc, txq, 0);
1547 m_freem(m0);
1548 return (0);
1549 }
1550 flits = 3;
1551 } else {
1552 struct cpl_tx_pkt *cpl = (struct cpl_tx_pkt *)txd;
1553
1554 GET_VTAG(cntrl, m0);

--- 14 unchanged lines hidden (view full) ---

1569 V_WR_OP(FW_WROPCODE_TUNNEL_TX_PKT) |
1570 F_WR_SOP | F_WR_EOP | txqs.compl);
1571 wr_lo = htonl(V_WR_LEN(flits) |
1572 V_WR_GEN(txqs.gen) | V_WR_TID(txq->token));
1573 set_wr_hdr(&cpl->wr, wr_hi, wr_lo);
1574 wmb();
1575 ETHER_BPF_MTAP(pi->ifp, m0);
1576 wr_gen2(txd, txqs.gen);
1554 m_freem(m0);
1555 return (0);
1556 }
1557 flits = 3;
1558 } else {
1559 struct cpl_tx_pkt *cpl = (struct cpl_tx_pkt *)txd;
1560
1561 GET_VTAG(cntrl, m0);

--- 14 unchanged lines hidden (view full) ---

1576 V_WR_OP(FW_WROPCODE_TUNNEL_TX_PKT) |
1577 F_WR_SOP | F_WR_EOP | txqs.compl);
1578 wr_lo = htonl(V_WR_LEN(flits) |
1579 V_WR_GEN(txqs.gen) | V_WR_TID(txq->token));
1580 set_wr_hdr(&cpl->wr, wr_hi, wr_lo);
1581 wmb();
1582 ETHER_BPF_MTAP(pi->ifp, m0);
1583 wr_gen2(txd, txqs.gen);
1577 check_ring_tx_db(sc, txq);
1584 check_ring_tx_db(sc, txq, 0);
1578 m_freem(m0);
1579 return (0);
1580 }
1581 flits = 2;
1582 }
1583 wrp = (struct work_request_hdr *)txd;
1584 sgp = (ndesc == 1) ? (struct sg_ent *)&txd->flit[flits] : sgl;
1585 make_sgl(sgp, segs, nsegs);
1586
1587 sgl_flits = sgl_len(nsegs);
1588
1589 ETHER_BPF_MTAP(pi->ifp, m0);
1590
1591 KASSERT(ndesc <= 4, ("ndesc too large %d", ndesc));
1592 wr_hi = htonl(V_WR_OP(FW_WROPCODE_TUNNEL_TX_PKT) | txqs.compl);
1593 wr_lo = htonl(V_WR_TID(txq->token));
1594 write_wr_hdr_sgl(ndesc, txd, &txqs, txq, sgl, flits,
1595 sgl_flits, wr_hi, wr_lo);
1585 m_freem(m0);
1586 return (0);
1587 }
1588 flits = 2;
1589 }
1590 wrp = (struct work_request_hdr *)txd;
1591 sgp = (ndesc == 1) ? (struct sg_ent *)&txd->flit[flits] : sgl;
1592 make_sgl(sgp, segs, nsegs);
1593
1594 sgl_flits = sgl_len(nsegs);
1595
1596 ETHER_BPF_MTAP(pi->ifp, m0);
1597
1598 KASSERT(ndesc <= 4, ("ndesc too large %d", ndesc));
1599 wr_hi = htonl(V_WR_OP(FW_WROPCODE_TUNNEL_TX_PKT) | txqs.compl);
1600 wr_lo = htonl(V_WR_TID(txq->token));
1601 write_wr_hdr_sgl(ndesc, txd, &txqs, txq, sgl, flits,
1602 sgl_flits, wr_hi, wr_lo);
1596 check_ring_tx_db(sc, txq);
1603 check_ring_tx_db(sc, txq, 0);
1597
1598 return (0);
1599}
1600
1601void
1602cxgb_tx_watchdog(void *arg)
1603{
1604 struct sge_qset *qs = arg;

--- 33 unchanged lines hidden (view full) ---

1638 }
1639}
1640
1641static void
1642cxgb_start_locked(struct sge_qset *qs)
1643{
1644 struct mbuf *m_head = NULL;
1645 struct sge_txq *txq = &qs->txq[TXQ_ETH];
1604
1605 return (0);
1606}
1607
1608void
1609cxgb_tx_watchdog(void *arg)
1610{
1611 struct sge_qset *qs = arg;

--- 33 unchanged lines hidden (view full) ---

1645 }
1646}
1647
1648static void
1649cxgb_start_locked(struct sge_qset *qs)
1650{
1651 struct mbuf *m_head = NULL;
1652 struct sge_txq *txq = &qs->txq[TXQ_ETH];
1646 int in_use_init = txq->in_use;
1647 struct port_info *pi = qs->port;
1648 struct ifnet *ifp = pi->ifp;
1649
1650 if (qs->qs_flags & (QS_FLUSHING|QS_TIMEOUT))
1651 reclaim_completed_tx(qs, 0, TXQ_ETH);
1652
1653 if (!pi->link_config.link_ok) {
1654 TXQ_RING_FLUSH(qs);
1655 return;
1656 }
1657 TXQ_LOCK_ASSERT(qs);
1653 struct port_info *pi = qs->port;
1654 struct ifnet *ifp = pi->ifp;
1655
1656 if (qs->qs_flags & (QS_FLUSHING|QS_TIMEOUT))
1657 reclaim_completed_tx(qs, 0, TXQ_ETH);
1658
1659 if (!pi->link_config.link_ok) {
1660 TXQ_RING_FLUSH(qs);
1661 return;
1662 }
1663 TXQ_LOCK_ASSERT(qs);
1658 while ((txq->in_use - in_use_init < TX_START_MAX_DESC) &&
1659 !TXQ_RING_EMPTY(qs) && (ifp->if_drv_flags & IFF_DRV_RUNNING) &&
1664 while (!TXQ_RING_EMPTY(qs) && (ifp->if_drv_flags & IFF_DRV_RUNNING) &&
1660 pi->link_config.link_ok) {
1661 reclaim_completed_tx(qs, cxgb_tx_reclaim_threshold, TXQ_ETH);
1662
1663 if (txq->size - txq->in_use <= TX_MAX_DESC)
1664 break;
1665
1666 if ((m_head = cxgb_dequeue(qs)) == NULL)
1667 break;
1668 /*
1669 * Encapsulation can modify our pointer, and or make it
1670 * NULL on failure. In that event, we can't requeue.
1671 */
1672 if (t3_encap(qs, &m_head) || m_head == NULL)
1673 break;
1674
1675 m_head = NULL;
1676 }
1665 pi->link_config.link_ok) {
1666 reclaim_completed_tx(qs, cxgb_tx_reclaim_threshold, TXQ_ETH);
1667
1668 if (txq->size - txq->in_use <= TX_MAX_DESC)
1669 break;
1670
1671 if ((m_head = cxgb_dequeue(qs)) == NULL)
1672 break;
1673 /*
1674 * Encapsulation can modify our pointer, and or make it
1675 * NULL on failure. In that event, we can't requeue.
1676 */
1677 if (t3_encap(qs, &m_head) || m_head == NULL)
1678 break;
1679
1680 m_head = NULL;
1681 }
1682
1683 if (txq->db_pending)
1684 check_ring_tx_db(pi->adapter, txq, 1);
1685
1677 if (!TXQ_RING_EMPTY(qs) && callout_pending(&txq->txq_timer) == 0 &&
1678 pi->link_config.link_ok)
1679 callout_reset_on(&txq->txq_timer, 1, cxgb_tx_timeout,
1680 qs, txq->txq_timer.c_cpu);
1681 if (m_head != NULL)
1682 m_freem(m_head);
1683}
1684

--- 17 unchanged lines hidden (view full) ---

1702 */
1703 if (check_pkt_coalesce(qs) == 0 &&
1704 !TXQ_RING_NEEDS_ENQUEUE(qs) && avail > TX_MAX_DESC) {
1705 if (t3_encap(qs, &m)) {
1706 if (m != NULL &&
1707 (error = drbr_enqueue(ifp, br, m)) != 0)
1708 return (error);
1709 } else {
1686 if (!TXQ_RING_EMPTY(qs) && callout_pending(&txq->txq_timer) == 0 &&
1687 pi->link_config.link_ok)
1688 callout_reset_on(&txq->txq_timer, 1, cxgb_tx_timeout,
1689 qs, txq->txq_timer.c_cpu);
1690 if (m_head != NULL)
1691 m_freem(m_head);
1692}
1693

--- 17 unchanged lines hidden (view full) ---

1711 */
1712 if (check_pkt_coalesce(qs) == 0 &&
1713 !TXQ_RING_NEEDS_ENQUEUE(qs) && avail > TX_MAX_DESC) {
1714 if (t3_encap(qs, &m)) {
1715 if (m != NULL &&
1716 (error = drbr_enqueue(ifp, br, m)) != 0)
1717 return (error);
1718 } else {
1719 if (txq->db_pending)
1720 check_ring_tx_db(pi->adapter, txq, 1);
1721
1710 /*
1711 * We've bypassed the buf ring so we need to update
1712 * the stats directly
1713 */
1714 txq->txq_direct_packets++;
1715 txq->txq_direct_bytes += m->m_pkthdr.len;
1716 }
1717 } else if ((error = drbr_enqueue(ifp, br, m)) != 0)

--- 631 unchanged lines hidden (view full) ---

2349 T3_TRACE5(adap->tb[q->cntxt_id & 7],
2350 "ofld_xmit: ndesc %u, pidx %u, len %u, main %u, frags %u",
2351 ndesc, pidx, skb->len, skb->len - skb->data_len,
2352 skb_shinfo(skb)->nr_frags);
2353#endif
2354 TXQ_UNLOCK(qs);
2355
2356 write_ofld_wr(adap, m, q, pidx, gen, ndesc, segs, nsegs);
1722 /*
1723 * We've bypassed the buf ring so we need to update
1724 * the stats directly
1725 */
1726 txq->txq_direct_packets++;
1727 txq->txq_direct_bytes += m->m_pkthdr.len;
1728 }
1729 } else if ((error = drbr_enqueue(ifp, br, m)) != 0)

--- 631 unchanged lines hidden (view full) ---

2361 T3_TRACE5(adap->tb[q->cntxt_id & 7],
2362 "ofld_xmit: ndesc %u, pidx %u, len %u, main %u, frags %u",
2363 ndesc, pidx, skb->len, skb->len - skb->data_len,
2364 skb_shinfo(skb)->nr_frags);
2365#endif
2366 TXQ_UNLOCK(qs);
2367
2368 write_ofld_wr(adap, m, q, pidx, gen, ndesc, segs, nsegs);
2357 check_ring_tx_db(adap, q);
2369 check_ring_tx_db(adap, q, 1);
2358 return (0);
2359}
2360
2361/**
2362 * restart_offloadq - restart a suspended offload queue
2363 * @qs: the queue set cotaining the offload queue
2364 *
2365 * Resumes transmission on a suspended Tx offload queue.

--- 662 unchanged lines hidden (view full) ---

3028
3029 r++;
3030 if (__predict_false(++rspq->cidx == rspq->size)) {
3031 rspq->cidx = 0;
3032 rspq->gen ^= 1;
3033 r = rspq->desc;
3034 }
3035
2370 return (0);
2371}
2372
2373/**
2374 * restart_offloadq - restart a suspended offload queue
2375 * @qs: the queue set cotaining the offload queue
2376 *
2377 * Resumes transmission on a suspended Tx offload queue.

--- 662 unchanged lines hidden (view full) ---

3040
3041 r++;
3042 if (__predict_false(++rspq->cidx == rspq->size)) {
3043 rspq->cidx = 0;
3044 rspq->gen ^= 1;
3045 r = rspq->desc;
3046 }
3047
3036 if (++rspq->credits >= (rspq->size / 4)) {
3048 if (++rspq->credits >= 64) {
3037 refill_rspq(adap, rspq, rspq->credits);
3038 rspq->credits = 0;
3039 }
3040 if (!eth && eop) {
3041 rspq->rspq_mh.mh_head->m_pkthdr.csum_data = rss_csum;
3042 /*
3043 * XXX size mismatch
3044 */

--- 761 unchanged lines hidden ---
3049 refill_rspq(adap, rspq, rspq->credits);
3050 rspq->credits = 0;
3051 }
3052 if (!eth && eop) {
3053 rspq->rspq_mh.mh_head->m_pkthdr.csum_data = rss_csum;
3054 /*
3055 * XXX size mismatch
3056 */

--- 761 unchanged lines hidden ---