#!/bin/sh

loadwlan()
{
    DRIVER=$1

    echo "" && echo -n "Loading WLAN modules..."

    case ${DRIVER} in
	zd1211b_kernel)
	    modprobe zd1211rw
	    ;;
	zd1211b_community)
	    modprobe zd1211bc
	    ;;
	zd1211b_zydas)
	    modprobe zd1211bz
	    ;;
	*)
	    echo "wrong parameter!"
	    ;;
    esac
}

loadfwfile()
{
    FWFILE=$1

    if [ -d /sys/class/firmware/1-1 ]; then
	USBDEV="1-1"
    else
	USBDEV="1-2"
    fi

    echo 1 > /sys/class/firmware/${USBDEV}/loading
    cat /lib/firmware/zd1211/${FWFILE} > /sys/class/firmware/${USBDEV}/data
    echo 0 > /sys/class/firmware/${USBDEV}/loading
}

loadfw()
{
    echo "" && echo "Loading firmware..."
    loadfwfile zd1211b_ub
    usleep 10000
    loadfwfile zd1211b_uphr
}

etherup()
{
    IFACE=$1
    IP=$2

    echo "" && echo "Bringing up ethernet..."
    ifconfig ${IFACE} ${IP}
}

wlansetup()
{
    MODE=$1
    IFACE=$2
    ENC=$3
    ESSID=$4
    WPACONF="/etc/wpasupplicant_zd1211.cfg"

    echo "" && echo "Setting up wireless interface..."
    case ${MODE} in
	iwconfig)
	    iwconfig ${IFACE} enc ${ENC}
	    iwconfig ${IFACE} essid ${ESSID}
	    ;;
	wpasupplicant)
	    wpa_supplicant -D wext -i ${IFACE} -c ${WPACONF} -B -dd
	    ;;
    esac

}

###############################################################################

shutdown()
{
    # this shutdown is for testing: reset everything
    # (all modules and interface, restart usb host and wlan config tool)

    SHUTDOWN=$1

    echo "" && echo "shutdown/reset interfaces and usb..."
    case ${SHUTDOWN} in
	all)
	    ifdown -i /etc/network/interfaces.wlan eth0
	    ifdown -i /etc/network/interfaces.wlan eth1
	    ifdown -i /etc/network/interfaces.wlan wlan0
	    ifconfig eth0 down
	    ifconfig eth1 down
	    ifconfig wlan0 down
	    killall wpa_supplicant
	    modprobe -r zd1211b
	    modprobe -r zd1211rw
	    modprobe -r arc4
	    modprobe -r ecb
	    modprobe -r cryptomgr
	    modprobe -r ieee80211_crypt_wep
	    modprobe -r ohci_hcd
	    modprobe -r isp116x-hcd
	    # restart usb
	    modprobe ohci_hcd
	    modprobe isp116x-hcd
	    ;;
	eth0)
	    ifconfig eth0 down
	    ;;
	none)
	    ;;
    esac
}

###############################################################################

setup()
{
    SETUP=$1
    MODE=$2
    IFACE=$3
    IP=$4
    ENC=$5
    ESSID=$6

    echo "" && echo -n "Starting WLAN setup "
    case ${SETUP} in
	zd1211b_kernel)
	    echo "zd1211b_kernel..."
	    loadwlan zd1211b_kernel
	    etherup ${IFACE} ${IP} &
	    usleep 600000
	    loadfw
	    usleep 400000
	    wlansetup ${MODE} ${IFACE} ${ENC} ${ESSID}
	    ;;
	zd1211b_community)
	    echo "zd1211b_community..."
	    loadwlan zd1211b_community
	    wlansetup ${MODE} ${IFACE} ${ENC} ${ESSID}
	    etherup ${IFACE} ${IP}
	    ;;
	zd1211b_zydas)
	    echo "zd1211b_zydas..."
	    loadwlan zd1211b_zydas
	    sleep 1
	    etherup ${IFACE} ${IP}
	    wlansetup ${MODE} ${IFACE} ${ENC} ${ESSID}
	    ;;
	*)
	    echo "wrong setup selected!"
	    ;;
    esac
    echo "... done with WLAN setup!" && echo ""
}

###############################################################################

SHUTDOWN="eth0"                  # all/eth0/none to run a generic device shutdown
SETUP="zd1211b_kernel"           # driver selection (zd1211b_kernel/community/zydas
MODE="wpasupplicant"             # iwconfig(NOENC/WEP)/wpasupplicant(WPA/WPA2)
IFACE="wlan0"                    # wlan interface name (depends on driver and stick)
IP="192.168.1.200"               # wlan IP address
ENC="43353342353238363245373935" # wep encryption key
ESSID="ssid"                     # wlan essid name

(
    shutdown ${SHUTDOWN}
    sleep 1
    setup ${SETUP} ${MODE} ${IFACE} ${IP} ${ENC} ${ESSID}

    exit 0
) &
