#
# Makefile 1.6.0   September 15, 2003
#
#
# 1. To make UP version of ISP2200 driver
#  make qla2200.o 
#
# 2. To make UP version of ISP2300 driver
#  make qla2300.o 
#
# 3. To make UP version of ISP2200 and ISP2300 drivers
#  make all 
#or 
#  make 
#
# To make SMP version of any of the above drivers
# append SMP=1 to one of the (3) make command lines above. 
#  make ... SMP=1
#
# To make a new firmware file (FILE must be a *.c file of the fw object)
#  make fw FILE2=2200tp.c
#

DRIVER=qla2200.o qla2300.o 

FILE2=2200tp.h
FILE3=ql2300ipx_fw.h
FILE4=ql2322ipx_fw.h

HOSTTYPE := $(shell uname -m)
SUSE_DIST := $(shell if [ -f /etc/SuSE-release ] ; then  echo y ; else echo n ; fi;)
#
# f/W include files
FWFILE2=ql2200_fw.h
FWFILE3=ql2300ipx_fw.h
FWFILE4=ql2322ipx_fw.h
FWFILE2IP=ql2200ip_fw.h

# Comment/uncomment the following line to enable/disable debugging
DEBUGFLAG=y
HSG80=n

# insmod does not like debugging enabled for PPC64
ifeq ($(HOSTTYPE),ppc64)
DEBUGFLAG=n
endif

QL_DEBUG=0x6

OSVER=linux-2.4

# Change it here or specify it on the "make" commandline
#(new)INCLUDEDIR = /lib/modules/`uname -r`/build/include
KERNELDIR = /usr/src/$(OSVER)
INCLUDEDIR = /usr/src/$(OSVER)/include

ifeq ($(DEBUGFLAG),y)
  DEBFLAGS = -O -g -DUDEBUG -DLINUX -Dlinux
else
  DEBFLAGS = -O2 -DLINUX -Dlinux
endif

CFLAGS = -D__KERNEL__ -DMODULE -Wall $(DEBFLAGS) -DINTAPI -DEXPORT_SYMTAB
#CFLAGS = -D__KERNEL__ -DMODULE -Wall $(DEBFLAGS) -DEXPORT_SYMTAB

# Handle GCC version variants 
# From linux kernel
check_gcc = $(shell if $(CC) $(1) -S -o /dev/null -xc /dev/null > /dev/null 2>&1; then echo "$(1)"; else echo "$(2)"; fi)

ifeq ($(HSG80),y)
CFLAGS += -DCOMPAQ
endif

# set MODVERSIONS if the kernel uses it
VERSUSED = $(shell grep 'define CONFIG_MODVERSIONS' \
           $(INCLUDEDIR)/linux/autoconf.h | wc -l | sed 's/ //g')
VERSUSED = 1

ifeq ($(VERSUSED),1)
CFLAGS += -DMODVERSIONS -include $(INCLUDEDIR)/linux/modversions.h
endif

CFLAGS += -I$(INCLUDEDIR) -I$(INCLUDEDIR)/../drivers/scsi
HOSTCC = $(CC)

ifeq ($(HOSTTYPE),i386)
CFLAGS += $(call check_gcc,-falign-functions=2 -falign-jumps=2 -falign-loops=2,-malign-functions=2 -malign-jumps=2 -malign-loops=2)
CFLAGS += -Wall -Wstrict-prototypes -fomit-frame-pointer -fno-strength-reduce \
-pipe \
-DCONFIG_X86_LOCAL_APIC -fno-strict-aliasing -fno-common \
-mpreferred-stack-boundary=2 -march=i386
endif

ifeq ($(HOSTTYPE),i486)
CFLAGS += $(call check_gcc,-falign-functions=2 -falign-jumps=2 -falign-loops=2,-malign-functions=2 -malign-jumps=2 -malign-loops=2)
CFLAGS += -Wall -Wstrict-prototypes -fomit-frame-pointer -fno-strength-reduce \
-pipe \
-DCONFIG_X86_LOCAL_APIC -fno-strict-aliasing -fno-common \
-mpreferred-stack-boundary=2 -march=i486
endif

ifeq ($(HOSTTYPE),i586)
CFLAGS += $(call check_gcc,-falign-functions=2 -falign-jumps=2 -falign-loops=2,-malign-functions=2 -malign-jumps=2 -malign-loops=2)
CFLAGS += -Wall -Wstrict-prototypes -fomit-frame-pointer -fno-strength-reduce \
-pipe \
-DCONFIG_X86_LOCAL_APIC -fno-strict-aliasing -fno-common \
-mpreferred-stack-boundary=2 -march=i586
endif

