sdio.h 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378
  1. /* SPDX-License-Identifier: GPL-2.0-only */
  2. /*
  3. * NXP Wireless LAN device driver: SDIO specific definitions
  4. *
  5. * Copyright 2011-2020 NXP
  6. */
  7. #ifndef _MWIFIEX_SDIO_H
  8. #define _MWIFIEX_SDIO_H
  9. #include <linux/completion.h>
  10. #include <linux/mmc/sdio.h>
  11. #include <linux/mmc/sdio_ids.h>
  12. #include <linux/mmc/sdio_func.h>
  13. #include <linux/mmc/card.h>
  14. #include <linux/mmc/host.h>
  15. #include "main.h"
  16. #define SD8786_DEFAULT_FW_NAME "mrvl/sd8786_uapsta.bin"
  17. #define SD8787_DEFAULT_FW_NAME "mrvl/sd8787_uapsta.bin"
  18. #define SD8797_DEFAULT_FW_NAME "mrvl/sd8797_uapsta.bin"
  19. #define SD8897_DEFAULT_FW_NAME "mrvl/sd8897_uapsta.bin"
  20. #define SD8887_DEFAULT_FW_NAME "mrvl/sd8887_uapsta.bin"
  21. #define SD8801_DEFAULT_FW_NAME "mrvl/sd8801_uapsta.bin"
  22. #define SD8977_DEFAULT_FW_NAME "mrvl/sdsd8977_combo_v2.bin"
  23. #define SD8987_DEFAULT_FW_NAME "mrvl/sd8987_uapsta.bin"
  24. #define SD8997_DEFAULT_FW_NAME "mrvl/sdsd8997_combo_v4.bin"
  25. #define SD8997_SDIOUART_FW_NAME "mrvl/sdiouart8997_combo_v4.bin"
  26. #define BLOCK_MODE 1
  27. #define BYTE_MODE 0
  28. #define MWIFIEX_SDIO_IO_PORT_MASK 0xfffff
  29. #define MWIFIEX_SDIO_BYTE_MODE_MASK 0x80000000
  30. #define MWIFIEX_MAX_FUNC2_REG_NUM 13
  31. #define MWIFIEX_SDIO_SCRATCH_SIZE 10
  32. #define SDIO_MPA_ADDR_BASE 0x1000
  33. #define CTRL_PORT 0
  34. #define CTRL_PORT_MASK 0x0001
  35. #define CMD_PORT_UPLD_INT_MASK (0x1U<<6)
  36. #define CMD_PORT_DNLD_INT_MASK (0x1U<<7)
  37. #define HOST_TERM_CMD53 (0x1U << 2)
  38. #define REG_PORT 0
  39. #define MEM_PORT 0x10000
  40. #define CMD53_NEW_MODE (0x1U << 0)
  41. #define CMD_PORT_RD_LEN_EN (0x1U << 2)
  42. #define CMD_PORT_AUTO_EN (0x1U << 0)
  43. #define CMD_PORT_SLCT 0x8000
  44. #define UP_LD_CMD_PORT_HOST_INT_STATUS (0x40U)
  45. #define DN_LD_CMD_PORT_HOST_INT_STATUS (0x80U)
  46. #define MWIFIEX_MP_AGGR_BUF_SIZE_16K (16384)
  47. #define MWIFIEX_MP_AGGR_BUF_SIZE_32K (32768)
  48. /* we leave one block of 256 bytes for DMA alignment*/
  49. #define MWIFIEX_MP_AGGR_BUF_SIZE_MAX (65280)
  50. /* Misc. Config Register : Auto Re-enable interrupts */
  51. #define AUTO_RE_ENABLE_INT BIT(4)
  52. /* Host Control Registers : Configuration */
  53. #define CONFIGURATION_REG 0x00
  54. /* Host Control Registers : Host power up */
  55. #define HOST_POWER_UP (0x1U << 1)
  56. /* Host Control Registers : Upload host interrupt mask */
  57. #define UP_LD_HOST_INT_MASK (0x1U)
  58. /* Host Control Registers : Download host interrupt mask */
  59. #define DN_LD_HOST_INT_MASK (0x2U)
  60. /* Host Control Registers : Upload host interrupt status */
  61. #define UP_LD_HOST_INT_STATUS (0x1U)
  62. /* Host Control Registers : Download host interrupt status */
  63. #define DN_LD_HOST_INT_STATUS (0x2U)
  64. /* Host Control Registers : Host interrupt status */
  65. #define CARD_INT_STATUS_REG 0x28
  66. /* Card Control Registers : Card I/O ready */
  67. #define CARD_IO_READY (0x1U << 3)
  68. /* Card Control Registers : Download card ready */
  69. #define DN_LD_CARD_RDY (0x1U << 0)
  70. /* Max retry number of CMD53 write */
  71. #define MAX_WRITE_IOMEM_RETRY 2
  72. /* SDIO Tx aggregation in progress ? */
  73. #define MP_TX_AGGR_IN_PROGRESS(a) (a->mpa_tx.pkt_cnt > 0)
  74. /* SDIO Tx aggregation buffer room for next packet ? */
  75. #define MP_TX_AGGR_BUF_HAS_ROOM(a, len) ((a->mpa_tx.buf_len+len) \
  76. <= a->mpa_tx.buf_size)
  77. /* Copy current packet (SDIO Tx aggregation buffer) to SDIO buffer */
  78. #define MP_TX_AGGR_BUF_PUT(a, payload, pkt_len, port) do { \
  79. memmove(&a->mpa_tx.buf[a->mpa_tx.buf_len], \
  80. payload, pkt_len); \
  81. a->mpa_tx.buf_len += pkt_len; \
  82. if (!a->mpa_tx.pkt_cnt) \
  83. a->mpa_tx.start_port = port; \
  84. if (a->mpa_tx.start_port <= port) \
  85. a->mpa_tx.ports |= (1<<(a->mpa_tx.pkt_cnt)); \
  86. else \
  87. a->mpa_tx.ports |= (1<<(a->mpa_tx.pkt_cnt+1+ \
  88. (a->max_ports - \
  89. a->mp_end_port))); \
  90. a->mpa_tx.pkt_cnt++; \
  91. } while (0)
  92. /* SDIO Tx aggregation limit ? */
  93. #define MP_TX_AGGR_PKT_LIMIT_REACHED(a) \
  94. (a->mpa_tx.pkt_cnt == a->mpa_tx.pkt_aggr_limit)
  95. /* Reset SDIO Tx aggregation buffer parameters */
  96. #define MP_TX_AGGR_BUF_RESET(a) do { \
  97. a->mpa_tx.pkt_cnt = 0; \
  98. a->mpa_tx.buf_len = 0; \
  99. a->mpa_tx.ports = 0; \
  100. a->mpa_tx.start_port = 0; \
  101. } while (0)
  102. /* SDIO Rx aggregation limit ? */
  103. #define MP_RX_AGGR_PKT_LIMIT_REACHED(a) \
  104. (a->mpa_rx.pkt_cnt == a->mpa_rx.pkt_aggr_limit)
  105. /* SDIO Rx aggregation in progress ? */
  106. #define MP_RX_AGGR_IN_PROGRESS(a) (a->mpa_rx.pkt_cnt > 0)
  107. /* SDIO Rx aggregation buffer room for next packet ? */
  108. #define MP_RX_AGGR_BUF_HAS_ROOM(a, rx_len) \
  109. ((a->mpa_rx.buf_len+rx_len) <= a->mpa_rx.buf_size)
  110. /* Reset SDIO Rx aggregation buffer parameters */
  111. #define MP_RX_AGGR_BUF_RESET(a) do { \
  112. a->mpa_rx.pkt_cnt = 0; \
  113. a->mpa_rx.buf_len = 0; \
  114. a->mpa_rx.ports = 0; \
  115. a->mpa_rx.start_port = 0; \
  116. } while (0)
  117. /* data structure for SDIO MPA TX */
  118. struct mwifiex_sdio_mpa_tx {
  119. /* multiport tx aggregation buffer pointer */
  120. u8 *buf;
  121. u32 buf_len;
  122. u32 pkt_cnt;
  123. u32 ports;
  124. u16 start_port;
  125. u8 enabled;
  126. u32 buf_size;
  127. u32 pkt_aggr_limit;
  128. };
  129. struct mwifiex_sdio_mpa_rx {
  130. u8 *buf;
  131. u32 buf_len;
  132. u32 pkt_cnt;
  133. u32 ports;
  134. u16 start_port;
  135. struct sk_buff **skb_arr;
  136. u32 *len_arr;
  137. u8 enabled;
  138. u32 buf_size;
  139. u32 pkt_aggr_limit;
  140. };
  141. int mwifiex_bus_register(void);
  142. void mwifiex_bus_unregister(void);
  143. struct mwifiex_sdio_card_reg {
  144. u8 start_rd_port;
  145. u8 start_wr_port;
  146. u8 base_0_reg;
  147. u8 base_1_reg;
  148. u8 poll_reg;
  149. u8 host_int_enable;
  150. u8 host_int_rsr_reg;
  151. u8 host_int_status_reg;
  152. u8 host_int_mask_reg;
  153. u8 host_strap_reg;
  154. u8 host_strap_mask;
  155. u8 host_strap_value;
  156. u8 status_reg_0;
  157. u8 status_reg_1;
  158. u8 sdio_int_mask;
  159. u32 data_port_mask;
  160. u8 io_port_0_reg;
  161. u8 io_port_1_reg;
  162. u8 io_port_2_reg;
  163. u8 max_mp_regs;
  164. u8 rd_bitmap_l;
  165. u8 rd_bitmap_u;
  166. u8 rd_bitmap_1l;
  167. u8 rd_bitmap_1u;
  168. u8 wr_bitmap_l;
  169. u8 wr_bitmap_u;
  170. u8 wr_bitmap_1l;
  171. u8 wr_bitmap_1u;
  172. u8 rd_len_p0_l;
  173. u8 rd_len_p0_u;
  174. u8 card_misc_cfg_reg;
  175. u8 card_cfg_2_1_reg;
  176. u8 cmd_rd_len_0;
  177. u8 cmd_rd_len_1;
  178. u8 cmd_rd_len_2;
  179. u8 cmd_rd_len_3;
  180. u8 cmd_cfg_0;
  181. u8 cmd_cfg_1;
  182. u8 cmd_cfg_2;
  183. u8 cmd_cfg_3;
  184. u8 fw_dump_host_ready;
  185. u8 fw_dump_ctrl;
  186. u8 fw_dump_start;
  187. u8 fw_dump_end;
  188. u8 func1_dump_reg_start;
  189. u8 func1_dump_reg_end;
  190. u8 func1_scratch_reg;
  191. u8 func1_spec_reg_num;
  192. u8 func1_spec_reg_table[MWIFIEX_MAX_FUNC2_REG_NUM];
  193. };
  194. struct sdio_mmc_card {
  195. struct sdio_func *func;
  196. struct mwifiex_adapter *adapter;
  197. struct completion fw_done;
  198. const char *firmware;
  199. const char *firmware_sdiouart;
  200. const struct mwifiex_sdio_card_reg *reg;
  201. u8 max_ports;
  202. u8 mp_agg_pkt_limit;
  203. u16 tx_buf_size;
  204. u32 mp_tx_agg_buf_size;
  205. u32 mp_rx_agg_buf_size;
  206. u32 mp_rd_bitmap;
  207. u32 mp_wr_bitmap;
  208. u16 mp_end_port;
  209. u32 mp_data_port_mask;
  210. u8 curr_rd_port;
  211. u8 curr_wr_port;
  212. u8 *mp_regs;
  213. bool supports_sdio_new_mode;
  214. bool has_control_mask;
  215. bool can_dump_fw;
  216. bool fw_dump_enh;
  217. bool can_auto_tdls;
  218. bool can_ext_scan;
  219. struct mwifiex_sdio_mpa_tx mpa_tx;
  220. struct mwifiex_sdio_mpa_rx mpa_rx;
  221. struct work_struct work;
  222. unsigned long work_flags;
  223. };
  224. struct mwifiex_sdio_device {
  225. const char *firmware;
  226. const char *firmware_sdiouart;
  227. const struct mwifiex_sdio_card_reg *reg;
  228. u8 max_ports;
  229. u8 mp_agg_pkt_limit;
  230. u16 tx_buf_size;
  231. u32 mp_tx_agg_buf_size;
  232. u32 mp_rx_agg_buf_size;
  233. bool supports_sdio_new_mode;
  234. bool has_control_mask;
  235. bool can_dump_fw;
  236. bool fw_dump_enh;
  237. bool can_auto_tdls;
  238. bool can_ext_scan;
  239. };
  240. /*
  241. * .cmdrsp_complete handler
  242. */
  243. static inline int mwifiex_sdio_cmdrsp_complete(struct mwifiex_adapter *adapter,
  244. struct sk_buff *skb)
  245. {
  246. dev_kfree_skb_any(skb);
  247. return 0;
  248. }
  249. /*
  250. * .event_complete handler
  251. */
  252. static inline int mwifiex_sdio_event_complete(struct mwifiex_adapter *adapter,
  253. struct sk_buff *skb)
  254. {
  255. dev_kfree_skb_any(skb);
  256. return 0;
  257. }
  258. static inline bool
  259. mp_rx_aggr_port_limit_reached(struct sdio_mmc_card *card)
  260. {
  261. u8 tmp;
  262. if (card->curr_rd_port < card->mpa_rx.start_port) {
  263. if (card->supports_sdio_new_mode)
  264. tmp = card->mp_end_port >> 1;
  265. else
  266. tmp = card->mp_agg_pkt_limit;
  267. if (((card->max_ports - card->mpa_rx.start_port) +
  268. card->curr_rd_port) >= tmp)
  269. return true;
  270. }
  271. if (!card->supports_sdio_new_mode)
  272. return false;
  273. if ((card->curr_rd_port - card->mpa_rx.start_port) >=
  274. (card->mp_end_port >> 1))
  275. return true;
  276. return false;
  277. }
  278. static inline bool
  279. mp_tx_aggr_port_limit_reached(struct sdio_mmc_card *card)
  280. {
  281. u16 tmp;
  282. if (card->curr_wr_port < card->mpa_tx.start_port) {
  283. if (card->supports_sdio_new_mode)
  284. tmp = card->mp_end_port >> 1;
  285. else
  286. tmp = card->mp_agg_pkt_limit;
  287. if (((card->max_ports - card->mpa_tx.start_port) +
  288. card->curr_wr_port) >= tmp)
  289. return true;
  290. }
  291. if (!card->supports_sdio_new_mode)
  292. return false;
  293. if ((card->curr_wr_port - card->mpa_tx.start_port) >=
  294. (card->mp_end_port >> 1))
  295. return true;
  296. return false;
  297. }
  298. /* Prepare to copy current packet from card to SDIO Rx aggregation buffer */
  299. static inline void mp_rx_aggr_setup(struct sdio_mmc_card *card,
  300. u16 rx_len, u8 port)
  301. {
  302. card->mpa_rx.buf_len += rx_len;
  303. if (!card->mpa_rx.pkt_cnt)
  304. card->mpa_rx.start_port = port;
  305. if (card->supports_sdio_new_mode) {
  306. card->mpa_rx.ports |= (1 << port);
  307. } else {
  308. if (card->mpa_rx.start_port <= port)
  309. card->mpa_rx.ports |= 1 << (card->mpa_rx.pkt_cnt);
  310. else
  311. card->mpa_rx.ports |= 1 << (card->mpa_rx.pkt_cnt + 1);
  312. }
  313. card->mpa_rx.skb_arr[card->mpa_rx.pkt_cnt] = NULL;
  314. card->mpa_rx.len_arr[card->mpa_rx.pkt_cnt] = rx_len;
  315. card->mpa_rx.pkt_cnt++;
  316. }
  317. #endif /* _MWIFIEX_SDIO_H */