rt2800lib.c 34 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076
  1. /*
  2. Copyright (C) 2009 Bartlomiej Zolnierkiewicz
  3. Based on the original rt2800pci.c and rt2800usb.c:
  4. Copyright (C) 2004 - 2009 rt2x00 SourceForge Project
  5. <http://rt2x00.serialmonkey.com>
  6. This program is free software; you can redistribute it and/or modify
  7. it under the terms of the GNU General Public License as published by
  8. the Free Software Foundation; either version 2 of the License, or
  9. (at your option) any later version.
  10. This program is distributed in the hope that it will be useful,
  11. but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. GNU General Public License for more details.
  14. You should have received a copy of the GNU General Public License
  15. along with this program; if not, write to the
  16. Free Software Foundation, Inc.,
  17. 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  18. */
  19. /*
  20. Module: rt2800lib
  21. Abstract: rt2800 generic device routines.
  22. */
  23. #include <linux/kernel.h>
  24. #include <linux/module.h>
  25. #include "rt2x00.h"
  26. #include "rt2800lib.h"
  27. #include "rt2800.h"
  28. MODULE_AUTHOR("Bartlomiej Zolnierkiewicz");
  29. MODULE_DESCRIPTION("rt2800 library");
  30. MODULE_LICENSE("GPL");
  31. /*
  32. * Register access.
  33. * All access to the CSR registers will go through the methods
  34. * rt2800_register_read and rt2800_register_write.
  35. * BBP and RF register require indirect register access,
  36. * and use the CSR registers BBPCSR and RFCSR to achieve this.
  37. * These indirect registers work with busy bits,
  38. * and we will try maximal REGISTER_BUSY_COUNT times to access
  39. * the register while taking a REGISTER_BUSY_DELAY us delay
  40. * between each attampt. When the busy bit is still set at that time,
  41. * the access attempt is considered to have failed,
  42. * and we will print an error.
  43. * The _lock versions must be used if you already hold the csr_mutex
  44. */
  45. #define WAIT_FOR_BBP(__dev, __reg) \
  46. rt2800_regbusy_read((__dev), BBP_CSR_CFG, BBP_CSR_CFG_BUSY, (__reg))
  47. #define WAIT_FOR_RFCSR(__dev, __reg) \
  48. rt2800_regbusy_read((__dev), RF_CSR_CFG, RF_CSR_CFG_BUSY, (__reg))
  49. #define WAIT_FOR_RF(__dev, __reg) \
  50. rt2800_regbusy_read((__dev), RF_CSR_CFG0, RF_CSR_CFG0_BUSY, (__reg))
  51. #define WAIT_FOR_MCU(__dev, __reg) \
  52. rt2800_regbusy_read((__dev), H2M_MAILBOX_CSR, \
  53. H2M_MAILBOX_CSR_OWNER, (__reg))
  54. void rt2800_bbp_write(struct rt2x00_dev *rt2x00dev,
  55. const unsigned int word, const u8 value)
  56. {
  57. u32 reg;
  58. mutex_lock(&rt2x00dev->csr_mutex);
  59. /*
  60. * Wait until the BBP becomes available, afterwards we
  61. * can safely write the new data into the register.
  62. */
  63. if (WAIT_FOR_BBP(rt2x00dev, &reg)) {
  64. reg = 0;
  65. rt2x00_set_field32(&reg, BBP_CSR_CFG_VALUE, value);
  66. rt2x00_set_field32(&reg, BBP_CSR_CFG_REGNUM, word);
  67. rt2x00_set_field32(&reg, BBP_CSR_CFG_BUSY, 1);
  68. rt2x00_set_field32(&reg, BBP_CSR_CFG_READ_CONTROL, 0);
  69. if (rt2x00_intf_is_pci(rt2x00dev))
  70. rt2x00_set_field32(&reg, BBP_CSR_CFG_BBP_RW_MODE, 1);
  71. rt2800_register_write_lock(rt2x00dev, BBP_CSR_CFG, reg);
  72. }
  73. mutex_unlock(&rt2x00dev->csr_mutex);
  74. }
  75. EXPORT_SYMBOL_GPL(rt2800_bbp_write);
  76. void rt2800_bbp_read(struct rt2x00_dev *rt2x00dev,
  77. const unsigned int word, u8 *value)
  78. {
  79. u32 reg;
  80. mutex_lock(&rt2x00dev->csr_mutex);
  81. /*
  82. * Wait until the BBP becomes available, afterwards we
  83. * can safely write the read request into the register.
  84. * After the data has been written, we wait until hardware
  85. * returns the correct value, if at any time the register
  86. * doesn't become available in time, reg will be 0xffffffff
  87. * which means we return 0xff to the caller.
  88. */
  89. if (WAIT_FOR_BBP(rt2x00dev, &reg)) {
  90. reg = 0;
  91. rt2x00_set_field32(&reg, BBP_CSR_CFG_REGNUM, word);
  92. rt2x00_set_field32(&reg, BBP_CSR_CFG_BUSY, 1);
  93. rt2x00_set_field32(&reg, BBP_CSR_CFG_READ_CONTROL, 1);
  94. if (rt2x00_intf_is_pci(rt2x00dev))
  95. rt2x00_set_field32(&reg, BBP_CSR_CFG_BBP_RW_MODE, 1);
  96. rt2800_register_write_lock(rt2x00dev, BBP_CSR_CFG, reg);
  97. WAIT_FOR_BBP(rt2x00dev, &reg);
  98. }
  99. *value = rt2x00_get_field32(reg, BBP_CSR_CFG_VALUE);
  100. mutex_unlock(&rt2x00dev->csr_mutex);
  101. }
  102. EXPORT_SYMBOL_GPL(rt2800_bbp_read);
  103. void rt2800_rfcsr_write(struct rt2x00_dev *rt2x00dev,
  104. const unsigned int word, const u8 value)
  105. {
  106. u32 reg;
  107. mutex_lock(&rt2x00dev->csr_mutex);
  108. /*
  109. * Wait until the RFCSR becomes available, afterwards we
  110. * can safely write the new data into the register.
  111. */
  112. if (WAIT_FOR_RFCSR(rt2x00dev, &reg)) {
  113. reg = 0;
  114. rt2x00_set_field32(&reg, RF_CSR_CFG_DATA, value);
  115. rt2x00_set_field32(&reg, RF_CSR_CFG_REGNUM, word);
  116. rt2x00_set_field32(&reg, RF_CSR_CFG_WRITE, 1);
  117. rt2x00_set_field32(&reg, RF_CSR_CFG_BUSY, 1);
  118. rt2800_register_write_lock(rt2x00dev, RF_CSR_CFG, reg);
  119. }
  120. mutex_unlock(&rt2x00dev->csr_mutex);
  121. }
  122. EXPORT_SYMBOL_GPL(rt2800_rfcsr_write);
  123. void rt2800_rfcsr_read(struct rt2x00_dev *rt2x00dev,
  124. const unsigned int word, u8 *value)
  125. {
  126. u32 reg;
  127. mutex_lock(&rt2x00dev->csr_mutex);
  128. /*
  129. * Wait until the RFCSR becomes available, afterwards we
  130. * can safely write the read request into the register.
  131. * After the data has been written, we wait until hardware
  132. * returns the correct value, if at any time the register
  133. * doesn't become available in time, reg will be 0xffffffff
  134. * which means we return 0xff to the caller.
  135. */
  136. if (WAIT_FOR_RFCSR(rt2x00dev, &reg)) {
  137. reg = 0;
  138. rt2x00_set_field32(&reg, RF_CSR_CFG_REGNUM, word);
  139. rt2x00_set_field32(&reg, RF_CSR_CFG_WRITE, 0);
  140. rt2x00_set_field32(&reg, RF_CSR_CFG_BUSY, 1);
  141. rt2800_register_write_lock(rt2x00dev, RF_CSR_CFG, reg);
  142. WAIT_FOR_RFCSR(rt2x00dev, &reg);
  143. }
  144. *value = rt2x00_get_field32(reg, RF_CSR_CFG_DATA);
  145. mutex_unlock(&rt2x00dev->csr_mutex);
  146. }
  147. EXPORT_SYMBOL_GPL(rt2800_rfcsr_read);
  148. void rt2800_rf_write(struct rt2x00_dev *rt2x00dev,
  149. const unsigned int word, const u32 value)
  150. {
  151. u32 reg;
  152. mutex_lock(&rt2x00dev->csr_mutex);
  153. /*
  154. * Wait until the RF becomes available, afterwards we
  155. * can safely write the new data into the register.
  156. */
  157. if (WAIT_FOR_RF(rt2x00dev, &reg)) {
  158. reg = 0;
  159. rt2x00_set_field32(&reg, RF_CSR_CFG0_REG_VALUE_BW, value);
  160. rt2x00_set_field32(&reg, RF_CSR_CFG0_STANDBYMODE, 0);
  161. rt2x00_set_field32(&reg, RF_CSR_CFG0_SEL, 0);
  162. rt2x00_set_field32(&reg, RF_CSR_CFG0_BUSY, 1);
  163. rt2800_register_write_lock(rt2x00dev, RF_CSR_CFG0, reg);
  164. rt2x00_rf_write(rt2x00dev, word, value);
  165. }
  166. mutex_unlock(&rt2x00dev->csr_mutex);
  167. }
  168. EXPORT_SYMBOL_GPL(rt2800_rf_write);
  169. void rt2800_mcu_request(struct rt2x00_dev *rt2x00dev,
  170. const u8 command, const u8 token,
  171. const u8 arg0, const u8 arg1)
  172. {
  173. u32 reg;
  174. if (rt2x00_intf_is_pci(rt2x00dev)) {
  175. /*
  176. * RT2880 and RT3052 don't support MCU requests.
  177. */
  178. if (rt2x00_rt(&rt2x00dev->chip, RT2880) ||
  179. rt2x00_rt(&rt2x00dev->chip, RT3052))
  180. return;
  181. }
  182. mutex_lock(&rt2x00dev->csr_mutex);
  183. /*
  184. * Wait until the MCU becomes available, afterwards we
  185. * can safely write the new data into the register.
  186. */
  187. if (WAIT_FOR_MCU(rt2x00dev, &reg)) {
  188. rt2x00_set_field32(&reg, H2M_MAILBOX_CSR_OWNER, 1);
  189. rt2x00_set_field32(&reg, H2M_MAILBOX_CSR_CMD_TOKEN, token);
  190. rt2x00_set_field32(&reg, H2M_MAILBOX_CSR_ARG0, arg0);
  191. rt2x00_set_field32(&reg, H2M_MAILBOX_CSR_ARG1, arg1);
  192. rt2800_register_write_lock(rt2x00dev, H2M_MAILBOX_CSR, reg);
  193. reg = 0;
  194. rt2x00_set_field32(&reg, HOST_CMD_CSR_HOST_COMMAND, command);
  195. rt2800_register_write_lock(rt2x00dev, HOST_CMD_CSR, reg);
  196. }
  197. mutex_unlock(&rt2x00dev->csr_mutex);
  198. }
  199. EXPORT_SYMBOL_GPL(rt2800_mcu_request);
  200. #ifdef CONFIG_RT2X00_LIB_DEBUGFS
  201. const struct rt2x00debug rt2800_rt2x00debug = {
  202. .owner = THIS_MODULE,
  203. .csr = {
  204. .read = rt2800_register_read,
  205. .write = rt2800_register_write,
  206. .flags = RT2X00DEBUGFS_OFFSET,
  207. .word_base = CSR_REG_BASE,
  208. .word_size = sizeof(u32),
  209. .word_count = CSR_REG_SIZE / sizeof(u32),
  210. },
  211. .eeprom = {
  212. .read = rt2x00_eeprom_read,
  213. .write = rt2x00_eeprom_write,
  214. .word_base = EEPROM_BASE,
  215. .word_size = sizeof(u16),
  216. .word_count = EEPROM_SIZE / sizeof(u16),
  217. },
  218. .bbp = {
  219. .read = rt2800_bbp_read,
  220. .write = rt2800_bbp_write,
  221. .word_base = BBP_BASE,
  222. .word_size = sizeof(u8),
  223. .word_count = BBP_SIZE / sizeof(u8),
  224. },
  225. .rf = {
  226. .read = rt2x00_rf_read,
  227. .write = rt2800_rf_write,
  228. .word_base = RF_BASE,
  229. .word_size = sizeof(u32),
  230. .word_count = RF_SIZE / sizeof(u32),
  231. },
  232. };
  233. EXPORT_SYMBOL_GPL(rt2800_rt2x00debug);
  234. #endif /* CONFIG_RT2X00_LIB_DEBUGFS */
  235. int rt2800_rfkill_poll(struct rt2x00_dev *rt2x00dev)
  236. {
  237. u32 reg;
  238. rt2800_register_read(rt2x00dev, GPIO_CTRL_CFG, &reg);
  239. return rt2x00_get_field32(reg, GPIO_CTRL_CFG_BIT2);
  240. }
  241. EXPORT_SYMBOL_GPL(rt2800_rfkill_poll);
  242. #ifdef CONFIG_RT2X00_LIB_LEDS
  243. static void rt2800_brightness_set(struct led_classdev *led_cdev,
  244. enum led_brightness brightness)
  245. {
  246. struct rt2x00_led *led =
  247. container_of(led_cdev, struct rt2x00_led, led_dev);
  248. unsigned int enabled = brightness != LED_OFF;
  249. unsigned int bg_mode =
  250. (enabled && led->rt2x00dev->curr_band == IEEE80211_BAND_2GHZ);
  251. unsigned int polarity =
  252. rt2x00_get_field16(led->rt2x00dev->led_mcu_reg,
  253. EEPROM_FREQ_LED_POLARITY);
  254. unsigned int ledmode =
  255. rt2x00_get_field16(led->rt2x00dev->led_mcu_reg,
  256. EEPROM_FREQ_LED_MODE);
  257. if (led->type == LED_TYPE_RADIO) {
  258. rt2800_mcu_request(led->rt2x00dev, MCU_LED, 0xff, ledmode,
  259. enabled ? 0x20 : 0);
  260. } else if (led->type == LED_TYPE_ASSOC) {
  261. rt2800_mcu_request(led->rt2x00dev, MCU_LED, 0xff, ledmode,
  262. enabled ? (bg_mode ? 0x60 : 0xa0) : 0x20);
  263. } else if (led->type == LED_TYPE_QUALITY) {
  264. /*
  265. * The brightness is divided into 6 levels (0 - 5),
  266. * The specs tell us the following levels:
  267. * 0, 1 ,3, 7, 15, 31
  268. * to determine the level in a simple way we can simply
  269. * work with bitshifting:
  270. * (1 << level) - 1
  271. */
  272. rt2800_mcu_request(led->rt2x00dev, MCU_LED_STRENGTH, 0xff,
  273. (1 << brightness / (LED_FULL / 6)) - 1,
  274. polarity);
  275. }
  276. }
  277. static int rt2800_blink_set(struct led_classdev *led_cdev,
  278. unsigned long *delay_on, unsigned long *delay_off)
  279. {
  280. struct rt2x00_led *led =
  281. container_of(led_cdev, struct rt2x00_led, led_dev);
  282. u32 reg;
  283. rt2800_register_read(led->rt2x00dev, LED_CFG, &reg);
  284. rt2x00_set_field32(&reg, LED_CFG_ON_PERIOD, *delay_on);
  285. rt2x00_set_field32(&reg, LED_CFG_OFF_PERIOD, *delay_off);
  286. rt2x00_set_field32(&reg, LED_CFG_SLOW_BLINK_PERIOD, 3);
  287. rt2x00_set_field32(&reg, LED_CFG_R_LED_MODE, 3);
  288. rt2x00_set_field32(&reg, LED_CFG_G_LED_MODE, 12);
  289. rt2x00_set_field32(&reg, LED_CFG_Y_LED_MODE, 3);
  290. rt2x00_set_field32(&reg, LED_CFG_LED_POLAR, 1);
  291. rt2800_register_write(led->rt2x00dev, LED_CFG, reg);
  292. return 0;
  293. }
  294. void rt2800_init_led(struct rt2x00_dev *rt2x00dev,
  295. struct rt2x00_led *led, enum led_type type)
  296. {
  297. led->rt2x00dev = rt2x00dev;
  298. led->type = type;
  299. led->led_dev.brightness_set = rt2800_brightness_set;
  300. led->led_dev.blink_set = rt2800_blink_set;
  301. led->flags = LED_INITIALIZED;
  302. }
  303. EXPORT_SYMBOL_GPL(rt2800_init_led);
  304. #endif /* CONFIG_RT2X00_LIB_LEDS */
  305. /*
  306. * Configuration handlers.
  307. */
  308. static void rt2800_config_wcid_attr(struct rt2x00_dev *rt2x00dev,
  309. struct rt2x00lib_crypto *crypto,
  310. struct ieee80211_key_conf *key)
  311. {
  312. struct mac_wcid_entry wcid_entry;
  313. struct mac_iveiv_entry iveiv_entry;
  314. u32 offset;
  315. u32 reg;
  316. offset = MAC_WCID_ATTR_ENTRY(key->hw_key_idx);
  317. rt2800_register_read(rt2x00dev, offset, &reg);
  318. rt2x00_set_field32(&reg, MAC_WCID_ATTRIBUTE_KEYTAB,
  319. !!(key->flags & IEEE80211_KEY_FLAG_PAIRWISE));
  320. rt2x00_set_field32(&reg, MAC_WCID_ATTRIBUTE_CIPHER,
  321. (crypto->cmd == SET_KEY) * crypto->cipher);
  322. rt2x00_set_field32(&reg, MAC_WCID_ATTRIBUTE_BSS_IDX,
  323. (crypto->cmd == SET_KEY) * crypto->bssidx);
  324. rt2x00_set_field32(&reg, MAC_WCID_ATTRIBUTE_RX_WIUDF, crypto->cipher);
  325. rt2800_register_write(rt2x00dev, offset, reg);
  326. offset = MAC_IVEIV_ENTRY(key->hw_key_idx);
  327. memset(&iveiv_entry, 0, sizeof(iveiv_entry));
  328. if ((crypto->cipher == CIPHER_TKIP) ||
  329. (crypto->cipher == CIPHER_TKIP_NO_MIC) ||
  330. (crypto->cipher == CIPHER_AES))
  331. iveiv_entry.iv[3] |= 0x20;
  332. iveiv_entry.iv[3] |= key->keyidx << 6;
  333. rt2800_register_multiwrite(rt2x00dev, offset,
  334. &iveiv_entry, sizeof(iveiv_entry));
  335. offset = MAC_WCID_ENTRY(key->hw_key_idx);
  336. memset(&wcid_entry, 0, sizeof(wcid_entry));
  337. if (crypto->cmd == SET_KEY)
  338. memcpy(&wcid_entry, crypto->address, ETH_ALEN);
  339. rt2800_register_multiwrite(rt2x00dev, offset,
  340. &wcid_entry, sizeof(wcid_entry));
  341. }
  342. int rt2800_config_shared_key(struct rt2x00_dev *rt2x00dev,
  343. struct rt2x00lib_crypto *crypto,
  344. struct ieee80211_key_conf *key)
  345. {
  346. struct hw_key_entry key_entry;
  347. struct rt2x00_field32 field;
  348. u32 offset;
  349. u32 reg;
  350. if (crypto->cmd == SET_KEY) {
  351. key->hw_key_idx = (4 * crypto->bssidx) + key->keyidx;
  352. memcpy(key_entry.key, crypto->key,
  353. sizeof(key_entry.key));
  354. memcpy(key_entry.tx_mic, crypto->tx_mic,
  355. sizeof(key_entry.tx_mic));
  356. memcpy(key_entry.rx_mic, crypto->rx_mic,
  357. sizeof(key_entry.rx_mic));
  358. offset = SHARED_KEY_ENTRY(key->hw_key_idx);
  359. rt2800_register_multiwrite(rt2x00dev, offset,
  360. &key_entry, sizeof(key_entry));
  361. }
  362. /*
  363. * The cipher types are stored over multiple registers
  364. * starting with SHARED_KEY_MODE_BASE each word will have
  365. * 32 bits and contains the cipher types for 2 bssidx each.
  366. * Using the correct defines correctly will cause overhead,
  367. * so just calculate the correct offset.
  368. */
  369. field.bit_offset = 4 * (key->hw_key_idx % 8);
  370. field.bit_mask = 0x7 << field.bit_offset;
  371. offset = SHARED_KEY_MODE_ENTRY(key->hw_key_idx / 8);
  372. rt2800_register_read(rt2x00dev, offset, &reg);
  373. rt2x00_set_field32(&reg, field,
  374. (crypto->cmd == SET_KEY) * crypto->cipher);
  375. rt2800_register_write(rt2x00dev, offset, reg);
  376. /*
  377. * Update WCID information
  378. */
  379. rt2800_config_wcid_attr(rt2x00dev, crypto, key);
  380. return 0;
  381. }
  382. EXPORT_SYMBOL_GPL(rt2800_config_shared_key);
  383. int rt2800_config_pairwise_key(struct rt2x00_dev *rt2x00dev,
  384. struct rt2x00lib_crypto *crypto,
  385. struct ieee80211_key_conf *key)
  386. {
  387. struct hw_key_entry key_entry;
  388. u32 offset;
  389. if (crypto->cmd == SET_KEY) {
  390. /*
  391. * 1 pairwise key is possible per AID, this means that the AID
  392. * equals our hw_key_idx. Make sure the WCID starts _after_ the
  393. * last possible shared key entry.
  394. */
  395. if (crypto->aid > (256 - 32))
  396. return -ENOSPC;
  397. key->hw_key_idx = 32 + crypto->aid;
  398. memcpy(key_entry.key, crypto->key,
  399. sizeof(key_entry.key));
  400. memcpy(key_entry.tx_mic, crypto->tx_mic,
  401. sizeof(key_entry.tx_mic));
  402. memcpy(key_entry.rx_mic, crypto->rx_mic,
  403. sizeof(key_entry.rx_mic));
  404. offset = PAIRWISE_KEY_ENTRY(key->hw_key_idx);
  405. rt2800_register_multiwrite(rt2x00dev, offset,
  406. &key_entry, sizeof(key_entry));
  407. }
  408. /*
  409. * Update WCID information
  410. */
  411. rt2800_config_wcid_attr(rt2x00dev, crypto, key);
  412. return 0;
  413. }
  414. EXPORT_SYMBOL_GPL(rt2800_config_pairwise_key);
  415. void rt2800_config_filter(struct rt2x00_dev *rt2x00dev,
  416. const unsigned int filter_flags)
  417. {
  418. u32 reg;
  419. /*
  420. * Start configuration steps.
  421. * Note that the version error will always be dropped
  422. * and broadcast frames will always be accepted since
  423. * there is no filter for it at this time.
  424. */
  425. rt2800_register_read(rt2x00dev, RX_FILTER_CFG, &reg);
  426. rt2x00_set_field32(&reg, RX_FILTER_CFG_DROP_CRC_ERROR,
  427. !(filter_flags & FIF_FCSFAIL));
  428. rt2x00_set_field32(&reg, RX_FILTER_CFG_DROP_PHY_ERROR,
  429. !(filter_flags & FIF_PLCPFAIL));
  430. rt2x00_set_field32(&reg, RX_FILTER_CFG_DROP_NOT_TO_ME,
  431. !(filter_flags & FIF_PROMISC_IN_BSS));
  432. rt2x00_set_field32(&reg, RX_FILTER_CFG_DROP_NOT_MY_BSSD, 0);
  433. rt2x00_set_field32(&reg, RX_FILTER_CFG_DROP_VER_ERROR, 1);
  434. rt2x00_set_field32(&reg, RX_FILTER_CFG_DROP_MULTICAST,
  435. !(filter_flags & FIF_ALLMULTI));
  436. rt2x00_set_field32(&reg, RX_FILTER_CFG_DROP_BROADCAST, 0);
  437. rt2x00_set_field32(&reg, RX_FILTER_CFG_DROP_DUPLICATE, 1);
  438. rt2x00_set_field32(&reg, RX_FILTER_CFG_DROP_CF_END_ACK,
  439. !(filter_flags & FIF_CONTROL));
  440. rt2x00_set_field32(&reg, RX_FILTER_CFG_DROP_CF_END,
  441. !(filter_flags & FIF_CONTROL));
  442. rt2x00_set_field32(&reg, RX_FILTER_CFG_DROP_ACK,
  443. !(filter_flags & FIF_CONTROL));
  444. rt2x00_set_field32(&reg, RX_FILTER_CFG_DROP_CTS,
  445. !(filter_flags & FIF_CONTROL));
  446. rt2x00_set_field32(&reg, RX_FILTER_CFG_DROP_RTS,
  447. !(filter_flags & FIF_CONTROL));
  448. rt2x00_set_field32(&reg, RX_FILTER_CFG_DROP_PSPOLL,
  449. !(filter_flags & FIF_PSPOLL));
  450. rt2x00_set_field32(&reg, RX_FILTER_CFG_DROP_BA, 1);
  451. rt2x00_set_field32(&reg, RX_FILTER_CFG_DROP_BAR, 0);
  452. rt2x00_set_field32(&reg, RX_FILTER_CFG_DROP_CNTL,
  453. !(filter_flags & FIF_CONTROL));
  454. rt2800_register_write(rt2x00dev, RX_FILTER_CFG, reg);
  455. }
  456. EXPORT_SYMBOL_GPL(rt2800_config_filter);
  457. void rt2800_config_intf(struct rt2x00_dev *rt2x00dev, struct rt2x00_intf *intf,
  458. struct rt2x00intf_conf *conf, const unsigned int flags)
  459. {
  460. unsigned int beacon_base;
  461. u32 reg;
  462. if (flags & CONFIG_UPDATE_TYPE) {
  463. /*
  464. * Clear current synchronisation setup.
  465. * For the Beacon base registers we only need to clear
  466. * the first byte since that byte contains the VALID and OWNER
  467. * bits which (when set to 0) will invalidate the entire beacon.
  468. */
  469. beacon_base = HW_BEACON_OFFSET(intf->beacon->entry_idx);
  470. rt2800_register_write(rt2x00dev, beacon_base, 0);
  471. /*
  472. * Enable synchronisation.
  473. */
  474. rt2800_register_read(rt2x00dev, BCN_TIME_CFG, &reg);
  475. rt2x00_set_field32(&reg, BCN_TIME_CFG_TSF_TICKING, 1);
  476. rt2x00_set_field32(&reg, BCN_TIME_CFG_TSF_SYNC, conf->sync);
  477. rt2x00_set_field32(&reg, BCN_TIME_CFG_TBTT_ENABLE, 1);
  478. rt2800_register_write(rt2x00dev, BCN_TIME_CFG, reg);
  479. }
  480. if (flags & CONFIG_UPDATE_MAC) {
  481. reg = le32_to_cpu(conf->mac[1]);
  482. rt2x00_set_field32(&reg, MAC_ADDR_DW1_UNICAST_TO_ME_MASK, 0xff);
  483. conf->mac[1] = cpu_to_le32(reg);
  484. rt2800_register_multiwrite(rt2x00dev, MAC_ADDR_DW0,
  485. conf->mac, sizeof(conf->mac));
  486. }
  487. if (flags & CONFIG_UPDATE_BSSID) {
  488. reg = le32_to_cpu(conf->bssid[1]);
  489. rt2x00_set_field32(&reg, MAC_BSSID_DW1_BSS_ID_MASK, 0);
  490. rt2x00_set_field32(&reg, MAC_BSSID_DW1_BSS_BCN_NUM, 0);
  491. conf->bssid[1] = cpu_to_le32(reg);
  492. rt2800_register_multiwrite(rt2x00dev, MAC_BSSID_DW0,
  493. conf->bssid, sizeof(conf->bssid));
  494. }
  495. }
  496. EXPORT_SYMBOL_GPL(rt2800_config_intf);
  497. void rt2800_config_erp(struct rt2x00_dev *rt2x00dev, struct rt2x00lib_erp *erp)
  498. {
  499. u32 reg;
  500. rt2800_register_read(rt2x00dev, TX_TIMEOUT_CFG, &reg);
  501. rt2x00_set_field32(&reg, TX_TIMEOUT_CFG_RX_ACK_TIMEOUT, 0x20);
  502. rt2800_register_write(rt2x00dev, TX_TIMEOUT_CFG, reg);
  503. rt2800_register_read(rt2x00dev, AUTO_RSP_CFG, &reg);
  504. rt2x00_set_field32(&reg, AUTO_RSP_CFG_BAC_ACK_POLICY,
  505. !!erp->short_preamble);
  506. rt2x00_set_field32(&reg, AUTO_RSP_CFG_AR_PREAMBLE,
  507. !!erp->short_preamble);
  508. rt2800_register_write(rt2x00dev, AUTO_RSP_CFG, reg);
  509. rt2800_register_read(rt2x00dev, OFDM_PROT_CFG, &reg);
  510. rt2x00_set_field32(&reg, OFDM_PROT_CFG_PROTECT_CTRL,
  511. erp->cts_protection ? 2 : 0);
  512. rt2800_register_write(rt2x00dev, OFDM_PROT_CFG, reg);
  513. rt2800_register_write(rt2x00dev, LEGACY_BASIC_RATE,
  514. erp->basic_rates);
  515. rt2800_register_write(rt2x00dev, HT_BASIC_RATE, 0x00008003);
  516. rt2800_register_read(rt2x00dev, BKOFF_SLOT_CFG, &reg);
  517. rt2x00_set_field32(&reg, BKOFF_SLOT_CFG_SLOT_TIME, erp->slot_time);
  518. rt2x00_set_field32(&reg, BKOFF_SLOT_CFG_CC_DELAY_TIME, 2);
  519. rt2800_register_write(rt2x00dev, BKOFF_SLOT_CFG, reg);
  520. rt2800_register_read(rt2x00dev, XIFS_TIME_CFG, &reg);
  521. rt2x00_set_field32(&reg, XIFS_TIME_CFG_CCKM_SIFS_TIME, erp->sifs);
  522. rt2x00_set_field32(&reg, XIFS_TIME_CFG_OFDM_SIFS_TIME, erp->sifs);
  523. rt2x00_set_field32(&reg, XIFS_TIME_CFG_OFDM_XIFS_TIME, 4);
  524. rt2x00_set_field32(&reg, XIFS_TIME_CFG_EIFS, erp->eifs);
  525. rt2x00_set_field32(&reg, XIFS_TIME_CFG_BB_RXEND_ENABLE, 1);
  526. rt2800_register_write(rt2x00dev, XIFS_TIME_CFG, reg);
  527. rt2800_register_read(rt2x00dev, BCN_TIME_CFG, &reg);
  528. rt2x00_set_field32(&reg, BCN_TIME_CFG_BEACON_INTERVAL,
  529. erp->beacon_int * 16);
  530. rt2800_register_write(rt2x00dev, BCN_TIME_CFG, reg);
  531. }
  532. EXPORT_SYMBOL_GPL(rt2800_config_erp);
  533. void rt2800_config_ant(struct rt2x00_dev *rt2x00dev, struct antenna_setup *ant)
  534. {
  535. u8 r1;
  536. u8 r3;
  537. rt2800_bbp_read(rt2x00dev, 1, &r1);
  538. rt2800_bbp_read(rt2x00dev, 3, &r3);
  539. /*
  540. * Configure the TX antenna.
  541. */
  542. switch ((int)ant->tx) {
  543. case 1:
  544. rt2x00_set_field8(&r1, BBP1_TX_ANTENNA, 0);
  545. if (rt2x00_intf_is_pci(rt2x00dev))
  546. rt2x00_set_field8(&r3, BBP3_RX_ANTENNA, 0);
  547. break;
  548. case 2:
  549. rt2x00_set_field8(&r1, BBP1_TX_ANTENNA, 2);
  550. break;
  551. case 3:
  552. /* Do nothing */
  553. break;
  554. }
  555. /*
  556. * Configure the RX antenna.
  557. */
  558. switch ((int)ant->rx) {
  559. case 1:
  560. rt2x00_set_field8(&r3, BBP3_RX_ANTENNA, 0);
  561. break;
  562. case 2:
  563. rt2x00_set_field8(&r3, BBP3_RX_ANTENNA, 1);
  564. break;
  565. case 3:
  566. rt2x00_set_field8(&r3, BBP3_RX_ANTENNA, 2);
  567. break;
  568. }
  569. rt2800_bbp_write(rt2x00dev, 3, r3);
  570. rt2800_bbp_write(rt2x00dev, 1, r1);
  571. }
  572. EXPORT_SYMBOL_GPL(rt2800_config_ant);
  573. static void rt2800_config_lna_gain(struct rt2x00_dev *rt2x00dev,
  574. struct rt2x00lib_conf *libconf)
  575. {
  576. u16 eeprom;
  577. short lna_gain;
  578. if (libconf->rf.channel <= 14) {
  579. rt2x00_eeprom_read(rt2x00dev, EEPROM_LNA, &eeprom);
  580. lna_gain = rt2x00_get_field16(eeprom, EEPROM_LNA_BG);
  581. } else if (libconf->rf.channel <= 64) {
  582. rt2x00_eeprom_read(rt2x00dev, EEPROM_LNA, &eeprom);
  583. lna_gain = rt2x00_get_field16(eeprom, EEPROM_LNA_A0);
  584. } else if (libconf->rf.channel <= 128) {
  585. rt2x00_eeprom_read(rt2x00dev, EEPROM_RSSI_BG2, &eeprom);
  586. lna_gain = rt2x00_get_field16(eeprom, EEPROM_RSSI_BG2_LNA_A1);
  587. } else {
  588. rt2x00_eeprom_read(rt2x00dev, EEPROM_RSSI_A2, &eeprom);
  589. lna_gain = rt2x00_get_field16(eeprom, EEPROM_RSSI_A2_LNA_A2);
  590. }
  591. rt2x00dev->lna_gain = lna_gain;
  592. }
  593. static void rt2800_config_channel_rt2x(struct rt2x00_dev *rt2x00dev,
  594. struct ieee80211_conf *conf,
  595. struct rf_channel *rf,
  596. struct channel_info *info)
  597. {
  598. rt2x00_set_field32(&rf->rf4, RF4_FREQ_OFFSET, rt2x00dev->freq_offset);
  599. if (rt2x00dev->default_ant.tx == 1)
  600. rt2x00_set_field32(&rf->rf2, RF2_ANTENNA_TX1, 1);
  601. if (rt2x00dev->default_ant.rx == 1) {
  602. rt2x00_set_field32(&rf->rf2, RF2_ANTENNA_RX1, 1);
  603. rt2x00_set_field32(&rf->rf2, RF2_ANTENNA_RX2, 1);
  604. } else if (rt2x00dev->default_ant.rx == 2)
  605. rt2x00_set_field32(&rf->rf2, RF2_ANTENNA_RX2, 1);
  606. if (rf->channel > 14) {
  607. /*
  608. * When TX power is below 0, we should increase it by 7 to
  609. * make it a positive value (Minumum value is -7).
  610. * However this means that values between 0 and 7 have
  611. * double meaning, and we should set a 7DBm boost flag.
  612. */
  613. rt2x00_set_field32(&rf->rf3, RF3_TXPOWER_A_7DBM_BOOST,
  614. (info->tx_power1 >= 0));
  615. if (info->tx_power1 < 0)
  616. info->tx_power1 += 7;
  617. rt2x00_set_field32(&rf->rf3, RF3_TXPOWER_A,
  618. TXPOWER_A_TO_DEV(info->tx_power1));
  619. rt2x00_set_field32(&rf->rf4, RF4_TXPOWER_A_7DBM_BOOST,
  620. (info->tx_power2 >= 0));
  621. if (info->tx_power2 < 0)
  622. info->tx_power2 += 7;
  623. rt2x00_set_field32(&rf->rf4, RF4_TXPOWER_A,
  624. TXPOWER_A_TO_DEV(info->tx_power2));
  625. } else {
  626. rt2x00_set_field32(&rf->rf3, RF3_TXPOWER_G,
  627. TXPOWER_G_TO_DEV(info->tx_power1));
  628. rt2x00_set_field32(&rf->rf4, RF4_TXPOWER_G,
  629. TXPOWER_G_TO_DEV(info->tx_power2));
  630. }
  631. rt2x00_set_field32(&rf->rf4, RF4_HT40, conf_is_ht40(conf));
  632. rt2800_rf_write(rt2x00dev, 1, rf->rf1);
  633. rt2800_rf_write(rt2x00dev, 2, rf->rf2);
  634. rt2800_rf_write(rt2x00dev, 3, rf->rf3 & ~0x00000004);
  635. rt2800_rf_write(rt2x00dev, 4, rf->rf4);
  636. udelay(200);
  637. rt2800_rf_write(rt2x00dev, 1, rf->rf1);
  638. rt2800_rf_write(rt2x00dev, 2, rf->rf2);
  639. rt2800_rf_write(rt2x00dev, 3, rf->rf3 | 0x00000004);
  640. rt2800_rf_write(rt2x00dev, 4, rf->rf4);
  641. udelay(200);
  642. rt2800_rf_write(rt2x00dev, 1, rf->rf1);
  643. rt2800_rf_write(rt2x00dev, 2, rf->rf2);
  644. rt2800_rf_write(rt2x00dev, 3, rf->rf3 & ~0x00000004);
  645. rt2800_rf_write(rt2x00dev, 4, rf->rf4);
  646. }
  647. static void rt2800_config_channel_rt3x(struct rt2x00_dev *rt2x00dev,
  648. struct ieee80211_conf *conf,
  649. struct rf_channel *rf,
  650. struct channel_info *info)
  651. {
  652. u8 rfcsr;
  653. rt2800_rfcsr_write(rt2x00dev, 2, rf->rf1);
  654. rt2800_rfcsr_write(rt2x00dev, 2, rf->rf3);
  655. rt2800_rfcsr_read(rt2x00dev, 6, &rfcsr);
  656. rt2x00_set_field8(&rfcsr, RFCSR6_R, rf->rf2);
  657. rt2800_rfcsr_write(rt2x00dev, 6, rfcsr);
  658. rt2800_rfcsr_read(rt2x00dev, 12, &rfcsr);
  659. rt2x00_set_field8(&rfcsr, RFCSR12_TX_POWER,
  660. TXPOWER_G_TO_DEV(info->tx_power1));
  661. rt2800_rfcsr_write(rt2x00dev, 12, rfcsr);
  662. rt2800_rfcsr_read(rt2x00dev, 23, &rfcsr);
  663. rt2x00_set_field8(&rfcsr, RFCSR23_FREQ_OFFSET, rt2x00dev->freq_offset);
  664. rt2800_rfcsr_write(rt2x00dev, 23, rfcsr);
  665. rt2800_rfcsr_write(rt2x00dev, 24,
  666. rt2x00dev->calibration[conf_is_ht40(conf)]);
  667. rt2800_rfcsr_read(rt2x00dev, 23, &rfcsr);
  668. rt2x00_set_field8(&rfcsr, RFCSR7_RF_TUNING, 1);
  669. rt2800_rfcsr_write(rt2x00dev, 23, rfcsr);
  670. }
  671. static void rt2800_config_channel(struct rt2x00_dev *rt2x00dev,
  672. struct ieee80211_conf *conf,
  673. struct rf_channel *rf,
  674. struct channel_info *info)
  675. {
  676. u32 reg;
  677. unsigned int tx_pin;
  678. u8 bbp;
  679. if (rt2x00_rev(&rt2x00dev->chip) != RT3070_VERSION)
  680. rt2800_config_channel_rt2x(rt2x00dev, conf, rf, info);
  681. else
  682. rt2800_config_channel_rt3x(rt2x00dev, conf, rf, info);
  683. /*
  684. * Change BBP settings
  685. */
  686. rt2800_bbp_write(rt2x00dev, 62, 0x37 - rt2x00dev->lna_gain);
  687. rt2800_bbp_write(rt2x00dev, 63, 0x37 - rt2x00dev->lna_gain);
  688. rt2800_bbp_write(rt2x00dev, 64, 0x37 - rt2x00dev->lna_gain);
  689. rt2800_bbp_write(rt2x00dev, 86, 0);
  690. if (rf->channel <= 14) {
  691. if (test_bit(CONFIG_EXTERNAL_LNA_BG, &rt2x00dev->flags)) {
  692. rt2800_bbp_write(rt2x00dev, 82, 0x62);
  693. rt2800_bbp_write(rt2x00dev, 75, 0x46);
  694. } else {
  695. rt2800_bbp_write(rt2x00dev, 82, 0x84);
  696. rt2800_bbp_write(rt2x00dev, 75, 0x50);
  697. }
  698. } else {
  699. rt2800_bbp_write(rt2x00dev, 82, 0xf2);
  700. if (test_bit(CONFIG_EXTERNAL_LNA_A, &rt2x00dev->flags))
  701. rt2800_bbp_write(rt2x00dev, 75, 0x46);
  702. else
  703. rt2800_bbp_write(rt2x00dev, 75, 0x50);
  704. }
  705. rt2800_register_read(rt2x00dev, TX_BAND_CFG, &reg);
  706. rt2x00_set_field32(&reg, TX_BAND_CFG_HT40_PLUS, conf_is_ht40_plus(conf));
  707. rt2x00_set_field32(&reg, TX_BAND_CFG_A, rf->channel > 14);
  708. rt2x00_set_field32(&reg, TX_BAND_CFG_BG, rf->channel <= 14);
  709. rt2800_register_write(rt2x00dev, TX_BAND_CFG, reg);
  710. tx_pin = 0;
  711. /* Turn on unused PA or LNA when not using 1T or 1R */
  712. if (rt2x00dev->default_ant.tx != 1) {
  713. rt2x00_set_field32(&tx_pin, TX_PIN_CFG_PA_PE_A1_EN, 1);
  714. rt2x00_set_field32(&tx_pin, TX_PIN_CFG_PA_PE_G1_EN, 1);
  715. }
  716. /* Turn on unused PA or LNA when not using 1T or 1R */
  717. if (rt2x00dev->default_ant.rx != 1) {
  718. rt2x00_set_field32(&tx_pin, TX_PIN_CFG_LNA_PE_A1_EN, 1);
  719. rt2x00_set_field32(&tx_pin, TX_PIN_CFG_LNA_PE_G1_EN, 1);
  720. }
  721. rt2x00_set_field32(&tx_pin, TX_PIN_CFG_LNA_PE_A0_EN, 1);
  722. rt2x00_set_field32(&tx_pin, TX_PIN_CFG_LNA_PE_G0_EN, 1);
  723. rt2x00_set_field32(&tx_pin, TX_PIN_CFG_RFTR_EN, 1);
  724. rt2x00_set_field32(&tx_pin, TX_PIN_CFG_TRSW_EN, 1);
  725. rt2x00_set_field32(&tx_pin, TX_PIN_CFG_PA_PE_G0_EN, rf->channel <= 14);
  726. rt2x00_set_field32(&tx_pin, TX_PIN_CFG_PA_PE_A0_EN, rf->channel > 14);
  727. rt2800_register_write(rt2x00dev, TX_PIN_CFG, tx_pin);
  728. rt2800_bbp_read(rt2x00dev, 4, &bbp);
  729. rt2x00_set_field8(&bbp, BBP4_BANDWIDTH, 2 * conf_is_ht40(conf));
  730. rt2800_bbp_write(rt2x00dev, 4, bbp);
  731. rt2800_bbp_read(rt2x00dev, 3, &bbp);
  732. rt2x00_set_field8(&bbp, BBP3_HT40_PLUS, conf_is_ht40_plus(conf));
  733. rt2800_bbp_write(rt2x00dev, 3, bbp);
  734. if (rt2x00_rev(&rt2x00dev->chip) == RT2860C_VERSION) {
  735. if (conf_is_ht40(conf)) {
  736. rt2800_bbp_write(rt2x00dev, 69, 0x1a);
  737. rt2800_bbp_write(rt2x00dev, 70, 0x0a);
  738. rt2800_bbp_write(rt2x00dev, 73, 0x16);
  739. } else {
  740. rt2800_bbp_write(rt2x00dev, 69, 0x16);
  741. rt2800_bbp_write(rt2x00dev, 70, 0x08);
  742. rt2800_bbp_write(rt2x00dev, 73, 0x11);
  743. }
  744. }
  745. msleep(1);
  746. }
  747. static void rt2800_config_txpower(struct rt2x00_dev *rt2x00dev,
  748. const int txpower)
  749. {
  750. u32 reg;
  751. u32 value = TXPOWER_G_TO_DEV(txpower);
  752. u8 r1;
  753. rt2800_bbp_read(rt2x00dev, 1, &r1);
  754. rt2x00_set_field8(&reg, BBP1_TX_POWER, 0);
  755. rt2800_bbp_write(rt2x00dev, 1, r1);
  756. rt2800_register_read(rt2x00dev, TX_PWR_CFG_0, &reg);
  757. rt2x00_set_field32(&reg, TX_PWR_CFG_0_1MBS, value);
  758. rt2x00_set_field32(&reg, TX_PWR_CFG_0_2MBS, value);
  759. rt2x00_set_field32(&reg, TX_PWR_CFG_0_55MBS, value);
  760. rt2x00_set_field32(&reg, TX_PWR_CFG_0_11MBS, value);
  761. rt2x00_set_field32(&reg, TX_PWR_CFG_0_6MBS, value);
  762. rt2x00_set_field32(&reg, TX_PWR_CFG_0_9MBS, value);
  763. rt2x00_set_field32(&reg, TX_PWR_CFG_0_12MBS, value);
  764. rt2x00_set_field32(&reg, TX_PWR_CFG_0_18MBS, value);
  765. rt2800_register_write(rt2x00dev, TX_PWR_CFG_0, reg);
  766. rt2800_register_read(rt2x00dev, TX_PWR_CFG_1, &reg);
  767. rt2x00_set_field32(&reg, TX_PWR_CFG_1_24MBS, value);
  768. rt2x00_set_field32(&reg, TX_PWR_CFG_1_36MBS, value);
  769. rt2x00_set_field32(&reg, TX_PWR_CFG_1_48MBS, value);
  770. rt2x00_set_field32(&reg, TX_PWR_CFG_1_54MBS, value);
  771. rt2x00_set_field32(&reg, TX_PWR_CFG_1_MCS0, value);
  772. rt2x00_set_field32(&reg, TX_PWR_CFG_1_MCS1, value);
  773. rt2x00_set_field32(&reg, TX_PWR_CFG_1_MCS2, value);
  774. rt2x00_set_field32(&reg, TX_PWR_CFG_1_MCS3, value);
  775. rt2800_register_write(rt2x00dev, TX_PWR_CFG_1, reg);
  776. rt2800_register_read(rt2x00dev, TX_PWR_CFG_2, &reg);
  777. rt2x00_set_field32(&reg, TX_PWR_CFG_2_MCS4, value);
  778. rt2x00_set_field32(&reg, TX_PWR_CFG_2_MCS5, value);
  779. rt2x00_set_field32(&reg, TX_PWR_CFG_2_MCS6, value);
  780. rt2x00_set_field32(&reg, TX_PWR_CFG_2_MCS7, value);
  781. rt2x00_set_field32(&reg, TX_PWR_CFG_2_MCS8, value);
  782. rt2x00_set_field32(&reg, TX_PWR_CFG_2_MCS9, value);
  783. rt2x00_set_field32(&reg, TX_PWR_CFG_2_MCS10, value);
  784. rt2x00_set_field32(&reg, TX_PWR_CFG_2_MCS11, value);
  785. rt2800_register_write(rt2x00dev, TX_PWR_CFG_2, reg);
  786. rt2800_register_read(rt2x00dev, TX_PWR_CFG_3, &reg);
  787. rt2x00_set_field32(&reg, TX_PWR_CFG_3_MCS12, value);
  788. rt2x00_set_field32(&reg, TX_PWR_CFG_3_MCS13, value);
  789. rt2x00_set_field32(&reg, TX_PWR_CFG_3_MCS14, value);
  790. rt2x00_set_field32(&reg, TX_PWR_CFG_3_MCS15, value);
  791. rt2x00_set_field32(&reg, TX_PWR_CFG_3_UKNOWN1, value);
  792. rt2x00_set_field32(&reg, TX_PWR_CFG_3_UKNOWN2, value);
  793. rt2x00_set_field32(&reg, TX_PWR_CFG_3_UKNOWN3, value);
  794. rt2x00_set_field32(&reg, TX_PWR_CFG_3_UKNOWN4, value);
  795. rt2800_register_write(rt2x00dev, TX_PWR_CFG_3, reg);
  796. rt2800_register_read(rt2x00dev, TX_PWR_CFG_4, &reg);
  797. rt2x00_set_field32(&reg, TX_PWR_CFG_4_UKNOWN5, value);
  798. rt2x00_set_field32(&reg, TX_PWR_CFG_4_UKNOWN6, value);
  799. rt2x00_set_field32(&reg, TX_PWR_CFG_4_UKNOWN7, value);
  800. rt2x00_set_field32(&reg, TX_PWR_CFG_4_UKNOWN8, value);
  801. rt2800_register_write(rt2x00dev, TX_PWR_CFG_4, reg);
  802. }
  803. static void rt2800_config_retry_limit(struct rt2x00_dev *rt2x00dev,
  804. struct rt2x00lib_conf *libconf)
  805. {
  806. u32 reg;
  807. rt2800_register_read(rt2x00dev, TX_RTY_CFG, &reg);
  808. rt2x00_set_field32(&reg, TX_RTY_CFG_SHORT_RTY_LIMIT,
  809. libconf->conf->short_frame_max_tx_count);
  810. rt2x00_set_field32(&reg, TX_RTY_CFG_LONG_RTY_LIMIT,
  811. libconf->conf->long_frame_max_tx_count);
  812. rt2x00_set_field32(&reg, TX_RTY_CFG_LONG_RTY_THRE, 2000);
  813. rt2x00_set_field32(&reg, TX_RTY_CFG_NON_AGG_RTY_MODE, 0);
  814. rt2x00_set_field32(&reg, TX_RTY_CFG_AGG_RTY_MODE, 0);
  815. rt2x00_set_field32(&reg, TX_RTY_CFG_TX_AUTO_FB_ENABLE, 1);
  816. rt2800_register_write(rt2x00dev, TX_RTY_CFG, reg);
  817. }
  818. static void rt2800_config_ps(struct rt2x00_dev *rt2x00dev,
  819. struct rt2x00lib_conf *libconf)
  820. {
  821. enum dev_state state =
  822. (libconf->conf->flags & IEEE80211_CONF_PS) ?
  823. STATE_SLEEP : STATE_AWAKE;
  824. u32 reg;
  825. if (state == STATE_SLEEP) {
  826. rt2800_register_write(rt2x00dev, AUTOWAKEUP_CFG, 0);
  827. rt2800_register_read(rt2x00dev, AUTOWAKEUP_CFG, &reg);
  828. rt2x00_set_field32(&reg, AUTOWAKEUP_CFG_AUTO_LEAD_TIME, 5);
  829. rt2x00_set_field32(&reg, AUTOWAKEUP_CFG_TBCN_BEFORE_WAKE,
  830. libconf->conf->listen_interval - 1);
  831. rt2x00_set_field32(&reg, AUTOWAKEUP_CFG_AUTOWAKE, 1);
  832. rt2800_register_write(rt2x00dev, AUTOWAKEUP_CFG, reg);
  833. rt2x00dev->ops->lib->set_device_state(rt2x00dev, state);
  834. } else {
  835. rt2x00dev->ops->lib->set_device_state(rt2x00dev, state);
  836. rt2800_register_read(rt2x00dev, AUTOWAKEUP_CFG, &reg);
  837. rt2x00_set_field32(&reg, AUTOWAKEUP_CFG_AUTO_LEAD_TIME, 0);
  838. rt2x00_set_field32(&reg, AUTOWAKEUP_CFG_TBCN_BEFORE_WAKE, 0);
  839. rt2x00_set_field32(&reg, AUTOWAKEUP_CFG_AUTOWAKE, 0);
  840. rt2800_register_write(rt2x00dev, AUTOWAKEUP_CFG, reg);
  841. }
  842. }
  843. void rt2800_config(struct rt2x00_dev *rt2x00dev,
  844. struct rt2x00lib_conf *libconf,
  845. const unsigned int flags)
  846. {
  847. /* Always recalculate LNA gain before changing configuration */
  848. rt2800_config_lna_gain(rt2x00dev, libconf);
  849. if (flags & IEEE80211_CONF_CHANGE_CHANNEL)
  850. rt2800_config_channel(rt2x00dev, libconf->conf,
  851. &libconf->rf, &libconf->channel);
  852. if (flags & IEEE80211_CONF_CHANGE_POWER)
  853. rt2800_config_txpower(rt2x00dev, libconf->conf->power_level);
  854. if (flags & IEEE80211_CONF_CHANGE_RETRY_LIMITS)
  855. rt2800_config_retry_limit(rt2x00dev, libconf);
  856. if (flags & IEEE80211_CONF_CHANGE_PS)
  857. rt2800_config_ps(rt2x00dev, libconf);
  858. }
  859. EXPORT_SYMBOL_GPL(rt2800_config);
  860. /*
  861. * Link tuning
  862. */
  863. void rt2800_link_stats(struct rt2x00_dev *rt2x00dev, struct link_qual *qual)
  864. {
  865. u32 reg;
  866. /*
  867. * Update FCS error count from register.
  868. */
  869. rt2800_register_read(rt2x00dev, RX_STA_CNT0, &reg);
  870. qual->rx_failed = rt2x00_get_field32(reg, RX_STA_CNT0_CRC_ERR);
  871. }
  872. EXPORT_SYMBOL_GPL(rt2800_link_stats);
  873. static u8 rt2800_get_default_vgc(struct rt2x00_dev *rt2x00dev)
  874. {
  875. if (rt2x00dev->curr_band == IEEE80211_BAND_2GHZ) {
  876. if (rt2x00_intf_is_usb(rt2x00dev) &&
  877. rt2x00_rev(&rt2x00dev->chip) == RT3070_VERSION)
  878. return 0x1c + (2 * rt2x00dev->lna_gain);
  879. else
  880. return 0x2e + rt2x00dev->lna_gain;
  881. }
  882. if (!test_bit(CONFIG_CHANNEL_HT40, &rt2x00dev->flags))
  883. return 0x32 + (rt2x00dev->lna_gain * 5) / 3;
  884. else
  885. return 0x3a + (rt2x00dev->lna_gain * 5) / 3;
  886. }
  887. static inline void rt2800_set_vgc(struct rt2x00_dev *rt2x00dev,
  888. struct link_qual *qual, u8 vgc_level)
  889. {
  890. if (qual->vgc_level != vgc_level) {
  891. rt2800_bbp_write(rt2x00dev, 66, vgc_level);
  892. qual->vgc_level = vgc_level;
  893. qual->vgc_level_reg = vgc_level;
  894. }
  895. }
  896. void rt2800_reset_tuner(struct rt2x00_dev *rt2x00dev, struct link_qual *qual)
  897. {
  898. rt2800_set_vgc(rt2x00dev, qual, rt2800_get_default_vgc(rt2x00dev));
  899. }
  900. EXPORT_SYMBOL_GPL(rt2800_reset_tuner);
  901. void rt2800_link_tuner(struct rt2x00_dev *rt2x00dev, struct link_qual *qual,
  902. const u32 count)
  903. {
  904. if (rt2x00_rev(&rt2x00dev->chip) == RT2860C_VERSION)
  905. return;
  906. /*
  907. * When RSSI is better then -80 increase VGC level with 0x10
  908. */
  909. rt2800_set_vgc(rt2x00dev, qual,
  910. rt2800_get_default_vgc(rt2x00dev) +
  911. ((qual->rssi > -80) * 0x10));
  912. }
  913. EXPORT_SYMBOL_GPL(rt2800_link_tuner);