1 /*
2 * Copyright (c) 2020, Nordic Semiconductor ASA
3 * All rights reserved.
4 *
5 * SPDX-License-Identifier: BSD-3-Clause
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions are met:
9 *
10 * 1. Redistributions of source code must retain the above copyright notice, this
11 * list of conditions and the following disclaimer.
12 *
13 * 2. Redistributions in binary form must reproduce the above copyright
14 * notice, this list of conditions and the following disclaimer in the
15 * documentation and/or other materials provided with the distribution.
16 *
17 * 3. Neither the name of Nordic Semiconductor ASA nor the names of its
18 * contributors may be used to endorse or promote products derived from this
19 * software without specific prior written permission.
20 *
21 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
22 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23 * IMPLIED WARRANTIES OF MERCHANTABILITY, AND FITNESS FOR A PARTICULAR PURPOSE
24 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
25 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
26 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
27 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
28 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
29 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
30 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
31 * POSSIBILITY OF SUCH DAMAGE.
32 *
33 */
34
35 /**
36 * @file nrf_802154_spinel_app.c
37 *
38 * @brief Implementation of nRF 802.15.4 Radio Driver API for application
39 * core talking to network core through spinel
40 *
41 * This file is responsible for providing implementation of API calls
42 * defined by nrf_802154.h. Application is responsible for providing
43 * appropriate callouts according to nRF 802.15.4 API.
44 */
45
46 #include <stdint.h>
47
48 #include "nrf_802154_const.h"
49
50 #include "../spinel_base/spinel.h"
51 #include "nrf_802154_serialization.h"
52 #include "nrf_802154_spinel.h"
53 #include "nrf_802154_spinel_datatypes.h"
54 #include "nrf_802154_spinel_enc_app.h"
55 #include "nrf_802154_spinel_dec_app.h"
56 #include "nrf_802154_spinel_log.h"
57 #include "nrf_802154_spinel_response_notifier.h"
58 #include "nrf_802154_serialization_error.h"
59 #include "nrf_802154_serialization_error_helper.h"
60 #include "nrf_802154_buffer_mgr_dst.h"
61 #include "nrf_802154_buffer_mgr_src.h"
62
63 #include "nrf_802154.h"
64 #include "nrf_802154_config.h"
65 #include "nrf_802154_types.h"
66
67 /**
68 * @brief Wait with timeout for SPINEL_STATUS_OK to be received.
69 *
70 * @param[in] timeout Timeout in us.
71 *
72 * @returns zero on success or negative error value on failure.
73 *
74 */
status_ok_await(uint32_t timeout)75 static nrf_802154_ser_err_t status_ok_await(uint32_t timeout)
76 {
77 spinel_status_t status = SPINEL_STATUS_FAILURE;
78 nrf_802154_ser_err_t res;
79 nrf_802154_spinel_notify_buff_t * p_notify_data = NULL;
80
81 SERIALIZATION_ERROR_INIT(error);
82
83 p_notify_data = nrf_802154_spinel_response_notifier_property_await(timeout);
84
85 SERIALIZATION_ERROR_IF(p_notify_data == NULL,
86 NRF_802154_SERIALIZATION_ERROR_RESPONSE_TIMEOUT,
87 error,
88 bail);
89
90 res = nrf_802154_spinel_decode_prop_last_status(p_notify_data->data,
91 p_notify_data->data_len,
92 &status);
93 SERIALIZATION_ERROR_CHECK(res, error, bail);
94
95 NRF_802154_SPINEL_LOG_BANNER_RESPONSE();
96 NRF_802154_SPINEL_LOG_VAR_NAMED("%s", spinel_status_to_cstr(status), "status");
97
98 SERIALIZATION_ERROR_IF(status != SPINEL_STATUS_OK,
99 NRF_802154_SERIALIZATION_ERROR_RESPONSE_INVALID,
100 error,
101 bail);
102
103 bail:
104 if (p_notify_data != NULL)
105 {
106 nrf_802154_spinel_response_notifier_free(p_notify_data);
107 }
108
109 return error;
110 }
111
112 /**
113 * @brief Wait with timeout for some single bool property to be received.
114 *
115 * @param[in] timeout Timeout in us.
116 * @param[out] p_net_response Pointer to the bool variable which needs to be populated.
117 *
118 * @returns zero on success or negative error value on failure.
119 *
120 */
net_generic_bool_response_await(uint32_t timeout,bool * p_net_response)121 static nrf_802154_ser_err_t net_generic_bool_response_await(uint32_t timeout,
122 bool * p_net_response)
123 {
124 nrf_802154_ser_err_t res;
125 nrf_802154_spinel_notify_buff_t * p_notify_data = NULL;
126
127 SERIALIZATION_ERROR_INIT(error);
128
129 p_notify_data = nrf_802154_spinel_response_notifier_property_await(timeout);
130
131 SERIALIZATION_ERROR_IF(p_notify_data == NULL,
132 NRF_802154_SERIALIZATION_ERROR_RESPONSE_TIMEOUT,
133 error,
134 bail);
135
136 res = nrf_802154_spinel_decode_prop_generic_bool(p_notify_data->data,
137 p_notify_data->data_len,
138 p_net_response);
139
140 SERIALIZATION_ERROR_CHECK(res, error, bail);
141
142 NRF_802154_SPINEL_LOG_BANNER_RESPONSE();
143 NRF_802154_SPINEL_LOG_VAR_NAMED("%s", (*p_net_response) ? "true" : "false", "net response");
144
145 bail:
146 if (p_notify_data != NULL)
147 {
148 nrf_802154_spinel_response_notifier_free(p_notify_data);
149 }
150
151 return error;
152 }
153
154 /**
155 * @brief Wait with timeout for some single uint8_t property to be received.
156 *
157 * @param[in] timeout Timeout in us.
158 * @param[out] p_net_response Pointer to the uint8_t variable which needs to be populated.
159 *
160 * @returns zero on success or negative error value on failure.
161 *
162 */
net_generic_uint8_response_await(uint32_t timeout,uint8_t * p_net_response)163 static nrf_802154_ser_err_t net_generic_uint8_response_await(uint32_t timeout,
164 uint8_t * p_net_response)
165 {
166 nrf_802154_ser_err_t res;
167 nrf_802154_spinel_notify_buff_t * p_notify_data = NULL;
168
169 SERIALIZATION_ERROR_INIT(error);
170
171 p_notify_data = nrf_802154_spinel_response_notifier_property_await(timeout);
172
173 SERIALIZATION_ERROR_IF(p_notify_data == NULL,
174 NRF_802154_SERIALIZATION_ERROR_RESPONSE_TIMEOUT,
175 error,
176 bail);
177
178 res = nrf_802154_spinel_decode_prop_generic_uint8(p_notify_data->data,
179 p_notify_data->data_len,
180 p_net_response);
181
182 SERIALIZATION_ERROR_CHECK(res, error, bail);
183
184 NRF_802154_SPINEL_LOG_BANNER_RESPONSE();
185 NRF_802154_SPINEL_LOG_VAR_NAMED("%u", *p_net_response, "net response");
186
187 bail:
188 if (p_notify_data != NULL)
189 {
190 nrf_802154_spinel_response_notifier_free(p_notify_data);
191 }
192
193 return error;
194 }
195
196 #if NRF_802154_IFS_ENABLED
197 /**
198 * @brief Wait with timeout for some single uint16_t property to be received.
199 *
200 * @param[in] timeout Timeout in us.
201 * @param[out] p_net_response Pointer to the uint16_t variable which needs to be populated.
202 *
203 * @returns zero on success or negative error value on failure.
204 *
205 */
net_generic_uint16_response_await(uint32_t timeout,uint16_t * p_net_response)206 static nrf_802154_ser_err_t net_generic_uint16_response_await(uint32_t timeout,
207 uint16_t * p_net_response)
208 {
209 nrf_802154_ser_err_t res;
210 nrf_802154_spinel_notify_buff_t * p_notify_data = NULL;
211
212 SERIALIZATION_ERROR_INIT(error);
213
214 p_notify_data = nrf_802154_spinel_response_notifier_property_await(timeout);
215
216 SERIALIZATION_ERROR_IF(p_notify_data == NULL,
217 NRF_802154_SERIALIZATION_ERROR_RESPONSE_TIMEOUT,
218 error,
219 bail);
220
221 res = nrf_802154_spinel_decode_prop_generic_uint16(p_notify_data->data,
222 p_notify_data->data_len,
223 p_net_response);
224
225 SERIALIZATION_ERROR_CHECK(res, error, bail);
226
227 NRF_802154_SPINEL_LOG_BANNER_RESPONSE();
228 NRF_802154_SPINEL_LOG_VAR_NAMED("%u", *p_net_response, "net response");
229
230 bail:
231 if (p_notify_data != NULL)
232 {
233 nrf_802154_spinel_response_notifier_free(p_notify_data);
234 }
235
236 return error;
237 }
238
239 #endif
240
241 /**
242 * @brief Wait with timeout for TX Power property to be received.
243 *
244 * @param[in] timeout Timeout in us.
245 * @param[out] p_power Pointer to the power variable which needs to be populated.
246 *
247 * @returns zero on success or negative error value on failure.
248 *
249 */
tx_power_await(uint32_t timeout,int8_t * p_power)250 static nrf_802154_ser_err_t tx_power_await(uint32_t timeout, int8_t * p_power)
251 {
252 nrf_802154_ser_err_t res;
253 nrf_802154_spinel_notify_buff_t * p_notify_data = NULL;
254
255 SERIALIZATION_ERROR_INIT(error);
256
257 p_notify_data = nrf_802154_spinel_response_notifier_property_await(
258 timeout);
259
260 SERIALIZATION_ERROR_IF(p_notify_data == NULL,
261 NRF_802154_SERIALIZATION_ERROR_RESPONSE_TIMEOUT,
262 error,
263 bail);
264
265 res = nrf_802154_spinel_decode_prop_nrf_802154_tx_power_get_ret(p_notify_data->data,
266 p_notify_data->data_len,
267 p_power);
268
269 SERIALIZATION_ERROR_CHECK(res, error, bail);
270
271 NRF_802154_SPINEL_LOG_BANNER_RESPONSE();
272 NRF_802154_SPINEL_LOG_VAR_NAMED("%d", *p_power, "Tx power");
273
274 bail:
275 if (p_notify_data != NULL)
276 {
277 nrf_802154_spinel_response_notifier_free(p_notify_data);
278 }
279
280 return error;
281 }
282
283 /**
284 * @brief Wait with timeout for capabilities property to be received.
285 *
286 * @param[in] timeout Timeout in us.
287 * @param[out] p_capabilities Pointer to the capabilities variable which needs to be populated.
288 *
289 * @returns zero on success or negative error value on failure.
290 *
291 */
capabilities_await(uint32_t timeout,nrf_802154_capabilities_t * p_capabilities)292 static nrf_802154_ser_err_t capabilities_await(uint32_t timeout,
293 nrf_802154_capabilities_t * p_capabilities)
294 {
295 nrf_802154_ser_err_t res;
296 nrf_802154_spinel_notify_buff_t * p_notify_data = NULL;
297
298 SERIALIZATION_ERROR_INIT(error);
299
300 p_notify_data = nrf_802154_spinel_response_notifier_property_await(
301 timeout);
302
303 SERIALIZATION_ERROR_IF(p_notify_data == NULL,
304 NRF_802154_SERIALIZATION_ERROR_RESPONSE_TIMEOUT,
305 error,
306 bail);
307
308 res = nrf_802154_spinel_decode_prop_nrf_802154_capabilities_get_ret(p_notify_data->data,
309 p_notify_data->data_len,
310 p_capabilities);
311
312 SERIALIZATION_ERROR_CHECK(res, error, bail);
313
314 NRF_802154_SPINEL_LOG_BANNER_RESPONSE();
315 NRF_802154_SPINEL_LOG_VAR_NAMED("%u", *p_capabilities, "Capabilities");
316
317 bail:
318 if (p_notify_data != NULL)
319 {
320 nrf_802154_spinel_response_notifier_free(p_notify_data);
321 }
322
323 return error;
324 }
325
326 /**
327 * @brief Wait with timeout for time property to be received.
328 *
329 * @param[in] timeout Timeout in us.
330 * @param[out] p_time Pointer to the time variable which needs to be populated.
331 *
332 * @returns zero on success or negative error value on failure.
333 *
334 */
time_await(uint32_t timeout,uint64_t * p_time)335 static nrf_802154_ser_err_t time_await(uint32_t timeout,
336 uint64_t * p_time)
337 {
338 nrf_802154_ser_err_t res;
339 nrf_802154_spinel_notify_buff_t * p_notify_data = NULL;
340
341 SERIALIZATION_ERROR_INIT(error);
342
343 p_notify_data = nrf_802154_spinel_response_notifier_property_await(
344 timeout);
345
346 SERIALIZATION_ERROR_IF(p_notify_data == NULL,
347 NRF_802154_SERIALIZATION_ERROR_RESPONSE_TIMEOUT,
348 error,
349 bail);
350
351 res = nrf_802154_spinel_decode_prop_nrf_802154_time_get_ret(p_notify_data->data,
352 p_notify_data->data_len,
353 p_time);
354
355 SERIALIZATION_ERROR_CHECK(res, error, bail);
356
357 NRF_802154_SPINEL_LOG_BANNER_RESPONSE();
358 NRF_802154_SPINEL_LOG_VAR_NAMED("%llu", *p_time, "Time");
359
360 bail:
361 if (p_notify_data != NULL)
362 {
363 nrf_802154_spinel_response_notifier_free(p_notify_data);
364 }
365
366 return error;
367 }
368
369 /**
370 * @brief Wait with timeout for CCA configuration property to be received.
371 *
372 * @param[in] timeout Timeout in us.
373 * @param[out] p_cfg Pointer to the CCA configuration variable which needs to be populated.
374 *
375 * @returns zero on success or negative error value on failure.
376 *
377 */
cca_cfg_await(uint32_t timeout,nrf_802154_cca_cfg_t * p_cfg)378 static nrf_802154_ser_err_t cca_cfg_await(uint32_t timeout,
379 nrf_802154_cca_cfg_t * p_cfg)
380 {
381 nrf_802154_ser_err_t res;
382 nrf_802154_spinel_notify_buff_t * p_notify_data = NULL;
383
384 SERIALIZATION_ERROR_INIT(error);
385
386 p_notify_data = nrf_802154_spinel_response_notifier_property_await(
387 timeout);
388
389 SERIALIZATION_ERROR_IF(p_notify_data == NULL,
390 NRF_802154_SERIALIZATION_ERROR_RESPONSE_TIMEOUT,
391 error,
392 bail);
393
394 res = nrf_802154_spinel_decode_prop_nrf_802154_cca_cfg_get_ret(p_notify_data->data,
395 p_notify_data->data_len,
396 p_cfg);
397
398 SERIALIZATION_ERROR_CHECK(res, error, bail);
399
400 NRF_802154_SPINEL_LOG_BANNER_RESPONSE();
401 NRF_802154_SPINEL_LOG_VAR_NAMED("%u", p_cfg->mode, "Mode");
402 NRF_802154_SPINEL_LOG_VAR_NAMED("%u", p_cfg->ed_threshold, "ED threshold");
403 NRF_802154_SPINEL_LOG_VAR_NAMED("%u", p_cfg->corr_threshold, "Corr threshold");
404 NRF_802154_SPINEL_LOG_VAR_NAMED("%u", p_cfg->corr_limit, "Corr limit");
405
406 bail:
407 if (p_notify_data != NULL)
408 {
409 nrf_802154_spinel_response_notifier_free(p_notify_data);
410 }
411
412 return error;
413 }
414
nrf_802154_init(void)415 void nrf_802154_init(void)
416 {
417 nrf_802154_serialization_init();
418 }
419
nrf_802154_sleep(void)420 bool nrf_802154_sleep(void)
421 {
422 nrf_802154_ser_err_t res;
423 bool sleep_remote_resp = false;
424
425 SERIALIZATION_ERROR_INIT(error);
426
427 NRF_802154_SPINEL_LOG_BANNER_CALLING();
428
429 nrf_802154_spinel_response_notifier_lock_before_request(
430 SPINEL_PROP_VENDOR_NORDIC_NRF_802154_SLEEP);
431
432 res = nrf_802154_spinel_send_cmd_prop_value_set(SPINEL_PROP_VENDOR_NORDIC_NRF_802154_SLEEP,
433 SPINEL_DATATYPE_NRF_802154_SLEEP,
434 NULL);
435
436 SERIALIZATION_ERROR_CHECK(res, error, bail);
437
438 res = net_generic_bool_response_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT,
439 &sleep_remote_resp);
440
441 SERIALIZATION_ERROR_CHECK(res, error, bail);
442
443 bail:
444 SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
445
446 return sleep_remote_resp;
447 }
448
nrf_802154_sleep_if_idle(void)449 nrf_802154_sleep_error_t nrf_802154_sleep_if_idle(void)
450 {
451 nrf_802154_ser_err_t res;
452 nrf_802154_sleep_error_t sleep_remote_resp = NRF_802154_SLEEP_ERROR_NONE;
453
454 SERIALIZATION_ERROR_INIT(error);
455
456 NRF_802154_SPINEL_LOG_BANNER_CALLING();
457
458 nrf_802154_spinel_response_notifier_lock_before_request(
459 SPINEL_PROP_VENDOR_NORDIC_NRF_802154_SLEEP_IF_IDLE);
460
461 res = nrf_802154_spinel_send_cmd_prop_value_set(
462 SPINEL_PROP_VENDOR_NORDIC_NRF_802154_SLEEP_IF_IDLE,
463 SPINEL_DATATYPE_NRF_802154_SLEEP_IF_IDLE,
464 NULL);
465
466 SERIALIZATION_ERROR_CHECK(res, error, bail);
467
468 res = net_generic_uint8_response_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT,
469 &sleep_remote_resp);
470
471 SERIALIZATION_ERROR_CHECK(res, error, bail);
472
473 bail:
474 SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
475
476 return sleep_remote_resp;
477 }
478
nrf_802154_receive(void)479 bool nrf_802154_receive(void)
480 {
481 nrf_802154_ser_err_t res;
482 bool receive_remote_resp = false;
483
484 SERIALIZATION_ERROR_INIT(error);
485
486 NRF_802154_SPINEL_LOG_BANNER_CALLING();
487
488 nrf_802154_spinel_response_notifier_lock_before_request(
489 SPINEL_PROP_VENDOR_NORDIC_NRF_802154_RECEIVE);
490
491 res = nrf_802154_spinel_send_cmd_prop_value_set(SPINEL_PROP_VENDOR_NORDIC_NRF_802154_RECEIVE,
492 SPINEL_DATATYPE_NRF_802154_RECEIVE,
493 NULL);
494
495 SERIALIZATION_ERROR_CHECK(res, error, bail);
496
497 res = net_generic_bool_response_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT,
498 &receive_remote_resp);
499
500 SERIALIZATION_ERROR_CHECK(res, error, bail);
501
502 bail:
503 SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
504
505 return receive_remote_resp;
506 }
507
nrf_802154_receive_at(uint64_t rx_time,uint32_t timeout,uint8_t channel,uint32_t id)508 bool nrf_802154_receive_at(uint64_t rx_time,
509 uint32_t timeout,
510 uint8_t channel,
511 uint32_t id)
512 {
513 nrf_802154_ser_err_t res;
514 bool rx_at_result = false;
515
516 SERIALIZATION_ERROR_INIT(error);
517
518 NRF_802154_SPINEL_LOG_BANNER_CALLING();
519
520 nrf_802154_spinel_response_notifier_lock_before_request(
521 SPINEL_PROP_VENDOR_NORDIC_NRF_802154_RECEIVE_AT);
522
523 res = nrf_802154_spinel_send_cmd_prop_value_set(
524 SPINEL_PROP_VENDOR_NORDIC_NRF_802154_RECEIVE_AT,
525 SPINEL_DATATYPE_NRF_802154_RECEIVE_AT,
526 rx_time,
527 timeout,
528 channel,
529 id);
530
531 SERIALIZATION_ERROR_CHECK(res, error, bail);
532
533 res = net_generic_bool_response_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT,
534 &rx_at_result);
535
536 SERIALIZATION_ERROR_CHECK(res, error, bail);
537
538 bail:
539 SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
540
541 return rx_at_result;
542
543 }
544
nrf_802154_receive_at_cancel(uint32_t id)545 bool nrf_802154_receive_at_cancel(uint32_t id)
546 {
547 nrf_802154_ser_err_t res;
548 bool cancel_result = false;
549
550 SERIALIZATION_ERROR_INIT(error);
551
552 NRF_802154_SPINEL_LOG_BANNER_CALLING();
553
554 nrf_802154_spinel_response_notifier_lock_before_request(
555 SPINEL_PROP_VENDOR_NORDIC_NRF_802154_RECEIVE_AT_CANCEL);
556
557 res = nrf_802154_spinel_send_cmd_prop_value_set(
558 SPINEL_PROP_VENDOR_NORDIC_NRF_802154_RECEIVE_AT_CANCEL,
559 SPINEL_DATATYPE_NRF_802154_RECEIVE_AT_CANCEL,
560 id);
561
562 SERIALIZATION_ERROR_CHECK(res, error, bail);
563
564 res = net_generic_bool_response_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT,
565 &cancel_result);
566
567 SERIALIZATION_ERROR_CHECK(res, error, bail);
568
569 bail:
570 SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
571
572 return cancel_result;
573 }
574
nrf_802154_pan_id_set(const uint8_t * p_pan_id)575 void nrf_802154_pan_id_set(const uint8_t * p_pan_id)
576 {
577 nrf_802154_ser_err_t res;
578
579 SERIALIZATION_ERROR_INIT(error);
580
581 NRF_802154_SPINEL_LOG_BANNER_CALLING();
582 NRF_802154_SPINEL_LOG_BUFF(p_pan_id, PAN_ID_SIZE);
583
584 nrf_802154_spinel_response_notifier_lock_before_request(SPINEL_PROP_LAST_STATUS);
585
586 res = nrf_802154_spinel_send_cmd_prop_value_set(SPINEL_PROP_VENDOR_NORDIC_NRF_802154_PAN_ID_SET,
587 SPINEL_DATATYPE_NRF_802154_PAN_ID_SET,
588 p_pan_id,
589 PAN_ID_SIZE);
590
591 SERIALIZATION_ERROR_CHECK(res, error, bail);
592
593 res = status_ok_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT);
594 SERIALIZATION_ERROR_CHECK(res, error, bail);
595
596 bail:
597 SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
598
599 return;
600 }
601
nrf_802154_short_address_set(const uint8_t * p_short_address)602 void nrf_802154_short_address_set(const uint8_t * p_short_address)
603 {
604 nrf_802154_ser_err_t res;
605
606 SERIALIZATION_ERROR_INIT(error);
607
608 NRF_802154_SPINEL_LOG_BANNER_CALLING();
609 NRF_802154_SPINEL_LOG_BUFF(p_short_address, SHORT_ADDRESS_SIZE);
610
611 nrf_802154_spinel_response_notifier_lock_before_request(SPINEL_PROP_LAST_STATUS);
612
613 res = nrf_802154_spinel_send_cmd_prop_value_set(
614 SPINEL_PROP_VENDOR_NORDIC_NRF_802154_SHORT_ADDRESS_SET,
615 SPINEL_DATATYPE_NRF_802154_SHORT_ADDRESS_SET,
616 p_short_address,
617 SHORT_ADDRESS_SIZE);
618
619 SERIALIZATION_ERROR_CHECK(res, error, bail);
620
621 res = status_ok_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT);
622 SERIALIZATION_ERROR_CHECK(res, error, bail);
623
624 bail:
625 SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
626
627 return;
628 }
629
nrf_802154_extended_address_set(const uint8_t * p_extended_address)630 void nrf_802154_extended_address_set(const uint8_t * p_extended_address)
631 {
632 nrf_802154_ser_err_t res;
633
634 SERIALIZATION_ERROR_INIT(error);
635
636 NRF_802154_SPINEL_LOG_BANNER_CALLING();
637 NRF_802154_SPINEL_LOG_BUFF(p_extended_address, EXTENDED_ADDRESS_SIZE);
638
639 nrf_802154_spinel_response_notifier_lock_before_request(SPINEL_PROP_LAST_STATUS);
640
641 res = nrf_802154_spinel_send_cmd_prop_value_set(
642 SPINEL_PROP_VENDOR_NORDIC_NRF_802154_EXTENDED_ADDRESS_SET,
643 SPINEL_DATATYPE_NRF_802154_EXTENDED_ADDRESS_SET,
644 p_extended_address,
645 EXTENDED_ADDRESS_SIZE);
646
647 SERIALIZATION_ERROR_CHECK(res, error, bail);
648
649 res = status_ok_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT);
650 SERIALIZATION_ERROR_CHECK(res, error, bail);
651
652 bail:
653 SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
654
655 return;
656 }
657
658 #if NRF_802154_PAN_COORD_GET_ENABLED
659
nrf_802154_pan_coord_get(void)660 bool nrf_802154_pan_coord_get(void)
661 {
662 nrf_802154_ser_err_t res;
663 bool result = false;
664
665 SERIALIZATION_ERROR_INIT(error);
666
667 NRF_802154_SPINEL_LOG_BANNER_CALLING();
668
669 nrf_802154_spinel_response_notifier_lock_before_request(
670 SPINEL_PROP_VENDOR_NORDIC_NRF_802154_PAN_COORD_GET);
671
672 res = nrf_802154_spinel_send_cmd_prop_value_set(
673 SPINEL_PROP_VENDOR_NORDIC_NRF_802154_PAN_COORD_GET,
674 SPINEL_DATATYPE_NRF_802154_PAN_COORD_GET,
675 &result);
676
677 SERIALIZATION_ERROR_CHECK(res, error, bail);
678
679 res = net_generic_bool_response_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT,
680 &result);
681
682 SERIALIZATION_ERROR_CHECK(res, error, bail);
683
684 bail:
685 SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
686
687 return result;
688 }
689
690 #endif // NRF_802154_PAN_COORD_GET_ENABLED
691
nrf_802154_pan_coord_set(bool enabled)692 void nrf_802154_pan_coord_set(bool enabled)
693 {
694 nrf_802154_ser_err_t res;
695
696 SERIALIZATION_ERROR_INIT(error);
697
698 NRF_802154_SPINEL_LOG_BANNER_CALLING();
699 NRF_802154_SPINEL_LOG_VAR_NAMED("%s", enabled ? "true" : "false", "enabled");
700
701 nrf_802154_spinel_response_notifier_lock_before_request(SPINEL_PROP_LAST_STATUS);
702
703 res = nrf_802154_spinel_send_cmd_prop_value_set(
704 SPINEL_PROP_VENDOR_NORDIC_NRF_802154_PAN_COORD_SET,
705 SPINEL_DATATYPE_NRF_802154_PAN_COORD_SET,
706 enabled);
707
708 SERIALIZATION_ERROR_CHECK(res, error, bail);
709
710 res = status_ok_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT);
711 SERIALIZATION_ERROR_CHECK(res, error, bail);
712
713 bail:
714 SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
715
716 return;
717 }
718
nrf_802154_promiscuous_set(bool enabled)719 void nrf_802154_promiscuous_set(bool enabled)
720 {
721 nrf_802154_ser_err_t res;
722
723 SERIALIZATION_ERROR_INIT(error);
724
725 NRF_802154_SPINEL_LOG_BANNER_CALLING();
726 NRF_802154_SPINEL_LOG_VAR_NAMED("%s", enabled ? "true" : "false", "enabled");
727
728 nrf_802154_spinel_response_notifier_lock_before_request(SPINEL_PROP_LAST_STATUS);
729
730 res = nrf_802154_spinel_send_cmd_prop_value_set(
731 SPINEL_PROP_VENDOR_NORDIC_NRF_802154_PROMISCUOUS_SET,
732 SPINEL_DATATYPE_NRF_802154_PROMISCUOUS_SET,
733 enabled);
734
735 SERIALIZATION_ERROR_CHECK(res, error, bail);
736
737 res = status_ok_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT);
738 SERIALIZATION_ERROR_CHECK(res, error, bail);
739
740 bail:
741 SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
742 }
743
nrf_802154_rx_on_when_idle_set(bool enabled)744 void nrf_802154_rx_on_when_idle_set(bool enabled)
745 {
746 nrf_802154_ser_err_t res;
747
748 SERIALIZATION_ERROR_INIT(error);
749
750 NRF_802154_SPINEL_LOG_BANNER_CALLING();
751 NRF_802154_SPINEL_LOG_VAR_NAMED("%s", enabled ? "true" : "false", "enabled");
752
753 nrf_802154_spinel_response_notifier_lock_before_request(SPINEL_PROP_LAST_STATUS);
754
755 res = nrf_802154_spinel_send_cmd_prop_value_set(
756 SPINEL_PROP_VENDOR_NORDIC_NRF_802154_RX_ON_WHEN_IDLE_SET,
757 SPINEL_DATATYPE_NRF_802154_RX_ON_WHEN_IDLE_SET,
758 enabled);
759
760 SERIALIZATION_ERROR_CHECK(res, error, bail);
761
762 res = status_ok_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT);
763 SERIALIZATION_ERROR_CHECK(res, error, bail);
764
765 bail:
766 SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
767 }
768
nrf_802154_src_addr_matching_method_set(nrf_802154_src_addr_match_t match_method)769 void nrf_802154_src_addr_matching_method_set(nrf_802154_src_addr_match_t match_method)
770 {
771 nrf_802154_ser_err_t res;
772
773 SERIALIZATION_ERROR_INIT(error);
774
775 NRF_802154_SPINEL_LOG_BANNER_CALLING();
776 NRF_802154_SPINEL_LOG_VAR("%u", match_method);
777
778 nrf_802154_spinel_response_notifier_lock_before_request(SPINEL_PROP_LAST_STATUS);
779
780 res = nrf_802154_spinel_send_cmd_prop_value_set(
781 SPINEL_PROP_VENDOR_NORDIC_NRF_802154_SRC_ADDR_MATCHING_METHOD_SET,
782 SPINEL_DATATYPE_NRF_802154_SRC_ADDR_MATCHING_METHOD_SET,
783 match_method);
784
785 SERIALIZATION_ERROR_CHECK(res, error, bail);
786
787 res = status_ok_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT);
788 SERIALIZATION_ERROR_CHECK(res, error, bail);
789
790 bail:
791 SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
792 }
793
nrf_802154_ack_data_set(const uint8_t * p_addr,bool extended,const void * p_data,uint16_t length,nrf_802154_ack_data_t data_type)794 bool nrf_802154_ack_data_set(const uint8_t * p_addr,
795 bool extended,
796 const void * p_data,
797 uint16_t length,
798 nrf_802154_ack_data_t data_type)
799 {
800 nrf_802154_ser_err_t res;
801 bool ack_data_set_res = false;
802
803 SERIALIZATION_ERROR_INIT(error);
804
805 NRF_802154_SPINEL_LOG_BANNER_CALLING();
806 NRF_802154_SPINEL_LOG_BUFF(p_addr, extended ? EXTENDED_ADDRESS_SIZE : SHORT_ADDRESS_SIZE);
807 NRF_802154_SPINEL_LOG_VAR_NAMED("%s", (extended ? "true" : "false"), "extended");
808
809 nrf_802154_spinel_response_notifier_lock_before_request(
810 SPINEL_PROP_VENDOR_NORDIC_NRF_802154_ACK_DATA_SET);
811
812 res = nrf_802154_spinel_send_cmd_prop_value_set(
813 SPINEL_PROP_VENDOR_NORDIC_NRF_802154_ACK_DATA_SET,
814 SPINEL_DATATYPE_NRF_802154_ACK_DATA_SET,
815 p_addr,
816 extended ? EXTENDED_ADDRESS_SIZE : SHORT_ADDRESS_SIZE,
817 p_data,
818 length,
819 data_type);
820
821 SERIALIZATION_ERROR_CHECK(res, error, bail);
822
823 res = net_generic_bool_response_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT,
824 &ack_data_set_res);
825
826 SERIALIZATION_ERROR_CHECK(res, error, bail);
827
828 bail:
829 SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
830
831 return ack_data_set_res;
832 }
833
nrf_802154_ack_data_clear(const uint8_t * p_addr,bool extended,nrf_802154_ack_data_t data_type)834 bool nrf_802154_ack_data_clear(const uint8_t * p_addr,
835 bool extended,
836 nrf_802154_ack_data_t data_type)
837 {
838 nrf_802154_ser_err_t res;
839 bool ack_data_clear_res = false;
840
841 SERIALIZATION_ERROR_INIT(error);
842
843 NRF_802154_SPINEL_LOG_BANNER_CALLING();
844 NRF_802154_SPINEL_LOG_BUFF(p_addr, extended ? EXTENDED_ADDRESS_SIZE : SHORT_ADDRESS_SIZE);
845 NRF_802154_SPINEL_LOG_VAR_NAMED("%s", (extended ? "true" : "false"), "extended");
846
847 nrf_802154_spinel_response_notifier_lock_before_request(
848 SPINEL_PROP_VENDOR_NORDIC_NRF_802154_ACK_DATA_CLEAR);
849
850 res = nrf_802154_spinel_send_cmd_prop_value_set(
851 SPINEL_PROP_VENDOR_NORDIC_NRF_802154_ACK_DATA_CLEAR,
852 SPINEL_DATATYPE_NRF_802154_ACK_DATA_CLEAR,
853 p_addr,
854 extended ? EXTENDED_ADDRESS_SIZE : SHORT_ADDRESS_SIZE,
855 data_type);
856
857 SERIALIZATION_ERROR_CHECK(res, error, bail);
858
859 res = net_generic_bool_response_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT,
860 &ack_data_clear_res);
861
862 SERIALIZATION_ERROR_CHECK(res, error, bail);
863
864 bail:
865 SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
866
867 return ack_data_clear_res;
868 }
869
nrf_802154_ack_data_remove_all(bool extended,nrf_802154_ack_data_t data_type)870 void nrf_802154_ack_data_remove_all(bool extended, nrf_802154_ack_data_t data_type)
871 {
872 nrf_802154_ser_err_t res;
873
874 SERIALIZATION_ERROR_INIT(error);
875
876 NRF_802154_SPINEL_LOG_BANNER_CALLING();
877 NRF_802154_SPINEL_LOG_VAR_NAMED("%s", (extended ? "true" : "false"), "extended");
878
879 nrf_802154_spinel_response_notifier_lock_before_request(
880 SPINEL_PROP_VENDOR_NORDIC_NRF_802154_ACK_DATA_REMOVE_ALL);
881
882 res = nrf_802154_spinel_send_cmd_prop_value_set(
883 SPINEL_PROP_VENDOR_NORDIC_NRF_802154_ACK_DATA_REMOVE_ALL,
884 SPINEL_DATATYPE_NRF_802154_ACK_DATA_REMOVE_ALL,
885 extended,
886 data_type);
887
888 SERIALIZATION_ERROR_CHECK(res, error, bail);
889
890 res = status_ok_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT);
891 SERIALIZATION_ERROR_CHECK(res, error, bail);
892
893 bail:
894 SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
895 }
896
nrf_802154_auto_pending_bit_set(bool enabled)897 void nrf_802154_auto_pending_bit_set(bool enabled)
898 {
899 nrf_802154_ser_err_t res;
900
901 SERIALIZATION_ERROR_INIT(error);
902
903 NRF_802154_SPINEL_LOG_BANNER_CALLING();
904 NRF_802154_SPINEL_LOG_VAR_NAMED("%s", (enabled ? "true" : "false"), "enabled");
905
906 nrf_802154_spinel_response_notifier_lock_before_request(SPINEL_PROP_LAST_STATUS);
907
908 res = nrf_802154_spinel_send_cmd_prop_value_set(
909 SPINEL_PROP_VENDOR_NORDIC_NRF_802154_AUTO_PENDING_BIT_SET,
910 SPINEL_DATATYPE_NRF_802154_AUTO_PENDING_BIT_SET,
911 enabled);
912
913 SERIALIZATION_ERROR_CHECK(res, error, bail);
914
915 res = status_ok_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT);
916 SERIALIZATION_ERROR_CHECK(res, error, bail);
917
918 bail:
919 SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
920 }
921
nrf_802154_pending_bit_for_addr_set(const uint8_t * p_addr,bool extended)922 bool nrf_802154_pending_bit_for_addr_set(const uint8_t * p_addr, bool extended)
923 {
924 nrf_802154_ser_err_t res;
925 bool addr_set_res = false;
926
927 SERIALIZATION_ERROR_INIT(error);
928
929 NRF_802154_SPINEL_LOG_BANNER_CALLING();
930 NRF_802154_SPINEL_LOG_BUFF(p_addr, extended ? EXTENDED_ADDRESS_SIZE : SHORT_ADDRESS_SIZE);
931 NRF_802154_SPINEL_LOG_VAR_NAMED("%s", (extended ? "true" : "false"), "extended");
932
933 nrf_802154_spinel_response_notifier_lock_before_request(
934 SPINEL_PROP_VENDOR_NORDIC_NRF_802154_PENDING_BIT_FOR_ADDR_SET);
935
936 res = nrf_802154_spinel_send_cmd_prop_value_set(
937 SPINEL_PROP_VENDOR_NORDIC_NRF_802154_PENDING_BIT_FOR_ADDR_SET,
938 SPINEL_DATATYPE_NRF_802154_PENDING_BIT_FOR_ADDR_SET,
939 p_addr,
940 extended ? EXTENDED_ADDRESS_SIZE : SHORT_ADDRESS_SIZE);
941
942 SERIALIZATION_ERROR_CHECK(res, error, bail);
943
944 res = net_generic_bool_response_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT,
945 &addr_set_res);
946
947 SERIALIZATION_ERROR_CHECK(res, error, bail);
948
949 bail:
950 SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
951
952 return addr_set_res;
953 }
954
nrf_802154_pending_bit_for_addr_clear(const uint8_t * p_addr,bool extended)955 bool nrf_802154_pending_bit_for_addr_clear(const uint8_t * p_addr, bool extended)
956 {
957 nrf_802154_ser_err_t res;
958 bool addr_clr_res = false;
959
960 SERIALIZATION_ERROR_INIT(error);
961
962 NRF_802154_SPINEL_LOG_BANNER_CALLING();
963 NRF_802154_SPINEL_LOG_BUFF(p_addr, extended ? EXTENDED_ADDRESS_SIZE : SHORT_ADDRESS_SIZE);
964 NRF_802154_SPINEL_LOG_VAR_NAMED("%s", (extended ? "true" : "false"), "extended");
965
966 nrf_802154_spinel_response_notifier_lock_before_request(
967 SPINEL_PROP_VENDOR_NORDIC_NRF_802154_PENDING_BIT_FOR_ADDR_CLEAR);
968
969 res = nrf_802154_spinel_send_cmd_prop_value_set(
970 SPINEL_PROP_VENDOR_NORDIC_NRF_802154_PENDING_BIT_FOR_ADDR_CLEAR,
971 SPINEL_DATATYPE_NRF_802154_PENDING_BIT_FOR_ADDR_CLEAR,
972 p_addr,
973 extended ? EXTENDED_ADDRESS_SIZE : SHORT_ADDRESS_SIZE);
974
975 SERIALIZATION_ERROR_CHECK(res, error, bail);
976
977 res = net_generic_bool_response_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT,
978 &addr_clr_res);
979
980 SERIALIZATION_ERROR_CHECK(res, error, bail);
981
982 bail:
983 SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
984
985 return addr_clr_res;
986 }
987
nrf_802154_pending_bit_for_addr_reset(bool extended)988 void nrf_802154_pending_bit_for_addr_reset(bool extended)
989 {
990 nrf_802154_ser_err_t res;
991
992 SERIALIZATION_ERROR_INIT(error);
993
994 NRF_802154_SPINEL_LOG_BANNER_CALLING();
995 NRF_802154_SPINEL_LOG_VAR_NAMED("%s", (extended ? "true" : "false"), "extended");
996
997 nrf_802154_spinel_response_notifier_lock_before_request(SPINEL_PROP_LAST_STATUS);
998
999 res = nrf_802154_spinel_send_cmd_prop_value_set(
1000 SPINEL_PROP_VENDOR_NORDIC_NRF_802154_PENDING_BIT_FOR_ADDR_RESET,
1001 SPINEL_DATATYPE_NRF_802154_PENDING_BIT_FOR_ADDR_RESET,
1002 extended);
1003
1004 SERIALIZATION_ERROR_CHECK(res, error, bail);
1005
1006 res = status_ok_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT);
1007 SERIALIZATION_ERROR_CHECK(res, error, bail);
1008
1009 bail:
1010 SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
1011 return;
1012 }
1013
nrf_802154_channel_set(uint8_t channel)1014 void nrf_802154_channel_set(uint8_t channel)
1015 {
1016 nrf_802154_ser_err_t res;
1017
1018 SERIALIZATION_ERROR_INIT(error);
1019
1020 NRF_802154_SPINEL_LOG_BANNER_CALLING();
1021 NRF_802154_SPINEL_LOG_VAR("%u", channel);
1022
1023 nrf_802154_spinel_response_notifier_lock_before_request(SPINEL_PROP_LAST_STATUS);
1024
1025 res = nrf_802154_spinel_send_cmd_prop_value_set(
1026 SPINEL_PROP_VENDOR_NORDIC_NRF_802154_CHANNEL_SET,
1027 SPINEL_DATATYPE_NRF_802154_CHANNEL_SET,
1028 channel);
1029
1030 SERIALIZATION_ERROR_CHECK(res, error, bail);
1031
1032 res = status_ok_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT);
1033 SERIALIZATION_ERROR_CHECK(res, error, bail);
1034
1035 bail:
1036 SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
1037
1038 return;
1039 }
1040
nrf_802154_channel_get(void)1041 uint8_t nrf_802154_channel_get(void)
1042 {
1043 nrf_802154_ser_err_t res;
1044 uint8_t channel = 0;
1045
1046 SERIALIZATION_ERROR_INIT(error);
1047
1048 NRF_802154_SPINEL_LOG_BANNER_CALLING();
1049
1050 nrf_802154_spinel_response_notifier_lock_before_request(
1051 SPINEL_PROP_VENDOR_NORDIC_NRF_802154_CHANNEL_GET);
1052
1053 res = nrf_802154_spinel_send_cmd_prop_value_set(
1054 SPINEL_PROP_VENDOR_NORDIC_NRF_802154_CHANNEL_GET,
1055 SPINEL_DATATYPE_NRF_802154_CHANNEL_GET,
1056 &channel);
1057
1058 SERIALIZATION_ERROR_CHECK(res, error, bail);
1059
1060 res = net_generic_uint8_response_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT,
1061 &channel);
1062 SERIALIZATION_ERROR_CHECK(res, error, bail);
1063
1064 bail:
1065 SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
1066
1067 return channel;
1068 }
1069
nrf_802154_cca(void)1070 bool nrf_802154_cca(void)
1071 {
1072 nrf_802154_ser_err_t res;
1073 bool cca_result = false;
1074
1075 SERIALIZATION_ERROR_INIT(error);
1076
1077 NRF_802154_SPINEL_LOG_BANNER_CALLING();
1078
1079 nrf_802154_spinel_response_notifier_lock_before_request(SPINEL_PROP_VENDOR_NORDIC_NRF_802154_CCA);
1080
1081 res = nrf_802154_spinel_send_cmd_prop_value_set(
1082 SPINEL_PROP_VENDOR_NORDIC_NRF_802154_CCA,
1083 SPINEL_DATATYPE_NRF_802154_CCA,
1084 NULL);
1085
1086 SERIALIZATION_ERROR_CHECK(res, error, bail);
1087
1088 res = net_generic_bool_response_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT,
1089 &cca_result);
1090
1091 SERIALIZATION_ERROR_CHECK(res, error, bail);
1092
1093 bail:
1094 SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
1095
1096 return cca_result;
1097 }
1098
1099 #if NRF_802154_CARRIER_FUNCTIONS_ENABLED
1100
nrf_802154_continuous_carrier(void)1101 bool nrf_802154_continuous_carrier(void)
1102 {
1103 nrf_802154_ser_err_t res;
1104 bool continuous_carrier_result = false;
1105
1106 SERIALIZATION_ERROR_INIT(error);
1107
1108 NRF_802154_SPINEL_LOG_BANNER_CALLING();
1109
1110 nrf_802154_spinel_response_notifier_lock_before_request(
1111 SPINEL_PROP_VENDOR_NORDIC_NRF_802154_CONTINUOUS_CARRIER);
1112
1113 res = nrf_802154_spinel_send_cmd_prop_value_set(
1114 SPINEL_PROP_VENDOR_NORDIC_NRF_802154_CONTINUOUS_CARRIER,
1115 SPINEL_DATATYPE_NRF_802154_CONTINUOUS_CARRIER,
1116 NULL);
1117
1118 SERIALIZATION_ERROR_CHECK(res, error, bail);
1119
1120 res = net_generic_bool_response_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT,
1121 &continuous_carrier_result);
1122
1123 SERIALIZATION_ERROR_CHECK(res, error, bail);
1124
1125 bail:
1126 SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
1127
1128 return continuous_carrier_result;
1129 }
1130
nrf_802154_modulated_carrier(const uint8_t * p_data)1131 bool nrf_802154_modulated_carrier(const uint8_t * p_data)
1132 {
1133 nrf_802154_ser_err_t res;
1134 bool modulated_carrier_result = false;
1135
1136 SERIALIZATION_ERROR_INIT(error);
1137
1138 NRF_802154_SPINEL_LOG_BANNER_CALLING();
1139 NRF_802154_SPINEL_LOG_BUFF(p_data, RAW_PAYLOAD_OFFSET + p_data[0]);
1140
1141 nrf_802154_spinel_response_notifier_lock_before_request(
1142 SPINEL_PROP_VENDOR_NORDIC_NRF_802154_MODULATED_CARRIER);
1143
1144 res = nrf_802154_spinel_send_cmd_prop_value_set(
1145 SPINEL_PROP_VENDOR_NORDIC_NRF_802154_MODULATED_CARRIER,
1146 SPINEL_DATATYPE_NRF_802154_MODULATED_CARRIER,
1147 p_data,
1148 RAW_PAYLOAD_OFFSET + p_data[0]);
1149
1150 SERIALIZATION_ERROR_CHECK(res, error, bail);
1151
1152 res = net_generic_bool_response_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT,
1153 &modulated_carrier_result);
1154
1155 SERIALIZATION_ERROR_CHECK(res, error, bail);
1156
1157 bail:
1158 SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
1159
1160 return modulated_carrier_result;
1161 }
1162
1163 #endif // NRF_802154_CARRIER_FUNCTIONS_ENABLED
1164
nrf_802154_energy_detection(uint32_t time_us)1165 bool nrf_802154_energy_detection(uint32_t time_us)
1166 {
1167 nrf_802154_ser_err_t res;
1168 bool ed_result = false;
1169
1170 SERIALIZATION_ERROR_INIT(error);
1171
1172 NRF_802154_SPINEL_LOG_BANNER_CALLING();
1173
1174 nrf_802154_spinel_response_notifier_lock_before_request(
1175 SPINEL_PROP_VENDOR_NORDIC_NRF_802154_ENERGY_DETECTION);
1176
1177 res = nrf_802154_spinel_send_cmd_prop_value_set(
1178 SPINEL_PROP_VENDOR_NORDIC_NRF_802154_ENERGY_DETECTION,
1179 SPINEL_DATATYPE_NRF_802154_ENERGY_DETECTION,
1180 time_us);
1181
1182 SERIALIZATION_ERROR_CHECK(res, error, bail);
1183
1184 res = net_generic_bool_response_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT,
1185 &ed_result);
1186
1187 SERIALIZATION_ERROR_CHECK(res, error, bail);
1188
1189 bail:
1190 SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
1191
1192 return ed_result;
1193 }
1194
1195 #if NRF_802154_CSMA_CA_ENABLED
1196
nrf_802154_transmit_csma_ca_raw(uint8_t * p_data,const nrf_802154_transmit_csma_ca_metadata_t * p_metadata)1197 bool nrf_802154_transmit_csma_ca_raw(uint8_t * p_data,
1198 const nrf_802154_transmit_csma_ca_metadata_t * p_metadata)
1199 {
1200 nrf_802154_ser_err_t res;
1201 uint32_t data_handle;
1202 bool transmit_result = false;
1203
1204 SERIALIZATION_ERROR_INIT(error);
1205
1206 NRF_802154_SPINEL_LOG_BANNER_CALLING();
1207 NRF_802154_SPINEL_LOG_BUFF(p_data, p_data[0]);
1208
1209 bool handle_added = nrf_802154_buffer_mgr_src_add(nrf_802154_spinel_src_buffer_mgr_get(),
1210 p_data,
1211 &data_handle);
1212
1213 if (p_metadata == NULL)
1214 {
1215 static const nrf_802154_transmit_csma_ca_metadata_t metadata_default =
1216 {
1217 .frame_props = NRF_802154_TRANSMITTED_FRAME_PROPS_DEFAULT_INIT,
1218 .tx_power = {.use_metadata_value = false},
1219 .tx_channel = {.use_metadata_value = false}
1220 };
1221
1222 p_metadata = &metadata_default;
1223 }
1224
1225 SERIALIZATION_ERROR_IF(!handle_added, NRF_802154_SERIALIZATION_ERROR_NO_MEMORY, error, bail);
1226
1227 nrf_802154_spinel_response_notifier_lock_before_request(
1228 SPINEL_PROP_VENDOR_NORDIC_NRF_802154_TRANSMIT_CSMA_CA_RAW);
1229
1230 res = nrf_802154_spinel_send_cmd_prop_value_set(
1231 SPINEL_PROP_VENDOR_NORDIC_NRF_802154_TRANSMIT_CSMA_CA_RAW,
1232 SPINEL_DATATYPE_NRF_802154_TRANSMIT_CSMA_CA_RAW,
1233 NRF_802154_TRANSMIT_CSMA_CA_METADATA_ENCODE(*p_metadata),
1234 NRF_802154_HDATA_ENCODE(data_handle, p_data, p_data[0]));
1235
1236 SERIALIZATION_ERROR_CHECK(res, error, bail);
1237
1238 res = net_generic_bool_response_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT,
1239 &transmit_result);
1240
1241 SERIALIZATION_ERROR_CHECK(res, error, bail);
1242
1243 return transmit_result;
1244
1245 bail:
1246 if (handle_added)
1247 {
1248 /* Rollback what we did until an error to avoid memory leak. */
1249 nrf_802154_buffer_mgr_src_remove_by_buffer_handle(
1250 nrf_802154_spinel_src_buffer_mgr_get(),
1251 data_handle);
1252 }
1253
1254 SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
1255
1256 return transmit_result;
1257 }
1258
nrf_802154_csma_ca_min_be_set(uint8_t min_be)1259 bool nrf_802154_csma_ca_min_be_set(uint8_t min_be)
1260 {
1261 nrf_802154_ser_err_t res;
1262 bool result = false;
1263
1264 SERIALIZATION_ERROR_INIT(error);
1265
1266 NRF_802154_SPINEL_LOG_BANNER_CALLING();
1267 NRF_802154_SPINEL_LOG_VAR("%u", min_be);
1268
1269 nrf_802154_spinel_response_notifier_lock_before_request(
1270 SPINEL_PROP_VENDOR_NORDIC_NRF_802154_CSMA_CA_MIN_BE_SET);
1271
1272 res = nrf_802154_spinel_send_cmd_prop_value_set(
1273 SPINEL_PROP_VENDOR_NORDIC_NRF_802154_CSMA_CA_MIN_BE_SET,
1274 SPINEL_DATATYPE_NRF_802154_CSMA_CA_MIN_BE_SET,
1275 min_be);
1276
1277 SERIALIZATION_ERROR_CHECK(res, error, bail);
1278
1279 res = net_generic_bool_response_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT,
1280 &result);
1281 SERIALIZATION_ERROR_CHECK(res, error, bail);
1282
1283 bail:
1284 SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
1285
1286 return result;
1287 }
1288
nrf_802154_csma_ca_min_be_get(void)1289 uint8_t nrf_802154_csma_ca_min_be_get(void)
1290 {
1291 nrf_802154_ser_err_t res;
1292 uint8_t min_be = 0;
1293
1294 SERIALIZATION_ERROR_INIT(error);
1295
1296 NRF_802154_SPINEL_LOG_BANNER_CALLING();
1297
1298 nrf_802154_spinel_response_notifier_lock_before_request(
1299 SPINEL_PROP_VENDOR_NORDIC_NRF_802154_CSMA_CA_MIN_BE_GET);
1300
1301 res = nrf_802154_spinel_send_cmd_prop_value_set(
1302 SPINEL_PROP_VENDOR_NORDIC_NRF_802154_CSMA_CA_MIN_BE_GET,
1303 SPINEL_DATATYPE_NRF_802154_CSMA_CA_MIN_BE_GET,
1304 &min_be);
1305
1306 SERIALIZATION_ERROR_CHECK(res, error, bail);
1307
1308 res = net_generic_uint8_response_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT,
1309 &min_be);
1310 SERIALIZATION_ERROR_CHECK(res, error, bail);
1311
1312 bail:
1313 SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
1314
1315 return min_be;
1316 }
1317
nrf_802154_csma_ca_max_be_set(uint8_t max_be)1318 bool nrf_802154_csma_ca_max_be_set(uint8_t max_be)
1319 {
1320 nrf_802154_ser_err_t res;
1321 bool result = false;
1322
1323 SERIALIZATION_ERROR_INIT(error);
1324
1325 NRF_802154_SPINEL_LOG_BANNER_CALLING();
1326 NRF_802154_SPINEL_LOG_VAR("%u", max_be);
1327
1328 nrf_802154_spinel_response_notifier_lock_before_request(
1329 SPINEL_PROP_VENDOR_NORDIC_NRF_802154_CSMA_CA_MAX_BE_SET);
1330
1331 res = nrf_802154_spinel_send_cmd_prop_value_set(
1332 SPINEL_PROP_VENDOR_NORDIC_NRF_802154_CSMA_CA_MAX_BE_SET,
1333 SPINEL_DATATYPE_NRF_802154_CSMA_CA_MAX_BE_SET,
1334 max_be);
1335
1336 SERIALIZATION_ERROR_CHECK(res, error, bail);
1337
1338 res = net_generic_bool_response_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT,
1339 &result);
1340 SERIALIZATION_ERROR_CHECK(res, error, bail);
1341
1342 bail:
1343 SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
1344
1345 return result;
1346 }
1347
nrf_802154_csma_ca_max_be_get(void)1348 uint8_t nrf_802154_csma_ca_max_be_get(void)
1349 {
1350 nrf_802154_ser_err_t res;
1351 uint8_t max_be = 0;
1352
1353 SERIALIZATION_ERROR_INIT(error);
1354
1355 NRF_802154_SPINEL_LOG_BANNER_CALLING();
1356
1357 nrf_802154_spinel_response_notifier_lock_before_request(
1358 SPINEL_PROP_VENDOR_NORDIC_NRF_802154_CSMA_CA_MAX_BE_GET);
1359
1360 res = nrf_802154_spinel_send_cmd_prop_value_set(
1361 SPINEL_PROP_VENDOR_NORDIC_NRF_802154_CSMA_CA_MAX_BE_GET,
1362 SPINEL_DATATYPE_NRF_802154_CSMA_CA_MAX_BE_GET,
1363 &max_be);
1364
1365 SERIALIZATION_ERROR_CHECK(res, error, bail);
1366
1367 res = net_generic_uint8_response_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT,
1368 &max_be);
1369 SERIALIZATION_ERROR_CHECK(res, error, bail);
1370
1371 bail:
1372 SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
1373
1374 return max_be;
1375 }
1376
nrf_802154_csma_ca_max_backoffs_set(uint8_t max_backoffs)1377 void nrf_802154_csma_ca_max_backoffs_set(uint8_t max_backoffs)
1378 {
1379 nrf_802154_ser_err_t res;
1380
1381 SERIALIZATION_ERROR_INIT(error);
1382
1383 NRF_802154_SPINEL_LOG_BANNER_CALLING();
1384 NRF_802154_SPINEL_LOG_VAR("%u", max_backoffs);
1385
1386 nrf_802154_spinel_response_notifier_lock_before_request(SPINEL_PROP_LAST_STATUS);
1387
1388 res = nrf_802154_spinel_send_cmd_prop_value_set(
1389 SPINEL_PROP_VENDOR_NORDIC_NRF_802154_CSMA_CA_MAX_BACKOFFS_SET,
1390 SPINEL_DATATYPE_NRF_802154_CSMA_CA_MAX_BACKOFFS_SET,
1391 max_backoffs);
1392
1393 SERIALIZATION_ERROR_CHECK(res, error, bail);
1394
1395 res = status_ok_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT);
1396 SERIALIZATION_ERROR_CHECK(res, error, bail);
1397
1398 bail:
1399 SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
1400
1401 return;
1402 }
1403
nrf_802154_csma_ca_max_backoffs_get(void)1404 uint8_t nrf_802154_csma_ca_max_backoffs_get(void)
1405 {
1406 nrf_802154_ser_err_t res;
1407 uint8_t max_backoffs = 0;
1408
1409 SERIALIZATION_ERROR_INIT(error);
1410
1411 NRF_802154_SPINEL_LOG_BANNER_CALLING();
1412
1413 nrf_802154_spinel_response_notifier_lock_before_request(
1414 SPINEL_PROP_VENDOR_NORDIC_NRF_802154_CSMA_CA_MAX_BACKOFFS_GET);
1415
1416 res = nrf_802154_spinel_send_cmd_prop_value_set(
1417 SPINEL_PROP_VENDOR_NORDIC_NRF_802154_CSMA_CA_MAX_BACKOFFS_GET,
1418 SPINEL_DATATYPE_NRF_802154_CSMA_CA_MAX_BACKOFFS_GET,
1419 &max_backoffs);
1420
1421 SERIALIZATION_ERROR_CHECK(res, error, bail);
1422
1423 res = net_generic_uint8_response_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT,
1424 &max_backoffs);
1425 SERIALIZATION_ERROR_CHECK(res, error, bail);
1426
1427 bail:
1428 SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
1429
1430 return max_backoffs;
1431 }
1432
1433 #endif // NRF_802154_CSMA_CA_ENABLED
1434
1435 #if NRF_802154_TEST_MODES_ENABLED
nrf_802154_test_mode_csmaca_backoff_get(void)1436 nrf_802154_test_mode_csmaca_backoff_t nrf_802154_test_mode_csmaca_backoff_get(void)
1437 {
1438 nrf_802154_ser_err_t res;
1439 nrf_802154_test_mode_csmaca_backoff_t value = 0;
1440
1441 SERIALIZATION_ERROR_INIT(error);
1442
1443 NRF_802154_SPINEL_LOG_BANNER_CALLING();
1444
1445 nrf_802154_spinel_response_notifier_lock_before_request(
1446 SPINEL_PROP_VENDOR_NORDIC_NRF_802154_TEST_MODE_CSMACA_BACKOFF_GET);
1447
1448 res = nrf_802154_spinel_send_cmd_prop_value_set(
1449 SPINEL_PROP_VENDOR_NORDIC_NRF_802154_TEST_MODE_CSMACA_BACKOFF_GET,
1450 SPINEL_DATATYPE_NRF_802154_TEST_MODE_CSMACA_BACKOFF_GET,
1451 &value);
1452
1453 SERIALIZATION_ERROR_CHECK(res, error, bail);
1454
1455 res = net_generic_uint8_response_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT,
1456 &value);
1457 SERIALIZATION_ERROR_CHECK(res, error, bail);
1458
1459 bail:
1460 SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
1461
1462 return value;
1463 }
1464
nrf_802154_test_mode_csmaca_backoff_set(nrf_802154_test_mode_csmaca_backoff_t value)1465 void nrf_802154_test_mode_csmaca_backoff_set(nrf_802154_test_mode_csmaca_backoff_t value)
1466 {
1467 nrf_802154_ser_err_t res;
1468
1469 SERIALIZATION_ERROR_INIT(error);
1470
1471 NRF_802154_SPINEL_LOG_BANNER_CALLING();
1472 NRF_802154_SPINEL_LOG_VAR("%u", value);
1473
1474 nrf_802154_spinel_response_notifier_lock_before_request(SPINEL_PROP_LAST_STATUS);
1475
1476 res = nrf_802154_spinel_send_cmd_prop_value_set(
1477 SPINEL_PROP_VENDOR_NORDIC_NRF_802154_TEST_MODE_CSMACA_BACKOFF_SET,
1478 SPINEL_DATATYPE_NRF_802154_TEST_MODE_CSMACA_BACKOFF_SET,
1479 value);
1480
1481 SERIALIZATION_ERROR_CHECK(res, error, bail);
1482
1483 res = status_ok_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT);
1484 SERIALIZATION_ERROR_CHECK(res, error, bail);
1485
1486 bail:
1487 SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
1488
1489 return;
1490 }
1491
1492 #endif // NRF_802154_TEST_MODES_ENABLED
1493
nrf_802154_transmit_raw(uint8_t * p_data,const nrf_802154_transmit_metadata_t * p_metadata)1494 bool nrf_802154_transmit_raw(uint8_t * p_data,
1495 const nrf_802154_transmit_metadata_t * p_metadata)
1496 {
1497 nrf_802154_ser_err_t res;
1498 uint32_t data_handle;
1499 bool transmit_result = false;
1500
1501 SERIALIZATION_ERROR_INIT(error);
1502
1503 NRF_802154_SPINEL_LOG_BANNER_CALLING();
1504 NRF_802154_SPINEL_LOG_BUFF(p_data, p_data[0]);
1505
1506 bool handle_added = nrf_802154_buffer_mgr_src_add(nrf_802154_spinel_src_buffer_mgr_get(),
1507 p_data,
1508 &data_handle);
1509
1510 if (p_metadata == NULL)
1511 {
1512 static const nrf_802154_transmit_metadata_t metadata_default =
1513 {
1514 .frame_props = NRF_802154_TRANSMITTED_FRAME_PROPS_DEFAULT_INIT,
1515 .cca = true,
1516 .tx_power = {.use_metadata_value = false},
1517 .tx_channel = {.use_metadata_value = false}
1518 };
1519
1520 p_metadata = &metadata_default;
1521 }
1522
1523 SERIALIZATION_ERROR_IF(!handle_added, NRF_802154_SERIALIZATION_ERROR_NO_MEMORY, error, bail);
1524
1525 nrf_802154_spinel_response_notifier_lock_before_request(
1526 SPINEL_PROP_VENDOR_NORDIC_NRF_802154_TRANSMIT_RAW);
1527
1528 res = nrf_802154_spinel_send_cmd_prop_value_set(
1529 SPINEL_PROP_VENDOR_NORDIC_NRF_802154_TRANSMIT_RAW,
1530 SPINEL_DATATYPE_NRF_802154_TRANSMIT_RAW,
1531 NRF_802154_TRANSMIT_METADATA_ENCODE(*p_metadata),
1532 NRF_802154_HDATA_ENCODE(data_handle, p_data, p_data[0]));
1533
1534 SERIALIZATION_ERROR_CHECK(res, error, bail);
1535
1536 res = net_generic_bool_response_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT,
1537 &transmit_result);
1538
1539 SERIALIZATION_ERROR_CHECK(res, error, bail);
1540
1541 return transmit_result;
1542
1543 bail:
1544 if (handle_added)
1545 {
1546 /* Rollback what we did until an error to avoid memory leak. */
1547 nrf_802154_buffer_mgr_src_remove_by_buffer_handle(
1548 nrf_802154_spinel_src_buffer_mgr_get(),
1549 data_handle);
1550 }
1551
1552 SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
1553
1554 return transmit_result;
1555 }
1556
nrf_802154_transmit_raw_at(uint8_t * p_data,uint64_t tx_time,const nrf_802154_transmit_at_metadata_t * p_metadata)1557 bool nrf_802154_transmit_raw_at(uint8_t * p_data,
1558 uint64_t tx_time,
1559 const nrf_802154_transmit_at_metadata_t * p_metadata)
1560 {
1561 nrf_802154_ser_err_t res;
1562 uint32_t data_handle;
1563 bool transmit_result = false;
1564
1565 SERIALIZATION_ERROR_INIT(error);
1566
1567 NRF_802154_SPINEL_LOG_BANNER_CALLING();
1568 NRF_802154_SPINEL_LOG_BUFF(p_data, p_data[0]);
1569
1570 bool handle_added = nrf_802154_buffer_mgr_src_add(nrf_802154_spinel_src_buffer_mgr_get(),
1571 p_data,
1572 &data_handle);
1573
1574 if (p_metadata == NULL)
1575 {
1576 static const nrf_802154_transmit_at_metadata_t metadata_default =
1577 {
1578 .frame_props = NRF_802154_TRANSMITTED_FRAME_PROPS_DEFAULT_INIT,
1579 .cca = true,
1580 // channel set to 0 will be replaced on net core by the current channel from PIB
1581 .channel = 0,
1582 .tx_power = {.use_metadata_value = false},
1583 .extra_cca_attempts = 0U,
1584 };
1585
1586 p_metadata = &metadata_default;
1587 }
1588
1589 SERIALIZATION_ERROR_IF(!handle_added, NRF_802154_SERIALIZATION_ERROR_NO_MEMORY, error, bail);
1590
1591 nrf_802154_spinel_response_notifier_lock_before_request(
1592 SPINEL_PROP_VENDOR_NORDIC_NRF_802154_TRANSMIT_RAW_AT);
1593
1594 res = nrf_802154_spinel_send_cmd_prop_value_set(
1595 SPINEL_PROP_VENDOR_NORDIC_NRF_802154_TRANSMIT_RAW_AT,
1596 SPINEL_DATATYPE_NRF_802154_TRANSMIT_RAW_AT,
1597 NRF_802154_TRANSMIT_AT_METADATA_ENCODE(*p_metadata),
1598 tx_time,
1599 NRF_802154_HDATA_ENCODE(data_handle, p_data, p_data[0]));
1600
1601 SERIALIZATION_ERROR_CHECK(res, error, bail);
1602
1603 res = net_generic_bool_response_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT,
1604 &transmit_result);
1605
1606 SERIALIZATION_ERROR_CHECK(res, error, bail);
1607
1608 return transmit_result;
1609
1610 bail:
1611 if (handle_added)
1612 {
1613 /* Rollback what we did until an error to avoid memory leak. */
1614 nrf_802154_buffer_mgr_src_remove_by_buffer_handle(
1615 nrf_802154_spinel_src_buffer_mgr_get(),
1616 data_handle);
1617 }
1618
1619 SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
1620
1621 return transmit_result;
1622 }
1623
nrf_802154_transmit_at_cancel(void)1624 bool nrf_802154_transmit_at_cancel(void)
1625 {
1626 nrf_802154_ser_err_t res;
1627 bool cancel_result = false;
1628
1629 SERIALIZATION_ERROR_INIT(error);
1630
1631 NRF_802154_SPINEL_LOG_BANNER_CALLING();
1632
1633 nrf_802154_spinel_response_notifier_lock_before_request(
1634 SPINEL_PROP_VENDOR_NORDIC_NRF_802154_TRANSMIT_AT_CANCEL);
1635
1636 res = nrf_802154_spinel_send_cmd_prop_value_set(
1637 SPINEL_PROP_VENDOR_NORDIC_NRF_802154_TRANSMIT_AT_CANCEL,
1638 SPINEL_DATATYPE_NRF_802154_TRANSMIT_AT_CANCEL,
1639 NULL);
1640
1641 SERIALIZATION_ERROR_CHECK(res, error, bail);
1642
1643 res = net_generic_bool_response_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT,
1644 &cancel_result);
1645
1646 SERIALIZATION_ERROR_CHECK(res, error, bail);
1647
1648 bail:
1649 SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
1650
1651 return cancel_result;
1652 }
1653
nrf_802154_buffer_free_raw(uint8_t * p_data)1654 void nrf_802154_buffer_free_raw(uint8_t * p_data)
1655 {
1656 nrf_802154_ser_err_t res;
1657 uint32_t data_handle;
1658
1659 SERIALIZATION_ERROR_INIT(error);
1660
1661 NRF_802154_SPINEL_LOG_BANNER_CALLING();
1662 NRF_802154_SPINEL_LOG_BUFF(p_data, p_data[0]);
1663
1664 bool handle_found = nrf_802154_buffer_mgr_dst_search_by_local_pointer(
1665 nrf_802154_spinel_dst_buffer_mgr_get(),
1666 p_data,
1667 &data_handle);
1668
1669 SERIALIZATION_ERROR_IF(!handle_found,
1670 NRF_802154_SERIALIZATION_ERROR_INVALID_BUFFER,
1671 error,
1672 bail);
1673
1674 nrf_802154_spinel_response_notifier_lock_before_request(SPINEL_PROP_LAST_STATUS);
1675
1676 res = nrf_802154_spinel_send_cmd_prop_value_set(
1677 SPINEL_PROP_VENDOR_NORDIC_NRF_802154_BUFFER_FREE_RAW,
1678 SPINEL_DATATYPE_NRF_802154_BUFFER_FREE_RAW,
1679 data_handle);
1680
1681 SERIALIZATION_ERROR_CHECK(res, error, bail);
1682
1683 bool removed = nrf_802154_buffer_mgr_dst_remove_by_local_pointer(
1684 nrf_802154_spinel_dst_buffer_mgr_get(),
1685 p_data);
1686
1687 SERIALIZATION_ERROR_IF(!removed,
1688 NRF_802154_SERIALIZATION_ERROR_INVALID_BUFFER,
1689 error,
1690 bail);
1691
1692 res = status_ok_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT);
1693 SERIALIZATION_ERROR_CHECK(res, error, bail);
1694
1695 bail:
1696 SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
1697
1698 return;
1699 }
1700
nrf_802154_tx_power_set(int8_t power)1701 void nrf_802154_tx_power_set(int8_t power)
1702 {
1703 nrf_802154_ser_err_t res;
1704
1705 SERIALIZATION_ERROR_INIT(error);
1706
1707 NRF_802154_SPINEL_LOG_BANNER_CALLING();
1708
1709 nrf_802154_spinel_response_notifier_lock_before_request(SPINEL_PROP_LAST_STATUS);
1710
1711 res = nrf_802154_spinel_send_cmd_prop_value_set(
1712 SPINEL_PROP_VENDOR_NORDIC_NRF_802154_TX_POWER_SET,
1713 SPINEL_DATATYPE_NRF_802154_TX_POWER_SET,
1714 power);
1715
1716 SERIALIZATION_ERROR_CHECK(res, error, bail);
1717
1718 res = status_ok_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT);
1719 SERIALIZATION_ERROR_CHECK(res, error, bail);
1720
1721 bail:
1722 SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
1723
1724 return;
1725 }
1726
nrf_802154_tx_power_get(void)1727 int8_t nrf_802154_tx_power_get(void)
1728 {
1729 int32_t res;
1730 int8_t power = 0;
1731
1732 SERIALIZATION_ERROR_INIT(error);
1733
1734 NRF_802154_SPINEL_LOG_BANNER_CALLING();
1735
1736 nrf_802154_spinel_response_notifier_lock_before_request(
1737 SPINEL_PROP_VENDOR_NORDIC_NRF_802154_TX_POWER_GET);
1738
1739 res = nrf_802154_spinel_send_cmd_prop_value_set(
1740 SPINEL_PROP_VENDOR_NORDIC_NRF_802154_TX_POWER_GET,
1741 SPINEL_DATATYPE_NRF_802154_TX_POWER_GET,
1742 NULL);
1743
1744 SERIALIZATION_ERROR_CHECK(res, error, bail);
1745
1746 res = tx_power_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT, &power);
1747 SERIALIZATION_ERROR_CHECK(res, error, bail);
1748
1749 bail:
1750 SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
1751
1752 return power;
1753 }
1754
nrf_802154_capabilities_get(void)1755 nrf_802154_capabilities_t nrf_802154_capabilities_get(void)
1756 {
1757 int32_t res;
1758 nrf_802154_capabilities_t caps = 0UL;
1759
1760 SERIALIZATION_ERROR_INIT(error);
1761
1762 NRF_802154_SPINEL_LOG_BANNER_CALLING();
1763
1764 nrf_802154_spinel_response_notifier_lock_before_request(
1765 SPINEL_PROP_VENDOR_NORDIC_NRF_802154_CAPABILITIES_GET);
1766
1767 res = nrf_802154_spinel_send_cmd_prop_value_set(
1768 SPINEL_PROP_VENDOR_NORDIC_NRF_802154_CAPABILITIES_GET,
1769 SPINEL_DATATYPE_NRF_802154_CAPABILITIES_GET,
1770 NULL);
1771
1772 SERIALIZATION_ERROR_CHECK(res, error, bail);
1773
1774 res = capabilities_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT, &caps);
1775 SERIALIZATION_ERROR_CHECK(res, error, bail);
1776
1777 bail:
1778 SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
1779
1780 return caps;
1781 }
1782
nrf_802154_time_get(void)1783 uint64_t nrf_802154_time_get(void)
1784 {
1785 int32_t res;
1786 uint64_t time = 0UL;
1787
1788 SERIALIZATION_ERROR_INIT(error);
1789
1790 NRF_802154_SPINEL_LOG_BANNER_CALLING();
1791
1792 nrf_802154_spinel_response_notifier_lock_before_request(
1793 SPINEL_PROP_VENDOR_NORDIC_NRF_802154_TIME_GET);
1794
1795 res = nrf_802154_spinel_send_cmd_prop_value_set(
1796 SPINEL_PROP_VENDOR_NORDIC_NRF_802154_TIME_GET,
1797 SPINEL_DATATYPE_NRF_802154_TIME_GET,
1798 NULL);
1799
1800 SERIALIZATION_ERROR_CHECK(res, error, bail);
1801
1802 res = time_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT, &time);
1803 SERIALIZATION_ERROR_CHECK(res, error, bail);
1804
1805 bail:
1806 SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
1807
1808 return time;
1809 }
1810
nrf_802154_cca_cfg_set(const nrf_802154_cca_cfg_t * p_cfg)1811 void nrf_802154_cca_cfg_set(const nrf_802154_cca_cfg_t * p_cfg)
1812 {
1813 nrf_802154_ser_err_t res;
1814
1815 SERIALIZATION_ERROR_INIT(error);
1816
1817 NRF_802154_SPINEL_LOG_BANNER_CALLING();
1818 NRF_802154_SPINEL_LOG_VAR_NAMED("%u", p_cfg->mode, "Mode");
1819 NRF_802154_SPINEL_LOG_VAR_NAMED("%u", p_cfg->ed_threshold, "ED threshold");
1820 NRF_802154_SPINEL_LOG_VAR_NAMED("%u", p_cfg->corr_threshold, "Corr threshold");
1821 NRF_802154_SPINEL_LOG_VAR_NAMED("%u", p_cfg->corr_limit, "Corr limit");
1822
1823 nrf_802154_spinel_response_notifier_lock_before_request(SPINEL_PROP_LAST_STATUS);
1824
1825 res = nrf_802154_spinel_send_cmd_prop_value_set(
1826 SPINEL_PROP_VENDOR_NORDIC_NRF_802154_CCA_CFG_SET,
1827 SPINEL_DATATYPE_NRF_802154_CCA_CFG_SET,
1828 NRF_802154_CCA_CFG_ENCODE(*p_cfg));
1829
1830 SERIALIZATION_ERROR_CHECK(res, error, bail);
1831
1832 res = status_ok_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT);
1833 SERIALIZATION_ERROR_CHECK(res, error, bail);
1834
1835 bail:
1836 SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
1837
1838 return;
1839 }
1840
nrf_802154_cca_cfg_get(nrf_802154_cca_cfg_t * p_cfg)1841 void nrf_802154_cca_cfg_get(nrf_802154_cca_cfg_t * p_cfg)
1842 {
1843 nrf_802154_ser_err_t res;
1844
1845 SERIALIZATION_ERROR_INIT(error);
1846
1847 NRF_802154_SPINEL_LOG_BANNER_CALLING();
1848
1849 nrf_802154_spinel_response_notifier_lock_before_request(
1850 SPINEL_PROP_VENDOR_NORDIC_NRF_802154_CCA_CFG_GET);
1851
1852 res = nrf_802154_spinel_send_cmd_prop_value_set(
1853 SPINEL_PROP_VENDOR_NORDIC_NRF_802154_CCA_CFG_GET,
1854 SPINEL_DATATYPE_NRF_802154_CCA_CFG_GET,
1855 NULL);
1856
1857 SERIALIZATION_ERROR_CHECK(res, error, bail);
1858
1859 res = cca_cfg_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT, p_cfg);
1860 SERIALIZATION_ERROR_CHECK(res, error, bail);
1861
1862 bail:
1863 SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
1864 }
1865
nrf_802154_security_global_frame_counter_set(uint32_t frame_counter)1866 void nrf_802154_security_global_frame_counter_set(uint32_t frame_counter)
1867 {
1868 nrf_802154_ser_err_t res;
1869
1870 SERIALIZATION_ERROR_INIT(error);
1871
1872 NRF_802154_SPINEL_LOG_BANNER_CALLING();
1873
1874 nrf_802154_spinel_response_notifier_lock_before_request(SPINEL_PROP_LAST_STATUS);
1875
1876 res = nrf_802154_spinel_send_cmd_prop_value_set(
1877 SPINEL_PROP_VENDOR_NORDIC_NRF_802154_SECURITY_GLOBAL_FRAME_COUNTER_SET,
1878 SPINEL_DATATYPE_NRF_802154_SECURITY_GLOBAL_FRAME_COUNTER_SET,
1879 frame_counter);
1880
1881 SERIALIZATION_ERROR_CHECK(res, error, bail);
1882
1883 res = status_ok_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT);
1884 SERIALIZATION_ERROR_CHECK(res, error, bail);
1885
1886 bail:
1887 SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
1888
1889 return;
1890 }
1891
nrf_802154_security_global_frame_counter_set_if_larger(uint32_t frame_counter)1892 void nrf_802154_security_global_frame_counter_set_if_larger(uint32_t frame_counter)
1893 {
1894 nrf_802154_ser_err_t res;
1895
1896 SERIALIZATION_ERROR_INIT(error);
1897
1898 NRF_802154_SPINEL_LOG_BANNER_CALLING();
1899
1900 nrf_802154_spinel_response_notifier_lock_before_request(SPINEL_PROP_LAST_STATUS);
1901
1902 res = nrf_802154_spinel_send_cmd_prop_value_set(
1903 SPINEL_PROP_VENDOR_NORDIC_NRF_802154_SECURITY_GLOBAL_FRAME_COUNTER_SET_IF_LARGER,
1904 SPINEL_DATATYPE_NRF_802154_SECURITY_GLOBAL_FRAME_COUNTER_SET,
1905 frame_counter);
1906
1907 SERIALIZATION_ERROR_CHECK(res, error, bail);
1908
1909 res = status_ok_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT);
1910 SERIALIZATION_ERROR_CHECK(res, error, bail);
1911
1912 bail:
1913 SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
1914
1915 return;
1916 }
1917
nrf_802154_security_key_store(nrf_802154_key_t * p_key)1918 nrf_802154_security_error_t nrf_802154_security_key_store(nrf_802154_key_t * p_key)
1919 {
1920 nrf_802154_ser_err_t res;
1921 nrf_802154_security_error_t err = NRF_802154_SECURITY_ERROR_NONE;;
1922
1923 SERIALIZATION_ERROR_INIT(error);
1924
1925 NRF_802154_SPINEL_LOG_BANNER_CALLING();
1926
1927 nrf_802154_spinel_response_notifier_lock_before_request(
1928 SPINEL_PROP_VENDOR_NORDIC_NRF_802154_SECURITY_KEY_STORE);
1929
1930 res = nrf_802154_spinel_send_cmd_prop_value_set(
1931 SPINEL_PROP_VENDOR_NORDIC_NRF_802154_SECURITY_KEY_STORE,
1932 SPINEL_DATATYPE_NRF_802154_SECURITY_KEY_STORE,
1933 NRF_802154_SECURITY_KEY_STORE_ENCODE(*p_key, AES_CCM_KEY_SIZE, KEY_ID_MODE_3_SIZE));
1934
1935 SERIALIZATION_ERROR_CHECK(res, error, bail);
1936
1937 res = net_generic_uint8_response_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT, &err);
1938 SERIALIZATION_ERROR_CHECK(res, error, bail);
1939
1940 bail:
1941 SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
1942
1943 return err;
1944 }
1945
nrf_802154_security_key_remove(nrf_802154_key_id_t * p_id)1946 nrf_802154_security_error_t nrf_802154_security_key_remove(nrf_802154_key_id_t * p_id)
1947 {
1948 nrf_802154_ser_err_t res;
1949 nrf_802154_security_error_t err = NRF_802154_SECURITY_ERROR_NONE;
1950
1951 SERIALIZATION_ERROR_INIT(error);
1952
1953 NRF_802154_SPINEL_LOG_BANNER_CALLING();
1954
1955 nrf_802154_spinel_response_notifier_lock_before_request(
1956 SPINEL_PROP_VENDOR_NORDIC_NRF_802154_SECURITY_KEY_REMOVE);
1957
1958 res = nrf_802154_spinel_send_cmd_prop_value_set(
1959 SPINEL_PROP_VENDOR_NORDIC_NRF_802154_SECURITY_KEY_REMOVE,
1960 SPINEL_DATATYPE_NRF_802154_SECURITY_KEY_REMOVE,
1961 NRF_802154_SECURITY_KEY_REMOVE_ENCODE(*p_id, KEY_ID_MODE_3_SIZE));
1962
1963 SERIALIZATION_ERROR_CHECK(res, error, bail);
1964
1965 res = net_generic_uint8_response_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT, &err);
1966 SERIALIZATION_ERROR_CHECK(res, error, bail);
1967
1968 bail:
1969 SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
1970
1971 return err;
1972 }
1973
nrf_802154_security_key_remove_all(void)1974 void nrf_802154_security_key_remove_all(void)
1975 {
1976 nrf_802154_ser_err_t res;
1977
1978 SERIALIZATION_ERROR_INIT(error);
1979
1980 NRF_802154_SPINEL_LOG_BANNER_CALLING();
1981
1982 nrf_802154_spinel_response_notifier_lock_before_request(SPINEL_PROP_LAST_STATUS);
1983
1984 res = nrf_802154_spinel_send_cmd_prop_value_set(
1985 SPINEL_PROP_VENDOR_NORDIC_NRF_802154_SECURITY_KEY_REMOVE_ALL,
1986 SPINEL_DATATYPE_NRF_802154_SECURITY_KEY_REMOVE_ALL,
1987 NULL);
1988
1989 SERIALIZATION_ERROR_CHECK(res, error, bail);
1990
1991 res = status_ok_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT);
1992 SERIALIZATION_ERROR_CHECK(res, error, bail);
1993
1994 bail:
1995 SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
1996
1997 return;
1998 }
1999
nrf_802154_csl_writer_period_set(uint16_t period)2000 void nrf_802154_csl_writer_period_set(uint16_t period)
2001 {
2002 nrf_802154_ser_err_t res;
2003
2004 SERIALIZATION_ERROR_INIT(error);
2005
2006 NRF_802154_SPINEL_LOG_BANNER_CALLING();
2007
2008 nrf_802154_spinel_response_notifier_lock_before_request(SPINEL_PROP_LAST_STATUS);
2009
2010 res = nrf_802154_spinel_send_cmd_prop_value_set(
2011 SPINEL_PROP_VENDOR_NORDIC_NRF_802154_CSL_WRITER_PERIOD_SET,
2012 SPINEL_DATATYPE_NRF_802154_CSL_WRITER_PERIOD_SET,
2013 period);
2014
2015 SERIALIZATION_ERROR_CHECK(res, error, bail);
2016
2017 res = status_ok_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT);
2018 SERIALIZATION_ERROR_CHECK(res, error, bail);
2019
2020 bail:
2021 SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
2022
2023 return;
2024 }
2025
nrf_802154_csl_writer_anchor_time_set(uint64_t anchor_time)2026 void nrf_802154_csl_writer_anchor_time_set(uint64_t anchor_time)
2027 {
2028 nrf_802154_ser_err_t res;
2029
2030 SERIALIZATION_ERROR_INIT(error);
2031
2032 NRF_802154_SPINEL_LOG_BANNER_CALLING();
2033
2034 nrf_802154_spinel_response_notifier_lock_before_request(SPINEL_PROP_LAST_STATUS);
2035
2036 res = nrf_802154_spinel_send_cmd_prop_value_set(
2037 SPINEL_PROP_VENDOR_NORDIC_NRF_802154_CSL_WRITER_ANCHOR_TIME_SET,
2038 SPINEL_DATATYPE_NRF_802154_CSL_WRITER_ANCHOR_TIME_SET,
2039 anchor_time);
2040
2041 SERIALIZATION_ERROR_CHECK(res, error, bail);
2042
2043 res = status_ok_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT);
2044 SERIALIZATION_ERROR_CHECK(res, error, bail);
2045
2046 bail:
2047 SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
2048
2049 return;
2050 }
2051
stat_timestamps_get_ret_await(uint32_t timeout,nrf_802154_stat_timestamps_t * p_stat_timestamps)2052 static nrf_802154_ser_err_t stat_timestamps_get_ret_await(uint32_t timeout,
2053 nrf_802154_stat_timestamps_t * p_stat_timestamps)
2054 {
2055 nrf_802154_ser_err_t res;
2056 nrf_802154_spinel_notify_buff_t * p_notify_data = NULL;
2057
2058 SERIALIZATION_ERROR_INIT(error);
2059
2060 p_notify_data = nrf_802154_spinel_response_notifier_property_await(
2061 timeout);
2062
2063 SERIALIZATION_ERROR_IF(p_notify_data == NULL,
2064 NRF_802154_SERIALIZATION_ERROR_RESPONSE_TIMEOUT,
2065 error,
2066 bail);
2067
2068 res = nrf_802154_spinel_decode_prop_nrf_802154_stat_timestamps_get_ret(
2069 p_notify_data->data,
2070 p_notify_data->data_len,
2071 p_stat_timestamps);
2072
2073 SERIALIZATION_ERROR_CHECK(res, error, bail);
2074
2075 NRF_802154_SPINEL_LOG_BANNER_RESPONSE();
2076
2077 bail:
2078 if (p_notify_data != NULL)
2079 {
2080 nrf_802154_spinel_response_notifier_free(p_notify_data);
2081 }
2082
2083 return error;
2084 }
2085
nrf_802154_stat_timestamps_get(nrf_802154_stat_timestamps_t * p_stat_timestamps)2086 void nrf_802154_stat_timestamps_get(nrf_802154_stat_timestamps_t * p_stat_timestamps)
2087 {
2088 nrf_802154_ser_err_t res;
2089
2090 SERIALIZATION_ERROR_INIT(error);
2091
2092 NRF_802154_SPINEL_LOG_BANNER_CALLING();
2093
2094 nrf_802154_spinel_response_notifier_lock_before_request(
2095 SPINEL_PROP_VENDOR_NORDIC_NRF_802154_STAT_TIMESTAMPS_GET);
2096
2097 res = nrf_802154_spinel_send_cmd_prop_value_set(
2098 SPINEL_PROP_VENDOR_NORDIC_NRF_802154_STAT_TIMESTAMPS_GET,
2099 SPINEL_DATATYPE_NRF_802154_STAT_TIMESTAMPS_GET,
2100 NULL);
2101
2102 SERIALIZATION_ERROR_CHECK(res, error, bail);
2103
2104 res = stat_timestamps_get_ret_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT,
2105 p_stat_timestamps);
2106 SERIALIZATION_ERROR_CHECK(res, error, bail);
2107
2108 bail:
2109 SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
2110 }
2111
2112 #if NRF_802154_IFS_ENABLED
2113
nrf_802154_ifs_mode_get(void)2114 nrf_802154_ifs_mode_t nrf_802154_ifs_mode_get(void)
2115 {
2116 nrf_802154_ser_err_t res;
2117 nrf_802154_ifs_mode_t mode = NRF_802154_IFS_MODE_DISABLED;
2118
2119 SERIALIZATION_ERROR_INIT(error);
2120
2121 NRF_802154_SPINEL_LOG_BANNER_CALLING();
2122
2123 nrf_802154_spinel_response_notifier_lock_before_request(
2124 SPINEL_PROP_VENDOR_NORDIC_NRF_802154_IFS_MODE_GET);
2125
2126 res = nrf_802154_spinel_send_cmd_prop_value_set(
2127 SPINEL_PROP_VENDOR_NORDIC_NRF_802154_IFS_MODE_GET,
2128 SPINEL_DATATYPE_NRF_802154_IFS_MODE_GET,
2129 NULL);
2130
2131 SERIALIZATION_ERROR_CHECK(res, error, bail);
2132
2133 res = net_generic_uint8_response_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT,
2134 &mode);
2135 SERIALIZATION_ERROR_CHECK(res, error, bail);
2136
2137 bail:
2138 SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
2139
2140 return mode;
2141 }
2142
nrf_802154_ifs_mode_set(nrf_802154_ifs_mode_t mode)2143 bool nrf_802154_ifs_mode_set(nrf_802154_ifs_mode_t mode)
2144 {
2145 nrf_802154_ser_err_t res;
2146 bool result = false;
2147
2148 SERIALIZATION_ERROR_INIT(error);
2149
2150 NRF_802154_SPINEL_LOG_BANNER_CALLING();
2151 NRF_802154_SPINEL_LOG_VAR("%u", mode);
2152
2153 nrf_802154_spinel_response_notifier_lock_before_request(
2154 SPINEL_PROP_VENDOR_NORDIC_NRF_802154_IFS_MODE_SET);
2155
2156 res = nrf_802154_spinel_send_cmd_prop_value_set(
2157 SPINEL_PROP_VENDOR_NORDIC_NRF_802154_IFS_MODE_SET,
2158 SPINEL_DATATYPE_NRF_802154_IFS_MODE_SET,
2159 mode);
2160
2161 SERIALIZATION_ERROR_CHECK(res, error, bail);
2162
2163 res = net_generic_bool_response_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT,
2164 &result);
2165 SERIALIZATION_ERROR_CHECK(res, error, bail);
2166
2167 bail:
2168 SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
2169
2170 return result;
2171 }
2172
nrf_802154_ifs_min_sifs_period_get(void)2173 uint16_t nrf_802154_ifs_min_sifs_period_get(void)
2174 {
2175 nrf_802154_ser_err_t res;
2176 uint16_t period = 0U;
2177
2178 SERIALIZATION_ERROR_INIT(error);
2179
2180 NRF_802154_SPINEL_LOG_BANNER_CALLING();
2181
2182 nrf_802154_spinel_response_notifier_lock_before_request(
2183 SPINEL_PROP_VENDOR_NORDIC_NRF_802154_IFS_MIN_SIFS_PERIOD_GET);
2184
2185 res = nrf_802154_spinel_send_cmd_prop_value_set(
2186 SPINEL_PROP_VENDOR_NORDIC_NRF_802154_IFS_MIN_SIFS_PERIOD_GET,
2187 SPINEL_DATATYPE_NRF_802154_IFS_MIN_SIFS_PERIOD_GET,
2188 NULL);
2189
2190 SERIALIZATION_ERROR_CHECK(res, error, bail);
2191
2192 res = net_generic_uint16_response_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT,
2193 &period);
2194 SERIALIZATION_ERROR_CHECK(res, error, bail);
2195
2196 bail:
2197 SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
2198
2199 return period;
2200 }
2201
nrf_802154_ifs_min_sifs_period_set(uint16_t period)2202 void nrf_802154_ifs_min_sifs_period_set(uint16_t period)
2203 {
2204 nrf_802154_ser_err_t res;
2205
2206 SERIALIZATION_ERROR_INIT(error);
2207
2208 NRF_802154_SPINEL_LOG_BANNER_CALLING();
2209
2210 nrf_802154_spinel_response_notifier_lock_before_request(SPINEL_PROP_LAST_STATUS);
2211
2212 res = nrf_802154_spinel_send_cmd_prop_value_set(
2213 SPINEL_PROP_VENDOR_NORDIC_NRF_802154_IFS_MIN_SIFS_PERIOD_SET,
2214 SPINEL_DATATYPE_NRF_802154_IFS_MIN_SIFS_PERIOD_SET,
2215 period);
2216
2217 SERIALIZATION_ERROR_CHECK(res, error, bail);
2218
2219 res = status_ok_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT);
2220 SERIALIZATION_ERROR_CHECK(res, error, bail);
2221
2222 bail:
2223 SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
2224
2225 return;
2226 }
2227
nrf_802154_ifs_min_lifs_period_get(void)2228 uint16_t nrf_802154_ifs_min_lifs_period_get(void)
2229 {
2230 nrf_802154_ser_err_t res;
2231 uint16_t period = 0U;
2232
2233 SERIALIZATION_ERROR_INIT(error);
2234
2235 NRF_802154_SPINEL_LOG_BANNER_CALLING();
2236
2237 nrf_802154_spinel_response_notifier_lock_before_request(
2238 SPINEL_PROP_VENDOR_NORDIC_NRF_802154_IFS_MIN_LIFS_PERIOD_GET);
2239
2240 res = nrf_802154_spinel_send_cmd_prop_value_set(
2241 SPINEL_PROP_VENDOR_NORDIC_NRF_802154_IFS_MIN_LIFS_PERIOD_GET,
2242 SPINEL_DATATYPE_NRF_802154_IFS_MIN_LIFS_PERIOD_GET,
2243 NULL);
2244
2245 SERIALIZATION_ERROR_CHECK(res, error, bail);
2246
2247 res = net_generic_uint16_response_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT,
2248 &period);
2249 SERIALIZATION_ERROR_CHECK(res, error, bail);
2250
2251 bail:
2252 SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
2253
2254 return period;
2255 }
2256
nrf_802154_ifs_min_lifs_period_set(uint16_t period)2257 void nrf_802154_ifs_min_lifs_period_set(uint16_t period)
2258 {
2259 nrf_802154_ser_err_t res;
2260
2261 SERIALIZATION_ERROR_INIT(error);
2262
2263 NRF_802154_SPINEL_LOG_BANNER_CALLING();
2264
2265 nrf_802154_spinel_response_notifier_lock_before_request(SPINEL_PROP_LAST_STATUS);
2266
2267 res = nrf_802154_spinel_send_cmd_prop_value_set(
2268 SPINEL_PROP_VENDOR_NORDIC_NRF_802154_IFS_MIN_LIFS_PERIOD_SET,
2269 SPINEL_DATATYPE_NRF_802154_IFS_MIN_LIFS_PERIOD_SET,
2270 period);
2271
2272 SERIALIZATION_ERROR_CHECK(res, error, bail);
2273
2274 res = status_ok_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT);
2275 SERIALIZATION_ERROR_CHECK(res, error, bail);
2276
2277 bail:
2278 SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
2279
2280 return;
2281 }
2282
2283 #endif // NRF_802154_IFS_ENABLED
2284