p54pci.c 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697
  1. /*
  2. * Linux device driver for PCI based Prism54
  3. *
  4. * Copyright (c) 2006, Michael Wu <flamingice@sourmilk.net>
  5. *
  6. * Based on the islsm (softmac prism54) driver, which is:
  7. * Copyright 2004-2006 Jean-Baptiste Note <jean-baptiste.note@m4x.org>, et al.
  8. *
  9. * This program is free software; you can redistribute it and/or modify
  10. * it under the terms of the GNU General Public License version 2 as
  11. * published by the Free Software Foundation.
  12. */
  13. #include <linux/init.h>
  14. #include <linux/pci.h>
  15. #include <linux/firmware.h>
  16. #include <linux/etherdevice.h>
  17. #include <linux/delay.h>
  18. #include <linux/completion.h>
  19. #include <net/mac80211.h>
  20. #include "p54.h"
  21. #include "p54pci.h"
  22. MODULE_AUTHOR("Michael Wu <flamingice@sourmilk.net>");
  23. MODULE_DESCRIPTION("Prism54 PCI wireless driver");
  24. MODULE_LICENSE("GPL");
  25. MODULE_ALIAS("prism54pci");
  26. static struct pci_device_id p54p_table[] __devinitdata = {
  27. /* Intersil PRISM Duette/Prism GT Wireless LAN adapter */
  28. { PCI_DEVICE(0x1260, 0x3890) },
  29. /* 3COM 3CRWE154G72 Wireless LAN adapter */
  30. { PCI_DEVICE(0x10b7, 0x6001) },
  31. /* Intersil PRISM Indigo Wireless LAN adapter */
  32. { PCI_DEVICE(0x1260, 0x3877) },
  33. /* Intersil PRISM Javelin/Xbow Wireless LAN adapter */
  34. { PCI_DEVICE(0x1260, 0x3886) },
  35. { },
  36. };
  37. MODULE_DEVICE_TABLE(pci, p54p_table);
  38. static int p54p_upload_firmware(struct ieee80211_hw *dev)
  39. {
  40. struct p54p_priv *priv = dev->priv;
  41. const struct firmware *fw_entry = NULL;
  42. __le32 reg;
  43. int err;
  44. __le32 *data;
  45. u32 remains, left, device_addr;
  46. P54P_WRITE(int_enable, cpu_to_le32(0));
  47. P54P_READ(int_enable);
  48. udelay(10);
  49. reg = P54P_READ(ctrl_stat);
  50. reg &= cpu_to_le32(~ISL38XX_CTRL_STAT_RESET);
  51. reg &= cpu_to_le32(~ISL38XX_CTRL_STAT_RAMBOOT);
  52. P54P_WRITE(ctrl_stat, reg);
  53. P54P_READ(ctrl_stat);
  54. udelay(10);
  55. reg |= cpu_to_le32(ISL38XX_CTRL_STAT_RESET);
  56. P54P_WRITE(ctrl_stat, reg);
  57. wmb();
  58. udelay(10);
  59. reg &= cpu_to_le32(~ISL38XX_CTRL_STAT_RESET);
  60. P54P_WRITE(ctrl_stat, reg);
  61. wmb();
  62. mdelay(50);
  63. err = request_firmware(&fw_entry, "isl3886", &priv->pdev->dev);
  64. if (err) {
  65. printk(KERN_ERR "%s (prism54pci): cannot find firmware "
  66. "(isl3886)\n", pci_name(priv->pdev));
  67. return err;
  68. }
  69. p54_parse_firmware(dev, fw_entry);
  70. data = (__le32 *) fw_entry->data;
  71. remains = fw_entry->size;
  72. device_addr = ISL38XX_DEV_FIRMWARE_ADDR;
  73. while (remains) {
  74. u32 i = 0;
  75. left = min((u32)0x1000, remains);
  76. P54P_WRITE(direct_mem_base, cpu_to_le32(device_addr));
  77. P54P_READ(int_enable);
  78. device_addr += 0x1000;
  79. while (i < left) {
  80. P54P_WRITE(direct_mem_win[i], *data++);
  81. i += sizeof(u32);
  82. }
  83. remains -= left;
  84. P54P_READ(int_enable);
  85. }
  86. release_firmware(fw_entry);
  87. reg = P54P_READ(ctrl_stat);
  88. reg &= cpu_to_le32(~ISL38XX_CTRL_STAT_CLKRUN);
  89. reg &= cpu_to_le32(~ISL38XX_CTRL_STAT_RESET);
  90. reg |= cpu_to_le32(ISL38XX_CTRL_STAT_RAMBOOT);
  91. P54P_WRITE(ctrl_stat, reg);
  92. P54P_READ(ctrl_stat);
  93. udelay(10);
  94. reg |= cpu_to_le32(ISL38XX_CTRL_STAT_RESET);
  95. P54P_WRITE(ctrl_stat, reg);
  96. wmb();
  97. udelay(10);
  98. reg &= cpu_to_le32(~ISL38XX_CTRL_STAT_RESET);
  99. P54P_WRITE(ctrl_stat, reg);
  100. wmb();
  101. udelay(10);
  102. return 0;
  103. }
  104. static irqreturn_t p54p_simple_interrupt(int irq, void *dev_id)
  105. {
  106. struct p54p_priv *priv = (struct p54p_priv *) dev_id;
  107. __le32 reg;
  108. reg = P54P_READ(int_ident);
  109. P54P_WRITE(int_ack, reg);
  110. if (reg & P54P_READ(int_enable))
  111. complete(&priv->boot_comp);
  112. return IRQ_HANDLED;
  113. }
  114. static int p54p_read_eeprom(struct ieee80211_hw *dev)
  115. {
  116. struct p54p_priv *priv = dev->priv;
  117. struct p54p_ring_control *ring_control = priv->ring_control;
  118. int err;
  119. struct p54_control_hdr *hdr;
  120. void *eeprom;
  121. dma_addr_t rx_mapping, tx_mapping;
  122. u16 alen;
  123. init_completion(&priv->boot_comp);
  124. err = request_irq(priv->pdev->irq, &p54p_simple_interrupt,
  125. IRQF_SHARED, "prism54pci", priv);
  126. if (err) {
  127. printk(KERN_ERR "%s (prism54pci): failed to register IRQ handler\n",
  128. pci_name(priv->pdev));
  129. return err;
  130. }
  131. eeprom = kmalloc(0x2010 + EEPROM_READBACK_LEN, GFP_KERNEL);
  132. if (!eeprom) {
  133. printk(KERN_ERR "%s (prism54pci): no memory for eeprom!\n",
  134. pci_name(priv->pdev));
  135. err = -ENOMEM;
  136. goto out;
  137. }
  138. memset(ring_control, 0, sizeof(*ring_control));
  139. P54P_WRITE(ring_control_base, cpu_to_le32(priv->ring_control_dma));
  140. P54P_READ(ring_control_base);
  141. udelay(10);
  142. P54P_WRITE(int_enable, cpu_to_le32(ISL38XX_INT_IDENT_INIT));
  143. P54P_READ(int_enable);
  144. udelay(10);
  145. P54P_WRITE(dev_int, cpu_to_le32(ISL38XX_DEV_INT_RESET));
  146. if (!wait_for_completion_interruptible_timeout(&priv->boot_comp, HZ)) {
  147. printk(KERN_ERR "%s (prism54pci): Cannot boot firmware!\n",
  148. pci_name(priv->pdev));
  149. err = -EINVAL;
  150. goto out;
  151. }
  152. P54P_WRITE(int_enable, cpu_to_le32(ISL38XX_INT_IDENT_UPDATE));
  153. P54P_READ(int_enable);
  154. hdr = eeprom + 0x2010;
  155. p54_fill_eeprom_readback(hdr);
  156. hdr->req_id = cpu_to_le32(priv->common.rx_start);
  157. rx_mapping = pci_map_single(priv->pdev, eeprom,
  158. 0x2010, PCI_DMA_FROMDEVICE);
  159. tx_mapping = pci_map_single(priv->pdev, (void *)hdr,
  160. EEPROM_READBACK_LEN, PCI_DMA_TODEVICE);
  161. ring_control->rx_mgmt[0].host_addr = cpu_to_le32(rx_mapping);
  162. ring_control->rx_mgmt[0].len = cpu_to_le16(0x2010);
  163. ring_control->tx_data[0].host_addr = cpu_to_le32(tx_mapping);
  164. ring_control->tx_data[0].device_addr = hdr->req_id;
  165. ring_control->tx_data[0].len = cpu_to_le16(EEPROM_READBACK_LEN);
  166. ring_control->host_idx[2] = cpu_to_le32(1);
  167. ring_control->host_idx[1] = cpu_to_le32(1);
  168. wmb();
  169. mdelay(100);
  170. P54P_WRITE(dev_int, cpu_to_le32(ISL38XX_DEV_INT_UPDATE));
  171. wait_for_completion_interruptible_timeout(&priv->boot_comp, HZ);
  172. wait_for_completion_interruptible_timeout(&priv->boot_comp, HZ);
  173. pci_unmap_single(priv->pdev, tx_mapping,
  174. EEPROM_READBACK_LEN, PCI_DMA_TODEVICE);
  175. pci_unmap_single(priv->pdev, rx_mapping,
  176. 0x2010, PCI_DMA_FROMDEVICE);
  177. alen = le16_to_cpu(ring_control->rx_mgmt[0].len);
  178. if (le32_to_cpu(ring_control->device_idx[2]) != 1 ||
  179. alen < 0x10) {
  180. printk(KERN_ERR "%s (prism54pci): Cannot read eeprom!\n",
  181. pci_name(priv->pdev));
  182. err = -EINVAL;
  183. goto out;
  184. }
  185. p54_parse_eeprom(dev, (u8 *)eeprom + 0x10, alen - 0x10);
  186. out:
  187. kfree(eeprom);
  188. P54P_WRITE(int_enable, cpu_to_le32(0));
  189. P54P_READ(int_enable);
  190. udelay(10);
  191. free_irq(priv->pdev->irq, priv);
  192. P54P_WRITE(dev_int, cpu_to_le32(ISL38XX_DEV_INT_RESET));
  193. return err;
  194. }
  195. static void p54p_refill_rx_ring(struct ieee80211_hw *dev)
  196. {
  197. struct p54p_priv *priv = dev->priv;
  198. struct p54p_ring_control *ring_control = priv->ring_control;
  199. u32 limit, host_idx, idx;
  200. host_idx = le32_to_cpu(ring_control->host_idx[0]);
  201. limit = host_idx;
  202. limit -= le32_to_cpu(ring_control->device_idx[0]);
  203. limit = ARRAY_SIZE(ring_control->rx_data) - limit;
  204. idx = host_idx % ARRAY_SIZE(ring_control->rx_data);
  205. while (limit-- > 1) {
  206. struct p54p_desc *desc = &ring_control->rx_data[idx];
  207. if (!desc->host_addr) {
  208. struct sk_buff *skb;
  209. dma_addr_t mapping;
  210. skb = dev_alloc_skb(MAX_RX_SIZE);
  211. if (!skb)
  212. break;
  213. mapping = pci_map_single(priv->pdev,
  214. skb_tail_pointer(skb),
  215. MAX_RX_SIZE,
  216. PCI_DMA_FROMDEVICE);
  217. desc->host_addr = cpu_to_le32(mapping);
  218. desc->device_addr = 0; // FIXME: necessary?
  219. desc->len = cpu_to_le16(MAX_RX_SIZE);
  220. desc->flags = 0;
  221. priv->rx_buf[idx] = skb;
  222. }
  223. idx++;
  224. host_idx++;
  225. idx %= ARRAY_SIZE(ring_control->rx_data);
  226. }
  227. wmb();
  228. ring_control->host_idx[0] = cpu_to_le32(host_idx);
  229. }
  230. static irqreturn_t p54p_interrupt(int irq, void *dev_id)
  231. {
  232. struct ieee80211_hw *dev = dev_id;
  233. struct p54p_priv *priv = dev->priv;
  234. struct p54p_ring_control *ring_control = priv->ring_control;
  235. __le32 reg;
  236. spin_lock(&priv->lock);
  237. reg = P54P_READ(int_ident);
  238. if (unlikely(reg == cpu_to_le32(0xFFFFFFFF))) {
  239. spin_unlock(&priv->lock);
  240. return IRQ_HANDLED;
  241. }
  242. P54P_WRITE(int_ack, reg);
  243. reg &= P54P_READ(int_enable);
  244. if (reg & cpu_to_le32(ISL38XX_INT_IDENT_UPDATE)) {
  245. struct p54p_desc *desc;
  246. u32 idx, i;
  247. i = priv->tx_idx;
  248. i %= ARRAY_SIZE(ring_control->tx_data);
  249. priv->tx_idx = idx = le32_to_cpu(ring_control->device_idx[1]);
  250. idx %= ARRAY_SIZE(ring_control->tx_data);
  251. while (i != idx) {
  252. desc = &ring_control->tx_data[i];
  253. if (priv->tx_buf[i]) {
  254. kfree(priv->tx_buf[i]);
  255. priv->tx_buf[i] = NULL;
  256. }
  257. pci_unmap_single(priv->pdev, le32_to_cpu(desc->host_addr),
  258. le16_to_cpu(desc->len), PCI_DMA_TODEVICE);
  259. desc->host_addr = 0;
  260. desc->device_addr = 0;
  261. desc->len = 0;
  262. desc->flags = 0;
  263. i++;
  264. i %= ARRAY_SIZE(ring_control->tx_data);
  265. }
  266. i = priv->rx_idx;
  267. i %= ARRAY_SIZE(ring_control->rx_data);
  268. priv->rx_idx = idx = le32_to_cpu(ring_control->device_idx[0]);
  269. idx %= ARRAY_SIZE(ring_control->rx_data);
  270. while (i != idx) {
  271. u16 len;
  272. struct sk_buff *skb;
  273. desc = &ring_control->rx_data[i];
  274. len = le16_to_cpu(desc->len);
  275. skb = priv->rx_buf[i];
  276. skb_put(skb, len);
  277. if (p54_rx(dev, skb)) {
  278. pci_unmap_single(priv->pdev,
  279. le32_to_cpu(desc->host_addr),
  280. MAX_RX_SIZE, PCI_DMA_FROMDEVICE);
  281. priv->rx_buf[i] = NULL;
  282. desc->host_addr = 0;
  283. } else {
  284. skb_trim(skb, 0);
  285. desc->len = cpu_to_le16(MAX_RX_SIZE);
  286. }
  287. i++;
  288. i %= ARRAY_SIZE(ring_control->rx_data);
  289. }
  290. p54p_refill_rx_ring(dev);
  291. wmb();
  292. P54P_WRITE(dev_int, cpu_to_le32(ISL38XX_DEV_INT_UPDATE));
  293. } else if (reg & cpu_to_le32(ISL38XX_INT_IDENT_INIT))
  294. complete(&priv->boot_comp);
  295. spin_unlock(&priv->lock);
  296. return reg ? IRQ_HANDLED : IRQ_NONE;
  297. }
  298. static void p54p_tx(struct ieee80211_hw *dev, struct p54_control_hdr *data,
  299. size_t len, int free_on_tx)
  300. {
  301. struct p54p_priv *priv = dev->priv;
  302. struct p54p_ring_control *ring_control = priv->ring_control;
  303. unsigned long flags;
  304. struct p54p_desc *desc;
  305. dma_addr_t mapping;
  306. u32 device_idx, idx, i;
  307. spin_lock_irqsave(&priv->lock, flags);
  308. device_idx = le32_to_cpu(ring_control->device_idx[1]);
  309. idx = le32_to_cpu(ring_control->host_idx[1]);
  310. i = idx % ARRAY_SIZE(ring_control->tx_data);
  311. mapping = pci_map_single(priv->pdev, data, len, PCI_DMA_TODEVICE);
  312. desc = &ring_control->tx_data[i];
  313. desc->host_addr = cpu_to_le32(mapping);
  314. desc->device_addr = data->req_id;
  315. desc->len = cpu_to_le16(len);
  316. desc->flags = 0;
  317. wmb();
  318. ring_control->host_idx[1] = cpu_to_le32(idx + 1);
  319. if (free_on_tx)
  320. priv->tx_buf[i] = data;
  321. spin_unlock_irqrestore(&priv->lock, flags);
  322. P54P_WRITE(dev_int, cpu_to_le32(ISL38XX_DEV_INT_UPDATE));
  323. P54P_READ(dev_int);
  324. /* FIXME: unlikely to happen because the device usually runs out of
  325. memory before we fill the ring up, but we can make it impossible */
  326. if (idx - device_idx > ARRAY_SIZE(ring_control->tx_data) - 2)
  327. printk(KERN_INFO "%s: tx overflow.\n", wiphy_name(dev->wiphy));
  328. }
  329. static int p54p_open(struct ieee80211_hw *dev)
  330. {
  331. struct p54p_priv *priv = dev->priv;
  332. int err;
  333. init_completion(&priv->boot_comp);
  334. err = request_irq(priv->pdev->irq, &p54p_interrupt,
  335. IRQF_SHARED, "prism54pci", dev);
  336. if (err) {
  337. printk(KERN_ERR "%s: failed to register IRQ handler\n",
  338. wiphy_name(dev->wiphy));
  339. return err;
  340. }
  341. memset(priv->ring_control, 0, sizeof(*priv->ring_control));
  342. priv->rx_idx = priv->tx_idx = 0;
  343. p54p_refill_rx_ring(dev);
  344. p54p_upload_firmware(dev);
  345. P54P_WRITE(ring_control_base, cpu_to_le32(priv->ring_control_dma));
  346. P54P_READ(ring_control_base);
  347. wmb();
  348. udelay(10);
  349. P54P_WRITE(int_enable, cpu_to_le32(ISL38XX_INT_IDENT_INIT));
  350. P54P_READ(int_enable);
  351. wmb();
  352. udelay(10);
  353. P54P_WRITE(dev_int, cpu_to_le32(ISL38XX_DEV_INT_RESET));
  354. P54P_READ(dev_int);
  355. if (!wait_for_completion_interruptible_timeout(&priv->boot_comp, HZ)) {
  356. printk(KERN_ERR "%s: Cannot boot firmware!\n",
  357. wiphy_name(dev->wiphy));
  358. free_irq(priv->pdev->irq, dev);
  359. return -ETIMEDOUT;
  360. }
  361. P54P_WRITE(int_enable, cpu_to_le32(ISL38XX_INT_IDENT_UPDATE));
  362. P54P_READ(int_enable);
  363. wmb();
  364. udelay(10);
  365. P54P_WRITE(dev_int, cpu_to_le32(ISL38XX_DEV_INT_UPDATE));
  366. P54P_READ(dev_int);
  367. wmb();
  368. udelay(10);
  369. return 0;
  370. }
  371. static void p54p_stop(struct ieee80211_hw *dev)
  372. {
  373. struct p54p_priv *priv = dev->priv;
  374. struct p54p_ring_control *ring_control = priv->ring_control;
  375. unsigned int i;
  376. struct p54p_desc *desc;
  377. P54P_WRITE(int_enable, cpu_to_le32(0));
  378. P54P_READ(int_enable);
  379. udelay(10);
  380. free_irq(priv->pdev->irq, dev);
  381. P54P_WRITE(dev_int, cpu_to_le32(ISL38XX_DEV_INT_RESET));
  382. for (i = 0; i < ARRAY_SIZE(priv->rx_buf); i++) {
  383. desc = &ring_control->rx_data[i];
  384. if (desc->host_addr)
  385. pci_unmap_single(priv->pdev, le32_to_cpu(desc->host_addr),
  386. MAX_RX_SIZE, PCI_DMA_FROMDEVICE);
  387. kfree_skb(priv->rx_buf[i]);
  388. priv->rx_buf[i] = NULL;
  389. }
  390. for (i = 0; i < ARRAY_SIZE(priv->tx_buf); i++) {
  391. desc = &ring_control->tx_data[i];
  392. if (desc->host_addr)
  393. pci_unmap_single(priv->pdev, le32_to_cpu(desc->host_addr),
  394. le16_to_cpu(desc->len), PCI_DMA_TODEVICE);
  395. kfree(priv->tx_buf[i]);
  396. priv->tx_buf[i] = NULL;
  397. }
  398. memset(ring_control, 0, sizeof(ring_control));
  399. }
  400. static int __devinit p54p_probe(struct pci_dev *pdev,
  401. const struct pci_device_id *id)
  402. {
  403. struct p54p_priv *priv;
  404. struct ieee80211_hw *dev;
  405. unsigned long mem_addr, mem_len;
  406. int err;
  407. DECLARE_MAC_BUF(mac);
  408. err = pci_enable_device(pdev);
  409. if (err) {
  410. printk(KERN_ERR "%s (prism54pci): Cannot enable new PCI device\n",
  411. pci_name(pdev));
  412. return err;
  413. }
  414. mem_addr = pci_resource_start(pdev, 0);
  415. mem_len = pci_resource_len(pdev, 0);
  416. if (mem_len < sizeof(struct p54p_csr)) {
  417. printk(KERN_ERR "%s (prism54pci): Too short PCI resources\n",
  418. pci_name(pdev));
  419. pci_disable_device(pdev);
  420. return err;
  421. }
  422. err = pci_request_regions(pdev, "prism54pci");
  423. if (err) {
  424. printk(KERN_ERR "%s (prism54pci): Cannot obtain PCI resources\n",
  425. pci_name(pdev));
  426. return err;
  427. }
  428. if (pci_set_dma_mask(pdev, DMA_32BIT_MASK) ||
  429. pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK)) {
  430. printk(KERN_ERR "%s (prism54pci): No suitable DMA available\n",
  431. pci_name(pdev));
  432. goto err_free_reg;
  433. }
  434. pci_set_master(pdev);
  435. pci_try_set_mwi(pdev);
  436. pci_write_config_byte(pdev, 0x40, 0);
  437. pci_write_config_byte(pdev, 0x41, 0);
  438. dev = p54_init_common(sizeof(*priv));
  439. if (!dev) {
  440. printk(KERN_ERR "%s (prism54pci): ieee80211 alloc failed\n",
  441. pci_name(pdev));
  442. err = -ENOMEM;
  443. goto err_free_reg;
  444. }
  445. priv = dev->priv;
  446. priv->pdev = pdev;
  447. SET_IEEE80211_DEV(dev, &pdev->dev);
  448. pci_set_drvdata(pdev, dev);
  449. priv->map = ioremap(mem_addr, mem_len);
  450. if (!priv->map) {
  451. printk(KERN_ERR "%s (prism54pci): Cannot map device memory\n",
  452. pci_name(pdev));
  453. err = -EINVAL; // TODO: use a better error code?
  454. goto err_free_dev;
  455. }
  456. priv->ring_control = pci_alloc_consistent(pdev, sizeof(*priv->ring_control),
  457. &priv->ring_control_dma);
  458. if (!priv->ring_control) {
  459. printk(KERN_ERR "%s (prism54pci): Cannot allocate rings\n",
  460. pci_name(pdev));
  461. err = -ENOMEM;
  462. goto err_iounmap;
  463. }
  464. memset(priv->ring_control, 0, sizeof(*priv->ring_control));
  465. err = p54p_upload_firmware(dev);
  466. if (err)
  467. goto err_free_desc;
  468. err = p54p_read_eeprom(dev);
  469. if (err)
  470. goto err_free_desc;
  471. priv->common.open = p54p_open;
  472. priv->common.stop = p54p_stop;
  473. priv->common.tx = p54p_tx;
  474. spin_lock_init(&priv->lock);
  475. err = ieee80211_register_hw(dev);
  476. if (err) {
  477. printk(KERN_ERR "%s (prism54pci): Cannot register netdevice\n",
  478. pci_name(pdev));
  479. goto err_free_common;
  480. }
  481. printk(KERN_INFO "%s: hwaddr %s, isl38%02x\n",
  482. wiphy_name(dev->wiphy),
  483. print_mac(mac, dev->wiphy->perm_addr),
  484. priv->common.version);
  485. return 0;
  486. err_free_common:
  487. p54_free_common(dev);
  488. err_free_desc:
  489. pci_free_consistent(pdev, sizeof(*priv->ring_control),
  490. priv->ring_control, priv->ring_control_dma);
  491. err_iounmap:
  492. iounmap(priv->map);
  493. err_free_dev:
  494. pci_set_drvdata(pdev, NULL);
  495. ieee80211_free_hw(dev);
  496. err_free_reg:
  497. pci_release_regions(pdev);
  498. pci_disable_device(pdev);
  499. return err;
  500. }
  501. static void __devexit p54p_remove(struct pci_dev *pdev)
  502. {
  503. struct ieee80211_hw *dev = pci_get_drvdata(pdev);
  504. struct p54p_priv *priv;
  505. if (!dev)
  506. return;
  507. ieee80211_unregister_hw(dev);
  508. priv = dev->priv;
  509. pci_free_consistent(pdev, sizeof(*priv->ring_control),
  510. priv->ring_control, priv->ring_control_dma);
  511. p54_free_common(dev);
  512. iounmap(priv->map);
  513. pci_release_regions(pdev);
  514. pci_disable_device(pdev);
  515. ieee80211_free_hw(dev);
  516. }
  517. #ifdef CONFIG_PM
  518. static int p54p_suspend(struct pci_dev *pdev, pm_message_t state)
  519. {
  520. struct ieee80211_hw *dev = pci_get_drvdata(pdev);
  521. struct p54p_priv *priv = dev->priv;
  522. if (priv->common.mode != IEEE80211_IF_TYPE_INVALID) {
  523. ieee80211_stop_queues(dev);
  524. p54p_stop(dev);
  525. }
  526. pci_save_state(pdev);
  527. pci_set_power_state(pdev, pci_choose_state(pdev, state));
  528. return 0;
  529. }
  530. static int p54p_resume(struct pci_dev *pdev)
  531. {
  532. struct ieee80211_hw *dev = pci_get_drvdata(pdev);
  533. struct p54p_priv *priv = dev->priv;
  534. pci_set_power_state(pdev, PCI_D0);
  535. pci_restore_state(pdev);
  536. if (priv->common.mode != IEEE80211_IF_TYPE_INVALID) {
  537. p54p_open(dev);
  538. ieee80211_wake_queues(dev);
  539. }
  540. return 0;
  541. }
  542. #endif /* CONFIG_PM */
  543. static struct pci_driver p54p_driver = {
  544. .name = "prism54pci",
  545. .id_table = p54p_table,
  546. .probe = p54p_probe,
  547. .remove = __devexit_p(p54p_remove),
  548. #ifdef CONFIG_PM
  549. .suspend = p54p_suspend,
  550. .resume = p54p_resume,
  551. #endif /* CONFIG_PM */
  552. };
  553. static int __init p54p_init(void)
  554. {
  555. return pci_register_driver(&p54p_driver);
  556. }
  557. static void __exit p54p_exit(void)
  558. {
  559. pci_unregister_driver(&p54p_driver);
  560. }
  561. module_init(p54p_init);
  562. module_exit(p54p_exit);