summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBryan Lavrich <lavrich@google.com>2023-03-28 09:44:21 -0700
committerBryan Lavrich <lavrich@google.com>2023-03-28 16:49:34 +0000
commit70fac4c3063a704457494589f7f433a28679787b (patch)
treefe9bc9797da80e9db0b65452c9131e50928c4458
parent46cfd106b7b983d2a8c447bc6b2caef0e8cc1a46 (diff)
downloadaoc-70fac4c3063a704457494589f7f433a28679787b.tar.gz
Properly match gsa_load and gsa_unload calls
Bug: 238553915 Change-Id: I6932c14ea5d6965f36bf8beda0c4ffff6815d006
-rw-r--r--aoc.c31
1 files changed, 24 insertions, 7 deletions
diff --git a/aoc.c b/aoc.c
index 52f3366..35c6ddd 100644
--- a/aoc.c
+++ b/aoc.c
@@ -198,6 +198,7 @@ struct aoc_prvdata {
struct notifier_block itmon_nb;
#endif
struct device *gsa_dev;
+ bool protected_by_gsa;
int sensor_power_count;
const char *sensor_power_list[MAX_SENSOR_POWER_NUM];
@@ -820,6 +821,7 @@ static void aoc_fw_callback(const struct firmware *fw, void *ctx)
}
fw_signed = _aoc_fw_is_signed(fw);
+ prvdata->protected_by_gsa = fw_signed;
dev_info(dev, "Loading %s aoc image\n", fw_signed ? "signed" : "unsigned");
@@ -2359,13 +2361,28 @@ static void aoc_take_offline(struct aoc_prvdata *prvdata)
dev_err(prvdata->dev, "timed out waiting for aoc_ack\n");
}
- /* TODO: GSA_AOC_SHUTDOWN needs to be 4, but the current header defines
- * as 2. Change this when the header is updated
- */
- gsa_send_aoc_cmd(prvdata->gsa_dev, 4);
- rc = gsa_unload_aoc_fw_image(prvdata->gsa_dev);
- if (rc)
- dev_err(prvdata->dev, "GSA unload firmware failed: %d\n", rc);
+ if(prvdata->protected_by_gsa) {
+ /* TODO(b/275463650): GSA_AOC_SHUTDOWN needs to be 4, but the current
+ * header defines as 2. Change this to enum when the header is updated.
+ */
+ rc = gsa_send_aoc_cmd(prvdata->gsa_dev, 4);
+ /* rc is the new state of AOC unless it's negative,
+ * in which case it's an error code
+ */
+ if(rc != GSA_AOC_STATE_LOADED) {
+ if(rc >= 0) {
+ dev_err(prvdata->dev,
+ "GSA shutdown command returned unexpected state: %d\n", rc);
+ } else {
+ dev_err(prvdata->dev,
+ "GSA shutdown command returned error: %d\n", rc);
+ }
+ }
+
+ rc = gsa_unload_aoc_fw_image(prvdata->gsa_dev);
+ if (rc)
+ dev_err(prvdata->dev, "GSA unload firmware failed: %d\n", rc);
+ }
}
static void aoc_process_services(struct aoc_prvdata *prvdata, int offset)