qcacmn: Use wrappers for bus-oriented OS API's
Use appropriate wrappers for bus and platform related OS API's. Change-Id: I2b6d16f698816ef4851594717810bda6f167de32 CRs-Fixed: 2297169
This commit is contained in:
@@ -20,6 +20,7 @@
|
|||||||
#include <ce_main.h>
|
#include <ce_main.h>
|
||||||
#include <hif_irq_affinity.h>
|
#include <hif_irq_affinity.h>
|
||||||
#include "qdf_module.h"
|
#include "qdf_module.h"
|
||||||
|
#include "qdf_net_if.h"
|
||||||
|
|
||||||
/* mapping NAPI budget 0 to internal budget 0
|
/* mapping NAPI budget 0 to internal budget 0
|
||||||
* NAPI budget 1 to internal budget [1,scaler -1]
|
* NAPI budget 1 to internal budget [1,scaler -1]
|
||||||
@@ -197,7 +198,7 @@ static struct hif_exec_context *hif_exec_napi_create(uint32_t scale)
|
|||||||
ctx->exec_ctx.sched_ops = &napi_sched_ops;
|
ctx->exec_ctx.sched_ops = &napi_sched_ops;
|
||||||
ctx->exec_ctx.inited = true;
|
ctx->exec_ctx.inited = true;
|
||||||
ctx->exec_ctx.scale_bin_shift = scale;
|
ctx->exec_ctx.scale_bin_shift = scale;
|
||||||
init_dummy_netdev(&(ctx->netdev));
|
qdf_net_if_create_dummy_if((struct qdf_net_if *)&ctx->netdev);
|
||||||
netif_napi_add(&(ctx->netdev), &(ctx->napi), hif_exec_poll,
|
netif_napi_add(&(ctx->netdev), &(ctx->napi), hif_exec_poll,
|
||||||
QCA_NAPI_BUDGET);
|
QCA_NAPI_BUDGET);
|
||||||
napi_enable(&ctx->napi);
|
napi_enable(&ctx->napi);
|
||||||
|
@@ -46,6 +46,8 @@
|
|||||||
#include <hif_irq_affinity.h>
|
#include <hif_irq_affinity.h>
|
||||||
#include "qdf_cpuhp.h"
|
#include "qdf_cpuhp.h"
|
||||||
#include "qdf_module.h"
|
#include "qdf_module.h"
|
||||||
|
#include "qdf_net_if.h"
|
||||||
|
#include "qdf_dev.h"
|
||||||
|
|
||||||
enum napi_decision_vector {
|
enum napi_decision_vector {
|
||||||
HIF_NAPI_NOEVENT = 0,
|
HIF_NAPI_NOEVENT = 0,
|
||||||
@@ -692,7 +694,8 @@ int hif_napi_event(struct hif_opaque_softc *hif_ctx, enum qca_napi_event event,
|
|||||||
__func__, i);
|
__func__, i);
|
||||||
napi_disable(napi);
|
napi_disable(napi);
|
||||||
/* in case it is affined, remove it */
|
/* in case it is affined, remove it */
|
||||||
irq_set_affinity_hint(napii->irq, NULL);
|
qdf_dev_set_irq_affinity(napii->irq,
|
||||||
|
NULL);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -814,6 +817,7 @@ bool hif_napi_correct_cpu(struct qca_napi_info *napi_info)
|
|||||||
cpumask_t cpumask;
|
cpumask_t cpumask;
|
||||||
int cpu;
|
int cpu;
|
||||||
struct qca_napi_data *napid;
|
struct qca_napi_data *napid;
|
||||||
|
QDF_STATUS ret;
|
||||||
|
|
||||||
napid = hif_napi_get_all(GET_HIF_OPAQUE_HDL(napi_info->hif_ctx));
|
napid = hif_napi_get_all(GET_HIF_OPAQUE_HDL(napi_info->hif_ctx));
|
||||||
|
|
||||||
@@ -829,8 +833,10 @@ bool hif_napi_correct_cpu(struct qca_napi_info *napi_info)
|
|||||||
cpumask.bits[0] = (0x01 << napi_info->cpu);
|
cpumask.bits[0] = (0x01 << napi_info->cpu);
|
||||||
|
|
||||||
irq_modify_status(napi_info->irq, IRQ_NO_BALANCING, 0);
|
irq_modify_status(napi_info->irq, IRQ_NO_BALANCING, 0);
|
||||||
rc = irq_set_affinity_hint(napi_info->irq,
|
ret = qdf_dev_set_irq_affinity(napi_info->irq,
|
||||||
&cpumask);
|
(struct qdf_cpu_mask *)
|
||||||
|
&cpumask);
|
||||||
|
rc = qdf_status_to_os_return(ret);
|
||||||
irq_modify_status(napi_info->irq, 0, IRQ_NO_BALANCING);
|
irq_modify_status(napi_info->irq, 0, IRQ_NO_BALANCING);
|
||||||
|
|
||||||
if (rc)
|
if (rc)
|
||||||
@@ -1463,6 +1469,7 @@ static int hncm_migrate_to(struct qca_napi_data *napid,
|
|||||||
{
|
{
|
||||||
int rc = 0;
|
int rc = 0;
|
||||||
cpumask_t cpumask;
|
cpumask_t cpumask;
|
||||||
|
QDF_STATUS status;
|
||||||
|
|
||||||
NAPI_DEBUG("-->%s(napi_cd=%d, didx=%d)", __func__, napi_ce, didx);
|
NAPI_DEBUG("-->%s(napi_cd=%d, didx=%d)", __func__, napi_ce, didx);
|
||||||
|
|
||||||
@@ -1471,7 +1478,9 @@ static int hncm_migrate_to(struct qca_napi_data *napid,
|
|||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
irq_modify_status(napid->napis[napi_ce]->irq, IRQ_NO_BALANCING, 0);
|
irq_modify_status(napid->napis[napi_ce]->irq, IRQ_NO_BALANCING, 0);
|
||||||
rc = irq_set_affinity_hint(napid->napis[napi_ce]->irq, &cpumask);
|
status = qdf_dev_set_irq_affinity(napid->napis[napi_ce]->irq,
|
||||||
|
(struct qdf_cpu_mask *)&cpumask);
|
||||||
|
rc = qdf_status_to_os_return(status);
|
||||||
|
|
||||||
/* unmark the napis bitmap in the cpu table */
|
/* unmark the napis bitmap in the cpu table */
|
||||||
napid->napi_cpu[napid->napis[napi_ce]->cpu].napis &= ~(0x01 << napi_ce);
|
napid->napi_cpu[napid->napis[napi_ce]->cpu].napis &= ~(0x01 << napi_ce);
|
||||||
|
@@ -35,6 +35,7 @@
|
|||||||
#include "ahb_api.h"
|
#include "ahb_api.h"
|
||||||
#include "pci_api.h"
|
#include "pci_api.h"
|
||||||
#include "hif_napi.h"
|
#include "hif_napi.h"
|
||||||
|
#include "qal_vbus_dev.h"
|
||||||
|
|
||||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 1, 0)
|
#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 1, 0)
|
||||||
#define IRQF_DISABLED 0x00000020
|
#define IRQF_DISABLED 0x00000020
|
||||||
@@ -218,7 +219,7 @@ int hif_ahb_configure_legacy_irq(struct hif_pci_softc *sc)
|
|||||||
|
|
||||||
/* do not support MSI or MSI IRQ failed */
|
/* do not support MSI or MSI IRQ failed */
|
||||||
tasklet_init(&sc->intr_tq, wlan_tasklet, (unsigned long)sc);
|
tasklet_init(&sc->intr_tq, wlan_tasklet, (unsigned long)sc);
|
||||||
irq = platform_get_irq_byname(pdev, "legacy");
|
qal_vbus_get_irq((struct qdf_pfm_hndl *)pdev, "legacy", &irq);
|
||||||
if (irq < 0) {
|
if (irq < 0) {
|
||||||
dev_err(&pdev->dev, "Unable to get irq\n");
|
dev_err(&pdev->dev, "Unable to get irq\n");
|
||||||
ret = -1;
|
ret = -1;
|
||||||
@@ -259,7 +260,8 @@ int hif_ahb_configure_irq(struct hif_pci_softc *sc)
|
|||||||
for (i = 0; i < scn->ce_count; i++) {
|
for (i = 0; i < scn->ce_count; i++) {
|
||||||
if (host_ce_conf[i].flags & CE_ATTR_DISABLE_INTR)
|
if (host_ce_conf[i].flags & CE_ATTR_DISABLE_INTR)
|
||||||
continue;
|
continue;
|
||||||
irq = platform_get_irq_byname(pdev, ic_irqname[HIF_IC_CE0_IRQ_OFFSET + i]);
|
qal_vbus_get_irq((struct qdf_pfm_hndl *)pdev,
|
||||||
|
ic_irqname[HIF_IC_CE0_IRQ_OFFSET + i], &irq);
|
||||||
ic_irqnum[HIF_IC_CE0_IRQ_OFFSET + i] = irq;
|
ic_irqnum[HIF_IC_CE0_IRQ_OFFSET + i] = irq;
|
||||||
ret = request_irq(irq ,
|
ret = request_irq(irq ,
|
||||||
hif_ahb_interrupt_handler,
|
hif_ahb_interrupt_handler,
|
||||||
@@ -284,7 +286,6 @@ int hif_ahb_configure_grp_irq(struct hif_softc *scn,
|
|||||||
struct hif_pci_softc *sc = HIF_GET_PCI_SOFTC(scn);
|
struct hif_pci_softc *sc = HIF_GET_PCI_SOFTC(scn);
|
||||||
struct platform_device *pdev = (struct platform_device *)sc->pdev;
|
struct platform_device *pdev = (struct platform_device *)sc->pdev;
|
||||||
int irq = 0;
|
int irq = 0;
|
||||||
const char *irq_name;
|
|
||||||
int j;
|
int j;
|
||||||
|
|
||||||
/* configure external interrupts */
|
/* configure external interrupts */
|
||||||
@@ -295,8 +296,8 @@ int hif_ahb_configure_grp_irq(struct hif_softc *scn,
|
|||||||
qdf_spin_lock_irqsave(&hif_ext_group->irq_lock);
|
qdf_spin_lock_irqsave(&hif_ext_group->irq_lock);
|
||||||
|
|
||||||
for (j = 0; j < hif_ext_group->numirq; j++) {
|
for (j = 0; j < hif_ext_group->numirq; j++) {
|
||||||
irq_name = ic_irqname[hif_ext_group->irq[j]];
|
qal_vbus_get_irq((struct qdf_pfm_hndl *)pdev,
|
||||||
irq = platform_get_irq_byname(pdev, irq_name);
|
ic_irqname[hif_ext_group->irq[j]], &irq);
|
||||||
|
|
||||||
ic_irqnum[hif_ext_group->irq[j]] = irq;
|
ic_irqnum[hif_ext_group->irq[j]] = irq;
|
||||||
irq_set_status_flags(irq, IRQ_DISABLE_UNLAZY);
|
irq_set_status_flags(irq, IRQ_DISABLE_UNLAZY);
|
||||||
@@ -426,11 +427,14 @@ void hif_ahb_disable_bus(struct hif_softc *scn)
|
|||||||
struct resource *memres = NULL;
|
struct resource *memres = NULL;
|
||||||
int mem_pa_size = 0;
|
int mem_pa_size = 0;
|
||||||
struct hif_target_info *tgt_info = NULL;
|
struct hif_target_info *tgt_info = NULL;
|
||||||
|
struct qdf_vbus_resource *vmres = NULL;
|
||||||
|
|
||||||
tgt_info = &scn->target_info;
|
tgt_info = &scn->target_info;
|
||||||
/*Disable WIFI clock input*/
|
/*Disable WIFI clock input*/
|
||||||
if (sc->mem) {
|
if (sc->mem) {
|
||||||
memres = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
qal_vbus_get_resource((struct qdf_pfm_hndl *)pdev, &vmres,
|
||||||
|
IORESOURCE_MEM, 0);
|
||||||
|
memres = (struct resource *)vmres;
|
||||||
if (!memres) {
|
if (!memres) {
|
||||||
HIF_INFO("%s: Failed to get IORESOURCE_MEM\n",
|
HIF_INFO("%s: Failed to get IORESOURCE_MEM\n",
|
||||||
__func__);
|
__func__);
|
||||||
|
@@ -31,6 +31,7 @@
|
|||||||
#include "ce_tasklet.h"
|
#include "ce_tasklet.h"
|
||||||
#include "ahb_api.h"
|
#include "ahb_api.h"
|
||||||
#include "if_ahb.h"
|
#include "if_ahb.h"
|
||||||
|
#include "qal_vbus_dev.h"
|
||||||
|
|
||||||
#include <linux/clk.h>
|
#include <linux/clk.h>
|
||||||
#include <linux/of_address.h>
|
#include <linux/of_address.h>
|
||||||
@@ -60,6 +61,7 @@ static int clk_enable_disable(struct device *dev, const char *str, int enable)
|
|||||||
{
|
{
|
||||||
struct clk *clk_t = NULL;
|
struct clk *clk_t = NULL;
|
||||||
int ret;
|
int ret;
|
||||||
|
QDF_STATUS status;
|
||||||
|
|
||||||
clk_t = clk_get(dev, str);
|
clk_t = clk_get(dev, str);
|
||||||
if (IS_ERR(clk_t)) {
|
if (IS_ERR(clk_t)) {
|
||||||
@@ -69,17 +71,18 @@ static int clk_enable_disable(struct device *dev, const char *str, int enable)
|
|||||||
}
|
}
|
||||||
if (true == enable) {
|
if (true == enable) {
|
||||||
/* Prepare and Enable clk */
|
/* Prepare and Enable clk */
|
||||||
ret = clk_prepare_enable(clk_t);
|
status = qal_vbus_enable_devclk((struct qdf_dev_clk *)clk_t);
|
||||||
|
ret = qdf_status_to_os_return(status);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
HIF_INFO("%s: err enabling clk %s , error:%d\n",
|
HIF_INFO("%s: err enabling clk %s , error:%d\n",
|
||||||
__func__, str, ret);
|
__func__, str, ret);
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
/* Disable and unprepare clk */
|
/* Disable and unprepare clk */
|
||||||
clk_disable_unprepare(clk_t);
|
status = qal_vbus_disable_devclk((struct qdf_dev_clk *)clk_t);
|
||||||
|
ret = qdf_status_to_os_return(status);
|
||||||
}
|
}
|
||||||
return 0;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -129,6 +132,7 @@ int hif_ahb_enable_radio(struct hif_pci_softc *sc,
|
|||||||
struct device_node *dev_node = pdev->dev.of_node;
|
struct device_node *dev_node = pdev->dev.of_node;
|
||||||
bool msienable = false;
|
bool msienable = false;
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
struct qdf_vbus_rstctl *vrstctl = NULL;
|
||||||
|
|
||||||
ret = of_property_read_u32(dev_node, "qca,msi_addr", &msi_addr);
|
ret = of_property_read_u32(dev_node, "qca,msi_addr", &msi_addr);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
@@ -198,47 +202,63 @@ int hif_ahb_enable_radio(struct hif_pci_softc *sc,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* De-assert radio cold reset */
|
/* De-assert radio cold reset */
|
||||||
reset_ctl = reset_control_get(&pdev->dev, "wifi_radio_cold");
|
qal_vbus_get_dev_rstctl((struct qdf_pfm_hndl *)&pdev->dev,
|
||||||
|
"wifi_radio_cold", &vrstctl);
|
||||||
|
reset_ctl = (struct reset_control *)vrstctl;
|
||||||
if (IS_ERR(reset_ctl)) {
|
if (IS_ERR(reset_ctl)) {
|
||||||
HIF_INFO("%s: Failed to get radio cold reset control\n",
|
HIF_INFO("%s: Failed to get radio cold reset control\n",
|
||||||
__func__);
|
__func__);
|
||||||
ret = PTR_ERR(reset_ctl);
|
ret = PTR_ERR(reset_ctl);
|
||||||
goto err_reset;
|
goto err_reset;
|
||||||
}
|
}
|
||||||
reset_control_deassert(reset_ctl);
|
qal_vbus_deactivate_dev_rstctl((struct qdf_pfm_hndl *)&pdev->dev,
|
||||||
reset_control_put(reset_ctl);
|
(struct qdf_vbus_rstctl *)reset_ctl);
|
||||||
|
qal_vbus_release_dev_rstctl((struct qdf_pfm_hndl *)&pdev->dev,
|
||||||
|
(struct qdf_vbus_rstctl *)reset_ctl);
|
||||||
|
|
||||||
/* De-assert radio warm reset */
|
/* De-assert radio warm reset */
|
||||||
reset_ctl = reset_control_get(&pdev->dev, "wifi_radio_warm");
|
qal_vbus_get_dev_rstctl((struct qdf_pfm_hndl *)&pdev->dev,
|
||||||
|
"wifi_radio_warm", &vrstctl);
|
||||||
|
reset_ctl = (struct reset_control *)vrstctl;
|
||||||
if (IS_ERR(reset_ctl)) {
|
if (IS_ERR(reset_ctl)) {
|
||||||
HIF_INFO("%s: Failed to get radio warm reset control\n",
|
HIF_INFO("%s: Failed to get radio warm reset control\n",
|
||||||
__func__);
|
__func__);
|
||||||
ret = PTR_ERR(reset_ctl);
|
ret = PTR_ERR(reset_ctl);
|
||||||
goto err_reset;
|
goto err_reset;
|
||||||
}
|
}
|
||||||
reset_control_deassert(reset_ctl);
|
qal_vbus_deactivate_dev_rstctl((struct qdf_pfm_hndl *)&pdev->dev,
|
||||||
reset_control_put(reset_ctl);
|
(struct qdf_vbus_rstctl *)reset_ctl);
|
||||||
|
qal_vbus_release_dev_rstctl((struct qdf_pfm_hndl *)&pdev->dev,
|
||||||
|
(struct qdf_vbus_rstctl *)reset_ctl);
|
||||||
|
|
||||||
/* De-assert radio srif reset */
|
/* De-assert radio srif reset */
|
||||||
reset_ctl = reset_control_get(&pdev->dev, "wifi_radio_srif");
|
qal_vbus_get_dev_rstctl((struct qdf_pfm_hndl *)&pdev->dev,
|
||||||
|
"wifi_radio_srif", &vrstctl);
|
||||||
|
reset_ctl = (struct reset_control *)vrstctl;
|
||||||
if (IS_ERR(reset_ctl)) {
|
if (IS_ERR(reset_ctl)) {
|
||||||
HIF_INFO("%s: Failed to get radio srif reset control\n",
|
HIF_INFO("%s: Failed to get radio srif reset control\n",
|
||||||
__func__);
|
__func__);
|
||||||
ret = PTR_ERR(reset_ctl);
|
ret = PTR_ERR(reset_ctl);
|
||||||
goto err_reset;
|
goto err_reset;
|
||||||
}
|
}
|
||||||
reset_control_deassert(reset_ctl);
|
qal_vbus_deactivate_dev_rstctl((struct qdf_pfm_hndl *)&pdev->dev,
|
||||||
reset_control_put(reset_ctl);
|
(struct qdf_vbus_rstctl *)reset_ctl);
|
||||||
|
qal_vbus_release_dev_rstctl((struct qdf_pfm_hndl *)&pdev->dev,
|
||||||
|
(struct qdf_vbus_rstctl *)reset_ctl);
|
||||||
|
|
||||||
/* De-assert target CPU reset */
|
/* De-assert target CPU reset */
|
||||||
reset_ctl = reset_control_get(&pdev->dev, "wifi_cpu_init");
|
qal_vbus_get_dev_rstctl((struct qdf_pfm_hndl *)&pdev->dev,
|
||||||
|
"wifi_cpu_init", &vrstctl);
|
||||||
|
reset_ctl = (struct reset_control *)vrstctl;
|
||||||
if (IS_ERR(reset_ctl)) {
|
if (IS_ERR(reset_ctl)) {
|
||||||
HIF_INFO("%s: Failed to get cpu init reset control", __func__);
|
HIF_INFO("%s: Failed to get cpu init reset control", __func__);
|
||||||
ret = PTR_ERR(reset_ctl);
|
ret = PTR_ERR(reset_ctl);
|
||||||
goto err_reset;
|
goto err_reset;
|
||||||
}
|
}
|
||||||
reset_control_deassert(reset_ctl);
|
qal_vbus_activate_dev_rstctl((struct qdf_pfm_hndl *)&pdev->dev,
|
||||||
reset_control_put(reset_ctl);
|
(struct qdf_vbus_rstctl *)reset_ctl);
|
||||||
|
qal_vbus_deactivate_dev_rstctl((struct qdf_pfm_hndl *)&pdev->dev,
|
||||||
|
(struct qdf_vbus_rstctl *)reset_ctl);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
@@ -282,6 +302,7 @@ void hif_ahb_device_reset(struct hif_softc *scn)
|
|||||||
uint32_t wifi_core_id = 0XFFFFFFFF;
|
uint32_t wifi_core_id = 0XFFFFFFFF;
|
||||||
uint32_t reg_value;
|
uint32_t reg_value;
|
||||||
int wait_limit = ATH_AHB_RESET_WAIT_MAX;
|
int wait_limit = ATH_AHB_RESET_WAIT_MAX;
|
||||||
|
struct qdf_vbus_rstctl *vrstctl = NULL;
|
||||||
|
|
||||||
|
|
||||||
wifi_core_id = hif_read32_mb(sc, sc->mem +
|
wifi_core_id = hif_read32_mb(sc, sc->mem +
|
||||||
@@ -313,14 +334,17 @@ void hif_ahb_device_reset(struct hif_softc *scn)
|
|||||||
reg_value = hif_read32_mb(sc, mem_tcsr + glb_cfg_offset);
|
reg_value = hif_read32_mb(sc, mem_tcsr + glb_cfg_offset);
|
||||||
hif_write32_mb(sc, mem_tcsr + glb_cfg_offset, reg_value | (1 << 25));
|
hif_write32_mb(sc, mem_tcsr + glb_cfg_offset, reg_value | (1 << 25));
|
||||||
|
|
||||||
core_resetctl = reset_control_get(&pdev->dev, AHB_RESET_TYPE);
|
qal_vbus_get_dev_rstctl((struct qdf_pfm_hndl *)&pdev->dev,
|
||||||
|
AHB_RESET_TYPE, &vrstctl);
|
||||||
|
core_resetctl = (struct reset_control *)vrstctl;
|
||||||
if (IS_ERR(core_resetctl)) {
|
if (IS_ERR(core_resetctl)) {
|
||||||
HIF_INFO("Failed to get wifi core cold reset control\n");
|
HIF_INFO("Failed to get wifi core cold reset control\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Reset wifi core */
|
/* Reset wifi core */
|
||||||
reset_control_assert(core_resetctl);
|
qal_vbus_activate_dev_rstctl((struct qdf_pfm_hndl *)&pdev->dev,
|
||||||
|
(struct qdf_vbus_rstctl *)core_resetctl);
|
||||||
|
|
||||||
/* TBD: Check if we should also assert other bits (radio_cold, radio_
|
/* TBD: Check if we should also assert other bits (radio_cold, radio_
|
||||||
* warm, radio_srif, cpu_ini)
|
* warm, radio_srif, cpu_ini)
|
||||||
@@ -328,47 +352,63 @@ void hif_ahb_device_reset(struct hif_softc *scn)
|
|||||||
qdf_mdelay(1); /* TBD: Get reqd delay from HW team */
|
qdf_mdelay(1); /* TBD: Get reqd delay from HW team */
|
||||||
|
|
||||||
/* Assert radio cold reset */
|
/* Assert radio cold reset */
|
||||||
resetctl = reset_control_get(&pdev->dev, "wifi_radio_cold");
|
qal_vbus_get_dev_rstctl((struct qdf_pfm_hndl *)&pdev->dev,
|
||||||
|
"wifi_radio_cold", &vrstctl);
|
||||||
|
resetctl = (struct reset_control *)vrstctl;
|
||||||
if (IS_ERR(resetctl)) {
|
if (IS_ERR(resetctl)) {
|
||||||
HIF_INFO("%s: Failed to get radio cold reset control\n",
|
HIF_INFO("%s: Failed to get radio cold reset control\n",
|
||||||
__func__);
|
__func__);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
reset_control_assert(resetctl);
|
qal_vbus_activate_dev_rstctl((struct qdf_pfm_hndl *)&pdev->dev,
|
||||||
|
(struct qdf_vbus_rstctl *)resetctl);
|
||||||
qdf_mdelay(1); /* TBD: Get reqd delay from HW team */
|
qdf_mdelay(1); /* TBD: Get reqd delay from HW team */
|
||||||
reset_control_put(resetctl);
|
qal_vbus_release_dev_rstctl((struct qdf_pfm_hndl *)&pdev->dev,
|
||||||
|
(struct qdf_vbus_rstctl *)resetctl);
|
||||||
|
|
||||||
/* Assert radio warm reset */
|
/* Assert radio warm reset */
|
||||||
resetctl = reset_control_get(&pdev->dev, "wifi_radio_warm");
|
qal_vbus_get_dev_rstctl((struct qdf_pfm_hndl *)&pdev->dev,
|
||||||
|
"wifi_radio_warm", &vrstctl);
|
||||||
|
resetctl = (struct reset_control *)vrstctl;
|
||||||
if (IS_ERR(resetctl)) {
|
if (IS_ERR(resetctl)) {
|
||||||
HIF_INFO("%s: Failed to get radio warm reset control\n",
|
HIF_INFO("%s: Failed to get radio warm reset control\n",
|
||||||
__func__);
|
__func__);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
reset_control_assert(resetctl);
|
qal_vbus_activate_dev_rstctl((struct qdf_pfm_hndl *)&pdev->dev,
|
||||||
|
(struct qdf_vbus_rstctl *)resetctl);
|
||||||
qdf_mdelay(1); /* TBD: Get reqd delay from HW team */
|
qdf_mdelay(1); /* TBD: Get reqd delay from HW team */
|
||||||
reset_control_put(resetctl);
|
qal_vbus_release_dev_rstctl((struct qdf_pfm_hndl *)&pdev->dev,
|
||||||
|
(struct qdf_vbus_rstctl *)resetctl);
|
||||||
|
|
||||||
/* Assert radio srif reset */
|
/* Assert radio srif reset */
|
||||||
resetctl = reset_control_get(&pdev->dev, "wifi_radio_srif");
|
qal_vbus_get_dev_rstctl((struct qdf_pfm_hndl *)&pdev->dev,
|
||||||
|
"wifi_radio_srif", &vrstctl);
|
||||||
|
resetctl = (struct reset_control *)vrstctl;
|
||||||
if (IS_ERR(resetctl)) {
|
if (IS_ERR(resetctl)) {
|
||||||
HIF_INFO("%s: Failed to get radio srif reset control\n",
|
HIF_INFO("%s: Failed to get radio srif reset control\n",
|
||||||
__func__);
|
__func__);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
reset_control_assert(resetctl);
|
qal_vbus_activate_dev_rstctl((struct qdf_pfm_hndl *)&pdev->dev,
|
||||||
|
(struct qdf_vbus_rstctl *)resetctl);
|
||||||
qdf_mdelay(1); /* TBD: Get reqd delay from HW team */
|
qdf_mdelay(1); /* TBD: Get reqd delay from HW team */
|
||||||
reset_control_put(resetctl);
|
qal_vbus_release_dev_rstctl((struct qdf_pfm_hndl *)&pdev->dev,
|
||||||
|
(struct qdf_vbus_rstctl *)resetctl);
|
||||||
|
|
||||||
/* Assert target CPU reset */
|
/* Assert target CPU reset */
|
||||||
resetctl = reset_control_get(&pdev->dev, "wifi_cpu_init");
|
qal_vbus_get_dev_rstctl((struct qdf_pfm_hndl *)&pdev->dev,
|
||||||
|
"wifi_cpu_init", &vrstctl);
|
||||||
|
resetctl = (struct reset_control *)vrstctl;
|
||||||
if (IS_ERR(resetctl)) {
|
if (IS_ERR(resetctl)) {
|
||||||
HIF_INFO("%s: Failed to get cpu init reset control", __func__);
|
HIF_INFO("%s: Failed to get cpu init reset control", __func__);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
reset_control_assert(resetctl);
|
qal_vbus_activate_dev_rstctl((struct qdf_pfm_hndl *)&pdev->dev,
|
||||||
|
(struct qdf_vbus_rstctl *)resetctl);
|
||||||
qdf_mdelay(10); /* TBD: Get reqd delay from HW team */
|
qdf_mdelay(10); /* TBD: Get reqd delay from HW team */
|
||||||
reset_control_put(resetctl);
|
qal_vbus_release_dev_rstctl((struct qdf_pfm_hndl *)&pdev->dev,
|
||||||
|
(struct qdf_vbus_rstctl *)resetctl);
|
||||||
|
|
||||||
/* Clear gbl_cfg and haltreq before clearing Wifi core reset */
|
/* Clear gbl_cfg and haltreq before clearing Wifi core reset */
|
||||||
reg_value = hif_read32_mb(sc, mem_tcsr + haltreq_offset);
|
reg_value = hif_read32_mb(sc, mem_tcsr + haltreq_offset);
|
||||||
@@ -377,12 +417,14 @@ void hif_ahb_device_reset(struct hif_softc *scn)
|
|||||||
hif_write32_mb(sc, mem_tcsr + glb_cfg_offset, reg_value & ~(1 << 25));
|
hif_write32_mb(sc, mem_tcsr + glb_cfg_offset, reg_value & ~(1 << 25));
|
||||||
|
|
||||||
/* de-assert wifi core reset */
|
/* de-assert wifi core reset */
|
||||||
reset_control_deassert(core_resetctl);
|
qal_vbus_deactivate_dev_rstctl((struct qdf_pfm_hndl *)&pdev->dev,
|
||||||
|
(struct qdf_vbus_rstctl *)core_resetctl);
|
||||||
|
|
||||||
qdf_mdelay(1); /* TBD: Get reqd delay from HW team */
|
qdf_mdelay(1); /* TBD: Get reqd delay from HW team */
|
||||||
|
|
||||||
/* TBD: Check if we should de-assert other bits here */
|
/* TBD: Check if we should de-assert other bits here */
|
||||||
reset_control_put(core_resetctl);
|
qal_vbus_release_dev_rstctl((struct qdf_pfm_hndl *)&pdev->dev,
|
||||||
|
(struct qdf_vbus_rstctl *)core_resetctl);
|
||||||
iounmap(mem_tcsr);
|
iounmap(mem_tcsr);
|
||||||
HIF_INFO("Reset complete for wifi core id : %d\n", wifi_core_id);
|
HIF_INFO("Reset complete for wifi core id : %d\n", wifi_core_id);
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user