##############################################################################
#This software program is available to you under a choice of one of two 
#licenses. You may choose to be licensed under either the GNU General Public 
#License (GPL) Version 2, June 1991, available at 
#http://www.fsf.org/copyleft/gpl.html, or the Intel BSD + Patent License, the 
#text of which follows:
#
#Recipient has requested a license and Intel Corporation ("Intel") is willing
#to grant a license for the software entitled Linux Base Driver for the 
#Intel(R) PRO/100 Family of Adapters (e100) (the "Software") being provided 
#by Intel Corporation. The following definitions apply to this license:
#
#"Licensed Patents" means patent claims licensable by Intel Corporation which 
#are necessarily infringed by the use of sale of the Software alone or when 
#combined with the operating system referred to below.
#
#"Recipient" means the party to whom Intel delivers this Software.
#
#"Licensee" means Recipient and those third parties that receive a license to 
#any operating system available under the GNU Public License version 2.0 or 
#later.
#
#Copyright (c) 1999 - 2002 Intel Corporation.
#All rights reserved.
#
#The license is provided to Recipient and Recipient's Licensees under the 
#following terms.
#
#Redistribution and use in source and binary forms of the Software, with or 
#without modification, are permitted provided that the following conditions 
#are met:
#
#Redistributions of source code of the Software may retain the above 
#copyright notice, this list of conditions and the following disclaimer.
#
#Redistributions in binary form of the Software may reproduce the above 
#copyright notice, this list of conditions and the following disclaimer in 
#the documentation and/or materials provided with the distribution.
#
#Neither the name of Intel Corporation nor the names of its contributors 
#shall be used to endorse or promote products derived from this Software 
#without specific prior written permission.
#
#Intel hereby grants Recipient and Licensees a non-exclusive, worldwide, 
#royalty-free patent license under Licensed Patents to make, use, sell, offer 
#to sell, import and otherwise transfer the Software, if any, in source code 
#and object code form. This license shall include changes to the Software 
#that are error corrections or other minor changes to the Software that do 
#not add functionality or features when the Software is incorporated in any 
#version of an operating system that has been distributed under the GNU 
#General Public License 2.0 or later. This patent license shall apply to the 
#combination of the Software and any operating system licensed under the GNU 
#Public License version 2.0 or later if, at the time Intel provides the 
#Software to Recipient, such addition of the Software to the then publicly 
#available versions of such operating systems available under the GNU Public 
#License version 2.0 or later (whether in gold, beta or alpha form) causes 
#such combination to be covered by the Licensed Patents. The patent license 
#shall not apply to any other combinations which include the Software. NO 
#hardware per se is licensed hereunder.
#
#THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 
#AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
#IMPLIED WARRANTIES OF MECHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 
#ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR IT CONTRIBUTORS BE LIABLE FOR ANY 
#DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 
#(INCLUDING, BUT NOT LIMITED, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 
#ANY LOSS OF USE; DATA, OR PROFITS; OR BUSINESS INTERUPTION) HOWEVER CAUSED 
#AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY OR 
#TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 
#OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
##############################################################################

##############################################################################
# Configuration Section

# Optional features - set to 'y' for on, anything else for off
# Intel(R) Advanced Network Services
IANS := y
# Intel(R) PRO Diagnostics
IDIAG := y
#ETHTool ioctl interface support
E100_ETHIOCTL := y
#MII ioctl interface support
E100_MIIIOCTL := y
# debug
# CFLAGS += -g

##############################################################################
# Driver files

# core driver files
TARGET := e100.o
CFILES = e100_main.c eeprom.c e100_config.c e100_proc.c
HFILES = e100.h eeprom.h e100_config.h e100_proc.h e100_kcompat.h rcvbundl.h 

# iANS
IANS_CFLAGS = -DIANS -DIANS_BASE_ADAPTER_TEAMING \
              -DIANS_BASE_VLAN_TAGGING -DIANS_BASE_VLAN_ID
IANS_CFILES = ans.c ans_hw.c ans_os.c ans_driver.c
IANS_HFILES = base_comm.h  ans.h ans_hw.h ans_os.h ans_driver.h

