osal.c 24 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183
  1. /*! \file
  2. \brief Declaration of library functions
  3. Any definitions in this file will be shared among GLUE Layer and internal Driver Stack.
  4. */
  5. /*******************************************************************************
  6. * C O M P I L E R F L A G S
  7. ********************************************************************************
  8. */
  9. /*******************************************************************************
  10. * M A C R O S
  11. ********************************************************************************
  12. */
  13. /*******************************************************************************
  14. * E X T E R N A L R E F E R E N C E S
  15. ********************************************************************************
  16. */
  17. #include "osal_typedef.h"
  18. #include "osal.h"
  19. /*******************************************************************************
  20. * C O N S T A N T S
  21. ********************************************************************************
  22. */
  23. #define GPIO_ASSERT 70
  24. /*******************************************************************************
  25. * D A T A T Y P E S
  26. ********************************************************************************
  27. */
  28. /*******************************************************************************
  29. * P U B L I C D A T A
  30. ********************************************************************************
  31. */
  32. /*******************************************************************************
  33. * P R I V A T E D A T A
  34. ********************************************************************************
  35. */
  36. /* CRC table for the CRC-16. The poly is 0x8005 (x^16 + x^15 + x^2 + 1) */
  37. static UINT16 const crc16_table[256] = {
  38. 0x0000, 0xC0C1, 0xC181, 0x0140, 0xC301, 0x03C0, 0x0280, 0xC241,
  39. 0xC601, 0x06C0, 0x0780, 0xC741, 0x0500, 0xC5C1, 0xC481, 0x0440,
  40. 0xCC01, 0x0CC0, 0x0D80, 0xCD41, 0x0F00, 0xCFC1, 0xCE81, 0x0E40,
  41. 0x0A00, 0xCAC1, 0xCB81, 0x0B40, 0xC901, 0x09C0, 0x0880, 0xC841,
  42. 0xD801, 0x18C0, 0x1980, 0xD941, 0x1B00, 0xDBC1, 0xDA81, 0x1A40,
  43. 0x1E00, 0xDEC1, 0xDF81, 0x1F40, 0xDD01, 0x1DC0, 0x1C80, 0xDC41,
  44. 0x1400, 0xD4C1, 0xD581, 0x1540, 0xD701, 0x17C0, 0x1680, 0xD641,
  45. 0xD201, 0x12C0, 0x1380, 0xD341, 0x1100, 0xD1C1, 0xD081, 0x1040,
  46. 0xF001, 0x30C0, 0x3180, 0xF141, 0x3300, 0xF3C1, 0xF281, 0x3240,
  47. 0x3600, 0xF6C1, 0xF781, 0x3740, 0xF501, 0x35C0, 0x3480, 0xF441,
  48. 0x3C00, 0xFCC1, 0xFD81, 0x3D40, 0xFF01, 0x3FC0, 0x3E80, 0xFE41,
  49. 0xFA01, 0x3AC0, 0x3B80, 0xFB41, 0x3900, 0xF9C1, 0xF881, 0x3840,
  50. 0x2800, 0xE8C1, 0xE981, 0x2940, 0xEB01, 0x2BC0, 0x2A80, 0xEA41,
  51. 0xEE01, 0x2EC0, 0x2F80, 0xEF41, 0x2D00, 0xEDC1, 0xEC81, 0x2C40,
  52. 0xE401, 0x24C0, 0x2580, 0xE541, 0x2700, 0xE7C1, 0xE681, 0x2640,
  53. 0x2200, 0xE2C1, 0xE381, 0x2340, 0xE101, 0x21C0, 0x2080, 0xE041,
  54. 0xA001, 0x60C0, 0x6180, 0xA141, 0x6300, 0xA3C1, 0xA281, 0x6240,
  55. 0x6600, 0xA6C1, 0xA781, 0x6740, 0xA501, 0x65C0, 0x6480, 0xA441,
  56. 0x6C00, 0xACC1, 0xAD81, 0x6D40, 0xAF01, 0x6FC0, 0x6E80, 0xAE41,
  57. 0xAA01, 0x6AC0, 0x6B80, 0xAB41, 0x6900, 0xA9C1, 0xA881, 0x6840,
  58. 0x7800, 0xB8C1, 0xB981, 0x7940, 0xBB01, 0x7BC0, 0x7A80, 0xBA41,
  59. 0xBE01, 0x7EC0, 0x7F80, 0xBF41, 0x7D00, 0xBDC1, 0xBC81, 0x7C40,
  60. 0xB401, 0x74C0, 0x7580, 0xB541, 0x7700, 0xB7C1, 0xB681, 0x7640,
  61. 0x7200, 0xB2C1, 0xB381, 0x7340, 0xB101, 0x71C0, 0x7080, 0xB041,
  62. 0x5000, 0x90C1, 0x9181, 0x5140, 0x9301, 0x53C0, 0x5280, 0x9241,
  63. 0x9601, 0x56C0, 0x5780, 0x9741, 0x5500, 0x95C1, 0x9481, 0x5440,
  64. 0x9C01, 0x5CC0, 0x5D80, 0x9D41, 0x5F00, 0x9FC1, 0x9E81, 0x5E40,
  65. 0x5A00, 0x9AC1, 0x9B81, 0x5B40, 0x9901, 0x59C0, 0x5880, 0x9841,
  66. 0x8801, 0x48C0, 0x4980, 0x8941, 0x4B00, 0x8BC1, 0x8A81, 0x4A40,
  67. 0x4E00, 0x8EC1, 0x8F81, 0x4F40, 0x8D01, 0x4DC0, 0x4C80, 0x8C41,
  68. 0x4400, 0x84C1, 0x8581, 0x4540, 0x8701, 0x47C0, 0x4680, 0x8641,
  69. 0x8201, 0x42C0, 0x4380, 0x8341, 0x4100, 0x81C1, 0x8081, 0x4040
  70. };
  71. /*******************************************************************************
  72. * F U N C T I O N D E C L A R A T I O N S
  73. ********************************************************************************
  74. */
  75. /*******************************************************************************
  76. * F U N C T I O N S
  77. ********************************************************************************
  78. */
  79. /*string operations*/
  80. _osal_inline_ UINT32 osal_strlen(const PINT8 str)
  81. {
  82. return strlen(str);
  83. }
  84. _osal_inline_ INT32 osal_strcmp(const PINT8 dst, const PINT8 src)
  85. {
  86. return strcmp(dst, src);
  87. }
  88. _osal_inline_ INT32 osal_strncmp(const PINT8 dst, const PINT8 src, UINT32 len)
  89. {
  90. return strncmp(dst, src, len);
  91. }
  92. _osal_inline_ PINT8 osal_strcpy(PINT8 dst, const PINT8 src)
  93. {
  94. return strcpy(dst, src);
  95. }
  96. _osal_inline_ PINT8 osal_strncpy(PINT8 dst, const PINT8 src, UINT32 len)
  97. {
  98. return strncpy(dst, src, len);
  99. }
  100. _osal_inline_ PINT8 osal_strcat(PINT8 dst, const PINT8 src)
  101. {
  102. return strcat(dst, src);
  103. }
  104. _osal_inline_ PINT8 osal_strncat(PINT8 dst, const PINT8 src, UINT32 len)
  105. {
  106. return strncat(dst, src, len);
  107. }
  108. _osal_inline_ PINT8 osal_strchr(const PINT8 str, UINT8 c)
  109. {
  110. return strchr(str, c);
  111. }
  112. _osal_inline_ PINT8 osal_strsep(PPINT8 str, const PINT8 c)
  113. {
  114. return strsep(str, c);
  115. }
  116. _osal_inline_ VOID osal_bug_on(UINT32 val)
  117. {
  118. BUG_ON(val);
  119. }
  120. _osal_inline_ INT32 osal_strtol(const PINT8 str, UINT32 adecimal, long *res)
  121. {
  122. return kstrtol(str, adecimal, res);
  123. }
  124. _osal_inline_ PINT8 osal_strstr(PINT8 str1, const PINT8 str2)
  125. {
  126. return strstr(str1, str2);
  127. }
  128. _osal_inline_ PINT8 osal_strnstr(PINT8 str1, const PINT8 str2, INT32 n)
  129. {
  130. return strnstr(str1, str2, n);
  131. }
  132. INT32 osal_snprintf(PINT8 buf, UINT32 len, const PINT8 fmt, ...)
  133. {
  134. INT32 iRet = 0;
  135. va_list args;
  136. /*va_start(args, fmt); */
  137. va_start(args, fmt);
  138. /*iRet = snprintf(buf, len, fmt, args); TODO: [FixMe][GeorgeKuo] BUG? */
  139. iRet = vsnprintf(buf, len, fmt, args);
  140. va_end(args);
  141. return iRet;
  142. }
  143. INT32 osal_print(const PINT8 str, ...)
  144. {
  145. va_list args;
  146. INT8 tempString[DBG_LOG_STR_SIZE];
  147. va_start(args, str);
  148. vsnprintf(tempString, DBG_LOG_STR_SIZE, str, args);
  149. va_end(args);
  150. pr_warn("%s", tempString);
  151. return 0;
  152. }
  153. INT32 osal_dbg_print(const PINT8 str, ...)
  154. {
  155. va_list args;
  156. INT8 tempString[DBG_LOG_STR_SIZE];
  157. va_start(args, str);
  158. vsnprintf(tempString, DBG_LOG_STR_SIZE, str, args);
  159. va_end(args);
  160. pr_debug("%s", tempString);
  161. return 0;
  162. }
  163. INT32 osal_dbg_assert(INT32 expr, const PINT8 file, INT32 line)
  164. {
  165. if (!expr) {
  166. pr_warn("%s (%d)\n", file, line);
  167. /*BUG_ON(!expr); */
  168. #ifdef CFG_COMMON_GPIO_DBG_PIN
  169. /* package this part */
  170. gpio_direction_output(GPIO_ASSERT, 0);
  171. pr_warn("toggle GPIO_ASSERT = %d\n", GPIO_ASSERT);
  172. udelay(10);
  173. gpio_set_value(GPIO_ASSERT, 1);
  174. #endif
  175. return 1;
  176. }
  177. return 0;
  178. }
  179. INT32 osal_dbg_assert_aee(const PINT8 module, const PINT8 detail_description)
  180. {
  181. osal_err_print("[WMT-ASSERT]" "[E][Module]:%s, [INFO]%s\n", module, detail_description);
  182. #ifdef CONFIG_MTK_AEE_FEATURE
  183. aee_kernel_warning(module, detail_description);
  184. #endif
  185. return 0;
  186. }
  187. INT32 osal_sprintf(PINT8 str, const PINT8 format, ...)
  188. {
  189. INT32 iRet = 0;
  190. va_list args;
  191. va_start(args, format);
  192. iRet = vsnprintf(str, DBG_LOG_STR_SIZE, format, args);
  193. va_end(args);
  194. return iRet;
  195. }
  196. _osal_inline_ PVOID osal_malloc(UINT32 size)
  197. {
  198. return vmalloc(size);
  199. }
  200. _osal_inline_ VOID osal_free(const PVOID dst)
  201. {
  202. vfree(dst);
  203. }
  204. _osal_inline_ PVOID osal_memset(PVOID buf, INT32 i, UINT32 len)
  205. {
  206. return memset(buf, i, len);
  207. }
  208. _osal_inline_ PVOID osal_memcpy(PVOID dst, const PVOID src, UINT32 len)
  209. {
  210. return memcpy(dst, src, len);
  211. }
  212. _osal_inline_ INT32 osal_memcmp(const PVOID buf1, const PVOID buf2, UINT32 len)
  213. {
  214. return memcmp(buf1, buf2, len);
  215. }
  216. _osal_inline_ UINT16 osal_crc16(const PUINT8 buffer, const UINT32 length)
  217. {
  218. UINT16 crc = 0;
  219. UINT32 i = 0;
  220. PUINT8 temp = buffer;
  221. /* FIXME: Add STP checksum feature */
  222. crc = 0;
  223. for (i = 0; i < length; i++, temp++)
  224. crc = (crc >> 8) ^ crc16_table[(crc ^ (*temp)) & 0xff];
  225. return crc;
  226. }
  227. /*
  228. *OSAL layer Thread Opeartion related APIs
  229. *
  230. *
  231. */
  232. _osal_inline_ INT32 osal_thread_create(P_OSAL_THREAD pThread)
  233. {
  234. pThread->pThread = kthread_create(pThread->pThreadFunc,
  235. pThread->pThreadData, pThread->threadName);
  236. if (NULL == pThread->pThread)
  237. return -1;
  238. return 0;
  239. }
  240. _osal_inline_ INT32 osal_thread_run(P_OSAL_THREAD pThread)
  241. {
  242. if (pThread->pThread) {
  243. wake_up_process(pThread->pThread);
  244. return 0;
  245. } else {
  246. return -1;
  247. }
  248. }
  249. _osal_inline_ INT32 osal_thread_stop(P_OSAL_THREAD pThread)
  250. {
  251. INT32 iRet;
  252. if ((pThread) && (pThread->pThread)) {
  253. iRet = kthread_stop(pThread->pThread);
  254. /* pThread->pThread = NULL; */
  255. return iRet;
  256. }
  257. return -1;
  258. }
  259. _osal_inline_ INT32 osal_thread_should_stop(P_OSAL_THREAD pThread)
  260. {
  261. if ((pThread) && (pThread->pThread))
  262. return kthread_should_stop();
  263. else
  264. return 1;
  265. }
  266. _osal_inline_ INT32
  267. osal_thread_wait_for_event(P_OSAL_THREAD pThread,
  268. P_OSAL_EVENT pEvent, P_OSAL_EVENT_CHECKER pChecker)
  269. {
  270. /* P_DEV_WMT pDevWmt;*/
  271. if ((pThread) && (pThread->pThread) && (pEvent) && (pChecker)) {
  272. /* pDevWmt = (P_DEV_WMT)(pThread->pThreadData); */
  273. return wait_event_interruptible(pEvent->waitQueue, (/*!RB_EMPTY(&pDevWmt->rActiveOpQ) || */
  274. osal_thread_should_stop
  275. (pThread)
  276. ||
  277. (*pChecker) (pThread)));
  278. }
  279. return -1;
  280. }
  281. _osal_inline_ INT32 osal_thread_destroy(P_OSAL_THREAD pThread)
  282. {
  283. if (pThread && (pThread->pThread)) {
  284. kthread_stop(pThread->pThread);
  285. pThread->pThread = NULL;
  286. }
  287. return 0;
  288. }
  289. /*
  290. *OSAL layer Signal Opeartion related APIs
  291. *initialization
  292. *wait for signal
  293. *wait for signal timerout
  294. *raise signal
  295. *destroy a signal
  296. *
  297. */
  298. _osal_inline_ INT32 osal_signal_init(P_OSAL_SIGNAL pSignal)
  299. {
  300. if (pSignal) {
  301. init_completion(&pSignal->comp);
  302. return 0;
  303. } else {
  304. return -1;
  305. }
  306. }
  307. _osal_inline_ INT32 osal_wait_for_signal(P_OSAL_SIGNAL pSignal)
  308. {
  309. if (pSignal) {
  310. wait_for_completion_interruptible(&pSignal->comp);
  311. return 0;
  312. } else {
  313. return -1;
  314. }
  315. }
  316. _osal_inline_ INT32 osal_wait_for_signal_timeout(P_OSAL_SIGNAL pSignal)
  317. {
  318. /* return wait_for_completion_interruptible_timeout(&pSignal->comp, msecs_to_jiffies(pSignal->timeoutValue)); */
  319. /* [ChangeFeature][George] gps driver may be closed by -ERESTARTSYS.
  320. * Avoid using *interruptible" version in order to complete our jobs, such
  321. * as function off gracefully.
  322. */
  323. return wait_for_completion_timeout(&pSignal->comp, msecs_to_jiffies(pSignal->timeoutValue));
  324. }
  325. _osal_inline_ INT32 osal_raise_signal(P_OSAL_SIGNAL pSignal)
  326. {
  327. if (pSignal) {
  328. complete(&pSignal->comp);
  329. return 0;
  330. } else
  331. return -1;
  332. }
  333. _osal_inline_ INT32 osal_signal_active_state(P_OSAL_SIGNAL pSignal)
  334. {
  335. if (pSignal)
  336. return pSignal->timeoutValue;
  337. else
  338. return -1;
  339. }
  340. _osal_inline_ INT32 osal_signal_deinit(P_OSAL_SIGNAL pSignal)
  341. {
  342. if (pSignal) {
  343. pSignal->timeoutValue = 0;
  344. return 0;
  345. } else
  346. return -1;
  347. }
  348. /*
  349. *OSAL layer Event Opeartion related APIs
  350. *initialization
  351. *wait for signal
  352. *wait for signal timerout
  353. *raise signal
  354. *destroy a signal
  355. *
  356. */
  357. INT32 osal_event_init(P_OSAL_EVENT pEvent)
  358. {
  359. if (pEvent) {
  360. init_waitqueue_head(&pEvent->waitQueue);
  361. return 0;
  362. } else
  363. return -1;
  364. }
  365. INT32 osal_wait_for_event(P_OSAL_EVENT pEvent, INT32(*condition) (PVOID), PVOID cond_pa)
  366. {
  367. if (pEvent)
  368. return wait_event_interruptible(pEvent->waitQueue, condition(cond_pa));
  369. else
  370. return -1;
  371. }
  372. INT32 osal_wait_for_event_timeout(P_OSAL_EVENT pEvent, INT32(*condition) (PVOID), PVOID cond_pa)
  373. {
  374. if (pEvent)
  375. return wait_event_interruptible_timeout(pEvent->waitQueue,
  376. condition(cond_pa),
  377. msecs_to_jiffies(pEvent->timeoutValue));
  378. return -1;
  379. }
  380. INT32 osal_trigger_event(P_OSAL_EVENT pEvent)
  381. {
  382. INT32 ret = 0;
  383. if (pEvent) {
  384. wake_up_interruptible(&pEvent->waitQueue);
  385. return ret;
  386. }
  387. return -1;
  388. }
  389. INT32 osal_event_deinit(P_OSAL_EVENT pEvent)
  390. {
  391. return 0;
  392. }
  393. _osal_inline_ INT32 osal_wait_for_event_bit_set(P_OSAL_EVENT pEvent, PUINT32 pState,
  394. UINT32 bitOffset)
  395. {
  396. UINT32 ms = 0;
  397. if (pEvent) {
  398. ms = pEvent->timeoutValue;
  399. if (ms != 0)
  400. return wait_event_interruptible_timeout(pEvent->waitQueue,
  401. test_bit(bitOffset,
  402. ((unsigned long *)
  403. pState)),
  404. msecs_to_jiffies(ms));
  405. else
  406. return wait_event_interruptible(pEvent->waitQueue,
  407. test_bit(bitOffset,
  408. ((unsigned long *)pState)));
  409. } else
  410. return -1;
  411. }
  412. _osal_inline_ INT32 osal_wait_for_event_bit_clr(P_OSAL_EVENT pEvent, PUINT32 pState,
  413. UINT32 bitOffset)
  414. {
  415. UINT32 ms = 0;
  416. if (pEvent) {
  417. ms = pEvent->timeoutValue;
  418. if (ms != 0)
  419. return wait_event_interruptible_timeout(pEvent->waitQueue,
  420. !test_bit(bitOffset,
  421. ((unsigned long *)
  422. pState)),
  423. msecs_to_jiffies(ms));
  424. else
  425. return wait_event_interruptible(pEvent->waitQueue,
  426. !test_bit(bitOffset,
  427. ((unsigned long *)pState)));
  428. } else
  429. return -1;
  430. }
  431. /*
  432. *bit test and set/clear operations APIs
  433. *
  434. *
  435. */
  436. #if OS_BIT_OPS_SUPPORT
  437. #define osal_bit_op_lock(x)
  438. #define osal_bit_op_unlock(x)
  439. #else
  440. _osal_inline_ INT32 osal_bit_op_lock(P_OSAL_UNSLEEPABLE_LOCK pLock)
  441. {
  442. return 0;
  443. }
  444. _osal_inline_ INT32 osal_bit_op_unlock(P_OSAL_UNSLEEPABLE_LOCK pLock)
  445. {
  446. return 0;
  447. }
  448. #endif
  449. _osal_inline_ INT32 osal_clear_bit(UINT32 bitOffset, P_OSAL_BIT_OP_VAR pData)
  450. {
  451. osal_bit_op_lock(&(pData->opLock));
  452. clear_bit(bitOffset, ((unsigned long *)&pData->data));
  453. osal_bit_op_unlock(&(pData->opLock));
  454. return 0;
  455. }
  456. _osal_inline_ INT32 osal_set_bit(UINT32 bitOffset, P_OSAL_BIT_OP_VAR pData)
  457. {
  458. osal_bit_op_lock(&(pData->opLock));
  459. set_bit(bitOffset, ((unsigned long *)&pData->data));
  460. osal_bit_op_unlock(&(pData->opLock));
  461. return 0;
  462. }
  463. _osal_inline_ INT32 osal_test_bit(UINT32 bitOffset, P_OSAL_BIT_OP_VAR pData)
  464. {
  465. UINT32 iRet = 0;
  466. osal_bit_op_lock(&(pData->opLock));
  467. iRet = test_bit(bitOffset, ((unsigned long *)&pData->data));
  468. osal_bit_op_unlock(&(pData->opLock));
  469. return iRet;
  470. }
  471. _osal_inline_ INT32 osal_test_and_clear_bit(UINT32 bitOffset, P_OSAL_BIT_OP_VAR pData)
  472. {
  473. UINT32 iRet = 0;
  474. osal_bit_op_lock(&(pData->opLock));
  475. iRet = test_and_clear_bit(bitOffset, ((unsigned long *)&pData->data));
  476. osal_bit_op_unlock(&(pData->opLock));
  477. return iRet;
  478. }
  479. _osal_inline_ INT32 osal_test_and_set_bit(UINT32 bitOffset, P_OSAL_BIT_OP_VAR pData)
  480. {
  481. UINT32 iRet = 0;
  482. osal_bit_op_lock(&(pData->opLock));
  483. iRet = test_and_set_bit(bitOffset, ((unsigned long *)&pData->data));
  484. osal_bit_op_unlock(&(pData->opLock));
  485. return iRet;
  486. }
  487. /*
  488. *tiemr operations APIs
  489. *create
  490. *stop
  491. * modify
  492. *create
  493. *delete
  494. *
  495. */
  496. INT32 osal_timer_create(P_OSAL_TIMER pTimer)
  497. {
  498. struct timer_list *timer = &pTimer->timer;
  499. init_timer(timer);
  500. timer->function = pTimer->timeoutHandler;
  501. timer->data = (unsigned long)pTimer->timeroutHandlerData;
  502. return 0;
  503. }
  504. INT32 osal_timer_start(P_OSAL_TIMER pTimer, UINT32 ms)
  505. {
  506. struct timer_list *timer = &pTimer->timer;
  507. timer->expires = jiffies + (ms / (1000 / HZ));
  508. add_timer(timer);
  509. return 0;
  510. }
  511. INT32 osal_timer_stop(P_OSAL_TIMER pTimer)
  512. {
  513. struct timer_list *timer = &pTimer->timer;
  514. del_timer(timer);
  515. return 0;
  516. }
  517. INT32 osal_timer_stop_sync(P_OSAL_TIMER pTimer)
  518. {
  519. struct timer_list *timer = &pTimer->timer;
  520. del_timer_sync(timer);
  521. return 0;
  522. }
  523. INT32 osal_timer_modify(P_OSAL_TIMER pTimer, UINT32 ms)
  524. {
  525. mod_timer(&pTimer->timer, jiffies + (ms) / (1000 / HZ));
  526. return 0;
  527. }
  528. INT32 _osal_fifo_init(OSAL_FIFO *pFifo, PUINT8 buf, UINT32 size)
  529. {
  530. struct kfifo *fifo = NULL;
  531. INT32 ret = -1;
  532. if (!pFifo || pFifo->pFifoBody) {
  533. pr_err("pFifo must be !NULL, pFifo->pFifoBody must be NULL\n");
  534. if (!pFifo)
  535. pr_err("pFifo is NULL\n");
  536. else if (!pFifo->pFifoBody)
  537. pr_err("pFifo->pFifoBody is NULL\n");
  538. return -1;
  539. }
  540. fifo = kzalloc(sizeof(struct kfifo), GFP_ATOMIC);
  541. if (!buf) {
  542. /*fifo's buffer is not ready, we allocate automatically */
  543. ret = kfifo_alloc(fifo, size, /*GFP_KERNEL */ GFP_ATOMIC);
  544. } else {
  545. if (is_power_of_2(size)) {
  546. kfifo_init(fifo, buf, size);
  547. ret = 0;
  548. } else {
  549. kfifo_free(fifo);
  550. fifo = NULL;
  551. ret = -1;
  552. }
  553. }
  554. pFifo->pFifoBody = fifo;
  555. return (ret < 0) ? (-1) : (0);
  556. }
  557. INT32 _osal_fifo_deinit(OSAL_FIFO *pFifo)
  558. {
  559. struct kfifo *fifo = NULL;
  560. if (!pFifo || !pFifo->pFifoBody) {
  561. pr_warn("%s:pFifo = NULL or pFifo->pFifoBody = NULL, error\n", __func__);
  562. return -1;
  563. }
  564. fifo = (struct kfifo *)pFifo->pFifoBody;
  565. if (fifo)
  566. kfifo_free(fifo);
  567. return 0;
  568. }
  569. INT32 _osal_fifo_size(OSAL_FIFO *pFifo)
  570. {
  571. struct kfifo *fifo = NULL;
  572. INT32 ret = 0;
  573. if (!pFifo || !pFifo->pFifoBody) {
  574. pr_warn("%s:pFifo = NULL or pFifo->pFifoBody = NULL, error\n", __func__);
  575. return -1;
  576. }
  577. fifo = (struct kfifo *)pFifo->pFifoBody;
  578. if (fifo)
  579. ret = kfifo_size(fifo);
  580. return ret;
  581. }
  582. /*returns unused bytes in fifo*/
  583. INT32 _osal_fifo_avail_size(OSAL_FIFO *pFifo)
  584. {
  585. struct kfifo *fifo = NULL;
  586. INT32 ret = 0;
  587. if (!pFifo || !pFifo->pFifoBody) {
  588. pr_warn("%s:pFifo = NULL or pFifo->pFifoBody = NULL, error\n", __func__);
  589. return -1;
  590. }
  591. fifo = (struct kfifo *)pFifo->pFifoBody;
  592. if (fifo)
  593. ret = kfifo_avail(fifo);
  594. return ret;
  595. }
  596. /*returns used bytes in fifo*/
  597. INT32 _osal_fifo_len(OSAL_FIFO *pFifo)
  598. {
  599. struct kfifo *fifo = NULL;
  600. INT32 ret = 0;
  601. if (!pFifo || !pFifo->pFifoBody) {
  602. pr_warn("%s:pFifo = NULL or pFifo->pFifoBody = NULL, error\n", __func__);
  603. return -1;
  604. }
  605. fifo = (struct kfifo *)pFifo->pFifoBody;
  606. if (fifo)
  607. ret = kfifo_len(fifo);
  608. return ret;
  609. }
  610. INT32 _osal_fifo_is_empty(OSAL_FIFO *pFifo)
  611. {
  612. struct kfifo *fifo = NULL;
  613. INT32 ret = 0;
  614. if (!pFifo || !pFifo->pFifoBody) {
  615. pr_warn("%s:pFifo = NULL or pFifo->pFifoBody = NULL, error\n", __func__);
  616. return -1;
  617. }
  618. fifo = (struct kfifo *)pFifo->pFifoBody;
  619. if (fifo)
  620. ret = kfifo_is_empty(fifo);
  621. return ret;
  622. }
  623. INT32 _osal_fifo_is_full(OSAL_FIFO *pFifo)
  624. {
  625. struct kfifo *fifo = NULL;
  626. INT32 ret = 0;
  627. if (!pFifo || !pFifo->pFifoBody) {
  628. pr_warn("%s:pFifo = NULL or pFifo->pFifoBody = NULL, error\n", __func__);
  629. return -1;
  630. }
  631. fifo = (struct kfifo *)pFifo->pFifoBody;
  632. if (fifo)
  633. ret = kfifo_is_full(fifo);
  634. return ret;
  635. }
  636. INT32 _osal_fifo_data_in(OSAL_FIFO *pFifo, const PVOID buf, UINT32 len)
  637. {
  638. struct kfifo *fifo = NULL;
  639. INT32 ret = 0;
  640. if (!pFifo || !pFifo->pFifoBody) {
  641. pr_warn("%s:pFifo = NULL or pFifo->pFifoBody = NULL, error\n", __func__);
  642. return -1;
  643. }
  644. fifo = (struct kfifo *)pFifo->pFifoBody;
  645. if (fifo && buf && (len <= _osal_fifo_avail_size(pFifo)))
  646. ret = kfifo_in(fifo, buf, len);
  647. else {
  648. pr_warn("%s: kfifo_in, error, len = %d, _osal_fifo_avail_size = %d, buf=%p\n",
  649. __func__, len, _osal_fifo_avail_size(pFifo), buf);
  650. ret = 0;
  651. }
  652. return ret;
  653. }
  654. INT32 _osal_fifo_data_out(OSAL_FIFO *pFifo, PVOID buf, UINT32 len)
  655. {
  656. struct kfifo *fifo = NULL;
  657. INT32 ret = 0;
  658. if (!pFifo || !pFifo->pFifoBody) {
  659. pr_warn("%s:pFifo = NULL or pFifo->pFifoBody = NULL, error\n", __func__);
  660. return -1;
  661. }
  662. fifo = (struct kfifo *)pFifo->pFifoBody;
  663. if (fifo && buf && (len <= _osal_fifo_len(pFifo)))
  664. ret = kfifo_out(fifo, buf, len);
  665. else {
  666. pr_warn("%s: kfifo_out, error, len = %d, osal_fifo_len = %d, buf=%p\n",
  667. __func__, len, _osal_fifo_len(pFifo), buf);
  668. ret = 0;
  669. }
  670. return ret;
  671. }
  672. INT32 _osal_fifo_reset(OSAL_FIFO *pFifo)
  673. {
  674. struct kfifo *fifo = NULL;
  675. if (!pFifo || !pFifo->pFifoBody) {
  676. pr_warn("%s:pFifo = NULL or pFifo->pFifoBody = NULL, error\n", __func__);
  677. return -1;
  678. }
  679. fifo = (struct kfifo *)pFifo->pFifoBody;
  680. if (fifo)
  681. kfifo_reset(fifo);
  682. return 0;
  683. }
  684. INT32 osal_fifo_init(P_OSAL_FIFO pFifo, PUINT8 buffer, UINT32 size)
  685. {
  686. if (!pFifo) {
  687. pr_warn("%s:pFifo = NULL, error\n", __func__);
  688. return -1;
  689. }
  690. pFifo->FifoInit = _osal_fifo_init;
  691. pFifo->FifoDeInit = _osal_fifo_deinit;
  692. pFifo->FifoSz = _osal_fifo_size;
  693. pFifo->FifoAvailSz = _osal_fifo_avail_size;
  694. pFifo->FifoLen = _osal_fifo_len;
  695. pFifo->FifoIsEmpty = _osal_fifo_is_empty;
  696. pFifo->FifoIsFull = _osal_fifo_is_full;
  697. pFifo->FifoDataIn = _osal_fifo_data_in;
  698. pFifo->FifoDataOut = _osal_fifo_data_out;
  699. pFifo->FifoReset = _osal_fifo_reset;
  700. if (NULL != pFifo->pFifoBody) {
  701. pr_warn
  702. ("%s:Because pFifo room is avialable, we clear the room and allocate them again.\n",
  703. __func__);
  704. pFifo->FifoDeInit(pFifo->pFifoBody);
  705. pFifo->pFifoBody = NULL;
  706. }
  707. pFifo->FifoInit(pFifo, buffer, size);
  708. return 0;
  709. }
  710. VOID osal_fifo_deinit(P_OSAL_FIFO pFifo)
  711. {
  712. if (pFifo) {
  713. pFifo->FifoDeInit(pFifo);
  714. kfree(pFifo->pFifoBody);
  715. } else
  716. pr_warn("%s:pFifo = NULL, error\n", __func__);
  717. }
  718. INT32 osal_fifo_reset(P_OSAL_FIFO pFifo)
  719. {
  720. INT32 ret = -1;
  721. if (pFifo)
  722. ret = pFifo->FifoReset(pFifo);
  723. else
  724. pr_warn("%s:pFifo = NULL, error\n", __func__);
  725. return ret;
  726. }
  727. UINT32 osal_fifo_in(P_OSAL_FIFO pFifo, PUINT8 buffer, UINT32 size)
  728. {
  729. UINT32 ret = 0;
  730. if (pFifo)
  731. ret = pFifo->FifoDataIn(pFifo, buffer, size);
  732. else
  733. pr_warn("%s:pFifo = NULL, error\n", __func__);
  734. return ret;
  735. }
  736. UINT32 osal_fifo_out(P_OSAL_FIFO pFifo, PUINT8 buffer, UINT32 size)
  737. {
  738. UINT32 ret = 0;
  739. if (pFifo)
  740. ret = pFifo->FifoDataOut(pFifo, buffer, size);
  741. else
  742. pr_warn("%s:pFifo = NULL, error\n", __func__);
  743. return ret;
  744. }
  745. UINT32 osal_fifo_len(P_OSAL_FIFO pFifo)
  746. {
  747. UINT32 ret = 0;
  748. if (pFifo)
  749. ret = pFifo->FifoLen(pFifo);
  750. else
  751. pr_warn("%s:pFifo = NULL, error\n", __func__);
  752. return ret;
  753. }
  754. UINT32 osal_fifo_sz(P_OSAL_FIFO pFifo)
  755. {
  756. UINT32 ret = 0;
  757. if (pFifo)
  758. ret = pFifo->FifoSz(pFifo);
  759. else
  760. pr_warn("%s:pFifo = NULL, error\n", __func__);
  761. return ret;
  762. }
  763. UINT32 osal_fifo_avail(P_OSAL_FIFO pFifo)
  764. {
  765. UINT32 ret = 0;
  766. if (pFifo)
  767. ret = pFifo->FifoAvailSz(pFifo);
  768. else
  769. pr_warn("%s:pFifo = NULL, error\n", __func__);
  770. return ret;
  771. }
  772. UINT32 osal_fifo_is_empty(P_OSAL_FIFO pFifo)
  773. {
  774. UINT32 ret = 0;
  775. if (pFifo)
  776. ret = pFifo->FifoIsEmpty(pFifo);
  777. else
  778. pr_warn("%s:pFifo = NULL, error\n", __func__);
  779. return ret;
  780. }
  781. UINT32 osal_fifo_is_full(P_OSAL_FIFO pFifo)
  782. {
  783. UINT32 ret = 0;
  784. if (pFifo)
  785. ret = pFifo->FifoIsFull(pFifo);
  786. else
  787. pr_warn("%s:pFifo = NULL, error\n", __func__);
  788. return ret;
  789. }
  790. INT32 osal_wake_lock_init(P_OSAL_WAKE_LOCK pLock)
  791. {
  792. INT32 ret = -1;
  793. if (pLock) {
  794. wake_lock_init(&pLock->wake_lock, WAKE_LOCK_SUSPEND, pLock->name);
  795. wake_unlock(&pLock->wake_lock);
  796. ret = 0;
  797. }
  798. return ret;
  799. }
  800. INT32 osal_wake_lock(P_OSAL_WAKE_LOCK pLock)
  801. {
  802. INT32 ret = -1;
  803. if (pLock) {
  804. wake_lock(&pLock->wake_lock);
  805. ret = 0;
  806. }
  807. return ret;
  808. }
  809. INT32 osal_wake_unlock(P_OSAL_WAKE_LOCK pLock)
  810. {
  811. INT32 ret = -1;
  812. if (pLock) {
  813. wake_unlock(&pLock->wake_lock);
  814. ret = 0;
  815. }
  816. return ret;
  817. }
  818. INT32 osal_wake_lock_count(P_OSAL_WAKE_LOCK pLock)
  819. {
  820. INT32 count = -1;
  821. if (pLock)
  822. count = wake_lock_active(&pLock->wake_lock);
  823. return count;
  824. }
  825. /*
  826. *sleepable lock operations APIs
  827. *init
  828. *lock
  829. *unlock
  830. *destroy
  831. *
  832. */
  833. #if !defined(CONFIG_PROVE_LOCKING)
  834. INT32 osal_unsleepable_lock_init(P_OSAL_UNSLEEPABLE_LOCK pUSL)
  835. {
  836. spin_lock_init(&(pUSL->lock));
  837. return 0;
  838. }
  839. #endif
  840. INT32 osal_lock_unsleepable_lock(P_OSAL_UNSLEEPABLE_LOCK pUSL)
  841. {
  842. spin_lock_irqsave(&(pUSL->lock), pUSL->flag);
  843. return 0;
  844. }
  845. INT32 osal_unlock_unsleepable_lock(P_OSAL_UNSLEEPABLE_LOCK pUSL)
  846. {
  847. spin_unlock_irqrestore(&(pUSL->lock), pUSL->flag);
  848. return 0;
  849. }
  850. INT32 osal_unsleepable_lock_deinit(P_OSAL_UNSLEEPABLE_LOCK pUSL)
  851. {
  852. return 0;
  853. }
  854. /*
  855. *unsleepable operations APIs
  856. *init
  857. *lock
  858. *unlock
  859. *destroy
  860. *
  861. */
  862. #if !defined(CONFIG_PROVE_LOCKING)
  863. INT32 osal_sleepable_lock_init(P_OSAL_SLEEPABLE_LOCK pSL)
  864. {
  865. mutex_init(&pSL->lock);
  866. return 0;
  867. }
  868. #endif
  869. INT32 osal_lock_sleepable_lock(P_OSAL_SLEEPABLE_LOCK pSL)
  870. {
  871. return mutex_lock_killable(&pSL->lock);
  872. }
  873. INT32 osal_unlock_sleepable_lock(P_OSAL_SLEEPABLE_LOCK pSL)
  874. {
  875. mutex_unlock(&pSL->lock);
  876. return 0;
  877. }
  878. INT32 osal_sleepable_lock_deinit(P_OSAL_SLEEPABLE_LOCK pSL)
  879. {
  880. mutex_destroy(&pSL->lock);
  881. return 0;
  882. }
  883. INT32 osal_sleep_ms(UINT32 ms)
  884. {
  885. msleep(ms);
  886. return 0;
  887. }
  888. INT32 osal_gettimeofday(PINT32 sec, PINT32 usec)
  889. {
  890. INT32 ret = 0;
  891. struct timeval now;
  892. do_gettimeofday(&now);
  893. if (sec != NULL)
  894. *sec = now.tv_sec;
  895. else
  896. ret = -1;
  897. if (usec != NULL)
  898. *usec = now.tv_usec;
  899. else
  900. ret = -1;
  901. return ret;
  902. }
  903. INT32 osal_printtimeofday(const PUINT8 prefix)
  904. {
  905. INT32 ret;
  906. INT32 sec;
  907. INT32 usec;
  908. ret = osal_gettimeofday(&sec, &usec);
  909. ret += osal_dbg_print("%s>sec=%d, usec=%d\n", prefix, sec, usec);
  910. return ret;
  911. }
  912. VOID osal_buffer_dump(const PUINT8 buf, const PUINT8 title, const UINT32 len, const UINT32 limit)
  913. {
  914. INT32 k;
  915. UINT32 dump_len;
  916. pr_warn("start of dump>[%s] len=%d, limit=%d,", title, len, limit);
  917. dump_len = ((0 != limit) && (len > limit)) ? limit : len;
  918. for (k = 0; k < dump_len; k++) {
  919. if ((k != 0) && (k % 16 == 0))
  920. pr_warn("\n");
  921. pr_warn("0x%02x ", buf[k]);
  922. }
  923. pr_warn("<end of dump\n");
  924. }
  925. UINT32 osal_op_get_id(P_OSAL_OP pOp)
  926. {
  927. return (pOp) ? pOp->op.opId : 0xFFFFFFFF;
  928. }
  929. MTK_WCN_BOOL osal_op_is_wait_for_signal(P_OSAL_OP pOp)
  930. {
  931. return (pOp && pOp->signal.timeoutValue) ? MTK_WCN_BOOL_TRUE : MTK_WCN_BOOL_FALSE;
  932. }
  933. VOID osal_op_raise_signal(P_OSAL_OP pOp, INT32 result)
  934. {
  935. if (pOp) {
  936. pOp->result = result;
  937. osal_raise_signal(&pOp->signal);
  938. }
  939. }