1*0f74dae5SSascha Wildner /*-
2*0f74dae5SSascha Wildner * Copyright (c) 2011 HighPoint Technologies, Inc.
3*0f74dae5SSascha Wildner * All rights reserved.
4*0f74dae5SSascha Wildner *
5*0f74dae5SSascha Wildner * Redistribution and use in source and binary forms, with or without
6*0f74dae5SSascha Wildner * modification, are permitted provided that the following conditions
7*0f74dae5SSascha Wildner * are met:
8*0f74dae5SSascha Wildner * 1. Redistributions of source code must retain the above copyright
9*0f74dae5SSascha Wildner * notice, this list of conditions and the following disclaimer.
10*0f74dae5SSascha Wildner * 2. Redistributions in binary form must reproduce the above copyright
11*0f74dae5SSascha Wildner * notice, this list of conditions and the following disclaimer in the
12*0f74dae5SSascha Wildner * documentation and/or other materials provided with the distribution.
13*0f74dae5SSascha Wildner *
14*0f74dae5SSascha Wildner * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15*0f74dae5SSascha Wildner * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16*0f74dae5SSascha Wildner * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17*0f74dae5SSascha Wildner * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18*0f74dae5SSascha Wildner * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19*0f74dae5SSascha Wildner * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20*0f74dae5SSascha Wildner * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21*0f74dae5SSascha Wildner * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22*0f74dae5SSascha Wildner * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23*0f74dae5SSascha Wildner * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24*0f74dae5SSascha Wildner * SUCH DAMAGE.
25*0f74dae5SSascha Wildner *
26*0f74dae5SSascha Wildner * $FreeBSD: src/sys/dev/hpt27xx/list.h,v 1.1 2011/12/28 23:26:58 delphij Exp $
27*0f74dae5SSascha Wildner */
28*0f74dae5SSascha Wildner
29*0f74dae5SSascha Wildner #include <dev/raid/hpt27xx/hpt27xx_config.h>
30*0f74dae5SSascha Wildner
31*0f74dae5SSascha Wildner #ifndef _HPT_LIST_H_
32*0f74dae5SSascha Wildner #define _HPT_LIST_H_
33*0f74dae5SSascha Wildner
34*0f74dae5SSascha Wildner #ifndef _LINUX_LIST_H
35*0f74dae5SSascha Wildner
36*0f74dae5SSascha Wildner #ifndef HPT_INLINE
37*0f74dae5SSascha Wildner #define HPT_INLINE __inline
38*0f74dae5SSascha Wildner #endif
39*0f74dae5SSascha Wildner
40*0f74dae5SSascha Wildner struct list_head {
41*0f74dae5SSascha Wildner struct list_head *next, *prev;
42*0f74dae5SSascha Wildner };
43*0f74dae5SSascha Wildner
44*0f74dae5SSascha Wildner #define INIT_LIST_HEAD(ptr) do { (ptr)->next = (ptr); (ptr)->prev = (ptr); } while (0)
45*0f74dae5SSascha Wildner
__list_add(struct list_head * _new,struct list_head * prev,struct list_head * next)46*0f74dae5SSascha Wildner static HPT_INLINE void __list_add(struct list_head * _new, struct list_head * prev, struct list_head * next)
47*0f74dae5SSascha Wildner {
48*0f74dae5SSascha Wildner next->prev = _new;
49*0f74dae5SSascha Wildner _new->next = next;
50*0f74dae5SSascha Wildner _new->prev = prev;
51*0f74dae5SSascha Wildner prev->next = _new;
52*0f74dae5SSascha Wildner }
53*0f74dae5SSascha Wildner
list_add(struct list_head * _new,struct list_head * head)54*0f74dae5SSascha Wildner static HPT_INLINE void list_add(struct list_head *_new, struct list_head *head)
55*0f74dae5SSascha Wildner {
56*0f74dae5SSascha Wildner __list_add(_new, head, head->next);
57*0f74dae5SSascha Wildner }
58*0f74dae5SSascha Wildner
list_add_tail(struct list_head * _new,struct list_head * head)59*0f74dae5SSascha Wildner static HPT_INLINE void list_add_tail(struct list_head *_new, struct list_head *head)
60*0f74dae5SSascha Wildner {
61*0f74dae5SSascha Wildner __list_add(_new, head->prev, head);
62*0f74dae5SSascha Wildner }
63*0f74dae5SSascha Wildner
__list_del(struct list_head * prev,struct list_head * next)64*0f74dae5SSascha Wildner static HPT_INLINE void __list_del(struct list_head * prev, struct list_head * next)
65*0f74dae5SSascha Wildner {
66*0f74dae5SSascha Wildner next->prev = prev;
67*0f74dae5SSascha Wildner prev->next = next;
68*0f74dae5SSascha Wildner }
69*0f74dae5SSascha Wildner
list_del(struct list_head * entry)70*0f74dae5SSascha Wildner static HPT_INLINE void list_del(struct list_head *entry)
71*0f74dae5SSascha Wildner {
72*0f74dae5SSascha Wildner __list_del(entry->prev, entry->next);
73*0f74dae5SSascha Wildner }
74*0f74dae5SSascha Wildner
list_del_init(struct list_head * entry)75*0f74dae5SSascha Wildner static HPT_INLINE void list_del_init(struct list_head *entry)
76*0f74dae5SSascha Wildner {
77*0f74dae5SSascha Wildner __list_del(entry->prev, entry->next);
78*0f74dae5SSascha Wildner INIT_LIST_HEAD(entry);
79*0f74dae5SSascha Wildner }
80*0f74dae5SSascha Wildner
list_empty(struct list_head * head)81*0f74dae5SSascha Wildner static HPT_INLINE int list_empty(struct list_head *head)
82*0f74dae5SSascha Wildner {
83*0f74dae5SSascha Wildner HPT_ASSERT(!(head->next==head && head->prev!=head));
84*0f74dae5SSascha Wildner return head->next == head;
85*0f74dae5SSascha Wildner }
86*0f74dae5SSascha Wildner
__list_splice(struct list_head * list,struct list_head * head)87*0f74dae5SSascha Wildner static HPT_INLINE void __list_splice(struct list_head *list,
88*0f74dae5SSascha Wildner struct list_head *head)
89*0f74dae5SSascha Wildner {
90*0f74dae5SSascha Wildner struct list_head *first = list->next;
91*0f74dae5SSascha Wildner struct list_head *last = list->prev;
92*0f74dae5SSascha Wildner struct list_head *at = head->next;
93*0f74dae5SSascha Wildner
94*0f74dae5SSascha Wildner first->prev = head;
95*0f74dae5SSascha Wildner head->next = first;
96*0f74dae5SSascha Wildner
97*0f74dae5SSascha Wildner last->next = at;
98*0f74dae5SSascha Wildner at->prev = last;
99*0f74dae5SSascha Wildner }
100*0f74dae5SSascha Wildner
list_splice(struct list_head * list,struct list_head * head)101*0f74dae5SSascha Wildner static HPT_INLINE void list_splice(struct list_head *list, struct list_head *head)
102*0f74dae5SSascha Wildner {
103*0f74dae5SSascha Wildner if (!list_empty(list))
104*0f74dae5SSascha Wildner __list_splice(list, head);
105*0f74dae5SSascha Wildner }
106*0f74dae5SSascha Wildner
list_splice_init(struct list_head * list,struct list_head * head)107*0f74dae5SSascha Wildner static HPT_INLINE void list_splice_init(struct list_head *list, struct list_head *head)
108*0f74dae5SSascha Wildner {
109*0f74dae5SSascha Wildner if (!list_empty(list)) {
110*0f74dae5SSascha Wildner __list_splice(list, head);
111*0f74dae5SSascha Wildner INIT_LIST_HEAD(list);
112*0f74dae5SSascha Wildner }
113*0f74dae5SSascha Wildner }
114*0f74dae5SSascha Wildner
115*0f74dae5SSascha Wildner #define list_entry(ptr, type, member) \
116*0f74dae5SSascha Wildner ((type *)((char *)(ptr)-(HPT_UPTR)(&((type *)0)->member)))
117*0f74dae5SSascha Wildner
118*0f74dae5SSascha Wildner #define list_for_each(pos, head) \
119*0f74dae5SSascha Wildner for (pos = (head)->next; pos != (head); pos = pos->next)
120*0f74dae5SSascha Wildner
121*0f74dae5SSascha Wildner #define list_for_each_safe(pos, n, head) \
122*0f74dae5SSascha Wildner for (pos = (head)->next, n = pos->next; pos != (head); \
123*0f74dae5SSascha Wildner pos = n, n = pos->next)
124*0f74dae5SSascha Wildner
125*0f74dae5SSascha Wildner #define get_first_item(attached, type, member) \
126*0f74dae5SSascha Wildner ((type *)((char *)((attached)->next)-(HPT_UPTR)(&((type *)0)->member)))
127*0f74dae5SSascha Wildner
128*0f74dae5SSascha Wildner #endif
129*0f74dae5SSascha Wildner
130*0f74dae5SSascha Wildner #endif
131