1313* See the License for the specific language governing permissions and
1414* limitations under the License.
1515*/
16+ #include " mbed_power_mgmt.h"
1617#include " common_functions.h"
1718#include " platform/arm_hal_interrupt.h"
1819#include " platform/arm_hal_phy.h"
@@ -87,8 +88,9 @@ static uint8_t MAC64_addr[8];
8788
8889static xcvrState_t mPhySeqState ;
8990static uint8_t rf_mac_handle;
90- volatile uint8_t rf_ed_value = 0 ;
91- static bool rf_ack_pending_state = false ;
91+ static volatile uint8_t rf_ed_value = 0 ;
92+ static volatile bool rf_ack_pending_state = false ;
93+ static volatile bool sleep_blocked = false ;
9294
9395static NanostackRfPhyKw41z *rf = NULL ;
9496
@@ -155,6 +157,11 @@ static int8_t rf_device_register(void)
155157static void rf_device_unregister (void )
156158{
157159 arm_net_phy_unregister (rf_radio_driver_id);
160+
161+ if (sleep_blocked) {
162+ sleep_manager_unlock_deep_sleep ();
163+ sleep_blocked = false ;
164+ }
158165}
159166
160167/*
@@ -209,23 +216,41 @@ static int8_t rf_interface_state_control(phy_interface_state_e new_state, uint8_
209216 /* Reset PHY driver and set to idle*/
210217 case PHY_INTERFACE_RESET:
211218 rf_abort ();
219+ if (sleep_blocked) {
220+ sleep_manager_unlock_deep_sleep ();
221+ sleep_blocked = false ;
222+ }
212223 break ;
213224 /* Disable PHY Interface driver*/
214225 case PHY_INTERFACE_DOWN:
215226 rf_abort ();
227+ if (sleep_blocked) {
228+ sleep_manager_unlock_deep_sleep ();
229+ sleep_blocked = false ;
230+ }
216231 break ;
217232 /* Enable PHY Interface driver*/
218233 case PHY_INTERFACE_UP:
219234 if (PhyPlmeSetCurrentChannelRequest (rf_channel, 0 )) {
220235 return 1 ;
221236 }
237+ if (!sleep_blocked) {
238+ /* Disable enter to deep sleep when transfer active */
239+ sleep_manager_lock_deep_sleep ();
240+ sleep_blocked = true ;
241+ }
222242 rf_receive ();
223243 break ;
224244 /* Enable wireless interface ED scan mode*/
225245 case PHY_INTERFACE_RX_ENERGY_STATE:
226246 if (PhyPlmeSetCurrentChannelRequest (rf_channel, 0 )) {
227247 return 1 ;
228248 }
249+ if (!sleep_blocked) {
250+ /* Disable enter to deep sleep when transfer active */
251+ sleep_manager_lock_deep_sleep ();
252+ sleep_blocked = true ;
253+ }
229254 rf_abort ();
230255 rf_mac_ed_state_enable ();
231256 break ;
@@ -234,6 +259,11 @@ static int8_t rf_interface_state_control(phy_interface_state_e new_state, uint8_
234259 if (PhyPlmeSetCurrentChannelRequest (rf_channel, 0 )) {
235260 return 1 ;
236261 }
262+ if (!sleep_blocked) {
263+ /* Disable enter to deep sleep when transfer active */
264+ sleep_manager_lock_deep_sleep ();
265+ sleep_blocked = true ;
266+ }
237267 rf_receive ();
238268 break ;
239269 }
0 commit comments