diff --git a/system/stack/include/smp_api_types.h b/system/stack/include/smp_api_types.h
index 47e4078fadb7e50a0fa10bd355d1f58a0e541705..12b64f35c997f3f201a36969dda375f3b020c26d 100644
--- a/system/stack/include/smp_api_types.h
+++ b/system/stack/include/smp_api_types.h
@@ -26,6 +26,7 @@
 #include "bt_target.h"  // Must be first to define build configuration
 #include "stack/include/bt_octets.h"
 #include "stack/include/btm_status.h"
+#include "stack/include/smp_status.h"
 #include "types/ble_address_with_type.h"
 #include "types/raw_address.h"
 
@@ -102,77 +103,6 @@ typedef enum : uint8_t {
   SMP_LE_ADDR_ASSOC_EVT = 15, /* Identity address association event */
 } tSMP_EVT;
 
-/* pairing failure reason code */
-typedef enum : uint8_t {
-  SMP_SUCCESS = 0,
-  SMP_PASSKEY_ENTRY_FAIL = 0x01,
-  SMP_OOB_FAIL = 0x02,
-  SMP_PAIR_AUTH_FAIL = 0x03,
-  SMP_CONFIRM_VALUE_ERR = 0x04,
-  SMP_PAIR_NOT_SUPPORT = 0x05,
-  SMP_ENC_KEY_SIZE = 0x06,
-  SMP_INVALID_CMD = 0x07,
-  SMP_PAIR_FAIL_UNKNOWN = 0x08,
-  SMP_REPEATED_ATTEMPTS = 0x09,
-  SMP_INVALID_PARAMETERS = 0x0A,
-  SMP_DHKEY_CHK_FAIL = 0x0B,
-  SMP_NUMERIC_COMPAR_FAIL = 0x0C,
-  SMP_BR_PARING_IN_PROGR = 0x0D,
-  SMP_XTRANS_DERIVE_NOT_ALLOW = 0x0E,
-  SMP_MAX_FAIL_RSN_PER_SPEC = SMP_XTRANS_DERIVE_NOT_ALLOW,
-
-  /* self defined error code */
-  SMP_PAIR_INTERNAL_ERR = (SMP_MAX_FAIL_RSN_PER_SPEC + 0x01), /* 0x0F */
-
-  /* Unknown IO capability, unable to decide association model */
-  SMP_UNKNOWN_IO_CAP = (SMP_MAX_FAIL_RSN_PER_SPEC + 0x02), /* 0x10 */
-
-  SMP_BUSY = (SMP_MAX_FAIL_RSN_PER_SPEC + 0x05),        /* 0x13 */
-  SMP_ENC_FAIL = (SMP_MAX_FAIL_RSN_PER_SPEC + 0x06),    /* 0x14 */
-  SMP_STARTED = (SMP_MAX_FAIL_RSN_PER_SPEC + 0x07),     /* 0x15 */
-  SMP_RSP_TIMEOUT = (SMP_MAX_FAIL_RSN_PER_SPEC + 0x08), /* 0x16 */
-
-  /* Unspecified failure reason */
-  SMP_FAIL = (SMP_MAX_FAIL_RSN_PER_SPEC + 0x0A), /* 0x18 */
-
-  SMP_CONN_TOUT = (SMP_MAX_FAIL_RSN_PER_SPEC + 0x0B), /* 0x19 */
-} tSMP_STATUS;
-
-#define CASE_RETURN_TEXT(code) \
-  case code:                   \
-    return #code
-
-inline std::string smp_status_text(const tSMP_STATUS& status) {
-  switch (status) {
-    CASE_RETURN_TEXT(SMP_SUCCESS);
-    CASE_RETURN_TEXT(SMP_PASSKEY_ENTRY_FAIL);
-    CASE_RETURN_TEXT(SMP_OOB_FAIL);
-    CASE_RETURN_TEXT(SMP_PAIR_AUTH_FAIL);
-    CASE_RETURN_TEXT(SMP_CONFIRM_VALUE_ERR);
-    CASE_RETURN_TEXT(SMP_PAIR_NOT_SUPPORT);
-    CASE_RETURN_TEXT(SMP_ENC_KEY_SIZE);
-    CASE_RETURN_TEXT(SMP_INVALID_CMD);
-    CASE_RETURN_TEXT(SMP_PAIR_FAIL_UNKNOWN);
-    CASE_RETURN_TEXT(SMP_REPEATED_ATTEMPTS);
-    CASE_RETURN_TEXT(SMP_INVALID_PARAMETERS);
-    CASE_RETURN_TEXT(SMP_DHKEY_CHK_FAIL);
-    CASE_RETURN_TEXT(SMP_NUMERIC_COMPAR_FAIL);
-    CASE_RETURN_TEXT(SMP_BR_PARING_IN_PROGR);
-    CASE_RETURN_TEXT(SMP_XTRANS_DERIVE_NOT_ALLOW);
-    CASE_RETURN_TEXT(SMP_PAIR_INTERNAL_ERR);
-    CASE_RETURN_TEXT(SMP_UNKNOWN_IO_CAP);
-    CASE_RETURN_TEXT(SMP_BUSY);
-    CASE_RETURN_TEXT(SMP_ENC_FAIL);
-    CASE_RETURN_TEXT(SMP_STARTED);
-    CASE_RETURN_TEXT(SMP_RSP_TIMEOUT);
-    CASE_RETURN_TEXT(SMP_FAIL);
-    CASE_RETURN_TEXT(SMP_CONN_TOUT);
-    default:
-      return base::StringPrintf("UNKNOWN[%hhu]", status);
-  }
-}
-#undef CASE_RETURN_TEXT
-
 /* Device IO capability */
 #define SMP_IO_CAP_IO BTM_IO_CAP_IO         /* DisplayYesNo */
 #define SMP_IO_CAP_KBDISP BTM_IO_CAP_KBDISP /* Keyboard Display */
diff --git a/system/stack/include/smp_status.h b/system/stack/include/smp_status.h
new file mode 100644
index 0000000000000000000000000000000000000000..10c6e59483f3d7ca1e5f396e6c7fc6075cb5bfc0
--- /dev/null
+++ b/system/stack/include/smp_status.h
@@ -0,0 +1,96 @@
+/******************************************************************************
+ *
+ *  Copyright 1999-2012 Broadcom Corporation
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at:
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ ******************************************************************************/
+
+#pragma once
+
+#include <base/strings/stringprintf.h>
+
+#include <cstdint>
+
+/* pairing failure reason code */
+typedef enum : uint8_t {
+  SMP_SUCCESS = 0,
+  SMP_PASSKEY_ENTRY_FAIL = 0x01,
+  SMP_OOB_FAIL = 0x02,
+  SMP_PAIR_AUTH_FAIL = 0x03,
+  SMP_CONFIRM_VALUE_ERR = 0x04,
+  SMP_PAIR_NOT_SUPPORT = 0x05,
+  SMP_ENC_KEY_SIZE = 0x06,
+  SMP_INVALID_CMD = 0x07,
+  SMP_PAIR_FAIL_UNKNOWN = 0x08,
+  SMP_REPEATED_ATTEMPTS = 0x09,
+  SMP_INVALID_PARAMETERS = 0x0A,
+  SMP_DHKEY_CHK_FAIL = 0x0B,
+  SMP_NUMERIC_COMPAR_FAIL = 0x0C,
+  SMP_BR_PARING_IN_PROGR = 0x0D,
+  SMP_XTRANS_DERIVE_NOT_ALLOW = 0x0E,
+  SMP_MAX_FAIL_RSN_PER_SPEC = SMP_XTRANS_DERIVE_NOT_ALLOW,
+
+  /* self defined error code */
+  SMP_PAIR_INTERNAL_ERR = (SMP_MAX_FAIL_RSN_PER_SPEC + 0x01), /* 0x0F */
+
+  /* Unknown IO capability, unable to decide association model */
+  SMP_UNKNOWN_IO_CAP = (SMP_MAX_FAIL_RSN_PER_SPEC + 0x02), /* 0x10 */
+
+  SMP_BUSY = (SMP_MAX_FAIL_RSN_PER_SPEC + 0x05),        /* 0x13 */
+  SMP_ENC_FAIL = (SMP_MAX_FAIL_RSN_PER_SPEC + 0x06),    /* 0x14 */
+  SMP_STARTED = (SMP_MAX_FAIL_RSN_PER_SPEC + 0x07),     /* 0x15 */
+  SMP_RSP_TIMEOUT = (SMP_MAX_FAIL_RSN_PER_SPEC + 0x08), /* 0x16 */
+
+  /* Unspecified failure reason */
+  SMP_FAIL = (SMP_MAX_FAIL_RSN_PER_SPEC + 0x0A), /* 0x18 */
+
+  SMP_CONN_TOUT = (SMP_MAX_FAIL_RSN_PER_SPEC + 0x0B), /* 0x19 */
+} tSMP_STATUS;
+
+#ifndef CASE_RETURN_TEXT
+#define CASE_RETURN_TEXT(code) \
+  case code:                   \
+    return #code
+#endif
+
+inline std::string smp_status_text(const tSMP_STATUS& status) {
+  switch (status) {
+    CASE_RETURN_TEXT(SMP_SUCCESS);
+    CASE_RETURN_TEXT(SMP_PASSKEY_ENTRY_FAIL);
+    CASE_RETURN_TEXT(SMP_OOB_FAIL);
+    CASE_RETURN_TEXT(SMP_PAIR_AUTH_FAIL);
+    CASE_RETURN_TEXT(SMP_CONFIRM_VALUE_ERR);
+    CASE_RETURN_TEXT(SMP_PAIR_NOT_SUPPORT);
+    CASE_RETURN_TEXT(SMP_ENC_KEY_SIZE);
+    CASE_RETURN_TEXT(SMP_INVALID_CMD);
+    CASE_RETURN_TEXT(SMP_PAIR_FAIL_UNKNOWN);
+    CASE_RETURN_TEXT(SMP_REPEATED_ATTEMPTS);
+    CASE_RETURN_TEXT(SMP_INVALID_PARAMETERS);
+    CASE_RETURN_TEXT(SMP_DHKEY_CHK_FAIL);
+    CASE_RETURN_TEXT(SMP_NUMERIC_COMPAR_FAIL);
+    CASE_RETURN_TEXT(SMP_BR_PARING_IN_PROGR);
+    CASE_RETURN_TEXT(SMP_XTRANS_DERIVE_NOT_ALLOW);
+    CASE_RETURN_TEXT(SMP_PAIR_INTERNAL_ERR);
+    CASE_RETURN_TEXT(SMP_UNKNOWN_IO_CAP);
+    CASE_RETURN_TEXT(SMP_BUSY);
+    CASE_RETURN_TEXT(SMP_ENC_FAIL);
+    CASE_RETURN_TEXT(SMP_STARTED);
+    CASE_RETURN_TEXT(SMP_RSP_TIMEOUT);
+    CASE_RETURN_TEXT(SMP_FAIL);
+    CASE_RETURN_TEXT(SMP_CONN_TOUT);
+    default:
+      return base::StringPrintf("UNKNOWN[%hhu]", status);
+  }
+}
+#undef CASE_RETURN_TEXT
diff --git a/system/stack/test/stack_smp_test.cc b/system/stack/test/stack_smp_test.cc
index bf44284234609537c6adb8596a4885491a1c3ec1..edd82321b28df65e5c66a83a8b3e9a35ca8073b2 100644
--- a/system/stack/test/stack_smp_test.cc
+++ b/system/stack/test/stack_smp_test.cc
@@ -28,6 +28,7 @@
 #include "stack/include/acl_api.h"
 #include "stack/include/bt_octets.h"
 #include "stack/include/smp_api.h"
+#include "stack/include/smp_status.h"
 #include "stack/smp/p_256_ecc_pp.h"
 #include "stack/smp/smp_int.h"
 #include "test/common/mock_functions.h"
@@ -35,6 +36,8 @@
 #include "types/hci_role.h"
 #include "types/raw_address.h"
 
+using testing::StrEq;
+
 tBTM_CB btm_cb;
 
 const std::string kSmpOptions("mock smp options");
@@ -140,8 +143,6 @@ Octet16 smp_gen_p2_4_confirm(tSMP_CB* p_cb, const RawAddress& remote_bda);
 tSMP_STATUS smp_calculate_comfirm(tSMP_CB* p_cb, const Octet16& rand,
                                   Octet16* output);
 
-namespace testing {
-
 void dump_uint128(const Octet16& a, char* buffer) {
   for (unsigned int i = 0; i < OCTET16_LEN; ++i) {
     snprintf(buffer, 3, "%02x", a[i]);
@@ -174,7 +175,7 @@ Octet16 parse_uint128(const char* input) {
   return output;
 }
 
-class SmpCalculateConfirmTest : public Test {
+class SmpCalculateConfirmTest : public testing::Test {
  protected:
   tSMP_CB p_cb_;
   // Set random to 0x5783D52156AD6F0E6388274EC6702EE0
@@ -401,4 +402,43 @@ TEST(SmpEccValidationTest, test_invalid_points) {
 
   EXPECT_FALSE(ECC_ValidatePoint(p));
 }
-}  // namespace testing
+
+TEST(SmpStatusText, smp_status_text) {
+  std::vector<std::pair<tSMP_STATUS, std::string>> status = {
+      std::make_pair(SMP_SUCCESS, "SMP_SUCCESS"),
+      std::make_pair(SMP_PASSKEY_ENTRY_FAIL, "SMP_PASSKEY_ENTRY_FAIL"),
+      std::make_pair(SMP_OOB_FAIL, "SMP_OOB_FAIL"),
+      std::make_pair(SMP_PAIR_AUTH_FAIL, "SMP_PAIR_AUTH_FAIL"),
+      std::make_pair(SMP_CONFIRM_VALUE_ERR, "SMP_CONFIRM_VALUE_ERR"),
+      std::make_pair(SMP_PAIR_NOT_SUPPORT, "SMP_PAIR_NOT_SUPPORT"),
+      std::make_pair(SMP_ENC_KEY_SIZE, "SMP_ENC_KEY_SIZE"),
+      std::make_pair(SMP_INVALID_CMD, "SMP_INVALID_CMD"),
+      std::make_pair(SMP_PAIR_FAIL_UNKNOWN, "SMP_PAIR_FAIL_UNKNOWN"),
+      std::make_pair(SMP_REPEATED_ATTEMPTS, "SMP_REPEATED_ATTEMPTS"),
+      std::make_pair(SMP_INVALID_PARAMETERS, "SMP_INVALID_PARAMETERS"),
+      std::make_pair(SMP_DHKEY_CHK_FAIL, "SMP_DHKEY_CHK_FAIL"),
+      std::make_pair(SMP_NUMERIC_COMPAR_FAIL, "SMP_NUMERIC_COMPAR_FAIL"),
+      std::make_pair(SMP_BR_PARING_IN_PROGR, "SMP_BR_PARING_IN_PROGR"),
+      std::make_pair(SMP_XTRANS_DERIVE_NOT_ALLOW,
+                     "SMP_XTRANS_DERIVE_NOT_ALLOW"),
+      std::make_pair(SMP_MAX_FAIL_RSN_PER_SPEC,
+                     "SMP_XTRANS_DERIVE_NOT_ALLOW"),  // NOTE: Dup
+      std::make_pair(SMP_PAIR_INTERNAL_ERR, "SMP_PAIR_INTERNAL_ERR"),
+      std::make_pair(SMP_UNKNOWN_IO_CAP, "SMP_UNKNOWN_IO_CAP"),
+      std::make_pair(SMP_BUSY, "SMP_BUSY"),
+      std::make_pair(SMP_ENC_FAIL, "SMP_ENC_FAIL"),
+      std::make_pair(SMP_STARTED, "SMP_STARTED"),
+      std::make_pair(SMP_RSP_TIMEOUT, "SMP_RSP_TIMEOUT"),
+      std::make_pair(SMP_FAIL, "SMP_FAIL"),
+      std::make_pair(SMP_CONN_TOUT, "SMP_CONN_TOUT"),
+  };
+  for (const auto& stat : status) {
+    ASSERT_STREQ(stat.second.c_str(), smp_status_text(stat.first).c_str());
+  }
+  auto unknown =
+      base::StringPrintf("UNKNOWN[%hhu]", std::numeric_limits<uint8_t>::max());
+  ASSERT_STREQ(unknown.c_str(),
+               smp_status_text(static_cast<tSMP_STATUS>(
+                                   std::numeric_limits<uint8_t>::max()))
+                   .c_str());
+}