diff options
| author | Ganesh Babu Kumaravel <kganesh@qti.qualcomm.com> | 2013-12-31 03:01:03 +0530 |
|---|---|---|
| committer | Prakash Dhavali <pdhavali@codeaurora.org> | 2014-01-17 21:45:10 -0800 |
| commit | 84ba097e6397cc3e6ea3f5c85c2a7dfb2a5b2c7f (patch) | |
| tree | 3f90833d12b3d51ddbcb25d71c5695f9f840fa35 | |
| parent | cb8f1892aa678a188d5c324798b835cf5dc047dd (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.c | 131 | ||||
| -rw-r--r-- | CORE/SERVICES/COMMON/wma_api.h | 1 | ||||
| -rw-r--r-- | CORE/SERVICES/WMA/wma.c | 165 | ||||
| -rw-r--r-- | CORE/SERVICES/WMA/wma.h | 8 |
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 |
