1 2 /* 3 * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved. 4 * 5 * Permission to use, copy, modify, and/or distribute this software for 6 * any purpose with or without fee is hereby granted, provided that the 7 * above copyright notice and this permission notice appear in all 8 * copies. 9 * 10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL 11 * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED 12 * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE 13 * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL 14 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR 15 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER 16 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 17 * PERFORMANCE OF THIS SOFTWARE. 18 */ 19 20 21 22 #ifndef _TLV_HDR_H_ 23 #define _TLV_HDR_H_ 24 #if !defined(__ASSEMBLER__) 25 #endif 26 27 #define _TLV_USERID_WIDTH_ 6 28 #define _TLV_DATA_WIDTH_ 32 29 #define _TLV_TAG_WIDTH_ 9 30 31 #define _TLV_MRV_EN_LEN_WIDTH_ 9 32 #define _TLV_MRV_DIS_LEN_WIDTH_ 12 33 34 #define _TLV_16_DATA_WIDTH_ 16 35 #define _TLV_16_TAG_WIDTH_ 5 36 #define _TLV_16_LEN_WIDTH_ 4 37 #define _TLV_CTAG_WIDTH_ 5 38 #define _TLV_44_DATA_WIDTH_ 44 39 #define _TLV_64_DATA_WIDTH_ 64 40 #define _TLV_76_DATA_WIDTH_ 64 41 #define _TLV_CDATA_WIDTH_ 32 42 #define _TLV_CDATA_76_WIDTH_ 64 43 44 struct tlv_usr_16_tlword_t { 45 #ifndef WIFI_BIT_ORDER_BIG_ENDIAN 46 uint16_t tlv_cflg_reserved : 1, 47 tlv_tag : _TLV_16_TAG_WIDTH_, 48 tlv_len : _TLV_16_LEN_WIDTH_, 49 tlv_usrid : _TLV_USERID_WIDTH_; 50 #else 51 uint16_t tlv_usrid : _TLV_USERID_WIDTH_, 52 tlv_len : _TLV_16_LEN_WIDTH_, 53 tlv_tag : _TLV_16_TAG_WIDTH_, 54 tlv_cflg_reserved : 1; 55 #endif 56 }; 57 58 struct tlv_16_tlword_t { 59 #ifndef WIFI_BIT_ORDER_BIG_ENDIAN 60 uint16_t tlv_cflg_reserved : 1, 61 tlv_len : _TLV_16_LEN_WIDTH_, 62 tlv_tag : _TLV_16_TAG_WIDTH_, 63 tlv_reserved : 6; 64 #else 65 uint16_t tlv_reserved : 6, 66 tlv_tag : _TLV_16_TAG_WIDTH_, 67 tlv_len : _TLV_16_LEN_WIDTH_, 68 tlv_cflg_reserved : 1; 69 #endif 70 }; 71 72 struct tlv_mac_usr_32_tlword_t { 73 #ifndef WIFI_BIT_ORDER_BIG_ENDIAN 74 uint32_t tlv_cflg_reserved : 1, 75 tlv_tag : _TLV_TAG_WIDTH_, 76 tlv_len : _TLV_MRV_DIS_LEN_WIDTH_, 77 tlv_src_linkid : 3, 78 tlv_mrv : 1, 79 tlv_usrid : _TLV_USERID_WIDTH_; 80 #else 81 uint32_t tlv_usrid : _TLV_USERID_WIDTH_, 82 tlv_mrv : 1, 83 tlv_src_linkid : 3, 84 tlv_len : _TLV_MRV_DIS_LEN_WIDTH_, 85 tlv_tag : _TLV_TAG_WIDTH_, 86 tlv_cflg_reserved : 1; 87 #endif 88 }; 89 90 struct tlv_mac_32_tlword_t { 91 #ifndef WIFI_BIT_ORDER_BIG_ENDIAN 92 uint32_t tlv_cflg_reserved : 1, 93 tlv_tag : _TLV_TAG_WIDTH_, 94 tlv_len : _TLV_MRV_DIS_LEN_WIDTH_, 95 tlv_src_linkid : 3, 96 tlv_mrv : 1, 97 tlv_reserved : 6; 98 #else 99 uint32_t tlv_reserved : 6, 100 tlv_mrv : 1, 101 tlv_src_linkid : 3, 102 tlv_len : _TLV_MRV_DIS_LEN_WIDTH_, 103 tlv_tag : _TLV_TAG_WIDTH_, 104 tlv_cflg_reserved : 1; 105 #endif 106 }; 107 108 struct tlv_mac_usr_64_tlword_t { 109 #ifndef WIFI_BIT_ORDER_BIG_ENDIAN 110 uint64_t tlv_cflg_reserved : 1, 111 tlv_tag : _TLV_TAG_WIDTH_, 112 tlv_len : _TLV_MRV_DIS_LEN_WIDTH_, 113 tlv_src_linkid : 3, 114 tlv_mrv : 1, 115 tlv_usrid : _TLV_USERID_WIDTH_, 116 #else 117 uint64_t tlv_usrid : _TLV_USERID_WIDTH_, 118 tlv_mrv : 1, 119 tlv_src_linkid : 3, 120 tlv_len : _TLV_MRV_DIS_LEN_WIDTH_, 121 tlv_tag : _TLV_TAG_WIDTH_, 122 tlv_cflg_reserved : 1, 123 #endif 124 tlv_reserved : 32; 125 }; 126 127 struct tlv_mac_64_tlword_t { 128 #ifndef WIFI_BIT_ORDER_BIG_ENDIAN 129 uint64_t tlv_cflg_reserved : 1, 130 tlv_tag : _TLV_TAG_WIDTH_, 131 tlv_len : _TLV_MRV_DIS_LEN_WIDTH_, 132 tlv_src_linkid : 3, 133 tlv_mrv : 1, 134 tlv_reserved : 38; 135 #else 136 uint64_t tlv_usrid_reserved : _TLV_USERID_WIDTH_, 137 tlv_mrv : 1, 138 tlv_src_linkid : 3, 139 tlv_len : _TLV_MRV_DIS_LEN_WIDTH_, 140 tlv_tag : _TLV_TAG_WIDTH_, 141 tlv_cflg_reserved : 1, 142 tlv_reserved : 32; 143 #endif 144 }; 145 146 struct tlv_mac_usr_44_tlword_t { 147 #ifndef WIFI_BIT_ORDER_BIG_ENDIAN 148 uint64_t tlv_compression : 1, 149 tlv_tag : _TLV_TAG_WIDTH_, 150 tlv_len : _TLV_MRV_DIS_LEN_WIDTH_, 151 tlv_src_linkid : 3, 152 tlv_mrv : 1, 153 tlv_usrid : _TLV_USERID_WIDTH_, 154 tlv_reserved : 10, 155 pad_44to64_bit : 22; 156 #else 157 uint64_t tlv_usrid : _TLV_USERID_WIDTH_, 158 tlv_mrv : 1, 159 tlv_src_linkid : 3, 160 tlv_len : _TLV_MRV_DIS_LEN_WIDTH_, 161 tlv_tag : _TLV_TAG_WIDTH_, 162 tlv_compression : 1, 163 pad_44to64_bit : 22, 164 tlv_reserved : 10; 165 #endif 166 }; 167 168 struct tlv_mac_44_tlword_t { 169 #ifndef WIFI_BIT_ORDER_BIG_ENDIAN 170 uint64_t tlv_compression : 1, 171 tlv_tag : _TLV_TAG_WIDTH_, 172 tlv_len : _TLV_MRV_DIS_LEN_WIDTH_, 173 tlv_src_linkid : 3, 174 tlv_mrv : 1, 175 tlv_reserved : 16, 176 pad_44to64_bit : 22; 177 #else 178 uint64_t tlv_usrid_reserved : _TLV_USERID_WIDTH_, 179 tlv_mrv : 1, 180 tlv_src_linkid : 3, 181 tlv_len : _TLV_MRV_DIS_LEN_WIDTH_, 182 tlv_tag : _TLV_TAG_WIDTH_, 183 tlv_compression : 1, 184 pad_44to64_bit : 22, 185 tlv_reserved : 10; 186 #endif 187 }; 188 189 struct tlv_mac_usr_76_tlword_t { 190 #ifndef WIFI_BIT_ORDER_BIG_ENDIAN 191 uint64_t tlv_compression : 1, 192 tlv_tag : _TLV_TAG_WIDTH_, 193 tlv_len : _TLV_MRV_DIS_LEN_WIDTH_, 194 tlv_src_linkid : 3, 195 tlv_mrv : 1, 196 tlv_usrid : _TLV_USERID_WIDTH_, 197 #else 198 uint64_t tlv_usrid : _TLV_USERID_WIDTH_, 199 tlv_mrv : 1, 200 tlv_src_linkid : 3, 201 tlv_len : _TLV_MRV_DIS_LEN_WIDTH_, 202 tlv_tag : _TLV_TAG_WIDTH_, 203 tlv_compression : 1, 204 #endif 205 tlv_reserved : 32; 206 uint64_t pad_64to128_bit : 64; 207 }; 208 209 struct tlv_mac_76_tlword_t { 210 #ifndef WIFI_BIT_ORDER_BIG_ENDIAN 211 uint64_t tlv_compression : 1, 212 tlv_tag : _TLV_TAG_WIDTH_, 213 tlv_len : _TLV_MRV_DIS_LEN_WIDTH_, 214 tlv_src_linkid : 3, 215 tlv_mrv : 1, 216 tlv_reserved : 38; 217 #else 218 uint64_t tlv_usrid_reserved : _TLV_USERID_WIDTH_, 219 tlv_mrv : 1, 220 tlv_src_linkid : 3, 221 tlv_len : _TLV_MRV_DIS_LEN_WIDTH_, 222 tlv_tag : _TLV_TAG_WIDTH_, 223 tlv_compression : 1, 224 tlv_reserved : 32; 225 #endif 226 uint64_t pad_64to128_bit : 64; 227 }; 228 229 struct tlv_usr_c_44_tlword_t { 230 #ifndef WIFI_BIT_ORDER_BIG_ENDIAN 231 uint64_t tlv_compression : 1, 232 tlv_ctag : _TLV_CTAG_WIDTH_, 233 tlv_usrid : _TLV_USERID_WIDTH_, 234 tlv_cdata : _TLV_CDATA_WIDTH_, 235 pad_44to64_bit : 20; 236 #else 237 uint64_t tlv_cdata_lower_20 : 20, 238 tlv_usrid : _TLV_USERID_WIDTH_, 239 tlv_ctag : _TLV_CTAG_WIDTH_, 240 tlv_compression : 1, 241 pad_44to64_bit : 20, 242 tlv_cdata_upper_12 : 12; 243 #endif 244 }; 245 246 struct tlv_usr_c_76_tlword_t { 247 #ifndef WIFI_BIT_ORDER_BIG_ENDIAN 248 uint64_t tlv_compression : 1, 249 tlv_ctag : _TLV_CTAG_WIDTH_, 250 tlv_usrid : _TLV_USERID_WIDTH_, 251 tlv_cdata_lower_52 : 52; 252 uint64_t tlv_cdata_upper_12 : 12, 253 pad_76to128_bit : 52; 254 #else 255 uint64_t tlv_cdata_lower_20 : 20, 256 tlv_usrid : _TLV_USERID_WIDTH_, 257 tlv_ctag : _TLV_CTAG_WIDTH_, 258 tlv_compression : 1, 259 tlv_cdata_middle_32 : 32; 260 uint64_t pad_76to96_bit : 20, 261 tlv_cdata_upper_12 : 12, 262 pad_96to128_bit : 32; 263 #endif 264 }; 265 266 struct tlv_usr_32_hdr { 267 #ifndef WIFI_BIT_ORDER_BIG_ENDIAN 268 uint64_t tlv_cflg_reserved : 1, 269 tlv_tag : _TLV_TAG_WIDTH_, 270 tlv_len : _TLV_MRV_DIS_LEN_WIDTH_, 271 tlv_src_linkid : 3, 272 tlv_mrv : 1, 273 tlv_usrid : _TLV_USERID_WIDTH_, 274 #else 275 uint32_t tlv_usrid : _TLV_USERID_WIDTH_, 276 tlv_mrv : 1, 277 tlv_src_linkid : 3, 278 tlv_len : _TLV_MRV_DIS_LEN_WIDTH_, 279 tlv_tag : _TLV_TAG_WIDTH_, 280 tlv_cflg_reserved : 1, 281 #endif 282 tlv_reserved : 32; 283 }; 284 285 struct tlv_32_hdr { 286 #ifndef WIFI_BIT_ORDER_BIG_ENDIAN 287 uint64_t tlv_cflg_reserved : 1, 288 tlv_tag : _TLV_TAG_WIDTH_, 289 tlv_len : _TLV_MRV_DIS_LEN_WIDTH_, 290 tlv_src_linkid : 3, 291 tlv_mrv : 1, 292 tlv_reserved : 38; 293 #else 294 uint64_t tlv_usrid_reserved : _TLV_USERID_WIDTH_, 295 tlv_mrv : 1, 296 tlv_src_linkid : 3, 297 tlv_len : _TLV_MRV_DIS_LEN_WIDTH_, 298 tlv_tag : _TLV_TAG_WIDTH_, 299 tlv_cflg_reserved : 1, 300 tlv_reserved : 32; 301 #endif 302 }; 303 304 struct tlv_mlo_usr_64_tlw32_t { 305 #ifndef WIFI_BIT_ORDER_BIG_ENDIAN 306 uint32_t tlv_cflg_reserved : 1, 307 tlv_tag : _TLV_TAG_WIDTH_, 308 tlv_len : _TLV_MRV_EN_LEN_WIDTH_, 309 tlv_dst_linkid : 3, 310 tlv_src_linkid : 3, 311 tlv_mrv : 1, 312 tlv_usrid : _TLV_USERID_WIDTH_; 313 #else 314 uint32_t tlv_usrid : _TLV_USERID_WIDTH_, 315 tlv_mrv : 1, 316 tlv_src_linkid : 3, 317 tlv_dst_linkid : 3, 318 tlv_len : _TLV_MRV_EN_LEN_WIDTH_, 319 tlv_tag : _TLV_TAG_WIDTH_, 320 tlv_cflg_reserved : 1; 321 #endif 322 uint32_t pad_32to64_bit : 32; 323 }; 324 325 struct tlv_mlo_64_tlw32_t { 326 #ifndef WIFI_BIT_ORDER_BIG_ENDIAN 327 uint32_t tlv_cflg_reserved : 1, 328 tlv_tag : _TLV_TAG_WIDTH_, 329 tlv_len : _TLV_MRV_EN_LEN_WIDTH_, 330 tlv_dst_linkid : 3, 331 tlv_src_linkid : 3, 332 tlv_mrv : 1, 333 tlv_reserved : _TLV_USERID_WIDTH_; 334 #else 335 uint32_t tlv_reserved : _TLV_USERID_WIDTH_, 336 tlv_mrv : 1, 337 tlv_src_linkid : 3, 338 tlv_dst_linkid : 3, 339 tlv_len : _TLV_MRV_EN_LEN_WIDTH_, 340 tlv_tag : _TLV_TAG_WIDTH_, 341 tlv_cflg_reserved : 1; 342 #endif 343 uint32_t pad_32to64_bit : 32; 344 }; 345 346 struct tlv_mac_usr_64_tlw32_t { 347 #ifndef WIFI_BIT_ORDER_BIG_ENDIAN 348 uint32_t tlv_cflg_reserved : 1, 349 tlv_tag : _TLV_TAG_WIDTH_, 350 tlv_len : _TLV_MRV_DIS_LEN_WIDTH_, 351 tlv_src_linkid : 3, 352 tlv_mrv : 1, 353 tlv_usrid : _TLV_USERID_WIDTH_; 354 #else 355 uint32_t tlv_usrid : _TLV_USERID_WIDTH_, 356 tlv_mrv : 1, 357 tlv_src_linkid : 3, 358 tlv_len : _TLV_MRV_DIS_LEN_WIDTH_, 359 tlv_tag : _TLV_TAG_WIDTH_, 360 tlv_cflg_reserved : 1; 361 #endif 362 uint32_t pad_32to64_bit : 32; 363 }; 364 365 struct tlv_mac_64_tlw32_t { 366 #ifndef WIFI_BIT_ORDER_BIG_ENDIAN 367 uint32_t tlv_cflg_reserved : 1, 368 tlv_tag : _TLV_TAG_WIDTH_, 369 tlv_len : _TLV_MRV_DIS_LEN_WIDTH_, 370 tlv_src_linkid : 3, 371 tlv_mrv : 1, 372 tlv_reserved : _TLV_USERID_WIDTH_; 373 #else 374 uint32_t tlv_reserved : _TLV_USERID_WIDTH_, 375 tlv_mrv : 1, 376 tlv_src_linkid : 3, 377 tlv_len : _TLV_MRV_DIS_LEN_WIDTH_, 378 tlv_tag : _TLV_TAG_WIDTH_, 379 tlv_cflg_reserved : 1; 380 #endif 381 uint32_t pad_32to64_bit : 32; 382 }; 383 384 struct tlv_usr_c_44_tlw32_t { 385 #ifndef WIFI_BIT_ORDER_BIG_ENDIAN 386 uint32_t tlv_compression : 1, 387 tlv_ctag : _TLV_CTAG_WIDTH_, 388 tlv_usrid : _TLV_USERID_WIDTH_, 389 tlv_cdata_lower_20 : 20; 390 uint32_t tlv_cdata_upper_12 : 12, 391 pad_44to64_bit : 20; 392 #else 393 uint32_t tlv_cdata_lower_20 : 20, 394 tlv_usrid : _TLV_USERID_WIDTH_, 395 tlv_ctag : _TLV_CTAG_WIDTH_, 396 tlv_compression : 1; 397 uint32_t pad_44to64_bit : 20, 398 tlv_cdata_upper_12 : 12; 399 #endif 400 }; 401 402 struct tlv_usr_c_76_tlw32_t { 403 #ifndef WIFI_BIT_ORDER_BIG_ENDIAN 404 uint32_t tlv_compression : 1, 405 tlv_ctag : _TLV_CTAG_WIDTH_, 406 tlv_usrid : _TLV_USERID_WIDTH_, 407 tlv_cdata_lower_20 : 20; 408 uint32_t tlv_cdata_middle_32 : 32; 409 uint32_t tlv_cdata_upper_12 : 12, 410 pad_76to96_bit : 20; 411 uint32_t pad_96to128_bit : 32; 412 #else 413 uint32_t tlv_cdata_lower_20 : 20, 414 tlv_usrid : _TLV_USERID_WIDTH_, 415 tlv_ctag : _TLV_CTAG_WIDTH_, 416 tlv_compression : 1; 417 uint32_t tlv_cdata_middle_32 : 32; 418 uint32_t pad_76to96_bit : 20, 419 tlv_cdata_upper_12 : 12; 420 uint32_t pad_96to128_bit : 32; 421 #endif 422 }; 423 424 #endif 425