• Andy Shevchenko's avatar
    serial: 8250_mid: handle interrupt correctly in DMA case · 4831e0d9
    Andy Shevchenko authored
    Starting from Tangier B0 and continuing on Anniedale the HSU DMA interrupt
    line is actually shared with UART. Handling them independently is racy and
    quite often comes with the following traceback.
    
     irq 54: nobody cared (try booting with the "irqpoll" option)
     CPU: 0 PID: 0 Comm: swapper/0 Not tainted 4.9.0-rc6-edison64-86244934+ #1
     Hardware name: Intel Corporation Merrifield/BODEGA BAY, BIOS 542 2015.01.21:18.19.48
      ffff88003f203eb0 ffffffff8130e718 ffff880032627000 ffff88003262709c
      ffff88003f203ed8 ffffffff810a3960 ffff880032627000 0000000000000000
      ffff880032627000 ffff88003f203f10 ffffffff810a3cc7 ffff880032627000
     Call Trace:
      <IRQ>
      [<ffffffff8130e718>] dump_stack+0x4d/0x65
      [<ffffffff810a3960>] __report_bad_irq+0x30/0xc0
      [<ffffffff810a3cc7>] note_interrupt+0x227/0x270
      [<ffffffff810a1380>] handle_irq_event_percpu+0x40/0x50
      [<ffffffff810a13b7>] handle_irq_event+0x27/0x50
      [<ffffffff810a42d5>] handle_fasteoi_irq+0x85/0x150
      [<ffffffff8101d7fe>] handle_irq+0x6e/0x120
      [<ffffffff8105b8bc>] ? _local_bh_enable+0x1c/0x50
      [<ffffffff8101d0d6>] do_IRQ+0x46/0xd0
      [<ffffffff818cef3f>] common_interrupt+0x7f/0x7f
      <EOI>
      [<ffffffff818cdead>] ? mwait_idle+0x7d/0x140
      [<ffffffff81024c9a>] arch_cpu_idle+0xa/0x10
      [<ffffffff818ce150>] default_idle_call+0x20/0x30
      [<ffffffff810908fd>] cpu_startup_entry+0x16d/0x1d0
      [<ffffffff818c882d>] rest_init+0x6d/0x70
      [<ffffffff81f93e8f>] start_kernel+0x3e2/0x3ef
      [<ffffffff81f9343d>] x86_64_start_reservations+0x38/0x3a
      [<ffffffff81f93529>] x86_64_start_kernel+0xea/0xed
     handlers:
     [<ffffffff81411670>] serial8250_interrupt
     Disabling IRQ #54
    
    Fix this by handling interrupt only in one place.
    
    The issue is discussed here: https://github.com/andy-shev/linux/issues/5
    
    Moreover this also fixes another bug when Rx DMA returns wrong residue and we
    can't rely on it.
    Reviewed-by: default avatarHeikki Krogerus <heikki.krogerus@linux.intel.com>
    Signed-off-by: default avatarAndy Shevchenko <andriy.shevchenko@linux.intel.com>
    Acked-by: default avatarVinod Koul <vinod.koul@intel.com>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    4831e0d9
8250_mid.c 9.23 KB