Merge branch 'davinci-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git...
[pandora-kernel.git] / net / mac80211 / iface.c
index e8fb03b..b8295cb 100644 (file)
@@ -227,9 +227,7 @@ static int ieee80211_open(struct net_device *dev)
                if (sdata->u.mntr_flags & MONITOR_FLAG_OTHER_BSS)
                        local->fif_other_bss++;
 
-               spin_lock_bh(&local->filter_lock);
                ieee80211_configure_filter(local);
-               spin_unlock_bh(&local->filter_lock);
                break;
        default:
                conf.vif = &sdata->vif;
@@ -241,17 +239,13 @@ static int ieee80211_open(struct net_device *dev)
 
                if (ieee80211_vif_is_mesh(&sdata->vif)) {
                        local->fif_other_bss++;
-                       spin_lock_bh(&local->filter_lock);
                        ieee80211_configure_filter(local);
-                       spin_unlock_bh(&local->filter_lock);
 
                        ieee80211_start_mesh(sdata);
                } else if (sdata->vif.type == NL80211_IFTYPE_AP) {
                        local->fif_pspoll++;
 
-                       spin_lock_bh(&local->filter_lock);
                        ieee80211_configure_filter(local);
-                       spin_unlock_bh(&local->filter_lock);
                }
 
                changed |= ieee80211_reset_erp_info(sdata);
@@ -283,11 +277,6 @@ static int ieee80211_open(struct net_device *dev)
                }
        }
 
-       if (local->open_count == 0) {
-               tasklet_enable(&local->tx_pending_tasklet);
-               tasklet_enable(&local->tasklet);
-       }
-
        /*
         * set_multicast_list will be invoked by the networking core
         * which will check whether any increments here were done in
@@ -404,10 +393,11 @@ static int ieee80211_stop(struct net_device *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);
 
+       ieee80211_configure_filter(local);
+
        del_timer_sync(&local->dynamic_ps_timer);
        cancel_work_sync(&local->dynamic_ps_enable_work);
 
@@ -458,9 +448,7 @@ static int ieee80211_stop(struct net_device *dev)
                if (sdata->u.mntr_flags & MONITOR_FLAG_OTHER_BSS)
                        local->fif_other_bss--;
 
-               spin_lock_bh(&local->filter_lock);
                ieee80211_configure_filter(local);
-               spin_unlock_bh(&local->filter_lock);
                break;
        case NL80211_IFTYPE_STATION:
                del_timer_sync(&sdata->u.mgd.chswitch_timer);
@@ -503,38 +491,14 @@ static int ieee80211_stop(struct net_device *dev)
                        local->fif_other_bss--;
                        atomic_dec(&local->iff_allmultis);
 
-                       spin_lock_bh(&local->filter_lock);
                        ieee80211_configure_filter(local);
-                       spin_unlock_bh(&local->filter_lock);
 
                        ieee80211_stop_mesh(sdata);
                }
                /* fall through */
        default:
-               if (local->scan_sdata == sdata) {
-                       if (!local->ops->hw_scan)
-                               cancel_delayed_work_sync(&local->scan_work);
-                       /*
-                        * The software scan can no longer run now, so we can
-                        * clear out the scan_sdata reference. However, the
-                        * hardware scan may still be running. The complete
-                        * function must be prepared to handle a NULL value.
-                        */
-                       local->scan_sdata = NULL;
-                       /*
-                        * The memory barrier guarantees that another CPU
-                        * that is hardware-scanning will now see the fact
-                        * that this interface is gone.
-                        */
-                       smp_mb();
-                       /*
-                        * If software scanning, complete the scan but since
-                        * the scan_sdata is NULL already don't send out a
-                        * scan event to userspace -- the scan is incomplete.
-                        */
-                       if (test_bit(SCAN_SW_SCANNING, &local->scanning))
-                               ieee80211_scan_completed(&local->hw, true);
-               }
+               if (local->scan_sdata == sdata)
+                       ieee80211_scan_cancel(local);
 
                /*
                 * Disable beaconing for AP and mesh, IBSS can't
@@ -561,14 +525,8 @@ static int ieee80211_stop(struct net_device *dev)
        ieee80211_recalc_ps(local, -1);
 
        if (local->open_count == 0) {
-               drv_stop(local);
-
-               ieee80211_led_radio(local, false);
-
-               flush_workqueue(local->workqueue);
-
-               tasklet_disable(&local->tx_pending_tasklet);
-               tasklet_disable(&local->tasklet);
+               ieee80211_clear_tx_pending(local);
+               ieee80211_stop_device(local);
 
                /* no reconfiguring after stop! */
                hw_reconf_flags = 0;
@@ -622,8 +580,8 @@ static void ieee80211_set_multicast_list(struct net_device *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);
+       ieee80211_queue_work(&local->hw, &local->reconfig_filter);
 }
 
 /*
@@ -796,6 +754,10 @@ int ieee80211_if_change_type(struct ieee80211_sub_if_data *sdata,
        return 0;
 }
 
+static struct device_type wiphy_type = {
+       .name   = "wlan",
+};
+
 int ieee80211_if_add(struct ieee80211_local *local, const char *name,
                     struct net_device **new_dev, enum nl80211_iftype type,
                     struct vif_params *params)
@@ -827,6 +789,7 @@ int ieee80211_if_add(struct ieee80211_local *local, const char *name,
 
        memcpy(ndev->dev_addr, local->hw.wiphy->perm_addr, ETH_ALEN);
        SET_NETDEV_DEV(ndev, wiphy_dev(local->hw.wiphy));
+       SET_NETDEV_DEVTYPE(ndev, &wiphy_type);
 
        /* don't use IEEE80211_DEV_TO_SUB_IF because it checks too much */
        sdata = netdev_priv(ndev);