Commit Graph

303 Commits

Author SHA1 Message Date
eeh 98ecb5b215 getprop* -> PROM_getprop* 2001-09-26 20:53:05 +00:00
eeh 766a9b8c9c Change bus_space_mmap() signature to the official one. 2001-09-24 23:49:31 +00:00
eeh 0d30ddb30a Properly initialize sc->sc_bustag and sc->sc_dmatag; 2001-09-12 20:09:53 +00:00
eeh 317da99cfe Properly initialize sc->sc_bustag. 2001-09-12 19:35:35 +00:00
pk 88dc67b3e1 The `ESC' DMA chip must be reset before we can access the esp registers. 2001-09-11 10:50:52 +00:00
mjacob 6bb9f4a949 Add support for 2 Gigabit cards (2300/2312). This necessitated a change
in how interrupts are down- the 23XX has not only a different place to check
for an interrupt, but unlike all other QLogic cards, you have to read the
status as a 32 bit word- not 16 bit words. Rather than have device specific
functions as called from the core module (in isp_intr), it makes more sense
to have the platform/bus modules do the gruntwork of splitting out the
isr, semaphore register and the first outgoing mailbox register (if needed)
*prior* to calling isp_intr (if calling isp_intr is necessary at all).
2001-09-01 07:12:23 +00:00
mjacob 48e09f672e twiddle isp_xflist calculation to match more closes isp_pci.c 2001-07-06 16:09:38 +00:00
mrg c13e3a6693 use _KERNEL_OPT 2001-05-30 11:40:35 +00:00
scw 2963ff5c58 Add `l_poll' to `struct linesw' and provide an xxxpoll() entry point
in each tty driver to indirect through it.

This allows tty line-disciplines to handle poll(2) system calls.
2001-05-02 10:32:08 +00:00
bouyer 937a7a3ed9 Pull up the thorpej_scsipi branch to main branch.
This is a completely rewritten scsipi_xfer execution engine, and the
associated changes to HBA drivers. Overview of changes & features:
- All xfers are queued in the mid-layer, rather than doing so in an
  ad-hoc fashion in individual adapter drivers.
- Adapter/channel resource management in the mid-layer, avoids even trying
  to start running an xfer if the adapter/channel doesn't have the resources.
- Better communication between the mid-layer and the adapters.
- Asynchronous event notification mechanism from adapter to mid-layer and
  peripherals.
- Better peripheral queue management: freeze/thaw, sorted requeueing during
  recovery, etc.
- Clean separation of peripherals, adapters, and adapter channels (no more
  scsipi_link).
- Kernel thread for each scsipi_channel makes error recovery much easier
  (no more dealing with interrupt context when recovering from an error).
- Mid-layer support for tagged queueing: commands can have the tag type
  set explicitly, tag IDs are allocated in the mid-layer (thus eliminating
  the need to use buggy tag ID allocation schemes in many adapter drivers).
- support for QUEUE FULL and CHECK CONDITION status in mid-layer; the command
  will be requeued, or a REQUEST SENSE will be sent as appropriate.

Just before the merge syssrc has been tagged with thorpej_scsipi_beforemerge
2001-04-25 17:53:04 +00:00
mjacob f13ec50e47 Clean up bus dma code for request/response queues. 2001-04-12 21:40:56 +00:00
jdolecek 745ab257dc Put back all header files defining ioctls 2001-04-11 19:07:36 +00:00
jdolecek 372e5956ef Only install headers which are actually used by our userland. This
saves about 2.2MB under /usr/include/dev/. Discussed on tech-kern@
recently.

I HOPE to get the list right. The headers I left in are ones
used for MI tools and those whose usage I discovered by grep over tree sources.
Feel free to put needed includes back in if you encounter anything which
should not be removed from lists.
2001-04-11 07:42:31 +00:00
christos 95fda43dd5 make all debugging messages conditional on sc->sc_debug. 2001-03-30 17:30:18 +00:00
petrov b0605f71d5 fas support added 2001-03-29 02:58:38 +00:00
pk 4cefebdf8d Fix fall-out from previous change: the map's DMA address is valid only
after bus_dmamap_load().
2001-03-20 15:39:20 +00:00
mjacob 272082c697 ansify code 2001-03-14 06:58:25 +00:00
thorpej c8f050a7f1 Use bus_dmamap_load(), not bus_dmamap_load_raw(), and add
BUS_DMA_STREAMING to data transfer map loads.
2001-03-08 02:21:44 +00:00
thorpej 00ddf90164 Use bus_dmamap_load(), not bus_dmamap_load_raw(). 2001-03-08 02:20:39 +00:00
mrg 7fa2fd24b4 match SUNW,qfe; PR#12301 from Rob Quinn <rquinn@sprint.net> 2001-02-28 14:52:48 +00:00
mjacob 0adf4d13bb Oh, god, make the pain stop. "Fix" this one more time- but for the next
to last time.

