diff options
Diffstat (limited to 'drivers/net/wireless/wl12xx/acx.c')
| -rw-r--r-- | drivers/net/wireless/wl12xx/acx.c | 61 | 
1 files changed, 54 insertions, 7 deletions
diff --git a/drivers/net/wireless/wl12xx/acx.c b/drivers/net/wireless/wl12xx/acx.c index c6ee530e5bf..7e33f1f4f3d 100644 --- a/drivers/net/wireless/wl12xx/acx.c +++ b/drivers/net/wireless/wl12xx/acx.c @@ -25,7 +25,6 @@  #include <linux/module.h>  #include <linux/platform_device.h> -#include <linux/crc7.h>  #include <linux/spi/spi.h>  #include <linux/slab.h> @@ -91,7 +90,7 @@ int wl1271_acx_tx_power(struct wl1271 *wl, int power)  	struct acx_current_tx_power *acx;  	int ret; -	wl1271_debug(DEBUG_ACX, "acx dot11_cur_tx_pwr"); +	wl1271_debug(DEBUG_ACX, "acx dot11_cur_tx_pwr %d", power);  	if (power < 0 || power > 25)  		return -EINVAL; @@ -1068,6 +1067,7 @@ int wl1271_acx_sta_mem_cfg(struct wl1271 *wl)  	mem_conf->tx_free_req = mem->min_req_tx_blocks;  	mem_conf->rx_free_req = mem->min_req_rx_blocks;  	mem_conf->tx_min = mem->tx_min; +	mem_conf->fwlog_blocks = wl->conf.fwlog.mem_blocks;  	ret = wl1271_cmd_configure(wl, ACX_MEM_CFG, mem_conf,  				   sizeof(*mem_conf)); @@ -1577,22 +1577,69 @@ out:  	return ret;  } -int wl1271_acx_max_tx_retry(struct wl1271 *wl) +int wl1271_acx_ps_rx_streaming(struct wl1271 *wl, bool enable)  { -	struct wl1271_acx_max_tx_retry *acx = NULL; +	struct wl1271_acx_ps_rx_streaming *rx_streaming; +	u32 conf_queues, enable_queues; +	int i, ret = 0; + +	wl1271_debug(DEBUG_ACX, "acx ps rx streaming"); + +	rx_streaming = kzalloc(sizeof(*rx_streaming), GFP_KERNEL); +	if (!rx_streaming) { +		ret = -ENOMEM; +		goto out; +	} + +	conf_queues = wl->conf.rx_streaming.queues; +	if (enable) +		enable_queues = conf_queues; +	else +		enable_queues = 0; + +	for (i = 0; i < 8; i++) { +		/* +		 * Skip non-changed queues, to avoid redundant acxs. +		 * this check assumes conf.rx_streaming.queues can't +		 * be changed while rx_streaming is enabled. +		 */ +		if (!(conf_queues & BIT(i))) +			continue; + +		rx_streaming->tid = i; +		rx_streaming->enable = enable_queues & BIT(i); +		rx_streaming->period = wl->conf.rx_streaming.interval; +		rx_streaming->timeout = wl->conf.rx_streaming.interval; + +		ret = wl1271_cmd_configure(wl, ACX_PS_RX_STREAMING, +					   rx_streaming, +					   sizeof(*rx_streaming)); +		if (ret < 0) { +			wl1271_warning("acx ps rx streaming failed: %d", ret); +			goto out; +		} +	} +out: +	kfree(rx_streaming); +	return ret; +} + +int wl1271_acx_ap_max_tx_retry(struct wl1271 *wl) +{ +	struct wl1271_acx_ap_max_tx_retry *acx = NULL;  	int ret; -	wl1271_debug(DEBUG_ACX, "acx max tx retry"); +	wl1271_debug(DEBUG_ACX, "acx ap max tx retry");  	acx = kzalloc(sizeof(*acx), GFP_KERNEL);  	if (!acx)  		return -ENOMEM; -	acx->max_tx_retry = cpu_to_le16(wl->conf.tx.ap_max_tx_retries); +	acx->max_tx_retry = cpu_to_le16(wl->conf.tx.max_tx_retries);  	ret = wl1271_cmd_configure(wl, ACX_MAX_TX_FAILURE, acx, sizeof(*acx));  	if (ret < 0) { -		wl1271_warning("acx max tx retry failed: %d", ret); +		wl1271_warning("acx ap max tx retry failed: %d", ret);  		goto out;  	}  |