📄 hwacproc.c
字号:
}
#endif
#ifdef WMM_UAPSD
else if(Adapter->WmmDesc.enabled && Adapter->TxPacketCount == 0 )
{
Adapter->bNullFrameSent = 1;
SendNullPacket(Adapter, MRVDRV_TxPD_POWER_MGMT_NULL_PACKET|MRVDRV_TxPD_POWER_MGMT_LAST_PACKET);
}
#endif
LeaveCriticalSection(&Adapter->TxCriticalSection);
break;
#ifdef DEEP_SLEEP
case MACREG_INT_CODE_DS_AWAKE:
if (Adapter->IsDeepSleep == TRUE)
{
Adapter->IsDeepSleep = FALSE;
}
#ifdef SDIO
regValue = 0x0; //Configuration: Host Offset: 0x03
sdStatus = If_WriteRegister(Adapter,
//SD_IO_WRITE,
1,
HCR_HOST_CONFIGURATION_REGISTER, //0x03
FALSE,
®Value, // reg
1);
if (!SD_API_SUCCESS(sdStatus)) {
DBGPRINT(DBG_ERROR,
("OID_MRVL_DEEP_SLEEP Exit Deep Sleep Fail: 0x%08X \n",sdStatus));
}else{
DBGPRINT(DBG_DEEPSLEEP , ("MarEvent MACREG_INT_CODE_DS_AWAKE clear reg 0x3=0\n"));
}
#elif defined(IF_SPI)
//+dzj
sbi_exit_deep_sleep_clean();
#endif //SDIO
#ifdef CONFIG_WLAN_PMU
wlan_PMUGetDeepSleepAwake();
#else
#ifdef DEBUG_PARA_ROAMING
#ifdef PARA_WPA_1X
if(!IsRoamingWantWZCWorkProperly()){
#endif
if((!priv.bAutoRoamingInProcess) && (!priv.bManualRoamingInProcess))
{
#ifdef DEBUG_PARA_ROAMING_PRINT
RETAILMSG(1,(TEXT("Wake up auto-roaming!Caused by HWAC - Disassociated...\n")));
#endif
// when disassociated, the number of bssid should be 0
Adapter->ulNumOfBSSIDs = 0;
Adapter->ulPSNumOfBSSIDs = 0;
priv.bFastAutoRoaming = FALSE;
SetEvent(priv.hAutoRoamingEvent);
}
#ifdef PARA_WPA_1X
}
#endif
#endif
#endif
break;
#endif
#ifdef HOST_SLEEP
case MACREG_INT_CODE_HOST_SLEEP_AWAKE:
{
#ifdef CONFIG_WLAN_PMU
wlan_PMUHostSleepAwake();
#endif
DBGPRINT(DBG_MACEVENT,("HOST_WAKEUP!!\n"));
#ifdef HOST_SLEEP_PS
Adapter->HostPowerState = HTWK_STATE_FULL_POWER;
Adapter->HostSleepAwake = 1;
UpdatePowerSaveState( Adapter, NULL, MACREG_INT_CODE_PS_AWAKE);
Adapter->HostSleepAwake = 0;
#else
Adapter->bHostWakeupDevRequired = FALSE;
#endif
PrepareAndSendCommand(
Adapter,
HostCmd_CMD_802_11_HOST_SLEEP_AWAKE_CONFIRM,
0,
HostCmd_OPTION_USE_INT,
0,
HostCmd_PENDING_ON_NONE,
0,
FALSE,
NULL,
NULL,
NULL,
NULL);
Adapter->bPowerUpDevice = 1;
RETAILMSG(1,(TEXT("MACEvent: HOST_WAKE_UP...")));
}
break;
#endif
// **********************************************************************************
case MACREG_INT_CODE_CMD_FINISHED: // Command finished
DBGPRINT(DBG_MACEVENT,("MACREG_INT_CODE_CMD_FINISHED\n"));
HandleCommandFinishedEvent(Adapter);
break;
case MACREG_INT_CODE_WPA_MIC_ERR_UNICAST:
DBGPRINT(DBG_MACEVENT, ("*** Received UNICAST MIC error ***\n"));
HandleMicError(Adapter, MACREG_INT_CODE_WPA_MIC_ERR_UNICAST);
break;
case MACREG_INT_CODE_WPA_MIC_ERR_MULTICAST:
DBGPRINT(DBG_MACEVENT, ("*** Received MULTICAST MIC error ***\n"));
HandleMicError(Adapter, MACREG_INT_CODE_WPA_MIC_ERR_MULTICAST);
break;
case MACREG_INT_CODE_RSSI_LOW:
{
BOOLEAN timerStatus;
RETAILMSG(1, (L"MACREG_INT_CODE_RSSI_LOW\n"));
if(Adapter->RssiHighTimerIsSet)
{
NdisMCancelTimer(&Adapter->MrvDrvRssiHighTimer, &timerStatus);
NdisMSetTimer(&Adapter->MrvDrvRssiHighTimer,
MRVDRV_DEFAULT_RSSI_HIGH_TIME_OUT);
}
else
{
NdisMSetTimer(&Adapter->MrvDrvRssiHighTimer,
MRVDRV_DEFAULT_RSSI_HIGH_TIME_OUT);
Adapter->RssiHighTimerIsSet = TRUE;
ED_PostMessage(EXDATNAME_PRM, PRM_WLAN_SIGNAL_CHANGE_LOW, 0, 0);
}
break;
}
#ifdef SDIO
case MACREG_INT_CODE_TX_DONE:
HandleTxSingleDoneEvent(Adapter);
break;
#endif
default:
// PJG: not implemented in the firmware. (in original fw from marvell)
case MACREG_INT_CODE_MIB_CHANGED:
case MACREG_INT_CODE_INIT_DONE:
break;
}
// RETAILMSG(1,(TEXT("[Marvell]-HandleMACEvent")));
return;
}
/******************************************************************************
*
* Name: MacEventDisconnected()
*
* Description: MAC event handler for link lost condition, disassociation,
* deauthentication
*
* Arguments: PMRVDRV_ADAPTER Adapter
*
* Return Value:
*
* Notes:
*
*****************************************************************************/
VOID
MacEventDisconnected(
PMRVDRV_ADAPTER Adapter,
UINT TimerValue,
BOOLEAN PowerFlag
)
{
DBGPRINT(DBG_NEWPS | DBG_NEWCMD, ("MacEventDisconnected() \n"));
//RETAILMSG(1, (TEXT("MacEventDisconnected()******** \n\r")));
// need to clean up Rx and Tx first
#if 0 //dralee_20051128
CleanUpSingleTxBuffer(Adapter);
ResetRxPDQ(Adapter);
#endif
if ((Adapter->MediaConnectStatus != NdisMediaStateDisconnected) &&
(Adapter->PSMode == Ndis802_11PowerModeMAX_PSP))
{
PSWakeup(Adapter);
}
Adapter->MediaConnectStatus = NdisMediaStateDisconnected;
#ifdef DEBUG_PARA_ROAMING_PRINT
RETAILMSG(1,(TEXT("NdisMediaStateDisconnected is caused by MacEventDisconnected!...\n")));
#endif
NdisMIndicateStatus(
Adapter->MrvDrvAdapterHdl,
NDIS_STATUS_MEDIA_DISCONNECT,
(PVOID)NULL,
0);
NdisMIndicateStatusComplete(Adapter->MrvDrvAdapterHdl);
//dralee_20051128
// need to report disconnect event if currently associated
//if ( Adapter->MediaConnectStatus != NdisMediaStateDisconnected )
// {
ResetDisconnectStatus(Adapter);
/* dralee_20051128
// send a scan command to get the latest AP list
PrepareAndSendCommand(
Adapter,
HostCmd_CMD_802_11_SCAN,
0,
HostCmd_OPTION_USE_INT,
(NDIS_OID)0,
HostCmd_PENDING_ON_NONE,
0,
FALSE,
NULL,
NULL,
NULL,
NULL);
} // if ( Adapter->MediaConnectStatus != NdisMediaStateDisconnected )
*/
return;
}
/******************************************************************************
*
* Name: HandleRFRegAccess()
*
* Description: Patch offset 7 for rev 4 boards
*
*****************************************************************************/
#ifdef EVALBOARD_REV4_FIX
VOID HandleRFRegAccess(PHostCmd_DS_CMD_RF_REG_ACCESS pRegPtr,
PMRVDRV_ADAPTER Adapter)
{
if ( Adapter->bApplyEvalBoardRev4Patch == TRUE )
{
OID_MRVL_DS_RF_REGISTER_ACCESS RegAccBuffer;
// not applying the next access
Adapter->bApplyEvalBoardRev4Patch = FALSE;
RegAccBuffer.Oid = 0;
RegAccBuffer.usOffset = 0x7;
RegAccBuffer.usOffset = pRegPtr->Value | 0x1;
DBGPRINT(DBG_WARNING,
("EVALBOARD_REV4_FIX: set RF Reg offset 7 to 0x%x\n",
RegAccBuffer.usOffset));
// Rev 4 board patch
PrepareAndSendCommand(
Adapter,
HostCmd_CMD_RF_REG_ACCESS,
HostCmd_ACT_SET,
HostCmd_OPTION_USE_INT,
0,
0,
0,
FALSE,
0,
0,
NULL,
&RegAccBuffer);
}
}
#endif // #ifdef EVALBOARD_REV4_FIX
/******************************************************************************
*
* Name: HandleCommandFinishedEvent()
*
* Description: Command finished event handler
* * Arguments: PMRVDRV_ADAPTER Adapter
*
* Return Value:
* NDIS_STATUS_SUCCESS
* NDIS_STATUS_FAILURE
* NDIS_STATUS_NOT_ACCEPTED
* Notes:
*
*****************************************************************************/
NDIS_STATUS
HandleCommandFinishedEvent(
IN PMRVDRV_ADAPTER Adapter)
{
USHORT Ret;
BOOLEAN timerStatus;
PHostCmd_DS_GEN pRetPtr;
PHostCmd_DS_GET_HW_SPEC pHWSpec;
PHostCmd_DS_802_11_QUERY_STATUS pStatus;
PHostCmd_DS_802_3_GET_STAT p3Stat;
PHostCmd_DS_802_11_SCAN_RSP pScanResponse;
PHostCmd_DS_802_11_ASSOCIATE_RESULT pAssoResult;
PHostCmd_DS_802_11_AD_HOC_RESULT pAdHocResult;
USHORT Channel=0;
LONG lCurRSSI=0;
PHostCmd_DS_802_11_BAND_CONFIG pBandConf;
#ifndef MRVL_RFCHANNEL
PHostCmd_DS_802_11_RF_CHANNEL pRF;
#endif
DBGPRINT(DBG_CMDRESP, ("HWAC: Received cmd resp for 0x%x\n",Adapter->CurCmd->ExpectedRetCode));
//lykao, 061805
// NKDbgPrintfW(L"[Marvell]+HandleCommandFinishedEvent Received cmd resp for 0x%x\n",Adapter->CurCmd->ExpectedRetCode);
//RETAILMSG(1,(TEXT("[Marvell]+HandleCommandFinishedEvent")));
// Get the command buffer
pRetPtr = (PHostCmd_DS_GEN)Adapter->CurCmd->BufVirtualAddr;
Ret = pRetPtr->Command;
//NKDbgPrintfW(L"[Marvell]+HandleCommandFinishedEvent Received cmd resp for :0x%x pRetPtr->Command=0x%x,pRetPtr->Size=0x%x \n",Adapter->CurCmd->ExpectedRetCode,pRetPtr->Command,pRetPtr->Size);
if ( !Adapter->CurCmd )
{
// False alarm
DBGPRINT(DBG_CMDRESP | DBG_ERROR,
("**** hwacproc: False trigger for command ****\n"));
NdisAcquireSpinLock(&Adapter->FreeQSpinLock);
ResetCmdBuffer(Adapter);
NdisReleaseSpinLock(&Adapter->FreeQSpinLock);
return NDIS_STATUS_NOT_ACCEPTED;
}
if ( Adapter->CurCmd->ExpectedRetCode != pRetPtr->Command )
{
DBGPRINT(DBG_ERROR, ("ERROR: Received different cmd response from "
"expected!! Expected: 0x%x, Got: 0x%x\n",
Adapter->CurCmd->ExpectedRetCode, pRetPtr->Command));
ReturnCmdNode(Adapter, Adapter->CurCmd);
Adapter->CurCmd = NULL;
GetCmdFromQueueToExecute (Adapter);
return NDIS_STATUS_NOT_ACCEPTED;
}
// Now we got response from FW, cancel the command timer
if (Adapter->CommandTimerSet)
{
NdisMCancelTimer(
&Adapter->MrvDrvCommandTimer,
&timerStatus);
Adapter->CommandTimerSet = FALSE;
}
// if the current return code is not 80xx, it's a time-out command
if ( (Ret & HostCmd_RET_NONE) == 0 )
{
DBGPRINT(DBG_CMDRESP,("*** hwacproc: Command timeout from FW!!\n"));
ReturnCmdNode(Adapter, Adapter->CurCmd);
Adapter->CurCmd = NULL;
GetCmdFromQueueToExecute (Adapter);
return NDIS_STATUS_FAILURE;
}
// Command is not successful, return failure, clean-up command, and exit
if ( pRetPtr->Result != HostCmd_RESULT_OK )
{
return HandleHostCmdFailure(Ret, Adapter, pRetPtr);
}
//dralee_20051119. Just force MrvSdioIstThread get CPU time
//if MrvSdioIstThread occupy CmdQueueExeSection critical section.
// EnterCriticalSection(&Adapter->CmdQueueExeSection);
// LeaveCriticalSection(&Adapter->CmdQueueExeSection);
switch( Ret ) {
//tt ++ v5 firmware
case HostCmd_RET_802_11_SUBSCRIBE_EVENT:
{
PHostCmd_DS_802_11_SUBSCRIBE_EVENT pEventCmd;
pEventCmd = (PHostCmd_DS_802_11_SUBSCRIBE_EVENT) pRetPtr;
NKDbgPrintfW( L"### HostCmd_RET_802_11_SUBSCRIBE_EVENT, result=%x, event=%x\n", pEventCmd->Result, pEventCmd->Events );
}
break;
#ifdef BCA
case HostCmd_RET_802_11_BCA_CONFIG_TIMESHARE:
TT_CMDPARSE_CMD_RESP2( HostCmd_DS_802_11_BCA_TIMESHARE, TrafficType, TimeShareInterval );
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -