mirror of
https://github.com/torvalds/linux.git
synced 2024-12-16 08:02:17 +00:00
sfc: Move details of a Falcon bug workaround out of ethtool.c
Signed-off-by: Ben Hutchings <bhutchings@solarflare.com>
This commit is contained in:
parent
e847b53e9e
commit
9dd3a13b88
@ -709,7 +709,6 @@ static int efx_ethtool_set_pauseparam(struct net_device *net_dev,
|
|||||||
struct efx_nic *efx = netdev_priv(net_dev);
|
struct efx_nic *efx = netdev_priv(net_dev);
|
||||||
u8 wanted_fc, old_fc;
|
u8 wanted_fc, old_fc;
|
||||||
u32 old_adv;
|
u32 old_adv;
|
||||||
bool reset;
|
|
||||||
int rc = 0;
|
int rc = 0;
|
||||||
|
|
||||||
mutex_lock(&efx->mac_lock);
|
mutex_lock(&efx->mac_lock);
|
||||||
@ -732,24 +731,10 @@ static int efx_ethtool_set_pauseparam(struct net_device *net_dev,
|
|||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* TX flow control may automatically turn itself off if the
|
/* Hook for Falcon bug 11482 workaround */
|
||||||
* link partner (intermittently) stops responding to pause
|
if (efx->type->prepare_enable_fc_tx &&
|
||||||
* frames. There isn't any indication that this has happened,
|
(wanted_fc & EFX_FC_TX) && !(efx->wanted_fc & EFX_FC_TX))
|
||||||
* so the best we do is leave it up to the user to spot this
|
efx->type->prepare_enable_fc_tx(efx);
|
||||||
* and fix it be cycling transmit flow control on this end. */
|
|
||||||
reset = (wanted_fc & EFX_FC_TX) && !(efx->wanted_fc & EFX_FC_TX);
|
|
||||||
if (EFX_WORKAROUND_11482(efx) && reset) {
|
|
||||||
if (efx_nic_rev(efx) == EFX_REV_FALCON_B0) {
|
|
||||||
/* Recover by resetting the EM block */
|
|
||||||
falcon_stop_nic_stats(efx);
|
|
||||||
falcon_drain_tx_fifo(efx);
|
|
||||||
falcon_reconfigure_xmac(efx);
|
|
||||||
falcon_start_nic_stats(efx);
|
|
||||||
} else {
|
|
||||||
/* Schedule a reset to recover */
|
|
||||||
efx_schedule_reset(efx, RESET_TYPE_INVISIBLE);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
old_adv = efx->link_advertising;
|
old_adv = efx->link_advertising;
|
||||||
old_fc = efx->wanted_fc;
|
old_fc = efx->wanted_fc;
|
||||||
|
@ -497,7 +497,7 @@ static void falcon_reset_macs(struct efx_nic *efx)
|
|||||||
falcon_setup_xaui(efx);
|
falcon_setup_xaui(efx);
|
||||||
}
|
}
|
||||||
|
|
||||||
void falcon_drain_tx_fifo(struct efx_nic *efx)
|
static void falcon_drain_tx_fifo(struct efx_nic *efx)
|
||||||
{
|
{
|
||||||
efx_oword_t reg;
|
efx_oword_t reg;
|
||||||
|
|
||||||
@ -678,6 +678,28 @@ static int falcon_reconfigure_port(struct efx_nic *efx)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* TX flow control may automatically turn itself off if the link
|
||||||
|
* partner (intermittently) stops responding to pause frames. There
|
||||||
|
* isn't any indication that this has happened, so the best we do is
|
||||||
|
* leave it up to the user to spot this and fix it by cycling transmit
|
||||||
|
* flow control on this end.
|
||||||
|
*/
|
||||||
|
|
||||||
|
static void falcon_a1_prepare_enable_fc_tx(struct efx_nic *efx)
|
||||||
|
{
|
||||||
|
/* Schedule a reset to recover */
|
||||||
|
efx_schedule_reset(efx, RESET_TYPE_INVISIBLE);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void falcon_b0_prepare_enable_fc_tx(struct efx_nic *efx)
|
||||||
|
{
|
||||||
|
/* Recover by resetting the EM block */
|
||||||
|
falcon_stop_nic_stats(efx);
|
||||||
|
falcon_drain_tx_fifo(efx);
|
||||||
|
falcon_reconfigure_xmac(efx);
|
||||||
|
falcon_start_nic_stats(efx);
|
||||||
|
}
|
||||||
|
|
||||||
/**************************************************************************
|
/**************************************************************************
|
||||||
*
|
*
|
||||||
* PHY access via GMII
|
* PHY access via GMII
|
||||||
@ -1798,6 +1820,7 @@ const struct efx_nic_type falcon_a1_nic_type = {
|
|||||||
.set_id_led = falcon_set_id_led,
|
.set_id_led = falcon_set_id_led,
|
||||||
.push_irq_moderation = falcon_push_irq_moderation,
|
.push_irq_moderation = falcon_push_irq_moderation,
|
||||||
.reconfigure_port = falcon_reconfigure_port,
|
.reconfigure_port = falcon_reconfigure_port,
|
||||||
|
.prepare_enable_fc_tx = falcon_a1_prepare_enable_fc_tx,
|
||||||
.reconfigure_mac = falcon_reconfigure_xmac,
|
.reconfigure_mac = falcon_reconfigure_xmac,
|
||||||
.check_mac_fault = falcon_xmac_check_fault,
|
.check_mac_fault = falcon_xmac_check_fault,
|
||||||
.get_wol = falcon_get_wol,
|
.get_wol = falcon_get_wol,
|
||||||
@ -1842,6 +1865,7 @@ const struct efx_nic_type falcon_b0_nic_type = {
|
|||||||
.set_id_led = falcon_set_id_led,
|
.set_id_led = falcon_set_id_led,
|
||||||
.push_irq_moderation = falcon_push_irq_moderation,
|
.push_irq_moderation = falcon_push_irq_moderation,
|
||||||
.reconfigure_port = falcon_reconfigure_port,
|
.reconfigure_port = falcon_reconfigure_port,
|
||||||
|
.prepare_enable_fc_tx = falcon_b0_prepare_enable_fc_tx,
|
||||||
.reconfigure_mac = falcon_reconfigure_xmac,
|
.reconfigure_mac = falcon_reconfigure_xmac,
|
||||||
.check_mac_fault = falcon_xmac_check_fault,
|
.check_mac_fault = falcon_xmac_check_fault,
|
||||||
.get_wol = falcon_get_wol,
|
.get_wol = falcon_get_wol,
|
||||||
|
@ -946,6 +946,7 @@ static inline unsigned int efx_port_num(struct efx_nic *efx)
|
|||||||
* @set_id_led: Set state of identifying LED or revert to automatic function
|
* @set_id_led: Set state of identifying LED or revert to automatic function
|
||||||
* @push_irq_moderation: Apply interrupt moderation value
|
* @push_irq_moderation: Apply interrupt moderation value
|
||||||
* @reconfigure_port: Push loopback/power/txdis changes to the MAC and PHY
|
* @reconfigure_port: Push loopback/power/txdis changes to the MAC and PHY
|
||||||
|
* @prepare_enable_fc_tx: Prepare MAC to enable pause frame TX (may be %NULL)
|
||||||
* @reconfigure_mac: Push MAC address, MTU, flow control and filter settings
|
* @reconfigure_mac: Push MAC address, MTU, flow control and filter settings
|
||||||
* to the hardware. Serialised by the mac_lock.
|
* to the hardware. Serialised by the mac_lock.
|
||||||
* @check_mac_fault: Check MAC fault state. True if fault present.
|
* @check_mac_fault: Check MAC fault state. True if fault present.
|
||||||
@ -995,6 +996,7 @@ struct efx_nic_type {
|
|||||||
void (*set_id_led)(struct efx_nic *efx, enum efx_led_mode mode);
|
void (*set_id_led)(struct efx_nic *efx, enum efx_led_mode mode);
|
||||||
void (*push_irq_moderation)(struct efx_channel *channel);
|
void (*push_irq_moderation)(struct efx_channel *channel);
|
||||||
int (*reconfigure_port)(struct efx_nic *efx);
|
int (*reconfigure_port)(struct efx_nic *efx);
|
||||||
|
void (*prepare_enable_fc_tx)(struct efx_nic *efx);
|
||||||
int (*reconfigure_mac)(struct efx_nic *efx);
|
int (*reconfigure_mac)(struct efx_nic *efx);
|
||||||
bool (*check_mac_fault)(struct efx_nic *efx);
|
bool (*check_mac_fault)(struct efx_nic *efx);
|
||||||
void (*get_wol)(struct efx_nic *efx, struct ethtool_wolinfo *wol);
|
void (*get_wol)(struct efx_nic *efx, struct ethtool_wolinfo *wol);
|
||||||
|
@ -298,7 +298,6 @@ extern void efx_nic_eventq_read_ack(struct efx_channel *channel);
|
|||||||
extern bool efx_nic_event_present(struct efx_channel *channel);
|
extern bool efx_nic_event_present(struct efx_channel *channel);
|
||||||
|
|
||||||
/* MAC/PHY */
|
/* MAC/PHY */
|
||||||
extern void falcon_drain_tx_fifo(struct efx_nic *efx);
|
|
||||||
extern void falcon_reconfigure_mac_wrapper(struct efx_nic *efx);
|
extern void falcon_reconfigure_mac_wrapper(struct efx_nic *efx);
|
||||||
extern bool falcon_xmac_check_fault(struct efx_nic *efx);
|
extern bool falcon_xmac_check_fault(struct efx_nic *efx);
|
||||||
extern int falcon_reconfigure_xmac(struct efx_nic *efx);
|
extern int falcon_reconfigure_xmac(struct efx_nic *efx);
|
||||||
|
@ -30,8 +30,6 @@
|
|||||||
/* TX_EV_PKT_ERR can be caused by a dangling TX descriptor
|
/* TX_EV_PKT_ERR can be caused by a dangling TX descriptor
|
||||||
* or a PCIe error (bug 11028) */
|
* or a PCIe error (bug 11028) */
|
||||||
#define EFX_WORKAROUND_10727 EFX_WORKAROUND_ALWAYS
|
#define EFX_WORKAROUND_10727 EFX_WORKAROUND_ALWAYS
|
||||||
/* Transmit flow control may get disabled */
|
|
||||||
#define EFX_WORKAROUND_11482 EFX_WORKAROUND_FALCON_AB
|
|
||||||
/* 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 */
|
/* Legacy ISR read can return zero once */
|
||||||
|
Loading…
Reference in New Issue
Block a user