aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFelix Fietkau <nbd@openwrt.org>2013-05-24 11:54:47 +0000
committerFelix Fietkau <nbd@openwrt.org>2013-05-24 11:54:47 +0000
commit18c6ed3ae3fac31965eb9ec5d6f0e89a6b32eebe (patch)
tree3e649015ea6b9038d8c6114deb36b90633e14d84
parentab98ef05fc4e577aa5e535695bbd5494133f0a4e (diff)
downloadupstream-18c6ed3ae3fac31965eb9ec5d6f0e89a6b32eebe.tar.gz
upstream-18c6ed3ae3fac31965eb9ec5d6f0e89a6b32eebe.tar.bz2
upstream-18c6ed3ae3fac31965eb9ec5d6f0e89a6b32eebe.zip
mac80211: merge AP VLAN / WDS related fixes
Signed-off-by: Felix Fietkau <nbd@openwrt.org> git-svn-id: svn://svn.openwrt.org/openwrt/trunk@36699 3c298f89-4303-0410-b956-a3cf2f4a3e73
-rw-r--r--package/mac80211/patches/300-pending_work.patch45
1 files changed, 42 insertions, 3 deletions
diff --git a/package/mac80211/patches/300-pending_work.patch b/package/mac80211/patches/300-pending_work.patch
index 305cb8f8ec..deaa39f986 100644
--- a/package/mac80211/patches/300-pending_work.patch
+++ b/package/mac80211/patches/300-pending_work.patch
@@ -1304,7 +1304,17 @@
u32 changed = 0;
int res;
u32 hw_reconf_flags = 0;
-@@ -609,30 +608,8 @@ int ieee80211_do_open(struct wireless_de
+@@ -474,6 +473,9 @@ int ieee80211_do_open(struct wireless_de
+ master->control_port_protocol;
+ sdata->control_port_no_encrypt =
+ master->control_port_no_encrypt;
++ sdata->vif.cab_queue = master->vif.cab_queue;
++ memcpy(sdata->vif.hw_queue, master->vif.hw_queue,
++ sizeof(sdata->vif.hw_queue));
+ break;
+ }
+ case NL80211_IFTYPE_AP:
+@@ -609,30 +611,8 @@ int ieee80211_do_open(struct wireless_de
set_bit(SDATA_STATE_RUNNING, &sdata->state);
@@ -1336,7 +1346,20 @@
/*
* set_multicast_list will be invoked by the networking core
-@@ -1092,6 +1069,74 @@ static void ieee80211_if_setup(struct ne
+@@ -653,7 +633,11 @@ int ieee80211_do_open(struct wireless_de
+
+ ieee80211_recalc_ps(local, -1);
+
+- if (dev) {
++ if (sdata->vif.type == NL80211_IFTYPE_MONITOR ||
++ sdata->vif.type == NL80211_IFTYPE_AP_VLAN) {
++ /* XXX: for AP_VLAN, actually track AP queues */
++ netif_tx_start_all_queues(dev);
++ } else if (dev) {
+ unsigned long flags;
+ int n_acs = IEEE80211_NUM_ACS;
+ int ac;
+@@ -1092,6 +1076,74 @@ static void ieee80211_if_setup(struct ne
dev->destructor = free_netdev;
}
@@ -1411,7 +1434,7 @@
static void ieee80211_iface_work(struct work_struct *work)
{
struct ieee80211_sub_if_data *sdata =
-@@ -1196,6 +1241,9 @@ static void ieee80211_iface_work(struct
+@@ -1196,6 +1248,9 @@ static void ieee80211_iface_work(struct
break;
ieee80211_mesh_rx_queued_mgmt(sdata, skb);
break;
@@ -1421,6 +1444,22 @@
default:
WARN(1, "frame for unexpected interface type");
break;
+@@ -1718,6 +1773,15 @@ void ieee80211_remove_interfaces(struct
+
+ ASSERT_RTNL();
+
++ /*
++ * Close all AP_VLAN interfaces first, as otherwise they
++ * might be closed while the AP interface they belong to
++ * is closed, causing unregister_netdevice_many() to crash.
++ */
++ list_for_each_entry(sdata, &local->interfaces, list)
++ if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN)
++ dev_close(sdata->dev);
++
+ mutex_lock(&local->iflist_mtx);
+ list_for_each_entry_safe(sdata, tmp, &local->interfaces, list) {
+ list_del(&sdata->list);
--- a/net/mac80211/main.c
+++ b/net/mac80211/main.c
@@ -674,6 +674,7 @@ int ieee80211_register_hw(struct ieee802