Introduce packet_id for txs pktid management
Subsystems (2)
Lorenzo Bianconi
maintainercover Introduce packet_id for txs pktid management
Introduce per-wcid idr to manage packet id for txs. This allow fast idr lookup and skb queueing at the same time.
Lorenzo Bianconi (4):
mt76: introduce packet_id idr
mt76: remove mt76_wcid pointer from mt76_tx_status_check signature
mt76: substitute sk_buff_head status_list with spinlock_t status_lock
mt76: schedule status timeout at dma completion
drivers/net/wireless/mediatek/mt76/mac80211.c | 13 ++-- drivers/net/wireless/mediatek/mt76/mt76.h | 45 ++++++++---- .../net/wireless/mediatek/mt76/mt7603/mac.c | 4 +- .../net/wireless/mediatek/mt76/mt7603/main.c | 3 + .../net/wireless/mediatek/mt76/mt7615/mac.c | 2 +- .../net/wireless/mediatek/mt76/mt7615/main.c | 4 ++ .../wireless/mediatek/mt76/mt7615/pci_mac.c | 2 +- .../net/wireless/mediatek/mt76/mt7615/sdio.c | 2 +- .../net/wireless/mediatek/mt76/mt76x02_mac.c | 2 +- .../net/wireless/mediatek/mt76/mt76x02_mmio.c | 2 +- .../net/wireless/mediatek/mt76/mt76x02_util.c | 3 + .../net/wireless/mediatek/mt76/mt7915/mac.c | 4 +- .../net/wireless/mediatek/mt76/mt7915/main.c | 4 ++ .../net/wireless/mediatek/mt76/mt7921/dma.c | 2 +- .../net/wireless/mediatek/mt76/mt7921/mac.c | 2 +- .../net/wireless/mediatek/mt76/mt7921/main.c | 4 ++ drivers/net/wireless/mediatek/mt76/sdio.c | 2 +- drivers/net/wireless/mediatek/mt76/tx.c | 70 +++++++++++++------ drivers/net/wireless/mediatek/mt76/usb.c | 2 +- 19 files changed, 117 insertions(+), 55 deletions(-)
Signature · 1 line
2.31.1
Lorenzo Bianconi
maintainerPATCH 1/4 mt76: introduce packet_id idr
Introduce per-wcid idr to manage packet id for txs. This allow fast idr lookup and skb queueing at the same time.
--- drivers/net/wireless/mediatek/mt76/mac80211.c | 7 ++- drivers/net/wireless/mediatek/mt76/mt76.h | 26 +++++++--- .../net/wireless/mediatek/mt76/mt7603/main.c | 3 ++ .../net/wireless/mediatek/mt76/mt7615/main.c | 4 ++ .../net/wireless/mediatek/mt76/mt76x02_util.c | 3 ++ .../net/wireless/mediatek/mt76/mt7915/main.c | 4 ++ .../net/wireless/mediatek/mt76/mt7921/main.c | 4 ++ drivers/net/wireless/mediatek/mt76/tx.c | 50 +++++++++++++------ 8 files changed, 77 insertions(+), 24 deletions(-)
drivers/net/wireless/mediatek/mt76/mac80211.c +6 -1
@@ -566,6 +566,8 @@ mt76_alloc_device(struct device *pdev, unsigned int size,spin_lock_init (&dev->token_lock);idr_init (&dev->token); +INIT_LIST_HEAD (&dev->wcid_list); +INIT_LIST_HEAD (&dev->txwi_cache);for (i =0 ; i <ARRAY_SIZE (dev->q_rx); i++)
@@ -1232,6 +1234,7 @@ mt76_sta_add(struct mt76_dev *dev, struct ieee80211_vif *vif, wcid->ext_phy = ext_phy;rcu_assign_pointer (dev->wcid[wcid->idx], wcid); +mt76_packet_id_init (wcid); out:mutex_unlock (&dev->mutex);
@@ -1250,9 +1253,11 @@ void __mt76_sta_remove(struct mt76_dev *dev, struct ieee80211_vif *vif,if (dev->drv->sta_remove) dev->drv->sta_remove (dev, vif, sta); -mt76_tx_status_check (dev, wcid, true); +mt76_packet_id_flush (dev, wcid); +mt76_wcid_mask_clear (dev->wcid_mask, idx);mt76_wcid_mask_clear (dev->wcid_phy_mask, idx); + }EXPORT_SYMBOL_GPL (__mt76_sta_remove);
drivers/net/wireless/mediatek/mt76/mt76.h +18 -8
@@ -261,7 +261,8 @@ struct mt76_wcid {u32 tx_info;bool sw_iv; -u8 packet_id; +struct list_head list; +struct idr pktid; };struct mt76_txq {
@@ -701,6 +702,7 @@ struct mt76_dev {struct mt76_wcid global_wcid;struct mt76_wcid __rcu *wcid[MT76_N_WCIDS ]; +struct list_head wcid_list;u32 rev;
@@ -1310,14 +1312,22 @@ mt76_token_put(struct mt76_dev *dev, int token) return txwi; } -static inline int -mt76_get_next_pkt_id (struct mt76_wcid *wcid) +static inline void mt76_packet_id_init (struct mt76_wcid *wcid) +{ +INIT_LIST_HEAD (&wcid->list); +idr_init (&wcid->pktid); +} + +static inline void +mt76_packet_id_flush (struct mt76_dev *dev,struct mt76_wcid *wcid) { - wcid->packet_id = (wcid->packet_id +1 ) &MT_PACKET_ID_MASK ; -if (wcid->packet_id ==MT_PACKET_ID_NO_ACK || - wcid->packet_id ==MT_PACKET_ID_NO_SKB ) - wcid->packet_id =MT_PACKET_ID_FIRST ; +struct sk_buff_head list; -return wcid->packet_id; +mt76_tx_status_lock (dev, &list); +mt76_tx_status_skb_get (dev, wcid,-1 , &list); +mt76_tx_status_unlock (dev, &list); + +idr_destroy (&wcid->pktid); } +#endif
drivers/net/wireless/mediatek/mt76/mt7603/main.c +3 -0
@@ -69,6 +69,7 @@ mt7603_add_interface(struct ieee80211_hw *hw, struct ieee80211_vif *vif)INIT_LIST_HEAD (&mvif->sta.poll_list); mvif->sta.wcid.idx = idx; mvif->sta.wcid.hw_key_idx =-1 ; +mt76_packet_id_init (&mvif->sta.wcid);eth_broadcast_addr (bc_addr);mt7603_wtbl_init (dev, idx, mvif->idx, bc_addr);
@@ -107,6 +108,8 @@ mt7603_remove_interface(struct ieee80211_hw *hw, struct ieee80211_vif *vif)mutex_lock (&dev->mt76.mutex); dev->mt76.vif_mask &= ~BIT (mvif->idx);mutex_unlock (&dev->mt76.mutex); + +mt76_packet_id_flush (&dev->mt76, &mvif->sta.wcid); }void mt7603_init_edcca (struct mt7603_dev *dev)
drivers/net/wireless/mediatek/mt76/mt7615/main.c +4 -0
@@ -231,6 +231,8 @@ static int mt7615_add_interface(struct ieee80211_hw *hw, mvif->sta.wcid.idx = idx; mvif->sta.wcid.ext_phy = mvif->mt76.band_idx; mvif->sta.wcid.hw_key_idx =-1 ; +mt76_packet_id_init (&mvif->sta.wcid); +mt7615_mac_wtbl_update (dev, idx,MT_WTBL_UPDATE_ADM_COUNT_CLEAR );
@@ -284,6 +286,8 @@ static void mt7615_remove_interface(struct ieee80211_hw *hw,if (!list_empty (&msta->poll_list))list_del_init (&msta->poll_list);spin_unlock_bh (&dev->sta_poll_lock); + +mt76_packet_id_flush (&dev->mt76, &mvif->sta.wcid); }static void mt7615_init_dfs_state (struct mt7615_phy *phy)
drivers/net/wireless/mediatek/mt76/mt76x02_util.c +3 -0
@@ -287,6 +287,8 @@ mt76x02_vif_init(struct mt76x02_dev *dev, struct ieee80211_vif *vif, mvif->idx = idx; mvif->group_wcid.idx =MT_VIF_WCID (idx); mvif->group_wcid.hw_key_idx =-1 ; +mt76_packet_id_init (&mvif->group_wcid); + mtxq = (struct mt76_txq *)vif->txq->drv_priv; mtxq->wcid = &mvif->group_wcid; }
@@ -341,6 +343,7 @@ void mt76x02_remove_interface(struct ieee80211_hw *hw,struct mt76x02_vif *mvif = (struct mt76x02_vif *)vif->drv_priv; dev->mt76.vif_mask &= ~BIT (mvif->idx); +mt76_packet_id_flush (&dev->mt76, &mvif->group_wcid); }EXPORT_SYMBOL_GPL (mt76x02_remove_interface);
drivers/net/wireless/mediatek/mt76/mt7915/main.c +4 -0
@@ -239,6 +239,8 @@ static int mt7915_add_interface(struct ieee80211_hw *hw, mvif->sta.wcid.ext_phy = mvif->band_idx; mvif->sta.wcid.hw_key_idx =-1 ; mvif->sta.wcid.tx_info |=MT_WCID_TX_INFO_SET ; +mt76_packet_id_init (&mvif->sta.wcid); +mt7915_mac_wtbl_update (dev, idx,MT_WTBL_UPDATE_ADM_COUNT_CLEAR );
@@ -293,6 +295,8 @@ static void mt7915_remove_interface(struct ieee80211_hw *hw,if (!list_empty (&msta->poll_list))list_del_init (&msta->poll_list);spin_unlock_bh (&dev->sta_poll_lock); + +mt76_packet_id_flush (&dev->mt76, &msta->wcid); }static void mt7915_init_dfs_state (struct mt7915_phy *phy)
drivers/net/wireless/mediatek/mt76/mt7921/main.c +4 -0
@@ -304,6 +304,8 @@ static int mt7921_add_interface(struct ieee80211_hw *hw, mvif->sta.wcid.ext_phy = mvif->mt76.band_idx; mvif->sta.wcid.hw_key_idx =-1 ; mvif->sta.wcid.tx_info |=MT_WCID_TX_INFO_SET ; +mt76_packet_id_init (&mvif->sta.wcid); +mt7921_mac_wtbl_update (dev, idx,MT_WTBL_UPDATE_ADM_COUNT_CLEAR );
@@ -350,6 +352,8 @@ static void mt7921_remove_interface(struct ieee80211_hw *hw,if (!list_empty (&msta->poll_list))list_del_init (&msta->poll_list);spin_unlock_bh (&dev->sta_poll_lock); + +mt76_packet_id_flush (&dev->mt76, &msta->wcid); }static int mt7921_set_channel (struct mt7921_phy *phy)
drivers/net/wireless/mediatek/mt76/tx.c +35 -15
108 lines not on this page · raw message
Signature · 1 line
2.31.1
Lorenzo Bianconi
maintainerPATCH 2/4 mt76: remove mt76_wcid pointer from mt76_tx_status_check signature
In reply to Lorenzo BianconiRemove mt76_wcid pointer from mt76_tx_status_check signature since it is always set to NULL
--- drivers/net/wireless/mediatek/mt76/mac80211.c | 4 ++-- drivers/net/wireless/mediatek/mt76/mt76.h | 3 +-- drivers/net/wireless/mediatek/mt76/mt7603/mac.c | 4 ++-- drivers/net/wireless/mediatek/mt76/mt7615/mac.c | 2 +- drivers/net/wireless/mediatek/mt76/mt7615/pci_mac.c | 2 +- drivers/net/wireless/mediatek/mt76/mt7615/sdio.c | 2 +- drivers/net/wireless/mediatek/mt76/mt76x02_mac.c | 2 +- drivers/net/wireless/mediatek/mt76/mt76x02_mmio.c | 2 +- drivers/net/wireless/mediatek/mt76/mt7915/mac.c | 4 ++-- drivers/net/wireless/mediatek/mt76/mt7921/dma.c | 2 +- drivers/net/wireless/mediatek/mt76/mt7921/mac.c | 2 +- drivers/net/wireless/mediatek/mt76/sdio.c | 2 +- drivers/net/wireless/mediatek/mt76/tx.c | 3 ++- drivers/net/wireless/mediatek/mt76/usb.c | 2 +- 14 files changed, 18 insertions(+), 18 deletions(-)
drivers/net/wireless/mediatek/mt76/mac80211.c +2 -2
@@ -511,7 +511,7 @@ void mt76_unregister_phy(struct mt76_phy *phy) {struct mt76_dev *dev = phy->dev; -mt76_tx_status_check (dev,NULL , true); +mt76_tx_status_check (dev, true);ieee80211_unregister_hw (phy->hw); dev->phy2 =NULL ; }
@@ -639,7 +639,7 @@ void mt76_unregister_device(struct mt76_dev *dev)if (IS_ENABLED (CONFIG_MT76_LEDS ))mt76_led_cleanup (dev); -mt76_tx_status_check (dev,NULL , true); +mt76_tx_status_check (dev, true);ieee80211_unregister_hw (hw); }EXPORT_SYMBOL_GPL (mt76_unregister_device);
drivers/net/wireless/mediatek/mt76/mt76.h +1 -2
@@ -1115,8 +1115,7 @@ mt76_tx_complete_skb(struct mt76_dev *dev, u16 wcid, struct sk_buff *skb)__mt76_tx_complete_skb (dev, wcid, skb,NULL ); } -void mt76_tx_status_check (struct mt76_dev *dev,struct mt76_wcid *wcid, -bool flush); +void mt76_tx_status_check (struct mt76_dev *dev,bool flush); int mt76_sta_state(struct ieee80211_hw *hw, struct ieee80211_vif *vif, struct ieee80211_sta *sta, enum ieee80211_sta_state old_state,
drivers/net/wireless/mediatek/mt76/mt7603/mac.c +2 -2
@@ -1458,7 +1458,7 @@ static void mt7603_mac_watchdog_reset(struct mt7603_dev *dev)mt76_queue_rx_reset (dev, i); } -mt76_tx_status_check (&dev->mt76,NULL , true); +mt76_tx_status_check (&dev->mt76, true);mt7603_dma_sched_reset (dev);
@@ -1814,7 +1814,7 @@ void mt7603_mac_work(struct work_struct *work)bool reset = false;int i, idx; -mt76_tx_status_check (&dev->mt76,NULL , false); +mt76_tx_status_check (&dev->mt76, false);mutex_lock (&dev->mt76.mutex);
drivers/net/wireless/mediatek/mt76/mt7615/mac.c +1 -1
@@ -2082,7 +2082,7 @@ void mt7615_mac_work(struct work_struct *work)mt7615_mutex_release (phy->dev); -mt76_tx_status_check (mphy->dev,NULL , false); +mt76_tx_status_check (mphy->dev, false); timeout =mt7615_get_macwork_timeout (phy->dev);ieee80211_queue_delayed_work (mphy->hw, &mphy->mac_work, timeout);
drivers/net/wireless/mediatek/mt76/mt7615/pci_mac.c +1 -1
@@ -202,7 +202,7 @@ void mt7615_dma_reset(struct mt7615_dev *dev)mt76_for_each_q_rx (&dev->mt76, i)mt76_queue_rx_reset (dev, i); -mt76_tx_status_check (&dev->mt76,NULL , true); +mt76_tx_status_check (&dev->mt76, true);mt7615_dma_start (dev); }
drivers/net/wireless/mediatek/mt76/mt7615/sdio.c +1 -1
@@ -432,7 +432,7 @@ static int mt7663s_suspend(struct device *dev)cancel_work_sync (&mdev->mt76.sdio.stat_work);clear_bit (MT76_READING_STATS , &mdev->mphy.state); -mt76_tx_status_check (&mdev->mt76,NULL , true); +mt76_tx_status_check (&mdev->mt76, true);return 0 ; }
drivers/net/wireless/mediatek/mt76/mt76x02_mac.c +1 -1
@@ -1186,7 +1186,7 @@ void mt76x02_mac_work(struct work_struct *work)mutex_unlock (&dev->mt76.mutex); -mt76_tx_status_check (&dev->mt76,NULL , false); +mt76_tx_status_check (&dev->mt76, false);ieee80211_queue_delayed_work (mt76_hw (dev), &dev->mphy.mac_work,MT_MAC_WORK_INTERVAL );
drivers/net/wireless/mediatek/mt76/mt76x02_mmio.c +1 -1
@@ -472,7 +472,7 @@ static void mt76x02_watchdog_reset(struct mt76x02_dev *dev)mt76_queue_rx_reset (dev, i); } -mt76_tx_status_check (&dev->mt76,NULL , true); +mt76_tx_status_check (&dev->mt76, true);mt76x02_mac_start (dev);
drivers/net/wireless/mediatek/mt76/mt7915/mac.c +2 -2
@@ -1751,7 +1751,7 @@ mt7915_dma_reset(struct mt7915_dev *dev)mt76_for_each_q_rx (&dev->mt76, i)mt76_queue_rx_reset (dev, i); -mt76_tx_status_check (&dev->mt76,NULL , true); +mt76_tx_status_check (&dev->mt76, true);/* re-init prefetch settings after reset */ mt7915_dma_prefetch (dev);
@@ -1964,7 +1964,7 @@ void mt7915_mac_work(struct work_struct *work)mutex_unlock (&mphy->dev->mutex); -mt76_tx_status_check (mphy->dev,NULL , false); +mt76_tx_status_check (mphy->dev, false);ieee80211_queue_delayed_work (mphy->hw, &mphy->mac_work,MT7915_WATCHDOG_TIME );
drivers/net/wireless/mediatek/mt76/mt7921/dma.c +1 -1
@@ -272,7 +272,7 @@ static int mt7921_dma_reset(struct mt7921_dev *dev, bool force)mt76_for_each_q_rx (&dev->mt76, i)mt76_queue_reset (dev, &dev->mt76.q_rx[i]); -mt76_tx_status_check (&dev->mt76,NULL , true); +mt76_tx_status_check (&dev->mt76, true);return mt7921_dma_enable (dev); }
drivers/net/wireless/mediatek/mt76/mt7921/mac.c +1 -1
@@ -1695,7 +1695,7 @@ void mt7921_mac_work(struct work_struct *work)mt7921_mutex_release (phy->dev); -mt76_tx_status_check (mphy->dev,NULL , false); +mt76_tx_status_check (mphy->dev, false);ieee80211_queue_delayed_work (phy->mt76->hw, &mphy->mac_work,MT7921_WATCHDOG_TIME ); }
drivers/net/wireless/mediatek/mt76/sdio.c +1 -1
@@ -328,7 +328,7 @@ void mt76s_deinit(struct mt76_dev *dev)cancel_work_sync (&sdio->stat_work);clear_bit (MT76_READING_STATS , &dev->phy.state); -mt76_tx_status_check (dev,NULL , true); +mt76_tx_status_check (dev, true);sdio_claim_host (sdio->func);sdio_release_irq (sdio->func);
drivers/net/wireless/mediatek/mt76/tx.c +2 -1
@@ -188,9 +188,10 @@ mt76_tx_status_skb_get(struct mt76_dev *dev, struct mt76_wcid *wcid, int pktid,EXPORT_SYMBOL_GPL (mt76_tx_status_skb_get);void -mt76_tx_status_check (struct mt76_dev *dev,struct mt76_wcid *wcid,bool flush) +mt76_tx_status_check (struct mt76_dev *dev,bool flush) {struct sk_buff_head list; +struct mt76_wcid *wcid;mt76_tx_status_lock (dev, &list);while (!list_empty (&dev->wcid_list)) {
drivers/net/wireless/mediatek/mt76/usb.c +1 -1
@@ -1081,7 +1081,7 @@ void mt76u_stop_tx(struct mt76_dev *dev)mt76_worker_enable (&dev->usb.status_worker); -mt76_tx_status_check (dev,NULL , true); +mt76_tx_status_check (dev, true); }EXPORT_SYMBOL_GPL (mt76u_stop_tx);
Signature · 1 line
2.31.1
Lorenzo Bianconi
maintainerPATCH 3/4 mt76: substitute sk_buff_head status_list with spinlock_t status_lock
In reply to Lorenzo BianconiSubstitute sk_buff_head status_list with spinlock_t status_lock since we just need it for locking
--- drivers/net/wireless/mediatek/mt76/mac80211.c | 2 +- drivers/net/wireless/mediatek/mt76/mt76.h | 7 ++++--- drivers/net/wireless/mediatek/mt76/tx.c | 14 +++++++------- 3 files changed, 12 insertions(+), 11 deletions(-)
drivers/net/wireless/mediatek/mt76/mac80211.c +1 -1
@@ -543,9 +543,9 @@ mt76_alloc_device(struct device *pdev, unsigned int size,spin_lock_init (&dev->rx_lock);spin_lock_init (&dev->lock);spin_lock_init (&dev->cc_lock); +spin_lock_init (&dev->status_lock);mutex_init (&dev->mutex);init_waitqueue_head (&dev->tx_wait); -skb_queue_head_init (&dev->status_list);skb_queue_head_init (&dev->mcu.res_q);init_waitqueue_head (&dev->mcu.wait);
drivers/net/wireless/mediatek/mt76/mt76.h +4 -3
@@ -693,7 +693,8 @@ struct mt76_dev {int token_count;wait_queue_head_t tx_wait; -struct sk_buff_head status_list; +/* spinclock used to protect wcid pktid linked list */ +spinlock_t status_lock;u32 wcid_mask[DIV_ROUND_UP (MT76_N_WCIDS ,32 )];u32 wcid_phy_mask[DIV_ROUND_UP (MT76_N_WCIDS ,32 )];
@@ -1096,9 +1097,9 @@ void mt76_wcid_key_setup(struct mt76_dev *dev, struct mt76_wcid *wcid, struct ieee80211_key_conf *key); void mt76_tx_status_lock(struct mt76_dev *dev, struct sk_buff_head *list) - __acquires(&dev->status_list.lock); + __acquires(&dev->status_lock); void mt76_tx_status_unlock(struct mt76_dev *dev, struct sk_buff_head *list) - __releases(&dev->status_list.lock); + __releases(&dev->status_lock);int mt76_tx_status_skb_add (struct mt76_dev *dev,struct mt76_wcid *wcid,struct sk_buff *skb);
drivers/net/wireless/mediatek/mt76/tx.c +7 -7
@@ -38,21 +38,21 @@ EXPORT_SYMBOL_GPL(mt76_tx_check_agg_ssn);void mt76_tx_status_lock (struct mt76_dev *dev,struct sk_buff_head *list) - __acquires(&dev->status_list.lock) + __acquires(&dev->status_lock) {__skb_queue_head_init (list); -spin_lock_bh (&dev->status_list.lock); +spin_lock_bh (&dev->status_lock); }EXPORT_SYMBOL_GPL (mt76_tx_status_lock);void mt76_tx_status_unlock (struct mt76_dev *dev,struct sk_buff_head *list) - __releases(&dev->status_list.lock) + __releases(&dev->status_lock) {struct ieee80211_hw *hw;struct sk_buff *skb; -spin_unlock_bh (&dev->status_list.lock); +spin_unlock_bh (&dev->status_lock);rcu_read_lock ();while ((skb =__skb_dequeue (list)) !=NULL ) {
@@ -130,7 +130,7 @@ mt76_tx_status_skb_add(struct mt76_dev *dev, struct mt76_wcid *wcid, IEEE80211_TX_CTL_RATE_CTRL_PROBE)))return MT_PACKET_ID_NO_SKB ; -spin_lock_bh (&dev->status_list.lock); +spin_lock_bh (&dev->status_lock); pid =idr_alloc (&wcid->pktid, skb,MT_PACKET_ID_FIRST ,MT_PACKET_ID_MASK ,GFP_ATOMIC );
@@ -147,7 +147,7 @@ mt76_tx_status_skb_add(struct mt76_dev *dev, struct mt76_wcid *wcid,list_add_tail (&wcid->list, &dev->wcid_list); out: -spin_unlock_bh (&dev->status_list.lock); +spin_unlock_bh (&dev->status_lock);return pid; }
@@ -160,7 +160,7 @@ mt76_tx_status_skb_get(struct mt76_dev *dev, struct mt76_wcid *wcid, int pktid,struct sk_buff *skb;int id; -lockdep_assert_held (&dev->status_list.lock); +lockdep_assert_held (&dev->status_lock); skb =idr_remove (&wcid->pktid, pktid);if (skb)
Signature · 1 line
2.31.1
Lorenzo Bianconi
maintainerPATCH 4/4 mt76: schedule status timeout at dma completion
In reply to Lorenzo BianconiReduce MT_TX_STATUS_SKB_TIMEOUT to 250ms
--- drivers/net/wireless/mediatek/mt76/mt76.h | 9 +++++++-- drivers/net/wireless/mediatek/mt76/tx.c | 5 ++++- 2 files changed, 11 insertions(+), 3 deletions(-)
drivers/net/wireless/mediatek/mt76/mt76.h +7 -2
@@ -308,8 +308,13 @@ struct mt76_rx_tid {#define MT_PACKET_ID_NO_SKB 1#define MT_PACKET_ID_FIRST 2#define MT_PACKET_ID_HAS_RATE BIT(7) - -#define MT_TX_STATUS_SKB_TIMEOUT HZ +/* This is timer for when to give up when waiting for TXS callback, +* with starting time being the time at which the DMA_DONE callback +* was seen (so, we know packet was processed then, it should not take +* long after that for firmware to send the TXS callback if it is going +* to do so.) +*/ +#define MT_TX_STATUS_SKB_TIMEOUT (HZ / 4)struct mt76_tx_cb {unsigned long jiffies;
drivers/net/wireless/mediatek/mt76/tx.c +4 -1
@@ -141,7 +141,6 @@ mt76_tx_status_skb_add(struct mt76_dev *dev, struct mt76_wcid *wcid, cb->wcid = wcid->idx; cb->pktid = pid; - cb->jiffies = jiffies;if (list_empty (&wcid->list))list_add_tail (&wcid->list, &dev->wcid_list);
@@ -174,6 +173,9 @@ mt76_tx_status_skb_get(struct mt76_dev *dev, struct mt76_wcid *wcid, int pktid, MT_TX_STATUS_SKB_TIMEOUT))continue ; +/* It has been too long since DMA_DONE, time out this packet +* and stop waiting for TXS callback. +*/ idr_remove (&wcid->pktid, cb->pktid);__mt76_tx_status_skb_done (dev, skb,MT_TX_CB_TXS_FAILED |MT_TX_CB_TXS_DONE , list);
@@ -259,6 +261,7 @@ void __mt76_tx_complete_skb(struct mt76_dev *dev, u16 wcid_idx, struct sk_buff * }mt76_tx_status_lock (dev, &list); + cb->jiffies = jiffies;__mt76_tx_status_skb_done (dev, skb,MT_TX_CB_DMA_DONE , &list);mt76_tx_status_unlock (dev, &list);
Signature · 1 line
2.31.1