diff --git a/conf/init.gs101.usb.rc b/conf/init.gs101.usb.rc index b8ffc0a4..d0f19a3a 100644 --- a/conf/init.gs101.usb.rc +++ b/conf/init.gs101.usb.rc @@ -85,6 +85,12 @@ on property:vendor.usb.config=* on property:persist.vendor.usb.usbradio.config=* 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 mkdir /config/usb_gadget/g1 mkdir /config/usb_gadget/g1/strings/0x409 diff --git a/device.mk b/device.mk index 9c6d1da1..5a523c8a 100644 --- a/device.mk +++ b/device.mk @@ -261,6 +261,7 @@ PRODUCT_COPY_FILES += \ # Shell scripts PRODUCT_COPY_FILES += \ 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 PRODUCT_COPY_FILES += \ diff --git a/set_usb_irq.sh b/set_usb_irq.sh new file mode 100755 index 00000000..29d37812 --- /dev/null +++ b/set_usb_irq.sh @@ -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 diff --git a/usb/UsbGadget.cpp b/usb/UsbGadget.cpp index b153e203..909fb485 100644 --- a/usb/UsbGadget.cpp +++ b/usb/UsbGadget.cpp @@ -367,6 +367,12 @@ Return UsbGadget::setCurrentUsbFunctions(uint64_t functions, 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"); return Void();