mac80211: remove master netdev
[GitHub/LineageOS/android_kernel_samsung_universal7580.git] / net / mac80211 / iface.c
index 090aa5a47182c3f3830d5e02fb5ea79baedf359e..2f797a86ced54a1f970e5084c767e3b256a3da9a 100644 (file)
@@ -190,10 +190,6 @@ static int ieee80211_open(struct net_device *dev)
                               ETH_ALEN);
        }
 
-       if (compare_ether_addr(null_addr, local->mdev->dev_addr) == 0)
-               memcpy(local->mdev->dev_addr, local->hw.wiphy->perm_addr,
-                      ETH_ALEN);
-
        /*
         * Validate the MAC address for this device.
         */
@@ -229,9 +225,9 @@ static int ieee80211_open(struct net_device *dev)
                if (sdata->u.mntr_flags & MONITOR_FLAG_OTHER_BSS)
                        local->fif_other_bss++;
 
-               netif_addr_lock_bh(local->mdev);
+               spin_lock_bh(&local->filter_lock);
                ieee80211_configure_filter(local);
-               netif_addr_unlock_bh(local->mdev);
+               spin_unlock_bh(&local->filter_lock);
                break;
        default:
                conf.vif = &sdata->vif;
@@ -243,9 +239,9 @@ static int ieee80211_open(struct net_device *dev)
 
                if (ieee80211_vif_is_mesh(&sdata->vif)) {
                        local->fif_other_bss++;
-                       netif_addr_lock_bh(local->mdev);
+                       spin_lock_bh(&local->filter_lock);
                        ieee80211_configure_filter(local);
-                       netif_addr_unlock_bh(local->mdev);
+                       spin_unlock_bh(&local->filter_lock);
 
                        ieee80211_start_mesh(sdata);
                }
@@ -279,10 +275,6 @@ static int ieee80211_open(struct net_device *dev)
        }
 
        if (local->open_count == 0) {
-               res = dev_open(local->mdev);
-               WARN_ON(res);
-               if (res)
-                       goto err_del_interface;
                tasklet_enable(&local->tx_pending_tasklet);
                tasklet_enable(&local->tasklet);
        }
@@ -393,7 +385,14 @@ static int ieee80211_stop(struct net_device *dev)
        if (sdata->flags & IEEE80211_SDATA_PROMISC)
                atomic_dec(&local->iff_promiscs);
 
-       dev_mc_unsync(local->mdev, dev);
+       netif_addr_lock_bh(dev);
+       spin_lock_bh(&local->filter_lock);
+       __dev_addr_unsync(&local->mc_list, &local->mc_count,
+                         &dev->mc_list, &dev->mc_count);
+       ieee80211_configure_filter(local);
+       spin_unlock_bh(&local->filter_lock);
+       netif_addr_unlock_bh(dev);
+
        del_timer_sync(&local->dynamic_ps_timer);
        cancel_work_sync(&local->dynamic_ps_enable_work);
 
@@ -442,9 +441,9 @@ static int ieee80211_stop(struct net_device *dev)
                if (sdata->u.mntr_flags & MONITOR_FLAG_OTHER_BSS)
                        local->fif_other_bss--;
 
-               netif_addr_lock_bh(local->mdev);
+               spin_lock_bh(&local->filter_lock);
                ieee80211_configure_filter(local);
-               netif_addr_unlock_bh(local->mdev);
+               spin_unlock_bh(&local->filter_lock);
                break;
        case NL80211_IFTYPE_STATION:
                del_timer_sync(&sdata->u.mgd.chswitch_timer);
@@ -487,9 +486,9 @@ static int ieee80211_stop(struct net_device *dev)
                        local->fif_other_bss--;
                        atomic_dec(&local->iff_allmultis);
 
-                       netif_addr_lock_bh(local->mdev);
+                       spin_lock_bh(&local->filter_lock);
                        ieee80211_configure_filter(local);
-                       netif_addr_unlock_bh(local->mdev);
+                       spin_unlock_bh(&local->filter_lock);
 
                        ieee80211_stop_mesh(sdata);
                }
@@ -535,9 +534,6 @@ static int ieee80211_stop(struct net_device *dev)
        ieee80211_recalc_ps(local, -1);
 
        if (local->open_count == 0) {
-               if (netif_running(local->mdev))
-                       dev_close(local->mdev);
-
                drv_stop(local);
 
                ieee80211_led_radio(local, false);
@@ -584,8 +580,11 @@ static void ieee80211_set_multicast_list(struct net_device *dev)
                        atomic_dec(&local->iff_promiscs);
                sdata->flags ^= IEEE80211_SDATA_PROMISC;
        }
-
-       dev_mc_sync(local->mdev, dev);
+       spin_lock_bh(&local->filter_lock);
+       __dev_addr_sync(&local->mc_list, &local->mc_count,
+                       &dev->mc_list, &dev->mc_count);
+       ieee80211_configure_filter(local);
+       spin_unlock_bh(&local->filter_lock);
 }
 
 /*