It turns out that in fact, sparc64 was *not* working. There is a discussion
within the tech-kern@netbsd.org mail list as of just prior to this date
that contains the details.

Suffice to say that for sparc64 we have to add back in the usage
of BUS_DMA_COHERENT again to the call to bus_dmamap_load_raw. PK
added the usage of bus_dmamap_load_raw- which agrees with the
man page description of it- but now does not match what the
original BusDma author seems to think it's supposed to do.

While we're at it, do a specific set of steps for setting up and,
if necessary, tearing down, mailbox dma mappings.
2001-02-28 05:46:46 +00:00
mjacob 0dce6b45bc this was *still* wrong 2001-02-25 01:49:18 +00:00
mjacob 9d2a3fb24d More Kudos to Izumi: fix another argument to bus_dmamap_sync 2001-02-25 01:44:02 +00:00
mjacob d5f967e27f Now that the underlying code for bus_dmamap_sync appears to do the
right thing, don't use the illegal and "just worked by chance" addition
of BUS_DMA_COHERENT to bus_dmamap_load_raw. There still is a necessity
to add to the architecture to allow one to hint that this should be
a cache coherent mapping.

Fix offset argument to be zero for flushing data tranfers. Kudos to Izumi
for spotting this.
2001-02-24 23:30:01 +00:00
mjacob e8ae80a071 Add missing BUS_DMA_COHERENT to bus_dmamap_load_raw calls for request
and response queues- this makes this work on UltraSparc now.
2001-02-23 23:57:47 +00:00
mjacob 3744fa3f33 Implement bootverbose recognition. Move interrupt registry up a bit so we can
use interrupting mailbox commands for isp_init. Set default HBA role.
Rename request/response dma maps to be more consistent with PCI version.
Enable bus_dmamap_sync on request queue- we already do this for response
queue- better do it for the request queue as well.

Checked to be working against a Sparc10.
2001-02-23 17:28:58 +00:00
thorpej 372338915a Use splnet() to block network interrupts, not splimp(). 2001-01-14 17:37:41 +00:00
mrg c5802f9f90 avoid unused variables if not RASTERCONSOLE 2001-01-07 05:41:50 +00:00
wiz c8b0b91e7e Fix pathnames in comment. 2000-12-23 01:37:57 +00:00
thorpej a64a0f8137 ALTQ'ify. 2000-12-14 07:15:45 +00:00
martin d9d7c42e0c Remove esp specific function from ddb when esp @ sbus is not included
in the kernel config. Makes compiling sbus-less kernels possible again.
2000-12-08 17:29:12 +00:00
fvdl 245940b894 Clean up warnings in 32bit compile (bus_space_handle_t is 64bit wide
but will only contain 32bit values; casting via u_long is safe)
2000-12-04 20:17:10 +00:00
fvdl e58fff48bf Avoid compile warning on sparc64 32bit. sc_buffer doesn't seem to be
used at all, this line can probably be removed.
2000-12-04 20:12:55 +00:00
eeh 2a50931a1c Turn on TAG QUEUE support and add some debug stuff. 2000-12-03 23:31:13 +00:00
thorpej b84f740be0 Move bpfattach()/bpfdetach() calls into ether_ifattach()/ether_ifdetach(). 2000-11-15 01:02:11 +00:00
eeh 507aaec04c Adapt to the new line discipline scheme. 2000-11-02 00:01:44 +00:00
eeh 55fd5a2fb0 Pass along the bus frequency too, for devices that need it. 2000-11-01 06:18:45 +00:00
eeh 34ed153955 Fix warning in a debug printf. 2000-11-01 06:17:32 +00:00
eeh f9a51c7b15 Clean up a #define that doesn't belong. Oops. That's what I get for
working this late.
2000-10-31 08:06:14 +00:00
eeh 37486bb837 Get the bpp driver to work properly. 2000-10-31 06:32:06 +00:00
mjacob 0a481d850d fix SBus bursting *correctly* this time 2000-10-22 03:04:50 +00:00
mrg 0c6aa8d3ed ensure DMA mappings are not mapped streamable. fixes ethernet problems on
ultrasparc sbus class machines.  from eeh.
2000-10-20 06:08:02 +00:00
mrg 3af567c485 rework to use bus_dmamem_map() then bus_dmamem_load(), rather than
bus_dmamem_load_raw() then bus_dmamem_map().

