Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 09636b44 authored by Yue Ma's avatar Yue Ma Committed by Gerrit - the friendly Code Review server
Browse files

cnss2: Add support to update status to WLAN driver



Add support for updating status so that as soon as CNSS driver knows
device is in bad state, update it to WLAN driver as well.

Change-Id: I0b790f653cd54b7004a8c87b65597d65ea51245d
Signed-off-by: default avatarYue Ma <yuem@codeaurora.org>
parent a212cf53
Loading
Loading
Loading
Loading
+16 −0
Original line number Diff line number Diff line
@@ -332,3 +332,19 @@ int cnss_bus_call_driver_modem_status(struct cnss_plat_data *plat_priv,
		return -EINVAL;
	}
}

int cnss_bus_update_status(struct cnss_plat_data *plat_priv,
			   enum cnss_driver_status status)
{
	if (!plat_priv)
		return -ENODEV;

	switch (plat_priv->bus_type) {
	case CNSS_BUS_PCI:
		return cnss_pci_update_status(plat_priv->bus_priv, status);
	default:
		cnss_pr_err("Unsupported bus type: %d\n",
			    plat_priv->bus_type);
		return -EINVAL;
	}
}
+2 −0
Original line number Diff line number Diff line
@@ -51,5 +51,7 @@ int cnss_bus_register_driver_hdlr(struct cnss_plat_data *plat_priv, void *data);
int cnss_bus_unregister_driver_hdlr(struct cnss_plat_data *plat_priv);
int cnss_bus_call_driver_modem_status(struct cnss_plat_data *plat_priv,
				      int modem_current_status);
int cnss_bus_update_status(struct cnss_plat_data *plat_priv,
			   enum cnss_driver_status status);

#endif /* _CNSS_BUS_H */
+24 −2
Original line number Diff line number Diff line
@@ -223,6 +223,7 @@ int cnss_pci_link_down(struct device *dev)

	cnss_pr_err("PCI link down is detected by host driver, schedule recovery!\n");

	cnss_pci_update_status(pci_priv, CNSS_FW_DOWN);
	cnss_schedule_recovery(dev, CNSS_REASON_LINK_DOWN);

	return 0;
@@ -350,6 +351,25 @@ int cnss_pci_call_driver_modem_status(struct cnss_pci_data *pci_priv,
	return 0;
}

int cnss_pci_update_status(struct cnss_pci_data *pci_priv,
			   enum cnss_driver_status status)
{
	struct cnss_wlan_driver *driver_ops;

	if (!pci_priv)
		return -ENODEV;

	driver_ops = pci_priv->driver_ops;
	if (!driver_ops || !driver_ops->update_status)
		return -EINVAL;

	cnss_pr_dbg("Update driver status: %d\n", status);

	driver_ops->update_status(pci_priv->pci_dev, status);

	return 0;
}

static int cnss_qca6174_powerup(struct cnss_pci_data *pci_priv)
{
	int ret = 0;
@@ -890,6 +910,8 @@ static void cnss_pci_event_cb(struct msm_pcie_notify *notify)
		cnss_pr_err("PCI link down, schedule recovery!\n");
		if (pci_dev->device == QCA6174_DEVICE_ID)
			disable_irq(pci_dev->irq);

		cnss_pci_update_status(pci_priv, CNSS_FW_DOWN);
		cnss_schedule_recovery(&pci_dev->dev, CNSS_REASON_LINK_DOWN);
		break;
	case MSM_PCIE_EVENT_WAKEUP:
@@ -2027,8 +2049,8 @@ static void cnss_mhi_notify_status(struct mhi_controller *mhi_ctrl, void *priv,
	set_bit(CNSS_DEV_ERR_NOTIFY, &plat_priv->driver_state);
	del_timer(&plat_priv->fw_boot_timer);

	cnss_schedule_recovery(&pci_priv->pci_dev->dev,
			       cnss_reason);
	cnss_pci_update_status(pci_priv, CNSS_FW_DOWN);
	cnss_schedule_recovery(&pci_priv->pci_dev->dev, cnss_reason);
}

static int cnss_pci_get_mhi_msi(struct cnss_pci_data *pci_priv)
+2 −0
Original line number Diff line number Diff line
@@ -149,5 +149,7 @@ void cnss_pci_pm_runtime_get_noresume(struct cnss_pci_data *pci_priv);
int cnss_pci_pm_runtime_put_autosuspend(struct cnss_pci_data *pci_priv);
void cnss_pci_pm_runtime_put_noidle(struct cnss_pci_data *pci_priv);
void cnss_pci_pm_runtime_mark_last_busy(struct cnss_pci_data *pci_priv);
int cnss_pci_update_status(struct cnss_pci_data *pci_priv,
			   enum cnss_driver_status status);

#endif /* _CNSS_PCI_H */