Skip to content

Commit

Permalink
net/sfc/base: enable chained multicast on all EF10 cards
Browse files Browse the repository at this point in the history
[ upstream commit 9b1d5e4 ]

Set WORKAROUND_BUG26807 which does the job.

Fix the misunderstanding in the Medford code: i.e. the workaround is
always supported by firmware, but the driver still needs to enable it.
Also, as it now applies to all EF10 controllers, the implementation is
moved to EF10 common place.

Fixes: 94190e3 ("net/sfc/base: import SFN8xxx family support")
Fixes: 2b38e7b ("net/sfc/base: add Medford2 support to NIC module")

Signed-off-by: Gautam Dawar <gdawar@solarflare.com>
Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
  • Loading branch information
Gautam Dawar authored and kevintraynor committed Jun 24, 2019
1 parent e3148f5 commit 177260d
Show file tree
Hide file tree
Showing 4 changed files with 58 additions and 46 deletions.
57 changes: 56 additions & 1 deletion drivers/net/sfc/base/ef10_nic.c
Original file line number Diff line number Diff line change
Expand Up @@ -1748,6 +1748,56 @@ ef10_external_port_mapping(
return (rc);
}

static __checkReturn efx_rc_t
ef10_set_workaround_bug26807(
__in efx_nic_t *enp)
{
efx_nic_cfg_t *encp = &(enp->en_nic_cfg);
uint32_t flags;
efx_rc_t rc;

/*
* If the bug26807 workaround is enabled, then firmware has enabled
* support for chained multicast filters. Firmware will reset (FLR)
* functions which have filters in the hardware filter table when the
* workaround is enabled/disabled.
*
* We must recheck if the workaround is enabled after inserting the
* first hardware filter, in case it has been changed since this check.
*/
rc = efx_mcdi_set_workaround(enp, MC_CMD_WORKAROUND_BUG26807,
B_TRUE, &flags);
if (rc == 0) {
encp->enc_bug26807_workaround = B_TRUE;
if (flags & (1 << MC_CMD_WORKAROUND_EXT_OUT_FLR_DONE_LBN)) {
/*
* Other functions had installed filters before the
* workaround was enabled, and they have been reset
* by firmware.
*/
EFSYS_PROBE(bug26807_workaround_flr_done);
/* FIXME: bump MC warm boot count ? */
}
} else if (rc == EACCES) {
/*
* Unprivileged functions cannot enable the workaround in older
* firmware.
*/
encp->enc_bug26807_workaround = B_FALSE;
} else if ((rc == ENOTSUP) || (rc == ENOENT)) {
encp->enc_bug26807_workaround = B_FALSE;
} else {
goto fail1;
}

return (0);

fail1:
EFSYS_PROBE1(fail1, efx_rc_t, rc);

return (rc);
}

static __checkReturn efx_rc_t
ef10_nic_board_cfg(
__in efx_nic_t *enp)
Expand Down Expand Up @@ -1906,13 +1956,18 @@ ef10_nic_board_cfg(
goto fail10;
encp->enc_privilege_mask = mask;

if ((rc = ef10_set_workaround_bug26807(enp)) != 0)
goto fail11;

/* Get remaining controller-specific board config */
if ((rc = enop->eno_board_cfg(enp)) != 0)
if (rc != EACCES)
goto fail11;
goto fail12;

return (0);

fail12:
EFSYS_PROBE(fail12);
fail11:
EFSYS_PROBE(fail11);
fail10:
Expand Down
41 changes: 2 additions & 39 deletions drivers/net/sfc/base/hunt_nic.c
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,6 @@ hunt_board_cfg(
{
efx_nic_cfg_t *encp = &(enp->en_nic_cfg);
efx_port_t *epp = &(enp->en_port);
uint32_t flags;
uint32_t sysclk, dpcpu_clk;
uint32_t bandwidth;
efx_rc_t rc;
Expand Down Expand Up @@ -130,43 +129,9 @@ hunt_board_cfg(
encp->enc_bug41750_workaround = B_TRUE;
}

/*
* If the bug26807 workaround is enabled, then firmware has enabled
* support for chained multicast filters. Firmware will reset (FLR)
* functions which have filters in the hardware filter table when the
* workaround is enabled/disabled.
*
* We must recheck if the workaround is enabled after inserting the
* first hardware filter, in case it has been changed since this check.
*/
rc = efx_mcdi_set_workaround(enp, MC_CMD_WORKAROUND_BUG26807,
B_TRUE, &flags);
if (rc == 0) {
encp->enc_bug26807_workaround = B_TRUE;
if (flags & (1 << MC_CMD_WORKAROUND_EXT_OUT_FLR_DONE_LBN)) {
/*
* Other functions had installed filters before the
* workaround was enabled, and they have been reset
* by firmware.
*/
EFSYS_PROBE(bug26807_workaround_flr_done);
/* FIXME: bump MC warm boot count ? */
}
} else if (rc == EACCES) {
/*
* Unprivileged functions cannot enable the workaround in older
* firmware.
*/
encp->enc_bug26807_workaround = B_FALSE;
} else if ((rc == ENOTSUP) || (rc == ENOENT)) {
encp->enc_bug26807_workaround = B_FALSE;
} else {
goto fail3;
}

/* Get clock frequencies (in MHz). */
if ((rc = efx_mcdi_get_clock(enp, &sysclk, &dpcpu_clk)) != 0)
goto fail4;
goto fail3;

/*
* The Huntington timer quantum is 1536 sysclk cycles, documented for
Expand Down Expand Up @@ -202,16 +167,14 @@ hunt_board_cfg(
encp->enc_piobuf_min_alloc_size = HUNT_MIN_PIO_ALLOC_SIZE;

if ((rc = hunt_nic_get_required_pcie_bandwidth(enp, &bandwidth)) != 0)
goto fail5;
goto fail4;
encp->enc_required_pcie_bandwidth_mbps = bandwidth;

/* All Huntington devices have a PCIe Gen3, 8 lane connector */
encp->enc_max_pcie_link_gen = EFX_PCIE_LINK_SPEED_GEN3;

return (0);

fail5:
EFSYS_PROBE(fail5);
fail4:
EFSYS_PROBE(fail4);
fail3:
Expand Down
3 changes: 0 additions & 3 deletions drivers/net/sfc/base/medford2_nic.c
Original file line number Diff line number Diff line change
Expand Up @@ -69,9 +69,6 @@ medford2_board_cfg(
encp->enc_bug41750_workaround = B_TRUE;
}

/* Chained multicast is always enabled on Medford2 */
encp->enc_bug26807_workaround = B_TRUE;

/*
* If the bug61265 workaround is enabled, then interrupt holdoff timers
* cannot be controlled by timer table writes, so MCDI must be used
Expand Down
3 changes: 0 additions & 3 deletions drivers/net/sfc/base/medford_nic.c
Original file line number Diff line number Diff line change
Expand Up @@ -67,9 +67,6 @@ medford_board_cfg(
encp->enc_bug41750_workaround = B_TRUE;
}

/* Chained multicast is always enabled on Medford */
encp->enc_bug26807_workaround = B_TRUE;

/*
* If the bug61265 workaround is enabled, then interrupt holdoff timers
* cannot be controlled by timer table writes, so MCDI must be used
Expand Down

0 comments on commit 177260d

Please sign in to comment.