--- /usr/src/SUNWut/utadem/utadem.c.orig	2006-04-04 02:16:44.000000000 +0200
+++ /usr/src/SUNWut/utadem/utadem.c	2006-06-24 23:11:26.000000000 +0200
@@ -10,6 +10,7 @@
 #endif  /* defined _SCCSID */
 
 #include <linux/module.h>
+#include <linux/moduleparam.h>
 #include <linux/config.h>
 #include <linux/sched.h>
 #include <linux/types.h>
@@ -24,8 +25,11 @@
 #include <linux/sound.h>
 #include <linux/soundcard.h>
 #include <linux/major.h>
+#include <linux/smp_lock.h>
 #include <asm/atomic.h>
 #include <asm/uaccess.h>
+#include <linux/compat.h>
+
 
 #include "utadem.h"
 
@@ -748,13 +752,14 @@
 	struct audio_buf_info info;
 	struct uta_io *io;
 	int j, count = 0;
+	int role;
 
 	DPRINTF(2, "entering %s()\n", __FUNCTION__);
 	// LOCK: sess->io_lock
 	io = &sess->ios[idx];
 
 	// Check how many fragment buffers are available for write
-	int role = (idx == IO_RECORD) ? UTA_DAEMON : UTA_USER;
+	role = (idx == IO_RECORD) ? UTA_DAEMON : UTA_USER;
 	for (j = 0; j < io->num_fragments; j++) {
 		struct uta_buffer *buf = io->fragments[j];
 		if (!buf)
@@ -805,6 +810,7 @@
 	struct uta_session *sess;
 	int ret;
 	int whichio;
+	int seqlen_sec;
 
 	DPRINTF(2, "entering %s(sessid=%d, record=%d, play=%d)\n",
 	    __FUNCTION__, sessid, !!record, !!play);
@@ -833,7 +839,7 @@
 	 * The application can override the default fragment size and
 	 * number of fragments values by calling SETFRAGMENT ioctl.
 	 */
-	int seqlen_sec = (sess->channels * sess->rate);
+	seqlen_sec = (sess->channels * sess->rate);
 	if (sess->format == AFMT_S16_LE)
 		seqlen_sec *= 2;
 
@@ -1337,7 +1343,7 @@
 	} while (completed < size);
 
 	up_write(&conn->syscall_rwsem);
-	DPRINTF(4, "user read %d tried %d\n", completed, size);
+	//DPRINTF(4, "user read %d tried %d\n", completed, size);
 	return (ret);
 }
 
@@ -1433,7 +1439,7 @@
 	} while (completed < size);
 
 	up_write(&conn->syscall_rwsem);
-	DPRINTF(4, "user wrote %d tried %d\n", completed, size);
+	//DPRINTF(4, "user wrote %d tried %d\n", completed, size);
 	return (ret);
 }
 
@@ -1734,6 +1740,7 @@
 	struct uta_connect *conn = file->private_data;
 	struct uta_session *sess = conn->session;
 	int val;
+	int seqlen_sec;
 
 	DPRINTF(2, "entering %s()\n", __FUNCTION__);
 
@@ -1896,7 +1903,7 @@
 		 */
 		total_fragments = (val >> 16) & 0xffff;
 		fragment_buf_size = 1 << (val & 0xffff);
-		int seqlen_sec = (sess->channels * sess->rate);
+		seqlen_sec = (sess->channels * sess->rate);
 		if (sess->format == AFMT_S16_LE)
 			seqlen_sec *= 2;
 
@@ -2157,6 +2164,7 @@
 	const char *p1;
 	int ret;
 	DPRINTF(2, "entering %s()\n", __FUNCTION__);
+	DPRINTF(2, "%s\n", file->f_dentry->d_name.name);
 
 	p0 = file->f_dentry->d_name.name;
 	p1 = p0 + strlen(p0) - 1;
@@ -2197,8 +2205,6 @@
 
 	DPRINTF(2, "entering %s()\n", __FUNCTION__);
 
-	if (ppos != &file->f_pos)
-		return (-ESPIPE);
 	if (size == 0)
 		return (0);
 
@@ -2228,8 +2234,6 @@
 
 	DPRINTF(2, "entering %s()\n", __FUNCTION__);
 
-	if (ppos != &file->f_pos)
-		return (-ESPIPE);
 	if (size == 0)
 		return (0);
 
@@ -2285,6 +2289,21 @@
 	return (ret);
 }
 
+static long
+utadem_compat_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
+{
+	int rval;
+
+	rval = utadem_ioctl(filp->f_dentry->d_inode, filp, cmd, arg);
+
+#if 0
+	return (rval == -EINVAL) ? -ENOIOCTLCMD : rval;
+#else
+	return rval;
+#endif
+}
+
+
 static int
 utadsp_open(struct inode *inode, struct file *file)
 {
@@ -2294,9 +2313,6 @@
 
 	DPRINTF(2, "entering %s()\n", __FUNCTION__);
 
-	/* first */
-	MOD_INC_USE_COUNT;
-
 	/* allocate our connection */
 	conn = kmalloc(sizeof (*conn), GFP_KERNEL);
 	if (!conn) {
@@ -2336,7 +2352,6 @@
 	kfree(conn);
 	file->private_data = NULL;
 out_dec:
-	MOD_DEC_USE_COUNT;
 
 	return (r);
 }
@@ -2395,9 +2410,6 @@
 	kfree(file->private_data);
 	file->private_data = NULL;
 
-	/* last */
-	MOD_DEC_USE_COUNT;
-
 	return (0);
 }
 
@@ -2408,6 +2420,7 @@
 	write:		utadsp_write,
 	poll:		utadsp_poll,
 	ioctl:		utadem_ioctl,
+	compat_ioctl:	utadem_compat_ioctl,
 	open:		utadsp_open,
 	release:	utadsp_release,
 };
@@ -2421,9 +2434,6 @@
 
 	DPRINTF(2, "entering %s()\n", __FUNCTION__);
 
-	/* first */
-	MOD_INC_USE_COUNT;
-
 	/* allocate our connection */
 	conn = kmalloc(sizeof (*conn), GFP_KERNEL);
 	if (!conn) {
@@ -2458,7 +2468,6 @@
 	kfree(conn);
 	file->private_data = NULL;
 out_dec:
-	MOD_DEC_USE_COUNT;
 
 	return (r);
 }
@@ -2482,9 +2491,6 @@
 	kfree(file->private_data);
 	file->private_data = NULL;
 
-	/* last */
-	MOD_DEC_USE_COUNT;
-
 	return (0);
 }
 
@@ -2492,6 +2498,7 @@
 	owner:		THIS_MODULE,
 	llseek:		no_llseek,
 	ioctl:		utadem_ioctl,
+	compat_ioctl:	utadem_compat_ioctl,
 	open:		utamix_open,
 	release:	utamix_release,
 };
@@ -2617,15 +2624,13 @@
 MODULE_DESCRIPTION("Audio device emulation");
 MODULE_LICENSE("GPL");
 
-MODULE_PARM(max_sessions, "i");
+module_param(max_sessions, int, 0);
 MODULE_PARM_DESC(max_sessions, "Maximum number of sessions");
 
 /* Not used at this time */
 // MODULE_PARM(max_per_user, "i");
 // MODULE_PARM_DESC(max_per_user, "Maximum number of sessions per user");
 
-MODULE_PARM(debug, "i");
+module_param(debug, int, 0);
 MODULE_PARM_DESC(debug,
 	"Debugging level (0=off, 1=errors, 2=basic, 3=full, 4=verbose)");
-
-EXPORT_NO_SYMBOLS;
--- /usr/src/SUNWut/utadem/utadem.h.orig	2006-06-24 22:18:22.000000000 +0200
+++ /usr/src/SUNWut/utadem/utadem.h	2006-06-25 01:47:19.000000000 +0200
@@ -73,6 +73,7 @@
 };
 #define	UTADEM_MIXER_NDEVS	32
 
+#if 0
 /* ioctls */
 #define	UTA_IOC_BASE		'U'
 #define	UTAIO_GETVERSION	_IOR(UTA_IOC_BASE, 0, unsigned long)
@@ -84,6 +85,18 @@
 #define	UTAIO_SETMIXER		_IOW(UTA_IOC_BASE, 6, struct utadem_mixdev *)
 #define	UTAIO_UNDERRUN		_IO(UTA_IOC_BASE, 7)
 #define	UTAIO_OVERRUN		_IO(UTA_IOC_BASE, 8)
+#else
+#define	UTAIO_GETVERSION 0x80045500
+#define	UTAIO_NEWSESSION 0x5501
+#define	UTAIO_GETMSG     0x800c5502
+#define	UTAIO_SETDCAPS   0x40205503
+#define	UTAIO_ACKRESET   0x5504
+#define	UTAIO_ACKSYNC    0x5505
+#define	UTAIO_SETMIXER   0x40045506
+#define	UTAIO_UNDERRUN   0x5507
+#define	UTAIO_OVERRUN    0x5508
+#endif
+
 
 #ifdef __cplusplus
 }
