From 91553ce741f487a3cd4766b5aaed45697e75ea6f Mon Sep 17 00:00:00 2001 From: Komal Seelam Date: Wed, 27 Jan 2016 18:57:10 +0530 Subject: [PATCH] qcacmn: Refactor ol_sc for target_info and ini params Clean up driver modules to query hif for the target info and ini handle, instead of accessing hif context in other modules. Change-Id: Ibd4762a20f788190f242b4f24b914fa4b99d5a5b CRs-Fixed: 967765 --- hif/inc/hif.h | 114 ++++++++++++++++-------------------------- hif/src/ce/ce_main.c | 24 +++++---- hif/src/hif_main.c | 67 ++++++++++++++++--------- hif/src/pcie/if_pci.c | 14 ++++-- 4 files changed, 108 insertions(+), 111 deletions(-) diff --git a/hif/inc/hif.h b/hif/inc/hif.h index 24d5c591af84..4288786ac2f6 100644 --- a/hif/inc/hif.h +++ b/hif/inc/hif.h @@ -145,10 +145,47 @@ struct qca_napi_data { struct qca_napi_info napis[CE_COUNT_MAX]; }; +/** + * struct hif_config_info - Place Holder for hif configuration + * @enable_uart_print: UART Print + * @enable_self_recovery: Self Recovery + * @enable_fw_log: To Enable FW LOG + * @enable_lpass_support: LPASS support + * @enable_ramdump_collection: Ramdump Collection + * @max_no_of_peers: Max Number of Peers + * + * Structure for holding ini parameters. + */ +struct hif_config_info { + bool enable_uart_print; + bool enable_self_recovery; + bool enable_fw_log; + bool enable_lpass_support; + bool enable_ramdump_collection; + uint8_t max_no_of_peers; +}; + +/** + * struct hif_target_info - Target Information + * @target_version: Target Version + * @target_type: Target Type + * @target_revision: Target Revision + * @soc_version: SOC Version + * + * Structure to hold target information. + */ +struct hif_target_info { + uint32_t target_version; + uint32_t target_type; + uint32_t target_revision; + uint32_t soc_version; +}; + struct ol_softc { void __iomem *mem; /* IO mapped memory base address */ cdf_dma_addr_t mem_pa; - uint32_t soc_version; + struct hif_config_info hif_config; + struct hif_target_info target_info; /* * handle for code that uses the osdep.h version of OS * abstraction primitives @@ -164,20 +201,10 @@ struct ol_softc { */ cdf_device_t cdf_dev; - struct ol_version version; - /* Packet statistics */ struct ol_ath_stats pkt_stats; - /* A_TARGET_TYPE_* */ - uint32_t target_type; - uint32_t target_fw_version; - uint32_t target_version; - uint32_t target_revision; - uint8_t crm_version_string[64]; - uint8_t wlan_version_string[64]; ol_target_status target_status; - bool is_sim; /* calibration data is stored in flash */ uint8_t *cal_in_flash; /* virtual address for the calibration data on the flash */ @@ -187,9 +214,7 @@ struct ol_softc { /* BMI info */ /* OS-dependent private info for BMI */ - void *bmi_ol_priv; bool bmi_done; - bool bmi_ua_done; uint8_t *bmi_cmd_buff; dma_addr_t bmi_cmd_da; OS_DMA_MEM_CONTEXT(bmicmd_dmacontext) @@ -197,7 +222,6 @@ struct ol_softc { uint8_t *bmi_rsp_buff; dma_addr_t bmi_rsp_da; /* length of last response */ - uint32_t last_rxlen; OS_DMA_MEM_CONTEXT(bmirsp_dmacontext) void *msi_magic; @@ -217,57 +241,7 @@ struct ol_softc { /* HTC handles */ void *htc_handle; - bool fEnableBeaconEarlyTermination; - uint8_t bcnEarlyTermWakeInterval; - - /* UTF event information */ - struct { - uint8_t *data; - uint32_t length; - cdf_size_t offset; - uint8_t currentSeq; - uint8_t expectedSeq; - } utf_event_info; - - struct ol_wow_info *scn_wowInfo; - /* enable uart/serial prints from target */ - bool enableuartprint; - /* enable fwlog */ - bool enablefwlog; - - HAL_REG_CAPABILITIES hal_reg_capabilities; - struct ol_regdmn *ol_regdmn_handle; - uint8_t bcn_mode; - uint8_t arp_override; - /* - * Includes host side stack level stats + - * radio level athstats - */ - struct wlan_dbg_stats ath_stats; - /* noise_floor */ - int16_t chan_nf; - uint32_t min_tx_power; - uint32_t max_tx_power; - uint32_t txpowlimit2G; - uint32_t txpowlimit5G; - uint32_t txpower_scale; - uint32_t chan_tx_pwr; - uint32_t vdev_count; - uint32_t max_bcn_ie_size; - cdf_spinlock_t scn_lock; uint8_t vow_extstats; - /* if dcs enabled or not */ - uint8_t scn_dcs; - wdi_event_subscribe scn_rx_peer_invalid_subscriber; - uint8_t proxy_sta; - uint8_t bcn_enabled; - /* Dynamic Tx Chainmask Selection enabled/disabled */ - uint8_t dtcs; - /* true if vht ies are set on target */ - uint32_t set_ht_vht_ies:1; - /*CWM enable/disable state */ - bool scn_cwmenable; - uint8_t max_no_of_peers; #ifdef CONFIG_CNSS struct cnss_fw_files fw_files; #endif @@ -276,11 +250,6 @@ struct ol_softc { unsigned long ramdump_address; unsigned long ramdump_size; #endif - bool enable_self_recovery; -#ifdef WLAN_FEATURE_LPSS - bool enablelpasssupport; -#endif - bool enable_ramdump_collection; struct targetdef_s *targetdef; struct ce_reg_def *target_ce_def; struct hostdef_s *hostdef; @@ -619,9 +588,6 @@ void hif_set_target_sleep(struct ol_softc *scn, bool sleep_ok, bool wait_for_it); int hif_check_fw_reg(struct ol_softc *scn); int hif_check_soc_status(struct ol_softc *scn); -void hif_get_hw_info(void *scn, u32 *version, u32 *revision, - const char **target_name); -void hif_set_fw_info(void *scn, u32 target_fw_version); void hif_disable_isr(void *scn); void hif_reset_soc(void *scn); void hif_disable_aspm(void); @@ -700,6 +666,10 @@ int hif_dump_registers(struct ol_softc *scn); int ol_copy_ramdump(struct ol_softc *scn); void hif_pktlogmod_exit(void *hif_ctx); void hif_crash_shutdown(void *hif_ctx); +void hif_get_hw_info(struct ol_softc *scn, u32 *version, u32 *revision, + const char **target_name); +struct hif_target_info *hif_get_target_info_handle(struct ol_softc *scn); +struct hif_config_info *hif_get_ini_handle(struct ol_softc *scn); #ifdef __cplusplus } #endif diff --git a/hif/src/ce/ce_main.c b/hif/src/ce/ce_main.c index 035f53b5736e..7316b5c89662 100644 --- a/hif/src/ce/ce_main.c +++ b/hif/src/ce/ce_main.c @@ -1535,6 +1535,8 @@ int hif_set_hia(struct ol_softc *scn) uint32_t chip_id; #endif uint32_t pipe_cfg_addr; + struct hif_target_info *tgt_info = hif_get_target_info_handle(scn); + uint32_t target_type = tgt_info->target_type; HIF_TRACE("%s: E", __func__); @@ -1578,11 +1580,11 @@ int hif_set_hia(struct ol_softc *scn) offsetof(struct host_interest_area_t, hi_option_flag2); #else - interconnect_targ_addr = hif_hia_item_address(scn->target_type, + interconnect_targ_addr = hif_hia_item_address(target_type, offsetof(struct host_interest_s, hi_interconnect_state)); - ealloc_targ_addr = hif_hia_item_address(scn->target_type, + ealloc_targ_addr = hif_hia_item_address(target_type, offsetof(struct host_interest_s, hi_early_alloc)); - flag2_targ_addr = hif_hia_item_address(scn->target_type, + flag2_targ_addr = hif_hia_item_address(target_type, offsetof(struct host_interest_s, hi_option_flag2)); #endif /* Supply Target-side CE configuration */ @@ -1679,10 +1681,10 @@ int hif_set_hia(struct ol_softc *scn) #ifndef QCA_WIFI_3_0 /* configure early allocation */ - ealloc_targ_addr = hif_hia_item_address(scn->target_type, - offsetof( - struct host_interest_s, - hi_early_alloc)); + ealloc_targ_addr = hif_hia_item_address(target_type, + offsetof( + struct host_interest_s, + hi_early_alloc)); rv = hif_diag_read_access(scn, ealloc_targ_addr, &ealloc_value); @@ -1704,8 +1706,7 @@ int hif_set_hia(struct ol_softc *scn) goto done; } if (CHIP_ID_VERSION_GET(chip_id) == 0xD) { - scn->target_revision = - CHIP_ID_REVISION_GET(chip_id); + tgt_info->target_revision = CHIP_ID_REVISION_GET(chip_id); switch (CHIP_ID_REVISION_GET(chip_id)) { case 0x2: /* ROME 1.3 */ /* 2 banks are switched to IRAM */ @@ -1743,7 +1744,7 @@ int hif_set_hia(struct ol_softc *scn) #endif /* Tell Target to proceed with initialization */ - flag2_targ_addr = hif_hia_item_address(scn->target_type, + flag2_targ_addr = hif_hia_item_address(target_type, offsetof( struct host_interest_s, hi_option_flag2)); @@ -1821,6 +1822,7 @@ int hif_config_ce(hif_handle_t hif_hdl) int ret; struct ol_softc *scn = hif_hdl; struct icnss_soc_info soc_info; + struct hif_target_info *tgt_info = hif_get_target_info_handle(scn); /* if epping is enabled we need to use the epping configuration. */ if (WLAN_IS_EPPING_ENABLED(cds_get_conparam())) { @@ -1862,7 +1864,7 @@ int hif_config_ce(hif_handle_t hif_hdl) scn->hif_hdl = hif_state; scn->mem = soc_info.v_addr; scn->mem_pa = soc_info.p_addr; - scn->soc_version = soc_info.version; + tgt_info->soc_version = soc_info.version; cdf_spinlock_init(&hif_state->keep_awake_lock); diff --git a/hif/src/hif_main.c b/hif/src/hif_main.c index b9a7700c6c4b..ed28c1c8c8dc 100644 --- a/hif/src/hif_main.c +++ b/hif/src/hif_main.c @@ -462,15 +462,17 @@ void hif_save_htc_htt_config_endpoint(int htc_endpoint) /** * hif_get_hw_name(): get a human readable name for the hardware + * @info: Target Info * - * Return: human readible name for the underlying wifi hardware. + * Return: human readable name for the underlying wifi hardware. */ -const char *hif_get_hw_name(struct ol_softc *scn) +static const char *hif_get_hw_name(struct hif_target_info *info) { int i; + for (i = 0; i < ARRAY_SIZE(qwlan_hw_list); i++) { - if (scn->target_version == qwlan_hw_list[i].id && - scn->target_revision == qwlan_hw_list[i].subid) { + if (info->target_version == qwlan_hw_list[i].id && + info->target_revision == qwlan_hw_list[i].subid) { return qwlan_hw_list[i].name; } } @@ -486,24 +488,13 @@ const char *hif_get_hw_name(struct ol_softc *scn) * * Return: n/a */ -void hif_get_hw_info(void *scn, u32 *version, u32 *revision, +void hif_get_hw_info(struct ol_softc *scn, u32 *version, u32 *revision, const char **target_name) { - *version = ((struct ol_softc *)scn)->target_version; - *revision = ((struct ol_softc *)scn)->target_revision; - *target_name = hif_get_hw_name((struct ol_softc *)scn); -} - -/** - * hif_set_fw_info(): set the target_fw_version - * @scn: scn - * @target_fw_version: target_fw_version - * - * Return: n/a - */ -void hif_set_fw_info(void *scn, uint32_t target_fw_version) -{ - ((struct ol_softc *)scn)->target_fw_version = target_fw_version; + struct hif_target_info *info = hif_get_target_info_handle(scn); + *version = info->target_version; + *revision = info->target_revision; + *target_name = hif_get_hw_name(info); } /** @@ -516,6 +507,7 @@ CDF_STATUS hif_open(enum ath_hal_bus_type bus_type) struct ol_softc *scn; v_CONTEXT_t cds_context; CDF_STATUS status = CDF_STATUS_SUCCESS; + struct hif_config_info *cfg; cds_context = cds_get_global_context(); status = cds_alloc_context(cds_context, CDF_MODULE_ID_HIF, @@ -526,9 +518,8 @@ CDF_STATUS hif_open(enum ath_hal_bus_type bus_type) } cdf_mem_zero(scn, sizeof(*scn)); - scn->enableuartprint = 0; - scn->enablefwlog = 0; - scn->max_no_of_peers = 1; + cfg = hif_get_ini_handle(scn); + cfg->max_no_of_peers = 1; scn->pkt_log_init = false; cdf_atomic_init(&scn->wow_done); cdf_atomic_init(&scn->active_tasklet_cnt); @@ -879,3 +870,33 @@ int hif_get_device_type(uint32_t device_id, end: return ret; } + +/** + * Target info and ini parameters are global to the driver + * Hence these structures are exposed to all the modules in + * the driver and they don't need to maintains multiple copies + * of the same info, instead get the handle from hif and + * modify them in hif + */ + +/** + * hif_get_ini_handle() - API to get hif_config_param handle + * @scn: HIF Context + * + * Return: pointer to hif_config_info + */ +struct hif_config_info *hif_get_ini_handle(struct ol_softc *scn) +{ + return &scn->hif_config; +} + +/** + * hif_get_target_info_handle() - API to get hif_target_info handle + * @scn: HIF context + * + * Return: Pointer to hif_target_info + */ +struct hif_target_info *hif_get_target_info_handle(struct ol_softc *scn) +{ + return &scn->target_info; +} diff --git a/hif/src/pcie/if_pci.c b/hif/src/pcie/if_pci.c index 4e4a7a1f7225..1acca9c7347e 100644 --- a/hif/src/pcie/if_pci.c +++ b/hif/src/pcie/if_pci.c @@ -2183,17 +2183,17 @@ void hif_reset_soc(void *ol_sc) { struct ol_softc *scn = (struct ol_softc *)ol_sc; struct hif_pci_softc *sc = scn->hif_sc; + struct hif_target_info *tgt_info = hif_get_target_info_handle(scn); #if defined(CPU_WARM_RESET_WAR) /* Currently CPU warm reset sequence is tested only for AR9888_REV2 * Need to enable for AR9888_REV1 once CPU warm reset sequence is * verified for AR9888_REV1 */ - if (scn->target_version == AR9888_REV2_VERSION) { + if (tgt_info->target_version == AR9888_REV2_VERSION) hif_pci_device_warm_reset(sc); - } else { + else hif_pci_device_reset(sc); - } #else hif_pci_device_reset(sc); #endif @@ -2300,6 +2300,7 @@ hif_target_sleep_state_adjust(struct ol_softc *scn, static int max_delay; struct hif_pci_softc *sc = scn->hif_sc; static int debug; + struct hif_config_info *cfg = hif_get_ini_handle(scn); if (scn->recovery) return -EACCES; @@ -2416,7 +2417,7 @@ hif_target_sleep_state_adjust(struct ol_softc *scn, HIF_ERROR("%s:error, wakeup target", __func__); hif_msm_pcie_debug_info(sc); - if (!sc->ol_sc->enable_self_recovery) + if (!cfg->enable_self_recovery) CDF_BUG(0); scn->recovery = true; cds_set_recovery_in_progress(true); @@ -2706,6 +2707,7 @@ CDF_STATUS hif_enable_bus(struct ol_softc *ol_sc, int probe_again = 0; struct pci_dev *pdev = bdev; const struct pci_device_id *id = bid; + struct hif_target_info *tgt_info; HIF_TRACE("%s: con_mode = 0x%x, device_id = 0x%x", __func__, cds_get_conparam(), id->device); @@ -2726,6 +2728,7 @@ CDF_STATUS hif_enable_bus(struct ol_softc *ol_sc, ol_sc->aps_osdev.bc.bc_bustype = type; sc->devid = id->device; sc->cacheline_sz = dma_get_cache_alignment(); + tgt_info = hif_get_target_info_handle(ol_sc); again: ret = hif_enable_pci(sc, pdev, id); if (ret < 0) { @@ -2766,7 +2769,8 @@ again: } HIF_TRACE("%s: hif_pci_probe_tgt_wakeup done", __func__); - ol_sc->target_type = target_type; + tgt_info->target_type = target_type; + sc->soc_pcie_bar0 = pci_resource_start(pdev, BAR_NUM); if (!sc->soc_pcie_bar0) { HIF_ERROR("%s: ERROR - cannot get CE BAR0", __func__);