wilc_spi.c 26 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276
  1. /* ////////////////////////////////////////////////////////////////////////// */
  2. /* */
  3. /* Copyright (c) Atmel Corporation. All rights reserved. */
  4. /* */
  5. /* Module Name: wilc_spi.c */
  6. /* */
  7. /* */
  8. /* //////////////////////////////////////////////////////////////////////////// */
  9. #include <linux/string.h>
  10. #include "wilc_wlan_if.h"
  11. #include "wilc_wlan.h"
  12. typedef struct {
  13. void *os_context;
  14. int (*spi_tx)(u8 *, u32);
  15. int (*spi_rx)(u8 *, u32);
  16. int (*spi_trx)(u8 *, u8 *, u32);
  17. int (*spi_max_speed)(void);
  18. wilc_debug_func dPrint;
  19. int crc_off;
  20. int nint;
  21. int has_thrpt_enh;
  22. } wilc_spi_t;
  23. static wilc_spi_t g_spi;
  24. static int spi_read(u32, u8 *, u32);
  25. static int spi_write(u32, u8 *, u32);
  26. /********************************************
  27. *
  28. * Crc7
  29. *
  30. ********************************************/
  31. static const u8 crc7_syndrome_table[256] = {
  32. 0x00, 0x09, 0x12, 0x1b, 0x24, 0x2d, 0x36, 0x3f,
  33. 0x48, 0x41, 0x5a, 0x53, 0x6c, 0x65, 0x7e, 0x77,
  34. 0x19, 0x10, 0x0b, 0x02, 0x3d, 0x34, 0x2f, 0x26,
  35. 0x51, 0x58, 0x43, 0x4a, 0x75, 0x7c, 0x67, 0x6e,
  36. 0x32, 0x3b, 0x20, 0x29, 0x16, 0x1f, 0x04, 0x0d,
  37. 0x7a, 0x73, 0x68, 0x61, 0x5e, 0x57, 0x4c, 0x45,
  38. 0x2b, 0x22, 0x39, 0x30, 0x0f, 0x06, 0x1d, 0x14,
  39. 0x63, 0x6a, 0x71, 0x78, 0x47, 0x4e, 0x55, 0x5c,
  40. 0x64, 0x6d, 0x76, 0x7f, 0x40, 0x49, 0x52, 0x5b,
  41. 0x2c, 0x25, 0x3e, 0x37, 0x08, 0x01, 0x1a, 0x13,
  42. 0x7d, 0x74, 0x6f, 0x66, 0x59, 0x50, 0x4b, 0x42,
  43. 0x35, 0x3c, 0x27, 0x2e, 0x11, 0x18, 0x03, 0x0a,
  44. 0x56, 0x5f, 0x44, 0x4d, 0x72, 0x7b, 0x60, 0x69,
  45. 0x1e, 0x17, 0x0c, 0x05, 0x3a, 0x33, 0x28, 0x21,
  46. 0x4f, 0x46, 0x5d, 0x54, 0x6b, 0x62, 0x79, 0x70,
  47. 0x07, 0x0e, 0x15, 0x1c, 0x23, 0x2a, 0x31, 0x38,
  48. 0x41, 0x48, 0x53, 0x5a, 0x65, 0x6c, 0x77, 0x7e,
  49. 0x09, 0x00, 0x1b, 0x12, 0x2d, 0x24, 0x3f, 0x36,
  50. 0x58, 0x51, 0x4a, 0x43, 0x7c, 0x75, 0x6e, 0x67,
  51. 0x10, 0x19, 0x02, 0x0b, 0x34, 0x3d, 0x26, 0x2f,
  52. 0x73, 0x7a, 0x61, 0x68, 0x57, 0x5e, 0x45, 0x4c,
  53. 0x3b, 0x32, 0x29, 0x20, 0x1f, 0x16, 0x0d, 0x04,
  54. 0x6a, 0x63, 0x78, 0x71, 0x4e, 0x47, 0x5c, 0x55,
  55. 0x22, 0x2b, 0x30, 0x39, 0x06, 0x0f, 0x14, 0x1d,
  56. 0x25, 0x2c, 0x37, 0x3e, 0x01, 0x08, 0x13, 0x1a,
  57. 0x6d, 0x64, 0x7f, 0x76, 0x49, 0x40, 0x5b, 0x52,
  58. 0x3c, 0x35, 0x2e, 0x27, 0x18, 0x11, 0x0a, 0x03,
  59. 0x74, 0x7d, 0x66, 0x6f, 0x50, 0x59, 0x42, 0x4b,
  60. 0x17, 0x1e, 0x05, 0x0c, 0x33, 0x3a, 0x21, 0x28,
  61. 0x5f, 0x56, 0x4d, 0x44, 0x7b, 0x72, 0x69, 0x60,
  62. 0x0e, 0x07, 0x1c, 0x15, 0x2a, 0x23, 0x38, 0x31,
  63. 0x46, 0x4f, 0x54, 0x5d, 0x62, 0x6b, 0x70, 0x79
  64. };
  65. static u8 crc7_byte(u8 crc, u8 data)
  66. {
  67. return crc7_syndrome_table[(crc << 1) ^ data];
  68. }
  69. static u8 crc7(u8 crc, const u8 *buffer, u32 len)
  70. {
  71. while (len--)
  72. crc = crc7_byte(crc, *buffer++);
  73. return crc;
  74. }
  75. /********************************************
  76. *
  77. * Spi protocol Function
  78. *
  79. ********************************************/
  80. #define CMD_DMA_WRITE 0xc1
  81. #define CMD_DMA_READ 0xc2
  82. #define CMD_INTERNAL_WRITE 0xc3
  83. #define CMD_INTERNAL_READ 0xc4
  84. #define CMD_TERMINATE 0xc5
  85. #define CMD_REPEAT 0xc6
  86. #define CMD_DMA_EXT_WRITE 0xc7
  87. #define CMD_DMA_EXT_READ 0xc8
  88. #define CMD_SINGLE_WRITE 0xc9
  89. #define CMD_SINGLE_READ 0xca
  90. #define CMD_RESET 0xcf
  91. #define N_OK 1
  92. #define N_FAIL 0
  93. #define N_RESET -1
  94. #define N_RETRY -2
  95. #define DATA_PKT_SZ_256 256
  96. #define DATA_PKT_SZ_512 512
  97. #define DATA_PKT_SZ_1K 1024
  98. #define DATA_PKT_SZ_4K (4 * 1024)
  99. #define DATA_PKT_SZ_8K (8 * 1024)
  100. #define DATA_PKT_SZ DATA_PKT_SZ_8K
  101. static int spi_cmd(u8 cmd, u32 adr, u32 data, u32 sz, u8 clockless)
  102. {
  103. u8 bc[9];
  104. int len = 5;
  105. int result = N_OK;
  106. bc[0] = cmd;
  107. switch (cmd) {
  108. case CMD_SINGLE_READ: /* single word (4 bytes) read */
  109. bc[1] = (u8)(adr >> 16);
  110. bc[2] = (u8)(adr >> 8);
  111. bc[3] = (u8)adr;
  112. len = 5;
  113. break;
  114. case CMD_INTERNAL_READ: /* internal register read */
  115. bc[1] = (u8)(adr >> 8);
  116. if (clockless)
  117. bc[1] |= BIT(7);
  118. bc[2] = (u8)adr;
  119. bc[3] = 0x00;
  120. len = 5;
  121. break;
  122. case CMD_TERMINATE: /* termination */
  123. bc[1] = 0x00;
  124. bc[2] = 0x00;
  125. bc[3] = 0x00;
  126. len = 5;
  127. break;
  128. case CMD_REPEAT: /* repeat */
  129. bc[1] = 0x00;
  130. bc[2] = 0x00;
  131. bc[3] = 0x00;
  132. len = 5;
  133. break;
  134. case CMD_RESET: /* reset */
  135. bc[1] = 0xff;
  136. bc[2] = 0xff;
  137. bc[3] = 0xff;
  138. len = 5;
  139. break;
  140. case CMD_DMA_WRITE: /* dma write */
  141. case CMD_DMA_READ: /* dma read */
  142. bc[1] = (u8)(adr >> 16);
  143. bc[2] = (u8)(adr >> 8);
  144. bc[3] = (u8)adr;
  145. bc[4] = (u8)(sz >> 8);
  146. bc[5] = (u8)(sz);
  147. len = 7;
  148. break;
  149. case CMD_DMA_EXT_WRITE: /* dma extended write */
  150. case CMD_DMA_EXT_READ: /* dma extended read */
  151. bc[1] = (u8)(adr >> 16);
  152. bc[2] = (u8)(adr >> 8);
  153. bc[3] = (u8)adr;
  154. bc[4] = (u8)(sz >> 16);
  155. bc[5] = (u8)(sz >> 8);
  156. bc[6] = (u8)(sz);
  157. len = 8;
  158. break;
  159. case CMD_INTERNAL_WRITE: /* internal register write */
  160. bc[1] = (u8)(adr >> 8);
  161. if (clockless)
  162. bc[1] |= BIT(7);
  163. bc[2] = (u8)(adr);
  164. bc[3] = (u8)(data >> 24);
  165. bc[4] = (u8)(data >> 16);
  166. bc[5] = (u8)(data >> 8);
  167. bc[6] = (u8)(data);
  168. len = 8;
  169. break;
  170. case CMD_SINGLE_WRITE: /* single word write */
  171. bc[1] = (u8)(adr >> 16);
  172. bc[2] = (u8)(adr >> 8);
  173. bc[3] = (u8)(adr);
  174. bc[4] = (u8)(data >> 24);
  175. bc[5] = (u8)(data >> 16);
  176. bc[6] = (u8)(data >> 8);
  177. bc[7] = (u8)(data);
  178. len = 9;
  179. break;
  180. default:
  181. result = N_FAIL;
  182. break;
  183. }
  184. if (result) {
  185. if (!g_spi.crc_off)
  186. bc[len - 1] = (crc7(0x7f, (const u8 *)&bc[0], len - 1)) << 1;
  187. else
  188. len -= 1;
  189. if (!g_spi.spi_tx(bc, len)) {
  190. PRINT_ER("[wilc spi]: Failed cmd write, bus error...\n");
  191. result = N_FAIL;
  192. }
  193. }
  194. return result;
  195. }
  196. static int spi_cmd_rsp(u8 cmd)
  197. {
  198. u8 rsp;
  199. int result = N_OK;
  200. /**
  201. * Command/Control response
  202. **/
  203. if ((cmd == CMD_RESET) ||
  204. (cmd == CMD_TERMINATE) ||
  205. (cmd == CMD_REPEAT)) {
  206. if (!g_spi.spi_rx(&rsp, 1)) {
  207. result = N_FAIL;
  208. goto _fail_;
  209. }
  210. }
  211. if (!g_spi.spi_rx(&rsp, 1)) {
  212. PRINT_ER("[wilc spi]: Failed cmd response read, bus error...\n");
  213. result = N_FAIL;
  214. goto _fail_;
  215. }
  216. if (rsp != cmd) {
  217. PRINT_ER("[wilc spi]: Failed cmd response, cmd (%02x), resp (%02x)\n", cmd, rsp);
  218. result = N_FAIL;
  219. goto _fail_;
  220. }
  221. /**
  222. * State response
  223. **/
  224. if (!g_spi.spi_rx(&rsp, 1)) {
  225. PRINT_ER("[wilc spi]: Failed cmd state read, bus error...\n");
  226. result = N_FAIL;
  227. goto _fail_;
  228. }
  229. if (rsp != 0x00) {
  230. PRINT_ER("[wilc spi]: Failed cmd state response state (%02x)\n", rsp);
  231. result = N_FAIL;
  232. }
  233. _fail_:
  234. return result;
  235. }
  236. static int spi_cmd_complete(u8 cmd, u32 adr, u8 *b, u32 sz, u8 clockless)
  237. {
  238. u8 wb[32], rb[32];
  239. u8 wix, rix;
  240. u32 len2;
  241. u8 rsp;
  242. int len = 0;
  243. int result = N_OK;
  244. wb[0] = cmd;
  245. switch (cmd) {
  246. case CMD_SINGLE_READ: /* single word (4 bytes) read */
  247. wb[1] = (u8)(adr >> 16);
  248. wb[2] = (u8)(adr >> 8);
  249. wb[3] = (u8)adr;
  250. len = 5;
  251. break;
  252. case CMD_INTERNAL_READ: /* internal register read */
  253. wb[1] = (u8)(adr >> 8);
  254. if (clockless == 1)
  255. wb[1] |= BIT(7);
  256. wb[2] = (u8)adr;
  257. wb[3] = 0x00;
  258. len = 5;
  259. break;
  260. case CMD_TERMINATE: /* termination */
  261. wb[1] = 0x00;
  262. wb[2] = 0x00;
  263. wb[3] = 0x00;
  264. len = 5;
  265. break;
  266. case CMD_REPEAT: /* repeat */
  267. wb[1] = 0x00;
  268. wb[2] = 0x00;
  269. wb[3] = 0x00;
  270. len = 5;
  271. break;
  272. case CMD_RESET: /* reset */
  273. wb[1] = 0xff;
  274. wb[2] = 0xff;
  275. wb[3] = 0xff;
  276. len = 5;
  277. break;
  278. case CMD_DMA_WRITE: /* dma write */
  279. case CMD_DMA_READ: /* dma read */
  280. wb[1] = (u8)(adr >> 16);
  281. wb[2] = (u8)(adr >> 8);
  282. wb[3] = (u8)adr;
  283. wb[4] = (u8)(sz >> 8);
  284. wb[5] = (u8)(sz);
  285. len = 7;
  286. break;
  287. case CMD_DMA_EXT_WRITE: /* dma extended write */
  288. case CMD_DMA_EXT_READ: /* dma extended read */
  289. wb[1] = (u8)(adr >> 16);
  290. wb[2] = (u8)(adr >> 8);
  291. wb[3] = (u8)adr;
  292. wb[4] = (u8)(sz >> 16);
  293. wb[5] = (u8)(sz >> 8);
  294. wb[6] = (u8)(sz);
  295. len = 8;
  296. break;
  297. case CMD_INTERNAL_WRITE: /* internal register write */
  298. wb[1] = (u8)(adr >> 8);
  299. if (clockless == 1)
  300. wb[1] |= BIT(7);
  301. wb[2] = (u8)(adr);
  302. wb[3] = b[3];
  303. wb[4] = b[2];
  304. wb[5] = b[1];
  305. wb[6] = b[0];
  306. len = 8;
  307. break;
  308. case CMD_SINGLE_WRITE: /* single word write */
  309. wb[1] = (u8)(adr >> 16);
  310. wb[2] = (u8)(adr >> 8);
  311. wb[3] = (u8)(adr);
  312. wb[4] = b[3];
  313. wb[5] = b[2];
  314. wb[6] = b[1];
  315. wb[7] = b[0];
  316. len = 9;
  317. break;
  318. default:
  319. result = N_FAIL;
  320. break;
  321. }
  322. if (result != N_OK) {
  323. return result;
  324. }
  325. if (!g_spi.crc_off)
  326. wb[len - 1] = (crc7(0x7f, (const u8 *)&wb[0], len - 1)) << 1;
  327. else
  328. len -= 1;
  329. #define NUM_SKIP_BYTES (1)
  330. #define NUM_RSP_BYTES (2)
  331. #define NUM_DATA_HDR_BYTES (1)
  332. #define NUM_DATA_BYTES (4)
  333. #define NUM_CRC_BYTES (2)
  334. #define NUM_DUMMY_BYTES (3)
  335. if ((cmd == CMD_RESET) ||
  336. (cmd == CMD_TERMINATE) ||
  337. (cmd == CMD_REPEAT)) {
  338. len2 = len + (NUM_SKIP_BYTES + NUM_RSP_BYTES + NUM_DUMMY_BYTES);
  339. } else if ((cmd == CMD_INTERNAL_READ) || (cmd == CMD_SINGLE_READ)) {
  340. if (!g_spi.crc_off) {
  341. len2 = len + (NUM_RSP_BYTES + NUM_DATA_HDR_BYTES + NUM_DATA_BYTES
  342. + NUM_CRC_BYTES + NUM_DUMMY_BYTES);
  343. } else {
  344. len2 = len + (NUM_RSP_BYTES + NUM_DATA_HDR_BYTES + NUM_DATA_BYTES
  345. + NUM_DUMMY_BYTES);
  346. }
  347. } else {
  348. len2 = len + (NUM_RSP_BYTES + NUM_DUMMY_BYTES);
  349. }
  350. #undef NUM_DUMMY_BYTES
  351. if (len2 > ARRAY_SIZE(wb)) {
  352. PRINT_ER("[wilc spi]: spi buffer size too small (%d) (%zu)\n",
  353. len2, ARRAY_SIZE(wb));
  354. result = N_FAIL;
  355. return result;
  356. }
  357. /* zero spi write buffers. */
  358. for (wix = len; wix < len2; wix++) {
  359. wb[wix] = 0;
  360. }
  361. rix = len;
  362. if (!g_spi.spi_trx(wb, rb, len2)) {
  363. PRINT_ER("[wilc spi]: Failed cmd write, bus error...\n");
  364. result = N_FAIL;
  365. return result;
  366. }
  367. /**
  368. * Command/Control response
  369. **/
  370. if ((cmd == CMD_RESET) ||
  371. (cmd == CMD_TERMINATE) ||
  372. (cmd == CMD_REPEAT)) {
  373. rix++; /* skip 1 byte */
  374. }
  375. /* do { */
  376. rsp = rb[rix++];
  377. /* if(rsp == cmd) break; */
  378. /* } while(&rptr[1] <= &rb[len2]); */
  379. if (rsp != cmd) {
  380. PRINT_ER("[wilc spi]: Failed cmd response, cmd (%02x)"
  381. ", resp (%02x)\n", cmd, rsp);
  382. result = N_FAIL;
  383. return result;
  384. }
  385. /**
  386. * State response
  387. **/
  388. rsp = rb[rix++];
  389. if (rsp != 0x00) {
  390. PRINT_ER("[wilc spi]: Failed cmd state response "
  391. "state (%02x)\n", rsp);
  392. result = N_FAIL;
  393. return result;
  394. }
  395. if ((cmd == CMD_INTERNAL_READ) || (cmd == CMD_SINGLE_READ)
  396. || (cmd == CMD_DMA_READ) || (cmd == CMD_DMA_EXT_READ)) {
  397. int retry;
  398. /* u16 crc1, crc2; */
  399. u8 crc[2];
  400. /**
  401. * Data Respnose header
  402. **/
  403. retry = 100;
  404. do {
  405. /* ensure there is room in buffer later to read data and crc */
  406. if (rix < len2) {
  407. rsp = rb[rix++];
  408. } else {
  409. retry = 0;
  410. break;
  411. }
  412. if (((rsp >> 4) & 0xf) == 0xf)
  413. break;
  414. } while (retry--);
  415. if (retry <= 0) {
  416. PRINT_ER("[wilc spi]: Error, data read "
  417. "response (%02x)\n", rsp);
  418. result = N_RESET;
  419. return result;
  420. }
  421. if ((cmd == CMD_INTERNAL_READ) || (cmd == CMD_SINGLE_READ)) {
  422. /**
  423. * Read bytes
  424. **/
  425. if ((rix + 3) < len2) {
  426. b[0] = rb[rix++];
  427. b[1] = rb[rix++];
  428. b[2] = rb[rix++];
  429. b[3] = rb[rix++];
  430. } else {
  431. PRINT_ER("[wilc spi]: buffer overrun when reading data.\n");
  432. result = N_FAIL;
  433. return result;
  434. }
  435. if (!g_spi.crc_off) {
  436. /**
  437. * Read Crc
  438. **/
  439. if ((rix + 1) < len2) {
  440. crc[0] = rb[rix++];
  441. crc[1] = rb[rix++];
  442. } else {
  443. PRINT_ER("[wilc spi]: buffer overrun when reading crc.\n");
  444. result = N_FAIL;
  445. return result;
  446. }
  447. }
  448. } else if ((cmd == CMD_DMA_READ) || (cmd == CMD_DMA_EXT_READ)) {
  449. int ix;
  450. /* some data may be read in response to dummy bytes. */
  451. for (ix = 0; (rix < len2) && (ix < sz); ) {
  452. b[ix++] = rb[rix++];
  453. }
  454. sz -= ix;
  455. if (sz > 0) {
  456. int nbytes;
  457. if (sz <= (DATA_PKT_SZ - ix))
  458. nbytes = sz;
  459. else
  460. nbytes = DATA_PKT_SZ - ix;
  461. /**
  462. * Read bytes
  463. **/
  464. if (!g_spi.spi_rx(&b[ix], nbytes)) {
  465. PRINT_ER("[wilc spi]: Failed data block read, bus error...\n");
  466. result = N_FAIL;
  467. goto _error_;
  468. }
  469. /**
  470. * Read Crc
  471. **/
  472. if (!g_spi.crc_off) {
  473. if (!g_spi.spi_rx(crc, 2)) {
  474. PRINT_ER("[wilc spi]: Failed data block crc read, bus error...\n");
  475. result = N_FAIL;
  476. goto _error_;
  477. }
  478. }
  479. ix += nbytes;
  480. sz -= nbytes;
  481. }
  482. /* if any data in left unread, then read the rest using normal DMA code.*/
  483. while (sz > 0) {
  484. int nbytes;
  485. if (sz <= DATA_PKT_SZ)
  486. nbytes = sz;
  487. else
  488. nbytes = DATA_PKT_SZ;
  489. /**
  490. * read data response only on the next DMA cycles not
  491. * the first DMA since data response header is already
  492. * handled above for the first DMA.
  493. **/
  494. /**
  495. * Data Respnose header
  496. **/
  497. retry = 10;
  498. do {
  499. if (!g_spi.spi_rx(&rsp, 1)) {
  500. PRINT_ER("[wilc spi]: Failed data response read, bus error...\n");
  501. result = N_FAIL;
  502. break;
  503. }
  504. if (((rsp >> 4) & 0xf) == 0xf)
  505. break;
  506. } while (retry--);
  507. if (result == N_FAIL)
  508. break;
  509. /**
  510. * Read bytes
  511. **/
  512. if (!g_spi.spi_rx(&b[ix], nbytes)) {
  513. PRINT_ER("[wilc spi]: Failed data block read, bus error...\n");
  514. result = N_FAIL;
  515. break;
  516. }
  517. /**
  518. * Read Crc
  519. **/
  520. if (!g_spi.crc_off) {
  521. if (!g_spi.spi_rx(crc, 2)) {
  522. PRINT_ER("[wilc spi]: Failed data block crc read, bus error...\n");
  523. result = N_FAIL;
  524. break;
  525. }
  526. }
  527. ix += nbytes;
  528. sz -= nbytes;
  529. }
  530. }
  531. }
  532. _error_:
  533. return result;
  534. }
  535. static int spi_data_read(u8 *b, u32 sz)
  536. {
  537. int retry, ix, nbytes;
  538. int result = N_OK;
  539. u8 crc[2];
  540. u8 rsp;
  541. /**
  542. * Data
  543. **/
  544. ix = 0;
  545. do {
  546. if (sz <= DATA_PKT_SZ)
  547. nbytes = sz;
  548. else
  549. nbytes = DATA_PKT_SZ;
  550. /**
  551. * Data Respnose header
  552. **/
  553. retry = 10;
  554. do {
  555. if (!g_spi.spi_rx(&rsp, 1)) {
  556. PRINT_ER("[wilc spi]: Failed data response read, bus error...\n");
  557. result = N_FAIL;
  558. break;
  559. }
  560. if (((rsp >> 4) & 0xf) == 0xf)
  561. break;
  562. } while (retry--);
  563. if (result == N_FAIL)
  564. break;
  565. if (retry <= 0) {
  566. PRINT_ER("[wilc spi]: Failed data response read...(%02x)\n", rsp);
  567. result = N_FAIL;
  568. break;
  569. }
  570. /**
  571. * Read bytes
  572. **/
  573. if (!g_spi.spi_rx(&b[ix], nbytes)) {
  574. PRINT_ER("[wilc spi]: Failed data block read, bus error...\n");
  575. result = N_FAIL;
  576. break;
  577. }
  578. /**
  579. * Read Crc
  580. **/
  581. if (!g_spi.crc_off) {
  582. if (!g_spi.spi_rx(crc, 2)) {
  583. PRINT_ER("[wilc spi]: Failed data block crc read, bus error...\n");
  584. result = N_FAIL;
  585. break;
  586. }
  587. }
  588. ix += nbytes;
  589. sz -= nbytes;
  590. } while (sz);
  591. return result;
  592. }
  593. static int spi_data_write(u8 *b, u32 sz)
  594. {
  595. int ix, nbytes;
  596. int result = 1;
  597. u8 cmd, order, crc[2] = {0};
  598. /* u8 rsp; */
  599. /**
  600. * Data
  601. **/
  602. ix = 0;
  603. do {
  604. if (sz <= DATA_PKT_SZ)
  605. nbytes = sz;
  606. else
  607. nbytes = DATA_PKT_SZ;
  608. /**
  609. * Write command
  610. **/
  611. cmd = 0xf0;
  612. if (ix == 0) {
  613. if (sz <= DATA_PKT_SZ)
  614. order = 0x3;
  615. else
  616. order = 0x1;
  617. } else {
  618. if (sz <= DATA_PKT_SZ)
  619. order = 0x3;
  620. else
  621. order = 0x2;
  622. }
  623. cmd |= order;
  624. if (!g_spi.spi_tx(&cmd, 1)) {
  625. PRINT_ER("[wilc spi]: Failed data block cmd write, bus error...\n");
  626. result = N_FAIL;
  627. break;
  628. }
  629. /**
  630. * Write data
  631. **/
  632. if (!g_spi.spi_tx(&b[ix], nbytes)) {
  633. PRINT_ER("[wilc spi]: Failed data block write, bus error...\n");
  634. result = N_FAIL;
  635. break;
  636. }
  637. /**
  638. * Write Crc
  639. **/
  640. if (!g_spi.crc_off) {
  641. if (!g_spi.spi_tx(crc, 2)) {
  642. PRINT_ER("[wilc spi]: Failed data block crc write, bus error...\n");
  643. result = N_FAIL;
  644. break;
  645. }
  646. }
  647. /**
  648. * No need to wait for response
  649. **/
  650. ix += nbytes;
  651. sz -= nbytes;
  652. } while (sz);
  653. return result;
  654. }
  655. /********************************************
  656. *
  657. * Spi Internal Read/Write Function
  658. *
  659. ********************************************/
  660. static int spi_internal_write(u32 adr, u32 dat)
  661. {
  662. int result;
  663. #ifdef BIG_ENDIAN
  664. dat = BYTE_SWAP(dat);
  665. #endif
  666. result = spi_cmd_complete(CMD_INTERNAL_WRITE, adr, (u8 *)&dat, 4, 0);
  667. if (result != N_OK) {
  668. PRINT_ER("[wilc spi]: Failed internal write cmd...\n");
  669. }
  670. return result;
  671. }
  672. static int spi_internal_read(u32 adr, u32 *data)
  673. {
  674. int result;
  675. result = spi_cmd_complete(CMD_INTERNAL_READ, adr, (u8 *)data, 4, 0);
  676. if (result != N_OK) {
  677. PRINT_ER("[wilc spi]: Failed internal read cmd...\n");
  678. return 0;
  679. }
  680. #ifdef BIG_ENDIAN
  681. *data = BYTE_SWAP(*data);
  682. #endif
  683. return 1;
  684. }
  685. /********************************************
  686. *
  687. * Spi interfaces
  688. *
  689. ********************************************/
  690. static int spi_write_reg(u32 addr, u32 data)
  691. {
  692. int result = N_OK;
  693. u8 cmd = CMD_SINGLE_WRITE;
  694. u8 clockless = 0;
  695. #ifdef BIG_ENDIAN
  696. data = BYTE_SWAP(data);
  697. #endif
  698. if (addr < 0x30) {
  699. /* Clockless register*/
  700. cmd = CMD_INTERNAL_WRITE;
  701. clockless = 1;
  702. }
  703. result = spi_cmd_complete(cmd, addr, (u8 *)&data, 4, clockless);
  704. if (result != N_OK) {
  705. PRINT_ER("[wilc spi]: Failed cmd, write reg (%08x)...\n", addr);
  706. }
  707. return result;
  708. }
  709. static int spi_write(u32 addr, u8 *buf, u32 size)
  710. {
  711. int result;
  712. u8 cmd = CMD_DMA_EXT_WRITE;
  713. /**
  714. * has to be greated than 4
  715. **/
  716. if (size <= 4)
  717. return 0;
  718. result = spi_cmd_complete(cmd, addr, NULL, size, 0);
  719. if (result != N_OK) {
  720. PRINT_ER("[wilc spi]: Failed cmd, write block (%08x)...\n", addr);
  721. return 0;
  722. }
  723. /**
  724. * Data
  725. **/
  726. result = spi_data_write(buf, size);
  727. if (result != N_OK) {
  728. PRINT_ER("[wilc spi]: Failed block data write...\n");
  729. }
  730. return 1;
  731. }
  732. static int spi_read_reg(u32 addr, u32 *data)
  733. {
  734. int result = N_OK;
  735. u8 cmd = CMD_SINGLE_READ;
  736. u8 clockless = 0;
  737. if (addr < 0x30) {
  738. /* PRINT_ER("***** read addr %d\n\n", addr); */
  739. /* Clockless register*/
  740. cmd = CMD_INTERNAL_READ;
  741. clockless = 1;
  742. }
  743. result = spi_cmd_complete(cmd, addr, (u8 *)data, 4, clockless);
  744. if (result != N_OK) {
  745. PRINT_ER("[wilc spi]: Failed cmd, read reg (%08x)...\n", addr);
  746. return 0;
  747. }
  748. #ifdef BIG_ENDIAN
  749. *data = BYTE_SWAP(*data);
  750. #endif
  751. return 1;
  752. }
  753. static int spi_read(u32 addr, u8 *buf, u32 size)
  754. {
  755. u8 cmd = CMD_DMA_EXT_READ;
  756. int result;
  757. if (size <= 4)
  758. return 0;
  759. result = spi_cmd_complete(cmd, addr, buf, size, 0);
  760. if (result != N_OK) {
  761. PRINT_ER("[wilc spi]: Failed cmd, read block (%08x)...\n", addr);
  762. return 0;
  763. }
  764. return 1;
  765. }
  766. /********************************************
  767. *
  768. * Bus interfaces
  769. *
  770. ********************************************/
  771. static int spi_clear_int(void)
  772. {
  773. u32 reg;
  774. if (!spi_read_reg(WILC_HOST_RX_CTRL_0, &reg)) {
  775. PRINT_ER("[wilc spi]: Failed read reg (%08x)...\n", WILC_HOST_RX_CTRL_0);
  776. return 0;
  777. }
  778. reg &= ~0x1;
  779. spi_write_reg(WILC_HOST_RX_CTRL_0, reg);
  780. return 1;
  781. }
  782. static int spi_deinit(void *pv)
  783. {
  784. /**
  785. * TODO:
  786. **/
  787. return 1;
  788. }
  789. static int spi_sync(void)
  790. {
  791. u32 reg;
  792. int ret;
  793. /**
  794. * interrupt pin mux select
  795. **/
  796. ret = spi_read_reg(WILC_PIN_MUX_0, &reg);
  797. if (!ret) {
  798. PRINT_ER("[wilc spi]: Failed read reg (%08x)...\n", WILC_PIN_MUX_0);
  799. return 0;
  800. }
  801. reg |= BIT(8);
  802. ret = spi_write_reg(WILC_PIN_MUX_0, reg);
  803. if (!ret) {
  804. PRINT_ER("[wilc spi]: Failed write reg (%08x)...\n", WILC_PIN_MUX_0);
  805. return 0;
  806. }
  807. /**
  808. * interrupt enable
  809. **/
  810. ret = spi_read_reg(WILC_INTR_ENABLE, &reg);
  811. if (!ret) {
  812. PRINT_ER("[wilc spi]: Failed read reg (%08x)...\n", WILC_INTR_ENABLE);
  813. return 0;
  814. }
  815. reg |= BIT(16);
  816. ret = spi_write_reg(WILC_INTR_ENABLE, reg);
  817. if (!ret) {
  818. PRINT_ER("[wilc spi]: Failed write reg (%08x)...\n", WILC_INTR_ENABLE);
  819. return 0;
  820. }
  821. return 1;
  822. }
  823. static int spi_init(wilc_wlan_inp_t *inp, wilc_debug_func func)
  824. {
  825. u32 reg;
  826. u32 chipid;
  827. static int isinit;
  828. if (isinit) {
  829. if (!spi_read_reg(0x1000, &chipid)) {
  830. PRINT_ER("[wilc spi]: Fail cmd read chip id...\n");
  831. return 0;
  832. }
  833. return 1;
  834. }
  835. memset(&g_spi, 0, sizeof(wilc_spi_t));
  836. g_spi.dPrint = func;
  837. g_spi.os_context = inp->os_context.os_private;
  838. if (inp->io_func.io_init) {
  839. if (!inp->io_func.io_init(g_spi.os_context)) {
  840. PRINT_ER("[wilc spi]: Failed io init bus...\n");
  841. return 0;
  842. }
  843. } else {
  844. return 0;
  845. }
  846. g_spi.spi_tx = inp->io_func.u.spi.spi_tx;
  847. g_spi.spi_rx = inp->io_func.u.spi.spi_rx;
  848. g_spi.spi_trx = inp->io_func.u.spi.spi_trx;
  849. g_spi.spi_max_speed = inp->io_func.u.spi.spi_max_speed;
  850. /**
  851. * configure protocol
  852. **/
  853. g_spi.crc_off = 0;
  854. /* TODO: We can remove the CRC trials if there is a definite way to reset */
  855. /* the SPI to it's initial value. */
  856. if (!spi_internal_read(WILC_SPI_PROTOCOL_OFFSET, &reg)) {
  857. /* Read failed. Try with CRC off. This might happen when module
  858. * is removed but chip isn't reset*/
  859. g_spi.crc_off = 1;
  860. PRINT_ER("[wilc spi]: Failed internal read protocol with CRC on, retyring with CRC off...\n");
  861. if (!spi_internal_read(WILC_SPI_PROTOCOL_OFFSET, &reg)) {
  862. /* Reaad failed with both CRC on and off, something went bad */
  863. PRINT_ER("[wilc spi]: Failed internal read protocol...\n");
  864. return 0;
  865. }
  866. }
  867. if (g_spi.crc_off == 0) {
  868. reg &= ~0xc; /* disable crc checking */
  869. reg &= ~0x70;
  870. reg |= (0x5 << 4);
  871. if (!spi_internal_write(WILC_SPI_PROTOCOL_OFFSET, reg)) {
  872. PRINT_ER("[wilc spi %d]: Failed internal write protocol reg...\n", __LINE__);
  873. return 0;
  874. }
  875. g_spi.crc_off = 1;
  876. }
  877. /**
  878. * make sure can read back chip id correctly
  879. **/
  880. if (!spi_read_reg(0x1000, &chipid)) {
  881. PRINT_ER("[wilc spi]: Fail cmd read chip id...\n");
  882. return 0;
  883. }
  884. /* PRINT_ER("[wilc spi]: chipid (%08x)\n", chipid); */
  885. g_spi.has_thrpt_enh = 1;
  886. isinit = 1;
  887. return 1;
  888. }
  889. static void spi_max_bus_speed(void)
  890. {
  891. g_spi.spi_max_speed();
  892. }
  893. static void spi_default_bus_speed(void)
  894. {
  895. }
  896. static int spi_read_size(u32 *size)
  897. {
  898. int ret;
  899. if (g_spi.has_thrpt_enh) {
  900. ret = spi_internal_read(0xe840 - WILC_SPI_REG_BASE, size);
  901. *size = *size & IRQ_DMA_WD_CNT_MASK;
  902. } else {
  903. u32 tmp;
  904. u32 byte_cnt;
  905. ret = spi_read_reg(WILC_VMM_TO_HOST_SIZE, &byte_cnt);
  906. if (!ret) {
  907. PRINT_ER("[wilc spi]: Failed read WILC_VMM_TO_HOST_SIZE ...\n");
  908. goto _fail_;
  909. }
  910. tmp = (byte_cnt >> 2) & IRQ_DMA_WD_CNT_MASK;
  911. *size = tmp;
  912. }
  913. _fail_:
  914. return ret;
  915. }
  916. static int spi_read_int(u32 *int_status)
  917. {
  918. int ret;
  919. if (g_spi.has_thrpt_enh) {
  920. ret = spi_internal_read(0xe840 - WILC_SPI_REG_BASE, int_status);
  921. } else {
  922. u32 tmp;
  923. u32 byte_cnt;
  924. ret = spi_read_reg(WILC_VMM_TO_HOST_SIZE, &byte_cnt);
  925. if (!ret) {
  926. PRINT_ER("[wilc spi]: Failed read WILC_VMM_TO_HOST_SIZE ...\n");
  927. goto _fail_;
  928. }
  929. tmp = (byte_cnt >> 2) & IRQ_DMA_WD_CNT_MASK;
  930. {
  931. int happended, j;
  932. j = 0;
  933. do {
  934. u32 irq_flags;
  935. happended = 0;
  936. spi_read_reg(0x1a90, &irq_flags);
  937. tmp |= ((irq_flags >> 27) << IRG_FLAGS_OFFSET);
  938. if (g_spi.nint > 5) {
  939. spi_read_reg(0x1a94, &irq_flags);
  940. tmp |= (((irq_flags >> 0) & 0x7) << (IRG_FLAGS_OFFSET + 5));
  941. }
  942. {
  943. u32 unkmown_mask;
  944. unkmown_mask = ~((1ul << g_spi.nint) - 1);
  945. if ((tmp >> IRG_FLAGS_OFFSET) & unkmown_mask) {
  946. PRINT_ER("[wilc spi]: Unexpected interrupt (2): j=%d, tmp=%x, mask=%x\n", j, tmp, unkmown_mask);
  947. happended = 1;
  948. }
  949. }
  950. j++;
  951. } while (happended);
  952. }
  953. *int_status = tmp;
  954. }
  955. _fail_:
  956. return ret;
  957. }
  958. static int spi_clear_int_ext(u32 val)
  959. {
  960. int ret;
  961. if (g_spi.has_thrpt_enh) {
  962. ret = spi_internal_write(0xe844 - WILC_SPI_REG_BASE, val);
  963. } else {
  964. u32 flags;
  965. flags = val & (BIT(MAX_NUM_INT) - 1);
  966. if (flags) {
  967. int i;
  968. ret = 1;
  969. for (i = 0; i < g_spi.nint; i++) {
  970. /* No matter what you write 1 or 0, it will clear interrupt. */
  971. if (flags & 1)
  972. ret = spi_write_reg(0x10c8 + i * 4, 1);
  973. if (!ret)
  974. break;
  975. flags >>= 1;
  976. }
  977. if (!ret) {
  978. PRINT_ER("[wilc spi]: Failed spi_write_reg, set reg %x ...\n", 0x10c8 + i * 4);
  979. goto _fail_;
  980. }
  981. for (i = g_spi.nint; i < MAX_NUM_INT; i++) {
  982. if (flags & 1)
  983. PRINT_ER("[wilc spi]: Unexpected interrupt cleared %d...\n", i);
  984. flags >>= 1;
  985. }
  986. }
  987. {
  988. u32 tbl_ctl;
  989. tbl_ctl = 0;
  990. /* select VMM table 0 */
  991. if ((val & SEL_VMM_TBL0) == SEL_VMM_TBL0)
  992. tbl_ctl |= BIT(0);
  993. /* select VMM table 1 */
  994. if ((val & SEL_VMM_TBL1) == SEL_VMM_TBL1)
  995. tbl_ctl |= BIT(1);
  996. ret = spi_write_reg(WILC_VMM_TBL_CTL, tbl_ctl);
  997. if (!ret) {
  998. PRINT_ER("[wilc spi]: fail write reg vmm_tbl_ctl...\n");
  999. goto _fail_;
  1000. }
  1001. if ((val & EN_VMM) == EN_VMM) {
  1002. /**
  1003. * enable vmm transfer.
  1004. **/
  1005. ret = spi_write_reg(WILC_VMM_CORE_CTL, 1);
  1006. if (!ret) {
  1007. PRINT_ER("[wilc spi]: fail write reg vmm_core_ctl...\n");
  1008. goto _fail_;
  1009. }
  1010. }
  1011. }
  1012. }
  1013. _fail_:
  1014. return ret;
  1015. }
  1016. static int spi_sync_ext(int nint /* how mant interrupts to enable. */)
  1017. {
  1018. u32 reg;
  1019. int ret, i;
  1020. if (nint > MAX_NUM_INT) {
  1021. PRINT_ER("[wilc spi]: Too many interupts (%d)...\n", nint);
  1022. return 0;
  1023. }
  1024. g_spi.nint = nint;
  1025. /**
  1026. * interrupt pin mux select
  1027. **/
  1028. ret = spi_read_reg(WILC_PIN_MUX_0, &reg);
  1029. if (!ret) {
  1030. PRINT_ER("[wilc spi]: Failed read reg (%08x)...\n", WILC_PIN_MUX_0);
  1031. return 0;
  1032. }
  1033. reg |= BIT(8);
  1034. ret = spi_write_reg(WILC_PIN_MUX_0, reg);
  1035. if (!ret) {
  1036. PRINT_ER("[wilc spi]: Failed write reg (%08x)...\n", WILC_PIN_MUX_0);
  1037. return 0;
  1038. }
  1039. /**
  1040. * interrupt enable
  1041. **/
  1042. ret = spi_read_reg(WILC_INTR_ENABLE, &reg);
  1043. if (!ret) {
  1044. PRINT_ER("[wilc spi]: Failed read reg (%08x)...\n", WILC_INTR_ENABLE);
  1045. return 0;
  1046. }
  1047. for (i = 0; (i < 5) && (nint > 0); i++, nint--) {
  1048. reg |= (BIT((27 + i)));
  1049. }
  1050. ret = spi_write_reg(WILC_INTR_ENABLE, reg);
  1051. if (!ret) {
  1052. PRINT_ER("[wilc spi]: Failed write reg (%08x)...\n", WILC_INTR_ENABLE);
  1053. return 0;
  1054. }
  1055. if (nint) {
  1056. ret = spi_read_reg(WILC_INTR2_ENABLE, &reg);
  1057. if (!ret) {
  1058. PRINT_ER("[wilc spi]: Failed read reg (%08x)...\n", WILC_INTR2_ENABLE);
  1059. return 0;
  1060. }
  1061. for (i = 0; (i < 3) && (nint > 0); i++, nint--) {
  1062. reg |= BIT(i);
  1063. }
  1064. ret = spi_read_reg(WILC_INTR2_ENABLE, &reg);
  1065. if (!ret) {
  1066. PRINT_ER("[wilc spi]: Failed write reg (%08x)...\n", WILC_INTR2_ENABLE);
  1067. return 0;
  1068. }
  1069. }
  1070. return 1;
  1071. }
  1072. /********************************************
  1073. *
  1074. * Global spi HIF function table
  1075. *
  1076. ********************************************/
  1077. wilc_hif_func_t hif_spi = {
  1078. spi_init,
  1079. spi_deinit,
  1080. spi_read_reg,
  1081. spi_write_reg,
  1082. spi_read,
  1083. spi_write,
  1084. spi_sync,
  1085. spi_clear_int,
  1086. spi_read_int,
  1087. spi_clear_int_ext,
  1088. spi_read_size,
  1089. spi_write,
  1090. spi_read,
  1091. spi_sync_ext,
  1092. spi_max_bus_speed,
  1093. spi_default_bus_speed,
  1094. };