wil6210: add support for platform specific notification events
Add the ability to notify the platform driver on different events, such as FW crash, pre reset and FW ready. Signed-off-by: Maya Erez <qca_merez@qca.qualcomm.com> Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
This commit is contained in:
parent
eabb03b4a3
commit
5f0823ef8b
|
@ -394,9 +394,10 @@ static irqreturn_t wil6210_irq_misc_thread(int irq, void *cookie)
|
||||||
wil_fw_core_dump(wil);
|
wil_fw_core_dump(wil);
|
||||||
wil_notify_fw_error(wil);
|
wil_notify_fw_error(wil);
|
||||||
isr &= ~ISR_MISC_FW_ERROR;
|
isr &= ~ISR_MISC_FW_ERROR;
|
||||||
if (wil->platform_ops.notify_crash) {
|
if (wil->platform_ops.notify) {
|
||||||
wil_err(wil, "notify platform driver about FW crash");
|
wil_err(wil, "notify platform driver about FW crash");
|
||||||
wil->platform_ops.notify_crash(wil->platform_handle);
|
wil->platform_ops.notify(wil->platform_handle,
|
||||||
|
WIL_PLATFORM_EVT_FW_CRASH);
|
||||||
} else {
|
} else {
|
||||||
wil_fw_error_recovery(wil);
|
wil_fw_error_recovery(wil);
|
||||||
}
|
}
|
||||||
|
|
|
@ -764,6 +764,15 @@ int wil_reset(struct wil6210_priv *wil, bool load_fw)
|
||||||
if (wil->hw_version == HW_VER_UNKNOWN)
|
if (wil->hw_version == HW_VER_UNKNOWN)
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
|
|
||||||
|
if (wil->platform_ops.notify) {
|
||||||
|
rc = wil->platform_ops.notify(wil->platform_handle,
|
||||||
|
WIL_PLATFORM_EVT_PRE_RESET);
|
||||||
|
if (rc)
|
||||||
|
wil_err(wil,
|
||||||
|
"%s: PRE_RESET platform notify failed, rc %d\n",
|
||||||
|
__func__, rc);
|
||||||
|
}
|
||||||
|
|
||||||
set_bit(wil_status_resetting, wil->status);
|
set_bit(wil_status_resetting, wil->status);
|
||||||
|
|
||||||
cancel_work_sync(&wil->disconnect_worker);
|
cancel_work_sync(&wil->disconnect_worker);
|
||||||
|
@ -843,8 +852,27 @@ int wil_reset(struct wil6210_priv *wil, bool load_fw)
|
||||||
|
|
||||||
/* we just started MAC, wait for FW ready */
|
/* we just started MAC, wait for FW ready */
|
||||||
rc = wil_wait_for_fw_ready(wil);
|
rc = wil_wait_for_fw_ready(wil);
|
||||||
if (rc == 0) /* check FW is responsive */
|
if (rc)
|
||||||
rc = wmi_echo(wil);
|
return rc;
|
||||||
|
|
||||||
|
/* check FW is responsive */
|
||||||
|
rc = wmi_echo(wil);
|
||||||
|
if (rc) {
|
||||||
|
wil_err(wil, "%s: wmi_echo failed, rc %d\n",
|
||||||
|
__func__, rc);
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (wil->platform_ops.notify) {
|
||||||
|
rc = wil->platform_ops.notify(wil->platform_handle,
|
||||||
|
WIL_PLATFORM_EVT_FW_RDY);
|
||||||
|
if (rc) {
|
||||||
|
wil_err(wil,
|
||||||
|
"%s: FW_RDY notify failed, rc %d\n",
|
||||||
|
__func__, rc);
|
||||||
|
rc = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return rc;
|
return rc;
|
||||||
|
|
|
@ -19,6 +19,12 @@
|
||||||
|
|
||||||
struct device;
|
struct device;
|
||||||
|
|
||||||
|
enum wil_platform_event {
|
||||||
|
WIL_PLATFORM_EVT_FW_CRASH = 0,
|
||||||
|
WIL_PLATFORM_EVT_PRE_RESET = 1,
|
||||||
|
WIL_PLATFORM_EVT_FW_RDY = 2,
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* struct wil_platform_ops - wil platform module calls from this
|
* struct wil_platform_ops - wil platform module calls from this
|
||||||
* driver to platform driver
|
* driver to platform driver
|
||||||
|
@ -28,7 +34,7 @@ struct wil_platform_ops {
|
||||||
int (*suspend)(void *handle);
|
int (*suspend)(void *handle);
|
||||||
int (*resume)(void *handle);
|
int (*resume)(void *handle);
|
||||||
void (*uninit)(void *handle);
|
void (*uninit)(void *handle);
|
||||||
int (*notify_crash)(void *handle);
|
int (*notify)(void *handle, enum wil_platform_event evt);
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Reference in New Issue