sfxge: add Florence R7 turbo mode support to common code

Submitted by:   Andrew Lee <alee at solarflare.com>
Sponsored by:   Solarflare Communications, Inc.
Approved by:    gnn (mentor)
This commit is contained in:
Andrew Rybchenko 2015-02-20 07:57:59 +00:00
parent 9013400b1c
commit 8bf93a0428
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=279048
4 changed files with 38 additions and 17 deletions

View File

@ -861,6 +861,7 @@ efx_phy_bist_stop(
#define EFX_FEATURE_MCDI 0x00000020
#define EFX_FEATURE_LOOKAHEAD_SPLIT 0x00000040
#define EFX_FEATURE_MAC_HEADER_FILTERS 0x00000080
#define EFX_FEATURE_TURBO 0x00000100
typedef struct efx_nic_cfg_s {
uint32_t enc_board_type;
@ -881,6 +882,7 @@ typedef struct efx_nic_cfg_s {
uint32_t enc_rxq_limit;
uint32_t enc_buftbl_limit;
uint32_t enc_evq_moderation_max;
uint32_t enc_clk_mult;
#if EFSYS_OPT_LOOPBACK
uint32_t enc_loopback_types[EFX_LINK_NMODES];
#endif /* EFSYS_OPT_LOOPBACK */

View File

@ -844,13 +844,14 @@ efx_ev_qmoderate(
__in unsigned int us)
{
efx_nic_t *enp = eep->ee_enp;
efx_nic_cfg_t *encp = &(enp->en_nic_cfg);
unsigned int locked;
efx_dword_t dword;
int rc;
EFSYS_ASSERT3U(eep->ee_magic, ==, EFX_EVQ_MAGIC);
if (us > enp->en_nic_cfg.enc_evq_moderation_max) {
if (us > encp->enc_evq_moderation_max) {
rc = EINVAL;
goto fail1;
}
@ -869,21 +870,20 @@ efx_ev_qmoderate(
uint32_t timer_val;
/* Calculate the timer value in quanta */
us -= (us % EFX_EV_TIMER_QUANTUM);
if (us < EFX_EV_TIMER_QUANTUM)
us = EFX_EV_TIMER_QUANTUM;
timer_val = us / EFX_EV_TIMER_QUANTUM;
timer_val = us * encp->enc_clk_mult / EFX_EV_TIMER_QUANTUM;
/* Moderation value is base 0 so we need to deduct 1 */
if (timer_val > 0)
timer_val--;
if (enp->en_family == EFX_FAMILY_FALCON)
EFX_POPULATE_DWORD_2(dword,
FRF_AB_TC_TIMER_MODE, FFE_AB_TIMER_MODE_INT_HLDOFF,
FRF_AB_TIMER_VAL, timer_val - 1);
FRF_AB_TIMER_VAL, timer_val);
else
EFX_POPULATE_DWORD_2(dword,
FRF_CZ_TC_TIMER_MODE, FFE_CZ_TIMER_MODE_INT_HLDOFF,
FRF_CZ_TC_TIMER_VAL, timer_val - 1);
FRF_CZ_TC_TIMER_VAL, timer_val);
}
locked = (eep->ee_index == 0) ? 1 : 0;

View File

@ -233,6 +233,9 @@ efx_mcdi_version(
#define MCDI_EV_FIELD(_eqp, _field) \
EFX_QWORD_FIELD(*_eqp, MCDI_EVENT_ ## _field)
#define MCDI_CMD_DWORD_FIELD(_edp, _field) \
EFX_DWORD_FIELD(*_edp, MC_CMD_ ## _field)
#ifdef __cplusplus
}
#endif

View File

@ -279,7 +279,8 @@ siena_board_cfg(
uint8_t outbuf[MAX(MC_CMD_GET_BOARD_CFG_OUT_LENMIN,
MC_CMD_GET_RESOURCE_LIMITS_OUT_LEN)];
efx_mcdi_req_t req;
uint8_t *src;
uint8_t *mac_addr;
efx_dword_t *capabilities;
int rc;
/* Board configuration */
@ -302,17 +303,35 @@ siena_board_cfg(
goto fail2;
}
if (emip->emi_port == 1)
src = MCDI_OUT2(req, uint8_t,
if (emip->emi_port == 1) {
mac_addr = MCDI_OUT2(req, uint8_t,
GET_BOARD_CFG_OUT_MAC_ADDR_BASE_PORT0);
else
src = MCDI_OUT2(req, uint8_t,
capabilities = MCDI_OUT2(req, efx_dword_t,
GET_BOARD_CFG_OUT_CAPABILITIES_PORT0);
} else {
mac_addr = MCDI_OUT2(req, uint8_t,
GET_BOARD_CFG_OUT_MAC_ADDR_BASE_PORT1);
EFX_MAC_ADDR_COPY(encp->enc_mac_addr, src);
capabilities = MCDI_OUT2(req, efx_dword_t,
GET_BOARD_CFG_OUT_CAPABILITIES_PORT1);
}
EFX_MAC_ADDR_COPY(encp->enc_mac_addr, mac_addr);
encp->enc_board_type = MCDI_OUT_DWORD(req,
GET_BOARD_CFG_OUT_BOARD_TYPE);
/* Additional capabilities */
encp->enc_clk_mult = 1;
if (MCDI_CMD_DWORD_FIELD(capabilities, CAPABILITIES_TURBO)) {
enp->en_features |= EFX_FEATURE_TURBO;
if (MCDI_CMD_DWORD_FIELD(capabilities,
CAPABILITIES_TURBO_ACTIVE))
encp->enc_clk_mult = 2;
}
encp->enc_evq_moderation_max = EFX_EV_TIMER_QUANTUM <<
FRF_AB_TIMER_VAL_WIDTH / encp->enc_clk_mult;
/* Resource limits */
req.emr_cmd = MC_CMD_GET_RESOURCE_LIMITS;
EFX_STATIC_ASSERT(MC_CMD_GET_RESOURCE_LIMITS_IN_LEN == 0);
@ -608,9 +627,6 @@ siena_nic_probe(
if ((rc = siena_board_cfg(enp)) != 0)
goto fail4;
encp->enc_evq_moderation_max =
EFX_EV_TIMER_QUANTUM << FRF_CZ_TIMER_VAL_WIDTH;
if ((rc = siena_phy_cfg(enp)) != 0)
goto fail5;