net/octeontx2: fix PTP enable via Rx offload flags
[dpdk.git] / drivers / net / octeontx2 / otx2_ethdev.c
index 5ec5551..b018b25 100644 (file)
@@ -586,6 +586,24 @@ nix_tx_offload_flags(struct rte_eth_dev *eth_dev)
        RTE_BUILD_BUG_ON(PKT_TX_TCP_CKSUM != (1ULL << 52));
        RTE_BUILD_BUG_ON(PKT_TX_SCTP_CKSUM != (2ULL << 52));
        RTE_BUILD_BUG_ON(PKT_TX_UDP_CKSUM != (3ULL << 52));
+       RTE_BUILD_BUG_ON(PKT_TX_IP_CKSUM != (1ULL << 54));
+       RTE_BUILD_BUG_ON(PKT_TX_IPV4 != (1ULL << 55));
+       RTE_BUILD_BUG_ON(PKT_TX_OUTER_IP_CKSUM != (1ULL << 58));
+       RTE_BUILD_BUG_ON(PKT_TX_OUTER_IPV4 != (1ULL << 59));
+       RTE_BUILD_BUG_ON(PKT_TX_OUTER_IPV6 != (1ULL << 60));
+       RTE_BUILD_BUG_ON(PKT_TX_OUTER_UDP_CKSUM != (1ULL << 41));
+       RTE_BUILD_BUG_ON(RTE_MBUF_L2_LEN_BITS != 7);
+       RTE_BUILD_BUG_ON(RTE_MBUF_L3_LEN_BITS != 9);
+       RTE_BUILD_BUG_ON(RTE_MBUF_OUTL2_LEN_BITS != 7);
+       RTE_BUILD_BUG_ON(RTE_MBUF_OUTL3_LEN_BITS != 9);
+       RTE_BUILD_BUG_ON(offsetof(struct rte_mbuf, data_off) !=
+                        offsetof(struct rte_mbuf, buf_iova) + 8);
+       RTE_BUILD_BUG_ON(offsetof(struct rte_mbuf, ol_flags) !=
+                        offsetof(struct rte_mbuf, buf_iova) + 16);
+       RTE_BUILD_BUG_ON(offsetof(struct rte_mbuf, pkt_len) !=
+                        offsetof(struct rte_mbuf, ol_flags) + 12);
+       RTE_BUILD_BUG_ON(offsetof(struct rte_mbuf, tx_offload) !=
+                        offsetof(struct rte_mbuf, pool) + 2 * sizeof(void *));
 
        if (conf & DEV_TX_OFFLOAD_VLAN_INSERT ||
            conf & DEV_TX_OFFLOAD_QINQ_INSERT)
@@ -607,6 +625,9 @@ nix_tx_offload_flags(struct rte_eth_dev *eth_dev)
        if (conf & DEV_TX_OFFLOAD_MULTI_SEGS)
                flags |= NIX_TX_MULTI_SEG_F;
 
+       if ((dev->rx_offloads & DEV_RX_OFFLOAD_TIMESTAMP))
+               flags |= NIX_TX_OFFLOAD_TSTAMP_F;
+
        return flags;
 }
 
