Skip to content

Commit

Permalink
isdn: pcbit: fix interruptible_sleep_on race
Browse files Browse the repository at this point in the history
interruptible_sleep_on is racy and going away. In case of pcbit,
the driver would run into a timeout if the card is initialized
before we start waiting for it. This uses wait_event to fix the
race. In order to do this, the state machine handling for the
timeout case has to get trivially reorganized so we actually know
whether the timeout has occorred or not.

Signed-off-by: Arnd Bergmann <arnd@arndb.de>
Cc: Karsten Keil <isdn@linux-pingi.de>
Cc: netdev@vger.kernel.org
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Arnd Bergmann authored and David S. Miller committed Feb 26, 2014
1 parent c73b1f6 commit e5b3fa1
Showing 1 changed file with 3 additions and 3 deletions.
6 changes: 3 additions & 3 deletions drivers/isdn/pcbit/drv.c
Original file line number Diff line number Diff line change
Expand Up @@ -796,6 +796,7 @@ static void set_running_timeout(unsigned long ptr)
#endif
dev = (struct pcbit_dev *) ptr;

dev->l2_state = L2_DOWN;
wake_up_interruptible(&dev->set_running_wq);
}

Expand All @@ -818,7 +819,8 @@ static int set_protocol_running(struct pcbit_dev *dev)

add_timer(&dev->set_running_timer);

interruptible_sleep_on(&dev->set_running_wq);
wait_event(dev->set_running_wq, dev->l2_state == L2_RUNNING ||
dev->l2_state == L2_DOWN);

del_timer(&dev->set_running_timer);

Expand All @@ -842,8 +844,6 @@ static int set_protocol_running(struct pcbit_dev *dev)
printk(KERN_DEBUG "pcbit: initialization failed\n");
printk(KERN_DEBUG "pcbit: firmware not loaded\n");

dev->l2_state = L2_DOWN;

#ifdef DEBUG
printk(KERN_DEBUG "Bank3 = %02x\n",
readb(dev->sh_mem + BANK3));
Expand Down

0 comments on commit e5b3fa1

Please sign in to comment.