# Diagnostics
IDIAG_CFLAGS = -DIDIAG_PRO_SUPPORT
IDIAG_CFILES = idiag_e100.c
IDIAG_HFILES = idiag_pro.h idiag_e100.h 

# Man
MAN_FILE = e100.7

# pick an appropriate MAN path
MAN_CFG := /etc/man.config
MAN_TYPE := man7
MSP := $(shell [ -e $(MAN_CFG) ] && grep -e "^MANPATH[^_]" $(MAN_CFG) | awk '{print $$2}')
ifeq (,$(MSP))
MSP :=	/usr/share/man \
	/usr/man
endif
# prune the list down to only values that exist
test_dir = $(shell [ -e $(dir)/$(MAN_TYPE) ] && echo $(dir))
MSP := $(foreach dir, $(MSP), $(test_dir))
# we will use the first valid entry in the search path
MAN_PATH := $(firstword $(MSP))
ifeq (,$(MAN_PATH))
  MAN_PATH := /usr/man
endif
MAN_INSTDIR=$(MAN_PATH)/$(MAN_TYPE)


###########################################################################
# Environment tests

# Kernel Search Path
# All the places we look for kernel source
KSP :=  /lib/modules/$(shell uname -r)/build \
        /usr/src/linux-$(shell uname -r) \
        /usr/src/linux-$(shell uname -r | sed 's/-.*//') \
        /usr/src/kernel-headers-$(shell uname -r) \
        /usr/src/kernel-source-$(shell uname -r) \
        /usr/src/linux-$(shell uname -r | sed 's/\([0-9]*\.[0-9]*\)\..*/\1/') \
        /usr/src/linux

# prune the list down to only values that exist
# and have an include/linux sub-directory
test_dir = $(shell [ -e $(dir)/include/linux ] && echo $(dir))
KSP := $(foreach dir, $(KSP), $(test_dir))

# we will use this first valid entry in the search path
KSRC := $(firstword $(KSP))

ifeq (,$(KSRC))
  $(error Linux kernel source not found)
endif

# files we get information from in KSRC
VERSION_FILE := $(KSRC)/include/linux/version.h
CONFIG_FILE  := $(KSRC)/include/linux/config.h

ifeq (,$(wildcard $(VERSION_FILE)))
  $(error Linux kernel source not configured - missing version.h)
endif

ifeq (,$(wildcard $(CONFIG_FILE)))
  $(error Linux kernel source not configured - missing config.h)
endif

# pick a compiler
ifneq (,$(findstring egcs-2.91.66, $(shell cat /proc/version)))
  CC := kgcc gcc cc
else
  CC := gcc cc
endif
test_cc = $(shell which $(cc) > /dev/null 2>&1 && echo $(cc))
CC := $(foreach cc, $(CC), $(test_cc))
CC := $(firstword $(CC))

# standard flags for module builds
CFLAGS += -Wall -DLINUX -D__KERNEL__ -DMODULE -DEXPORT_SYMTAB -D__NO_VERSION__ -O2 -pipe
CFLAGS += -I$(KSRC)/include -I. -Wstrict-prototypes -fomit-frame-pointer
CFLAGS += $(shell [ -f $(KSRC)/include/linux/modversions.h ] && \
            echo "-DMODVERSIONS -include $(KSRC)/include/linux/modversions.h")

# get the kernel version - we use this to find the correct install path
KVER := $(shell $(CC) $(CFLAGS) -E -dM $(VERSION_FILE) | grep UTS_RELEASE | \
          awk '{ print $$3 }' | sed 's/\"//g')

ifneq ($(KVER),$(shell uname -r))
  $(warning ***)
  $(warning *** Warning: kernel source version ($(KVER)))
  $(warning *** does not match running kernel  ($(shell uname -r)))
  $(warning *** Continuing with build,)
  $(warning *** resulting driver may not be what you want)
  $(warning ***)
endif

# pick an appropriate install path
INSTDIR := $(shell find /lib/modules/$(KVER) -name $(TARGET) -printf "%h\n" | sort | head -1)
ifeq (,$(INSTDIR))
  ifneq (,$(wildcard /lib/modules/$(KVER)/kernel))
    INSTDIR := /lib/modules/$(KVER)/kernel/drivers/net
  else
    INSTDIR := /lib/modules/$(KVER)/net
  endif
endif

# look for SMP in config.h
SMP := $(shell $(CC) $(CFLAGS) -E -dM $(CONFIG_FILE) | \
         grep CONFIG_SMP | awk '{ print $$3 }')
ifneq ($(SMP),1)
  SMP := 0
endif

ifneq ($(SMP),$(shell uname -a | grep SMP > /dev/null 2>&1 && echo 1 || echo 0))
  $(warning ***)
ifeq ($(SMP),1)
  $(warning *** Warning: kernel source configuration (SMP))
  $(warning *** does not match running kernel (UP))
else
  $(warning *** Warning: kernel source configuration (UP))
  $(warning *** does not match running kernel (SMP))
endif
  $(warning *** Continuing with build,)
  $(warning *** resulting driver may not be what you want)
  $(warning ***)
endif

ifeq ($(SMP), 1)
  CFLAGS += -D__SMP__
endif

# we need to know what platform the driver is being built on
# some additional features are only built on iA32
ARCH := $(shell uname -m | sed 's/i.86/i386/')
ifneq ($(ARCH),i386)
ifneq ($(ARCH),ia64)
  IANS := n
endif
endif

# iANS
ifeq ($(IANS),y)
  CFLAGS += $(IANS_CFLAGS)
  CFILES += $(IANS_CFILES)
  HFILES += $(IANS_HFILES)
endif

# Diagnostic features
ifeq ($(IDIAG),y)
  CFLAGS += $(IDIAG_CFLAGS)
  CFILES += $(IDIAG_CFILES)
  HFILES += $(IDIAG_HFILES)
endif


#ETHTOOL ioctl support
ifeq ($(E100_ETHIOCTL),y)
CFLAGS += -DE100_ETHTOOL_IOCTL
endif

#MII ioctl support
ifeq ($(E100_MIIIOCTL),y)
CFLAGS += -DE100_MII_IOCTL
endif



ifeq ($(ARCH),ia64)
  CFLAGS += -DSTB_WA 
endif


###########################################################################
# Build rules

.SILENT: $(TARGET)
$(TARGET): $(filter-out $(TARGET), $(CFILES:.c=.o))
	$(LD) -r $^ -o $@
	echo; echo
	echo "**************************************************"
	echo "** $(TARGET) built for $(KVER)"
	echo -n "** SMP             "
	if [ "$(SMP)" = "1" ]; \
		then echo "Enabled"; else echo "Disabled"; fi
	echo -n "** iANS hooks      "
	if [ "$(IANS)" = "y" ]; \
		then echo "Enabled"; else echo "Disabled"; fi
	echo -n "** PRO Diagnostics "
	if [ "$(IDIAG)" = "y" ]; \
		then echo "Enabled"; else echo "Disabled"; fi
	echo -n "** Ethtool IOCTL   "
	if [ "$(E100_ETHIOCTL)" = "y" ]; \
		then echo "Enabled"; else echo "Disabled"; fi
	echo -n "** MII IOCTL       "
	if [ "$(E100_MIIIOCTL)" = "y" ]; \
		then echo "Enabled"; else echo "Disabled"; fi
	echo "**************************************************"
	echo

$(CFILES:.c=.o): $(HFILES)

$(MAN_FILE).gz: $(MAN_FILE)
	gzip -c $< > $@

install: $(TARGET) $(MAN_FILE).gz
	mkdir -p $(INSTALL_MOD_PATH)$(INSTDIR)
	install -m 644 -o root $(TARGET) $(INSTALL_MOD_PATH)$(INSTDIR)
	mkdir -p $(INSTALL_MOD_PATH)$(MAN_INSTDIR)
	install -m 644 -o root $(MAN_FILE).gz $(INSTALL_MOD_PATH)$(MAN_INSTDIR)
ifeq (,$(INSTALL_MOD_PATH))
	/sbin/depmod -aq || true
else
	/sbin/depmod -b $(INSTALL_MOD_PATH) -aq || true
endif

uninstall:
	rm -f $(INSTDIR)/$(TARGET)
	rm -f $(MAN_INSTDIR)/$(MAN_FILE).gz
	/sbin/depmod -aq

clean:
	rm -f $(TARGET) $(CFILES:.c=.o) $(MAN_FILE).gz *~