tested on SS2 and SS5 and sbus cards.
2000-10-20 05:57:50 +00:00
mjacob cecccb23b2 quiet chatty boot messages 2000-10-17 17:39:10 +00:00
mjacob 7cc31292b3 Turn on 32 byte bursting for ISP 2000-10-16 05:13:13 +00:00
pk aa6df7169b yank error. 2000-09-12 19:13:30 +00:00
pk 17e5f7b17c Declare drivers moved here from arch/sparc. 2000-08-22 21:31:16 +00:00
pk d29f2ce630 Get tcxreg.h from the correct location. 2000-08-22 21:18:57 +00:00
pk 124d256269 Move these SBus drivers here from arch/sparc. 2000-08-20 22:27:07 +00:00
pk 5a308cf392 Split & move cgthree sbus attachment from arch/sparc. 2000-08-20 19:59:46 +00:00
pk 7857ad0b81 Move cgsix and bwtwo Sbus attach code here from arch/sparc. 2000-08-20 14:33:25 +00:00
mjacob d8aef491c1 Add a maintenance note. Add a bus specific isp_sbus_intr function- this is
so we, ahem, note we're on an interrupt stack so we don't try and sleep
on any mailbox commands we might want to run.
2000-08-14 07:00:08 +00:00
mjacob 068c76fc80 Core version 2.0 (platform version 1.0) rewrite of ISP driver. Some
interace cleanups, some new common functions. The major impact that
will be noticeable right away is that if you boot with not Fibre connected
to the FC cards, you no longer hang indefinitely.
2000-08-01 23:55:09 +00:00
mycroft f9f72ecf9a Purge C++-style comments. 2000-07-24 04:28:51 +00:00
pk 406e0f779f Add a `device class' interrupt level argument (from machine/intr.h)
to bus_interrupt_establish().

It's currently only used in sparc64/dev/psycho.c to assign a CPU interrupt
level to devices in PCI slots.
2000-07-09 20:57:41 +00:00
mjacob 855b5ef9b0 Use new isp_handle_index inline function. Change order in whch
some things are done. Remember to enable interrupts after calling
isp_reset but before isp_attach.
2000-07-05 22:10:56 +00:00
mrg 261538ecac remove include of <vm/vm.h> 2000-06-28 16:39:25 +00:00
eeh 79dffec702 Get PCI HME working. 2000-06-25 01:05:16 +00:00
pk f67e2cd132 Eliminate a race condition reported by mouse on port-sparc. 2000-06-14 08:01:26 +00:00
nisimura 4371d91433 Have MI ncr53c9x_attach() the 2nd and 3rd arguments for scsipi_adater
and scsipi_device respectively, with size reduction of ncr53c9x_softc.
Specifying NULL instructs the driver to use default adapter and default
device codes. Every target port has ncr53c9x_attach(sc, NULL, NULL) anyway.
2000-06-05 07:59:50 +00:00
cgd cffb580806 Implement the more flexiable `evcnt' interface as discussed (briefly) on
tech-kern and now documented in evcnt(9).
2000-06-04 19:14:14 +00:00
pk 82dbe14248 No need to specify page alignment; this is automatic. 2000-05-10 14:25:43 +00:00
pk bb1605cff5 Fix bogus `boundary' argument in bus_dmamap_create(). 2000-05-10 14:16:11 +00:00
pk 2e595d79d8 Load DMA buffer before mapping it into kernel space. 2000-05-10 11:15:32 +00:00
pk 18a16edec1 Conform bus_dmamem_{alloc,map} usage to bus_dma(9) specs. 2000-05-09 23:16:19 +00:00
pk 1bf775b965 Conform bus_dmamem_{alloc,map} usage to bus_dma(9) specs. 2000-05-09 22:42:08 +00:00
mrg dfe176302c add some casts to (u_long) to shut up gcc 2000-04-14 08:22:49 +00:00
mycroft 528bd4a794 Move esp declaration to conf/files. 2000-03-25 19:58:04 +00:00
thorpej fc96443d15 New callout mechanism with two major improvements over the old
timeout()/untimeout() API:
- Clients supply callout handle storage, thus eliminating problems of
  resource allocation.
- Insertion and removal of callouts is constant time, important as
  this facility is used quite a lot in the kernel.

The old timeout()/untimeout() API has been removed from the kernel.
2000-03-23 07:01:25 +00:00
pk 9e16037265 Simplify the attach routine a bit. 2000-02-22 12:24:53 +00:00
pk b4e291e818 Fix some off-by-one errors; patch from Jonathan O'Brien. 2000-02-22 12:12:21 +00:00
mjacob 6f13498242 correct oops on last checkin 2000-02-19 15:13:07 +00:00
mjacob a9697ee5f2 Handle > 12 byte CDBs. 2000-02-19 01:55:42 +00:00
pk a1b5434cec Make promiscuous mode go again. 2000-02-14 17:06:45 +00:00
thorpej 94b1e4084a Don't dry to diving MIIF_NOISOLATE in the PHY drivers. Instead, pass
flags down from the parent to child vi mii_attach().
2000-02-02 17:46:42 +00:00
thorpej 84dc99fdea Bring some order to the chaos which was the MII code function naming
"conventions".
2000-02-02 08:05:26 +00:00
mjacob 0e0104d0e9 There is no readily available tool to set NVRAM on isp's on sparc,
so ignore it.
2000-01-14 08:43:17 +00:00
joda 78d457dc77 (stp4020_chip_mem_map): explicitly don't handle 8-bit memory 2000-01-13 10:03:25 +00:00
pk c6b6f3883a Remove old-style boot device recognition. 2000-01-11 12:59:43 +00:00
mjacob 2a7d01e353 The trigger for not downloading f/w is now a
NULL f/w pointer, not a nonzero f/w length.
2000-01-09 18:55:11 +00:00
mjacob 250a1f41c2 The sense of being able to sleep for DMA resources was reversed. Oops. 2000-01-09 18:44:40 +00:00
pk 2afd4d3aec * remove full duplex modes for the internal transceiver
* internal transceiver needs to be reset for the BMSR_LINK bit to
  be even remotely reliable
* because of previous, maintain link state, so we won't be sensing speed
  all the time when interface flags need to be changed (e.g. entering/exiting
  promiscuous mode)
* in auto-speed mode, report link condition changes on the console
1999-12-23 16:39:56 +00:00
pk 7ab5ad7988 Streamline media code a bit by some `pseudo-mii' code designed to handle
the on-board transceiver.
1999-12-22 16:05:12 +00:00
pk f037f3be7e Shuffle some code around to allow two PHYs to attach. Only one PHY can
be used at a time, but it's now possible to select one by using ifconfig(8)'s
`instance' parameter.
1999-12-21 21:07:42 +00:00
pk bbbbfe896e * Remove spurious blockade in the path to get the transceiver status word.
* Make sure to flip the 10baseT/100baseTX bit when doing autoselect.
* Miscellaneous cosmetics.
1999-12-20 22:23:39 +00:00
pk d135edf1a7 #define the bit positions of the MIF I/O lines. 1999-12-20 22:19:11 +00:00
mjacob 5babd2b8c9 get back to looking at config flags 1999-12-20 00:49:58 +00:00
mjacob e6da5abb16 Add back in inclusion of microcode and rationalize it. request/response
queue indices need to be u_int16_t wide.
1999-12-04 02:56:30 +00:00
pk d5a471ccc9 Check presence of Sbus interrupt properties before using them.
Only one case is known to trigger this omission: a Sparc Classic
configured as X terminal.
1999-11-21 15:01:50 +00:00
thorpej 4bdf6bd731 Call mii_down() as appropriate. 1999-11-12 18:14:17 +00:00
pk 23c39b410d Fix some diagnostic output with a patch from Jonathan O'Brien. 1999-11-05 19:00:44 +00:00
mrg bd0928e723 find "SUNW,hme" as well as "hme". this matches the onboard
ultra2 hme.  haven't actually tested this beyond it probing
because my scsibus is hanging.  anyway, it reports:

hme0 at sbus0 slot 14 offset 0x8c00000 vector 21 ipl 6: address 08:00:20:8f:7f:8f
1999-11-04 05:31:38 +00:00
thorpej ca9b9a3b2e Adapt to mii_phy_probe() change. 1999-11-04 00:24:00 +00:00
mjacob 44c603dd7b Remove reference to loadable f/w. 1999-10-28 16:11:19 +00:00
mjacob 6bbb170768 We alloc xflist and dma maps in mailbox setup. We swizzle endian stuff
at the end of dma setup.
1999-10-14 02:16:04 +00:00
thorpej 63b8530b4e Update for SCSPI changes. 1999-09-30 23:04:39 +00:00
thorpej 7b3258b6a7 Make the kthread API a bit more friendly to loadable kernel modules. 1999-07-06 21:44:09 +00:00
pk a7e4d3ac4d Add the Sbus front-end for the HME driver. 1999-06-27 12:47:52 +00:00
pk 4f2e48c4d2 Don't turn on the engine too early.
Add and use QEDEBUG.
1999-06-24 19:59:14 +00:00
pk 9335333dee Issue a reset command when initializing. 1999-06-24 19:56:51 +00:00
mrg 67cbdf5623 split sbus audiocs code up so we can share it with the ebus. XXX ebus DMA is probably different. 1999-06-05 14:29:10 +00:00
pk 61e5d73035 Fix bus_size_t/size_t/int confusion. 1999-05-27 14:22:28 +00:00
thorpej f98d358a1f Rework layer 2 protocol input routines. Instead of calling e.g. ether_input()
directly, call the function pointer (*if_input)(ifp, m).  The input routine
expects the packet header to be at the head of the packet, and will adjust
as necessary.  Privatize the layer 2 input and output routines, allowing
*_ifattach() to set them up as appropriate.
1999-05-18 23:52:51 +00:00
mrg f5af676456 white space. 1999-05-16 14:47:52 +00:00
pk 569836a986 It is no longer necessary to protect bus_dma_[un]load() at splbio, since
sparc bus_dma*() functions now protect their own internals..
1999-04-25 10:40:53 +00:00
pk 52db3a158e Correct QESTAT `%b' format string. 1999-04-20 20:24:39 +00:00
pk 401d03761f Initialize automatics in stp4020print(); noticed by Jonathan O'Brien. 1999-03-29 21:30:48 +00:00
cjs 5ecfcfbb96 Make `sun4m DMA not supported yet' message print only for this device,
rather than every sbus device probed.
1999-03-29 12:04:43 +00:00
mjacob d8aa229a12 roll internal release tag 1999-03-26 22:45:17 +00:00
mjacob 3cafeadabd Add support for the PTI SBS430. It's a FAS200 type chip- it's a bit funky
in that the registers aren't spread by a longword like all the other SBus/ESP
cards. Otherwise it's much the same. It'll make Brad Salai happy.
1999-03-26 06:48:40 +00:00
pk 54ae4d24b8 Call bus_dma_[un]load() at splbio. 1999-03-23 00:38:15 +00:00
pk d86e93c62a Fix promiscuous modes - patches from Jason Wright. 1999-03-23 00:27:09 +00:00
eeh b71ea6aad4 Use correctly bus_space_*() macros to access device registers. 1999-03-19 02:32:48 +00:00
mjacob c312dfb410 prototype 1080/1240 support caused register offset rewhack 1999-03-17 06:17:16 +00:00
mrg fbda6bed6d make this compile on SUN4U. XXX icky, reader beware. 1999-03-09 00:42:20 +00:00
pk 87ae97e3f0 Fix what is probably a past-o. 1999-02-28 17:01:49 +00:00
pk 5c062abb64 Fix the bus print function. 1999-02-27 22:21:13 +00:00
pk 331694119a Our device name differs from the PROMs node name. 1999-02-27 13:17:08 +00:00
pk c6c74098d0 Don't try to use the MII routines for the internal PHY. 1999-02-19 14:57:00 +00:00
mycroft 71105fbda7 Update comments. 1999-02-17 21:44:55 +00:00
mycroft e5f5e628d2 Pass the direction to the allocm and round_buffersize methods.
Some drivers need this to properly allocate DMAable memory.
1999-02-17 02:37:38 +00:00
mjacob 1a911bb798 roll internal release level 1999-02-09 00:54:07 +00:00
mrg 4553ce553c use <dev/sbus/sbusvar.h> not <sparc/dev/sbusvar.h> 1999-02-03 06:03:37 +00:00
mjacob 5c5ac2958f roll internal release tag and finally use bus_space I/O 1999-01-30 07:10:38 +00:00
pk 2fa7bdbccd Fix AF_NS code. 1999-01-18 13:29:01 +00:00
pk fb846bde24 Share ring buffer code and data structure for `be' and `qe' in
the QEC module. Adapt the QEC interrupt establish code to suit the
needs of the `qe' device.
1999-01-17 20:47:50 +00:00
pk ad3176f350 Add `qe' network interface device. 1999-01-17 20:44:58 +00:00
pk 5e8fcd9428 Import Jason Wright's Sbus Quad ethernet (`qe') driver as found in OpenBSD.
Heavily pounded on by me to make it fit our driver model.
Also added: auto media selection; shared ring buffer code with `be'.
1999-01-17 20:44:18 +00:00
pk 6d1f55bc7a Initial revision 1999-01-16 13:19:11 +00:00
pk c830c88dd2 Convert to bus_space(9).
Add buffer allocations needed by the be driver.
1999-01-16 12:46:08 +00:00
pk e0e761e420 Import Jason Wright's Bigmac driver, written for OpenBSD.
Heavily pounded on by me to make it fit our driver model.
1999-01-16 12:43:09 +00:00
kleink a9b05361c1 Avoid arithmetic on void *. 1999-01-12 02:28:55 +00:00
mjacob e618c0c7d7 turn on SBUS bursts 1999-01-10 06:22:12 +00:00
mjacob d6cab14b00 clean up headers 1998-12-28 19:12:26 +00:00
pk bb12def997 Use `pcmciabus' to attach the Sbus to PCMCIA bridge. 1998-11-26 15:33:29 +00:00
pk 2814b02ec8 Define STP4020 chipset driver by its nickname `nell'.
XXX - also define a `pcic' attribute here, so we can attach a pcmcia bus
1998-11-22 22:17:27 +00:00
pk 5e4ad115c3 The beginnings of a driver for the Sbus <=> PCMCIA bridge chipset STP4020. 1998-11-22 22:14:35 +00:00
thorpej 3b068a6c78 Adapt to the new scsipi_adapter interface. 1998-11-19 21:53:32 +00:00
thorpej 29d472f53d Garbage-collect the open_target_lu and close_target_lu entry points from
struct scsipi_adapter; they were not used.

