1a7dd0ac9SArend van Spriel // SPDX-License-Identifier: ISC
2a7dd0ac9SArend van Spriel /*
3a7dd0ac9SArend van Spriel  * Copyright (c) 2019 Broadcom
4a7dd0ac9SArend van Spriel  */
5a7dd0ac9SArend van Spriel #ifndef __BRCMF_XTLV_H
6a7dd0ac9SArend van Spriel #define __BRCMF_XTLV_H
7a7dd0ac9SArend van Spriel 
8a7dd0ac9SArend van Spriel #include <linux/types.h>
9a7dd0ac9SArend van Spriel #include <linux/bits.h>
10a7dd0ac9SArend van Spriel 
11a7dd0ac9SArend van Spriel /* bcm type(id), length, value with w/16 bit id/len. The structure below
12a7dd0ac9SArend van Spriel  * is nominal, and is used to support variable length id and type. See
13a7dd0ac9SArend van Spriel  * xtlv options below.
14a7dd0ac9SArend van Spriel  */
15a7dd0ac9SArend van Spriel struct brcmf_xtlv {
16a7dd0ac9SArend van Spriel 	u16 id;
17a7dd0ac9SArend van Spriel 	u16 len;
18*d8b1f419SGustavo A. R. Silva 	u8 data[];
19a7dd0ac9SArend van Spriel };
20a7dd0ac9SArend van Spriel 
21a7dd0ac9SArend van Spriel enum brcmf_xtlv_option {
22a7dd0ac9SArend van Spriel 	BRCMF_XTLV_OPTION_ALIGN32 = BIT(0),
23a7dd0ac9SArend van Spriel 	BRCMF_XTLV_OPTION_IDU8 = BIT(1),
24a7dd0ac9SArend van Spriel 	BRCMF_XTLV_OPTION_LENU8 = BIT(2),
25a7dd0ac9SArend van Spriel };
26a7dd0ac9SArend van Spriel 
27a7dd0ac9SArend van Spriel int brcmf_xtlv_data_size(int dlen, u16 opts);
28a7dd0ac9SArend van Spriel void brcmf_xtlv_pack_header(struct brcmf_xtlv *xtlv, u16 id, u16 len,
29a7dd0ac9SArend van Spriel 			    const u8 *data, u16 opts);
30a7dd0ac9SArend van Spriel 
31a7dd0ac9SArend van Spriel #endif /* __BRCMF_XTLV_H */
32