diff --git a/file/init.sh b/file/init.sh new file mode 100644 index 0000000..4873902 --- /dev/null +++ b/file/init.sh @@ -0,0 +1,288 @@ +#!/bin/sh +# based on https://github.com/6ang996/istoreos-rk356x/blob/rk356x/target/linux/rk356x/armv8/base-files/etc/init.d/rename_iface + +. /lib/functions.sh + +NPROCS="$(grep -c "^processor.*:" /proc/cpuinfo)" +PROC_MASK="$(( (1 << $NPROCS) - 1 ))" +PROC_MASK="$(printf %x "$PROC_MASK")" + +rename_iface() { + ip link set $1 down && ip link set $1 name $2 +} + +get_iface_device() { + basename $(readlink /sys/class/net/$1/device) +} + +set_iface_cpumask() { + local core_mask="$1" + local interface="$2" + local device="$3" + local irq + local seconds + local mq + local q + local queue_mask=$(( 0x${PROC_MASK} ^ 0x${core_mask} )) + queue_mask="$(printf %x "$queue_mask")" + local mq_mask="$4" + + [[ -d "/sys/class/net/${interface}" ]] || return 1 + + [[ -n "${device}" && "${device}" = "${interface}-*" ]] && mq=1 + + [[ -z "${mq}" || "${device}" = "${interface}-0" ]] && ip link set dev "${interface}" up + + [[ -z "${device}" ]] && device="$interface" + + for seconds in $(seq 0 1); do + irq=$(grep -m1 " ${device}\$" /proc/interrupts | sed -n -e 's/^ *\([^ :]\+\):.*$/\1/p') + if [ -n "${irq}" ]; then + echo "${core_mask}" > /proc/irq/${irq}/smp_affinity + if [[ -z "${mq}" ]]; then + echo "${queue_mask}" > /sys/class/net/$interface/queues/rx-0/rps_cpus + echo "${queue_mask}" > /sys/class/net/$interface/queues/tx-0/xps_cpus + elif [[ "${device}" = "${interface}-0" ]]; then + [[ -n "$mq_mask" ]] || mq_mask="${queue_mask}" + for q in /sys/class/net/$interface/queues/rx-*; do + echo "$mq_mask" > "$q/rps_cpus" + done + # for q in /sys/class/net/$interface/queues/tx-*; do + # echo "$mq_mask" > "$q/xps_cpus" + # done + fi + return 0 + fi + sleep 1 + done + return 1 +} + +board_fixup_iface_name() { + local device + case $(board_name) in + friendlyelec,nanopi-r5c|\ + fastrhino,r66s) + device="$(get_iface_device eth0)" + if [[ "$device" = "0001:11:00.0" ]]; then + rename_iface eth0 lan1 + rename_iface eth1 eth0 + rename_iface lan1 eth1 + fi + ;; + easepi,ars4|\ + jsy,h1|\ + hinlink,hnas|\ + hinlink,opc-h66k) + device="$(get_iface_device eth1)" + if [[ "$device" = "0001:11:00.0" ]]; then + rename_iface eth0 lan1 + rename_iface eth1 eth0 + rename_iface lan1 eth1 + fi + ;; + lyt,t68m|\ + fastrhino,r68s) + device="$(get_iface_device eth0)" + if [[ "$device" = "fe010000.ethernet" ]]; then + rename_iface eth0 wan + rename_iface eth1 eth0 + rename_iface wan eth1 + fi + device="$(get_iface_device eth3)" + if [[ "$device" = "0002:21:00.0" ]]; then + rename_iface eth2 lan3 + rename_iface eth3 eth2 + rename_iface lan3 eth3 + fi + ;; + firefly,rk3568-roc-pc) + device="$(get_iface_device eth0)" + if [[ "$device" = "fe010000.ethernet" ]]; then + rename_iface eth0 wan + rename_iface eth1 eth0 + rename_iface wan eth1 + fi + ;; + friendlyelec,nanopi-r5s) + device="$(get_iface_device eth2)" + # r5s lan1 is under pcie2x1 + if [[ "$device" = "0000:01:00.0" ]]; then + rename_iface eth1 lan2 + rename_iface eth2 eth1 + rename_iface lan2 eth2 + fi + ;; + hinlink,opc-h68k) + device="$(get_iface_device eth1)" + if [[ "$device" = "fe010000.ethernet" ]]; then + rename_iface eth0 wan + rename_iface eth1 eth0 + rename_iface wan eth1 + fi + device="$(get_iface_device eth3)" + if [[ "$device" = "0001:11:00.0" ]]; then + rename_iface eth2 lan3 + rename_iface eth3 eth2 + rename_iface lan3 eth3 + fi + ;; + hinlink,opc-h69k) + device="$(get_iface_device eth2)" + if [[ "$device" = "0001:11:00.0" ]]; then + rename_iface eth1 lan2 + rename_iface eth2 eth1 + rename_iface lan2 eth2 + fi + ;; + hinlink,h88k-v3|\ + friendlyelec,nanopi-r6s) + device="$(get_iface_device eth1)" + if [[ "$device" = "0004:41:00.0" ]]; then + rename_iface eth1 lan2 + rename_iface eth2 eth1 + rename_iface lan2 eth2 + fi + ;; + armsom,sige7-v1) + device="$(get_iface_device eth1)" + if [[ "$device" = "0004:41:00.0" ]]; then + rename_iface eth1 wan + rename_iface eth0 eth1 + rename_iface wan eth0 + fi + ;; + esac +} + +board_set_iface_smp_affinity() { + case $(board_name) in + firefly,rk3568-roc-pc) + set_iface_cpumask 2 eth0 + set_iface_cpumask 4 eth1 + ;; + hinlink,opc-h69k|\ + friendlyelec,nanopi-r5s) + set_iface_cpumask 2 eth0 + if ethtool -i eth1 | grep -Fq 'driver: r8169'; then + set_iface_cpumask 4 "eth1" + set_iface_cpumask 8 "eth2" + else + set_iface_cpumask 4 "eth1" "eth1-0" && \ + set_iface_cpumask 4 "eth1" "eth1-16" && \ + set_iface_cpumask 2 "eth1" "eth1-18" && \ + set_iface_cpumask 8 "eth2" "eth2-0" && \ + set_iface_cpumask 8 "eth2" "eth2-18" && \ + set_iface_cpumask 1 "eth2" "eth2-16" + fi + ;; + lyt,t68m|\ + fastrhino,r68s|\ + hinlink,opc-h68k) + set_iface_cpumask 1 "eth0" + set_iface_cpumask 2 "eth1" + if ethtool -i eth2 | grep -Fq 'driver: r8169'; then + set_iface_cpumask 4 "eth2" + set_iface_cpumask 8 "eth3" + else + set_iface_cpumask 4 "eth2" "eth2-0" && \ + set_iface_cpumask 4 "eth2" "eth2-16" && \ + set_iface_cpumask 2 "eth2" "eth2-18" && \ + set_iface_cpumask 8 "eth3" "eth3-0" && \ + set_iface_cpumask 8 "eth3" "eth3-18" && \ + set_iface_cpumask 1 "eth3" "eth3-16" + fi + ;; + jsy,h1|\ + yyy,h1|\ + easepi,ars4|\ + friendlyelec,nanopi-r5c|\ + fastrhino,r66s|\ + hinlink,hnas|\ + hinlink,opc-h66k) + if ethtool -i eth0 | grep -Fq 'driver: r8169'; then + set_iface_cpumask 4 "eth0" + set_iface_cpumask 8 "eth1" + else + set_iface_cpumask 2 "eth0" "eth0-0" && \ + set_iface_cpumask 2 "eth0" "eth0-16" && \ + set_iface_cpumask 8 "eth0" "eth0-18" && \ + set_iface_cpumask 4 "eth1" "eth1-0" && \ + set_iface_cpumask 4 "eth1" "eth1-18" && \ + set_iface_cpumask 1 "eth1" "eth1-16" + fi + ;; + armsom,sige7-v1|\ + friendlyelec,nanopi-r6s|\ + friendlyelec,nanopi-r6c) + set_iface_cpumask 2 eth0 + if ethtool -i eth1 | grep -Fq 'driver: r8169'; then + set_iface_cpumask 4 "eth1" + set_iface_cpumask 8 "eth2" + else + set_iface_cpumask 4 "eth1" "eth1-0" f0 && \ + set_iface_cpumask 4 "eth1" "eth1-16" && \ + set_iface_cpumask 2 "eth1" "eth1-18" && \ + set_iface_cpumask 8 "eth2" "eth2-0" f0 && \ + set_iface_cpumask 8 "eth2" "eth2-18" && \ + set_iface_cpumask 1 "eth2" "eth2-16" + fi + ;; + hinlink,h88k-*|\ + hinlink,h88k) + set_iface_cpumask 2 eth0 + if ethtool -i eth1 | grep -Fq 'driver: r8169'; then + set_iface_cpumask 4 "eth1" + set_iface_cpumask 8 "eth2" && \ + set_iface_cpumask 10 "eth3" && \ + set_iface_cpumask 20 "eth4" + else + set_iface_cpumask 4 "eth1" "eth1-0" f0 && \ + set_iface_cpumask 4 "eth1" "eth1-16" && \ + set_iface_cpumask 2 "eth1" "eth1-18" && \ + set_iface_cpumask 8 "eth2" "eth2-0" f0 && \ + set_iface_cpumask 8 "eth2" "eth2-18" && \ + set_iface_cpumask 1 "eth2" "eth2-16" && \ + set_iface_cpumask 10 "eth3" "eth3-0" f0 && \ + set_iface_cpumask 10 "eth3" "eth3-16" && \ + set_iface_cpumask 8 "eth3" "eth3-18" && \ + set_iface_cpumask 20 "eth4" "eth4-0" f0 && \ + set_iface_cpumask 20 "eth4" "eth4-18" && \ + set_iface_cpumask 4 "eth4" "eth4-16" + fi + ;; + hlink,h28k) + set_iface_cpumask 5 eth0 + set_iface_cpumask b eth1 + ;; + ynn,nas|\ + jp,tvbox|\ + panther,x2|\ + hsa,bh2) + set_iface_cpumask 2 "eth0" + ;; + esac +} + +board_wait_wifi() { + local seconds + [[ -f "/etc/uci-defaults/01-rk35xx-wifi" ]] || return 0 + case $(board_name) in + hinlink,h88k-*|\ + hinlink,h88k|\ + hinlink,opc-h68k|\ + hinlink,opc-h69k) + for seconds in $(seq 0 30); do + [[ -s /etc/config/wireless ]] && break + sleep 1 + done + sleep 1 + ;; + esac +} + +board_fixup_iface_name + +board_set_iface_smp_affinity + +board_wait_wifi