# This is a BitKeeper generated patch for the following project: # Project Name: Linux kernel tree # This patch format is intended for GNU patch command version 2.5 or higher. # This patch includes the following deltas: # ChangeSet 1.587 -> 1.588 # drivers/usb/host/uhci.c 1.35 -> 1.36 # # The following is the BitKeeper ChangeSet Log # -------------------------------------------- # 02/04/08 johannes@erdfelt.com 1.588 # [PATCH] uhci.c SMP deadlock # # This patch fixes a bug reported by Greg and David, as well as some other # people recently. # # uhci.c would call wait_ms, which can sleep, with spinlocks held. There # are two places where this happens, but only one was the cause of the # problem. # -------------------------------------------- # diff -Nru a/drivers/usb/host/uhci.c b/drivers/usb/host/uhci.c --- a/drivers/usb/host/uhci.c Mon Apr 8 15:49:27 2002 +++ b/drivers/usb/host/uhci.c Mon Apr 8 15:49:27 2002 @@ -1820,6 +1820,9 @@ } else { urb->status = -ENOENT; + spin_unlock(&urb->lock); + spin_unlock_irqrestore(&uhci->urb_list_lock, flags); + if (in_interrupt()) { /* wait at least 1 frame */ static int errorcount = 10; @@ -1829,9 +1832,6 @@ } else schedule_timeout(1+1*HZ/1000); - spin_unlock(&urb->lock); - spin_unlock_irqrestore(&uhci->urb_list_lock, flags); - uhci_call_completion(urb); } } @@ -2202,12 +2202,12 @@ OK(0); case RH_PORT_RESET: SET_RH_PORTSTAT(USBPORTSC_PR); - wait_ms(50); /* USB v1.1 7.1.7.3 */ + mdelay(50); /* USB v1.1 7.1.7.3 */ uhci->rh.c_p_r[wIndex - 1] = 1; CLR_RH_PORTSTAT(USBPORTSC_PR); udelay(10); SET_RH_PORTSTAT(USBPORTSC_PE); - wait_ms(10); + mdelay(10); SET_RH_PORTSTAT(0xa); OK(0); case RH_PORT_POWER: