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 /**************************************************************************** 38 * 39 * MODULE: whalDebug.c 40 * PURPOSE: Handle Debug requests in the Hal 41 * 42 * Register Mac/Phy Read/Write 43 * Register Dump 44 * Register RxDump 45 * Register TxDump 46 * Debug trace print 47 * 48 ****************************************************************************/ 49 #include "whalCommon.h" 50 #include "whalCtrl_api.h" 51 #include "whalCtrl.h" 52 #include "whalSecurity.h" 53 #include "commonTypes.h" 54 #include "CmdQueue_api.h" 55 #include "whalBus_Api.h" 56 #include "TNETW_Driver.h" 57 58 /************************************************ 59 * definitions * 60 ************************************************/ 61 #define BB_REGISTER_ADDR_BASE 0x820000 /*phony address used by host access*/ 62 63 /* 64 * ---------------------------------------------------------------------------- 65 * Function : whalCtrlReadMacReg 66 * 67 * Input : 68 * Output : 69 * Process : 70 * Note(s) : Done 71 * ----------------------------------------------------------------------------- 72 */ 73 UINT32 whalCtrlReadMacReg(TI_HANDLE hWhalCtrl, UINT32 addr) 74 { 75 WHAL_CTRL *pWhalCtrl = (WHAL_CTRL *)hWhalCtrl; 76 77 return whalBus_MacRegRead(pWhalCtrl->pHwCtrl->hWhalBus, addr); 78 } 79 80 /* 81 * ---------------------------------------------------------------------------- 82 * Function : whalCtrlWriteMacReg 83 * 84 * Input : 85 * Output : 86 * Process : 87 * Note(s) : Done 88 * ----------------------------------------------------------------------------- 89 */ 90 void whalCtrlWriteMacReg(TI_HANDLE hWhalCtrl, UINT32 addr, UINT32 val) 91 { 92 WHAL_CTRL *pWhalCtrl = (WHAL_CTRL *)hWhalCtrl; 93 94 whalBus_MacRegWrite(pWhalCtrl->pHwCtrl->hWhalBus, addr, val); 95 } 96 97 /* 98 * ---------------------------------------------------------------------------- 99 * Function : whalCtrlReadPhyReg 100 * 101 * Input : 102 * Output : 103 * Process : 104 * Note(s) : Done 105 * ----------------------------------------------------------------------------- 106 */ 107 UINT32 whalCtrlReadPhyReg(TI_HANDLE hWhalCtrl, UINT32 addr) 108 { 109 WHAL_CTRL *pWhalCtrl = (WHAL_CTRL *)hWhalCtrl; 110 111 return whalBus_PhyRegRead(pWhalCtrl->pHwCtrl->hWhalBus, addr); 112 } 113 114 /* 115 * ---------------------------------------------------------------------------- 116 * Function : whalCtrlWritePhyReg 117 * 118 * Input : 119 * Output : 120 * Process : 121 * Note(s) : Done 122 * ----------------------------------------------------------------------------- 123 */ 124 void whalCtrlWritePhyReg(TI_HANDLE hWhalCtrl, UINT32 addr, UINT32 val) 125 { 126 WHAL_CTRL *pWhalCtrl = (WHAL_CTRL *)hWhalCtrl; 127 128 whalBus_PhyRegWrite(pWhalCtrl->pHwCtrl->hWhalBus, addr, val); 129 } 130 131 132 /* 133 * ---------------------------------------------------------------------------- 134 * Function : whalCtrl_PrintAll 135 * 136 * Input : 137 * Output : 138 * Process : 139 * Note(s) : Done 140 * ----------------------------------------------------------------------------- 141 */ 142 #ifdef TI_DBG 143 void whalCtrl_PrintAll (TI_HANDLE hWhalCtrl) 144 { 145 WHAL_CTRL *pWhalCtrl = (WHAL_CTRL *)hWhalCtrl; 146 147 WLAN_OS_REPORT((" whalCtrl_PrintAll: \n\n")); 148 149 CmdQueue_Print(((TnetwDrv_t*)pWhalCtrl->hTNETW_Driver)->hCmdQueue); 150 151 whalBus_PrintInfo(pWhalCtrl->hWhalBus, BUS_PRINT_ALL, 0); 152 153 whal_hwInfoElemMemoryMapPrint(pWhalCtrl->pHwCtrl->pHwMboxConfig); 154 whal_hwInfoElemStatisticsPrint(pWhalCtrl->pHwCtrl->pHwMboxConfig); 155 156 whal_ParamsHwNvramPrint(pWhalCtrl->pWhalParams); 157 } 158 #endif 159 160 161 /* 162 * ---------------------------------------------------------------------------- 163 * Function : whalCtrl_getMaxNumberOfCommandsInQueue 164 * 165 * Input : 166 * Output : 167 * Process : returns the maximum number of commands in the mailbox queue ever 168 * Note(s) : Done 169 * ----------------------------------------------------------------------------- 170 */ 171 int whalCtrl_getMaxNumberOfCommandsInQueue (TI_HANDLE hWhalCtrl) 172 { 173 WHAL_CTRL *pWhalCtrl = (WHAL_CTRL *)hWhalCtrl; 174 return (CmdQueue_GetMaxNumberOfCommands(((TnetwDrv_t*)pWhalCtrl->hTNETW_Driver)->hCmdQueue)); 175 } 176 177 /* 178 * ---------------------------------------------------------------------------- 179 * Function : whalCtrl_PrintMailBoxHistory 180 * 181 * Input : 182 * Output : 183 * Process : Prints the mailbox command history 184 * Note(s) : Done 185 * ----------------------------------------------------------------------------- 186 */ 187 188 void whalCtrl_PrintMailBoxHistory (TI_HANDLE hWhalCtrl) 189 { 190 #ifdef TI_DBG 191 WHAL_CTRL *pWhalCtrl = (WHAL_CTRL *)hWhalCtrl; 192 CmdQueue_PrintHistory(((TnetwDrv_t*)pWhalCtrl->hTNETW_Driver)->hCmdQueue, 5); 193 #endif 194 } 195 196 /* 197 * ---------------------------------------------------------------------------- 198 * Function : whalCtrl_PrintMem_Regs_CB 199 * 200 * Input : 201 * Output : 202 * Process : 203 * Note(s) : Done 204 * ----------------------------------------------------------------------------- 205 */ 206 void whalCtrl_PrintMem_Regs_CB (TI_HANDLE hWhalCtrl, UINT32 cmdCbStatus) 207 { 208 int i; 209 UINT8 *pBuf; 210 UINT32 result; 211 WHAL_CTRL *pWhalCtrl = (WHAL_CTRL *)hWhalCtrl; 212 213 if (cmdCbStatus != OK) 214 { 215 WLAN_OS_REPORT((" whalCtrl_PrintMem_Regs_CB: command complete error \n\n")); 216 return; 217 } 218 219 result = (((UINT32)pWhalCtrl->printRegsBuf.addr)&0xFFFF0000); 220 221 switch (result) 222 { 223 case ACX_MAC_REG_READ_WRITE_PREFIX: 224 WLAN_OS_REPORT(("MAC REGS (Base=0x%08x) = 0x%08x\n", ((UINT32)pWhalCtrl->printRegsBuf.addr)&0xFFFF, 225 *(UINT32*)(pWhalCtrl->printRegsBuf.value))); 226 break; 227 228 case BB_REGISTER_ADDR_BASE: 229 WLAN_OS_REPORT(("PHY REGS (Base=0x%08x) = 0x%08x\n", ((UINT32)pWhalCtrl->printRegsBuf.addr)&0xFFFF, 230 *(UINT32*)(pWhalCtrl->printRegsBuf.value))); 231 break; 232 233 default: /* Memory*/ 234 for (i=0, pBuf=pWhalCtrl->printRegsBuf.value; i<256; i+=16, pBuf+=16) 235 { 236 WLAN_REPORT_REPLY(pWhalCtrl->hReport, HAL_HW_CTRL_MODULE_LOG, 237 ("PrintBuf: 0x%08x: 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x\n", 238 pWhalCtrl->printRegsBuf.addr+i, 239 pBuf[0], pBuf[1], pBuf[2], pBuf[3], pBuf[4], pBuf[5], pBuf[6], pBuf[7], 240 pBuf[8], pBuf[9], pBuf[10], pBuf[11], pBuf[12], pBuf[13], pBuf[14], pBuf[15])); 241 } 242 break; 243 } 244 } 245 246 /* 247 * ---------------------------------------------------------------------------- 248 * Function : whalCtrl_Print_Mem_Regs 249 * 250 * Input : 251 * Output : 252 * Process : 253 * Note(s) : Reading from memory or registers is done through IE (interrogate) 254 * ----------------------------------------------------------------------------- 255 */ 256 void whalCtrl_Print_Mem_Regs (TI_HANDLE hWhalCtrl, UINT32 address, UINT32 len, readWrite_MemoryType_e memType) 257 { 258 ReadWriteCommand_t AcxCmd_ReadMemory; 259 ReadWriteCommand_t* pCmd = &AcxCmd_ReadMemory; 260 261 WHAL_CTRL *pWhalCtrl = (WHAL_CTRL *)hWhalCtrl; 262 263 os_memoryZero(pWhalCtrl->hOs, (void *)pCmd, sizeof(*pCmd)); 264 265 switch (memType) 266 { 267 case TNETW_INTERNAL_RAM: 268 pCmd->addr = (UINT32)ENDIAN_HANDLE_LONG(address); 269 pCmd->size = ENDIAN_HANDLE_LONG(len); 270 break; 271 272 case TNETW_MAC_REGISTERS: 273 pCmd->addr = (UINT32)ENDIAN_HANDLE_LONG(( (address&0xFFFF) | ACX_MAC_REG_READ_WRITE_PREFIX )); 274 pCmd->size = 4; 275 break; 276 277 case TNETW_PHY_REGISTERS: 278 pCmd->addr = (UINT32)ENDIAN_HANDLE_LONG(( (address&0xFFFF) | BB_REGISTER_ADDR_BASE )); 279 pCmd->size = 4; 280 break; 281 282 default: 283 WLAN_OS_REPORT((" whalCtrl_Print_Mem_Regs: ERROR, wrong memory type %d\n\n", memType)); 284 return; 285 } 286 287 os_memoryZero (pWhalCtrl->hOs, (void *)&pWhalCtrl->printRegsBuf, sizeof(pWhalCtrl->printRegsBuf)); 288 289 CmdQueue_CommandWithCb(((TnetwDrv_t*)pWhalCtrl->hTNETW_Driver)->hCmdQueue, CMD_READ_MEMORY, (char *)pCmd, 290 sizeof(*pCmd), (void *)whalCtrl_PrintMem_Regs_CB, hWhalCtrl, 291 &pWhalCtrl->printRegsBuf); 292 } 293 294 295 /* 296 * ---------------------------------------------------------------------------- 297 * Function : whalCtrl_Set_Mem_Regs 298 * 299 * Input : 300 * Output : 301 * Process : 302 * Note(s) : Writing to memory or registers is done through command to the ACX 303 * This function overrides the len parameter and write only 4 bytes! 304 * ----------------------------------------------------------------------------- 305 */ 306 int whalCtrl_Set_Mem_Regs (TI_HANDLE hWhalCtrl, UINT32 address, UINT32 len, UINT32 aWriteVal, 307 readWrite_MemoryType_e memType) 308 { 309 WHAL_CTRL *pWhalCtrl = (WHAL_CTRL *)hWhalCtrl; 310 ReadWriteCommand_t AcxCmd_WriteMemory; 311 ReadWriteCommand_t* pCmd = &AcxCmd_WriteMemory; 312 313 os_memoryZero(pWhalCtrl->hOs, (void *)pCmd, sizeof(*pCmd)); 314 315 switch (memType) 316 { 317 case TNETW_INTERNAL_RAM: 318 pCmd->addr = (UINT32)ENDIAN_HANDLE_LONG(address); 319 pCmd->size = ENDIAN_HANDLE_LONG(len); 320 WLAN_OS_REPORT((" whalCtrl_Set_Mem_Regs: write to Internal Ram addr=0x%x Val=0x%x\n\n", pCmd->addr, aWriteVal)); 321 break; 322 323 case TNETW_MAC_REGISTERS: 324 pCmd->addr = (UINT32)ENDIAN_HANDLE_LONG( (address&0xFFFF) | ACX_MAC_REG_READ_WRITE_PREFIX); 325 pCmd->size = ENDIAN_HANDLE_LONG(len); 326 WLAN_OS_REPORT((" whalCtrl_Set_Mem_Regs: write to Mac register addr=0x%x Val=0x%x\n\n", pCmd->addr, aWriteVal)); 327 break; 328 329 case TNETW_PHY_REGISTERS: 330 pCmd->addr = (UINT32)ENDIAN_HANDLE_LONG( (address&0xFFFF) | BB_REGISTER_ADDR_BASE); 331 pCmd->size = ENDIAN_HANDLE_LONG(len); 332 WLAN_OS_REPORT((" whalCtrl_Set_Mem_Regs: write to Phy register addr=0x%x Val=0x%x\n\n", pCmd->addr, aWriteVal)); 333 break; 334 335 default: 336 WLAN_OS_REPORT((" whalCtrl_Print_Mem_Regs: ERROR, wrong memory type 0x%x\n\n", memType)); 337 return NOK; 338 } 339 340 os_memoryCopy (pWhalCtrl->hOs, (void *)pCmd->value, (void *)&aWriteVal, pCmd->size); 341 342 return (CmdQueue_Command(((TnetwDrv_t*)pWhalCtrl->hTNETW_Driver)->hCmdQueue, CMD_WRITE_MEMORY, (char *)pCmd, sizeof(*pCmd))); 343 } 344 345 346 347