diff options
author | Max Krummenacher <max.krummenacher@toradex.com> | 2016-09-20 18:50:23 +0200 |
---|---|---|
committer | Marcel Ziswiler <marcel.ziswiler@toradex.com> | 2016-09-29 06:05:01 +0200 |
commit | 0b625fdb6afb37750c2b01221a3edb2cff32a1b9 (patch) | |
tree | 0289962ee32415c11aabbe18cc20eff30f60b163 /board | |
parent | 7c9d3384b6e2b520f7a74789582bce40aad29c0a (diff) |
configblock: skip over tags marked invalid
Skip over data which have the tag flag reporting invalid rather than
abort parsing.
Break parsing when the first tag id set to 0xffff is encountered or the
maximum size of the config block is reached.
Signed-off-by: Max Krummenacher <max.krummenacher@toradex.com>
Signed-off-by: Marcel Ziswiler <marcel.ziswiler@toradex.com>
Diffstat (limited to 'board')
-rw-r--r-- | board/toradex/common/configblock.c | 32 |
1 files changed, 18 insertions, 14 deletions
diff --git a/board/toradex/common/configblock.c b/board/toradex/common/configblock.c index 9462d48ad0b..f9a30df57ad 100644 --- a/board/toradex/common/configblock.c +++ b/board/toradex/common/configblock.c @@ -22,6 +22,7 @@ DECLARE_GLOBAL_DATA_PTR; #define TAG_VALID 0xcf01 #define TAG_MAC 0x0000 #define TAG_HW 0x0008 +#define TAG_INVALID 0xffff #define TAG_FLAG_VALID 0x1 @@ -194,23 +195,25 @@ int read_trdx_cfg_block(void) valid_cfgblock = true; offset = 4; - while (true) { + while (offset < TRDX_CFG_BLOCK_MAX_SIZE) { tag = (struct toradex_tag *)(config_block + offset); offset += 4; - if (tag->flags != TAG_FLAG_VALID) + if (tag->id == TAG_INVALID) break; - switch (tag->id) - { - case TAG_MAC: - memcpy(&trdx_eth_addr, config_block + offset, 6); - - /* NIC part of MAC address is serial number */ - trdx_serial = ntohl(trdx_eth_addr.nic) >> 8; - break; - case TAG_HW: - memcpy(&trdx_hw_tag, config_block + offset, 8); - break; + if (tag->flags == TAG_FLAG_VALID) { + switch (tag->id) { + case TAG_MAC: + memcpy(&trdx_eth_addr, config_block + offset, + 6); + + /* NIC part of MAC address is serial number */ + trdx_serial = ntohl(trdx_eth_addr.nic) >> 8; + break; + case TAG_HW: + memcpy(&trdx_hw_tag, config_block + offset, 8); + break; + } } /* Get to next tag according to current tags length */ @@ -218,7 +221,8 @@ int read_trdx_cfg_block(void) } /* Cap product id to avoid issues with a yet unknown one */ - if (trdx_hw_tag.prodid > (sizeof(toradex_modules) / sizeof(toradex_modules[0]))) + if (trdx_hw_tag.prodid > (sizeof(toradex_modules) / + sizeof(toradex_modules[0]))) trdx_hw_tag.prodid = 0; out: |