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:  ShmFwCtrl.c
39 *   PURPOSE: shared memory firmware control
40 *
41 ****************************************************************************/
42#include "whalCommon.h"
43#include "whalBus_Api.h"
44#include "shmBus.h"
45#include "TNETWIF.h"
46#include "whalHwAccess.h"
47#include "whalHwCtrl.h"
48#include "shmFwCtrl.h"
49#include "TNETW_Driver.h"
50#include "CmdMBox_api.h"
51#include "eventMbox_api.h"
52#include "FwEvent_api.h"
53
54
55/* Firmware image header size */
56#define FW_HDR_SIZE 8
57
58
59static TI_STATUS whal_FwCtrl_BootSm                 (TI_HANDLE hWhalBus, UINT8 module_id, TI_STATUS status);
60static TI_STATUS whal_FwCtrl_ResetSm                (TI_HANDLE hWhalBus, UINT8 module_id, TI_STATUS status);
61static TI_STATUS whal_FwCtrl_EepromlessStartBurstSm (TI_HANDLE hWhalBus, UINT8 module_id, TI_STATUS status);
62static TI_STATUS whal_FwCtrl_InitSequenceSm         (TI_HANDLE hWhalBus, UINT8 module_id, TI_STATUS status);
63static TI_STATUS whal_FwCtrl_LoadFwImageSm          (TI_HANDLE hWhalBus, UINT8 module_id, TI_STATUS status);
64static TI_STATUS whal_FwCtrl_FinalizeDownloadSm     (TI_HANDLE hWhalBus, UINT8 module_id, TI_STATUS status);
65#ifdef USE_SYNC_API
66static int       whal_FwCtrl_Reset                  (TI_HANDLE hWhalBus);
67#endif
68
69
70/* Handle return status inside a state machine */
71#define EXCEPT(pwhalbus,status)                                 \
72    switch (status) {                                           \
73        case OK:                                                \
74        case TNETWIF_COMPLETE:                                  \
75             break;                                             \
76        case TNETWIF_PENDING:                                   \
77             return TNETWIF_PENDING;                            \
78        default:                                                \
79             whal_hwCtrl_FinalizeOnFailure (pwhalbus->hHwCtrl); \
80             return TNETWIF_ERROR;                              \
81    }
82
83
84/* Handle return status inside an init sequence state machine  */
85#define EXCEPT_I(pwhalbus,status)                               \
86    switch (status) {                                           \
87        case OK:                                                \
88        case TNETWIF_COMPLETE:                                  \
89             break;                                             \
90        case TNETWIF_PENDING:                                   \
91             pwhalbus->uInitSeqStatus = status;                 \
92             return TNETWIF_PENDING;                            \
93        default:                                                \
94             whal_hwCtrl_FinalizeOnFailure (pwhalbus->hHwCtrl); \
95             return TNETWIF_ERROR;                              \
96    }
97
98
99/* Handle return status inside a load image state machine */
100#define EXCEPT_L(pwhalbus,status)                               \
101    switch (status) {                                           \
102        case OK:                                                \
103        case TNETWIF_COMPLETE:                                  \
104             break;                                             \
105        case TNETWIF_PENDING:                                   \
106             pwhalbus->DownloadStatus = status;                 \
107             return TNETWIF_PENDING;                            \
108        default:                                                \
109             pwhalbus->DownloadStatus = status;                 \
110             whal_hwCtrl_FinalizeOnFailure (pwhalbus->hHwCtrl); \
111             return TNETWIF_ERROR;                              \
112    }
113
114
115/****************************************************************************
116 *                      whalBus_FwCtrl_Boot()
117 ****************************************************************************
118 * DESCRIPTION: Download firmware code to the Hardware and run it
119 *
120 * INPUTS:  None
121 *
122 * OUTPUT:  None
123 *
124 * RETURNS: OK or NOK
125 ****************************************************************************/
126TI_STATUS whalBus_FwCtrl_Boot (TI_HANDLE hWhalBus, TI_HANDLE hHwCtrl, BootAttr_T *pBootAttr)
127{
128    whalBus_T *pWhalBus     = (whalBus_T *)hWhalBus;
129    HwCtrl_T  *pHwCtrl      = (HwCtrl_T *)hHwCtrl;
130
131    pWhalBus->hHwCtrl = hHwCtrl;
132
133    /* Store the pointer to the FW buffer for further use in FW download in part */
134    pWhalBus->pFwBuf = (UINT8 *)pHwCtrl->uFwBuf;
135    pWhalBus->uFwLastAddr = pHwCtrl->uFwAddr;
136    pWhalBus->pEEPROMBuf = (UINT8 *)pHwCtrl->uEEEPROMBuf;
137    pWhalBus->uEEPROMLen = pHwCtrl->uEEEPROMLen;
138
139    /*
140     * Initialize the status of download to  pending
141     * It will be set to TNETWIF_COMPLETE at the FinalizeDownload function
142     */
143    pWhalBus->DownloadStatus = TNETWIF_PENDING;
144
145    /* Call the boot sequence state machine */
146    pWhalBus->uInitStage = 0;
147
148    os_memoryCopy (pWhalBus->hOs, &pWhalBus->BootAttr, pBootAttr, sizeof(BootAttr_T));
149
150    whal_FwCtrl_BootSm (hWhalBus, HAL_INIT_MODULE_ID, OK);
151
152    /*
153     * If it returns the status of the StartInstance only then we can here query for the download status
154     * and then return the status up to the TNETW_Driver.
155     * This return value will go back up to the TNETW Driver layer so that the init from OS will know
156     * if to wait for the InitComplte or not in case of TNETWIF_ERROR.
157     * This value will always be pending since the SPI is ASYNC
158     * and in SDIOa timer is set so it will be ASync also in anyway.
159     */
160    return pWhalBus->DownloadStatus;
161}
162
163
164 /****************************************************************************
165 * DESCRIPTION: Firmware boot state machine
166 *
167 * INPUTS:
168 *      TI_HANDLE hWhalBus  Handle to the Bus
169 *      UINT8 module_id     The module id of the Init process in the TNETWIF
170 *
171 * OUTPUT:  None
172 *
173 * RETURNS: OK
174 ****************************************************************************/
175static TI_STATUS whal_FwCtrl_BootSm (TI_HANDLE hWhalBus, UINT8 module_id, TI_STATUS status)
176{
177    whalBus_T  *pWhalBus = (whalBus_T *)hWhalBus;
178    BootAttr_T *pBootAttr;
179    UINT8 minorMinorE2Ver = 0;
180
181    EXCEPT (pWhalBus, status)
182
183    switch (pWhalBus->uInitStage)
184    {
185    case 0:
186        pWhalBus->uInitStage ++;
187
188        pWhalBus->uChipId = 0;
189
190        /* Read the CHIP ID to get an indication that the bus is OK */
191        status = TNETWIF_ReadRegOpt (pWhalBus->hTNETWIF,
192                                     CHIP_ID,
193                                     &pWhalBus->uChipId,
194                                     module_id,
195                                     (TNETWIF_callback_t)whal_FwCtrl_BootSm,
196                                     hWhalBus);
197        EXCEPT (pWhalBus, status)
198
199    case 1:
200        pWhalBus->uInitStage ++;
201
202        /* This is only sanity check that the HW exists, we can continue and fail on FwLoad */
203        if (pWhalBus->uChipId == CHIP_ID_1251_PG10)
204        {
205            WLAN_OS_REPORT(("Working on a 1251 PG 1.0 board.\n"));
206        }
207        else if (pWhalBus->uChipId == CHIP_ID_1251_PG11)
208        {
209            WLAN_OS_REPORT(("Working on a 1251 PG 1.1 board.\n"));
210        }
211        else if (pWhalBus->uChipId == CHIP_ID_1251_PG12)
212        {
213            WLAN_OS_REPORT(("Working on a 1251 PG 1.2 board.\n"));
214        }
215        else
216        {
217            WLAN_REPORT_ERROR (pWhalBus->hReport, HAL_HW_CTRL_MODULE_LOG,
218                               ("whalBus_FwCtrl_Boot: ERROR, Fail to identify Wlan Hardware card, ChipId(0x%x)=0x%x\n",
219                               CHIP_ID, pWhalBus->uChipId));
220
221            WLAN_OS_REPORT (("Found unknown Chip Id = 0x%x\n", pWhalBus->uChipId));
222
223            /*
224             * NOTE: no exception because of forward compatibility
225             */
226        }
227
228        /*
229         * Soft reset
230         */
231        pWhalBus->uResetStage = 0;
232        pWhalBus->uSelfClearTime = 0;
233        pWhalBus->uBootData = 0;
234        status = whal_FwCtrl_ResetSm (pWhalBus, module_id, OK);
235
236        EXCEPT (pWhalBus, status)
237
238    case 2:
239        pWhalBus->uInitStage ++;
240
241        WLAN_REPORT_INIT (pWhalBus->hReport, HAL_CTRL_MODULE_LOG, ("TNET SOFT-RESET\n"));
242
243        WLAN_OS_REPORT(("Starting to process NVS...\n"));
244
245        /*
246         * Start EEPROM/NVS burst (get RadioType)
247         */
248        if (pWhalBus->pEEPROMBuf)
249        {
250            /* NVS file exists (EEPROM-less support) */
251            pWhalBus->uEEPROMCurLen = pWhalBus->uEEPROMLen;
252            pWhalBus->pEEPROMCurPtr = pWhalBus->pEEPROMBuf;
253            pWhalBus->uEEPROMStage = 0;
254
255            WLAN_REPORT_INIT (pWhalBus->hReport, HAL_HW_CTRL_MODULE_LOG,
256                              ("whal_FwCtrl_EepromlessStartBurst: EEPROM Image addr=0x%x, EEPROM Len=0x0x%x\n",
257                              pWhalBus->pEEPROMBuf, pWhalBus->uEEPROMLen));
258            status = whal_FwCtrl_EepromlessStartBurstSm (hWhalBus, module_id, OK);
259
260            EXCEPT (pWhalBus, status)
261        }
262
263    case 3:
264        pWhalBus->uInitStage ++;
265
266        if (pWhalBus->pEEPROMBuf)
267        {
268            status = TNETWIF_WriteRegOpt (pWhalBus->hTNETWIF,
269                                          ACX_EEPROMLESS_IND_REG,
270                                          pWhalBus->uFwLastAddr,
271                                          module_id,
272                                          (TNETWIF_callback_t)whal_FwCtrl_BootSm,
273                                          hWhalBus);
274            EXCEPT (pWhalBus, status)
275        }
276
277    case 4:
278        pWhalBus->uInitStage ++;
279
280        if (pWhalBus->pEEPROMBuf)
281        {
282            WLAN_REPORT_INIT (pWhalBus->hReport, HAL_CTRL_MODULE_LOG,
283                              ("DRIVER NVS BURST-READ\n"));
284        }
285
286        if (!pWhalBus->pEEPROMBuf)
287        {
288            /*
289             * Start ACX EEPROM
290             */
291            status = TNETWIF_WriteRegOpt (pWhalBus->hTNETWIF,
292                                          ACX_REG_EE_START,
293                                          START_EEPROM_MGR,
294                                          module_id,
295                                          (TNETWIF_callback_t)whal_FwCtrl_BootSm,
296                                          hWhalBus);
297            EXCEPT (pWhalBus, status)
298        }
299
300    case 5:
301        pWhalBus->uInitStage ++;
302
303        if (!pWhalBus->pEEPROMBuf)
304        {
305            /*
306             * The stall is needed so the EEPROM NVS burst read will complete
307             */
308            os_StalluSec (pWhalBus->hOs, 40000);
309
310            status = TNETWIF_WriteRegOpt (pWhalBus->hTNETWIF,
311                                          ACX_EEPROMLESS_IND_REG,
312                                          USE_EEPROM,
313                                          module_id,
314                                          (TNETWIF_callback_t)whal_FwCtrl_BootSm,
315                                          hWhalBus);
316            EXCEPT (pWhalBus, status)
317        }
318
319    case 6:
320        pWhalBus->uInitStage ++;
321
322        if (!pWhalBus->pEEPROMBuf)
323        {
324            WLAN_REPORT_INIT (pWhalBus->hReport, HAL_CTRL_MODULE_LOG,
325                              ("STARTING EEPROM NVS BURST-READ\n"));
326        }
327
328        /* Read the EEPROM parameters */
329        status = TNETWIF_ReadRegOpt (pWhalBus->hTNETWIF,
330                                     SCR_PAD2,
331                                     &pWhalBus->uBootData,
332                                     module_id,
333                                     (TNETWIF_callback_t)whal_FwCtrl_BootSm,
334                                     hWhalBus);
335        EXCEPT (pWhalBus, status)
336
337    case 7:
338        pWhalBus->uInitStage ++;
339
340        pBootAttr = &pWhalBus->BootAttr;
341        pBootAttr->radioType = (pWhalBus->uBootData & 0x0000FF00) >> 8;
342        pBootAttr->majorE2Ver = (pWhalBus->uBootData & 0x00FF0000) >> 16;
343
344        status = TNETWIF_ReadRegOpt (pWhalBus->hTNETWIF,
345                                     SCR_PAD3,
346                                     &pWhalBus->uBootData,
347                                     module_id,
348                                     (TNETWIF_callback_t)whal_FwCtrl_BootSm,
349                                     hWhalBus);
350        EXCEPT (pWhalBus, status)
351
352    case 8:
353        pWhalBus->uInitStage ++;
354
355        pBootAttr = &pWhalBus->BootAttr;
356        pBootAttr->minorE2Ver = (pWhalBus->uBootData & 0x00FF0000) >> 16;
357        minorMinorE2Ver = (pWhalBus->uBootData & 0xFF000000) >> 24;
358
359        if (pBootAttr->radioType == 0xffffffff)
360        {
361            WLAN_REPORT_FATAL_ERROR (pWhalBus->hReport, HAL_CTRL_MODULE_LOG,
362                                     ("whalBus_FwCtrl_Boot: error in RadioType\n"));
363            EXCEPT (pWhalBus, TNETWIF_ERROR)
364        }
365
366        WLAN_OS_REPORT(("NVS version %d.%d.%d found.\n", pBootAttr->majorE2Ver, pBootAttr->minorE2Ver, minorMinorE2Ver));
367        WLAN_OS_REPORT(("Radio type is 0x%X.\n", pBootAttr->radioType));
368
369        /* Call the restart sequence */
370        pWhalBus->uInitSeqStage = 0;
371        pWhalBus->uInitSeqStatus = TNETWIF_COMPLETE;
372        status = whal_FwCtrl_InitSequenceSm (hWhalBus, module_id, OK);
373
374        EXCEPT (pWhalBus, status)
375
376    case 9:
377        pWhalBus->uInitStage ++;
378
379        WLAN_OS_REPORT(("Finished processing NVS.\n"));
380
381        /* Download the firmware */
382        status = TNETWIF_ReadRegOpt (pWhalBus->hTNETWIF,
383                                     ACX_REG_ECPU_CONTROL,
384                                     &pWhalBus->uBootData,
385                                     module_id,
386                                     (TNETWIF_callback_t)whal_FwCtrl_BootSm,
387                                     hWhalBus);
388        EXCEPT (pWhalBus, status)
389
390    case 10:
391        pWhalBus->uInitStage = 0;
392
393        if (pWhalBus->pFwBuf && (pWhalBus->uBootData & ECPU_CONTROL_HALT) != 0)
394        {
395            WLAN_REPORT_INIT (pWhalBus->hReport, HAL_CTRL_MODULE_LOG,
396                              ("CPU halt -> download code"));
397
398            /* Load firmware image */
399            pWhalBus->uLoadStage = 0;
400            status = whal_FwCtrl_LoadFwImageSm (pWhalBus, module_id, OK);
401
402            switch (status)
403            {
404            case TNETWIF_COMPLETE:
405                /*WLAN_OS_REPORT (("Firmware successfully downloaded.\n"));*/
406                break;
407            case TNETWIF_PENDING:
408                WLAN_OS_REPORT (("Starting to download firmware...\n"));
409                break;
410            default:
411                WLAN_REPORT_ERROR (pWhalBus->hReport, HAL_HW_CTRL_MODULE_LOG, ("Firmware download failed!\n"));
412                break;
413            }
414
415            EXCEPT (pWhalBus, status);
416        }
417        else
418        {
419            WLAN_REPORT_INIT (pWhalBus->hReport, HAL_CTRL_MODULE_LOG, ("Firmware not downloaded...\n"));
420
421            EXCEPT (pWhalBus, TNETWIF_ERROR)
422        }
423
424    } /* Switch end */
425
426    return TNETWIF_COMPLETE;
427}
428
429
430/****************************************************************************
431 *                      whal_FwCtrl_FinalizeDownloadSm()
432 ****************************************************************************
433 * DESCRIPTION: Run the Hardware firmware
434 *              Wait for Init Complete
435 *              Configure the Bus Access with Addresses available on the scratch pad register
436 *              Change the SDIO/SPI partitions to be able to see all the memory addresses
437 *
438 * INPUTS:  None
439 *
440 * OUTPUT:  None
441 *
442 * RETURNS: None
443 ****************************************************************************/
444static TI_STATUS whal_FwCtrl_FinalizeDownloadSm (TI_HANDLE hWhalBus, UINT8 module_id, TI_STATUS status)
445{
446    whalBus_T *pWhalBus = (whalBus_T *)hWhalBus;
447
448    #define FIN_LOOP 20000
449
450    EXCEPT (pWhalBus, status)
451
452    while (TRUE)
453    {
454        switch (pWhalBus->uFinStage)
455        {
456        case 0:
457            pWhalBus->uFinStage ++;
458
459            /*
460             * Run the firmware (I)
461             */
462            status = TNETWIF_ReadRegOpt (pWhalBus->hTNETWIF,
463                                         ACX_REG_ECPU_CONTROL,
464                                         &pWhalBus->uFinData,
465                                         module_id,
466                                         (TNETWIF_callback_t)whal_FwCtrl_FinalizeDownloadSm,
467                                         hWhalBus);
468            EXCEPT (pWhalBus, status);
469
470        case 1:
471            pWhalBus->uFinStage ++;
472
473            /*
474             * Run the firmware (II)
475             */
476            status = TNETWIF_WriteRegOpt (pWhalBus->hTNETWIF,
477                                          ACX_REG_ECPU_CONTROL,
478                                          pWhalBus->uFinData & ~ECPU_CONTROL_HALT,
479                                          module_id,
480                                          (TNETWIF_callback_t)whal_FwCtrl_FinalizeDownloadSm,
481                                          hWhalBus);
482            EXCEPT (pWhalBus, status);
483
484        case 2:
485            pWhalBus->uFinStage ++;
486
487          #if defined(TNETW1150) && defined(RIVENDELL)
488            /* (!!!1150) added when testing with the prateekai/rivendell */
489            WLAN_REPORT_ERROR (pWhalBus->hReport, HAL_HW_CTRL_MODULE_LOG,
490                               ("whal_hwCtrl_Run: Only 1150 - wait 500 msec between FW download and run CPU\n"));
491            os_StalluSec (pWhalBus->hOs, 500000);
492          #endif
493
494            WLAN_OS_REPORT (("Firmware running.\n"));
495
496            /*
497             * CHIP ID Debug
498             */
499            status = TNETWIF_ReadRegOpt (pWhalBus->hTNETWIF,
500                                         CHIP_ID,
501                                         &pWhalBus->uFinData,
502                                         module_id,
503                                         (TNETWIF_callback_t)whal_FwCtrl_FinalizeDownloadSm,
504                                         hWhalBus);
505            EXCEPT (pWhalBus, status);
506
507        case 3:
508            pWhalBus->uFinStage ++;
509            pWhalBus->uFinLoop = 0;
510
511            WLAN_REPORT_INIT (pWhalBus->hReport, HAL_CTRL_MODULE_LOG,
512                              ("CHIP ID IS %x\n", pWhalBus->uFinData));
513
514            WLAN_REPORT_INIT (pWhalBus->hReport, HAL_HW_CTRL_MODULE_LOG, ("Wait init complete\n"));
515
516        case 4:
517            /*
518             * Wait for init complete
519             */
520            if (pWhalBus->uFinLoop < FIN_LOOP)
521            {
522                pWhalBus->uFinStage = 5;
523
524                os_StalluSec (pWhalBus->hOs, 50);
525
526                /* Read interrupt status register */
527                status = TNETWIF_ReadRegOpt (pWhalBus->hTNETWIF,
528                                             ACX_REG_INTERRUPT_NO_CLEAR,
529                                             &pWhalBus->uFinData,
530                                             module_id,
531                                             (TNETWIF_callback_t)whal_FwCtrl_FinalizeDownloadSm,
532                                             hWhalBus);
533                EXCEPT (pWhalBus, status);
534            }
535            else
536                pWhalBus->uFinStage = 6;
537            continue;
538
539        case 5:
540            if (pWhalBus->uFinData == 0xffffffff) /* error */
541            {
542                WLAN_REPORT_ERROR (pWhalBus->hReport, HAL_HW_CTRL_MODULE_LOG,
543                                   ("Error reading hardware complete init indication\n"));
544
545                pWhalBus->DownloadStatus = TNETWIF_ERROR;
546                EXCEPT (pWhalBus, TNETWIF_ERROR);
547            }
548
549            if (IS_MASK_ON (pWhalBus->uFinData, ACX_INTR_INIT_COMPLETE))
550            {
551                pWhalBus->uFinStage = 6;
552
553                /* Interrupt ACK */
554                status = TNETWIF_WriteRegOpt (pWhalBus->hTNETWIF,
555                                              ACX_REG_INTERRUPT_ACK,
556                                              ACX_INTR_INIT_COMPLETE,
557                                              module_id,
558                                              (TNETWIF_callback_t)whal_FwCtrl_FinalizeDownloadSm,
559                                              hWhalBus);
560                EXCEPT (pWhalBus, status);
561            }
562            else
563            {
564                pWhalBus->uFinStage = 4;
565                pWhalBus->uFinLoop ++;
566            }
567            continue;
568
569        case 6:
570            pWhalBus->uFinStage = 7;
571
572            if (pWhalBus->uFinLoop >= FIN_LOOP)
573            {
574                WLAN_REPORT_ERROR (pWhalBus->hReport, HAL_HW_CTRL_MODULE_LOG,
575                                   ("Timeout waiting for the hardware to complete initialization\n"));
576
577                pWhalBus->DownloadStatus = TNETWIF_ERROR;
578                EXCEPT (pWhalBus, TNETWIF_ERROR);
579            }
580
581            WLAN_REPORT_INIT (pWhalBus->hReport, HAL_CTRL_MODULE_LOG, ("Firmware init complete...\n"));
582
583            /*
584             * There are valid addresses of the command and event mailbox
585             * on the scratch pad registers
586             */
587            {
588                /* Hardware config command mail box */
589                TnetwDrv_t *pTnetwDrv = (TnetwDrv_t *)pWhalBus->hTnetwDrv;
590                status = CmdMBox_ConfigHw (pTnetwDrv->hCmdMBox,
591                                           module_id,
592                                           (fnotify_t)whal_FwCtrl_FinalizeDownloadSm,
593                                           hWhalBus);
594                EXCEPT (pWhalBus, status);
595            }
596            continue;
597
598        case 7:
599            pWhalBus->uFinStage = 8;
600
601            {
602                /* Hardware config event mail box */
603                TnetwDrv_t *pTnetwDrv = (TnetwDrv_t *)pWhalBus->hTnetwDrv;
604                status = eventMbox_ConfigHw (pTnetwDrv->hEventMbox,
605                                             module_id,
606                                             (fnotify_t)whal_FwCtrl_FinalizeDownloadSm,
607                                             hWhalBus);
608                EXCEPT (pWhalBus, status);
609            }
610            continue;
611
612        case 8:
613            pWhalBus->uFinStage = 9;
614
615            /* Set the working partition to its "running" mode offset */
616          #if defined(HW_ACCESS_SDIO) || defined(HW_ACCESS_WSPI)
617            status = TNETWIF_SetPartitionsOpt (pWhalBus->hTNETWIF,
618                                               HW_ACCESS_WORKING,
619                                               HW_ACCESS_WORK_PART0_ADDR,
620                                               module_id,
621                                               (TNETWIF_callback_t)whal_FwCtrl_FinalizeDownloadSm,
622                                               hWhalBus);
623             EXCEPT (pWhalBus, status);
624          #endif
625            continue;
626
627        case 9:
628            pWhalBus->uFinStage = 10;
629
630            /*
631             * In case of full asynchronous mode the firmware event must be ready
632             * to receive event from the command mailbox
633             */
634            {
635                TnetwDrv_t *pTnetwDrv = (TnetwDrv_t *)pWhalBus->hTnetwDrv;
636                UINT32      uIntVect;
637
638				if (pWhalBus->recoveryProcess == FALSE)
639                FwEvent_Config (pTnetwDrv->hFwEvent, pWhalBus->hTnetwDrv);
640
641              #if !defined(USE_SYNC_API)
642
643                /* This makes command mailbox to work in normal mode */
644                whalBus_ExitFromInitMode (hWhalBus);
645
646                /* Enable command complete interrupt */
647                FwEvent_Enable (pTnetwDrv->hFwEvent, ACX_INTR_CMD_COMPLETE);
648
649                /* At the driver init the interrupts must be disabled */
650                os_enableIrq (pWhalBus->hOs);
651
652              #endif
653
654              #ifdef PRIODIC_INTERRUPT
655			    /* Enable periodic interrupts. It means that every period of time the FwEvent SM will be called */
656                os_periodicIntrTimerStart (pWhalBus->hOs);
657              #endif
658
659                uIntVect = FwEvent_GetEnabled (pTnetwDrv->hFwEvent);
660
661                /* Clearing all the interrupt status register sources */
662                status = TNETWIF_WriteRegOpt (pWhalBus->hTNETWIF,
663                                              ACX_REG_INTERRUPT_MASK,
664                                              ~uIntVect,
665                                              module_id,
666                                              (TNETWIF_callback_t)whal_FwCtrl_FinalizeDownloadSm,
667                                              hWhalBus);
668            }
669
670            EXCEPT (pWhalBus, status);
671            continue;
672
673        case 10:
674            pWhalBus->uFinStage = 11;
675
676            /*
677             * Setting the right operation of the interrupt
678             * bit 5 - enable interrupt
679             * bit 7 - active low
680             */
681            status = TNETWIF_WriteRegOpt (pWhalBus->hTNETWIF,
682                                          HI_CFG,
683                                          HI_CFG_DEF_VAL,
684                                          module_id,
685                                          (TNETWIF_callback_t)whal_FwCtrl_FinalizeDownloadSm,
686                                          hWhalBus);
687            EXCEPT (pWhalBus, status);
688            continue;
689
690        case 11:
691            pWhalBus->uFinStage = 0;
692
693          #ifdef DEBUG_INTERRUPTS_PRINT
694            WLAN_REPORT_INFORMATION (pHwIntr->hReport,
695                                     HAL_HW_CTRL_MODULE_LOG,
696                                     ("whal_hwIntr_EnableInterrupts(0x%08X)",
697                                     pHwIntr->InterruptEnabled));
698          #endif
699
700          #if defined(HAL_ON_WIN)
701            /* (!!!) Only in CardBus, add HostIfType parameter */
702            /* Enable interrupt on a CardBus */
703            TNETWIF_WriteRegSync (pWhalBus->hTNETWIF, FEMR, 0x8000);
704          #endif
705
706            /*
707             * The last thing to be done after the upper layers have been called
708             * is to send FINISH to the TNETWIF to end the init process
709             */
710            TNETWIF_Finish (pWhalBus->hTNETWIF, HAL_INIT_MODULE_ID, hWhalBus, NULL);
711
712            /* Call the whal_hwCtrl_FinalizeDownload of the upper layer to finalize the download process */
713            whal_hwCtrl_FinalizeDownload (pWhalBus->hHwCtrl, &pWhalBus->BootAttr);
714
715            /* Set the Download Status to COMPLETE */
716            pWhalBus->DownloadStatus = TNETWIF_COMPLETE;
717
718            return TNETWIF_COMPLETE;
719
720        } /* End switch */
721
722    } /* End while */
723
724}
725
726
727#ifdef USE_SYNC_API
728
729/****************************************************************************
730 *                      whal_hwCtrl_Reset()
731 ****************************************************************************
732 * DESCRIPTION: Reset the Hardware
733 *
734 * INPUTS:  None
735 *
736 * OUTPUT:  None
737 *
738 * RETURNS: OK or NOK
739 ****************************************************************************/
740static int whal_FwCtrl_Reset (TI_HANDLE hWhalBus)
741{
742#ifdef USE_SYNC_API
743
744    whalBus_T *pWhalBus = (whalBus_T *)hWhalBus;
745    UINT32 data;
746
747#ifdef  TNETW1251
748
749    /***************************************************************/
750    /* SOFT RESET is done here - its a temporary fix */
751    /***************************************************************/
752    UINT32 SelfClearTime;
753
754    /*
755     * Perform Soft Reset
756     */
757    TNETWIF_WriteRegSync(pWhalBus->hTNETWIF,  ACX_REG_SLV_SOFT_RESET, SLV_SOFT_RESET_BIT);
758
759    /* SOFT_RESET - Self clearing  */
760    for (SelfClearTime=0; SelfClearTime<SOFT_RESET_MAX_TIME; SelfClearTime+=SOFT_RESET_STALL_TIME)
761    {
762        TNETWIF_ReadRegSync(pWhalBus->hTNETWIF, ACX_REG_SLV_SOFT_RESET,&data);
763        if (( data & SLV_SOFT_RESET_BIT) == 0)
764            break;
765        os_StalluSec(pWhalBus->hOs, SOFT_RESET_STALL_TIME);
766    }
767
768    WLAN_REPORT_INFORMATION(pWhalBus->hReport, HAL_HW_CTRL_MODULE_LOG,
769        ("whal_hwCtrl_Reset: SOFT_RESET Self clearing time = %d (%d)\n", SelfClearTime, SOFT_RESET_MAX_TIME));
770    if (SelfClearTime >= SOFT_RESET_MAX_TIME)
771    {
772        WLAN_REPORT_FATAL_ERROR(pWhalBus->hReport, HAL_HW_CTRL_MODULE_LOG,
773            ("whal_hwCtrl_Reset: ACX_REG_SLV_SOFT_RESET - Self clearing timer expired !!!\n"));
774        return NOK;
775    }
776
777    /***************************************************************/
778    /* SOFT RESET is done here - its a temporary fix */
779    /***************************************************************/
780
781    /* Disable Rx/Tx */
782    TNETWIF_WriteRegSync(pWhalBus->hTNETWIF, ENABLE, 0x0);      /* disable TX,RX */
783
784    /* Auto Calibration on start Disable */
785    TNETWIF_WriteRegSync(pWhalBus->hTNETWIF, SPARE_A2, (UINT32)0xFFFF);
786
787#else /* TNETW1251 */
788    UINT32 SelfClearTime;
789
790    /*
791     * Halt the Acx Cpu
792     */
793    TNETWIF_RegIsBitSet(pWhalBus->hTNETWIF,  ACX_REG_ECPU_CONTROL, ECPU_CONTROL_HALT);
794
795    /*
796     * Reset the ACX cpu
797     */
798    TNETWIF_RegIsBitSet(pWhalBus->hTNETWIF,  ACX_REG_SLV_SOFT_RESET, SLV_SOFT_RESET_BIT);
799
800    /*
801     * Wait for Soft reset (Self clearing only in 1150)
802     */
803#if defined(TNETW1150)
804    /* SOFT_RESET - Self clearing only on 1150 */
805    for (SelfClearTime=0; SelfClearTime<SOFT_RESET_MAX_TIME; SelfClearTime+=SOFT_RESET_STALL_TIME)
806    {
807        os_StalluSec(pWhalBus->hOs, SOFT_RESET_STALL_TIME);
808
809        if (((TNETWIF_ReadRegSync(pWhalBus->hTNETWIF,ACX_REG_SLV_SOFT_RESET,&data)) & SLV_SOFT_RESET_BIT) == 0)
810            break;
811    }
812
813    WLAN_REPORT_INFORMATION(pWhalBus->hReport, HAL_HW_CTRL_MODULE_LOG,
814        ("whal_hwCtrl_Reset: SOFT_RESET Self clearing time = %d (%d)\n", SelfClearTime, SOFT_RESET_MAX_TIME));
815    if (SelfClearTime >= SOFT_RESET_MAX_TIME)
816    {
817        WLAN_REPORT_FATAL_ERROR(pWhalBus->hReport, HAL_HW_CTRL_MODULE_LOG,
818            ("whal_hwCtrl_Reset: ACX_REG_SLV_SOFT_RESET - Self clearing timer expired !!!\n"));
819        return NOK;
820    }
821#else
822    os_StalluSec(pWhalBus->hOs, 10000);
823    TNETWIF_RegResetBitVal(pWhalBus->hTNETWIF,  ACX_REG_SLV_SOFT_RESET, SLV_SOFT_RESET_BIT);
824#endif
825
826    /*
827     * Start Acx Eeprom
828     */
829    TNETWIF_RegIsBitSet(pWhalBus->hTNETWIF,  ACX_REG_EE_START, START_EEPROM_MGR);
830
831    /* Do Not Reduce the StallSec time !!!!! */
832    os_StalluSec(pWhalBus->hOs, 40000);
833
834#endif /* TNETW1251 */
835
836#endif /* USE_SYNC_API*/
837
838    return OK;
839}
840
841#endif /* USE_SYNC_API */
842
843
844/****************************************************************************
845 *                      whal_hwCtrl_Reset()
846 ****************************************************************************
847 * DESCRIPTION: Reset hardware state machine
848 *
849 * INPUTS:  None
850 *
851 * OUTPUT:  None
852 *
853 * RETURNS: OK or NOK
854 ****************************************************************************/
855static TI_STATUS whal_FwCtrl_ResetSm (TI_HANDLE hWhalBus, UINT8 module_id, TI_STATUS status)
856{
857    whalBus_T *pWhalBus = (whalBus_T *)hWhalBus;
858
859    /***************************************************************/
860    /* SOFT RESET is done here - its a temporary fix               */
861    /***************************************************************/
862
863    EXCEPT (pWhalBus, status);
864
865    switch (pWhalBus->uResetStage)
866    {
867    case 0:
868        /*
869         * Perform soft reset
870         */
871        pWhalBus->uResetStage ++;
872        status = TNETWIF_WriteRegOpt (pWhalBus->hTNETWIF,
873                                      ACX_REG_SLV_SOFT_RESET,
874                                      SLV_SOFT_RESET_BIT,
875                                      module_id,
876                                      (TNETWIF_callback_t)whal_FwCtrl_ResetSm,
877                                      hWhalBus);
878        EXCEPT (pWhalBus, status);
879
880    case 1:
881        /* SOFT_RESET - self clearing */
882        while (pWhalBus->uSelfClearTime <  SOFT_RESET_MAX_TIME)
883        {
884            if (pWhalBus->uSelfClearTime != 0)
885            {
886                if ((pWhalBus->uBootData & SLV_SOFT_RESET_BIT) == 0)
887                    break;
888                os_StalluSec (pWhalBus->hOs, SOFT_RESET_STALL_TIME);
889            }
890
891            status = TNETWIF_ReadRegOpt (pWhalBus->hTNETWIF,
892                                         ACX_REG_SLV_SOFT_RESET,
893                                         &pWhalBus->uBootData,
894                                         module_id,
895                                         (TNETWIF_callback_t)whal_FwCtrl_ResetSm,
896                                         hWhalBus);
897
898            pWhalBus->uSelfClearTime += SOFT_RESET_STALL_TIME;
899
900            EXCEPT (pWhalBus, status);
901        }
902
903        pWhalBus->uResetStage ++;
904
905    case 2:
906        pWhalBus->uResetStage ++;
907
908        WLAN_REPORT_INFORMATION (pWhalBus->hReport, HAL_HW_CTRL_MODULE_LOG,
909                                 ("whal_hwCtrl_Reset: SOFT_RESET self clearing time = %d (%d)\n",
910                                 pWhalBus->uSelfClearTime, SOFT_RESET_MAX_TIME));
911        if (pWhalBus->uSelfClearTime >= SOFT_RESET_MAX_TIME)
912        {
913            WLAN_REPORT_FATAL_ERROR (pWhalBus->hReport, HAL_HW_CTRL_MODULE_LOG,
914                                     ("whal_hwCtrl_Reset: ACX_REG_SLV_SOFT_RESET - Self clearing timer expired !!!\n"));
915            EXCEPT (pWhalBus, TNETWIF_ERROR);
916        }
917
918    case 3:
919        pWhalBus->uResetStage ++;
920
921        /* Disable Rx/Tx */
922        status = TNETWIF_WriteRegOpt (pWhalBus->hTNETWIF,
923                                      ENABLE,
924                                      0x0,
925                                      module_id,
926                                      (TNETWIF_callback_t)whal_FwCtrl_ResetSm,
927                                      hWhalBus);
928        EXCEPT (pWhalBus, status);
929
930    case 4:
931        pWhalBus->uResetStage ++;
932
933        /* Disable auto calibration on start */
934        status = TNETWIF_WriteRegOpt (pWhalBus->hTNETWIF,
935                                      SPARE_A2,
936                                      0xFFFF,
937                                      module_id,
938                                      (TNETWIF_callback_t)whal_FwCtrl_ResetSm,
939                                      hWhalBus);
940        return status;
941
942    case 5:
943        pWhalBus->uResetStage = 0;
944
945        /* If the previous status was pending call the upper layer init state machine */
946        whal_FwCtrl_BootSm (hWhalBus, module_id, status);
947    }
948
949    return status;
950}
951
952
953/****************************************************************************
954 *                      whal_FwCtrl_Eepromless_StartBurst()
955 ****************************************************************************
956 * DESCRIPTION: prepare eepromless configuration before boot
957 *
958 * INPUTS:
959 *
960 * OUTPUT:
961 *
962 * RETURNS:
963 ****************************************************************************/
964static TI_STATUS whal_FwCtrl_EepromlessStartBurstSm (TI_HANDLE hWhalBus, UINT8 module_id, TI_STATUS status)
965{
966    whalBus_T* pWhalBus = (whalBus_T *)hWhalBus;
967
968    EXCEPT (pWhalBus, status);
969
970    while (TRUE)
971    {
972        switch (pWhalBus->uEEPROMStage)
973        {
974        case 0:
975            if ((pWhalBus->uEEPROMRegAddr = pWhalBus->pEEPROMCurPtr[1]) & 1)
976            {
977                pWhalBus->uEEPROMRegAddr &= 0xfe;
978                pWhalBus->uEEPROMRegAddr |= (UINT32)pWhalBus->pEEPROMCurPtr[2] << 8;
979                pWhalBus->uEEPROMBurstLen = pWhalBus->pEEPROMCurPtr[0];
980                pWhalBus->pEEPROMCurPtr += 3;
981                pWhalBus->uEEPROMBurstLoop = 0;
982                pWhalBus->uEEPROMStage = 1;
983            }
984            else
985            {
986                if (pWhalBus->pEEPROMCurPtr[0] == 0)
987                    pWhalBus->pEEPROMCurPtr += 7;
988                pWhalBus->uEEPROMCurLen -= pWhalBus->pEEPROMCurPtr - pWhalBus->pEEPROMBuf;
989                pWhalBus->uEEPROMCurLen = (pWhalBus->uEEPROMCurLen + NVS_DATA_BUNDARY_ALIGNMENT - 1) & 0xfffffffc;
990                pWhalBus->uEEPROMStage = 2;
991            }
992            continue;
993
994        case 1:
995            if (pWhalBus->uEEPROMBurstLoop < pWhalBus->uEEPROMBurstLen)
996            {
997                UINT32 val = (pWhalBus->pEEPROMCurPtr[0] |
998                              (pWhalBus->pEEPROMCurPtr[1] << 8) |
999                              (pWhalBus->pEEPROMCurPtr[2] << 16) |
1000                              (pWhalBus->pEEPROMCurPtr[3] << 24));
1001
1002                WLAN_REPORT_INIT (pWhalBus->hReport, HAL_HW_CTRL_MODULE_LOG,
1003                        ("NVS::BurstRead: *(%08x) = %x\n", pWhalBus->uEEPROMRegAddr, val));
1004
1005                status = TNETWIF_WriteRegOpt (pWhalBus->hTNETWIF,
1006                                              pWhalBus->uEEPROMRegAddr,
1007                                              val,
1008                                              module_id,
1009                                              (TNETWIF_callback_t)whal_FwCtrl_EepromlessStartBurstSm,
1010                                              hWhalBus);
1011
1012                pWhalBus->uEEPROMStatus = status;
1013                pWhalBus->uEEPROMRegAddr += 4;
1014                pWhalBus->pEEPROMCurPtr += 4;
1015                pWhalBus->uEEPROMStage = 1;
1016                pWhalBus->uEEPROMBurstLoop ++;
1017
1018                EXCEPT (pWhalBus, status);
1019            }
1020            else
1021                pWhalBus->uEEPROMStage = 0;
1022            continue;
1023
1024        case 2:
1025            WLAN_REPORT_INIT (pWhalBus->hReport, HAL_HW_CTRL_MODULE_LOG,
1026                    ("Get NVS file information: NvsDataLen = %#x TableAddr %#x\n", pWhalBus->uEEPROMCurLen, pWhalBus->uFwLastAddr));
1027            pWhalBus->uNVSStartAddr = pWhalBus->uFwLastAddr;
1028            pWhalBus->uNVSNumChar = 0;
1029            pWhalBus->uNVSNumByte = 0;
1030            pWhalBus->uNVSTempWord = 0;
1031            pWhalBus->uEEPROMStage = 3;
1032
1033          #if defined(HW_ACCESS_SDIO) || defined(HW_ACCESS_WSPI)
1034            status = TNETWIF_SetPartitionsOpt (pWhalBus->hTNETWIF,
1035                                               HW_ACCESS_DOWNLOAD,
1036                                               pWhalBus->uNVSStartAddr,
1037                                               module_id,
1038                                               (TNETWIF_callback_t)whal_FwCtrl_EepromlessStartBurstSm,
1039                                               hWhalBus);
1040            EXCEPT (pWhalBus, status);
1041          #endif
1042            continue;
1043
1044        case 3:
1045            /*
1046             * Download EEPROM data to ACX internal memory
1047             */
1048            if (pWhalBus->uNVSNumChar < pWhalBus->uEEPROMCurLen)
1049            {
1050                pWhalBus->uNVSTempWord |= (*pWhalBus->pEEPROMCurPtr) << (8 * pWhalBus->uNVSNumByte);
1051                pWhalBus->pEEPROMCurPtr ++;
1052                pWhalBus->uNVSNumChar ++;
1053
1054                if (++pWhalBus->uNVSNumByte > 3)
1055                {
1056                    pWhalBus->uEEPROMStage = 4;
1057                    pWhalBus->uNVSTempWord = ENDIAN_HANDLE_LONG (pWhalBus->uNVSTempWord);
1058                    WLAN_REPORT_INIT (pWhalBus->hReport, HAL_HW_CTRL_MODULE_LOG,
1059                                        ("NVS::WriteTable: *(%08x) = %x\n", pWhalBus->uNVSStartAddr, pWhalBus->uNVSTempWord));
1060                    status = TNETWIF_WriteMemOpt (pWhalBus->hTNETWIF,
1061                                                  pWhalBus->uNVSStartAddr,
1062                                                  PADWRITE (&pWhalBus->uNVSTempWord),
1063                                                  sizeof(pWhalBus->uNVSTempWord),
1064                                                  module_id,
1065                                                  (TNETWIF_callback_t)whal_FwCtrl_EepromlessStartBurstSm,
1066                                                  hWhalBus);
1067                    pWhalBus->uNVSStatus = status;
1068
1069                    EXCEPT (pWhalBus, status);
1070                }
1071            }
1072            else
1073            {
1074                /* Call the upper level state machine */
1075                if (pWhalBus->uEEPROMStatus == TNETWIF_PENDING ||
1076                    pWhalBus->uNVSStatus == TNETWIF_PENDING)
1077                    whal_FwCtrl_BootSm (hWhalBus, module_id, status);
1078
1079                return TNETWIF_COMPLETE;
1080            }
1081            continue;
1082
1083        case 4:
1084            pWhalBus->uNVSStartAddr += 4;
1085            pWhalBus->uNVSTempWord = 0;
1086            pWhalBus->uNVSNumByte = 0;
1087            pWhalBus->uEEPROMStage = 3;
1088            continue;
1089
1090        } /* End switch */
1091
1092    } /* End while */
1093
1094}
1095
1096
1097/****************************************************************************
1098 *                      whal_FwCtrl_InitSequenceSm()
1099 ****************************************************************************
1100 * DESCRIPTION: the restart wakeup sequence state machine
1101 *
1102 * INPUTS:  None
1103 *
1104 * OUTPUT:  None
1105 *
1106 * RETURNS: OK or NOK
1107 ****************************************************************************/
1108static TI_STATUS whal_FwCtrl_InitSequenceSm (TI_HANDLE hWhalBus, UINT8 module_id, TI_STATUS status)
1109{
1110    whalBus_T *pWhalBus = (whalBus_T *)hWhalBus;
1111
1112    static const UINT32 LUT [REF_FREQ_NUM][LUT_PARAM_NUM] =
1113    {   /* INTEGER_DIVIDER   FRACTIONAL_DIVIDER   ATTN_BB   ALPHA_BB   STOP_TIME_BB   BB_PLL_LOOP_FILTER */
1114        {   83,             87381,                  0xB,        5,          0xF00,      3}, /* REF_FREQ_19_2*/
1115        {   61,             141154,                 0xB,        5,          0x1450,     2}, /* REF_FREQ_26_0*/
1116        {   41,             174763,                 0xC,        6,          0x2D00,     1}, /* REF_FREQ_38_4*/
1117        {   40,             0,                      0xC,        6,          0x2EE0,     1}, /* REF_FREQ_40_0*/
1118        {   47,             162280,                 0xC,        6,          0x2760,     1}  /* REF_FREQ_33_6        */
1119    };
1120
1121    EXCEPT_I (pWhalBus, status);
1122
1123    switch (pWhalBus->uInitSeqStage)
1124    {
1125    case 0:
1126        pWhalBus->uInitSeqStage ++;
1127
1128        WLAN_REPORT_INIT(pWhalBus->hReport, HAL_CTRL_MODULE_LOG, ("Starting INIT sequence\n"));
1129
1130        /* Read NVS params */
1131        status = TNETWIF_ReadRegOpt (pWhalBus->hTNETWIF,
1132                                     SCR_PAD6,
1133                                     &pWhalBus->uScrPad6,
1134                                     module_id,
1135                                     (TNETWIF_callback_t)whal_FwCtrl_InitSequenceSm,
1136                                     hWhalBus);
1137        EXCEPT_I (pWhalBus, status);
1138
1139    case 1:
1140        pWhalBus->uInitSeqStage ++;
1141        /* Read ELP_CMD */
1142        status = TNETWIF_ReadRegOpt (pWhalBus->hTNETWIF,
1143                                     ELP_CMD,
1144                                     &pWhalBus->uElpCmd,
1145                                     module_id,
1146                                     (TNETWIF_callback_t)whal_FwCtrl_InitSequenceSm,
1147                                     hWhalBus);
1148        EXCEPT_I (pWhalBus, status);
1149
1150    case 2:
1151        pWhalBus->uInitSeqStage ++;
1152
1153        pWhalBus->uRefFreq = pWhalBus->uScrPad6 & 0x000000FF;
1154
1155        /******************** Set ELP configuration *********************/
1156
1157        /*
1158         * Set the BB Calibration time to be 300 usec (PLL_CAL_TIME)
1159         */
1160         status = TNETWIF_WriteRegOpt (pWhalBus->hTNETWIF,
1161                                       PLL_CAL_TIME/*0x5810*/,
1162                                       0x9/*0x4*/,
1163                                       module_id,
1164                                       (TNETWIF_callback_t)whal_FwCtrl_InitSequenceSm,
1165                                       hWhalBus);
1166        EXCEPT_I (pWhalBus, status);
1167
1168    case 3:
1169        pWhalBus->uInitSeqStage ++;
1170
1171        /* PG 1.1 & 1.0: Set the clock buffer time to be 760 usec (CLK_BUF_TIME) */
1172        if (pWhalBus->uChipId == CHIP_ID_1251_PG10 ||
1173            pWhalBus->uChipId == CHIP_ID_1251_PG11)
1174        {
1175			status = TNETWIF_WriteRegOpt (pWhalBus->hTNETWIF,
1176                                      CLK_BUF_TIME/*0x5818*/,
1177                                      0x19,
1178                                      module_id,
1179                                      (TNETWIF_callback_t)whal_FwCtrl_InitSequenceSm,
1180                                      hWhalBus);
1181		}
1182        /* PG 1.2: Set the clock buffer time to be 210 usec (CLK_BUF_TIME) */
1183		else
1184		{
1185			status = TNETWIF_WriteRegOpt (pWhalBus->hTNETWIF,
1186                                      CLK_BUF_TIME/*0x5818*/,
1187                                      0x6,
1188                                      module_id,
1189                                      (TNETWIF_callback_t)whal_FwCtrl_InitSequenceSm,
1190                                      hWhalBus);
1191		}
1192        EXCEPT_I (pWhalBus, status);
1193
1194    case 4:
1195        pWhalBus->uInitSeqStage ++;
1196
1197        /*
1198         * Set the clock detect feature to work in the restart wu procedure (ELP_CFG_MODE[14])
1199         * &
1200         * Select the clock source type (ELP_CFG_MODE[13:12] )
1201         */
1202        status = TNETWIF_WriteRegOpt (pWhalBus->hTNETWIF,
1203                                      ELP_CFG_MODE/*0x5804*/,
1204                                      ((pWhalBus->uScrPad6 & 0x0000FF00) << 4) | 0x00004000,
1205                                      module_id,
1206                                      (TNETWIF_callback_t)whal_FwCtrl_InitSequenceSm,
1207                                      hWhalBus);
1208        EXCEPT_I (pWhalBus, status);
1209
1210    case 5:
1211        pWhalBus->uInitSeqStage ++;
1212
1213        /* PG 1.1 & 1.0 */
1214        if (pWhalBus->uChipId == CHIP_ID_1251_PG10 ||
1215            pWhalBus->uChipId == CHIP_ID_1251_PG11)
1216        {
1217            /* Do nothing */
1218        }
1219
1220        /* PG 1.2: Enable the BB PLL fix. Enable the PLL_LIMP_CLK_EN_CMD */
1221        else
1222        {
1223			pWhalBus->uElpCmd |= 0x00000040;
1224
1225            status = TNETWIF_WriteRegOpt (pWhalBus->hTNETWIF,
1226                                          ELP_CMD/*0x5808*/,
1227                                          pWhalBus->uElpCmd,
1228                                          module_id,
1229                                          (TNETWIF_callback_t)whal_FwCtrl_InitSequenceSm,
1230                                          hWhalBus);
1231            EXCEPT_I (pWhalBus, status);
1232        }
1233
1234
1235    case 6:
1236        pWhalBus->uInitSeqStage ++;
1237
1238        /* PG 1.1 & 1.0: set the BB PLL stable time to be 30usec (PLL_STABLE_TIME) */
1239        if (pWhalBus->uChipId == CHIP_ID_1251_PG10 ||
1240            pWhalBus->uChipId == CHIP_ID_1251_PG11)
1241        {
1242            status = TNETWIF_WriteRegOpt (pWhalBus->hTNETWIF,
1243                                          CFG_PLL_SYNC_CNT/*0x5820*/,
1244                                          0x00,
1245                                          module_id,
1246                                          (TNETWIF_callback_t)whal_FwCtrl_InitSequenceSm,
1247                                          hWhalBus);
1248        }
1249
1250        /* PG 1.2: Set the BB PLL stable time to be 1000usec (PLL_STABLE_TIME) */
1251        else
1252        {
1253            status = TNETWIF_WriteRegOpt (pWhalBus->hTNETWIF,
1254                                          CFG_PLL_SYNC_CNT/*0x5820*/,
1255                                          0x20,
1256                                          module_id,
1257                                          (TNETWIF_callback_t)whal_FwCtrl_InitSequenceSm,
1258                                          hWhalBus);
1259        }
1260
1261        EXCEPT_I (pWhalBus, status);
1262
1263    case 7:
1264        pWhalBus->uInitSeqStage ++;
1265
1266        /* PG 1.1 & 1.0 */
1267        if (pWhalBus->uChipId == CHIP_ID_1251_PG10 ||
1268            pWhalBus->uChipId == CHIP_ID_1251_PG11)
1269        {
1270            /* Do nothing */
1271        }
1272
1273        /* PG 1.2: read clock request time */
1274        else
1275        {
1276            status = TNETWIF_ReadRegOpt (pWhalBus->hTNETWIF,
1277                                         CLK_REQ_TIME/*0x5814*/,
1278                                         &pWhalBus->uInitData,
1279                                         module_id,
1280                                         (TNETWIF_callback_t)whal_FwCtrl_InitSequenceSm,
1281                                         hWhalBus);
1282            EXCEPT_I (pWhalBus, status);
1283        }
1284
1285    case 8:
1286        pWhalBus->uInitSeqStage ++;
1287
1288        /* PG 1.1 & 1.0 */
1289        if (pWhalBus->uChipId == CHIP_ID_1251_PG10 ||
1290            pWhalBus->uChipId == CHIP_ID_1251_PG11)
1291        {
1292            /* Do nothing */
1293        }
1294
1295        /* PG 1.2: set the clock request time to be [ref_clk_settling_time-1mS] 4ms */
1296        else
1297        {
1298			WLAN_REPORT_INIT (pWhalBus->hReport, HAL_CTRL_MODULE_LOG,
1299				("CLK_REQ_TIME: read = 0x%x write = 0x%x\n",
1300				pWhalBus->uInitData,((pWhalBus->uInitData > 0x21) ? (pWhalBus->uInitData - 0x21) : 0 )));
1301
1302            status = TNETWIF_WriteRegOpt (pWhalBus->hTNETWIF,
1303                                          CLK_REQ_TIME/*0x5814*/,
1304                                          ((pWhalBus->uInitData > 0x21) ? (pWhalBus->uInitData - 0x21) : 0 ),
1305                                          module_id,
1306                                          (TNETWIF_callback_t)whal_FwCtrl_InitSequenceSm,
1307                                          hWhalBus);
1308            EXCEPT_I (pWhalBus, status);
1309        }
1310
1311    case 9:
1312        pWhalBus->uInitSeqStage ++;
1313
1314        /******************** Set BB PLL configurations in RF AFE *********************/
1315
1316        /*
1317         * Set RF_AFE_REG_3
1318         */
1319        status = TNETWIF_WriteRegOpt (pWhalBus->hTNETWIF,
1320                                      0x58CC,
1321                                      0x4B5,
1322                                      module_id,
1323                                      (TNETWIF_callback_t)whal_FwCtrl_InitSequenceSm,
1324                                      hWhalBus);
1325        EXCEPT_I (pWhalBus, status);
1326
1327    case 10:
1328        pWhalBus->uInitSeqStage ++;
1329
1330        /*
1331         * Set RF_AFE_REG_5
1332         */
1333        status = TNETWIF_WriteRegOpt (pWhalBus->hTNETWIF,
1334                                      0x58D4,
1335                                      0x50/*0x150*/,
1336                                      module_id,
1337                                      (TNETWIF_callback_t)whal_FwCtrl_InitSequenceSm,
1338                                      hWhalBus);
1339        EXCEPT_I (pWhalBus, status);
1340
1341    case 11:
1342        pWhalBus->uInitSeqStage ++;
1343
1344        /*
1345         * Set RF_AFE_CTRL_REG_2
1346         */
1347        status = TNETWIF_WriteRegOpt (pWhalBus->hTNETWIF,
1348                                      0x5948,
1349                                      0x11C001,
1350                                      module_id,
1351                                      (TNETWIF_callback_t)whal_FwCtrl_InitSequenceSm,
1352                                      hWhalBus);
1353        EXCEPT_I (pWhalBus, status);
1354
1355    case 12:
1356        pWhalBus->uInitSeqStage ++;
1357
1358        /*
1359         * Change RF PLL and BB PLL divider for VCO clock  and adjust VCO bais current(RF_AFE_REG_13)
1360         */
1361        status = TNETWIF_WriteRegOpt (pWhalBus->hTNETWIF,
1362                                      0x58F4,
1363                                      0x1E,
1364                                      module_id,
1365                                      (TNETWIF_callback_t)whal_FwCtrl_InitSequenceSm,
1366                                      hWhalBus);
1367        EXCEPT_I (pWhalBus, status);
1368
1369    case 13:
1370        pWhalBus->uInitSeqStage ++;
1371
1372        /******************** Set BB PLL configurations *********************/
1373
1374        /*
1375         * Set integer divider according to Appendix C-BB PLL Calculations.
1376         * &
1377         * Set dither scale to 0.
1378         * &
1379         * Enable complex zero
1380         * &
1381         * Set the location of complex zero
1382         * &
1383         * Set the order of the sigma delta to 2nd order
1384         * &
1385         *Disable the async load
1386         */
1387        status = TNETWIF_WriteRegOpt (pWhalBus->hTNETWIF,
1388                                      0x5840,
1389                                      LUT[pWhalBus->uRefFreq][LUT_PARAM_INTEGER_DIVIDER] | 0x00017000,
1390                                      module_id,
1391                                      (TNETWIF_callback_t)whal_FwCtrl_InitSequenceSm,
1392                                      hWhalBus);
1393        EXCEPT_I (pWhalBus, status);
1394
1395    case 14:
1396        pWhalBus->uInitSeqStage ++;
1397
1398        /*
1399         * Set fractional divider according to Appendix C-BB PLL Calculations
1400         */
1401        status = TNETWIF_WriteRegOpt (pWhalBus->hTNETWIF,
1402                                      0x5844,
1403                                      LUT[pWhalBus->uRefFreq][LUT_PARAM_FRACTIONAL_DIVIDER],
1404                                      module_id,
1405                                      (TNETWIF_callback_t)whal_FwCtrl_InitSequenceSm,
1406                                      hWhalBus);
1407        EXCEPT_I (pWhalBus, status);
1408
1409    case 15:
1410        pWhalBus->uInitSeqStage ++;
1411
1412        /*
1413         * Set the initial data for the sigma delta
1414         */
1415        status = TNETWIF_WriteRegOpt (pWhalBus->hTNETWIF,
1416                                      0x5848,
1417                                      0x3039,
1418                                      module_id,
1419                                      (TNETWIF_callback_t)whal_FwCtrl_InitSequenceSm,
1420                                      hWhalBus);
1421        EXCEPT_I (pWhalBus, status);
1422
1423    case 16:
1424        pWhalBus->uInitSeqStage ++;
1425
1426        /*
1427         * Set the accumulator attenuation value
1428         * &
1429         * Set calibration loop1 (alpha)
1430         * &
1431         * Set calibration loop2 (beta)
1432         * &
1433         * Set calibration loop3 (gamma)
1434         * &
1435         * Set the VCO gain
1436         */
1437        status = TNETWIF_WriteRegOpt (pWhalBus->hTNETWIF,
1438                                      0x5854,
1439                                      (LUT[pWhalBus->uRefFreq][LUT_PARAM_ATTN_BB] << 16) | (LUT[pWhalBus->uRefFreq][LUT_PARAM_ALPHA_BB] << 12) | 0x1,
1440                                      module_id,
1441                                      (TNETWIF_callback_t)whal_FwCtrl_InitSequenceSm,
1442                                      hWhalBus);
1443        EXCEPT_I (pWhalBus, status);
1444
1445    case 17:
1446        pWhalBus->uInitSeqStage ++;
1447
1448        /*
1449         * Set the calibration stop time after holdoff time expires
1450         * &
1451         * Set settling time HOLD_OFF_TIME_BB
1452         */
1453        status = TNETWIF_WriteRegOpt (pWhalBus->hTNETWIF,
1454                                      0x5858,
1455                                      LUT[pWhalBus->uRefFreq][LUT_PARAM_STOP_TIME_BB] | 0x000A0000,
1456                                      module_id,
1457                                      (TNETWIF_callback_t)whal_FwCtrl_InitSequenceSm,
1458                                      hWhalBus);
1459        EXCEPT_I (pWhalBus, status);
1460
1461    case 18:
1462        pWhalBus->uInitSeqStage ++;
1463
1464        /*
1465         * Set BB PLL Loop filter capacitor3- BB_C3[2:0]
1466         * &
1467         * Set BB PLL constant leakage current to linearize PFD to 0uA- BB_ILOOPF[7:3]
1468         */
1469        status = TNETWIF_WriteRegOpt (pWhalBus->hTNETWIF,
1470                                      0x58F8,
1471                                      LUT[pWhalBus->uRefFreq][LUT_PARAM_BB_PLL_LOOP_FILTER] | 0x00000030,
1472                                      module_id,
1473                                      (TNETWIF_callback_t)whal_FwCtrl_InitSequenceSm,
1474                                      hWhalBus);
1475        EXCEPT_I (pWhalBus, status);
1476
1477    case 19:
1478        pWhalBus->uInitSeqStage ++;
1479
1480        /*
1481         * Set regulator output voltage for n divider to 1.35- BB_REFDIV[1:0]
1482         * &
1483         * Set Charge pump current- BB_CPGAIN[4:2]
1484         * &
1485         * Set BB PLL Loop filter capacitor2- BB_C2[7:5]
1486         * &
1487         * Set gain of BB PLL auto-call to normal mode- BB_CALGAIN_3DB[8]
1488         */
1489        status = TNETWIF_WriteRegOpt (pWhalBus->hTNETWIF,
1490                                      0x58F0,
1491                                      0x29,
1492                                      module_id,
1493                                      (TNETWIF_callback_t)whal_FwCtrl_InitSequenceSm,
1494                                      hWhalBus);
1495        EXCEPT_I (pWhalBus, status);
1496
1497    case 20:
1498        pWhalBus->uInitSeqStage ++;
1499
1500        /******************** Enable restart sequence *********************/
1501
1502        /*
1503         * Enable restart wakeup sequence (ELP_CMD[0])
1504         */
1505        status = TNETWIF_WriteRegOpt (pWhalBus->hTNETWIF,
1506                                      ELP_CMD/*0x5808*/,
1507                                      pWhalBus->uElpCmd | 0x1,
1508                                      module_id,
1509                                      (TNETWIF_callback_t)whal_FwCtrl_InitSequenceSm,
1510                                      hWhalBus);
1511        EXCEPT_I (pWhalBus, status);
1512
1513    case 21:
1514        pWhalBus->uInitSeqStage = 0;
1515
1516        os_StalluSec (pWhalBus->hOs, 2000);
1517
1518        WLAN_REPORT_INIT (pWhalBus->hReport, HAL_CTRL_MODULE_LOG, ("End INIT sequence\n"));
1519
1520        /* Call upper layer state machine */
1521        if (pWhalBus->uInitSeqStatus == TNETWIF_PENDING)
1522            whal_FwCtrl_BootSm (hWhalBus, module_id, OK);
1523
1524    } /* End switch */
1525
1526    return TNETWIF_COMPLETE;
1527}
1528
1529
1530/****************************************************************************
1531 *                      whal_FwCtrl_LoadFwImageSm()
1532 ****************************************************************************
1533 * DESCRIPTION: Load image from the host and download into the hardware
1534 *
1535 * INPUTS:  None
1536 *
1537 * OUTPUT:  None
1538 *
1539 * RETURNS: OK or NOK
1540 ****************************************************************************/
1541
1542#define ADDR_OFFS HW_ACCESS_DOWN_PART0_ADDR
1543
1544
1545static TI_STATUS whal_FwCtrl_LoadFwImageSm (TI_HANDLE hWhalBus, UINT8 module_id, TI_STATUS status)
1546{
1547    whalBus_T *pWhalBus = (whalBus_T *)hWhalBus;
1548
1549    EXCEPT_L (pWhalBus, status);
1550
1551    while (TRUE)
1552    {
1553        switch (pWhalBus->uLoadStage)
1554        {
1555        case 0:
1556            pWhalBus->uLoadStage = 1;
1557            /*
1558             * Extract and calculate a length of the firmware image
1559             * Needed to avoid DWORD alignment issues
1560             * Get the data length of the firmware image
1561             */
1562            pWhalBus->uFwDataLen = (pWhalBus->pFwBuf[4] << 24) |
1563                                   (pWhalBus->pFwBuf[5] << 16) |
1564                                   (pWhalBus->pFwBuf[6] << 8 ) |
1565                                   (pWhalBus->pFwBuf[7]);
1566
1567            /* Check the data length */
1568            if ((pWhalBus->uFwDataLen % 4) != 0)
1569            {
1570                WLAN_REPORT_ERROR (pWhalBus->hReport, HAL_HW_CTRL_MODULE_LOG, ("FW image length\n"));
1571
1572            }
1573
1574          #if defined(HW_ACCESS_SDIO) || defined(HW_ACCESS_WSPI)
1575            status = TNETWIF_SetPartitionsOpt (pWhalBus->hTNETWIF,
1576                                               HW_ACCESS_DOWNLOAD,
1577                                               ADDR_OFFS,
1578                                               module_id,
1579                                               (TNETWIF_callback_t)whal_FwCtrl_LoadFwImageSm,
1580                                               hWhalBus);
1581            EXCEPT_L (pWhalBus, status);
1582          #endif
1583            continue;
1584
1585        case 1:
1586            pWhalBus->uLoadStage = 2;
1587
1588            WLAN_REPORT_INIT (pWhalBus->hReport, HAL_CTRL_MODULE_LOG,
1589                              ("Image addr=0x%x, Len=0x%x\n",
1590                              pWhalBus->pFwBuf, pWhalBus->uFwLastAddr));
1591
1592            pWhalBus->uChunkNum = 0;
1593            pWhalBus->uPartitionLimit = HW_ACCESS_DOWN_PART0_SIZE;
1594
1595            WLAN_REPORT_INIT (pWhalBus->hReport, HAL_CTRL_MODULE_LOG, ("DOWNLOADING !!!\n"));
1596            continue;
1597
1598        case 2:
1599
1600            /* Retrieve the data that was saved for the last chunk */
1601          #ifdef USE_NO_CHUNK_COPY
1602            if (pWhalBus->uChunkNum > 0)
1603                os_memoryCopy (pWhalBus->hOs,
1604                               (void *)(pWhalBus->pFwBuf + FW_HDR_SIZE + (pWhalBus->uChunkNum - 1) * CHUNK_SIZE - TNETWIF_WRITE_OFFSET_BYTES),
1605                               (void *)pWhalBus->auFwTmpBuf,
1606                               TNETWIF_WRITE_OFFSET_BYTES);
1607          #endif
1608
1609            /* Load firmware by chunks */
1610            if (pWhalBus->uChunkNum < pWhalBus->uFwDataLen / CHUNK_SIZE)
1611            {
1612                pWhalBus->uLoadStage = 3;
1613
1614              #if defined(HW_ACCESS_SDIO) || defined(HW_ACCESS_WSPI)
1615                /* Change partition */
1616                if (ADDR_OFFS + (pWhalBus->uChunkNum + 2) * CHUNK_SIZE > pWhalBus->uPartitionLimit)
1617                {
1618                    pWhalBus->uPartitionLimit = (ADDR_OFFS + pWhalBus->uChunkNum * CHUNK_SIZE) + HW_ACCESS_DOWN_PART0_SIZE;
1619                    status = TNETWIF_SetPartitionsOpt (pWhalBus->hTNETWIF,
1620                                                       HW_ACCESS_DOWNLOAD,
1621                                                       ADDR_OFFS + pWhalBus->uChunkNum * CHUNK_SIZE,
1622                                                       module_id,
1623                                                       (TNETWIF_callback_t)whal_FwCtrl_LoadFwImageSm,
1624                                                       hWhalBus);
1625                    EXCEPT_L (pWhalBus, status);
1626
1627                    WLAN_REPORT_INIT (pWhalBus->hReport, HAL_CTRL_MODULE_LOG,
1628                                      ("Change partition ADDR_OFFS = 0x%x\n",
1629                                      ADDR_OFFS + pWhalBus->uChunkNum * CHUNK_SIZE));
1630                }
1631              #endif
1632            }
1633            else
1634                pWhalBus->uLoadStage = 4;
1635            continue;
1636
1637        case 3:
1638            pWhalBus->uLoadStage = 2;
1639
1640            /* Write the data chunk of 512 bytes */
1641
1642          #ifdef USE_NO_CHUNK_COPY
1643            /*
1644             * Save the chunk trailer bytes in the temporary buffer.
1645             * The trailer space is used by the WSPI driver
1646             */
1647            os_memoryCopy (pWhalBus->hOs,
1648                           (void *)pWhalBus->auFwTmpBuf,
1649                           (void *)(pWhalBus->pFwBuf + FW_HDR_SIZE + pWhalBus->uChunkNum * CHUNK_SIZE - TNETWIF_WRITE_OFFSET_BYTES),
1650                           TNETWIF_WRITE_OFFSET_BYTES);
1651          #else
1652            /* Copy image chunk to temporary buffer */
1653            os_memoryCopy (pWhalBus->hOs,
1654                           (void *)&pWhalBus->auFwTmpBuf[TNETWIF_WRITE_OFFSET_BYTES],
1655                           (void *)(pWhalBus->pFwBuf + FW_HDR_SIZE + pWhalBus->uChunkNum * CHUNK_SIZE),
1656                           CHUNK_SIZE);
1657          #endif
1658
1659            /* Load the chunk. Save TNETWIF_WRITE_OFFSET_BYTES space for WSPI bus command */
1660            status = TNETWIF_WriteMemOpt (pWhalBus->hTNETWIF,
1661                                          ADDR_OFFS + pWhalBus->uChunkNum * CHUNK_SIZE,
1662                                        #ifdef USE_NO_CHUNK_COPY
1663                                          pWhalBus->pFwBuf + FW_HDR_SIZE + pWhalBus->uChunkNum * CHUNK_SIZE - TNETWIF_WRITE_OFFSET_BYTES,
1664                                        #else
1665                                          pWhalBus->auFwTmpBuf,
1666                                        #endif
1667                                          CHUNK_SIZE,
1668                                          module_id,
1669                                          (TNETWIF_callback_t)whal_FwCtrl_LoadFwImageSm,
1670                                          hWhalBus);
1671
1672            /* Increment chunk number */
1673            pWhalBus->uChunkNum ++;
1674
1675            /* Log ERROR if the TNETWIF_WriteMemOpt returned ERROR */
1676            if (status == TNETWIF_ERROR)
1677            {
1678                WLAN_REPORT_ERROR (pWhalBus->hReport, HAL_HW_CTRL_MODULE_LOG,
1679                                   ("TNETWIF_WriteMemOpt retruned status=0x%x\n", status));
1680            }
1681
1682            EXCEPT_L (pWhalBus, status);
1683            continue;
1684
1685        case 4:
1686            pWhalBus->uLoadStage = 5;
1687
1688          #ifdef USE_NO_CHUNK_COPY
1689            /*
1690             * Save the chunk trailer bytes in the temporary buffer.
1691             * The trailer space is used by the WSPI driver
1692             */
1693            os_memoryCopy (pWhalBus->hOs,
1694                           (void *)pWhalBus->auFwTmpBuf,
1695                           (void *)(pWhalBus->pFwBuf + FW_HDR_SIZE + pWhalBus->uChunkNum * CHUNK_SIZE - TNETWIF_WRITE_OFFSET_BYTES),
1696                           TNETWIF_WRITE_OFFSET_BYTES);
1697          #else
1698            /* Copy the last image chunk */
1699            os_memoryCopy (pWhalBus->hOs,
1700                           (void *)&pWhalBus->auFwTmpBuf[TNETWIF_WRITE_OFFSET_BYTES],
1701                           (void *)(pWhalBus->pFwBuf + FW_HDR_SIZE + pWhalBus->uChunkNum * CHUNK_SIZE),
1702                           pWhalBus->uFwDataLen % CHUNK_SIZE);
1703          #endif
1704
1705            /* Load the last chunk */
1706            status = TNETWIF_WriteMemOpt (pWhalBus->hTNETWIF,
1707                                          ADDR_OFFS + pWhalBus->uChunkNum * CHUNK_SIZE,
1708                                        #ifdef USE_NO_CHUNK_COPY
1709                                          pWhalBus->pFwBuf + FW_HDR_SIZE + pWhalBus->uChunkNum * CHUNK_SIZE - TNETWIF_WRITE_OFFSET_BYTES,
1710                                        #else
1711                                          pWhalBus->auFwTmpBuf,
1712                                        #endif
1713                                          pWhalBus->uFwDataLen % CHUNK_SIZE,
1714                                          module_id,
1715                                          (TNETWIF_callback_t)whal_FwCtrl_LoadFwImageSm,
1716                                          hWhalBus);
1717
1718            EXCEPT_L (pWhalBus, status);
1719            continue;
1720
1721        case 5:
1722            pWhalBus->uLoadStage = 0;
1723
1724            /* The download has completed */
1725            WLAN_OS_REPORT (("Finished downloading firmware.\n"));
1726
1727          #ifdef USE_NO_CHUNK_COPY
1728            /* Retrieve the data that was saved for the last chunk */
1729            os_memoryCopy (pWhalBus->hOs,
1730                           (void *)(pWhalBus->pFwBuf + FW_HDR_SIZE + pWhalBus->uChunkNum * CHUNK_SIZE - TNETWIF_WRITE_OFFSET_BYTES),
1731                           (void *)pWhalBus->auFwTmpBuf,
1732                           TNETWIF_WRITE_OFFSET_BYTES);
1733          #endif
1734
1735            /* Finalize download (run firmware) */
1736            pWhalBus->uFinStage = 0;
1737            status = whal_FwCtrl_FinalizeDownloadSm (hWhalBus, module_id, OK);
1738
1739            return status;
1740
1741        } /* End switch */
1742
1743    } /* End while */
1744
1745}
1746
1747
1748UINT32 whalBus_FwCtrl_GetRadioStandByState(TI_HANDLE hWhalBus)
1749{
1750  #ifdef USE_SYNC_API
1751    whalBus_T *pWhalBus = (whalBus_T *)hWhalBus;
1752    UINT32     data;
1753
1754    return TNETWIF_ReadRegSync (pWhalBus->hTNETWIF,GPIO_IN,&data);
1755
1756  #else
1757
1758    return 0;
1759
1760  #endif
1761}
1762
1763
1764int whalBus_FwCtrl_Reset(TI_HANDLE hWhalBus)
1765{
1766  #ifdef USE_SYNC_API
1767
1768    return whal_FwCtrl_Reset (hWhalBus);
1769
1770  #else
1771
1772    return OK;
1773
1774  #endif
1775}
1776
1777
1778int whalBus_FwCtrl_isCardIn(TI_HANDLE hWhalBus)
1779{
1780  #ifdef USE_SYNC_API
1781
1782    /*
1783    UINT32 ChipId;
1784    whalBus_T *pWhalBus = (whalBus_T *)hWhalBus;
1785    TNETWIF_ReadRegSync(pWhalBus->hTNETWIF,CHIP_ID,&ChipId)
1786    ChipId = CHIP_ID_1X50;
1787    */
1788
1789  #endif
1790
1791    return TRUE;
1792}
1793
1794void whalBus_FwCtrl_Halt(TI_HANDLE hWhalBus)
1795{
1796  #ifdef USE_SYNC_API
1797    whalBus_T *pWhalBus = (whalBus_T *)hWhalBus;
1798
1799    /* Halt the firmware */
1800    TNETWIF_RegIsBitSet(pWhalBus->hTNETWIF, ACX_REG_ECPU_CONTROL, ECPU_CONTROL_HALT);
1801  #endif
1802}
1803