OSDN Git Service

Limit sniff mode for Nintendo Pro Controller to 11.25ms
authorAndre Eisenbach <eisenbach@google.com>
Thu, 13 Jun 2019 18:50:57 +0000 (11:50 -0700)
committerMyles Watson <mylesgw@google.com>
Wed, 19 Jun 2019 02:44:23 +0000 (02:44 +0000)
Bug: 133410149
Test: manual
Change-Id: I4bffb759323bedd36e754cf758ac1d61cffc886e
(cherry picked from commit b62d0a17ec545fb477a5155790e9e96d1472659b)

bta/hh/bta_hh_utils.cc
device/include/interop.h
device/include/interop_database.h
device/src/interop.cc

index c4c6061..e369788 100644 (file)
@@ -21,6 +21,7 @@
 #if (BTA_HH_INCLUDED == TRUE)
 
 #include "bta_hh_int.h"
+#include "device/include/interop.h"
 #include "osi/include/osi.h"
 
 /* if SSR max latency is not defined by remote device, set the default value
@@ -393,6 +394,11 @@ tBTA_HH_STATUS bta_hh_read_ssr_param(const RawAddress& bd_addr,
         if (ssr_max_latency > BTA_HH_SSR_MAX_LATENCY_DEF)
           ssr_max_latency = BTA_HH_SSR_MAX_LATENCY_DEF;
 
+        if (interop_match_addr(INTEROP_HID_HOST_LIMIT_SNIFF_INTERVAL,
+                               &bd_addr)) {
+          if (ssr_max_latency > 18 /* slots * 0.625ms */) ssr_max_latency = 18;
+        }
+
         *p_max_ssr_lat = ssr_max_latency;
       } else
         *p_max_ssr_lat = p_cb->kdev[i].dscp_info.ssr_max_latency;
index b31efc3..a9bf586 100644 (file)
@@ -89,7 +89,11 @@ typedef enum {
   // Disable role switch for headsets/car-kits.
   // Some car kits allow role switch but when the Phone initiates role switch,
   // the Remote device will go into bad state that will lead to LMP time out.
-  INTEROP_DISABLE_ROLE_SWITCH
+  INTEROP_DISABLE_ROLE_SWITCH,
+
+  // Set a very low initial sniff subrating for HID devices that do not
+  // set their own sniff interval.
+  INTEROP_HID_HOST_LIMIT_SNIFF_INTERVAL,
 } interop_feature_t;
 
 // Check if a given |addr| matches a known interoperability workaround as
index 1fa2a4d..339e853 100644 (file)
@@ -143,6 +143,10 @@ static const interop_addr_entry_t interop_addr_database[] = {
 
     // AirPods 2 - unacceptably loud volume
     {{{0x94, 0x16, 0x25, 0, 0, 0}}, 3, INTEROP_DISABLE_ABSOLUTE_VOLUME},
+
+    // Nintendo Switch Pro Controller - does not set sniff interval dynamically.
+    // Requires custom HID report command to change mode.
+    {{{0x98, 0xB6, 0xE9, 0, 0, 0}}, 3, INTEROP_HID_HOST_LIMIT_SNIFF_INTERVAL},
 };
 
 typedef struct {
index c2ed2a8..e4bce56 100644 (file)
@@ -128,6 +128,7 @@ static const char* interop_feature_string_(const interop_feature_t feature) {
     CASE_RETURN_STR(INTEROP_DISABLE_AVDTP_RECONFIGURE)
     CASE_RETURN_STR(INTEROP_DYNAMIC_ROLE_SWITCH)
     CASE_RETURN_STR(INTEROP_DISABLE_ROLE_SWITCH)
+    CASE_RETURN_STR(INTEROP_HID_HOST_LIMIT_SNIFF_INTERVAL)
   }
 
   return "UNKNOWN";