qcacld-3.0: Use PM wakelock to protect firmware downloading

To protect firmware not downloaded in system suspend, acquire/release
the cnss semaphore cnss_pm_sem. It is complex, and cnss function
cnss_pm_notify may trigger dead lock issue once PM_POST_SUSPEND is
ahead of PM_SUSPEND_PREPARE.

Optimize code to use PM wakelock API to protect firmware downloading.

Change-Id: I533c373b85f554fbcceb562d9f56c6b88e5155bb
CRs-Fixed: 3280247
Tento commit je obsažen v:
Yu Ouyang
2022-08-31 13:31:48 +08:00
odevzdal Madan Koyyalamudi
rodič 1037054718
revize cc2bf81627
6 změnil soubory, kde provedl 10 přidání a 80 odebrání

Zobrazit soubor

@@ -559,6 +559,9 @@ QDF_STATUS ol_cds_init(qdf_device_t qdf_dev, void *hif_ctx)
qdf_create_work(qdf_dev, &ol_info->fw_indication_work,
fw_indication_work_handler, ol_info);
qdf_wake_lock_create(&ol_info->fw_dl_wakelock,
"fw_download_wakelock");
return status;
}
@@ -574,5 +577,6 @@ void ol_cds_free(void)
if (NO_BMI)
return;
qdf_wake_lock_destroy(&ol_info->fw_dl_wakelock);
cds_free_context(QDF_MODULE_ID_BMI, ol_info);
}

Zobrazit soubor

@@ -1,5 +1,6 @@
/*
* Copyright (c) 2014-2020 The Linux Foundation. All rights reserved.
* Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved.
*
* Permission to use, copy, modify, and/or distribute this software for
* any purpose with or without fee is hereby granted, provided that the
@@ -165,6 +166,7 @@ struct ol_context {
qdf_device_t qdf_dev;
qdf_work_t ramdump_work;
qdf_work_t fw_indication_work;
qdf_wake_lock_t fw_dl_wakelock;
struct hif_opaque_softc *scn;
struct targetdef_t {
struct targetdef_s *targetdef;

Zobrazit soubor

@@ -518,15 +518,15 @@ static int
ol_transfer_bin_file(struct ol_context *ol_ctx, enum ATH_BIN_FILE file,
uint32_t address, bool compressed)
{
#define MAX_WAKELOCK_FOR_FW_DOWNLOAD 1000 //1s
int ret;
qdf_device_t qdf_dev = ol_ctx->qdf_dev;
/* Wait until suspend and resume are completed before loading FW */
pld_lock_pm_sem(qdf_dev->dev);
qdf_wake_lock_timeout_acquire(&ol_ctx->fw_dl_wakelock,
MAX_WAKELOCK_FOR_FW_DOWNLOAD);
ret = __ol_transfer_bin_file(ol_ctx, file, address, compressed);
pld_release_pm_sem(qdf_dev->dev);
qdf_wake_lock_release(&ol_ctx->fw_dl_wakelock, 0);
return ret;
}