Skip to content
  • Francois Romieu's avatar
    via-rhine: move work from irq handler to softirq and beyond. · 7ab87ff4
    Francois Romieu authored
    
    
    - 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: default avatarFrancois Romieu <romieu@fr.zoreil.com>
    7ab87ff4