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:
parent
67602b23a9
commit
bf3a36a695
@ -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;
|
||||
|
||||
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);
|
||||
|
Loading…
Reference in New Issue
Block a user