[mac80211] adds missing backport needed for ralink mbssid
authorJohn Crispin <john@openwrt.org>
Mon, 25 Feb 2013 13:41:48 +0000 (13:41 +0000)
committerJohn Crispin <john@openwrt.org>
Mon, 25 Feb 2013 13:41:48 +0000 (13:41 +0000)
fixes #12952

Signed-off-by: John Crispin <blogic@openwrt.org>
SVN-Revision: 35780

package/mac80211/patches/b02-rt2x00-add-multiple-ap.patch [new file with mode: 0644]

diff --git a/package/mac80211/patches/b02-rt2x00-add-multiple-ap.patch b/package/mac80211/patches/b02-rt2x00-add-multiple-ap.patch
new file mode 100644 (file)
index 0000000..4f06e79
--- /dev/null
@@ -0,0 +1,94 @@
+--- a/drivers/net/wireless/rt2x00/rt2x00.h
++++ b/drivers/net/wireless/rt2x00/rt2x00.h
+@@ -750,6 +750,14 @@ enum rt2x00_capability_flags {
+ };
+ /*
++ * Interface combinations
++ */
++enum {
++      IF_COMB_AP = 0,
++      NUM_IF_COMB,
++};
++
++/*
+  * rt2x00 device structure.
+  */
+ struct rt2x00_dev {
+@@ -876,6 +884,12 @@ struct rt2x00_dev {
+       unsigned int intf_beaconing;
+       /*
++       * Interface combinations
++       */
++      struct ieee80211_iface_limit if_limits_ap;
++      struct ieee80211_iface_combination if_combinations[NUM_IF_COMB];
++
++      /*
+        * Link quality
+        */
+       struct link link;
+--- a/drivers/net/wireless/rt2x00/rt2x00dev.c
++++ b/drivers/net/wireless/rt2x00/rt2x00dev.c
+@@ -1146,6 +1146,34 @@ void rt2x00lib_stop(struct rt2x00_dev *r
+       rt2x00dev->intf_associated = 0;
+ }
++static inline void rt2x00lib_set_if_combinations(struct rt2x00_dev *rt2x00dev)
++{
++      struct ieee80211_iface_limit *if_limit;
++      struct ieee80211_iface_combination *if_combination;
++
++      /*
++       * Build up AP interface limits structure.
++       */
++      if_limit = &rt2x00dev->if_limits_ap;
++      if_limit->max = rt2x00dev->ops->max_ap_intf;
++      if_limit->types = BIT(NL80211_IFTYPE_AP);
++
++      /*
++       * Build up AP interface combinations structure.
++       */
++      if_combination = &rt2x00dev->if_combinations[IF_COMB_AP];
++      if_combination->limits = if_limit;
++      if_combination->n_limits = 1;
++      if_combination->max_interfaces = if_limit->max;
++      if_combination->num_different_channels = 1;
++
++      /*
++       * Finally, specify the possible combinations to mac80211.
++       */
++      rt2x00dev->hw->wiphy->iface_combinations = rt2x00dev->if_combinations;
++      rt2x00dev->hw->wiphy->n_iface_combinations = 1;
++}
++
+ /*
+  * driver allocation handlers.
+  */
+@@ -1165,6 +1193,11 @@ int rt2x00lib_probe_dev(struct rt2x00_de
+               }
+       }
++      /*
++       * Set possible interface combinations.
++       */
++      rt2x00lib_set_if_combinations(rt2x00dev);
++
+       spin_lock_init(&rt2x00dev->irqmask_lock);
+       mutex_init(&rt2x00dev->csr_mutex);
+--- a/drivers/net/wireless/rt2x00/rt2x00mac.c
++++ b/drivers/net/wireless/rt2x00/rt2x00mac.c
+@@ -243,10 +243,9 @@ int rt2x00mac_add_interface(struct ieee8
+                       return -ENOBUFS;
+               /*
+-               * Check if we exceeded the maximum amount
+-               * of supported interfaces.
++               * We don't support multiple STA interfaces.
+                */
+-              if (rt2x00dev->intf_sta_count >= rt2x00dev->ops->max_sta_intf)
++              if (rt2x00dev->intf_sta_count)
+                       return -ENOBUFS;
+               break;