536 return (PSM_SUCCESS);
537
538 if (!apic_picinit_called) {
539 /*
540 * Clear irq_struct. If two devices shared an intpt
541 * line & 1 unloaded before picinit, we are hosed. But, then
542 * we hope the machine survive.
543 */
544 irqptr->airq_mps_intr_index = FREE_INDEX;
545 irqptr->airq_temp_cpu = IRQ_UNINIT;
546 apic_free_vector(irqptr->airq_vector);
547 return (PSM_SUCCESS);
548 }
549 /*
550 * Downgrade vector to new max_ipl if needed. If we cannot allocate,
551 * use old IPL. Not very elegant, but it should work.
552 */
553 if ((irqptr->airq_ipl != max_ipl) && (max_ipl != PSM_INVALID_IPL) &&
554 !ioapic_mask_workaround[irqptr->airq_ioapicindex]) {
555 apic_irq_t *irqp;
556 if (vector = apic_allocate_vector(max_ipl, irqno, 1)) {
557 apic_mark_vector(irqheadptr->airq_vector, vector);
558 irqp = irqheadptr;
559 while (irqp) {
560 irqp->airq_vector = vector;
561 irqp->airq_ipl = (uchar_t)max_ipl;
562 if (irqp->airq_temp_cpu != IRQ_UNINIT) {
563 apic_record_rdt_entry(irqp, irqindex);
564
565 iflag = intr_clear();
566 lock_set(&apic_ioapic_lock);
567
568 (void) apic_setup_io_intr(irqp,
569 irqindex, B_FALSE);
570
571 lock_clear(&apic_ioapic_lock);
572 intr_restore(iflag);
573 }
574 irqp = irqp->airq_next;
575 }
576 }
|
536 return (PSM_SUCCESS);
537
538 if (!apic_picinit_called) {
539 /*
540 * Clear irq_struct. If two devices shared an intpt
541 * line & 1 unloaded before picinit, we are hosed. But, then
542 * we hope the machine survive.
543 */
544 irqptr->airq_mps_intr_index = FREE_INDEX;
545 irqptr->airq_temp_cpu = IRQ_UNINIT;
546 apic_free_vector(irqptr->airq_vector);
547 return (PSM_SUCCESS);
548 }
549 /*
550 * Downgrade vector to new max_ipl if needed. If we cannot allocate,
551 * use old IPL. Not very elegant, but it should work.
552 */
553 if ((irqptr->airq_ipl != max_ipl) && (max_ipl != PSM_INVALID_IPL) &&
554 !ioapic_mask_workaround[irqptr->airq_ioapicindex]) {
555 apic_irq_t *irqp;
556 if ((vector = apic_allocate_vector(max_ipl, irqno, 1))) {
557 apic_mark_vector(irqheadptr->airq_vector, vector);
558 irqp = irqheadptr;
559 while (irqp) {
560 irqp->airq_vector = vector;
561 irqp->airq_ipl = (uchar_t)max_ipl;
562 if (irqp->airq_temp_cpu != IRQ_UNINIT) {
563 apic_record_rdt_entry(irqp, irqindex);
564
565 iflag = intr_clear();
566 lock_set(&apic_ioapic_lock);
567
568 (void) apic_setup_io_intr(irqp,
569 irqindex, B_FALSE);
570
571 lock_clear(&apic_ioapic_lock);
572 intr_restore(iflag);
573 }
574 irqp = irqp->airq_next;
575 }
576 }
|