#!/bin/bash
# Copyright 2009        Luis R. Rodriguez <mcgrof@gmail.com>
#
# This this to select your compat-wireless driver and
# reduce compilation time.

DRIVERS_MAKEFILE="drivers/net/wireless/Makefile"
ATH_MAKEFILE="drivers/net/wireless/ath/Makefile"
ATH9K_MAKEFILE="drivers/net/wireless/ath/ath9k/Makefile"
RT2X00_MAKEFILE="drivers/net/wireless/rt2x00/Makefile"
NET_WIRELESS_MAKEFILE="net/wireless/Makefile"
EEPROM_MAKEFILE="drivers/misc/eeprom/Makefile"
DRIVERS_NET="drivers/net/Makefile"
DRIVERS_NET_USB_MAKEFILE="drivers/net/usb/Makefile"
SSB_MAKEFILE="drivers/ssb/Makefile"

# used to backup files from foo to foo.${BACKUP_EXT}
# If you change this also modify restore_compat() and
# restore_file() below I couldn't find a way to use
# the $BACKUP_EXT there.
BACKUP_EXT="bk"

# Pretty colors
GREEN="\033[01;32m"
YELLOW="\033[01;33m"
NORMAL="\033[00m"
BLUE="\033[34m"
RED="\033[31m"
PURPLE="\033[35m"
CYAN="\033[36m"
UNDERLINE="\033[02m"

SUPPORTED_80211_DRIVERS="ath5k ath9k ath9k_htc ar9170 b43 zd1211rw rt2x00"
# b43 needs some more work for driver-select, the SSB stuff, plus
# what if you update b44 but not b43? It will bust.
SUPPORTED_ETH_DRIVERS="atl1 atl2 atl1e atl1c"

function usage {
	echo -e "${GREEN}Usage${NORMAL}: ${CYAN}$0${NORMAL} [ ${PURPLE}<driver-name>${NORMAL} | ${PURPLE}<driver-group-name>${NORMAL} | ${GREEN}restore${NORMAL} ]"

	# These should match the switch below.
	echo -e "Supported 802.11 drivers:"
	for i in $SUPPORTED_80211_DRIVERS; do
		echo -e "\t${PURPLE}${i}${NORMAL}"
	done

	echo -e "\nSupported Ethernet drivers:"
	for i in $SUPPORTED_ETH_DRIVERS; do
		echo -e "\t${PURPLE}${i}${NORMAL}"
	done

	# These should match the switch below.
	echo -e "\nSupported group drivers:"
	echo -e "\t${CYAN}atheros${NORMAL} < ${PURPLE} ath5k ath9k ar9170 zd1211rw ${NORMAL}>"
	echo -e "\t${CYAN}ath${NORMAL} < ${PURPLE} ath5k ath9k ar9170 ${NORMAL}>"
	echo -e "\t${CYAN}intel${NORMAL} < ${PURPLE} iwl3945 iwlagn ipw2100 ipw2200 ${NORMAL}>"
	echo -e "\t${CYAN}iwlwifi${NORMAL} < ${PURPLE} iwl3945 iwlagn ${NORMAL}>"
	echo -e "\t${CYAN}rtl818x${NORMAL} < ${PURPLE} rtl8180 rtl8187 ${NORMAL}>"
	echo -e "\t${CYAN}wl12xx${NORMAL} < ${PURPLE} wl1251 (SPI and SDIO) wl1271 ${NORMAL}>"

	echo -e "Restoring compat-wireless:"
	echo -e "\t${GREEN}restore${NORMAL}: you can use this option to restore compat-wireless to the original state"
}

function backup_file {
	if [ -f $1.${BACKUP_EXT} ]; then
		echo -e "Backup exists: ${CYAN}${1}.${BACKUP_EXT}${NORMAL}"
		return
	fi
	echo -e "Backing up makefile: ${CYAN}${1}.${BACKUP_EXT}${NORMAL}"
	cp $1 $1.bk
}

function disable_makefile
{
	backup_file $1
	echo > $1
}

