diff options
| -rw-r--r-- | CORE/HDD/inc/wlan_hdd_cfg.h | 20 | ||||
| -rw-r--r-- | CORE/HDD/inc/wlan_hdd_main.h | 26 | ||||
| -rw-r--r-- | CORE/HDD/inc/wlan_hdd_tsf.h | 7 | ||||
| -rw-r--r-- | CORE/HDD/src/wlan_hdd_cfg.c | 7 | ||||
| -rw-r--r-- | CORE/HDD/src/wlan_hdd_main.c | 2 | ||||
| -rw-r--r-- | CORE/HDD/src/wlan_hdd_tsf.c | 278 | ||||
| -rw-r--r-- | CORE/MAC/inc/sirApi.h | 6 | ||||
| -rw-r--r-- | CORE/SERVICES/HIF/PCIe/if_pci.c | 9 | ||||
| -rw-r--r-- | CORE/SERVICES/HIF/PCIe/if_pci.h | 12 | ||||
| -rw-r--r-- | CORE/SERVICES/HIF/USB/if_usb.c | 7 | ||||
| -rw-r--r-- | CORE/SERVICES/HIF/USB/if_usb.h | 12 | ||||
| -rw-r--r-- | CORE/SERVICES/HIF/sdio/linux/if_ath_sdio.c | 9 | ||||
| -rw-r--r-- | CORE/SERVICES/HIF/sdio/linux/if_ath_sdio.h | 12 | ||||
| -rw-r--r-- | CORE/SERVICES/WMA/wma.c | 4 |
14 files changed, 368 insertions, 43 deletions
diff --git a/CORE/HDD/inc/wlan_hdd_cfg.h b/CORE/HDD/inc/wlan_hdd_cfg.h index 9abdef519f3f..bf4f9273fc62 100644 --- a/CORE/HDD/inc/wlan_hdd_cfg.h +++ b/CORE/HDD/inc/wlan_hdd_cfg.h @@ -4202,6 +4202,25 @@ FG_BTC_BT_INTERVAL_PAGE_P2P_STA_DEFAULT #define CFG_SET_TSF_GPIO_PIN_HOST_MAX (254) #define CFG_SET_TSF_GPIO_PIN_HOST_DEFAULT (45) +/* + * <ini> + * gtsf_by_register - get tsf by register + * @Min: 0 + * @Max: 1 + * @Default: 0 + * + * This ini is used to get tsf by register + * + * Usage: External + * + * </ini> + */ + +#define CFG_GET_TSF_BY_REGISTER_NAME "gtsf_by_register" +#define CFG_GET_TSF_BY_REGISTER_MIN (0) +#define CFG_GET_TSF_BY_REGISTER_MAX (1) +#define CFG_GET_TSF_BY_REGISTER_DEFAULT (0) + #ifdef WLAN_FEATURE_TSF_PLUS /* PTP options */ #define CFG_SET_TSF_PTP_OPT_NAME "gtsf_ptp_options" @@ -6312,6 +6331,7 @@ struct hdd_config { #ifdef WLAN_FEATURE_TSF uint32_t tsf_gpio_pin; uint32_t tsf_gpio_pin_host; + uint8_t tsf_by_register; #ifdef WLAN_FEATURE_TSF_PLUS uint8_t tsf_ptp_options; #endif /* WLAN_FEATURE_TSF_PLUS */ diff --git a/CORE/HDD/inc/wlan_hdd_main.h b/CORE/HDD/inc/wlan_hdd_main.h index d60734a149af..5f40b688310e 100644 --- a/CORE/HDD/inc/wlan_hdd_main.h +++ b/CORE/HDD/inc/wlan_hdd_main.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012-2018 The Linux Foundation. All rights reserved. + * Copyright (c) 2012-2019 The Linux Foundation. All rights reserved. * * Previously licensed under the ISC license by Qualcomm Atheros, Inc. * @@ -1177,6 +1177,19 @@ struct hdd_netif_queue_history { uint32_t pause_map; }; +/** + * enum HDD_TSF_ID - TSF ID + * HDD_TSF1 - TSF 1 + * HDD_TSF2 - TSF 2 + * HDD_TSF_NUM_MAX - max tsf num + * HDD_TSF_INVALID - invalid tsf id + */ +typedef enum { + HDD_TSF1, + HDD_TSF2, + HDD_TSF_NUM_MAX, + HDD_TSF_INVALID, +}HDD_TSF_ID; struct hdd_adapter_s { @@ -1334,16 +1347,20 @@ struct hdd_adapter_s }sessionCtx; #ifdef WLAN_FEATURE_TSF +#define MAX_INVALD_TIME_NUM 4 /* tsf value get from firmware */ uint64_t cur_target_time; + uint64_t cur_host_time; + uint64_t last_host_time; + uint64_t last_target_time; vos_timer_t host_capture_req_timer; + uint64_t invalid_target_time[MAX_INVALD_TIME_NUM]; + uint64_t invalid_host_time[MAX_INVALD_TIME_NUM]; + uint8_t invalid_time_num; #ifdef WLAN_FEATURE_TSF_PLUS /* spin lock for read/write timestamps */ adf_os_spinlock_t host_target_sync_lock; vos_timer_t host_target_sync_timer; - uint64_t cur_host_time; - uint64_t last_host_time; - uint64_t last_target_time; /* to store the count of continuous invalid tstamp-pair */ int continuous_error_count; /* to indicate whether tsf_sync has been initialized */ @@ -1443,6 +1460,7 @@ struct hdd_adapter_s adf_os_time_t total_unpause_time; uint8_t history_index; + HDD_TSF_ID tsf_id; struct hdd_netif_queue_history queue_oper_history[WLAN_HDD_MAX_HISTORY_ENTRY]; struct hdd_netif_queue_stats queue_oper_stats[WLAN_REASON_TYPE_MAX]; diff --git a/CORE/HDD/inc/wlan_hdd_tsf.h b/CORE/HDD/inc/wlan_hdd_tsf.h index a1a329b87fc4..2ea0a8c2a360 100644 --- a/CORE/HDD/inc/wlan_hdd_tsf.h +++ b/CORE/HDD/inc/wlan_hdd_tsf.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015,2018 The Linux Foundation. All rights reserved. + * Copyright (c) 2015,2018-2019 The Linux Foundation. All rights reserved. * * Previously licensed under the ISC license by Qualcomm Atheros, Inc. * @@ -44,6 +44,11 @@ #ifdef WLAN_FEATURE_TSF +#define REG_TSF1_L 0x1054 +#define REG_TSF1_H 0x1058 +#define REG_TSF2_L 0x10d4 +#define REG_TSF2_H 0x10d8 + /** * wlan_hdd_tsf_init() - set gpio and callbacks for * capturing tsf and init tsf_plus diff --git a/CORE/HDD/src/wlan_hdd_cfg.c b/CORE/HDD/src/wlan_hdd_cfg.c index f7ffdb69533d..7c00814f86c3 100644 --- a/CORE/HDD/src/wlan_hdd_cfg.c +++ b/CORE/HDD/src/wlan_hdd_cfg.c @@ -4587,6 +4587,13 @@ REG_TABLE_ENTRY g_registry_table[] = CFG_SET_TSF_GPIO_PIN_HOST_MIN, CFG_SET_TSF_GPIO_PIN_HOST_MAX), + REG_VARIABLE(CFG_GET_TSF_BY_REGISTER_NAME, WLAN_PARAM_Integer, + hdd_config_t, tsf_by_register, + VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT, + CFG_GET_TSF_BY_REGISTER_DEFAULT, + CFG_GET_TSF_BY_REGISTER_MIN, + CFG_GET_TSF_BY_REGISTER_MAX), + REG_VARIABLE(CFG_SET_TSF_GPIO_PIN_NAME, WLAN_PARAM_Integer, hdd_config_t, tsf_gpio_pin, VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT, diff --git a/CORE/HDD/src/wlan_hdd_main.c b/CORE/HDD/src/wlan_hdd_main.c index 85cfccfc4e04..5efe4ebfe02f 100644 --- a/CORE/HDD/src/wlan_hdd_main.c +++ b/CORE/HDD/src/wlan_hdd_main.c @@ -12177,6 +12177,8 @@ hdd_adapter_t *hdd_open_adapter(hdd_context_t *hdd_ctx, /* Adapter successfully added. Increment the vdev count */ hdd_ctx->current_intf_count++; + adapter->tsf_id = HDD_TSF2; + hddLog(VOS_TRACE_LEVEL_DEBUG, "%s: current_intf_count=%d", __func__, hdd_ctx->current_intf_count); diff --git a/CORE/HDD/src/wlan_hdd_tsf.c b/CORE/HDD/src/wlan_hdd_tsf.c index 6ad7f14af2c6..c6fb7f8c983b 100644 --- a/CORE/HDD/src/wlan_hdd_tsf.c +++ b/CORE/HDD/src/wlan_hdd_tsf.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015-2018 The Linux Foundation. All rights reserved. + * Copyright (c) 2015-2019 The Linux Foundation. All rights reserved. * * Previously licensed under the ISC license by Qualcomm Atheros, Inc. * @@ -32,6 +32,13 @@ #include "wlan_hdd_main.h" #include "wlan_hdd_tsf.h" #include "wma_api.h" +#if defined(HIF_PCI) +#include "if_pci.h" +#elif defined(HIF_USB) +#include "if_usb.h" +#elif defined(HIF_SDIO) +#include "if_ath_sdio.h" +#endif #include <linux/errqueue.h> #if defined(CONFIG_NON_QC_PLATFORM) #include <linux/gpio.h> @@ -651,6 +658,133 @@ static inline uint64_t hdd_get_monotonic_host_time(hdd_context_t *hdd_ctx) ktime_get_ns() : ktime_get_real_ns()); } +/** + * is_target_host_valid() - is target tsf valid or not + * @delt_host_time: current host time - last golden host time + * @delt_target_time: current target time - last golden target time + * + * Return: TRUE if target tsf is valid + */ +static inline bool is_target_host_valid(uint64_t delt_host_time, + uint64_t delt_target_time) +{ + if ((delt_target_time * HOST_TO_TARGET_TIME_RATIO > + (delt_host_time - delt_host_time/100)) && + (delt_target_time * HOST_TO_TARGET_TIME_RATIO < + (delt_host_time + delt_host_time/100))) + return true; + else + return false; +} + +/** + * update_target_host_time - update new captured target tsf + * @adapter: pointer to adapter + * + * Return True if current target tsf can be set as golden tsf. + */ +static bool update_target_host_time(hdd_adapter_t *adapter) +{ + uint64_t delt_host_time = 0; + uint64_t delt_target_time = 0; + int num_index = 0; + int i = 0; + bool update_time = false; + + delt_host_time = adapter->cur_host_time - adapter->last_host_time; + delt_target_time = adapter->cur_target_time - adapter->last_target_time; + + if ((!adapter->last_target_time) || + is_target_host_valid(delt_host_time, delt_target_time)) { + adapter->last_host_time = adapter->cur_host_time; + adapter->last_target_time = adapter->cur_target_time; + adapter->invalid_time_num = 0; + return true; + } else if (adapter->invalid_time_num >= MAX_INVALD_TIME_NUM) { + update_time = true; + for (i = 0; i < MAX_INVALD_TIME_NUM; i++) { + num_index = (adapter->invalid_time_num - i - 1) % + MAX_INVALD_TIME_NUM; + delt_host_time = adapter->cur_host_time - + adapter->invalid_host_time[num_index]; + delt_target_time = adapter->cur_target_time - + adapter->invalid_target_time[num_index]; + if (!is_target_host_valid(delt_host_time, + delt_target_time)) { + update_time = false; + break; + } + } + } + + if (update_time) { + adapter->last_host_time = adapter->cur_host_time; + adapter->last_target_time = adapter->cur_target_time; + adapter->invalid_time_num = 0; + return true; + } else { + num_index = adapter->invalid_time_num % MAX_INVALD_TIME_NUM; + adapter->invalid_host_time[num_index] = adapter->cur_host_time; + adapter->invalid_target_time[num_index] = + adapter->cur_target_time; + adapter->invalid_time_num++; + return false; + } +} + +/** + * hdd_get_tsf_by_register() - get tsf by register + * @adapter: pointer to adapter + * @host_time: current host time + * @target_time: current target time. + * + * Return 0 if succeeds + */ +static inline int32_t hdd_get_tsf_by_register(hdd_adapter_t *adapter, + uint64_t host_time, uint64_t *target_time) +{ + v_PVOID_t pHifContext = NULL; + v_CONTEXT_t pVosContext = NULL; + uint32_t datal; + uint32_t datah; + uint32_t tsf_id = adapter->tsf_id; + int32_t ret = 0; + + pVosContext = vos_get_global_context(VOS_MODULE_ID_SYS, NULL); + if(!pVosContext) + return -EFAULT; + pHifContext = vos_get_context(VOS_MODULE_ID_HIF, pVosContext); + if (!pHifContext) + return -EFAULT; + + if (tsf_id == HDD_TSF1) { + hif_get_reg(pHifContext, REG_TSF1_L, &datal); + hif_get_reg(pHifContext, REG_TSF1_H, &datah); + *target_time = datal + ((uint64_t)datah << 32); + } else if (tsf_id == HDD_TSF2) { + hif_get_reg(pHifContext, REG_TSF2_L, &datal); + hif_get_reg(pHifContext, REG_TSF2_H, &datah); + *target_time = datal + ((uint64_t)datah << 32); + } else { + hddLog(VOS_TRACE_LEVEL_ERROR, FL("invalid tsf id %u"), tsf_id); + return -EFAULT; + } + + adapter->cur_host_time = host_time; + if (!ret) + adapter->cur_target_time = *target_time; + + if (!ret && update_target_host_time(adapter)) + *target_time = adapter->cur_target_time; + else + *target_time = ((adapter->cur_host_time - + adapter->last_host_time) / + HOST_TO_TARGET_TIME_RATIO) + + adapter->last_target_time; + + return 0; +} + static ssize_t __hdd_wlan_tsf_show(struct device *dev, struct device_attribute *attr, char *buf) { @@ -668,10 +802,6 @@ static ssize_t __hdd_wlan_tsf_show(struct device *dev, if (adapter->magic != WLAN_HDD_ADAPTER_MAGIC) return scnprintf(buf, PAGE_SIZE, "Invalid device\n"); - if (!hdd_get_th_sync_status(adapter)) - return scnprintf(buf, PAGE_SIZE, - "TSF sync is not initialized\n"); - hdd_ctx = WLAN_HDD_GET_CTX(adapter); if (!hdd_ctx) return scnprintf(buf, PAGE_SIZE, "Invalid HDD context\n"); @@ -692,12 +822,25 @@ static ssize_t __hdd_wlan_tsf_show(struct device *dev, } host_time = hdd_get_monotonic_host_time(hdd_ctx); - if (hdd_get_targettime_from_hosttime(adapter, host_time, - &target_time)) - size = scnprintf(buf, PAGE_SIZE, "Invalid timestamp\n"); - else - size = scnprintf(buf, PAGE_SIZE, "%s%llu %llu %pM\n", - buf, target_time, host_time, bssid); + if (hdd_ctx->cfg_ini->tsf_by_register) { + if (hdd_get_tsf_by_register(adapter, host_time, + &target_time)) + size = scnprintf(buf, PAGE_SIZE, "Invalid timestamp\n"); + else + size = scnprintf(buf, PAGE_SIZE, "%s%llu %llu %pM\n", + buf, target_time, host_time, bssid); + } else { + if (!hdd_get_th_sync_status(adapter)) + return scnprintf(buf, PAGE_SIZE, + "TSF sync is not initialized\n"); + + if (hdd_get_targettime_from_hosttime(adapter, host_time, + &target_time)) + size = scnprintf(buf, PAGE_SIZE, "Invalid timestamp\n"); + else + size = scnprintf(buf, PAGE_SIZE, "%s%llu %llu %pM\n", + buf, target_time, host_time, bssid); + } return size; } @@ -818,7 +961,6 @@ static enum hdd_tsf_op_result hdd_tsf_sync_init(hdd_adapter_t *adapter) { VOS_STATUS ret; hdd_context_t *hddctx; - struct net_device *net_dev; if (!adapter) return HDD_TSF_OP_FAIL; @@ -856,9 +998,6 @@ static enum hdd_tsf_op_result hdd_tsf_sync_init(hdd_adapter_t *adapter) goto fail; } - net_dev = adapter->dev; - if (net_dev && HDD_TSF_IS_DBG_FS_SET(hddctx)) - device_create_file(&net_dev->dev, &dev_attr_tsf); hdd_set_th_sync_status(adapter, true); return HDD_TSF_OP_SUCC; @@ -871,7 +1010,6 @@ static enum hdd_tsf_op_result hdd_tsf_sync_deinit(hdd_adapter_t *adapter) { VOS_STATUS ret; hdd_context_t *hddctx; - struct net_device *net_dev; if (!adapter) return HDD_TSF_OP_FAIL; @@ -906,12 +1044,6 @@ static enum hdd_tsf_op_result hdd_tsf_sync_deinit(hdd_adapter_t *adapter) hdd_reset_timestamps(adapter); - net_dev = adapter->dev; - if (net_dev && HDD_TSF_IS_DBG_FS_SET(hddctx)) { - struct device *dev = &net_dev->dev; - - device_remove_file(dev, &dev_attr_tsf); - } return HDD_TSF_OP_SUCC; } @@ -951,10 +1083,20 @@ enum hdd_tsf_op_result hdd_netbuf_timestamp(adf_nbuf_t netbuf, int hdd_start_tsf_sync(hdd_adapter_t *adapter) { enum hdd_tsf_op_result ret; + hdd_context_t *hddctx; + struct net_device *net_dev; if (!adapter) return -EINVAL; + net_dev = adapter->dev; + hddctx = WLAN_HDD_GET_CTX(adapter); + if (net_dev && HDD_TSF_IS_DBG_FS_SET(hddctx)) + device_create_file(&net_dev->dev, &dev_attr_tsf); + + if (hddctx->cfg_ini->tsf_by_register) + return 0; + ret = hdd_tsf_sync_init(adapter); if (ret != HDD_TSF_OP_SUCC) { hddLog(VOS_TRACE_LEVEL_ERROR, @@ -969,10 +1111,22 @@ int hdd_start_tsf_sync(hdd_adapter_t *adapter) int hdd_stop_tsf_sync(hdd_adapter_t *adapter) { enum hdd_tsf_op_result ret; + hdd_context_t *hddctx; + struct net_device *net_dev; if (!adapter) return -EINVAL; + hddctx = WLAN_HDD_GET_CTX(adapter); + net_dev = adapter->dev; + if (net_dev && HDD_TSF_IS_DBG_FS_SET(hddctx)) { + struct device *dev = &net_dev->dev; + + device_remove_file(dev, &dev_attr_tsf); + } + if (hddctx->cfg_ini->tsf_by_register) + return 0; + ret = __hdd_stop_tsf_sync(adapter); if (ret != HDD_TSF_OP_SUCC) return -EINVAL; @@ -1372,12 +1526,24 @@ static int wlan_ptp_gettime(struct ptp_clock_info *ptp, struct timespec *ts) } host_time = hdd_get_monotonic_host_time(pHddCtx); - if (hdd_get_targettime_from_hosttime(adapter, host_time, - &target_time)) { - hddLog(VOS_TRACE_LEVEL_ERROR, FL("get invalid target timestamp")); - return -EINVAL; + if (pHddCtx->cfg_ini->tsf_by_register) { + if (hdd_get_tsf_by_register(adapter, host_time, + &target_time)) { + hddLog(VOS_TRACE_LEVEL_ERROR, + FL("get invalid target timestamp")); + return -EINVAL; + } else { + *ts = ns_to_timespec(target_time * NSEC_PER_USEC); + } } else { - *ts = ns_to_timespec(target_time * NSEC_PER_USEC); + if (hdd_get_targettime_from_hosttime(adapter, host_time, + &target_time)) { + hddLog(VOS_TRACE_LEVEL_ERROR, + FL("get invalid target timestamp")); + return -EINVAL; + } else { + *ts = ns_to_timespec(target_time * NSEC_PER_USEC); + } } return 0; @@ -1440,12 +1606,24 @@ static int wlan_ptp_gettime(struct ptp_clock_info *ptp, struct timespec64 *ts) } host_time = hdd_get_monotonic_host_time(pHddCtx); - if (hdd_get_targettime_from_hosttime(adapter, host_time, - &target_time)) { - hddLog(VOS_TRACE_LEVEL_ERROR, FL("get invalid target timestamp")); - return -EINVAL; + if (pHddCtx->cfg_ini->tsf_by_register) { + if (hdd_get_tsf_by_register(adapter, host_time, + &target_time)) { + hddLog(VOS_TRACE_LEVEL_ERROR, + FL("get invalid target timestamp")); + return -EINVAL; + } else { + *ts = ns_to_timespec64(target_time * NSEC_PER_USEC); + } } else { - *ts = ns_to_timespec64(target_time * NSEC_PER_USEC); + if (hdd_get_targettime_from_hosttime(adapter, host_time, + &target_time)) { + hddLog(VOS_TRACE_LEVEL_ERROR, + FL("get invalid target timestamp")); + return -EINVAL; + } else { + *ts = ns_to_timespec64(target_time * NSEC_PER_USEC); + } } return 0; @@ -1521,6 +1699,22 @@ static int hdd_get_tsf_cb(void *pcb_cxt, struct stsf *ptsf) return -EINVAL; } + if (hddctx->cfg_ini->tsf_by_register) { + if (ptsf->tsf_id_valid) { + adapter->tsf_id = ptsf->tsf_id; + hddLog(VOS_TRACE_LEVEL_ERROR, + FL("vdev id %u, tsf id %u"), + ptsf->vdev_id, ptsf->tsf_id); + return 0; + } else { + adapter->tsf_id = HDD_TSF_INVALID; + hddLog(VOS_TRACE_LEVEL_ERROR, + FL("vdev id %u, invalid tsf id"), + ptsf->vdev_id); + return -EINVAL; + } + } + if (!hdd_tsf_is_initialized(adapter)) { hddLog(VOS_TRACE_LEVEL_ERROR, FL("tsf is not init, ignore tsf event")); @@ -1563,6 +1757,17 @@ void wlan_hdd_tsf_init(hdd_context_t *hdd_ctx) if (!hdd_ctx) return; + if (hdd_ctx->cfg_ini->tsf_by_register) { + wlan_hdd_phc_init(hdd_ctx); + hal_status = sme_set_tsfcb(hdd_ctx->hHal, hdd_get_tsf_cb, + hdd_ctx); + if (eHAL_STATUS_SUCCESS != hal_status) + hddLog(LOGE, FL("get tsf id cb failed, status: %d"), + hal_status); + + return; + } + if (adf_os_atomic_inc_return(&hdd_ctx->tsf_ready_flag) > 1) return; @@ -1609,6 +1814,15 @@ void wlan_hdd_tsf_deinit(hdd_context_t *hdd_ctx) if (!hdd_ctx) return; + if (hdd_ctx->cfg_ini->tsf_by_register) { + wlan_hdd_phc_deinit(hdd_ctx); + hal_status = sme_set_tsfcb(hdd_ctx->hHal, NULL, NULL); + if (eHAL_STATUS_SUCCESS != hal_status) + hddLog(LOGE, FL("reset tsf cb failed, status: %d"), + hal_status); + return; + } + if (!adf_os_atomic_read(&hdd_ctx->tsf_ready_flag)) return; diff --git a/CORE/MAC/inc/sirApi.h b/CORE/MAC/inc/sirApi.h index a023876cdf7f..7193c50b8f57 100644 --- a/CORE/MAC/inc/sirApi.h +++ b/CORE/MAC/inc/sirApi.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012-2018 The Linux Foundation. All rights reserved. + * Copyright (c) 2012-2019 The Linux Foundation. All rights reserved. * * Previously licensed under the ISC license by Qualcomm Atheros, Inc. * @@ -7193,6 +7193,8 @@ struct sblock_info { * @vdev_id: vdev id * @tsf_low: low 32bits of tsf * @tsf_high: high 32bits of tsf + * @tsf_id: tsf id + * @tsf_id_valid: valid tsf id or not * * driver use this struct to store the tsf info */ @@ -7200,6 +7202,8 @@ struct stsf { uint32_t vdev_id; uint32_t tsf_low; uint32_t tsf_high; + uint32_t tsf_id; + uint32_t tsf_id_valid; }; #ifdef WLAN_FEATURE_MOTION_DETECTION diff --git a/CORE/SERVICES/HIF/PCIe/if_pci.c b/CORE/SERVICES/HIF/PCIe/if_pci.c index 9a937b60eda8..baa582ff9352 100644 --- a/CORE/SERVICES/HIF/PCIe/if_pci.c +++ b/CORE/SERVICES/HIF/PCIe/if_pci.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013-2018 The Linux Foundation. All rights reserved. + * Copyright (c) 2013-2019 The Linux Foundation. All rights reserved. * * Previously licensed under the ISC license by Qualcomm Atheros, Inc. * @@ -3406,6 +3406,13 @@ void hif_pci_save_htc_htt_config_endpoint(int htc_endpoint) scn->hif_sc->htc_endpoint = htc_endpoint; } +void hif_get_reg(void *ol_sc, u32 address, u32 *data) +{ + struct ol_softc *scn = (struct ol_softc *)ol_sc; + + HIFDiagReadAccess(scn->hif_hdl, address, data); +} + void hif_get_hw_info(void *ol_sc, u32 *version, u32 *revision) { *version = ((struct ol_softc *)ol_sc)->target_version; diff --git a/CORE/SERVICES/HIF/PCIe/if_pci.h b/CORE/SERVICES/HIF/PCIe/if_pci.h index 4ab0749b832e..5849e3fccee5 100644 --- a/CORE/SERVICES/HIF/PCIe/if_pci.h +++ b/CORE/SERVICES/HIF/PCIe/if_pci.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013-2016 2018 The Linux Foundation. All rights reserved. + * Copyright (c) 2013-2016 2018-2019 The Linux Foundation. All rights reserved. * * Previously licensed under the ISC license by Qualcomm Atheros, Inc. * @@ -176,6 +176,16 @@ void hif_deinit_adf_ctx(void *ol_sc); void hif_get_hw_info(void *ol_sc, u32 *version, u32 *revision); void hif_set_fw_info(void *ol_sc, u32 target_fw_version); +/** + * hif_get_reg() - get register value + * @ol_sc: pointer to ol_sc + * @address: register address + * @data register value + * + * Return NULL + */ +void hif_get_reg(void *ol_sc, u32 address, u32 *data); + #ifdef IPA_UC_OFFLOAD /* * Micro controller needs PCI BAR address to access CE register diff --git a/CORE/SERVICES/HIF/USB/if_usb.c b/CORE/SERVICES/HIF/USB/if_usb.c index 455f4041724c..56ffd63ff055 100644 --- a/CORE/SERVICES/HIF/USB/if_usb.c +++ b/CORE/SERVICES/HIF/USB/if_usb.c @@ -648,6 +648,13 @@ void hif_reset_soc(void *ol_sc) /* TODO */ } +void hif_get_reg(void *ol_sc, u32 address, u32 *data) +{ + struct ol_softc *scn = (struct ol_softc *)ol_sc; + + HIFDiagReadAccess(scn->hif_hdl, address, data); +} + void hif_get_hw_info(void *ol_sc, u32 *version, u32 *revision) { u_int32_t hif_type, target_type; diff --git a/CORE/SERVICES/HIF/USB/if_usb.h b/CORE/SERVICES/HIF/USB/if_usb.h index 1cd06d2f0c91..51e37c976f48 100644 --- a/CORE/SERVICES/HIF/USB/if_usb.h +++ b/CORE/SERVICES/HIF/USB/if_usb.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013-2014 The Linux Foundation. All rights reserved. + * Copyright (c) 2013-2014 2019 The Linux Foundation. All rights reserved. * * Previously licensed under the ISC license by Qualcomm Atheros, Inc. * @@ -99,6 +99,16 @@ void hif_disable_isr(void *ol_sc); void hif_reset_soc(void *ol_sc); void hif_deinit_adf_ctx(void *ol_sc); +/** + * hif_get_reg() - get register value + * @ol_sc: pointer to ol_sc + * @address: register address + * @data register value + * + * Return NULL + */ +void hif_get_reg(void *ol_sc, u32 address, u32 *data); + void hif_get_hw_info(void *ol_sc, u32 *version, u32 *revision); void hif_set_fw_info(void *ol_sc, u32 target_fw_version); #endif /* __ATH_USB_H__ */ diff --git a/CORE/SERVICES/HIF/sdio/linux/if_ath_sdio.c b/CORE/SERVICES/HIF/sdio/linux/if_ath_sdio.c index 12c5fd47dbb3..0da4defafc3e 100644 --- a/CORE/SERVICES/HIF/sdio/linux/if_ath_sdio.c +++ b/CORE/SERVICES/HIF/sdio/linux/if_ath_sdio.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013-2018 The Linux Foundation. All rights reserved. + * Copyright (c) 2013-2019 The Linux Foundation. All rights reserved. * * Previously licensed under the ISC license by Qualcomm Atheros, Inc. * @@ -481,6 +481,13 @@ void hif_reset_soc(void *ol_sc) ENTER("- dummy function!"); } +void hif_get_reg(void *ol_sc, u32 address, u32 *data) +{ + struct ol_softc *scn = (struct ol_softc *)ol_sc; + + HIFDiagReadAccess(scn->hif_hdl, address, data); +} + void hif_get_hw_info(void *ol_sc, u32 *version, u32 *revision) { struct ol_softc *ol_sc_local = (struct ol_softc *)ol_sc; diff --git a/CORE/SERVICES/HIF/sdio/linux/if_ath_sdio.h b/CORE/SERVICES/HIF/sdio/linux/if_ath_sdio.h index 198d40c2c907..ccb0d3cec26e 100644 --- a/CORE/SERVICES/HIF/sdio/linux/if_ath_sdio.h +++ b/CORE/SERVICES/HIF/sdio/linux/if_ath_sdio.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013-2014 2018 The Linux Foundation. All rights reserved. + * Copyright (c) 2013-2014 2018-2019 The Linux Foundation. All rights reserved. * * Previously licensed under the ISC license by Qualcomm Atheros, Inc. * @@ -104,6 +104,16 @@ void hif_reset_soc(void *ol_sc); void hif_register_tbl_attach(u32 hif_type); void target_register_tbl_attach(u32 target_type); +/** + * hif_get_reg() - get register value + * @ol_sc: pointer to ol_sc + * @address: register address + * @data register value + * + * Return NULL + */ +void hif_get_reg(void *ol_sc, u32 address, u32 *data); + void hif_get_hw_info(void *ol_sc, u32 *version, u32 *revision); void hif_set_fw_info(void *ol_sc, u32 target_fw_version); diff --git a/CORE/SERVICES/WMA/wma.c b/CORE/SERVICES/WMA/wma.c index 06bad7751882..ed456dd6f82e 100644 --- a/CORE/SERVICES/WMA/wma.c +++ b/CORE/SERVICES/WMA/wma.c @@ -37087,10 +37087,14 @@ static int wma_vdev_tsf_handler(void *handle, uint8_t *data, ptsf->vdev_id = tsf_event->vdev_id; ptsf->tsf_low = tsf_event->tsf_low; ptsf->tsf_high = tsf_event->tsf_high; + ptsf->tsf_id = tsf_event->tsf_id; + ptsf->tsf_id_valid = tsf_event->tsf_id_valid; WMA_LOGD("%s: receive WMI_VDEV_TSF_REPORT_EVENTID ", __func__); WMA_LOGD("%s: vdev_id = %u,tsf_low =%u, tsf_high = %u", __func__, ptsf->vdev_id, ptsf->tsf_low, ptsf->tsf_high); + WMA_LOGD("%s: vdev_id = %u,tsf_id =%u, tsf_id_valid = %u", __func__, + ptsf->vdev_id, ptsf->tsf_id, ptsf->tsf_id_valid); vos_msg.type = eWNI_SME_TSF_EVENT; vos_msg.bodyptr = ptsf; |