@@ -1185,33 +1206,41 @@ otx2_nix_configure(struct rte_eth_dev *eth_dev)
        /* Sanity checks */
        if (rte_eal_has_hugepages() == 0) {
                otx2_err("Huge page is not configured");
-               goto fail;
+               goto fail_configure;
        }
 
        if (conf->link_speeds & ETH_LINK_SPEED_FIXED) {
                otx2_err("Setting link speed/duplex not supported");
-               goto fail;
+               goto fail_configure;
        }
 
        if (conf->dcb_capability_en == 1) {
                otx2_err("dcb enable is not supported");
-               goto fail;
+               goto fail_configure;
        }
 
        if (conf->fdir_conf.mode != RTE_FDIR_MODE_NONE) {
                otx2_err("Flow director is not supported");
-               goto fail;
+               goto fail_configure;
        }
 
        if (rxmode->mq_mode != ETH_MQ_RX_NONE &&
            rxmode->mq_mode != ETH_MQ_RX_RSS) {
                otx2_err("Unsupported mq rx mode %d", rxmode->mq_mode);
-               goto fail;
+               goto fail_configure;
        }
 
        if (txmode->mq_mode != ETH_MQ_TX_NONE) {
                otx2_err("Unsupported mq tx mode %d", txmode->mq_mode);
-               goto fail;
+               goto fail_configure;
+       }
+
+       if (otx2_dev_is_Ax(dev) &&
+           (txmode->offloads & DEV_TX_OFFLOAD_SCTP_CKSUM) &&
+           ((txmode->offloads & DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM) ||
+           (txmode->offloads & DEV_TX_OFFLOAD_OUTER_UDP_CKSUM))) {
+               otx2_err("Outer IP and SCTP checksum unsupported");
+               goto fail_configure;
        }
 
        /* Free the resources allocated from the previous configure */
@@ -1225,20 +1254,11 @@ otx2_nix_configure(struct rte_eth_dev *eth_dev)
                nix_set_nop_rxtx_function(eth_dev);
                rc = nix_store_queue_cfg_and_then_release(eth_dev);
                if (rc)
-                       goto fail;
+                       goto fail_configure;
                otx2_nix_tm_fini(eth_dev);
                nix_lf_free(dev);
        }
 
-       if (otx2_dev_is_Ax(dev) &&
-           (txmode->offloads & DEV_TX_OFFLOAD_SCTP_CKSUM) &&
-           ((txmode->offloads & DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM) ||
-           (txmode->offloads & DEV_TX_OFFLOAD_OUTER_UDP_CKSUM))) {
-               otx2_err("Outer IP and SCTP checksum unsupported");
-               rc = -EINVAL;
-               goto fail;
-       }
-
        dev->rx_offloads = rxmode->offloads;
        dev->tx_offloads = txmode->offloads;
        dev->rx_offload_flags |= nix_rx_offload_flags(eth_dev);
@@ -1252,7 +1272,7 @@ otx2_nix_configure(struct rte_eth_dev *eth_dev)
        rc = nix_lf_alloc(dev, nb_rxq, nb_txq);
        if (rc) {
                otx2_err("Failed to init nix_lf rc=%d", rc);
-               goto fail;
+               goto fail_offloads;
        }
 
        /* Configure RSS */
@@ -1272,14 +1292,14 @@ otx2_nix_configure(struct rte_eth_dev *eth_dev)
        rc = otx2_nix_vlan_offload_init(eth_dev);
        if (rc) {
                otx2_err("Failed to init vlan offload rc=%d", rc);
-               goto free_nix_lf;
+               goto tm_fini;
        }
 
        /* Register queue IRQs */
        rc = oxt2_nix_register_queue_irqs(eth_dev);
        if (rc) {
                otx2_err("Failed to register queue interrupts rc=%d", rc);
-               goto free_nix_lf;
+               goto vlan_fini;
        }
 
        /* Register cq IRQs */
