if_sdio.c 23 KB

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