net/fm10k: remove redundant queue id checks
[dpdk.git] / drivers / net / fm10k / fm10k_ethdev.c
index 612490b..541a49b 100644 (file)
@@ -448,29 +448,15 @@ static int
 fm10k_dev_configure(struct rte_eth_dev *dev)
 {
        int ret;
-       struct rte_eth_dev_info dev_info;
-       uint64_t rx_offloads = dev->data->dev_conf.rxmode.offloads;
-       uint64_t tx_offloads = dev->data->dev_conf.txmode.offloads;
 
        PMD_INIT_FUNC_TRACE();
 
-       if ((rx_offloads & DEV_RX_OFFLOAD_CRC_STRIP) == 0)
+       /* KEEP_CRC offload flag is not supported by PMD
+        * can remove the below block when DEV_RX_OFFLOAD_CRC_STRIP removed
+        */
+       if (rte_eth_dev_must_keep_crc(dev->data->dev_conf.rxmode.offloads))
                PMD_INIT_LOG(WARNING, "fm10k always strip CRC");
 
-       fm10k_dev_infos_get(dev, &dev_info);
-       if ((rx_offloads & dev_info.rx_offload_capa) != rx_offloads) {
-               PMD_DRV_LOG(ERR, "Some Rx offloads are not supported "
-                           "requested 0x%" PRIx64 " supported 0x%" PRIx64,
-                           rx_offloads, dev_info.rx_offload_capa);
-               return -ENOTSUP;
-       }
-       if ((tx_offloads & dev_info.tx_offload_capa) != tx_offloads) {
-               PMD_DRV_LOG(ERR, "Some Tx offloads are not supported "
-                           "requested 0x%" PRIx64 " supported 0x%" PRIx64,
-                           tx_offloads, dev_info.tx_offload_capa);
-               return -ENOTSUP;
-       }
-
        /* multipe queue mode checking */
        ret  = fm10k_check_mq_mode(dev);
        if (ret != 0) {
@@ -824,52 +810,50 @@ static int
 fm10k_dev_rx_queue_start(struct rte_eth_dev *dev, uint16_t rx_queue_id)
 {
        struct fm10k_hw *hw = FM10K_DEV_PRIVATE_TO_HW(dev->data->dev_private);
-       int err = -1;
+       int err;
        uint32_t reg;
        struct fm10k_rx_queue *rxq;
 
        PMD_INIT_FUNC_TRACE();
 
-       if (rx_queue_id < dev->data->nb_rx_queues) {
-               rxq = dev->data->rx_queues[rx_queue_id];
-               err = rx_queue_reset(rxq);
-               if (err == -ENOMEM) {
-                       PMD_INIT_LOG(ERR, "Failed to alloc memory : %d", err);
-                       return err;
-               } else if (err == -EINVAL) {
-                       PMD_INIT_LOG(ERR, "Invalid buffer address alignment :"
-                               " %d", err);
-                       return err;
-               }
+       rxq = dev->data->rx_queues[rx_queue_id];
+       err = rx_queue_reset(rxq);
+       if (err == -ENOMEM) {
+               PMD_INIT_LOG(ERR, "Failed to alloc memory : %d", err);
+               return err;
+       } else if (err == -EINVAL) {
+               PMD_INIT_LOG(ERR, "Invalid buffer address alignment :"
+                       " %d", err);
+               return err;
+       }
 
-               /* Setup the HW Rx Head and Tail Descriptor Pointers
-                * Note: this must be done AFTER the queue is enabled on real
-                * hardware, but BEFORE the queue is enabled when using the
-                * emulation platform. Do it in both places for now and remove
-                * this comment and the following two register writes when the
-                * emulation platform is no longer being used.
-                */
-               FM10K_WRITE_REG(hw, FM10K_RDH(rx_queue_id), 0);
-               FM10K_WRITE_REG(hw, FM10K_RDT(rx_queue_id), rxq->nb_desc - 1);
+       /* Setup the HW Rx Head and Tail Descriptor Pointers
+        * Note: this must be done AFTER the queue is enabled on real
+        * hardware, but BEFORE the queue is enabled when using the
+        * emulation platform. Do it in both places for now and remove
+        * this comment and the following two register writes when the
+        * emulation platform is no longer being used.
+        */
+       FM10K_WRITE_REG(hw, FM10K_RDH(rx_queue_id), 0);
+       FM10K_WRITE_REG(hw, FM10K_RDT(rx_queue_id), rxq->nb_desc - 1);
 
-               /* Set PF ownership flag for PF devices */
-               reg = FM10K_READ_REG(hw, FM10K_RXQCTL(rx_queue_id));
-               if (hw->mac.type == fm10k_mac_pf)
-                       reg |= FM10K_RXQCTL_PF;
-               reg |= FM10K_RXQCTL_ENABLE;
-               /* enable RX queue */
-               FM10K_WRITE_REG(hw, FM10K_RXQCTL(rx_queue_id), reg);
-               FM10K_WRITE_FLUSH(hw);
+       /* Set PF ownership flag for PF devices */
+       reg = FM10K_READ_REG(hw, FM10K_RXQCTL(rx_queue_id));
+       if (hw->mac.type == fm10k_mac_pf)
+               reg |= FM10K_RXQCTL_PF;
+       reg |= FM10K_RXQCTL_ENABLE;
+       /* enable RX queue */
+       FM10K_WRITE_REG(hw, FM10K_RXQCTL(rx_queue_id), reg);
+       FM10K_WRITE_FLUSH(hw);
 
-               /* Setup the HW Rx Head and Tail Descriptor Pointers
-                * Note: this must be done AFTER the queue is enabled
-                */
-               FM10K_WRITE_REG(hw, FM10K_RDH(rx_queue_id), 0);
-               FM10K_WRITE_REG(hw, FM10K_RDT(rx_queue_id), rxq->nb_desc - 1);
-               dev->data->rx_queue_state[rx_queue_id] = RTE_ETH_QUEUE_STATE_STARTED;
-       }
+       /* Setup the HW Rx Head and Tail Descriptor Pointers
+        * Note: this must be done AFTER the queue is enabled
+        */
+       FM10K_WRITE_REG(hw, FM10K_RDH(rx_queue_id), 0);
+       FM10K_WRITE_REG(hw, FM10K_RDT(rx_queue_id), rxq->nb_desc - 1);
+       dev->data->rx_queue_state[rx_queue_id] = RTE_ETH_QUEUE_STATE_STARTED;
 
-       return err;
+       return 0;
 }
 
 static int
@@ -879,14 +863,12 @@ fm10k_dev_rx_queue_stop(struct rte_eth_dev *dev, uint16_t rx_queue_id)
 
        PMD_INIT_FUNC_TRACE();
 
-       if (rx_queue_id < dev->data->nb_rx_queues) {
-               /* Disable RX queue */
-               rx_queue_disable(hw, rx_queue_id);
+       /* Disable RX queue */
+       rx_queue_disable(hw, rx_queue_id);
 
-               /* Free mbuf and clean HW ring */
-               rx_queue_clean(dev->data->rx_queues[rx_queue_id]);
-               dev->data->rx_queue_state[rx_queue_id] = RTE_ETH_QUEUE_STATE_STOPPED;
-       }
+       /* Free mbuf and clean HW ring */
+       rx_queue_clean(dev->data->rx_queues[rx_queue_id]);
+       dev->data->rx_queue_state[rx_queue_id] = RTE_ETH_QUEUE_STATE_STOPPED;
 
        return 0;
 }
@@ -898,28 +880,23 @@ fm10k_dev_tx_queue_start(struct rte_eth_dev *dev, uint16_t tx_queue_id)
        /** @todo - this should be defined in the shared code */
 #define FM10K_TXDCTL_WRITE_BACK_MIN_DELAY      0x00010000
        uint32_t txdctl = FM10K_TXDCTL_WRITE_BACK_MIN_DELAY;
-       int err = 0;
+       struct fm10k_tx_queue *q = dev->data->tx_queues[tx_queue_id];
 
        PMD_INIT_FUNC_TRACE();
 
-       if (tx_queue_id < dev->data->nb_tx_queues) {
-               struct fm10k_tx_queue *q = dev->data->tx_queues[tx_queue_id];
-
-               q->ops->reset(q);
+       q->ops->reset(q);
 
-               /* reset head and tail pointers */
-               FM10K_WRITE_REG(hw, FM10K_TDH(tx_queue_id), 0);
-               FM10K_WRITE_REG(hw, FM10K_TDT(tx_queue_id), 0);
+       /* reset head and tail pointers */
+       FM10K_WRITE_REG(hw, FM10K_TDH(tx_queue_id), 0);
+       FM10K_WRITE_REG(hw, FM10K_TDT(tx_queue_id), 0);
 
-               /* enable TX queue */
-               FM10K_WRITE_REG(hw, FM10K_TXDCTL(tx_queue_id),
-                                       FM10K_TXDCTL_ENABLE | txdctl);
-               FM10K_WRITE_FLUSH(hw);
-               dev->data->tx_queue_state[tx_queue_id] = RTE_ETH_QUEUE_STATE_STARTED;
-       } else
-               err = -1;
+       /* enable TX queue */
+       FM10K_WRITE_REG(hw, FM10K_TXDCTL(tx_queue_id),
+                               FM10K_TXDCTL_ENABLE | txdctl);
+       FM10K_WRITE_FLUSH(hw);
+       dev->data->tx_queue_state[tx_queue_id] = RTE_ETH_QUEUE_STATE_STARTED;
 
-       return err;
+       return 0;
 }
 
 static int
