dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele/*
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * mr_sas_list.h: header for mr_sas
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele *
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * Solaris MegaRAID driver for SAS2.0 controllers
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * Copyright (c) 2008-2012, LSI Logic Corporation.
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * All rights reserved.
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele *
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * Redistribution and use in source and binary forms, with or without
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * modification, are permitted provided that the following conditions are met:
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele *
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * 1. Redistributions of source code must retain the above copyright notice,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * this list of conditions and the following disclaimer.
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele *
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * 2. Redistributions in binary form must reproduce the above copyright notice,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * this list of conditions and the following disclaimer in the documentation
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * and/or other materials provided with the distribution.
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele *
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * 3. Neither the name of the author nor the names of its contributors may be
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * used to endorse or promote products derived from this software without
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * specific prior written permission.
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele *
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * DAMAGE.
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele#ifndef _MR_SAS_LIST_H_
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele#define _MR_SAS_LIST_H_
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele#ifdef __cplusplus
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufeleextern "C" {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele#endif
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele/*
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * Simple doubly linked list implementation.
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele *
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * Some of the internal functions ("__xxx") are useful when
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * manipulating whole lists rather than single entries, as
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * sometimes we already know the next/prev entries and we can
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * generate better code by using them directly rather than
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * using the generic single-entry routines.
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufelestruct mlist_head {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele struct mlist_head *next, *prev;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele};
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufeletypedef struct mlist_head mlist_t;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele#define LIST_HEAD_INIT(name) { &(name), &(name) }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele#define LIST_HEAD(name) \
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele struct mlist_head name = LIST_HEAD_INIT(name)
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele#define INIT_LIST_HEAD(ptr) { \
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele (ptr)->next = (ptr); (ptr)->prev = (ptr); \
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele}
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonaldvoid mlist_add(struct mlist_head *, struct mlist_head *);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonaldvoid mlist_add_tail(struct mlist_head *, struct mlist_head *);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonaldvoid mlist_del_init(struct mlist_head *);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonaldint mlist_empty(struct mlist_head *);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonaldvoid mlist_splice(struct mlist_head *, struct mlist_head *);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele/*
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * mlist_entry - get the struct for this entry
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * @ptr: the &struct mlist_head pointer.
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * @type: the type of the struct this is embedded in.
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * @member: the name of the list_struct within the struct.
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele#define mlist_entry(ptr, type, member) \
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ((type *)((size_t)(ptr) - offsetof(type, member)))
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele/*
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * mlist_for_each - iterate over a list
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * @pos: the &struct mlist_head to use as a loop counter.
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * @head: the head for your list.
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele#define mlist_for_each(pos, head) \
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele for (pos = (head)->next, prefetch(pos->next); pos != (head); \
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele pos = pos->next, prefetch(pos->next))
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele/*
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * mlist_for_each_safe - iterate over a list safe against removal of list entry
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * @pos: the &struct mlist_head to use as a loop counter.
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * @n: another &struct mlist_head to use as temporary storage
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * @head: the head for your list.
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele#define mlist_for_each_safe(pos, n, head) \
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele for (pos = (head)->next, n = pos->next; pos != (head); \
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele pos = n, n = pos->next)
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele#ifdef __cplusplus
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele}
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele#endif
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele#endif /* _MR_SAS_LIST_H_ */