sdio.c 34 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437
  1. // SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
  2. /* Copyright (C) 2021 Martin Blumenstingl <martin.blumenstingl@googlemail.com>
  3. * Copyright (C) 2021 Jernej Skrabec <jernej.skrabec@gmail.com>
  4. *
  5. * Based on rtw88/pci.c:
  6. * Copyright(c) 2018-2019 Realtek Corporation
  7. */
  8. #include <linux/module.h>
  9. #include <linux/mmc/host.h>
  10. #include <linux/mmc/sdio_func.h>
  11. #include "main.h"
  12. #include "mac.h"
  13. #include "debug.h"
  14. #include "fw.h"
  15. #include "ps.h"
  16. #include "reg.h"
  17. #include "rx.h"
  18. #include "sdio.h"
  19. #include "tx.h"
  20. #define RTW_SDIO_INDIRECT_RW_RETRIES 50
  21. static bool rtw_sdio_is_bus_addr(u32 addr)
  22. {
  23. return !!(addr & RTW_SDIO_BUS_MSK);
  24. }
  25. static bool rtw_sdio_bus_claim_needed(struct rtw_sdio *rtwsdio)
  26. {
  27. return !rtwsdio->irq_thread ||
  28. rtwsdio->irq_thread != current;
  29. }
  30. static u32 rtw_sdio_to_bus_offset(struct rtw_dev *rtwdev, u32 addr)
  31. {
  32. switch (addr & RTW_SDIO_BUS_MSK) {
  33. case WLAN_IOREG_OFFSET:
  34. addr &= WLAN_IOREG_REG_MSK;
  35. addr |= FIELD_PREP(REG_SDIO_CMD_ADDR_MSK,
  36. REG_SDIO_CMD_ADDR_MAC_REG);
  37. break;
  38. case SDIO_LOCAL_OFFSET:
  39. addr &= SDIO_LOCAL_REG_MSK;
  40. addr |= FIELD_PREP(REG_SDIO_CMD_ADDR_MSK,
  41. REG_SDIO_CMD_ADDR_SDIO_REG);
  42. break;
  43. default:
  44. rtw_warn(rtwdev, "Cannot convert addr 0x%08x to bus offset",
  45. addr);
  46. }
  47. return addr;
  48. }
  49. static bool rtw_sdio_use_memcpy_io(struct rtw_dev *rtwdev, u32 addr,
  50. u8 alignment)
  51. {
  52. return IS_ALIGNED(addr, alignment) &&
  53. test_bit(RTW_FLAG_POWERON, rtwdev->flags);
  54. }
  55. static void rtw_sdio_writel(struct rtw_dev *rtwdev, u32 val, u32 addr,
  56. int *err_ret)
  57. {
  58. struct rtw_sdio *rtwsdio = (struct rtw_sdio *)rtwdev->priv;
  59. u8 buf[4];
  60. int i;
  61. if (rtw_sdio_use_memcpy_io(rtwdev, addr, 4)) {
  62. sdio_writel(rtwsdio->sdio_func, val, addr, err_ret);
  63. return;
  64. }
  65. *(__le32 *)buf = cpu_to_le32(val);
  66. for (i = 0; i < 4; i++) {
  67. sdio_writeb(rtwsdio->sdio_func, buf[i], addr + i, err_ret);
  68. if (*err_ret)
  69. return;
  70. }
  71. }
  72. static void rtw_sdio_writew(struct rtw_dev *rtwdev, u16 val, u32 addr,
  73. int *err_ret)
  74. {
  75. struct rtw_sdio *rtwsdio = (struct rtw_sdio *)rtwdev->priv;
  76. u8 buf[2];
  77. int i;
  78. *(__le16 *)buf = cpu_to_le16(val);
  79. for (i = 0; i < 2; i++) {
  80. sdio_writeb(rtwsdio->sdio_func, buf[i], addr + i, err_ret);
  81. if (*err_ret)
  82. return;
  83. }
  84. }
  85. static u32 rtw_sdio_readl(struct rtw_dev *rtwdev, u32 addr, int *err_ret)
  86. {
  87. struct rtw_sdio *rtwsdio = (struct rtw_sdio *)rtwdev->priv;
  88. u8 buf[4];
  89. int i;
  90. if (rtw_sdio_use_memcpy_io(rtwdev, addr, 4))
  91. return sdio_readl(rtwsdio->sdio_func, addr, err_ret);
  92. for (i = 0; i < 4; i++) {
  93. buf[i] = sdio_readb(rtwsdio->sdio_func, addr + i, err_ret);
  94. if (*err_ret)
  95. return 0;
  96. }
  97. return le32_to_cpu(*(__le32 *)buf);
  98. }
  99. static u16 rtw_sdio_readw(struct rtw_dev *rtwdev, u32 addr, int *err_ret)
  100. {
  101. struct rtw_sdio *rtwsdio = (struct rtw_sdio *)rtwdev->priv;
  102. u8 buf[2];
  103. int i;
  104. for (i = 0; i < 2; i++) {
  105. buf[i] = sdio_readb(rtwsdio->sdio_func, addr + i, err_ret);
  106. if (*err_ret)
  107. return 0;
  108. }
  109. return le16_to_cpu(*(__le16 *)buf);
  110. }
  111. static u32 rtw_sdio_to_io_address(struct rtw_dev *rtwdev, u32 addr,
  112. bool direct)
  113. {
  114. if (!direct)
  115. return addr;
  116. if (!rtw_sdio_is_bus_addr(addr))
  117. addr |= WLAN_IOREG_OFFSET;
  118. return rtw_sdio_to_bus_offset(rtwdev, addr);
  119. }
  120. static bool rtw_sdio_use_direct_io(struct rtw_dev *rtwdev, u32 addr)
  121. {
  122. bool might_indirect_under_power_off = rtwdev->chip->id == RTW_CHIP_TYPE_8822C;
  123. if (!test_bit(RTW_FLAG_POWERON, rtwdev->flags) &&
  124. !rtw_sdio_is_bus_addr(addr) && might_indirect_under_power_off)
  125. return false;
  126. return !rtw_sdio_is_sdio30_supported(rtwdev) ||
  127. rtw_sdio_is_bus_addr(addr);
  128. }
  129. static int rtw_sdio_indirect_reg_cfg(struct rtw_dev *rtwdev, u32 addr, u32 cfg)
  130. {
  131. struct rtw_sdio *rtwsdio = (struct rtw_sdio *)rtwdev->priv;
  132. unsigned int retry;
  133. u32 reg_cfg;
  134. int ret;
  135. u8 tmp;
  136. reg_cfg = rtw_sdio_to_bus_offset(rtwdev, REG_SDIO_INDIRECT_REG_CFG);
  137. rtw_sdio_writel(rtwdev, addr | cfg | BIT_SDIO_INDIRECT_REG_CFG_UNK20,
  138. reg_cfg, &ret);
  139. if (ret)
  140. return ret;
  141. for (retry = 0; retry < RTW_SDIO_INDIRECT_RW_RETRIES; retry++) {
  142. tmp = sdio_readb(rtwsdio->sdio_func, reg_cfg + 2, &ret);
  143. if (!ret && (tmp & BIT(4)))
  144. return 0;
  145. }
  146. return -ETIMEDOUT;
  147. }
  148. static u8 rtw_sdio_indirect_read8(struct rtw_dev *rtwdev, u32 addr,
  149. int *err_ret)
  150. {
  151. struct rtw_sdio *rtwsdio = (struct rtw_sdio *)rtwdev->priv;
  152. u32 reg_data;
  153. *err_ret = rtw_sdio_indirect_reg_cfg(rtwdev, addr,
  154. BIT_SDIO_INDIRECT_REG_CFG_READ);
  155. if (*err_ret)
  156. return 0;
  157. reg_data = rtw_sdio_to_bus_offset(rtwdev, REG_SDIO_INDIRECT_REG_DATA);
  158. return sdio_readb(rtwsdio->sdio_func, reg_data, err_ret);
  159. }
  160. static int rtw_sdio_indirect_read_bytes(struct rtw_dev *rtwdev, u32 addr,
  161. u8 *buf, int count)
  162. {
  163. int i, ret = 0;
  164. for (i = 0; i < count; i++) {
  165. buf[i] = rtw_sdio_indirect_read8(rtwdev, addr + i, &ret);
  166. if (ret)
  167. break;
  168. }
  169. return ret;
  170. }
  171. static u16 rtw_sdio_indirect_read16(struct rtw_dev *rtwdev, u32 addr,
  172. int *err_ret)
  173. {
  174. u32 reg_data;
  175. u8 buf[2];
  176. if (!IS_ALIGNED(addr, 2)) {
  177. *err_ret = rtw_sdio_indirect_read_bytes(rtwdev, addr, buf, 2);
  178. if (*err_ret)
  179. return 0;
  180. return le16_to_cpu(*(__le16 *)buf);
  181. }
  182. *err_ret = rtw_sdio_indirect_reg_cfg(rtwdev, addr,
  183. BIT_SDIO_INDIRECT_REG_CFG_READ);
  184. if (*err_ret)
  185. return 0;
  186. reg_data = rtw_sdio_to_bus_offset(rtwdev, REG_SDIO_INDIRECT_REG_DATA);
  187. return rtw_sdio_readw(rtwdev, reg_data, err_ret);
  188. }
  189. static u32 rtw_sdio_indirect_read32(struct rtw_dev *rtwdev, u32 addr,
  190. int *err_ret)
  191. {
  192. u32 reg_data;
  193. u8 buf[4];
  194. if (!IS_ALIGNED(addr, 4)) {
  195. *err_ret = rtw_sdio_indirect_read_bytes(rtwdev, addr, buf, 4);
  196. if (*err_ret)
  197. return 0;
  198. return le32_to_cpu(*(__le32 *)buf);
  199. }
  200. *err_ret = rtw_sdio_indirect_reg_cfg(rtwdev, addr,
  201. BIT_SDIO_INDIRECT_REG_CFG_READ);
  202. if (*err_ret)
  203. return 0;
  204. reg_data = rtw_sdio_to_bus_offset(rtwdev, REG_SDIO_INDIRECT_REG_DATA);
  205. return rtw_sdio_readl(rtwdev, reg_data, err_ret);
  206. }
  207. static u8 rtw_sdio_read8(struct rtw_dev *rtwdev, u32 addr)
  208. {
  209. struct rtw_sdio *rtwsdio = (struct rtw_sdio *)rtwdev->priv;
  210. bool direct, bus_claim;
  211. int ret;
  212. u8 val;
  213. direct = rtw_sdio_use_direct_io(rtwdev, addr);
  214. addr = rtw_sdio_to_io_address(rtwdev, addr, direct);
  215. bus_claim = rtw_sdio_bus_claim_needed(rtwsdio);
  216. if (bus_claim)
  217. sdio_claim_host(rtwsdio->sdio_func);
  218. if (direct)
  219. val = sdio_readb(rtwsdio->sdio_func, addr, &ret);
  220. else
  221. val = rtw_sdio_indirect_read8(rtwdev, addr, &ret);
  222. if (bus_claim)
  223. sdio_release_host(rtwsdio->sdio_func);
  224. if (ret)
  225. rtw_warn(rtwdev, "sdio read8 failed (0x%x): %d", addr, ret);
  226. return val;
  227. }
  228. static u16 rtw_sdio_read16(struct rtw_dev *rtwdev, u32 addr)
  229. {
  230. struct rtw_sdio *rtwsdio = (struct rtw_sdio *)rtwdev->priv;
  231. bool direct, bus_claim;
  232. int ret;
  233. u16 val;
  234. direct = rtw_sdio_use_direct_io(rtwdev, addr);
  235. addr = rtw_sdio_to_io_address(rtwdev, addr, direct);
  236. bus_claim = rtw_sdio_bus_claim_needed(rtwsdio);
  237. if (bus_claim)
  238. sdio_claim_host(rtwsdio->sdio_func);
  239. if (direct)
  240. val = rtw_sdio_readw(rtwdev, addr, &ret);
  241. else
  242. val = rtw_sdio_indirect_read16(rtwdev, addr, &ret);
  243. if (bus_claim)
  244. sdio_release_host(rtwsdio->sdio_func);
  245. if (ret)
  246. rtw_warn(rtwdev, "sdio read16 failed (0x%x): %d", addr, ret);
  247. return val;
  248. }
  249. static u32 rtw_sdio_read32(struct rtw_dev *rtwdev, u32 addr)
  250. {
  251. struct rtw_sdio *rtwsdio = (struct rtw_sdio *)rtwdev->priv;
  252. bool direct, bus_claim;
  253. u32 val;
  254. int ret;
  255. direct = rtw_sdio_use_direct_io(rtwdev, addr);
  256. addr = rtw_sdio_to_io_address(rtwdev, addr, direct);
  257. bus_claim = rtw_sdio_bus_claim_needed(rtwsdio);
  258. if (bus_claim)
  259. sdio_claim_host(rtwsdio->sdio_func);
  260. if (direct)
  261. val = rtw_sdio_readl(rtwdev, addr, &ret);
  262. else
  263. val = rtw_sdio_indirect_read32(rtwdev, addr, &ret);
  264. if (bus_claim)
  265. sdio_release_host(rtwsdio->sdio_func);
  266. if (ret)
  267. rtw_warn(rtwdev, "sdio read32 failed (0x%x): %d", addr, ret);
  268. return val;
  269. }
  270. static void rtw_sdio_indirect_write8(struct rtw_dev *rtwdev, u8 val, u32 addr,
  271. int *err_ret)
  272. {
  273. struct rtw_sdio *rtwsdio = (struct rtw_sdio *)rtwdev->priv;
  274. u32 reg_data;
  275. reg_data = rtw_sdio_to_bus_offset(rtwdev, REG_SDIO_INDIRECT_REG_DATA);
  276. sdio_writeb(rtwsdio->sdio_func, val, reg_data, err_ret);
  277. if (*err_ret)
  278. return;
  279. *err_ret = rtw_sdio_indirect_reg_cfg(rtwdev, addr,
  280. BIT_SDIO_INDIRECT_REG_CFG_WRITE);
  281. }
  282. static void rtw_sdio_indirect_write16(struct rtw_dev *rtwdev, u16 val, u32 addr,
  283. int *err_ret)
  284. {
  285. u32 reg_data;
  286. if (!IS_ALIGNED(addr, 2)) {
  287. addr = rtw_sdio_to_io_address(rtwdev, addr, true);
  288. rtw_sdio_writew(rtwdev, val, addr, err_ret);
  289. return;
  290. }
  291. reg_data = rtw_sdio_to_bus_offset(rtwdev, REG_SDIO_INDIRECT_REG_DATA);
  292. rtw_sdio_writew(rtwdev, val, reg_data, err_ret);
  293. if (*err_ret)
  294. return;
  295. *err_ret = rtw_sdio_indirect_reg_cfg(rtwdev, addr,
  296. BIT_SDIO_INDIRECT_REG_CFG_WRITE |
  297. BIT_SDIO_INDIRECT_REG_CFG_WORD);
  298. }
  299. static void rtw_sdio_indirect_write32(struct rtw_dev *rtwdev, u32 val,
  300. u32 addr, int *err_ret)
  301. {
  302. u32 reg_data;
  303. if (!IS_ALIGNED(addr, 4)) {
  304. addr = rtw_sdio_to_io_address(rtwdev, addr, true);
  305. rtw_sdio_writel(rtwdev, val, addr, err_ret);
  306. return;
  307. }
  308. reg_data = rtw_sdio_to_bus_offset(rtwdev, REG_SDIO_INDIRECT_REG_DATA);
  309. rtw_sdio_writel(rtwdev, val, reg_data, err_ret);
  310. *err_ret = rtw_sdio_indirect_reg_cfg(rtwdev, addr,
  311. BIT_SDIO_INDIRECT_REG_CFG_WRITE |
  312. BIT_SDIO_INDIRECT_REG_CFG_DWORD);
  313. }
  314. static void rtw_sdio_write8(struct rtw_dev *rtwdev, u32 addr, u8 val)
  315. {
  316. struct rtw_sdio *rtwsdio = (struct rtw_sdio *)rtwdev->priv;
  317. bool direct, bus_claim;
  318. int ret;
  319. direct = rtw_sdio_use_direct_io(rtwdev, addr);
  320. addr = rtw_sdio_to_io_address(rtwdev, addr, direct);
  321. bus_claim = rtw_sdio_bus_claim_needed(rtwsdio);
  322. if (bus_claim)
  323. sdio_claim_host(rtwsdio->sdio_func);
  324. if (direct)
  325. sdio_writeb(rtwsdio->sdio_func, val, addr, &ret);
  326. else
  327. rtw_sdio_indirect_write8(rtwdev, val, addr, &ret);
  328. if (bus_claim)
  329. sdio_release_host(rtwsdio->sdio_func);
  330. if (ret)
  331. rtw_warn(rtwdev, "sdio write8 failed (0x%x): %d", addr, ret);
  332. }
  333. static void rtw_sdio_write16(struct rtw_dev *rtwdev, u32 addr, u16 val)
  334. {
  335. struct rtw_sdio *rtwsdio = (struct rtw_sdio *)rtwdev->priv;
  336. bool direct, bus_claim;
  337. int ret;
  338. direct = rtw_sdio_use_direct_io(rtwdev, addr);
  339. addr = rtw_sdio_to_io_address(rtwdev, addr, direct);
  340. bus_claim = rtw_sdio_bus_claim_needed(rtwsdio);
  341. if (bus_claim)
  342. sdio_claim_host(rtwsdio->sdio_func);
  343. if (direct)
  344. rtw_sdio_writew(rtwdev, val, addr, &ret);
  345. else
  346. rtw_sdio_indirect_write16(rtwdev, val, addr, &ret);
  347. if (bus_claim)
  348. sdio_release_host(rtwsdio->sdio_func);
  349. if (ret)
  350. rtw_warn(rtwdev, "sdio write16 failed (0x%x): %d", addr, ret);
  351. }
  352. static void rtw_sdio_write32(struct rtw_dev *rtwdev, u32 addr, u32 val)
  353. {
  354. struct rtw_sdio *rtwsdio = (struct rtw_sdio *)rtwdev->priv;
  355. bool direct, bus_claim;
  356. int ret;
  357. direct = rtw_sdio_use_direct_io(rtwdev, addr);
  358. addr = rtw_sdio_to_io_address(rtwdev, addr, direct);
  359. bus_claim = rtw_sdio_bus_claim_needed(rtwsdio);
  360. if (bus_claim)
  361. sdio_claim_host(rtwsdio->sdio_func);
  362. if (direct)
  363. rtw_sdio_writel(rtwdev, val, addr, &ret);
  364. else
  365. rtw_sdio_indirect_write32(rtwdev, val, addr, &ret);
  366. if (bus_claim)
  367. sdio_release_host(rtwsdio->sdio_func);
  368. if (ret)
  369. rtw_warn(rtwdev, "sdio write32 failed (0x%x): %d", addr, ret);
  370. }
  371. static u32 rtw_sdio_get_tx_addr(struct rtw_dev *rtwdev, size_t size,
  372. enum rtw_tx_queue_type queue)
  373. {
  374. u32 txaddr;
  375. switch (queue) {
  376. case RTW_TX_QUEUE_BCN:
  377. case RTW_TX_QUEUE_H2C:
  378. case RTW_TX_QUEUE_HI0:
  379. txaddr = FIELD_PREP(REG_SDIO_CMD_ADDR_MSK,
  380. REG_SDIO_CMD_ADDR_TXFF_HIGH);
  381. break;
  382. case RTW_TX_QUEUE_VI:
  383. case RTW_TX_QUEUE_VO:
  384. txaddr = FIELD_PREP(REG_SDIO_CMD_ADDR_MSK,
  385. REG_SDIO_CMD_ADDR_TXFF_NORMAL);
  386. break;
  387. case RTW_TX_QUEUE_BE:
  388. case RTW_TX_QUEUE_BK:
  389. txaddr = FIELD_PREP(REG_SDIO_CMD_ADDR_MSK,
  390. REG_SDIO_CMD_ADDR_TXFF_LOW);
  391. break;
  392. case RTW_TX_QUEUE_MGMT:
  393. txaddr = FIELD_PREP(REG_SDIO_CMD_ADDR_MSK,
  394. REG_SDIO_CMD_ADDR_TXFF_EXTRA);
  395. break;
  396. default:
  397. rtw_warn(rtwdev, "Unsupported queue for TX addr: 0x%02x\n",
  398. queue);
  399. return 0;
  400. }
  401. txaddr += DIV_ROUND_UP(size, 4);
  402. return txaddr;
  403. };
  404. static int rtw_sdio_read_port(struct rtw_dev *rtwdev, u8 *buf, size_t count)
  405. {
  406. struct rtw_sdio *rtwsdio = (struct rtw_sdio *)rtwdev->priv;
  407. struct mmc_host *host = rtwsdio->sdio_func->card->host;
  408. bool bus_claim = rtw_sdio_bus_claim_needed(rtwsdio);
  409. u32 rxaddr = rtwsdio->rx_addr++;
  410. int ret = 0, err;
  411. size_t bytes;
  412. if (bus_claim)
  413. sdio_claim_host(rtwsdio->sdio_func);
  414. while (count > 0) {
  415. bytes = min_t(size_t, host->max_req_size, count);
  416. err = sdio_memcpy_fromio(rtwsdio->sdio_func, buf,
  417. RTW_SDIO_ADDR_RX_RX0FF_GEN(rxaddr),
  418. bytes);
  419. if (err) {
  420. rtw_warn(rtwdev,
  421. "Failed to read %zu byte(s) from SDIO port 0x%08x: %d",
  422. bytes, rxaddr, err);
  423. /* Signal to the caller that reading did not work and
  424. * that the data in the buffer is short/corrupted.
  425. */
  426. ret = err;
  427. /* Don't stop here - instead drain the remaining data
  428. * from the card's buffer, else the card will return
  429. * corrupt data for the next rtw_sdio_read_port() call.
  430. */
  431. }
  432. count -= bytes;
  433. buf += bytes;
  434. }
  435. if (bus_claim)
  436. sdio_release_host(rtwsdio->sdio_func);
  437. return ret;
  438. }
  439. static int rtw_sdio_check_free_txpg(struct rtw_dev *rtwdev, u8 queue,
  440. size_t count)
  441. {
  442. unsigned int pages_free, pages_needed;
  443. if (rtw_chip_wcpu_8051(rtwdev)) {
  444. u32 free_txpg;
  445. free_txpg = rtw_sdio_read32(rtwdev, REG_SDIO_FREE_TXPG);
  446. switch (queue) {
  447. case RTW_TX_QUEUE_BCN:
  448. case RTW_TX_QUEUE_H2C:
  449. case RTW_TX_QUEUE_HI0:
  450. case RTW_TX_QUEUE_MGMT:
  451. /* high */
  452. pages_free = free_txpg & 0xff;
  453. break;
  454. case RTW_TX_QUEUE_VI:
  455. case RTW_TX_QUEUE_VO:
  456. /* normal */
  457. pages_free = (free_txpg >> 8) & 0xff;
  458. break;
  459. case RTW_TX_QUEUE_BE:
  460. case RTW_TX_QUEUE_BK:
  461. /* low */
  462. pages_free = (free_txpg >> 16) & 0xff;
  463. break;
  464. default:
  465. rtw_warn(rtwdev, "Unknown mapping for queue %u\n", queue);
  466. return -EINVAL;
  467. }
  468. /* add the pages from the public queue */
  469. pages_free += (free_txpg >> 24) & 0xff;
  470. } else {
  471. u32 free_txpg[3];
  472. free_txpg[0] = rtw_sdio_read32(rtwdev, REG_SDIO_FREE_TXPG);
  473. free_txpg[1] = rtw_sdio_read32(rtwdev, REG_SDIO_FREE_TXPG + 4);
  474. free_txpg[2] = rtw_sdio_read32(rtwdev, REG_SDIO_FREE_TXPG + 8);
  475. switch (queue) {
  476. case RTW_TX_QUEUE_BCN:
  477. case RTW_TX_QUEUE_H2C:
  478. case RTW_TX_QUEUE_HI0:
  479. /* high */
  480. pages_free = free_txpg[0] & 0xfff;
  481. break;
  482. case RTW_TX_QUEUE_VI:
  483. case RTW_TX_QUEUE_VO:
  484. /* normal */
  485. pages_free = (free_txpg[0] >> 16) & 0xfff;
  486. break;
  487. case RTW_TX_QUEUE_BE:
  488. case RTW_TX_QUEUE_BK:
  489. /* low */
  490. pages_free = free_txpg[1] & 0xfff;
  491. break;
  492. case RTW_TX_QUEUE_MGMT:
  493. /* extra */
  494. pages_free = free_txpg[2] & 0xfff;
  495. break;
  496. default:
  497. rtw_warn(rtwdev, "Unknown mapping for queue %u\n", queue);
  498. return -EINVAL;
  499. }
  500. /* add the pages from the public queue */
  501. pages_free += (free_txpg[1] >> 16) & 0xfff;
  502. }
  503. pages_needed = DIV_ROUND_UP(count, rtwdev->chip->page_size);
  504. if (pages_needed > pages_free) {
  505. rtw_dbg(rtwdev, RTW_DBG_SDIO,
  506. "Not enough free pages (%u needed, %u free) in queue %u for %zu bytes\n",
  507. pages_needed, pages_free, queue, count);
  508. return -EBUSY;
  509. }
  510. return 0;
  511. }
  512. static int rtw_sdio_write_port(struct rtw_dev *rtwdev, struct sk_buff *skb,
  513. enum rtw_tx_queue_type queue)
  514. {
  515. struct rtw_sdio *rtwsdio = (struct rtw_sdio *)rtwdev->priv;
  516. bool bus_claim;
  517. size_t txsize;
  518. u32 txaddr;
  519. int ret;
  520. txaddr = rtw_sdio_get_tx_addr(rtwdev, skb->len, queue);
  521. if (!txaddr)
  522. return -EINVAL;
  523. txsize = sdio_align_size(rtwsdio->sdio_func, skb->len);
  524. ret = rtw_sdio_check_free_txpg(rtwdev, queue, txsize);
  525. if (ret)
  526. return ret;
  527. if (!IS_ALIGNED((unsigned long)skb->data, RTW_SDIO_DATA_PTR_ALIGN))
  528. rtw_warn(rtwdev, "Got unaligned SKB in %s() for queue %u\n",
  529. __func__, queue);
  530. bus_claim = rtw_sdio_bus_claim_needed(rtwsdio);
  531. if (bus_claim)
  532. sdio_claim_host(rtwsdio->sdio_func);
  533. ret = sdio_memcpy_toio(rtwsdio->sdio_func, txaddr, skb->data, txsize);
  534. if (bus_claim)
  535. sdio_release_host(rtwsdio->sdio_func);
  536. if (ret)
  537. rtw_warn(rtwdev,
  538. "Failed to write %zu byte(s) to SDIO port 0x%08x",
  539. txsize, txaddr);
  540. return ret;
  541. }
  542. static void rtw_sdio_init(struct rtw_dev *rtwdev)
  543. {
  544. struct rtw_sdio *rtwsdio = (struct rtw_sdio *)rtwdev->priv;
  545. rtwsdio->irq_mask = REG_SDIO_HIMR_RX_REQUEST | REG_SDIO_HIMR_CPWM1;
  546. }
  547. static void rtw_sdio_enable_rx_aggregation(struct rtw_dev *rtwdev)
  548. {
  549. u8 size, timeout;
  550. switch (rtwdev->chip->id) {
  551. case RTW_CHIP_TYPE_8703B:
  552. case RTW_CHIP_TYPE_8821A:
  553. case RTW_CHIP_TYPE_8812A:
  554. size = 0x6;
  555. timeout = 0x6;
  556. break;
  557. case RTW_CHIP_TYPE_8723D:
  558. size = 0xa;
  559. timeout = 0x3;
  560. rtw_write8_set(rtwdev, REG_RXDMA_AGG_PG_TH + 3, BIT(7));
  561. break;
  562. default:
  563. size = 0xff;
  564. timeout = 0x1;
  565. break;
  566. }
  567. /* Make the firmware honor the size limit configured below */
  568. rtw_write32_set(rtwdev, REG_RXDMA_AGG_PG_TH, BIT_EN_PRE_CALC);
  569. rtw_write8_set(rtwdev, REG_TXDMA_PQ_MAP, BIT_RXDMA_AGG_EN);
  570. rtw_write16(rtwdev, REG_RXDMA_AGG_PG_TH,
  571. FIELD_PREP(BIT_RXDMA_AGG_PG_TH, size) |
  572. FIELD_PREP(BIT_DMA_AGG_TO_V1, timeout));
  573. rtw_write8_set(rtwdev, REG_RXDMA_MODE, BIT_DMA_MODE);
  574. }
  575. static void rtw_sdio_enable_interrupt(struct rtw_dev *rtwdev)
  576. {
  577. struct rtw_sdio *rtwsdio = (struct rtw_sdio *)rtwdev->priv;
  578. rtw_write32(rtwdev, REG_SDIO_HIMR, rtwsdio->irq_mask);
  579. }
  580. static void rtw_sdio_disable_interrupt(struct rtw_dev *rtwdev)
  581. {
  582. rtw_write32(rtwdev, REG_SDIO_HIMR, 0x0);
  583. }
  584. static u8 rtw_sdio_get_tx_qsel(struct rtw_dev *rtwdev, struct sk_buff *skb,
  585. u8 queue)
  586. {
  587. switch (queue) {
  588. case RTW_TX_QUEUE_BCN:
  589. return TX_DESC_QSEL_BEACON;
  590. case RTW_TX_QUEUE_H2C:
  591. return TX_DESC_QSEL_H2C;
  592. case RTW_TX_QUEUE_MGMT:
  593. return TX_DESC_QSEL_MGMT;
  594. case RTW_TX_QUEUE_HI0:
  595. return TX_DESC_QSEL_HIGH;
  596. default:
  597. return skb->priority;
  598. }
  599. }
  600. static int rtw_sdio_setup(struct rtw_dev *rtwdev)
  601. {
  602. /* nothing to do */
  603. return 0;
  604. }
  605. static int rtw_sdio_start(struct rtw_dev *rtwdev)
  606. {
  607. rtw_sdio_enable_rx_aggregation(rtwdev);
  608. rtw_sdio_enable_interrupt(rtwdev);
  609. return 0;
  610. }
  611. static void rtw_sdio_stop(struct rtw_dev *rtwdev)
  612. {
  613. rtw_sdio_disable_interrupt(rtwdev);
  614. }
  615. static void rtw_sdio_deep_ps_enter(struct rtw_dev *rtwdev)
  616. {
  617. struct rtw_sdio *rtwsdio = (struct rtw_sdio *)rtwdev->priv;
  618. bool tx_empty = true;
  619. u8 queue;
  620. if (!rtw_fw_feature_check(&rtwdev->fw, FW_FEATURE_TX_WAKE)) {
  621. /* Deep PS state is not allowed to TX-DMA */
  622. for (queue = 0; queue < RTK_MAX_TX_QUEUE_NUM; queue++) {
  623. /* BCN queue is rsvd page, does not have DMA interrupt
  624. * H2C queue is managed by firmware
  625. */
  626. if (queue == RTW_TX_QUEUE_BCN ||
  627. queue == RTW_TX_QUEUE_H2C)
  628. continue;
  629. /* check if there is any skb DMAing */
  630. if (skb_queue_len(&rtwsdio->tx_queue[queue])) {
  631. tx_empty = false;
  632. break;
  633. }
  634. }
  635. }
  636. if (!tx_empty) {
  637. rtw_dbg(rtwdev, RTW_DBG_PS,
  638. "TX path not empty, cannot enter deep power save state\n");
  639. return;
  640. }
  641. set_bit(RTW_FLAG_LEISURE_PS_DEEP, rtwdev->flags);
  642. rtw_power_mode_change(rtwdev, true);
  643. }
  644. static void rtw_sdio_deep_ps_leave(struct rtw_dev *rtwdev)
  645. {
  646. if (test_and_clear_bit(RTW_FLAG_LEISURE_PS_DEEP, rtwdev->flags))
  647. rtw_power_mode_change(rtwdev, false);
  648. }
  649. static void rtw_sdio_deep_ps(struct rtw_dev *rtwdev, bool enter)
  650. {
  651. if (enter && !test_bit(RTW_FLAG_LEISURE_PS_DEEP, rtwdev->flags))
  652. rtw_sdio_deep_ps_enter(rtwdev);
  653. if (!enter && test_bit(RTW_FLAG_LEISURE_PS_DEEP, rtwdev->flags))
  654. rtw_sdio_deep_ps_leave(rtwdev);
  655. }
  656. static void rtw_sdio_tx_kick_off(struct rtw_dev *rtwdev)
  657. {
  658. struct rtw_sdio *rtwsdio = (struct rtw_sdio *)rtwdev->priv;
  659. queue_work(rtwsdio->txwq, &rtwsdio->tx_handler_data->work);
  660. }
  661. static void rtw_sdio_link_ps(struct rtw_dev *rtwdev, bool enter)
  662. {
  663. /* nothing to do */
  664. }
  665. static void rtw_sdio_interface_cfg(struct rtw_dev *rtwdev)
  666. {
  667. u32 val;
  668. rtw_read32(rtwdev, REG_SDIO_FREE_TXPG);
  669. val = rtw_read32(rtwdev, REG_SDIO_TX_CTRL);
  670. val &= 0xfff8;
  671. rtw_write32(rtwdev, REG_SDIO_TX_CTRL, val);
  672. }
  673. static struct rtw_sdio_tx_data *rtw_sdio_get_tx_data(struct sk_buff *skb)
  674. {
  675. struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
  676. BUILD_BUG_ON(sizeof(struct rtw_sdio_tx_data) >
  677. sizeof(info->status.status_driver_data));
  678. return (struct rtw_sdio_tx_data *)info->status.status_driver_data;
  679. }
  680. static void rtw_sdio_tx_skb_prepare(struct rtw_dev *rtwdev,
  681. struct rtw_tx_pkt_info *pkt_info,
  682. struct sk_buff *skb,
  683. enum rtw_tx_queue_type queue)
  684. {
  685. const struct rtw_chip_info *chip = rtwdev->chip;
  686. unsigned long data_addr, aligned_addr;
  687. size_t offset;
  688. u8 *pkt_desc;
  689. pkt_desc = skb_push(skb, chip->tx_pkt_desc_sz);
  690. data_addr = (unsigned long)pkt_desc;
  691. aligned_addr = ALIGN(data_addr, RTW_SDIO_DATA_PTR_ALIGN);
  692. if (data_addr != aligned_addr) {
  693. /* Ensure that the start of the pkt_desc is always aligned at
  694. * RTW_SDIO_DATA_PTR_ALIGN.
  695. */
  696. offset = RTW_SDIO_DATA_PTR_ALIGN - (aligned_addr - data_addr);
  697. pkt_desc = skb_push(skb, offset);
  698. /* By inserting padding to align the start of the pkt_desc we
  699. * need to inform the firmware that the actual data starts at
  700. * a different offset than normal.
  701. */
  702. pkt_info->offset += offset;
  703. }
  704. memset(pkt_desc, 0, chip->tx_pkt_desc_sz);
  705. pkt_info->qsel = rtw_sdio_get_tx_qsel(rtwdev, skb, queue);
  706. rtw_tx_fill_tx_desc(rtwdev, pkt_info, skb);
  707. rtw_tx_fill_txdesc_checksum(rtwdev, pkt_info, pkt_desc);
  708. }
  709. static int rtw_sdio_write_data(struct rtw_dev *rtwdev,
  710. struct rtw_tx_pkt_info *pkt_info,
  711. struct sk_buff *skb,
  712. enum rtw_tx_queue_type queue)
  713. {
  714. int ret;
  715. rtw_sdio_tx_skb_prepare(rtwdev, pkt_info, skb, queue);
  716. ret = rtw_sdio_write_port(rtwdev, skb, queue);
  717. dev_kfree_skb_any(skb);
  718. return ret;
  719. }
  720. static int rtw_sdio_write_data_rsvd_page(struct rtw_dev *rtwdev, u8 *buf,
  721. u32 size)
  722. {
  723. struct rtw_tx_pkt_info pkt_info = {};
  724. struct sk_buff *skb;
  725. skb = rtw_tx_write_data_rsvd_page_get(rtwdev, &pkt_info, buf, size);
  726. if (!skb)
  727. return -ENOMEM;
  728. return rtw_sdio_write_data(rtwdev, &pkt_info, skb, RTW_TX_QUEUE_BCN);
  729. }
  730. static int rtw_sdio_write_data_h2c(struct rtw_dev *rtwdev, u8 *buf, u32 size)
  731. {
  732. struct rtw_tx_pkt_info pkt_info = {};
  733. struct sk_buff *skb;
  734. skb = rtw_tx_write_data_h2c_get(rtwdev, &pkt_info, buf, size);
  735. if (!skb)
  736. return -ENOMEM;
  737. return rtw_sdio_write_data(rtwdev, &pkt_info, skb, RTW_TX_QUEUE_H2C);
  738. }
  739. static int rtw_sdio_tx_write(struct rtw_dev *rtwdev,
  740. struct rtw_tx_pkt_info *pkt_info,
  741. struct sk_buff *skb)
  742. {
  743. struct rtw_sdio *rtwsdio = (struct rtw_sdio *)rtwdev->priv;
  744. enum rtw_tx_queue_type queue = rtw_tx_queue_mapping(skb);
  745. struct rtw_sdio_tx_data *tx_data;
  746. rtw_sdio_tx_skb_prepare(rtwdev, pkt_info, skb, queue);
  747. tx_data = rtw_sdio_get_tx_data(skb);
  748. tx_data->sn = pkt_info->sn;
  749. skb_queue_tail(&rtwsdio->tx_queue[queue], skb);
  750. return 0;
  751. }
  752. static void rtw_sdio_tx_err_isr(struct rtw_dev *rtwdev)
  753. {
  754. u32 val = rtw_read32(rtwdev, REG_TXDMA_STATUS);
  755. rtw_write32(rtwdev, REG_TXDMA_STATUS, val);
  756. }
  757. static void rtw_sdio_rx_skb(struct rtw_dev *rtwdev, struct sk_buff *skb,
  758. u32 pkt_offset, struct rtw_rx_pkt_stat *pkt_stat,
  759. struct ieee80211_rx_status *rx_status)
  760. {
  761. *IEEE80211_SKB_RXCB(skb) = *rx_status;
  762. if (pkt_stat->is_c2h) {
  763. skb_put(skb, pkt_stat->pkt_len + pkt_offset);
  764. rtw_fw_c2h_cmd_rx_irqsafe(rtwdev, pkt_offset, skb);
  765. return;
  766. }
  767. skb_put(skb, pkt_stat->pkt_len);
  768. skb_reserve(skb, pkt_offset);
  769. rtw_update_rx_freq_for_invalid(rtwdev, skb, rx_status, pkt_stat);
  770. rtw_rx_stats(rtwdev, pkt_stat->vif, skb);
  771. ieee80211_rx_irqsafe(rtwdev->hw, skb);
  772. }
  773. static void rtw_sdio_rxfifo_recv(struct rtw_dev *rtwdev, u32 rx_len)
  774. {
  775. struct rtw_sdio *rtwsdio = (struct rtw_sdio *)rtwdev->priv;
  776. const struct rtw_chip_info *chip = rtwdev->chip;
  777. u32 pkt_desc_sz = chip->rx_pkt_desc_sz;
  778. struct ieee80211_rx_status rx_status;
  779. struct rtw_rx_pkt_stat pkt_stat;
  780. struct sk_buff *skb, *split_skb;
  781. u32 pkt_offset, curr_pkt_len;
  782. size_t bufsz;
  783. u8 *rx_desc;
  784. int ret;
  785. bufsz = sdio_align_size(rtwsdio->sdio_func, rx_len);
  786. skb = dev_alloc_skb(bufsz);
  787. if (!skb)
  788. return;
  789. ret = rtw_sdio_read_port(rtwdev, skb->data, bufsz);
  790. if (ret) {
  791. dev_kfree_skb_any(skb);
  792. return;
  793. }
  794. while (true) {
  795. rx_desc = skb->data;
  796. rtw_rx_query_rx_desc(rtwdev, rx_desc, &pkt_stat, &rx_status);
  797. pkt_offset = pkt_desc_sz + pkt_stat.drv_info_sz +
  798. pkt_stat.shift;
  799. curr_pkt_len = ALIGN(pkt_offset + pkt_stat.pkt_len,
  800. RTW_SDIO_DATA_PTR_ALIGN);
  801. if ((curr_pkt_len + pkt_desc_sz) >= rx_len) {
  802. /* Use the original skb (with it's adjusted offset)
  803. * when processing the last (or even the only) entry to
  804. * have it's memory freed automatically.
  805. */
  806. rtw_sdio_rx_skb(rtwdev, skb, pkt_offset, &pkt_stat,
  807. &rx_status);
  808. break;
  809. }
  810. split_skb = dev_alloc_skb(curr_pkt_len);
  811. if (!split_skb) {
  812. rtw_sdio_rx_skb(rtwdev, skb, pkt_offset, &pkt_stat,
  813. &rx_status);
  814. break;
  815. }
  816. skb_copy_header(split_skb, skb);
  817. memcpy(split_skb->data, skb->data, curr_pkt_len);
  818. rtw_sdio_rx_skb(rtwdev, split_skb, pkt_offset, &pkt_stat,
  819. &rx_status);
  820. /* Move to the start of the next RX descriptor */
  821. skb_reserve(skb, curr_pkt_len);
  822. rx_len -= curr_pkt_len;
  823. }
  824. }
  825. static void rtw_sdio_rx_isr(struct rtw_dev *rtwdev)
  826. {
  827. u32 rx_len, hisr, total_rx_bytes = 0;
  828. do {
  829. if (rtw_chip_wcpu_8051(rtwdev))
  830. rx_len = rtw_read16(rtwdev, REG_SDIO_RX0_REQ_LEN);
  831. else
  832. rx_len = rtw_read32(rtwdev, REG_SDIO_RX0_REQ_LEN);
  833. if (!rx_len)
  834. break;
  835. rtw_sdio_rxfifo_recv(rtwdev, rx_len);
  836. total_rx_bytes += rx_len;
  837. if (rtw_chip_wcpu_8051(rtwdev)) {
  838. /* Stop if no more RX requests are pending, even if
  839. * rx_len could be greater than zero in the next
  840. * iteration. This is needed because the RX buffer may
  841. * already contain data while either HW or FW are not
  842. * done filling that buffer yet. Still reading the
  843. * buffer can result in packets where
  844. * rtw_rx_pkt_stat.pkt_len is zero or points beyond the
  845. * end of the buffer.
  846. */
  847. hisr = rtw_read32(rtwdev, REG_SDIO_HISR);
  848. } else {
  849. /* RTW_WCPU_3081 chips have improved hardware or
  850. * firmware and can use rx_len unconditionally.
  851. */
  852. hisr = REG_SDIO_HISR_RX_REQUEST;
  853. }
  854. } while (total_rx_bytes < SZ_64K && hisr & REG_SDIO_HISR_RX_REQUEST);
  855. }
  856. static void rtw_sdio_handle_interrupt(struct sdio_func *sdio_func)
  857. {
  858. struct ieee80211_hw *hw = sdio_get_drvdata(sdio_func);
  859. struct rtw_sdio *rtwsdio;
  860. struct rtw_dev *rtwdev;
  861. u32 hisr;
  862. rtwdev = hw->priv;
  863. rtwsdio = (struct rtw_sdio *)rtwdev->priv;
  864. rtwsdio->irq_thread = current;
  865. hisr = rtw_read32(rtwdev, REG_SDIO_HISR);
  866. if (hisr & REG_SDIO_HISR_TXERR)
  867. rtw_sdio_tx_err_isr(rtwdev);
  868. if (hisr & REG_SDIO_HISR_RX_REQUEST) {
  869. hisr &= ~REG_SDIO_HISR_RX_REQUEST;
  870. rtw_sdio_rx_isr(rtwdev);
  871. }
  872. rtw_write32(rtwdev, REG_SDIO_HISR, hisr);
  873. rtwsdio->irq_thread = NULL;
  874. }
  875. static int __maybe_unused rtw_sdio_suspend(struct device *dev)
  876. {
  877. struct sdio_func *func = dev_to_sdio_func(dev);
  878. struct ieee80211_hw *hw = dev_get_drvdata(dev);
  879. struct rtw_dev *rtwdev = hw->priv;
  880. int ret;
  881. ret = sdio_set_host_pm_flags(func, MMC_PM_KEEP_POWER);
  882. if (ret)
  883. rtw_err(rtwdev, "Failed to host PM flag MMC_PM_KEEP_POWER");
  884. return ret;
  885. }
  886. static int __maybe_unused rtw_sdio_resume(struct device *dev)
  887. {
  888. return 0;
  889. }
  890. SIMPLE_DEV_PM_OPS(rtw_sdio_pm_ops, rtw_sdio_suspend, rtw_sdio_resume);
  891. EXPORT_SYMBOL(rtw_sdio_pm_ops);
  892. static int rtw_sdio_claim(struct rtw_dev *rtwdev, struct sdio_func *sdio_func)
  893. {
  894. struct rtw_sdio *rtwsdio = (struct rtw_sdio *)rtwdev->priv;
  895. int ret;
  896. sdio_claim_host(sdio_func);
  897. ret = sdio_enable_func(sdio_func);
  898. if (ret) {
  899. rtw_err(rtwdev, "Failed to enable SDIO func");
  900. goto err_release_host;
  901. }
  902. ret = sdio_set_block_size(sdio_func, RTW_SDIO_BLOCK_SIZE);
  903. if (ret) {
  904. rtw_err(rtwdev, "Failed to set SDIO block size to 512");
  905. goto err_disable_func;
  906. }
  907. rtwsdio->sdio_func = sdio_func;
  908. rtwsdio->sdio3_bus_mode = mmc_card_uhs(sdio_func->card);
  909. sdio_set_drvdata(sdio_func, rtwdev->hw);
  910. SET_IEEE80211_DEV(rtwdev->hw, &sdio_func->dev);
  911. sdio_release_host(sdio_func);
  912. return 0;
  913. err_disable_func:
  914. sdio_disable_func(sdio_func);
  915. err_release_host:
  916. sdio_release_host(sdio_func);
  917. return ret;
  918. }
  919. static void rtw_sdio_declaim(struct rtw_dev *rtwdev,
  920. struct sdio_func *sdio_func)
  921. {
  922. sdio_claim_host(sdio_func);
  923. sdio_disable_func(sdio_func);
  924. sdio_release_host(sdio_func);
  925. }
  926. static const struct rtw_hci_ops rtw_sdio_ops = {
  927. .tx_write = rtw_sdio_tx_write,
  928. .tx_kick_off = rtw_sdio_tx_kick_off,
  929. .setup = rtw_sdio_setup,
  930. .start = rtw_sdio_start,
  931. .stop = rtw_sdio_stop,
  932. .deep_ps = rtw_sdio_deep_ps,
  933. .link_ps = rtw_sdio_link_ps,
  934. .interface_cfg = rtw_sdio_interface_cfg,
  935. .dynamic_rx_agg = NULL,
  936. .write_firmware_page = rtw_write_firmware_page,
  937. .read8 = rtw_sdio_read8,
  938. .read16 = rtw_sdio_read16,
  939. .read32 = rtw_sdio_read32,
  940. .write8 = rtw_sdio_write8,
  941. .write16 = rtw_sdio_write16,
  942. .write32 = rtw_sdio_write32,
  943. .write_data_rsvd_page = rtw_sdio_write_data_rsvd_page,
  944. .write_data_h2c = rtw_sdio_write_data_h2c,
  945. };
  946. static int rtw_sdio_request_irq(struct rtw_dev *rtwdev,
  947. struct sdio_func *sdio_func)
  948. {
  949. int ret;
  950. sdio_claim_host(sdio_func);
  951. ret = sdio_claim_irq(sdio_func, &rtw_sdio_handle_interrupt);
  952. sdio_release_host(sdio_func);
  953. if (ret) {
  954. rtw_err(rtwdev, "failed to claim SDIO IRQ");
  955. return ret;
  956. }
  957. return 0;
  958. }
  959. static void rtw_sdio_indicate_tx_status(struct rtw_dev *rtwdev,
  960. struct sk_buff *skb)
  961. {
  962. struct rtw_sdio_tx_data *tx_data = rtw_sdio_get_tx_data(skb);
  963. struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
  964. struct ieee80211_hw *hw = rtwdev->hw;
  965. skb_pull(skb, rtwdev->chip->tx_pkt_desc_sz);
  966. /* enqueue to wait for tx report */
  967. if (info->flags & IEEE80211_TX_CTL_REQ_TX_STATUS) {
  968. rtw_tx_report_enqueue(rtwdev, skb, tx_data->sn);
  969. return;
  970. }
  971. /* always ACK for others, then they won't be marked as drop */
  972. ieee80211_tx_info_clear_status(info);
  973. if (info->flags & IEEE80211_TX_CTL_NO_ACK)
  974. info->flags |= IEEE80211_TX_STAT_NOACK_TRANSMITTED;
  975. else
  976. info->flags |= IEEE80211_TX_STAT_ACK;
  977. ieee80211_tx_status_irqsafe(hw, skb);
  978. }
  979. static void rtw_sdio_process_tx_queue(struct rtw_dev *rtwdev,
  980. enum rtw_tx_queue_type queue)
  981. {
  982. struct rtw_sdio *rtwsdio = (struct rtw_sdio *)rtwdev->priv;
  983. struct sk_buff *skb;
  984. int ret;
  985. skb = skb_dequeue(&rtwsdio->tx_queue[queue]);
  986. if (!skb)
  987. return;
  988. ret = rtw_sdio_write_port(rtwdev, skb, queue);
  989. if (ret) {
  990. skb_queue_head(&rtwsdio->tx_queue[queue], skb);
  991. return;
  992. }
  993. rtw_sdio_indicate_tx_status(rtwdev, skb);
  994. }
  995. static void rtw_sdio_tx_handler(struct work_struct *work)
  996. {
  997. struct rtw_sdio_work_data *work_data =
  998. container_of(work, struct rtw_sdio_work_data, work);
  999. struct rtw_sdio *rtwsdio;
  1000. struct rtw_dev *rtwdev;
  1001. int limit, queue;
  1002. rtwdev = work_data->rtwdev;
  1003. rtwsdio = (struct rtw_sdio *)rtwdev->priv;
  1004. if (!rtw_fw_feature_check(&rtwdev->fw, FW_FEATURE_TX_WAKE))
  1005. rtw_sdio_deep_ps_leave(rtwdev);
  1006. for (queue = RTK_MAX_TX_QUEUE_NUM - 1; queue >= 0; queue--) {
  1007. for (limit = 0; limit < 1000; limit++) {
  1008. rtw_sdio_process_tx_queue(rtwdev, queue);
  1009. if (skb_queue_empty(&rtwsdio->tx_queue[queue]))
  1010. break;
  1011. }
  1012. }
  1013. }
  1014. static void rtw_sdio_free_irq(struct rtw_dev *rtwdev,
  1015. struct sdio_func *sdio_func)
  1016. {
  1017. sdio_claim_host(sdio_func);
  1018. sdio_release_irq(sdio_func);
  1019. sdio_release_host(sdio_func);
  1020. }
  1021. static int rtw_sdio_init_tx(struct rtw_dev *rtwdev)
  1022. {
  1023. struct rtw_sdio *rtwsdio = (struct rtw_sdio *)rtwdev->priv;
  1024. int i;
  1025. rtwsdio->txwq = create_singlethread_workqueue("rtw88_sdio: tx wq");
  1026. if (!rtwsdio->txwq) {
  1027. rtw_err(rtwdev, "failed to create TX work queue\n");
  1028. return -ENOMEM;
  1029. }
  1030. for (i = 0; i < RTK_MAX_TX_QUEUE_NUM; i++)
  1031. skb_queue_head_init(&rtwsdio->tx_queue[i]);
  1032. rtwsdio->tx_handler_data = kmalloc_obj(*rtwsdio->tx_handler_data);
  1033. if (!rtwsdio->tx_handler_data)
  1034. goto err_destroy_wq;
  1035. rtwsdio->tx_handler_data->rtwdev = rtwdev;
  1036. INIT_WORK(&rtwsdio->tx_handler_data->work, rtw_sdio_tx_handler);
  1037. return 0;
  1038. err_destroy_wq:
  1039. destroy_workqueue(rtwsdio->txwq);
  1040. return -ENOMEM;
  1041. }
  1042. static void rtw_sdio_deinit_tx(struct rtw_dev *rtwdev)
  1043. {
  1044. struct rtw_sdio *rtwsdio = (struct rtw_sdio *)rtwdev->priv;
  1045. int i;
  1046. destroy_workqueue(rtwsdio->txwq);
  1047. kfree(rtwsdio->tx_handler_data);
  1048. for (i = 0; i < RTK_MAX_TX_QUEUE_NUM; i++)
  1049. ieee80211_purge_tx_queue(rtwdev->hw, &rtwsdio->tx_queue[i]);
  1050. }
  1051. int rtw_sdio_probe(struct sdio_func *sdio_func,
  1052. const struct sdio_device_id *id)
  1053. {
  1054. struct ieee80211_hw *hw;
  1055. struct rtw_dev *rtwdev;
  1056. int drv_data_size;
  1057. int ret;
  1058. drv_data_size = sizeof(struct rtw_dev) + sizeof(struct rtw_sdio);
  1059. hw = ieee80211_alloc_hw(drv_data_size, &rtw_ops);
  1060. if (!hw) {
  1061. dev_err(&sdio_func->dev, "failed to allocate hw");
  1062. return -ENOMEM;
  1063. }
  1064. rtwdev = hw->priv;
  1065. rtwdev->hw = hw;
  1066. rtwdev->dev = &sdio_func->dev;
  1067. rtwdev->chip = (struct rtw_chip_info *)id->driver_data;
  1068. rtwdev->hci.ops = &rtw_sdio_ops;
  1069. rtwdev->hci.type = RTW_HCI_TYPE_SDIO;
  1070. ret = rtw_core_init(rtwdev);
  1071. if (ret)
  1072. goto err_release_hw;
  1073. rtw_dbg(rtwdev, RTW_DBG_SDIO,
  1074. "rtw88 SDIO probe: vendor=0x%04x device=%04x class=%02x",
  1075. id->vendor, id->device, id->class);
  1076. ret = rtw_sdio_claim(rtwdev, sdio_func);
  1077. if (ret) {
  1078. rtw_err(rtwdev, "failed to claim SDIO device");
  1079. goto err_deinit_core;
  1080. }
  1081. rtw_sdio_init(rtwdev);
  1082. ret = rtw_sdio_init_tx(rtwdev);
  1083. if (ret) {
  1084. rtw_err(rtwdev, "failed to init SDIO TX queue\n");
  1085. goto err_sdio_declaim;
  1086. }
  1087. ret = rtw_chip_info_setup(rtwdev);
  1088. if (ret) {
  1089. rtw_err(rtwdev, "failed to setup chip information");
  1090. goto err_destroy_txwq;
  1091. }
  1092. ret = rtw_sdio_request_irq(rtwdev, sdio_func);
  1093. if (ret)
  1094. goto err_destroy_txwq;
  1095. ret = rtw_register_hw(rtwdev, hw);
  1096. if (ret) {
  1097. rtw_err(rtwdev, "failed to register hw");
  1098. goto err_free_irq;
  1099. }
  1100. return 0;
  1101. err_free_irq:
  1102. rtw_sdio_free_irq(rtwdev, sdio_func);
  1103. err_destroy_txwq:
  1104. rtw_sdio_deinit_tx(rtwdev);
  1105. err_sdio_declaim:
  1106. rtw_sdio_declaim(rtwdev, sdio_func);
  1107. err_deinit_core:
  1108. rtw_core_deinit(rtwdev);
  1109. err_release_hw:
  1110. ieee80211_free_hw(hw);
  1111. return ret;
  1112. }
  1113. EXPORT_SYMBOL(rtw_sdio_probe);
  1114. void rtw_sdio_remove(struct sdio_func *sdio_func)
  1115. {
  1116. struct ieee80211_hw *hw = sdio_get_drvdata(sdio_func);
  1117. struct rtw_dev *rtwdev;
  1118. if (!hw)
  1119. return;
  1120. rtwdev = hw->priv;
  1121. rtw_unregister_hw(rtwdev, hw);
  1122. rtw_sdio_disable_interrupt(rtwdev);
  1123. rtw_sdio_free_irq(rtwdev, sdio_func);
  1124. rtw_sdio_declaim(rtwdev, sdio_func);
  1125. rtw_sdio_deinit_tx(rtwdev);
  1126. rtw_core_deinit(rtwdev);
  1127. ieee80211_free_hw(hw);
  1128. }
  1129. EXPORT_SYMBOL(rtw_sdio_remove);
  1130. void rtw_sdio_shutdown(struct sdio_func *sdio_func)
  1131. {
  1132. const struct rtw_chip_info *chip;
  1133. struct ieee80211_hw *hw;
  1134. struct rtw_dev *rtwdev;
  1135. hw = sdio_get_drvdata(sdio_func);
  1136. if (!hw)
  1137. return;
  1138. rtwdev = hw->priv;
  1139. chip = rtwdev->chip;
  1140. if (chip->ops->shutdown)
  1141. chip->ops->shutdown(rtwdev);
  1142. }
  1143. EXPORT_SYMBOL(rtw_sdio_shutdown);
  1144. MODULE_AUTHOR("Martin Blumenstingl");
  1145. MODULE_AUTHOR("Jernej Skrabec");
  1146. MODULE_DESCRIPTION("Realtek 802.11ac wireless SDIO driver");
  1147. MODULE_LICENSE("Dual BSD/GPL");