rxproc.c
来自「marvell8385 GSPI开发驱动」· C语言 代码 · 共 837 行 · 第 1/2 页
C
837 行
//int ii;
//MRVDRV_GET_PACKET_STATUS qStatus;
PNDIS_PACKET pPacket;
NDIS_STATUS pStatus;
//PNDIS_BUFFER pBuffer;
//UINT bufferLength;
//PVOID pRxBufVM;
//RxPD RxPD;
#ifndef NEW_RSSI
SHORT sNF;
LONG CurRSSI;
#ifndef MRV_CHIP_8385PN
SHORT sSNR;
#endif
#endif
//USHORT i;
DBGPRINT(DBG_RXDATA | DBG_CRLF,("+HandleRxReadyEvent()\n"));
// RETAILMSG(1,(TEXT("[Marvell]+HandleRxReadyEvent")));
/// Check RxPD status and update 802.3 stat, we should have more bits to test
//pRxPDCurrent = (PRxPD)(&Adapter->RxPD1);
pRxPDCurrent = (PRxPD)(Adapter->pRxPD1);
/* dralee mask out, dummy checking
//lykao, 061605
if ( Adapter->ulRxSize == 0 ||
Adapter->ulRxSize > MRVDRV_ETH_RX_PACKET_BUFFER_SIZE )
{
DBGPRINT(DBG_ERROR,("RECV Got Huge packet size %d discarding\n",
Adapter->ulRxSize));
RETAILMSG(1, (L"[Marvell]HandleRxReadyEvent:Error!! Adapter->ulRxSize = %ld", Adapter->ulRxSize ));
return;
}
*/
//HexDump(DBG_RXDATADUMP, "RX Buffer", (PUCHAR)(&Adapter->RxPD1), sizeof(RxPD));
//HexDump(DBG_RXDATADUMP, "RX Buffer", (PUCHAR)Adapter->pRxBuf, Adapter->ulRxSize);
//lykao, 060905, begin
if (pRxPDCurrent->Status & MRVDRV_RXPD_STATUS_OK)
{
#ifdef DEBUG_PARA_ROAMING
priv.iRxDataCount++;
#endif
Adapter->RcvOK++;
Adapter->DirectedFramesRcvOK++;
#if 1
if((Adapter->RcvOK%20) == 0)
{
#ifdef NEW_RSSI
DBGPRINT(DBG_RXDATA ,("RxPD: SNR = %d, NF = %d\n", pRxPDCurrent->RSSI, pRxPDCurrent->NF));
DBGPRINT(DBG_RXDATA ,("Before computing SNR and NF\n"));
DBGPRINT(DBG_RXDATA,("Adapter: SNR- avg = %d, NF-avg = %d\n", Adapter->SNR[TYPE_RXPD][TYPE_AVG] / AVG_SCALE, Adapter->NF[TYPE_RXPD][TYPE_AVG] / AVG_SCALE));
Adapter->SNR[TYPE_RXPD][TYPE_NOAVG] = pRxPDCurrent->RSSI;
Adapter->NF[TYPE_RXPD][TYPE_NOAVG] = pRxPDCurrent->NF;
//Adapter->RxPDSNRAge = os_time_get();
/*
* Average out the SNR from the received packet
*/
Adapter->SNR[TYPE_RXPD][TYPE_AVG] =
CAL_AVG_SNR_NF(Adapter->SNR[TYPE_RXPD][TYPE_AVG], pRxPDCurrent->RSSI);
/*
* Average out the NF value
*/
Adapter->NF[TYPE_RXPD][TYPE_AVG] =
CAL_AVG_SNR_NF(Adapter->NF[TYPE_RXPD][TYPE_AVG], pRxPDCurrent->NF);
DBGPRINT(DBG_RXDATA ,("After computing SNR and NF\n"));
DBGPRINT(DBG_RXDATA ,("Adapter: SNR- avg = %d, NF-avg = %d\n", (Adapter->SNR[TYPE_RXPD][TYPE_AVG] / AVG_SCALE), (Adapter->NF[TYPE_RXPD][TYPE_AVG] / AVG_SCALE)));
/*
* store the RXPD values in SNRNF variable,
* which is present in adapter structure
*/
Adapter->SNRNF[SNR_RXPD][TYPE_NOAVG] =
(UCHAR)Adapter->SNR[TYPE_RXPD][TYPE_NOAVG];
Adapter->SNRNF[SNR_RXPD][TYPE_AVG] =
(Adapter->SNR[TYPE_RXPD][TYPE_AVG] / AVG_SCALE);
Adapter->SNRNF[NF_RXPD][TYPE_NOAVG] =
(UCHAR)Adapter->NF[TYPE_RXPD][TYPE_NOAVG];
Adapter->SNRNF[NF_RXPD][TYPE_AVG] =
(Adapter->NF[TYPE_RXPD][TYPE_AVG] / AVG_SCALE);
// NOTE: Adapter->SNRNF[SNR_BEACON][X] - represents BEACON for SNR
// Adapter->SNRNF[NF_BEACON][X] - represents BEACON for NF
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));
//DBGPRINT(DBG_RXDATA, ("1HandleRxReadyEvent: RSSI: pRxPDCurrent->SNR = %d,pRxPDCurrent->NF= %d,Adapter->RSSI[TYPE_BEACON][TYPE_NOAVG] = %d, Adapter->RSSI[TYPE_BEACON][TYPE_AVG]= %d, Adapter->LastRSSI=%d\n",
// pRxPDCurrent->RSSI,
// pRxPDCurrent->NF,
// Adapter->RSSI[TYPE_RXPD][TYPE_NOAVG],
// Adapter->RSSI[TYPE_RXPD][TYPE_AVG],
// Adapter->LastRSSI));
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->RSSI,
pRxPDCurrent->NF,
Adapter->RSSI[TYPE_RXPD][TYPE_AVG],
Adapter->LastRSSI));
}
else
{
if (Adapter->LastRSSI == MRVL_DEFAULT_INITIAL_RSSI)
{
Adapter->LastRSSI = Adapter->RSSI[TYPE_RXPD][TYPE_AVG];
}else
{
Adapter->LastRSSI = ((Adapter->LastRSSI * 3)+(Adapter->RSSI[TYPE_RXPD][TYPE_AVG]))/4;
}
}
#ifdef DEBUG_PARA_ROAMING
if(Adapter->MediaConnectStatus == NdisMediaStateConnected)
{
if (++priv.RSSITriggerCounter < RXDATA_RSSI_INTERVAL) {
//#ifdef DEBUG_PARA_ROAMING_PRINT
// RETAILMSG(1,(TEXT("\n###Rx Data Package(%d)'s RSSI = %d ###\n"),
// priv.RSSITriggerCounter,Adapter->LastRSSI));
//#endif
priv.RSSIAverage += Adapter->LastRSSI;
}
else
{
priv.RSSIAverage += Adapter->LastRSSI;
priv.RSSIAverage /= RXDATA_RSSI_INTERVAL;
#ifdef DEBUG_PARA_ROAMING_PRINT
RETAILMSG(1,(TEXT("\n###Rx Data Package's RSSI Average(every %d Packages) = %d ###\n"),
RXDATA_RSSI_INTERVAL,priv.RSSIAverage));
#endif
#ifdef CONFIG_VERTICAL_HANDOFF
if (priv.RSSIAverage < priv.VerticalHandoffCfg.RoveOut_RSSIThreshold)
#else
if (priv.RSSIAverage < PARA_RSSI_ROAMING_THRESHOLD)
#endif
{
if((!priv.bAutoRoamingInProcess)&&(!priv.bManualRoamingInProcess))
{
#ifdef DEBUG_PARA_ROAMING_PRINT
RETAILMSG(1,(TEXT("If data busy,wake up auto-roaming!Caused by Average RSSI = %d...\n"),
priv.RSSIAverage));
#endif
#ifdef CONFIG_WLAN_PMU
if(wlan_PMUCheckWlanAppState ())
#endif
{
priv.bFastAutoRoaming = TRUE;
#ifdef DEBUG_PARA_ROAMING_PRINT
ParaPrintFile("\n[HandleRxReadyEvent]RxData is busy and signal is lower!Wake up auto-roaming!!!!\n");
#endif
SetEvent(priv.hAutoRoamingEvent);
}
}
}
#ifdef CONFIG_VERTICAL_HANDOFF
else if (priv.RSSIAverage < (priv.VerticalHandoffCfg.RoveOut_RSSIThreshold + 10))
#else
else if (priv.RSSIAverage < PARA_RSSI_SMARTSCAN_THRESHOLD)
#endif
{
if(!priv.bWlanSmartDetectionInProcess)
{
#ifdef DEBUG_PARA_ROAMING_PRINT
RETAILMSG(1,(TEXT("Wake up wlan smart detection!Caused by Average RSSI = %d...\n"),
priv.RSSIAverage));
#endif
#ifdef CONFIG_WLAN_PMU
if(wlan_PMUCheckWlanAppState ())
#endif
{
SetEvent(priv.hWlanSmartDetectionEvent);
}
}
}
priv.RSSITriggerCounter = 0;
priv.RSSIAverage = 0;
}
}
#else //else of #ifdef DEBUG_PARA_ROAMING
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)
{
#ifdef DEBUG_PARA_ROAMING_PRINT
RETAILMSG(1,(TEXT("Indicate to protocol driver about RSSI status when RSSI lowers down many times!!!\n")));
#endif
// 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;
}
#endif //end of elsedef DEBUG_PARA_ROAMING
DBGPRINT(DBG_RXDATA, ("2HandleRxReadyEvent: RSSI: pRxPDCurrent->SNR = %d,pRxPDCurrent->NF= %d,Adapter->RSSI[TYPE_BEACON][TYPE_NOAVG] = %d, Adapter->RSSI[TYPE_BEACON][TYPE_AVG]= %d, Adapter->LastRSSI=%d\n",
pRxPDCurrent->RSSI,
pRxPDCurrent->NF,
Adapter->RSSI[TYPE_RXPD][TYPE_NOAVG],
Adapter->RSSI[TYPE_RXPD][TYPE_AVG],
Adapter->LastRSSI));
#else //NEW_RSSI
//CHAR cNF;
//LONG CurRSSI;
#ifdef MRV_CHIP_8385PN
{
//cNF =-(SHORT)(~(pRxPDCurrent->NF )&0X7F);
//CurRSSI = pRxPDCurrent->RSSI + cNF;
sNF =-((SHORT)((pRxPDCurrent->NF & 0X7F) + 5));
CurRSSI = -((SHORT)((pRxPDCurrent->SNR & 0X7F) + 5));
}
#elif defined( MRV_CHIP_8686PN) //dralee_1209
{
sNF =-((SHORT)((pRxPDCurrent->NF & 0X7F) + 5));
CurRSSI = -((SHORT)((pRxPDCurrent->SNR & 0X7F) + 5));
}
#else
{
//cNF = pRxPDCurrent->NF << 2;
//cNF -= 96;
//cNF -= 60;
//CurRSSI = pRxPDCurrent->RSSI + cNF;
sNF = -((SHORT)((pRxPDCurrent->NF & 0X7F) + 30 + 5));
sSNR = (SHORT)((pRxPDCurrent->SNR & 0X7F)
CurRSSI = sSNR + sNF;
}
#endif
DBGPRINT(DBG_RXDATA, ("Print Rx RSSI Value - SNR = %d, "
"NFRaw = %d, NF = %d, RSSI = %d\n",
pRxPDCurrent->SNR,
pRxPDCurrent->NF,
sNF,
Adapter->LastRSSI));
if ((CurRSSI > 0) || (CurRSSI < -200))
{
DBGPRINT(DBG_ERROR, ("ERROR: Incorrect RSSI Value2 -CurRSSI = %d, SNR = %d, "
"NFRaw = %d, NF = %d, Ave = %d\n",
CurRSSI,
pRxPDCurrent->SNR,
pRxPDCurrent->NF,
sNF,
Adapter->LastRSSI));
}
else
{
if (Adapter->LastRSSI == MRVL_DEFAULT_INITIAL_RSSI)
{
Adapter->LastRSSI = CurRSSI;
}
else
{
Adapter->LastRSSI = ((Adapter->LastRSSI*7)+CurRSSI)>>3;
}
}
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;
}
//lykao, 060905, end
#endif //NEW_RSSI
}
#endif //0
}
else
{
DBGPRINT(DBG_RXDATA | DBG_WARNING,("WARNING: frame received with bad status\n"));
RETAILMSG(1,(TEXT("[Marvell]HandleRxReadyEvent:WARNING: frame received with bad status")));
#ifdef TX_PRY_Q_EXTRA
//dralee++ 09212005 for error handling
pPacket = Adapter->pRxCurPkt;
Adapter->pRxCurPkt = NULL;
if( pPacket )
ReturnRxPacketDesc(Adapter,pPacket);
#endif
return;
}
pPacket = Adapter->pRxCurPkt;
Adapter->pRxCurPkt = NULL;
if (Adapter->MediaConnectStatus == NdisMediaStateConnected)
{
//PRxPD pRxPD = (PRxPD)(Adapter->pRxPD1);
Adapter->ulRxByteInLastPeriod += Adapter->ulRxSize;
//pPacket = Adapter->pRxCurPkt;
NDIS_SET_PACKET_STATUS(pPacket, NDIS_STATUS_SUCCESS);
//NdisAdjustBufferLength(pBuffer, Adapter->ulRxSize);
//NdisMoveMemory( pRxBufVM, Adapter->pRxBuf, Adapter->ulRxSize);
//lykao, 062005
//NDIS_SET_PACKET_STATUS(pPacket, NDIS_STATUS_SUCCESS);
//NDIS_SET_PACKET_STATUS(pPacket, NDIS_STATUS_RESOURCES);
//RETAILMSG(1,(TEXT("[Marvell]HandleRxReadyEvent: before NdisMIndicateReceivePacket ")));
NdisMIndicateReceivePacket(Adapter->MrvDrvAdapterHdl, &pPacket, 1);
//RETAILMSG(1,(TEXT("[Marvell]HandleRxReadyEvent: after NdisMIndicateReceivePacket ")));
//lykao, 061805
// for(i=0;i<50;i++);
pStatus = NDIS_GET_PACKET_STATUS(pPacket);
if ((pStatus == NDIS_STATUS_RESOURCES) || (pStatus == NDIS_STATUS_SUCCESS))
{
// return packet
DBGPRINT(DBG_RXDATA, ("Packet returned success or resources...\n"));
//lykao, 062005
//if(pStatus == NDIS_STATUS_RESOURCES)
//{
// RETAILMSG(1,(TEXT("[Marvell]HandleRxReadyEvent:Packet returned Resources")));
//}else
//{
// //RETAILMSG(1,(TEXT("[Marvell]HandleRxReadyEvent:Packet returned Success")));
// }
//RETAILMSG(1,(TEXT("[Marvell]HandleRxReadyEvent: ReturnRxpacketDesc")));
ReturnRxPacketDesc(Adapter,pPacket);
}
else
{
///RETAILMSG(1,(TEXT("[Marvell]HandleRxReadyEvent:Packet returned pending...")));
DBGPRINT(DBG_RXDATA, ("Packet returned pending...\n"));
}
}
else
{
DBGPRINT(DBG_RXDATA, ("Not connected, packet was dropped...\n"));
RETAILMSG(1,(TEXT("[Marvell]HandleRxReadyEvent:Not connected, packet was dropped...ReturnRxPacketDesc")));
ReturnRxPacketDesc(Adapter,pPacket);
}
//RETAILMSG(1,(TEXT("[Marvell]-HandleRxReadyEvent")));
DBGPRINT(DBG_RXDATA,("-HandleRxReadyEvent()\n\n"));
return;
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?