Subject: bin/2549: /usr/sbin/config mistakely merges devices attached
To: None <gnats-bugs@NetBSD.ORG>
From: Jonathan Stone <jonathan@DSG.Stanford.EDU>
List: netbsd-bugs
Date: 06/14/1996 21:44:04
	Note: There was a bad value `<high' for the field `>Priority:'.
	It was set to the default value of `medium'.


>Number:         2549
>Category:       bin
>Synopsis:       /usr/sbin/config mistakely merges devices attached
>Confidential:   no
>Severity:       critical
>Priority:       medium
>Responsible:    bin-bug-people (Utility Bug People)
>State:          open
>Class:          sw-bug
>Submitter-Id:   net
>Arrival-Date:   Sat Jun 15 01:05:05 1996
>Last-Modified:
>Originator:     Jonathan Stone
>Organization:
	
>Release:        1.2_ALPHA
>Environment:
	
System: NetBSD Reno.DSG.Stanford.EDU 1.2_ALPHA NetBSD 1.2_ALPHA (NEWCONF) #0: Fri Jun 14 09:53:40 PDT 1996 jonathan@Reno.DSG.Stanford.EDU:/usr/src/sys/arch/pmax/compile/NEWCONF pmax


>Description:

NetBSD/pmax kernels misconfigure lance ethernet devices, due to
config(8)  erroneously merging device specifications for a lance
device on two separate busses, with distinct attachment structures,
into a single entry in  struct cfdata.  A full explanation follows.

NetBSD/pmax kernel config files specify that Lance ethernet devices
attach in one of three ways.

On the kn01 (pmax), which has no expamsion bus and no options save
a framebuffer, the lance driver attaches directly to the mainbus.
On machines with a DEC  IOCTL asic (ioasic, as used on Turbochannel Alphas),
the baseboard lance device is attached via the ioasic.
On the 5000/200, which lacks an ioctl asic, the baseboard lance device
emulates a TurboChannel option card, and attaches as a tc option card.
(tc option  cards attach via the turbochannel bus.)

Files.pmax lists these as
# LANCE ethernet driver.
#  XXX Should use new machine-independent one instead.
# device defined in sys/conf/files
attach le at ioasic with le_ioasic
attach le at tc with le_tc
attach le at mainbus with le_pmax
#file	arch/pmax/tc/if_le.c		(le_pmax|le_tc|le_ioasic) needs-flag


file	dev/tc/if_le_dec.c		(le_ioasic | le_tc | le_pmax)
file	dev/tc/if_le_ioasic.c		le_ioasic	needs-flag #for le_iomem
file	dev/tc/if_le_tc.c		le_tc
file	dev/tc/if_le_ibus.c		le_pmax		needs-flag #for kn01_intr

>How-To-Repeat:

Configure a pmax kernel using the NEWCONF config file.
Examine the ioconf.c produced. Note how there's no entry for
an le device attached via mainbus using le_pmax_ca. config has
incorrectly merged that entry with the entry for ioasic-attached
devices:

Similarly, changing the order of the devices in the config file,
so that the le0 at mainbus appears first, results in a config file which
lists

/*  0: le0 at mainbus0|ioasic0 */
    {&le_pmax_ca,	&le_cd,		 0, NORM,     loc,      0, pv+ 4, 0},

which *cannot* configure an ioasic-attached device.

>Fix:

Botching one or other of the ioasic or mainbus-attached devices
to be "le* at foobar" seems to cause config to stop merging
the le0 at ioasic|mainbus entries. However, that is not an acceptable
solution, as it causes the baseboard lance to configure as  le1,
which is most confusing.  (It also causes the NetBSD/kernel to crash
on a 3100.)
>Audit-Trail:
>Unformatted:
     to multiple busses with identical attributes but distinct attachments.