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:
Maya Erez 2016-03-01 19:18:11 +02:00 committed by Kalle Valo
parent eabb03b4a3
commit 5f0823ef8b
3 changed files with 40 additions and 5 deletions

View File

@ -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);
} }

View File

@ -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;

View File

@ -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);
}; };
/** /**