sdio.c 69 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715
  1. /*
  2. * Marvell Wireless LAN device driver: SDIO specific handling
  3. *
  4. * Copyright (C) 2011-2014, 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 "sdio.h"
  28. #define SDIO_VERSION "1.0"
  29. static void mwifiex_sdio_work(struct work_struct *work);
  30. static struct mwifiex_if_ops sdio_ops;
  31. static struct memory_type_mapping generic_mem_type_map[] = {
  32. {"DUMP", NULL, 0, 0xDD},
  33. };
  34. static struct memory_type_mapping mem_type_mapping_tbl[] = {
  35. {"ITCM", NULL, 0, 0xF0},
  36. {"DTCM", NULL, 0, 0xF1},
  37. {"SQRAM", NULL, 0, 0xF2},
  38. {"APU", NULL, 0, 0xF3},
  39. {"CIU", NULL, 0, 0xF4},
  40. {"ICU", NULL, 0, 0xF5},
  41. {"MAC", NULL, 0, 0xF6},
  42. {"EXT7", NULL, 0, 0xF7},
  43. {"EXT8", NULL, 0, 0xF8},
  44. {"EXT9", NULL, 0, 0xF9},
  45. {"EXT10", NULL, 0, 0xFA},
  46. {"EXT11", NULL, 0, 0xFB},
  47. {"EXT12", NULL, 0, 0xFC},
  48. {"EXT13", NULL, 0, 0xFD},
  49. {"EXTLAST", NULL, 0, 0xFE},
  50. };
  51. static const struct of_device_id mwifiex_sdio_of_match_table[] = {
  52. { .compatible = "marvell,sd8897" },
  53. { .compatible = "marvell,sd8997" },
  54. { }
  55. };
  56. /* This function parse device tree node using mmc subnode devicetree API.
  57. * The device node is saved in card->plt_of_node.
  58. * if the device tree node exist and include interrupts attributes, this
  59. * function will also request platform specific wakeup interrupt.
  60. */
  61. static int mwifiex_sdio_probe_of(struct device *dev)
  62. {
  63. if (!of_match_node(mwifiex_sdio_of_match_table, dev->of_node)) {
  64. dev_err(dev, "required compatible string missing\n");
  65. return -EINVAL;
  66. }
  67. return 0;
  68. }
  69. /*
  70. * SDIO probe.
  71. *
  72. * This function probes an mwifiex device and registers it. It allocates
  73. * the card structure, enables SDIO function number and initiates the
  74. * device registration and initialization procedure by adding a logical
  75. * interface.
  76. */
  77. static int
  78. mwifiex_sdio_probe(struct sdio_func *func, const struct sdio_device_id *id)
  79. {
  80. int ret;
  81. struct sdio_mmc_card *card = NULL;
  82. pr_debug("info: vendor=0x%4.04X device=0x%4.04X class=%d function=%d\n",
  83. func->vendor, func->device, func->class, func->num);
  84. card = devm_kzalloc(&func->dev, sizeof(*card), GFP_KERNEL);
  85. if (!card)
  86. return -ENOMEM;
  87. init_completion(&card->fw_done);
  88. card->func = func;
  89. func->card->quirks |= MMC_QUIRK_BLKSZ_FOR_BYTE_MODE;
  90. if (id->driver_data) {
  91. struct mwifiex_sdio_device *data = (void *)id->driver_data;
  92. card->firmware = data->firmware;
  93. card->reg = data->reg;
  94. card->max_ports = data->max_ports;
  95. card->mp_agg_pkt_limit = data->mp_agg_pkt_limit;
  96. card->supports_sdio_new_mode = data->supports_sdio_new_mode;
  97. card->has_control_mask = data->has_control_mask;
  98. card->tx_buf_size = data->tx_buf_size;
  99. card->mp_tx_agg_buf_size = data->mp_tx_agg_buf_size;
  100. card->mp_rx_agg_buf_size = data->mp_rx_agg_buf_size;
  101. card->can_dump_fw = data->can_dump_fw;
  102. card->fw_dump_enh = data->fw_dump_enh;
  103. card->can_auto_tdls = data->can_auto_tdls;
  104. card->can_ext_scan = data->can_ext_scan;
  105. INIT_WORK(&card->work, mwifiex_sdio_work);
  106. }
  107. sdio_claim_host(func);
  108. ret = sdio_enable_func(func);
  109. sdio_release_host(func);
  110. if (ret) {
  111. dev_err(&func->dev, "failed to enable function\n");
  112. return ret;
  113. }
  114. /* device tree node parsing and platform specific configuration*/
  115. if (func->dev.of_node) {
  116. ret = mwifiex_sdio_probe_of(&func->dev);
  117. if (ret)
  118. goto err_disable;
  119. }
  120. ret = mwifiex_add_card(card, &card->fw_done, &sdio_ops,
  121. MWIFIEX_SDIO, &func->dev);
  122. if (ret) {
  123. dev_err(&func->dev, "add card failed\n");
  124. goto err_disable;
  125. }
  126. return 0;
  127. err_disable:
  128. sdio_claim_host(func);
  129. sdio_disable_func(func);
  130. sdio_release_host(func);
  131. return ret;
  132. }
  133. /*
  134. * SDIO resume.
  135. *
  136. * Kernel needs to suspend all functions separately. Therefore all
  137. * registered functions must have drivers with suspend and resume
  138. * methods. Failing that the kernel simply removes the whole card.
  139. *
  140. * If already not resumed, this function turns on the traffic and
  141. * sends a host sleep cancel request to the firmware.
  142. */
  143. static int mwifiex_sdio_resume(struct device *dev)
  144. {
  145. struct sdio_func *func = dev_to_sdio_func(dev);
  146. struct sdio_mmc_card *card;
  147. struct mwifiex_adapter *adapter;
  148. card = sdio_get_drvdata(func);
  149. if (!card || !card->adapter) {
  150. dev_err(dev, "resume: invalid card or adapter\n");
  151. return 0;
  152. }
  153. adapter = card->adapter;
  154. if (!adapter->is_suspended) {
  155. mwifiex_dbg(adapter, WARN,
  156. "device already resumed\n");
  157. return 0;
  158. }
  159. adapter->is_suspended = false;
  160. /* Disable Host Sleep */
  161. mwifiex_cancel_hs(mwifiex_get_priv(adapter, MWIFIEX_BSS_ROLE_STA),
  162. MWIFIEX_SYNC_CMD);
  163. mwifiex_disable_wake(adapter);
  164. return 0;
  165. }
  166. /* Write data into SDIO card register. Caller claims SDIO device. */
  167. static int
  168. mwifiex_write_reg_locked(struct sdio_func *func, u32 reg, u8 data)
  169. {
  170. int ret = -1;
  171. sdio_writeb(func, data, reg, &ret);
  172. return ret;
  173. }
  174. /* This function writes data into SDIO card register.
  175. */
  176. static int
  177. mwifiex_write_reg(struct mwifiex_adapter *adapter, u32 reg, u8 data)
  178. {
  179. struct sdio_mmc_card *card = adapter->card;
  180. int ret;
  181. sdio_claim_host(card->func);
  182. ret = mwifiex_write_reg_locked(card->func, reg, data);
  183. sdio_release_host(card->func);
  184. return ret;
  185. }
  186. /* This function reads data from SDIO card register.
  187. */
  188. static int
  189. mwifiex_read_reg(struct mwifiex_adapter *adapter, u32 reg, u8 *data)
  190. {
  191. struct sdio_mmc_card *card = adapter->card;
  192. int ret = -1;
  193. u8 val;
  194. sdio_claim_host(card->func);
  195. val = sdio_readb(card->func, reg, &ret);
  196. sdio_release_host(card->func);
  197. *data = val;
  198. return ret;
  199. }
  200. /* This function writes multiple data into SDIO card memory.
  201. *
  202. * This does not work in suspended mode.
  203. */
  204. static int
  205. mwifiex_write_data_sync(struct mwifiex_adapter *adapter,
  206. u8 *buffer, u32 pkt_len, u32 port)
  207. {
  208. struct sdio_mmc_card *card = adapter->card;
  209. int ret;
  210. u8 blk_mode =
  211. (port & MWIFIEX_SDIO_BYTE_MODE_MASK) ? BYTE_MODE : BLOCK_MODE;
  212. u32 blk_size = (blk_mode == BLOCK_MODE) ? MWIFIEX_SDIO_BLOCK_SIZE : 1;
  213. u32 blk_cnt =
  214. (blk_mode ==
  215. BLOCK_MODE) ? (pkt_len /
  216. MWIFIEX_SDIO_BLOCK_SIZE) : pkt_len;
  217. u32 ioport = (port & MWIFIEX_SDIO_IO_PORT_MASK);
  218. if (adapter->is_suspended) {
  219. mwifiex_dbg(adapter, ERROR,
  220. "%s: not allowed while suspended\n", __func__);
  221. return -1;
  222. }
  223. sdio_claim_host(card->func);
  224. ret = sdio_writesb(card->func, ioport, buffer, blk_cnt * blk_size);
  225. sdio_release_host(card->func);
  226. return ret;
  227. }
  228. /* This function reads multiple data from SDIO card memory.
  229. */
  230. static int mwifiex_read_data_sync(struct mwifiex_adapter *adapter, u8 *buffer,
  231. u32 len, u32 port, u8 claim)
  232. {
  233. struct sdio_mmc_card *card = adapter->card;
  234. int ret;
  235. u8 blk_mode = (port & MWIFIEX_SDIO_BYTE_MODE_MASK) ? BYTE_MODE
  236. : BLOCK_MODE;
  237. u32 blk_size = (blk_mode == BLOCK_MODE) ? MWIFIEX_SDIO_BLOCK_SIZE : 1;
  238. u32 blk_cnt = (blk_mode == BLOCK_MODE) ? (len / MWIFIEX_SDIO_BLOCK_SIZE)
  239. : len;
  240. u32 ioport = (port & MWIFIEX_SDIO_IO_PORT_MASK);
  241. if (claim)
  242. sdio_claim_host(card->func);
  243. ret = sdio_readsb(card->func, buffer, ioport, blk_cnt * blk_size);
  244. if (claim)
  245. sdio_release_host(card->func);
  246. return ret;
  247. }
  248. /* This function reads the firmware status.
  249. */
  250. static int
  251. mwifiex_sdio_read_fw_status(struct mwifiex_adapter *adapter, u16 *dat)
  252. {
  253. struct sdio_mmc_card *card = adapter->card;
  254. const struct mwifiex_sdio_card_reg *reg = card->reg;
  255. u8 fws0, fws1;
  256. if (mwifiex_read_reg(adapter, reg->status_reg_0, &fws0))
  257. return -1;
  258. if (mwifiex_read_reg(adapter, reg->status_reg_1, &fws1))
  259. return -1;
  260. *dat = (u16)((fws1 << 8) | fws0);
  261. return 0;
  262. }
  263. /* This function checks the firmware status in card.
  264. */
  265. static int mwifiex_check_fw_status(struct mwifiex_adapter *adapter,
  266. u32 poll_num)
  267. {
  268. int ret = 0;
  269. u16 firmware_stat;
  270. u32 tries;
  271. for (tries = 0; tries < poll_num; tries++) {
  272. ret = mwifiex_sdio_read_fw_status(adapter, &firmware_stat);
  273. if (ret)
  274. continue;
  275. if (firmware_stat == FIRMWARE_READY_SDIO) {
  276. ret = 0;
  277. break;
  278. }
  279. msleep(100);
  280. ret = -1;
  281. }
  282. return ret;
  283. }
  284. /* This function checks if WLAN is the winner.
  285. */
  286. static int mwifiex_check_winner_status(struct mwifiex_adapter *adapter)
  287. {
  288. int ret = 0;
  289. u8 winner = 0;
  290. struct sdio_mmc_card *card = adapter->card;
  291. if (mwifiex_read_reg(adapter, card->reg->status_reg_0, &winner))
  292. return -1;
  293. if (winner)
  294. adapter->winner = 0;
  295. else
  296. adapter->winner = 1;
  297. return ret;
  298. }
  299. /*
  300. * SDIO remove.
  301. *
  302. * This function removes the interface and frees up the card structure.
  303. */
  304. static void
  305. mwifiex_sdio_remove(struct sdio_func *func)
  306. {
  307. struct sdio_mmc_card *card;
  308. struct mwifiex_adapter *adapter;
  309. struct mwifiex_private *priv;
  310. int ret = 0;
  311. u16 firmware_stat;
  312. card = sdio_get_drvdata(func);
  313. if (!card)
  314. return;
  315. wait_for_completion(&card->fw_done);
  316. adapter = card->adapter;
  317. if (!adapter || !adapter->priv_num)
  318. return;
  319. mwifiex_dbg(adapter, INFO, "info: SDIO func num=%d\n", func->num);
  320. ret = mwifiex_sdio_read_fw_status(adapter, &firmware_stat);
  321. if (firmware_stat == FIRMWARE_READY_SDIO && !adapter->mfg_mode) {
  322. mwifiex_deauthenticate_all(adapter);
  323. priv = mwifiex_get_priv(adapter, MWIFIEX_BSS_ROLE_ANY);
  324. mwifiex_disable_auto_ds(priv);
  325. mwifiex_init_shutdown_fw(priv, MWIFIEX_FUNC_SHUTDOWN);
  326. }
  327. mwifiex_remove_card(adapter);
  328. }
  329. /*
  330. * SDIO suspend.
  331. *
  332. * Kernel needs to suspend all functions separately. Therefore all
  333. * registered functions must have drivers with suspend and resume
  334. * methods. Failing that the kernel simply removes the whole card.
  335. *
  336. * If already not suspended, this function allocates and sends a host
  337. * sleep activate request to the firmware and turns off the traffic.
  338. */
  339. static int mwifiex_sdio_suspend(struct device *dev)
  340. {
  341. struct sdio_func *func = dev_to_sdio_func(dev);
  342. struct sdio_mmc_card *card;
  343. struct mwifiex_adapter *adapter;
  344. mmc_pm_flag_t pm_flag = 0;
  345. int ret = 0;
  346. pm_flag = sdio_get_host_pm_caps(func);
  347. pr_debug("cmd: %s: suspend: PM flag = 0x%x\n",
  348. sdio_func_id(func), pm_flag);
  349. if (!(pm_flag & MMC_PM_KEEP_POWER)) {
  350. dev_err(dev, "%s: cannot remain alive while host is"
  351. " suspended\n", sdio_func_id(func));
  352. return -ENOSYS;
  353. }
  354. card = sdio_get_drvdata(func);
  355. if (!card) {
  356. dev_err(dev, "suspend: invalid card\n");
  357. return 0;
  358. }
  359. /* Might still be loading firmware */
  360. wait_for_completion(&card->fw_done);
  361. adapter = card->adapter;
  362. if (!adapter) {
  363. dev_err(dev, "adapter is not valid\n");
  364. return 0;
  365. }
  366. mwifiex_enable_wake(adapter);
  367. /* Enable the Host Sleep */
  368. if (!mwifiex_enable_hs(adapter)) {
  369. mwifiex_dbg(adapter, ERROR,
  370. "cmd: failed to suspend\n");
  371. adapter->hs_enabling = false;
  372. mwifiex_disable_wake(adapter);
  373. return -EFAULT;
  374. }
  375. mwifiex_dbg(adapter, INFO,
  376. "cmd: suspend with MMC_PM_KEEP_POWER\n");
  377. ret = sdio_set_host_pm_flags(func, MMC_PM_KEEP_POWER);
  378. /* Indicate device suspended */
  379. adapter->is_suspended = true;
  380. adapter->hs_enabling = false;
  381. return ret;
  382. }
  383. /* Device ID for SD8786 */
  384. #define SDIO_DEVICE_ID_MARVELL_8786 (0x9116)
  385. /* Device ID for SD8787 */
  386. #define SDIO_DEVICE_ID_MARVELL_8787 (0x9119)
  387. /* Device ID for SD8797 */
  388. #define SDIO_DEVICE_ID_MARVELL_8797 (0x9129)
  389. /* Device ID for SD8897 */
  390. #define SDIO_DEVICE_ID_MARVELL_8897 (0x912d)
  391. /* Device ID for SD8887 */
  392. #define SDIO_DEVICE_ID_MARVELL_8887 (0x9135)
  393. /* Device ID for SD8801 */
  394. #define SDIO_DEVICE_ID_MARVELL_8801 (0x9139)
  395. /* Device ID for SD8997 */
  396. #define SDIO_DEVICE_ID_MARVELL_8997 (0x9141)
  397. /* WLAN IDs */
  398. static const struct sdio_device_id mwifiex_ids[] = {
  399. {SDIO_DEVICE(SDIO_VENDOR_ID_MARVELL, SDIO_DEVICE_ID_MARVELL_8786),
  400. .driver_data = (unsigned long) &mwifiex_sdio_sd8786},
  401. {SDIO_DEVICE(SDIO_VENDOR_ID_MARVELL, SDIO_DEVICE_ID_MARVELL_8787),
  402. .driver_data = (unsigned long) &mwifiex_sdio_sd8787},
  403. {SDIO_DEVICE(SDIO_VENDOR_ID_MARVELL, SDIO_DEVICE_ID_MARVELL_8797),
  404. .driver_data = (unsigned long) &mwifiex_sdio_sd8797},
  405. {SDIO_DEVICE(SDIO_VENDOR_ID_MARVELL, SDIO_DEVICE_ID_MARVELL_8897),
  406. .driver_data = (unsigned long) &mwifiex_sdio_sd8897},
  407. {SDIO_DEVICE(SDIO_VENDOR_ID_MARVELL, SDIO_DEVICE_ID_MARVELL_8887),
  408. .driver_data = (unsigned long)&mwifiex_sdio_sd8887},
  409. {SDIO_DEVICE(SDIO_VENDOR_ID_MARVELL, SDIO_DEVICE_ID_MARVELL_8801),
  410. .driver_data = (unsigned long)&mwifiex_sdio_sd8801},
  411. {SDIO_DEVICE(SDIO_VENDOR_ID_MARVELL, SDIO_DEVICE_ID_MARVELL_8997),
  412. .driver_data = (unsigned long)&mwifiex_sdio_sd8997},
  413. {},
  414. };
  415. MODULE_DEVICE_TABLE(sdio, mwifiex_ids);
  416. static const struct dev_pm_ops mwifiex_sdio_pm_ops = {
  417. .suspend = mwifiex_sdio_suspend,
  418. .resume = mwifiex_sdio_resume,
  419. };
  420. static struct sdio_driver mwifiex_sdio = {
  421. .name = "mwifiex_sdio",
  422. .id_table = mwifiex_ids,
  423. .probe = mwifiex_sdio_probe,
  424. .remove = mwifiex_sdio_remove,
  425. .drv = {
  426. .owner = THIS_MODULE,
  427. .pm = &mwifiex_sdio_pm_ops,
  428. }
  429. };
  430. /*
  431. * This function wakes up the card.
  432. *
  433. * A host power up command is written to the card configuration
  434. * register to wake up the card.
  435. */
  436. static int mwifiex_pm_wakeup_card(struct mwifiex_adapter *adapter)
  437. {
  438. mwifiex_dbg(adapter, EVENT,
  439. "event: wakeup device...\n");
  440. return mwifiex_write_reg(adapter, CONFIGURATION_REG, HOST_POWER_UP);
  441. }
  442. /*
  443. * This function is called after the card has woken up.
  444. *
  445. * The card configuration register is reset.
  446. */
  447. static int mwifiex_pm_wakeup_card_complete(struct mwifiex_adapter *adapter)
  448. {
  449. mwifiex_dbg(adapter, EVENT,
  450. "cmd: wakeup device completed\n");
  451. return mwifiex_write_reg(adapter, CONFIGURATION_REG, 0);
  452. }
  453. static int mwifiex_sdio_dnld_fw(struct mwifiex_adapter *adapter,
  454. struct mwifiex_fw_image *fw)
  455. {
  456. struct sdio_mmc_card *card = adapter->card;
  457. int ret;
  458. sdio_claim_host(card->func);
  459. ret = mwifiex_dnld_fw(adapter, fw);
  460. sdio_release_host(card->func);
  461. return ret;
  462. }
  463. /*
  464. * This function is used to initialize IO ports for the
  465. * chipsets supporting SDIO new mode eg SD8897.
  466. */
  467. static int mwifiex_init_sdio_new_mode(struct mwifiex_adapter *adapter)
  468. {
  469. u8 reg;
  470. struct sdio_mmc_card *card = adapter->card;
  471. adapter->ioport = MEM_PORT;
  472. /* enable sdio new mode */
  473. if (mwifiex_read_reg(adapter, card->reg->card_cfg_2_1_reg, &reg))
  474. return -1;
  475. if (mwifiex_write_reg(adapter, card->reg->card_cfg_2_1_reg,
  476. reg | CMD53_NEW_MODE))
  477. return -1;
  478. /* Configure cmd port and enable reading rx length from the register */
  479. if (mwifiex_read_reg(adapter, card->reg->cmd_cfg_0, &reg))
  480. return -1;
  481. if (mwifiex_write_reg(adapter, card->reg->cmd_cfg_0,
  482. reg | CMD_PORT_RD_LEN_EN))
  483. return -1;
  484. /* Enable Dnld/Upld ready auto reset for cmd port after cmd53 is
  485. * completed
  486. */
  487. if (mwifiex_read_reg(adapter, card->reg->cmd_cfg_1, &reg))
  488. return -1;
  489. if (mwifiex_write_reg(adapter, card->reg->cmd_cfg_1,
  490. reg | CMD_PORT_AUTO_EN))
  491. return -1;
  492. return 0;
  493. }
  494. /* This function initializes the IO ports.
  495. *
  496. * The following operations are performed -
  497. * - Read the IO ports (0, 1 and 2)
  498. * - Set host interrupt Reset-To-Read to clear
  499. * - Set auto re-enable interrupt
  500. */
  501. static int mwifiex_init_sdio_ioport(struct mwifiex_adapter *adapter)
  502. {
  503. u8 reg;
  504. struct sdio_mmc_card *card = adapter->card;
  505. adapter->ioport = 0;
  506. if (card->supports_sdio_new_mode) {
  507. if (mwifiex_init_sdio_new_mode(adapter))
  508. return -1;
  509. goto cont;
  510. }
  511. /* Read the IO port */
  512. if (!mwifiex_read_reg(adapter, card->reg->io_port_0_reg, &reg))
  513. adapter->ioport |= (reg & 0xff);
  514. else
  515. return -1;
  516. if (!mwifiex_read_reg(adapter, card->reg->io_port_1_reg, &reg))
  517. adapter->ioport |= ((reg & 0xff) << 8);
  518. else
  519. return -1;
  520. if (!mwifiex_read_reg(adapter, card->reg->io_port_2_reg, &reg))
  521. adapter->ioport |= ((reg & 0xff) << 16);
  522. else
  523. return -1;
  524. cont:
  525. mwifiex_dbg(adapter, INFO,
  526. "info: SDIO FUNC1 IO port: %#x\n", adapter->ioport);
  527. /* Set Host interrupt reset to read to clear */
  528. if (!mwifiex_read_reg(adapter, card->reg->host_int_rsr_reg, &reg))
  529. mwifiex_write_reg(adapter, card->reg->host_int_rsr_reg,
  530. reg | card->reg->sdio_int_mask);
  531. else
  532. return -1;
  533. /* Dnld/Upld ready set to auto reset */
  534. if (!mwifiex_read_reg(adapter, card->reg->card_misc_cfg_reg, &reg))
  535. mwifiex_write_reg(adapter, card->reg->card_misc_cfg_reg,
  536. reg | AUTO_RE_ENABLE_INT);
  537. else
  538. return -1;
  539. return 0;
  540. }
  541. /*
  542. * This function sends data to the card.
  543. */
  544. static int mwifiex_write_data_to_card(struct mwifiex_adapter *adapter,
  545. u8 *payload, u32 pkt_len, u32 port)
  546. {
  547. u32 i = 0;
  548. int ret;
  549. do {
  550. ret = mwifiex_write_data_sync(adapter, payload, pkt_len, port);
  551. if (ret) {
  552. i++;
  553. mwifiex_dbg(adapter, ERROR,
  554. "host_to_card, write iomem\t"
  555. "(%d) failed: %d\n", i, ret);
  556. if (mwifiex_write_reg(adapter, CONFIGURATION_REG, 0x04))
  557. mwifiex_dbg(adapter, ERROR,
  558. "write CFG reg failed\n");
  559. ret = -1;
  560. if (i > MAX_WRITE_IOMEM_RETRY)
  561. return ret;
  562. }
  563. } while (ret == -1);
  564. return ret;
  565. }
  566. /*
  567. * This function gets the read port.
  568. *
  569. * If control port bit is set in MP read bitmap, the control port
  570. * is returned, otherwise the current read port is returned and
  571. * the value is increased (provided it does not reach the maximum
  572. * limit, in which case it is reset to 1)
  573. */
  574. static int mwifiex_get_rd_port(struct mwifiex_adapter *adapter, u8 *port)
  575. {
  576. struct sdio_mmc_card *card = adapter->card;
  577. const struct mwifiex_sdio_card_reg *reg = card->reg;
  578. u32 rd_bitmap = card->mp_rd_bitmap;
  579. mwifiex_dbg(adapter, DATA,
  580. "data: mp_rd_bitmap=0x%08x\n", rd_bitmap);
  581. if (card->supports_sdio_new_mode) {
  582. if (!(rd_bitmap & reg->data_port_mask))
  583. return -1;
  584. } else {
  585. if (!(rd_bitmap & (CTRL_PORT_MASK | reg->data_port_mask)))
  586. return -1;
  587. }
  588. if ((card->has_control_mask) &&
  589. (card->mp_rd_bitmap & CTRL_PORT_MASK)) {
  590. card->mp_rd_bitmap &= (u32) (~CTRL_PORT_MASK);
  591. *port = CTRL_PORT;
  592. mwifiex_dbg(adapter, DATA,
  593. "data: port=%d mp_rd_bitmap=0x%08x\n",
  594. *port, card->mp_rd_bitmap);
  595. return 0;
  596. }
  597. if (!(card->mp_rd_bitmap & (1 << card->curr_rd_port)))
  598. return -1;
  599. /* We are now handling the SDIO data ports */
  600. card->mp_rd_bitmap &= (u32)(~(1 << card->curr_rd_port));
  601. *port = card->curr_rd_port;
  602. if (++card->curr_rd_port == card->max_ports)
  603. card->curr_rd_port = reg->start_rd_port;
  604. mwifiex_dbg(adapter, DATA,
  605. "data: port=%d mp_rd_bitmap=0x%08x -> 0x%08x\n",
  606. *port, rd_bitmap, card->mp_rd_bitmap);
  607. return 0;
  608. }
  609. /*
  610. * This function gets the write port for data.
  611. *
  612. * The current write port is returned if available and the value is
  613. * increased (provided it does not reach the maximum limit, in which
  614. * case it is reset to 1)
  615. */
  616. static int mwifiex_get_wr_port_data(struct mwifiex_adapter *adapter, u32 *port)
  617. {
  618. struct sdio_mmc_card *card = adapter->card;
  619. const struct mwifiex_sdio_card_reg *reg = card->reg;
  620. u32 wr_bitmap = card->mp_wr_bitmap;
  621. mwifiex_dbg(adapter, DATA,
  622. "data: mp_wr_bitmap=0x%08x\n", wr_bitmap);
  623. if (!(wr_bitmap & card->mp_data_port_mask)) {
  624. adapter->data_sent = true;
  625. return -EBUSY;
  626. }
  627. if (card->mp_wr_bitmap & (1 << card->curr_wr_port)) {
  628. card->mp_wr_bitmap &= (u32) (~(1 << card->curr_wr_port));
  629. *port = card->curr_wr_port;
  630. if (++card->curr_wr_port == card->mp_end_port)
  631. card->curr_wr_port = reg->start_wr_port;
  632. } else {
  633. adapter->data_sent = true;
  634. return -EBUSY;
  635. }
  636. if ((card->has_control_mask) && (*port == CTRL_PORT)) {
  637. mwifiex_dbg(adapter, ERROR,
  638. "invalid data port=%d cur port=%d mp_wr_bitmap=0x%08x -> 0x%08x\n",
  639. *port, card->curr_wr_port, wr_bitmap,
  640. card->mp_wr_bitmap);
  641. return -1;
  642. }
  643. mwifiex_dbg(adapter, DATA,
  644. "data: port=%d mp_wr_bitmap=0x%08x -> 0x%08x\n",
  645. *port, wr_bitmap, card->mp_wr_bitmap);
  646. return 0;
  647. }
  648. /*
  649. * This function polls the card status.
  650. */
  651. static int
  652. mwifiex_sdio_poll_card_status(struct mwifiex_adapter *adapter, u8 bits)
  653. {
  654. struct sdio_mmc_card *card = adapter->card;
  655. u32 tries;
  656. u8 cs;
  657. for (tries = 0; tries < MAX_POLL_TRIES; tries++) {
  658. if (mwifiex_read_reg(adapter, card->reg->poll_reg, &cs))
  659. break;
  660. else if ((cs & bits) == bits)
  661. return 0;
  662. usleep_range(10, 20);
  663. }
  664. mwifiex_dbg(adapter, ERROR,
  665. "poll card status failed, tries = %d\n", tries);
  666. return -1;
  667. }
  668. /*
  669. * This function disables the host interrupt.
  670. *
  671. * The host interrupt mask is read, the disable bit is reset and
  672. * written back to the card host interrupt mask register.
  673. */
  674. static void mwifiex_sdio_disable_host_int(struct mwifiex_adapter *adapter)
  675. {
  676. struct sdio_mmc_card *card = adapter->card;
  677. struct sdio_func *func = card->func;
  678. sdio_claim_host(func);
  679. mwifiex_write_reg_locked(func, card->reg->host_int_mask_reg, 0);
  680. sdio_release_irq(func);
  681. sdio_release_host(func);
  682. }
  683. /*
  684. * This function reads the interrupt status from card.
  685. */
  686. static void mwifiex_interrupt_status(struct mwifiex_adapter *adapter)
  687. {
  688. struct sdio_mmc_card *card = adapter->card;
  689. u8 sdio_ireg;
  690. unsigned long flags;
  691. if (mwifiex_read_data_sync(adapter, card->mp_regs,
  692. card->reg->max_mp_regs,
  693. REG_PORT | MWIFIEX_SDIO_BYTE_MODE_MASK, 0)) {
  694. mwifiex_dbg(adapter, ERROR, "read mp_regs failed\n");
  695. return;
  696. }
  697. sdio_ireg = card->mp_regs[card->reg->host_int_status_reg];
  698. if (sdio_ireg) {
  699. /*
  700. * DN_LD_HOST_INT_STATUS and/or UP_LD_HOST_INT_STATUS
  701. * For SDIO new mode CMD port interrupts
  702. * DN_LD_CMD_PORT_HOST_INT_STATUS and/or
  703. * UP_LD_CMD_PORT_HOST_INT_STATUS
  704. * Clear the interrupt status register
  705. */
  706. mwifiex_dbg(adapter, INTR,
  707. "int: sdio_ireg = %#x\n", sdio_ireg);
  708. spin_lock_irqsave(&adapter->int_lock, flags);
  709. adapter->int_status |= sdio_ireg;
  710. spin_unlock_irqrestore(&adapter->int_lock, flags);
  711. }
  712. }
  713. /*
  714. * SDIO interrupt handler.
  715. *
  716. * This function reads the interrupt status from firmware and handles
  717. * the interrupt in current thread (ksdioirqd) right away.
  718. */
  719. static void
  720. mwifiex_sdio_interrupt(struct sdio_func *func)
  721. {
  722. struct mwifiex_adapter *adapter;
  723. struct sdio_mmc_card *card;
  724. card = sdio_get_drvdata(func);
  725. if (!card || !card->adapter) {
  726. pr_err("int: func=%p card=%p adapter=%p\n",
  727. func, card, card ? card->adapter : NULL);
  728. return;
  729. }
  730. adapter = card->adapter;
  731. if (!adapter->pps_uapsd_mode && adapter->ps_state == PS_STATE_SLEEP)
  732. adapter->ps_state = PS_STATE_AWAKE;
  733. mwifiex_interrupt_status(adapter);
  734. mwifiex_main_process(adapter);
  735. }
  736. /*
  737. * This function enables the host interrupt.
  738. *
  739. * The host interrupt enable mask is written to the card
  740. * host interrupt mask register.
  741. */
  742. static int mwifiex_sdio_enable_host_int(struct mwifiex_adapter *adapter)
  743. {
  744. struct sdio_mmc_card *card = adapter->card;
  745. struct sdio_func *func = card->func;
  746. int ret;
  747. sdio_claim_host(func);
  748. /* Request the SDIO IRQ */
  749. ret = sdio_claim_irq(func, mwifiex_sdio_interrupt);
  750. if (ret) {
  751. mwifiex_dbg(adapter, ERROR,
  752. "claim irq failed: ret=%d\n", ret);
  753. goto out;
  754. }
  755. /* Simply write the mask to the register */
  756. ret = mwifiex_write_reg_locked(func, card->reg->host_int_mask_reg,
  757. card->reg->host_int_enable);
  758. if (ret) {
  759. mwifiex_dbg(adapter, ERROR,
  760. "enable host interrupt failed\n");
  761. sdio_release_irq(func);
  762. }
  763. out:
  764. sdio_release_host(func);
  765. return ret;
  766. }
  767. /*
  768. * This function sends a data buffer to the card.
  769. */
  770. static int mwifiex_sdio_card_to_host(struct mwifiex_adapter *adapter,
  771. u32 *type, u8 *buffer,
  772. u32 npayload, u32 ioport)
  773. {
  774. int ret;
  775. u32 nb;
  776. if (!buffer) {
  777. mwifiex_dbg(adapter, ERROR,
  778. "%s: buffer is NULL\n", __func__);
  779. return -1;
  780. }
  781. ret = mwifiex_read_data_sync(adapter, buffer, npayload, ioport, 1);
  782. if (ret) {
  783. mwifiex_dbg(adapter, ERROR,
  784. "%s: read iomem failed: %d\n", __func__,
  785. ret);
  786. return -1;
  787. }
  788. nb = get_unaligned_le16((buffer));
  789. if (nb > npayload) {
  790. mwifiex_dbg(adapter, ERROR,
  791. "%s: invalid packet, nb=%d npayload=%d\n",
  792. __func__, nb, npayload);
  793. return -1;
  794. }
  795. *type = get_unaligned_le16((buffer + 2));
  796. return ret;
  797. }
  798. /*
  799. * This function downloads the firmware to the card.
  800. *
  801. * Firmware is downloaded to the card in blocks. Every block download
  802. * is tested for CRC errors, and retried a number of times before
  803. * returning failure.
  804. */
  805. static int mwifiex_prog_fw_w_helper(struct mwifiex_adapter *adapter,
  806. struct mwifiex_fw_image *fw)
  807. {
  808. struct sdio_mmc_card *card = adapter->card;
  809. const struct mwifiex_sdio_card_reg *reg = card->reg;
  810. int ret;
  811. u8 *firmware = fw->fw_buf;
  812. u32 firmware_len = fw->fw_len;
  813. u32 offset = 0;
  814. u8 base0, base1;
  815. u8 *fwbuf;
  816. u16 len = 0;
  817. u32 txlen, tx_blocks = 0, tries;
  818. u32 i = 0;
  819. if (!firmware_len) {
  820. mwifiex_dbg(adapter, ERROR,
  821. "firmware image not found! Terminating download\n");
  822. return -1;
  823. }
  824. mwifiex_dbg(adapter, INFO,
  825. "info: downloading FW image (%d bytes)\n",
  826. firmware_len);
  827. /* Assume that the allocated buffer is 8-byte aligned */
  828. fwbuf = kzalloc(MWIFIEX_UPLD_SIZE, GFP_KERNEL);
  829. if (!fwbuf)
  830. return -ENOMEM;
  831. sdio_claim_host(card->func);
  832. /* Perform firmware data transfer */
  833. do {
  834. /* The host polls for the DN_LD_CARD_RDY and CARD_IO_READY
  835. bits */
  836. ret = mwifiex_sdio_poll_card_status(adapter, CARD_IO_READY |
  837. DN_LD_CARD_RDY);
  838. if (ret) {
  839. mwifiex_dbg(adapter, ERROR,
  840. "FW download with helper:\t"
  841. "poll status timeout @ %d\n", offset);
  842. goto done;
  843. }
  844. /* More data? */
  845. if (offset >= firmware_len)
  846. break;
  847. for (tries = 0; tries < MAX_POLL_TRIES; tries++) {
  848. ret = mwifiex_read_reg(adapter, reg->base_0_reg,
  849. &base0);
  850. if (ret) {
  851. mwifiex_dbg(adapter, ERROR,
  852. "dev BASE0 register read failed:\t"
  853. "base0=%#04X(%d). Terminating dnld\n",
  854. base0, base0);
  855. goto done;
  856. }
  857. ret = mwifiex_read_reg(adapter, reg->base_1_reg,
  858. &base1);
  859. if (ret) {
  860. mwifiex_dbg(adapter, ERROR,
  861. "dev BASE1 register read failed:\t"
  862. "base1=%#04X(%d). Terminating dnld\n",
  863. base1, base1);
  864. goto done;
  865. }
  866. len = (u16) (((base1 & 0xff) << 8) | (base0 & 0xff));
  867. if (len)
  868. break;
  869. usleep_range(10, 20);
  870. }
  871. if (!len) {
  872. break;
  873. } else if (len > MWIFIEX_UPLD_SIZE) {
  874. mwifiex_dbg(adapter, ERROR,
  875. "FW dnld failed @ %d, invalid length %d\n",
  876. offset, len);
  877. ret = -1;
  878. goto done;
  879. }
  880. txlen = len;
  881. if (len & BIT(0)) {
  882. i++;
  883. if (i > MAX_WRITE_IOMEM_RETRY) {
  884. mwifiex_dbg(adapter, ERROR,
  885. "FW dnld failed @ %d, over max retry\n",
  886. offset);
  887. ret = -1;
  888. goto done;
  889. }
  890. mwifiex_dbg(adapter, ERROR,
  891. "CRC indicated by the helper:\t"
  892. "len = 0x%04X, txlen = %d\n", len, txlen);
  893. len &= ~BIT(0);
  894. /* Setting this to 0 to resend from same offset */
  895. txlen = 0;
  896. } else {
  897. i = 0;
  898. /* Set blocksize to transfer - checking for last
  899. block */
  900. if (firmware_len - offset < txlen)
  901. txlen = firmware_len - offset;
  902. tx_blocks = (txlen + MWIFIEX_SDIO_BLOCK_SIZE - 1)
  903. / MWIFIEX_SDIO_BLOCK_SIZE;
  904. /* Copy payload to buffer */
  905. memmove(fwbuf, &firmware[offset], txlen);
  906. }
  907. ret = mwifiex_write_data_sync(adapter, fwbuf, tx_blocks *
  908. MWIFIEX_SDIO_BLOCK_SIZE,
  909. adapter->ioport);
  910. if (ret) {
  911. mwifiex_dbg(adapter, ERROR,
  912. "FW download, write iomem (%d) failed @ %d\n",
  913. i, offset);
  914. if (mwifiex_write_reg(adapter, CONFIGURATION_REG, 0x04))
  915. mwifiex_dbg(adapter, ERROR,
  916. "write CFG reg failed\n");
  917. ret = -1;
  918. goto done;
  919. }
  920. offset += txlen;
  921. } while (true);
  922. mwifiex_dbg(adapter, MSG,
  923. "info: FW download over, size %d bytes\n", offset);
  924. ret = 0;
  925. done:
  926. sdio_release_host(card->func);
  927. kfree(fwbuf);
  928. return ret;
  929. }
  930. /*
  931. * This function decode sdio aggreation pkt.
  932. *
  933. * Based on the the data block size and pkt_len,
  934. * skb data will be decoded to few packets.
  935. */
  936. static void mwifiex_deaggr_sdio_pkt(struct mwifiex_adapter *adapter,
  937. struct sk_buff *skb)
  938. {
  939. u32 total_pkt_len, pkt_len;
  940. struct sk_buff *skb_deaggr;
  941. u16 blk_size;
  942. u8 blk_num;
  943. u8 *data;
  944. data = skb->data;
  945. total_pkt_len = skb->len;
  946. while (total_pkt_len >= (SDIO_HEADER_OFFSET + INTF_HEADER_LEN)) {
  947. if (total_pkt_len < adapter->sdio_rx_block_size)
  948. break;
  949. blk_num = *(data + BLOCK_NUMBER_OFFSET);
  950. blk_size = adapter->sdio_rx_block_size * blk_num;
  951. if (blk_size > total_pkt_len) {
  952. mwifiex_dbg(adapter, ERROR,
  953. "%s: error in blk_size,\t"
  954. "blk_num=%d, blk_size=%d, total_pkt_len=%d\n",
  955. __func__, blk_num, blk_size, total_pkt_len);
  956. break;
  957. }
  958. pkt_len = get_unaligned_le16((data +
  959. SDIO_HEADER_OFFSET));
  960. if ((pkt_len + SDIO_HEADER_OFFSET) > blk_size) {
  961. mwifiex_dbg(adapter, ERROR,
  962. "%s: error in pkt_len,\t"
  963. "pkt_len=%d, blk_size=%d\n",
  964. __func__, pkt_len, blk_size);
  965. break;
  966. }
  967. skb_deaggr = mwifiex_alloc_dma_align_buf(pkt_len, GFP_KERNEL);
  968. if (!skb_deaggr)
  969. break;
  970. skb_put(skb_deaggr, pkt_len);
  971. memcpy(skb_deaggr->data, data + SDIO_HEADER_OFFSET, pkt_len);
  972. skb_pull(skb_deaggr, INTF_HEADER_LEN);
  973. mwifiex_handle_rx_packet(adapter, skb_deaggr);
  974. data += blk_size;
  975. total_pkt_len -= blk_size;
  976. }
  977. }
  978. /*
  979. * This function decodes a received packet.
  980. *
  981. * Based on the type, the packet is treated as either a data, or
  982. * a command response, or an event, and the correct handler
  983. * function is invoked.
  984. */
  985. static int mwifiex_decode_rx_packet(struct mwifiex_adapter *adapter,
  986. struct sk_buff *skb, u32 upld_typ)
  987. {
  988. u8 *cmd_buf;
  989. u16 pkt_len;
  990. struct mwifiex_rxinfo *rx_info;
  991. pkt_len = get_unaligned_le16(skb->data);
  992. if (upld_typ != MWIFIEX_TYPE_AGGR_DATA) {
  993. skb_trim(skb, pkt_len);
  994. skb_pull(skb, INTF_HEADER_LEN);
  995. }
  996. switch (upld_typ) {
  997. case MWIFIEX_TYPE_AGGR_DATA:
  998. mwifiex_dbg(adapter, INFO,
  999. "info: --- Rx: Aggr Data packet ---\n");
  1000. rx_info = MWIFIEX_SKB_RXCB(skb);
  1001. rx_info->buf_type = MWIFIEX_TYPE_AGGR_DATA;
  1002. if (adapter->rx_work_enabled) {
  1003. skb_queue_tail(&adapter->rx_data_q, skb);
  1004. atomic_inc(&adapter->rx_pending);
  1005. adapter->data_received = true;
  1006. } else {
  1007. mwifiex_deaggr_sdio_pkt(adapter, skb);
  1008. dev_kfree_skb_any(skb);
  1009. }
  1010. break;
  1011. case MWIFIEX_TYPE_DATA:
  1012. mwifiex_dbg(adapter, DATA,
  1013. "info: --- Rx: Data packet ---\n");
  1014. if (adapter->rx_work_enabled) {
  1015. skb_queue_tail(&adapter->rx_data_q, skb);
  1016. adapter->data_received = true;
  1017. atomic_inc(&adapter->rx_pending);
  1018. } else {
  1019. mwifiex_handle_rx_packet(adapter, skb);
  1020. }
  1021. break;
  1022. case MWIFIEX_TYPE_CMD:
  1023. mwifiex_dbg(adapter, CMD,
  1024. "info: --- Rx: Cmd Response ---\n");
  1025. /* take care of curr_cmd = NULL case */
  1026. if (!adapter->curr_cmd) {
  1027. cmd_buf = adapter->upld_buf;
  1028. if (adapter->ps_state == PS_STATE_SLEEP_CFM)
  1029. mwifiex_process_sleep_confirm_resp(adapter,
  1030. skb->data,
  1031. skb->len);
  1032. memcpy(cmd_buf, skb->data,
  1033. min_t(u32, MWIFIEX_SIZE_OF_CMD_BUFFER,
  1034. skb->len));
  1035. dev_kfree_skb_any(skb);
  1036. } else {
  1037. adapter->cmd_resp_received = true;
  1038. adapter->curr_cmd->resp_skb = skb;
  1039. }
  1040. break;
  1041. case MWIFIEX_TYPE_EVENT:
  1042. mwifiex_dbg(adapter, EVENT,
  1043. "info: --- Rx: Event ---\n");
  1044. adapter->event_cause = get_unaligned_le32(skb->data);
  1045. if ((skb->len > 0) && (skb->len < MAX_EVENT_SIZE))
  1046. memcpy(adapter->event_body,
  1047. skb->data + MWIFIEX_EVENT_HEADER_LEN,
  1048. skb->len);
  1049. /* event cause has been saved to adapter->event_cause */
  1050. adapter->event_received = true;
  1051. adapter->event_skb = skb;
  1052. break;
  1053. default:
  1054. mwifiex_dbg(adapter, ERROR,
  1055. "unknown upload type %#x\n", upld_typ);
  1056. dev_kfree_skb_any(skb);
  1057. break;
  1058. }
  1059. return 0;
  1060. }
  1061. /*
  1062. * This function transfers received packets from card to driver, performing
  1063. * aggregation if required.
  1064. *
  1065. * For data received on control port, or if aggregation is disabled, the
  1066. * received buffers are uploaded as separate packets. However, if aggregation
  1067. * is enabled and required, the buffers are copied onto an aggregation buffer,
  1068. * provided there is space left, processed and finally uploaded.
  1069. */
  1070. static int mwifiex_sdio_card_to_host_mp_aggr(struct mwifiex_adapter *adapter,
  1071. u16 rx_len, u8 port)
  1072. {
  1073. struct sdio_mmc_card *card = adapter->card;
  1074. s32 f_do_rx_aggr = 0;
  1075. s32 f_do_rx_cur = 0;
  1076. s32 f_aggr_cur = 0;
  1077. s32 f_post_aggr_cur = 0;
  1078. struct sk_buff *skb_deaggr;
  1079. struct sk_buff *skb = NULL;
  1080. u32 pkt_len, pkt_type, mport, pind;
  1081. u8 *curr_ptr;
  1082. if ((card->has_control_mask) && (port == CTRL_PORT)) {
  1083. /* Read the command Resp without aggr */
  1084. mwifiex_dbg(adapter, CMD,
  1085. "info: %s: no aggregation for cmd\t"
  1086. "response\n", __func__);
  1087. f_do_rx_cur = 1;
  1088. goto rx_curr_single;
  1089. }
  1090. if (!card->mpa_rx.enabled) {
  1091. mwifiex_dbg(adapter, WARN,
  1092. "info: %s: rx aggregation disabled\n",
  1093. __func__);
  1094. f_do_rx_cur = 1;
  1095. goto rx_curr_single;
  1096. }
  1097. if ((!card->has_control_mask && (card->mp_rd_bitmap &
  1098. card->reg->data_port_mask)) ||
  1099. (card->has_control_mask && (card->mp_rd_bitmap &
  1100. (~((u32) CTRL_PORT_MASK))))) {
  1101. /* Some more data RX pending */
  1102. mwifiex_dbg(adapter, INFO,
  1103. "info: %s: not last packet\n", __func__);
  1104. if (MP_RX_AGGR_IN_PROGRESS(card)) {
  1105. if (MP_RX_AGGR_BUF_HAS_ROOM(card, rx_len)) {
  1106. f_aggr_cur = 1;
  1107. } else {
  1108. /* No room in Aggr buf, do rx aggr now */
  1109. f_do_rx_aggr = 1;
  1110. f_post_aggr_cur = 1;
  1111. }
  1112. } else {
  1113. /* Rx aggr not in progress */
  1114. f_aggr_cur = 1;
  1115. }
  1116. } else {
  1117. /* No more data RX pending */
  1118. mwifiex_dbg(adapter, INFO,
  1119. "info: %s: last packet\n", __func__);
  1120. if (MP_RX_AGGR_IN_PROGRESS(card)) {
  1121. f_do_rx_aggr = 1;
  1122. if (MP_RX_AGGR_BUF_HAS_ROOM(card, rx_len))
  1123. f_aggr_cur = 1;
  1124. else
  1125. /* No room in Aggr buf, do rx aggr now */
  1126. f_do_rx_cur = 1;
  1127. } else {
  1128. f_do_rx_cur = 1;
  1129. }
  1130. }
  1131. if (f_aggr_cur) {
  1132. mwifiex_dbg(adapter, INFO,
  1133. "info: current packet aggregation\n");
  1134. /* Curr pkt can be aggregated */
  1135. mp_rx_aggr_setup(card, rx_len, port);
  1136. if (MP_RX_AGGR_PKT_LIMIT_REACHED(card) ||
  1137. mp_rx_aggr_port_limit_reached(card)) {
  1138. mwifiex_dbg(adapter, INFO,
  1139. "info: %s: aggregated packet\t"
  1140. "limit reached\n", __func__);
  1141. /* No more pkts allowed in Aggr buf, rx it */
  1142. f_do_rx_aggr = 1;
  1143. }
  1144. }
  1145. if (f_do_rx_aggr) {
  1146. /* do aggr RX now */
  1147. mwifiex_dbg(adapter, DATA,
  1148. "info: do_rx_aggr: num of packets: %d\n",
  1149. card->mpa_rx.pkt_cnt);
  1150. if (card->supports_sdio_new_mode) {
  1151. int i;
  1152. u32 port_count;
  1153. for (i = 0, port_count = 0; i < card->max_ports; i++)
  1154. if (card->mpa_rx.ports & BIT(i))
  1155. port_count++;
  1156. /* Reading data from "start_port + 0" to "start_port +
  1157. * port_count -1", so decrease the count by 1
  1158. */
  1159. port_count--;
  1160. mport = (adapter->ioport | SDIO_MPA_ADDR_BASE |
  1161. (port_count << 8)) + card->mpa_rx.start_port;
  1162. } else {
  1163. mport = (adapter->ioport | SDIO_MPA_ADDR_BASE |
  1164. (card->mpa_rx.ports << 4)) +
  1165. card->mpa_rx.start_port;
  1166. }
  1167. if (card->mpa_rx.pkt_cnt == 1)
  1168. mport = adapter->ioport + card->mpa_rx.start_port;
  1169. if (mwifiex_read_data_sync(adapter, card->mpa_rx.buf,
  1170. card->mpa_rx.buf_len, mport, 1))
  1171. goto error;
  1172. curr_ptr = card->mpa_rx.buf;
  1173. for (pind = 0; pind < card->mpa_rx.pkt_cnt; pind++) {
  1174. u32 *len_arr = card->mpa_rx.len_arr;
  1175. /* get curr PKT len & type */
  1176. pkt_len = get_unaligned_le16(&curr_ptr[0]);
  1177. pkt_type = get_unaligned_le16(&curr_ptr[2]);
  1178. /* copy pkt to deaggr buf */
  1179. skb_deaggr = mwifiex_alloc_dma_align_buf(len_arr[pind],
  1180. GFP_KERNEL);
  1181. if (!skb_deaggr) {
  1182. mwifiex_dbg(adapter, ERROR, "skb allocation failure\t"
  1183. "drop pkt len=%d type=%d\n",
  1184. pkt_len, pkt_type);
  1185. curr_ptr += len_arr[pind];
  1186. continue;
  1187. }
  1188. skb_put(skb_deaggr, len_arr[pind]);
  1189. if ((pkt_type == MWIFIEX_TYPE_DATA ||
  1190. (pkt_type == MWIFIEX_TYPE_AGGR_DATA &&
  1191. adapter->sdio_rx_aggr_enable)) &&
  1192. (pkt_len <= len_arr[pind])) {
  1193. memcpy(skb_deaggr->data, curr_ptr, pkt_len);
  1194. skb_trim(skb_deaggr, pkt_len);
  1195. /* Process de-aggr packet */
  1196. mwifiex_decode_rx_packet(adapter, skb_deaggr,
  1197. pkt_type);
  1198. } else {
  1199. mwifiex_dbg(adapter, ERROR,
  1200. "drop wrong aggr pkt:\t"
  1201. "sdio_single_port_rx_aggr=%d\t"
  1202. "type=%d len=%d max_len=%d\n",
  1203. adapter->sdio_rx_aggr_enable,
  1204. pkt_type, pkt_len, len_arr[pind]);
  1205. dev_kfree_skb_any(skb_deaggr);
  1206. }
  1207. curr_ptr += len_arr[pind];
  1208. }
  1209. MP_RX_AGGR_BUF_RESET(card);
  1210. }
  1211. rx_curr_single:
  1212. if (f_do_rx_cur) {
  1213. mwifiex_dbg(adapter, INFO, "info: RX: port: %d, rx_len: %d\n",
  1214. port, rx_len);
  1215. skb = mwifiex_alloc_dma_align_buf(rx_len, GFP_KERNEL);
  1216. if (!skb) {
  1217. mwifiex_dbg(adapter, ERROR,
  1218. "single skb allocated fail,\t"
  1219. "drop pkt port=%d len=%d\n", port, rx_len);
  1220. if (mwifiex_sdio_card_to_host(adapter, &pkt_type,
  1221. card->mpa_rx.buf, rx_len,
  1222. adapter->ioport + port))
  1223. goto error;
  1224. return 0;
  1225. }
  1226. skb_put(skb, rx_len);
  1227. if (mwifiex_sdio_card_to_host(adapter, &pkt_type,
  1228. skb->data, skb->len,
  1229. adapter->ioport + port))
  1230. goto error;
  1231. if (!adapter->sdio_rx_aggr_enable &&
  1232. pkt_type == MWIFIEX_TYPE_AGGR_DATA) {
  1233. mwifiex_dbg(adapter, ERROR, "drop wrong pkt type %d\t"
  1234. "current SDIO RX Aggr not enabled\n",
  1235. pkt_type);
  1236. dev_kfree_skb_any(skb);
  1237. return 0;
  1238. }
  1239. mwifiex_decode_rx_packet(adapter, skb, pkt_type);
  1240. }
  1241. if (f_post_aggr_cur) {
  1242. mwifiex_dbg(adapter, INFO,
  1243. "info: current packet aggregation\n");
  1244. /* Curr pkt can be aggregated */
  1245. mp_rx_aggr_setup(card, rx_len, port);
  1246. }
  1247. return 0;
  1248. error:
  1249. if (MP_RX_AGGR_IN_PROGRESS(card))
  1250. MP_RX_AGGR_BUF_RESET(card);
  1251. if (f_do_rx_cur && skb)
  1252. /* Single transfer pending. Free curr buff also */
  1253. dev_kfree_skb_any(skb);
  1254. return -1;
  1255. }
  1256. /*
  1257. * This function checks the current interrupt status.
  1258. *
  1259. * The following interrupts are checked and handled by this function -
  1260. * - Data sent
  1261. * - Command sent
  1262. * - Packets received
  1263. *
  1264. * Since the firmware does not generate download ready interrupt if the
  1265. * port updated is command port only, command sent interrupt checking
  1266. * should be done manually, and for every SDIO interrupt.
  1267. *
  1268. * In case of Rx packets received, the packets are uploaded from card to
  1269. * host and processed accordingly.
  1270. */
  1271. static int mwifiex_process_int_status(struct mwifiex_adapter *adapter)
  1272. {
  1273. struct sdio_mmc_card *card = adapter->card;
  1274. const struct mwifiex_sdio_card_reg *reg = card->reg;
  1275. int ret = 0;
  1276. u8 sdio_ireg;
  1277. struct sk_buff *skb;
  1278. u8 port = CTRL_PORT;
  1279. u32 len_reg_l, len_reg_u;
  1280. u32 rx_blocks;
  1281. u16 rx_len;
  1282. unsigned long flags;
  1283. u32 bitmap;
  1284. u8 cr;
  1285. spin_lock_irqsave(&adapter->int_lock, flags);
  1286. sdio_ireg = adapter->int_status;
  1287. adapter->int_status = 0;
  1288. spin_unlock_irqrestore(&adapter->int_lock, flags);
  1289. if (!sdio_ireg)
  1290. return ret;
  1291. /* Following interrupt is only for SDIO new mode */
  1292. if (sdio_ireg & DN_LD_CMD_PORT_HOST_INT_STATUS && adapter->cmd_sent)
  1293. adapter->cmd_sent = false;
  1294. /* Following interrupt is only for SDIO new mode */
  1295. if (sdio_ireg & UP_LD_CMD_PORT_HOST_INT_STATUS) {
  1296. u32 pkt_type;
  1297. /* read the len of control packet */
  1298. rx_len = card->mp_regs[reg->cmd_rd_len_1] << 8;
  1299. rx_len |= (u16)card->mp_regs[reg->cmd_rd_len_0];
  1300. rx_blocks = DIV_ROUND_UP(rx_len, MWIFIEX_SDIO_BLOCK_SIZE);
  1301. if (rx_len <= INTF_HEADER_LEN ||
  1302. (rx_blocks * MWIFIEX_SDIO_BLOCK_SIZE) >
  1303. MWIFIEX_RX_DATA_BUF_SIZE)
  1304. return -1;
  1305. rx_len = (u16) (rx_blocks * MWIFIEX_SDIO_BLOCK_SIZE);
  1306. mwifiex_dbg(adapter, INFO, "info: rx_len = %d\n", rx_len);
  1307. skb = mwifiex_alloc_dma_align_buf(rx_len, GFP_KERNEL);
  1308. if (!skb)
  1309. return -1;
  1310. skb_put(skb, rx_len);
  1311. if (mwifiex_sdio_card_to_host(adapter, &pkt_type, skb->data,
  1312. skb->len, adapter->ioport |
  1313. CMD_PORT_SLCT)) {
  1314. mwifiex_dbg(adapter, ERROR,
  1315. "%s: failed to card_to_host", __func__);
  1316. dev_kfree_skb_any(skb);
  1317. goto term_cmd;
  1318. }
  1319. if ((pkt_type != MWIFIEX_TYPE_CMD) &&
  1320. (pkt_type != MWIFIEX_TYPE_EVENT))
  1321. mwifiex_dbg(adapter, ERROR,
  1322. "%s:Received wrong packet on cmd port",
  1323. __func__);
  1324. mwifiex_decode_rx_packet(adapter, skb, pkt_type);
  1325. }
  1326. if (sdio_ireg & DN_LD_HOST_INT_STATUS) {
  1327. bitmap = (u32) card->mp_regs[reg->wr_bitmap_l];
  1328. bitmap |= ((u32) card->mp_regs[reg->wr_bitmap_u]) << 8;
  1329. if (card->supports_sdio_new_mode) {
  1330. bitmap |=
  1331. ((u32) card->mp_regs[reg->wr_bitmap_1l]) << 16;
  1332. bitmap |=
  1333. ((u32) card->mp_regs[reg->wr_bitmap_1u]) << 24;
  1334. }
  1335. card->mp_wr_bitmap = bitmap;
  1336. mwifiex_dbg(adapter, INTR,
  1337. "int: DNLD: wr_bitmap=0x%x\n",
  1338. card->mp_wr_bitmap);
  1339. if (adapter->data_sent &&
  1340. (card->mp_wr_bitmap & card->mp_data_port_mask)) {
  1341. mwifiex_dbg(adapter, INTR,
  1342. "info: <--- Tx DONE Interrupt --->\n");
  1343. adapter->data_sent = false;
  1344. }
  1345. }
  1346. /* As firmware will not generate download ready interrupt if the port
  1347. updated is command port only, cmd_sent should be done for any SDIO
  1348. interrupt. */
  1349. if (card->has_control_mask && adapter->cmd_sent) {
  1350. /* Check if firmware has attach buffer at command port and
  1351. update just that in wr_bit_map. */
  1352. card->mp_wr_bitmap |=
  1353. (u32) card->mp_regs[reg->wr_bitmap_l] & CTRL_PORT_MASK;
  1354. if (card->mp_wr_bitmap & CTRL_PORT_MASK)
  1355. adapter->cmd_sent = false;
  1356. }
  1357. mwifiex_dbg(adapter, INTR, "info: cmd_sent=%d data_sent=%d\n",
  1358. adapter->cmd_sent, adapter->data_sent);
  1359. if (sdio_ireg & UP_LD_HOST_INT_STATUS) {
  1360. bitmap = (u32) card->mp_regs[reg->rd_bitmap_l];
  1361. bitmap |= ((u32) card->mp_regs[reg->rd_bitmap_u]) << 8;
  1362. if (card->supports_sdio_new_mode) {
  1363. bitmap |=
  1364. ((u32) card->mp_regs[reg->rd_bitmap_1l]) << 16;
  1365. bitmap |=
  1366. ((u32) card->mp_regs[reg->rd_bitmap_1u]) << 24;
  1367. }
  1368. card->mp_rd_bitmap = bitmap;
  1369. mwifiex_dbg(adapter, INTR,
  1370. "int: UPLD: rd_bitmap=0x%x\n",
  1371. card->mp_rd_bitmap);
  1372. while (true) {
  1373. ret = mwifiex_get_rd_port(adapter, &port);
  1374. if (ret) {
  1375. mwifiex_dbg(adapter, INFO,
  1376. "info: no more rd_port available\n");
  1377. break;
  1378. }
  1379. len_reg_l = reg->rd_len_p0_l + (port << 1);
  1380. len_reg_u = reg->rd_len_p0_u + (port << 1);
  1381. rx_len = ((u16) card->mp_regs[len_reg_u]) << 8;
  1382. rx_len |= (u16) card->mp_regs[len_reg_l];
  1383. mwifiex_dbg(adapter, INFO,
  1384. "info: RX: port=%d rx_len=%u\n",
  1385. port, rx_len);
  1386. rx_blocks =
  1387. (rx_len + MWIFIEX_SDIO_BLOCK_SIZE -
  1388. 1) / MWIFIEX_SDIO_BLOCK_SIZE;
  1389. if (rx_len <= INTF_HEADER_LEN ||
  1390. (card->mpa_rx.enabled &&
  1391. ((rx_blocks * MWIFIEX_SDIO_BLOCK_SIZE) >
  1392. card->mpa_rx.buf_size))) {
  1393. mwifiex_dbg(adapter, ERROR,
  1394. "invalid rx_len=%d\n",
  1395. rx_len);
  1396. return -1;
  1397. }
  1398. rx_len = (u16) (rx_blocks * MWIFIEX_SDIO_BLOCK_SIZE);
  1399. mwifiex_dbg(adapter, INFO, "info: rx_len = %d\n",
  1400. rx_len);
  1401. if (mwifiex_sdio_card_to_host_mp_aggr(adapter, rx_len,
  1402. port)) {
  1403. mwifiex_dbg(adapter, ERROR,
  1404. "card_to_host_mpa failed: int status=%#x\n",
  1405. sdio_ireg);
  1406. goto term_cmd;
  1407. }
  1408. }
  1409. }
  1410. return 0;
  1411. term_cmd:
  1412. /* terminate cmd */
  1413. if (mwifiex_read_reg(adapter, CONFIGURATION_REG, &cr))
  1414. mwifiex_dbg(adapter, ERROR, "read CFG reg failed\n");
  1415. else
  1416. mwifiex_dbg(adapter, INFO,
  1417. "info: CFG reg val = %d\n", cr);
  1418. if (mwifiex_write_reg(adapter, CONFIGURATION_REG, (cr | 0x04)))
  1419. mwifiex_dbg(adapter, ERROR,
  1420. "write CFG reg failed\n");
  1421. else
  1422. mwifiex_dbg(adapter, INFO, "info: write success\n");
  1423. if (mwifiex_read_reg(adapter, CONFIGURATION_REG, &cr))
  1424. mwifiex_dbg(adapter, ERROR,
  1425. "read CFG reg failed\n");
  1426. else
  1427. mwifiex_dbg(adapter, INFO,
  1428. "info: CFG reg val =%x\n", cr);
  1429. return -1;
  1430. }
  1431. /*
  1432. * This function aggregates transmission buffers in driver and downloads
  1433. * the aggregated packet to card.
  1434. *
  1435. * The individual packets are aggregated by copying into an aggregation
  1436. * buffer and then downloaded to the card. Previous unsent packets in the
  1437. * aggregation buffer are pre-copied first before new packets are added.
  1438. * Aggregation is done till there is space left in the aggregation buffer,
  1439. * or till new packets are available.
  1440. *
  1441. * The function will only download the packet to the card when aggregation
  1442. * stops, otherwise it will just aggregate the packet in aggregation buffer
  1443. * and return.
  1444. */
  1445. static int mwifiex_host_to_card_mp_aggr(struct mwifiex_adapter *adapter,
  1446. u8 *payload, u32 pkt_len, u32 port,
  1447. u32 next_pkt_len)
  1448. {
  1449. struct sdio_mmc_card *card = adapter->card;
  1450. int ret = 0;
  1451. s32 f_send_aggr_buf = 0;
  1452. s32 f_send_cur_buf = 0;
  1453. s32 f_precopy_cur_buf = 0;
  1454. s32 f_postcopy_cur_buf = 0;
  1455. u32 mport;
  1456. int index;
  1457. if (!card->mpa_tx.enabled ||
  1458. (card->has_control_mask && (port == CTRL_PORT)) ||
  1459. (card->supports_sdio_new_mode && (port == CMD_PORT_SLCT))) {
  1460. mwifiex_dbg(adapter, WARN,
  1461. "info: %s: tx aggregation disabled\n",
  1462. __func__);
  1463. f_send_cur_buf = 1;
  1464. goto tx_curr_single;
  1465. }
  1466. if (next_pkt_len) {
  1467. /* More pkt in TX queue */
  1468. mwifiex_dbg(adapter, INFO,
  1469. "info: %s: more packets in queue.\n",
  1470. __func__);
  1471. if (MP_TX_AGGR_IN_PROGRESS(card)) {
  1472. if (MP_TX_AGGR_BUF_HAS_ROOM(card, pkt_len)) {
  1473. f_precopy_cur_buf = 1;
  1474. if (!(card->mp_wr_bitmap &
  1475. (1 << card->curr_wr_port)) ||
  1476. !MP_TX_AGGR_BUF_HAS_ROOM(
  1477. card, pkt_len + next_pkt_len))
  1478. f_send_aggr_buf = 1;
  1479. } else {
  1480. /* No room in Aggr buf, send it */
  1481. f_send_aggr_buf = 1;
  1482. if (!(card->mp_wr_bitmap &
  1483. (1 << card->curr_wr_port)))
  1484. f_send_cur_buf = 1;
  1485. else
  1486. f_postcopy_cur_buf = 1;
  1487. }
  1488. } else {
  1489. if (MP_TX_AGGR_BUF_HAS_ROOM(card, pkt_len) &&
  1490. (card->mp_wr_bitmap & (1 << card->curr_wr_port)))
  1491. f_precopy_cur_buf = 1;
  1492. else
  1493. f_send_cur_buf = 1;
  1494. }
  1495. } else {
  1496. /* Last pkt in TX queue */
  1497. mwifiex_dbg(adapter, INFO,
  1498. "info: %s: Last packet in Tx Queue.\n",
  1499. __func__);
  1500. if (MP_TX_AGGR_IN_PROGRESS(card)) {
  1501. /* some packs in Aggr buf already */
  1502. f_send_aggr_buf = 1;
  1503. if (MP_TX_AGGR_BUF_HAS_ROOM(card, pkt_len))
  1504. f_precopy_cur_buf = 1;
  1505. else
  1506. /* No room in Aggr buf, send it */
  1507. f_send_cur_buf = 1;
  1508. } else {
  1509. f_send_cur_buf = 1;
  1510. }
  1511. }
  1512. if (f_precopy_cur_buf) {
  1513. mwifiex_dbg(adapter, DATA,
  1514. "data: %s: precopy current buffer\n",
  1515. __func__);
  1516. MP_TX_AGGR_BUF_PUT(card, payload, pkt_len, port);
  1517. if (MP_TX_AGGR_PKT_LIMIT_REACHED(card) ||
  1518. mp_tx_aggr_port_limit_reached(card))
  1519. /* No more pkts allowed in Aggr buf, send it */
  1520. f_send_aggr_buf = 1;
  1521. }
  1522. if (f_send_aggr_buf) {
  1523. mwifiex_dbg(adapter, DATA,
  1524. "data: %s: send aggr buffer: %d %d\n",
  1525. __func__, card->mpa_tx.start_port,
  1526. card->mpa_tx.ports);
  1527. if (card->supports_sdio_new_mode) {
  1528. u32 port_count;
  1529. int i;
  1530. for (i = 0, port_count = 0; i < card->max_ports; i++)
  1531. if (card->mpa_tx.ports & BIT(i))
  1532. port_count++;
  1533. /* Writing data from "start_port + 0" to "start_port +
  1534. * port_count -1", so decrease the count by 1
  1535. */
  1536. port_count--;
  1537. mport = (adapter->ioport | SDIO_MPA_ADDR_BASE |
  1538. (port_count << 8)) + card->mpa_tx.start_port;
  1539. } else {
  1540. mport = (adapter->ioport | SDIO_MPA_ADDR_BASE |
  1541. (card->mpa_tx.ports << 4)) +
  1542. card->mpa_tx.start_port;
  1543. }
  1544. if (card->mpa_tx.pkt_cnt == 1)
  1545. mport = adapter->ioport + card->mpa_tx.start_port;
  1546. ret = mwifiex_write_data_to_card(adapter, card->mpa_tx.buf,
  1547. card->mpa_tx.buf_len, mport);
  1548. /* Save the last multi port tx aggreagation info to debug log */
  1549. index = adapter->dbg.last_sdio_mp_index;
  1550. index = (index + 1) % MWIFIEX_DBG_SDIO_MP_NUM;
  1551. adapter->dbg.last_sdio_mp_index = index;
  1552. adapter->dbg.last_mp_wr_ports[index] = mport;
  1553. adapter->dbg.last_mp_wr_bitmap[index] = card->mp_wr_bitmap;
  1554. adapter->dbg.last_mp_wr_len[index] = card->mpa_tx.buf_len;
  1555. adapter->dbg.last_mp_curr_wr_port[index] = card->curr_wr_port;
  1556. MP_TX_AGGR_BUF_RESET(card);
  1557. }
  1558. tx_curr_single:
  1559. if (f_send_cur_buf) {
  1560. mwifiex_dbg(adapter, DATA,
  1561. "data: %s: send current buffer %d\n",
  1562. __func__, port);
  1563. ret = mwifiex_write_data_to_card(adapter, payload, pkt_len,
  1564. adapter->ioport + port);
  1565. }
  1566. if (f_postcopy_cur_buf) {
  1567. mwifiex_dbg(adapter, DATA,
  1568. "data: %s: postcopy current buffer\n",
  1569. __func__);
  1570. MP_TX_AGGR_BUF_PUT(card, payload, pkt_len, port);
  1571. }
  1572. return ret;
  1573. }
  1574. /*
  1575. * This function downloads data from driver to card.
  1576. *
  1577. * Both commands and data packets are transferred to the card by this
  1578. * function.
  1579. *
  1580. * This function adds the SDIO specific header to the front of the buffer
  1581. * before transferring. The header contains the length of the packet and
  1582. * the type. The firmware handles the packets based upon this set type.
  1583. */
  1584. static int mwifiex_sdio_host_to_card(struct mwifiex_adapter *adapter,
  1585. u8 type, struct sk_buff *skb,
  1586. struct mwifiex_tx_param *tx_param)
  1587. {
  1588. struct sdio_mmc_card *card = adapter->card;
  1589. int ret;
  1590. u32 buf_block_len;
  1591. u32 blk_size;
  1592. u32 port = CTRL_PORT;
  1593. u8 *payload = (u8 *)skb->data;
  1594. u32 pkt_len = skb->len;
  1595. /* Allocate buffer and copy payload */
  1596. blk_size = MWIFIEX_SDIO_BLOCK_SIZE;
  1597. buf_block_len = (pkt_len + blk_size - 1) / blk_size;
  1598. put_unaligned_le16((u16)pkt_len, payload + 0);
  1599. put_unaligned_le16((u32)type, payload + 2);
  1600. /*
  1601. * This is SDIO specific header
  1602. * u16 length,
  1603. * u16 type (MWIFIEX_TYPE_DATA = 0, MWIFIEX_TYPE_CMD = 1,
  1604. * MWIFIEX_TYPE_EVENT = 3)
  1605. */
  1606. if (type == MWIFIEX_TYPE_DATA) {
  1607. ret = mwifiex_get_wr_port_data(adapter, &port);
  1608. if (ret) {
  1609. mwifiex_dbg(adapter, ERROR,
  1610. "%s: no wr_port available\n",
  1611. __func__);
  1612. return ret;
  1613. }
  1614. } else {
  1615. adapter->cmd_sent = true;
  1616. /* Type must be MWIFIEX_TYPE_CMD */
  1617. if (pkt_len <= INTF_HEADER_LEN ||
  1618. pkt_len > MWIFIEX_UPLD_SIZE)
  1619. mwifiex_dbg(adapter, ERROR,
  1620. "%s: payload=%p, nb=%d\n",
  1621. __func__, payload, pkt_len);
  1622. if (card->supports_sdio_new_mode)
  1623. port = CMD_PORT_SLCT;
  1624. }
  1625. /* Transfer data to card */
  1626. pkt_len = buf_block_len * blk_size;
  1627. if (tx_param)
  1628. ret = mwifiex_host_to_card_mp_aggr(adapter, payload, pkt_len,
  1629. port, tx_param->next_pkt_len
  1630. );
  1631. else
  1632. ret = mwifiex_host_to_card_mp_aggr(adapter, payload, pkt_len,
  1633. port, 0);
  1634. if (ret) {
  1635. if (type == MWIFIEX_TYPE_CMD)
  1636. adapter->cmd_sent = false;
  1637. if (type == MWIFIEX_TYPE_DATA) {
  1638. adapter->data_sent = false;
  1639. /* restore curr_wr_port in error cases */
  1640. card->curr_wr_port = port;
  1641. card->mp_wr_bitmap |= (u32)(1 << card->curr_wr_port);
  1642. }
  1643. } else {
  1644. if (type == MWIFIEX_TYPE_DATA) {
  1645. if (!(card->mp_wr_bitmap & (1 << card->curr_wr_port)))
  1646. adapter->data_sent = true;
  1647. else
  1648. adapter->data_sent = false;
  1649. }
  1650. }
  1651. return ret;
  1652. }
  1653. /*
  1654. * This function allocates the MPA Tx and Rx buffers.
  1655. */
  1656. static int mwifiex_alloc_sdio_mpa_buffers(struct mwifiex_adapter *adapter,
  1657. u32 mpa_tx_buf_size, u32 mpa_rx_buf_size)
  1658. {
  1659. struct sdio_mmc_card *card = adapter->card;
  1660. u32 rx_buf_size;
  1661. int ret = 0;
  1662. card->mpa_tx.buf = kzalloc(mpa_tx_buf_size, GFP_KERNEL);
  1663. if (!card->mpa_tx.buf) {
  1664. ret = -1;
  1665. goto error;
  1666. }
  1667. card->mpa_tx.buf_size = mpa_tx_buf_size;
  1668. rx_buf_size = max_t(u32, mpa_rx_buf_size,
  1669. (u32)SDIO_MAX_AGGR_BUF_SIZE);
  1670. card->mpa_rx.buf = kzalloc(rx_buf_size, GFP_KERNEL);
  1671. if (!card->mpa_rx.buf) {
  1672. ret = -1;
  1673. goto error;
  1674. }
  1675. card->mpa_rx.buf_size = rx_buf_size;
  1676. error:
  1677. if (ret) {
  1678. kfree(card->mpa_tx.buf);
  1679. kfree(card->mpa_rx.buf);
  1680. card->mpa_tx.buf_size = 0;
  1681. card->mpa_rx.buf_size = 0;
  1682. }
  1683. return ret;
  1684. }
  1685. /*
  1686. * This function unregisters the SDIO device.
  1687. *
  1688. * The SDIO IRQ is released, the function is disabled and driver
  1689. * data is set to null.
  1690. */
  1691. static void
  1692. mwifiex_unregister_dev(struct mwifiex_adapter *adapter)
  1693. {
  1694. struct sdio_mmc_card *card = adapter->card;
  1695. if (adapter->card) {
  1696. card->adapter = NULL;
  1697. sdio_claim_host(card->func);
  1698. sdio_disable_func(card->func);
  1699. sdio_release_host(card->func);
  1700. }
  1701. }
  1702. /*
  1703. * This function registers the SDIO device.
  1704. *
  1705. * SDIO IRQ is claimed, block size is set and driver data is initialized.
  1706. */
  1707. static int mwifiex_register_dev(struct mwifiex_adapter *adapter)
  1708. {
  1709. int ret;
  1710. struct sdio_mmc_card *card = adapter->card;
  1711. struct sdio_func *func = card->func;
  1712. /* save adapter pointer in card */
  1713. card->adapter = adapter;
  1714. adapter->tx_buf_size = card->tx_buf_size;
  1715. sdio_claim_host(func);
  1716. /* Set block size */
  1717. ret = sdio_set_block_size(card->func, MWIFIEX_SDIO_BLOCK_SIZE);
  1718. sdio_release_host(func);
  1719. if (ret) {
  1720. mwifiex_dbg(adapter, ERROR,
  1721. "cannot set SDIO block size\n");
  1722. return ret;
  1723. }
  1724. strcpy(adapter->fw_name, card->firmware);
  1725. if (card->fw_dump_enh) {
  1726. adapter->mem_type_mapping_tbl = generic_mem_type_map;
  1727. adapter->num_mem_types = 1;
  1728. } else {
  1729. adapter->mem_type_mapping_tbl = mem_type_mapping_tbl;
  1730. adapter->num_mem_types = ARRAY_SIZE(mem_type_mapping_tbl);
  1731. }
  1732. return 0;
  1733. }
  1734. /*
  1735. * This function initializes the SDIO driver.
  1736. *
  1737. * The following initializations steps are followed -
  1738. * - Read the Host interrupt status register to acknowledge
  1739. * the first interrupt got from bootloader
  1740. * - Disable host interrupt mask register
  1741. * - Get SDIO port
  1742. * - Initialize SDIO variables in card
  1743. * - Allocate MP registers
  1744. * - Allocate MPA Tx and Rx buffers
  1745. */
  1746. static int mwifiex_init_sdio(struct mwifiex_adapter *adapter)
  1747. {
  1748. struct sdio_mmc_card *card = adapter->card;
  1749. const struct mwifiex_sdio_card_reg *reg = card->reg;
  1750. int ret;
  1751. u8 sdio_ireg;
  1752. sdio_set_drvdata(card->func, card);
  1753. /*
  1754. * Read the host_int_status_reg for ACK the first interrupt got
  1755. * from the bootloader. If we don't do this we get a interrupt
  1756. * as soon as we register the irq.
  1757. */
  1758. mwifiex_read_reg(adapter, card->reg->host_int_status_reg, &sdio_ireg);
  1759. /* Get SDIO ioport */
  1760. mwifiex_init_sdio_ioport(adapter);
  1761. /* Initialize SDIO variables in card */
  1762. card->mp_rd_bitmap = 0;
  1763. card->mp_wr_bitmap = 0;
  1764. card->curr_rd_port = reg->start_rd_port;
  1765. card->curr_wr_port = reg->start_wr_port;
  1766. card->mp_data_port_mask = reg->data_port_mask;
  1767. card->mpa_tx.buf_len = 0;
  1768. card->mpa_tx.pkt_cnt = 0;
  1769. card->mpa_tx.start_port = 0;
  1770. card->mpa_tx.enabled = 1;
  1771. card->mpa_tx.pkt_aggr_limit = card->mp_agg_pkt_limit;
  1772. card->mpa_rx.buf_len = 0;
  1773. card->mpa_rx.pkt_cnt = 0;
  1774. card->mpa_rx.start_port = 0;
  1775. card->mpa_rx.enabled = 1;
  1776. card->mpa_rx.pkt_aggr_limit = card->mp_agg_pkt_limit;
  1777. /* Allocate buffers for SDIO MP-A */
  1778. card->mp_regs = kzalloc(reg->max_mp_regs, GFP_KERNEL);
  1779. if (!card->mp_regs)
  1780. return -ENOMEM;
  1781. /* Allocate skb pointer buffers */
  1782. card->mpa_rx.skb_arr = kzalloc((sizeof(void *)) *
  1783. card->mp_agg_pkt_limit, GFP_KERNEL);
  1784. if (!card->mpa_rx.skb_arr) {
  1785. kfree(card->mp_regs);
  1786. return -ENOMEM;
  1787. }
  1788. card->mpa_rx.len_arr = kzalloc(sizeof(*card->mpa_rx.len_arr) *
  1789. card->mp_agg_pkt_limit, GFP_KERNEL);
  1790. if (!card->mpa_rx.len_arr) {
  1791. kfree(card->mp_regs);
  1792. kfree(card->mpa_rx.skb_arr);
  1793. return -ENOMEM;
  1794. }
  1795. ret = mwifiex_alloc_sdio_mpa_buffers(adapter,
  1796. card->mp_tx_agg_buf_size,
  1797. card->mp_rx_agg_buf_size);
  1798. /* Allocate 32k MPA Tx/Rx buffers if 64k memory allocation fails */
  1799. if (ret && (card->mp_tx_agg_buf_size == MWIFIEX_MP_AGGR_BUF_SIZE_MAX ||
  1800. card->mp_rx_agg_buf_size == MWIFIEX_MP_AGGR_BUF_SIZE_MAX)) {
  1801. /* Disable rx single port aggregation */
  1802. adapter->host_disable_sdio_rx_aggr = true;
  1803. ret = mwifiex_alloc_sdio_mpa_buffers
  1804. (adapter, MWIFIEX_MP_AGGR_BUF_SIZE_32K,
  1805. MWIFIEX_MP_AGGR_BUF_SIZE_32K);
  1806. if (ret) {
  1807. /* Disable multi port aggregation */
  1808. card->mpa_tx.enabled = 0;
  1809. card->mpa_rx.enabled = 0;
  1810. }
  1811. }
  1812. adapter->auto_tdls = card->can_auto_tdls;
  1813. adapter->ext_scan = card->can_ext_scan;
  1814. return 0;
  1815. }
  1816. /*
  1817. * This function resets the MPA Tx and Rx buffers.
  1818. */
  1819. static void mwifiex_cleanup_mpa_buf(struct mwifiex_adapter *adapter)
  1820. {
  1821. struct sdio_mmc_card *card = adapter->card;
  1822. MP_TX_AGGR_BUF_RESET(card);
  1823. MP_RX_AGGR_BUF_RESET(card);
  1824. }
  1825. /*
  1826. * This function cleans up the allocated card buffers.
  1827. *
  1828. * The following are freed by this function -
  1829. * - MP registers
  1830. * - MPA Tx buffer
  1831. * - MPA Rx buffer
  1832. */
  1833. static void mwifiex_cleanup_sdio(struct mwifiex_adapter *adapter)
  1834. {
  1835. struct sdio_mmc_card *card = adapter->card;
  1836. cancel_work_sync(&card->work);
  1837. kfree(card->mp_regs);
  1838. kfree(card->mpa_rx.skb_arr);
  1839. kfree(card->mpa_rx.len_arr);
  1840. kfree(card->mpa_tx.buf);
  1841. kfree(card->mpa_rx.buf);
  1842. }
  1843. /*
  1844. * This function updates the MP end port in card.
  1845. */
  1846. static void
  1847. mwifiex_update_mp_end_port(struct mwifiex_adapter *adapter, u16 port)
  1848. {
  1849. struct sdio_mmc_card *card = adapter->card;
  1850. const struct mwifiex_sdio_card_reg *reg = card->reg;
  1851. int i;
  1852. card->mp_end_port = port;
  1853. card->mp_data_port_mask = reg->data_port_mask;
  1854. if (reg->start_wr_port) {
  1855. for (i = 1; i <= card->max_ports - card->mp_end_port; i++)
  1856. card->mp_data_port_mask &=
  1857. ~(1 << (card->max_ports - i));
  1858. }
  1859. card->curr_wr_port = reg->start_wr_port;
  1860. mwifiex_dbg(adapter, CMD,
  1861. "cmd: mp_end_port %d, data port mask 0x%x\n",
  1862. port, card->mp_data_port_mask);
  1863. }
  1864. static void mwifiex_sdio_card_reset_work(struct mwifiex_adapter *adapter)
  1865. {
  1866. struct sdio_mmc_card *card = adapter->card;
  1867. struct sdio_func *func = card->func;
  1868. int ret;
  1869. mwifiex_shutdown_sw(adapter);
  1870. /* power cycle the adapter */
  1871. sdio_claim_host(func);
  1872. mmc_hw_reset(func->card->host);
  1873. sdio_release_host(func);
  1874. /* Previous save_adapter won't be valid after this. We will cancel
  1875. * pending work requests.
  1876. */
  1877. clear_bit(MWIFIEX_IFACE_WORK_DEVICE_DUMP, &card->work_flags);
  1878. clear_bit(MWIFIEX_IFACE_WORK_CARD_RESET, &card->work_flags);
  1879. ret = mwifiex_reinit_sw(adapter);
  1880. if (ret)
  1881. dev_err(&func->dev, "reinit failed: %d\n", ret);
  1882. }
  1883. /* This function read/write firmware */
  1884. static enum
  1885. rdwr_status mwifiex_sdio_rdwr_firmware(struct mwifiex_adapter *adapter,
  1886. u8 doneflag)
  1887. {
  1888. struct sdio_mmc_card *card = adapter->card;
  1889. int ret, tries;
  1890. u8 ctrl_data = 0;
  1891. sdio_writeb(card->func, card->reg->fw_dump_host_ready,
  1892. card->reg->fw_dump_ctrl, &ret);
  1893. if (ret) {
  1894. mwifiex_dbg(adapter, ERROR, "SDIO Write ERR\n");
  1895. return RDWR_STATUS_FAILURE;
  1896. }
  1897. for (tries = 0; tries < MAX_POLL_TRIES; tries++) {
  1898. ctrl_data = sdio_readb(card->func, card->reg->fw_dump_ctrl,
  1899. &ret);
  1900. if (ret) {
  1901. mwifiex_dbg(adapter, ERROR, "SDIO read err\n");
  1902. return RDWR_STATUS_FAILURE;
  1903. }
  1904. if (ctrl_data == FW_DUMP_DONE)
  1905. break;
  1906. if (doneflag && ctrl_data == doneflag)
  1907. return RDWR_STATUS_DONE;
  1908. if (ctrl_data != card->reg->fw_dump_host_ready) {
  1909. mwifiex_dbg(adapter, WARN,
  1910. "The ctrl reg was changed, re-try again\n");
  1911. sdio_writeb(card->func, card->reg->fw_dump_host_ready,
  1912. card->reg->fw_dump_ctrl, &ret);
  1913. if (ret) {
  1914. mwifiex_dbg(adapter, ERROR, "SDIO write err\n");
  1915. return RDWR_STATUS_FAILURE;
  1916. }
  1917. }
  1918. usleep_range(100, 200);
  1919. }
  1920. if (ctrl_data == card->reg->fw_dump_host_ready) {
  1921. mwifiex_dbg(adapter, ERROR,
  1922. "Fail to pull ctrl_data\n");
  1923. return RDWR_STATUS_FAILURE;
  1924. }
  1925. return RDWR_STATUS_SUCCESS;
  1926. }
  1927. /* This function dump firmware memory to file */
  1928. static void mwifiex_sdio_fw_dump(struct mwifiex_adapter *adapter)
  1929. {
  1930. struct sdio_mmc_card *card = adapter->card;
  1931. int ret = 0;
  1932. unsigned int reg, reg_start, reg_end;
  1933. u8 *dbg_ptr, *end_ptr, dump_num, idx, i, read_reg, doneflag = 0;
  1934. enum rdwr_status stat;
  1935. u32 memory_size;
  1936. if (!card->can_dump_fw)
  1937. return;
  1938. for (idx = 0; idx < ARRAY_SIZE(mem_type_mapping_tbl); idx++) {
  1939. struct memory_type_mapping *entry = &mem_type_mapping_tbl[idx];
  1940. if (entry->mem_ptr) {
  1941. vfree(entry->mem_ptr);
  1942. entry->mem_ptr = NULL;
  1943. }
  1944. entry->mem_size = 0;
  1945. }
  1946. mwifiex_pm_wakeup_card(adapter);
  1947. sdio_claim_host(card->func);
  1948. mwifiex_dbg(adapter, MSG, "== mwifiex firmware dump start ==\n");
  1949. stat = mwifiex_sdio_rdwr_firmware(adapter, doneflag);
  1950. if (stat == RDWR_STATUS_FAILURE)
  1951. goto done;
  1952. reg = card->reg->fw_dump_start;
  1953. /* Read the number of the memories which will dump */
  1954. dump_num = sdio_readb(card->func, reg, &ret);
  1955. if (ret) {
  1956. mwifiex_dbg(adapter, ERROR, "SDIO read memory length err\n");
  1957. goto done;
  1958. }
  1959. /* Read the length of every memory which will dump */
  1960. for (idx = 0; idx < dump_num; idx++) {
  1961. struct memory_type_mapping *entry = &mem_type_mapping_tbl[idx];
  1962. stat = mwifiex_sdio_rdwr_firmware(adapter, doneflag);
  1963. if (stat == RDWR_STATUS_FAILURE)
  1964. goto done;
  1965. memory_size = 0;
  1966. reg = card->reg->fw_dump_start;
  1967. for (i = 0; i < 4; i++) {
  1968. read_reg = sdio_readb(card->func, reg, &ret);
  1969. if (ret) {
  1970. mwifiex_dbg(adapter, ERROR, "SDIO read err\n");
  1971. goto done;
  1972. }
  1973. memory_size |= (read_reg << i*8);
  1974. reg++;
  1975. }
  1976. if (memory_size == 0) {
  1977. mwifiex_dbg(adapter, DUMP, "Firmware dump Finished!\n");
  1978. ret = mwifiex_write_reg(adapter,
  1979. card->reg->fw_dump_ctrl,
  1980. FW_DUMP_READ_DONE);
  1981. if (ret) {
  1982. mwifiex_dbg(adapter, ERROR, "SDIO write err\n");
  1983. return;
  1984. }
  1985. break;
  1986. }
  1987. mwifiex_dbg(adapter, DUMP,
  1988. "%s_SIZE=0x%x\n", entry->mem_name, memory_size);
  1989. entry->mem_ptr = vmalloc(memory_size + 1);
  1990. entry->mem_size = memory_size;
  1991. if (!entry->mem_ptr) {
  1992. mwifiex_dbg(adapter, ERROR, "Vmalloc %s failed\n",
  1993. entry->mem_name);
  1994. goto done;
  1995. }
  1996. dbg_ptr = entry->mem_ptr;
  1997. end_ptr = dbg_ptr + memory_size;
  1998. doneflag = entry->done_flag;
  1999. mwifiex_dbg(adapter, DUMP,
  2000. "Start %s output, please wait...\n",
  2001. entry->mem_name);
  2002. do {
  2003. stat = mwifiex_sdio_rdwr_firmware(adapter, doneflag);
  2004. if (stat == RDWR_STATUS_FAILURE)
  2005. goto done;
  2006. reg_start = card->reg->fw_dump_start;
  2007. reg_end = card->reg->fw_dump_end;
  2008. for (reg = reg_start; reg <= reg_end; reg++) {
  2009. *dbg_ptr = sdio_readb(card->func, reg, &ret);
  2010. if (ret) {
  2011. mwifiex_dbg(adapter, ERROR,
  2012. "SDIO read err\n");
  2013. goto done;
  2014. }
  2015. if (dbg_ptr < end_ptr)
  2016. dbg_ptr++;
  2017. else
  2018. mwifiex_dbg(adapter, ERROR,
  2019. "Allocated buf not enough\n");
  2020. }
  2021. if (stat != RDWR_STATUS_DONE)
  2022. continue;
  2023. mwifiex_dbg(adapter, DUMP, "%s done: size=0x%tx\n",
  2024. entry->mem_name, dbg_ptr - entry->mem_ptr);
  2025. break;
  2026. } while (1);
  2027. }
  2028. mwifiex_dbg(adapter, MSG, "== mwifiex firmware dump end ==\n");
  2029. done:
  2030. sdio_release_host(card->func);
  2031. }
  2032. static void mwifiex_sdio_generic_fw_dump(struct mwifiex_adapter *adapter)
  2033. {
  2034. struct sdio_mmc_card *card = adapter->card;
  2035. struct memory_type_mapping *entry = &generic_mem_type_map[0];
  2036. unsigned int reg, reg_start, reg_end;
  2037. u8 start_flag = 0, done_flag = 0;
  2038. u8 *dbg_ptr, *end_ptr;
  2039. enum rdwr_status stat;
  2040. int ret = -1, tries;
  2041. if (!card->fw_dump_enh)
  2042. return;
  2043. if (entry->mem_ptr) {
  2044. vfree(entry->mem_ptr);
  2045. entry->mem_ptr = NULL;
  2046. }
  2047. entry->mem_size = 0;
  2048. mwifiex_pm_wakeup_card(adapter);
  2049. sdio_claim_host(card->func);
  2050. mwifiex_dbg(adapter, MSG, "== mwifiex firmware dump start ==\n");
  2051. stat = mwifiex_sdio_rdwr_firmware(adapter, done_flag);
  2052. if (stat == RDWR_STATUS_FAILURE)
  2053. goto done;
  2054. reg_start = card->reg->fw_dump_start;
  2055. reg_end = card->reg->fw_dump_end;
  2056. for (reg = reg_start; reg <= reg_end; reg++) {
  2057. for (tries = 0; tries < MAX_POLL_TRIES; tries++) {
  2058. start_flag = sdio_readb(card->func, reg, &ret);
  2059. if (ret) {
  2060. mwifiex_dbg(adapter, ERROR,
  2061. "SDIO read err\n");
  2062. goto done;
  2063. }
  2064. if (start_flag == 0)
  2065. break;
  2066. if (tries == MAX_POLL_TRIES) {
  2067. mwifiex_dbg(adapter, ERROR,
  2068. "FW not ready to dump\n");
  2069. ret = -1;
  2070. goto done;
  2071. }
  2072. }
  2073. usleep_range(100, 200);
  2074. }
  2075. entry->mem_ptr = vmalloc(0xf0000 + 1);
  2076. if (!entry->mem_ptr) {
  2077. ret = -1;
  2078. goto done;
  2079. }
  2080. dbg_ptr = entry->mem_ptr;
  2081. entry->mem_size = 0xf0000;
  2082. end_ptr = dbg_ptr + entry->mem_size;
  2083. done_flag = entry->done_flag;
  2084. mwifiex_dbg(adapter, DUMP,
  2085. "Start %s output, please wait...\n", entry->mem_name);
  2086. while (true) {
  2087. stat = mwifiex_sdio_rdwr_firmware(adapter, done_flag);
  2088. if (stat == RDWR_STATUS_FAILURE)
  2089. goto done;
  2090. for (reg = reg_start; reg <= reg_end; reg++) {
  2091. *dbg_ptr = sdio_readb(card->func, reg, &ret);
  2092. if (ret) {
  2093. mwifiex_dbg(adapter, ERROR,
  2094. "SDIO read err\n");
  2095. goto done;
  2096. }
  2097. dbg_ptr++;
  2098. if (dbg_ptr >= end_ptr) {
  2099. u8 *tmp_ptr;
  2100. tmp_ptr = vmalloc(entry->mem_size + 0x4000 + 1);
  2101. if (!tmp_ptr)
  2102. goto done;
  2103. memcpy(tmp_ptr, entry->mem_ptr,
  2104. entry->mem_size);
  2105. vfree(entry->mem_ptr);
  2106. entry->mem_ptr = tmp_ptr;
  2107. tmp_ptr = NULL;
  2108. dbg_ptr = entry->mem_ptr + entry->mem_size;
  2109. entry->mem_size += 0x4000;
  2110. end_ptr = entry->mem_ptr + entry->mem_size;
  2111. }
  2112. }
  2113. if (stat == RDWR_STATUS_DONE) {
  2114. entry->mem_size = dbg_ptr - entry->mem_ptr;
  2115. mwifiex_dbg(adapter, DUMP, "dump %s done size=0x%x\n",
  2116. entry->mem_name, entry->mem_size);
  2117. ret = 0;
  2118. break;
  2119. }
  2120. }
  2121. mwifiex_dbg(adapter, MSG, "== mwifiex firmware dump end ==\n");
  2122. done:
  2123. if (ret) {
  2124. mwifiex_dbg(adapter, ERROR, "firmware dump failed\n");
  2125. if (entry->mem_ptr) {
  2126. vfree(entry->mem_ptr);
  2127. entry->mem_ptr = NULL;
  2128. }
  2129. entry->mem_size = 0;
  2130. }
  2131. sdio_release_host(card->func);
  2132. }
  2133. static void mwifiex_sdio_device_dump_work(struct mwifiex_adapter *adapter)
  2134. {
  2135. struct sdio_mmc_card *card = adapter->card;
  2136. int drv_info_size;
  2137. void *drv_info;
  2138. drv_info_size = mwifiex_drv_info_dump(adapter, &drv_info);
  2139. if (card->fw_dump_enh)
  2140. mwifiex_sdio_generic_fw_dump(adapter);
  2141. else
  2142. mwifiex_sdio_fw_dump(adapter);
  2143. mwifiex_upload_device_dump(adapter, drv_info, drv_info_size);
  2144. }
  2145. static void mwifiex_sdio_work(struct work_struct *work)
  2146. {
  2147. struct sdio_mmc_card *card =
  2148. container_of(work, struct sdio_mmc_card, work);
  2149. if (test_and_clear_bit(MWIFIEX_IFACE_WORK_DEVICE_DUMP,
  2150. &card->work_flags))
  2151. mwifiex_sdio_device_dump_work(card->adapter);
  2152. if (test_and_clear_bit(MWIFIEX_IFACE_WORK_CARD_RESET,
  2153. &card->work_flags))
  2154. mwifiex_sdio_card_reset_work(card->adapter);
  2155. }
  2156. /* This function resets the card */
  2157. static void mwifiex_sdio_card_reset(struct mwifiex_adapter *adapter)
  2158. {
  2159. struct sdio_mmc_card *card = adapter->card;
  2160. if (test_bit(MWIFIEX_IFACE_WORK_CARD_RESET, &card->work_flags))
  2161. return;
  2162. set_bit(MWIFIEX_IFACE_WORK_CARD_RESET, &card->work_flags);
  2163. schedule_work(&card->work);
  2164. }
  2165. /* This function dumps FW information */
  2166. static void mwifiex_sdio_device_dump(struct mwifiex_adapter *adapter)
  2167. {
  2168. struct sdio_mmc_card *card = adapter->card;
  2169. if (test_bit(MWIFIEX_IFACE_WORK_DEVICE_DUMP, &card->work_flags))
  2170. return;
  2171. set_bit(MWIFIEX_IFACE_WORK_DEVICE_DUMP, &card->work_flags);
  2172. schedule_work(&card->work);
  2173. }
  2174. /* Function to dump SDIO function registers and SDIO scratch registers in case
  2175. * of FW crash
  2176. */
  2177. static int
  2178. mwifiex_sdio_reg_dump(struct mwifiex_adapter *adapter, char *drv_buf)
  2179. {
  2180. char *p = drv_buf;
  2181. struct sdio_mmc_card *cardp = adapter->card;
  2182. int ret = 0;
  2183. u8 count, func, data, index = 0, size = 0;
  2184. u8 reg, reg_start, reg_end;
  2185. char buf[256], *ptr;
  2186. if (!p)
  2187. return 0;
  2188. mwifiex_dbg(adapter, MSG, "SDIO register dump start\n");
  2189. mwifiex_pm_wakeup_card(adapter);
  2190. sdio_claim_host(cardp->func);
  2191. for (count = 0; count < 5; count++) {
  2192. memset(buf, 0, sizeof(buf));
  2193. ptr = buf;
  2194. switch (count) {
  2195. case 0:
  2196. /* Read the registers of SDIO function0 */
  2197. func = count;
  2198. reg_start = 0;
  2199. reg_end = 9;
  2200. break;
  2201. case 1:
  2202. /* Read the registers of SDIO function1 */
  2203. func = count;
  2204. reg_start = cardp->reg->func1_dump_reg_start;
  2205. reg_end = cardp->reg->func1_dump_reg_end;
  2206. break;
  2207. case 2:
  2208. index = 0;
  2209. func = 1;
  2210. reg_start = cardp->reg->func1_spec_reg_table[index++];
  2211. size = cardp->reg->func1_spec_reg_num;
  2212. reg_end = cardp->reg->func1_spec_reg_table[size-1];
  2213. break;
  2214. default:
  2215. /* Read the scratch registers of SDIO function1 */
  2216. if (count == 4)
  2217. mdelay(100);
  2218. func = 1;
  2219. reg_start = cardp->reg->func1_scratch_reg;
  2220. reg_end = reg_start + MWIFIEX_SDIO_SCRATCH_SIZE;
  2221. }
  2222. if (count != 2)
  2223. ptr += sprintf(ptr, "SDIO Func%d (%#x-%#x): ",
  2224. func, reg_start, reg_end);
  2225. else
  2226. ptr += sprintf(ptr, "SDIO Func%d: ", func);
  2227. for (reg = reg_start; reg <= reg_end;) {
  2228. if (func == 0)
  2229. data = sdio_f0_readb(cardp->func, reg, &ret);
  2230. else
  2231. data = sdio_readb(cardp->func, reg, &ret);
  2232. if (count == 2)
  2233. ptr += sprintf(ptr, "(%#x) ", reg);
  2234. if (!ret) {
  2235. ptr += sprintf(ptr, "%02x ", data);
  2236. } else {
  2237. ptr += sprintf(ptr, "ERR");
  2238. break;
  2239. }
  2240. if (count == 2 && reg < reg_end)
  2241. reg = cardp->reg->func1_spec_reg_table[index++];
  2242. else
  2243. reg++;
  2244. }
  2245. mwifiex_dbg(adapter, MSG, "%s\n", buf);
  2246. p += sprintf(p, "%s\n", buf);
  2247. }
  2248. sdio_release_host(cardp->func);
  2249. mwifiex_dbg(adapter, MSG, "SDIO register dump end\n");
  2250. return p - drv_buf;
  2251. }
  2252. /* sdio device/function initialization, code is extracted
  2253. * from init_if handler and register_dev handler.
  2254. */
  2255. static void mwifiex_sdio_up_dev(struct mwifiex_adapter *adapter)
  2256. {
  2257. struct sdio_mmc_card *card = adapter->card;
  2258. u8 sdio_ireg;
  2259. sdio_claim_host(card->func);
  2260. sdio_enable_func(card->func);
  2261. sdio_set_block_size(card->func, MWIFIEX_SDIO_BLOCK_SIZE);
  2262. sdio_release_host(card->func);
  2263. /* tx_buf_size might be changed to 3584 by firmware during
  2264. * data transfer, we will reset to default size.
  2265. */
  2266. adapter->tx_buf_size = card->tx_buf_size;
  2267. /* Read the host_int_status_reg for ACK the first interrupt got
  2268. * from the bootloader. If we don't do this we get a interrupt
  2269. * as soon as we register the irq.
  2270. */
  2271. mwifiex_read_reg(adapter, card->reg->host_int_status_reg, &sdio_ireg);
  2272. mwifiex_init_sdio_ioport(adapter);
  2273. }
  2274. static struct mwifiex_if_ops sdio_ops = {
  2275. .init_if = mwifiex_init_sdio,
  2276. .cleanup_if = mwifiex_cleanup_sdio,
  2277. .check_fw_status = mwifiex_check_fw_status,
  2278. .check_winner_status = mwifiex_check_winner_status,
  2279. .prog_fw = mwifiex_prog_fw_w_helper,
  2280. .register_dev = mwifiex_register_dev,
  2281. .unregister_dev = mwifiex_unregister_dev,
  2282. .enable_int = mwifiex_sdio_enable_host_int,
  2283. .disable_int = mwifiex_sdio_disable_host_int,
  2284. .process_int_status = mwifiex_process_int_status,
  2285. .host_to_card = mwifiex_sdio_host_to_card,
  2286. .wakeup = mwifiex_pm_wakeup_card,
  2287. .wakeup_complete = mwifiex_pm_wakeup_card_complete,
  2288. /* SDIO specific */
  2289. .update_mp_end_port = mwifiex_update_mp_end_port,
  2290. .cleanup_mpa_buf = mwifiex_cleanup_mpa_buf,
  2291. .cmdrsp_complete = mwifiex_sdio_cmdrsp_complete,
  2292. .event_complete = mwifiex_sdio_event_complete,
  2293. .dnld_fw = mwifiex_sdio_dnld_fw,
  2294. .card_reset = mwifiex_sdio_card_reset,
  2295. .reg_dump = mwifiex_sdio_reg_dump,
  2296. .device_dump = mwifiex_sdio_device_dump,
  2297. .deaggr_pkt = mwifiex_deaggr_sdio_pkt,
  2298. .up_dev = mwifiex_sdio_up_dev,
  2299. };
  2300. module_driver(mwifiex_sdio, sdio_register_driver, sdio_unregister_driver);
  2301. MODULE_AUTHOR("Marvell International Ltd.");
  2302. MODULE_DESCRIPTION("Marvell WiFi-Ex SDIO Driver version " SDIO_VERSION);
  2303. MODULE_VERSION(SDIO_VERSION);
  2304. MODULE_LICENSE("GPL v2");
  2305. MODULE_FIRMWARE(SD8786_DEFAULT_FW_NAME);
  2306. MODULE_FIRMWARE(SD8787_DEFAULT_FW_NAME);
  2307. MODULE_FIRMWARE(SD8797_DEFAULT_FW_NAME);
  2308. MODULE_FIRMWARE(SD8897_DEFAULT_FW_NAME);
  2309. MODULE_FIRMWARE(SD8887_DEFAULT_FW_NAME);
  2310. MODULE_FIRMWARE(SD8997_DEFAULT_FW_NAME);