PageRenderTime 41ms CodeModel.GetById 18ms RepoModel.GetById 0ms app.codeStats 0ms

/drivers/net/wireless/tiwlan1251/common/src/BusAccess/Shm_Common/shmBus.c

http://github.com/CyanogenMod/cm-kernel
C | 498 lines | 263 code | 68 blank | 167 comment | 16 complexity | 8ea9925b51b5ab4749d199adde05b99c MD5 | raw file
Possible License(s): AGPL-1.0, GPL-2.0, LGPL-2.0
  1. /****************************************************************************
  2. **+-----------------------------------------------------------------------+**
  3. **| |**
  4. **| Copyright(c) 1998 - 2008 Texas Instruments. All rights reserved. |**
  5. **| All rights reserved. |**
  6. **| |**
  7. **| Redistribution and use in source and binary forms, with or without |**
  8. **| modification, are permitted provided that the following conditions |**
  9. **| are met: |**
  10. **| |**
  11. **| * Redistributions of source code must retain the above copyright |**
  12. **| notice, this list of conditions and the following disclaimer. |**
  13. **| * Redistributions in binary form must reproduce the above copyright |**
  14. **| notice, this list of conditions and the following disclaimer in |**
  15. **| the documentation and/or other materials provided with the |**
  16. **| distribution. |**
  17. **| * Neither the name Texas Instruments nor the names of its |**
  18. **| contributors may be used to endorse or promote products derived |**
  19. **| from this software without specific prior written permission. |**
  20. **| |**
  21. **| THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |**
  22. **| "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |**
  23. **| LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |**
  24. **| A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |**
  25. **| OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |**
  26. **| SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |**
  27. **| LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |**
  28. **| DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |**
  29. **| THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |**
  30. **| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |**
  31. **| OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |**
  32. **| |**
  33. **+-----------------------------------------------------------------------+**
  34. ****************************************************************************/
  35. /****************************************************************************
  36. *
  37. * MODULE: whalBus_Api.c
  38. * PURPOSE: shared memory bus access component API
  39. *
  40. ****************************************************************************/
  41. #include "whalCommon.h"
  42. #include "whalCtrl.h"
  43. #include "whalBus_Api.h"
  44. #include "shmBus.h"
  45. #include "TNETWIF.h"
  46. #include "TNETWArb.h"
  47. #include "TNETW_Driver.h"
  48. #include "whalHwAccess.h"
  49. #include "CmdMBox_api.h"
  50. #include "eventMbox_api.h"
  51. #include "FwEvent_api.h"
  52. /* Handle return status inside a state machine */
  53. #define EXCEPT(pwhalbus,status) \
  54. switch (status) { \
  55. case OK: \
  56. case TNETWIF_COMPLETE: \
  57. break; \
  58. case TNETWIF_PENDING: \
  59. return; \
  60. default: \
  61. whal_hwCtrl_FinalizeOnFailure (pwhalbus->hHwCtrl); \
  62. return; \
  63. }
  64. /****************************************************************************
  65. * static function declaration
  66. *****************************************************************************/
  67. static void whalBus_ConfigSm (TI_HANDLE hWhalBus, UINT8 module_id, TI_STATUS status);
  68. /****************************************************************************
  69. * whalBus_Create()
  70. ****************************************************************************
  71. * DESCRIPTION: Create the Bus access component
  72. *
  73. * INPUTS:
  74. *
  75. * OUTPUT: None
  76. *
  77. * RETURNS: The Created object
  78. ****************************************************************************/
  79. TI_HANDLE whalBus_Create (TI_HANDLE hOs)
  80. {
  81. whalBus_T *pWhalBus;
  82. pWhalBus = os_memoryAlloc (hOs, sizeof(whalBus_T));
  83. if (pWhalBus == NULL)
  84. return NULL;
  85. os_memoryZero (hOs, pWhalBus, sizeof(whalBus_T));
  86. pWhalBus->hOs = hOs;
  87. pWhalBus->hTNETWIF = TNETWIF_Create (hOs);
  88. pWhalBus->pHwEeprom = whal_hwEeprom_Create (hOs);
  89. #ifdef TI_DBG
  90. pWhalBus->pTrc = whal_traceCreate(hOs);
  91. #else
  92. pWhalBus->pTrc = NULL;
  93. #endif
  94. if (!pWhalBus->hTNETWIF || !pWhalBus->pHwEeprom)
  95. {
  96. whalBus_Destroy ((TI_HANDLE)pWhalBus);
  97. return NULL;
  98. }
  99. return (TI_HANDLE)pWhalBus;
  100. }
  101. /****************************************************************************
  102. * whalBus_Destroy()
  103. ****************************************************************************
  104. * DESCRIPTION: Destroy the object
  105. *
  106. * INPUTS:
  107. * hWhalBus The object to free
  108. *
  109. * OUTPUT: None
  110. *
  111. * RETURNS: OK or NOK
  112. ****************************************************************************/
  113. int whalBus_Destroy(TI_HANDLE hWhalBus)
  114. {
  115. whalBus_T *pWhalBus = (whalBus_T *)hWhalBus;
  116. if (pWhalBus == NULL)
  117. return OK;
  118. whal_hwEeprom_Destroy(pWhalBus->pHwEeprom);
  119. #ifdef TI_DBG
  120. whal_traceDestroy(pWhalBus->pTrc);
  121. #endif
  122. TNETWIF_Destroy(pWhalBus->hTNETWIF);
  123. os_memoryFree(pWhalBus->hOs, pWhalBus, sizeof(whalBus_T));
  124. return OK;
  125. }
  126. /****************************************************************************
  127. * whalBus_ConfigSm()
  128. ****************************************************************************
  129. * DESCRIPTION: Config the object
  130. *
  131. * INPUTS:
  132. * hWhalBus The object to free
  133. *
  134. * OUTPUT: None
  135. *
  136. * RETURNS: OK or NOK
  137. ****************************************************************************/
  138. static void whalBus_ConfigSm (TI_HANDLE hWhalBus, UINT8 module_id, TI_STATUS status)
  139. {
  140. whalBus_T *pWhalBus = (whalBus_T *)hWhalBus;
  141. WHAL_CTRL *pWhalCtrl = (WHAL_CTRL *)pWhalBus->hWhalCtrl;
  142. TnetwDrv_t *pTnetwDrv = (TnetwDrv_t *)pWhalCtrl->hTNETW_Driver;
  143. /* Pass the TNETWIF handle in each SHM Bus Module : HwIntr,HwRx,HwTx,Hw_Mbox,Hw_EventMbox */
  144. /* From now on these modules will be using only the TNETWIF handle and this one will send the request to the HwAccess module */
  145. switch (pWhalBus->uInitStage)
  146. {
  147. case 0:
  148. pWhalBus->uInitStage ++;
  149. whal_hwEeprom_Config (pWhalBus->pHwEeprom, pWhalBus->hTNETWIF, pWhalBus->hReport);
  150. /* disable interrupts */
  151. status = TNETWIF_WriteRegOpt (pTnetwDrv->hTNETWIF,
  152. ACX_REG_INTERRUPT_MASK,
  153. ACX_INTR_ALL,
  154. HAL_INIT_MODULE_ID,
  155. whalBus_ConfigSm,
  156. hWhalBus);
  157. EXCEPT (pWhalBus, status)
  158. case 1:
  159. pWhalBus->uInitStage = 0;
  160. CmdMBox_Config (pTnetwDrv->hCmdMBox,
  161. pWhalBus->hTNETWIF,
  162. pTnetwDrv->hFwEvent,
  163. pTnetwDrv->hCmdQueue,
  164. pWhalBus->hReport);
  165. eventMbox_Config (pTnetwDrv->hEventMbox,
  166. pTnetwDrv->hTNETWIF,
  167. pTnetwDrv->hHwIntr,
  168. pTnetwDrv->hReport,
  169. pTnetwDrv->hFwEvent,
  170. pTnetwDrv->hHalCtrl);
  171. #ifdef TI_DBG
  172. /* Initiate the trace object */
  173. whal_traceConfig (pWhalBus->pTrc, pWhalBus->hTNETWIF, pWhalBus->hReport);
  174. #endif
  175. /* Call upper module callback */
  176. pWhalBus->fCb (pWhalBus->hCb, status);
  177. WLAN_REPORT_INIT (pWhalBus->hReport, HAL_HW_CTRL_MODULE_LOG,
  178. ("whalBus_Config: EXITING SUCCESS !!!\n"));
  179. }
  180. }
  181. /****************************************************************************
  182. * whalBus_Config()
  183. ****************************************************************************
  184. * DESCRIPTION: Config the object
  185. *
  186. * INPUTS:
  187. * hWhalBus The object to free
  188. *
  189. * OUTPUT: None
  190. *
  191. * RETURNS: OK or NOK
  192. ****************************************************************************/
  193. TI_STATUS whalBus_Config
  194. (
  195. TI_HANDLE hWhalBus,
  196. TI_HANDLE hWhalCtrl,
  197. UINT8 AccessMode,
  198. UINT32 RegBaseAddr,
  199. UINT32 MemBaseAddr,
  200. TI_HANDLE hReport,
  201. TI_HANDLE hMemMgr,
  202. fnotify_t fCb,
  203. TI_HANDLE hCb
  204. )
  205. {
  206. whalBus_T *pWhalBus = (whalBus_T *)hWhalBus;
  207. WHAL_CTRL *pWhalCtrl = (WHAL_CTRL *)hWhalCtrl;
  208. TnetwDrv_t *pTnetwDrv = (TnetwDrv_t *)pWhalCtrl->hTNETW_Driver;
  209. if (pWhalBus == NULL)
  210. return OK;
  211. pWhalBus->hReport = hReport;
  212. pWhalBus->hTnetwDrv = (TI_HANDLE)pTnetwDrv;
  213. pWhalBus->hWhalCtrl = hWhalCtrl;
  214. pWhalBus->fCb = fCb;
  215. pWhalBus->hCb = hCb;
  216. pWhalBus->uInitStage = 0;
  217. /* Call the TNETWIF Configuration */
  218. return TNETWIF_Config (pWhalBus->hTNETWIF,
  219. hReport,
  220. RegBaseAddr,
  221. MemBaseAddr,
  222. whalBus_ConfigSm,
  223. hWhalBus);
  224. }
  225. /****************************************************************************
  226. * whalBus_GetTnentwifHandle()
  227. ****************************************************************************
  228. * DESCRIPTION: Return TNETWIF handle
  229. *
  230. * INPUTS:
  231. * hWhalBus The object handle
  232. *
  233. * OUTPUT: None
  234. *
  235. * RETURNS: TNETWIF handle
  236. ****************************************************************************/
  237. TI_HANDLE whalBus_GetTnentwifHandle (TI_HANDLE hWhalBus)
  238. {
  239. whalBus_T *pWhalBus = (whalBus_T *)hWhalBus;
  240. return pWhalBus->hTNETWIF;
  241. }
  242. /****************************************************************************
  243. * whalBus_ExitFromInitMode()
  244. ****************************************************************************
  245. * DESCRIPTION: Change the state of the Bus Access After init
  246. *
  247. * INPUTS:
  248. * hWhalBus The object handle
  249. *
  250. * OUTPUT: None
  251. *
  252. * RETURNS: OK or NOK
  253. ****************************************************************************/
  254. int whalBus_ExitFromInitMode(TI_HANDLE hWhalBus)
  255. {
  256. whalBus_T *pWhalBus = (whalBus_T *)hWhalBus;
  257. TnetwDrv_t *pTnetwDrv = (TnetwDrv_t *)pWhalBus->hTnetwDrv;
  258. #if defined(USE_SYNC_API)
  259. UINT32 uIntVect;
  260. #endif
  261. /* Set The Bus Access Mbox to Work in Async Mode */
  262. CmdMBox_SetModeNormal (pTnetwDrv->hCmdMBox);
  263. #if defined(USE_SYNC_API)
  264. uIntVect = FwEvent_GetEnabled (pTnetwDrv->hFwEvent);
  265. /* Clearing all the interrupt status register sources */
  266. TNETWIF_WriteRegSync (pWhalBus->hTNETWIF, ACX_REG_INTERRUPT_MASK, ~uIntVect);
  267. #endif
  268. return OK;
  269. }
  270. /*
  271. * --------------------------------------------------------------
  272. * Registers/Memory access API
  273. * --------------------------------------------------------------
  274. */
  275. UINT32 whalBus_MacRegRead(TI_HANDLE hWhalBus, UINT32 RegAddr)
  276. {
  277. UINT32 data = 0;
  278. #ifdef USE_SYNC_API
  279. TNETWIF_ReadRegSync(((whalBus_T *)hWhalBus)->hTNETWIF,RegAddr,(UINT32 *)&data);
  280. #endif
  281. return data;
  282. }
  283. void whalBus_MacRegWrite(TI_HANDLE hWhalBus, UINT32 RegAddr, UINT32 Val)
  284. {
  285. #ifdef USE_SYNC_API
  286. TNETWIF_WriteRegSync(((whalBus_T *)hWhalBus)->hTNETWIF, RegAddr, Val);
  287. #endif
  288. }
  289. void whalBus_MemCopyTo (TI_HANDLE hWhalBus, char *DestOffset, char *Src, int Len)
  290. {
  291. #ifdef USE_SYNC_API
  292. TNETWIF_WriteMemSync(((whalBus_T *)hWhalBus)->hTNETWIF,(UINT32)DestOffset,(UINT8*)Src,Len);
  293. #endif
  294. }
  295. void whalBus_MemCopyFrom (TI_HANDLE hWhalBus, UINT8 *Dest, char *SrcOffset, int Len)
  296. {
  297. #ifdef USE_SYNC_API
  298. TNETWIF_ReadMemSync(((whalBus_T *)hWhalBus)->hTNETWIF,(UINT32)SrcOffset,Dest,Len);
  299. #endif
  300. }
  301. #define WRITE_PHY_NUM_RETRIES 4
  302. void whalBus_PhyRegWrite (TI_HANDLE hWhalBus, UINT32 PhyRegAddr, UINT32 DataVal)
  303. {
  304. #ifdef USE_SYNC_API
  305. whalBus_T *pWhalBus = (whalBus_T *)hWhalBus;
  306. int NumRetries=1;
  307. UINT32 data;
  308. TNETWIF_WriteRegSync(pWhalBus->hTNETWIF, ACX_PHY_ADDR_REG, PhyRegAddr);
  309. TNETWIF_WriteRegSync(pWhalBus->hTNETWIF, ACX_PHY_DATA_REG, DataVal);
  310. TNETWIF_WriteRegSync(pWhalBus->hTNETWIF, ACX_PHY_CTRL_REG, ACX_PHY_REG_WR_MASK);
  311. os_StalluSec(pWhalBus->hOs, 10000);
  312. /* wait for write complete */
  313. TNETWIF_ReadRegSync(pWhalBus->hTNETWIF,ACX_PHY_CTRL_REG,&data);
  314. while (data && (NumRetries < WRITE_PHY_NUM_RETRIES))
  315. {
  316. NumRetries++;
  317. WLAN_REPORT_REPLY(pWhalBus->hReport, HAL_HW_CTRL_MODULE_LOG,
  318. ("ACX_PHY_CTRL_REG Write, Addr - %#x Data - %#x, retry\n", PhyRegAddr, DataVal));
  319. os_StalluSec(pWhalBus->hOs, 10000);
  320. TNETWIF_ReadRegSync(pWhalBus->hTNETWIF,ACX_PHY_CTRL_REG,&data);
  321. }
  322. #endif
  323. }
  324. UINT32 whalBus_PhyRegRead (TI_HANDLE hWhalBus, UINT32 PhyRegAddr)
  325. {
  326. UINT32 DataVal = 0;
  327. #ifdef USE_SYNC_API
  328. whalBus_T *pWhalBus = (whalBus_T *)hWhalBus;
  329. int NumRetries=1;
  330. UINT32 data;
  331. TNETWIF_WriteRegSync(pWhalBus->hTNETWIF, ACX_PHY_ADDR_REG, PhyRegAddr);
  332. TNETWIF_WriteRegSync(pWhalBus->hTNETWIF, ACX_PHY_CTRL_REG, ACX_PHY_REG_RD_MASK);
  333. os_StalluSec(pWhalBus->hOs, 10000);
  334. /* wait for write complete */
  335. TNETWIF_ReadRegSync(pWhalBus->hTNETWIF,ACX_PHY_CTRL_REG,&data);
  336. while ( data && (NumRetries < WRITE_PHY_NUM_RETRIES))
  337. {
  338. NumRetries++;
  339. WLAN_REPORT_REPLY(pWhalBus->hReport, HAL_HW_CTRL_MODULE_LOG,
  340. ("ACX_PHY_CTRL_REG Read, Addr - %#x retry\n", PhyRegAddr));
  341. os_StalluSec(pWhalBus->hOs, 10000);
  342. TNETWIF_ReadRegSync(pWhalBus->hTNETWIF,ACX_PHY_CTRL_REG,&data);
  343. }
  344. TNETWIF_ReadRegSync(pWhalBus->hTNETWIF,ACX_PHY_DATA_REG,&DataVal);
  345. #endif
  346. return DataVal;
  347. }
  348. /*
  349. * --------------------------------------------------------------
  350. * Interrupt handler API
  351. * --------------------------------------------------------------
  352. */
  353. void whalBus_TNETWIF_HandleBusTxn_Complete (TI_HANDLE hWhalBus)
  354. {
  355. TNETWIF_BusTxn_Complete (((whalBus_T *)hWhalBus)->hTNETWIF);
  356. }
  357. void whalBus_performHealthMonitorTest(TI_HANDLE hWhalBus, UINT32 test)
  358. {
  359. #ifdef TI_DBG
  360. switch (test) {
  361. case 1:
  362. WLAN_OS_REPORT(("HAL Perform Health Monitor MBOX Test\n"));
  363. break;
  364. #if 0
  365. case 2:
  366. WLAN_OS_REPORT(("HAL Perform Health Monitor TX STUCK Test\n"));
  367. whal_hwTx_performHealthMonitorTest(((whalBus_T *)hWhalBus)->pHwTx);
  368. break;
  369. #endif
  370. }
  371. #endif
  372. }
  373. /* Dummy function */
  374. /*
  375. * --------------------------------------------------------------
  376. * Debug API
  377. * --------------------------------------------------------------
  378. */
  379. #ifdef TI_DBG
  380. void whalBus_PrintInfo(TI_HANDLE hWhalBus, UINT32 funcType, void *pParam)
  381. {
  382. whalBus_T *pWhalBus = (whalBus_T *)hWhalBus;
  383. switch (funcType)
  384. {
  385. case BUS_PRINT_ARBITER:
  386. TNETWArb_PrintStat (((TNETWIF_t*)pWhalBus->hTNETWIF)->hTNETWArb);
  387. break;
  388. default:
  389. WLAN_OS_REPORT(("%s: Invalid function type: %d\n\n", __FUNCTION__, funcType));
  390. break;
  391. }
  392. }
  393. #endif
  394. /****************************************************************************
  395. * whalBus_ReConfig()
  396. ****************************************************************************
  397. * DESCRIPTION: ReConfig the object (In case of recovery)
  398. *
  399. * INPUTS:
  400. * hWhalBus The object to free
  401. *
  402. * OUTPUT: None
  403. *
  404. * RETURNS: OK or NOK
  405. ****************************************************************************/
  406. int whalBus_ReConfig(TI_HANDLE hWhalBus )
  407. {
  408. whalBus_T *pWhalBus = (whalBus_T *)hWhalBus;
  409. /*Add a function in HwAccess that Reconfig (SDIO_Stop/SDIO_Start) and also in SPI */
  410. TNETWIF_ReConfig(pWhalBus->hTNETWIF);
  411. return OK;
  412. }
  413. /****************************************************************************
  414. * whalBus_TNETWIF_ElpCtrl_SetMode()
  415. ****************************************************************************
  416. * DESCRIPTION: wrapper function for the lower TNETWIF_ElpCtrl_Mode
  417. *
  418. * INPUTS:
  419. * hWhalBus The current context handle
  420. * mode The ElpCtrl mode
  421. *
  422. * OUTPUT: None
  423. *
  424. * RETURNS: OK or NOK
  425. ****************************************************************************/
  426. int whalBus_TNETWIF_ElpCtrl_SetMode(TI_HANDLE hWhalBus, elpCtrl_Mode_e mode)
  427. {
  428. whalBus_T *pWhalBus = (whalBus_T *)hWhalBus;
  429. return TNETWIF_ElpCtrl_Mode(pWhalBus->hTNETWIF,mode);
  430. }