Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
[firefly-linux-kernel-4.4.55.git] / net / mac80211 / mesh.c
index 29ce2aa87e7b60fdd344f7fd8acb1148cbc477fd..123a300cef574de7b695399a413549f1d0fb3f5a 100644 (file)
 #include "ieee80211_i.h"
 #include "mesh.h"
 
-#define TMR_RUNNING_HK 0
-#define TMR_RUNNING_MP 1
-#define TMR_RUNNING_MPR        2
-
 static int mesh_allocated;
 static struct kmem_cache *rm_cache;
 
@@ -50,11 +46,6 @@ static void ieee80211_mesh_housekeeping_timer(unsigned long data)
 
        set_bit(MESH_WORK_HOUSEKEEPING, &ifmsh->wrkq_flags);
 
-       if (local->quiescing) {
-               set_bit(TMR_RUNNING_HK, &ifmsh->timers_running);
-               return;
-       }
-
        ieee80211_queue_work(&local->hw, &sdata->work);
 }
 
@@ -165,7 +156,7 @@ void mesh_sta_cleanup(struct sta_info *sta)
         * an update.
         */
        changed = mesh_accept_plinks_update(sdata);
-       if (sdata->u.mesh.security == IEEE80211_MESH_SEC_NONE) {
+       if (!sdata->u.mesh.user_mpm) {
                changed |= mesh_plink_deactivate(sta);
                del_timer_sync(&sta->plink_timer);
        }
@@ -479,15 +470,8 @@ static void ieee80211_mesh_path_timer(unsigned long data)
 {
        struct ieee80211_sub_if_data *sdata =
                (struct ieee80211_sub_if_data *) data;
-       struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh;
-       struct ieee80211_local *local = sdata->local;
-
-       if (local->quiescing) {
-               set_bit(TMR_RUNNING_MP, &ifmsh->timers_running);
-               return;
-       }
 
-       ieee80211_queue_work(&local->hw, &sdata->work);
+       ieee80211_queue_work(&sdata->local->hw, &sdata->work);
 }
 
 static void ieee80211_mesh_path_root_timer(unsigned long data)
@@ -495,16 +479,10 @@ static void ieee80211_mesh_path_root_timer(unsigned long data)
        struct ieee80211_sub_if_data *sdata =
                (struct ieee80211_sub_if_data *) data;
        struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh;
-       struct ieee80211_local *local = sdata->local;
 
        set_bit(MESH_WORK_ROOT, &ifmsh->wrkq_flags);
 
-       if (local->quiescing) {
-               set_bit(TMR_RUNNING_MPR, &ifmsh->timers_running);
-               return;
-       }
-
-       ieee80211_queue_work(&local->hw, &sdata->work);
+       ieee80211_queue_work(&sdata->local->hw, &sdata->work);
 }
 
 void ieee80211_mesh_root_setup(struct ieee80211_if_mesh *ifmsh)
@@ -622,35 +600,6 @@ static void ieee80211_mesh_rootpath(struct ieee80211_sub_if_data *sdata)
                  round_jiffies(TU_TO_EXP_TIME(interval)));
 }
 
-#ifdef CONFIG_PM
-void ieee80211_mesh_quiesce(struct ieee80211_sub_if_data *sdata)
-{
-       struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh;
-
-       /* use atomic bitops in case all timers fire at the same time */
-
-       if (del_timer_sync(&ifmsh->housekeeping_timer))
-               set_bit(TMR_RUNNING_HK, &ifmsh->timers_running);
-       if (del_timer_sync(&ifmsh->mesh_path_timer))
-               set_bit(TMR_RUNNING_MP, &ifmsh->timers_running);
-       if (del_timer_sync(&ifmsh->mesh_path_root_timer))
-               set_bit(TMR_RUNNING_MPR, &ifmsh->timers_running);
-}
-
-void ieee80211_mesh_restart(struct ieee80211_sub_if_data *sdata)
-{
-       struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh;
-
-       if (test_and_clear_bit(TMR_RUNNING_HK, &ifmsh->timers_running))
-               add_timer(&ifmsh->housekeeping_timer);
-       if (test_and_clear_bit(TMR_RUNNING_MP, &ifmsh->timers_running))
-               add_timer(&ifmsh->mesh_path_timer);
-       if (test_and_clear_bit(TMR_RUNNING_MPR, &ifmsh->timers_running))
-               add_timer(&ifmsh->mesh_path_root_timer);
-       ieee80211_mesh_root_setup(ifmsh);
-}
-#endif
-
 static int
 ieee80211_mesh_build_beacon(struct ieee80211_if_mesh *ifmsh)
 {
@@ -750,10 +699,8 @@ out_free:
 static int
 ieee80211_mesh_rebuild_beacon(struct ieee80211_if_mesh *ifmsh)
 {
-       struct ieee80211_sub_if_data *sdata;
        struct beacon_data *old_bcn;
        int ret;
-       sdata = container_of(ifmsh, struct ieee80211_sub_if_data, u.mesh);
 
        mutex_lock(&ifmsh->mtx);
 
@@ -871,8 +818,6 @@ void ieee80211_stop_mesh(struct ieee80211_sub_if_data *sdata)
        local->fif_other_bss--;
        atomic_dec(&local->iff_allmultis);
        ieee80211_configure_filter(local);
-
-       sdata->u.mesh.timers_running = 0;
 }
 
 static void
@@ -886,9 +831,8 @@ ieee80211_mesh_rx_probe_req(struct ieee80211_sub_if_data *sdata,
        struct ieee80211_mgmt *hdr;
        struct ieee802_11_elems elems;
        size_t baselen;
-       u8 *pos, *end;
+       u8 *pos;
 
-       end = ((u8 *) mgmt) + len;
        pos = mgmt->u.probe_req.variable;
        baselen = (u8 *) pos - (u8 *) mgmt;
        if (baselen > len)
@@ -1060,7 +1004,8 @@ void ieee80211_mesh_notify_scan_completed(struct ieee80211_local *local)
 
        rcu_read_lock();
        list_for_each_entry_rcu(sdata, &local->interfaces, list)
-               if (ieee80211_vif_is_mesh(&sdata->vif))
+               if (ieee80211_vif_is_mesh(&sdata->vif) &&
+                   ieee80211_sdata_running(sdata))
                        ieee80211_queue_work(&local->hw, &sdata->work);
        rcu_read_unlock();
 }