Disable 3Mbps packets for AVDT ACL links

Change-Id: I4b1b52ec8aeaf5eab0672231889e0ea6f23aa852
diff --git a/device/include/interop.h b/device/include/interop.h
index e2ca682..b5cbdd6 100644
--- a/device/include/interop.h
+++ b/device/include/interop.h
@@ -32,7 +32,16 @@
   // requiring multiple retries to complete pairing. To avoid degrading the user
   // experience for those devices, automatically re-try pairing if page
   // timeouts are received during pairing.
-  INTEROP_AUTO_RETRY_PAIRING
+  INTEROP_AUTO_RETRY_PAIRING,
+
+  // Some headsets have audio jitter issues because of increased re-transmissions as the
+  // 3 Mbps packets have a lower link margin, and are more prone to interference. We can
+  // disable 3DH packets (use only 2DH packets) for the ACL link to improve sensitivity
+  // when streaming A2DP audio to the headset. Air sniffer logs show reduced
+  // re-transmissions after switching to 2DH packets.
+  //
+  // Disable 3Mbps packets and use only 2Mbps packets for ACL links when streaming audio.
+  INTEROP_2MBPS_LINK_ONLY
 } interop_feature_t;
 
 // Check if a given |addr| matches a known interoperability workaround as identified
diff --git a/device/include/interop_database.h b/device/include/interop_database.h
index 4f95be9..77ee40c 100644
--- a/device/include/interop_database.h
+++ b/device/include/interop_database.h
@@ -43,5 +43,8 @@
   {{0x80, 0xe4, 0xda, 0x70,   0,0}, 4, INTEROP_DISABLE_LE_SECURE_CONNECTIONS},
 
   // BMW car kits (Harman/Becker)
-  {{0x9c, 0xdf, 0x03,       0,0,0}, 3, INTEROP_AUTO_RETRY_PAIRING}
+  {{0x9c, 0xdf, 0x03,       0,0,0}, 3, INTEROP_AUTO_RETRY_PAIRING},
+
+  // Jaybird Family
+  {{0x00, 0x18, 0x91,       0,0,0}, 3, INTEROP_2MBPS_LINK_ONLY}
 };
diff --git a/stack/avdt/avdt_l2c.c b/stack/avdt/avdt_l2c.c
index dbdfc08..4ea5d67 100644
--- a/stack/avdt/avdt_l2c.c
+++ b/stack/avdt/avdt_l2c.c
@@ -33,6 +33,7 @@
 #include "l2cdefs.h"
 #include "btm_api.h"
 #include "btm_int.h"
+#include "device/include/interop.h"
 
 
 /* callback function declarations */
@@ -202,6 +203,15 @@
             p_tbl->state = AVDT_AD_ST_SEC_ACP;
             p_tbl->cfg_flags = AVDT_L2C_CFG_CONN_ACP;
 
+            if (interop_match(INTEROP_2MBPS_LINK_ONLY, (const bt_bdaddr_t *)&bd_addr)) {
+                // Disable 3DH packets for AVDT ACL to improve sensitivity on HS
+                tACL_CONN *p_acl_cb = btm_bda_to_acl(bd_addr, BT_TRANSPORT_BR_EDR);
+                btm_set_packet_types(p_acl_cb, (btm_cb.btm_acl_pkt_types_supported |
+                                                HCI_PKT_TYPES_MASK_NO_3_DH1 |
+                                                HCI_PKT_TYPES_MASK_NO_3_DH3 |
+                                                HCI_PKT_TYPES_MASK_NO_3_DH5));
+            }
+
             /* Check the security */
             rc = btm_sec_mx_access_request (bd_addr, AVDT_PSM,
                 FALSE, BTM_SEC_PROTO_AVDT,
@@ -321,6 +331,15 @@
                         p_tbl->lcid = lcid;
                         p_tbl->cfg_flags = AVDT_L2C_CFG_CONN_INT;
 
+                        if (interop_match(INTEROP_2MBPS_LINK_ONLY, (const bt_bdaddr_t *) &p_ccb->peer_addr)) {
+                            // Disable 3DH packets for AVDT ACL to improve sensitivity on HS
+                            tACL_CONN *p_acl_cb = btm_bda_to_acl(p_ccb->peer_addr, BT_TRANSPORT_BR_EDR);
+                            btm_set_packet_types(p_acl_cb, (btm_cb.btm_acl_pkt_types_supported |
+                                                            HCI_PKT_TYPES_MASK_NO_3_DH1 |
+                                                            HCI_PKT_TYPES_MASK_NO_3_DH3 |
+                                                            HCI_PKT_TYPES_MASK_NO_3_DH5));
+                        }
+
                         /* Check the security */
                         btm_sec_mx_access_request (p_ccb->peer_addr, AVDT_PSM,
                             TRUE, BTM_SEC_PROTO_AVDT,