sppp_cp_timeout() ends up calling local_bh_enable(), which enables interrupts. So it doesn't make sense to run sppp_lcp_open() under spin_unlock_irqrestore(&spppq_lock). This driver calls sppp_lcp_open() from other paces without that lock held, so fingers crossed, and drop the lock in sppp_cp_timeout(). 25-akpm/drivers/net/wan/syncppp.c | 2 +- 1 files changed, 1 insertion(+), 1 deletion(-) diff -puN drivers/net/wan/syncppp.c~syncppp-locking-fix drivers/net/wan/syncppp.c --- 25/drivers/net/wan/syncppp.c~syncppp-locking-fix Fri May 23 14:28:50 2003 +++ 25-akpm/drivers/net/wan/syncppp.c Fri May 23 14:29:24 2003 @@ -1297,6 +1297,7 @@ static void sppp_cp_timeout (unsigned lo spin_unlock_irqrestore(&spppq_lock, flags); return; } + spin_unlock_irqrestore(&spppq_lock, flags); switch (sp->lcp.state) { case LCP_STATE_CLOSED: /* No ACK for Configure-Request, retry. */ @@ -1333,7 +1334,6 @@ static void sppp_cp_timeout (unsigned lo } break; } - spin_unlock_irqrestore(&spppq_lock, flags); } static char *sppp_lcp_type_name (u8 type) _