PageRenderTime 59ms CodeModel.GetById 24ms RepoModel.GetById 0ms app.codeStats 1ms

/drivers/net/wireless/bcmdhd/include/bcmutils.h

https://bitbucket.org/codefirex/kernel_samsung_jf
C Header | 818 lines | 603 code | 190 blank | 25 comment | 55 complexity | 2d544c1845d1c08f4ceae4d7af59a0a3 MD5 | raw file
  1. /*
  2. * Misc useful os-independent macros and functions.
  3. *
  4. * Copyright (C) 1999-2012, Broadcom Corporation
  5. *
  6. * Unless you and Broadcom execute a separate written software license
  7. * agreement governing use of this software, this software is licensed to you
  8. * under the terms of the GNU General Public License version 2 (the "GPL"),
  9. * available at http://www.broadcom.com/licenses/GPLv2.php, with the
  10. * following added to such license:
  11. *
  12. * As a special exception, the copyright holders of this software give you
  13. * permission to link this software with independent modules, and to copy and
  14. * distribute the resulting executable under terms of your choice, provided that
  15. * you also meet, for each linked independent module, the terms and conditions of
  16. * the license of that module. An independent module is a module which is not
  17. * derived from this software. The special exception does not apply to any
  18. * modifications of the software.
  19. *
  20. * Notwithstanding the above, under no circumstances may you combine this
  21. * software in any way with any other Broadcom software provided under a license
  22. * other than the GPL, without Broadcom's express prior written consent.
  23. *
  24. * $Id: bcmutils.h 365744 2012-10-30 22:01:29Z $
  25. */
  26. #ifndef _bcmutils_h_
  27. #define _bcmutils_h_
  28. #define bcm_strcpy_s(dst, noOfElements, src) strcpy((dst), (src))
  29. #define bcm_strncpy_s(dst, noOfElements, src, count) strncpy((dst), (src), (count))
  30. #define bcm_strcat_s(dst, noOfElements, src) strcat((dst), (src))
  31. #ifdef __cplusplus
  32. extern "C" {
  33. #endif
  34. #ifdef PKTQ_LOG
  35. #include <wlioctl.h>
  36. #endif
  37. #define _BCM_U 0x01
  38. #define _BCM_L 0x02
  39. #define _BCM_D 0x04
  40. #define _BCM_C 0x08
  41. #define _BCM_P 0x10
  42. #define _BCM_S 0x20
  43. #define _BCM_X 0x40
  44. #define _BCM_SP 0x80
  45. extern const unsigned char bcm_ctype[];
  46. #define bcm_ismask(x) (bcm_ctype[(int)(unsigned char)(x)])
  47. #define bcm_isalnum(c) ((bcm_ismask(c)&(_BCM_U|_BCM_L|_BCM_D)) != 0)
  48. #define bcm_isalpha(c) ((bcm_ismask(c)&(_BCM_U|_BCM_L)) != 0)
  49. #define bcm_iscntrl(c) ((bcm_ismask(c)&(_BCM_C)) != 0)
  50. #define bcm_isdigit(c) ((bcm_ismask(c)&(_BCM_D)) != 0)
  51. #define bcm_isgraph(c) ((bcm_ismask(c)&(_BCM_P|_BCM_U|_BCM_L|_BCM_D)) != 0)
  52. #define bcm_islower(c) ((bcm_ismask(c)&(_BCM_L)) != 0)
  53. #define bcm_isprint(c) ((bcm_ismask(c)&(_BCM_P|_BCM_U|_BCM_L|_BCM_D|_BCM_SP)) != 0)
  54. #define bcm_ispunct(c) ((bcm_ismask(c)&(_BCM_P)) != 0)
  55. #define bcm_isspace(c) ((bcm_ismask(c)&(_BCM_S)) != 0)
  56. #define bcm_isupper(c) ((bcm_ismask(c)&(_BCM_U)) != 0)
  57. #define bcm_isxdigit(c) ((bcm_ismask(c)&(_BCM_D|_BCM_X)) != 0)
  58. #define bcm_tolower(c) (bcm_isupper((c)) ? ((c) + 'a' - 'A') : (c))
  59. #define bcm_toupper(c) (bcm_islower((c)) ? ((c) + 'A' - 'a') : (c))
  60. struct bcmstrbuf {
  61. char *buf;
  62. unsigned int size;
  63. char *origbuf;
  64. unsigned int origsize;
  65. };
  66. #ifdef BCMDRIVER
  67. #include <osl.h>
  68. #define GPIO_PIN_NOTDEFINED 0x20
  69. #define SPINWAIT(exp, us) { \
  70. uint countdown = (us) + 9; \
  71. while ((exp) && (countdown >= 10)) {\
  72. OSL_DELAY(10); \
  73. countdown -= 10; \
  74. } \
  75. }
  76. #ifndef PKTQ_LEN_DEFAULT
  77. #define PKTQ_LEN_DEFAULT 128
  78. #endif
  79. #ifndef PKTQ_MAX_PREC
  80. #define PKTQ_MAX_PREC 16
  81. #endif
  82. typedef struct pktq_prec {
  83. void *head;
  84. void *tail;
  85. uint16 len;
  86. uint16 max;
  87. } pktq_prec_t;
  88. #ifdef PKTQ_LOG
  89. typedef struct {
  90. uint32 requested;
  91. uint32 stored;
  92. uint32 saved;
  93. uint32 selfsaved;
  94. uint32 full_dropped;
  95. uint32 dropped;
  96. uint32 sacrificed;
  97. uint32 busy;
  98. uint32 retry;
  99. uint32 ps_retry;
  100. uint32 retry_drop;
  101. uint32 max_avail;
  102. uint32 max_used;
  103. uint32 queue_capacity;
  104. uint32 rtsfail;
  105. uint32 acked;
  106. } pktq_counters_t;
  107. #endif
  108. #define PKTQ_COMMON \
  109. uint16 num_prec; \
  110. uint16 hi_prec; \
  111. uint16 max; \
  112. uint16 len;
  113. struct pktq {
  114. PKTQ_COMMON
  115. struct pktq_prec q[PKTQ_MAX_PREC];
  116. #ifdef PKTQ_LOG
  117. pktq_counters_t _prec_cnt[PKTQ_MAX_PREC];
  118. pktq_counters_t _prec_bytes[PKTQ_MAX_PREC];
  119. uint32 _logtime;
  120. #endif
  121. };
  122. struct spktq {
  123. PKTQ_COMMON
  124. struct pktq_prec q[1];
  125. };
  126. #define PKTQ_PREC_ITER(pq, prec) for (prec = (pq)->num_prec - 1; prec >= 0; prec--)
  127. typedef bool (*ifpkt_cb_t)(void*, int);
  128. #ifdef BCMPKTPOOL
  129. #define POOL_ENAB(pool) ((pool) && (pool)->inited)
  130. #if defined(BCM4329C0)
  131. #define SHARED_POOL (pktpool_shared_ptr)
  132. #else
  133. #define SHARED_POOL (pktpool_shared)
  134. #endif
  135. #else
  136. #define POOL_ENAB(bus) 0
  137. #define SHARED_POOL ((struct pktpool *)NULL)
  138. #endif
  139. #ifndef PKTPOOL_LEN_MAX
  140. #define PKTPOOL_LEN_MAX 40
  141. #endif
  142. #define PKTPOOL_CB_MAX 3
  143. struct pktpool;
  144. typedef void (*pktpool_cb_t)(struct pktpool *pool, void *arg);
  145. typedef struct {
  146. pktpool_cb_t cb;
  147. void *arg;
  148. } pktpool_cbinfo_t;
  149. #ifdef BCMDBG_POOL
  150. #define POOL_IDLE 0
  151. #define POOL_RXFILL 1
  152. #define POOL_RXDH 2
  153. #define POOL_RXD11 3
  154. #define POOL_TXDH 4
  155. #define POOL_TXD11 5
  156. #define POOL_AMPDU 6
  157. #define POOL_TXENQ 7
  158. typedef struct {
  159. void *p;
  160. uint32 cycles;
  161. uint32 dur;
  162. } pktpool_dbg_t;
  163. typedef struct {
  164. uint8 txdh;
  165. uint8 txd11;
  166. uint8 enq;
  167. uint8 rxdh;
  168. uint8 rxd11;
  169. uint8 rxfill;
  170. uint8 idle;
  171. } pktpool_stats_t;
  172. #endif
  173. typedef struct pktpool {
  174. bool inited;
  175. uint16 r;
  176. uint16 w;
  177. uint16 len;
  178. uint16 maxlen;
  179. uint16 plen;
  180. bool istx;
  181. bool empty;
  182. uint8 cbtoggle;
  183. uint8 cbcnt;
  184. uint8 ecbcnt;
  185. bool emptycb_disable;
  186. pktpool_cbinfo_t *availcb_excl;
  187. pktpool_cbinfo_t cbs[PKTPOOL_CB_MAX];
  188. pktpool_cbinfo_t ecbs[PKTPOOL_CB_MAX];
  189. void *q[PKTPOOL_LEN_MAX + 1];
  190. #ifdef BCMDBG_POOL
  191. uint8 dbg_cbcnt;
  192. pktpool_cbinfo_t dbg_cbs[PKTPOOL_CB_MAX];
  193. uint16 dbg_qlen;
  194. pktpool_dbg_t dbg_q[PKTPOOL_LEN_MAX + 1];
  195. #endif
  196. } pktpool_t;
  197. #if defined(BCM4329C0)
  198. extern pktpool_t *pktpool_shared_ptr;
  199. #else
  200. extern pktpool_t *pktpool_shared;
  201. #endif
  202. extern int pktpool_init(osl_t *osh, pktpool_t *pktp, int *pktplen, int plen, bool istx);
  203. extern int pktpool_deinit(osl_t *osh, pktpool_t *pktp);
  204. extern int pktpool_fill(osl_t *osh, pktpool_t *pktp, bool minimal);
  205. extern void* pktpool_get(pktpool_t *pktp);
  206. extern void pktpool_free(pktpool_t *pktp, void *p);
  207. extern int pktpool_add(pktpool_t *pktp, void *p);
  208. extern uint16 pktpool_avail(pktpool_t *pktp);
  209. extern int pktpool_avail_notify_normal(osl_t *osh, pktpool_t *pktp);
  210. extern int pktpool_avail_notify_exclusive(osl_t *osh, pktpool_t *pktp, pktpool_cb_t cb);
  211. extern int pktpool_avail_register(pktpool_t *pktp, pktpool_cb_t cb, void *arg);
  212. extern int pktpool_empty_register(pktpool_t *pktp, pktpool_cb_t cb, void *arg);
  213. extern int pktpool_setmaxlen(pktpool_t *pktp, uint16 maxlen);
  214. extern int pktpool_setmaxlen_strict(osl_t *osh, pktpool_t *pktp, uint16 maxlen);
  215. extern void pktpool_emptycb_disable(pktpool_t *pktp, bool disable);
  216. extern bool pktpool_emptycb_disabled(pktpool_t *pktp);
  217. #define POOLPTR(pp) ((pktpool_t *)(pp))
  218. #define pktpool_len(pp) (POOLPTR(pp)->len - 1)
  219. #define pktpool_plen(pp) (POOLPTR(pp)->plen)
  220. #define pktpool_maxlen(pp) (POOLPTR(pp)->maxlen)
  221. #ifdef BCMDBG_POOL
  222. extern int pktpool_dbg_register(pktpool_t *pktp, pktpool_cb_t cb, void *arg);
  223. extern int pktpool_start_trigger(pktpool_t *pktp, void *p);
  224. extern int pktpool_dbg_dump(pktpool_t *pktp);
  225. extern int pktpool_dbg_notify(pktpool_t *pktp);
  226. extern int pktpool_stats_dump(pktpool_t *pktp, pktpool_stats_t *stats);
  227. #endif
  228. struct ether_addr;
  229. extern int ether_isbcast(const void *ea);
  230. extern int ether_isnulladdr(const void *ea);
  231. #define pktq_psetmax(pq, prec, _max) ((pq)->q[prec].max = (_max))
  232. #define pktq_pmax(pq, prec) ((pq)->q[prec].max)
  233. #define pktq_plen(pq, prec) ((pq)->q[prec].len)
  234. #define pktq_pavail(pq, prec) ((pq)->q[prec].max - (pq)->q[prec].len)
  235. #define pktq_pfull(pq, prec) ((pq)->q[prec].len >= (pq)->q[prec].max)
  236. #define pktq_pempty(pq, prec) ((pq)->q[prec].len == 0)
  237. #define pktq_ppeek(pq, prec) ((pq)->q[prec].head)
  238. #define pktq_ppeek_tail(pq, prec) ((pq)->q[prec].tail)
  239. extern void *pktq_penq(struct pktq *pq, int prec, void *p);
  240. extern void *pktq_penq_head(struct pktq *pq, int prec, void *p);
  241. extern void *pktq_pdeq(struct pktq *pq, int prec);
  242. extern void *pktq_pdeq_prev(struct pktq *pq, int prec, void *prev_p);
  243. extern void *pktq_pdeq_with_fn(struct pktq *pq, int prec, ifpkt_cb_t fn, int arg);
  244. extern void *pktq_pdeq_tail(struct pktq *pq, int prec);
  245. extern void pktq_pflush(osl_t *osh, struct pktq *pq, int prec, bool dir,
  246. ifpkt_cb_t fn, int arg);
  247. extern bool pktq_pdel(struct pktq *pq, void *p, int prec);
  248. extern int pktq_mlen(struct pktq *pq, uint prec_bmp);
  249. extern void *pktq_mdeq(struct pktq *pq, uint prec_bmp, int *prec_out);
  250. extern void *pktq_mpeek(struct pktq *pq, uint prec_bmp, int *prec_out);
  251. #define pktq_len(pq) ((int)(pq)->len)
  252. #define pktq_max(pq) ((int)(pq)->max)
  253. #define pktq_avail(pq) ((int)((pq)->max - (pq)->len))
  254. #define pktq_full(pq) ((pq)->len >= (pq)->max)
  255. #define pktq_empty(pq) ((pq)->len == 0)
  256. #define pktenq(pq, p) pktq_penq(((struct pktq *)(void *)pq), 0, (p))
  257. #define pktenq_head(pq, p) pktq_penq_head(((struct pktq *)(void *)pq), 0, (p))
  258. #define pktdeq(pq) pktq_pdeq(((struct pktq *)(void *)pq), 0)
  259. #define pktdeq_tail(pq) pktq_pdeq_tail(((struct pktq *)(void *)pq), 0)
  260. #define pktqinit(pq, len) pktq_init(((struct pktq *)(void *)pq), 1, len)
  261. extern void pktq_init(struct pktq *pq, int num_prec, int max_len);
  262. extern void pktq_set_max_plen(struct pktq *pq, int prec, int max_len);
  263. extern void *pktq_deq(struct pktq *pq, int *prec_out);
  264. extern void *pktq_deq_tail(struct pktq *pq, int *prec_out);
  265. extern void *pktq_peek(struct pktq *pq, int *prec_out);
  266. extern void *pktq_peek_tail(struct pktq *pq, int *prec_out);
  267. extern void pktq_flush(osl_t *osh, struct pktq *pq, bool dir, ifpkt_cb_t fn, int arg);
  268. extern uint pktcopy(osl_t *osh, void *p, uint offset, int len, uchar *buf);
  269. extern uint pktfrombuf(osl_t *osh, void *p, uint offset, int len, uchar *buf);
  270. extern uint pkttotlen(osl_t *osh, void *p);
  271. extern void *pktlast(osl_t *osh, void *p);
  272. extern uint pktsegcnt(osl_t *osh, void *p);
  273. extern uint pktsegcnt_war(osl_t *osh, void *p);
  274. extern uint8 *pktdataoffset(osl_t *osh, void *p, uint offset);
  275. extern void *pktoffset(osl_t *osh, void *p, uint offset);
  276. #define PKTPRIO_VDSCP 0x100
  277. #define PKTPRIO_VLAN 0x200
  278. #define PKTPRIO_UPD 0x400
  279. #define PKTPRIO_DSCP 0x800
  280. extern uint pktsetprio(void *pkt, bool update_vtag);
  281. extern int bcm_atoi(const char *s);
  282. extern ulong bcm_strtoul(const char *cp, char **endp, uint base);
  283. extern char *bcmstrstr(const char *haystack, const char *needle);
  284. extern char *bcmstrcat(char *dest, const char *src);
  285. extern char *bcmstrncat(char *dest, const char *src, uint size);
  286. extern ulong wchar2ascii(char *abuf, ushort *wbuf, ushort wbuflen, ulong abuflen);
  287. char* bcmstrtok(char **string, const char *delimiters, char *tokdelim);
  288. int bcmstricmp(const char *s1, const char *s2);
  289. int bcmstrnicmp(const char* s1, const char* s2, int cnt);
  290. extern char *bcm_ether_ntoa(const struct ether_addr *ea, char *buf);
  291. extern int bcm_ether_atoe(const char *p, struct ether_addr *ea);
  292. struct ipv4_addr;
  293. extern char *bcm_ip_ntoa(struct ipv4_addr *ia, char *buf);
  294. extern void bcm_mdelay(uint ms);
  295. #define NVRAM_RECLAIM_CHECK(name)
  296. extern char *getvar(char *vars, const char *name);
  297. extern int getintvar(char *vars, const char *name);
  298. extern int getintvararray(char *vars, const char *name, int index);
  299. extern int getintvararraysize(char *vars, const char *name);
  300. extern uint getgpiopin(char *vars, char *pin_name, uint def_pin);
  301. #define bcm_perf_enable()
  302. #define bcmstats(fmt)
  303. #define bcmlog(fmt, a1, a2)
  304. #define bcmdumplog(buf, size) *buf = '\0'
  305. #define bcmdumplogent(buf, idx) -1
  306. #define bcmtslog(tstamp, fmt, a1, a2)
  307. #define bcmprinttslogs()
  308. #define bcmprinttstamp(us)
  309. #define bcmdumptslog(buf, size)
  310. extern char *bcm_nvram_vars(uint *length);
  311. extern int bcm_nvram_cache(void *sih);
  312. typedef struct bcm_iovar {
  313. const char *name;
  314. uint16 varid;
  315. uint16 flags;
  316. uint16 type;
  317. uint16 minlen;
  318. } bcm_iovar_t;
  319. #define IOV_GET 0
  320. #define IOV_SET 1
  321. #define IOV_GVAL(id) ((id) * 2)
  322. #define IOV_SVAL(id) ((id) * 2 + IOV_SET)
  323. #define IOV_ISSET(actionid) ((actionid & IOV_SET) == IOV_SET)
  324. #define IOV_ID(actionid) (actionid >> 1)
  325. extern const bcm_iovar_t *bcm_iovar_lookup(const bcm_iovar_t *table, const char *name);
  326. extern int bcm_iovar_lencheck(const bcm_iovar_t *table, void *arg, int len, bool set);
  327. #if defined(WLTINYDUMP) || defined(WLMSG_INFORM) || defined(WLMSG_ASSOC) || \
  328. defined(WLMSG_PRPKT) || defined(WLMSG_WSEC)
  329. extern int bcm_format_ssid(char* buf, const uchar ssid[], uint ssid_len);
  330. #endif
  331. #endif
  332. #define IOVT_VOID 0
  333. #define IOVT_BOOL 1
  334. #define IOVT_INT8 2
  335. #define IOVT_UINT8 3
  336. #define IOVT_INT16 4
  337. #define IOVT_UINT16 5
  338. #define IOVT_INT32 6
  339. #define IOVT_UINT32 7
  340. #define IOVT_BUFFER 8
  341. #define BCM_IOVT_VALID(type) (((unsigned int)(type)) <= IOVT_BUFFER)
  342. #define BCM_IOV_TYPE_INIT { \
  343. "void", \
  344. "bool", \
  345. "int8", \
  346. "uint8", \
  347. "int16", \
  348. "uint16", \
  349. "int32", \
  350. "uint32", \
  351. "buffer", \
  352. "" }
  353. #define BCM_IOVT_IS_INT(type) (\
  354. (type == IOVT_BOOL) || \
  355. (type == IOVT_INT8) || \
  356. (type == IOVT_UINT8) || \
  357. (type == IOVT_INT16) || \
  358. (type == IOVT_UINT16) || \
  359. (type == IOVT_INT32) || \
  360. (type == IOVT_UINT32))
  361. #define BCME_STRLEN 64
  362. #define VALID_BCMERROR(e) ((e <= 0) && (e >= BCME_LAST))
  363. #define BCME_OK 0
  364. #define BCME_ERROR -1
  365. #define BCME_BADARG -2
  366. #define BCME_BADOPTION -3
  367. #define BCME_NOTUP -4
  368. #define BCME_NOTDOWN -5
  369. #define BCME_NOTAP -6
  370. #define BCME_NOTSTA -7
  371. #define BCME_BADKEYIDX -8
  372. #define BCME_RADIOOFF -9
  373. #define BCME_NOTBANDLOCKED -10
  374. #define BCME_NOCLK -11
  375. #define BCME_BADRATESET -12
  376. #define BCME_BADBAND -13
  377. #define BCME_BUFTOOSHORT -14
  378. #define BCME_BUFTOOLONG -15
  379. #define BCME_BUSY -16
  380. #define BCME_NOTASSOCIATED -17
  381. #define BCME_BADSSIDLEN -18
  382. #define BCME_OUTOFRANGECHAN -19
  383. #define BCME_BADCHAN -20
  384. #define BCME_BADADDR -21
  385. #define BCME_NORESOURCE -22
  386. #define BCME_UNSUPPORTED -23
  387. #define BCME_BADLEN -24
  388. #define BCME_NOTREADY -25
  389. #define BCME_EPERM -26
  390. #define BCME_NOMEM -27
  391. #define BCME_ASSOCIATED -28
  392. #define BCME_RANGE -29
  393. #define BCME_NOTFOUND -30
  394. #define BCME_WME_NOT_ENABLED -31
  395. #define BCME_TSPEC_NOTFOUND -32
  396. #define BCME_ACM_NOTSUPPORTED -33
  397. #define BCME_NOT_WME_ASSOCIATION -34
  398. #define BCME_SDIO_ERROR -35
  399. #define BCME_DONGLE_DOWN -36
  400. #define BCME_VERSION -37
  401. #define BCME_TXFAIL -38
  402. #define BCME_RXFAIL -39
  403. #define BCME_NODEVICE -40
  404. #define BCME_NMODE_DISABLED -41
  405. #define BCME_NONRESIDENT -42
  406. #define BCME_LAST BCME_NONRESIDENT
  407. #define BCMERRSTRINGTABLE { \
  408. "OK", \
  409. "Undefined error", \
  410. "Bad Argument", \
  411. "Bad Option", \
  412. "Not up", \
  413. "Not down", \
  414. "Not AP", \
  415. "Not STA", \
  416. "Bad Key Index", \
  417. "Radio Off", \
  418. "Not band locked", \
  419. "No clock", \
  420. "Bad Rate valueset", \
  421. "Bad Band", \
  422. "Buffer too short", \
  423. "Buffer too long", \
  424. "Busy", \
  425. "Not Associated", \
  426. "Bad SSID len", \
  427. "Out of Range Channel", \
  428. "Bad Channel", \
  429. "Bad Address", \
  430. "Not Enough Resources", \
  431. "Unsupported", \
  432. "Bad length", \
  433. "Not Ready", \
  434. "Not Permitted", \
  435. "No Memory", \
  436. "Associated", \
  437. "Not In Range", \
  438. "Not Found", \
  439. "WME Not Enabled", \
  440. "TSPEC Not Found", \
  441. "ACM Not Supported", \
  442. "Not WME Association", \
  443. "SDIO Bus Error", \
  444. "Dongle Not Accessible", \
  445. "Incorrect version", \
  446. "TX Failure", \
  447. "RX Failure", \
  448. "Device Not Present", \
  449. "NMODE Disabled", \
  450. "Nonresident overlay access", \
  451. }
  452. #ifndef ABS
  453. #define ABS(a) (((a) < 0) ? -(a) : (a))
  454. #endif
  455. #ifndef MIN
  456. #define MIN(a, b) (((a) < (b)) ? (a) : (b))
  457. #endif
  458. #ifndef MAX
  459. #define MAX(a, b) (((a) > (b)) ? (a) : (b))
  460. #endif
  461. #ifndef LIMIT_TO_RANGE
  462. #define LIMIT_TO_RANGE(x, min, max) \
  463. ((x) < (min) ? (min) : ((x) > (max) ? (max) : (x)))
  464. #endif
  465. #ifndef LIMIT_TO_MAX
  466. #define LIMIT_TO_MAX(x, max) \
  467. (((x) > (max) ? (max) : (x)))
  468. #endif
  469. #ifndef LIMIT_TO_MIN
  470. #define LIMIT_TO_MIN(x, min) \
  471. (((x) < (min) ? (min) : (x)))
  472. #endif
  473. #define CEIL(x, y) (((x) + ((y) - 1)) / (y))
  474. #define ROUNDUP(x, y) ((((x) + ((y) - 1)) / (y)) * (y))
  475. #define ISALIGNED(a, x) (((uintptr)(a) & ((x) - 1)) == 0)
  476. #define ALIGN_ADDR(addr, boundary) (void *)(((uintptr)(addr) + (boundary) - 1) \
  477. & ~((boundary) - 1))
  478. #define ALIGN_SIZE(size, boundary) (((size) + (boundary) - 1) \
  479. & ~((boundary) - 1))
  480. #define ISPOWEROF2(x) ((((x) - 1) & (x)) == 0)
  481. #define VALID_MASK(mask) !((mask) & ((mask) + 1))
  482. #ifndef OFFSETOF
  483. #ifdef __ARMCC_VERSION
  484. #include <stddef.h>
  485. #define OFFSETOF(type, member) offsetof(type, member)
  486. #else
  487. #define OFFSETOF(type, member) ((uint)(uintptr)&((type *)0)->member)
  488. #endif
  489. #endif
  490. #ifndef ARRAYSIZE
  491. #define ARRAYSIZE(a) (sizeof(a) / sizeof(a[0]))
  492. #endif
  493. extern void *_bcmutils_dummy_fn;
  494. #define REFERENCE_FUNCTION(f) (_bcmutils_dummy_fn = (void *)(f))
  495. #ifndef setbit
  496. #ifndef NBBY
  497. #define NBBY 8
  498. #endif
  499. #define setbit(a, i) (((uint8 *)a)[(i) / NBBY] |= 1 << ((i) % NBBY))
  500. #define clrbit(a, i) (((uint8 *)a)[(i) / NBBY] &= ~(1 << ((i) % NBBY)))
  501. #define isset(a, i) (((const uint8 *)a)[(i) / NBBY] & (1 << ((i) % NBBY)))
  502. #define isclr(a, i) ((((const uint8 *)a)[(i) / NBBY] & (1 << ((i) % NBBY))) == 0)
  503. #endif
  504. #define isbitset(a, i) (((a) & (1 << (i))) != 0)
  505. #define NBITS(type) (sizeof(type) * 8)
  506. #define NBITVAL(nbits) (1 << (nbits))
  507. #define MAXBITVAL(nbits) ((1 << (nbits)) - 1)
  508. #define NBITMASK(nbits) MAXBITVAL(nbits)
  509. #define MAXNBVAL(nbyte) MAXBITVAL((nbyte) * 8)
  510. #define MUX(pred, true, false) ((pred) ? (true) : (false))
  511. #define MODDEC(x, bound) MUX((x) == 0, (bound) - 1, (x) - 1)
  512. #define MODINC(x, bound) MUX((x) == (bound) - 1, 0, (x) + 1)
  513. #define MODDEC_POW2(x, bound) (((x) - 1) & ((bound) - 1))
  514. #define MODINC_POW2(x, bound) (((x) + 1) & ((bound) - 1))
  515. #define MODADD(x, y, bound) \
  516. MUX((x) + (y) >= (bound), (x) + (y) - (bound), (x) + (y))
  517. #define MODSUB(x, y, bound) \
  518. MUX(((int)(x)) - ((int)(y)) < 0, (x) - (y) + (bound), (x) - (y))
  519. #define MODADD_POW2(x, y, bound) (((x) + (y)) & ((bound) - 1))
  520. #define MODSUB_POW2(x, y, bound) (((x) - (y)) & ((bound) - 1))
  521. #define CRC8_INIT_VALUE 0xff
  522. #define CRC8_GOOD_VALUE 0x9f
  523. #define CRC16_INIT_VALUE 0xffff
  524. #define CRC16_GOOD_VALUE 0xf0b8
  525. #define CRC32_INIT_VALUE 0xffffffff
  526. #define CRC32_GOOD_VALUE 0xdebb20e3
  527. #define MACF "%02x:%02x:%02x:%02x:%02x:%02x"
  528. #define ETHERP_TO_MACF(ea) ((struct ether_addr *) (ea))->octet[0], \
  529. ((struct ether_addr *) (ea))->octet[1], \
  530. ((struct ether_addr *) (ea))->octet[2], \
  531. ((struct ether_addr *) (ea))->octet[3], \
  532. ((struct ether_addr *) (ea))->octet[4], \
  533. ((struct ether_addr *) (ea))->octet[5]
  534. #define ETHER_TO_MACF(ea) (ea).octet[0], \
  535. (ea).octet[1], \
  536. (ea).octet[2], \
  537. (ea).octet[3], \
  538. (ea).octet[4], \
  539. (ea).octet[5]
  540. #if !defined(SIMPLE_MAC_PRINT)
  541. #define MACDBG "%02x:%02x:%02x:%02x:%02x:%02x"
  542. #define MAC2STRDBG(ea) (ea)[0], (ea)[1], (ea)[2], (ea)[3], (ea)[4], (ea)[5]
  543. #else
  544. #define MACDBG "%02x:%02x:%02x"
  545. #define MAC2STRDBG(ea) (ea)[0], (ea)[4], (ea)[5]
  546. #endif
  547. typedef struct bcm_bit_desc {
  548. uint32 bit;
  549. const char* name;
  550. } bcm_bit_desc_t;
  551. typedef struct bcm_bit_desc_ex {
  552. uint32 mask;
  553. const bcm_bit_desc_t *bitfield;
  554. } bcm_bit_desc_ex_t;
  555. typedef struct bcm_tlv {
  556. uint8 id;
  557. uint8 len;
  558. uint8 data[1];
  559. } bcm_tlv_t;
  560. #define bcm_valid_tlv(elt, buflen) ((buflen) >= 2 && (int)(buflen) >= (int)(2 + (elt)->len))
  561. #define ETHER_ADDR_STR_LEN 18
  562. static INLINE void
  563. xor_128bit_block(const uint8 *src1, const uint8 *src2, uint8 *dst)
  564. {
  565. if (
  566. #ifdef __i386__
  567. 1 ||
  568. #endif
  569. (((uintptr)src1 | (uintptr)src2 | (uintptr)dst) & 3) == 0) {
  570. ((uint32 *)dst)[0] = ((const uint32 *)src1)[0] ^ ((const uint32 *)src2)[0];
  571. ((uint32 *)dst)[1] = ((const uint32 *)src1)[1] ^ ((const uint32 *)src2)[1];
  572. ((uint32 *)dst)[2] = ((const uint32 *)src1)[2] ^ ((const uint32 *)src2)[2];
  573. ((uint32 *)dst)[3] = ((const uint32 *)src1)[3] ^ ((const uint32 *)src2)[3];
  574. } else {
  575. int k;
  576. for (k = 0; k < 16; k++)
  577. dst[k] = src1[k] ^ src2[k];
  578. }
  579. }
  580. extern uint8 hndcrc8(uint8 *p, uint nbytes, uint8 crc);
  581. extern uint16 hndcrc16(uint8 *p, uint nbytes, uint16 crc);
  582. extern uint32 hndcrc32(uint8 *p, uint nbytes, uint32 crc);
  583. #if defined(DHD_DEBUG) || defined(WLMSG_PRHDRS) || defined(WLMSG_PRPKT) || \
  584. defined(WLMSG_ASSOC)
  585. extern int bcm_format_field(const bcm_bit_desc_ex_t *bd, uint32 field, char* buf, int len);
  586. extern int bcm_format_flags(const bcm_bit_desc_t *bd, uint32 flags, char* buf, int len);
  587. #endif
  588. #if defined(DHD_DEBUG) || defined(WLMSG_PRHDRS) || defined(WLMSG_PRPKT) || \
  589. defined(WLMSG_ASSOC) || defined(WLMEDIA_PEAKRATE)
  590. extern int bcm_format_hex(char *str, const void *bytes, int len);
  591. #endif
  592. extern const char *bcm_crypto_algo_name(uint algo);
  593. extern char *bcm_chipname(uint chipid, char *buf, uint len);
  594. extern char *bcm_brev_str(uint32 brev, char *buf);
  595. extern void printbig(char *buf);
  596. extern void prhex(const char *msg, uchar *buf, uint len);
  597. extern bcm_tlv_t *bcm_next_tlv(bcm_tlv_t *elt, int *buflen);
  598. extern bcm_tlv_t *bcm_parse_tlvs(void *buf, int buflen, uint key);
  599. extern bcm_tlv_t *bcm_parse_ordered_tlvs(void *buf, int buflen, uint key);
  600. extern const char *bcmerrorstr(int bcmerror);
  601. typedef uint32 mbool;
  602. #define mboolset(mb, bit) ((mb) |= (bit))
  603. #define mboolclr(mb, bit) ((mb) &= ~(bit))
  604. #define mboolisset(mb, bit) (((mb) & (bit)) != 0)
  605. #define mboolmaskset(mb, mask, val) ((mb) = (((mb) & ~(mask)) | (val)))
  606. struct fielddesc {
  607. const char *nameandfmt;
  608. uint32 offset;
  609. uint32 len;
  610. };
  611. extern void bcm_binit(struct bcmstrbuf *b, char *buf, uint size);
  612. extern void bcm_bprhex(struct bcmstrbuf *b, const char *msg, bool newline, uint8 *buf, int len);
  613. extern void bcm_inc_bytes(uchar *num, int num_bytes, uint8 amount);
  614. extern int bcm_cmp_bytes(const uchar *arg1, const uchar *arg2, uint8 nbytes);
  615. extern void bcm_print_bytes(const char *name, const uchar *cdata, int len);
  616. typedef uint32 (*bcmutl_rdreg_rtn)(void *arg0, uint arg1, uint32 offset);
  617. extern uint bcmdumpfields(bcmutl_rdreg_rtn func_ptr, void *arg0, uint arg1, struct fielddesc *str,
  618. char *buf, uint32 bufsize);
  619. extern uint bcm_bitcount(uint8 *bitmap, uint bytelength);
  620. extern int bcm_bprintf(struct bcmstrbuf *b, const char *fmt, ...);
  621. extern uint16 bcm_qdbm_to_mw(uint8 qdbm);
  622. extern uint8 bcm_mw_to_qdbm(uint16 mw);
  623. extern uint bcm_mkiovar(char *name, char *data, uint datalen, char *buf, uint len);
  624. unsigned int process_nvram_vars(char *varbuf, unsigned int len);
  625. #ifdef __cplusplus
  626. }
  627. #endif
  628. #endif