Commit ab3b8250 authored by Ben Hutchings's avatar Ben Hutchings

sfc: EFX_WORKAROUND_ALWAYS is really specific to Falcon-architecture

The workarounds that currently use EFX_WORKAROUND_ALWAYS are in
Falcon-specific or Falcon-arch-specific code, so get rid of the
conditions altogether.  Add/move comments as appropriate.
Signed-off-by: default avatarBen Hutchings <bhutchings@solarflare.com>
parent b105798f
...@@ -686,7 +686,7 @@ static void falcon_ack_status_intr(struct efx_nic *efx) ...@@ -686,7 +686,7 @@ static void falcon_ack_status_intr(struct efx_nic *efx)
return; return;
/* We expect xgmii faults if the wireside link is down */ /* We expect xgmii faults if the wireside link is down */
if (!EFX_WORKAROUND_5147(efx) || !efx->link_state.up) if (!efx->link_state.up)
return; return;
/* We can only use this interrupt to signal the negative edge of /* We can only use this interrupt to signal the negative edge of
...@@ -795,29 +795,22 @@ static void falcon_reconfigure_xgxs_core(struct efx_nic *efx) ...@@ -795,29 +795,22 @@ static void falcon_reconfigure_xgxs_core(struct efx_nic *efx)
bool xgxs_loopback = (efx->loopback_mode == LOOPBACK_XGXS); bool xgxs_loopback = (efx->loopback_mode == LOOPBACK_XGXS);
bool xaui_loopback = (efx->loopback_mode == LOOPBACK_XAUI); bool xaui_loopback = (efx->loopback_mode == LOOPBACK_XAUI);
bool xgmii_loopback = (efx->loopback_mode == LOOPBACK_XGMII); bool xgmii_loopback = (efx->loopback_mode == LOOPBACK_XGMII);
bool old_xgmii_loopback, old_xgxs_loopback, old_xaui_loopback;
/* XGXS block is flaky and will need to be reset if moving /* XGXS block is flaky and will need to be reset if moving
* into our out of XGMII, XGXS or XAUI loopbacks. */ * into our out of XGMII, XGXS or XAUI loopbacks. */
if (EFX_WORKAROUND_5147(efx)) { efx_reado(efx, &reg, FR_AB_XX_CORE_STAT);
bool old_xgmii_loopback, old_xgxs_loopback, old_xaui_loopback; old_xgxs_loopback = EFX_OWORD_FIELD(reg, FRF_AB_XX_XGXS_LB_EN);
bool reset_xgxs; old_xgmii_loopback = EFX_OWORD_FIELD(reg, FRF_AB_XX_XGMII_LB_EN);
efx_reado(efx, &reg, FR_AB_XX_CORE_STAT);
old_xgxs_loopback = EFX_OWORD_FIELD(reg, FRF_AB_XX_XGXS_LB_EN);
old_xgmii_loopback =
EFX_OWORD_FIELD(reg, FRF_AB_XX_XGMII_LB_EN);
efx_reado(efx, &reg, FR_AB_XX_SD_CTL);
old_xaui_loopback = EFX_OWORD_FIELD(reg, FRF_AB_XX_LPBKA);
/* The PHY driver may have turned XAUI off */ efx_reado(efx, &reg, FR_AB_XX_SD_CTL);
reset_xgxs = ((xgxs_loopback != old_xgxs_loopback) || old_xaui_loopback = EFX_OWORD_FIELD(reg, FRF_AB_XX_LPBKA);
(xaui_loopback != old_xaui_loopback) ||
(xgmii_loopback != old_xgmii_loopback));
if (reset_xgxs) /* The PHY driver may have turned XAUI off */
falcon_reset_xaui(efx); if ((xgxs_loopback != old_xgxs_loopback) ||
} (xaui_loopback != old_xaui_loopback) ||
(xgmii_loopback != old_xgmii_loopback))
falcon_reset_xaui(efx);
efx_reado(efx, &reg, FR_AB_XX_CORE_STAT); efx_reado(efx, &reg, FR_AB_XX_CORE_STAT);
EFX_SET_OWORD_FIELD(reg, FRF_AB_XX_FORCE_SIG, EFX_SET_OWORD_FIELD(reg, FRF_AB_XX_FORCE_SIG,
...@@ -946,8 +939,8 @@ static void falcon_poll_xmac(struct efx_nic *efx) ...@@ -946,8 +939,8 @@ static void falcon_poll_xmac(struct efx_nic *efx)
{ {
struct falcon_nic_data *nic_data = efx->nic_data; struct falcon_nic_data *nic_data = efx->nic_data;
if (!EFX_WORKAROUND_5147(efx) || !efx->link_state.up || /* We expect xgmii faults if the wireside link is down */
!nic_data->xmac_poll_required) if (!efx->link_state.up || !nic_data->xmac_poll_required)
return; return;
nic_data->xmac_poll_required = !falcon_xmac_link_ok_retry(efx, 1); nic_data->xmac_poll_required = !falcon_xmac_link_ok_retry(efx, 1);
......
...@@ -830,8 +830,7 @@ efx_farch_handle_tx_event(struct efx_channel *channel, efx_qword_t *event) ...@@ -830,8 +830,7 @@ efx_farch_handle_tx_event(struct efx_channel *channel, efx_qword_t *event)
netif_tx_lock(efx->net_dev); netif_tx_lock(efx->net_dev);
efx_farch_notify_tx_desc(tx_queue); efx_farch_notify_tx_desc(tx_queue);
netif_tx_unlock(efx->net_dev); netif_tx_unlock(efx->net_dev);
} else if (EFX_QWORD_FIELD(*event, FSF_AZ_TX_EV_PKT_ERR) && } else if (EFX_QWORD_FIELD(*event, FSF_AZ_TX_EV_PKT_ERR)) {
EFX_WORKAROUND_10727(efx)) {
efx_schedule_reset(efx, RESET_TYPE_TX_DESC_FETCH); efx_schedule_reset(efx, RESET_TYPE_TX_DESC_FETCH);
} else { } else {
netif_err(efx, tx_err, efx->net_dev, netif_err(efx, tx_err, efx->net_dev,
...@@ -1531,8 +1530,7 @@ irqreturn_t efx_farch_legacy_interrupt(int irq, void *dev_id) ...@@ -1531,8 +1530,7 @@ irqreturn_t efx_farch_legacy_interrupt(int irq, void *dev_id)
} }
if (queues != 0) { if (queues != 0) {
if (EFX_WORKAROUND_15783(efx)) efx->irq_zero_count = 0;
efx->irq_zero_count = 0;
/* Schedule processing of any interrupting queues */ /* Schedule processing of any interrupting queues */
if (likely(soft_enabled)) { if (likely(soft_enabled)) {
...@@ -1544,9 +1542,11 @@ irqreturn_t efx_farch_legacy_interrupt(int irq, void *dev_id) ...@@ -1544,9 +1542,11 @@ irqreturn_t efx_farch_legacy_interrupt(int irq, void *dev_id)
} }
result = IRQ_HANDLED; result = IRQ_HANDLED;
} else if (EFX_WORKAROUND_15783(efx)) { } else {
efx_qword_t *event; efx_qword_t *event;
/* Legacy ISR read can return zero once (SF bug 15783) */
/* We can't return IRQ_HANDLED more than once on seeing ISR=0 /* We can't return IRQ_HANDLED more than once on seeing ISR=0
* because this might be a shared interrupt. */ * because this might be a shared interrupt. */
if (efx->irq_zero_count++ == 0) if (efx->irq_zero_count++ == 0)
......
...@@ -15,25 +15,15 @@ ...@@ -15,25 +15,15 @@
* Bug numbers are from Solarflare's Bugzilla. * Bug numbers are from Solarflare's Bugzilla.
*/ */
#define EFX_WORKAROUND_ALWAYS(efx) 1
#define EFX_WORKAROUND_FALCON_A(efx) (efx_nic_rev(efx) <= EFX_REV_FALCON_A1) #define EFX_WORKAROUND_FALCON_A(efx) (efx_nic_rev(efx) <= EFX_REV_FALCON_A1)
#define EFX_WORKAROUND_FALCON_AB(efx) (efx_nic_rev(efx) <= EFX_REV_FALCON_B0) #define EFX_WORKAROUND_FALCON_AB(efx) (efx_nic_rev(efx) <= EFX_REV_FALCON_B0)
#define EFX_WORKAROUND_SIENA(efx) (efx_nic_rev(efx) == EFX_REV_SIENA_A0) #define EFX_WORKAROUND_SIENA(efx) (efx_nic_rev(efx) == EFX_REV_SIENA_A0)
#define EFX_WORKAROUND_10G(efx) 1 #define EFX_WORKAROUND_10G(efx) 1
/* XAUI resets if link not detected */
#define EFX_WORKAROUND_5147 EFX_WORKAROUND_ALWAYS
/* RX PCIe double split performance issue */
#define EFX_WORKAROUND_7575 EFX_WORKAROUND_ALWAYS
/* Bit-bashed I2C reads cause performance drop */ /* Bit-bashed I2C reads cause performance drop */
#define EFX_WORKAROUND_7884 EFX_WORKAROUND_10G #define EFX_WORKAROUND_7884 EFX_WORKAROUND_10G
/* TX_EV_PKT_ERR can be caused by a dangling TX descriptor
* or a PCIe error (bug 11028) */
#define EFX_WORKAROUND_10727 EFX_WORKAROUND_ALWAYS
/* Truncated IPv4 packets can confuse the TX packet parser */ /* Truncated IPv4 packets can confuse the TX packet parser */
#define EFX_WORKAROUND_15592 EFX_WORKAROUND_FALCON_AB #define EFX_WORKAROUND_15592 EFX_WORKAROUND_FALCON_AB
/* Legacy ISR read can return zero once */
#define EFX_WORKAROUND_15783 EFX_WORKAROUND_ALWAYS
/* Legacy interrupt storm when interrupt fifo fills */ /* Legacy interrupt storm when interrupt fifo fills */
#define EFX_WORKAROUND_17213 EFX_WORKAROUND_SIENA #define EFX_WORKAROUND_17213 EFX_WORKAROUND_SIENA
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment