[Fwd: Re: amd64 suspend/resume broken on current]

Jung-uk Kim jkim at FreeBSD.org
Mon May 11 20:02:36 UTC 2009


On Monday 11 May 2009 03:29 pm, Jung-uk Kim wrote:
> [CC added]
>
> On Saturday 09 May 2009 09:55 am, Alexander Motin wrote:
> > -------- Original Message --------
> > Subject: Re: amd64 suspend/resume broken on current
> > Date: Fri, 8 May 2009 21:52:45 +0200
> > From: Guy Brand <gb at unistra.fr>
> > Organization: Direction Informatique, Université de Strasbourg,
> > France To: Alexander Motin <mav at mavhome.dp.ua>
> > References: <gtslv6$ufq$1 at FreeBSD.cs.nctu.edu.tw>
> > <4A021118.2030106 at mavhome.dp.ua>
> > <20090508111024.GK4922 at unistra.fr> <4A041DC2.90106 at mavhome.dp.ua>
> > <20090508144551.GA1599 at unistra.fr>
> > <4A047925.6060301 at mavhome.dp.ua>
> >
> > Guy Brand wrote:
> >  > Alexander Motin wrote:
> > > > Done. No firewire issue of course, but a kernel panic on
> > > > resume. Bad karma since yesterday :-)
> > >
> > > Where is this panic happens now?
> >
> > Just after resuming:
> >
> >    Fatal trap 12: page fault while in kernel mode
> >    ...
> >    current process = 1415 (acpiconf)
> >
> > The backtrace says:
> >
> >    intr_execute_handlers() at intr_execute_handlers+0x21
> >    lapic_handle_intr() at lapic_handle_intr+0x37
> >    Xapic_isr1() at Xapic_isr1+0xa4
> >
> >    acpi_sleep_machdep() at acpi_sleep_machdep+0x3b2
> >    acpi_EnterSleepState() at acpi_EnterSleepState+0x3fe
> >    acpi_AckSleepState() at acpi_AckSleepState+0x163
> >    devfs_ioctl() at devfs_ioctl_f+0x77
> >    kern_ioctl() at kern_ioctl+0xb0
> >    ioctl() at ioctl+0xfd
> >    syscall() at syscal+0x246
> >    Xfast_syscall() at Xfast_syscall+0xd0
>
> So, that means the interrupt handler is executed *before* device is
> completely resumed.  In fact, the interrupts are not disabled for
> dcons(4), it seems:
>
> #if 0 /* Let dcons(4) be accessed */
> /* Stop interrupt */
>         OWRITE(sc, FWOHCI_INTMASKCLR,
>                         OHCI_INT_EN | OHCI_INT_ERR |
> OHCI_INT_PHY_SID
>
>                         | OHCI_INT_PHY_INT
>                         | OHCI_INT_DMA_ATRQ | OHCI_INT_DMA_ATRS
>                         | OHCI_INT_DMA_PRRQ | OHCI_INT_DMA_PRRS
>                         | OHCI_INT_DMA_ARRQ | OHCI_INT_DMA_ARRS
>                         | OHCI_INT_PHY_BUS_R);
>
> /* FLUSH FIFO and reset Transmitter/Reciever */
>         OWRITE(sc,  OHCI_HCCCTL, OHCI_HCC_RESET);
> #endif
>
> I guess firewire(4) should differentiate suspend and shutdown
> properly.

Can you try the attached patch?  I may be wrong cause I am not a 
firewire guru, though.

Thanks!

Jung-uk Kim
-------------- next part --------------
--- sys/dev/firewire/fwohci.c	13 Feb 2009 17:44:07 -0000	1.98
+++ sys/dev/firewire/fwohci.c	11 May 2009 19:46:24 -0000
@@ -1742,7 +1742,7 @@
 }
 
 int
-fwohci_stop(struct fwohci_softc *sc, device_t dev)
+fwohci_stop(struct fwohci_softc *sc, device_t dev, int suspend)
 {
 	u_int i;
 
@@ -1759,9 +1759,10 @@
 		OWRITE(sc,  OHCI_ITCTLCLR(i), OHCI_CNTL_DMA_RUN);
 	}
 
-#if 0 /* Let dcons(4) be accessed */  
-/* Stop interrupt */
-	OWRITE(sc, FWOHCI_INTMASKCLR,
+	/* Let dcons(4) be accessed if it is not suspending. */
+	if (suspend) {
+		/* Stop interrupt */
+		OWRITE(sc, FWOHCI_INTMASKCLR,
 			OHCI_INT_EN | OHCI_INT_ERR | OHCI_INT_PHY_SID
 			| OHCI_INT_PHY_INT
 			| OHCI_INT_DMA_ATRQ | OHCI_INT_DMA_ATRS 
@@ -1769,9 +1770,9 @@
 			| OHCI_INT_DMA_ARRQ | OHCI_INT_DMA_ARRS 
 			| OHCI_INT_PHY_BUS_R);
 
-/* FLUSH FIFO and reset Transmitter/Reciever */
-	OWRITE(sc,  OHCI_HCCCTL, OHCI_HCC_RESET);
-#endif
+		/* FLUSH FIFO and reset Transmitter/Reciever */
+		OWRITE(sc,  OHCI_HCCCTL, OHCI_HCC_RESET);
+	}
 
 /* XXX Link down?  Bus reset? */
 	return 0;
--- sys/dev/firewire/fwohci_pci.c	9 Mar 2009 13:23:54 -0000	1.62
+++ sys/dev/firewire/fwohci_pci.c	11 May 2009 19:46:24 -0000
@@ -408,7 +408,7 @@
 	s = splfw();
 
 	if (sc->bsr)
-		fwohci_stop(sc, self);
+		fwohci_stop(sc, self, 0);
 
 	bus_generic_detach(self);
 	if (sc->fc.bdev) {
@@ -462,7 +462,7 @@
 	err = bus_generic_suspend(dev);
 	if (err)
 		return err;
-	fwohci_stop(sc, dev);
+	fwohci_stop(sc, dev, 1);
 	return 0;
 }
 
@@ -482,7 +482,7 @@
 	fwohci_softc_t *sc = device_get_softc(dev);
 
 	bus_generic_shutdown(dev);
-	fwohci_stop(sc, dev);
+	fwohci_stop(sc, dev, 0);
 	return 0;
 }
 
--- sys/dev/firewire/fwohcivar.h	3 Feb 2009 17:13:37 -0000	1.18
+++ sys/dev/firewire/fwohcivar.h	11 May 2009 19:46:24 -0000
@@ -83,4 +83,4 @@
 void fwohci_reset (struct fwohci_softc *, device_t);
 int fwohci_detach (struct fwohci_softc *, device_t);
 int fwohci_resume (struct fwohci_softc *, device_t);
-int fwohci_stop (struct fwohci_softc *, device_t dev);
+int fwohci_stop (struct fwohci_softc *, device_t, int);


More information about the freebsd-current mailing list