static void _rtl92s_dm_refresh_rateadaptive_mask( struct ieee80211_hw *hw ) { struct rtl_priv *rtlpriv = rtl_priv( hw ); struct rtl_hal *rtlhal = rtl_hal( rtl_priv( hw ) ); struct rtl_mac *mac = rtl_mac( rtl_priv( hw ) ); struct rate_adaptive *ra = &( rtlpriv->ra ); struct ieee80211_sta *sta = NULL; u32 low_rssi_thresh = 0; u32 middle_rssi_thresh = 0; u32 high_rssi_thresh = 0; if ( is_hal_stop( rtlhal ) ) return; if ( !rtlpriv->dm.useramask ) return; if ( hal_get_firmwareversion( rtlpriv ) >= 61 && !rtlpriv->dm.inform_fw_driverctrldm ) { rtl92s_phy_set_fw_cmd( hw, FW_CMD_CTRL_DM_BY_DRIVER ); rtlpriv->dm.inform_fw_driverctrldm = true; } if ( ( mac->link_state == MAC80211_LINKED ) && ( mac->opmode == NL80211_IFTYPE_STATION ) ) { switch ( ra->pre_ratr_state ) { case DM_RATR_STA_HIGH: high_rssi_thresh = 40; middle_rssi_thresh = 30; low_rssi_thresh = 20; break; case DM_RATR_STA_MIDDLE: high_rssi_thresh = 44; middle_rssi_thresh = 30; low_rssi_thresh = 20; break; case DM_RATR_STA_LOW: high_rssi_thresh = 44; middle_rssi_thresh = 34; low_rssi_thresh = 20; break; case DM_RATR_STA_ULTRALOW: high_rssi_thresh = 44; middle_rssi_thresh = 34; low_rssi_thresh = 24; break; default: high_rssi_thresh = 44; middle_rssi_thresh = 34; low_rssi_thresh = 24; break; } if ( rtlpriv->dm.undec_sm_pwdb > ( long )high_rssi_thresh ) { ra->ratr_state = DM_RATR_STA_HIGH; } else if ( rtlpriv->dm.undec_sm_pwdb > ( long )middle_rssi_thresh ) { ra->ratr_state = DM_RATR_STA_LOW; } else if ( rtlpriv->dm.undec_sm_pwdb > ( long )low_rssi_thresh ) { ra->ratr_state = DM_RATR_STA_LOW; } else { ra->ratr_state = DM_RATR_STA_ULTRALOW; } if ( ra->pre_ratr_state != ra->ratr_state ) { RT_TRACE( rtlpriv, COMP_RATE, DBG_LOUD, "RSSI = %ld RSSI_LEVEL = %d PreState = %d, CurState = %d\n", rtlpriv->dm.undec_sm_pwdb, ra->ratr_state, ra->pre_ratr_state, ra->ratr_state ); rcu_read_lock(); sta = rtl_find_sta( hw, mac->bssid ); if ( sta ) rtlpriv->cfg->ops->update_rate_tbl( hw, sta, ra->ratr_state ); rcu_read_unlock(); ra->pre_ratr_state = ra->ratr_state; } } }
static void rtl8723ae_dm_refresh_rate_adaptive_mask( struct ieee80211_hw *hw ) { struct rtl_priv *rtlpriv = rtl_priv( hw ); struct rtl_hal *rtlhal = rtl_hal( rtl_priv( hw ) ); struct rtl_mac *mac = rtl_mac( rtl_priv( hw ) ); struct rate_adaptive *p_ra = &( rtlpriv->ra ); u32 low_rssithresh_for_ra, high_rssithresh_for_ra; struct ieee80211_sta *sta = NULL; if ( is_hal_stop( rtlhal ) ) { RT_TRACE( rtlpriv, COMP_RATE, DBG_LOUD, " driver is going to unload\n" ); return; } if ( !rtlpriv->dm.useramask ) { RT_TRACE( rtlpriv, COMP_RATE, DBG_LOUD, " driver does not control rate adaptive mask\n" ); return; } if ( mac->link_state == MAC80211_LINKED && mac->opmode == NL80211_IFTYPE_STATION ) { switch ( p_ra->pre_ratr_state ) { case DM_RATR_STA_HIGH: high_rssithresh_for_ra = 50; low_rssithresh_for_ra = 20; break; case DM_RATR_STA_MIDDLE: high_rssithresh_for_ra = 55; low_rssithresh_for_ra = 20; break; case DM_RATR_STA_LOW: high_rssithresh_for_ra = 50; low_rssithresh_for_ra = 25; break; default: high_rssithresh_for_ra = 50; low_rssithresh_for_ra = 20; break; } if ( rtlpriv->dm.undec_sm_pwdb > high_rssithresh_for_ra ) p_ra->ratr_state = DM_RATR_STA_HIGH; else if ( rtlpriv->dm.undec_sm_pwdb > low_rssithresh_for_ra ) p_ra->ratr_state = DM_RATR_STA_MIDDLE; else p_ra->ratr_state = DM_RATR_STA_LOW; if ( p_ra->pre_ratr_state != p_ra->ratr_state ) { RT_TRACE( rtlpriv, COMP_RATE, DBG_LOUD, "RSSI = %ld\n", rtlpriv->dm.undec_sm_pwdb ); RT_TRACE( rtlpriv, COMP_RATE, DBG_LOUD, "RSSI_LEVEL = %d\n", p_ra->ratr_state ); RT_TRACE( rtlpriv, COMP_RATE, DBG_LOUD, "PreState = %d, CurState = %d\n", p_ra->pre_ratr_state, p_ra->ratr_state ); rcu_read_lock(); sta = rtl_find_sta( hw, mac->bssid ); if ( sta ) rtlpriv->cfg->ops->update_rate_tbl( hw, sta, p_ra->ratr_state ); rcu_read_unlock(); p_ra->pre_ratr_state = p_ra->ratr_state; } } }