drivers/net: fix removing jumbo offload flag
[dpdk.git] / drivers / net / i40e / i40e_rxtx.c
index caab66e..fd066e8 100644 (file)
@@ -2024,6 +2024,7 @@ i40e_dev_rx_queue_setup(struct rte_eth_dev *dev,
                return -ENOMEM;
        }
 
+       rxq->mz = rz;
        /* Zero all the descriptors in the ring. */
        memset(rz->addr, 0, ring_size);
 
@@ -2115,18 +2116,19 @@ i40e_rx_queue_release(void *rxq)
 
        i40e_rx_queue_release_mbufs(q);
        rte_free(q->sw_ring);
+       rte_memzone_free(q->mz);
        rte_free(q);
 }
 
 uint32_t
-i40e_dev_rx_queue_count(struct rte_eth_dev *dev, uint16_t rx_queue_id)
+i40e_dev_rx_queue_count(void *rx_queue)
 {
 #define I40E_RXQ_SCAN_INTERVAL 4
        volatile union i40e_rx_desc *rxdp;
        struct i40e_rx_queue *rxq;
        uint16_t desc = 0;
 
-       rxq = dev->data->rx_queues[rx_queue_id];
+       rxq = rx_queue;
        rxdp = &(rxq->rx_ring[rxq->rx_tail]);
        while ((desc < rxq->nb_rx_desc) &&
                ((rte_le_to_cpu_64(rxdp->wb.qword1.status_error_len) &
@@ -2147,32 +2149,6 @@ i40e_dev_rx_queue_count(struct rte_eth_dev *dev, uint16_t rx_queue_id)
        return desc;
 }
 
-int
-i40e_dev_rx_descriptor_done(void *rx_queue, uint16_t offset)
-{
-       volatile union i40e_rx_desc *rxdp;
-       struct i40e_rx_queue *rxq = rx_queue;
-       uint16_t desc;
-       int ret;
-
-       if (unlikely(offset >= rxq->nb_rx_desc)) {
-               PMD_DRV_LOG(ERR, "Invalid RX descriptor id %u", offset);
-               return 0;
-       }
-
-       desc = rxq->rx_tail + offset;
-       if (desc >= rxq->nb_rx_desc)
-               desc -= rxq->nb_rx_desc;
-
-       rxdp = &(rxq->rx_ring[desc]);
-
-       ret = !!(((rte_le_to_cpu_64(rxdp->wb.qword1.status_error_len) &
-               I40E_RXD_QW1_STATUS_MASK) >> I40E_RXD_QW1_STATUS_SHIFT) &
-                               (1 << I40E_RX_DESC_STATUS_DD_SHIFT));
-
-       return ret;
-}
-
 int
 i40e_dev_rx_descriptor_status(void *rx_queue, uint16_t offset)
 {
@@ -2427,6 +2403,7 @@ i40e_dev_tx_queue_setup(struct rte_eth_dev *dev,
                return -ENOMEM;
        }
 
+       txq->mz = tz;
        txq->nb_tx_desc = nb_desc;
        txq->tx_rs_thresh = tx_rs_thresh;
        txq->tx_free_thresh = tx_free_thresh;
@@ -2500,6 +2477,7 @@ i40e_tx_queue_release(void *txq)
 
        i40e_tx_queue_release_mbufs(q);
        rte_free(q->sw_ring);
+       rte_memzone_free(q->mz);
        rte_free(q);
 }
 
@@ -2921,28 +2899,15 @@ i40e_rx_queue_config(struct i40e_rx_queue *rxq)
        }
 
        rxq->max_pkt_len =
-               RTE_MIN((uint32_t)(hw->func_caps.rx_buf_chain_len *
-                       rxq->rx_buf_len), data->dev_conf.rxmode.max_rx_pkt_len);
-       if (data->dev_conf.rxmode.offloads & DEV_RX_OFFLOAD_JUMBO_FRAME) {
-               if (rxq->max_pkt_len <= I40E_ETH_MAX_LEN ||
-                       rxq->max_pkt_len > I40E_FRAME_SIZE_MAX) {
-                       PMD_DRV_LOG(ERR, "maximum packet length must "
-                                   "be larger than %u and smaller than %u,"
-                                   "as jumbo frame is enabled",
-                                   (uint32_t)I40E_ETH_MAX_LEN,
-                                   (uint32_t)I40E_FRAME_SIZE_MAX);
-                       return I40E_ERR_CONFIG;
-               }
-       } else {
-               if (rxq->max_pkt_len < RTE_ETHER_MIN_LEN ||
-                       rxq->max_pkt_len > I40E_ETH_MAX_LEN) {
-                       PMD_DRV_LOG(ERR, "maximum packet length must be "
-                                   "larger than %u and smaller than %u, "
-                                   "as jumbo frame is disabled",
-                                   (uint32_t)RTE_ETHER_MIN_LEN,
-                                   (uint32_t)I40E_ETH_MAX_LEN);
-                       return I40E_ERR_CONFIG;
-               }
+               RTE_MIN(hw->func_caps.rx_buf_chain_len * rxq->rx_buf_len,
+                               data->mtu + I40E_ETH_OVERHEAD);
+       if (rxq->max_pkt_len < RTE_ETHER_MIN_LEN ||
+               rxq->max_pkt_len > I40E_FRAME_SIZE_MAX) {
+               PMD_DRV_LOG(ERR, "maximum packet length must be "
+                           "larger than %u and smaller than %u",
+                           (uint32_t)RTE_ETHER_MIN_LEN,
+                           (uint32_t)I40E_FRAME_SIZE_MAX);
+               return I40E_ERR_CONFIG;
        }
 
        return 0;
@@ -3056,7 +3021,6 @@ i40e_dev_free_queues(struct rte_eth_dev *dev)
                        continue;
                i40e_rx_queue_release(dev->data->rx_queues[i]);
                dev->data->rx_queues[i] = NULL;
-               rte_eth_dma_zone_free(dev, "rx_ring", i);
        }
 
        for (i = 0; i < dev->data->nb_tx_queues; i++) {
@@ -3064,7 +3028,6 @@ i40e_dev_free_queues(struct rte_eth_dev *dev)
                        continue;
                i40e_tx_queue_release(dev->data->tx_queues[i]);
                dev->data->tx_queues[i] = NULL;
-               rte_eth_dma_zone_free(dev, "tx_ring", i);
        }
 }
 
@@ -3107,6 +3070,7 @@ i40e_fdir_setup_tx_resources(struct i40e_pf *pf)
                return I40E_ERR_NO_MEMORY;
        }
 
+       txq->mz = tz;
        txq->nb_tx_desc = I40E_FDIR_NUM_TX_DESC;
        txq->queue_id = I40E_FDIR_QUEUE_ID;
        txq->reg_idx = pf->fdir.fdir_vsi->base_queue;
@@ -3165,6 +3129,7 @@ i40e_fdir_setup_rx_resources(struct i40e_pf *pf)
                return I40E_ERR_NO_MEMORY;
        }
 
+       rxq->mz = rz;
        rxq->nb_rx_desc = I40E_FDIR_NUM_RX_DESC;
        rxq->queue_id = I40E_FDIR_QUEUE_ID;
        rxq->reg_idx = pf->fdir.fdir_vsi->base_queue;