123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306 |
- #define _RTL8812A_RXDESC_C_
- #include <rtl8812a_hal.h>
- static s32 translate2dbm(u8 signal_strength_idx)
- {
- s32 signal_power;
-
- signal_power = (s32)((signal_strength_idx + 1) >> 1);
- signal_power -= 95;
- return signal_power;
- }
- static void process_rssi(_adapter *padapter,union recv_frame *prframe)
- {
- u32 last_rssi, tmp_val;
- struct rx_pkt_attrib *pattrib = &prframe->u.hdr.attrib;
- #ifdef CONFIG_NEW_SIGNAL_STAT_PROCESS
- struct signal_stat * signal_stat = &padapter->recvpriv.signal_strength_data;
- #endif
-
-
- {
-
- #ifdef CONFIG_NEW_SIGNAL_STAT_PROCESS
- if(signal_stat->update_req) {
- signal_stat->total_num = 0;
- signal_stat->total_val = 0;
- signal_stat->update_req = 0;
- }
- signal_stat->total_num++;
- signal_stat->total_val += pattrib->phy_info.SignalStrength;
- signal_stat->avg_val = signal_stat->total_val / signal_stat->total_num;
- #else
-
-
- if(padapter->recvpriv.signal_strength_data.total_num++ >= PHY_RSSI_SLID_WIN_MAX)
- {
- padapter->recvpriv.signal_strength_data.total_num = PHY_RSSI_SLID_WIN_MAX;
- last_rssi = padapter->recvpriv.signal_strength_data.elements[padapter->recvpriv.signal_strength_data.index];
- padapter->recvpriv.signal_strength_data.total_val -= last_rssi;
- }
- padapter->recvpriv.signal_strength_data.total_val +=pattrib->phy_info.SignalStrength;
- padapter->recvpriv.signal_strength_data.elements[padapter->recvpriv.signal_strength_data.index++] = pattrib->phy_info.SignalStrength;
- if(padapter->recvpriv.signal_strength_data.index >= PHY_RSSI_SLID_WIN_MAX)
- padapter->recvpriv.signal_strength_data.index = 0;
- tmp_val = padapter->recvpriv.signal_strength_data.total_val/padapter->recvpriv.signal_strength_data.total_num;
-
- if(padapter->recvpriv.is_signal_dbg) {
- padapter->recvpriv.signal_strength= padapter->recvpriv.signal_strength_dbg;
- padapter->recvpriv.rssi=(s8)translate2dbm((u8)padapter->recvpriv.signal_strength_dbg);
- } else {
- padapter->recvpriv.signal_strength= tmp_val;
- padapter->recvpriv.rssi=(s8)translate2dbm((u8)tmp_val);
- }
- RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("UI RSSI = %d, ui_rssi.TotalVal = %d, ui_rssi.TotalNum = %d\n", tmp_val, padapter->recvpriv.signal_strength_data.total_val,padapter->recvpriv.signal_strength_data.total_num));
- #endif
- }
- }
- static void process_link_qual(_adapter *padapter,union recv_frame *prframe)
- {
- u32 last_evm=0, tmpVal;
- struct rx_pkt_attrib *pattrib;
- #ifdef CONFIG_NEW_SIGNAL_STAT_PROCESS
- struct signal_stat * signal_stat;
- #endif
- if(prframe == NULL || padapter==NULL){
- return;
- }
- pattrib = &prframe->u.hdr.attrib;
- #ifdef CONFIG_NEW_SIGNAL_STAT_PROCESS
- signal_stat = &padapter->recvpriv.signal_qual_data;
- #endif
-
- #ifdef CONFIG_NEW_SIGNAL_STAT_PROCESS
- if(signal_stat->update_req) {
- signal_stat->total_num = 0;
- signal_stat->total_val = 0;
- signal_stat->update_req = 0;
- }
- signal_stat->total_num++;
- signal_stat->total_val += pattrib->phy_info.SignalQuality;
- signal_stat->avg_val = signal_stat->total_val / signal_stat->total_num;
-
- #else
- if(pattrib->phy_info.SignalQuality != 0)
- {
-
-
-
- if(padapter->recvpriv.signal_qual_data.total_num++ >= PHY_LINKQUALITY_SLID_WIN_MAX)
- {
- padapter->recvpriv.signal_qual_data.total_num = PHY_LINKQUALITY_SLID_WIN_MAX;
- last_evm = padapter->recvpriv.signal_qual_data.elements[padapter->recvpriv.signal_qual_data.index];
- padapter->recvpriv.signal_qual_data.total_val -= last_evm;
- }
- padapter->recvpriv.signal_qual_data.total_val += pattrib->phy_info.SignalQuality;
- padapter->recvpriv.signal_qual_data.elements[padapter->recvpriv.signal_qual_data.index++] = pattrib->phy_info.SignalQuality;
- if(padapter->recvpriv.signal_qual_data.index >= PHY_LINKQUALITY_SLID_WIN_MAX)
- padapter->recvpriv.signal_qual_data.index = 0;
- RT_TRACE(_module_rtl871x_recv_c_,_drv_info_,("Total SQ=%d pattrib->signal_qual= %d\n", padapter->recvpriv.signal_qual_data.total_val, pattrib->phy_info.SignalQuality));
-
- tmpVal = padapter->recvpriv.signal_qual_data.total_val/padapter->recvpriv.signal_qual_data.total_num;
- padapter->recvpriv.signal_qual=(u8)tmpVal;
- }
- else
- {
- RT_TRACE(_module_rtl871x_recv_c_,_drv_err_,(" pattrib->signal_qual =%d\n", pattrib->phy_info.SignalQuality));
- }
- #endif
- }
- static void process_phy_info(_adapter *padapter, void *prframe)
- {
- union recv_frame *precvframe = (union recv_frame *)prframe;
-
-
-
- process_rssi(padapter, precvframe);
-
-
-
-
-
-
-
-
- process_link_qual(padapter, precvframe);
- }
- void rtl8812_query_rx_desc_status(union recv_frame *precvframe, u8 *pdesc)
- {
- struct rx_pkt_attrib *pattrib = &precvframe->u.hdr.attrib;
- _rtw_memset(pattrib, 0, sizeof(struct rx_pkt_attrib));
-
- pattrib->pkt_len = (u16)GET_RX_STATUS_DESC_PKT_LEN_8812(pdesc);
- pattrib->crc_err = (u8)GET_RX_STATUS_DESC_CRC32_8812(pdesc);
- pattrib->icv_err = (u8)GET_RX_STATUS_DESC_ICV_8812(pdesc);
- pattrib->drvinfo_sz = (u8)GET_RX_STATUS_DESC_DRVINFO_SIZE_8812(pdesc) * 8;
- pattrib->encrypt = (u8)GET_RX_STATUS_DESC_SECURITY_8812(pdesc);
- pattrib->qos = (u8)GET_RX_STATUS_DESC_QOS_8812(pdesc);
- pattrib->shift_sz = (u8)GET_RX_STATUS_DESC_SHIFT_8812(pdesc);
- pattrib->physt = (u8)GET_RX_STATUS_DESC_PHY_STATUS_8812(pdesc);
- pattrib->bdecrypted = !GET_RX_STATUS_DESC_SWDEC_8812(pdesc);
-
- pattrib->priority = (u8)GET_RX_STATUS_DESC_TID_8812(pdesc);
- pattrib->mdata = (u8)GET_RX_STATUS_DESC_MORE_DATA_8812(pdesc);
- pattrib->mfrag = (u8)GET_RX_STATUS_DESC_MORE_FRAG_8812(pdesc);
-
- pattrib->seq_num = (u16)GET_RX_STATUS_DESC_SEQ_8812(pdesc);
- pattrib->frag_num = (u8)GET_RX_STATUS_DESC_FRAG_8812(pdesc);
- if (GET_RX_STATUS_DESC_RPT_SEL_8812(pdesc))
- pattrib->pkt_rpt_type = C2H_PACKET;
- else
- pattrib->pkt_rpt_type = NORMAL_RX;
-
- pattrib->data_rate=(u8)GET_RX_STATUS_DESC_RX_RATE_8812(pdesc);
-
-
- }
- void rtl8812_query_rx_phy_status(
- union recv_frame *precvframe,
- u8 *pphy_status)
- {
- PADAPTER padapter = precvframe->u.hdr.adapter;
- struct rx_pkt_attrib *pattrib = &precvframe->u.hdr.attrib;
- HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
- PODM_PHY_INFO_T pPHYInfo = (PODM_PHY_INFO_T)(&pattrib->phy_info);
- u8 *wlanhdr;
- ODM_PACKET_INFO_T pkt_info;
- u8 *sa;
- struct sta_priv *pstapriv;
- struct sta_info *psta;
-
-
- pkt_info.bPacketMatchBSSID =_FALSE;
- pkt_info.bPacketToSelf = _FALSE;
- pkt_info.bPacketBeacon = _FALSE;
-
- wlanhdr = get_recvframe_data(precvframe);
- pkt_info.bPacketMatchBSSID = ((!IsFrameTypeCtrl(wlanhdr)) &&
- !pattrib->icv_err && !pattrib->crc_err &&
- _rtw_memcmp(get_hdr_bssid(wlanhdr), get_bssid(&padapter->mlmepriv), ETH_ALEN));
- pkt_info.bPacketToSelf = pkt_info.bPacketMatchBSSID && (_rtw_memcmp(get_da(wlanhdr), myid(&padapter->eeprompriv), ETH_ALEN));
- pkt_info.bPacketBeacon = pkt_info.bPacketMatchBSSID && (GetFrameSubType(wlanhdr) == WIFI_BEACON);
- if(pkt_info.bPacketBeacon){
- if(check_fwstate(&padapter->mlmepriv, WIFI_STATION_STATE) == _TRUE){
- sa = padapter->mlmepriv.cur_network.network.MacAddress;
- #if 0
- {
- DBG_8192C("==> rx beacon from AP[%02x:%02x:%02x:%02x:%02x:%02x]\n",
- sa[0],sa[1],sa[2],sa[3],sa[4],sa[5]);
- }
- #endif
- }
-
- }
- else{
- sa = get_sa(wlanhdr);
- }
-
- pstapriv = &padapter->stapriv;
- pkt_info.StationID = 0xFF;
- psta = rtw_get_stainfo(pstapriv, sa);
- if (psta)
- {
- pkt_info.StationID = psta->mac_id;
-
- }
- pkt_info.DataRate = pattrib->data_rate;
-
-
- ODM_PhyStatusQuery(&pHalData->odmpriv,pPHYInfo,pphy_status,&(pkt_info));
-
- precvframe->u.hdr.psta = NULL;
- if (pkt_info.bPacketMatchBSSID &&
- (check_fwstate(&padapter->mlmepriv, WIFI_AP_STATE) == _TRUE))
- {
- if (psta)
- {
- precvframe->u.hdr.psta = psta;
- process_phy_info(padapter, precvframe);
-
- }
- }
- else if (pkt_info.bPacketToSelf || pkt_info.bPacketBeacon)
- {
- if (check_fwstate(&padapter->mlmepriv, WIFI_ADHOC_STATE|WIFI_ADHOC_MASTER_STATE) == _TRUE)
- {
- if (psta)
- {
- precvframe->u.hdr.psta = psta;
- }
- }
- process_phy_info(padapter, precvframe);
- }
- }
|