diff options
Diffstat (limited to 'drivers/net/wireless/mwifiex/util.c')
| -rw-r--r-- | drivers/net/wireless/mwifiex/util.c | 222 | 
1 files changed, 221 insertions, 1 deletions
diff --git a/drivers/net/wireless/mwifiex/util.c b/drivers/net/wireless/mwifiex/util.c index b1768fbf98f2..308550611f22 100644 --- a/drivers/net/wireless/mwifiex/util.c +++ b/drivers/net/wireless/mwifiex/util.c @@ -25,6 +25,96 @@  #include "wmm.h"  #include "11n.h" +static struct mwifiex_debug_data items[] = { +	{"int_counter", item_size(int_counter), +	 item_addr(int_counter), 1}, +	{"wmm_ac_vo", item_size(packets_out[WMM_AC_VO]), +	 item_addr(packets_out[WMM_AC_VO]), 1}, +	{"wmm_ac_vi", item_size(packets_out[WMM_AC_VI]), +	 item_addr(packets_out[WMM_AC_VI]), 1}, +	{"wmm_ac_be", item_size(packets_out[WMM_AC_BE]), +	 item_addr(packets_out[WMM_AC_BE]), 1}, +	{"wmm_ac_bk", item_size(packets_out[WMM_AC_BK]), +	 item_addr(packets_out[WMM_AC_BK]), 1}, +	{"tx_buf_size", item_size(tx_buf_size), +	 item_addr(tx_buf_size), 1}, +	{"curr_tx_buf_size", item_size(curr_tx_buf_size), +	 item_addr(curr_tx_buf_size), 1}, +	{"ps_mode", item_size(ps_mode), +	 item_addr(ps_mode), 1}, +	{"ps_state", item_size(ps_state), +	 item_addr(ps_state), 1}, +	{"is_deep_sleep", item_size(is_deep_sleep), +	 item_addr(is_deep_sleep), 1}, +	{"wakeup_dev_req", item_size(pm_wakeup_card_req), +	 item_addr(pm_wakeup_card_req), 1}, +	{"wakeup_tries", item_size(pm_wakeup_fw_try), +	 item_addr(pm_wakeup_fw_try), 1}, +	{"hs_configured", item_size(is_hs_configured), +	 item_addr(is_hs_configured), 1}, +	{"hs_activated", item_size(hs_activated), +	 item_addr(hs_activated), 1}, +	{"num_tx_timeout", item_size(num_tx_timeout), +	 item_addr(num_tx_timeout), 1}, +	{"is_cmd_timedout", item_size(is_cmd_timedout), +	 item_addr(is_cmd_timedout), 1}, +	{"timeout_cmd_id", item_size(timeout_cmd_id), +	 item_addr(timeout_cmd_id), 1}, +	{"timeout_cmd_act", item_size(timeout_cmd_act), +	 item_addr(timeout_cmd_act), 1}, +	{"last_cmd_id", item_size(last_cmd_id), +	 item_addr(last_cmd_id), DBG_CMD_NUM}, +	{"last_cmd_act", item_size(last_cmd_act), +	 item_addr(last_cmd_act), DBG_CMD_NUM}, +	{"last_cmd_index", item_size(last_cmd_index), +	 item_addr(last_cmd_index), 1}, +	{"last_cmd_resp_id", item_size(last_cmd_resp_id), +	 item_addr(last_cmd_resp_id), DBG_CMD_NUM}, +	{"last_cmd_resp_index", item_size(last_cmd_resp_index), +	 item_addr(last_cmd_resp_index), 1}, +	{"last_event", item_size(last_event), +	 item_addr(last_event), DBG_CMD_NUM}, +	{"last_event_index", item_size(last_event_index), +	 item_addr(last_event_index), 1}, +	{"num_cmd_h2c_fail", item_size(num_cmd_host_to_card_failure), +	 item_addr(num_cmd_host_to_card_failure), 1}, +	{"num_cmd_sleep_cfm_fail", +	 item_size(num_cmd_sleep_cfm_host_to_card_failure), +	 item_addr(num_cmd_sleep_cfm_host_to_card_failure), 1}, +	{"num_tx_h2c_fail", item_size(num_tx_host_to_card_failure), +	 item_addr(num_tx_host_to_card_failure), 1}, +	{"num_evt_deauth", item_size(num_event_deauth), +	 item_addr(num_event_deauth), 1}, +	{"num_evt_disassoc", item_size(num_event_disassoc), +	 item_addr(num_event_disassoc), 1}, +	{"num_evt_link_lost", item_size(num_event_link_lost), +	 item_addr(num_event_link_lost), 1}, +	{"num_cmd_deauth", item_size(num_cmd_deauth), +	 item_addr(num_cmd_deauth), 1}, +	{"num_cmd_assoc_ok", item_size(num_cmd_assoc_success), +	 item_addr(num_cmd_assoc_success), 1}, +	{"num_cmd_assoc_fail", item_size(num_cmd_assoc_failure), +	 item_addr(num_cmd_assoc_failure), 1}, +	{"cmd_sent", item_size(cmd_sent), +	 item_addr(cmd_sent), 1}, +	{"data_sent", item_size(data_sent), +	 item_addr(data_sent), 1}, +	{"cmd_resp_received", item_size(cmd_resp_received), +	 item_addr(cmd_resp_received), 1}, +	{"event_received", item_size(event_received), +	 item_addr(event_received), 1}, + +	/* variables defined in struct mwifiex_adapter */ +	{"cmd_pending", adapter_item_size(cmd_pending), +	 adapter_item_addr(cmd_pending), 1}, +	{"tx_pending", adapter_item_size(tx_pending), +	 adapter_item_addr(tx_pending), 1}, +	{"rx_pending", adapter_item_size(rx_pending), +	 adapter_item_addr(rx_pending), 1}, +}; + +static int num_of_items = ARRAY_SIZE(items); +  /*   * Firmware initialization complete callback handler.   * @@ -97,6 +187,8 @@ int mwifiex_get_debug_info(struct mwifiex_private *priv,  							      info->rx_tbl);  		info->tx_tbl_num = mwifiex_get_tx_ba_stream_tbl(priv,  								info->tx_tbl); +		info->tdls_peer_num = mwifiex_get_tdls_list(priv, +							    info->tdls_list);  		info->ps_mode = adapter->ps_mode;  		info->ps_state = adapter->ps_state;  		info->is_deep_sleep = adapter->is_deep_sleep; @@ -141,6 +233,93 @@ int mwifiex_get_debug_info(struct mwifiex_private *priv,  	return 0;  } +int mwifiex_debug_info_to_buffer(struct mwifiex_private *priv, char *buf, +				 struct mwifiex_debug_info *info) +{ +	char *p = buf; +	struct mwifiex_debug_data *d = &items[0]; +	size_t size, addr; +	long val; +	int i, j; + +	if (!info) +		return 0; + +	for (i = 0; i < num_of_items; i++) { +		p += sprintf(p, "%s=", d[i].name); + +		size = d[i].size / d[i].num; + +		if (i < (num_of_items - 3)) +			addr = d[i].addr + (size_t)info; +		else /* The last 3 items are struct mwifiex_adapter variables */ +			addr = d[i].addr + (size_t)priv->adapter; + +		for (j = 0; j < d[i].num; j++) { +			switch (size) { +			case 1: +				val = *((u8 *)addr); +				break; +			case 2: +				val = *((u16 *)addr); +				break; +			case 4: +				val = *((u32 *)addr); +				break; +			case 8: +				val = *((long long *)addr); +				break; +			default: +				val = -1; +				break; +			} + +			p += sprintf(p, "%#lx ", val); +			addr += size; +		} + +		p += sprintf(p, "\n"); +	} + +	if (info->tx_tbl_num) { +		p += sprintf(p, "Tx BA stream table:\n"); +		for (i = 0; i < info->tx_tbl_num; i++) +			p += sprintf(p, "tid = %d, ra = %pM\n", +				     info->tx_tbl[i].tid, info->tx_tbl[i].ra); +	} + +	if (info->rx_tbl_num) { +		p += sprintf(p, "Rx reorder table:\n"); +		for (i = 0; i < info->rx_tbl_num; i++) { +			p += sprintf(p, "tid = %d, ta = %pM, ", +				     info->rx_tbl[i].tid, +				     info->rx_tbl[i].ta); +			p += sprintf(p, "start_win = %d, ", +				     info->rx_tbl[i].start_win); +			p += sprintf(p, "win_size = %d, buffer: ", +				     info->rx_tbl[i].win_size); + +			for (j = 0; j < info->rx_tbl[i].win_size; j++) +				p += sprintf(p, "%c ", +					     info->rx_tbl[i].buffer[j] ? +					     '1' : '0'); + +			p += sprintf(p, "\n"); +		} +	} + +	if (info->tdls_peer_num) { +		p += sprintf(p, "TDLS peer table:\n"); +		for (i = 0; i < info->tdls_peer_num; i++) { +			p += sprintf(p, "peer = %pM", +				     info->tdls_list[i].peer_addr); +			p += sprintf(p, "\n"); +		} +	} + +	return p - buf; +} +  static int  mwifiex_parse_mgmt_packet(struct mwifiex_private *priv, u8 *payload, u16 len,  			  struct rxpd *rx_pd) @@ -208,7 +387,7 @@ mwifiex_process_mgmt_packet(struct mwifiex_private *priv,  	pkt_len -= ETH_ALEN + sizeof(pkt_len);  	rx_pd->rx_pkt_length = cpu_to_le16(pkt_len); -	cfg80211_rx_mgmt(priv->wdev, priv->roc_cfg.chan.center_freq, +	cfg80211_rx_mgmt(&priv->wdev, priv->roc_cfg.chan.center_freq,  			 CAL_RSSI(rx_pd->snr, rx_pd->nf), skb->data, pkt_len,  			 0); @@ -404,3 +583,44 @@ void mwifiex_del_all_sta_list(struct mwifiex_private *priv)  	spin_unlock_irqrestore(&priv->sta_list_spinlock, flags);  	return;  } + +/* This function adds histogram data to histogram array*/ +void mwifiex_hist_data_add(struct mwifiex_private *priv, +			   u8 rx_rate, s8 snr, s8 nflr) +{ +	struct mwifiex_histogram_data *phist_data = priv->hist_data; + +	if (atomic_read(&phist_data->num_samples) > MWIFIEX_HIST_MAX_SAMPLES) +		mwifiex_hist_data_reset(priv); +	mwifiex_hist_data_set(priv, rx_rate, snr, nflr); +} + +/* function to add histogram record */ +void mwifiex_hist_data_set(struct mwifiex_private *priv, u8 rx_rate, s8 snr, +			   s8 nflr) +{ +	struct mwifiex_histogram_data *phist_data = priv->hist_data; + +	atomic_inc(&phist_data->num_samples); +	atomic_inc(&phist_data->rx_rate[rx_rate]); +	atomic_inc(&phist_data->snr[snr]); +	atomic_inc(&phist_data->noise_flr[128 + nflr]); +	atomic_inc(&phist_data->sig_str[nflr - snr]); +} + +/* function to reset histogram data during init/reset */ +void mwifiex_hist_data_reset(struct mwifiex_private *priv) +{ +	int ix; +	struct mwifiex_histogram_data *phist_data = priv->hist_data; + +	atomic_set(&phist_data->num_samples, 0); +	for (ix = 0; ix < MWIFIEX_MAX_AC_RX_RATES; ix++) +		atomic_set(&phist_data->rx_rate[ix], 0); +	for (ix = 0; ix < MWIFIEX_MAX_SNR; ix++) +		atomic_set(&phist_data->snr[ix], 0); +	for (ix = 0; ix < MWIFIEX_MAX_NOISE_FLR; ix++) +		atomic_set(&phist_data->noise_flr[ix], 0); +	for (ix = 0; ix < MWIFIEX_MAX_SIG_STRENGTH; ix++) +		atomic_set(&phist_data->sig_str[ix], 0); +}  | 

