Limit hub tuning when enable_hub is enabled

Some external hubs have the same VID and PID as the internal hub,
causing unintended hub tuning and compatibility issues.

This patch restricts hub tuning to only the internal hub located on
bus 1, port 1 when enable_hub is set to 1.

Bug: 353650207
Test: Verified an external GL852G speakerphone dock works when docked.
Test: adb shell cmd android.hardware.usb.IUsb/default hub-vendor-cmd <hex wValue> <hex wIndex>
Flag: EXEMPT bugfix
Change-Id: I381f3883c90628753f0e5e9c11eb546fb15ce679
Signed-off-by: Kuen-Han Tsai <khtsai@google.com>
This commit is contained in:
Kuen-Han Tsai 2024-08-01 22:08:09 +08:00
parent 0ccc1836b2
commit 5cfc68b55b

View file

@ -54,6 +54,7 @@ namespace usb_flags = android::hardware::usb::flags;
using aidl::android::frameworks::stats::IStats;
using android::base::GetProperty;
using android::base::Join;
using android::base::ParseInt;
using android::base::ParseUint;
using android::base::Tokenize;
using android::base::Trim;
@ -101,7 +102,9 @@ constexpr char kThermalZoneForTempReadPrimary[] = "usb_pwr_therm2";
constexpr char kThermalZoneForTempReadSecondary1[] = "usb_pwr_therm";
constexpr char kThermalZoneForTempReadSecondary2[] = "qi_therm";
constexpr char kPogoUsbActive[] = "/sys/devices/platform/google,pogo/pogo_usb_active";
constexpr char kPogoEnableHub[] = "/sys/devices/platform/google,pogo/enable_hub";
constexpr char kPogoEnableUsb[] = "/sys/devices/platform/google,pogo/enable_usb";
constexpr char kInternalHubDevnum[] = "/sys/bus/usb/devices/1-1/devnum";
constexpr char kPowerSupplyUsbType[] = "/sys/class/power_supply/usb/usb_type";
constexpr char kIrqHpdCount[] = "irq_hpd_count";
constexpr char kUdcUeventRegex[] =
@ -524,11 +527,16 @@ void updatePortStatus(android::hardware::usb::Usb *usb) {
queryVersionHelper(usb, &currentPortStatus);
}
static int usbDeviceRemoved(const char *devname, void* client_data) {
return 0;
static int getInternalHubUniqueId() {
string internalHubDevnum;
int devnum = 0, internalHubUniqueId = -1;
if (ReadFileToString(kInternalHubDevnum, &internalHubDevnum) &&
ParseInt(Trim(internalHubDevnum).c_str(), &devnum))
internalHubUniqueId = 1000 + devnum;
return internalHubUniqueId;
}
static int usbDeviceAdded(const char *devname, void* client_data) {
static Status tuneInternalHub(const char *devname, void* client_data) {
uint16_t vendorId, productId;
struct usb_device *device;
::aidl::android::hardware::usb::Usb *usb;
@ -537,7 +545,7 @@ static int usbDeviceAdded(const char *devname, void* client_data) {
device = usb_device_open(devname);
if (!device) {
ALOGE("usb_device_open failed\n");
return 0;
return Status::ERROR;
}
usb = (::aidl::android::hardware::usb::Usb *)client_data;
@ -559,6 +567,26 @@ static int usbDeviceAdded(const char *devname, void* client_data) {
usb_device_close(device);
return Status::SUCCESS;
}
static int usbDeviceRemoved(const char *devname, void* client_data) {
return 0;
}
static int usbDeviceAdded(const char *devname, void* client_data) {
string pogoEnableHub;
int uniqueId = 0;
// Enable hub tuning when the pogo dock is connected.
if (ReadFileToString(kPogoEnableHub, &pogoEnableHub) && Trim(pogoEnableHub) == "1") {
// If enable_hub is set to 1, the internal hub is the first enumearted device on bus 1 and
// port 1.
uniqueId = usb_device_get_unique_id_from_name(devname);
if (uniqueId == getInternalHubUniqueId())
tuneInternalHub(devname, client_data);
}
return 0;
}