On Mon, Jun 7, 2021 at 11:34 PM Nithin Dabilpuram <ndabilpu...@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 <ndabilpu...@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; > +} > + >