name: 'Apply Device-Specific Patches' description: 'Apply WiFi/Bluetooth fixes for Samsung and Xiaomi 6.6 GKI devices' inputs: version: description: 'Kernel config version (e.g., android15-6.6)' required: true kernel_version: description: 'Kernel version (e.g., 6.6)' required: true runs: using: "composite" steps: - name: Fix WiFi and Bluetooth on Samsung 6.6 GKI Devices if: inputs.version == 'android15-6.6' shell: bash working-directory: ${{ github.workspace }}/kernel/common run: | set -euo pipefail PATCH="${{ github.workspace }}/kernel_patches/samsung/min_kdp/add-min_kdp-symbols.patch" MIN_KDP="${{ github.workspace }}/kernel_patches/samsung/min_kdp/min_kdp.c" test -f "$PATCH" || { echo "Missing Samsung min_kdp patch: $PATCH" >&2; exit 1; } test -f "$MIN_KDP" || { echo "Missing Samsung min_kdp source: $MIN_KDP" >&2; exit 1; } SYMBOL_LIST=android/abi_gki_aarch64_galaxy TRANSACTION_DIR="$(mktemp -d)" BACKUP_DIR="$TRANSACTION_DIR/original" STAGE_DIR="$TRANSACTION_DIR/stage" TRANSACTION_COMMITTED=false declare -a TRANSACTION_PATHS TRANSACTION_PATH_COUNT=0 add_transaction_path() { local path="$1" case "$path" in /dev/null|..|../*|*/../*|/*) echo "Unsafe Samsung patch path: $path" >&2 exit 1 ;; esac local index existing for ((index = 0; index < TRANSACTION_PATH_COUNT; index++)); do existing="${TRANSACTION_PATHS[index]}" [ "$existing" = "$path" ] && return done TRANSACTION_PATHS[TRANSACTION_PATH_COUNT]="$path" TRANSACTION_PATH_COUNT=$((TRANSACTION_PATH_COUNT + 1)) } restore_transaction() { set +e set +u if [ "$TRANSACTION_COMMITTED" = true ]; then rm -rf "$TRANSACTION_DIR" return fi local index path for ((index = 0; index < TRANSACTION_PATH_COUNT; index++)); do path="${TRANSACTION_PATHS[index]}" if [[ -e "$BACKUP_DIR/$path" || -L "$BACKUP_DIR/$path" ]]; then rm -rf "$path" mkdir -p "$(dirname "$path")" cp -a "$BACKUP_DIR/$path" "$path" else rm -rf "$path" fi done rm -rf "$TRANSACTION_DIR" } trap restore_transaction EXIT PATCH_PATHS=() while IFS= read -r path; do [ -n "$path" ] && PATCH_PATHS+=("$path") done < <(awk '/^(---|\+\+\+) / { path=$2; sub(/^[ab]\//, "", path); print path }' "$PATCH" | sort -u) for path in "${PATCH_PATHS[@]}"; do add_transaction_path "$path" done add_transaction_path "$SYMBOL_LIST" add_transaction_path drivers/min_kdp.c add_transaction_path drivers/Makefile for path in "${TRANSACTION_PATHS[@]}"; do if [[ -e "$path" || -L "$path" ]]; then mkdir -p "$BACKUP_DIR/$(dirname "$path")" "$STAGE_DIR/$(dirname "$path")" cp -a "$path" "$BACKUP_DIR/$path" cp -a "$path" "$STAGE_DIR/$path" else mkdir -p "$STAGE_DIR/$(dirname "$path")" fi done ( cd "$STAGE_DIR" patch -p1 --dry-run < "$PATCH" patch -p1 --no-backup-if-mismatch < "$PATCH" printf '%s\n' \ 'kdp_set_cred_non_rcu' \ 'kdp_usecount_dec_and_test' \ 'kdp_usecount_inc' >> "$SYMBOL_LIST" cp "$MIN_KDP" drivers/min_kdp.c if ! grep -Fqx 'obj-y += min_kdp.o' drivers/Makefile; then printf '%s\n' 'obj-y += min_kdp.o' >> drivers/Makefile fi ) for path in "${TRANSACTION_PATHS[@]}"; do if [[ -e "$STAGE_DIR/$path" || -L "$STAGE_DIR/$path" ]]; then mkdir -p "$(dirname "$path")" rm -rf "$path" cp -a "$STAGE_DIR/$path" "$path" else rm -rf "$path" fi done TRANSACTION_COMMITTED=true - name: Fix WiFi and Bluetooth on Xiaomi 6.6 GKI Devices if: inputs.version == 'android15-6.6' shell: bash working-directory: ${{ github.workspace }}/kernel/common run: | SYMBOL_LIST=android/abi_gki_aarch64_xiaomi echo "device_find_any_child" >> $SYMBOL_LIST