Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 26 Sep 2017 21:09:21 +0000 (UTC)
From:      David C Somayajulu <davidcs@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-11@freebsd.org
Subject:   svn commit: r324029 - stable/11/sys/dev/qlxgbe
Message-ID:  <201709262109.v8QL9Lrm051420@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: davidcs
Date: Tue Sep 26 21:09:21 2017
New Revision: 324029
URL: https://svnweb.freebsd.org/changeset/base/324029

Log:
  MFC r323824
    1. ql_hw.c:
    	In ql_hw_send() return EINVAL when TSO framelength exceeds max
    	supported length by HW.(davidcs)
    2. ql_os.c:
    	In qla_send() call bus_dmamap_unload before freeing mbuf or
    	recreating dmmamap.(davidcs)
    	In qla_fp_taskqueue() Add additional checks for IFF_DRV_RUNNING
    	Fix qla_clear_tx_buf() call bus_dmamap_sync() before freeing
    	mbuf.
  
  Submitted by:	David.Bachu@netapp.com

Modified:
  stable/11/sys/dev/qlxgbe/ql_hw.c
  stable/11/sys/dev/qlxgbe/ql_os.c
Directory Properties:
  stable/11/   (props changed)

Modified: stable/11/sys/dev/qlxgbe/ql_hw.c
==============================================================================
--- stable/11/sys/dev/qlxgbe/ql_hw.c	Tue Sep 26 21:05:40 2017	(r324028)
+++ stable/11/sys/dev/qlxgbe/ql_hw.c	Tue Sep 26 21:09:21 2017	(r324029)
@@ -2324,7 +2324,7 @@ ql_hw_send(qla_host_t *ha, bus_dma_segment_t *segs, in
 	if (total_length > QLA_MAX_TSO_FRAME_SIZE) {
 		device_printf(dev, "%s: total length exceeds maxlen(%d)\n",
 			__func__, total_length);
-		return (-1);
+		return (EINVAL);
 	}
 	eh = mtod(mp, struct ether_vlan_header *);
 

Modified: stable/11/sys/dev/qlxgbe/ql_os.c
==============================================================================
--- stable/11/sys/dev/qlxgbe/ql_os.c	Tue Sep 26 21:05:40 2017	(r324028)
+++ stable/11/sys/dev/qlxgbe/ql_os.c	Tue Sep 26 21:09:21 2017	(r324029)
@@ -1287,6 +1287,7 @@ qla_send(qla_host_t *ha, struct mbuf **m_headp, uint32
 			ha->tx_ring[txr_idx].iscsi_pkt_count++;
 		ha->tx_ring[txr_idx].tx_buf[tx_idx].m_head = m_head;
 	} else {
+		bus_dmamap_unload(ha->tx_tag, map); 
 		if (ret == EINVAL) {
 			if (m_head)
 				m_freem(m_head);
@@ -1372,7 +1373,8 @@ qla_fp_taskqueue(void *context, int pending)
                 goto qla_fp_taskqueue_exit;
         }
 
-	while (rx_pkts_left && !ha->stop_rcv) {
+	while (rx_pkts_left && !ha->stop_rcv &&
+		(ifp->if_drv_flags & IFF_DRV_RUNNING)) {
 		rx_pkts_left = ql_rcv_isr(ha, fp->txr_idx, 64);
 
 #ifdef QL_ENABLE_ISCSI_TLV
@@ -1415,6 +1417,11 @@ qla_fp_taskqueue(void *context, int pending)
 				drbr_advance(ifp, fp->tx_br);
 			}
 
+			/* Send a copy of the frame to the BPF listener */
+			ETHER_BPF_MTAP(ifp, mp);
+			if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0)
+				break;
+
 			mp = drbr_peek(ifp, fp->tx_br);
 		}
 	}
@@ -1677,16 +1684,24 @@ qla_clear_tx_buf(qla_host_t *ha, qla_tx_buf_t *txb)
 {
 	QL_DPRINT2(ha, (ha->pci_dev, "%s: enter\n", __func__));
 
-	if (txb->m_head && txb->map) {
+	if (txb->m_head) {
+		bus_dmamap_sync(ha->tx_tag, txb->map,
+			BUS_DMASYNC_POSTWRITE);
 
 		bus_dmamap_unload(ha->tx_tag, txb->map);
 
 		m_freem(txb->m_head);
 		txb->m_head = NULL;
+
+		bus_dmamap_destroy(ha->tx_tag, txb->map);
+		txb->map = NULL;
 	}
 
-	if (txb->map)
+	if (txb->map) {
+		bus_dmamap_unload(ha->tx_tag, txb->map);
 		bus_dmamap_destroy(ha->tx_tag, txb->map);
+		txb->map = NULL;
+	}
 
 	QL_DPRINT2(ha, (ha->pci_dev, "%s: exit\n", __func__));
 }



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201709262109.v8QL9Lrm051420>