Add a scsipi_ioctl entry point to struct scsipi_adapter.  This will be
used to issue ioctl commands to the host adapters.

Inspired by PR #6090, from Matt Jacob.
1998-10-10 00:28:28 +00:00
pk 1338a7e982 hwreset(): delay required after diddling the medium selection bit. 1998-09-26 08:31:20 +00:00
pk ed652e2a09 Fix a silly yank-o. 1998-09-25 14:19:20 +00:00
pk 6da4cd8aac Make dma_sbus.c dependent on dma_sbus attribute. 1998-09-23 08:48:25 +00:00
pk f9e261c5e4 LSI63854 based parallel port driver skeleton. 1998-09-21 21:20:47 +00:00
pk fa25d48556 Add `bpp' device: the parallel port glued onto the LSI64854 DMA controller. 1998-09-21 21:02:23 +00:00
mjacob 8fdc5aee4b Make changes as required for new return values from dma setup routine
for isp. Unable to test in running kernel because they're not buildable today,
but should be okay.
1998-09-18 00:26:11 +00:00
pk cf10308f5f bootpath check needs to keep checking for two formats. 1998-09-15 20:26:25 +00:00
mjacob 8fec1fd696 add bustype tag to softc 1998-09-08 07:36:26 +00:00
pk af17d22848 Missing bits in DEBUG mode. 1998-09-07 07:58:45 +00:00
eeh 199e474e95 Removed some spurious `long's. 1998-09-06 22:43:16 +00:00
eeh c5b834a5bc Do it right for a change. 1998-09-06 21:23:58 +00:00