#!/bin/sh
#
# This script walks the PCI bus looking for Intel wireless devices and 
# reports back if one is found.
#
# Copyright (C) 2005 Intel Corporation
#
SYSFS=$(sed -n 's#^.* \([^ ]*\) sysfs .*$#\1#p' /proc/mounts)

DRIVER=""

DEVICE_2100_1="0x8086 0x1043 0x8086 0x2520 2100"
DEVICE_2100_2="0x8086 0x1043 0x8086 0x2521 2100"
DEVICE_2100_3="0x8086 0x1043 0x8086 0x2524 2100"
DEVICE_2100_4="0x8086 0x1043 0x8086 0x2525 2100"
DEVICE_2100_5="0x8086 0x1043 0x8086 0x2526 2100"
DEVICE_2100_6="0x8086 0x1043 0x8086 0x2522 2100"
DEVICE_2100_7="0x8086 0x1043 0x8086 0x2523 2100"
DEVICE_2100_8="0x8086 0x1043 0x8086 0x2527 2100"
DEVICE_2100_9="0x8086 0x1043 0x8086 0x2528 2100"
DEVICE_2100_10="0x8086 0x1043 0x8086 0x2529 2100"
DEVICE_2100_11="0x8086 0x1043 0x8086 0x252B 2100"
DEVICE_2100_12="0x8086 0x1043 0x8086 0x252C 2100"
DEVICE_2100_13="0x8086 0x1043 0x8086 0x252D 2100"
DEVICE_2100_14="0x8086 0x1043 0x8086 0x2550 2100"
DEVICE_2100_15="0x8086 0x1043 0x8086 0x2551 2100"
DEVICE_2100_16="0x8086 0x1043 0x8086 0x2553 2100"
DEVICE_2100_17="0x8086 0x1043 0x8086 0x2554 2100"
DEVICE_2100_18="0x8086 0x1043 0x8086 0x2555 2100"
DEVICE_2100_19="0x8086 0x1043 0x8086 0x2560 2100"
DEVICE_2100_20="0x8086 0x1043 0x8086 0x2562 2100"
DEVICE_2100_21="0x8086 0x1043 0x8086 0x2563 2100"
DEVICE_2100_22="0x8086 0x1043 0x8086 0x2561 2100"
DEVICE_2100_23="0x8086 0x1043 0x8086 0x2565 2100"
DEVICE_2100_24="0x8086 0x1043 0x8086 0x2566 2100"
DEVICE_2100_25="0x8086 0x1043 0x8086 0x2567 2100"
DEVICE_2100_26="0x8086 0x1043 0x8086 0x2570 2100"
DEVICE_2100_27="0x8086 0x1043 0x8086 0x2580 2100"
DEVICE_2100_28="0x8086 0x1043 0x8086 0x2582 2100"
DEVICE_2100_29="0x8086 0x1043 0x8086 0x2583 2100"
DEVICE_2100_30="0x8086 0x1043 0x8086 0x2581 2100"
DEVICE_2100_31="0x8086 0x1043 0x8086 0x2585 2100"
DEVICE_2100_32="0x8086 0x1043 0x8086 0x2586 2100"
DEVICE_2100_33="0x8086 0x1043 0x8086 0x2587 2100"
DEVICE_2100_34="0x8086 0x1043 0x8086 0x2590 2100"
DEVICE_2100_35="0x8086 0x1043 0x8086 0x2592 2100"
DEVICE_2100_36="0x8086 0x1043 0x8086 0x2591 2100"
DEVICE_2100_37="0x8086 0x1043 0x8086 0x2593 2100"
DEVICE_2100_38="0x8086 0x1043 0x8086 0x2596 2100"
DEVICE_2100_39="0x8086 0x1043 0x8086 0x2598 2100"
DEVICE_2100_40="0x8086 0x1043 0x8086 0x25A0 2100"

