• A
    dm9000: clean up edge-triggered irq compatibility · 17ad78de
    Andrew Ruder 提交于
    DM9000 uses level-triggered interrupts.  Some systems (PXA270) only
    support edge-triggered interrupts on GPIOs.  Some changes are necessary
    to ensure that interrupts are not triggered while the GPIO interrupt is
    masked or we will miss the interrupt forever.
    
    * Make some helper functions called dm9000_mask_interrupts() and
      dm9000_unmask_interrupts() for readability.
    
    * dm9000_init_dm9000(): ensure that this function always leaves interrupts
      masked regardless of the state when it entered the function.  This is
      primarily to support the situation in dm9000_open where the logic used
      to go:
    
        dm9000_open()
            dm9000_init_dm9000()
                unmask interrupts
            request_irq()
    
      If an interrupt occurred between unmasking the interrupt and
      requesting the irq, it would be missed forever as the edge event would
      never be seen by the GPIO hardware in the PXA270.  This allows us to
      change the logic to:
    
        dm9000_open()
            dm9000_init_dm9000()
                dm9000_mask_interrupts()
            request_irq()
            dm9000_unmask_interrupts()
    
    * dm9000_timeout(), dm9000_drv_resume(): Add the missing
      dm9000_unmask_interrupts() now required by the change above.
    
    * dm9000_shutdown(): Use mask helper function
    
    * dm9000_interrupt(): Use mask/unmask helper functions
    Signed-off-by: NAndrew Ruder <andrew.ruder@elecsyscorp.com>
    Signed-off-by: NDavid S. Miller <davem@davemloft.net>
    17ad78de
dm9000.c 40.3 KB