diff options
author | Evan Yan <Evan.Yan@Sun.COM> | 2010-04-26 10:55:46 +0800 |
---|---|---|
committer | Evan Yan <Evan.Yan@Sun.COM> | 2010-04-26 10:55:46 +0800 |
commit | 4e30c628f63e2da84093e38787bb4ad00c622010 (patch) | |
tree | 7d450caaf87e934dfe9a5ac92ab5a4cb89c6d7cd /usr/src | |
parent | b96a6ece236756771bac978eeceb1b611c865f21 (diff) | |
download | illumos-gate-4e30c628f63e2da84093e38787bb4ad00c622010.tar.gz |
6930155 pcitool fails with IO error on osol_133/x6440
Diffstat (limited to 'usr/src')
-rw-r--r-- | usr/src/uts/i86pc/io/pci/pci_tools.c | 6 | ||||
-rw-r--r-- | usr/src/uts/i86pc/io/pcplusmp/apic_introp.c | 8 | ||||
-rw-r--r-- | usr/src/uts/i86pc/sys/apic.h | 4 |
3 files changed, 11 insertions, 7 deletions
diff --git a/usr/src/uts/i86pc/io/pci/pci_tools.c b/usr/src/uts/i86pc/io/pci/pci_tools.c index 1100e63d0b..b0e89f8b0f 100644 --- a/usr/src/uts/i86pc/io/pci/pci_tools.c +++ b/usr/src/uts/i86pc/io/pci/pci_tools.c @@ -336,7 +336,11 @@ pcitool_get_intr(dev_info_t *dip, void *arg, int mode) * Fill in the pcitool_intr_get_t to be returned, * with the CPU, num_devs_ret and num_devs. */ - iget->cpu_id = intr_info.avgi_cpu_id & ~PSMGI_CPU_USER_BOUND; + if (intr_info.avgi_cpu_id == IRQ_UNBOUND || + intr_info.avgi_cpu_id == IRQ_UNINIT) + iget->cpu_id = 0; + else + iget->cpu_id = intr_info.avgi_cpu_id & ~PSMGI_CPU_USER_BOUND; /* Number of devices returned by apic. */ iget->num_devs = intr_info.avgi_num_devs; diff --git a/usr/src/uts/i86pc/io/pcplusmp/apic_introp.c b/usr/src/uts/i86pc/io/pcplusmp/apic_introp.c index 0282f91bda..48f00112e6 100644 --- a/usr/src/uts/i86pc/io/pcplusmp/apic_introp.c +++ b/usr/src/uts/i86pc/io/pcplusmp/apic_introp.c @@ -19,8 +19,7 @@ * CDDL HEADER END */ /* - * Copyright 2010 Sun Microsystems, Inc. All rights reserved. - * Use is subject to license terms. + * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. */ /* @@ -842,8 +841,9 @@ apic_get_vector_intr_info(int vecirq, apic_get_intr_t *intr_params_p) irq_p = apic_irq_table[irqno]; if ((irq_p == NULL) || - (irq_p->airq_temp_cpu == IRQ_UNBOUND) || - (irq_p->airq_temp_cpu == IRQ_UNINIT)) { + ((irq_p->airq_mps_intr_index != RESERVE_INDEX) && + ((irq_p->airq_temp_cpu == IRQ_UNBOUND) || + (irq_p->airq_temp_cpu == IRQ_UNINIT)))) { mutex_exit(&airq_mutex); return (PSM_FAILURE); } diff --git a/usr/src/uts/i86pc/sys/apic.h b/usr/src/uts/i86pc/sys/apic.h index 40afdf857b..a8f6264a0f 100644 --- a/usr/src/uts/i86pc/sys/apic.h +++ b/usr/src/uts/i86pc/sys/apic.h @@ -474,8 +474,8 @@ typedef struct apic_irq { */ major_t airq_major; /* major number corresponding to the device */ ushort_t airq_rdt_entry; /* level, polarity & trig mode */ - uint32_t airq_cpu; /* Which CPU are we bound to ? */ - uint32_t airq_temp_cpu; /* Could be diff from cpu due to disable_intr */ + uint32_t airq_cpu; /* target CPU, non-reserved IRQ only */ + uint32_t airq_temp_cpu; /* non-reserved IRQ only, for disable_intr */ uchar_t airq_vector; /* Vector chosen for this irq */ uchar_t airq_share; /* number of interrupts at this irq */ uchar_t airq_share_id; /* id to identify source from irqno */ |