CAPABILITY_VCO_RECALIBRATION,
 };
 
+/*
+ * Interface combinations
+ */
+enum {
+       IF_COMB_AP = 0,
+       NUM_IF_COMB,
+};
+
 /*
  * rt2x00 device structure.
  */
        unsigned int intf_associated;
        unsigned int intf_beaconing;
 
+       /*
+        * Interface combinations
+        */
+       struct ieee80211_iface_limit if_limits_ap;
+       struct ieee80211_iface_combination if_combinations[NUM_IF_COMB];
+
        /*
         * Link quality
         */
 
        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.
  */
 {
        int retval = -ENOMEM;
 
+       /*
+        * Set possible interface combinations.
+        */
+       rt2x00lib_set_if_combinations(rt2x00dev);
+
        /*
         * Allocate the driver data memory, if necessary.
         */
 
            !test_bit(DEVICE_STATE_STARTED, &rt2x00dev->flags))
                return -ENODEV;
 
-       switch (vif->type) {
-       case NL80211_IFTYPE_AP:
-               /*
-                * We don't support mixed combinations of
-                * sta and ap interfaces.
-                */
-               if (rt2x00dev->intf_sta_count)
-                       return -ENOBUFS;
-
-               /*
-                * Check if we exceeded the maximum amount
-                * of supported interfaces.
-                */
-               if (rt2x00dev->intf_ap_count >= rt2x00dev->ops->max_ap_intf)
-                       return -ENOBUFS;
-
-               break;
-       case NL80211_IFTYPE_STATION:
-       case NL80211_IFTYPE_ADHOC:
-       case NL80211_IFTYPE_MESH_POINT:
-       case NL80211_IFTYPE_WDS:
-               /*
-                * We don't support mixed combinations of
-                * sta and ap interfaces.
-                */
-               if (rt2x00dev->intf_ap_count)
-                       return -ENOBUFS;
-
-               /*
-                * We don't support multiple STA interfaces.
-                */
-               if (rt2x00dev->intf_sta_count)
-                       return -ENOBUFS;
-
-               break;
-       default:
-               return -EINVAL;
-       }
-
        /*
         * Loop through all beacon queues to find a free
         * entry. Since there are as much beacon entries