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

Commit 34eabbd6 authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "icnss: Re-probe if driver probe returns error of defer"

parents 8e47769c 207f71fa
Loading
Loading
Loading
Loading
+20 −8
Original line number Original line Diff line number Diff line
@@ -61,6 +61,7 @@
#define ICNSS_DEFAULT_FEATURE_MASK 0x01
#define ICNSS_DEFAULT_FEATURE_MASK 0x01


#define ICNSS_QUIRKS_DEFAULT		BIT(FW_REJUVENATE_ENABLE)
#define ICNSS_QUIRKS_DEFAULT		BIT(FW_REJUVENATE_ENABLE)
#define ICNSS_MAX_PROBE_CNT		2


static struct icnss_priv *penv;
static struct icnss_priv *penv;


@@ -720,7 +721,8 @@ static int icnss_driver_event_server_exit(void *data)


static int icnss_call_driver_probe(struct icnss_priv *priv)
static int icnss_call_driver_probe(struct icnss_priv *priv)
{
{
	int ret;
	int ret = 0;
	int probe_cnt = 0;


	if (!priv->ops || !priv->ops->probe)
	if (!priv->ops || !priv->ops->probe)
		return 0;
		return 0;
@@ -732,10 +734,15 @@ static int icnss_call_driver_probe(struct icnss_priv *priv)


	icnss_hw_power_on(priv);
	icnss_hw_power_on(priv);


	while (probe_cnt < ICNSS_MAX_PROBE_CNT) {
		ret = priv->ops->probe(&priv->pdev->dev);
		ret = priv->ops->probe(&priv->pdev->dev);
		probe_cnt++;
		if (ret != -EPROBE_DEFER)
			break;
	}
	if (ret < 0) {
	if (ret < 0) {
		icnss_pr_err("Driver probe failed: %d, state: 0x%lx\n",
		icnss_pr_err("Driver probe failed: %d, state: 0x%lx, probe_cnt: %d\n",
			     ret, priv->state);
			     ret, priv->state, probe_cnt);
		goto out;
		goto out;
	}
	}


@@ -843,6 +850,7 @@ static int icnss_driver_event_fw_ready_ind(void *data)
static int icnss_driver_event_register_driver(void *data)
static int icnss_driver_event_register_driver(void *data)
{
{
	int ret = 0;
	int ret = 0;
	int probe_cnt = 0;


	if (penv->ops)
	if (penv->ops)
		return -EEXIST;
		return -EEXIST;
@@ -862,11 +870,15 @@ static int icnss_driver_event_register_driver(void *data)
	if (ret)
	if (ret)
		goto out;
		goto out;


	while (probe_cnt < ICNSS_MAX_PROBE_CNT) {
		ret = penv->ops->probe(&penv->pdev->dev);
		ret = penv->ops->probe(&penv->pdev->dev);

		probe_cnt++;
		if (ret != -EPROBE_DEFER)
			break;
	}
	if (ret) {
	if (ret) {
		icnss_pr_err("Driver probe failed: %d, state: 0x%lx\n",
		icnss_pr_err("Driver probe failed: %d, state: 0x%lx, probe_cnt: %d\n",
			     ret, penv->state);
			     ret, penv->state, probe_cnt);
		goto power_off;
		goto power_off;
	}
	}