1 // SPDX-License-Identifier: ISC
3 * Copyright (C) 2016 Felix Fietkau <nbd@nbd.name>
6 #include <linux/dma-mapping.h>
11 mt76_dma_alloc_queue(struct mt76_dev
*dev
, struct mt76_queue
*q
,
12 int idx
, int n_desc
, int bufsize
,
18 spin_lock_init(&q
->lock
);
20 q
->regs
= dev
->mmio
.regs
+ ring_base
+ idx
* MT_RING_SIZE
;
22 q
->buf_size
= bufsize
;
25 size
= q
->ndesc
* sizeof(struct mt76_desc
);
26 q
->desc
= dmam_alloc_coherent(dev
->dev
, size
, &q
->desc_dma
, GFP_KERNEL
);
30 size
= q
->ndesc
* sizeof(*q
->entry
);
31 q
->entry
= devm_kzalloc(dev
->dev
, size
, GFP_KERNEL
);
35 /* clear descriptors */
36 for (i
= 0; i
< q
->ndesc
; i
++)
37 q
->desc
[i
].ctrl
= cpu_to_le32(MT_DMA_CTL_DMA_DONE
);
39 writel(q
->desc_dma
, &q
->regs
->desc_base
);
40 writel(0, &q
->regs
->cpu_idx
);
41 writel(0, &q
->regs
->dma_idx
);
42 writel(q
->ndesc
, &q
->regs
->ring_size
);
48 mt76_dma_add_buf(struct mt76_dev
*dev
, struct mt76_queue
*q
,
49 struct mt76_queue_buf
*buf
, int nbufs
, u32 info
,
50 struct sk_buff
*skb
, void *txwi
)
52 struct mt76_desc
*desc
;
57 q
->entry
[q
->head
].txwi
= DMA_DUMMY_DATA
;
58 q
->entry
[q
->head
].skip_buf0
= true;
61 for (i
= 0; i
< nbufs
; i
+= 2, buf
+= 2) {
62 u32 buf0
= buf
[0].addr
, buf1
= 0;
64 ctrl
= FIELD_PREP(MT_DMA_CTL_SD_LEN0
, buf
[0].len
);
67 ctrl
|= FIELD_PREP(MT_DMA_CTL_SD_LEN1
, buf
[1].len
);
71 ctrl
|= MT_DMA_CTL_LAST_SEC0
;
72 else if (i
== nbufs
- 2)
73 ctrl
|= MT_DMA_CTL_LAST_SEC1
;
76 q
->head
= (q
->head
+ 1) % q
->ndesc
;
80 WRITE_ONCE(desc
->buf0
, cpu_to_le32(buf0
));
81 WRITE_ONCE(desc
->buf1
, cpu_to_le32(buf1
));
82 WRITE_ONCE(desc
->info
, cpu_to_le32(info
));
83 WRITE_ONCE(desc
->ctrl
, cpu_to_le32(ctrl
));
88 q
->entry
[idx
].txwi
= txwi
;
89 q
->entry
[idx
].skb
= skb
;
95 mt76_dma_tx_cleanup_idx(struct mt76_dev
*dev
, struct mt76_queue
*q
, int idx
,
96 struct mt76_queue_entry
*prev_e
)
98 struct mt76_queue_entry
*e
= &q
->entry
[idx
];
99 __le32 __ctrl
= READ_ONCE(q
->desc
[idx
].ctrl
);
100 u32 ctrl
= le32_to_cpu(__ctrl
);
103 __le32 addr
= READ_ONCE(q
->desc
[idx
].buf0
);
104 u32 len
= FIELD_GET(MT_DMA_CTL_SD_LEN0
, ctrl
);
106 dma_unmap_single(dev
->dev
, le32_to_cpu(addr
), len
,
110 if (!(ctrl
& MT_DMA_CTL_LAST_SEC0
)) {
111 __le32 addr
= READ_ONCE(q
->desc
[idx
].buf1
);
112 u32 len
= FIELD_GET(MT_DMA_CTL_SD_LEN1
, ctrl
);
114 dma_unmap_single(dev
->dev
, le32_to_cpu(addr
), len
,
118 if (e
->txwi
== DMA_DUMMY_DATA
)
121 if (e
->skb
== DMA_DUMMY_DATA
)
125 memset(e
, 0, sizeof(*e
));
129 mt76_dma_sync_idx(struct mt76_dev
*dev
, struct mt76_queue
*q
)
131 writel(q
->desc_dma
, &q
->regs
->desc_base
);
132 writel(q
->ndesc
, &q
->regs
->ring_size
);
133 q
->head
= readl(&q
->regs
->dma_idx
);
135 writel(q
->head
, &q
->regs
->cpu_idx
);
139 mt76_dma_tx_cleanup(struct mt76_dev
*dev
, enum mt76_txq_id qid
, bool flush
)
141 struct mt76_sw_queue
*sq
= &dev
->q_tx
[qid
];
142 struct mt76_queue
*q
= sq
->q
;
143 struct mt76_queue_entry entry
;
144 unsigned int n_swq_queued
[4] = {};
145 unsigned int n_queued
= 0;
155 last
= readl(&q
->regs
->dma_idx
);
157 while ((q
->queued
> n_queued
) && q
->tail
!= last
) {
158 mt76_dma_tx_cleanup_idx(dev
, q
, q
->tail
, &entry
);
160 n_swq_queued
[entry
.qid
]++;
162 q
->tail
= (q
->tail
+ 1) % q
->ndesc
;
166 dev
->drv
->tx_complete_skb(dev
, qid
, &entry
);
169 if (!(dev
->drv
->drv_flags
& MT_DRV_TXWI_NO_FREE
))
170 mt76_put_txwi(dev
, entry
.txwi
);
174 if (!flush
&& q
->tail
== last
)
175 last
= readl(&q
->regs
->dma_idx
);
178 spin_lock_bh(&q
->lock
);
180 q
->queued
-= n_queued
;
181 for (i
= 0; i
< ARRAY_SIZE(n_swq_queued
); i
++) {
182 if (!n_swq_queued
[i
])
185 dev
->q_tx
[i
].swq_queued
-= n_swq_queued
[i
];
189 mt76_dma_sync_idx(dev
, q
);
191 wake
= wake
&& q
->stopped
&&
192 qid
< IEEE80211_NUM_ACS
&& q
->queued
< q
->ndesc
- 8;
197 wake_up(&dev
->tx_wait
);
199 spin_unlock_bh(&q
->lock
);
202 ieee80211_wake_queue(dev
->hw
, qid
);
206 mt76_dma_get_buf(struct mt76_dev
*dev
, struct mt76_queue
*q
, int idx
,
207 int *len
, u32
*info
, bool *more
)
209 struct mt76_queue_entry
*e
= &q
->entry
[idx
];
210 struct mt76_desc
*desc
= &q
->desc
[idx
];
213 int buf_len
= SKB_WITH_OVERHEAD(q
->buf_size
);
215 buf_addr
= le32_to_cpu(READ_ONCE(desc
->buf0
));
217 u32 ctl
= le32_to_cpu(READ_ONCE(desc
->ctrl
));
218 *len
= FIELD_GET(MT_DMA_CTL_SD_LEN0
, ctl
);
219 *more
= !(ctl
& MT_DMA_CTL_LAST_SEC0
);
223 *info
= le32_to_cpu(desc
->info
);
225 dma_unmap_single(dev
->dev
, buf_addr
, buf_len
, DMA_FROM_DEVICE
);
232 mt76_dma_dequeue(struct mt76_dev
*dev
, struct mt76_queue
*q
, bool flush
,
233 int *len
, u32
*info
, bool *more
)
241 if (!flush
&& !(q
->desc
[idx
].ctrl
& cpu_to_le32(MT_DMA_CTL_DMA_DONE
)))
244 q
->tail
= (q
->tail
+ 1) % q
->ndesc
;
247 return mt76_dma_get_buf(dev
, q
, idx
, len
, info
, more
);
251 mt76_dma_kick_queue(struct mt76_dev
*dev
, struct mt76_queue
*q
)
253 writel(q
->head
, &q
->regs
->cpu_idx
);
257 mt76_dma_tx_queue_skb_raw(struct mt76_dev
*dev
, enum mt76_txq_id qid
,
258 struct sk_buff
*skb
, u32 tx_info
)
260 struct mt76_queue
*q
= dev
->q_tx
[qid
].q
;
261 struct mt76_queue_buf buf
;
264 addr
= dma_map_single(dev
->dev
, skb
->data
, skb
->len
,
266 if (unlikely(dma_mapping_error(dev
->dev
, addr
)))
272 spin_lock_bh(&q
->lock
);
273 mt76_dma_add_buf(dev
, q
, &buf
, 1, tx_info
, skb
, NULL
);
274 mt76_dma_kick_queue(dev
, q
);
275 spin_unlock_bh(&q
->lock
);
281 mt76_dma_tx_queue_skb(struct mt76_dev
*dev
, enum mt76_txq_id qid
,
282 struct sk_buff
*skb
, struct mt76_wcid
*wcid
,
283 struct ieee80211_sta
*sta
)
285 struct mt76_queue
*q
= dev
->q_tx
[qid
].q
;
286 struct mt76_tx_info tx_info
= {
289 int len
, n
= 0, ret
= -ENOMEM
;
290 struct mt76_queue_entry e
;
291 struct mt76_txwi_cache
*t
;
292 struct sk_buff
*iter
;
296 t
= mt76_get_txwi(dev
);
298 ieee80211_free_txskb(dev
->hw
, skb
);
301 txwi
= mt76_get_txwi_ptr(dev
, t
);
303 skb
->prev
= skb
->next
= NULL
;
304 if (dev
->drv
->drv_flags
& MT_DRV_TX_ALIGNED4_SKBS
)
305 mt76_insert_hdr_pad(skb
);
307 len
= skb_headlen(skb
);
308 addr
= dma_map_single(dev
->dev
, skb
->data
, len
, DMA_TO_DEVICE
);
309 if (unlikely(dma_mapping_error(dev
->dev
, addr
)))
312 tx_info
.buf
[n
].addr
= t
->dma_addr
;
313 tx_info
.buf
[n
++].len
= dev
->drv
->txwi_size
;
314 tx_info
.buf
[n
].addr
= addr
;
315 tx_info
.buf
[n
++].len
= len
;
317 skb_walk_frags(skb
, iter
) {
318 if (n
== ARRAY_SIZE(tx_info
.buf
))
321 addr
= dma_map_single(dev
->dev
, iter
->data
, iter
->len
,
323 if (unlikely(dma_mapping_error(dev
->dev
, addr
)))
326 tx_info
.buf
[n
].addr
= addr
;
327 tx_info
.buf
[n
++].len
= iter
->len
;
331 dma_sync_single_for_cpu(dev
->dev
, t
->dma_addr
, dev
->drv
->txwi_size
,
333 ret
= dev
->drv
->tx_prepare_skb(dev
, txwi
, qid
, wcid
, sta
, &tx_info
);
334 dma_sync_single_for_device(dev
->dev
, t
->dma_addr
, dev
->drv
->txwi_size
,
339 if (q
->queued
+ (tx_info
.nbuf
+ 1) / 2 >= q
->ndesc
- 1) {
344 return mt76_dma_add_buf(dev
, q
, tx_info
.buf
, tx_info
.nbuf
,
345 tx_info
.info
, tx_info
.skb
, t
);
348 for (n
--; n
> 0; n
--)
349 dma_unmap_single(dev
->dev
, tx_info
.buf
[n
].addr
,
350 tx_info
.buf
[n
].len
, DMA_TO_DEVICE
);
355 dev
->drv
->tx_complete_skb(dev
, qid
, &e
);
356 mt76_put_txwi(dev
, t
);
361 mt76_dma_rx_fill(struct mt76_dev
*dev
, struct mt76_queue
*q
)
366 int len
= SKB_WITH_OVERHEAD(q
->buf_size
);
367 int offset
= q
->buf_offset
;
369 spin_lock_bh(&q
->lock
);
371 while (q
->queued
< q
->ndesc
- 1) {
372 struct mt76_queue_buf qbuf
;
374 buf
= page_frag_alloc(&q
->rx_page
, q
->buf_size
, GFP_ATOMIC
);
378 addr
= dma_map_single(dev
->dev
, buf
, len
, DMA_FROM_DEVICE
);
379 if (unlikely(dma_mapping_error(dev
->dev
, addr
))) {
384 qbuf
.addr
= addr
+ offset
;
385 qbuf
.len
= len
- offset
;
386 mt76_dma_add_buf(dev
, q
, &qbuf
, 1, 0, buf
, NULL
);
391 mt76_dma_kick_queue(dev
, q
);
393 spin_unlock_bh(&q
->lock
);
399 mt76_dma_rx_cleanup(struct mt76_dev
*dev
, struct mt76_queue
*q
)
405 spin_lock_bh(&q
->lock
);
407 buf
= mt76_dma_dequeue(dev
, q
, true, NULL
, NULL
, &more
);
413 spin_unlock_bh(&q
->lock
);
418 page
= virt_to_page(q
->rx_page
.va
);
419 __page_frag_cache_drain(page
, q
->rx_page
.pagecnt_bias
);
420 memset(&q
->rx_page
, 0, sizeof(q
->rx_page
));
424 mt76_dma_rx_reset(struct mt76_dev
*dev
, enum mt76_rxq_id qid
)
426 struct mt76_queue
*q
= &dev
->q_rx
[qid
];
429 for (i
= 0; i
< q
->ndesc
; i
++)
430 q
->desc
[i
].ctrl
&= ~cpu_to_le32(MT_DMA_CTL_DMA_DONE
);
432 mt76_dma_rx_cleanup(dev
, q
);
433 mt76_dma_sync_idx(dev
, q
);
434 mt76_dma_rx_fill(dev
, q
);
439 dev_kfree_skb(q
->rx_head
);
444 mt76_add_fragment(struct mt76_dev
*dev
, struct mt76_queue
*q
, void *data
,
447 struct page
*page
= virt_to_head_page(data
);
448 int offset
= data
- page_address(page
);
449 struct sk_buff
*skb
= q
->rx_head
;
451 offset
+= q
->buf_offset
;
452 skb_add_rx_frag(skb
, skb_shinfo(skb
)->nr_frags
, page
, offset
, len
,
459 dev
->drv
->rx_skb(dev
, q
- dev
->q_rx
, skb
);
463 mt76_dma_rx_process(struct mt76_dev
*dev
, struct mt76_queue
*q
, int budget
)
465 int len
, data_len
, done
= 0;
470 while (done
< budget
) {
473 data
= mt76_dma_dequeue(dev
, q
, false, &len
, &info
, &more
);
478 data_len
= q
->buf_size
;
480 data_len
= SKB_WITH_OVERHEAD(q
->buf_size
);
482 if (data_len
< len
+ q
->buf_offset
) {
483 dev_kfree_skb(q
->rx_head
);
491 mt76_add_fragment(dev
, q
, data
, len
, more
);
495 skb
= build_skb(data
, q
->buf_size
);
500 skb_reserve(skb
, q
->buf_offset
);
502 if (q
== &dev
->q_rx
[MT_RXQ_MCU
]) {
503 u32
*rxfce
= (u32
*)skb
->cb
;
515 dev
->drv
->rx_skb(dev
, q
- dev
->q_rx
, skb
);
518 mt76_dma_rx_fill(dev
, q
);
523 mt76_dma_rx_poll(struct napi_struct
*napi
, int budget
)
525 struct mt76_dev
*dev
;
526 int qid
, done
= 0, cur
;
528 dev
= container_of(napi
->dev
, struct mt76_dev
, napi_dev
);
529 qid
= napi
- dev
->napi
;
534 cur
= mt76_dma_rx_process(dev
, &dev
->q_rx
[qid
], budget
- done
);
535 mt76_rx_poll_complete(dev
, qid
, napi
);
537 } while (cur
&& done
< budget
);
541 if (done
< budget
&& napi_complete(napi
))
542 dev
->drv
->rx_poll_complete(dev
, qid
);
548 mt76_dma_init(struct mt76_dev
*dev
)
552 init_dummy_netdev(&dev
->napi_dev
);
554 for (i
= 0; i
< ARRAY_SIZE(dev
->q_rx
); i
++) {
555 netif_napi_add(&dev
->napi_dev
, &dev
->napi
[i
], mt76_dma_rx_poll
,
557 mt76_dma_rx_fill(dev
, &dev
->q_rx
[i
]);
558 skb_queue_head_init(&dev
->rx_skb
[i
]);
559 napi_enable(&dev
->napi
[i
]);
565 static const struct mt76_queue_ops mt76_dma_ops
= {
566 .init
= mt76_dma_init
,
567 .alloc
= mt76_dma_alloc_queue
,
568 .tx_queue_skb_raw
= mt76_dma_tx_queue_skb_raw
,
569 .tx_queue_skb
= mt76_dma_tx_queue_skb
,
570 .tx_cleanup
= mt76_dma_tx_cleanup
,
571 .rx_reset
= mt76_dma_rx_reset
,
572 .kick
= mt76_dma_kick_queue
,
575 void mt76_dma_attach(struct mt76_dev
*dev
)
577 dev
->queue_ops
= &mt76_dma_ops
;
579 EXPORT_SYMBOL_GPL(mt76_dma_attach
);
581 void mt76_dma_cleanup(struct mt76_dev
*dev
)
585 netif_napi_del(&dev
->tx_napi
);
586 for (i
= 0; i
< ARRAY_SIZE(dev
->q_tx
); i
++)
587 mt76_dma_tx_cleanup(dev
, i
, true);
589 for (i
= 0; i
< ARRAY_SIZE(dev
->q_rx
); i
++) {
590 netif_napi_del(&dev
->napi
[i
]);
591 mt76_dma_rx_cleanup(dev
, &dev
->q_rx
[i
]);
594 EXPORT_SYMBOL_GPL(mt76_dma_cleanup
);