[PATCH net v6 3/4] net: ethernet: oa_tc6: Disable tx queues on fatal error
Selvamani Rajagopal via B4 Relay <[email protected]>
| Newsgroups | org.kernel.vger.netdev,org.kernel.feeds.b4-sent,org.kernel.vger.linux-kernel |
|---|---|
| Message-ID | <20260812-fix-race-condition-and-crash-v6-3-6cf90f4a271a@onsemi.com> |
From: Selvamani Rajagopal <[email protected]> Previously, TX queue interface was stopped when disable_traffic flag was set, which would indicate fatal error. It is more appropriate to disable the queue as, unless driver is unloaded and reloaded, there is no recovery after disable_traffic is set. Queues may be re-enabled inadvertently by other layers. Intention of disable_traffic is only to stop the traffic from flowing on fatal error. Fixes: b542d13fab0f ("net: ethernet: oa_tc6: Interrupt is active low, level triggered.") Signed-off-by: Selvamani Rajagopal <[email protected]> --- changes in v6 - Updated the comment and commit message to reflect the usage of disable_traffic changes in v5 - Changed the commit message to accurately reflect the changes changes in v4 - Reverted the change that turned carrier off on disable_traffic, as it may have side effects changes in v3 - New patch. Carrier marked off once disable_traffic is set --- drivers/net/ethernet/oa_tc6.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/drivers/net/ethernet/oa_tc6.c b/drivers/net/ethernet/oa_tc6.c index 09bc293fb75b..5354ed3ece7e 100644 --- a/drivers/net/ethernet/oa_tc6.c +++ b/drivers/net/ethernet/oa_tc6.c @@ -730,6 +730,12 @@ static void oa_tc6_disable_traffic(struct oa_tc6 *tc6) skb = oa_tc6_detach_waiting_tx_skb(tc6); spin_unlock_bh(&tc6->tx_skb_lock); + /* disable_traffic, when set, is a point of no return to working + * state. TX queues are disabled. In some cases, upper layer or + * vendor code may inadvertently enable the queue. Intention of + * the disable_traffic flag is to stop traffic from flowing. + */ + netif_tx_disable(tc6->netdev); oa_tc6_drop_tx_skb(tc6, skb); oa_tc6_free_ongoing_skbs(tc6); oa_tc6_write_register(tc6, OA_TC6_REG_INT_MASK0, regval); -- 2.43.0