dm9000: clean up edge-triggered irq compatibility
authorAndrew Ruder <andrew.ruder@elecsyscorp.com>
Wed, 4 Jun 2014 22:28:46 +0000 (17:28 -0500)
committerDavid S. Miller <davem@davemloft.net>
Thu, 5 Jun 2014 22:12:10 +0000 (15:12 -0700)
commit17ad78de7f60bfc9711acb57c3c9561def6ee402
tree2677355c2646a5b32facf7e6a5836a7e8aa53acc
parent751bb6fd80b728d4820e0176837bc2c5e339e358
dm9000: clean up edge-triggered irq compatibility

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: Andrew Ruder <andrew.ruder@elecsyscorp.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/davicom/dm9000.c