via-rhine: move work from irq handler to softirq and beyond.
authorFrancois Romieu <romieu@fr.zoreil.com>
Fri, 6 Jan 2012 20:42:26 +0000 (21:42 +0100)
committerFrancois Romieu <romieu@fr.zoreil.com>
Sat, 7 Jan 2012 22:02:37 +0000 (23:02 +0100)
commit7ab87ff4c770eed71e3777936299292739fcd0fe
treed6eac281d61f8cdf84a387b2ef455d20f058001d
parenta5abec1e84c3d9cd197667e5fa94f25c21a2cb8e
via-rhine: move work from irq handler to softirq and beyond.

- Tx processing is moved from the irq handler to NAPI poll
- link events and obscure event processing is moved to its proper work queue

Locking rules undergo some changes through the driver.

- the driver offers the usual lock-free Tx path
- besides the IRQ handler, the link event task schedules the napi handler.
  The driver thus adds some internal locking to prevent a loop when both
  must be disabled.
- the reset task keeps being scheduled from the Tx watchdog handler, thus
  with implicit Tx queue disabling. It does not need to care about irq,
  only napi softirq and competing task.
- it is not worth to add a dedicated lock between {g, s}et_wol and
  rhine_shutdown. It should not hurt no narrow it down a bit though.
- rhine_reset_task must keep its huge spin_lock_bh protected section due
  to :
  - races for the CAM registers (see rhine_vlan_rx_{add, kill}_vid)
  - implicit use of napi_enable (see init_registers)
  - use of the same lock for stats read / update exclusion between
    napi rx processing and rhine_get_stats
- rhine_resume requires a softirq disabled section for the same reason
  as rhine_reset_task
- {free, request}_irq have been replaced with IntrEnable actions in
  rhine_{suspend, resume}. It is hidden behind init_registers for the
  latter.

Signed-off-by: Francois Romieu <romieu@fr.zoreil.com>
drivers/net/ethernet/via/via-rhine.c