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 * @defgroup nrf_802154_spinel_serialization_response_notifier 37 * 802.15.4 radio driver spinel serialization response notifier 38 * @{ 39 * 40 */ 41 42 #ifndef NRF_802154_RESPONSE_NOTIFIER_H_ 43 #define NRF_802154_RESPONSE_NOTIFIER_H_ 44 45 #include <stdint.h> 46 #include <stddef.h> 47 48 #include "../spinel_base/spinel.h" 49 50 #ifdef __cplusplus 51 extern "C" { 52 #endif 53 54 /** 55 * @brief Infinite timeout for @ref nrf_802154_spinel_response_notifier_property_await. 56 */ 57 #define SPINEL_RESPONSE_NOTIFIER_INF_TIMEOUT UINT32_MAX 58 59 /** 60 * @brief Data buffer type used by response notifier module. 61 */ 62 typedef struct 63 { 64 /** 65 * @brief Buffer for notification data storage. 66 */ 67 uint8_t data[SPINEL_FRAME_MAX_COMMAND_PAYLOAD_SIZE]; 68 /** 69 * @brief Size of data stored in @ref data. 70 */ 71 size_t data_len; 72 } nrf_802154_spinel_notify_buff_t; 73 74 /** 75 * @brief Initialize module 76 */ 77 void nrf_802154_spinel_response_notifier_init(void); 78 79 /** 80 * @brief Lock access to response notifier before request is sent. 81 * 82 * It is possible that while one thread is waiting for response, another thread 83 * sends other request. Currently matching responses to requests is not 84 * implemented. Because of that before a new request is sent, the previous 85 * response must be received. 86 * 87 * This function shall be used before sending a request that will require awaiting for a response. 88 * 89 * An awaited property is an identificatior of a response that is to be returned for a serialized 90 * call that takes place after the notifier lock. The property shall be awaited with 91 * @ref nrf_802154_spinel_response_notifier_property_await. 92 * 93 * @param[in] property Awaited property. 94 * 95 */ 96 void nrf_802154_spinel_response_notifier_lock_before_request(spinel_prop_key_t property); 97 98 /** 99 * @brief Wait with timeout for property to be notified. 100 * 101 * @param[in] timeout Timeout in us. 102 * 103 * @returns pointer to @ref nrf_802154_spinel_notify_buff_t with notified property data 104 * or NULL in case of timeout. 105 * 106 */ 107 nrf_802154_spinel_notify_buff_t * nrf_802154_spinel_response_notifier_property_await( 108 uint32_t timeout); 109 110 /** 111 * @brief Free data bufer returned by @ref nrf_802154_spinel_response_notifier_property_await. 112 * 113 * @param[in] p_notify Data buffer to be freed 114 * 115 */ 116 void nrf_802154_spinel_response_notifier_free(nrf_802154_spinel_notify_buff_t * p_notify); 117 118 /** 119 * @brief Notify that spinel property that may be awaited was received. 120 * 121 * @param[in] property Property to be notified. 122 * @param[in] p_data Pointer to a buffer that contains data associated with @ref property. 123 * @param[in] data_len Size of the @ref p_data buffer. 124 * 125 */ 126 void nrf_802154_spinel_response_notifier_property_notify(spinel_prop_key_t property, 127 const void * p_data, 128 size_t data_len); 129 130 #ifdef __cplusplus 131 } 132 #endif 133 134 #endif /* NRF_802154_RESPONSE_NOTIFIER_H_ */ 135 136 /** @} */ 137