mac80211: update to latest version, fix tx gain patch
[openwrt/svn-archive/archive.git] / package / mac80211 / patches / 522-ath9k_per_chain_signal_strength.patch
index 7aa72ab580c4da51063805930ad095aa75b8d29c..47406087040f1f598da9f1b3e6db9c5debcd1992 100644 (file)
@@ -23,7 +23,7 @@
        int antenna;
 --- a/net/mac80211/sta_info.h
 +++ b/net/mac80211/sta_info.h
-@@ -320,6 +320,11 @@ struct sta_info {
+@@ -325,6 +325,11 @@ struct sta_info {
        unsigned long rx_dropped;
        int last_signal;
        struct ewma avg_signal;
@@ -37,7 +37,7 @@
  
 --- a/net/mac80211/rx.c
 +++ b/net/mac80211/rx.c
-@@ -1263,6 +1263,7 @@ ieee80211_rx_h_sta_process(struct ieee80
+@@ -1254,6 +1254,7 @@ ieee80211_rx_h_sta_process(struct ieee80
        struct sk_buff *skb = rx->skb;
        struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(skb);
        struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
@@ -45,7 +45,7 @@
  
        if (!sta)
                return RX_CONTINUE;
-@@ -1307,6 +1308,19 @@ ieee80211_rx_h_sta_process(struct ieee80
+@@ -1298,6 +1299,19 @@ ieee80211_rx_h_sta_process(struct ieee80
                ewma_add(&sta->avg_signal, -status->signal);
        }
  
@@ -67,7 +67,7 @@
         * exchange sequence.
 --- a/net/mac80211/sta_info.c
 +++ b/net/mac80211/sta_info.c
-@@ -256,6 +256,8 @@ struct sta_info *sta_info_alloc(struct i
+@@ -254,6 +254,8 @@ struct sta_info *sta_info_alloc(struct i
        do_posix_clock_monotonic_gettime(&uptime);
        sta->last_connected = uptime.tv_sec;
        ewma_init(&sta->avg_signal, 1024, 8);
@@ -78,7 +78,7 @@
                kfree(sta);
 --- a/include/net/cfg80211.h
 +++ b/include/net/cfg80211.h
-@@ -522,6 +522,8 @@ struct station_parameters {
+@@ -546,6 +546,8 @@ struct station_parameters {
   * @STATION_INFO_STA_FLAGS: @sta_flags filled
   * @STATION_INFO_BEACON_LOSS_COUNT: @beacon_loss_count filled
   * @STATION_INFO_T_OFFSET: @t_offset filled
@@ -87,7 +87,7 @@
   */
  enum station_info_flags {
        STATION_INFO_INACTIVE_TIME      = 1<<0,
-@@ -545,6 +547,8 @@ enum station_info_flags {
+@@ -569,6 +571,8 @@ enum station_info_flags {
        STATION_INFO_STA_FLAGS          = 1<<18,
        STATION_INFO_BEACON_LOSS_COUNT  = 1<<19,
        STATION_INFO_T_OFFSET           = 1<<20,
  };
  
  /**
-@@ -626,6 +630,9 @@ struct sta_bss_parameters {
-       NOTE: For CFG80211_SIGNAL_TYPE_MBM, value is expressed in _dBm_.
-  * @signal_avg: avg signal strength, type depends on the wiphy's signal_type
-       NOTE: For CFG80211_SIGNAL_TYPE_MBM, value is expressed in _dBm_.
+@@ -652,6 +656,9 @@ struct sta_bss_parameters {
+  *    For CFG80211_SIGNAL_TYPE_MBM, value is expressed in _dBm_.
+  * @signal_avg: Average signal strength, type depends on the wiphy's signal_type.
+  *    For CFG80211_SIGNAL_TYPE_MBM, value is expressed in _dBm_.
 + * @chains: bitmask for filled values in @chain_signal, @chain_signal_avg
 + * @chain_signal: per-chain signal strength of last received packet in dBm
 + * @chain_signal_avg: per-chain signal strength average in dBm
   * @txrate: current unicast bitrate from this station
   * @rxrate: current unicast bitrate to this station
   * @rx_packets: packets received from this station
-@@ -658,6 +665,11 @@ struct station_info {
+@@ -684,6 +691,11 @@ struct station_info {
        u8 plink_state;
        s8 signal;
        s8 signal_avg;
        u8 rs_num_delims;
 --- a/drivers/net/wireless/ath/ath9k/recv.c
 +++ b/drivers/net/wireless/ath/ath9k/recv.c
-@@ -988,6 +988,7 @@ static int ath9k_rx_skb_preprocess(struc
+@@ -955,6 +955,7 @@ static int ath9k_rx_skb_preprocess(struc
                                   bool *decrypt_error)
  {
        struct ath_hw *ah = common->ah;
  
        /*
         * everything but the rate is checked here, the rate check is done
-@@ -1013,6 +1014,20 @@ static int ath9k_rx_skb_preprocess(struc
+@@ -980,6 +981,20 @@ static int ath9k_rx_skb_preprocess(struc
        if (rx_stats->rs_moreaggr)
                rx_status->flag |= RX_FLAG_NO_SIGNAL_VAL;
  
        return 0;
  }
  
-@@ -1543,14 +1558,14 @@ static void ath_ant_comb_scan(struct ath
-       struct ath_ant_comb *antcomb = &sc->ant_comb;
-       int alt_ratio = 0, alt_rssi_avg = 0, main_rssi_avg = 0, curr_alt_set;
-       int curr_main_set;
--      int main_rssi = rs->rs_rssi_ctl0;
--      int alt_rssi = rs->rs_rssi_ctl1;
-+      int main_rssi = rs->rs_rssi_ctl[0];
-+      int alt_rssi = rs->rs_rssi_ctl[1];
-       int rx_ant_conf,  main_ant_conf;
-       bool short_scan = false;
--      rx_ant_conf = (rs->rs_rssi_ctl2 >> ATH_ANT_RX_CURRENT_SHIFT) &
-+      rx_ant_conf = (rs->rs_rssi_ctl[2] >> ATH_ANT_RX_CURRENT_SHIFT) &
-                      ATH_ANT_RX_MASK;
--      main_ant_conf = (rs->rs_rssi_ctl2 >> ATH_ANT_RX_MAIN_SHIFT) &
-+      main_ant_conf = (rs->rs_rssi_ctl[2] >> ATH_ANT_RX_MAIN_SHIFT) &
-                        ATH_ANT_RX_MASK;
-       /* Record packet only when both main_rssi and  alt_rssi is positive */
 --- a/drivers/net/wireless/ath/ath9k/ar9003_mac.c
 +++ b/drivers/net/wireless/ath/ath9k/ar9003_mac.c
-@@ -455,12 +455,12 @@ int ath9k_hw_process_rxdesc_edma(struct 
+@@ -458,12 +458,12 @@ int ath9k_hw_process_rxdesc_edma(struct 
  
        /* XXX: Keycache */
        rxs->rs_rssi = MS(rxsp->status5, AR_RxRSSICombined);
        RX_SAMP_DBG(rate) = rs->rs_rate;
 --- a/include/linux/nl80211.h
 +++ b/include/linux/nl80211.h
-@@ -1695,6 +1695,8 @@ enum nl80211_sta_bss_param {
+@@ -1729,6 +1729,8 @@ enum nl80211_sta_bss_param {
   * @NL80211_STA_INFO_STA_FLAGS: Contains a struct nl80211_sta_flag_update.
   * @NL80211_STA_INFO_BEACON_LOSS: count of times beacon loss was detected (u32)
   * @NL80211_STA_INFO_T_OFFSET: timing offset with respect to this STA (s64)
   * @__NL80211_STA_INFO_AFTER_LAST: internal
   * @NL80211_STA_INFO_MAX: highest possible station info attribute
   */
-@@ -1719,6 +1721,8 @@ enum nl80211_sta_info {
+@@ -1753,6 +1755,8 @@ enum nl80211_sta_info {
        NL80211_STA_INFO_STA_FLAGS,
        NL80211_STA_INFO_BEACON_LOSS,
        NL80211_STA_INFO_T_OFFSET,
        __NL80211_STA_INFO_AFTER_LAST,
 --- a/net/wireless/nl80211.c
 +++ b/net/wireless/nl80211.c
-@@ -2467,6 +2467,33 @@ nla_put_failure:
+@@ -2648,6 +2648,32 @@ nla_put_failure:
        return false;
  }
  
 +
 +      attr = nla_nest_start(msg, id);
 +      if (!attr)
-+              goto nla_put_failure;
++              return false;
 +
 +      for (i = 0; i < 4; i++) {
 +              if (!(mask & BIT(i)))
 +                      continue;
 +
-+              NLA_PUT_U8(msg, i, signal[i]);
++              if (nla_put_u8(msg, i, signal[i]))
++                      return false;
 +      }
 +
 +      nla_nest_end(msg, attr);
 +
 +      return true;
-+nla_put_failure:
-+      return false;
 +}
 +
  static int nl80211_send_station(struct sk_buff *msg, u32 pid, u32 seq,
                                int flags,
                                struct cfg80211_registered_device *rdev,
-@@ -2528,6 +2555,18 @@ static int nl80211_send_station(struct s
+@@ -2709,6 +2735,18 @@ static int nl80211_send_station(struct s
        default:
                break;
        }
                                          NL80211_STA_INFO_TX_BITRATE))
 --- a/net/mac80211/cfg.c
 +++ b/net/mac80211/cfg.c
-@@ -354,6 +354,7 @@ static void sta_set_sinfo(struct sta_inf
- {
+@@ -355,6 +355,7 @@ static void sta_set_sinfo(struct sta_inf
        struct ieee80211_sub_if_data *sdata = sta->sdata;
+       struct ieee80211_local *local = sdata->local;
        struct timespec uptime;
 +      int i;
  
        sinfo->generation = sdata->local->sta_generation;
  
-@@ -391,6 +392,17 @@ static void sta_set_sinfo(struct sta_inf
-               sinfo->signal = (s8)sta->last_signal;
+@@ -394,6 +395,17 @@ static void sta_set_sinfo(struct sta_inf
+                       sinfo->signal = (s8)sta->last_signal;
                sinfo->signal_avg = (s8) -ewma_read(&sta->avg_signal);
        }
 +      if (sta->chains) {
  
        sta_set_rate_info_tx(sta, &sta->last_tx_rate, &sinfo->txrate);
  
+--- a/drivers/net/wireless/ath/ath9k/dfs.c
++++ b/drivers/net/wireless/ath/ath9k/dfs.c
+@@ -164,8 +164,8 @@ void ath9k_dfs_process_phyerr(struct ath
+               return;
+       }
+-      ard.rssi = rs->rs_rssi_ctl0;
+-      ard.ext_rssi = rs->rs_rssi_ext0;
++      ard.rssi = rs->rs_rssi_ctl[0];
++      ard.ext_rssi = rs->rs_rssi_ext[0];
+       /*
+        * hardware stores this as 8 bit signed value.
+--- a/drivers/net/wireless/ath/ath9k/antenna.c
++++ b/drivers/net/wireless/ath/ath9k/antenna.c
+@@ -529,14 +529,14 @@ void ath_ant_comb_scan(struct ath_softc 
+       struct ath_ant_comb *antcomb = &sc->ant_comb;
+       int alt_ratio = 0, alt_rssi_avg = 0, main_rssi_avg = 0, curr_alt_set;
+       int curr_main_set;
+-      int main_rssi = rs->rs_rssi_ctl0;
+-      int alt_rssi = rs->rs_rssi_ctl1;
++      int main_rssi = rs->rs_rssi_ctl[0];
++      int alt_rssi = rs->rs_rssi_ctl[1];
+       int rx_ant_conf,  main_ant_conf;
+       bool short_scan = false;
+-      rx_ant_conf = (rs->rs_rssi_ctl2 >> ATH_ANT_RX_CURRENT_SHIFT) &
++      rx_ant_conf = (rs->rs_rssi_ctl[2] >> ATH_ANT_RX_CURRENT_SHIFT) &
+                      ATH_ANT_RX_MASK;
+-      main_ant_conf = (rs->rs_rssi_ctl2 >> ATH_ANT_RX_MAIN_SHIFT) &
++      main_ant_conf = (rs->rs_rssi_ctl[2] >> ATH_ANT_RX_MAIN_SHIFT) &
+                        ATH_ANT_RX_MASK;
+       /* Record packet only when both main_rssi and  alt_rssi is positive */