am d7edab78: bcm4329: bcmdhd: Add signal_poll command support

* commit 'd7edab78ddecd5492c22006c1b1e23c6c6b2a479':
  bcm4329: bcmdhd: Add signal_poll command support
diff --git a/bcm4329/wpa_supplicant_8_lib/driver_cmd_wext.c b/bcm4329/wpa_supplicant_8_lib/driver_cmd_wext.c
index 9a691a3..8aa45d6 100644
--- a/bcm4329/wpa_supplicant_8_lib/driver_cmd_wext.c
+++ b/bcm4329/wpa_supplicant_8_lib/driver_cmd_wext.c
@@ -115,7 +115,10 @@
 	iwr.u.data.length = bp;
 
 	if ((ret = ioctl(drv->ioctl_sock, SIOCSIWPRIV, &iwr)) < 0) {
-		wpa_printf(MSG_ERROR, "ioctl[SIOCSIWPRIV] (cscan): %d", ret);
+		if (!drv->bgscan_enabled)
+			wpa_printf(MSG_ERROR, "ioctl[SIOCSIWPRIV] (cscan): %d", ret);
+		else
+			ret = 0;	/* Hide error in case of bg scan */
 	}
 	return ret;
 }
@@ -217,7 +220,7 @@
 
 	bp = WEXT_PNOSETUP_HEADER_SIZE;
 	os_memcpy(buf, WEXT_PNOSETUP_HEADER, bp);
-	buf[bp++] = 'S';
+	buf[bp++] = WEXT_PNO_TLV_PREFIX;
 	buf[bp++] = WEXT_PNO_TLV_VERSION;
 	buf[bp++] = WEXT_PNO_TLV_SUBVERSION;
 	buf[bp++] = WEXT_PNO_TLV_RESERVED;
