summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGanesh Babu Kumaravel <kganesh@qti.qualcomm.com>2013-12-31 03:01:03 +0530
committerPrakash Dhavali <pdhavali@codeaurora.org>2014-01-17 21:45:10 -0800
commit84ba097e6397cc3e6ea3f5c85c2a7dfb2a5b2c7f (patch)
tree3f90833d12b3d51ddbcb25d71c5695f9f840fa35
parentcb8f1892aa678a188d5c324798b835cf5dc047dd (diff)
cld: iwpriv commands added to configure qpower parameters
Following iwpriv commands are added to configure qpower parameters Set max Ps Poll count: iwpriv wlan0 set_qpspollcnt value Set tx before wake: iwpriv wlan0 set_qtxwake value Set wake interval: iwpriv wlan0 set_qwakeintv value Set no data ps poll: iwpriv wlan0 set_qnodatapoll value Get max Ps Poll count: iwpriv wlan0 get_qpspollcnt value Get tx before wake: iwpriv wlan0 get_qtxwake value Get wake interval: iwpriv wlan0 get_qwakeintv value Get no data ps poll: iwpriv wlan0 get_qnodatapoll value . Change-Id: I6df1798b756bbb1e96d45456e2508a1e9282e9e0 CRs-Fixed: 593900
-rw-r--r--CORE/HDD/src/wlan_hdd_wext.c131
-rw-r--r--CORE/SERVICES/COMMON/wma_api.h1
-rw-r--r--CORE/SERVICES/WMA/wma.c165
-rw-r--r--CORE/SERVICES/WMA/wma.h8
4 files changed, 272 insertions, 33 deletions
diff --git a/CORE/HDD/src/wlan_hdd_wext.c b/CORE/HDD/src/wlan_hdd_wext.c
index 87bd248e5ebd..506f7210ee7f 100644
--- a/CORE/HDD/src/wlan_hdd_wext.c
+++ b/CORE/HDD/src/wlan_hdd_wext.c
@@ -203,8 +203,12 @@ static const hdd_freq_chan_map_t freq_chan_map[] = { {2412, 1}, {2417, 2},
#define WE_PPS_GID_NSTS_ZERO 52
#define WE_PPS_RSSI_CHECK 53
#define WE_ENABLE_STRICT_FCC_REG 54
-
#define WE_SET_HTSMPS 55
+/* Private ioctl for QPower */
+#define WE_SET_QPOWER_MAX_PSPOLL_COUNT 56
+#define WE_SET_QPOWER_MAX_TX_BEFORE_WAKE 57
+#define WE_SET_QPOWER_SPEC_PSPOLL_WAKE_INTERVAL 58
+#define WE_SET_QPOWER_SPEC_MAX_SPEC_NODATA_PSPOLL 59
/* Private ioctls and their sub-ioctls */
#define WLAN_PRIV_SET_NONE_GET_INT (SIOCIWFIRSTPRIV + 1)
@@ -248,6 +252,11 @@ static const hdd_freq_chan_map_t freq_chan_map[] = { {2412, 1}, {2417, 2},
#define WE_GET_PPS_DELIM_CRC_FAIL 38
#define WE_GET_PPS_GID_NSTS_ZERO 39
#define WE_GET_PPS_RSSI_CHECK 40
+/* Private ioctl for QPower */
+#define WE_GET_QPOWER_MAX_PSPOLL_COUNT 41
+#define WE_GET_QPOWER_MAX_TX_BEFORE_WAKE 42
+#define WE_GET_QPOWER_SPEC_PSPOLL_WAKE_INTERVAL 43
+#define WE_GET_QPOWER_SPEC_MAX_SPEC_NODATA_PSPOLL 44
#endif
/* Private ioctls and their sub-ioctls */
@@ -5073,6 +5082,46 @@ static int iw_setint_getnone(struct net_device *dev, struct iw_request_info *inf
}
+ case WE_SET_QPOWER_MAX_PSPOLL_COUNT:
+ {
+ hddLog(LOG1, "WE_SET_QPOWER_MAX_PSPOLL_COUNT val %d",
+ set_value);
+ ret = process_wma_set_command((int)pAdapter->sessionId,
+ (int)WMI_STA_PS_PARAM_QPOWER_PSPOLL_COUNT,
+ set_value, QPOWER_CMD);
+ break;
+ }
+
+ case WE_SET_QPOWER_MAX_TX_BEFORE_WAKE:
+ {
+ hddLog(LOG1, "WE_SET_QPOWER_MAX_TX_BEFORE_WAKE val %d",
+ set_value);
+ ret = process_wma_set_command((int)pAdapter->sessionId,
+ (int)WMI_STA_PS_PARAM_QPOWER_MAX_TX_BEFORE_WAKE,
+ set_value, QPOWER_CMD);
+ break;
+ }
+
+ case WE_SET_QPOWER_SPEC_PSPOLL_WAKE_INTERVAL:
+ {
+ hddLog(LOG1, "WE_SET_QPOWER_SPEC_PSPOLL_WAKE_INTERVAL val %d",
+ set_value);
+ ret = process_wma_set_command((int)pAdapter->sessionId,
+ (int)WMI_STA_PS_PARAM_QPOWER_SPEC_PSPOLL_WAKE_INTERVAL,
+ set_value, QPOWER_CMD);
+ break;
+ }
+
+ case WE_SET_QPOWER_SPEC_MAX_SPEC_NODATA_PSPOLL:
+ {
+ hddLog(LOG1, "WE_SET_QPOWER_SPEC_MAX_SPEC_NODATA_PSPOLL val %d",
+ set_value);
+ ret = process_wma_set_command((int)pAdapter->sessionId,
+ (int)WMI_STA_PS_PARAM_QPOWER_SPEC_MAX_SPEC_NODATA_PSPOLL,
+ set_value, QPOWER_CMD);
+ break;
+ }
+
#endif
default:
{
@@ -5568,6 +5617,47 @@ static int iw_setnone_getint(struct net_device *dev, struct iw_request_info *inf
PPS_CMD);
break;
}
+
+ case WE_GET_QPOWER_MAX_PSPOLL_COUNT:
+ {
+ hddLog(LOG1, "WE_GET_QPOWER_MAX_PSPOLL_COUNT");
+ *value = wma_cli_get_command(wmapvosContext,
+ (int)pAdapter->sessionId,
+ (int)WMI_STA_PS_PARAM_QPOWER_PSPOLL_COUNT,
+ QPOWER_CMD);
+ break;
+ }
+
+ case WE_GET_QPOWER_MAX_TX_BEFORE_WAKE:
+ {
+ hddLog(LOG1, "WE_GET_QPOWER_MAX_TX_BEFORE_WAKE");
+ *value = wma_cli_get_command(wmapvosContext,
+ (int)pAdapter->sessionId,
+ (int)WMI_STA_PS_PARAM_QPOWER_MAX_TX_BEFORE_WAKE,
+ QPOWER_CMD);
+ break;
+ }
+
+ case WE_GET_QPOWER_SPEC_PSPOLL_WAKE_INTERVAL:
+ {
+ hddLog(LOG1, "WE_GET_QPOWER_SPEC_PSPOLL_WAKE_INTERVAL");
+ *value = wma_cli_get_command(wmapvosContext,
+ (int)pAdapter->sessionId,
+ (int)WMI_STA_PS_PARAM_QPOWER_SPEC_PSPOLL_WAKE_INTERVAL,
+ QPOWER_CMD);
+ break;
+ }
+
+ case WE_GET_QPOWER_SPEC_MAX_SPEC_NODATA_PSPOLL:
+ {
+ hddLog(LOG1, "WE_GET_QPOWER_MAX_PSPOLL_COUNT");
+ *value = wma_cli_get_command(wmapvosContext,
+ (int)pAdapter->sessionId,
+ (int)WMI_STA_PS_PARAM_QPOWER_SPEC_MAX_SPEC_NODATA_PSPOLL,
+ QPOWER_CMD);
+ break;
+ }
+
#endif
default:
@@ -8998,6 +9088,24 @@ static const struct iw_priv_args we_private_args[] = {
{ WE_SET_HTSMPS,
IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
0, "htsmps" },
+
+
+ { WE_SET_QPOWER_MAX_PSPOLL_COUNT,
+ IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
+ 0, "set_qpspollcnt" },
+
+ { WE_SET_QPOWER_MAX_TX_BEFORE_WAKE,
+ IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
+ 0, "set_qtxwake" },
+
+ { WE_SET_QPOWER_SPEC_PSPOLL_WAKE_INTERVAL,
+ IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
+ 0, "set_qwakeintv" },
+
+ { WE_SET_QPOWER_SPEC_MAX_SPEC_NODATA_PSPOLL,
+ IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
+ 0, "set_qnodatapoll" },
+
#endif
{ WLAN_PRIV_SET_NONE_GET_INT,
@@ -9209,6 +9317,27 @@ static const struct iw_priv_args we_private_args[] = {
0,
IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
"get_rssi_chk"},
+
+ { WE_GET_QPOWER_MAX_PSPOLL_COUNT,
+ 0,
+ IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
+ "get_qpspollcnt"},
+
+ { WE_GET_QPOWER_MAX_TX_BEFORE_WAKE,
+ 0,
+ IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
+ "get_qtxwake"},
+
+ { WE_GET_QPOWER_SPEC_PSPOLL_WAKE_INTERVAL,
+ 0,
+ IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
+ "get_qwakeintv"},
+
+ { WE_GET_QPOWER_SPEC_MAX_SPEC_NODATA_PSPOLL,
+ 0,
+ IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
+ "get_qnodatapoll"},
+
#endif
/* handlers for main ioctl */
diff --git a/CORE/SERVICES/COMMON/wma_api.h b/CORE/SERVICES/COMMON/wma_api.h
index 9675af9adfe6..8c3adb199fa7 100644
--- a/CORE/SERVICES/COMMON/wma_api.h
+++ b/CORE/SERVICES/COMMON/wma_api.h
@@ -81,6 +81,7 @@ typedef enum {
#define GEN_CMD 3
#define DBG_CMD 4
#define PPS_CMD 5
+#define QPOWER_CMD 6
#ifdef QCA_WIFI_ISOC
VOS_STATUS wma_nv_download_start(v_VOID_t *vos_context);
diff --git a/CORE/SERVICES/WMA/wma.c b/CORE/SERVICES/WMA/wma.c
index 2d76dce76b22..3ad287c876b5 100644
--- a/CORE/SERVICES/WMA/wma.c
+++ b/CORE/SERVICES/WMA/wma.c
@@ -5318,6 +5318,41 @@ static int wmi_crash_inject(wmi_unified_t wmi_handle)
return ret;
}
+static int32_t wmi_unified_set_sta_ps_param(wmi_unified_t wmi_handle,
+ u_int32_t vdev_id, u_int32_t param, u_int32_t value)
+{
+ wmi_sta_powersave_param_cmd_fixed_param *cmd;
+ wmi_buf_t buf;
+ int32_t len = sizeof(*cmd);
+
+ WMA_LOGD("Set Sta Ps param vdevId %d Param %d val %d",
+ vdev_id, param, value);
+
+ buf = wmi_buf_alloc(wmi_handle, len);
+ if (!buf) {
+ WMA_LOGP("Set Sta Ps param Mem Alloc Failed");
+ return -ENOMEM;
+ }
+
+ cmd = (wmi_sta_powersave_param_cmd_fixed_param *) wmi_buf_data(buf);
+ WMITLV_SET_HDR(&cmd->tlv_header,
+ WMITLV_TAG_STRUC_wmi_sta_powersave_param_cmd_fixed_param,
+ WMITLV_GET_STRUCT_TLVLEN(
+ wmi_sta_powersave_param_cmd_fixed_param));
+ cmd->vdev_id = vdev_id;
+ cmd->param = param;
+ cmd->value = value;
+
+ if (wmi_unified_cmd_send(wmi_handle, buf, len,
+ WMI_STA_POWERSAVE_PARAM_CMDID)) {
+ WMA_LOGE("Set Sta Ps param Failed vdevId %d Param %d val %d",
+ vdev_id, param, value);
+ adf_nbuf_free(buf);
+ return -EIO;
+ }
+ return 0;
+}
+
static void wma_process_cli_set_cmd(tp_wma_handle wma,
wda_cli_set_cmd_t *privcmd)
{
@@ -5325,6 +5360,7 @@ static void wma_process_cli_set_cmd(tp_wma_handle wma,
struct wma_txrx_node *intr = wma->interfaces;
tpAniSirGlobal pMac = (tpAniSirGlobal )vos_get_context(VOS_MODULE_ID_PE,
wma->vos_context);
+ struct qpower_params *qparams = &intr[vid].config.qpower_params;
WMA_LOGD("wmihandle %p", wma->wmi_handle);
@@ -5521,6 +5557,82 @@ static void wma_process_cli_set_cmd(tp_wma_handle wma,
break;
}
break;
+
+ case QPOWER_CMD:
+ WMA_LOGD("QPOWER CLI CMD pid %d pval %d", privcmd->param_id,
+ privcmd->param_value);
+ switch (privcmd->param_id) {
+ case WMI_STA_PS_PARAM_QPOWER_PSPOLL_COUNT:
+ WMA_LOGD("QPOWER CLI CMD:Ps Poll Cnt val %d",
+ privcmd->param_value);
+ /* Set the QPower Ps Poll Count */
+ ret = wmi_unified_set_sta_ps_param(wma->wmi_handle,
+ vid,
+ WMI_STA_PS_PARAM_QPOWER_PSPOLL_COUNT,
+ privcmd->param_value);
+ if (ret) {
+ WMA_LOGE("Set Q-PsPollCnt Failed vdevId %d val %d",
+ vid, privcmd->param_value);
+ } else {
+ qparams->max_ps_poll_cnt =
+ privcmd->param_value;
+ }
+ break;
+ case WMI_STA_PS_PARAM_QPOWER_MAX_TX_BEFORE_WAKE:
+ WMA_LOGD("QPOWER CLI CMD:Max Tx Before wake val %d",
+ privcmd->param_value);
+ /* Set the QPower Max Tx Before Wake */
+ ret = wmi_unified_set_sta_ps_param(wma->wmi_handle,
+ vid,
+ WMI_STA_PS_PARAM_QPOWER_MAX_TX_BEFORE_WAKE,
+ privcmd->param_value);
+ if (ret) {
+ WMA_LOGE("Set Q-MaxTxBefWake Failed vId %d val %d",
+ vid, privcmd->param_value);
+ } else {
+ qparams->max_tx_before_wake =
+ privcmd->param_value;
+ }
+ break;
+ case WMI_STA_PS_PARAM_QPOWER_SPEC_PSPOLL_WAKE_INTERVAL:
+ WMA_LOGD("QPOWER CLI CMD:Ps Poll Wake Inv val %d",
+ privcmd->param_value);
+ /* Set the QPower Spec Ps Poll Wake Inv */
+ ret = wmi_unified_set_sta_ps_param(wma->wmi_handle,
+ vid,
+ WMI_STA_PS_PARAM_QPOWER_SPEC_PSPOLL_WAKE_INTERVAL,
+ privcmd->param_value);
+ if (ret) {
+ WMA_LOGE("Set Q-PsPoll WakeIntv Failed vId %d val %d",
+ vid, privcmd->param_value);
+ } else {
+ qparams->spec_ps_poll_wake_interval =
+ privcmd->param_value;
+ }
+ break;
+ case WMI_STA_PS_PARAM_QPOWER_SPEC_MAX_SPEC_NODATA_PSPOLL:
+ WMA_LOGD("QPOWER CLI CMD:Spec NoData Ps Poll val %d",
+ privcmd->param_value);
+ /* Set the QPower Spec NoData PsPoll */
+ ret = wmi_unified_set_sta_ps_param(wma->wmi_handle,
+ vid,
+ WMI_STA_PS_PARAM_QPOWER_SPEC_MAX_SPEC_NODATA_PSPOLL,
+ privcmd->param_value);
+ if (ret) {
+ WMA_LOGE("Set Q-SpecNoDataPsPoll Failed vId %d val %d",
+ vid, privcmd->param_value);
+ } else {
+ qparams->max_spec_nodata_ps_poll =
+ privcmd->param_value;
+ }
+ break;
+
+ default:
+ WMA_LOGE("Invalid param id 0x%x", privcmd->param_id);
+ break;
+ }
+ break;
+
default:
WMA_LOGE("Invalid vpdev command id");
}
@@ -5763,43 +5875,32 @@ int wma_cli_get_command(void *wmapvosContext, int vdev_id,
" yet implemented 0x%x", param_id);
return -EINVAL;
}
- }
- return ret;
-}
-
-static int32_t wmi_unified_set_sta_ps_param(wmi_unified_t wmi_handle,
- u_int32_t vdev_id, u_int32_t param, u_int32_t value)
-{
- wmi_sta_powersave_param_cmd_fixed_param *cmd;
- wmi_buf_t buf;
- int32_t len = sizeof(*cmd);
+ } else if (QPOWER_CMD == vpdev) {
+ switch (param_id) {
+ case WMI_STA_PS_PARAM_QPOWER_PSPOLL_COUNT:
+ ret = intr[vdev_id].config.qpower_params.max_ps_poll_cnt;
+ break;
- WMA_LOGD("Set Sta Ps param vdevId %d Param %d val %d",
- vdev_id, param, value);
+ case WMI_STA_PS_PARAM_QPOWER_MAX_TX_BEFORE_WAKE:
+ ret = intr[vdev_id].config.qpower_params.max_tx_before_wake;
+ break;
- buf = wmi_buf_alloc(wmi_handle, len);
- if (!buf) {
- WMA_LOGP("Set Sta Ps param Mem Alloc Failed");
- return -ENOMEM;
- }
+ case WMI_STA_PS_PARAM_QPOWER_SPEC_PSPOLL_WAKE_INTERVAL:
+ ret =
+ intr[vdev_id].config.qpower_params.spec_ps_poll_wake_interval;
+ break;
- cmd = (wmi_sta_powersave_param_cmd_fixed_param *) wmi_buf_data(buf);
- WMITLV_SET_HDR(&cmd->tlv_header,
- WMITLV_TAG_STRUC_wmi_sta_powersave_param_cmd_fixed_param,
- WMITLV_GET_STRUCT_TLVLEN(
- wmi_sta_powersave_param_cmd_fixed_param));
- cmd->vdev_id = vdev_id;
- cmd->param = param;
- cmd->value = value;
+ case WMI_STA_PS_PARAM_QPOWER_SPEC_MAX_SPEC_NODATA_PSPOLL:
+ ret = intr[vdev_id].config.qpower_params.max_spec_nodata_ps_poll;
+ break;
- if (wmi_unified_cmd_send(wmi_handle, buf, len,
- WMI_STA_POWERSAVE_PARAM_CMDID)) {
- WMA_LOGE("Set Sta Ps param Failed vdevId %d Param %d val %d",
- vdev_id, param, value);
- adf_nbuf_free(buf);
- return -EIO;
+ default:
+ WMA_LOGE("Invalid generic vdev command/Not"
+ " yet implemented 0x%x", param_id);
+ return -EINVAL;
+ }
}
- return 0;
+ return ret;
}
static void
diff --git a/CORE/SERVICES/WMA/wma.h b/CORE/SERVICES/WMA/wma.h
index f871789825f8..ef38525b75aa 100644
--- a/CORE/SERVICES/WMA/wma.h
+++ b/CORE/SERVICES/WMA/wma.h
@@ -287,6 +287,13 @@ struct pps {
v_BOOL_t rssi_chk;
};
+struct qpower_params {
+ u_int32_t max_ps_poll_cnt;
+ u_int32_t max_tx_before_wake;
+ u_int32_t spec_ps_poll_wake_interval;
+ u_int32_t max_spec_nodata_ps_poll;
+};
+
typedef struct {
u_int32_t ani_enable;
u_int32_t ani_poll_len;
@@ -313,6 +320,7 @@ typedef struct {
u_int32_t ampdu;
u_int32_t amsdu;
struct pps pps_params;
+ struct qpower_params qpower_params;
} vdev_cli_config_t;
#define WMA_WOW_PTRN_MASK_VALID 0xFF