1 /****************************************************************************
2 **+-----------------------------------------------------------------------+**
4 **| Copyright(c) 1998 - 2008 Texas Instruments. All rights reserved. |**
5 **| All rights reserved. |**
7 **| Redistribution and use in source and binary forms, with or without |**
8 **| modification, are permitted provided that the following conditions |**
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 |**
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. |**
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. |**
33 **+-----------------------------------------------------------------------+**
34 ****************************************************************************/
36 /****************************************************************************
38 * MODULE: whalBus_Api.c
39 * PURPOSE: shared memory bus access component API
41 ****************************************************************************/
42 #include "whalCommon.h"
44 #include "whalBus_Api.h"
48 #include "TNETW_Driver.h"
49 #include "whalHwAccess.h"
50 #include "CmdMBox_api.h"
51 #include "eventMbox_api.h"
52 #include "FwEvent_api.h"
55 /* Handle return status inside a state machine */
56 #define EXCEPT(pwhalbus,status) \
59 case TNETWIF_COMPLETE: \
61 case TNETWIF_PENDING: \
64 whal_hwCtrl_FinalizeOnFailure (pwhalbus->hHwCtrl); \
69 /****************************************************************************
70 * static function declaration
71 *****************************************************************************/
72 static void whalBus_ConfigSm (TI_HANDLE hWhalBus, UINT8 module_id, TI_STATUS status);
74 /****************************************************************************
76 ****************************************************************************
77 * DESCRIPTION: Create the Bus access component
83 * RETURNS: The Created object
84 ****************************************************************************/
85 TI_HANDLE whalBus_Create (TI_HANDLE hOs)
89 pWhalBus = os_memoryAlloc (hOs, sizeof(whalBus_T));
93 os_memoryZero (hOs, pWhalBus, sizeof(whalBus_T));
97 pWhalBus->hTNETWIF = TNETWIF_Create (hOs);
98 pWhalBus->pHwEeprom = whal_hwEeprom_Create (hOs);
101 pWhalBus->pTrc = whal_traceCreate(hOs);
103 pWhalBus->pTrc = NULL;
106 if (!pWhalBus->hTNETWIF || !pWhalBus->pHwEeprom)
108 whalBus_Destroy ((TI_HANDLE)pWhalBus);
112 return (TI_HANDLE)pWhalBus;
115 /****************************************************************************
117 ****************************************************************************
118 * DESCRIPTION: Destroy the object
121 * hWhalBus The object to free
126 ****************************************************************************/
127 int whalBus_Destroy(TI_HANDLE hWhalBus)
129 whalBus_T *pWhalBus = (whalBus_T *)hWhalBus;
131 if (pWhalBus == NULL)
134 whal_hwEeprom_Destroy(pWhalBus->pHwEeprom);
137 whal_traceDestroy(pWhalBus->pTrc);
139 TNETWIF_Destroy(pWhalBus->hTNETWIF);
141 os_memoryFree(pWhalBus->hOs, pWhalBus, sizeof(whalBus_T));
146 /****************************************************************************
148 ****************************************************************************
149 * DESCRIPTION: Config the object
152 * hWhalBus The object to free
157 ****************************************************************************/
158 static void whalBus_ConfigSm (TI_HANDLE hWhalBus, UINT8 module_id, TI_STATUS status)
160 whalBus_T *pWhalBus = (whalBus_T *)hWhalBus;
161 WHAL_CTRL *pWhalCtrl = (WHAL_CTRL *)pWhalBus->hWhalCtrl;
162 TnetwDrv_t *pTnetwDrv = (TnetwDrv_t *)pWhalCtrl->hTNETW_Driver;
164 /* Pass the TNETWIF handle in each SHM Bus Module : HwIntr,HwRx,HwTx,Hw_Mbox,Hw_EventMbox */
165 /* From now on these modules will be using only the TNETWIF handle and this one will send the request to the HwAccess module */
166 switch (pWhalBus->uInitStage)
169 pWhalBus->uInitStage ++;
170 whal_hwEeprom_Config (pWhalBus->pHwEeprom, pWhalBus->hTNETWIF, pWhalBus->hReport);
172 /* disable interrupts */
173 status = TNETWIF_WriteRegOpt (pTnetwDrv->hTNETWIF,
174 ACX_REG_INTERRUPT_MASK,
179 EXCEPT (pWhalBus, status)
182 pWhalBus->uInitStage = 0;
184 CmdMBox_Config (pTnetwDrv->hCmdMBox,
187 pTnetwDrv->hCmdQueue,
190 eventMbox_Config (pTnetwDrv->hEventMbox,
195 pTnetwDrv->hHalCtrl);
198 /* Initiate the trace object */
199 whal_traceConfig (pWhalBus->pTrc, pWhalBus->hTNETWIF, pWhalBus->hReport);
202 /* Call upper module callback */
203 pWhalBus->fCb (pWhalBus->hCb, status);
205 WLAN_REPORT_INIT (pWhalBus->hReport, HAL_HW_CTRL_MODULE_LOG,
206 ("whalBus_Config: EXITING SUCCESS !!!\n"));
211 /****************************************************************************
213 ****************************************************************************
214 * DESCRIPTION: Config the object
217 * hWhalBus The object to free
222 ****************************************************************************/
223 TI_STATUS whalBus_Config
236 whalBus_T *pWhalBus = (whalBus_T *)hWhalBus;
237 WHAL_CTRL *pWhalCtrl = (WHAL_CTRL *)hWhalCtrl;
238 TnetwDrv_t *pTnetwDrv = (TnetwDrv_t *)pWhalCtrl->hTNETW_Driver;
240 if (pWhalBus == NULL)
243 pWhalBus->hReport = hReport;
244 pWhalBus->hTnetwDrv = (TI_HANDLE)pTnetwDrv;
245 pWhalBus->hWhalCtrl = hWhalCtrl;
248 pWhalBus->uInitStage = 0;
250 /* Call the TNETWIF Configuration */
251 return TNETWIF_Config (pWhalBus->hTNETWIF,
260 /****************************************************************************
261 * whalBus_GetTnentwifHandle()
262 ****************************************************************************
263 * DESCRIPTION: Return TNETWIF handle
266 * hWhalBus The object handle
270 * RETURNS: TNETWIF handle
271 ****************************************************************************/
272 TI_HANDLE whalBus_GetTnentwifHandle (TI_HANDLE hWhalBus)
274 whalBus_T *pWhalBus = (whalBus_T *)hWhalBus;
276 return pWhalBus->hTNETWIF;
279 /****************************************************************************
280 * whalBus_ExitFromInitMode()
281 ****************************************************************************
282 * DESCRIPTION: Change the state of the Bus Access After init
285 * hWhalBus The object handle
290 ****************************************************************************/
291 int whalBus_ExitFromInitMode(TI_HANDLE hWhalBus)
293 whalBus_T *pWhalBus = (whalBus_T *)hWhalBus;
294 TnetwDrv_t *pTnetwDrv = (TnetwDrv_t *)pWhalBus->hTnetwDrv;
295 #if defined(USE_SYNC_API)
299 /* Set The Bus Access Mbox to Work in Async Mode */
300 CmdMBox_SetModeNormal (pTnetwDrv->hCmdMBox);
302 #if defined(USE_SYNC_API)
304 uIntVect = FwEvent_GetEnabled (pTnetwDrv->hFwEvent);
306 /* Clearing all the interrupt status register sources */
307 TNETWIF_WriteRegSync (pWhalBus->hTNETWIF, ACX_REG_INTERRUPT_MASK, ~uIntVect);
314 * --------------------------------------------------------------
315 * Registers/Memory access API
316 * --------------------------------------------------------------
319 UINT32 whalBus_MacRegRead(TI_HANDLE hWhalBus, UINT32 RegAddr)
323 TNETWIF_ReadRegSync(((whalBus_T *)hWhalBus)->hTNETWIF,RegAddr,(UINT32 *)&data);
328 void whalBus_MacRegWrite(TI_HANDLE hWhalBus, UINT32 RegAddr, UINT32 Val)
331 TNETWIF_WriteRegSync(((whalBus_T *)hWhalBus)->hTNETWIF, RegAddr, Val);
335 void whalBus_MemCopyTo (TI_HANDLE hWhalBus, char *DestOffset, char *Src, int Len)
338 TNETWIF_WriteMemSync(((whalBus_T *)hWhalBus)->hTNETWIF,(UINT32)DestOffset,(UINT8*)Src,Len);
342 void whalBus_MemCopyFrom (TI_HANDLE hWhalBus, UINT8 *Dest, char *SrcOffset, int Len)
345 TNETWIF_ReadMemSync(((whalBus_T *)hWhalBus)->hTNETWIF,(UINT32)SrcOffset,Dest,Len);
349 #define WRITE_PHY_NUM_RETRIES 4
351 void whalBus_PhyRegWrite (TI_HANDLE hWhalBus, UINT32 PhyRegAddr, UINT32 DataVal)
354 whalBus_T *pWhalBus = (whalBus_T *)hWhalBus;
357 TNETWIF_WriteRegSync(pWhalBus->hTNETWIF, ACX_PHY_ADDR_REG, PhyRegAddr);
358 TNETWIF_WriteRegSync(pWhalBus->hTNETWIF, ACX_PHY_DATA_REG, DataVal);
359 TNETWIF_WriteRegSync(pWhalBus->hTNETWIF, ACX_PHY_CTRL_REG, ACX_PHY_REG_WR_MASK);
361 os_StalluSec(pWhalBus->hOs, 10000);
363 /* wait for write complete */
364 TNETWIF_ReadRegSync(pWhalBus->hTNETWIF,ACX_PHY_CTRL_REG,&data);
365 while (data && (NumRetries < WRITE_PHY_NUM_RETRIES))
368 WLAN_REPORT_REPLY(pWhalBus->hReport, HAL_HW_CTRL_MODULE_LOG,
369 ("ACX_PHY_CTRL_REG Write, Addr - %#x Data - %#x, retry\n", PhyRegAddr, DataVal));
370 os_StalluSec(pWhalBus->hOs, 10000);
371 TNETWIF_ReadRegSync(pWhalBus->hTNETWIF,ACX_PHY_CTRL_REG,&data);
376 UINT32 whalBus_PhyRegRead (TI_HANDLE hWhalBus, UINT32 PhyRegAddr)
380 whalBus_T *pWhalBus = (whalBus_T *)hWhalBus;
383 TNETWIF_WriteRegSync(pWhalBus->hTNETWIF, ACX_PHY_ADDR_REG, PhyRegAddr);
384 TNETWIF_WriteRegSync(pWhalBus->hTNETWIF, ACX_PHY_CTRL_REG, ACX_PHY_REG_RD_MASK);
385 os_StalluSec(pWhalBus->hOs, 10000);
387 /* wait for write complete */
388 TNETWIF_ReadRegSync(pWhalBus->hTNETWIF,ACX_PHY_CTRL_REG,&data);
389 while ( data && (NumRetries < WRITE_PHY_NUM_RETRIES))
392 WLAN_REPORT_REPLY(pWhalBus->hReport, HAL_HW_CTRL_MODULE_LOG,
393 ("ACX_PHY_CTRL_REG Read, Addr - %#x retry\n", PhyRegAddr));
394 os_StalluSec(pWhalBus->hOs, 10000);
395 TNETWIF_ReadRegSync(pWhalBus->hTNETWIF,ACX_PHY_CTRL_REG,&data);
398 TNETWIF_ReadRegSync(pWhalBus->hTNETWIF,ACX_PHY_DATA_REG,&DataVal);
405 * --------------------------------------------------------------
406 * Interrupt handler API
407 * --------------------------------------------------------------
409 void whalBus_TNETWIF_HandleBusTxn_Complete (TI_HANDLE hWhalBus)
411 TNETWIF_BusTxn_Complete (((whalBus_T *)hWhalBus)->hTNETWIF);
414 void whalBus_performHealthMonitorTest(TI_HANDLE hWhalBus, UINT32 test)
420 WLAN_OS_REPORT(("HAL Perform Health Monitor MBOX Test\n"));
424 WLAN_OS_REPORT(("HAL Perform Health Monitor TX STUCK Test\n"));
425 whal_hwTx_performHealthMonitorTest(((whalBus_T *)hWhalBus)->pHwTx);
434 * --------------------------------------------------------------
436 * --------------------------------------------------------------
439 void whalBus_PrintInfo(TI_HANDLE hWhalBus, UINT32 funcType, void *pParam)
441 whalBus_T *pWhalBus = (whalBus_T *)hWhalBus;
445 case BUS_PRINT_ARBITER:
446 TNETWArb_PrintStat (((TNETWIF_t*)pWhalBus->hTNETWIF)->hTNETWArb);
450 WLAN_OS_REPORT(("%s: Invalid function type: %d\n\n", __FUNCTION__, funcType));
458 /****************************************************************************
460 ****************************************************************************
461 * DESCRIPTION: ReConfig the object (In case of recovery)
464 * hWhalBus The object to free
469 ****************************************************************************/
470 int whalBus_ReConfig(TI_HANDLE hWhalBus )
472 whalBus_T *pWhalBus = (whalBus_T *)hWhalBus;
473 /*Add a function in HwAccess that Reconfig (SDIO_Stop/SDIO_Start) and also in SPI */
474 TNETWIF_ReConfig(pWhalBus->hTNETWIF);
478 /****************************************************************************
479 * whalBus_TNETWIF_ElpCtrl_SetMode()
480 ****************************************************************************
481 * DESCRIPTION: wrapper function for the lower TNETWIF_ElpCtrl_Mode
484 * hWhalBus The current context handle
485 * mode The ElpCtrl mode
490 ****************************************************************************/
491 int whalBus_TNETWIF_ElpCtrl_SetMode(TI_HANDLE hWhalBus, elpCtrl_Mode_e mode)
493 whalBus_T *pWhalBus = (whalBus_T *)hWhalBus;
495 return TNETWIF_ElpCtrl_Mode(pWhalBus->hTNETWIF,mode);