Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9d1aea62 authored by Neil Turton's avatar Neil Turton Committed by Ben Hutchings
Browse files

sfc: Stop the TX queues during loopback self-tests



If the TX queues are running during loopback self tests, host
traffic gets looped back which causes the test to fail.  Avoid
restarting the TX queues after the port reset so that any packets
sent by the host get held back until after the tests have completed.

[bwh: Also wake all TX queues at the end of self-tests.]

Signed-off-by: default avatarBen Hutchings <bhutchings@solarflare.com>
parent 4a9f65f6
Loading
Loading
Loading
Loading
+1 −1
Original line number Original line Diff line number Diff line
@@ -1436,7 +1436,7 @@ static void efx_start_all(struct efx_nic *efx)
	 * restart the transmit interface early so the watchdog timer stops */
	 * restart the transmit interface early so the watchdog timer stops */
	efx_start_port(efx);
	efx_start_port(efx);


	if (efx_dev_registered(efx))
	if (efx_dev_registered(efx) && !efx->port_inhibited)
		netif_tx_wake_all_queues(efx->net_dev);
		netif_tx_wake_all_queues(efx->net_dev);


	efx_for_each_channel(channel, efx)
	efx_for_each_channel(channel, efx)
+2 −0
Original line number Original line Diff line number Diff line
@@ -770,6 +770,8 @@ int efx_selftest(struct efx_nic *efx, struct efx_self_tests *tests,
	__efx_reconfigure_port(efx);
	__efx_reconfigure_port(efx);
	mutex_unlock(&efx->mac_lock);
	mutex_unlock(&efx->mac_lock);


	netif_tx_wake_all_queues(efx->net_dev);

	return rc_test;
	return rc_test;
}
}
+2 −1
Original line number Original line Diff line number Diff line
@@ -435,7 +435,8 @@ void efx_xmit_done(struct efx_tx_queue *tx_queue, unsigned int index)
	 * queue state. */
	 * queue state. */
	smp_mb();
	smp_mb();
	if (unlikely(netif_tx_queue_stopped(tx_queue->core_txq)) &&
	if (unlikely(netif_tx_queue_stopped(tx_queue->core_txq)) &&
	    likely(efx->port_enabled)) {
	    likely(efx->port_enabled) &&
	    likely(!efx->port_inhibited)) {
		fill_level = tx_queue->insert_count - tx_queue->read_count;
		fill_level = tx_queue->insert_count - tx_queue->read_count;
		if (fill_level < EFX_TXQ_THRESHOLD(efx)) {
		if (fill_level < EFX_TXQ_THRESHOLD(efx)) {
			EFX_BUG_ON_PARANOID(!efx_dev_registered(efx));
			EFX_BUG_ON_PARANOID(!efx_dev_registered(efx));