Date: Tue, 20 Aug 2002 00:25:04 -0700 (PDT) From: Takanori Watanabe <takawata@FreeBSD.org> To: FreeBSD-gnats-submit@FreeBSD.org Subject: kern/41809: ESS solo cannot be used after suspend Message-ID: <200208200725.g7K7P4HU021253@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
>Number: 41809
>Category: kern
>Synopsis: ESS solo cannot be used after suspend
>Confidential: no
>Severity: serious
>Priority: high
>Responsible: freebsd-bugs
>State: open
>Quarter:
>Keywords:
>Date-Required:
>Class: sw-bug
>Submitter-Id: current-users
>Arrival-Date: Tue Aug 20 00:30:02 PDT 2002
>Closed-Date:
>Last-Modified:
>Originator: Takanori Watanabe
>Release: FreeBSD 4.6-STABLE i386
>Organization:
freebsd.org
>Environment:
System: FreeBSD dnk.axe-inc.co.jp 5.0-CURRENT FreeBSD 5.0-CURRENT #0: Sat Jul 27 14:58:32 JST 2002
>Description:
ESS solo cannot be used after resume due to lack of suspend/resume code.
>How-To-Repeat:
Go sleeping by acpiconf -s 3 or apm -z then resume.
>Fix:
Note that the process opening the device still get wrong after resume.
The ess_suspend routine may used to solve the problem, I think.
Index: solo.c
===================================================================
RCS file: /home/ncvs/src/sys/dev/sound/pci/solo.c,v
retrieving revision 1.23
diff -u -r1.23 solo.c
--- solo.c 8 Oct 2001 05:56:56 -0000 1.23
+++ solo.c 20 Aug 2002 07:21:30 -0000
@@ -896,7 +896,41 @@
#define PCI_LEGACYCONTROL 0x40
#define PCI_CONFIG 0x50
#define PCI_DDMACONTROL 0x60
+static int
+ess_suspend(device_t dev)
+{
+ return 0;
+}
+static int
+ess_resume(device_t dev)
+{
+ uint16_t ddma;
+ uint32_t data;
+ struct ess_info *sc = pcm_getdevinfo(dev);
+
+ data = pci_read_config(dev, PCIR_COMMAND, 2);
+ data |= PCIM_CMD_PORTEN | PCIM_CMD_BUSMASTEREN;
+ pci_write_config(dev, PCIR_COMMAND, data, 2);
+ data = pci_read_config(dev, PCIR_COMMAND, 2);
+
+ ddma = rman_get_start(sc->vc) | 1;
+ pci_write_config(dev, PCI_LEGACYCONTROL, 0x805f, 2);
+ pci_write_config(dev, PCI_DDMACONTROL, ddma, 2);
+ pci_write_config(dev, PCI_CONFIG, 0, 2);
+ if (ess_reset_dsp(sc))
+ goto no;
+ if (mixer_reinit(dev))
+ goto no;
+ if (sc->newspeed)
+ ess_setmixer(sc, 0x71, 0x2a);
+
+ port_wr(sc->io, 0x7, 0xb0, 1); /* enable irqs */
+
+ return 0;
+ no:
+ return EIO;
+}
static int
ess_attach(device_t dev)
{
@@ -996,8 +1030,8 @@
DEVMETHOD(device_probe, ess_probe),
DEVMETHOD(device_attach, ess_attach),
DEVMETHOD(device_detach, ess_detach),
- DEVMETHOD(device_resume, bus_generic_resume),
- DEVMETHOD(device_suspend, bus_generic_suspend),
+ DEVMETHOD(device_resume, ess_resume),
+ DEVMETHOD(device_suspend, ess_suspend),
{ 0, 0 }
};
>Release-Note:
>Audit-Trail:
>Unformatted:
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-bugs" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200208200725.g7K7P4HU021253>
