Merge tag 'acpi-5.14-rc1-2' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael...
[linux-2.6-microblaze.git] / net / mac80211 / sta_info.c
index f2fb69d..a5505ee 100644 (file)
@@ -425,15 +425,11 @@ struct sta_info *sta_info_alloc(struct ieee80211_sub_if_data *sdata,
        if (sta_prepare_rate_control(local, sta, gfp))
                goto free_txq;
 
-       sta->airtime_weight = IEEE80211_DEFAULT_AIRTIME_WEIGHT;
 
        for (i = 0; i < IEEE80211_NUM_ACS; i++) {
                skb_queue_head_init(&sta->ps_tx_buf[i]);
                skb_queue_head_init(&sta->tx_filtered[i]);
-               sta->airtime[i].deficit = sta->airtime_weight;
-               atomic_set(&sta->airtime[i].aql_tx_pending, 0);
-               sta->airtime[i].aql_limit_low = local->aql_txq_limit_low[i];
-               sta->airtime[i].aql_limit_high = local->aql_txq_limit_high[i];
+               init_airtime_info(&sta->airtime[i], &local->airtime[i]);
        }
 
        for (i = 0; i < IEEE80211_NUM_TIDS; i++)
@@ -1398,11 +1394,6 @@ static void ieee80211_send_null_response(struct sta_info *sta, int tid,
        struct ieee80211_tx_info *info;
        struct ieee80211_chanctx_conf *chanctx_conf;
 
-       /* Don't send NDPs when STA is connected HE */
-       if (sdata->vif.type == NL80211_IFTYPE_STATION &&
-           !(sdata->u.mgd.flags & IEEE80211_STA_DISABLE_HE))
-               return;
-
        if (qos) {
                fc = cpu_to_le16(IEEE80211_FTYPE_DATA |
                                 IEEE80211_STYPE_QOS_NULLFUNC |
@@ -1897,24 +1888,59 @@ void ieee80211_sta_set_buffered(struct ieee80211_sta *pubsta,
 }
 EXPORT_SYMBOL(ieee80211_sta_set_buffered);
 
-void ieee80211_sta_register_airtime(struct ieee80211_sta *pubsta, u8 tid,
-                                   u32 tx_airtime, u32 rx_airtime)
+void ieee80211_register_airtime(struct ieee80211_txq *txq,
+                               u32 tx_airtime, u32 rx_airtime)
 {
-       struct sta_info *sta = container_of(pubsta, struct sta_info, sta);
-       struct ieee80211_local *local = sta->sdata->local;
-       u8 ac = ieee80211_ac_from_tid(tid);
+       struct ieee80211_sub_if_data *sdata = vif_to_sdata(txq->vif);
+       struct ieee80211_local *local = sdata->local;
+       u64 weight_sum, weight_sum_reciprocal;
+       struct airtime_sched_info *air_sched;
+       struct airtime_info *air_info;
        u32 airtime = 0;
 
-       if (sta->local->airtime_flags & AIRTIME_USE_TX)
+       air_sched = &local->airtime[txq->ac];
+       air_info = to_airtime_info(txq);
+
+       if (local->airtime_flags & AIRTIME_USE_TX)
                airtime += tx_airtime;
-       if (sta->local->airtime_flags & AIRTIME_USE_RX)
+       if (local->airtime_flags & AIRTIME_USE_RX)
                airtime += rx_airtime;
 
-       spin_lock_bh(&local->active_txq_lock[ac]);
-       sta->airtime[ac].tx_airtime += tx_airtime;
-       sta->airtime[ac].rx_airtime += rx_airtime;
-       sta->airtime[ac].deficit -= airtime;
-       spin_unlock_bh(&local->active_txq_lock[ac]);
+       /* Weights scale so the unit weight is 256 */
+       airtime <<= 8;
+
+       spin_lock_bh(&air_sched->lock);
+
+       air_info->tx_airtime += tx_airtime;
+       air_info->rx_airtime += rx_airtime;
+
+       if (air_sched->weight_sum) {
+               weight_sum = air_sched->weight_sum;
+               weight_sum_reciprocal = air_sched->weight_sum_reciprocal;
+       } else {
+               weight_sum = air_info->weight;
+               weight_sum_reciprocal = air_info->weight_reciprocal;
+       }
+
+       /* Round the calculation of global vt */
+       air_sched->v_t += (u64)((airtime + (weight_sum >> 1)) *
+                               weight_sum_reciprocal) >> IEEE80211_RECIPROCAL_SHIFT_64;
+       air_info->v_t += (u32)((airtime + (air_info->weight >> 1)) *
+                              air_info->weight_reciprocal) >> IEEE80211_RECIPROCAL_SHIFT_32;
+       ieee80211_resort_txq(&local->hw, txq);
+
+       spin_unlock_bh(&air_sched->lock);
+}
+
+void ieee80211_sta_register_airtime(struct ieee80211_sta *pubsta, u8 tid,
+                                   u32 tx_airtime, u32 rx_airtime)
+{
+       struct ieee80211_txq *txq = pubsta->txq[tid];
+
+       if (!txq)
+               return;
+
+       ieee80211_register_airtime(txq, tx_airtime, rx_airtime);
 }
 EXPORT_SYMBOL(ieee80211_sta_register_airtime);
 
@@ -2093,10 +2119,9 @@ static struct ieee80211_sta_rx_stats *
 sta_get_last_rx_stats(struct sta_info *sta)
 {
        struct ieee80211_sta_rx_stats *stats = &sta->rx_stats;
-       struct ieee80211_local *local = sta->local;
        int cpu;
 
-       if (!ieee80211_hw_check(&local->hw, USES_RSS))
+       if (!sta->pcpu_rx_stats)
                return stats;
 
        for_each_possible_cpu(cpu) {
@@ -2196,9 +2221,7 @@ static void sta_set_tidstats(struct sta_info *sta,
        int cpu;
 
        if (!(tidstats->filled & BIT(NL80211_TID_STATS_RX_MSDU))) {
-               if (!ieee80211_hw_check(&local->hw, USES_RSS))
-                       tidstats->rx_msdu +=
-                               sta_get_tidstats_msdu(&sta->rx_stats, tid);
+               tidstats->rx_msdu += sta_get_tidstats_msdu(&sta->rx_stats, tid);
 
                if (sta->pcpu_rx_stats) {
                        for_each_possible_cpu(cpu) {
@@ -2277,7 +2300,6 @@ void sta_set_sinfo(struct sta_info *sta, struct station_info *sinfo,
                sinfo->rx_beacon = sdata->u.mgd.count_beacon_signal;
 
        drv_sta_statistics(local, sdata, &sta->sta, sinfo);
-
        sinfo->filled |= BIT_ULL(NL80211_STA_INFO_INACTIVE_TIME) |
                         BIT_ULL(NL80211_STA_INFO_STA_FLAGS) |
                         BIT_ULL(NL80211_STA_INFO_BSS_PARAM) |
@@ -2312,8 +2334,7 @@ void sta_set_sinfo(struct sta_info *sta, struct station_info *sinfo,
 
        if (!(sinfo->filled & (BIT_ULL(NL80211_STA_INFO_RX_BYTES64) |
                               BIT_ULL(NL80211_STA_INFO_RX_BYTES)))) {
-               if (!ieee80211_hw_check(&local->hw, USES_RSS))
-                       sinfo->rx_bytes += sta_get_stats_bytes(&sta->rx_stats);
+               sinfo->rx_bytes += sta_get_stats_bytes(&sta->rx_stats);
 
                if (sta->pcpu_rx_stats) {
                        for_each_possible_cpu(cpu) {
@@ -2363,7 +2384,7 @@ void sta_set_sinfo(struct sta_info *sta, struct station_info *sinfo,
        }
 
        if (!(sinfo->filled & BIT_ULL(NL80211_STA_INFO_AIRTIME_WEIGHT))) {
-               sinfo->airtime_weight = sta->airtime_weight;
+               sinfo->airtime_weight = sta->airtime[0].weight;
                sinfo->filled |= BIT_ULL(NL80211_STA_INFO_AIRTIME_WEIGHT);
        }