Re: [PATCH v2 09/11] wifi: rtw88: sdio: add TX back-pressure and retry on page starvation
From: luka . gejak
Date: Thu Jul 30 2026 - 03:57:28 EST
From: Luka Gejak <luka.gejak@xxxxxxxxx>
On 27/07/2026 09:21, Ping-Ke Shih wrote:
>> +/* 8723BS SDIO TX FIFO back-pressure watermarks: stop the mac80211 queue once
>
> comment style.
Fixed, both of them.
>> - queue_work(rtwsdio->txwq, &rtwsdio->tx_handler_data->work);
>> + mod_delayed_work(rtwsdio->txwq,
>> + &rtwsdio->tx_handler_data->work, 0);
>
> queue_delayed_work()?
Changed inside the TX handler, where the work is not pending and
queue_delayed_work() is the right call.
I kept mod_delayed_work() in rtw_sdio_tx_kick_off() on purpose, because
there it can race with a pending retry. If a page shortage has already
armed the work with RTW_SDIO_TX_RETRY_DELAY, queue_delayed_work() would
see it pending and do nothing, so a newly queued frame would sit for up
to a millisecond for no reason. mod_delayed_work() re-arms it to fire
immediately. I have added a comment saying so.
>> if (ret) {
>> skb_queue_head(&rtwsdio->tx_queue[queue], skb);
>
> This case is also `processed = true`?
[...]
> Can you cleanup the handlers of return value and processed?
> The logic isn't clear to me.
You are right that it was not clear, and the requeue case was the
reason: the frame had been dequeued but not sent, so neither value
described it well. The out-parameter is gone. rtw_sdio_process_tx_queue()
now returns:
1 a frame was written
0 the queue was empty
<0 the write failed and the frame is back at the head of the queue
which the handler reads as
ret = rtw_sdio_process_tx_queue(rtwdev, queue);
if (ret == 0)
break;
if (ret < 0) {
if (rtl8723bs && ret == -EBUSY) {
queue_delayed_work(... RTW_SDIO_TX_RETRY_DELAY);
return;
}
break;
}
with the management frame restart after it. Behaviour is unchanged; a
non-EBUSY error still moves on to the next queue.
Best regards,
Luka Gejak