Esempio n. 1
0
/*----------------------------------------------------------------------------*/
VOID nicpmSetFWOwn(IN P_ADAPTER_T prAdapter, IN BOOLEAN fgEnableGlobalInt)
{
	UINT_32 u4RegValue;

	ASSERT(prAdapter);

	if (prAdapter->fgIsFwOwn == TRUE) {
		return;
	} else {
		if (nicProcessIST(prAdapter) != WLAN_STATUS_NOT_INDICATING) {
/* pending interrupts */
			return;
		}
	}

	if (fgEnableGlobalInt) {
		prAdapter->fgIsIntEnableWithLPOwnSet = TRUE;
	} else {
		HAL_MCR_WR(prAdapter, MCR_WHLPCR, WHLPCR_FW_OWN_REQ_SET);

		HAL_MCR_RD(prAdapter, MCR_WHLPCR, &u4RegValue);
		if (u4RegValue & WHLPCR_FW_OWN_REQ_SET) {
/* if set firmware own not successful (possibly pending interrupts), */
/* indicate an own clear event */
			HAL_MCR_WR(prAdapter, MCR_WHLPCR,
				   WHLPCR_FW_OWN_REQ_CLR);

			return;
		}

		prAdapter->fgIsFwOwn = TRUE;
	}
}
Esempio n. 2
0
/*----------------------------------------------------------------------------*/
VOID
halBBInit (
    IN P_ADAPTER_T       prAdapter
    )
{
    UINT_16              u2Idx = 0;
    TABLE_ENTRY_T        rBBInitTable = arBBInitTableByRF[halGetRFType(prAdapter)];
    UINT_16              u2Size = rBBInitTable.u2Size;
    P_REG_ENTRY_T        parBBInitTable = rBBInitTable.pu4TablePtr;

    DEBUGFUNC("halBBInit");

    ASSERT(prAdapter);
    
    if (halGetRFType(prAdapter) == RF_TYPE_AL2236) {
        HAL_MCR_WR(prAdapter, MCR_IOPCR, IO_SET_TRAP_PIN_DEFAULT_ATTR | IO_SET_DBG_PORT_SEL);
        HAL_MCR_WR(prAdapter, 0x130, 0x001e);
        HAL_MCR_WR(prAdapter, MCR_RSCR, 0x11421222);
    }

    for(u2Idx = 0; u2Idx < u2Size; u2Idx++) {
        DBGLOG(INIT, TRACE, ("Set %#08lx = %#08lx\n", parBBInitTable[u2Idx].u4Offset, parBBInitTable[u2Idx].u4Value));
        HAL_BBCR_WR(prAdapter, parBBInitTable[u2Idx].u4Offset, parBBInitTable[u2Idx].u4Value);
    }

    //4 2007/07/04, mikewu, we just give it a default value
    halBBSetTxBackOff(prAdapter, prAdapter->rEEPROMCtrl.u4RegulationDomain);

    //4 2007/07/04, mikewu, now we use the value in the default config
    halBBSetDACOffset(prAdapter,
        prAdapter->rEEPROMCtrl.ucID,
        prAdapter->rEEPROMCtrl.ucQD);


}
Esempio n. 3
0
/*----------------------------------------------------------------------------*/
BOOLEAN
nicpmSetDriverOwn (
    IN P_ADAPTER_T prAdapter
    )
{
#define LP_OWN_BACK_TOTAL_DELAY_MS      8192    //exponential of 2
#define LP_OWN_BACK_LOOP_DELAY_MS       1       //exponential of 2
#define LP_OWN_BACK_CLR_OWN_ITERATION   256     //exponential of 2

    BOOLEAN fgStatus = TRUE;
    UINT32 i, u4CurrTick;
    UINT_32 u4RegValue = 0;

    ASSERT(prAdapter);

    if(prAdapter->fgIsFwOwn == FALSE)
        return fgStatus;

    u4CurrTick = kalGetTimeTick();
    i = 0;

    while(1) {
        HAL_MCR_RD(prAdapter, MCR_WHLPCR, &u4RegValue);

        if (u4RegValue & WHLPCR_FW_OWN_REQ_SET) {
            prAdapter->fgIsFwOwn = FALSE;
            break;
        }
        else if(kalIsCardRemoved(prAdapter->prGlueInfo) == TRUE
                || fgIsBusAccessFailed == TRUE
                || (kalGetTimeTick() - u4CurrTick) > LP_OWN_BACK_TOTAL_DELAY_MS
		|| fgIsResetting == TRUE) {
            //ERRORLOG(("LP cannot be own back (for %ld ms)", kalGetTimeTick() - u4CurrTick));
            fgStatus = FALSE;
            if (fgIsResetting != TRUE)
            {
                static unsigned int owncnt = 0;
                HAL_MCR_RD(prAdapter, MCR_D2HRM2R, &u4RegValue);
                printk("<WiFi> MCR_D2HRM2R = 0x%x\n", (UINT32)u4RegValue);
                printk("<WiFi> Fatal error! Driver own fail!!!!!!!!!!!! %d\n", owncnt++);
            }
            break;
        }
        else {
            if((i & (LP_OWN_BACK_CLR_OWN_ITERATION - 1)) == 0) {
                /* Software get LP ownership - per 256 iterations */
                HAL_MCR_WR(prAdapter, MCR_WHLPCR, WHLPCR_FW_OWN_REQ_CLR);
            }

            /* Delay for LP engine to complete its operation. */
            kalMsleep(LP_OWN_BACK_LOOP_DELAY_MS);
            i++;
        }
    }

    return fgStatus;
}
Esempio n. 4
0
/*----------------------------------------------------------------------------*/
BOOLEAN
nicpmSetDriverOwn (
    IN P_ADAPTER_T prAdapter
    )
{
#define LP_OWN_BACK_TOTAL_DELAY_MS      2048    //exponential of 2
#define LP_OWN_BACK_LOOP_DELAY_MS       1       //exponential of 2
#define LP_OWN_BACK_CLR_OWN_ITERATION   256     //exponential of 2

    BOOLEAN fgStatus = TRUE;
    UINT_32 i, u4CurrTick, u4RegValue = 0;
    BOOLEAN fgTimeout;

    ASSERT(prAdapter);

    if(prAdapter->fgIsFwOwn == FALSE)
        return fgStatus;

    DBGLOG(INIT, INFO, ("DRIVER OWN\n"));

    u4CurrTick = kalGetTimeTick();
    i = 0;
    while(1) {
        HAL_MCR_RD(prAdapter, MCR_WHLPCR, &u4RegValue);

        fgTimeout = ((kalGetTimeTick() - u4CurrTick) > LP_OWN_BACK_TOTAL_DELAY_MS)? TRUE:FALSE;

        if (u4RegValue & WHLPCR_FW_OWN_REQ_SET) {
            prAdapter->fgIsFwOwn = FALSE;
            break;
        }
        else if(kalIsCardRemoved(prAdapter->prGlueInfo) || fgIsBusAccessFailed || fgTimeout || wlanIsChipNoAck(prAdapter)) {
            DBGLOG(INIT, ERROR, ("LP cannot be own back, Timeout[%u](%ums), BusAccessError[%u], Reseting[%u], CardRemoved[%u] NoAck[%u]\n",
                fgTimeout,
                kalGetTimeTick() - u4CurrTick,
                fgIsBusAccessFailed,
                kalIsResetting(),
                kalIsCardRemoved(prAdapter->prGlueInfo),
                wlanIsChipNoAck(prAdapter)));
            fgStatus = FALSE;
            break;
        }
        else {
            if((i & (LP_OWN_BACK_CLR_OWN_ITERATION - 1)) == 0) {
                /* Software get LP ownership - per 256 iterations */
                HAL_MCR_WR(prAdapter, MCR_WHLPCR, WHLPCR_FW_OWN_REQ_CLR);
            }

            /* Delay for LP engine to complete its operation. */
            kalMsleep(LP_OWN_BACK_LOOP_DELAY_MS);
            i++;
        }
    }

    return fgStatus;
}
VOID nicPmTriggerDriverOwn(IN P_ADAPTER_T prAdapter)
{
	UINT_32 u4RegValue = 0;
	
	HAL_MCR_RD(prAdapter, MCR_WHLPCR, &u4RegValue);

	if (u4RegValue & WHLPCR_FW_OWN_REQ_SET) {
		prAdapter->fgIsFwOwn = FALSE;
	}
	else {
		HAL_MCR_WR(prAdapter, MCR_WHLPCR, WHLPCR_FW_OWN_REQ_CLR);
	}
}
Esempio n. 6
0
/*----------------------------------------------------------------------------*/
VOID
halMCRChipInit (
    IN P_ADAPTER_T       prAdapter
)
{
    UINT_16 u2Idx = 0;
    UINT_16 u2Size = sizeof(arMACInitValue)/sizeof(REG_ENTRY_T);

    ASSERT(prAdapter);

    for (u2Idx = 0; u2Idx < u2Size; u2Idx++) {
        HAL_MCR_WR(prAdapter, arMACInitValue[u2Idx].u4Offset, arMACInitValue[u2Idx].u4Value);
    }
}
Esempio n. 7
0
/*----------------------------------------------------------------------------*/
BOOLEAN nicpmSetDriverOwn(IN P_ADAPTER_T prAdapter)
{
#define LP_OWN_BACK_TOTAL_DELAY_MS      8192	/* exponential of 2 */
#define LP_OWN_BACK_LOOP_DELAY_MS       1	/* exponential of 2 */
#define LP_OWN_BACK_CLR_OWN_ITERATION   256	/* exponential of 2 */

	BOOLEAN fgStatus = TRUE;
	UINT_32 i, u4CurrTick, u4RegValue = 0;

	ASSERT(prAdapter);

	if (prAdapter->fgIsFwOwn == FALSE)
		return fgStatus;

	u4CurrTick = kalGetTimeTick();
	i = 0;
	while (1) {
		HAL_MCR_RD(prAdapter, MCR_WHLPCR, &u4RegValue);

		if (u4RegValue & WHLPCR_FW_OWN_REQ_SET) {
			prAdapter->fgIsFwOwn = FALSE;
			break;
		} else if (kalIsCardRemoved(prAdapter->prGlueInfo) == TRUE
			   || fgIsBusAccessFailed == TRUE
			   || (kalGetTimeTick() - u4CurrTick) >
			   LP_OWN_BACK_TOTAL_DELAY_MS
			   || fgIsResetting == TRUE) {
/* ERRORLOG(("LP cannot be own back (for %ld ms)", kalGetTimeTick() - u4CurrTick)); */
			fgStatus = FALSE;
			break;
		} else {
			if ((i & (LP_OWN_BACK_CLR_OWN_ITERATION - 1)) == 0) {
/* Software get LP ownership - per 256 iterations */
				HAL_MCR_WR(prAdapter,
					   MCR_WHLPCR, WHLPCR_FW_OWN_REQ_CLR);
			}

/* Delay for LP engine to complete its operation. */
			kalMsleep(LP_OWN_BACK_LOOP_DELAY_MS);
			i++;
		}
	}

	return fgStatus;
}
Esempio n. 8
0
/*----------------------------------------------------------------------------*/
BOOLEAN nicpmSetAcpiPowerD0(IN P_ADAPTER_T prAdapter)
{
	WLAN_STATUS u4Status = WLAN_STATUS_SUCCESS;
	UINT_32 u4Value = 0, u4WHISR = 0;
	UINT_8 aucTxCount[8];
	UINT_32 i;

#if CFG_ENABLE_FW_DOWNLOAD
	UINT_32 u4FwImgLength, u4FwLoadAddr, u4ImgSecSize;
	PVOID prFwMappingHandle;
	PVOID pvFwImageMapFile = NULL;
#if CFG_ENABLE_FW_DIVIDED_DOWNLOAD
	UINT_32 j;
	P_FIRMWARE_DIVIDED_DOWNLOAD_T prFwHead;
	BOOLEAN fgValidHead;
	const UINT_32 u4CRCOffset = offsetof(FIRMWARE_DIVIDED_DOWNLOAD_T,
					     u4NumOfEntries);
#endif
#endif

	DEBUGFUNC("nicpmSetAcpiPowerD0");

	ASSERT(prAdapter);

	do {
/* 0. Reset variables in ADAPTER_T */
		prAdapter->fgIsFwOwn = TRUE;
		prAdapter->fgWiFiInSleepyState = FALSE;
		prAdapter->rAcpiState = ACPI_STATE_D0;
		prAdapter->fgIsEnterD3ReqIssued = FALSE;

#if defined(MT6620) || defined(MT6628)
/* 1. Request Ownership to enter F/W download state */
		ACQUIRE_POWER_CONTROL_FROM_PM(prAdapter);
#if !CFG_ENABLE_FULL_PM
		nicpmSetDriverOwn(prAdapter);
#endif

/* 2. Initialize the Adapter */
		if ((u4Status = nicInitializeAdapter(prAdapter)) !=
		    WLAN_STATUS_SUCCESS) {
			DBGLOG(INIT, ERROR, ("nicInitializeAdapter failed!\n"));
			u4Status = WLAN_STATUS_FAILURE;
			break;
		}
#endif

#if CFG_ENABLE_FW_DOWNLOAD
		prFwMappingHandle =
		    kalFirmwareImageMapping(prAdapter->prGlueInfo,
					    &pvFwImageMapFile, &u4FwImgLength);
		if (!prFwMappingHandle) {
			DBGLOG(INIT, ERROR,
			       ("Fail to load FW image from file!\n"));
			pvFwImageMapFile = NULL;
		}
#if defined(MT6620) || defined(MT6628)
		if (pvFwImageMapFile) {
/* 3.1 disable interrupt, download is done by polling mode only */
			nicDisableInterrupt(prAdapter);

/* 3.2 Initialize Tx Resource to fw download state */
			nicTxInitResetResource(prAdapter);

/* 3.3 FW download here */
			u4FwLoadAddr =
			    kalGetFwLoadAddress(prAdapter->prGlueInfo);

#if CFG_ENABLE_FW_DIVIDED_DOWNLOAD
/* 3a. parse file header for decision of divided firmware download or not */
			prFwHead =
			    (P_FIRMWARE_DIVIDED_DOWNLOAD_T) pvFwImageMapFile;

			if (prFwHead->u4Signature == MTK_WIFI_SIGNATURE &&
			    prFwHead->u4CRC ==
			    wlanCRC32((PUINT_8) pvFwImageMapFile + u4CRCOffset,
				      u4FwImgLength - u4CRCOffset)) {
				fgValidHead = TRUE;
			} else {
				fgValidHead = FALSE;
			}

/* 3b. engage divided firmware downloading */
			if (fgValidHead == TRUE) {
				for (i = 0; i < prFwHead->u4NumOfEntries; i++) {
#if CFG_ENABLE_FW_DOWNLOAD_AGGREGATION
					if (wlanImageSectionDownloadAggregated
					    (prAdapter,
					     prFwHead->arSection[i].u4DestAddr,
					     prFwHead->arSection[i].u4Length,
					     (PUINT_8)
					     pvFwImageMapFile +
					     prFwHead->arSection[i].u4Offset) !=
					    WLAN_STATUS_SUCCESS) {
						DBGLOG(INIT, ERROR,
						       ("Firmware scatter download failed!\n"));
						u4Status = WLAN_STATUS_FAILURE;
					}
#else
					for (j = 0;
					     j <
					     prFwHead->arSection[i].u4Length;
					     j += CMD_PKT_SIZE_FOR_IMAGE) {
						if (j +
						    CMD_PKT_SIZE_FOR_IMAGE <
						    prFwHead->
						    arSection[i].u4Length)
							u4ImgSecSize =
							    CMD_PKT_SIZE_FOR_IMAGE;
						else
							u4ImgSecSize =
							    prFwHead->arSection
							    [i].u4Length - j;

						if (wlanImageSectionDownload
						    (prAdapter,
						     prFwHead->
						     arSection[i].u4DestAddr +
						     j, u4ImgSecSize, (PUINT_8)
						     pvFwImageMapFile +
						     prFwHead->arSection[i].
						     u4Offset + j) !=
						    WLAN_STATUS_SUCCESS) {
							DBGLOG(INIT, ERROR,
							       ("Firmware scatter download failed!\n"));
							u4Status =
							    WLAN_STATUS_FAILURE;
							break;
						}
					}
#endif
/* escape from loop if any pending error occurs */
					if (u4Status == WLAN_STATUS_FAILURE) {
						break;
					}
				}
			} else
#endif
#if CFG_ENABLE_FW_DOWNLOAD_AGGREGATION
				if (wlanImageSectionDownloadAggregated
				    (prAdapter, u4FwLoadAddr, u4FwImgLength,
				     (PUINT_8)
				     pvFwImageMapFile)
				    != WLAN_STATUS_SUCCESS) {
				DBGLOG(INIT, ERROR,
				       ("Firmware scatter download failed!\n"));
				u4Status = WLAN_STATUS_FAILURE;
			}
#else
				for (i = 0;
				     i < u4FwImgLength;
				     i += CMD_PKT_SIZE_FOR_IMAGE) {
					if (i + CMD_PKT_SIZE_FOR_IMAGE <
					    u4FwImgLength)
						u4ImgSecSize =
						    CMD_PKT_SIZE_FOR_IMAGE;
					else
						u4ImgSecSize =
						    u4FwImgLength - i;

					if (wlanImageSectionDownload(prAdapter,
								     u4FwLoadAddr
								     + i,
								     u4ImgSecSize,
								     (PUINT_8)
								     pvFwImageMapFile
								     + i) !=
					    WLAN_STATUS_SUCCESS) {
						DBGLOG(INIT, ERROR,
						       ("wlanImageSectionDownload failed!\n"));
						u4Status = WLAN_STATUS_FAILURE;
						break;
					}
				}
#endif

			if (u4Status != WLAN_STATUS_SUCCESS) {
				kalFirmwareImageUnmapping(prAdapter->prGlueInfo,
							  prFwMappingHandle,
							  pvFwImageMapFile);
				break;
			}
#if !CFG_ENABLE_FW_DOWNLOAD_ACK
/* Send INIT_CMD_ID_QUERY_PENDING_ERROR command and wait for response */
			if (wlanImageQueryStatus(prAdapter) !=
			    WLAN_STATUS_SUCCESS) {
				kalFirmwareImageUnmapping(prAdapter->prGlueInfo,
							  prFwMappingHandle,
							  pvFwImageMapFile);
				u4Status = WLAN_STATUS_FAILURE;
				break;
			}
#endif

			kalFirmwareImageUnmapping(prAdapter->prGlueInfo,
						  prFwMappingHandle,
						  pvFwImageMapFile);
		} else {
			u4Status = WLAN_STATUS_FAILURE;
			break;
		}

/* 4. send Wi-Fi Start command */
#if CFG_OVERRIDE_FW_START_ADDRESS
		wlanConfigWifiFunc(prAdapter,
				   TRUE,
				   kalGetFwStartAddress(prAdapter->prGlueInfo));
#else
		wlanConfigWifiFunc(prAdapter, FALSE, 0);
#endif

#elif defined(MT5931)
		if (pvFwImageMapFile) {
			DBGLOG(INIT, TRACE,
			       ("Download Address: 0x%08X\n",
				kalGetFwLoadAddress(prAdapter->prGlueInfo)));
			DBGLOG(INIT, TRACE,
			       ("Firmware Length:  0x%08X\n", u4FwImgLength));

			do {
/* 1.0 whole-chip reset except HIFSYS */
				HAL_MCR_WR(prAdapter, MCR_WMCSR,
					   WMCSR_CHIP_RST);
				HAL_MCR_WR(prAdapter, MCR_WMCSR, 0);

/* 1.1 wait for INIT_RDY */
				i = 0;
				while (1) {
					HAL_MCR_RD(prAdapter,
						   MCR_WMCSR, &u4Value);

					if (u4Value & WMCSR_INI_RDY) {
						DBGLOG(INIT, TRACE,
						       ("INIT-RDY detected\n"));
						break;
					} else
					    if (kalIsCardRemoved
						(prAdapter->prGlueInfo)
						== TRUE
						|| fgIsBusAccessFailed ==
						TRUE) {
						u4Status = WLAN_STATUS_FAILURE;
						break;
					} else if (i >=
						   CFG_RESPONSE_POLLING_TIMEOUT)
					{
						DBGLOG(INIT, ERROR,
						       ("Waiting for Init Ready bit: Timeout\n"));
						u4Status = WLAN_STATUS_FAILURE;
						break;
					} else {
						i++;
						kalMsleep(10);
					}
				}

/* 1.2 set KSEL/FLEN */
				HAL_MCR_WR(prAdapter,
					   MCR_FWCFG, u4FwImgLength >> 6);

/* 1.3 enable FWDL_EN */
				HAL_MCR_WR(prAdapter, MCR_WMCSR, WMCSR_FWDLEN);

/* 1.4 wait for PLL_RDY */
				i = 0;
				while (1) {
					HAL_MCR_RD(prAdapter,
						   MCR_WMCSR, &u4Value);

					if (u4Value & WMCSR_PLLRDY) {
						DBGLOG(INIT, TRACE,
						       ("PLL-RDY detected\n"));
						break;
					} else
					    if (kalIsCardRemoved
						(prAdapter->prGlueInfo)
						== TRUE
						|| fgIsBusAccessFailed ==
						TRUE) {
						u4Status = WLAN_STATUS_FAILURE;
						break;
					} else if (i >=
						   CFG_RESPONSE_POLLING_TIMEOUT)
					{
						DBGLOG(INIT, ERROR,
						       ("Waiting for PLL Ready bit: Timeout\n"));
						u4Status = WLAN_STATUS_FAILURE;
						break;
					} else {
						i++;
						kalMsleep(10);
					}
				}

/* 2.1 turn on HIFSYS firmware download mode */
				HAL_MCR_WR(prAdapter,
					   MCR_FWDLSR, FWDLSR_FWDL_MODE);

/* 2.2 set starting address */
				u4FwLoadAddr =
				    kalGetFwLoadAddress(prAdapter->prGlueInfo);
				HAL_MCR_WR(prAdapter, MCR_FWDLDSAR,
					   u4FwLoadAddr);

/* 3. upload firmware */
				for (i = 0;
				     i < u4FwImgLength;
				     i += CMD_PKT_SIZE_FOR_IMAGE) {
					if (i + CMD_PKT_SIZE_FOR_IMAGE <
					    u4FwImgLength)
						u4ImgSecSize =
						    CMD_PKT_SIZE_FOR_IMAGE;
					else
						u4ImgSecSize = u4FwImgLength -
						    i;

					if (wlanImageSectionDownload(prAdapter,
								     u4FwLoadAddr
								     + i,
								     u4ImgSecSize,
								     (PUINT_8)
								     pvFwImageMapFile
								     + i) !=
					    WLAN_STATUS_SUCCESS) {
						DBGLOG(INIT, ERROR,
						       ("Firmware scatter download failed!\n"));
						u4Status = WLAN_STATUS_FAILURE;
						break;
					}
				}

/* 4.1 poll FWDL_OK & FWDL_FAIL bits */
				i = 0;
				while (1) {
					HAL_MCR_RD(prAdapter,
						   MCR_WMCSR, &u4Value);

					if (u4Value & WMCSR_DL_OK) {
						DBGLOG(INIT, TRACE,
						       ("DL_OK detected\n"));
						break;
					} else
					    if (kalIsCardRemoved
						(prAdapter->prGlueInfo)
						== TRUE
						|| fgIsBusAccessFailed == TRUE
						|| (u4Value & WMCSR_DL_FAIL)) {
						DBGLOG(INIT, ERROR,
						       ("DL_FAIL detected: 0x%08X\n",
							u4Value));
						u4Status = WLAN_STATUS_FAILURE;
						break;
					} else if (i >=
						   CFG_RESPONSE_POLLING_TIMEOUT)
					{
						DBGLOG(INIT, ERROR,
						       ("Waiting for DL_OK/DL_FAIL bit: Timeout\n"));
						u4Status = WLAN_STATUS_FAILURE;
						break;
					} else {
						i++;
						kalMsleep(10);
					}
				}

/* 4.2 turn off HIFSYS download mode */
				HAL_MCR_WR(prAdapter, MCR_FWDLSR, 0);
			} while (FALSE);
		} else {
			DBGLOG(INIT, ERROR, ("No Firmware found!\n"));
			u4Status = WLAN_STATUS_FAILURE;
			break;
		}

#endif
#endif

/* 5. check Wi-Fi FW asserts ready bit */
		DBGLOG(INIT, TRACE,
		       ("wlanAdapterStart(): Waiting for Ready bit..\n"));
		i = 0;
		while (1) {
			HAL_MCR_RD(prAdapter, MCR_WCIR, &u4Value);

			if (u4Value & WCIR_WLAN_READY) {
				DBGLOG(INIT, TRACE, ("Ready bit asserted\n"));
				break;
			} else if (kalIsCardRemoved(prAdapter->prGlueInfo) ==
				   TRUE || fgIsBusAccessFailed == TRUE) {
				u4Status = WLAN_STATUS_FAILURE;
				break;
			} else if (i >= CFG_RESPONSE_POLLING_TIMEOUT) {
				DBGLOG(INIT, ERROR,
				       ("Waiting for Ready bit: Timeout\n"));
				u4Status = WLAN_STATUS_FAILURE;
				break;
			} else {
				i++;
				kalMsleep(10);
			}
		}

#if defined(MT5931)
/* Acquire LP-OWN */
		ACQUIRE_POWER_CONTROL_FROM_PM(prAdapter);
#if !CFG_ENABLE_FULL_PM
		nicpmSetDriverOwn(prAdapter);
#endif

/* 2. Initialize the Adapter */
		if ((u4Status = nicInitializeAdapter(prAdapter)) !=
		    WLAN_STATUS_SUCCESS) {
			DBGLOG(INIT, ERROR, ("nicInitializeAdapter failed!\n"));
			u4Status = WLAN_STATUS_FAILURE;
			break;
		}
#endif

		if (u4Status == WLAN_STATUS_SUCCESS) {
/* 6.1 reset interrupt status */
			HAL_READ_INTR_STATUS(prAdapter, 4, (PUINT_8) & u4WHISR);
			if (HAL_IS_TX_DONE_INTR(u4WHISR)) {
				HAL_READ_TX_RELEASED_COUNT(prAdapter,
							   aucTxCount);
			}

/* 6.2 reset TX Resource for normal operation */
			nicTxResetResource(prAdapter);

/* 6.3 Enable interrupt */
			nicEnableInterrupt(prAdapter);

/* 6.4 Override network address */
			wlanUpdateNetworkAddress(prAdapter);

/* 6.5 indicate disconnection as default status */
			kalIndicateStatusAndComplete(prAdapter->prGlueInfo,
						     WLAN_STATUS_MEDIA_DISCONNECT,
						     NULL, 0);
		}

		RECLAIM_POWER_CONTROL_TO_PM(prAdapter, FALSE);

/* MGMT Initialization */
		nicInitMGMT(prAdapter, NULL);
	} while (FALSE);
/*----------------------------------------------------------------------------*/
BOOLEAN nicpmSetDriverOwn(IN P_ADAPTER_T prAdapter)
{
#define LP_OWN_BACK_TOTAL_DELAY_MS      2000	/* exponential of 2 */
#define LP_OWN_BACK_LOOP_DELAY_MS       1	/* exponential of 2 */
#define LP_OWN_BACK_CLR_OWN_ITERATION   256	/* exponential of 2 */

	BOOLEAN fgStatus = TRUE;
	UINT_32 i, u4CurrTick;
	UINT_32 u4RegValue = 0;
	GL_HIF_INFO_T *HifInfo;

	ASSERT(prAdapter);

	if (prAdapter->fgIsFwOwn == FALSE)
		return fgStatus;

	HifInfo = &prAdapter->prGlueInfo->rHifInfo;

	u4CurrTick = kalGetTimeTick();
	STATS_DRIVER_OWN_START_RECORD();
	i = 0;

	while (1) {
		HAL_MCR_RD(prAdapter, MCR_WHLPCR, &u4RegValue);

		if (u4RegValue & WHLPCR_FW_OWN_REQ_SET) {
			prAdapter->fgIsFwOwn = FALSE;
			break;
		} else if (kalIsCardRemoved(prAdapter->prGlueInfo) == TRUE
			   || fgIsBusAccessFailed == TRUE
			   || (kalGetTimeTick() - u4CurrTick) > LP_OWN_BACK_TOTAL_DELAY_MS || fgIsResetting == TRUE) {
			/* ERRORLOG(("LP cannot be own back (for %ld ms)", kalGetTimeTick() - u4CurrTick)); */
			fgStatus = FALSE;
			if (fgIsResetting != TRUE) {
				UINT_32 u4FwCnt;
				static unsigned int u4OwnCnt;
				HAL_MCR_RD(prAdapter, MCR_D2HRM2R, &u4RegValue);
				DBGLOG(NIC, WARN, "<WiFi> MCR_D2HRM2R = 0x%x\n", u4RegValue);
				DBGLOG(NIC, WARN,
					"<WiFi> Fatal error! Driver own fail!!!!!!!!!!!! %d\n", u4OwnCnt++);

				DBGLOG(NIC, WARN, "CONNSYS FW CPUINFO:\n");
				for (u4FwCnt = 0; u4FwCnt < 16; u4FwCnt++)
					DBGLOG(NIC, WARN, "0x%08x ", MCU_REG_READL(HifInfo, CONN_MCU_CPUPCR));
				/* CONSYS_REG_READ(CONSYS_CPUPCR_REG) */
			}
			break;
		} else {
			if ((i & (LP_OWN_BACK_CLR_OWN_ITERATION - 1)) == 0) {
				/* Software get LP ownership - per 256 iterations */
				HAL_MCR_WR(prAdapter, MCR_WHLPCR, WHLPCR_FW_OWN_REQ_CLR);
			}

			/* Delay for LP engine to complete its operation. */
			kalMsleep(LP_OWN_BACK_LOOP_DELAY_MS);
			i++;
		}
	}

	STATS_DRIVER_OWN_END_RECORD();
	STATS_DRIVER_OWN_STOP();

	return fgStatus;
}
/*----------------------------------------------------------------------------*/
BOOLEAN nicpmSetDriverOwn(IN P_ADAPTER_T prAdapter)
{
#define LP_OWN_BACK_TOTAL_DELAY_MS      2048    /* exponential of 2 */
#define LP_OWN_BACK_LOOP_DELAY_MS       1       /* exponential of 2 */
#define LP_OWN_BACK_CLR_OWN_ITERATION   256     /* exponential of 2 */
#define LP_OWN_BACK_FAILED_RETRY_CNT    5
#define LP_OWN_BACK_FAILED_LOG_SKIP_MS  2000
#define LP_OWN_BACK_FAILED_RESET_CNT    5

	BOOLEAN fgStatus = TRUE;
	UINT_32 i, u4CurrTick, u4RegValue = 0;
	BOOLEAN fgTimeout;

	ASSERT(prAdapter);

	if (prAdapter->fgIsFwOwn == FALSE)
		return fgStatus;

	DBGLOG(INIT, INFO, ("DRIVER OWN\n"));

	u4CurrTick = kalGetTimeTick();
	i = 0;
	while (1) {
		HAL_MCR_RD(prAdapter, MCR_WHLPCR, &u4RegValue);

		fgTimeout =
		    ((kalGetTimeTick() - u4CurrTick) > LP_OWN_BACK_TOTAL_DELAY_MS) ? TRUE : FALSE;

		if (u4RegValue & WHLPCR_FW_OWN_REQ_SET) {
			prAdapter->fgIsFwOwn = FALSE;
            prAdapter->u4OwnFailedCount = 0;
            prAdapter->u4OwnFailedLogCount = 0;
			break;
        }
        else if((i > LP_OWN_BACK_FAILED_RETRY_CNT) && 
            (kalIsCardRemoved(prAdapter->prGlueInfo) || fgIsBusAccessFailed || fgTimeout || wlanIsChipNoAck(prAdapter))) {

            if ((prAdapter->u4OwnFailedCount == 0) || 
                CHECK_FOR_TIMEOUT(u4CurrTick, prAdapter->rLastOwnFailedLogTime, MSEC_TO_SYSTIME(LP_OWN_BACK_FAILED_LOG_SKIP_MS))) {
                      
                DBGLOG(INIT, ERROR, ("LP cannot be own back, Timeout[%u](%ums), BusAccessError[%u], Reseting[%u], CardRemoved[%u] NoAck[%u] Cnt[%u]\n",
                    fgTimeout,
                    kalGetTimeTick() - u4CurrTick,
                    fgIsBusAccessFailed,
                    kalIsResetting(),
                    kalIsCardRemoved(prAdapter->prGlueInfo),
                    wlanIsChipNoAck(prAdapter), 
                    prAdapter->u4OwnFailedCount));

                DBGLOG(INIT, INFO, ("Skip LP own back failed log for next %ums\n", LP_OWN_BACK_FAILED_LOG_SKIP_MS));

                prAdapter->u4OwnFailedLogCount++;
                if(prAdapter->u4OwnFailedLogCount > LP_OWN_BACK_FAILED_RESET_CNT) {
                    /* Trigger RESET */
#if CFG_CHIP_RESET_SUPPORT                    
                    glResetTrigger(prAdapter);
#endif
                }
                GET_CURRENT_SYSTIME(&prAdapter->rLastOwnFailedLogTime);
            }
            
            prAdapter->u4OwnFailedCount++;
			fgStatus = FALSE;
			break;
		} else {
			if ((i & (LP_OWN_BACK_CLR_OWN_ITERATION - 1)) == 0) {
				/* Software get LP ownership - per 256 iterations */
				HAL_MCR_WR(prAdapter, MCR_WHLPCR, WHLPCR_FW_OWN_REQ_CLR);
			}

			/* Delay for LP engine to complete its operation. */
			kalMsleep(LP_OWN_BACK_LOOP_DELAY_MS);
			i++;
		}
	}

	return fgStatus;
}