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