📄 message.c
字号:
VOID
vHALsendClearKeyReq( IN PHAL_CONTEXT psHAL, IN UMI_CLEAR_KEY * psClearKey )
{
UMI_MSG *psMsg;
psMsg = psHALnewReqMessage( psHAL, MSG_MAN );
if ( psMsg != NULL )
{
OS_MEMCPY( psMsg->abData, psClearKey, sizeof( UMI_CLEAR_KEY ) );
psMsg->u16MsgId = UM_MAN_CLEAR_KEY_REQ;
boHALsendMessage( psHAL, psMsg );
}
}
//-----------------------------------------------------------------------------
//
// NAME vHALhandleClearKeyCfm
//
// PARAMETERS psHAL Pointer to HAL context.
// psMsg Confirm message to be processed.
//
// DESCRIPTION This function handles Clear Key confirm message.
//
//-----------------------------------------------------------------------------
VOID
vHALhandleClearKeyCfm( IN PHAL_CONTEXT psHAL, IN UMI_MSG * psMsg )
{
UMI_CLEAR_KEY *psClearKey;
psClearKey = (UMI_CLEAR_KEY *)psMsg->abData;
if ( psClearKey->u16Status == UMI_OK )
{
DBG_LEV1(("Successfully clear key.\n"));
}
else
{
DBG_LEV0(("ERROR: Clear key request failed, error %d.\n", psClearKey->u16Status));
}
}
//-----------------------------------------------------------------------------
//
// NAME vHALsendPowerOffReq
//
// PARAMETERS psHAL Pointer to HAL context.
//
// DESCRIPTION This function sends a Power Off request message to Target.
//
//-----------------------------------------------------------------------------
VOID
vHALsendPowerOffReq( IN PHAL_CONTEXT psHAL )
{
UMI_MSG *psMsg;
psMsg = psHALnewReqMessage( psHAL, MSG_MAN );
if ( psMsg != NULL )
{
psMsg->u16MsgId = UM_MAN_POWER_OFF_REQ;
boHALsendMessage( psHAL, psMsg );
}
}
//-----------------------------------------------------------------------------
//
// NAME vHALhandlePowerOffCfm
//
// PARAMETERS psHAL Pointer to HAL context.
//
// DESCRIPTION This function handles Power Off confirm message.
//
//-----------------------------------------------------------------------------
VOID
vHALhandlePowerOffCfm( IN PHAL_CONTEXT psHAL, IN UMI_MSG * psMsg )
{
UMI_POWER_OFF *pPowerOff;
pPowerOff = (UMI_POWER_OFF *)psMsg->abData;
if ( pPowerOff->u16Status == UMI_OK )
{
DBG_LEV1(("Successfully sent Power Off request.\n"));
}
else
{
// Set radio off failed, back to radio on state.
psHAL->psAdapter->sWlan.boDesiredRadio = TRUE;
DBG_LEV0(("ERROR: Power Off request failed, error %d.\n", pPowerOff->u16Status));
}
}
//-----------------------------------------------------------------------------
//
// NAME vHALsendGetMibReq
//
// PARAMETERS psHAL Pointer to HAL context.
// u16MibId MIB Id.
//
// DESCRIPTION This function sends a Get MIB request message to Target.
//
//-----------------------------------------------------------------------------
VOID
vHALsendGetMibReq( IN PHAL_CONTEXT psHAL, IN MIB_ID u16MibId )
{
UMI_MSG *psMsg;
UMI_MIB *psGetMib;
psMsg = psHALnewReqMessage( psHAL, MSG_MAN );
if ( psMsg != NULL )
{
psGetMib = (UMI_MIB *)psMsg->abData;
psGetMib->u16ObjectID = u16MibId;
psGetMib->u16Status = UMI_OK;
psMsg->u16MsgId = UM_MAN_GET_MIB_REQ;
boHALsendMessage( psHAL, psMsg );
}
}
//-----------------------------------------------------------------------------
//
// NAME vHALHandleGetMibAttrReq
//
// PARAMETERS psHAL Pointer to HAL context.
// psMsg Confirm message to be processed.
//
// DESCRIPTION This function handles Get MIB Attribute message, return the MIB information to upper layer.
//
//-----------------------------------------------------------------------------
VOID
vHALHandleGetMibAttrReq( IN PHAL_CONTEXT psHAL, IN UMI_MSG * psMsg )
{
PEND_CONTEXT psAdapter = psHAL->psAdapter;
PPENDING_OID psPendingOID = &psAdapter->sPendingOID;
DBG_LEV3(("vHALHandleGetMibAttrReq \n"));
if( psPendingOID->ulOid == OID_COMMASIC_GET_MIB_ATTR){
UMI_MIB *psGetMib = (UMI_MIB *)psMsg->abData;
PUCHAR pucValue = &psGetMib->uValue.u8Uint8;
if ( psGetMib->u16Status == UMI_OK ){
NdisMQueryInformationComplete( psAdapter->hMiniportAdapterHandle, NDIS_STATUS_SUCCESS );
DBG_LEV2(("PENDING Query Completed for OID OID_COMMASIC_GET_MIB_ATTR\n"));
if (psGetMib->u16ObjectID == u16MibID_GetMIBAttr) {
ULONG i = 0, dataLen =0;
MIB_ID_LOOKUP_TABLE_S * pMibTableItem;
// If the MIB attribute is a special data type it will be in the
// sMibIdLookupTable array, otherwise the default attribute is a
// byte which is the last element of the array.
for (i = 0; (i < (SIZEOF_MIB_ID_LOOKUP_TABLE - 1)) &&
(psGetMib->u16ObjectID != sMibIdLookupTable[i].ulMibId); i++) ;
pMibTableItem = sMibIdLookupTable+i;
*psPendingOID->pulBytesWritten = *psPendingOID->pulBytesNeeded = pMibTableItem->ulSize;
OS_MEMCPY((PUCHAR)psPendingOID->pvBuffer, pucValue, *psPendingOID->pulBytesNeeded);
iCurOIDStatus = NDIS_STATUS_SUCCESS;
}
else{
return;
}
}
}
}
//-----------------------------------------------------------------------------
//
// NAME vHALhandleGetMibCfm
//
// PARAMETERS psHAL Pointer to HAL context.
// psMsg Confirm message to be processed.
//
// DESCRIPTION This function handles Get MIB confirm message.
//
//-----------------------------------------------------------------------------
VOID
vHALhandleGetMibCfm( IN PHAL_CONTEXT psHAL, IN UMI_MSG * psMsg )
{
UMI_MIB *psGetMib;
PUCHAR pucValue;
PEND_CONTEXT psAdapter = psHAL->psAdapter;
PWLAN_CONTEXT psWlan = &psAdapter->sWlan;
PPENDING_OID psPendingOID = &psAdapter->sPendingOID;
NDIS_STATUS iStatus = NDIS_STATUS_NOT_ACCEPTED;
ULONG tmpOid; // CS
ULONG i = 0;
USHORT u16Val;
psGetMib = (UMI_MIB *)psMsg->abData;
if ( psGetMib->u16Status == UMI_OK )
{
pucValue = &psGetMib->uValue.u8Uint8;
DBG_LEV2(("Successfully Get MIB, item 0x%x.\n"
"\tvalue = %02x %02x %02x %02x %02x %02x %02x %02x\n",
psGetMib->u16ObjectID,
*pucValue, *(pucValue+1), *(pucValue+2), *(pucValue+3),
*(pucValue+4), *(pucValue+5), *(pucValue+6), *(pucValue+7)));
switch ( psGetMib->u16ObjectID )
{
case MIB_IEEE_ADDRESS:
OS_MEMCPY( psAdapter->ucPermanentAddress, pucValue, IEEE_ADDR_LEN );
psAdapter->boGetPermanentAddress = TRUE;
if ( psAdapter->boMACAddressOverride == FALSE )
{
OS_MEMCPY( psAdapter->ucCurrentAddress, pucValue, IEEE_ADDR_LEN );
OS_MEMCPY( psWlan->ucMacAddr, pucValue, IEEE_ADDR_LEN);
}
break;
case MIB_SW_VERSION:
psHAL->sCardStatus.usMACFirmwareVersion = psGetMib->uValue.u16Uint16;
DBG_LEV1(("Mac running CA_SW_VERSION = %d\n", psGetMib->uValue.u16Uint16));
break;
case MIB_UWA_PROGRAM_VER:
u16Val = psGetMib->uValue.u16Uint16;
psHAL->sCardStatus.aucUWAFirmwareVersion[0] = u16Val & 0xFF;
psHAL->sCardStatus.aucUWAFirmwareVersion[1] = u16Val >> 8;
DBG_LEV1(("UWA version is 0x%x\n", u16Val));
break;
case MIB_OPERATIONAL_RATE_SET:
if ( psGetMib->uValue.u32Uint32 )
{
vENDgetRatesBitmapArray( psWlan->ulNetworkTypeInUse, &i,
&psGetMib->uValue.u32Uint32, psWlan->ucDesiredRates );
}
break;
case MIB_RX_BUF_OVERFLOW_COUNT:
psWlan->ulRxOverflows = psGetMib->uValue.u32Uint32;
break;
case MIB_UWA_RX_STATS:
// copy the stats into the psWlan struct
OS_MEMCPY(&psWlan->ulUwaRxStats[0], &psGetMib->uValue, 4*MIB_UWA_RX_STATS_SEGM_LENGTH);
// need to send out the req for the 2nd segment
vHALsendGetMibReq( psHAL, MIB_UWA_RX_STATS_SEGM2 );
DBG_LEV2(("Got MIB UWA RX STATS \n"));
break;
case MIB_UWA_RX_STATS_SEGM2:
// copy the stats into the psWlan struct
OS_MEMCPY(&psWlan->ulUwaRxStats[MIB_UWA_RX_STATS_SEGM_LENGTH],
&psGetMib->uValue,
4*MIB_UWA_RX_STATS_SEGM_LENGTH);
// need to send out the req for the last segment
vHALsendGetMibReq( psHAL, MIB_UWA_RX_STATS_SEGM3 );
DBG_LEV2(("Got MIB UWA RX STATS Segm 2\n"));
break;
case MIB_UWA_RX_STATS_SEGM3:
// copy the stats into the psWlan struct
OS_MEMCPY(&psWlan->ulUwaRxStats[2*MIB_UWA_RX_STATS_SEGM_LENGTH],
&psGetMib->uValue,
4*MIB_UWA_RX_STATS_SEGM_LENGTH);
DBG_LEV2(("Got MIB UWA RX STATS Segm 3 - %d\n", psGetMib->uValue.u32Uint32));
break;
case MIB_SNR:
psWlan->lSnr = psGetMib->uValue.u32Uint32 - UMI_SNR_VALUE_OFFSET;
break;
case MIB_CA_DEVICE_CAPS:
psWlan->ulCardCapabilities = psGetMib->uValue.u32Uint32;
// Adjust protocol type to 802.11g mode if adapter doesn't support 802.11a mode.
if ( !(psWlan->ulCardCapabilities & MIB_CA_DEVICE_CAPS_MASK_A_MODE) &&
(psWlan->ulNetworkTypeInUse == Ndis802_11OFDM5) )
{
DBG_LEV1(("A mode not supported, switching to B/G mode\n"));
psWlan->ulNetworkTypeInUse = Ndis802_11OFDM24;
vENDsetDefaultRateSet( psWlan->ulNetworkTypeInUse, psWlan->ucSupportedRates, psWlan->ucDesiredRates );
}
break;
}
}
else
{
DBG_LEV0(("ERROR: Get MIB request failed, item 0x%x, error %d.\n",
psGetMib->u16ObjectID, psGetMib->u16Status));
}
// Handle the pending OID request if necessary.
if ( (psPendingOID->ulOid == OID_COMMASIC_RX_BUF_OVERFLOW_CT &&
psGetMib->u16ObjectID == MIB_RX_BUF_OVERFLOW_COUNT) ||
(psPendingOID->ulOid == OID_COMMASIC_RX_STATS &&
psGetMib->u16ObjectID == MIB_UWA_RX_STATS_SEGM3) ||
(psPendingOID->ulOid == OID_COMMASIC_SNR &&
psGetMib->u16ObjectID == MIB_SNR))/*||
psPendingOID->ulOid == OID_COMMASIC_GET_MIB_ATTR )*/
{
// Clear the pending OID flag.
tmpOid = psPendingOID->ulOid; // save for debug print
psPendingOID->ulOid = 0;
if ( psGetMib->u16Status == UMI_OK )
{
switch ( psGetMib->u16ObjectID )
{
case MIB_SNR:
*(PULONG)psPendingOID->pvBuffer = psWlan->lSnr;
*psPendingOID->pulBytesWritten = sizeof( LONG );
break;
case MIB_RX_BUF_OVERFLOW_COUNT:
*(PULONG)psPendingOID->pvBuffer = psWlan->ulRxOverflows;
*psPendingOID->pulBytesWritten = sizeof( ULONG );
break;
case MIB_UWA_RX_STATS_SEGM3:
OS_MEMCPY(psPendingOID->pvBuffer, &psWlan->ulUwaRxStats, 4*MIB_UWA_RX_STATS_LENGTH);
*psPendingOID->pulBytesWritten = 4*MIB_UWA_RX_STATS_LENGTH;
break;
}
iStatus = NDIS_STATUS_SUCCESS;
iCurOIDStatus = iStatus;
}
// Complete the prior pending OID request.
NdisMQueryInformationComplete( psAdapter->hMiniportAdapterHandle, iStatus );
DBG_LEV2(("PENDING Query Completed for OID 0x%x\n", tmpOid));
}
if ( psAdapter->eNetState == NET_SETUP )
{
if ( psGetMib->u16ObjectID == MIB_IEEE_ADDRESS )
{
vHALsendGetMibReq( psHAL, MIB_CA_DEVICE_CAPS );
}
else if ( psGetMib->u16ObjectID == MIB_CA_DEVICE_CAPS )
{
// Start to set MIB.
vHALstartMACconfiguration( psHAL );
}
}
vHALHandleGetMibAttrReq(psHAL, psMsg);
}
//-----------------------------------------------------------------------------
//
// NAME vHALsendSetMibReq
//
// PARAMETERS psHAL Pointer to HAL context.
// u16MibId MIB Id.
// puValue Pointer to MIB data.
//
// DESCRIPTION This function sends a Set MIB request message to Target.
//
//-----------------------------------------------------------------------------
VOID
vHALsendSetMibReq( IN PHAL_CONTEXT psHAL, IN MIB_ID u16MibId, IN MIB_VALUE * puValue )
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -