From: François Tigeot Date: Tue, 21 Aug 2012 19:42:33 +0000 (+0200) Subject: ixgbe: Rework ixgbe_xmit() X-Git-Tag: v3.2.0~305 X-Git-Url: http://gitweb.dragonflybsd.org/dragonfly.git/commitdiff_plain/a1a9516bf4e47a0c66ea763ff631b9f55d695d0e ixgbe: Rework ixgbe_xmit() * Use bus_dmamap_load_mbuf_segment() * Clean up error handling code, following the example of the igb(4) driver --- diff --git a/sys/dev/netif/ixgbe/ixgbe.c b/sys/dev/netif/ixgbe/ixgbe.c index 3a3c4dc..94aad20 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 1acee05..4cdbbec 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 */