mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-29 05:55:02 +08:00
sfc: disable RSS when unsupported
When certain firmware variants are selected (via the sfboot utility) the SFC7000 and SFC8000 series NICs don't support RSS. The driver still tries (and fails) to insert filters with the RSS flag, and the NIC fails to pass traffic. When the firmware reports RSS_LIMITED suppress allocating a default RSS context. The absence of an RSS context is picked up in filter insertion and RSS flags are discarded. Signed-off-by: Bert Kenward <bkenward@solarflare.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
4be2b49e28
commit
dcb4123cbe
@ -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 ?
|
||||
|
Loading…
Reference in New Issue
Block a user