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
This commit is contained in:
Komal Seelam 2016-01-27 18:57:10 +05:30
commit 91553ce741
4 changed files with 108 additions and 111 deletions

View file

@ -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

View file

@ -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);

View file

@ -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;
}

View file

@ -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__);