From 2d072c599779ce1b76df480b9da7cd3c3e65425c Mon Sep 17 00:00:00 2001
From: Felix Fietkau <nbd@openwrt.org>
Date: Sun, 15 Oct 2006 15:27:34 +0000
Subject: [PATCH] implement simple device autodetection for wifi drivers

SVN-Revision: 5113
---
 .../base-files/brcm-2.4/etc/config/wireless   | 14 -----
 .../base-files/default/etc/init.d/S40network  |  4 +-
 package/base-files/default/sbin/wifi          | 60 +++++++++++++++----
 .../broadcom-wl/files/lib/wifi/broadcom.sh    | 26 +++++++-
 4 files changed, 78 insertions(+), 26 deletions(-)
 delete mode 100644 package/base-files/brcm-2.4/etc/config/wireless

diff --git a/package/base-files/brcm-2.4/etc/config/wireless b/package/base-files/brcm-2.4/etc/config/wireless
deleted file mode 100644
index 9dc4945e07..0000000000
--- a/package/base-files/brcm-2.4/etc/config/wireless
+++ /dev/null
@@ -1,14 +0,0 @@
-# Copyright (C) 2006 OpenWrt.org
-
-config wifi-device	wl0
-	option type 	broadcom
-	option channel	5
-
-config wifi-iface
-	option device	wl0
-	option mode		ap
-	option ssid 	OpenWrt
-	option hidden	0
-	option encryption none
-
-
diff --git a/package/base-files/default/etc/init.d/S40network b/package/base-files/default/etc/init.d/S40network
index be045045e7..c7720369fd 100755
--- a/package/base-files/default/etc/init.d/S40network
+++ b/package/base-files/default/etc/init.d/S40network
@@ -6,6 +6,8 @@ start() {
 
 	include /lib/network
 	setup_switch
-	/sbin/wifi
+	[ -e /etc/config/wireless ] || \
+		/sbin/wifi detect > /etc/config/wireless
+	/sbin/wifi up
 }
 
diff --git a/package/base-files/default/sbin/wifi b/package/base-files/default/sbin/wifi
index 4a3ec8cfef..759cfb0a84 100755
--- a/package/base-files/default/sbin/wifi
+++ b/package/base-files/default/sbin/wifi
@@ -3,6 +3,49 @@
 
 . /etc/functions.sh
 
+wifi_up() {
+	for device in ${2:-$DEVICES}; do (
+		config_get iftype "$device" type
+		if eval "type enable_$iftype" 2>/dev/null >/dev/null; then
+			eval "scan_$iftype '$device'"
+			eval "enable_$iftype '$device'" || echo "$device($iftype): Setup failed"
+		else
+			echo "$device($iftype): Interface type not supported"
+		fi
+	); done
+}
+
+wifi_down() {
+	for device in ${2:-$DEVICES}; do (
+		config_get iftype "$device" type
+		if eval "type disable_$iftype" 2>/dev/null >/dev/null; then
+			eval "scan_$iftype '$device'"
+			eval "disable_$iftype '$device'" || echo "$device($iftype): Setup failed"
+		else
+			echo "$device($iftype): Interface type not supported"
+		fi
+	); done
+}
+
+wifi_detect() {
+	for driver in ${2:-$DRIVERS}; do (
+		if eval "type detect_$driver" 2>/dev/null >/dev/null; then
+			eval "detect_$driver" || echo "$driver: Detect failed" >&2
+		else
+			echo "$driver: Hardware detection not supported" >&2
+		fi
+	); done
+}
+
+start_net() {(
+	local iface="$1"
+	local config="$2"
+
+	include /lib/network
+	scan_interfaces
+	setup_interface "$1" "$2"
+)}
+
 config_get_bool() {
 	local _tmp
 	config_get "$1" "$2" "$3"
@@ -29,16 +72,13 @@ config_cb() {
 	esac
 }
 
+DEVICES=
+DRIVERS=
 config_load wireless
 include /lib/wifi
 
-for device in $DEVICES; do (
-	config_get iftype "$device" type
-	eval "type setup_$iftype" 2>/dev/null >/dev/null && {
-		eval "scan_$iftype '$device'"
-		eval "setup_$iftype '$device'" && {
-			# TODO: set up network settings
-			/bin/true
-		} || echo "$device($iftype): Setup failed" || true
-	} || echo "$device($iftype): Interface type not supported"
-); done
+case "$1" in
+	down) wifi_down "$2";;
+	detect) wifi_detect "$2";;
+	*) wifi_up "$2";;
+esac
diff --git a/package/broadcom-wl/files/lib/wifi/broadcom.sh b/package/broadcom-wl/files/lib/wifi/broadcom.sh
index 435c440e2e..1ce85c4c5f 100644
--- a/package/broadcom-wl/files/lib/wifi/broadcom.sh
+++ b/package/broadcom-wl/files/lib/wifi/broadcom.sh
@@ -1,3 +1,5 @@
+append DRIVERS "broadcom"
+
 bridge_interface() {
 	(
 		. /etc/functions.sh
@@ -71,8 +73,12 @@ scan_broadcom() {
 	esac
 }
 
+disable_broadcom() {
+	wlc down
+	ifconfig wl0 down
+}
 
-setup_broadcom() {
+enable_broadcom() {
 	local _c
 	config_get channel "$device" channel
 	config_get country "$device" country
@@ -175,3 +181,21 @@ EOF
 }
 
 
+detect_broadcom() {
+	[ -f /proc/net/wl0 ] || return
+	config_get type wl0 type
+	[ "$type" = broadcom ] && return
+	cat <<EOF
+config wifi-device  wl0
+	option type     broadcom
+	option channel  5
+
+config wifi-iface
+	option device   wl0
+	option mode     ap
+	option ssid     OpenWrt
+	option hidden   0
+	option encryption none
+
+EOF
+}
-- 
2.30.2