cnss2: Release DMS QMI handle during dms_del_server

DMS server runs in Modem. When Modem SSR happens dms_del_server
gets called. Even after DMS service disconnected, qmi_txn_wait is
still waiting. Release DMS QMI handle in dms_del_server to cancel
pending transaction.

Change-Id: I06ccfba34269dc51288300aa5fa0326842a09e32
CRs-Fixed: 3288808
Šī revīzija ir iekļauta:
Naman Padhiar
2022-09-09 19:31:30 +05:30
vecāks a5a88a8d75
revīzija 2e0fe8fe22
5 mainīti faili ar 44 papildinājumiem un 0 dzēšanām

Parādīt failu

@@ -3246,15 +3246,48 @@ static int dms_new_server(struct qmi_handle *qmi_dms,
service->port);
}
static void cnss_dms_server_exit_work(struct work_struct *work)
{
int ret;
struct cnss_plat_data *plat_priv = cnss_get_plat_priv(NULL);
cnss_dms_deinit(plat_priv);
cnss_pr_info("QMI DMS Server Exit");
clear_bit(CNSS_DMS_DEL_SERVER, &plat_priv->driver_state);
ret = cnss_dms_init(plat_priv);
if (ret < 0)
cnss_pr_err("QMI DMS service registraton failed, ret\n", ret);
}
static DECLARE_WORK(cnss_dms_del_work, cnss_dms_server_exit_work);
static void dms_del_server(struct qmi_handle *qmi_dms,
struct qmi_service *service)
{
struct cnss_plat_data *plat_priv =
container_of(qmi_dms, struct cnss_plat_data, qmi_dms);
if (!plat_priv)
return;
if (test_bit(CNSS_DMS_DEL_SERVER, &plat_priv->driver_state)) {
cnss_pr_info("DMS server delete or cnss remove in progress, Ignore server delete: 0x%lx\n",
plat_priv->driver_state);
return;
}
set_bit(CNSS_DMS_DEL_SERVER, &plat_priv->driver_state);
clear_bit(CNSS_QMI_DMS_CONNECTED, &plat_priv->driver_state);
cnss_pr_info("QMI DMS service disconnected, state: 0x%lx\n",
plat_priv->driver_state);
schedule_work(&cnss_dms_del_work);
}
void cnss_cancel_dms_work(void)
{
cancel_work_sync(&cnss_dms_del_work);
}
static struct qmi_ops qmi_dms_ops = {
@@ -3283,6 +3316,7 @@ out:
void cnss_dms_deinit(struct cnss_plat_data *plat_priv)
{
set_bit(CNSS_DMS_DEL_SERVER, &plat_priv->driver_state);
qmi_handle_release(&plat_priv->qmi_dms);
}