ifeq ($(HOSTTYPE),i686)
CFLAGS += $(call check_gcc,-falign-functions=2 -falign-jumps=2 -falign-loops=2,-malign-functions=2 -malign-jumps=2 -malign-loops=2)
CFLAGS += -Wall -Wstrict-prototypes -fomit-frame-pointer -fno-strength-reduce \
-pipe \
-DCONFIG_X86_LOCAL_APIC -fno-strict-aliasing -fno-common \
-mpreferred-stack-boundary=2 -march=i686
endif

ifeq ($(HOSTTYPE),ia64)
CFLAGS += -Wall -Wstrict-prototypes -fomit-frame-pointer -fno-strength-reduce \
-pipe
endif

ifeq ($(HOSTTYPE),alpha)
CFLAGS += -D__alpha__ \
-Wall -Wstrict-prototypes -fomit-frame-pointer -fno-strength-reduce \
-pipe  -fno-strict-aliasing -mno-fp-regs -ffixed-8 -mcpu=ev56 -Wa,-mev6
endif


ifeq ($(HOSTTYPE),ppc64)
# Assign the following path based on the distribution used
ifeq ($(SUSE_DIST),y)
CROSS_COMPILE=/opt/cross/bin/powerpc64-linux-
AS              = $(CROSS_COMPILE)as 
LD              = $(CROSS_COMPILE)ld
CC              = $(CROSS_COMPILE)gcc
CPP             = $(CC) -E 
AR              = $(CROSS_COMPILE)ar 
NM              = $(CROSS_COMPILE)nm
STRIP           = $(CROSS_COMPILE)strip 
OBJCOPY         = $(CROSS_COMPILE)objcopy 
OBJDUMP         = $(CROSS_COMPILE)objdump

CFLAGS += -Wall -Wstrict-prototypes -Wno-trigraphs -fomit-frame-pointer \
-fno-strict-aliasing -fno-common -fsigned-char -msoft-float -pipe \
-Wno-uninitialized -mminimal-toc -fno-builtin  
else
CFLAGS += -m64 -Wall -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing \
-fno-common  -Wno-unused -fomit-frame-pointer -fsigned-char -msoft-float \
-pipe -Wno-uninitialized -mminimal-toc -fno-builtin
endif
endif

ifeq ($(HOSTTYPE),x86_64)
CFLAGS += -Wall -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing \
-fno-common -fomit-frame-pointer -mno-red-zone -mcmodel=kernel -pipe \
-fno-reorder-blocks -finline-limit=2000 -fno-strength-reduce \
-fno-asynchronous-unwind-tables
endif
ifeq ("1","$(IP)")
CFLAGS += -DFC_IP_SUPPORT  
endif

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

SHT_FLAGS := $(CFLAGS)
check_sht = $(shell \
	if ! grep "$(1)" $(KERNELDIR)/drivers/scsi/hosts.h > /dev/null 2>&1 ; \
	then \
		echo "" ; \
		exit ; \
	fi ; \
	echo "\#include <linux/config.h>" > check_sht.c ; \
	echo "\#include <linux/version.h>" >> check_sht.c ; \
	echo "\#include <linux/types.h>" >> check_sht.c ; \
	echo "\#include <linux/init.h>" >> check_sht.c ; \
	echo "\#include <linux/blk.h>" >> check_sht.c ; \
	echo "\#include \"sd.h\"" >> check_sht.c ; \
	echo "\#include \"scsi.h\"" >> check_sht.c ; \
	echo "\#include \"hosts.h\"" >> check_sht.c ; \
	echo "struct SHT test_sht;" >> check_sht.c ; \
	echo "void test_func(void) { test_sht.$(1) = 1; }" >> check_sht.c ; \
	if $(CC) $(SHT_FLAGS) -o /dev/null -c check_sht.c > /dev/null 2>&1 ; \
	then \
		echo "$(2)" ; \
	fi ; \
	rm check_sht*)

CFLAGS += $(call check_sht,highmem_io,-DSHT_HAS_HIGHMEM_IO)
CFLAGS += $(call check_sht,can_dma_32,-DSHT_HAS_CAN_DMA_32)
CFLAGS += $(call check_sht,single_sg_ok,-DSHT_HAS_SINGLE_SG_OK)
CFLAGS += $(call check_sht,can_do_varyio,-DSHT_HAS_CAN_DO_VARYIO)
CFLAGS += $(call check_sht,vary_io,-DSHT_HAS_VARY_IO)
# RHEL3 -- usage removed
#CFLAGS += $(call check_sht,need_plug_timer,-DSHT_HAS_NEED_PLUG_TIMER)

SH_FLAGS := $(CFLAGS)
check_sh = $(shell \
	if ! grep "$(1)" $(KERNELDIR)/drivers/scsi/hosts.h > /dev/null 2>&1 ; \
	then \
		echo "" ; \
		exit ; \
	fi ; \
	echo "\#include <linux/config.h>" > check_sh.c ; \
	echo "\#include <linux/version.h>" >> check_sh.c ; \
	echo "\#include <linux/types.h>" >> check_sh.c ; \
	echo "\#include <linux/init.h>" >> check_sh.c ; \
	echo "\#include <linux/blk.h>" >> check_sh.c ; \
	echo "\#include \"sd.h\"" >> check_sh.c ; \
	echo "\#include \"scsi.h\"" >> check_sh.c ; \
	echo "\#include \"hosts.h\"" >> check_sh.c ; \
	echo "struct Scsi_Host test_sh;" >> check_sh.c ; \
	echo "void test_func(void) { test_sh.$(1) = 0; }" >> check_sh.c ; \
	if $(CC) $(SH_FLAGS) -o /dev/null -c check_sh.c > /dev/null 2>&1 ; \
	then \
		echo "$(2)" ; \
	fi ; \
	rm check_sh*)

CFLAGS += $(call check_sh,host_lock,-DSH_HAS_HOST_LOCK)
# RHEL3 -- usage removed
#CFLAGS += $(call check_sh,can_queue_mask,-DSH_HAS_CAN_QUEUE_MASK)

COFLAGS = -kv

MPATH = /lib/modules

SRC_FILES=qla_settings.h qla2x00.h qla2x00.c qla_cfg.c qla_cfg.h qla_cfgln.c \
qla_fo.h qla_fo.c qlfo.h qla2x00_ioctl.c qla_inioct.c qla_devtbl.h \
qla_mbx.c qla_mbx.h qla_debug.h	qla_version.h qla_ip.c qla_ip.h qla_gs.c \
qla_gs.h

ifeq ($(HOSTTYPE),ppc64)
SRC_FILES += qla_ppc64.c
endif
ifeq ($(HOSTTYPE),x86_64)
SRC_FILES += qla_ppc64.c
endif

KERNVER := $(shell uname -r)
LIBMODULES = /lib/modules/$(KERNVER)/kernel/drivers


# Where is all starts..
#
# -- default is always first.
default: $(DRIVER) 
	@echo ""
	@echo "You are running $(shell uname -r ). This is the kernel version that the QLogic driver has been compiled for."
	@echo ""

all:	 $(DRIVER) qla2200_conf.o qla2300_conf.o qla_opts

clean: 
	rm -f $(DRIVER) qla2300_conf.o qla2200_conf.o  qla_opts.o qla_opts

