From 3f43db5361c6869c470af596679de2f02c3befe1 Mon Sep 17 00:00:00 2001 From: cvs2git Date: Thu, 23 Apr 2009 00:37:08 +0000 Subject: This commit was manufactured by cvs2svn to create tag 'vers_20090214'. Sprout from base 2009-04-23 00:37:07 UTC Till Straumann ' - importing original version I had sent Joel on 20090214' Delete: bootstrap bsd_eth_drivers/Makefile bsd_eth_drivers/if_em/LICENSE bsd_eth_drivers/if_em/Makefile bsd_eth_drivers/if_em/README.rtems bsd_eth_drivers/if_em/freebsd_cvs_status bsd_eth_drivers/if_le/Makefile bsd_eth_drivers/if_le/README.rtems bsd_eth_drivers/if_le/am7990.c bsd_eth_drivers/if_le/if_le_cbus.c bsd_eth_drivers/if_le/if_le_isa.c bsd_eth_drivers/if_le/if_le_lebuffer.c bsd_eth_drivers/if_le/if_le_ledma.c bsd_eth_drivers/if_le/lebuffer_sbus.c bsd_eth_drivers/if_pcn/Makefile bsd_eth_drivers/if_pcn/README.rtems bsd_eth_drivers/if_re/Makefile.am bsd_eth_drivers/if_re/if_re.c bsd_eth_drivers/if_re/if_rlreg.h bsd_eth_drivers/libbsdport/Makefile bsd_eth_drivers/libbsdport/modini.c m4/acinclude.m4 m4/multilib-fix.m4 m4/multilib-installdir.m4 m4/rtems-bsp-postlink.m4 m4/rtems-isml.m4 m4/rtems-ismultibsp.m4 m4/rtems-multilib.m4 --- bootstrap | 45 - bsd_eth_drivers/Makefile | 11 - bsd_eth_drivers/if_em/LICENSE | 31 - bsd_eth_drivers/if_em/Makefile | 158 -- bsd_eth_drivers/if_em/README.rtems | 66 - bsd_eth_drivers/if_em/freebsd_cvs_status | 291 --- bsd_eth_drivers/if_le/Makefile | 152 -- bsd_eth_drivers/if_le/README.rtems | 80 - bsd_eth_drivers/if_le/am7990.c | 627 ------- bsd_eth_drivers/if_le/if_le_cbus.c | 451 ----- bsd_eth_drivers/if_le/if_le_isa.c | 509 ------ bsd_eth_drivers/if_le/if_le_lebuffer.c | 408 ----- bsd_eth_drivers/if_le/if_le_ledma.c | 490 ----- bsd_eth_drivers/if_le/lebuffer_sbus.c | 300 ---- bsd_eth_drivers/if_pcn/Makefile | 143 -- bsd_eth_drivers/if_pcn/README.rtems | 73 - bsd_eth_drivers/if_re/Makefile.am | 19 - bsd_eth_drivers/if_re/if_re.c | 2890 ------------------------------ bsd_eth_drivers/if_re/if_rlreg.h | 993 ---------- bsd_eth_drivers/libbsdport/Makefile | 116 -- bsd_eth_drivers/libbsdport/modini.c | 100 -- m4/acinclude.m4 | 16 - m4/multilib-fix.m4 | 78 - m4/multilib-installdir.m4 | 21 - m4/rtems-bsp-postlink.m4 | 32 - m4/rtems-isml.m4 | 11 - m4/rtems-ismultibsp.m4 | 23 - m4/rtems-multilib.m4 | 28 - 28 files changed, 8162 deletions(-) delete mode 100755 bootstrap delete mode 100644 bsd_eth_drivers/Makefile delete mode 100644 bsd_eth_drivers/if_em/LICENSE delete mode 100644 bsd_eth_drivers/if_em/Makefile delete mode 100644 bsd_eth_drivers/if_em/README.rtems delete mode 100644 bsd_eth_drivers/if_em/freebsd_cvs_status delete mode 100644 bsd_eth_drivers/if_le/Makefile delete mode 100644 bsd_eth_drivers/if_le/README.rtems delete mode 100644 bsd_eth_drivers/if_le/am7990.c delete mode 100644 bsd_eth_drivers/if_le/if_le_cbus.c delete mode 100644 bsd_eth_drivers/if_le/if_le_isa.c delete mode 100644 bsd_eth_drivers/if_le/if_le_lebuffer.c delete mode 100644 bsd_eth_drivers/if_le/if_le_ledma.c delete mode 100644 bsd_eth_drivers/if_le/lebuffer_sbus.c delete mode 100644 bsd_eth_drivers/if_pcn/Makefile delete mode 100644 bsd_eth_drivers/if_pcn/README.rtems delete mode 100644 bsd_eth_drivers/if_re/Makefile.am delete mode 100644 bsd_eth_drivers/if_re/if_re.c delete mode 100644 bsd_eth_drivers/if_re/if_rlreg.h delete mode 100644 bsd_eth_drivers/libbsdport/Makefile delete mode 100644 bsd_eth_drivers/libbsdport/modini.c delete mode 100644 m4/acinclude.m4 delete mode 100644 m4/multilib-fix.m4 delete mode 100644 m4/multilib-installdir.m4 delete mode 100644 m4/rtems-bsp-postlink.m4 delete mode 100644 m4/rtems-isml.m4 delete mode 100644 m4/rtems-ismultibsp.m4 delete mode 100644 m4/rtems-multilib.m4 diff --git a/bootstrap b/bootstrap deleted file mode 100755 index d0762ad..0000000 --- a/bootstrap +++ /dev/null @@ -1,45 +0,0 @@ -#!/bin/sh - -localhack= -while getopts "lf" theopt ; do - case $theopt in - l) - localhack=yes - ;; - f) - force=--force - ;; - *) - ;; - esac -done - -if test -d cexp ; then - (cd cexp; make src) -fi - -for val in cexp/binutils* binutils* ; do - if test -d "$val" ; then - echo "*************** ERROR Found $val;" - echo "You must run `basename $0` before unpacking 'binutils';" - echo "Please move the 'binutils' directory temporarily out of the source tree," - echo "run `basename $0` and then move binutils back" - exit 1 - fi -done - -if test "$localhack" = "yes" ; then -# for some strange reason it is not -# possible to pass autoreconf an option -# directing it to search directories -# for '.m4' files for aclocal. The '-I/-B' -# options don't seem to work. We hack -# around this by setting ACLOCAL - if test "${ACLOCAL+set}" = "set" ; then - echo "Warning: ACLOCAL is already set; I add a -I option"; - else - ACLOCAL=aclocal - fi - export ACLOCAL="$ACLOCAL -I `(cd \`dirname $0\`; pwd)`/autognu" -fi -autoreconf -i $force diff --git a/bsd_eth_drivers/Makefile b/bsd_eth_drivers/Makefile deleted file mode 100644 index 175dea6..0000000 --- a/bsd_eth_drivers/Makefile +++ /dev/null @@ -1,11 +0,0 @@ -# -# Makefile.dir,v 1.4 2000/06/12 15:00:14 joel Exp -# - -include $(RTEMS_MAKEFILE_PATH)/Makefile.inc - -include $(RTEMS_CUSTOM) -include $(RTEMS_ROOT)/make/directory.cfg - -SUBDIRS=libbsdport if_em if_pcn if_le - diff --git a/bsd_eth_drivers/if_em/LICENSE b/bsd_eth_drivers/if_em/LICENSE deleted file mode 100644 index 7e13aa1..0000000 --- a/bsd_eth_drivers/if_em/LICENSE +++ /dev/null @@ -1,31 +0,0 @@ -$FreeBSD: src/sys/dev/em/LICENSE,v 1.6 2007/05/04 00:00:11 jfv Exp $ - - Copyright (c) 2001-2007, Intel Corporation - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - - 3. Neither the name of the Intel Corporation nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - - 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 MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) 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. - diff --git a/bsd_eth_drivers/if_em/Makefile b/bsd_eth_drivers/if_em/Makefile deleted file mode 100644 index ea0d776..0000000 --- a/bsd_eth_drivers/if_em/Makefile +++ /dev/null @@ -1,158 +0,0 @@ -# -# Makefile.leaf,v 1.7 2002/07/22 22:56:09 joel Exp -# -# Templates/Makefile.leaf -# Template leaf node Makefile -# -# -LIBNAME=libif_em.a - -ENBL_82542_SUPPORT=NO -ENBL_ICH8LAN_SUPPORT=YES - -CPPFLAGS_82542_SUPPORT_NO=-DNO_82542_SUPPORT -C_PIECES_82542_SUPPORT_YES=e1000_82542 -CPPFLAGS_ICH8LAN_SUPPORT_NO=-DNO_ICH8LAN_SUPPORT -C_PIECES_ICH8LAN_SUPPORT_YES=e1000_ich8lan - -# C source names, if any, go here -- minus the .c -C_PIECES= - -C_PIECES+=e1000_80003es2lan -C_PIECES+=e1000_82540 -C_PIECES+=e1000_82541 -C_PIECES+=$(C_PIECES_82542_SUPPORT_$(ENBL_82542_SUPPORT)) -C_PIECES+=e1000_82543 -C_PIECES+=e1000_82571 -C_PIECES+=e1000_82575 -C_PIECES+=e1000_api -C_PIECES+=$(C_PIECES_ICH8LAN_SUPPORT_$(ENBL_ICH8LAN_SUPPORT)) -C_PIECES+=e1000_mac -C_PIECES+=e1000_manage -C_PIECES+=e1000_nvm -C_PIECES+=e1000_phy - -C_PIECES+=if_em - -C_FILES=$(C_PIECES:%=%.c) -C_O_FILES=$(C_PIECES:%=${ARCH}/%.o) - -# C++ source names, if any, go here -- minus the .cc -CC_PIECES= -CC_FILES=$(CC_PIECES:%=%.cc) -CC_O_FILES=$(CC_PIECES:%=${ARCH}/%.o) - -H_FILES= - -# Assembly source names, if any, go here -- minus the .S -S_PIECES= -S_FILES=$(S_PIECES:%=%.S) -S_O_FILES=$(S_FILES:%.S=${ARCH}/%.o) - -SRCS=$(C_FILES) $(CC_FILES) $(H_FILES) $(S_FILES) -OBJS=$(C_O_FILES) $(CC_O_FILES) $(S_O_FILES) - -# If your PGMS target has the '.exe' extension, a statically -# linked application is generated. -# If it has a '.obj' extension, a loadable module is built. -# -# -ifdef LIBNAME -LIB=${ARCH}/${LIBNAME} -else -PGMS=${ARCH}/if_em.obj -endif - -# List of RTEMS Classic API Managers to be included in the application -# goes here. Use: -# MANAGERS=all -# to include all RTEMS Classic API Managers in the application or -# something like this to include a specific set of managers. -# MANAGERS=io event message rate_monotonic semaphore timer -# -# UNUSED for loadable modules -MANAGERS=ALL - -ifndef RTEMS_MAKEFILE_PATH -$(error you need to set the RTEMS_MAKEFILE_PATH environment variable) -endif - -include $(RTEMS_MAKEFILE_PATH)/Makefile.inc - -include $(RTEMS_CUSTOM) -ifdef LIBNAME -include $(RTEMS_ROOT)/make/lib.cfg -else -include $(RTEMS_ROOT)/make/leaf.cfg -endif - -# -# (OPTIONAL) Add local stuff here using += -# - -DEFINES += -CPPFLAGS += -I. -I../libbsdport -I../libbsdport/dummyheaders -CPPFLAGS += $(CPPFLAGS_82542_SUPPORT_$(ENBL_82542_SUPPORT)) -CPPFLAGS += $(CPPFLAGS_ICH8LAN_SUPPORT_$(ENBL_ICH8LAN_SUPPORT)) -CFLAGS += - -# -# CFLAGS_DEBUG_V are used when the `make debug' target is built. -# To link your application with the non-optimized RTEMS routines, -# uncomment the following line: -# CFLAGS_DEBUG_V += -qrtems_debug -# - -LD_PATHS += -LD_LIBS += -LDFLAGS += - -# -# Add your list of files to delete here. The config files -# already know how to delete some stuff, so you may want -# to just run 'make clean' first to see what gets missed. -# 'make clobber' already includes 'make clean' -# - -CLEAN_ADDITIONS += -CLOBBER_ADDITIONS += - -all: ${ARCH} $(SRCS) $(PGMS) ${LIB} - -#How to make a relocatable object -$(filter %.obj, $(PGMS)): ${OBJS} - $(make-obj) - -#How to make an executable (statically linked) -$(filter %.exe,$(PGMS)): ${LINK_FILES} - $(make-exe) -ifdef ELFEXT -ifdef XSYMS - $(XSYMS) $(@:%.exe=%.$(ELFEXT)) $(@:%.exe=%.sym) -endif -endif - -$(LIB): ${OBJS} - $(make-library) - -ifndef RTEMS_SITE_INSTALLDIR -RTEMS_SITE_INSTALLDIR = $(PROJECT_RELEASE) -endif - -${RTEMS_SITE_INSTALLDIR}/include \ -${RTEMS_SITE_INSTALLDIR}/lib \ -${RTEMS_SITE_INSTALLDIR}/bin: - test -d $@ || mkdir -p $@ -# Install the program(s), appending _g or _p as appropriate. -# for include files, just use $(INSTALL_CHANGE) -# -# - Some BSPs might generate bootable executables in yet another -# format (such as .srec) and you might need to extend the rule -# below so the essential files get installed. YMMV. -ifdef LIBNAME -install: all $(RTEMS_SITE_INSTALLDIR)/lib - $(INSTALL_VARIANT) -m 644 ${LIB} ${RTEMS_SITE_INSTALLDIR}/lib -else -install: all $(RTEMS_SITE_INSTALLDIR)/bin - $(INSTALL_VARIANT) -m 555 ${PGMS} ${PGMS:%.exe=%.bin} ${PGMS:%.exe=%.sym} ${RTEMS_SITE_INSTALLDIR}/bin -endif diff --git a/bsd_eth_drivers/if_em/README.rtems b/bsd_eth_drivers/if_em/README.rtems deleted file mode 100644 index 88fa2fb..0000000 --- a/bsd_eth_drivers/if_em/README.rtems +++ /dev/null @@ -1,66 +0,0 @@ -RTEMS PORT OF THE 'em' ETHERNET DRIVER -====================================== - -This is a port of the intel / FreeBSD 'em' driver as of -2007/7/4 (checked out from FreeBSD/head on that date). - -SUPPORTED BSPs: -- you need 'libbsdport' which in turn needs 'libbspExt' - These work for i386/pc386 and powerpc/new-exception-processing - BSPs, i.e., the BSP must implement and . - -USAGE: -- to attach this driver: - * define a NULL terminated list with all libbsdport supported - drivers you want to include with your application: - - extern driver_t libbsdport_em_driver; - - driver_t *libbsdport_netdriver_table[] = { - &libbsdport_em_driver, - /* other drivers here or upstream of 'em' if they support - * the same hardware but are preferred. - */ - 0 - }; - - * specify libbsdport_netdriver_attach for the 'attach' function - pointer in struct rtems_bsdnet_ifconfig. - - * use the 'name' field in struct rtems_bsdnet_ifconfig to filter - drivers and device instances: - - - - either may be omitted which means that the next available - driver/hardware device is to be used. Here are a few examples: - - "" /* use first device found supported by any driver in the - * libbsdport_driver_table[]. - */ - - "em2" /* use second device supported by the 'em' driver */ - - Notes: Counting instances begins with 1 (not 0). - Consult libbsdport/README for more information. - - -KNOWN ISSUES: -- 'ignore_broadcast' and 'mtu' settings from - struct rtems_bsdnet_ifconfig are ignored. I haven't seen - many drivers that honour 'ignore_broadcast' and 'mtu' can be - set using a ioctl(). I'm trying to keep changes to BSD sources - minimal... -- ring sizes are restricted (driver validates sizes and uses - defaults if requested sizes don't meet requirements). - -TESTED WITH: - 82544 on motorola MVME5500 (PPC MVE board) - 82573 on concurrent technologies PP410 (intel x86) board - -TESTED ON: - rtems-4.7 - powerpc/beatnik (motorola MVME5500) - i386/pc686 (concurrent technologies PP410 compact PCI) - -T.S, 200707 diff --git a/bsd_eth_drivers/if_em/freebsd_cvs_status b/bsd_eth_drivers/if_em/freebsd_cvs_status deleted file mode 100644 index da6f8b8..0000000 --- a/bsd_eth_drivers/if_em/freebsd_cvs_status +++ /dev/null @@ -1,291 +0,0 @@ -FreeBSD checkout at 2007-07-04 00:49 PDT - -? freebsd_cvs_status -=================================================================== -File: LICENSE Status: Up-to-date - - Working revision: 1.6 - Repository revision: 1.6 /home/ncvs/src/sys/dev/em/LICENSE,v - Sticky Tag: (none) - Sticky Date: (none) - Sticky Options: (none) - -=================================================================== -File: README Status: Up-to-date - - Working revision: 1.15 - Repository revision: 1.15 /home/ncvs/src/sys/dev/em/README,v - Sticky Tag: (none) - Sticky Date: (none) - Sticky Options: (none) - -=================================================================== -File: e1000_80003es2lan.c Status: Up-to-date - - Working revision: 1.3 - Repository revision: 1.3 /home/ncvs/src/sys/dev/em/e1000_80003es2lan.c,v - Sticky Tag: (none) - Sticky Date: (none) - Sticky Options: (none) - -=================================================================== -File: e1000_80003es2lan.h Status: Up-to-date - - Working revision: 1.3 - Repository revision: 1.3 /home/ncvs/src/sys/dev/em/e1000_80003es2lan.h,v - Sticky Tag: (none) - Sticky Date: (none) - Sticky Options: (none) - -=================================================================== -File: e1000_82540.c Status: Up-to-date - - Working revision: 1.3 - Repository revision: 1.3 /home/ncvs/src/sys/dev/em/e1000_82540.c,v - Sticky Tag: (none) - Sticky Date: (none) - Sticky Options: (none) - -=================================================================== -File: e1000_82541.c Status: Up-to-date - - Working revision: 1.3 - Repository revision: 1.3 /home/ncvs/src/sys/dev/em/e1000_82541.c,v - Sticky Tag: (none) - Sticky Date: (none) - Sticky Options: (none) - -=================================================================== -File: e1000_82541.h Status: Up-to-date - - Working revision: 1.3 - Repository revision: 1.3 /home/ncvs/src/sys/dev/em/e1000_82541.h,v - Sticky Tag: (none) - Sticky Date: (none) - Sticky Options: (none) - -=================================================================== -File: e1000_82542.c Status: Up-to-date - - Working revision: 1.3 - Repository revision: 1.3 /home/ncvs/src/sys/dev/em/e1000_82542.c,v - Sticky Tag: (none) - Sticky Date: (none) - Sticky Options: (none) - -=================================================================== -File: e1000_82543.c Status: Up-to-date - - Working revision: 1.3 - Repository revision: 1.3 /home/ncvs/src/sys/dev/em/e1000_82543.c,v - Sticky Tag: (none) - Sticky Date: (none) - Sticky Options: (none) - -=================================================================== -File: e1000_82543.h Status: Up-to-date - - Working revision: 1.3 - Repository revision: 1.3 /home/ncvs/src/sys/dev/em/e1000_82543.h,v - Sticky Tag: (none) - Sticky Date: (none) - Sticky Options: (none) - -=================================================================== -File: e1000_82571.c Status: Up-to-date - - Working revision: 1.3 - Repository revision: 1.3 /home/ncvs/src/sys/dev/em/e1000_82571.c,v - Sticky Tag: (none) - Sticky Date: (none) - Sticky Options: (none) - -=================================================================== -File: e1000_82571.h Status: Up-to-date - - Working revision: 1.3 - Repository revision: 1.3 /home/ncvs/src/sys/dev/em/e1000_82571.h,v - Sticky Tag: (none) - Sticky Date: (none) - Sticky Options: (none) - -=================================================================== -File: e1000_82575.c Status: Up-to-date - - Working revision: 1.3 - Repository revision: 1.3 /home/ncvs/src/sys/dev/em/e1000_82575.c,v - Sticky Tag: (none) - Sticky Date: (none) - Sticky Options: (none) - -=================================================================== -File: e1000_82575.h Status: Up-to-date - - Working revision: 1.3 - Repository revision: 1.3 /home/ncvs/src/sys/dev/em/e1000_82575.h,v - Sticky Tag: (none) - Sticky Date: (none) - Sticky Options: (none) - -=================================================================== -File: e1000_api.c Status: Up-to-date - - Working revision: 1.3 - Repository revision: 1.3 /home/ncvs/src/sys/dev/em/e1000_api.c,v - Sticky Tag: (none) - Sticky Date: (none) - Sticky Options: (none) - -=================================================================== -File: e1000_api.h Status: Up-to-date - - Working revision: 1.3 - Repository revision: 1.3 /home/ncvs/src/sys/dev/em/e1000_api.h,v - Sticky Tag: (none) - Sticky Date: (none) - Sticky Options: (none) - -=================================================================== -File: e1000_defines.h Status: Up-to-date - - Working revision: 1.3 - Repository revision: 1.3 /home/ncvs/src/sys/dev/em/e1000_defines.h,v - Sticky Tag: (none) - Sticky Date: (none) - Sticky Options: (none) - -=================================================================== -File: e1000_hw.h Status: Up-to-date - - Working revision: 1.3 - Repository revision: 1.3 /home/ncvs/src/sys/dev/em/e1000_hw.h,v - Sticky Tag: (none) - Sticky Date: (none) - Sticky Options: (none) - -=================================================================== -File: e1000_ich8lan.c Status: Up-to-date - - Working revision: 1.3 - Repository revision: 1.3 /home/ncvs/src/sys/dev/em/e1000_ich8lan.c,v - Sticky Tag: (none) - Sticky Date: (none) - Sticky Options: (none) - -=================================================================== -File: e1000_ich8lan.h Status: Up-to-date - - Working revision: 1.3 - Repository revision: 1.3 /home/ncvs/src/sys/dev/em/e1000_ich8lan.h,v - Sticky Tag: (none) - Sticky Date: (none) - Sticky Options: (none) - -=================================================================== -File: e1000_mac.c Status: Up-to-date - - Working revision: 1.3 - Repository revision: 1.3 /home/ncvs/src/sys/dev/em/e1000_mac.c,v - Sticky Tag: (none) - Sticky Date: (none) - Sticky Options: (none) - -=================================================================== -File: e1000_mac.h Status: Up-to-date - - Working revision: 1.3 - Repository revision: 1.3 /home/ncvs/src/sys/dev/em/e1000_mac.h,v - Sticky Tag: (none) - Sticky Date: (none) - Sticky Options: (none) - -=================================================================== -File: e1000_manage.c Status: Up-to-date - - Working revision: 1.3 - Repository revision: 1.3 /home/ncvs/src/sys/dev/em/e1000_manage.c,v - Sticky Tag: (none) - Sticky Date: (none) - Sticky Options: (none) - -=================================================================== -File: e1000_manage.h Status: Up-to-date - - Working revision: 1.3 - Repository revision: 1.3 /home/ncvs/src/sys/dev/em/e1000_manage.h,v - Sticky Tag: (none) - Sticky Date: (none) - Sticky Options: (none) - -=================================================================== -File: e1000_nvm.c Status: Up-to-date - - Working revision: 1.3 - Repository revision: 1.3 /home/ncvs/src/sys/dev/em/e1000_nvm.c,v - Sticky Tag: (none) - Sticky Date: (none) - Sticky Options: (none) - -=================================================================== -File: e1000_nvm.h Status: Up-to-date - - Working revision: 1.3 - Repository revision: 1.3 /home/ncvs/src/sys/dev/em/e1000_nvm.h,v - Sticky Tag: (none) - Sticky Date: (none) - Sticky Options: (none) - -=================================================================== -File: e1000_osdep.h Status: Up-to-date - - Working revision: 1.3 - Repository revision: 1.3 /home/ncvs/src/sys/dev/em/e1000_osdep.h,v - Sticky Tag: (none) - Sticky Date: (none) - Sticky Options: (none) - -=================================================================== -File: e1000_phy.c Status: Up-to-date - - Working revision: 1.3 - Repository revision: 1.3 /home/ncvs/src/sys/dev/em/e1000_phy.c,v - Sticky Tag: (none) - Sticky Date: (none) - Sticky Options: (none) - -=================================================================== -File: e1000_phy.h Status: Up-to-date - - Working revision: 1.3 - Repository revision: 1.3 /home/ncvs/src/sys/dev/em/e1000_phy.h,v - Sticky Tag: (none) - Sticky Date: (none) - Sticky Options: (none) - -=================================================================== -File: e1000_regs.h Status: Up-to-date - - Working revision: 1.3 - Repository revision: 1.3 /home/ncvs/src/sys/dev/em/e1000_regs.h,v - Sticky Tag: (none) - Sticky Date: (none) - Sticky Options: (none) - -=================================================================== -File: if_em.c Status: Up-to-date - - Working revision: 1.181 - Repository revision: 1.181 /home/ncvs/src/sys/dev/em/if_em.c,v - Sticky Tag: (none) - Sticky Date: (none) - Sticky Options: (none) - -=================================================================== -File: if_em.h Status: Up-to-date - - Working revision: 1.61 - Repository revision: 1.61 /home/ncvs/src/sys/dev/em/if_em.h,v - Sticky Tag: (none) - Sticky Date: (none) - Sticky Options: (none) - diff --git a/bsd_eth_drivers/if_le/Makefile b/bsd_eth_drivers/if_le/Makefile deleted file mode 100644 index ab71264..0000000 --- a/bsd_eth_drivers/if_le/Makefile +++ /dev/null @@ -1,152 +0,0 @@ -# -# Makefile.leaf,v 1.7 2002/07/22 22:56:09 joel Exp -# -# Templates/Makefile.leaf -# Template leaf node Makefile -# -# -LIBNAME=libif_le.a - -# C source names, if any, go here -- minus the .c -C_PIECES= - -C_PIECES+=lance am79900 if_le_pci - -C_FILES=$(C_PIECES:%=%.c) -C_O_FILES=$(C_PIECES:%=${ARCH}/%.o) - -# C++ source names, if any, go here -- minus the .cc -CC_PIECES= -CC_FILES=$(CC_PIECES:%=%.cc) -CC_O_FILES=$(CC_PIECES:%=${ARCH}/%.o) - -H_FILES= - -LINKS+=dev/le/lancereg.h -LINKS+=dev/le/lancevar.h -LINKS+=dev/le/am79900reg.h -LINKS+=dev/le/am79900var.h - -# Assembly source names, if any, go here -- minus the .S -S_PIECES= -S_FILES=$(S_PIECES:%=%.S) -S_O_FILES=$(S_FILES:%.S=${ARCH}/%.o) - -SRCS=$(C_FILES) $(CC_FILES) $(H_FILES) $(S_FILES) -OBJS=$(C_O_FILES) $(CC_O_FILES) $(S_O_FILES) - -# If your PGMS target has the '.exe' extension, a statically -# linked application is generated. -# If it has a '.obj' extension, a loadable module is built. -# -# -ifdef LIBNAME -LIB=${ARCH}/${LIBNAME} -else -PGMS=${ARCH}/if_pcn.obj -endif - -# List of RTEMS Classic API Managers to be included in the application -# goes here. Use: -# MANAGERS=all -# to include all RTEMS Classic API Managers in the application or -# something like this to include a specific set of managers. -# MANAGERS=io event message rate_monotonic semaphore timer -# -# UNUSED for loadable modules -MANAGERS=ALL - -all: - -depend: ${LINKS} - -ifndef RTEMS_MAKEFILE_PATH -$(error you need to set the RTEMS_MAKEFILE_PATH environment variable) -endif - -include $(RTEMS_MAKEFILE_PATH)/Makefile.inc - -include $(RTEMS_CUSTOM) -ifdef LIBNAME -include $(RTEMS_ROOT)/make/lib.cfg -else -include $(RTEMS_ROOT)/make/leaf.cfg -endif - -# -# (OPTIONAL) Add local stuff here using += -# - -#DEFINES += -DLEDEBUG -CPPFLAGS += -I. -I../libbsdport -I../libbsdport/dummyheaders -CPPFLAGS += $(CPPFLAGS_82542_SUPPORT_$(ENBL_82542_SUPPORT)) -CFLAGS += - -# -# CFLAGS_DEBUG_V are used when the `make debug' target is built. -# To link your application with the non-optimized RTEMS routines, -# uncomment the following line: -# CFLAGS_DEBUG_V += -qrtems_debug -# - -LD_PATHS += -LD_LIBS += -LDFLAGS += - -# -# Add your list of files to delete here. The config files -# already know how to delete some stuff, so you may want -# to just run 'make clean' first to see what gets missed. -# 'make clobber' already includes 'make clean' -# - -CLEAN_ADDITIONS += -CLOBBER_ADDITIONS += $(sort $(foreach n,$(LINKS),$(firstword $(subst /, ,$(n))))) - -all: ${LINKS} ${ARCH} $(SRCS) $(PGMS) ${LIB} - -#How to make a relocatable object -$(filter %.obj, $(PGMS)): ${OBJS} - $(make-obj) - -#How to make an executable (statically linked) -$(filter %.exe,$(PGMS)): ${LINK_FILES} - $(make-exe) -ifdef ELFEXT -ifdef XSYMS - $(XSYMS) $(@:%.exe=%.$(ELFEXT)) $(@:%.exe=%.sym) -endif -endif - -$(LIB): ${OBJS} - $(make-library) - -ifndef RTEMS_SITE_INSTALLDIR -RTEMS_SITE_INSTALLDIR = $(PROJECT_RELEASE) -endif - -# for each name listed in LINKS, create parent directories (if needed) -# and a symlink to file in . -# E.g., LINKS=a/b/c.h -# creates a/b/c.h -> ../../c.h -$(LINKS): - @if [ ! -d $(dir $@) ] ; then mkdir -p $(dir $@); fi - @ln -s `echo $@ | sed -e 's%[^/]\+[/]\+%../%g'` $@ - -${RTEMS_SITE_INSTALLDIR}/include \ -${RTEMS_SITE_INSTALLDIR}/lib \ -${RTEMS_SITE_INSTALLDIR}/bin: - test -d $@ || mkdir -p $@ -# Install the program(s), appending _g or _p as appropriate. -# for include files, just use $(INSTALL_CHANGE) -# -# - Some BSPs might generate bootable executables in yet another -# format (such as .srec) and you might need to extend the rule -# below so the essential files get installed. YMMV. -ifdef LIBNAME -install: all $(RTEMS_SITE_INSTALLDIR)/lib - $(INSTALL_VARIANT) -m 644 ${LIB} ${RTEMS_SITE_INSTALLDIR}/lib -else -install: all $(RTEMS_SITE_INSTALLDIR)/bin - $(INSTALL_VARIANT) -m 555 ${PGMS} ${PGMS:%.exe=%.bin} ${PGMS:%.exe=%.sym} ${RTEMS_SITE_INSTALLDIR}/bin -endif diff --git a/bsd_eth_drivers/if_le/README.rtems b/bsd_eth_drivers/if_le/README.rtems deleted file mode 100644 index 829e1d8..0000000 --- a/bsd_eth_drivers/if_le/README.rtems +++ /dev/null @@ -1,80 +0,0 @@ -RTEMS PORT OF THE 'le' ETHERNET DRIVER -====================================== - -This is a port of the FreeBSD 'le' driver as of -2007/7/21 (checked out from FreeBSD/head on that date). - -SUPPORTED BSPs: -- you need 'libbsdport' which in turn needs 'libbspExt' - These work for i386/pc386 and powerpc/new-exception-processing - BSPs, i.e., the BSP must implement and . - -USAGE: -- to attach this driver: - * define a NULL terminated list with all libbsdport supported - drivers you want to include with your application: - - extern driver_t libbsdport_le_pci_driver; - - driver_t *libbsdport_netdriver_table[] = { - &libbsdport_le_pci_driver, - /* other drivers here or upstream of 'le' if they support - * the same hardware but are preferred. - */ - 0 - }; - - * specify libbsdport_netdriver_attach for the 'attach' function - pointer in struct rtems_bsdnet_ifconfig. - - * use the 'name' field in struct rtems_bsdnet_ifconfig to filter - drivers and device instances: - - - - either may be omitted which means that the next available - driver/hardware device is to be used. Here are a few examples: - - "" /* use first device found supported by any driver in the - * libbsdport_driver_table[]. - */ - - "le1" /* use first device supported by the 'le' driver */ - - Notes: Counting instances begins with 1 (not 0). - Consult libbsdport/README for more information. - - -KNOWN ISSUES: -- only the PCI module has been ported, so far. No ISA (yet). - This means that only the - am79900*.* - lance*.* - if_le_pci.c - files are really used. Other files are left here for reference. -- media status (SIOCGIFMEDIA) doesn't work. sc_mediastatus - is not set so the media is always reported as 0. -- 'ignore_broadcast' and 'mtu' settings from - struct rtems_bsdnet_ifconfig are ignored. I haven't seen - many drivers that honour 'ignore_broadcast' and 'mtu' can be - set using a ioctl(). I'm trying to keep changes to BSD sources - minimal... -- ring sizes are restricted to powers of 2. - -OTHER NOTES: -- you can use the 'pcn' driver for 79C971 and upwards - chips. 'pcn' supposedly uses more advanced features - of those chips. -- 'le' works with qemu's 'pcnet32' Am79C970A emulation :-) - -TESTED WITH: - Technobox 10/100-TX Ethernet PMC (AMD Am79C973 chip) - qemu 'pcnet32' emulation - -TESTED ON: - rtems-4.7 - powerpc/beatnik (motorola MVME5500 and MVME6100 VME boards) - i386/pc686 (concurrent technologies PP410 compact PCI) - qemu emulator - -T.S, 200707 diff --git a/bsd_eth_drivers/if_le/am7990.c b/bsd_eth_drivers/if_le/am7990.c deleted file mode 100644 index 9768dd8..0000000 --- a/bsd_eth_drivers/if_le/am7990.c +++ /dev/null @@ -1,627 +0,0 @@ -/* $NetBSD: am7990.c,v 1.68 2005/12/11 12:21:25 christos Exp $ */ - -/*- - * Copyright (c) 1997, 1998 The NetBSD Foundation, Inc. - * All rights reserved. - * - * This code is derived from software contributed to The NetBSD Foundation - * by Charles M. Hannum and by Jason R. Thorpe of the Numerical Aerospace - * Simulation Facility, NASA Ames Research Center. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the NetBSD - * Foundation, Inc. and its contributors. - * 4. Neither the name of The NetBSD Foundation nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS - * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS - * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) 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. - */ - -/*- - * Copyright (c) 1992, 1993 - * The Regents of the University of California. All rights reserved. - * - * This code is derived from software contributed to Berkeley by - * Ralph Campbell and Rick Macklem. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * 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. - * - * @(#)if_le.c 8.2 (Berkeley) 11/16/93 - */ - -#include -__FBSDID("$FreeBSD: src/sys/dev/le/am7990.c,v 1.4 2006/12/06 02:14:31 marius Exp $"); - -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include - -#include - -#include -#include -#include -#include - -static void am7990_meminit(struct lance_softc *); -static void am7990_rint(struct lance_softc *); -static void am7990_tint(struct lance_softc *); -static void am7990_start_locked(struct lance_softc *sc); - -#ifdef LEDEBUG -static void am7990_recv_print(struct lance_softc *, int); -static void am7990_xmit_print(struct lance_softc *, int); -#endif - -int -am7990_config(struct am7990_softc *sc, const char* name, int unit) -{ - int error, mem; - - sc->lsc.sc_meminit = am7990_meminit; - sc->lsc.sc_start_locked = am7990_start_locked; - - error = lance_config(&sc->lsc, name, unit); - if (error != 0) - return (error); - - mem = 0; - sc->lsc.sc_initaddr = mem; - mem += sizeof(struct leinit); - sc->lsc.sc_rmdaddr = mem; - mem += sizeof(struct lermd) * sc->lsc.sc_nrbuf; - sc->lsc.sc_tmdaddr = mem; - mem += sizeof(struct letmd) * sc->lsc.sc_ntbuf; - sc->lsc.sc_rbufaddr = mem; - mem += LEBLEN * sc->lsc.sc_nrbuf; - sc->lsc.sc_tbufaddr = mem; - mem += LEBLEN * sc->lsc.sc_ntbuf; - - if (mem > sc->lsc.sc_memsize) - panic("%s: memsize", __func__); - - lance_attach(&sc->lsc); - - return (0); -} - -void -am7990_detach(struct am7990_softc *sc) -{ - - lance_detach(&sc->lsc); -} - -/* - * Set up the initialization block and the descriptor rings. - */ -static void -am7990_meminit(struct lance_softc *sc) -{ - struct ifnet *ifp = sc->sc_ifp; - struct leinit init; - struct lermd rmd; - struct letmd tmd; - u_long a; - int bix; - - LE_LOCK_ASSERT(sc, MA_OWNED); - - if (ifp->if_flags & IFF_PROMISC) - init.init_mode = LE_MODE_NORMAL | LE_MODE_PROM; - else - init.init_mode = LE_MODE_NORMAL; - - init.init_padr[0] = (sc->sc_enaddr[1] << 8) | sc->sc_enaddr[0]; - init.init_padr[1] = (sc->sc_enaddr[3] << 8) | sc->sc_enaddr[2]; - init.init_padr[2] = (sc->sc_enaddr[5] << 8) | sc->sc_enaddr[4]; - lance_setladrf(sc, init.init_ladrf); - - sc->sc_last_rd = 0; - sc->sc_first_td = sc->sc_last_td = sc->sc_no_td = 0; - - a = sc->sc_addr + LE_RMDADDR(sc, 0); - init.init_rdra = a; - init.init_rlen = (a >> 16) | ((ffs(sc->sc_nrbuf) - 1) << 13); - - a = sc->sc_addr + LE_TMDADDR(sc, 0); - init.init_tdra = a; - init.init_tlen = (a >> 16) | ((ffs(sc->sc_ntbuf) - 1) << 13); - - (*sc->sc_copytodesc)(sc, &init, LE_INITADDR(sc), sizeof(init)); - - /* - * Set up receive ring descriptors. - */ - for (bix = 0; bix < sc->sc_nrbuf; bix++) { - a = sc->sc_addr + LE_RBUFADDR(sc, bix); - rmd.rmd0 = a; - rmd.rmd1_hadr = a >> 16; - rmd.rmd1_bits = LE_R1_OWN; - rmd.rmd2 = -LEBLEN | LE_XMD2_ONES; - rmd.rmd3 = 0; - (*sc->sc_copytodesc)(sc, &rmd, LE_RMDADDR(sc, bix), - sizeof(rmd)); - } - - /* - * Set up transmit ring descriptors. - */ - for (bix = 0; bix < sc->sc_ntbuf; bix++) { - a = sc->sc_addr + LE_TBUFADDR(sc, bix); - tmd.tmd0 = a; - tmd.tmd1_hadr = a >> 16; - tmd.tmd1_bits = 0; - tmd.tmd2 = LE_XMD2_ONES; - tmd.tmd3 = 0; - (*sc->sc_copytodesc)(sc, &tmd, LE_TMDADDR(sc, bix), - sizeof(tmd)); - } -} - -static void -am7990_rint(struct lance_softc *sc) -{ - struct ifnet *ifp = sc->sc_ifp; - struct mbuf *m; - struct lermd rmd; - int bix, rp; -#if defined(LANCE_REVC_BUG) - struct ether_header *eh; - /* Make sure this is short-aligned, for ether_cmp(). */ - static uint16_t bcast_enaddr[3] = { ~0, ~0, ~0 }; -#endif - - bix = sc->sc_last_rd; - - /* Process all buffers with valid data. */ - for (;;) { - rp = LE_RMDADDR(sc, bix); - (*sc->sc_copyfromdesc)(sc, &rmd, rp, sizeof(rmd)); - - if (rmd.rmd1_bits & LE_R1_OWN) - break; - - m = NULL; - if ((rmd.rmd1_bits & (LE_R1_ERR | LE_R1_STP | LE_R1_ENP)) != - (LE_R1_STP | LE_R1_ENP)) { - if (rmd.rmd1_bits & LE_R1_ERR) { -#ifdef LEDEBUG - if (rmd.rmd1_bits & LE_R1_ENP) { - if ((rmd.rmd1_bits & LE_R1_OFLO) == 0) { - if (rmd.rmd1_bits & LE_R1_FRAM) - if_printf(ifp, - "framing error\n"); - if (rmd.rmd1_bits & LE_R1_CRC) - if_printf(ifp, - "crc mismatch\n"); - } - } else - if (rmd.rmd1_bits & LE_R1_OFLO) - if_printf(ifp, "overflow\n"); -#endif - if (rmd.rmd1_bits & LE_R1_BUFF) - if_printf(ifp, - "receive buffer error\n"); - } else if ((rmd.rmd1_bits & (LE_R1_STP | LE_R1_ENP)) != - (LE_R1_STP | LE_R1_ENP)) - if_printf(ifp, "dropping chained buffer\n"); - } else { -#ifdef LEDEBUG - if (sc->sc_flags & LE_DEBUG) - am7990_recv_print(sc, bix); -#endif - /* Pull the packet off the interface. */ - m = lance_get(sc, LE_RBUFADDR(sc, bix), - (int)rmd.rmd3 - ETHER_CRC_LEN); - } - - rmd.rmd1_bits = LE_R1_OWN; - rmd.rmd2 = -LEBLEN | LE_XMD2_ONES; - rmd.rmd3 = 0; - (*sc->sc_copytodesc)(sc, &rmd, rp, sizeof(rmd)); - - if (++bix == sc->sc_nrbuf) - bix = 0; - - if (m != NULL) { - ifp->if_ipackets++; - -#ifdef LANCE_REVC_BUG - /* - * The old LANCE (Rev. C) chips have a bug which - * causes garbage to be inserted in front of the - * received packet. The workaround is to ignore - * packets with an invalid destination address - * (garbage will usually not match). - * Of course, this precludes multicast support... - */ - eh = mtod(m, struct ether_header *); - if (ether_cmp(eh->ether_dhost, sc->sc_enaddr) && - ether_cmp(eh->ether_dhost, bcast_enaddr)) { - m_freem(m); - continue; - } -#endif - - /* Pass the packet up. */ - LE_UNLOCK(sc); - (*ifp->if_input)(ifp, m); - LE_LOCK(sc); - } else - ifp->if_ierrors++; - } - - sc->sc_last_rd = bix; -} - -static void -am7990_tint(struct lance_softc *sc) -{ - struct ifnet *ifp = sc->sc_ifp; - struct letmd tmd; - int bix; - - bix = sc->sc_first_td; - - for (;;) { - if (sc->sc_no_td <= 0) - break; - - (*sc->sc_copyfromdesc)(sc, &tmd, LE_TMDADDR(sc, bix), - sizeof(tmd)); - -#ifdef LEDEBUG - if (sc->sc_flags & LE_DEBUG) - if_printf(ifp, "trans tmd: " - "ladr %04x, hadr %02x, flags %02x, " - "bcnt %04x, mcnt %04x\n", - tmd.tmd0, tmd.tmd1_hadr, tmd.tmd1_bits, - tmd.tmd2, tmd.tmd3); -#endif - - if (tmd.tmd1_bits & LE_T1_OWN) - break; - - ifp->if_drv_flags &= ~IFF_DRV_OACTIVE; - - if (tmd.tmd1_bits & LE_T1_ERR) { - if (tmd.tmd3 & LE_T3_BUFF) - if_printf(ifp, "transmit buffer error\n"); - else if (tmd.tmd3 & LE_T3_UFLO) - if_printf(ifp, "underflow\n"); - if (tmd.tmd3 & (LE_T3_BUFF | LE_T3_UFLO)) { - lance_init_locked(sc); - return; - } - if (tmd.tmd3 & LE_T3_LCAR) { - if (sc->sc_flags & LE_CARRIER) - if_link_state_change(ifp, - LINK_STATE_DOWN); - sc->sc_flags &= ~LE_CARRIER; - if (sc->sc_nocarrier) - (*sc->sc_nocarrier)(sc); - else - if_printf(ifp, "lost carrier\n"); - } - if (tmd.tmd3 & LE_T3_LCOL) - ifp->if_collisions++; - if (tmd.tmd3 & LE_T3_RTRY) { -#ifdef LEDEBUG - if_printf(ifp, "excessive collisions, tdr %d\n", - tmd.tmd3 & LE_T3_TDR_MASK); -#endif - ifp->if_collisions += 16; - } - ifp->if_oerrors++; - } else { - if (tmd.tmd1_bits & LE_T1_ONE) - ifp->if_collisions++; - else if (tmd.tmd1_bits & LE_T1_MORE) - /* Real number is unknown. */ - ifp->if_collisions += 2; - ifp->if_opackets++; - } - - if (++bix == sc->sc_ntbuf) - bix = 0; - - --sc->sc_no_td; - } - - sc->sc_first_td = bix; - - sc->sc_wdog_timer = sc->sc_no_td > 0 ? 5 : 0; -} - -/* - * Controller interrupt - */ -void -am7990_intr(void *arg) -{ - struct lance_softc *sc = arg; - struct ifnet *ifp = sc->sc_ifp; - uint16_t isr; - - LE_LOCK(sc); - - if (sc->sc_hwintr && (*sc->sc_hwintr)(sc) == -1) { - ifp->if_ierrors++; - lance_init_locked(sc); - LE_UNLOCK(sc); - return; - } - - isr = (*sc->sc_rdcsr)(sc, LE_CSR0); -#if defined(LEDEBUG) && LEDEBUG > 1 - if (sc->sc_flags & LE_DEBUG) - if_printf(ifp, "%s: entering with isr=%04x\n", __func__, isr); -#endif - if ((isr & LE_C0_INTR) == 0) { - LE_UNLOCK(sc); - return; - } - - /* - * Clear interrupt source flags and turn off interrupts. If we - * don't clear these flags before processing their sources we - * could completely miss some interrupt events as the NIC can - * change these flags while we're in this handler. We turn off - * interrupts so we don't get another RX interrupt while still - * processing the previous one in ifp->if_input() with the - * driver lock dropped. - */ - (*sc->sc_wrcsr)(sc, LE_CSR0, isr & ~(LE_C0_INEA | LE_C0_TDMD | - LE_C0_STOP | LE_C0_STRT | LE_C0_INIT)); - - if (isr & LE_C0_ERR) { - if (isr & LE_C0_BABL) { -#ifdef LEDEBUG - if_printf(ifp, "babble\n"); -#endif - ifp->if_oerrors++; - } -#if 0 - if (isr & LE_C0_CERR) { - if_printf(ifp, "collision error\n"); - ifp->if_collisions++; - } -#endif - if (isr & LE_C0_MISS) { -#ifdef LEDEBUG - if_printf(ifp, "missed packet\n"); -#endif - ifp->if_ierrors++; - } - if (isr & LE_C0_MERR) { - if_printf(ifp, "memory error\n"); - lance_init_locked(sc); - LE_UNLOCK(sc); - return; - } - } - - if ((isr & LE_C0_RXON) == 0) { - if_printf(ifp, "receiver disabled\n"); - ifp->if_ierrors++; - lance_init_locked(sc); - LE_UNLOCK(sc); - return; - } - if ((isr & LE_C0_TXON) == 0) { - if_printf(ifp, "transmitter disabled\n"); - ifp->if_oerrors++; - lance_init_locked(sc); - LE_UNLOCK(sc); - return; - } - - /* - * Pretend we have carrier; if we don't this will be cleared shortly. - */ - if (!(sc->sc_flags & LE_CARRIER)) - if_link_state_change(ifp, LINK_STATE_UP); - sc->sc_flags |= LE_CARRIER; - - if (isr & LE_C0_RINT) - am7990_rint(sc); - if (isr & LE_C0_TINT) - am7990_tint(sc); - - /* Enable interrupts again. */ - (*sc->sc_wrcsr)(sc, LE_CSR0, LE_C0_INEA); - - if (!IFQ_DRV_IS_EMPTY(&ifp->if_snd)) - am7990_start_locked(sc); - - LE_UNLOCK(sc); -} - -/* - * Set up output on interface. - * Get another datagram to send off of the interface queue, and map it to the - * interface before starting the output. - */ -static void -am7990_start_locked(struct lance_softc *sc) -{ - struct ifnet *ifp = sc->sc_ifp; - struct letmd tmd; - struct mbuf *m; - int bix, enq, len, rp; - - LE_LOCK_ASSERT(sc, MA_OWNED); - - if ((ifp->if_drv_flags & (IFF_DRV_RUNNING | IFF_DRV_OACTIVE)) != - IFF_DRV_RUNNING) - return; - - bix = sc->sc_last_td; - enq = 0; - - for (; sc->sc_no_td < sc->sc_ntbuf && - !IFQ_DRV_IS_EMPTY(&ifp->if_snd);) { - rp = LE_TMDADDR(sc, bix); - (*sc->sc_copyfromdesc)(sc, &tmd, rp, sizeof(tmd)); - - if (tmd.tmd1_bits & LE_T1_OWN) { - ifp->if_drv_flags |= IFF_DRV_OACTIVE; - if_printf(ifp, - "missing buffer, no_td = %d, last_td = %d\n", - sc->sc_no_td, sc->sc_last_td); - } - - IFQ_DRV_DEQUEUE(&ifp->if_snd, m); - if (m == 0) - break; - - /* - * If BPF is listening on this interface, let it see the packet - * before we commit it to the wire. - */ - BPF_MTAP(ifp, m); - - /* - * Copy the mbuf chain into the transmit buffer. - */ - len = lance_put(sc, LE_TBUFADDR(sc, bix), m); - -#ifdef LEDEBUG - if (len > ETHERMTU + ETHER_HDR_LEN) - if_printf(ifp, "packet length %d\n", len); -#endif - - /* - * Init transmit registers, and set transmit start flag. - */ - tmd.tmd1_bits = LE_T1_OWN | LE_T1_STP | LE_T1_ENP; - tmd.tmd2 = -len | LE_XMD2_ONES; - tmd.tmd3 = 0; - - (*sc->sc_copytodesc)(sc, &tmd, rp, sizeof(tmd)); - -#ifdef LEDEBUG - if (sc->sc_flags & LE_DEBUG) - am7990_xmit_print(sc, bix); -#endif - - (*sc->sc_wrcsr)(sc, LE_CSR0, LE_C0_INEA | LE_C0_TDMD); - enq++; - - if (++bix == sc->sc_ntbuf) - bix = 0; - - if (++sc->sc_no_td == sc->sc_ntbuf) { - ifp->if_drv_flags |= IFF_DRV_OACTIVE; - break; - } - } - - sc->sc_last_td = bix; - - if (enq > 0) - sc->sc_wdog_timer = 5; -} - -#ifdef LEDEBUG -static void -am7990_recv_print(struct lance_softc *sc, int no) -{ - struct ifnet *ifp = sc->sc_ifp; - struct ether_header eh; - struct lermd rmd; - uint16_t len; - - (*sc->sc_copyfromdesc)(sc, &rmd, LE_RMDADDR(sc, no), sizeof(rmd)); - len = rmd.rmd3; - if_printf(ifp, "receive buffer %d, len = %d\n", no, len); - if_printf(ifp, "status %04x\n", (*sc->sc_rdcsr)(sc, LE_CSR0)); - if_printf(ifp, - "ladr %04x, hadr %02x, flags %02x, bcnt %04x, mcnt %04x\n", - rmd.rmd0, rmd.rmd1_hadr, rmd.rmd1_bits, rmd.rmd2, rmd.rmd3); - if (len - ETHER_CRC_LEN >= sizeof(eh)) { - (*sc->sc_copyfrombuf)(sc, &eh, LE_RBUFADDR(sc, no), sizeof(eh)); - if_printf(ifp, "dst %s", ether_sprintf(eh.ether_dhost)); - printf(" src %s type %04x\n", ether_sprintf(eh.ether_shost), - ntohs(eh.ether_type)); - } -} - -static void -am7990_xmit_print(struct lance_softc *sc, int no) -{ - struct ifnet *ifp = sc->sc_ifp; - struct ether_header eh; - struct letmd tmd; - uint16_t len; - - (*sc->sc_copyfromdesc)(sc, &tmd, LE_TMDADDR(sc, no), sizeof(tmd)); - len = -tmd.tmd2; - if_printf(ifp, "transmit buffer %d, len = %d\n", no, len); - if_printf(ifp, "status %04x\n", (*sc->sc_rdcsr)(sc, LE_CSR0)); - if_printf(ifp, - "ladr %04x, hadr %02x, flags %02x, bcnt %04x, mcnt %04x\n", - tmd.tmd0, tmd.tmd1_hadr, tmd.tmd1_bits, tmd.tmd2, tmd.tmd3); - if (len >= sizeof(eh)) { - (*sc->sc_copyfrombuf)(sc, &eh, LE_TBUFADDR(sc, no), sizeof(eh)); - if_printf(ifp, "dst %s", ether_sprintf(eh.ether_dhost)); - printf(" src %s type %04x\n", ether_sprintf(eh.ether_shost), - ntohs(eh.ether_type)); - } -} -#endif /* LEDEBUG */ diff --git a/bsd_eth_drivers/if_le/if_le_cbus.c b/bsd_eth_drivers/if_le/if_le_cbus.c deleted file mode 100644 index 40d0e19..0000000 --- a/bsd_eth_drivers/if_le/if_le_cbus.c +++ /dev/null @@ -1,451 +0,0 @@ -/*- - * Copyright (c) 1994-2000 - * Paul Richards. All rights reserved. - * - * PC-98 port by Chiharu Shibata & FreeBSD(98) porting team. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer, - * verbatim and that no modifications are made prior to this - * point in the file. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name Paul Richards may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY PAUL RICHARDS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL PAUL RICHARDS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * 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. - * - * from: FreeBSD: src/sys/dev/lnc/if_lnc_cbus.c,v 1.12 2005/11/12 19:14:21 - */ - -#include -__FBSDID("$FreeBSD: src/sys/dev/le/if_le_cbus.c,v 1.5 2007/02/23 12:18:45 piso Exp $"); - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include - -#include -#include - -#include - -#include -#include -#include - -#define LE_CBUS_MEMSIZE (16*1024) -#define CNET98S_IOSIZE 32 -#define CNET98S_RDP 0x10 -#define CNET98S_RAP 0x12 -#define CNET98S_RESET 0x14 -#define CNET98S_BDP 0x16 - -struct le_cbus_softc { - struct am7990_softc sc_am7990; /* glue to MI code */ - - int sc_rrid; - struct resource *sc_rres; - bus_space_tag_t sc_regt; - bus_space_handle_t sc_regh; - - int sc_irid; - struct resource *sc_ires; - void *sc_ih; - - bus_dma_tag_t sc_pdmat; - bus_dma_tag_t sc_dmat; - bus_dmamap_t sc_dmam; -}; - -static device_probe_t le_cbus_probe; -static device_attach_t le_cbus_attach; -static device_detach_t le_cbus_detach; -static device_resume_t le_cbus_resume; -static device_suspend_t le_cbus_suspend; - -static device_method_t le_cbus_methods[] = { - /* Device interface */ - DEVMETHOD(device_probe, le_cbus_probe), - DEVMETHOD(device_attach, le_cbus_attach), - DEVMETHOD(device_detach, le_cbus_detach), - /* We can just use the suspend method here. */ - DEVMETHOD(device_shutdown, le_cbus_suspend), - DEVMETHOD(device_suspend, le_cbus_suspend), - DEVMETHOD(device_resume, le_cbus_resume), - - { 0, 0 } -}; - -DEFINE_CLASS_0(le, le_cbus_driver, le_cbus_methods, sizeof(struct le_cbus_softc)); -DRIVER_MODULE(le, isa, le_cbus_driver, le_devclass, 0, 0); -MODULE_DEPEND(le, ether, 1, 1, 1); - -static bus_addr_t le_ioaddr_cnet98s[CNET98S_IOSIZE] = { - 0x000, 0x001, 0x002, 0x003, 0x004, 0x005, 0x006, 0x007, - 0x008, 0x009, 0x00a, 0x00b, 0x00c, 0x00d, 0x00e, 0x00f, - 0x400, 0x401, 0x402, 0x403, 0x404, 0x405, 0x406, 0x407, - 0x408, 0x409, 0x40a, 0x40b, 0x40c, 0x40d, 0x40e, 0x40f, -}; - -static void le_cbus_wrbcr(struct lance_softc *, uint16_t, uint16_t); -#ifdef LEDEBUG -static uint16_t le_cbus_rdbcr(struct lance_softc *, uint16_t); -#endif -static void le_cbus_wrcsr(struct lance_softc *, uint16_t, uint16_t); -static uint16_t le_cbus_rdcsr(struct lance_softc *, uint16_t); -static void le_cbus_hwreset(struct lance_softc *); -static bus_dmamap_callback_t le_cbus_dma_callback; - -static void -le_cbus_wrbcr(struct lance_softc *sc, uint16_t port, uint16_t val) -{ - struct le_cbus_softc *lesc = (struct le_cbus_softc *)sc; - - bus_space_write_2(lesc->sc_regt, lesc->sc_regh, CNET98S_RAP, port); - bus_space_barrier(lesc->sc_regt, lesc->sc_regh, CNET98S_RAP, 2, - BUS_SPACE_BARRIER_WRITE); - bus_space_write_2(lesc->sc_regt, lesc->sc_regh, CNET98S_BDP, val); -} - -#ifdef LEDEBUG -static uint16_t -le_cbus_rdbcr(struct lance_softc *sc, uint16_t port) -{ - struct le_cbus_softc *lesc = (struct le_cbus_softc *)sc; - - bus_space_write_2(lesc->sc_regt, lesc->sc_regh, CNET98S_RAP, port); - bus_space_barrier(lesc->sc_regt, lesc->sc_regh, CNET98S_RAP, 2, - BUS_SPACE_BARRIER_WRITE); - return (bus_space_read_2(lesc->sc_regt, lesc->sc_regh, CNET98S_BDP)); -} -#endif - -static void -le_cbus_wrcsr(struct lance_softc *sc, uint16_t port, uint16_t val) -{ - struct le_cbus_softc *lesc = (struct le_cbus_softc *)sc; - - bus_space_write_2(lesc->sc_regt, lesc->sc_regh, CNET98S_RAP, port); - bus_space_barrier(lesc->sc_regt, lesc->sc_regh, CNET98S_RAP, 2, - BUS_SPACE_BARRIER_WRITE); - bus_space_write_2(lesc->sc_regt, lesc->sc_regh, CNET98S_RDP, val); -} - -static uint16_t -le_cbus_rdcsr(struct lance_softc *sc, uint16_t port) -{ - struct le_cbus_softc *lesc = (struct le_cbus_softc *)sc; - - bus_space_write_2(lesc->sc_regt, lesc->sc_regh, CNET98S_RAP, port); - bus_space_barrier(lesc->sc_regt, lesc->sc_regh, CNET98S_RAP, 2, - BUS_SPACE_BARRIER_WRITE); - return (bus_space_read_2(lesc->sc_regt, lesc->sc_regh, CNET98S_RDP)); -} - -static void -le_cbus_hwreset(struct lance_softc *sc) -{ - struct le_cbus_softc *lesc = (struct le_cbus_softc *)sc; - - /* - * NB: These are Contec C-NET(98)S only. - */ - - /* Reset the chip. */ - bus_space_write_2(lesc->sc_regt, lesc->sc_regh, CNET98S_RESET, - bus_space_read_2(lesc->sc_regt, lesc->sc_regh, CNET98S_RESET)); - DELAY(500); - - /* ISA bus configuration */ - /* ISACSR0 - set Master Mode Read Active time to 300ns. */ - le_cbus_wrbcr(sc, LE_BCR0, 0x0006); - /* ISACSR1 - set Master Mode Write Active time to 300ns. */ - le_cbus_wrbcr(sc, LE_BCR1, 0x0006); -#ifdef LEDEBUG - device_printf(dev, "ISACSR2=0x%x\n", le_cbus_rdbcr(sc, LE_BCR2)); -#endif - /* ISACSR5 - LED1 */ - le_cbus_wrbcr(sc, LE_BCR5, LE_B4_PSE | LE_B4_XMTE); - /* ISACSR6 - LED2 */ - le_cbus_wrbcr(sc, LE_BCR6, LE_B4_PSE | LE_B4_RCVE); - /* ISACSR7 - LED3 */ - le_cbus_wrbcr(sc, LE_BCR7, LE_B4_PSE | LE_B4_COLE); -} - -static void -le_cbus_dma_callback(void *xsc, bus_dma_segment_t *segs, int nsegs, int error) -{ - struct lance_softc *sc = (struct lance_softc *)xsc; - - if (error != 0) - return; - KASSERT(nsegs == 1, ("%s: bad DMA segment count", __func__)); - sc->sc_addr = segs[0].ds_addr; -} - -static int -le_cbus_probe(device_t dev) -{ - struct le_cbus_softc *lesc; - struct lance_softc *sc; - int error; - - /* - * Skip PnP devices as some wedge when trying to probe them as - * C-NET(98)S. - */ - if (isa_get_vendorid(dev)) - return (ENXIO); - - lesc = device_get_softc(dev); - sc = &lesc->sc_am7990.lsc; - - lesc->sc_rrid = 0; - lesc->sc_rres = isa_alloc_resourcev(dev, SYS_RES_IOPORT, &lesc->sc_rrid, - le_ioaddr_cnet98s, CNET98S_IOSIZE, RF_ACTIVE); - if (lesc->sc_rres == NULL) - return (ENXIO); - isa_load_resourcev(lesc->sc_rres, le_ioaddr_cnet98s, CNET98S_IOSIZE); - lesc->sc_regt = rman_get_bustag(lesc->sc_rres); - lesc->sc_regh = rman_get_bushandle(lesc->sc_rres); - - /* Reset the chip. */ - bus_space_write_2(lesc->sc_regt, lesc->sc_regh, CNET98S_RESET, - bus_space_read_2(lesc->sc_regt, lesc->sc_regh, CNET98S_RESET)); - DELAY(500); - - /* Stop the chip and put it in a known state. */ - le_cbus_wrcsr(sc, LE_CSR0, LE_C0_STOP); - DELAY(100); - if (le_cbus_rdcsr(sc, LE_CSR0) != LE_C0_STOP) { - error = ENXIO; - goto fail; - } - le_cbus_wrcsr(sc, LE_CSR3, 0); - device_set_desc(dev, "C-NET(98)S"); - error = BUS_PROBE_DEFAULT; - - fail: - bus_release_resource(dev, SYS_RES_IOPORT, lesc->sc_rrid, lesc->sc_rres); - return (error); -} - -static int -le_cbus_attach(device_t dev) -{ - struct le_cbus_softc *lesc; - struct lance_softc *sc; - int error, i; - - lesc = device_get_softc(dev); - sc = &lesc->sc_am7990.lsc; - - LE_LOCK_INIT(sc, device_get_nameunit(dev)); - - lesc->sc_rrid = 0; - lesc->sc_rres = isa_alloc_resourcev(dev, SYS_RES_IOPORT, &lesc->sc_rrid, - le_ioaddr_cnet98s, CNET98S_IOSIZE, RF_ACTIVE); - if (lesc->sc_rres == NULL) { - device_printf(dev, "cannot allocate registers\n"); - error = ENXIO; - goto fail_mtx; - } - isa_load_resourcev(lesc->sc_rres, le_ioaddr_cnet98s, CNET98S_IOSIZE); - lesc->sc_regt = rman_get_bustag(lesc->sc_rres); - lesc->sc_regh = rman_get_bushandle(lesc->sc_rres); - - lesc->sc_irid = 0; - if ((lesc->sc_ires = bus_alloc_resource_any(dev, SYS_RES_IRQ, - &lesc->sc_irid, RF_SHAREABLE | RF_ACTIVE)) == NULL) { - device_printf(dev, "cannot allocate interrupt\n"); - error = ENXIO; - goto fail_rres; - } - - error = bus_dma_tag_create( - bus_get_dma_tag(dev), /* parent */ - 1, 0, /* alignment, boundary */ - BUS_SPACE_MAXADDR_24BIT, /* lowaddr */ - BUS_SPACE_MAXADDR, /* highaddr */ - NULL, NULL, /* filter, filterarg */ - BUS_SPACE_MAXSIZE_32BIT, /* maxsize */ - 0, /* nsegments */ - BUS_SPACE_MAXSIZE_32BIT, /* maxsegsize */ - 0, /* flags */ - NULL, NULL, /* lockfunc, lockarg */ - &lesc->sc_pdmat); - if (error != 0) { - device_printf(dev, "cannot allocate parent DMA tag\n"); - goto fail_ires; - } - - sc->sc_memsize = LE_CBUS_MEMSIZE; - /* - * For Am79C90, Am79C961 and Am79C961A the init block must be 2-byte - * aligned and the ring descriptors must be 8-byte aligned. - */ - error = bus_dma_tag_create( - lesc->sc_pdmat, /* parent */ - 8, 0, /* alignment, boundary */ - BUS_SPACE_MAXADDR_24BIT, /* lowaddr */ - BUS_SPACE_MAXADDR, /* highaddr */ - NULL, NULL, /* filter, filterarg */ - sc->sc_memsize, /* maxsize */ - 1, /* nsegments */ - sc->sc_memsize, /* maxsegsize */ - 0, /* flags */ - NULL, NULL, /* lockfunc, lockarg */ - &lesc->sc_dmat); - if (error != 0) { - device_printf(dev, "cannot allocate buffer DMA tag\n"); - goto fail_pdtag; - } - - error = bus_dmamem_alloc(lesc->sc_dmat, (void **)&sc->sc_mem, - BUS_DMA_WAITOK | BUS_DMA_COHERENT, &lesc->sc_dmam); - if (error != 0) { - device_printf(dev, "cannot allocate DMA buffer memory\n"); - goto fail_dtag; - } - - sc->sc_addr = 0; - error = bus_dmamap_load(lesc->sc_dmat, lesc->sc_dmam, sc->sc_mem, - sc->sc_memsize, le_cbus_dma_callback, sc, 0); - if (error != 0 || sc->sc_addr == 0) { - device_printf(dev, "cannot load DMA buffer map\n"); - goto fail_dmem; - } - - sc->sc_flags = 0; - sc->sc_conf3 = 0; - - /* - * Extract the physical MAC address from the ROM. - */ - for (i = 0; i < sizeof(sc->sc_enaddr); i++) - sc->sc_enaddr[i] = bus_space_read_1(lesc->sc_regt, - lesc->sc_regh, i * 2); - - sc->sc_copytodesc = lance_copytobuf_contig; - sc->sc_copyfromdesc = lance_copyfrombuf_contig; - sc->sc_copytobuf = lance_copytobuf_contig; - sc->sc_copyfrombuf = lance_copyfrombuf_contig; - sc->sc_zerobuf = lance_zerobuf_contig; - - sc->sc_rdcsr = le_cbus_rdcsr; - sc->sc_wrcsr = le_cbus_wrcsr; - sc->sc_hwreset = le_cbus_hwreset; - sc->sc_hwinit = NULL; - sc->sc_hwintr = NULL; - sc->sc_nocarrier = NULL; - sc->sc_mediachange = NULL; - sc->sc_mediastatus = NULL; - sc->sc_supmedia = NULL; - - error = am7990_config(&lesc->sc_am7990, device_get_name(dev), - device_get_unit(dev)); - if (error != 0) { - device_printf(dev, "cannot attach Am7990\n"); - goto fail_dmap; - } - - error = bus_setup_intr(dev, lesc->sc_ires, INTR_TYPE_NET | INTR_MPSAFE, - NULL, am7990_intr, sc, &lesc->sc_ih); - if (error != 0) { - device_printf(dev, "cannot set up interrupt\n"); - goto fail_am7990; - } - - return (0); - - fail_am7990: - am7990_detach(&lesc->sc_am7990); - fail_dmap: - bus_dmamap_unload(lesc->sc_dmat, lesc->sc_dmam); - fail_dmem: - bus_dmamem_free(lesc->sc_dmat, sc->sc_mem, lesc->sc_dmam); - fail_dtag: - bus_dma_tag_destroy(lesc->sc_dmat); - fail_pdtag: - bus_dma_tag_destroy(lesc->sc_pdmat); - fail_ires: - bus_release_resource(dev, SYS_RES_IRQ, lesc->sc_irid, lesc->sc_ires); - fail_rres: - bus_release_resource(dev, SYS_RES_IOPORT, lesc->sc_rrid, lesc->sc_rres); - fail_mtx: - LE_LOCK_DESTROY(sc); - return (error); -} - -static int -le_cbus_detach(device_t dev) -{ - struct le_cbus_softc *lesc; - struct lance_softc *sc; - - lesc = device_get_softc(dev); - sc = &lesc->sc_am7990.lsc; - - bus_teardown_intr(dev, lesc->sc_ires, lesc->sc_ih); - am7990_detach(&lesc->sc_am7990); - bus_dmamap_unload(lesc->sc_dmat, lesc->sc_dmam); - bus_dmamem_free(lesc->sc_dmat, sc->sc_mem, lesc->sc_dmam); - bus_dma_tag_destroy(lesc->sc_dmat); - bus_dma_tag_destroy(lesc->sc_pdmat); - bus_release_resource(dev, SYS_RES_IRQ, lesc->sc_irid, lesc->sc_ires); - bus_release_resource(dev, SYS_RES_IOPORT, lesc->sc_rrid, lesc->sc_rres); - LE_LOCK_DESTROY(sc); - - return (0); -} - -static int -le_cbus_suspend(device_t dev) -{ - struct le_cbus_softc *lesc; - - lesc = device_get_softc(dev); - - lance_suspend(&lesc->sc_am7990.lsc); - - return (0); -} - -static int -le_cbus_resume(device_t dev) -{ - struct le_cbus_softc *lesc; - - lesc = device_get_softc(dev); - - lance_resume(&lesc->sc_am7990.lsc); - - return (0); -} diff --git a/bsd_eth_drivers/if_le/if_le_isa.c b/bsd_eth_drivers/if_le/if_le_isa.c deleted file mode 100644 index 9299943..0000000 --- a/bsd_eth_drivers/if_le/if_le_isa.c +++ /dev/null @@ -1,509 +0,0 @@ -/* $NetBSD: if_le_isa.c,v 1.41 2005/12/24 20:27:41 perry Exp $ */ - -/*- - * Copyright (c) 1997, 1998 The NetBSD Foundation, Inc. - * All rights reserved. - * - * This code is derived from software contributed to The NetBSD Foundation - * by Charles M. Hannum and by Jason R. Thorpe of the Numerical Aerospace - * Simulation Facility, NASA Ames Research Center. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the NetBSD - * Foundation, Inc. and its contributors. - * 4. Neither the name of The NetBSD Foundation nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS - * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS - * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) 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. - */ - -/*- - * Copyright (c) 1992, 1993 - * The Regents of the University of California. All rights reserved. - * - * This code is derived from software contributed to Berkeley by - * Ralph Campbell and Rick Macklem. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * 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. - * - * @(#)if_le.c 8.2 (Berkeley) 11/16/93 - */ - -#include -__FBSDID("$FreeBSD: src/sys/dev/le/if_le_isa.c,v 1.4 2007/02/23 12:18:45 piso Exp $"); - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include - -#include -#include - -#include - -#include -#include -#include - -#define LE_ISA_MEMSIZE (16*1024) -#define PCNET_RDP 0x10 -#define PCNET_RAP 0x12 - -struct le_isa_softc { - struct am7990_softc sc_am7990; /* glue to MI code */ - - bus_size_t sc_rap; /* offsets to LANCE... */ - bus_size_t sc_rdp; /* ...registers */ - - int sc_rrid; - struct resource *sc_rres; - bus_space_tag_t sc_regt; - bus_space_handle_t sc_regh; - - int sc_drid; - struct resource *sc_dres; - - int sc_irid; - struct resource *sc_ires; - void *sc_ih; - - bus_dma_tag_t sc_pdmat; - bus_dma_tag_t sc_dmat; - bus_dmamap_t sc_dmam; -}; - -static device_probe_t le_isa_probe; -static device_attach_t le_isa_attach; -static device_detach_t le_isa_detach; -static device_resume_t le_isa_resume; -static device_suspend_t le_isa_suspend; - -static device_method_t le_isa_methods[] = { - /* Device interface */ - DEVMETHOD(device_probe, le_isa_probe), - DEVMETHOD(device_attach, le_isa_attach), - DEVMETHOD(device_detach, le_isa_detach), - /* We can just use the suspend method here. */ - DEVMETHOD(device_shutdown, le_isa_suspend), - DEVMETHOD(device_suspend, le_isa_suspend), - DEVMETHOD(device_resume, le_isa_resume), - - { 0, 0 } -}; - -DEFINE_CLASS_0(le, le_isa_driver, le_isa_methods, sizeof(struct le_isa_softc)); -DRIVER_MODULE(le, isa, le_isa_driver, le_devclass, 0, 0); -MODULE_DEPEND(le, ether, 1, 1, 1); - -struct le_isa_param { - const char *name; - u_long iosize; - bus_size_t rap; - bus_size_t rdp; - bus_size_t macstart; - int macstride; -} static const le_isa_params[] = { - { "BICC Isolan", 24, 0xe, 0xc, 0, 2 }, - { "Novell NE2100", 16, 0x12, 0x10, 0, 1 } -}; - -static struct isa_pnp_id le_isa_ids[] = { - { 0x0322690e, "Cabletron E2200 Single Chip" }, /* CSI2203 */ - { 0x0110490a, "Boca LANCard Combo" }, /* BRI1001 */ - { 0x0100a60a, "Melco Inc. LGY-IV" }, /* BUF0001 */ - { 0xd880d041, "Novell NE2100" }, /* PNP80D8 */ - { 0x0082d041, "Cabletron E2100 Series DNI" }, /* PNP8200 */ - { 0x3182d041, "AMD AM1500T/AM2100" }, /* PNP8231 */ - { 0x8c82d041, "AMD PCnet-ISA" }, /* PNP828C */ - { 0x8d82d041, "AMD PCnet-32" }, /* PNP828D */ - { 0xcefaedfe, "Racal InterLan EtherBlaster" }, /* _WMFACE */ - { 0, NULL } -}; - -static void le_isa_wrcsr(struct lance_softc *, uint16_t, uint16_t); -static uint16_t le_isa_rdcsr(struct lance_softc *, uint16_t); -static bus_dmamap_callback_t le_isa_dma_callback; -static int le_isa_probe_legacy(device_t, const struct le_isa_param *); - -static void -le_isa_wrcsr(struct lance_softc *sc, uint16_t port, uint16_t val) -{ - struct le_isa_softc *lesc = (struct le_isa_softc *)sc; - - bus_space_write_2(lesc->sc_regt, lesc->sc_regh, lesc->sc_rap, port); - bus_space_barrier(lesc->sc_regt, lesc->sc_regh, lesc->sc_rap, 2, - BUS_SPACE_BARRIER_WRITE); - bus_space_write_2(lesc->sc_regt, lesc->sc_regh, lesc->sc_rdp, val); -} - -static uint16_t -le_isa_rdcsr(struct lance_softc *sc, uint16_t port) -{ - struct le_isa_softc *lesc = (struct le_isa_softc *)sc; - - bus_space_write_2(lesc->sc_regt, lesc->sc_regh, lesc->sc_rap, port); - bus_space_barrier(lesc->sc_regt, lesc->sc_regh, lesc->sc_rap, 2, - BUS_SPACE_BARRIER_WRITE); - return (bus_space_read_2(lesc->sc_regt, lesc->sc_regh, lesc->sc_rdp)); -} - -static void -le_isa_dma_callback(void *xsc, bus_dma_segment_t *segs, int nsegs, int error) -{ - struct lance_softc *sc = (struct lance_softc *)xsc; - - if (error != 0) - return; - KASSERT(nsegs == 1, ("%s: bad DMA segment count", __func__)); - sc->sc_addr = segs[0].ds_addr; -} - -static int -le_isa_probe_legacy(device_t dev, const struct le_isa_param *leip) -{ - struct le_isa_softc *lesc; - struct lance_softc *sc; - int error; - - lesc = device_get_softc(dev); - sc = &lesc->sc_am7990.lsc; - - lesc->sc_rrid = 0; - lesc->sc_rres = bus_alloc_resource(dev, SYS_RES_IOPORT, &lesc->sc_rrid, - 0, ~0, leip->iosize, RF_ACTIVE); - if (lesc->sc_rres == NULL) - return (ENXIO); - lesc->sc_regt = rman_get_bustag(lesc->sc_rres); - lesc->sc_regh = rman_get_bushandle(lesc->sc_rres); - lesc->sc_rap = leip->rap; - lesc->sc_rdp = leip->rdp; - - /* Stop the chip and put it in a known state. */ - le_isa_wrcsr(sc, LE_CSR0, LE_C0_STOP); - DELAY(100); - if (le_isa_rdcsr(sc, LE_CSR0) != LE_C0_STOP) { - error = ENXIO; - goto fail; - } - le_isa_wrcsr(sc, LE_CSR3, 0); - error = 0; - - fail: - bus_release_resource(dev, SYS_RES_IOPORT, lesc->sc_rrid, lesc->sc_rres); - return (error); -} - -static int -le_isa_probe(device_t dev) -{ - int i; - - switch (ISA_PNP_PROBE(device_get_parent(dev), dev, le_isa_ids)) { - case 0: - return (BUS_PROBE_DEFAULT); - case ENOENT: - for (i = 0; i < sizeof(le_isa_params) / - sizeof(le_isa_params[0]); i++) { - if (le_isa_probe_legacy(dev, &le_isa_params[i]) == 0) { - device_set_desc(dev, le_isa_params[i].name); - return (BUS_PROBE_DEFAULT); - } - } - /* FALLTHROUGH */ - case ENXIO: - default: - return (ENXIO); - } -} - -static int -le_isa_attach(device_t dev) -{ - struct le_isa_softc *lesc; - struct lance_softc *sc; - bus_size_t macstart, rap, rdp; - int error, i, macstride; - - lesc = device_get_softc(dev); - sc = &lesc->sc_am7990.lsc; - - LE_LOCK_INIT(sc, device_get_nameunit(dev)); - - lesc->sc_rrid = 0; - switch (ISA_PNP_PROBE(device_get_parent(dev), dev, le_isa_ids)) { - case 0: - lesc->sc_rres = bus_alloc_resource_any(dev, SYS_RES_IOPORT, - &lesc->sc_rrid, RF_ACTIVE); - rap = PCNET_RAP; - rdp = PCNET_RDP; - macstart = 0; - macstride = 1; - break; - case ENOENT: - for (i = 0; i < sizeof(le_isa_params) / - sizeof(le_isa_params[0]); i++) { - if (le_isa_probe_legacy(dev, &le_isa_params[i]) == 0) { - lesc->sc_rres = bus_alloc_resource(dev, - SYS_RES_IOPORT, &lesc->sc_rrid, 0, ~0, - le_isa_params[i].iosize, RF_ACTIVE); - rap = le_isa_params[i].rap; - rdp = le_isa_params[i].rdp; - macstart = le_isa_params[i].macstart; - macstride = le_isa_params[i].macstride; - goto found; - } - } - /* FALLTHROUGH */ - case ENXIO: - default: - device_printf(dev, "cannot determine chip\n"); - error = ENXIO; - goto fail_mtx; - } - - found: - if (lesc->sc_rres == NULL) { - device_printf(dev, "cannot allocate registers\n"); - error = ENXIO; - goto fail_mtx; - } - lesc->sc_regt = rman_get_bustag(lesc->sc_rres); - lesc->sc_regh = rman_get_bushandle(lesc->sc_rres); - lesc->sc_rap = rap; - lesc->sc_rdp = rdp; - - lesc->sc_drid = 0; - if ((lesc->sc_dres = bus_alloc_resource_any(dev, SYS_RES_DRQ, - &lesc->sc_drid, RF_ACTIVE)) == NULL) { - device_printf(dev, "cannot allocate DMA channel\n"); - error = ENXIO; - goto fail_rres; - } - - lesc->sc_irid = 0; - if ((lesc->sc_ires = bus_alloc_resource_any(dev, SYS_RES_IRQ, - &lesc->sc_irid, RF_SHAREABLE | RF_ACTIVE)) == NULL) { - device_printf(dev, "cannot allocate interrupt\n"); - error = ENXIO; - goto fail_dres; - } - - error = bus_dma_tag_create( - bus_get_dma_tag(dev), /* parent */ - 1, 0, /* alignment, boundary */ - BUS_SPACE_MAXADDR_24BIT, /* lowaddr */ - BUS_SPACE_MAXADDR, /* highaddr */ - NULL, NULL, /* filter, filterarg */ - BUS_SPACE_MAXSIZE_32BIT, /* maxsize */ - 0, /* nsegments */ - BUS_SPACE_MAXSIZE_32BIT, /* maxsegsize */ - 0, /* flags */ - NULL, NULL, /* lockfunc, lockarg */ - &lesc->sc_pdmat); - if (error != 0) { - device_printf(dev, "cannot allocate parent DMA tag\n"); - goto fail_ires; - } - - sc->sc_memsize = LE_ISA_MEMSIZE; - /* - * For Am79C90, Am79C961 and Am79C961A the init block must be 2-byte - * aligned and the ring descriptors must be 8-byte aligned. - */ - error = bus_dma_tag_create( - lesc->sc_pdmat, /* parent */ - 8, 0, /* alignment, boundary */ - BUS_SPACE_MAXADDR_24BIT, /* lowaddr */ - BUS_SPACE_MAXADDR, /* highaddr */ - NULL, NULL, /* filter, filterarg */ - sc->sc_memsize, /* maxsize */ - 1, /* nsegments */ - sc->sc_memsize, /* maxsegsize */ - 0, /* flags */ - NULL, NULL, /* lockfunc, lockarg */ - &lesc->sc_dmat); - if (error != 0) { - device_printf(dev, "cannot allocate buffer DMA tag\n"); - goto fail_pdtag; - } - - error = bus_dmamem_alloc(lesc->sc_dmat, (void **)&sc->sc_mem, - BUS_DMA_WAITOK | BUS_DMA_COHERENT, &lesc->sc_dmam); - if (error != 0) { - device_printf(dev, "cannot allocate DMA buffer memory\n"); - goto fail_dtag; - } - - sc->sc_addr = 0; - error = bus_dmamap_load(lesc->sc_dmat, lesc->sc_dmam, sc->sc_mem, - sc->sc_memsize, le_isa_dma_callback, sc, 0); - if (error != 0 || sc->sc_addr == 0) { - device_printf(dev, "cannot load DMA buffer map\n"); - goto fail_dmem; - } - - isa_dmacascade(rman_get_start(lesc->sc_dres)); - - sc->sc_flags = 0; - sc->sc_conf3 = 0; - - /* - * Extract the physical MAC address from the ROM. - */ - for (i = 0; i < sizeof(sc->sc_enaddr); i++) - sc->sc_enaddr[i] = bus_space_read_1(lesc->sc_regt, - lesc->sc_regh, macstart + i * macstride); - - sc->sc_copytodesc = lance_copytobuf_contig; - sc->sc_copyfromdesc = lance_copyfrombuf_contig; - sc->sc_copytobuf = lance_copytobuf_contig; - sc->sc_copyfrombuf = lance_copyfrombuf_contig; - sc->sc_zerobuf = lance_zerobuf_contig; - - sc->sc_rdcsr = le_isa_rdcsr; - sc->sc_wrcsr = le_isa_wrcsr; - sc->sc_hwreset = NULL; - sc->sc_hwinit = NULL; - sc->sc_hwintr = NULL; - sc->sc_nocarrier = NULL; - sc->sc_mediachange = NULL; - sc->sc_mediastatus = NULL; - sc->sc_supmedia = NULL; - - error = am7990_config(&lesc->sc_am7990, device_get_name(dev), - device_get_unit(dev)); - if (error != 0) { - device_printf(dev, "cannot attach Am7990\n"); - goto fail_dmap; - } - - error = bus_setup_intr(dev, lesc->sc_ires, INTR_TYPE_NET | INTR_MPSAFE, - NULL, am7990_intr, sc, &lesc->sc_ih); - if (error != 0) { - device_printf(dev, "cannot set up interrupt\n"); - goto fail_am7990; - } - - return (0); - - fail_am7990: - am7990_detach(&lesc->sc_am7990); - fail_dmap: - bus_dmamap_unload(lesc->sc_dmat, lesc->sc_dmam); - fail_dmem: - bus_dmamem_free(lesc->sc_dmat, sc->sc_mem, lesc->sc_dmam); - fail_dtag: - bus_dma_tag_destroy(lesc->sc_dmat); - fail_pdtag: - bus_dma_tag_destroy(lesc->sc_pdmat); - fail_ires: - bus_release_resource(dev, SYS_RES_IRQ, lesc->sc_irid, lesc->sc_ires); - fail_dres: - bus_release_resource(dev, SYS_RES_DRQ, lesc->sc_drid, lesc->sc_dres); - fail_rres: - bus_release_resource(dev, SYS_RES_IOPORT, lesc->sc_rrid, lesc->sc_rres); - fail_mtx: - LE_LOCK_DESTROY(sc); - return (error); -} - -static int -le_isa_detach(device_t dev) -{ - struct le_isa_softc *lesc; - struct lance_softc *sc; - - lesc = device_get_softc(dev); - sc = &lesc->sc_am7990.lsc; - - bus_teardown_intr(dev, lesc->sc_ires, lesc->sc_ih); - am7990_detach(&lesc->sc_am7990); - bus_dmamap_unload(lesc->sc_dmat, lesc->sc_dmam); - bus_dmamem_free(lesc->sc_dmat, sc->sc_mem, lesc->sc_dmam); - bus_dma_tag_destroy(lesc->sc_dmat); - bus_dma_tag_destroy(lesc->sc_pdmat); - bus_release_resource(dev, SYS_RES_IRQ, lesc->sc_irid, lesc->sc_ires); - bus_release_resource(dev, SYS_RES_DRQ, lesc->sc_drid, lesc->sc_dres); - bus_release_resource(dev, SYS_RES_IOPORT, lesc->sc_rrid, lesc->sc_rres); - LE_LOCK_DESTROY(sc); - - return (0); -} - -static int -le_isa_suspend(device_t dev) -{ - struct le_isa_softc *lesc; - - lesc = device_get_softc(dev); - - lance_suspend(&lesc->sc_am7990.lsc); - - return (0); -} - -static int -le_isa_resume(device_t dev) -{ - struct le_isa_softc *lesc; - - lesc = device_get_softc(dev); - - lance_resume(&lesc->sc_am7990.lsc); - - return (0); -} diff --git a/bsd_eth_drivers/if_le/if_le_lebuffer.c b/bsd_eth_drivers/if_le/if_le_lebuffer.c deleted file mode 100644 index 5ad8d31..0000000 --- a/bsd_eth_drivers/if_le/if_le_lebuffer.c +++ /dev/null @@ -1,408 +0,0 @@ -/*- - * Copyright (c) 2006 Marius Strobl - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * 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. - */ - -#include -__FBSDID("$FreeBSD: src/sys/dev/le/if_le_lebuffer.c,v 1.2 2007/02/23 12:18:45 piso Exp $"); - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -#include -#include -#include - -#include -#include -#include - -#include -#include -#include -#include - -/* - * LANCE registers - */ -#define LEREG1_RDP 0 /* Register Data port */ -#define LEREG1_RAP 2 /* Register Address port */ - -struct le_lebuffer_softc { - struct am7990_softc sc_am7990; /* glue to MI code */ - - int sc_brid; - struct resource *sc_bres; - bus_space_tag_t sc_buft; - bus_space_handle_t sc_bufh; - - int sc_rrid; - struct resource *sc_rres; - bus_space_tag_t sc_regt; - bus_space_handle_t sc_regh; - - int sc_irid; - struct resource *sc_ires; - void *sc_ih; -}; - -static devclass_t le_lebuffer_devclass; - -static device_probe_t le_lebuffer_probe; -static device_attach_t le_lebuffer_attach; -static device_detach_t le_lebuffer_detach; -static device_resume_t le_buffer_resume; -static device_suspend_t le_buffer_suspend; - -static device_method_t le_lebuffer_methods[] = { - /* Device interface */ - DEVMETHOD(device_probe, le_lebuffer_probe), - DEVMETHOD(device_attach, le_lebuffer_attach), - DEVMETHOD(device_detach, le_lebuffer_detach), - /* We can just use the suspend method here. */ - DEVMETHOD(device_shutdown, le_buffer_suspend), - DEVMETHOD(device_suspend, le_buffer_suspend), - DEVMETHOD(device_resume, le_buffer_resume), - - { 0, 0 } -}; - -DEFINE_CLASS_0(le, le_lebuffer_driver, le_lebuffer_methods, - sizeof(struct le_lebuffer_softc)); -DRIVER_MODULE(le, lebuffer, le_lebuffer_driver, le_lebuffer_devclass, 0, 0); -MODULE_DEPEND(le, ether, 1, 1, 1); - -/* - * Media types supported - */ -static const int le_lebuffer_media[] = { - IFM_MAKEWORD(IFM_ETHER, IFM_10_T, 0, 0) -}; -#define NLEMEDIA \ - (sizeof(le_lebuffer_media) / sizeof(le_lebuffer_media[0])) - -static void le_lebuffer_wrcsr(struct lance_softc *, uint16_t, uint16_t); -static uint16_t le_lebuffer_rdcsr(struct lance_softc *, uint16_t); -static void le_lebuffer_copytodesc(struct lance_softc *, void *, int, int); -static void le_lebuffer_copyfromdesc(struct lance_softc *, void *, int, int); -static void le_lebuffer_copytobuf(struct lance_softc *, void *, int, int); -static void le_lebuffer_copyfrombuf(struct lance_softc *, void *, int, int); -static void le_lebuffer_zerobuf(struct lance_softc *, int, int); - -static void -le_lebuffer_wrcsr(struct lance_softc *sc, uint16_t port, uint16_t val) -{ - struct le_lebuffer_softc *lesc = (struct le_lebuffer_softc *)sc; - - bus_space_write_2(lesc->sc_regt, lesc->sc_regh, LEREG1_RAP, port); - bus_space_barrier(lesc->sc_regt, lesc->sc_regh, LEREG1_RAP, 2, - BUS_SPACE_BARRIER_WRITE); - bus_space_write_2(lesc->sc_regt, lesc->sc_regh, LEREG1_RDP, val); -} - -static uint16_t -le_lebuffer_rdcsr(struct lance_softc *sc, uint16_t port) -{ - struct le_lebuffer_softc *lesc = (struct le_lebuffer_softc *)sc; - - bus_space_write_2(lesc->sc_regt, lesc->sc_regh, LEREG1_RAP, port); - bus_space_barrier(lesc->sc_regt, lesc->sc_regh, LEREG1_RAP, 2, - BUS_SPACE_BARRIER_WRITE); - return (bus_space_read_2(lesc->sc_regt, lesc->sc_regh, LEREG1_RDP)); -} - -/* - * It turns out that using bus_space(9) to access the buffers and the - * descriptors yields way more throughput than accessing them via the - * KVA returned by rman_get_virtual(9). The descriptor rings can be - * accessed using 8-bit up to 64-bit operations while the buffers can - * be only accessed using 8-bit and 16-bit operations. - * NB: For whatever reason setting LE_C3_BSWP has no effect with at - * least the 501-2981 (although their 'busmaster-regval' property - * indicates to set LE_C3_BSWP also for these cards), so we need - * to manually byte swap access to the buffers, i.e. the accesses - * going through the RX/TX FIFOs. - */ - -static void -le_lebuffer_copytodesc(struct lance_softc *sc, void *fromv, int off, int len) -{ - struct le_lebuffer_softc *lesc = (struct le_lebuffer_softc *)sc; - caddr_t from = fromv; - - for (; len >= 8; len -= 8, off += 8, from += 8) - bus_space_write_8(lesc->sc_buft, lesc->sc_bufh, off, - be64dec(from)); - for (; len >= 4; len -= 4, off += 4, from += 4) - bus_space_write_4(lesc->sc_buft, lesc->sc_bufh, off, - be32dec(from)); - for (; len >= 2; len -= 2, off += 2, from += 2) - bus_space_write_2(lesc->sc_buft, lesc->sc_bufh, off, - be16dec(from)); - if (len == 1) - bus_space_write_1(lesc->sc_buft, lesc->sc_bufh, off, - *from); -} - -static void -le_lebuffer_copyfromdesc(struct lance_softc *sc, void *tov, int off, int len) -{ - struct le_lebuffer_softc *lesc = (struct le_lebuffer_softc *)sc; - caddr_t to = tov; - - for (; len >= 8; len -= 8, off += 8, to += 8) - be64enc(to, - bus_space_read_8(lesc->sc_buft, lesc->sc_bufh, off)); - for (; len >= 4; len -= 4, off += 4, to += 4) - be32enc(to, - bus_space_read_4(lesc->sc_buft, lesc->sc_bufh, off)); - for (; len >= 2; len -= 2, off += 2, to += 2) - be16enc(to, - bus_space_read_2(lesc->sc_buft, lesc->sc_bufh, off)); - if (len == 1) - *to = - bus_space_read_1(lesc->sc_buft, lesc->sc_bufh, off); -} - -static void -le_lebuffer_copytobuf(struct lance_softc *sc, void *fromv, int off, int len) -{ - struct le_lebuffer_softc *lesc = (struct le_lebuffer_softc *)sc; - caddr_t from = fromv; - - for (; len >= 2; len -= 2, off += 2, from += 2) - bus_space_write_2(lesc->sc_buft, lesc->sc_bufh, off, - le16dec(from)); - if (len == 1) - bus_space_write_1(lesc->sc_buft, lesc->sc_bufh, off + 1, - *from); -} - -static void -le_lebuffer_copyfrombuf(struct lance_softc *sc, void *tov, int off, int len) -{ - struct le_lebuffer_softc *lesc = (struct le_lebuffer_softc *)sc; - caddr_t to = tov; - - for (; len >= 2; len -= 2, off += 2, to += 2) - le16enc(to, - bus_space_read_2(lesc->sc_buft, lesc->sc_bufh, off)); - if (len == 1) - *to = - bus_space_read_1(lesc->sc_buft, lesc->sc_bufh, off + 1); -} - -static void -le_lebuffer_zerobuf(struct lance_softc *sc, int off, int len) -{ - struct le_lebuffer_softc *lesc = (struct le_lebuffer_softc *)sc; - - for (; len >= 2; len -= 2, off += 2) - bus_space_write_2(lesc->sc_buft, lesc->sc_bufh, off, 0); - if (len == 1) - bus_space_write_1(lesc->sc_buft, lesc->sc_bufh, off + 1, 0); -} - -static int -le_lebuffer_probe(device_t dev) -{ - - if (strcmp(ofw_bus_get_name(dev), "le") == 0) { - device_set_desc(dev, "LANCE Ethernet"); - return (BUS_PROBE_DEFAULT); - } - return (ENXIO); -} - -static int -le_lebuffer_attach(device_t dev) -{ - struct le_lebuffer_softc *lesc; - struct lance_softc *sc; - int error; - - lesc = device_get_softc(dev); - sc = &lesc->sc_am7990.lsc; - - LE_LOCK_INIT(sc, device_get_nameunit(dev)); - - /* - * The "register space" of the parent is just a buffer where the - * the LANCE descriptor rings and the RX/TX buffers can be stored. - */ - lesc->sc_brid = 0; - lesc->sc_bres = bus_alloc_resource_any(device_get_parent(dev), - SYS_RES_MEMORY, &lesc->sc_brid, RF_ACTIVE); - if (lesc->sc_bres == NULL) { - device_printf(dev, "cannot allocate LANCE buffer\n"); - error = ENXIO; - goto fail_mtx; - } - lesc->sc_buft = rman_get_bustag(lesc->sc_bres); - lesc->sc_bufh = rman_get_bushandle(lesc->sc_bres); - - /* Allocate LANCE registers. */ - lesc->sc_rrid = 0; - lesc->sc_rres = bus_alloc_resource_any(dev, SYS_RES_MEMORY, - &lesc->sc_rrid, RF_ACTIVE); - if (lesc->sc_rres == NULL) { - device_printf(dev, "cannot allocate LANCE registers\n"); - error = ENXIO; - goto fail_bres; - } - lesc->sc_regt = rman_get_bustag(lesc->sc_rres); - lesc->sc_regh = rman_get_bushandle(lesc->sc_rres); - - /* Allocate LANCE interrupt. */ - lesc->sc_irid = 0; - if ((lesc->sc_ires = bus_alloc_resource_any(dev, SYS_RES_IRQ, - &lesc->sc_irid, RF_SHAREABLE | RF_ACTIVE)) == NULL) { - device_printf(dev, "cannot allocate interrupt\n"); - error = ENXIO; - goto fail_rres; - } - - /* - * LANCE view is offset by buffer location. - * Note that we don't use sc->sc_mem. - */ - sc->sc_addr = 0; - sc->sc_memsize = rman_get_size(lesc->sc_bres); - sc->sc_flags = 0; - - /* That old black magic... */ - if (OF_getprop(ofw_bus_get_node(dev), "busmaster-regval", - &sc->sc_conf3, sizeof(sc->sc_conf3)) == -1) - sc->sc_conf3 = LE_C3_ACON | LE_C3_BCON; - /* - * Make sure LE_C3_BSWP is cleared so that for cards where - * that flag actually works le_lebuffer_copy{from,to}buf() - * don't fail... - */ - sc->sc_conf3 &= ~LE_C3_BSWP; - - OF_getetheraddr(dev, sc->sc_enaddr); - - sc->sc_copytodesc = le_lebuffer_copytodesc; - sc->sc_copyfromdesc = le_lebuffer_copyfromdesc; - sc->sc_copytobuf = le_lebuffer_copytobuf; - sc->sc_copyfrombuf = le_lebuffer_copyfrombuf; - sc->sc_zerobuf = le_lebuffer_zerobuf; - - sc->sc_rdcsr = le_lebuffer_rdcsr; - sc->sc_wrcsr = le_lebuffer_wrcsr; - sc->sc_hwreset = NULL; - sc->sc_hwinit = NULL; - sc->sc_hwintr = NULL; - sc->sc_nocarrier = NULL; - sc->sc_mediachange = NULL; - sc->sc_mediastatus = NULL; - sc->sc_supmedia = le_lebuffer_media; - sc->sc_nsupmedia = NLEMEDIA; - sc->sc_defaultmedia = le_lebuffer_media[0]; - - error = am7990_config(&lesc->sc_am7990, device_get_name(dev), - device_get_unit(dev)); - if (error != 0) { - device_printf(dev, "cannot attach Am7990\n"); - goto fail_ires; - } - - error = bus_setup_intr(dev, lesc->sc_ires, INTR_TYPE_NET | INTR_MPSAFE, - NULL, am7990_intr, sc, &lesc->sc_ih); - if (error != 0) { - device_printf(dev, "cannot set up interrupt\n"); - goto fail_am7990; - } - - return (0); - - fail_am7990: - am7990_detach(&lesc->sc_am7990); - fail_ires: - bus_release_resource(dev, SYS_RES_IRQ, lesc->sc_irid, lesc->sc_ires); - fail_rres: - bus_release_resource(dev, SYS_RES_MEMORY, lesc->sc_rrid, lesc->sc_rres); - fail_bres: - bus_release_resource(device_get_parent(dev), SYS_RES_MEMORY, - lesc->sc_brid, lesc->sc_bres); - fail_mtx: - LE_LOCK_DESTROY(sc); - return (error); -} - -static int -le_lebuffer_detach(device_t dev) -{ - struct le_lebuffer_softc *lesc; - struct lance_softc *sc; - - lesc = device_get_softc(dev); - sc = &lesc->sc_am7990.lsc; - - bus_teardown_intr(dev, lesc->sc_ires, lesc->sc_ih); - am7990_detach(&lesc->sc_am7990); - bus_release_resource(dev, SYS_RES_IRQ, lesc->sc_irid, lesc->sc_ires); - bus_release_resource(dev, SYS_RES_MEMORY, lesc->sc_rrid, lesc->sc_rres); - bus_release_resource(device_get_parent(dev), SYS_RES_MEMORY, - lesc->sc_brid, lesc->sc_bres); - LE_LOCK_DESTROY(sc); - - return (0); -} - -static int -le_buffer_suspend(device_t dev) -{ - struct le_lebuffer_softc *lesc; - - lesc = device_get_softc(dev); - - lance_suspend(&lesc->sc_am7990.lsc); - - return (0); -} - -static int -le_buffer_resume(device_t dev) -{ - struct le_lebuffer_softc *lesc; - - lesc = device_get_softc(dev); - - lance_resume(&lesc->sc_am7990.lsc); - - return (0); -} diff --git a/bsd_eth_drivers/if_le/if_le_ledma.c b/bsd_eth_drivers/if_le/if_le_ledma.c deleted file mode 100644 index 248b8a0..0000000 --- a/bsd_eth_drivers/if_le/if_le_ledma.c +++ /dev/null @@ -1,490 +0,0 @@ -/* $NetBSD: if_le_ledma.c,v 1.26 2005/12/11 12:23:44 christos Exp $ */ - -/*- - * Copyright (c) 1997, 1998 The NetBSD Foundation, Inc. - * All rights reserved. - * - * This code is derived from software contributed to The NetBSD Foundation - * by Charles M. Hannum; Jason R. Thorpe of the Numerical Aerospace - * Simulation Facility, NASA Ames Research Center; Paul Kranenburg. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the NetBSD - * Foundation, Inc. and its contributors. - * 4. Neither the name of The NetBSD Foundation nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS - * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS - * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) 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. - */ - -#include -__FBSDID("$FreeBSD: src/sys/dev/le/if_le_ledma.c,v 1.4 2007/02/23 12:18:45 piso Exp $"); - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -#include -#include -#include - -#include -#include -#include - -#include -#include - -#include -#include -#include - -#define LEDMA_ALIGNMENT 8 /* ring desc. alignmet for NCR92C990 */ -#define LEDMA_BOUNDARY (16*1024*1024) /* must not cross 16MB boundary */ -#define LEDMA_MEMSIZE (16*1024) /* LANCE memory size */ -#define LEREG1_RDP 0 /* Register Data Port */ -#define LEREG1_RAP 2 /* Register Address Port */ - -struct le_dma_softc { - struct am7990_softc sc_am7990; /* glue to MI code */ - - int sc_rrid; - struct resource *sc_rres; - bus_space_tag_t sc_regt; - bus_space_handle_t sc_regh; - - int sc_irid; - struct resource *sc_ires; - void *sc_ih; - - bus_dma_tag_t sc_dmat; - bus_dmamap_t sc_dmam; - bus_addr_t sc_laddr; /* LANCE DMA address */ - - struct lsi64854_softc *sc_dma; /* pointer to DMA engine */ -}; - -static device_probe_t le_dma_probe; -static device_attach_t le_dma_attach; -static device_detach_t le_dma_detach; -static device_resume_t le_dma_resume; -static device_suspend_t le_dma_suspend; - -static device_method_t le_dma_methods[] = { - /* Device interface */ - DEVMETHOD(device_probe, le_dma_probe), - DEVMETHOD(device_attach, le_dma_attach), - DEVMETHOD(device_detach, le_dma_detach), - /* We can just use the suspend method here. */ - DEVMETHOD(device_shutdown, le_dma_suspend), - DEVMETHOD(device_suspend, le_dma_suspend), - DEVMETHOD(device_resume, le_dma_resume), - - { 0, 0 } -}; - -DEFINE_CLASS_0(le, le_dma_driver, le_dma_methods, sizeof(struct le_dma_softc)); -DRIVER_MODULE(le, dma, le_dma_driver, le_devclass, 0, 0); -MODULE_DEPEND(le, ether, 1, 1, 1); - -/* - * Media types supported - */ -static const int le_dma_supmedia[] = { - IFM_MAKEWORD(IFM_ETHER, IFM_AUTO, 0, 0), - IFM_MAKEWORD(IFM_ETHER, IFM_10_T, 0, 0), - IFM_MAKEWORD(IFM_ETHER, IFM_10_5, 0, 0) -}; - -static void le_dma_wrcsr(struct lance_softc *, uint16_t, uint16_t); -static uint16_t le_dma_rdcsr(struct lance_softc *, uint16_t); -static void le_dma_setutp(struct lance_softc *); -static void le_dma_setaui(struct lance_softc *); -static int le_dma_supmediachange(struct lance_softc *); -static void le_dma_supmediastatus(struct lance_softc *, struct ifmediareq *); -static void le_dma_hwreset(struct lance_softc *); -static int le_dma_hwintr(struct lance_softc *); -static void le_dma_nocarrier(struct lance_softc *); -static bus_dmamap_callback_t le_dma_dma_callback; - -static void -le_dma_wrcsr(struct lance_softc *sc, uint16_t port, uint16_t val) -{ - struct le_dma_softc *lesc = (struct le_dma_softc *)sc; - - bus_space_write_2(lesc->sc_regt, lesc->sc_regh, LEREG1_RAP, port); - bus_space_barrier(lesc->sc_regt, lesc->sc_regh, LEREG1_RAP, 2, - BUS_SPACE_BARRIER_WRITE); - bus_space_write_2(lesc->sc_regt, lesc->sc_regh, LEREG1_RDP, val); -} - -static uint16_t -le_dma_rdcsr(struct lance_softc *sc, uint16_t port) -{ - struct le_dma_softc *lesc = (struct le_dma_softc *)sc; - - bus_space_write_2(lesc->sc_regt, lesc->sc_regh, LEREG1_RAP, port); - bus_space_barrier(lesc->sc_regt, lesc->sc_regh, LEREG1_RAP, 2, - BUS_SPACE_BARRIER_WRITE); - return (bus_space_read_2(lesc->sc_regt, lesc->sc_regh, LEREG1_RDP)); -} - -static void -le_dma_setutp(struct lance_softc *sc) -{ - struct lsi64854_softc *dma = ((struct le_dma_softc *)sc)->sc_dma; - - L64854_SCSR(dma, L64854_GCSR(dma) | E_TP_AUI); - DELAY(20000); /* We must not touch the LANCE chip for 20ms. */ -} - -static void -le_dma_setaui(struct lance_softc *sc) -{ - struct lsi64854_softc *dma = ((struct le_dma_softc *)sc)->sc_dma; - - L64854_SCSR(dma, L64854_GCSR(dma) & ~E_TP_AUI); - DELAY(20000); /* We must not touch the LANCE chip for 20ms. */ -} - -static int -le_dma_supmediachange(struct lance_softc *sc) -{ - struct ifmedia *ifm = &sc->sc_media; - - if (IFM_TYPE(ifm->ifm_media) != IFM_ETHER) - return (EINVAL); - - /* - * Switch to the selected media. If autoselect is set, we don't - * really have to do anything. We'll switch to the other media - * when we detect loss of carrier. - */ - switch (IFM_SUBTYPE(ifm->ifm_media)) { - case IFM_10_T: - le_dma_setutp(sc); - break; - - case IFM_10_5: - le_dma_setaui(sc); - break; - - case IFM_AUTO: - break; - - default: - return (EINVAL); - } - - return (0); -} - -static void -le_dma_supmediastatus(struct lance_softc *sc, struct ifmediareq *ifmr) -{ - struct lsi64854_softc *dma = ((struct le_dma_softc *)sc)->sc_dma; - - /* - * Notify the world which media we're currently using. - */ - if (L64854_GCSR(dma) & E_TP_AUI) - ifmr->ifm_active = IFM_MAKEWORD(IFM_ETHER, IFM_10_T, 0, 0); - else - ifmr->ifm_active = IFM_MAKEWORD(IFM_ETHER, IFM_10_5, 0, 0); -} - -static void -le_dma_hwreset(struct lance_softc *sc) -{ - struct le_dma_softc *lesc = (struct le_dma_softc *)sc; - struct lsi64854_softc *dma = lesc->sc_dma; - uint32_t aui_bit, csr; - - /* - * Reset DMA channel. - */ - csr = L64854_GCSR(dma); - aui_bit = csr & E_TP_AUI; - DMA_RESET(dma); - - /* Write bits 24-31 of Lance address. */ - bus_space_write_4(dma->sc_regt, dma->sc_regh, L64854_REG_ENBAR, - lesc->sc_laddr & 0xff000000); - - DMA_ENINTR(dma); - - /* - * Disable E-cache invalidates on chip writes. - * Retain previous cable selection bit. - */ - csr = L64854_GCSR(dma); - csr |= (E_DSBL_WR_INVAL | aui_bit); - L64854_SCSR(dma, csr); - DELAY(20000); /* We must not touch the LANCE chip for 20ms. */ -} - -static int -le_dma_hwintr(struct lance_softc *sc) -{ - struct le_dma_softc *lesc = (struct le_dma_softc *)sc; - struct lsi64854_softc *dma = lesc->sc_dma; - - return (DMA_INTR(dma)); -} - -static void -le_dma_nocarrier(struct lance_softc *sc) -{ - struct le_dma_softc *lesc = (struct le_dma_softc *)sc; - - /* - * Check if the user has requested a certain cable type, and - * if so, honor that request. - */ - - if (L64854_GCSR(lesc->sc_dma) & E_TP_AUI) { - switch (IFM_SUBTYPE(sc->sc_media.ifm_media)) { - case IFM_10_5: - case IFM_AUTO: - if_printf(sc->sc_ifp, "lost carrier on UTP port, " - "switching to AUI port\n"); - le_dma_setaui(sc); - } - } else { - switch (IFM_SUBTYPE(sc->sc_media.ifm_media)) { - case IFM_10_T: - case IFM_AUTO: - if_printf(sc->sc_ifp, "lost carrier on AUI port, " - "switching to UTP port\n"); - le_dma_setutp(sc); - } - } -} - -static void -le_dma_dma_callback(void *xsc, bus_dma_segment_t *segs, int nsegs, int error) -{ - struct le_dma_softc *lesc = (struct le_dma_softc *)xsc; - - if (error != 0) - return; - KASSERT(nsegs == 1, ("%s: bad DMA segment count", __func__)); - lesc->sc_laddr = segs[0].ds_addr; -} - -static int -le_dma_probe(device_t dev) -{ - - if (strcmp(ofw_bus_get_name(dev), "le") == 0) { - device_set_desc(dev, "LANCE Ethernet"); - return (BUS_PROBE_DEFAULT); - } - return (ENXIO); -} - -static int -le_dma_attach(device_t dev) -{ - struct le_dma_softc *lesc; - struct lsi64854_softc *dma; - struct lance_softc *sc; - int error; - - lesc = device_get_softc(dev); - sc = &lesc->sc_am7990.lsc; - - LE_LOCK_INIT(sc, device_get_nameunit(dev)); - - /* - * Establish link to `ledma' device. - * XXX hackery. - */ - dma = (struct lsi64854_softc *)device_get_softc(device_get_parent(dev)); - lesc->sc_dma = dma; - lesc->sc_dma->sc_client = lesc; - - lesc->sc_rrid = 0; - lesc->sc_rres = bus_alloc_resource_any(dev, SYS_RES_MEMORY, - &lesc->sc_rrid, RF_ACTIVE); - if (lesc->sc_rres == NULL) { - device_printf(dev, "cannot allocate registers\n"); - error = ENXIO; - goto fail_mtx; - } - lesc->sc_regt = rman_get_bustag(lesc->sc_rres); - lesc->sc_regh = rman_get_bushandle(lesc->sc_rres); - - lesc->sc_irid = 0; - if ((lesc->sc_ires = bus_alloc_resource_any(dev, SYS_RES_IRQ, - &lesc->sc_irid, RF_SHAREABLE | RF_ACTIVE)) == NULL) { - device_printf(dev, "cannot allocate interrupt\n"); - error = ENXIO; - goto fail_rres; - } - - sc->sc_memsize = LEDMA_MEMSIZE; - error = bus_dma_tag_create( - dma->sc_parent_dmat, /* parent */ - LEDMA_ALIGNMENT, /* alignment */ - LEDMA_BOUNDARY, /* boundary */ - BUS_SPACE_MAXADDR_32BIT, /* lowaddr */ - BUS_SPACE_MAXADDR, /* highaddr */ - NULL, NULL, /* filter, filterarg */ - sc->sc_memsize, /* maxsize */ - 1, /* nsegments */ - sc->sc_memsize, /* maxsegsize */ - 0, /* flags */ - NULL, NULL, /* lockfunc, lockarg */ - &lesc->sc_dmat); - if (error != 0) { - device_printf(dev, "cannot allocate buffer DMA tag\n"); - goto fail_ires; - } - - error = bus_dmamem_alloc(lesc->sc_dmat, (void **)&sc->sc_mem, - BUS_DMA_WAITOK | BUS_DMA_COHERENT, &lesc->sc_dmam); - if (error != 0) { - device_printf(dev, "cannot allocate DMA buffer memory\n"); - goto fail_dtag; - } - - lesc->sc_laddr = 0; - error = bus_dmamap_load(lesc->sc_dmat, lesc->sc_dmam, sc->sc_mem, - sc->sc_memsize, le_dma_dma_callback, lesc, 0); - if (error != 0 || lesc->sc_laddr == 0) { - device_printf(dev, "cannot load DMA buffer map\n"); - goto fail_dmem; - } - - sc->sc_addr = lesc->sc_laddr & 0xffffff; - sc->sc_flags = 0; - sc->sc_conf3 = LE_C3_BSWP | LE_C3_ACON | LE_C3_BCON; - - sc->sc_mediachange = le_dma_supmediachange; - sc->sc_mediastatus = le_dma_supmediastatus; - sc->sc_supmedia = le_dma_supmedia; - sc->sc_nsupmedia = sizeof(le_dma_supmedia) / sizeof(le_dma_supmedia[0]); - sc->sc_defaultmedia = le_dma_supmedia[0]; - - OF_getetheraddr(dev, sc->sc_enaddr); - - sc->sc_copytodesc = lance_copytobuf_contig; - sc->sc_copyfromdesc = lance_copyfrombuf_contig; - sc->sc_copytobuf = lance_copytobuf_contig; - sc->sc_copyfrombuf = lance_copyfrombuf_contig; - sc->sc_zerobuf = lance_zerobuf_contig; - - sc->sc_rdcsr = le_dma_rdcsr; - sc->sc_wrcsr = le_dma_wrcsr; - sc->sc_hwreset = le_dma_hwreset; - sc->sc_hwintr = le_dma_hwintr; - sc->sc_nocarrier = le_dma_nocarrier; - - error = am7990_config(&lesc->sc_am7990, device_get_name(dev), - device_get_unit(dev)); - if (error != 0) { - device_printf(dev, "cannot attach Am7990\n"); - goto fail_dmap; - } - - error = bus_setup_intr(dev, lesc->sc_ires, INTR_TYPE_NET | INTR_MPSAFE, - NULL, am7990_intr, sc, &lesc->sc_ih); - if (error != 0) { - device_printf(dev, "cannot set up interrupt\n"); - goto fail_am7990; - } - - return (0); - - fail_am7990: - am7990_detach(&lesc->sc_am7990); - fail_dmap: - bus_dmamap_unload(lesc->sc_dmat, lesc->sc_dmam); - fail_dmem: - bus_dmamem_free(lesc->sc_dmat, sc->sc_mem, lesc->sc_dmam); - fail_dtag: - bus_dma_tag_destroy(lesc->sc_dmat); - fail_ires: - bus_release_resource(dev, SYS_RES_IRQ, lesc->sc_irid, lesc->sc_ires); - fail_rres: - bus_release_resource(dev, SYS_RES_MEMORY, lesc->sc_rrid, lesc->sc_rres); - fail_mtx: - LE_LOCK_DESTROY(sc); - return (error); -} - -static int -le_dma_detach(device_t dev) -{ - struct le_dma_softc *lesc; - struct lance_softc *sc; - - lesc = device_get_softc(dev); - sc = &lesc->sc_am7990.lsc; - - bus_teardown_intr(dev, lesc->sc_ires, lesc->sc_ih); - am7990_detach(&lesc->sc_am7990); - bus_dmamap_unload(lesc->sc_dmat, lesc->sc_dmam); - bus_dmamem_free(lesc->sc_dmat, sc->sc_mem, lesc->sc_dmam); - bus_dma_tag_destroy(lesc->sc_dmat); - bus_release_resource(dev, SYS_RES_IRQ, lesc->sc_irid, lesc->sc_ires); - bus_release_resource(dev, SYS_RES_MEMORY, lesc->sc_rrid, lesc->sc_rres); - LE_LOCK_DESTROY(sc); - - return (0); -} - -static int -le_dma_suspend(device_t dev) -{ - struct le_dma_softc *lesc; - - lesc = device_get_softc(dev); - - lance_suspend(&lesc->sc_am7990.lsc); - - return (0); -} - -static int -le_dma_resume(device_t dev) -{ - struct le_dma_softc *lesc; - - lesc = device_get_softc(dev); - - lance_resume(&lesc->sc_am7990.lsc); - - return (0); -} diff --git a/bsd_eth_drivers/if_le/lebuffer_sbus.c b/bsd_eth_drivers/if_le/lebuffer_sbus.c deleted file mode 100644 index b9414f2..0000000 --- a/bsd_eth_drivers/if_le/lebuffer_sbus.c +++ /dev/null @@ -1,300 +0,0 @@ -/*- - * Copyright (c) 2006 Marius Strobl - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * 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. - */ - -#include -__FBSDID("$FreeBSD: src/sys/dev/le/lebuffer_sbus.c,v 1.1 2007/01/20 12:53:30 marius Exp $"); - -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include - -#include -#include -#include - -#include -#include -#include - -struct lebuffer_devinfo { - struct ofw_bus_devinfo ldi_obdinfo; - struct resource_list ldi_rl; -}; - -static devclass_t lebuffer_devclass; - -static device_probe_t lebuffer_probe; -static device_attach_t lebuffer_attach; -static device_detach_t lebuffer_detach; -static bus_print_child_t lebuffer_print_child; -static bus_probe_nomatch_t lebuffer_probe_nomatch; -static bus_get_resource_list_t lebuffer_get_resource_list; -static ofw_bus_get_devinfo_t lebuffer_get_devinfo; - -static struct lebuffer_devinfo *lebuffer_setup_dinfo(device_t, phandle_t); -static void lebuffer_destroy_dinfo(struct lebuffer_devinfo *); -static int lebuffer_print_res(struct lebuffer_devinfo *); - -static device_method_t lebuffer_methods[] = { - /* Device interface */ - DEVMETHOD(device_probe, lebuffer_probe), - DEVMETHOD(device_attach, lebuffer_attach), - DEVMETHOD(device_detach, lebuffer_detach), - DEVMETHOD(device_shutdown, bus_generic_shutdown), - DEVMETHOD(device_suspend, bus_generic_suspend), - DEVMETHOD(device_resume, bus_generic_resume), - - /* Bus interface */ - DEVMETHOD(bus_print_child, lebuffer_print_child), - DEVMETHOD(bus_probe_nomatch, lebuffer_probe_nomatch), - DEVMETHOD(bus_setup_intr, bus_generic_setup_intr), - DEVMETHOD(bus_teardown_intr, bus_generic_teardown_intr), - DEVMETHOD(bus_alloc_resource, bus_generic_rl_alloc_resource), - DEVMETHOD(bus_release_resource, bus_generic_rl_release_resource), - DEVMETHOD(bus_activate_resource, bus_generic_activate_resource), - DEVMETHOD(bus_deactivate_resource, bus_generic_deactivate_resource), - DEVMETHOD(bus_get_resource_list, lebuffer_get_resource_list), - DEVMETHOD(bus_get_resource, bus_generic_rl_get_resource), - - /* ofw_bus interface */ - DEVMETHOD(ofw_bus_get_devinfo, lebuffer_get_devinfo), - DEVMETHOD(ofw_bus_get_compat, ofw_bus_gen_get_compat), - DEVMETHOD(ofw_bus_get_model, ofw_bus_gen_get_model), - DEVMETHOD(ofw_bus_get_name, ofw_bus_gen_get_name), - DEVMETHOD(ofw_bus_get_node, ofw_bus_gen_get_node), - DEVMETHOD(ofw_bus_get_type, ofw_bus_gen_get_type), - - { 0, 0 } -}; - -DEFINE_CLASS_0(lebuffer, lebuffer_driver, lebuffer_methods, 1); -DRIVER_MODULE(lebuffer, sbus, lebuffer_driver, lebuffer_devclass, 0, 0); - -static int -lebuffer_probe(device_t dev) -{ - const char *name; - - name = ofw_bus_get_name(dev); - if (strcmp(name, "lebuffer") == 0) { - device_set_desc_copy(dev, name); - return (0); - } - return (ENXIO); -} - -static int -lebuffer_attach(device_t dev) -{ - struct lebuffer_devinfo *ldi; - device_t cdev; - phandle_t child; - int children; - - children = 0; - for (child = OF_child(ofw_bus_get_node(dev)); child != 0; - child = OF_peer(child)) { - if ((ldi = lebuffer_setup_dinfo(dev, child)) == NULL) - continue; - if (children != 0) { - device_printf(dev, - "<%s>: only one child per buffer supported\n", - ldi->ldi_obdinfo.obd_name); - lebuffer_destroy_dinfo(ldi); - continue; - } - if ((cdev = device_add_child(dev, NULL, -1)) == NULL) { - device_printf(dev, "<%s>: device_add_child failed\n", - ldi->ldi_obdinfo.obd_name); - lebuffer_destroy_dinfo(ldi); - continue; - } - device_set_ivars(cdev, ldi); - children++; - } - return (bus_generic_attach(dev)); -} - -static int -lebuffer_detach(device_t dev) -{ - device_t *children; - int i, nchildren; - - bus_generic_detach(dev); - if (device_get_children(dev, &children, &nchildren) == 0) { - for (i = 0; i < nchildren; i++) { - lebuffer_destroy_dinfo(device_get_ivars(children[i])); - device_delete_child(dev, children[i]); - } - free(children, M_TEMP); - } - return (0); -} - -static struct lebuffer_devinfo * -lebuffer_setup_dinfo(device_t dev, phandle_t node) -{ - struct lebuffer_devinfo *ldi; - struct sbus_regs *reg; - uint32_t base, iv, *intr; - int i, nreg, nintr, slot, rslot; - - ldi = malloc(sizeof(*ldi), M_DEVBUF, M_WAITOK | M_ZERO); - if (ofw_bus_gen_setup_devinfo(&ldi->ldi_obdinfo, node) != 0) { - free(ldi, M_DEVBUF); - return (NULL); - } - resource_list_init(&ldi->ldi_rl); - slot = -1; - nreg = OF_getprop_alloc(node, "reg", sizeof(*reg), (void **)®); - if (nreg == -1) { - device_printf(dev, "<%s>: incomplete\n", - ldi->ldi_obdinfo.obd_name); - goto fail; - } - for (i = 0; i < nreg; i++) { - base = reg[i].sbr_offset; - if (SBUS_ABS(base)) { - rslot = SBUS_ABS_TO_SLOT(base); - base = SBUS_ABS_TO_OFFSET(base); - } else - rslot = reg[i].sbr_slot; - if (slot != -1 && slot != rslot) { - device_printf(dev, "<%s>: multiple slots\n", - ldi->ldi_obdinfo.obd_name); - free(reg, M_OFWPROP); - goto fail; - } - slot = rslot; - - resource_list_add(&ldi->ldi_rl, SYS_RES_MEMORY, i, base, - base + reg[i].sbr_size, reg[i].sbr_size); - } - free(reg, M_OFWPROP); - if (slot != sbus_get_slot(dev)) { - device_printf(dev, "<%s>: parent and child slot do not match\n", - ldi->ldi_obdinfo.obd_name); - goto fail; - } - - /* - * The `interrupts' property contains the SBus interrupt level. - */ - nintr = OF_getprop_alloc(node, "interrupts", sizeof(*intr), - (void **)&intr); - if (nintr != -1) { - for (i = 0; i < nintr; i++) { - iv = intr[i]; - /* - * SBus card devices need the slot number encoded into - * the vector as this is generally not done. - */ - if ((iv & INTMAP_OBIO_MASK) == 0) - iv |= slot << 3; - /* Set the IGN as appropriate. */ - iv |= sbus_get_ign(dev) << INTMAP_IGN_SHIFT; - resource_list_add(&ldi->ldi_rl, SYS_RES_IRQ, i, - iv, iv, 1); - } - free(intr, M_OFWPROP); - } - return (ldi); - - fail: - lebuffer_destroy_dinfo(ldi); - return (NULL); -} - -static void -lebuffer_destroy_dinfo(struct lebuffer_devinfo *dinfo) -{ - - resource_list_free(&dinfo->ldi_rl); - ofw_bus_gen_destroy_devinfo(&dinfo->ldi_obdinfo); - free(dinfo, M_DEVBUF); -} - -static int -lebuffer_print_child(device_t dev, device_t child) -{ - int rv; - - rv = bus_print_child_header(dev, child); - rv += lebuffer_print_res(device_get_ivars(child)); - rv += bus_print_child_footer(dev, child); - return (rv); -} - -static void -lebuffer_probe_nomatch(device_t dev, device_t child) -{ - const char *type; - - device_printf(dev, "<%s>", ofw_bus_get_name(child)); - lebuffer_print_res(device_get_ivars(child)); - type = ofw_bus_get_type(child); - printf(" type %s (no driver attached)\n", - type != NULL ? type : "unknown"); -} - -static struct resource_list * -lebuffer_get_resource_list(device_t dev, device_t child) -{ - struct lebuffer_devinfo *ldi; - - ldi = device_get_ivars(child); - return (&ldi->ldi_rl); -} - -static const struct ofw_bus_devinfo * -lebuffer_get_devinfo(device_t bus, device_t child) -{ - struct lebuffer_devinfo *ldi; - - ldi = device_get_ivars(child); - return (&ldi->ldi_obdinfo); -} - -static int -lebuffer_print_res(struct lebuffer_devinfo *ldi) -{ - int rv; - - rv = 0; - rv += resource_list_print_type(&ldi->ldi_rl, "mem", SYS_RES_MEMORY, - "%#lx"); - rv += resource_list_print_type(&ldi->ldi_rl, "irq", SYS_RES_IRQ, "%ld"); - return (rv); -} diff --git a/bsd_eth_drivers/if_pcn/Makefile b/bsd_eth_drivers/if_pcn/Makefile deleted file mode 100644 index 7e52001..0000000 --- a/bsd_eth_drivers/if_pcn/Makefile +++ /dev/null @@ -1,143 +0,0 @@ -# -# Makefile.leaf,v 1.7 2002/07/22 22:56:09 joel Exp -# -# Templates/Makefile.leaf -# Template leaf node Makefile -# -# -LIBNAME=libif_pcn.a - -LINKS=pci/if_pcnreg.h - -# C source names, if any, go here -- minus the .c -C_PIECES= - -C_PIECES+=if_pcn - -C_FILES=$(C_PIECES:%=%.c) -C_O_FILES=$(C_PIECES:%=${ARCH}/%.o) - -# C++ source names, if any, go here -- minus the .cc -CC_PIECES= -CC_FILES=$(CC_PIECES:%=%.cc) -CC_O_FILES=$(CC_PIECES:%=${ARCH}/%.o) - -H_FILES= - -# Assembly source names, if any, go here -- minus the .S -S_PIECES= -S_FILES=$(S_PIECES:%=%.S) -S_O_FILES=$(S_FILES:%.S=${ARCH}/%.o) - -SRCS=$(C_FILES) $(CC_FILES) $(H_FILES) $(S_FILES) -OBJS=$(C_O_FILES) $(CC_O_FILES) $(S_O_FILES) - -# If your PGMS target has the '.exe' extension, a statically -# linked application is generated. -# If it has a '.obj' extension, a loadable module is built. -# -# -ifdef LIBNAME -LIB=${ARCH}/${LIBNAME} -else -PGMS=${ARCH}/if_pcn.obj -endif - -# List of RTEMS Classic API Managers to be included in the application -# goes here. Use: -# MANAGERS=all -# to include all RTEMS Classic API Managers in the application or -# something like this to include a specific set of managers. -# MANAGERS=io event message rate_monotonic semaphore timer -# -# UNUSED for loadable modules -MANAGERS=ALL - -ifndef RTEMS_MAKEFILE_PATH -$(error you need to set the RTEMS_MAKEFILE_PATH environment variable) -endif - -all: - -depend: ${LINKS} - -include $(RTEMS_MAKEFILE_PATH)/Makefile.inc - -include $(RTEMS_CUSTOM) -ifdef LIBNAME -include $(RTEMS_ROOT)/make/lib.cfg -else -include $(RTEMS_ROOT)/make/leaf.cfg -endif - -# -# (OPTIONAL) Add local stuff here using += -# - -#DEFINES += -DPCN_DEBUG -CPPFLAGS += -I. -I../libbsdport -I../libbsdport/dummyheaders -CFLAGS += - -# -# CFLAGS_DEBUG_V are used when the `make debug' target is built. -# To link your application with the non-optimized RTEMS routines, -# uncomment the following line: -# CFLAGS_DEBUG_V += -qrtems_debug -# - -LD_PATHS += -LD_LIBS += -LDFLAGS += - -# -# Add your list of files to delete here. The config files -# already know how to delete some stuff, so you may want -# to just run 'make clean' first to see what gets missed. -# 'make clobber' already includes 'make clean' -# - -CLEAN_ADDITIONS += -CLOBBER_ADDITIONS += pci - -all: ${LINKS} ${ARCH} $(SRCS) $(PGMS) ${LIB} - -pci/%:% - if [ ! -d pci ]; then mkdir -p pci; fi ; ln -s ../$^ $@ - -#How to make a relocatable object -$(filter %.obj, $(PGMS)): ${OBJS} - $(make-obj) - -#How to make an executable (statically linked) -$(filter %.exe,$(PGMS)): ${LINK_FILES} - $(make-exe) -ifdef ELFEXT -ifdef XSYMS - $(XSYMS) $(@:%.exe=%.$(ELFEXT)) $(@:%.exe=%.sym) -endif -endif - -$(LIB): ${OBJS} - $(make-library) - -ifndef RTEMS_SITE_INSTALLDIR -RTEMS_SITE_INSTALLDIR = $(PROJECT_RELEASE) -endif - -${RTEMS_SITE_INSTALLDIR}/include \ -${RTEMS_SITE_INSTALLDIR}/lib \ -${RTEMS_SITE_INSTALLDIR}/bin: - test -d $@ || mkdir -p $@ -# Install the program(s), appending _g or _p as appropriate. -# for include files, just use $(INSTALL_CHANGE) -# -# - Some BSPs might generate bootable executables in yet another -# format (such as .srec) and you might need to extend the rule -# below so the essential files get installed. YMMV. -ifdef LIBNAME -install: all $(RTEMS_SITE_INSTALLDIR)/lib - $(INSTALL_VARIANT) -m 644 ${LIB} ${RTEMS_SITE_INSTALLDIR}/lib -else -install: all $(RTEMS_SITE_INSTALLDIR)/bin - $(INSTALL_VARIANT) -m 555 ${PGMS} ${PGMS:%.exe=%.bin} ${PGMS:%.exe=%.sym} ${RTEMS_SITE_INSTALLDIR}/bin -endif diff --git a/bsd_eth_drivers/if_pcn/README.rtems b/bsd_eth_drivers/if_pcn/README.rtems deleted file mode 100644 index ab8ba09..0000000 --- a/bsd_eth_drivers/if_pcn/README.rtems +++ /dev/null @@ -1,73 +0,0 @@ -RTEMS PORT OF THE 'pcn' ETHERNET DRIVER -======================================= - -This is a port of the FreeBSD 'pcn' driver as of -2007/7/17 (checked out from FreeBSD/head on that date). - -SUPPORTED BSPs: -- you need 'libbsdport' which in turn needs 'libbspExt' - These work for i386/pc386 and powerpc/new-exception-processing - BSPs, i.e., the BSP must implement and . - -USAGE: -- to attach this driver: - * define a NULL terminated list with all libbsdport supported - drivers you want to include with your application: - - extern driver_t libbsdport_pcn_driver; - - driver_t *libbsdport_netdriver_table[] = { - &libbsdport_pcn_driver, - /* other drivers here or upstream of 'pcn' if they support - * the same hardware but are preferred. - */ - 0 - }; - - * specify libbsdport_netdriver_attach for the 'attach' function - pointer in struct rtems_bsdnet_ifconfig. - - * use the 'name' field in struct rtems_bsdnet_ifconfig to filter - drivers and device instances: - - - - either may be omitted which means that the next available - driver/hardware device is to be used. Here are a few examples: - - "" /* use first device found supported by any driver in the - * libbsdport_driver_table[]. - */ - - "pcn2" /* use second device supported by the 'pcn' driver */ - - Notes: Counting instances begins with 1 (not 0). - Consult libbsdport/README for more information. - -KNOWN ISSUES: -- 'ignore_broadcast' and 'mtu' settings from - struct rtems_bsdnet_ifconfig are ignored. I haven't seen - many drivers that honour 'ignore_broadcast' and 'mtu' can be - set using a ioctl(). I'm trying to keep changes to BSD sources - minimal... -- ring sizes are restricted fixed to hardcoded size. -- Only the internal phy of the 973/975 chips are supported - and will allow SIOCGIFMEDIA/SIOCSIFMEDIA to work. I don't know - what happens with other chips or external phys. - Probably, the factory-default setup should work with autonegotiation - but the ioctls wont. YMMV. - -OTHER NOTES: -- you can use the (more generic) 'le' driver for the 79C971 - and upwards chips, too, but 'pcn' supposedly uses more advanced - features of these chips. - -TESTED WITH: - Technobox 10/100-TX Ethernet PMC (AMD Am79C973 chip) - -TESTED ON: - rtems-4.7 - powerpc/beatnik (motorola MVME5500 and MVME6100 VME boards) - i386/pc686 (concurrent technologies PP410 compact PCI) - -T.S, 200707 diff --git a/bsd_eth_drivers/if_re/Makefile.am b/bsd_eth_drivers/if_re/Makefile.am deleted file mode 100644 index 5c33e09..0000000 --- a/bsd_eth_drivers/if_re/Makefile.am +++ /dev/null @@ -1,19 +0,0 @@ -# $Id$ -AUTOMAKE_OPTIONS=foreign - -include $(top_srcdir)/rtems-pre.am - -libif_re_a_SOURCES = if_re.c - -##EXTRA_libif_re_a_SOURCES = - -libif_re_a_LIBADD = - -libif_re_a_DEPENDENCIES = $(libif_re_a_LIBADD) - -lib_LIBRARIES = libif_re.a - -AM_CPPFLAGS += -I$(srcdir) -AM_CPPFLAGS += -I$(srcdir)/../libbsdport -I../libbsdport -I../libbsdport/dummyheaders - -include $(top_srcdir)/rtems.am diff --git a/bsd_eth_drivers/if_re/if_re.c b/bsd_eth_drivers/if_re/if_re.c deleted file mode 100644 index e39a52a..0000000 --- a/bsd_eth_drivers/if_re/if_re.c +++ /dev/null @@ -1,2890 +0,0 @@ -/*- - * Copyright (c) 1997, 1998-2003 - * Bill Paul . All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by Bill Paul. - * 4. Neither the name of the author nor the names of any co-contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY Bill Paul AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL Bill Paul OR THE VOICES IN HIS HEAD - * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) 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. - */ - -#ifdef __rtems__ -#include -#endif - -#include -__FBSDID("$FreeBSD: src/sys/dev/re/if_re.c,v 1.46.2.39.2.1 2008/10/02 02:57:24 kensmith Exp $"); - -/* - * RealTek 8139C+/8169/8169S/8110S/8168/8111/8101E PCI NIC driver - * - * Written by Bill Paul - * Senior Networking Software Engineer - * Wind River Systems - */ - -/* - * This driver is designed to support RealTek's next generation of - * 10/100 and 10/100/1000 PCI ethernet controllers. There are currently - * seven devices in this family: the RTL8139C+, the RTL8169, the RTL8169S, - * RTL8110S, the RTL8168, the RTL8111 and the RTL8101E. - * - * The 8139C+ is a 10/100 ethernet chip. It is backwards compatible - * with the older 8139 family, however it also supports a special - * C+ mode of operation that provides several new performance enhancing - * features. These include: - * - * o Descriptor based DMA mechanism. Each descriptor represents - * a single packet fragment. Data buffers may be aligned on - * any byte boundary. - * - * o 64-bit DMA - * - * o TCP/IP checksum offload for both RX and TX - * - * o High and normal priority transmit DMA rings - * - * o VLAN tag insertion and extraction - * - * o TCP large send (segmentation offload) - * - * Like the 8139, the 8139C+ also has a built-in 10/100 PHY. The C+ - * programming API is fairly straightforward. The RX filtering, EEPROM - * access and PHY access is the same as it is on the older 8139 series - * chips. - * - * The 8169 is a 64-bit 10/100/1000 gigabit ethernet MAC. It has almost the - * same programming API and feature set as the 8139C+ with the following - * differences and additions: - * - * o 1000Mbps mode - * - * o Jumbo frames - * - * o GMII and TBI ports/registers for interfacing with copper - * or fiber PHYs - * - * o RX and TX DMA rings can have up to 1024 descriptors - * (the 8139C+ allows a maximum of 64) - * - * o Slight differences in register layout from the 8139C+ - * - * The TX start and timer interrupt registers are at different locations - * on the 8169 than they are on the 8139C+. Also, the status word in the - * RX descriptor has a slightly different bit layout. The 8169 does not - * have a built-in PHY. Most reference boards use a Marvell 88E1000 'Alaska' - * copper gigE PHY. - * - * The 8169S/8110S 10/100/1000 devices have built-in copper gigE PHYs - * (the 'S' stands for 'single-chip'). These devices have the same - * programming API as the older 8169, but also have some vendor-specific - * registers for the on-board PHY. The 8110S is a LAN-on-motherboard - * part designed to be pin-compatible with the RealTek 8100 10/100 chip. - * - * This driver takes advantage of the RX and TX checksum offload and - * VLAN tag insertion/extraction features. It also implements TX - * interrupt moderation using the timer interrupt registers, which - * significantly reduces TX interrupt load. There is also support - * for jumbo frames, however the 8169/8169S/8110S can not transmit - * jumbo frames larger than 7440, so the max MTU possible with this - * driver is 7422 bytes. - */ - -#ifdef HAVE_KERNEL_OPTION_HEADERS -#include "opt_device_polling.h" -#endif - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include - -#include - -#include -#include -#include -#include - -#include -#include - -#include -#include - -MODULE_DEPEND(re, pci, 1, 1, 1); -MODULE_DEPEND(re, ether, 1, 1, 1); -MODULE_DEPEND(re, miibus, 1, 1, 1); - -/* "device miibus" required. See GENERIC if you get errors here. */ -#include "miibus_if.h" - -#ifdef __rtems__ -#include -#endif - -/* - * Default to using PIO access for this driver. - */ -#define RE_USEIOSPACE - -#ifndef __rtems__ -#include -#else -#include "if_rlreg.h" -#endif - -#define RE_CSUM_FEATURES (CSUM_IP | CSUM_TCP | CSUM_UDP) - -/* - * Various supported device vendors/types and their names. - */ -static struct rl_type re_devs[] = { - { DLINK_VENDORID, DLINK_DEVICEID_528T, RL_HWREV_8169S, - "D-Link DGE-528(T) Gigabit Ethernet Adapter" }, - { DLINK_VENDORID, DLINK_DEVICEID_528T, RL_HWREV_8169_8110SB, - "D-Link DGE-528(T) Rev.B1 Gigabit Ethernet Adapter" }, - { RT_VENDORID, RT_DEVICEID_8139, RL_HWREV_8139CPLUS, - "RealTek 8139C+ 10/100BaseTX" }, - { RT_VENDORID, RT_DEVICEID_8101E, RL_HWREV_8101E, - "RealTek 8101E PCIe 10/100baseTX" }, - { RT_VENDORID, RT_DEVICEID_8168, RL_HWREV_8168_SPIN1, - "RealTek 8168/8111B PCIe Gigabit Ethernet" }, - { RT_VENDORID, RT_DEVICEID_8168, RL_HWREV_8168_SPIN2, - "RealTek 8168/8111B PCIe Gigabit Ethernet" }, - { RT_VENDORID, RT_DEVICEID_8168, RL_HWREV_8168_SPIN3, - "RealTek 8168/8111B PCIe Gigabit Ethernet" }, - { RT_VENDORID, RT_DEVICEID_8169, RL_HWREV_8169, - "RealTek 8169 Gigabit Ethernet" }, - { RT_VENDORID, RT_DEVICEID_8169, RL_HWREV_8169S, - "RealTek 8169S Single-chip Gigabit Ethernet" }, - { RT_VENDORID, RT_DEVICEID_8169, RL_HWREV_8169_8110SB, - "RealTek 8169SB/8110SB Single-chip Gigabit Ethernet" }, - { RT_VENDORID, RT_DEVICEID_8169, RL_HWREV_8169_8110SC, - "RealTek 8169SC/8110SC Single-chip Gigabit Ethernet" }, - { RT_VENDORID, RT_DEVICEID_8169SC, RL_HWREV_8169_8110SC, - "RealTek 8169SC/8110SC Single-chip Gigabit Ethernet" }, - { RT_VENDORID, RT_DEVICEID_8169, RL_HWREV_8110S, - "RealTek 8110S Single-chip Gigabit Ethernet" }, - { COREGA_VENDORID, COREGA_DEVICEID_CGLAPCIGT, RL_HWREV_8169S, - "Corega CG-LAPCIGT (RTL8169S) Gigabit Ethernet" }, - { LINKSYS_VENDORID, LINKSYS_DEVICEID_EG1032, RL_HWREV_8169S, - "Linksys EG1032 (RTL8169S) Gigabit Ethernet" }, - { USR_VENDORID, USR_DEVICEID_997902, RL_HWREV_8169S, - "US Robotics 997902 (RTL8169S) Gigabit Ethernet" }, - { 0, 0, 0, NULL } -}; - -static struct rl_hwrev re_hwrevs[] = { - { RL_HWREV_8139, RL_8139, "" }, - { RL_HWREV_8139A, RL_8139, "A" }, - { RL_HWREV_8139AG, RL_8139, "A-G" }, - { RL_HWREV_8139B, RL_8139, "B" }, - { RL_HWREV_8130, RL_8139, "8130" }, - { RL_HWREV_8139C, RL_8139, "C" }, - { RL_HWREV_8139D, RL_8139, "8139D/8100B/8100C" }, - { RL_HWREV_8139CPLUS, RL_8139CPLUS, "C+"}, - { RL_HWREV_8168_SPIN1, RL_8169, "8168"}, - { RL_HWREV_8169, RL_8169, "8169"}, - { RL_HWREV_8169S, RL_8169, "8169S"}, - { RL_HWREV_8110S, RL_8169, "8110S"}, - { RL_HWREV_8169_8110SB, RL_8169, "8169SB"}, - { RL_HWREV_8169_8110SC, RL_8169, "8169SC"}, - { RL_HWREV_8100, RL_8139, "8100"}, - { RL_HWREV_8101, RL_8139, "8101"}, - { RL_HWREV_8100E, RL_8169, "8100E"}, - { RL_HWREV_8101E, RL_8169, "8101E"}, - { RL_HWREV_8168_SPIN2, RL_8169, "8168"}, - { RL_HWREV_8168_SPIN3, RL_8169, "8168"}, - { 0, 0, NULL } -}; - -static int re_probe (device_t); -static int re_attach (device_t); -static int re_detach (device_t); - -static int re_encap (struct rl_softc *, struct mbuf **, int *); - -static void re_dma_map_addr (void *, bus_dma_segment_t *, int, int); -static void re_dma_map_desc (void *, bus_dma_segment_t *, int, - bus_size_t, int); -static int re_allocmem (device_t, struct rl_softc *); -static int re_newbuf (struct rl_softc *, int, struct mbuf *); -static int re_rx_list_init (struct rl_softc *); -static int re_tx_list_init (struct rl_softc *); -#ifdef RE_FIXUP_RX -static __inline void re_fixup_rx - (struct mbuf *); -#endif -static int re_rxeof (struct rl_softc *); -static void re_txeof (struct rl_softc *); -#ifdef DEVICE_POLLING -static void re_poll (struct ifnet *, enum poll_cmd, int); -static void re_poll_locked (struct ifnet *, enum poll_cmd, int); -#endif -static void re_intr (void *); -static void re_tick (void *); -static void re_tx_task (void *, int); -static void re_int_task (void *, int); -static void re_start (struct ifnet *); -#ifndef __rtems__ -static int re_ioctl(struct ifnet *, u_long, caddr_t); -#else -static int re_ioctl(struct ifnet *, ioctl_command_t, caddr_t); -#endif -static void re_init (void *); -static void re_init_locked (struct rl_softc *); -static void re_stop (struct rl_softc *); -static void re_watchdog (struct rl_softc *); -#ifndef __rtems__ -static int re_suspend (device_t); -static int re_resume (device_t); -#endif -static void re_shutdown (device_t); -#ifndef __rtems__ -static int re_ifmedia_upd (struct ifnet *); -static void re_ifmedia_sts (struct ifnet *, struct ifmediareq *); -#endif - -static void re_eeprom_putbyte (struct rl_softc *, int); -static void re_eeprom_getword (struct rl_softc *, int, u_int16_t *); -static void re_read_eeprom (struct rl_softc *, caddr_t, int, int); -#ifndef __rtems__ -static int re_gmii_readreg (device_t, int, int); -#endif -static int re_gmii_writereg (device_t, int, int, int); - -#ifndef __rtems__ -static int re_miibus_readreg (device_t, int, int); -static int re_miibus_writereg (device_t, int, int, int); -static void re_miibus_statchg (device_t); -#endif - -static void re_setmulti (struct rl_softc *); -static void re_reset (struct rl_softc *); - -#ifdef RE_DIAG -static int re_diag (struct rl_softc *); -#endif - -#ifdef RE_USEIOSPACE -#define RL_RES SYS_RES_IOPORT -#define RL_RID RL_PCI_LOIO -#else -#define RL_RES SYS_RES_MEMORY -#define RL_RID RL_PCI_LOMEM -#endif - -#ifndef __rtems__ -static device_method_t re_methods[] = { - /* Device interface */ - DEVMETHOD(device_probe, re_probe), - DEVMETHOD(device_attach, re_attach), - DEVMETHOD(device_detach, re_detach), - DEVMETHOD(device_suspend, re_suspend), - DEVMETHOD(device_resume, re_resume), - DEVMETHOD(device_shutdown, re_shutdown), - - /* bus interface */ - DEVMETHOD(bus_print_child, bus_generic_print_child), - DEVMETHOD(bus_driver_added, bus_generic_driver_added), - - /* MII interface */ - DEVMETHOD(miibus_readreg, re_miibus_readreg), - DEVMETHOD(miibus_writereg, re_miibus_writereg), - DEVMETHOD(miibus_statchg, re_miibus_statchg), - - { 0, 0 } -}; - -static driver_t re_driver = { - "re", - re_methods, - sizeof(struct rl_softc) -}; - -static devclass_t re_devclass; - -DRIVER_MODULE(re, pci, re_driver, re_devclass, 0, 0); -DRIVER_MODULE(re, cardbus, re_driver, re_devclass, 0, 0); -DRIVER_MODULE(miibus, re, miibus_driver, miibus_devclass, 0, 0); -#else - -static int -re_irq_check_dis(device_t d) -{ - // struct re_softc *sc = device_get_softc(d); - printk( "check_dis\n" ); - return 0; -} - -static void -re_irq_en(device_t d) -{ - // struct re_softc *sc = device_get_softc(d); - /* This can be called from IRQ context -- since all register accesses - * involve RAP we must take care to preserve it across this routine! - */ - printk( "irq_en\n" ); -} - - -static device_method_t re_methods = { - probe: re_probe, - attach: re_attach, - shutdown: re_shutdown, - detach: re_detach, - irq_check_dis: re_irq_check_dis, - irq_en: re_irq_en, -}; - -driver_t libbsdport_re_driver = { - "re", - &re_methods, - DEV_TYPE_PCI, - sizeof(struct rl_softc) -}; - - -#endif - -#define EE_SET(x) \ - CSR_WRITE_1(sc, RL_EECMD, \ - CSR_READ_1(sc, RL_EECMD) | x) - -#define EE_CLR(x) \ - CSR_WRITE_1(sc, RL_EECMD, \ - CSR_READ_1(sc, RL_EECMD) & ~x) - -/* - * Send a read command and address to the EEPROM, check for ACK. - */ -static void -re_eeprom_putbyte(sc, addr) - struct rl_softc *sc; - int addr; -{ - register int d, i; - - d = addr | (RL_9346_READ << sc->rl_eewidth); - - /* - * Feed in each bit and strobe the clock. - */ - - for (i = 1 << (sc->rl_eewidth + 3); i; i >>= 1) { - if (d & i) { - EE_SET(RL_EE_DATAIN); - } else { - EE_CLR(RL_EE_DATAIN); - } - DELAY(100); - EE_SET(RL_EE_CLK); - DELAY(150); - EE_CLR(RL_EE_CLK); - DELAY(100); - } - - return; -} - -/* - * Read a word of data stored in the EEPROM at address 'addr.' - */ -static void -re_eeprom_getword(sc, addr, dest) - struct rl_softc *sc; - int addr; - u_int16_t *dest; -{ - register int i; - u_int16_t word = 0; - - /* - * Send address of word we want to read. - */ - re_eeprom_putbyte(sc, addr); - - /* - * Start reading bits from EEPROM. - */ - for (i = 0x8000; i; i >>= 1) { - EE_SET(RL_EE_CLK); - DELAY(100); - if (CSR_READ_1(sc, RL_EECMD) & RL_EE_DATAOUT) - word |= i; - EE_CLR(RL_EE_CLK); - DELAY(100); - } - - *dest = word; - - return; -} - -/* - * Read a sequence of words from the EEPROM. - */ -static void -re_read_eeprom(sc, dest, off, cnt) - struct rl_softc *sc; - caddr_t dest; - int off; - int cnt; -{ - int i; - u_int16_t word = 0, *ptr; - - CSR_SETBIT_1(sc, RL_EECMD, RL_EEMODE_PROGRAM); - - DELAY(100); - - for (i = 0; i < cnt; i++) { - CSR_SETBIT_1(sc, RL_EECMD, RL_EE_SEL); - re_eeprom_getword(sc, off + i, &word); - CSR_CLRBIT_1(sc, RL_EECMD, RL_EE_SEL); - ptr = (u_int16_t *)(dest + (i * 2)); - *ptr = word; - } - - CSR_CLRBIT_1(sc, RL_EECMD, RL_EEMODE_PROGRAM); - - return; -} - -#ifndef __rtems__ -static int -re_gmii_readreg(dev, phy, reg) - device_t dev; - int phy, reg; -{ - struct rl_softc *sc; - u_int32_t rval; - int i; - - if (phy != 1) - return (0); - - sc = device_get_softc(dev); - - /* Let the rgephy driver read the GMEDIASTAT register */ - - if (reg == RL_GMEDIASTAT) { - rval = CSR_READ_1(sc, RL_GMEDIASTAT); - return (rval); - } - - CSR_WRITE_4(sc, RL_PHYAR, reg << 16); - DELAY(1000); - - for (i = 0; i < RL_TIMEOUT; i++) { - rval = CSR_READ_4(sc, RL_PHYAR); - if (rval & RL_PHYAR_BUSY) - break; - DELAY(100); - } - - if (i == RL_TIMEOUT) { - device_printf(sc->rl_dev, "PHY read failed\n"); - return (0); - } - - return (rval & RL_PHYAR_PHYDATA); -} -#endif - -static int -re_gmii_writereg(dev, phy, reg, data) - device_t dev; - int phy, reg, data; -{ - struct rl_softc *sc; - u_int32_t rval; - int i; - - sc = device_get_softc(dev); - - CSR_WRITE_4(sc, RL_PHYAR, (reg << 16) | - (data & RL_PHYAR_PHYDATA) | RL_PHYAR_BUSY); - DELAY(1000); - - for (i = 0; i < RL_TIMEOUT; i++) { - rval = CSR_READ_4(sc, RL_PHYAR); - if (!(rval & RL_PHYAR_BUSY)) - break; - DELAY(100); - } - - if (i == RL_TIMEOUT) { - device_printf(sc->rl_dev, "PHY write failed\n"); - return (0); - } - - return (0); -} - -#ifndef __rtems__ -static int -re_miibus_readreg(dev, phy, reg) - device_t dev; - int phy, reg; -{ - struct rl_softc *sc; - u_int16_t rval = 0; - u_int16_t re8139_reg = 0; - - sc = device_get_softc(dev); - - if (sc->rl_type == RL_8169) { - rval = re_gmii_readreg(dev, phy, reg); - return (rval); - } - - /* Pretend the internal PHY is only at address 0 */ - if (phy) { - return (0); - } - switch (reg) { - case MII_BMCR: - re8139_reg = RL_BMCR; - break; - case MII_BMSR: - re8139_reg = RL_BMSR; - break; - case MII_ANAR: - re8139_reg = RL_ANAR; - break; - case MII_ANER: - re8139_reg = RL_ANER; - break; - case MII_ANLPAR: - re8139_reg = RL_LPAR; - break; - case MII_PHYIDR1: - case MII_PHYIDR2: - return (0); - /* - * Allow the rlphy driver to read the media status - * register. If we have a link partner which does not - * support NWAY, this is the register which will tell - * us the results of parallel detection. - */ - case RL_MEDIASTAT: - rval = CSR_READ_1(sc, RL_MEDIASTAT); - return (rval); - default: - device_printf(sc->rl_dev, "bad phy register\n"); - return (0); - } - rval = CSR_READ_2(sc, re8139_reg); - if (sc->rl_type == RL_8139CPLUS && re8139_reg == RL_BMCR) { - /* 8139C+ has different bit layout. */ - rval &= ~(BMCR_LOOP | BMCR_ISO); - } - return (rval); -} -#endif - -#ifndef __rtems__ -static int -re_miibus_writereg(dev, phy, reg, data) - device_t dev; - int phy, reg, data; -{ - struct rl_softc *sc; - u_int16_t re8139_reg = 0; - int rval = 0; - - sc = device_get_softc(dev); - - if (sc->rl_type == RL_8169) { - rval = re_gmii_writereg(dev, phy, reg, data); - return (rval); - } - - /* Pretend the internal PHY is only at address 0 */ - if (phy) - return (0); - - switch (reg) { - case MII_BMCR: - re8139_reg = RL_BMCR; - if (sc->rl_type == RL_8139CPLUS) { - /* 8139C+ has different bit layout. */ - data &= ~(BMCR_LOOP | BMCR_ISO); - } - break; - case MII_BMSR: - re8139_reg = RL_BMSR; - break; - case MII_ANAR: - re8139_reg = RL_ANAR; - break; - case MII_ANER: - re8139_reg = RL_ANER; - break; - case MII_ANLPAR: - re8139_reg = RL_LPAR; - break; - case MII_PHYIDR1: - case MII_PHYIDR2: - return (0); - break; - default: - device_printf(sc->rl_dev, "bad phy register\n"); - return (0); - } - CSR_WRITE_2(sc, re8139_reg, data); - return (0); -} -#endif - -#ifndef __rtems__ -static void -re_miibus_statchg(dev) - device_t dev; -{ - -} -#endif - -/* - * Program the 64-bit multicast hash filter. - */ -static void -re_setmulti(sc) - struct rl_softc *sc; -{ - struct ifnet *ifp; -#ifndef __rtems__ - int h = 0; - struct ifmultiaddr *ifma; -#endif - u_int32_t hashes[2] = { 0, 0 }; - u_int32_t rxfilt; - int mcnt = 0; - u_int32_t hwrev; - - RL_LOCK_ASSERT(sc); - - ifp = sc->rl_ifp; - - - rxfilt = CSR_READ_4(sc, RL_RXCFG); - rxfilt &= ~(RL_RXCFG_RX_ALLPHYS | RL_RXCFG_RX_MULTI); - if (ifp->if_flags & IFF_ALLMULTI || ifp->if_flags & IFF_PROMISC) { - if (ifp->if_flags & IFF_PROMISC) - rxfilt |= RL_RXCFG_RX_ALLPHYS; - /* - * Unlike other hardwares, we have to explicitly set - * RL_RXCFG_RX_MULTI to receive multicast frames in - * promiscuous mode. - */ - rxfilt |= RL_RXCFG_RX_MULTI; - CSR_WRITE_4(sc, RL_RXCFG, rxfilt); - CSR_WRITE_4(sc, RL_MAR0, 0xFFFFFFFF); - CSR_WRITE_4(sc, RL_MAR4, 0xFFFFFFFF); - return; - } - - /* first, zot all the existing hash bits */ - CSR_WRITE_4(sc, RL_MAR0, 0); - CSR_WRITE_4(sc, RL_MAR4, 0); - - /* now program new ones */ -#ifndef __rtems__ - IF_ADDR_LOCK(ifp); - TAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) { - if (ifma->ifma_addr->sa_family != AF_LINK) - continue; - h = ether_crc32_be(LLADDR((struct sockaddr_dl *) - ifma->ifma_addr), ETHER_ADDR_LEN) >> 26; - if (h < 32) - hashes[0] |= (1 << h); - else - hashes[1] |= (1 << (h - 32)); - mcnt++; - } - IF_ADDR_UNLOCK(ifp); -#endif - - if (mcnt) - rxfilt |= RL_RXCFG_RX_MULTI; - else - rxfilt &= ~RL_RXCFG_RX_MULTI; - - CSR_WRITE_4(sc, RL_RXCFG, rxfilt); - - /* - * For some unfathomable reason, RealTek decided to reverse - * the order of the multicast hash registers in the PCI Express - * parts. This means we have to write the hash pattern in reverse - * order for those devices. - */ - - hwrev = CSR_READ_4(sc, RL_TXCFG) & RL_TXCFG_HWREV; - - switch (hwrev) { - case RL_HWREV_8100E: - case RL_HWREV_8101E: - case RL_HWREV_8168_SPIN1: - case RL_HWREV_8168_SPIN2: - case RL_HWREV_8168_SPIN3: - CSR_WRITE_4(sc, RL_MAR0, bswap32(hashes[1])); - CSR_WRITE_4(sc, RL_MAR4, bswap32(hashes[0])); - break; - default: - CSR_WRITE_4(sc, RL_MAR0, hashes[0]); - CSR_WRITE_4(sc, RL_MAR4, hashes[1]); - break; - } -} - -static void -re_reset(sc) - struct rl_softc *sc; -{ - register int i; - - RL_LOCK_ASSERT(sc); - - CSR_WRITE_1(sc, RL_COMMAND, RL_CMD_RESET); - - for (i = 0; i < RL_TIMEOUT; i++) { - DELAY(10); - if (!(CSR_READ_1(sc, RL_COMMAND) & RL_CMD_RESET)) - break; - } - if (i == RL_TIMEOUT) - device_printf(sc->rl_dev, "reset never completed!\n"); - - CSR_WRITE_1(sc, 0x82, 1); -} - -#ifdef RE_DIAG - -/* - * The following routine is designed to test for a defect on some - * 32-bit 8169 cards. Some of these NICs have the REQ64# and ACK64# - * lines connected to the bus, however for a 32-bit only card, they - * should be pulled high. The result of this defect is that the - * NIC will not work right if you plug it into a 64-bit slot: DMA - * operations will be done with 64-bit transfers, which will fail - * because the 64-bit data lines aren't connected. - * - * There's no way to work around this (short of talking a soldering - * iron to the board), however we can detect it. The method we use - * here is to put the NIC into digital loopback mode, set the receiver - * to promiscuous mode, and then try to send a frame. We then compare - * the frame data we sent to what was received. If the data matches, - * then the NIC is working correctly, otherwise we know the user has - * a defective NIC which has been mistakenly plugged into a 64-bit PCI - * slot. In the latter case, there's no way the NIC can work correctly, - * so we print out a message on the console and abort the device attach. - */ - -static int -re_diag(sc) - struct rl_softc *sc; -{ - struct ifnet *ifp = sc->rl_ifp; - struct mbuf *m0; - struct ether_header *eh; - struct rl_desc *cur_rx; - u_int16_t status; - u_int32_t rxstat; - int total_len, i, error = 0, phyaddr; - u_int8_t dst[] = { 0x00, 'h', 'e', 'l', 'l', 'o' }; - u_int8_t src[] = { 0x00, 'w', 'o', 'r', 'l', 'd' }; - - /* Allocate a single mbuf */ - MGETHDR(m0, M_DONTWAIT, MT_DATA); - if (m0 == NULL) - return (ENOBUFS); - - RL_LOCK(sc); - - /* - * Initialize the NIC in test mode. This sets the chip up - * so that it can send and receive frames, but performs the - * following special functions: - * - Puts receiver in promiscuous mode - * - Enables digital loopback mode - * - Leaves interrupts turned off - */ - - ifp->if_flags |= IFF_PROMISC; - sc->rl_testmode = 1; - re_reset(sc); - re_init_locked(sc); - sc->rl_link = 1; - if (sc->rl_type == RL_8169) - phyaddr = 1; - else - phyaddr = 0; - - re_miibus_writereg(sc->rl_dev, phyaddr, MII_BMCR, BMCR_RESET); - for (i = 0; i < RL_TIMEOUT; i++) { - status = re_miibus_readreg(sc->rl_dev, phyaddr, MII_BMCR); - if (!(status & BMCR_RESET)) - break; - } - - re_miibus_writereg(sc->rl_dev, phyaddr, MII_BMCR, BMCR_LOOP); - CSR_WRITE_2(sc, RL_ISR, RL_INTRS); - - DELAY(100000); - - /* Put some data in the mbuf */ - - eh = mtod(m0, struct ether_header *); - bcopy ((char *)&dst, eh->ether_dhost, ETHER_ADDR_LEN); - bcopy ((char *)&src, eh->ether_shost, ETHER_ADDR_LEN); - eh->ether_type = htons(ETHERTYPE_IP); - m0->m_pkthdr.len = m0->m_len = ETHER_MIN_LEN - ETHER_CRC_LEN; - - /* - * Queue the packet, start transmission. - * Note: IF_HANDOFF() ultimately calls re_start() for us. - */ - - CSR_WRITE_2(sc, RL_ISR, 0xFFFF); - RL_UNLOCK(sc); - /* XXX: re_diag must not be called when in ALTQ mode */ - IF_HANDOFF(&ifp->if_snd, m0, ifp); - RL_LOCK(sc); - m0 = NULL; - - /* Wait for it to propagate through the chip */ - - DELAY(100000); - for (i = 0; i < RL_TIMEOUT; i++) { - status = CSR_READ_2(sc, RL_ISR); - CSR_WRITE_2(sc, RL_ISR, status); - if ((status & (RL_ISR_TIMEOUT_EXPIRED|RL_ISR_RX_OK)) == - (RL_ISR_TIMEOUT_EXPIRED|RL_ISR_RX_OK)) - break; - DELAY(10); - } - - if (i == RL_TIMEOUT) { - device_printf(sc->rl_dev, - "diagnostic failed, failed to receive packet in" - " loopback mode\n"); - error = EIO; - goto done; - } - - /* - * The packet should have been dumped into the first - * entry in the RX DMA ring. Grab it from there. - */ - - bus_dmamap_sync(sc->rl_ldata.rl_rx_list_tag, - sc->rl_ldata.rl_rx_list_map, - BUS_DMASYNC_POSTREAD); - bus_dmamap_sync(sc->rl_ldata.rl_mtag, - sc->rl_ldata.rl_rx_dmamap[0], - BUS_DMASYNC_POSTWRITE); - bus_dmamap_unload(sc->rl_ldata.rl_mtag, - sc->rl_ldata.rl_rx_dmamap[0]); - - m0 = sc->rl_ldata.rl_rx_mbuf[0]; - sc->rl_ldata.rl_rx_mbuf[0] = NULL; - eh = mtod(m0, struct ether_header *); - - cur_rx = &sc->rl_ldata.rl_rx_list[0]; - total_len = RL_RXBYTES(cur_rx); - rxstat = le32toh(cur_rx->rl_cmdstat); - - if (total_len != ETHER_MIN_LEN) { - device_printf(sc->rl_dev, - "diagnostic failed, received short packet\n"); - error = EIO; - goto done; - } - - /* Test that the received packet data matches what we sent. */ - - if (bcmp((char *)&eh->ether_dhost, (char *)&dst, ETHER_ADDR_LEN) || - bcmp((char *)&eh->ether_shost, (char *)&src, ETHER_ADDR_LEN) || - ntohs(eh->ether_type) != ETHERTYPE_IP) { - device_printf(sc->rl_dev, "WARNING, DMA FAILURE!\n"); - device_printf(sc->rl_dev, "expected TX data: %6D/%6D/0x%x\n", - dst, ":", src, ":", ETHERTYPE_IP); - device_printf(sc->rl_dev, "received RX data: %6D/%6D/0x%x\n", - eh->ether_dhost, ":", eh->ether_shost, ":", - ntohs(eh->ether_type)); - device_printf(sc->rl_dev, "You may have a defective 32-bit " - "NIC plugged into a 64-bit PCI slot.\n"); - device_printf(sc->rl_dev, "Please re-install the NIC in a " - "32-bit slot for proper operation.\n"); - device_printf(sc->rl_dev, "Read the re(4) man page for more " - "details.\n"); - error = EIO; - } - -done: - /* Turn interface off, release resources */ - - sc->rl_testmode = 0; - sc->rl_link = 0; - ifp->if_flags &= ~IFF_PROMISC; - re_stop(sc); - if (m0 != NULL) - m_freem(m0); - - RL_UNLOCK(sc); - - return (error); -} - -#endif - -/* - * Probe for a RealTek 8139C+/8169/8110 chip. Check the PCI vendor and device - * IDs against our list and return a device name if we find a match. - */ -static int -re_probe(dev) - device_t dev; -{ - struct rl_type *t; - struct rl_softc *sc; - int rid; - u_int32_t hwrev; - - t = re_devs; - sc = device_get_softc(dev); - - while (t->rl_name != NULL) { - if ((pci_get_vendor(dev) == t->rl_vid) && - (pci_get_device(dev) == t->rl_did)) { - /* - * Only attach to rev. 3 of the Linksys EG1032 adapter. - * Rev. 2 i supported by sk(4). - */ - if ((t->rl_vid == LINKSYS_VENDORID) && - (t->rl_did == LINKSYS_DEVICEID_EG1032) && - (pci_get_subdevice(dev) != - LINKSYS_SUBDEVICE_EG1032_REV3)) { - t++; - continue; - } - - /* - * Temporarily map the I/O space - * so we can read the chip ID register. - */ - rid = RL_RID; - sc->rl_res = bus_alloc_resource_any(dev, RL_RES, &rid, - RF_ACTIVE); - if (sc->rl_res == NULL) { - device_printf(dev, - "couldn't map ports/memory\n"); - return (ENXIO); - } - sc->rl_btag = rman_get_bustag(sc->rl_res); - sc->rl_bhandle = rman_get_bushandle(sc->rl_res); - hwrev = CSR_READ_4(sc, RL_TXCFG) & RL_TXCFG_HWREV; - bus_release_resource(dev, RL_RES, - RL_RID, sc->rl_res); - if (t->rl_basetype == hwrev) { - device_set_desc(dev, t->rl_name); - return (BUS_PROBE_DEFAULT); - } - } - t++; - } - - return (ENXIO); -} - -/* - * This routine takes the segment list provided as the result of - * a bus_dma_map_load() operation and assigns the addresses/lengths - * to RealTek DMA descriptors. This can be called either by the RX - * code or the TX code. In the RX case, we'll probably wind up mapping - * at most one segment. For the TX case, there could be any number of - * segments since TX packets may span multiple mbufs. In either case, - * if the number of segments is larger than the rl_maxsegs limit - * specified by the caller, we abort the mapping operation. Sadly, - * whoever designed the buffer mapping API did not provide a way to - * return an error from here, so we have to fake it a bit. - */ - -static void -re_dma_map_desc(arg, segs, nseg, mapsize, error) - void *arg; - bus_dma_segment_t *segs; - int nseg; - bus_size_t mapsize; - int error; -{ - struct rl_dmaload_arg *ctx; - struct rl_desc *d = NULL; - int i = 0, idx; - u_int32_t cmdstat; - int totlen = 0; - - if (error) - return; - - ctx = arg; - - /* Signal error to caller if there's too many segments */ - if (nseg > ctx->rl_maxsegs) { - ctx->rl_maxsegs = 0; - return; - } - - /* - * Map the segment array into descriptors. Note that we set the - * start-of-frame and end-of-frame markers for either TX or RX, but - * they really only have meaning in the TX case. (In the RX case, - * it's the chip that tells us where packets begin and end.) - * We also keep track of the end of the ring and set the - * end-of-ring bits as needed, and we set the ownership bits - * in all except the very first descriptor. (The caller will - * set this descriptor later when it start transmission or - * reception.) - */ - idx = ctx->rl_idx; - for (;;) { - d = &ctx->rl_ring[idx]; - if (le32toh(d->rl_cmdstat) & RL_RDESC_STAT_OWN) { - ctx->rl_maxsegs = 0; - return; - } - cmdstat = segs[i].ds_len; - totlen += segs[i].ds_len; - d->rl_vlanctl = 0; - d->rl_bufaddr_lo = htole32(RL_ADDR_LO(segs[i].ds_addr)); - d->rl_bufaddr_hi = htole32(RL_ADDR_HI(segs[i].ds_addr)); - if (i == 0) - cmdstat |= RL_TDESC_CMD_SOF; - else - cmdstat |= RL_TDESC_CMD_OWN; - if (idx == (RL_RX_DESC_CNT - 1)) - cmdstat |= RL_TDESC_CMD_EOR; - d->rl_cmdstat = htole32(cmdstat | ctx->rl_flags); - i++; - if (i == nseg) - break; - RL_DESC_INC(idx); - } - - d->rl_cmdstat |= htole32(RL_TDESC_CMD_EOF); - ctx->rl_maxsegs = nseg; - ctx->rl_idx = idx; -} - -/* - * Map a single buffer address. - */ - -static void -re_dma_map_addr(arg, segs, nseg, error) - void *arg; - bus_dma_segment_t *segs; - int nseg; - int error; -{ - bus_addr_t *addr; - - if (error) - return; - - KASSERT(nseg == 1, ("too many DMA segments, %d should be 1", nseg)); - addr = arg; - *addr = segs->ds_addr; -} - -static int -re_allocmem(dev, sc) - device_t dev; - struct rl_softc *sc; -{ - int error; - int nseg; - int i; - - /* - * Allocate map for RX mbufs. - */ - nseg = 32; - error = bus_dma_tag_create(sc->rl_parent_tag, ETHER_ALIGN, 0, - BUS_SPACE_MAXADDR_32BIT, BUS_SPACE_MAXADDR, NULL, - NULL, MCLBYTES * nseg, nseg, MCLBYTES, BUS_DMA_ALLOCNOW, - NULL, NULL, &sc->rl_ldata.rl_mtag); - if (error) { - device_printf(dev, "could not allocate dma tag\n"); - return (ENOMEM); - } - - /* - * Allocate map for TX descriptor list. - */ - error = bus_dma_tag_create(sc->rl_parent_tag, RL_RING_ALIGN, - 0, BUS_SPACE_MAXADDR_32BIT, BUS_SPACE_MAXADDR, NULL, - NULL, RL_TX_LIST_SZ, 1, RL_TX_LIST_SZ, 0, - NULL, NULL, &sc->rl_ldata.rl_tx_list_tag); - if (error) { - device_printf(dev, "could not allocate dma tag\n"); - return (ENOMEM); - } - - /* Allocate DMA'able memory for the TX ring */ - - error = bus_dmamem_alloc(sc->rl_ldata.rl_tx_list_tag, - (void **)&sc->rl_ldata.rl_tx_list, BUS_DMA_NOWAIT | BUS_DMA_ZERO, - &sc->rl_ldata.rl_tx_list_map); - if (error) - return (ENOMEM); - - /* Load the map for the TX ring. */ - - error = bus_dmamap_load(sc->rl_ldata.rl_tx_list_tag, - sc->rl_ldata.rl_tx_list_map, (caddr_t) sc->rl_ldata.rl_tx_list, - RL_TX_LIST_SZ, re_dma_map_addr, - &sc->rl_ldata.rl_tx_list_addr, BUS_DMA_NOWAIT); - - /* Create DMA maps for TX buffers */ - - for (i = 0; i < RL_TX_DESC_CNT; i++) { - error = bus_dmamap_create(sc->rl_ldata.rl_mtag, 0, - &sc->rl_ldata.rl_tx_dmamap[i]); - if (error) { - device_printf(dev, "can't create DMA map for TX\n"); - return (ENOMEM); - } - } - - /* - * Allocate map for RX descriptor list. - */ - error = bus_dma_tag_create(sc->rl_parent_tag, RL_RING_ALIGN, - 0, BUS_SPACE_MAXADDR_32BIT, BUS_SPACE_MAXADDR, NULL, - NULL, RL_RX_LIST_SZ, 1, RL_RX_LIST_SZ, 0, - NULL, NULL, &sc->rl_ldata.rl_rx_list_tag); - if (error) { - device_printf(dev, "could not allocate dma tag\n"); - return (ENOMEM); - } - - /* Allocate DMA'able memory for the RX ring */ - - error = bus_dmamem_alloc(sc->rl_ldata.rl_rx_list_tag, - (void **)&sc->rl_ldata.rl_rx_list, BUS_DMA_NOWAIT | BUS_DMA_ZERO, - &sc->rl_ldata.rl_rx_list_map); - if (error) - return (ENOMEM); - - /* Load the map for the RX ring. */ - - error = bus_dmamap_load(sc->rl_ldata.rl_rx_list_tag, - sc->rl_ldata.rl_rx_list_map, (caddr_t) sc->rl_ldata.rl_rx_list, - RL_RX_LIST_SZ, re_dma_map_addr, - &sc->rl_ldata.rl_rx_list_addr, BUS_DMA_NOWAIT); - - /* Create DMA maps for RX buffers */ - - for (i = 0; i < RL_RX_DESC_CNT; i++) { - error = bus_dmamap_create(sc->rl_ldata.rl_mtag, 0, - &sc->rl_ldata.rl_rx_dmamap[i]); - if (error) { - device_printf(dev, "can't create DMA map for RX\n"); - return (ENOMEM); - } - } - - return (0); -} - -/* - * Attach the interface. Allocate softc structures, do ifmedia - * setup and ethernet/BPF attach. - */ -static int -re_attach(dev) - device_t dev; -{ - u_char eaddr[ETHER_ADDR_LEN]; - u_int16_t as[ETHER_ADDR_LEN / 2]; - struct rl_softc *sc; - struct ifnet *ifp; - struct rl_hwrev *hw_rev; - int hwrev; - u_int16_t re_did = 0; - int error = 0, rid, i; - - sc = device_get_softc(dev); - sc->rl_dev = dev; - - mtx_init(&sc->rl_mtx, device_get_nameunit(dev), MTX_NETWORK_LOCK, - MTX_DEF); - callout_init_mtx(&sc->rl_stat_callout, &sc->rl_mtx, 0); - - /* - * Map control/status registers. - */ - pci_enable_busmaster(dev); - - rid = RL_RID; - sc->rl_res = bus_alloc_resource_any(dev, RL_RES, &rid, - RF_ACTIVE); - - if (sc->rl_res == NULL) { - device_printf(dev, "couldn't map ports/memory\n"); - error = ENXIO; - goto fail; - } - - sc->rl_btag = rman_get_bustag(sc->rl_res); - sc->rl_bhandle = rman_get_bushandle(sc->rl_res); - - /* Allocate interrupt */ - rid = 0; - sc->rl_irq = bus_alloc_resource_any(dev, SYS_RES_IRQ, &rid, - RF_SHAREABLE | RF_ACTIVE); - - if (sc->rl_irq == NULL) { - device_printf(dev, "couldn't map interrupt\n"); - error = ENXIO; - goto fail; - } - - /* Reset the adapter. */ - RL_LOCK(sc); - re_reset(sc); - RL_UNLOCK(sc); - - hw_rev = re_hwrevs; - hwrev = CSR_READ_4(sc, RL_TXCFG) & RL_TXCFG_HWREV; - while (hw_rev->rl_desc != NULL) { - if (hw_rev->rl_rev == hwrev) { - sc->rl_type = hw_rev->rl_type; - break; - } - hw_rev++; - } - - sc->rl_eewidth = RL_9356_ADDR_LEN; - re_read_eeprom(sc, (caddr_t)&re_did, 0, 1); - if (re_did != 0x8129) - sc->rl_eewidth = RL_9346_ADDR_LEN; - - /* - * Get station address from the EEPROM. - */ - re_read_eeprom(sc, (caddr_t)as, RL_EE_EADDR, 3); - for (i = 0; i < ETHER_ADDR_LEN / 2; i++) - as[i] = le16toh(as[i]); - bcopy(as, eaddr, sizeof(eaddr)); - - if (sc->rl_type == RL_8169) { - /* Set RX length mask */ - sc->rl_rxlenmask = RL_RDESC_STAT_GFRAGLEN; - sc->rl_txstart = RL_GTXSTART; - } else { - /* Set RX length mask */ - sc->rl_rxlenmask = RL_RDESC_STAT_FRAGLEN; - sc->rl_txstart = RL_TXSTART; - } - - /* - * Allocate the parent bus DMA tag appropriate for PCI. - */ -#define RL_NSEG_NEW 32 - error = bus_dma_tag_create(bus_get_dma_tag(dev), 1, 0, - BUS_SPACE_MAXADDR_32BIT, BUS_SPACE_MAXADDR, NULL, NULL, - MAXBSIZE, RL_NSEG_NEW, BUS_SPACE_MAXSIZE_32BIT, 0, - NULL, NULL, &sc->rl_parent_tag); - if (error) - goto fail; - - error = re_allocmem(dev, sc); - - if (error) - goto fail; - - ifp = sc->rl_ifp = if_alloc(IFT_ETHER); - if (ifp == NULL) { - device_printf(dev, "can not if_alloc()\n"); - error = ENOSPC; - goto fail; - } - - /* Do MII setup */ -#ifndef __rtems__ - if (mii_phy_probe(dev, &sc->rl_miibus, - re_ifmedia_upd, re_ifmedia_sts)) { - device_printf(dev, "MII without any phy!\n"); - error = ENXIO; - goto fail; - } -#endif - - /* Take PHY out of power down mode. */ - if (sc->rl_type == RL_8169) { - uint32_t rev; - - rev = CSR_READ_4(sc, RL_TXCFG); - /* HWVERID 0, 1 and 2 : bit26-30, bit23 */ - rev &= 0x7c800000; - if (rev != 0) { - /* RTL8169S single chip */ - switch (rev) { - case RL_HWREV_8169_8110SB: - case RL_HWREV_8169_8110SC: - case RL_HWREV_8168_SPIN2: - case RL_HWREV_8168_SPIN3: - re_gmii_writereg(dev, 1, 0x1f, 0); - re_gmii_writereg(dev, 1, 0x0e, 0); - break; - default: - break; - } - } - } - - ifp->if_softc = sc; - if_initname(ifp, device_get_name(dev), device_get_unit(dev)); - ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST; - ifp->if_ioctl = re_ioctl; - ifp->if_start = re_start; -#ifndef __rtems__ - ifp->if_hwassist = RE_CSUM_FEATURES; - ifp->if_capabilities = IFCAP_HWCSUM; - ifp->if_capenable = ifp->if_capabilities; -#endif - ifp->if_init = re_init; - IFQ_SET_MAXLEN(&ifp->if_snd, RL_IFQ_MAXLEN); - ifp->if_snd.ifq_drv_maxlen = RL_IFQ_MAXLEN; - IFQ_SET_READY(&ifp->if_snd); - - TASK_INIT(&sc->rl_txtask, 1, re_tx_task, ifp); - TASK_INIT(&sc->rl_inttask, 0, re_int_task, sc); - - /* - * Call MI attach routine. - */ - ether_ifattach(ifp, eaddr); - -#ifndef __rtems__ - /* VLAN capability setup */ - ifp->if_capabilities |= IFCAP_VLAN_MTU | IFCAP_VLAN_HWTAGGING; -#ifdef IFCAP_VLAN_HWCSUM - if (ifp->if_capabilities & IFCAP_HWCSUM) - ifp->if_capabilities |= IFCAP_VLAN_HWCSUM; -#endif - ifp->if_capenable = ifp->if_capabilities; -#ifdef DEVICE_POLLING - ifp->if_capabilities |= IFCAP_POLLING; -#endif - /* - * Tell the upper layer(s) we support long frames. - * Must appear after the call to ether_ifattach() because - * ether_ifattach() sets ifi_hdrlen to the default value. - */ - ifp->if_data.ifi_hdrlen = sizeof(struct ether_vlan_header); -#endif - -#ifdef RE_DIAG - /* - * Perform hardware diagnostic on the original RTL8169. - * Some 32-bit cards were incorrectly wired and would - * malfunction if plugged into a 64-bit slot. - */ - - if (hwrev == RL_HWREV_8169) { - error = re_diag(sc); - if (error) { - device_printf(dev, - "attach aborted due to hardware diag failure\n"); - ether_ifdetach(ifp); - goto fail; - } - } -#endif - - /* Hook interrupt last to avoid having to lock softc */ - error = bus_setup_intr(dev, sc->rl_irq, INTR_TYPE_NET | INTR_MPSAFE | - INTR_FAST, NULL, re_intr, sc, &sc->rl_intrhand); - if (error) { - device_printf(dev, "couldn't set up irq\n"); - ether_ifdetach(ifp); - } - -fail: - - if (error) - re_detach(dev); - - return (error); -} - -/* - * Shutdown hardware and free up resources. This can be called any - * time after the mutex has been initialized. It is called in both - * the error case in attach and the normal detach case so it needs - * to be careful about only freeing resources that have actually been - * allocated. - */ -static int -re_detach(dev) - device_t dev; -{ - struct rl_softc *sc; - struct ifnet *ifp; - int i; - - sc = device_get_softc(dev); - ifp = sc->rl_ifp; - KASSERT(mtx_initialized(&sc->rl_mtx), ("re mutex not initialized")); - -#ifdef DEVICE_POLLING - if (ifp->if_capenable & IFCAP_POLLING) - ether_poll_deregister(ifp); -#endif - /* These should only be active if attach succeeded */ - if (device_is_attached(dev)) { - RL_LOCK(sc); -#if 0 - sc->suspended = 1; -#endif - re_stop(sc); - RL_UNLOCK(sc); - callout_drain(&sc->rl_stat_callout); - taskqueue_drain(taskqueue_fast, &sc->rl_inttask); - taskqueue_drain(taskqueue_fast, &sc->rl_txtask); - /* - * Force off the IFF_UP flag here, in case someone - * still had a BPF descriptor attached to this - * interface. If they do, ether_ifdetach() will cause - * the BPF code to try and clear the promisc mode - * flag, which will bubble down to re_ioctl(), - * which will try to call re_init() again. This will - * turn the NIC back on and restart the MII ticker, - * which will panic the system when the kernel tries - * to invoke the re_tick() function that isn't there - * anymore. - */ - ifp->if_flags &= ~IFF_UP; - ether_ifdetach(ifp); - } - if (sc->rl_miibus) - device_delete_child(dev, sc->rl_miibus); - bus_generic_detach(dev); - - /* - * The rest is resource deallocation, so we should already be - * stopped here. - */ - - if (sc->rl_intrhand) - bus_teardown_intr(dev, sc->rl_irq, sc->rl_intrhand); - if (ifp != NULL) - if_free(ifp); - if (sc->rl_irq) - bus_release_resource(dev, SYS_RES_IRQ, 0, sc->rl_irq); - if (sc->rl_res) - bus_release_resource(dev, RL_RES, RL_RID, sc->rl_res); - - /* Unload and free the RX DMA ring memory and map */ - - if (sc->rl_ldata.rl_rx_list_tag) { - bus_dmamap_unload(sc->rl_ldata.rl_rx_list_tag, - sc->rl_ldata.rl_rx_list_map); - bus_dmamem_free(sc->rl_ldata.rl_rx_list_tag, - sc->rl_ldata.rl_rx_list, - sc->rl_ldata.rl_rx_list_map); - bus_dma_tag_destroy(sc->rl_ldata.rl_rx_list_tag); - } - - /* Unload and free the TX DMA ring memory and map */ - - if (sc->rl_ldata.rl_tx_list_tag) { - bus_dmamap_unload(sc->rl_ldata.rl_tx_list_tag, - sc->rl_ldata.rl_tx_list_map); - bus_dmamem_free(sc->rl_ldata.rl_tx_list_tag, - sc->rl_ldata.rl_tx_list, - sc->rl_ldata.rl_tx_list_map); - bus_dma_tag_destroy(sc->rl_ldata.rl_tx_list_tag); - } - - /* Destroy all the RX and TX buffer maps */ - - if (sc->rl_ldata.rl_mtag) { - for (i = 0; i < RL_TX_DESC_CNT; i++) - bus_dmamap_destroy(sc->rl_ldata.rl_mtag, - sc->rl_ldata.rl_tx_dmamap[i]); - for (i = 0; i < RL_RX_DESC_CNT; i++) - bus_dmamap_destroy(sc->rl_ldata.rl_mtag, - sc->rl_ldata.rl_rx_dmamap[i]); - bus_dma_tag_destroy(sc->rl_ldata.rl_mtag); - } - - /* Unload and free the stats buffer and map */ - - if (sc->rl_ldata.rl_stag) { - bus_dmamap_unload(sc->rl_ldata.rl_stag, - sc->rl_ldata.rl_rx_list_map); - bus_dmamem_free(sc->rl_ldata.rl_stag, - sc->rl_ldata.rl_stats, - sc->rl_ldata.rl_smap); - bus_dma_tag_destroy(sc->rl_ldata.rl_stag); - } - - if (sc->rl_parent_tag) - bus_dma_tag_destroy(sc->rl_parent_tag); - - mtx_destroy(&sc->rl_mtx); - - return (0); -} - -static int -re_newbuf(sc, idx, m) - struct rl_softc *sc; - int idx; - struct mbuf *m; -{ - struct rl_dmaload_arg arg; - struct mbuf *n = NULL; - int error; - - if (m == NULL) { - n = m_getcl(M_DONTWAIT, MT_DATA, M_PKTHDR); - if (n == NULL) - return (ENOBUFS); - m = n; - } else - m->m_data = m->m_ext.ext_buf; - - m->m_len = m->m_pkthdr.len = MCLBYTES; -#ifdef RE_FIXUP_RX - /* - * This is part of an evil trick to deal with non-x86 platforms. - * The RealTek chip requires RX buffers to be aligned on 64-bit - * boundaries, but that will hose non-x86 machines. To get around - * this, we leave some empty space at the start of each buffer - * and for non-x86 hosts, we copy the buffer back six bytes - * to achieve word alignment. This is slightly more efficient - * than allocating a new buffer, copying the contents, and - * discarding the old buffer. - */ - m_adj(m, RE_ETHER_ALIGN); -#endif - arg.rl_idx = idx; - arg.rl_maxsegs = 1; - arg.rl_flags = 0; - arg.rl_ring = sc->rl_ldata.rl_rx_list; - - error = bus_dmamap_load_mbuf(sc->rl_ldata.rl_mtag, - sc->rl_ldata.rl_rx_dmamap[idx], m, re_dma_map_desc, - &arg, BUS_DMA_NOWAIT); - if (error || arg.rl_maxsegs != 1) { - if (n != NULL) - m_freem(n); - if (arg.rl_maxsegs == 0) - bus_dmamap_unload(sc->rl_ldata.rl_mtag, - sc->rl_ldata.rl_rx_dmamap[idx]); - return (ENOMEM); - } - - sc->rl_ldata.rl_rx_list[idx].rl_cmdstat |= htole32(RL_RDESC_CMD_OWN); - sc->rl_ldata.rl_rx_mbuf[idx] = m; - - bus_dmamap_sync(sc->rl_ldata.rl_mtag, - sc->rl_ldata.rl_rx_dmamap[idx], - BUS_DMASYNC_PREREAD); - - return (0); -} - -#ifdef RE_FIXUP_RX -static __inline void -re_fixup_rx(m) - struct mbuf *m; -{ - int i; - uint16_t *src, *dst; - - src = mtod(m, uint16_t *); - dst = src - (RE_ETHER_ALIGN - ETHER_ALIGN) / sizeof *src; - - for (i = 0; i < (m->m_len / sizeof(uint16_t) + 1); i++) - *dst++ = *src++; - - m->m_data -= RE_ETHER_ALIGN - ETHER_ALIGN; - - return; -} -#endif - -static int -re_tx_list_init(sc) - struct rl_softc *sc; -{ - - RL_LOCK_ASSERT(sc); - - bzero ((char *)sc->rl_ldata.rl_tx_list, RL_TX_LIST_SZ); - bzero ((char *)&sc->rl_ldata.rl_tx_mbuf, - (RL_TX_DESC_CNT * sizeof(struct mbuf *))); - - bus_dmamap_sync(sc->rl_ldata.rl_tx_list_tag, - sc->rl_ldata.rl_tx_list_map, BUS_DMASYNC_PREWRITE); - sc->rl_ldata.rl_tx_prodidx = 0; - sc->rl_ldata.rl_tx_considx = 0; - sc->rl_ldata.rl_tx_free = RL_TX_DESC_CNT; - - return (0); -} - -static int -re_rx_list_init(sc) - struct rl_softc *sc; -{ - int i; - - bzero ((char *)sc->rl_ldata.rl_rx_list, RL_RX_LIST_SZ); - bzero ((char *)&sc->rl_ldata.rl_rx_mbuf, - (RL_RX_DESC_CNT * sizeof(struct mbuf *))); - - for (i = 0; i < RL_RX_DESC_CNT; i++) { - if (re_newbuf(sc, i, NULL) == ENOBUFS) - return (ENOBUFS); - } - - /* Flush the RX descriptors */ - - bus_dmamap_sync(sc->rl_ldata.rl_rx_list_tag, - sc->rl_ldata.rl_rx_list_map, - BUS_DMASYNC_PREWRITE|BUS_DMASYNC_PREREAD); - - sc->rl_ldata.rl_rx_prodidx = 0; - sc->rl_head = sc->rl_tail = NULL; - - return (0); -} - -/* - * RX handler for C+ and 8169. For the gigE chips, we support - * the reception of jumbo frames that have been fragmented - * across multiple 2K mbuf cluster buffers. - */ -static int -re_rxeof(sc) - struct rl_softc *sc; -{ - struct mbuf *m; - struct ifnet *ifp; - int i, total_len; - struct rl_desc *cur_rx; - u_int32_t rxstat, rxvlan; - int maxpkt = 16; - - RL_LOCK_ASSERT(sc); - - ifp = sc->rl_ifp; - i = sc->rl_ldata.rl_rx_prodidx; - - /* Invalidate the descriptor memory */ - - bus_dmamap_sync(sc->rl_ldata.rl_rx_list_tag, - sc->rl_ldata.rl_rx_list_map, - BUS_DMASYNC_POSTREAD); - - while (!RL_OWN(&sc->rl_ldata.rl_rx_list[i]) && maxpkt) { - cur_rx = &sc->rl_ldata.rl_rx_list[i]; - m = sc->rl_ldata.rl_rx_mbuf[i]; - total_len = RL_RXBYTES(cur_rx); - rxstat = le32toh(cur_rx->rl_cmdstat); - rxvlan = le32toh(cur_rx->rl_vlanctl); - - /* Invalidate the RX mbuf and unload its map */ - - bus_dmamap_sync(sc->rl_ldata.rl_mtag, - sc->rl_ldata.rl_rx_dmamap[i], - BUS_DMASYNC_POSTWRITE); - bus_dmamap_unload(sc->rl_ldata.rl_mtag, - sc->rl_ldata.rl_rx_dmamap[i]); - - if (!(rxstat & RL_RDESC_STAT_EOF)) { - m->m_len = RE_RX_DESC_BUFLEN; - if (sc->rl_head == NULL) - sc->rl_head = sc->rl_tail = m; - else { - m->m_flags &= ~M_PKTHDR; - sc->rl_tail->m_next = m; - sc->rl_tail = m; - } - re_newbuf(sc, i, NULL); - RL_DESC_INC(i); - continue; - } - - /* - * NOTE: for the 8139C+, the frame length field - * is always 12 bits in size, but for the gigE chips, - * it is 13 bits (since the max RX frame length is 16K). - * Unfortunately, all 32 bits in the status word - * were already used, so to make room for the extra - * length bit, RealTek took out the 'frame alignment - * error' bit and shifted the other status bits - * over one slot. The OWN, EOR, FS and LS bits are - * still in the same places. We have already extracted - * the frame length and checked the OWN bit, so rather - * than using an alternate bit mapping, we shift the - * status bits one space to the right so we can evaluate - * them using the 8169 status as though it was in the - * same format as that of the 8139C+. - */ - if (sc->rl_type == RL_8169) - rxstat >>= 1; - - /* - * if total_len > 2^13-1, both _RXERRSUM and _GIANT will be - * set, but if CRC is clear, it will still be a valid frame. - */ - if (rxstat & RL_RDESC_STAT_RXERRSUM && !(total_len > 8191 && - (rxstat & RL_RDESC_STAT_ERRS) == RL_RDESC_STAT_GIANT)) { - ifp->if_ierrors++; - /* - * If this is part of a multi-fragment packet, - * discard all the pieces. - */ - if (sc->rl_head != NULL) { - m_freem(sc->rl_head); - sc->rl_head = sc->rl_tail = NULL; - } - re_newbuf(sc, i, m); - RL_DESC_INC(i); - continue; - } - - /* - * If allocating a replacement mbuf fails, - * reload the current one. - */ - - if (re_newbuf(sc, i, NULL)) { - ifp->if_ierrors++; - if (sc->rl_head != NULL) { - m_freem(sc->rl_head); - sc->rl_head = sc->rl_tail = NULL; - } - re_newbuf(sc, i, m); - RL_DESC_INC(i); - continue; - } - - RL_DESC_INC(i); - - if (sc->rl_head != NULL) { - m->m_len = total_len % RE_RX_DESC_BUFLEN; - if (m->m_len == 0) - m->m_len = RE_RX_DESC_BUFLEN; - /* - * Special case: if there's 4 bytes or less - * in this buffer, the mbuf can be discarded: - * the last 4 bytes is the CRC, which we don't - * care about anyway. - */ - if (m->m_len <= ETHER_CRC_LEN) { - sc->rl_tail->m_len -= - (ETHER_CRC_LEN - m->m_len); - m_freem(m); - } else { - m->m_len -= ETHER_CRC_LEN; - m->m_flags &= ~M_PKTHDR; - sc->rl_tail->m_next = m; - } - m = sc->rl_head; - sc->rl_head = sc->rl_tail = NULL; - m->m_pkthdr.len = total_len - ETHER_CRC_LEN; - } else - m->m_pkthdr.len = m->m_len = - (total_len - ETHER_CRC_LEN); - -#ifdef RE_FIXUP_RX - re_fixup_rx(m); -#endif - ifp->if_ipackets++; - m->m_pkthdr.rcvif = ifp; - - /* Do RX checksumming if enabled */ - -#ifndef __rtems__ - if (ifp->if_capenable & IFCAP_RXCSUM) { - - /* Check IP header checksum */ - if (rxstat & RL_RDESC_STAT_PROTOID) - m->m_pkthdr.csum_flags |= CSUM_IP_CHECKED; - if (!(rxstat & RL_RDESC_STAT_IPSUMBAD)) - m->m_pkthdr.csum_flags |= CSUM_IP_VALID; - - /* Check TCP/UDP checksum */ - if ((RL_TCPPKT(rxstat) && - !(rxstat & RL_RDESC_STAT_TCPSUMBAD)) || - (RL_UDPPKT(rxstat) && - !(rxstat & RL_RDESC_STAT_UDPSUMBAD))) { - m->m_pkthdr.csum_flags |= - CSUM_DATA_VALID|CSUM_PSEUDO_HDR; - m->m_pkthdr.csum_data = 0xffff; - } - } -#endif - maxpkt--; -#ifndef __rtems__ - if (rxvlan & RL_RDESC_VLANCTL_TAG) { - VLAN_INPUT_TAG_NEW(ifp, m, - ntohs((rxvlan & RL_RDESC_VLANCTL_DATA))); - if (m == NULL) - continue; - } -#endif - RL_UNLOCK(sc); -#ifndef __rtems__ - (*ifp->if_input)(ifp, m); -#else - ether_input_skipping(ifp, m); -#endif - RL_LOCK(sc); - } - - /* Flush the RX DMA ring */ - - bus_dmamap_sync(sc->rl_ldata.rl_rx_list_tag, - sc->rl_ldata.rl_rx_list_map, - BUS_DMASYNC_PREWRITE|BUS_DMASYNC_PREREAD); - - sc->rl_ldata.rl_rx_prodidx = i; - - if (maxpkt) - return(EAGAIN); - - return(0); -} - -static void -re_txeof(sc) - struct rl_softc *sc; -{ - struct ifnet *ifp; - u_int32_t txstat; - int idx; - - ifp = sc->rl_ifp; - idx = sc->rl_ldata.rl_tx_considx; - - /* Invalidate the TX descriptor list */ - bus_dmamap_sync(sc->rl_ldata.rl_tx_list_tag, - sc->rl_ldata.rl_tx_list_map, - BUS_DMASYNC_POSTREAD); - - while (sc->rl_ldata.rl_tx_free < RL_TX_DESC_CNT) { - txstat = le32toh(sc->rl_ldata.rl_tx_list[idx].rl_cmdstat); - if (txstat & RL_TDESC_CMD_OWN) - break; - - sc->rl_ldata.rl_tx_list[idx].rl_bufaddr_lo = 0; - - /* - * We only stash mbufs in the last descriptor - * in a fragment chain, which also happens to - * be the only place where the TX status bits - * are valid. - */ - if (txstat & RL_TDESC_CMD_EOF) { - m_freem(sc->rl_ldata.rl_tx_mbuf[idx]); - sc->rl_ldata.rl_tx_mbuf[idx] = NULL; - bus_dmamap_unload(sc->rl_ldata.rl_mtag, - sc->rl_ldata.rl_tx_dmamap[idx]); - if (txstat & (RL_TDESC_STAT_EXCESSCOL| - RL_TDESC_STAT_COLCNT)) - ifp->if_collisions++; - if (txstat & RL_TDESC_STAT_TXERRSUM) - ifp->if_oerrors++; - else - ifp->if_opackets++; - } - sc->rl_ldata.rl_tx_free++; - RL_DESC_INC(idx); - } - sc->rl_ldata.rl_tx_considx = idx; - - /* No changes made to the TX ring, so no flush needed */ - - if (sc->rl_ldata.rl_tx_free > RL_TX_DESC_THLD) - ifp->if_drv_flags &= ~IFF_DRV_OACTIVE; - - if (sc->rl_ldata.rl_tx_free < RL_TX_DESC_CNT) { - /* - * Some chips will ignore a second TX request issued - * while an existing transmission is in progress. If - * the transmitter goes idle but there are still - * packets waiting to be sent, we need to restart the - * channel here to flush them out. This only seems to - * be required with the PCIe devices. - */ - CSR_WRITE_1(sc, sc->rl_txstart, RL_TXSTART_START); - -#ifdef RE_TX_MODERATION - /* - * If not all descriptors have been reaped yet, reload - * the timer so that we will eventually get another - * interrupt that will cause us to re-enter this routine. - * This is done in case the transmitter has gone idle. - */ - CSR_WRITE_4(sc, RL_TIMERCNT, 1); -#endif - } else - sc->rl_watchdog_timer = 0; -} - -static void -re_tick(xsc) - void *xsc; -{ - struct rl_softc *sc; - struct mii_data *mii; - struct ifnet *ifp; - - sc = xsc; - ifp = sc->rl_ifp; - - RL_LOCK_ASSERT(sc); - - re_watchdog(sc); - - mii = device_get_softc(sc->rl_miibus); -#ifndef __rtems__ - mii_tick(mii); - if (sc->rl_link) { - if (!(mii->mii_media_status & IFM_ACTIVE)) - sc->rl_link = 0; - } else { - if (mii->mii_media_status & IFM_ACTIVE && - IFM_SUBTYPE(mii->mii_media_active) != IFM_NONE) { - sc->rl_link = 1; - if (!IFQ_DRV_IS_EMPTY(&ifp->if_snd)) - taskqueue_enqueue_fast(taskqueue_fast, - &sc->rl_txtask); - } - } - -#endif - callout_reset(&sc->rl_stat_callout, hz, re_tick, sc); -} - -#ifdef DEVICE_POLLING -static void -re_poll(struct ifnet *ifp, enum poll_cmd cmd, int count) -{ - struct rl_softc *sc = ifp->if_softc; - - RL_LOCK(sc); - if (ifp->if_drv_flags & IFF_DRV_RUNNING) - re_poll_locked(ifp, cmd, count); - RL_UNLOCK(sc); -} - -static void -re_poll_locked(struct ifnet *ifp, enum poll_cmd cmd, int count) -{ - struct rl_softc *sc = ifp->if_softc; - - RL_LOCK_ASSERT(sc); - - sc->rxcycles = count; - re_rxeof(sc); - re_txeof(sc); - - if (!IFQ_DRV_IS_EMPTY(&ifp->if_snd)) - taskqueue_enqueue_fast(taskqueue_fast, &sc->rl_txtask); - - if (cmd == POLL_AND_CHECK_STATUS) { /* also check status register */ - u_int16_t status; - - status = CSR_READ_2(sc, RL_ISR); - if (status == 0xffff) - return; - if (status) - CSR_WRITE_2(sc, RL_ISR, status); - - /* - * XXX check behaviour on receiver stalls. - */ - - if (status & RL_ISR_SYSTEM_ERR) { - re_reset(sc); - re_init_locked(sc); - } - } -} -#endif /* DEVICE_POLLING */ - -static void -re_intr(arg) - void *arg; -{ - struct rl_softc *sc; - uint16_t status; - - sc = arg; - -printk( "re_intr " ); - status = CSR_READ_2(sc, RL_ISR); - if (status == 0xFFFF || (status & RL_INTRS_CPLUS) == 0) - return; - CSR_WRITE_2(sc, RL_IMR, 0); - - taskqueue_enqueue_fast(taskqueue_fast, &sc->rl_inttask); - - return; -} - -static void -re_int_task(arg, npending) - void *arg; - int npending; -{ - struct rl_softc *sc; - struct ifnet *ifp; - u_int16_t status; - int rval = 0; - - sc = arg; - ifp = sc->rl_ifp; - - NET_LOCK_GIANT(); - RL_LOCK(sc); - - status = CSR_READ_2(sc, RL_ISR); - CSR_WRITE_2(sc, RL_ISR, status); - - if (sc->suspended || !(ifp->if_flags & IFF_UP)) { - RL_UNLOCK(sc); - NET_UNLOCK_GIANT(); - return; - } - -#ifdef DEVICE_POLLING - if (ifp->if_capenable & IFCAP_POLLING) { - RL_UNLOCK(sc); - NET_UNLOCK_GIANT(); - return; - } -#endif - - if (status & (RL_ISR_RX_OK|RL_ISR_RX_ERR|RL_ISR_FIFO_OFLOW)) - rval = re_rxeof(sc); - -#ifdef RE_TX_MODERATION - if (status & (RL_ISR_TIMEOUT_EXPIRED| -#else - if (status & (RL_ISR_TX_OK| -#endif - RL_ISR_TX_ERR|RL_ISR_TX_DESC_UNAVAIL)) - re_txeof(sc); - - if (status & RL_ISR_SYSTEM_ERR) { - re_reset(sc); - re_init_locked(sc); - } - - if (status & RL_ISR_LINKCHG) { - callout_stop(&sc->rl_stat_callout); - re_tick(sc); - } - - if (!IFQ_DRV_IS_EMPTY(&ifp->if_snd)) - taskqueue_enqueue_fast(taskqueue_fast, &sc->rl_txtask); - - RL_UNLOCK(sc); - NET_UNLOCK_GIANT(); - - if ((CSR_READ_2(sc, RL_ISR) & RL_INTRS_CPLUS) || rval) { - taskqueue_enqueue_fast(taskqueue_fast, &sc->rl_inttask); - return; - } - - CSR_WRITE_2(sc, RL_IMR, RL_INTRS_CPLUS); - - return; -} - -static int -re_encap(sc, m_head, idx) - struct rl_softc *sc; - struct mbuf **m_head; - int *idx; -{ - struct mbuf *m_new = NULL; - struct rl_dmaload_arg arg; - bus_dmamap_t map; - int error; -#ifndef __rtems__ - struct m_tag *mtag; -#endif - - RL_LOCK_ASSERT(sc); - - if (sc->rl_ldata.rl_tx_free <= RL_TX_DESC_THLD) - return (EFBIG); - - /* - * Set up checksum offload. Note: checksum offload bits must - * appear in all descriptors of a multi-descriptor transmit - * attempt. This is according to testing done with an 8169 - * chip. This is a requirement. - */ - - arg.rl_flags = 0; - -#ifndef __rtems__ - if ((*m_head)->m_pkthdr.csum_flags & CSUM_IP) - arg.rl_flags |= RL_TDESC_CMD_IPCSUM; - if ((*m_head)->m_pkthdr.csum_flags & CSUM_TCP) - arg.rl_flags |= RL_TDESC_CMD_TCPCSUM; - if ((*m_head)->m_pkthdr.csum_flags & CSUM_UDP) - arg.rl_flags |= RL_TDESC_CMD_UDPCSUM; -#endif - - arg.rl_idx = *idx; - arg.rl_maxsegs = sc->rl_ldata.rl_tx_free; - if (arg.rl_maxsegs > RL_TX_DESC_THLD) - arg.rl_maxsegs -= RL_TX_DESC_THLD; - arg.rl_ring = sc->rl_ldata.rl_tx_list; - - map = sc->rl_ldata.rl_tx_dmamap[*idx]; - - /* - * With some of the RealTek chips, using the checksum offload - * support in conjunction with the autopadding feature results - * in the transmission of corrupt frames. For example, if we - * need to send a really small IP fragment that's less than 60 - * bytes in size, and IP header checksumming is enabled, the - * resulting ethernet frame that appears on the wire will - * have garbled payload. To work around this, if TX checksum - * offload is enabled, we always manually pad short frames out - * to the minimum ethernet frame size. We do this by pretending - * the mbuf chain has too many fragments so the coalescing code - * below can assemble the packet into a single buffer that's - * padded out to the mininum frame size. - * - * Note: this appears unnecessary for TCP, and doing it for TCP - * with PCIe adapters seems to result in bad checksums. - */ - - if (arg.rl_flags && !(arg.rl_flags & RL_TDESC_CMD_TCPCSUM) && - (*m_head)->m_pkthdr.len < RL_MIN_FRAMELEN) - error = EFBIG; - else - error = bus_dmamap_load_mbuf(sc->rl_ldata.rl_mtag, map, - *m_head, re_dma_map_desc, &arg, BUS_DMA_NOWAIT); - - if (error && error != EFBIG) { - device_printf(sc->rl_dev, "can't map mbuf (error %d)\n", error); - return (ENOBUFS); - } - - /* Too many segments to map, coalesce into a single mbuf */ - - if (error || arg.rl_maxsegs == 0) { - if (arg.rl_maxsegs == 0) - bus_dmamap_unload(sc->rl_ldata.rl_mtag, map); - m_new = m_defrag(*m_head, M_DONTWAIT); - if (m_new == NULL) { - m_freem(*m_head); - *m_head = NULL; - return (ENOBUFS); - } - *m_head = m_new; - - /* - * Manually pad short frames, and zero the pad space - * to avoid leaking data. - */ - if (m_new->m_pkthdr.len < RL_MIN_FRAMELEN) { - bzero(mtod(m_new, char *) + m_new->m_pkthdr.len, - RL_MIN_FRAMELEN - m_new->m_pkthdr.len); - m_new->m_pkthdr.len += RL_MIN_FRAMELEN - - m_new->m_pkthdr.len; - m_new->m_len = m_new->m_pkthdr.len; - } - - /* Note that we'll run over RL_TX_DESC_THLD here. */ - arg.rl_maxsegs = sc->rl_ldata.rl_tx_free; - error = bus_dmamap_load_mbuf(sc->rl_ldata.rl_mtag, map, - *m_head, re_dma_map_desc, &arg, BUS_DMA_NOWAIT); - if (error || arg.rl_maxsegs == 0) { - device_printf(sc->rl_dev, - "can't map defragmented mbuf (error %d)\n", error); - m_freem(m_new); - *m_head = NULL; - if (arg.rl_maxsegs == 0) - bus_dmamap_unload(sc->rl_ldata.rl_mtag, map); - return (EFBIG); - } - } - - /* - * Insure that the map for this transmission - * is placed at the array index of the last descriptor - * in this chain. (Swap last and first dmamaps.) - */ - sc->rl_ldata.rl_tx_dmamap[*idx] = - sc->rl_ldata.rl_tx_dmamap[arg.rl_idx]; - sc->rl_ldata.rl_tx_dmamap[arg.rl_idx] = map; - - sc->rl_ldata.rl_tx_mbuf[arg.rl_idx] = *m_head; - sc->rl_ldata.rl_tx_free -= arg.rl_maxsegs; - - /* - * Set up hardware VLAN tagging. Note: vlan tag info must - * appear in the first descriptor of a multi-descriptor - * transmission attempt. - */ - -#ifndef __rtems__ - mtag = VLAN_OUTPUT_TAG(sc->rl_ifp, *m_head); - if (mtag != NULL) - sc->rl_ldata.rl_tx_list[*idx].rl_vlanctl = - htole32(htons(VLAN_TAG_VALUE(mtag)) | RL_TDESC_VLANCTL_TAG); -#endif - - /* Transfer ownership of packet to the chip. */ - - sc->rl_ldata.rl_tx_list[arg.rl_idx].rl_cmdstat |= - htole32(RL_TDESC_CMD_OWN); - if (*idx != arg.rl_idx) - sc->rl_ldata.rl_tx_list[*idx].rl_cmdstat |= - htole32(RL_TDESC_CMD_OWN); - - RL_DESC_INC(arg.rl_idx); - *idx = arg.rl_idx; - - return (0); -} - -static void -re_tx_task(arg, npending) - void *arg; - int npending; -{ - struct ifnet *ifp; - - ifp = arg; - NET_LOCK_GIANT(); - re_start(ifp); - NET_UNLOCK_GIANT(); - - return; -} - -/* - * Main transmit routine for C+ and gigE NICs. - */ -static void -re_start(ifp) - struct ifnet *ifp; -{ - struct rl_softc *sc; - struct mbuf *m_head = NULL; - int idx, queued = 0; - - sc = ifp->if_softc; - - RL_LOCK(sc); - - if (!sc->rl_link || ifp->if_drv_flags & IFF_DRV_OACTIVE) { - RL_UNLOCK(sc); - return; - } - - idx = sc->rl_ldata.rl_tx_prodidx; - - while (sc->rl_ldata.rl_tx_mbuf[idx] == NULL) { - IFQ_DRV_DEQUEUE(&ifp->if_snd, m_head); - if (m_head == NULL) - break; - - if (re_encap(sc, &m_head, &idx)) { - if (m_head == NULL) - break; - IFQ_DRV_PREPEND(&ifp->if_snd, m_head); - ifp->if_drv_flags |= IFF_DRV_OACTIVE; - break; - } - - /* - * If there's a BPF listener, bounce a copy of this frame - * to him. - */ - ETHER_BPF_MTAP(ifp, m_head); - - queued++; - } - - if (queued == 0) { -#ifdef RE_TX_MODERATION - if (sc->rl_ldata.rl_tx_free != RL_TX_DESC_CNT) - CSR_WRITE_4(sc, RL_TIMERCNT, 1); -#endif - RL_UNLOCK(sc); - return; - } - - /* Flush the TX descriptors */ - - bus_dmamap_sync(sc->rl_ldata.rl_tx_list_tag, - sc->rl_ldata.rl_tx_list_map, - BUS_DMASYNC_PREWRITE|BUS_DMASYNC_PREREAD); - - sc->rl_ldata.rl_tx_prodidx = idx; - - CSR_WRITE_1(sc, sc->rl_txstart, RL_TXSTART_START); - -#ifdef RE_TX_MODERATION - /* - * Use the countdown timer for interrupt moderation. - * 'TX done' interrupts are disabled. Instead, we reset the - * countdown timer, which will begin counting until it hits - * the value in the TIMERINT register, and then trigger an - * interrupt. Each time we write to the TIMERCNT register, - * the timer count is reset to 0. - */ - CSR_WRITE_4(sc, RL_TIMERCNT, 1); -#endif - - /* - * Set a timeout in case the chip goes out to lunch. - */ - sc->rl_watchdog_timer = 5; - - RL_UNLOCK(sc); - - return; -} - -static void -re_init(xsc) - void *xsc; -{ - struct rl_softc *sc = xsc; - - RL_LOCK(sc); - re_init_locked(sc); - RL_UNLOCK(sc); -} - -static void -re_init_locked(sc) - struct rl_softc *sc; -{ - struct ifnet *ifp = sc->rl_ifp; - struct mii_data *mii; - u_int32_t rxcfg = 0; - union { - uint32_t align_dummy; - u_char eaddr[ETHER_ADDR_LEN]; - } eaddr; - - RL_LOCK_ASSERT(sc); - - mii = device_get_softc(sc->rl_miibus); - - /* - * Cancel pending I/O and free all RX/TX buffers. - */ - re_stop(sc); - - /* - * Enable C+ RX and TX mode, as well as VLAN stripping and - * RX checksum offload. We must configure the C+ register - * before all others. - */ - CSR_WRITE_2(sc, RL_CPLUS_CMD, RL_CPLUSCMD_RXENB| - RL_CPLUSCMD_TXENB|RL_CPLUSCMD_PCI_MRW| - RL_CPLUSCMD_VLANSTRIP|RL_CPLUSCMD_RXCSUM_ENB); - - /* - * Init our MAC address. Even though the chipset - * documentation doesn't mention it, we need to enter "Config - * register write enable" mode to modify the ID registers. - */ - /* Copy MAC address on stack to align. */ - bcopy(IF_LLADDR(ifp), eaddr.eaddr, ETHER_ADDR_LEN); - CSR_WRITE_1(sc, RL_EECMD, RL_EEMODE_WRITECFG); - CSR_WRITE_4(sc, RL_IDR0, - htole32(*(u_int32_t *)(&eaddr.eaddr[0]))); - CSR_WRITE_4(sc, RL_IDR4, - htole32(*(u_int32_t *)(&eaddr.eaddr[4]))); - CSR_WRITE_1(sc, RL_EECMD, RL_EEMODE_OFF); - - /* - * For C+ mode, initialize the RX descriptors and mbufs. - */ - re_rx_list_init(sc); - re_tx_list_init(sc); - - /* - * Load the addresses of the RX and TX lists into the chip. - */ - - CSR_WRITE_4(sc, RL_RXLIST_ADDR_HI, - RL_ADDR_HI(sc->rl_ldata.rl_rx_list_addr)); - CSR_WRITE_4(sc, RL_RXLIST_ADDR_LO, - RL_ADDR_LO(sc->rl_ldata.rl_rx_list_addr)); - - CSR_WRITE_4(sc, RL_TXLIST_ADDR_HI, - RL_ADDR_HI(sc->rl_ldata.rl_tx_list_addr)); - CSR_WRITE_4(sc, RL_TXLIST_ADDR_LO, - RL_ADDR_LO(sc->rl_ldata.rl_tx_list_addr)); - - /* - * Enable transmit and receive. - */ - CSR_WRITE_1(sc, RL_COMMAND, RL_CMD_TX_ENB|RL_CMD_RX_ENB); - - /* - * Set the initial TX and RX configuration. - */ - if (sc->rl_testmode) { - if (sc->rl_type == RL_8169) - CSR_WRITE_4(sc, RL_TXCFG, - RL_TXCFG_CONFIG|RL_LOOPTEST_ON); - else - CSR_WRITE_4(sc, RL_TXCFG, - RL_TXCFG_CONFIG|RL_LOOPTEST_ON_CPLUS); - } else - CSR_WRITE_4(sc, RL_TXCFG, RL_TXCFG_CONFIG); - - CSR_WRITE_1(sc, RL_EARLY_TX_THRESH, 16); - - CSR_WRITE_4(sc, RL_RXCFG, RL_RXCFG_CONFIG); - - /* Set the individual bit to receive frames for this host only. */ - rxcfg = CSR_READ_4(sc, RL_RXCFG); - rxcfg |= RL_RXCFG_RX_INDIV; - - /* If we want promiscuous mode, set the allframes bit. */ - if (ifp->if_flags & IFF_PROMISC) - rxcfg |= RL_RXCFG_RX_ALLPHYS; - else - rxcfg &= ~RL_RXCFG_RX_ALLPHYS; - CSR_WRITE_4(sc, RL_RXCFG, rxcfg); - - /* - * Set capture broadcast bit to capture broadcast frames. - */ - if (ifp->if_flags & IFF_BROADCAST) - rxcfg |= RL_RXCFG_RX_BROAD; - else - rxcfg &= ~RL_RXCFG_RX_BROAD; - CSR_WRITE_4(sc, RL_RXCFG, rxcfg); - - /* - * Program the multicast filter, if necessary. - */ - re_setmulti(sc); - -#ifdef DEVICE_POLLING - /* - * Disable interrupts if we are polling. - */ - if (ifp->if_capenable & IFCAP_POLLING) - CSR_WRITE_2(sc, RL_IMR, 0); - else /* otherwise ... */ -#endif - - /* - * Enable interrupts. - */ - if (sc->rl_testmode) - CSR_WRITE_2(sc, RL_IMR, 0); - else - CSR_WRITE_2(sc, RL_IMR, RL_INTRS_CPLUS); - CSR_WRITE_2(sc, RL_ISR, RL_INTRS_CPLUS); - - /* Set initial TX threshold */ - sc->rl_txthresh = RL_TX_THRESH_INIT; - - /* Start RX/TX process. */ - CSR_WRITE_4(sc, RL_MISSEDPKT, 0); -#ifdef notdef - /* Enable receiver and transmitter. */ - CSR_WRITE_1(sc, RL_COMMAND, RL_CMD_TX_ENB|RL_CMD_RX_ENB); -#endif - -#ifdef RE_TX_MODERATION - /* - * Initialize the timer interrupt register so that - * a timer interrupt will be generated once the timer - * reaches a certain number of ticks. The timer is - * reloaded on each transmit. This gives us TX interrupt - * moderation, which dramatically improves TX frame rate. - */ - if (sc->rl_type == RL_8169) - CSR_WRITE_4(sc, RL_TIMERINT_8169, 0x800); - else - CSR_WRITE_4(sc, RL_TIMERINT, 0x400); -#endif - - /* - * For 8169 gigE NICs, set the max allowed RX packet - * size so we can receive jumbo frames. - */ - if (sc->rl_type == RL_8169) - CSR_WRITE_2(sc, RL_MAXRXPKTLEN, 16383); - - if (sc->rl_testmode) - return; - - mii_mediachg(mii); - - CSR_WRITE_1(sc, RL_CFG1, CSR_READ_1(sc, RL_CFG1) | RL_CFG1_DRVLOAD); - - ifp->if_drv_flags |= IFF_DRV_RUNNING; - ifp->if_drv_flags &= ~IFF_DRV_OACTIVE; - - sc->rl_link = 0; - sc->rl_watchdog_timer = 0; - callout_reset(&sc->rl_stat_callout, hz, re_tick, sc); -} - -/* - * Set media options. - */ -#ifndef __rtems__ -static int -re_ifmedia_upd(ifp) - struct ifnet *ifp; -{ - struct rl_softc *sc; - struct mii_data *mii; - - sc = ifp->if_softc; - mii = device_get_softc(sc->rl_miibus); - RL_LOCK(sc); - mii_mediachg(mii); - RL_UNLOCK(sc); - - return (0); -} -#endif - -/* - * Report current media status. - */ -#ifndef __rtems__ -static void -re_ifmedia_sts(ifp, ifmr) - struct ifnet *ifp; - struct ifmediareq *ifmr; -{ - struct rl_softc *sc; - struct mii_data *mii; - - sc = ifp->if_softc; - mii = device_get_softc(sc->rl_miibus); - - RL_LOCK(sc); - mii_pollstat(mii); - RL_UNLOCK(sc); - ifmr->ifm_active = mii->mii_media_active; - ifmr->ifm_status = mii->mii_media_status; -} -#endif - -static int -#ifndef __rtems__ -re_ioctl(struct ifnet *ifp, u_long command, caddr_t data) -#else -re_ioctl(struct ifnet *ifp, ioctl_command_t command, caddr_t data) -#endif -{ - struct rl_softc *sc = ifp->if_softc; - struct ifreq *ifr = (struct ifreq *) data; - struct mii_data *mii; - int error = 0; - - switch (command) { - case SIOCSIFMTU: - RL_LOCK(sc); - if (ifr->ifr_mtu > RL_JUMBO_MTU) - error = EINVAL; - ifp->if_mtu = ifr->ifr_mtu; - RL_UNLOCK(sc); - break; - case SIOCSIFFLAGS: - RL_LOCK(sc); - if ((ifp->if_flags & IFF_UP) != 0) { - if ((ifp->if_drv_flags & IFF_DRV_RUNNING) != 0) { - if (((ifp->if_flags ^ sc->rl_if_flags) - & IFF_PROMISC) != 0) - re_setmulti(sc); - } else - re_init_locked(sc); - } else { - if ((ifp->if_drv_flags & IFF_DRV_RUNNING) != 0) - re_stop(sc); - } - sc->rl_if_flags = ifp->if_flags; - RL_UNLOCK(sc); - break; - case SIOCADDMULTI: - case SIOCDELMULTI: - RL_LOCK(sc); - re_setmulti(sc); - RL_UNLOCK(sc); - break; - case SIOCGIFMEDIA: - case SIOCSIFMEDIA: - mii = device_get_softc(sc->rl_miibus); -#ifndef __rtems__ - error = ifmedia_ioctl(ifp, ifr, &mii->mii_media, command); -#endif - break; -#ifndef __rtems__ - case SIOCSIFCAP: - { - int mask, reinit; - - mask = ifr->ifr_reqcap ^ ifp->if_capenable; - reinit = 0; -#ifdef DEVICE_POLLING - if (mask & IFCAP_POLLING) { - if (ifr->ifr_reqcap & IFCAP_POLLING) { - error = ether_poll_register(re_poll, ifp); - if (error) - return(error); - RL_LOCK(sc); - /* Disable interrupts */ - CSR_WRITE_2(sc, RL_IMR, 0x0000); - ifp->if_capenable |= IFCAP_POLLING; - RL_UNLOCK(sc); - } else { - error = ether_poll_deregister(ifp); - /* Enable interrupts. */ - RL_LOCK(sc); - CSR_WRITE_2(sc, RL_IMR, RL_INTRS_CPLUS); - ifp->if_capenable &= ~IFCAP_POLLING; - RL_UNLOCK(sc); - } - } -#endif /* DEVICE_POLLING */ - if (mask & IFCAP_HWCSUM) { - ifp->if_capenable ^= IFCAP_HWCSUM; - if (ifp->if_capenable & IFCAP_TXCSUM) - ifp->if_hwassist = RE_CSUM_FEATURES; - else - ifp->if_hwassist = 0; - reinit = 1; - } - if (mask & IFCAP_VLAN_HWTAGGING) { - ifp->if_capenable ^= IFCAP_VLAN_HWTAGGING; - reinit = 1; - } - if (reinit && ifp->if_drv_flags & IFF_DRV_RUNNING) - re_init(sc); -#ifdef VLAN_CAPABILITIES - VLAN_CAPABILITIES(ifp); -#endif - } -#endif - break; - default: - error = ether_ioctl(ifp, command, data); - break; - } - - return (error); -} - -static void -re_watchdog(sc) - struct rl_softc *sc; -{ - - RL_LOCK_ASSERT(sc); - - if (sc->rl_watchdog_timer == 0 || --sc->rl_watchdog_timer != 0) - return; - - device_printf(sc->rl_dev, "watchdog timeout\n"); - sc->rl_ifp->if_oerrors++; - - re_txeof(sc); - re_rxeof(sc); - re_init_locked(sc); -} - -/* - * Stop the adapter and free any mbufs allocated to the - * RX and TX lists. - */ -static void -re_stop(sc) - struct rl_softc *sc; -{ - register int i; - struct ifnet *ifp; - - RL_LOCK_ASSERT(sc); - - ifp = sc->rl_ifp; - - sc->rl_watchdog_timer = 0; - callout_stop(&sc->rl_stat_callout); - ifp->if_drv_flags &= ~(IFF_DRV_RUNNING | IFF_DRV_OACTIVE); - - CSR_WRITE_1(sc, RL_COMMAND, 0x00); - CSR_WRITE_2(sc, RL_IMR, 0x0000); - CSR_WRITE_2(sc, RL_ISR, 0xFFFF); - - if (sc->rl_head != NULL) { - m_freem(sc->rl_head); - sc->rl_head = sc->rl_tail = NULL; - } - - /* Free the TX list buffers. */ - - for (i = 0; i < RL_TX_DESC_CNT; i++) { - if (sc->rl_ldata.rl_tx_mbuf[i] != NULL) { - bus_dmamap_unload(sc->rl_ldata.rl_mtag, - sc->rl_ldata.rl_tx_dmamap[i]); - m_freem(sc->rl_ldata.rl_tx_mbuf[i]); - sc->rl_ldata.rl_tx_mbuf[i] = NULL; - } - } - - /* Free the RX list buffers. */ - - for (i = 0; i < RL_RX_DESC_CNT; i++) { - if (sc->rl_ldata.rl_rx_mbuf[i] != NULL) { - bus_dmamap_unload(sc->rl_ldata.rl_mtag, - sc->rl_ldata.rl_rx_dmamap[i]); - m_freem(sc->rl_ldata.rl_rx_mbuf[i]); - sc->rl_ldata.rl_rx_mbuf[i] = NULL; - } - } -} - -/* - * Device suspend routine. Stop the interface and save some PCI - * settings in case the BIOS doesn't restore them properly on - * resume. - */ -#ifndef __rtems__ -static int -re_suspend(dev) - device_t dev; -{ - struct rl_softc *sc; - - sc = device_get_softc(dev); - - RL_LOCK(sc); - re_stop(sc); - sc->suspended = 1; - RL_UNLOCK(sc); - - return (0); -} -#endif - -/* - * Device resume routine. Restore some PCI settings in case the BIOS - * doesn't, re-enable busmastering, and restart the interface if - * appropriate. - */ -#ifndef __rtems__ -static int -re_resume(dev) - device_t dev; -{ - struct rl_softc *sc; - struct ifnet *ifp; - - sc = device_get_softc(dev); - - RL_LOCK(sc); - - ifp = sc->rl_ifp; - - /* reinitialize interface if necessary */ - if (ifp->if_flags & IFF_UP) - re_init_locked(sc); - - sc->suspended = 0; - RL_UNLOCK(sc); - - return (0); -} -#endif - -/* - * Stop all chip I/O so that the kernel's probe routines don't - * get confused by errant DMAs when rebooting. - */ -static void -re_shutdown(dev) - device_t dev; -{ - struct rl_softc *sc; - - sc = device_get_softc(dev); - - RL_LOCK(sc); - re_stop(sc); - /* - * Mark interface as down since otherwise we will panic if - * interrupt comes in later on, which can happen in some - * cases. - */ - sc->rl_ifp->if_flags &= ~IFF_UP; - RL_UNLOCK(sc); -} diff --git a/bsd_eth_drivers/if_re/if_rlreg.h b/bsd_eth_drivers/if_re/if_rlreg.h deleted file mode 100644 index 5d9db5d..0000000 --- a/bsd_eth_drivers/if_re/if_rlreg.h +++ /dev/null @@ -1,993 +0,0 @@ -/*- - * Copyright (c) 1997, 1998-2003 - * Bill Paul . All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by Bill Paul. - * 4. Neither the name of the author nor the names of any co-contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY Bill Paul AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL Bill Paul OR THE VOICES IN HIS HEAD - * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) 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. - * - * $FreeBSD: src/sys/pci/if_rlreg.h,v 1.51.2.14.2.1 2008/10/02 02:57:24 kensmith Exp $ - */ - -/* - * RealTek 8129/8139 register offsets - */ -#define RL_IDR0 0x0000 /* ID register 0 (station addr) */ -#define RL_IDR1 0x0001 /* Must use 32-bit accesses (?) */ -#define RL_IDR2 0x0002 -#define RL_IDR3 0x0003 -#define RL_IDR4 0x0004 -#define RL_IDR5 0x0005 - /* 0006-0007 reserved */ -#define RL_MAR0 0x0008 /* Multicast hash table */ -#define RL_MAR1 0x0009 -#define RL_MAR2 0x000A -#define RL_MAR3 0x000B -#define RL_MAR4 0x000C -#define RL_MAR5 0x000D -#define RL_MAR6 0x000E -#define RL_MAR7 0x000F - -#define RL_TXSTAT0 0x0010 /* status of TX descriptor 0 */ -#define RL_TXSTAT1 0x0014 /* status of TX descriptor 1 */ -#define RL_TXSTAT2 0x0018 /* status of TX descriptor 2 */ -#define RL_TXSTAT3 0x001C /* status of TX descriptor 3 */ - -#define RL_TXADDR0 0x0020 /* address of TX descriptor 0 */ -#define RL_TXADDR1 0x0024 /* address of TX descriptor 1 */ -#define RL_TXADDR2 0x0028 /* address of TX descriptor 2 */ -#define RL_TXADDR3 0x002C /* address of TX descriptor 3 */ - -#define RL_RXADDR 0x0030 /* RX ring start address */ -#define RL_RX_EARLY_BYTES 0x0034 /* RX early byte count */ -#define RL_RX_EARLY_STAT 0x0036 /* RX early status */ -#define RL_COMMAND 0x0037 /* command register */ -#define RL_CURRXADDR 0x0038 /* current address of packet read */ -#define RL_CURRXBUF 0x003A /* current RX buffer address */ -#define RL_IMR 0x003C /* interrupt mask register */ -#define RL_ISR 0x003E /* interrupt status register */ -#define RL_TXCFG 0x0040 /* transmit config */ -#define RL_RXCFG 0x0044 /* receive config */ -#define RL_TIMERCNT 0x0048 /* timer count register */ -#define RL_MISSEDPKT 0x004C /* missed packet counter */ -#define RL_EECMD 0x0050 /* EEPROM command register */ -#define RL_CFG0 0x0051 /* config register #0 */ -#define RL_CFG1 0x0052 /* config register #1 */ - /* 0053-0057 reserved */ -#define RL_MEDIASTAT 0x0058 /* media status register (8139) */ - /* 0059-005A reserved */ -#define RL_MII 0x005A /* 8129 chip only */ -#define RL_HALTCLK 0x005B -#define RL_MULTIINTR 0x005C /* multiple interrupt */ -#define RL_PCIREV 0x005E /* PCI revision value */ - /* 005F reserved */ -#define RL_TXSTAT_ALL 0x0060 /* TX status of all descriptors */ - -/* Direct PHY access registers only available on 8139 */ -#define RL_BMCR 0x0062 /* PHY basic mode control */ -#define RL_BMSR 0x0064 /* PHY basic mode status */ -#define RL_ANAR 0x0066 /* PHY autoneg advert */ -#define RL_LPAR 0x0068 /* PHY link partner ability */ -#define RL_ANER 0x006A /* PHY autoneg expansion */ - -#define RL_DISCCNT 0x006C /* disconnect counter */ -#define RL_FALSECAR 0x006E /* false carrier counter */ -#define RL_NWAYTST 0x0070 /* NWAY test register */ -#define RL_RX_ER 0x0072 /* RX_ER counter */ -#define RL_CSCFG 0x0074 /* CS configuration register */ - -/* - * When operating in special C+ mode, some of the registers in an - * 8139C+ chip have different definitions. These are also used for - * the 8169 gigE chip. - */ -#define RL_DUMPSTATS_LO 0x0010 /* counter dump command register */ -#define RL_DUMPSTATS_HI 0x0014 /* counter dump command register */ -#define RL_TXLIST_ADDR_LO 0x0020 /* 64 bits, 256 byte alignment */ -#define RL_TXLIST_ADDR_HI 0x0024 /* 64 bits, 256 byte alignment */ -#define RL_TXLIST_ADDR_HPRIO_LO 0x0028 /* 64 bits, 256 byte alignment */ -#define RL_TXLIST_ADDR_HPRIO_HI 0x002C /* 64 bits, 256 byte alignment */ -#define RL_CFG2 0x0053 -#define RL_TIMERINT 0x0054 /* interrupt on timer expire */ -#define RL_TXSTART 0x00D9 /* 8 bits */ -#define RL_CPLUS_CMD 0x00E0 /* 16 bits */ -#define RL_RXLIST_ADDR_LO 0x00E4 /* 64 bits, 256 byte alignment */ -#define RL_RXLIST_ADDR_HI 0x00E8 /* 64 bits, 256 byte alignment */ -#define RL_EARLY_TX_THRESH 0x00EC /* 8 bits */ - -/* - * Registers specific to the 8169 gigE chip - */ -#define RL_TIMERINT_8169 0x0058 /* different offset than 8139 */ -#define RL_PHYAR 0x0060 -#define RL_TBICSR 0x0064 -#define RL_TBI_ANAR 0x0068 -#define RL_TBI_LPAR 0x006A -#define RL_GMEDIASTAT 0x006C /* 8 bits */ -#define RL_MAXRXPKTLEN 0x00DA /* 16 bits, chip multiplies by 8 */ -#define RL_GTXSTART 0x0038 /* 16 bits */ - -/* - * TX config register bits - */ -#define RL_TXCFG_CLRABRT 0x00000001 /* retransmit aborted pkt */ -#define RL_TXCFG_MAXDMA 0x00000700 /* max DMA burst size */ -#define RL_TXCFG_CRCAPPEND 0x00010000 /* CRC append (0 = yes) */ -#define RL_TXCFG_LOOPBKTST 0x00060000 /* loopback test */ -#define RL_TXCFG_IFG2 0x00080000 /* 8169 only */ -#define RL_TXCFG_IFG 0x03000000 /* interframe gap */ -#define RL_TXCFG_HWREV 0x7CC00000 - -#define RL_LOOPTEST_OFF 0x00000000 -#define RL_LOOPTEST_ON 0x00020000 -#define RL_LOOPTEST_ON_CPLUS 0x00060000 - -/* Known revision codes. */ - -#define RL_HWREV_8169 0x00000000 -#define RL_HWREV_8110S 0x00800000 -#define RL_HWREV_8169S 0x04000000 -#define RL_HWREV_8169_8110SB 0x10000000 -#define RL_HWREV_8169_8110SC 0x18000000 -#define RL_HWREV_8168_SPIN1 0x30000000 -#define RL_HWREV_8100E 0x30800000 -#define RL_HWREV_8101E 0x34000000 -#define RL_HWREV_8168_SPIN2 0x38000000 -#define RL_HWREV_8168_SPIN3 0x38400000 -#define RL_HWREV_8139 0x60000000 -#define RL_HWREV_8139A 0x70000000 -#define RL_HWREV_8139AG 0x70800000 -#define RL_HWREV_8139B 0x78000000 -#define RL_HWREV_8130 0x7C000000 -#define RL_HWREV_8139C 0x74000000 -#define RL_HWREV_8139D 0x74400000 -#define RL_HWREV_8139CPLUS 0x74800000 -#define RL_HWREV_8101 0x74c00000 -#define RL_HWREV_8100 0x78800000 - -#define RL_TXDMA_16BYTES 0x00000000 -#define RL_TXDMA_32BYTES 0x00000100 -#define RL_TXDMA_64BYTES 0x00000200 -#define RL_TXDMA_128BYTES 0x00000300 -#define RL_TXDMA_256BYTES 0x00000400 -#define RL_TXDMA_512BYTES 0x00000500 -#define RL_TXDMA_1024BYTES 0x00000600 -#define RL_TXDMA_2048BYTES 0x00000700 - -/* - * Transmit descriptor status register bits. - */ -#define RL_TXSTAT_LENMASK 0x00001FFF -#define RL_TXSTAT_OWN 0x00002000 -#define RL_TXSTAT_TX_UNDERRUN 0x00004000 -#define RL_TXSTAT_TX_OK 0x00008000 -#define RL_TXSTAT_EARLY_THRESH 0x003F0000 -#define RL_TXSTAT_COLLCNT 0x0F000000 -#define RL_TXSTAT_CARR_HBEAT 0x10000000 -#define RL_TXSTAT_OUTOFWIN 0x20000000 -#define RL_TXSTAT_TXABRT 0x40000000 -#define RL_TXSTAT_CARRLOSS 0x80000000 - -/* - * Interrupt status register bits. - */ -#define RL_ISR_RX_OK 0x0001 -#define RL_ISR_RX_ERR 0x0002 -#define RL_ISR_TX_OK 0x0004 -#define RL_ISR_TX_ERR 0x0008 -#define RL_ISR_RX_OVERRUN 0x0010 -#define RL_ISR_PKT_UNDERRUN 0x0020 -#define RL_ISR_LINKCHG 0x0020 /* 8169 only */ -#define RL_ISR_FIFO_OFLOW 0x0040 /* 8139 only */ -#define RL_ISR_TX_DESC_UNAVAIL 0x0080 /* C+ only */ -#define RL_ISR_SWI 0x0100 /* C+ only */ -#define RL_ISR_CABLE_LEN_CHGD 0x2000 -#define RL_ISR_PCS_TIMEOUT 0x4000 /* 8129 only */ -#define RL_ISR_TIMEOUT_EXPIRED 0x4000 -#define RL_ISR_SYSTEM_ERR 0x8000 - -#define RL_INTRS \ - (RL_ISR_TX_OK|RL_ISR_RX_OK|RL_ISR_RX_ERR|RL_ISR_TX_ERR| \ - RL_ISR_RX_OVERRUN|RL_ISR_PKT_UNDERRUN|RL_ISR_FIFO_OFLOW| \ - RL_ISR_PCS_TIMEOUT|RL_ISR_SYSTEM_ERR) - -#ifdef RE_TX_MODERATION -#define RL_INTRS_CPLUS \ - (RL_ISR_RX_OK|RL_ISR_RX_ERR|RL_ISR_TX_ERR| \ - RL_ISR_RX_OVERRUN|RL_ISR_PKT_UNDERRUN|RL_ISR_FIFO_OFLOW| \ - RL_ISR_PCS_TIMEOUT|RL_ISR_SYSTEM_ERR|RL_ISR_TIMEOUT_EXPIRED) -#else -#define RL_INTRS_CPLUS \ - (RL_ISR_RX_OK|RL_ISR_RX_ERR|RL_ISR_TX_ERR|RL_ISR_TX_OK| \ - RL_ISR_RX_OVERRUN|RL_ISR_PKT_UNDERRUN|RL_ISR_FIFO_OFLOW| \ - RL_ISR_PCS_TIMEOUT|RL_ISR_SYSTEM_ERR|RL_ISR_TIMEOUT_EXPIRED) -#endif - -/* - * Media status register. (8139 only) - */ -#define RL_MEDIASTAT_RXPAUSE 0x01 -#define RL_MEDIASTAT_TXPAUSE 0x02 -#define RL_MEDIASTAT_LINK 0x04 -#define RL_MEDIASTAT_SPEED10 0x08 -#define RL_MEDIASTAT_RXFLOWCTL 0x40 /* duplex mode */ -#define RL_MEDIASTAT_TXFLOWCTL 0x80 /* duplex mode */ - -/* - * Receive config register. - */ -#define RL_RXCFG_RX_ALLPHYS 0x00000001 /* accept all nodes */ -#define RL_RXCFG_RX_INDIV 0x00000002 /* match filter */ -#define RL_RXCFG_RX_MULTI 0x00000004 /* accept all multicast */ -#define RL_RXCFG_RX_BROAD 0x00000008 /* accept all broadcast */ -#define RL_RXCFG_RX_RUNT 0x00000010 -#define RL_RXCFG_RX_ERRPKT 0x00000020 -#define RL_RXCFG_WRAP 0x00000080 -#define RL_RXCFG_MAXDMA 0x00000700 -#define RL_RXCFG_BUFSZ 0x00001800 -#define RL_RXCFG_FIFOTHRESH 0x0000E000 -#define RL_RXCFG_EARLYTHRESH 0x07000000 - -#define RL_RXDMA_16BYTES 0x00000000 -#define RL_RXDMA_32BYTES 0x00000100 -#define RL_RXDMA_64BYTES 0x00000200 -#define RL_RXDMA_128BYTES 0x00000300 -#define RL_RXDMA_256BYTES 0x00000400 -#define RL_RXDMA_512BYTES 0x00000500 -#define RL_RXDMA_1024BYTES 0x00000600 -#define RL_RXDMA_UNLIMITED 0x00000700 - -#define RL_RXBUF_8 0x00000000 -#define RL_RXBUF_16 0x00000800 -#define RL_RXBUF_32 0x00001000 -#define RL_RXBUF_64 0x00001800 - -#define RL_RXFIFO_16BYTES 0x00000000 -#define RL_RXFIFO_32BYTES 0x00002000 -#define RL_RXFIFO_64BYTES 0x00004000 -#define RL_RXFIFO_128BYTES 0x00006000 -#define RL_RXFIFO_256BYTES 0x00008000 -#define RL_RXFIFO_512BYTES 0x0000A000 -#define RL_RXFIFO_1024BYTES 0x0000C000 -#define RL_RXFIFO_NOTHRESH 0x0000E000 - -/* - * Bits in RX status header (included with RX'ed packet - * in ring buffer). - */ -#define RL_RXSTAT_RXOK 0x00000001 -#define RL_RXSTAT_ALIGNERR 0x00000002 -#define RL_RXSTAT_CRCERR 0x00000004 -#define RL_RXSTAT_GIANT 0x00000008 -#define RL_RXSTAT_RUNT 0x00000010 -#define RL_RXSTAT_BADSYM 0x00000020 -#define RL_RXSTAT_BROAD 0x00002000 -#define RL_RXSTAT_INDIV 0x00004000 -#define RL_RXSTAT_MULTI 0x00008000 -#define RL_RXSTAT_LENMASK 0xFFFF0000 - -#define RL_RXSTAT_UNFINISHED 0xFFF0 /* DMA still in progress */ -/* - * Command register. - */ -#define RL_CMD_EMPTY_RXBUF 0x0001 -#define RL_CMD_TX_ENB 0x0004 -#define RL_CMD_RX_ENB 0x0008 -#define RL_CMD_RESET 0x0010 - -/* - * EEPROM control register - */ -#define RL_EE_DATAOUT 0x01 /* Data out */ -#define RL_EE_DATAIN 0x02 /* Data in */ -#define RL_EE_CLK 0x04 /* clock */ -#define RL_EE_SEL 0x08 /* chip select */ -#define RL_EE_MODE (0x40|0x80) - -#define RL_EEMODE_OFF 0x00 -#define RL_EEMODE_AUTOLOAD 0x40 -#define RL_EEMODE_PROGRAM 0x80 -#define RL_EEMODE_WRITECFG (0x80|0x40) - -/* 9346 EEPROM commands */ -#define RL_9346_ADDR_LEN 6 /* 93C46 1K: 128x16 */ -#define RL_9356_ADDR_LEN 8 /* 93C56 2K: 256x16 */ - -#define RL_9346_WRITE 0x5 -#define RL_9346_READ 0x6 -#define RL_9346_ERASE 0x7 -#define RL_9346_EWEN 0x4 -#define RL_9346_EWEN_ADDR 0x30 -#define RL_9456_EWDS 0x4 -#define RL_9346_EWDS_ADDR 0x00 - -#define RL_EECMD_WRITE 0x140 -#define RL_EECMD_READ_6BIT 0x180 -#define RL_EECMD_READ_8BIT 0x600 -#define RL_EECMD_ERASE 0x1c0 - -#define RL_EE_ID 0x00 -#define RL_EE_PCI_VID 0x01 -#define RL_EE_PCI_DID 0x02 -/* Location of station address inside EEPROM */ -#define RL_EE_EADDR 0x07 - -/* - * MII register (8129 only) - */ -#define RL_MII_CLK 0x01 -#define RL_MII_DATAIN 0x02 -#define RL_MII_DATAOUT 0x04 -#define RL_MII_DIR 0x80 /* 0 == input, 1 == output */ - -/* - * Config 0 register - */ -#define RL_CFG0_ROM0 0x01 -#define RL_CFG0_ROM1 0x02 -#define RL_CFG0_ROM2 0x04 -#define RL_CFG0_PL0 0x08 -#define RL_CFG0_PL1 0x10 -#define RL_CFG0_10MBPS 0x20 /* 10 Mbps internal mode */ -#define RL_CFG0_PCS 0x40 -#define RL_CFG0_SCR 0x80 - -/* - * Config 1 register - */ -#define RL_CFG1_PWRDWN 0x01 -#define RL_CFG1_SLEEP 0x02 -#define RL_CFG1_IOMAP 0x04 -#define RL_CFG1_MEMMAP 0x08 -#define RL_CFG1_RSVD 0x10 -#define RL_CFG1_DRVLOAD 0x20 -#define RL_CFG1_LED0 0x40 -#define RL_CFG1_FULLDUPLEX 0x40 /* 8129 only */ -#define RL_CFG1_LED1 0x80 - -/* - * 8139C+ register definitions - */ - -/* RL_DUMPSTATS_LO register */ - -#define RL_DUMPSTATS_START 0x00000008 - -/* Transmit start register */ - -#define RL_TXSTART_SWI 0x01 /* generate TX interrupt */ -#define RL_TXSTART_START 0x40 /* start normal queue transmit */ -#define RL_TXSTART_HPRIO_START 0x80 /* start hi prio queue transmit */ - -/* - * Config 2 register, 8139C+/8169/8169S/8110S only - */ -#define RL_CFG2_BUSFREQ 0x07 -#define RL_CFG2_BUSWIDTH 0x08 -#define RL_CFG2_AUXPWRSTS 0x10 - -#define RL_BUSFREQ_33MHZ 0x00 -#define RL_BUSFREQ_66MHZ 0x01 - -#define RL_BUSWIDTH_32BITS 0x00 -#define RL_BUSWIDTH_64BITS 0x08 - -/* C+ mode command register */ - -#define RL_CPLUSCMD_TXENB 0x0001 /* enable C+ transmit mode */ -#define RL_CPLUSCMD_RXENB 0x0002 /* enable C+ receive mode */ -#define RL_CPLUSCMD_PCI_MRW 0x0008 /* enable PCI multi-read/write */ -#define RL_CPLUSCMD_PCI_DAC 0x0010 /* PCI dual-address cycle only */ -#define RL_CPLUSCMD_RXCSUM_ENB 0x0020 /* enable RX checksum offload */ -#define RL_CPLUSCMD_VLANSTRIP 0x0040 /* enable VLAN tag stripping */ - -/* C+ early transmit threshold */ - -#define RL_EARLYTXTHRESH_CNT 0x003F /* byte count times 8 */ - -/* - * Gigabit PHY access register (8169 only) - */ - -#define RL_PHYAR_PHYDATA 0x0000FFFF -#define RL_PHYAR_PHYREG 0x001F0000 -#define RL_PHYAR_BUSY 0x80000000 - -/* - * Gigabit media status (8169 only) - */ -#define RL_GMEDIASTAT_FDX 0x01 /* full duplex */ -#define RL_GMEDIASTAT_LINK 0x02 /* link up */ -#define RL_GMEDIASTAT_10MBPS 0x04 /* 10mps link */ -#define RL_GMEDIASTAT_100MBPS 0x08 /* 100mbps link */ -#define RL_GMEDIASTAT_1000MBPS 0x10 /* gigE link */ -#define RL_GMEDIASTAT_RXFLOW 0x20 /* RX flow control on */ -#define RL_GMEDIASTAT_TXFLOW 0x40 /* TX flow control on */ -#define RL_GMEDIASTAT_TBI 0x80 /* TBI enabled */ - -/* - * The RealTek doesn't use a fragment-based descriptor mechanism. - * Instead, there are only four register sets, each or which represents - * one 'descriptor.' Basically, each TX descriptor is just a contiguous - * packet buffer (32-bit aligned!) and we place the buffer addresses in - * the registers so the chip knows where they are. - * - * We can sort of kludge together the same kind of buffer management - * used in previous drivers, but we have to do buffer copies almost all - * the time, so it doesn't really buy us much. - * - * For reception, there's just one large buffer where the chip stores - * all received packets. - */ - -#define RL_RX_BUF_SZ RL_RXBUF_64 -#define RL_RXBUFLEN (1 << ((RL_RX_BUF_SZ >> 11) + 13)) -#define RL_TX_LIST_CNT 4 -#define RL_MIN_FRAMELEN 60 -#define RL_TXTHRESH(x) ((x) << 11) -#define RL_TX_THRESH_INIT 96 -#define RL_RX_FIFOTHRESH RL_RXFIFO_NOTHRESH -#define RL_RX_MAXDMA RL_RXDMA_UNLIMITED -#define RL_TX_MAXDMA RL_TXDMA_2048BYTES - -#define RL_RXCFG_CONFIG (RL_RX_FIFOTHRESH|RL_RX_MAXDMA|RL_RX_BUF_SZ) -#define RL_TXCFG_CONFIG (RL_TXCFG_IFG|RL_TX_MAXDMA) - -#define RL_ETHER_ALIGN 2 - -struct rl_chain_data { - uint16_t cur_rx; - uint8_t *rl_rx_buf; - uint8_t *rl_rx_buf_ptr; - bus_dmamap_t rl_rx_dmamap; - - struct mbuf *rl_tx_chain[RL_TX_LIST_CNT]; - bus_dmamap_t rl_tx_dmamap[RL_TX_LIST_CNT]; - uint8_t last_tx; - uint8_t cur_tx; -}; - -#define RL_INC(x) (x = (x + 1) % RL_TX_LIST_CNT) -#define RL_CUR_TXADDR(x) ((x->rl_cdata.cur_tx * 4) + RL_TXADDR0) -#define RL_CUR_TXSTAT(x) ((x->rl_cdata.cur_tx * 4) + RL_TXSTAT0) -#define RL_CUR_TXMBUF(x) (x->rl_cdata.rl_tx_chain[x->rl_cdata.cur_tx]) -#define RL_CUR_DMAMAP(x) (x->rl_cdata.rl_tx_dmamap[x->rl_cdata.cur_tx]) -#define RL_LAST_TXADDR(x) ((x->rl_cdata.last_tx * 4) + RL_TXADDR0) -#define RL_LAST_TXSTAT(x) ((x->rl_cdata.last_tx * 4) + RL_TXSTAT0) -#define RL_LAST_TXMBUF(x) (x->rl_cdata.rl_tx_chain[x->rl_cdata.last_tx]) -#define RL_LAST_DMAMAP(x) (x->rl_cdata.rl_tx_dmamap[x->rl_cdata.last_tx]) - -struct rl_type { - uint16_t rl_vid; - uint16_t rl_did; - int rl_basetype; - char *rl_name; -}; - -struct rl_hwrev { - uint32_t rl_rev; - int rl_type; - char *rl_desc; -}; - -struct rl_mii_frame { - uint8_t mii_stdelim; - uint8_t mii_opcode; - uint8_t mii_phyaddr; - uint8_t mii_regaddr; - uint8_t mii_turnaround; - uint16_t mii_data; -}; - -/* - * MII constants - */ -#define RL_MII_STARTDELIM 0x01 -#define RL_MII_READOP 0x02 -#define RL_MII_WRITEOP 0x01 -#define RL_MII_TURNAROUND 0x02 - -#define RL_8129 1 -#define RL_8139 2 -#define RL_8139CPLUS 3 -#define RL_8169 4 - -#define RL_ISCPLUS(x) ((x)->rl_type == RL_8139CPLUS || \ - (x)->rl_type == RL_8169) - -/* - * The 8139C+ and 8160 gigE chips support descriptor-based TX - * and RX. In fact, they even support TCP large send. Descriptors - * must be allocated in contiguous blocks that are aligned on a - * 256-byte boundary. The rings can hold a maximum of 64 descriptors. - */ - -/* - * RX/TX descriptor definition. When large send mode is enabled, the - * lower 11 bits of the TX rl_cmd word are used to hold the MSS, and - * the checksum offload bits are disabled. The structure layout is - * the same for RX and TX descriptors - */ - -struct rl_desc { - uint32_t rl_cmdstat; - uint32_t rl_vlanctl; - uint32_t rl_bufaddr_lo; - uint32_t rl_bufaddr_hi; -}; - -#define RL_TDESC_CMD_FRAGLEN 0x0000FFFF -#define RL_TDESC_CMD_TCPCSUM 0x00010000 /* TCP checksum enable */ -#define RL_TDESC_CMD_UDPCSUM 0x00020000 /* UDP checksum enable */ -#define RL_TDESC_CMD_IPCSUM 0x00040000 /* IP header checksum enable */ -#define RL_TDESC_CMD_MSSVAL 0x07FF0000 /* Large send MSS value */ -#define RL_TDESC_CMD_LGSEND 0x08000000 /* TCP large send enb */ -#define RL_TDESC_CMD_EOF 0x10000000 /* end of frame marker */ -#define RL_TDESC_CMD_SOF 0x20000000 /* start of frame marker */ -#define RL_TDESC_CMD_EOR 0x40000000 /* end of ring marker */ -#define RL_TDESC_CMD_OWN 0x80000000 /* chip owns descriptor */ - -#define RL_TDESC_VLANCTL_TAG 0x00020000 /* Insert VLAN tag */ -#define RL_TDESC_VLANCTL_DATA 0x0000FFFF /* TAG data */ - -/* - * Error bits are valid only on the last descriptor of a frame - * (i.e. RL_TDESC_CMD_EOF == 1) - */ - -#define RL_TDESC_STAT_COLCNT 0x000F0000 /* collision count */ -#define RL_TDESC_STAT_EXCESSCOL 0x00100000 /* excessive collisions */ -#define RL_TDESC_STAT_LINKFAIL 0x00200000 /* link faulure */ -#define RL_TDESC_STAT_OWINCOL 0x00400000 /* out-of-window collision */ -#define RL_TDESC_STAT_TXERRSUM 0x00800000 /* transmit error summary */ -#define RL_TDESC_STAT_UNDERRUN 0x02000000 /* TX underrun occured */ -#define RL_TDESC_STAT_OWN 0x80000000 - -/* - * RX descriptor cmd/vlan definitions - */ - -#define RL_RDESC_CMD_EOR 0x40000000 -#define RL_RDESC_CMD_OWN 0x80000000 -#define RL_RDESC_CMD_BUFLEN 0x00001FFF - -#define RL_RDESC_STAT_OWN 0x80000000 -#define RL_RDESC_STAT_EOR 0x40000000 -#define RL_RDESC_STAT_SOF 0x20000000 -#define RL_RDESC_STAT_EOF 0x10000000 -#define RL_RDESC_STAT_FRALIGN 0x08000000 /* frame alignment error */ -#define RL_RDESC_STAT_MCAST 0x04000000 /* multicast pkt received */ -#define RL_RDESC_STAT_UCAST 0x02000000 /* unicast pkt received */ -#define RL_RDESC_STAT_BCAST 0x01000000 /* broadcast pkt received */ -#define RL_RDESC_STAT_BUFOFLOW 0x00800000 /* out of buffer space */ -#define RL_RDESC_STAT_FIFOOFLOW 0x00400000 /* FIFO overrun */ -#define RL_RDESC_STAT_GIANT 0x00200000 /* pkt > 4096 bytes */ -#define RL_RDESC_STAT_RXERRSUM 0x00100000 /* RX error summary */ -#define RL_RDESC_STAT_RUNT 0x00080000 /* runt packet received */ -#define RL_RDESC_STAT_CRCERR 0x00040000 /* CRC error */ -#define RL_RDESC_STAT_PROTOID 0x00030000 /* Protocol type */ -#define RL_RDESC_STAT_IPSUMBAD 0x00008000 /* IP header checksum bad */ -#define RL_RDESC_STAT_UDPSUMBAD 0x00004000 /* UDP checksum bad */ -#define RL_RDESC_STAT_TCPSUMBAD 0x00002000 /* TCP checksum bad */ -#define RL_RDESC_STAT_FRAGLEN 0x00001FFF /* RX'ed frame/frag len */ -#define RL_RDESC_STAT_GFRAGLEN 0x00003FFF /* RX'ed frame/frag len */ -#define RL_RDESC_STAT_ERRS (RL_RDESC_STAT_GIANT|RL_RDESC_STAT_RUNT| \ - RL_RDESC_STAT_CRCERR) - -#define RL_RDESC_VLANCTL_TAG 0x00010000 /* VLAN tag available - (rl_vlandata valid)*/ -#define RL_RDESC_VLANCTL_DATA 0x0000FFFF /* TAG data */ - -#define RL_PROTOID_NONIP 0x00000000 -#define RL_PROTOID_TCPIP 0x00010000 -#define RL_PROTOID_UDPIP 0x00020000 -#define RL_PROTOID_IP 0x00030000 -#define RL_TCPPKT(x) (((x) & RL_RDESC_STAT_PROTOID) == \ - RL_PROTOID_TCPIP) -#define RL_UDPPKT(x) (((x) & RL_RDESC_STAT_PROTOID) == \ - RL_PROTOID_UDPIP) - -/* - * Statistics counter structure (8139C+ and 8169 only) - */ -struct rl_stats { - uint32_t rl_tx_pkts_lo; - uint32_t rl_tx_pkts_hi; - uint32_t rl_tx_errs_lo; - uint32_t rl_tx_errs_hi; - uint32_t rl_tx_errs; - uint16_t rl_missed_pkts; - uint16_t rl_rx_framealign_errs; - uint32_t rl_tx_onecoll; - uint32_t rl_tx_multicolls; - uint32_t rl_rx_ucasts_hi; - uint32_t rl_rx_ucasts_lo; - uint32_t rl_rx_bcasts_lo; - uint32_t rl_rx_bcasts_hi; - uint32_t rl_rx_mcasts; - uint16_t rl_tx_aborts; - uint16_t rl_rx_underruns; -}; - -/* - * Rx/Tx descriptor parameters (8139C+ and 8169 only) - * - * Tx/Rx count must be equal. Shared code like re_dma_map_desc assumes this. - * Buffers must be a multiple of 8 bytes. Currently limit to 64 descriptors - * due to the 8139C+. We need to put the number of descriptors in the ring - * structure and use that value instead. - */ -#if !defined(__i386__) && !defined(__amd64__) -#define RE_FIXUP_RX 1 -#endif - -#define RL_TX_DESC_CNT 64 -#define RL_TX_DESC_THLD 4 -#define RL_RX_DESC_CNT RL_TX_DESC_CNT - -#define RL_RX_LIST_SZ (RL_RX_DESC_CNT * sizeof(struct rl_desc)) -#define RL_TX_LIST_SZ (RL_TX_DESC_CNT * sizeof(struct rl_desc)) -#define RL_RING_ALIGN 256 -#define RL_IFQ_MAXLEN 512 -#define RL_DESC_INC(x) (x = (x + 1) % RL_TX_DESC_CNT) -#define RL_OWN(x) (le32toh((x)->rl_cmdstat) & RL_RDESC_STAT_OWN) -#define RL_RXBYTES(x) (le32toh((x)->rl_cmdstat) & sc->rl_rxlenmask) -#define RL_PKTSZ(x) ((x)/* >> 3*/) -#ifdef RE_FIXUP_RX -#define RE_ETHER_ALIGN sizeof(uint64_t) -#define RE_RX_DESC_BUFLEN (MCLBYTES - RE_ETHER_ALIGN) -#else -#define RE_ETHER_ALIGN 0 -#define RE_RX_DESC_BUFLEN MCLBYTES -#endif - -#define RL_ADDR_LO(y) ((uint64_t) (y) & 0xFFFFFFFF) -#define RL_ADDR_HI(y) ((uint64_t) (y) >> 32) - -/* see comment in dev/re/if_re.c */ -#define RL_JUMBO_FRAMELEN 7440 -#define RL_JUMBO_MTU (RL_JUMBO_FRAMELEN-ETHER_HDR_LEN-ETHER_CRC_LEN) - -struct rl_softc; - -struct rl_dmaload_arg { - int rl_idx; - int rl_maxsegs; - uint32_t rl_flags; - struct rl_desc *rl_ring; -}; - -struct rl_list_data { - struct mbuf *rl_tx_mbuf[RL_TX_DESC_CNT]; - struct mbuf *rl_rx_mbuf[RL_RX_DESC_CNT]; - int rl_tx_prodidx; - int rl_rx_prodidx; - int rl_tx_considx; - int rl_tx_free; - bus_dmamap_t rl_tx_dmamap[RL_TX_DESC_CNT]; - bus_dmamap_t rl_rx_dmamap[RL_RX_DESC_CNT]; - bus_dma_tag_t rl_mtag; /* mbuf mapping tag */ - bus_dma_tag_t rl_stag; /* stats mapping tag */ - bus_dmamap_t rl_smap; /* stats map */ - struct rl_stats *rl_stats; - bus_addr_t rl_stats_addr; - bus_dma_tag_t rl_rx_list_tag; - bus_dmamap_t rl_rx_list_map; - struct rl_desc *rl_rx_list; - bus_addr_t rl_rx_list_addr; - bus_dma_tag_t rl_tx_list_tag; - bus_dmamap_t rl_tx_list_map; - struct rl_desc *rl_tx_list; - bus_addr_t rl_tx_list_addr; -}; - -struct rl_softc { - struct ifnet *rl_ifp; /* interface info */ - bus_space_handle_t rl_bhandle; /* bus space handle */ - bus_space_tag_t rl_btag; /* bus space tag */ - device_t rl_dev; - struct resource *rl_res; - struct resource *rl_irq; - void *rl_intrhand; - device_t rl_miibus; - bus_dma_tag_t rl_parent_tag; - bus_dma_tag_t rl_tag; - uint8_t rl_type; - int rl_eecmd_read; - int rl_eewidth; - uint8_t rl_stats_no_timeout; - int rl_txthresh; - struct rl_chain_data rl_cdata; - struct rl_list_data rl_ldata; - struct callout rl_stat_callout; - int rl_watchdog_timer; - struct mtx rl_mtx; - struct mbuf *rl_head; - struct mbuf *rl_tail; - uint32_t rl_hwrev; - uint32_t rl_rxlenmask; - int rl_testmode; - int rl_if_flags; - int suspended; /* 0 = normal 1 = suspended */ -#ifdef DEVICE_POLLING - int rxcycles; -#endif - - struct task rl_txtask; - struct task rl_inttask; - - struct mtx rl_intlock; - int rl_txstart; - int rl_link; -}; - -#define RL_LOCK(_sc) mtx_lock(&(_sc)->rl_mtx) -#define RL_UNLOCK(_sc) mtx_unlock(&(_sc)->rl_mtx) -#define RL_LOCK_ASSERT(_sc) mtx_assert(&(_sc)->rl_mtx, MA_OWNED) - -/* - * register space access macros - */ -#define CSR_WRITE_STREAM_4(sc, reg, val) \ - bus_space_write_stream_4(sc->rl_btag, sc->rl_bhandle, reg, val) -#define CSR_WRITE_4(sc, reg, val) \ - bus_space_write_4(sc->rl_btag, sc->rl_bhandle, reg, val) -#define CSR_WRITE_2(sc, reg, val) \ - bus_space_write_2(sc->rl_btag, sc->rl_bhandle, reg, val) -#define CSR_WRITE_1(sc, reg, val) \ - bus_space_write_1(sc->rl_btag, sc->rl_bhandle, reg, val) - -#define CSR_READ_4(sc, reg) \ - bus_space_read_4(sc->rl_btag, sc->rl_bhandle, reg) -#define CSR_READ_2(sc, reg) \ - bus_space_read_2(sc->rl_btag, sc->rl_bhandle, reg) -#define CSR_READ_1(sc, reg) \ - bus_space_read_1(sc->rl_btag, sc->rl_bhandle, reg) - -#define CSR_SETBIT_1(sc, offset, val) \ - CSR_WRITE_1(sc, offset, CSR_READ_1(sc, offset) | (val)) - -#define CSR_CLRBIT_1(sc, offset, val) \ - CSR_WRITE_1(sc, offset, CSR_READ_1(sc, offset) & ~(val)) - -#define CSR_SETBIT_2(sc, offset, val) \ - CSR_WRITE_2(sc, offset, CSR_READ_2(sc, offset) | (val)) - -#define CSR_CLRBIT_2(sc, offset, val) \ - CSR_WRITE_2(sc, offset, CSR_READ_2(sc, offset) & ~(val)) - -#define CSR_SETBIT_4(sc, offset, val) \ - CSR_WRITE_4(sc, offset, CSR_READ_4(sc, offset) | (val)) - -#define CSR_CLRBIT_4(sc, offset, val) \ - CSR_WRITE_4(sc, offset, CSR_READ_4(sc, offset) & ~(val)) - -#define RL_TIMEOUT 1000 - -/* - * General constants that are fun to know. - * - * RealTek PCI vendor ID - */ -#define RT_VENDORID 0x10EC - -/* - * RealTek chip device IDs. - */ -#define RT_DEVICEID_8139D 0x8039 -#define RT_DEVICEID_8129 0x8129 -#define RT_DEVICEID_8101E 0x8136 -#define RT_DEVICEID_8138 0x8138 -#define RT_DEVICEID_8139 0x8139 -#define RT_DEVICEID_8169SC 0x8167 -#define RT_DEVICEID_8168 0x8168 -#define RT_DEVICEID_8169 0x8169 -#define RT_DEVICEID_8100 0x8100 - -#define RT_REVID_8139CPLUS 0x20 - -/* - * Accton PCI vendor ID - */ -#define ACCTON_VENDORID 0x1113 - -/* - * Accton MPX 5030/5038 device ID. - */ -#define ACCTON_DEVICEID_5030 0x1211 - -/* - * Nortel PCI vendor ID - */ -#define NORTEL_VENDORID 0x126C - -/* - * Delta Electronics Vendor ID. - */ -#define DELTA_VENDORID 0x1500 - -/* - * Delta device IDs. - */ -#define DELTA_DEVICEID_8139 0x1360 - -/* - * Addtron vendor ID. - */ -#define ADDTRON_VENDORID 0x4033 - -/* - * Addtron device IDs. - */ -#define ADDTRON_DEVICEID_8139 0x1360 - -/* - * D-Link vendor ID. - */ -#define DLINK_VENDORID 0x1186 - -/* - * D-Link DFE-530TX+ device ID - */ -#define DLINK_DEVICEID_530TXPLUS 0x1300 - -/* - * D-Link DFE-5280T device ID - */ -#define DLINK_DEVICEID_528T 0x4300 - -/* - * D-Link DFE-690TXD device ID - */ -#define DLINK_DEVICEID_690TXD 0x1340 - -/* - * Corega K.K vendor ID - */ -#define COREGA_VENDORID 0x1259 - -/* - * Corega FEther CB-TXD device ID - */ -#define COREGA_DEVICEID_FETHERCBTXD 0xa117 - -/* - * Corega FEtherII CB-TXD device ID - */ -#define COREGA_DEVICEID_FETHERIICBTXD 0xa11e - -/* - * Corega CG-LAPCIGT device ID - */ -#define COREGA_DEVICEID_CGLAPCIGT 0xc107 - -/* - * Linksys vendor ID - */ -#define LINKSYS_VENDORID 0x1737 - -/* - * Linksys EG1032 device ID - */ -#define LINKSYS_DEVICEID_EG1032 0x1032 - -/* - * Linksys EG1032 rev 3 sub-device ID - */ -#define LINKSYS_SUBDEVICE_EG1032_REV3 0x0024 - -/* - * Peppercon vendor ID - */ -#define PEPPERCON_VENDORID 0x1743 - -/* - * Peppercon ROL-F device ID - */ -#define PEPPERCON_DEVICEID_ROLF 0x8139 - -/* - * Planex Communications, Inc. vendor ID - */ -#define PLANEX_VENDORID 0x14ea - -/* - * Planex FNW-3603-TX device ID - */ -#define PLANEX_DEVICEID_FNW3603TX 0xab06 - -/* - * Planex FNW-3800-TX device ID - */ -#define PLANEX_DEVICEID_FNW3800TX 0xab07 - -/* - * LevelOne vendor ID - */ -#define LEVEL1_VENDORID 0x018A - -/* - * LevelOne FPC-0106TX devide ID - */ -#define LEVEL1_DEVICEID_FPC0106TX 0x0106 - -/* - * Compaq vendor ID - */ -#define CP_VENDORID 0x021B - -/* - * Edimax vendor ID - */ -#define EDIMAX_VENDORID 0x13D1 - -/* - * Edimax EP-4103DL cardbus device ID - */ -#define EDIMAX_DEVICEID_EP4103DL 0xAB06 - -/* US Robotics vendor ID */ - -#define USR_VENDORID 0x16EC - -/* US Robotics 997902 device ID */ - -#define USR_DEVICEID_997902 0x0116 - -/* - * PCI low memory base and low I/O base register, and - * other PCI registers. - */ - -#define RL_PCI_VENDOR_ID 0x00 -#define RL_PCI_DEVICE_ID 0x02 -#define RL_PCI_COMMAND 0x04 -#define RL_PCI_STATUS 0x06 -#define RL_PCI_CLASSCODE 0x09 -#define RL_PCI_LATENCY_TIMER 0x0D -#define RL_PCI_HEADER_TYPE 0x0E -#define RL_PCI_LOIO 0x10 -#define RL_PCI_LOMEM 0x14 -#define RL_PCI_BIOSROM 0x30 -#define RL_PCI_INTLINE 0x3C -#define RL_PCI_INTPIN 0x3D -#define RL_PCI_MINGNT 0x3E -#define RL_PCI_MINLAT 0x0F -#define RL_PCI_RESETOPT 0x48 -#define RL_PCI_EEPROM_DATA 0x4C - -#define RL_PCI_CAPID 0x50 /* 8 bits */ -#define RL_PCI_NEXTPTR 0x51 /* 8 bits */ -#define RL_PCI_PWRMGMTCAP 0x52 /* 16 bits */ -#define RL_PCI_PWRMGMTCTRL 0x54 /* 16 bits */ - -#define RL_PSTATE_MASK 0x0003 -#define RL_PSTATE_D0 0x0000 -#define RL_PSTATE_D1 0x0002 -#define RL_PSTATE_D2 0x0002 -#define RL_PSTATE_D3 0x0003 -#define RL_PME_EN 0x0010 -#define RL_PME_STATUS 0x8000 diff --git a/bsd_eth_drivers/libbsdport/Makefile b/bsd_eth_drivers/libbsdport/Makefile deleted file mode 100644 index fbf9f35..0000000 --- a/bsd_eth_drivers/libbsdport/Makefile +++ /dev/null @@ -1,116 +0,0 @@ -# -# Makefile.lib,v 1.5 2000/06/12 15:00:14 joel Exp -# -# Templates/Makefile.lib -# Template library Makefile -# - -LIBNAME=libbsdport.a -LIB=${ARCH}/${LIBNAME} - -# C and C++ source names, if any, go here -- minus the .c or .cc -C_PIECES=rtems_callout rtems_taskqueue rtems_udelay ifstuff devicet alldrv -C_PIECES+=contigmalloc sysbus malloc ifmedia -C_FILES=$(C_PIECES:%=%.c) -C_O_FILES=$(C_PIECES:%=${ARCH}/%.o) - -CC_PIECES= -CC_FILES=$(CC_PIECES:%=%.cc) -CC_O_FILES=$(CC_PIECES:%=${ARCH}/%.o) - -H_FILES=libbsdport_api.h rtems_verscheck.h - -LINKS+=sys/taskqueue.h -LINKS+=sys/bus.h -LINKS+=sys/mutex.h -LINKS+=bsp/rtems_verscheck.h - -DUMMYHEADERS+=dummyheaders/machine/bus.h -DUMMYHEADERS+=dummyheaders/machine/resource.h -DUMMYHEADERS+=dummyheaders/dev/pci/pcivar.h -DUMMYHEADERS+=dummyheaders/dev/pci/pcireg.h -DUMMYHEADERS+=dummyheaders/dev/mii/miivar.h -DUMMYHEADERS+=dummyheaders/sys/module.h -DUMMYHEADERS+=dummyheaders/sys/rman.h -DUMMYHEADERS+=dummyheaders/sys/kthread.h -DUMMYHEADERS+=dummyheaders/sys/endian.h -DUMMYHEADERS+=dummyheaders/net/if_vlan_var.h -DUMMYHEADERS+=dummyheaders/netinet/ip6.h -DUMMYHEADERS+=dummyheaders/vm/pmap.h -DUMMYHEADERS+=dummyheaders/miibus_if.h - -# Assembly source names, if any, go here -- minus the .S -S_PIECES= -S_FILES=$(S_PIECES:%=%.S) -S_O_FILES=$(S_FILES:%.S=${ARCH}/%.o) - -SRCS=$(C_FILES) $(CC_FILES) $(H_FILES) $(S_FILES) -OBJS=$(C_O_FILES) $(CC_O_FILES) $(S_O_FILES) - -all: - -depend: ${LINKS} - -include $(RTEMS_MAKEFILE_PATH)/Makefile.inc - -include $(RTEMS_CUSTOM) -include $(RTEMS_ROOT)/make/lib.cfg - -# -# Add local stuff here using += -# - -DEFINES += -CPPFLAGS += -I. -CFLAGS += - -# -# Add your list of files to delete here. The config files -# already know how to delete some stuff, so you may want -# to just run 'make clean' first to see what gets missed. -# 'make clobber' already includes 'make clean' -# - -CLEAN_ADDITIONS += -CLOBBER_ADDITIONS += dummyheaders -CLOBBER_ADDITIONS += $(sort $(foreach n,$(LINKS),$(firstword $(subst /, ,$(n))))) - -all: ${DUMMYHEADERS} ${LINKS} ${ARCH} $(SRCS) $(LIB) - -$(LIB): ${OBJS} - $(make-library) - -dummyheaders/%: - @if [ ! -d `dirname $@` ] ; then mkdir -p `dirname $@`; fi - @touch $@ - -# for each name listed in LINKS, create parent directories (if needed) -# and a symlink to file in . -# E.g., LINKS=a/b/c.h -# creates a/b/c.h -> ../../c.h -$(LINKS): - @if [ ! -d $(dir $@) ] ; then mkdir -p $(dir $@); fi - @ln -s `echo $@ | sed -e 's%[^/]\+[/]\+%../%g'` $@ - -ifndef RTEMS_SITE_INSTALLDIR -RTEMS_SITE_INSTALLDIR = $(PROJECT_RELEASE) -endif - -ifndef RTEMS_SITE_BSP_INSTALLDIR -RTEMS_SITE_BSP_INSTALLDIR = $(RTEMS_SITE_INSTALLDIR) -endif - -${RTEMS_SITE_INSTALLDIR}/include/bsp \ -${RTEMS_SITE_INSTALLDIR}/lib \ -${RTEMS_SITE_INSTALLDIR}/bin: - test -d $@ || mkdir -p $@ - -# Install the program(s), appending _g or _p as appropriate. -# for include files, just use $(INSTALL_CHANGE) -# - -install: all $(RTEMS_SITE_INSTALLDIR)/lib $(RTEMS_SITE_INSTALLDIR)/include/bsp - $(INSTALL_VARIANT) -m 644 ${LIB} ${RTEMS_SITE_INSTALLDIR}/lib - $(INSTALL_CHANGE) -m 644 ${H_FILES} ${RTEMS_SITE_INSTALLDIR}/include/bsp - - diff --git a/bsd_eth_drivers/libbsdport/modini.c b/bsd_eth_drivers/libbsdport/modini.c deleted file mode 100644 index 3156c16..0000000 --- a/bsd_eth_drivers/libbsdport/modini.c +++ /dev/null @@ -1,100 +0,0 @@ -#include "devicet.h" -#include - -struct { - struct device dev; - struct { - char space[4096]; - } softc; -} thele = { - { - bushdr: { -/* mvme5500 { x, x, x } */ -/* qemu */ { 0, 3, 0 } - }, - type: DEV_TYPE_PCI, - name: "le", - nameunit: { 'l', 'e', '1', 0}, - unit: 1, - }, - { - { 0, } - } -}; - -void *thelesoftc = &thele.softc; - - -struct { - struct device dev; - struct { - char space[4096]; - } softc; -} theem = { - { - bushdr: { -/* mvme5500 { 2, 0xa, 0 } */ -/* cpci */ { 7, 0, 0 } - }, - type: DEV_TYPE_PCI, - name: "em", - nameunit: { 'e', 'm', '1', 0}, - unit: 1, - }, - { - { 0, } - } -}; - -void *theemsoftc = &theem.softc; - -struct { - struct device dev; - struct { - char space[4096]; - } softc; -} thepcn = { - { - bushdr: { -/* mvme5500 { x, 0xx, x } */ -/* cpci */ { 4, 6, 0 } - }, - type: DEV_TYPE_PCI, - name: "pcn", - nameunit: { 'p', 'c', 'n', '1', 0}, - unit: 1, - }, - { - { 0, } - } -}; - -void *thepcnsoftc = &thepcn.softc; - -extern driver_t rtems_em_driver; -extern driver_t rtems_le_pci_driver; -extern driver_t rtems_pcn_driver; - -driver_t *rtems_netdriver_table[] = { - &rtems_em_driver, - &rtems_le_pci_driver, - &rtems_pcn_driver, - 0 -}; - -struct rtems_bsdnet_ifconfig pcncfg = { - name: "pcn", - rbuf_count:20, - xbuf_count:3, -}; - -#ifdef DEBUG_MODULAR -void -_cexpModuleInitialize(void *unused) -{ -extern void * rtems_callout_initialize(); -extern void * rtems_taskqueue_initialize(); - rtems_callout_initialize(); - rtems_taskqueue_initialize(); -} -#endif diff --git a/m4/acinclude.m4 b/m4/acinclude.m4 deleted file mode 100644 index 130276e..0000000 --- a/m4/acinclude.m4 +++ /dev/null @@ -1,16 +0,0 @@ -dnl m4_syscmd is executed when aclocal is run -m4_syscmd([cat - > makefile.top.am <<'EOF_' -AUTOMAKE_OPTIONS=foreign -SUBDIRS=@the_subdirs@ -# When making a distribution we only want to -# recurse into (any) one single BSP subdir. -DIST_SUBDIRS=@the_distsub@ - -# The dist-hook then removes this extra -# directory level again. -dist-hook: - if test "$(PACKAGE_VERSION)" = "untagged" ; then echo "Need tagged version to cut distribution"; exit 1; fi - cp -frl $(distdir)/$(DIST_SUBDIRS)/* $(distdir) - rm -fr $(distdir)/$(DIST_SUBDIRS) -EOF_ -]) diff --git a/m4/multilib-fix.m4 b/m4/multilib-fix.m4 deleted file mode 100644 index d822a79..0000000 --- a/m4/multilib-fix.m4 +++ /dev/null @@ -1,78 +0,0 @@ -# Automake-1.10's AM_ENABLE_MULTILIB is buggy - it -# does not properly preserve quoting when copying -# ac_configure_args to the 'config.status' it creates. -# I guess one level of quoting is removed when the -# copying happens (by means of a 'here'-document in -# AC_OUTPUT_COMMANDS). -# -# Note that we cannot use a different name since -# automake 'knows' about AM_ENABLE_MULTILIB and -# behaves differently if we would, e.g., name the -# modified macro 'MY_ENABLE_MULTILIB'. -# Hence we hope that we can override automake/aclocal's -# definition. -# -# Below (look at the 'sed' code) we replace all occurrences -# of '$' by '\$' so that 'config.status' again says '$'. -# -# This is important if we want to pass e.g., -# -# --exec-prefix='${prefix}/xxx' -# -# correctly to the multisubdir configurations. -# -# AM_ENABLE_MULTILIB([MAKEFILE], [REL-TO-TOP-SRCDIR]) -# --------------------------------------------------- -# Add --enable-multilib to configure. -AC_DEFUN([AM_ENABLE_MULTILIB], -[# Default to --enable-multilib -AC_ARG_ENABLE(multilib, -[ --enable-multilib build many library versions (default)], -[case "$enableval" in - yes) multilib=yes ;; - no) multilib=no ;; - *) AC_MSG_ERROR([bad value $enableval for multilib option]) ;; - esac], - [multilib=yes]) - -# We may get other options which we leave undocumented: -# --with-target-subdir, --with-multisrctop, --with-multisubdir -# See config-ml.in if you want the gory details. - -if test "$srcdir" = "."; then - if test "$with_target_subdir" != "."; then - multi_basedir="$srcdir/$with_multisrctop../$2" - else - multi_basedir="$srcdir/$with_multisrctop$2" - fi -else - multi_basedir="$srcdir/$2" -fi -AC_SUBST(multi_basedir) - -# Even if the default multilib is not a cross compilation, -# it may be that some of the other multilibs are. -if test $cross_compiling = no && test $multilib = yes \ - && test "x${with_multisubdir}" != x ; then - cross_compiling=maybe -fi - -AC_OUTPUT_COMMANDS([ -# Only add multilib support code if we just rebuilt the top-level -# Makefile. -case " $CONFIG_FILES " in - *" ]m4_default([$1],Makefile)[ "*) - ac_file=]m4_default([$1],Makefile)[ . ${multi_basedir}/config-ml.in - ;; -esac], - [ -srcdir="$srcdir" -host="$host" -target="$target" -with_multisubdir="$with_multisubdir" -with_multisrctop="$with_multisrctop" -with_target_subdir="$with_target_subdir" -ac_configure_args="${multilib_arg} `echo ${ac_configure_args} | sed -e 's/[$]/\\\\$/g'`" -multi_basedir="$multi_basedir" -CONFIG_SHELL=${CONFIG_SHELL-/bin/sh} -CC="$CC"])])dnl diff --git a/m4/multilib-installdir.m4 b/m4/multilib-installdir.m4 deleted file mode 100644 index 68ac591..0000000 --- a/m4/multilib-installdir.m4 +++ /dev/null @@ -1,21 +0,0 @@ -# TILLAM_MULTISUB_INSTALLDIR -# -# tweak 'libdir' so that libraries are -# installed in proper multisubdir. -# -# For use by 'sub-packages', i.e., from -# configure.ac in a subdir of a main -# package. Only the toplevel configure.ac -# should say AM_ENABLE_MULTILIB -# -AC_DEFUN([TILLAM_MULTISUB_INSTALLDIR], -[# Install multilib into proper multisubdir -if test "${with_multisubdir+set}" = "set" ; then - the_multisubdir="/${with_multisubdir}" -else - the_multisubdir= -fi -AC_SUBST(libdir,[${libdir}${the_multisubdir}])])dnl - - -])dnl diff --git a/m4/rtems-bsp-postlink.m4 b/m4/rtems-bsp-postlink.m4 deleted file mode 100644 index c2007d4..0000000 --- a/m4/rtems-bsp-postlink.m4 +++ /dev/null @@ -1,32 +0,0 @@ -# Define 'postlink' commands based on BSP family -# -# NOTE: This is NOT extracted from the RTEMS makefiles but -# essentially a copy of what rtems-4.9.0 does. -# It would be too hard to figure this one out ;-( -# -AC_DEFUN([TILLAC_RTEMS_BSP_POSTLINK_CMDS], - [AC_ARG_VAR([RTEMS_BSP_POSTLINK_CMDS],[Command sequence to convert ELF file into downloadable executable]) - AC_MSG_NOTICE([Setting RTEMS_BSP_POSTLINK_CMDS based on RTEMS_BSP_FAMILY]) - case "$RTEMS_BSP_FAMILY" in - svgm|beatnik|mvme5500|mvme3100|uC5282|mvme167|mvme162) -# convert ELF -> pure binary - RTEMS_BSP_POSTLINK_CMDS='$(OBJCOPY) -Obinary -R .comment -S $(basename $[@])$(APPEXEEXT) $[@]' - ;; - motorola_powerpc) -# convert ELF -> special PREP bootloader - RTEMS_BSP_POSTLINK_CMDS=\ -'$(OBJCOPY) -O binary -R .comment -S $(basename $[@])$(APPEXEEXT) rtems ;'\ -'gzip -vf9 rtems ; '\ -'$(LD) -o $(basename $[@])$(DOWNEXT) $(RTEMS_BSP_INSTTOP)/lib/bootloader.o '\ -'--just-symbols=$(basename $[@])$(APPEXEEXT) '\ -'-b binary rtems.gz -T $(RTEMS_BSP_INSTTOP)/lib/ppcboot.lds '\ -'-Map $(basename $[@]).map && chmod 755 $(basename $[@])$(DOWNEXT) ; '\ -'rm -f rtems.gz' - ;; -# default: empty command - *) - ;; - esac - AC_MSG_NOTICE([RTEMS_BSP_POSTLINK_CMDS: "$RTEMS_BSP_POSTLINK_CMDS"]) - AM_CONDITIONAL([HAVE_BSP_POSTLINK_CMDS], [test ! "$RTEMS_BSP_POSTLINK_CMDS"xx = "xx" ])]dnl -) diff --git a/m4/rtems-isml.m4 b/m4/rtems-isml.m4 deleted file mode 100644 index 1a4f62e..0000000 --- a/m4/rtems-isml.m4 +++ /dev/null @@ -1,11 +0,0 @@ -# Find out if this is a multilibbed RTEMS installation -# -# Result is exit status, i.e., this macro can e.g., be used -# in a 'if MACRO ; then list; fi' statement. -# -# TILLAC_RTEMS_CPUKIT_MULTILIB -AC_DEFUN([TILLAC_RTEMS_CPUKIT_MULTILIB], - [AC_REQUIRE([AC_CANONICAL_HOST]) - AC_REQUIRE([TILLAC_RTEMS_OPTIONS]) - test -d ${with_rtems_top}/${host_cpu}-${host_os}/include]dnl -) diff --git a/m4/rtems-ismultibsp.m4 b/m4/rtems-ismultibsp.m4 deleted file mode 100644 index 63e8805..0000000 --- a/m4/rtems-ismultibsp.m4 +++ /dev/null @@ -1,23 +0,0 @@ -# -# Check if the 'enable_rtemsbsp' variable lists a single -# or multiple BSPs and set exit status accordingly: -# -# Result is exit status, i.e., this macro can e.g., be used -# in a 'if MACRO ; then list; fi' statement. -# -# true - if enable_rtembsp lists more than one BSP -# false - otherwise -# -# if TILLAC_RTEMS_CHECK_MULTI_BSPS ; then list ; fi -AC_DEFUN([TILLAC_RTEMS_CHECK_MULTI_BSPS], - [AC_REQUIRE([TILLAC_RTEMS_CHECK_BSPS]) - ( _tillac_rtems_multi_bsps=no - for _tillac_rtems_bspcand in $enable_rtemsbsp ; do - if test "$_tillac_rtems_multi_bsps" = "no" ; then - _tillac_rtems_multi_bsps=maybe - else - _tillac_rtems_multi_bsps=yes - fi - done - test "$_tillac_rtems_multi_bsps" = "yes")]dnl -) diff --git a/m4/rtems-multilib.m4 b/m4/rtems-multilib.m4 deleted file mode 100644 index 25be9d4..0000000 --- a/m4/rtems-multilib.m4 +++ /dev/null @@ -1,28 +0,0 @@ -# -# Prepare for a multilibbed build -# - check for presence of 'config-ml.in' -# - expand AM_ENABLE_MULTILIB(MAKEFILE, REL-TO-TOP-SRCDIR) -# - expand TILLAM_MULTISUB_INSTALLDIR (workaround so that -# multilibs are installed into proper subdir. -# - make sure 'enable_multilib' is set to 'no' if it was initially -# unset; yet another little workaround... -# -# TILLAC_RTEMS_MULTILIB([MAKEFILE], [REL-TO-TOP-SRCDIR]) -AC_DEFUN([TILLAC_RTEMS_MULTILIB], - [if test -f ${srcdir}/config-ml.in || test -f $(srcdir)/../config-ml.in ; then - AM_ENABLE_MULTILIB([$1],[$2]) - # install multilibs into MULTISUBDIR - TILLAM_MULTISUB_INSTALLDIR -dnl AC_SUBST(libdir,[${libdir}'$(MULTISUBDIR)']) - # in order to properly build multilibs in sub-libraries it seems we - # must pass the --enable-multilibs arg to sub-configures or multilibs - # are not built there. - # To work around, we simply set the default to 'no' so the user must - # say --enable-multilib to get them. - if test ! "${enable_multilib+set}" = "set" ; then - multilib=no - fi - else - enable_multilib=no - fi]dnl -) -- cgit v1.2.3