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 2005-06-16 18:06:38 +00:00
parent 67602b23a9
commit bf3a36a695

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);