Commit d7259cdb authored by Ping-Ke Shih's avatar Ping-Ke Shih Committed by Kalle Valo

rtw89: pci: allow to process RPP prior to TX BD

RPP is to report certain skb(s) can be freed, and TX BD indicates which
TX descriptors can be freed. Normally, TX BD is happened before RPP.
In low power mode, RPP can happen ahead, so change flow to handle this
case.
Signed-off-by: default avatarPing-Ke Shih <pkshih@realtek.com>
Signed-off-by: default avatarKalle Valo <kvalo@kernel.org>
Link: https://lore.kernel.org/r/20220421120903.73715-8-pkshih@realtek.com
parent 52edbb9f
......@@ -382,6 +382,10 @@ static void rtw89_pci_reclaim_txbd(struct rtw89_dev *rtwdev, struct rtw89_pci_tx
}
list_del_init(&txwd->list);
/* this skb has been freed by RPP */
if (skb_queue_len(&txwd->queue) == 0)
rtw89_pci_enqueue_txwd(tx_ring, txwd);
}
}
......@@ -413,18 +417,12 @@ static void rtw89_pci_release_txwd_skb(struct rtw89_dev *rtwdev,
if (!list_empty(&txwd->list)) {
rtw89_pci_reclaim_txbd(rtwdev, tx_ring);
if (!list_empty(&txwd->list)) {
/* In low power mode, RPP can receive before updating of TX BD.
* In normal mode, it should not happen so give it a warning.
*/
if (!rtwpci->low_power && !list_empty(&txwd->list))
rtw89_warn(rtwdev, "queue %d txwd %d is not idle\n",
txch, seq);
return;
}
}
/* currently, support for only one frame */
if (skb_queue_len(&txwd->queue) != 1) {
rtw89_warn(rtwdev, "empty pending queue %d page %d\n",
txch, seq);
return;
}
skb_queue_walk_safe(&txwd->queue, skb, tmp) {
......@@ -437,7 +435,8 @@ static void rtw89_pci_release_txwd_skb(struct rtw89_dev *rtwdev,
rtw89_pci_tx_status(rtwdev, tx_ring, skb, tx_status);
}
rtw89_pci_enqueue_txwd(tx_ring, txwd);
if (list_empty(&txwd->list))
rtw89_pci_enqueue_txwd(tx_ring, txwd);
}
static void rtw89_pci_release_rpp(struct rtw89_dev *rtwdev,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment