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 oss-devel@mailman.opensound.com http://mailman.opensound.com/mailman/listinfo/oss-devel