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

Jung-uk Kim <[email protected]>
Newsgroups gmane.os.freebsd.current,gmane.os.freebsd.devel.firewire
Message-ID <[email protected]>
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 <[email protected]>
> > Organization: Direction Informatique, Université de Strasbourg,
> > France To: Alexander Motin <[email protected]>
> > References: <[email protected]>
> > <[email protected]>
> > <[email protected]> <[email protected]>
> > <[email protected]>
> > <[email protected]>
> >
> > 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

_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-current
To unsubscribe, send any mail to "[email protected]"
firewire_suspend.diff (text/plain, 2 KB)
--- 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);
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.