net/sfc: support MAC address edits in transfer flows
[dpdk.git] / drivers / net / sfc / sfc.c
index 152234c..ed714fe 100644 (file)
@@ -25,6 +25,8 @@
 #include "sfc_kvargs.h"
 #include "sfc_tweak.h"
 #include "sfc_sw_stats.h"
+#include "sfc_switch.h"
+#include "sfc_nic_dma.h"
 
 bool
 sfc_repr_supported(const struct sfc_adapter *sa)
@@ -52,10 +54,12 @@ sfc_repr_available(const struct sfc_adapter_shared *sas)
 }
 
 int
-sfc_dma_alloc(const struct sfc_adapter *sa, const char *name, uint16_t id,
-             size_t len, int socket_id, efsys_mem_t *esmp)
+sfc_dma_alloc(struct sfc_adapter *sa, const char *name, uint16_t id,
+             efx_nic_dma_addr_type_t addr_type, size_t len, int socket_id,
+             efsys_mem_t *esmp)
 {
        const struct rte_memzone *mz;
+       int rc;
 
        sfc_log_init(sa, "name=%s id=%u len=%zu socket_id=%d",
                     name, id, len, socket_id);
@@ -68,13 +72,17 @@ sfc_dma_alloc(const struct sfc_adapter *sa, const char *name, uint16_t id,
                        rte_strerror(rte_errno));
                return ENOMEM;
        }
