Loading drivers/net/wireless/cnss2/main.c +32 −25 Original line number Diff line number Diff line Loading @@ -473,7 +473,7 @@ static int cnss_fw_ready_hdlr(struct cnss_plat_data *plat_priv) if (!pci_priv) return -ENODEV; if (plat_priv->driver_status == CNSS_LOAD_UNLOAD) if (test_bit(CNSS_DRIVER_LOAD_UNLOAD, &plat_priv->driver_state)) complete(&plat_priv->fw_ready_event); else ret = cnss_wlfw_wlan_mode_send_sync(plat_priv, Loading Loading @@ -740,7 +740,7 @@ int cnss_wlan_register_driver(struct cnss_wlan_driver *driver_ops) goto out; } plat_priv->driver_status = CNSS_LOAD_UNLOAD; set_bit(CNSS_DRIVER_LOAD_UNLOAD, &plat_priv->driver_state); plat_priv->driver_ops = driver_ops; subsys_info = &plat_priv->subsys_info; Loading @@ -754,12 +754,10 @@ int cnss_wlan_register_driver(struct cnss_wlan_driver *driver_ops) goto reset_ctx; } plat_priv->driver_status = CNSS_INITIALIZED; return 0; reset_ctx: cnss_pr_err("Failed to get subsystem, err = %d\n", ret); plat_priv->driver_status = CNSS_UNINITIALIZED; clear_bit(CNSS_DRIVER_LOAD_UNLOAD, &plat_priv->driver_state); plat_priv->driver_ops = NULL; out: return ret; Loading @@ -776,12 +774,11 @@ void cnss_wlan_unregister_driver(struct cnss_wlan_driver *driver_ops) return; } plat_priv->driver_status = CNSS_LOAD_UNLOAD; set_bit(CNSS_DRIVER_LOAD_UNLOAD, &plat_priv->driver_state); subsys_info = &plat_priv->subsys_info; subsystem_put(subsys_info->subsys_handle); subsys_info->subsys_handle = NULL; plat_priv->driver_ops = NULL; plat_priv->driver_status = CNSS_UNINITIALIZED; } EXPORT_SYMBOL(cnss_wlan_unregister_driver); Loading Loading @@ -941,7 +938,7 @@ static int cnss_qca6174_powerup(struct cnss_plat_data *plat_priv) goto power_off; } if (plat_priv->driver_status == CNSS_LOAD_UNLOAD) { if (test_bit(CNSS_DRIVER_LOAD_UNLOAD, &plat_priv->driver_state)) { ret = plat_priv->driver_ops->probe(pci_priv->pci_dev, pci_priv->pci_device_id); if (ret) { Loading @@ -949,7 +946,9 @@ static int cnss_qca6174_powerup(struct cnss_plat_data *plat_priv) ret); goto suspend_link; } } else if (plat_priv->driver_status == CNSS_RECOVERY) { clear_bit(CNSS_DRIVER_LOAD_UNLOAD, &plat_priv->driver_state); set_bit(CNSS_DRIVER_PROBED, &plat_priv->driver_state); } else if (test_bit(CNSS_DRIVER_RECOVERY, &plat_priv->driver_state)) { ret = plat_priv->driver_ops->reinit(pci_priv->pci_dev, pci_priv->pci_device_id); if (ret) { Loading @@ -957,7 +956,7 @@ static int cnss_qca6174_powerup(struct cnss_plat_data *plat_priv) ret); goto suspend_link; } plat_priv->driver_status = CNSS_INITIALIZED; clear_bit(CNSS_DRIVER_RECOVERY, &plat_priv->driver_state); } else { cnss_pr_err("Driver state is not correct to power up!\n"); ret = -EINVAL; Loading @@ -984,13 +983,13 @@ static int cnss_qca6174_shutdown(struct cnss_plat_data *plat_priv) if (!plat_priv->driver_ops) return -EINVAL; if (plat_priv->driver_status == CNSS_LOAD_UNLOAD) { if (test_bit(CNSS_DRIVER_LOAD_UNLOAD, &plat_priv->driver_state)) { cnss_request_bus_bandwidth(CNSS_BUS_WIDTH_NONE); plat_priv->driver_ops->remove(pci_priv->pci_dev); cnss_pci_set_monitor_wake_intr(pci_priv, false); cnss_pci_set_auto_suspended(pci_priv, 0); } else { plat_priv->driver_status = CNSS_RECOVERY; set_bit(CNSS_DRIVER_RECOVERY, &plat_priv->driver_state); plat_priv->driver_ops->shutdown(pci_priv->pci_dev); } Loading @@ -1000,6 +999,11 @@ static int cnss_qca6174_shutdown(struct cnss_plat_data *plat_priv) cnss_power_off_device(plat_priv); if (test_bit(CNSS_DRIVER_LOAD_UNLOAD, &plat_priv->driver_state)) { clear_bit(CNSS_DRIVER_LOAD_UNLOAD, &plat_priv->driver_state); clear_bit(CNSS_DRIVER_PROBED, &plat_priv->driver_state); } return ret; } Loading Loading @@ -1071,7 +1075,7 @@ skip_fw_ready: goto out; } if (plat_priv->driver_status == CNSS_LOAD_UNLOAD) { if (test_bit(CNSS_DRIVER_LOAD_UNLOAD, &plat_priv->driver_state)) { ret = plat_priv->driver_ops->probe(pci_priv->pci_dev, pci_priv->pci_device_id); if (ret) { Loading @@ -1079,7 +1083,9 @@ skip_fw_ready: ret); goto stop_mhi; } } else if (plat_priv->driver_status == CNSS_RECOVERY) { clear_bit(CNSS_DRIVER_LOAD_UNLOAD, &plat_priv->driver_state); set_bit(CNSS_DRIVER_PROBED, &plat_priv->driver_state); } else if (test_bit(CNSS_DRIVER_RECOVERY, &plat_priv->driver_state)) { ret = plat_priv->driver_ops->reinit(pci_priv->pci_dev, pci_priv->pci_device_id); if (ret) { Loading @@ -1087,15 +1093,13 @@ skip_fw_ready: ret); goto stop_mhi; } plat_priv->driver_status = CNSS_INITIALIZED; clear_bit(CNSS_DRIVER_RECOVERY, &plat_priv->driver_state); } else { cnss_pr_err("Driver state is not correct to power up!\n"); ret = -EINVAL; goto stop_mhi; } set_bit(CNSS_DRIVER_PROBED, &plat_priv->driver_state); return 0; stop_mhi: Loading Loading @@ -1123,18 +1127,16 @@ static int cnss_qca6290_shutdown(struct cnss_plat_data *plat_priv) if (enable_waltest) goto bypass_driver_remove; if (plat_priv->driver_status == CNSS_LOAD_UNLOAD) { if (test_bit(CNSS_DRIVER_LOAD_UNLOAD, &plat_priv->driver_state)) { cnss_request_bus_bandwidth(CNSS_BUS_WIDTH_NONE); plat_priv->driver_ops->remove(pci_priv->pci_dev); cnss_pci_set_monitor_wake_intr(pci_priv, false); cnss_pci_set_auto_suspended(pci_priv, 0); } else { plat_priv->driver_status = CNSS_RECOVERY; set_bit(CNSS_DRIVER_RECOVERY, &plat_priv->driver_state); plat_priv->driver_ops->shutdown(pci_priv->pci_dev); } clear_bit(CNSS_DRIVER_PROBED, &plat_priv->driver_state); bypass_driver_remove: if (!fbc_bypass) cnss_pci_stop_mhi(pci_priv); Loading @@ -1145,6 +1147,11 @@ bypass_driver_remove: cnss_power_off_device(plat_priv); if (test_bit(CNSS_DRIVER_LOAD_UNLOAD, &plat_priv->driver_state)) { clear_bit(CNSS_DRIVER_LOAD_UNLOAD, &plat_priv->driver_state); clear_bit(CNSS_DRIVER_PROBED, &plat_priv->driver_state); } return ret; } Loading Loading @@ -1271,6 +1278,7 @@ void cnss_device_crashed(void) subsys_info = &plat_priv->subsys_info; if (subsys_info->subsys_device) { set_bit(CNSS_DRIVER_RECOVERY, &plat_priv->driver_state); subsys_set_crash_status(subsys_info->subsys_device, true); subsystem_restart_dev(subsys_info->subsys_device); } Loading Loading @@ -1319,25 +1327,24 @@ int cnss_self_recovery(struct device *dev, return -EINVAL; } if (plat_priv->driver_status == CNSS_RECOVERY) { if (test_bit(CNSS_DRIVER_RECOVERY, &plat_priv->driver_state)) { cnss_pr_err("Recovery is already in progress!\n"); return -EINVAL; } if (plat_priv->driver_status == CNSS_LOAD_UNLOAD) { if (test_bit(CNSS_DRIVER_LOAD_UNLOAD, &plat_priv->driver_state)) { cnss_pr_err("Driver load or unload is in progress!\n"); return -EINVAL; } subsys_info = &plat_priv->subsys_info; plat_priv->recovery_count++; plat_priv->driver_status = CNSS_RECOVERY; set_bit(CNSS_DRIVER_RECOVERY, &plat_priv->driver_state); pm_stay_awake(dev); cnss_shutdown(&subsys_info->subsys_desc, false); udelay(WLAN_RECOVERY_DELAY); cnss_powerup(&subsys_info->subsys_desc); pm_relax(dev); plat_priv->driver_status = CNSS_INITIALIZED; return 0; } Loading drivers/net/wireless/cnss2/main.h +2 −0 Original line number Diff line number Diff line Loading @@ -105,7 +105,9 @@ enum cnss_driver_state { CNSS_FW_MEM_READY, CNSS_FW_READY, CNSS_COLD_BOOT_CAL_DONE, CNSS_DRIVER_LOAD_UNLOAD, CNSS_DRIVER_PROBED, CNSS_DRIVER_RECOVERY, }; struct cnss_recovery_work_t { Loading drivers/net/wireless/cnss2/pci.c +2 −2 Original line number Diff line number Diff line Loading @@ -60,7 +60,7 @@ static int cnss_set_pci_config_space(struct cnss_pci_data *pci_priv, bool save) return -ENODEV; link_down_or_recovery = pci_priv->pci_link_down_ind || (plat_priv->driver_status == CNSS_RECOVERY); (test_bit(CNSS_DRIVER_RECOVERY, &plat_priv->driver_state)); if (save) { if (link_down_or_recovery) { Loading Loading @@ -98,7 +98,7 @@ static int cnss_set_pci_link(struct cnss_pci_data *pci_priv, bool link_up) return -ENODEV; link_down_or_recovery = pci_priv->pci_link_down_ind || (plat_priv->driver_status == CNSS_RECOVERY); (test_bit(CNSS_DRIVER_RECOVERY, &plat_priv->driver_state)); ret = msm_pcie_pm_control(link_up ? MSM_PCIE_RESUME : MSM_PCIE_SUSPEND, Loading Loading
drivers/net/wireless/cnss2/main.c +32 −25 Original line number Diff line number Diff line Loading @@ -473,7 +473,7 @@ static int cnss_fw_ready_hdlr(struct cnss_plat_data *plat_priv) if (!pci_priv) return -ENODEV; if (plat_priv->driver_status == CNSS_LOAD_UNLOAD) if (test_bit(CNSS_DRIVER_LOAD_UNLOAD, &plat_priv->driver_state)) complete(&plat_priv->fw_ready_event); else ret = cnss_wlfw_wlan_mode_send_sync(plat_priv, Loading Loading @@ -740,7 +740,7 @@ int cnss_wlan_register_driver(struct cnss_wlan_driver *driver_ops) goto out; } plat_priv->driver_status = CNSS_LOAD_UNLOAD; set_bit(CNSS_DRIVER_LOAD_UNLOAD, &plat_priv->driver_state); plat_priv->driver_ops = driver_ops; subsys_info = &plat_priv->subsys_info; Loading @@ -754,12 +754,10 @@ int cnss_wlan_register_driver(struct cnss_wlan_driver *driver_ops) goto reset_ctx; } plat_priv->driver_status = CNSS_INITIALIZED; return 0; reset_ctx: cnss_pr_err("Failed to get subsystem, err = %d\n", ret); plat_priv->driver_status = CNSS_UNINITIALIZED; clear_bit(CNSS_DRIVER_LOAD_UNLOAD, &plat_priv->driver_state); plat_priv->driver_ops = NULL; out: return ret; Loading @@ -776,12 +774,11 @@ void cnss_wlan_unregister_driver(struct cnss_wlan_driver *driver_ops) return; } plat_priv->driver_status = CNSS_LOAD_UNLOAD; set_bit(CNSS_DRIVER_LOAD_UNLOAD, &plat_priv->driver_state); subsys_info = &plat_priv->subsys_info; subsystem_put(subsys_info->subsys_handle); subsys_info->subsys_handle = NULL; plat_priv->driver_ops = NULL; plat_priv->driver_status = CNSS_UNINITIALIZED; } EXPORT_SYMBOL(cnss_wlan_unregister_driver); Loading Loading @@ -941,7 +938,7 @@ static int cnss_qca6174_powerup(struct cnss_plat_data *plat_priv) goto power_off; } if (plat_priv->driver_status == CNSS_LOAD_UNLOAD) { if (test_bit(CNSS_DRIVER_LOAD_UNLOAD, &plat_priv->driver_state)) { ret = plat_priv->driver_ops->probe(pci_priv->pci_dev, pci_priv->pci_device_id); if (ret) { Loading @@ -949,7 +946,9 @@ static int cnss_qca6174_powerup(struct cnss_plat_data *plat_priv) ret); goto suspend_link; } } else if (plat_priv->driver_status == CNSS_RECOVERY) { clear_bit(CNSS_DRIVER_LOAD_UNLOAD, &plat_priv->driver_state); set_bit(CNSS_DRIVER_PROBED, &plat_priv->driver_state); } else if (test_bit(CNSS_DRIVER_RECOVERY, &plat_priv->driver_state)) { ret = plat_priv->driver_ops->reinit(pci_priv->pci_dev, pci_priv->pci_device_id); if (ret) { Loading @@ -957,7 +956,7 @@ static int cnss_qca6174_powerup(struct cnss_plat_data *plat_priv) ret); goto suspend_link; } plat_priv->driver_status = CNSS_INITIALIZED; clear_bit(CNSS_DRIVER_RECOVERY, &plat_priv->driver_state); } else { cnss_pr_err("Driver state is not correct to power up!\n"); ret = -EINVAL; Loading @@ -984,13 +983,13 @@ static int cnss_qca6174_shutdown(struct cnss_plat_data *plat_priv) if (!plat_priv->driver_ops) return -EINVAL; if (plat_priv->driver_status == CNSS_LOAD_UNLOAD) { if (test_bit(CNSS_DRIVER_LOAD_UNLOAD, &plat_priv->driver_state)) { cnss_request_bus_bandwidth(CNSS_BUS_WIDTH_NONE); plat_priv->driver_ops->remove(pci_priv->pci_dev); cnss_pci_set_monitor_wake_intr(pci_priv, false); cnss_pci_set_auto_suspended(pci_priv, 0); } else { plat_priv->driver_status = CNSS_RECOVERY; set_bit(CNSS_DRIVER_RECOVERY, &plat_priv->driver_state); plat_priv->driver_ops->shutdown(pci_priv->pci_dev); } Loading @@ -1000,6 +999,11 @@ static int cnss_qca6174_shutdown(struct cnss_plat_data *plat_priv) cnss_power_off_device(plat_priv); if (test_bit(CNSS_DRIVER_LOAD_UNLOAD, &plat_priv->driver_state)) { clear_bit(CNSS_DRIVER_LOAD_UNLOAD, &plat_priv->driver_state); clear_bit(CNSS_DRIVER_PROBED, &plat_priv->driver_state); } return ret; } Loading Loading @@ -1071,7 +1075,7 @@ skip_fw_ready: goto out; } if (plat_priv->driver_status == CNSS_LOAD_UNLOAD) { if (test_bit(CNSS_DRIVER_LOAD_UNLOAD, &plat_priv->driver_state)) { ret = plat_priv->driver_ops->probe(pci_priv->pci_dev, pci_priv->pci_device_id); if (ret) { Loading @@ -1079,7 +1083,9 @@ skip_fw_ready: ret); goto stop_mhi; } } else if (plat_priv->driver_status == CNSS_RECOVERY) { clear_bit(CNSS_DRIVER_LOAD_UNLOAD, &plat_priv->driver_state); set_bit(CNSS_DRIVER_PROBED, &plat_priv->driver_state); } else if (test_bit(CNSS_DRIVER_RECOVERY, &plat_priv->driver_state)) { ret = plat_priv->driver_ops->reinit(pci_priv->pci_dev, pci_priv->pci_device_id); if (ret) { Loading @@ -1087,15 +1093,13 @@ skip_fw_ready: ret); goto stop_mhi; } plat_priv->driver_status = CNSS_INITIALIZED; clear_bit(CNSS_DRIVER_RECOVERY, &plat_priv->driver_state); } else { cnss_pr_err("Driver state is not correct to power up!\n"); ret = -EINVAL; goto stop_mhi; } set_bit(CNSS_DRIVER_PROBED, &plat_priv->driver_state); return 0; stop_mhi: Loading Loading @@ -1123,18 +1127,16 @@ static int cnss_qca6290_shutdown(struct cnss_plat_data *plat_priv) if (enable_waltest) goto bypass_driver_remove; if (plat_priv->driver_status == CNSS_LOAD_UNLOAD) { if (test_bit(CNSS_DRIVER_LOAD_UNLOAD, &plat_priv->driver_state)) { cnss_request_bus_bandwidth(CNSS_BUS_WIDTH_NONE); plat_priv->driver_ops->remove(pci_priv->pci_dev); cnss_pci_set_monitor_wake_intr(pci_priv, false); cnss_pci_set_auto_suspended(pci_priv, 0); } else { plat_priv->driver_status = CNSS_RECOVERY; set_bit(CNSS_DRIVER_RECOVERY, &plat_priv->driver_state); plat_priv->driver_ops->shutdown(pci_priv->pci_dev); } clear_bit(CNSS_DRIVER_PROBED, &plat_priv->driver_state); bypass_driver_remove: if (!fbc_bypass) cnss_pci_stop_mhi(pci_priv); Loading @@ -1145,6 +1147,11 @@ bypass_driver_remove: cnss_power_off_device(plat_priv); if (test_bit(CNSS_DRIVER_LOAD_UNLOAD, &plat_priv->driver_state)) { clear_bit(CNSS_DRIVER_LOAD_UNLOAD, &plat_priv->driver_state); clear_bit(CNSS_DRIVER_PROBED, &plat_priv->driver_state); } return ret; } Loading Loading @@ -1271,6 +1278,7 @@ void cnss_device_crashed(void) subsys_info = &plat_priv->subsys_info; if (subsys_info->subsys_device) { set_bit(CNSS_DRIVER_RECOVERY, &plat_priv->driver_state); subsys_set_crash_status(subsys_info->subsys_device, true); subsystem_restart_dev(subsys_info->subsys_device); } Loading Loading @@ -1319,25 +1327,24 @@ int cnss_self_recovery(struct device *dev, return -EINVAL; } if (plat_priv->driver_status == CNSS_RECOVERY) { if (test_bit(CNSS_DRIVER_RECOVERY, &plat_priv->driver_state)) { cnss_pr_err("Recovery is already in progress!\n"); return -EINVAL; } if (plat_priv->driver_status == CNSS_LOAD_UNLOAD) { if (test_bit(CNSS_DRIVER_LOAD_UNLOAD, &plat_priv->driver_state)) { cnss_pr_err("Driver load or unload is in progress!\n"); return -EINVAL; } subsys_info = &plat_priv->subsys_info; plat_priv->recovery_count++; plat_priv->driver_status = CNSS_RECOVERY; set_bit(CNSS_DRIVER_RECOVERY, &plat_priv->driver_state); pm_stay_awake(dev); cnss_shutdown(&subsys_info->subsys_desc, false); udelay(WLAN_RECOVERY_DELAY); cnss_powerup(&subsys_info->subsys_desc); pm_relax(dev); plat_priv->driver_status = CNSS_INITIALIZED; return 0; } Loading
drivers/net/wireless/cnss2/main.h +2 −0 Original line number Diff line number Diff line Loading @@ -105,7 +105,9 @@ enum cnss_driver_state { CNSS_FW_MEM_READY, CNSS_FW_READY, CNSS_COLD_BOOT_CAL_DONE, CNSS_DRIVER_LOAD_UNLOAD, CNSS_DRIVER_PROBED, CNSS_DRIVER_RECOVERY, }; struct cnss_recovery_work_t { Loading
drivers/net/wireless/cnss2/pci.c +2 −2 Original line number Diff line number Diff line Loading @@ -60,7 +60,7 @@ static int cnss_set_pci_config_space(struct cnss_pci_data *pci_priv, bool save) return -ENODEV; link_down_or_recovery = pci_priv->pci_link_down_ind || (plat_priv->driver_status == CNSS_RECOVERY); (test_bit(CNSS_DRIVER_RECOVERY, &plat_priv->driver_state)); if (save) { if (link_down_or_recovery) { Loading Loading @@ -98,7 +98,7 @@ static int cnss_set_pci_link(struct cnss_pci_data *pci_priv, bool link_up) return -ENODEV; link_down_or_recovery = pci_priv->pci_link_down_ind || (plat_priv->driver_status == CNSS_RECOVERY); (test_bit(CNSS_DRIVER_RECOVERY, &plat_priv->driver_state)); ret = msm_pcie_pm_control(link_up ? MSM_PCIE_RESUME : MSM_PCIE_SUSPEND, Loading