summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Mustacchi <rm@joyent.com>2017-08-15 17:42:28 +0000
committerRobert Mustacchi <rm@joyent.com>2017-08-15 17:42:28 +0000
commit99ffac9b1cfb3c065213f6a97fe9bde31cd137a4 (patch)
tree750037f1acf6629cdf10b99ec9ae8842dd3d1f3a
parent9b1057ffe540ddc528444bde5397bc267a2e8e4e (diff)
downloadillumos-joyent-99ffac9b1cfb3c065213f6a97fe9bde31cd137a4.tar.gz
restore missing pieces
-rw-r--r--usr/src/uts/common/io/qede/qede_fp.c22
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;