tune usb irq (dwc3) based on usb function

This among other things greatly increases tethering performance.

Bug: 185092876
Test: TreeHugger, built and booted on an oriole, enabled tethering
Signed-off-by: Maciej Żenczykowski <maze@google.com>
Change-Id: Ic9f0b4bef05250bb38c91dc1e046366098d98dc0
This commit is contained in:
Maciej Żenczykowski 2021-06-25 11:42:01 -07:00 committed by Maciej Zenczykowski
parent ed651c86bf
commit a24469c9d0
4 changed files with 29 additions and 0 deletions

View file

@ -85,6 +85,12 @@ on property:vendor.usb.config=*
on property:persist.vendor.usb.usbradio.config=* on property:persist.vendor.usb.usbradio.config=*
start usbd start usbd
on property:vendor.usb.dwc3_irq=medium
exec /vendor/bin/hw/set_usb_irq.sh medium
on property:vendor.usb.dwc3_irq=big
exec /vendor/bin/hw/set_usb_irq.sh big
on charger on charger
mkdir /config/usb_gadget/g1 mkdir /config/usb_gadget/g1
mkdir /config/usb_gadget/g1/strings/0x409 mkdir /config/usb_gadget/g1/strings/0x409

View file

@ -261,6 +261,7 @@ PRODUCT_COPY_FILES += \
# Shell scripts # Shell scripts
PRODUCT_COPY_FILES += \ PRODUCT_COPY_FILES += \
device/google/gs101/init.insmod.sh:$(TARGET_COPY_OUT_VENDOR)/bin/init.insmod.sh \ device/google/gs101/init.insmod.sh:$(TARGET_COPY_OUT_VENDOR)/bin/init.insmod.sh \
device/google/gs101/set_usb_irq.sh:$(TARGET_COPY_OUT_VENDOR)/bin/hw/set_usb_irq.sh \
# insmod files # insmod files
PRODUCT_COPY_FILES += \ PRODUCT_COPY_FILES += \

16
set_usb_irq.sh Executable file
View file

@ -0,0 +1,16 @@
#!/vendor/bin/sh
# Switch into /proc/irq/$IRQ for the dwc3 usb controller
cd /proc/irq/*/dwc3/.. || exit 7
# Move the USB Controller (DWC3) interrupt as requested
# Modem and DIT are on 0/2/5 depending on throughput, so avoid those.
# 0-3 small, 4-5 medium, 6-7 big
case "$1" in
medium) core=4;;
big) core=6;;
*) core=0;;
esac
# This can sometimes fail due to smp_affinity_list no longer existing...
echo "${core}" > smp_affinity_list

View file

@ -367,6 +367,12 @@ Return<void> UsbGadget::setCurrentUsbFunctions(uint64_t functions,
goto error; goto error;
} }
if (functions & GadgetFunction::NCM) {
SetProperty("vendor.usb.dwc3_irq", "big");
} else {
SetProperty("vendor.usb.dwc3_irq", "medium");
}
ALOGI("Usb Gadget setcurrent functions called successfully"); ALOGI("Usb Gadget setcurrent functions called successfully");
return Void(); return Void();