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