diff --git a/drivers/staging/qcacld-3.0/Android.mk b/drivers/staging/qcacld-3.0/Android.mk index 5dfb078e816b..022974c8c8ca 100644 --- a/drivers/staging/qcacld-3.0/Android.mk +++ b/drivers/staging/qcacld-3.0/Android.mk @@ -132,6 +132,37 @@ ifneq ($(WLAN_CFG_OVERRIDE_$(LOCAL_DEV_NAME)),) KBUILD_OPTIONS += WLAN_CFG_OVERRIDE="$(WLAN_CFG_OVERRIDE_$(LOCAL_DEV_NAME))" endif +########################################################## +# Copy the unstrip file and corresponding elf file to out symbols folders +WLAN_SYMBOLS_OUT := $(TARGET_OUT_UNSTRIPPED)/$(LOCAL_PATH) +UNSTRIPPED_MODULE := $(WLAN_CHIPSET)_$(LOCAL_DEV_NAME).ko.unstripped +UNSTRIPPED_FILE_PATH := $(TARGET_OUT_INTERMEDIATES)/$(LOCAL_PATH)/$(UNSTRIPPED_MODULE) + +INSTALL_WLAN_UNSTRIPPED_MODULE := mkdir -p $(WLAN_SYMBOLS_OUT); \ + cp -rf $(UNSTRIPPED_FILE_PATH) $(WLAN_SYMBOLS_OUT); + +ifneq ($(filter msm8998 sdm845 sdm670 sdm710, $(TARGET_BOARD_PLATFORM)),) + WLAN_ELF_FILE_PATH := vendor/qcom/nonhlos/wlan_proc/build/ms/WLAN_MERGED.elf +else ifneq ($(filter sdm660, $(TARGET_BOARD_PLATFORM)),) + WLAN_ELF_FILE_PATH := vendor/qcom/nonhlos/WLAN.HL.1.0.1/wlan_proc/build/ms/WLAN_MERGED.elf +else ifneq ($(filter sm6150, $(TARGET_BOARD_PLATFORM)),) + ifeq ($(WLAN_FW_ALT_AT43), true) + WLAN_ELF_FILE_PATH := vendor/qcom/nonhlos/WLAN.HL.3.0.1/wlan_proc/build/ms/*.elf + else + WLAN_ELF_FILE_PATH := vendor/qcom/nonhlos/WLAN.HL.3.2.2/wlan_proc/build/ms/*.elf + endif +else ifneq ($(filter trinket, $(TARGET_BOARD_PLATFORM)),) + WLAN_ELF_FILE_PATH := vendor/qcom/nonhlos/WLAN.HL.3.0.2/wlan_proc/build/ms/WLAN_MERGED.elf +else ifneq ($(filter lito, $(TARGET_BOARD_PLATFORM)),) + WLAN_ELF_FILE_PATH := vendor/qcom/nonhlos/WLAN.HL.3.3.1/wlan_proc/build/ms/Msaipan_WLAN_MERGED.elf +else ifneq ($(filter bengal, $(TARGET_BOARD_PLATFORM)),) + WLAN_ELF_FILE_PATH := vendor/qcom/nonhlos/WLAN.HL.3.2.4/wlan_proc/build/ms/WLAN_MERGED.elf +endif + +ifneq ($(WLAN_ELF_FILE_PATH),) + INSTALL_WLAN_UNSTRIPPED_MODULE += cp -rf $(WLAN_ELF_FILE_PATH) $(WLAN_SYMBOLS_OUT) +endif + include $(CLEAR_VARS) LOCAL_MODULE := $(WLAN_CHIPSET)_$(LOCAL_DEV_NAME).ko LOCAL_MODULE_KBUILD_NAME := $(LOCAL_MOD_NAME).ko @@ -146,6 +177,9 @@ else LOCAL_MODULE_PATH := $(TARGET_OUT)/lib/modules/$(WLAN_CHIPSET) endif +# Once unstripped file is generated, copy the same to out symbols folder +LOCAL_POST_INSTALL_CMD := $(INSTALL_WLAN_UNSTRIPPED_MODULE) + include $(DLKM_DIR)/AndroidKernelModule.mk ########################################################### @@ -170,6 +204,11 @@ endif $(shell mkdir -p $(TARGET_FW_PATH); \ ln -sf $(TARGET_MAC_BIN_PATH)/wlan_mac.bin $(TARGET_FW_PATH)/wlan_mac.bin) + +# BEGIN IKSWR-45692, support loading moto specific configurations +$(shell ln -sf $(TARGET_CFG_PATH)/WCNSS_mot_cfg.ini $(TARGET_FW_PATH)/WCNSS_mot_cfg.ini) +# END IKSWR-45692 + ifneq ($(GENERIC_ODM_IMAGE),true) $(shell ln -sf $(TARGET_CFG_PATH)/WCNSS_qcom_cfg.ini $(TARGET_FW_PATH)/WCNSS_qcom_cfg.ini) endif diff --git a/drivers/staging/qcacld-3.0/Kbuild b/drivers/staging/qcacld-3.0/Kbuild index 4f45222643a8..e712f94e64f2 100644 --- a/drivers/staging/qcacld-3.0/Kbuild +++ b/drivers/staging/qcacld-3.0/Kbuild @@ -2701,6 +2701,13 @@ cppflags-$(CONFIG_QCA_WIFI_FTM) += -DQCA_WIFI_FTM cppflags-$(CONFIG_NL80211_TESTMODE) += -DQCA_WIFI_FTM_NL80211 cppflags-$(CONFIG_LINUX_QCMBR) += -DLINUX_QCMBR -DQCA_WIFI_FTM_IOCTL +# WLAN_WHITE_LIST - WLAN Radiated Power Test +# For user software build, wlan driver needs to allow the factory +# commnds only for Tx_opcode and NART commands based off 12M doc +ifeq ($(TARGET_BUILD_VARIANT),user) +CDEFINES += -DWLAN_WHITE_LIST +endif + #Enable Checksum Offload support cppflags-$(CONFIG_CHECKSUM_OFFLOAD) += -DCHECKSUM_OFFLOAD @@ -3018,6 +3025,8 @@ cppflags-$(CONFIG_WLAN_HANG_EVENT) += -DHIF_BUS_LOG_INFO cppflags-$(CONFIG_WLAN_HANG_EVENT) += -DDP_SUPPORT_RECOVERY_NOTIFY #endof dummy flags +cppflags-y += -DMOTO_UTAGS_MAC + ccflags-$(CONFIG_ENABLE_SIZE_OPTIMIZE) += -Os # DFS component diff --git a/drivers/staging/qcacld-3.0/NOTICE b/drivers/staging/qcacld-3.0/NOTICE new file mode 100644 index 000000000000..cab58c63efb4 --- /dev/null +++ b/drivers/staging/qcacld-3.0/NOTICE @@ -0,0 +1,21 @@ +Copyright (c) 2012-2016 The Linux Foundation. All rights reserved. + +Previously licensed under the ISC license by Qualcomm Atheros, Inc. + +Permission to use, copy, modify, and/or distribute this software for +any purpose with or without fee is hereby granted, provided that the +above copyright notice and this permission notice appear in all +copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL +WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE +AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL +DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR +PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. + +This file was originally distributed by Qualcomm Atheros, Inc. +under proprietary terms before Copyright ownership was assigned +to the Linux Foundation. diff --git a/drivers/staging/qcacld-3.0/components/mlme/dispatcher/inc/cfg_mlme_stats.h b/drivers/staging/qcacld-3.0/components/mlme/dispatcher/inc/cfg_mlme_stats.h index 613cb68770a2..9920ed2bbafb 100644 --- a/drivers/staging/qcacld-3.0/components/mlme/dispatcher/inc/cfg_mlme_stats.h +++ b/drivers/staging/qcacld-3.0/components/mlme/dispatcher/inc/cfg_mlme_stats.h @@ -97,7 +97,7 @@ enum mlme_stats_link_speed_rpt_type { "gReportMaxLinkSpeed", \ CFG_STATS_LINK_SPEED_REPORT_ACTUAL, \ CFG_STATS_LINK_SPEED_REPORT_MAX_SCALED, \ - CFG_STATS_LINK_SPEED_REPORT_MAX_SCALED, \ + CFG_STATS_LINK_SPEED_REPORT_ACTUAL, \ CFG_VALUE_OR_DEFAULT, \ "Max link speed") diff --git a/drivers/staging/qcacld-3.0/components/mlme/dispatcher/inc/cfg_mlme_vht_caps.h b/drivers/staging/qcacld-3.0/components/mlme/dispatcher/inc/cfg_mlme_vht_caps.h index cc4bb01740fc..bab5d53d0d7e 100644 --- a/drivers/staging/qcacld-3.0/components/mlme/dispatcher/inc/cfg_mlme_vht_caps.h +++ b/drivers/staging/qcacld-3.0/components/mlme/dispatcher/inc/cfg_mlme_vht_caps.h @@ -113,16 +113,16 @@ #define CFG_VHT_RX_SUPP_DATA_RATE CFG_UINT( \ "rx_supp_data_rate", \ 0, \ - 866, \ - 866, \ + 780, \ + 780, \ CFG_VALUE_OR_DEFAULT, \ "VHT RX SUPP DATA RATE") #define CFG_VHT_TX_SUPP_DATA_RATE CFG_UINT( \ "tx_supp_data_rate", \ 0, \ - 866, \ - 866, \ + 780, \ + 780, \ CFG_VALUE_OR_DEFAULT, \ "VHT TX SUPP DATA RATE") diff --git a/drivers/staging/qcacld-3.0/components/mlme/dispatcher/inc/wlan_mlme_ucfg_api.h b/drivers/staging/qcacld-3.0/components/mlme/dispatcher/inc/wlan_mlme_ucfg_api.h index b91b7ea8b5ce..4b5dafb5c7e5 100644 --- a/drivers/staging/qcacld-3.0/components/mlme/dispatcher/inc/wlan_mlme_ucfg_api.h +++ b/drivers/staging/qcacld-3.0/components/mlme/dispatcher/inc/wlan_mlme_ucfg_api.h @@ -1179,6 +1179,16 @@ ucfg_mlme_is_roam_scan_offload_enabled(struct wlan_objmgr_psoc *psoc, QDF_STATUS ucfg_mlme_set_tgt_adaptive_11r_cap(struct wlan_objmgr_psoc *psoc, bool val); +/** + * ucfg_mlme_get_adaptive11r_enabled() - get adaptive 11R enabled status + * @psoc: pointer to psoc object + * @value: pointer to the value which will be filled for the caller + * + * Return: QDF Status + */ +QDF_STATUS +ucfg_mlme_get_adaptive11r_enabled(struct wlan_objmgr_psoc *psoc, + bool *value); #else static inline QDF_STATUS ucfg_mlme_set_tgt_adaptive_11r_cap(struct wlan_objmgr_psoc *psoc, @@ -1186,6 +1196,14 @@ ucfg_mlme_set_tgt_adaptive_11r_cap(struct wlan_objmgr_psoc *psoc, { return QDF_STATUS_SUCCESS; } + +static inline QDF_STATUS +ucfg_mlme_get_adaptive11r_enabled(struct wlan_objmgr_psoc *psoc, + bool *value) +{ + *value = false; + return QDF_STATUS_SUCCESS; +} #endif /** diff --git a/drivers/staging/qcacld-3.0/components/mlme/dispatcher/src/wlan_mlme_ucfg_api.c b/drivers/staging/qcacld-3.0/components/mlme/dispatcher/src/wlan_mlme_ucfg_api.c index bdbc2aaa4243..c29ae19e0bb4 100644 --- a/drivers/staging/qcacld-3.0/components/mlme/dispatcher/src/wlan_mlme_ucfg_api.c +++ b/drivers/staging/qcacld-3.0/components/mlme/dispatcher/src/wlan_mlme_ucfg_api.c @@ -896,6 +896,22 @@ ucfg_mlme_set_tgt_adaptive_11r_cap(struct wlan_objmgr_psoc *psoc, return QDF_STATUS_SUCCESS; } + +QDF_STATUS +ucfg_mlme_get_adaptive11r_enabled(struct wlan_objmgr_psoc *psoc, bool *val) +{ + struct wlan_mlme_psoc_ext_obj *mlme_obj; + + mlme_obj = mlme_get_psoc_ext_obj(psoc); + if (!mlme_obj) { + *val = cfg_default(CFG_ADAPTIVE_11R); + return QDF_STATUS_E_INVAL; + } + + *val = mlme_obj->cfg.lfr.enable_adaptive_11r; + + return QDF_STATUS_SUCCESS; +} #endif QDF_STATUS diff --git a/drivers/staging/qcacld-3.0/core/hdd/inc/qc_sap_ioctl.h b/drivers/staging/qcacld-3.0/core/hdd/inc/qc_sap_ioctl.h index 7226536b5a83..d76aa38c65ff 100644 --- a/drivers/staging/qcacld-3.0/core/hdd/inc/qc_sap_ioctl.h +++ b/drivers/staging/qcacld-3.0/core/hdd/inc/qc_sap_ioctl.h @@ -89,6 +89,9 @@ struct channel_list_info { #define WE_SET_THERMAL_THROTTLE_CFG 27 +/* for moto SAR features, support tx pwr limit settings on mimo device */ +#define WE_SET_MIMO_TX_POWER 32 + #define WE_P2P_NOA_CMD 2 #define QCSAP_IOCTL_MODIFY_ACL (SIOCIWFIRSTPRIV + 18) diff --git a/drivers/staging/qcacld-3.0/core/hdd/inc/wlan_hdd_cfg.h b/drivers/staging/qcacld-3.0/core/hdd/inc/wlan_hdd_cfg.h index 5647133e2b8b..31408eb632b6 100644 --- a/drivers/staging/qcacld-3.0/core/hdd/inc/wlan_hdd_cfg.h +++ b/drivers/staging/qcacld-3.0/core/hdd/inc/wlan_hdd_cfg.h @@ -267,6 +267,11 @@ struct hdd_config { eCsrRoamWmmUserModeType hdd_to_csr_wmm_mode(uint8_t mode); QDF_STATUS hdd_update_mac_config(struct hdd_context *hdd_ctx); +#ifdef MOTO_UTAGS_MAC +QDF_STATUS hdd_update_mac_serial(struct hdd_context *hdd_ctx); +QDF_STATUS hdd_generate_random_mac_from_serialno(char *serialNo, + int serialength, char *computedMac); +#endif QDF_STATUS hdd_set_sme_config(struct hdd_context *hdd_ctx); QDF_STATUS hdd_set_policy_mgr_user_cfg(struct hdd_context *hdd_ctx); QDF_STATUS hdd_set_sme_chan_list(struct hdd_context *hdd_ctx); diff --git a/drivers/staging/qcacld-3.0/core/hdd/inc/wlan_hdd_misc.h b/drivers/staging/qcacld-3.0/core/hdd/inc/wlan_hdd_misc.h index b105df1b3a98..f018d2efc3e4 100644 --- a/drivers/staging/qcacld-3.0/core/hdd/inc/wlan_hdd_misc.h +++ b/drivers/staging/qcacld-3.0/core/hdd/inc/wlan_hdd_misc.h @@ -44,6 +44,9 @@ #ifdef MSM_PLATFORM #define WLAN_INI_FILE "wlan/qca_cld/" PREFIX "WCNSS_qcom_cfg.ini" #define WLAN_MAC_FILE "wlan/qca_cld/" PREFIX "wlan_mac.bin" +// BEGIN IKSWR-45692, support loading moto specific configurations +#define WLAN_MOT_INI_FILE "wlan/qca_cld/" PREFIX "WCNSS_mot_cfg.ini" +// END IKSWR-45692 #else #define WLAN_INI_FILE "wlan/" PREFIX "qcom_cfg.ini" #define WLAN_MAC_FILE "wlan/" PREFIX "wlan_mac.bin" diff --git a/drivers/staging/qcacld-3.0/core/hdd/src/wlan_hdd_cfg.c b/drivers/staging/qcacld-3.0/core/hdd/src/wlan_hdd_cfg.c old mode 100644 new mode 100755 index 68f9492dff61..462d943667ab --- a/drivers/staging/qcacld-3.0/core/hdd/src/wlan_hdd_cfg.c +++ b/drivers/staging/qcacld-3.0/core/hdd/src/wlan_hdd_cfg.c @@ -1,5 +1,6 @@ /* - * Copyright (c) 2012-2020 The Linux Foundation. All rights reserved. + * Copyright (c) 2012-2021 The Linux Foundation. All rights reserved. + * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved. * * Permission to use, copy, modify, and/or distribute this software for * any purpose with or without fee is hereby granted, provided that the @@ -49,6 +50,153 @@ #include "hdd_dp_cfg.h" #include "wlan_hdd_object_manager.h" +#ifdef MOTO_UTAGS_MAC +#include +#include +#include +#include + +#define WIFI_MAC_BOOTARG "wifimacaddr=" +#define DEVICE_SERIALNO_BOOTARG "androidboot.serialno=" +#define MACSTRLEN 12 + +struct sdesc { + struct shash_desc shash; + char ctx[]; +}; + +QDF_STATUS hdd_update_mac_serial(struct hdd_context *hdd_ctx) +{ + QDF_STATUS qdf_status = QDF_STATUS_SUCCESS; + + int len = 0; + int serialnoLen = 0; + + char *buffer = NULL; + char *bufferPtr = NULL; + char *computedMac = NULL; + const char *cmd_line = NULL; + tSirMacAddr mac_addr; + + struct device_node *chosen_node = NULL; + computedMac = (char*)qdf_mem_malloc(QDF_MAC_ADDR_SIZE); + + chosen_node = of_find_node_by_name(NULL, "chosen"); + hdd_err("%s: get chosen node \n", __func__); + + if (!chosen_node) + { + hdd_err("%s: get chosen node read failed \n", __func__); + goto config_exit; + } else { + cmd_line = of_get_property(chosen_node, "bootargs", &len); + if (!cmd_line || len <= 0) { + hdd_err("%s: get the barcode bootargs failed \n", __func__); + qdf_status = QDF_STATUS_E_FAILURE; + goto config_exit; + } else { + buffer = strstr(cmd_line, DEVICE_SERIALNO_BOOTARG); + if (buffer == NULL) { + hdd_err("%s: " DEVICE_SERIALNO_BOOTARG" not present cmd line argc", + __func__); + qdf_status = QDF_STATUS_E_FAILURE; + goto config_exit; + } else { + buffer += strlen(DEVICE_SERIALNO_BOOTARG); + bufferPtr = buffer; + while (*bufferPtr != ' ') { + bufferPtr++; + serialnoLen = serialnoLen + 1; + } + } + } + } + /*Data have been read from boot serial no */ + /*Now generate random unique the 6 byte string */ + if (hdd_generate_random_mac_from_serialno(buffer, serialnoLen, + computedMac) != QDF_STATUS_SUCCESS) { + qdf_status = QDF_STATUS_E_FAILURE; + goto config_exit; + } + qdf_mem_copy(&hdd_ctx->provisioned_mac_addr[0].bytes[0], + (uint8_t *)computedMac, QDF_MAC_ADDR_SIZE); + qdf_mem_copy(&mac_addr, &hdd_ctx->provisioned_mac_addr[0].bytes[0], + sizeof(tSirMacAddr)); + hdd_ctx->num_provisioned_addr = 1; // Only one address was generated + hdd_populate_random_mac_addr(hdd_ctx, QDF_MAX_CONCURRENCY_PERSONA - 1); + sme_set_custom_mac_addr(mac_addr); +config_exit: + qdf_mem_free(computedMac); + return qdf_status; +} + +QDF_STATUS hdd_generate_random_mac_from_serialno(char *serialNo, int serialnoLen, + char *macAddr) +{ + unsigned int size; + struct crypto_shash *md5; + struct sdesc *sdescmd5; + char *hashBuf = NULL; + + QDF_STATUS cryptoStatus = QDF_STATUS_SUCCESS; + hashBuf = (char*)qdf_mem_malloc(16); + + /*Motorola OUI*/ + macAddr[0] = 0x38; + macAddr[1] = 0x80; + macAddr[2] = 0xDF; + + md5 = crypto_alloc_shash("md5", 0, 0); + if (IS_ERR(md5)) { + cryptoStatus = QDF_STATUS_E_FAILURE; + hdd_err("%s: Crypto md5 allocation error \n", __func__); + qdf_mem_free(hashBuf); + return QDF_STATUS_E_FAILURE; + } + + size = sizeof(struct shash_desc) + crypto_shash_descsize(md5); + + sdescmd5 = kmalloc(size, GFP_KERNEL); + if (!sdescmd5) { + cryptoStatus = QDF_STATUS_E_FAILURE; + hdd_err("%s: Memory allocation error \n", __func__); + goto crypto_hash_err; + } + + sdescmd5->shash.tfm = md5; + sdescmd5->shash.flags = 0x0; + + if (crypto_shash_init(&sdescmd5->shash)) { + cryptoStatus = QDF_STATUS_E_FAILURE; + goto crypto_hash_err; + } + + if (crypto_shash_update(&sdescmd5->shash, serialNo, serialnoLen)) { + cryptoStatus = QDF_STATUS_E_FAILURE; + goto crypto_hash_err; + } + + if (crypto_shash_final(&sdescmd5->shash, &hashBuf[0])) { + cryptoStatus = QDF_STATUS_E_FAILURE; + goto crypto_hash_err; + } + + macAddr[3] = hashBuf[0]; + macAddr[4] = hashBuf[1]; + macAddr[5] = hashBuf[2]; + + hdd_err("%02X:%02X:%02X:%02X:%02X:%02X is the new MAC generated from serial number \n", macAddr[0], + macAddr[1], macAddr[2], macAddr[3], + macAddr[4], macAddr[5]); + crypto_hash_err: + qdf_mem_free(hashBuf); + crypto_free_shash(md5); + kfree(sdescmd5); + + return cryptoStatus; +} +#else + /** * get_next_line() - find and locate the new line pointer * @str: pointer to string @@ -126,6 +274,8 @@ static char *i_trim(char *str) return str; } +#endif + /** struct hdd_cfg_entry - ini configuration entry * @name: name of the entry * @value: value of the entry @@ -226,6 +376,7 @@ static void hdd_set_power_save_offload_config(struct hdd_context *hdd_ctx) * Return: QDF_STATUS_SUCCESS if the MAC address is found from cfg file * and overwritten, otherwise QDF_STATUS_E_INVAL */ +#ifndef MOTO_UTAGS_MAC QDF_STATUS hdd_update_mac_config(struct hdd_context *hdd_ctx) { int status, i = 0; @@ -339,6 +490,100 @@ config_exit: return qdf_status; } +#else +QDF_STATUS hdd_update_mac_config(struct hdd_context *hdd_ctx) +{ + int len = 0; + int i = 0; + int intf = 0; + char *bufferPtr = NULL; + char name[QDF_MAX_CONCURRENCY_PERSONA][16] = {{0}}; + char buffer_temp[QDF_MAX_CONCURRENCY_PERSONA][MACSTRLEN+1] = {{0}}; + const char *cmd_line = NULL; + struct device_node *chosen_node = NULL; + char *buffer = NULL; + + struct hdd_cfg_entry macTable[QDF_MAX_CONCURRENCY_PERSONA]; + tSirMacAddr customMacAddr; + + QDF_STATUS qdf_status = QDF_STATUS_SUCCESS; + + memset(macTable, 0, sizeof(macTable)); + + /*Implemenation of QCOM is to read the MAC address from the predefined*/ + /*location where WLAN MMAC File have the MAC Address */ + /* Read MACs from bootparams. */ + chosen_node = of_find_node_by_name(NULL, "chosen"); + hdd_err("%s: get chosen node \n", __func__); + if (!chosen_node) + { + hdd_err("%s: get chosen node read failed \n", __func__); + goto config_exit; + } else { + cmd_line = of_get_property(chosen_node, "bootargs", &len); + + if (!cmd_line || len <= 0) { + hdd_err("%s: get wlan MACs bootargs failed \n", __func__); + qdf_status = QDF_STATUS_E_FAILURE; + goto config_exit; + } else { + buffer = strstr(cmd_line, WIFI_MAC_BOOTARG); + if (buffer == NULL) { + hdd_err("%s: " WIFI_MAC_BOOTARG " bootarg cmd line is null", __func__); + qdf_status = QDF_STATUS_E_FAILURE; + goto config_exit; + } else { + buffer += strlen(WIFI_MAC_BOOTARG); + bufferPtr = buffer; + } + } + } + /* Mac address data format used by qcom: + * Intf0MacAddress=00AA00BB00CC + * Intf1MacAddress=00AA00BB00CD + * xxxxxxxxxxxxxxxxxxxxxxxxxxxx + * Intf0MacAddress used for 1 macaddress + * if gp2pdeviceAdmistered is set to 1 + * if s020deviceAdmisnited is set to 0 + * it will use Intf1MacAddress for P2P seprately + * Motorola decided to use gp2pdeviceAdmistered = 1 i.e use + * locally gerated bin MAC addr for P2P + * From bootarg we need to strip off : from macaddress + */ + while (*bufferPtr != '\0' && *bufferPtr != ' ') { + if (*bufferPtr != ':' && *bufferPtr != ',') { + buffer_temp[intf][i++] = *bufferPtr; + if (i == MACSTRLEN) { + buffer_temp[intf][i] = '\0'; + sprintf(name[intf], "Intf%dMacAddress", intf); + macTable[intf].name = name[intf]; + macTable[intf].value = buffer_temp[intf]; + i = 0; + intf++; + hdd_ctx->num_provisioned_addr++; + if (intf >= QDF_MAX_CONCURRENCY_PERSONA) + break; + } + } + bufferPtr++; + } + + for (i = 0; i < intf; i++) + hdd_err("Mac address table from utag: [%s][%s]", macTable[i].name, macTable[i].value); + + update_mac_from_string(hdd_ctx, &macTable[0], intf); + hdd_populate_random_mac_addr(hdd_ctx, QDF_MAX_CONCURRENCY_PERSONA - intf); + qdf_mem_copy(&customMacAddr, &hdd_ctx->provisioned_mac_addr[0].bytes[0], + sizeof(tSirMacAddr)); + sme_set_custom_mac_addr(customMacAddr); + +config_exit: + + return qdf_status; +} + +#endif + /** * hdd_disable_runtime_pm() - Override to disable runtime_pm. * @cfg_ini: Handle to struct hdd_config @@ -1118,7 +1363,7 @@ QDF_STATUS hdd_update_nss(struct hdd_adapter *adapter, uint8_t tx_nss, adapter->vdev_id); if (!bval) { hdd_err("Nss in 1x1, no change required, 2x2 mode disabled"); - return QDF_STATUS_E_FAILURE; + return QDF_STATUS_SUCCESS; } for (band = NSS_CHAINS_BAND_2GHZ; band < NSS_CHAINS_BAND_MAX; diff --git a/drivers/staging/qcacld-3.0/core/hdd/src/wlan_hdd_cfg80211.c b/drivers/staging/qcacld-3.0/core/hdd/src/wlan_hdd_cfg80211.c index 94d24ddb25ef..ba01ed62b608 100644 --- a/drivers/staging/qcacld-3.0/core/hdd/src/wlan_hdd_cfg80211.c +++ b/drivers/staging/qcacld-3.0/core/hdd/src/wlan_hdd_cfg80211.c @@ -263,7 +263,7 @@ static const struct ieee80211_channel hdd_channels_2_4_ghz[] = { HDD2GHZCHAN(2462, 11, 0), HDD2GHZCHAN(2467, 12, 0), HDD2GHZCHAN(2472, 13, 0), - HDD2GHZCHAN(2484, 14, 0), + }; static const struct ieee80211_channel hdd_channels_5_ghz[] = { @@ -1937,7 +1937,7 @@ static int wlan_hdd_set_acs_ch_range( sap_cfg->acs_cfg.start_ch_freq = wlan_reg_ch_to_freq(CHAN_ENUM_2412); sap_cfg->acs_cfg.end_ch_freq = - wlan_reg_ch_to_freq(CHAN_ENUM_2484); + wlan_reg_ch_to_freq(CHAN_ENUM_2472); } else if (hw_mode == QCA_ACS_MODE_IEEE80211G) { sap_cfg->acs_cfg.hw_mode = eCSR_DOT11_MODE_11g; sap_cfg->acs_cfg.start_ch_freq = @@ -4017,6 +4017,16 @@ __wlan_hdd_cfg80211_get_features(struct wiphy *wiphy, wlan_hdd_cfg80211_set_feature(feature_flags, QCA_WLAN_VENDOR_FEATURE_OCE_STA_CFON); + value = false; + status = ucfg_mlme_get_adaptive11r_enabled(hdd_ctx->psoc, &value); + if (QDF_IS_STATUS_ERROR(status)) + hdd_err("could not get FT-Adaptive 11R info"); + if (value) { + hdd_debug("FT-Adaptive 11R is Enabled"); + wlan_hdd_cfg80211_set_feature(feature_flags, + QCA_WLAN_VENDOR_FEATURE_ADAPTIVE_11R); + } + ucfg_mlme_get_twt_requestor(hdd_ctx->psoc, &twt_req); ucfg_mlme_get_twt_responder(hdd_ctx->psoc, &twt_res); diff --git a/drivers/staging/qcacld-3.0/core/hdd/src/wlan_hdd_debugfs_csr.c b/drivers/staging/qcacld-3.0/core/hdd/src/wlan_hdd_debugfs_csr.c old mode 100644 new mode 100755 index 720dd6f5f50c..b58792c7deb9 --- a/drivers/staging/qcacld-3.0/core/hdd/src/wlan_hdd_debugfs_csr.c +++ b/drivers/staging/qcacld-3.0/core/hdd/src/wlan_hdd_debugfs_csr.c @@ -335,8 +335,8 @@ void wlan_hdd_debugfs_csr_init(struct hdd_adapter *adapter) adapter->debugfs_phy, csr, &fops_csr_debugfs); if (!csr->entry) - hdd_err("Failed to create debugfs file: %s", - csr->name); + hdd_debug("Failed to create debugfs file: %s", + csr->name); // MOT IKSWQ-39460 abhkumar Error logs cleanup } csr = &adapter->csr_file[HDD_DEBUFS_FILE_ID_OFFLOAD_INFO]; @@ -348,7 +348,7 @@ void wlan_hdd_debugfs_csr_init(struct hdd_adapter *adapter) adapter->debugfs_phy, csr, &fops_csr_debugfs); if (!csr->entry) - hdd_err("Failed to create generic_info debugfs file"); + hdd_debug("Failed to create generic_info debugfs file"); // MOT IKSWQ-39460 abhkumar Error logs cleanup } csr = &adapter->csr_file[HDD_DEBUFS_FILE_ID_ROAM_SCAN_STATS_INFO]; @@ -360,7 +360,7 @@ void wlan_hdd_debugfs_csr_init(struct hdd_adapter *adapter) adapter->debugfs_phy, csr, &fops_csr_debugfs); if (!csr->entry) - hdd_err("Failed to create generic_info debugfs file"); + hdd_debug("Failed to create generic_info debugfs file"); // MOT IKSWQ-39460 abhkumar Error logs cleanup } } diff --git a/drivers/staging/qcacld-3.0/core/hdd/src/wlan_hdd_hostapd_wext.c b/drivers/staging/qcacld-3.0/core/hdd/src/wlan_hdd_hostapd_wext.c index 4a0518099490..a4ba2a0ee924 100644 --- a/drivers/staging/qcacld-3.0/core/hdd/src/wlan_hdd_hostapd_wext.c +++ b/drivers/staging/qcacld-3.0/core/hdd/src/wlan_hdd_hostapd_wext.c @@ -343,15 +343,43 @@ static __iw_softap_setparam(struct net_device *dev, { struct hdd_adapter *adapter = (netdev_priv(dev)); mac_handle_t mac_handle; - int *value = (int *)extra; - int sub_cmd = value[0]; - int set_value = value[1]; + //BEGIN MOT a19110 IKDREL3KK-11113 Fix iwpriv panic + int *value; + uint8_t *mot_value; //MOT a19110 IKLOCSEN-3014 Use copy from user + int sub_cmd; + int set_value; + int *tmp = (int *) extra; + //END IKDREL3KK-11113 QDF_STATUS status; int ret = 0; struct hdd_context *hdd_ctx; bool bval = false; hdd_enter_dev(dev); + //BEGIN MOT a19110 IKDREL3KK-11113 Fix iwpriv panic to 8998 + //BEGIN MOT a19110 IKLOCSEN-3014 use copy_from_user to avoid junk value + if (tmp[0] < 0 || tmp[0] > QCSAP_SET_BTCOEX_LOW_RSSI_THRESHOLD) { + mot_value = (uint8_t *)kmalloc(wrqu->data.length+1, GFP_KERNEL); + if(copy_from_user((uint8_t *) mot_value, (uint8_t *)(wrqu->data.pointer), wrqu->data.length)) { + hdd_err("%s -- copy_from_user --data pointer failed! bailing", + __func__); + kfree(mot_value); + return -EFAULT; + } + sub_cmd = (int )(*(mot_value + 0)); + set_value = (int )(*(mot_value + 1)); + kfree(mot_value); + } else { + value = (int *)extra; + sub_cmd = value[0]; + set_value = value[1]; + } + //END IKLOCSEN-3014 + if (!adapter || !adapter->hdd_ctx) { + hdd_err("Either hostpad adapter is null or Hal ctx is null"); + return -EINVAL; + } + //END IKDREL3KK-11113 hdd_ctx = WLAN_HDD_GET_CTX(adapter); ret = wlan_hdd_validate_context(hdd_ctx); @@ -1398,7 +1426,7 @@ int __iw_softap_modify_acl(struct net_device *dev, union iwreq_data *wrqu, char *extra) { struct hdd_adapter *adapter = (netdev_priv(dev)); - uint8_t *value = (uint8_t *) extra; + uint8_t *value = (uint8_t *) kmalloc(wrqu->data.length+1, GFP_KERNEL); //MOT IKLOCSEN-3014 uint8_t peer_mac[QDF_MAC_ADDR_SIZE]; int list_type, cmd, i; int ret; @@ -1409,8 +1437,18 @@ int __iw_softap_modify_acl(struct net_device *dev, hdd_ctx = WLAN_HDD_GET_CTX(adapter); ret = wlan_hdd_validate_context(hdd_ctx); - if (0 != ret) - return ret; + if (0 != ret) { + kfree(value); //MOT IKLOCSEN-3014 + return ret; + } + //BEGIN MOT a19110 IKLOCSEN-3014 use copy_from_user to avoid junk value + if(copy_from_user((uint8_t *) value, (uint8_t *)(wrqu->data.pointer), wrqu->data.length)) { + hdd_err("%s -- copy_from_user --data pointer failed! bailing", + __func__); + kfree(value); + return -EFAULT; + } + //END IKLOCSEN-3014 ret = hdd_check_private_wext_control(hdd_ctx, info); if (0 != ret) @@ -1423,6 +1461,7 @@ int __iw_softap_modify_acl(struct net_device *dev, i++; cmd = (int)(*(value + i)); + kfree(value);//MOT IKLOCSEN-3014 hdd_debug("Modify ACL mac:" QDF_MAC_ADDR_FMT " type: %d cmd: %d", QDF_MAC_ADDR_REF(peer_mac), list_type, cmd); @@ -1514,17 +1553,23 @@ static __iw_softap_set_max_tx_power(struct net_device *dev, { struct hdd_adapter *adapter = (netdev_priv(dev)); struct hdd_context *hdd_ctx; - int *value = (int *)extra; + uint8_t *mot_value; int set_value; int ret; struct qdf_mac_addr bssid = QDF_MAC_ADDR_BCAST_INIT; struct qdf_mac_addr selfMac = QDF_MAC_ADDR_BCAST_INIT; hdd_enter_dev(dev); - - if (!value) + mot_value = (uint8_t*)kmalloc(wrqu->data.length+1, GFP_KERNEL); + if (NULL == mot_value) return -ENOMEM; - + if(copy_from_user((uint8_t *)mot_value, (uint8_t *)(wrqu->data.pointer), wrqu->data.length)) { + hdd_err("%s -- copy from user -- data pointer failed! bailing", __func__); + kfree(mot_value); + return -EFAULT; + } + set_value = (int)(*(mot_value + 0)); + kfree(mot_value); hdd_ctx = WLAN_HDD_GET_CTX(adapter); ret = wlan_hdd_validate_context(hdd_ctx); if (0 != ret) @@ -1538,8 +1583,7 @@ static __iw_softap_set_max_tx_power(struct net_device *dev, qdf_copy_macaddr(&bssid, &adapter->mac_addr); qdf_copy_macaddr(&selfMac, &adapter->mac_addr); - set_value = value[0]; - if (QDF_STATUS_SUCCESS != + if (QDF_STATUS_SUCCESS != sme_set_max_tx_power(hdd_ctx->mac_handle, bssid, selfMac, set_value)) { hdd_err("Setting maximum tx power failed"); @@ -1794,7 +1838,7 @@ static __iw_softap_disassoc_sta(struct net_device *dev, { struct hdd_adapter *adapter = (netdev_priv(dev)); struct hdd_context *hdd_ctx; - uint8_t *peer_macaddr; + uint8_t *peer_macaddr = (uint8_t *)kmalloc(wrqu->data.length+1, GFP_KERNEL); //MOT IKLOCSEN-3014 int ret; struct csr_del_sta_params del_sta_params; @@ -1802,22 +1846,33 @@ static __iw_softap_disassoc_sta(struct net_device *dev, if (!capable(CAP_NET_ADMIN)) { hdd_err("permission check failed"); + kfree(peer_macaddr); //MOT IKLOCSEN-3014 return -EPERM; } hdd_ctx = WLAN_HDD_GET_CTX(adapter); ret = wlan_hdd_validate_context(hdd_ctx); - if (0 != ret) + if (0 != ret){ + kfree(peer_macaddr); //MOT IKLOCSEN-3014 return ret; - + } ret = hdd_check_private_wext_control(hdd_ctx, info); - if (0 != ret) + if (0 != ret){ + kfree(peer_macaddr); //MOT IKLOCSEN-3014 return ret; + } /* iwpriv tool or framework calls this ioctl with * data passed in extra (less than 16 octets); */ - peer_macaddr = (uint8_t *) (extra); + //BEGIN MOT a19110 IKLOCSEN-3014 use copy_from_user to avoid junk value + if(copy_from_user((uint8_t *) peer_macaddr, (uint8_t *)(wrqu->data.pointer), wrqu->data.length)) { + hdd_err("%s -- copy_from_user --data pointer failed! bailing", + __func__); + kfree(peer_macaddr); + return -EFAULT; + } + //END IKLOCSEN-3014 hdd_debug("data " QDF_MAC_ADDR_FMT, QDF_MAC_ADDR_REF(peer_macaddr)); @@ -1826,7 +1881,7 @@ static __iw_softap_disassoc_sta(struct net_device *dev, SIR_MAC_MGMT_DISASSOC, &del_sta_params); hdd_softap_sta_disassoc(adapter, &del_sta_params); - + kfree(peer_macaddr); //MOT IKLOCSEN-3014 hdd_exit(); return 0; } @@ -3057,6 +3112,13 @@ static const struct iw_priv_args hostapd_private_args[] = { } , #endif /* FW_THERMAL_THROTTLE_SUPPORT */ + /* for moto SAR feature */ + { + WE_SET_MIMO_TX_POWER, + IW_PRIV_TYPE_INT | MAX_VAR_ARGS, + 0, "setTxPowerM" + } + , /* handlers for main ioctl */ { QCSAP_IOCTL_MODIFY_ACL, diff --git a/drivers/staging/qcacld-3.0/core/hdd/src/wlan_hdd_main.c b/drivers/staging/qcacld-3.0/core/hdd/src/wlan_hdd_main.c index 627ea453d326..8f92384d1c1d 100644 --- a/drivers/staging/qcacld-3.0/core/hdd/src/wlan_hdd_main.c +++ b/drivers/staging/qcacld-3.0/core/hdd/src/wlan_hdd_main.c @@ -247,6 +247,17 @@ static int enable_11d = -1; static int enable_dfs_chan_scan = -1; static bool is_mode_change_psoc_idle_shutdown; +#define BUF_LEN_SAR 10 +static char sar_sta_buffer[BUF_LEN_SAR]; +static struct kparam_string sar_sta = { + .string = sar_sta_buffer, + .maxlen = BUF_LEN_SAR, +}; +static char sar_mhs_buffer[BUF_LEN_SAR]; +static struct kparam_string sar_mhs = { + .string = sar_mhs_buffer, + .maxlen = BUF_LEN_SAR, +}; #define WLAN_NLINK_CESIUM 30 static qdf_wake_lock_t wlan_wake_lock; @@ -1858,43 +1869,42 @@ static void hdd_update_tgt_vht_cap(struct hdd_context *hdd_ctx, hdd_err("unable to get vht_enable2x2"); if (vht_enable_2x2) { - if (cfg->vht_short_gi_80 & WMI_VHT_CAP_SGI_80MHZ) { - /* Update 2x2 Highest Short GI data rate */ + tx_highest_data_rate = + VHT_TX_HIGHEST_SUPPORTED_DATA_RATE_2_2; + rx_highest_data_rate = + VHT_RX_HIGHEST_SUPPORTED_DATA_RATE_2_2; + } else { + tx_highest_data_rate = + VHT_TX_HIGHEST_SUPPORTED_DATA_RATE_1_1; + rx_highest_data_rate = + VHT_RX_HIGHEST_SUPPORTED_DATA_RATE_1_1; + } + + status = ucfg_mlme_cfg_set_vht_rx_supp_data_rate(hdd_ctx->psoc, + rx_highest_data_rate); + if (!QDF_IS_STATUS_SUCCESS(status)) + hdd_err("Failed to set rx_supp_data_rate"); + + status = ucfg_mlme_cfg_set_vht_tx_supp_data_rate(hdd_ctx->psoc, + tx_highest_data_rate); + if (!QDF_IS_STATUS_SUCCESS(status)) + hdd_err("Failed to set tx_supp_data_rate"); + + /* Update the real highest data rate to wiphy */ + if (cfg->vht_short_gi_80 & WMI_VHT_CAP_SGI_80MHZ) { + if (vht_enable_2x2) { tx_highest_data_rate = VHT_TX_HIGHEST_SUPPORTED_DATA_RATE_2_2_SGI80; rx_highest_data_rate = VHT_RX_HIGHEST_SUPPORTED_DATA_RATE_2_2_SGI80; } else { - /* Update 2x2 Rx Highest Long GI data Rate */ tx_highest_data_rate = - VHT_TX_HIGHEST_SUPPORTED_DATA_RATE_2_2; - rx_highest_data_rate = - VHT_RX_HIGHEST_SUPPORTED_DATA_RATE_2_2; - } - } else if (cfg->vht_short_gi_80 & WMI_VHT_CAP_SGI_80MHZ) { - /* Update 1x1 Highest Short GI data rate */ - tx_highest_data_rate = VHT_TX_HIGHEST_SUPPORTED_DATA_RATE_1_1_SGI80; - rx_highest_data_rate = + rx_highest_data_rate = VHT_RX_HIGHEST_SUPPORTED_DATA_RATE_1_1_SGI80; - } else { - /* Update 1x1 Highest Long GI data rate */ - tx_highest_data_rate = VHT_TX_HIGHEST_SUPPORTED_DATA_RATE_1_1; - rx_highest_data_rate = VHT_RX_HIGHEST_SUPPORTED_DATA_RATE_1_1; + } } - status = ucfg_mlme_cfg_set_vht_rx_supp_data_rate( - hdd_ctx->psoc, - rx_highest_data_rate); - if (!QDF_IS_STATUS_SUCCESS(status)) - hdd_err("Failed to set rx_supp_data_rate"); - - status = ucfg_mlme_cfg_set_vht_tx_supp_data_rate( - hdd_ctx->psoc, - tx_highest_data_rate); - if (!QDF_IS_STATUS_SUCCESS(status)) - hdd_err("Failed to set tx_supp_data_rate"); - if (WMI_VHT_CAP_MAX_MPDU_LEN_11454 == cfg->vht_max_mpdu) band_5g->vht_cap.cap |= IEEE80211_VHT_CAP_MAX_MPDU_LENGTH_11454; else if (WMI_VHT_CAP_MAX_MPDU_LEN_7935 == cfg->vht_max_mpdu) @@ -11863,6 +11873,14 @@ struct hdd_context *hdd_context_create(struct device *dev) goto err_release_store; } + // BEGIN IKSWR-45692, support loading moto specific configurations + status = cfg_psoc_parse(hdd_ctx->psoc, WLAN_MOT_INI_FILE); + if (QDF_IS_STATUS_ERROR(status)) { + hdd_err("Failed to parse cfg %s, skip!", + WLAN_MOT_INI_FILE); + } + // END IKSWR-45692 + hdd_cfg_params_init(hdd_ctx); /* apply multiplier config, if not already set via module parameter */ @@ -12700,6 +12718,14 @@ static int hdd_initialize_mac_address(struct hdd_context *hdd_ctx) return 0; } +#ifdef MOTO_UTAGS_MAC + hdd_warn("Can't update mac config via wlan_mac.bin, using MAC from serial number"); + + status = hdd_update_mac_serial(hdd_ctx); + if (QDF_IS_STATUS_SUCCESS(status)) + return 0; +#endif + hdd_info("using default MAC address"); /* Use fw provided MAC */ @@ -16432,6 +16458,11 @@ exit: return errno; } +static int sar_changed_handler(const char *kmessage, + const struct kernel_param *kp) +{ + return param_set_copystring(kmessage, kp); +} static int hdd_set_con_mode(enum QDF_GLOBAL_MODE mode) { con_mode = mode; @@ -18130,6 +18161,11 @@ static const struct kernel_param_ops fwpath_ops = { .get = param_get_string, }; +static const struct kernel_param_ops sar_ops = { + .set = sar_changed_handler, + .get = param_get_string, +}; + module_param_cb(con_mode, &con_mode_ops, &con_mode, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); @@ -18143,6 +18179,11 @@ module_param_cb(con_mode_epping, &con_mode_epping_ops, module_param_cb(fwpath, &fwpath_ops, &fwpath, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); +module_param_cb(sar_sta, &sar_ops, &sar_sta, + S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); +module_param_cb(sar_mhs, &sar_ops, &sar_mhs, + S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); + module_param(enable_dfs_chan_scan, int, S_IRUSR | S_IRGRP | S_IROTH); diff --git a/drivers/staging/qcacld-3.0/core/hdd/src/wlan_hdd_power.c b/drivers/staging/qcacld-3.0/core/hdd/src/wlan_hdd_power.c index f27a1eee511c..8917555b5dd1 100644 --- a/drivers/staging/qcacld-3.0/core/hdd/src/wlan_hdd_power.c +++ b/drivers/staging/qcacld-3.0/core/hdd/src/wlan_hdd_power.c @@ -1632,6 +1632,9 @@ QDF_STATUS hdd_wlan_re_init(void) if (hdd_ctx->hdd_wlan_suspended) hdd_ctx->hdd_wlan_suspended = false; + if (hdd_ctx->is_wiphy_suspended) + hdd_ctx->is_wiphy_suspended = false; + return QDF_STATUS_SUCCESS; err_re_init: diff --git a/drivers/staging/qcacld-3.0/core/hdd/src/wlan_hdd_wext.c b/drivers/staging/qcacld-3.0/core/hdd/src/wlan_hdd_wext.c index 62b25d8a3556..c54427770038 100644 --- a/drivers/staging/qcacld-3.0/core/hdd/src/wlan_hdd_wext.c +++ b/drivers/staging/qcacld-3.0/core/hdd/src/wlan_hdd_wext.c @@ -980,6 +980,8 @@ */ #define WE_SET_CHANNEL 88 #define WE_SET_CONC_SYSTEM_PREF 89 +#define MAX_SUB_CMD 91 // Motorola, IKDREL3KK-10418 + /* * @@ -2579,6 +2581,9 @@ #define WE_SET_TXRX_STATS 24 +/* for moto SAR features, support tx pwr limit settings on mimo device */ +#define WE_SET_MIMO_TX_POWER 32 + #ifdef FEATURE_WLAN_TDLS #undef MAX_VAR_ARGS #define MAX_VAR_ARGS 11 @@ -6639,9 +6644,13 @@ static int __iw_set_three_ints_getnone(struct net_device *dev, union iwreq_data *wrqu, char *extra) { struct hdd_adapter *adapter = WLAN_HDD_GET_PRIV_PTR(dev); - int *value = (int *)extra; - int sub_cmd = value[0]; - int ret; + //BEGIN MOT a19110 IKSWL-15774 Ioctl from Mot code + int *value; + int sub_cmd, cmd_len; + int *tmp_value; + int *get_value = NULL; + int ret = 0; + //END IKSWL-15774 uint8_t dual_mac_feature = DISABLE_DBS_CXN_AND_SCAN; struct hdd_context *hdd_ctx = WLAN_HDD_GET_CTX(adapter); QDF_STATUS status; @@ -6656,6 +6665,29 @@ static int __iw_set_three_ints_getnone(struct net_device *dev, ret = wlan_hdd_validate_context(hdd_ctx); if (0 != ret) return ret; + //BEGIN MOT a19110 IKSWL-15774 Ioctl from Mot code + tmp_value = (int *)extra; + + // Copy from wrqu structure if it was a ioctl from Motorola code + if(tmp_value[0] < 0 || (tmp_value[0] >= MAX_SUB_CMD)) { + cmd_len = wrqu->data.length; + get_value = (int *) kmalloc(cmd_len+1, GFP_KERNEL); // Motorola, IKHSS7-39028 + + if(get_value == NULL) + return -ENOMEM; + + if(copy_from_user((char *) get_value, (char*)(wrqu->data.pointer), cmd_len)) { + hdd_alert("copy_from_user --data pointer failed! bailing"); + kfree(get_value); + return -EFAULT; + } + + value = (int *)get_value; + } else { + value = (int *)extra; + } + sub_cmd = value[0]; + //END IKSWL-15774 ret = hdd_check_private_wext_control(hdd_ctx, info); if (0 != ret) @@ -6700,6 +6732,11 @@ static int __iw_set_three_ints_getnone(struct net_device *dev, break; } + + //BEGIN MOT a19110 IKSWL-15774 Ioctl from Mot code + if(get_value != NULL) + kfree(get_value); + //END IKSWL-15774 hdd_exit(); return ret; } @@ -8160,6 +8197,81 @@ static int __iw_set_var_ints_getnone(struct net_device *dev, break; } #endif /* FW_THERMAL_THROTTLE_SUPPORT */ + + /* for moto SAR features, support tx pwr limit settings on mimo device */ + case WE_SET_MIMO_TX_POWER: + { + struct sar_limit_cmd_params *sar_limit_cmd; + mac_handle_t mac_handle = hdd_ctx->mac_handle; + int ret = -EINVAL; + uint32_t num_limit_rows = 4; + struct sar_limit_cmd_row *row; + + if (!mac_handle) + return -EINVAL; + + sar_limit_cmd = qdf_mem_malloc(sizeof(struct sar_limit_cmd_params)); + if (!sar_limit_cmd) + return -ENOMEM; + + sar_limit_cmd->commit_limits = 1; + sar_limit_cmd->sar_enable = WMI_SAR_FEATURE_ON_USER_DEFINED; + + row = qdf_mem_malloc(sizeof(*row) * num_limit_rows); + if (!row) { + qdf_mem_free(sar_limit_cmd); + hdd_err("Failed to allocate memory for sar_limit_row_list"); + return -EINVAL; + } + + //Below band/chain/limit_value number will get from Modem + //either CCK or OFDM, set the validity_bitmap as WMI_SAR_BAND_ID_VALID_MASK |WMI_SAR_CHAIN_ID_VALID_MASK + row[0].band_id = WMI_SAR_2G_ID; //WMI_SAR_2G_ID - 0; WMI_SAR_5G_ID - 1 + row[0].chain_id = 0; + row[0].mod_id = WMI_SAR_MOD_OFDM; + row[0].limit_value = apps_args[0]; + row[0].validity_bitmap = WMI_SAR_BAND_ID_VALID_MASK |WMI_SAR_CHAIN_ID_VALID_MASK; + + row[1].band_id = WMI_SAR_2G_ID; //WMI_SAR_2G_ID - 0; WMI_SAR_5G_ID - 1 + row[1].chain_id = 1; + row[1].mod_id = WMI_SAR_MOD_OFDM; + row[1].limit_value = apps_args[1]; + row[1].validity_bitmap = WMI_SAR_BAND_ID_VALID_MASK |WMI_SAR_CHAIN_ID_VALID_MASK; + + row[2].band_id = WMI_SAR_5G_ID; //WMI_SAR_2G_ID - 0; WMI_SAR_5G_ID - 1 + row[2].chain_id = 0; + row[2].mod_id = WMI_SAR_MOD_OFDM; + row[2].limit_value = apps_args[2]; + row[2].validity_bitmap = WMI_SAR_BAND_ID_VALID_MASK |WMI_SAR_CHAIN_ID_VALID_MASK |WMI_SAR_MOD_ID_VALID_MASK; + + row[3].band_id = WMI_SAR_5G_ID; //WMI_SAR_2G_ID - 0; WMI_SAR_5G_ID - 1 + row[3].chain_id = 1; + row[3].mod_id = WMI_SAR_MOD_OFDM; + row[3].limit_value = apps_args[3]; + row[3].validity_bitmap = WMI_SAR_BAND_ID_VALID_MASK |WMI_SAR_CHAIN_ID_VALID_MASK |WMI_SAR_MOD_ID_VALID_MASK; + + sar_limit_cmd->num_limit_rows = num_limit_rows; + sar_limit_cmd->sar_limit_row_list = row; + hdd_info("change pwr limit to [%d, %d, %d, %d].", + row[0].limit_value, row[1].limit_value, row[2].limit_value, row[3].limit_value); + if (sme_set_sar_power_limits(mac_handle,sar_limit_cmd) + != QDF_STATUS_SUCCESS) { + hdd_err("Setting maximum tx power failed"); + if(sar_limit_cmd) { + qdf_mem_free(sar_limit_cmd->sar_limit_row_list); + qdf_mem_free(sar_limit_cmd); + } + ret = -EIO; + break; + } + else{ + /* save settings in hdd_ctx, so can restore configs after SSR */ + hdd_store_sar_config(hdd_ctx, sar_limit_cmd); + hdd_info("Setting maximum tx power successful"); + } + } + break; + default: { hdd_err("Invalid IOCTL command %d", sub_cmd); @@ -10835,6 +10947,11 @@ static const struct iw_priv_args we_private_args[] = { 0, "ch_avoid"}, #endif + /* for moto SAR features, support tx pwr limit settings on mimo device */ + {WE_SET_MIMO_TX_POWER, + IW_PRIV_TYPE_INT | MAX_VAR_ARGS, + 0, + "setTxPowerM"}, /* handlers for main ioctl */ {WLAN_PRIV_FIPS_TEST, IW_PRIV_TYPE_BYTE | WE_MAX_STR_LEN, diff --git a/drivers/staging/qcacld-3.0/core/sap/src/sap_module.c b/drivers/staging/qcacld-3.0/core/sap/src/sap_module.c index 90973e7c8857..78be79ef4b25 100644 --- a/drivers/staging/qcacld-3.0/core/sap/src/sap_module.c +++ b/drivers/staging/qcacld-3.0/core/sap/src/sap_module.c @@ -797,6 +797,9 @@ QDF_STATUS wlansap_start_bss(struct sap_context *sap_ctx, pmac->sap.SapDfsInfo.sap_ch_switch_mode, pmac->sap.SapDfsInfo.reduced_beacon_interval); + //BEGIN MOT a19110 IKSWO-8490 Comment out initialisation of + //acl list. We use driver ioctl to set it +#if 0 /* Copy MAC filtering settings to sap context */ sap_ctx->eSapMacAddrAclMode = config->SapMacaddr_acl; qdf_mem_copy(sap_ctx->acceptMacList, config->accept_mac, @@ -807,7 +810,10 @@ QDF_STATUS wlansap_start_bss(struct sap_context *sap_ctx, sizeof(config->deny_mac)); sap_ctx->nDenyMac = config->num_deny_mac; sap_sort_mac_list(sap_ctx->denyMacList, sap_ctx->nDenyMac); - sap_ctx->beacon_tx_rate = config->beacon_tx_rate; +#endif + //END IKSWO-8490 + sap_ctx->beacon_tx_rate = config->beacon_tx_rate; + /* Fill in the event structure for FSM */ sap_event.event = eSAP_HDD_START_INFRA_BSS; @@ -2231,11 +2237,11 @@ void wlansap_extend_to_acs_range(mac_handle_t mac_handle, } if (*end_ch_freq <= wlan_reg_ch_to_freq(CHAN_ENUM_2484)) { - *bandEndChannel = CHAN_ENUM_2484; + *bandEndChannel = CHAN_ENUM_2472; tmp_end_ch_freq = (*end_ch_freq + ACS_2G_EXTEND) <= - wlan_reg_ch_to_freq(CHAN_ENUM_2484) ? + wlan_reg_ch_to_freq(CHAN_ENUM_2472) ? (*end_ch_freq + ACS_2G_EXTEND) : - wlan_reg_ch_to_freq(CHAN_ENUM_2484); + wlan_reg_ch_to_freq(CHAN_ENUM_2472); } else if (*end_ch_freq <= wlan_reg_ch_to_freq(CHAN_ENUM_5865)) { *bandEndChannel = CHAN_ENUM_5865; tmp_end_ch_freq = (*end_ch_freq + ACS_5G_EXTEND) <=