ixgbe: fix release queue mbufs
[dpdk.git] / drivers / net / e1000 / em_rxtx.c
index fdc825f..3b8776d 100644 (file)
@@ -182,7 +182,9 @@ struct em_tx_queue {
        volatile uint32_t      *tdt_reg_addr; /**< Address of TDT register. */
        uint16_t               nb_tx_desc;    /**< number of TX descriptors. */
        uint16_t               tx_tail;  /**< Current value of TDT register. */
-       uint16_t               tx_free_thresh;/**< minimum TX before freeing. */
+       /**< Start freeing TX buffers if there are less free descriptors than
+            this value. */
+       uint16_t               tx_free_thresh;
        /**< Number of TX descriptors to use before RS bit is set. */
        uint16_t               tx_rs_thresh;
        /** Number of TX descriptors used since RS bit was set. */
@@ -418,9 +420,8 @@ eth_em_xmit_pkts(void *tx_queue, struct rte_mbuf **tx_pkts,
        txe = &sw_ring[tx_id];
 
        /* Determine if the descriptor ring needs to be cleaned. */
-       if ((txq->nb_tx_desc - txq->nb_tx_free) > txq->tx_free_thresh) {
+        if (txq->nb_tx_free < txq->tx_free_thresh)
                em_xmit_cleanup(txq);
-       }
 
        /* TX loop */
        for (nb_tx = 0; nb_tx < nb_pkts; nb_tx++) {
@@ -1514,6 +1515,24 @@ em_dev_clear_queues(struct rte_eth_dev *dev)
        }
 }
 
+void
+em_dev_free_queues(struct rte_eth_dev *dev)
+{
+       uint16_t i;
+
+       for (i = 0; i < dev->data->nb_rx_queues; i++) {
+               eth_em_rx_queue_release(dev->data->rx_queues[i]);
+               dev->data->rx_queues[i] = NULL;
+       }
+       dev->data->nb_rx_queues = 0;
+
+       for (i = 0; i < dev->data->nb_tx_queues; i++) {
+               eth_em_tx_queue_release(dev->data->tx_queues[i]);
+               dev->data->tx_queues[i] = NULL;
+       }
+       dev->data->nb_tx_queues = 0;
+}
+
 /*
  * Takes as input/output parameter RX buffer size.
  * Returns (BSIZE | BSEX | FLXBUF) fields of RCTL register.