]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - net/mac80211/iface.c
Merge tag 'mlx5-updates-2017-06-16' of git://git.kernel.org/pub/scm/linux/kernel...
[karo-tx-linux.git] / net / mac80211 / iface.c
index 8fae1a72e6a7c7ea4f71ec3a3beb215b987a715f..9228ac73c429921673bf2c058e821a07dcdfec92 100644 (file)
@@ -1213,7 +1213,6 @@ static const struct net_device_ops ieee80211_monitorif_ops = {
 static void ieee80211_if_free(struct net_device *dev)
 {
        free_percpu(dev->tstats);
-       free_netdev(dev);
 }
 
 static void ieee80211_if_setup(struct net_device *dev)
@@ -1221,7 +1220,8 @@ static void ieee80211_if_setup(struct net_device *dev)
        ether_setup(dev);
        dev->priv_flags &= ~IFF_TX_SKB_SHARING;
        dev->netdev_ops = &ieee80211_dataif_ops;
-       dev->destructor = ieee80211_if_free;
+       dev->needs_free_netdev = true;
+       dev->priv_destructor = ieee80211_if_free;
 }
 
 static void ieee80211_if_setup_no_queue(struct net_device *dev)
@@ -1237,7 +1237,6 @@ static void ieee80211_iface_work(struct work_struct *work)
        struct ieee80211_local *local = sdata->local;
        struct sk_buff *skb;
        struct sta_info *sta;
-       struct ieee80211_rx_agg *rx_agg;
 
        if (!ieee80211_sdata_running(sdata))
                return;
@@ -1252,28 +1251,8 @@ static void ieee80211_iface_work(struct work_struct *work)
        while ((skb = skb_dequeue(&sdata->skb_queue))) {
                struct ieee80211_mgmt *mgmt = (void *)skb->data;
 
-               if (skb->pkt_type == IEEE80211_SDATA_QUEUE_RX_AGG_START) {
-                       rx_agg = (void *)&skb->cb;
-                       mutex_lock(&local->sta_mtx);
-                       sta = sta_info_get_bss(sdata, rx_agg->addr);
-                       if (sta)
-                               __ieee80211_start_rx_ba_session(sta,
-                                               0, 0, 0, 1, rx_agg->tid,
-                                               IEEE80211_MAX_AMPDU_BUF,
-                                               false, true);
-                       mutex_unlock(&local->sta_mtx);
-               } else if (skb->pkt_type == IEEE80211_SDATA_QUEUE_RX_AGG_STOP) {
-                       rx_agg = (void *)&skb->cb;
-                       mutex_lock(&local->sta_mtx);
-                       sta = sta_info_get_bss(sdata, rx_agg->addr);
-                       if (sta)
-                               __ieee80211_stop_rx_ba_session(sta,
-                                                       rx_agg->tid,
-                                                       WLAN_BACK_RECIPIENT, 0,
-                                                       false);
-                       mutex_unlock(&local->sta_mtx);
-               } else if (ieee80211_is_action(mgmt->frame_control) &&
-                          mgmt->u.action.category == WLAN_CATEGORY_BACK) {
+               if (ieee80211_is_action(mgmt->frame_control) &&
+                   mgmt->u.action.category == WLAN_CATEGORY_BACK) {
                        int len = skb->len;
 
                        mutex_lock(&local->sta_mtx);
@@ -1816,6 +1795,7 @@ int ieee80211_if_add(struct ieee80211_local *local, const char *name,
                ret = dev_alloc_name(ndev, ndev->name);
                if (ret < 0) {
                        ieee80211_if_free(ndev);
+                       free_netdev(ndev);
                        return ret;
                }
 
@@ -1905,7 +1885,7 @@ int ieee80211_if_add(struct ieee80211_local *local, const char *name,
 
                ret = register_netdevice(ndev);
                if (ret) {
-                       ieee80211_if_free(ndev);
+                       free_netdev(ndev);
                        return ret;
                }
        }