mac80211: refresh patches
[openwrt/staging/mkresin.git] / package / mac80211 / patches / 300-pending_work.patch
index 93773d7ebaed18f70539f9999102607db64f961c..219144c0b91b57eb6edf5e7eaaf59adb3a3448e1 100644 (file)
@@ -1,6 +1,17 @@
+--- a/drivers/net/wireless/ath/ath5k/base.c
++++ b/drivers/net/wireless/ath/ath5k/base.c
+@@ -325,6 +325,8 @@ ath5k_setup_channels(struct ath5k_hw *ah
+               if (!ath5k_is_standard_channel(ch, band))
+                       continue;
++              channels[count].max_power = AR5K_TUNE_MAX_TXPOWER/2;
++
+               count++;
+       }
 --- a/net/mac80211/agg-rx.c
 +++ b/net/mac80211/agg-rx.c
-@@ -187,6 +187,8 @@ static void ieee80211_send_addba_resp(st
+@@ -203,6 +203,8 @@ static void ieee80211_send_addba_resp(st
                memcpy(mgmt->bssid, sdata->u.mgd.bssid, ETH_ALEN);
        else if (sdata->vif.type == NL80211_IFTYPE_ADHOC)
                memcpy(mgmt->bssid, sdata->u.ibss.bssid, ETH_ALEN);
@@ -21,7 +32,7 @@
                memcpy(mgmt->bssid, sdata->vif.addr, ETH_ALEN);
        else if (sdata->vif.type == NL80211_IFTYPE_STATION)
                memcpy(mgmt->bssid, sdata->u.mgd.bssid, ETH_ALEN);
-@@ -471,6 +472,7 @@ int ieee80211_start_tx_ba_session(struct
+@@ -460,6 +461,7 @@ int ieee80211_start_tx_ba_session(struct
            sdata->vif.type != NL80211_IFTYPE_MESH_POINT &&
            sdata->vif.type != NL80211_IFTYPE_AP_VLAN &&
            sdata->vif.type != NL80211_IFTYPE_AP &&
            sdata->vif.type != NL80211_IFTYPE_ADHOC)
                return -EINVAL;
  
+@@ -869,7 +871,7 @@ void ieee80211_process_addba_resp(struct
+       } else {
+               ___ieee80211_stop_tx_ba_session(sta, tid, WLAN_BACK_INITIATOR,
+-                                              true);
++                                              false);
+       }
+  out:
 --- a/net/mac80211/debugfs_sta.c
 +++ b/net/mac80211/debugfs_sta.c
 @@ -63,11 +63,11 @@ static ssize_t sta_flags_read(struct fil
        test_sta_flag(sta, WLAN_STA_##flg) ? #flg "\n" : ""
  
        int res = scnprintf(buf, sizeof(buf),
--                          "%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s",
-+                          "%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s",
+-                          "%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s",
++                          "%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s",
                            TEST(AUTH), TEST(ASSOC), TEST(PS_STA),
                            TEST(PS_DRIVER), TEST(AUTHORIZED),
                            TEST(SHORT_PREAMBLE),
                            TEST(TDLS_PEER_AUTH), TEST(4ADDR_EVENT),
 --- a/net/mac80211/iface.c
 +++ b/net/mac80211/iface.c
-@@ -178,7 +178,6 @@ static int ieee80211_do_open(struct net_
- {
-       struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
+@@ -420,7 +420,6 @@ int ieee80211_do_open(struct wireless_de
+       struct ieee80211_sub_if_data *sdata = IEEE80211_WDEV_TO_SUB_IF(wdev);
+       struct net_device *dev = wdev->netdev;
        struct ieee80211_local *local = sdata->local;
 -      struct sta_info *sta;
        u32 changed = 0;
        int res;
        u32 hw_reconf_flags = 0;
-@@ -309,28 +308,6 @@ static int ieee80211_do_open(struct net_
+@@ -575,30 +574,8 @@ int ieee80211_do_open(struct wireless_de
  
        set_bit(SDATA_STATE_RUNNING, &sdata->state);
  
 -              }
 -
 -              rate_control_rate_init(sta);
+-              netif_carrier_on(dev);
+-      } else if (sdata->vif.type == NL80211_IFTYPE_P2P_DEVICE) {
++      if (sdata->vif.type == NL80211_IFTYPE_P2P_DEVICE)
+               rcu_assign_pointer(local->p2p_sdata, sdata);
 -      }
--
        /*
         * set_multicast_list will be invoked by the networking core
-        * which will check whether any increments here were done in
-@@ -357,8 +334,7 @@ static int ieee80211_do_open(struct net_
-       netif_tx_start_all_queues(dev);
-       return 0;
-- err_del_interface:
--      drv_remove_interface(local, sdata);
-+
-  err_stop:
-       if (!local->open_count)
-               drv_stop(local);
-@@ -720,6 +696,70 @@ static void ieee80211_if_setup(struct ne
+@@ -997,6 +974,72 @@ static void ieee80211_if_setup(struct ne
        dev->destructor = free_netdev;
  }
  
 +      ieee802_11_parse_elems(mgmt->u.probe_resp.variable,
 +                             skb->len - baselen, &elems);
 +
-+      rates = ieee80211_sta_get_rates(local, &elems, band);
++      rates = ieee80211_sta_get_rates(local, &elems, band, NULL);
 +
 +      rcu_read_lock();
 +
 +              set_sta_flag(sta, WLAN_STA_WME);
 +
 +      if (new) {
-+              set_sta_flag(sta, WLAN_STA_AUTHORIZED);
++              sta_info_pre_move_state(sta, IEEE80211_STA_AUTH);
++              sta_info_pre_move_state(sta, IEEE80211_STA_ASSOC);
++              sta_info_pre_move_state(sta, IEEE80211_STA_AUTHORIZED);
 +              rate_control_rate_init(sta);
 +              sta_info_insert_rcu(sta);
 +      }
  static void ieee80211_iface_work(struct work_struct *work)
  {
        struct ieee80211_sub_if_data *sdata =
-@@ -824,6 +864,9 @@ static void ieee80211_iface_work(struct 
+@@ -1101,6 +1144,9 @@ static void ieee80211_iface_work(struct
                                break;
                        ieee80211_mesh_rx_queued_mgmt(sdata, skb);
                        break;
                        break;
 --- a/net/mac80211/rx.c
 +++ b/net/mac80211/rx.c
-@@ -2281,6 +2281,7 @@ ieee80211_rx_h_action(struct ieee80211_r
+@@ -2279,6 +2279,7 @@ ieee80211_rx_h_action(struct ieee80211_r
                    sdata->vif.type != NL80211_IFTYPE_MESH_POINT &&
                    sdata->vif.type != NL80211_IFTYPE_AP_VLAN &&
                    sdata->vif.type != NL80211_IFTYPE_AP &&
                    sdata->vif.type != NL80211_IFTYPE_ADHOC)
                        break;
  
-@@ -2491,14 +2492,15 @@ ieee80211_rx_h_mgmt(struct ieee80211_rx_
+@@ -2496,14 +2497,15 @@ ieee80211_rx_h_mgmt(struct ieee80211_rx_
  
        if (!ieee80211_vif_is_mesh(&sdata->vif) &&
            sdata->vif.type != NL80211_IFTYPE_ADHOC &&
                break;
        case cpu_to_le16(IEEE80211_STYPE_ASSOC_RESP):
        case cpu_to_le16(IEEE80211_STYPE_REASSOC_RESP):
-@@ -2852,10 +2854,16 @@ static int prepare_for_handlers(struct i
+@@ -2827,10 +2829,16 @@ static int prepare_for_handlers(struct i
                }
                break;
        case NL80211_IFTYPE_WDS:
 -              if (bssid || !ieee80211_is_data(hdr->frame_control))
 -                      return 0;
-               if (compare_ether_addr(sdata->u.wds.remote_addr, hdr->addr2))
+               if (!ether_addr_equal(sdata->u.wds.remote_addr, hdr->addr2))
                        return 0;
 +
 +              if (ieee80211_is_data(hdr->frame_control) ||
 +                      return 0;
 +
                break;
-       default:
-               /* should never get here */
---- a/net/mac80211/sta_info.c
-+++ b/net/mac80211/sta_info.c
-@@ -1379,8 +1379,10 @@ int sta_info_move_state(struct sta_info 
-               return -EINVAL;
-       }
-+#ifdef CONFIG_MAC80211_VERBOSE_DEBUG
-       printk(KERN_DEBUG "%s: moving STA %pM to state %d\n",
-               sta->sdata->name, sta->sta.addr, new_state);
-+#endif
-       /*
-        * notify the driver before the actual changes so it can
+       case NL80211_IFTYPE_P2P_DEVICE:
+               if (!ieee80211_is_public_action(hdr, skb->len) &&
 --- a/net/mac80211/sta_info.h
 +++ b/net/mac80211/sta_info.h
-@@ -31,7 +31,6 @@
+@@ -32,7 +32,6 @@
   * @WLAN_STA_SHORT_PREAMBLE: Station is capable of receiving short-preamble
   *    frames.
   * @WLAN_STA_WME: Station is a QoS-STA.
   * @WLAN_STA_CLEAR_PS_FILT: Clear PS filter in hardware (using the
   *    IEEE80211_TX_CTL_CLEAR_PS_FILT control flag) when the next
   *    frame to this station is transmitted.
-@@ -62,7 +61,6 @@ enum ieee80211_sta_info_flags {
+@@ -64,7 +63,6 @@ enum ieee80211_sta_info_flags {
        WLAN_STA_AUTHORIZED,
        WLAN_STA_SHORT_PREAMBLE,
        WLAN_STA_WME,
        WLAN_STA_CLEAR_PS_FILT,
        WLAN_STA_MFP,
        WLAN_STA_BLOCK_BA,
---- a/net/mac80211/rate.h
-+++ b/net/mac80211/rate.h
-@@ -37,7 +37,7 @@ static inline void rate_control_tx_statu
-       struct ieee80211_sta *ista = &sta->sta;
-       void *priv_sta = sta->rate_ctrl_priv;
--      if (!ref)
-+      if (!ref || !test_sta_flag(sta, WLAN_STA_RATE_CONTROL))
-               return;
+--- a/net/mac80211/status.c
++++ b/net/mac80211/status.c
+@@ -517,29 +517,41 @@ void ieee80211_tx_status(struct ieee8021
  
-       ref->ops->tx_status(ref->priv, sband, ista, priv_sta, skb);
---- a/net/mac80211/main.c
-+++ b/net/mac80211/main.c
-@@ -915,6 +915,8 @@ int ieee80211_register_hw(struct ieee802
-               wiphy_debug(local->hw.wiphy, "Failed to initialize wep: %d\n",
-                           result);
-+      ieee80211_led_init(local);
+       if (info->flags & IEEE80211_TX_INTFL_NL80211_FRAME_TX) {
+               u64 cookie = (unsigned long)skb;
++              bool found = false;
 +
-       rtnl_lock();
+               acked = info->flags & IEEE80211_TX_STAT_ACK;
  
-       result = ieee80211_init_rate_ctrl_alg(local,
-@@ -936,8 +938,6 @@ int ieee80211_register_hw(struct ieee802
+-              if (ieee80211_is_nullfunc(hdr->frame_control) ||
+-                  ieee80211_is_qos_nullfunc(hdr->frame_control)) {
+-                      cfg80211_probe_status(skb->dev, hdr->addr1,
+-                                            cookie, acked, GFP_ATOMIC);
+-              } else if (skb->dev) {
+-                      cfg80211_mgmt_tx_status(
+-                              skb->dev->ieee80211_ptr, cookie, skb->data,
+-                              skb->len, acked, GFP_ATOMIC);
+-              } else {
+-                      struct ieee80211_sub_if_data *p2p_sdata;
++              rcu_read_lock();
  
-       rtnl_unlock();
+-                      rcu_read_lock();
++              list_for_each_entry_rcu(sdata, &local->interfaces, list) {
++                      if (!sdata->dev)
++                              continue;
++
++                      if (skb->dev != sdata->dev)
++                              continue;
++
++                      found = true;
++                      break;
++              }
  
--      ieee80211_led_init(local);
--
-       local->network_latency_notifier.notifier_call =
-               ieee80211_max_network_latency;
-       result = pm_qos_add_notifier(PM_QOS_NETWORK_LATENCY,
---- a/drivers/net/wireless/ath/ath9k/ar5008_phy.c
-+++ b/drivers/net/wireless/ath/ath9k/ar5008_phy.c
-@@ -489,8 +489,6 @@ static int ar5008_hw_rf_alloc_ext_banks(
-       ATH_ALLOC_BANK(ah->analogBank6Data, ah->iniBank6.ia_rows);
-       ATH_ALLOC_BANK(ah->analogBank6TPCData, ah->iniBank6TPC.ia_rows);
-       ATH_ALLOC_BANK(ah->analogBank7Data, ah->iniBank7.ia_rows);
--      ATH_ALLOC_BANK(ah->addac5416_21,
--                     ah->iniAddac.ia_rows * ah->iniAddac.ia_columns);
-       ATH_ALLOC_BANK(ah->bank6Temp, ah->iniBank6.ia_rows);
+-                      p2p_sdata = rcu_dereference(local->p2p_sdata);
+-                      if (p2p_sdata) {
+-                              cfg80211_mgmt_tx_status(
+-                                      &p2p_sdata->wdev, cookie, skb->data,
+-                                      skb->len, acked, GFP_ATOMIC);
+-                      }
+-                      rcu_read_unlock();
++              if (!skb->dev) {
++                      sdata = rcu_dereference(local->p2p_sdata);
++                      if (sdata)
++                              found = true;
+               }
++
++              if (!found)
++                      skb->dev = NULL;
++              else if (ieee80211_is_nullfunc(hdr->frame_control) ||
++                       ieee80211_is_qos_nullfunc(hdr->frame_control)) {
++                      cfg80211_probe_status(sdata->dev, hdr->addr1,
++                                            cookie, acked, GFP_ATOMIC);
++              } else {
++                      cfg80211_mgmt_tx_status(&sdata->wdev, cookie, skb->data,
++                                              skb->len, acked, GFP_ATOMIC);
++              }
++
++              rcu_read_unlock();
+       }
  
-       return 0;
-@@ -519,7 +517,6 @@ static void ar5008_hw_rf_free_ext_banks(
-       ATH_FREE_BANK(ah->analogBank6Data);
-       ATH_FREE_BANK(ah->analogBank6TPCData);
-       ATH_FREE_BANK(ah->analogBank7Data);
--      ATH_FREE_BANK(ah->addac5416_21);
-       ATH_FREE_BANK(ah->bank6Temp);
+       if (unlikely(info->ack_frame_id)) {
+--- a/drivers/net/wireless/p54/main.c
++++ b/drivers/net/wireless/p54/main.c
+@@ -139,6 +139,7 @@ static int p54_beacon_format_ie_tim(stru
+ static int p54_beacon_update(struct p54_common *priv,
+                       struct ieee80211_vif *vif)
+ {
++      struct ieee80211_tx_control control = { };
+       struct sk_buff *beacon;
+       int ret;
  
- #undef ATH_FREE_BANK
-@@ -805,27 +802,7 @@ static int ar5008_hw_process_ini(struct 
-       if (ah->eep_ops->set_addac)
-               ah->eep_ops->set_addac(ah, chan);
+@@ -158,7 +159,7 @@ static int p54_beacon_update(struct p54_
+        * to cancel the old beacon template by hand, instead the firmware
+        * will release the previous one through the feedback mechanism.
+        */
+-      p54_tx_80211(priv->hw, NULL, beacon);
++      p54_tx_80211(priv->hw, &control, beacon);
+       priv->tsf_high32 = 0;
+       priv->tsf_low32 = 0;
  
--      if (AR_SREV_5416_22_OR_LATER(ah)) {
--              REG_WRITE_ARRAY(&ah->iniAddac, 1, regWrites);
--      } else {
--              struct ar5416IniArray temp;
--              u32 addacSize =
--                      sizeof(u32) * ah->iniAddac.ia_rows *
--                      ah->iniAddac.ia_columns;
--
--              /* For AR5416 2.0/2.1 */
--              memcpy(ah->addac5416_21,
--                     ah->iniAddac.ia_array, addacSize);
--
--              /* override CLKDRV value at [row, column] = [31, 1] */
--              (ah->addac5416_21)[31 * ah->iniAddac.ia_columns + 1] = 0;
--
--              temp.ia_array = ah->addac5416_21;
--              temp.ia_columns = ah->iniAddac.ia_columns;
--              temp.ia_rows = ah->iniAddac.ia_rows;
--              REG_WRITE_ARRAY(&temp, 1, regWrites);
--      }
--
-+      REG_WRITE_ARRAY(&ah->iniAddac, 1, regWrites);
-       REG_WRITE(ah, AR_PHY_ADC_SERIAL_CTL, AR_PHY_SEL_INTERNAL_ADDAC);
+--- a/net/wireless/reg.c
++++ b/net/wireless/reg.c
+@@ -352,6 +352,9 @@ static void reg_regdb_search(struct work
+       struct reg_regdb_search_request *request;
+       const struct ieee80211_regdomain *curdom, *regdom;
+       int i, r;
++      bool set_reg = false;
++
++      mutex_lock(&cfg80211_mutex);
  
-       ENABLE_REGWRITE_BUFFER(ah);
---- a/drivers/net/wireless/ath/ath9k/ar9002_hw.c
-+++ b/drivers/net/wireless/ath/ath9k/ar9002_hw.c
-@@ -180,6 +180,25 @@ static void ar9002_hw_init_mode_regs(str
-               INIT_INI_ARRAY(&ah->iniAddac, ar5416Addac,
-                              ARRAY_SIZE(ar5416Addac), 2);
+       mutex_lock(&reg_regdb_search_mutex);
+       while (!list_empty(&reg_regdb_search_list)) {
+@@ -367,9 +370,7 @@ static void reg_regdb_search(struct work
+                               r = reg_copy_regd(&regdom, curdom);
+                               if (r)
+                                       break;
+-                              mutex_lock(&cfg80211_mutex);
+-                              set_regdom(regdom);
+-                              mutex_unlock(&cfg80211_mutex);
++                              set_reg = true;
+                               break;
+                       }
+               }
+@@ -377,6 +378,11 @@ static void reg_regdb_search(struct work
+               kfree(request);
        }
+       mutex_unlock(&reg_regdb_search_mutex);
 +
-+      /* iniAddac needs to be modified for these chips */
-+      if (AR_SREV_9160(ah) || !AR_SREV_5416_22_OR_LATER(ah)) {
-+              struct ar5416IniArray *addac = &ah->iniAddac;
-+              u32 size = sizeof(u32) * addac->ia_rows * addac->ia_columns;
-+              u32 *data;
-+
-+              data = kmalloc(size, GFP_KERNEL);
-+              if (!data)
-+                      return;
++      if (set_reg)
++              set_regdom(regdom);
 +
-+              memcpy(data, addac->ia_array, size);
-+              addac->ia_array = data;
-+
-+              if (!AR_SREV_5416_22_OR_LATER(ah)) {
-+                      /* override CLKDRV value */
-+                      INI_RA(addac, 31,1) = 0;
-+              }
-+      }
++      mutex_unlock(&cfg80211_mutex);
  }
  
- /* Support for Japan ch.14 (2484) spread */
---- a/drivers/net/wireless/ath/ath9k/hw.h
-+++ b/drivers/net/wireless/ath/ath9k/hw.h
-@@ -940,7 +940,6 @@ struct ath_hw {
-       u32 *analogBank6Data;
-       u32 *analogBank6TPCData;
-       u32 *analogBank7Data;
--      u32 *addac5416_21;
-       u32 *bank6Temp;
+ static DECLARE_WORK(reg_regdb_work, reg_regdb_search);
+--- a/drivers/net/wireless/ath/ath9k/recv.c
++++ b/drivers/net/wireless/ath/ath9k/recv.c
+@@ -424,8 +424,8 @@ u32 ath_calcrxfilter(struct ath_softc *s
+               rfilt |= ATH9K_RX_FILTER_COMP_BAR;
+       if (sc->nvifs > 1 || (sc->rx.rxfilter & FIF_OTHER_BSS)) {
+-              /* The following may also be needed for other older chips */
+-              if (sc->sc_ah->hw_version.macVersion == AR_SREV_VERSION_9160)
++              /* This is needed for older chips */
++              if (sc->sc_ah->hw_version.macVersion <= AR_SREV_VERSION_9160)
+                       rfilt |= ATH9K_RX_FILTER_PROM;
+               rfilt |= ATH9K_RX_FILTER_MCAST_BCAST_ALL;
+       }
+--- a/net/mac80211/mlme.c
++++ b/net/mac80211/mlme.c
+@@ -1390,7 +1390,7 @@ static void ieee80211_set_disassoc(struc
+       sta = sta_info_get(sdata, ifmgd->bssid);
+       if (sta) {
+               set_sta_flag(sta, WLAN_STA_BLOCK_BA);
+-              ieee80211_sta_tear_down_BA_sessions(sta, tx);
++              ieee80211_sta_tear_down_BA_sessions(sta, false);
+       }
+       mutex_unlock(&local->sta_mtx);
+--- a/net/mac80211/sta_info.c
++++ b/net/mac80211/sta_info.c
+@@ -674,7 +674,7 @@ int __must_check __sta_info_destroy(stru
+        * will be sufficient.
+        */
+       set_sta_flag(sta, WLAN_STA_BLOCK_BA);
+-      ieee80211_sta_tear_down_BA_sessions(sta, true);
++      ieee80211_sta_tear_down_BA_sessions(sta, false);
  
-       u8 txpower_limit;
+       ret = sta_info_hash_del(local, sta);
+       if (ret)