summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMingcheng Zhu <mingchen@qca.qualcomm.com>2014-02-21 19:31:05 -0800
committerAkash Patel <c_akashp@qca.qualcomm.com>2014-02-26 18:49:04 -0800
commitff1e0a40c132f643a28151f25bfd86408bcecbdd (patch)
tree2603d88903bc92ed3ec609cb9fbaf169bc492415
parent29391c12018e5ffc15c62cc60825a45ab83c48ae (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.h1
-rw-r--r--CORE/HDD/src/wlan_hdd_main.c88
-rw-r--r--CORE/HDD/src/wlan_hdd_wext.c11
-rw-r--r--CORE/SERVICES/WMA/wma.c12
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);