summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMingcheng Zhu <mingchen@qca.qualcomm.com>2013-11-15 13:47:53 -0800
committerMadan Mohan Koyyalamudi <mkoyyala@qca.qualcomm.com>2013-11-15 13:49:08 -0800
commitde01d74553537147adcbe1fd4f0fbbc3ad6d05de (patch)
tree5a7c6f420caf767fc08dfe905a685e5309e23c8d
parentb5332b9823769903116110af3fef68bc10d26f7e (diff)
wlan-noship: set multicast rate.
Adding set multicast rate feature to CLD 2.0 1. port sme_SendRateUpdateInd 2. port station set multicast rate 3. port softAP set multicast rate Change-Id: I65fae9ac19975bb85ef43ee8563a7001941884f7
-rw-r--r--CORE/HDD/inc/qc_sap_ioctl.h1
-rw-r--r--CORE/HDD/src/wlan_hdd_hostapd.c34
-rw-r--r--CORE/HDD/src/wlan_hdd_main.c42
-rw-r--r--CORE/MAC/inc/sirApi.h8
-rw-r--r--CORE/MAC/src/include/sirParams.h2
-rw-r--r--CORE/SERVICES/WMA/wma.c48
-rw-r--r--CORE/SME/inc/sme_Api.h8
-rw-r--r--CORE/SME/src/sme_common/sme_Api.c35
-rw-r--r--CORE/WDA/inc/wlan_qct_wda.h4
9 files changed, 181 insertions, 1 deletions
diff --git a/CORE/HDD/inc/qc_sap_ioctl.h b/CORE/HDD/inc/qc_sap_ioctl.h
index aced0842cb0a..e0d1fe9d44c7 100644
--- a/CORE/HDD/inc/qc_sap_ioctl.h
+++ b/CORE/HDD/inc/qc_sap_ioctl.h
@@ -254,6 +254,7 @@ enum {
QCSAP_PARAM_ACL_MODE = 7,
QCSAP_PARAM_HIDE_SSID = 8,
QCSAP_PARAM_AUTO_CHANNEL = 9,
+ QCSAP_PARAM_SET_MC_RATE = 10,
};
int iw_softap_get_channel_list(struct net_device *dev,
diff --git a/CORE/HDD/src/wlan_hdd_hostapd.c b/CORE/HDD/src/wlan_hdd_hostapd.c
index 0c05cd9c8c34..da88554761ce 100644
--- a/CORE/HDD/src/wlan_hdd_hostapd.c
+++ b/CORE/HDD/src/wlan_hdd_hostapd.c
@@ -1029,6 +1029,38 @@ static iw_softap_setparam(struct net_device *dev,
}
break;
}
+ case QCSAP_PARAM_SET_MC_RATE:
+ {
+ tSirRateUpdateInd *rateUpdate;
+
+ rateUpdate = (tSirRateUpdateInd *)
+ vos_mem_malloc(sizeof(tSirRateUpdateInd));
+ if (NULL == rateUpdate)
+ {
+ hddLog(VOS_TRACE_LEVEL_ERROR,
+ "%s: SET_MC_RATE indication alloc fail", __func__);
+ ret = -1;
+ break;
+ }
+ vos_mem_zero(rateUpdate, sizeof(tSirRateUpdateInd ));
+
+ hddLog(VOS_TRACE_LEVEL_INFO, "MC Target rate %d", set_value);
+ memcpy(rateUpdate->bssId,
+ pHostapdAdapter->macAddressCurrent.bytes,
+ sizeof(tSirMacAddr));
+ rateUpdate->dev_mode = pHostapdAdapter->device_mode;
+ rateUpdate->mcastDataRate = set_value;
+ rateUpdate->bcastDataRate = -1;
+ status = sme_SendRateUpdateInd(hHal, rateUpdate);
+ if (eHAL_STATUS_SUCCESS != status)
+ {
+ hddLog(VOS_TRACE_LEVEL_ERROR,
+ "%s: SET_MC_RATE failed", __func__);
+ vos_mem_free(rateUpdate);
+ ret = -1;
+ }
+ break;
+ }
default:
hddLog(LOGE, FL("Invalid setparam command %d value %d"),
@@ -2699,6 +2731,8 @@ static const struct iw_priv_args hostapd_private_args[] = {
IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "setMaxAssoc" },
{ QCSAP_PARAM_HIDE_SSID,
IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "hideSSID" },
+ { QCSAP_PARAM_SET_MC_RATE,
+ IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "setMcRate" },
{ QCSAP_IOCTL_GETPARAM,
IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, "getparam" },
diff --git a/CORE/HDD/src/wlan_hdd_main.c b/CORE/HDD/src/wlan_hdd_main.c
index 62b05d3a305d..d80360378d90 100644
--- a/CORE/HDD/src/wlan_hdd_main.c
+++ b/CORE/HDD/src/wlan_hdd_main.c
@@ -1678,6 +1678,48 @@ int hdd_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
}
}
#endif
+ else if (strncmp(command, "SETMCRATE", 9) == 0)
+ {
+ tANI_U8 *value = command;
+ int targetRate;
+ tSirRateUpdateInd *rateUpdate;
+ eHalStatus status;
+ 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->dev_mode = pAdapter->device_mode;
+ rateUpdate->mcastDataRate = 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;
+ }
+ }
else {
hddLog( VOS_TRACE_LEVEL_WARN, "%s: Unsupported GUI command %s",
__func__, command);
diff --git a/CORE/MAC/inc/sirApi.h b/CORE/MAC/inc/sirApi.h
index d02c49760e94..e6ec37d96af0 100644
--- a/CORE/MAC/inc/sirApi.h
+++ b/CORE/MAC/inc/sirApi.h
@@ -4244,4 +4244,12 @@ typedef struct sSirPsReqData
tSirAddonPsReq addOnReq;
} tSirPsReqData,*tpSirPsReqData;
+typedef struct sSirRateUpdateInd
+{
+ tSirMacAddr bssId;
+ tVOS_CON_MODE dev_mode;
+ tANI_S32 mcastDataRate; /* mcast rate unit Mbpsx10, -1 : not used */
+ tANI_S32 bcastDataRate; /* bcast rate unit Mbpsx10, -1 : not used */
+} tSirRateUpdateInd, *tpSirRateUpdateInd;
+
#endif /* __SIR_API_H */
diff --git a/CORE/MAC/src/include/sirParams.h b/CORE/MAC/src/include/sirParams.h
index 41443107e873..5589c8e7c437 100644
--- a/CORE/MAC/src/include/sirParams.h
+++ b/CORE/MAC/src/include/sirParams.h
@@ -574,6 +574,8 @@ typedef struct sSirMbMsgP2p
#endif
#define SIR_CSA_OFFLOAD_EVENT (SIR_HAL_ITC_MSG_TYPES_BEGIN + 208)
+#define SIR_HAL_RATE_UPDATE_IND (SIR_HAL_ITC_MSG_TYPES_BEGIN + 208)
+
#define SIR_HAL_MSG_TYPES_END (SIR_HAL_ITC_MSG_TYPES_BEGIN + 0xFF)
// CFG message types
#define SIR_CFG_MSG_TYPES_BEGIN (SIR_CFG_MODULE_ID << 8)
diff --git a/CORE/SERVICES/WMA/wma.c b/CORE/SERVICES/WMA/wma.c
index fbe70681d545..bf60d4a01fc2 100644
--- a/CORE/SERVICES/WMA/wma.c
+++ b/CORE/SERVICES/WMA/wma.c
@@ -7923,6 +7923,51 @@ static VOS_STATUS wma_enable_arp_ns_offload(tp_wma_handle wma, tpSirHostOffloadR
return VOS_STATUS_SUCCESS;
}
+/*
+ * FUNCTION: wma_process_rate_update_indate
+ *
+ */
+VOS_STATUS wma_process_rate_update_indicate(tp_wma_handle wma,
+ tSirRateUpdateInd *pRateUpdateParams)
+{
+ int32_t ret = 0;
+ u_int8_t vdev_id = 0;
+ void *pdev;
+
+ /* Get the vdev id */
+ if (pRateUpdateParams->dev_mode == VOS_STA_SAP_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);
+ if (!pdev) {
+ WMA_LOGE("vdev handle is invalid for %pM", pRateUpdateParams->bssId);
+ vos_mem_free(pRateUpdateParams);
+ return VOS_STATUS_E_INVAL;
+ }
+
+ if (pRateUpdateParams->mcastDataRate > -1) {
+ ret = wmi_unified_vdev_set_param_send(wma->wmi_handle, vdev_id,
+ WMI_VDEV_PARAM_MCAST_DATA_RATE,
+ pRateUpdateParams->mcastDataRate);
+ } else if (pRateUpdateParams->bcastDataRate > -1) {
+ ret = wmi_unified_vdev_set_param_send(wma->wmi_handle, vdev_id,
+ WMI_VDEV_PARAM_BCAST_DATA_RATE,
+ pRateUpdateParams->bcastDataRate);
+ } else {
+ WMA_LOGE("%s: Error, Invalid rate value", __func__);
+ vos_mem_free(pRateUpdateParams);
+ return VOS_STATUS_E_INVAL;
+ }
+
+ vos_mem_free(pRateUpdateParams);
+ if (ret) {
+ WMA_LOGE("%s: Failed to Set rate, ret = %d", __func__, ret);
+ return VOS_STATUS_E_FAILURE;
+ }
+ return VOS_STATUS_SUCCESS;
+}
+
/* function : wma_mc_process_msg
* Descriptin :
* Args :
@@ -8195,6 +8240,9 @@ VOS_STATUS wma_mc_process_msg(v_VOID_t *vos_context, vos_msg_t *msg)
(tSirRoamOffloadScanReq *)msg->bodyptr);
break;
+ case WDA_RATE_UPDATE_IND:
+ wma_process_rate_update_indicate(wma_handle, (tSirRateUpdateInd *)msg->bodyptr);
+ break;
default:
WMA_LOGD("unknow msg type %x", msg->type);
/* Do Nothing? MSG Body should be freed at here */
diff --git a/CORE/SME/inc/sme_Api.h b/CORE/SME/inc/sme_Api.h
index fbfba958b6c7..b1d30c5e385d 100644
--- a/CORE/SME/inc/sme_Api.h
+++ b/CORE/SME/inc/sme_Api.h
@@ -2859,4 +2859,12 @@ eHalStatus sme_MoveCsrToScanStateForPno (tHalHandle hHal, tANI_U8 sessionId);
eHalStatus sme_getChannelInfo(tHalHandle hHal, tANI_U8 chanId,
tSmeChannelInfo *chanInfo);
#endif
+/* ---------------------------------------------------------------------------
+ \fn sme_SendRateUpdateInd
+ \brief API to Update rate
+ \param hHal - The handle returned by macOpen
+ \param rateUpdateParams - Pointer to rate update params
+ \return eHalStatus
+ ---------------------------------------------------------------------------*/
+eHalStatus sme_SendRateUpdateInd(tHalHandle hHal, tSirRateUpdateInd *rateUpdateParams);
#endif //#if !defined( __SME_API_H )
diff --git a/CORE/SME/src/sme_common/sme_Api.c b/CORE/SME/src/sme_common/sme_Api.c
index 3a887c809892..c6a640816d52 100644
--- a/CORE/SME/src/sme_common/sme_Api.c
+++ b/CORE/SME/src/sme_common/sme_Api.c
@@ -9013,3 +9013,38 @@ eHalStatus sme_getChannelInfo(tHalHandle hHal, tANI_U8 chanId,
return status;
}
#endif /* QCA_WIFI_2_0 */
+
+/* ---------------------------------------------------------------------------
+ \fn sme_SendRateUpdateInd
+ \brief API to Update rate
+ \param hHal - The handle returned by macOpen
+ \param rateUpdateParams - Pointer to rate update params
+ \return eHalStatus
+ ---------------------------------------------------------------------------*/
+eHalStatus sme_SendRateUpdateInd(tHalHandle hHal, tSirRateUpdateInd *rateUpdateParams)
+{
+ tpAniSirGlobal pMac = PMAC_STRUCT(hHal);
+ eHalStatus status;
+ vos_msg_t msg;
+
+ if (eHAL_STATUS_SUCCESS == (status = sme_AcquireGlobalLock(&pMac->sme)))
+ {
+ msg.type = WDA_RATE_UPDATE_IND;
+ msg.bodyptr = rateUpdateParams;
+
+ if (!VOS_IS_STATUS_SUCCESS(vos_mq_post_message(VOS_MODULE_ID_WDA, &msg)))
+ {
+ VOS_TRACE( VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_ERROR,"%s: Not able "
+ "to post WDA_SET_RMC_RATE_IND to WDA!",
+ __func__);
+
+ sme_ReleaseGlobalLock(&pMac->sme);
+ return eHAL_STATUS_FAILURE;
+ }
+
+ sme_ReleaseGlobalLock(&pMac->sme);
+ return eHAL_STATUS_SUCCESS;
+ }
+
+ return status;
+}
diff --git a/CORE/WDA/inc/wlan_qct_wda.h b/CORE/WDA/inc/wlan_qct_wda.h
index 33b5d428aa75..9e33c81333d5 100644
--- a/CORE/WDA/inc/wlan_qct_wda.h
+++ b/CORE/WDA/inc/wlan_qct_wda.h
@@ -1217,6 +1217,8 @@ tSirRetStatus uMacPostCtrlMsg(void* pSirGlobal, tSirMbMsg* pMb);
#define WDA_PKTLOG_ENABLE_REQ SIR_HAL_PKTLOG_ENABLE_REQ
#endif
+#define WDA_RATE_UPDATE_IND SIR_HAL_RATE_UPDATE_IND
+
tSirRetStatus wdaPostCtrlMsg(tpAniSirGlobal pMac, tSirMsgQ *pMsg);
#define HAL_USE_BD_RATE2_FOR_MANAGEMENT_FRAME 0x40 // Bit 6 will be used to control BD rate for Management frames
@@ -1265,7 +1267,7 @@ tSirRetStatus wdaPostCtrlMsg(tpAniSirGlobal pMac, tSirMsgQ *pMsg);
eHalStatus WDA_SetRegDomain(void * clientCtxt, v_REGDOMAIN_t regId);
static int WDA_SetHTConfig(tANI_U8 sessionId, tANI_U16 htCapab, int value)
{
- return 0;
+ return 0;
}
static inline eHalStatus WDA_SetCountryCode(v_VOID_t *client_ctx, tANI_U8 *countrycode)