|
@@ -1920,6 +1920,10 @@ static int efx_ef10_alloc_rss_context(struct efx_nic *efx, u32 *context,
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+ if (nic_data->datapath_caps &
|
|
|
+ 1 << MC_CMD_GET_CAPABILITIES_OUT_RX_RSS_LIMITED_LBN)
|
|
|
+ return -EOPNOTSUPP;
|
|
|
+
|
|
|
MCDI_SET_DWORD(inbuf, RSS_CONTEXT_ALLOC_IN_UPSTREAM_PORT_ID,
|
|
|
nic_data->vport_id);
|
|
|
MCDI_SET_DWORD(inbuf, RSS_CONTEXT_ALLOC_IN_TYPE, alloc_type);
|
|
@@ -2923,9 +2927,16 @@ static void efx_ef10_filter_push_prep(struct efx_nic *efx,
|
|
|
bool replacing)
|
|
|
{
|
|
|
struct efx_ef10_nic_data *nic_data = efx->nic_data;
|
|
|
+ u32 flags = spec->flags;
|
|
|
|
|
|
memset(inbuf, 0, MC_CMD_FILTER_OP_IN_LEN);
|
|
|
|
|
|
+ /* Remove RSS flag if we don't have an RSS context. */
|
|
|
+ if (flags & EFX_FILTER_FLAG_RX_RSS &&
|
|
|
+ spec->rss_context == EFX_FILTER_RSS_CONTEXT_DEFAULT &&
|
|
|
+ nic_data->rx_rss_context == EFX_EF10_RSS_CONTEXT_INVALID)
|
|
|
+ flags &= ~EFX_FILTER_FLAG_RX_RSS;
|
|
|
+
|
|
|
if (replacing) {
|
|
|
MCDI_SET_DWORD(inbuf, FILTER_OP_IN_OP,
|
|
|
MC_CMD_FILTER_OP_IN_OP_REPLACE);
|
|
@@ -2985,10 +2996,10 @@ static void efx_ef10_filter_push_prep(struct efx_nic *efx,
|
|
|
spec->dmaq_id == EFX_FILTER_RX_DMAQ_ID_DROP ?
|
|
|
0 : spec->dmaq_id);
|
|
|
MCDI_SET_DWORD(inbuf, FILTER_OP_IN_RX_MODE,
|
|
|
- (spec->flags & EFX_FILTER_FLAG_RX_RSS) ?
|
|
|
+ (flags & EFX_FILTER_FLAG_RX_RSS) ?
|
|
|
MC_CMD_FILTER_OP_IN_RX_MODE_RSS :
|
|
|
MC_CMD_FILTER_OP_IN_RX_MODE_SIMPLE);
|
|
|
- if (spec->flags & EFX_FILTER_FLAG_RX_RSS)
|
|
|
+ if (flags & EFX_FILTER_FLAG_RX_RSS)
|
|
|
MCDI_SET_DWORD(inbuf, FILTER_OP_IN_RX_CONTEXT,
|
|
|
spec->rss_context !=
|
|
|
EFX_FILTER_RSS_CONTEXT_DEFAULT ?
|