]> git.droids-corp.org - dpdk.git/commitdiff
net/sfc: advertise offload capabilities by Rx datapaths
authorAndrew Rybchenko <arybchenko@solarflare.com>
Sat, 1 Jun 2019 08:42:43 +0000 (09:42 +0100)
committerFerruh Yigit <ferruh.yigit@intel.com>
Thu, 13 Jun 2019 14:54:29 +0000 (23:54 +0900)
Rx datapath feature bits were useful on migration from the old offload API
to the new one. However, right now it just adds indirection which
complicates code reading and understanding. Also addition of a new
offloads requires addition of a new feature bits and makes patches longer
and harder to understand. So, remove feature bits which correspond to Rx
offloads and simply advertise device and per-queue offloads directly.
Generic code could still mask some offloads if running HW or FW does not
support it.

Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Igor Romanov <igor.romanov@oktetlabs.ru>
Reviewed-by: Ivan Malov <ivan.malov@oktetlabs.ru>
drivers/net/sfc/sfc_dp_rx.h
drivers/net/sfc/sfc_ef10_essb_rx.c
drivers/net/sfc/sfc_ef10_rx.c
drivers/net/sfc/sfc_rx.c

index 042c014ee5b88bcbf4449b78a98e3c92f99861d1..a3743117c042e0b339a3f04f497b83162afe7735 100644 (file)
@@ -199,12 +199,19 @@ struct sfc_dp_rx {
        struct sfc_dp                           dp;
 
        unsigned int                            features;
-#define SFC_DP_RX_FEAT_SCATTER                 0x1
-#define SFC_DP_RX_FEAT_MULTI_PROCESS           0x2
-#define SFC_DP_RX_FEAT_TUNNELS                 0x4
-#define SFC_DP_RX_FEAT_FLOW_FLAG               0x8
-#define SFC_DP_RX_FEAT_FLOW_MARK               0x10
-#define SFC_DP_RX_FEAT_CHECKSUM                        0x20
+#define SFC_DP_RX_FEAT_MULTI_PROCESS           0x1
+#define SFC_DP_RX_FEAT_FLOW_FLAG               0x2
+#define SFC_DP_RX_FEAT_FLOW_MARK               0x4
+       /**
+        * Rx offload capabilities supported by the datapath on device
+        * level only if HW/FW supports it.
+        */
+       uint64_t                                dev_offload_capa;
+       /**
+        * Rx offload capabilities supported by the datapath per-queue
+        * if HW/FW supports it.
+        */
+       uint64_t                                queue_offload_capa;
        sfc_dp_rx_get_dev_info_t                *get_dev_info;
        sfc_dp_rx_pool_ops_supported_t          *pool_ops_supported;
        sfc_dp_rx_qsize_up_rings_t              *qsize_up_rings;
@@ -237,6 +244,12 @@ sfc_dp_find_rx_by_caps(struct sfc_dp_list *head, unsigned int avail_caps)
        return (p == NULL) ? NULL : container_of(p, struct sfc_dp_rx, dp);
 }
 
+static inline uint64_t
+sfc_dp_rx_offload_capa(const struct sfc_dp_rx *dp_rx)
+{
+       return dp_rx->dev_offload_capa | dp_rx->queue_offload_capa;
+}
+
 /** Get Rx datapath ops by the datapath RxQ handle */
 const struct sfc_dp_rx *sfc_dp_rx_by_dp_rxq(const struct sfc_dp_rxq *dp_rxq);
 
index ccb6aea743c41cf540205f86eb3d5848bb4b4dbd..63da807eaafba80f925dfd8d7692caf8cdb5a5b0 100644 (file)
@@ -714,8 +714,9 @@ struct sfc_dp_rx sfc_ef10_essb_rx = {
                                  SFC_DP_HW_FW_CAP_RX_ES_SUPER_BUFFER,
        },
        .features               = SFC_DP_RX_FEAT_FLOW_FLAG |
-                                 SFC_DP_RX_FEAT_FLOW_MARK |
-                                 SFC_DP_RX_FEAT_CHECKSUM,
+                                 SFC_DP_RX_FEAT_FLOW_MARK,
+       .dev_offload_capa       = DEV_RX_OFFLOAD_CHECKSUM,
+       .queue_offload_capa     = 0,
        .get_dev_info           = sfc_ef10_essb_rx_get_dev_info,
        .pool_ops_supported     = sfc_ef10_essb_rx_pool_ops_supported,
        .qsize_up_rings         = sfc_ef10_essb_rx_qsize_up_rings,
index 49e32faaf8e53edb8963728b8582e35a5d63041f..b294b43f15f829ac0ace680d2c7cd09f811d9078 100644 (file)
@@ -750,10 +750,10 @@ struct sfc_dp_rx sfc_ef10_rx = {
                .type           = SFC_DP_RX,
                .hw_fw_caps     = SFC_DP_HW_FW_CAP_EF10,
        },
