dma.c 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459
  1. /*
  2. * Copyright (C) 2016 Felix Fietkau <nbd@nbd.name>
  3. *
  4. * Permission to use, copy, modify, and/or distribute this software for any
  5. * purpose with or without fee is hereby granted, provided that the above
  6. * copyright notice and this permission notice appear in all copies.
  7. *
  8. * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
  9. * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
  10. * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
  11. * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
  12. * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
  13. * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
  14. * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  15. */
  16. #include <linux/dma-mapping.h>
  17. #include "mt76.h"
  18. #include "dma.h"
  19. #define DMA_DUMMY_TXWI ((void *) ~0)
  20. static int
  21. mt76_dma_alloc_queue(struct mt76_dev *dev, struct mt76_queue *q)
  22. {
  23. int size;
  24. int i;
  25. spin_lock_init(&q->lock);
  26. INIT_LIST_HEAD(&q->swq);
  27. size = q->ndesc * sizeof(struct mt76_desc);
  28. q->desc = dmam_alloc_coherent(dev->dev, size, &q->desc_dma, GFP_KERNEL);
  29. if (!q->desc)
  30. return -ENOMEM;
  31. size = q->ndesc * sizeof(*q->entry);
  32. q->entry = devm_kzalloc(dev->dev, size, GFP_KERNEL);
  33. if (!q->entry)
  34. return -ENOMEM;
  35. /* clear descriptors */
  36. for (i = 0; i < q->ndesc; i++)
  37. q->desc[i].ctrl = cpu_to_le32(MT_DMA_CTL_DMA_DONE);
  38. iowrite32(q->desc_dma, &q->regs->desc_base);
  39. iowrite32(0, &q->regs->cpu_idx);
  40. iowrite32(0, &q->regs->dma_idx);
  41. iowrite32(q->ndesc, &q->regs->ring_size);
  42. return 0;
  43. }
  44. static int
  45. mt76_dma_add_buf(struct mt76_dev *dev, struct mt76_queue *q,
  46. struct mt76_queue_buf *buf, int nbufs, u32 info,
  47. struct sk_buff *skb, void *txwi)
  48. {
  49. struct mt76_desc *desc;
  50. u32 ctrl;
  51. int i, idx = -1;
  52. if (txwi)
  53. q->entry[q->head].txwi = DMA_DUMMY_TXWI;
  54. for (i = 0; i < nbufs; i += 2, buf += 2) {
  55. u32 buf0 = buf[0].addr, buf1 = 0;
  56. ctrl = FIELD_PREP(MT_DMA_CTL_SD_LEN0, buf[0].len);
  57. if (i < nbufs - 1) {
  58. buf1 = buf[1].addr;
  59. ctrl |= FIELD_PREP(MT_DMA_CTL_SD_LEN1, buf[1].len);
  60. }
  61. if (i == nbufs - 1)
  62. ctrl |= MT_DMA_CTL_LAST_SEC0;
  63. else if (i == nbufs - 2)
  64. ctrl |= MT_DMA_CTL_LAST_SEC1;
  65. idx = q->head;
  66. q->head = (q->head + 1) % q->ndesc;
  67. desc = &q->desc[idx];
  68. WRITE_ONCE(desc->buf0, cpu_to_le32(buf0));
  69. WRITE_ONCE(desc->buf1, cpu_to_le32(buf1));
  70. WRITE_ONCE(desc->info, cpu_to_le32(info));
  71. WRITE_ONCE(desc->ctrl, cpu_to_le32(ctrl));
  72. q->queued++;
  73. }
  74. q->entry[idx].txwi = txwi;
  75. q->entry[idx].skb = skb;
  76. return idx;
  77. }
  78. static void
  79. mt76_dma_tx_cleanup_idx(struct mt76_dev *dev, struct mt76_queue *q, int idx,
  80. struct mt76_queue_entry *prev_e)
  81. {
  82. struct mt76_queue_entry *e = &q->entry[idx];
  83. __le32 __ctrl = READ_ONCE(q->desc[idx].ctrl);
  84. u32 ctrl = le32_to_cpu(__ctrl);
  85. if (!e->txwi || !e->skb) {
  86. __le32 addr = READ_ONCE(q->desc[idx].buf0);
  87. u32 len = FIELD_GET(MT_DMA_CTL_SD_LEN0, ctrl);
  88. dma_unmap_single(dev->dev, le32_to_cpu(addr), len,
  89. DMA_TO_DEVICE);
  90. }
  91. if (!(ctrl & MT_DMA_CTL_LAST_SEC0)) {
  92. __le32 addr = READ_ONCE(q->desc[idx].buf1);
  93. u32 len = FIELD_GET(MT_DMA_CTL_SD_LEN1, ctrl);
  94. dma_unmap_single(dev->dev, le32_to_cpu(addr), len,
  95. DMA_TO_DEVICE);
  96. }
  97. if (e->txwi == DMA_DUMMY_TXWI)
  98. e->txwi = NULL;
  99. *prev_e = *e;
  100. memset(e, 0, sizeof(*e));
  101. }
  102. static void
  103. mt76_dma_sync_idx(struct mt76_dev *dev, struct mt76_queue *q)
  104. {
  105. q->head = ioread32(&q->regs->dma_idx);
  106. q->tail = q->head;
  107. iowrite32(q->head, &q->regs->cpu_idx);
  108. }
  109. static void
  110. mt76_dma_tx_cleanup(struct mt76_dev *dev, enum mt76_txq_id qid, bool flush)
  111. {
  112. struct mt76_queue *q = &dev->q_tx[qid];
  113. struct mt76_queue_entry entry;
  114. bool wake = false;
  115. int last;
  116. if (!q->ndesc)
  117. return;
  118. spin_lock_bh(&q->lock);
  119. if (flush)
  120. last = -1;
  121. else
  122. last = ioread32(&q->regs->dma_idx);
  123. while (q->queued && q->tail != last) {
  124. mt76_dma_tx_cleanup_idx(dev, q, q->tail, &entry);
  125. if (entry.schedule)
  126. q->swq_queued--;
  127. if (entry.skb)
  128. dev->drv->tx_complete_skb(dev, q, &entry, flush);
  129. if (entry.txwi) {
  130. mt76_put_txwi(dev, entry.txwi);
  131. wake = true;
  132. }
  133. q->tail = (q->tail + 1) % q->ndesc;
  134. q->queued--;
  135. if (!flush && q->tail == last)
  136. last = ioread32(&q->regs->dma_idx);
  137. }
  138. if (!flush)
  139. mt76_txq_schedule(dev, q);
  140. else
  141. mt76_dma_sync_idx(dev, q);
  142. wake = wake && qid < IEEE80211_NUM_ACS && q->queued < q->ndesc - 8;
  143. spin_unlock_bh(&q->lock);
  144. if (wake)
  145. ieee80211_wake_queue(dev->hw, qid);
  146. }
  147. static void *
  148. mt76_dma_get_buf(struct mt76_dev *dev, struct mt76_queue *q, int idx,
  149. int *len, u32 *info, bool *more)
  150. {
  151. struct mt76_queue_entry *e = &q->entry[idx];
  152. struct mt76_desc *desc = &q->desc[idx];
  153. dma_addr_t buf_addr;
  154. void *buf = e->buf;
  155. int buf_len = SKB_WITH_OVERHEAD(q->buf_size);
  156. buf_addr = le32_to_cpu(READ_ONCE(desc->buf0));
  157. if (len) {
  158. u32 ctl = le32_to_cpu(READ_ONCE(desc->ctrl));
  159. *len = FIELD_GET(MT_DMA_CTL_SD_LEN0, ctl);
  160. *more = !(ctl & MT_DMA_CTL_LAST_SEC0);
  161. }
  162. if (info)
  163. *info = le32_to_cpu(desc->info);
  164. dma_unmap_single(dev->dev, buf_addr, buf_len, DMA_FROM_DEVICE);
  165. e->buf = NULL;
  166. return buf;
  167. }
  168. static void *
  169. mt76_dma_dequeue(struct mt76_dev *dev, struct mt76_queue *q, bool flush,
  170. int *len, u32 *info, bool *more)
  171. {
  172. int idx = q->tail;
  173. *more = false;
  174. if (!q->queued)
  175. return NULL;
  176. if (!flush && !(q->desc[idx].ctrl & cpu_to_le32(MT_DMA_CTL_DMA_DONE)))
  177. return NULL;
  178. q->tail = (q->tail + 1) % q->ndesc;
  179. q->queued--;
  180. return mt76_dma_get_buf(dev, q, idx, len, info, more);
  181. }
  182. static void
  183. mt76_dma_kick_queue(struct mt76_dev *dev, struct mt76_queue *q)
  184. {
  185. iowrite32(q->head, &q->regs->cpu_idx);
  186. }
  187. static int
  188. mt76_dma_rx_fill(struct mt76_dev *dev, struct mt76_queue *q, bool napi)
  189. {
  190. dma_addr_t addr;
  191. void *buf;
  192. int frames = 0;
  193. int len = SKB_WITH_OVERHEAD(q->buf_size);
  194. int offset = q->buf_offset;
  195. int idx;
  196. void *(*alloc)(unsigned int fragsz);
  197. if (napi)
  198. alloc = napi_alloc_frag;
  199. else
  200. alloc = netdev_alloc_frag;
  201. spin_lock_bh(&q->lock);
  202. while (q->queued < q->ndesc - 1) {
  203. struct mt76_queue_buf qbuf;
  204. buf = alloc(q->buf_size);
  205. if (!buf)
  206. break;
  207. addr = dma_map_single(dev->dev, buf, len, DMA_FROM_DEVICE);
  208. if (dma_mapping_error(dev->dev, addr)) {
  209. skb_free_frag(buf);
  210. break;
  211. }
  212. qbuf.addr = addr + offset;
  213. qbuf.len = len - offset;
  214. idx = mt76_dma_add_buf(dev, q, &qbuf, 1, 0, buf, NULL);
  215. frames++;
  216. }
  217. if (frames)
  218. mt76_dma_kick_queue(dev, q);
  219. spin_unlock_bh(&q->lock);
  220. return frames;
  221. }
  222. static void
  223. mt76_dma_rx_cleanup(struct mt76_dev *dev, struct mt76_queue *q)
  224. {
  225. void *buf;
  226. bool more;
  227. spin_lock_bh(&q->lock);
  228. do {
  229. buf = mt76_dma_dequeue(dev, q, true, NULL, NULL, &more);
  230. if (!buf)
  231. break;
  232. skb_free_frag(buf);
  233. } while (1);
  234. spin_unlock_bh(&q->lock);
  235. }
  236. static void
  237. mt76_dma_rx_reset(struct mt76_dev *dev, enum mt76_rxq_id qid)
  238. {
  239. struct mt76_queue *q = &dev->q_rx[qid];
  240. int i;
  241. for (i = 0; i < q->ndesc; i++)
  242. q->desc[i].ctrl &= ~cpu_to_le32(MT_DMA_CTL_DMA_DONE);
  243. mt76_dma_rx_cleanup(dev, q);
  244. mt76_dma_sync_idx(dev, q);
  245. mt76_dma_rx_fill(dev, q, false);
  246. }
  247. static void
  248. mt76_add_fragment(struct mt76_dev *dev, struct mt76_queue *q, void *data,
  249. int len, bool more)
  250. {
  251. struct page *page = virt_to_head_page(data);
  252. int offset = data - page_address(page);
  253. struct sk_buff *skb = q->rx_head;
  254. offset += q->buf_offset;
  255. skb_add_rx_frag(skb, skb_shinfo(skb)->nr_frags, page, offset, len,
  256. q->buf_size);
  257. if (more)
  258. return;
  259. q->rx_head = NULL;
  260. dev->drv->rx_skb(dev, q - dev->q_rx, skb);
  261. }
  262. static int
  263. mt76_dma_rx_process(struct mt76_dev *dev, struct mt76_queue *q, int budget)
  264. {
  265. struct sk_buff *skb;
  266. unsigned char *data;
  267. int len;
  268. int done = 0;
  269. bool more;
  270. while (done < budget) {
  271. u32 info;
  272. data = mt76_dma_dequeue(dev, q, false, &len, &info, &more);
  273. if (!data)
  274. break;
  275. if (q->rx_head) {
  276. mt76_add_fragment(dev, q, data, len, more);
  277. continue;
  278. }
  279. skb = build_skb(data, q->buf_size);
  280. if (!skb) {
  281. skb_free_frag(data);
  282. continue;
  283. }
  284. skb_reserve(skb, q->buf_offset);
  285. if (skb->tail + len > skb->end) {
  286. dev_kfree_skb(skb);
  287. continue;
  288. }
  289. if (q == &dev->q_rx[MT_RXQ_MCU]) {
  290. u32 *rxfce = (u32 *) skb->cb;
  291. *rxfce = info;
  292. }
  293. __skb_put(skb, len);
  294. done++;
  295. if (more) {
  296. q->rx_head = skb;
  297. continue;
  298. }
  299. dev->drv->rx_skb(dev, q - dev->q_rx, skb);
  300. }
  301. mt76_dma_rx_fill(dev, q, true);
  302. return done;
  303. }
  304. static int
  305. mt76_dma_rx_poll(struct napi_struct *napi, int budget)
  306. {
  307. struct mt76_dev *dev;
  308. int qid, done = 0, cur;
  309. dev = container_of(napi->dev, struct mt76_dev, napi_dev);
  310. qid = napi - dev->napi;
  311. rcu_read_lock();
  312. do {
  313. cur = mt76_dma_rx_process(dev, &dev->q_rx[qid], budget - done);
  314. mt76_rx_poll_complete(dev, qid);
  315. done += cur;
  316. } while (cur && done < budget);
  317. rcu_read_unlock();
  318. if (done < budget) {
  319. napi_complete(napi);
  320. dev->drv->rx_poll_complete(dev, qid);
  321. }
  322. return done;
  323. }
  324. static int
  325. mt76_dma_init(struct mt76_dev *dev)
  326. {
  327. int i;
  328. init_dummy_netdev(&dev->napi_dev);
  329. for (i = 0; i < ARRAY_SIZE(dev->q_rx); i++) {
  330. netif_napi_add(&dev->napi_dev, &dev->napi[i], mt76_dma_rx_poll,
  331. 64);
  332. mt76_dma_rx_fill(dev, &dev->q_rx[i], false);
  333. skb_queue_head_init(&dev->rx_skb[i]);
  334. napi_enable(&dev->napi[i]);
  335. }
  336. return 0;
  337. }
  338. static const struct mt76_queue_ops mt76_dma_ops = {
  339. .init = mt76_dma_init,
  340. .alloc = mt76_dma_alloc_queue,
  341. .add_buf = mt76_dma_add_buf,
  342. .tx_cleanup = mt76_dma_tx_cleanup,
  343. .rx_reset = mt76_dma_rx_reset,
  344. .kick = mt76_dma_kick_queue,
  345. };
  346. int mt76_dma_attach(struct mt76_dev *dev)
  347. {
  348. dev->queue_ops = &mt76_dma_ops;
  349. return 0;
  350. }
  351. EXPORT_SYMBOL_GPL(mt76_dma_attach);
  352. void mt76_dma_cleanup(struct mt76_dev *dev)
  353. {
  354. int i;
  355. for (i = 0; i < ARRAY_SIZE(dev->q_tx); i++)
  356. mt76_dma_tx_cleanup(dev, i, true);
  357. for (i = 0; i < ARRAY_SIZE(dev->q_rx); i++) {
  358. netif_napi_del(&dev->napi[i]);
  359. mt76_dma_rx_cleanup(dev, &dev->q_rx[i]);
  360. }
  361. }
  362. EXPORT_SYMBOL_GPL(mt76_dma_cleanup);