@@ -929,11 +906,9 @@ fm10k_dev_tx_queue_stop(struct rte_eth_dev *dev, uint16_t tx_queue_id)
 
        PMD_INIT_FUNC_TRACE();
 
-       if (tx_queue_id < dev->data->nb_tx_queues) {
-               tx_queue_disable(hw, tx_queue_id);
-               tx_queue_clean(dev->data->tx_queues[tx_queue_id]);
-               dev->data->tx_queue_state[tx_queue_id] = RTE_ETH_QUEUE_STATE_STOPPED;
-       }
+       tx_queue_disable(hw, tx_queue_id);
+       tx_queue_clean(dev->data->tx_queues[tx_queue_id]);
+       dev->data->tx_queue_state[tx_queue_id] = RTE_ETH_QUEUE_STATE_STOPPED;
 
        return 0;
 }
@@ -1825,22 +1800,6 @@ static uint64_t fm10k_get_rx_port_offloads_capa(struct rte_eth_dev *dev)
                           DEV_RX_OFFLOAD_HEADER_SPLIT);
 }
 
-static int
-fm10k_check_rx_queue_offloads(struct rte_eth_dev *dev, uint64_t requested)
-{
-       uint64_t port_offloads = dev->data->dev_conf.rxmode.offloads;
-       uint64_t queue_supported = fm10k_get_rx_queue_offloads_capa(dev);
-       uint64_t port_supported = fm10k_get_rx_port_offloads_capa(dev);
-
-       if ((requested & (queue_supported | port_supported)) != requested)
-               return 0;
-
-       if ((port_offloads ^ requested) & port_supported)
-               return 0;
-
-       return 1;
-}
-
 static int
 fm10k_rx_queue_setup(struct rte_eth_dev *dev, uint16_t queue_id,
        uint16_t nb_desc, unsigned int socket_id,
@@ -1851,20 +1810,11 @@ fm10k_rx_queue_setup(struct rte_eth_dev *dev, uint16_t queue_id,
                FM10K_DEV_PRIVATE_TO_INFO(dev->data->dev_private);
        struct fm10k_rx_queue *q;
        const struct rte_memzone *mz;
+       uint64_t offloads;
 
        PMD_INIT_FUNC_TRACE();
 
-       if (!fm10k_check_rx_queue_offloads(dev, conf->offloads)) {
-               PMD_INIT_LOG(ERR, "%p: Rx queue offloads 0x%" PRIx64
-                       " don't match port offloads 0x%" PRIx64
-                       " or supported port offloads 0x%" PRIx64
-                       " or supported queue offloads 0x%" PRIx64,
-                       (void *)dev, conf->offloads,
-                       dev->data->dev_conf.rxmode.offloads,
-                       fm10k_get_rx_port_offloads_capa(dev),
-                       fm10k_get_rx_queue_offloads_capa(dev));
-               return -ENOTSUP;
-       }
+       offloads = conf->offloads | dev->data->dev_conf.rxmode.offloads;
 
        /* make sure the mempool element size can account for alignment. */
        if (!mempool_element_size_valid(mp)) {
@@ -1910,7 +1860,7 @@ fm10k_rx_queue_setup(struct rte_eth_dev *dev, uint16_t queue_id,
        q->queue_id = queue_id;
        q->tail_ptr = (volatile uint32_t *)
                &((uint32_t *)hw->hw_addr)[FM10K_RDT(queue_id)];
-       q->offloads = conf->offloads;
+       q->offloads = offloads;
        if (handle_rxconf(q, conf))
                return -EINVAL;
 
@@ -2038,22 +1988,6 @@ static uint64_t fm10k_get_tx_port_offloads_capa(struct rte_eth_dev *dev)
                          DEV_TX_OFFLOAD_TCP_TSO);
 }
 
-static int
-fm10k_check_tx_queue_offloads(struct rte_eth_dev *dev, uint64_t requested)
-{
-       uint64_t port_offloads = dev->data->dev_conf.txmode.offloads;
-       uint64_t queue_supported = fm10k_get_tx_queue_offloads_capa(dev);
-       uint64_t port_supported = fm10k_get_tx_port_offloads_capa(dev);
-
-       if ((requested & (queue_supported | port_supported)) != requested)
-               return 0;
-
-       if ((port_offloads ^ requested) & port_supported)
-               return 0;
-
-       return 1;
-}
-
 static int
 fm10k_tx_queue_setup(struct rte_eth_dev *dev, uint16_t queue_id,
        uint16_t nb_desc, unsigned int socket_id,
@@ -2062,20 +1996,11 @@ fm10k_tx_queue_setup(struct rte_eth_dev *dev, uint16_t queue_id,
        struct fm10k_hw *hw = FM10K_DEV_PRIVATE_TO_HW(dev->data->dev_private);
        struct fm10k_tx_queue *q;
        const struct rte_memzone *mz;
+       uint64_t offloads;
 
        PMD_INIT_FUNC_TRACE();
 
-       if (!fm10k_check_tx_queue_offloads(dev, conf->offloads)) {
-               PMD_INIT_LOG(ERR, "%p: Tx queue offloads 0x%" PRIx64
-                       " don't match port offloads 0x%" PRIx64
-                       " or supported port offloads 0x%" PRIx64
-                       " or supported queue offloads 0x%" PRIx64,
-                       (void *)dev, conf->offloads,
-                       dev->data->dev_conf.txmode.offloads,
-                       fm10k_get_tx_port_offloads_capa(dev),
-                       fm10k_get_tx_queue_offloads_capa(dev));
-               return -ENOTSUP;
-       }
+       offloads = conf->offloads | dev->data->dev_conf.txmode.offloads;
 
        /* make sure a valid number of descriptors have been requested */
        if (check_nb_desc(FM10K_MIN_TX_DESC, FM10K_MAX_TX_DESC,
@@ -2113,7 +2038,7 @@ fm10k_tx_queue_setup(struct rte_eth_dev *dev, uint16_t queue_id,
        q->nb_desc = nb_desc;
        q->port_id = dev->data->port_id;
        q->queue_id = queue_id;
-       q->offloads = conf->offloads;
+       q->offloads = offloads;
        q->ops = &def_txq_ops;
        q->tail_ptr = (volatile uint32_t *)
                &((uint32_t *)hw->hw_addr)[FM10K_TDT(queue_id)];
@@ -2903,6 +2828,8 @@ static const struct eth_dev_ops fm10k_eth_dev_ops = {
        .tx_queue_setup         = fm10k_tx_queue_setup,
        .tx_queue_release       = fm10k_tx_queue_release,
        .rx_descriptor_done     = fm10k_dev_rx_descriptor_done,
+       .rx_descriptor_status = fm10k_dev_rx_descriptor_status,
+       .tx_descriptor_status = fm10k_dev_tx_descriptor_status,
        .rx_queue_intr_enable   = fm10k_dev_rx_queue_intr_enable,
        .rx_queue_intr_disable  = fm10k_dev_rx_queue_intr_disable,
        .reta_update            = fm10k_reta_update,
@@ -3356,9 +3283,7 @@ RTE_PMD_REGISTER_PCI(net_fm10k, rte_pmd_fm10k);
 RTE_PMD_REGISTER_PCI_TABLE(net_fm10k, pci_id_fm10k_map);
 RTE_PMD_REGISTER_KMOD_DEP(net_fm10k, "* igb_uio | uio_pci_generic | vfio-pci");
 
-RTE_INIT(fm10k_init_log);
-static void
-fm10k_init_log(void)
+RTE_INIT(fm10k_init_log)
 {
        fm10k_logtype_init = rte_log_register("pmd.net.fm10k.init");
        if (fm10k_logtype_init >= 0)