-Wflex-array-member-not-at-end was introduced in GCC-14, and we are getting ready to enable it, globally.
Use the `DEFINE_RAW_FLEX()` helper for an on-stack definition of a flexible structure where the size of the flexible-array member is known at compile-time, and refactor the rest of the code, accordingly. So, with these changes, fix the following warning: drivers/platform/chrome/cros_ec.c:106:40: warning: structure containing a flexible array member is not at the end of another structure [-Wflex-array-member-not-at-end] Signed-off-by: Gustavo A. R. Silva <[email protected]> --- drivers/platform/chrome/cros_ec.c | 47 +++++++++++++++++-------------- 1 file changed, 26 insertions(+), 21 deletions(-) diff --git a/drivers/platform/chrome/cros_ec.c b/drivers/platform/chrome/cros_ec.c index 110771a8645e..cd15aa0cb082 100644 --- a/drivers/platform/chrome/cros_ec.c +++ b/drivers/platform/chrome/cros_ec.c @@ -99,51 +99,56 @@ irqreturn_t cros_ec_irq_thread(int irq, void *data) } EXPORT_SYMBOL(cros_ec_irq_thread); +union cros_ec_sleep_data { + struct ec_params_host_sleep_event req0; + struct ec_params_host_sleep_event_v1 req1; + struct ec_response_host_sleep_event_v1 resp1; +} __packed; + static int cros_ec_sleep_event(struct cros_ec_device *ec_dev, u8 sleep_event) { int ret; - struct { - struct cros_ec_command msg; - union { - struct ec_params_host_sleep_event req0; - struct ec_params_host_sleep_event_v1 req1; - struct ec_response_host_sleep_event_v1 resp1; - } u; - } __packed buf; + DEFINE_RAW_FLEX(struct cros_ec_command, msg, data, + sizeof(union cros_ec_sleep_data)); + struct ec_params_host_sleep_event *req0 = + (struct ec_params_host_sleep_event *)msg->data; + struct ec_params_host_sleep_event_v1 *req1 = + (struct ec_params_host_sleep_event_v1 *)msg->data; + struct ec_response_host_sleep_event_v1 *resp1 = + (struct ec_response_host_sleep_event_v1 *)msg->data; - memset(&buf, 0, sizeof(buf)); if (ec_dev->host_sleep_v1) { - buf.u.req1.sleep_event = sleep_event; - buf.u.req1.suspend_params.sleep_timeout_ms = + req1->sleep_event = sleep_event; + req1->suspend_params.sleep_timeout_ms = ec_dev->suspend_timeout_ms; - buf.msg.outsize = sizeof(buf.u.req1); + msg->outsize = sizeof(*req1); if ((sleep_event == HOST_SLEEP_EVENT_S3_RESUME) || (sleep_event == HOST_SLEEP_EVENT_S0IX_RESUME)) - buf.msg.insize = sizeof(buf.u.resp1); + msg->insize = sizeof(*resp1); - buf.msg.version = 1; + msg->version = 1; } else { - buf.u.req0.sleep_event = sleep_event; - buf.msg.outsize = sizeof(buf.u.req0); + req0->sleep_event = sleep_event; + msg->outsize = sizeof(*req0); } - buf.msg.command = EC_CMD_HOST_SLEEP_EVENT; + msg->command = EC_CMD_HOST_SLEEP_EVENT; - ret = cros_ec_cmd_xfer_status(ec_dev, &buf.msg); + ret = cros_ec_cmd_xfer_status(ec_dev, msg); /* Report failure to transition to system wide suspend with a warning. */ if (ret >= 0 && ec_dev->host_sleep_v1 && (sleep_event == HOST_SLEEP_EVENT_S0IX_RESUME || sleep_event == HOST_SLEEP_EVENT_S3_RESUME)) { ec_dev->last_resume_result = - buf.u.resp1.resume_response.sleep_transitions; + resp1->resume_response.sleep_transitions; - WARN_ONCE(buf.u.resp1.resume_response.sleep_transitions & + WARN_ONCE(resp1->resume_response.sleep_transitions & EC_HOST_RESUME_SLEEP_TIMEOUT, "EC detected sleep transition timeout. Total sleep transitions: %d", - buf.u.resp1.resume_response.sleep_transitions & + resp1->resume_response.sleep_transitions & EC_HOST_RESUME_SLEEP_TRANSITIONS_MASK); } -- 2.43.0
