Merge "wlan: Add new IOCTL to set tx power based on proximity"
diff --git a/CORE/HDD/src/wlan_hdd_wext.c b/CORE/HDD/src/wlan_hdd_wext.c
index f567fd0..862c00d 100644
--- a/CORE/HDD/src/wlan_hdd_wext.c
+++ b/CORE/HDD/src/wlan_hdd_wext.c
@@ -172,6 +172,7 @@
#endif
#define WE_SET_RTS_CTS_HTVHT 21
#define WE_SET_MONITOR_STATE 22
+#define WE_SET_PROXIMITY_ENABLE 23
/* Private ioctls and their sub-ioctls */
#define WLAN_PRIV_SET_NONE_GET_INT (SIOCIWFIRSTPRIV + 1)
@@ -366,6 +367,10 @@
#define WLAN_ADAPTER 0
#define P2P_ADAPTER 1
+#define TX_PWR_MIN 6
+#define TX_PWR_MAX 22
+#define TX_PWR_DEF 50
+
/*
* When supplicant sends SETBAND ioctl it queries for channels from
* cfg80211 layer by sending itself EVENT_CHANNEL_LIST_CHANGED command.
@@ -5947,7 +5952,74 @@
}
break;
}
+ case WE_SET_PROXIMITY_ENABLE:
+ {
+ sHwCalValues hwCalValues;
+ uint16 hwCalTxPower;
+ uint8 txPwr = TX_PWR_DEF;
+ hddLog(LOG1, FL("WE_SET_PROXIMITY_ENABLE: %d"), set_value);
+
+ if (TRUE == set_value) {
+ if(vos_nv_read( VNV_HW_CAL_VALUES, &hwCalValues,
+ NULL, sizeof(sHwCalValues) )
+ != VOS_STATUS_SUCCESS) {
+ ret = -EINVAL;
+ break;
+ }
+ hwCalTxPower = (uint16)(hwCalValues.calData.hwParam7 >> 16);
+
+ hddLog(LOG1, FL("hwCalTxPower:%x nv_data:%x"),
+ hwCalTxPower, hwCalValues.calData.hwParam7);
+
+ txPwr = (int8)(hwCalTxPower & 0x00FF);
+ txPwr = txPwr/10;
+ if (txPwr < TX_PWR_MIN)
+ txPwr = TX_PWR_MIN;
+ if (txPwr > TX_PWR_MAX)
+ txPwr = TX_PWR_MAX;
+
+ if (sme_SetMaxTxPowerPerBand(eCSR_BAND_24, txPwr) !=
+ eHAL_STATUS_SUCCESS) {
+ hddLog(VOS_TRACE_LEVEL_ERROR,
+ FL("Setting tx power failed for 2.4GHz band %d"), txPwr);
+ ret = -EIO;
+ }
+
+ txPwr = (int8)((hwCalTxPower >> 8) & 0x00FF);
+ txPwr /= 10;
+ if (txPwr < TX_PWR_MIN)
+ txPwr = TX_PWR_MIN;
+ if (txPwr > TX_PWR_MAX)
+ txPwr = TX_PWR_MAX;
+
+ if (sme_SetMaxTxPowerPerBand(eCSR_BAND_5G, txPwr) !=
+ eHAL_STATUS_SUCCESS) {
+ hddLog(VOS_TRACE_LEVEL_ERROR,
+ FL("setting tx power failed for 5GHz band %d"), txPwr);
+ ret = -EIO;
+ }
+ }
+ else if(FALSE == set_value) {
+ if (sme_SetMaxTxPowerPerBand(eCSR_BAND_24, txPwr) !=
+ eHAL_STATUS_SUCCESS) {
+ hddLog(VOS_TRACE_LEVEL_ERROR,
+ FL("Setting tx power failed for 2.4GHz band %d"), txPwr);
+ ret = -EIO;
+ }
+
+ if (sme_SetMaxTxPowerPerBand(eCSR_BAND_5G, txPwr) !=
+ eHAL_STATUS_SUCCESS) {
+ hddLog(VOS_TRACE_LEVEL_ERROR,
+ FL("setting tx power failed for 5GHz band %d"), txPwr);
+ ret = -EIO;
+ }
+ }
+ else {
+ ret = -EINVAL;
+ }
+ break;
+ }
default:
{
hddLog(LOGE, "Invalid IOCTL setvalue command %d value %d",
@@ -10408,6 +10480,9 @@
IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
0, "setRtsCtsHtVht" },
+ { WE_SET_PROXIMITY_ENABLE,
+ IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
+ 0, "setProximity" },
/* handlers for main ioctl */
{ WLAN_PRIV_SET_NONE_GET_INT,
0,