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 * MODULE: hwAccess.c 39 * PURPOSE: Support access to the wlan hardware registers and memory 40 * 41 * Direct Slave mode: 42 * ----------------- 43 * 44 * 1. 08 bit function 45 * - access 16 bit (WA100 has no access to 8 bits) 46 * - set/get the relevant byte according to the address (odd or even) 47 * + ((char *)&DataShort)[Addr&0x1] 48 * - no endian handle 49 * 2. 16 bit function 50 * - access 16 bit 51 * - short endian handle 52 * 3. 32 bit function 53 * - access 32 bit 54 * - long endian handle 55 * 4. buffers copy to (stream of bytes) 56 * - addresses must be even 57 * - copy buffer as stream of 16 bits (in case of src/dst address ends with 0x2) 58 * - handle case of more bytes to copy 59 * * TempWord = (*shortDest & 0x00ff) | (*shortSrc & 0xff00); 60 * - no endian handle 61 * 5. registers 62 * - access 32 bit 63 * - long endian handle 64 * - no use of wlan hardware capability to swap endian 65 * 66 * Indirect Slave mode: 67 * ------------------- 68 * 69 * 1. 08 bit function 70 * - access 16 bit (WA100 has no access to 8 bits) 71 * - set/get the relevant byte according to the address (odd or even) 72 * + ((char *)&DataLong)[Addr&0x3] 73 * - no endian handle 74 * 2. 16 bit function 75 * - access 32 bit (set addr reg , get data reg) 76 * - set/get the relevant short according to the address (00 or 02) 77 * + ((short *)&DataLong)[(Addr>>1)&0x1]) 78 * - short endian handle 79 * 3. 32 bit function 80 * - access 32 bit (set addr reg , get data reg) 81 * - long endian handle 82 * 4. buffers copy to (stream of bytes) 83 * - addresses must be even 84 * - handle case of dest(wlan hardware) address ends with 0x2 - read 32 from 0x0, set only high short 85 * - now the dest(wlan hardware) address is long address 86 * - use Auto Increment Mode 87 * - copy buffer as stream of 16 bits (in case of source address ends with 0x2) 88 * - handle case of more bytes to copy 89 * * i=0..Len&3 ==> ((char *)&DataLong)[i] = ((char *)shortSrc)[i] 90 * - no endian handle 91 * 5. buffers copy from (stream of bytes) 92 * - addresses must be even 93 * - handle case of source(wlan hardware) address ends with 0x2 - read 32 from 0x0, set only high short 94 * - now the source(wlan hardware) address is long address 95 * - use Auto Increment Mode 96 * - copy buffer as stream of 16 bits (in case of dest address ends with 0x2) 97 * - handle case of more bytes to copy 98 * * i=0..Len&3 ==> ((char *)shortDest)[i] = ((char *)&DataLong)[i] 99 * - no endian handle 100 * 6. registers 101 * - access 32 bit 102 * - long endian handle 103 * - no use of wlan hardware capability to swap endian 104 * 105 ****************************************************************************/ 106#include "osTIType.h" 107#include "osApi.h" 108#include "whalCommon.h" 109#include "whalHwDefs.h" 110#ifdef HW_ACCESS_SDIO 111 112 #ifndef _WINDOWS /*Linux, Symbian, RVCT */ 113 114#include "mmc_omap_api.h" 115#include "mmc_tnetw1150_api.h" 116 117 #else /* ifdef _WINDOWS */ 118 #endif /* ifdef _WINDOWS */ 119 120#elif defined(HW_ACCESS_WSPI) 121 122#include "wspi.h" 123 124#endif 125#include "TNETWIF.h" 126#include "whalHwAccess.h" 127 128/* #define __HWACCESS_DEBUG__ */ 129 130/* 131 * Define this flag to support SDIO asynchronous mode 132 */ 133#undef HW_ACCESS_SDIO_ASYNC_SUPPORT 134 135 136/************************************************************************ 137 * Types 138 ************************************************************************/ 139typedef struct _HWAccess_CB_T 140{ 141 HwAccess_callback_t CBFunc; 142 void* CBArg; 143} HWAccess_CB_T; 144 145typedef void (*HwAccessErrorHandle)(TI_HANDLE theObjectHandle,char* Report , UINT32 strLen); 146 147typedef struct _partition_t 148{ 149 UINT32 size; 150 UINT32 start; 151} partition_t; 152 153 154/* HwAccess context */ 155typedef struct _HwAccess_T_new 156{ 157 void *hProtect; 158 159 TI_HANDLE hOs; 160 TI_HANDLE hReport; 161 162#if (defined(HW_ACCESS_SDIO)|defined(HW_ACCESS_WSPI)) 163 TI_HANDLE hDriver; 164 UINT32 MemRegionAddr; 165 UINT32 RegisterRegionAddr; 166 UINT32 workingPartUpperLimit; 167 UINT32 registerPartUpperLimit; 168#else /* HW_ACCESS_CARDBUS */ 169 UINT32 RegBaseAddr; 170 UINT32 MemBaseAddr; 171#endif 172 173 HWAccess_CB_T CB; 174 175 UINT8 AsyncMode; 176 177 UINT32 uBusError; 178 HwAccessErrorHandle hwAccesserror_Cb; 179 TI_HANDLE hBackReference; 180 181 PADDING (partition_t partition [2]) 182 183} HwAccess_T_new; 184 185 186/************************************************************************ 187 * Defines 188 ************************************************************************/ 189 190#ifdef HW_ACCESS_WSPI 191 192/* 193 * Converts status from WSPI into TI_STATUS 194 */ 195#define WSPI2TNETWIF(pHwAccess,status,addr) \ 196 switch(status) { \ 197 case WSPI_TXN_PENDING: status = TNETWIF_PENDING; break; \ 198 case WSPI_TXN_COMPLETE: status = TNETWIF_COMPLETE; break; \ 199 default: \ 200 WLAN_REPORT_ERROR (pHwAccess->hReport, HAL_HW_CTRL_MODULE_LOG, \ 201 ("whal_hwAccess: Error in read/write async, addr=0x%08x status=%d\n", \ 202 addr, status)); \ 203 status = TNETWIF_ERROR; break; \ 204} 205 206/* 207* Indicate the index position at which we should check if the HW is up - 208* i.e. (buf[HW_ACCESS_WSPI_FIXED_BUSY_LEN] & 0x1 == TRUE) 209*/ 210#ifdef TNETW1251 211#define HW_ACCESS_WSPI_FIXED_BUSY_LEN ((TNETWIF_READ_OFFSET_BYTES - 4 ) / sizeof(UINT32)) 212#else 213#define HW_ACCESS_WSPI_FIXED_BUSY_LEN 0 214#endif 215 216#endif /* HW_ACCESS_WSPI */ 217 218#define HW_ACCESS_WSPI_INIT_CMD_MASK 0 219 220#define HW_ACCESS_WSPI_ALIGNED_SIZE 4 221#define HW_ACCESS_NUM_OF_BIT_IN_BYTE 8 222 223#define HW_ACCESS_REGISTER_SIZE 4 224 225 226/* ELP CTRL register */ 227#define HW_ACCESS_ELP_CTRL_REG_ADDR 0x1FFFC 228 229 230#define HW_ACCESS_1_BYTE_REMINDE_MASK 0x000000FF 231#define HW_ACCESS_2_BYTE_REMINDE_MASK 0x0000FFFF 232#define HW_ACCESS_3_BYTE_REMINDE_MASK 0x00FFFFFF 233 234/* translation registers */ 235#define HW_ACCESS_PART0_SIZE_ADDR 0x1FFC0 236#define HW_ACCESS_PART0_START_ADDR 0x1FFC4 237#define HW_ACCESS_PART1_SIZE_ADDR 0x1FFC8 238#define HW_ACCESS_PART1_START_ADDR 0x1FFCC 239 240 241/************************************************************************ 242 * Macros 243 ************************************************************************/ 244#define EXTRACT_BYTE_FROM_WORD(DataShort, Addr) (((char *)&DataShort)[((int)Addr)&0x1]) 245#define EXTRACT_BYTE_FROM_LONG(DataLong, Addr) (((char *)&DataLong )[((int)Addr)&0x3]) 246#define EXTRACT_WORD_FROM_LONG(DataLong, Addr) (((short *)&DataLong)[(((int)Addr>>1))&0x1]) 247#define EXTRACT_BYTE_LONG(DataLong, i) (((char *)&DataLong)[i]) 248 249#define HW_MEM_SHORT(pHwAccess, Addr) (*(volatile UINT16 *)(pHwAccess->MemBaseAddr + (UINT32)(Addr))) 250#define HW_MEM_LONG(pHwAccess, Addr) (*(volatile UINT32 *)(pHwAccess->MemBaseAddr + (UINT32)(Addr))) 251 252#define TRANSLATE_ADDRESS_MEM(addr) ((addr) - pHwAccess->MemRegionAddr) 253#define TRANSLATE_ADDRESS_REG(addr) ((addr) + pHwAccess->RegisterRegionAddr) 254 255#if 1 /* 0 */ 256 #if (defined(HW_ACCESS_SDIO)|defined(HW_ACCESS_WSPI)) /* 1 */ 257 void HW_REG_LONG_WRITE(HwAccess_T_new *pHwAccess, UINT32 RegAddr, UINT32 BitVal); 258 void HW_REG_LONG_READ(HwAccess_T_new *pHwAccess, UINT32 RegAddr, UINT32 *Val); 259 #else /* 1 */ 260 #define HW_REG_SHORT_WRITE(pHwAccess, Addr, Data) ((*(volatile UINT16 *)(pHwAccess->RegBaseAddr + (UINT32)(Addr))) = (UINT16)(Data)) 261 #define HW_REG_SHORT_READ(pHwAccess, Addr, Data) ((*(Data)) = (*(volatile UINT16 *)(pHwAccess->RegBaseAddr + (UINT32)(Addr))) ) 262 #ifdef NOT_SUPPORT_32_BIT_ACCESS_COMMAND /* for example: iPAQ model 38xx */ /* 2 */ 263 #define HW_REG_LONG_WRITE(pHwAccess, Addr, Data) HW_REG_SHORT_WRITE(pHwAccess, Addr, Data); HW_REG_SHORT_WRITE(pHwAccess, Addr+2, ((UINT16)(Data>>16))) 264 #define HW_REG_LONG_READ(pHwAccess, Addr, pData) HW_REG_SHORT_READ(pHwAccess, Addr, pData); HW_REG_SHORT_READ(pHwAccess, Addr+2, ((UINT16 *)pData+1)) 265 #else /* 2 */ 266 #define HW_REG_LONG_WRITE(pHwAccess, Addr, Data) ((*(volatile UINT32 *)(pHwAccess->RegBaseAddr + (UINT32)(Addr))) = (UINT32)(Data)) 267 #define HW_REG_LONG_READ(pHwAccess, Addr, Data) ((*(Data)) = (*(volatile UINT32 *)(pHwAccess->RegBaseAddr + (UINT32)(Addr))) ) 268 #endif /* 2 */ 269 #endif /* 1 */ 270#else /* 0 */ 271#endif /* 0 */ 272 273 274 275/************************************************************************ 276 * Functions 277 ************************************************************************/ 278 279#if !defined(HW_ACCESS_SDIO) && !defined(HW_ACCESS_WSPI) 280static void whal_hwAccess_DirectCopy_new(HwAccess_T_new *pHwAccess, UINT8* Dest, UINT8* Src, UINT32 Len); 281#endif 282#ifdef HW_ACCESS_SDIO 283static void sdio_transaction_notify_read(struct SDIO_Request *req, int status); 284static void sdio_transaction_notify_write(struct SDIO_Request *req, int status); 285static void sdio_transaction_error(struct SDIO_Request *req, int stat); 286#ifdef CONFIG_ASYNC_API 287static void sdio_async_transaction_notify(struct SDIO_Request *req, int status); 288static void sdio_async_transaction_error(struct SDIO_Request *req, int status); 289#endif 290#endif 291 292/* 293** Read/Write interface 294**---------------------------- 295** 296** the memory space shell be divided to 2 Partions: Memory, and Registers. 297** 1. The memory Region will be set at init to point to the FW Ram, 298** and after FW init complete, the Memory Region will be set to point the Packet Ram. 299** 2. Registry Region. 300** 301** 302*/ 303 304 305 306/************************************************************************ 307 * new API 308 ************************************************************************/ 309 310 311 312/**************************************************************************** 313 * whal_hwAccess_Create 314 **************************************************************************** 315 * DESCRIPTION: create the HwAccess module. allocate the module context and create the sublayers 316 * 317 * INPUTS: hOs - handle to the OS module 318 * 319 * OUTPUT: TI_HANDLE - the handle to the context that was created 320 * 321 * RETURNS: NULL = failure. 322 * otherwise = success 323 ****************************************************************************/ 324TI_HANDLE whal_hwAccess_Create(TI_HANDLE hOs) 325{ 326 HwAccess_T_new *pHwAccess; 327 int status = OK; 328#ifdef HW_ACCESS_SDIO 329 SDIO_ConfigParams configParams; 330#endif 331 pHwAccess = os_memoryAlloc(hOs, sizeof(HwAccess_T_new)); 332 if (pHwAccess == NULL) 333 return NULL; 334 335 os_memoryZero(hOs, pHwAccess, sizeof(HwAccess_T_new)); 336 337 pHwAccess->hOs = hOs; 338 339 pHwAccess->hProtect = os_protectCreate(pHwAccess->hOs); 340 if (pHwAccess->hProtect == NULL) 341 { 342 whal_hwAccess_Destroy(pHwAccess); 343 return NULL; 344 } 345 346#ifdef HW_ACCESS_SDIO 347 348 pHwAccess->AsyncMode = FALSE; 349 350 os_memoryZero(hOs, &configParams, sizeof(SDIO_ConfigParams)); 351 configParams.fnotify_read = sdio_transaction_notify_read; 352 configParams.fnotify_write = sdio_transaction_notify_write; 353 configParams.ferror = sdio_transaction_error; 354 configParams.fconfig_peripheral = SDIO_TNETWConfig; 355 configParams.fconvert = NULL; 356 configParams.owner = pHwAccess; 357 358 status = SDIO_Init(&configParams, &pHwAccess->hDriver); 359 360#elif defined(HW_ACCESS_WSPI) 361 362 pHwAccess->AsyncMode = TRUE; 363 364 pHwAccess->hDriver = WSPI_Open (pHwAccess->hOs); 365 status = pHwAccess->hDriver == NULL; 366 367#else 368 369 pHwAccess->AsyncMode = FALSE; 370 371#endif 372 373 if (status != 0) 374 { 375 if (pHwAccess->hProtect) 376 os_protectDestroy(pHwAccess->hOs, pHwAccess->hProtect); 377 os_memoryFree(pHwAccess->hOs, pHwAccess, sizeof(HwAccess_T_new)); 378 return NULL; 379 } 380 381 return pHwAccess; 382} 383 384/**************************************************************************** 385 * whal_hwAccess_Destroy 386 **************************************************************************** 387 * DESCRIPTION: destroy the module. deallocate the cmodule context. 388 * 389 * INPUTS: hHwAccess - handle to the module context 390 * 391 * OUTPUT: none. 392 * 393 * RETURNS: one of the error codes (0 => OK) 394 ****************************************************************************/ 395int whal_hwAccess_Destroy(TI_HANDLE hHwAccess) 396{ 397 HwAccess_T_new *pHwAccess = (HwAccess_T_new*)hHwAccess; 398 399 if (pHwAccess) 400 { 401#ifdef HW_ACCESS_SDIO 402 403 SDIO_Stop(pHwAccess->hDriver, 0); 404 SDIO_Shutdown(pHwAccess->hDriver); 405 406#elif defined(HW_ACCESS_WSPI) 407 408 WSPI_Close(pHwAccess->hDriver); 409 410#endif 411 412 413 if (pHwAccess->hProtect) 414 os_protectDestroy(pHwAccess->hOs, pHwAccess->hProtect); 415 os_memoryFree(pHwAccess->hOs, pHwAccess, sizeof(HwAccess_T_new)); 416 } 417 return OK; 418} 419 420 421/**************************************************************************** 422 * whal_hwAccess_Config 423 **************************************************************************** 424 * DESCRIPTION: config the module. 425 * 426 * INPUTS: hHwAccess - handle to the module context 427 * hReport - handle to report module context that is used when we output debug messages 428 * 429 * OUTPUT: none. 430 * 431 * RETURNS: one of the error codes (0 => OK) 432 ****************************************************************************/ 433int whal_hwAccess_Config(TI_HANDLE hHwAccess, TI_HANDLE hReport,UINT32 RegBaseAddr, UINT32 MemBaseAddr, HwAccess_callback_t CBFunc,void* CBArg) 434{ 435 HwAccess_T_new *pHwAccess = (HwAccess_T_new*) hHwAccess; 436 int status = OK; 437 438#ifdef HW_ACCESS_WSPI 439 WSPIConfig_t wspi_config; 440#endif 441 442 pHwAccess->hReport = hReport; 443 444#ifdef GWSI_SPI_TEST 445 /* For GWSI_API_TEST this parameter should be maximum allowed because we don't use setPartition */ 446 pHwAccess->workingPartUpperLimit = 0xFFFFFFFF; 447#endif /* GWSI_API_TEST */ 448 /* 449 Wait 200 usec for memory repair process to finish and device is ready. 450 */ 451 os_StalluSec(pHwAccess->hOs, 200); 452 453 pHwAccess->CB.CBFunc = CBFunc; 454 pHwAccess->CB.CBArg = CBArg; 455 456#ifdef HW_ACCESS_SDIO 457 458 pHwAccess->RegisterRegionAddr = HW_ACCESS_DOWN_PART0_SIZE; 459 pHwAccess->MemRegionAddr = HW_ACCESS_DOWN_PART0_ADDR; 460 pHwAccess->uBusError = 0; 461 462 status = SDIO_Start (pHwAccess->hDriver); 463 464 status = (status == SDIO_SUCCESS) ? TNETWIF_COMPLETE : TNETWIF_ERROR; 465 466#elif defined(HW_ACCESS_WSPI) 467 468 wspi_config.isFixedAddress = FALSE; 469 wspi_config.fixedBusyLength = HW_ACCESS_WSPI_FIXED_BUSY_LEN; 470 wspi_config.mask = HW_ACCESS_WSPI_INIT_CMD_MASK; 471 472 status = WSPI_Configure (pHwAccess->hDriver, 473 pHwAccess->hReport, 474 &wspi_config, 475 (WSPI_CB_T*)&pHwAccess->CB); 476 477 WSPI_SetErrLog(pHwAccess->hDriver, TNETWIF_printErrorLog); 478 479 WSPI2TNETWIF (pHwAccess, status, 0x0); 480 481#else /* HW_ACCESS_CARDBUS */ 482 pHwAccess->RegBaseAddr = RegBaseAddr; 483 pHwAccess->MemBaseAddr = MemBaseAddr; 484#endif 485 486 return status; 487} 488 489/**************************************************************************** 490 * whal_hwAccess_ReConfig() 491 **************************************************************************** 492 * DESCRIPTION: 493 * 494 * INPUTS: None 495 * 496 * OUTPUT: None 497 * 498 * RETURNS: 499 ****************************************************************************/ 500int whal_hwAccess_ReConfig(TI_HANDLE hHwAccess) 501{ 502 HwAccess_T_new* pHwAccess = (HwAccess_T_new*)hHwAccess; 503 504#ifdef _WINDOWS 505#else /* _WINDOWS */ 506 /* unbclock the access to the bus */ 507 pHwAccess->uBusError = 0; 508 509#ifdef HW_ACCESS_SDIO 510 SDIO_Stop (pHwAccess->hDriver, 0); 511 SDIO_Start (pHwAccess->hDriver); 512#elif defined(HW_ACCESS_WSPI) 513 /* TODO*/ 514#endif 515#endif /* _WINDOWS */ 516 return OK; 517} 518 519 520#ifdef USE_SYNC_API 521/**************************************************************************** 522 * whal_hwAccess_WriteELP 523 **************************************************************************** 524 * DESCRIPTION: write data synchronously to the TNET ELP register (1byte) 525 * 526 * INPUTS: pHwAccess - TI_HANDLE * - the HwAccess context 527 * data - UINT8 - the data to write 528 * 529 * OUTPUT: none 530 * 531 * RETURNS: one of the error codes (0 => OK) 532 ****************************************************************************/ 533int whal_hwAccess_WriteELP (TI_HANDLE hHwAccess, UINT32 data) 534{ 535 HwAccess_T_new* pHwAccess = (HwAccess_T_new*)hHwAccess; 536 int status = OK; 537 538 os_profile (pHwAccess->hOs, 2, 0); 539 540#ifdef HW_ACCESS_SDIO 541 status = SDIO_TNETW_Set_ELP_Reg(pHwAccess->hDriver, HW_ACCESS_ELP_CTRL_REG_ADDR, data); 542#elif defined(HW_ACCESS_WSPI) 543 status = WSPI_WriteSync (pHwAccess->hDriver, HW_ACCESS_ELP_CTRL_REG_ADDR, (UINT8*)&data, HW_ACCESS_REGISTER_SIZE); 544#endif 545 546 os_profile (pHwAccess->hOs, 3, 0); 547 548 if (status != OK) 549 { 550 WLAN_REPORT_ERROR(pHwAccess->hReport, HAL_HW_CTRL_MODULE_LOG, 551 ("whal_hwAccess_WriteReg_ELP: Error in ELP reg write status=%d\n", 552 status)); 553 return NOK; 554 } 555 556 return OK; 557} 558#endif /* USE_SYNC_API */ 559 560/**************************************************************************** 561 * whal_hwAccess_WriteELPAsync 562 **************************************************************************** 563 * DESCRIPTION: write data synchronously from the TNET using the defined access (WSPI/SDIO). 564 * the length of data is always 4bytes cause this is the size of the TNET registers 565 * the function is passed a call-back function that will be called after the read request ends. 566 * 567 * INPUTS: pHwAccess - TI_HANDLE * - the HwAccess context 568 * addr - UINT32 - the address offset inside the TNET 569 * data - UINT8* - a pointer to the buffer that holds the data to write 570 * bMore - indicate whether more txn on the bus are about to happen (FALSE only when setting 571 * the HW to sleep). 572 * 573 * OUTPUT: none 574 * 575 * RETURNS: one of the error codes (0 => OK) 576 ****************************************************************************/ 577int whal_hwAccess_WriteELPAsync (TI_HANDLE hHwAccess, UINT32 data, BOOL bCb, BOOL bMore) 578{ 579#if defined(HW_ACCESS_SDIO) 580 581 #if defined(HW_ACCESS_SDIO_ASYNC_SUPPORT) 582 583 #error "SDIO asynchronous mode is not supported" 584 585 /* Not implemented yet */ 586 return OK; 587 588 #else 589 590 /* Just call to synchronous API */ 591 return (whal_hwAccess_WriteELP (hHwAccess, data) == OK) ? 592 TNETWIF_COMPLETE : 593 TNETWIF_ERROR; 594 595 596 #endif 597 598#else /* HW_ACCESS_WSPI */ 599 600 HwAccess_T_new* pHwAccess = (HwAccess_T_new*)hHwAccess; 601 WSPI_CB_T Cb = { NULL, NULL }, *pCb; 602 int status; 603 604 pCb = (bCb) ? ((WSPI_CB_T*)&pHwAccess->CB) : &Cb; 605 606 os_profile (pHwAccess->hOs, 2, 0); 607 608 /* since we are writing a register - no extra space is needed */ 609 status = WSPI_WriteAsync (pHwAccess->hDriver, 610 HW_ACCESS_ELP_CTRL_REG_ADDR, 611 (UINT8*)&data, 612 HW_ACCESS_REGISTER_SIZE, 613 pCb, 614 bMore, 615 FALSE); 616 617 os_profile (pHwAccess->hOs, 3, 0); 618 619 WSPI2TNETWIF (pHwAccess, status, HW_ACCESS_ELP_CTRL_REG_ADDR); 620 621 return status; 622 623#endif 624} 625 626/**************************************************************************** 627 * whal_hwAccess_ReadELPAsync 628 **************************************************************************** 629 * DESCRIPTION: Read the ELP register 630 * 631 * INPUTS: pHwAccess - TI_HANDLE * - the HwAccess context 632 * addr - UINT32 - the address offset inside the TNET 633 * data - UINT8* - a pointer to the buffer to read data into 634 * bMore - indicate whether more txn on the bus are about to happen (FALSE only when setting 635 * the HW to sleep). 636 * 637 * OUTPUT: none 638 * 639 * RETURNS: one of the error codes (0 => OK) 640 ****************************************************************************/ 641int whal_hwAccess_ReadELPAsync (TI_HANDLE hHwAccess, UINT8 *data, BOOL bCb, BOOL bMore) 642{ 643 HwAccess_T_new* pHwAccess = (HwAccess_T_new*)hHwAccess; 644 int status; 645 646#ifdef HW_ACCESS_SDIO 647 648 #ifndef _WINDOWS 649 status = SDIO_TNETW_Get_ELP_Reg(pHwAccess->hDriver, HW_ACCESS_ELP_CTRL_REG_ADDR, (UINT32*)data); 650 #else 651 #endif 652 653 if (status != OK) 654 { 655 WLAN_REPORT_ERROR(pHwAccess->hReport, HAL_HW_CTRL_MODULE_LOG, 656 ("whal_hwAccess_ReadELPAsync: Error in ELP reg raed status=%d\n", 657 status)); 658 return TNETWIF_ERROR; 659 } 660 return TNETWIF_COMPLETE; 661 662#else /* HW_ACCESS_WSPI */ 663 664 os_profile (pHwAccess->hOs, 2, 0); 665 666 /* In registers we don't save place */ 667 status = WSPI_ReadAsync (pHwAccess->hDriver, 668 HW_ACCESS_ELP_CTRL_REG_ADDR, 669 (UINT8*)data, 670 HW_ACCESS_REGISTER_SIZE, 671 (WSPI_CB_T*)&pHwAccess->CB, 672 TRUE, 673 FALSE); 674 675 os_profile (pHwAccess->hOs, 3, 0); 676 677 WSPI2TNETWIF (pHwAccess, status, HW_ACCESS_ELP_CTRL_REG_ADDR); 678 679 return status; 680 681#endif 682} 683 684 685#ifdef USE_SYNC_API 686/**************************************************************************** 687 * whal_hwAccess_ReadMem_Align 688 **************************************************************************** 689 * DESCRIPTION: read data synchronously from the TNET using the defined access (WSPI/SDIO). 690 * the length of data specified is rounded up so the length will be multiple of 4 (bytes) 691 * 692 * INPUTS: hHwAccess - the handle of HwAccess module 693 * addr - UINT32 - the address offset inside the TNET 694 * len - int - the length of the data to read 695 * 696 * OUTPUT: data - UINT8* - a pointer to the buffer to fill with the read data 697 * 698 * RETURNS: one of the error codes (0 => OK) 699 ****************************************************************************/ 700int whal_hwAccess_ReadMem_Align(TI_HANDLE hHwAccess, UINT32 addr, UINT8* data, UINT16 len) 701{ 702 HwAccess_T_new* pHwAccess = (HwAccess_T_new*)hHwAccess; 703 int status = OK; 704#ifdef HW_ACCESS_SDIO 705 struct SDIO_Request request; 706#endif 707 708 /* round up the length so it will be multiple of 4bytes */ 709 if(len&0x3) 710 len = (len&0xFFFFFFFC)+4; 711 712#ifdef HW_ACCESS_SDIO 713 714 /* check address */ 715 if (((addr+len) > pHwAccess->workingPartUpperLimit) || (addr < pHwAccess->MemRegionAddr)) 716 { 717 WLAN_REPORT_ERROR(pHwAccess->hReport, HAL_HW_CTRL_MODULE_LOG, 718 ("whal_hwAccess_ReadMem_Align: Error in addr 0x%x (lower:0x%x,upper:0x%x)\n", 719 addr, pHwAccess->MemRegionAddr, pHwAccess->workingPartUpperLimit)); 720 return ERROR_HW_ACCEESS_ADDR; 721 } 722 723 request.buffer = data; /* Pointer to the data buffer aligned address. */ 724 request.buffer_len = len; /* Data buffer length in bytes */ 725 request.status = SDIO_Request_None; 726 request.peripheral_addr = (SDIO_Address)TRANSLATE_ADDRESS_MEM(addr); /*SDIO peripheral address*/ 727 request.acquire_window = 0; /*Time out value is not set*/ 728 request.block_len = 0; /*Block length. Assigned by driver*/ 729 request.physical_buffer = 0; /*Physical address of data buffer is not set*/ 730 request.owner = (SDIO_Owner) pHwAccess; 731 request.mode = MMC_DEV_BYTE_INCREMENTAL_MODE; 732 request.access_flag = 1; 733 734 os_profile (pHwAccess->hOs, 2, 0); 735 736 status = SDIO_SyncRead(pHwAccess->hDriver, &request); 737 738 os_profile (pHwAccess->hOs, 3, 0); 739 740 741#elif defined(HW_ACCESS_WSPI) 742 743 /* check address */ 744 if (((addr+len) > pHwAccess->workingPartUpperLimit) || (addr < pHwAccess->MemRegionAddr)) 745 { 746 WLAN_REPORT_ERROR(pHwAccess->hReport, HAL_HW_CTRL_MODULE_LOG, 747 ("whal_hwAccess_ReadMem_Align: Error in addr 0x%x (lower:0x%x,upper:0x%x)\n", 748 addr, pHwAccess->MemRegionAddr, pHwAccess->workingPartUpperLimit)); 749 return ERROR_HW_ACCEESS_ADDR; 750 } 751 752 os_profile (pHwAccess->hOs, 2, 0); 753 754 status = WSPI_ReadSync(pHwAccess->hDriver,TRANSLATE_ADDRESS_MEM(addr),data,len); 755 756 os_profile (pHwAccess->hOs, 3, 0); 757 758#else 759 whal_hwAccess_DirectCopy_new(pHwAccess, data, (UINT8*)addr, len); 760#endif 761 762 if (status != OK) 763 WLAN_REPORT_ERROR(pHwAccess->hReport, HAL_HW_CTRL_MODULE_LOG, 764 ("whal_hwAccess_ReadMem_Align: Error in read, addr=0x%08x status=%d\n", 765 addr, status)); 766 767#ifdef HW_ACCESS_SDIO 768 if (pHwAccess->uBusError) 769 { 770 WLAN_REPORT_ERROR(pHwAccess->hReport, HAL_HW_CTRL_MODULE_LOG, 771 ("whal_hwAccess_ReadMem_Align: SDIO Error status=%d\n", 772 request.status)); 773 if (pHwAccess->hwAccesserror_Cb) 774 { 775 UINT8 failure_reason = HEALTH_REPORT_BUS_ERROR; 776 pHwAccess->hwAccesserror_Cb(pHwAccess->hBackReference,(char*)&failure_reason,2); 777 } 778 else 779 pHwAccess->uBusError = 0; 780 } 781#endif 782 783 return status; 784} 785 786/**************************************************************************** 787 * whal_hwAccess_WriteMem_Align 788 **************************************************************************** 789 * DESCRIPTION: write data synchronously to the TNET using the defined access (WSPI/SDIO). 790 * the length of data specified is rounded up so the length will be multiple of 4 (bytes) 791 * 792 * INPUTS: hHwAccess - the handle of HwAccess module 793 * addr - UINT32 - the address offset inside the TNET 794 * data - UINT8* - a pointer to the buffer that holds the data to write 795 * len - int - the length of the data to read 796 * 797 * OUTPUT: none 798 * 799 * RETURNS: one of the error codes (0 => OK) 800 ****************************************************************************/ 801int whal_hwAccess_WriteMem_Align(TI_HANDLE hHwAccess, UINT32 addr, UINT8* data, UINT16 len) 802{ 803 HwAccess_T_new* pHwAccess = (HwAccess_T_new*)hHwAccess; 804 int status = OK; 805#ifdef HW_ACCESS_SDIO 806 struct SDIO_Request request; 807#endif 808 809 /* round the length so it will be multiple of 4bytes */ 810 if(len&0x3) 811 len = (len&0xFFFFFFFC)+4; 812 813#ifdef HW_ACCESS_SDIO 814 815 /* check address */ 816 if (((addr+len) > pHwAccess->workingPartUpperLimit) || (addr < pHwAccess->MemRegionAddr)) 817 { 818 WLAN_REPORT_ERROR(pHwAccess->hReport, HAL_HW_CTRL_MODULE_LOG, 819 ("whal_hwAccess_WriteMem_Align: Error in addr 0x%x (lower:0x%x,upper:0x%x)\n", 820 addr, pHwAccess->MemRegionAddr, pHwAccess->workingPartUpperLimit)); 821 return ERROR_HW_ACCEESS_ADDR; 822 } 823 824 request.buffer = data; /* Pointer to the data buffer aligned address. */ 825 request.buffer_len = len; /* Data buffer length in bytes */ 826 request.status = SDIO_Request_None; 827 request.peripheral_addr = (SDIO_Address)TRANSLATE_ADDRESS_MEM(addr); /*SDIO peripheral address*/ 828 request.acquire_window = 0; /*Time out value is not set*/ 829 request.block_len = 0; /*Block length. Assigned by driver*/ 830 request.physical_buffer = 0; /*Physical address of data buffer is not set*/ 831 request.owner = (SDIO_Owner) pHwAccess; 832 request.mode = MMC_DEV_BYTE_INCREMENTAL_MODE; 833 request.access_flag = 0; 834 835 os_profile (pHwAccess->hOs, 2, 0); 836 837 status = SDIO_SyncWrite(pHwAccess->hDriver, &request); 838 839 os_profile (pHwAccess->hOs, 3, 0); 840 841 842#elif defined(HW_ACCESS_WSPI) 843 844 /* check address */ 845 if (((addr+len) > pHwAccess->workingPartUpperLimit) || (addr < pHwAccess->MemRegionAddr)) 846 { 847 WLAN_REPORT_ERROR(pHwAccess->hReport, HAL_HW_CTRL_MODULE_LOG, 848 ("whal_hwAccess_WriteMem_Align: Error in addr 0x%x (lower:0x%x,upper:0x%x)\n", 849 addr, pHwAccess->MemRegionAddr, pHwAccess->workingPartUpperLimit)); 850 return ERROR_HW_ACCEESS_ADDR; 851 } 852 853 os_profile (pHwAccess->hOs, 2, 0); 854 855 status = WSPI_WriteSync(pHwAccess->hDriver,TRANSLATE_ADDRESS_MEM(addr),data,len); 856 857 os_profile (pHwAccess->hOs, 3, 0); 858 859#else 860 whal_hwAccess_DirectCopy_new(pHwAccess, (UINT8*)addr, data, len); 861#endif 862 863 if (status != OK) 864 WLAN_REPORT_ERROR(pHwAccess->hReport, HAL_HW_CTRL_MODULE_LOG, 865 ("whal_hwAccess_WriteMem_Align: Error in write, addr=0x%08x status=%d\n", 866 addr, status)); 867 868#ifdef HW_ACCESS_SDIO 869 if (pHwAccess->uBusError) 870 { 871 WLAN_REPORT_ERROR(pHwAccess->hReport, HAL_HW_CTRL_MODULE_LOG, 872 ("whal_hwAccess_WriteMem_Align: SDIO Error in write status=%d\n", 873 request.status)); 874 if (pHwAccess->hwAccesserror_Cb) 875 { 876 UINT8 failure_reason = HEALTH_REPORT_BUS_ERROR; 877 pHwAccess->hwAccesserror_Cb(pHwAccess->hBackReference,(char*)&failure_reason,2); 878 } 879 else 880 pHwAccess->uBusError = 0; 881 } 882#endif 883 884 return status; 885} 886#endif /* USE_SYNC_API */ 887 888/**************************************************************************** 889 * whal_hwAccess_ReadMemAsync_Align 890 **************************************************************************** 891 * DESCRIPTION: read data asynchronously from the TNET using the defined access (WSPI/SDIO). 892 * the length of data specified is rounded up so the length will be multiple of 4 (bytes) 893 * the function is passed a call-back function that will be called after the read request ends. 894 * 895 * INPUTS: hHwAccess - the handle of HwAccess module 896 * addr - UINT32 - the address offset inside the TNET 897 * len - int - the length of the data to read 898 * CB - HWAccess_CB_T* - a pointer to a structure that holds the CB function and the passed arg. 899 * 900 * OUTPUT: data - UINT8* - a pointer to the buffer to fill with the read data 901 * 902 * RETURNS: one of the error codes (0 => OK) 903 ****************************************************************************/ 904int whal_hwAccess_ReadMemAsync_Align(TI_HANDLE hHwAccess, UINT32 addr, UINT8* data, UINT16 len) 905{ 906 HwAccess_T_new* pHwAccess = (HwAccess_T_new*)hHwAccess; 907 908 /* Round the length so it will be multiple of 4bytes */ 909 if ((len & 0x3) != 0) 910 len = (len & ~3) + 4; 911 912 /* Check address */ 913 if (addr + len > pHwAccess->workingPartUpperLimit || addr < pHwAccess->MemRegionAddr) 914 { 915 WLAN_REPORT_ERROR(pHwAccess->hReport, HAL_HW_CTRL_MODULE_LOG, 916 ("whal_hwAccess_ReadMemAsync_Align: Error in addr 0x%x (lower:0x%x,upper:0x%x)\n", 917 addr, pHwAccess->MemRegionAddr, pHwAccess->workingPartUpperLimit)); 918 return ERROR_HW_ACCEESS_ADDR; 919 } 920 921#if defined(HW_ACCESS_SDIO) 922 923 #if defined(HW_ACCESS_SDIO_ASYNC_SUPPORT) 924 { 925 struct SDIO_Request request; 926 int status = OK; 927 928 request.buffer = data; /* Pointer to the data buffer aligned address. */ 929 request.buffer_len = len; /* Data buffer length in bytes */ 930 request.status = SDIO_Request_None; 931 request.peripheral_addr = (SDIO_Address)TRANSLATE_ADDRESS_MEM(addr); /*SDIO peripheral address*/ 932 request.acquire_window = 0; /*Time out value is not set*/ 933 request.block_len = 0; /*Block length. Assigned by driver*/ 934 request.physical_buffer = 0; /*Physical address of data buffer is not set*/ 935 request.owner = (SDIO_Owner) pHwAccess; 936 request.mode = MMC_DEV_BYTE_INCREMENTAL_MODE; 937 request.access_flag = 1; 938 request.fnotify = sdio_async_transaction_notify; /* completion notification */ 939 request.ferror = sdio_async_transaction_error; /* error notification */ 940 941 os_profile (pHwAccess->hOs, 2, 0); 942 943 status = SDIO_AsyncRead (pHwAccess->hDriver, &request); 944 945 os_profile (pHwAccess->hOs, 3, 0); 946 947 if (status != OK) 948 { 949 WLAN_REPORT_ERROR(pHwAccess->hReport, HAL_HW_CTRL_MODULE_LOG, 950 ("whal_hwAccess_ReadMemAsync_Align: Error in read async, addr=0x%08x status=%d\n", 951 addr, status)); 952 return TNETWIF_ERROR; 953 } 954 955 if (pHwAccess->uBusError) 956 { 957 WLAN_REPORT_ERROR(pHwAccess->hReport, HAL_HW_CTRL_MODULE_LOG, 958 ("whal_hwAccess_ReadMemAsync_Align: SDIO Error status=%d\n", 959 request.status)); 960 if (pHwAccess->hwAccesserror_Cb) 961 { 962 UINT16 failure_reason = HEALTH_REPORT_BUS_ERROR; 963 pHwAccess->hwAccesserror_Cb(pHwAccess->hBackReference,&failure_reason,2); 964 } 965 else 966 pHwAccess->uBusError = 0; 967 } 968 969 return TNETWIF_COMPLETE; 970 } 971 972 #else 973 974 return TNETWIF_COMPLETE; 975 976 #endif 977 978#else /*HW_ACCESS_WSPI*/ 979 { 980 int status; 981 982 os_profile (pHwAccess->hOs, 2, 0); 983 984 status = WSPI_ReadAsync (pHwAccess->hDriver, 985 TRANSLATE_ADDRESS_MEM(addr), 986 data, 987 len, 988 (WSPI_CB_T*)&pHwAccess->CB, 989 TRUE, 990 0); 991 992 os_profile (pHwAccess->hOs, 3, 0); 993 994 WSPI2TNETWIF (pHwAccess, status, addr); 995 996 return status; 997 } 998 999#endif 1000} 1001 1002/**************************************************************************** 1003 * whal_hwAccess_WriteAsync_Align 1004 **************************************************************************** 1005 * DESCRIPTION: write data synchronously from the TNET using the defined access (WSPI/SDIO). 1006 * the length of data specified is rounded up so the length will be multiple of 4 (bytes) 1007 * the function is passed a call-back function that will be called after the read request ends. 1008 * 1009 * INPUTS: pHwAccess - HwAccess_T* - the HwAccess context 1010 * addr - UINT32 - the address offset inside the TNET 1011 * data - UINT8* - a pointer to the buffer that holds the data to write 1012 * Len - int - the length of the data to read 1013 * CB - HWAccess_CB_T* - a pointer to a structure that holds the CB function and the passed arg. 1014 * 1015 * OUTPUT: none 1016 * 1017 * RETURNS: one of the error codes (0 => OK) 1018 ****************************************************************************/ 1019 int whal_hwAccess_WriteMemAsync_Align(TI_HANDLE hHwAccess, UINT32 addr, UINT8* data, UINT16 len) 1020{ 1021 HwAccess_T_new* pHwAccess = (HwAccess_T_new*)hHwAccess; 1022 1023 /* Round the length so it will be multiple of 4bytes */ 1024 if ((len & 0x3) != 0) 1025 len = (len & ~3) + 4; 1026 1027 /* Check address */ 1028 if (addr + len > pHwAccess->workingPartUpperLimit || addr < pHwAccess->MemRegionAddr) 1029 { 1030 WLAN_REPORT_ERROR(pHwAccess->hReport, HAL_HW_CTRL_MODULE_LOG, 1031 ("whal_hwAccess_WriteMemAsync_Align: Error in addr 0x%x (lower:0x%x,upper:0x%x)\n", 1032 addr, pHwAccess->MemRegionAddr, pHwAccess->workingPartUpperLimit)); 1033 return ERROR_HW_ACCEESS_ADDR; 1034 } 1035 1036#if defined(HW_ACCESS_SDIO) 1037 1038 #if defined(HW_ACCESS_SDIO_ASYNC_SUPPORT) 1039 { 1040 struct SDIO_Request request; 1041 int status = OK; 1042 1043 request.buffer = data; /*Pointer to the data buffer aligned address*/ 1044 request.buffer_len = len; /*Data buffer length in bytes*/ 1045 request.status = SDIO_Request_None; 1046 request.peripheral_addr = (SDIO_Address)TRANSLATE_ADDRESS_MEM(addr); /*SDIO peripheral address*/ 1047 request.acquire_window = 0; /* Time out value is not set */ 1048 request.block_len = 0; /* Block length. Assigned by driver */ 1049 request.physical_buffer = 0; /* Physical address of data buffer is not set */ 1050 request.owner = (SDIO_Owner) pHwAccess; 1051 request.mode = MMC_DEV_BYTE_INCREMENTAL_MODE; 1052 request.access_flag = 0; 1053 request.fnotify = sdio_async_transaction_notify; /* completion notification */ 1054 request.ferror = sdio_async_transaction_error; /* error notification */ 1055 1056 os_profile (pHwAccess->hOs, 2, 0); 1057 1058 status = SDIO_AsyncWrite (pHwAccess->hDriver, &request); 1059 1060 os_profile (pHwAccess->hOs, 3, 0); 1061 1062 if (status != OK) 1063 { 1064 WLAN_REPORT_ERROR(pHwAccess->hReport, HAL_HW_CTRL_MODULE_LOG, 1065 ("whal_hwAccess_WriteMemAsync_Align: Error in write async, addr=0x%08x status=%d\n", 1066 addr, status)); 1067 1068 return TNETWIF_ERROR; 1069 } 1070 1071 return TNETWIF_COMPLETE; 1072 } 1073 1074 #else 1075 1076 return TNETWIF_COMPLETE; 1077 1078 #endif 1079 1080#else /*HW_ACCESS_WSPI*/ 1081 { 1082 int status; 1083 1084 os_profile (pHwAccess->hOs, 2, 0); 1085 1086 status = WSPI_WriteAsync (pHwAccess->hDriver, 1087 TRANSLATE_ADDRESS_MEM(addr), 1088 data, 1089 len, 1090 (WSPI_CB_T*)&pHwAccess->CB, 1091 TRUE, 1092 FALSE); 1093 1094 os_profile (pHwAccess->hOs, 3, 0); 1095 1096 WSPI2TNETWIF (pHwAccess, status, addr); 1097 1098 return status; 1099 } 1100#endif 1101} 1102 1103 1104#ifdef USE_SYNC_API 1105/**************************************************************************** 1106 * whal_hwAccess_ReadMem 1107 **************************************************************************** 1108 * DESCRIPTION: read data synchronously from the TNET using the defined access (WSPI/SDIO). 1109 * the length of data is checked and the remnant (length%4) is completed with read-modify 1110 * 1111 * INPUTS: pHwAccess - HwAccess_T* - the HwAccess context 1112 * AddrOffset - UINT32 - the address offset inside the TNET 1113 * Len - int - the length of the data to read 1114 * 1115 * OUTPUT: data - UINT8* - a pointer to the buffer to fill with the read data 1116 * 1117 * RETURNS: one of the error codes (0 => OK) 1118 ****************************************************************************/ 1119int whal_hwAccess_ReadMem(TI_HANDLE hHwAccess, UINT32 addr, UINT8* data, UINT16 len) 1120{ 1121 int status = OK; 1122 HwAccess_T_new* pHwAccess = (HwAccess_T_new*)hHwAccess; 1123 1124#ifdef HW_ACCESS_SDIO 1125 struct SDIO_Request request; 1126#elif defined(HW_ACCESS_WSPI) 1127 int reminder = len%HW_ACCESS_WSPI_ALIGNED_SIZE; 1128 int tempLen = len - reminder; 1129 UINT32 mask = 0; 1130 status = whal_hwAccess_ReadMemAsync(hHwAccess, addr, data, len); 1131 if (status == TNETWIF_COMPLETE) 1132 { 1133 status = OK; 1134 } 1135 return status; 1136#endif 1137 1138 /* access is blocked */ 1139 if (pHwAccess->uBusError) 1140 { 1141 WLAN_REPORT_ERROR(pHwAccess->hReport, HAL_CTRL_MODULE_LOG, 1142 ("Bus is blocked \n")); 1143 return ERROR_HW_ACCEESS_ADDR; 1144 } 1145 1146#ifdef __HWACCESS_DEBUG__ 1147 /* check address alignment */ 1148 if(addr & 0x3) 1149 { 1150 WLAN_REPORT_ERROR(pHwAccess->hReport, HAL_HW_CTRL_MODULE_LOG, 1151 ("whal_hwAccess_ReadMem: addr is not aligned 0x%x\n", 1152 addr)); 1153 } 1154 1155#endif 1156 1157#ifdef HW_ACCESS_SDIO 1158 1159 /* check address */ 1160 if (((addr+len) > pHwAccess->workingPartUpperLimit) || (addr < pHwAccess->MemRegionAddr)) 1161 { 1162 WLAN_REPORT_ERROR(pHwAccess->hReport, HAL_HW_CTRL_MODULE_LOG, 1163 ("whal_hwAccess_ReadMem: Error in addr 0x%x (lower:0x%x,upper:0x%x)\n", 1164 addr, pHwAccess->MemRegionAddr, pHwAccess->workingPartUpperLimit)); 1165 return ERROR_HW_ACCEESS_ADDR; 1166 } 1167 1168 request.buffer = data; /* Pointer to the data buffer aligned address. */ 1169 request.buffer_len = len; /* Data buffer length in bytes */ 1170 request.status = SDIO_Request_None; 1171 request.peripheral_addr = (SDIO_Address)TRANSLATE_ADDRESS_MEM(addr); /*SDIO peripheral address*/ 1172 request.acquire_window = 0; /*Time out value is not set*/ 1173 request.block_len = 0; /*Block length. Assigned by driver*/ 1174 request.physical_buffer = 0; /*Physical address of data buffer is not set*/ 1175 request.owner = (SDIO_Owner) pHwAccess; 1176 request.mode = MMC_DEV_BYTE_INCREMENTAL_MODE; 1177 request.access_flag = 1; 1178 1179 os_profile (pHwAccess->hOs, 2, 0); 1180 1181 status = SDIO_SyncRead(pHwAccess->hDriver, &request); 1182 1183 os_profile (pHwAccess->hOs, 3, 0); 1184 1185 if (status != OK) 1186 { 1187 WLAN_REPORT_ERROR(pHwAccess->hReport, HAL_HW_CTRL_MODULE_LOG, 1188 ("whal_hwAccess_ReadMem: SDIO Error in read\n")); 1189 return status; 1190 } 1191 1192#elif defined(HW_ACCESS_WSPI) 1193 1194 /* check address */ 1195 if (((addr+len) > pHwAccess->workingPartUpperLimit) || (addr < pHwAccess->MemRegionAddr)) 1196 { 1197 WLAN_REPORT_ERROR(pHwAccess->hReport, HAL_HW_CTRL_MODULE_LOG, 1198 ("whal_hwAccess_ReadMem: Error in addr 0x%x (lower:0x%x,upper:0x%x)\n", 1199 addr, pHwAccess->MemRegionAddr, pHwAccess->workingPartUpperLimit)); 1200 return ERROR_HW_ACCEESS_ADDR; 1201 } 1202 1203 os_profile (pHwAccess->hOs, 2, 0); 1204 1205 /* read the aligned size */ 1206 status = WSPI_ReadSync(pHwAccess->hDriver,TRANSLATE_ADDRESS_MEM(addr),data,tempLen); 1207 1208 os_profile (pHwAccess->hOs, 3, 0); 1209 1210 if (status != OK) 1211 { 1212 WLAN_REPORT_ERROR(pHwAccess->hReport, HAL_HW_CTRL_MODULE_LOG, 1213 ("whal_hwAccess_ReadMem: WSPI Error in read\n")); 1214 return status; 1215 } 1216 1217 /* read the non aligned reminder */ 1218 if(reminder) 1219 { 1220 UINT32 tempVal = 0; 1221 1222 os_profile (pHwAccess->hOs, 2, 0); 1223 1224 /* read the extra data*/ 1225 status |= WSPI_ReadSync(pHwAccess->hDriver,TRANSLATE_ADDRESS_MEM(addr+tempLen),(UINT8*)&tempVal,HW_ACCESS_WSPI_ALIGNED_SIZE); 1226 1227 os_profile (pHwAccess->hOs, 3, 0); 1228 1229 if (status != OK) 1230 { 1231 WLAN_REPORT_ERROR(pHwAccess->hReport, HAL_HW_CTRL_MODULE_LOG, 1232 ("whal_hwAccess_ReadMem: WSPI Error in read\n")); 1233 return status; 1234 } 1235 1236 /* extract the relevant data */ 1237 switch(reminder) 1238 { 1239 case 1: 1240 mask = HW_ACCESS_1_BYTE_REMINDE_MASK; 1241 break; 1242 case 2: 1243 mask = HW_ACCESS_2_BYTE_REMINDE_MASK; 1244 break; 1245 case 3: 1246 mask = HW_ACCESS_3_BYTE_REMINDE_MASK; 1247 break; 1248 } 1249 *(UINT32*)&data[tempLen] &= ~mask; 1250 *(UINT32*)&data[tempLen] |= tempVal & mask; 1251 } 1252 1253#else 1254 whal_hwAccess_DirectCopy_new(pHwAccess, data, (UINT8*)(pHwAccess->MemBaseAddr+addr), len); 1255#endif 1256 1257#ifdef HW_ACCESS_SDIO 1258 if (pHwAccess->uBusError) 1259 { 1260 WLAN_REPORT_ERROR(pHwAccess->hReport, HAL_HW_CTRL_MODULE_LOG, 1261 ("whal_hwAccess_ReadMem: SDIO Error status=%d\n", 1262 request.status)); 1263 if (pHwAccess->hwAccesserror_Cb) 1264 { 1265 UINT8 failure_reason = HEALTH_REPORT_BUS_ERROR; 1266 pHwAccess->hwAccesserror_Cb(pHwAccess->hBackReference,(char*)&failure_reason,2); 1267 } 1268 else 1269 pHwAccess->uBusError = 0; 1270 } 1271#endif 1272 1273 return OK; 1274} 1275 1276 1277 1278/**************************************************************************** 1279 * whal_hwAccess_WriteMem 1280 **************************************************************************** 1281 * DESCRIPTION: write data synchronously to the TNET using the defined access (WSPI/SDIO). 1282 * the length of data is checked and the remnant (length%4) is completed with read-modify-write 1283 * 1284 * INPUTS: pHwAccess - TI_HANDLE* - the HwAccess context 1285 * addr - UINT32 - the address offset inside the TNET 1286 * data - UINT8* - a pointer to the buffer that holds the data to write 1287 * Len - int - the length of the data to read 1288 * 1289 * OUTPUT: none 1290 * 1291 * RETURNS: one of the error codes (0 => OK) 1292 ****************************************************************************/ 1293int whal_hwAccess_WriteMem(TI_HANDLE hHwAccess, UINT32 addr, UINT8* data, UINT16 len) 1294{ 1295 int status = OK; 1296 HwAccess_T_new* pHwAccess = (HwAccess_T_new*)hHwAccess; 1297 1298#ifdef HW_ACCESS_SDIO 1299 struct SDIO_Request request; 1300#elif defined(HW_ACCESS_WSPI) 1301 int reminder = len % HW_ACCESS_WSPI_ALIGNED_SIZE; 1302 int tempLen = len - reminder; 1303 UINT32 mask = 0; 1304 status = whal_hwAccess_WriteMemAsync(hHwAccess, addr, data, len); 1305 if (status == TNETWIF_COMPLETE) 1306 { 1307 status = OK; 1308 } 1309 return status; 1310#endif 1311 1312 /* access is blocked */ 1313 if (pHwAccess->uBusError) 1314 { 1315 WLAN_REPORT_ERROR(pHwAccess->hReport, HAL_CTRL_MODULE_LOG, 1316 ("Bus is blocked \n")); 1317 return ERROR_HW_ACCEESS_ADDR; 1318 } 1319 1320#ifdef __HWACCESS_DEBUG__ 1321 /* check address alignment */ 1322 if(addr & 0x3) 1323 WLAN_REPORT_ERROR(pHwAccess->hReport, HAL_HW_CTRL_MODULE_LOG, 1324 ("whal_hwAccess_WriteMem: addr is not aligned 0x%x\n", 1325 addr)); 1326#endif 1327 1328#ifdef HW_ACCESS_SDIO 1329 1330 /* check address */ 1331 if (((addr+len) > pHwAccess->workingPartUpperLimit) || (addr < pHwAccess->MemRegionAddr)) 1332 { 1333 WLAN_REPORT_ERROR(pHwAccess->hReport, HAL_HW_CTRL_MODULE_LOG, 1334 ("whal_hwAccess_WriteMem: Error in addr 0x%x (lower:0x%x,upper:0x%x)\n", 1335 addr, pHwAccess->MemRegionAddr, pHwAccess->workingPartUpperLimit)); 1336 return ERROR_HW_ACCEESS_ADDR; 1337 } 1338 1339 request.buffer = data; /* Pointer to the data buffer aligned address. */ 1340 request.buffer_len = len; /* Data buffer length in bytes */ 1341 request.status = SDIO_Request_None; 1342 request.peripheral_addr = (SDIO_Address)TRANSLATE_ADDRESS_MEM(addr); /*SDIO peripheral address*/ 1343 request.acquire_window = 0; /*Time out value is not set*/ 1344 request.block_len = 0; /*Block length. Assigned by driver*/ 1345 request.physical_buffer = 0; /*Physical address of data buffer is not set*/ 1346 request.owner = (SDIO_Owner) pHwAccess; 1347 request.mode = MMC_DEV_BYTE_INCREMENTAL_MODE; 1348 request.access_flag = 0; 1349 1350 os_profile (pHwAccess->hOs, 2, 0); 1351 1352 status = SDIO_SyncWrite(pHwAccess->hDriver, &request); 1353 1354 os_profile (pHwAccess->hOs, 3, 0); 1355 1356 if (status != OK) 1357 { 1358 WLAN_REPORT_ERROR(pHwAccess->hReport, HAL_HW_CTRL_MODULE_LOG, 1359 ("whal_hwAccess_WriteMem: SDIO Error in write (%d)\n", status)); 1360 return status; 1361 } 1362 1363#elif defined(HW_ACCESS_WSPI) 1364 1365 /* check address */ 1366 if (((addr+len) > pHwAccess->workingPartUpperLimit) || (addr < pHwAccess->MemRegionAddr)) 1367 { 1368 WLAN_REPORT_ERROR(pHwAccess->hReport, HAL_HW_CTRL_MODULE_LOG, 1369 ("whal_hwAccess_WriteMem: Error in addr 0x%x (lower:0x%x,upper:0x%x)\n", 1370 addr, pHwAccess->MemRegionAddr, pHwAccess->workingPartUpperLimit)); 1371 return ERROR_HW_ACCEESS_ADDR; 1372 } 1373 1374 os_profile (pHwAccess->hOs, 2, 0); 1375 1376 /* write the aligned size */ 1377 status = WSPI_WriteSync(pHwAccess->hDriver,TRANSLATE_ADDRESS_MEM(addr),data,tempLen); 1378 1379 os_profile (pHwAccess->hOs, 3, 0); 1380 1381 1382 if (status != OK) 1383 { 1384 WLAN_REPORT_ERROR(pHwAccess->hReport, HAL_HW_CTRL_MODULE_LOG, 1385 ("whal_hwAccess_WriteMem: WSPI Error in write\n")); 1386 return status; 1387 } 1388 1389 /* read the non aligned reminder */ 1390 if(reminder) 1391 { 1392 UINT32 tempVal; 1393 1394 os_profile (pHwAccess->hOs, 2, 0); 1395 1396 /* read the extra data*/ 1397 status |= WSPI_ReadSync(pHwAccess->hDriver,TRANSLATE_ADDRESS_MEM(addr + tempLen),(UINT8*)&tempVal,HW_ACCESS_WSPI_ALIGNED_SIZE); 1398 1399 os_profile (pHwAccess->hOs, 3, 0); 1400 1401 if (status != OK) 1402 { 1403 WLAN_REPORT_ERROR(pHwAccess->hReport, HAL_HW_CTRL_MODULE_LOG, 1404 ("whal_hwAccess_WriteMem: WSPI Error in read\n")); 1405 return status; 1406 } 1407 1408 /* extract the relevant data */ 1409 switch(reminder) 1410 { 1411 case 1: 1412 mask = HW_ACCESS_1_BYTE_REMINDE_MASK; 1413 break; 1414 case 2: 1415 mask = HW_ACCESS_2_BYTE_REMINDE_MASK; 1416 break; 1417 case 3: 1418 mask = HW_ACCESS_3_BYTE_REMINDE_MASK; 1419 break; 1420 } 1421 1422 tempVal &= ~mask; 1423 tempVal |= *(UINT32*)&data[tempLen] & mask; 1424 1425 os_profile (pHwAccess->hOs, 2, 0); 1426 1427 /* write the modified extra data */ 1428 status = WSPI_WriteSync(pHwAccess->hDriver,TRANSLATE_ADDRESS_MEM(addr + tempLen),(UINT8*)&tempVal,HW_ACCESS_WSPI_ALIGNED_SIZE); 1429 1430 os_profile (pHwAccess->hOs, 3, 0); 1431 1432 if (status != OK) 1433 { 1434 WLAN_REPORT_ERROR(pHwAccess->hReport, HAL_HW_CTRL_MODULE_LOG, 1435 ("whal_hwAccess_WriteMem: WSPI Error in write\n")); 1436 return status; 1437 } 1438 } 1439 1440#else 1441 whal_hwAccess_DirectCopy_new(pHwAccess, (UINT8*)(pHwAccess->MemBaseAddr+addr), data, len); 1442#endif 1443 1444#ifdef HW_ACCESS_SDIO 1445 if (pHwAccess->uBusError) 1446 { 1447 WLAN_REPORT_ERROR(pHwAccess->hReport, HAL_HW_CTRL_MODULE_LOG, 1448 ("whal_hwAccess_WriteMem: SDIO Error in write status=%d\n", 1449 request.status)); 1450 if (pHwAccess->hwAccesserror_Cb) 1451 { 1452 UINT8 failure_reason = HEALTH_REPORT_BUS_ERROR; 1453 pHwAccess->hwAccesserror_Cb(pHwAccess->hBackReference,(char*)&failure_reason,2); 1454 } 1455 else 1456 pHwAccess->uBusError = 0; 1457 1458 } 1459#endif 1460 return OK; 1461} 1462#endif /* USE_SYNC_API */ 1463 1464 1465/**************************************************************************** 1466 * whal_hwAccess_WriteMemAsync 1467 **************************************************************************** 1468 * DESCRIPTION: write data synchronously from the TNET using the defined access (WSPI/SDIO). 1469 * the length of data is checked and the remnant (length%4) is completed with read-modify-write 1470 * the function is passed a call-back function that will be called after the read request ends. 1471 * 1472 * INPUTS: pHwAccess - TI_HANDLE* - the HwAccess context 1473 * addr - UINT32 - the address offset inside the TNET 1474 * data - UINT8* - a pointer to the buffer that holds the data to write 1475 * Len - int - the length of the data to read 1476 * CB - HWAccess_CB_T* - a pointer to a structure that holds the CB function and the passed arg. 1477 * 1478 * OUTPUT: none 1479 * 1480 * RETURNS: one of the error codes (0 => OK) 1481 ****************************************************************************/ 1482TI_STATUS whal_hwAccess_WriteMemAsync(TI_HANDLE hHwAccess, UINT32 addr, UINT8* data, UINT16 len) 1483{ 1484#if defined(HW_ACCESS_SDIO) && !defined(HW_ACCESS_SDIO_ASYNC_SUPPORT) 1485 1486 /* Just call to synchronous API - add the offset that was added to the WSPI bus - only if it was reserved*/ 1487 return (whal_hwAccess_WriteMem (hHwAccess, addr, data + TNETWIF_WRITE_OFFSET_BYTES, len) == OK) 1488 ? TNETWIF_COMPLETE 1489 : TNETWIF_ERROR; 1490 1491#else 1492 1493 HwAccess_T_new* pHwAccess = (HwAccess_T_new*)hHwAccess; 1494 int status = OK; 1495 1496 /* Access is blocked */ 1497 if (pHwAccess->uBusError) 1498 { 1499 WLAN_REPORT_ERROR(pHwAccess->hReport, HAL_CTRL_MODULE_LOG, 1500 ("Bus is blocked \n")); 1501 return (TI_STATUS)ERROR_HW_ACCEESS_ADDR; 1502 } 1503 1504 /* Check length */ 1505 if ((len & 0x3) != 0) 1506 { 1507 WLAN_REPORT_ERROR(pHwAccess->hReport, HAL_HW_CTRL_MODULE_LOG, 1508 ("whal_hwAccess_WriteMemAsync: Error in length = %d\n", 1509 len)); 1510 return (TI_STATUS)ERROR_HW_ACCEESS_LEN; 1511 } 1512 1513 /* Check address */ 1514 if (addr + len > pHwAccess->workingPartUpperLimit || 1515 addr < pHwAccess->MemRegionAddr) 1516 { 1517 WLAN_REPORT_ERROR(pHwAccess->hReport, HAL_HW_CTRL_MODULE_LOG, 1518 ("whal_hwAccess_WriteMemAsync: Error in addr 0x%x (lower:0x%x,upper:0x%x)\n", 1519 addr, pHwAccess->MemRegionAddr, pHwAccess->workingPartUpperLimit)); 1520 return (TI_STATUS)ERROR_HW_ACCEESS_ADDR; 1521 } 1522 1523#if defined(HW_ACCESS_SDIO) 1524 { 1525 struct SDIO_Request request; 1526 1527 request.buffer = data + TNETWIF_WRITE_OFFSET_BYTES; /*Pointer to the data buffer aligned address*/ 1528 request.buffer_len = len; /*Data buffer length in bytes*/ 1529 request.status = SDIO_Request_None; 1530 request.peripheral_addr = (SDIO_Address)TRANSLATE_ADDRESS_MEM(addr); /*SDIO peripheral address*/ 1531 request.acquire_window = 0; /* Time out value is not set */ 1532 request.block_len = 0; /* Block length. Assigned by driver */ 1533 request.physical_buffer = 0; /* Physical address of data buffer is not set */ 1534 request.owner = (SDIO_Owner) pHwAccess; 1535 request.mode = MMC_DEV_BYTE_INCREMENTAL_MODE; 1536 request.access_flag = 0; 1537 request.fnotify = sdio_async_transaction_notify; /* completion notification */ 1538 request.ferror = sdio_async_transaction_error; /* error notification */ 1539 1540 os_profile (pHwAccess->hOs, 2, 0); 1541 1542 status = SDIO_AsyncWrite (pHwAccess->hDriver, &request); 1543 1544 os_profile (pHwAccess->hOs, 3, 0); 1545 1546 if (status != OK) 1547 { 1548 WLAN_REPORT_ERROR(pHwAccess->hReport, HAL_HW_CTRL_MODULE_LOG, 1549 ("whal_hwAccess_WriteMemAsync: Error in write async, addr=0x%08x status=%d\n", 1550 addr, status)); 1551 return TNETWIF_ERROR; 1552 } 1553 1554 if (pHwAccess->uBusError) 1555 { 1556 WLAN_REPORT_ERROR(pHwAccess->hReport, HAL_HW_CTRL_MODULE_LOG, 1557 ("whal_hwAccess_WriteMemAsync: SDIO Error in write status=%d\n", 1558 request.status)); 1559 if (pHwAccess->hwAccesserror_Cb) 1560 { 1561 UINT8 failure_reason = HEALTH_REPORT_BUS_ERROR; 1562 pHwAccess->hwAccesserror_Cb(pHwAccess->hBackReference,&failure_reason,2); 1563 } 1564 else 1565 pHwAccess->uBusError = 0; 1566 1567 } 1568 1569 return TNETWIF_COMPLETE; 1570 } 1571 1572#elif defined(HW_ACCESS_WSPI) 1573 1574 os_profile (pHwAccess->hOs, 2, 0); 1575 1576 status = WSPI_WriteAsync (pHwAccess->hDriver, 1577 TRANSLATE_ADDRESS_MEM(addr), 1578 data, 1579 len, 1580 (WSPI_CB_T*)&pHwAccess->CB, 1581 TRUE, 1582 TRUE); /* place is always reserved in write mem operation */ 1583 1584 os_profile (pHwAccess->hOs, 3, 0); 1585 1586 WSPI2TNETWIF (pHwAccess, status, addr); 1587 1588 return (TI_STATUS)status; 1589 1590#else 1591 1592 /* By now since the CB is a SYNCH interface then call the SYNCH interface */ 1593 whal_hwAccess_DirectCopy_new(pHwAccess, (UINT8*)(pHwAccess->MemBaseAddr+addr), data, len); 1594 1595 return OK; 1596 1597#endif 1598 1599#endif 1600} 1601 1602 1603/**************************************************************************** 1604 * whal_hwAccess_ReadMemAsync 1605 **************************************************************************** 1606 * DESCRIPTION: read data asynchronously from the TNET using the defined access (WSPI/SDIO). 1607 * the length of data is checked and the remnant (length%4) is completed with read-modify 1608 * the function is passed a call-back function that will be called after the read request ends. 1609 * 1610 * INPUTS: pHwAccess - TI_HANDLE* - the HwAccess context 1611 * addr - UINT32 - the address offset inside the TNET 1612 * Len - int - the length of the data to read 1613 * CB - HWAccess_CB_T* - a pointer to a structure that holds the CB function and the passed arg. 1614 * 1615 * OUTPUT: data - UINT8* - a pointer to the buffer to fill with the read data 1616 * 1617 * RETURNS: one of the error codes (0 => OK) 1618 ****************************************************************************/ 1619int whal_hwAccess_ReadMemAsync (TI_HANDLE hHwAccess, UINT32 addr, UINT8* data, UINT16 len) 1620{ 1621#if defined(HW_ACCESS_SDIO) && !defined(HW_ACCESS_SDIO_ASYNC_SUPPORT) 1622 1623 /* Just call to synchronous API - add the offset that was added to the WSPI bus */ 1624 return (whal_hwAccess_ReadMem (hHwAccess, addr, data + TNETWIF_READ_OFFSET_BYTES, len) == OK) 1625 ? TNETWIF_COMPLETE 1626 : TNETWIF_ERROR; 1627 1628#else 1629 1630 HwAccess_T_new* pHwAccess = (HwAccess_T_new*)hHwAccess; 1631 int status = OK; 1632 1633 /* Access is blocked */ 1634 if (pHwAccess->uBusError) 1635 { 1636 WLAN_REPORT_ERROR(pHwAccess->hReport, HAL_CTRL_MODULE_LOG, 1637 ("Bus is blocked \n")); 1638 return ERROR_HW_ACCEESS_ADDR; 1639 } 1640 1641 /* Check length */ 1642 if ((len & 0x3) != 0) 1643 { 1644 WLAN_REPORT_ERROR(pHwAccess->hReport, HAL_HW_CTRL_MODULE_LOG, 1645 ("whal_hwAccess_ReadMemAsync: Error in length = %d\n", 1646 len)); 1647 return ERROR_HW_ACCEESS_LEN; 1648 } 1649 1650 /* Check address */ 1651 if (addr + len > pHwAccess->workingPartUpperLimit || 1652 addr < pHwAccess->MemRegionAddr) 1653 { 1654 WLAN_REPORT_ERROR(pHwAccess->hReport, HAL_HW_CTRL_MODULE_LOG, 1655 ("whal_hwAccess_ReadMemAsync: Error in addr 0x%x (lower:0x%x,upper:0x%x)\n", 1656 addr, pHwAccess->MemRegionAddr, pHwAccess->workingPartUpperLimit)); 1657 return ERROR_HW_ACCEESS_ADDR; 1658 } 1659 1660#if defined(HW_ACCESS_SDIO) 1661 { 1662 struct SDIO_Request request; 1663 1664 request.buffer = data + TNETWIF_READ_OFFSET_BYTES; /*Pointer to the data buffer aligned address*/ 1665 request.buffer_len = len; /*Data buffer length in bytes*/ 1666 request.status = SDIO_Request_None; 1667 request.peripheral_addr = (SDIO_Address)TRANSLATE_ADDRESS_MEM(addr); /*SDIO peripheral address*/ 1668 request.acquire_window = 0; /* Time out value is not set */ 1669 request.block_len = 0; /* Block length. Assigned by driver */ 1670 request.physical_buffer = 0; /* Physical address of data buffer is not set */ 1671 request.owner = (SDIO_Owner) pHwAccess; 1672 request.mode = MMC_DEV_BYTE_INCREMENTAL_MODE; 1673 request.access_flag = 0; 1674 request.fnotify = sdio_async_transaction_notify; /* completion notification */ 1675 request.ferror = sdio_async_transaction_error; /* error notification */ 1676 1677 os_profile (pHwAccess->hOs, 2, 0); 1678 1679 status = SDIO_AsyncRead (pHwAccess->hDriver, &request); 1680 1681 os_profile (pHwAccess->hOs, 3, 0); 1682 1683 if (status != OK) 1684 { 1685 WLAN_REPORT_ERROR(pHwAccess->hReport, HAL_HW_CTRL_MODULE_LOG, 1686 ("whal_hwAccess_ReadMemAsync: Error in write async, addr=0x%08x status=%d\n", 1687 addr, status)); 1688 return TNETWIF_ERROR; 1689 } 1690 1691 if (pHwAccess->uBusError) 1692 { 1693 WLAN_REPORT_ERROR(pHwAccess->hReport, HAL_HW_CTRL_MODULE_LOG, 1694 ("whal_hwAccess_ReadMemAsync: SDIO Error in write SrcOffset=0x%08x status=%d\n", 1695 SrcOffset, request.status)); 1696 if (pHwAccess->hwAccesserror_Cb) 1697 { 1698 UINT16 failure_reason = HEALTH_REPORT_BUS_ERROR; 1699 pHwAccess->hwAccesserror_Cb(pHwAccess->hBackReference,&failure_reason,2); 1700 } 1701 else 1702 pHwAccess->uBusError = 0; 1703 } 1704 1705 return TNETWIF_COMPLETE; 1706 } 1707 1708#elif defined(HW_ACCESS_WSPI) 1709 1710 os_profile (pHwAccess->hOs, 2, 0); 1711 1712 status = WSPI_ReadAsync (pHwAccess->hDriver, 1713 TRANSLATE_ADDRESS_MEM(addr), 1714 data, 1715 len, 1716 (WSPI_CB_T*)&pHwAccess->CB, 1717 TRUE, 1718 TRUE); /* place is always reserved in readMem */ 1719 1720 os_profile (pHwAccess->hOs, 3, 0); 1721 1722 WSPI2TNETWIF (pHwAccess, status, addr); 1723 1724 return status; 1725 1726#endif 1727 1728#endif 1729} 1730 1731 1732#ifdef USE_SYNC_API 1733/**************************************************************************** 1734 * whal_hwAccess_ReadReg 1735 **************************************************************************** 1736 * DESCRIPTION: read data synchronously from the TNET using the defined access (WSPI/SDIO). 1737 * the length of data is always 4bytes cause this is the size of the TNET registers 1738 * 1739 * INPUTS: pHwAccess - HwAccess_T_new* - the HwAccess context 1740 * addr - UINT32 - the address offset inside the TNET 1741 * Len - int - the length of the data to read 1742 * 1743 * OUTPUT: data - UINT8* - a pointer to the buffer to fill with the read data 1744 * 1745 * RETURNS: one of the error codes (0 => OK) 1746 ****************************************************************************/ 1747int whal_hwAccess_ReadReg(TI_HANDLE hHwAccess, UINT32 addr, UINT32* data) 1748{ 1749 HwAccess_T_new* pHwAccess = (HwAccess_T_new*)hHwAccess; 1750 int status = OK; 1751 1752#ifdef HW_ACCESS_SDIO 1753 struct SDIO_Request request; 1754 1755 /* check address */ 1756 if (addr > pHwAccess->registerPartUpperLimit) 1757 { 1758 WLAN_REPORT_ERROR(pHwAccess->hReport, HAL_HW_CTRL_MODULE_LOG, 1759 ("whal_hwAccess_ReadReg: Error in addr 0x%x (lower:0x%x,upper:0x%x)\n", 1760 addr, pHwAccess->RegisterRegionAddr, pHwAccess->registerPartUpperLimit)); 1761 return ERROR_HW_ACCEESS_ADDR; 1762 } 1763 1764 request.buffer = (UINT8*)data; /*Pointer to the data buffer aligned address.*/ 1765 request.buffer_len = HW_ACCESS_REGISTER_SIZE; /*Data buffer length in bytes*/ 1766 request.status = SDIO_Request_None; 1767 request.peripheral_addr = TRANSLATE_ADDRESS_REG(addr); 1768 request.acquire_window = 0; /* Time out value is not set */ 1769 request.block_len = 0; /* Block length. Assigned by driver */ 1770 request.owner = (SDIO_Owner) pHwAccess; 1771 request.physical_buffer = 0; /* Physical address of data buffer is not set */ 1772 request.mode = MMC_DEV_BYTE_INCREMENTAL_MODE; 1773 request.access_flag = 1; 1774 1775 os_profile (pHwAccess->hOs, 2, 0); 1776 1777 status = SDIO_SyncRead(pHwAccess->hDriver, &request); 1778 1779 os_profile (pHwAccess->hOs, 3, 0); 1780 1781 1782#elif defined(HW_ACCESS_WSPI) 1783 1784 status = whal_hwAccess_ReadRegAsync(hHwAccess, addr, data); 1785 if (status == TNETWIF_COMPLETE) 1786 { 1787 status = OK; 1788 } 1789 return status; 1790 /* check address */ 1791 if ((addr > pHwAccess->registerPartUpperLimit) || (addr < 0)) 1792 { 1793 WLAN_REPORT_ERROR(pHwAccess->hReport, HAL_HW_CTRL_MODULE_LOG, 1794 ("whal_hwAccess_ReadReg: Error in addr 0x%x (lower:0x%x,upper:0x%x)\n", 1795 addr, pHwAccess->RegisterRegionAddr, pHwAccess->registerPartUpperLimit)); 1796 return ERROR_HW_ACCEESS_ADDR; 1797 } 1798 1799 os_profile (pHwAccess->hOs, 2, 0); 1800 1801 status = WSPI_ReadSync(pHwAccess->hDriver, TRANSLATE_ADDRESS_REG(addr), (UINT8*)data, HW_ACCESS_REGISTER_SIZE); 1802 1803 os_profile (pHwAccess->hOs, 3, 0); 1804 1805#else 1806 1807 HW_REG_LONG_READ(pHwAccess,addr,data); 1808 1809#endif 1810 1811 if (status != OK) 1812 { 1813 WLAN_REPORT_ERROR(pHwAccess->hReport, HAL_HW_CTRL_MODULE_LOG, 1814 ("whal_hwAccess_ReadReg: Error in reg read RegAddr=0x%08x status=%d\n", 1815 addr, status)); 1816 1817 } 1818 1819#ifdef HW_ACCESS_SDIO 1820 if (pHwAccess->uBusError) 1821 { 1822 WLAN_REPORT_ERROR(pHwAccess->hReport, HAL_HW_CTRL_MODULE_LOG, 1823 ("whal_hwAccess_ReadReg: SDIO Error status=%d\n", 1824 request.status)); 1825 if (pHwAccess->hwAccesserror_Cb) 1826 { 1827 UINT8 failure_reason = HEALTH_REPORT_BUS_ERROR; 1828 pHwAccess->hwAccesserror_Cb(pHwAccess->hBackReference,(char *)&failure_reason,2); 1829 } 1830 else 1831 pHwAccess->uBusError = 0; 1832 } 1833#endif 1834 return status; 1835} 1836#endif /* USE_SYNC_API */ 1837 1838 1839/**************************************************************************** 1840 * whal_hwAccess_Stop() 1841 **************************************************************************** 1842 * DESCRIPTION: stops the bus driver 1843 * 1844 * INPUTS: None 1845 * 1846 * OUTPUT: None 1847 * 1848 * RETURNS: 1849 ****************************************************************************/ 1850int whal_hwAccess_Stop(TI_HANDLE hHwAccess) 1851{ 1852 HwAccess_T_new* pHwAccess = (HwAccess_T_new*)hHwAccess; 1853 1854 /* unbclock the access to the bus */ 1855 pHwAccess->uBusError = 0; 1856 1857#ifdef HW_ACCESS_SDIO 1858 SDIO_Stop(pHwAccess->hDriver,0); 1859#elif defined(HW_ACCESS_WSPI) 1860 /* TODO*/ 1861#endif 1862 return OK; 1863} 1864 1865 1866#ifdef USE_SYNC_API 1867 1868/**************************************************************************** 1869 * whal_hwAccess_WriteReg 1870 **************************************************************************** 1871 * DESCRIPTION: write data synchronously to the TNET using the defined access (WSPI/SDIO). 1872 * the length of data is always 4bytes cause this is the size of the TNET registers 1873 * 1874 * INPUTS: pHwAccess - TI_HANDLE * - the HwAccess context 1875 * addr - UINT32 - the address offset inside the TNET 1876 * data - UINT8* - a pointer to the buffer that holds the data to write 1877 * Len - int - the length of the data to read 1878 * 1879 * OUTPUT: none 1880 * 1881 * RETURNS: one of the error codes (0 => OK) 1882 ****************************************************************************/ 1883int whal_hwAccess_WriteReg(TI_HANDLE hHwAccess, UINT32 addr, UINT32 data) 1884{ 1885 HwAccess_T_new* pHwAccess = (HwAccess_T_new*)hHwAccess; 1886 int status = OK; 1887 1888#ifdef HW_ACCESS_SDIO 1889 struct SDIO_Request request; 1890 1891 /* check address */ 1892 if (addr > pHwAccess->registerPartUpperLimit) 1893 { 1894 WLAN_REPORT_ERROR(pHwAccess->hReport, HAL_HW_CTRL_MODULE_LOG, 1895 ("whal_hwAccess_WriteReg: Error in addr 0x%x (lower:0x%x,upper:0x%x)\n", 1896 addr, pHwAccess->RegisterRegionAddr, pHwAccess->registerPartUpperLimit)); 1897 return ERROR_HW_ACCEESS_ADDR; 1898 } 1899 1900 request.buffer = (UINT8*)&data; /*Pointer to the data buffer aligned address.*/ 1901 request.buffer_len = HW_ACCESS_REGISTER_SIZE; /*Data buffer length in bytes*/ 1902 request.status = SDIO_Request_None; 1903 request.peripheral_addr = TRANSLATE_ADDRESS_REG(addr); 1904 request.acquire_window = 0; /* Time out value is not set */ 1905 request.block_len = 0; /* Block length. Assigned by driver */ 1906 request.owner = (SDIO_Owner) pHwAccess; 1907 request.physical_buffer = 0; /* Physical address of data buffer is not set */ 1908 request.mode = MMC_DEV_BYTE_INCREMENTAL_MODE; 1909 request.access_flag = 0; 1910 1911 os_profile (pHwAccess->hOs, 2, 0); 1912 1913 status = SDIO_SyncWrite(pHwAccess->hDriver, &request); 1914 1915 os_profile (pHwAccess->hOs, 3, 0); 1916 1917#elif defined(HW_ACCESS_WSPI) 1918 status = whal_hwAccess_WriteRegAsync(hHwAccess, addr, data); 1919 if (status == TNETWIF_COMPLETE) 1920 { 1921 status = OK; 1922 } 1923 return status; 1924 /* check address */ 1925 if ((addr > pHwAccess->registerPartUpperLimit) || (addr < 0)) 1926 { 1927 WLAN_REPORT_ERROR(pHwAccess->hReport, HAL_HW_CTRL_MODULE_LOG, 1928 ("whal_hwAccess_WriteReg: Error in addr 0x%x (lower:0x%x,upper:0x%x)\n", 1929 addr, pHwAccess->RegisterRegionAddr, pHwAccess->registerPartUpperLimit)); 1930 return ERROR_HW_ACCEESS_ADDR; 1931 } 1932 1933 os_profile (pHwAccess->hOs, 2, 0); 1934 1935 status = WSPI_WriteSync(pHwAccess->hDriver, TRANSLATE_ADDRESS_REG(addr), (UINT8*)&data, HW_ACCESS_REGISTER_SIZE); 1936 1937 os_profile (pHwAccess->hOs, 3, 0); 1938 1939#else 1940 1941 HW_REG_LONG_WRITE(pHwAccess, addr, data); 1942 1943#endif 1944 1945 if (status != OK) 1946 WLAN_REPORT_ERROR(pHwAccess->hReport, HAL_HW_CTRL_MODULE_LOG, 1947 ("whal_hwAccess_WriteReg: Error in reg write RegAddr=0x%08x status=%d\n", 1948 addr, status)); 1949 1950#ifdef HW_ACCESS_SDIO 1951 if (pHwAccess->uBusError) 1952 { 1953 WLAN_REPORT_ERROR(pHwAccess->hReport, HAL_HW_CTRL_MODULE_LOG, 1954 ("whal_hwAccess_WriteReg: SDIO Error in write status=%d\n", 1955 request.status)); 1956 if (pHwAccess->hwAccesserror_Cb) 1957 { 1958 UINT8 failure_reason = HEALTH_REPORT_BUS_ERROR; 1959 pHwAccess->hwAccesserror_Cb(pHwAccess->hBackReference,(char *)&failure_reason,2); 1960 } 1961 else 1962 pHwAccess->uBusError = 0; 1963 1964 } 1965#endif 1966 return status; 1967} 1968#endif /* USE_SYNC_API */ 1969 1970 1971/**************************************************************************** 1972 * whal_hwAccess_ReadRegAsync 1973 **************************************************************************** 1974 * DESCRIPTION: read data asynchronously from the TNET using the defined access (WSPI/SDIO). 1975 * the length of data is always 4bytes cause this is the size of the TNET registers 1976 * the function is passed a call-back function that will be called after the read request ends. 1977 * 1978 * INPUTS: pHwAccess - TI_HANDLE * - the HwAccess context 1979 * addr - UINT32 - the address offset inside the TNET 1980 * 1981 * OUTPUT: data - UINT8* - a pointer to the buffer to fill with the read data 1982 * 1983 * RETURNS: one of the error codes (0 => OK) 1984 ****************************************************************************/ 1985int whal_hwAccess_ReadRegAsync(TI_HANDLE hHwAccess, UINT32 addr, UINT32* data) 1986{ 1987#if defined(HW_ACCESS_SDIO) 1988 1989 #if defined(HW_ACCESS_SDIO_ASYNC_SUPPORT) 1990 1991 #error "SDIO asynchronous mode is not supported" 1992 1993 /* Not implemented yet */ 1994 return OK; 1995 1996 #else 1997 1998 /* Just call to synchronous API */ 1999 return (whal_hwAccess_ReadReg (hHwAccess, addr, data) == OK) 2000 ? TNETWIF_COMPLETE 2001 : TNETWIF_ERROR; 2002 2003 #endif 2004 2005#else /* HW_ACCESS_WSPI */ 2006 2007 HwAccess_T_new* pHwAccess = (HwAccess_T_new*)hHwAccess; 2008 int status; 2009 2010 /* Check address */ 2011 if (addr > pHwAccess->registerPartUpperLimit) 2012 { 2013 WLAN_REPORT_ERROR(pHwAccess->hReport, HAL_HW_CTRL_MODULE_LOG, 2014 ("whal_hwAccess_ReadRegAsync: Error in addr 0x%x (lower:0x%x,upper:0x%x)\n", 2015 addr, pHwAccess->RegisterRegionAddr, pHwAccess->registerPartUpperLimit)); 2016 return ERROR_HW_ACCEESS_ADDR; 2017 } 2018 2019 os_profile (pHwAccess->hOs, 2, 0); 2020 2021 /* In registers we don't save place */ 2022 status = WSPI_ReadAsync (pHwAccess->hDriver, 2023 TRANSLATE_ADDRESS_REG(addr), 2024 (UINT8*)data, 2025 HW_ACCESS_REGISTER_SIZE, 2026 (WSPI_CB_T*)&pHwAccess->CB, 2027 TRUE, 2028 FALSE); 2029 2030 os_profile (pHwAccess->hOs, 3, 0); 2031 2032 WSPI2TNETWIF (pHwAccess, status, addr); 2033 2034 return status; 2035 2036#endif 2037} 2038 2039/**************************************************************************** 2040 * whal_hwAccess_WriteRegAsync 2041 **************************************************************************** 2042 * DESCRIPTION: write data synchronously from the TNET using the defined access (WSPI/SDIO). 2043 * the length of data is always 4bytes cause this is the size of the TNET registers 2044 * the function is passed a call-back function that will be called after the read request ends. 2045 * 2046 * INPUTS: pHwAccess - TI_HANDLE * - the HwAccess context 2047 * addr - UINT32 - the address offset inside the TNET 2048 * data - UINT8* - a pointer to the buffer that holds the data to write 2049 * 2050 * OUTPUT: none 2051 * 2052 * RETURNS: one of the error codes (0 => OK) 2053 ****************************************************************************/ 2054int whal_hwAccess_WriteRegAsync(TI_HANDLE hHwAccess, UINT32 addr, UINT32 data) 2055{ 2056#if defined(HW_ACCESS_SDIO) 2057 2058 #if defined(HW_ACCESS_SDIO_ASYNC_SUPPORT) 2059 2060 #error "SDIO asynchronous mode is not supported" 2061 2062 /* Not implemented yet */ 2063 return OK; 2064 2065 #else 2066 2067 /* Just call to synchronous API */ 2068 return (whal_hwAccess_WriteReg (hHwAccess, addr, data) == OK) 2069 ? TNETWIF_COMPLETE 2070 : TNETWIF_ERROR; 2071 2072 #endif 2073 2074#else /* HW_ACCESS_WSPI */ 2075 2076 HwAccess_T_new* pHwAccess = (HwAccess_T_new*)hHwAccess; 2077 int status; 2078 2079 /* Check address */ 2080 if (addr > pHwAccess->registerPartUpperLimit) 2081 { 2082 WLAN_REPORT_ERROR(pHwAccess->hReport, HAL_HW_CTRL_MODULE_LOG, 2083 ("whal_hwAccess_WriteRegAsync: Error in addr 0x%x (lower:0x%x,upper:0x%x)\n", 2084 addr, pHwAccess->RegisterRegionAddr, pHwAccess->registerPartUpperLimit)); 2085 return ERROR_HW_ACCEESS_ADDR; 2086 } 2087 2088 os_profile (pHwAccess->hOs, 2, 0); 2089 2090 status = WSPI_WriteAsync (pHwAccess->hDriver, 2091 TRANSLATE_ADDRESS_REG(addr), 2092 (UINT8*)&data, 2093 HW_ACCESS_REGISTER_SIZE, 2094 (WSPI_CB_T*)&pHwAccess->CB, 2095 TRUE, 2096 FALSE); 2097 os_profile (pHwAccess->hOs, 3, 0); 2098 2099 WSPI2TNETWIF (pHwAccess, status, addr); 2100 2101 return status; 2102#endif 2103} 2104 2105 2106#ifdef USE_SYNC_API 2107/**************************************************************************** 2108 * whal_hwAccess_SetPartitions 2109 **************************************************************************** 2110 * DESCRIPTION: the client always sees two partitions 2111 * 1 - the working partition that the client access it with mem functions (for this partition the client supplies the base address) 2112 * 2 - the registers partition that is always set on HW_ACCESS_REG_ADDR and its size is HW_ACCESS_REG_SIZE. 2113 * 2114 * INPUTS: pHwAccess - a pointer to the module context 2115 * partitionMode - the mode to set the partitions 2116 * partition_start - the start address of the working partition 2117 * 2118 * OUTPUT: none 2119 * 2120 * RETURNS: one of the error codes (0 => OK) 2121 ****************************************************************************/ 2122int whal_hwAccess_SetPartitions (TI_HANDLE hHwAccess, TNETIF_HwAccess_SetPartition_mode_e partitionMode, UINT32 partition_start) 2123{ 2124 HwAccess_T_new *pHwAccess = (HwAccess_T_new*) hHwAccess; 2125 int status = OK; 2126 2127#ifdef HW_ACCESS_SDIO 2128 SDIO_TNETWConfigParams sdioConfParam; 2129 Peripheral_ConfigParams *cfg; 2130#endif 2131 2132 pHwAccess->partition[0].size = 0; 2133 pHwAccess->partition[0].start = partition_start; 2134 pHwAccess->partition[1].size = 0; 2135 pHwAccess->partition[1].start = 0; 2136 2137 switch(partitionMode) 2138 { 2139 case HW_ACCESS_DOWNLOAD: 2140 pHwAccess->partition[0].size = HW_ACCESS_MEMORY_MAX_RANGE - HW_ACCESS_DOWN_PART1_SIZE; 2141 pHwAccess->partition[1].start = HW_ACCESS_DOWN_PART1_ADDR; 2142 pHwAccess->partition[1].size = HW_ACCESS_DOWN_PART1_SIZE; 2143 break; 2144 case HW_ACCESS_WORKING: 2145 pHwAccess->partition[0].size = HW_ACCESS_MEMORY_MAX_RANGE - HW_ACCESS_WORK_PART1_SIZE; 2146 pHwAccess->partition[1].start = HW_ACCESS_WORK_PART1_ADDR; 2147 pHwAccess->partition[1].size = HW_ACCESS_WORK_PART1_SIZE; 2148 break; 2149 } 2150 2151#if (defined(HW_ACCESS_SDIO) || defined(HW_ACCESS_WSPI)) 2152 /* guarantee that the working partition wont overlap the registers partition */ 2153 if((pHwAccess->partition[0].start + pHwAccess->partition[0].size) > pHwAccess->partition[1].start) 2154 pHwAccess->partition[0].size = pHwAccess->partition[1].start - pHwAccess->partition[0].start; 2155 2156 /* guarantee that the working partition won't exceed the packet RAM */ 2157 if((pHwAccess->partition[0].start + pHwAccess->partition[0].size) > HW_ACCESS_PRAM_MAX_RANGE) 2158 pHwAccess->partition[0].size = HW_ACCESS_PRAM_MAX_RANGE - pHwAccess->partition[0].start; 2159 2160 pHwAccess->workingPartUpperLimit = pHwAccess->partition[0].start + pHwAccess->partition[0].size; 2161 pHwAccess->registerPartUpperLimit = pHwAccess->partition[1].size; 2162 2163 pHwAccess->RegisterRegionAddr = pHwAccess->partition[0].size; 2164 pHwAccess->MemRegionAddr = pHwAccess->partition[0].start; 2165 2166#ifdef HW_ACCESS_SDIO 2167 2168 os_memoryZero (pHwAccess->hOs, &sdioConfParam, sizeof(SDIO_TNETWConfigParams)); 2169 sdioConfParam.num_of_parts = 2; 2170 sdioConfParam.map_reg[0].reg_size = pHwAccess->partition[0].size; 2171 sdioConfParam.map_reg[0].scr_offset = pHwAccess->partition[0].start; 2172 sdioConfParam.map_reg[1].reg_size = pHwAccess->partition[1].size; 2173 sdioConfParam.map_reg[1].scr_offset = pHwAccess->partition[1].start; 2174 2175 status = SDIO_TNETWInit(&sdioConfParam); 2176 status = (status == SDIO_SUCCESS) ? SDIO_TNETWConfig(pHwAccess->hDriver, &cfg) : status; 2177 status = (status == SDIO_SUCCESS) ? TNETWIF_COMPLETE : TNETWIF_ERROR; 2178 2179#elif defined(HW_ACCESS_WSPI) 2180 /* 2181 * IMPORTANT NOTE (TODO): the ASYNC API is used here assuming the call will always 2182 * be completed synchronously. This is done because only the Async API is wokring 2183 * in 4.0.4. In future versions, the whole recovery process should be made asynchronous. 2184 */ 2185 /* May use only one write because the addresses in the firmware are sequential */ 2186 status = WSPI_WriteAsync (pHwAccess->hDriver, 2187 HW_ACCESS_PART0_SIZE_ADDR, 2188 PADWRITE (pHwAccess->partition), 2189 sizeof(partition_t) * 2, 2190 (WSPI_CB_T*)&pHwAccess->CB, 2191 TRUE, TRUE); 2192 2193 WSPI2TNETWIF (pHwAccess, status, HW_ACCESS_PART0_SIZE_ADDR); 2194#endif 2195 2196#endif 2197 2198 return status; 2199} 2200#endif /* USE_SYNC_API */ 2201 2202 2203/**************************************************************************** 2204 * whal_hwAccess_SetPartitionsAsync 2205 **************************************************************************** 2206 * DESCRIPTION: the client always sees two partitions 2207 * 1 - the working partition that the client access it with mem functions (for this partition the client supplies the base address) 2208 * 2 - the registers partition that is always set on HW_ACCESS_REG_ADDR and its size is HW_ACCESS_REG_SIZE. 2209 * 2210 * INPUTS: pHwAccess - a pointer to the module context 2211 * partitionMode - the mode to set the partitions 2212 * partition_start - the start address of the working partition 2213 * 2214 * OUTPUT: none 2215 * 2216 * RETURNS: one of the error codes (0 => OK) 2217 ****************************************************************************/ 2218int whal_hwAccess_SetPartitionsAsync (TI_HANDLE hHwAccess, TNETIF_HwAccess_SetPartition_mode_e partitionMode, UINT32 partition_start) 2219{ 2220 HwAccess_T_new *pHwAccess = (HwAccess_T_new*) hHwAccess; 2221 int status = OK; 2222 2223#ifdef HW_ACCESS_SDIO 2224 SDIO_TNETWConfigParams sdioConfParam; 2225 Peripheral_ConfigParams *cfg; 2226#endif 2227 2228 pHwAccess->partition[0].size = 0; 2229 pHwAccess->partition[0].start = partition_start; 2230 pHwAccess->partition[1].size = 0; 2231 pHwAccess->partition[1].start = 0; 2232 2233 switch(partitionMode) 2234 { 2235 case HW_ACCESS_DOWNLOAD: 2236 pHwAccess->partition[0].size = HW_ACCESS_MEMORY_MAX_RANGE - HW_ACCESS_DOWN_PART1_SIZE; 2237 pHwAccess->partition[1].start = HW_ACCESS_DOWN_PART1_ADDR; 2238 pHwAccess->partition[1].size = HW_ACCESS_DOWN_PART1_SIZE; 2239 break; 2240 case HW_ACCESS_WORKING: 2241 pHwAccess->partition[0].size = HW_ACCESS_MEMORY_MAX_RANGE - HW_ACCESS_WORK_PART1_SIZE; 2242 pHwAccess->partition[1].start = HW_ACCESS_WORK_PART1_ADDR; 2243 pHwAccess->partition[1].size = HW_ACCESS_WORK_PART1_SIZE; 2244 break; 2245 } 2246 2247#if (defined(HW_ACCESS_SDIO) || defined(HW_ACCESS_WSPI)) 2248 /* guarantee that the working partition wont overlap the registers partition */ 2249 if((pHwAccess->partition[0].start + pHwAccess->partition[0].size) > pHwAccess->partition[1].start) 2250 pHwAccess->partition[0].size = pHwAccess->partition[1].start - pHwAccess->partition[0].start; 2251 2252 /* guarantee that the working partition won't exceed the packet RAM */ 2253 if((pHwAccess->partition[0].start + pHwAccess->partition[0].size) > HW_ACCESS_PRAM_MAX_RANGE) 2254 pHwAccess->partition[0].size = HW_ACCESS_PRAM_MAX_RANGE - pHwAccess->partition[0].start; 2255 2256 pHwAccess->workingPartUpperLimit = pHwAccess->partition[0].start + pHwAccess->partition[0].size; 2257 pHwAccess->registerPartUpperLimit = pHwAccess->partition[1].size; 2258 2259 pHwAccess->RegisterRegionAddr = pHwAccess->partition[0].size; 2260 pHwAccess->MemRegionAddr = pHwAccess->partition[0].start; 2261 2262#ifdef HW_ACCESS_SDIO 2263 2264 os_memoryZero (pHwAccess->hOs, &sdioConfParam, sizeof(SDIO_TNETWConfigParams)); 2265 sdioConfParam.num_of_parts = 2; 2266 sdioConfParam.map_reg[0].reg_size = pHwAccess->partition[0].size; 2267 sdioConfParam.map_reg[0].scr_offset = pHwAccess->partition[0].start; 2268 sdioConfParam.map_reg[1].reg_size = pHwAccess->partition[1].size; 2269 sdioConfParam.map_reg[1].scr_offset = pHwAccess->partition[1].start; 2270 2271 status = SDIO_TNETWInit(&sdioConfParam); 2272 status = (status == SDIO_SUCCESS) ? SDIO_TNETWConfig(pHwAccess->hDriver, &cfg) : status; 2273 status = (status == SDIO_SUCCESS) ? TNETWIF_COMPLETE : TNETWIF_ERROR; 2274 2275#elif defined(HW_ACCESS_WSPI) 2276 2277 /* May use only one write because the addresses in the firmware are sequential */ 2278 status = WSPI_WriteAsync (pHwAccess->hDriver, 2279 HW_ACCESS_PART0_SIZE_ADDR, 2280 PADWRITE (pHwAccess->partition), 2281 sizeof(partition_t) * 2, 2282 (WSPI_CB_T*)&pHwAccess->CB, 2283 TRUE, 2284 TRUE); 2285 2286 WSPI2TNETWIF (pHwAccess, status, HW_ACCESS_PART0_SIZE_ADDR); 2287 2288#endif 2289 2290#endif 2291 2292 return status; 2293} 2294 2295 2296#if !defined(HW_ACCESS_SDIO) && !defined(HW_ACCESS_WSPI) 2297/**************************************************************************** 2298 * whal_hwAccess_DirectCopy_new() 2299 **************************************************************************** 2300 * DESCRIPTION: Direct Copy sequence of bytes to/from the hardware 2301 * 2302 * INPUTS: 2303 * pHwAccess The object 2304 * Dest Destination address 2305 * Src Source address 2306 * Len The length of the data to copy 2307 * 2308 * OUTPUT: None 2309 * 2310 * RETURNS: OK or NOK 2311 ****************************************************************************/ 2312static void whal_hwAccess_DirectCopy_new(HwAccess_T_new *pHwAccess, UINT8* Dest, UINT8* Src, UINT32 Len) 2313{ 2314 2315#ifdef NOT_SUPPORT_08_BIT_ACCESS_COMMAND 2316 2317 /* first see if dest addr is 4 bytes 2318 align if not we are using local copy and not 2319 os_memoryCopy 2320 */ 2321 if(((UINT32)Dest & 0x00000001)) 2322 { 2323 /* TBD - Currently unaligned destination address is not handled. 2324 it means that CKIP will not work currently. 2325 */ 2326 2327 }else 2328 if(((UINT32)Dest & 0x00000002)) 2329 { 2330 register volatile unsigned short *shortDest = (volatile unsigned short *)Dest; 2331 register volatile unsigned short *shortSrc = (unsigned short *)Src; 2332 register int Size = Len >> 1; 2333 2334 unsigned short TempWord; 2335 while (Size--) 2336 *shortDest++ = *shortSrc++; 2337 2338 if (Len&1) 2339 { 2340 TempWord = ENDIAN_HANDLE_WORD((*shortSrc & 0x00ff) | (*shortDest & 0xff00)); 2341 *shortDest = TempWord; 2342 } 2343 }else 2344 { 2345 /* The address line A0 is not connected 2346 For arm/linux sake not 2, but 4-alignment is enforced. 2347 (Linux memcpy uses longs copy logic) 2348 */ 2349 int Len1 = Len & 0xfffffffc; 2350 2351 os_memoryCopy(pHwAccess->hOs, (void*)Dest, (void*)Src, Len1); 2352 2353 if (Len1 != Len) 2354 { 2355 int ShortSize=Len1 >> 1; 2356 volatile unsigned short *shortDest = ((unsigned short *)Dest) + ShortSize; 2357 volatile unsigned short *shortSrc = ((unsigned short *)Src) + ShortSize; 2358 if (Len - Len1 >= 2) 2359 *shortDest++ = *shortSrc++; 2360 if (Len & 1) 2361 *shortDest = ENDIAN_HANDLE_WORD((*shortSrc & 0x00ff) | (*shortDest & 0xff00)); 2362 } 2363 } 2364 2365#else 2366 os_memoryCopy(pHwAccess->hOs, (void*)Dest, (void*)Src, Len); 2367#endif 2368} 2369#endif 2370 2371 2372#ifdef HW_ACCESS_SDIO 2373 2374/* callback notify read/write transaction function */ 2375static void sdio_transaction_notify_read(struct SDIO_Request *req, int status) 2376{ 2377} 2378 2379static void sdio_transaction_notify_write(struct SDIO_Request *req, int status) 2380{ 2381} 2382 2383/* callback notify error read/write transaction function */ 2384static void sdio_transaction_error(struct SDIO_Request *req, int stat) 2385{ 2386 HwAccess_T_new* pHwAccess = (HwAccess_T_new*)req->owner; 2387 2388 WLAN_REPORT_ERROR (pHwAccess->hReport, HAL_CTRL_MODULE_LOG, ("sdio_transaction_error\n")); 2389 2390 pHwAccess->uBusError = 1; 2391} 2392 2393 2394#if defined(HW_ACCESS_SDIO_ASYNC_SUPPORT) 2395 2396static void sdio_async_transaction_notify(struct SDIO_Request *req, int status) 2397{ 2398 HwAccess_T_new* pHwAccess = (HwAccess_T_new*)req->owner; 2399 2400 /* call the CB */ 2401 pHwAccess->CB.CBFunc(pHwAccess->CB.CBArg,status); 2402 2403 WLAN_REPORT_INFORMATION(pHwAccess->hReport, 2404 HAL_HW_CTRL_MODULE_LOG, 2405 ("sdio_async_transaction_notify - request=%p, buf=%p, sdio_addr=0x%08lx, len=%u\n", 2406 req, req->buffer, req->peripheral_addr, req->block_len)); 2407 2408} 2409 2410/* callback notify error read/write transaction function */ 2411static void sdio_async_transaction_error(struct SDIO_Request *req, int status) 2412{ 2413 HwAccess_T_new* pHwAccess = (HwAccess_T_new*)req->owner; 2414 2415 WLAN_REPORT_ERROR(pHwAccess->hReport, HAL_HW_CTRL_MODULE_LOG, 2416 ("sdio_async_transaction_error: request=%p, buf=%p, sdio_addr=0x%08lx, len=%u\n", 2417 req, req->buffer, req->peripheral_addr, req->block_len)); 2418} 2419 2420#endif /*HW_ACCESS_SDIO_ASYNC_SUPPORT*/ 2421 2422#endif /*HW_ACCESS_SDIO*/ 2423 2424TI_STATUS whal_hwAccess_RegisterForErrorCB(TI_HANDLE hHwAccess, 2425 void* CbFunc, 2426 TI_HANDLE CbObj) 2427{ 2428 HwAccess_T_new *pHwAccess = (HwAccess_T_new *)hHwAccess; 2429 pHwAccess->hwAccesserror_Cb = (HwAccessErrorHandle)CbFunc; 2430 pHwAccess->hBackReference = CbObj; 2431 return OK; 2432} 2433 2434 2435/***********************************************************/ 2436 2437 2438#ifdef USE_SYNC_API 2439/**************************************************************************** 2440 * whal_hwAccess_RegSetBitVal() 2441 **************************************************************************** 2442 * DESCRIPTION: wlan hardware registers bits access 2443 * 2444 * INPUTS: 2445 * 2446 * OUTPUT: None 2447 * 2448 * RETURNS: OK or NOK 2449 ****************************************************************************/ 2450void whal_hwAccess_RegSetBitVal(TI_HANDLE hHwAccess, UINT32 RegAddr, UINT32 BitVal) 2451{ 2452 UINT32 rVal; 2453 2454 whal_hwAccess_ReadReg(hHwAccess,RegAddr,&rVal); 2455 rVal |= BitVal; 2456 whal_hwAccess_WriteReg(hHwAccess, RegAddr, rVal); 2457} 2458 2459/**************************************************************************** 2460 * whal_hwAccess_RegResetBitVal() 2461 **************************************************************************** 2462 * DESCRIPTION: wlan hardware registers bits access 2463 * 2464 * INPUTS: 2465 * 2466 * OUTPUT: None 2467 * 2468 * RETURNS: OK or NOK 2469 ****************************************************************************/ 2470void whal_hwAccess_RegResetBitVal(TI_HANDLE hHwAccess, UINT32 RegAddr, UINT32 BitVal) 2471{ 2472 UINT32 rVal; 2473 2474 whal_hwAccess_ReadReg(hHwAccess,RegAddr,&rVal); 2475 rVal &= ~BitVal; 2476 whal_hwAccess_WriteReg(hHwAccess, RegAddr, rVal); 2477} 2478 2479/**************************************************************************** 2480 * whal_hwAccess_RegIsBitSet() 2481 **************************************************************************** 2482 * DESCRIPTION: wlan hardware registers bits access 2483 * 2484 * INPUTS: 2485 * 2486 * OUTPUT: None 2487 * 2488 * RETURNS: OK or NOK 2489 ****************************************************************************/ 2490int whal_hwAccess_RegIsBitSet(TI_HANDLE hHwAccess, UINT32 RegAddr, UINT32 BitVal) 2491{ 2492 UINT32 RegVal; 2493 2494 whal_hwAccess_ReadReg(hHwAccess,RegAddr,&RegVal); 2495 if (RegVal & BitVal) 2496 return 1; 2497 2498 return 0; 2499} 2500 2501 2502/**************************************************************************** 2503 * whal_hwAccess_(Get/Set/SetBits/ResetBits)U08() 2504 **************************************************************************** 2505 * DESCRIPTION: wlan hardware memory access to bytes 2506 * 2507 * INPUTS: 2508 * 2509 * OUTPUT: None 2510 * 2511 * RETURNS: OK or NOK 2512 ****************************************************************************/ 2513UINT8 whal_hwAccess_GetU08(TI_HANDLE hHwAccess, UINT32 Addr) 2514{ 2515 2516 2517#ifdef HW_ACCESS_SDIO 2518 UINT32 SrcOffset ; 2519 UINT16 DataShort; 2520 2521 SrcOffset = (Addr & 0xfffffffe); 2522 whal_hwAccess_ReadMem(hHwAccess,(UINT32)((char *)SrcOffset),(UINT8*)((char *)&DataShort),sizeof(UINT16)); 2523 return (EXTRACT_BYTE_FROM_WORD(DataShort, Addr)); 2524 2525#else /* HW_ACCESS_SDIO */ 2526 2527 UINT32 data = 0; 2528 2529 whal_hwAccess_ReadMem(hHwAccess,(UINT32)Addr,(UINT8*)&data,sizeof(data)); 2530 return (data & 0x000000FF); 2531 2532#endif /* HW_ACCESS_SDIO */ 2533 2534 } 2535 2536void whal_hwAccess_SetU08(TI_HANDLE hHwAccess, UINT32 Addr, UINT8 Val) 2537{ 2538 2539 2540#ifdef HW_ACCESS_SDIO 2541 2542 UINT32 sdioAddr; 2543 UINT16 DataShort; 2544 2545 sdioAddr = (Addr & 0xfffffffe); 2546 whal_hwAccess_ReadMem(hHwAccess,(UINT32)((char *)sdioAddr),(UINT8*)((char *)&DataShort),sizeof(UINT16)); 2547 EXTRACT_BYTE_FROM_WORD(DataShort, Addr) = Val; 2548 whal_hwAccess_WriteMem(hHwAccess,(UINT32)((char *)sdioAddr),(UINT8*)((char *)&DataShort),sizeof(UINT16)); 2549 2550#else /* HW_ACCESS_SDIO */ 2551 2552 UINT32 data = 0; 2553 2554 whal_hwAccess_ReadMem(hHwAccess,(UINT32)Addr,(UINT8*)&data,sizeof(data)); 2555 data &= 0xFFFFFF00; 2556 data |= Val; 2557 whal_hwAccess_WriteMem(hHwAccess,(UINT32)Addr,(UINT8*)&data,sizeof(data)); 2558 2559#endif /* HW_ACCESS_SDIO */ 2560 2561 } 2562 2563 2564void whal_hwAccess_ResetU08_Bits(TI_HANDLE hHwAccess, UINT32 Addr, UINT8 BitsVal) 2565{ 2566 2567 2568#ifdef HW_ACCESS_SDIO 2569 2570 UINT32 sdioAddr; 2571 UINT16 DataShort; 2572 2573 sdioAddr = (Addr & 0xfffffffe); 2574 whal_hwAccess_ReadMem(hHwAccess,(UINT32)((char *)sdioAddr),(UINT8*)((char *)&DataShort),sizeof(UINT16)); 2575 EXTRACT_BYTE_FROM_WORD(DataShort, Addr) &= ~BitsVal; 2576 whal_hwAccess_WriteMem(hHwAccess,(UINT32)((char *)sdioAddr),(UINT8*)((char *)&DataShort),sizeof(UINT16)); 2577 2578#else /* HW_ACCESS_SDIO */ 2579 2580 UINT32 data = 0; 2581 2582 whal_hwAccess_ReadMem(hHwAccess,(UINT32)Addr,(UINT8*)&data,sizeof(data)); 2583 data &= ~BitsVal; 2584 whal_hwAccess_WriteMem(hHwAccess,(UINT32)Addr,(UINT8*)&data,sizeof(data)); 2585 2586#endif /* HW_ACCESS_SDIO */ 2587 2588 } 2589 2590/**************************************************************************** 2591 * whal_hwAccess_(Get/Set/SetBits/ResetBits)U16() 2592 **************************************************************************** 2593 * DESCRIPTION: wlan hardware memory access to shorts 2594 * 2595 * INPUTS: 2596 * 2597 * OUTPUT: None 2598 * 2599 * RETURNS: OK or NOK 2600 ****************************************************************************/ 2601UINT16 whal_hwAccess_GetU16(TI_HANDLE hHwAccess, UINT32 Addr) 2602{ 2603 2604 2605#ifdef HW_ACCESS_SDIO 2606 2607 UINT32 sdioAddr; 2608 UINT16 DataShort; 2609 2610 sdioAddr = Addr; 2611 whal_hwAccess_ReadMem(hHwAccess,(UINT32)((char *)sdioAddr),(UINT8*)((char *)&DataShort),sizeof(UINT16)); 2612 2613 return (ENDIAN_HANDLE_WORD(DataShort)); 2614 2615#else /* HW_ACCESS_SDIO */ 2616 2617 UINT32 data = 0; 2618 2619 whal_hwAccess_ReadMem(hHwAccess,(UINT32)Addr,(UINT8*)&data,sizeof(data)); 2620 return (data & 0x0000FFFF); 2621 2622#endif /* HW_ACCESS_SDIO */ 2623 2624 } 2625 2626void whal_hwAccess_SetU16(TI_HANDLE hHwAccess, UINT32 Addr, UINT16 Val) 2627{ 2628 2629 2630#ifdef HW_ACCESS_SDIO 2631 2632 UINT32 sdioAddr; 2633 UINT16 sdioVal; 2634 2635 sdioAddr = (Addr & 0xfffffffe); 2636 sdioVal = ENDIAN_HANDLE_WORD(Val); 2637 whal_hwAccess_WriteMem(hHwAccess,(UINT32)((char *)sdioAddr),(UINT8*)((char *)&sdioVal),sizeof(UINT16)); 2638 2639#else /* HW_ACCESS_SDIO */ 2640 2641 UINT32 data = 0; 2642 UINT32 sdioAddr; 2643 2644 sdioAddr = (Addr & 0xfffffffc); 2645 whal_hwAccess_ReadMem(hHwAccess,(UINT32)sdioAddr,(UINT8*)&data,sizeof(data)); 2646 2647 if((Addr&0x3) == 2) 2648 { 2649 data &= 0x0000FFFF; 2650 data |= ((UINT32)Val)<<16; 2651 } 2652 else 2653 { 2654 data &= 0xFFFF0000; 2655 data |= Val; 2656 } 2657 whal_hwAccess_WriteMem(hHwAccess,(UINT32)sdioAddr,(UINT8*)&data,sizeof(data)); 2658 2659#endif /* HW_ACCESS_SDIO */ 2660 2661 } 2662 2663void whal_hwAccess_SetU16_Bits(TI_HANDLE hHwAccess, UINT32 Addr, UINT16 Val) 2664{ 2665 2666 2667#ifdef HW_ACCESS_SDIO 2668 2669 UINT32 sdioAddr; 2670 UINT16 sdioVal; 2671 2672 sdioAddr = Addr; 2673 whal_hwAccess_ReadMem(hHwAccess,(UINT32)((char *)sdioAddr),(UINT8*)((char *)&sdioVal),sizeof(UINT16)); 2674 sdioVal |= ENDIAN_HANDLE_WORD(Val); 2675 whal_hwAccess_WriteMem(hHwAccess,(UINT32)((char *)sdioAddr),(UINT8*)((char *)&sdioVal),sizeof(UINT16)); 2676 2677#else /* HW_ACCESS_SDIO */ 2678 2679 UINT32 data = 0; 2680 2681 whal_hwAccess_ReadMem(hHwAccess,(UINT32)Addr,(UINT8*)&data,sizeof(data)); 2682 data |= Val; 2683 whal_hwAccess_WriteMem(hHwAccess,(UINT32)Addr,(UINT8*)&data,sizeof(data)); 2684 2685#endif /* HW_ACCESS_SDIO */ 2686 2687 } 2688 2689void whal_hwAccess_ResetU16_Bits(TI_HANDLE hHwAccess, UINT32 Addr, UINT16 Val) 2690{ 2691 2692 2693#ifdef HW_ACCESS_SDIO 2694 2695 UINT32 sdioAddr; 2696 UINT16 sdioVal; 2697 2698 sdioAddr = Addr; 2699 whal_hwAccess_ReadMem(hHwAccess,(UINT32)((char *)sdioAddr),(UINT8*)((char *)&sdioVal),sizeof(UINT16)); 2700 sdioVal &= ~ENDIAN_HANDLE_WORD(Val); 2701 whal_hwAccess_WriteMem(hHwAccess,(UINT32)((char *)sdioAddr),(UINT8*)((char *)&sdioVal),sizeof(UINT16)); 2702 2703#else /* HW_ACCESS_SDIO */ 2704 2705 UINT32 data = 0; 2706 2707 whal_hwAccess_ReadMem(hHwAccess,(UINT32)Addr,(UINT8*)&data,sizeof(data)); 2708 data &= ~Val; 2709 whal_hwAccess_WriteMem(hHwAccess,(UINT32)Addr,(UINT8*)&data,sizeof(data)); 2710 2711#endif /* HW_ACCESS_SDIO */ 2712 2713 } 2714 2715/**************************************************************************** 2716 * whal_hwAccess_(Get/Set/SetBits/ResetBits)U32() 2717 **************************************************************************** 2718 * DESCRIPTION: wlan hardware memory access to longs 2719 * 2720 * INPUTS: 2721 * 2722 * OUTPUT: None 2723 * 2724 * RETURNS: OK or NOK 2725 ****************************************************************************/ 2726UINT32 whal_hwAccess_GetU32(TI_HANDLE hHwAccess, UINT32 Addr) 2727{ 2728 2729 2730#ifdef HW_ACCESS_SDIO 2731 2732 UINT32 DataLong; 2733 UINT32 sdioAddr; 2734 2735 sdioAddr = Addr; 2736 whal_hwAccess_ReadMem(hHwAccess,(UINT32)((char *)sdioAddr),(UINT8*)((char *)&DataLong),sizeof(UINT32)); 2737 return (ENDIAN_HANDLE_LONG(DataLong)); 2738 2739#else /* HW_ACCESS_SDIO */ 2740 2741 UINT32 data = 0; 2742 2743 whal_hwAccess_ReadMem(hHwAccess,(UINT32)Addr,(UINT8*)&data,sizeof(data)); 2744 return data; 2745 2746#endif /* HW_ACCESS_SDIO */ 2747 2748 } 2749 2750 2751void whal_hwAccess_SetU32(TI_HANDLE hHwAccess, UINT32 Addr, UINT32 Val) 2752{ 2753 2754 2755#ifdef HW_ACCESS_SDIO 2756 2757 UINT32 sdioAddr; 2758 UINT32 sdioVal; 2759 2760 sdioAddr = Addr; 2761 sdioVal = ENDIAN_HANDLE_WORD(Val); 2762 whal_hwAccess_WriteMem(hHwAccess,(UINT32)((char *)sdioAddr),(UINT8*)((char *)&sdioVal),sizeof(UINT32)); 2763 2764#else /* HW_ACCESS_SDIO */ 2765 2766 whal_hwAccess_WriteMem(hHwAccess,(UINT32)Addr,(UINT8*)&Val,sizeof(Val)); 2767 2768#endif /* HW_ACCESS_SDIO */ 2769 2770 } 2771 2772void whal_hwAccess_SetU32_Bits(TI_HANDLE hHwAccess, UINT32 Addr, UINT32 Val) 2773{ 2774 2775 2776#ifdef HW_ACCESS_SDIO 2777 2778 UINT32 sdioAddr; 2779 UINT32 DataShort; 2780 2781 sdioAddr = (Addr & 0xfffffffe); 2782 whal_hwAccess_ReadMem(hHwAccess,(UINT32)((char *)sdioAddr),(UINT8*)((char *)&DataShort),sizeof(UINT32)); 2783 DataShort |= ENDIAN_HANDLE_LONG(Val); 2784 whal_hwAccess_WriteMem(hHwAccess,(UINT32)((char *)sdioAddr),(UINT8*)((char *)&DataShort),sizeof(UINT32)); 2785 2786#else /* HW_ACCESS_SDIO */ 2787 2788 UINT32 data = 0; 2789 2790 whal_hwAccess_ReadMem(hHwAccess,(UINT32)Addr,(UINT8*)&data,sizeof(data)); 2791 data |= Val; 2792 whal_hwAccess_WriteMem(hHwAccess,(UINT32)Addr,(UINT8*)&data,sizeof(data)); 2793 2794#endif /* HW_ACCESS_SDIO */ 2795 2796 } 2797 2798void whal_hwAccess_ResetU32_Bits(TI_HANDLE hHwAccess, UINT32 Addr, UINT32 Val) 2799{ 2800 2801 2802#ifdef HW_ACCESS_SDIO 2803 2804 UINT32 sdioAddr; 2805 UINT32 DataShort; 2806 2807 sdioAddr = (Addr & 0xfffffffe); 2808 whal_hwAccess_ReadMem(hHwAccess,(UINT32)((char *)sdioAddr),(UINT8*)((char *)&DataShort),sizeof(UINT32)); 2809 DataShort &= ~ENDIAN_HANDLE_LONG(Val); 2810 whal_hwAccess_WriteMem(hHwAccess,(UINT32)((char *)sdioAddr),(UINT8*)((char *)&DataShort),sizeof(UINT32)); 2811 2812#else /* HW_ACCESS_SDIO */ 2813 2814 UINT32 data = 0; 2815 2816 whal_hwAccess_ReadMem(hHwAccess,(UINT32)Addr,(UINT8*)&data,sizeof(data)); 2817 data &= ~Val; 2818 whal_hwAccess_WriteMem(hHwAccess,(UINT32)Addr,(UINT8*)&data,sizeof(data)); 2819 2820#endif /* HW_ACCESS_SDIO */ 2821 2822 } 2823 2824#endif /* USE_SYNC_API */ 2825 2826 2827/**************************************************************************** 2828 * whal_hwAccess_Print() 2829 **************************************************************************** 2830 * DESCRIPTION: Print interrupts information 2831 * 2832 * INPUTS: None 2833 * 2834 * OUTPUT: None 2835 * 2836 * RETURNS: 2837 ****************************************************************************/ 2838void whal_hwAccess_Print(TI_HANDLE hHwAccess) 2839{ 2840 /* will be in use only if a print function will be neaded. 2841 HwAccess_T_new *pHwAccess = (HwAccess_T_new*) hHwAccess; 2842 */ 2843 WLAN_OS_REPORT(("whal_hwAccess_Print ----------------------------\n")); 2844 WLAN_OS_REPORT((" NOTHING RIGHTNOW\n")); 2845} 2846 2847/************************************************************************ 2848 * Internal functions 2849 ************************************************************************/ 2850 2851#ifdef HW_ACCESS_SDIO 2852 TI_STATUS whal_hwAccess_RecreateInterface(TI_HANDLE hHwAccess) 2853 { 2854 SDIO_ConfigParams configParams; 2855 HwAccess_T_new *pHwAccess = (HwAccess_T_new*)hHwAccess; 2856 SDIO_Status status; 2857 2858 os_memoryZero( pHwAccess->hOs, &configParams, sizeof(SDIO_ConfigParams)); 2859 configParams.fnotify_read = sdio_transaction_notify_read; 2860 configParams.fnotify_write = sdio_transaction_notify_write; 2861 configParams.ferror = sdio_transaction_error; 2862 configParams.fconfig_peripheral = SDIO_TNETWConfig; 2863 configParams.fconvert = NULL; 2864 configParams.owner = pHwAccess; 2865 2866 status = SDIO_Init(&configParams, &pHwAccess->hDriver); 2867 2868 return (status == SDIO_SUCCESS) ? OK : NOK; 2869 } 2870#elif defined(HW_ACCESS_WSPI) 2871 TI_STATUS whal_hwAccess_RecreateInterface(TI_HANDLE hHwAccess) 2872 { 2873 HwAccess_T_new *pHwAccess = (HwAccess_T_new*)hHwAccess; 2874 int status; 2875 2876 /* re-configure the WSPi interface, using NULL to keep old parameters */ 2877 status = WSPI_Configure (pHwAccess->hDriver , NULL, NULL, NULL); 2878 2879#ifndef _WINDOWS 2880 WSPI2TNETWIF (pHwAccess, status, 0x0); 2881 return (TI_STATUS)status; 2882#else 2883#endif 2884 } 2885#else /* ifdef HW_ACCESS_SDIO */ 2886 TI_STATUS whal_hwAccess_RecreateInterface(TI_HANDLE hHwAccess) 2887 { 2888 TI_STATUS status = NOK; 2889 2890 /*#error whal_hwAccess_RecreateInterface function is not implemented for HW interface other than SDIO.*/ 2891 2892 return (status); 2893 } 2894#endif /* ifdef HW_ACCESS_SDIO */ 2895 2896 2897