You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

rtl818x.c 22KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836
  1. /*
  2. * Linux device driver for RTL8180 / RTL8185
  3. *
  4. * Copyright 2007 Michael Wu <flamingice@sourmilk.net>
  5. * Copyright 2007 Andrea Merello <andreamrl@tiscali.it>
  6. *
  7. * Modified for iPXE, June 2009, by Joshua Oreman <oremanj@rwcr.net>
  8. *
  9. * Based on the r8180 driver, which is:
  10. * Copyright 2004-2005 Andrea Merello <andreamrl@tiscali.it>, et al.
  11. *
  12. * Thanks to Realtek for their support!
  13. *
  14. * This program is free software; you can redistribute it and/or modify
  15. * it under the terms of the GNU General Public License version 2 as
  16. * published by the Free Software Foundation.
  17. */
  18. FILE_LICENCE(GPL2_ONLY);
  19. #include <stdint.h>
  20. #include <errno.h>
  21. #include <stdio.h>
  22. #include <unistd.h>
  23. #include <byteswap.h>
  24. #include <ipxe/iobuf.h>
  25. #include <ipxe/malloc.h>
  26. #include <ipxe/pci.h>
  27. #include <ipxe/net80211.h>
  28. #include <ipxe/netdevice.h>
  29. #include <ipxe/threewire.h>
  30. #include "rtl818x.h"
  31. /* rtl818x_rates[hw rate number] = rate in 100kbps units */
  32. static const u16 rtl818x_rates[] = {
  33. 10, 20, 55, 110, /* 802.11b */
  34. 60, 90, 120, 180, 240, 360, 480, 540, /* 802.11g */
  35. 0, 0, 0, 0, /* index safely using a value masked with 0xF */
  36. };
  37. #define RTL818X_NR_B_RATES 4
  38. #define RTL818X_NR_RATES 12
  39. /* used by RF drivers */
  40. void rtl818x_write_phy(struct net80211_device *dev, u8 addr, u32 data)
  41. {
  42. struct rtl818x_priv *priv = dev->priv;
  43. int i = 10;
  44. u32 buf;
  45. buf = (data << 8) | addr;
  46. rtl818x_iowrite32(priv, (u32 *)&priv->map->PHY[0], buf | 0x80);
  47. while (i--) {
  48. rtl818x_iowrite32(priv, (u32 *)&priv->map->PHY[0], buf);
  49. if (rtl818x_ioread8(priv, &priv->map->PHY[2]) == (data & 0xFF))
  50. return;
  51. }
  52. }
  53. static void rtl818x_handle_rx(struct net80211_device *dev)
  54. {
  55. struct rtl818x_priv *priv = dev->priv;
  56. unsigned int count = RTL818X_RX_RING_SIZE;
  57. while (count--) {
  58. struct rtl818x_rx_desc *entry = &priv->rx_ring[priv->rx_idx];
  59. struct io_buffer *iob = priv->rx_buf[priv->rx_idx];
  60. u32 flags = le32_to_cpu(entry->flags);
  61. if (flags & RTL818X_RX_DESC_FLAG_OWN)
  62. return;
  63. if (flags & (RTL818X_RX_DESC_FLAG_DMA_FAIL |
  64. RTL818X_RX_DESC_FLAG_FOF |
  65. RTL818X_RX_DESC_FLAG_RX_ERR)) {
  66. /* This is crappy hardware. The Linux driver
  67. doesn't even log these. */
  68. goto done;
  69. } else if (flags & RTL818X_RX_DESC_FLAG_CRC32_ERR) {
  70. /* This is actually a corrupt packet. */
  71. DBG2("rtl818x RX:%d CRC fail: flags %08x\n",
  72. priv->rx_idx, flags);
  73. net80211_rx_err(dev, NULL, EIO);
  74. } else {
  75. u32 flags2 = le32_to_cpu(entry->flags2);
  76. struct io_buffer *new_iob = alloc_iob(MAX_RX_SIZE);
  77. if (!new_iob) {
  78. net80211_rx_err(dev, NULL, ENOMEM);
  79. goto done;
  80. }
  81. DBGP("rtl818x RX:%d success: flags %08x %08x\n",
  82. priv->rx_idx, flags, flags2);
  83. iob_put(iob, flags & 0xFFF);
  84. net80211_rx(dev, iob, (flags2 >> 8) & 0x7f,
  85. rtl818x_rates[(flags >> 20) & 0xf]);
  86. iob = new_iob;
  87. priv->rx_buf[priv->rx_idx] = iob;
  88. }
  89. done:
  90. entry->rx_buf = cpu_to_le32(virt_to_bus(iob->data));
  91. entry->flags = cpu_to_le32(RTL818X_RX_DESC_FLAG_OWN | MAX_RX_SIZE);
  92. if (priv->rx_idx == RTL818X_RX_RING_SIZE - 1)
  93. entry->flags |= cpu_to_le32(RTL818X_RX_DESC_FLAG_EOR);
  94. priv->rx_idx = (priv->rx_idx + 1) % RTL818X_RX_RING_SIZE;
  95. }
  96. }
  97. static void rtl818x_handle_tx(struct net80211_device *dev)
  98. {
  99. struct rtl818x_priv *priv = dev->priv;
  100. unsigned int count = RTL818X_TX_RING_SIZE;
  101. while (count--) {
  102. struct rtl818x_tx_desc *entry = &priv->tx_ring[priv->tx_cons];
  103. struct io_buffer *iob = priv->tx_buf[priv->tx_cons];
  104. u32 flags = le32_to_cpu(entry->flags);
  105. int rc;
  106. if ((flags & RTL818X_TX_DESC_FLAG_OWN) || !iob)
  107. return;
  108. rc = 0;
  109. if (!(flags & RTL818X_TX_DESC_FLAG_TX_OK)) {
  110. /* our packet was not ACKed properly */
  111. rc = EIO;
  112. }
  113. net80211_tx_complete(dev, iob, flags & 0xFF, rc);
  114. priv->tx_buf[priv->tx_cons] = NULL;
  115. priv->tx_cons = (priv->tx_cons + 1) % RTL818X_TX_RING_SIZE;
  116. }
  117. }
  118. static void rtl818x_poll(struct net80211_device *dev)
  119. {
  120. struct rtl818x_priv *priv = dev->priv;
  121. u16 reg = rtl818x_ioread16(priv, &priv->map->INT_STATUS);
  122. if (reg == 0xFFFF)
  123. return;
  124. rtl818x_iowrite16(priv, &priv->map->INT_STATUS, reg);
  125. if (reg & (RTL818X_INT_TXN_OK | RTL818X_INT_TXN_ERR))
  126. rtl818x_handle_tx(dev);
  127. if (reg & (RTL818X_INT_RX_OK | RTL818X_INT_RX_ERR))
  128. rtl818x_handle_rx(dev);
  129. }
  130. #define DIV_ROUND_UP(n,d) (((n)+(d)-1)/(d))
  131. static int rtl818x_tx(struct net80211_device *dev, struct io_buffer *iob)
  132. {
  133. struct rtl818x_priv *priv = dev->priv;
  134. struct rtl818x_tx_desc *entry;
  135. u32 tx_flags;
  136. u16 plcp_len = 0;
  137. int len = iob_len(iob);
  138. tx_flags = RTL818X_TX_DESC_FLAG_OWN | RTL818X_TX_DESC_FLAG_FS |
  139. RTL818X_TX_DESC_FLAG_LS | (priv->hw_rate << 24) | len;
  140. if (priv->r8185) {
  141. tx_flags |= RTL818X_TX_DESC_FLAG_DMA |
  142. RTL818X_TX_DESC_FLAG_NO_ENC;
  143. } else {
  144. unsigned int remainder;
  145. plcp_len = DIV_ROUND_UP(16 * (len + 4),
  146. (dev->rates[dev->rate] * 2) / 10);
  147. remainder = (16 * (len + 4)) %
  148. ((dev->rates[dev->rate] * 2) / 10);
  149. if (remainder > 0 && remainder <= 6)
  150. plcp_len |= 1 << 15;
  151. }
  152. entry = &priv->tx_ring[priv->tx_prod];
  153. if (dev->phy_flags & NET80211_PHY_USE_PROTECTION) {
  154. tx_flags |= RTL818X_TX_DESC_FLAG_CTS;
  155. tx_flags |= priv->hw_rtscts_rate << 19;
  156. entry->rts_duration = net80211_cts_duration(dev, len);
  157. } else {
  158. entry->rts_duration = 0;
  159. }
  160. if (entry->flags & RTL818X_TX_DESC_FLAG_OWN) {
  161. /* card hasn't processed the old packet yet! */
  162. return -EBUSY;
  163. }
  164. priv->tx_buf[priv->tx_prod] = iob;
  165. priv->tx_prod = (priv->tx_prod + 1) % RTL818X_TX_RING_SIZE;
  166. entry->plcp_len = cpu_to_le16(plcp_len);
  167. entry->tx_buf = cpu_to_le32(virt_to_bus(iob->data));
  168. entry->frame_len = cpu_to_le32(len);
  169. entry->flags2 = /* alternate retry rate in 100kbps << 4 */ 0;
  170. entry->retry_limit = RTL818X_MAX_RETRIES;
  171. entry->flags = cpu_to_le32(tx_flags);
  172. rtl818x_iowrite8(priv, &priv->map->TX_DMA_POLLING, (1 << 5));
  173. return 0;
  174. }
  175. void rtl818x_set_anaparam(struct rtl818x_priv *priv, u32 anaparam)
  176. {
  177. u8 reg;
  178. rtl818x_iowrite8(priv, &priv->map->EEPROM_CMD, RTL818X_EEPROM_CMD_CONFIG);
  179. reg = rtl818x_ioread8(priv, &priv->map->CONFIG3);
  180. rtl818x_iowrite8(priv, &priv->map->CONFIG3,
  181. reg | RTL818X_CONFIG3_ANAPARAM_WRITE);
  182. rtl818x_iowrite32(priv, &priv->map->ANAPARAM, anaparam);
  183. rtl818x_iowrite8(priv, &priv->map->CONFIG3,
  184. reg & ~RTL818X_CONFIG3_ANAPARAM_WRITE);
  185. rtl818x_iowrite8(priv, &priv->map->EEPROM_CMD, RTL818X_EEPROM_CMD_NORMAL);
  186. }
  187. static int rtl818x_init_hw(struct net80211_device *dev)
  188. {
  189. struct rtl818x_priv *priv = dev->priv;
  190. u16 reg;
  191. rtl818x_iowrite8(priv, &priv->map->CMD, 0);
  192. rtl818x_ioread8(priv, &priv->map->CMD);
  193. mdelay(10);
  194. /* reset */
  195. rtl818x_iowrite16(priv, &priv->map->INT_MASK, 0);
  196. rtl818x_ioread8(priv, &priv->map->CMD);
  197. reg = rtl818x_ioread8(priv, &priv->map->CMD);
  198. reg &= (1 << 1);
  199. reg |= RTL818X_CMD_RESET;
  200. rtl818x_iowrite8(priv, &priv->map->CMD, RTL818X_CMD_RESET);
  201. rtl818x_ioread8(priv, &priv->map->CMD);
  202. mdelay(200);
  203. /* check success of reset */
  204. if (rtl818x_ioread8(priv, &priv->map->CMD) & RTL818X_CMD_RESET) {
  205. DBG("rtl818x %s: reset timeout!\n", dev->netdev->name);
  206. return -ETIMEDOUT;
  207. }
  208. rtl818x_iowrite8(priv, &priv->map->EEPROM_CMD, RTL818X_EEPROM_CMD_LOAD);
  209. rtl818x_ioread8(priv, &priv->map->CMD);
  210. mdelay(200);
  211. if (rtl818x_ioread8(priv, &priv->map->CONFIG3) & (1 << 3)) {
  212. /* For cardbus */
  213. reg = rtl818x_ioread8(priv, &priv->map->CONFIG3);
  214. reg |= 1 << 1;
  215. rtl818x_iowrite8(priv, &priv->map->CONFIG3, reg);
  216. reg = rtl818x_ioread16(priv, &priv->map->FEMR);
  217. reg |= (1 << 15) | (1 << 14) | (1 << 4);
  218. rtl818x_iowrite16(priv, &priv->map->FEMR, reg);
  219. }
  220. rtl818x_iowrite8(priv, &priv->map->MSR, 0);
  221. if (!priv->r8185)
  222. rtl818x_set_anaparam(priv, priv->anaparam);
  223. rtl818x_iowrite32(priv, &priv->map->RDSAR, priv->rx_ring_dma);
  224. rtl818x_iowrite32(priv, &priv->map->TNPDA, priv->tx_ring_dma);
  225. /* TODO: necessary? specs indicate not */
  226. rtl818x_iowrite8(priv, &priv->map->EEPROM_CMD, RTL818X_EEPROM_CMD_CONFIG);
  227. reg = rtl818x_ioread8(priv, &priv->map->CONFIG2);
  228. rtl818x_iowrite8(priv, &priv->map->CONFIG2, reg & ~(1 << 3));
  229. if (priv->r8185) {
  230. reg = rtl818x_ioread8(priv, &priv->map->CONFIG2);
  231. rtl818x_iowrite8(priv, &priv->map->CONFIG2, reg | (1 << 4));
  232. }
  233. rtl818x_iowrite8(priv, &priv->map->EEPROM_CMD, RTL818X_EEPROM_CMD_NORMAL);
  234. /* TODO: set CONFIG5 for calibrating AGC on rtl8180 + philips radio? */
  235. /* TODO: turn off hw wep on rtl8180 */
  236. rtl818x_iowrite32(priv, &priv->map->INT_TIMEOUT, 0);
  237. if (priv->r8185) {
  238. rtl818x_iowrite8(priv, &priv->map->WPA_CONF, 0);
  239. rtl818x_iowrite8(priv, &priv->map->RATE_FALLBACK, 0x81);
  240. rtl818x_iowrite8(priv, &priv->map->RESP_RATE, (8 << 4) | 0);
  241. rtl818x_iowrite16(priv, &priv->map->BRSR, 0x01F3);
  242. /* TODO: set ClkRun enable? necessary? */
  243. reg = rtl818x_ioread8(priv, &priv->map->GP_ENABLE);
  244. rtl818x_iowrite8(priv, &priv->map->GP_ENABLE, reg & ~(1 << 6));
  245. rtl818x_iowrite8(priv, &priv->map->EEPROM_CMD, RTL818X_EEPROM_CMD_CONFIG);
  246. reg = rtl818x_ioread8(priv, &priv->map->CONFIG3);
  247. rtl818x_iowrite8(priv, &priv->map->CONFIG3, reg | (1 << 2));
  248. rtl818x_iowrite8(priv, &priv->map->EEPROM_CMD, RTL818X_EEPROM_CMD_NORMAL);
  249. } else {
  250. rtl818x_iowrite16(priv, &priv->map->BRSR, 0x1);
  251. rtl818x_iowrite8(priv, &priv->map->SECURITY, 0);
  252. rtl818x_iowrite8(priv, &priv->map->PHY_DELAY, 0x6);
  253. rtl818x_iowrite8(priv, &priv->map->CARRIER_SENSE_COUNTER, 0x4C);
  254. }
  255. priv->rf->init(dev);
  256. if (priv->r8185)
  257. rtl818x_iowrite16(priv, &priv->map->BRSR, 0x01F3);
  258. return 0;
  259. }
  260. static int rtl818x_init_rx_ring(struct net80211_device *dev)
  261. {
  262. struct rtl818x_priv *priv = dev->priv;
  263. struct rtl818x_rx_desc *entry;
  264. int i;
  265. priv->rx_ring = malloc_dma(sizeof(*priv->rx_ring) * RTL818X_RX_RING_SIZE,
  266. RTL818X_RING_ALIGN);
  267. priv->rx_ring_dma = virt_to_bus(priv->rx_ring);
  268. if (!priv->rx_ring) {
  269. DBG("rtl818x %s: cannot allocate RX ring\n", dev->netdev->name);
  270. return -ENOMEM;
  271. }
  272. memset(priv->rx_ring, 0, sizeof(*priv->rx_ring) * RTL818X_RX_RING_SIZE);
  273. priv->rx_idx = 0;
  274. for (i = 0; i < RTL818X_RX_RING_SIZE; i++) {
  275. struct io_buffer *iob = alloc_iob(MAX_RX_SIZE);
  276. entry = &priv->rx_ring[i];
  277. if (!iob)
  278. return -ENOMEM;
  279. priv->rx_buf[i] = iob;
  280. entry->rx_buf = cpu_to_le32(virt_to_bus(iob->data));
  281. entry->flags = cpu_to_le32(RTL818X_RX_DESC_FLAG_OWN |
  282. MAX_RX_SIZE);
  283. }
  284. entry->flags |= cpu_to_le32(RTL818X_RX_DESC_FLAG_EOR);
  285. return 0;
  286. }
  287. static void rtl818x_free_rx_ring(struct net80211_device *dev)
  288. {
  289. struct rtl818x_priv *priv = dev->priv;
  290. int i;
  291. for (i = 0; i < RTL818X_RX_RING_SIZE; i++) {
  292. free_iob(priv->rx_buf[i]);
  293. priv->rx_buf[i] = NULL;
  294. }
  295. free_dma(priv->rx_ring, sizeof(*priv->rx_ring) * RTL818X_RX_RING_SIZE);
  296. priv->rx_ring = NULL;
  297. }
  298. static int rtl818x_init_tx_ring(struct net80211_device *dev)
  299. {
  300. struct rtl818x_priv *priv = dev->priv;
  301. int i;
  302. priv->tx_ring = malloc_dma(sizeof(*priv->tx_ring) * RTL818X_TX_RING_SIZE,
  303. RTL818X_RING_ALIGN);
  304. priv->tx_ring_dma = virt_to_bus(priv->tx_ring);
  305. if (!priv->tx_ring) {
  306. DBG("rtl818x %s: cannot allocate TX ring\n", dev->netdev->name);
  307. return -ENOMEM;
  308. }
  309. memset(priv->tx_ring, 0, sizeof(*priv->tx_ring) * RTL818X_TX_RING_SIZE);
  310. priv->tx_prod = priv->tx_cons = 0;
  311. for (i = 0; i < RTL818X_TX_RING_SIZE; i++)
  312. priv->tx_ring[i].next_tx_desc = cpu_to_le32(priv->tx_ring_dma +
  313. ((i + 1) % RTL818X_TX_RING_SIZE) * sizeof(*priv->tx_ring));
  314. return 0;
  315. }
  316. static void rtl818x_free_tx_ring(struct net80211_device *dev)
  317. {
  318. struct rtl818x_priv *priv = dev->priv;
  319. int i;
  320. for (i = 0; i < RTL818X_TX_RING_SIZE; i++) {
  321. if (priv->tx_buf[i])
  322. net80211_tx_complete(dev, priv->tx_buf[i], 0, ECANCELED);
  323. priv->tx_buf[i] = NULL;
  324. }
  325. free_dma(priv->tx_ring, sizeof(*priv->tx_ring) * RTL818X_TX_RING_SIZE);
  326. priv->tx_ring = NULL;
  327. }
  328. static void rtl818x_irq(struct net80211_device *dev, int enable)
  329. {
  330. struct rtl818x_priv *priv = dev->priv;
  331. rtl818x_iowrite16(priv, &priv->map->INT_MASK, enable? 0xFFFF : 0);
  332. }
  333. /* Sets the MAC address of the card. */
  334. static void rtl818x_set_hwaddr(struct net80211_device *dev, u8 *hwaddr)
  335. {
  336. struct rtl818x_priv *priv = dev->priv;
  337. rtl818x_iowrite8(priv, &priv->map->EEPROM_CMD, RTL818X_EEPROM_CMD_CONFIG);
  338. rtl818x_iowrite32(priv, (u32 *)&priv->map->MAC[0],
  339. le32_to_cpu(*(u32 *)hwaddr));
  340. rtl818x_iowrite16(priv, (u16 *)&priv->map->MAC[4],
  341. le16_to_cpu(*(u16 *)(hwaddr + 4)));
  342. rtl818x_iowrite8(priv, &priv->map->EEPROM_CMD, RTL818X_EEPROM_CMD_NORMAL);
  343. }
  344. static int rtl818x_start(struct net80211_device *dev)
  345. {
  346. struct rtl818x_priv *priv = dev->priv;
  347. int ret;
  348. u32 reg;
  349. ret = rtl818x_init_rx_ring(dev);
  350. if (ret)
  351. return ret;
  352. ret = rtl818x_init_tx_ring(dev);
  353. if (ret)
  354. goto err_free_rings;
  355. ret = rtl818x_init_hw(dev);
  356. if (ret)
  357. goto err_free_rings;
  358. rtl818x_set_hwaddr(dev, dev->netdev->ll_addr);
  359. rtl818x_iowrite32(priv, &priv->map->RDSAR, priv->rx_ring_dma);
  360. rtl818x_iowrite32(priv, &priv->map->TNPDA, priv->tx_ring_dma);
  361. rtl818x_iowrite16(priv, &priv->map->INT_MASK, 0);
  362. rtl818x_iowrite32(priv, &priv->map->MAR[0], ~0);
  363. rtl818x_iowrite32(priv, &priv->map->MAR[1], ~0);
  364. reg = RTL818X_RX_CONF_ONLYERLPKT |
  365. RTL818X_RX_CONF_RX_AUTORESETPHY |
  366. RTL818X_RX_CONF_MGMT |
  367. RTL818X_RX_CONF_DATA |
  368. (7 << 8 /* MAX RX DMA */) |
  369. RTL818X_RX_CONF_BROADCAST |
  370. RTL818X_RX_CONF_NICMAC;
  371. if (priv->r8185)
  372. reg |= RTL818X_RX_CONF_CSDM1 | RTL818X_RX_CONF_CSDM2;
  373. else {
  374. reg |= (priv->rfparam & RF_PARAM_CARRIERSENSE1)
  375. ? RTL818X_RX_CONF_CSDM1 : 0;
  376. reg |= (priv->rfparam & RF_PARAM_CARRIERSENSE2)
  377. ? RTL818X_RX_CONF_CSDM2 : 0;
  378. }
  379. priv->rx_conf = reg;
  380. rtl818x_iowrite32(priv, &priv->map->RX_CONF, reg);
  381. if (priv->r8185) {
  382. reg = rtl818x_ioread8(priv, &priv->map->CW_CONF);
  383. reg &= ~RTL818X_CW_CONF_PERPACKET_CW_SHIFT;
  384. reg |= RTL818X_CW_CONF_PERPACKET_RETRY_SHIFT;
  385. rtl818x_iowrite8(priv, &priv->map->CW_CONF, reg);
  386. reg = rtl818x_ioread8(priv, &priv->map->TX_AGC_CTL);
  387. reg &= ~RTL818X_TX_AGC_CTL_PERPACKET_GAIN_SHIFT;
  388. reg &= ~RTL818X_TX_AGC_CTL_PERPACKET_ANTSEL_SHIFT;
  389. reg |= RTL818X_TX_AGC_CTL_FEEDBACK_ANT;
  390. rtl818x_iowrite8(priv, &priv->map->TX_AGC_CTL, reg);
  391. /* disable early TX */
  392. rtl818x_iowrite8(priv, (u8 *)priv->map + 0xec, 0x3f);
  393. }
  394. reg = rtl818x_ioread32(priv, &priv->map->TX_CONF);
  395. reg |= (6 << 21 /* MAX TX DMA */) |
  396. RTL818X_TX_CONF_NO_ICV;
  397. if (priv->r8185)
  398. reg &= ~RTL818X_TX_CONF_PROBE_DTS;
  399. else
  400. reg &= ~RTL818X_TX_CONF_HW_SEQNUM;
  401. /* different meaning, same value on both rtl8185 and rtl8180 */
  402. reg &= ~RTL818X_TX_CONF_SAT_HWPLCP;
  403. rtl818x_iowrite32(priv, &priv->map->TX_CONF, reg);
  404. reg = rtl818x_ioread8(priv, &priv->map->CMD);
  405. reg |= RTL818X_CMD_RX_ENABLE;
  406. reg |= RTL818X_CMD_TX_ENABLE;
  407. rtl818x_iowrite8(priv, &priv->map->CMD, reg);
  408. DBG("%s rtl818x: started\n", dev->netdev->name);
  409. return 0;
  410. err_free_rings:
  411. rtl818x_free_rx_ring(dev);
  412. if (priv->tx_ring)
  413. rtl818x_free_tx_ring(dev);
  414. DBG("%s rtl818x: failed to start\n", dev->netdev->name);
  415. return ret;
  416. }
  417. static void rtl818x_stop(struct net80211_device *dev)
  418. {
  419. struct rtl818x_priv *priv = dev->priv;
  420. u8 reg;
  421. rtl818x_irq(dev, 0);
  422. reg = rtl818x_ioread8(priv, &priv->map->CMD);
  423. reg &= ~RTL818X_CMD_TX_ENABLE;
  424. reg &= ~RTL818X_CMD_RX_ENABLE;
  425. rtl818x_iowrite8(priv, &priv->map->CMD, reg);
  426. priv->rf->stop(dev);
  427. rtl818x_iowrite8(priv, &priv->map->EEPROM_CMD, RTL818X_EEPROM_CMD_CONFIG);
  428. reg = rtl818x_ioread8(priv, &priv->map->CONFIG4);
  429. rtl818x_iowrite8(priv, &priv->map->CONFIG4, reg | RTL818X_CONFIG4_VCOOFF);
  430. rtl818x_iowrite8(priv, &priv->map->EEPROM_CMD, RTL818X_EEPROM_CMD_NORMAL);
  431. rtl818x_free_rx_ring(dev);
  432. rtl818x_free_tx_ring(dev);
  433. }
  434. static int rtl818x_config(struct net80211_device *dev, int changed)
  435. {
  436. struct rtl818x_priv *priv = dev->priv;
  437. int i;
  438. if (changed & NET80211_CFG_CHANNEL)
  439. priv->rf->set_chan(dev, &dev->channels[dev->channel]);
  440. if (changed & NET80211_CFG_ASSOC) {
  441. for (i = 0; i < ETH_ALEN; i++)
  442. rtl818x_iowrite8(priv, &priv->map->BSSID[i], dev->bssid[i]);
  443. rtl818x_iowrite8(priv, &priv->map->MSR,
  444. dev->state & NET80211_ASSOCIATED?
  445. RTL818X_MSR_INFRA : RTL818X_MSR_NO_LINK);
  446. }
  447. if (changed & NET80211_CFG_PHY_PARAMS)
  448. priv->rf->conf_erp(dev);
  449. if (changed & NET80211_CFG_RATE) {
  450. /* figure out the hardware rate number for the new
  451. logical rate */
  452. int hw_rate;
  453. for (hw_rate = 0; hw_rate < RTL818X_NR_RATES &&
  454. rtl818x_rates[hw_rate] != dev->rates[dev->rate];
  455. hw_rate++)
  456. ;
  457. if (hw_rate >= RTL818X_NR_RATES)
  458. return -EINVAL;
  459. priv->hw_rate = hw_rate;
  460. /* and the RTS/CTS rate */
  461. for (hw_rate = 0; hw_rate < RTL818X_NR_RATES &&
  462. rtl818x_rates[hw_rate] !=
  463. dev->rates[dev->rtscts_rate];
  464. hw_rate++)
  465. ;
  466. if (hw_rate >= RTL818X_NR_RATES)
  467. hw_rate = priv->hw_rate;
  468. priv->hw_rtscts_rate = hw_rate;
  469. }
  470. return 0;
  471. }
  472. static const u8 rtl818x_eeprom_bits[] = {
  473. [SPI_BIT_SCLK] = RTL818X_EEPROM_CMD_CK,
  474. [SPI_BIT_MISO] = RTL818X_EEPROM_CMD_READ,
  475. [SPI_BIT_MOSI] = RTL818X_EEPROM_CMD_WRITE,
  476. [SPI_BIT_SS(0)] = RTL818X_EEPROM_CMD_CS,
  477. };
  478. static int rtl818x_spi_read_bit(struct bit_basher *basher, unsigned int bit_id)
  479. {
  480. struct rtl818x_priv *priv = container_of(basher, struct rtl818x_priv,
  481. spibit.basher);
  482. u8 reg = rtl818x_ioread8(priv, &priv->map->EEPROM_CMD);
  483. return reg & rtl818x_eeprom_bits[bit_id];
  484. }
  485. static void rtl818x_spi_write_bit(struct bit_basher *basher,
  486. unsigned int bit_id, unsigned long data)
  487. {
  488. struct rtl818x_priv *priv = container_of(basher, struct rtl818x_priv,
  489. spibit.basher);
  490. u8 reg = rtl818x_ioread8(priv, &priv->map->EEPROM_CMD);
  491. u8 mask = rtl818x_eeprom_bits[bit_id];
  492. reg = (reg & ~mask) | (data & mask);
  493. rtl818x_iowrite8(priv, &priv->map->EEPROM_CMD, reg);
  494. rtl818x_ioread8(priv, &priv->map->EEPROM_CMD);
  495. udelay(10);
  496. }
  497. static struct bit_basher_operations rtl818x_basher_ops = {
  498. .read = rtl818x_spi_read_bit,
  499. .write = rtl818x_spi_write_bit,
  500. };
  501. #if DBGLVL_MAX
  502. static const char *rtl818x_rf_names[] = {
  503. NULL, /* no 0 */
  504. "Intersil", "RFMD", /* unsupported 1-2 */
  505. "SA2400", "max2820", "GRF5101", /* supported 3-5 */
  506. NULL, NULL, NULL, /* no 6-8 */
  507. "RTL8225", /* supported 9 */
  508. "RTL8255", /* unsupported 10 */
  509. };
  510. #define RTL818X_NR_RF_NAMES 11
  511. #endif
  512. struct net80211_device_operations rtl818x_operations = {
  513. .open = rtl818x_start,
  514. .close = rtl818x_stop,
  515. .transmit = rtl818x_tx,
  516. .poll = rtl818x_poll,
  517. .irq = rtl818x_irq,
  518. .config = rtl818x_config,
  519. };
  520. int rtl818x_probe(struct pci_device *pdev )
  521. {
  522. struct net80211_device *dev;
  523. struct rtl818x_priv *priv;
  524. struct rtl818x_rf_ops *rf;
  525. int err, i;
  526. const char *chip_name;
  527. u32 reg;
  528. u16 eeprom_val;
  529. struct net80211_hw_info *hwinfo;
  530. hwinfo = zalloc(sizeof(*hwinfo));
  531. if (!hwinfo) {
  532. DBG("rtl818x: hwinfo alloc failed\n");
  533. err = -ENOMEM;
  534. goto err_alloc_hwinfo;
  535. }
  536. adjust_pci_device(pdev);
  537. dev = net80211_alloc(sizeof(*priv));
  538. if (!dev) {
  539. DBG("rtl818x: net80211 alloc failed\n");
  540. err = -ENOMEM;
  541. goto err_alloc_dev;
  542. }
  543. priv = dev->priv;
  544. priv->pdev = pdev;
  545. dev->netdev->dev = &pdev->dev;
  546. priv->map = (struct rtl818x_csr *)pdev->ioaddr;
  547. if (!priv->map) {
  548. DBG("rtl818x: cannot find device memory\n");
  549. err = -ENXIO;
  550. goto err_free_dev;
  551. }
  552. reg = rtl818x_ioread32(priv, &priv->map->TX_CONF);
  553. reg &= RTL818X_TX_CONF_HWVER_MASK;
  554. switch (reg) {
  555. case RTL818X_TX_CONF_R8180_ABCD:
  556. chip_name = "0";
  557. break;
  558. case RTL818X_TX_CONF_R8180_F:
  559. chip_name = "0vF";
  560. break;
  561. case RTL818X_TX_CONF_R8185_ABC:
  562. chip_name = "5";
  563. break;
  564. case RTL818X_TX_CONF_R8185_D:
  565. chip_name = "5vD";
  566. break;
  567. default:
  568. DBG("rtl818x: Unknown chip! (0x%x)\n", reg >> 25);
  569. err = -ENOSYS;
  570. goto err_free_dev;
  571. }
  572. priv->r8185 = reg & RTL818X_TX_CONF_R8185_ABC;
  573. hwinfo->bands = NET80211_BAND_BIT_2GHZ;
  574. hwinfo->flags = NET80211_HW_RX_HAS_FCS;
  575. hwinfo->signal_type = NET80211_SIGNAL_ARBITRARY;
  576. hwinfo->signal_max = 65;
  577. hwinfo->channel_change_time = 1000;
  578. memcpy(hwinfo->rates[NET80211_BAND_2GHZ], rtl818x_rates,
  579. sizeof(*rtl818x_rates) * RTL818X_NR_RATES);
  580. if (priv->r8185) {
  581. hwinfo->modes = NET80211_MODE_B | NET80211_MODE_G;
  582. hwinfo->nr_rates[NET80211_BAND_2GHZ] = RTL818X_NR_RATES;
  583. } else {
  584. hwinfo->modes = NET80211_MODE_B;
  585. hwinfo->nr_rates[NET80211_BAND_2GHZ] = RTL818X_NR_B_RATES;
  586. }
  587. priv->spibit.basher.op = &rtl818x_basher_ops;
  588. priv->spibit.bus.mode = SPI_MODE_THREEWIRE;
  589. init_spi_bit_basher(&priv->spibit);
  590. DBG2("rtl818x RX_CONF: %08x\n", rtl818x_ioread32(priv, &priv->map->RX_CONF));
  591. if (rtl818x_ioread32(priv, &priv->map->RX_CONF) & (1 << 6))
  592. init_at93c66(&priv->eeprom, 16);
  593. else
  594. init_at93c46(&priv->eeprom, 16);
  595. priv->eeprom.bus = &priv->spibit.bus;
  596. rtl818x_iowrite8(priv, &priv->map->EEPROM_CMD, RTL818X_EEPROM_CMD_PROGRAM);
  597. rtl818x_ioread8(priv, &priv->map->EEPROM_CMD);
  598. udelay(10);
  599. nvs_read(&priv->eeprom.nvs, 0x06, &eeprom_val, 2);
  600. DBG2("rtl818x eeprom val = %04x\n", eeprom_val);
  601. eeprom_val &= 0xFF;
  602. priv->rf = NULL;
  603. for_each_table_entry(rf, RTL818X_RF_DRIVERS) {
  604. if (rf->id == eeprom_val) {
  605. priv->rf = rf;
  606. break;
  607. }
  608. }
  609. if (!priv->rf) {
  610. #if DBGLVL_MAX
  611. if (eeprom_val < RTL818X_NR_RF_NAMES &&
  612. rtl818x_rf_names[eeprom_val] != NULL)
  613. DBG("rtl818x: %s RF frontend not supported!\n",
  614. rtl818x_rf_names[eeprom_val]);
  615. else
  616. DBG("rtl818x: RF frontend #%d not recognized!\n",
  617. eeprom_val);
  618. #endif
  619. err = -ENOSYS;
  620. goto err_free_dev;
  621. }
  622. nvs_read(&priv->eeprom.nvs, 0x17, &eeprom_val, 2);
  623. priv->csthreshold = eeprom_val >> 8;
  624. if (!priv->r8185) {
  625. nvs_read(&priv->eeprom.nvs, 0xD, &priv->anaparam, 4);
  626. nvs_read(&priv->eeprom.nvs, 0x19, &priv->rfparam, 2);
  627. priv->anaparam = le32_to_cpu(priv->anaparam);
  628. priv->rfparam = le16_to_cpu(priv->rfparam);
  629. }
  630. /* read the MAC address */
  631. nvs_read(&priv->eeprom.nvs, 0x7, hwinfo->hwaddr, 6);
  632. /* CCK TX power */
  633. for (i = 0; i < 14; i += 2) {
  634. u16 txpwr;
  635. nvs_read(&priv->eeprom.nvs, 0x10 + (i >> 1), &txpwr, 2);
  636. priv->txpower[i] = txpwr & 0xFF;
  637. priv->txpower[i + 1] = txpwr >> 8;
  638. }
  639. /* OFDM TX power */
  640. if (priv->r8185) {
  641. for (i = 0; i < 14; i += 2) {
  642. u16 txpwr;
  643. nvs_read(&priv->eeprom.nvs, 0x20 + (i >> 1), &txpwr, 2);
  644. priv->txpower[i] |= (txpwr & 0xFF) << 8;
  645. priv->txpower[i + 1] |= txpwr & 0xFF00;
  646. }
  647. }
  648. rtl818x_iowrite8(priv, &priv->map->EEPROM_CMD, RTL818X_EEPROM_CMD_NORMAL);
  649. err = net80211_register(dev, &rtl818x_operations, hwinfo);
  650. if (err) {
  651. DBG("rtl818x: cannot register device\n");
  652. goto err_free_dev;
  653. }
  654. free(hwinfo);
  655. DBG("rtl818x: Realtek RTL818%s (RF chip %s) with address %s\n",
  656. chip_name, priv->rf->name, netdev_addr(dev->netdev));
  657. return 0;
  658. err_free_dev:
  659. pci_set_drvdata(pdev, NULL);
  660. net80211_free(dev);
  661. err_alloc_dev:
  662. free(hwinfo);
  663. err_alloc_hwinfo:
  664. return err;
  665. }
  666. void rtl818x_remove(struct pci_device *pdev)
  667. {
  668. struct net80211_device *dev = pci_get_drvdata(pdev);
  669. if (!dev)
  670. return;
  671. net80211_unregister(dev);
  672. net80211_free(dev);
  673. }