diff --git a/system/stack/eatt/eatt.h b/system/stack/eatt/eatt.h
index 828d17ac0e3a0b655c8b8a5b28472cdbcc7c73a0..f6e735d554d6b091874d92c24fb9beb2baac2535 100644
--- a/system/stack/eatt/eatt.h
+++ b/system/stack/eatt/eatt.h
@@ -17,6 +17,7 @@
 
 #pragma once
 
+#include <algorithm>
 #include <queue>
 
 #include "stack/gatt/gatt_int.h"
@@ -25,6 +26,7 @@
 #define EATT_MIN_MTU_MPS (64)
 #define EATT_DEFAULT_MTU (256)
 #define EATT_ALL_CIDS (0xFFFF)
+#define EATT_MAX_TX_MTU  (1024)
 
 namespace bluetooth {
 namespace eatt {
@@ -59,12 +61,13 @@ class EattChannel {
   EattChannel(RawAddress& bda, uint16_t cid, uint16_t tx_mtu, uint16_t rx_mtu)
       : bda_(bda),
         cid_(cid),
-        tx_mtu_(tx_mtu),
         rx_mtu_(rx_mtu),
         state_(EattChannelState::EATT_CHANNEL_PENDING),
         indicate_handle_(0),
         ind_ack_timer_(NULL),
-        ind_confirmation_timer_(NULL) {}
+        ind_confirmation_timer_(NULL) {
+    EattChannelSetTxMTU(tx_mtu);
+  }
 
   ~EattChannel() {
     if (ind_ack_timer_ != NULL) {
@@ -93,7 +96,10 @@ class EattChannel {
     }
     state_ = state;
   }
-  void EattChannelSetTxMTU(uint16_t tx_mtu) { this->tx_mtu_ = tx_mtu; }
+
+  void EattChannelSetTxMTU(uint16_t tx_mtu) {
+    this->tx_mtu_ = std::min<uint16_t>(tx_mtu, EATT_MAX_TX_MTU);
+  }
 };
 
 /* Interface class */
diff --git a/system/stack/eatt/eatt_impl.h b/system/stack/eatt/eatt_impl.h
index 0a2c2afd1d6e767e211812c3267d6fc55f099f17..a2e35d9aaeaf0fa0a1effed6d5dc2de96aad60a9 100644
--- a/system/stack/eatt/eatt_impl.h
+++ b/system/stack/eatt/eatt_impl.h
@@ -276,7 +276,7 @@ struct eatt_impl {
     if (is_local_cfg)
       channel->rx_mtu_ = p_cfg->mtu;
     else
-      channel->tx_mtu_ = p_cfg->mtu;
+      channel->EattChannelSetTxMTU(p_cfg->mtu);
 
     /* Go back to open state */
     channel->EattChannelSetState(EattChannelState::EATT_CHANNEL_OPENED);