1 /*******************************************************************************
2 *Copyright (c) 2014 PMC-Sierra, Inc. All rights reserved.
4 *Redistribution and use in source and binary forms, with or without modification, are permitted provided
5 *that the following conditions are met:
6 *1. Redistributions of source code must retain the above copyright notice, this list of conditions and the
8 *2. Redistributions in binary form must reproduce the above copyright notice,
9 *this list of conditions and the following disclaimer in the documentation and/or other materials provided
10 *with the distribution.
12 *THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED
13 *WARRANTIES,INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
14 *FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
15 *FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
16 *NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
17 *BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
18 *LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
19 *SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE
23 ********************************************************************************/
24 /*******************************************************************************/
27 * The file defines list data structures for SAS/SATA TD layer
35 typedef struct tdList_s tdList_t;
42 #define TDLIST_NEXT_ENTRY(ptr, type, member) \
43 container_of((ptr)->flink, type, member)
45 #define TDLIST_INIT_HDR(hdr) \
47 ((tdList_t *)(hdr))->flink = (tdList_t *)(hdr); \
48 ((tdList_t *)(hdr))->blink = (tdList_t *)(hdr); \
51 #define TDLIST_INIT_ELEMENT(hdr) \
53 ((tdList_t *)(hdr))->flink = (tdList_t *)agNULL; \
54 ((tdList_t *)(hdr))->blink = (tdList_t *)agNULL; \
57 #define TDLIST_ENQUEUE_AT_HEAD(toAddHdr,listHdr) \
59 ((tdList_t *)(toAddHdr))->flink = ((tdList_t *)(listHdr))->flink; \
60 ((tdList_t *)(toAddHdr))->blink = (tdList_t *)(listHdr) ; \
61 ((tdList_t *)(listHdr))->flink->blink = (tdList_t *)(toAddHdr); \
62 ((tdList_t *)(listHdr))->flink = (tdList_t *)(toAddHdr); \
65 #define TDLIST_ENQUEUE_AT_TAIL(toAddHdr,listHdr) \
67 ((tdList_t *)(toAddHdr))->flink = (tdList_t *)(listHdr); \
68 ((tdList_t *)(toAddHdr))->blink = ((tdList_t *)(listHdr))->blink; \
69 ((tdList_t *)(listHdr))->blink->flink = (tdList_t *)(toAddHdr); \
70 ((tdList_t *)(listHdr))->blink = (tdList_t *)(toAddHdr); \
73 #define TDLIST_EMPTY(listHdr) \
74 (((tdList_t *)(listHdr))->flink == ((tdList_t *)(listHdr)))
76 #define TDLIST_NOT_EMPTY(listHdr) \
77 (!TDLIST_EMPTY(listHdr))
79 #define TDLIST_DEQUEUE_THIS(hdr) \
81 ((tdList_t *)(hdr))->blink->flink = ((tdList_t *)(hdr))->flink; \
82 ((tdList_t *)(hdr))->flink->blink = ((tdList_t *)(hdr))->blink; \
83 ((tdList_t *)(hdr))->flink = ((tdList_t *)(hdr))->blink = agNULL; \
86 #define TDLIST_DEQUEUE_FROM_HEAD_FAST(atHeadHdr,listHdr) \
88 *((tdList_t **)(atHeadHdr)) = ((tdList_t *)(listHdr))->flink; \
89 (*((tdList_t **)(atHeadHdr)))->flink->blink = (tdList_t *)(listHdr); \
90 ((tdList_t *)(listHdr))->flink = (*(tdList_t **)(atHeadHdr))->flink; \
93 #define TDLIST_DEQUEUE_FROM_HEAD(atHeadHdr,listHdr) \
95 if (TDLIST_NOT_EMPTY((listHdr))) \
97 TDLIST_DEQUEUE_FROM_HEAD_FAST(atHeadHdr,listHdr); \
101 (*((tdList_t **)(atHeadHdr))) = (tdList_t *)agNULL; \
105 #define TDLIST_DEQUEUE_FROM_TAIL_FAST(atTailHdr,listHdr) \
107 (*((tdList_t **)(atTailHdr))) = ((tdList_t *)(listHdr))->blink; \
108 (*((tdList_t **)(atTailHdr)))->blink->flink = (tdList_t *)(listHdr); \
109 ((tdList_t *)(listHdr))->blink = (*((tdList_t **)(atTailHdr)))->blink; \
112 #define TDLIST_DEQUEUE_FROM_TAIL(atTailHdr,listHdr) \
114 if (TDLIST_NOT_EMPTY((listHdr))) \
116 TDLIST_DEQUEUE_FROM_TAIL_FAST(atTailHdr,listHdr); \
120 (*((tdList_t **)(atTailHdr))) = (tdList_t *)agNULL; \
124 #define TDLIST_ENQUEUE_LIST_AT_TAIL_FAST(toAddListHdr, listHdr) \
126 ((tdList_t *)toAddListHdr)->blink->flink = ((tdList_t *)listHdr); \
127 ((tdList_t *)toAddListHdr)->flink->blink = ((tdList_t *)listHdr)->blink; \
128 ((tdList_t *)listHdr)->blink->flink = ((tdList_t *)toAddListHdr)->flink; \
129 ((tdList_t *)listHdr)->blink = ((tdList_t *)toAddListHdr)->blink; \
130 TDLIST_INIT_HDR(toAddListHdr); \
133 #define TDLIST_ENQUEUE_LIST_AT_TAIL(toAddListHdr, listHdr) \
135 if (TDLIST_NOT_EMPTY(toAddListHdr)) \
137 TDLIST_ENQUEUE_LIST_AT_TAIL_FAST(toAddListHdr, listHdr); \
141 #define TDLIST_ENQUEUE_LIST_AT_HEAD_FAST(toAddListHdr, listHdr) \
143 ((tdList_t *)toAddListHdr)->blink->flink = ((tdList_t *)listHdr)->flink; \
144 ((tdList_t *)toAddListHdr)->flink->blink = ((tdList_t *)listHdr); \
145 ((tdList_t *)listHdr)->flink->blink = ((tdList_t *)toAddListHdr)->blink; \
146 ((tdList_t *)listHdr)->flink = ((tdList_t *)toAddListHdr)->flink; \
147 TDLIST_INIT_HDR(toAddListHdr); \
150 #define TDLIST_ENQUEUE_LIST_AT_HEAD(toAddListHdr, listHdr) \
152 if (TDLIST_NOT_EMPTY(toAddListHdr)) \
154 TDLIST_ENQUEUE_LIST_AT_HEAD_FAST(toAddListHdr, listHdr); \
158 #define TD_FIELD_OFFSET(baseType,fieldName) \
159 ((bit32)((bitptr)(&(((baseType *)0)->fieldName))))
161 #define TDLIST_OBJECT_BASE(baseType,fieldName,fieldPtr) \
162 (void *)fieldPtr == (void *)0 ? (baseType *)0 : \
163 ((baseType *)((bit8 *)(fieldPtr) - ((bitptr)(&(((baseType *)0)->fieldName)))))
167 #endif /* __TDLIST_H__ */