📄 rxproc.c
字号:
// get a free packet
pPacketNode = (PPACKET_QUEUE_NODE)PopFirstQNode(&Adapter->RxPacketFreeQueue);
// return the pointer of the packet
*p_PPacket = pPacketNode->pPacket;
Adapter->sNumOutstandingRxPacket++;
NdisReleaseSpinLock(&Adapter->RxQueueSpinLock);
DBGPRINT(DBG_RXDATA, ("Packet 0x%x allocated, NumOutstandingRxPacket = %d\n",
pPacketNode->pPacket,
Adapter->sNumOutstandingRxPacket));
#endif
return GPS_SUCCESS;
}
/******************************************************************************
*
* Name: ReturnRxPacketDesc()
*
* Description: Return a RX Packet descriptor
*
* Arguments: PMRVDRV_ADAPTER Adapter
*
* Return Value: NONE
*
* Notes:
*
*****************************************************************************/
VOID
ReturnRxPacketDesc(PMRVDRV_ADAPTER Adapter,
PNDIS_PACKET pPacket)
{
#ifdef USE_RX_QUEUE
PPACKET_QUEUE_NODE pPacketNode = *((PACKET_QUEUE_NODE **)pPacket->MiniportReserved);
NdisAcquireSpinLock(&Adapter->RxQueueSpinLock);
if ( Adapter->sNumOutstandingRxPacket <= 0 )
{
DBGPRINT(DBG_ERROR, ("ERROR: numOutstandingPacket already 0 before subtraction!!\n"));
NdisReleaseSpinLock(&Adapter->RxQueueSpinLock);
return;
}
InsertQNodeFromHead(&Adapter->RxPacketFreeQueue, pPacketNode);
Adapter->sNumOutstandingRxPacket--;
DBGPRINT(DBG_RXDATA, ("PacketNode(0x%x) with Packet(0x%x) returned, NumOutstandingRxPacket = %d\n",
pPacketNode,
pPacketNode->pPacket,
Adapter->sNumOutstandingRxPacket));
NdisReleaseSpinLock(&Adapter->RxQueueSpinLock);
#endif
}
UCHAR
wlan_getAvgSNR(PMRVDRV_ADAPTER Adapter)
{
UCHAR i;
USHORT temp = 0;
if (Adapter->numSNRNF == 0)
return 0;
for (i = 0; i <Adapter->numSNRNF; i++)
temp += Adapter->rawSNR[i];
return (UCHAR)(temp/Adapter->numSNRNF);
}
UCHAR
wlan_getAvgNF(PMRVDRV_ADAPTER Adapter)
{
UCHAR i;
USHORT temp = 0;
if (Adapter->numSNRNF == 0)
return 0;
for (i = 0; i <Adapter->numSNRNF; i++)
temp += Adapter->rawNF[i];
return (UCHAR)(temp/Adapter->numSNRNF);
}
VOID
wlan_save_rawSNRNF(PMRVDRV_ADAPTER Adapter, RxPD * pRxPD)
{
/// AllenDBGPRINT(DBG_ALLEN, ("pRxPD->SNR = %d, pRxPD->NF = %d\n", pRxPD->SNR, pRxPD->NF));
if (Adapter->numSNRNF < Adapter->data_avg_factor)
Adapter->numSNRNF++;
Adapter->rawSNR[Adapter->nextSNRNF] = pRxPD->SNR;
Adapter->rawNF[Adapter->nextSNRNF] = pRxPD->NF;
Adapter->nextSNRNF++;
if (Adapter->nextSNRNF >= Adapter->data_avg_factor)
Adapter->nextSNRNF = 0;
return;
}
VOID
wlan_compute_rssi(PMRVDRV_ADAPTER Adapter, RxPD *pRxPD)
{
ULONG CurrentTime, Diff;
Adapter->SNR[TYPE_RXPD][TYPE_AVG] / AVG_SCALE,
Adapter->NF[TYPE_RXPD][TYPE_AVG] / AVG_SCALE;
Adapter->SNR[TYPE_RXPD][TYPE_NOAVG] = pRxPD->SNR;
Adapter->NF[TYPE_RXPD][TYPE_NOAVG] = pRxPD->NF;
NdisGetSystemUpTime(&CurrentTime); // unit = 1/1000 sec
if (CurrentTime >= Adapter->RxPDSNRAge)
Diff = CurrentTime - Adapter->RxPDSNRAge;
else
Diff = (0xffffffff - Adapter->RxPDSNRAge) + CurrentTime;
if (Diff > RXPD_SNR_AGEOUT_TIME)
{
Adapter->numSNRNF = 0;
Adapter->nextSNRNF = 0;
}
wlan_save_rawSNRNF(Adapter , pRxPD);
Adapter->RxPDSNRAge = CurrentTime;
///AllenDBGPRINT(DBG_ALLEN, ("NdisGetSystemUpTime = %08x \n", Adapter->RxPDSNRAge));
Adapter->SNR[TYPE_RXPD][TYPE_AVG] = wlan_getAvgSNR(Adapter) * AVG_SCALE;
Adapter->NF[TYPE_RXPD][TYPE_AVG] = wlan_getAvgNF(Adapter ) * AVG_SCALE;
///AllenDBGPRINT(DBG_ALLEN, ("After computing SNR: SNR-avg = %d, NF-avg = %d\n",
/// Adapter->SNR[TYPE_RXPD][TYPE_AVG] / AVG_SCALE,
/// Adapter->NF[TYPE_RXPD][TYPE_AVG] / AVG_SCALE));
Adapter->RSSI[TYPE_RXPD][TYPE_NOAVG] =
CAL_RSSI(Adapter->SNR[TYPE_RXPD][TYPE_NOAVG],
Adapter->NF[TYPE_RXPD][TYPE_NOAVG]);
Adapter->RSSI[TYPE_RXPD][TYPE_AVG] =
CAL_RSSI(Adapter->SNR[TYPE_RXPD][TYPE_AVG] / AVG_SCALE,
Adapter->NF[TYPE_RXPD][TYPE_AVG] / AVG_SCALE);
///AllenDBGPRINT(DBG_ALLEN, ("After computing RSSI = %d, RSSI-avg = %d\n",
/// (Adapter->RSSI[TYPE_RXPD][TYPE_NOAVG]),
/// (Adapter->RSSI[TYPE_RXPD][TYPE_AVG])));
return;
}
/******************************************************************************
*
* Name: HandleRxReadyEvent()
*
* Description: Rx ready event handler
*
* Arguments: PMRVDRV_ADAPTER Adapter
*
* Return Value:
*
* Notes:
*
*****************************************************************************/
VOID
HandleRxReadyEvent(
IN PMRVDRV_ADAPTER Adapter)
{
ULONG ulFramlen;
int IsRxOK = 0;
PRxPD pRxPDCurrent;
PCF_OBJECT pCf = Adapter->hwIface;
#ifdef USE_RX_QUEUE
MRVDRV_GET_PACKET_STATUS qStatus;
PNDIS_PACKET pPacket;
NDIS_STATUS pStatus;
PNDIS_BUFFER pBuffer;
UINT bufferLength;
PVOID pRxBufVM;
#else
ULONG ulLookAhead;
#endif
/// AllenDBGPRINT(DBG_RXDATA | DBG_CRLF,("+HandleRxReadyEvent()\n"));
//NdisAcquireSpinLock(&Adapter->RxSpinLock);
/// read a frame from FW
IsRxOK = ReadRxFrame(Adapter, &ulFramlen);
if (IsRxOK == 0)
{
DBGPRINT(DBG_RXDATA | DBG_CRLF,("Read rx frame error \n"));
///RETAILMSG(1, (TEXT("Read rx frame error \r\n")));
//NdisReleaseSpinLock(&Adapter->RxSpinLock);
return;
}
/// Check RxPD status and update 802.3 stat, we should have more bits to test
pRxPDCurrent = (PRxPD)(&Adapter->RxPD);
if (pRxPDCurrent->Status & MRVDRV_RXPD_STATUS_OK)
{
Adapter->RcvOK++;
Adapter->DirectedFramesRcvOK++;
///RETAILMSG(1, (TEXT(" receive Date Rate = %x \r\n"), pRxPDCurrent->RxRate));
switch ( pRxPDCurrent->RxRate )
{
case FRAME_STATUS_LINK_SPEED_1mbps :
Adapter->LinkSpeed = MRVDRV_LINK_SPEED_1mbps;
break;
case FRAME_STATUS_LINK_SPEED_2mbps :
Adapter->LinkSpeed = MRVDRV_LINK_SPEED_2mbps;
break;
case FRAME_STATUS_LINK_SPEED_5dot5mbps :
Adapter->LinkSpeed = MRVDRV_LINK_SPEED_5dot5mbps;
break;
case FRAME_STATUS_LINK_SPEED_11mbps :
Adapter->LinkSpeed = MRVDRV_LINK_SPEED_11mbps;
break;
case FRAME_STATUS_LINK_SPEED_6mbps :
Adapter->LinkSpeed = MRVDRV_LINK_SPEED_6mbps;
break;
case FRAME_STATUS_LINK_SPEED_9mbps :
Adapter->LinkSpeed = MRVDRV_LINK_SPEED_9mbps;
break;
case FRAME_STATUS_LINK_SPEED_12mbps :
Adapter->LinkSpeed = MRVDRV_LINK_SPEED_12mbps;
break;
case FRAME_STATUS_LINK_SPEED_18mbps :
Adapter->LinkSpeed = MRVDRV_LINK_SPEED_18mbps;
break;
case FRAME_STATUS_LINK_SPEED_24mbps :
Adapter->LinkSpeed = MRVDRV_LINK_SPEED_24mbps;
break;
case FRAME_STATUS_LINK_SPEED_36mbps :
Adapter->LinkSpeed = MRVDRV_LINK_SPEED_36mbps;
break;
case FRAME_STATUS_LINK_SPEED_48mbps :
Adapter->LinkSpeed = MRVDRV_LINK_SPEED_48mbps;
break;
case FRAME_STATUS_LINK_SPEED_54mbps :
Adapter->LinkSpeed = MRVDRV_LINK_SPEED_54mbps;
break;
default :
Adapter->LinkSpeed = MRVDRV_LINK_SPEED_11mbps;
break;
}
wlan_compute_rssi (Adapter, pRxPDCurrent);
if ((Adapter->RSSI[TYPE_RXPD][TYPE_AVG] > -10) || (Adapter->RSSI[TYPE_RXPD][TYPE_AVG] < -200))
{
DBGPRINT(DBG_ERROR, ("ERROR: Incorrect RSSI Value2 - SNR = %d, "
"NF= %d, Adapter->RSSI[TYPE_RXPD][TYPE_AVG] = %d, Adapter->LastRSSI = %d\n",
pRxPDCurrent->SNR,
pRxPDCurrent->NF,
Adapter->RSSI[TYPE_RXPD][TYPE_AVG],
Adapter->LastRSSI));
}
else
{
Adapter->LastRSSI = Adapter->RSSI[TYPE_RXPD][TYPE_AVG];
}
if (Adapter->LastRSSI <= Adapter->RSSITriggerValue)
{
// Increment RSSITriggerCounter
Adapter->RSSITriggerCounter++;
}
else
{
// Reset the counter if RSSI goes above the trigger level
if (Adapter->RSSITriggerCounter !=0)
Adapter->RSSITriggerCounter=0;
}
// If the trigger occurs many times, send indication above
if (Adapter->RSSITriggerCounter >= MRVDRV_RSSI_INDICATION_THRESHOLD)
{
// Indicate to protocol driver about RSSI status
NdisMIndicateStatus(Adapter->MrvDrvAdapterHdl,
NDIS_STATUS_MEDIA_SPECIFIC_INDICATION,
&(Adapter->LastRSSI),
sizeof(LONG));
NdisMIndicateStatusComplete(Adapter->MrvDrvAdapterHdl);
// Reset the counter
Adapter->RSSITriggerCounter=0;
}
///AllenDBGPRINT(DBG_RXDATA, ("HandleRxReadyEvent: RSSI: pRxPDCurrent->SNR = %d,pRxPDCurrent->NF= %d \n Adapter->RSSI[TYPE_BEACON][TYPE_NOAVG] = %d \n Adapter->RSSI[TYPE_BEACON][TYPE_AVG]= %d\n Adapter->LastRSSI=%d\n",
/// pRxPDCurrent->SNR,
/// pRxPDCurrent->NF,
/// Adapter->RSSI[TYPE_RXPD][TYPE_NOAVG],
/// Adapter->RSSI[TYPE_RXPD][TYPE_AVG],
/// Adapter->LastRSSI));
}
else
{
DBGPRINT(DBG_RXDATA | DBG_WARNING,("WARNING: frame received with bad status\n"));
///RETAILMSG(1, (TEXT("WARNING: frame received with bad status \r\n")));
}
if ( Adapter->bIsPendingReset == TRUE )
return;
if (Adapter->bIsFreeNow == TRUE)
return;
//return;
/// Get a packet then fill it and indicate to NDIS
#ifdef USE_RX_QUEUE
qStatus = GetRxPacketDesc(Adapter, &pPacket);
if (qStatus == GPS_FAILED)
{
DBGPRINT( DBG_RXDATA | DBG_WARNING,("Unable to obtain packet descriptor, just drop packet\n"));
//NdisReleaseSpinLock(&Adapter->RxSpinLock);
return;
}
NdisQueryPacket(pPacket, NULL, NULL, &pBuffer, NULL);
NdisQueryBufferSafe(pBuffer, &pRxBufVM, &bufferLength, HighPagePriority);
if (Adapter->MediaConnectStatus == NdisMediaStateConnected)
{
Adapter->ulRxByteInLastPeriod += Adapter->ulRxSize;
NdisAdjustBufferLength(pBuffer, Adapter->ulRxSize);
NdisMoveMemory( pRxBufVM, Adapter->pRxBuf, Adapter->ulRxSize);
NDIS_SET_PACKET_STATUS(pPacket, NDIS_STATUS_SUCCESS);
if (Adapter->bIsRxIndicatePacket == FALSE)
{
NdisMIndicateReceivePacket(Adapter->MrvDrvAdapterHdl, &pPacket, 1);
pStatus = NDIS_GET_PACKET_STATUS(pPacket);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -