diff --git a/drivers/wireless/ieee802154/xbee/xbee.c b/drivers/wireless/ieee802154/xbee/xbee.c index 6bbd4bb1618..e38812b2077 100644 --- a/drivers/wireless/ieee802154/xbee/xbee.c +++ b/drivers/wireless/ieee802154/xbee/xbee.c @@ -637,6 +637,7 @@ static void xbee_process_apiframes(FAR struct xbee_priv_s *priv, frame->io_data[frame->io_offset] != 0x13) { wd_cancel(priv->assocwd); + priv->associating = false; primitive = ieee802154_primitive_allocate(); primitive->type = IEEE802154_PRIMITIVE_CONF_ASSOC; @@ -724,6 +725,7 @@ static void xbee_process_apiframes(FAR struct xbee_priv_s *priv, if ((priv->querycmd[0] == *command) && (priv->querycmd[1] == *(command + 1))) { + wd_cancel(priv->atquery_wd); priv->querydone = true; nxsem_post(&priv->atresp_sem); } diff --git a/drivers/wireless/ieee802154/xbee/xbee.h b/drivers/wireless/ieee802154/xbee/xbee.h index 0c584f6b8dd..03545dbe315 100644 --- a/drivers/wireless/ieee802154/xbee/xbee.h +++ b/drivers/wireless/ieee802154/xbee/xbee.h @@ -167,6 +167,7 @@ struct xbee_priv_s * callback to registered receivers */ WDOG_ID assocwd; /* Association watchdog */ struct work_s assocwork; /* For polling for association status */ + bool associating; /* Are we currently associating */ sem_t atquery_sem; /* Only allow one AT query at a time */ sem_t atresp_sem; /* For signaling pending AT response received */ char querycmd[2]; /* Stores the pending AT Query command */ diff --git a/drivers/wireless/ieee802154/xbee/xbee_mac.c b/drivers/wireless/ieee802154/xbee/xbee_mac.c index c423a1968f7..00b58396150 100644 --- a/drivers/wireless/ieee802154/xbee/xbee_mac.c +++ b/drivers/wireless/ieee802154/xbee/xbee_mac.c @@ -146,9 +146,12 @@ static void xbee_assocworker(FAR void *arg) { FAR struct xbee_priv_s *priv = (FAR struct xbee_priv_s *)arg; - xbee_send_atquery(priv, "AI"); + if (priv->associating) + { + xbee_send_atquery(priv, "AI"); - (void)wd_start(priv->assocwd, XBEE_ASSOC_POLLDELAY, xbee_assoctimer, 1, (wdparm_t)arg); + (void)wd_start(priv->assocwd, XBEE_ASSOC_POLLDELAY, xbee_assoctimer, 1, (wdparm_t)arg); + } } /**************************************************************************** @@ -660,6 +663,8 @@ int xbee_req_associate(XBEEHANDLE xbee, FAR struct ieee802154_assoc_req_s *req) xbee_set_epassocflags(priv, XBEE_EPASSOCFLAGS_AUTOASSOC); + priv->associating = true; + /* In order to track the association status, we must poll the device for * an update. */