📄 hwacproc.c
字号:
PrepareAndSendCommand(
Adapter,
usCommand,
0,
HostCmd_OPTION_USE_INT,
(NDIS_OID)0,
HostCmd_PENDING_ON_NONE,
0,
FALSE,
NULL,
NULL,
NULL,
Adapter->CurrentBSSID);
ResetDisconnectStatus(Adapter);
}
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;
DBGPRINT(DBG_CMDRESP , ("HWAC: Received cmd resp for 0x%x\n",Adapter->CurCmd->ExpectedRetCode));
// RETAILMSG(1, (TEXT("HWAC: Received cmd resp for 0x%x \r\n"),Adapter->CurCmd->ExpectedRetCode));
// Get the command buffer
pRetPtr = (PHostCmd_DS_GEN)Adapter->CurCmd->BufVirtualAddr;
DBGPRINT(DBG_CMDRESP , ("HWAC: Cmd resp for 0x%x\n",pRetPtr->Command));
DBGPRINT(DBG_CMDRESP , ("HWAC: Received cmd resp for 0x%x\n",Adapter->CurCmd->ExpectedRetCode));
#ifdef CF_DRIVER
// PDM: We need to read the responce from the card
cf_ReadCommandResponse (Adapter,
Adapter->CurCmd->BufVirtualAddr);
#endif
Adapter->bIsDoingCmd = FALSE;
Ret = pRetPtr->Command;
if ( !Adapter->CurCmd )
{
// False alarm
DBGPRINT(DBG_CMDRESP | DBG_ERROR,
("**** hwacproc: False trigger for command ****\n"));
ResetCmdBuffer(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 ( 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;
}
// 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);
}
switch( Ret )
{
#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;
}
//RETAILMSG(1, (TEXT("Got BG_SCAN_CONFIG command return [0x%x] \r\n"), pRetPtr->Result));
}
break;
case HostCmd_RET_802_11_BG_SCAN_QUERY:
{
//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);
}
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->bPSEnableBGScan=FALSE;
PSSleep(Adapter);
}
}
else
DBGPRINT( DBG_SCAN, ("[Mrvl] Failed to get background scan results!\n") );
}
break;
#endif
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;
#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_BACKUP_CMD_RESP( Adapter, HostCmd_RATE_ADAPT_RATESET, EnableHwAuto );
// TT_CMDPARSE_DUMP_DATA3( Adapter->OidCmdRespBuf, OID_MRVL_DS_RATE_ADAPT_RATESET, EnableHwAuto, Bitmap, Bitmap );
// TT_CMDPARSE_SET_EVENT( Adapter );
/* {
PHostCmd_RATE_ADAPT_RATESET pCmdResult;
pCmdResult = (PHostCmd_RATE_ADAPT_RATESET) pRetPtr;
NKDbgPrintfW( L"-v5- CMD_RSP: RATE_ADAPT, Act=%d, Result=%d, Enable=%d, Bitmap=0x%x\n",
pCmdResult->Action, pCmdResult->Result, pCmdResult->EnableHwAuto, pCmdResult->Bitmap );
}
*/ break;
//tt --
//#ifdef ADHOCAES
// case HostCmd_RET_802_11_PWK_KEY:
// {
// PHostCmd_DS_802_11_PWK_KEY pCmd = (PHostCmd_DS_802_11_PWK_KEY)pRetPtr;
// if (pCmd->Action == HostCmd_ACT_GET_AES)
// {
// HandleAdhocAES( Adapter,
// pCmd,
// Adapter->CurCmd->InformationBuffer,
// Adapter->CurCmd->BytesWritten);
// }
// }
//
// break;
//#endif
case HostCmd_RET_802_11_RSSI:
{
PHostCmd_DS_802_11_RSSI pCmd = (PHostCmd_DS_802_11_RSSI)pRetPtr;
// store the non average value
Adapter->SNR[TYPE_BEACON][TYPE_NOAVG] = pCmd->SNR;
Adapter->NF[TYPE_BEACON][TYPE_NOAVG] = pCmd->NoiseFloor;
Adapter->SNR[TYPE_BEACON][TYPE_AVG] =
CAL_AVG_SNR_NF(Adapter->SNR[TYPE_BEACON][TYPE_AVG],(pCmd->SNR));
Adapter->NF[TYPE_BEACON][TYPE_AVG] =
CAL_AVG_SNR_NF(Adapter->NF[TYPE_BEACON][TYPE_AVG],(pCmd->NoiseFloor));
// store the beacon values in SNRNF variable, which
// is present in adapter structure
Adapter->SNRNF[SNR_BEACON][TYPE_NOAVG] =
(UCHAR)Adapter->SNR[TYPE_BEACON][TYPE_NOAVG];
Adapter->SNRNF[SNR_BEACON][TYPE_AVG] =
Adapter->SNR[TYPE_BEACON][TYPE_AVG] / AVG_SCALE;
Adapter->SNRNF[NF_BEACON][TYPE_NOAVG] =
(UCHAR)Adapter->NF[TYPE_BEACON][TYPE_NOAVG];
Adapter->SNRNF[NF_BEACON][TYPE_AVG] =
Adapter->NF[TYPE_BEACON][TYPE_AVG] / AVG_SCALE;
// NOTE: Adapter->SNRNF[SNR_RXPD][X] - represents RXPD for SNR
// Adapter->SNRNF[NF_RXPD][X] - represents RXPD for NF
Adapter->RSSI[TYPE_BEACON][TYPE_NOAVG] =
CAL_RSSI(Adapter->SNR[TYPE_BEACON][TYPE_NOAVG],
Adapter->NF[TYPE_BEACON][TYPE_NOAVG]);
Adapter->RSSI[TYPE_BEACON][TYPE_AVG] =
CAL_RSSI(Adapter->SNR[TYPE_BEACON][TYPE_AVG] / AVG_SCALE,
Adapter->NF[TYPE_BEACON][TYPE_AVG] / AVG_SCALE);
if ((Adapter->RSSI[TYPE_BEACON][TYPE_AVG] > -10) || (Adapter->RSSI[TYPE_BEACON][TYPE_AVG] < -200))
{
DBGPRINT(DBG_ERROR, ("ERROR: Incorrect RSSI Value1 - SNR = %d, "
"NF= %d, Adapter->RSSI[TYPE_BEACON][TYPE_AVG] = %d, Adapter->LastRSSI = %d\n",
pCmd->SNR,
pCmd->NoiseFloor,
Adapter->RSSI[TYPE_BEACON][TYPE_AVG],
Adapter->LastRSSI));
}
else
{
if ( Adapter->LastRSSI == MRVL_DEFAULT_INITIAL_RSSI )
{
Adapter->LastRSSI = Adapter->RSSI[TYPE_BEACON][TYPE_AVG];
}
else
{
Adapter->LastRSSI = ((Adapter->LastRSSI * 3)+(Adapter->RSSI[TYPE_BEACON][TYPE_AVG]))/4;
}
}
DBGPRINT(DBG_CMDRESP, ("HostCmd_RET_802_11_RSSI: pCmd->SNR = %d,pCmd->NoiseFloor= %d,Adapter->RSSI[TYPE_BEACON][TYPE_NOAVG] = %d, Adapter->RSSI[TYPE_BEACON][TYPE_AVG]= %d, Adapter->LastRSSI=%d\n",
pCmd->SNR,
pCmd->NoiseFloor,
Adapter->RSSI[TYPE_BEACON][TYPE_NOAVG],
Adapter->RSSI[TYPE_BEACON][TYPE_AVG],
Adapter->LastRSSI));
break;
}
case HostCmd_RET_REGION_CODE:
#ifndef ENABLE_802_11D
{
PHostCmd_DS_CMD_REGION_CODE pCmd = (PHostCmd_DS_CMD_REGION_CODE)pRetPtr;
if (pCmd->Action == HostCmd_ACT_SET)
{
Adapter->RegionCode = pCmd->RegionCode;
SetRegionCode(Adapter);
}
else
{
POID_MRVL_DS_REGION_CODE pUserBuffer;
pUserBuffer = (POID_MRVL_DS_REGION_CODE) Adapter->CurCmd->InformationBuffer;
pUserBuffer->ulRegionCode = pCmd->RegionCode;
*(Adapter->CurCmd->BytesWritten) = sizeof(OID_MRVL_DS_REGION_CODE);
}
}
#endif
break;
case HostCmd_RET_HW_SPEC_INFO:
pHWSpec = (PHostCmd_DS_GET_HW_SPEC)pRetPtr;
HandleHardwareSpec(pHWSpec, Adapter);
break;
case HostCmd_RET_802_11_RESET:
DBGPRINT(DBG_CMDRESP,("HWAC - Reset command successful\n"));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -