aboutsummaryrefslogtreecommitdiffstats
path: root/net/mac80211/iface.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/mac80211/iface.c')
-rw-r--r--net/mac80211/iface.c18
1 files changed, 17 insertions, 1 deletions
diff --git a/net/mac80211/iface.c b/net/mac80211/iface.c
index 60f1ce5e5e52..ceef64426a8d 100644
--- a/net/mac80211/iface.c
+++ b/net/mac80211/iface.c
@@ -474,6 +474,9 @@ int ieee80211_do_open(struct wireless_dev *wdev, bool coming_up)
474 master->control_port_protocol; 474 master->control_port_protocol;
475 sdata->control_port_no_encrypt = 475 sdata->control_port_no_encrypt =
476 master->control_port_no_encrypt; 476 master->control_port_no_encrypt;
477 sdata->vif.cab_queue = master->vif.cab_queue;
478 memcpy(sdata->vif.hw_queue, master->vif.hw_queue,
479 sizeof(sdata->vif.hw_queue));
477 break; 480 break;
478 } 481 }
479 case NL80211_IFTYPE_AP: 482 case NL80211_IFTYPE_AP:
@@ -653,7 +656,11 @@ int ieee80211_do_open(struct wireless_dev *wdev, bool coming_up)
653 656
654 ieee80211_recalc_ps(local, -1); 657 ieee80211_recalc_ps(local, -1);
655 658
656 if (dev) { 659 if (sdata->vif.type == NL80211_IFTYPE_MONITOR ||
660 sdata->vif.type == NL80211_IFTYPE_AP_VLAN) {
661 /* XXX: for AP_VLAN, actually track AP queues */
662 netif_tx_start_all_queues(dev);
663 } else if (dev) {
657 unsigned long flags; 664 unsigned long flags;
658 int n_acs = IEEE80211_NUM_ACS; 665 int n_acs = IEEE80211_NUM_ACS;
659 int ac; 666 int ac;
@@ -1696,6 +1703,15 @@ void ieee80211_remove_interfaces(struct ieee80211_local *local)
1696 1703
1697 ASSERT_RTNL(); 1704 ASSERT_RTNL();
1698 1705
1706 /*
1707 * Close all AP_VLAN interfaces first, as otherwise they
1708 * might be closed while the AP interface they belong to
1709 * is closed, causing unregister_netdevice_many() to crash.
1710 */
1711 list_for_each_entry(sdata, &local->interfaces, list)
1712 if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN)
1713 dev_close(sdata->dev);
1714
1699 mutex_lock(&local->iflist_mtx); 1715 mutex_lock(&local->iflist_mtx);
1700 list_for_each_entry_safe(sdata, tmp, &local->interfaces, list) { 1716 list_for_each_entry_safe(sdata, tmp, &local->interfaces, list) {
1701 list_del(&sdata->list); 1717 list_del(&sdata->list);