#!/bin/sh
# Bind Enyx/Exegy HFP PCI devices to enyx_hfp_pci.
# lspci may display vendor 0x1d8f as "Exegy"; newer cards may use 0x19c1.
set -e

modprobe enyx_hfp 2>/dev/null || true
modprobe enyx_hfp_pci 2>/dev/null || true

DRV=/sys/bus/pci/drivers/enyx_hfp_pci
if [ ! -d "$DRV" ]; then
    echo "ERROR: enyx_hfp_pci is not loaded" >&2
    lsmod | grep enyx || true
    dmesg | grep -E 'enyx_hfp|this_module' | tail -10 >&2
    exit 1
fi

# Dynamically accept any device from both vendor IDs (PCI_ANY_ID = ffffffff)
echo "1d8f ffffffff" > "$DRV/new_id" 2>/dev/null || true
echo "19c1 ffffffff" > "$DRV/new_id" 2>/dev/null || true

addrs=$(
    {
        lspci -Dn 2>/dev/null | awk '/ 1d8f:| 19c1:/ {print $1}'
        lspci -Dnn 2>/dev/null | awk 'BEGIN{IGNORECASE=1} /Exegy|Enyx/ {print $1}'
    } | sort -u
)

if [ -z "$addrs" ]; then
    echo "No Exegy/Enyx PCI device found (1d8f/19c1)." >&2
    echo "lspci ethernet controllers:" >&2
    lspci -Dnn | grep -i 'Ethernet\|Memory controller\|Processing accelerators' >&2 || lspci -Dnn | head >&2
    exit 1
fi

bound=0
for bdf in $addrs; do
    dev="/sys/bus/pci/devices/$bdf"
    [ -d "$dev" ] || continue
    vendor=$(cat "$dev/vendor" 2>/dev/null || echo unknown)
    device=$(cat "$dev/device" 2>/dev/null || echo unknown)
    echo "Found $bdf vendor=$vendor device=$device"

    if [ -e "$dev/driver" ]; then
        cur=$(basename "$(readlink -f "$dev/driver")")
        if [ "$cur" = "enyx_hfp_pci" ]; then
            echo "  already bound to enyx_hfp_pci"
            bound=$((bound + 1))
            continue
        fi
        echo "  unbinding $cur"
        echo "$bdf" > "$dev/driver/unbind" || true
    fi
    echo enyx_hfp_pci > "$dev/driver_override" 2>/dev/null || true
    if echo "$bdf" > "$DRV/bind" 2>/dev/null; then
        echo "  bound to enyx_hfp_pci"
        bound=$((bound + 1))
    else
        echo "  bind failed" >&2
        dmesg | tail -8 >&2 || true
    fi
done

echo "--- lspci ---"
lspci -Dnnk | grep -A4 -iE '1d8f|19c1|Exegy|Enyx' || true
echo "--- sysfs bus ---"
ls -d /sys/class/enyx_hfp_bus/enyx_hfp_bus* 2>/dev/null || echo 'no enyx_hfp_bus class yet'
ls /dev/enyx_hfp* 2>/dev/null | head || true

if [ "$bound" -eq 0 ]; then
    echo "ERROR: no device bound to enyx_hfp_pci" >&2
    exit 1
fi
exit 0
