1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License, v.1, (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 * or http://opensource.org/licenses/CDDL-1.0. 10 * See the License for the specific language governing permissions 11 * and limitations under the License. 12 * 13 * When distributing Covered Code, include this CDDL HEADER in each 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 * If applicable, add the following below this CDDL HEADER, with the 16 * fields enclosed by brackets "[]" replaced with your own identifying 17 * information: Portions Copyright [yyyy] [name of copyright owner] 18 * 19 * CDDL HEADER END 20 */ 21 22 /* 23 * Copyright 2014-2017 Cavium, Inc. 24 * The contents of this file are subject to the terms of the Common Development 25 * and Distribution License, v.1, (the "License"). 26 27 * You may not use this file except in compliance with the License. 28 29 * You can obtain a copy of the License at available 30 * at http://opensource.org/licenses/CDDL-1.0 31 32 * See the License for the specific language governing permissions and 33 * limitations under the License. 34 */ 35 36 #ifndef _QEDE_LIST_H 37 #define _QEDE_LIST_H 38 39 typedef struct qede_list_s { 40 struct qede_list_s *next; 41 struct qede_list_s *prev; 42 }qede_list_t; 43 44 typedef struct qede_mem_list_entry { 45 void *buf; 46 size_t size; 47 qede_list_t mem_entry; 48 } qede_mem_list_entry_t; 49 50 typedef struct qede_mem_list { 51 qede_list_t mem_list_head; 52 kmutex_t mem_list_lock; 53 } qede_mem_list_t; 54 55 typedef struct phys_mem_entry { 56 qede_list_t list_entry; 57 ddi_dma_handle_t dma_handle; 58 ddi_acc_handle_t dma_acc_handle; 59 size_t size; 60 void *virt_addr; 61 void *paddr; 62 } qede_phys_mem_entry_t; 63 64 typedef struct qede_phys_mem_list { 65 qede_list_t head; 66 kmutex_t lock; 67 } qede_phys_mem_list_t; 68 69 typedef struct qede_mcast_list_entry { 70 qede_list_t mclist_entry; 71 u8 *mac; 72 } qede_mcast_list_entry_t; 73 74 typedef struct qede_mcast_list { 75 qede_list_t head; 76 } qede_mcast_list_t; 77 78 typedef qede_list_t osal_list_t; 79 typedef qede_list_t osal_list_entry_t; 80 81 /* 82 * Linked list helpers 83 */ 84 static inline void 85 QEDE_INIT_LIST_HEAD(qede_list_t *list) 86 { 87 list->next = list; 88 list->prev = list; 89 } 90 91 #define OSAL_LIST_INIT(_list_) QEDE_INIT_LIST_HEAD(_list_) 92 93 static inline void 94 qede_list_add(qede_list_t *new, 95 qede_list_t *prev, 96 qede_list_t *next) 97 { 98 next->prev = new; 99 new->next = next; 100 new->prev = prev; 101 prev->next = new; 102 } 103 104 static inline bool 105 qede_list_empty(qede_list_t *entry) 106 { 107 return (entry->next == entry); 108 } 109 110 static inline void 111 qede_list_del(qede_list_t *prev, qede_list_t *next) 112 { 113 next->prev = prev; 114 prev->next = next; 115 } 116 117 static inline void 118 QEDE_LIST_ADD(qede_list_t *new, qede_list_t *head) 119 { 120 qede_list_add(new, head, head->next); 121 } 122 123 static inline void 124 QEDE_LIST_ADD_TAIL(qede_list_t *new, qede_list_t *head) 125 { 126 qede_list_add(new, head->prev, head); 127 } 128 129 static inline void 130 QEDE_LIST_REMOVE(qede_list_t *entry, qede_list_t *head) 131 { 132 qede_list_del(entry->prev, entry->next); 133 } 134 135 static inline void 136 list_splice(const qede_list_t *list, 137 qede_list_t *prev, 138 qede_list_t *next) 139 { 140 qede_list_t *first = list->next; 141 qede_list_t *last = list->prev; 142 143 first->prev = prev; 144 prev->next = first; 145 146 last->next = next; 147 next->prev = last; 148 } 149 150 static inline void 151 qede_list_splice(qede_list_t *list, 152 qede_list_t *head) 153 { 154 if (!qede_list_empty(list)) { 155 list_splice(list, head, head->next); 156 } 157 } 158 159 static inline void 160 qede_list_splice_tail(qede_list_t *list, 161 qede_list_t *head) 162 { 163 if (!qede_list_empty(list)) { 164 list_splice(list, head->prev, head); 165 } 166 } 167 168 #define QEDE_LIST_IS_EMPTY qede_list_empty 169 #define QEDE_LIST_SPLICE qede_list_splice 170 #define QEDE_LIST_SPLICE_TAIL qede_list_splice_tail 171 #define QEDE_LIST_ENTRY qede_list_entry 172 #define QEDE_LIST_FIRST_ENTRY OSAL_LIST_FIRST_ENTRY 173 #define QEDE_LIST_EMPTY OSAL_LIST_IS_EMPTY 174 #define QEDE_LIST_FOR_EACH_ENTRY(_entry_, _list_, _type_, _member_) \ 175 OSAL_LIST_FOR_EACH_ENTRY(_entry_, _list_, _member_, _type_) 176 #define QEDE_LIST_FOR_EACH_ENTRY_SAFE OSAL_LIST_FOR_EACH_ENTRY_SAFE 177 178 #endif /* !_QEDE_LIST_H */ 179 180