Hi,
FreeBSD maintains a ports package for OSS[1], which has accumelated a number
of patches for OSS. From what I could gather via CVS history and private
e-mail, these patches are backward compatible with previous FreeBSD versions,
and (per maintainer) correct. The attached patch includes the following changes
from FreeBSD:
1. Use M_WAITOK instead of M_NOWAIT when allocating memory in
setup/FreeBSD/oss/build/osscore.c.
2. Try to unbusy device before detaching in
setup/FreeBSD/oss/build/bsdpci.inc and setup/FreeBSD/oss/build/bsdvirtual.inc.
[1] http://www.freebsd.org/cgi/cvsweb.cgi/ports/audio/oss/
Yours,
Yair K.
diff -r 124841211ded setup/FreeBSD/oss/build/bsdpci.inc
--- a/setup/FreeBSD/oss/build/bsdpci.inc Fri Jun 13 03:49:38 2008 +0300
+++ b/setup/FreeBSD/oss/build/bsdpci.inc Fri Jun 13 14:45:50 2008 +0300
@@ -92,6 +92,8 @@
osdev = device_list[i];
if (osdev->dip == dev)
{
+ if (device_get_state(dev) == DS_BUSY)
+ device_unbusy(dev);
if (!DRIVER_DETACH (osdev))
{
printf (DRIVER_NICK ": Unloading busy device\n");
diff -r 124841211ded setup/FreeBSD/oss/build/bsdvirtual.inc
--- a/setup/FreeBSD/oss/build/bsdvirtual.inc Fri Jun 13 03:49:38 2008 +0300
+++ b/setup/FreeBSD/oss/build/bsdvirtual.inc Fri Jun 13 14:45:50 2008 +0300
@@ -34,6 +34,8 @@
{
osdev = device_list[i];
+ if (osdev->dip != NULL && device_get_state(osdev->dip) == DS_BUSY)
+ device_unbusy(osdev->dip);
if (!DRIVER_DETACH (osdev))
{
printf (DRIVER_NICK ": Unloading busy device\n");
diff -r 124841211ded setup/FreeBSD/oss/build/osscore.c
--- a/setup/FreeBSD/oss/build/osscore.c Fri Jun 13 03:49:38 2008 +0300
+++ b/setup/FreeBSD/oss/build/osscore.c Fri Jun 13 14:45:50 2008 +0300
@@ -264,7 +264,7 @@
*phaddr = 0;
tmpbuf =
- (char *) contigmalloc (buffsize, M_DEVBUF, M_NOWAIT, 0ul, memlimit,
+ (char *) contigmalloc (buffsize, M_DEVBUF, M_WAITOK, 0ul, memlimit,
PAGE_SIZE, 0ul);
if (tmpbuf == NULL)
{
_______________________________________________
oss-devel mailing list
[email protected]
http://mailman.opensound.com/mailman/listinfo/oss-devel