summaryrefslogtreecommitdiff
path: root/usr/src
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src')
-rw-r--r--usr/src/uts/i86pc/io/isa.c31
1 files changed, 30 insertions, 1 deletions
diff --git a/usr/src/uts/i86pc/io/isa.c b/usr/src/uts/i86pc/io/isa.c
index 6179e54aa2..1def172dd6 100644
--- a/usr/src/uts/i86pc/io/isa.c
+++ b/usr/src/uts/i86pc/io/isa.c
@@ -120,6 +120,8 @@ static struct regspec asy_regs[] = {
/* Serial port interrupt vectors for COM1 to COM4. */
static int asy_intrs[] = {0x4, 0x3, 0x4, 0x3};
+/* Bitfield indicating which interrupts are overridden by eeprom config */
+static uchar_t asy_intr_override = 0;
/*
* Local data
@@ -255,10 +257,30 @@ int
_init(void)
{
int err;
+ char tty_irq_param[9] = "ttyX-irq";
+ char *tty_irq;
+ int i;
if ((err = mod_install(&modlinkage)) != 0)
return (err);
+ /* Check if any tty irqs are overridden by eeprom config */
+ for (i = 0; i < num_BIOS_serial; i++) {
+ tty_irq_param[3] = 'a' + i;
+ if (ddi_prop_lookup_string(DDI_DEV_T_ANY, ddi_root_node(),
+ DDI_PROP_DONTPASS, tty_irq_param, &tty_irq)
+ == DDI_PROP_SUCCESS) {
+ long data;
+
+ if (ddi_strtol(tty_irq, NULL, 0, &data) == 0) {
+ asy_intrs[i] = (int)data;
+ asy_intr_override |= 1<<i;
+ }
+
+ ddi_prop_free(tty_irq);
+ }
+ }
+
impl_bus_add_probe(isa_enumerate);
return (0);
}
@@ -1328,8 +1350,15 @@ enumerate_BIOS_serial(dev_info_t *isa_dip)
*/
ddi_prop_free(tmpregs);
- if (found)
+ if (found) {
+ if (asy_intr_override & 1<<i) {
+ (void) ndi_prop_update_int(
+ DDI_DEV_T_NONE, xdip,
+ "interrupts", asy_intrs[i]);
+ }
+
break;
+ }
}
/* If not found, then add it */