void pcibr_target_interrupt(struct sn_irq_info *sn_irq_info) { struct pcidev_info *pcidev_info; struct pcibus_info *pcibus_info; int bit = sn_irq_info->irq_int_bit; u64 xtalk_addr = sn_irq_info->irq_xtalkaddr; pcidev_info = (struct pcidev_info *)sn_irq_info->irq_pciioinfo; if (pcidev_info) { pcibus_info = (struct pcibus_info *)pcidev_info->pdi_host_pcidev_info-> pdi_pcibus_info; /* Disable the device's IRQ */ pcireg_intr_enable_bit_clr(pcibus_info, (1 << bit)); /* Change the device's IRQ */ pcireg_intr_addr_addr_set(pcibus_info, bit, xtalk_addr); /* Re-enable the device's IRQ */ pcireg_intr_enable_bit_set(pcibus_info, (1 << bit)); pcibr_force_interrupt(sn_irq_info); } }
static void force_interrupt(int irq) { struct pcibr_intr_list_t *p = pcibr_intr_list[irq]; while (p) { if (p->intr) { pcibr_force_interrupt(p->intr); } p = p->next; } }
void force_polled_int(void) { int i; struct pcibr_intr_list_t *p; for (i=0; i<NR_IRQS;i++) { p = pcibr_intr_list[i]; while (p) { if (p->intr){ pcibr_force_interrupt(p->intr); } p = p->next; } } }
static void sn_check_intr(int irq, pcibr_intr_t intr) { unsigned long regval; int irr_reg_num; int irr_bit; unsigned long irr_reg; regval = intr->bi_soft->bs_base->p_int_status_64; irr_reg_num = irq_to_vector(irq) / 64; irr_bit = irq_to_vector(irq) % 64; switch (irr_reg_num) { case 0: irr_reg = ia64_get_irr0(); break; case 1: irr_reg = ia64_get_irr1(); break; case 2: irr_reg = ia64_get_irr2(); break; case 3: irr_reg = ia64_get_irr3(); break; } if (!test_bit(irr_bit, &irr_reg) ) { if (!test_bit(irq, pda.sn_soft_irr) ) { if (!test_bit(irq, pda.sn_in_service_ivecs) ) { regval &= 0xff; if (intr->bi_ibits & regval & intr->bi_last_intr) { regval &= ~(intr->bi_ibits & regval); pcibr_force_interrupt(intr); } } } } intr->bi_last_intr = regval; }