const: constify remaining dev_pm_ops
[safe/jmp/linux-2.6] / net / mac80211 / iface.c
index b161301..80c16f6 100644 (file)
@@ -184,10 +184,12 @@ static int ieee80211_open(struct net_device *dev)
                 * No need to check netif_running since we do not allow
                 * it to start up with this invalid address.
                 */
-               if (compare_ether_addr(null_addr, ndev->dev_addr) == 0)
+               if (compare_ether_addr(null_addr, ndev->dev_addr) == 0) {
                        memcpy(ndev->dev_addr,
                               local->hw.wiphy->perm_addr,
                               ETH_ALEN);
+                       memcpy(ndev->perm_addr, ndev->dev_addr, ETH_ALEN);
+               }
        }
 
        /*
@@ -212,8 +214,8 @@ static int ieee80211_open(struct net_device *dev)
                /* must be before the call to ieee80211_configure_filter */
                local->monitors++;
                if (local->monitors == 1) {
-                       local->hw.conf.flags |= IEEE80211_CONF_RADIOTAP;
-                       hw_reconf_flags |= IEEE80211_CONF_CHANGE_RADIOTAP;
+                       local->hw.conf.flags |= IEEE80211_CONF_MONITOR;
+                       hw_reconf_flags |= IEEE80211_CONF_CHANGE_MONITOR;
                }
 
                if (sdata->u.mntr_flags & MONITOR_FLAG_FCSFAIL)
@@ -277,11 +279,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
@@ -317,7 +314,7 @@ static int ieee80211_open(struct net_device *dev)
        if (sdata->vif.type == NL80211_IFTYPE_STATION)
                ieee80211_queue_work(&local->hw, &sdata->u.mgd.work);
 
-       netif_tx_start_all_queues(dev);
+       netif_start_queue(dev);
 
        return 0;
  err_del_interface:
@@ -346,7 +343,7 @@ static int ieee80211_stop(struct net_device *dev)
        /*
         * Stop TX on this interface first.
         */
-       netif_tx_stop_all_queues(dev);
+       netif_stop_queue(dev);
 
        /*
         * Now delete all active aggregation sessions.
@@ -438,8 +435,8 @@ static int ieee80211_stop(struct net_device *dev)
 
                local->monitors--;
                if (local->monitors == 0) {
-                       local->hw.conf.flags &= ~IEEE80211_CONF_RADIOTAP;
-                       hw_reconf_flags |= IEEE80211_CONF_CHANGE_RADIOTAP;
+                       local->hw.conf.flags &= ~IEEE80211_CONF_MONITOR;
+                       hw_reconf_flags |= IEEE80211_CONF_CHANGE_MONITOR;
                }
 
                if (sdata->u.mntr_flags & MONITOR_FLAG_FCSFAIL)
@@ -502,30 +499,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 +527,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;
@@ -783,6 +752,8 @@ int ieee80211_if_change_type(struct ieee80211_sub_if_data *sdata,
                ieee80211_mandatory_rates(sdata->local,
                        sdata->local->hw.conf.channel->band);
        sdata->drop_unencrypted = 0;
+       if (type == NL80211_IFTYPE_STATION)
+               sdata->u.mgd.use_4addr = false;
 
        return 0;
 }
@@ -817,6 +788,7 @@ int ieee80211_if_add(struct ieee80211_local *local, const char *name,
                goto fail;
 
        memcpy(ndev->dev_addr, local->hw.wiphy->perm_addr, ETH_ALEN);
+       memcpy(ndev->perm_addr, ndev->dev_addr, ETH_ALEN);
        SET_NETDEV_DEV(ndev, wiphy_dev(local->hw.wiphy));
 
        /* don't use IEEE80211_DEV_TO_SUB_IF because it checks too much */
@@ -839,6 +811,12 @@ int ieee80211_if_add(struct ieee80211_local *local, const char *name,
        /* setup type-dependent data */
        ieee80211_setup_sdata(sdata, type);
 
+       if (params) {
+               ndev->ieee80211_ptr->use_4addr = params->use_4addr;
+               if (type == NL80211_IFTYPE_STATION)
+                       sdata->u.mgd.use_4addr = params->use_4addr;
+       }
+
        ret = register_netdevice(ndev);
        if (ret)
                goto fail;
@@ -882,22 +860,18 @@ void ieee80211_if_remove(struct ieee80211_sub_if_data *sdata)
 void ieee80211_remove_interfaces(struct ieee80211_local *local)
 {
        struct ieee80211_sub_if_data *sdata, *tmp;
+       LIST_HEAD(unreg_list);
 
        ASSERT_RTNL();
 
+       mutex_lock(&local->iflist_mtx);
        list_for_each_entry_safe(sdata, tmp, &local->interfaces, list) {
-               /*
-                * we cannot hold the iflist_mtx across unregister_netdevice,
-                * but we only need to hold it for list modifications to lock
-                * out readers since we're under the RTNL here as all other
-                * writers.
-                */
-               mutex_lock(&local->iflist_mtx);
                list_del(&sdata->list);
-               mutex_unlock(&local->iflist_mtx);
 
-               unregister_netdevice(sdata->dev);
+               unregister_netdevice_queue(sdata->dev, &unreg_list);
        }
+       mutex_unlock(&local->iflist_mtx);
+       unregister_netdevice_many(&unreg_list);
 }
 
 static u32 ieee80211_idle_off(struct ieee80211_local *local,