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