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
This commit is contained in:
parent
e6d55a0b58
commit
82af879c05
@ -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);
|
||||
|
||||
|
@ -538,6 +538,7 @@ ef10_rx_scale_context_free(
|
||||
__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 @@ ef10_rx_scale_mode_set(
|
||||
__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 @@ ef10_rx_scale_key_set(
|
||||
__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);
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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 */
|
||||
|
@ -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 @@ efx_rx_scale_context_free(
|
||||
__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 @@ efx_rx_scale_mode_set(
|
||||
__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 @@ efx_rx_scale_key_set(
|
||||
__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 @@ 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)
|
||||
{
|
||||
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 @@ 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)
|
||||
{
|
||||
@ -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 @@ siena_rx_scale_key_set(
|
||||
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:
|
||||
|
@ -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;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user