📄 hwacproc.c
字号:
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;
}
//Ling++, 010906
//Mask the function HandleHostCmdFailure for the issue that OS will crash
//Reason: [1] For new method to QueryOID with a Command request, the retrun value will not be the original NDIS_STATUS_PENDING.
// By using function TT_CMDPARSE_SYNC_STD_OID_QUERY_AND_RETURN, if we receive HostCmd_RESULT_NOT_SUPPORT :0x2, the function will handle this situation as below:
// if ( Adapter->nOidCmdResult != HostCmd_RESULT_OK )
// {
// return NDIS_STATUS_NOT_ACCEPTED;
// }
// [2]Because driver will not return NDIS_STATUS_PENDING by new method when QueryOID, if driver send NdisMQueryInformationComplete to OS under HandleHostCmdFailure, it will cause OS crash.
//
/*
// Command is not successful, return failure, clean-up command, and exit
if ( pRetPtr->Result != HostCmd_RESULT_OK )
{
return HandleHostCmdFailure(Ret, Adapter, pRetPtr);
}
*/
//Ling--, 010906
//dralee
if ( pRetPtr->Result != HostCmd_RESULT_OK )
RETAILMSG(1,(L"COMMAND FAIL:%x\n\r",Ret));
//dralee_20051119. Just force MrvIstThread get CPU time
//if MrvIstThread occupy CmdQueueExeSection critical section.
EnterCriticalSection(&Adapter->CmdQueueExeSection);
LeaveCriticalSection(&Adapter->CmdQueueExeSection);
switch( Ret ) {
#ifdef WMM
case HostCmd_RET_802_11_WMM_GET_STATUS:
wmm_update_status_from_cmd_resp( Adapter );
break;
#endif // WMM
//tt ++ v5 firmware
#ifdef BG_SCAN
case HostCmd_RET_802_11_BG_SCAN_CONFIG:
{
PHostCmd_DS_802_11_BG_SCAN_CONFIG pCfg = (PHostCmd_DS_802_11_BG_SCAN_CONFIG) pRetPtr;
if ( pRetPtr->Result == HostCmd_RESULT_OK )
{
Adapter->bBgScanEnabled = pCfg->Enable;
}
else
{
Adapter->bBgScanEnabled = FALSE;
}
//AllenDBGPRINT(DBG_ALLEN, ("BG_SCAN_CONFIG command return [0x%x] \n", pRetPtr->Result));
//RETAILMSG(1, (TEXT("Got BG_SCAN_CONFIG command return [0x%x] \r\n"), pRetPtr->Result));
//NKDbgPrintfW( L"[xx] Got BG_SCAN_CONFIG command return [0x%x]\n", pRetPtr->Result );
}
break;
case HostCmd_RET_802_11_BG_SCAN_QUERY:
{
//AllenDBGPRINT(DBG_ALLEN, ("HostCmd_RET_802_11_BG_SCAN_QUERY [0x%x] \n", pRetPtr->Result));
//RETAILMSG(1, (TEXT("HostCmd_RET_802_11_BG_SCAN_QUERY [0x%x] \r\n"), pRetPtr->Result));
if ( pRetPtr->Result == HostCmd_RESULT_OK )
{
PHostCmd_DS_802_11_BG_SCAN_QUERY_RSP pBgScanResponse;
pBgScanResponse = (PHostCmd_DS_802_11_BG_SCAN_QUERY_RSP) pRetPtr;
{
PBSS_DESCRIPTION_SET_ALL_FIELDS pDesc;
pDesc = (PBSS_DESCRIPTION_SET_ALL_FIELDS) (pBgScanResponse+1);
//NKDbgPrintfW( L"[xx] Got background scan results........\n" );
//NKDbgPrintfW( L" BssSize=%d, NumOfSets=%d, ReportCond=0x%x\n", pBgScanResponse->BSSDescriptSize, pBgScanResponse->NumberOfSets, pBgScanResponse->ReportCondition);
//NKDbgPrintfW( L" SSID=%c%c%c%c...\n", pDesc->SSID[0], pDesc->SSID[1], pDesc->SSID[2], pDesc->SSID[3] );
}
HandleBgScanResponse( pBgScanResponse, Adapter );
#ifdef ACTIVE_ROAMING
if(Adapter->bActiveRoamingwithBGSCAN==TRUE)
{
EnableBgScan(Adapter, FALSE);
EnableBgScan(Adapter, TRUE);
}
#endif
if(Adapter->bPSEnableBGScan==TRUE)
{
Adapter->PSMode = Ndis802_11PowerModeMAX_PSP;
Adapter->PSMode_B = Ndis802_11PowerModeMAX_PSP;
Adapter->bPSEnableBGScan=FALSE;
PSSleep(Adapter);
}
}
else
DBGPRINT( DBG_SCAN, ("[Mrvl] Failed to get background scan results!\n") );
}
break;
#endif
#ifdef MRVL_DBG_PA_CFG_EXT
case HostCmd_RET_802_11_POWER_ADAPT_CFG_EXT:
{
USHORT Size,i;
POID_MRVL_DS_POWER_ADAPT_CFG_EXT pACfg;
PHostCmd_DS_802_11_POWER_ADAPT_CFG_EXT pHostCmdPACfg;
pHostCmdPACfg = (PHostCmd_DS_802_11_POWER_ADAPT_CFG_EXT) pRetPtr;
if ( pRetPtr->Result == HostCmd_RESULT_OK )
{
if (pHostCmdPACfg->Action == HostCmd_ACT_GET)
{
NdisZeroMemory(Adapter->PACfg, LENGTH_PA_CFG);
Size=pRetPtr->Size-sizeof(USHORT)*4;
pACfg = (POID_MRVL_DS_POWER_ADAPT_CFG_EXT) Adapter->PACfg;
NdisMoveMemory( (PUCHAR)(&(pACfg->Action)),
(PUCHAR)(&(pHostCmdPACfg->Action)),
Size);
pACfg->CmdLen =Size;
#ifdef MRVL_PRINT_DBG_MSG
MrvPrintFile("\n[Marvell]HostCmd_RET_802_11_POWER_ADAPT_CFG_EXT:Get OK !!\n");
MrvPrintFile("\n[Marvell]pACfg->CmdLen=0x%x,pACfg->Action=%d,pACfg->EnablePA=%d,pACfg->PowerAdaptGroup.Header.Type=0x%x, pACfg->PowerAdaptGroup.Header.Len=0x%x !!\n",pACfg->CmdLen,pACfg->Action,pACfg->EnablePA,pACfg->PowerAdaptGroup.Header.Type,pACfg->PowerAdaptGroup.Header.Len);
for(i=0;i<MAX_POWER_ADAPT_GROUP;i++)
MrvPrintFile("\n[Marvell]pACfg->PowerAdaptGroup.PA_Group[%d].PowerAdaptLevel=%d,pACfg->PowerAdaptGroup.PA_Group[%d].RateBitmap=0x%x !!\n",i,pACfg->PowerAdaptGroup.PA_Group[i].PowerAdaptLevel,i,pACfg->PowerAdaptGroup.PA_Group[i].RateBitmap);
#endif
}else
{
#ifdef MRVL_PRINT_DBG_MSG
MrvPrintFile("\n[Marvell]HostCmd_RET_802_11_POWER_ADAPT_CFG_EXT: Set OK !!\n");
#endif
}
}
}
break;
#endif
#ifdef CIPHER_TEST
case HostCmd_RET_802_11_KEY_ENCRYPT:
TT_CMDPARSE_CMD_RESP2( HostCmd_DS_802_11_KEY_ENCRYPT, EncType, KeyDataLen );
break;
case HostCmd_RET_802_11_CRYPTO:
{
PHostCmd_DS_802_11_CRYPTO cmdcry;
USHORT *a;
cmdcry = (PHostCmd_DS_802_11_CRYPTO)pRetPtr;
RETAILMSG(1,(L"CMD RESPONSE--------------------\n\r"));
RETAILMSG(1,(L"Enc:%x,Agm:%x,KL:%x\n\r",
cmdcry->EncDec,cmdcry->Algorithm,cmdcry->KeyLength) );
a = (USHORT *)(&cmdcry->Key[0]);
RETAILMSG(1,(L"%4x,%4x,%4x,%4x,%4x,%4x,%4x,%4x\n\r",a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7] ));
//RETAILMSG(1,(L"--%4x,%4x,%4x,%4x,%4x,%4x,%4x,%4x\n\r",a[8],a[9],a[10],a[11],a[12],a[13],a[14],a[15]));
RETAILMSG(1,(L"T:%x,L:%x\n\r",
cmdcry->TLVBuf.Header.Type,cmdcry->TLVBuf.Header.Len ) );
a = (USHORT *)(&cmdcry->TLVBuf.payload[0]);
RETAILMSG(1,(L"%4x,%4x,%4x,%4x,%4x,%4x,%4x,%4x\n\r",a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7] ));
//RETAILMSG(1,(L"--%4x,%4x,%4x,%4x,%4x,%4x,%4x,%4x\n\r",a[8],a[9],a[10],a[11],a[12],a[13],a[14],a[15]));
}
TT_CMDPARSE_CMD_RESP2( HostCmd_DS_802_11_CRYPTO, EncDec, Algorithm );
break;
#endif
//ahan [2005-12-13] ++dralee_20060217
case HostCmd_RET_802_11_SUBSCRIBE_EVENT:
{
PHostCmd_DS_802_11_SUBSCRIBE_EVENT pEventCmd;
pEventCmd = (PHostCmd_DS_802_11_SUBSCRIBE_EVENT) pRetPtr;
Adapter->SubscribeEvents = pEventCmd->Events;
if (pEventCmd->Action == HostCmd_ACT_GET)
{
DBGPRINT(DBG_SUBSCRIBEEVENT, ("Adapter->SubscribeEvents = [%x]\n",
Adapter->SubscribeEvents));
}
}
break;
//ahan [2005-12-13] ++dralee_20060217
#ifdef BCA
case HostCmd_RET_802_11_BCA_CONFIG_TIMESHARE:
TT_CMDPARSE_CMD_RESP2( HostCmd_DS_802_11_BCA_TIMESHARE, TrafficType, TimeShareInterval );
break;
#endif //BCA
case HostCmd_RET_802_11_LED_CONTROL:
TT_CMDPARSE_CMD_RESP2( HostCmd_DS_802_11_LED_CONTROL, NumLed, data[0] );
break;
#ifdef CAL_DATA
case HostCmd_RET_802_11_CAL_DATA_EXT:
TT_CMDPARSE_CMD_RESP2(HostCmd_DS_802_11_CAL_DATA_EXT, Revision, CalDataLen );
break;
case HostCmd_RET_802_11_CAL_DATA:
TT_CMDPARSE_CMD_RESP2(HostCmd_DS_802_11_CAL_DATA, PAOption, Domain );
break;
#endif //CAL_DATA
case HostCmd_RET_802_11_PWR_CFG:
TT_CMDPARSE_CMD_RESP2(HostCmd_DS_802_11_PWR_CFG, Enable, P2);
// TT_CMDPARSE_QUERY_BACKUP_CMD_RESP( Adapter, HostCmd_DS_802_11_PWR_CFG, Enable, P2);
// TT_CMDPARSE_DUMP_DATA3( Adapter->OidCmdRespBuf, OID_MRVL_DS_PWR_CFG, P0, P1, P2 );
// TT_CMDPARSE_SET_EVENT( Adapter );
break;
case HostCmd_RET_802_11_TPC_CFG:
TT_CMDPARSE_CMD_RESP2(HostCmd_DS_802_11_TPC_CFG, Enable, P2);
// TT_CMDPARSE_QUERY_BACKUP_CMD_RESP( Adapter, HostCmd_DS_802_11_TPC_CFG, Enable, P2);
// TT_CMDPARSE_DUMP_DATA3( Adapter->OidCmdRespBuf, OID_MRVL_DS_TPC_CFG, P0, P1, P2 );
// TT_CMDPARSE_SET_EVENT( Adapter );
/* {
PHostCmd_DS_802_11_TPC_CFG pCmdResult;
NKDbgPrintfW( L"-v5- CMD_RSP: TPC_CFG, Result=%d\n",
pCmdResult->Result );
}
*/ break;
case HostCmd_RET_802_11_RATE_ADAPT_RATESET:
TT_CMDPARSE_CMD_RESP2(HostCmd_RATE_ADAPT_RATESET, EnableHwAuto, Bitmap);
// TT_CMDPARSE_QUERY_BA
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -