111374SSukumar.Swaminathan@Sun.COM /* 211374SSukumar.Swaminathan@Sun.COM * CDDL HEADER START 311374SSukumar.Swaminathan@Sun.COM * 411374SSukumar.Swaminathan@Sun.COM * The contents of this file are subject to the terms of the 511374SSukumar.Swaminathan@Sun.COM * Common Development and Distribution License (the "License"). 611374SSukumar.Swaminathan@Sun.COM * You may not use this file except in compliance with the License. 711374SSukumar.Swaminathan@Sun.COM * 811374SSukumar.Swaminathan@Sun.COM * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 911374SSukumar.Swaminathan@Sun.COM * or http://www.opensolaris.org/os/licensing. 1011374SSukumar.Swaminathan@Sun.COM * See the License for the specific language governing permissions 1111374SSukumar.Swaminathan@Sun.COM * and limitations under the License. 1211374SSukumar.Swaminathan@Sun.COM * 1311374SSukumar.Swaminathan@Sun.COM * When distributing Covered Code, include this CDDL HEADER in each 1411374SSukumar.Swaminathan@Sun.COM * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 1511374SSukumar.Swaminathan@Sun.COM * If applicable, add the following below this CDDL HEADER, with the 1611374SSukumar.Swaminathan@Sun.COM * fields enclosed by brackets "[]" replaced with your own identifying 1711374SSukumar.Swaminathan@Sun.COM * information: Portions Copyright [yyyy] [name of copyright owner] 1811374SSukumar.Swaminathan@Sun.COM * 1911374SSukumar.Swaminathan@Sun.COM * CDDL HEADER END 2011374SSukumar.Swaminathan@Sun.COM */ 2111374SSukumar.Swaminathan@Sun.COM 2211374SSukumar.Swaminathan@Sun.COM /* 2311374SSukumar.Swaminathan@Sun.COM * Copyright 2009 Emulex. All rights reserved. 2411374SSukumar.Swaminathan@Sun.COM * Use is subject to license terms. 2511374SSukumar.Swaminathan@Sun.COM */ 2611374SSukumar.Swaminathan@Sun.COM 2711374SSukumar.Swaminathan@Sun.COM /* 2811374SSukumar.Swaminathan@Sun.COM * Driver Utility function prototypes 2911374SSukumar.Swaminathan@Sun.COM */ 3011374SSukumar.Swaminathan@Sun.COM 3111374SSukumar.Swaminathan@Sun.COM #ifndef _OCE_UTILS_H_ 3211374SSukumar.Swaminathan@Sun.COM #define _OCE_UTILS_H_ 3311374SSukumar.Swaminathan@Sun.COM 3411374SSukumar.Swaminathan@Sun.COM #ifdef __cplusplus 3511374SSukumar.Swaminathan@Sun.COM extern "C" { 3611374SSukumar.Swaminathan@Sun.COM #endif 3711374SSukumar.Swaminathan@Sun.COM 3811374SSukumar.Swaminathan@Sun.COM #include <sys/types.h> 3911374SSukumar.Swaminathan@Sun.COM #include <sys/list.h> 4011374SSukumar.Swaminathan@Sun.COM 4111374SSukumar.Swaminathan@Sun.COM /* logging macro */ 4211374SSukumar.Swaminathan@Sun.COM #define MOD_CONFIG 0x0001 4311374SSukumar.Swaminathan@Sun.COM #define MOD_TX 0x0002 4411374SSukumar.Swaminathan@Sun.COM #define MOD_RX 0x0004 4511374SSukumar.Swaminathan@Sun.COM #define MOD_ISR 0x0008 4611374SSukumar.Swaminathan@Sun.COM 4711374SSukumar.Swaminathan@Sun.COM #define OCE_DEFAULT_LOG_SETTINGS (CE_WARN | \ 4811374SSukumar.Swaminathan@Sun.COM ((MOD_CONFIG | MOD_TX | MOD_RX) << 16)) 4911374SSukumar.Swaminathan@Sun.COM 50*13020SSukumar.Swaminathan@Sun.COM #define OCE_MAX_LOG_SETTINGS (CE_IGNORE | ((MOD_CONFIG | MOD_TX | \ 51*13020SSukumar.Swaminathan@Sun.COM MOD_RX | MOD_ISR) << 16)) 52*13020SSukumar.Swaminathan@Sun.COM 5311374SSukumar.Swaminathan@Sun.COM #define oce_log(dev_p, level, module, fmt, arg...) { \ 5411374SSukumar.Swaminathan@Sun.COM if (dev_p) { \ 5511374SSukumar.Swaminathan@Sun.COM if ((dev_p->mod_mask & module) && \ 5611374SSukumar.Swaminathan@Sun.COM (dev_p->severity < CE_IGNORE) && \ 5711374SSukumar.Swaminathan@Sun.COM ((uint32_t)level >= dev_p->severity)) \ 58*13020SSukumar.Swaminathan@Sun.COM cmn_err(level, "%s[%d]: " fmt, OCE_MOD_NAME, \ 59*13020SSukumar.Swaminathan@Sun.COM dev_p->dev_id, ## arg); \ 6011374SSukumar.Swaminathan@Sun.COM } else { \ 61*13020SSukumar.Swaminathan@Sun.COM cmn_err(level, "%s[%d]: " fmt, OCE_MOD_NAME, \ 62*13020SSukumar.Swaminathan@Sun.COM 0, ## arg); \ 6311374SSukumar.Swaminathan@Sun.COM } \ 6411374SSukumar.Swaminathan@Sun.COM } 6511374SSukumar.Swaminathan@Sun.COM 6611374SSukumar.Swaminathan@Sun.COM 6711374SSukumar.Swaminathan@Sun.COM /* Time related */ 6811374SSukumar.Swaminathan@Sun.COM #define OCE_USDELAY(x) drv_usecwait((x)) 6911374SSukumar.Swaminathan@Sun.COM #define OCE_MSDELAY(x) OCE_USDELAY((x) * 1000) 7011374SSukumar.Swaminathan@Sun.COM 7111374SSukumar.Swaminathan@Sun.COM /* Misc Macros */ 7211374SSukumar.Swaminathan@Sun.COM #define OCE_LOG2(x) (highbit((x)) - 1) 7311374SSukumar.Swaminathan@Sun.COM #define ADDR_LO(addr) (uint32_t)BMASK_32(addr) /* low 32 bits */ 7411374SSukumar.Swaminathan@Sun.COM #define ADDR_HI(addr) (uint32_t)BMASK_32((addr >> 32)) /* high 32 bits */ 7511374SSukumar.Swaminathan@Sun.COM #define ADDR_64(_HI, _LO) ((uint64_t)(((uint64_t)(_HI) << 32)|(_LO))) 7611374SSukumar.Swaminathan@Sun.COM #define voidptr(x) (void *)((x)) 7711374SSukumar.Swaminathan@Sun.COM #define u32ptr(x) (uint32_t *)voidptr((x)) 7811374SSukumar.Swaminathan@Sun.COM #define ptrtou32(x) (uint32_t)((uint32_t *)(void *)(x)) 7911374SSukumar.Swaminathan@Sun.COM 8011374SSukumar.Swaminathan@Sun.COM #define PAGE_4K (0x1UL << 12) 8111374SSukumar.Swaminathan@Sun.COM #define OFFSET_IN_4K_PAGE(addr) ((off_t)((uint64_t)addr & (PAGE_4K - 1))) 8211374SSukumar.Swaminathan@Sun.COM #define OCE_NUM_PAGES(size) howmany(size, PAGE_4K) 8311374SSukumar.Swaminathan@Sun.COM 8411374SSukumar.Swaminathan@Sun.COM #ifdef OCE_DEBUG 8511374SSukumar.Swaminathan@Sun.COM #define OCE_DUMP(buf, len) { \ 8611374SSukumar.Swaminathan@Sun.COM int i = 0; \ 8711374SSukumar.Swaminathan@Sun.COM uint32_t *p = u32ptr(buf); \ 8811374SSukumar.Swaminathan@Sun.COM for (i = 0; i < len/4; i++) \ 8911374SSukumar.Swaminathan@Sun.COM cmn_err(CE_CONT, "[%d] 0x%x", i, p[i]); \ 9011374SSukumar.Swaminathan@Sun.COM } 9111374SSukumar.Swaminathan@Sun.COM #endif 9211374SSukumar.Swaminathan@Sun.COM 9311374SSukumar.Swaminathan@Sun.COM /* Utility Functions */ 9411374SSukumar.Swaminathan@Sun.COM 9511374SSukumar.Swaminathan@Sun.COM #define OCE_DW_SWAP(datap, length) { \ 96*13020SSukumar.Swaminathan@Sun.COM int len; \ 97*13020SSukumar.Swaminathan@Sun.COM uint32_t *wptr = (uint32_t *)(datap); \ 98*13020SSukumar.Swaminathan@Sun.COM len = (length) + (((length) %4) ? (4 - (4 %(length))) : 0); \ 99*13020SSukumar.Swaminathan@Sun.COM for (len = len/4; len > 0; len--) { \ 100*13020SSukumar.Swaminathan@Sun.COM *wptr = LE_32(*wptr); \ 101*13020SSukumar.Swaminathan@Sun.COM wptr++; \ 102*13020SSukumar.Swaminathan@Sun.COM } \ 10311374SSukumar.Swaminathan@Sun.COM } 10411374SSukumar.Swaminathan@Sun.COM 10511374SSukumar.Swaminathan@Sun.COM 10611374SSukumar.Swaminathan@Sun.COM #ifdef _BIG_ENDIAN 10711374SSukumar.Swaminathan@Sun.COM #define DW_SWAP(_PTR, _LEN) OCE_DW_SWAP(_PTR, _LEN) 10811374SSukumar.Swaminathan@Sun.COM #else 10911374SSukumar.Swaminathan@Sun.COM #define DW_SWAP(_PTR, _LEN) 11011374SSukumar.Swaminathan@Sun.COM #endif 11111374SSukumar.Swaminathan@Sun.COM 11211374SSukumar.Swaminathan@Sun.COM typedef struct oce_list_entry { 11311374SSukumar.Swaminathan@Sun.COM struct oce_list_entry *next; 11411374SSukumar.Swaminathan@Sun.COM struct oce_list_entry *prev; 11511374SSukumar.Swaminathan@Sun.COM }OCE_LIST_NODE_T; 11611374SSukumar.Swaminathan@Sun.COM 11711374SSukumar.Swaminathan@Sun.COM typedef struct { 118*13020SSukumar.Swaminathan@Sun.COM kmutex_t list_lock; 11911374SSukumar.Swaminathan@Sun.COM OCE_LIST_NODE_T head; 12011374SSukumar.Swaminathan@Sun.COM int32_t nitems; 12111374SSukumar.Swaminathan@Sun.COM }OCE_LIST_T; 12211374SSukumar.Swaminathan@Sun.COM 12311374SSukumar.Swaminathan@Sun.COM /* externs for list manipulation functions */ 12411374SSukumar.Swaminathan@Sun.COM 125*13020SSukumar.Swaminathan@Sun.COM 126*13020SSukumar.Swaminathan@Sun.COM void oce_list_link_init(OCE_LIST_NODE_T *list_node); 12711374SSukumar.Swaminathan@Sun.COM void oce_list_create(OCE_LIST_T *list_hdr, void *arg); 12811374SSukumar.Swaminathan@Sun.COM void oce_list_destroy(OCE_LIST_T *list_hdr); 12911374SSukumar.Swaminathan@Sun.COM void oce_list_insert_tail(OCE_LIST_T *list_hdr, OCE_LIST_NODE_T *list_node); 13011374SSukumar.Swaminathan@Sun.COM void *oce_list_remove_head(OCE_LIST_T *list_hdr); 13111374SSukumar.Swaminathan@Sun.COM void oce_list_remove_node(OCE_LIST_T *list_hdr, OCE_LIST_NODE_T *list_node); 13211374SSukumar.Swaminathan@Sun.COM boolean_t oce_list_is_empty(OCE_LIST_T *list_hdr); 13311374SSukumar.Swaminathan@Sun.COM int32_t oce_list_items_avail(OCE_LIST_T *list_hdr); 134*13020SSukumar.Swaminathan@Sun.COM int oce_atomic_reserve(uint32_t *count_p, uint32_t n); 13511374SSukumar.Swaminathan@Sun.COM 13611374SSukumar.Swaminathan@Sun.COM #define OCE_LIST_CREATE(_LH, _LCK_PRI) oce_list_create((_LH), (_LCK_PRI)) 13711374SSukumar.Swaminathan@Sun.COM #define OCE_LIST_DESTROY(_LH) oce_list_destroy((_LH)) 13811374SSukumar.Swaminathan@Sun.COM #define OCE_LIST_INSERT_TAIL(_LH, _N) \ 13911374SSukumar.Swaminathan@Sun.COM oce_list_insert_tail((_LH), (void *)(_N)) 14011374SSukumar.Swaminathan@Sun.COM #define OCE_LIST_REM_HEAD(_LH) oce_list_remove_head((_LH)) 14111374SSukumar.Swaminathan@Sun.COM #define OCE_LIST_EMPTY(_LH) oce_list_is_empty((_LH)) 14211374SSukumar.Swaminathan@Sun.COM #define OCE_LIST_REMOVE(_LH, _N) \ 14311374SSukumar.Swaminathan@Sun.COM oce_list_remove_node((_LH), (void *)(_N)) 14411374SSukumar.Swaminathan@Sun.COM #define OCE_LIST_SIZE(_LH) oce_list_items_avail((_LH)) 145*13020SSukumar.Swaminathan@Sun.COM #define OCE_LIST_LINK_INIT(_N) oce_list_link_init(_N) 146*13020SSukumar.Swaminathan@Sun.COM 147*13020SSukumar.Swaminathan@Sun.COM void oce_gen_hkey(char *hkey, int key_size); 14811374SSukumar.Swaminathan@Sun.COM 14911374SSukumar.Swaminathan@Sun.COM #ifdef __cplusplus 15011374SSukumar.Swaminathan@Sun.COM } 15111374SSukumar.Swaminathan@Sun.COM #endif 15211374SSukumar.Swaminathan@Sun.COM 15311374SSukumar.Swaminathan@Sun.COM #endif /* _OCE_UTILS_H_ */ 154