diff options
| author | Mingcheng Zhu <mingchen@qca.qualcomm.com> | 2013-11-15 13:47:53 -0800 |
|---|---|---|
| committer | Madan Mohan Koyyalamudi <mkoyyala@qca.qualcomm.com> | 2013-11-15 13:49:08 -0800 |
| commit | de01d74553537147adcbe1fd4f0fbbc3ad6d05de (patch) | |
| tree | 5a7c6f420caf767fc08dfe905a685e5309e23c8d | |
| parent | b5332b9823769903116110af3fef68bc10d26f7e (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.h | 1 | ||||
| -rw-r--r-- | CORE/HDD/src/wlan_hdd_hostapd.c | 34 | ||||
| -rw-r--r-- | CORE/HDD/src/wlan_hdd_main.c | 42 | ||||
| -rw-r--r-- | CORE/MAC/inc/sirApi.h | 8 | ||||
| -rw-r--r-- | CORE/MAC/src/include/sirParams.h | 2 | ||||
| -rw-r--r-- | CORE/SERVICES/WMA/wma.c | 48 | ||||
| -rw-r--r-- | CORE/SME/inc/sme_Api.h | 8 | ||||
| -rw-r--r-- | CORE/SME/src/sme_common/sme_Api.c | 35 | ||||
| -rw-r--r-- | CORE/WDA/inc/wlan_qct_wda.h | 4 |
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) |
