Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ebc7e57d authored by Arik Nemtsov's avatar Arik Nemtsov Committed by Luciano Coelho
Browse files

wlcore/wl18xx: enable MIMO/wide-chan rates in AP-mode rate config



Add a HW op to add extra enabled rates for AP-mode data-rates. Since
the rates might depend on channel properties, reconfigure AP-mode rates
when these change.

Implement the HW op for the 18xx family, where MIMO or wide-chan rates
can be added.

Signed-off-by: default avatarArik Nemtsov <arik@wizery.com>
Signed-off-by: default avatarLuciano Coelho <coelho@ti.com>
parent b3a47ee0
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -1315,6 +1315,7 @@ static struct wlcore_ops wl12xx_ops = {
	.get_mac		= wl12xx_get_mac,
	.set_tx_desc_csum	= wl12xx_set_tx_desc_csum,
	.set_rx_csum		= NULL,
	.ap_get_mimo_wide_rate_mask = NULL,
};

static struct ieee80211_sta_ht_cap wl12xx_ht_cap = {
+14 −0
Original line number Diff line number Diff line
@@ -879,6 +879,19 @@ static u32 wl18xx_sta_get_ap_rate_mask(struct wl1271 *wl,
	return hw_rate_set;
}

static u32 wl18xx_ap_get_mimo_wide_rate_mask(struct wl1271 *wl,
					     struct wl12xx_vif *wlvif)
{
	if (wlvif->channel_type == NL80211_CHAN_HT40MINUS ||
	    wlvif->channel_type == NL80211_CHAN_HT40PLUS) {
		wl1271_debug(DEBUG_ACX, "using wide channel rate mask");
		return CONF_TX_RATE_USE_WIDE_CHAN;
	} else {
		wl1271_debug(DEBUG_ACX, "using MIMO rate mask");
		return CONF_TX_MIMO_RATES;
	}
}

static void wl18xx_conf_init(struct wl1271 *wl)
{
	struct wl18xx_priv *priv = wl->priv;
@@ -906,6 +919,7 @@ static struct wlcore_ops wl18xx_ops = {
	.set_tx_desc_csum = wl18xx_set_tx_desc_csum,
	.set_rx_csum = wl18xx_set_rx_csum,
	.sta_get_ap_rate_mask = wl18xx_sta_get_ap_rate_mask,
	.ap_get_mimo_wide_rate_mask = wl18xx_ap_get_mimo_wide_rate_mask,
};

int __devinit wl18xx_probe(struct platform_device *pdev)
+10 −0
Original line number Diff line number Diff line
@@ -139,4 +139,14 @@ wlcore_hw_set_rx_csum(struct wl1271 *wl,
		wl->ops->set_rx_csum(wl, desc, skb);
}

static inline u32
wlcore_hw_ap_get_mimo_wide_rate_mask(struct wl1271 *wl,
				     struct wl12xx_vif *wlvif)
{
	if (wl->ops->ap_get_mimo_wide_rate_mask)
		return wl->ops->ap_get_mimo_wide_rate_mask(wl, wlvif);

	return 0;
}

#endif
+3 −0
Original line number Diff line number Diff line
@@ -460,6 +460,9 @@ int wl1271_init_ap_rates(struct wl1271 *wl, struct wl12xx_vif *wlvif)
	/* unconditionally enable HT rates */
	supported_rates |= CONF_TX_MCS_RATES;

	/* get extra MIMO or wide-chan rates where the HW supports it */
	supported_rates |= wlcore_hw_ap_get_mimo_wide_rate_mask(wl, wlvif);

	/* configure unicast TX rate classes */
	for (i = 0; i < wl->conf.tx.ac_conf_count; i++) {
		rc.enabled_rates = supported_rates;
+6 −1
Original line number Diff line number Diff line
@@ -2479,7 +2479,12 @@ static int wl12xx_config_vif(struct wl1271 *wl, struct wl12xx_vif *wlvif,
		wlvif->channel = channel;
		wlvif->channel_type = conf->channel_type;

		if (!is_ap) {
		if (is_ap) {
			ret = wl1271_init_ap_rates(wl, wlvif);
			if (ret < 0)
				wl1271_error("AP rate policy change failed %d",
					     ret);
		} else {
			/*
			 * FIXME: the mac80211 should really provide a fixed
			 * rate to use here. for now, just use the smallest
Loading