-       .features               = SFC_DP_RX_FEAT_SCATTER |
-                                 SFC_DP_RX_FEAT_MULTI_PROCESS |
-                                 SFC_DP_RX_FEAT_TUNNELS |
-                                 SFC_DP_RX_FEAT_CHECKSUM,
+       .features               = SFC_DP_RX_FEAT_MULTI_PROCESS,
+       .dev_offload_capa       = DEV_RX_OFFLOAD_CHECKSUM |
+                                 DEV_RX_OFFLOAD_OUTER_IPV4_CKSUM,
+       .queue_offload_capa     = DEV_RX_OFFLOAD_SCATTER,
        .get_dev_info           = sfc_ef10_rx_get_dev_info,
        .qsize_up_rings         = sfc_ef10_rx_qsize_up_rings,
        .qcreate                = sfc_ef10_rx_qcreate,
index f2221119c01f2e89d5d70c1befc7dfb82ee77e89..70e761485a34d2e05cb8e6a0931aab58a7a000e4 100644 (file)
@@ -557,8 +557,9 @@ struct sfc_dp_rx sfc_efx_rx = {
                .type           = SFC_DP_RX,
                .hw_fw_caps     = 0,
        },
-       .features               = SFC_DP_RX_FEAT_SCATTER |
-                                 SFC_DP_RX_FEAT_CHECKSUM,
+       .features               = 0,
+       .dev_offload_capa       = DEV_RX_OFFLOAD_CHECKSUM,
+       .queue_offload_capa     = DEV_RX_OFFLOAD_SCATTER,
        .qsize_up_rings         = sfc_efx_rx_qsize_up_rings,
        .qcreate                = sfc_efx_rx_qcreate,
        .qdestroy               = sfc_efx_rx_qdestroy,
@@ -806,36 +807,32 @@ sfc_rx_qstop(struct sfc_adapter *sa, unsigned int sw_index)
        sfc_ev_qstop(rxq->evq);
 }
 
-uint64_t
-sfc_rx_get_dev_offload_caps(struct sfc_adapter *sa)
+static uint64_t
+sfc_rx_get_offload_mask(struct sfc_adapter *sa)
 {
        const efx_nic_cfg_t *encp = efx_nic_cfg_get(sa->nic);
-       uint64_t caps = 0;
+       uint64_t no_caps = 0;
 
-       caps |= DEV_RX_OFFLOAD_JUMBO_FRAME;
+       if (encp->enc_tunnel_encapsulations_supported == 0)
+               no_caps |= DEV_RX_OFFLOAD_OUTER_IPV4_CKSUM;
 
-       if (sa->priv.dp_rx->features & SFC_DP_RX_FEAT_CHECKSUM) {
-               caps |= DEV_RX_OFFLOAD_IPV4_CKSUM;
-               caps |= DEV_RX_OFFLOAD_UDP_CKSUM;
-               caps |= DEV_RX_OFFLOAD_TCP_CKSUM;
-       }
+       return ~no_caps;
+}
 
-       if (encp->enc_tunnel_encapsulations_supported &&
-           (sa->priv.dp_rx->features & SFC_DP_RX_FEAT_TUNNELS))
-               caps |= DEV_RX_OFFLOAD_OUTER_IPV4_CKSUM;
+uint64_t
+sfc_rx_get_dev_offload_caps(struct sfc_adapter *sa)
+{
+       uint64_t caps = sa->priv.dp_rx->dev_offload_capa;
+
+       caps |= DEV_RX_OFFLOAD_JUMBO_FRAME;
 
-       return caps;
+       return caps & sfc_rx_get_offload_mask(sa);
 }
 
 uint64_t
 sfc_rx_get_queue_offload_caps(struct sfc_adapter *sa)
 {
-       uint64_t caps = 0;
-
-       if (sa->priv.dp_rx->features & SFC_DP_RX_FEAT_SCATTER)
-               caps |= DEV_RX_OFFLOAD_SCATTER;
-
-       return caps;
+       return sa->priv.dp_rx->queue_offload_capa & sfc_rx_get_offload_mask(sa);
 }
 
 static int
@@ -1047,7 +1044,8 @@ sfc_rx_qinit(struct sfc_adapter *sa, unsigned int sw_index,
                EFX_RXQ_FLAG_SCATTER : EFX_RXQ_FLAG_NONE;
 
        if ((encp->enc_tunnel_encapsulations_supported != 0) &&
-           (sa->priv.dp_rx->features & SFC_DP_RX_FEAT_TUNNELS))
+           (sfc_dp_rx_offload_capa(sa->priv.dp_rx) &
+            DEV_RX_OFFLOAD_OUTER_IPV4_CKSUM) != 0)
                rxq_info->type_flags |= EFX_RXQ_FLAG_INNER_CLASSES;
 
        rc = sfc_ev_qinit(sa, SFC_EVQ_TYPE_RX, sw_index,