mwifiex: do not declare wdev as pointer
[cascardo/linux.git] / drivers / net / wireless / mwifiex / util.c
index b1768fb..3085506 100644 (file)
 #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);
+}