]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
wlcore/wl12xx/wl18xx: configure iface_combinations per-hw
authorEliad Peller <eliad@wizery.com>
Mon, 10 Feb 2014 11:47:24 +0000 (13:47 +0200)
committerJohn W. Linville <linville@tuxdriver.com>
Thu, 13 Feb 2014 20:20:15 +0000 (15:20 -0500)
Each hw supports a different iface combinations.
Define the supported combinations in each driver,
and save it in wl->iface_combinations.

Since each driver defines its own combinations now,
it can also define its max supported channels, so
we no longer need to save and set it explicitly
in wlcore.

Update wl18xx interface combinations to allow
multiple APs.

Signed-off-by: Eliad Peller <eliad@wizery.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/ti/wl12xx/main.c
drivers/net/wireless/ti/wl18xx/main.c
drivers/net/wireless/ti/wlcore/main.c
drivers/net/wireless/ti/wlcore/wlcore.h

index f486f0f8becbe79a4204646b0cdb8eb83fe92e36..33071a770630cea2d133fa4387965e01be9e6521 100644 (file)
@@ -1743,6 +1743,29 @@ static struct ieee80211_sta_ht_cap wl12xx_ht_cap = {
                },
 };
 
+static const struct ieee80211_iface_limit wl12xx_iface_limits[] = {
+       {
+               .max = 3,
+               .types = BIT(NL80211_IFTYPE_STATION),
+       },
+       {
+               .max = 1,
+               .types = BIT(NL80211_IFTYPE_AP) |
+                        BIT(NL80211_IFTYPE_P2P_GO) |
+                        BIT(NL80211_IFTYPE_P2P_CLIENT),
+       },
+};
+
+static const struct ieee80211_iface_combination
+wl12xx_iface_combinations[] = {
+       {
+               .max_interfaces = 3,
+               .limits = wl12xx_iface_limits,
+               .n_limits = ARRAY_SIZE(wl12xx_iface_limits),
+               .num_different_channels = 1,
+       },
+};
+
 static int wl12xx_setup(struct wl1271 *wl)
 {
        struct wl12xx_priv *priv = wl->priv;
@@ -1757,7 +1780,8 @@ static int wl12xx_setup(struct wl1271 *wl)
        wl->num_rx_desc = WL12XX_NUM_RX_DESCRIPTORS;
        wl->num_links = WL12XX_MAX_LINKS;
        wl->max_ap_stations = WL12XX_MAX_AP_STATIONS;
-       wl->num_channels = 1;
+       wl->iface_combinations = wl12xx_iface_combinations;
+       wl->n_iface_combinations = ARRAY_SIZE(wl12xx_iface_combinations);
        wl->num_mac_addr = WL12XX_NUM_MAC_ADDRESSES;
        wl->band_rate_to_idx = wl12xx_band_rate_to_idx;
        wl->hw_tx_rate_tbl_size = WL12XX_CONF_HW_RXTX_RATE_MAX;
index f19e9b5af58954ee56ec0b65c77d07bf98ddf9fa..966a866d76f0c4029e007951a146a98ac3e3d065 100644 (file)
@@ -1747,6 +1747,42 @@ static struct ieee80211_sta_ht_cap wl18xx_mimo_ht_cap_2ghz = {
                },
 };
 
