diff options
| author | Robert Mustacchi <rm@joyent.com> | 2017-08-15 17:42:28 +0000 |
|---|---|---|
| committer | Robert Mustacchi <rm@joyent.com> | 2017-08-15 17:42:28 +0000 |
| commit | 99ffac9b1cfb3c065213f6a97fe9bde31cd137a4 (patch) | |
| tree | 750037f1acf6629cdf10b99ec9ae8842dd3d1f3a | |
| parent | 9b1057ffe540ddc528444bde5397bc267a2e8e4e (diff) | |
| download | illumos-joyent-99ffac9b1cfb3c065213f6a97fe9bde31cd137a4.tar.gz | |
restore missing pieces
| -rw-r--r-- | usr/src/uts/common/io/qede/qede_fp.c | 22 |
1 files changed, 19 insertions, 3 deletions
diff --git a/usr/src/uts/common/io/qede/qede_fp.c b/usr/src/uts/common/io/qede/qede_fp.c index b7cbf236ec..3fd35819ca 100644 --- a/usr/src/uts/common/io/qede/qede_fp.c +++ b/usr/src/uts/common/io/qede/qede_fp.c @@ -1125,7 +1125,7 @@ qede_tx_mapped(qede_tx_ring_t *tx_ring, mblk_t *mp, qede_tx_pktinfo_t *pktinfo) enum qede_xmit_status status = XMIT_FAILED; int ret; qede_dma_handles_list_t *dmah_list = &tx_ring->dmah_list; - qede_dma_handle_entry_t *dmah_entry, *head = NULL, *tail = NULL, *hdl; + qede_dma_handle_entry_t *dmah_entry = NULL, *head = NULL, *tail = NULL, *hdl; struct eth_tx_1st_bd *first_bd; struct eth_tx_2nd_bd *second_bd; struct eth_tx_3rd_bd *third_bd; @@ -1171,6 +1171,7 @@ qede_tx_mapped(qede_tx_ring_t *tx_ring, mblk_t *mp, qede_tx_pktinfo_t *pktinfo) * reserve an handle from the driver dma * handles list */ +#ifdef DBLK_DMA_PREMAP if (bp->b_datap->db_flags & DBLK_DMA_PREMAP) { #ifdef DEBUG_PREMAP qede_info(tx_ring->qede, "mp is premapped"); @@ -1189,6 +1190,7 @@ qede_tx_mapped(qede_tx_ring_t *tx_ring, mblk_t *mp, qede_tx_pktinfo_t *pktinfo) tx_ring->tx_premap_fail++; } } +#endif /* DBLK_DMA_PREMAP */ if (!is_premapped) { dmah_entry = qede_get_dmah_entry(tx_ring); @@ -1265,6 +1267,15 @@ qede_tx_mapped(qede_tx_ring_t *tx_ring, mblk_t *mp, qede_tx_pktinfo_t *pktinfo) } } + /* + * Guard against the case where we get a series of mblks that cause us + * not to end up with any mapped data. + */ + if (total_cookies == 0) { + status = XMIT_FAILED; + goto err_map; + } + if (total_cookies > (ETH_TX_MAX_BDS_PER_NON_LSO_PACKET - 1)){ tx_ring->tx_too_many_cookies++; status = XMIT_TOO_MANY_COOKIES; @@ -1519,14 +1530,14 @@ do_pullup: qede_get_pkt_info(qede, mp, &pktinfo); -if ((!pktinfo.use_lso) && + if ((!pktinfo.use_lso) && (pktinfo.total_len > (qede->mtu + QEDE_MAX_ETHER_HDR))) { qede_info(tx_ring->qede, "Packet drop as packet len 0x%x > 0x%x", pktinfo.total_len, (qede->mtu + QEDE_MAX_ETHER_HDR)); status = XMIT_FAILED; goto exit; -} + } #ifdef DEBUG_PULLUP @@ -1546,9 +1557,14 @@ if ((!pktinfo.use_lso) && qede_print_err("!%s(%d): mp %p id PREMAPPMED", __func__, qede->instance); #endif +#ifdef DBLK_DMA_PREMAP if (DBLK_IS_PREMAPPED(mp->b_datap) || pktinfo.total_len > qede->tx_bcopy_threshold) xmit_mode = USE_DMA_BIND; +#else + if (pktinfo.total_len > qede->tx_bcopy_threshold) + xmit_mode = USE_DMA_BIND; +#endif if (pktinfo.total_len <= qede->tx_bcopy_threshold) xmit_mode = USE_BCOPY; |
