Home | History | Annotate | Download | only in BusTxn
      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  ************************************************************************/
    139 typedef struct _HWAccess_CB_T
    140 {
    141     HwAccess_callback_t CBFunc;
    142     void* CBArg;
    143 } HWAccess_CB_T;
    144 
    145 typedef void (*HwAccessErrorHandle)(TI_HANDLE theObjectHandle,char* Report , UINT32 strLen);
    146 
    147 typedef  struct _partition_t
    148 {
    149     UINT32 size;
    150     UINT32 start;
    151 } partition_t;
    152 
    153 
    154 /* HwAccess context */
    155 typedef 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)
    280 static void whal_hwAccess_DirectCopy_new(HwAccess_T_new *pHwAccess, UINT8* Dest, UINT8* Src, UINT32 Len);
    281 #endif
    282 #ifdef HW_ACCESS_SDIO
    283 static void sdio_transaction_notify_read(struct SDIO_Request *req, int status);
    284 static void sdio_transaction_notify_write(struct SDIO_Request *req, int status);
    285 static void sdio_transaction_error(struct SDIO_Request *req, int stat);
    286 #ifdef CONFIG_ASYNC_API
    287 static void sdio_async_transaction_notify(struct SDIO_Request *req, int status);
    288 static 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  ****************************************************************************/
    324 TI_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  ****************************************************************************/
    395 int 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  ****************************************************************************/
    433 int 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  ****************************************************************************/
    500 int 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  ****************************************************************************/
    533 int 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  ****************************************************************************/
    577 int 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  ****************************************************************************/
    641 int 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  ****************************************************************************/
    700 int         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  ****************************************************************************/
    801 int         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  ****************************************************************************/
    904 int         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  ****************************************************************************/
   1119 int         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  ****************************************************************************/
   1293 int         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  ****************************************************************************/
   1482 TI_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  ****************************************************************************/
   1619 int 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  ****************************************************************************/
   1747 int         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  ****************************************************************************/
   1850 int 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  ****************************************************************************/
   1883 int         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  ****************************************************************************/
   1985 int         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  ****************************************************************************/
   2054 int         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  ****************************************************************************/
   2122 int 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  ****************************************************************************/
   2218 int 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  ****************************************************************************/
   2312 static 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 */
   2375 static void sdio_transaction_notify_read(struct SDIO_Request *req, int status)
   2376 {
   2377 }
   2378 
   2379 static void sdio_transaction_notify_write(struct SDIO_Request *req, int status)
   2380 {
   2381 }
   2382 
   2383 /* callback notify error read/write transaction function */
   2384 static 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 
   2396 static 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 */
   2411 static 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 
   2424 TI_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  ****************************************************************************/
   2450 void 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  ****************************************************************************/
   2470 void 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  ****************************************************************************/
   2490 int 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  ****************************************************************************/
   2513 UINT8 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 
   2536 void 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 
   2564 void 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  ****************************************************************************/
   2601 UINT16 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 
   2626 void 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 
   2663 void 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 
   2689 void 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  ****************************************************************************/
   2726 UINT32 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 
   2751 void 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 
   2772 void 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 
   2798 void 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  ****************************************************************************/
   2838 void 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