diff options
author | jmg <jmg@FreeBSD.org> | 1997-09-19 15:20:25 +0000 |
---|---|---|
committer | jmg <jmg@FreeBSD.org> | 1997-09-19 15:20:25 +0000 |
commit | 6d02356368490b36d701bc5fb7890e9067455af6 (patch) | |
tree | c77448d1e5d64b378a6a357ea83bd3d091c10da2 | |
parent | d3d13402b907e7b1ab063873cf2b80a7fcdb71ba (diff) | |
download | FreeBSD-src-6d02356368490b36d701bc5fb7890e9067455af6.zip FreeBSD-src-6d02356368490b36d701bc5fb7890e9067455af6.tar.gz |
teach pnp to keep isa_device structs around, and teach isa.c how to scan
these structs for conflics...
it still exist that two PnP cards can colide, but this is up to the user
to make sure it doesn't happen...
other modifications to pnp.c to format output properly, and hide more
output behind bootverbose flag...
fix some bugons in pnp.h that would of made it difficult for inclusion
in external programs (for import of pnpinfo)
-rw-r--r-- | sys/amd64/isa/isa.c | 19 | ||||
-rw-r--r-- | sys/i386/isa/isa.c | 19 | ||||
-rw-r--r-- | sys/i386/isa/pnp.c | 116 | ||||
-rw-r--r-- | sys/i386/isa/pnp.h | 16 |
4 files changed, 122 insertions, 48 deletions
diff --git a/sys/amd64/isa/isa.c b/sys/amd64/isa/isa.c index abdcfa3..c5a9ea4 100644 --- a/sys/amd64/isa/isa.c +++ b/sys/amd64/isa/isa.c @@ -34,7 +34,7 @@ * SUCH DAMAGE. * * from: @(#)isa.c 7.2 (Berkeley) 5/13/91 - * $Id: isa.c,v 1.102 1997/08/25 22:52:59 bde Exp $ + * $Id: isa.c,v 1.103 1997/08/28 03:36:40 msmith Exp $ */ /* @@ -66,6 +66,11 @@ #include <sys/interrupt.h> +#include "pnp.h" +#if NPNP > 0 +#include <i386/isa/pnp.h> +#endif + /* ** Register definitions for DMA controller 1 (channels 0..3): */ @@ -293,6 +298,9 @@ haveseen_isadev(dvp, checkbits) struct isa_device *dvp; u_int checkbits; { +#if NPNP > 0 + struct pnp_dlist_node *nod; +#endif struct isa_device *tmpdvp; int status = 0; @@ -316,6 +324,11 @@ haveseen_isadev(dvp, checkbits) if (status) return status; } +#if NPNP > 0 + for (nod = pnp_device_list; nod != NULL; nod = nod->next) + if (status |= haveseen(dvp, &(nod->dev), checkbits)) + return status; +#endif #ifdef RESOURCE_CHECK if (!dvp->id_conflicts) { status = check_pciconflict(dvp, checkbits); @@ -551,8 +564,7 @@ config_isadev_c(isdp, mp, reconfig) printf(" at 0x%x", isdp->id_iobase); printf("\n"); } - } - else { + } else { #if 0 /* This code has not been tested.... */ if (isdp->id_irq) { @@ -913,7 +925,6 @@ isa_dmastatus(int chan) u_long cnt = 0; int ffport, waport; u_long low1, high1, low2, high2; - u_long ef; /* channel active? */ if ((dma_inuse & (1 << chan)) == 0) { diff --git a/sys/i386/isa/isa.c b/sys/i386/isa/isa.c index abdcfa3..c5a9ea4 100644 --- a/sys/i386/isa/isa.c +++ b/sys/i386/isa/isa.c @@ -34,7 +34,7 @@ * SUCH DAMAGE. * * from: @(#)isa.c 7.2 (Berkeley) 5/13/91 - * $Id: isa.c,v 1.102 1997/08/25 22:52:59 bde Exp $ + * $Id: isa.c,v 1.103 1997/08/28 03:36:40 msmith Exp $ */ /* @@ -66,6 +66,11 @@ #include <sys/interrupt.h> +#include "pnp.h" +#if NPNP > 0 +#include <i386/isa/pnp.h> +#endif + /* ** Register definitions for DMA controller 1 (channels 0..3): */ @@ -293,6 +298,9 @@ haveseen_isadev(dvp, checkbits) struct isa_device *dvp; u_int checkbits; { +#if NPNP > 0 + struct pnp_dlist_node *nod; +#endif struct isa_device *tmpdvp; int status = 0; @@ -316,6 +324,11 @@ haveseen_isadev(dvp, checkbits) if (status) return status; } +#if NPNP > 0 + for (nod = pnp_device_list; nod != NULL; nod = nod->next) + if (status |= haveseen(dvp, &(nod->dev), checkbits)) + return status; +#endif #ifdef RESOURCE_CHECK if (!dvp->id_conflicts) { status = check_pciconflict(dvp, checkbits); @@ -551,8 +564,7 @@ config_isadev_c(isdp, mp, reconfig) printf(" at 0x%x", isdp->id_iobase); printf("\n"); } - } - else { + } else { #if 0 /* This code has not been tested.... */ if (isdp->id_irq) { @@ -913,7 +925,6 @@ isa_dmastatus(int chan) u_long cnt = 0; int ffport, waport; u_long low1, high1, low2, high2; - u_long ef; /* channel active? */ if ((dma_inuse & (1 << chan)) == 0) { diff --git a/sys/i386/isa/pnp.c b/sys/i386/isa/pnp.c index aad6723..7fbe195 100644 --- a/sys/i386/isa/pnp.c +++ b/sys/i386/isa/pnp.c @@ -23,15 +23,17 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: pnp.c,v 1.1 1997/09/09 12:31:57 jmg Exp $ + * $Id: pnp.c,v 1.2 1997/09/18 08:04:11 jmg Exp $ */ #include <sys/param.h> #include <sys/systm.h> #include <sys/kernel.h> /* for DATA_SET */ +#include <sys/malloc.h> #include <sys/interrupt.h> #include <machine/clock.h> #include <machine/cpufunc.h> +#include <machine/md_var.h> #include <i386/isa/pnp.h> #include <i386/isa/isa_device.h> @@ -40,6 +42,9 @@ int num_pnp_cards = 0; pnp_id pnp_devices[MAX_PNP_CARDS]; +struct pnp_dlist_node *pnp_device_list; +static struct pnp_dlist_node **pnp_device_list_last_ptr; + /* * these entries are initialized using the autoconfig menu * The struct is invalid (and must be initialized) if the first @@ -329,6 +334,7 @@ enable_pnp_card() void config_pnp_device(pnp_id *p, int csn) { + static struct pnp_dlist_node *nod = NULL; int i; u_char *data = (u_char *)p; @@ -336,12 +342,10 @@ config_pnp_device(pnp_id *p, int csn) struct pnp_device *dvp, **dvpp; char *name ; - printf("CSN %d Vendor ID: %c%c%c%02x%02x [0x%08lx] Serial 0x%08lx\n", - csn, - ((data[0] & 0x7c) >> 2) + 64, - (((data[0] & 0x03) << 3) | ((data[1] & 0xe0) >> 5)) + 64, - (data[1] & 0x1f) + 64, data[2], data[3], - p->vendor_id, p->serial); + printf("CSN %d Vendor ID: %c%c%c%02x%02x [0x%08lx] Serial 0x%08lx\n", csn, + ((data[0] & 0x7c) >> 2) + '@', + (((data[0] & 0x03) << 3) | ((data[1] & 0xe0) >> 5)) + '@', + (data[1] & 0x1f) + '@', data[2], data[3], p->vendor_id, p->serial); doing_pnp_probe = 1 ; current_csn = csn ; @@ -355,8 +359,10 @@ config_pnp_device(pnp_id *p, int csn) if (pnp_ldn_overrides[i].csn == csn && pnp_ldn_overrides[i].override == 1) { struct pnp_cinfo d; - printf("PnP: override config for CSN %d LDN %d vend_id 0x%08x\n", - csn, pnp_ldn_overrides[i].ldn, current_pnp_id); + if (bootverbose) + printf("PnP: override config for CSN %d LDN %d " + "vend_id 0x%08x\n", csn, pnp_ldn_overrides[i].ldn, + current_pnp_id); /* next assignement is done otherwise read fails */ d.vendor_id = current_pnp_id ; read_pnp_parms(&d, pnp_ldn_overrides[i].ldn); @@ -396,32 +402,70 @@ config_pnp_device(pnp_id *p, int csn) * the attach routine until enable_pnp_card() has been done. */ - bzero( &(dvp->dev), sizeof(dvp->dev) ); - dvp->dev.id_unit = unit ; + if (nod == NULL) + nod = malloc(sizeof(struct pnp_dlist_node), M_DEVBUF, M_NOWAIT); + if (nod == NULL) + panic("malloc failed for PnP resource use"); + bzero(nod, sizeof(*nod)); + nod->pnp = dvp; + nod->dev.id_unit = unit ; if (dvp->pd_attach) - (*dvp->pd_attach) (csn, p->vendor_id, name, &(dvp->dev)); - if (dvp->dev.id_irq) { - /* the board uses interrupts. Register it. */ - if (dvp->imask) - INTRMASK( *(dvp->imask), dvp->dev.id_irq ); - register_intr(ffs(dvp->dev.id_irq)-1, dvp->dev.id_id, - dvp->dev.id_ri_flags, dvp->dev.id_intr, - dvp->imask, dvp->dev.id_unit); - INTREN(dvp->dev.id_irq); - } - printf("%s%d (%s <%s> sn 0x%08lx) at 0x%x " - "irq %d drq %d flags 0x%x id %d\n", - dvp->dev.id_driver && dvp->dev.id_driver->name ? - dvp->dev.id_driver->name : "unknown", - unit, - dvp->pd_name, name, p->serial, - dvp->dev.id_iobase, - ffs(dvp->dev.id_irq)-1, - dvp->dev.id_drq, - dvp->dev.id_flags, - dvp->dev.id_id); + (*dvp->pd_attach) (csn, p->vendor_id, name, &(nod->dev)); + printf("%s%d (%s <%s> sn 0x%08lx)", nod->dev.id_driver && + nod->dev.id_driver->name ? nod->dev.id_driver->name : "unknown", + unit, dvp->pd_name, name, p->serial); + if (nod->dev.id_alive) { + if (nod->dev.id_irq) { + /* the board uses interrupts. Register it. */ + if (dvp->imask) + INTRMASK( *(dvp->imask), nod->dev.id_irq ); + register_intr(ffs(nod->dev.id_irq) - 1, nod->dev.id_id, + nod->dev.id_ri_flags, nod->dev.id_intr, + dvp->imask, nod->dev.id_unit); + INTREN(nod->dev.id_irq); + } + if (nod->dev.id_alive != 0) { + if (nod->dev.id_iobase == -1) + printf(" at ?"); + else { + printf(" at 0x%x", nod->dev.id_iobase); + if ((nod->dev.id_iobase + nod->dev.id_alive -1) != + nod->dev.id_iobase) { + printf("-0x%x", nod->dev.id_iobase + nod->dev.id_alive + - 1); + } + } + } + if (nod->dev.id_irq) + printf(" irq %d", ffs(nod->dev.id_irq) - 1); + if (nod->dev.id_drq != -1) + printf(" drq %d", nod->dev.id_drq); + if (nod->dev.id_maddr) + printf(" maddr 0x%lx", kvtop(nod->dev.id_maddr)); + if (nod->dev.id_msize) + printf(" msize %d", nod->dev.id_msize); + if (nod->dev.id_flags) + printf(" flags 0x%x", nod->dev.id_flags); + if (nod->dev.id_iobase && !(nod->dev.id_iobase & 0xf300)) { + printf(" on motherboard"); + printf(" id %d", nod->dev.id_id); + } else if (nod->dev.id_iobase >= 0x1000 && + !(nod->dev.id_iobase & 0x300)) { + printf (" on eisa slot %d", + nod->dev.id_iobase >> 12); + } else { + printf (" on isa"); + } + printf("\n"); + if (pnp_device_list_last_ptr == NULL) + pnp_device_list = nod; + else + *pnp_device_list_last_ptr = nod; + pnp_device_list_last_ptr = &(nod->next); + nod = NULL; + } else + printf(" failed to attach\n"); } - doing_pnp_probe = 0 ; } @@ -493,7 +537,8 @@ pnp_configure() int num_pnp_devs; if (pnp_ldn_overrides[0].csn == 0) { - printf("Initializing PnP override table\n"); + if (bootverbose) + printf("Initializing PnP override table\n"); bzero (pnp_ldn_overrides, sizeof(pnp_ldn_overrides)); pnp_ldn_overrides[0].csn = 255 ; } @@ -509,7 +554,8 @@ pnp_configure() break; } if (!num_pnp_devs) { - printf("No Plug-n-Play devices were found\n"); + if (bootverbose) + printf("No Plug-n-Play devices were found\n"); return; } } diff --git a/sys/i386/isa/pnp.h b/sys/i386/isa/pnp.h index 5cea0c2..29acd02 100644 --- a/sys/i386/isa/pnp.h +++ b/sys/i386/isa/pnp.h @@ -29,11 +29,9 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: pnp.h,v 1.1 1997/09/09 12:31:58 jmg Exp $ + * $Id: pnp.h,v 1.2 1997/09/18 08:04:13 jmg Exp $ */ -#include <i386/isa/isa_device.h> - #ifndef _I386_ISA_PNP_H_ #define _I386_ISA_PNP_H_ @@ -230,6 +228,10 @@ #define _32BIT_FIXED_LOC_DESC 0x6 #define LG_RES_RESERVED 0x7-0x7f +#ifdef KERNEL + +#include <i386/isa/isa_device.h> + /* * pnp_cinfo contains Configuration Information. They are used * to communicate to the device driver the actual configuration @@ -263,7 +265,6 @@ struct pnp_device { struct isa_device *dev); u_long *pd_count; u_int *imask ; - struct isa_device dev ; }; struct _pnp_id { @@ -272,9 +273,14 @@ struct _pnp_id { u_char checksum; } ; -#ifdef KERNEL +struct pnp_dlist_node { + struct pnp_device *pnp; + struct isa_device dev; + struct pnp_dlist_node *next; +}; typedef struct _pnp_id pnp_id; +extern struct pnp_dlist_node *pnp_device_list; extern pnp_id pnp_devices[MAX_PNP_CARDS]; extern struct pnp_cinfo pnp_ldn_overrides[MAX_PNP_LDN]; extern int pnp_overrides_valid; |