@@ -1287,7 +1307,7 @@ otx2_nix_configure(struct rte_eth_dev *eth_dev)
                if (eth_dev->data->nb_rx_queues > dev->cints) {
                        otx2_err("Rx interrupt cannot be enabled, rxq > %d",
                                 dev->cints);
-                       goto free_nix_lf;
+                       goto q_irq_fini;
                }
                /* Rx interrupt feature cannot work with vector mode because,
                 * vector mode doesn't process packets unless min 4 pkts are
@@ -1299,7 +1319,7 @@ otx2_nix_configure(struct rte_eth_dev *eth_dev)
                rc = oxt2_nix_register_cq_irqs(eth_dev);
                if (rc) {
                        otx2_err("Failed to register CQ interrupts rc=%d", rc);
-                       goto free_nix_lf;
+                       goto q_irq_fini;
                }
        }
 
@@ -1307,25 +1327,15 @@ otx2_nix_configure(struct rte_eth_dev *eth_dev)
        rc = cgx_intlbk_enable(dev, eth_dev->data->dev_conf.lpbk_mode);
        if (rc) {
                otx2_err("Failed to configure cgx loop back mode rc=%d", rc);
-               goto free_nix_lf;
+               goto q_irq_fini;
        }
 
        rc = otx2_nix_rxchan_bpid_cfg(eth_dev, true);
        if (rc) {
                otx2_err("Failed to configure nix rx chan bpid cfg rc=%d", rc);
-               goto free_nix_lf;
+               goto q_irq_fini;
        }
 
-       /* Enable PTP if it was requested by the app or if it is already
-        * enabled in PF owning this VF
-        */
-       memset(&dev->tstamp, 0, sizeof(struct otx2_timesync_info));
-       if ((dev->rx_offloads & DEV_RX_OFFLOAD_TIMESTAMP) ||
-           otx2_ethdev_is_ptp_en(dev))
-               otx2_nix_timesync_enable(eth_dev);
-       else
-               otx2_nix_timesync_disable(eth_dev);
-
        /*
         * Restore queue config when reconfigure followed by
         * reconfigure and no queue configure invoked from application case.
@@ -1333,7 +1343,7 @@ otx2_nix_configure(struct rte_eth_dev *eth_dev)
        if (dev->configured == 1) {
                rc = nix_restore_queue_cfg(eth_dev);
                if (rc)
-                       goto free_nix_lf;
+                       goto cq_fini;
        }
 
        /* Update the mac address */
@@ -1357,9 +1367,21 @@ otx2_nix_configure(struct rte_eth_dev *eth_dev)
        dev->configured_nb_tx_qs = data->nb_tx_queues;
        return 0;
 
+cq_fini:
+       oxt2_nix_unregister_cq_irqs(eth_dev);
+q_irq_fini:
+       oxt2_nix_unregister_queue_irqs(eth_dev);
+vlan_fini:
+       otx2_nix_vlan_fini(eth_dev);
+tm_fini:
+       otx2_nix_tm_fini(eth_dev);
 free_nix_lf:
-       rc = nix_lf_free(dev);
-fail:
+       nix_lf_free(dev);
+fail_offloads:
+       dev->rx_offload_flags &= ~nix_rx_offload_flags(eth_dev);
+       dev->tx_offload_flags &= ~nix_tx_offload_flags(eth_dev);
+fail_configure:
+       dev->configured = 0;
        return rc;
 }
 
@@ -1522,6 +1544,16 @@ otx2_nix_dev_start(struct rte_eth_dev *eth_dev)
                return rc;
        }
 
+       /* Enable PTP if it was requested by the app or if it is already
+        * enabled in PF owning this VF
+        */
+       memset(&dev->tstamp, 0, sizeof(struct otx2_timesync_info));
+       if ((dev->rx_offloads & DEV_RX_OFFLOAD_TIMESTAMP) ||
+           otx2_ethdev_is_ptp_en(dev))
+               otx2_nix_timesync_enable(eth_dev);
+       else
+               otx2_nix_timesync_disable(eth_dev);
+
        rc = npc_rx_enable(dev);
        if (rc) {
                otx2_err("Failed to enable NPC rx %d", rc);
@@ -2001,7 +2033,7 @@ static const struct rte_pci_id pci_nix_map[] = {
 
 static struct rte_pci_driver pci_nix = {
        .id_table = pci_nix_map,
-       .drv_flags = RTE_PCI_DRV_NEED_MAPPING | RTE_PCI_DRV_IOVA_AS_VA |
+       .drv_flags = RTE_PCI_DRV_NEED_MAPPING | RTE_PCI_DRV_NEED_IOVA_AS_VA |
                        RTE_PCI_DRV_INTR_LSC,
        .probe = nix_probe,
        .remove = nix_remove,