Author: arybchik
Date: Fri Nov 23 09:15:44 2018
New Revision: 340810
URL: https://svnweb.freebsd.org/changeset/base/340810

Log:
  sfxge(4): update RSS API to take RSS context parameter
  
  Update efx_rx_scale_mode_set(), efx_rx_scale_key_set()
  and efx_rx_scale_tbl_set().
  
  Submitted by:   Mark Spender <mspender at solarflare.com>
  Submitted by:   Ivan Malov <ivan.malov at oktetlabs.ru>
  Sponsored by:   Solarflare Communications, Inc.
  Differential Revision:  https://reviews.freebsd.org/D18080

Modified:
  head/sys/dev/sfxge/common/ef10_impl.h
  head/sys/dev/sfxge/common/ef10_rx.c
  head/sys/dev/sfxge/common/efx.h
  head/sys/dev/sfxge/common/efx_impl.h
  head/sys/dev/sfxge/common/efx_rx.c
  head/sys/dev/sfxge/sfxge_rx.c

Modified: head/sys/dev/sfxge/common/ef10_impl.h
==============================================================================
--- head/sys/dev/sfxge/common/ef10_impl.h       Fri Nov 23 09:15:32 2018        
(r340809)
+++ head/sys/dev/sfxge/common/ef10_impl.h       Fri Nov 23 09:15:44 2018        
(r340810)
@@ -914,6 +914,7 @@ ef10_rx_scale_context_free(
 extern __checkReturn   efx_rc_t
 ef10_rx_scale_mode_set(
        __in            efx_nic_t *enp,
+       __in            uint32_t rss_context,
        __in            efx_rx_hash_alg_t alg,
        __in            efx_rx_hash_type_t type,
        __in            boolean_t insert);
@@ -921,12 +922,14 @@ ef10_rx_scale_mode_set(
 extern __checkReturn   efx_rc_t
 ef10_rx_scale_key_set(
        __in            efx_nic_t *enp,
+       __in            uint32_t rss_context,
        __in_ecount(n)  uint8_t *key,
        __in            size_t n);
 
 extern __checkReturn   efx_rc_t
 ef10_rx_scale_tbl_set(
        __in            efx_nic_t *enp,
+       __in            uint32_t rss_context,
        __in_ecount(n)  unsigned int *table,
        __in            size_t n);
 

Modified: head/sys/dev/sfxge/common/ef10_rx.c
==============================================================================
--- head/sys/dev/sfxge/common/ef10_rx.c Fri Nov 23 09:15:32 2018        
(r340809)
+++ head/sys/dev/sfxge/common/ef10_rx.c Fri Nov 23 09:15:44 2018        
(r340810)
@@ -538,6 +538,7 @@ fail1:
        __checkReturn   efx_rc_t
 ef10_rx_scale_mode_set(
        __in            efx_nic_t *enp,
+       __in            uint32_t rss_context,
        __in            efx_rx_hash_alg_t alg,
        __in            efx_rx_hash_type_t type,
        __in            boolean_t insert)
@@ -552,13 +553,16 @@ ef10_rx_scale_mode_set(
                goto fail1;
        }
 
-       if (enp->en_rss_context_type == EFX_RX_SCALE_UNAVAILABLE) {
-               rc = ENOTSUP;
-               goto fail2;
+       if (rss_context == EFX_RSS_CONTEXT_DEFAULT) {
+               if (enp->en_rss_context_type == EFX_RX_SCALE_UNAVAILABLE) {
+                       rc = ENOTSUP;
+                       goto fail2;
+               }
+               rss_context = enp->en_rss_context;
        }
 
        if ((rc = efx_mcdi_rss_context_set_flags(enp,
-                   enp->en_rss_context, type)) != 0)
+                   rss_context, type)) != 0)
                goto fail3;
 
        return (0);