install: $(DRIVER) qla2200_conf.o qla2300_conf.o
	install -d -o root -g root $(LIBMODULES)/scsi/
	install -o root -g root $(DRIVER) $(LIBMODULES)/scsi/
	install -o root -g root qla2200_conf.o $(LIBMODULES)/scsi/
	install -o root -g root qla2300_conf.o $(LIBMODULES)/scsi/

	@if [ `grep -c "post-remove qla2200" /etc/modules.conf` -eq 0 ]; then \
                echo "post-remove qla2200 rmmod qla2200_conf" >> /etc/modules.conf;\
        fi
	@if [ `grep -c "post-remove qla2300" /etc/modules.conf` -eq 0 ]; then \
                echo "post-remove qla2300 rmmod qla2300_conf" >> /etc/modules.conf;\
        fi
	@if [ -f "$(LIBMODULES)/addon/qla2200/qla2200.o" ] ; then \
		mv $(LIBMODULES)/addon/qla2200/qla2200.o $(LIBMODULES)/addon/qla2200/qla2200_rh.o ; \
	fi
	@if [ -f "$(LIBMODULES)/addon/qla2200/qla2300.o" ] ; then \
		mv $(LIBMODULES)/addon/qla2200/qla2300.o $(LIBMODULES)/addon/qla2200/qla2300_rh.o ; \
	fi
	@if [ -f "$(LIBMODULES)/addon/qla2200/qla2200_conf.o" ] ; then \
		mv $(LIBMODULES)/addon/qla2200/qla2200_conf.o $(LIBMODULES)/addon/qla2200/qla2200_conf_rh.o ; \
	fi
	@if [ -f "$(LIBMODULES)/addon/qla2200/qla2300_conf.o" ] ; then \
		mv $(LIBMODULES)/addon/qla2200/qla2300_conf.o $(LIBMODULES)/addon/qla2200/qla2300_conf_rh.o ; \
	fi
	@if [ -f "$(LIBMODULES)/addon/qla2200_new/qla2200.o" ] ; then \
		mv $(LIBMODULES)/addon/qla2200_new/qla2200.o $(LIBMODULES)/addon/qla2200_new/qla2200_rh.o ; \
	fi
	@if [ -f "$(LIBMODULES)/addon/qla2200_new/qla2300.o" ] ; then \
		mv $(LIBMODULES)/addon/qla2200_new/qla2300.o $(LIBMODULES)/addon/qla2200_new/qla2300_rh.o ; \
	fi
	@if [ -f "$(LIBMODULES)/addon/qla2200_new/qla2200_conf.o" ] ; then \
		mv $(LIBMODULES)/addon/qla2200_new/qla2200_conf.o $(LIBMODULES)/addon/qla2200_new/qla2200_conf_rh.o ; \
	fi
	@if [ -f "$(LIBMODULES)/addon/qla2200_new/qla2300_conf.o" ] ; then \
		mv $(LIBMODULES)/addon/qla2200_new/qla2300_conf.o $(LIBMODULES)/addon/qla2200_new/qla2300_conf_rh.o ; \
	fi
	@if [ -f "$(LIBMODULES)/addon/qla2xxx/qla2200.o" ] ; then \
		mv $(LIBMODULES)/addon/qla2xxx/qla2200.o $(LIBMODULES)/addon/qla2xxx/qla2200_rh.o ; \
	fi
	@if [ -f "$(LIBMODULES)/addon/qla2xxx/qla2300.o" ] ; then \
		mv $(LIBMODULES)/addon/qla2xxx/qla2300.o $(LIBMODULES)/addon/qla2xxx/qla2300_rh.o ; \
	fi
	@if [ -f "$(LIBMODULES)/addon/qla2xxx/qla2200_conf.o" ] ; then \
		mv $(LIBMODULES)/addon/qla2xxx/qla2200_conf.o $(LIBMODULES)/addon/qla2xxx/qla2200_conf_rh.o ; \
	fi
	@if [ -f "$(LIBMODULES)/addon/qla2xxx/qla2300_conf.o" ] ; then \
		mv $(LIBMODULES)/addon/qla2xxx/qla2300_conf.o $(LIBMODULES)/addon/qla2xxx/qla2300_conf_rh.o ; \
	fi
	@if [ -f "/lib/modules/$(KERNVER)/updates/qla2300.o" ] ; then \
		mv /lib/modules/$(KERNVER)/updates/qla2300.o    /lib/modules/$(KERNVER)/updates/qla2300_rh.o ; \
	fi
	@if [ -f "/lib/modules/$(KERNVER)/updates/qla2300_conf.o" ] ; then \
		mv /lib/modules/$(KERNVER)/updates/qla2300_conf.o       /lib/modules/$(KERNVER)/updates/qla2300_conf_rh.o ; \
	fi
	@if [ -f "/etc/qla2200.conf" ] ; then \
		echo "qla2x00: Updating qla2200_conf module with /etc/qla2200.conf data..." ; \
		make qla_opts;	\
		./qla_opts -w qla2200_conf ; \
	fi  
	@if [ -f "/etc/qla2300.conf" ] ; then \
		echo "qla2x00: Updating qla2300_conf module with /etc/qla2300.conf data..." ; \
		make qla_opts;	\
		./qla_opts -w qla2300_conf ; \
	fi  
	depmod -a

install_qla_opts: qla_config qla_opts
	install -d -o root -g root /usr/local/sbin/
	install -o root -g root qla_opts /usr/local/sbin/
	@if [ -f "/etc/$${drv}.conf" ] ; then \
		echo "qla2x00: Updating qla_config module with /etc/$${drv}.conf data..." ; \
		./qla_opts -w qla_config ; \
	fi 

fw:
	mv $(FILE2) $(FWFILE2)
	mv $(FILE3) $(FWFILE3)
	mv $(FILE4) $(FWFILE4)

qla2100.o  : $(SRC_FILES)
	$(CC) $(CFLAGS) -c qla2100.c -o $@

qla2200.o  : $(SRC_FILES) $(FWFILE2)
	$(CC) $(CFLAGS) -c qla2200.c -o $@

qla2300.o  : $(SRC_FILES) $(FWFILE3) $(FWFILE4) qla_devtbl.h
	$(CC) $(CFLAGS) -c qla2300.c -o $@

qla2200_conf.o : qla2200_conf.c qla_opts.h makefile
	$(CC) $(CFLAGS) -c  qla2200_conf.c -o $@

qla2300_conf.o : qla2300_conf.c qla_opts.h makefile
	$(CC) $(CFLAGS) -c  qla2300_conf.c -o $@

qla_opts: qla_opts.c qla_opts.h makefile
	$(HOSTCC) -o qla_opts qla_opts.c
	chmod 700 qla_opts

# @echo "Editing file to produce -> [isp_fw.h]"
# sh do_fw.sh $(FILE) cvtfw
# @echo "Editing file to produce -> [isp1_fw.h]"
# sh do_fw.sh $(FILE2) cvtfw22
