rt2800mmio.c 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881
  1. /* Copyright (C) 2009 - 2010 Ivo van Doorn <IvDoorn@gmail.com>
  2. * Copyright (C) 2009 Alban Browaeys <prahal@yahoo.com>
  3. * Copyright (C) 2009 Felix Fietkau <nbd@openwrt.org>
  4. * Copyright (C) 2009 Luis Correia <luis.f.correia@gmail.com>
  5. * Copyright (C) 2009 Mattias Nissler <mattias.nissler@gmx.de>
  6. * Copyright (C) 2009 Mark Asselstine <asselsm@gmail.com>
  7. * Copyright (C) 2009 Xose Vazquez Perez <xose.vazquez@gmail.com>
  8. * Copyright (C) 2009 Bart Zolnierkiewicz <bzolnier@gmail.com>
  9. * <http://rt2x00.serialmonkey.com>
  10. *
  11. * This program is free software; you can redistribute it and/or modify
  12. * it under the terms of the GNU General Public License as published by
  13. * the Free Software Foundation; either version 2 of the License, or
  14. * (at your option) any later version.
  15. *
  16. * This program is distributed in the hope that it will be useful,
  17. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  18. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  19. * GNU General Public License for more details.
  20. *
  21. * You should have received a copy of the GNU General Public License
  22. * along with this program; if not, see <http://www.gnu.org/licenses/>.
  23. */
  24. /* Module: rt2800mmio
  25. * Abstract: rt2800 MMIO device routines.
  26. */
  27. #include <linux/kernel.h>
  28. #include <linux/module.h>
  29. #include <linux/export.h>
  30. #include "rt2x00.h"
  31. #include "rt2x00mmio.h"
  32. #include "rt2800.h"
  33. #include "rt2800lib.h"
  34. #include "rt2800mmio.h"
  35. /*
  36. * TX descriptor initialization
  37. */
  38. __le32 *rt2800mmio_get_txwi(struct queue_entry *entry)
  39. {
  40. return (__le32 *) entry->skb->data;
  41. }
  42. EXPORT_SYMBOL_GPL(rt2800mmio_get_txwi);
  43. void rt2800mmio_write_tx_desc(struct queue_entry *entry,
  44. struct txentry_desc *txdesc)
  45. {
  46. struct skb_frame_desc *skbdesc = get_skb_frame_desc(entry->skb);
  47. struct queue_entry_priv_mmio *entry_priv = entry->priv_data;
  48. __le32 *txd = entry_priv->desc;
  49. u32 word;
  50. const unsigned int txwi_size = entry->queue->winfo_size;
  51. /*
  52. * The buffers pointed by SD_PTR0/SD_LEN0 and SD_PTR1/SD_LEN1
  53. * must contains a TXWI structure + 802.11 header + padding + 802.11
  54. * data. We choose to have SD_PTR0/SD_LEN0 only contains TXWI and
  55. * SD_PTR1/SD_LEN1 contains 802.11 header + padding + 802.11
  56. * data. It means that LAST_SEC0 is always 0.
  57. */
  58. /*
  59. * Initialize TX descriptor
  60. */
  61. word = 0;
  62. rt2x00_set_field32(&word, TXD_W0_SD_PTR0, skbdesc->skb_dma);
  63. rt2x00_desc_write(txd, 0, word);
  64. word = 0;
  65. rt2x00_set_field32(&word, TXD_W1_SD_LEN1, entry->skb->len);
  66. rt2x00_set_field32(&word, TXD_W1_LAST_SEC1,
  67. !test_bit(ENTRY_TXD_MORE_FRAG, &txdesc->flags));
  68. rt2x00_set_field32(&word, TXD_W1_BURST,
  69. test_bit(ENTRY_TXD_BURST, &txdesc->flags));
  70. rt2x00_set_field32(&word, TXD_W1_SD_LEN0, txwi_size);
  71. rt2x00_set_field32(&word, TXD_W1_LAST_SEC0, 0);
  72. rt2x00_set_field32(&word, TXD_W1_DMA_DONE, 0);
  73. rt2x00_desc_write(txd, 1, word);
  74. word = 0;
  75. rt2x00_set_field32(&word, TXD_W2_SD_PTR1,
  76. skbdesc->skb_dma + txwi_size);
  77. rt2x00_desc_write(txd, 2, word);
  78. word = 0;
  79. rt2x00_set_field32(&word, TXD_W3_WIV,
  80. !test_bit(ENTRY_TXD_ENCRYPT_IV, &txdesc->flags));
  81. rt2x00_set_field32(&word, TXD_W3_QSEL, 2);
  82. rt2x00_desc_write(txd, 3, word);
  83. /*
  84. * Register descriptor details in skb frame descriptor.
  85. */
  86. skbdesc->desc = txd;
  87. skbdesc->desc_len = TXD_DESC_SIZE;
  88. }
  89. EXPORT_SYMBOL_GPL(rt2800mmio_write_tx_desc);
  90. /*
  91. * RX control handlers
  92. */
  93. void rt2800mmio_fill_rxdone(struct queue_entry *entry,
  94. struct rxdone_entry_desc *rxdesc)
  95. {
  96. struct queue_entry_priv_mmio *entry_priv = entry->priv_data;
  97. __le32 *rxd = entry_priv->desc;
  98. u32 word;
  99. word = rt2x00_desc_read(rxd, 3);
  100. if (rt2x00_get_field32(word, RXD_W3_CRC_ERROR))
  101. rxdesc->flags |= RX_FLAG_FAILED_FCS_CRC;
  102. /*
  103. * Unfortunately we don't know the cipher type used during
  104. * decryption. This prevents us from correct providing
  105. * correct statistics through debugfs.
  106. */
  107. rxdesc->cipher_status = rt2x00_get_field32(word, RXD_W3_CIPHER_ERROR);
  108. if (rt2x00_get_field32(word, RXD_W3_DECRYPTED)) {
  109. /*
  110. * Hardware has stripped IV/EIV data from 802.11 frame during
  111. * decryption. Unfortunately the descriptor doesn't contain
  112. * any fields with the EIV/IV data either, so they can't
  113. * be restored by rt2x00lib.
  114. */
  115. rxdesc->flags |= RX_FLAG_IV_STRIPPED;
  116. /*
  117. * The hardware has already checked the Michael Mic and has
  118. * stripped it from the frame. Signal this to mac80211.
  119. */
  120. rxdesc->flags |= RX_FLAG_MMIC_STRIPPED;
  121. if (rxdesc->cipher_status == RX_CRYPTO_SUCCESS) {
  122. rxdesc->flags |= RX_FLAG_DECRYPTED;
  123. } else if (rxdesc->cipher_status == RX_CRYPTO_FAIL_MIC) {
  124. /*
  125. * In order to check the Michael Mic, the packet must have
  126. * been decrypted. Mac80211 doesnt check the MMIC failure
  127. * flag to initiate MMIC countermeasures if the decoded flag
  128. * has not been set.
  129. */
  130. rxdesc->flags |= RX_FLAG_DECRYPTED;
  131. rxdesc->flags |= RX_FLAG_MMIC_ERROR;
  132. }
  133. }
  134. if (rt2x00_get_field32(word, RXD_W3_MY_BSS))
  135. rxdesc->dev_flags |= RXDONE_MY_BSS;
  136. if (rt2x00_get_field32(word, RXD_W3_L2PAD))
  137. rxdesc->dev_flags |= RXDONE_L2PAD;
  138. /*
  139. * Process the RXWI structure that is at the start of the buffer.
  140. */
  141. rt2800_process_rxwi(entry, rxdesc);
  142. }
  143. EXPORT_SYMBOL_GPL(rt2800mmio_fill_rxdone);
  144. /*
  145. * Interrupt functions.
  146. */
  147. static void rt2800mmio_wakeup(struct rt2x00_dev *rt2x00dev)
  148. {
  149. struct ieee80211_conf conf = { .flags = 0 };
  150. struct rt2x00lib_conf libconf = { .conf = &conf };
  151. rt2800_config(rt2x00dev, &libconf, IEEE80211_CONF_CHANGE_PS);
  152. }
  153. static bool rt2800mmio_txdone_entry_check(struct queue_entry *entry, u32 status)
  154. {
  155. __le32 *txwi;
  156. u32 word;
  157. int wcid, tx_wcid;
  158. wcid = rt2x00_get_field32(status, TX_STA_FIFO_WCID);
  159. txwi = rt2800_drv_get_txwi(entry);
  160. word = rt2x00_desc_read(txwi, 1);
  161. tx_wcid = rt2x00_get_field32(word, TXWI_W1_WIRELESS_CLI_ID);
  162. return (tx_wcid == wcid);
  163. }
  164. static bool rt2800mmio_txdone_find_entry(struct queue_entry *entry, void *data)
  165. {
  166. u32 status = *(u32 *)data;
  167. /*
  168. * rt2800pci hardware might reorder frames when exchanging traffic
  169. * with multiple BA enabled STAs.
  170. *
  171. * For example, a tx queue
  172. * [ STA1 | STA2 | STA1 | STA2 ]
  173. * can result in tx status reports
  174. * [ STA1 | STA1 | STA2 | STA2 ]
  175. * when the hw decides to aggregate the frames for STA1 into one AMPDU.
  176. *
  177. * To mitigate this effect, associate the tx status to the first frame
  178. * in the tx queue with a matching wcid.
  179. */
  180. if (rt2800mmio_txdone_entry_check(entry, status) &&
  181. !test_bit(ENTRY_DATA_STATUS_SET, &entry->flags)) {
  182. /*
  183. * Got a matching frame, associate the tx status with
  184. * the frame
  185. */
  186. entry->status = status;
  187. set_bit(ENTRY_DATA_STATUS_SET, &entry->flags);
  188. return true;
  189. }
  190. /* Check the next frame */
  191. return false;
  192. }
  193. static bool rt2800mmio_txdone_match_first(struct queue_entry *entry, void *data)
  194. {
  195. u32 status = *(u32 *)data;
  196. /*
  197. * Find the first frame without tx status and assign this status to it
  198. * regardless if it matches or not.
  199. */
  200. if (!test_bit(ENTRY_DATA_STATUS_SET, &entry->flags)) {
  201. /*
  202. * Got a matching frame, associate the tx status with
  203. * the frame
  204. */
  205. entry->status = status;
  206. set_bit(ENTRY_DATA_STATUS_SET, &entry->flags);
  207. return true;
  208. }
  209. /* Check the next frame */
  210. return false;
  211. }
  212. static bool rt2800mmio_txdone_release_entries(struct queue_entry *entry,
  213. void *data)
  214. {
  215. if (test_bit(ENTRY_DATA_STATUS_SET, &entry->flags)) {
  216. rt2800_txdone_entry(entry, entry->status,
  217. rt2800mmio_get_txwi(entry), true);
  218. return false;
  219. }
  220. /* No more frames to release */
  221. return true;
  222. }
  223. static bool rt2800mmio_txdone(struct rt2x00_dev *rt2x00dev)
  224. {
  225. struct data_queue *queue;
  226. u32 status;
  227. u8 qid;
  228. int max_tx_done = 16;
  229. while (kfifo_get(&rt2x00dev->txstatus_fifo, &status)) {
  230. qid = rt2x00_get_field32(status, TX_STA_FIFO_PID_QUEUE);
  231. if (unlikely(qid >= QID_RX)) {
  232. /*
  233. * Unknown queue, this shouldn't happen. Just drop
  234. * this tx status.
  235. */
  236. rt2x00_warn(rt2x00dev, "Got TX status report with unexpected pid %u, dropping\n",
  237. qid);
  238. break;
  239. }
  240. queue = rt2x00queue_get_tx_queue(rt2x00dev, qid);
  241. if (unlikely(queue == NULL)) {
  242. /*
  243. * The queue is NULL, this shouldn't happen. Stop
  244. * processing here and drop the tx status
  245. */
  246. rt2x00_warn(rt2x00dev, "Got TX status for an unavailable queue %u, dropping\n",
  247. qid);
  248. break;
  249. }
  250. if (unlikely(rt2x00queue_empty(queue))) {
  251. /*
  252. * The queue is empty. Stop processing here
  253. * and drop the tx status.
  254. */
  255. rt2x00_warn(rt2x00dev, "Got TX status for an empty queue %u, dropping\n",
  256. qid);
  257. break;
  258. }
  259. /*
  260. * Let's associate this tx status with the first
  261. * matching frame.
  262. */
  263. if (!rt2x00queue_for_each_entry(queue, Q_INDEX_DONE,
  264. Q_INDEX, &status,
  265. rt2800mmio_txdone_find_entry)) {
  266. /*
  267. * We cannot match the tx status to any frame, so just
  268. * use the first one.
  269. */
  270. if (!rt2x00queue_for_each_entry(queue, Q_INDEX_DONE,
  271. Q_INDEX, &status,
  272. rt2800mmio_txdone_match_first)) {
  273. rt2x00_warn(rt2x00dev, "No frame found for TX status on queue %u, dropping\n",
  274. qid);
  275. break;
  276. }
  277. }
  278. /*
  279. * Release all frames with a valid tx status.
  280. */
  281. rt2x00queue_for_each_entry(queue, Q_INDEX_DONE,
  282. Q_INDEX, NULL,
  283. rt2800mmio_txdone_release_entries);
  284. if (--max_tx_done == 0)
  285. break;
  286. }
  287. return !max_tx_done;
  288. }
  289. static inline void rt2800mmio_enable_interrupt(struct rt2x00_dev *rt2x00dev,
  290. struct rt2x00_field32 irq_field)
  291. {
  292. u32 reg;
  293. /*
  294. * Enable a single interrupt. The interrupt mask register
  295. * access needs locking.
  296. */
  297. spin_lock_irq(&rt2x00dev->irqmask_lock);
  298. reg = rt2x00mmio_register_read(rt2x00dev, INT_MASK_CSR);
  299. rt2x00_set_field32(&reg, irq_field, 1);
  300. rt2x00mmio_register_write(rt2x00dev, INT_MASK_CSR, reg);
  301. spin_unlock_irq(&rt2x00dev->irqmask_lock);
  302. }
  303. void rt2800mmio_txstatus_tasklet(unsigned long data)
  304. {
  305. struct rt2x00_dev *rt2x00dev = (struct rt2x00_dev *)data;
  306. if (rt2800mmio_txdone(rt2x00dev))
  307. tasklet_schedule(&rt2x00dev->txstatus_tasklet);
  308. /*
  309. * No need to enable the tx status interrupt here as we always
  310. * leave it enabled to minimize the possibility of a tx status
  311. * register overflow. See comment in interrupt handler.
  312. */
  313. }
  314. EXPORT_SYMBOL_GPL(rt2800mmio_txstatus_tasklet);
  315. void rt2800mmio_pretbtt_tasklet(unsigned long data)
  316. {
  317. struct rt2x00_dev *rt2x00dev = (struct rt2x00_dev *)data;
  318. rt2x00lib_pretbtt(rt2x00dev);
  319. if (test_bit(DEVICE_STATE_ENABLED_RADIO, &rt2x00dev->flags))
  320. rt2800mmio_enable_interrupt(rt2x00dev, INT_MASK_CSR_PRE_TBTT);
  321. }
  322. EXPORT_SYMBOL_GPL(rt2800mmio_pretbtt_tasklet);
  323. void rt2800mmio_tbtt_tasklet(unsigned long data)
  324. {
  325. struct rt2x00_dev *rt2x00dev = (struct rt2x00_dev *)data;
  326. struct rt2800_drv_data *drv_data = rt2x00dev->drv_data;
  327. u32 reg;
  328. rt2x00lib_beacondone(rt2x00dev);
  329. if (rt2x00dev->intf_ap_count) {
  330. /*
  331. * The rt2800pci hardware tbtt timer is off by 1us per tbtt
  332. * causing beacon skew and as a result causing problems with
  333. * some powersaving clients over time. Shorten the beacon
  334. * interval every 64 beacons by 64us to mitigate this effect.
  335. */
  336. if (drv_data->tbtt_tick == (BCN_TBTT_OFFSET - 2)) {
  337. reg = rt2x00mmio_register_read(rt2x00dev, BCN_TIME_CFG);
  338. rt2x00_set_field32(&reg, BCN_TIME_CFG_BEACON_INTERVAL,
  339. (rt2x00dev->beacon_int * 16) - 1);
  340. rt2x00mmio_register_write(rt2x00dev, BCN_TIME_CFG, reg);
  341. } else if (drv_data->tbtt_tick == (BCN_TBTT_OFFSET - 1)) {
  342. reg = rt2x00mmio_register_read(rt2x00dev, BCN_TIME_CFG);
  343. rt2x00_set_field32(&reg, BCN_TIME_CFG_BEACON_INTERVAL,
  344. (rt2x00dev->beacon_int * 16));
  345. rt2x00mmio_register_write(rt2x00dev, BCN_TIME_CFG, reg);
  346. }
  347. drv_data->tbtt_tick++;
  348. drv_data->tbtt_tick %= BCN_TBTT_OFFSET;
  349. }
  350. if (test_bit(DEVICE_STATE_ENABLED_RADIO, &rt2x00dev->flags))
  351. rt2800mmio_enable_interrupt(rt2x00dev, INT_MASK_CSR_TBTT);
  352. }
  353. EXPORT_SYMBOL_GPL(rt2800mmio_tbtt_tasklet);
  354. void rt2800mmio_rxdone_tasklet(unsigned long data)
  355. {
  356. struct rt2x00_dev *rt2x00dev = (struct rt2x00_dev *)data;
  357. if (rt2x00mmio_rxdone(rt2x00dev))
  358. tasklet_schedule(&rt2x00dev->rxdone_tasklet);
  359. else if (test_bit(DEVICE_STATE_ENABLED_RADIO, &rt2x00dev->flags))
  360. rt2800mmio_enable_interrupt(rt2x00dev, INT_MASK_CSR_RX_DONE);
  361. }
  362. EXPORT_SYMBOL_GPL(rt2800mmio_rxdone_tasklet);
  363. void rt2800mmio_autowake_tasklet(unsigned long data)
  364. {
  365. struct rt2x00_dev *rt2x00dev = (struct rt2x00_dev *)data;
  366. rt2800mmio_wakeup(rt2x00dev);
  367. if (test_bit(DEVICE_STATE_ENABLED_RADIO, &rt2x00dev->flags))
  368. rt2800mmio_enable_interrupt(rt2x00dev,
  369. INT_MASK_CSR_AUTO_WAKEUP);
  370. }
  371. EXPORT_SYMBOL_GPL(rt2800mmio_autowake_tasklet);
  372. static void rt2800mmio_txstatus_interrupt(struct rt2x00_dev *rt2x00dev)
  373. {
  374. u32 status;
  375. int i;
  376. /*
  377. * The TX_FIFO_STATUS interrupt needs special care. We should
  378. * read TX_STA_FIFO but we should do it immediately as otherwise
  379. * the register can overflow and we would lose status reports.
  380. *
  381. * Hence, read the TX_STA_FIFO register and copy all tx status
  382. * reports into a kernel FIFO which is handled in the txstatus
  383. * tasklet. We use a tasklet to process the tx status reports
  384. * because we can schedule the tasklet multiple times (when the
  385. * interrupt fires again during tx status processing).
  386. *
  387. * Furthermore we don't disable the TX_FIFO_STATUS
  388. * interrupt here but leave it enabled so that the TX_STA_FIFO
  389. * can also be read while the tx status tasklet gets executed.
  390. *
  391. * Since we have only one producer and one consumer we don't
  392. * need to lock the kfifo.
  393. */
  394. for (i = 0; i < rt2x00dev->tx->limit; i++) {
  395. status = rt2x00mmio_register_read(rt2x00dev, TX_STA_FIFO);
  396. if (!rt2x00_get_field32(status, TX_STA_FIFO_VALID))
  397. break;
  398. if (!kfifo_put(&rt2x00dev->txstatus_fifo, status)) {
  399. rt2x00_warn(rt2x00dev, "TX status FIFO overrun, drop tx status report\n");
  400. break;
  401. }
  402. }
  403. /* Schedule the tasklet for processing the tx status. */
  404. tasklet_schedule(&rt2x00dev->txstatus_tasklet);
  405. }
  406. irqreturn_t rt2800mmio_interrupt(int irq, void *dev_instance)
  407. {
  408. struct rt2x00_dev *rt2x00dev = dev_instance;
  409. u32 reg, mask;
  410. /* Read status and ACK all interrupts */
  411. reg = rt2x00mmio_register_read(rt2x00dev, INT_SOURCE_CSR);
  412. rt2x00mmio_register_write(rt2x00dev, INT_SOURCE_CSR, reg);
  413. if (!reg)
  414. return IRQ_NONE;
  415. if (!test_bit(DEVICE_STATE_ENABLED_RADIO, &rt2x00dev->flags))
  416. return IRQ_HANDLED;
  417. /*
  418. * Since INT_MASK_CSR and INT_SOURCE_CSR use the same bits
  419. * for interrupts and interrupt masks we can just use the value of
  420. * INT_SOURCE_CSR to create the interrupt mask.
  421. */
  422. mask = ~reg;
  423. if (rt2x00_get_field32(reg, INT_SOURCE_CSR_TX_FIFO_STATUS)) {
  424. rt2800mmio_txstatus_interrupt(rt2x00dev);
  425. /*
  426. * Never disable the TX_FIFO_STATUS interrupt.
  427. */
  428. rt2x00_set_field32(&mask, INT_MASK_CSR_TX_FIFO_STATUS, 1);
  429. }
  430. if (rt2x00_get_field32(reg, INT_SOURCE_CSR_PRE_TBTT))
  431. tasklet_hi_schedule(&rt2x00dev->pretbtt_tasklet);
  432. if (rt2x00_get_field32(reg, INT_SOURCE_CSR_TBTT))
  433. tasklet_hi_schedule(&rt2x00dev->tbtt_tasklet);
  434. if (rt2x00_get_field32(reg, INT_SOURCE_CSR_RX_DONE))
  435. tasklet_schedule(&rt2x00dev->rxdone_tasklet);
  436. if (rt2x00_get_field32(reg, INT_SOURCE_CSR_AUTO_WAKEUP))
  437. tasklet_schedule(&rt2x00dev->autowake_tasklet);
  438. /*
  439. * Disable all interrupts for which a tasklet was scheduled right now,
  440. * the tasklet will reenable the appropriate interrupts.
  441. */
  442. spin_lock(&rt2x00dev->irqmask_lock);
  443. reg = rt2x00mmio_register_read(rt2x00dev, INT_MASK_CSR);
  444. reg &= mask;
  445. rt2x00mmio_register_write(rt2x00dev, INT_MASK_CSR, reg);
  446. spin_unlock(&rt2x00dev->irqmask_lock);
  447. return IRQ_HANDLED;
  448. }
  449. EXPORT_SYMBOL_GPL(rt2800mmio_interrupt);
  450. void rt2800mmio_toggle_irq(struct rt2x00_dev *rt2x00dev,
  451. enum dev_state state)
  452. {
  453. u32 reg;
  454. unsigned long flags;
  455. /*
  456. * When interrupts are being enabled, the interrupt registers
  457. * should clear the register to assure a clean state.
  458. */
  459. if (state == STATE_RADIO_IRQ_ON) {
  460. reg = rt2x00mmio_register_read(rt2x00dev, INT_SOURCE_CSR);
  461. rt2x00mmio_register_write(rt2x00dev, INT_SOURCE_CSR, reg);
  462. }
  463. spin_lock_irqsave(&rt2x00dev->irqmask_lock, flags);
  464. reg = 0;
  465. if (state == STATE_RADIO_IRQ_ON) {
  466. rt2x00_set_field32(&reg, INT_MASK_CSR_RX_DONE, 1);
  467. rt2x00_set_field32(&reg, INT_MASK_CSR_TBTT, 1);
  468. rt2x00_set_field32(&reg, INT_MASK_CSR_PRE_TBTT, 1);
  469. rt2x00_set_field32(&reg, INT_MASK_CSR_TX_FIFO_STATUS, 1);
  470. rt2x00_set_field32(&reg, INT_MASK_CSR_AUTO_WAKEUP, 1);
  471. }
  472. rt2x00mmio_register_write(rt2x00dev, INT_MASK_CSR, reg);
  473. spin_unlock_irqrestore(&rt2x00dev->irqmask_lock, flags);
  474. if (state == STATE_RADIO_IRQ_OFF) {
  475. /*
  476. * Wait for possibly running tasklets to finish.
  477. */
  478. tasklet_kill(&rt2x00dev->txstatus_tasklet);
  479. tasklet_kill(&rt2x00dev->rxdone_tasklet);
  480. tasklet_kill(&rt2x00dev->autowake_tasklet);
  481. tasklet_kill(&rt2x00dev->tbtt_tasklet);
  482. tasklet_kill(&rt2x00dev->pretbtt_tasklet);
  483. }
  484. }
  485. EXPORT_SYMBOL_GPL(rt2800mmio_toggle_irq);
  486. /*
  487. * Queue handlers.
  488. */
  489. void rt2800mmio_start_queue(struct data_queue *queue)
  490. {
  491. struct rt2x00_dev *rt2x00dev = queue->rt2x00dev;
  492. u32 reg;
  493. switch (queue->qid) {
  494. case QID_RX:
  495. reg = rt2x00mmio_register_read(rt2x00dev, MAC_SYS_CTRL);
  496. rt2x00_set_field32(&reg, MAC_SYS_CTRL_ENABLE_RX, 1);
  497. rt2x00mmio_register_write(rt2x00dev, MAC_SYS_CTRL, reg);
  498. break;
  499. case QID_BEACON:
  500. reg = rt2x00mmio_register_read(rt2x00dev, BCN_TIME_CFG);
  501. rt2x00_set_field32(&reg, BCN_TIME_CFG_TSF_TICKING, 1);
  502. rt2x00_set_field32(&reg, BCN_TIME_CFG_TBTT_ENABLE, 1);
  503. rt2x00_set_field32(&reg, BCN_TIME_CFG_BEACON_GEN, 1);
  504. rt2x00mmio_register_write(rt2x00dev, BCN_TIME_CFG, reg);
  505. reg = rt2x00mmio_register_read(rt2x00dev, INT_TIMER_EN);
  506. rt2x00_set_field32(&reg, INT_TIMER_EN_PRE_TBTT_TIMER, 1);
  507. rt2x00mmio_register_write(rt2x00dev, INT_TIMER_EN, reg);
  508. break;
  509. default:
  510. break;
  511. }
  512. }
  513. EXPORT_SYMBOL_GPL(rt2800mmio_start_queue);
  514. void rt2800mmio_kick_queue(struct data_queue *queue)
  515. {
  516. struct rt2x00_dev *rt2x00dev = queue->rt2x00dev;
  517. struct queue_entry *entry;
  518. switch (queue->qid) {
  519. case QID_AC_VO:
  520. case QID_AC_VI:
  521. case QID_AC_BE:
  522. case QID_AC_BK:
  523. WARN_ON_ONCE(rt2x00queue_empty(queue));
  524. entry = rt2x00queue_get_entry(queue, Q_INDEX);
  525. rt2x00mmio_register_write(rt2x00dev, TX_CTX_IDX(queue->qid),
  526. entry->entry_idx);
  527. break;
  528. case QID_MGMT:
  529. entry = rt2x00queue_get_entry(queue, Q_INDEX);
  530. rt2x00mmio_register_write(rt2x00dev, TX_CTX_IDX(5),
  531. entry->entry_idx);
  532. break;
  533. default:
  534. break;
  535. }
  536. }
  537. EXPORT_SYMBOL_GPL(rt2800mmio_kick_queue);
  538. void rt2800mmio_stop_queue(struct data_queue *queue)
  539. {
  540. struct rt2x00_dev *rt2x00dev = queue->rt2x00dev;
  541. u32 reg;
  542. switch (queue->qid) {
  543. case QID_RX:
  544. reg = rt2x00mmio_register_read(rt2x00dev, MAC_SYS_CTRL);
  545. rt2x00_set_field32(&reg, MAC_SYS_CTRL_ENABLE_RX, 0);
  546. rt2x00mmio_register_write(rt2x00dev, MAC_SYS_CTRL, reg);
  547. break;
  548. case QID_BEACON:
  549. reg = rt2x00mmio_register_read(rt2x00dev, BCN_TIME_CFG);
  550. rt2x00_set_field32(&reg, BCN_TIME_CFG_TSF_TICKING, 0);
  551. rt2x00_set_field32(&reg, BCN_TIME_CFG_TBTT_ENABLE, 0);
  552. rt2x00_set_field32(&reg, BCN_TIME_CFG_BEACON_GEN, 0);
  553. rt2x00mmio_register_write(rt2x00dev, BCN_TIME_CFG, reg);
  554. reg = rt2x00mmio_register_read(rt2x00dev, INT_TIMER_EN);
  555. rt2x00_set_field32(&reg, INT_TIMER_EN_PRE_TBTT_TIMER, 0);
  556. rt2x00mmio_register_write(rt2x00dev, INT_TIMER_EN, reg);
  557. /*
  558. * Wait for current invocation to finish. The tasklet
  559. * won't be scheduled anymore afterwards since we disabled
  560. * the TBTT and PRE TBTT timer.
  561. */
  562. tasklet_kill(&rt2x00dev->tbtt_tasklet);
  563. tasklet_kill(&rt2x00dev->pretbtt_tasklet);
  564. break;
  565. default:
  566. break;
  567. }
  568. }
  569. EXPORT_SYMBOL_GPL(rt2800mmio_stop_queue);
  570. void rt2800mmio_queue_init(struct data_queue *queue)
  571. {
  572. struct rt2x00_dev *rt2x00dev = queue->rt2x00dev;
  573. unsigned short txwi_size, rxwi_size;
  574. rt2800_get_txwi_rxwi_size(rt2x00dev, &txwi_size, &rxwi_size);
  575. switch (queue->qid) {
  576. case QID_RX:
  577. queue->limit = 128;
  578. queue->data_size = AGGREGATION_SIZE;
  579. queue->desc_size = RXD_DESC_SIZE;
  580. queue->winfo_size = rxwi_size;
  581. queue->priv_size = sizeof(struct queue_entry_priv_mmio);
  582. break;
  583. case QID_AC_VO:
  584. case QID_AC_VI:
  585. case QID_AC_BE:
  586. case QID_AC_BK:
  587. queue->limit = 64;
  588. queue->data_size = AGGREGATION_SIZE;
  589. queue->desc_size = TXD_DESC_SIZE;
  590. queue->winfo_size = txwi_size;
  591. queue->priv_size = sizeof(struct queue_entry_priv_mmio);
  592. break;
  593. case QID_BEACON:
  594. queue->limit = 8;
  595. queue->data_size = 0; /* No DMA required for beacons */
  596. queue->desc_size = TXD_DESC_SIZE;
  597. queue->winfo_size = txwi_size;
  598. queue->priv_size = sizeof(struct queue_entry_priv_mmio);
  599. break;
  600. case QID_ATIM:
  601. /* fallthrough */
  602. default:
  603. BUG();
  604. break;
  605. }
  606. }
  607. EXPORT_SYMBOL_GPL(rt2800mmio_queue_init);
  608. /*
  609. * Initialization functions.
  610. */
  611. bool rt2800mmio_get_entry_state(struct queue_entry *entry)
  612. {
  613. struct queue_entry_priv_mmio *entry_priv = entry->priv_data;
  614. u32 word;
  615. if (entry->queue->qid == QID_RX) {
  616. word = rt2x00_desc_read(entry_priv->desc, 1);
  617. return (!rt2x00_get_field32(word, RXD_W1_DMA_DONE));
  618. } else {
  619. word = rt2x00_desc_read(entry_priv->desc, 1);
  620. return (!rt2x00_get_field32(word, TXD_W1_DMA_DONE));
  621. }
  622. }
  623. EXPORT_SYMBOL_GPL(rt2800mmio_get_entry_state);
  624. void rt2800mmio_clear_entry(struct queue_entry *entry)
  625. {
  626. struct queue_entry_priv_mmio *entry_priv = entry->priv_data;
  627. struct skb_frame_desc *skbdesc = get_skb_frame_desc(entry->skb);
  628. struct rt2x00_dev *rt2x00dev = entry->queue->rt2x00dev;
  629. u32 word;
  630. if (entry->queue->qid == QID_RX) {
  631. word = rt2x00_desc_read(entry_priv->desc, 0);
  632. rt2x00_set_field32(&word, RXD_W0_SDP0, skbdesc->skb_dma);
  633. rt2x00_desc_write(entry_priv->desc, 0, word);
  634. word = rt2x00_desc_read(entry_priv->desc, 1);
  635. rt2x00_set_field32(&word, RXD_W1_DMA_DONE, 0);
  636. rt2x00_desc_write(entry_priv->desc, 1, word);
  637. /*
  638. * Set RX IDX in register to inform hardware that we have
  639. * handled this entry and it is available for reuse again.
  640. */
  641. rt2x00mmio_register_write(rt2x00dev, RX_CRX_IDX,
  642. entry->entry_idx);
  643. } else {
  644. word = rt2x00_desc_read(entry_priv->desc, 1);
  645. rt2x00_set_field32(&word, TXD_W1_DMA_DONE, 1);
  646. rt2x00_desc_write(entry_priv->desc, 1, word);
  647. }
  648. }
  649. EXPORT_SYMBOL_GPL(rt2800mmio_clear_entry);
  650. int rt2800mmio_init_queues(struct rt2x00_dev *rt2x00dev)
  651. {
  652. struct queue_entry_priv_mmio *entry_priv;
  653. /*
  654. * Initialize registers.
  655. */
  656. entry_priv = rt2x00dev->tx[0].entries[0].priv_data;
  657. rt2x00mmio_register_write(rt2x00dev, TX_BASE_PTR0,
  658. entry_priv->desc_dma);
  659. rt2x00mmio_register_write(rt2x00dev, TX_MAX_CNT0,
  660. rt2x00dev->tx[0].limit);
  661. rt2x00mmio_register_write(rt2x00dev, TX_CTX_IDX0, 0);
  662. rt2x00mmio_register_write(rt2x00dev, TX_DTX_IDX0, 0);
  663. entry_priv = rt2x00dev->tx[1].entries[0].priv_data;
  664. rt2x00mmio_register_write(rt2x00dev, TX_BASE_PTR1,
  665. entry_priv->desc_dma);
  666. rt2x00mmio_register_write(rt2x00dev, TX_MAX_CNT1,
  667. rt2x00dev->tx[1].limit);
  668. rt2x00mmio_register_write(rt2x00dev, TX_CTX_IDX1, 0);
  669. rt2x00mmio_register_write(rt2x00dev, TX_DTX_IDX1, 0);
  670. entry_priv = rt2x00dev->tx[2].entries[0].priv_data;
  671. rt2x00mmio_register_write(rt2x00dev, TX_BASE_PTR2,
  672. entry_priv->desc_dma);
  673. rt2x00mmio_register_write(rt2x00dev, TX_MAX_CNT2,
  674. rt2x00dev->tx[2].limit);
  675. rt2x00mmio_register_write(rt2x00dev, TX_CTX_IDX2, 0);
  676. rt2x00mmio_register_write(rt2x00dev, TX_DTX_IDX2, 0);
  677. entry_priv = rt2x00dev->tx[3].entries[0].priv_data;
  678. rt2x00mmio_register_write(rt2x00dev, TX_BASE_PTR3,
  679. entry_priv->desc_dma);
  680. rt2x00mmio_register_write(rt2x00dev, TX_MAX_CNT3,
  681. rt2x00dev->tx[3].limit);
  682. rt2x00mmio_register_write(rt2x00dev, TX_CTX_IDX3, 0);
  683. rt2x00mmio_register_write(rt2x00dev, TX_DTX_IDX3, 0);
  684. rt2x00mmio_register_write(rt2x00dev, TX_BASE_PTR4, 0);
  685. rt2x00mmio_register_write(rt2x00dev, TX_MAX_CNT4, 0);
  686. rt2x00mmio_register_write(rt2x00dev, TX_CTX_IDX4, 0);
  687. rt2x00mmio_register_write(rt2x00dev, TX_DTX_IDX4, 0);
  688. rt2x00mmio_register_write(rt2x00dev, TX_BASE_PTR5, 0);
  689. rt2x00mmio_register_write(rt2x00dev, TX_MAX_CNT5, 0);
  690. rt2x00mmio_register_write(rt2x00dev, TX_CTX_IDX5, 0);
  691. rt2x00mmio_register_write(rt2x00dev, TX_DTX_IDX5, 0);
  692. entry_priv = rt2x00dev->rx->entries[0].priv_data;
  693. rt2x00mmio_register_write(rt2x00dev, RX_BASE_PTR,
  694. entry_priv->desc_dma);
  695. rt2x00mmio_register_write(rt2x00dev, RX_MAX_CNT,
  696. rt2x00dev->rx[0].limit);
  697. rt2x00mmio_register_write(rt2x00dev, RX_CRX_IDX,
  698. rt2x00dev->rx[0].limit - 1);
  699. rt2x00mmio_register_write(rt2x00dev, RX_DRX_IDX, 0);
  700. rt2800_disable_wpdma(rt2x00dev);
  701. rt2x00mmio_register_write(rt2x00dev, DELAY_INT_CFG, 0);
  702. return 0;
  703. }
  704. EXPORT_SYMBOL_GPL(rt2800mmio_init_queues);
  705. int rt2800mmio_init_registers(struct rt2x00_dev *rt2x00dev)
  706. {
  707. u32 reg;
  708. /*
  709. * Reset DMA indexes
  710. */
  711. reg = rt2x00mmio_register_read(rt2x00dev, WPDMA_RST_IDX);
  712. rt2x00_set_field32(&reg, WPDMA_RST_IDX_DTX_IDX0, 1);
  713. rt2x00_set_field32(&reg, WPDMA_RST_IDX_DTX_IDX1, 1);
  714. rt2x00_set_field32(&reg, WPDMA_RST_IDX_DTX_IDX2, 1);
  715. rt2x00_set_field32(&reg, WPDMA_RST_IDX_DTX_IDX3, 1);
  716. rt2x00_set_field32(&reg, WPDMA_RST_IDX_DTX_IDX4, 1);
  717. rt2x00_set_field32(&reg, WPDMA_RST_IDX_DTX_IDX5, 1);
  718. rt2x00_set_field32(&reg, WPDMA_RST_IDX_DRX_IDX0, 1);
  719. rt2x00mmio_register_write(rt2x00dev, WPDMA_RST_IDX, reg);
  720. rt2x00mmio_register_write(rt2x00dev, PBF_SYS_CTRL, 0x00000e1f);
  721. rt2x00mmio_register_write(rt2x00dev, PBF_SYS_CTRL, 0x00000e00);
  722. if (rt2x00_is_pcie(rt2x00dev) &&
  723. (rt2x00_rt(rt2x00dev, RT3090) ||
  724. rt2x00_rt(rt2x00dev, RT3390) ||
  725. rt2x00_rt(rt2x00dev, RT3572) ||
  726. rt2x00_rt(rt2x00dev, RT3593) ||
  727. rt2x00_rt(rt2x00dev, RT5390) ||
  728. rt2x00_rt(rt2x00dev, RT5392) ||
  729. rt2x00_rt(rt2x00dev, RT5592))) {
  730. reg = rt2x00mmio_register_read(rt2x00dev, AUX_CTRL);
  731. rt2x00_set_field32(&reg, AUX_CTRL_FORCE_PCIE_CLK, 1);
  732. rt2x00_set_field32(&reg, AUX_CTRL_WAKE_PCIE_EN, 1);
  733. rt2x00mmio_register_write(rt2x00dev, AUX_CTRL, reg);
  734. }
  735. rt2x00mmio_register_write(rt2x00dev, PWR_PIN_CFG, 0x00000003);
  736. reg = 0;
  737. rt2x00_set_field32(&reg, MAC_SYS_CTRL_RESET_CSR, 1);
  738. rt2x00_set_field32(&reg, MAC_SYS_CTRL_RESET_BBP, 1);
  739. rt2x00mmio_register_write(rt2x00dev, MAC_SYS_CTRL, reg);
  740. rt2x00mmio_register_write(rt2x00dev, MAC_SYS_CTRL, 0x00000000);
  741. return 0;
  742. }
  743. EXPORT_SYMBOL_GPL(rt2800mmio_init_registers);
  744. /*
  745. * Device state switch handlers.
  746. */
  747. int rt2800mmio_enable_radio(struct rt2x00_dev *rt2x00dev)
  748. {
  749. /* Wait for DMA, ignore error until we initialize queues. */
  750. rt2800_wait_wpdma_ready(rt2x00dev);
  751. if (unlikely(rt2800mmio_init_queues(rt2x00dev)))
  752. return -EIO;
  753. return rt2800_enable_radio(rt2x00dev);
  754. }
  755. EXPORT_SYMBOL_GPL(rt2800mmio_enable_radio);
  756. MODULE_AUTHOR(DRV_PROJECT);
  757. MODULE_VERSION(DRV_VERSION);
  758. MODULE_DESCRIPTION("rt2800 MMIO library");
  759. MODULE_LICENSE("GPL");