1 /* 2 * Copyright (c) 2017, 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 #ifndef NRF_802154_CRITICAL_SECTION_H__ 36 #define NRF_802154_CRITICAL_SECTION_H__ 37 38 #include <stdbool.h> 39 #include <stdint.h> 40 41 #ifdef __cplusplus 42 extern "C" { 43 #endif 44 45 /** 46 * @defgroup nrf_802154_critical_section 802.15.4 driver critical section 47 * @{ 48 * @ingroup nrf_802154 49 * @brief Critical section used with requests to the 802.15.4 driver. 50 */ 51 52 /** 53 * @brief Initializes the critical section module. 54 */ 55 void nrf_802154_critical_section_init(void); 56 57 /** 58 * @brief Function for entering a critical section in the 802.15.4 driver. 59 * 60 * @retval true The critical section is entered. 61 * @retval false The critical section could not be entered. 62 */ 63 bool nrf_802154_critical_section_enter(void); 64 65 /** 66 * @brief Function for exiting a critical section in the 802.15.4 driver. 67 */ 68 void nrf_802154_critical_section_exit(void); 69 70 /** 71 * @brief Function for forcefully entering a critical section in the 802.15.4 driver. 72 * 73 * With this function, the critical section is entered regardless of whether 74 * it has been already entered before. 75 * 76 * This function is intended to be used by RADIO IRQ handler and RSCH notifications handlers to 77 * prevent interrupting of these procedures by FSM requests from higher priority IRQ handlers. 78 */ 79 void nrf_802154_critical_section_forcefully_enter(void); 80 81 /** 82 * @brief Allows entry to a nested critical section. 83 * 84 * This function is intended to be used with the notification module to allow processing 85 * requests called from the notification context. 86 */ 87 void nrf_802154_critical_section_nesting_allow(void); 88 89 /** 90 * @brief Denies entry to a nested critical section. 91 */ 92 void nrf_802154_critical_section_nesting_deny(void); 93 94 /** 95 * @brief Checks if the critical section is nested. 96 * 97 * @retval true Critical section is nested. 98 * @retval false Critical section is not nested. 99 */ 100 bool nrf_802154_critical_section_is_nested(void); 101 102 /** 103 * @brief Gets the current IRQ priority. 104 * 105 * @returns IRQ priority 106 */ 107 uint32_t nrf_802154_critical_section_active_vector_priority_get(void); 108 109 /** 110 * @brief Checks if there is a pending event in the RSCH critical section. 111 */ 112 extern bool nrf_802154_critical_section_rsch_event_is_pending(void); 113 114 /** 115 * @brief Process a pending RSCH event. 116 * 117 * This function must be called from inside of the critical section. 118 */ 119 extern void nrf_802154_critical_section_rsch_process_pending(void); 120 121 /** 122 *@} 123 **/ 124 125 #ifdef __cplusplus 126 } 127 #endif 128 129 #endif // NRF_802154_CRITICAL_SECTION_H__ 130