# Makefile for DOR driver dh.o/dh.ko and control scripts
# John Jacobsen, jacobsen@npxdesigns.com
# $Id: Makefile,v 1.149 2006/09/13 18:15:36 jacobsen Exp $

VERSION         = `cat version.h | awk '{print $3}' | sed -e 's,\",,g'`
REV1_FIRMWARE   = com_104q.rbf           #<- KEEP FIRMWARE UPDATED!
REV0_FIRMWARE   = dor_011u.rbf           #<- KEEP FIRMWARE UPDATED!
NODSB_REV0_FW   = dor_020v.rbf           #<- non-DSB DOR rev 0 version
REV1_PCI_FW     = pci_009.rbf            #<- KEEP FIRMWARE UPDATED!

INSTALL         = /usr/local/dor
INSTALL_DRIVER  = $(INSTALL)/driver
INSTALL_FPGA    = $(INSTALL)/fpga
INSTALL_CONF    = $(INSTALL)/conf
INSTALL_BIN     = /usr/local/bin
INSTALL_RC      = /etc/init.d # Should work for both Ubuntu and RHEL
XINETD_DIR      = /etc/xinetd.d
FIRMWARE_CVS    = ../resources/dor-fpga
HEADERS_OK_FILE = .kernel_headers_present

# The headers are taken from the kernel
LINUXREV         = $(shell uname -r)
LINUXMAJOR       = $(word 1, $(subst ., ,$(LINUXREV)))
LINUXMINOR       = $(word 2, $(subst ., ,$(LINUXREV)))
LINUXVER         = $(LINUXMAJOR).$(LINUXMINOR)
INCLUDEDIR       = /lib/modules/$(LINUXREV)/build/include

KERNELDIR ?= /lib/modules/$(shell uname -r)/build
PWD       := $(shell pwd)

CFLAGS += -Wall -Wno-unused-variable -Wno-unused-function -Wno-declaration-after-statement
ifneq ($(KERNELRELEASE),)
obj-m := dh.o
else
KERNELDIR ?= /lib/modules/$(shell uname -r)/build
PWD       := $(shell pwd)

ifeq "$(LINUXVER)" "2.4"
   CFLAGS24 = -D__KERNEL__ -DMODULE -I$(INCLUDEDIR) -O2 -DKERNEL2_4
   default:
	make 'CFLAGS=$(CFLAGS) $(CFLAGS24)' dh.o 
else
   default:
	@echo "Kernel is $(LINUXREV), $(NODOTS), $(LINUXVER)"
	$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
endif

clean:
	rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions \#*\# $(HEADERS_OK_FILE)

endif


$(HEADERS_OK_FILE):
	./configure.pl $(HEADERS_OK_FILE) 

dh.o: dh.c dh.h dh_tcalib.h dhswpkt.h ackq.h dhbench.h retx.h ioq.h version.h dbgq.h \
	   $(HEADERS_OK_FILE)
	gcc $(CFLAGS) -c dh.c -o dh.o

install_all:
	@if [ ! -e /dev/dhc0w0dA ]; then make devfiles; fi
	@if [ ! -d $(INSTALL) ]; then mkdir $(INSTALL); fi
	@if [ ! -d $(INSTALL_FPGA) ]; then mkdir $(INSTALL_FPGA); fi
	@if [ ! -d $(INSTALL_DRIVER) ]; then mkdir $(INSTALL_DRIVER); fi
	@if [ ! -d $(INSTALL_CONF) ]; then mkdir $(INSTALL_CONF); fi
	@if [ ! -f $(INSTALL_CONF)/default_fpga_page ]; \
		then echo 0 > $(INSTALL_CONF)/default_fpga_page; fi
	install on $(INSTALL_BIN)
	install off $(INSTALL_BIN)
	install fvers.pl $(INSTALL_BIN)
	install clock $(INSTALL_BIN)
	install showcomms $(INSTALL_BIN)
	install decodefpga.pl $(INSTALL_BIN)
	install throughput $(INSTALL_BIN)
	install load_dor_params.pl $(INSTALL_BIN)
	install set_dor_params.pl $(INSTALL_BIN)
	install -m 666 dor_params.conf $(INSTALL_CONF)
	install anabench $(INSTALL_BIN)
	install fpga.pl $(INSTALL_BIN)
	ln -f -s $(INSTALL_BIN)/fpga.pl $(INSTALL_BIN)/fpga
	install $(FIRMWARE_CVS)/$(REV0_FIRMWARE) $(INSTALL_FPGA)
	install $(FIRMWARE_CVS)/$(REV1_FIRMWARE) $(INSTALL_FPGA)
	install $(FIRMWARE_CVS)/$(NODSB_REV0_FW) $(INSTALL_FPGA)
	install $(FIRMWARE_CVS)/$(REV1_PCI_FW)   $(INSTALL_FPGA)

	ln -f -s $(INSTALL_FPGA)/$(REV0_FIRMWARE) $(INSTALL_FPGA)/dor-current-rev0.rbf
	ln -f -s $(INSTALL_FPGA)/$(REV1_FIRMWARE) $(INSTALL_FPGA)/dor-current-rev1.rbf
	ln -f -s $(INSTALL_FPGA)/$(NODSB_REV0_FW) $(INSTALL_FPGA)/dor-current-rev0-nodsb.rbf
	install dhrc $(INSTALL_RC)

ifeq "$(LINUXVER)" "2.4"
   install:
	make install_all
	install dh.o $(INSTALL_DRIVER)
else
   install:
	make install_all
	install dh.ko $(INSTALL_DRIVER)
endif

# The following installs the latest firmware on DOR card page 1
# Skip this step if you do not want to overwrite page 1 on your
# DOR cards, or if you do not wish to automatically load page 1
# when your DOM Hub boots:
installfw:
	./installfirmware.pl -rev0 $(INSTALL_FPGA)/$(REV0_FIRMWARE) \
	                     -rev1 $(INSTALL_FPGA)/$(REV1_FIRMWARE) -page 1
	./configure_clock.pl external

installnodsb:
	./installfirmware.pl -rev0 $(INSTALL_FPGA)/$(NODSB_REV0_FW) \
	                     -rev1 $(INSTALL_FPGA)/$(REV1_FIRMWARE) -page 1
	./configure_clock.pl internal

# Only do this if you know what you're doing (parm_unlock_pages):
installpci:
	./installfirmware.pl -pci $(INSTALL_FPGA)/$(REV1_PCI_FW) -page 3

chkconfig:
	/sbin/chkconfig --level 2345 dhrc on
	/sbin/chkconfig --list | grep dhrc

devfiles:
	rm -f /dev/dhc?w?d?
	rm -f /dev/simc?w?d?
	touch /tmp/devfiles
	chmod 0600 /tmp/devfiles
	perl ./make_domhub_device_files.pl > /tmp/devfiles
	sh /tmp/devfiles
	rm /tmp/devfiles

uninstall:
	/bin/rm -rf $(INSTALL_FPGA) $(INSTALL_DRIVER) $(INSTALL_CONF)
	@if [ -d $(INSTALL) ]; then rmdir $(INSTALL); fi
	@if [ -f $(INSTALL_RC)/dhrc ]; then \
		/sbin/chkconfig --level 0123456 dhrc off; \
		/sbin/chkconfig --list | grep dhrc; \
	fi
	/bin/rm -f $(INSTALL_RC)/dhrc

	/bin/rm -f /dev/dhc*w?d?
	/bin/rm -f /dev/simc*w?d?
