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);