diff options
Diffstat (limited to 'drivers/net/wireless/mwifiex/sta_cmd.c')
| -rw-r--r-- | drivers/net/wireless/mwifiex/sta_cmd.c | 83 | 
1 files changed, 82 insertions, 1 deletions
diff --git a/drivers/net/wireless/mwifiex/sta_cmd.c b/drivers/net/wireless/mwifiex/sta_cmd.c index c55c5bb9313..b193e25977d 100644 --- a/drivers/net/wireless/mwifiex/sta_cmd.c +++ b/drivers/net/wireless/mwifiex/sta_cmd.c @@ -24,6 +24,7 @@  #include "main.h"  #include "wmm.h"  #include "11n.h" +#include "11ac.h"  /*   * This function prepares command to set/get RSSI information. @@ -334,7 +335,7 @@ mwifiex_cmd_802_11_hs_cfg(struct mwifiex_private *priv,  	cmd->command = cpu_to_le16(HostCmd_CMD_802_11_HS_CFG_ENH);  	if (!hs_activate && -	    (hscfg_param->conditions != cpu_to_le32(HOST_SLEEP_CFG_CANCEL)) && +	    (hscfg_param->conditions != cpu_to_le32(HS_CFG_CANCEL)) &&  	    ((adapter->arp_filter_size > 0) &&  	     (adapter->arp_filter_size <= ARP_FILTER_MAX_BUF_SIZE))) {  		dev_dbg(adapter->dev, @@ -1059,6 +1060,80 @@ mwifiex_cmd_802_11_subsc_evt(struct mwifiex_private *priv,  	return 0;  } +static int +mwifiex_cmd_append_rpn_expression(struct mwifiex_private *priv, +				  struct mwifiex_mef_entry *mef_entry, +				  u8 **buffer) +{ +	struct mwifiex_mef_filter *filter = mef_entry->filter; +	int i, byte_len; +	u8 *stack_ptr = *buffer; + +	for (i = 0; i < MWIFIEX_MAX_FILTERS; i++) { +		filter = &mef_entry->filter[i]; +		if (!filter->filt_type) +			break; +		*(__le32 *)stack_ptr = cpu_to_le32((u32)filter->repeat); +		stack_ptr += 4; +		*stack_ptr = TYPE_DNUM; +		stack_ptr += 1; + +		byte_len = filter->byte_seq[MAX_BYTESEQ]; +		memcpy(stack_ptr, filter->byte_seq, byte_len); +		stack_ptr += byte_len; +		*stack_ptr = byte_len; +		stack_ptr += 1; +		*stack_ptr = TYPE_BYTESEQ; +		stack_ptr += 1; + +		*(__le32 *)stack_ptr = cpu_to_le32((u32)filter->offset); +		stack_ptr += 4; +		*stack_ptr = TYPE_DNUM; +		stack_ptr += 1; + +		*stack_ptr = filter->filt_type; +		stack_ptr += 1; + +		if (filter->filt_action) { +			*stack_ptr = filter->filt_action; +			stack_ptr += 1; +		} + +		if (stack_ptr - *buffer > STACK_NBYTES) +			return -1; +	} + +	*buffer = stack_ptr; +	return 0; +} + +static int +mwifiex_cmd_mef_cfg(struct mwifiex_private *priv, +		    struct host_cmd_ds_command *cmd, +		    struct mwifiex_ds_mef_cfg *mef) +{ +	struct host_cmd_ds_mef_cfg *mef_cfg = &cmd->params.mef_cfg; +	u8 *pos = (u8 *)mef_cfg; + +	cmd->command = cpu_to_le16(HostCmd_CMD_MEF_CFG); + +	mef_cfg->criteria = cpu_to_le32(mef->criteria); +	mef_cfg->num_entries = cpu_to_le16(mef->num_entries); +	pos += sizeof(*mef_cfg); +	mef_cfg->mef_entry->mode = mef->mef_entry->mode; +	mef_cfg->mef_entry->action = mef->mef_entry->action; +	pos += sizeof(*(mef_cfg->mef_entry)); + +	if (mwifiex_cmd_append_rpn_expression(priv, mef->mef_entry, &pos)) +		return -1; + +	mef_cfg->mef_entry->exprsize = +			cpu_to_le16(pos - mef_cfg->mef_entry->expr); +	cmd->size = cpu_to_le16((u16) (pos - (u8 *)mef_cfg) + S_DS_GEN); + +	return 0; +} +  /*   * This function prepares the commands before sending them to the firmware.   * @@ -1184,6 +1259,9 @@ int mwifiex_sta_prepare_cmd(struct mwifiex_private *priv, uint16_t cmd_no,  		      cpu_to_le16(sizeof(struct host_cmd_ds_remain_on_chan) +  				  S_DS_GEN);  		break; +	case HostCmd_CMD_11AC_CFG: +		ret = mwifiex_cmd_11ac_cfg(priv, cmd_ptr, cmd_action, data_buf); +		break;  	case HostCmd_CMD_P2P_MODE_CFG:  		cmd_ptr->command = cpu_to_le16(cmd_no);  		cmd_ptr->params.mode_cfg.action = cpu_to_le16(cmd_action); @@ -1273,6 +1351,9 @@ int mwifiex_sta_prepare_cmd(struct mwifiex_private *priv, uint16_t cmd_no,  	case HostCmd_CMD_802_11_SUBSCRIBE_EVENT:  		ret = mwifiex_cmd_802_11_subsc_evt(priv, cmd_ptr, data_buf);  		break; +	case HostCmd_CMD_MEF_CFG: +		ret = mwifiex_cmd_mef_cfg(priv, cmd_ptr, data_buf); +		break;  	default:  		dev_err(priv->adapter->dev,  			"PREP_CMD: unknown cmd- %#x\n", cmd_no);  |