public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* Re: uhci locks up in 2.4.19-pre6
@ 2002-04-13 12:02 Stanislav Meduna
  2002-04-13 16:15 ` [Linux-usb-users] " Johannes Erdfelt
  0 siblings, 1 reply; 4+ messages in thread
From: Stanislav Meduna @ 2002-04-13 12:02 UTC (permalink / raw)
  To: linux-kernel; +Cc: linux-usb-users

Hello,

trying to load a uhci module from 2.4.19-pre6 at boot locks my computer.

In 2.4.18 I noticed that the USB printing stopped to work
(see the thread "USB printing via ptal broke between 2.4.17 and .18"
started on 29 Mar). I the tested 2.4.19-pre5 and loading the uhci
module locked the machine. In -pre6 the behaviour is the same.

Can I switch some debug mode on to help you seeing where the thing
locks?

This is on the Abit BP6 motherboard (Celeron SMP box). I see that
there are quite a few changes in the uhci area - please, don't
make final 2.4.19 until these issues are resolved.

Using usb-uhci is not an option for me, as it is causing lockups
when printing to a USB printer (and ever did so). uhci was OK
in this regard up to 2.4.17.

Regards
-- 
                                     Stano


^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [Linux-usb-users] Re: uhci locks up in 2.4.19-pre6
  2002-04-13 12:02 uhci locks up in 2.4.19-pre6 Stanislav Meduna
@ 2002-04-13 16:15 ` Johannes Erdfelt
  2002-04-13 17:20   ` Tommi Kyntola
  2002-04-13 18:41   ` Stanislav Meduna
  0 siblings, 2 replies; 4+ messages in thread
From: Johannes Erdfelt @ 2002-04-13 16:15 UTC (permalink / raw)
  To: Stanislav Meduna; +Cc: linux-kernel, linux-usb-users

On Sat, Apr 13, 2002, Stanislav Meduna <stano@meduna.org> wrote:
> trying to load a uhci module from 2.4.19-pre6 at boot locks my computer.
> 
> In 2.4.18 I noticed that the USB printing stopped to work
> (see the thread "USB printing via ptal broke between 2.4.17 and .18"
> started on 29 Mar). I the tested 2.4.19-pre5 and loading the uhci
> module locked the machine. In -pre6 the behaviour is the same.
> 
> Can I switch some debug mode on to help you seeing where the thing
> locks?
> 
> This is on the Abit BP6 motherboard (Celeron SMP box). I see that
> there are quite a few changes in the uhci area - please, don't
> make final 2.4.19 until these issues are resolved.
> 
> Using usb-uhci is not an option for me, as it is causing lockups
> when printing to a USB printer (and ever did so). uhci was OK
> in this regard up to 2.4.17.

Apply these patches. They should be in -pre7 (or -rc1, depending on what
Marcelo calls it).

This should fix all outstanding lockups and performance problems with
uhci.c. Let me know how it goes for you.

JE

--- linux-2.4.19-pre6.orig/drivers/usb/uhci.c	Sun Apr  7 13:22:10 2002
+++ linux-2.4.19-pre6/drivers/usb/uhci.c	Sun Apr  7 13:25:27 2002
@@ -1811,6 +1811,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;
 
@@ -1820,9 +1823,6 @@
 			} else
 				schedule_timeout(1+1*HZ/1000); 
 
-			spin_unlock(&urb->lock);
-			spin_unlock_irqrestore(&uhci->urb_list_lock, flags);
-
 			uhci_call_completion(urb);
 		}
 	}
@@ -2193,12 +2193,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:


--- linux-2.4.19-pre6.orig/drivers/usb/uhci.c	Sun Apr  7 16:21:04 2002
+++ linux-2.4.19-pre6/drivers/usb/uhci.c	Sun Apr  7 16:24:03 2002
@@ -748,7 +748,7 @@
 
 	if ((!(urb->transfer_flags & USB_NO_FSBR)) && !urbp->fsbr) {
 		urbp->fsbr = 1;
-		if (!uhci->fsbr++)
+		if (!uhci->fsbr++ && !uhci->fsbrtimeout)
 			uhci->skel_term_qh->link = uhci->skel_hs_control_qh->dma_handle | UHCI_PTR_QH;
 	}
 
