blob: 7f531580637377802d59e86e8e49f6fc8810809b [file] [log] [blame]
#!/bin/sh
MODULE_PATH=/usr/lib/modules
. /etc/utils.sh
# RwFirmware mount /rw/firmware over /lib/firmware
# allows developers to test new mrvl firmware
check_rwfw_experiment()
{
register_experiment RwFirmware
if experiment RwFirmware; then
local src=/lib/firmware
local dst=/rw/firmware
if [ ! -d "$dst" ]; then
echo "RwFirmware: copying $src to $dst"
mkdir -p "$dst"
tar cf - -C "$src" . | tar xf - -C "$dst"
fi
if ! touch "$src/this_is_rw" 2>/dev/null; then
echo "RwFirmware: mounting writable $dst on $src"
mount -o bind "$dst" "$src"
fi
fi
}
rename_net_device()
{
local old_dev=$1
local new_dev=$2
if [ -e /sys/class/net/$old_dev ]; then
echo "Renaming $old_dev to $new_dev..."
ip link set dev $old_dev down
ip link set dev $old_dev name $new_dev
ip link set dev $new_dev up
fi
}
check_rwfw_experiment
start()
{
if is-windcharger; then
# Renames network devices for compatibility with optimus scripts.
rename_net_device eth0 wan0
rename_net_device eth1 lan0
fi
if is-spacecast; then
# Loads sc100 driver.
DVB_MAC=$(hnvram -qr MAC_ADDR)
if [ -n "$DVB_MAC" ]; then
modprobe dvb-usb-sc100 mac_addr="$DVB_MAC"
else
modprobe dvb-usb-sc100
fi
fi
if is-ptp; then
# Rename eth0 to craft0: This is the interface that the tech will connect to
# when configuring the device. We want to keep this interface isolated from
# customer traffic.
# rename eth1 so it won't be put in the bridge automatically
rename_net_device eth0 craft0
rename_net_device eth1 sw0
if [ -f /etc/hw_ver ]; then
local CHIMERA_1_2A_HW_VER
CHIMERA_1_2A_HW_VER=2
hwver=$(hnvram -rq HW_VER)
if [ "$hwver" = "$CHIMERA_1_2A_HW_VER" ]; then
modprobe at24
modprobe tmp421
modprobe ltc2990
echo 24c02 0x50 >/sys/bus/i2c/devices/i2c-3/new_device
echo tmp423 0x4c >/sys/bus/i2c/devices/i2c-7/new_device
fi
fi
fi
if is-tv-box; then
register_experiment SkipBluetoothWifi
register_experiment BluetoothLast
if experiment SkipBluetoothWifi; then
exit 0
fi
done=/tmp/btlast_$(basename $0).done
if experiment BluetoothLast && [ ! -f "$done" ]; then
: > "$done"
echo "$0: skipping start due to BluetoothLast experiment."
exit 0
fi
[ -e "$MODULE_PATH/wl.ko" ] && insmod "$MODULE_PATH/wl.ko"
# Set up BT, if present
BT_MAC=$(hnvram -qr MAC_ADDR_BT)
if [ -z "$BT_MAC" ]; then
MAC=$(hnvram -qr MAC_ADDR)
if [ -z "$MAC" ]; then
echo "$0: ERROR: TV Box has no MAC_ADDR nor MAC_ADDR_BT"
exit 1
fi
BT_MAC=$(mac_addr_increment "$MAC" 2)
fi
BT_MAC=$(echo "$BT_MAC" | sed 's/./\U&/g')
echo "$BT_MAC" >/tmp/btmacaddress
if [ "$(kernopt wifical)" = "1" ]; then
# If we're trying to calibrate Wifi/BT, loading
# the production driver disrupts the process, and we need the "primary
# kernel" bluetooth core.
insmod /lib/modules/$(uname -r)/kernel/net/bluetooth/bluetooth.ko
modprobe -a bluetooth
else # Not trying to calibrate
if [ "$(cat /etc/platform)" = GFHD100 ]; then
# BCM20702 USB Bluetooth chip
wl reset_bt_chip 1 2>&1
sleep 1 # chip needs time to stabilize, else it will be flakey
fi
modprobe -a compat
# If a backports bluetooth module is present, use it.
backport="/lib/modules/$(uname -r)/backports/net/bluetooth/bluetooth.ko"
[ -e "$backport" ] && insmod "$backport"
modprobe -a bluetooth hidp hid-gfrm uhid
modprobe btmrvl bdaddr_base="$BT_MAC"
modprobe btmrvl_sdio
if modinfo -F filename btbcm >/dev/null 2>&1; then
modprobe btbcm bdaddr_base="$BT_MAC"
modprobe btusb
else
modprobe btusb bdaddr_base="$BT_MAC"
fi
fi
fi
}
stop()
{
if is-tv-box; then
rmmod btusb btbcm btmrvl_sdio btmrvl bluetooth hidp hid-gfrm uhid
rmmod compat
[ -e "$MODULE_PATH/wl.ko" ] && rmmod wl
fi
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
stop
start
;;
*)
echo "Usage: $0 {start|stop|restart}"
exit 1
esac