{
struct ino_bucket *bucket = __bucket(irq);
unsigned long imap;
- unsigned long tid;
imap = bucket->imap;
if (imap == 0UL)
printk("sun4v_intr_setstate(%x): "
"err(%d)\n", ino, err);
} else {
+ unsigned long tid;
+
if (tlb_type == cheetah || tlb_type == cheetah_plus) {
unsigned long ver;
/* Catch accidental accesses to these things. IMAP/ICLR handling
* is done by hypervisor calls on sun4v platforms, not by direct
* register accesses.
+ *
+ * But we need to make them look unique for the disable_irq() logic
+ * in free_irq().
*/
- bucket->imap = ~0UL;
- bucket->iclr = ~0UL;
+ bucket->imap = ~0UL - sysino;
+ bucket->iclr = ~0UL - sysino;
bucket->pil = pil;
bucket->flags = flags;
bucket = __bucket(irq);
if (bucket != &pil0_dummy_bucket) {
struct irq_desc *desc = bucket->irq_info;
- unsigned long imap = bucket->imap;
int ent, i;
for (i = 0; i < MAX_IRQ_DESC_ACTION; i++) {
}
if (!desc->action_active_mask) {
+ unsigned long imap = bucket->imap;
+
/* This unique interrupt source is now inactive. */
bucket->flags &= ~IBF_ACTIVE;
static int retarget_one_irq(struct irqaction *p, int goal_cpu)
{
struct ino_bucket *bucket = get_ino_in_irqaction(p) + ivector_table;
- unsigned long imap = bucket->imap;
while (!cpu_online(goal_cpu)) {
if (++goal_cpu >= NR_CPUS)
sun4v_intr_settarget(ino, goal_cpu);
sun4v_intr_setenabled(ino, HV_INTR_ENABLED);
} else {
+ unsigned long imap = bucket->imap;
unsigned int tid;
if (tlb_type == cheetah || tlb_type == cheetah_plus) {