lkml.org 
[lkml]   [2006]   [Sep]   [11]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[PATCH] - restore i8259A eoi status on resume
    Got it. i8259A_resume calls init_8259A(0) unconditionally, even if 
    auto_eoi has been set. Keep track of the current status and restore that
    on resume. This fixes it for AMD64 and i386.

    Signed-off-by: Matthew Garrett <mjg59@srcf.ucam.org>

    diff --git a/arch/i386/kernel/i8259.c b/arch/i386/kernel/i8259.c
    index 323ef8a..41485c7 100644
    --- a/arch/i386/kernel/i8259.c
    +++ b/arch/i386/kernel/i8259.c
    @@ -46,6 +46,8 @@ static void end_8259A_irq (unsigned int

    #define shutdown_8259A_irq disable_8259A_irq

    +static int i8259A_auto_eoi;
    +
    static void mask_and_ack_8259A(unsigned int);

    unsigned int startup_8259A_irq(unsigned int irq)
    @@ -254,7 +256,7 @@ static void save_ELCR(char *trigger)

    static int i8259A_resume(struct sys_device *dev)
    {
    - init_8259A(0);
    + init_8259A(i8259A_auto_eoi);
    restore_ELCR(irq_trigger);
    return 0;
    }
    @@ -302,6 +304,8 @@ void init_8259A(int auto_eoi)
    {
    unsigned long flags;

    + i8259A_auto_eoi = auto_eoi;
    +
    spin_lock_irqsave(&i8259A_lock, flags);

    outb(0xff, PIC_MASTER_IMR); /* mask all of 8259A-1 */
    diff --git a/arch/x86_64/kernel/i8259.c b/arch/x86_64/kernel/i8259.c
    index 5ecd34a..75f77da 100644
    --- a/arch/x86_64/kernel/i8259.c
    +++ b/arch/x86_64/kernel/i8259.c
    @@ -129,6 +129,8 @@ #undef IRQLIST_14

    DEFINE_SPINLOCK(i8259A_lock);

    +static int i8259A_auto_eoi;
    +
    static void end_8259A_irq (unsigned int irq)
    {
    if (irq > 256) {
    @@ -342,6 +344,8 @@ void init_8259A(int auto_eoi)
    {
    unsigned long flags;

    + i8259A_auto_eoi = auto_eoi;
    +
    spin_lock_irqsave(&i8259A_lock, flags);

    outb(0xff, 0x21); /* mask all of 8259A-1 */
    @@ -400,7 +404,7 @@ static void save_ELCR(char *trigger)

    static int i8259A_resume(struct sys_device *dev)
    {
    - init_8259A(0);
    + init_8259A(i8259A_auto_eoi);
    restore_ELCR(irq_trigger);
    return 0;
    }

    --
    Matthew Garrett | mjg59@srcf.ucam.org
    -
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/
    \
     
     \ /
      Last update: 2006-09-12 19:19    [W:0.041 / U:92.460 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site