[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