diff --git a/Kbuild b/Kbuild index cf509b13a6..694715a7f2 100644 --- a/Kbuild +++ b/Kbuild @@ -349,6 +349,10 @@ HDD_OBJS := $(HDD_SRC_DIR)/wlan_hdd_assoc.o \ $(HDD_SRC_DIR)/wlan_hdd_wowl.o +ifeq ($(CONFIG_WLAN_FEATURE_LPSS),y) +HDD_OBJS += $(HDD_SRC_DIR)/wlan_hdd_lpass.o +endif + ifeq ($(CONFIG_WLAN_LRO), y) HDD_OBJS += $(HDD_SRC_DIR)/wlan_hdd_lro.o endif diff --git a/core/hdd/inc/wlan_hdd_main.h b/core/hdd/inc/wlan_hdd_main.h index c4df74ab4d..0bbc37a7fb 100644 --- a/core/hdd/inc/wlan_hdd_main.h +++ b/core/hdd/inc/wlan_hdd_main.h @@ -1527,32 +1527,6 @@ int hdd_wlan_set_ht2040_mode(hdd_adapter_t *pAdapter, uint16_t staId, struct qdf_mac_addr macAddrSTA, int width); #endif -#ifdef WLAN_FEATURE_LPSS -void wlan_hdd_send_status_pkg(hdd_adapter_t *pAdapter, - hdd_station_ctx_t *pHddStaCtx, - uint8_t is_on, uint8_t is_connected); -void wlan_hdd_send_version_pkg(uint32_t fw_version, - uint32_t chip_id, const char *chip_name); -void wlan_hdd_send_all_scan_intf_info(hdd_context_t *pHddCtx); -#else -static inline void wlan_hdd_send_status_pkg(hdd_adapter_t *pAdapter, - hdd_station_ctx_t *pHddStaCtx, - uint8_t is_on, uint8_t is_connected) -{ - return; -} - -static inline void wlan_hdd_send_version_pkg(uint32_t fw_version, uint32_t - chip_id, const char *chip_name) -{ - return; -} - -static inline void wlan_hdd_send_all_scan_intf_info(hdd_context_t *pHddCtx) -{ - return; -} -#endif void wlan_hdd_send_svc_nlink_msg(int type, void *data, int len); #ifdef FEATURE_WLAN_AUTO_SHUTDOWN void wlan_hdd_auto_shutdown_enable(hdd_context_t *hdd_ctx, bool enable); diff --git a/core/hdd/src/wlan_hdd_assoc.c b/core/hdd/src/wlan_hdd_assoc.c index f0bd3a3f6c..94a347d3eb 100644 --- a/core/hdd/src/wlan_hdd_assoc.c +++ b/core/hdd/src/wlan_hdd_assoc.c @@ -50,6 +50,7 @@ #include "sme_api.h" #include "wlan_hdd_hostapd.h" #include +#include "wlan_hdd_lpass.h" #include #include "cds_concurrency.h" #include "sme_power_save_api.h" diff --git a/core/hdd/src/wlan_hdd_cfg80211.c b/core/hdd/src/wlan_hdd_cfg80211.c index 00a3520916..74a13be47c 100644 --- a/core/hdd/src/wlan_hdd_cfg80211.c +++ b/core/hdd/src/wlan_hdd_cfg80211.c @@ -88,7 +88,7 @@ #include "wlan_hdd_subnet_detect.h" #include - +#include "wlan_hdd_lpass.h" #define g_mode_rates_size (12) #define a_mode_rates_size (8) @@ -7056,9 +7056,7 @@ done: /* Set bitmask based on updated value */ cds_set_concurrency_mode(pAdapter->device_mode); -#ifdef WLAN_FEATURE_LPSS wlan_hdd_send_all_scan_intf_info(pHddCtx); -#endif EXIT(); return 0; diff --git a/core/hdd/src/wlan_hdd_lpass.c b/core/hdd/src/wlan_hdd_lpass.c new file mode 100644 index 0000000000..600882b57d --- /dev/null +++ b/core/hdd/src/wlan_hdd_lpass.c @@ -0,0 +1,191 @@ +/* + * 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. + */ + +/** + * DOC: wlan_hdd_lpass.c + * + * WLAN Host Device Driver LPASS feature implementation + * + */ + +/* Include Files */ +#include "wlan_hdd_main.h" +#include "wlan_hdd_lpass.h" +#include +#include "qwlan_version.h" + +static int wlan_hdd_gen_wlan_status_pack(struct wlan_status_data *data, + hdd_adapter_t *adapter, + hdd_station_ctx_t *pHddStaCtx, + uint8_t is_on, uint8_t is_connected) +{ + hdd_context_t *hdd_ctx = NULL; + uint8_t buflen = WLAN_SVC_COUNTRY_CODE_LEN; + + if (!data) { + hddLog(LOGE, FL("invalid data pointer")); + return -EINVAL; + } + if (!adapter) { + if (is_on) { + /* no active interface */ + data->lpss_support = 0; + data->is_on = is_on; + return 0; + } + hddLog(LOGE, FL("invalid adapter pointer")); + return -EINVAL; + } + + hdd_ctx = WLAN_HDD_GET_CTX(adapter); + if (hdd_ctx->lpss_support && hdd_ctx->config->enable_lpass_support) + data->lpss_support = 1; + else + data->lpss_support = 0; + data->numChannels = WLAN_SVC_MAX_NUM_CHAN; + sme_get_cfg_valid_channels(hdd_ctx->hHal, data->channel_list, + &data->numChannels); + sme_get_country_code(hdd_ctx->hHal, data->country_code, &buflen); + data->is_on = is_on; + data->vdev_id = adapter->sessionId; + data->vdev_mode = adapter->device_mode; + if (pHddStaCtx) { + data->is_connected = is_connected; + data->rssi = adapter->rssi; + data->freq = + cds_chan_to_freq(pHddStaCtx->conn_info.operationChannel); + if (WLAN_SVC_MAX_SSID_LEN >= + pHddStaCtx->conn_info.SSID.SSID.length) { + data->ssid_len = pHddStaCtx->conn_info.SSID.SSID.length; + memcpy(data->ssid, + pHddStaCtx->conn_info.SSID.SSID.ssId, + pHddStaCtx->conn_info.SSID.SSID.length); + } + if (QDF_MAC_ADDR_SIZE >= + sizeof(pHddStaCtx->conn_info.bssId)) + memcpy(data->bssid, pHddStaCtx->conn_info.bssId.bytes, + QDF_MAC_ADDR_SIZE); + } + return 0; +} + +static int wlan_hdd_gen_wlan_version_pack(struct wlan_version_data *data, + uint32_t fw_version, + uint32_t chip_id, + const char *chip_name) +{ + if (!data) { + hddLog(LOGE, FL("invalid data pointer")); + return -EINVAL; + } + + data->chip_id = chip_id; + strlcpy(data->chip_name, chip_name, WLAN_SVC_MAX_STR_LEN); + if (strncmp(chip_name, "Unknown", 7)) + strlcpy(data->chip_from, "Qualcomm", WLAN_SVC_MAX_STR_LEN); + else + strlcpy(data->chip_from, "Unknown", WLAN_SVC_MAX_STR_LEN); + strlcpy(data->host_version, QWLAN_VERSIONSTR, WLAN_SVC_MAX_STR_LEN); + scnprintf(data->fw_version, WLAN_SVC_MAX_STR_LEN, "%d.%d.%d.%d", + (fw_version & 0xf0000000) >> 28, + (fw_version & 0xf000000) >> 24, + (fw_version & 0xf00000) >> 20, (fw_version & 0x7fff)); + return 0; +} + +void wlan_hdd_send_status_pkg(hdd_adapter_t *adapter, + hdd_station_ctx_t *pHddStaCtx, + uint8_t is_on, uint8_t is_connected) +{ + int ret = 0; + struct wlan_status_data data; + + if (QDF_GLOBAL_FTM_MODE == hdd_get_conparam()) + return; + + memset(&data, 0, sizeof(struct wlan_status_data)); + if (is_on) + ret = wlan_hdd_gen_wlan_status_pack(&data, adapter, pHddStaCtx, + is_on, is_connected); + if (!ret) + wlan_hdd_send_svc_nlink_msg(WLAN_SVC_WLAN_STATUS_IND, + &data, + sizeof(struct wlan_status_data)); +} + +void wlan_hdd_send_version_pkg(uint32_t fw_version, + uint32_t chip_id, const char *chip_name) +{ + int ret = 0; + struct wlan_version_data data; + + if (QDF_GLOBAL_FTM_MODE == hdd_get_conparam()) + return; + + memset(&data, 0, sizeof(struct wlan_version_data)); + ret = + wlan_hdd_gen_wlan_version_pack(&data, fw_version, chip_id, + chip_name); + if (!ret) + wlan_hdd_send_svc_nlink_msg(WLAN_SVC_WLAN_VERSION_IND, + &data, + sizeof(struct wlan_version_data)); +} + +void wlan_hdd_send_all_scan_intf_info(hdd_context_t *hdd_ctx) +{ + hdd_adapter_t *pDataAdapter = NULL; + hdd_adapter_list_node_t *adapterNode = NULL, *pNext = NULL; + bool scan_intf_found = false; + QDF_STATUS status; + + if (!hdd_ctx) { + hddLog(QDF_TRACE_LEVEL_ERROR, + FL("NULL pointer for hdd_ctx")); + return; + } + + status = hdd_get_front_adapter(hdd_ctx, &adapterNode); + while (NULL != adapterNode && QDF_STATUS_SUCCESS == status) { + pDataAdapter = adapterNode->pAdapter; + if (pDataAdapter) { + if (pDataAdapter->device_mode == QDF_STA_MODE + || pDataAdapter->device_mode == QDF_P2P_CLIENT_MODE + || pDataAdapter->device_mode == + QDF_P2P_DEVICE_MODE) { + scan_intf_found = true; + wlan_hdd_send_status_pkg(pDataAdapter, NULL, 1, + 0); + } + } + status = hdd_get_next_adapter(hdd_ctx, adapterNode, &pNext); + adapterNode = pNext; + } + + if (!scan_intf_found) + wlan_hdd_send_status_pkg(pDataAdapter, NULL, 1, 0); +} diff --git a/core/hdd/src/wlan_hdd_lpass.h b/core/hdd/src/wlan_hdd_lpass.h new file mode 100644 index 0000000000..23771b9e53 --- /dev/null +++ b/core/hdd/src/wlan_hdd_lpass.h @@ -0,0 +1,58 @@ +/* + * 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. + */ + +#if !defined(WLAN_HDD_LPASS_H) +#define WLAN_HDD_LPASS_H + +#ifdef WLAN_FEATURE_LPSS +void wlan_hdd_send_status_pkg(hdd_adapter_t *pAdapter, + hdd_station_ctx_t *pHddStaCtx, + uint8_t is_on, uint8_t is_connected); +void wlan_hdd_send_version_pkg(uint32_t fw_version, + uint32_t chip_id, const char *chip_name); +void wlan_hdd_send_all_scan_intf_info(hdd_context_t *pHddCtx); +#else +static inline void wlan_hdd_send_status_pkg(hdd_adapter_t *pAdapter, + hdd_station_ctx_t *pHddStaCtx, + uint8_t is_on, uint8_t is_connected) +{ + return; +} + +static inline void wlan_hdd_send_version_pkg(uint32_t fw_version, uint32_t + chip_id, const char *chip_name) +{ + return; +} + +static inline void wlan_hdd_send_all_scan_intf_info(hdd_context_t *pHddCtx) +{ + return; +} +#endif + +#endif /* WLAN_HDD_LPASS_H */ diff --git a/core/hdd/src/wlan_hdd_main.c b/core/hdd/src/wlan_hdd_main.c index 59031a3963..2873998522 100644 --- a/core/hdd/src/wlan_hdd_main.c +++ b/core/hdd/src/wlan_hdd_main.c @@ -103,6 +103,7 @@ #include "bmi.h" #include #include "ol_rx_fwd.h" +#include "wlan_hdd_lpass.h" #ifdef MODULE #define WLAN_MODULE_NAME module_name(THIS_MODULE) @@ -6847,86 +6848,6 @@ QDF_STATUS hdd_issta_p2p_clientconnected(hdd_context_t *hdd_ctx) return sme_is_sta_p2p_client_connected(hdd_ctx->hHal); } -#ifdef WLAN_FEATURE_LPSS -int wlan_hdd_gen_wlan_status_pack(struct wlan_status_data *data, - hdd_adapter_t *adapter, - hdd_station_ctx_t *pHddStaCtx, - uint8_t is_on, uint8_t is_connected) -{ - hdd_context_t *hdd_ctx = NULL; - uint8_t buflen = WLAN_SVC_COUNTRY_CODE_LEN; - - if (!data) { - hddLog(LOGE, FL("invalid data pointer")); - return -EINVAL; - } - if (!adapter) { - if (is_on) { - /* no active interface */ - data->lpss_support = 0; - data->is_on = is_on; - return 0; - } - hddLog(LOGE, FL("invalid adapter pointer")); - return -EINVAL; - } - - hdd_ctx = WLAN_HDD_GET_CTX(adapter); - if (hdd_ctx->lpss_support && hdd_ctx->config->enable_lpass_support) - data->lpss_support = 1; - else - data->lpss_support = 0; - data->numChannels = WLAN_SVC_MAX_NUM_CHAN; - sme_get_cfg_valid_channels(hdd_ctx->hHal, data->channel_list, - &data->numChannels); - sme_get_country_code(hdd_ctx->hHal, data->country_code, &buflen); - data->is_on = is_on; - data->vdev_id = adapter->sessionId; - data->vdev_mode = adapter->device_mode; - if (pHddStaCtx) { - data->is_connected = is_connected; - data->rssi = adapter->rssi; - data->freq = - cds_chan_to_freq(pHddStaCtx->conn_info.operationChannel); - if (WLAN_SVC_MAX_SSID_LEN >= - pHddStaCtx->conn_info.SSID.SSID.length) { - data->ssid_len = pHddStaCtx->conn_info.SSID.SSID.length; - memcpy(data->ssid, - pHddStaCtx->conn_info.SSID.SSID.ssId, - pHddStaCtx->conn_info.SSID.SSID.length); - } - if (QDF_MAC_ADDR_SIZE >= - sizeof(pHddStaCtx->conn_info.bssId)) - memcpy(data->bssid, pHddStaCtx->conn_info.bssId.bytes, - QDF_MAC_ADDR_SIZE); - } - return 0; -} - -int wlan_hdd_gen_wlan_version_pack(struct wlan_version_data *data, - uint32_t fw_version, - uint32_t chip_id, const char *chip_name) -{ - if (!data) { - hddLog(LOGE, FL("invalid data pointer")); - return -EINVAL; - } - - data->chip_id = chip_id; - strlcpy(data->chip_name, chip_name, WLAN_SVC_MAX_STR_LEN); - if (strncmp(chip_name, "Unknown", 7)) - strlcpy(data->chip_from, "Qualcomm", WLAN_SVC_MAX_STR_LEN); - else - strlcpy(data->chip_from, "Unknown", WLAN_SVC_MAX_STR_LEN); - strlcpy(data->host_version, QWLAN_VERSIONSTR, WLAN_SVC_MAX_STR_LEN); - scnprintf(data->fw_version, WLAN_SVC_MAX_STR_LEN, "%d.%d.%d.%d", - (fw_version & 0xf0000000) >> 28, - (fw_version & 0xf000000) >> 24, - (fw_version & 0xf00000) >> 20, (fw_version & 0x7fff)); - return 0; -} -#endif - /** * wlan_hdd_disable_roaming() - disable roaming on all STAs except the input one * @adapter: HDD adapter pointer @@ -7097,81 +7018,6 @@ void wlan_hdd_send_svc_nlink_msg(int type, void *data, int len) return; } -#ifdef WLAN_FEATURE_LPSS -void wlan_hdd_send_status_pkg(hdd_adapter_t *adapter, - hdd_station_ctx_t *pHddStaCtx, - uint8_t is_on, uint8_t is_connected) -{ - int ret = 0; - struct wlan_status_data data; - - if (QDF_GLOBAL_FTM_MODE == hdd_get_conparam()) - return; - - memset(&data, 0, sizeof(struct wlan_status_data)); - if (is_on) - ret = wlan_hdd_gen_wlan_status_pack(&data, adapter, pHddStaCtx, - is_on, is_connected); - if (!ret) - wlan_hdd_send_svc_nlink_msg(WLAN_SVC_WLAN_STATUS_IND, - &data, - sizeof(struct wlan_status_data)); -} - -void wlan_hdd_send_version_pkg(uint32_t fw_version, - uint32_t chip_id, const char *chip_name) -{ - int ret = 0; - struct wlan_version_data data; - - if (QDF_GLOBAL_FTM_MODE == hdd_get_conparam()) - return; - - memset(&data, 0, sizeof(struct wlan_version_data)); - ret = - wlan_hdd_gen_wlan_version_pack(&data, fw_version, chip_id, - chip_name); - if (!ret) - wlan_hdd_send_svc_nlink_msg(WLAN_SVC_WLAN_VERSION_IND, - &data, - sizeof(struct wlan_version_data)); -} - -void wlan_hdd_send_all_scan_intf_info(hdd_context_t *hdd_ctx) -{ - hdd_adapter_t *pDataAdapter = NULL; - hdd_adapter_list_node_t *adapterNode = NULL, *pNext = NULL; - bool scan_intf_found = false; - QDF_STATUS status; - - if (!hdd_ctx) { - hddLog(QDF_TRACE_LEVEL_ERROR, - FL("NULL pointer for hdd_ctx")); - return; - } - - status = hdd_get_front_adapter(hdd_ctx, &adapterNode); - while (NULL != adapterNode && QDF_STATUS_SUCCESS == status) { - pDataAdapter = adapterNode->pAdapter; - if (pDataAdapter) { - if (pDataAdapter->device_mode == QDF_STA_MODE - || pDataAdapter->device_mode == QDF_P2P_CLIENT_MODE - || pDataAdapter->device_mode == - QDF_P2P_DEVICE_MODE) { - scan_intf_found = true; - wlan_hdd_send_status_pkg(pDataAdapter, NULL, 1, - 0); - } - } - status = hdd_get_next_adapter(hdd_ctx, adapterNode, &pNext); - adapterNode = pNext; - } - - if (!scan_intf_found) - wlan_hdd_send_status_pkg(pDataAdapter, NULL, 1, 0); -} -#endif - #ifdef FEATURE_WLAN_AUTO_SHUTDOWN void wlan_hdd_auto_shutdown_cb(void) { diff --git a/core/hdd/src/wlan_hdd_power.c b/core/hdd/src/wlan_hdd_power.c index dc7c45dd9e..faa99c1688 100644 --- a/core/hdd/src/wlan_hdd_power.c +++ b/core/hdd/src/wlan_hdd_power.c @@ -65,6 +65,7 @@ #include #include #include +#include #include #include "hif.h" @@ -1326,9 +1327,7 @@ QDF_STATUS hdd_wlan_shutdown(void) hddLog(QDF_TRACE_LEVEL_FATAL, "%s: WLAN driver shutting down!", __func__); -#ifdef WLAN_FEATURE_LPSS wlan_hdd_send_status_pkg(NULL, NULL, 0, 0); -#endif /* If SSR never completes, then do kernel panic. */ hdd_ssr_timer_init(); @@ -1660,12 +1659,10 @@ QDF_STATUS hdd_wlan_re_init(void *hif_sc) sme_set_rssi_threshold_breached_cb(pHddCtx->hHal, hdd_rssi_threshold_breached); -#ifdef WLAN_FEATURE_LPSS wlan_hdd_send_all_scan_intf_info(pHddCtx); wlan_hdd_send_version_pkg(pHddCtx->target_fw_version, pHddCtx->target_hw_version, pHddCtx->target_hw_name); -#endif qdf_status = wlansap_global_init(); if (QDF_IS_STATUS_ERROR(qdf_status)) goto err_cds_disable; diff --git a/core/hdd/src/wlan_hdd_stats.c b/core/hdd/src/wlan_hdd_stats.c index 89c0791bc6..24677fd599 100644 --- a/core/hdd/src/wlan_hdd_stats.c +++ b/core/hdd/src/wlan_hdd_stats.c @@ -30,6 +30,7 @@ #include "sme_api.h" #include "cds_sched.h" #include "wlan_hdd_trace.h" +#include "wlan_hdd_lpass.h" #ifdef WLAN_FEATURE_LINK_LAYER_STATS