@@ -2739,6 +2739,11 @@
 	/* Reset here so we don't get any interrupts from an old setup */
 	/*  or broken setup */
 	reset_hc(uhci);
+
+	uhci->fsbr = 0;
+	uhci->fsbrtimeout = 0;
+
+	uhci->is_suspended = 0;
 
 	spin_lock_init(&uhci->qh_remove_list_lock);
 	INIT_LIST_HEAD(&uhci->qh_remove_list);


--- linux-2.4.19-pre6.orig/drivers/usb/uhci.c	Sun Apr  7 16:27:23 2002
+++ linux-2.4.19-pre6/drivers/usb/uhci.c	Sun Apr  7 16:28:23 2002
@@ -1837,10 +1837,6 @@
 
 	uhci_dec_fsbr(uhci, urb);
 
-	/* There is a race with updating IOC in here, but it's not worth */
-	/*  trying to fix since this is merely an optimization. The only */
-	/*  time we'd lose is if the status of the packet got updated */
-	/*  and we'd be turning on FSBR next frame anyway, so it's a wash */
 	urbp->fsbr_timeout = 1;
 
 	head = &urbp->td_list;
@@ -2004,23 +2000,23 @@
 	tmp = head->next;
 	while (tmp != head) {
 		struct urb *u = list_entry(tmp, struct urb, urb_list);
-		struct urb_priv *urbp = (struct urb_priv *)u->hcpriv;
+		struct urb_priv *up = (struct urb_priv *)u->hcpriv;
 
 		tmp = tmp->next;
 
-		spin_lock(&urb->lock);
+		spin_lock(&u->lock);
 
 		/* Check if the FSBR timed out */
-		if (urbp->fsbr && !urbp->fsbr_timeout && time_after_eq(jiffies, urbp->fsbrtime + IDLE_TIMEOUT))
+		if (up->fsbr && !up->fsbr_timeout && time_after_eq(jiffies, up->fsbrtime + IDLE_TIMEOUT))
 			uhci_fsbr_timeout(uhci, u);
 
 		/* Check if the URB timed out */
-		if (u->timeout && time_after_eq(jiffies, urbp->inserttime + u->timeout)) {
+		if (u->timeout && time_after_eq(jiffies, up->inserttime + u->timeout)) {
 			list_del(&u->urb_list);
 			list_add_tail(&u->urb_list, &list);
 		}
 
-		spin_unlock(&urb->lock);
+		spin_unlock(&u->lock);
 	}
 	spin_unlock_irqrestore(&uhci->urb_list_lock, flags);
 

--- linux-2.4.19-pre6.orig/drivers/usb/uhci.c	Sun Apr  7 16:29:57 2002
+++ linux-2.4.19-pre6/drivers/usb/uhci.c	Sun Apr  7 16:22:49 2002
@@ -1622,8 +1622,7 @@
 
 	if (urb->status != -EINPROGRESS) {
 		info("uhci_transfer_result: called for URB %p not in flight?", urb);
-		spin_unlock_irqrestore(&urb->lock, flags);
-		return;
+		goto out;
 	}
 
 	switch (usb_pipetype(urb->pipe)) {
@@ -1643,10 +1642,8 @@
 
 	urbp->status = ret;
 
-	if (ret == -EINPROGRESS) {
-		spin_unlock_irqrestore(&urb->lock, flags);
-		return;
-	}
+	if (ret == -EINPROGRESS)
+		goto out;
 
 	switch (usb_pipetype(urb->pipe)) {
 	case PIPE_CONTROL:
@@ -1660,11 +1657,8 @@
 		break;
 	case PIPE_INTERRUPT:
 		/* Interrupts are an exception */
-		if (urb->interval) {
-			uhci_add_complete(urb);
-			spin_unlock_irqrestore(&urb->lock, flags);
-			return;		/* <-- note return */
-		}
+		if (urb->interval)
+			goto out_complete;
 
 		/* Release bandwidth for Interrupt or Isoc. transfers */
 		/* Spinlock needed ? */
@@ -1680,8 +1674,10 @@
 	/* Remove it from uhci->urb_list */
 	list_del_init(&urb->urb_list);
 
+out_complete:
 	uhci_add_complete(urb);
 
+out:
 	spin_unlock_irqrestore(&urb->lock, flags);
 }
 
@@ -2710,6 +2706,7 @@
 	}
 
 	uhci->dev = dev;
+	uhci->irq = dev->irq;
 	uhci->io_addr = io_addr;
 	uhci->io_size = io_size;
 	pci_set_drvdata(dev, uhci);
@@ -2922,8 +2919,6 @@
 
 	if (request_irq(dev->irq, uhci_interrupt, SA_SHIRQ, "usb-uhci", uhci))
 		goto err_request_irq;
-
-	uhci->irq = dev->irq;
 
 	/* disable legacy emulation */
 	pci_write_config_word(uhci->dev, USBLEGSUP, USBLEGSUP_DEFAULT);
--- linux-2.4.19-pre6.orig/drivers/usb/uhci.h	Sun Apr  7 13:22:10 2002
+++ linux-2.4.19-pre6/drivers/usb/uhci.h	Sun Apr  7 16:16:55 2002
@@ -287,16 +287,16 @@
 struct uhci {
 	struct pci_dev *dev;
 
+#ifdef CONFIG_PROC_FS
 	/* procfs */
 	int num;
 	struct proc_dir_entry *proc_entry;
+#endif
 
 	/* Grabbed from PCI */
 	int irq;
 	unsigned int io_addr;
 	unsigned int io_size;
-
-	struct list_head uhci_list;
 
 	struct pci_pool *qh_pool;
 	struct pci_pool *td_pool;

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [Linux-usb-users] Re: uhci locks up in 2.4.19-pre6
  2002-04-13 16:15 ` [Linux-usb-users] " Johannes Erdfelt
@ 2002-04-13 17:20   ` Tommi Kyntola
  2002-04-13 18:41   ` Stanislav Meduna
  1 sibling, 0 replies; 4+ messages in thread
From: Tommi Kyntola @ 2002-04-13 17:20 UTC (permalink / raw)
  To: Johannes Erdfelt; +Cc: linux-kernel, linux-usb-users


For the record, this patch had no impact on the USB Mass Storage
and DiskOnKey lock-up I reported earlier today. No wonder though, as it 
seems it's usb-storage related (like I said, rmmod'ing the usb-storage in 
between unplug/plug-in avoids the lockup/oops), since it's present with 
atleast usb-uhci, uhci and usb-ohci modules.

If there's any debug, system or other information that you may want,
or even just a better description of the problem feel free to ask. 
I've got abundance of boxen here with varying chipset (atleast Via, Ali, 
Sis, Compaq and Intel) that I can test patches against.

> On Sat, Apr 13, 2002, Stanislav Meduna <stano@meduna.org> wrote:
> > trying to load a uhci module from 2.4.19-pre6 at boot locks my computer.
> > 
> > In 2.4.18 I noticed that the USB printing stopped to work
> > (see the thread "USB printing via ptal broke between 2.4.17 and .18"
> > started on 29 Mar). I the tested 2.4.19-pre5 and loading the uhci
> > module locked the machine. In -pre6 the behaviour is the same.
> > 
> > Can I switch some debug mode on to help you seeing where the thing
> > locks?
> > 
> > This is on the Abit BP6 motherboard (Celeron SMP box). I see that
> > there are quite a few changes in the uhci area - please, don't
> > make final 2.4.19 until these issues are resolved.
> > 
> > Using usb-uhci is not an option for me, as it is causing lockups
> > when printing to a USB printer (and ever did so). uhci was OK
> > in this regard up to 2.4.17.
> 
> Apply these patches. They should be in -pre7 (or -rc1, depending on what
> Marcelo calls it).
> 
> This should fix all outstanding lockups and performance problems with
> uhci.c. Let me know how it goes for you.
> 
> JE
> 
> --- linux-2.4.19-pre6.orig/drivers/usb/uhci.c	Sun Apr  7 13:22:10 2002
> +++ linux-2.4.19-pre6/drivers/usb/uhci.c	Sun Apr  7 13:25:27 2002
> @@ -1811,6 +1811,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;
>  
> @@ -1820,9 +1823,6 @@
>  			} else
>  				schedule_timeout(1+1*HZ/1000); 
>  
> -			spin_unlock(&urb->lock);
> -			spin_unlock_irqrestore(&uhci->urb_list_lock, flags);
> -
>  			uhci_call_completion(urb);
>  		}
>  	}
> @@ -2193,12 +2193,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:
> 
> 
> --- linux-2.4.19-pre6.orig/drivers/usb/uhci.c	Sun Apr  7 16:21:04 2002
> +++ linux-2.4.19-pre6/drivers/usb/uhci.c	Sun Apr  7 16:24:03 2002
> @@ -748,7 +748,7 @@
>  
>  	if ((!(urb->transfer_flags & USB_NO_FSBR)) && !urbp->fsbr) {
>  		urbp->fsbr = 1;
> -		if (!uhci->fsbr++)
> +		if (!uhci->fsbr++ && !uhci->fsbrtimeout)
>  			uhci->skel_term_qh->link = uhci->skel_hs_control_qh->dma_handle | UHCI_PTR_QH;
>  	}
>  
> @@ -2739,6 +2739,11 @@
>  	/* Reset here so we don't get any interrupts from an old setup */
>  	/*  or broken setup */
>  	reset_hc(uhci);
> +
> +	uhci->fsbr = 0;
> +	uhci->fsbrtimeout = 0;
> +
> +	uhci->is_suspended = 0;
>  
>  	spin_lock_init(&uhci->qh_remove_list_lock);
>  	INIT_LIST_HEAD(&uhci->qh_remove_list);
> 
> 
> --- linux-2.4.19-pre6.orig/drivers/usb/uhci.c	Sun Apr  7 16:27:23 2002
> +++ linux-2.4.19-pre6/drivers/usb/uhci.c	Sun Apr  7 16:28:23 2002
> @@ -1837,10 +1837,6 @@
>  
>  	uhci_dec_fsbr(uhci, urb);
>  
> -	/* There is a race with updating IOC in here, but it's not worth */
> -	/*  trying to fix since this is merely an optimization. The only */
> -	/*  time we'd lose is if the status of the packet got updated */
> -	/*  and we'd be turning on FSBR next frame anyway, so it's a wash */
>  	urbp->fsbr_timeout = 1;
>  
>  	head = &urbp->td_list;
> @@ -2004,23 +2000,23 @@
>  	tmp = head->next;
>  	while (tmp != head) {
>  		struct urb *u = list_entry(tmp, struct urb, urb_list);
> -		struct urb_priv *urbp = (struct urb_priv *)u->hcpriv;
> +		struct urb_priv *up = (struct urb_priv *)u->hcpriv;
>  
>  		tmp = tmp->next;
>  
> -		spin_lock(&urb->lock);
> +		spin_lock(&u->lock);
>  
>  		/* Check if the FSBR timed out */
> -		if (urbp->fsbr && !urbp->fsbr_timeout && time_after_eq(jiffies, urbp->fsbrtime + IDLE_TIMEOUT))
> +		if (up->fsbr && !up->fsbr_timeout && time_after_eq(jiffies, up->fsbrtime + IDLE_TIMEOUT))
>  			uhci_fsbr_timeout(uhci, u);
>  
>  		/* Check if the URB timed out */
> -		if (u->timeout && time_after_eq(jiffies, urbp->inserttime + u->timeout)) {
> +		if (u->timeout && time_after_eq(jiffies, up->inserttime + u->timeout)) {
>  			list_del(&u->urb_list);
>  			list_add_tail(&u->urb_list, &list);
>  		}
>  
> -		spin_unlock(&urb->lock);
> +		spin_unlock(&u->lock);
>  	}
>  	spin_unlock_irqrestore(&uhci->urb_list_lock, flags);
>  
> 
> --- linux-2.4.19-pre6.orig/drivers/usb/uhci.c	Sun Apr  7 16:29:57 2002
> +++ linux-2.4.19-pre6/drivers/usb/uhci.c	Sun Apr  7 16:22:49 2002
> @@ -1622,8 +1622,7 @@
>  
>  	if (urb->status != -EINPROGRESS) {
>  		info("uhci_transfer_result: called for URB %p not in flight?", urb);
> -		spin_unlock_irqrestore(&urb->lock, flags);
> -		return;
> +		goto out;
>  	}
>  
>  	switch (usb_pipetype(urb->pipe)) {
> @@ -1643,10 +1642,8 @@
>  
>  	urbp->status = ret;
>  
> -	if (ret == -EINPROGRESS) {
> -		spin_unlock_irqrestore(&urb->lock, flags);
> -		return;
> -	}
> +	if (ret == -EINPROGRESS)
> +		goto out;
>  
>  	switch (usb_pipetype(urb->pipe)) {
>  	case PIPE_CONTROL:
> @@ -1660,11 +1657,8 @@
>  		break;
>  	case PIPE_INTERRUPT:
>  		/* Interrupts are an exception */
> -		if (urb->interval) {
> -			uhci_add_complete(urb);
> -			spin_unlock_irqrestore(&urb->lock, flags);
> -			return;		/* <-- note return */
> -		}
> +		if (urb->interval)
> +			goto out_complete;
>  
>  		/* Release bandwidth for Interrupt or Isoc. transfers */
>  		/* Spinlock needed ? */
> @@ -1680,8 +1674,10 @@
>  	/* Remove it from uhci->urb_list */
>  	list_del_init(&urb->urb_list);
>  
> +out_complete:
>  	uhci_add_complete(urb);
>  
> +out:
>  	spin_unlock_irqrestore(&urb->lock, flags);
>  }
>  
> @@ -2710,6 +2706,7 @@
>  	}
>  
>  	uhci->dev = dev;
> +	uhci->irq = dev->irq;
>  	uhci->io_addr = io_addr;
>  	uhci->io_size = io_size;
>  	pci_set_drvdata(dev, uhci);
> @@ -2922,8 +2919,6 @@
>  
>  	if (request_irq(dev->irq, uhci_interrupt, SA_SHIRQ, "usb-uhci", uhci))
>  		goto err_request_irq;
> -
> -	uhci->irq = dev->irq;
>  
>  	/* disable legacy emulation */
>  	pci_write_config_word(uhci->dev, USBLEGSUP, USBLEGSUP_DEFAULT);
> --- linux-2.4.19-pre6.orig/drivers/usb/uhci.h	Sun Apr  7 13:22:10 2002
> +++ linux-2.4.19-pre6/drivers/usb/uhci.h	Sun Apr  7 16:16:55 2002
> @@ -287,16 +287,16 @@
>  struct uhci {
>  	struct pci_dev *dev;
>  
> +#ifdef CONFIG_PROC_FS
>  	/* procfs */
>  	int num;
>  	struct proc_dir_entry *proc_entry;
> +#endif
>  
>  	/* Grabbed from PCI */
>  	int irq;
>  	unsigned int io_addr;
>  	unsigned int io_size;
> -
> -	struct list_head uhci_list;
>  
>  	struct pci_pool *qh_pool;
>  	struct pci_pool *td_pool;
> -
> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> Please read the FAQ at  http://www.tux.org/lkml/
> 

-- 
Tommi Kynde Kyntola		kynde@ts.ray.fi
      "A man alone in the forest talking to himself and
       no women around to hear him. Is he still wrong?"


^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [Linux-usb-users] Re: uhci locks up in 2.4.19-pre6
  2002-04-13 16:15 ` [Linux-usb-users] " Johannes Erdfelt
  2002-04-13 17:20   ` Tommi Kyntola
@ 2002-04-13 18:41   ` Stanislav Meduna
  1 sibling, 0 replies; 4+ messages in thread
From: Stanislav Meduna @ 2002-04-13 18:41 UTC (permalink / raw)
  To: Johannes Erdfelt; +Cc: linux-kernel, linux-usb-users

Hello,

> Apply these patches. They should be in -pre7 (or -rc1, depending on what
> Marcelo calls it).
> 
> This should fix all outstanding lockups and performance problems with
> uhci.c. Let me know how it goes for you.

Yup, seems to work now and printing is back to normal too. Thanks.

Regards
-- 
                                   Stano


^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2002-04-13 20:00 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2002-04-13 12:02 uhci locks up in 2.4.19-pre6 Stanislav Meduna
2002-04-13 16:15 ` [Linux-usb-users] " Johannes Erdfelt
2002-04-13 17:20   ` Tommi Kyntola
2002-04-13 18:41   ` Stanislav Meduna

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox