#ifndef _QEDE_LIST_H
#define _QEDE_LIST_H
typedef struct qede_list_s {
struct qede_list_s *next;
struct qede_list_s *prev;
}qede_list_t;
typedef struct qede_mem_list_entry {
void *buf;
size_t size;
qede_list_t mem_entry;
} qede_mem_list_entry_t;
typedef struct qede_mem_list {
qede_list_t mem_list_head;
kmutex_t mem_list_lock;
} qede_mem_list_t;
typedef struct phys_mem_entry {
qede_list_t list_entry;
ddi_dma_handle_t dma_handle;
ddi_acc_handle_t dma_acc_handle;
size_t size;
void *virt_addr;
void *paddr;
} qede_phys_mem_entry_t;
typedef struct qede_phys_mem_list {
qede_list_t head;
kmutex_t lock;
} qede_phys_mem_list_t;
typedef struct qede_mcast_list_entry {
qede_list_t mclist_entry;
u8 *mac;
} qede_mcast_list_entry_t;
typedef struct qede_mcast_list {
qede_list_t head;
} qede_mcast_list_t;
typedef qede_list_t osal_list_t;
typedef qede_list_t osal_list_entry_t;
static inline void
QEDE_INIT_LIST_HEAD(qede_list_t *list)
{
list->next = list;
list->prev = list;
}
#define OSAL_LIST_INIT(_list_) QEDE_INIT_LIST_HEAD(_list_)
static inline void
qede_list_add(qede_list_t *new,
qede_list_t *prev,
qede_list_t *next)
{
next->prev = new;
new->next = next;
new->prev = prev;
prev->next = new;
}
static inline bool
qede_list_empty(qede_list_t *entry)
{
return (entry->next == entry);
}
static inline void
qede_list_del(qede_list_t *prev, qede_list_t *next)
{
next->prev = prev;
prev->next = next;
}
static inline void
QEDE_LIST_ADD(qede_list_t *new, qede_list_t *head)
{
qede_list_add(new, head, head->next);
}
static inline void
QEDE_LIST_ADD_TAIL(qede_list_t *new, qede_list_t *head)
{
qede_list_add(new, head->prev, head);
}
static inline void
QEDE_LIST_REMOVE(qede_list_t *entry, qede_list_t *head)
{
qede_list_del(entry->prev, entry->next);
}
static inline void
list_splice(const qede_list_t *list,
qede_list_t *prev,
qede_list_t *next)
{
qede_list_t *first = list->next;
qede_list_t *last = list->prev;
first->prev = prev;
prev->next = first;
last->next = next;
next->prev = last;
}
static inline void
qede_list_splice(qede_list_t *list,
qede_list_t *head)
{
if (!qede_list_empty(list)) {
list_splice(list, head, head->next);
}
}
static inline void
qede_list_splice_tail(qede_list_t *list,
qede_list_t *head)
{
if (!qede_list_empty(list)) {
list_splice(list, head->prev, head);
}
}
#define QEDE_LIST_IS_EMPTY qede_list_empty
#define QEDE_LIST_SPLICE qede_list_splice
#define QEDE_LIST_SPLICE_TAIL qede_list_splice_tail
#define QEDE_LIST_ENTRY qede_list_entry
#define QEDE_LIST_FIRST_ENTRY OSAL_LIST_FIRST_ENTRY
#define QEDE_LIST_EMPTY OSAL_LIST_IS_EMPTY
#define QEDE_LIST_FOR_EACH_ENTRY(_entry_, _list_, _type_, _member_) \
OSAL_LIST_FOR_EACH_ENTRY(_entry_, _list_, _member_, _type_)
#define QEDE_LIST_FOR_EACH_ENTRY_SAFE OSAL_LIST_FOR_EACH_ENTRY_SAFE
#endif