summaryrefslogtreecommitdiff
path: root/usr/src
diff options
context:
space:
mode:
authorEvan Yan <Evan.Yan@Sun.COM>2010-04-26 10:55:46 +0800
committerEvan Yan <Evan.Yan@Sun.COM>2010-04-26 10:55:46 +0800
commit4e30c628f63e2da84093e38787bb4ad00c622010 (patch)
tree7d450caaf87e934dfe9a5ac92ab5a4cb89c6d7cd /usr/src
parentb96a6ece236756771bac978eeceb1b611c865f21 (diff)
downloadillumos-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.c6
-rw-r--r--usr/src/uts/i86pc/io/pcplusmp/apic_introp.c8
-rw-r--r--usr/src/uts/i86pc/sys/apic.h4
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 */