When a running wake_tx_queue() call is aborted due to a hw queue stop the corresponding iTXQ is not always correctly marked for resumption: wake_tx_push_queue() can stops the queue run without setting @IEEE80211_TXQ_STOP_NETIF_TX. Without the @IEEE80211_TXQ_STOP_NETIF_TX flag __ieee80211_wake_txqs() will not schedule a new queue run and remaining frames in the queue get stuck till another frame is queued to it. Fix the issue for all drivers - also the ones with custom wake_tx_queue callbacks - by moving the logic into ieee80211_tx_dequeue() and drop the redundant @txqs_stopped. @IEEE80211_TXQ_STOP_NETIF_TX is also renamed to @IEEE80211_TXQ_DIRTY to better describe the flag.
Showing the changes to include/net (1 of 6 files). Show all
Unified · Split
| @@ -1832,8 +1832,6 @@ struct ieee80211_vif_cfg { · 1831 unmodified lines | |||
| 1832 | * @drv_priv: data area for driver use, will always be aligned to | 1832 | * @drv_priv: data area for driver use, will always be aligned to |
| 1833 | * sizeof(void \*). | 1833 | * sizeof(void \*). |
| 1834 | * @txq: the multicast data TX queue | 1834 | * @txq: the multicast data TX queue |
| 1835 | * @txqs_stopped: per AC flag to indicate that intermediate TXQs are stopped, | ||
| 1836 | * protected by fq->lock. | ||
| 1837 | * @offload_flags: 802.3 -> 802.11 enapsulation offload flags, see | 1835 | * @offload_flags: 802.3 -> 802.11 enapsulation offload flags, see |
| 1838 | * &enum ieee80211_offload_flags. | 1836 | * &enum ieee80211_offload_flags. |
| 1839 | * @mbssid_tx_vif: Pointer to the transmitting interface if MBSSID is enabled. | 1837 | * @mbssid_tx_vif: Pointer to the transmitting interface if MBSSID is enabled. |
| @@ -1863,8 +1861,6 @@ struct ieee80211_vif { · 23 unmodified lines | |||
| 1863 | bool probe_req_reg; | 1861 | bool probe_req_reg; |
| 1864 | bool rx_mcast_action_reg; | 1862 | bool rx_mcast_action_reg; |
| 1865 | 1863 | ||
| 1866 | bool txqs_stopped[IEEE80211_NUM_ACS]; | ||
| 1867 | |||
| 1868 | struct ieee80211_vif *mbssid_tx_vif; | 1864 | struct ieee80211_vif *mbssid_tx_vif; |
| 1869 | 1865 | ||
| 1870 | /* must be last */ | 1866 | /* must be last */ |