Android_System_ANT-HAL_1-6-1
diff --git a/src/bluez_hci/ant_native_hci.c b/src/bluez_hci/ant_native_hci.c
index c2c453f..55cde44 100644
--- a/src/bluez_hci/ant_native_hci.c
+++ b/src/bluez_hci/ant_native_hci.c
@@ -798,6 +798,7 @@
                      {
                         if(currentTime < endTime)
                         {
+                           nanosleep((struct timespec[]){{0, 50000000}}, NULL);
                            ANT_DEBUG_V("Retrying. Current time = %d. "
                               "End time = %d", (int)currentTime, (int)endTime);
                         
diff --git a/src/common/inc/ant_version.h b/src/common/inc/ant_version.h
index a682134..0b8988b 100644
--- a/src/common/inc/ant_version.h
+++ b/src/common/inc/ant_version.h
@@ -21,7 +21,7 @@
 

 #define LIBANT_STACK_MAJOR "1"

 #define LIBANT_STACK_MINOR "6"

-#define LIBANT_STACK_INCRE "0"

+#define LIBANT_STACK_INCRE "1"

 

 #endif // __ANT_VERSION_H

 

diff --git a/src/vfs/ant_rx_chardev.c b/src/vfs/ant_rx_chardev.c
index 2f0cc33..b38757f 100644
--- a/src/vfs/ant_rx_chardev.c
+++ b/src/vfs/ant_rx_chardev.c
@@ -53,9 +53,33 @@
 	static int iRxBufferLength[NUM_ANT_CHANNELS] = {0, 0};
 #endif // 
 
+// Defines for use with the poll() call
+#define EVENT_DATA_AVAILABLE (POLLIN|POLLRDNORM)
+#define EVENT_DISABLE (POLLHUP)
+#define EVENT_HARD_RESET (POLLERR|POLLPRI|POLLRDHUP)
+
+#define EVENTS_TO_LISTEN_FOR (EVENT_DATA_AVAILABLE|EVENT_DISABLE|EVENT_HARD_RESET)
+
 int readChannelMsg(ant_channel_type eChannel, ant_channel_info_t *pstChnlInfo);
 
 /*
+ * Function to check that all given flags are set in a particular value.
+ * Designed for use with the revents field of pollfds filled out by poll().
+ *
+ * Parameters:
+ *    - value: The value that will be checked to contain all flags.
+ *    - flags: Bitwise-or of the flags that value should be checked for.
+ *
+ * Returns:
+ *    - true IFF all the bits that are set in 'flags' are also set in 'value'
+ */
+ANT_BOOL areAllFlagsSet(short value, short flags)
+{
+   value &= flags;
+   return (value == flags);
+}
+
+/*
  * This thread waits for ANT messages from a VFS file.
  */
 void *fnRxThread(void *ant_rx_thread_info)
@@ -70,7 +94,7 @@
    stRxThreadInfo = (ant_rx_thread_info_t *)ant_rx_thread_info;
    for (eChannel = 0; eChannel < NUM_ANT_CHANNELS; eChannel++) {
       astPollFd[eChannel].fd = stRxThreadInfo->astChannels[eChannel].iFd;
-      astPollFd[eChannel].events = POLLIN | POLLRDNORM;
+      astPollFd[eChannel].events = EVENTS_TO_LISTEN_FOR;
    }
 
    /* continue running as long as not terminated */
@@ -83,7 +107,7 @@
          ANT_ERROR("read thread exiting, unhandled error: %s", strerror(errno));
       } else {
          for (eChannel = 0; eChannel < NUM_ANT_CHANNELS; eChannel++) {
-            if (astPollFd[eChannel].revents & (POLLERR | POLLPRI | POLLRDHUP)) {
+            if (areAllFlagsSet(astPollFd[eChannel].revents, EVENT_HARD_RESET)) {
                ANT_ERROR("poll error from %s. exiting rx thread",
                             stRxThreadInfo->astChannels[eChannel].pcDevicePath);
                /* Chip was reset or other error, only way to recover is to
@@ -95,12 +119,21 @@
                }
 
                goto reset;
-            } else if (astPollFd[eChannel].revents & (POLLIN | POLLRDNORM)) {
+            } else if (areAllFlagsSet(astPollFd[eChannel].revents, EVENT_DISABLE)) {
+               /* chip reported it was disabled, either unexpectedly or due to us closing the file */
+               ANT_DEBUG_D(
+                     "poll hang-up from %s. exiting rx thread", stRxThreadInfo->astChannels[eChannel].pcDevicePath);
+
+               // set flag to exit out of Rx Loop
+               stRxThreadInfo->ucRunThread = 0;
+
+            } else if (areAllFlagsSet(astPollFd[eChannel].revents, EVENT_DATA_AVAILABLE)) {
                ANT_DEBUG_D("data on %s. reading it",
                             stRxThreadInfo->astChannels[eChannel].pcDevicePath);
 
                if (readChannelMsg(eChannel, &stRxThreadInfo->astChannels[eChannel]) < 0) {
-                  goto out;
+                  // set flag to exit out of Rx Loop
+                  stRxThreadInfo->ucRunThread = 0;
                }
             } else if (astPollFd[eChannel].revents) {
                ANT_DEBUG_W("unhandled poll result %#x from %s",
@@ -111,19 +144,18 @@
       }
    }
 
-out:
-   stRxThreadInfo->ucRunThread = 0;
-
-   /* Try to get stEnabledStatusLock.
-    * if you get it then noone is enabling or disabling
-    * if you can't get it assume something made you exit */
+   /* disable ANT radio if not already disabling */
+   // Try to get stEnabledStatusLock.
+   // if you get it then no one is enabling or disabling
+   // if you can't get it assume something made you exit
    ANT_DEBUG_V("try getting stEnabledStatusLock in %s", __FUNCTION__);
    iMutexLockResult = pthread_mutex_trylock(stRxThreadInfo->pstEnabledStatusLock);
    if (!iMutexLockResult) {
       ANT_DEBUG_V("got stEnabledStatusLock in %s", __FUNCTION__);
       ANT_WARN("rx thread has unexpectedly crashed, cleaning up");
-      stRxThreadInfo->stRxThread = 0; /* spoof our handle as closed so we don't
-                                       * try to join ourselves in disable */
+
+      // spoof our handle as closed so we don't try to join ourselves in disable
+      stRxThreadInfo->stRxThread = 0;
 
       if (g_fnStateCallback) {
          g_fnStateCallback(RADIO_STATUS_DISABLING);