pcie.c 51 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939
  1. /*
  2. * Marvell Wireless LAN device driver: PCIE specific handling
  3. *
  4. * Copyright (C) 2011, Marvell International Ltd.
  5. *
  6. * This software file (the "File") is distributed by Marvell International
  7. * Ltd. under the terms of the GNU General Public License Version 2, June 1991
  8. * (the "License"). You may use, redistribute and/or modify this File in
  9. * accordance with the terms and conditions of the License, a copy of which
  10. * is available by writing to the Free Software Foundation, Inc.,
  11. * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA or on the
  12. * worldwide web at http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
  13. *
  14. * THE FILE IS DISTRIBUTED AS-IS, WITHOUT WARRANTY OF ANY KIND, AND THE
  15. * IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE
  16. * ARE EXPRESSLY DISCLAIMED. The License provides additional details about
  17. * this warranty disclaimer.
  18. */
  19. #include <linux/firmware.h>
  20. #include "decl.h"
  21. #include "ioctl.h"
  22. #include "util.h"
  23. #include "fw.h"
  24. #include "main.h"
  25. #include "wmm.h"
  26. #include "11n.h"
  27. #include "pcie.h"
  28. #define PCIE_VERSION "1.0"
  29. #define DRV_NAME "Marvell mwifiex PCIe"
  30. static u8 user_rmmod;
  31. static struct mwifiex_if_ops pcie_ops;
  32. static struct semaphore add_remove_card_sem;
  33. static int mwifiex_pcie_enable_host_int(struct mwifiex_adapter *adapter);
  34. static int mwifiex_pcie_resume(struct pci_dev *pdev);
  35. /*
  36. * This function is called after skb allocation to update
  37. * "skb->cb" with physical address of data pointer.
  38. */
  39. static phys_addr_t *mwifiex_update_sk_buff_pa(struct sk_buff *skb)
  40. {
  41. phys_addr_t *buf_pa = MWIFIEX_SKB_PACB(skb);
  42. *buf_pa = (phys_addr_t)virt_to_phys(skb->data);
  43. return buf_pa;
  44. }
  45. /*
  46. * This function reads sleep cookie and checks if FW is ready
  47. */
  48. static bool mwifiex_pcie_ok_to_access_hw(struct mwifiex_adapter *adapter)
  49. {
  50. u32 *cookie_addr;
  51. struct pcie_service_card *card = adapter->card;
  52. if (card->sleep_cookie) {
  53. cookie_addr = (u32 *)card->sleep_cookie->data;
  54. dev_dbg(adapter->dev, "info: ACCESS_HW: sleep cookie=0x%x\n",
  55. *cookie_addr);
  56. if (*cookie_addr == FW_AWAKE_COOKIE)
  57. return true;
  58. }
  59. return false;
  60. }
  61. /*
  62. * This function probes an mwifiex device and registers it. It allocates
  63. * the card structure, enables PCIE function number and initiates the
  64. * device registration and initialization procedure by adding a logical
  65. * interface.
  66. */
  67. static int mwifiex_pcie_probe(struct pci_dev *pdev,
  68. const struct pci_device_id *ent)
  69. {
  70. struct pcie_service_card *card;
  71. pr_debug("info: vendor=0x%4.04X device=0x%4.04X rev=%d\n",
  72. pdev->vendor, pdev->device, pdev->revision);
  73. card = kzalloc(sizeof(struct pcie_service_card), GFP_KERNEL);
  74. if (!card)
  75. return -ENOMEM;
  76. card->dev = pdev;
  77. if (mwifiex_add_card(card, &add_remove_card_sem, &pcie_ops,
  78. MWIFIEX_PCIE)) {
  79. pr_err("%s failed\n", __func__);
  80. kfree(card);
  81. return -1;
  82. }
  83. return 0;
  84. }
  85. /*
  86. * This function removes the interface and frees up the card structure.
  87. */
  88. static void mwifiex_pcie_remove(struct pci_dev *pdev)
  89. {
  90. struct pcie_service_card *card;
  91. struct mwifiex_adapter *adapter;
  92. int i;
  93. card = pci_get_drvdata(pdev);
  94. if (!card)
  95. return;
  96. adapter = card->adapter;
  97. if (!adapter || !adapter->priv_num)
  98. return;
  99. if (user_rmmod) {
  100. #ifdef CONFIG_PM
  101. if (adapter->is_suspended)
  102. mwifiex_pcie_resume(pdev);
  103. #endif
  104. for (i = 0; i < adapter->priv_num; i++)
  105. if ((GET_BSS_ROLE(adapter->priv[i]) ==
  106. MWIFIEX_BSS_ROLE_STA) &&
  107. adapter->priv[i]->media_connected)
  108. mwifiex_deauthenticate(adapter->priv[i], NULL);
  109. mwifiex_disable_auto_ds(mwifiex_get_priv(adapter,
  110. MWIFIEX_BSS_ROLE_ANY));
  111. mwifiex_init_shutdown_fw(mwifiex_get_priv(adapter,
  112. MWIFIEX_BSS_ROLE_ANY),
  113. MWIFIEX_FUNC_SHUTDOWN);
  114. }
  115. mwifiex_remove_card(card->adapter, &add_remove_card_sem);
  116. kfree(card);
  117. }
  118. /*
  119. * Kernel needs to suspend all functions separately. Therefore all
  120. * registered functions must have drivers with suspend and resume
  121. * methods. Failing that the kernel simply removes the whole card.
  122. *
  123. * If already not suspended, this function allocates and sends a host
  124. * sleep activate request to the firmware and turns off the traffic.
  125. */
  126. static int mwifiex_pcie_suspend(struct pci_dev *pdev, pm_message_t state)
  127. {
  128. struct mwifiex_adapter *adapter;
  129. struct pcie_service_card *card;
  130. int hs_actived, i;
  131. if (pdev) {
  132. card = (struct pcie_service_card *) pci_get_drvdata(pdev);
  133. if (!card || card->adapter) {
  134. pr_err("Card or adapter structure is not valid\n");
  135. return 0;
  136. }
  137. } else {
  138. pr_err("PCIE device is not specified\n");
  139. return 0;
  140. }
  141. adapter = card->adapter;
  142. hs_actived = mwifiex_enable_hs(adapter);
  143. /* Indicate device suspended */
  144. adapter->is_suspended = true;
  145. for (i = 0; i < adapter->priv_num; i++)
  146. netif_carrier_off(adapter->priv[i]->netdev);
  147. return 0;
  148. }
  149. /*
  150. * Kernel needs to suspend all functions separately. Therefore all
  151. * registered functions must have drivers with suspend and resume
  152. * methods. Failing that the kernel simply removes the whole card.
  153. *
  154. * If already not resumed, this function turns on the traffic and
  155. * sends a host sleep cancel request to the firmware.
  156. */
  157. static int mwifiex_pcie_resume(struct pci_dev *pdev)
  158. {
  159. struct mwifiex_adapter *adapter;
  160. struct pcie_service_card *card;
  161. int i;
  162. if (pdev) {
  163. card = (struct pcie_service_card *) pci_get_drvdata(pdev);
  164. if (!card || !card->adapter) {
  165. pr_err("Card or adapter structure is not valid\n");
  166. return 0;
  167. }
  168. } else {
  169. pr_err("PCIE device is not specified\n");
  170. return 0;
  171. }
  172. adapter = card->adapter;
  173. if (!adapter->is_suspended) {
  174. dev_warn(adapter->dev, "Device already resumed\n");
  175. return 0;
  176. }
  177. adapter->is_suspended = false;
  178. for (i = 0; i < adapter->priv_num; i++)
  179. if (adapter->priv[i]->media_connected)
  180. netif_carrier_on(adapter->priv[i]->netdev);
  181. mwifiex_cancel_hs(mwifiex_get_priv(adapter, MWIFIEX_BSS_ROLE_STA),
  182. MWIFIEX_ASYNC_CMD);
  183. return 0;
  184. }
  185. #define PCIE_VENDOR_ID_MARVELL (0x11ab)
  186. #define PCIE_DEVICE_ID_MARVELL_88W8766P (0x2b30)
  187. static DEFINE_PCI_DEVICE_TABLE(mwifiex_ids) = {
  188. {
  189. PCIE_VENDOR_ID_MARVELL, PCIE_DEVICE_ID_MARVELL_88W8766P,
  190. PCI_ANY_ID, PCI_ANY_ID, 0, 0,
  191. },
  192. {},
  193. };
  194. MODULE_DEVICE_TABLE(pci, mwifiex_ids);
  195. /* PCI Device Driver */
  196. static struct pci_driver __refdata mwifiex_pcie = {
  197. .name = "mwifiex_pcie",
  198. .id_table = mwifiex_ids,
  199. .probe = mwifiex_pcie_probe,
  200. .remove = mwifiex_pcie_remove,
  201. #ifdef CONFIG_PM
  202. /* Power Management Hooks */
  203. .suspend = mwifiex_pcie_suspend,
  204. .resume = mwifiex_pcie_resume,
  205. #endif
  206. };
  207. /*
  208. * This function writes data into PCIE card register.
  209. */
  210. static int mwifiex_write_reg(struct mwifiex_adapter *adapter, int reg, u32 data)
  211. {
  212. struct pcie_service_card *card = adapter->card;
  213. iowrite32(data, card->pci_mmap1 + reg);
  214. return 0;
  215. }
  216. /*
  217. * This function reads data from PCIE card register.
  218. */
  219. static int mwifiex_read_reg(struct mwifiex_adapter *adapter, int reg, u32 *data)
  220. {
  221. struct pcie_service_card *card = adapter->card;
  222. *data = ioread32(card->pci_mmap1 + reg);
  223. return 0;
  224. }
  225. /*
  226. * This function wakes up the card.
  227. *
  228. * A host power up command is written to the card configuration
  229. * register to wake up the card.
  230. */
  231. static int mwifiex_pm_wakeup_card(struct mwifiex_adapter *adapter)
  232. {
  233. int i = 0;
  234. while (mwifiex_pcie_ok_to_access_hw(adapter)) {
  235. i++;
  236. udelay(10);
  237. /* 50ms max wait */
  238. if (i == 50000)
  239. break;
  240. }
  241. dev_dbg(adapter->dev, "event: Wakeup device...\n");
  242. /* Enable interrupts or any chip access will wakeup device */
  243. if (mwifiex_write_reg(adapter, PCIE_HOST_INT_MASK, HOST_INTR_MASK)) {
  244. dev_warn(adapter->dev, "Enable host interrupt failed\n");
  245. return -1;
  246. }
  247. dev_dbg(adapter->dev, "PCIE wakeup: Setting PS_STATE_AWAKE\n");
  248. adapter->ps_state = PS_STATE_AWAKE;
  249. return 0;
  250. }
  251. /*
  252. * This function is called after the card has woken up.
  253. *
  254. * The card configuration register is reset.
  255. */
  256. static int mwifiex_pm_wakeup_card_complete(struct mwifiex_adapter *adapter)
  257. {
  258. dev_dbg(adapter->dev, "cmd: Wakeup device completed\n");
  259. return 0;
  260. }
  261. /*
  262. * This function disables the host interrupt.
  263. *
  264. * The host interrupt mask is read, the disable bit is reset and
  265. * written back to the card host interrupt mask register.
  266. */
  267. static int mwifiex_pcie_disable_host_int(struct mwifiex_adapter *adapter)
  268. {
  269. if (mwifiex_pcie_ok_to_access_hw(adapter)) {
  270. if (mwifiex_write_reg(adapter, PCIE_HOST_INT_MASK,
  271. 0x00000000)) {
  272. dev_warn(adapter->dev, "Disable host interrupt failed\n");
  273. return -1;
  274. }
  275. }
  276. return 0;
  277. }
  278. /*
  279. * This function enables the host interrupt.
  280. *
  281. * The host interrupt enable mask is written to the card
  282. * host interrupt mask register.
  283. */
  284. static int mwifiex_pcie_enable_host_int(struct mwifiex_adapter *adapter)
  285. {
  286. if (mwifiex_pcie_ok_to_access_hw(adapter)) {
  287. /* Simply write the mask to the register */
  288. if (mwifiex_write_reg(adapter, PCIE_HOST_INT_MASK,
  289. HOST_INTR_MASK)) {
  290. dev_warn(adapter->dev, "Enable host interrupt failed\n");
  291. return -1;
  292. }
  293. }
  294. return 0;
  295. }
  296. /*
  297. * This function creates buffer descriptor ring for TX
  298. */
  299. static int mwifiex_pcie_create_txbd_ring(struct mwifiex_adapter *adapter)
  300. {
  301. struct pcie_service_card *card = adapter->card;
  302. struct sk_buff *skb;
  303. int i;
  304. phys_addr_t *buf_pa;
  305. /*
  306. * driver maintaines the write pointer and firmware maintaines the read
  307. * pointer. The write pointer starts at 0 (zero) while the read pointer
  308. * starts at zero with rollover bit set
  309. */
  310. card->txbd_wrptr = 0;
  311. card->txbd_rdptr |= MWIFIEX_BD_FLAG_ROLLOVER_IND;
  312. /* allocate shared memory for the BD ring and divide the same in to
  313. several descriptors */
  314. card->txbd_ring_size = sizeof(struct mwifiex_pcie_buf_desc) *
  315. MWIFIEX_MAX_TXRX_BD;
  316. dev_dbg(adapter->dev, "info: txbd_ring: Allocating %d bytes\n",
  317. card->txbd_ring_size);
  318. card->txbd_ring_vbase = kzalloc(card->txbd_ring_size, GFP_KERNEL);
  319. if (!card->txbd_ring_vbase) {
  320. dev_err(adapter->dev, "Unable to allocate buffer for txbd ring.\n");
  321. return -ENOMEM;
  322. }
  323. card->txbd_ring_pbase = virt_to_phys(card->txbd_ring_vbase);
  324. dev_dbg(adapter->dev, "info: txbd_ring - base: %p, pbase: %#x:%x,"
  325. "len: %x\n", card->txbd_ring_vbase,
  326. (u32)card->txbd_ring_pbase,
  327. (u32)((u64)card->txbd_ring_pbase >> 32),
  328. card->txbd_ring_size);
  329. for (i = 0; i < MWIFIEX_MAX_TXRX_BD; i++) {
  330. card->txbd_ring[i] = (struct mwifiex_pcie_buf_desc *)
  331. (card->txbd_ring_vbase +
  332. (sizeof(struct mwifiex_pcie_buf_desc) * i));
  333. /* Allocate buffer here so that firmware can DMA data from it */
  334. skb = dev_alloc_skb(MWIFIEX_RX_DATA_BUF_SIZE);
  335. if (!skb) {
  336. dev_err(adapter->dev, "Unable to allocate skb for TX ring.\n");
  337. kfree(card->txbd_ring_vbase);
  338. return -ENOMEM;
  339. }
  340. buf_pa = mwifiex_update_sk_buff_pa(skb);
  341. skb_put(skb, MWIFIEX_RX_DATA_BUF_SIZE);
  342. dev_dbg(adapter->dev, "info: TX ring: add new skb base: %p, "
  343. "buf_base: %p, buf_pbase: %#x:%x, "
  344. "buf_len: %#x\n", skb, skb->data,
  345. (u32)*buf_pa, (u32)(((u64)*buf_pa >> 32)),
  346. skb->len);
  347. card->tx_buf_list[i] = skb;
  348. card->txbd_ring[i]->paddr = *buf_pa;
  349. card->txbd_ring[i]->len = (u16)skb->len;
  350. card->txbd_ring[i]->flags = 0;
  351. }
  352. return 0;
  353. }
  354. static int mwifiex_pcie_delete_txbd_ring(struct mwifiex_adapter *adapter)
  355. {
  356. struct pcie_service_card *card = adapter->card;
  357. int i;
  358. for (i = 0; i < MWIFIEX_MAX_TXRX_BD; i++) {
  359. if (card->tx_buf_list[i])
  360. dev_kfree_skb_any(card->tx_buf_list[i]);
  361. card->tx_buf_list[i] = NULL;
  362. card->txbd_ring[i]->paddr = 0;
  363. card->txbd_ring[i]->len = 0;
  364. card->txbd_ring[i]->flags = 0;
  365. card->txbd_ring[i] = NULL;
  366. }
  367. kfree(card->txbd_ring_vbase);
  368. card->txbd_ring_size = 0;
  369. card->txbd_wrptr = 0;
  370. card->txbd_rdptr = 0 | MWIFIEX_BD_FLAG_ROLLOVER_IND;
  371. card->txbd_ring_vbase = NULL;
  372. return 0;
  373. }
  374. /*
  375. * This function creates buffer descriptor ring for RX
  376. */
  377. static int mwifiex_pcie_create_rxbd_ring(struct mwifiex_adapter *adapter)
  378. {
  379. struct pcie_service_card *card = adapter->card;
  380. struct sk_buff *skb;
  381. int i;
  382. phys_addr_t *buf_pa;
  383. /*
  384. * driver maintaines the read pointer and firmware maintaines the write
  385. * pointer. The write pointer starts at 0 (zero) while the read pointer
  386. * starts at zero with rollover bit set
  387. */
  388. card->rxbd_wrptr = 0;
  389. card->rxbd_rdptr |= MWIFIEX_BD_FLAG_ROLLOVER_IND;
  390. card->rxbd_ring_size = sizeof(struct mwifiex_pcie_buf_desc) *
  391. MWIFIEX_MAX_TXRX_BD;
  392. dev_dbg(adapter->dev, "info: rxbd_ring: Allocating %d bytes\n",
  393. card->rxbd_ring_size);
  394. card->rxbd_ring_vbase = kzalloc(card->rxbd_ring_size, GFP_KERNEL);
  395. if (!card->rxbd_ring_vbase) {
  396. dev_err(adapter->dev, "Unable to allocate buffer for "
  397. "rxbd_ring.\n");
  398. return -ENOMEM;
  399. }
  400. card->rxbd_ring_pbase = virt_to_phys(card->rxbd_ring_vbase);
  401. dev_dbg(adapter->dev, "info: rxbd_ring - base: %p, pbase: %#x:%x,"
  402. "len: %#x\n", card->rxbd_ring_vbase,
  403. (u32)card->rxbd_ring_pbase,
  404. (u32)((u64)card->rxbd_ring_pbase >> 32),
  405. card->rxbd_ring_size);
  406. for (i = 0; i < MWIFIEX_MAX_TXRX_BD; i++) {
  407. card->rxbd_ring[i] = (struct mwifiex_pcie_buf_desc *)
  408. (card->rxbd_ring_vbase +
  409. (sizeof(struct mwifiex_pcie_buf_desc) * i));
  410. /* Allocate skb here so that firmware can DMA data from it */
  411. skb = dev_alloc_skb(MWIFIEX_RX_DATA_BUF_SIZE);
  412. if (!skb) {
  413. dev_err(adapter->dev, "Unable to allocate skb for RX ring.\n");
  414. kfree(card->rxbd_ring_vbase);
  415. return -ENOMEM;
  416. }
  417. buf_pa = mwifiex_update_sk_buff_pa(skb);
  418. skb_put(skb, MWIFIEX_RX_DATA_BUF_SIZE);
  419. dev_dbg(adapter->dev, "info: RX ring: add new skb base: %p, "
  420. "buf_base: %p, buf_pbase: %#x:%x, "
  421. "buf_len: %#x\n", skb, skb->data,
  422. (u32)*buf_pa, (u32)((u64)*buf_pa >> 32),
  423. skb->len);
  424. card->rx_buf_list[i] = skb;
  425. card->rxbd_ring[i]->paddr = *buf_pa;
  426. card->rxbd_ring[i]->len = (u16)skb->len;
  427. card->rxbd_ring[i]->flags = 0;
  428. }
  429. return 0;
  430. }
  431. /*
  432. * This function deletes Buffer descriptor ring for RX
  433. */
  434. static int mwifiex_pcie_delete_rxbd_ring(struct mwifiex_adapter *adapter)
  435. {
  436. struct pcie_service_card *card = adapter->card;
  437. int i;
  438. for (i = 0; i < MWIFIEX_MAX_TXRX_BD; i++) {
  439. if (card->rx_buf_list[i])
  440. dev_kfree_skb_any(card->rx_buf_list[i]);
  441. card->rx_buf_list[i] = NULL;
  442. card->rxbd_ring[i]->paddr = 0;
  443. card->rxbd_ring[i]->len = 0;
  444. card->rxbd_ring[i]->flags = 0;
  445. card->rxbd_ring[i] = NULL;
  446. }
  447. kfree(card->rxbd_ring_vbase);
  448. card->rxbd_ring_size = 0;
  449. card->rxbd_wrptr = 0;
  450. card->rxbd_rdptr = 0 | MWIFIEX_BD_FLAG_ROLLOVER_IND;
  451. card->rxbd_ring_vbase = NULL;
  452. return 0;
  453. }
  454. /*
  455. * This function creates buffer descriptor ring for Events
  456. */
  457. static int mwifiex_pcie_create_evtbd_ring(struct mwifiex_adapter *adapter)
  458. {
  459. struct pcie_service_card *card = adapter->card;
  460. struct sk_buff *skb;
  461. int i;
  462. phys_addr_t *buf_pa;
  463. /*
  464. * driver maintaines the read pointer and firmware maintaines the write
  465. * pointer. The write pointer starts at 0 (zero) while the read pointer
  466. * starts at zero with rollover bit set
  467. */
  468. card->evtbd_wrptr = 0;
  469. card->evtbd_rdptr |= MWIFIEX_BD_FLAG_ROLLOVER_IND;
  470. card->evtbd_ring_size = sizeof(struct mwifiex_pcie_buf_desc) *
  471. MWIFIEX_MAX_EVT_BD;
  472. dev_dbg(adapter->dev, "info: evtbd_ring: Allocating %d bytes\n",
  473. card->evtbd_ring_size);
  474. card->evtbd_ring_vbase = kzalloc(card->evtbd_ring_size, GFP_KERNEL);
  475. if (!card->evtbd_ring_vbase) {
  476. dev_err(adapter->dev, "Unable to allocate buffer. "
  477. "Terminating download\n");
  478. return -ENOMEM;
  479. }
  480. card->evtbd_ring_pbase = virt_to_phys(card->evtbd_ring_vbase);
  481. dev_dbg(adapter->dev, "info: CMDRSP/EVT bd_ring - base: %p, "
  482. "pbase: %#x:%x, len: %#x\n", card->evtbd_ring_vbase,
  483. (u32)card->evtbd_ring_pbase,
  484. (u32)((u64)card->evtbd_ring_pbase >> 32),
  485. card->evtbd_ring_size);
  486. for (i = 0; i < MWIFIEX_MAX_EVT_BD; i++) {
  487. card->evtbd_ring[i] = (struct mwifiex_pcie_buf_desc *)
  488. (card->evtbd_ring_vbase +
  489. (sizeof(struct mwifiex_pcie_buf_desc) * i));
  490. /* Allocate skb here so that firmware can DMA data from it */
  491. skb = dev_alloc_skb(MAX_EVENT_SIZE);
  492. if (!skb) {
  493. dev_err(adapter->dev, "Unable to allocate skb for EVENT buf.\n");
  494. kfree(card->evtbd_ring_vbase);
  495. return -ENOMEM;
  496. }
  497. buf_pa = mwifiex_update_sk_buff_pa(skb);
  498. skb_put(skb, MAX_EVENT_SIZE);
  499. dev_dbg(adapter->dev, "info: Evt ring: add new skb. base: %p, "
  500. "buf_base: %p, buf_pbase: %#x:%x, "
  501. "buf_len: %#x\n", skb, skb->data,
  502. (u32)*buf_pa, (u32)((u64)*buf_pa >> 32),
  503. skb->len);
  504. card->evt_buf_list[i] = skb;
  505. card->evtbd_ring[i]->paddr = *buf_pa;
  506. card->evtbd_ring[i]->len = (u16)skb->len;
  507. card->evtbd_ring[i]->flags = 0;
  508. }
  509. return 0;
  510. }
  511. /*
  512. * This function deletes Buffer descriptor ring for Events
  513. */
  514. static int mwifiex_pcie_delete_evtbd_ring(struct mwifiex_adapter *adapter)
  515. {
  516. struct pcie_service_card *card = adapter->card;
  517. int i;
  518. for (i = 0; i < MWIFIEX_MAX_EVT_BD; i++) {
  519. if (card->evt_buf_list[i])
  520. dev_kfree_skb_any(card->evt_buf_list[i]);
  521. card->evt_buf_list[i] = NULL;
  522. card->evtbd_ring[i]->paddr = 0;
  523. card->evtbd_ring[i]->len = 0;
  524. card->evtbd_ring[i]->flags = 0;
  525. card->evtbd_ring[i] = NULL;
  526. }
  527. kfree(card->evtbd_ring_vbase);
  528. card->evtbd_wrptr = 0;
  529. card->evtbd_rdptr = 0 | MWIFIEX_BD_FLAG_ROLLOVER_IND;
  530. card->evtbd_ring_size = 0;
  531. card->evtbd_ring_vbase = NULL;
  532. return 0;
  533. }
  534. /*
  535. * This function allocates a buffer for CMDRSP
  536. */
  537. static int mwifiex_pcie_alloc_cmdrsp_buf(struct mwifiex_adapter *adapter)
  538. {
  539. struct pcie_service_card *card = adapter->card;
  540. struct sk_buff *skb;
  541. /* Allocate memory for receiving command response data */
  542. skb = dev_alloc_skb(MWIFIEX_UPLD_SIZE);
  543. if (!skb) {
  544. dev_err(adapter->dev, "Unable to allocate skb for command "
  545. "response data.\n");
  546. return -ENOMEM;
  547. }
  548. mwifiex_update_sk_buff_pa(skb);
  549. skb_put(skb, MWIFIEX_UPLD_SIZE);
  550. card->cmdrsp_buf = skb;
  551. skb = NULL;
  552. /* Allocate memory for sending command to firmware */
  553. skb = dev_alloc_skb(MWIFIEX_SIZE_OF_CMD_BUFFER);
  554. if (!skb) {
  555. dev_err(adapter->dev, "Unable to allocate skb for command "
  556. "data.\n");
  557. return -ENOMEM;
  558. }
  559. mwifiex_update_sk_buff_pa(skb);
  560. skb_put(skb, MWIFIEX_SIZE_OF_CMD_BUFFER);
  561. card->cmd_buf = skb;
  562. return 0;
  563. }
  564. /*
  565. * This function deletes a buffer for CMDRSP
  566. */
  567. static int mwifiex_pcie_delete_cmdrsp_buf(struct mwifiex_adapter *adapter)
  568. {
  569. struct pcie_service_card *card;
  570. if (!adapter)
  571. return 0;
  572. card = adapter->card;
  573. if (card && card->cmdrsp_buf)
  574. dev_kfree_skb_any(card->cmdrsp_buf);
  575. if (card && card->cmd_buf)
  576. dev_kfree_skb_any(card->cmd_buf);
  577. return 0;
  578. }
  579. /*
  580. * This function allocates a buffer for sleep cookie
  581. */
  582. static int mwifiex_pcie_alloc_sleep_cookie_buf(struct mwifiex_adapter *adapter)
  583. {
  584. struct sk_buff *skb;
  585. struct pcie_service_card *card = adapter->card;
  586. /* Allocate memory for sleep cookie */
  587. skb = dev_alloc_skb(sizeof(u32));
  588. if (!skb) {
  589. dev_err(adapter->dev, "Unable to allocate skb for sleep "
  590. "cookie!\n");
  591. return -ENOMEM;
  592. }
  593. mwifiex_update_sk_buff_pa(skb);
  594. skb_put(skb, sizeof(u32));
  595. /* Init val of Sleep Cookie */
  596. *(u32 *)skb->data = FW_AWAKE_COOKIE;
  597. dev_dbg(adapter->dev, "alloc_scook: sleep cookie=0x%x\n",
  598. *((u32 *)skb->data));
  599. /* Save the sleep cookie */
  600. card->sleep_cookie = skb;
  601. return 0;
  602. }
  603. /*
  604. * This function deletes buffer for sleep cookie
  605. */
  606. static int mwifiex_pcie_delete_sleep_cookie_buf(struct mwifiex_adapter *adapter)
  607. {
  608. struct pcie_service_card *card;
  609. if (!adapter)
  610. return 0;
  611. card = adapter->card;
  612. if (card && card->sleep_cookie) {
  613. dev_kfree_skb_any(card->sleep_cookie);
  614. card->sleep_cookie = NULL;
  615. }
  616. return 0;
  617. }
  618. /*
  619. * This function sends data buffer to device
  620. */
  621. static int
  622. mwifiex_pcie_send_data(struct mwifiex_adapter *adapter, struct sk_buff *skb)
  623. {
  624. struct pcie_service_card *card = adapter->card;
  625. u32 wrindx, rdptr;
  626. phys_addr_t *buf_pa;
  627. __le16 *tmp;
  628. if (!mwifiex_pcie_ok_to_access_hw(adapter))
  629. mwifiex_pm_wakeup_card(adapter);
  630. /* Read the TX ring read pointer set by firmware */
  631. if (mwifiex_read_reg(adapter, REG_TXBD_RDPTR, &rdptr)) {
  632. dev_err(adapter->dev, "SEND DATA: failed to read "
  633. "REG_TXBD_RDPTR\n");
  634. return -1;
  635. }
  636. wrindx = card->txbd_wrptr & MWIFIEX_TXBD_MASK;
  637. dev_dbg(adapter->dev, "info: SEND DATA: <Rd: %#x, Wr: %#x>\n", rdptr,
  638. card->txbd_wrptr);
  639. if (((card->txbd_wrptr & MWIFIEX_TXBD_MASK) !=
  640. (rdptr & MWIFIEX_TXBD_MASK)) ||
  641. ((card->txbd_wrptr & MWIFIEX_BD_FLAG_ROLLOVER_IND) !=
  642. (rdptr & MWIFIEX_BD_FLAG_ROLLOVER_IND))) {
  643. struct sk_buff *skb_data;
  644. u8 *payload;
  645. adapter->data_sent = true;
  646. skb_data = card->tx_buf_list[wrindx];
  647. memcpy(skb_data->data, skb->data, skb->len);
  648. payload = skb_data->data;
  649. tmp = (__le16 *)&payload[0];
  650. *tmp = cpu_to_le16((u16)skb->len);
  651. tmp = (__le16 *)&payload[2];
  652. *tmp = cpu_to_le16(MWIFIEX_TYPE_DATA);
  653. skb_put(skb_data, MWIFIEX_RX_DATA_BUF_SIZE - skb_data->len);
  654. skb_trim(skb_data, skb->len);
  655. buf_pa = MWIFIEX_SKB_PACB(skb_data);
  656. card->txbd_ring[wrindx]->paddr = *buf_pa;
  657. card->txbd_ring[wrindx]->len = (u16)skb_data->len;
  658. card->txbd_ring[wrindx]->flags = MWIFIEX_BD_FLAG_FIRST_DESC |
  659. MWIFIEX_BD_FLAG_LAST_DESC;
  660. if ((++card->txbd_wrptr & MWIFIEX_TXBD_MASK) ==
  661. MWIFIEX_MAX_TXRX_BD)
  662. card->txbd_wrptr = ((card->txbd_wrptr &
  663. MWIFIEX_BD_FLAG_ROLLOVER_IND) ^
  664. MWIFIEX_BD_FLAG_ROLLOVER_IND);
  665. /* Write the TX ring write pointer in to REG_TXBD_WRPTR */
  666. if (mwifiex_write_reg(adapter, REG_TXBD_WRPTR,
  667. card->txbd_wrptr)) {
  668. dev_err(adapter->dev, "SEND DATA: failed to write "
  669. "REG_TXBD_WRPTR\n");
  670. return 0;
  671. }
  672. /* Send the TX ready interrupt */
  673. if (mwifiex_write_reg(adapter, PCIE_CPU_INT_EVENT,
  674. CPU_INTR_DNLD_RDY)) {
  675. dev_err(adapter->dev, "SEND DATA: failed to assert "
  676. "door-bell interrupt.\n");
  677. return -1;
  678. }
  679. dev_dbg(adapter->dev, "info: SEND DATA: Updated <Rd: %#x, Wr: "
  680. "%#x> and sent packet to firmware "
  681. "successfully\n", rdptr,
  682. card->txbd_wrptr);
  683. } else {
  684. dev_dbg(adapter->dev, "info: TX Ring full, can't send anymore "
  685. "packets to firmware\n");
  686. adapter->data_sent = true;
  687. /* Send the TX ready interrupt */
  688. if (mwifiex_write_reg(adapter, PCIE_CPU_INT_EVENT,
  689. CPU_INTR_DNLD_RDY))
  690. dev_err(adapter->dev, "SEND DATA: failed to assert "
  691. "door-bell interrupt\n");
  692. return -EBUSY;
  693. }
  694. return 0;
  695. }
  696. /*
  697. * This function handles received buffer ring and
  698. * dispatches packets to upper
  699. */
  700. static int mwifiex_pcie_process_recv_data(struct mwifiex_adapter *adapter)
  701. {
  702. struct pcie_service_card *card = adapter->card;
  703. u32 wrptr, rd_index;
  704. int ret = 0;
  705. struct sk_buff *skb_tmp = NULL;
  706. /* Read the RX ring Write pointer set by firmware */
  707. if (mwifiex_read_reg(adapter, REG_RXBD_WRPTR, &wrptr)) {
  708. dev_err(adapter->dev, "RECV DATA: failed to read "
  709. "REG_TXBD_RDPTR\n");
  710. ret = -1;
  711. goto done;
  712. }
  713. while (((wrptr & MWIFIEX_RXBD_MASK) !=
  714. (card->rxbd_rdptr & MWIFIEX_RXBD_MASK)) ||
  715. ((wrptr & MWIFIEX_BD_FLAG_ROLLOVER_IND) ==
  716. (card->rxbd_rdptr & MWIFIEX_BD_FLAG_ROLLOVER_IND))) {
  717. struct sk_buff *skb_data;
  718. u16 rx_len;
  719. rd_index = card->rxbd_rdptr & MWIFIEX_RXBD_MASK;
  720. skb_data = card->rx_buf_list[rd_index];
  721. /* Get data length from interface header -
  722. first byte is len, second byte is type */
  723. rx_len = *((u16 *)skb_data->data);
  724. dev_dbg(adapter->dev, "info: RECV DATA: Rd=%#x, Wr=%#x, "
  725. "Len=%d\n", card->rxbd_rdptr, wrptr, rx_len);
  726. skb_tmp = dev_alloc_skb(rx_len);
  727. if (!skb_tmp) {
  728. dev_dbg(adapter->dev, "info: Failed to alloc skb "
  729. "for RX\n");
  730. ret = -EBUSY;
  731. goto done;
  732. }
  733. skb_put(skb_tmp, rx_len);
  734. memcpy(skb_tmp->data, skb_data->data + INTF_HEADER_LEN, rx_len);
  735. if ((++card->rxbd_rdptr & MWIFIEX_RXBD_MASK) ==
  736. MWIFIEX_MAX_TXRX_BD) {
  737. card->rxbd_rdptr = ((card->rxbd_rdptr &
  738. MWIFIEX_BD_FLAG_ROLLOVER_IND) ^
  739. MWIFIEX_BD_FLAG_ROLLOVER_IND);
  740. }
  741. dev_dbg(adapter->dev, "info: RECV DATA: <Rd: %#x, Wr: %#x>\n",
  742. card->rxbd_rdptr, wrptr);
  743. /* Write the RX ring read pointer in to REG_RXBD_RDPTR */
  744. if (mwifiex_write_reg(adapter, REG_RXBD_RDPTR,
  745. card->rxbd_rdptr)) {
  746. dev_err(adapter->dev, "RECV DATA: failed to "
  747. "write REG_RXBD_RDPTR\n");
  748. ret = -1;
  749. goto done;
  750. }
  751. /* Read the RX ring Write pointer set by firmware */
  752. if (mwifiex_read_reg(adapter, REG_RXBD_WRPTR, &wrptr)) {
  753. dev_err(adapter->dev, "RECV DATA: failed to read "
  754. "REG_TXBD_RDPTR\n");
  755. ret = -1;
  756. goto done;
  757. }
  758. dev_dbg(adapter->dev, "info: RECV DATA: Received packet from "
  759. "firmware successfully\n");
  760. mwifiex_handle_rx_packet(adapter, skb_tmp);
  761. }
  762. done:
  763. if (ret && skb_tmp)
  764. dev_kfree_skb_any(skb_tmp);
  765. return ret;
  766. }
  767. /*
  768. * This function downloads the boot command to device
  769. */
  770. static int
  771. mwifiex_pcie_send_boot_cmd(struct mwifiex_adapter *adapter, struct sk_buff *skb)
  772. {
  773. phys_addr_t *buf_pa = MWIFIEX_SKB_PACB(skb);
  774. if (!(skb->data && skb->len && *buf_pa)) {
  775. dev_err(adapter->dev, "Invalid parameter in %s <%p, %#x:%x, "
  776. "%x>\n", __func__, skb->data, skb->len,
  777. (u32)*buf_pa, (u32)((u64)*buf_pa >> 32));
  778. return -1;
  779. }
  780. /* Write the lower 32bits of the physical address to scratch
  781. * register 0 */
  782. if (mwifiex_write_reg(adapter, PCIE_SCRATCH_0_REG, (u32)*buf_pa)) {
  783. dev_err(adapter->dev, "%s: failed to write download command "
  784. "to boot code.\n", __func__);
  785. return -1;
  786. }
  787. /* Write the upper 32bits of the physical address to scratch
  788. * register 1 */
  789. if (mwifiex_write_reg(adapter, PCIE_SCRATCH_1_REG,
  790. (u32)((u64)*buf_pa >> 32))) {
  791. dev_err(adapter->dev, "%s: failed to write download command "
  792. "to boot code.\n", __func__);
  793. return -1;
  794. }
  795. /* Write the command length to scratch register 2 */
  796. if (mwifiex_write_reg(adapter, PCIE_SCRATCH_2_REG, skb->len)) {
  797. dev_err(adapter->dev, "%s: failed to write command length to "
  798. "scratch register 2\n", __func__);
  799. return -1;
  800. }
  801. /* Ring the door bell */
  802. if (mwifiex_write_reg(adapter, PCIE_CPU_INT_EVENT,
  803. CPU_INTR_DOOR_BELL)) {
  804. dev_err(adapter->dev, "%s: failed to assert door-bell "
  805. "interrupt.\n", __func__);
  806. return -1;
  807. }
  808. return 0;
  809. }
  810. /*
  811. * This function downloads commands to the device
  812. */
  813. static int
  814. mwifiex_pcie_send_cmd(struct mwifiex_adapter *adapter, struct sk_buff *skb)
  815. {
  816. struct pcie_service_card *card = adapter->card;
  817. int ret = 0;
  818. phys_addr_t *cmd_buf_pa;
  819. phys_addr_t *cmdrsp_buf_pa;
  820. if (!(skb->data && skb->len)) {
  821. dev_err(adapter->dev, "Invalid parameter in %s <%p, %#x>\n",
  822. __func__, skb->data, skb->len);
  823. return -1;
  824. }
  825. /* Make sure a command response buffer is available */
  826. if (!card->cmdrsp_buf) {
  827. dev_err(adapter->dev, "No response buffer available, send "
  828. "command failed\n");
  829. return -EBUSY;
  830. }
  831. /* Make sure a command buffer is available */
  832. if (!card->cmd_buf) {
  833. dev_err(adapter->dev, "Command buffer not available\n");
  834. return -EBUSY;
  835. }
  836. adapter->cmd_sent = true;
  837. /* Copy the given skb in to DMA accessable shared buffer */
  838. skb_put(card->cmd_buf, MWIFIEX_SIZE_OF_CMD_BUFFER - card->cmd_buf->len);
  839. skb_trim(card->cmd_buf, skb->len);
  840. memcpy(card->cmd_buf->data, skb->data, skb->len);
  841. /* To send a command, the driver will:
  842. 1. Write the 64bit physical address of the data buffer to
  843. SCRATCH1 + SCRATCH0
  844. 2. Ring the door bell (i.e. set the door bell interrupt)
  845. In response to door bell interrupt, the firmware will perform
  846. the DMA of the command packet (first header to obtain the total
  847. length and then rest of the command).
  848. */
  849. if (card->cmdrsp_buf) {
  850. cmdrsp_buf_pa = MWIFIEX_SKB_PACB(card->cmdrsp_buf);
  851. /* Write the lower 32bits of the cmdrsp buffer physical
  852. address */
  853. if (mwifiex_write_reg(adapter, REG_CMDRSP_ADDR_LO,
  854. (u32)*cmdrsp_buf_pa)) {
  855. dev_err(adapter->dev, "Failed to write download command to boot code.\n");
  856. ret = -1;
  857. goto done;
  858. }
  859. /* Write the upper 32bits of the cmdrsp buffer physical
  860. address */
  861. if (mwifiex_write_reg(adapter, REG_CMDRSP_ADDR_HI,
  862. (u32)((u64)*cmdrsp_buf_pa >> 32))) {
  863. dev_err(adapter->dev, "Failed to write download command"
  864. " to boot code.\n");
  865. ret = -1;
  866. goto done;
  867. }
  868. }
  869. cmd_buf_pa = MWIFIEX_SKB_PACB(card->cmd_buf);
  870. /* Write the lower 32bits of the physical address to REG_CMD_ADDR_LO */
  871. if (mwifiex_write_reg(adapter, REG_CMD_ADDR_LO,
  872. (u32)*cmd_buf_pa)) {
  873. dev_err(adapter->dev, "Failed to write download command "
  874. "to boot code.\n");
  875. ret = -1;
  876. goto done;
  877. }
  878. /* Write the upper 32bits of the physical address to REG_CMD_ADDR_HI */
  879. if (mwifiex_write_reg(adapter, REG_CMD_ADDR_HI,
  880. (u32)((u64)*cmd_buf_pa >> 32))) {
  881. dev_err(adapter->dev, "Failed to write download command "
  882. "to boot code.\n");
  883. ret = -1;
  884. goto done;
  885. }
  886. /* Write the command length to REG_CMD_SIZE */
  887. if (mwifiex_write_reg(adapter, REG_CMD_SIZE,
  888. card->cmd_buf->len)) {
  889. dev_err(adapter->dev, "Failed to write command length to "
  890. "REG_CMD_SIZE\n");
  891. ret = -1;
  892. goto done;
  893. }
  894. /* Ring the door bell */
  895. if (mwifiex_write_reg(adapter, PCIE_CPU_INT_EVENT,
  896. CPU_INTR_DOOR_BELL)) {
  897. dev_err(adapter->dev, "Failed to assert door-bell "
  898. "interrupt.\n");
  899. ret = -1;
  900. goto done;
  901. }
  902. done:
  903. if (ret)
  904. adapter->cmd_sent = false;
  905. return 0;
  906. }
  907. /*
  908. * This function handles command complete interrupt
  909. */
  910. static int mwifiex_pcie_process_cmd_complete(struct mwifiex_adapter *adapter)
  911. {
  912. struct pcie_service_card *card = adapter->card;
  913. int count = 0;
  914. dev_dbg(adapter->dev, "info: Rx CMD Response\n");
  915. if (!adapter->curr_cmd) {
  916. skb_pull(card->cmdrsp_buf, INTF_HEADER_LEN);
  917. if (adapter->ps_state == PS_STATE_SLEEP_CFM) {
  918. mwifiex_process_sleep_confirm_resp(adapter,
  919. card->cmdrsp_buf->data,
  920. card->cmdrsp_buf->len);
  921. while (mwifiex_pcie_ok_to_access_hw(adapter) &&
  922. (count++ < 10))
  923. udelay(50);
  924. } else {
  925. dev_err(adapter->dev, "There is no command but "
  926. "got cmdrsp\n");
  927. }
  928. memcpy(adapter->upld_buf, card->cmdrsp_buf->data,
  929. min_t(u32, MWIFIEX_SIZE_OF_CMD_BUFFER,
  930. card->cmdrsp_buf->len));
  931. skb_push(card->cmdrsp_buf, INTF_HEADER_LEN);
  932. } else if (mwifiex_pcie_ok_to_access_hw(adapter)) {
  933. skb_pull(card->cmdrsp_buf, INTF_HEADER_LEN);
  934. adapter->curr_cmd->resp_skb = card->cmdrsp_buf;
  935. adapter->cmd_resp_received = true;
  936. /* Take the pointer and set it to CMD node and will
  937. return in the response complete callback */
  938. card->cmdrsp_buf = NULL;
  939. /* Clear the cmd-rsp buffer address in scratch registers. This
  940. will prevent firmware from writing to the same response
  941. buffer again. */
  942. if (mwifiex_write_reg(adapter, REG_CMDRSP_ADDR_LO, 0)) {
  943. dev_err(adapter->dev, "cmd_done: failed to clear "
  944. "cmd_rsp address.\n");
  945. return -1;
  946. }
  947. /* Write the upper 32bits of the cmdrsp buffer physical
  948. address */
  949. if (mwifiex_write_reg(adapter, REG_CMDRSP_ADDR_HI, 0)) {
  950. dev_err(adapter->dev, "cmd_done: failed to clear "
  951. "cmd_rsp address.\n");
  952. return -1;
  953. }
  954. }
  955. return 0;
  956. }
  957. /*
  958. * Command Response processing complete handler
  959. */
  960. static int mwifiex_pcie_cmdrsp_complete(struct mwifiex_adapter *adapter,
  961. struct sk_buff *skb)
  962. {
  963. struct pcie_service_card *card = adapter->card;
  964. if (skb) {
  965. card->cmdrsp_buf = skb;
  966. skb_push(card->cmdrsp_buf, INTF_HEADER_LEN);
  967. }
  968. return 0;
  969. }
  970. /*
  971. * This function handles firmware event ready interrupt
  972. */
  973. static int mwifiex_pcie_process_event_ready(struct mwifiex_adapter *adapter)
  974. {
  975. struct pcie_service_card *card = adapter->card;
  976. u32 rdptr = card->evtbd_rdptr & MWIFIEX_EVTBD_MASK;
  977. u32 wrptr, event;
  978. if (adapter->event_received) {
  979. dev_dbg(adapter->dev, "info: Event being processed, "\
  980. "do not process this interrupt just yet\n");
  981. return 0;
  982. }
  983. if (rdptr >= MWIFIEX_MAX_EVT_BD) {
  984. dev_dbg(adapter->dev, "info: Invalid read pointer...\n");
  985. return -1;
  986. }
  987. /* Read the event ring write pointer set by firmware */
  988. if (mwifiex_read_reg(adapter, REG_EVTBD_WRPTR, &wrptr)) {
  989. dev_err(adapter->dev, "EventReady: failed to read REG_EVTBD_WRPTR\n");
  990. return -1;
  991. }
  992. dev_dbg(adapter->dev, "info: EventReady: Initial <Rd: 0x%x, Wr: 0x%x>",
  993. card->evtbd_rdptr, wrptr);
  994. if (((wrptr & MWIFIEX_EVTBD_MASK) !=
  995. (card->evtbd_rdptr & MWIFIEX_EVTBD_MASK)) ||
  996. ((wrptr & MWIFIEX_BD_FLAG_ROLLOVER_IND) ==
  997. (card->evtbd_rdptr & MWIFIEX_BD_FLAG_ROLLOVER_IND))) {
  998. struct sk_buff *skb_cmd;
  999. __le16 data_len = 0;
  1000. u16 evt_len;
  1001. dev_dbg(adapter->dev, "info: Read Index: %d\n", rdptr);
  1002. skb_cmd = card->evt_buf_list[rdptr];
  1003. /* Take the pointer and set it to event pointer in adapter
  1004. and will return back after event handling callback */
  1005. card->evt_buf_list[rdptr] = NULL;
  1006. card->evtbd_ring[rdptr]->paddr = 0;
  1007. card->evtbd_ring[rdptr]->len = 0;
  1008. card->evtbd_ring[rdptr]->flags = 0;
  1009. event = *(u32 *) &skb_cmd->data[INTF_HEADER_LEN];
  1010. adapter->event_cause = event;
  1011. /* The first 4bytes will be the event transfer header
  1012. len is 2 bytes followed by type which is 2 bytes */
  1013. memcpy(&data_len, skb_cmd->data, sizeof(__le16));
  1014. evt_len = le16_to_cpu(data_len);
  1015. skb_pull(skb_cmd, INTF_HEADER_LEN);
  1016. dev_dbg(adapter->dev, "info: Event length: %d\n", evt_len);
  1017. if ((evt_len > 0) && (evt_len < MAX_EVENT_SIZE))
  1018. memcpy(adapter->event_body, skb_cmd->data +
  1019. MWIFIEX_EVENT_HEADER_LEN, evt_len -
  1020. MWIFIEX_EVENT_HEADER_LEN);
  1021. adapter->event_received = true;
  1022. adapter->event_skb = skb_cmd;
  1023. /* Do not update the event read pointer here, wait till the
  1024. buffer is released. This is just to make things simpler,
  1025. we need to find a better method of managing these buffers.
  1026. */
  1027. }
  1028. return 0;
  1029. }
  1030. /*
  1031. * Event processing complete handler
  1032. */
  1033. static int mwifiex_pcie_event_complete(struct mwifiex_adapter *adapter,
  1034. struct sk_buff *skb)
  1035. {
  1036. struct pcie_service_card *card = adapter->card;
  1037. int ret = 0;
  1038. u32 rdptr = card->evtbd_rdptr & MWIFIEX_EVTBD_MASK;
  1039. u32 wrptr;
  1040. phys_addr_t *buf_pa;
  1041. if (!skb)
  1042. return 0;
  1043. if (rdptr >= MWIFIEX_MAX_EVT_BD) {
  1044. dev_err(adapter->dev, "event_complete: Invalid rdptr 0x%x\n",
  1045. rdptr);
  1046. return -EINVAL;
  1047. }
  1048. /* Read the event ring write pointer set by firmware */
  1049. if (mwifiex_read_reg(adapter, REG_EVTBD_WRPTR, &wrptr)) {
  1050. dev_err(adapter->dev, "event_complete: failed to read REG_EVTBD_WRPTR\n");
  1051. return -1;
  1052. }
  1053. if (!card->evt_buf_list[rdptr]) {
  1054. skb_push(skb, INTF_HEADER_LEN);
  1055. card->evt_buf_list[rdptr] = skb;
  1056. buf_pa = MWIFIEX_SKB_PACB(skb);
  1057. card->evtbd_ring[rdptr]->paddr = *buf_pa;
  1058. card->evtbd_ring[rdptr]->len = (u16)skb->len;
  1059. card->evtbd_ring[rdptr]->flags = 0;
  1060. skb = NULL;
  1061. } else {
  1062. dev_dbg(adapter->dev, "info: ERROR: Buffer is still valid at "
  1063. "index %d, <%p, %p>\n", rdptr,
  1064. card->evt_buf_list[rdptr], skb);
  1065. }
  1066. if ((++card->evtbd_rdptr & MWIFIEX_EVTBD_MASK) == MWIFIEX_MAX_EVT_BD) {
  1067. card->evtbd_rdptr = ((card->evtbd_rdptr &
  1068. MWIFIEX_BD_FLAG_ROLLOVER_IND) ^
  1069. MWIFIEX_BD_FLAG_ROLLOVER_IND);
  1070. }
  1071. dev_dbg(adapter->dev, "info: Updated <Rd: 0x%x, Wr: 0x%x>",
  1072. card->evtbd_rdptr, wrptr);
  1073. /* Write the event ring read pointer in to REG_EVTBD_RDPTR */
  1074. if (mwifiex_write_reg(adapter, REG_EVTBD_RDPTR, card->evtbd_rdptr)) {
  1075. dev_err(adapter->dev, "event_complete: failed to read REG_EVTBD_RDPTR\n");
  1076. return -1;
  1077. }
  1078. dev_dbg(adapter->dev, "info: Check Events Again\n");
  1079. ret = mwifiex_pcie_process_event_ready(adapter);
  1080. return ret;
  1081. }
  1082. /*
  1083. * This function downloads the firmware to the card.
  1084. *
  1085. * Firmware is downloaded to the card in blocks. Every block download
  1086. * is tested for CRC errors, and retried a number of times before
  1087. * returning failure.
  1088. */
  1089. static int mwifiex_prog_fw_w_helper(struct mwifiex_adapter *adapter,
  1090. struct mwifiex_fw_image *fw)
  1091. {
  1092. int ret;
  1093. u8 *firmware = fw->fw_buf;
  1094. u32 firmware_len = fw->fw_len;
  1095. u32 offset = 0;
  1096. struct sk_buff *skb;
  1097. u32 txlen, tx_blocks = 0, tries, len;
  1098. u32 block_retry_cnt = 0;
  1099. if (!adapter) {
  1100. pr_err("adapter structure is not valid\n");
  1101. return -1;
  1102. }
  1103. if (!firmware || !firmware_len) {
  1104. dev_err(adapter->dev, "No firmware image found! "
  1105. "Terminating download\n");
  1106. return -1;
  1107. }
  1108. dev_dbg(adapter->dev, "info: Downloading FW image (%d bytes)\n",
  1109. firmware_len);
  1110. if (mwifiex_pcie_disable_host_int(adapter)) {
  1111. dev_err(adapter->dev, "%s: Disabling interrupts"
  1112. " failed.\n", __func__);
  1113. return -1;
  1114. }
  1115. skb = dev_alloc_skb(MWIFIEX_UPLD_SIZE);
  1116. if (!skb) {
  1117. ret = -ENOMEM;
  1118. goto done;
  1119. }
  1120. mwifiex_update_sk_buff_pa(skb);
  1121. /* Perform firmware data transfer */
  1122. do {
  1123. u32 ireg_intr = 0;
  1124. /* More data? */
  1125. if (offset >= firmware_len)
  1126. break;
  1127. for (tries = 0; tries < MAX_POLL_TRIES; tries++) {
  1128. ret = mwifiex_read_reg(adapter, PCIE_SCRATCH_2_REG,
  1129. &len);
  1130. if (ret) {
  1131. dev_warn(adapter->dev, "Failed reading length from boot code\n");
  1132. goto done;
  1133. }
  1134. if (len)
  1135. break;
  1136. udelay(10);
  1137. }
  1138. if (!len) {
  1139. break;
  1140. } else if (len > MWIFIEX_UPLD_SIZE) {
  1141. pr_err("FW download failure @ %d, invalid length %d\n",
  1142. offset, len);
  1143. ret = -1;
  1144. goto done;
  1145. }
  1146. txlen = len;
  1147. if (len & BIT(0)) {
  1148. block_retry_cnt++;
  1149. if (block_retry_cnt > MAX_WRITE_IOMEM_RETRY) {
  1150. pr_err("FW download failure @ %d, over max "
  1151. "retry count\n", offset);
  1152. ret = -1;
  1153. goto done;
  1154. }
  1155. dev_err(adapter->dev, "FW CRC error indicated by the "
  1156. "helper: len = 0x%04X, txlen = "
  1157. "%d\n", len, txlen);
  1158. len &= ~BIT(0);
  1159. /* Setting this to 0 to resend from same offset */
  1160. txlen = 0;
  1161. } else {
  1162. block_retry_cnt = 0;
  1163. /* Set blocksize to transfer - checking for
  1164. last block */
  1165. if (firmware_len - offset < txlen)
  1166. txlen = firmware_len - offset;
  1167. dev_dbg(adapter->dev, ".");
  1168. tx_blocks =
  1169. (txlen + MWIFIEX_PCIE_BLOCK_SIZE_FW_DNLD - 1) /
  1170. MWIFIEX_PCIE_BLOCK_SIZE_FW_DNLD;
  1171. /* Copy payload to buffer */
  1172. memmove(skb->data, &firmware[offset], txlen);
  1173. }
  1174. skb_put(skb, MWIFIEX_UPLD_SIZE - skb->len);
  1175. skb_trim(skb, tx_blocks * MWIFIEX_PCIE_BLOCK_SIZE_FW_DNLD);
  1176. /* Send the boot command to device */
  1177. if (mwifiex_pcie_send_boot_cmd(adapter, skb)) {
  1178. dev_err(adapter->dev, "Failed to send firmware download command\n");
  1179. ret = -1;
  1180. goto done;
  1181. }
  1182. /* Wait for the command done interrupt */
  1183. do {
  1184. if (mwifiex_read_reg(adapter, PCIE_CPU_INT_STATUS,
  1185. &ireg_intr)) {
  1186. dev_err(adapter->dev, "%s: Failed to read "
  1187. "interrupt status during "
  1188. "fw dnld.\n", __func__);
  1189. ret = -1;
  1190. goto done;
  1191. }
  1192. } while ((ireg_intr & CPU_INTR_DOOR_BELL) ==
  1193. CPU_INTR_DOOR_BELL);
  1194. offset += txlen;
  1195. } while (true);
  1196. dev_dbg(adapter->dev, "info:\nFW download over, size %d bytes\n",
  1197. offset);
  1198. ret = 0;
  1199. done:
  1200. dev_kfree_skb_any(skb);
  1201. return ret;
  1202. }
  1203. /*
  1204. * This function checks the firmware status in card.
  1205. *
  1206. * The winner interface is also determined by this function.
  1207. */
  1208. static int
  1209. mwifiex_check_fw_status(struct mwifiex_adapter *adapter, u32 poll_num)
  1210. {
  1211. int ret = 0;
  1212. u32 firmware_stat, winner_status;
  1213. u32 tries;
  1214. /* Mask spurios interrupts */
  1215. if (mwifiex_write_reg(adapter, PCIE_HOST_INT_STATUS_MASK,
  1216. HOST_INTR_MASK)) {
  1217. dev_warn(adapter->dev, "Write register failed\n");
  1218. return -1;
  1219. }
  1220. dev_dbg(adapter->dev, "Setting driver ready signature\n");
  1221. if (mwifiex_write_reg(adapter, REG_DRV_READY, FIRMWARE_READY_PCIE)) {
  1222. dev_err(adapter->dev, "Failed to write driver ready signature\n");
  1223. return -1;
  1224. }
  1225. /* Wait for firmware initialization event */
  1226. for (tries = 0; tries < poll_num; tries++) {
  1227. if (mwifiex_read_reg(adapter, PCIE_SCRATCH_3_REG,
  1228. &firmware_stat))
  1229. ret = -1;
  1230. else
  1231. ret = 0;
  1232. if (ret)
  1233. continue;
  1234. if (firmware_stat == FIRMWARE_READY_PCIE) {
  1235. ret = 0;
  1236. break;
  1237. } else {
  1238. mdelay(100);
  1239. ret = -1;
  1240. }
  1241. }
  1242. if (ret) {
  1243. if (mwifiex_read_reg(adapter, PCIE_SCRATCH_3_REG,
  1244. &winner_status))
  1245. ret = -1;
  1246. else if (!winner_status) {
  1247. dev_err(adapter->dev, "PCI-E is the winner\n");
  1248. adapter->winner = 1;
  1249. ret = -1;
  1250. } else {
  1251. dev_err(adapter->dev, "PCI-E is not the winner <%#x, %d>, exit download\n",
  1252. ret, adapter->winner);
  1253. ret = 0;
  1254. }
  1255. }
  1256. return ret;
  1257. }
  1258. /*
  1259. * This function reads the interrupt status from card.
  1260. */
  1261. static void mwifiex_interrupt_status(struct mwifiex_adapter *adapter)
  1262. {
  1263. u32 pcie_ireg;
  1264. unsigned long flags;
  1265. if (!mwifiex_pcie_ok_to_access_hw(adapter))
  1266. return;
  1267. if (mwifiex_read_reg(adapter, PCIE_HOST_INT_STATUS, &pcie_ireg)) {
  1268. dev_warn(adapter->dev, "Read register failed\n");
  1269. return;
  1270. }
  1271. if ((pcie_ireg != 0xFFFFFFFF) && (pcie_ireg)) {
  1272. mwifiex_pcie_disable_host_int(adapter);
  1273. /* Clear the pending interrupts */
  1274. if (mwifiex_write_reg(adapter, PCIE_HOST_INT_STATUS,
  1275. ~pcie_ireg)) {
  1276. dev_warn(adapter->dev, "Write register failed\n");
  1277. return;
  1278. }
  1279. spin_lock_irqsave(&adapter->int_lock, flags);
  1280. adapter->int_status |= pcie_ireg;
  1281. spin_unlock_irqrestore(&adapter->int_lock, flags);
  1282. if (pcie_ireg & HOST_INTR_CMD_DONE) {
  1283. if ((adapter->ps_state == PS_STATE_SLEEP_CFM) ||
  1284. (adapter->ps_state == PS_STATE_SLEEP)) {
  1285. mwifiex_pcie_enable_host_int(adapter);
  1286. if (mwifiex_write_reg(adapter,
  1287. PCIE_CPU_INT_EVENT,
  1288. CPU_INTR_SLEEP_CFM_DONE)) {
  1289. dev_warn(adapter->dev, "Write register"
  1290. " failed\n");
  1291. return;
  1292. }
  1293. }
  1294. } else if (!adapter->pps_uapsd_mode &&
  1295. adapter->ps_state == PS_STATE_SLEEP) {
  1296. /* Potentially for PCIe we could get other
  1297. * interrupts like shared. Don't change power
  1298. * state until cookie is set */
  1299. if (mwifiex_pcie_ok_to_access_hw(adapter))
  1300. adapter->ps_state = PS_STATE_AWAKE;
  1301. }
  1302. }
  1303. }
  1304. /*
  1305. * Interrupt handler for PCIe root port
  1306. *
  1307. * This function reads the interrupt status from firmware and assigns
  1308. * the main process in workqueue which will handle the interrupt.
  1309. */
  1310. static irqreturn_t mwifiex_pcie_interrupt(int irq, void *context)
  1311. {
  1312. struct pci_dev *pdev = (struct pci_dev *)context;
  1313. struct pcie_service_card *card;
  1314. struct mwifiex_adapter *adapter;
  1315. if (!pdev) {
  1316. pr_debug("info: %s: pdev is NULL\n", (u8 *)pdev);
  1317. goto exit;
  1318. }
  1319. card = (struct pcie_service_card *) pci_get_drvdata(pdev);
  1320. if (!card || !card->adapter) {
  1321. pr_debug("info: %s: card=%p adapter=%p\n", __func__, card,
  1322. card ? card->adapter : NULL);
  1323. goto exit;
  1324. }
  1325. adapter = card->adapter;
  1326. if (adapter->surprise_removed)
  1327. goto exit;
  1328. mwifiex_interrupt_status(adapter);
  1329. queue_work(adapter->workqueue, &adapter->main_work);
  1330. exit:
  1331. return IRQ_HANDLED;
  1332. }
  1333. /*
  1334. * This function checks the current interrupt status.
  1335. *
  1336. * The following interrupts are checked and handled by this function -
  1337. * - Data sent
  1338. * - Command sent
  1339. * - Command received
  1340. * - Packets received
  1341. * - Events received
  1342. *
  1343. * In case of Rx packets received, the packets are uploaded from card to
  1344. * host and processed accordingly.
  1345. */
  1346. static int mwifiex_process_int_status(struct mwifiex_adapter *adapter)
  1347. {
  1348. int ret;
  1349. u32 pcie_ireg = 0;
  1350. unsigned long flags;
  1351. spin_lock_irqsave(&adapter->int_lock, flags);
  1352. /* Clear out unused interrupts */
  1353. adapter->int_status &= HOST_INTR_MASK;
  1354. spin_unlock_irqrestore(&adapter->int_lock, flags);
  1355. while (adapter->int_status & HOST_INTR_MASK) {
  1356. if (adapter->int_status & HOST_INTR_DNLD_DONE) {
  1357. adapter->int_status &= ~HOST_INTR_DNLD_DONE;
  1358. if (adapter->data_sent) {
  1359. dev_dbg(adapter->dev, "info: DATA sent Interrupt\n");
  1360. adapter->data_sent = false;
  1361. }
  1362. }
  1363. if (adapter->int_status & HOST_INTR_UPLD_RDY) {
  1364. adapter->int_status &= ~HOST_INTR_UPLD_RDY;
  1365. dev_dbg(adapter->dev, "info: Rx DATA\n");
  1366. ret = mwifiex_pcie_process_recv_data(adapter);
  1367. if (ret)
  1368. return ret;
  1369. }
  1370. if (adapter->int_status & HOST_INTR_EVENT_RDY) {
  1371. adapter->int_status &= ~HOST_INTR_EVENT_RDY;
  1372. dev_dbg(adapter->dev, "info: Rx EVENT\n");
  1373. ret = mwifiex_pcie_process_event_ready(adapter);
  1374. if (ret)
  1375. return ret;
  1376. }
  1377. if (adapter->int_status & HOST_INTR_CMD_DONE) {
  1378. adapter->int_status &= ~HOST_INTR_CMD_DONE;
  1379. if (adapter->cmd_sent) {
  1380. dev_dbg(adapter->dev, "info: CMD sent Interrupt\n");
  1381. adapter->cmd_sent = false;
  1382. }
  1383. /* Handle command response */
  1384. ret = mwifiex_pcie_process_cmd_complete(adapter);
  1385. if (ret)
  1386. return ret;
  1387. }
  1388. if (mwifiex_pcie_ok_to_access_hw(adapter)) {
  1389. if (mwifiex_read_reg(adapter, PCIE_HOST_INT_STATUS,
  1390. &pcie_ireg)) {
  1391. dev_warn(adapter->dev, "Read register failed\n");
  1392. return -1;
  1393. }
  1394. if ((pcie_ireg != 0xFFFFFFFF) && (pcie_ireg)) {
  1395. if (mwifiex_write_reg(adapter,
  1396. PCIE_HOST_INT_STATUS, ~pcie_ireg)) {
  1397. dev_warn(adapter->dev, "Write register"
  1398. " failed\n");
  1399. return -1;
  1400. }
  1401. adapter->int_status |= pcie_ireg;
  1402. adapter->int_status &= HOST_INTR_MASK;
  1403. }
  1404. }
  1405. }
  1406. dev_dbg(adapter->dev, "info: cmd_sent=%d data_sent=%d\n",
  1407. adapter->cmd_sent, adapter->data_sent);
  1408. mwifiex_pcie_enable_host_int(adapter);
  1409. return 0;
  1410. }
  1411. /*
  1412. * This function downloads data from driver to card.
  1413. *
  1414. * Both commands and data packets are transferred to the card by this
  1415. * function.
  1416. *
  1417. * This function adds the PCIE specific header to the front of the buffer
  1418. * before transferring. The header contains the length of the packet and
  1419. * the type. The firmware handles the packets based upon this set type.
  1420. */
  1421. static int mwifiex_pcie_host_to_card(struct mwifiex_adapter *adapter, u8 type,
  1422. struct sk_buff *skb,
  1423. struct mwifiex_tx_param *tx_param)
  1424. {
  1425. if (!skb) {
  1426. dev_err(adapter->dev, "Passed NULL skb to %s\n", __func__);
  1427. return -1;
  1428. }
  1429. if (type == MWIFIEX_TYPE_DATA)
  1430. return mwifiex_pcie_send_data(adapter, skb);
  1431. else if (type == MWIFIEX_TYPE_CMD)
  1432. return mwifiex_pcie_send_cmd(adapter, skb);
  1433. return 0;
  1434. }
  1435. /*
  1436. * This function initializes the PCI-E host memory space, WCB rings, etc.
  1437. *
  1438. * The following initializations steps are followed -
  1439. * - Allocate TXBD ring buffers
  1440. * - Allocate RXBD ring buffers
  1441. * - Allocate event BD ring buffers
  1442. * - Allocate command response ring buffer
  1443. * - Allocate sleep cookie buffer
  1444. */
  1445. static int mwifiex_pcie_init(struct mwifiex_adapter *adapter)
  1446. {
  1447. struct pcie_service_card *card = adapter->card;
  1448. int ret;
  1449. struct pci_dev *pdev = card->dev;
  1450. pci_set_drvdata(pdev, card);
  1451. ret = pci_enable_device(pdev);
  1452. if (ret)
  1453. goto err_enable_dev;
  1454. pci_set_master(pdev);
  1455. dev_dbg(adapter->dev, "try set_consistent_dma_mask(32)\n");
  1456. ret = pci_set_dma_mask(pdev, DMA_BIT_MASK(32));
  1457. if (ret) {
  1458. dev_err(adapter->dev, "set_dma_mask(32) failed\n");
  1459. goto err_set_dma_mask;
  1460. }
  1461. ret = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(32));
  1462. if (ret) {
  1463. dev_err(adapter->dev, "set_consistent_dma_mask(64) failed\n");
  1464. goto err_set_dma_mask;
  1465. }
  1466. ret = pci_request_region(pdev, 0, DRV_NAME);
  1467. if (ret) {
  1468. dev_err(adapter->dev, "req_reg(0) error\n");
  1469. goto err_req_region0;
  1470. }
  1471. card->pci_mmap = pci_iomap(pdev, 0, 0);
  1472. if (!card->pci_mmap) {
  1473. dev_err(adapter->dev, "iomap(0) error\n");
  1474. goto err_iomap0;
  1475. }
  1476. ret = pci_request_region(pdev, 2, DRV_NAME);
  1477. if (ret) {
  1478. dev_err(adapter->dev, "req_reg(2) error\n");
  1479. goto err_req_region2;
  1480. }
  1481. card->pci_mmap1 = pci_iomap(pdev, 2, 0);
  1482. if (!card->pci_mmap1) {
  1483. dev_err(adapter->dev, "iomap(2) error\n");
  1484. goto err_iomap2;
  1485. }
  1486. dev_dbg(adapter->dev, "PCI memory map Virt0: %p PCI memory map Virt2: "
  1487. "%p\n", card->pci_mmap, card->pci_mmap1);
  1488. card->cmdrsp_buf = NULL;
  1489. ret = mwifiex_pcie_create_txbd_ring(adapter);
  1490. if (ret)
  1491. goto err_cre_txbd;
  1492. ret = mwifiex_pcie_create_rxbd_ring(adapter);
  1493. if (ret)
  1494. goto err_cre_rxbd;
  1495. ret = mwifiex_pcie_create_evtbd_ring(adapter);
  1496. if (ret)
  1497. goto err_cre_evtbd;
  1498. ret = mwifiex_pcie_alloc_cmdrsp_buf(adapter);
  1499. if (ret)
  1500. goto err_alloc_cmdbuf;
  1501. ret = mwifiex_pcie_alloc_sleep_cookie_buf(adapter);
  1502. if (ret)
  1503. goto err_alloc_cookie;
  1504. return ret;
  1505. err_alloc_cookie:
  1506. mwifiex_pcie_delete_cmdrsp_buf(adapter);
  1507. err_alloc_cmdbuf:
  1508. mwifiex_pcie_delete_evtbd_ring(adapter);
  1509. err_cre_evtbd:
  1510. mwifiex_pcie_delete_rxbd_ring(adapter);
  1511. err_cre_rxbd:
  1512. mwifiex_pcie_delete_txbd_ring(adapter);
  1513. err_cre_txbd:
  1514. pci_iounmap(pdev, card->pci_mmap1);
  1515. err_iomap2:
  1516. pci_release_region(pdev, 2);
  1517. err_req_region2:
  1518. pci_iounmap(pdev, card->pci_mmap);
  1519. err_iomap0:
  1520. pci_release_region(pdev, 0);
  1521. err_req_region0:
  1522. err_set_dma_mask:
  1523. pci_disable_device(pdev);
  1524. err_enable_dev:
  1525. pci_set_drvdata(pdev, NULL);
  1526. return ret;
  1527. }
  1528. /*
  1529. * This function cleans up the allocated card buffers.
  1530. *
  1531. * The following are freed by this function -
  1532. * - TXBD ring buffers
  1533. * - RXBD ring buffers
  1534. * - Event BD ring buffers
  1535. * - Command response ring buffer
  1536. * - Sleep cookie buffer
  1537. */
  1538. static void mwifiex_pcie_cleanup(struct mwifiex_adapter *adapter)
  1539. {
  1540. struct pcie_service_card *card = adapter->card;
  1541. struct pci_dev *pdev = card->dev;
  1542. mwifiex_pcie_delete_sleep_cookie_buf(adapter);
  1543. mwifiex_pcie_delete_cmdrsp_buf(adapter);
  1544. mwifiex_pcie_delete_evtbd_ring(adapter);
  1545. mwifiex_pcie_delete_rxbd_ring(adapter);
  1546. mwifiex_pcie_delete_txbd_ring(adapter);
  1547. card->cmdrsp_buf = NULL;
  1548. dev_dbg(adapter->dev, "Clearing driver ready signature\n");
  1549. if (user_rmmod) {
  1550. if (mwifiex_write_reg(adapter, REG_DRV_READY, 0x00000000))
  1551. dev_err(adapter->dev, "Failed to write driver not-ready signature\n");
  1552. }
  1553. if (pdev) {
  1554. pci_iounmap(pdev, card->pci_mmap);
  1555. pci_iounmap(pdev, card->pci_mmap1);
  1556. pci_release_regions(pdev);
  1557. pci_disable_device(pdev);
  1558. pci_set_drvdata(pdev, NULL);
  1559. }
  1560. }
  1561. /*
  1562. * This function registers the PCIE device.
  1563. *
  1564. * PCIE IRQ is claimed, block size is set and driver data is initialized.
  1565. */
  1566. static int mwifiex_register_dev(struct mwifiex_adapter *adapter)
  1567. {
  1568. int ret;
  1569. struct pcie_service_card *card = adapter->card;
  1570. struct pci_dev *pdev = card->dev;
  1571. /* save adapter pointer in card */
  1572. card->adapter = adapter;
  1573. ret = request_irq(pdev->irq, mwifiex_pcie_interrupt, IRQF_SHARED,
  1574. "MRVL_PCIE", pdev);
  1575. if (ret) {
  1576. pr_err("request_irq failed: ret=%d\n", ret);
  1577. adapter->card = NULL;
  1578. return -1;
  1579. }
  1580. adapter->dev = &pdev->dev;
  1581. strcpy(adapter->fw_name, PCIE8766_DEFAULT_FW_NAME);
  1582. return 0;
  1583. }
  1584. /*
  1585. * This function unregisters the PCIE device.
  1586. *
  1587. * The PCIE IRQ is released, the function is disabled and driver
  1588. * data is set to null.
  1589. */
  1590. static void mwifiex_unregister_dev(struct mwifiex_adapter *adapter)
  1591. {
  1592. struct pcie_service_card *card = adapter->card;
  1593. if (card) {
  1594. dev_dbg(adapter->dev, "%s(): calling free_irq()\n", __func__);
  1595. free_irq(card->dev->irq, card->dev);
  1596. }
  1597. }
  1598. static struct mwifiex_if_ops pcie_ops = {
  1599. .init_if = mwifiex_pcie_init,
  1600. .cleanup_if = mwifiex_pcie_cleanup,
  1601. .check_fw_status = mwifiex_check_fw_status,
  1602. .prog_fw = mwifiex_prog_fw_w_helper,
  1603. .register_dev = mwifiex_register_dev,
  1604. .unregister_dev = mwifiex_unregister_dev,
  1605. .enable_int = mwifiex_pcie_enable_host_int,
  1606. .process_int_status = mwifiex_process_int_status,
  1607. .host_to_card = mwifiex_pcie_host_to_card,
  1608. .wakeup = mwifiex_pm_wakeup_card,
  1609. .wakeup_complete = mwifiex_pm_wakeup_card_complete,
  1610. /* PCIE specific */
  1611. .cmdrsp_complete = mwifiex_pcie_cmdrsp_complete,
  1612. .event_complete = mwifiex_pcie_event_complete,
  1613. .update_mp_end_port = NULL,
  1614. .cleanup_mpa_buf = NULL,
  1615. };
  1616. /*
  1617. * This function initializes the PCIE driver module.
  1618. *
  1619. * This initiates the semaphore and registers the device with
  1620. * PCIE bus.
  1621. */
  1622. static int mwifiex_pcie_init_module(void)
  1623. {
  1624. int ret;
  1625. pr_debug("Marvell 8766 PCIe Driver\n");
  1626. sema_init(&add_remove_card_sem, 1);
  1627. /* Clear the flag in case user removes the card. */
  1628. user_rmmod = 0;
  1629. ret = pci_register_driver(&mwifiex_pcie);
  1630. if (ret)
  1631. pr_err("Driver register failed!\n");
  1632. else
  1633. pr_debug("info: Driver registered successfully!\n");
  1634. return ret;
  1635. }
  1636. /*
  1637. * This function cleans up the PCIE driver.
  1638. *
  1639. * The following major steps are followed for cleanup -
  1640. * - Resume the device if its suspended
  1641. * - Disconnect the device if connected
  1642. * - Shutdown the firmware
  1643. * - Unregister the device from PCIE bus.
  1644. */
  1645. static void mwifiex_pcie_cleanup_module(void)
  1646. {
  1647. if (!down_interruptible(&add_remove_card_sem))
  1648. up(&add_remove_card_sem);
  1649. /* Set the flag as user is removing this module. */
  1650. user_rmmod = 1;
  1651. pci_unregister_driver(&mwifiex_pcie);
  1652. }
  1653. module_init(mwifiex_pcie_init_module);
  1654. module_exit(mwifiex_pcie_cleanup_module);
  1655. MODULE_AUTHOR("Marvell International Ltd.");
  1656. MODULE_DESCRIPTION("Marvell WiFi-Ex PCI-Express Driver version " PCIE_VERSION);
  1657. MODULE_VERSION(PCIE_VERSION);
  1658. MODULE_LICENSE("GPL v2");
  1659. MODULE_FIRMWARE("mrvl/pcie8766_uapsta.bin");