4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan/*
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * CDDL HEADER START
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan *
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * The contents of this file are subject to the terms of the
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * Common Development and Distribution License (the "License").
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * You may not use this file except in compliance with the License.
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan *
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * or http://www.opensolaris.org/os/licensing.
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * See the License for the specific language governing permissions
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * and limitations under the License.
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan *
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * When distributing Covered Code, include this CDDL HEADER in each
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * If applicable, add the following below this CDDL HEADER, with the
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * fields enclosed by brackets "[]" replaced with your own identifying
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * information: Portions Copyright [yyyy] [name of copyright owner]
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan *
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * CDDL HEADER END
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
3abb112f8485b33b6b9b52b340bede0a333c10bfGarrett D'Amore/* Copyright © 2003-2011 Emulex. All rights reserved. */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan/*
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan * Driver Utility function prototypes
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan#ifndef _OCE_UTILS_H_
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan#define _OCE_UTILS_H_
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan#ifdef __cplusplus
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanextern "C" {
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan#endif
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan#include <sys/types.h>
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan#include <sys/list.h>
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan/* logging macro */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan#define MOD_CONFIG 0x0001
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan#define MOD_TX 0x0002
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan#define MOD_RX 0x0004
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan#define MOD_ISR 0x0008
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan#define OCE_DEFAULT_LOG_SETTINGS (CE_WARN | \
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan ((MOD_CONFIG | MOD_TX | MOD_RX) << 16))
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan#define OCE_MAX_LOG_SETTINGS (CE_IGNORE | ((MOD_CONFIG | MOD_TX | \
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan MOD_RX | MOD_ISR) << 16))
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan#define oce_log(dev_p, level, module, fmt, arg...) { \
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan if (dev_p) { \
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan if ((dev_p->mod_mask & module) && \
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan (dev_p->severity < CE_IGNORE) && \
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan ((uint32_t)level >= dev_p->severity)) \
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan cmn_err(level, "%s[%d]: " fmt, OCE_MOD_NAME, \
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan dev_p->dev_id, ## arg); \
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan } else { \
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan cmn_err(level, "%s[%d]: " fmt, OCE_MOD_NAME, \
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan 0, ## arg); \
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan } \
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan}
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan/* Time related */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan#define OCE_USDELAY(x) drv_usecwait((x))
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan#define OCE_MSDELAY(x) OCE_USDELAY((x) * 1000)
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan/* Misc Macros */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan#define OCE_LOG2(x) (highbit((x)) - 1)
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan#define ADDR_LO(addr) (uint32_t)BMASK_32(addr) /* low 32 bits */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan#define ADDR_HI(addr) (uint32_t)BMASK_32((addr >> 32)) /* high 32 bits */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan#define ADDR_64(_HI, _LO) ((uint64_t)(((uint64_t)(_HI) << 32)|(_LO)))
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan#define voidptr(x) (void *)((x))
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan#define u32ptr(x) (uint32_t *)voidptr((x))
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan#define ptrtou32(x) (uint32_t)((uint32_t *)(void *)(x))
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan#define PAGE_4K (0x1UL << 12)
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan#define OFFSET_IN_4K_PAGE(addr) ((off_t)((uint64_t)addr & (PAGE_4K - 1)))
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan#define OCE_NUM_PAGES(size) howmany(size, PAGE_4K)
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan#ifdef OCE_DEBUG
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan#define OCE_DUMP(buf, len) { \
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan int i = 0; \
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan uint32_t *p = u32ptr(buf); \
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan for (i = 0; i < len/4; i++) \
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan cmn_err(CE_CONT, "[%d] 0x%x", i, p[i]); \
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan}
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan#endif
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan/* Utility Functions */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan#define OCE_DW_SWAP(datap, length) { \
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan int len; \
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan uint32_t *wptr = (uint32_t *)(datap); \
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan len = (length) + (((length) %4) ? (4 - (4 %(length))) : 0); \
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan for (len = len/4; len > 0; len--) { \
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan *wptr = LE_32(*wptr); \
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan wptr++; \
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan } \
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan}
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan#ifdef _BIG_ENDIAN
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan#define DW_SWAP(_PTR, _LEN) OCE_DW_SWAP(_PTR, _LEN)
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan#else
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan#define DW_SWAP(_PTR, _LEN)
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan#endif
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathantypedef struct oce_list_entry {
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan struct oce_list_entry *next;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan struct oce_list_entry *prev;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan}OCE_LIST_NODE_T;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathantypedef struct {
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan kmutex_t list_lock;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan OCE_LIST_NODE_T head;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan int32_t nitems;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan}OCE_LIST_T;
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan/* externs for list manipulation functions */
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathanvoid oce_list_link_init(OCE_LIST_NODE_T *list_node);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanvoid oce_list_create(OCE_LIST_T *list_hdr, void *arg);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanvoid oce_list_destroy(OCE_LIST_T *list_hdr);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanvoid oce_list_insert_tail(OCE_LIST_T *list_hdr, OCE_LIST_NODE_T *list_node);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanvoid *oce_list_remove_head(OCE_LIST_T *list_hdr);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanvoid oce_list_remove_node(OCE_LIST_T *list_hdr, OCE_LIST_NODE_T *list_node);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanboolean_t oce_list_is_empty(OCE_LIST_T *list_hdr);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathanint32_t oce_list_items_avail(OCE_LIST_T *list_hdr);
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathanint oce_atomic_reserve(uint32_t *count_p, uint32_t n);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan#define OCE_LIST_CREATE(_LH, _LCK_PRI) oce_list_create((_LH), (_LCK_PRI))
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan#define OCE_LIST_DESTROY(_LH) oce_list_destroy((_LH))
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan#define OCE_LIST_INSERT_TAIL(_LH, _N) \
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan oce_list_insert_tail((_LH), (void *)(_N))
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan#define OCE_LIST_REM_HEAD(_LH) oce_list_remove_head((_LH))
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan#define OCE_LIST_EMPTY(_LH) oce_list_is_empty((_LH))
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan#define OCE_LIST_REMOVE(_LH, _N) \
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan oce_list_remove_node((_LH), (void *)(_N))
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan#define OCE_LIST_SIZE(_LH) oce_list_items_avail((_LH))
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan#define OCE_LIST_LINK_INIT(_N) oce_list_link_init(_N)
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathan
5b9d3151a4426af9ad6ef2c2a178f13476b884b3Sukumar Swaminathanvoid oce_gen_hkey(char *hkey, int key_size);
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan#ifdef __cplusplus
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan}
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan#endif
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan
4d0e50075058332ce0cd62bc2669a8a4dea45da0Sukumar Swaminathan#endif /* _OCE_UTILS_H_ */