1b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt/*
2b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt * Misc useful os-independent macros and functions.
3b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt *
438eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * Copyright (C) 1999-2013, Broadcom Corporation
56dbcf2181152a81ab5f3bc5fa765288341a1b7abDmitry Shmidt *
66dbcf2181152a81ab5f3bc5fa765288341a1b7abDmitry Shmidt * Permission to use, copy, modify, and/or distribute this software for any
76dbcf2181152a81ab5f3bc5fa765288341a1b7abDmitry Shmidt * purpose with or without fee is hereby granted, provided that the above
86dbcf2181152a81ab5f3bc5fa765288341a1b7abDmitry Shmidt * copyright notice and this permission notice appear in all copies.
96dbcf2181152a81ab5f3bc5fa765288341a1b7abDmitry Shmidt *
106dbcf2181152a81ab5f3bc5fa765288341a1b7abDmitry Shmidt * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
116dbcf2181152a81ab5f3bc5fa765288341a1b7abDmitry Shmidt * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
126dbcf2181152a81ab5f3bc5fa765288341a1b7abDmitry Shmidt * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
136dbcf2181152a81ab5f3bc5fa765288341a1b7abDmitry Shmidt * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
146dbcf2181152a81ab5f3bc5fa765288341a1b7abDmitry Shmidt * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
156dbcf2181152a81ab5f3bc5fa765288341a1b7abDmitry Shmidt * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
166dbcf2181152a81ab5f3bc5fa765288341a1b7abDmitry Shmidt * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt *
1838eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * $Id: bcmutils.h 382763 2013-02-04 10:21:08Z $
19b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt */
20b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt
21b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt#ifndef	_bcmutils_h_
22b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt#define	_bcmutils_h_
23b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt
24b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt#define bcm_strcpy_s(dst, noOfElements, src)            strcpy((dst), (src))
25b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt#define bcm_strncpy_s(dst, noOfElements, src, count)    strncpy((dst), (src), (count))
26b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt#define bcm_strcat_s(dst, noOfElements, src)            strcat((dst), (src))
27b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt
28b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt#ifdef __cplusplus
29b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidtextern "C" {
30b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt#endif
31b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt
32ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#ifdef PKTQ_LOG
33ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#include <wlioctl.h>
34ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#endif
35ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt
3638eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt/* ctype replacement */
3738eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define _BCM_U	0x01	/* upper */
3838eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define _BCM_L	0x02	/* lower */
3938eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define _BCM_D	0x04	/* digit */
4038eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define _BCM_C	0x08	/* cntrl */
4138eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define _BCM_P	0x10	/* punct */
4238eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define _BCM_S	0x20	/* white space (space/lf/tab) */
4338eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define _BCM_X	0x40	/* hex digit */
4438eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define _BCM_SP	0x80	/* hard space (0x20) */
45b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt
46b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidtextern const unsigned char bcm_ctype[];
47b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt#define bcm_ismask(x)	(bcm_ctype[(int)(unsigned char)(x)])
48b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt
49b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt#define bcm_isalnum(c)	((bcm_ismask(c)&(_BCM_U|_BCM_L|_BCM_D)) != 0)
50b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt#define bcm_isalpha(c)	((bcm_ismask(c)&(_BCM_U|_BCM_L)) != 0)
51b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt#define bcm_iscntrl(c)	((bcm_ismask(c)&(_BCM_C)) != 0)
52b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt#define bcm_isdigit(c)	((bcm_ismask(c)&(_BCM_D)) != 0)
53b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt#define bcm_isgraph(c)	((bcm_ismask(c)&(_BCM_P|_BCM_U|_BCM_L|_BCM_D)) != 0)
54b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt#define bcm_islower(c)	((bcm_ismask(c)&(_BCM_L)) != 0)
55b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt#define bcm_isprint(c)	((bcm_ismask(c)&(_BCM_P|_BCM_U|_BCM_L|_BCM_D|_BCM_SP)) != 0)
56b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt#define bcm_ispunct(c)	((bcm_ismask(c)&(_BCM_P)) != 0)
57b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt#define bcm_isspace(c)	((bcm_ismask(c)&(_BCM_S)) != 0)
58b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt#define bcm_isupper(c)	((bcm_ismask(c)&(_BCM_U)) != 0)
59b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt#define bcm_isxdigit(c)	((bcm_ismask(c)&(_BCM_D|_BCM_X)) != 0)
60b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt#define bcm_tolower(c)	(bcm_isupper((c)) ? ((c) + 'a' - 'A') : (c))
61b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt#define bcm_toupper(c)	(bcm_islower((c)) ? ((c) + 'A' - 'a') : (c))
62b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt
6338eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt/* Buffer structure for collecting string-formatted data
6438eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt* using bcm_bprintf() API.
6538eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt* Use bcm_binit() to initialize before use
6638eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt*/
67b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt
68b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidtstruct bcmstrbuf {
6938eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt	char *buf;	/* pointer to current position in origbuf */
7038eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt	unsigned int size;	/* current (residual) size in bytes */
7138eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt	char *origbuf;	/* unmodified pointer to orignal buffer */
7238eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt	unsigned int origsize;	/* unmodified orignal buffer size in bytes */
73b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt};
74b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt
7538eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt/* ** driver-only section ** */
76b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt#ifdef BCMDRIVER
77b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt#include <osl.h>
78b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt
7938eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define GPIO_PIN_NOTDEFINED 	0x20	/* Pin not defined */
80b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt
8138eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt/*
8238eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * Spin at most 'us' microseconds while 'exp' is true.
8338eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * Caller should explicitly test 'exp' when this completes
8438eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * and take appropriate error action if 'exp' is still true.
8538eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt */
86b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt#define SPINWAIT(exp, us) { \
87b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt	uint countdown = (us) + 9; \
88b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt	while ((exp) && (countdown >= 10)) {\
89b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt		OSL_DELAY(10); \
90b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt		countdown -= 10; \
91b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt	} \
92b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt}
93b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt
9438eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt/* osl multi-precedence packet queue */
95b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt#ifndef PKTQ_LEN_DEFAULT
9638eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define PKTQ_LEN_DEFAULT        128	/* Max 128 packets */
97b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt#endif
98b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt#ifndef PKTQ_MAX_PREC
9938eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define PKTQ_MAX_PREC           16	/* Maximum precedence levels */
100b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt#endif
101b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt
102b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidttypedef struct pktq_prec {
10338eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt	void *head;     /* first packet to dequeue */
10438eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt	void *tail;     /* last packet to dequeue */
10538eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt	uint16 len;     /* number of queued packets */
10638eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt	uint16 max;     /* maximum number of queued packets */
107b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt} pktq_prec_t;
108b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt
109ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#ifdef PKTQ_LOG
110ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidttypedef struct {
11138eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt	uint32 requested;    /* packets requested to be stored */
11238eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt	uint32 stored;	     /* packets stored */
11338eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt	uint32 saved;	     /* packets saved,
11438eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt	                            because a lowest priority queue has given away one packet
11538eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt	                      */
11638eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt	uint32 selfsaved;    /* packets saved,
11738eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt	                            because an older packet from the same queue has been dropped
11838eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt	                      */
11938eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt	uint32 full_dropped; /* packets dropped,
12038eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt	                            because pktq is full with higher precedence packets
12138eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt	                      */
12238eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt	uint32 dropped;      /* packets dropped because pktq per that precedence is full */
12338eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt	uint32 sacrificed;   /* packets dropped,
12438eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt	                            in order to save one from a queue of a highest priority
12538eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt	                      */
12638eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt	uint32 busy;         /* packets droped because of hardware/transmission error */
12738eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt	uint32 retry;        /* packets re-sent because they were not received */
12838eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt	uint32 ps_retry;     /* packets retried again prior to moving power save mode */
12938eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt	uint32 retry_drop;   /* packets finally dropped after retry limit */
13038eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt	uint32 max_avail;    /* the high-water mark of the queue capacity for packets -
13138eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt	                            goes to zero as queue fills
13238eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt	                      */
13338eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt	uint32 max_used;     /* the high-water mark of the queue utilisation for packets -
13438eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt						        increases with use ('inverse' of max_avail)
13538eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt				          */
13638eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt	uint32 queue_capacity; /* the maximum capacity of the queue */
13738eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt	uint32 rtsfail;        /* count of rts attempts that failed to receive cts */
13838eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt	uint32 acked;          /* count of packets sent (acked) successfully */
139ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt} pktq_counters_t;
14038eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#endif /* PKTQ_LOG */
141ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt
142ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt
143ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define PKTQ_COMMON	\
14438eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt	uint16 num_prec;        /* number of precedences in use */			\
14538eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt	uint16 hi_prec;         /* rapid dequeue hint (>= highest non-empty prec) */	\
14638eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt	uint16 max;             /* total max packets */					\
14738eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt	uint16 len;             /* total number of packets */
148b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt
14938eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt/* multi-priority pkt queue */
150b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidtstruct pktq {
151ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt	PKTQ_COMMON
15238eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt	/* q array must be last since # of elements can be either PKTQ_MAX_PREC or 1 */
153b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt	struct pktq_prec q[PKTQ_MAX_PREC];
154ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#ifdef PKTQ_LOG
15538eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt	pktq_counters_t	_prec_cnt[PKTQ_MAX_PREC];     /* Counters per queue  */
15638eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt	pktq_counters_t _prec_bytes[PKTQ_MAX_PREC];   /* Byte count per queue  */
15738eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt	uint32 _logtime;                   /* timestamp of last counter clear  */
158ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#endif
159b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt};
160b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt
16138eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt/* simple, non-priority pkt queue */
162b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidtstruct spktq {
163ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt	PKTQ_COMMON
16438eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt	/* q array must be last since # of elements can be either PKTQ_MAX_PREC or 1 */
165b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt	struct pktq_prec q[1];
166b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt};
167b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt
168b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt#define PKTQ_PREC_ITER(pq, prec)        for (prec = (pq)->num_prec - 1; prec >= 0; prec--)
169b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt
17038eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt/* fn(pkt, arg).  return true if pkt belongs to if */
171b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidttypedef bool (*ifpkt_cb_t)(void*, int);
172b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt
173b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt#ifdef BCMPKTPOOL
174b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt#define POOL_ENAB(pool)		((pool) && (pool)->inited)
175b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt#define SHARED_POOL		(pktpool_shared)
17638eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#else /* BCMPKTPOOL */
177b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt#define POOL_ENAB(bus)		0
178b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt#define SHARED_POOL		((struct pktpool *)NULL)
17938eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#endif /* BCMPKTPOOL */
180b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt
181ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#ifndef PKTPOOL_LEN_MAX
182b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt#define PKTPOOL_LEN_MAX		40
18338eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#endif /* PKTPOOL_LEN_MAX */
184b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt#define PKTPOOL_CB_MAX		3
185b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt
186b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidtstruct pktpool;
187b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidttypedef void (*pktpool_cb_t)(struct pktpool *pool, void *arg);
188b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidttypedef struct {
189b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt	pktpool_cb_t cb;
190b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt	void *arg;
191b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt} pktpool_cbinfo_t;
192b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt
193b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt#ifdef BCMDBG_POOL
19438eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt/* pkt pool debug states */
195b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt#define POOL_IDLE	0
196b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt#define POOL_RXFILL	1
197b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt#define POOL_RXDH	2
198b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt#define POOL_RXD11	3
199b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt#define POOL_TXDH	4
200b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt#define POOL_TXD11	5
201b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt#define POOL_AMPDU	6
202b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt#define POOL_TXENQ	7
203b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt
204b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidttypedef struct {
205b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt	void *p;
206b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt	uint32 cycles;
207b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt	uint32 dur;
208b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt} pktpool_dbg_t;
209b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt
210b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidttypedef struct {
21138eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt	uint8 txdh;	/* tx to host */
21238eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt	uint8 txd11;	/* tx to d11 */
21338eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt	uint8 enq;	/* waiting in q */
21438eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt	uint8 rxdh;	/* rx from host */
21538eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt	uint8 rxd11;	/* rx from d11 */
21638eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt	uint8 rxfill;	/* dma_rxfill */
21738eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt	uint8 idle;	/* avail in pool */
218b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt} pktpool_stats_t;
21938eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#endif /* BCMDBG_POOL */
220b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt
221b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidttypedef struct pktpool {
222b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt	bool inited;
223b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt	uint16 r;
224b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt	uint16 w;
225b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt	uint16 len;
226b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt	uint16 maxlen;
227b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt	uint16 plen;
228b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt	bool istx;
229b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt	bool empty;
230b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt	uint8 cbtoggle;
231b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt	uint8 cbcnt;
232b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt	uint8 ecbcnt;
233b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt	bool emptycb_disable;
234ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt	pktpool_cbinfo_t *availcb_excl;
235b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt	pktpool_cbinfo_t cbs[PKTPOOL_CB_MAX];
236b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt	pktpool_cbinfo_t ecbs[PKTPOOL_CB_MAX];
237b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt	void *q[PKTPOOL_LEN_MAX + 1];
238b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt
239b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt#ifdef BCMDBG_POOL
240b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt	uint8 dbg_cbcnt;
241b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt	pktpool_cbinfo_t dbg_cbs[PKTPOOL_CB_MAX];
242b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt	uint16 dbg_qlen;
243b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt	pktpool_dbg_t dbg_q[PKTPOOL_LEN_MAX + 1];
244b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt#endif
245b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt} pktpool_t;
246b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt
247b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidtextern pktpool_t *pktpool_shared;
248b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt
249b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidtextern int pktpool_init(osl_t *osh, pktpool_t *pktp, int *pktplen, int plen, bool istx);
250b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidtextern int pktpool_deinit(osl_t *osh, pktpool_t *pktp);
251b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidtextern int pktpool_fill(osl_t *osh, pktpool_t *pktp, bool minimal);
252b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidtextern void* pktpool_get(pktpool_t *pktp);
253b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidtextern void pktpool_free(pktpool_t *pktp, void *p);
254b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidtextern int pktpool_add(pktpool_t *pktp, void *p);
255b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidtextern uint16 pktpool_avail(pktpool_t *pktp);
256ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidtextern int pktpool_avail_notify_normal(osl_t *osh, pktpool_t *pktp);
257ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidtextern int pktpool_avail_notify_exclusive(osl_t *osh, pktpool_t *pktp, pktpool_cb_t cb);
258b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidtextern int pktpool_avail_register(pktpool_t *pktp, pktpool_cb_t cb, void *arg);
259b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidtextern int pktpool_empty_register(pktpool_t *pktp, pktpool_cb_t cb, void *arg);
260b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidtextern int pktpool_setmaxlen(pktpool_t *pktp, uint16 maxlen);
261ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidtextern int pktpool_setmaxlen_strict(osl_t *osh, pktpool_t *pktp, uint16 maxlen);
262b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidtextern void pktpool_emptycb_disable(pktpool_t *pktp, bool disable);
263ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidtextern bool pktpool_emptycb_disabled(pktpool_t *pktp);
264b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt
265b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt#define POOLPTR(pp)			((pktpool_t *)(pp))
266b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt#define pktpool_len(pp)			(POOLPTR(pp)->len - 1)
267b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt#define pktpool_plen(pp)		(POOLPTR(pp)->plen)
268b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt#define pktpool_maxlen(pp)		(POOLPTR(pp)->maxlen)
269b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt
270b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt#ifdef BCMDBG_POOL
271b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidtextern int pktpool_dbg_register(pktpool_t *pktp, pktpool_cb_t cb, void *arg);
272b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidtextern int pktpool_start_trigger(pktpool_t *pktp, void *p);
273b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidtextern int pktpool_dbg_dump(pktpool_t *pktp);
274b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidtextern int pktpool_dbg_notify(pktpool_t *pktp);
275b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidtextern int pktpool_stats_dump(pktpool_t *pktp, pktpool_stats_t *stats);
27638eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#endif /* BCMDBG_POOL */
277b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt
27838eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt/* forward definition of ether_addr structure used by some function prototypes */
279b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt
280b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidtstruct ether_addr;
281b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt
282b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidtextern int ether_isbcast(const void *ea);
283b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidtextern int ether_isnulladdr(const void *ea);
284b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt
28538eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt/* operations on a specific precedence in packet queue */
286b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt
287ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define pktq_psetmax(pq, prec, _max)	((pq)->q[prec].max = (_max))
288ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define pktq_pmax(pq, prec)		((pq)->q[prec].max)
289ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define pktq_plen(pq, prec)		((pq)->q[prec].len)
290ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define pktq_pavail(pq, prec)		((pq)->q[prec].max - (pq)->q[prec].len)
291ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define pktq_pfull(pq, prec)		((pq)->q[prec].len >= (pq)->q[prec].max)
292ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define pktq_pempty(pq, prec)		((pq)->q[prec].len == 0)
293b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt
294ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define pktq_ppeek(pq, prec)		((pq)->q[prec].head)
295ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define pktq_ppeek_tail(pq, prec)	((pq)->q[prec].tail)
296b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt
297b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidtextern void *pktq_penq(struct pktq *pq, int prec, void *p);
298b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidtextern void *pktq_penq_head(struct pktq *pq, int prec, void *p);
299b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidtextern void *pktq_pdeq(struct pktq *pq, int prec);
300ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidtextern void *pktq_pdeq_prev(struct pktq *pq, int prec, void *prev_p);
30138eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidtextern void *pktq_pdeq_with_fn(struct pktq *pq, int prec, ifpkt_cb_t fn, int arg);
302b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidtextern void *pktq_pdeq_tail(struct pktq *pq, int prec);
30338eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt/* Empty the queue at particular precedence level */
304b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidtextern void pktq_pflush(osl_t *osh, struct pktq *pq, int prec, bool dir,
305b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt	ifpkt_cb_t fn, int arg);
30638eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt/* Remove a specified packet from its queue */
307b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidtextern bool pktq_pdel(struct pktq *pq, void *p, int prec);
308b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt
30938eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt/* operations on a set of precedences in packet queue */
310b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt
311b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidtextern int pktq_mlen(struct pktq *pq, uint prec_bmp);
312b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidtextern void *pktq_mdeq(struct pktq *pq, uint prec_bmp, int *prec_out);
313ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidtextern void *pktq_mpeek(struct pktq *pq, uint prec_bmp, int *prec_out);
314b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt
31538eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt/* operations on packet queue as a whole */
316b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt
317ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define pktq_len(pq)		((int)(pq)->len)
318ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define pktq_max(pq)		((int)(pq)->max)
319ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define pktq_avail(pq)		((int)((pq)->max - (pq)->len))
320ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define pktq_full(pq)		((pq)->len >= (pq)->max)
321ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define pktq_empty(pq)		((pq)->len == 0)
322b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt
32338eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt/* operations for single precedence queues */
324ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define pktenq(pq, p)		pktq_penq(((struct pktq *)(void *)pq), 0, (p))
325ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define pktenq_head(pq, p)	pktq_penq_head(((struct pktq *)(void *)pq), 0, (p))
326ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define pktdeq(pq)		pktq_pdeq(((struct pktq *)(void *)pq), 0)
327ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define pktdeq_tail(pq)		pktq_pdeq_tail(((struct pktq *)(void *)pq), 0)
328ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define pktqinit(pq, len)	pktq_init(((struct pktq *)(void *)pq), 1, len)
329b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt
330b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidtextern void pktq_init(struct pktq *pq, int num_prec, int max_len);
331ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidtextern void pktq_set_max_plen(struct pktq *pq, int prec, int max_len);
332ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt
33338eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt/* prec_out may be NULL if caller is not interested in return value */
334b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidtextern void *pktq_deq(struct pktq *pq, int *prec_out);
335b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidtextern void *pktq_deq_tail(struct pktq *pq, int *prec_out);
336b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidtextern void *pktq_peek(struct pktq *pq, int *prec_out);
337b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidtextern void *pktq_peek_tail(struct pktq *pq, int *prec_out);
338b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidtextern void pktq_flush(osl_t *osh, struct pktq *pq, bool dir, ifpkt_cb_t fn, int arg);
339b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt
34038eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt/* externs */
34138eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt/* packet */
342b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidtextern uint pktcopy(osl_t *osh, void *p, uint offset, int len, uchar *buf);
343b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidtextern uint pktfrombuf(osl_t *osh, void *p, uint offset, int len, uchar *buf);
344b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidtextern uint pkttotlen(osl_t *osh, void *p);
345b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidtextern void *pktlast(osl_t *osh, void *p);
346b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidtextern uint pktsegcnt(osl_t *osh, void *p);
347ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidtextern uint pktsegcnt_war(osl_t *osh, void *p);
34838eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidtextern uint8 *pktdataoffset(osl_t *osh, void *p,  uint offset);
34938eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidtextern void *pktoffset(osl_t *osh, void *p,  uint offset);
350b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt
35138eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt/* Get priority from a packet and pass it back in scb (or equiv) */
35238eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define	PKTPRIO_VDSCP	0x100		/* DSCP prio found after VLAN tag */
35338eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define	PKTPRIO_VLAN	0x200		/* VLAN prio found */
35438eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define	PKTPRIO_UPD	0x400		/* DSCP used to update VLAN prio */
35538eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define	PKTPRIO_DSCP	0x800		/* DSCP prio found */
356b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt
357b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidtextern uint pktsetprio(void *pkt, bool update_vtag);
358b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt
35938eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt/* string */
360ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidtextern int bcm_atoi(const char *s);
361ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidtextern ulong bcm_strtoul(const char *cp, char **endp, uint base);
362ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidtextern char *bcmstrstr(const char *haystack, const char *needle);
363b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidtextern char *bcmstrcat(char *dest, const char *src);
364b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidtextern char *bcmstrncat(char *dest, const char *src, uint size);
365b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidtextern ulong wchar2ascii(char *abuf, ushort *wbuf, ushort wbuflen, ulong abuflen);
366b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidtchar* bcmstrtok(char **string, const char *delimiters, char *tokdelim);
367b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidtint bcmstricmp(const char *s1, const char *s2);
368b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidtint bcmstrnicmp(const char* s1, const char* s2, int cnt);
369b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt
370b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt
37138eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt/* ethernet address */
372b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidtextern char *bcm_ether_ntoa(const struct ether_addr *ea, char *buf);
373ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidtextern int bcm_ether_atoe(const char *p, struct ether_addr *ea);
374b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt
37538eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt/* ip address */
376b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidtstruct ipv4_addr;
377b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidtextern char *bcm_ip_ntoa(struct ipv4_addr *ia, char *buf);
378b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt
37938eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt/* delay */
380b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidtextern void bcm_mdelay(uint ms);
38138eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt/* variable access */
382ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define NVRAM_RECLAIM_CHECK(name)
383ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt
384b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidtextern char *getvar(char *vars, const char *name);
385b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidtextern int getintvar(char *vars, const char *name);
386b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidtextern int getintvararray(char *vars, const char *name, int index);
387b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidtextern int getintvararraysize(char *vars, const char *name);
388b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidtextern uint getgpiopin(char *vars, char *pin_name, uint def_pin);
389b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt#define bcm_perf_enable()
390b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt#define bcmstats(fmt)
391b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt#define	bcmlog(fmt, a1, a2)
392b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt#define	bcmdumplog(buf, size)	*buf = '\0'
393b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt#define	bcmdumplogent(buf, idx)	-1
394b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt
395b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt#define bcmtslog(tstamp, fmt, a1, a2)
396b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt#define bcmprinttslogs()
397b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt#define bcmprinttstamp(us)
398ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define bcmdumptslog(buf, size)
399b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt
400b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidtextern char *bcm_nvram_vars(uint *length);
401b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidtextern int bcm_nvram_cache(void *sih);
402b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt
40338eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt/* Support for sharing code across in-driver iovar implementations.
40438eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * The intent is that a driver use this structure to map iovar names
40538eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * to its (private) iovar identifiers, and the lookup function to
40638eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * find the entry.  Macros are provided to map ids and get/set actions
40738eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * into a single number space for a switch statement.
40838eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt */
409b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt
41038eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt/* iovar structure */
411b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidttypedef struct bcm_iovar {
41238eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt	const char *name;	/* name for lookup and display */
41338eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt	uint16 varid;		/* id for switch */
41438eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt	uint16 flags;		/* driver-specific flag bits */
41538eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt	uint16 type;		/* base type of argument */
41638eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt	uint16 minlen;		/* min length for buffer vars */
417b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt} bcm_iovar_t;
418b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt
41938eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt/* varid definitions are per-driver, may use these get/set bits */
420b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt
42138eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt/* IOVar action bits for id mapping */
42238eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define IOV_GET 0 /* Get an iovar */
42338eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define IOV_SET 1 /* Set an iovar */
424b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt
42538eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt/* Varid to actionid mapping */
42638eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define IOV_GVAL(id)		((id) * 2)
427ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define IOV_SVAL(id)		((id) * 2 + IOV_SET)
428b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt#define IOV_ISSET(actionid)	((actionid & IOV_SET) == IOV_SET)
429b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt#define IOV_ID(actionid)	(actionid >> 1)
430b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt
43138eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt/* flags are per-driver based on driver attributes */
432b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt
433b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidtextern const bcm_iovar_t *bcm_iovar_lookup(const bcm_iovar_t *table, const char *name);
434b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidtextern int bcm_iovar_lencheck(const bcm_iovar_t *table, void *arg, int len, bool set);
435b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt#if defined(WLTINYDUMP) || defined(WLMSG_INFORM) || defined(WLMSG_ASSOC) || \
436b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt	defined(WLMSG_PRPKT) || defined(WLMSG_WSEC)
437b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidtextern int bcm_format_ssid(char* buf, const uchar ssid[], uint ssid_len);
43838eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#endif
43938eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#endif	/* BCMDRIVER */
44038eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt
44138eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt/* Base type definitions */
44238eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define IOVT_VOID	0	/* no value (implictly set only) */
44338eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define IOVT_BOOL	1	/* any value ok (zero/nonzero) */
44438eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define IOVT_INT8	2	/* integer values are range-checked */
44538eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define IOVT_UINT8	3	/* unsigned int 8 bits */
44638eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define IOVT_INT16	4	/* int 16 bits */
44738eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define IOVT_UINT16	5	/* unsigned int 16 bits */
44838eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define IOVT_INT32	6	/* int 32 bits */
44938eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define IOVT_UINT32	7	/* unsigned int 32 bits */
45038eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define IOVT_BUFFER	8	/* buffer is size-checked as per minlen */
451b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt#define BCM_IOVT_VALID(type) (((unsigned int)(type)) <= IOVT_BUFFER)
452b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt
45338eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt/* Initializer for IOV type strings */
454b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt#define BCM_IOV_TYPE_INIT { \
455b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt	"void", \
456b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt	"bool", \
457b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt	"int8", \
458b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt	"uint8", \
459b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt	"int16", \
460b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt	"uint16", \
461b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt	"int32", \
462b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt	"uint32", \
463b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt	"buffer", \
464b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt	"" }
465b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt
466b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt#define BCM_IOVT_IS_INT(type) (\
467b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt	(type == IOVT_BOOL) || \
468b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt	(type == IOVT_INT8) || \
469b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt	(type == IOVT_UINT8) || \
470b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt	(type == IOVT_INT16) || \
471b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt	(type == IOVT_UINT16) || \
472b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt	(type == IOVT_INT32) || \
473b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt	(type == IOVT_UINT32))
474b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt
47538eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt/* ** driver/apps-shared section ** */
476b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt
47738eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define BCME_STRLEN 		64	/* Max string length for BCM errors */
478b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt#define VALID_BCMERROR(e)  ((e <= 0) && (e >= BCME_LAST))
479b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt
480b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt
48138eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt/*
48238eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * error codes could be added but the defined ones shouldn't be changed/deleted
48338eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * these error codes are exposed to the user code
48438eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * when ever a new error code is added to this list
48538eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * please update errorstring table with the related error string and
48638eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * update osl files with os specific errorcode map
48738eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt*/
48838eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt
48938eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define BCME_OK				0	/* Success */
49038eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define BCME_ERROR			-1	/* Error generic */
49138eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define BCME_BADARG			-2	/* Bad Argument */
49238eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define BCME_BADOPTION			-3	/* Bad option */
49338eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define BCME_NOTUP			-4	/* Not up */
49438eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define BCME_NOTDOWN			-5	/* Not down */
49538eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define BCME_NOTAP			-6	/* Not AP */
49638eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define BCME_NOTSTA			-7	/* Not STA  */
49738eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define BCME_BADKEYIDX			-8	/* BAD Key Index */
49838eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define BCME_RADIOOFF 			-9	/* Radio Off */
49938eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define BCME_NOTBANDLOCKED		-10	/* Not  band locked */
50038eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define BCME_NOCLK			-11	/* No Clock */
50138eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define BCME_BADRATESET			-12	/* BAD Rate valueset */
50238eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define BCME_BADBAND			-13	/* BAD Band */
50338eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define BCME_BUFTOOSHORT		-14	/* Buffer too short */
50438eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define BCME_BUFTOOLONG			-15	/* Buffer too long */
50538eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define BCME_BUSY			-16	/* Busy */
50638eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define BCME_NOTASSOCIATED		-17	/* Not Associated */
50738eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define BCME_BADSSIDLEN			-18	/* Bad SSID len */
50838eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define BCME_OUTOFRANGECHAN		-19	/* Out of Range Channel */
50938eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define BCME_BADCHAN			-20	/* Bad Channel */
51038eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define BCME_BADADDR			-21	/* Bad Address */
51138eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define BCME_NORESOURCE			-22	/* Not Enough Resources */
51238eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define BCME_UNSUPPORTED		-23	/* Unsupported */
51338eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define BCME_BADLEN			-24	/* Bad length */
51438eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define BCME_NOTREADY			-25	/* Not Ready */
51538eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define BCME_EPERM			-26	/* Not Permitted */
51638eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define BCME_NOMEM			-27	/* No Memory */
51738eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define BCME_ASSOCIATED			-28	/* Associated */
51838eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define BCME_RANGE			-29	/* Not In Range */
51938eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define BCME_NOTFOUND			-30	/* Not Found */
52038eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define BCME_WME_NOT_ENABLED		-31	/* WME Not Enabled */
52138eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define BCME_TSPEC_NOTFOUND		-32	/* TSPEC Not Found */
52238eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define BCME_ACM_NOTSUPPORTED		-33	/* ACM Not Supported */
52338eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define BCME_NOT_WME_ASSOCIATION	-34	/* Not WME Association */
52438eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define BCME_SDIO_ERROR			-35	/* SDIO Bus Error */
52538eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define BCME_DONGLE_DOWN		-36	/* Dongle Not Accessible */
52638eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define BCME_VERSION			-37 	/* Incorrect version */
52738eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define BCME_TXFAIL			-38 	/* TX failure */
52838eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define BCME_RXFAIL			-39	/* RX failure */
52938eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define BCME_NODEVICE			-40 	/* Device not present */
53038eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define BCME_NMODE_DISABLED		-41 	/* NMODE disabled */
53138eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define BCME_NONRESIDENT		-42 /* access to nonresident overlay */
53238eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define BCME_SCANREJECT			-43 	/* reject scan request */
53338eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define BCME_USAGE_ERROR                -44     /* WLCMD usage error */
53438eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define BCME_IOCTL_ERROR                -45     /* WLCMD ioctl error */
53538eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define BCME_SERIAL_PORT_ERR            -46     /* RWL serial port error */
53638eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define BCME_LAST			BCME_SERIAL_PORT_ERR
53738eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt
53838eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt/* These are collection of BCME Error strings */
539b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt#define BCMERRSTRINGTABLE {		\
540b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt	"OK",				\
541b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt	"Undefined error",		\
542b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt	"Bad Argument",			\
543b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt	"Bad Option",			\
544b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt	"Not up",			\
545b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt	"Not down",			\
546b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt	"Not AP",			\
547b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt	"Not STA",			\
548b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt	"Bad Key Index",		\
549b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt	"Radio Off",			\
550b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt	"Not band locked",		\
551b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt	"No clock",			\
552b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt	"Bad Rate valueset",		\
553b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt	"Bad Band",			\
554b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt	"Buffer too short",		\
555b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt	"Buffer too long",		\
556b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt	"Busy",				\
557b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt	"Not Associated",		\
558b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt	"Bad SSID len",			\
559b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt	"Out of Range Channel",		\
560b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt	"Bad Channel",			\
561b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt	"Bad Address",			\
562b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt	"Not Enough Resources",		\
563b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt	"Unsupported",			\
564b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt	"Bad length",			\
565b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt	"Not Ready",			\
566b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt	"Not Permitted",		\
567b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt	"No Memory",			\
568b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt	"Associated",			\
569b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt	"Not In Range",			\
570b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt	"Not Found",			\
571b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt	"WME Not Enabled",		\
572b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt	"TSPEC Not Found",		\
573b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt	"ACM Not Supported",		\
574b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt	"Not WME Association",		\
575b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt	"SDIO Bus Error",		\
576b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt	"Dongle Not Accessible",	\
577b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt	"Incorrect version",		\
578b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt	"TX Failure",			\
579b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt	"RX Failure",			\
580b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt	"Device Not Present",		\
581b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt	"NMODE Disabled",		\
582b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt	"Nonresident overlay access", \
58338eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt	"Scan Rejected",		\
58438eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt	"WLCMD usage error",		\
58538eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt	"WLCMD ioctl error",		\
58638eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt	"RWL serial port error", 	\
587b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt}
588b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt
589b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt#ifndef ABS
59038eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define	ABS(a)			(((a) < 0) ? -(a) : (a))
59138eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#endif /* ABS */
592b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt
593b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt#ifndef MIN
59438eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define	MIN(a, b)		(((a) < (b)) ? (a) : (b))
59538eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#endif /* MIN */
596b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt
597b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt#ifndef MAX
59838eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define	MAX(a, b)		(((a) > (b)) ? (a) : (b))
59938eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#endif /* MAX */
60038eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt
60138eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt/* limit to [min, max] */
60238eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#ifndef LIMIT_TO_RANGE
60338eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define LIMIT_TO_RANGE(x, min, max) \
60438eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt	((x) < (min) ? (min) : ((x) > (max) ? (max) : (x)))
60538eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#endif /* LIMIT_TO_RANGE */
60638eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt
60738eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt/* limit to  max */
60838eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#ifndef LIMIT_TO_MAX
60938eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define LIMIT_TO_MAX(x, max) \
61038eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt	(((x) > (max) ? (max) : (x)))
61138eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#endif /* LIMIT_TO_MAX */
61238eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt
61338eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt/* limit to min */
61438eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#ifndef LIMIT_TO_MIN
61538eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define LIMIT_TO_MIN(x, min) \
61638eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt	(((x) < (min) ? (min) : (x)))
61738eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#endif /* LIMIT_TO_MIN */
61838eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt
61938eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define CEIL(x, y)		(((x) + ((y) - 1)) / (y))
62038eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define	ROUNDUP(x, y)		((((x) + ((y) - 1)) / (y)) * (y))
62138eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define	ISALIGNED(a, x)		(((uintptr)(a) & ((x) - 1)) == 0)
622b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt#define ALIGN_ADDR(addr, boundary) (void *)(((uintptr)(addr) + (boundary) - 1) \
623b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt	                                         & ~((boundary) - 1))
624ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define ALIGN_SIZE(size, boundary) (((size) + (boundary) - 1) \
625ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt	                                         & ~((boundary) - 1))
626ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define	ISPOWEROF2(x)		((((x) - 1) & (x)) == 0)
627b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt#define VALID_MASK(mask)	!((mask) & ((mask) + 1))
628ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt
629b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt#ifndef OFFSETOF
630ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#ifdef __ARMCC_VERSION
63138eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt/*
63238eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * The ARM RVCT compiler complains when using OFFSETOF where a constant
63338eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * expression is expected, such as an initializer for a static object.
63438eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt * offsetof from the runtime library doesn't have that problem.
63538eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt */
636ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#include <stddef.h>
637ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define	OFFSETOF(type, member)	offsetof(type, member)
638ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#else
639ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define	OFFSETOF(type, member)	((uint)(uintptr)&((type *)0)->member)
64038eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#endif /* __ARMCC_VERSION */
64138eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#endif /* OFFSETOF */
642ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt
643b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt#ifndef ARRAYSIZE
64438eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define ARRAYSIZE(a)		(sizeof(a) / sizeof(a[0]))
645b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt#endif
646b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt
64738eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#ifndef ARRAYLAST     /* returns pointer to last array element */
64838eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define ARRAYLAST(a)		(&a[ARRAYSIZE(a)-1])
64938eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#endif
650b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt
65138eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt/* Reference a function; used to prevent a static function from being optimized out */
652b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidtextern void *_bcmutils_dummy_fn;
653b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt#define REFERENCE_FUNCTION(f)	(_bcmutils_dummy_fn = (void *)(f))
654b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt
65538eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt/* bit map related macros */
656b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt#ifndef setbit
65738eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#ifndef NBBY		    /* the BSD family defines NBBY */
65838eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define	NBBY	8	/* 8 bits per byte */
65938eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#endif /* #ifndef NBBY */
66038eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#ifdef BCMUTILS_BIT_MACROS_USE_FUNCS
66138eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidtextern void setbit(void *array, uint bit);
66238eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidtextern void clrbit(void *array, uint bit);
66338eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidtextern bool isset(const void *array, uint bit);
66438eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidtextern bool isclr(const void *array, uint bit);
66538eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#else
66638eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define	setbit(a, i)	(((uint8 *)a)[(i) / NBBY] |= 1 << ((i) % NBBY))
66738eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define	clrbit(a, i)	(((uint8 *)a)[(i) / NBBY] &= ~(1 << ((i) % NBBY)))
66838eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define	isset(a, i)	(((const uint8 *)a)[(i) / NBBY] & (1 << ((i) % NBBY)))
66938eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define	isclr(a, i)	((((const uint8 *)a)[(i) / NBBY] & (1 << ((i) % NBBY))) == 0)
6706dbcf2181152a81ab5f3bc5fa765288341a1b7abDmitry Shmidt#endif
67138eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#endif /* setbit */
67238eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt
67338eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define	isbitset(a, i)	(((a) & (1 << (i))) != 0)
674b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt
675b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt#define	NBITS(type)	(sizeof(type) * 8)
676b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt#define NBITVAL(nbits)	(1 << (nbits))
677b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt#define MAXBITVAL(nbits)	((1 << (nbits)) - 1)
678b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt#define	NBITMASK(nbits)	MAXBITVAL(nbits)
679b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt#define MAXNBVAL(nbyte)	MAXBITVAL((nbyte) * 8)
680b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt
68138eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt/* basic mux operation - can be optimized on several architectures */
682b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt#define MUX(pred, true, false) ((pred) ? (true) : (false))
683b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt
68438eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt/* modulo inc/dec - assumes x E [0, bound - 1] */
685b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt#define MODDEC(x, bound) MUX((x) == 0, (bound) - 1, (x) - 1)
686b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt#define MODINC(x, bound) MUX((x) == (bound) - 1, 0, (x) + 1)
687b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt
68838eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt/* modulo inc/dec, bound = 2^k */
689b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt#define MODDEC_POW2(x, bound) (((x) - 1) & ((bound) - 1))
690b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt#define MODINC_POW2(x, bound) (((x) + 1) & ((bound) - 1))
691b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt
69238eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt/* modulo add/sub - assumes x, y E [0, bound - 1] */
693b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt#define MODADD(x, y, bound) \
694b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt    MUX((x) + (y) >= (bound), (x) + (y) - (bound), (x) + (y))
695b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt#define MODSUB(x, y, bound) \
696b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt    MUX(((int)(x)) - ((int)(y)) < 0, (x) - (y) + (bound), (x) - (y))
697b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt
69838eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt/* module add/sub, bound = 2^k */
699b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt#define MODADD_POW2(x, y, bound) (((x) + (y)) & ((bound) - 1))
700b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt#define MODSUB_POW2(x, y, bound) (((x) - (y)) & ((bound) - 1))
701b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt
70238eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt/* crc defines */
70338eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define CRC8_INIT_VALUE  0xff		/* Initial CRC8 checksum value */
70438eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define CRC8_GOOD_VALUE  0x9f		/* Good final CRC8 checksum value */
70538eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define CRC16_INIT_VALUE 0xffff		/* Initial CRC16 checksum value */
70638eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define CRC16_GOOD_VALUE 0xf0b8		/* Good final CRC16 checksum value */
70738eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define CRC32_INIT_VALUE 0xffffffff	/* Initial CRC32 checksum value */
70838eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define CRC32_GOOD_VALUE 0xdebb20e3	/* Good final CRC32 checksum value */
709b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt
71038eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt/* use for direct output of MAC address in printf etc */
711ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define MACF				"%02x:%02x:%02x:%02x:%02x:%02x"
712ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define ETHERP_TO_MACF(ea)	((struct ether_addr *) (ea))->octet[0], \
713ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt							((struct ether_addr *) (ea))->octet[1], \
714ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt							((struct ether_addr *) (ea))->octet[2], \
715ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt							((struct ether_addr *) (ea))->octet[3], \
716ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt							((struct ether_addr *) (ea))->octet[4], \
717ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt							((struct ether_addr *) (ea))->octet[5]
718ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt
719ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt#define ETHER_TO_MACF(ea) 	(ea).octet[0], \
720ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt							(ea).octet[1], \
721ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt							(ea).octet[2], \
722ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt							(ea).octet[3], \
723ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt							(ea).octet[4], \
724ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt							(ea).octet[5]
72538eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#if !defined(SIMPLE_MAC_PRINT)
72638eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define MACDBG "%02x:%02x:%02x:%02x:%02x:%02x"
72738eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define MAC2STRDBG(ea) (ea)[0], (ea)[1], (ea)[2], (ea)[3], (ea)[4], (ea)[5]
72838eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#else
72938eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define MACDBG				"%02x:%02x:%02x"
73038eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define MAC2STRDBG(ea) (ea)[0], (ea)[4], (ea)[5]
73138eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#endif /* SIMPLE_MAC_PRINT */
732ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt
73338eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt/* bcm_format_flags() bit description structure */
734b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidttypedef struct bcm_bit_desc {
735b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt	uint32	bit;
736b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt	const char* name;
737b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt} bcm_bit_desc_t;
738b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt
73938eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt/* bcm_format_field */
74038eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidttypedef struct bcm_bit_desc_ex {
74138eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt	uint32 mask;
74238eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt	const bcm_bit_desc_t *bitfield;
74338eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt} bcm_bit_desc_ex_t;
744b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt
74538eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt
74638eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt/* tag_ID/length/value_buffer tuple */
747b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidttypedef struct bcm_tlv {
748b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt	uint8	id;
749b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt	uint8	len;
750b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt	uint8	data[1];
751b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt} bcm_tlv_t;
752b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt
75338eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt/* Check that bcm_tlv_t fits into the given buflen */
754b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt#define bcm_valid_tlv(elt, buflen) ((buflen) >= 2 && (int)(buflen) >= (int)(2 + (elt)->len))
755b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt
75638eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt/* buffer length for ethernet address from bcm_ether_ntoa() */
75738eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define ETHER_ADDR_STR_LEN	18	/* 18-bytes of Ethernet address buffer length */
758b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt
75938eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt/* crypto utility function */
76038eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt/* 128-bit xor: *dst = *src1 xor *src2. dst1, src1 and src2 may have any alignment */
761b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidtstatic INLINE void
762b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidtxor_128bit_block(const uint8 *src1, const uint8 *src2, uint8 *dst)
763b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt{
764b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt	if (
765b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt#ifdef __i386__
766b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt	    1 ||
767b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt#endif
768b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt	    (((uintptr)src1 | (uintptr)src2 | (uintptr)dst) & 3) == 0) {
76938eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt		/* ARM CM3 rel time: 1229 (727 if alignment check could be omitted) */
77038eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt		/* x86 supports unaligned.  This version runs 6x-9x faster on x86. */
771b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt		((uint32 *)dst)[0] = ((const uint32 *)src1)[0] ^ ((const uint32 *)src2)[0];
772b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt		((uint32 *)dst)[1] = ((const uint32 *)src1)[1] ^ ((const uint32 *)src2)[1];
773b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt		((uint32 *)dst)[2] = ((const uint32 *)src1)[2] ^ ((const uint32 *)src2)[2];
774b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt		((uint32 *)dst)[3] = ((const uint32 *)src1)[3] ^ ((const uint32 *)src2)[3];
775b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt	} else {
77638eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt		/* ARM CM3 rel time: 4668 (4191 if alignment check could be omitted) */
777b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt		int k;
778b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt		for (k = 0; k < 16; k++)
779b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt			dst[k] = src1[k] ^ src2[k];
780b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt	}
781b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt}
782b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt
78338eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt/* externs */
78438eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt/* crc */
785b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidtextern uint8 hndcrc8(uint8 *p, uint nbytes, uint8 crc);
786b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidtextern uint16 hndcrc16(uint8 *p, uint nbytes, uint16 crc);
787b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidtextern uint32 hndcrc32(uint8 *p, uint nbytes, uint32 crc);
788b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt
78938eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt/* format/print */
790b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt#if defined(DHD_DEBUG) || defined(WLMSG_PRHDRS) || defined(WLMSG_PRPKT) || \
791b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt	defined(WLMSG_ASSOC)
79238eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt/* print out the value a field has: fields may have 1-32 bits and may hold any value */
79338eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidtextern int bcm_format_field(const bcm_bit_desc_ex_t *bd, uint32 field, char* buf, int len);
79438eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt/* print out which bits in flags are set */
795b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidtextern int bcm_format_flags(const bcm_bit_desc_t *bd, uint32 flags, char* buf, int len);
796b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt#endif
797b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt
798b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt#if defined(DHD_DEBUG) || defined(WLMSG_PRHDRS) || defined(WLMSG_PRPKT) || \
799b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt	defined(WLMSG_ASSOC) || defined(WLMEDIA_PEAKRATE)
800b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidtextern int bcm_format_hex(char *str, const void *bytes, int len);
801b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt#endif
802b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt
803b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidtextern const char *bcm_crypto_algo_name(uint algo);
804b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidtextern char *bcm_chipname(uint chipid, char *buf, uint len);
805b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidtextern char *bcm_brev_str(uint32 brev, char *buf);
806b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidtextern void printbig(char *buf);
807b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidtextern void prhex(const char *msg, uchar *buf, uint len);
808b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt
80938eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt/* IE parsing */
810b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidtextern bcm_tlv_t *bcm_next_tlv(bcm_tlv_t *elt, int *buflen);
811b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidtextern bcm_tlv_t *bcm_parse_tlvs(void *buf, int buflen, uint key);
812b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidtextern bcm_tlv_t *bcm_parse_ordered_tlvs(void *buf, int buflen, uint key);
813b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt
81438eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt/* bcmerror */
815b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidtextern const char *bcmerrorstr(int bcmerror);
81638eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt/* extern bcm_tlv_t *bcm_parse_tlvs(void *buf, int buflen, uint key); */
817b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt
81838eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt/* multi-bool data type: set of bools, mbool is true if any is set */
819b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidttypedef uint32 mbool;
82038eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define mboolset(mb, bit)		((mb) |= (bit))		/* set one bool */
82138eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define mboolclr(mb, bit)		((mb) &= ~(bit))	/* clear one bool */
82238eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#define mboolisset(mb, bit)		(((mb) & (bit)) != 0)	/* TRUE if one bool is set */
823b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt#define	mboolmaskset(mb, mask, val)	((mb) = (((mb) & ~(mask)) | (val)))
824b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt
82538eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt/* generic datastruct to help dump routines */
826b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidtstruct fielddesc {
827b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt	const char *nameandfmt;
828b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt	uint32 	offset;
829b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt	uint32 	len;
830b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt};
831b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt
832b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidtextern void bcm_binit(struct bcmstrbuf *b, char *buf, uint size);
833ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidtextern void bcm_bprhex(struct bcmstrbuf *b, const char *msg, bool newline, uint8 *buf, int len);
834ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidt
835b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidtextern void bcm_inc_bytes(uchar *num, int num_bytes, uint8 amount);
836ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidtextern int bcm_cmp_bytes(const uchar *arg1, const uchar *arg2, uint8 nbytes);
837ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidtextern void bcm_print_bytes(const char *name, const uchar *cdata, int len);
838b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt
839b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidttypedef  uint32 (*bcmutl_rdreg_rtn)(void *arg0, uint arg1, uint32 offset);
840b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidtextern uint bcmdumpfields(bcmutl_rdreg_rtn func_ptr, void *arg0, uint arg1, struct fielddesc *str,
841b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt                          char *buf, uint32 bufsize);
842b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidtextern uint bcm_bitcount(uint8 *bitmap, uint bytelength);
843b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt
844ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidtextern int bcm_bprintf(struct bcmstrbuf *b, const char *fmt, ...);
845b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt
84638eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt/* power conversion */
847ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidtextern uint16 bcm_qdbm_to_mw(uint8 qdbm);
848ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidtextern uint8 bcm_mw_to_qdbm(uint16 mw);
849ac2bc7e7aaad957f235992ff74d5f9af34dc5f88Dmitry Shmidtextern uint bcm_mkiovar(char *name, char *data, uint datalen, char *buf, uint len);
850b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt
851b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidtunsigned int process_nvram_vars(char *varbuf, unsigned int len);
85238eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidtextern bcm_tlv_t *find_vendor_ie(void *tlvs, int tlvs_len,
85338eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt	const char *voui, uint8 *type, int type_len);
85438eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt
85538eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt/* calculate a * b + c */
85638eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidtextern void bcm_uint64_multiple_add(uint32* r_high, uint32* r_low, uint32 a, uint32 b, uint32 c);
85738eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt/* calculate a / b */
85838eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidtextern void bcm_uint64_divide(uint32* r, uint32 a_high, uint32 a_low, uint32 b);
859b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt
860b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt#ifdef __cplusplus
861b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt	}
862b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt#endif
863b6825ab724b9d671db9f26faae035f2d5ade04b6Dmitry Shmidt
86438eaaf5a34502fe465cf8b6ac7a2dfcafa17ba41Dmitry Shmidt#endif	/* _bcmutils_h_ */
865