• Ahmed S. Darwish's avatar
    net: arcnet: Fix RESET flag handling · 01365633
    Ahmed S. Darwish authored
    The main arcnet interrupt handler calls arcnet_close() then
    arcnet_open(), if the RESET status flag is encountered.
    
    This is invalid:
    
      1) In general, interrupt handlers should never call ->ndo_stop() and
         ->ndo_open() functions. They are usually full of blocking calls and
         other methods that are expected to be called only from drivers
         init and exit code paths.
    
      2) arcnet_close() contains a del_timer_sync(). If the irq handler
         interrupts the to-be-deleted timer, del_timer_sync() will just loop
         forever.
    
      3) arcnet_close() also calls tasklet_kill(), which has a warning if
         called from irq context.
    
      4) For device reset, the sequence "arcnet_close(); arcnet_open();" is
         not complete.  Some children arcnet drivers have special init/exit
         code sequences, which then embed a call to arcnet_open() and
         arcnet_close() accordingly. Check drivers/net/arcnet/com20020.c.
    
    Run the device RESET sequence from a scheduled workqueue instead.
    Signed-off-by: default avatarAhmed S. Darwish <a.darwish@linutronix.de>
    Signed-off-by: default avatarSebastian Andrzej Siewior <bigeasy@linutronix.de>
    Link: https://lore.kernel.org/r/20210128194802.727770-1-a.darwish@linutronix.deSigned-off-by: default avatarJakub Kicinski <kuba@kernel.org>
    01365633
com20020_cs.c 7.48 KB