aboutsummaryrefslogtreecommitdiffstats
path: root/src/vfs/ant_native_chardev.c
diff options
context:
space:
mode:
authorSatish kumar sugasi <ssugas@codeaurora.org>2017-12-06 00:13:50 -0800
committerSatish kumar sugasi <ssugas@codeaurora.org>2017-12-06 00:13:50 -0800
commit1976d0714285850d8e0fc957b20eb4777fe49907 (patch)
tree05462ccffa1a77d79c5fb06e16f0be31daaf0828 /src/vfs/ant_native_chardev.c
parent1db5b42bde348c4db12d0d835ed7722b791fc9c6 (diff)
parent84a310bf2221c04e5d24586a7a46a6d8d4a69848 (diff)
downloadandroid_external_ant-wireless_ant_native-1976d0714285850d8e0fc957b20eb4777fe49907.tar.gz
android_external_ant-wireless_ant_native-1976d0714285850d8e0fc957b20eb4777fe49907.tar.bz2
android_external_ant-wireless_ant_native-1976d0714285850d8e0fc957b20eb4777fe49907.zip
Merge remote-tracking branch 'remotes/quic/caf/github/master' into tip
Change-Id: I4d36f95e54ba096275188b273eb95c9ee71752c7
Diffstat (limited to 'src/vfs/ant_native_chardev.c')
-rw-r--r--src/vfs/ant_native_chardev.c148
1 files changed, 102 insertions, 46 deletions
diff --git a/src/vfs/ant_native_chardev.c b/src/vfs/ant_native_chardev.c
index 759b385..2605776 100644
--- a/src/vfs/ant_native_chardev.c
+++ b/src/vfs/ant_native_chardev.c
@@ -34,6 +34,7 @@
#include <stdint.h> /* for uint64_t */
#include <sys/eventfd.h> /* For eventfd() */
#include <unistd.h> /* for read(), write(), and close() */
+#include <string.h>
#include "ant_types.h"
#include "ant_native.h"
@@ -44,6 +45,10 @@
#include "ant_hci_defines.h"
#include "ant_log.h"
+#if (ANT_HCI_CHANNEL_SIZE > 0) || !defined(ANT_DEVICE_NAME)
+#define MULTIPATH_TX
+#endif
+
#if ANT_HCI_SIZE_SIZE > 1
#include "ant_utils.h" // Put HCI Size value across multiple bytes
#endif
@@ -170,16 +175,20 @@ ANTStatus ant_deinit(void)
// Psuedocode:
/*
LOCK enable_LOCK
- State callback: STATE = ENABLING
- ant enable
- IF ant_enable success
- State callback: STATE = ENABLED
- RESULT = SUCCESS
- ELSE
- ant disable
- State callback: STATE = Current state
- RESULT = FAILURE
- ENDIF
+ IF current_state != ENABLED
+ State callback: STATE = ENABLING
+ ant enable
+ IF ant_enable success
+ State callback: STATE = ENABLED
+ RESULT = SUCCESS
+ ELSE
+ ant disable
+ State callback: STATE = Current state
+ RESULT = FAILURE
+ ENDIF
+ ELSE
+ RESULT = SUCCESS
+ ENDIF
UNLOCK
*/
////////////////////////////////////////////////////////////////////
@@ -197,23 +206,28 @@ ANTStatus ant_enable_radio(void)
}
ANT_DEBUG_V("got stEnabledStatusLock in %s", __FUNCTION__);
- if (g_fnStateCallback) {
- g_fnStateCallback(RADIO_STATUS_ENABLING);
- }
+ if (ant_radio_enabled_status() != RADIO_STATUS_ENABLED) {
+ if (g_fnStateCallback) {
+ g_fnStateCallback(RADIO_STATUS_ENABLING);
+ }
- if (ant_enable() < 0) {
- ANT_ERROR("ant enable failed: %s", strerror(errno));
+ if (ant_enable() < 0) {
+ ANT_ERROR("ant enable failed: %s", strerror(errno));
- ant_disable();
+ ant_disable();
- if (g_fnStateCallback) {
- g_fnStateCallback(ant_radio_enabled_status());
+ if (g_fnStateCallback) {
+ g_fnStateCallback(ant_radio_enabled_status());
+ }
+ } else {
+ if (g_fnStateCallback) {
+ g_fnStateCallback(RADIO_STATUS_ENABLED);
+ }
+
+ result_status = ANT_STATUS_SUCCESS;
}
} else {
- if (g_fnStateCallback) {
- g_fnStateCallback(RADIO_STATUS_ENABLED);
- }
-
+ ANT_DEBUG_D("Ignoring redundant enable call.");
result_status = ANT_STATUS_SUCCESS;
}
@@ -336,10 +350,12 @@ out:
// Psuedocode:
/*
LOCK enable_LOCK
- State callback: STATE = DISABLING
- ant disable
- State callback: STATE = Current state
- RESULT = SUCCESS
+ IF current_state != DISABLED
+ State callback: STATE = DISABLING
+ ant disable
+ State callback: STATE = Current state
+ ENDIF
+ RESULT = SUCCESS
UNLOCK
*/
////////////////////////////////////////////////////////////////////
@@ -357,14 +373,18 @@ ANTStatus ant_disable_radio(void)
}
ANT_DEBUG_V("got stEnabledStatusLock in %s", __FUNCTION__);
- if (g_fnStateCallback) {
- g_fnStateCallback(RADIO_STATUS_DISABLING);
- }
+ if (ant_radio_enabled_status() != RADIO_STATUS_DISABLED) {
+ if (g_fnStateCallback) {
+ g_fnStateCallback(RADIO_STATUS_DISABLING);
+ }
- ant_disable();
+ ant_disable();
- if (g_fnStateCallback) {
- g_fnStateCallback(ant_radio_enabled_status());
+ if (g_fnStateCallback) {
+ g_fnStateCallback(ant_radio_enabled_status());
+ }
+ } else {
+ ANT_DEBUG_D("Ignoring redundant disable call.");
}
ret = ANT_STATUS_SUCCESS;
@@ -723,6 +743,11 @@ ENDIF
////////////////////////////////////////////////////////////////////
ANTStatus ant_tx_message(ANT_U8 ucLen, ANT_U8 *pucMesg)
{
+#if defined(MULTIPATH_TX)
+ ANT_BOOL bIsData;
+#endif
+ ant_channel_type eTxChannel;
+ ant_channel_type eFlowChannel;
ANTStatus status = ANT_STATUS_FAILED;
// TODO ANT_HCI_MAX_MSG_SIZE is transport (driver) dependent.
ANT_U8 txBuffer[ANT_HCI_MAX_MSG_SIZE];
@@ -736,12 +761,37 @@ ANTStatus ant_tx_message(ANT_U8 ucLen, ANT_U8 *pucMesg)
goto out;
}
+#if defined(MULTIPATH_TX)
+switch (pucMesg[ANT_MSG_ID_OFFSET]) {
+ case MESG_BROADCAST_DATA_ID:
+ case MESG_ACKNOWLEDGED_DATA_ID:
+ case MESG_BURST_DATA_ID:
+ case MESG_EXT_BROADCAST_DATA_ID:
+ case MESG_EXT_ACKNOWLEDGED_DATA_ID:
+ case MESG_EXT_BURST_DATA_ID:
+ case MESG_ADV_BURST_DATA_ID:
+ bIsData = ANT_TRUE;
+ break;
+ default:
+ bIsData = ANT_FALSE;
+ break;
+ }
+
+ ANT_DEBUG_V("tx message: bIsData=%d", bIsData);
+#endif
+
#if ANT_HCI_OPCODE_SIZE == 1
txBuffer[ANT_HCI_OPCODE_OFFSET] = ANT_HCI_OPCODE_TX;
#elif ANT_HCI_OPCODE_SIZE > 1
#error "Specified ANT_HCI_OPCODE_SIZE not currently supported"
#endif
+#if ANT_HCI_CHANNEL_SIZE == 1
+ txBuffer[ANT_HCI_CHANNEL_OFFSET] = bIsData ? ANT_HCI_DATA_CHANNEL : ANT_HCI_COMMAND_CHANNEL;
+#elif ANT_HCI_OPCODE_SIZE > 1
+#error "Specified ANT_HCI_CHANNEL_SIZE not currently supported"
+#endif
+
#if ANT_HCI_SIZE_SIZE == 1
txBuffer[ANT_HCI_SIZE_OFFSET] = ucLen;
#elif ANT_HCI_SIZE_SIZE == 2
@@ -754,21 +804,24 @@ ANTStatus ant_tx_message(ANT_U8 ucLen, ANT_U8 *pucMesg)
ANT_SERIAL(txBuffer, txMessageLength, 'T');
-#ifdef ANT_DEVICE_NAME // Single transport path
- status = ant_tx_message_flowcontrol_wait(SINGLE_CHANNEL, SINGLE_CHANNEL, txMessageLength, txBuffer);
+#ifdef ANT_DEVICE_NAME
+ eTxChannel = SINGLE_CHANNEL;
+ eFlowChannel = SINGLE_CHANNEL;
+#else
+ eTxChannel = bIsData ? DATA_CHANNEL : COMMAND_CHANNEL;
+ eFlowChannel = COMMAND_CHANNEL;
+#endif
+
+#if !defined(MULTIPATH_TX) // Single transport path
+ status = ant_tx_message_flowcontrol_wait(eTxChannel, eFlowChannel, txMessageLength, txBuffer);
#else // Separate data/command paths
- switch (txBuffer[ANT_HCI_DATA_OFFSET + ANT_MSG_ID_OFFSET]) {
- case MESG_BROADCAST_DATA_ID:
- case MESG_ACKNOWLEDGED_DATA_ID:
- case MESG_BURST_DATA_ID:
- case MESG_EXT_BROADCAST_DATA_ID:
- case MESG_EXT_ACKNOWLEDGED_DATA_ID:
- case MESG_EXT_BURST_DATA_ID:
- case MESG_ADV_BURST_DATA_ID:
- status = ant_tx_message_flowcontrol_wait(DATA_CHANNEL, COMMAND_CHANNEL, txMessageLength, txBuffer);
- break;
- default:
- status = ant_tx_message_flowcontrol_none(COMMAND_CHANNEL, txMessageLength, txBuffer);
+ if (bIsData)
+ {
+ status = ant_tx_message_flowcontrol_wait(eTxChannel, eFlowChannel, txMessageLength, txBuffer);
+ }
+ else
+ {
+ status = ant_tx_message_flowcontrol_none(eTxChannel, txMessageLength, txBuffer);
}
#endif // Separate data/command paths
@@ -897,6 +950,9 @@ int ant_enable(void)
iRet = 0;
out:
+ if (stRxThreadInfo.stRxThread == 0) {
+ stRxThreadInfo.ucRunThread = 0;
+ }
ANT_FUNC_END();
return iRet;
}