From f04da7f7abc59e194e7b4bad04a6f00cf1f6ede1 Mon Sep 17 00:00:00 2001 From: Sam Hurst Date: Fri, 23 Dec 2022 08:13:55 -0800 Subject: [PATCH] usb_c: Check state machine array of states Build time check that the number of states initialized in the state machine array matches the number of enums used to index said array. Signed-off-by: Sam Hurst --- subsys/usb/usb_c/usbc_pe_common.c | 2 ++ subsys/usb/usb_c/usbc_pe_common_internal.h | 3 +++ subsys/usb/usb_c/usbc_prl.c | 10 ++++++++++ subsys/usb/usb_c/usbc_tc_common.c | 2 ++ subsys/usb/usb_c/usbc_tc_common_internal.h | 3 +++ 5 files changed, 20 insertions(+) diff --git a/subsys/usb/usb_c/usbc_pe_common.c b/subsys/usb/usb_c/usbc_pe_common.c index bda497f7c10..23499072c97 100644 --- a/subsys/usb/usb_c/usbc_pe_common.c +++ b/subsys/usb/usb_c/usbc_pe_common.c @@ -343,6 +343,7 @@ void pe_set_state(const struct device *dev, const enum usbc_pe_state state) { struct usbc_port_data *data = dev->data; + __ASSERT(state < ARRAY_SIZE(pe_states), "invalid pe_state %d", state); smf_set_state(SMF_CTX(data->pe), &pe_states[state]); } @@ -823,3 +824,4 @@ static const struct smf_state pe_states[] = { NULL, NULL), }; +BUILD_ASSERT(ARRAY_SIZE(pe_states) == PE_STATE_COUNT); diff --git a/subsys/usb/usb_c/usbc_pe_common_internal.h b/subsys/usb/usb_c/usbc_pe_common_internal.h index fc441600d9f..62bf93fb1f0 100644 --- a/subsys/usb/usb_c/usbc_pe_common_internal.h +++ b/subsys/usb/usb_c/usbc_pe_common_internal.h @@ -55,6 +55,9 @@ enum usbc_pe_state { /** PE_Suspend. Not part of the PD specification. */ PE_SUSPEND, + + /** Number of PE States */ + PE_STATE_COUNT }; /** diff --git a/subsys/usb/usb_c/usbc_prl.c b/subsys/usb/usb_c/usbc_prl.c index 8aee0452edb..5984b9d04b6 100644 --- a/subsys/usb/usb_c/usbc_prl.c +++ b/subsys/usb/usb_c/usbc_prl.c @@ -70,6 +70,9 @@ enum usbc_prl_tx_state_t { /** PRL_Tx_Suspend. Not part of the PD specification. */ PRL_TX_SUSPEND, + + /** Number of PRL_TX States */ + PRL_TX_STATE_COUNT }; /** @@ -87,6 +90,9 @@ enum usbc_prl_hr_state_t { /** PRL_Hr_Suspend. Not part of the PD specification. */ PRL_HR_SUSPEND, + + /** Number of PRL_HR States */ + PRL_HR_STATE_COUNT }; static const struct smf_state prl_tx_states[]; @@ -374,6 +380,7 @@ static void prl_tx_set_state(const struct device *dev, const enum usbc_prl_tx_st struct usbc_port_data *data = dev->data; struct protocol_layer_tx_t *prl_tx = data->prl_tx; + __ASSERT(state < ARRAY_SIZE(prl_tx_states), "invalid prl_tx_state %d", state); smf_set_state(SMF_CTX(prl_tx), &prl_tx_states[state]); } @@ -385,6 +392,7 @@ static void prl_hr_set_state(const struct device *dev, const enum usbc_prl_hr_st struct usbc_port_data *data = dev->data; struct protocol_hard_reset_t *prl_hr = data->prl_hr; + __ASSERT(state < ARRAY_SIZE(prl_hr_states), "invalid prl_hr_state %d", state); smf_set_state(SMF_CTX(prl_hr), &prl_hr_states[state]); } @@ -1159,6 +1167,7 @@ static const struct smf_state prl_tx_states[] = { NULL, NULL), }; +BUILD_ASSERT(ARRAY_SIZE(prl_tx_states) == PRL_TX_STATE_COUNT); /** * @brief Protocol Layer Hard Reset State table @@ -1190,3 +1199,4 @@ static const struct smf_state prl_hr_states[] = { NULL, NULL), }; +BUILD_ASSERT(ARRAY_SIZE(prl_hr_states) == PRL_HR_STATE_COUNT); diff --git a/subsys/usb/usb_c/usbc_tc_common.c b/subsys/usb/usb_c/usbc_tc_common.c index 1cb5960226b..edc857e0e1f 100644 --- a/subsys/usb/usb_c/usbc_tc_common.c +++ b/subsys/usb/usb_c/usbc_tc_common.c @@ -127,6 +127,7 @@ void tc_set_state(const struct device *dev, const enum tc_state_t state) struct usbc_port_data *data = dev->data; struct tc_sm_t *tc = data->tc; + __ASSERT(state < ARRAY_SIZE(tc_states), "invalid tc_state %d", state); smf_set_state(SMF_CTX(tc), &tc_states[state]); } @@ -261,3 +262,4 @@ static const struct smf_state tc_states[] = { NULL, &tc_states[TC_CC_OPEN_SUPER_STATE]), }; +BUILD_ASSERT(ARRAY_SIZE(tc_states) == TC_STATE_COUNT); diff --git a/subsys/usb/usb_c/usbc_tc_common_internal.h b/subsys/usb/usb_c/usbc_tc_common_internal.h index da96ad118b3..94613a8db3f 100644 --- a/subsys/usb/usb_c/usbc_tc_common_internal.h +++ b/subsys/usb/usb_c/usbc_tc_common_internal.h @@ -33,6 +33,9 @@ enum tc_state_t { TC_ATTACH_WAIT_SNK_STATE, /** Attached Sink State */ TC_ATTACHED_SNK_STATE, + + /** Number of TC States */ + TC_STATE_COUNT }; /**