diff options
Diffstat (limited to 'debian/patches/bugfix/m68k/mac68k-finish_irq_cleanup.diff')
-rw-r--r-- | debian/patches/bugfix/m68k/mac68k-finish_irq_cleanup.diff | 162 |
1 files changed, 162 insertions, 0 deletions
diff --git a/debian/patches/bugfix/m68k/mac68k-finish_irq_cleanup.diff b/debian/patches/bugfix/m68k/mac68k-finish_irq_cleanup.diff new file mode 100644 index 000000000000..a7f5a343f5a1 --- /dev/null +++ b/debian/patches/bugfix/m68k/mac68k-finish_irq_cleanup.diff @@ -0,0 +1,162 @@ +Subject: [PATCH 8/13] m68k: Mac IRQ cleanup + +From: Finn Thain <fthain@telegraphics.com.au> + +There are no slow IRQs on Macs since Roman Zippel's IRQ reorganisation that +went into 2.6.16 and removed mac_irq_list[] and the do_mac_irq_list() +dispatcher. (They were implemented in do_mac_irq_list() by lowering the IPL.) +Hence there's no more use for mutual exclusion in the Mac interrupt +dispatchers. Remove it. + +Signed-off-by: Finn Thain <fthain@telegraphics.com.au> +Signed-off-by: Geert Uytterhoeven <geert@linux-m68k.org> +--- + arch/m68k/mac/baboon.c | 20 +++++++------------- + arch/m68k/mac/oss.c | 4 ---- + arch/m68k/mac/psc.c | 2 -- + arch/m68k/mac/via.c | 10 ---------- + 4 files changed, 7 insertions(+), 29 deletions(-) + +--- linux-m68k-2.6.21.orig/arch/m68k/mac/baboon.c ++++ linux-m68k-2.6.21/arch/m68k/mac/baboon.c +@@ -22,7 +22,7 @@ + /* #define DEBUG_BABOON */ + /* #define DEBUG_IRQS */ + +-int baboon_present,baboon_active; ++int baboon_present; + volatile struct baboon *baboon; + + irqreturn_t baboon_irq(int, void *); +@@ -45,7 +45,6 @@ void __init baboon_init(void) + + baboon = (struct baboon *) BABOON_BASE; + baboon_present = 1; +- baboon_active = 0; + + printk("Baboon detected at %p\n", baboon); + } +@@ -70,9 +69,9 @@ irqreturn_t baboon_irq(int irq, void *de + unsigned char events; + + #ifdef DEBUG_IRQS +- printk("baboon_irq: mb_control %02X mb_ifr %02X mb_status %02X active %02X\n", ++ printk("baboon_irq: mb_control %02X mb_ifr %02X mb_status %02X\n", + (uint) baboon->mb_control, (uint) baboon->mb_ifr, +- (uint) baboon->mb_status, baboon_active); ++ (uint) baboon->mb_status); + #endif + + if (!(events = baboon->mb_ifr & 0x07)) +@@ -81,11 +80,9 @@ irqreturn_t baboon_irq(int irq, void *de + irq_num = IRQ_BABOON_0; + irq_bit = 1; + do { +- if (events & irq_bit/* & baboon_active*/) { +- baboon_active &= ~irq_bit; ++ if (events & irq_bit) { + baboon->mb_ifr &= ~irq_bit; + m68k_handle_int(irq_num); +- baboon_active |= irq_bit; + } + irq_bit <<= 1; + irq_num++; +@@ -99,21 +96,18 @@ irqreturn_t baboon_irq(int irq, void *de + } + + void baboon_irq_enable(int irq) { +- int irq_idx = IRQ_IDX(irq); +- + #ifdef DEBUG_IRQUSE + printk("baboon_irq_enable(%d)\n", irq); + #endif +- baboon_active |= (1 << irq_idx); ++ /* FIXME: figure out how to mask and unmask baboon interrupt sources */ ++ enable_irq(IRQ_NUBUS_C); + } + + void baboon_irq_disable(int irq) { +- int irq_idx = IRQ_IDX(irq); +- + #ifdef DEBUG_IRQUSE + printk("baboon_irq_disable(%d)\n", irq); + #endif +- baboon_active &= ~(1 << irq_idx); ++ disable_irq(IRQ_NUBUS_C); + } + + void baboon_irq_clear(int irq) { +--- linux-m68k-2.6.21.orig/arch/m68k/mac/oss.c ++++ linux-m68k-2.6.21/arch/m68k/mac/oss.c +@@ -112,10 +112,8 @@ irqreturn_t oss_irq(int irq, void *dev_i + oss->irq_pending &= ~OSS_IP_SOUND; + /* FIXME: call sound handler */ + } else if (events & OSS_IP_SCSI) { +- oss->irq_level[OSS_SCSI] = OSS_IRQLEV_DISABLED; + oss->irq_pending &= ~OSS_IP_SCSI; + m68k_handle_int(IRQ_MAC_SCSI); +- oss->irq_level[OSS_SCSI] = OSS_IRQLEV_SCSI; + } else { + /* FIXME: error check here? */ + } +@@ -149,10 +147,8 @@ irqreturn_t oss_nubus_irq(int irq, void + --i; + irq_bit >>= 1; + if (events & irq_bit) { +- oss->irq_level[i] = OSS_IRQLEV_DISABLED; + oss->irq_pending &= ~irq_bit; + m68k_handle_int(NUBUS_SOURCE_BASE + i); +- oss->irq_level[i] = OSS_IRQLEV_NUBUS; + } + } while(events & (irq_bit - 1)); + return IRQ_HANDLED; +--- linux-m68k-2.6.21.orig/arch/m68k/mac/psc.c ++++ linux-m68k-2.6.21/arch/m68k/mac/psc.c +@@ -147,10 +147,8 @@ irqreturn_t psc_irq(int irq, void *dev_i + irq_bit = 1; + do { + if (events & irq_bit) { +- psc_write_byte(pIER, irq_bit); + psc_write_byte(pIFR, irq_bit); + m68k_handle_int(irq_num); +- psc_write_byte(pIER, irq_bit | 0x80); + } + irq_num++; + irq_bit <<= 1; +--- linux-m68k-2.6.21.orig/arch/m68k/mac/via.c ++++ linux-m68k-2.6.21/arch/m68k/mac/via.c +@@ -443,11 +443,6 @@ void __init via_nubus_init(void) + /* + * The generic VIA interrupt routines (shamelessly stolen from Alan Cox's + * via6522.c :-), disable/pending masks added. +- * +- * The new interrupt architecture in macints.c takes care of a lot of the +- * gruntwork for us, including tallying the interrupts and calling the +- * handlers on the linked list. All we need to do here is basically generate +- * the machspec interrupt number after clearing the interrupt. + */ + + irqreturn_t via1_irq(int irq, void *dev_id) +@@ -463,10 +458,8 @@ irqreturn_t via1_irq(int irq, void *dev_ + irq_bit = 1; + do { + if (events & irq_bit) { +- via1[vIER] = irq_bit; + via1[vIFR] = irq_bit; + m68k_handle_int(irq_num); +- via1[vIER] = irq_bit | 0x80; + } + ++irq_num; + irq_bit <<= 1; +@@ -502,11 +495,8 @@ irqreturn_t via2_irq(int irq, void *dev_ + irq_bit = 1; + do { + if (events & irq_bit) { +- via2[gIER] = irq_bit; + via2[gIFR] = irq_bit | rbv_clear; + m68k_handle_int(irq_num); +- if (irq_num != IRQ_MAC_NUBUS || nubus_disabled == 0) +- via2[gIER] = irq_bit | 0x80; + } + ++irq_num; + irq_bit <<= 1; |