mirror of
https://github.com/openbsd/src.git
synced 2026-04-16 18:24:23 +00:00
old files
This commit is contained in:
@@ -1,152 +0,0 @@
|
||||
$NetBSD: README,v 1.1.1.1 1995/07/25 23:11:53 chuck Exp $
|
||||
|
||||
NetBSD/mvme68k port
|
||||
|
||||
supported environment:
|
||||
|
||||
Motorola makes a number of m68k VME cards. This port
|
||||
currently only works on the m68030 based VME147 card (diskless only
|
||||
for now).
|
||||
|
||||
requirements:
|
||||
- VME147 card
|
||||
- a machine to connect the console to
|
||||
- network connection
|
||||
- NFS server (to serve root and swap)
|
||||
|
||||
future plans:
|
||||
- VME147 scsi disk support
|
||||
- hopefully, support for the VME162 card
|
||||
|
||||
|
||||
how to boot:
|
||||
Booting NetBSD/mvme68k on a VME147 is somewhat painful because
|
||||
the ROM doesn't know how to talk to the ethernet chip. I have solved
|
||||
this problem by downloading a bootstrap into RAM via the console line.
|
||||
|
||||
First, you will need a m68k8k NFS mountable /usr and root
|
||||
directory. NetBSD/sun3 binaries will run fine on the mvme68k system
|
||||
for the most part (the exception being kvm stuff). These binaries can
|
||||
be ftp'd from ftp.netbsd.org. You will also need a NetBSD/mvme68k
|
||||
kernel and related bootstraps. For now these can be obtained from
|
||||
dworkin.wustl.edu in /dist/netbsd/mvme68k_boot.tar.gz (once I get set
|
||||
up I will put these plus a snapshot on ftp.netbsd.org).
|
||||
|
||||
Put the mvme68k "netbsd" binary in NFS root directory. Put
|
||||
boot.vme147 in /tftpboot of your NFS server machine. Make a symbolic
|
||||
link from the hex encoding of your IP address to that file. For
|
||||
example:
|
||||
|
||||
lrwxrwxrwx 1 root 11 Apr 13 17:27 80FCA93F.147 -> boot.vme147
|
||||
|
||||
|
||||
[80FCA93F is the IP address (128.252.169.63) of my vme147.]
|
||||
|
||||
Make sure you've got the right info in /etc/ethers and /etc/bootparams
|
||||
on your server.
|
||||
|
||||
|
||||
Now, bring up your 147. You should have the "bug" prompt:
|
||||
|
||||
COLD Start
|
||||
|
||||
Onboard RAM start = $00000000, stop = $007FFFFF
|
||||
|
||||
147-Bug>
|
||||
|
||||
|
||||
Make sure the "stop" looks ok (if you've got 8MB you should have the
|
||||
same value as I). Also make sure the clock is ticking:
|
||||
|
||||
147-Bug>time
|
||||
Sunday 5/30/27 16:25:14
|
||||
147-Bug>time
|
||||
Sunday 5/30/27 16:25:15
|
||||
147-Bug>
|
||||
|
||||
|
||||
Looks good. you now need to download "sboot" into RAM. you can
|
||||
either do that through the console line or through a 2nd serial
|
||||
connection. I have my 147 connected to a sun4/110 and I access it via
|
||||
"tip". to load that way do this:
|
||||
|
||||
lo 0
|
||||
~Ccat sboot
|
||||
go 4000
|
||||
|
||||
which will look like this:
|
||||
147-Bug>
|
||||
147-Bug>lo 0
|
||||
~CLocal command? cat sboot
|
||||
|
||||
away for 11 seconds
|
||||
!
|
||||
|
||||
147-Bug>g 4000
|
||||
Effective address: 00004000
|
||||
|
||||
sboot: serial line bootstrap program (&end = 5fd8)
|
||||
|
||||
>>>
|
||||
|
||||
|
||||
Now, if you want to do it through serial line 1, then connect serial
|
||||
line one to a machine. At the "147-Bug> " prompt do this "tm
|
||||
1"... you should then login to what ever machine it is connected to.
|
||||
Then hit "^A" to escape to Bug. do "lo 1;x=cat sboot" ... then when
|
||||
that is done you can reconnect "tm 1" and logout. Then do "go 4000"
|
||||
and you've got ">>> " prompt of sboot.
|
||||
|
||||
|
||||
Once you've got the ">>> " prompt you can do commands such as:
|
||||
"b" - boot "netbsd" multiuser
|
||||
"b gennetbsd" - boot "gennetbsd" multiuser
|
||||
"b -s" - boot "netbsd" single user
|
||||
"b gennetbsd -s"- boot "gennetbsd" single user
|
||||
|
||||
A typical boot looks like this:
|
||||
|
||||
>>> b
|
||||
le0: ethernet address: 8:0:3e:20:cb:87
|
||||
My ip address is: 128.252.169.63
|
||||
Server ip address is: 128.252.169.2
|
||||
3800
|
||||
Download was a success!
|
||||
Start @ 0x8000 ...
|
||||
>> NetBSD netboot [$Revision: 1.1.1.1 $]
|
||||
boot: client IP address: 128.252.169.63
|
||||
boot: client name: vme147
|
||||
root addr=128.252.169.2 path=/export/root/vme147
|
||||
449744+20348+64444+[29268+29051]=0x90f0b
|
||||
Start @ 0x88aa ...
|
||||
Copyright (c) 1982, 1986, 1989, 1991, 1993
|
||||
The Regents of the University of California. All rights reserved.
|
||||
|
||||
NetBSD 1.0A (VME147) #17: Sat Jul 1 00:07:04 CDT 1995
|
||||
chuck@vme147.ccrc.wustl.edu:/um/netbsd/src/sys/arch/mvme68k/compile/VME147
|
||||
Motorola MVME147 MC68030 CPU+MMU, ???MHz MC68882 FPU)
|
||||
real mem = 8388608
|
||||
avail mem = 6832128
|
||||
using 102 buffers containing 417792 bytes of memory
|
||||
mainbus0 (root)
|
||||
iio0 at mainbus0 addr 0xfffe0000
|
||||
pcc0 at iio0 offset 0x1000 rev 0 intbvr 0x40
|
||||
clock0 at iio0 offset 0x7f8 ipl 5
|
||||
zs0 at iio0 offset 0x3000 ipl 4
|
||||
le0 at iio0 offset 0x1800 ipl 2 ler2 0x94000 address 08:00:3e:20:cb:87
|
||||
nfs_boot: using network interface 'le0'
|
||||
nfs_boot: client_addr=0x80fca93f
|
||||
nfs_boot: server_addr=0x80fca902
|
||||
nfs_boot: hostname=vme147
|
||||
root on dworkin:/export/root/vme147
|
||||
root time: 0x2ffc6859
|
||||
WARNING: clock gained 18 days -- CHECK AND RESET THE DATE!
|
||||
swap on dworkin:/export/swap/vme147
|
||||
swap size: 0x4000 (blocks)
|
||||
init: copying out path `/sbin/init' 11
|
||||
Automatic boot in progress: starting file system checks.
|
||||
[etc...]
|
||||
|
||||
|
||||
good luck!
|
||||
|
||||
@@ -1,51 +0,0 @@
|
||||
# $NetBSD: VME147,v 1.1.1.1 1995/07/25 23:12:05 chuck Exp $
|
||||
|
||||
machine mvme68k m68k
|
||||
|
||||
options "M68040" # support for 040
|
||||
options FPSP # MC68040 floating point support
|
||||
options "M68030" # support for 030
|
||||
options FPCOPROC # Support for MC6888[12] (Required)
|
||||
|
||||
maxusers 2
|
||||
|
||||
# obsolete timezone spec
|
||||
options TIMEZONE=0, DST=0
|
||||
|
||||
options DIAGNOSTIC, DEBUG
|
||||
#options FFS
|
||||
options NFSCLIENT
|
||||
#options NFSSERVER
|
||||
#options SYSVSHM
|
||||
options KTRACE
|
||||
options COMPAT_43
|
||||
options FIFO
|
||||
#options MFS
|
||||
options DEVPAGER, SWAPPAGER, VNODEPAGER
|
||||
#options MSDOSFS
|
||||
|
||||
# Networking options
|
||||
options INET
|
||||
options TCP_COMPAT_42 # compatibility with 4.2BSD TCP/IP
|
||||
#options GATEWAY # IP packet forwarding
|
||||
#options ISO # OSI networking
|
||||
#options TPIP
|
||||
#options EON
|
||||
options COMPAT_09, COMPAT_10
|
||||
options COMPAT_SUNOS
|
||||
|
||||
config netbsd root on nfs swap on nfs
|
||||
|
||||
pseudo-device sl
|
||||
pseudo-device ppp 2
|
||||
pseudo-device loop
|
||||
pseudo-device bpfilter
|
||||
pseudo-device pty
|
||||
|
||||
mainbus0 at root
|
||||
iio0 at mainbus0
|
||||
|
||||
pcc0 at iio0 offset 0x1000
|
||||
zs0 at iio0 offset 0x3000 ipl 4
|
||||
clock0 at iio0 offset 0x07f8 ipl 5
|
||||
le0 at iio0 offset 0x1800 ipl 2
|
||||
@@ -1,114 +0,0 @@
|
||||
/* $Id: iio.c,v 1.1.1.1 1995/10/18 08:51:10 deraadt Exp $ */
|
||||
|
||||
/*
|
||||
*
|
||||
* Copyright (c) 1995 Charles D. Cranor
|
||||
* 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 Charles D. Cranor.
|
||||
* 4. The name of the author may not be used to endorse or promote products
|
||||
* derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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.
|
||||
*/
|
||||
|
||||
/*
|
||||
* peripheral channel controller
|
||||
*/
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <sys/conf.h>
|
||||
#include <sys/ioctl.h>
|
||||
#include <sys/proc.h>
|
||||
#include <sys/user.h>
|
||||
#include <sys/tty.h>
|
||||
#include <sys/uio.h>
|
||||
#include <sys/callout.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/syslog.h>
|
||||
#include <sys/fcntl.h>
|
||||
#include <sys/device.h>
|
||||
#include <machine/cpu.h>
|
||||
#include <dev/cons.h>
|
||||
#include <mvme68k/mvme68k/isr.h>
|
||||
#include <mvme68k/dev/iio.h>
|
||||
|
||||
/*
|
||||
* Configuration routines for the internal I/O bus
|
||||
*/
|
||||
void iioattach __P((struct device *, struct device *, void *));
|
||||
int iiomatch __P((struct device *, void *, void *));
|
||||
|
||||
struct iiosoftc {
|
||||
struct device sc_dev;
|
||||
};
|
||||
|
||||
struct cfdriver iiocd = {
|
||||
NULL, "iio", iiomatch, iioattach,
|
||||
DV_DULL, sizeof(struct iiosoftc), 0
|
||||
};
|
||||
|
||||
int
|
||||
iiomatch(parent, cf, args)
|
||||
struct device *parent;
|
||||
void *cf;
|
||||
void *args;
|
||||
{
|
||||
return (1);
|
||||
}
|
||||
|
||||
void
|
||||
iioattach(parent, self, args)
|
||||
struct device *parent, *self;
|
||||
void *args;
|
||||
{
|
||||
extern struct cfdata cfdata[];
|
||||
extern struct cfdriver pcccd;
|
||||
struct cfdata *cf, *pcccf = NULL;
|
||||
|
||||
printf(" addr 0x%x\n", INTIOBASE);
|
||||
|
||||
/*
|
||||
* attach the pcc first!
|
||||
*/
|
||||
for (cf = cfdata; pcccf==NULL && cf->cf_driver; cf++) {
|
||||
if (cf->cf_driver != &pcccd)
|
||||
continue;
|
||||
pcccf = cf;
|
||||
}
|
||||
if (!pcccf)
|
||||
panic("no pcc device configured");
|
||||
config_attach(self, pcccf, NULL, NULL);
|
||||
|
||||
while (config_found(self, NULL, NULL))
|
||||
;
|
||||
}
|
||||
|
||||
void
|
||||
iio_print(cf)
|
||||
struct cfdata *cf;
|
||||
{
|
||||
printf(" offset 0x%x", cf->cf_loc[0]);
|
||||
if (cf->cf_loc[1] > 0)
|
||||
printf(" ipl %d", cf->cf_loc[1]);
|
||||
}
|
||||
@@ -1,18 +0,0 @@
|
||||
/* $NetBSD: iio.h,v 1.1.1.1 1995/07/25 23:12:11 chuck Exp $ */
|
||||
/* $Id: iio.h,v 1.1.1.1 1995/10/18 08:51:10 deraadt Exp $ */
|
||||
|
||||
struct iioargs {
|
||||
int ic_addr;
|
||||
int ic_lev;
|
||||
};
|
||||
|
||||
#define IIO_CFLOC_ADDR(cf) (IIOV(INTIOBASE + (cf)->cf_loc[0]))
|
||||
#define IIO_CFLOC_LEVEL(cf) ((cf)->cf_loc[1])
|
||||
|
||||
/*
|
||||
* for the console we need zs phys addr
|
||||
*/
|
||||
|
||||
#define ZS0_PHYS (INTIOBASE + 0x3000)
|
||||
#define ZS1_PHYS (INTIOBASE + 0x3800)
|
||||
|
||||
@@ -1,367 +0,0 @@
|
||||
/* $NetBSD: clock.c,v 1.1.1.1 1995/07/25 23:11:56 chuck Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1992, 1993
|
||||
* The Regents of the University of California. All rights reserved.
|
||||
*
|
||||
* This software was developed by the Computer Systems Engineering group
|
||||
* at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and
|
||||
* contributed to Berkeley.
|
||||
*
|
||||
* All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* This product includes software developed by the University of
|
||||
* California, Lawrence Berkeley Laboratory.
|
||||
*
|
||||
* 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 University of
|
||||
* California, Berkeley and its contributors.
|
||||
* 4. 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.
|
||||
*
|
||||
* @(#)clock.c 8.1 (Berkeley) 6/11/93
|
||||
*/
|
||||
|
||||
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/device.h>
|
||||
#include <mvme68k/mvme68k/clockreg.h>
|
||||
#include <mvme68k/dev/iio.h>
|
||||
#include <mvme68k/dev/pccreg.h>
|
||||
|
||||
#include <machine/psl.h>
|
||||
#include <machine/cpu.h>
|
||||
|
||||
#if defined(GPROF)
|
||||
#include <sys/gmon.h>
|
||||
#endif
|
||||
|
||||
struct clocksc {
|
||||
struct device sc_dev;
|
||||
struct clockreg *sc_creg;
|
||||
};
|
||||
|
||||
struct clockreg *RTCbase = NULL;
|
||||
u_char clock_lvl;
|
||||
|
||||
/*
|
||||
* autoconf
|
||||
*/
|
||||
|
||||
void clockattach __P((struct device *, struct device *, void *));
|
||||
int clockmatch __P((struct device *, void *, void *));
|
||||
|
||||
struct cfdriver clockcd = {
|
||||
NULL, "clock", clockmatch, clockattach,
|
||||
DV_DULL, sizeof(struct clocksc), 0
|
||||
};
|
||||
|
||||
void clockintr __P((void *));
|
||||
|
||||
int
|
||||
clockmatch(parent, vcf, args)
|
||||
struct device *parent;
|
||||
void *vcf, *args;
|
||||
{
|
||||
struct cfdata *cf = vcf;
|
||||
|
||||
return RTCbase == NULL && !badbaddr((caddr_t) IIO_CFLOC_ADDR(cf));
|
||||
}
|
||||
|
||||
void
|
||||
clockattach(parent, self, args)
|
||||
struct device *parent, *self;
|
||||
void *args;
|
||||
{
|
||||
iio_print(self->dv_cfdata);
|
||||
|
||||
if (RTCbase)
|
||||
panic("too many clocks configured");
|
||||
|
||||
RTCbase = (struct clockreg *) IIO_CFLOC_ADDR(self->dv_cfdata);
|
||||
clock_lvl = IIO_CFLOC_LEVEL(self->dv_cfdata);
|
||||
if (clock_lvl != CLOCK_LEVEL)
|
||||
panic("wrong interrupt level for clock");
|
||||
pccintr_establish(PCCV_TIMER1, clockintr, clock_lvl, NULL);
|
||||
clock_lvl = clock_lvl | PCC_IENABLE | PCC_TIMERACK;
|
||||
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
/*
|
||||
* clockintr: ack intr and call hardclock
|
||||
*/
|
||||
void
|
||||
clockintr(arg)
|
||||
void *arg;
|
||||
{
|
||||
sys_pcc->t1_int = clock_lvl;
|
||||
hardclock(arg);
|
||||
}
|
||||
|
||||
/*
|
||||
* Set up real-time clock; we don't have a statistics clock at
|
||||
* present.
|
||||
*/
|
||||
cpu_initclocks()
|
||||
{
|
||||
register struct clockreg *rtc = RTCbase;
|
||||
|
||||
if (rtc == NULL)
|
||||
panic("clock not configured");
|
||||
if (hz != 100) {
|
||||
printf("%d Hz clock not available; using 100 Hz\n", hz);
|
||||
hz = 100;
|
||||
}
|
||||
sys_pcc->t1_pload = PCC_TIMER100HZ;
|
||||
sys_pcc->t1_cr = PCC_TIMERCLEAR;
|
||||
sys_pcc->t1_cr = PCC_TIMERSTART;
|
||||
sys_pcc->t1_int = clock_lvl;
|
||||
|
||||
stathz = 0;
|
||||
}
|
||||
|
||||
void
|
||||
setstatclockrate(newhz)
|
||||
int newhz;
|
||||
{
|
||||
}
|
||||
|
||||
void
|
||||
statintr(fp)
|
||||
struct clockframe *fp;
|
||||
{
|
||||
}
|
||||
|
||||
/*
|
||||
* Return the best possible estimate of the time in the timeval
|
||||
* to which tvp points. We do this by returning the current time
|
||||
* plus the amount of time since the last clock interrupt (clock.c:clkread).
|
||||
*
|
||||
* Check that this time is no less than any previously-reported time,
|
||||
* which could happen around the time of a clock adjustment. Just for fun,
|
||||
* we guarantee that the time will be greater than the value obtained by a
|
||||
* previous call.
|
||||
*/
|
||||
|
||||
void microtime(tvp)
|
||||
register struct timeval *tvp;
|
||||
{
|
||||
int s = splhigh();
|
||||
static struct timeval lasttime;
|
||||
|
||||
*tvp = time;
|
||||
tvp->tv_usec;
|
||||
while (tvp->tv_usec > 1000000) {
|
||||
tvp->tv_sec++;
|
||||
tvp->tv_usec -= 1000000;
|
||||
}
|
||||
if (tvp->tv_sec == lasttime.tv_sec &&
|
||||
tvp->tv_usec <= lasttime.tv_usec &&
|
||||
(tvp->tv_usec = lasttime.tv_usec + 1) > 1000000) {
|
||||
tvp->tv_sec++;
|
||||
tvp->tv_usec -= 1000000;
|
||||
}
|
||||
lasttime = *tvp;
|
||||
splx(s);
|
||||
}
|
||||
|
||||
/*
|
||||
* BCD to decimal and decimal to BCD.
|
||||
*/
|
||||
#define FROMBCD(x) (((x) >> 4) * 10 + ((x) & 0xf))
|
||||
#define TOBCD(x) (((x) / 10 * 16) + ((x) % 10))
|
||||
|
||||
#define SECDAY (24 * 60 * 60)
|
||||
#define SECYR (SECDAY * 365)
|
||||
#define LEAPYEAR(y) (((y) & 3) == 0)
|
||||
|
||||
/*
|
||||
* This code is defunct after 2068.
|
||||
* Will Unix still be here then??
|
||||
*/
|
||||
const short dayyr[12] =
|
||||
{ 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 };
|
||||
|
||||
static u_long chiptotime(sec, min, hour, day, mon, year)
|
||||
register int sec, min, hour, day, mon, year;
|
||||
{
|
||||
register int days, yr;
|
||||
|
||||
sec = FROMBCD(sec);
|
||||
min = FROMBCD(min);
|
||||
hour = FROMBCD(hour);
|
||||
day = FROMBCD(day);
|
||||
mon = FROMBCD(mon);
|
||||
year = FROMBCD(year) + YEAR0;
|
||||
|
||||
/* simple sanity checks */
|
||||
if (year < 70 || mon < 1 || mon > 12 || day < 1 || day > 31)
|
||||
return (0);
|
||||
days = 0;
|
||||
for (yr = 70; yr < year; yr++)
|
||||
days += LEAPYEAR(yr) ? 366 : 365;
|
||||
days += dayyr[mon - 1] + day - 1;
|
||||
if (LEAPYEAR(yr) && mon > 2)
|
||||
days++;
|
||||
/* now have days since Jan 1, 1970; the rest is easy... */
|
||||
return (days * SECDAY + hour * 3600 + min * 60 + sec);
|
||||
}
|
||||
|
||||
struct chiptime {
|
||||
int sec;
|
||||
int min;
|
||||
int hour;
|
||||
int wday;
|
||||
int day;
|
||||
int mon;
|
||||
int year;
|
||||
};
|
||||
|
||||
timetochip(c)
|
||||
register struct chiptime *c;
|
||||
{
|
||||
register int t, t2, t3, now = time.tv_sec;
|
||||
|
||||
/* compute the year */
|
||||
t2 = now / SECDAY;
|
||||
t3 = (t2 + 2) % 7; /* day of week */
|
||||
c->wday = TOBCD(t3 + 1);
|
||||
|
||||
t = 69;
|
||||
while (t2 >= 0) { /* whittle off years */
|
||||
t3 = t2;
|
||||
t++;
|
||||
t2 -= LEAPYEAR(t) ? 366 : 365;
|
||||
}
|
||||
c->year = t;
|
||||
|
||||
/* t3 = month + day; separate */
|
||||
t = LEAPYEAR(t);
|
||||
for (t2 = 1; t2 < 12; t2++)
|
||||
if (t3 < dayyr[t2] + (t && t2 > 1))
|
||||
break;
|
||||
|
||||
/* t2 is month */
|
||||
c->mon = t2;
|
||||
c->day = t3 - dayyr[t2 - 1] + 1;
|
||||
if (t && t2 > 2)
|
||||
c->day--;
|
||||
|
||||
/* the rest is easy */
|
||||
t = now % SECDAY;
|
||||
c->hour = t / 3600;
|
||||
t %= 3600;
|
||||
c->min = t / 60;
|
||||
c->sec = t % 60;
|
||||
|
||||
c->sec = TOBCD(c->sec);
|
||||
c->min = TOBCD(c->min);
|
||||
c->hour = TOBCD(c->hour);
|
||||
c->day = TOBCD(c->day);
|
||||
c->mon = TOBCD(c->mon);
|
||||
c->year = TOBCD(c->year - YEAR0);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Set up the system's time, given a `reasonable' time value.
|
||||
*/
|
||||
inittodr(base)
|
||||
time_t base;
|
||||
{
|
||||
register struct clockreg *cl = RTCbase;
|
||||
int sec, min, hour, day, mon, year;
|
||||
int badbase = 0, waszero = base == 0;
|
||||
|
||||
if (base < 5 * SECYR) {
|
||||
/*
|
||||
* If base is 0, assume filesystem time is just unknown
|
||||
* in stead of preposterous. Don't bark.
|
||||
*/
|
||||
if (base != 0)
|
||||
printf("WARNING: preposterous time in file system\n");
|
||||
/* not going to use it anyway, if the chip is readable */
|
||||
base = 21*SECYR + 186*SECDAY + SECDAY/2;
|
||||
badbase = 1;
|
||||
}
|
||||
cl->cl_csr |= CLK_READ; /* enable read (stop time) */
|
||||
sec = cl->cl_sec;
|
||||
min = cl->cl_min;
|
||||
hour = cl->cl_hour;
|
||||
day = cl->cl_mday;
|
||||
mon = cl->cl_month;
|
||||
year = cl->cl_year;
|
||||
cl->cl_csr &= ~CLK_READ; /* time wears on */
|
||||
if ((time.tv_sec = chiptotime(sec, min, hour, day, mon, year)) == 0) {
|
||||
printf("WARNING: bad date in battery clock");
|
||||
/*
|
||||
* Believe the time in the file system for lack of
|
||||
* anything better, resetting the clock.
|
||||
*/
|
||||
time.tv_sec = base;
|
||||
if (!badbase)
|
||||
resettodr();
|
||||
} else {
|
||||
int deltat = time.tv_sec - base;
|
||||
|
||||
if (deltat < 0)
|
||||
deltat = -deltat;
|
||||
if (waszero || deltat < 2 * SECDAY)
|
||||
return;
|
||||
printf("WARNING: clock %s %d days",
|
||||
time.tv_sec < base ? "lost" : "gained", deltat / SECDAY);
|
||||
}
|
||||
printf(" -- CHECK AND RESET THE DATE!\n");
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Reset the clock based on the current time.
|
||||
* Used when the current clock is preposterous, when the time is changed,
|
||||
* and when rebooting. Do nothing if the time is not yet known, e.g.,
|
||||
* when crashing during autoconfig.
|
||||
*/
|
||||
resettodr()
|
||||
{
|
||||
register struct clockreg *cl;
|
||||
struct chiptime c;
|
||||
|
||||
if (!time.tv_sec || (cl = RTCbase) == NULL)
|
||||
return;
|
||||
timetochip(&c);
|
||||
cl->cl_csr |= CLK_WRITE; /* enable write */
|
||||
cl->cl_sec = c.sec;
|
||||
cl->cl_min = c.min;
|
||||
cl->cl_hour = c.hour;
|
||||
cl->cl_wday = c.wday;
|
||||
cl->cl_mday = c.day;
|
||||
cl->cl_month = c.mon;
|
||||
cl->cl_year = c.year;
|
||||
cl->cl_csr &= ~CLK_WRITE; /* load them up */
|
||||
}
|
||||
|
||||
@@ -1,76 +0,0 @@
|
||||
/* $NetBSD: clockreg.h,v 1.1.1.1 1995/07/25 23:11:56 chuck Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1992, 1993
|
||||
* The Regents of the University of California. All rights reserved.
|
||||
*
|
||||
* This software was developed by the Computer Systems Engineering group
|
||||
* at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and
|
||||
* contributed to Berkeley.
|
||||
*
|
||||
* All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* This product includes software developed by the University of
|
||||
* California, Lawrence Berkeley Laboratory.
|
||||
*
|
||||
* 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 University of
|
||||
* California, Berkeley and its contributors.
|
||||
* 4. 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.
|
||||
*
|
||||
* @(#)clockreg.h 8.1 (Berkeley) 6/11/93
|
||||
*/
|
||||
|
||||
/*
|
||||
* Mostek MK48T02 clock.
|
||||
*/
|
||||
struct clockreg {
|
||||
volatile u_char cl_csr; /* control register */
|
||||
volatile u_char cl_sec; /* seconds (0..59; BCD) */
|
||||
volatile u_char cl_min; /* minutes (0..59; BCD) */
|
||||
volatile u_char cl_hour; /* hour (0..23; BCD) */
|
||||
volatile u_char cl_wday; /* weekday (1..7) */
|
||||
volatile u_char cl_mday; /* day in month (1..31; BCD) */
|
||||
volatile u_char cl_month; /* month (1..12; BCD) */
|
||||
volatile u_char cl_year; /* year (0..99; BCD) */
|
||||
};
|
||||
|
||||
/* bits in cl_csr */
|
||||
#define CLK_WRITE 0x80 /* want to write */
|
||||
#define CLK_READ 0x40 /* want to read (freeze clock) */
|
||||
|
||||
/*
|
||||
* Sun chose the year `68' as their base count, so that
|
||||
* cl_year==0 means 1968.
|
||||
*/
|
||||
#define YEAR0 68
|
||||
|
||||
|
||||
/*
|
||||
* interrupt level for clock
|
||||
*/
|
||||
|
||||
#define CLOCK_LEVEL 5
|
||||
@@ -1,47 +0,0 @@
|
||||
/* $NetBSD: isr.h,v 1.1.1.1 1995/07/25 23:11:58 chuck Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1982, 1993
|
||||
* The Regents of the University of California. 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 the University of
|
||||
* California, Berkeley and its contributors.
|
||||
* 4. 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.
|
||||
*
|
||||
* @(#)isr.h 7.1 (Berkeley) 5/8/90
|
||||
*/
|
||||
|
||||
struct isr {
|
||||
struct isr *isr_forw;
|
||||
struct isr *isr_back;
|
||||
int (*isr_intr)();
|
||||
int isr_arg;
|
||||
int isr_ipl;
|
||||
};
|
||||
|
||||
#define NISR 6
|
||||
#define ISRIPL(x) ((x) - 1)
|
||||
@@ -1,29 +0,0 @@
|
||||
void mainbus_attach __P((struct device *, struct device *, void *));
|
||||
int mainbus_match __P((struct device *, void *, void *));
|
||||
|
||||
struct mainbus_softc {
|
||||
struct device sc_dev;
|
||||
};
|
||||
|
||||
struct cfdriver mainbus_cd = {
|
||||
NULL, "mainbus_", mainbus_match, mainbus_attach,
|
||||
DV_DULL, sizeof(struct mainbus_softc), 0
|
||||
};
|
||||
|
||||
int
|
||||
mainbus_match(parent, cf, args)
|
||||
struct device *parent;
|
||||
void *cf;
|
||||
void *args;
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
void
|
||||
mainbus_attach(parent, self, args)
|
||||
struct device *parent, *self;
|
||||
void *args;
|
||||
{
|
||||
while (config_found(self, NULL, NULL))
|
||||
;
|
||||
}
|
||||
@@ -1,177 +0,0 @@
|
||||
/* $NetBSD: exec.c,v 1.1.1.1.2.1 1995/10/12 22:47:56 chuck Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c) 1982, 1986, 1990, 1993
|
||||
* The Regents of the University of California. 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 the University of
|
||||
* California, Berkeley and its contributors.
|
||||
* 4. 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.
|
||||
*
|
||||
* @(#)boot.c 8.1 (Berkeley) 6/10/93
|
||||
*/
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <a.out.h>
|
||||
|
||||
#include "stand.h"
|
||||
|
||||
extern int debug;
|
||||
|
||||
/*ARGSUSED*/
|
||||
int
|
||||
exec_mvme(file, loadaddr, boothowto)
|
||||
char *file;
|
||||
char *loadaddr;
|
||||
int boothowto;
|
||||
{
|
||||
register int io;
|
||||
struct exec x;
|
||||
int cc, magic;
|
||||
void (*entry)();
|
||||
register char *cp;
|
||||
register int *ip;
|
||||
|
||||
#ifdef DEBUG
|
||||
printf("exec: file=%s loadaddr=0x%x\n", file, loadaddr);
|
||||
#endif
|
||||
|
||||
io = open(file, 0);
|
||||
if (io < 0)
|
||||
return(-1);
|
||||
|
||||
/*
|
||||
* Read in the exec header, and validate it.
|
||||
*/
|
||||
if (read(io, (char *)&x, sizeof(x)) != sizeof(x))
|
||||
goto shread;
|
||||
if (N_BADMAG(x)) {
|
||||
errno = EFTYPE;
|
||||
goto closeout;
|
||||
}
|
||||
|
||||
cp = loadaddr;
|
||||
magic = N_GETMAGIC(x);
|
||||
if (magic == ZMAGIC)
|
||||
cp += sizeof(x);
|
||||
entry = (void (*)())x.a_entry;
|
||||
|
||||
/*
|
||||
* Leave a copy of the exec header before the text.
|
||||
* The kernel may use this to verify that the
|
||||
* symbols were loaded by this boot program.
|
||||
*/
|
||||
bcopy(&x, cp - sizeof(x), sizeof(x));
|
||||
|
||||
/*
|
||||
* Read in the text segment.
|
||||
*/
|
||||
printf("%d", x.a_text);
|
||||
if (read(io, cp, x.a_text) != x.a_text)
|
||||
goto shread;
|
||||
cp += x.a_text;
|
||||
|
||||
/*
|
||||
* NMAGIC may have a gap between text and data.
|
||||
*/
|
||||
if (magic == NMAGIC) {
|
||||
register int mask = N_PAGSIZ(x) - 1;
|
||||
while ((int)cp & mask)
|
||||
*cp++ = 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Read in the data segment.
|
||||
*/
|
||||
printf("+%d", x.a_data);
|
||||
if (read(io, cp, x.a_data) != x.a_data)
|
||||
goto shread;
|
||||
cp += x.a_data;
|
||||
|
||||
/*
|
||||
* Zero out the BSS section.
|
||||
* (Kernel doesn't care, but do it anyway.)
|
||||
*/
|
||||
printf("+%d", x.a_bss);
|
||||
cc = x.a_bss;
|
||||
while ((int)cp & 3) {
|
||||
*cp++ = 0;
|
||||
--cc;
|
||||
}
|
||||
ip = (int*)cp;
|
||||
cp += cc;
|
||||
while ((char*)ip < cp)
|
||||
*ip++ = 0;
|
||||
|
||||
/*
|
||||
* Read in the symbol table and strings.
|
||||
* (Always set the symtab size word.)
|
||||
*/
|
||||
*ip++ = x.a_syms;
|
||||
cp = (char*) ip;
|
||||
|
||||
if (x.a_syms > 0) {
|
||||
|
||||
/* Symbol table and string table length word. */
|
||||
cc = x.a_syms;
|
||||
printf("+[%d", cc);
|
||||
cc += sizeof(int); /* strtab length too */
|
||||
if (read(io, cp, cc) != cc)
|
||||
goto shread;
|
||||
cp += x.a_syms;
|
||||
ip = (int*)cp; /* points to strtab length */
|
||||
cp += sizeof(int);
|
||||
|
||||
/* String table. Length word includes itself. */
|
||||
cc = *ip;
|
||||
printf("+%d]", cc);
|
||||
cc -= sizeof(int);
|
||||
if (cc <= 0)
|
||||
goto shread;
|
||||
if (read(io, cp, cc) != cc)
|
||||
goto shread;
|
||||
cp += cc;
|
||||
}
|
||||
printf("=0x%x\n", cp - loadaddr);
|
||||
close(io);
|
||||
|
||||
if (debug) {
|
||||
printf("Debug mode - enter c to continue\n");
|
||||
asm(" trap #0");
|
||||
}
|
||||
|
||||
printf("Start @ 0x%x ...\n", (int)entry);
|
||||
(*entry)(boothowto);
|
||||
panic("exec returned");
|
||||
|
||||
shread:
|
||||
printf("exec: short read\n");
|
||||
errno = EIO;
|
||||
closeout:
|
||||
close(io);
|
||||
return(-1);
|
||||
}
|
||||
@@ -1,176 +0,0 @@
|
||||
/* $NetBSD: if_lereg.h,v 1.1.1.1 1995/07/25 23:12:23 chuck Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c) 1982, 1992, 1993
|
||||
* The Regents of the University of California. 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 the University of
|
||||
* California, Berkeley and its contributors.
|
||||
* 4. 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_lereg.h 8.2 (Berkeley) 10/30/93
|
||||
*/
|
||||
|
||||
#define LEMTU 1518
|
||||
#define LEMINSIZE 60 /* should be 64 if mode DTCR is set */
|
||||
#define LERBUF 8
|
||||
#define LERBUFLOG2 3
|
||||
#define LE_RLEN (LERBUFLOG2 << 13)
|
||||
#define LETBUF 1
|
||||
#define LETBUFLOG2 0
|
||||
#define LE_TLEN (LETBUFLOG2 << 13)
|
||||
|
||||
/* Local Area Network Controller for Ethernet (LANCE) registers */
|
||||
struct lereg1 {
|
||||
volatile u_short ler1_rdp; /* register data port */
|
||||
volatile u_short ler1_rap; /* register address port */
|
||||
};
|
||||
|
||||
/* register addresses */
|
||||
#define LE_CSR0 0 /* Control and status register */
|
||||
#define LE_CSR1 1 /* low address of init block */
|
||||
#define LE_CSR2 2 /* high address of init block */
|
||||
#define LE_CSR3 3 /* Bus master and control */
|
||||
|
||||
/* Control and status register 0 (csr0) */
|
||||
#define LE_C0_ERR 0x8000 /* error summary */
|
||||
#define LE_C0_BABL 0x4000 /* transmitter timeout error */
|
||||
#define LE_C0_CERR 0x2000 /* collision */
|
||||
#define LE_C0_MISS 0x1000 /* missed a packet */
|
||||
#define LE_C0_MERR 0x0800 /* memory error */
|
||||
#define LE_C0_RINT 0x0400 /* receiver interrupt */
|
||||
#define LE_C0_TINT 0x0200 /* transmitter interrupt */
|
||||
#define LE_C0_IDON 0x0100 /* initalization done */
|
||||
#define LE_C0_INTR 0x0080 /* interrupt condition */
|
||||
#define LE_C0_INEA 0x0040 /* interrupt enable */
|
||||
#define LE_C0_RXON 0x0020 /* receiver on */
|
||||
#define LE_C0_TXON 0x0010 /* transmitter on */
|
||||
#define LE_C0_TDMD 0x0008 /* transmit demand */
|
||||
#define LE_C0_STOP 0x0004 /* disable all external activity */
|
||||
#define LE_C0_STRT 0x0002 /* enable external activity */
|
||||
#define LE_C0_INIT 0x0001 /* begin initalization */
|
||||
|
||||
#define LE_C0_BITS \
|
||||
"\20\20ERR\17BABL\16CERR\15MISS\14MERR\13RINT\
|
||||
\12TINT\11IDON\10INTR\07INEA\06RXON\05TXON\04TDMD\03STOP\02STRT\01INIT"
|
||||
|
||||
/* Control and status register 3 (csr3) */
|
||||
#define LE_C3_BSWP 0x4 /* byte swap */
|
||||
#define LE_C3_ACON 0x2 /* ALE control, eh? */
|
||||
#define LE_C3_BCON 0x1 /* byte control */
|
||||
/*
|
||||
* Current size is 13,758 bytes with 8 x 1518 receive buffers and
|
||||
* 1 x 1518 transmit buffer.
|
||||
*/
|
||||
struct lereg2 {
|
||||
/* initialization block */
|
||||
volatile u_short ler2_mode; /* mode */
|
||||
volatile u_char ler2_padr[6]; /* physical address */
|
||||
#ifdef new_code
|
||||
volatile u_short ler2_ladrf[4]; /* logical address filter */
|
||||
#else
|
||||
volatile u_long ler2_ladrf0; /* logical address filter */
|
||||
volatile u_long ler2_ladrf1; /* logical address filter */
|
||||
#endif
|
||||
volatile u_short ler2_rdra; /* receive descriptor addr */
|
||||
volatile u_short ler2_rlen; /* rda high and ring size */
|
||||
volatile u_short ler2_tdra; /* transmit descriptor addr */
|
||||
volatile u_short ler2_tlen; /* tda high and ring size */
|
||||
/* receive message descriptors. bits/hadr are byte order dependent. */
|
||||
struct lermd {
|
||||
volatile u_short rmd0; /* low address of packet */
|
||||
volatile u_char rmd1_bits; /* descriptor bits */
|
||||
volatile u_char rmd1_hadr; /* high address of packet */
|
||||
volatile short rmd2; /* buffer byte count */
|
||||
volatile u_short rmd3; /* message byte count */
|
||||
} ler2_rmd[LERBUF];
|
||||
/* transmit message descriptors */
|
||||
struct letmd {
|
||||
volatile u_short tmd0; /* low address of packet */
|
||||
volatile u_char tmd1_bits; /* descriptor bits */
|
||||
volatile u_char tmd1_hadr; /* high address of packet */
|
||||
volatile short tmd2; /* buffer byte count */
|
||||
volatile u_short tmd3; /* transmit error bits */
|
||||
} ler2_tmd[LETBUF];
|
||||
volatile char ler2_rbuf[LERBUF][LEMTU];
|
||||
volatile char ler2_tbuf[LETBUF][LEMTU];
|
||||
};
|
||||
|
||||
/* Initialzation block (mode) */
|
||||
#define LE_MODE_PROM 0x8000 /* promiscuous mode */
|
||||
/* 0x7f80 reserved, must be zero */
|
||||
#define LE_MODE_INTL 0x0040 /* internal loopback */
|
||||
#define LE_MODE_DRTY 0x0020 /* disable retry */
|
||||
#define LE_MODE_COLL 0x0010 /* force a collision */
|
||||
#define LE_MODE_DTCR 0x0008 /* disable transmit CRC */
|
||||
#define LE_MODE_LOOP 0x0004 /* loopback mode */
|
||||
#define LE_MODE_DTX 0x0002 /* disable transmitter */
|
||||
#define LE_MODE_DRX 0x0001 /* disable receiver */
|
||||
#define LE_MODE_NORMAL 0 /* none of the above */
|
||||
|
||||
|
||||
/* Receive message descriptor 1 (rmd1_bits) */
|
||||
#define LE_R1_OWN 0x80 /* LANCE owns the packet */
|
||||
#define LE_R1_ERR 0x40 /* error summary */
|
||||
#define LE_R1_FRAM 0x20 /* framing error */
|
||||
#define LE_R1_OFLO 0x10 /* overflow error */
|
||||
#define LE_R1_CRC 0x08 /* CRC error */
|
||||
#define LE_R1_BUFF 0x04 /* buffer error */
|
||||
#define LE_R1_STP 0x02 /* start of packet */
|
||||
#define LE_R1_ENP 0x01 /* end of packet */
|
||||
|
||||
#define LE_R1_BITS \
|
||||
"\20\10OWN\7ERR\6FRAM\5OFLO\4CRC\3BUFF\2STP\1ENP"
|
||||
|
||||
/* Transmit message descriptor 1 (tmd1_bits) */
|
||||
#define LE_T1_OWN 0x80 /* LANCE owns the packet */
|
||||
#define LE_T1_ERR 0x40 /* error summary */
|
||||
#define LE_T1_MORE 0x10 /* multiple collisions */
|
||||
#define LE_T1_ONE 0x08 /* single collision */
|
||||
#define LE_T1_DEF 0x04 /* defferred transmit */
|
||||
#define LE_T1_STP 0x02 /* start of packet */
|
||||
#define LE_T1_ENP 0x01 /* end of packet */
|
||||
|
||||
#define LE_T1_BITS \
|
||||
"\20\10OWN\7ERR\6RES\5MORE\4ONE\3DEF\2STP\1ENP"
|
||||
|
||||
/* Transmit message descriptor 3 (tmd3) */
|
||||
#define LE_T3_BUFF 0x8000 /* buffer error */
|
||||
#define LE_T3_UFLO 0x4000 /* underflow error */
|
||||
#define LE_T3_LCOL 0x1000 /* late collision */
|
||||
#define LE_T3_LCAR 0x0800 /* loss of carrier */
|
||||
#define LE_T3_RTRY 0x0400 /* retry error */
|
||||
#define LE_T3_TDR_MASK 0x03ff /* time domain reflectometry counter */
|
||||
|
||||
#define LE_XMD2_ONES 0xf000
|
||||
|
||||
#define LE_T3_BITS \
|
||||
"\20\20BUFF\17UFLO\16RES\15LCOL\14LCAR\13RTRY"
|
||||
|
||||
|
||||
#define LE_ADDR_LOW_MASK (0xffff)
|
||||
|
||||
@@ -1,154 +0,0 @@
|
||||
/* $NetBSD: machdep.c,v 1.1.1.1 1995/07/25 23:12:22 chuck Exp $ */
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/exec.h>
|
||||
|
||||
#include <sys/reboot.h>
|
||||
|
||||
#include "config.h"
|
||||
|
||||
/*
|
||||
* get_boothowto: boothowto for kernel
|
||||
*/
|
||||
|
||||
static int get_boothowto(cmd_flags)
|
||||
|
||||
char *cmd_flags;
|
||||
|
||||
{
|
||||
int result = 0;
|
||||
|
||||
if (cmd_flags == NULL) return(0);
|
||||
|
||||
while (*cmd_flags) {
|
||||
switch (*cmd_flags) {
|
||||
case 's': result |= RB_SINGLE; break;
|
||||
case 'a': result |= RB_ASKNAME; break;
|
||||
default: break;
|
||||
}
|
||||
cmd_flags++;
|
||||
}
|
||||
|
||||
return(result);
|
||||
}
|
||||
|
||||
/*
|
||||
* cmd_parse: parse command line
|
||||
* expected format: "b[oot] [kernel_name] [-flags]"
|
||||
*/
|
||||
|
||||
char *cmd_parse(cmd_buf, howto)
|
||||
char *cmd_buf;
|
||||
int *howto;
|
||||
{
|
||||
char *cmd_kernel, *cmd_flags;
|
||||
u_char *cp;
|
||||
*howto = 0;
|
||||
|
||||
cp = cmd_buf+1; /* skip 'b' */
|
||||
while (*cp && *cp != ' ') cp++; /* skip to end or space */
|
||||
while (*cp == ' ') cp++; /* skip spaces */
|
||||
if (*cp == '\0') return(NULL); /* no args */
|
||||
if (*cp == '-') { /* only flags? */
|
||||
*howto = get_boothowto(cp);
|
||||
return(NULL);
|
||||
}
|
||||
cmd_kernel = cp; /* got kernel name */
|
||||
while (*cp && *cp != ' ') cp++; /* skip to end or space */
|
||||
if (*cp == ' ') *cp++ = 0; /* null terminate kernel */
|
||||
while (*cp == ' ') cp++; /* skip spaces */
|
||||
if (*cp == '\0') return(cmd_kernel); /* no flags */
|
||||
if (*cp != '-') return(cmd_kernel); /* garbage flags */
|
||||
cmd_flags = cp; /* save flags */
|
||||
|
||||
while (*cp && *cp != ' ') cp++; /* skip to end or space */
|
||||
if (*cp == ' ') *cp++ = 0; /* null terminate flags */
|
||||
|
||||
*howto = get_boothowto(cmd_flags);
|
||||
|
||||
return(cmd_kernel);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* machdep_common_ether: get ethernet address
|
||||
*/
|
||||
|
||||
void machdep_common_ether(ether)
|
||||
unsigned char *ether;
|
||||
{
|
||||
caddr_t addr;
|
||||
int *ea = (int *) ETHER_ADDR;
|
||||
int e = *ea;
|
||||
if (( e & 0x2fffff00 ) == 0x2fffff00)
|
||||
panic("ERROR: ethernet address not set!\r\n");
|
||||
ether[0] = 0x08;
|
||||
ether[1] = 0x00;
|
||||
ether[2] = 0x3e;
|
||||
e = e >> 8;
|
||||
ether[5] = e & 0xff;
|
||||
e = e >> 8;
|
||||
ether[4] = e & 0xff;
|
||||
e = e >> 8;
|
||||
ether[3] = e;
|
||||
}
|
||||
|
||||
/*
|
||||
* console i/o
|
||||
*/
|
||||
|
||||
/*
|
||||
* hardware
|
||||
*/
|
||||
|
||||
struct zs_hw {
|
||||
volatile u_char ctl;
|
||||
volatile u_char data;
|
||||
};
|
||||
|
||||
struct zs_hw *zs = (struct zs_hw *)CONS_ZS_ADDR;
|
||||
|
||||
/*
|
||||
* putchar: put char to console
|
||||
*/
|
||||
|
||||
void putchar(char c)
|
||||
{
|
||||
if (c == '\n') putchar('\r');
|
||||
zs->ctl = 0;
|
||||
while ((zs->ctl & 0x04) == 0) {
|
||||
zs->ctl = 0;
|
||||
}
|
||||
zs->ctl = 8;
|
||||
zs->ctl = c;
|
||||
}
|
||||
|
||||
/*
|
||||
* getchar: get char from console
|
||||
*/
|
||||
|
||||
int
|
||||
getchar()
|
||||
{
|
||||
int i;
|
||||
while (1) {
|
||||
zs->ctl = 0;
|
||||
if ((zs->ctl & 0x1) != 0) break;
|
||||
for (i = 100 ; i > 0 ; i--)
|
||||
;
|
||||
}
|
||||
zs->ctl = 8;
|
||||
return(zs->ctl);
|
||||
}
|
||||
|
||||
/*
|
||||
* peekchar
|
||||
*/
|
||||
|
||||
peekchar()
|
||||
{
|
||||
zs->ctl = 0;
|
||||
return(zs->ctl & 0x1);
|
||||
}
|
||||
|
||||
@@ -1,531 +0,0 @@
|
||||
/* $NetBSD: netif.c,v 1.1.1.1.2.1 1995/10/12 22:47:57 chuck Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1995 Gordon W. Ross
|
||||
* 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. The name of the author may not be used to endorse or promote products
|
||||
* derived from this software without specific prior written permission.
|
||||
* 4. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* This product includes software developed by Gordon W. Ross
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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 <sys/param.h>
|
||||
#include <sys/socket.h>
|
||||
#include <string.h>
|
||||
#include <time.h>
|
||||
|
||||
#include <net/if.h>
|
||||
|
||||
#include <netinet/in.h>
|
||||
#include <netinet/if_ether.h>
|
||||
#include <netinet/in_systm.h>
|
||||
|
||||
#include "stand.h"
|
||||
#include "net.h"
|
||||
#include "netif.h"
|
||||
#include "config.h"
|
||||
|
||||
static struct netif netif_prom;
|
||||
void machdep_common_ether __P((u_char *));
|
||||
|
||||
#ifdef NETIF_DEBUG
|
||||
int netif_debug;
|
||||
#endif
|
||||
|
||||
struct iodesc sockets[SOPEN_MAX];
|
||||
|
||||
struct iodesc *
|
||||
socktodesc(sock)
|
||||
int sock;
|
||||
{
|
||||
if (sock != 0) {
|
||||
return(NULL);
|
||||
}
|
||||
return (sockets);
|
||||
}
|
||||
|
||||
int
|
||||
netif_open(machdep_hint)
|
||||
void *machdep_hint;
|
||||
{
|
||||
struct saioreq *si;
|
||||
struct iodesc *io;
|
||||
int error;
|
||||
|
||||
/* find a free socket */
|
||||
io = sockets;
|
||||
if (io->io_netif) {
|
||||
#ifdef DEBUG
|
||||
printf("netif_open: device busy\n");
|
||||
#endif
|
||||
return (-1);
|
||||
}
|
||||
bzero(io, sizeof(*io));
|
||||
|
||||
if ((netif_prom.devdata = le_init(io)) == NULL) {
|
||||
printf("le_init failed\n");
|
||||
return(-1);
|
||||
}
|
||||
|
||||
io->io_netif = &netif_prom;
|
||||
|
||||
return(0);
|
||||
}
|
||||
|
||||
int
|
||||
netif_close(fd)
|
||||
int fd;
|
||||
{
|
||||
struct iodesc *io;
|
||||
struct netif *ni;
|
||||
|
||||
if (fd != 0) {
|
||||
errno = EBADF;
|
||||
return(-1);
|
||||
}
|
||||
|
||||
io = sockets;
|
||||
ni = io->io_netif;
|
||||
if (ni != NULL) {
|
||||
le_end(ni);
|
||||
ni->devdata = NULL;
|
||||
io->io_netif = NULL;
|
||||
}
|
||||
return(0);
|
||||
}
|
||||
|
||||
/*
|
||||
* Send a packet. The ether header is already there.
|
||||
* Return the length sent (or -1 on error).
|
||||
*/
|
||||
int
|
||||
netif_put(desc, pkt, len)
|
||||
struct iodesc *desc;
|
||||
void *pkt;
|
||||
size_t len;
|
||||
{
|
||||
|
||||
#ifdef NETIF_DEBUG
|
||||
if (netif_debug) {
|
||||
struct ether_header *eh;
|
||||
|
||||
printf("netif_put: desc=0x%x pkt=0x%x len=%d\n",
|
||||
desc, pkt, len);
|
||||
eh = pkt;
|
||||
printf("dst: %s ", ether_sprintf(eh->ether_dhost));
|
||||
printf("src: %s ", ether_sprintf(eh->ether_shost));
|
||||
printf("type: 0x%x\n", eh->ether_type & 0xFFFF);
|
||||
}
|
||||
#endif
|
||||
|
||||
return(le_put(desc, pkt, len));
|
||||
}
|
||||
|
||||
/*
|
||||
* Receive a packet, including the ether header.
|
||||
* Return the total length received (or -1 on error).
|
||||
*/
|
||||
int
|
||||
netif_get(desc, pkt, maxlen, timo)
|
||||
struct iodesc *desc;
|
||||
void *pkt;
|
||||
size_t maxlen;
|
||||
time_t timo;
|
||||
{
|
||||
struct saioreq *si;
|
||||
struct saif *sif;
|
||||
char *dmabuf;
|
||||
int tick0, tmo_ticks;
|
||||
int len;
|
||||
|
||||
#ifdef NETIF_DEBUG
|
||||
if (netif_debug)
|
||||
printf("netif_get: pkt=0x%x, maxlen=%d, tmo=%d\n",
|
||||
pkt, maxlen, timo);
|
||||
#endif
|
||||
|
||||
len = le_get(desc, pkt, maxlen, timo);
|
||||
|
||||
#ifdef NETIF_DEBUG
|
||||
if (netif_debug) {
|
||||
struct ether_header *eh = pkt;
|
||||
|
||||
printf("dst: %s ", ether_sprintf(eh->ether_dhost));
|
||||
printf("src: %s ", ether_sprintf(eh->ether_shost));
|
||||
printf("type: 0x%x\n", eh->ether_type & 0xFFFF);
|
||||
}
|
||||
#endif
|
||||
|
||||
return len;
|
||||
}
|
||||
|
||||
/* the rest of this file imported from le_poll.c */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1993 Adam Glass
|
||||
* 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 Adam Glass.
|
||||
* 4. The name of the Author may not be used to endorse or promote products
|
||||
* derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY Adam Glass ``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.
|
||||
*/
|
||||
|
||||
#include "if_lereg.h"
|
||||
|
||||
struct {
|
||||
struct lereg1 *sc_r1; /* LANCE registers */
|
||||
struct lereg2 *sc_r2; /* RAM */
|
||||
int next_rmd;
|
||||
int next_tmd;
|
||||
} le_softc;
|
||||
|
||||
int le_debug = 0;
|
||||
|
||||
/*
|
||||
* init le device. return 0 on failure, 1 if ok.
|
||||
*/
|
||||
|
||||
void *
|
||||
le_init(io)
|
||||
struct iodesc *io;
|
||||
{
|
||||
u_long *eram = (u_long *) ERAM_ADDR;
|
||||
|
||||
if (le_debug)
|
||||
printf("le: le_init called\n");
|
||||
machdep_common_ether(io->myea);
|
||||
bzero(&le_softc, sizeof(le_softc));
|
||||
le_softc.sc_r1 = (struct lereg1 *) LANCE_REG_ADDR;
|
||||
le_softc.sc_r2 = (struct lereg2 *) (*eram - (1024*1024));
|
||||
le_reset(io->io_netif, io->myea);
|
||||
|
||||
return(&le_softc);
|
||||
}
|
||||
|
||||
/*
|
||||
* close device
|
||||
* XXX le_softc
|
||||
*/
|
||||
|
||||
void le_end(nif)
|
||||
|
||||
struct netif *nif;
|
||||
{
|
||||
struct lereg1 *ler1 = le_softc.sc_r1;
|
||||
|
||||
if (le_debug)
|
||||
printf("le: le_end called\n");
|
||||
ler1->ler1_rap = LE_CSR0;
|
||||
ler1->ler1_rdp = LE_C0_STOP;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* reset device
|
||||
* XXX le_softc
|
||||
*/
|
||||
|
||||
void le_reset(nif, myea)
|
||||
struct netif *nif;
|
||||
u_char *myea;
|
||||
{
|
||||
struct lereg1 *ler1 = le_softc.sc_r1;
|
||||
struct lereg2 *ler2 = le_softc.sc_r2;
|
||||
unsigned int a;
|
||||
int timo = 100000, stat, i;
|
||||
|
||||
if (le_debug)
|
||||
printf("le: le_reset called\n");
|
||||
ler1->ler1_rap = LE_CSR0;
|
||||
ler1->ler1_rdp = LE_C0_STOP; /* do nothing until we are finished */
|
||||
|
||||
bzero(ler2, sizeof(*ler2));
|
||||
|
||||
ler2->ler2_mode = LE_MODE_NORMAL;
|
||||
ler2->ler2_padr[0] = myea[1];
|
||||
ler2->ler2_padr[1] = myea[0];
|
||||
ler2->ler2_padr[2] = myea[3];
|
||||
ler2->ler2_padr[3] = myea[2];
|
||||
ler2->ler2_padr[4] = myea[5];
|
||||
ler2->ler2_padr[5] = myea[4];
|
||||
|
||||
|
||||
ler2->ler2_ladrf0 = 0;
|
||||
ler2->ler2_ladrf1 = 0;
|
||||
|
||||
a = (u_int)ler2->ler2_rmd;
|
||||
ler2->ler2_rlen = LE_RLEN | (a >> 16);
|
||||
ler2->ler2_rdra = a & LE_ADDR_LOW_MASK;
|
||||
|
||||
a = (u_int)ler2->ler2_tmd;
|
||||
ler2->ler2_tlen = LE_TLEN | (a >> 16);
|
||||
ler2->ler2_tdra = a & LE_ADDR_LOW_MASK;
|
||||
|
||||
ler1->ler1_rap = LE_CSR1;
|
||||
a = (u_int)ler2;
|
||||
ler1->ler1_rdp = a & LE_ADDR_LOW_MASK;
|
||||
ler1->ler1_rap = LE_CSR2;
|
||||
ler1->ler1_rdp = a >> 16;
|
||||
|
||||
for (i = 0; i < LERBUF; i++) {
|
||||
a = (u_int)&ler2->ler2_rbuf[i];
|
||||
ler2->ler2_rmd[i].rmd0 = a & LE_ADDR_LOW_MASK;
|
||||
ler2->ler2_rmd[i].rmd1_bits = LE_R1_OWN;
|
||||
ler2->ler2_rmd[i].rmd1_hadr = a >> 16;
|
||||
ler2->ler2_rmd[i].rmd2 = -LEMTU;
|
||||
ler2->ler2_rmd[i].rmd3 = 0;
|
||||
}
|
||||
for (i = 0; i < LETBUF; i++) {
|
||||
a = (u_int)&ler2->ler2_tbuf[i];
|
||||
ler2->ler2_tmd[i].tmd0 = a & LE_ADDR_LOW_MASK;
|
||||
ler2->ler2_tmd[i].tmd1_bits = 0;
|
||||
ler2->ler2_tmd[i].tmd1_hadr = a >> 16;
|
||||
ler2->ler2_tmd[i].tmd2 = 0;
|
||||
ler2->ler2_tmd[i].tmd3 = 0;
|
||||
}
|
||||
|
||||
ler1->ler1_rap = LE_CSR3;
|
||||
ler1->ler1_rdp = LE_C3_BSWP;
|
||||
|
||||
ler1->ler1_rap = LE_CSR0;
|
||||
ler1->ler1_rdp = LE_C0_INIT;
|
||||
do {
|
||||
if (--timo == 0) {
|
||||
printf("le: init timeout, stat = 0x%x\n", stat);
|
||||
break;
|
||||
}
|
||||
stat = ler1->ler1_rdp;
|
||||
} while ((stat & LE_C0_IDON) == 0);
|
||||
|
||||
ler1->ler1_rdp = LE_C0_IDON;
|
||||
le_softc.next_rmd = 0;
|
||||
le_softc.next_tmd = 0;
|
||||
ler1->ler1_rap = LE_CSR0;
|
||||
ler1->ler1_rdp = LE_C0_STRT;
|
||||
}
|
||||
|
||||
/*
|
||||
* le_error
|
||||
* XXX le_softc
|
||||
*/
|
||||
|
||||
void le_error(nif, str, vler1)
|
||||
struct netif *nif;
|
||||
char *str;
|
||||
volatile void *vler1;
|
||||
{
|
||||
volatile struct lereg1 *ler1 = vler1;
|
||||
/* ler1->ler1_rap = LE_CSRO done in caller */
|
||||
if (ler1->ler1_rdp & LE_C0_BABL)
|
||||
panic("le: been babbling, found by '%s'\n", str);
|
||||
if (ler1->ler1_rdp & LE_C0_CERR) {
|
||||
ler1->ler1_rdp = LE_C0_CERR;
|
||||
}
|
||||
if (ler1->ler1_rdp & LE_C0_MISS) {
|
||||
ler1->ler1_rdp = LE_C0_MISS;
|
||||
}
|
||||
if (ler1->ler1_rdp & LE_C0_MERR) {
|
||||
printf("le: memory error in '%s'\n", str);
|
||||
panic("memory error");
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* put a packet
|
||||
* XXX le_softc
|
||||
*/
|
||||
|
||||
int le_put(desc, pkt, len)
|
||||
struct iodesc *desc;
|
||||
void *pkt;
|
||||
int len;
|
||||
{
|
||||
volatile struct lereg1 *ler1 = le_softc.sc_r1;
|
||||
volatile struct lereg2 *ler2 = le_softc.sc_r2;
|
||||
volatile struct letmd *tmd;
|
||||
int timo = 100000, stat, i;
|
||||
unsigned int a;
|
||||
|
||||
ler1->ler1_rap = LE_CSR0;
|
||||
if (ler1->ler1_rdp & LE_C0_ERR)
|
||||
le_error(desc->io_netif, "le_put(way before xmit)", ler1);
|
||||
tmd = &ler2->ler2_tmd[le_softc.next_tmd];
|
||||
while(tmd->tmd1_bits & LE_T1_OWN) {
|
||||
printf("le: output buffer busy\n");
|
||||
}
|
||||
bcopy(pkt, ler2->ler2_tbuf[le_softc.next_tmd], len);
|
||||
if (len < 64)
|
||||
tmd->tmd2 = -64;
|
||||
else
|
||||
tmd->tmd2 = -len;
|
||||
tmd->tmd3 = 0;
|
||||
if (ler1->ler1_rdp & LE_C0_ERR)
|
||||
le_error(desc->io_netif, "le_put(before xmit)", ler1);
|
||||
tmd->tmd1_bits = LE_T1_STP | LE_T1_ENP | LE_T1_OWN;
|
||||
a = (u_int)&ler2->ler2_tbuf[le_softc.next_tmd];
|
||||
tmd->tmd0 = a & LE_ADDR_LOW_MASK;
|
||||
tmd->tmd1_hadr = a >> 16;
|
||||
ler1->ler1_rdp = LE_C0_TDMD;
|
||||
if (ler1->ler1_rdp & LE_C0_ERR)
|
||||
le_error(desc->io_netif, "le_put(after xmit)", ler1);
|
||||
do {
|
||||
if (--timo == 0) {
|
||||
printf("le: transmit timeout, stat = 0x%x\n", stat);
|
||||
if (ler1->ler1_rdp & LE_C0_ERR)
|
||||
le_error(desc->io_netif, "le_put(timeout)", ler1);
|
||||
break;
|
||||
}
|
||||
stat = ler1->ler1_rdp;
|
||||
} while ((stat & LE_C0_TINT) == 0);
|
||||
ler1->ler1_rdp = LE_C0_TINT;
|
||||
if (ler1->ler1_rdp & LE_C0_ERR) {
|
||||
if ((ler1->ler1_rdp & (LE_C0_BABL|LE_C0_CERR|LE_C0_MISS|LE_C0_MERR)) !=
|
||||
LE_C0_CERR)
|
||||
printf("le_put: xmit error, buf %d\n", le_softc.next_tmd);
|
||||
le_error(desc->io_netif, "le_put(xmit error)", ler1);
|
||||
}
|
||||
le_softc.next_tmd = 0;
|
||||
/* (le_softc.next_tmd == (LETBUF - 1)) ? 0 : le_softc.next_tmd + 1;*/
|
||||
if (tmd->tmd1_bits & LE_T1_ERR) {
|
||||
printf("le: transmit error, error = 0x%x\n", tmd->tmd3);
|
||||
return -1;
|
||||
}
|
||||
if (le_debug) {
|
||||
printf("le: le_put() successful: sent %d\n", len);
|
||||
printf("le: le_put(): tmd1_bits: %x tmd3: %x\n",
|
||||
(unsigned int) tmd->tmd1_bits,
|
||||
(unsigned int) tmd->tmd3);
|
||||
}
|
||||
return len;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* le_get
|
||||
*/
|
||||
|
||||
int le_get(desc, pkt, len, timeout)
|
||||
struct iodesc *desc;
|
||||
void *pkt;
|
||||
int len;
|
||||
time_t timeout;
|
||||
{
|
||||
time_t t;
|
||||
int cc;
|
||||
|
||||
t = getsecs();
|
||||
cc = 0;
|
||||
while (((getsecs() - t) < timeout) && !cc) {
|
||||
cc = le_poll(desc, pkt, len);
|
||||
}
|
||||
return cc;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* le_poll
|
||||
* XXX softc
|
||||
*/
|
||||
|
||||
int le_poll(desc, pkt, len)
|
||||
struct iodesc *desc;
|
||||
void *pkt;
|
||||
int len;
|
||||
{
|
||||
struct lereg1 *ler1 = le_softc.sc_r1;
|
||||
struct lereg2 *ler2 = le_softc.sc_r2;
|
||||
unsigned int a;
|
||||
int length;
|
||||
struct lermd *rmd;
|
||||
|
||||
|
||||
ler1->ler1_rap = LE_CSR0;
|
||||
if ((ler1->ler1_rdp & LE_C0_RINT) != 0)
|
||||
ler1->ler1_rdp = LE_C0_RINT;
|
||||
rmd = &ler2->ler2_rmd[le_softc.next_rmd];
|
||||
if (rmd->rmd1_bits & LE_R1_OWN) {
|
||||
return(0);
|
||||
}
|
||||
if (ler1->ler1_rdp & LE_C0_ERR)
|
||||
le_error(desc->io_netif, "le_poll", ler1);
|
||||
if (rmd->rmd1_bits & LE_R1_ERR) {
|
||||
printf("le_poll: rmd status 0x%x\n", rmd->rmd1_bits);
|
||||
length = 0;
|
||||
goto cleanup;
|
||||
}
|
||||
if ((rmd->rmd1_bits & (LE_R1_STP|LE_R1_ENP)) != (LE_R1_STP|LE_R1_ENP))
|
||||
panic("le_poll: chained packet\n");
|
||||
|
||||
length = rmd->rmd3;
|
||||
if (length >= LEMTU) {
|
||||
length = 0;
|
||||
panic("csr0 when bad things happen: %x\n", ler1->ler1_rdp);
|
||||
goto cleanup;
|
||||
}
|
||||
if (!length) goto cleanup;
|
||||
length -= 4;
|
||||
if (length > 0) {
|
||||
|
||||
/*
|
||||
* if buffer is smaller than the packet truncate it.
|
||||
* (is this wise?)
|
||||
*/
|
||||
if (length > len)
|
||||
length = len;
|
||||
|
||||
bcopy((void *)&ler2->ler2_rbuf[le_softc.next_rmd], pkt, length);
|
||||
}
|
||||
|
||||
cleanup:
|
||||
a = (u_int)&ler2->ler2_rbuf[le_softc.next_rmd];
|
||||
rmd->rmd0 = a & LE_ADDR_LOW_MASK;
|
||||
rmd->rmd1_hadr = a >> 16;
|
||||
rmd->rmd2 = -LEMTU;
|
||||
le_softc.next_rmd =
|
||||
(le_softc.next_rmd == (LERBUF - 1)) ? 0 : (le_softc.next_rmd + 1);
|
||||
rmd->rmd1_bits = LE_R1_OWN;
|
||||
return length;
|
||||
}
|
||||
@@ -1,22 +0,0 @@
|
||||
|
||||
#include "iodesc.h"
|
||||
|
||||
struct netif {
|
||||
void *devdata;
|
||||
};
|
||||
|
||||
ssize_t netif_get __P((struct iodesc *, void *, size_t, time_t));
|
||||
ssize_t netif_put __P((struct iodesc *, void *, size_t));
|
||||
|
||||
int netif_open __P((void *));
|
||||
int netif_close __P((int));
|
||||
|
||||
struct iodesc *socktodesc __P((int));
|
||||
|
||||
void le_end __P((struct netif *));
|
||||
void le_error __P((struct netif *, char *, volatile void *));
|
||||
int le_get __P((struct iodesc *, void *, int, time_t));
|
||||
void *le_init __P((struct iodesc *));
|
||||
int le_poll __P((struct iodesc *, void *, int));
|
||||
int le_put __P((struct iodesc *, void *, int));
|
||||
void le_reset __P((struct netif *, u_char *));
|
||||
@@ -1,139 +0,0 @@
|
||||
/*
|
||||
*
|
||||
* Copyright (c) 1995 Charles D. Cranor and Seth Widoff
|
||||
* 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 Charles D. Cranor
|
||||
* and Seth Widoff.
|
||||
* 4. The name of the author may not be used to endorse or promote products
|
||||
* derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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.
|
||||
*/
|
||||
/*
|
||||
* console i/o
|
||||
*/
|
||||
|
||||
#include "sboot.h"
|
||||
|
||||
/*
|
||||
* hardware
|
||||
*/
|
||||
|
||||
struct zs_hw {
|
||||
volatile u_char ctl;
|
||||
volatile u_char data;
|
||||
};
|
||||
|
||||
struct zs_hw *zs = (struct zs_hw *)CONS_ZS_ADDR;
|
||||
|
||||
/*
|
||||
* consinit: init console
|
||||
*/
|
||||
|
||||
consinit()
|
||||
|
||||
{
|
||||
register int mark = time();
|
||||
register int rr1;
|
||||
while (1) {
|
||||
if (time() > mark + 5) break;
|
||||
zs->ctl = 1; rr1 = zs->ctl;
|
||||
zs->ctl = 0;
|
||||
if ((rr1 & 0x1) == 1 && (zs->ctl & 0x4) == 4) break; /* zs_drain! */
|
||||
}
|
||||
zs->ctl = 9; zs->ctl = 0x00; /* clear interrupt */
|
||||
zs->ctl = 4; zs->ctl = 0x44; /* 16x clk, 1 stop bit */
|
||||
zs->ctl = 5; zs->ctl = 0xea; /* DTR on, 8 bit xmit, xmit on, RTS on */
|
||||
zs->ctl = 3; zs->ctl = 0xc1; /* 8 bit recv, auto cd_cts, recv on */
|
||||
zs->ctl = 1; zs->ctl = 0x00; /* no intrs */
|
||||
zs->ctl = 2; zs->ctl = 0x00; /* no vector */
|
||||
zs->ctl = 10; zs->ctl = 0x00; /* */
|
||||
zs->ctl = 11; zs->ctl = 0x50; /* clocking options */
|
||||
zs->ctl = 12; zs->ctl = 0x0e; /* 9600 baud, part 1 */
|
||||
zs->ctl = 13; zs->ctl = 0x00; /* 9600 baud, part 2 */
|
||||
zs->ctl = 14; zs->ctl = 0x03; /* more clocking options */
|
||||
zs->ctl = 15; zs->ctl = 0x00; /* clear intrs */
|
||||
}
|
||||
|
||||
/*
|
||||
* putchar: put char to console
|
||||
*/
|
||||
|
||||
void putchar(char c)
|
||||
{
|
||||
if (c == '\n') putchar('\r'); /* avoid the need for \r\n in printf */
|
||||
zs->ctl = 0;
|
||||
while ((zs->ctl & 0x04) == 0) {
|
||||
zs->ctl = 0;
|
||||
}
|
||||
zs->ctl = 8;
|
||||
zs->ctl = c;
|
||||
}
|
||||
|
||||
/*
|
||||
* cngetc: get 1 char from console
|
||||
*/
|
||||
|
||||
char cngetc ()
|
||||
{
|
||||
zs->ctl = 0;
|
||||
while ((zs->ctl & 0x1) == 0) {
|
||||
zs->ctl = 0;
|
||||
}
|
||||
zs->ctl = 8;
|
||||
return zs->ctl;
|
||||
}
|
||||
|
||||
/*
|
||||
* puts: put string to console
|
||||
*/
|
||||
|
||||
void puts ( char * str )
|
||||
{
|
||||
while ( *str != '\0' ) {
|
||||
putchar(*str);
|
||||
str++;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* ngets: get string from console
|
||||
*/
|
||||
|
||||
void ngets ( char * str, int size )
|
||||
{
|
||||
int i = 0;
|
||||
while ( (i < size - 1) && (str[i] = cngetc()) != '\r') {
|
||||
if ( str[i] == '\b' || str[i] == 0x7F ) {
|
||||
if ( i == 0) continue;
|
||||
i--;
|
||||
puts("\b \b");
|
||||
continue;
|
||||
}
|
||||
putchar(str[i]);
|
||||
i++;
|
||||
}
|
||||
puts("\n");
|
||||
str[i] = '\0';
|
||||
}
|
||||
|
||||
@@ -1,320 +0,0 @@
|
||||
/* $NetBSD: le_poll.c,v 1.1.1.1 1995/07/25 23:12:31 chuck Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1993 Adam Glass
|
||||
* 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 Adam Glass.
|
||||
* 4. The name of the Author may not be used to endorse or promote products
|
||||
* derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY Adam Glass ``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.
|
||||
*/
|
||||
|
||||
#include "sboot.h"
|
||||
#include "if_lereg.h"
|
||||
|
||||
struct {
|
||||
struct lereg1 *sc_r1; /* LANCE registers */
|
||||
struct lereg2 *sc_r2; /* RAM */
|
||||
int next_rmd;
|
||||
int next_tmd;
|
||||
} le_softc;
|
||||
|
||||
void le_error(str, ler1)
|
||||
char *str;
|
||||
struct lereg1 *ler1;
|
||||
{
|
||||
/* ler1->ler1_rap = LE_CSRO done in caller */
|
||||
if (ler1->ler1_rdp & LE_C0_BABL) {
|
||||
printf("le0: been babbling, found by '%s'\n", str);
|
||||
callrom();
|
||||
}
|
||||
if (ler1->ler1_rdp & LE_C0_CERR) {
|
||||
ler1->ler1_rdp = LE_C0_CERR;
|
||||
}
|
||||
if (ler1->ler1_rdp & LE_C0_MISS) {
|
||||
ler1->ler1_rdp = LE_C0_MISS;
|
||||
}
|
||||
if (ler1->ler1_rdp & LE_C0_MERR) {
|
||||
printf("le0: memory error in '%s'\n", str);
|
||||
callrom();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void le_reset(myea)
|
||||
u_char *myea;
|
||||
{
|
||||
struct lereg1 *ler1 = le_softc.sc_r1;
|
||||
struct lereg2 *ler2 = le_softc.sc_r2;
|
||||
unsigned int a;
|
||||
int timo = 100000, stat, i;
|
||||
|
||||
ler1->ler1_rap = LE_CSR0;
|
||||
ler1->ler1_rdp = LE_C0_STOP; /* do nothing until we are finished */
|
||||
|
||||
bzero(ler2, sizeof(*ler2));
|
||||
|
||||
ler2->ler2_mode = LE_MODE_NORMAL;
|
||||
ler2->ler2_padr[0] = myea[1];
|
||||
ler2->ler2_padr[1] = myea[0];
|
||||
ler2->ler2_padr[2] = myea[3];
|
||||
ler2->ler2_padr[3] = myea[2];
|
||||
ler2->ler2_padr[4] = myea[5];
|
||||
ler2->ler2_padr[5] = myea[4];
|
||||
|
||||
|
||||
ler2->ler2_ladrf0 = 0;
|
||||
ler2->ler2_ladrf1 = 0;
|
||||
|
||||
a = (u_int)ler2->ler2_rmd;
|
||||
ler2->ler2_rlen = LE_RLEN | (a >> 16);
|
||||
ler2->ler2_rdra = a & LE_ADDR_LOW_MASK;
|
||||
|
||||
a = (u_int)ler2->ler2_tmd;
|
||||
ler2->ler2_tlen = LE_TLEN | (a >> 16);
|
||||
ler2->ler2_tdra = a & LE_ADDR_LOW_MASK;
|
||||
|
||||
ler1->ler1_rap = LE_CSR1;
|
||||
a = (u_int)ler2;
|
||||
ler1->ler1_rdp = a & LE_ADDR_LOW_MASK;
|
||||
ler1->ler1_rap = LE_CSR2;
|
||||
ler1->ler1_rdp = a >> 16;
|
||||
|
||||
for (i = 0; i < LERBUF; i++) {
|
||||
a = (u_int)&ler2->ler2_rbuf[i];
|
||||
ler2->ler2_rmd[i].rmd0 = a & LE_ADDR_LOW_MASK;
|
||||
ler2->ler2_rmd[i].rmd1_bits = LE_R1_OWN;
|
||||
ler2->ler2_rmd[i].rmd1_hadr = a >> 16;
|
||||
ler2->ler2_rmd[i].rmd2 = -LEMTU;
|
||||
ler2->ler2_rmd[i].rmd3 = 0;
|
||||
}
|
||||
for (i = 0; i < LETBUF; i++) {
|
||||
a = (u_int)&ler2->ler2_tbuf[i];
|
||||
ler2->ler2_tmd[i].tmd0 = a & LE_ADDR_LOW_MASK;
|
||||
ler2->ler2_tmd[i].tmd1_bits = 0;
|
||||
ler2->ler2_tmd[i].tmd1_hadr = a >> 16;
|
||||
ler2->ler2_tmd[i].tmd2 = 0;
|
||||
ler2->ler2_tmd[i].tmd3 = 0;
|
||||
}
|
||||
|
||||
ler1->ler1_rap = LE_CSR3;
|
||||
ler1->ler1_rdp = LE_C3_BSWP;
|
||||
|
||||
ler1->ler1_rap = LE_CSR0;
|
||||
ler1->ler1_rdp = LE_C0_INIT;
|
||||
do {
|
||||
if (--timo == 0) {
|
||||
printf("le0: init timeout, stat = 0x%x\n", stat);
|
||||
break;
|
||||
}
|
||||
stat = ler1->ler1_rdp;
|
||||
} while ((stat & LE_C0_IDON) == 0);
|
||||
|
||||
ler1->ler1_rdp = LE_C0_IDON;
|
||||
le_softc.next_rmd = 0;
|
||||
le_softc.next_tmd = 0;
|
||||
ler1->ler1_rap = LE_CSR0;
|
||||
ler1->ler1_rdp = LE_C0_STRT;
|
||||
}
|
||||
|
||||
int le_poll(pkt, len)
|
||||
void *pkt;
|
||||
int len;
|
||||
{
|
||||
struct lereg1 *ler1 = le_softc.sc_r1;
|
||||
struct lereg2 *ler2 = le_softc.sc_r2;
|
||||
unsigned int a;
|
||||
int length;
|
||||
struct lermd *rmd;
|
||||
|
||||
ler1->ler1_rap = LE_CSR0;
|
||||
if ((ler1->ler1_rdp & LE_C0_RINT) != 0)
|
||||
ler1->ler1_rdp = LE_C0_RINT;
|
||||
rmd = &ler2->ler2_rmd[le_softc.next_rmd];
|
||||
if (rmd->rmd1_bits & LE_R1_OWN) {
|
||||
return(0);
|
||||
}
|
||||
if (ler1->ler1_rdp & LE_C0_ERR)
|
||||
le_error("le_poll", ler1);
|
||||
if (rmd->rmd1_bits & LE_R1_ERR) {
|
||||
printf("le0_poll: rmd status 0x%x\n", rmd->rmd1_bits);
|
||||
length = 0;
|
||||
goto cleanup;
|
||||
}
|
||||
if ((rmd->rmd1_bits & (LE_R1_STP|LE_R1_ENP)) != (LE_R1_STP|LE_R1_ENP)) {
|
||||
printf("le_poll: chained packet\n");
|
||||
callrom();
|
||||
}
|
||||
|
||||
length = rmd->rmd3;
|
||||
if (length >= LEMTU) {
|
||||
length = 0;
|
||||
printf("csr0 when bad things happen: %x\n", ler1->ler1_rdp);
|
||||
callrom();
|
||||
goto cleanup;
|
||||
}
|
||||
if (!length) goto cleanup;
|
||||
length -= 4;
|
||||
if (length > 0)
|
||||
bcopy((char *)&ler2->ler2_rbuf[le_softc.next_rmd], pkt, length);
|
||||
|
||||
cleanup:
|
||||
a = (u_int)&ler2->ler2_rbuf[le_softc.next_rmd];
|
||||
rmd->rmd0 = a & LE_ADDR_LOW_MASK;
|
||||
rmd->rmd1_hadr = a >> 16;
|
||||
rmd->rmd2 = -LEMTU;
|
||||
le_softc.next_rmd =
|
||||
(le_softc.next_rmd == (LERBUF - 1)) ? 0 : (le_softc.next_rmd + 1);
|
||||
rmd->rmd1_bits = LE_R1_OWN;
|
||||
return length;
|
||||
}
|
||||
|
||||
int le_put(pkt, len)
|
||||
u_char *pkt;
|
||||
size_t len;
|
||||
{
|
||||
struct lereg1 *ler1 = le_softc.sc_r1;
|
||||
struct lereg2 *ler2 = le_softc.sc_r2;
|
||||
struct letmd *tmd;
|
||||
int timo = 100000, stat, i;
|
||||
unsigned int a;
|
||||
|
||||
ler1->ler1_rap = LE_CSR0;
|
||||
if (ler1->ler1_rdp & LE_C0_ERR)
|
||||
le_error("le_put(way before xmit)", ler1);
|
||||
tmd = &ler2->ler2_tmd[le_softc.next_tmd];
|
||||
while(tmd->tmd1_bits & LE_T1_OWN) {
|
||||
printf("le0: output buffer busy\n");
|
||||
}
|
||||
bcopy(pkt, (char *)ler2->ler2_tbuf[le_softc.next_tmd], len);
|
||||
if (len < 64)
|
||||
tmd->tmd2 = -64;
|
||||
else
|
||||
tmd->tmd2 = -len;
|
||||
tmd->tmd3 = 0;
|
||||
if (ler1->ler1_rdp & LE_C0_ERR)
|
||||
le_error("le_put(before xmit)", ler1);
|
||||
tmd->tmd1_bits = LE_T1_STP | LE_T1_ENP | LE_T1_OWN;
|
||||
a = (u_int)&ler2->ler2_tbuf[le_softc.next_tmd];
|
||||
tmd->tmd0 = a & LE_ADDR_LOW_MASK;
|
||||
tmd->tmd1_hadr = a >> 16;
|
||||
ler1->ler1_rdp = LE_C0_TDMD;
|
||||
if (ler1->ler1_rdp & LE_C0_ERR)
|
||||
le_error("le_put(after xmit)", ler1);
|
||||
do {
|
||||
if (--timo == 0) {
|
||||
printf("le0: transmit timeout, stat = 0x%x\n",
|
||||
stat);
|
||||
if (ler1->ler1_rdp & LE_C0_ERR)
|
||||
le_error("le_put(timeout)", ler1);
|
||||
break;
|
||||
}
|
||||
stat = ler1->ler1_rdp;
|
||||
} while ((stat & LE_C0_TINT) == 0);
|
||||
ler1->ler1_rdp = LE_C0_TINT;
|
||||
if (ler1->ler1_rdp & LE_C0_ERR) {
|
||||
if ((ler1->ler1_rdp & (LE_C0_BABL|LE_C0_CERR|LE_C0_MISS|LE_C0_MERR)) !=
|
||||
LE_C0_CERR)
|
||||
printf("le_put: xmit error, buf %d\n", le_softc.next_tmd);
|
||||
le_error("le_put(xmit error)", ler1);
|
||||
}
|
||||
le_softc.next_tmd = 0;
|
||||
/* (le_softc.next_tmd == (LETBUF - 1)) ? 0 : le_softc.next_tmd + 1;*/
|
||||
if (tmd->tmd1_bits & LE_T1_ERR) {
|
||||
printf("le0: transmit error, error = 0x%x\n",
|
||||
tmd->tmd3);
|
||||
return -1;
|
||||
}
|
||||
return len;
|
||||
}
|
||||
|
||||
int le_get(pkt, len, timeout)
|
||||
u_char *pkt;
|
||||
size_t len;
|
||||
u_long timeout;
|
||||
{
|
||||
int cc;
|
||||
int now, then;
|
||||
int stopat = time() + timeout;
|
||||
then = 0;
|
||||
|
||||
cc = 0;
|
||||
while ((now = time()) < stopat && !cc) {
|
||||
cc = le_poll(pkt, len);
|
||||
if (then != now) {
|
||||
#ifdef LE_DEBUG
|
||||
printf("%d \r", stopat - now);
|
||||
#endif
|
||||
then = now;
|
||||
}
|
||||
if (cc && (pkt[0] != myea[0] || pkt[1] != myea[1] ||
|
||||
pkt[2] != myea[2] || pkt[3] != myea[3] ||
|
||||
pkt[4] != myea[4] || pkt[5] != myea[5])) {
|
||||
cc = 0; /* ignore broadcast / multicast */
|
||||
#ifdef LE_DEBUG
|
||||
printf("reject (%d sec left)\n", stopat - now);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
#ifdef LE_DEBUG
|
||||
printf("\n");
|
||||
#endif
|
||||
return cc;
|
||||
}
|
||||
|
||||
void le_init()
|
||||
{
|
||||
caddr_t addr;
|
||||
int *ea = (int *) LANCE_ADDR;
|
||||
u_long *eram = (u_long *) ERAM_ADDR;
|
||||
u_long e = *ea;
|
||||
if (( e & 0x2fffff00 ) == 0x2fffff00) {
|
||||
printf("ERROR: ethernet address not set! Use LSAD.\n");
|
||||
callrom();
|
||||
}
|
||||
myea[0] = 0x08;
|
||||
myea[1] = 0x00;
|
||||
myea[2] = 0x3e;
|
||||
e = e >> 8;
|
||||
myea[5] = e & 0xff;
|
||||
e = e >> 8;
|
||||
myea[4] = e & 0xff;
|
||||
e = e >> 8;
|
||||
myea[3] = e;
|
||||
printf("le0: ethernet address: %x:%x:%x:%x:%x:%x\n",
|
||||
myea[0], myea[1], myea[2], myea[3], myea[4], myea[5]);
|
||||
bzero(&le_softc, sizeof(le_softc));
|
||||
le_softc.sc_r1 = (struct lereg1 *) LANCE_REG_ADDR;
|
||||
le_softc.sc_r2 = (struct lereg2 *)(*eram - (1024*1024));
|
||||
le_reset(myea);
|
||||
}
|
||||
|
||||
void le_end()
|
||||
{
|
||||
struct lereg1 *ler1 = le_softc.sc_r1;
|
||||
|
||||
ler1->ler1_rap = LE_CSR0;
|
||||
ler1->ler1_rdp = LE_C0_STOP;
|
||||
}
|
||||
@@ -1,348 +0,0 @@
|
||||
/* $NetBSD: libc_sa.c,v 1.1.1.1 1995/07/25 23:12:33 chuck Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c) 1990 The Regents of the University of California.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This code is derived from software contributed to Berkeley by
|
||||
* Chris Torek.
|
||||
*
|
||||
* 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 University of
|
||||
* California, Berkeley and its contributors.
|
||||
* 4. 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.
|
||||
*/
|
||||
|
||||
#include "sboot.h"
|
||||
|
||||
/*
|
||||
* sizeof(word) MUST BE A POWER OF TWO
|
||||
* SO THAT wmask BELOW IS ALL ONES
|
||||
*/
|
||||
typedef int word; /* "word" used for optimal copy speed */
|
||||
|
||||
#define wsize sizeof(word)
|
||||
#define wmask (wsize - 1)
|
||||
|
||||
/*
|
||||
* Copy a block of memory, handling overlap.
|
||||
* This is the routine that actually implements
|
||||
* (the portable versions of) bcopy, memcpy, and memmove.
|
||||
*/
|
||||
void
|
||||
bcopy(src0, dst0, length)
|
||||
void *dst0;
|
||||
const void *src0;
|
||||
register size_t length;
|
||||
{
|
||||
register char *dst = dst0;
|
||||
register const char *src = src0;
|
||||
register size_t t;
|
||||
|
||||
if (length == 0 || dst == src) /* nothing to do */
|
||||
goto done;
|
||||
|
||||
/*
|
||||
* Macros: loop-t-times; and loop-t-times, t>0
|
||||
*/
|
||||
#define TLOOP(s) if (t) TLOOP1(s)
|
||||
#define TLOOP1(s) do { s; } while (--t)
|
||||
|
||||
if ((unsigned long)dst < (unsigned long)src) {
|
||||
/*
|
||||
* Copy forward.
|
||||
*/
|
||||
t = (long)src; /* only need low bits */
|
||||
if ((t | (long)dst) & wmask) {
|
||||
/*
|
||||
* Try to align operands. This cannot be done
|
||||
* unless the low bits match.
|
||||
*/
|
||||
if ((t ^ (long)dst) & wmask || length < wsize)
|
||||
t = length;
|
||||
else
|
||||
t = wsize - (t & wmask);
|
||||
length -= t;
|
||||
TLOOP1(*dst++ = *src++);
|
||||
}
|
||||
/*
|
||||
* Copy whole words, then mop up any trailing bytes.
|
||||
*/
|
||||
t = length / wsize;
|
||||
TLOOP(*(word *)dst = *(word *)src; src += wsize; dst += wsize);
|
||||
t = length & wmask;
|
||||
TLOOP(*dst++ = *src++);
|
||||
} else {
|
||||
/*
|
||||
* Copy backwards. Otherwise essentially the same.
|
||||
* Alignment works as before, except that it takes
|
||||
* (t&wmask) bytes to align, not wsize-(t&wmask).
|
||||
*/
|
||||
src += length;
|
||||
dst += length;
|
||||
t = (long)src;
|
||||
if ((t | (long)dst) & wmask) {
|
||||
if ((t ^ (long)dst) & wmask || length <= wsize)
|
||||
t = length;
|
||||
else
|
||||
t &= wmask;
|
||||
length -= t;
|
||||
TLOOP1(*--dst = *--src);
|
||||
}
|
||||
t = length / wsize;
|
||||
TLOOP(src -= wsize; dst -= wsize; *(word *)dst = *(word *)src);
|
||||
t = length & wmask;
|
||||
TLOOP(*--dst = *--src);
|
||||
}
|
||||
done:
|
||||
return;
|
||||
}
|
||||
|
||||
/*-
|
||||
* Copyright (c) 1990 The Regents of the University of California.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This code is derived from software contributed to Berkeley by
|
||||
* Chris Torek.
|
||||
*
|
||||
* 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 University of
|
||||
* California, Berkeley and its contributors.
|
||||
* 4. 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.
|
||||
*/
|
||||
|
||||
void *
|
||||
bzero(dst, n)
|
||||
void *dst;
|
||||
register size_t n;
|
||||
{
|
||||
|
||||
if (n != 0) {
|
||||
register char *d = dst;
|
||||
|
||||
do
|
||||
*d++ = 0;
|
||||
while (--n != 0);
|
||||
}
|
||||
return (dst);
|
||||
}
|
||||
/* $NetBSD: libc_sa.c,v 1.1.1.1 1995/07/25 23:12:33 chuck Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c) 1991 The Regents of the University of California.
|
||||
* 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 the University of
|
||||
* California, Berkeley and its contributors.
|
||||
* 4. 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.
|
||||
*
|
||||
* @(#)printf.c 5.6 (Berkeley) 5/25/91
|
||||
*/
|
||||
|
||||
/*
|
||||
* Scaled down version of printf(3).
|
||||
*
|
||||
* One additional format:
|
||||
*
|
||||
* The format %b is supported to decode error registers.
|
||||
* Its usage is:
|
||||
*
|
||||
* printf("reg=%b\n", regval, "<base><arg>*");
|
||||
*
|
||||
* where <base> is the output base expressed as a control character, e.g.
|
||||
* \10 gives octal; \20 gives hex. Each arg is a sequence of characters,
|
||||
* the first of which gives the bit number to be inspected (origin 1), and
|
||||
* the next characters (up to a control character, i.e. a character <= 32),
|
||||
* give the name of the register. Thus:
|
||||
*
|
||||
* printf("reg=%b\n", 3, "\10\2BITTWO\1BITONE\n");
|
||||
*
|
||||
* would produce output:
|
||||
*
|
||||
* reg=3<BITTWO,BITONE>
|
||||
*/
|
||||
|
||||
/*
|
||||
* Note that stdarg.h and the ANSI style va_start macro is used for both
|
||||
* ANSI and traditional C compilers.
|
||||
*/
|
||||
#define _KERNEL
|
||||
#include <machine/stdarg.h>
|
||||
#undef _KERNEL
|
||||
|
||||
static void
|
||||
kprintn(ul, base)
|
||||
unsigned long ul;
|
||||
int base;
|
||||
{
|
||||
/* hold a long in base 8 */
|
||||
char *p, buf[(sizeof(long) * 8 / 3) + 1];
|
||||
|
||||
p = buf;
|
||||
do {
|
||||
*p++ = "0123456789abcdef"[ul % base];
|
||||
} while (ul /= base);
|
||||
do {
|
||||
putchar(*--p);
|
||||
} while (p > buf);
|
||||
}
|
||||
|
||||
void
|
||||
#if __STDC__
|
||||
printf(const char *fmt, ...)
|
||||
#else
|
||||
printf(fmt /* , va_alist */)
|
||||
char *fmt;
|
||||
#endif
|
||||
{
|
||||
register char *p;
|
||||
register int ch, n;
|
||||
unsigned long ul;
|
||||
int lflag, set;
|
||||
va_list ap;
|
||||
|
||||
va_start(ap, fmt);
|
||||
for (;;) {
|
||||
while ((ch = *fmt++) != '%') {
|
||||
if (ch == '\0')
|
||||
return;
|
||||
putchar(ch);
|
||||
}
|
||||
lflag = 0;
|
||||
reswitch: switch (ch = *fmt++) {
|
||||
case 'l':
|
||||
lflag = 1;
|
||||
goto reswitch;
|
||||
case 'b':
|
||||
ul = va_arg(ap, int);
|
||||
p = va_arg(ap, char *);
|
||||
kprintn(ul, *p++);
|
||||
|
||||
if (!ul)
|
||||
break;
|
||||
|
||||
for (set = 0; n = *p++;) {
|
||||
if (ul & (1 << (n - 1))) {
|
||||
putchar(set ? ',' : '<');
|
||||
for (; (n = *p) > ' '; ++p)
|
||||
putchar(n);
|
||||
set = 1;
|
||||
} else
|
||||
for (; *p > ' '; ++p);
|
||||
}
|
||||
if (set)
|
||||
putchar('>');
|
||||
break;
|
||||
case 'c':
|
||||
ch = va_arg(ap, int);
|
||||
putchar(ch & 0x7f);
|
||||
break;
|
||||
case 's':
|
||||
p = va_arg(ap, char *);
|
||||
while (ch = *p++)
|
||||
putchar(ch);
|
||||
break;
|
||||
case 'd':
|
||||
ul = lflag ?
|
||||
va_arg(ap, long) : va_arg(ap, int);
|
||||
if ((long)ul < 0) {
|
||||
putchar('-');
|
||||
ul = -(long)ul;
|
||||
}
|
||||
kprintn(ul, 10);
|
||||
break;
|
||||
case 'o':
|
||||
ul = lflag ?
|
||||
va_arg(ap, u_long) : va_arg(ap, u_int);
|
||||
kprintn(ul, 8);
|
||||
break;
|
||||
case 'u':
|
||||
ul = lflag ?
|
||||
va_arg(ap, u_long) : va_arg(ap, u_int);
|
||||
kprintn(ul, 10);
|
||||
break;
|
||||
case 'x':
|
||||
ul = lflag ?
|
||||
va_arg(ap, u_long) : va_arg(ap, u_int);
|
||||
kprintn(ul, 16);
|
||||
break;
|
||||
default:
|
||||
putchar('%');
|
||||
if (lflag)
|
||||
putchar('l');
|
||||
putchar(ch);
|
||||
}
|
||||
}
|
||||
va_end(ap);
|
||||
}
|
||||
|
||||
@@ -1,187 +0,0 @@
|
||||
| $NetBSD: oc_cksum.s,v 1.1.1.1 1995/07/25 23:12:31 chuck Exp $
|
||||
|
||||
| Copyright (c) 1988 Regents of the University of California.
|
||||
| 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 the University of
|
||||
| California, Berkeley and its contributors.
|
||||
| 4. 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.
|
||||
|
|
||||
| @(#)oc_cksum.s 7.2 (Berkeley) 11/3/90
|
||||
|
|
||||
|
|
||||
| oc_cksum: ones complement 16 bit checksum for MC68020.
|
||||
|
|
||||
| oc_cksum (buffer, count, strtval)
|
||||
|
|
||||
| Do a 16 bit one's complement sum of 'count' bytes from 'buffer'.
|
||||
| 'strtval' is the starting value of the sum (usually zero).
|
||||
|
|
||||
| It simplifies life in in_cksum if strtval can be >= 2^16.
|
||||
| This routine will work as long as strtval is < 2^31.
|
||||
|
|
||||
| Performance
|
||||
| -----------
|
||||
| This routine is intended for MC 68020s but should also work
|
||||
| for 68030s. It (deliberately) doesn't worry about the alignment
|
||||
| of the buffer so will only work on a 68010 if the buffer is
|
||||
| aligned on an even address. (Also, a routine written to use
|
||||
| 68010 "loop mode" would almost certainly be faster than this
|
||||
| code on a 68010).
|
||||
|
|
||||
| We don't worry about alignment because this routine is frequently
|
||||
| called with small counts: 20 bytes for IP header checksums and 40
|
||||
| bytes for TCP ack checksums. For these small counts, testing for
|
||||
| bad alignment adds ~10% to the per-call cost. Since, by the nature
|
||||
| of the kernel's allocator, the data we're called with is almost
|
||||
| always longword aligned, there is no benefit to this added cost
|
||||
| and we're better off letting the loop take a big performance hit
|
||||
| in the rare cases where we're handed an unaligned buffer.
|
||||
|
|
||||
| Loop unrolling constants of 2, 4, 8, 16, 32 and 64 times were
|
||||
| tested on random data on four different types of processors (see
|
||||
| list below -- 64 was the largest unrolling because anything more
|
||||
| overflows the 68020 Icache). On all the processors, the
|
||||
| throughput asymptote was located between 8 and 16 (closer to 8).
|
||||
| However, 16 was substantially better than 8 for small counts.
|
||||
| (It's clear why this happens for a count of 40: unroll-8 pays a
|
||||
| loop branch cost and unroll-16 doesn't. But the tests also showed
|
||||
| that 16 was better than 8 for a count of 20. It's not obvious to
|
||||
| me why.) So, since 16 was good for both large and small counts,
|
||||
| the loop below is unrolled 16 times.
|
||||
|
|
||||
| The processors tested and their average time to checksum 1024 bytes
|
||||
| of random data were:
|
||||
| Sun 3/50 (15MHz) 190 us/KB
|
||||
| Sun 3/180 (16.6MHz) 175 us/KB
|
||||
| Sun 3/60 (20MHz) 134 us/KB
|
||||
| Sun 3/280 (25MHz) 95 us/KB
|
||||
|
|
||||
| The cost of calling this routine was typically 10% of the per-
|
||||
| kilobyte cost. E.g., checksumming zero bytes on a 3/60 cost 9us
|
||||
| and each additional byte cost 125ns. With the high fixed cost,
|
||||
| it would clearly be a gain to "inline" this routine -- the
|
||||
| subroutine call adds 400% overhead to an IP header checksum.
|
||||
| However, in absolute terms, inlining would only gain 10us per
|
||||
| packet -- a 1% effect for a 1ms ethernet packet. This is not
|
||||
| enough gain to be worth the effort.
|
||||
|
||||
#include <m68k/asm.h>
|
||||
|
||||
.text
|
||||
|
||||
.text; .even; .globl _oc_cksum; _oc_cksum:
|
||||
movl sp@(4),a0 | get buffer ptr
|
||||
movl sp@(8),d1 | get byte count
|
||||
movl sp@(12),d0 | get starting value
|
||||
movl d2,sp@- | free a reg
|
||||
|
||||
| test for possible 1, 2 or 3 bytes of excess at end
|
||||
| of buffer. The usual case is no excess (the usual
|
||||
| case is header checksums) so we give that the faster
|
||||
| 'not taken' leg of the compare. (We do the excess
|
||||
| first because we're about the trash the low order
|
||||
| bits of the count in d1.)
|
||||
|
||||
btst #0,d1
|
||||
jne L5 | if one or three bytes excess
|
||||
btst #1,d1
|
||||
jne L7 | if two bytes excess
|
||||
L1:
|
||||
movl d1,d2
|
||||
lsrl #6,d1 | make cnt into # of 64 byte chunks
|
||||
andl #0x3c,d2 | then find fractions of a chunk
|
||||
negl d2
|
||||
andb #0xf,cc | clear X
|
||||
jmp pc@(L3-.-2:b,d2)
|
||||
L2:
|
||||
movl a0@+,d2
|
||||
addxl d2,d0
|
||||
movl a0@+,d2
|
||||
addxl d2,d0
|
||||
movl a0@+,d2
|
||||
addxl d2,d0
|
||||
movl a0@+,d2
|
||||
addxl d2,d0
|
||||
movl a0@+,d2
|
||||
addxl d2,d0
|
||||
movl a0@+,d2
|
||||
addxl d2,d0
|
||||
movl a0@+,d2
|
||||
addxl d2,d0
|
||||
movl a0@+,d2
|
||||
addxl d2,d0
|
||||
movl a0@+,d2
|
||||
addxl d2,d0
|
||||
movl a0@+,d2
|
||||
addxl d2,d0
|
||||
movl a0@+,d2
|
||||
addxl d2,d0
|
||||
movl a0@+,d2
|
||||
addxl d2,d0
|
||||
movl a0@+,d2
|
||||
addxl d2,d0
|
||||
movl a0@+,d2
|
||||
addxl d2,d0
|
||||
movl a0@+,d2
|
||||
addxl d2,d0
|
||||
movl a0@+,d2
|
||||
addxl d2,d0
|
||||
L3:
|
||||
dbra d1,L2 | (NB- dbra doesn't affect X)
|
||||
|
||||
movl d0,d1 | fold 32 bit sum to 16 bits
|
||||
swap d1 | (NB- swap doesn't affect X)
|
||||
addxw d1,d0
|
||||
jcc L4
|
||||
addw #1,d0
|
||||
L4:
|
||||
andl #0xffff,d0
|
||||
movl sp@+,d2
|
||||
rts
|
||||
|
||||
L5: | deal with 1 or 3 excess bytes at the end of the buffer.
|
||||
btst #1,d1
|
||||
jeq L6 | if 1 excess
|
||||
|
||||
| 3 bytes excess
|
||||
clrl d2
|
||||
movw a0@(-3,d1:l),d2 | add in last full word then drop
|
||||
addl d2,d0 | through to pick up last byte
|
||||
|
||||
L6: | 1 byte excess
|
||||
clrl d2
|
||||
movb a0@(-1,d1:l),d2
|
||||
lsll #8,d2
|
||||
addl d2,d0
|
||||
jra L1
|
||||
|
||||
L7: | 2 bytes excess
|
||||
clrl d2
|
||||
movw a0@(-2,d1:l),d2
|
||||
addl d2,d0
|
||||
jra L1
|
||||
@@ -1,47 +0,0 @@
|
||||
/*
|
||||
*
|
||||
* Copyright (c) 1995 Charles D. Cranor
|
||||
* 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 Charles D. Cranor.
|
||||
* 4. The name of the author may not be used to endorse or promote products
|
||||
* derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 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.
|
||||
*/
|
||||
/*
|
||||
* start: at address 0x4000, load at 0xa000 (so put stack at 0x9ff0)
|
||||
* note this file is named "AAstart" so that it gets linked FIRST
|
||||
*/
|
||||
|
||||
.text
|
||||
.globl start
|
||||
start:
|
||||
movb #0,_reboot
|
||||
jra Ldoit
|
||||
restart:
|
||||
movb #1,_reboot | fall through
|
||||
|
||||
Ldoit:
|
||||
movl #0x00006ff0,sp
|
||||
jsr _sboot
|
||||
|
||||
Reference in New Issue
Block a user