[dpdk-dev] [PATCH v2 13/62] net/cnxk: add device configuration operation

Jerin Jacob jerinjacobk at gmail.com
Tue Jun 15 14:29:24 CEST 2021


On Mon, Jun 7, 2021 at 11:34 PM Nithin Dabilpuram
<ndabilpuram at marvell.com> wrote:
>
> Add device configuration op for CN9K and CN10K. Most of the
> device configuration is common between two platforms except for
> some supported offloads.
>
> Signed-off-by: Nithin Dabilpuram <ndabilpuram at marvell.com>
> +static int
> +nix_restore_queue_cfg(struct rte_eth_dev *eth_dev)
> +{
> +       struct cnxk_eth_dev *dev = cnxk_eth_pmd_priv(eth_dev);
> +       const struct eth_dev_ops *dev_ops = eth_dev->dev_ops;
> +       struct cnxk_eth_qconf *tx_qconf = dev->tx_qconf;
> +       struct cnxk_eth_qconf *rx_qconf = dev->rx_qconf;
> +       int rc, i, nb_rxq, nb_txq;
> +       void **txq, **rxq;
> +
> +       nb_rxq = RTE_MIN(dev->nb_rxq, eth_dev->data->nb_rx_queues);
> +       nb_txq = RTE_MIN(dev->nb_txq, eth_dev->data->nb_tx_queues);
> +
> +       rc = -ENOMEM;
> +       /* Setup tx & rx queues with previous configuration so
> +        * that the queues can be functional in cases like ports
> +        * are started without re configuring queues.
> +        *
> +        * Usual re config sequence is like below:
> +        * port_configure() {
> +        *      if(reconfigure) {
> +        *              queue_release()
> +        *              queue_setup()
> +        *      }
> +        *      queue_configure() {
> +        *              queue_release()
> +        *              queue_setup()
> +        *      }
> +        * }
> +        * port_start()


This logic no more required as the KNI application fixed the bug.

> +        *
> +        * In some application's control path, queue_configure() would
> +        * NOT be invoked for TXQs/RXQs in port_configure().
> +        * In such cases, queues can be functional after start as the
> +        * queues are already setup in port_configure().
> +        */
> +       for (i = 0; i < nb_txq; i++) {
> +               if (!tx_qconf[i].valid)
> +                       continue;
> +               rc = dev_ops->tx_queue_setup(eth_dev, i, tx_qconf[i].nb_desc, 0,
> +                                            &tx_qconf[i].conf.tx);
> +               if (rc) {
> +                       plt_err("Failed to setup tx queue rc=%d", rc);
> +                       txq = eth_dev->data->tx_queues;
> +                       for (i -= 1; i >= 0; i--)
> +                               dev_ops->tx_queue_release(txq[i]);
> +                       goto fail;
> +               }
> +       }
> +
> +       free(tx_qconf);
> +       tx_qconf = NULL;
> +
> +       for (i = 0; i < nb_rxq; i++) {
> +               if (!rx_qconf[i].valid)
> +                       continue;
> +               rc = dev_ops->rx_queue_setup(eth_dev, i, rx_qconf[i].nb_desc, 0,
> +                                            &rx_qconf[i].conf.rx,
> +                                            rx_qconf[i].mp);
> +               if (rc) {
> +                       plt_err("Failed to setup rx queue rc=%d", rc);
> +                       rxq = eth_dev->data->rx_queues;
> +                       for (i -= 1; i >= 0; i--)
> +                               dev_ops->rx_queue_release(rxq[i]);
> +                       goto tx_queue_release;
> +               }
> +       }
> +
> +       free(rx_qconf);
> +       rx_qconf = NULL;
> +
> +       return 0;
> +
> +tx_queue_release:
> +       txq = eth_dev->data->tx_queues;
> +       for (i = 0; i < eth_dev->data->nb_tx_queues; i++)
> +               dev_ops->tx_queue_release(txq[i]);
> +fail:
> +       if (tx_qconf)
> +               free(tx_qconf);
> +       if (rx_qconf)
> +               free(rx_qconf);
> +
> +       return rc;
> +}
> +
>


More information about the dev mailing list