diff options
Diffstat (limited to 'drivers/net/wireless/ti/wl18xx/cmd.c')
| -rw-r--r-- | drivers/net/wireless/ti/wl18xx/cmd.c | 93 | 
1 files changed, 90 insertions, 3 deletions
| diff --git a/drivers/net/wireless/ti/wl18xx/cmd.c b/drivers/net/wireless/ti/wl18xx/cmd.c index 44f0b205b065..a8d176ddc73c 100644 --- a/drivers/net/wireless/ti/wl18xx/cmd.c +++ b/drivers/net/wireless/ti/wl18xx/cmd.c @@ -33,7 +33,8 @@ int wl18xx_cmd_channel_switch(struct wl1271 *wl,  	u32 supported_rates;  	int ret; -	wl1271_debug(DEBUG_ACX, "cmd channel switch"); +	wl1271_debug(DEBUG_ACX, "cmd channel switch (count=%d)", +		     ch_switch->count);  	cmd = kzalloc(sizeof(*cmd), GFP_KERNEL);  	if (!cmd) { @@ -60,8 +61,12 @@ int wl18xx_cmd_channel_switch(struct wl1271 *wl,  		goto out_free;  	} -	supported_rates = CONF_TX_ENABLED_RATES | CONF_TX_MCS_RATES | -			  wlcore_hw_sta_get_ap_rate_mask(wl, wlvif); +	supported_rates = CONF_TX_ENABLED_RATES | CONF_TX_MCS_RATES; +	if (wlvif->bss_type == BSS_TYPE_STA_BSS) +		supported_rates |= wlcore_hw_sta_get_ap_rate_mask(wl, wlvif); +	else +		supported_rates |= +			wlcore_hw_ap_get_mimo_wide_rate_mask(wl, wlvif);  	if (wlvif->p2p)  		supported_rates &= ~CONF_TX_CCK_RATES;  	cmd->local_supported_rates = cpu_to_le32(supported_rates); @@ -167,3 +172,85 @@ out_free:  out:  	return ret;  } + +int wl18xx_cmd_set_cac(struct wl1271 *wl, struct wl12xx_vif *wlvif, bool start) +{ +	struct wlcore_cmd_cac_start *cmd; +	int ret = 0; + +	wl1271_debug(DEBUG_CMD, "cmd cac (channel %d) %s", +		     wlvif->channel, start ? "start" : "stop"); + +	cmd = kzalloc(sizeof(*cmd), GFP_KERNEL); +	if (!cmd) +		return -ENOMEM; + +	cmd->role_id = wlvif->role_id; +	cmd->channel = wlvif->channel; +	if (wlvif->band == IEEE80211_BAND_5GHZ) +		cmd->band = WLCORE_BAND_5GHZ; +	cmd->bandwidth = wlcore_get_native_channel_type(wlvif->channel_type); + +	ret = wl1271_cmd_send(wl, +			      start ? CMD_CAC_START : CMD_CAC_STOP, +			      cmd, sizeof(*cmd), 0); +	if (ret < 0) { +		wl1271_error("failed to send cac command"); +		goto out_free; +	} + +out_free: +	kfree(cmd); +	return ret; +} + +int wl18xx_cmd_radar_detection_debug(struct wl1271 *wl, u8 channel) +{ +	struct wl18xx_cmd_dfs_radar_debug *cmd; +	int ret = 0; + +	wl1271_debug(DEBUG_CMD, "cmd radar detection debug (chan %d)", +		     channel); + +	cmd = kzalloc(sizeof(*cmd), GFP_KERNEL); +	if (!cmd) +		return -ENOMEM; + +	cmd->channel = channel; + +	ret = wl1271_cmd_send(wl, CMD_DFS_RADAR_DETECTION_DEBUG, +			      cmd, sizeof(*cmd), 0); +	if (ret < 0) { +		wl1271_error("failed to send radar detection debug command"); +		goto out_free; +	} + +out_free: +	kfree(cmd); +	return ret; +} + +int wl18xx_cmd_dfs_master_restart(struct wl1271 *wl, struct wl12xx_vif *wlvif) +{ +	struct wl18xx_cmd_dfs_master_restart *cmd; +	int ret = 0; + +	wl1271_debug(DEBUG_CMD, "cmd dfs master restart (role %d)", +		     wlvif->role_id); + +	cmd = kzalloc(sizeof(*cmd), GFP_KERNEL); +	if (!cmd) +		return -ENOMEM; + +	cmd->role_id = wlvif->role_id; + +	ret = wl1271_cmd_send(wl, CMD_DFS_MASTER_RESTART, +			      cmd, sizeof(*cmd), 0); +	if (ret < 0) { +		wl1271_error("failed to send dfs master restart command"); +		goto out_free; +	} +out_free: +	kfree(cmd); +	return ret; +} |