if_sdio.c 21 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027
  1. /*
  2. * linux/drivers/net/wireless/libertas/if_sdio.c
  3. *
  4. * Copyright 2007-2008 Pierre Ossman
  5. *
  6. * Inspired by if_cs.c, Copyright 2007 Holger Schurig
  7. *
  8. * This program is free software; you can redistribute it and/or modify
  9. * it under the terms of the GNU General Public License as published by
  10. * the Free Software Foundation; either version 2 of the License, or (at
  11. * your option) any later version.
  12. *
  13. * This hardware has more or less no CMD53 support, so all registers
  14. * must be accessed using sdio_readb()/sdio_writeb().
  15. *
  16. * Transfers must be in one transaction or the firmware goes bonkers.
  17. * This means that the transfer must either be small enough to do a
  18. * byte based transfer or it must be padded to a multiple of the
  19. * current block size.
  20. *
  21. * As SDIO is still new to the kernel, it is unfortunately common with
  22. * bugs in the host controllers related to that. One such bug is that
  23. * controllers cannot do transfers that aren't a multiple of 4 bytes.
  24. * If you don't have time to fix the host controller driver, you can
  25. * work around the problem by modifying if_sdio_host_to_card() and
  26. * if_sdio_card_to_host() to pad the data.
  27. */
  28. #include <linux/kernel.h>
  29. #include <linux/moduleparam.h>
  30. #include <linux/firmware.h>
  31. #include <linux/netdevice.h>
  32. #include <linux/delay.h>
  33. #include <linux/mmc/card.h>
  34. #include <linux/mmc/sdio_func.h>
  35. #include <linux/mmc/sdio_ids.h>
  36. #include "host.h"
  37. #include "decl.h"
  38. #include "defs.h"
  39. #include "dev.h"
  40. #include "if_sdio.h"
  41. static char *lbs_helper_name = NULL;
  42. module_param_named(helper_name, lbs_helper_name, charp, 0644);
  43. static char *lbs_fw_name = NULL;
  44. module_param_named(fw_name, lbs_fw_name, charp, 0644);
  45. static const struct sdio_device_id if_sdio_ids[] = {
  46. { SDIO_DEVICE(SDIO_VENDOR_ID_MARVELL, SDIO_DEVICE_ID_MARVELL_LIBERTAS) },
  47. { /* end: all zeroes */ },
  48. };
  49. MODULE_DEVICE_TABLE(sdio, if_sdio_ids);
  50. struct if_sdio_model {
  51. int model;
  52. const char *helper;
  53. const char *firmware;
  54. };
  55. static struct if_sdio_model if_sdio_models[] = {
  56. {
  57. /* 8385 */
  58. .model = 0x04,
  59. .helper = "sd8385_helper.bin",
  60. .firmware = "sd8385.bin",
  61. },
  62. {
  63. /* 8686 */
  64. .model = 0x0B,
  65. .helper = "sd8686_helper.bin",
  66. .firmware = "sd8686.bin",
  67. },
  68. };
  69. struct if_sdio_packet {
  70. struct if_sdio_packet *next;
  71. u16 nb;
  72. u8 buffer[0] __attribute__((aligned(4)));
  73. };
  74. struct if_sdio_card {
  75. struct sdio_func *func;
  76. struct lbs_private *priv;
  77. int model;
  78. unsigned long ioport;
  79. const char *helper;
  80. const char *firmware;
  81. u8 buffer[65536];
  82. spinlock_t lock;
  83. struct if_sdio_packet *packets;
  84. struct work_struct packet_worker;
  85. };
  86. /********************************************************************/
  87. /* I/O */
  88. /********************************************************************/
  89. static u16 if_sdio_read_scratch(struct if_sdio_card *card, int *err)
  90. {
  91. int ret, reg;
  92. u16 scratch;
  93. if (card->model == 0x04)
  94. reg = IF_SDIO_SCRATCH_OLD;
  95. else
  96. reg = IF_SDIO_SCRATCH;
  97. scratch = sdio_readb(card->func, reg, &ret);
  98. if (!ret)
  99. scratch |= sdio_readb(card->func, reg + 1, &ret) << 8;
  100. if (err)
  101. *err = ret;
  102. if (ret)
  103. return 0xffff;
  104. return scratch;
  105. }
  106. static int if_sdio_handle_cmd(struct if_sdio_card *card,
  107. u8 *buffer, unsigned size)
  108. {
  109. struct lbs_private *priv = card->priv;
  110. int ret;
  111. unsigned long flags;
  112. u8 i;
  113. lbs_deb_enter(LBS_DEB_SDIO);
  114. if (size > LBS_CMD_BUFFER_SIZE) {
  115. lbs_deb_sdio("response packet too large (%d bytes)\n",
  116. (int)size);
  117. ret = -E2BIG;
  118. goto out;
  119. }
  120. spin_lock_irqsave(&priv->driver_lock, flags);
  121. i = (priv->resp_idx == 0) ? 1 : 0;
  122. BUG_ON(priv->resp_len[i]);
  123. priv->resp_len[i] = size;
  124. memcpy(priv->resp_buf[i], buffer, size);
  125. lbs_notify_command_response(priv, i);
  126. spin_unlock_irqrestore(&card->priv->driver_lock, flags);
  127. ret = 0;
  128. out:
  129. lbs_deb_leave_args(LBS_DEB_SDIO, "ret %d", ret);
  130. return ret;
  131. }
  132. static int if_sdio_handle_data(struct if_sdio_card *card,
  133. u8 *buffer, unsigned size)
  134. {
  135. int ret;
  136. struct sk_buff *skb;
  137. char *data;
  138. lbs_deb_enter(LBS_DEB_SDIO);
  139. if (size > MRVDRV_ETH_RX_PACKET_BUFFER_SIZE) {
  140. lbs_deb_sdio("response packet too large (%d bytes)\n",
  141. (int)size);
  142. ret = -E2BIG;
  143. goto out;
  144. }
  145. skb = dev_alloc_skb(MRVDRV_ETH_RX_PACKET_BUFFER_SIZE + NET_IP_ALIGN);
  146. if (!skb) {
  147. ret = -ENOMEM;
  148. goto out;
  149. }
  150. skb_reserve(skb, NET_IP_ALIGN);
  151. data = skb_put(skb, size);
  152. memcpy(data, buffer, size);
  153. lbs_process_rxed_packet(card->priv, skb);
  154. ret = 0;
  155. out:
  156. lbs_deb_leave_args(LBS_DEB_SDIO, "ret %d", ret);
  157. return ret;
  158. }
  159. static int if_sdio_handle_event(struct if_sdio_card *card,
  160. u8 *buffer, unsigned size)
  161. {
  162. int ret;
  163. u32 event;
  164. lbs_deb_enter(LBS_DEB_SDIO);
  165. if (card->model == 0x04) {
  166. event = sdio_readb(card->func, IF_SDIO_EVENT, &ret);
  167. if (ret)
  168. goto out;
  169. } else {
  170. if (size < 4) {
  171. lbs_deb_sdio("event packet too small (%d bytes)\n",
  172. (int)size);
  173. ret = -EINVAL;
  174. goto out;
  175. }
  176. event = buffer[3] << 24;
  177. event |= buffer[2] << 16;
  178. event |= buffer[1] << 8;
  179. event |= buffer[0] << 0;
  180. }
  181. lbs_queue_event(card->priv, event & 0xFF);
  182. ret = 0;
  183. out:
  184. lbs_deb_leave_args(LBS_DEB_SDIO, "ret %d", ret);
  185. return ret;
  186. }
  187. static int if_sdio_card_to_host(struct if_sdio_card *card)
  188. {
  189. int ret;
  190. u8 status;
  191. u16 size, type, chunk;
  192. unsigned long timeout;
  193. lbs_deb_enter(LBS_DEB_SDIO);
  194. size = if_sdio_read_scratch(card, &ret);
  195. if (ret)
  196. goto out;
  197. if (size < 4) {
  198. lbs_deb_sdio("invalid packet size (%d bytes) from firmware\n",
  199. (int)size);
  200. ret = -EINVAL;
  201. goto out;
  202. }
  203. timeout = jiffies + HZ;
  204. while (1) {
  205. status = sdio_readb(card->func, IF_SDIO_STATUS, &ret);
  206. if (ret)
  207. goto out;
  208. if (status & IF_SDIO_IO_RDY)
  209. break;
  210. if (time_after(jiffies, timeout)) {
  211. ret = -ETIMEDOUT;
  212. goto out;
  213. }
  214. mdelay(1);
  215. }
  216. /*
  217. * The transfer must be in one transaction or the firmware
  218. * goes suicidal. There's no way to guarantee that for all
  219. * controllers, but we can at least try.
  220. */
  221. chunk = sdio_align_size(card->func, size);
  222. ret = sdio_readsb(card->func, card->buffer, card->ioport, chunk);
  223. if (ret)
  224. goto out;
  225. chunk = card->buffer[0] | (card->buffer[1] << 8);
  226. type = card->buffer[2] | (card->buffer[3] << 8);
  227. lbs_deb_sdio("packet of type %d and size %d bytes\n",
  228. (int)type, (int)chunk);
  229. if (chunk > size) {
  230. lbs_deb_sdio("packet fragment (%d > %d)\n",
  231. (int)chunk, (int)size);
  232. ret = -EINVAL;
  233. goto out;
  234. }
  235. if (chunk < size) {
  236. lbs_deb_sdio("packet fragment (%d < %d)\n",
  237. (int)chunk, (int)size);
  238. }
  239. switch (type) {
  240. case MVMS_CMD:
  241. ret = if_sdio_handle_cmd(card, card->buffer + 4, chunk - 4);
  242. if (ret)
  243. goto out;
  244. break;
  245. case MVMS_DAT:
  246. ret = if_sdio_handle_data(card, card->buffer + 4, chunk - 4);
  247. if (ret)
  248. goto out;
  249. break;
  250. case MVMS_EVENT:
  251. ret = if_sdio_handle_event(card, card->buffer + 4, chunk - 4);
  252. if (ret)
  253. goto out;
  254. break;
  255. default:
  256. lbs_deb_sdio("invalid type (%d) from firmware\n",
  257. (int)type);
  258. ret = -EINVAL;
  259. goto out;
  260. }
  261. out:
  262. if (ret)
  263. lbs_pr_err("problem fetching packet from firmware\n");
  264. lbs_deb_leave_args(LBS_DEB_SDIO, "ret %d", ret);
  265. return ret;
  266. }
  267. static void if_sdio_host_to_card_worker(struct work_struct *work)
  268. {
  269. struct if_sdio_card *card;
  270. struct if_sdio_packet *packet;
  271. unsigned long timeout;
  272. u8 status;
  273. int ret;
  274. unsigned long flags;
  275. lbs_deb_enter(LBS_DEB_SDIO);
  276. card = container_of(work, struct if_sdio_card, packet_worker);
  277. while (1) {
  278. spin_lock_irqsave(&card->lock, flags);
  279. packet = card->packets;
  280. if (packet)
  281. card->packets = packet->next;
  282. spin_unlock_irqrestore(&card->lock, flags);
  283. if (!packet)
  284. break;
  285. sdio_claim_host(card->func);
  286. timeout = jiffies + HZ;
  287. while (1) {
  288. status = sdio_readb(card->func, IF_SDIO_STATUS, &ret);
  289. if (ret)
  290. goto release;
  291. if (status & IF_SDIO_IO_RDY)
  292. break;
  293. if (time_after(jiffies, timeout)) {
  294. ret = -ETIMEDOUT;
  295. goto release;
  296. }
  297. mdelay(1);
  298. }
  299. ret = sdio_writesb(card->func, card->ioport,
  300. packet->buffer, packet->nb);
  301. if (ret)
  302. goto release;
  303. release:
  304. sdio_release_host(card->func);
  305. kfree(packet);
  306. }
  307. lbs_deb_leave(LBS_DEB_SDIO);
  308. }
  309. /********************************************************************/
  310. /* Firmware */
  311. /********************************************************************/
  312. static int if_sdio_prog_helper(struct if_sdio_card *card)
  313. {
  314. int ret;
  315. u8 status;
  316. const struct firmware *fw;
  317. unsigned long timeout;
  318. u8 *chunk_buffer;
  319. u32 chunk_size;
  320. const u8 *firmware;
  321. size_t size;
  322. lbs_deb_enter(LBS_DEB_SDIO);
  323. ret = request_firmware(&fw, card->helper, &card->func->dev);
  324. if (ret) {
  325. lbs_pr_err("can't load helper firmware\n");
  326. goto out;
  327. }
  328. chunk_buffer = kzalloc(64, GFP_KERNEL);
  329. if (!chunk_buffer) {
  330. ret = -ENOMEM;
  331. goto release_fw;
  332. }
  333. sdio_claim_host(card->func);
  334. ret = sdio_set_block_size(card->func, 32);
  335. if (ret)
  336. goto release;
  337. firmware = fw->data;
  338. size = fw->size;
  339. while (size) {
  340. timeout = jiffies + HZ;
  341. while (1) {
  342. status = sdio_readb(card->func, IF_SDIO_STATUS, &ret);
  343. if (ret)
  344. goto release;
  345. if ((status & IF_SDIO_IO_RDY) &&
  346. (status & IF_SDIO_DL_RDY))
  347. break;
  348. if (time_after(jiffies, timeout)) {
  349. ret = -ETIMEDOUT;
  350. goto release;
  351. }
  352. mdelay(1);
  353. }
  354. chunk_size = min(size, (size_t)60);
  355. *((__le32*)chunk_buffer) = cpu_to_le32(chunk_size);
  356. memcpy(chunk_buffer + 4, firmware, chunk_size);
  357. /*
  358. lbs_deb_sdio("sending %d bytes chunk\n", chunk_size);
  359. */
  360. ret = sdio_writesb(card->func, card->ioport,
  361. chunk_buffer, 64);
  362. if (ret)
  363. goto release;
  364. firmware += chunk_size;
  365. size -= chunk_size;
  366. }
  367. /* an empty block marks the end of the transfer */
  368. memset(chunk_buffer, 0, 4);
  369. ret = sdio_writesb(card->func, card->ioport, chunk_buffer, 64);
  370. if (ret)
  371. goto release;
  372. lbs_deb_sdio("waiting for helper to boot...\n");
  373. /* wait for the helper to boot by looking at the size register */
  374. timeout = jiffies + HZ;
  375. while (1) {
  376. u16 req_size;
  377. req_size = sdio_readb(card->func, IF_SDIO_RD_BASE, &ret);
  378. if (ret)
  379. goto release;
  380. req_size |= sdio_readb(card->func, IF_SDIO_RD_BASE + 1, &ret) << 8;
  381. if (ret)
  382. goto release;
  383. if (req_size != 0)
  384. break;
  385. if (time_after(jiffies, timeout)) {
  386. ret = -ETIMEDOUT;
  387. goto release;
  388. }
  389. msleep(10);
  390. }
  391. ret = 0;
  392. release:
  393. sdio_set_block_size(card->func, 0);
  394. sdio_release_host(card->func);
  395. kfree(chunk_buffer);
  396. release_fw:
  397. release_firmware(fw);
  398. out:
  399. if (ret)
  400. lbs_pr_err("failed to load helper firmware\n");
  401. lbs_deb_leave_args(LBS_DEB_SDIO, "ret %d", ret);
  402. return ret;
  403. }
  404. static int if_sdio_prog_real(struct if_sdio_card *card)
  405. {
  406. int ret;
  407. u8 status;
  408. const struct firmware *fw;
  409. unsigned long timeout;
  410. u8 *chunk_buffer;
  411. u32 chunk_size;
  412. const u8 *firmware;
  413. size_t size, req_size;
  414. lbs_deb_enter(LBS_DEB_SDIO);
  415. ret = request_firmware(&fw, card->firmware, &card->func->dev);
  416. if (ret) {
  417. lbs_pr_err("can't load firmware\n");
  418. goto out;
  419. }
  420. chunk_buffer = kzalloc(512, GFP_KERNEL);
  421. if (!chunk_buffer) {
  422. ret = -ENOMEM;
  423. goto release_fw;
  424. }
  425. sdio_claim_host(card->func);
  426. ret = sdio_set_block_size(card->func, 32);
  427. if (ret)
  428. goto release;
  429. firmware = fw->data;
  430. size = fw->size;
  431. while (size) {
  432. timeout = jiffies + HZ;
  433. while (1) {
  434. status = sdio_readb(card->func, IF_SDIO_STATUS, &ret);
  435. if (ret)
  436. goto release;
  437. if ((status & IF_SDIO_IO_RDY) &&
  438. (status & IF_SDIO_DL_RDY))
  439. break;
  440. if (time_after(jiffies, timeout)) {
  441. ret = -ETIMEDOUT;
  442. goto release;
  443. }
  444. mdelay(1);
  445. }
  446. req_size = sdio_readb(card->func, IF_SDIO_RD_BASE, &ret);
  447. if (ret)
  448. goto release;
  449. req_size |= sdio_readb(card->func, IF_SDIO_RD_BASE + 1, &ret) << 8;
  450. if (ret)
  451. goto release;
  452. /*
  453. lbs_deb_sdio("firmware wants %d bytes\n", (int)req_size);
  454. */
  455. if (req_size == 0) {
  456. lbs_deb_sdio("firmware helper gave up early\n");
  457. ret = -EIO;
  458. goto release;
  459. }
  460. if (req_size & 0x01) {
  461. lbs_deb_sdio("firmware helper signalled error\n");
  462. ret = -EIO;
  463. goto release;
  464. }
  465. if (req_size > size)
  466. req_size = size;
  467. while (req_size) {
  468. chunk_size = min(req_size, (size_t)512);
  469. memcpy(chunk_buffer, firmware, chunk_size);
  470. /*
  471. lbs_deb_sdio("sending %d bytes (%d bytes) chunk\n",
  472. chunk_size, (chunk_size + 31) / 32 * 32);
  473. */
  474. ret = sdio_writesb(card->func, card->ioport,
  475. chunk_buffer, roundup(chunk_size, 32));
  476. if (ret)
  477. goto release;
  478. firmware += chunk_size;
  479. size -= chunk_size;
  480. req_size -= chunk_size;
  481. }
  482. }
  483. ret = 0;
  484. lbs_deb_sdio("waiting for firmware to boot...\n");
  485. /* wait for the firmware to boot */
  486. timeout = jiffies + HZ;
  487. while (1) {
  488. u16 scratch;
  489. scratch = if_sdio_read_scratch(card, &ret);
  490. if (ret)
  491. goto release;
  492. if (scratch == IF_SDIO_FIRMWARE_OK)
  493. break;
  494. if (time_after(jiffies, timeout)) {
  495. ret = -ETIMEDOUT;
  496. goto release;
  497. }
  498. msleep(10);
  499. }
  500. ret = 0;
  501. release:
  502. sdio_set_block_size(card->func, 0);
  503. sdio_release_host(card->func);
  504. kfree(chunk_buffer);
  505. release_fw:
  506. release_firmware(fw);
  507. out:
  508. if (ret)
  509. lbs_pr_err("failed to load firmware\n");
  510. lbs_deb_leave_args(LBS_DEB_SDIO, "ret %d", ret);
  511. return ret;
  512. }
  513. static int if_sdio_prog_firmware(struct if_sdio_card *card)
  514. {
  515. int ret;
  516. u16 scratch;
  517. lbs_deb_enter(LBS_DEB_SDIO);
  518. sdio_claim_host(card->func);
  519. scratch = if_sdio_read_scratch(card, &ret);
  520. sdio_release_host(card->func);
  521. if (ret)
  522. goto out;
  523. if (scratch == IF_SDIO_FIRMWARE_OK) {
  524. lbs_deb_sdio("firmware already loaded\n");
  525. goto success;
  526. }
  527. ret = if_sdio_prog_helper(card);
  528. if (ret)
  529. goto out;
  530. ret = if_sdio_prog_real(card);
  531. if (ret)
  532. goto out;
  533. success:
  534. ret = 0;
  535. out:
  536. lbs_deb_leave_args(LBS_DEB_SDIO, "ret %d", ret);
  537. return ret;
  538. }
  539. /*******************************************************************/
  540. /* Libertas callbacks */
  541. /*******************************************************************/
  542. static int if_sdio_host_to_card(struct lbs_private *priv,
  543. u8 type, u8 *buf, u16 nb)
  544. {
  545. int ret;
  546. struct if_sdio_card *card;
  547. struct if_sdio_packet *packet, *cur;
  548. u16 size;
  549. unsigned long flags;
  550. lbs_deb_enter_args(LBS_DEB_SDIO, "type %d, bytes %d", type, nb);
  551. card = priv->card;
  552. if (nb > (65536 - sizeof(struct if_sdio_packet) - 4)) {
  553. ret = -EINVAL;
  554. goto out;
  555. }
  556. /*
  557. * The transfer must be in one transaction or the firmware
  558. * goes suicidal. There's no way to guarantee that for all
  559. * controllers, but we can at least try.
  560. */
  561. size = sdio_align_size(card->func, nb + 4);
  562. packet = kzalloc(sizeof(struct if_sdio_packet) + size,
  563. GFP_ATOMIC);
  564. if (!packet) {
  565. ret = -ENOMEM;
  566. goto out;
  567. }
  568. packet->next = NULL;
  569. packet->nb = size;
  570. /*
  571. * SDIO specific header.
  572. */
  573. packet->buffer[0] = (nb + 4) & 0xff;
  574. packet->buffer[1] = ((nb + 4) >> 8) & 0xff;
  575. packet->buffer[2] = type;
  576. packet->buffer[3] = 0;
  577. memcpy(packet->buffer + 4, buf, nb);
  578. spin_lock_irqsave(&card->lock, flags);
  579. if (!card->packets)
  580. card->packets = packet;
  581. else {
  582. cur = card->packets;
  583. while (cur->next)
  584. cur = cur->next;
  585. cur->next = packet;
  586. }
  587. switch (type) {
  588. case MVMS_CMD:
  589. priv->dnld_sent = DNLD_CMD_SENT;
  590. break;
  591. case MVMS_DAT:
  592. priv->dnld_sent = DNLD_DATA_SENT;
  593. break;
  594. default:
  595. lbs_deb_sdio("unknown packet type %d\n", (int)type);
  596. }
  597. spin_unlock_irqrestore(&card->lock, flags);
  598. schedule_work(&card->packet_worker);
  599. ret = 0;
  600. out:
  601. lbs_deb_leave_args(LBS_DEB_SDIO, "ret %d", ret);
  602. return ret;
  603. }
  604. /*******************************************************************/
  605. /* SDIO callbacks */
  606. /*******************************************************************/
  607. static void if_sdio_interrupt(struct sdio_func *func)
  608. {
  609. int ret;
  610. struct if_sdio_card *card;
  611. u8 cause;
  612. lbs_deb_enter(LBS_DEB_SDIO);
  613. card = sdio_get_drvdata(func);
  614. cause = sdio_readb(card->func, IF_SDIO_H_INT_STATUS, &ret);
  615. if (ret)
  616. goto out;
  617. lbs_deb_sdio("interrupt: 0x%X\n", (unsigned)cause);
  618. sdio_writeb(card->func, ~cause, IF_SDIO_H_INT_STATUS, &ret);
  619. if (ret)
  620. goto out;
  621. /*
  622. * Ignore the define name, this really means the card has
  623. * successfully received the command.
  624. */
  625. if (cause & IF_SDIO_H_INT_DNLD)
  626. lbs_host_to_card_done(card->priv);
  627. if (cause & IF_SDIO_H_INT_UPLD) {
  628. ret = if_sdio_card_to_host(card);
  629. if (ret)
  630. goto out;
  631. }
  632. ret = 0;
  633. out:
  634. lbs_deb_leave_args(LBS_DEB_SDIO, "ret %d", ret);
  635. }
  636. static int if_sdio_probe(struct sdio_func *func,
  637. const struct sdio_device_id *id)
  638. {
  639. struct if_sdio_card *card;
  640. struct lbs_private *priv;
  641. int ret, i;
  642. unsigned int model;
  643. struct if_sdio_packet *packet;
  644. lbs_deb_enter(LBS_DEB_SDIO);
  645. for (i = 0;i < func->card->num_info;i++) {
  646. if (sscanf(func->card->info[i],
  647. "802.11 SDIO ID: %x", &model) == 1)
  648. break;
  649. if (sscanf(func->card->info[i],
  650. "ID: %x", &model) == 1)
  651. break;
  652. if (!strcmp(func->card->info[i], "IBIS Wireless SDIO Card")) {
  653. model = 4;
  654. break;
  655. }
  656. }
  657. if (i == func->card->num_info) {
  658. lbs_pr_err("unable to identify card model\n");
  659. return -ENODEV;
  660. }
  661. card = kzalloc(sizeof(struct if_sdio_card), GFP_KERNEL);
  662. if (!card)
  663. return -ENOMEM;
  664. card->func = func;
  665. card->model = model;
  666. spin_lock_init(&card->lock);
  667. INIT_WORK(&card->packet_worker, if_sdio_host_to_card_worker);
  668. for (i = 0;i < ARRAY_SIZE(if_sdio_models);i++) {
  669. if (card->model == if_sdio_models[i].model)
  670. break;
  671. }
  672. if (i == ARRAY_SIZE(if_sdio_models)) {
  673. lbs_pr_err("unkown card model 0x%x\n", card->model);
  674. ret = -ENODEV;
  675. goto free;
  676. }
  677. card->helper = if_sdio_models[i].helper;
  678. card->firmware = if_sdio_models[i].firmware;
  679. if (lbs_helper_name) {
  680. lbs_deb_sdio("overriding helper firmware: %s\n",
  681. lbs_helper_name);
  682. card->helper = lbs_helper_name;
  683. }
  684. if (lbs_fw_name) {
  685. lbs_deb_sdio("overriding firmware: %s\n", lbs_fw_name);
  686. card->firmware = lbs_fw_name;
  687. }
  688. sdio_claim_host(func);
  689. ret = sdio_enable_func(func);
  690. if (ret)
  691. goto release;
  692. ret = sdio_claim_irq(func, if_sdio_interrupt);
  693. if (ret)
  694. goto disable;
  695. card->ioport = sdio_readb(func, IF_SDIO_IOPORT, &ret);
  696. if (ret)
  697. goto release_int;
  698. card->ioport |= sdio_readb(func, IF_SDIO_IOPORT + 1, &ret) << 8;
  699. if (ret)
  700. goto release_int;
  701. card->ioport |= sdio_readb(func, IF_SDIO_IOPORT + 2, &ret) << 16;
  702. if (ret)
  703. goto release_int;
  704. sdio_release_host(func);
  705. sdio_set_drvdata(func, card);
  706. lbs_deb_sdio("class = 0x%X, vendor = 0x%X, "
  707. "device = 0x%X, model = 0x%X, ioport = 0x%X\n",
  708. func->class, func->vendor, func->device,
  709. model, (unsigned)card->ioport);
  710. ret = if_sdio_prog_firmware(card);
  711. if (ret)
  712. goto reclaim;
  713. priv = lbs_add_card(card, &func->dev);
  714. if (!priv) {
  715. ret = -ENOMEM;
  716. goto reclaim;
  717. }
  718. card->priv = priv;
  719. priv->card = card;
  720. priv->hw_host_to_card = if_sdio_host_to_card;
  721. priv->fw_ready = 1;
  722. /*
  723. * Enable interrupts now that everything is set up
  724. */
  725. sdio_claim_host(func);
  726. sdio_writeb(func, 0x0f, IF_SDIO_H_INT_MASK, &ret);
  727. sdio_release_host(func);
  728. if (ret)
  729. goto reclaim;
  730. ret = lbs_start_card(priv);
  731. if (ret)
  732. goto err_activate_card;
  733. out:
  734. lbs_deb_leave_args(LBS_DEB_SDIO, "ret %d", ret);
  735. return ret;
  736. err_activate_card:
  737. flush_scheduled_work();
  738. free_netdev(priv->dev);
  739. kfree(priv);
  740. reclaim:
  741. sdio_claim_host(func);
  742. release_int:
  743. sdio_release_irq(func);
  744. disable:
  745. sdio_disable_func(func);
  746. release:
  747. sdio_release_host(func);
  748. free:
  749. while (card->packets) {
  750. packet = card->packets;
  751. card->packets = card->packets->next;
  752. kfree(packet);
  753. }
  754. kfree(card);
  755. goto out;
  756. }
  757. static void if_sdio_remove(struct sdio_func *func)
  758. {
  759. struct if_sdio_card *card;
  760. struct if_sdio_packet *packet;
  761. lbs_deb_enter(LBS_DEB_SDIO);
  762. card = sdio_get_drvdata(func);
  763. card->priv->surpriseremoved = 1;
  764. lbs_deb_sdio("call remove card\n");
  765. lbs_stop_card(card->priv);
  766. lbs_remove_card(card->priv);
  767. flush_scheduled_work();
  768. sdio_claim_host(func);
  769. sdio_release_irq(func);
  770. sdio_disable_func(func);
  771. sdio_release_host(func);
  772. while (card->packets) {
  773. packet = card->packets;
  774. card->packets = card->packets->next;
  775. kfree(packet);
  776. }
  777. kfree(card);
  778. lbs_deb_leave(LBS_DEB_SDIO);
  779. }
  780. static struct sdio_driver if_sdio_driver = {
  781. .name = "libertas_sdio",
  782. .id_table = if_sdio_ids,
  783. .probe = if_sdio_probe,
  784. .remove = if_sdio_remove,
  785. };
  786. /*******************************************************************/
  787. /* Module functions */
  788. /*******************************************************************/
  789. static int __init if_sdio_init_module(void)
  790. {
  791. int ret = 0;
  792. lbs_deb_enter(LBS_DEB_SDIO);
  793. printk(KERN_INFO "libertas_sdio: Libertas SDIO driver\n");
  794. printk(KERN_INFO "libertas_sdio: Copyright Pierre Ossman\n");
  795. ret = sdio_register_driver(&if_sdio_driver);
  796. lbs_deb_leave_args(LBS_DEB_SDIO, "ret %d", ret);
  797. return ret;
  798. }
  799. static void __exit if_sdio_exit_module(void)
  800. {
  801. lbs_deb_enter(LBS_DEB_SDIO);
  802. sdio_unregister_driver(&if_sdio_driver);
  803. lbs_deb_leave(LBS_DEB_SDIO);
  804. }
  805. module_init(if_sdio_init_module);
  806. module_exit(if_sdio_exit_module);
  807. MODULE_DESCRIPTION("Libertas SDIO WLAN Driver");
  808. MODULE_AUTHOR("Pierre Ossman");
  809. MODULE_LICENSE("GPL");