Loading drivers/net/wireless/cnss2/main.c +38 −1 Original line number Diff line number Diff line Loading @@ -1195,9 +1195,44 @@ void cnss_schedule_recovery(struct device *dev, } EXPORT_SYMBOL(cnss_schedule_recovery); int cnss_force_fw_assert_async(struct device *dev) { struct cnss_plat_data *plat_priv = cnss_bus_dev_to_plat_priv(dev); if (!plat_priv) { cnss_pr_err("plat_priv is NULL\n"); return -ENODEV; } if (plat_priv->device_id == QCA6174_DEVICE_ID) { cnss_pr_info("Forced FW assert is not supported\n"); return -EOPNOTSUPP; } if (cnss_bus_is_device_down(plat_priv)) { cnss_pr_info("Device is already in bad state, ignore force assert\n"); return 0; } if (test_bit(CNSS_DRIVER_RECOVERY, &plat_priv->driver_state)) { cnss_pr_info("Recovery is already in progress, ignore forced FW assert\n"); return 0; } cnss_pr_info("Force assert (async)\n"); cnss_driver_event_post(plat_priv, CNSS_DRIVER_EVENT_FORCE_FW_ASSERT, 0, NULL); return 0; } EXPORT_SYMBOL(cnss_force_fw_assert_async); int cnss_force_fw_assert(struct device *dev) { struct cnss_plat_data *plat_priv = cnss_bus_dev_to_plat_priv(dev); bool post = (in_interrupt() || irqs_disabled()); if (!plat_priv) { cnss_pr_err("plat_priv is NULL\n"); Loading @@ -1219,7 +1254,9 @@ int cnss_force_fw_assert(struct device *dev) return 0; } if (in_interrupt() || irqs_disabled()) cnss_pr_info("Force assert (%s)\n", post ? "async" : "sync"); if (post) cnss_driver_event_post(plat_priv, CNSS_DRIVER_EVENT_FORCE_FW_ASSERT, 0, NULL); Loading drivers/net/wireless/cnss2/pci.c +8 −0 Original line number Diff line number Diff line Loading @@ -1098,6 +1098,10 @@ static int cnss_pci_set_mhi_state(struct cnss_pci_data *pci_priv, out: cnss_pr_err("Failed to set MHI state: %s(%d)\n", cnss_mhi_state_to_str(mhi_state), mhi_state); if (mhi_state == CNSS_MHI_RESUME) cnss_force_fw_assert_async(&pci_priv->pci_dev->dev); return ret; } Loading Loading @@ -2477,7 +2481,9 @@ static int cnss_pci_suspend(struct device *dev) goto clear_flag; if (!pci_priv->disable_pc) { mutex_lock(&pci_priv->bus_lock); ret = cnss_pci_suspend_bus(pci_priv); mutex_unlock(&pci_priv->bus_lock); if (ret) goto resume_driver; } Loading Loading @@ -2516,7 +2522,9 @@ static int cnss_pci_resume(struct device *dev) goto out; if (!pci_priv->disable_pc) { mutex_lock(&pci_priv->bus_lock); ret = cnss_pci_resume_bus(pci_priv); mutex_unlock(&pci_priv->bus_lock); if (ret) goto out; } Loading include/net/cnss2.h +1 −0 Original line number Diff line number Diff line Loading @@ -182,6 +182,7 @@ extern void cnss_schedule_recovery(struct device *dev, extern int cnss_self_recovery(struct device *dev, enum cnss_recovery_reason reason); extern int cnss_force_fw_assert(struct device *dev); extern int cnss_force_fw_assert_async(struct device *dev); extern int cnss_force_collect_rddm(struct device *dev); extern int cnss_qmi_send_get(struct device *dev); extern int cnss_qmi_send_put(struct device *dev); Loading Loading
drivers/net/wireless/cnss2/main.c +38 −1 Original line number Diff line number Diff line Loading @@ -1195,9 +1195,44 @@ void cnss_schedule_recovery(struct device *dev, } EXPORT_SYMBOL(cnss_schedule_recovery); int cnss_force_fw_assert_async(struct device *dev) { struct cnss_plat_data *plat_priv = cnss_bus_dev_to_plat_priv(dev); if (!plat_priv) { cnss_pr_err("plat_priv is NULL\n"); return -ENODEV; } if (plat_priv->device_id == QCA6174_DEVICE_ID) { cnss_pr_info("Forced FW assert is not supported\n"); return -EOPNOTSUPP; } if (cnss_bus_is_device_down(plat_priv)) { cnss_pr_info("Device is already in bad state, ignore force assert\n"); return 0; } if (test_bit(CNSS_DRIVER_RECOVERY, &plat_priv->driver_state)) { cnss_pr_info("Recovery is already in progress, ignore forced FW assert\n"); return 0; } cnss_pr_info("Force assert (async)\n"); cnss_driver_event_post(plat_priv, CNSS_DRIVER_EVENT_FORCE_FW_ASSERT, 0, NULL); return 0; } EXPORT_SYMBOL(cnss_force_fw_assert_async); int cnss_force_fw_assert(struct device *dev) { struct cnss_plat_data *plat_priv = cnss_bus_dev_to_plat_priv(dev); bool post = (in_interrupt() || irqs_disabled()); if (!plat_priv) { cnss_pr_err("plat_priv is NULL\n"); Loading @@ -1219,7 +1254,9 @@ int cnss_force_fw_assert(struct device *dev) return 0; } if (in_interrupt() || irqs_disabled()) cnss_pr_info("Force assert (%s)\n", post ? "async" : "sync"); if (post) cnss_driver_event_post(plat_priv, CNSS_DRIVER_EVENT_FORCE_FW_ASSERT, 0, NULL); Loading
drivers/net/wireless/cnss2/pci.c +8 −0 Original line number Diff line number Diff line Loading @@ -1098,6 +1098,10 @@ static int cnss_pci_set_mhi_state(struct cnss_pci_data *pci_priv, out: cnss_pr_err("Failed to set MHI state: %s(%d)\n", cnss_mhi_state_to_str(mhi_state), mhi_state); if (mhi_state == CNSS_MHI_RESUME) cnss_force_fw_assert_async(&pci_priv->pci_dev->dev); return ret; } Loading Loading @@ -2477,7 +2481,9 @@ static int cnss_pci_suspend(struct device *dev) goto clear_flag; if (!pci_priv->disable_pc) { mutex_lock(&pci_priv->bus_lock); ret = cnss_pci_suspend_bus(pci_priv); mutex_unlock(&pci_priv->bus_lock); if (ret) goto resume_driver; } Loading Loading @@ -2516,7 +2522,9 @@ static int cnss_pci_resume(struct device *dev) goto out; if (!pci_priv->disable_pc) { mutex_lock(&pci_priv->bus_lock); ret = cnss_pci_resume_bus(pci_priv); mutex_unlock(&pci_priv->bus_lock); if (ret) goto out; } Loading
include/net/cnss2.h +1 −0 Original line number Diff line number Diff line Loading @@ -182,6 +182,7 @@ extern void cnss_schedule_recovery(struct device *dev, extern int cnss_self_recovery(struct device *dev, enum cnss_recovery_reason reason); extern int cnss_force_fw_assert(struct device *dev); extern int cnss_force_fw_assert_async(struct device *dev); extern int cnss_force_collect_rddm(struct device *dev); extern int cnss_qmi_send_get(struct device *dev); extern int cnss_qmi_send_put(struct device *dev); Loading