1 /*
2 * Copyright (c) 2024 Nordic Semiconductor ASA
3 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6
7 /**
8 * @brief File containing linked list specific definitions
9 * for the Wi-Fi driver.
10 */
11
12
13 #include "list.h"
14
nrf_wifi_utils_list_alloc(void)15 void *nrf_wifi_utils_list_alloc(void)
16 {
17 void *list = NULL;
18
19 list = nrf_wifi_osal_llist_alloc();
20
21 if (!list) {
22 nrf_wifi_osal_log_err("%s: Unable to allocate list",
23 __func__);
24 goto out;
25 }
26
27 nrf_wifi_osal_llist_init(list);
28
29 out:
30 return list;
31
32 }
33
34
nrf_wifi_utils_list_free(void * list)35 void nrf_wifi_utils_list_free(void *list)
36 {
37 nrf_wifi_osal_llist_free(list);
38 }
39
40
nrf_wifi_utils_list_add_tail(void * list,void * data)41 enum nrf_wifi_status nrf_wifi_utils_list_add_tail(void *list,
42 void *data)
43 {
44 void *list_node = NULL;
45
46 list_node = nrf_wifi_osal_llist_node_alloc();
47
48 if (!list_node) {
49 nrf_wifi_osal_log_err("%s: Unable to allocate list node",
50 __func__);
51 return NRF_WIFI_STATUS_FAIL;
52 }
53
54 nrf_wifi_osal_llist_node_data_set(list_node,
55 data);
56
57 nrf_wifi_osal_llist_add_node_tail(list,
58 list_node);
59
60 return NRF_WIFI_STATUS_SUCCESS;
61 }
62
nrf_wifi_utils_list_add_head(void * list,void * data)63 enum nrf_wifi_status nrf_wifi_utils_list_add_head(void *list,
64 void *data)
65 {
66 void *list_node = NULL;
67
68 list_node = nrf_wifi_osal_llist_node_alloc();
69
70 if (!list_node) {
71 nrf_wifi_osal_log_err("%s: Unable to allocate list node",
72 __func__);
73 return NRF_WIFI_STATUS_FAIL;
74 }
75
76 nrf_wifi_osal_llist_node_data_set(list_node,
77 data);
78
79 nrf_wifi_osal_llist_add_node_head(list,
80 list_node);
81
82 return NRF_WIFI_STATUS_SUCCESS;
83 }
84
nrf_wifi_utils_list_del_node(void * list,void * data)85 void nrf_wifi_utils_list_del_node(void *list,
86 void *data)
87 {
88 void *stored_data;
89 void *list_node = NULL;
90 void *list_node_next = NULL;
91
92 list_node = nrf_wifi_osal_llist_get_node_head(list);
93
94 while (list_node) {
95 stored_data = nrf_wifi_osal_llist_node_data_get(list_node);
96
97 list_node_next = nrf_wifi_osal_llist_get_node_nxt(list,
98 list_node);
99
100 if (stored_data == data) {
101 nrf_wifi_osal_llist_del_node(list,
102 list_node);
103
104 nrf_wifi_osal_llist_node_free(list_node);
105 }
106
107 list_node = list_node_next;
108 }
109 }
110
nrf_wifi_utils_list_del_head(void * list)111 void *nrf_wifi_utils_list_del_head(void *list)
112 {
113 void *list_node = NULL;
114 void *data = NULL;
115
116 list_node = nrf_wifi_osal_llist_get_node_head(list);
117
118 if (!list_node) {
119 goto out;
120 }
121
122 data = nrf_wifi_osal_llist_node_data_get(list_node);
123
124 nrf_wifi_osal_llist_del_node(list,
125 list_node);
126 nrf_wifi_osal_llist_node_free(list_node);
127
128 out:
129 return data;
130 }
131
132
nrf_wifi_utils_list_peek(void * list)133 void *nrf_wifi_utils_list_peek(void *list)
134 {
135 void *list_node = NULL;
136 void *data = NULL;
137
138 list_node = nrf_wifi_osal_llist_get_node_head(list);
139
140 if (!list_node) {
141 goto out;
142 }
143
144 data = nrf_wifi_osal_llist_node_data_get(list_node);
145
146 out:
147 return data;
148 }
149
150
nrf_wifi_utils_list_len(void * list)151 unsigned int nrf_wifi_utils_list_len(void *list)
152 {
153 return nrf_wifi_osal_llist_len(list);
154 }
155
156
157 enum nrf_wifi_status
nrf_wifi_utils_list_traverse(void * list,void * callbk_data,enum nrf_wifi_status (* callbk_func)(void * callbk_data,void * data))158 nrf_wifi_utils_list_traverse(void *list,
159 void *callbk_data,
160 enum nrf_wifi_status (*callbk_func)(void *callbk_data,
161 void *data))
162 {
163 void *list_node = NULL;
164 void *data = NULL;
165 enum nrf_wifi_status status = NRF_WIFI_STATUS_FAIL;
166
167 list_node = nrf_wifi_osal_llist_get_node_head(list);
168
169 while (list_node) {
170 data = nrf_wifi_osal_llist_node_data_get(list_node);
171
172 status = callbk_func(callbk_data,
173 data);
174
175 if (status != NRF_WIFI_STATUS_SUCCESS) {
176 goto out;
177 }
178
179 list_node = nrf_wifi_osal_llist_get_node_nxt(list,
180 list_node);
181 }
182 out:
183 return status;
184 }
185