@ -1136,27 +1136,20 @@ static void ath10k_peer_assoc_h_ht(struct ath10k *ar,
arg - > peer_num_spatial_streams ) ;
}
static void ath10k_peer_assoc_h_qos_ap ( struct ath10k * ar ,
struct ath10k_vif * arvif ,
struct ieee80211_sta * sta ,
struct ieee80211_bss_conf * bss_conf ,
struct wmi_peer_assoc_complete_arg * arg )
static int ath10k_peer_assoc_qos_ap ( struct ath10k * ar ,
struct ath10k_vif * arvif ,
struct ieee80211_sta * sta )
{
u32 uapsd = 0 ;
u32 max_sp = 0 ;
int ret = 0 ;
lockdep_assert_held ( & ar - > conf_mutex ) ;
if ( sta - > wme )
arg - > peer_flags | = WMI_PEER_QOS ;
if ( sta - > wme & & sta - > uapsd_queues ) {
ath10k_dbg ( ATH10K_DBG_MAC , " mac uapsd_queues 0x%x max_sp %d \n " ,
sta - > uapsd_queues , sta - > max_sp ) ;
arg - > peer_flags | = WMI_PEER_APSD ;
arg - > peer_rate_caps | = WMI_RC_UAPSD_FLAG ;
if ( sta - > uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VO )
uapsd | = WMI_AP_PS_UAPSD_AC3_DELIVERY_EN |
WMI_AP_PS_UAPSD_AC3_TRIGGER_EN ;
@ -1174,35 +1167,40 @@ static void ath10k_peer_assoc_h_qos_ap(struct ath10k *ar,
if ( sta - > max_sp < MAX_WMI_AP_PS_PEER_PARAM_MAX_SP )
max_sp = sta - > max_sp ;
ath10k_wmi_set_ap_ps_param ( ar , arvif - > vdev_id ,
sta - > addr ,
WMI_AP_PS_PEER_PARAM_UAPSD ,
uapsd ) ;
ret = ath10k_wmi_set_ap_ps_param ( ar , arvif - > vdev_id ,
sta - > addr ,
WMI_AP_PS_PEER_PARAM_UAPSD ,
uapsd ) ;
if ( ret ) {
ath10k_warn ( " failed to set ap ps peer param uapsd: %d \n " ,
ret ) ;
return ret ;
}
ath10k_wmi_set_ap_ps_param ( ar , arvif - > vdev_id ,
sta - > addr ,
WMI_AP_PS_PEER_PARAM_MAX_SP ,
max_sp ) ;
ret = ath10k_wmi_set_ap_ps_param ( ar , arvif - > vdev_id ,
sta - > addr ,
WMI_AP_PS_PEER_PARAM_MAX_SP ,
max_sp ) ;
if ( ret ) {
ath10k_warn ( " failed to set ap ps peer param max sp: %d \n " ,
ret ) ;
return ret ;
}
/* TODO setup this based on STA listen interval and
beacon interval . Currently we don ' t know
sta - > listen_interval - mac80211 patch required .
Currently use 10 seconds */
ath10k_wmi_set_ap_ps_param ( ar , arvif - > vdev_id ,
sta - > addr ,
WMI_AP_PS_PEER_PARAM_AGEOUT_TIME ,
10 ) ;
ret = ath10k_wmi_set_ap_ps_param ( ar , arvif - > vdev_id , sta - > addr ,
WMI_AP_PS_PEER_PARAM_AGEOUT_TIME , 10 ) ;
if ( ret ) {
ath10k_warn ( " failed to set ap ps peer param ageout time: %d \n " ,
ret ) ;
return ret ;
}
}
}
static void ath10k_peer_assoc_h_qos_sta ( struct ath10k * ar ,
struct ath10k_vif * arvif ,
struct ieee80211_sta * sta ,
struct ieee80211_bss_conf * bss_conf ,
struct wmi_peer_assoc_complete_arg * arg )
{
if ( bss_conf - > qos )
arg - > peer_flags | = WMI_PEER_QOS ;
return 0 ;
}
static void ath10k_peer_assoc_h_vht ( struct ath10k * ar ,
@ -1255,10 +1253,17 @@ static void ath10k_peer_assoc_h_qos(struct ath10k *ar,
{
switch ( arvif - > vdev_type ) {
case WMI_VDEV_TYPE_AP :
ath10k_peer_assoc_h_qos_ap ( ar , arvif , sta , bss_conf , arg ) ;
if ( sta - > wme )
arg - > peer_flags | = WMI_PEER_QOS ;
if ( sta - > wme & & sta - > uapsd_queues ) {
arg - > peer_flags | = WMI_PEER_APSD ;
arg - > peer_rate_caps | = WMI_RC_UAPSD_FLAG ;
}
break ;
case WMI_VDEV_TYPE_STA :
ath10k_peer_assoc_h_qos_sta ( ar , arvif , sta , bss_conf , arg ) ;
if ( bss_conf - > qos )
arg - > peer_flags | = WMI_PEER_QOS ;
break ;
default :
break ;
@ -1456,6 +1461,13 @@ static int ath10k_station_assoc(struct ath10k *ar, struct ath10k_vif *arvif,
return ret ;
}
ret = ath10k_peer_assoc_qos_ap ( ar , arvif , sta ) ;
if ( ret ) {
ath10k_warn ( " could not set qos params for STA %pM, %d \n " ,
sta - > addr , ret ) ;
return ret ;
}
return ret ;
}