+static const struct ieee80211_iface_limit wl18xx_iface_limits[] = {
+       {
+               .max = 3,
+               .types = BIT(NL80211_IFTYPE_STATION),
+       },
+       {
+               .max = 1,
+               .types = BIT(NL80211_IFTYPE_AP) |
+                        BIT(NL80211_IFTYPE_P2P_GO) |
+                        BIT(NL80211_IFTYPE_P2P_CLIENT),
+       },
+};
+
+static const struct ieee80211_iface_limit wl18xx_iface_ap_limits[] = {
+       {
+               .max = 2,
+               .types = BIT(NL80211_IFTYPE_AP),
+       },
+};
+
+static const struct ieee80211_iface_combination
+wl18xx_iface_combinations[] = {
+       {
+               .max_interfaces = 3,
+               .limits = wl18xx_iface_limits,
+               .n_limits = ARRAY_SIZE(wl18xx_iface_limits),
+               .num_different_channels = 2,
+       },
+       {
+               .max_interfaces = 2,
+               .limits = wl18xx_iface_ap_limits,
+               .n_limits = ARRAY_SIZE(wl18xx_iface_ap_limits),
+               .num_different_channels = 1,
+       }
+};
+
 static int wl18xx_setup(struct wl1271 *wl)
 {
        struct wl18xx_priv *priv = wl->priv;
@@ -1760,7 +1796,8 @@ static int wl18xx_setup(struct wl1271 *wl)
        wl->num_rx_desc = WL18XX_NUM_RX_DESCRIPTORS;
        wl->num_links = WL18XX_MAX_LINKS;
        wl->max_ap_stations = WL18XX_MAX_AP_STATIONS;
-       wl->num_channels = 2;
+       wl->iface_combinations = wl18xx_iface_combinations;
+       wl->n_iface_combinations = ARRAY_SIZE(wl18xx_iface_combinations);
        wl->num_mac_addr = WL18XX_NUM_MAC_ADDRESSES;
        wl->band_rate_to_idx = wl18xx_band_rate_to_idx;
        wl->hw_tx_rate_tbl_size = WL18XX_CONF_HW_RXTX_RATE_MAX;
index b649726828f935a6d1faa829771e75f703525da0..d16fb7e0eb98cd23d98dc03ceb65e049f249c9c5 100644 (file)
@@ -5690,28 +5690,6 @@ static void wl1271_unregister_hw(struct wl1271 *wl)
 
 }
 
-static const struct ieee80211_iface_limit wlcore_iface_limits[] = {
-       {
-               .max = 3,
-               .types = BIT(NL80211_IFTYPE_STATION),
-       },
-       {
-               .max = 1,
-               .types = BIT(NL80211_IFTYPE_AP) |
-                        BIT(NL80211_IFTYPE_P2P_GO) |
-                        BIT(NL80211_IFTYPE_P2P_CLIENT),
-       },
-};
-
-static struct ieee80211_iface_combination
-wlcore_iface_combinations[] = {
-       {
-         .max_interfaces = 3,
-         .limits = wlcore_iface_limits,
-         .n_limits = ARRAY_SIZE(wlcore_iface_limits),
-       },
-};
-
 static int wl1271_init_ieee80211(struct wl1271 *wl)
 {
        int i;
@@ -5832,10 +5810,8 @@ static int wl1271_init_ieee80211(struct wl1271 *wl)
                NL80211_PROBE_RESP_OFFLOAD_SUPPORT_P2P;
 
        /* allowed interface combinations */
-       wlcore_iface_combinations[0].num_different_channels = wl->num_channels;
-       wl->hw->wiphy->iface_combinations = wlcore_iface_combinations;
-       wl->hw->wiphy->n_iface_combinations =
-               ARRAY_SIZE(wlcore_iface_combinations);
+       wl->hw->wiphy->iface_combinations = wl->iface_combinations;
+       wl->hw->wiphy->n_iface_combinations = wl->n_iface_combinations;
 
        SET_IEEE80211_DEV(wl->hw, wl->dev);
 
index 2356bddc7cdb7bbc84ee80c9e5970aa248094c01..a1cc1c639fd6082cfa2f0bcfd1e12a021b5ddb23 100644 (file)
@@ -483,8 +483,9 @@ struct wl1271 {
 
        struct completion nvs_loading_complete;
 
-       /* number of concurrent channels the HW supports */
-       u32 num_channels;
+       /* interface combinations supported by the hw */
+       const struct ieee80211_iface_combination *iface_combinations;
+       u8 n_iface_combinations;
 };
 
 int wlcore_probe(struct wl1271 *wl, struct platform_device *pdev);