#!/usr/bin/make
# Makefile for building Linux Broadcom Gigabit L5 driver as a module.
# $id$
KVER=
ifeq ($(KVER),)
  KVER=$(shell uname -r)
endif

# PREFIX may be set by the RPM build to set the effective root.
PREFIX=

ifeq ($(FC2_INCLUDE),)
  # Obtain the current working directory.  $(PWD) doesn't work because this
  # makefile cannot override the $(PWD) definition of the parent makefile.
  BCMPWD = $(shell pwd)
  ifeq ($(shell test -e $(BCMPWD)/../../fclibs/include > /dev/null 2>&1 || echo notfound),)
    FC2_INCLUDE := $(BCMPWD)/../../fclibs/include
  else
      $(error fclibs package not found. $(BCMPWD))
  endif
  export FC2_INCLUDE
endif

ifeq ($(shell grep scsi_get_resid $(LINUXSRC)/include/scsi/*.h > /dev/null 2>&1 && echo resid_defined),)
  BRCM_FLAGS += -D_DEFINE_SCSI_GET_RESID
endif

ifeq ($(shell grep scsi_set_resid $(LINUXSRC)/include/scsi/*.h > /dev/null 2>&1 && echo resid_defined),)
  BRCM_FLAGS += -D_DEFINE_SCSI_SET_RESID
endif

# check if 2.4 kernel or 2.5+ kernel
BCM_KVER:=$(shell echo $(KVER) | cut -c1-3 | sed 's/2\.[56]/2\.6/')

ifeq ($(shell [ "$(BCM_KVER)" = "2.6" ] || [ "$(BCM_KVER)" = "3.0" ]),)
BCM_DRV = bnx2fc.ko


# Check distro/kernel compatibility
ifeq ($(INCDIR),)
    INCDIR:=$(CURDIR)
endif

include $(INCDIR)/version.mk
DISTRO_COMPATIBLE="no"

ifeq ($(DISTRO), "RHEL")
    ifeq ($(shell [ "$(MAJVER)" = "6" ] || echo notfound),)

        ifeq ($(shell [ "$(MINVER)" = "1" ] || echo notfound),)
            DISTRO_COMPATIBLE="yes"
        endif
#__BNX2FC_RHEL62__ directive is for Redhat versions 6.2 and above
        ifeq ($(shell [ "$(MINVER)" -ge "2" ] || echo notfound),)
            DISTRO_COMPATIBLE="yes"
            BNX2FC_SUP = -D__BNX2FC_RHEL62__
            export BNX2FC_SUP
        endif
    endif
endif

ifeq ($(DISTRO), "SLES")
    ifeq ($(shell [ "$(MAJVER)" = "11" ] || echo notfound),)
        ifeq ($(shell [ "$(MINVER)" = "1" ] || echo notfound),)
            DISTRO_COMPATIBLE="yes"

	    # In the future we might need to look at MINVER before setting this
            BNX2FC_SUP = -D__BNX2FC_SLES11SP1__ -I$(FC2_INCLUDE)
            export BNX2FC_SUP
        endif
        ifeq ($(shell [ "$(MINVER)" -ge "2" ] || echo notfound),)
            DISTRO_COMPATIBLE="yes"

	    # In the future we might need to look at MINVER before setting this
            BNX2FC_SUP = -D__BNX2FC_SLES11SP2__
            export BNX2FC_SUP
        endif
        ifeq ($(shell [ "$(MINVER)" = "3" ] || echo notfound),)
            DISTRO_COMPATIBLE="yes"

	    # In the future we might need to look at MINVER before setting this
            BNX2FC_SUP += -D__BNX2FC_SLES11SP3__
            export BNX2FC_SUP
        endif
    endif
endif

# For upstream there is no distro info. So RHEL or SLES is not detected. Set it
# based on the environment variable.  Run "BNX2FC_KERNEL_OVERRIDE=1 make"
ifeq ($(shell [ "$(DISTRO_COMPATIBLE)" = "no" ] || echo notfound),)
    ifeq ($(shell [ "$(BNX2FC_KERNEL_OVERRIDE)" = "1" ] || echo notfound),)
        DISTRO_COMPATIBLE="yes"
    else
        $(warning "Cannot compile bnx2fc on $(DISTRO) $(KVER)")
    endif
endif

ifeq ($(DISTRO_COMPATIBLE)$(KERNEL_COMPATIBLE), "yes""yes")
    BCM_BNX2FC_PFC=bnx2fc_pfc
    BCM_BNX2FC_BUILD=bnx2fc_build
    BCM_BNX2FC_CLEAN=bnx2fc_clean
    BCM_BNX2FC_INSTALL=bnx2fc_install
endif

default: build

ifneq ($(KERNELRELEASE),)
bnx2fc-objs := bnx2fc_fcoe.o bnx2fc_hwi.o bnx2fc_io.o bnx2fc_tgt.o bnx2fc_els.o bnx2fc_debugfs.o
obj-m += bnx2fc.o
EXTRA_CFLAGS += ${BRCM_FLAGS} ${BNX2FC_SUP}
else # ($(KERNELRELEASE),)
bnx2fc_build:
	make -C $(LINUX) SUBDIRS=$(shell pwd) modules INCDIR=$(INCDIR)
endif

else # ifeq ($(BCM_KVER),2.6)
  $(error bnx2fc is not supported on 2.4 kernel)
endif # ifeq ($(BCM_KVER),2.6)

bnx2fc_pfc:
	$(MAKE) PFC=1

bnx2fc_install:
	mkdir -p $(PREFIX)/lib/modules/$(KVER)/kernel/drivers/scsi;
	install -m 444 $(BCM_DRV) $(PREFIX)/lib/modules/$(KVER)/updates;
	@if [ "$(PREFIX)" = "" ]; then /sbin/depmod -a ;\
	else echo " *** Run '/sbin/depmod -a' to update the module database.";\
	fi

.PHONY: all clean install

bnx2fc_clean:
	rm -f bnx2fc.o bnx2fc.mod.[co] bnx2fc_fcoe.o bnx2fc_fcoe.mod.[co]
	rm -rf .*.swp
	rm -rf bnx2fc_hwi.o bnx2fc_hwi.mod.[co] 
	rm -rf bnx2fc_els.o bnx2fc_els.mod.[co] 
	rm -rf bnx2fc_tgt.o bnx2fc_tgt.mod.[co] 
	rm -rf bnx2fc_io.o bnx2fc_io.mod.[co] 
	rm -f *.ko .*.cmd

pfc: $(BCM_BNX2FC_PFC)
build: $(BCM_BNX2FC_BUILD)
clean: $(BCM_BNX2FC_CLEAN)
install: build $(BCM_BNX2FC_INSTALL)


cscope:
	find . -name "*.[ch]" > cscope.files
	cscope -bp3

tags:
	ctags -R
