2 * Misc useful os-independent macros and functions.
4 * $Copyright Open Broadcom Corporation$
6 * $Id: bcmutils.h 412804 2013-07-16 16:26:39Z $
12 #define bcm_strcpy_s(dst, noOfElements, src) strcpy((dst), (src))
13 #define bcm_strncpy_s(dst, noOfElements, src, count) strncpy((dst), (src), (count))
14 #define bcm_strcat_s(dst, noOfElements, src) strcat((dst), (src))
34 extern const unsigned char bcm_ctype[];
35 #define bcm_ismask(x) (bcm_ctype[(int)(unsigned char)(x)])
37 #define bcm_isalnum(c) ((bcm_ismask(c)&(_BCM_U|_BCM_L|_BCM_D)) != 0)
38 #define bcm_isalpha(c) ((bcm_ismask(c)&(_BCM_U|_BCM_L)) != 0)
39 #define bcm_iscntrl(c) ((bcm_ismask(c)&(_BCM_C)) != 0)
40 #define bcm_isdigit(c) ((bcm_ismask(c)&(_BCM_D)) != 0)
41 #define bcm_isgraph(c) ((bcm_ismask(c)&(_BCM_P|_BCM_U|_BCM_L|_BCM_D)) != 0)
42 #define bcm_islower(c) ((bcm_ismask(c)&(_BCM_L)) != 0)
43 #define bcm_isprint(c) ((bcm_ismask(c)&(_BCM_P|_BCM_U|_BCM_L|_BCM_D|_BCM_SP)) != 0)
44 #define bcm_ispunct(c) ((bcm_ismask(c)&(_BCM_P)) != 0)
45 #define bcm_isspace(c) ((bcm_ismask(c)&(_BCM_S)) != 0)
46 #define bcm_isupper(c) ((bcm_ismask(c)&(_BCM_U)) != 0)
47 #define bcm_isxdigit(c) ((bcm_ismask(c)&(_BCM_D|_BCM_X)) != 0)
48 #define bcm_tolower(c) (bcm_isupper((c)) ? ((c) + 'a' - 'A') : (c))
49 #define bcm_toupper(c) (bcm_islower((c)) ? ((c) + 'A' - 'a') : (c))
57 unsigned int origsize;
64 #define GPIO_PIN_NOTDEFINED 0x20
67 #define SPINWAIT(exp, us) { \
68 uint countdown = (us) + 9; \
69 while ((exp) && (countdown >= 10)) {\
76 #ifndef PKTQ_LEN_DEFAULT
77 #define PKTQ_LEN_DEFAULT 128
80 #define PKTQ_MAX_PREC 16
83 typedef struct pktq_prec {
105 uint32 queue_capacity;
112 #define PKTQ_COMMON \
122 struct pktq_prec q[PKTQ_MAX_PREC];
124 pktq_counters_t _prec_cnt[PKTQ_MAX_PREC];
125 pktq_counters_t _prec_bytes[PKTQ_MAX_PREC];
134 struct pktq_prec q[1];
137 #define PKTQ_PREC_ITER(pq, prec) for (prec = (pq)->num_prec - 1; prec >= 0; prec--)
140 typedef bool (*ifpkt_cb_t)(void*, int);
143 #define POOL_ENAB(pool) ((pool) && (pool)->inited)
144 #define SHARED_POOL (pktpool_shared)
146 #define POOL_ENAB(bus) 0
147 #define SHARED_POOL ((struct pktpool *)NULL)
150 #ifndef PKTPOOL_LEN_MAX
151 #define PKTPOOL_LEN_MAX 40
153 #define PKTPOOL_CB_MAX 3
156 typedef void (*pktpool_cb_t)(struct pktpool *pool, void *arg);
165 #define POOL_RXFILL 1
190 typedef struct pktpool {
202 bool emptycb_disable;
203 pktpool_cbinfo_t *availcb_excl;
204 pktpool_cbinfo_t cbs[PKTPOOL_CB_MAX];
205 pktpool_cbinfo_t ecbs[PKTPOOL_CB_MAX];
206 void *q[PKTPOOL_LEN_MAX + 1];
210 pktpool_cbinfo_t dbg_cbs[PKTPOOL_CB_MAX];
212 pktpool_dbg_t dbg_q[PKTPOOL_LEN_MAX + 1];
216 extern pktpool_t *pktpool_shared;
218 extern int pktpool_init(osl_t *osh, pktpool_t *pktp, int *pktplen, int plen, bool istx);
219 extern int pktpool_deinit(osl_t *osh, pktpool_t *pktp);
220 extern int pktpool_fill(osl_t *osh, pktpool_t *pktp, bool minimal);
221 extern void* pktpool_get(pktpool_t *pktp);
222 extern void pktpool_free(pktpool_t *pktp, void *p);
223 extern int pktpool_add(pktpool_t *pktp, void *p);
224 extern uint16 pktpool_avail(pktpool_t *pktp);
225 extern int pktpool_avail_notify_normal(osl_t *osh, pktpool_t *pktp);
226 extern int pktpool_avail_notify_exclusive(osl_t *osh, pktpool_t *pktp, pktpool_cb_t cb);
227 extern int pktpool_avail_register(pktpool_t *pktp, pktpool_cb_t cb, void *arg);
228 extern int pktpool_empty_register(pktpool_t *pktp, pktpool_cb_t cb, void *arg);
229 extern int pktpool_setmaxlen(pktpool_t *pktp, uint16 maxlen);
230 extern int pktpool_setmaxlen_strict(osl_t *osh, pktpool_t *pktp, uint16 maxlen);
231 extern void pktpool_emptycb_disable(pktpool_t *pktp, bool disable);
232 extern bool pktpool_emptycb_disabled(pktpool_t *pktp);
234 #define POOLPTR(pp) ((pktpool_t *)(pp))
235 #define pktpool_len(pp) (POOLPTR(pp)->len - 1)
236 #define pktpool_plen(pp) (POOLPTR(pp)->plen)
237 #define pktpool_maxlen(pp) (POOLPTR(pp)->maxlen)
240 extern int pktpool_dbg_register(pktpool_t *pktp, pktpool_cb_t cb, void *arg);
241 extern int pktpool_start_trigger(pktpool_t *pktp, void *p);
242 extern int pktpool_dbg_dump(pktpool_t *pktp);
243 extern int pktpool_dbg_notify(pktpool_t *pktp);
244 extern int pktpool_stats_dump(pktpool_t *pktp, pktpool_stats_t *stats);
251 extern int ether_isbcast(const void *ea);
252 extern int ether_isnulladdr(const void *ea);
256 #define pktq_psetmax(pq, prec, _max) ((pq)->q[prec].max = (_max))
257 #define pktq_pmax(pq, prec) ((pq)->q[prec].max)
258 #define pktq_plen(pq, prec) ((pq)->q[prec].len)
259 #define pktq_pavail(pq, prec) ((pq)->q[prec].max - (pq)->q[prec].len)
260 #define pktq_pfull(pq, prec) ((pq)->q[prec].len >= (pq)->q[prec].max)
261 #define pktq_pempty(pq, prec) ((pq)->q[prec].len == 0)
263 #define pktq_ppeek(pq, prec) ((pq)->q[prec].head)
264 #define pktq_ppeek_tail(pq, prec) ((pq)->q[prec].tail)
266 extern void *pktq_penq(struct pktq *pq, int prec, void *p);
267 extern void *pktq_penq_head(struct pktq *pq, int prec, void *p);
268 extern void *pktq_pdeq(struct pktq *pq, int prec);
269 extern void *pktq_pdeq_prev(struct pktq *pq, int prec, void *prev_p);
270 extern void *pktq_pdeq_with_fn(struct pktq *pq, int prec, ifpkt_cb_t fn, int arg);
271 extern void *pktq_pdeq_tail(struct pktq *pq, int prec);
273 extern void pktq_pflush(osl_t *osh, struct pktq *pq, int prec, bool dir,
274 ifpkt_cb_t fn, int arg);
276 extern bool pktq_pdel(struct pktq *pq, void *p, int prec);
280 extern int pktq_mlen(struct pktq *pq, uint prec_bmp);
281 extern void *pktq_mdeq(struct pktq *pq, uint prec_bmp, int *prec_out);
282 extern void *pktq_mpeek(struct pktq *pq, uint prec_bmp, int *prec_out);
286 #define pktq_len(pq) ((int)(pq)->len)
287 #define pktq_max(pq) ((int)(pq)->max)
288 #define pktq_avail(pq) ((int)((pq)->max - (pq)->len))
289 #define pktq_full(pq) ((pq)->len >= (pq)->max)
290 #define pktq_empty(pq) ((pq)->len == 0)
293 #define pktenq(pq, p) pktq_penq(((struct pktq *)(void *)pq), 0, (p))
294 #define pktenq_head(pq, p) pktq_penq_head(((struct pktq *)(void *)pq), 0, (p))
295 #define pktdeq(pq) pktq_pdeq(((struct pktq *)(void *)pq), 0)
296 #define pktdeq_tail(pq) pktq_pdeq_tail(((struct pktq *)(void *)pq), 0)
297 #define pktqinit(pq, len) pktq_init(((struct pktq *)(void *)pq), 1, len)
299 extern void pktq_init(struct pktq *pq, int num_prec, int max_len);
300 extern void pktq_set_max_plen(struct pktq *pq, int prec, int max_len);
303 extern void *pktq_deq(struct pktq *pq, int *prec_out);
304 extern void *pktq_deq_tail(struct pktq *pq, int *prec_out);
305 extern void *pktq_peek(struct pktq *pq, int *prec_out);
306 extern void *pktq_peek_tail(struct pktq *pq, int *prec_out);
307 extern void pktq_flush(osl_t *osh, struct pktq *pq, bool dir, ifpkt_cb_t fn, int arg);
311 extern uint pktcopy(osl_t *osh, void *p, uint offset, int len, uchar *buf);
312 extern uint pktfrombuf(osl_t *osh, void *p, uint offset, int len, uchar *buf);
313 extern uint pkttotlen(osl_t *osh, void *p);
314 extern void *pktlast(osl_t *osh, void *p);
315 extern uint pktsegcnt(osl_t *osh, void *p);
316 extern uint pktsegcnt_war(osl_t *osh, void *p);
317 extern uint8 *pktdataoffset(osl_t *osh, void *p, uint offset);
318 extern void *pktoffset(osl_t *osh, void *p, uint offset);
321 #define PKTPRIO_VDSCP 0x100
322 #define PKTPRIO_VLAN 0x200
323 #define PKTPRIO_UPD 0x400
324 #define PKTPRIO_DSCP 0x800
328 #define DSCP_AF11 0x0A
329 #define DSCP_AF12 0x0C
330 #define DSCP_AF13 0x0E
332 #define DSCP_AF21 0x12
333 #define DSCP_AF22 0x14
334 #define DSCP_AF23 0x16
336 #define DSCP_AF31 0x1A
337 #define DSCP_AF32 0x1C
338 #define DSCP_AF33 0x1E
342 extern uint pktsetprio(void *pkt, bool update_vtag);
345 extern int bcm_atoi(const char *s);
346 extern ulong bcm_strtoul(const char *cp, char **endp, uint base);
347 extern char *bcmstrstr(const char *haystack, const char *needle);
348 extern char *bcmstrcat(char *dest, const char *src);
349 extern char *bcmstrncat(char *dest, const char *src, uint size);
350 extern ulong wchar2ascii(char *abuf, ushort *wbuf, ushort wbuflen, ulong abuflen);
351 char* bcmstrtok(char **string, const char *delimiters, char *tokdelim);
352 int bcmstricmp(const char *s1, const char *s2);
353 int bcmstrnicmp(const char* s1, const char* s2, int cnt);
357 extern char *bcm_ether_ntoa(const struct ether_addr *ea, char *buf);
358 extern int bcm_ether_atoe(const char *p, struct ether_addr *ea);
362 extern char *bcm_ip_ntoa(struct ipv4_addr *ia, char *buf);
365 extern void bcm_mdelay(uint ms);
367 #define NVRAM_RECLAIM_CHECK(name)
369 extern char *getvar(char *vars, const char *name);
370 extern int getintvar(char *vars, const char *name);
371 extern int getintvararray(char *vars, const char *name, int index);
372 extern int getintvararraysize(char *vars, const char *name);
373 extern uint getgpiopin(char *vars, char *pin_name, uint def_pin);
374 #define bcm_perf_enable()
375 #define bcmstats(fmt)
376 #define bcmlog(fmt, a1, a2)
377 #define bcmdumplog(buf, size) *buf = '\0'
378 #define bcmdumplogent(buf, idx) -1
380 #define bcmtslog(tstamp, fmt, a1, a2)
381 #define bcmprinttslogs()
382 #define bcmprinttstamp(us)
383 #define bcmdumptslog(buf, size)
385 extern char *bcm_nvram_vars(uint *length);
386 extern int bcm_nvram_cache(void *sih);
391 typedef struct bcm_iovar {
406 #define IOV_GVAL(id) ((id) * 2)
407 #define IOV_SVAL(id) ((id) * 2 + IOV_SET)
408 #define IOV_ISSET(actionid) ((actionid & IOV_SET) == IOV_SET)
409 #define IOV_ID(actionid) (actionid >> 1)
413 extern const bcm_iovar_t *bcm_iovar_lookup(const bcm_iovar_t *table, const char *name);
414 extern int bcm_iovar_lencheck(const bcm_iovar_t *table, void *arg, int len, bool set);
415 #if defined(WLTINYDUMP) || defined(WLMSG_INFORM) || defined(WLMSG_ASSOC) || \
416 defined(WLMSG_PRPKT) || defined(WLMSG_WSEC)
417 extern int bcm_format_ssid(char* buf, const uchar ssid[], uint ssid_len);
427 #define IOVT_UINT16 5
429 #define IOVT_UINT32 7
430 #define IOVT_BUFFER 8
431 #define BCM_IOVT_VALID(type) (((unsigned int)(type)) <= IOVT_BUFFER)
434 #define BCM_IOV_TYPE_INIT { \
446 #define BCM_IOVT_IS_INT(type) (\
447 (type == IOVT_BOOL) || \
448 (type == IOVT_INT8) || \
449 (type == IOVT_UINT8) || \
450 (type == IOVT_INT16) || \
451 (type == IOVT_UINT16) || \
452 (type == IOVT_INT32) || \
453 (type == IOVT_UINT32))
457 #define BCME_STRLEN 64
458 #define VALID_BCMERROR(e) ((e <= 0) && (e >= BCME_LAST))
464 #define BCME_ERROR -1
465 #define BCME_BADARG -2
466 #define BCME_BADOPTION -3
467 #define BCME_NOTUP -4
468 #define BCME_NOTDOWN -5
469 #define BCME_NOTAP -6
470 #define BCME_NOTSTA -7
471 #define BCME_BADKEYIDX -8
472 #define BCME_RADIOOFF -9
473 #define BCME_NOTBANDLOCKED -10
474 #define BCME_NOCLK -11
475 #define BCME_BADRATESET -12
476 #define BCME_BADBAND -13
477 #define BCME_BUFTOOSHORT -14
478 #define BCME_BUFTOOLONG -15
479 #define BCME_BUSY -16
480 #define BCME_NOTASSOCIATED -17
481 #define BCME_BADSSIDLEN -18
482 #define BCME_OUTOFRANGECHAN -19
483 #define BCME_BADCHAN -20
484 #define BCME_BADADDR -21
485 #define BCME_NORESOURCE -22
486 #define BCME_UNSUPPORTED -23
487 #define BCME_BADLEN -24
488 #define BCME_NOTREADY -25
489 #define BCME_EPERM -26
490 #define BCME_NOMEM -27
491 #define BCME_ASSOCIATED -28
492 #define BCME_RANGE -29
493 #define BCME_NOTFOUND -30
494 #define BCME_WME_NOT_ENABLED -31
495 #define BCME_TSPEC_NOTFOUND -32
496 #define BCME_ACM_NOTSUPPORTED -33
497 #define BCME_NOT_WME_ASSOCIATION -34
498 #define BCME_SDIO_ERROR -35
499 #define BCME_DONGLE_DOWN -36
500 #define BCME_VERSION -37
501 #define BCME_TXFAIL -38
502 #define BCME_RXFAIL -39
503 #define BCME_NODEVICE -40
504 #define BCME_NMODE_DISABLED -41
505 #define BCME_NONRESIDENT -42
506 #define BCME_SCANREJECT -43
507 #define BCME_USAGE_ERROR -44
508 #define BCME_IOCTL_ERROR -45
509 #define BCME_SERIAL_PORT_ERR -46
510 #define BCME_LAST BCME_SERIAL_PORT_ERR
513 #define BCMERRSTRINGTABLE { \
526 "Bad Rate valueset", \
528 "Buffer too short", \
533 "Out of Range Channel", \
536 "Not Enough Resources", \
547 "ACM Not Supported", \
548 "Not WME Association", \
550 "Dongle Not Accessible", \
551 "Incorrect version", \
554 "Device Not Present", \
556 "Nonresident overlay access", \
558 "WLCMD usage error", \
559 "WLCMD ioctl error", \
560 "RWL serial port error", \
564 #define ABS(a) (((a) < 0) ? -(a) : (a))
568 #define MIN(a, b) (((a) < (b)) ? (a) : (b))
572 #define MAX(a, b) (((a) > (b)) ? (a) : (b))
576 #ifndef LIMIT_TO_RANGE
577 #define LIMIT_TO_RANGE(x, min, max) \
578 ((x) < (min) ? (min) : ((x) > (max) ? (max) : (x)))
583 #define LIMIT_TO_MAX(x, max) \
584 (((x) > (max) ? (max) : (x)))
589 #define LIMIT_TO_MIN(x, min) \
590 (((x) < (min) ? (min) : (x)))
593 #define CEIL(x, y) (((x) + ((y) - 1)) / (y))
594 #define ROUNDUP(x, y) ((((x) + ((y) - 1)) / (y)) * (y))
595 #define ISALIGNED(a, x) (((uintptr)(a) & ((x) - 1)) == 0)
596 #define ALIGN_ADDR(addr, boundary) (void *)(((uintptr)(addr) + (boundary) - 1) \
598 #define ALIGN_SIZE(size, boundary) (((size) + (boundary) - 1) \
600 #define ISPOWEROF2(x) ((((x) - 1) & (x)) == 0)
601 #define VALID_MASK(mask) !((mask) & ((mask) + 1))
604 #ifdef __ARMCC_VERSION
607 #define OFFSETOF(type, member) offsetof(type, member)
609 #define OFFSETOF(type, member) ((uint)(uintptr)&((type *)0)->member)
614 #define ARRAYSIZE(a) (sizeof(a) / sizeof(a[0]))
618 #define ARRAYLAST(a) (&a[ARRAYSIZE(a)-1])
622 extern void *_bcmutils_dummy_fn;
623 #define REFERENCE_FUNCTION(f) (_bcmutils_dummy_fn = (void *)(f))
630 #ifdef BCMUTILS_BIT_MACROS_USE_FUNCS
631 extern void setbit(void *array, uint bit);
632 extern void clrbit(void *array, uint bit);
633 extern bool isset(const void *array, uint bit);
634 extern bool isclr(const void *array, uint bit);
636 #define setbit(a, i) (((uint8 *)a)[(i) / NBBY] |= 1 << ((i) % NBBY))
637 #define clrbit(a, i) (((uint8 *)a)[(i) / NBBY] &= ~(1 << ((i) % NBBY)))
638 #define isset(a, i) (((const uint8 *)a)[(i) / NBBY] & (1 << ((i) % NBBY)))
639 #define isclr(a, i) ((((const uint8 *)a)[(i) / NBBY] & (1 << ((i) % NBBY))) == 0)
643 #define isbitset(a, i) (((a) & (1 << (i))) != 0)
645 #define NBITS(type) (sizeof(type) * 8)
646 #define NBITVAL(nbits) (1 << (nbits))
647 #define MAXBITVAL(nbits) ((1 << (nbits)) - 1)
648 #define NBITMASK(nbits) MAXBITVAL(nbits)
649 #define MAXNBVAL(nbyte) MAXBITVAL((nbyte) * 8)
652 #define MUX(pred, true, false) ((pred) ? (true) : (false))
655 #define MODDEC(x, bound) MUX((x) == 0, (bound) - 1, (x) - 1)
656 #define MODINC(x, bound) MUX((x) == (bound) - 1, 0, (x) + 1)
659 #define MODDEC_POW2(x, bound) (((x) - 1) & ((bound) - 1))
660 #define MODINC_POW2(x, bound) (((x) + 1) & ((bound) - 1))
663 #define MODADD(x, y, bound) \
664 MUX((x) + (y) >= (bound), (x) + (y) - (bound), (x) + (y))
665 #define MODSUB(x, y, bound) \
666 MUX(((int)(x)) - ((int)(y)) < 0, (x) - (y) + (bound), (x) - (y))
669 #define MODADD_POW2(x, y, bound) (((x) + (y)) & ((bound) - 1))
670 #define MODSUB_POW2(x, y, bound) (((x) - (y)) & ((bound) - 1))
673 #define CRC8_INIT_VALUE 0xff
674 #define CRC8_GOOD_VALUE 0x9f
675 #define CRC16_INIT_VALUE 0xffff
676 #define CRC16_GOOD_VALUE 0xf0b8
677 #define CRC32_INIT_VALUE 0xffffffff
678 #define CRC32_GOOD_VALUE 0xdebb20e3
681 #define MACF "%02x:%02x:%02x:%02x:%02x:%02x"
682 #define ETHERP_TO_MACF(ea) ((struct ether_addr *) (ea))->octet[0], \
683 ((struct ether_addr *) (ea))->octet[1], \
684 ((struct ether_addr *) (ea))->octet[2], \
685 ((struct ether_addr *) (ea))->octet[3], \
686 ((struct ether_addr *) (ea))->octet[4], \
687 ((struct ether_addr *) (ea))->octet[5]
689 #define ETHER_TO_MACF(ea) (ea).octet[0], \
695 #if !defined(SIMPLE_MAC_PRINT)
696 #define MACDBG "%02x:%02x:%02x:%02x:%02x:%02x"
697 #define MAC2STRDBG(ea) (ea)[0], (ea)[1], (ea)[2], (ea)[3], (ea)[4], (ea)[5]
699 #define MACDBG "%02x:%02x:%02x"
700 #define MAC2STRDBG(ea) (ea)[0], (ea)[4], (ea)[5]
704 typedef struct bcm_bit_desc {
710 typedef struct bcm_bit_desc_ex {
712 const bcm_bit_desc_t *bitfield;
717 typedef struct bcm_tlv {
724 #define bcm_valid_tlv(elt, buflen) ((buflen) >= 2 && (int)(buflen) >= (int)(2 + (elt)->len))
727 #define ETHER_ADDR_STR_LEN 18
732 xor_128bit_block(const uint8 *src1, const uint8 *src2, uint8 *dst)
738 (((uintptr)src1 | (uintptr)src2 | (uintptr)dst) & 3) == 0) {
741 ((uint32 *)dst)[0] = ((const uint32 *)src1)[0] ^ ((const uint32 *)src2)[0];
742 ((uint32 *)dst)[1] = ((const uint32 *)src1)[1] ^ ((const uint32 *)src2)[1];
743 ((uint32 *)dst)[2] = ((const uint32 *)src1)[2] ^ ((const uint32 *)src2)[2];
744 ((uint32 *)dst)[3] = ((const uint32 *)src1)[3] ^ ((const uint32 *)src2)[3];
748 for (k = 0; k < 16; k++)
749 dst[k] = src1[k] ^ src2[k];
755 extern uint8 hndcrc8(uint8 *p, uint nbytes, uint8 crc);
756 extern uint16 hndcrc16(uint8 *p, uint nbytes, uint16 crc);
757 extern uint32 hndcrc32(uint8 *p, uint nbytes, uint32 crc);
760 #if defined(DHD_DEBUG) || defined(WLMSG_PRHDRS) || defined(WLMSG_PRPKT) || \
763 extern int bcm_format_field(const bcm_bit_desc_ex_t *bd, uint32 field, char* buf, int len);
765 extern int bcm_format_flags(const bcm_bit_desc_t *bd, uint32 flags, char* buf, int len);
768 #if defined(DHD_DEBUG) || defined(WLMSG_PRHDRS) || defined(WLMSG_PRPKT) || \
769 defined(WLMSG_ASSOC) || defined(WLMEDIA_PEAKRATE)
770 extern int bcm_format_hex(char *str, const void *bytes, int len);
773 extern const char *bcm_crypto_algo_name(uint algo);
774 extern char *bcm_chipname(uint chipid, char *buf, uint len);
775 extern char *bcm_brev_str(uint32 brev, char *buf);
776 extern void printbig(char *buf);
777 extern void prhex(const char *msg, uchar *buf, uint len);
780 extern bcm_tlv_t *bcm_next_tlv(bcm_tlv_t *elt, int *buflen);
781 extern bcm_tlv_t *bcm_parse_tlvs(void *buf, int buflen, uint key);
782 extern bcm_tlv_t *bcm_parse_ordered_tlvs(void *buf, int buflen, uint key);
785 extern const char *bcmerrorstr(int bcmerror);
789 typedef uint32 mbool;
790 #define mboolset(mb, bit) ((mb) |= (bit))
791 #define mboolclr(mb, bit) ((mb) &= ~(bit))
792 #define mboolisset(mb, bit) (((mb) & (bit)) != 0)
793 #define mboolmaskset(mb, mask, val) ((mb) = (((mb) & ~(mask)) | (val)))
797 const char *nameandfmt;
802 extern void bcm_binit(struct bcmstrbuf *b, char *buf, uint size);
803 extern void bcm_bprhex(struct bcmstrbuf *b, const char *msg, bool newline, uint8 *buf, int len);
805 extern void bcm_inc_bytes(uchar *num, int num_bytes, uint8 amount);
806 extern int bcm_cmp_bytes(const uchar *arg1, const uchar *arg2, uint8 nbytes);
807 extern void bcm_print_bytes(const char *name, const uchar *cdata, int len);
809 typedef uint32 (*bcmutl_rdreg_rtn)(void *arg0, uint arg1, uint32 offset);
810 extern uint bcmdumpfields(bcmutl_rdreg_rtn func_ptr, void *arg0, uint arg1, struct fielddesc *str,
811 char *buf, uint32 bufsize);
812 extern uint bcm_bitcount(uint8 *bitmap, uint bytelength);
814 extern int bcm_bprintf(struct bcmstrbuf *b, const char *fmt, ...);
817 extern uint16 bcm_qdbm_to_mw(uint8 qdbm);
818 extern uint8 bcm_mw_to_qdbm(uint16 mw);
819 extern uint bcm_mkiovar(char *name, char *data, uint datalen, char *buf, uint len);
821 unsigned int process_nvram_vars(char *varbuf, unsigned int len);
822 extern bcm_tlv_t *find_vendor_ie(void *tlvs, int tlvs_len,
823 const char *voui, uint8 *type, int type_len);
826 extern void bcm_uint64_multiple_add(uint32* r_high, uint32* r_low, uint32 a, uint32 b, uint32 c);
828 extern void bcm_uint64_divide(uint32* r, uint32 a_high, uint32 a_low, uint32 b);