예제 #1
0
/**
 *  @brief This function computes the RSSI in received packet.
 *
 *  @param priv    A pointer to struct lbs_private structure
 *  @param prxpd   A pointer to rxpd structure of received packet
 *  @return 	   n/a
 */
static void lbs_compute_rssi(struct lbs_private *priv, struct rxpd *p_rx_pd)
{

	lbs_deb_enter(LBS_DEB_RX);

	lbs_deb_rx("rxpd: SNR %d, NF %d\n", p_rx_pd->snr, p_rx_pd->nf);
	lbs_deb_rx("before computing SNR: SNR-avg = %d, NF-avg = %d\n",
	       priv->SNR[TYPE_RXPD][TYPE_AVG] / AVG_SCALE,
	       priv->NF[TYPE_RXPD][TYPE_AVG] / AVG_SCALE);

	priv->SNR[TYPE_RXPD][TYPE_NOAVG] = p_rx_pd->snr;
	priv->NF[TYPE_RXPD][TYPE_NOAVG] = p_rx_pd->nf;
	lbs_save_rawSNRNF(priv, p_rx_pd);

	priv->SNR[TYPE_RXPD][TYPE_AVG] = lbs_getavgsnr(priv) * AVG_SCALE;
	priv->NF[TYPE_RXPD][TYPE_AVG] = lbs_getavgnf(priv) * AVG_SCALE;
	lbs_deb_rx("after computing SNR: SNR-avg = %d, NF-avg = %d\n",
	       priv->SNR[TYPE_RXPD][TYPE_AVG] / AVG_SCALE,
	       priv->NF[TYPE_RXPD][TYPE_AVG] / AVG_SCALE);

	priv->RSSI[TYPE_RXPD][TYPE_NOAVG] =
	    CAL_RSSI(priv->SNR[TYPE_RXPD][TYPE_NOAVG],
		     priv->NF[TYPE_RXPD][TYPE_NOAVG]);

	priv->RSSI[TYPE_RXPD][TYPE_AVG] =
	    CAL_RSSI(priv->SNR[TYPE_RXPD][TYPE_AVG] / AVG_SCALE,
		     priv->NF[TYPE_RXPD][TYPE_AVG] / AVG_SCALE);

	lbs_deb_leave(LBS_DEB_RX);
}
예제 #2
0
static int lbs_ret_802_11_rssi(struct lbs_private *priv,
				struct cmd_ds_command *resp)
{
	struct cmd_ds_802_11_rssi_rsp *rssirsp = &resp->params.rssirsp;

	lbs_deb_enter(LBS_DEB_CMD);

	/* store the non average value */
	priv->SNR[TYPE_BEACON][TYPE_NOAVG] = le16_to_cpu(rssirsp->SNR);
	priv->NF[TYPE_BEACON][TYPE_NOAVG] = le16_to_cpu(rssirsp->noisefloor);

	priv->SNR[TYPE_BEACON][TYPE_AVG] = le16_to_cpu(rssirsp->avgSNR);
	priv->NF[TYPE_BEACON][TYPE_AVG] = le16_to_cpu(rssirsp->avgnoisefloor);

	priv->RSSI[TYPE_BEACON][TYPE_NOAVG] =
	    CAL_RSSI(priv->SNR[TYPE_BEACON][TYPE_NOAVG],
		     priv->NF[TYPE_BEACON][TYPE_NOAVG]);

	priv->RSSI[TYPE_BEACON][TYPE_AVG] =
	    CAL_RSSI(priv->SNR[TYPE_BEACON][TYPE_AVG] / AVG_SCALE,
		     priv->NF[TYPE_BEACON][TYPE_AVG] / AVG_SCALE);

	lbs_deb_cmd("RSSI: beacon %d, avg %d\n",
	       priv->RSSI[TYPE_BEACON][TYPE_NOAVG],
	       priv->RSSI[TYPE_BEACON][TYPE_AVG]);

