/** * @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); }
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; }
/** * @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(); }
/** * @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); }
/****************************************************************************** * * 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; } }
/** * @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; }