diff options
Diffstat (limited to 'drivers/usb/host/uhci-hcd.c')
| -rw-r--r-- | drivers/usb/host/uhci-hcd.c | 15 | 
1 files changed, 9 insertions, 6 deletions
diff --git a/drivers/usb/host/uhci-hcd.c b/drivers/usb/host/uhci-hcd.c index 4b9e9aba266..4f64d24eebc 100644 --- a/drivers/usb/host/uhci-hcd.c +++ b/drivers/usb/host/uhci-hcd.c @@ -447,6 +447,10 @@ static irqreturn_t uhci_irq(struct usb_hcd *hcd)  		return IRQ_NONE;  	uhci_writew(uhci, status, USBSTS);		/* Clear it */ +	spin_lock(&uhci->lock); +	if (unlikely(!uhci->is_initialized))	/* not yet configured */ +		goto done; +  	if (status & ~(USBSTS_USBINT | USBSTS_ERROR | USBSTS_RD)) {  		if (status & USBSTS_HSE)  			dev_err(uhci_dev(uhci), "host system error, " @@ -455,7 +459,6 @@ static irqreturn_t uhci_irq(struct usb_hcd *hcd)  			dev_err(uhci_dev(uhci), "host controller process "  					"error, something bad happened!\n");  		if (status & USBSTS_HCH) { -			spin_lock(&uhci->lock);  			if (uhci->rh_state >= UHCI_RH_RUNNING) {  				dev_err(uhci_dev(uhci),  					"host controller halted, " @@ -473,15 +476,15 @@ static irqreturn_t uhci_irq(struct usb_hcd *hcd)  				 * pending unlinks */  				mod_timer(&hcd->rh_timer, jiffies);  			} -			spin_unlock(&uhci->lock);  		}  	} -	if (status & USBSTS_RD) +	if (status & USBSTS_RD) { +		spin_unlock(&uhci->lock);  		usb_hcd_poll_rh_status(hcd); -	else { -		spin_lock(&uhci->lock); +	} else {  		uhci_scan_schedule(uhci); + done:  		spin_unlock(&uhci->lock);  	} @@ -662,9 +665,9 @@ static int uhci_start(struct usb_hcd *hcd)  	 */  	mb(); +	spin_lock_irq(&uhci->lock);  	configure_hc(uhci);  	uhci->is_initialized = 1; -	spin_lock_irq(&uhci->lock);  	start_rh(uhci);  	spin_unlock_irq(&uhci->lock);  	return 0;  |