DEVICE_2200_1="0x8086 0x1043 0x8086 0x2701 2200BG"
DEVICE_2200_2="0x8086 0x1043 0x8086 0x2702 2200BG"
DEVICE_2200_3="0x8086 0x1043 0x8086 0x2711 2200BG"
DEVICE_2200_4="0x8086 0x1043 0x8086 0x2712 2200BG"
DEVICE_2200_5="0x8086 0x1043 0x8086 0x2721 2200BG"
DEVICE_2200_6="0x8086 0x1043 0x8086 0x2722 2200BG"
DEVICE_2200_7="0x8086 0x1043 0x8086 0x2731 2200BG"
DEVICE_2200_8="0x8086 0x1043 0x8086 0x2732 2200BG"
DEVICE_2200_9="0x8086 0x1043 0x8086 0x2741 2200BG"
DEVICE_2200_10="0x8086 0x1043 0x103c 0x2741 2200BG"
DEVICE_2200_11="0x8086 0x1043 0x8086 0x2742 2200BG"
DEVICE_2200_12="0x8086 0x1043 0x8086 0x2751 2200BG"
DEVICE_2200_13="0x8086 0x1043 0x8086 0x2752 2200BG"
DEVICE_2200_14="0x8086 0x1043 0x8086 0x2753 2200BG"
DEVICE_2200_15="0x8086 0x1043 0x8086 0x2754 2200BG"
DEVICE_2200_16="0x8086 0x1043 0x8086 0x2761 2200BG"
DEVICE_2200_17="0x8086 0x1043 0x8086 0x2762 2200BG"
DEVICE_2200_18="0x8086 0x104f PCI_ANY_ID PCI_ANY_ID 2200BG"
DEVICE_2200_19="0x8086 0x4220 PCI_ANY_ID PCI_ANY_ID 2200BG" 
DEVICE_2200_20="0x8086 0x4221 PCI_ANY_ID PCI_ANY_ID 2200BG" 
DEVICE_2200_21="0x8086 0x4223 PCI_ANY_ID PCI_ANY_ID 2915ABG" 
DEVICE_2200_22="0x8086 0x4224 PCI_ANY_ID PCI_ANY_ID 2915ABG" 

check_arg() {
	PARM=$((5+2))
	DRIVER=${!PARM}
	PARM=$((${2}+2))
	PARM=${!PARM}
	[ ! -e ${1} ] && return 0
	[ "${PARM}" == "PCI_ANY_ID" ] && return 0
	[ `cat ${1}` = ${PARM} ] && return 0
	return 1
}

check_device() {
	for j in `seq 1 ${3}`; do
		DEVICE="DEVICE_${2}_${j}"
		DEVICE=${!DEVICE}
		SYPATH=${1}
		check_arg "${SYPATH}/vendor" 1 ${DEVICE} || continue
	 	check_arg "${SYPATH}/device" 2 ${DEVICE} || continue
	 	check_arg "${SYPATH}/subsystem_vendor" 3 ${DEVICE} || continue
	 	check_arg "${SYPATH}/subsystem_device" 4 ${DEVICE} || continue
		echo "Found: Intel PRO/Wireless ${DRIVER} Network Connection"
		echo "PCI location: ${SYPATH}"
		DRIVER="${2}"
		return 0
	done
	DRIVER=""
	return 1
}

find_device() {
	for i in ${SYSFS}/bus/pci/devices/*; do
		check_device ${i} 2200 22 && return 0
		check_device ${i} 2100 40 && return 0
	done

	return 1
}

find_device
if [ $? = 1 ]; then
	echo "You do not have the appropriate hardware."
	echo ""
	echo "Please verify that you do not have your miniPCI or wireless"
	echo "adapter disabled in your system's BIOS."
else
	echo ""
	echo "You need to use the driver: ipw${DRIVER} available at"
	echo "  http://ipw${DRIVER}.sf.net"
	echo ""
fi
