Loading drivers/net/wireless/cnss2/main.c +35 −0 Original line number Diff line number Diff line Loading @@ -1037,6 +1037,41 @@ int cnss_force_fw_assert(struct device *dev) } EXPORT_SYMBOL(cnss_force_fw_assert); int cnss_force_collect_rddm(struct device *dev) { struct cnss_plat_data *plat_priv = cnss_bus_dev_to_plat_priv(dev); int ret = 0; if (!plat_priv) { cnss_pr_err("plat_priv is NULL\n"); return -ENODEV; } if (plat_priv->device_id == QCA6174_DEVICE_ID) { cnss_pr_info("Force collect rddm is not supported\n"); return -EOPNOTSUPP; } if (test_bit(CNSS_DRIVER_RECOVERY, &plat_priv->driver_state)) { cnss_pr_info("Recovery is already in progress, ignore forced collect rddm\n"); return 0; } cnss_driver_event_post(plat_priv, CNSS_DRIVER_EVENT_FORCE_FW_ASSERT, 0, NULL); reinit_completion(&plat_priv->rddm_complete); ret = wait_for_completion_timeout (&plat_priv->rddm_complete, msecs_to_jiffies(CNSS_RDDM_TIMEOUT_MS)); if (!ret) ret = -ETIMEDOUT; return ret; } EXPORT_SYMBOL(cnss_force_collect_rddm); static int cnss_cold_boot_cal_start_hdlr(struct cnss_plat_data *plat_priv) { int ret = 0; Loading drivers/net/wireless/cnss2/main.h +2 −0 Original line number Diff line number Diff line Loading @@ -26,6 +26,7 @@ #define MAX_NO_OF_MAC_ADDR 4 #define QMI_WLFW_MAX_TIMESTAMP_LEN 32 #define QMI_WLFW_MAX_NUM_MEM_SEG 32 #define CNSS_RDDM_TIMEOUT_MS 20000 #define CNSS_EVENT_SYNC BIT(0) #define CNSS_EVENT_UNINTERRUPTIBLE BIT(1) Loading Loading @@ -251,6 +252,7 @@ struct cnss_plat_data { u8 *diag_reg_read_buf; bool cal_done; char firmware_name[13]; struct completion rddm_complete; }; struct cnss_plat_data *cnss_get_plat_priv(struct platform_device *plat_dev); Loading drivers/net/wireless/cnss2/pci.c +25 −0 Original line number Diff line number Diff line Loading @@ -17,6 +17,7 @@ #include <linux/of.h> #include <linux/pm_runtime.h> #include <linux/memblock.h> #include <linux/completion.h> #include <soc/qcom/ramdump.h> #include "main.h" Loading Loading @@ -554,6 +555,11 @@ static void cnss_qca6290_crash_shutdown(struct cnss_pci_data *pci_priv) return; } if (test_bit(CNSS_MHI_RDDM_DONE, &plat_priv->driver_state)) { cnss_pr_dbg("RDDM already collected, return\n"); return; } cnss_pci_collect_dump_info(pci_priv, true); } Loading Loading @@ -1529,6 +1535,12 @@ int cnss_pci_force_fw_assert_hdlr(struct cnss_pci_data *pci_priv) if (!plat_priv) return -ENODEV; if (test_bit(CNSS_MHI_RDDM_DONE, &pci_priv->mhi_state)) { cnss_pr_err("RDDM already collected 0x%x, return\n", pci_priv->mhi_state); return 0; } ret = cnss_pci_set_mhi_state(pci_priv, CNSS_MHI_TRIGGER_RDDM); if (ret) { cnss_pr_err("Failed to trigger RDDM, err = %d\n", ret); Loading Loading @@ -1907,6 +1919,8 @@ static char *cnss_mhi_state_to_str(enum cnss_mhi_state mhi_state) return "RESUME"; case CNSS_MHI_TRIGGER_RDDM: return "TRIGGER_RDDM"; case CNSS_MHI_RDDM_DONE: return "RDDM_DONE"; default: return "UNKNOWN"; } Loading Loading @@ -1983,6 +1997,9 @@ void cnss_pci_collect_dump_info(struct cnss_pci_data *pci_priv, bool in_panic) if (dump_data->nentries > 0) plat_priv->ramdump_info_v2.dump_data_valid = true; cnss_pci_set_mhi_state(pci_priv, CNSS_MHI_RDDM_DONE); complete(&plat_priv->rddm_complete); } void cnss_pci_clear_dump_info(struct cnss_pci_data *pci_priv) Loading Loading @@ -2188,6 +2205,8 @@ static int cnss_pci_check_mhi_state_bit(struct cnss_pci_data *pci_priv, !test_bit(CNSS_MHI_TRIGGER_RDDM, &pci_priv->mhi_state)) return 0; break; case CNSS_MHI_RDDM_DONE: return 0; default: cnss_pr_err("Unhandled MHI state: %s(%d)\n", cnss_mhi_state_to_str(mhi_state), mhi_state); Loading Loading @@ -2216,6 +2235,7 @@ static void cnss_pci_set_mhi_state_bit(struct cnss_pci_data *pci_priv, case CNSS_MHI_POWER_OFF: case CNSS_MHI_FORCE_POWER_OFF: clear_bit(CNSS_MHI_POWER_ON, &pci_priv->mhi_state); clear_bit(CNSS_MHI_RDDM_DONE, &pci_priv->mhi_state); break; case CNSS_MHI_SUSPEND: set_bit(CNSS_MHI_SUSPEND, &pci_priv->mhi_state); Loading @@ -2225,6 +2245,9 @@ static void cnss_pci_set_mhi_state_bit(struct cnss_pci_data *pci_priv, break; case CNSS_MHI_TRIGGER_RDDM: break; case CNSS_MHI_RDDM_DONE: set_bit(CNSS_MHI_RDDM_DONE, &pci_priv->mhi_state); break; default: cnss_pr_err("Unhandled MHI state (%d)\n", mhi_state); } Loading Loading @@ -2283,6 +2306,8 @@ int cnss_pci_set_mhi_state(struct cnss_pci_data *pci_priv, case CNSS_MHI_TRIGGER_RDDM: ret = mhi_force_rddm_mode(pci_priv->mhi_ctrl); break; case CNSS_MHI_RDDM_DONE: break; default: cnss_pr_err("Unhandled MHI state (%d)\n", mhi_state); ret = -EINVAL; Loading drivers/net/wireless/cnss2/pci.h +1 −0 Original line number Diff line number Diff line Loading @@ -31,6 +31,7 @@ enum cnss_mhi_state { CNSS_MHI_RESUME, CNSS_MHI_TRIGGER_RDDM, CNSS_MHI_RDDM, CNSS_MHI_RDDM_DONE, }; struct cnss_msi_user { Loading include/net/cnss2.h +1 −0 Original line number Diff line number Diff line Loading @@ -161,6 +161,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_collect_rddm(struct device *dev); extern void *cnss_get_virt_ramdump_mem(struct device *dev, unsigned long *size); extern int cnss_get_fw_files_for_target(struct device *dev, struct cnss_fw_files *pfw_files, Loading Loading
drivers/net/wireless/cnss2/main.c +35 −0 Original line number Diff line number Diff line Loading @@ -1037,6 +1037,41 @@ int cnss_force_fw_assert(struct device *dev) } EXPORT_SYMBOL(cnss_force_fw_assert); int cnss_force_collect_rddm(struct device *dev) { struct cnss_plat_data *plat_priv = cnss_bus_dev_to_plat_priv(dev); int ret = 0; if (!plat_priv) { cnss_pr_err("plat_priv is NULL\n"); return -ENODEV; } if (plat_priv->device_id == QCA6174_DEVICE_ID) { cnss_pr_info("Force collect rddm is not supported\n"); return -EOPNOTSUPP; } if (test_bit(CNSS_DRIVER_RECOVERY, &plat_priv->driver_state)) { cnss_pr_info("Recovery is already in progress, ignore forced collect rddm\n"); return 0; } cnss_driver_event_post(plat_priv, CNSS_DRIVER_EVENT_FORCE_FW_ASSERT, 0, NULL); reinit_completion(&plat_priv->rddm_complete); ret = wait_for_completion_timeout (&plat_priv->rddm_complete, msecs_to_jiffies(CNSS_RDDM_TIMEOUT_MS)); if (!ret) ret = -ETIMEDOUT; return ret; } EXPORT_SYMBOL(cnss_force_collect_rddm); static int cnss_cold_boot_cal_start_hdlr(struct cnss_plat_data *plat_priv) { int ret = 0; Loading
drivers/net/wireless/cnss2/main.h +2 −0 Original line number Diff line number Diff line Loading @@ -26,6 +26,7 @@ #define MAX_NO_OF_MAC_ADDR 4 #define QMI_WLFW_MAX_TIMESTAMP_LEN 32 #define QMI_WLFW_MAX_NUM_MEM_SEG 32 #define CNSS_RDDM_TIMEOUT_MS 20000 #define CNSS_EVENT_SYNC BIT(0) #define CNSS_EVENT_UNINTERRUPTIBLE BIT(1) Loading Loading @@ -251,6 +252,7 @@ struct cnss_plat_data { u8 *diag_reg_read_buf; bool cal_done; char firmware_name[13]; struct completion rddm_complete; }; struct cnss_plat_data *cnss_get_plat_priv(struct platform_device *plat_dev); Loading
drivers/net/wireless/cnss2/pci.c +25 −0 Original line number Diff line number Diff line Loading @@ -17,6 +17,7 @@ #include <linux/of.h> #include <linux/pm_runtime.h> #include <linux/memblock.h> #include <linux/completion.h> #include <soc/qcom/ramdump.h> #include "main.h" Loading Loading @@ -554,6 +555,11 @@ static void cnss_qca6290_crash_shutdown(struct cnss_pci_data *pci_priv) return; } if (test_bit(CNSS_MHI_RDDM_DONE, &plat_priv->driver_state)) { cnss_pr_dbg("RDDM already collected, return\n"); return; } cnss_pci_collect_dump_info(pci_priv, true); } Loading Loading @@ -1529,6 +1535,12 @@ int cnss_pci_force_fw_assert_hdlr(struct cnss_pci_data *pci_priv) if (!plat_priv) return -ENODEV; if (test_bit(CNSS_MHI_RDDM_DONE, &pci_priv->mhi_state)) { cnss_pr_err("RDDM already collected 0x%x, return\n", pci_priv->mhi_state); return 0; } ret = cnss_pci_set_mhi_state(pci_priv, CNSS_MHI_TRIGGER_RDDM); if (ret) { cnss_pr_err("Failed to trigger RDDM, err = %d\n", ret); Loading Loading @@ -1907,6 +1919,8 @@ static char *cnss_mhi_state_to_str(enum cnss_mhi_state mhi_state) return "RESUME"; case CNSS_MHI_TRIGGER_RDDM: return "TRIGGER_RDDM"; case CNSS_MHI_RDDM_DONE: return "RDDM_DONE"; default: return "UNKNOWN"; } Loading Loading @@ -1983,6 +1997,9 @@ void cnss_pci_collect_dump_info(struct cnss_pci_data *pci_priv, bool in_panic) if (dump_data->nentries > 0) plat_priv->ramdump_info_v2.dump_data_valid = true; cnss_pci_set_mhi_state(pci_priv, CNSS_MHI_RDDM_DONE); complete(&plat_priv->rddm_complete); } void cnss_pci_clear_dump_info(struct cnss_pci_data *pci_priv) Loading Loading @@ -2188,6 +2205,8 @@ static int cnss_pci_check_mhi_state_bit(struct cnss_pci_data *pci_priv, !test_bit(CNSS_MHI_TRIGGER_RDDM, &pci_priv->mhi_state)) return 0; break; case CNSS_MHI_RDDM_DONE: return 0; default: cnss_pr_err("Unhandled MHI state: %s(%d)\n", cnss_mhi_state_to_str(mhi_state), mhi_state); Loading Loading @@ -2216,6 +2235,7 @@ static void cnss_pci_set_mhi_state_bit(struct cnss_pci_data *pci_priv, case CNSS_MHI_POWER_OFF: case CNSS_MHI_FORCE_POWER_OFF: clear_bit(CNSS_MHI_POWER_ON, &pci_priv->mhi_state); clear_bit(CNSS_MHI_RDDM_DONE, &pci_priv->mhi_state); break; case CNSS_MHI_SUSPEND: set_bit(CNSS_MHI_SUSPEND, &pci_priv->mhi_state); Loading @@ -2225,6 +2245,9 @@ static void cnss_pci_set_mhi_state_bit(struct cnss_pci_data *pci_priv, break; case CNSS_MHI_TRIGGER_RDDM: break; case CNSS_MHI_RDDM_DONE: set_bit(CNSS_MHI_RDDM_DONE, &pci_priv->mhi_state); break; default: cnss_pr_err("Unhandled MHI state (%d)\n", mhi_state); } Loading Loading @@ -2283,6 +2306,8 @@ int cnss_pci_set_mhi_state(struct cnss_pci_data *pci_priv, case CNSS_MHI_TRIGGER_RDDM: ret = mhi_force_rddm_mode(pci_priv->mhi_ctrl); break; case CNSS_MHI_RDDM_DONE: break; default: cnss_pr_err("Unhandled MHI state (%d)\n", mhi_state); ret = -EINVAL; Loading
drivers/net/wireless/cnss2/pci.h +1 −0 Original line number Diff line number Diff line Loading @@ -31,6 +31,7 @@ enum cnss_mhi_state { CNSS_MHI_RESUME, CNSS_MHI_TRIGGER_RDDM, CNSS_MHI_RDDM, CNSS_MHI_RDDM_DONE, }; struct cnss_msi_user { Loading
include/net/cnss2.h +1 −0 Original line number Diff line number Diff line Loading @@ -161,6 +161,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_collect_rddm(struct device *dev); extern void *cnss_get_virt_ramdump_mem(struct device *dev, unsigned long *size); extern int cnss_get_fw_files_for_target(struct device *dev, struct cnss_fw_files *pfw_files, Loading