From 2b6be0821cbcd41a13f5589daec53a131021830e Mon Sep 17 00:00:00 2001 From: Dale Rahn Date: Sat, 8 Oct 2005 23:38:31 +0000 Subject: if find_node_intr() doesn't find a match, try to use the contents of 'interrupts'. Also fix a bug where a signed value with -1 in it is compared against 'sizeof(....)'. --- sys/arch/macppc/pci/mpcpcibus.c | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/sys/arch/macppc/pci/mpcpcibus.c b/sys/arch/macppc/pci/mpcpcibus.c index 615f09a5b22..abfa1090e3c 100644 --- a/sys/arch/macppc/pci/mpcpcibus.c +++ b/sys/arch/macppc/pci/mpcpcibus.c @@ -1,4 +1,4 @@ -/* $OpenBSD: mpcpcibus.c,v 1.25 2005/10/03 02:22:38 drahn Exp $ */ +/* $OpenBSD: mpcpcibus.c,v 1.26 2005/10/08 23:38:30 drahn Exp $ */ /* * Copyright (c) 1997 Per Fogelstrom @@ -538,6 +538,7 @@ find_node_intr(int parent, u_int32_t *addr, u_int32_t *intr) } if (step == 0) { /* unable to determine step size */ + printf("find_node_intr unable to find step size\n"); return -1; } @@ -570,6 +571,7 @@ fix_node_irq(int node, struct pcibus_attach_args *pba) u_int32_t phys_hi, phys_mid, phys_lo; u_int32_t size_hi, size_lo; } addr [8]; + u_int32_t map[144]; int len; pcitag_t tag; u_int32_t irq; @@ -579,7 +581,7 @@ fix_node_irq(int node, struct pcibus_attach_args *pba) pci_chipset_tag_t pc = pba->pba_pc; len = OF_getprop(node, "assigned-addresses", addr, sizeof(addr)); - if (len < sizeof(addr[0])) + if (len == -1 || len < sizeof(addr[0])) return; /* if this node has a AAPL,interrupts property, firmware @@ -590,10 +592,18 @@ fix_node_irq(int node, struct pcibus_attach_args *pba) parent = OF_parent(node); + irq = -1; + /* we want the first interrupt, set size_hi to 1 */ addr[0].size_hi = 1; - if (find_node_intr(parent, &addr[0].phys_hi, &irq) == -1) - return; + if (find_node_intr(parent, &addr[0].phys_hi, &irq) == -1) { + len = OF_getprop(node, "interrupts", map, + sizeof(map)); + if (len != -1 && len != 4) { + irq = map[0]; + } else + return; + } } /* program the interrupt line register with the value * found in openfirmware -- cgit v1.2.3