	lbs_deb_leave(LBS_DEB_CMD);
	return 0;
}
예제 #3
0
/** 
 *  @brief This function computes the RSSI in received packet.
 *  
 *  @param priv    A pointer to wlan_private structure
 *  @param pRxPD   A pointer to RxPD structure of received packet
 *  @return 	   n/a
 */
static void
wlan_compute_rssi(wlan_private * priv, RxPD * pRxPD)
{
    wlan_adapter *Adapter = priv->adapter;

    ENTER();

    PRINTM(INFO, "RxPD: SNR = %d, NF = %d\n", pRxPD->SNR, pRxPD->NF);

    Adapter->SNR[TYPE_RXPD][TYPE_NOAVG] = pRxPD->SNR;
    Adapter->NF[TYPE_RXPD][TYPE_NOAVG] = pRxPD->NF;
    wlan_save_rawSNRNF(priv, pRxPD);

    Adapter->RxPDAge = os_time_get();
    Adapter->RxPDRate = pRxPD->RxRate;

    Adapter->SNR[TYPE_RXPD][TYPE_AVG] = wlan_getAvgSNR(priv) * AVG_SCALE;
    Adapter->NF[TYPE_RXPD][TYPE_AVG] = wlan_getAvgNF(priv) * AVG_SCALE;
    PRINTM(INFO, "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);
    wlan_check_subscribe_event(priv);
    LEAVE();
}
예제 #4
0
파일: rx.c 프로젝트: PennPanda/linux-repo
/**
 *  @brief This function computes the RSSI in received packet.
 *
 *  @param priv    A pointer to wlan_private structure
 *  @param prxpd   A pointer to rxpd structure of received packet
 *  @return 	   n/a
 */
static void wlan_compute_rssi(wlan_private * priv, struct rxpd *p_rx_pd)
{
	wlan_adapter *adapter = priv->adapter;

	lbs_deb_enter(LBS_DEB_RX);

	lbs_deb_rx("rxpd: SNR %d, NF %d\n", p_rx_pd->snr, p_rx_pd->nf);
	lbs_deb_rx("before 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->SNR[TYPE_RXPD][TYPE_NOAVG] = p_rx_pd->snr;
	adapter->NF[TYPE_RXPD][TYPE_NOAVG] = p_rx_pd->nf;
	wlan_save_rawSNRNF(priv, p_rx_pd);

	adapter->SNR[TYPE_RXPD][TYPE_AVG] = wlan_getavgsnr(priv) * AVG_SCALE;
	adapter->NF[TYPE_RXPD][TYPE_AVG] = wlan_getavgnf(priv) * AVG_SCALE;
	lbs_deb_rx("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);

	lbs_deb_leave(LBS_DEB_RX);
}
예제 #5
0
/******************************************************************************
 *
 *  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_RSSI|DBG_HELP ,(L"RxPD: SNR = %d, NF = %d\n", pRxPDCurrent->SNR, pRxPDCurrent->NF));
    DBGPRINT(DBG_RSSI|DBG_HELP ,(L"Before computing SNR and NF\n"));
    DBGPRINT(DBG_RSSI|DBG_HELP,(L"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->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_RSSI|DBG_HELP ,(L"After computing SNR and NF\n"));
      DBGPRINT(DBG_RSSI|DBG_HELP ,(L"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->RSSI[TYPE_RXPD][TYPE_NOAVG] = 
            (SHORT)CAL_RSSI(Adapter->SNR[TYPE_RXPD][TYPE_NOAVG],
                Adapter->NF[TYPE_RXPD][TYPE_NOAVG]);

      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();

      if ((Adapter->RSSI[TYPE_RXPD][TYPE_AVG] > -10) || (Adapter->RSSI[TYPE_RXPD][TYPE_AVG] < -200))
      {
    
         if(Adapter->MediaConnectStatus == NdisMediaStateConnected)
         {
          DBGPRINT(DBG_ERROR, (L"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 = (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);
          // Reset the counter
          Adapter->RSSITriggerCounter=0;
    
        }

}
예제 #6
0
/** 
 *  @brief This function computes the RSSI in received packet.
 *  
 *  @param priv    A pointer to wlan_private structure
 *  @return 	   n/a
 */
static void
wlan_check_subscribe_event(wlan_private * priv)
{
    wlan_adapter *Adapter = priv->adapter;
    int temp;
    if (Adapter->subevent.EventsBitmap == 0)
        return;
    if ((Adapter->subevent.EventsBitmap & DATA_RSSI_LOW_BIT) ||
        (Adapter->subevent.EventsBitmap & DATA_RSSI_HIGH_BIT)) {
        temp =
            -CAL_RSSI(Adapter->SNR[TYPE_RXPD][TYPE_AVG] / AVG_SCALE,
                      Adapter->NF[TYPE_RXPD][TYPE_AVG] / AVG_SCALE);
        if (Adapter->subevent.EventsBitmap & DATA_RSSI_LOW_BIT) {
            if (temp > Adapter->subevent.Rssi_low.value) {
                if (!Adapter->subevent.Rssi_low.Freq)
                    Adapter->subevent.EventsBitmap &= ~DATA_RSSI_LOW_BIT;
                if (Adapter->subevent.Rssi_low.Freq > 1) {
                    Adapter->subevent.Rssi_low.Freq--;
                    if (Adapter->subevent.Rssi_low.Freq == 1)
                        Adapter->subevent.Rssi_low.Freq = 0;
                }
                send_iwevcustom_event(priv, CUS_EVT_DATA_RSSI_LOW);
            }
        }
        if (Adapter->subevent.EventsBitmap & DATA_RSSI_HIGH_BIT) {
            if (temp < Adapter->subevent.Rssi_high.value) {
                if (!Adapter->subevent.Rssi_high.Freq)
                    Adapter->subevent.EventsBitmap &= ~DATA_RSSI_HIGH_BIT;
                if (Adapter->subevent.Rssi_high.Freq > 1) {
                    Adapter->subevent.Rssi_high.Freq--;
                    if (Adapter->subevent.Rssi_high.Freq == 1)
                        Adapter->subevent.Rssi_high.Freq = 0;
                }
                send_iwevcustom_event(priv, CUS_EVT_DATA_RSSI_HIGH);
            }
        }
    }
    if ((Adapter->subevent.EventsBitmap & DATA_SNR_LOW_BIT) ||
        (Adapter->subevent.EventsBitmap & DATA_SNR_HIGH_BIT)) {
        temp = Adapter->SNR[TYPE_RXPD][TYPE_AVG] / AVG_SCALE;
        if (Adapter->subevent.EventsBitmap & DATA_SNR_LOW_BIT) {
            if (temp < Adapter->subevent.Snr_low.value) {
                if (!Adapter->subevent.Snr_low.Freq)
                    Adapter->subevent.EventsBitmap &= ~DATA_SNR_LOW_BIT;
                if (Adapter->subevent.Snr_low.Freq > 1) {
                    Adapter->subevent.Snr_low.Freq--;
                    if (Adapter->subevent.Snr_low.Freq == 1)
                        Adapter->subevent.Snr_low.Freq = 0;
                }
                send_iwevcustom_event(priv, CUS_EVT_DATA_SNR_LOW);
            }
        }
        if (Adapter->subevent.EventsBitmap & DATA_SNR_HIGH_BIT) {
            if (temp > Adapter->subevent.Snr_high.value) {
                if (!Adapter->subevent.Snr_high.Freq)
                    Adapter->subevent.EventsBitmap &= ~DATA_SNR_HIGH_BIT;
                if (Adapter->subevent.Snr_high.Freq > 1) {
                    Adapter->subevent.Snr_high.Freq--;
                    if (Adapter->subevent.Snr_high.Freq == 1)
                        Adapter->subevent.Snr_high.Freq = 0;
                }
                send_iwevcustom_event(priv, CUS_EVT_DATA_SNR_HIGH);
            }
        }
    }
    return;
}