@@ -578,18 +582,21 @@ fail1:
        __checkReturn   efx_rc_t
 ef10_rx_scale_key_set(
        __in            efx_nic_t *enp,
+       __in            uint32_t rss_context,
        __in_ecount(n)  uint8_t *key,
        __in            size_t n)
 {
        efx_rc_t rc;
 
-       if (enp->en_rss_context_type == EFX_RX_SCALE_UNAVAILABLE) {
-               rc = ENOTSUP;
-               goto fail1;
+       if (rss_context == EFX_RSS_CONTEXT_DEFAULT) {
+               if (enp->en_rss_context_type == EFX_RX_SCALE_UNAVAILABLE) {
+                       rc = ENOTSUP;
+                       goto fail1;
+               }
+               rss_context = enp->en_rss_context;
        }
 
-       if ((rc = efx_mcdi_rss_context_set_key(enp,
-           enp->en_rss_context, key, n)) != 0)
+       if ((rc = efx_mcdi_rss_context_set_key(enp, rss_context, key, n)) != 0)
                goto fail2;
 
        return (0);
@@ -607,18 +614,23 @@ fail1:
        __checkReturn   efx_rc_t
 ef10_rx_scale_tbl_set(
        __in            efx_nic_t *enp,
+       __in            uint32_t rss_context,
        __in_ecount(n)  unsigned int *table,
        __in            size_t n)
 {
        efx_rc_t rc;
 
-       if (enp->en_rss_context_type == EFX_RX_SCALE_UNAVAILABLE) {
-               rc = ENOTSUP;
-               goto fail1;
+
+       if (rss_context == EFX_RSS_CONTEXT_DEFAULT) {
+               if (enp->en_rss_context_type == EFX_RX_SCALE_UNAVAILABLE) {
+                       rc = ENOTSUP;
+                       goto fail1;
+               }
+               rss_context = enp->en_rss_context;
        }
 
        if ((rc = efx_mcdi_rss_context_set_table(enp,
-           enp->en_rss_context, table, n)) != 0)
+                   rss_context, table, n)) != 0)
                goto fail2;
 
        return (0);

Modified: head/sys/dev/sfxge/common/efx.h
==============================================================================
--- head/sys/dev/sfxge/common/efx.h     Fri Nov 23 09:15:32 2018        
(r340809)
+++ head/sys/dev/sfxge/common/efx.h     Fri Nov 23 09:15:44 2018        
(r340810)
@@ -1948,6 +1948,7 @@ efx_rx_scale_context_free(
 extern __checkReturn   efx_rc_t
 efx_rx_scale_mode_set(
        __in    efx_nic_t *enp,
+       __in    uint32_t rss_context,
        __in    efx_rx_hash_alg_t alg,
        __in    efx_rx_hash_type_t type,
        __in    boolean_t insert);
@@ -1955,12 +1956,14 @@ efx_rx_scale_mode_set(
 extern __checkReturn   efx_rc_t
 efx_rx_scale_tbl_set(
        __in            efx_nic_t *enp,
+       __in            uint32_t rss_context,
        __in_ecount(n)  unsigned int *table,
        __in            size_t n);
 
 extern __checkReturn   efx_rc_t
 efx_rx_scale_key_set(
        __in            efx_nic_t *enp,
+       __in            uint32_t rss_context,
        __in_ecount(n)  uint8_t *key,
        __in            size_t n);
 

Modified: head/sys/dev/sfxge/common/efx_impl.h
==============================================================================
--- head/sys/dev/sfxge/common/efx_impl.h        Fri Nov 23 09:15:32 2018        
(r340809)
+++ head/sys/dev/sfxge/common/efx_impl.h        Fri Nov 23 09:15:44 2018        
(r340810)
@@ -160,11 +160,13 @@ typedef struct efx_rx_ops_s {
                                                    efx_rx_scale_context_type_t,
                                                    uint32_t, uint32_t *);
        efx_rc_t        (*erxo_scale_context_free)(efx_nic_t *, uint32_t);
-       efx_rc_t        (*erxo_scale_mode_set)(efx_nic_t *, efx_rx_hash_alg_t,
+       efx_rc_t        (*erxo_scale_mode_set)(efx_nic_t *, uint32_t,
+                                              efx_rx_hash_alg_t,
                                               efx_rx_hash_type_t, boolean_t);
-       efx_rc_t        (*erxo_scale_key_set)(efx_nic_t *, uint8_t *, size_t);
-       efx_rc_t        (*erxo_scale_tbl_set)(efx_nic_t *, unsigned int *,
-                                             size_t);
+       efx_rc_t        (*erxo_scale_key_set)(efx_nic_t *, uint32_t,
+                                             uint8_t *, size_t);
+       efx_rc_t        (*erxo_scale_tbl_set)(efx_nic_t *, uint32_t,
+                                             unsigned int *, size_t);
        uint32_t        (*erxo_prefix_hash)(efx_nic_t *, efx_rx_hash_alg_t,
                                            uint8_t *);
 #endif /* EFSYS_OPT_RX_SCALE */

Modified: head/sys/dev/sfxge/common/efx_rx.c
==============================================================================
--- head/sys/dev/sfxge/common/efx_rx.c  Fri Nov 23 09:15:32 2018        
(r340809)
+++ head/sys/dev/sfxge/common/efx_rx.c  Fri Nov 23 09:15:44 2018        
(r340810)
@@ -58,6 +58,7 @@ siena_rx_scatter_enable(
 static __checkReturn   efx_rc_t
 siena_rx_scale_mode_set(
        __in            efx_nic_t *enp,
+       __in            uint32_t rss_context,
        __in            efx_rx_hash_alg_t alg,
        __in            efx_rx_hash_type_t type,
        __in            boolean_t insert);
@@ -65,12 +66,14 @@ siena_rx_scale_mode_set(
 static __checkReturn   efx_rc_t
 siena_rx_scale_key_set(
        __in            efx_nic_t *enp,
+       __in            uint32_t rss_context,
        __in_ecount(n)  uint8_t *key,
        __in            size_t n);
 
 static __checkReturn   efx_rc_t
 siena_rx_scale_tbl_set(
        __in            efx_nic_t *enp,
+       __in            uint32_t rss_context,
        __in_ecount(n)  unsigned int *table,
        __in            size_t n);
 
@@ -437,6 +440,7 @@ fail1:
        __checkReturn   efx_rc_t
 efx_rx_scale_mode_set(
        __in            efx_nic_t *enp,
+       __in            uint32_t rss_context,
        __in            efx_rx_hash_alg_t alg,
        __in            efx_rx_hash_type_t type,
        __in            boolean_t insert)
@@ -448,7 +452,7 @@ efx_rx_scale_mode_set(
        EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_RX);
 
        if (erxop->erxo_scale_mode_set != NULL) {
-               if ((rc = erxop->erxo_scale_mode_set(enp, alg,
+               if ((rc = erxop->erxo_scale_mode_set(enp, rss_context, alg,
                            type, insert)) != 0)
                        goto fail1;
        }
@@ -465,6 +469,7 @@ fail1:
        __checkReturn   efx_rc_t
 efx_rx_scale_key_set(
        __in            efx_nic_t *enp,
+       __in            uint32_t rss_context,
        __in_ecount(n)  uint8_t *key,
        __in            size_t n)
 {
@@ -474,7 +479,7 @@ efx_rx_scale_key_set(
        EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
        EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_RX);
 
-       if ((rc = erxop->erxo_scale_key_set(enp, key, n)) != 0)
+       if ((rc = erxop->erxo_scale_key_set(enp, rss_context, key, n)) != 0)
                goto fail1;
 
        return (0);
@@ -490,6 +495,7 @@ fail1:
        __checkReturn   efx_rc_t
 efx_rx_scale_tbl_set(
        __in            efx_nic_t *enp,
+       __in            uint32_t rss_context,
        __in_ecount(n)  unsigned int *table,
        __in            size_t n)
 {
@@ -499,7 +505,7 @@ efx_rx_scale_tbl_set(
        EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
        EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_RX);
 
-       if ((rc = erxop->erxo_scale_tbl_set(enp, table, n)) != 0)
+       if ((rc = erxop->erxo_scale_tbl_set(enp, rss_context, table, n)) != 0)
                goto fail1;
 
        return (0);
@@ -852,12 +858,18 @@ fail1:
 static __checkReturn   efx_rc_t
 siena_rx_scale_mode_set(
        __in            efx_nic_t *enp,
+       __in            uint32_t rss_context,
        __in            efx_rx_hash_alg_t alg,
        __in            efx_rx_hash_type_t type,
        __in            boolean_t insert)
 {
        efx_rc_t rc;
 
+       if (rss_context != EFX_RSS_CONTEXT_DEFAULT) {
+               rc = EINVAL;
+               goto fail1;
+       }
+
        switch (alg) {
        case EFX_RX_HASHALG_LFSR:
                EFX_RX_LFSR_HASH(enp, insert);
@@ -873,17 +885,19 @@ siena_rx_scale_mode_set(
                    type & EFX_RX_HASH_TCPIPV6,
                    rc);
                if (rc != 0)
-                       goto fail1;
+                       goto fail2;
 
                break;
 
        default:
                rc = EINVAL;
-               goto fail2;
+               goto fail3;
        }
 
        return (0);
 
+fail3:
+       EFSYS_PROBE(fail3);
 fail2:
        EFSYS_PROBE(fail2);
 fail1:
@@ -899,6 +913,7 @@ fail1:
 static __checkReturn   efx_rc_t
 siena_rx_scale_key_set(
        __in            efx_nic_t *enp,
+       __in            uint32_t rss_context,
        __in_ecount(n)  uint8_t *key,
        __in            size_t n)
 {
@@ -907,6 +922,11 @@ siena_rx_scale_key_set(
        unsigned int offset;
        efx_rc_t rc;
 
+       if (rss_context != EFX_RSS_CONTEXT_DEFAULT) {
+               rc = EINVAL;
+               goto fail1;
+       }
+
        byte = 0;
 
        /* Write Toeplitz IPv4 hash key */
@@ -927,7 +947,7 @@ siena_rx_scale_key_set(
            --offset) {
                if (oword.eo_u8[offset - 1] != key[byte++]) {
                        rc = EFAULT;
-                       goto fail1;
+                       goto fail2;
                }
        }
 
@@ -976,7 +996,7 @@ siena_rx_scale_key_set(
            --offset) {
                if (oword.eo_u8[offset - 1] != key[byte++]) {
                        rc = EFAULT;
-                       goto fail2;
+                       goto fail3;
                }
        }
 
@@ -988,7 +1008,7 @@ siena_rx_scale_key_set(
            --offset) {
                if (oword.eo_u8[offset - 1] != key[byte++]) {
                        rc = EFAULT;
-                       goto fail3;
+                       goto fail4;
                }
        }
 
@@ -1000,13 +1020,15 @@ siena_rx_scale_key_set(
            --offset) {
                if (oword.eo_u8[offset - 1] != key[byte++]) {
                        rc = EFAULT;
-                       goto fail4;
+                       goto fail5;
                }
        }
 
 done:
        return (0);
 
+fail5:
+       EFSYS_PROBE(fail5);
 fail4:
        EFSYS_PROBE(fail4);
 fail3:
@@ -1024,6 +1046,7 @@ fail1:
 static __checkReturn   efx_rc_t
 siena_rx_scale_tbl_set(
        __in            efx_nic_t *enp,
+       __in            uint32_t rss_context,
        __in_ecount(n)  unsigned int *table,
        __in            size_t n)
 {
@@ -1034,11 +1057,16 @@ siena_rx_scale_tbl_set(
        EFX_STATIC_ASSERT(EFX_RSS_TBL_SIZE == FR_BZ_RX_INDIRECTION_TBL_ROWS);
        EFX_STATIC_ASSERT(EFX_MAXRSS == (1 << FRF_BZ_IT_QUEUE_WIDTH));
 
-       if (n > FR_BZ_RX_INDIRECTION_TBL_ROWS) {
+       if (rss_context != EFX_RSS_CONTEXT_DEFAULT) {
                rc = EINVAL;
                goto fail1;
        }
 
+       if (n > FR_BZ_RX_INDIRECTION_TBL_ROWS) {
+               rc = EINVAL;
+               goto fail2;
+       }
+
        for (index = 0; index < FR_BZ_RX_INDIRECTION_TBL_ROWS; index++) {
                uint32_t byte;
 
@@ -1067,12 +1095,14 @@ siena_rx_scale_tbl_set(
                /* Verify the entry */
                if (EFX_OWORD_FIELD(oword, FRF_BZ_IT_QUEUE) != byte) {
                        rc = EFAULT;
-                       goto fail2;
+                       goto fail3;
                }
        }
 
        return (0);
 
+fail3:
+       EFSYS_PROBE(fail3);
 fail2:
        EFSYS_PROBE(fail2);
 fail1:

Modified: head/sys/dev/sfxge/sfxge_rx.c
==============================================================================
--- head/sys/dev/sfxge/sfxge_rx.c       Fri Nov 23 09:15:32 2018        
(r340809)
+++ head/sys/dev/sfxge/sfxge_rx.c       Fri Nov 23 09:15:44 2018        
(r340810)
@@ -1138,17 +1138,20 @@ sfxge_rx_start(struct sfxge_softc *sc)
 #else
                sc->rx_indir_table[index] = index % sc->rxq_count;
 #endif
-       if ((rc = efx_rx_scale_tbl_set(sc->enp, sc->rx_indir_table,
+       if ((rc = efx_rx_scale_tbl_set(sc->enp, EFX_RSS_CONTEXT_DEFAULT,
+                                      sc->rx_indir_table,
                                       nitems(sc->rx_indir_table))) != 0)
                goto fail;
-       (void)efx_rx_scale_mode_set(sc->enp, EFX_RX_HASHALG_TOEPLITZ,
+       (void)efx_rx_scale_mode_set(sc->enp, EFX_RSS_CONTEXT_DEFAULT,
+           EFX_RX_HASHALG_TOEPLITZ,
            EFX_RX_HASH_IPV4 | EFX_RX_HASH_TCPIPV4 |
            EFX_RX_HASH_IPV6 | EFX_RX_HASH_TCPIPV6, B_TRUE);
 
 #ifdef RSS
        rss_getkey(toep_key);
 #endif
-       if ((rc = efx_rx_scale_key_set(sc->enp, toep_key,
+       if ((rc = efx_rx_scale_key_set(sc->enp, EFX_RSS_CONTEXT_DEFAULT,
+                                      toep_key,
                                       sizeof(toep_key))) != 0)
                goto fail;
 
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to