function select_driver 
{
	backup_file $DRIVERS_MAKEFILE
	perl -i -ne 'print if /'$1'/ ' $DRIVERS_MAKEFILE
}

function select_drivers
{
	backup_file $DRIVERS_MAKEFILE
	CONFIGS=""
	COUNT=0
	for i in $@; do
		if [[ "$CONFIGS" = "" ]]; then
			CONFIGS="$i"
		else
			CONFIGS="${CONFIGS}|$i"
		fi
	done
	egrep "$CONFIGS" $DRIVERS_MAKEFILE > ${DRIVERS_MAKEFILE}.tmp
	mv ${DRIVERS_MAKEFILE}.tmp ${DRIVERS_MAKEFILE}
}

function disable_lib80211
{
	backup_file $NET_WIRELESS_MAKEFILE
	perl -i -ne 'print if ! /LIB80211/ ' $NET_WIRELESS_MAKEFILE
}

function disable_b44 {
	backup_file $DRIVERS_NET
	perl -i -ne 'print if ! /CONFIG_B44/ ' $DRIVERS_NET
}

function disable_ssb
{
	disable_b44
	disable_makefile ${SSB_MAKEFILE}
	perl -i -ne 'print if ! /drivers\/ssb\/ \\/ ' Makefile
}

function disable_rfkill
{
	backup_file Makefile
	perl -i -ne 'print if ! /CONFIG_COMPAT_RFKILL/' Makefile
}

function disable_eeprom
{
	disable_makefile ${EEPROM_MAKEFILE}
	perl -i -ne 'print if ! /drivers\/misc\/eeprom\/ \\/' Makefile
}

function disable_usbnet
{
	disable_makefile ${DRIVERS_NET_USB_MAKEFILE}
	perl -i -ne 'print if ! /drivers\/net\/usb\/ \\/' Makefile
}

function disable_usbnet {
	perl -i -ne 'print if ! /CONFIG_COMPAT_NET_USB_MODULES/' Makefile
} 

function disable_ethernet {
	perl -i -ne 'print if ! /CONFIG_COMPAT_NETWORK_MODULES/' Makefile
} 

function disable_var_03 {
	perl -i -ne 'print if ! /CONFIG_COMPAT_BLUETOOTH/' Makefile
} 

function disable_bt {
	perl -i -ne 'print if ! /CONFIG_COMPAT_VAR_MODULES/' Makefile
} 

function disable_80211 {
	perl -i -ne 'print if ! /CONFIG_COMPAT_WIRELESS/' Makefile
}

function disable_bt_usb_ethernet_var {
	backup_file Makefile
	disable_usbnet
	disable_ethernet
	disable_var_03
	disable_bt
} 

function enable_only_ethernet {
	backup_file Makefile
	backup_file $DRIVERS_NET
	disable_usbnet
	disable_var_03
	disable_bt
	# rfkill may be needed if you enable b44 as you may have b43
	disable_rfkill
	disable_80211
}

function disable_var {
	disable_ssb
	disable_usbnet
	disable_eeprom
} 

function disable_var_01 {
	disable_lib80211
	disable_var
}

function disable_var_02 {
	#var_01 with eeprom not disabled
	disable_lib80211
	disable_ssb
	disable_usbnet
}

function select_ath_driver 
{
	backup_file $ATH_MAKEFILE
	perl -i -ne 'print if /'$1'/ || /CONFIG_ATH_/ || /ath-objs/ || /regd.o/ || /hw.o/ ' $ATH_MAKEFILE
	disable_var_01
}

function select_ath9k_driver
{
	select_ath_driver CONFIG_ATH9K_HW
	# In the future here we'll add stuff to disable ath9k_htc
}

# iwlwifi stuff needs more work
function select_iwl_driver 
{
	perl -i -ne 'print if /'$1'/ || /CONFIG_BLEH/ ' drivers/net/wireless/iwlwifi/Makefile
	disable_var_01
}

function restore_file {
	#ORIG=$(shell ${1%%.${BACKUP_EXT}})
	ORIG=${1%%.bk}
	cp $1 $ORIG
	rm -f $1
	echo -e "Restored makefile: ${CYAN}${ORIG}${NORMAL} (and removed backup)"
}

function restore_compat {
	#FILES=$(find ./ -type f -name *.$BACKUP_EXT)
	FILES=$(find ./ -type f -name *.bk)
	for i in $FILES; do
		restore_file $i
	done
}

if [ $# -ne 1 ]; then
	usage
	exit
fi

if [ ! -f compat_version ]; then
	echo "Must run $0 from the compat-wireless top level directory"
	exit
fi

if [[ ! -f built-in.o ]]; then
	if [[ "$1" != "restore" ]]; then
		echo -e "${YELLOW}Processing new driver-select request...${NORMAL}"
	fi
fi

# Always backup the top level Makefile, unless restoring
if [[ "$1" != "restore" ]]; then
	backup_file Makefile
fi

# If a user selects a new driver make sure we clean up for them
# first and also restore the backup makefiles then. Otherwise
# we'll be trying to leave drivers on Makefiles which are not
# already there from a previous run.
if [ -f built-in.o ]; then
	echo -e "${YELLOW}Old build found, going to clean this up first...${NORMAL}"
	make clean
	echo -e "${YELLOW}Restoring Makefiles...${NORMAL}"
	./$0 restore
fi

case $1 in
	restore)
		restore_compat
		;;
	atheros)
		select_drivers		CONFIG_ATH_COMMON \
					CONFIG_ZD1211RW
		disable_var_01
		;;
	ath)
		disable_bt_usb_ethernet_var
		select_drivers		CONFIG_ATH_COMMON
		disable_var_01
		;;
	intel)
		select_drivers		CONFIG_IWLWIFI \
					CONFIG_IPW
		disable_var
		;;
	iwlwifi)
		select_driver		CONFIG_IWLWIFI
		disable_var_01
		;;
	wl12xx)
		select_drivers		CONFIG_WL12XX
		disable_var_01
		;;
	ath5k)
		disable_bt_usb_ethernet_var
		select_driver		CONFIG_ATH_COMMON
		select_ath_driver	CONFIG_ATH5K
		#patch -p1 < enable-older-kernels/enable-2.6.23.patch
		;;
	ath9k)
		disable_bt_usb_ethernet_var
		select_driver		CONFIG_ATH_COMMON
		select_ath9k_driver
		patch -p1 < enable-older-kernels/enable-2.6.24.patch
		;;
	ar9170)
		disable_bt_usb_ethernet_var
		select_driver		CONFIG_ATH_COMMON
		select_ath_driver	CONFIG_AR9170_USB
		;;
	ath9k_htc)
		disable_bt_usb_ethernet_var
		select_driver		CONFIG_ATH_COMMON
		select_ath9k_driver
		;;
	rtl818x)
		select_drivers		CONFIG_RTL8180 CONFIG_RTL8187
		disable_var_02
		;;
	zd1211rw)
		select_driver		CONFIG_ZD1211RW
		disable_var_01
		;;
	b43)
		disable_usbnet
		disable_ethernet
		disable_var_03
		select_driver		CONFIG_B43
		;;
	rt2x00)
		select_driver		CONFIG_RT2X00
		disable_var_02
		;;
	atl1)
		enable_only_ethernet
		echo -e "obj-\$(CONFIG_ATL1) += atlx/" > $DRIVERS_NET
		;;
	atl2)
		enable_only_ethernet
		echo -e "obj-\$(CONFIG_ATL2) += atlx/" > $DRIVERS_NET
		;;
	atl1e)
		enable_only_ethernet
		echo -e "obj-\$(CONFIG_ATL1E) += atl1e/" > $DRIVERS_NET
		;;
	atl1c)
		enable_only_ethernet
		echo -e "obj-\$(CONFIG_ATL1C) += atl1c/" > $DRIVERS_NET
		;;
	*)
		echo "Unsupported driver"
		exit
		;;
esac
