diff options
Diffstat (limited to 'package/kernel/mac80211/patches/908-wlcore-wl12xx-wl18xx-configure-iface_combinations-per-hw.patch')
-rw-r--r-- | package/kernel/mac80211/patches/908-wlcore-wl12xx-wl18xx-configure-iface_combinations-per-hw.patch | 176 |
1 files changed, 176 insertions, 0 deletions
diff --git a/package/kernel/mac80211/patches/908-wlcore-wl12xx-wl18xx-configure-iface_combinations-per-hw.patch b/package/kernel/mac80211/patches/908-wlcore-wl12xx-wl18xx-configure-iface_combinations-per-hw.patch new file mode 100644 index 0000000000..eb00a50a0e --- /dev/null +++ b/package/kernel/mac80211/patches/908-wlcore-wl12xx-wl18xx-configure-iface_combinations-per-hw.patch @@ -0,0 +1,176 @@ +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> + +--- +drivers/net/wireless/ti/wl12xx/main.c | 26 +++++++++++++++++++++- + drivers/net/wireless/ti/wl18xx/main.c | 39 ++++++++++++++++++++++++++++++++- + drivers/net/wireless/ti/wlcore/main.c | 28 ++--------------------- + drivers/net/wireless/ti/wlcore/wlcore.h | 5 +++-- + 4 files changed, 68 insertions(+), 30 deletions(-) + +--- a/drivers/net/wireless/ti/wl12xx/main.c ++++ b/drivers/net/wireless/ti/wl12xx/main.c +@@ -1743,6 +1743,29 @@ static struct ieee80211_sta_ht_cap wl12x + }, + }; + ++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 *w + 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; +--- a/drivers/net/wireless/ti/wl18xx/main.c ++++ b/drivers/net/wireless/ti/wl18xx/main.c +@@ -1747,6 +1747,42 @@ static struct ieee80211_sta_ht_cap wl18x + }, + }; + ++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 *w + 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; +--- a/drivers/net/wireless/ti/wlcore/main.c ++++ b/drivers/net/wireless/ti/wlcore/main.c +@@ -5723,28 +5723,6 @@ static void wl1271_unregister_hw(struct + + } + +-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; +@@ -5865,10 +5843,8 @@ static int wl1271_init_ieee80211(struct + 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); + +--- a/drivers/net/wireless/ti/wlcore/wlcore.h ++++ b/drivers/net/wireless/ti/wlcore/wlcore.h +@@ -485,8 +485,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); |