Skip to content

Commit 5d581c3

Browse files
committed
wifi: mt76: fix tx packet loss when scanning on DBDC
When queueing packets, only the MT76_RESET flag of the primary PHY is checked. If the primary PHY is scanning or changing channels, this can lead to packet loss for tx on the second PHY. Fix this by passing the phy to the .tx_queue_skb op and using it to check the correct flag. Signed-off-by: Felix Fietkau <nbd@nbd.name>
1 parent 7f819a2 commit 5d581c3

File tree

6 files changed

+11
-8
lines changed

6 files changed

+11
-8
lines changed

drivers/net/wireless/mediatek/mt76/dma.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -532,7 +532,7 @@ mt76_dma_tx_queue_skb_raw(struct mt76_dev *dev, struct mt76_queue *q,
532532
}
533533

534534
static int
535-
mt76_dma_tx_queue_skb(struct mt76_dev *dev, struct mt76_queue *q,
535+
mt76_dma_tx_queue_skb(struct mt76_phy *phy, struct mt76_queue *q,
536536
enum mt76_txq_id qid, struct sk_buff *skb,
537537
struct mt76_wcid *wcid, struct ieee80211_sta *sta)
538538
{
@@ -542,14 +542,15 @@ mt76_dma_tx_queue_skb(struct mt76_dev *dev, struct mt76_queue *q,
542542
struct mt76_tx_info tx_info = {
543543
.skb = skb,
544544
};
545+
struct mt76_dev *dev = phy->dev;
545546
struct ieee80211_hw *hw;
546547
int len, n = 0, ret = -ENOMEM;
547548
struct mt76_txwi_cache *t;
548549
struct sk_buff *iter;
549550
dma_addr_t addr;
550551
u8 *txwi;
551552

552-
if (test_bit(MT76_RESET, &dev->phy.state))
553+
if (test_bit(MT76_RESET, &phy->state))
553554
goto free_skb;
554555

555556
t = mt76_get_txwi(dev);

drivers/net/wireless/mediatek/mt76/mt76.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -256,7 +256,7 @@ struct mt76_queue_ops {
256256
int idx, int n_desc, int bufsize,
257257
u32 ring_base);
258258

259-
int (*tx_queue_skb)(struct mt76_dev *dev, struct mt76_queue *q,
259+
int (*tx_queue_skb)(struct mt76_phy *phy, struct mt76_queue *q,
260260
enum mt76_txq_id qid, struct sk_buff *skb,
261261
struct mt76_wcid *wcid, struct ieee80211_sta *sta);
262262

@@ -1127,7 +1127,7 @@ static inline int mt76_wed_dma_setup(struct mt76_dev *dev, struct mt76_queue *q,
11271127
#define mt76_init_queues(dev, ...) (dev)->mt76.queue_ops->init(&((dev)->mt76), __VA_ARGS__)
11281128
#define mt76_queue_alloc(dev, ...) (dev)->mt76.queue_ops->alloc(&((dev)->mt76), __VA_ARGS__)
11291129
#define mt76_tx_queue_skb_raw(dev, ...) (dev)->mt76.queue_ops->tx_queue_skb_raw(&((dev)->mt76), __VA_ARGS__)
1130-
#define mt76_tx_queue_skb(dev, ...) (dev)->mt76.queue_ops->tx_queue_skb(&((dev)->mt76), __VA_ARGS__)
1130+
#define mt76_tx_queue_skb(dev, ...) (dev)->mt76.queue_ops->tx_queue_skb(&((dev)->mphy), __VA_ARGS__)
11311131
#define mt76_queue_rx_reset(dev, ...) (dev)->mt76.queue_ops->rx_reset(&((dev)->mt76), __VA_ARGS__)
11321132
#define mt76_queue_tx_cleanup(dev, ...) (dev)->mt76.queue_ops->tx_cleanup(&((dev)->mt76), __VA_ARGS__)
11331133
#define mt76_queue_rx_cleanup(dev, ...) (dev)->mt76.queue_ops->rx_cleanup(&((dev)->mt76), __VA_ARGS__)

drivers/net/wireless/mediatek/mt76/sdio.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -514,13 +514,14 @@ static void mt76s_tx_status_data(struct mt76_worker *worker)
514514
}
515515

516516
static int
517-
mt76s_tx_queue_skb(struct mt76_dev *dev, struct mt76_queue *q,
517+
mt76s_tx_queue_skb(struct mt76_phy *phy, struct mt76_queue *q,
518518
enum mt76_txq_id qid, struct sk_buff *skb,
519519
struct mt76_wcid *wcid, struct ieee80211_sta *sta)
520520
{
521521
struct mt76_tx_info tx_info = {
522522
.skb = skb,
523523
};
524+
struct mt76_dev *dev = phy->dev;
524525
int err, len = skb->len;
525526
u16 idx = q->head;
526527

drivers/net/wireless/mediatek/mt76/testmode.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ void mt76_testmode_tx_pending(struct mt76_phy *phy)
5353
q->queued < q->ndesc / 2) {
5454
int ret;
5555

56-
ret = dev->queue_ops->tx_queue_skb(dev, q, qid, skb_get(skb),
56+
ret = dev->queue_ops->tx_queue_skb(phy, q, qid, skb_get(skb),
5757
wcid, NULL);
5858
if (ret < 0)
5959
break;

drivers/net/wireless/mediatek/mt76/tx.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -308,7 +308,7 @@ __mt76_tx_queue_skb(struct mt76_phy *phy, int qid, struct sk_buff *skb,
308308
int idx;
309309

310310
non_aql = !info->tx_time_est;
311-
idx = dev->queue_ops->tx_queue_skb(dev, q, qid, skb, wcid, sta);
311+
idx = dev->queue_ops->tx_queue_skb(phy, q, qid, skb, wcid, sta);
312312
if (idx < 0 || !sta)
313313
return idx;
314314

drivers/net/wireless/mediatek/mt76/usb.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -850,13 +850,14 @@ mt76u_tx_setup_buffers(struct mt76_dev *dev, struct sk_buff *skb,
850850
}
851851

852852
static int
853-
mt76u_tx_queue_skb(struct mt76_dev *dev, struct mt76_queue *q,
853+
mt76u_tx_queue_skb(struct mt76_phy *phy, struct mt76_queue *q,
854854
enum mt76_txq_id qid, struct sk_buff *skb,
855855
struct mt76_wcid *wcid, struct ieee80211_sta *sta)
856856
{
857857
struct mt76_tx_info tx_info = {
858858
.skb = skb,
859859
};
860+
struct mt76_dev *dev = phy->dev;
860861
u16 idx = q->head;
861862
int err;
862863

0 commit comments

Comments
 (0)