]> Pileus Git - ~andy/linux/blobdiff - net/mac80211/iface.c
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/sparc-next-2.6
[~andy/linux] / net / mac80211 / iface.c
index b161301056dfd02d08c2a22630c624341bd5fee1..b8295cbd7e8f2243e044a611d02efd08cd5c0238 100644 (file)
@@ -277,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
@@ -502,30 +497,8 @@ static int ieee80211_stop(struct net_device *dev)
                }
                /* 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
@@ -552,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;
@@ -787,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)
@@ -818,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);