From 07996ed6131a3a8b675589b0d96c0a9d09fdb084 Mon Sep 17 00:00:00 2001 From: okuji Date: Fri, 18 Feb 2000 08:19:33 +0000 Subject: [PATCH] add some checks into make_saved_active and remove 3c59x.c. --- ChangeLog | 14 + README | 13 +- configure | 180 ++++--- configure.in | 12 +- netboot/3c59x.c | 1172 ------------------------------------------- netboot/Makefile.am | 14 +- stage2/disk_io.c | 31 +- 7 files changed, 151 insertions(+), 1285 deletions(-) delete mode 100644 netboot/3c59x.c diff --git a/ChangeLog b/ChangeLog index 28d1b4850..307cd0052 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,17 @@ +2000-02-18 OKUJI Yoshinori + + * stage2/disk_io.c [!STAGE1_5] (make_saved_active): Make sure + that SAVED_PARTITION is not an extended partition. + If SAVED_DRIVE is not a hard disk drive, set ERRNUM to + ERR_DEV_VALUES and return zero. + + * netboot/3c59x.c: Removed. + * netboot/Makefile.am (EXTRA_libdrivers_a_SOURCES): Deleted + 3c59x.c. + (3c59x_drivers): Deleted. + (3c59x_o_CFLAGS): Likewise. + * configure.in (--enable-3c59x): Likewise. + 2000-02-17 OKUJI Yoshinori * configure.in (--enable-3c90x): Add -DINCLUDE_3C90X=1 instead diff --git a/README b/README index 2b4437dbd..e0f92e993 100644 --- a/README +++ b/README @@ -46,14 +46,23 @@ the CVS: * automake 19990620 or later - The new feature, per-executable flags, is requred, so you need to get + The new feature, per-executable flags, is required, so you need to get an unreleased version from the CVS. See -http://sourceware.cygnus.com/automake/, for more information. +, for more information. Caution: The recent versions are quite unstable, so check out a rather old version from the CVS (1999-10-01 works fine, though it has some non-critical bugs). +* autoconf 20000116 or later + + Some new macros are required, so you need to get an unreleased version +from the CVS. See , for more +information. + +Note: Perhaps a somewhat older CVS version should work well, but I'm not +sure. Using the latest version would be better. + If you are interested in netboot, see the file README.netboot under the directory netboot. diff --git a/configure b/configure index 5fa861f5f..a334689a9 100644 --- a/configure +++ b/configure @@ -43,8 +43,6 @@ ac_arg_enable_help="$ac_arg_enable_help --enable-3c509 enable 3Com509 driver" ac_arg_enable_help="$ac_arg_enable_help --enable-3c529 enable 3Com529 driver" -ac_arg_enable_help="$ac_arg_enable_help - --enable-3c59x enable 3Com59x driver" ac_arg_enable_help="$ac_arg_enable_help --enable-3c90x enable 3Com90x driver" ac_arg_enable_help="$ac_arg_enable_help @@ -679,7 +677,7 @@ ac_configure="$SHELL $ac_aux_dir/configure" # This should be Cygnus configure. # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # ./install, which can be erroneously created by make from ./install.sh. echo $ac_n "checking for a BSD compatible install... $ac_c" 1>&6 -echo "configure:683: checking for a BSD compatible install" 1>&5 +echo "configure:681: checking for a BSD compatible install" 1>&5 if test -z "$INSTALL"; then if test "${ac_cv_path_install+set}" = set; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -736,7 +734,7 @@ test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' echo $ac_n "checking whether build environment is sane... $ac_c" 1>&6 -echo "configure:740: checking whether build environment is sane" 1>&5 +echo "configure:738: checking whether build environment is sane" 1>&5 # Just in case sleep 1 echo timestamp > conftestfile @@ -797,7 +795,7 @@ do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 echo $ac_n "checking for $ac_word... $ac_c" 1>&6 -echo "configure:801: checking for $ac_word" 1>&5 +echo "configure:799: checking for $ac_word" 1>&5 if test "${ac_cv_prog_AWK+set}" = set; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -827,7 +825,7 @@ test -n "$AWK" && break done echo $ac_n "checking whether ${MAKE-make} sets \${MAKE}... $ac_c" 1>&6 -echo "configure:831: checking whether ${MAKE-make} sets \${MAKE}" 1>&5 +echo "configure:829: checking whether ${MAKE-make} sets \${MAKE}" 1>&5 set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y%./+-%__p_%'` if eval "test \"\${ac_cv_prog_make_${ac_make}_set+set}\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -876,7 +874,7 @@ EOF missing_dir=`cd $ac_aux_dir && pwd` echo $ac_n "checking for working aclocal... $ac_c" 1>&6 -echo "configure:880: checking for working aclocal" 1>&5 +echo "configure:878: checking for working aclocal" 1>&5 # Run test in a subshell; some versions of sh will print an error if # an executable is not found, even if stderr is redirected. # Redirect stdin to placate older versions of autoconf. Sigh. @@ -889,7 +887,7 @@ else fi echo $ac_n "checking for working autoconf... $ac_c" 1>&6 -echo "configure:893: checking for working autoconf" 1>&5 +echo "configure:891: checking for working autoconf" 1>&5 # Run test in a subshell; some versions of sh will print an error if # an executable is not found, even if stderr is redirected. # Redirect stdin to placate older versions of autoconf. Sigh. @@ -902,7 +900,7 @@ else fi echo $ac_n "checking for working automake... $ac_c" 1>&6 -echo "configure:906: checking for working automake" 1>&5 +echo "configure:904: checking for working automake" 1>&5 # Run test in a subshell; some versions of sh will print an error if # an executable is not found, even if stderr is redirected. # Redirect stdin to placate older versions of autoconf. Sigh. @@ -915,7 +913,7 @@ else fi echo $ac_n "checking for working autoheader... $ac_c" 1>&6 -echo "configure:919: checking for working autoheader" 1>&5 +echo "configure:917: checking for working autoheader" 1>&5 # Run test in a subshell; some versions of sh will print an error if # an executable is not found, even if stderr is redirected. # Redirect stdin to placate older versions of autoconf. Sigh. @@ -928,7 +926,7 @@ else fi echo $ac_n "checking for working makeinfo... $ac_c" 1>&6 -echo "configure:932: checking for working makeinfo" 1>&5 +echo "configure:930: checking for working makeinfo" 1>&5 # Run test in a subshell; some versions of sh will print an error if # an executable is not found, even if stderr is redirected. # Redirect stdin to placate older versions of autoconf. Sigh. @@ -948,7 +946,7 @@ do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 echo $ac_n "checking for $ac_word... $ac_c" 1>&6 -echo "configure:952: checking for $ac_word" 1>&5 +echo "configure:950: checking for $ac_word" 1>&5 if test "${ac_cv_prog_AMTAR+set}" = set; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -992,7 +990,7 @@ fi echo $ac_n "checking host system type... $ac_c" 1>&6 -echo "configure:996: checking host system type" 1>&5 +echo "configure:994: checking host system type" 1>&5 if test "x$ac_cv_host" = "x" || (test "x$host" != "xNONE" && test "x$host" != "x$ac_cv_host_alias"); then # Make sure we can run config.sub. @@ -1045,7 +1043,7 @@ esac # echo $ac_n "checking whether to enable maintainer-specific portions of Makefiles... $ac_c" 1>&6 -echo "configure:1049: checking whether to enable maintainer-specific portions of Makefiles" 1>&5 +echo "configure:1047: checking whether to enable maintainer-specific portions of Makefiles" 1>&5 # Check whether --enable-maintainer-mode or --disable-maintainer-mode was given. if test "${enable_maintainer_mode+set}" = set; then enableval="$enable_maintainer_mode" @@ -1071,7 +1069,7 @@ if test "x$enable_maintainer_mode" = xyes; then # Extract the first word of "perl", so it can be a program name with args. set dummy perl; ac_word=$2 echo $ac_n "checking for $ac_word... $ac_c" 1>&6 -echo "configure:1075: checking for $ac_word" 1>&5 +echo "configure:1073: checking for $ac_word" 1>&5 if test "${ac_cv_path_PERL+set}" = set; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1116,7 +1114,7 @@ fi echo $ac_n "checking build system type... $ac_c" 1>&6 -echo "configure:1120: checking build system type" 1>&5 +echo "configure:1118: checking build system type" 1>&5 if test "x$ac_cv_build" = "x" || (test "x$build" != "xNONE" && test "x$build" != "x$ac_cv_build_alias"); then # Make sure we can run config.sub. @@ -1163,7 +1161,7 @@ fi # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 echo $ac_n "checking for $ac_word... $ac_c" 1>&6 -echo "configure:1167: checking for $ac_word" 1>&5 +echo "configure:1165: checking for $ac_word" 1>&5 if test "${ac_cv_prog_CC+set}" = set; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1200,7 +1198,7 @@ esac # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 echo $ac_n "checking for $ac_word... $ac_c" 1>&6 -echo "configure:1204: checking for $ac_word" 1>&5 +echo "configure:1202: checking for $ac_word" 1>&5 if test "${ac_cv_prog_CC+set}" = set; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1230,7 +1228,7 @@ fi # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 echo $ac_n "checking for $ac_word... $ac_c" 1>&6 -echo "configure:1234: checking for $ac_word" 1>&5 +echo "configure:1232: checking for $ac_word" 1>&5 if test "${ac_cv_prog_CC+set}" = set; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1281,7 +1279,7 @@ do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 echo $ac_n "checking for $ac_word... $ac_c" 1>&6 -echo "configure:1285: checking for $ac_word" 1>&5 +echo "configure:1283: checking for $ac_word" 1>&5 if test "${ac_cv_prog_CC+set}" = set; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1317,7 +1315,7 @@ done test -z "$CC" && { echo "configure: error: no acceptable cc found in \$PATH" 1>&2; exit 1; } echo $ac_n "checking whether the C compiler ($CC $CFLAGS $CPPFLAGS $LDFLAGS) works... $ac_c" 1>&6 -echo "configure:1321: checking whether the C compiler ($CC $CFLAGS $CPPFLAGS $LDFLAGS) works" 1>&5 +echo "configure:1319: checking whether the C compiler ($CC $CFLAGS $CPPFLAGS $LDFLAGS) works" 1>&5 ac_ext=c # CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. @@ -1328,12 +1326,12 @@ cross_compiling=$ac_cv_prog_cc_cross cat >conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:1335: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then ac_cv_prog_cc_works=yes # If we can't run a trivial program, we are probably using a cross compiler. if (./conftest; exit) 2>/dev/null; then @@ -1359,12 +1357,12 @@ if test $ac_cv_prog_cc_works = no; then { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; } fi echo $ac_n "checking whether the C compiler ($CC $CFLAGS $CPPFLAGS $LDFLAGS) is a cross-compiler... $ac_c" 1>&6 -echo "configure:1363: checking whether the C compiler ($CC $CFLAGS $CPPFLAGS $LDFLAGS) is a cross-compiler" 1>&5 +echo "configure:1361: checking whether the C compiler ($CC $CFLAGS $CPPFLAGS $LDFLAGS) is a cross-compiler" 1>&5 echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6 cross_compiling=$ac_cv_prog_cc_cross echo $ac_n "checking whether we are using GNU C... $ac_c" 1>&6 -echo "configure:1368: checking whether we are using GNU C" 1>&5 +echo "configure:1366: checking whether we are using GNU C" 1>&5 if test "${ac_cv_prog_gcc+set}" = set; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1373,7 +1371,7 @@ else yes; #endif EOF -if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:1377: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then +if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:1375: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then ac_cv_prog_gcc=yes else ac_cv_prog_gcc=no @@ -1391,7 +1389,7 @@ ac_test_CFLAGS="${CFLAGS+set}" ac_save_CFLAGS="$CFLAGS" CFLAGS= echo $ac_n "checking whether ${CC-cc} accepts -g... $ac_c" 1>&6 -echo "configure:1395: checking whether ${CC-cc} accepts -g" 1>&5 +echo "configure:1393: checking whether ${CC-cc} accepts -g" 1>&5 if test "${ac_cv_prog_cc_g+set}" = set; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1433,7 +1431,7 @@ if test "x$with_binutils" != x; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 echo $ac_n "checking for $ac_word... $ac_c" 1>&6 -echo "configure:1437: checking for $ac_word" 1>&5 +echo "configure:1435: checking for $ac_word" 1>&5 if test "${ac_cv_path_RANLIB+set}" = set; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1469,7 +1467,7 @@ if test -z "$ac_cv_prog_RANLIB"; then # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 echo $ac_n "checking for $ac_word... $ac_c" 1>&6 -echo "configure:1473: checking for $ac_word" 1>&5 +echo "configure:1471: checking for $ac_word" 1>&5 if test "${ac_cv_path_RANLIB+set}" = set; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1508,7 +1506,7 @@ else # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 echo $ac_n "checking for $ac_word... $ac_c" 1>&6 -echo "configure:1512: checking for $ac_word" 1>&5 +echo "configure:1510: checking for $ac_word" 1>&5 if test "${ac_cv_prog_RANLIB+set}" = set; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1548,7 +1546,7 @@ if test "x$ac_cv_prog_gcc" = xyes; then STAGE1_CFLAGS="-O2" GRUB_CFLAGS="-O2" echo $ac_n "checking whether optimization for size works... $ac_c" 1>&6 -echo "configure:1552: checking whether optimization for size works" 1>&5 +echo "configure:1550: checking whether optimization for size works" 1>&5 if test "${size_flag+set}" = set; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1556,14 +1554,14 @@ else saved_CFLAGS=$CFLAGS CFLAGS="-Os -g" cat >conftest.$ac_ext <&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:1565: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* size_flag=yes else @@ -1596,7 +1594,7 @@ if test "x$with_binutils" != x; then # Extract the first word of "${ac_tool_prefix}objcopy", so it can be a program name with args. set dummy ${ac_tool_prefix}objcopy; ac_word=$2 echo $ac_n "checking for $ac_word... $ac_c" 1>&6 -echo "configure:1600: checking for $ac_word" 1>&5 +echo "configure:1598: checking for $ac_word" 1>&5 if test "${ac_cv_path_OBJCOPY+set}" = set; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1632,7 +1630,7 @@ else # Extract the first word of "${ac_tool_prefix}objcopy", so it can be a program name with args. set dummy ${ac_tool_prefix}objcopy; ac_word=$2 echo $ac_n "checking for $ac_word... $ac_c" 1>&6 -echo "configure:1636: checking for $ac_word" 1>&5 +echo "configure:1634: checking for $ac_word" 1>&5 if test "${ac_cv_prog_OBJCOPY+set}" = set; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1666,7 +1664,7 @@ fi # Defined in acinclude.m4. echo $ac_n "checking if C symbols get an underscore after compilation... $ac_c" 1>&6 -echo "configure:1670: checking if C symbols get an underscore after compilation" 1>&5 +echo "configure:1668: checking if C symbols get an underscore after compilation" 1>&5 if test "${grub_cv_asm_uscore+set}" = set; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1679,7 +1677,7 @@ func (int *list) } EOF -if { ac_try='${CC-cc} ${CFLAGS} -S conftest.c'; { (eval echo configure:1683: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } && test -s conftest.s; then +if { ac_try='${CC-cc} ${CFLAGS} -S conftest.c'; { (eval echo configure:1681: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } && test -s conftest.s; then true else { echo "configure: error: ${CC-cc} failed to produce assembly code" 1>&2; exit 1; } @@ -1705,7 +1703,7 @@ fi echo "$ac_t""$grub_cv_asm_uscore" 1>&6 echo $ac_n "checking whether ${OBJCOPY} works for absolute addresses... $ac_c" 1>&6 -echo "configure:1709: checking whether ${OBJCOPY} works for absolute addresses" 1>&5 +echo "configure:1707: checking whether ${OBJCOPY} works for absolute addresses" 1>&5 if test "${grub_cv_prog_objcopy_absolute+set}" = set; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1717,21 +1715,21 @@ cmain (void) } EOF -if { (eval echo configure:1721: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; } && test -s conftest.o; then : +if { (eval echo configure:1719: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; } && test -s conftest.o; then : else { echo "configure: error: ${CC-cc} cannot compile C source code" 1>&2; exit 1; } fi grub_cv_prog_objcopy_absolute=yes for link_addr in 2000 8000 7C00; do - if { ac_try='${CC-cc} ${CFLAGS} -nostdlib -Wl,-N -Wl,-Ttext -Wl,$link_addr conftest.o -o conftest.exec'; { (eval echo configure:1727: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; then : + if { ac_try='${CC-cc} ${CFLAGS} -nostdlib -Wl,-N -Wl,-Ttext -Wl,$link_addr conftest.o -o conftest.exec'; { (eval echo configure:1725: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; then : else { echo "configure: error: ${CC-cc} cannot link at address $link_addr" 1>&2; exit 1; } fi - if { ac_try='${OBJCOPY-objcopy} -O binary conftest.exec conftest'; { (eval echo configure:1731: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; then : + if { ac_try='${OBJCOPY-objcopy} -O binary conftest.exec conftest'; { (eval echo configure:1729: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; then : else { echo "configure: error: ${OBJCOPY-objcopy} cannot create binary files" 1>&2; exit 1; } fi - if test ! -f conftest.old || { ac_try='cmp -s conftest.old conftest'; { (eval echo configure:1735: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; then + if test ! -f conftest.old || { ac_try='cmp -s conftest.old conftest'; { (eval echo configure:1733: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; then mv -f conftest conftest.old else grub_cv_prog_objcopy_absolute=no @@ -1748,7 +1746,7 @@ fi echo $ac_n "checking whether addr32 must be in the same line as the instruction... $ac_c" 1>&6 -echo "configure:1752: checking whether addr32 must be in the same line as the instruction" 1>&5 +echo "configure:1750: checking whether addr32 must be in the same line as the instruction" 1>&5 if test "${grub_cv_asm_prefix_requirement+set}" = set; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1757,7 +1755,7 @@ else l1: addr32 movb %al, l1 EOF -if { ac_try='${CC-cc} ${CFLAGS} -c conftest.s'; { (eval echo configure:1761: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } && test -s conftest.o; then +if { ac_try='${CC-cc} ${CFLAGS} -c conftest.s'; { (eval echo configure:1759: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } && test -s conftest.o; then grub_cv_asm_prefix_requirement=yes else grub_cv_asm_prefix_requirement=no @@ -1789,7 +1787,7 @@ echo "$ac_t""$grub_cv_asm_prefix_requirement" 1>&6 echo $ac_n "checking for .code16 addr32 assembler support... $ac_c" 1>&6 -echo "configure:1793: checking for .code16 addr32 assembler support" 1>&5 +echo "configure:1791: checking for .code16 addr32 assembler support" 1>&5 if test "${grub_cv_asm_addr32+set}" = set; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1804,7 +1802,7 @@ else sed -e s/@ADDR32@/addr32\;/ < conftest.s.in > conftest.s fi -if { ac_try='${CC-cc} ${CFLAGS} -c conftest.s'; { (eval echo configure:1808: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } && test -s conftest.o; then +if { ac_try='${CC-cc} ${CFLAGS} -c conftest.s'; { (eval echo configure:1806: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } && test -s conftest.o; then grub_cv_asm_addr32=yes else grub_cv_asm_addr32=no @@ -1821,19 +1819,19 @@ fi echo $ac_n "checking if start is defined by the compiler... $ac_c" 1>&6 -echo "configure:1825: checking if start is defined by the compiler" 1>&5 +echo "configure:1823: checking if start is defined by the compiler" 1>&5 if test "${grub_cv_check_start_symbol+set}" = set; then echo $ac_n "(cached) $ac_c" 1>&6 else cat >conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:1835: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* grub_cv_check_start_symbol=yes else @@ -1857,19 +1855,19 @@ echo "$ac_t""$grub_cv_check_start_symbol" 1>&6 echo $ac_n "checking if _start is defined by the compiler... $ac_c" 1>&6 -echo "configure:1861: checking if _start is defined by the compiler" 1>&5 +echo "configure:1859: checking if _start is defined by the compiler" 1>&5 if test "${grub_cv_check_uscore_start_symbol+set}" = set; then echo $ac_n "(cached) $ac_c" 1>&6 else cat >conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:1871: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* grub_cv_check_uscore_start_symbol=yes else @@ -1898,19 +1896,19 @@ fi echo $ac_n "checking if __bss_start is defined by the compiler... $ac_c" 1>&6 -echo "configure:1902: checking if __bss_start is defined by the compiler" 1>&5 +echo "configure:1900: checking if __bss_start is defined by the compiler" 1>&5 if test "${grub_cv_check_uscore_uscore_bss_start_symbol+set}" = set; then echo $ac_n "(cached) $ac_c" 1>&6 else cat >conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:1912: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* grub_cv_check_uscore_uscore_bss_start_symbol=yes else @@ -1934,19 +1932,19 @@ echo "$ac_t""$grub_cv_check_uscore_uscore_bss_start_symbol" 1>&6 echo $ac_n "checking if _edata is defined by the compiler... $ac_c" 1>&6 -echo "configure:1938: checking if _edata is defined by the compiler" 1>&5 +echo "configure:1936: checking if _edata is defined by the compiler" 1>&5 if test "${grub_cv_check_uscore_edata_symbol+set}" = set; then echo $ac_n "(cached) $ac_c" 1>&6 else cat >conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:1948: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* grub_cv_check_uscore_edata_symbol=yes else @@ -1970,19 +1968,19 @@ echo "$ac_t""$grub_cv_check_uscore_edata_symbol" 1>&6 echo $ac_n "checking if edata is defined by the compiler... $ac_c" 1>&6 -echo "configure:1974: checking if edata is defined by the compiler" 1>&5 +echo "configure:1972: checking if edata is defined by the compiler" 1>&5 if test "${grub_cv_check_edata_symbol+set}" = set; then echo $ac_n "(cached) $ac_c" 1>&6 else cat >conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:1984: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* grub_cv_check_edata_symbol=yes else @@ -2012,19 +2010,19 @@ fi echo $ac_n "checking if end is defined by the compiler... $ac_c" 1>&6 -echo "configure:2016: checking if end is defined by the compiler" 1>&5 +echo "configure:2014: checking if end is defined by the compiler" 1>&5 if test "${grub_cv_check_end_symbol+set}" = set; then echo $ac_n "(cached) $ac_c" 1>&6 else cat >conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:2026: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* grub_cv_check_end_symbol=yes else @@ -2048,19 +2046,19 @@ echo "$ac_t""$grub_cv_check_end_symbol" 1>&6 echo $ac_n "checking if _end is defined by the compiler... $ac_c" 1>&6 -echo "configure:2052: checking if _end is defined by the compiler" 1>&5 +echo "configure:2050: checking if _end is defined by the compiler" 1>&5 if test "${grub_cv_check_uscore_end_symbol+set}" = set; then echo $ac_n "(cached) $ac_c" 1>&6 else cat >conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:2062: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* grub_cv_check_uscore_end_symbol=yes else @@ -2098,14 +2096,14 @@ fi # Get the filename or the whole disk and open it. # Known to work on NetBSD. echo $ac_n "checking for opendisk in -lutil... $ac_c" 1>&6 -echo "configure:2102: checking for opendisk in -lutil" 1>&5 +echo "configure:2100: checking for opendisk in -lutil" 1>&5 if test "${ac_cv_lib_util_opendisk+set}" = set; then echo $ac_n "(cached) $ac_c" 1>&6 else ac_save_LIBS="$LIBS" LIBS="-lutil $LIBS" cat >conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:2118: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* ac_cv_lib_util_opendisk=yes else @@ -2141,14 +2139,14 @@ fi # Unless the user specify --without-curses, check for curses. if test "x$with_curses" != "xno"; then echo $ac_n "checking for wgetch in -lncurses... $ac_c" 1>&6 -echo "configure:2145: checking for wgetch in -lncurses" 1>&5 +echo "configure:2143: checking for wgetch in -lncurses" 1>&5 if test "${ac_cv_lib_ncurses_wgetch+set}" = set; then echo $ac_n "(cached) $ac_c" 1>&6 else ac_save_LIBS="$LIBS" LIBS="-lncurses $LIBS" cat >conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:2161: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* ac_cv_lib_ncurses_wgetch=yes else @@ -2180,14 +2178,14 @@ EOF else echo $ac_n "checking for wgetch in -lcurses... $ac_c" 1>&6 -echo "configure:2184: checking for wgetch in -lcurses" 1>&5 +echo "configure:2182: checking for wgetch in -lcurses" 1>&5 if test "${ac_cv_lib_curses_wgetch+set}" = set; then echo $ac_n "(cached) $ac_c" 1>&6 else ac_save_LIBS="$LIBS" LIBS="-lcurses $LIBS" cat >conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:2200: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* ac_cv_lib_curses_wgetch=yes else @@ -2227,7 +2225,7 @@ fi # Check for headers. echo $ac_n "checking how to run the C preprocessor... $ac_c" 1>&6 -echo "configure:2231: checking how to run the C preprocessor" 1>&5 +echo "configure:2229: checking how to run the C preprocessor" 1>&5 # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= @@ -2242,13 +2240,13 @@ else # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. cat >conftest.$ac_ext < Syntax Error EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:2252: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:2250: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then : @@ -2259,13 +2257,13 @@ else rm -rf conftest* CPP="${CC-cc} -E -traditional-cpp" cat >conftest.$ac_ext < Syntax Error EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:2269: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:2267: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then : @@ -2276,13 +2274,13 @@ else rm -rf conftest* CPP="${CC-cc} -nologo -E" cat >conftest.$ac_ext < Syntax Error EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:2286: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:2284: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then : @@ -2310,17 +2308,17 @@ for ac_header in string.h strings.h ncurses/curses.h ncurses.h curses.h do ac_ac_Header=`echo "ac_cv_header_$ac_header" | $ac_tr_sh` echo $ac_n "checking for $ac_header... $ac_c" 1>&6 -echo "configure:2314: checking for $ac_header" 1>&5 +echo "configure:2312: checking for $ac_header" 1>&5 if eval "test \"\${$ac_ac_Header+set}\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat >conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:2324: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:2322: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* @@ -2461,16 +2459,6 @@ if test "x$enable_3c529" = xyes; then NETBOOT_DRIVERS="$NETBOOT_DRIVERS 3c529.o" fi -# Check whether --enable-3c59x or --disable-3c59x was given. -if test "${enable_3c59x+set}" = set; then - enableval="$enable_3c59x" - : -fi - -if test "x$enable_3c59x" = xyes; then - NET_CFLAGS="$NET_CFLAGS -DINCLUDE_3C59x=1" - NETBOOT_DRIVERS="$NETBOOT_DRIVERS 3c59x.o" -fi # Check whether --enable-3c90x or --disable-3c90x was given. if test "${enable_3c90x+set}" = set; then diff --git a/configure.in b/configure.in index 72aa14e91..b43c6bb28 100644 --- a/configure.in +++ b/configure.in @@ -244,12 +244,12 @@ if test "x$enable_3c529" = xyes; then NETBOOT_DRIVERS="$NETBOOT_DRIVERS 3c529.o" fi -AC_ARG_ENABLE(3c59x, - [ --enable-3c59x enable 3Com59x driver]) -if test "x$enable_3c59x" = xyes; then - NET_CFLAGS="$NET_CFLAGS -DINCLUDE_3C59x=1" - NETBOOT_DRIVERS="$NETBOOT_DRIVERS 3c59x.o" -fi +dnl AC_ARG_ENABLE(3c59x, +dnl [ --enable-3c59x enable 3Com59x driver]) +dnl if test "x$enable_3c59x" = xyes; then +dnl NET_CFLAGS="$NET_CFLAGS -DINCLUDE_3C59x=1" +dnl NETBOOT_DRIVERS="$NETBOOT_DRIVERS 3c59x.o" +dnl fi AC_ARG_ENABLE(3c90x, [ --enable-3c90x enable 3Com90x driver]) diff --git a/netboot/3c59x.c b/netboot/3c59x.c deleted file mode 100644 index 04db2416a..000000000 --- a/netboot/3c59x.c +++ /dev/null @@ -1,1172 +0,0 @@ -/* 3c59x.c: A 3Com 3c59x/3c90x "Vortex/Boomerang" ethernet driver for linux. */ -/* - Written 1995 by Donald Becker. - - This software may be used and distributed according to the terms - of the GNU Public License, incorporated herein by reference. - - This driver is for the 3Com "Vortex" series ethercards. Members of - the series include the 3c590 PCI EtherLink III and 3c595-Tx PCI Fast - EtherLink. - - The author may be reached as becker@CESDIS.gsfc.nasa.gov, or C/O - Center of Excellence in Space Data and Information Sciences - Code 930.5, Goddard Space Flight Center, Greenbelt MD 20771 -*/ - -#ifdef INCLUDE_3C59X - - -#define lx_outb(a,b) outb(b,a) -#define lx_outw(a,b) outw(b,a) -#define lx_outl(a,b) outl(b,a) - - -static int __jiffies__; - -#define jiffies ((__jiffies__+=1000)) - -void cli () -{ - __asm__ __volatile__("cli"); -} -#define HZ 1 - -void memset (char *add, int v, int s) -{ - while (s--) - *add++ = (char )v; -} - -static char *version = "3c59x.c:v0.30-all 12/23/96 becker@cesdis.gsfc.nasa.gov\n"; - -/* "Knobs" that turn on special features. */ -/* Enable the automatic media selection code. */ -#define AUTOMEDIA 1 - -/* Allow the use of bus master transfers instead of programmed-I/O for the - Tx process. Bus master transfers are always disabled by default, but - iff this is set they may be turned on using 'options'. */ - -#define NO_VORTEX_BUS_MASTER - - -#include "etherboot.h" -#include "nic.h" -#include "3c509.h" -#include "pci.h" - -#include "if.h" - -#include "netdevice.h" - -struct device card; - -/* "Knobs" for adjusting internal parameters. */ -/* Put out somewhat more debugging messages. (0 - no msg, 1 minimal msgs). */ -#define VORTEX_DEBUG 2 - -/* Number of times to check to see if the Tx FIFO has space, used in some - limited cases. */ -#define WAIT_TX_AVAIL 200 - -/* Operational parameter that usually are not changed. */ -/* Time in jiffies before concluding Tx hung */ -#define TX_TIMEOUT ((400*HZ)/1000) - -/* The total size is twice that of the original EtherLinkIII series: the - runtime register window, window 1, is now always mapped in. */ -#define VORTEX_TOTAL_SIZE 0x20 - -#ifdef HAVE_DEVLIST -struct netdev_entry tc59x_drv = -{"Vortex", vortex_pci_probe, VORTEX_TOTAL_SIZE, NULL}; -#endif - -#ifdef VORTEX_DEBUG -int vortex_debug = VORTEX_DEBUG; -#else -int vortex_debug = 1; -#endif - -/* Caution! These entries must be consistent, with the EISA ones last. */ -static int product_ids[] = {0x5900, 0x5950, 0x5951, 0x5952, 0x9000, - 0x9001, 0x9050, 0x9051, 0, 0}; -static const char *product_names[] = { - "3c590 Vortex 10Mbps", - "3c595 Vortex 100baseTX", - "3c595 Vortex 100baseT4", - "3c595 Vortex 100base-MII", - "3c900 Boomerang 10baseT", - "3c900 Boomerang 10Mbps/Combo", - "3c905 Boomerang 100baseTx", - "3c905 Boomerang 100baseT4", - "3c592 EISA 10mbps Demon/Vortex", - "3c597 EISA Fast Demon/Vortex", -}; -#define DEMON10_INDEX 8 -#define DEMON100_INDEX 9 - -/* - Theory of Operation - -I. Board Compatibility - -This device driver is designed for the 3Com FastEtherLink, 3Com's PCI to -10/100baseT adapter. It also works with the 3c590, a similar product -with only a 10Mbs interface. - -II. Board-specific settings - -PCI bus devices are configured by the system at boot time, so no jumpers -need to be set on the board. The system BIOS should be set to assign the -PCI INTA signal to an otherwise unused system IRQ line. While it's -physically possible to shared PCI interrupt lines, the 1.2.0 kernel doesn't -support it. - -III. Driver operation - -The 3c59x series use an interface that's very similar to the previous 3c5x9 -series. The primary interface is two programmed-I/O FIFOs, with an -alternate single-contiguous-region bus-master transfer (see next). - -One extension that is advertised in a very large font is that the adapters -are capable of being bus masters. Unfortunately this capability is only for -a single contiguous region making it less useful than the list of transfer -regions available with the DEC Tulip or AMD PCnet. Given the significant -performance impact of taking an extra interrupt for each transfer, using -DMA transfers is a win only with large blocks. - -IIIC. Synchronization -The driver runs as two independent, single-threaded flows of control. One -is the send-packet routine, which enforces single-threaded use by the -dev->tbusy flag. The other thread is the interrupt handler, which is single -threaded by the hardware and other software. - -IV. Notes - -Thanks to Cameron Spitzer and Terry Murphy of 3Com for providing both -3c590 and 3c595 boards. -The name "Vortex" is the internal 3Com project name for the PCI ASIC, and -the EISA version is called "Demon". According to Terry these names come -from rides at the local amusement park. - -The new chips support both ethernet (1.5K) and FDDI (4.5K) packet sizes! -This driver only supports ethernet packets because of the skbuff allocation -limit of 4K. -*/ - -#define TCOM_VENDOR_ID 0x10B7 /* 3Com's manufacturer's ID. */ - -/* Operational definitions. - These are not used by other compilation units and thus are not - exported in a ".h" file. - - First the windows. There are eight register windows, with the command - and status registers available in each. - */ -#define EL3WINDOW(win_num) lx_outw(SelectWindow + (win_num), ioaddr + EL3_CMD) -#define EL3_CMD 0x0e -#define EL3_STATUS 0x0e - -/* The top five bits written to EL3_CMD are a command, the lower - 11 bits are the parameter, if applicable. - Note that 11 parameters bits was fine for ethernet, but the new chip - can handle FDDI length frames (~4500 octets) and now parameters count - 32-bit 'Dwords' rather than octets. */ - -enum vortex_cmd { - TotalReset = 0<<11, SelectWindow = 1<<11, StartCoax = 2<<11, - RxDisable = 3<<11, RxEnable = 4<<11, RxReset = 5<<11, RxDiscard = 8<<11, - TxEnable = 9<<11, TxDisable = 10<<11, TxReset = 11<<11, - FakeIntr = 12<<11, AckIntr = 13<<11, SetIntrEnb = 14<<11, - SetStatusEnb = 15<<11, SetRxFilter = 16<<11, SetRxThreshold = 17<<11, - SetTxThreshold = 18<<11, SetTxStart = 19<<11, - StartDMAUp = 20<<11, StartDMADown = (20<<11)+1, StatsEnable = 21<<11, - StatsDisable = 22<<11, StopCoax = 23<<11,}; - -/* The SetRxFilter command accepts the following classes: */ -enum RxFilter { - RxStation = 1, RxMulticast = 2, RxBroadcast = 4, RxProm = 8 }; - -/* Bits in the general status register. */ -enum vortex_status { - IntLatch = 0x0001, AdapterFailure = 0x0002, TxComplete = 0x0004, - TxAvailable = 0x0008, RxComplete = 0x0010, RxEarly = 0x0020, - IntReq = 0x0040, StatsFull = 0x0080, DMADone = 1<<8, - DMAInProgress = 1<<11, /* DMA controller is still busy.*/ - CmdInProgress = 1<<12, /* EL3_CMD is still busy.*/ -}; - -/* Register window 1 offsets, the window used in normal operation. - On the Vortex this window is always mapped at offsets 0x10-0x1f. */ -enum Window1 { - TX_FIFO = 0x10, RX_FIFO = 0x10, RxErrors = 0x14, - RxStatus = 0x18, Timer=0x1A, TxStatus = 0x1B, - TxFree = 0x1C, /* Remaining free bytes in Tx buffer. */ -}; -enum Window0 { - Wn0EepromCmd = 10, /* Window 0: EEPROM command register. */ - Wn0EepromData = 12, /* Window 0: EEPROM results register. */ -}; -enum Win0_EEPROM_bits { - EEPROM_Read = 0x80, EEPROM_WRITE = 0x40, EEPROM_ERASE = 0xC0, - EEPROM_EWENB = 0x30, /* Enable erasing/writing for 10 msec. */ - EEPROM_EWDIS = 0x00, /* Disable EWENB before 10 msec timeout. */ -}; -/* EEPROM locations. */ -enum eeprom_offset { - PhysAddr01=0, PhysAddr23=1, PhysAddr45=2, ModelID=3, - EtherLink3ID=7, IFXcvrIO=8, IRQLine=9, - NodeAddr01=10, NodeAddr23=11, NodeAddr45=12, - DriverTune=13, Checksum=15}; - -enum Window3 { /* Window 3: MAC/config bits. */ - Wn3_Config=0, Wn3_MAC_Ctrl=6, Wn3_Options=8, -}; -union wn3_config { - int i; - struct w3_config_fields { - unsigned int ram_size:3, ram_width:1, ram_speed:2, rom_size:2; - int pad8:8; - unsigned int ram_split:2, pad18:2, xcvr:3, pad21:1, autoselect:1; - int pad24:7; - } u; -}; - -enum Window4 { - Wn4_Media = 0x0A, /* Window 4: Various transcvr/media bits. */ -}; -enum Win4_Media_bits { - Media_SQE = 0x0008, /* Enable SQE error counting for AUI. */ - Media_10TP = 0x00C0, /* Enable link beat and jabber for 10baseT. */ - Media_Lnk = 0x0080, /* Enable just link beat for 100TX/100FX. */ - Media_LnkBeat = 0x0800, -}; -enum Window7 { /* Window 7: Bus Master control. */ - Wn7_MasterAddr = 0, Wn7_MasterLen = 6, Wn7_MasterStatus = 12, -}; - -struct vortex_private { - char devname[8]; /* "ethN" string, also for kernel debug. */ - const char *product_name; - int options; /* User-settable misc. driver options. */ - int last_rx_packets; /* For media autoselection. */ - unsigned int available_media:8, /* From Wn3_Options */ - media_override:3, /* Passed-in media type. */ - default_media:3, /* Read from the EEPROM. */ - full_duplex:1, bus_master:1, autoselect:1; -}; - -/* The action to take with a media selection timer tick. - Note that we deviate from the 3Com order by checking 10base2 before AUI. - */ -static struct media_table { - char *name; - unsigned int media_bits:16, /* Bits to set in Wn4_Media register. */ - mask:8, /* The transceiver-present bit in Wn3_Config.*/ - next:8; /* The media type to try next. */ - short wait; /* Time before we check media status. */ -} media_tbl[] = { - { "10baseT", Media_10TP,0x08, 3 /* 10baseT->10base2 */, (14*HZ)/10}, - { "10Mbs AUI", Media_SQE, 0x20, 8 /* AUI->default */, (1*HZ)/10}, - { "undefined", 0, 0x80, 0 /* Undefined */, 0}, - { "10base2", 0, 0x10, 1 /* 10base2->AUI. */, (1*HZ)/10}, - { "100baseTX", Media_Lnk, 0x02, 5 /* 100baseTX->100baseFX */, (14*HZ)/10}, - { "100baseFX", Media_Lnk, 0x04, 6 /* 100baseFX->MII */, (14*HZ)/10}, - { "MII", 0, 0x40, 0 /* MII->10baseT */, (14*HZ)/10}, - { "undefined", 0, 0x01, 0 /* Undefined/100baseT4 */, 0}, - { "Default", 0, 0xFF, 0 /* Use default */, 0}, -}; - -static int vortex_scan(struct device *dev); -static int vortex_found_device(struct device *dev, int ioaddr, int irq, - int product_index, int options); -static int vortex_probe1(struct device *dev); -static int vortex_open(struct device *dev); -static void vortex_timer(unsigned long arg); -static int vortex_start_xmit(struct device *dev,char *data, int len); -static int vortex_rx(struct device *dev, char *data, int len); - -static int vortex_close(struct device *dev); -static void update_stats(int addr, struct device *dev); -static struct enet_statistics *vortex_get_stats(struct device *dev); -static void set_rx_mode(struct device *dev); -#ifndef NEW_MULTICAST -static void set_multicast_list(struct device *dev, int num_addrs, void *addrs); -#endif - - -/* Unlike the other PCI cards the 59x cards don't need a large contiguous - memory region, so making the driver a loadable module is feasible. - - Unfortunately maximizing the shared code between the integrated and - module version of the driver results in a complicated set of initialization - procedures. - init_module() -- modules / tc59x_init() -- built-in - The wrappers for vortex_scan() - vortex_scan() The common routine that scans for PCI and EISA cards - vortex_found_device() Allocate a device structure when we find a card. - Different versions exist for modules and built-in. - vortex_probe1() Fill in the device structure -- this is separated - so that the modules code can put it in dev->init. -*/ -/* This driver uses 'options' to pass the media type, full-duplex flag, etc. */ -/* Note: this is the only limit on the number of cards supported!! */ -static int options[8] = { -1, -1, -1, -1, -1, -1, -1, -1,}; -/* Variables to work-around the Compaq PCI BIOS32 problem. */ -static int compaq_ioaddr = 0, compaq_irq = 0, compaq_prod_id = 0; - -int tc59x_probe(struct device *dev) -{ - int cards_found = 0; - - cards_found = vortex_scan(dev); - - if (vortex_debug > 0 && cards_found) - printf(version); - - return cards_found ? 0 : -1; -} - -static int vortex_scan(struct device *dev) -{ - int cards_found = 0; - -#ifndef NO_PCI -/* if (pcibios_present()) { */ - if (1) { - static int pci_index = 0; - static int board_index = 0; - for (; product_ids[board_index]; board_index++, pci_index = 0) { - for (; pci_index < 16; pci_index++) { - unsigned char pci_bus, pci_device_fn, pci_irq_line; - unsigned char pci_latency; - unsigned int pci_ioaddr; - unsigned short pci_command; - - struct pci_device pcidev; - - eth_pci_init (&pcidev, &pci_ioaddr); - /* Remove I/O space marker in bit 0. */ - -#ifdef VORTEX_BUS_MASTER - /* Get and check the bus-master and latency values. - Some PCI BIOSes fail to set the master-enable bit, and - the latency timer must be set to the maximum value to avoid - data corruption that occurs when the timer expires during - a transfer. Yes, it's a bug. */ - pcibios_read_config_word(pci_bus, pci_device_fn, - PCI_COMMAND, &pci_command); - if ( ! (pci_command & PCI_COMMAND_MASTER)) { - printf(" PCI Master Bit has not been set! Setting...\n"); - pci_command |= PCI_COMMAND_MASTER; - pcibios_write_config_word(pci_bus, pci_device_fn, - PCI_COMMAND, pci_command); - } - pcibios_read_config_byte(pci_bus, pci_device_fn, - PCI_LATENCY_TIMER, &pci_latency); - if (pci_latency != 255) { - printf(" 3Com EtherLink III: Overriding PCI latency" - " timer (CFLT) setting of %d, new value is 255.\n", - pci_latency); - pcibios_write_config_byte(pci_bus, pci_device_fn, - PCI_LATENCY_TIMER, 255); - } -#endif /* VORTEX_BUS_MASTER */ - vortex_found_device(dev, pci_ioaddr, pci_irq_line, board_index, - dev && dev->mem_start ? dev->mem_start - : options[cards_found]); - dev = 0; - cards_found++; - } - } - } -#endif /* NO_PCI */ - - - /* Special code to work-around the Compaq PCI BIOS32 problem. */ - if (compaq_ioaddr) { - vortex_found_device(dev, compaq_ioaddr, compaq_irq, compaq_prod_id, - dev && dev->mem_start ? dev->mem_start : options[cards_found]); - cards_found++; - dev = 0; - } - - return cards_found; -} - -static int vortex_found_device(struct device *dev, int ioaddr, int irq, - int product_index, int options) -{ - struct vortex_private *vp; - static struct vortex_private vps; - - if (dev) { - /*dev->priv = kmalloc(sizeof (struct vortex_private), GFP_KERNEL); */ - dev->priv = &vps; - memset(dev->priv, 0, sizeof (struct vortex_private)); - } -#if 0 - dev = init_etherdev(dev, sizeof(struct vortex_private)); -#endif - dev->base_addr = ioaddr; - dev->irq = irq; - vp = (struct vortex_private *)dev->priv; - vp->product_name = product_names[product_index]; - vp->options = options; - if (options >= 0) { - vp->media_override = ((options & 7) == 2) ? 0 : options & 7; - vp->full_duplex = (options & 8) ? 1 : 0; - vp->bus_master = (options & 16) ? 1 : 0; - } else { - vp->media_override = 7; - vp->full_duplex = 0; - vp->bus_master = 0; - } - - vortex_probe1(dev); - return 0; -} - -static int vortex_probe1(struct device *dev) -{ - int ioaddr = dev->base_addr; - struct vortex_private *vp = (struct vortex_private *)dev->priv; - int i; - - printf("%s: 3Com %s at %#3x,", dev->name, - vp->product_name, ioaddr); - - /* Read the station address from the EEPROM. */ - EL3WINDOW(0); - for (i = 0; i < 3; i++) { - short *phys_addr = (short *)dev->dev_addr; - int timer; - lx_outw(EEPROM_Read + PhysAddr01 + i, ioaddr + Wn0EepromCmd); - /* Pause for at least 162 us. for the read to take place. */ - for (timer = 162*4 + 400; timer >= 0; timer--) { - SLOW_DOWN_IO; - if ((inw(ioaddr + Wn0EepromCmd) & 0x8000) == 0) - break; - } - phys_addr[i] = htons(inw(ioaddr + Wn0EepromData)); - } - for (i = 0; i < 6; i++) - printf("%c%x", i ? ':' : ' ', dev->dev_addr[i]); - printf(", IRQ %d\n", dev->irq); - /* Tell them about an invalid IRQ. */ - if (vortex_debug && (dev->irq <= 0 || dev->irq > 15)) - printf(" *** Warning: this IRQ is unlikely to work!\n"); - - { - char *ram_split[] = {"5:3", "3:1", "1:1", "3:5"}; - union wn3_config config; - EL3WINDOW(3); - vp->available_media = inw(ioaddr + Wn3_Options); - config.i = inl(ioaddr + Wn3_Config); - if (vortex_debug > 1) - printf(" Internal config register is %4.4x, transceivers %#x.\n", - config.i, inw(ioaddr + Wn3_Options)); - printf(" %dK %s-wide RAM %s Rx:Tx split, %s%s interface.\n", - 8 << config.u.ram_size, - config.u.ram_width ? "word" : "byte", - ram_split[config.u.ram_split], - config.u.autoselect ? "autoselect/" : "", - media_tbl[config.u.xcvr].name); - dev->if_port = config.u.xcvr; - vp->default_media = config.u.xcvr; - vp->autoselect = config.u.autoselect; - } - -#if 0 - /* We do a request_region() only to register /proc/ioports info. */ - request_region(ioaddr, VORTEX_TOTAL_SIZE, vp->product_name); -#endif - return 0; -} - - -static int -vortex_open(struct device *dev) -{ - int ioaddr = dev->base_addr; - struct vortex_private *vp = (struct vortex_private *)dev->priv; - union wn3_config config; - int i; - - /* Before initializing select the active media port. */ - EL3WINDOW(3); - if (vp->full_duplex) - lx_outb(0x20, ioaddr + Wn3_MAC_Ctrl); /* Set the full-duplex bit. */ - config.i = inl(ioaddr + Wn3_Config); - - if (vp->media_override != 7) { - if (vortex_debug > 1) - printf("%s: Media override to transceiver %d (%s).\n", - dev->name, vp->media_override, - media_tbl[vp->media_override].name); - dev->if_port = vp->media_override; - } else if (vp->autoselect) { - /* Find first available media type, starting with 100baseTx. */ - dev->if_port = 4; - while (! (vp->available_media & media_tbl[dev->if_port].mask)) - dev->if_port = media_tbl[dev->if_port].next; - - if (vortex_debug > 1) - printf("%s: Initial media type %s.\n", - dev->name, media_tbl[dev->if_port].name); - -#if 0 - vp->timer.expires = RUN_AT(media_tbl[dev->if_port].wait); - vp->timer.data = (unsigned long)dev; - vp->timer.function = &vortex_timer; /* timer handler */ - add_timer(&vp->timer); -#endif - } else - dev->if_port = vp->default_media; - - config.u.xcvr = dev->if_port; - lx_outl(config.i, ioaddr + Wn3_Config); - - if (vortex_debug > 1) { - printf("%s: vortex_open() InternalConfig %8.8x.\n", - dev->name, config.i); - } - - lx_outw(TxReset, ioaddr + EL3_CMD); - for (i = 20; i >= 0 ; i--) - if ( ! (inw(ioaddr + EL3_STATUS) & CmdInProgress)) - break; - - lx_outw(RxReset, ioaddr + EL3_CMD); - /* Wait a few ticks for the RxReset command to complete. */ - for (i = 20; i >= 0 ; i--) - if ( ! (inw(ioaddr + EL3_STATUS) & CmdInProgress)) - break; - - lx_outw(SetStatusEnb | 0x00, ioaddr + EL3_CMD); - -#if 0 -#ifdef SA_SHIRQ /* Use the now-standard shared IRQ implementation. */ - if (request_irq(dev->irq, &vortex_interrupt, SA_SHIRQ, - vp->product_name, dev)) { - return -EAGAIN; - } -#else -#ifdef USE_SHARED_IRQ /* Use my shared IRQ implementation. */ - i = request_shared_irq(dev->irq, &vortex_interrupt, dev, vp->product_name); - if (i) /* Error */ - return i; -#else - if (dev->irq == 0 || irq2dev_map[dev->irq] != NULL) - return -EAGAIN; - irq2dev_map[dev->irq] = dev; - if (REQUEST_IRQ(dev->irq, &vortex_interrupt, 0, vp->product_name, NULL)) { - irq2dev_map[dev->irq] = NULL; - return -EAGAIN; - } -#endif /* USE_SHARED_IRQ */ -#endif /* SA_SHIRQ */ -#endif - if (vortex_debug > 1) { - EL3WINDOW(4); - printf("%s: vortex_open() irq %d media status %4.4x.\n", - dev->name, dev->irq, inw(ioaddr + Wn4_Media)); - } - - /* Set the station address and mask in window 2 each time opened. */ - EL3WINDOW(2); - for (i = 0; i < 6; i++) - lx_outb(dev->dev_addr[i], ioaddr + i); - for (; i < 12; i+=2) - lx_outw(0, ioaddr + i); - - if (dev->if_port == 3) - /* Start the thinnet transceiver. We should really wait 50ms...*/ - lx_outw(StartCoax, ioaddr + EL3_CMD); - EL3WINDOW(4); - lx_outw((inw(ioaddr + Wn4_Media) & ~(Media_10TP|Media_SQE)) | - media_tbl[dev->if_port].media_bits, ioaddr + Wn4_Media); - - /* Switch to the stats window, and clear all stats by reading. */ - lx_outw(StatsDisable, ioaddr + EL3_CMD); - EL3WINDOW(6); - for (i = 0; i < 10; i++) - inb(ioaddr + i); - inw(ioaddr + 10); - inw(ioaddr + 12); - /* New: On the Vortex we must also clear the BadSSD counter. */ - EL3WINDOW(4); - inb(ioaddr + 12); - - /* Switch to register set 7 for normal use. */ - EL3WINDOW(7); - - /* Set reciever mode: presumably accept b-case and phys addr only. */ - set_rx_mode(dev); - lx_outw(StatsEnable, ioaddr + EL3_CMD); /* Turn on statistics. */ - - dev->tbusy = 0; - dev->interrupt = 0; - dev->start = 1; - - lx_outw(RxEnable, ioaddr + EL3_CMD); /* Enable the receiver. */ - lx_outw(TxEnable, ioaddr + EL3_CMD); /* Enable transmitter. */ - /* Allow status bits to be seen. */ - lx_outw(SetStatusEnb | 0x1ff, ioaddr + EL3_CMD); - /* Ack all pending events, and set active indicator mask. */ - lx_outw(AckIntr | IntLatch | TxAvailable | RxEarly | IntReq, - ioaddr + EL3_CMD); - lx_outw(SetIntrEnb | IntLatch | TxAvailable | RxComplete | StatsFull - | DMADone, ioaddr + EL3_CMD); - -#ifdef MODULE - MOD_INC_USE_COUNT; -#endif - - return 0; -} - -static void vortex_timer(unsigned long data) -{ -#ifdef AUTOMEDIA - struct device *dev = (struct device *)data; - struct vortex_private *vp = (struct vortex_private *)dev->priv; - int ioaddr = dev->base_addr; - unsigned long flags; - int ok = 0; - - if (vortex_debug > 1) - printf("%s: Media selection timer tick happened, %s.\n", - dev->name, media_tbl[dev->if_port].name); - - save_flags(flags); cli(); { - int old_window = inw(ioaddr + EL3_CMD) >> 13; - int media_status; - EL3WINDOW(4); - media_status = inw(ioaddr + Wn4_Media); - switch (dev->if_port) { - case 0: case 4: case 5: /* 10baseT, 100baseTX, 100baseFX */ - if (media_status & Media_LnkBeat) { - ok = 1; - if (vortex_debug > 1) - printf("%s: Media %s has link beat, %x.\n", - dev->name, media_tbl[dev->if_port].name, media_status); - } else if (vortex_debug > 1) - printf("%s: Media %s is has no link beat, %x.\n", - dev->name, media_tbl[dev->if_port].name, media_status); - - break; - default: /* Other media types handled by Tx timeouts. */ - if (vortex_debug > 1) - printf("%s: Media %s is has no indication, %x.\n", - dev->name, media_tbl[dev->if_port].name, media_status); - ok = 1; - } - if ( ! ok) { - union wn3_config config; - - do { - dev->if_port = media_tbl[dev->if_port].next; - } while ( ! (vp->available_media & media_tbl[dev->if_port].mask)); - if (dev->if_port == 8) { /* Go back to default. */ - dev->if_port = vp->default_media; - if (vortex_debug > 1) - printf("%s: Media selection failing, using default %s port.\n", - dev->name, media_tbl[dev->if_port].name); - } else { - if (vortex_debug > 1) - printf("%s: Media selection failed, now trying %s port.\n", - dev->name, media_tbl[dev->if_port].name); -#if 0 - vp->timer.expires = RUN_AT(media_tbl[dev->if_port].wait); - add_timer(&vp->timer); -#endif - } - lx_outw((media_status & ~(Media_10TP|Media_SQE)) | - media_tbl[dev->if_port].media_bits, ioaddr + Wn4_Media); - - EL3WINDOW(3); - config.i = inl(ioaddr + Wn3_Config); - config.u.xcvr = dev->if_port; - lx_outl(config.i, ioaddr + Wn3_Config); - - lx_outw(dev->if_port == 3 ? StartCoax : StopCoax, ioaddr + EL3_CMD); - } - EL3WINDOW(old_window); - } restore_flags(flags); - if (vortex_debug > 1) - printf("%s: Media selection timer finished, %s.\n", - dev->name, media_tbl[dev->if_port].name); - -#endif /* AUTOMEDIA*/ - return; -} - -static int -vortex_start_xmit(struct device *dev, char *data, int len) -{ - struct vortex_private *vp = (struct vortex_private *)dev->priv; - int ioaddr = dev->base_addr; - - /* Part of the following code is inspired by code from Giuseppe Ciaccio, - ciaccio@disi.unige.it. - It works around a ?bug? in the 8K Vortex that only occurs on some - systems: the TxAvailable interrupt seems to be lost. - The ugly work-around is to busy-wait for room available in the Tx - buffer before deciding the transmitter is actually hung. - This busy-wait should never really occur, since the problem is that - there actually *is* room in the Tx FIFO. - - This pointed out an optimization -- we can ignore dev->tbusy if - we actually have room for this packet. - */ - - if (dev->tbusy) { - /* Transmitter timeout, serious problems. */ - int tickssofar = jiffies - dev->trans_start; - int i; - - if (tickssofar < TX_TIMEOUT-2) /* We probably aren't empty. */ - return 1; - /* Wait a while to see if there really is room. */ - for (i = WAIT_TX_AVAIL; i >= 0; i--) - if (inw(ioaddr + TxFree) > len) - break; - if ( i < 0) { - if (tickssofar < TX_TIMEOUT) - return 1; - printf("%s: transmit timed out, tx_status %2.2x status %4.4x.\n", - dev->name, inb(ioaddr + TxStatus), inw(ioaddr + EL3_STATUS)); - /* Issue TX_RESET and TX_START commands. */ - lx_outw(TxReset, ioaddr + EL3_CMD); - for (i = 20; i >= 0 ; i--) - if ( ! (inw(ioaddr + EL3_STATUS) & CmdInProgress)) - break; - lx_outw(TxEnable, ioaddr + EL3_CMD); - dev->trans_start = jiffies; - dev->tbusy = 0; -#if 0 - vp->stats.tx_errors++; - vp->stats.tx_dropped++; -#endif - return 0; /* Yes, silently *drop* the packet! */ - } - } - - /* Block a timer-based transmit from overlapping. This could better be - done with atomic_swap(1, dev->tbusy), but set_bit() works as well. - If this ever occurs the queue layer is doing something evil! */ -#if 0 - if (set_bit(0, (void*)&dev->tbusy) != 0) { - printf("%s: Transmitter access conflict.\n", dev->name); - return 1; - } -#endif - /* Put out the doubleword header... */ - lx_outl(len, ioaddr + TX_FIFO); -#ifdef VORTEX_BUS_MASTER - if (vp->bus_master) { - /* Set the bus-master controller to transfer the packet. */ - lx_outl((int)(data), ioaddr + Wn7_MasterAddr); - lx_outw((len + 3) & ~3, ioaddr + Wn7_MasterLen); -/* vp->tx_skb = skb; */ - lx_outw(StartDMADown, ioaddr + EL3_CMD); - /* dev->tbusy will be cleared at the DMADone interrupt. */ - } else { - /* ... and the packet rounded to a doubleword. */ - outsl(ioaddr + TX_FIFO, data, (len + 3) >> 2); -/* dev_kfree_skb (skb, FREE_WRITE); */ - if (inw(ioaddr + TxFree) > 1536) { - dev->tbusy = 0; - } else - /* Interrupt us when the FIFO has room for max-sized packet. */ - lx_outw(SetTxThreshold + (1536>>2), ioaddr + EL3_CMD); - } -#else - /* ... and the packet rounded to a doubleword. */ - outsl(ioaddr + TX_FIFO, data, (len + 3) >> 2); -/* dev_kfree_skb (skb, FREE_WRITE); */ - if (inw(ioaddr + TxFree) > 1536) { - dev->tbusy = 0; - } else - /* Interrupt us when the FIFO has room for max-sized packet. */ - lx_outw(SetTxThreshold + (1536>>2), ioaddr + EL3_CMD); -#endif /* bus master */ - - dev->trans_start = jiffies; - - /* Clear the Tx status stack. */ - { - short tx_status; - int i = 4; - - while (--i > 0 && (tx_status = inb(ioaddr + TxStatus)) > 0) { - if (tx_status & 0x3C) { /* A Tx-disabling error occurred. */ - if (vortex_debug > 2) - printf("%s: Tx error, status %2.2x.\n", - dev->name, tx_status); -#if 0 - if (tx_status & 0x04) vp->stats.tx_fifo_errors++; - if (tx_status & 0x38) vp->stats.tx_aborted_errors++; -#endif - if (tx_status & 0x30) { - int j; - lx_outw(TxReset, ioaddr + EL3_CMD); - for (j = 20; j >= 0 ; j--) - if ( ! (inw(ioaddr + EL3_STATUS) & CmdInProgress)) - break; - } - lx_outw(TxEnable, ioaddr + EL3_CMD); - } - lx_outb(0x00, ioaddr + TxStatus); /* Pop the status stack. */ - } - } - return 0; -} - -#if 0 - -/* The interrupt handler does all of the Rx thread work and cleans up - after the Tx thread. */ -static void vortex_interrupt IRQ(int irq, void *dev_id, struct pt_regs *regs) -{ -#ifdef SA_SHIRQ /* Use the now-standard shared IRQ implementation. */ - struct device *dev = dev_id; -#else -#ifdef USE_SHARED_IRQ - struct device *dev = (struct device *)(irq == 0 ? regs : irq2dev_map[irq]); -#else - struct device *dev = (struct device *)(irq2dev_map[irq]); -#endif -#endif - struct vortex_private *lp; - int ioaddr, status; - int latency; - int i = 0; - - if (dev->interrupt) - printf("%s: Re-entering the interrupt handler.\n", dev->name); - dev->interrupt = 1; - - ioaddr = dev->base_addr; - latency = inb(ioaddr + Timer); - lp = (struct vortex_private *)dev->priv; - - status = inw(ioaddr + EL3_STATUS); - - if (vortex_debug > 4) - printf("%s: interrupt, status %4.4x, timer %d.\n", dev->name, - status, latency); - if ((status & 0xE000) != 0xE000) { - static int donedidthis=0; - /* Some interrupt controllers store a bogus interrupt from boot-time. - Ignore a single early interrupt, but don't hang the machine for - other interrupt problems. */ - if (donedidthis++ > 1) { - printf("%s: Bogus interrupt, bailing. Status %4.4x, start=%d.\n", - dev->name, status, dev->start); - FREE_IRQ(dev->irq, dev); - } - } - - do { - if (vortex_debug > 5) - printf("%s: In interrupt loop, status %4.4x.\n", - dev->name, status); - if (status & RxComplete) - vortex_rx(dev); - - if (status & TxAvailable) { - if (vortex_debug > 5) - printf(" TX room bit was handled.\n"); - /* There's room in the FIFO for a full-sized packet. */ - lx_outw(AckIntr | TxAvailable, ioaddr + EL3_CMD); - dev->tbusy = 0; - mark_bh(NET_BH); - } -#ifdef VORTEX_BUS_MASTER - if (status & DMADone) { - lx_outw(0x1000, ioaddr + Wn7_MasterStatus); /* Ack the event. */ - dev->tbusy = 0; - /* dev_kfree_skb (lp->tx_skb, FREE_WRITE); Release the transfered buffer */ -/* mark_bh(NET_BH); */ - } -#endif - if (status & (AdapterFailure | RxEarly | StatsFull)) { - /* Handle all uncommon interrupts at once. */ - if (status & RxEarly) { /* Rx early is unused. */ - vortex_rx(dev); - lx_outw(AckIntr | RxEarly, ioaddr + EL3_CMD); - } - if (status & StatsFull) { /* Empty statistics. */ - static int DoneDidThat = 0; - if (vortex_debug > 4) - printf("%s: Updating stats.\n", dev->name); - update_stats(ioaddr, dev); - /* DEBUG HACK: Disable statistics as an interrupt source. */ - /* This occurs when we have the wrong media type! */ - if (DoneDidThat == 0 && - inw(ioaddr + EL3_STATUS) & StatsFull) { - int win, reg; - printf("%s: Updating stats failed, disabling stats as an" - " interrupt source.\n", dev->name); - for (win = 0; win < 8; win++) { - EL3WINDOW(win); - printf("\n Vortex window %d:", win); - for (reg = 0; reg < 16; reg++) - printf(" %2.2x", inb(ioaddr+reg)); - } - EL3WINDOW(7); - lx_outw(SetIntrEnb | 0x18, ioaddr + EL3_CMD); - DoneDidThat++; - } - } - if (status & AdapterFailure) { - /* Adapter failure requires Rx reset and reinit. */ - lx_outw(RxReset, ioaddr + EL3_CMD); - /* Set the Rx filter to the current state. */ - set_rx_mode(dev); - lx_outw(RxEnable, ioaddr + EL3_CMD); /* Re-enable the receiver. */ - lx_outw(AckIntr | AdapterFailure, ioaddr + EL3_CMD); - } - } - - if (++i > 10) { - printf("%s: Infinite loop in interrupt, status %4.4x. " - "Disabling functions (%4.4x).\n", - dev->name, status, SetStatusEnb | ((~status) & 0xFE)); - /* Disable all pending interrupts. */ - lx_outw(SetStatusEnb | ((~status) & 0xFE), ioaddr + EL3_CMD); - lx_outw(AckIntr | 0xFF, ioaddr + EL3_CMD); - break; - } - /* Acknowledge the IRQ. */ - lx_outw(AckIntr | IntReq | IntLatch, ioaddr + EL3_CMD); - - } while ((status = inw(ioaddr + EL3_STATUS)) & (IntLatch | RxComplete)); - - if (vortex_debug > 4) - printf("%s: exiting interrupt, status %4.4x.\n", dev->name, status); - - dev->interrupt = 0; - return; -} - -#endif - -static int -vortex_rx(struct device *dev, char *data, int len) -{ - struct vortex_private *vp = (struct vortex_private *)dev->priv; - int ioaddr = dev->base_addr; - int i; - short rx_status; - - if (vortex_debug > 5) - printf(" In rx_packet(), status %4.4x, rx_status %4.4x.\n", - inw(ioaddr+EL3_STATUS), inw(ioaddr+RxStatus)); - while ((rx_status = inw(ioaddr + RxStatus)) > 0) { - if (rx_status & 0x4000) { /* Error, update stats. */ - unsigned char rx_error = inb(ioaddr + RxErrors); - if (vortex_debug > 4) - printf(" Rx error: status %2.2x.\n", rx_error); -#if 0 - vp->stats.rx_errors++; - if (rx_error & 0x01) vp->stats.rx_over_errors++; - if (rx_error & 0x02) vp->stats.rx_length_errors++; - if (rx_error & 0x04) vp->stats.rx_frame_errors++; - if (rx_error & 0x08) vp->stats.rx_crc_errors++; - if (rx_error & 0x10) vp->stats.rx_length_errors++; -#endif - } else { - /* The packet length: up to 4.5K!. */ - short pkt_len = rx_status & 0x1fff; -/* struct sk_buff *skb; */ - -/* skb = DEV_ALLOC_SKB(pkt_len + 5); */ - if (vortex_debug > 4) - printf("Receiving packet size %d status %4.4x.\n", - pkt_len, rx_status); - - if (1) { - insl(ioaddr + RX_FIFO, data, (pkt_len + 3) >> 2); - lx_outw(RxDiscard, ioaddr + EL3_CMD); /* Pop top Rx packet. */ - - for (i = 200; i >= 0; i--) - if ( ! (inw(ioaddr + EL3_STATUS) & CmdInProgress)) - break; - } - -#if 0 - if (skb != NULL) { - skb->dev = dev; -#if defined (LINUX_VERSION_CODE) && LINUX_VERSION_CODE >= 0x10300 - skb_reserve(skb, 2); /* Align IP on 16 byte boundaries */ - /* 'skb_put()' points to the start of sk_buff data area. */ - insl(ioaddr + RX_FIFO, skb_put(skb, pkt_len), - (pkt_len + 3) >> 2); - skb->protocol = eth_type_trans(skb, dev); -#else - skb->len = pkt_len; - /* 'skb->data' points to the start of sk_buff data area. */ - insl(ioaddr + RX_FIFO, skb->data, (pkt_len + 3) >> 2); -#endif /* KERNEL_1_3_0 */ - netif_rx(skb); - lx_outw(RxDiscard, ioaddr + EL3_CMD); /* Pop top Rx packet. */ - /* Wait a limited time to go to next packet. */ - for (i = 200; i >= 0; i--) - if ( ! (inw(ioaddr + EL3_STATUS) & CmdInProgress)) - break; - vp->stats.rx_packets++; - continue; - } else if (vortex_debug) - printf("%s: Couldn't allocate a sk_buff of size %d.\n", - dev->name, pkt_len); -#endif - } -#if 0 - vp->stats.rx_dropped++; -#endif - lx_outw(RxDiscard, ioaddr + EL3_CMD); - /* Wait a limited time to skip this packet. */ - for (i = 200; i >= 0; i--) - if ( ! (inw(ioaddr + EL3_STATUS) & CmdInProgress)) - break; - } - - return 0; -} - -static int -vortex_close(struct device *dev) -{ - struct vortex_private *vp = (struct vortex_private *)dev->priv; - int ioaddr = dev->base_addr; - - dev->start = 0; - dev->tbusy = 1; - - if (vortex_debug > 1) - printf("%s: vortex_close() status %4.4x, Tx status %2.2x.\n", - dev->name, inw(ioaddr + EL3_STATUS), inb(ioaddr + TxStatus)); - -#if 0 - del_timer(&vp->timer); -#endif - /* Turn off statistics ASAP. We update lp->stats below. */ - lx_outw(StatsDisable, ioaddr + EL3_CMD); - - /* Disable the receiver and transmitter. */ - lx_outw(RxDisable, ioaddr + EL3_CMD); - lx_outw(TxDisable, ioaddr + EL3_CMD); - - if (dev->if_port == 3) - /* Turn off thinnet power. Green! */ - lx_outw(StopCoax, ioaddr + EL3_CMD); -#if 0 - -#ifdef SA_SHIRQ - FREE_IRQ(dev->irq, dev); -#else -#ifdef USE_SHARED_IRQ - free_shared_irq(dev->irq, dev); -#else - FREE_IRQ(dev->irq, NULL); - /* Mmmm, we should disable all interrupt sources here. */ - irq2dev_map[dev->irq] = 0; -#endif -#endif - - update_stats(ioaddr, dev); -#ifdef MODULE - MOD_DEC_USE_COUNT; -#endif - -#endif - return 0; -} - - -/* This new version of set_rx_mode() supports v1.4 kernels. - The Vortex chip has no documented multicast filter, so the only - multicast setting is to receive all multicast frames. At least - the chip has a very clean way to set the mode, unlike many others. */ -static void -set_rx_mode(struct device *dev) -{ - short ioaddr = dev->base_addr; - short new_mode; - - if (dev->flags & IFF_PROMISC) { - if (vortex_debug > 3) - printf("%s: Setting promiscuous mode.\n", dev->name); - new_mode = SetRxFilter|RxStation|RxMulticast|RxBroadcast|RxProm; - } else if (/*(dev->mc_list) || */ (dev->flags & IFF_ALLMULTI)) { - new_mode = SetRxFilter|RxStation|RxMulticast|RxBroadcast; - } else - new_mode = SetRxFilter | RxStation | RxBroadcast; - - lx_outw(new_mode, ioaddr + EL3_CMD); -} - - -/* - * Local variables: - * compile-command: "gcc -DMODULE -D__KERNEL__ -I/usr/src/linux/net/inet -Wall -Wstrict-prototypes -O6 -m486 -c 3c59x.c -o ../../modules/3c59x.o" - * c-indent-level: 4 - * tab-width: 4 - * End: - */ -void VX_reset (struct nic *nic) -{ - printf ("reset"); -} - -int VX_poll (struct nic *nic) -{ -// printf ("Polling %x %d\n", nic->packet, nic->packetlen); -} - -void VX_transmit (struct nic *nic, char *d, - unsigned int t, unsigned int s, char *p) -{ - int i; - - printf ("Transmit type %d, %x %d\n", t, p, s); - printf ("SRCAddr : "); - for (i = 0; i < 6; i++) - printf ("%x:", ((int)nic->node_addr[i]) & 0xff); - printf ("\nDest : "); - for (i = 0; i < 6; i++) - printf ("%x:", ((int)d[i]) & 0xff); - printf ("\n"); - -} - -void VX_disable (struct nic *nic) -{ - printf ("Disable\n"); -} - -struct nic *VX_probe(struct nic *nic, unsigned short *probe_addrs) -{ - - if (probe_addrs) { - card.mem_start = probe_addrs[0]; - vortex_probe1(&card); - - printf ("Probe 3c93 at %x\n", card.mem_start); - nic->priv_data = &card; - nic->reset = VX_reset; - nic->poll = VX_poll; - nic->transmit = VX_transmit; - nic->disable = VX_disable; - return 1; - } - printf ("Failed : No ProbeAddrs\n"); - return 0; -} - -#endif /* INCLUDE_3C59X */ diff --git a/netboot/Makefile.am b/netboot/Makefile.am index a4f28ccc7..9023b4c08 100644 --- a/netboot/Makefile.am +++ b/netboot/Makefile.am @@ -14,7 +14,7 @@ libdrivers_a_SOURCES = byteorder.h config.c etherboot.h \ fsys_tftp.c if.h linux-asm-io.h linux-asm-string.h \ main.c misc.c netboot_config.h netdevice.h nic.h osdep.h \ pci.c pci.h -EXTRA_libdrivers_a_SOURCES = 3c509.c 3c509.h 3c59x.c 3c90x.c cs89x0.c \ +EXTRA_libdrivers_a_SOURCES = 3c509.c 3c509.h 3c90x.c cs89x0.c \ 3c89x0.h eepro100.c epic100.c epic100.h i82586.c lance.c \ ns8390.c ns8390.h ntulip.c rtl8139.c sk_g16.c sk_g16.h \ smc9000.c smc9000.h tiara.c tulip.c tulip.h via-rhine.c @@ -31,7 +31,7 @@ EXTRA_DIST = README.netboot 3c90x.txt ntulip.txt # What objects are derived from a driver? 3c509_drivers = 3c509.o 3c529.o -3c59x_drivers = 3c59x.o +#3c59x_drivers = 3c59x.o 3c90x_drivers = 3c90x.o cs89x0_drivers = cs89x0.o eepro100_drivers = eepro100.o @@ -63,10 +63,10 @@ $(3c509_drivers): %.o: 3c509.c $(COMPILE) $(STAGE2_CFLAGS) -fno-builtin -nostdinc \ $(NET_EXTRAFLAGS) $($(basename $@)_o_CFLAGS) -o $@ -c $< -$(3c59x_drivers): 3c59x.c 3c509.h -$(3c59x_drivers): %.o: 3c59x.c - $(COMPILE) $(STAGE2_CFLAGS) -fno-builtin -nostdinc \ - $(NET_EXTRAFLAGS) $($(basename $@)_o_CFLAGS) -o $@ -c $< +#$(3c59x_drivers): 3c59x.c 3c509.h +#$(3c59x_drivers): %.o: 3c59x.c +# $(COMPILE) $(STAGE2_CFLAGS) -fno-builtin -nostdinc \ +# $(NET_EXTRAFLAGS) $($(basename $@)_o_CFLAGS) -o $@ -c $< $(3c90x_drivers): 3c90x.c $(3c90x_drivers): %.o: 3c90x.c @@ -132,7 +132,7 @@ $(via_rhine_drivers): %.o: via-rhine.c # Per-object flags. 3c509_o_CFLAGS = -DINCLUDE_3C509=1 3c529_o_CFLAGS = -DINCLUDE_3C529=1 -3c59x_o_CFLAGS = -DINCLUDE_3C59X=1 +#3c59x_o_CFLAGS = -DINCLUDE_3C59X=1 3c90x_o_CFLAGS = -DINCLUDE_3C90X=1 cs89x0_o_CFLAGS = -DINCLUDE_CS89X0=1 eepro100_o_CFLAGS = -DINCLUDE_EEPRO100=1 diff --git a/stage2/disk_io.c b/stage2/disk_io.c index 5936bbcd3..ddb315595 100644 --- a/stage2/disk_io.c +++ b/stage2/disk_io.c @@ -2,7 +2,7 @@ /* * GRUB -- GRand Unified Bootloader * Copyright (C) 1996 Erich Boleyn - * Copyright (C) 1999 Free Software Foundation, Inc. + * Copyright (C) 1999, 2000 Free Software Foundation, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -292,33 +292,53 @@ attempt_mount (void) #ifndef STAGE1_5 +/* Turn on the active flag for the partition SAVED_PARATITION in the + drive SAVED_DRIVE. If an error occurs, return zero, otherwise return + non-zero. */ int make_saved_active (void) { if (saved_drive & 0x80) { + /* Hard disk */ int part = saved_partition >> 16; + /* If the partition is not a primary partition, the active flag is + meaningless. (XXX: Really?) */ if (part > 3) { errnum = ERR_NO_PART; return 0; } - if (!rawread (saved_drive, 0, 0, SECTOR_SIZE, (char *) SCRATCHADDR)) + /* Read the MBR in the scratch space. */ + if (! rawread (saved_drive, 0, 0, SECTOR_SIZE, (char *) SCRATCHADDR)) return 0; + /* If the partition is an extended partition, setting the active + flag violates the specification by IBM. */ + if (IS_PC_SLICE_TYPE_EXTENDED (PC_SLICE_TYPE (SCRATCHADDR, part))) + { + errnum = ERR_DEV_VALUES; + return 0; + } + + /* Check if the active flag is disabled. */ if (PC_SLICE_FLAG (SCRATCHADDR, part) != PC_SLICE_FLAG_BOOTABLE) { int i; + /* Clear all the active flags in this table. */ for (i = 0; i < 4; i++) PC_SLICE_FLAG (SCRATCHADDR, i) = 0; + /* Set the flag. */ PC_SLICE_FLAG (SCRATCHADDR, part) = PC_SLICE_FLAG_BOOTABLE; + /* Clear the cache. */ buf_track = -1; + /* Write back the MBR. */ if (biosdisk (BIOSDISK_WRITE, saved_drive, &buf_geom, 0, 1, SCRATCHSEG)) { @@ -327,6 +347,13 @@ make_saved_active (void) } } } + else + { + /* If the drive is not a hard disk drive, you shouldn't call this + function. (XXX: Should I just ignore this error?) */ + errnum = ERR_DEV_VALUES; + return 0; + } return 1; }