dma.c 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546
  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. if (!q->queued)
  144. wake_up(&dev->tx_wait);
  145. spin_unlock_bh(&q->lock);
  146. if (wake)
  147. ieee80211_wake_queue(dev->hw, qid);
  148. }
  149. static void *
  150. mt76_dma_get_buf(struct mt76_dev *dev, struct mt76_queue *q, int idx,
  151. int *len, u32 *info, bool *more)
  152. {
  153. struct mt76_queue_entry *e = &q->entry[idx];
  154. struct mt76_desc *desc = &q->desc[idx];
  155. dma_addr_t buf_addr;
  156. void *buf = e->buf;
  157. int buf_len = SKB_WITH_OVERHEAD(q->buf_size);
  158. buf_addr = le32_to_cpu(READ_ONCE(desc->buf0));
  159. if (len) {
  160. u32 ctl = le32_to_cpu(READ_ONCE(desc->ctrl));
  161. *len = FIELD_GET(MT_DMA_CTL_SD_LEN0, ctl);
  162. *more = !(ctl & MT_DMA_CTL_LAST_SEC0);
  163. }
  164. if (info)
  165. *info = le32_to_cpu(desc->info);
  166. dma_unmap_single(dev->dev, buf_addr, buf_len, DMA_FROM_DEVICE);
  167. e->buf = NULL;
  168. return buf;
  169. }
  170. static void *
  171. mt76_dma_dequeue(struct mt76_dev *dev, struct mt76_queue *q, bool flush,
  172. int *len, u32 *info, bool *more)
  173. {
  174. int idx = q->tail;
  175. *more = false;
  176. if (!q->queued)
  177. return NULL;
  178. if (!flush && !(q->desc[idx].ctrl & cpu_to_le32(MT_DMA_CTL_DMA_DONE)))
  179. return NULL;
  180. q->tail = (q->tail + 1) % q->ndesc;
  181. q->queued--;
  182. return mt76_dma_get_buf(dev, q, idx, len, info, more);
  183. }
  184. static void
  185. mt76_dma_kick_queue(struct mt76_dev *dev, struct mt76_queue *q)
  186. {
  187. iowrite32(q->head, &q->regs->cpu_idx);
  188. }
  189. int mt76_dma_tx_queue_skb(struct mt76_dev *dev, struct mt76_queue *q,
  190. struct sk_buff *skb, struct mt76_wcid *wcid,
  191. struct ieee80211_sta *sta)
  192. {
  193. struct mt76_queue_entry e;
  194. struct mt76_txwi_cache *t;
  195. struct mt76_queue_buf buf[32];
  196. struct sk_buff *iter;
  197. dma_addr_t addr;
  198. int len;
  199. u32 tx_info = 0;
  200. int n, ret;
  201. t = mt76_get_txwi(dev);
  202. if (!t) {
  203. ieee80211_free_txskb(dev->hw, skb);
  204. return -ENOMEM;
  205. }
  206. dma_sync_single_for_cpu(dev->dev, t->dma_addr, sizeof(t->txwi),
  207. DMA_TO_DEVICE);
  208. ret = dev->drv->tx_prepare_skb(dev, &t->txwi, skb, q, wcid, sta,
  209. &tx_info);
  210. dma_sync_single_for_device(dev->dev, t->dma_addr, sizeof(t->txwi),
  211. DMA_TO_DEVICE);
  212. if (ret < 0)
  213. goto free;
  214. len = skb->len - skb->data_len;
  215. addr = dma_map_single(dev->dev, skb->data, len, DMA_TO_DEVICE);
  216. if (dma_mapping_error(dev->dev, addr)) {
  217. ret = -ENOMEM;
  218. goto free;
  219. }
  220. n = 0;
  221. buf[n].addr = t->dma_addr;
  222. buf[n++].len = dev->drv->txwi_size;
  223. buf[n].addr = addr;
  224. buf[n++].len = len;
  225. skb_walk_frags(skb, iter) {
  226. if (n == ARRAY_SIZE(buf))
  227. goto unmap;
  228. addr = dma_map_single(dev->dev, iter->data, iter->len,
  229. DMA_TO_DEVICE);
  230. if (dma_mapping_error(dev->dev, addr))
  231. goto unmap;
  232. buf[n].addr = addr;
  233. buf[n++].len = iter->len;
  234. }
  235. if (q->queued + (n + 1) / 2 >= q->ndesc - 1)
  236. goto unmap;
  237. return dev->queue_ops->add_buf(dev, q, buf, n, tx_info, skb, t);
  238. unmap:
  239. ret = -ENOMEM;
  240. for (n--; n > 0; n--)
  241. dma_unmap_single(dev->dev, buf[n].addr, buf[n].len,
  242. DMA_TO_DEVICE);
  243. free:
  244. e.skb = skb;
  245. e.txwi = t;
  246. dev->drv->tx_complete_skb(dev, q, &e, true);
  247. mt76_put_txwi(dev, t);
  248. return ret;
  249. }
  250. EXPORT_SYMBOL_GPL(mt76_dma_tx_queue_skb);
  251. static int
  252. mt76_dma_rx_fill(struct mt76_dev *dev, struct mt76_queue *q, bool napi)
  253. {
  254. dma_addr_t addr;
  255. void *buf;
  256. int frames = 0;
  257. int len = SKB_WITH_OVERHEAD(q->buf_size);
  258. int offset = q->buf_offset;
  259. int idx;
  260. void *(*alloc)(unsigned int fragsz);
  261. if (napi)
  262. alloc = napi_alloc_frag;
  263. else
  264. alloc = netdev_alloc_frag;
  265. spin_lock_bh(&q->lock);
  266. while (q->queued < q->ndesc - 1) {
  267. struct mt76_queue_buf qbuf;
  268. buf = alloc(q->buf_size);
  269. if (!buf)
  270. break;
  271. addr = dma_map_single(dev->dev, buf, len, DMA_FROM_DEVICE);
  272. if (dma_mapping_error(dev->dev, addr)) {
  273. skb_free_frag(buf);
  274. break;
  275. }
  276. qbuf.addr = addr + offset;
  277. qbuf.len = len - offset;
  278. idx = mt76_dma_add_buf(dev, q, &qbuf, 1, 0, buf, NULL);
  279. frames++;
  280. }
  281. if (frames)
  282. mt76_dma_kick_queue(dev, q);
  283. spin_unlock_bh(&q->lock);
  284. return frames;
  285. }
  286. static void
  287. mt76_dma_rx_cleanup(struct mt76_dev *dev, struct mt76_queue *q)
  288. {
  289. void *buf;
  290. bool more;
  291. spin_lock_bh(&q->lock);
  292. do {
  293. buf = mt76_dma_dequeue(dev, q, true, NULL, NULL, &more);
  294. if (!buf)
  295. break;
  296. skb_free_frag(buf);
  297. } while (1);
  298. spin_unlock_bh(&q->lock);
  299. }
  300. static void
  301. mt76_dma_rx_reset(struct mt76_dev *dev, enum mt76_rxq_id qid)
  302. {
  303. struct mt76_queue *q = &dev->q_rx[qid];
  304. int i;
  305. for (i = 0; i < q->ndesc; i++)
  306. q->desc[i].ctrl &= ~cpu_to_le32(MT_DMA_CTL_DMA_DONE);
  307. mt76_dma_rx_cleanup(dev, q);
  308. mt76_dma_sync_idx(dev, q);
  309. mt76_dma_rx_fill(dev, q, false);
  310. }
  311. static void
  312. mt76_add_fragment(struct mt76_dev *dev, struct mt76_queue *q, void *data,
  313. int len, bool more)
  314. {
  315. struct sk_buff *skb = q->rx_head;
  316. struct skb_shared_info *shinfo = skb_shinfo(skb);
  317. int nr_frags = shinfo->nr_frags;
  318. if (nr_frags < ARRAY_SIZE(shinfo->frags)) {
  319. struct page *page = virt_to_head_page(data);
  320. int offset = data - page_address(page) + q->buf_offset;
  321. skb_add_rx_frag(skb, nr_frags, page, offset, len, q->buf_size);
  322. } else {
  323. skb_free_frag(data);
  324. }
  325. if (more)
  326. return;
  327. q->rx_head = NULL;
  328. if (nr_frags < ARRAY_SIZE(shinfo->frags))
  329. dev->drv->rx_skb(dev, q - dev->q_rx, skb);
  330. else
  331. dev_kfree_skb(skb);
  332. }
  333. static int
  334. mt76_dma_rx_process(struct mt76_dev *dev, struct mt76_queue *q, int budget)
  335. {
  336. struct sk_buff *skb;
  337. unsigned char *data;
  338. int len;
  339. int done = 0;
  340. bool more;
  341. while (done < budget) {
  342. u32 info;
  343. data = mt76_dma_dequeue(dev, q, false, &len, &info, &more);
  344. if (!data)
  345. break;
  346. if (q->rx_head) {
  347. mt76_add_fragment(dev, q, data, len, more);
  348. continue;
  349. }
  350. skb = build_skb(data, q->buf_size);
  351. if (!skb) {
  352. skb_free_frag(data);
  353. continue;
  354. }
  355. skb_reserve(skb, q->buf_offset);
  356. if (skb->tail + len > skb->end) {
  357. dev_kfree_skb(skb);
  358. continue;
  359. }
  360. if (q == &dev->q_rx[MT_RXQ_MCU]) {
  361. u32 *rxfce = (u32 *) skb->cb;
  362. *rxfce = info;
  363. }
  364. __skb_put(skb, len);
  365. done++;
  366. if (more) {
  367. q->rx_head = skb;
  368. continue;
  369. }
  370. dev->drv->rx_skb(dev, q - dev->q_rx, skb);
  371. }
  372. mt76_dma_rx_fill(dev, q, true);
  373. return done;
  374. }
  375. static int
  376. mt76_dma_rx_poll(struct napi_struct *napi, int budget)
  377. {
  378. struct mt76_dev *dev;
  379. int qid, done = 0, cur;
  380. dev = container_of(napi->dev, struct mt76_dev, napi_dev);
  381. qid = napi - dev->napi;
  382. rcu_read_lock();
  383. do {
  384. cur = mt76_dma_rx_process(dev, &dev->q_rx[qid], budget - done);
  385. mt76_rx_poll_complete(dev, qid, napi);
  386. done += cur;
  387. } while (cur && done < budget);
  388. rcu_read_unlock();
  389. if (done < budget) {
  390. napi_complete(napi);
  391. dev->drv->rx_poll_complete(dev, qid);
  392. }
  393. return done;
  394. }
  395. static int
  396. mt76_dma_init(struct mt76_dev *dev)
  397. {
  398. int i;
  399. init_dummy_netdev(&dev->napi_dev);
  400. for (i = 0; i < ARRAY_SIZE(dev->q_rx); i++) {
  401. netif_napi_add(&dev->napi_dev, &dev->napi[i], mt76_dma_rx_poll,
  402. 64);
  403. mt76_dma_rx_fill(dev, &dev->q_rx[i], false);
  404. skb_queue_head_init(&dev->rx_skb[i]);
  405. napi_enable(&dev->napi[i]);
  406. }
  407. return 0;
  408. }
  409. static const struct mt76_queue_ops mt76_dma_ops = {
  410. .init = mt76_dma_init,
  411. .alloc = mt76_dma_alloc_queue,
  412. .add_buf = mt76_dma_add_buf,
  413. .tx_queue_skb = mt76_dma_tx_queue_skb,
  414. .tx_cleanup = mt76_dma_tx_cleanup,
  415. .rx_reset = mt76_dma_rx_reset,
  416. .kick = mt76_dma_kick_queue,
  417. };
  418. int mt76_dma_attach(struct mt76_dev *dev)
  419. {
  420. dev->queue_ops = &mt76_dma_ops;
  421. return 0;
  422. }
  423. EXPORT_SYMBOL_GPL(mt76_dma_attach);
  424. void mt76_dma_cleanup(struct mt76_dev *dev)
  425. {
  426. int i;
  427. for (i = 0; i < ARRAY_SIZE(dev->q_tx); i++)
  428. mt76_dma_tx_cleanup(dev, i, true);
  429. for (i = 0; i < ARRAY_SIZE(dev->q_rx); i++) {
  430. netif_napi_del(&dev->napi[i]);
  431. mt76_dma_rx_cleanup(dev, &dev->q_rx[i]);
  432. }
  433. }
  434. EXPORT_SYMBOL_GPL(mt76_dma_cleanup);