Date: Thu, 6 Apr 1995 19:13:09 -0400 (EDT) From: "Jonathan M. Bresler" <jmb@kryten.Atinc.COM> To: "Jordan K. Hubbard" <jkh@freefall.cdrom.com> Cc: Bruce Evans <bde@zeta.org.au>, ache@astral.msk.su, rgrimes@gndrsh.aac.dev.com, freebsd-current@freefall.cdrom.com Subject: Re: Strange kernel printf... Message-ID: <Pine.3.89.9504061902.A5004-0100000@kryten.atinc.com> In-Reply-To: <9774.797139762@freefall.cdrom.com>
next in thread | previous in thread | raw e-mail | index | archive | help
On Wed, 5 Apr 1995, Jordan K. Hubbard wrote:
> 2. Accept a somewhat altered config file specification:
>
> device <foo> at <bus>[#|?] port <port>[,<port> ..] irq <irq>[,<irq> ..] drq <drq>[, <drq> ..]
> [conflict_ok <conflict_type>[, <conflict-type> ..]]
>
> Where "conflict_ok" would take arguments like "iomem, irq, drq, etc."
> to enable bits in an "allowed conflicts" mask. This would eliminate
> the ALLOW_CONFLICT_* horrors I inflicted upon the code many months ago.
here are diffs to 1.1.5.1 sources that remove the need to the
ALLOW_XXX_CONFLICT flags.
spec the two devices, how they can conflict, and the order in
which they are probed--that conflict is then allowed. alll other
conflicts are treated as they are now--the second device is not probed.
if this can be used, i will gen patches for 2.0-RELEASE and
current as for the last sup.
i have used kernels with these patches continuously since sept
1994 when chuck robey helped me get a soundblaster working. i just could
live with the ALLOW options in the kernel.
patches at end.
Jonathan M. Bresler jmb@kryten.atinc.com | Analysis & Technology, Inc.
| 2341 Jeff Davis Hwy
play go. | Arlington, VA 22202
ride bike. hack FreeBSD.--ah the good life | 703-418-2800 x346
*** sys/i386/isa/isa.c.orig Fri Aug 26 15:51:21 1994
--- sys/i386/isa/isa.c Sat Sep 3 23:37:34 1994
***************
*** 65,68 ****
--- 65,69 ----
#include "i386/isa/ic/i8237.h"
#include "i386/isa/ic/i8042.h"
+ #include "i386/isa/known_conflicts.h"
/*
***************
*** 84,87 ****
--- 85,121 ----
void config_isadev __P((struct isa_device *, u_int *));
+ unsigned short
+ strequal( one, two )
+ register const char *one, *two;
+ {
+
+ while ( *one || *two )
+ if ( *one++ != *two++)
+ return 0;
+ return 1;
+ }
+
+ /*
+ * check the conflict, to see if its allowed
+ */
+ unsigned short
+ allowed(dvp, tmpdvp, reason)
+ struct isa_device *dvp, *tmpdvp;
+ short reason;
+ {
+ struct known_conflict *this;
+
+ for( this = known_conflicts; this->sec_name; this++ ) {
+ if ( ( dvp->id_unit == this->sec_unit )
+ && ( tmpdvp->id_unit == this->first_unit )
+ && ( reason & this->type )
+ && strequal(dvp->id_driver->name, this->sec_name)
+ && strequal(tmpdvp->id_driver->name, this->first_name) ) {
+ return 1;
+ }
+ }
+ return 0;
+ }
+
/*
* print a conflict message
***************
*** 126,132 ****
(tmpdvp->id_iobase + tmpdvp->id_alive - 1))) {
#ifndef ALLOW_CONFLICT_IOADDR
! conflict(dvp, tmpdvp, dvp->id_iobase,
! "I/O address", "0x%x");
! status = 1;
#endif
}
--- 160,168 ----
(tmpdvp->id_iobase + tmpdvp->id_alive - 1))) {
#ifndef ALLOW_CONFLICT_IOADDR
! if ( !allowed(dvp, tmpdvp, IO_CONFLICT) ) {
! conflict(dvp, tmpdvp, dvp->id_iobase,
! "I/O address", "0x%x");
! status = 1;
! }
#endif
}
***************
*** 147,153 ****
(tmpdvp->id_maddr + tmpdvp->id_msize - 1))) {
#ifndef ALLOW_CONFLICT_MEMADDR
! conflict(dvp, tmpdvp, dvp->id_maddr, "maddr",
! "0x%x");
! status = 1;
#endif
}
--- 183,191 ----
(tmpdvp->id_maddr + tmpdvp->id_msize - 1))) {
#ifndef ALLOW_CONFLICT_MEMADDR
! if ( !allowed(dvp, tmpdvp, MEM_CONFLICT) ) {
! conflict(dvp, tmpdvp, dvp->id_maddr,
! "maddr", "0x%x");
! status = 1;
! }
#endif
}
***************
*** 159,165 ****
if(tmpdvp->id_irq) {
if (tmpdvp->id_irq == dvp->id_irq) {
! conflict(dvp, tmpdvp, ffs(dvp->id_irq) - 1,
! "irq", "%d");
! status = 1;
}
}
--- 197,205 ----
if(tmpdvp->id_irq) {
if (tmpdvp->id_irq == dvp->id_irq) {
! if ( !allowed(dvp, tmpdvp, IRQ_CONFLICT) ) {
! conflict(dvp, tmpdvp, ffs(dvp->id_irq) - 1,
! "irq", "%d");
! status = 1;
! }
}
}
***************
*** 171,177 ****
if(tmpdvp->id_drq != -1) {
if (tmpdvp->id_drq == dvp->id_drq) {
! conflict(dvp, tmpdvp, dvp->id_drq,
! "drq", "%d");
! status = 1;
}
}
--- 211,219 ----
if(tmpdvp->id_drq != -1) {
if (tmpdvp->id_drq == dvp->id_drq) {
! if ( !allowed(dvp, tmpdvp, DRQ_CONFLICT) ) {
! conflict(dvp, tmpdvp, dvp->id_drq,
! "drq", "%d");
! status = 1;
! }
}
}
*** sys/i386/isa/sound/sb16_dsp.c.orig Fri Sep 2 13:09:13 1994
--- sys/i386/isa/sound/sb16_dsp.c Fri Sep 2 13:38:12 1994
***************
*** 506,509 ****
--- 506,513 ----
switch (level)
{
+ case 2: /* XXX jmb 940902 added this, set the lowest bit ?? */
+ case 9: /* yes both irq 2 and irq 9 are the same */
+ ival = 1;
+ break;
case 5:
ival = 2;
*** /dev/null Mon Sep 5 12:37:56 1994
--- sys/i386/isa/known_conflicts.h Mon Sep 5 12:57:05 1994
***************
*** 0 ****
--- 1,36 ----
+ /*
+ ** list of known conflicting isa bus devices and the manner in which
+ ** which they conflict.
+ **
+ ** each entry in the known_conflicts strcuture defines a single allowed
+ ** conflict:
+ ** sec_name: name of the conflicting device as recorded in
+ ** isa_device->id_driver->name
+ ** sec_unit: unit number of conflicting device as recored in
+ ** isa_device->id_unit
+ ** first_name: name of the device conflicted with as recorded in
+ ** isa_device->isa_driver->name
+ ** first_unit: unit number of device conflicted with as recored in
+ ** isa_device->id_unit
+ ** flags: OR of allowed types of conflict
+ **
+ */
+ #define MEM_CONFLICT 1
+ #define IRQ_CONFLICT 2
+ #define DRQ_CONFLICT 4
+ #define IO_CONFLICT 8
+
+ struct known_conflict {
+ char *sec_name; /* second device probed for */
+ int sec_unit;
+ char *first_name; /* first device found */
+ int first_unit;
+ unsigned short type;
+ }
+ known_conflicts[] = {
+
+ { "psm", 0, "sc", 0, IO_CONFLICT },
+ { "snd", 6, "snd", 2, IO_CONFLICT | IRQ_CONFLICT },
+ { (char *)0, 0, (char *)0, 0, 0 }
+
+ };
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?Pine.3.89.9504061902.A5004-0100000>