-
-       esmp->esm_addr = mz->iova;
-       if (esmp->esm_addr == RTE_BAD_IOVA) {
+       if (mz->iova == RTE_BAD_IOVA) {
                (void)rte_memzone_free(mz);
                return EFAULT;
        }
 
+       rc = sfc_nic_dma_mz_map(sa, mz, addr_type, &esmp->esm_addr);
+       if (rc != 0) {
+               (void)rte_memzone_free(mz);
+               return rc;
+       }
+
        esmp->esm_mz = mz;
        esmp->esm_base = mz->addr;
 
@@ -105,13 +113,13 @@ sfc_phy_cap_from_link_speeds(uint32_t speeds)
 {
        uint32_t phy_caps = 0;
 
-       if (~speeds & ETH_LINK_SPEED_FIXED) {
+       if (~speeds & RTE_ETH_LINK_SPEED_FIXED) {
                phy_caps |= (1 << EFX_PHY_CAP_AN);
                /*
                 * If no speeds are specified in the mask, any supported
                 * may be negotiated
                 */
-               if (speeds == ETH_LINK_SPEED_AUTONEG)
+               if (speeds == RTE_ETH_LINK_SPEED_AUTONEG)
                        phy_caps |=
                                (1 << EFX_PHY_CAP_1000FDX) |
                                (1 << EFX_PHY_CAP_10000FDX) |
@@ -120,17 +128,17 @@ sfc_phy_cap_from_link_speeds(uint32_t speeds)
                                (1 << EFX_PHY_CAP_50000FDX) |
                                (1 << EFX_PHY_CAP_100000FDX);
        }
-       if (speeds & ETH_LINK_SPEED_1G)
+       if (speeds & RTE_ETH_LINK_SPEED_1G)
                phy_caps |= (1 << EFX_PHY_CAP_1000FDX);
-       if (speeds & ETH_LINK_SPEED_10G)
+       if (speeds & RTE_ETH_LINK_SPEED_10G)
                phy_caps |= (1 << EFX_PHY_CAP_10000FDX);
-       if (speeds & ETH_LINK_SPEED_25G)
+       if (speeds & RTE_ETH_LINK_SPEED_25G)
                phy_caps |= (1 << EFX_PHY_CAP_25000FDX);
-       if (speeds & ETH_LINK_SPEED_40G)
+       if (speeds & RTE_ETH_LINK_SPEED_40G)
                phy_caps |= (1 << EFX_PHY_CAP_40000FDX);
-       if (speeds & ETH_LINK_SPEED_50G)
+       if (speeds & RTE_ETH_LINK_SPEED_50G)
                phy_caps |= (1 << EFX_PHY_CAP_50000FDX);
-       if (speeds & ETH_LINK_SPEED_100G)
+       if (speeds & RTE_ETH_LINK_SPEED_100G)
                phy_caps |= (1 << EFX_PHY_CAP_100000FDX);
 
        return phy_caps;
@@ -400,10 +408,10 @@ sfc_set_fw_subvariant(struct sfc_adapter *sa)
                        tx_offloads |= txq_info->offloads;
        }
 
-       if (tx_offloads & (DEV_TX_OFFLOAD_IPV4_CKSUM |
-                          DEV_TX_OFFLOAD_TCP_CKSUM |
-                          DEV_TX_OFFLOAD_UDP_CKSUM |
-                          DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM))
+       if (tx_offloads & (RTE_ETH_TX_OFFLOAD_IPV4_CKSUM |
+                          RTE_ETH_TX_OFFLOAD_TCP_CKSUM |
+                          RTE_ETH_TX_OFFLOAD_UDP_CKSUM |
+                          RTE_ETH_TX_OFFLOAD_OUTER_IPV4_CKSUM))
                req_fw_subvariant = EFX_NIC_FW_SUBVARIANT_DEFAULT;
        else
                req_fw_subvariant = EFX_NIC_FW_SUBVARIANT_NO_TX_CSUM;
@@ -456,6 +464,13 @@ sfc_try_start(struct sfc_adapter *sa)
        if (rc != 0)
                goto fail_nic_init;
 
+       sfc_log_init(sa, "reconfigure NIC DMA");
+       rc = efx_nic_dma_reconfigure(sa->nic);
+       if (rc != 0) {
+               sfc_err(sa, "cannot reconfigure NIC DMA: %s", rte_strerror(rc));
+               goto fail_nic_dma_reconfigure;
+       }
+
        encp = efx_nic_cfg_get(sa->nic);
 
        /*
@@ -524,6 +539,7 @@ fail_ev_start:
 
 fail_intr_start:
 fail_tunnel_reconfigure:
+fail_nic_dma_reconfigure:
        efx_nic_fini(sa->nic);
 
 fail_nic_init:
@@ -898,7 +914,7 @@ sfc_attach(struct sfc_adapter *sa)
        sa->priv.shared->tunnel_encaps =
                encp->enc_tunnel_encapsulations_supported;
 
-       if (sfc_dp_tx_offload_capa(sa->priv.dp_tx) & DEV_TX_OFFLOAD_TCP_TSO) {
+       if (sfc_dp_tx_offload_capa(sa->priv.dp_tx) & RTE_ETH_TX_OFFLOAD_TCP_TSO) {
                sa->tso = encp->enc_fw_assisted_tso_v2_enabled ||
                          encp->enc_tso_v3_enabled;
                if (!sa->tso)
@@ -907,8 +923,8 @@ sfc_attach(struct sfc_adapter *sa)
 
        if (sa->tso &&
            (sfc_dp_tx_offload_capa(sa->priv.dp_tx) &
-            (DEV_TX_OFFLOAD_VXLAN_TNL_TSO |
-             DEV_TX_OFFLOAD_GENEVE_TNL_TSO)) != 0) {
+            (RTE_ETH_TX_OFFLOAD_VXLAN_TNL_TSO |
+             RTE_ETH_TX_OFFLOAD_GENEVE_TNL_TSO)) != 0) {
                sa->tso_encap = encp->enc_fw_assisted_tso_v2_encap_enabled ||
                                encp->enc_tso_v3_enabled;
                if (!sa->tso_encap)
@@ -1043,6 +1059,18 @@ fail_nic_reset:
        return rc;
 }
 
+void
+sfc_pre_detach(struct sfc_adapter *sa)
+{
+       sfc_log_init(sa, "entry");
+
+       SFC_ASSERT(!sfc_adapter_is_locked(sa));
+
+       sfc_repr_proxy_pre_detach(sa);
+
+       sfc_log_init(sa, "done");
+}
+
 void
 sfc_detach(struct sfc_adapter *sa)
 {
@@ -1317,6 +1345,9 @@ sfc_unprobe(struct sfc_adapter *sa)
         */
        rte_eal_alarm_cancel(sfc_restart_if_required, sa);
 
+       sfc_mae_clear_switch_port(sa->mae.switch_domain_id,
+                                 sa->mae.switch_port_id);
+
        sfc_log_init(sa, "destroy nic");
        sa->nic = NULL;
        efx_nic_destroy(enp);