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 + -
显示快捷键?