diff options
| author | Mingcheng Zhu <mingchen@qca.qualcomm.com> | 2014-02-21 19:31:05 -0800 |
|---|---|---|
| committer | Akash Patel <c_akashp@qca.qualcomm.com> | 2014-02-26 18:49:04 -0800 |
| commit | ff1e0a40c132f643a28151f25bfd86408bcecbdd (patch) | |
| tree | 2603d88903bc92ed3ec609cb9fbaf169bc492415 | |
| parent | 29391c12018e5ffc15c62cc60825a45ab83c48ae (diff) | |
wlan: adding wext interface to set station's mcast rate
HDD received the p2p0 adapter when using wpa_cli to set mcast
rate in wlan0 in station mode. Internal discuss shows that getting
incorrect adapter is an known issue for KK. Due to this, a wext
interface is added as the workaround to use iwpriv to set station's
mcast rate.
Change-Id: Id879507fa217a4467c85002dbdb222a0b5f29284
CRs-Fixed: 622161
| -rw-r--r-- | CORE/HDD/inc/wlan_hdd_main.h | 1 | ||||
| -rw-r--r-- | CORE/HDD/src/wlan_hdd_main.c | 88 | ||||
| -rw-r--r-- | CORE/HDD/src/wlan_hdd_wext.c | 11 | ||||
| -rw-r--r-- | CORE/SERVICES/WMA/wma.c | 12 |
4 files changed, 69 insertions, 43 deletions
diff --git a/CORE/HDD/inc/wlan_hdd_main.h b/CORE/HDD/inc/wlan_hdd_main.h index db2f23757aae..fc38b98a9286 100644 --- a/CORE/HDD/inc/wlan_hdd_main.h +++ b/CORE/HDD/inc/wlan_hdd_main.h @@ -1385,6 +1385,7 @@ void hdd_checkandupdate_phymode( hdd_context_t *pHddCtx); #endif int hdd_wmmps_helper(hdd_adapter_t *pAdapter, tANI_U8 *ptr); +int wlan_hdd_set_mc_rate(hdd_adapter_t *pAdapter, int targetRate); int hdd_wlan_startup(struct device *dev, void *hif_sc); void __hdd_wlan_exit(void); diff --git a/CORE/HDD/src/wlan_hdd_main.c b/CORE/HDD/src/wlan_hdd_main.c index e71261dedc11..30ad93ef3e27 100644 --- a/CORE/HDD/src/wlan_hdd_main.c +++ b/CORE/HDD/src/wlan_hdd_main.c @@ -2257,6 +2257,58 @@ eHalStatus hdd_parse_plm_cmd(tANI_U8 *pValue, tSirPlmReq *pPlmRequest) } #endif +int wlan_hdd_set_mc_rate(hdd_adapter_t *pAdapter, int targetRate) +{ + tSirRateUpdateInd *rateUpdate; + eHalStatus status; + hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter); + hdd_config_t *pConfig = NULL; + + if (pHddCtx == NULL) { + VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR, + "%s: HDD context is null", __func__); + return -EINVAL; + } + if ((WLAN_HDD_IBSS != pAdapter->device_mode) && + (WLAN_HDD_SOFTAP != pAdapter->device_mode) && + (WLAN_HDD_INFRA_STATION != pAdapter->device_mode)) + { + VOS_TRACE( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR, + "%s: Received SETMCRATE command in invalid mode %d \n" + "SETMCRATE command is only allowed in STA, IBSS or SOFTAP mode", + __func__, pAdapter->device_mode); + return -EINVAL; + } + pConfig = pHddCtx->cfg_ini; + rateUpdate = (tSirRateUpdateInd *)vos_mem_malloc(sizeof(tSirRateUpdateInd)); + if (NULL == rateUpdate) + { + hddLog(VOS_TRACE_LEVEL_ERROR, + "%s: SETMCRATE indication alloc fail", __func__); + return -EFAULT; + } + vos_mem_zero(rateUpdate, sizeof(tSirRateUpdateInd )); + rateUpdate->nss = (pConfig->enable2x2 == 0) ? 0 : 1; + rateUpdate->dev_mode = pAdapter->device_mode; + rateUpdate->mcastDataRate24GHz = targetRate; + rateUpdate->mcastDataRate5GHz = targetRate; + rateUpdate->bcastDataRate = -1; + memcpy(rateUpdate->bssid, pAdapter->macAddressCurrent.bytes, + sizeof(rateUpdate->bssid)); + VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO, + "%s: MC Target rate %d, mac = %pM, dev_mode = %d", + __func__, rateUpdate->mcastDataRate24GHz, rateUpdate->bssid, + pAdapter->device_mode); + status = sme_SendRateUpdateInd(pHddCtx->hHal, rateUpdate); + if (eHAL_STATUS_SUCCESS != status) { + hddLog(VOS_TRACE_LEVEL_ERROR, + "%s: SETMCRATE failed", __func__); + vos_mem_free(rateUpdate); + return -EFAULT; + } + return 0; +} + int hdd_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) { hdd_adapter_t *pAdapter = WLAN_HDD_GET_PRIV_PTR(dev); @@ -4268,46 +4320,12 @@ int hdd_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) { tANI_U8 *value = command; int targetRate; - tSirRateUpdateInd *rateUpdate; - eHalStatus status; - hdd_config_t *pConfig = pHddCtx->cfg_ini; - hdd_station_ctx_t *pHddStaCtx = WLAN_HDD_GET_STATION_CTX_PTR(pAdapter); /* Move pointer to ahead of SETMCRATE<delimiter> */ /* input value is in units of hundred kbps */ value = value + 10; /* Convert the value from ascii to integer, decimal base */ ret = kstrtouint(value, 10, &targetRate); - - rateUpdate = (tSirRateUpdateInd *)vos_mem_malloc(sizeof(tSirRateUpdateInd)); - if (NULL == rateUpdate) - { - hddLog(VOS_TRACE_LEVEL_ERROR, - "%s: SETMCRATE indication alloc fail", __func__); - ret = -EFAULT; - goto exit; - } - vos_mem_zero(rateUpdate, sizeof(tSirRateUpdateInd )); - - VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO, - "MC Target rate %d", targetRate); - - rateUpdate->nss = (pConfig->enable2x2 == 0) ? 0 : 1; - rateUpdate->dev_mode = pAdapter->device_mode; - rateUpdate->mcastDataRate24GHz = targetRate; - rateUpdate->mcastDataRate5GHz = targetRate; - rateUpdate->bcastDataRate = -1; - memcpy(rateUpdate->bssid, pHddStaCtx->conn_info.bssId, - sizeof(rateUpdate->bssid)); - - status = sme_SendRateUpdateInd(pHddCtx->hHal, rateUpdate); - if (eHAL_STATUS_SUCCESS != status) - { - hddLog(VOS_TRACE_LEVEL_ERROR, - "%s: SET_MC_RATE failed", __func__); - vos_mem_free(rateUpdate); - ret = -EFAULT; - goto exit; - } + ret = wlan_hdd_set_mc_rate(pAdapter, targetRate); } else { hddLog( VOS_TRACE_LEVEL_WARN, "%s: Unsupported GUI command %s", diff --git a/CORE/HDD/src/wlan_hdd_wext.c b/CORE/HDD/src/wlan_hdd_wext.c index 10981ef56452..ef9a1b66efba 100644 --- a/CORE/HDD/src/wlan_hdd_wext.c +++ b/CORE/HDD/src/wlan_hdd_wext.c @@ -234,6 +234,7 @@ static const hdd_freq_chan_map_t freq_chan_map[] = { {2412, 1}, {2417, 2}, #define WE_SET_EARLY_RX_SLOP_STEP 78 #define WE_SET_EARLY_RX_INIT_SLOP 79 #define WE_SET_EARLY_RX_ADJUST_PAUSE 80 +#define WE_SET_MC_RATE 81 /* Private ioctls and their sub-ioctls */ #define WLAN_PRIV_SET_NONE_GET_INT (SIOCIWFIRSTPRIV + 1) @@ -4659,6 +4660,11 @@ static int iw_setint_getnone(struct net_device *dev, struct iw_request_info *inf } break; } + case WE_SET_MC_RATE: + { + ret = wlan_hdd_set_mc_rate(pAdapter, set_value); + break; + } case WE_SET_TX_POWER: { tSirMacAddr bssid; @@ -9673,6 +9679,11 @@ static const struct iw_priv_args we_private_args[] = { 0, "setTxPower" }, + { WE_SET_MC_RATE, + IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, + 0, + "setMcRate" }, + { WE_SET_MAX_TX_POWER_2_4, IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, diff --git a/CORE/SERVICES/WMA/wma.c b/CORE/SERVICES/WMA/wma.c index 3b6a23ac1bd5..059babbeda3c 100644 --- a/CORE/SERVICES/WMA/wma.c +++ b/CORE/SERVICES/WMA/wma.c @@ -14220,14 +14220,7 @@ VOS_STATUS wma_process_rate_update_indicate(tp_wma_handle wma, struct wma_txrx_node *intr = wma->interfaces; /* Get the vdev id */ - if (pRateUpdateParams->dev_mode == VOS_STA_SAP_MODE || - pRateUpdateParams->dev_mode == VOS_IBSS_MODE || - pRateUpdateParams->dev_mode == VOS_P2P_GO_MODE) - { - pdev = wma_find_vdev_by_addr(wma, pRateUpdateParams->bssid, &vdev_id); - } else { - pdev = wma_find_vdev_by_bssid(wma, pRateUpdateParams->bssid, &vdev_id); - } + pdev = wma_find_vdev_by_addr(wma, pRateUpdateParams->bssid, &vdev_id); if (!pdev) { WMA_LOGE("vdev handle is invalid for %pM", pRateUpdateParams->bssid); vos_mem_free(pRateUpdateParams); @@ -14246,6 +14239,9 @@ VOS_STATUS wma_process_rate_update_indicate(tp_wma_handle wma, mbpsx10_rate = pRateUpdateParams->mcastDataRate24GHz; paramId = WMI_VDEV_PARAM_MCAST_DATA_RATE; } + WMA_LOGE("%s: dev_id = %d, dev_type = %d, dev_mode = %d, mac = %pM", + __func__, vdev_id, intr[vdev_id].type, + pRateUpdateParams->dev_mode, pRateUpdateParams->bssid); ret = wma_encode_mc_rate(short_gi, intr[vdev_id].config.chwidth, intr[vdev_id].chanmode, intr[vdev_id].mhz, mbpsx10_rate, pRateUpdateParams->nss, &rate); |
