On Mon, Aug 05, 2019 at 02:39:16PM +0200, Stanislaw Gruszka wrote:
> On Mon, Aug 05, 2019 at 01:27:19PM +0200, Lorenzo Bianconi wrote:
> > > ... but I think we have bug when do mt76_txq_schedule_all() in
> > > tx_tasklet, because we can schedule on queues that are stoped.
> > > So reverting 41634aa8d6db and then optimize by removing tx_tasklet
> > > for mmio and remove not needed mt76_txq_schedule_all() calls looks
> > > more reasoneble to me.
> >
> > schedule a stopped queue seems not harmful at a first glance since we do not
> > copy pending skbs if we have not enough room in the dma ring.
>
> mac80211 stop queues for various other reasons than
> IEEE80211_QUEUE_STOP_REASON_DRIVER .
After looking in more details, we check if queue is stopped in
ieee80211_tx_dequeue(). But we do not check that for skb's queued
in mtxq->retry_q .
> > diff --git a/drivers/net/wireless/mediatek/mt76/tx.c
> > b/drivers/net/wireless/mediatek/mt76/tx.c
> > index 5397827668b9..bd2d34c4f326 100644
> > --- a/drivers/net/wireless/mediatek/mt76/tx.c
> > +++ b/drivers/net/wireless/mediatek/mt76/tx.c
> > @@ -495,6 +495,9 @@ mt76_txq_schedule_list(struct mt76_dev *dev, enum
> > mt76_txq_id qid)
> > while (1) {
> > bool empty = false;
> >
> > + if (hwq->stopped)
> > + break;
> > +
> > if (sq->swq_queued >= 4)
> > break;
> >
> > Does it fix the issue you are facing?
>
> I'll not be able to test this patch this week. Will have access to
> the hardware next week.
>
> I checeked before, if
> 'q->queued + (tx_info.nbuf + 1) / 2 >= q->ndesc - 1' is triggered
> when MT7630E hangs and it is not. But maybe second part of the patch
> will help.
Patch did not help.
I debugged problem a bit more and issue is related with HW encryption.
Using full mac80211 SW encyption by retuning -EOPNOTSUPP
mt76x02_set_key() make the problem gone as well. Looks there is
some race between setting HW keys and transmitting.
Stanislaw