@@ -285,7 +288,7 @@
 	}
 
 	if (os_strcasecmp(cmd, "RSSI-APPROX") == 0) {
-		os_strncpy(cmd, "RSSI", MAX_DRV_CMD_SIZE);
+		os_strncpy(cmd, RSSI_CMD, MAX_DRV_CMD_SIZE);
 	} else if( os_strncasecmp(cmd, "SCAN-CHANNELS", 13) == 0 ) {
 		int no_of_chan;
 
@@ -338,8 +341,8 @@
 	} else {
 		drv->errors = 0;
 		ret = 0;
-		if ((os_strcasecmp(cmd, "RSSI") == 0) ||
-		    (os_strcasecmp(cmd, "LINKSPEED") == 0) ||
+		if ((os_strcasecmp(cmd, RSSI_CMD) == 0) ||
+		    (os_strcasecmp(cmd, LINKSPEED_CMD) == 0) ||
 		    (os_strcasecmp(cmd, "MACADDR") == 0) ||
 		    (os_strcasecmp(cmd, "GETPOWER") == 0) ||
 		    (os_strcasecmp(cmd, "GETBAND") == 0)) {
@@ -360,3 +363,29 @@
 	}
 	return ret;
 }
+
+int wpa_driver_signal_poll(void *priv, struct wpa_signal_info *si)
+{
+	char buf[MAX_DRV_CMD_SIZE];
+	struct wpa_driver_wext_data *drv = priv;
+	char *prssi;
+	int res;
+
+	os_memset(si, 0, sizeof(*si));
+	res = wpa_driver_wext_driver_cmd(priv, RSSI_CMD, buf, sizeof(buf));
+	/* Answer: SSID rssi -Val */
+	if (res < 0)
+		return res;
+	prssi = strcasestr(buf, RSSI_CMD);
+	if (!prssi)
+		return -1;
+	si->current_signal = atoi(prssi + strlen(RSSI_CMD) + 1);
+
+	res = wpa_driver_wext_driver_cmd(priv, LINKSPEED_CMD, buf, sizeof(buf));
+	/* Answer: LinkSpeed Val */
+	if (res < 0)
+		return res;
+	si->current_txrate = atoi(buf + strlen(LINKSPEED_CMD) + 1) * 1000;
+
+	return 0;
+}
diff --git a/bcm4329/wpa_supplicant_8_lib/driver_cmd_wext.h b/bcm4329/wpa_supplicant_8_lib/driver_cmd_wext.h
index a952d7e..d121b2c 100644
--- a/bcm4329/wpa_supplicant_8_lib/driver_cmd_wext.h
+++ b/bcm4329/wpa_supplicant_8_lib/driver_cmd_wext.h
@@ -16,6 +16,9 @@
 #define WEXT_NUMBER_SCAN_CHANNELS_ETSI	13
 #define WEXT_NUMBER_SCAN_CHANNELS_MKK1	14
 
+#define RSSI_CMD			"RSSI"
+#define LINKSPEED_CMD			"LINKSPEED"
+
 #define WPA_DRIVER_WEXT_WAIT_US		400000
 #define MAX_DRV_CMD_SIZE		248
 #define WEXT_NUMBER_SEQUENTIAL_ERRORS	4
@@ -39,6 +42,7 @@
 
 #define WEXT_PNOSETUP_HEADER            "PNOSETUP "
 #define WEXT_PNOSETUP_HEADER_SIZE       9
+#define WEXT_PNO_TLV_PREFIX             'S'
 #define WEXT_PNO_TLV_VERSION            '1'
 #define WEXT_PNO_TLV_SUBVERSION         '2'
 #define WEXT_PNO_TLV_RESERVED           '0'
diff --git a/bcmdhd/wpa_supplicant_8_lib/driver_cmd_wext.c b/bcmdhd/wpa_supplicant_8_lib/driver_cmd_wext.c
index aa2fb4a..70a8157 100644
--- a/bcmdhd/wpa_supplicant_8_lib/driver_cmd_wext.c
+++ b/bcmdhd/wpa_supplicant_8_lib/driver_cmd_wext.c
@@ -289,7 +289,7 @@
 	}
 
 	if (os_strcasecmp(cmd, "RSSI-APPROX") == 0) {
-		os_strncpy(cmd, "RSSI", MAX_DRV_CMD_SIZE);
+		os_strncpy(cmd, RSSI_CMD, MAX_DRV_CMD_SIZE);
 	} else if( os_strncasecmp(cmd, "SCAN-CHANNELS", 13) == 0 ) {
 		int no_of_chan;
 
@@ -342,8 +342,8 @@
 	} else {
 		drv->errors = 0;
 		ret = 0;
-		if ((os_strcasecmp(cmd, "RSSI") == 0) ||
-		    (os_strcasecmp(cmd, "LINKSPEED") == 0) ||
+		if ((os_strcasecmp(cmd, RSSI_CMD) == 0) ||
+		    (os_strcasecmp(cmd, LINKSPEED_CMD) == 0) ||
 		    (os_strcasecmp(cmd, "MACADDR") == 0) ||
 		    (os_strcasecmp(cmd, "GETPOWER") == 0) ||
 		    (os_strcasecmp(cmd, "GETBAND") == 0)) {
@@ -364,3 +364,29 @@
 	}
 	return ret;
 }
+
+int wpa_driver_signal_poll(void *priv, struct wpa_signal_info *si)
+{
+	char buf[MAX_DRV_CMD_SIZE];
+	struct wpa_driver_wext_data *drv = priv;
+	char *prssi;
+	int res;
+
+	os_memset(si, 0, sizeof(*si));
+	res = wpa_driver_wext_driver_cmd(priv, RSSI_CMD, buf, sizeof(buf));
+	/* Answer: SSID rssi -Val */
+	if (res < 0)
+		return res;
+	prssi = strcasestr(buf, RSSI_CMD);
+	if (!prssi)
+		return -1;
+	si->current_signal = atoi(prssi + strlen(RSSI_CMD) + 1);
+
+	res = wpa_driver_wext_driver_cmd(priv, LINKSPEED_CMD, buf, sizeof(buf));
+	/* Answer: LinkSpeed Val */
+	if (res < 0)
+		return res;
+	si->current_txrate = atoi(buf + strlen(LINKSPEED_CMD) + 1) * 1000;
+
+	return 0;
+}