net/sfc/base: add API to set an RSS context for a filter
authorMark Spender <mspender@solarflare.com>
Wed, 30 Aug 2017 18:17:38 +0000 (19:17 +0100)
committerFerruh Yigit <ferruh.yigit@intel.com>
Fri, 6 Oct 2017 00:49:47 +0000 (02:49 +0200)
Signed-off-by: Mark Spender <mspender@solarflare.com>
Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
Reviewed-by: Andrew Lee <alee@solarflare.com>
Reviewed-by: Andy Moreton <amoreton@solarflare.com>
drivers/net/sfc/base/ef10_filter.c
drivers/net/sfc/base/efx.h
drivers/net/sfc/base/efx_filter.c

index 068882e..e1faf1d 100644 (file)
@@ -226,10 +226,20 @@ efx_mcdi_filter_op_add(
            MC_CMD_FILTER_OP_EXT_IN_RX_DEST_HOST);
        MCDI_IN_SET_DWORD(req, FILTER_OP_EXT_IN_RX_QUEUE,
            spec->efs_dmaq_id);
+
+#if EFSYS_OPT_RX_SCALE
        if (spec->efs_flags & EFX_FILTER_FLAG_RX_RSS) {
+               uint32_t rss_context;
+
+               if (spec->efs_rss_context == EFX_RSS_CONTEXT_DEFAULT)
+                       rss_context = enp->en_rss_context;
+               else
+                       rss_context = spec->efs_rss_context;
                MCDI_IN_SET_DWORD(req, FILTER_OP_EXT_IN_RX_CONTEXT,
-                   spec->efs_rss_context);
+                   rss_context);
        }
+#endif
+
        MCDI_IN_SET_DWORD(req, FILTER_OP_EXT_IN_RX_MODE,
            spec->efs_flags & EFX_FILTER_FLAG_RX_RSS ?
            MC_CMD_FILTER_OP_EXT_IN_RX_MODE_RSS :
@@ -586,10 +596,6 @@ ef10_filter_add_internal(
        EFSYS_ASSERT(enp->en_family == EFX_FAMILY_HUNTINGTON ||
                    enp->en_family == EFX_FAMILY_MEDFORD);
 
-#if EFSYS_OPT_RX_SCALE
-       spec->efs_rss_context = enp->en_rss_context;
-#endif
-
        hash = ef10_filter_hash(spec);
 
        /*
index fa0e590..37c9bc4 100644 (file)
@@ -2419,7 +2419,12 @@ efx_filter_spec_set_encap_type(
        __in            efx_tunnel_protocol_t encap_type,
        __in            efx_filter_inner_frame_match_t inner_frame_match);
 
-
+#if EFSYS_OPT_RX_SCALE
+extern __checkReturn   efx_rc_t
+efx_filter_spec_set_rss_context(
+       __inout         efx_filter_spec_t *spec,
+       __in            uint32_t rss_context);
+#endif
 #endif /* EFSYS_OPT_FILTER */
 
 /* HASH */
index 34df111..5cab7d8 100644 (file)
@@ -117,10 +117,6 @@ efx_filter_remove(
        EFSYS_ASSERT3P(spec, !=, NULL);
        EFSYS_ASSERT3U(spec->efs_flags, &, EFX_FILTER_FLAG_RX);
 
-#if EFSYS_OPT_RX_SCALE
-       spec->efs_rss_context = enp->en_rss_context;
-#endif
-
        return (efop->efo_delete(enp, spec));
 }
 
@@ -490,7 +486,32 @@ fail1:
        return (rc);
 }
 
+#if EFSYS_OPT_RX_SCALE
+       __checkReturn   efx_rc_t
+efx_filter_spec_set_rss_context(
+       __inout         efx_filter_spec_t *spec,
+       __in            uint32_t rss_context)
+{
+       efx_rc_t rc;
+
+       EFSYS_ASSERT3P(spec, !=, NULL);
 
+       /* The filter must have been created with EFX_FILTER_FLAG_RX_RSS. */
+       if ((spec->efs_flags & EFX_FILTER_FLAG_RX_RSS) == 0) {
+               rc = EINVAL;
+               goto fail1;
+       }
+
+       spec->efs_rss_context = rss_context;
+
+       return (0);
+
+fail1:
+       EFSYS_PROBE1(fail1, efx_rc_t, rc);
+
+       return (rc);
+}
+#endif
 
 #if EFSYS_OPT_SIENA