Some chipset drivers redefine the busspace_isa_{io|mem} tags. This

not only means that it's possible (though unlikely) that we hand out
differing tags for the same bus space, it also means that the tags
we handed out are not used during bus enumeration. Both affect our
ability to compare tags. Fix the first by initializing our tags only
once. Fix the second by testing if one of the tags to compare is our
tag and the other is a busspace_isa_{io|mem} tag and declare them
equal if so.

This fixes using uart(4) as the serial console on a ds10. That is,
the low-level console worked, but we could not match the resources
to one of the UARTs found during bus enumeration, which prevented
uart(4) from becoming the console in single- or multi-user mode.

Approved by: re (kensmith)
MFC after: 2 days
Thanks to: all involved in getting a ds10 to me; directly or indirectly.
Special thanks to: Dave Knight, ISC (for not scratching my Porsche :-)
This commit is contained in:
Marcel Moolenaar 2005-06-16 18:06:38 +00:00
parent eafc7b549a
commit d382695820
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=147423

View File

@ -46,17 +46,34 @@ int
uart_cpu_eqres(struct uart_bas *b1, struct uart_bas *b2)
{
return ((b1->bsh == b2->bsh && b1->bst == b2->bst) ? 1 : 0);
if (b1->bsh != b2->bsh)
return (0);
if (b1->bst == b2->bst)
return (1);
/* Chipset drivers can have redefined the ISA tags. Deal with it. */
if ((b1->bst == uart_bus_space_io && b2->bst == busspace_isa_io) ||
(b1->bst == busspace_isa_io && b2->bst == uart_bus_space_io))
return (1);
if ((b1->bst == uart_bus_space_mem && b2->bst == busspace_isa_mem) ||
(b1->bst == busspace_isa_mem && b2->bst == uart_bus_space_mem))
return (1);
return (0);
}
int
uart_cpu_getdev(int devtype, struct uart_devinfo *di)
{
static int init = 0;
struct ctb *ctb;
unsigned int i, ivar;
uart_bus_space_io = busspace_isa_io;
uart_bus_space_mem = busspace_isa_mem;
if (!init) {
uart_bus_space_io = busspace_isa_io;
uart_bus_space_mem = busspace_isa_mem;
init = 1;
}
if (devtype == UART_DEV_CONSOLE) {
ctb = (struct ctb *)(((caddr_t)hwrpb) + hwrpb->rpb_ctb_off);