Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/sommerfeld_i386mp_1]: src/sys/arch/i386/stand/lib/netif Update for new l...
details: https://anonhg.NetBSD.org/src/rev/c67895103ab2
branches: sommerfeld_i386mp_1
changeset: 482490:c67895103ab2
user: thorpej <thorpej%NetBSD.org@localhost>
date: Sun Feb 17 19:47:42 2002 +0000
description:
Update for new location of the WD80x3 register description.
diffstat:
sys/arch/i386/stand/lib/netif/wd80x3.c | 331 +++++++++++++++++++++++++++++++++
1 files changed, 331 insertions(+), 0 deletions(-)
diffs (truncated from 335 to 300 lines):
diff -r 61c2b036ba57 -r c67895103ab2 sys/arch/i386/stand/lib/netif/wd80x3.c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/sys/arch/i386/stand/lib/netif/wd80x3.c Sun Feb 17 19:47:42 2002 +0000
@@ -0,0 +1,331 @@
+/* $NetBSD: wd80x3.c,v 1.7.2.2 2002/02/17 19:47:42 thorpej Exp $ */
+
+/*-
+ * Copyright (c) 1997, 1998 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * 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.
+ */
+
+/*
+ * Device driver for National Semiconductor DS8390/WD83C690 based ethernet
+ * adapters.
+ *
+ * Copyright (c) 1994, 1995 Charles M. Hannum. All rights reserved.
+ *
+ * Copyright (C) 1993, David Greenman. This software may be used, modified,
+ * copied, distributed, and sold, in both source and binary form provided that
+ * the above copyright and these terms are retained. Under no circumstances is
+ * the author responsible for the proper functioning of this software, nor does
+ * the author assume any responsibility for damages incurred with its use.
+ */
+
+/*
+ * Device driver for the Western Digital/SMC 8003 and 8013 series,
+ * and the SMC Elite Ultra (8216).
+ */
+
+#include <sys/types.h>
+#include <machine/pio.h>
+
+#include <lib/libsa/stand.h>
+#include <libi386.h>
+
+#ifdef _STANDALONE
+#include <lib/libkern/libkern.h>
+#include <bootinfo.h>
+#endif
+
+#include "etherdrv.h"
+#include <dev/ic/dp8390reg.h>
+#include "dp8390.h"
+#include <dev/ic/wereg.h>
+
+#ifndef BASEREG
+#define BASEREG 0x240
+#define BASEMEM 0xd0000
+#endif
+
+#define WD_BASEREG BASEREG
+#define WD_BASEMEM BASEMEM
+
+#ifndef _STANDALONE
+extern int mapio __P((void));
+#endif
+
+u_char eth_myaddr[6];
+
+static u_int8_t we_type;
+static int we_is16bit;
+
+#ifdef _STANDALONE
+static struct btinfo_netif bi_netif;
+#endif
+
+const char *
+we_params()
+{
+ const char *typestr;
+
+ dp8390_memsize = 8192;
+
+ we_type = inb(WD_BASEREG + WE_CARD_ID);
+ switch (we_type) {
+#ifdef SUPPORT_WD80X3
+ case WE_TYPE_WD8003S:
+ typestr = "WD8003S";
+ break;
+ case WE_TYPE_WD8003E:
+ typestr = "WD8003E";
+ break;
+ case WE_TYPE_WD8003EB:
+ typestr = "WD8003EB";
+ break;
+ case WE_TYPE_WD8003W:
+ typestr = "WD8003W";
+ break;
+ case WE_TYPE_WD8013EBT:
+ typestr = "WD8013EBT";
+ dp8390_memsize = 16384;
+ we_is16bit = 1;
+ break;
+ case WE_TYPE_WD8013W:
+ typestr = "WD8013W";
+ dp8390_memsize = 16384;
+ we_is16bit = 1;
+ break;
+ case WE_TYPE_WD8013EP: /* also WD8003EP */
+ if (inb(WD_BASEREG + WE_ICR) & WE_ICR_16BIT) {
+ we_is16bit = 1;
+ dp8390_memsize = 16384;
+ typestr = "WD8013EP";
+ } else
+ typestr = "WD8003EP";
+ break;
+ case WE_TYPE_WD8013WC:
+ typestr = "WD8013WC";
+ dp8390_memsize = 16384;
+ we_is16bit = 1;
+ break;
+ case WE_TYPE_WD8013EBP:
+ typestr = "WD8013EBP";
+ dp8390_memsize = 16384;
+ we_is16bit = 1;
+ break;
+ case WE_TYPE_WD8013EPC:
+ typestr = "WD8013EPC";
+ dp8390_memsize = 16384;
+ we_is16bit = 1;
+ break;
+#endif
+#ifdef SUPPORT_SMC_ULTRA
+ case WE_TYPE_SMC8216C:
+ case WE_TYPE_SMC8216T:
+ {
+ u_int8_t hwr;
+
+ typestr = (we_type == WE_TYPE_SMC8216C) ?
+ "SMC8216/SMC8216C" : "SMC8216T";
+
+ hwr = inb(WD_BASEREG + WE790_HWR);
+ outb(WD_BASEREG + WE790_HWR, hwr | WE790_HWR_SWH);
+ switch (inb(WD_BASEREG + WE790_RAR) & WE790_RAR_SZ64) {
+ case WE790_RAR_SZ64:
+ dp8390_memsize = 65536;
+ break;
+ case WE790_RAR_SZ32:
+ dp8390_memsize = 32768;
+ break;
+ case WE790_RAR_SZ16:
+ dp8390_memsize = 16384;
+ break;
+ case WE790_RAR_SZ8:
+ /* 8216 has 16K shared mem -- 8416 has 8K */
+ typestr = (we_type == WE_TYPE_SMC8216C) ?
+ "SMC8416C/SMC8416BT" : "SMC8416T";
+ dp8390_memsize = 8192;
+ break;
+ }
+ outb(WD_BASEREG + WE790_HWR, hwr);
+
+ we_is16bit = 1;
+#ifdef SUPPORT_WD80X3
+ dp8390_is790 = 1;
+#endif
+ break;
+ }
+#endif
+ default:
+ /* Not one we recognize. */
+ return (NULL);
+ }
+
+ /*
+ * Make some adjustments to initial values depending on what is
+ * found in the ICR.
+ */
+ if (we_is16bit && (we_type != WE_TYPE_WD8013EBT) &&
+ (inb(WD_BASEREG + WE_ICR) & WE_ICR_16BIT) == 0) {
+ we_is16bit = 0;
+ dp8390_memsize = 8192;
+ }
+
+#ifdef WE_DEBUG
+ {
+ int i;
+
+ printf("we_params: type = 0x%x, typestr = %s, is16bit = %d, "
+ "memsize = %d\n", we_type, typestr, we_is16bit, dp8390_memsize);
+ for (i = 0; i < 8; i++)
+ printf(" %d -> 0x%x\n", i,
+ inb(WD_BASEREG + i));
+ }
+#endif
+
+ return (typestr);
+}
+
+int
+EtherInit(myadr)
+ unsigned char *myadr;
+{
+ const char *typestr;
+ u_int8_t x;
+ int i;
+ u_int8_t laar_proto;
+ u_int8_t msr_proto;
+
+ dp8390_iobase = WD_BASEREG + WE_NIC_OFFSET;
+ dp8390_membase = WD_BASEMEM;
+
+#ifndef _STANDALONE
+ if (mapio()) {
+ printf("no IO access\n");
+ return(0);
+ }
+#endif
+
+ for (x = 0, i = 0; i < 8; i++)
+ x += inb(WD_BASEREG + WE_PROM + i);
+
+ if (x != WE_ROM_CHECKSUM_TOTAL)
+ return(0);
+
+ /* reset the ethernet card */
+ outb(WD_BASEREG + WE_MSR, WE_MSR_RST);
+ delay(100);
+ outb(WD_BASEREG + WE_MSR, inb(WD_BASEREG + WE_MSR) & ~WE_MSR_RST);
+ delay(5000);
+
+ typestr = we_params();
+ if (!typestr)
+ return(0);
+
+ printf("Using %s board, port 0x%x, iomem 0x%x, iosiz %d\n",
+ typestr, WD_BASEREG, WD_BASEMEM, dp8390_memsize);
+
+ /* get ethernet address */
+ for(i = 0; i < 6; i++)
+ eth_myaddr[i] = myadr[i]= inb(WD_BASEREG + WE_PROM + i);
+
+ /*
+ * Set upper address bits and 8/16 bit access to shared memory.
+ */
+ if (dp8390_is790) {
+ laar_proto = inb(WD_BASEREG + WE_LAAR) & ~WE_LAAR_M16EN;
+ outb(WD_BASEREG + WE_LAAR, laar_proto |
+ (we_is16bit ? WE_LAAR_M16EN : 0));
+ } else if ((we_type & WE_SOFTCONFIG) ||
+ (we_type == WE_TYPE_WD8013EBT)) {
+ laar_proto = (WD_BASEMEM >> 19) & WE_LAAR_ADDRHI;
+ if (we_is16bit)
+ laar_proto |= WE_LAAR_L16EN;
+ outb(WD_BASEREG + WE_LAAR, laar_proto |
+ (we_is16bit ? WE_LAAR_M16EN : 0));
+ }
+
+ /*
+ * Set address and enable interface shared memory.
+ */
+ if (dp8390_is790) {
+ /* XXX MAGIC CONSTANTS XXX */
+ x = inb(WD_BASEREG + 0x04);
+ outb(WD_BASEREG + 0x04, x | 0x80);
+ outb(WD_BASEREG + 0x0b,
+ ((WD_BASEMEM >> 13) & 0x0f) |
+ ((WD_BASEMEM >> 11) & 0x40) |
+ (inb(WD_BASEREG + 0x0b) & 0xb0));
+ outb(WD_BASEREG + 0x04, x);
+ msr_proto = 0x00;
+ dp8390_cr_proto = 0x00;
+ } else {
+ msr_proto = (WD_BASEMEM >> 13) & WE_MSR_ADDR;
+ dp8390_cr_proto = ED_CR_RD2;
+ }
+
+ outb(WD_BASEREG + WE_MSR, msr_proto | WE_MSR_MENB);
Home |
Main Index |
Thread Index |
Old Index