Real-time collaboration for Jupyter Notebooks, Linux Terminals, LaTeX, VS Code, R IDE, and more,
all in one place. Commercial Alternative to JupyterHub.
Real-time collaboration for Jupyter Notebooks, Linux Terminals, LaTeX, VS Code, R IDE, and more,
all in one place. Commercial Alternative to JupyterHub.
Path: blob/next/external/cache/sources/wl/include/bcmutils.h
Views: 3959
/*1* Misc useful os-independent macros and functions.2*3* $Copyright Open Broadcom Corporation$4*5* $Id: bcmutils.h 409286 2013-06-24 22:03:30Z stafford $6*/78#ifndef _bcmutils_h_9#define _bcmutils_h_1011#if defined(UNDER_CE)12#include <bcmsafestr.h>13#else14#define bcm_strcpy_s(dst, noOfElements, src) strcpy((dst), (src))15#define bcm_strncpy_s(dst, noOfElements, src, count) strncpy((dst), (src), (count))16#define bcm_strcat_s(dst, noOfElements, src) strcat((dst), (src))17#endif1819#ifdef __cplusplus20extern "C" {21#endif2223#ifdef PKTQ_LOG24#include <wlioctl.h>25#endif2627/* ctype replacement */28#define _BCM_U 0x01 /* upper */29#define _BCM_L 0x02 /* lower */30#define _BCM_D 0x04 /* digit */31#define _BCM_C 0x08 /* cntrl */32#define _BCM_P 0x10 /* punct */33#define _BCM_S 0x20 /* white space (space/lf/tab) */34#define _BCM_X 0x40 /* hex digit */35#define _BCM_SP 0x80 /* hard space (0x20) */3637#if defined(BCMROMBUILD)38extern const unsigned char BCMROMDATA(bcm_ctype)[];39#else40extern const unsigned char bcm_ctype[];41#endif42#define bcm_ismask(x) (bcm_ctype[(int)(unsigned char)(x)])4344#define bcm_isalnum(c) ((bcm_ismask(c)&(_BCM_U|_BCM_L|_BCM_D)) != 0)45#define bcm_isalpha(c) ((bcm_ismask(c)&(_BCM_U|_BCM_L)) != 0)46#define bcm_iscntrl(c) ((bcm_ismask(c)&(_BCM_C)) != 0)47#define bcm_isdigit(c) ((bcm_ismask(c)&(_BCM_D)) != 0)48#define bcm_isgraph(c) ((bcm_ismask(c)&(_BCM_P|_BCM_U|_BCM_L|_BCM_D)) != 0)49#define bcm_islower(c) ((bcm_ismask(c)&(_BCM_L)) != 0)50#define bcm_isprint(c) ((bcm_ismask(c)&(_BCM_P|_BCM_U|_BCM_L|_BCM_D|_BCM_SP)) != 0)51#define bcm_ispunct(c) ((bcm_ismask(c)&(_BCM_P)) != 0)52#define bcm_isspace(c) ((bcm_ismask(c)&(_BCM_S)) != 0)53#define bcm_isupper(c) ((bcm_ismask(c)&(_BCM_U)) != 0)54#define bcm_isxdigit(c) ((bcm_ismask(c)&(_BCM_D|_BCM_X)) != 0)55#define bcm_tolower(c) (bcm_isupper((c)) ? ((c) + 'a' - 'A') : (c))56#define bcm_toupper(c) (bcm_islower((c)) ? ((c) + 'A' - 'a') : (c))5758/* Buffer structure for collecting string-formatted data59* using bcm_bprintf() API.60* Use bcm_binit() to initialize before use61*/6263struct bcmstrbuf {64char *buf; /* pointer to current position in origbuf */65unsigned int size; /* current (residual) size in bytes */66char *origbuf; /* unmodified pointer to orignal buffer */67unsigned int origsize; /* unmodified orignal buffer size in bytes */68};6970/* ** driver-only section ** */71#ifdef BCMDRIVER72#ifdef EFI73/* forward declare structyre type */74struct spktq;75#endif76#include <osl.h>7778#define GPIO_PIN_NOTDEFINED 0x20 /* Pin not defined */7980/*81* Spin at most 'us' microseconds while 'exp' is true.82* Caller should explicitly test 'exp' when this completes83* and take appropriate error action if 'exp' is still true.84*/85#ifdef MACOSX86#define SPINWAIT_POLL_PERIOD 2087#else88#define SPINWAIT_POLL_PERIOD 1089#endif9091#define SPINWAIT(exp, us) { \92uint countdown = (us) + (SPINWAIT_POLL_PERIOD - 1); \93while ((exp) && (countdown >= SPINWAIT_POLL_PERIOD)) {\94OSL_DELAY(SPINWAIT_POLL_PERIOD); \95countdown -= SPINWAIT_POLL_PERIOD; \96} \97}9899/* osl multi-precedence packet queue */100#define PKTQ_LEN_MAX 0xFFFF /* Max uint16 65535 packets */101#ifndef PKTQ_LEN_DEFAULT102#define PKTQ_LEN_DEFAULT 128 /* Max 128 packets */103#endif104#ifndef PKTQ_MAX_PREC105#define PKTQ_MAX_PREC 16 /* Maximum precedence levels */106#endif107108typedef struct pktq_prec {109void *head; /* first packet to dequeue */110void *tail; /* last packet to dequeue */111uint16 len; /* number of queued packets */112uint16 max; /* maximum number of queued packets */113} pktq_prec_t;114115#ifdef PKTQ_LOG116typedef struct {117uint32 requested; /* packets requested to be stored */118uint32 stored; /* packets stored */119uint32 saved; /* packets saved,120because a lowest priority queue has given away one packet121*/122uint32 selfsaved; /* packets saved,123because an older packet from the same queue has been dropped124*/125uint32 full_dropped; /* packets dropped,126because pktq is full with higher precedence packets127*/128uint32 dropped; /* packets dropped because pktq per that precedence is full */129uint32 sacrificed; /* packets dropped,130in order to save one from a queue of a highest priority131*/132uint32 busy; /* packets droped because of hardware/transmission error */133uint32 retry; /* packets re-sent because they were not received */134uint32 ps_retry; /* packets retried again prior to moving power save mode */135uint32 suppress; /* packets which were suppressed and not transmitted */136uint32 retry_drop; /* packets finally dropped after retry limit */137uint32 max_avail; /* the high-water mark of the queue capacity for packets -138goes to zero as queue fills139*/140uint32 max_used; /* the high-water mark of the queue utilisation for packets -141increases with use ('inverse' of max_avail)142*/143uint32 queue_capacity; /* the maximum capacity of the queue */144uint32 rtsfail; /* count of rts attempts that failed to receive cts */145uint32 acked; /* count of packets sent (acked) successfully */146uint32 txrate_succ; /* running total of phy rate of packets sent successfully */147uint32 txrate_main; /* running totoal of primary phy rate of all packets */148uint32 throughput; /* actual data transferred successfully */149uint32 _logtime; /* timestamp of last counter clear */150} pktq_counters_t;151152typedef struct {153uint32 _prec_log;154pktq_counters_t* _prec_cnt[PKTQ_MAX_PREC]; /* Counters per queue */155} pktq_log_t;156#endif /* PKTQ_LOG */157158159#define PKTQ_COMMON \160uint16 num_prec; /* number of precedences in use */ \161uint16 hi_prec; /* rapid dequeue hint (>= highest non-empty prec) */ \162uint16 max; /* total max packets */ \163uint16 len; /* total number of packets */164165/* multi-priority pkt queue */166struct pktq {167PKTQ_COMMON168/* q array must be last since # of elements can be either PKTQ_MAX_PREC or 1 */169struct pktq_prec q[PKTQ_MAX_PREC];170#ifdef PKTQ_LOG171pktq_log_t* pktqlog;172#endif173};174175/* simple, non-priority pkt queue */176struct spktq {177PKTQ_COMMON178/* q array must be last since # of elements can be either PKTQ_MAX_PREC or 1 */179struct pktq_prec q[1];180};181182#define PKTQ_PREC_ITER(pq, prec) for (prec = (pq)->num_prec - 1; prec >= 0; prec--)183184/* fn(pkt, arg). return true if pkt belongs to if */185typedef bool (*ifpkt_cb_t)(void*, int);186187#ifdef BCMPKTPOOL188#define POOL_ENAB(pool) ((pool) && (pool)->inited)189#if defined(BCM4329C0)190#define SHARED_POOL (pktpool_shared_ptr)191#else192#define SHARED_POOL (pktpool_shared)193#endif /* BCM4329C0 */194#else /* BCMPKTPOOL */195#define POOL_ENAB(bus) 0196#define SHARED_POOL ((struct pktpool *)NULL)197#endif /* BCMPKTPOOL */198199#ifndef PKTPOOL_LEN_MAX200#define PKTPOOL_LEN_MAX 40201#endif /* PKTPOOL_LEN_MAX */202#define PKTPOOL_CB_MAX 3203204struct pktpool;205typedef void (*pktpool_cb_t)(struct pktpool *pool, void *arg);206typedef struct {207pktpool_cb_t cb;208void *arg;209} pktpool_cbinfo_t;210211#ifdef BCMDBG_POOL212/* pkt pool debug states */213#define POOL_IDLE 0214#define POOL_RXFILL 1215#define POOL_RXDH 2216#define POOL_RXD11 3217#define POOL_TXDH 4218#define POOL_TXD11 5219#define POOL_AMPDU 6220#define POOL_TXENQ 7221222typedef struct {223void *p;224uint32 cycles;225uint32 dur;226} pktpool_dbg_t;227228typedef struct {229uint8 txdh; /* tx to host */230uint8 txd11; /* tx to d11 */231uint8 enq; /* waiting in q */232uint8 rxdh; /* rx from host */233uint8 rxd11; /* rx from d11 */234uint8 rxfill; /* dma_rxfill */235uint8 idle; /* avail in pool */236} pktpool_stats_t;237#endif /* BCMDBG_POOL */238239typedef struct pktpool {240bool inited;241uint16 r;242uint16 w;243uint16 len;244uint16 maxlen;245uint16 plen;246bool istx;247bool empty;248uint8 cbtoggle;249uint8 cbcnt;250uint8 ecbcnt;251bool emptycb_disable;252pktpool_cbinfo_t *availcb_excl;253pktpool_cbinfo_t cbs[PKTPOOL_CB_MAX];254pktpool_cbinfo_t ecbs[PKTPOOL_CB_MAX];255void *q[PKTPOOL_LEN_MAX + 1];256257#ifdef BCMDBG_POOL258uint8 dbg_cbcnt;259pktpool_cbinfo_t dbg_cbs[PKTPOOL_CB_MAX];260uint16 dbg_qlen;261pktpool_dbg_t dbg_q[PKTPOOL_LEN_MAX + 1];262#endif263} pktpool_t;264265#if defined(BCM4329C0)266extern pktpool_t *pktpool_shared_ptr;267#else268extern pktpool_t *pktpool_shared;269#endif /* BCM4329C0 */270271extern int pktpool_init(osl_t *osh, pktpool_t *pktp, int *pktplen, int plen, bool istx);272extern int pktpool_deinit(osl_t *osh, pktpool_t *pktp);273extern int pktpool_fill(osl_t *osh, pktpool_t *pktp, bool minimal);274extern void* pktpool_get(pktpool_t *pktp);275extern void pktpool_free(pktpool_t *pktp, void *p);276extern int pktpool_add(pktpool_t *pktp, void *p);277extern uint16 pktpool_avail(pktpool_t *pktp);278extern int pktpool_avail_notify_normal(osl_t *osh, pktpool_t *pktp);279extern int pktpool_avail_notify_exclusive(osl_t *osh, pktpool_t *pktp, pktpool_cb_t cb);280extern int pktpool_avail_register(pktpool_t *pktp, pktpool_cb_t cb, void *arg);281extern int pktpool_empty_register(pktpool_t *pktp, pktpool_cb_t cb, void *arg);282extern int pktpool_setmaxlen(pktpool_t *pktp, uint16 maxlen);283extern int pktpool_setmaxlen_strict(osl_t *osh, pktpool_t *pktp, uint16 maxlen);284extern void pktpool_emptycb_disable(pktpool_t *pktp, bool disable);285extern bool pktpool_emptycb_disabled(pktpool_t *pktp);286287#define POOLPTR(pp) ((pktpool_t *)(pp))288#define pktpool_len(pp) (POOLPTR(pp)->len - 1)289#define pktpool_plen(pp) (POOLPTR(pp)->plen)290#define pktpool_maxlen(pp) (POOLPTR(pp)->maxlen)291292#ifdef BCMDBG_POOL293extern int pktpool_dbg_register(pktpool_t *pktp, pktpool_cb_t cb, void *arg);294extern int pktpool_start_trigger(pktpool_t *pktp, void *p);295extern int pktpool_dbg_dump(pktpool_t *pktp);296extern int pktpool_dbg_notify(pktpool_t *pktp);297extern int pktpool_stats_dump(pktpool_t *pktp, pktpool_stats_t *stats);298#endif /* BCMDBG_POOL */299300/* forward definition of ether_addr structure used by some function prototypes */301302struct ether_addr;303304extern int ether_isbcast(const void *ea);305extern int ether_isnulladdr(const void *ea);306307/* operations on a specific precedence in packet queue */308309#define pktq_psetmax(pq, prec, _max) ((pq)->q[prec].max = (_max))310#define pktq_pmax(pq, prec) ((pq)->q[prec].max)311#define pktq_plen(pq, prec) ((pq)->q[prec].len)312#define pktq_pavail(pq, prec) ((pq)->q[prec].max - (pq)->q[prec].len)313#define pktq_pfull(pq, prec) ((pq)->q[prec].len >= (pq)->q[prec].max)314#define pktq_pempty(pq, prec) ((pq)->q[prec].len == 0)315316#define pktq_ppeek(pq, prec) ((pq)->q[prec].head)317#define pktq_ppeek_tail(pq, prec) ((pq)->q[prec].tail)318319extern void *pktq_penq(struct pktq *pq, int prec, void *p);320extern void *pktq_penq_head(struct pktq *pq, int prec, void *p);321extern void *pktq_pdeq(struct pktq *pq, int prec);322extern void *pktq_pdeq_prev(struct pktq *pq, int prec, void *prev_p);323extern void *pktq_pdeq_tail(struct pktq *pq, int prec);324/* Empty the queue at particular precedence level */325extern void pktq_pflush(osl_t *osh, struct pktq *pq, int prec, bool dir,326ifpkt_cb_t fn, int arg);327/* Remove a specified packet from its queue */328extern bool pktq_pdel(struct pktq *pq, void *p, int prec);329330/* operations on a set of precedences in packet queue */331332extern int pktq_mlen(struct pktq *pq, uint prec_bmp);333extern void *pktq_mdeq(struct pktq *pq, uint prec_bmp, int *prec_out);334extern void *pktq_mpeek(struct pktq *pq, uint prec_bmp, int *prec_out);335336/* operations on packet queue as a whole */337338#define pktq_len(pq) ((int)(pq)->len)339#define pktq_max(pq) ((int)(pq)->max)340#define pktq_avail(pq) ((int)((pq)->max - (pq)->len))341#define pktq_full(pq) ((pq)->len >= (pq)->max)342#define pktq_empty(pq) ((pq)->len == 0)343344/* operations for single precedence queues */345#define pktenq(pq, p) pktq_penq(((struct pktq *)(void *)pq), 0, (p))346#define pktenq_head(pq, p) pktq_penq_head(((struct pktq *)(void *)pq), 0, (p))347#define pktdeq(pq) pktq_pdeq(((struct pktq *)(void *)pq), 0)348#define pktdeq_tail(pq) pktq_pdeq_tail(((struct pktq *)(void *)pq), 0)349#define pktqinit(pq, len) pktq_init(((struct pktq *)(void *)pq), 1, len)350351extern void pktq_init(struct pktq *pq, int num_prec, int max_len);352extern void pktq_set_max_plen(struct pktq *pq, int prec, int max_len);353354/* prec_out may be NULL if caller is not interested in return value */355extern void *pktq_deq(struct pktq *pq, int *prec_out);356extern void *pktq_deq_tail(struct pktq *pq, int *prec_out);357extern void *pktq_peek(struct pktq *pq, int *prec_out);358extern void *pktq_peek_tail(struct pktq *pq, int *prec_out);359extern void pktq_flush(osl_t *osh, struct pktq *pq, bool dir, ifpkt_cb_t fn, int arg);360361/* externs */362/* packet */363extern uint pktcopy(osl_t *osh, void *p, uint offset, int len, uchar *buf);364extern uint pktfrombuf(osl_t *osh, void *p, uint offset, int len, uchar *buf);365extern uint pkttotlen(osl_t *osh, void *p);366extern void *pktlast(osl_t *osh, void *p);367extern uint pktsegcnt(osl_t *osh, void *p);368extern uint pktsegcnt_war(osl_t *osh, void *p);369extern uint8 *pktdataoffset(osl_t *osh, void *p, uint offset);370extern void *pktoffset(osl_t *osh, void *p, uint offset);371372/* Get priority from a packet and pass it back in scb (or equiv) */373#define PKTPRIO_VDSCP 0x100 /* DSCP prio found after VLAN tag */374#define PKTPRIO_VLAN 0x200 /* VLAN prio found */375#define PKTPRIO_UPD 0x400 /* DSCP used to update VLAN prio */376#define PKTPRIO_DSCP 0x800 /* DSCP prio found */377378extern uint pktsetprio(void *pkt, bool update_vtag);379380/* string */381extern int BCMROMFN(bcm_atoi)(const char *s);382extern ulong BCMROMFN(bcm_strtoul)(const char *cp, char **endp, uint base);383extern char *BCMROMFN(bcmstrstr)(const char *haystack, const char *needle);384extern char *BCMROMFN(bcmstrcat)(char *dest, const char *src);385extern char *BCMROMFN(bcmstrncat)(char *dest, const char *src, uint size);386extern ulong wchar2ascii(char *abuf, ushort *wbuf, ushort wbuflen, ulong abuflen);387char* bcmstrtok(char **string, const char *delimiters, char *tokdelim);388int bcmstricmp(const char *s1, const char *s2);389int bcmstrnicmp(const char* s1, const char* s2, int cnt);390391392/* ethernet address */393extern char *bcm_ether_ntoa(const struct ether_addr *ea, char *buf);394extern int BCMROMFN(bcm_ether_atoe)(const char *p, struct ether_addr *ea);395396/* ip address */397struct ipv4_addr;398extern char *bcm_ip_ntoa(struct ipv4_addr *ia, char *buf);399extern char *bcm_ipv6_ntoa(void *ipv6, char *buf);400401/* delay */402extern void bcm_mdelay(uint ms);403/* variable access */404#if defined (DONGLEBUILD) && !defined(WLTEST) && !defined (BCMINTERNAL) && !defined(BCMDBG_DUMP)405#ifdef BCMDBG406#define NVRAM_RECLAIM_CHECK(name) \407if (attach_part_reclaimed == TRUE) { \408printf("%s: NVRAM already reclaimed, %s\n", __FUNCTION__, (name)); \409*(char*) 0 = 0; /* TRAP */ \410return NULL; \411}412#else /* BCMDBG */413#define NVRAM_RECLAIM_CHECK(name) \414if (attach_part_reclaimed == TRUE) { \415*(char*) 0 = 0; /* TRAP */ \416return NULL; \417}418#endif /* BCMDBG */419#else /* DONGLEBUILD && !WLTEST && !BCMINTERNAL && !BCMDBG_DUMP */420#define NVRAM_RECLAIM_CHECK(name)421#endif /* DONGLEBUILD && !WLTEST && !BCMINTERNAL && !BCMDBG_DUMP */422423extern char *getvar(char *vars, const char *name);424extern int getintvar(char *vars, const char *name);425extern int getintvararray(char *vars, const char *name, int index);426extern int getintvararraysize(char *vars, const char *name);427extern uint getgpiopin(char *vars, char *pin_name, uint def_pin);428#ifdef BCMDBG429extern void prpkt(const char *msg, osl_t *osh, void *p0);430#endif /* BCMDBG */431#ifdef BCMPERFSTATS432extern void bcm_perf_enable(void);433extern void bcmstats(char *fmt);434extern void bcmlog(char *fmt, uint a1, uint a2);435extern void bcmdumplog(char *buf, int size);436extern int bcmdumplogent(char *buf, uint idx);437#else438#define bcm_perf_enable()439#define bcmstats(fmt)440#define bcmlog(fmt, a1, a2)441#define bcmdumplog(buf, size) *buf = '\0'442#define bcmdumplogent(buf, idx) -1443#endif /* BCMPERFSTATS */444445#define TSF_TICKS_PER_MS 1024446#if defined(BCMTSTAMPEDLOGS)447/* Store a TSF timestamp and a log line in the log buffer */448extern void bcmtslog(uint32 tstamp, char *fmt, uint a1, uint a2);449/* Print out the log buffer with timestamps */450extern void bcmprinttslogs(void);451/* Print out a microsecond timestamp as "sec.ms.us " */452extern void bcmprinttstamp(uint32 us);453/* Dump to buffer a microsecond timestamp as "sec.ms.us " */454extern void bcmdumptslog(char *buf, int size);455#else456#define bcmtslog(tstamp, fmt, a1, a2)457#define bcmprinttslogs()458#define bcmprinttstamp(us)459#define bcmdumptslog(buf, size)460#endif /* BCMTSTAMPEDLOGS */461462extern char *bcm_nvram_vars(uint *length);463extern int bcm_nvram_cache(void *sih);464465/* Support for sharing code across in-driver iovar implementations.466* The intent is that a driver use this structure to map iovar names467* to its (private) iovar identifiers, and the lookup function to468* find the entry. Macros are provided to map ids and get/set actions469* into a single number space for a switch statement.470*/471472/* iovar structure */473typedef struct bcm_iovar {474const char *name; /* name for lookup and display */475uint16 varid; /* id for switch */476uint16 flags; /* driver-specific flag bits */477uint16 type; /* base type of argument */478uint16 minlen; /* min length for buffer vars */479} bcm_iovar_t;480481/* varid definitions are per-driver, may use these get/set bits */482483/* IOVar action bits for id mapping */484#define IOV_GET 0 /* Get an iovar */485#define IOV_SET 1 /* Set an iovar */486487/* Varid to actionid mapping */488#define IOV_GVAL(id) ((id) * 2)489#define IOV_SVAL(id) ((id) * 2 + IOV_SET)490#define IOV_ISSET(actionid) ((actionid & IOV_SET) == IOV_SET)491#define IOV_ID(actionid) (actionid >> 1)492493/* flags are per-driver based on driver attributes */494495extern const bcm_iovar_t *bcm_iovar_lookup(const bcm_iovar_t *table, const char *name);496extern int bcm_iovar_lencheck(const bcm_iovar_t *table, void *arg, int len, bool set);497#if defined(WLTINYDUMP) || defined(BCMDBG) || defined(WLMSG_INFORM) || \498defined(WLMSG_ASSOC) || defined(WLMSG_PRPKT) || defined(WLMSG_WSEC)499extern int bcm_format_ssid(char* buf, const uchar ssid[], uint ssid_len);500#endif /* WLTINYDUMP || BCMDBG || WLMSG_INFORM || WLMSG_ASSOC || WLMSG_PRPKT */501#endif /* BCMDRIVER */502503/* Base type definitions */504#define IOVT_VOID 0 /* no value (implictly set only) */505#define IOVT_BOOL 1 /* any value ok (zero/nonzero) */506#define IOVT_INT8 2 /* integer values are range-checked */507#define IOVT_UINT8 3 /* unsigned int 8 bits */508#define IOVT_INT16 4 /* int 16 bits */509#define IOVT_UINT16 5 /* unsigned int 16 bits */510#define IOVT_INT32 6 /* int 32 bits */511#define IOVT_UINT32 7 /* unsigned int 32 bits */512#define IOVT_BUFFER 8 /* buffer is size-checked as per minlen */513#define BCM_IOVT_VALID(type) (((unsigned int)(type)) <= IOVT_BUFFER)514515/* Initializer for IOV type strings */516#define BCM_IOV_TYPE_INIT { \517"void", \518"bool", \519"int8", \520"uint8", \521"int16", \522"uint16", \523"int32", \524"uint32", \525"buffer", \526"" }527528#define BCM_IOVT_IS_INT(type) (\529(type == IOVT_BOOL) || \530(type == IOVT_INT8) || \531(type == IOVT_UINT8) || \532(type == IOVT_INT16) || \533(type == IOVT_UINT16) || \534(type == IOVT_INT32) || \535(type == IOVT_UINT32))536537/* ** driver/apps-shared section ** */538539#define BCME_STRLEN 64 /* Max string length for BCM errors */540#define VALID_BCMERROR(e) ((e <= 0) && (e >= BCME_LAST))541542543/*544* error codes could be added but the defined ones shouldn't be changed/deleted545* these error codes are exposed to the user code546* when ever a new error code is added to this list547* please update errorstring table with the related error string and548* update osl files with os specific errorcode map549*/550551#define BCME_OK 0 /* Success */552#define BCME_ERROR -1 /* Error generic */553#define BCME_BADARG -2 /* Bad Argument */554#define BCME_BADOPTION -3 /* Bad option */555#define BCME_NOTUP -4 /* Not up */556#define BCME_NOTDOWN -5 /* Not down */557#define BCME_NOTAP -6 /* Not AP */558#define BCME_NOTSTA -7 /* Not STA */559#define BCME_BADKEYIDX -8 /* BAD Key Index */560#define BCME_RADIOOFF -9 /* Radio Off */561#define BCME_NOTBANDLOCKED -10 /* Not band locked */562#define BCME_NOCLK -11 /* No Clock */563#define BCME_BADRATESET -12 /* BAD Rate valueset */564#define BCME_BADBAND -13 /* BAD Band */565#define BCME_BUFTOOSHORT -14 /* Buffer too short */566#define BCME_BUFTOOLONG -15 /* Buffer too long */567#define BCME_BUSY -16 /* Busy */568#define BCME_NOTASSOCIATED -17 /* Not Associated */569#define BCME_BADSSIDLEN -18 /* Bad SSID len */570#define BCME_OUTOFRANGECHAN -19 /* Out of Range Channel */571#define BCME_BADCHAN -20 /* Bad Channel */572#define BCME_BADADDR -21 /* Bad Address */573#define BCME_NORESOURCE -22 /* Not Enough Resources */574#define BCME_UNSUPPORTED -23 /* Unsupported */575#define BCME_BADLEN -24 /* Bad length */576#define BCME_NOTREADY -25 /* Not Ready */577#define BCME_EPERM -26 /* Not Permitted */578#define BCME_NOMEM -27 /* No Memory */579#define BCME_ASSOCIATED -28 /* Associated */580#define BCME_RANGE -29 /* Not In Range */581#define BCME_NOTFOUND -30 /* Not Found */582#define BCME_WME_NOT_ENABLED -31 /* WME Not Enabled */583#define BCME_TSPEC_NOTFOUND -32 /* TSPEC Not Found */584#define BCME_ACM_NOTSUPPORTED -33 /* ACM Not Supported */585#define BCME_NOT_WME_ASSOCIATION -34 /* Not WME Association */586#define BCME_SDIO_ERROR -35 /* SDIO Bus Error */587#define BCME_DONGLE_DOWN -36 /* Dongle Not Accessible */588#define BCME_VERSION -37 /* Incorrect version */589#define BCME_TXFAIL -38 /* TX failure */590#define BCME_RXFAIL -39 /* RX failure */591#define BCME_NODEVICE -40 /* Device not present */592#define BCME_NMODE_DISABLED -41 /* NMODE disabled */593#define BCME_NONRESIDENT -42 /* access to nonresident overlay */594#define BCME_SCANREJECT -43 /* reject scan request */595/* Leave gap between -44 and -46 to synchronize with trunk. */596#define BCME_DISABLED -47 /* Disabled in this build */597#define BCME_LAST BCME_DISABLED598599/* These are collection of BCME Error strings */600#define BCMERRSTRINGTABLE { \601"OK", \602"Undefined error", \603"Bad Argument", \604"Bad Option", \605"Not up", \606"Not down", \607"Not AP", \608"Not STA", \609"Bad Key Index", \610"Radio Off", \611"Not band locked", \612"No clock", \613"Bad Rate valueset", \614"Bad Band", \615"Buffer too short", \616"Buffer too long", \617"Busy", \618"Not Associated", \619"Bad SSID len", \620"Out of Range Channel", \621"Bad Channel", \622"Bad Address", \623"Not Enough Resources", \624"Unsupported", \625"Bad length", \626"Not Ready", \627"Not Permitted", \628"No Memory", \629"Associated", \630"Not In Range", \631"Not Found", \632"WME Not Enabled", \633"TSPEC Not Found", \634"ACM Not Supported", \635"Not WME Association", \636"SDIO Bus Error", \637"Dongle Not Accessible", \638"Incorrect version", \639"TX Failure", \640"RX Failure", \641"Device Not Present", \642"NMODE Disabled", \643"Nonresident overlay access", \644"Scan Rejected", \645"unused", \646"unused", \647"unused", \648"Disabled", \649}650651#ifndef ABS652#define ABS(a) (((a) < 0) ? -(a) : (a))653#endif /* ABS */654655#ifndef MIN656#define MIN(a, b) (((a) < (b)) ? (a) : (b))657#endif /* MIN */658659#ifndef MAX660#define MAX(a, b) (((a) > (b)) ? (a) : (b))661#endif /* MAX */662663/* limit to [min, max] */664#ifndef LIMIT_TO_RANGE665#define LIMIT_TO_RANGE(x, min, max) \666((x) < (min) ? (min) : ((x) > (max) ? (max) : (x)))667#endif /* LIMIT_TO_RANGE */668669/* limit to max */670#ifndef LIMIT_TO_MAX671#define LIMIT_TO_MAX(x, max) \672(((x) > (max) ? (max) : (x)))673#endif /* LIMIT_TO_MAX */674675/* limit to min */676#ifndef LIMIT_TO_MIN677#define LIMIT_TO_MIN(x, min) \678(((x) < (min) ? (min) : (x)))679#endif /* LIMIT_TO_MIN */680681#define CEIL(x, y) (((x) + ((y) - 1)) / (y))682#define ROUNDUP(x, y) ((((x) + ((y) - 1)) / (y)) * (y))683#define ISALIGNED(a, x) (((uintptr)(a) & ((x) - 1)) == 0)684#define ALIGN_ADDR(addr, boundary) (void *)(((uintptr)(addr) + (boundary) - 1) \685& ~((boundary) - 1))686#define ALIGN_SIZE(size, boundary) (((size) + (boundary) - 1) \687& ~((boundary) - 1))688#define ISPOWEROF2(x) ((((x) - 1) & (x)) == 0)689#define VALID_MASK(mask) !((mask) & ((mask) + 1))690691#ifndef OFFSETOF692#ifdef __ARMCC_VERSION693/*694* The ARM RVCT compiler complains when using OFFSETOF where a constant695* expression is expected, such as an initializer for a static object.696* offsetof from the runtime library doesn't have that problem.697*/698#include <stddef.h>699#define OFFSETOF(type, member) offsetof(type, member)700#elif __GNUC__ >= 4701/* New versions of GCC are also complaining if the usual macro is used */702#define OFFSETOF(type, member) __builtin_offsetof(type, member)703#else704#define OFFSETOF(type, member) ((uint)(uintptr)&((type *)0)->member)705#endif /* __ARMCC_VERSION */706#endif /* OFFSETOF */707708#ifndef ARRAYSIZE709#define ARRAYSIZE(a) (sizeof(a) / sizeof(a[0]))710#endif711712/* Reference a function; used to prevent a static function from being optimized out */713extern void *_bcmutils_dummy_fn;714#define REFERENCE_FUNCTION(f) (_bcmutils_dummy_fn = (void *)(f))715716#if defined(__NetBSD__)717/* use internal718* setbit/clrbit since it has a cast and netbsd Xbit funcs dont719* and the wl driver doesnt cast. this results in us offsetting720* incorrectly and corrupting memory.721*/722#ifdef setbit723#undef setbit724#undef clrbit725#undef isset726#undef isclr727#undef NBBY728#endif729#endif /* __NetBSD__ */730731/* bit map related macros */732#ifndef setbit733#ifndef NBBY /* the BSD family defines NBBY */734#define NBBY 8 /* 8 bits per byte */735#endif /* #ifndef NBBY */736#define setbit(a, i) (((uint8 *)a)[(i) / NBBY] |= 1 << ((i) % NBBY))737#define clrbit(a, i) (((uint8 *)a)[(i) / NBBY] &= ~(1 << ((i) % NBBY)))738#define isset(a, i) (((const uint8 *)a)[(i) / NBBY] & (1 << ((i) % NBBY)))739#define isclr(a, i) ((((const uint8 *)a)[(i) / NBBY] & (1 << ((i) % NBBY))) == 0)740#endif /* setbit */741742#define isbitset(a, i) (((a) & (1 << (i))) != 0)743744#define NBITS(type) (sizeof(type) * 8)745#define NBITVAL(nbits) (1 << (nbits))746#define MAXBITVAL(nbits) ((1 << (nbits)) - 1)747#define NBITMASK(nbits) MAXBITVAL(nbits)748#define MAXNBVAL(nbyte) MAXBITVAL((nbyte) * 8)749750/* basic mux operation - can be optimized on several architectures */751#define MUX(pred, true, false) ((pred) ? (true) : (false))752753/* modulo inc/dec - assumes x E [0, bound - 1] */754#define MODDEC(x, bound) MUX((x) == 0, (bound) - 1, (x) - 1)755#define MODINC(x, bound) MUX((x) == (bound) - 1, 0, (x) + 1)756757/* modulo inc/dec, bound = 2^k */758#define MODDEC_POW2(x, bound) (((x) - 1) & ((bound) - 1))759#define MODINC_POW2(x, bound) (((x) + 1) & ((bound) - 1))760761/* modulo add/sub - assumes x, y E [0, bound - 1] */762#define MODADD(x, y, bound) \763MUX((x) + (y) >= (bound), (x) + (y) - (bound), (x) + (y))764#define MODSUB(x, y, bound) \765MUX(((int)(x)) - ((int)(y)) < 0, (x) - (y) + (bound), (x) - (y))766767/* module add/sub, bound = 2^k */768#define MODADD_POW2(x, y, bound) (((x) + (y)) & ((bound) - 1))769#define MODSUB_POW2(x, y, bound) (((x) - (y)) & ((bound) - 1))770771/* crc defines */772#define CRC8_INIT_VALUE 0xff /* Initial CRC8 checksum value */773#define CRC8_GOOD_VALUE 0x9f /* Good final CRC8 checksum value */774#define CRC16_INIT_VALUE 0xffff /* Initial CRC16 checksum value */775#define CRC16_GOOD_VALUE 0xf0b8 /* Good final CRC16 checksum value */776#define CRC32_INIT_VALUE 0xffffffff /* Initial CRC32 checksum value */777#define CRC32_GOOD_VALUE 0xdebb20e3 /* Good final CRC32 checksum value */778779/* use for direct output of MAC address in printf etc */780#define MACF "%02x:%02x:%02x:%02x:%02x:%02x"781#define ETHERP_TO_MACF(ea) ((struct ether_addr *) (ea))->octet[0], \782((struct ether_addr *) (ea))->octet[1], \783((struct ether_addr *) (ea))->octet[2], \784((struct ether_addr *) (ea))->octet[3], \785((struct ether_addr *) (ea))->octet[4], \786((struct ether_addr *) (ea))->octet[5]787788#define ETHER_TO_MACF(ea) (ea).octet[0], \789(ea).octet[1], \790(ea).octet[2], \791(ea).octet[3], \792(ea).octet[4], \793(ea).octet[5]794795/* bcm_format_flags() bit description structure */796typedef struct bcm_bit_desc {797uint32 bit;798const char* name;799} bcm_bit_desc_t;800801/* bcm_format_field */802typedef struct bcm_bit_desc_ex {803uint32 mask;804const bcm_bit_desc_t *bitfield;805} bcm_bit_desc_ex_t;806807808/* tag_ID/length/value_buffer tuple */809typedef struct bcm_tlv {810uint8 id;811uint8 len;812uint8 data[1];813} bcm_tlv_t;814815/* Check that bcm_tlv_t fits into the given buflen */816#define bcm_valid_tlv(elt, buflen) ((buflen) >= 2 && (int)(buflen) >= (int)(2 + (elt)->len))817818/* buffer length for ethernet address from bcm_ether_ntoa() */819#define ETHER_ADDR_STR_LEN 18 /* 18-bytes of Ethernet address buffer length */820821/* crypto utility function */822/* 128-bit xor: *dst = *src1 xor *src2. dst1, src1 and src2 may have any alignment */823static INLINE void824xor_128bit_block(const uint8 *src1, const uint8 *src2, uint8 *dst)825{826if (827#ifdef __i386__8281 ||829#endif830(((uintptr)src1 | (uintptr)src2 | (uintptr)dst) & 3) == 0) {831/* ARM CM3 rel time: 1229 (727 if alignment check could be omitted) */832/* x86 supports unaligned. This version runs 6x-9x faster on x86. */833((uint32 *)dst)[0] = ((const uint32 *)src1)[0] ^ ((const uint32 *)src2)[0];834((uint32 *)dst)[1] = ((const uint32 *)src1)[1] ^ ((const uint32 *)src2)[1];835((uint32 *)dst)[2] = ((const uint32 *)src1)[2] ^ ((const uint32 *)src2)[2];836((uint32 *)dst)[3] = ((const uint32 *)src1)[3] ^ ((const uint32 *)src2)[3];837} else {838/* ARM CM3 rel time: 4668 (4191 if alignment check could be omitted) */839int k;840for (k = 0; k < 16; k++)841dst[k] = src1[k] ^ src2[k];842}843}844845/* externs */846/* crc */847extern uint8 BCMROMFN(hndcrc8)(uint8 *p, uint nbytes, uint8 crc);848extern uint16 BCMROMFN(hndcrc16)(uint8 *p, uint nbytes, uint16 crc);849extern uint32 BCMROMFN(hndcrc32)(uint8 *p, uint nbytes, uint32 crc);850851/* format/print */852#if defined(BCMDBG) || defined(DHD_DEBUG) || defined(BCMDBG_ERR) || defined(WLMSG_PRHDRS) || \853defined(WLMSG_PRPKT) || defined(WLMSG_ASSOC) || defined(BCMDBG_DUMP)854/* print out the value a field has: fields may have 1-32 bits and may hold any value */855extern int bcm_format_field(const bcm_bit_desc_ex_t *bd, uint32 field, char* buf, int len);856/* print out which bits in flags are set */857extern int bcm_format_flags(const bcm_bit_desc_t *bd, uint32 flags, char* buf, int len);858#endif859860#if defined(BCMDBG) || defined(DHD_DEBUG) || defined(BCMDBG_ERR) || defined(WLMSG_PRHDRS) || \861defined(WLMSG_PRPKT) || defined(WLMSG_ASSOC) || defined(BCMDBG_DUMP) || \862defined(WLMEDIA_PEAKRATE)863extern int bcm_format_hex(char *str, const void *bytes, int len);864#endif865866#ifdef BCMDBG867extern void deadbeef(void *p, uint len);868#endif869extern const char *bcm_crypto_algo_name(uint algo);870extern char *bcm_chipname(uint chipid, char *buf, uint len);871extern char *bcm_brev_str(uint32 brev, char *buf);872extern void printbig(char *buf);873extern void prhex(const char *msg, uchar *buf, uint len);874875/* IE parsing */876extern bcm_tlv_t *BCMROMFN(bcm_next_tlv)(bcm_tlv_t *elt, int *buflen);877extern bcm_tlv_t *BCMROMFN(bcm_parse_tlvs)(void *buf, int buflen, uint key);878extern bcm_tlv_t *BCMROMFN(bcm_parse_ordered_tlvs)(void *buf, int buflen, uint key);879880/* bcmerror */881extern const char *bcmerrorstr(int bcmerror);882extern bcm_tlv_t *BCMROMFN(bcm_parse_tlvs)(void *buf, int buflen, uint key);883884/* multi-bool data type: set of bools, mbool is true if any is set */885typedef uint32 mbool;886#define mboolset(mb, bit) ((mb) |= (bit)) /* set one bool */887#define mboolclr(mb, bit) ((mb) &= ~(bit)) /* clear one bool */888#define mboolisset(mb, bit) (((mb) & (bit)) != 0) /* TRUE if one bool is set */889#define mboolmaskset(mb, mask, val) ((mb) = (((mb) & ~(mask)) | (val)))890891/* generic datastruct to help dump routines */892struct fielddesc {893const char *nameandfmt;894uint32 offset;895uint32 len;896};897898extern void bcm_binit(struct bcmstrbuf *b, char *buf, uint size);899extern void bcm_bprhex(struct bcmstrbuf *b, const char *msg, bool newline, uint8 *buf, int len);900901extern void bcm_inc_bytes(uchar *num, int num_bytes, uint8 amount);902extern int bcm_cmp_bytes(const uchar *arg1, const uchar *arg2, uint8 nbytes);903extern void bcm_print_bytes(const char *name, const uchar *cdata, int len);904905typedef uint32 (*bcmutl_rdreg_rtn)(void *arg0, uint arg1, uint32 offset);906extern uint bcmdumpfields(bcmutl_rdreg_rtn func_ptr, void *arg0, uint arg1, struct fielddesc *str,907char *buf, uint32 bufsize);908extern uint BCMROMFN(bcm_bitcount)(uint8 *bitmap, uint bytelength);909910extern int bcm_bprintf(struct bcmstrbuf *b, const char *fmt, ...);911912/* power conversion */913extern uint16 BCMROMFN(bcm_qdbm_to_mw)(uint8 qdbm);914extern uint8 BCMROMFN(bcm_mw_to_qdbm)(uint16 mw);915extern uint bcm_mkiovar(char *name, char *data, uint datalen, char *buf, uint len);916917#ifdef BCMDBG_PKT /* pkt logging for debugging */918#define PKTLIST_SIZE 3000919920#ifdef BCMDBG_PTRACE921#define PKTTRACE_MAX_BYTES 12922#define PKTTRACE_MAX_BITS (PKTTRACE_MAX_BYTES * NBBY)923924enum pkttrace_info {925PKTLIST_PRECQ, /* Pkt in Prec Q */926PKTLIST_FAIL_PRECQ, /* Pkt failed to Q in PRECQ */927PKTLIST_DMAQ, /* Pkt in DMA Q */928PKTLIST_MI_TFS_RCVD, /* Received TX status */929PKTLIST_TXDONE, /* Pkt TX done */930PKTLIST_TXFAIL, /* Pkt TX failed */931PKTLIST_PKTFREE, /* pkt is freed */932PKTLIST_PRECREQ, /* Pkt requeued in precq */933PKTLIST_TXFIFO /* To trace in wlc_fifo */934};935#endif /* BCMDBG_PTRACE */936937typedef struct pkt_dbginfo {938int line;939char *file;940void *pkt;941#ifdef BCMDBG_PTRACE942char pkt_trace[PKTTRACE_MAX_BYTES];943#endif /* BCMDBG_PTRACE */944} pkt_dbginfo_t;945946typedef struct {947pkt_dbginfo_t list[PKTLIST_SIZE]; /* List of pointers to packets */948uint16 count; /* Total count of the packets */949} pktlist_info_t;950951952extern void pktlist_add(pktlist_info_t *pktlist, void *p, int len, char *file);953extern void pktlist_remove(pktlist_info_t *pktlist, void *p);954extern char* pktlist_dump(pktlist_info_t *pktlist, char *buf);955#ifdef BCMDBG_PTRACE956extern void pktlist_trace(pktlist_info_t *pktlist, void *pkt, uint16 bit);957#endif /* BCMDBG_PTRACE */958#endif /* BCMDBG_PKT */959unsigned int process_nvram_vars(char *varbuf, unsigned int len);960961/* calculate a * b + c */962extern void bcm_uint64_multiple_add(uint32* r_high, uint32* r_low, uint32 a, uint32 b, uint32 c);963/* calculate a / b */964extern void bcm_uint64_divide(uint32* r, uint32 a_high, uint32 a_low, uint32 b);965/* calculate a >> b */966void bcm_uint64_right_shift(uint32* r, uint32 a_high, uint32 a_low, uint32 b);967#ifdef __cplusplus968}969#endif970#endif /* _bcmutils_h_ */971972973