1285242Sachim/******************************************************************************* 2285242Sachim*Copyright (c) 2014 PMC-Sierra, Inc. All rights reserved. 3285242Sachim* 4285242Sachim*Redistribution and use in source and binary forms, with or without modification, are permitted provided 5285242Sachim*that the following conditions are met: 6285242Sachim*1. Redistributions of source code must retain the above copyright notice, this list of conditions and the 7285242Sachim*following disclaimer. 8285242Sachim*2. Redistributions in binary form must reproduce the above copyright notice, 9285242Sachim*this list of conditions and the following disclaimer in the documentation and/or other materials provided 10285242Sachim*with the distribution. 11285242Sachim* 12285242Sachim*THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED 13285242Sachim*WARRANTIES,INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 14285242Sachim*FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 15285242Sachim*FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 16285242Sachim*NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 17285242Sachim*BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 18285242Sachim*LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 19285242Sachim*SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE 20285242Sachim* 21285242Sachim* $FreeBSD: releng/11.0/sys/dev/pms/RefTisa/tisa/sassata/common/tdlist.h 285242 2015-07-07 13:17:02Z achim $ 22285242Sachim* 23285242Sachim********************************************************************************/ 24285242Sachim/*******************************************************************************/ 25285242Sachim/** \file 26285242Sachim * 27285242Sachim * The file defines list data structures for SAS/SATA TD layer 28285242Sachim * 29285242Sachim */ 30285242Sachim 31285242Sachim#ifndef __TDLIST_H__ 32285242Sachim#define __TDLIST_H__ 33285242Sachim 34285242Sachim 35285242Sachimtypedef struct tdList_s tdList_t; 36285242Sachim 37285242Sachimstruct tdList_s { 38285242Sachim tdList_t *flink; 39285242Sachim tdList_t *blink; 40285242Sachim}; 41285242Sachim 42285242Sachim#define TDLIST_NEXT_ENTRY(ptr, type, member) \ 43285242Sachim container_of((ptr)->flink, type, member) 44285242Sachim 45285242Sachim#define TDLIST_INIT_HDR(hdr) \ 46285242Sachim do { \ 47285242Sachim ((tdList_t *)(hdr))->flink = (tdList_t *)(hdr); \ 48285242Sachim ((tdList_t *)(hdr))->blink = (tdList_t *)(hdr); \ 49285242Sachim } while (0) 50285242Sachim 51285242Sachim#define TDLIST_INIT_ELEMENT(hdr) \ 52285242Sachim do { \ 53285242Sachim ((tdList_t *)(hdr))->flink = (tdList_t *)agNULL; \ 54285242Sachim ((tdList_t *)(hdr))->blink = (tdList_t *)agNULL; \ 55285242Sachim } while (0) 56285242Sachim 57285242Sachim#define TDLIST_ENQUEUE_AT_HEAD(toAddHdr,listHdr) \ 58285242Sachim do { \ 59285242Sachim ((tdList_t *)(toAddHdr))->flink = ((tdList_t *)(listHdr))->flink; \ 60285242Sachim ((tdList_t *)(toAddHdr))->blink = (tdList_t *)(listHdr) ; \ 61285242Sachim ((tdList_t *)(listHdr))->flink->blink = (tdList_t *)(toAddHdr); \ 62285242Sachim ((tdList_t *)(listHdr))->flink = (tdList_t *)(toAddHdr); \ 63285242Sachim } while (0) 64285242Sachim 65285242Sachim#define TDLIST_ENQUEUE_AT_TAIL(toAddHdr,listHdr) \ 66285242Sachim do { \ 67285242Sachim ((tdList_t *)(toAddHdr))->flink = (tdList_t *)(listHdr); \ 68285242Sachim ((tdList_t *)(toAddHdr))->blink = ((tdList_t *)(listHdr))->blink; \ 69285242Sachim ((tdList_t *)(listHdr))->blink->flink = (tdList_t *)(toAddHdr); \ 70285242Sachim ((tdList_t *)(listHdr))->blink = (tdList_t *)(toAddHdr); \ 71285242Sachim } while (0) 72285242Sachim 73285242Sachim#define TDLIST_EMPTY(listHdr) \ 74285242Sachim (((tdList_t *)(listHdr))->flink == ((tdList_t *)(listHdr))) 75285242Sachim 76285242Sachim#define TDLIST_NOT_EMPTY(listHdr) \ 77285242Sachim (!TDLIST_EMPTY(listHdr)) 78285242Sachim 79285242Sachim#define TDLIST_DEQUEUE_THIS(hdr) \ 80285242Sachim do { \ 81285242Sachim ((tdList_t *)(hdr))->blink->flink = ((tdList_t *)(hdr))->flink; \ 82285242Sachim ((tdList_t *)(hdr))->flink->blink = ((tdList_t *)(hdr))->blink; \ 83285242Sachim ((tdList_t *)(hdr))->flink = ((tdList_t *)(hdr))->blink = agNULL; \ 84285242Sachim } while (0) 85285242Sachim 86285242Sachim#define TDLIST_DEQUEUE_FROM_HEAD_FAST(atHeadHdr,listHdr) \ 87285242Sachim do { \ 88285242Sachim *((tdList_t **)(atHeadHdr)) = ((tdList_t *)(listHdr))->flink; \ 89285242Sachim (*((tdList_t **)(atHeadHdr)))->flink->blink = (tdList_t *)(listHdr); \ 90285242Sachim ((tdList_t *)(listHdr))->flink = (*(tdList_t **)(atHeadHdr))->flink; \ 91285242Sachim } while (0) 92285242Sachim 93285242Sachim#define TDLIST_DEQUEUE_FROM_HEAD(atHeadHdr,listHdr) \ 94285242Sachimdo { \ 95285242Sachim if (TDLIST_NOT_EMPTY((listHdr))) \ 96285242Sachim { \ 97285242Sachim TDLIST_DEQUEUE_FROM_HEAD_FAST(atHeadHdr,listHdr); \ 98285242Sachim } \ 99285242Sachim else \ 100285242Sachim { \ 101285242Sachim (*((tdList_t **)(atHeadHdr))) = (tdList_t *)agNULL; \ 102285242Sachim } \ 103285242Sachim} while (0) 104285242Sachim 105285242Sachim#define TDLIST_DEQUEUE_FROM_TAIL_FAST(atTailHdr,listHdr) \ 106285242Sachim do { \ 107285242Sachim (*((tdList_t **)(atTailHdr))) = ((tdList_t *)(listHdr))->blink; \ 108285242Sachim (*((tdList_t **)(atTailHdr)))->blink->flink = (tdList_t *)(listHdr); \ 109285242Sachim ((tdList_t *)(listHdr))->blink = (*((tdList_t **)(atTailHdr)))->blink; \ 110285242Sachim } while (0) 111285242Sachim 112285242Sachim#define TDLIST_DEQUEUE_FROM_TAIL(atTailHdr,listHdr) \ 113285242Sachim do { \ 114285242Sachim if (TDLIST_NOT_EMPTY((listHdr))) \ 115285242Sachim { \ 116285242Sachim TDLIST_DEQUEUE_FROM_TAIL_FAST(atTailHdr,listHdr); \ 117285242Sachim } \ 118285242Sachim else \ 119285242Sachim { \ 120285242Sachim (*((tdList_t **)(atTailHdr))) = (tdList_t *)agNULL; \ 121285242Sachim } \ 122285242Sachim } while (0) 123285242Sachim 124285242Sachim#define TDLIST_ENQUEUE_LIST_AT_TAIL_FAST(toAddListHdr, listHdr) \ 125285242Sachim do { \ 126285242Sachim ((tdList_t *)toAddListHdr)->blink->flink = ((tdList_t *)listHdr); \ 127285242Sachim ((tdList_t *)toAddListHdr)->flink->blink = ((tdList_t *)listHdr)->blink; \ 128285242Sachim ((tdList_t *)listHdr)->blink->flink = ((tdList_t *)toAddListHdr)->flink; \ 129285242Sachim ((tdList_t *)listHdr)->blink = ((tdList_t *)toAddListHdr)->blink; \ 130285242Sachim TDLIST_INIT_HDR(toAddListHdr); \ 131285242Sachim } while (0) 132285242Sachim 133285242Sachim#define TDLIST_ENQUEUE_LIST_AT_TAIL(toAddListHdr, listHdr) \ 134285242Sachim do { \ 135285242Sachim if (TDLIST_NOT_EMPTY(toAddListHdr)) \ 136285242Sachim { \ 137285242Sachim TDLIST_ENQUEUE_LIST_AT_TAIL_FAST(toAddListHdr, listHdr); \ 138285242Sachim } \ 139285242Sachim } while (0) 140285242Sachim 141285242Sachim#define TDLIST_ENQUEUE_LIST_AT_HEAD_FAST(toAddListHdr, listHdr) \ 142285242Sachim do { \ 143285242Sachim ((tdList_t *)toAddListHdr)->blink->flink = ((tdList_t *)listHdr)->flink; \ 144285242Sachim ((tdList_t *)toAddListHdr)->flink->blink = ((tdList_t *)listHdr); \ 145285242Sachim ((tdList_t *)listHdr)->flink->blink = ((tdList_t *)toAddListHdr)->blink; \ 146285242Sachim ((tdList_t *)listHdr)->flink = ((tdList_t *)toAddListHdr)->flink; \ 147285242Sachim TDLIST_INIT_HDR(toAddListHdr); \ 148285242Sachim } while (0) 149285242Sachim 150285242Sachim#define TDLIST_ENQUEUE_LIST_AT_HEAD(toAddListHdr, listHdr) \ 151285242Sachim do { \ 152285242Sachim if (TDLIST_NOT_EMPTY(toAddListHdr)) \ 153285242Sachim { \ 154285242Sachim TDLIST_ENQUEUE_LIST_AT_HEAD_FAST(toAddListHdr, listHdr); \ 155285242Sachim } \ 156285242Sachim } while (0) 157285242Sachim 158285242Sachim#define TD_FIELD_OFFSET(baseType,fieldName) \ 159285242Sachim ((bit32)((bitptr)(&(((baseType *)0)->fieldName)))) 160285242Sachim 161285242Sachim#define TDLIST_OBJECT_BASE(baseType,fieldName,fieldPtr) \ 162285242Sachim (void *)fieldPtr == (void *)0 ? (baseType *)0 : \ 163285242Sachim ((baseType *)((bit8 *)(fieldPtr) - ((bitptr)(&(((baseType *)0)->fieldName))))) 164285242Sachim 165285242Sachim 166285242Sachim 167285242Sachim#endif /* __TDLIST_H__ */ 168285242Sachim 169