Merge "icnss: Collect ramdump from MSA memory space"
This commit is contained in:
commit
4e2587d3f5
1 changed files with 31 additions and 4 deletions
|
@ -45,6 +45,7 @@
|
||||||
#include <soc/qcom/service-locator.h>
|
#include <soc/qcom/service-locator.h>
|
||||||
#include <soc/qcom/service-notifier.h>
|
#include <soc/qcom/service-notifier.h>
|
||||||
#include <soc/qcom/socinfo.h>
|
#include <soc/qcom/socinfo.h>
|
||||||
|
#include <soc/qcom/ramdump.h>
|
||||||
|
|
||||||
#include "wlan_firmware_service_v01.h"
|
#include "wlan_firmware_service_v01.h"
|
||||||
|
|
||||||
|
@ -463,6 +464,7 @@ static struct icnss_priv {
|
||||||
struct qpnp_vadc_chip *vadc_dev;
|
struct qpnp_vadc_chip *vadc_dev;
|
||||||
uint64_t vph_pwr;
|
uint64_t vph_pwr;
|
||||||
atomic_t pm_count;
|
atomic_t pm_count;
|
||||||
|
struct ramdump_device *msa0_dump_dev;
|
||||||
} *penv;
|
} *penv;
|
||||||
|
|
||||||
static void icnss_hw_write_reg(void *base, u32 offset, u32 val)
|
static void icnss_hw_write_reg(void *base, u32 offset, u32 val)
|
||||||
|
@ -2657,8 +2659,6 @@ static int icnss_driver_event_pd_service_down(struct icnss_priv *priv,
|
||||||
out:
|
out:
|
||||||
ret = icnss_hw_power_off(priv);
|
ret = icnss_hw_power_off(priv);
|
||||||
|
|
||||||
icnss_remove_msa_permissions(priv);
|
|
||||||
|
|
||||||
kfree(data);
|
kfree(data);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -2763,6 +2763,16 @@ static int icnss_qmi_wlfw_clnt_svc_event_notify(struct notifier_block *this,
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int icnss_msa0_ramdump(struct icnss_priv *priv)
|
||||||
|
{
|
||||||
|
struct ramdump_segment segment;
|
||||||
|
|
||||||
|
memset(&segment, 0, sizeof(segment));
|
||||||
|
segment.v_address = priv->msa_va;
|
||||||
|
segment.size = priv->msa_mem_size;
|
||||||
|
return do_ramdump(priv->msa0_dump_dev, &segment, 1);
|
||||||
|
}
|
||||||
|
|
||||||
static struct notifier_block wlfw_clnt_nb = {
|
static struct notifier_block wlfw_clnt_nb = {
|
||||||
.notifier_call = icnss_qmi_wlfw_clnt_svc_event_notify,
|
.notifier_call = icnss_qmi_wlfw_clnt_svc_event_notify,
|
||||||
};
|
};
|
||||||
|
@ -2778,9 +2788,19 @@ static int icnss_modem_notifier_nb(struct notifier_block *nb,
|
||||||
|
|
||||||
icnss_pr_dbg("Modem-Notify: event %lu\n", code);
|
icnss_pr_dbg("Modem-Notify: event %lu\n", code);
|
||||||
|
|
||||||
|
if (code == SUBSYS_AFTER_SHUTDOWN) {
|
||||||
|
icnss_remove_msa_permissions(priv);
|
||||||
|
icnss_pr_info("Collecting msa0 segment dump\n");
|
||||||
|
icnss_msa0_ramdump(priv);
|
||||||
|
return NOTIFY_OK;
|
||||||
|
}
|
||||||
|
|
||||||
if (code != SUBSYS_BEFORE_SHUTDOWN)
|
if (code != SUBSYS_BEFORE_SHUTDOWN)
|
||||||
return NOTIFY_OK;
|
return NOTIFY_OK;
|
||||||
|
|
||||||
|
if (test_bit(ICNSS_PDR_ENABLED, &priv->state))
|
||||||
|
return NOTIFY_OK;
|
||||||
|
|
||||||
icnss_pr_info("Modem went down, state: %lx\n", priv->state);
|
icnss_pr_info("Modem went down, state: %lx\n", priv->state);
|
||||||
|
|
||||||
event_data = kzalloc(sizeof(*data), GFP_KERNEL);
|
event_data = kzalloc(sizeof(*data), GFP_KERNEL);
|
||||||
|
@ -2936,8 +2956,6 @@ static int icnss_get_service_location_notify(struct notifier_block *nb,
|
||||||
|
|
||||||
set_bit(ICNSS_PDR_ENABLED, &priv->state);
|
set_bit(ICNSS_PDR_ENABLED, &priv->state);
|
||||||
|
|
||||||
icnss_modem_ssr_unregister_notifier(priv);
|
|
||||||
|
|
||||||
icnss_pr_dbg("PD restart enabled, state: 0x%lx\n", priv->state);
|
icnss_pr_dbg("PD restart enabled, state: 0x%lx\n", priv->state);
|
||||||
|
|
||||||
return NOTIFY_OK;
|
return NOTIFY_OK;
|
||||||
|
@ -3000,6 +3018,11 @@ static int icnss_enable_recovery(struct icnss_priv *priv)
|
||||||
goto enable_pdr;
|
goto enable_pdr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
priv->msa0_dump_dev = create_ramdump_device("wcss_msa0",
|
||||||
|
&priv->pdev->dev);
|
||||||
|
if (!priv->msa0_dump_dev)
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
icnss_modem_ssr_register_notifier(priv);
|
icnss_modem_ssr_register_notifier(priv);
|
||||||
if (test_bit(SSR_ONLY, &quirks)) {
|
if (test_bit(SSR_ONLY, &quirks)) {
|
||||||
icnss_pr_dbg("PDR disabled through module parameter\n");
|
icnss_pr_dbg("PDR disabled through module parameter\n");
|
||||||
|
@ -4511,6 +4534,8 @@ static int icnss_remove(struct platform_device *pdev)
|
||||||
|
|
||||||
icnss_modem_ssr_unregister_notifier(penv);
|
icnss_modem_ssr_unregister_notifier(penv);
|
||||||
|
|
||||||
|
destroy_ramdump_device(penv->msa0_dump_dev);
|
||||||
|
|
||||||
icnss_pdr_unregister_notifier(penv);
|
icnss_pdr_unregister_notifier(penv);
|
||||||
|
|
||||||
qmi_svc_event_notifier_unregister(WLFW_SERVICE_ID_V01,
|
qmi_svc_event_notifier_unregister(WLFW_SERVICE_ID_V01,
|
||||||
|
@ -4522,6 +4547,8 @@ static int icnss_remove(struct platform_device *pdev)
|
||||||
|
|
||||||
icnss_hw_power_off(penv);
|
icnss_hw_power_off(penv);
|
||||||
|
|
||||||
|
icnss_remove_msa_permissions(penv);
|
||||||
|
|
||||||
dev_set_drvdata(&pdev->dev, NULL);
|
dev_set_drvdata(&pdev->dev, NULL);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
Loading…
Add table
Reference in a new issue