📄 rxproc.c
字号:
{
DBGPRINT(DBG_ERROR, ("ERROR: numOutstandingPacket already 0 before subtraction!!\n"));
NdisReleaseSpinLock(&Adapter->RxQueueSpinLock);
return;
}
//lykao, 062005
if(Adapter->sNumOutstandingRxPacket>1)
{
//NKDbgPrintfW(L"[Marvell]ReturnRxPacketDesc:Error!!NumOutstandingRxPacket = %d\n", Adapter->sNumOutstandingRxPacket);
}
Adapter->sNumOutstandingRxPacket--;
DBGPRINT(DBG_RXDATA, ("PacketNode(0x%x) with Packet(0x%x) returned, NumOutstandingRxPacket = %d\n",
pPacketNode,
pPacketNode->pPacket,
Adapter->sNumOutstandingRxPacket));
NdisReleaseSpinLock(&Adapter->RxQueueSpinLock);
//RETAILMSG(1,(TEXT("[Marvell]-ReturnRxPacketDesc")));
}
#ifdef NEW_RSSI
/******************************************************************************
*
* Name: wlan_compute_rssi()
*
* Description: This function computes the RSSI in received packet
*
* Arguments: PMRVDRV_ADAPTER Adapter: A pointer to wlan adapter structure
RxPD pRxPDCurrent: A pointer to RxPD structure of received packet
*
* Return Value: NONE
*
* Notes:
*
*****************************************************************************/
__inline
VOID
wlan_compute_rssi(PMRVDRV_ADAPTER Adapter, PRxPD pRxPDCurrent)
{
DBGPRINT(DBG_RXDATA ,("RxPD: SNR = %d, NF = %d\n", pRxPDCurrent->SNR, 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));
//Ling++, 012006
// V5DbgMsg( (L"[Marvell]NEW_RSSI:RxPD: SNR = %d, NF = %d\n", pRxPDCurrent->SNR, pRxPDCurrent->NF));
// V5DbgMsg( (L"[Marvell]NEW_RSSI:Befroe 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) );
//Ling--, 012006
Adapter->SNR[TYPE_RXPD][TYPE_NOAVG] = pRxPDCurrent->SNR;
Adapter->NF[TYPE_RXPD][TYPE_NOAVG] = pRxPDCurrent->NF;
Adapter->RxPDRate = pRxPDCurrent->RxRate;
//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->SNR,Adapter->data_avg_factor);
/* Average out the NF value */
Adapter->NF[TYPE_RXPD][TYPE_AVG] =
CAL_AVG_SNR_NF(Adapter->NF[TYPE_RXPD][TYPE_AVG], pRxPDCurrent->NF, Adapter->data_avg_factor);
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)));
//Ling++, 012006
//V5DbgMsg( (L"[Marvell]NEW_RSSI:Aftter 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) );
//Ling--, 012006
Adapter->RSSI[TYPE_RXPD][TYPE_NOAVG] =
(SHORT)CAL_RSSI(Adapter->SNR[TYPE_RXPD][TYPE_NOAVG],
Adapter->NF[TYPE_RXPD][TYPE_NOAVG]);
//Ling++, 012706, update RSSI[TYPE_RXPD][TYPE_AVG]
if(Adapter->LastRSSI==Adapter->RSSI[TYPE_BEACON][TYPE_AVG] )
{
if((Adapter->RSSI[TYPE_RXPD][TYPE_AVG]-Adapter->LastRSSI)>Adapter->RSSI_Range ||(Adapter->RSSI[TYPE_RXPD][TYPE_AVG] -Adapter->LastRSSI)< Adapter->NegativeRSSI_Range )
Adapter->RSSI[TYPE_RXPD][TYPE_AVG] = Adapter->RSSI[TYPE_BEACON][TYPE_AVG];
}
//Ling--, 012706
Adapter->RSSI[TYPE_RXPD][TYPE_AVG] =
(SHORT)CAL_RSSI(Adapter->SNR[TYPE_RXPD][TYPE_AVG] / AVG_SCALE,
Adapter->NF[TYPE_RXPD][TYPE_AVG] / AVG_SCALE);
Adapter->ulRSSITickCount=GetTickCount();
//Ling++, 012006
//V5DbgMsg( (L"[Marvell]NEW_RSSI:Aftter computing Adapter->ulRSSITickCount=%ld, RSSI-Avg = %d, RSSI-noAvg = %d\n", Adapter->ulRSSITickCount, Adapter->RSSI[TYPE_RXPD][TYPE_AVG], Adapter->RSSI[TYPE_RXPD][TYPE_NOAVG]) );
//Ling--, 012006
if ((Adapter->RSSI[TYPE_RXPD][TYPE_AVG] > -10) || (Adapter->RSSI[TYPE_RXPD][TYPE_AVG] < -200))
{
//Ling++, 011206
if(Adapter->MediaConnectStatus == NdisMediaStateConnected)
{
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));
//Ling++, 011206
V5DbgMsg( (L"[Marvell]NEW_RSSI:RSSI-Avg = %d, >-10 and <-200\n", Adapter->RSSI[TYPE_RXPD][TYPE_AVG]) );
//Ling--, 011206
}
//Ling--, 011206
}
else
{
Adapter->LastRSSI = (LONG)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);
//Ling++, 012006
// V5DbgMsg( (L"[Marvell]NEW_RSSI:Adapter->RSSITriggerCounter = %d, Adapter->RSSITriggerValue=%d, indicate RSSI status\n", Adapter->RSSITriggerCounter, Adapter->RSSITriggerValue) );
//Ling--, 012006
// Reset the counter
Adapter->RSSITriggerCounter=0;
}
}
#endif
/******************************************************************************
*
* Name: HandleRxReadyEvent()
*
* Description: Rx ready event handler
*
* Arguments: PMRVDRV_ADAPTER Adapter
*
* Return Value:
*
* Notes:
*
*****************************************************************************/
VOID
HandleRxReadyEvent(
IN PMRVDRV_ADAPTER Adapter)
{
int IsRxOK = 0;
PRxPD pRxPDCurrent;
PNDIS_PACKET pPacket;
NDIS_STATUS pStatus;
#ifndef NEW_RSSI
SHORT sNF;
LONG CurRSSI;
#ifndef MRV_CHIP_8385 ///#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)
{
Adapter->RcvOK++;
Adapter->DirectedFramesRcvOK++;
#ifdef NEW_RSSI
wlan_compute_rssi(Adapter,pRxPDCurrent);
#else //NEW_RSSI
#if (defined(MRV_CHIP_8385)||defined(MRV_CHIP_8388)||defined(MRV_CHIP_8686))
///#ifdef MRV_CHIP_8385PN / defined(MRV_CHIP_8388) / #elif defined( MRV_CHIP_8686PN) //dralee_1209
{
sNF =-((SHORT)((pRxPDCurrent->NF & 0X7F) + 5));
CurRSSI = -((SHORT)((pRxPDCurrent->SNR & 0X7F) + 5));
}
#else
{
sNF = -((SHORT)((pRxPDCurrent->NF & 0X7F) + 30 + 5));
sSNR = (SHORT)((pRxPDCurrent->SNR & 0X7F)
CurRSSI = sSNR + sNF;
}
#endif
Adapter->RxPDRate = pRxPDCurrent->RxRate;
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
}
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 + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -