From: Pat Gefre Added call to pcireg_intr_status_get --- 25-akpm/arch/ia64/sn/io/sn2/pcibr/pcibr_reg.c | 66 ++++++++++++++++---------- 25-akpm/arch/ia64/sn/kernel/irq.c | 2 2 files changed, 43 insertions(+), 25 deletions(-) diff -puN arch/ia64/sn/io/sn2/pcibr/pcibr_reg.c~sn59 arch/ia64/sn/io/sn2/pcibr/pcibr_reg.c --- 25/arch/ia64/sn/io/sn2/pcibr/pcibr_reg.c~sn59 Thu Jan 8 15:25:25 2004 +++ 25-akpm/arch/ia64/sn/io/sn2/pcibr/pcibr_reg.c Thu Jan 8 15:25:25 2004 @@ -6,7 +6,6 @@ * Copyright (C) 2003 Silicon Graphics, Inc. All rights reserved. */ - #include #include #include @@ -24,51 +23,70 @@ uint64_t pcireg_control_get(void *ptr) { - uint64_t ret = 0; - pic_t *bridge; + uint64_t ret = 0; + pic_t *bridge; + + if (IS_IOADDR(ptr)) + bridge = (pic_t *) ptr; + else + bridge = (pic_t *) ((pcibr_soft_t) (ptr))->bs_base; + + ret = ((pic_t *) bridge)->p_wid_control; + return ret; +} + +/* + * Interrupt Status Register Access -- Read Only 0000_0100 + */ +uint64_t +pcireg_intr_status_get(void *ptr) +{ + short bridge_type; + pic_t *bridge; + uint64_t ret = 0; - if ( IS_IOADDR(ptr) ) - bridge = (pic_t *)ptr; + if (IS_IOADDR(ptr)) + bridge = (pic_t *) ptr; else - bridge = (pic_t *)((pcibr_soft_t)(ptr))->bs_base; + bridge = (pic_t *) ((pcibr_soft_t) (ptr))->bs_base; - ret = ((pic_t *)bridge)->p_wid_control; + ret = ((pic_t *) bridge)->p_int_status; return ret; } void pcireg_intr_enable_bit_clr(void *ptr, uint64_t bits) { - pic_t *bridge; + pic_t *bridge; - if ( IS_IOADDR(ptr) ) - bridge = (pic_t *)ptr; + if (IS_IOADDR(ptr)) + bridge = (pic_t *) ptr; else - bridge = (pic_t *)((pcibr_soft_t)(ptr))->bs_base; + bridge = (pic_t *) ((pcibr_soft_t) (ptr))->bs_base; bridge->p_int_enable &= ~bits; } void pcireg_intr_enable_bit_set(void *ptr, uint64_t bits) { - pic_t *bridge; + pic_t *bridge; - if ( IS_IOADDR(ptr) ) - bridge = (pic_t *)ptr; + if (IS_IOADDR(ptr)) + bridge = (pic_t *) ptr; else - bridge = (pic_t *)((pcibr_soft_t)(ptr))->bs_base; + bridge = (pic_t *) ((pcibr_soft_t) (ptr))->bs_base; bridge->p_int_enable |= bits; } void pcireg_intr_addr_addr_set(void *ptr, int int_n, uint64_t addr) { - pic_t *bridge; + pic_t *bridge; - if ( IS_IOADDR(ptr) ) - bridge = (pic_t *)ptr; + if (IS_IOADDR(ptr)) + bridge = (pic_t *) ptr; else - bridge = (pic_t *)((pcibr_soft_t)(ptr))->bs_base; + bridge = (pic_t *) ((pcibr_soft_t) (ptr))->bs_base; bridge->p_int_addr[int_n] &= ~(0x0000FFFFFFFFFFFF); bridge->p_int_addr[int_n] |= (addr & 0x0000FFFFFFFFFFFF); } @@ -79,11 +97,11 @@ pcireg_intr_addr_addr_set(void *ptr, int void pcireg_force_intr_set(void *ptr, int int_n) { - pic_t *bridge; + pic_t *bridge; - if ( IS_IOADDR(ptr) ) - bridge = (pic_t *)ptr; + if (IS_IOADDR(ptr)) + bridge = (pic_t *) ptr; else - bridge = (pic_t *)((pcibr_soft_t)(ptr))->bs_base; - bridge->p_force_pin[int_n] = 1; + bridge = (pic_t *) ((pcibr_soft_t) (ptr))->bs_base; + bridge->p_force_pin[int_n] = 1; } diff -puN arch/ia64/sn/kernel/irq.c~sn59 arch/ia64/sn/kernel/irq.c --- 25/arch/ia64/sn/kernel/irq.c~sn59 Thu Jan 8 15:25:25 2004 +++ 25-akpm/arch/ia64/sn/kernel/irq.c Thu Jan 8 15:25:25 2004 @@ -262,7 +262,7 @@ sn_check_intr(int irq, pcibr_intr_t intr unsigned long irr_reg; - regval = intr->bi_soft->bs_base->p_int_status_64; + regval = pcireg_intr_status_get(intr->bi_soft->bs_base); irr_reg_num = irq_to_vector(irq) / 64; irr_bit = irq_to_vector(irq) % 64; switch (irr_reg_num) { _