mwifiex: mwifiex_cfg80211_dump_station implementation

Exports MAC addresses of connected STAs, but nothing more yet.

backports-0230-mwiflex-dump-station.patch

Change-Id: I0897f38f5edf35504dc2ad2456db86fe002b2063
diff --git a/drivers/net/wireless/mwifiex/cfg80211.c b/drivers/net/wireless/mwifiex/cfg80211.c
index bf9020f..a7c1290 100644
--- a/drivers/net/wireless/mwifiex/cfg80211.c
+++ b/drivers/net/wireless/mwifiex/cfg80211.c
@@ -1278,13 +1278,20 @@
 			      int idx, u8 *mac, struct station_info *sinfo)
 {
 	struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev);
+	struct mwifiex_sta_node *node;
+	unsigned long flags;
+	int ret = -ENOENT;
 
-	if (!priv->media_connected || idx)
-		return -ENOENT;
+	spin_lock_irqsave(&priv->sta_list_spinlock, flags);
+	node = mwifiex_get_sta_entry_by_idx(priv, idx);
+	spin_unlock_irqrestore(&priv->sta_list_spinlock, flags);
+	if (node) {
+		memcpy(mac, node->mac_addr, ETH_ALEN);
+		sinfo->filled = 0;
+		ret = 0;
+	}
 
-	memcpy(mac, priv->cfg_bssid, ETH_ALEN);
-
-	return mwifiex_dump_station_info(priv, sinfo);
+	return ret;
 }
 
 static int
diff --git a/drivers/net/wireless/mwifiex/main.h b/drivers/net/wireless/mwifiex/main.h
index fe12560..c63e29c 100644
--- a/drivers/net/wireless/mwifiex/main.h
+++ b/drivers/net/wireless/mwifiex/main.h
@@ -1378,6 +1378,8 @@
 mwifiex_add_sta_entry(struct mwifiex_private *priv, const u8 *mac);
 struct mwifiex_sta_node *
 mwifiex_get_sta_entry(struct mwifiex_private *priv, const u8 *mac);
+struct mwifiex_sta_node *
+mwifiex_get_sta_entry_by_idx(struct mwifiex_private *priv, int idx);
 int mwifiex_send_tdls_data_frame(struct mwifiex_private *priv, const u8 *peer,
 				 u8 action_code, u8 dialog_token,
 				 u16 status_code, const u8 *extra_ies,
diff --git a/drivers/net/wireless/mwifiex/util.c b/drivers/net/wireless/mwifiex/util.c
index 9482d95..7405d96 100644
--- a/drivers/net/wireless/mwifiex/util.c
+++ b/drivers/net/wireless/mwifiex/util.c
@@ -498,6 +498,28 @@
 	return NULL;
 }
 
+/* This function will return the pointer to station entry in station list
+ * table by index.
+ * This function should be called after acquiring RA list spinlock.
+ * NULL is returned if station entry is not found in associated STA list.
+ */
+struct mwifiex_sta_node *
+mwifiex_get_sta_entry_by_idx(struct mwifiex_private *priv, int idx)
+{
+	struct mwifiex_sta_node *node;
+	int i = 0;
+
+	list_for_each_entry(node, &priv->sta_list, list) {
+		if (i < idx) {
+			++i;
+			continue;
+		}
+		return node;
+	}
+
+	return NULL;
+}
+
 /* This function will add a sta_node entry to associated station list
  * table with the given mac address.
  * If entry exist already, existing entry is returned.