[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