From a1a9516bf4e47a0c66ea763ff631b9f55d695d0e Mon Sep 17 00:00:00 2001 From: =?utf8?q?Fran=C3=A7ois=20Tigeot?= Date: Tue, 21 Aug 2012 21:42:33 +0200 Subject: [PATCH] ixgbe: Rework ixgbe_xmit() * Use bus_dmamap_load_mbuf_segment() * Clean up error handling code, following the example of the igb(4) driver --- sys/dev/netif/ixgbe/ixgbe.c | 43 ++++++++++--------------------------- sys/dev/netif/ixgbe/ixgbe.h | 3 +++ 2 files changed, 14 insertions(+), 32 deletions(-) diff --git a/sys/dev/netif/ixgbe/ixgbe.c b/sys/dev/netif/ixgbe/ixgbe.c index 3a3c4dca32..94aad2023d 100644 --- a/sys/dev/netif/ixgbe/ixgbe.c +++ b/sys/dev/netif/ixgbe/ixgbe.c @@ -1744,10 +1744,10 @@ ixgbe_xmit(struct tx_ring *txr, struct mbuf **m_headp) struct adapter *adapter = txr->adapter; u32 olinfo_status = 0, cmd_type_len; u32 paylen = 0; - int i, j, error, nsegs; + int i, j, error, nsegs, maxsegs; int first, last = 0; struct mbuf *m_head; - bus_dma_segment_t segs[1]; + bus_dma_segment_t segs[adapter->num_segs]; bus_dmamap_t map; struct ixgbe_tx_buf *txbuf; union ixgbe_adv_tx_desc *txd = NULL; @@ -1773,39 +1773,18 @@ ixgbe_xmit(struct tx_ring *txr, struct mbuf **m_headp) /* * Map the packet for DMA. */ - error = bus_dmamap_load_mbuf_segment(txr->txtag, map, - *m_headp, segs, 1, &nsegs, BUS_DMA_NOWAIT); + maxsegs = txr->tx_avail - IXGBE_TX_RESERVED; + if (maxsegs > adapter->num_segs) + maxsegs = adapter->num_segs; - if (error == EFBIG) { - struct mbuf *m; - - m = m_defrag(*m_headp, MB_DONTWAIT); - if (m == NULL) { + error = bus_dmamap_load_mbuf_defrag(txr->txtag, map, m_headp, + segs, maxsegs, &nsegs, BUS_DMA_NOWAIT); + if (error) { + if (error == ENOBUFS) adapter->mbuf_defrag_failed++; - m_freem(*m_headp); - *m_headp = NULL; - return (ENOBUFS); - } - *m_headp = m; - - /* Try it again */ - error = bus_dmamap_load_mbuf_segment(txr->txtag, map, - *m_headp, segs, 1, &nsegs, BUS_DMA_NOWAIT); - - if (error == ENOMEM) { - adapter->no_tx_dma_setup++; - return (error); - } else if (error != 0) { + else adapter->no_tx_dma_setup++; - m_freem(*m_headp); - *m_headp = NULL; - return (error); - } - } else if (error == ENOMEM) { - adapter->no_tx_dma_setup++; - return (error); - } else if (error != 0) { - adapter->no_tx_dma_setup++; + m_freem(*m_headp); *m_headp = NULL; return (error); diff --git a/sys/dev/netif/ixgbe/ixgbe.h b/sys/dev/netif/ixgbe/ixgbe.h index 1acee0524d..4cdbbecdbf 100644 --- a/sys/dev/netif/ixgbe/ixgbe.h +++ b/sys/dev/netif/ixgbe/ixgbe.h @@ -195,6 +195,9 @@ /* Offload bits in mbuf flag */ #define CSUM_OFFLOAD (CSUM_IP|CSUM_TCP|CSUM_UDP) +/* One for TX csum offloading desc, the other 2 are reserved */ +#define IXGBE_TX_RESERVED 3 + /* * Interrupt Moderation parameters */ -- 2.41.0