Skip to content

Commit cfaae9e

Browse files
LorenzoBianconinbd168
authored andcommitted
mt76: add skb pointer to mt76_tx_info
Pass skb pointer to tx_prepare_skb through mt76_tx_info data structure. This is a preliminary patch to properly support dma error path for new chipsets (e.g. 7615) Signed-off-by: Lorenzo Bianconi <[email protected]> Signed-off-by: Felix Fietkau <[email protected]>
1 parent f3950a4 commit cfaae9e

File tree

9 files changed

+43
-39
lines changed

9 files changed

+43
-39
lines changed

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

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -290,7 +290,9 @@ mt76_dma_tx_queue_skb(struct mt76_dev *dev, enum mt76_txq_id qid,
290290
struct ieee80211_sta *sta)
291291
{
292292
struct mt76_queue *q = dev->q_tx[qid].q;
293-
struct mt76_tx_info tx_info = {};
293+
struct mt76_tx_info tx_info = {
294+
.skb = skb,
295+
};
294296
int len, n = 0, ret = -ENOMEM;
295297
struct mt76_queue_entry e;
296298
struct mt76_txwi_cache *t;
@@ -335,8 +337,7 @@ mt76_dma_tx_queue_skb(struct mt76_dev *dev, enum mt76_txq_id qid,
335337

336338
dma_sync_single_for_cpu(dev->dev, t->dma_addr, dev->drv->txwi_size,
337339
DMA_TO_DEVICE);
338-
ret = dev->drv->tx_prepare_skb(dev, txwi, skb, qid, wcid, sta,
339-
&tx_info);
340+
ret = dev->drv->tx_prepare_skb(dev, txwi, qid, wcid, sta, &tx_info);
340341
dma_sync_single_for_device(dev->dev, t->dma_addr, dev->drv->txwi_size,
341342
DMA_TO_DEVICE);
342343
if (ret < 0)
@@ -348,15 +349,15 @@ mt76_dma_tx_queue_skb(struct mt76_dev *dev, enum mt76_txq_id qid,
348349
}
349350

350351
return mt76_dma_add_buf(dev, q, tx_info.buf, tx_info.nbuf,
351-
tx_info.info, skb, t);
352+
tx_info.info, tx_info.skb, t);
352353

353354
unmap:
354355
for (n--; n > 0; n--)
355356
dma_unmap_single(dev->dev, tx_info.buf[n].addr,
356357
tx_info.buf[n].len, DMA_TO_DEVICE);
357358

358359
free:
359-
e.skb = skb;
360+
e.skb = tx_info.skb;
360361
e.txwi = t;
361362
dev->drv->tx_complete_skb(dev, qid, &e);
362363
mt76_put_txwi(dev, t);

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,7 @@ struct mt76_queue_buf {
8585

8686
struct mt76_tx_info {
8787
struct mt76_queue_buf buf[32];
88+
struct sk_buff *skb;
8889
int nbuf;
8990
u32 info;
9091
};
@@ -291,8 +292,7 @@ struct mt76_driver_ops {
291292
void (*update_survey)(struct mt76_dev *dev);
292293

293294
int (*tx_prepare_skb)(struct mt76_dev *dev, void *txwi_ptr,
294-
struct sk_buff *skb, enum mt76_txq_id qid,
295-
struct mt76_wcid *wcid,
295+
enum mt76_txq_id qid, struct mt76_wcid *wcid,
296296
struct ieee80211_sta *sta,
297297
struct mt76_tx_info *tx_info);
298298

drivers/net/wireless/mediatek/mt76/mt7603/mac.c

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -912,13 +912,13 @@ mt7603_mac_write_txwi(struct mt7603_dev *dev, __le32 *txwi,
912912
}
913913

914914
int mt7603_tx_prepare_skb(struct mt76_dev *mdev, void *txwi_ptr,
915-
struct sk_buff *skb, enum mt76_txq_id qid,
916-
struct mt76_wcid *wcid, struct ieee80211_sta *sta,
915+
enum mt76_txq_id qid, struct mt76_wcid *wcid,
916+
struct ieee80211_sta *sta,
917917
struct mt76_tx_info *tx_info)
918918
{
919919
struct mt7603_dev *dev = container_of(mdev, struct mt7603_dev, mt76);
920920
struct mt7603_sta *msta = container_of(wcid, struct mt7603_sta, wcid);
921-
struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
921+
struct ieee80211_tx_info *info = IEEE80211_SKB_CB(tx_info->skb);
922922
struct ieee80211_key_conf *key = info->control.hw_key;
923923
int pid;
924924

@@ -934,7 +934,7 @@ int mt7603_tx_prepare_skb(struct mt76_dev *mdev, void *txwi_ptr,
934934
mt7603_wtbl_set_ps(dev, msta, false);
935935
}
936936

937-
pid = mt76_tx_status_skb_add(mdev, wcid, skb);
937+
pid = mt76_tx_status_skb_add(mdev, wcid, tx_info->skb);
938938

939939
if (info->flags & IEEE80211_TX_CTL_RATE_CTRL_PROBE) {
940940
spin_lock_bh(&dev->mt76.lock);
@@ -944,7 +944,8 @@ int mt7603_tx_prepare_skb(struct mt76_dev *mdev, void *txwi_ptr,
944944
spin_unlock_bh(&dev->mt76.lock);
945945
}
946946

947-
mt7603_mac_write_txwi(dev, txwi_ptr, skb, qid, wcid, sta, pid, key);
947+
mt7603_mac_write_txwi(dev, txwi_ptr, tx_info->skb, qid, wcid,
948+
sta, pid, key);
948949

949950
return 0;
950951
}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -221,8 +221,8 @@ void mt7603_wtbl_set_smps(struct mt7603_dev *dev, struct mt7603_sta *sta,
221221
void mt7603_filter_tx(struct mt7603_dev *dev, int idx, bool abort);
222222

223223
int mt7603_tx_prepare_skb(struct mt76_dev *mdev, void *txwi_ptr,
224-
struct sk_buff *skb, enum mt76_txq_id qid,
225-
struct mt76_wcid *wcid, struct ieee80211_sta *sta,
224+
enum mt76_txq_id qid, struct mt76_wcid *wcid,
225+
struct ieee80211_sta *sta,
226226
struct mt76_tx_info *tx_info);
227227

228228
void mt7603_tx_complete_skb(struct mt76_dev *mdev, enum mt76_txq_id qid,

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -183,8 +183,8 @@ irqreturn_t mt76x02_irq_handler(int irq, void *dev_instance);
183183
void mt76x02_tx(struct ieee80211_hw *hw, struct ieee80211_tx_control *control,
184184
struct sk_buff *skb);
185185
int mt76x02_tx_prepare_skb(struct mt76_dev *mdev, void *txwi,
186-
struct sk_buff *skb, enum mt76_txq_id qid,
187-
struct mt76_wcid *wcid, struct ieee80211_sta *sta,
186+
enum mt76_txq_id qid, struct mt76_wcid *wcid,
187+
struct ieee80211_sta *sta,
188188
struct mt76_tx_info *tx_info);
189189
void mt76x02_sw_scan(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
190190
const u8 *mac);

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

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -147,23 +147,23 @@ bool mt76x02_tx_status_data(struct mt76_dev *mdev, u8 *update)
147147
EXPORT_SYMBOL_GPL(mt76x02_tx_status_data);
148148

149149
int mt76x02_tx_prepare_skb(struct mt76_dev *mdev, void *txwi_ptr,
150-
struct sk_buff *skb, enum mt76_txq_id qid,
151-
struct mt76_wcid *wcid, struct ieee80211_sta *sta,
150+
enum mt76_txq_id qid, struct mt76_wcid *wcid,
151+
struct ieee80211_sta *sta,
152152
struct mt76_tx_info *tx_info)
153153
{
154154
struct mt76x02_dev *dev = container_of(mdev, struct mt76x02_dev, mt76);
155-
struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
155+
struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)tx_info->skb->data;
156156
struct mt76x02_txwi *txwi = txwi_ptr;
157157
int hdrlen, len, pid, qsel = MT_QSEL_EDCA;
158158

159159
if (qid == MT_TXQ_PSD && wcid && wcid->idx < 128)
160160
mt76x02_mac_wcid_set_drop(dev, wcid->idx, false);
161161

162162
hdrlen = ieee80211_hdrlen(hdr->frame_control);
163-
len = skb->len - (hdrlen & 2);
164-
mt76x02_mac_write_txwi(dev, txwi, skb, wcid, sta, len);
163+
len = tx_info->skb->len - (hdrlen & 2);
164+
mt76x02_mac_write_txwi(dev, txwi, tx_info->skb, wcid, sta, len);
165165

166-
pid = mt76_tx_status_skb_add(mdev, wcid, skb);
166+
pid = mt76_tx_status_skb_add(mdev, wcid, tx_info->skb);
167167
txwi->pktid = pid;
168168

169169
if (pid >= MT_PACKET_ID_FIRST)

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,8 @@ int mt76x02u_mcu_fw_send_data(struct mt76x02_dev *dev, const void *data,
2626

2727
int mt76x02u_skb_dma_info(struct sk_buff *skb, int port, u32 flags);
2828
int mt76x02u_tx_prepare_skb(struct mt76_dev *mdev, void *data,
29-
struct sk_buff *skb, enum mt76_txq_id qid,
30-
struct mt76_wcid *wcid, struct ieee80211_sta *sta,
29+
enum mt76_txq_id qid, struct mt76_wcid *wcid,
30+
struct ieee80211_sta *sta,
3131
struct mt76_tx_info *tx_info);
3232
void mt76x02u_tx_complete_skb(struct mt76_dev *mdev, enum mt76_txq_id qid,
3333
struct mt76_queue_entry *e);

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

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -72,23 +72,23 @@ int mt76x02u_skb_dma_info(struct sk_buff *skb, int port, u32 flags)
7272
}
7373

7474
int mt76x02u_tx_prepare_skb(struct mt76_dev *mdev, void *data,
75-
struct sk_buff *skb, enum mt76_txq_id qid,
76-
struct mt76_wcid *wcid, struct ieee80211_sta *sta,
75+
enum mt76_txq_id qid, struct mt76_wcid *wcid,
76+
struct ieee80211_sta *sta,
7777
struct mt76_tx_info *tx_info)
7878
{
7979
struct mt76x02_dev *dev = container_of(mdev, struct mt76x02_dev, mt76);
80-
int pid, len = skb->len, ep = q2ep(mdev->q_tx[qid].q->hw_idx);
80+
int pid, len = tx_info->skb->len, ep = q2ep(mdev->q_tx[qid].q->hw_idx);
8181
struct mt76x02_txwi *txwi;
8282
enum mt76_qsel qsel;
8383
u32 flags;
8484

85-
mt76_insert_hdr_pad(skb);
85+
mt76_insert_hdr_pad(tx_info->skb);
8686

87-
txwi = (struct mt76x02_txwi *)(skb->data - sizeof(struct mt76x02_txwi));
88-
mt76x02_mac_write_txwi(dev, txwi, skb, wcid, sta, len);
89-
skb_push(skb, sizeof(struct mt76x02_txwi));
87+
txwi = (struct mt76x02_txwi *)(tx_info->skb->data - sizeof(*txwi));
88+
mt76x02_mac_write_txwi(dev, txwi, tx_info->skb, wcid, sta, len);
89+
skb_push(tx_info->skb, sizeof(*txwi));
9090

91-
pid = mt76_tx_status_skb_add(mdev, wcid, skb);
91+
pid = mt76_tx_status_skb_add(mdev, wcid, tx_info->skb);
9292
txwi->pktid = pid;
9393

9494
if (pid >= MT_PACKET_ID_FIRST || ep == MT_EP_OUT_HCCA)
@@ -101,7 +101,7 @@ int mt76x02u_tx_prepare_skb(struct mt76_dev *mdev, void *data,
101101
if (!wcid || wcid->hw_key_idx == 0xff || wcid->sw_iv)
102102
flags |= MT_TXD_INFO_WIV;
103103

104-
return mt76x02u_skb_dma_info(skb, WLAN_PORT, flags);
104+
return mt76x02u_skb_dma_info(tx_info->skb, WLAN_PORT, flags);
105105
}
106106
EXPORT_SYMBOL_GPL(mt76x02u_tx_prepare_skb);
107107

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

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -734,28 +734,30 @@ mt76u_tx_queue_skb(struct mt76_dev *dev, enum mt76_txq_id qid,
734734
struct ieee80211_sta *sta)
735735
{
736736
struct mt76_queue *q = dev->q_tx[qid].q;
737-
struct urb *urb;
737+
struct mt76_tx_info tx_info = {
738+
.skb = skb,
739+
};
738740
u16 idx = q->tail;
739741
int err;
740742

741743
if (q->queued == q->ndesc)
742744
return -ENOSPC;
743745

744746
skb->prev = skb->next = NULL;
745-
err = dev->drv->tx_prepare_skb(dev, NULL, skb, qid, wcid, sta, NULL);
747+
err = dev->drv->tx_prepare_skb(dev, NULL, qid, wcid, sta, &tx_info);
746748
if (err < 0)
747749
return err;
748750

749-
urb = q->entry[idx].urb;
750-
err = mt76u_tx_setup_buffers(dev, skb, urb);
751+
err = mt76u_tx_setup_buffers(dev, tx_info.skb, q->entry[idx].urb);
751752
if (err < 0)
752753
return err;
753754

754755
mt76u_fill_bulk_urb(dev, USB_DIR_OUT, q2ep(q->hw_idx),
755-
urb, mt76u_complete_tx, &q->entry[idx]);
756+
q->entry[idx].urb, mt76u_complete_tx,
757+
&q->entry[idx]);
756758

757759
q->tail = (q->tail + 1) % q->ndesc;
758-
q->entry[idx].skb = skb;
760+
q->entry[idx].skb = tx_info.skb;
759761
q->queued++;
760762

761763
return idx;

0 commit comments

Comments
 (0)