Linux kernel & device driver programming

Cross-Referenced Linux and Device Driver Code

[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ]
Version: [ 2.6.11.8 ] [ 2.6.25 ] [ 2.6.25.8 ] [ 2.6.31.13 ] Architecture: [ i386 ]
  1 /*  -*- linux-c -*-
  2  *
  3  * sound/wavfront.c
  4  *
  5  * A Linux driver for Turtle Beach WaveFront Series (Maui, Tropez, Tropez Plus)
  6  *
  7  * This driver supports the onboard wavetable synthesizer (an ICS2115),
  8  * including patch, sample and program loading and unloading, conversion
  9  * of GUS patches during loading, and full user-level access to all
 10  * WaveFront commands. It tries to provide semi-intelligent patch and
 11  * sample management as well.
 12  *
 13  * It also provides support for the ICS emulation of an MPU-401.  Full
 14  * support for the ICS emulation's "virtual MIDI mode" is provided in
 15  * wf_midi.c.
 16  *
 17  * Support is also provided for the Tropez Plus' onboard FX processor,
 18  * a Yamaha YSS225. Currently, code exists to configure the YSS225,
 19  * and there is an interface allowing tweaking of any of its memory
 20  * addresses. However, I have been unable to decipher the logical
 21  * positioning of the configuration info for various effects, so for
 22  * now, you just get the YSS225 in the same state as Turtle Beach's
 23  * "SETUPSND.EXE" utility leaves it.
 24  *
 25  * The boards' DAC/ADC (a Crystal CS4232) is supported by cs4232.[co],
 26  * This chip also controls the configuration of the card: the wavefront
 27  * synth is logical unit 4.
 28  *
 29  *
 30  * Supported devices:
 31  *
 32  *   /dev/dsp                      - using cs4232+ad1848 modules, OSS compatible
 33  *   /dev/midiNN and /dev/midiNN+1 - using wf_midi code, OSS compatible
 34  *   /dev/synth00                  - raw synth interface
 35  * 
 36  **********************************************************************
 37  *
 38  * Copyright (C) by Paul Barton-Davis 1998
 39  *
 40  * Some portions of this file are taken from work that is
 41  * copyright (C) by Hannu Savolainen 1993-1996
 42  *
 43  * Although the relevant code here is all new, the handling of
 44  * sample/alias/multi- samples is entirely based on a driver by Matt
 45  * Martin and Rutger Nijlunsing which demonstrated how to get things
 46  * to work correctly. The GUS patch loading code has been almost
 47  * unaltered by me, except to fit formatting and function names in the
 48  * rest of the file. Many thanks to them.
 49  *
 50  * Appreciation and thanks to Hannu Savolainen for his early work on the Maui
 51  * driver, and answering a few questions while this one was developed.
 52  *
 53  * Absolutely NO thanks to Turtle Beach/Voyetra and Yamaha for their
 54  * complete lack of help in developing this driver, and in particular
 55  * for their utter silence in response to questions about undocumented
 56  * aspects of configuring a WaveFront soundcard, particularly the
 57  * effects processor.
 58  *
 59  * $Id: wavfront.c,v 0.7 1998/09/09 15:47:36 pbd Exp $
 60  *
 61  * This program is distributed under the GNU GENERAL PUBLIC LICENSE (GPL)
 62  * Version 2 (June 1991). See the "COPYING" file distributed with this software
 63  * for more info.
 64  *
 65  * Changes:
 66  * 11-10-2000   Bartlomiej Zolnierkiewicz <bkz@linux-ide.org>
 67  *              Added some __init and __initdata to entries in yss225.c
 68  */
 69 
 70 #include <linux/module.h>
 71 
 72 #include <linux/kernel.h>
 73 #include <linux/init.h>
 74 #include <linux/sched.h>
 75 #include <linux/smp_lock.h>
 76 #include <linux/ptrace.h>
 77 #include <linux/fcntl.h>
 78 #include <linux/syscalls.h>
 79 #include <linux/ioport.h>    
 80 #include <linux/spinlock.h>
 81 #include <linux/interrupt.h>
 82 #include <linux/config.h>
 83 
 84 #include <linux/delay.h>
 85 
 86 #include "sound_config.h"
 87 
 88 #include <linux/wavefront.h>
 89 
 90 #define _MIDI_SYNTH_C_
 91 #define MIDI_SYNTH_NAME "WaveFront MIDI"
 92 #define MIDI_SYNTH_CAPS SYNTH_CAP_INPUT
 93 #include "midi_synth.h"
 94 
 95 /* Compile-time control of the extent to which OSS is supported.
 96 
 97    I consider /dev/sequencer to be an anachronism, but given its
 98    widespread usage by various Linux MIDI software, it seems worth
 99    offering support to it if it's not too painful. Instead of using
100    /dev/sequencer, I recommend:
101 
102      for synth programming and patch loading: /dev/synthNN
103      for kernel-synchronized MIDI sequencing: the ALSA sequencer
104      for direct MIDI control: /dev/midiNN
105 
106    I have never tried static compilation into the kernel. The #if's
107    for this are really just notes to myself about what the code is
108    for.
109 */
110 
111 #define OSS_SUPPORT_SEQ            0x1  /* use of /dev/sequencer */
112 #define OSS_SUPPORT_STATIC_INSTALL 0x2  /* static compilation into kernel */
113 
114 #define OSS_SUPPORT_LEVEL          0x1  /* just /dev/sequencer for now */
115 
116 #if    OSS_SUPPORT_LEVEL & OSS_SUPPORT_SEQ
117 static int (*midi_load_patch) (int devno, int format, const char __user *addr,
118                                int offs, int count, int pmgr_flag) = NULL;
119 #endif /* OSS_SUPPORT_SEQ */
120 
121 /* if WF_DEBUG not defined, no run-time debugging messages will
122    be available via the debug flag setting. Given the current
123    beta state of the driver, this will remain set until a future 
124    version.
125 */
126 
127 #define WF_DEBUG 1
128 
129 #ifdef WF_DEBUG
130 
131 /* Thank goodness for gcc's preprocessor ... */
132 
133 #define DPRINT(cond, format, args...) \
134        if ((dev.debug & (cond)) == (cond)) { \
135              printk (KERN_DEBUG LOGNAME format, ## args); \
136        }
137 #else
138 #define DPRINT(cond, format, args...)
139 #endif
140 
141 #define LOGNAME "WaveFront: "
142 
143 /* bitmasks for WaveFront status port value */
144 
145 #define STAT_RINTR_ENABLED      0x01
146 #define STAT_CAN_READ           0x02
147 #define STAT_INTR_READ          0x04
148 #define STAT_WINTR_ENABLED      0x10
149 #define STAT_CAN_WRITE          0x20
150 #define STAT_INTR_WRITE         0x40
151 
152 /*** Module-accessible parameters ***************************************/
153 
154 int wf_raw;     /* we normally check for "raw state" to firmware
155                    loading. if set, then during driver loading, the
156                    state of the board is ignored, and we reset the
157                    board and load the firmware anyway.
158                 */
159                    
160 static int fx_raw = 1; /* if this is zero, we'll leave the FX processor in
161                           whatever state it is when the driver is loaded.
162                           The default is to download the microprogram and
163                           associated coefficients to set it up for "default"
164                           operation, whatever that means.
165                        */
166 
167 static int debug_default;  /* you can set this to control debugging
168                               during driver loading. it takes any combination
169                               of the WF_DEBUG_* flags defined in
170                               wavefront.h
171                            */
172 
173 /* XXX this needs to be made firmware and hardware version dependent */
174 
175 static char *ospath = "/etc/sound/wavefront.os"; /* where to find a processed
176                                                     version of the WaveFront OS
177                                                   */
178 
179 static int wait_polls = 2000; /* This is a number of tries we poll the
180                                  status register before resorting to sleeping.
181                                  WaveFront being an ISA card each poll takes
182                                  about 1.2us. So before going to
183                                  sleep we wait up to 2.4ms in a loop.
184                              */
185 
186 static int sleep_length = HZ/100; /* This says how long we're going to
187                                      sleep between polls.
188                                      10ms sounds reasonable for fast response.
189                                   */
190 
191 static int sleep_tries = 50;       /* Wait for status 0.5 seconds total. */
192 
193 static int reset_time = 2; /* hundreths of a second we wait after a HW reset for
194                               the expected interrupt.
195                            */
196 
197 static int ramcheck_time = 20;    /* time in seconds to wait while ROM code
198                                      checks on-board RAM.
199                                   */
200 
201 static int osrun_time = 10;  /* time in seconds we wait for the OS to
202                                 start running.
203                              */
204 
205 module_param(wf_raw, int, 0);
206 module_param(fx_raw, int, 0);
207 module_param(debug_default, int, 0);
208 module_param(wait_polls, int, 0);
209 module_param(sleep_length, int, 0);
210 module_param(sleep_tries, int, 0);
211 module_param(ospath, charp, 0);
212 module_param(reset_time, int, 0);
213 module_param(ramcheck_time, int, 0);
214 module_param(osrun_time, int, 0);
215 
216 /***************************************************************************/
217 
218 /* Note: because this module doesn't export any symbols, this really isn't
219    a global variable, even if it looks like one. I was quite confused by
220    this when I started writing this as a (newer) module -- pbd.
221 */
222 
223 struct wf_config {
224         int devno;            /* device number from kernel */
225         int irq;              /* "you were one, one of the few ..." */
226         int base;             /* low i/o port address */
227 
228 #define mpu_data_port    base 
229 #define mpu_command_port base + 1 /* write semantics */
230 #define mpu_status_port  base + 1 /* read semantics */
231 #define data_port        base + 2 
232 #define status_port      base + 3 /* read semantics */
233 #define control_port     base + 3 /* write semantics  */
234 #define block_port       base + 4 /* 16 bit, writeonly */
235 #define last_block_port  base + 6 /* 16 bit, writeonly */
236 
237         /* FX ports. These are mapped through the ICS2115 to the YS225.
238            The ICS2115 takes care of flipping the relevant pins on the
239            YS225 so that access to each of these ports does the right
240            thing. Note: these are NOT documented by Turtle Beach.
241         */
242 
243 #define fx_status       base + 8 
244 #define fx_op           base + 8 
245 #define fx_lcr          base + 9 
246 #define fx_dsp_addr     base + 0xa
247 #define fx_dsp_page     base + 0xb 
248 #define fx_dsp_lsb      base + 0xc 
249 #define fx_dsp_msb      base + 0xd 
250 #define fx_mod_addr     base + 0xe
251 #define fx_mod_data     base + 0xf 
252 
253         volatile int irq_ok;               /* set by interrupt handler */
254         volatile int irq_cnt;              /* ditto */
255         int opened;                        /* flag, holds open(2) mode */
256         char debug;                        /* debugging flags */
257         int freemem;                       /* installed RAM, in bytes */ 
258 
259         int synth_dev;                     /* devno for "raw" synth */
260         int mididev;                       /* devno for internal MIDI */
261         int ext_mididev;                   /* devno for external MIDI */ 
262         int fx_mididev;                    /* devno for FX MIDI interface */
263 #if OSS_SUPPORT_LEVEL & OSS_SUPPORT_SEQ
264         int oss_dev;                      /* devno for OSS sequencer synth */
265 #endif /* OSS_SUPPORT_SEQ */
266 
267         char fw_version[2];                /* major = [0], minor = [1] */
268         char hw_version[2];                /* major = [0], minor = [1] */
269         char israw;                        /* needs Motorola microcode */
270         char has_fx;                       /* has FX processor (Tropez+) */
271         char prog_status[WF_MAX_PROGRAM];  /* WF_SLOT_* */
272         char patch_status[WF_MAX_PATCH];   /* WF_SLOT_* */
273         char sample_status[WF_MAX_SAMPLE]; /* WF_ST_* | WF_SLOT_* */
274         int samples_used;                  /* how many */
275         char interrupts_on;                /* h/w MPU interrupts enabled ? */
276         char rom_samples_rdonly;           /* can we write on ROM samples */
277         wait_queue_head_t interrupt_sleeper; 
278 } dev;
279 
280 static DEFINE_SPINLOCK(lock);
281 static int  detect_wffx(void);
282 static int  wffx_ioctl (wavefront_fx_info *);
283 static int  wffx_init (void);
284 
285 static int wavefront_delete_sample (int sampnum);
286 static int wavefront_find_free_sample (void);
287 
288 /* From wf_midi.c */
289 
290 extern int  virtual_midi_enable  (void);
291 extern int  virtual_midi_disable (void);
292 extern int  detect_wf_mpu (int, int);
293 extern int  install_wf_mpu (void);
294 extern int  uninstall_wf_mpu (void);
295 
296 typedef struct {
297         int cmd;
298         char *action;
299         unsigned int read_cnt;
300         unsigned int write_cnt;
301         int need_ack;
302 } wavefront_command;
303 
304 static struct {
305         int errno;
306         const char *errstr;
307 } wavefront_errors[] = {
308         { 0x01, "Bad sample number" },
309         { 0x02, "Out of sample memory" },
310         { 0x03, "Bad patch number" },
311         { 0x04, "Error in number of voices" },
312         { 0x06, "Sample load already in progress" },
313         { 0x0B, "No sample load request pending" },
314         { 0x0E, "Bad MIDI channel number" },
315         { 0x10, "Download Record Error" },
316         { 0x80, "Success" },
317         { 0 }
318 };
319 
320 #define NEEDS_ACK 1
321 
322 static wavefront_command wavefront_commands[] = {
323         { WFC_SET_SYNTHVOL, "set synthesizer volume", 0, 1, NEEDS_ACK },
324         { WFC_GET_SYNTHVOL, "get synthesizer volume", 1, 0, 0},
325         { WFC_SET_NVOICES, "set number of voices", 0, 1, NEEDS_ACK },
326         { WFC_GET_NVOICES, "get number of voices", 1, 0, 0 },
327         { WFC_SET_TUNING, "set synthesizer tuning", 0, 2, NEEDS_ACK },
328         { WFC_GET_TUNING, "get synthesizer tuning", 2, 0, 0 },
329         { WFC_DISABLE_CHANNEL, "disable synth channel", 0, 1, NEEDS_ACK },
330         { WFC_ENABLE_CHANNEL, "enable synth channel", 0, 1, NEEDS_ACK },
331         { WFC_GET_CHANNEL_STATUS, "get synth channel status", 3, 0, 0 },
332         { WFC_MISYNTH_OFF, "disable midi-in to synth", 0, 0, NEEDS_ACK },
333         { WFC_MISYNTH_ON, "enable midi-in to synth", 0, 0, NEEDS_ACK },
334         { WFC_VMIDI_ON, "enable virtual midi mode", 0, 0, NEEDS_ACK },
335         { WFC_VMIDI_OFF, "disable virtual midi mode", 0, 0, NEEDS_ACK },
336         { WFC_MIDI_STATUS, "report midi status", 1, 0, 0 },
337         { WFC_FIRMWARE_VERSION, "report firmware version", 2, 0, 0 },
338         { WFC_HARDWARE_VERSION, "report hardware version", 2, 0, 0 },
339         { WFC_GET_NSAMPLES, "report number of samples", 2, 0, 0 },
340         { WFC_INSTOUT_LEVELS, "report instantaneous output levels", 7, 0, 0 },
341         { WFC_PEAKOUT_LEVELS, "report peak output levels", 7, 0, 0 },
342         { WFC_DOWNLOAD_SAMPLE, "download sample",
343           0, WF_SAMPLE_BYTES, NEEDS_ACK },
344         { WFC_DOWNLOAD_BLOCK, "download block", 0, 0, NEEDS_ACK},
345         { WFC_DOWNLOAD_SAMPLE_HEADER, "download sample header",
346           0, WF_SAMPLE_HDR_BYTES, NEEDS_ACK },
347         { WFC_UPLOAD_SAMPLE_HEADER, "upload sample header", 13, 2, 0 },
348 
349         /* This command requires a variable number of bytes to be written.
350            There is a hack in wavefront_cmd() to support this. The actual
351            count is passed in as the read buffer ptr, cast appropriately.
352            Ugh.
353         */
354 
355         { WFC_DOWNLOAD_MULTISAMPLE, "download multisample", 0, 0, NEEDS_ACK },
356 
357         /* This one is a hack as well. We just read the first byte of the
358            response, don't fetch an ACK, and leave the rest to the 
359            calling function. Ugly, ugly, ugly.
360         */
361 
362         { WFC_UPLOAD_MULTISAMPLE, "upload multisample", 2, 1, 0 },
363         { WFC_DOWNLOAD_SAMPLE_ALIAS, "download sample alias",
364           0, WF_ALIAS_BYTES, NEEDS_ACK },
365         { WFC_UPLOAD_SAMPLE_ALIAS, "upload sample alias", WF_ALIAS_BYTES, 2, 0},
366         { WFC_DELETE_SAMPLE, "delete sample", 0, 2, NEEDS_ACK },
367         { WFC_IDENTIFY_SAMPLE_TYPE, "identify sample type", 5, 2, 0 },
368         { WFC_UPLOAD_SAMPLE_PARAMS, "upload sample parameters" },
369         { WFC_REPORT_FREE_MEMORY, "report free memory", 4, 0, 0 },
370         { WFC_DOWNLOAD_PATCH, "download patch", 0, 134, NEEDS_ACK },
371         { WFC_UPLOAD_PATCH, "upload patch", 132, 2, 0 },
372         { WFC_DOWNLOAD_PROGRAM, "download program", 0, 33, NEEDS_ACK },
373         { WFC_UPLOAD_PROGRAM, "upload program", 32, 1, 0 },
374         { WFC_DOWNLOAD_EDRUM_PROGRAM, "download enhanced drum program", 0, 9,
375           NEEDS_ACK},
376         { WFC_UPLOAD_EDRUM_PROGRAM, "upload enhanced drum program", 8, 1, 0},
377         { WFC_SET_EDRUM_CHANNEL, "set enhanced drum program channel",
378           0, 1, NEEDS_ACK },
379         { WFC_DISABLE_DRUM_PROGRAM, "disable drum program", 0, 1, NEEDS_ACK },
380         { WFC_REPORT_CHANNEL_PROGRAMS, "report channel program numbers",
381           32, 0, 0 },
382         { WFC_NOOP, "the no-op command", 0, 0, NEEDS_ACK },
383         { 0x00 }
384 };
385 
386 static const char *
387 wavefront_errorstr (int errnum)
388 
389 {
390         int i;
391 
392         for (i = 0; wavefront_errors[i].errstr; i++) {
393                 if (wavefront_errors[i].errno == errnum) {
394                         return wavefront_errors[i].errstr;
395                 }
396         }
397 
398         return "Unknown WaveFront error";
399 }
400 
401 static wavefront_command *
402 wavefront_get_command (int cmd) 
403 
404 {
405         int i;
406 
407         for (i = 0; wavefront_commands[i].cmd != 0; i++) {
408                 if (cmd == wavefront_commands[i].cmd) {
409                         return &wavefront_commands[i];
410                 }
411         }
412 
413         return (wavefront_command *) 0;
414 }
415 
416 static inline int
417 wavefront_status (void) 
418 
419 {
420         return inb (dev.status_port);
421 }
422 
423 static int
424 wavefront_wait (int mask)
425 
426 {
427         int i;
428 
429         for (i = 0; i < wait_polls; i++)
430                 if (wavefront_status() & mask)
431                         return 1;
432 
433         for (i = 0; i < sleep_tries; i++) {
434 
435                 if (wavefront_status() & mask) {
436                         set_current_state(TASK_RUNNING);
437                         return 1;
438                 }
439 
440                 set_current_state(TASK_INTERRUPTIBLE);
441                 schedule_timeout(sleep_length);
442                 if (signal_pending(current))
443                         break;
444         }
445 
446         set_current_state(TASK_RUNNING);
447         return 0;
448 }
449 
450 static int
451 wavefront_read (void)
452 
453 {
454         if (wavefront_wait (STAT_CAN_READ))
455                 return inb (dev.data_port);
456 
457         DPRINT (WF_DEBUG_DATA, "read timeout.\n");
458 
459         return -1;
460 }
461 
462 static int
463 wavefront_write (unsigned char data)
464 
465 {
466         if (wavefront_wait (STAT_CAN_WRITE)) {
467                 outb (data, dev.data_port);
468                 return 0;
469         }
470 
471         DPRINT (WF_DEBUG_DATA, "write timeout.\n");
472 
473         return -1;
474 }
475 
476 static int
477 wavefront_cmd (int cmd, unsigned char *rbuf, unsigned char *wbuf)
478 
479 {
480         int ack;
481         int i;
482         int c;
483         wavefront_command *wfcmd;
484 
485         if ((wfcmd = wavefront_get_command (cmd)) == (wavefront_command *) 0) {
486                 printk (KERN_WARNING LOGNAME "command 0x%x not supported.\n",
487                         cmd);
488                 return 1;
489         }
490 
491         /* Hack to handle the one variable-size write command. See
492            wavefront_send_multisample() for the other half of this
493            gross and ugly strategy.
494         */
495 
496         if (cmd == WFC_DOWNLOAD_MULTISAMPLE) {
497                 wfcmd->write_cnt = (unsigned int) rbuf;
498                 rbuf = NULL;
499         }
500 
501         DPRINT (WF_DEBUG_CMD, "0x%x [%s] (%d,%d,%d)\n",
502                                cmd, wfcmd->action, wfcmd->read_cnt,
503                                wfcmd->write_cnt, wfcmd->need_ack);
504     
505         if (wavefront_write (cmd)) { 
506                 DPRINT ((WF_DEBUG_IO|WF_DEBUG_CMD), "cannot request "
507                                                      "0x%x [%s].\n",
508                                                      cmd, wfcmd->action);
509                 return 1;
510         } 
511 
512         if (wfcmd->write_cnt > 0) {
513                 DPRINT (WF_DEBUG_DATA, "writing %d bytes "
514                                         "for 0x%x\n",
515                                         wfcmd->write_cnt, cmd);
516 
517                 for (i = 0; i < wfcmd->write_cnt; i++) {
518                         if (wavefront_write (wbuf[i])) {
519                                 DPRINT (WF_DEBUG_IO, "bad write for byte "
520                                                       "%d of 0x%x [%s].\n",
521                                                       i, cmd, wfcmd->action);
522                                 return 1;
523                         }
524 
525                         DPRINT (WF_DEBUG_DATA, "write[%d] = 0x%x\n",
526                                                 i, wbuf[i]);
527                 }
528         }
529 
530         if (wfcmd->read_cnt > 0) {
531                 DPRINT (WF_DEBUG_DATA, "reading %d ints "
532                                         "for 0x%x\n",
533                                         wfcmd->read_cnt, cmd);
534 
535                 for (i = 0; i < wfcmd->read_cnt; i++) {
536 
537                         if ((c = wavefront_read()) == -1) {
538                                 DPRINT (WF_DEBUG_IO, "bad read for byte "
539                                                       "%d of 0x%x [%s].\n",
540                                                       i, cmd, wfcmd->action);
541                                 return 1;
542                         }
543 
544                         /* Now handle errors. Lots of special cases here */
545             
546                         if (c == 0xff) { 
547                                 if ((c = wavefront_read ()) == -1) {
548                                         DPRINT (WF_DEBUG_IO, "bad read for "
549                                                               "error byte at "
550                                                               "read byte %d "
551                                                               "of 0x%x [%s].\n",
552                                                               i, cmd,
553                                                               wfcmd->action);
554                                         return 1;
555                                 }
556 
557                                 /* Can you believe this madness ? */
558 
559                                 if (c == 1 &&
560                                     wfcmd->cmd == WFC_IDENTIFY_SAMPLE_TYPE) {
561                                         rbuf[0] = WF_ST_EMPTY;
562                                         return (0);
563 
564                                 } else if (c == 3 &&
565                                            wfcmd->cmd == WFC_UPLOAD_PATCH) {
566 
567                                         return 3;
568 
569                                 } else if (c == 1 &&
570                                            wfcmd->cmd == WFC_UPLOAD_PROGRAM) {
571 
572                                         return 1;
573 
574                                 } else {
575 
576                                         DPRINT (WF_DEBUG_IO, "error %d (%s) "
577                                                               "during "
578                                                               "read for byte "
579                                                               "%d of 0x%x "
580                                                               "[%s].\n",
581                                                               c,
582                                                               wavefront_errorstr (c),
583                                                               i, cmd,
584                                                               wfcmd->action);
585                                         return 1;
586 
587                                 }
588                 
589                 } else {
590                                 rbuf[i] = c;
591                         }
592                         
593                         DPRINT (WF_DEBUG_DATA, "read[%d] = 0x%x\n",i, rbuf[i]);
594                 }
595         }
596         
597         if ((wfcmd->read_cnt == 0 && wfcmd->write_cnt == 0) || wfcmd->need_ack) {
598 
599                 DPRINT (WF_DEBUG_CMD, "reading ACK for 0x%x\n", cmd);
600 
601                 /* Some commands need an ACK, but return zero instead
602                    of the standard value.
603                 */
604             
605                 if ((ack = wavefront_read()) == 0) {
606                         ack = WF_ACK;
607                 }
608         
609                 if (ack != WF_ACK) {
610                         if (ack == -1) {
611                                 DPRINT (WF_DEBUG_IO, "cannot read ack for "
612                                                       "0x%x [%s].\n",
613                                                       cmd, wfcmd->action);
614                                 return 1;
615                 
616                         } else {
617                                 int err = -1; /* something unknown */
618 
619                                 if (ack == 0xff) { /* explicit error */
620                     
621                                         if ((err = wavefront_read ()) == -1) {
622                                                 DPRINT (WF_DEBUG_DATA,
623                                                         "cannot read err "
624                                                         "for 0x%x [%s].\n",
625                                                         cmd, wfcmd->action);
626                                         }
627                                 }
628                                 
629                                 DPRINT (WF_DEBUG_IO, "0x%x [%s] "
630                                         "failed (0x%x, 0x%x, %s)\n",
631                                         cmd, wfcmd->action, ack, err,
632                                         wavefront_errorstr (err));
633                                 
634                                 return -err;
635                         }
636                 }
637                 
638                 DPRINT (WF_DEBUG_DATA, "ack received "
639                                         "for 0x%x [%s]\n",
640                                         cmd, wfcmd->action);
641         } else {
642 
643                 DPRINT (WF_DEBUG_CMD, "0x%x [%s] does not need "
644                                        "ACK (%d,%d,%d)\n",
645                                        cmd, wfcmd->action, wfcmd->read_cnt,
646                                        wfcmd->write_cnt, wfcmd->need_ack);
647         }
648 
649         return 0;
650         
651 }
652 
653 /***********************************************************************
654 WaveFront: data munging   
655 
656 Things here are weird. All data written to the board cannot 
657 have its most significant bit set. Any data item with values 
658 potentially > 0x7F (127) must be split across multiple bytes.
659 
660 Sometimes, we need to munge numeric values that are represented on
661 the x86 side as 8-32 bit values. Sometimes, we need to munge data
662 that is represented on the x86 side as an array of bytes. The most
663 efficient approach to handling both cases seems to be to use 2
664 different functions for munging and 2 for de-munging. This avoids
665 weird casting and worrying about bit-level offsets.
666 
667 **********************************************************************/
668 
669 static 
670 unsigned char *
671 munge_int32 (unsigned int src,
672              unsigned char *dst,
673              unsigned int dst_size)
674 {
675         int i;
676 
677         for (i = 0;i < dst_size; i++) {
678                 *dst = src & 0x7F;  /* Mask high bit of LSB */
679                 src = src >> 7;     /* Rotate Right 7 bits  */
680                                     /* Note: we leave the upper bits in place */ 
681 
682                 dst++;
683         };
684         return dst;
685 };
686 
687 static int 
688 demunge_int32 (unsigned char* src, int src_size)
689 
690 {
691         int i;
692         int outval = 0;
693         
694         for (i = src_size - 1; i >= 0; i--) {
695                 outval=(outval<<7)+src[i];
696         }
697 
698         return outval;
699 };
700 
701 static 
702 unsigned char *
703 munge_buf (unsigned char *src, unsigned char *dst, unsigned int dst_size)
704 
705 {
706         int i;
707         unsigned int last = dst_size / 2;
708 
709         for (i = 0; i < last; i++) {
710                 *dst++ = src[i] & 0x7f;
711                 *dst++ = src[i] >> 7;
712         }
713         return dst;
714 }
715 
716 static 
717 unsigned char *
718 demunge_buf (unsigned char *src, unsigned char *dst, unsigned int src_bytes)
719 
720 {
721         int i;
722         unsigned char *end = src + src_bytes;
723     
724         end = src + src_bytes;
725 
726         /* NOTE: src and dst *CAN* point to the same address */
727 
728         for (i = 0; src != end; i++) {
729                 dst[i] = *src++;
730                 dst[i] |= (*src++)<<7;
731         }
732 
733         return dst;
734 }
735 
736 /***********************************************************************
737 WaveFront: sample, patch and program management.
738 ***********************************************************************/
739 
740 static int
741 wavefront_delete_sample (int sample_num)
742 
743 {
744         unsigned char wbuf[2];
745         int x;
746 
747         wbuf[0] = sample_num & 0x7f;
748         wbuf[1] = sample_num >> 7;
749 
750         if ((x = wavefront_cmd (WFC_DELETE_SAMPLE, NULL, wbuf)) == 0) {
751                 dev.sample_status[sample_num] = WF_ST_EMPTY;
752         }
753 
754         return x;
755 }
756 
757 static int
758 wavefront_get_sample_status (int assume_rom)
759 
760 {
761         int i;
762         unsigned char rbuf[32], wbuf[32];
763         unsigned int    sc_real, sc_alias, sc_multi;
764 
765         /* check sample status */
766     
767         if (wavefront_cmd (WFC_GET_NSAMPLES, rbuf, wbuf)) {
768                 printk (KERN_WARNING LOGNAME "cannot request sample count.\n");
769                 return -1;
770         } 
771     
772         sc_real = sc_alias = sc_multi = dev.samples_used = 0;
773     
774         for (i = 0; i < WF_MAX_SAMPLE; i++) {
775         
776                 wbuf[0] = i & 0x7f;
777                 wbuf[1] = i >> 7;
778 
779                 if (wavefront_cmd (WFC_IDENTIFY_SAMPLE_TYPE, rbuf, wbuf)) {
780                         printk (KERN_WARNING LOGNAME
781                                 "cannot identify sample "
782                                 "type of slot %d\n", i);
783                         dev.sample_status[i] = WF_ST_EMPTY;
784                         continue;
785                 }
786 
787                 dev.sample_status[i] = (WF_SLOT_FILLED|rbuf[0]);
788 
789                 if (assume_rom) {
790                         dev.sample_status[i] |= WF_SLOT_ROM;
791                 }
792 
793                 switch (rbuf[0] & WF_ST_MASK) {
794                 case WF_ST_SAMPLE:
795                         sc_real++;
796                         break;
797                 case WF_ST_MULTISAMPLE:
798                         sc_multi++;
799                         break;
800                 case WF_ST_ALIAS:
801                         sc_alias++;
802                         break;
803                 case WF_ST_EMPTY:
804                         break;
805 
806                 default:
807                         printk (KERN_WARNING LOGNAME "unknown sample type for "
808                                 "slot %d (0x%x)\n", 
809                                 i, rbuf[0]);
810                 }
811 
812                 if (rbuf[0] != WF_ST_EMPTY) {
813                         dev.samples_used++;
814                 } 
815         }
816 
817         printk (KERN_INFO LOGNAME
818                 "%d samples used (%d real, %d aliases, %d multi), "
819                 "%d empty\n", dev.samples_used, sc_real, sc_alias, sc_multi,
820                 WF_MAX_SAMPLE - dev.samples_used);
821 
822 
823         return (0);
824 
825 }
826 
827 static int
828 wavefront_get_patch_status (void)
829 
830 {
831         unsigned char patchbuf[WF_PATCH_BYTES];
832         unsigned char patchnum[2];
833         wavefront_patch *p;
834         int i, x, cnt, cnt2;
835 
836         for (i = 0; i < WF_MAX_PATCH; i++) {
837                 patchnum[0] = i & 0x7f;
838                 patchnum[1] = i >> 7;
839 
840                 if ((x = wavefront_cmd (WFC_UPLOAD_PATCH, patchbuf,
841                                         patchnum)) == 0) {
842 
843                         dev.patch_status[i] |= WF_SLOT_FILLED;
844                         p = (wavefront_patch *) patchbuf;
845                         dev.sample_status
846                                 [p->sample_number|(p->sample_msb<<7)] |=
847                                 WF_SLOT_USED;
848             
849                 } else if (x == 3) { /* Bad patch number */
850                         dev.patch_status[i] = 0;
851                 } else {
852                         printk (KERN_ERR LOGNAME "upload patch "
853                                 "error 0x%x\n", x);
854                         dev.patch_status[i] = 0;
855                         return 1;
856                 }
857         }
858 
859         /* program status has already filled in slot_used bits */
860 
861         for (i = 0, cnt = 0, cnt2 = 0; i < WF_MAX_PATCH; i++) {
862                 if (dev.patch_status[i] & WF_SLOT_FILLED) {
863                         cnt++;
864                 }
865                 if (dev.patch_status[i] & WF_SLOT_USED) {
866                         cnt2++;
867                 }
868         
869         }
870         printk (KERN_INFO LOGNAME
871                 "%d patch slots filled, %d in use\n", cnt, cnt2);
872 
873         return (0);
874 }
875 
876 static int
877 wavefront_get_program_status (void)
878 
879 {
880         unsigned char progbuf[WF_PROGRAM_BYTES];
881         wavefront_program prog;
882         unsigned char prognum;
883         int i, x, l, cnt;
884 
885         for (i = 0; i < WF_MAX_PROGRAM; i++) {
886                 prognum = i;
887 
888                 if ((x = wavefront_cmd (WFC_UPLOAD_PROGRAM, progbuf,
889                                         &prognum)) == 0) {
890 
891                         dev.prog_status[i] |= WF_SLOT_USED;
892 
893                         demunge_buf (progbuf, (unsigned char *) &prog,
894                                      WF_PROGRAM_BYTES);
895 
896                         for (l = 0; l < WF_NUM_LAYERS; l++) {
897                                 if (prog.layer[l].mute) {
898                                         dev.patch_status
899                                                 [prog.layer[l].patch_number] |=
900                                                 WF_SLOT_USED;
901                                 }
902                         }
903                 } else if (x == 1) { /* Bad program number */
904                         dev.prog_status[i] = 0;
905                 } else {
906                         printk (KERN_ERR LOGNAME "upload program "
907                                 "error 0x%x\n", x);
908                         dev.prog_status[i] = 0;
909                 }
910         }
911 
912         for (i = 0, cnt = 0; i < WF_MAX_PROGRAM; i++) {
913                 if (dev.prog_status[i]) {
914                         cnt++;
915                 }
916         }
917 
918         printk (KERN_INFO LOGNAME "%d programs slots in use\n", cnt);
919 
920         return (0);
921 }
922 
923 static int
924 wavefront_send_patch (wavefront_patch_info *header)
925 
926 {
927         unsigned char buf[WF_PATCH_BYTES+2];
928         unsigned char *bptr;
929 
930         DPRINT (WF_DEBUG_LOAD_PATCH, "downloading patch %d\n",
931                                       header->number);
932 
933         dev.patch_status[header->number] |= WF_SLOT_FILLED;
934 
935         bptr = buf;
936         bptr = munge_int32 (header->number, buf, 2);
937         munge_buf ((unsigned char *)&header->hdr.p, bptr, WF_PATCH_BYTES);
938     
939         if (wavefront_cmd (WFC_DOWNLOAD_PATCH, NULL, buf)) {
940                 printk (KERN_ERR LOGNAME "download patch failed\n");
941                 return -(EIO);
942         }
943 
944         return (0);
945 }
946 
947 static int
948 wavefront_send_program (wavefront_patch_info *header)
949 
950 {
951         unsigned char buf[WF_PROGRAM_BYTES+1];
952         int i;
953 
954         DPRINT (WF_DEBUG_LOAD_PATCH, "downloading program %d\n",
955                 header->number);
956 
957         dev.prog_status[header->number] = WF_SLOT_USED;
958 
959         /* XXX need to zero existing SLOT_USED bit for program_status[i]
960            where `i' is the program that's being (potentially) overwritten.
961         */
962     
963         for (i = 0; i < WF_NUM_LAYERS; i++) {
964                 if (header->hdr.pr.layer[i].mute) {
965                         dev.patch_status[header->hdr.pr.layer[i].patch_number] |=
966                                 WF_SLOT_USED;
967 
968                         /* XXX need to mark SLOT_USED for sample used by
969                            patch_number, but this means we have to load it. Ick.
970                         */
971                 }
972         }
973 
974         buf[0] = header->number;
975         munge_buf ((unsigned char *)&header->hdr.pr, &buf[1], WF_PROGRAM_BYTES);
976     
977         if (wavefront_cmd (WFC_DOWNLOAD_PROGRAM, NULL, buf)) {
978                 printk (KERN_WARNING LOGNAME "download patch failed\n");        
979                 return -(EIO);
980         }
981 
982         return (0);
983 }
984 
985 static int
986 wavefront_freemem (void)
987 
988 {
989         char rbuf[8];
990 
991         if (wavefront_cmd (WFC_REPORT_FREE_MEMORY, rbuf, NULL)) {
992                 printk (KERN_WARNING LOGNAME "can't get memory stats.\n");
993                 return -1;
994         } else {
995                 return demunge_int32 (rbuf, 4);
996         }
997 }
998 
999 static int
1000 wavefront_send_sample (wavefront_patch_info *header,
1001                        UINT16 __user *dataptr,
1002                        int data_is_unsigned)
1003 
1004 {
1005         /* samples are downloaded via a 16-bit wide i/o port
1006            (you could think of it as 2 adjacent 8-bit wide ports
1007            but its less efficient that way). therefore, all
1008            the blocksizes and so forth listed in the documentation,
1009            and used conventionally to refer to sample sizes,
1010            which are given in 8-bit units (bytes), need to be
1011            divided by 2.
1012         */
1013 
1014         UINT16 sample_short;
1015         UINT32 length;
1016         UINT16 __user *data_end = NULL;
1017         unsigned int i;
1018         const int max_blksize = 4096/2;
1019         unsigned int written;
1020         unsigned int blocksize;
1021         int dma_ack;
1022         int blocknum;
1023         unsigned char sample_hdr[WF_SAMPLE_HDR_BYTES];
1024         unsigned char *shptr;
1025         int skip = 0;
1026         int initial_skip = 0;
1027 
1028         DPRINT (WF_DEBUG_LOAD_PATCH, "sample %sdownload for slot %d, "
1029                                       "type %d, %d bytes from %p\n",
1030                                       header->size ? "" : "header ", 
1031                                       header->number, header->subkey,
1032                                       header->size,
1033                                       header->dataptr);
1034 
1035         if (header->number == WAVEFRONT_FIND_FREE_SAMPLE_SLOT) {
1036                 int x;
1037 
1038                 if ((x = wavefront_find_free_sample ()) < 0) {
1039                         return -ENOMEM;
1040                 }
1041                 printk (KERN_DEBUG LOGNAME "unspecified sample => %d\n", x);
1042                 header->number = x;
1043         }
1044 
1045         if (header->size) {
1046 
1047                 /* XXX it's a debatable point whether or not RDONLY semantics
1048                    on the ROM samples should cover just the sample data or
1049                    the sample header. For now, it only covers the sample data,
1050                    so anyone is free at all times to rewrite sample headers.
1051 
1052                    My reason for this is that we have the sample headers
1053                    available in the WFB file for General MIDI, and so these
1054                    can always be reset if needed. The sample data, however,
1055                    cannot be recovered without a complete reset and firmware
1056                    reload of the ICS2115, which is a very expensive operation.
1057 
1058                    So, doing things this way allows us to honor the notion of
1059                    "RESETSAMPLES" reasonably cheaply. Note however, that this
1060                    is done purely at user level: there is no WFB parser in
1061                    this driver, and so a complete reset (back to General MIDI,
1062                    or theoretically some other configuration) is the
1063                    responsibility of the user level library. 
1064 
1065                    To try to do this in the kernel would be a little
1066                    crazy: we'd need 158K of kernel space just to hold
1067                    a copy of the patch/program/sample header data.
1068                 */
1069 
1070                 if (dev.rom_samples_rdonly) {
1071                         if (dev.sample_status[header->number] & WF_SLOT_ROM) {
1072                                 printk (KERN_ERR LOGNAME "sample slot %d "
1073                                         "write protected\n",
1074                                         header->number);
1075                                 return -EACCES;
1076                         }
1077                 }
1078 
1079                 wavefront_delete_sample (header->number);
1080         }
1081 
1082         if (header->size) {
1083                 dev.freemem = wavefront_freemem ();
1084 
1085                 if (dev.freemem < header->size) {
1086                         printk (KERN_ERR LOGNAME
1087                                 "insufficient memory to "
1088                                 "load %d byte sample.\n",
1089                                 header->size);
1090                         return -ENOMEM;
1091                 }
1092         
1093         }
1094 
1095         skip = WF_GET_CHANNEL(&header->hdr.s);
1096 
1097         if (skip > 0 && header->hdr.s.SampleResolution != LINEAR_16BIT) {
1098                 printk (KERN_ERR LOGNAME "channel selection only "
1099                         "possible on 16-bit samples");
1100                 return -(EINVAL);
1101         }
1102 
1103         switch (skip) {
1104         case 0:
1105                 initial_skip = 0;
1106                 skip = 1;
1107                 break;
1108         case 1:
1109                 initial_skip = 0;
1110                 skip = 2;
1111                 break;
1112         case 2:
1113                 initial_skip = 1;
1114                 skip = 2;
1115                 break;
1116         case 3:
1117                 initial_skip = 2;
1118                 skip = 3;
1119                 break;
1120         case 4:
1121                 initial_skip = 3;
1122                 skip = 4;
1123                 break;
1124         case 5:
1125                 initial_skip = 4;
1126                 skip = 5;
1127                 break;
1128         case 6:
1129                 initial_skip = 5;
1130                 skip = 6;
1131                 break;
1132         }
1133 
1134         DPRINT (WF_DEBUG_LOAD_PATCH, "channel selection: %d => "
1135                                       "initial skip = %d, skip = %d\n",
1136                                       WF_GET_CHANNEL (&header->hdr.s),
1137                                       initial_skip, skip);
1138     
1139         /* Be safe, and zero the "Unused" bits ... */
1140 
1141         WF_SET_CHANNEL(&header->hdr.s, 0);
1142 
1143         /* adjust size for 16 bit samples by dividing by two.  We always
1144            send 16 bits per write, even for 8 bit samples, so the length
1145            is always half the size of the sample data in bytes.
1146         */
1147 
1148         length = header->size / 2;
1149 
1150         /* the data we're sent has not been munged, and in fact, the
1151            header we have to send isn't just a munged copy either.
1152            so, build the sample header right here.
1153         */
1154 
1155         shptr = &sample_hdr[0];
1156 
1157         shptr = munge_int32 (header->number, shptr, 2);
1158 
1159         if (header->size) {
1160                 shptr = munge_int32 (length, shptr, 4);
1161         }
1162 
1163         /* Yes, a 4 byte result doesn't contain all of the offset bits,
1164            but the offset only uses 24 bits.
1165         */
1166 
1167         shptr = munge_int32 (*((UINT32 *) &header->hdr.s.sampleStartOffset),
1168                              shptr, 4);
1169         shptr = munge_int32 (*((UINT32 *) &header->hdr.s.loopStartOffset),
1170                              shptr, 4);
1171         shptr = munge_int32 (*((UINT32 *) &header->hdr.s.loopEndOffset),
1172                              shptr, 4);
1173         shptr = munge_int32 (*((UINT32 *) &header->hdr.s.sampleEndOffset),
1174                              shptr, 4);
1175         
1176         /* This one is truly weird. What kind of weirdo decided that in
1177            a system dominated by 16 and 32 bit integers, they would use
1178            a just 12 bits ?
1179         */
1180         
1181         shptr = munge_int32 (header->hdr.s.FrequencyBias, shptr, 3);
1182         
1183         /* Why is this nybblified, when the MSB is *always* zero ? 
1184            Anyway, we can't take address of bitfield, so make a
1185            good-faith guess at where it starts.
1186         */
1187         
1188         shptr = munge_int32 (*(&header->hdr.s.FrequencyBias+1),
1189                              shptr, 2);
1190 
1191         if (wavefront_cmd (header->size ?
1192                            WFC_DOWNLOAD_SAMPLE : WFC_DOWNLOAD_SAMPLE_HEADER,
1193                            NULL, sample_hdr)) {
1194                 printk (KERN_WARNING LOGNAME "sample %sdownload refused.\n",
1195                         header->size ? "" : "header ");
1196                 return -(EIO);
1197         }
1198 
1199         if (header->size == 0) {
1200                 goto sent; /* Sorry. Just had to have one somewhere */
1201         }
1202     
1203         data_end = dataptr + length;
1204 
1205         /* Do any initial skip over an unused channel's data */
1206 
1207         dataptr += initial_skip;
1208     
1209         for (written = 0, blocknum = 0;
1210              written < length; written += max_blksize, blocknum++) {
1211         
1212                 if ((length - written) > max_blksize) {
1213                         blocksize = max_blksize;
1214                 } else {
1215                         /* round to nearest 16-byte value */
1216                         blocksize = ((length-written+7)&~0x7);
1217                 }
1218 
1219                 if (wavefront_cmd (WFC_DOWNLOAD_BLOCK, NULL, NULL)) {
1220                         printk (KERN_WARNING LOGNAME "download block "
1221                                 "request refused.\n");
1222                         return -(EIO);
1223                 }
1224 
1225                 for (i = 0; i < blocksize; i++) {
1226 
1227                         if (dataptr < data_end) {
1228                 
1229                                 __get_user (sample_short, dataptr);
1230                                 dataptr += skip;
1231                 
1232                                 if (data_is_unsigned) { /* GUS ? */
1233 
1234                                         if (WF_SAMPLE_IS_8BIT(&header->hdr.s)) {
1235                         
1236                                                 /* 8 bit sample
1237                                                  resolution, sign
1238                                                  extend both bytes.
1239                                                 */
1240                         
1241                                                 ((unsigned char*)
1242                                                  &sample_short)[0] += 0x7f;
1243                                                 ((unsigned char*)
1244                                                  &sample_short)[1] += 0x7f;
1245                         
1246                                         } else {
1247                         
1248                                                 /* 16 bit sample
1249                                                  resolution, sign
1250                                                  extend the MSB.
1251                                                 */
1252                         
1253                                                 sample_short += 0x7fff;
1254                                         }
1255                                 }
1256 
1257                         } else {
1258 
1259                                 /* In padding section of final block:
1260 
1261                                    Don't fetch unsupplied data from
1262                                    user space, just continue with
1263                                    whatever the final value was.
1264                                 */
1265                         }
1266             
1267                         if (i < blocksize - 1) {
1268                                 outw (sample_short, dev.block_port);
1269                         } else {
1270                                 outw (sample_short, dev.last_block_port);
1271                         }
1272                 }
1273 
1274                 /* Get "DMA page acknowledge", even though its really
1275                    nothing to do with DMA at all.
1276                 */
1277         
1278                 if ((dma_ack = wavefront_read ()) != WF_DMA_ACK) {
1279                         if (dma_ack == -1) {
1280                                 printk (KERN_ERR LOGNAME "upload sample "
1281                                         "DMA ack timeout\n");
1282                                 return -(EIO);
1283                         } else {
1284                                 printk (KERN_ERR LOGNAME "upload sample "
1285                                         "DMA ack error 0x%x\n",
1286                                         dma_ack);
1287                                 return -(EIO);
1288                         }
1289                 }
1290         }
1291 
1292         dev.sample_status[header->number] = (WF_SLOT_FILLED|WF_ST_SAMPLE);
1293 
1294         /* Note, label is here because sending the sample header shouldn't
1295            alter the sample_status info at all.
1296         */
1297 
1298  sent:
1299         return (0);
1300 }
1301 
1302 static int
1303 wavefront_send_alias (wavefront_patch_info *header)
1304 
1305 {
1306         unsigned char alias_hdr[WF_ALIAS_BYTES];
1307 
1308         DPRINT (WF_DEBUG_LOAD_PATCH, "download alias, %d is "
1309                                       "alias for %d\n",
1310                                       header->number,
1311                                       header->hdr.a.OriginalSample);
1312     
1313         munge_int32 (header->number, &alias_hdr[0], 2);
1314         munge_int32 (header->hdr.a.OriginalSample, &alias_hdr[2], 2);
1315         munge_int32 (*((unsigned int *)&header->hdr.a.sampleStartOffset),
1316                      &alias_hdr[4], 4);
1317         munge_int32 (*((unsigned int *)&header->hdr.a.loopStartOffset),
1318                      &alias_hdr[8], 4);
1319         munge_int32 (*((unsigned int *)&header->hdr.a.loopEndOffset),
1320                      &alias_hdr[12], 4);
1321         munge_int32 (*((unsigned int *)&header->hdr.a.sampleEndOffset),
1322                      &alias_hdr[16], 4);
1323         munge_int32 (header->hdr.a.FrequencyBias, &alias_hdr[20], 3);
1324         munge_int32 (*(&header->hdr.a.FrequencyBias+1), &alias_hdr[23], 2);
1325 
1326         if (wavefront_cmd (WFC_DOWNLOAD_SAMPLE_ALIAS, NULL, alias_hdr)) {
1327                 printk (KERN_ERR LOGNAME "download alias failed.\n");
1328                 return -(EIO);
1329         }
1330 
1331         dev.sample_status[header->number] = (WF_SLOT_FILLED|WF_ST_ALIAS);
1332 
1333         return (0);
1334 }
1335 
1336 static int
1337 wavefront_send_multisample (wavefront_patch_info *header)
1338 {
1339         int i;
1340         int num_samples;
1341         unsigned char msample_hdr[WF_MSAMPLE_BYTES];
1342 
1343         munge_int32 (header->number, &msample_hdr[0], 2);
1344 
1345         /* You'll recall at this point that the "number of samples" value
1346            in a wavefront_multisample struct is actually the log2 of the
1347            real number of samples.
1348         */
1349 
1350         num_samples = (1<<(header->hdr.ms.NumberOfSamples&7));
1351         msample_hdr[2] = (unsigned char) header->hdr.ms.NumberOfSamples;
1352 
1353         DPRINT (WF_DEBUG_LOAD_PATCH, "multi %d with %d=%d samples\n",
1354                                       header->number,
1355                                       header->hdr.ms.NumberOfSamples,
1356                                       num_samples);
1357 
1358         for (i = 0; i < num_samples; i++) {
1359                 DPRINT(WF_DEBUG_LOAD_PATCH|WF_DEBUG_DATA, "sample[%d] = %d\n",
1360                        i, header->hdr.ms.SampleNumber[i]);
1361                 munge_int32 (header->hdr.ms.SampleNumber[i],
1362                      &msample_hdr[3+(i*2)], 2);
1363         }
1364     
1365         /* Need a hack here to pass in the number of bytes
1366            to be written to the synth. This is ugly, and perhaps
1367            one day, I'll fix it.
1368         */
1369 
1370         if (wavefront_cmd (WFC_DOWNLOAD_MULTISAMPLE, 
1371                            (unsigned char *) ((num_samples*2)+3),
1372                            msample_hdr)) {
1373                 printk (KERN_ERR LOGNAME "download of multisample failed.\n");
1374                 return -(EIO);
1375         }
1376 
1377         dev.sample_status[header->number] = (WF_SLOT_FILLED|WF_ST_MULTISAMPLE);
1378 
1379         return (0);
1380 }
1381 
1382 static int
1383 wavefront_fetch_multisample (wavefront_patch_info *header)
1384 {
1385         int i;
1386         unsigned char log_ns[1];
1387         unsigned char number[2];
1388         int num_samples;
1389 
1390         munge_int32 (header->number, number, 2);
1391     
1392         if (wavefront_cmd (WFC_UPLOAD_MULTISAMPLE, log_ns, number)) {
1393                 printk (KERN_ERR LOGNAME "upload multisample failed.\n");
1394                 return -(EIO);
1395         }
1396     
1397         DPRINT (WF_DEBUG_DATA, "msample %d has %d samples\n",
1398                                 header->number, log_ns[0]);
1399 
1400         header->hdr.ms.NumberOfSamples = log_ns[0];
1401 
1402         /* get the number of samples ... */
1403 
1404         num_samples = (1 << log_ns[0]);
1405     
1406         for (i = 0; i < num_samples; i++) {
1407                 s8 d[2];
1408         
1409                 if ((d[0] = wavefront_read ()) == -1) {
1410                         printk (KERN_ERR LOGNAME "upload multisample failed "
1411                                 "during sample loop.\n");
1412                         return -(EIO);
1413                 }
1414 
1415                 if ((d[1] = wavefront_read ()) == -1) {
1416                         printk (KERN_ERR LOGNAME "upload multisample failed "
1417                                 "during sample loop.\n");
1418                         return -(EIO);
1419                 }
1420         
1421                 header->hdr.ms.SampleNumber[i] =
1422                         demunge_int32 ((unsigned char *) d, 2);
1423         
1424                 DPRINT (WF_DEBUG_DATA, "msample sample[%d] = %d\n",
1425                                         i, header->hdr.ms.SampleNumber[i]);
1426         }
1427 
1428         return (0);
1429 }
1430 
1431 
1432 static int
1433 wavefront_send_drum (wavefront_patch_info *header)
1434 
1435 {
1436         unsigned char drumbuf[WF_DRUM_BYTES];
1437         wavefront_drum *drum = &header->hdr.d;
1438         int i;
1439 
1440         DPRINT (WF_DEBUG_LOAD_PATCH, "downloading edrum for MIDI "
1441                 "note %d, patch = %d\n", 
1442                 header->number, drum->PatchNumber);
1443 
1444         drumbuf[0] = header->number & 0x7f;
1445 
1446         for (i = 0; i < 4; i++) {
1447                 munge_int32 (((unsigned char *)drum)[i], &drumbuf[1+(i*2)], 2);
1448         }
1449 
1450         if (wavefront_cmd (WFC_DOWNLOAD_EDRUM_PROGRAM, NULL, drumbuf)) {
1451                 printk (KERN_ERR LOGNAME "download drum failed.\n");
1452                 return -(EIO);
1453         }
1454 
1455         return (0);
1456 }
1457 
1458 static int 
1459 wavefront_find_free_sample (void)
1460 
1461 {
1462         int i;
1463 
1464         for (i = 0; i < WF_MAX_SAMPLE; i++) {
1465                 if (!(dev.sample_status[i] & WF_SLOT_FILLED)) {
1466                         return i;
1467                 }
1468         }
1469         printk (KERN_WARNING LOGNAME "no free sample slots!\n");
1470         return -1;
1471 }
1472 
1473 static int 
1474 wavefront_find_free_patch (void)
1475 
1476 {
1477         int i;
1478 
1479         for (i = 0; i < WF_MAX_PATCH; i++) {
1480                 if (!(dev.patch_status[i] & WF_SLOT_FILLED)) {
1481                         return i;
1482                 }
1483         }
1484         printk (KERN_WARNING LOGNAME "no free patch slots!\n");
1485         return -1;
1486 }
1487 
1488 static int 
1489 log2_2048(int n)
1490 
1491 {
1492         int tbl[]={0, 0, 2048, 3246, 4096, 4755, 5294, 5749, 6143,
1493                    6492, 6803, 7084, 7342, 7578, 7797, 8001, 8192,
1494                    8371, 8540, 8699, 8851, 8995, 9132, 9264, 9390,
1495                    9510, 9626, 9738, 9845, 9949, 10049, 10146};
1496         int i;
1497 
1498         /* Returns 2048*log2(n) */
1499 
1500         /* FIXME: this is like doing integer math
1501            on quantum particles (RuN) */
1502 
1503         i=0;
1504         while(n>=32*256) {
1505                 n>>=8;
1506                 i+=2048*8;
1507         }
1508         while(n>=32) {
1509                 n>>=1;
1510                 i+=2048;
1511         }
1512         i+=tbl[n];
1513         return(i);
1514 }
1515 
1516 static int
1517 wavefront_load_gus_patch (int devno, int format, const char __user *addr,
1518                           int offs, int count, int pmgr_flag)
1519 {
1520         struct patch_info guspatch;
1521         wavefront_patch_info samp, pat, prog;
1522         wavefront_patch *patp;
1523         wavefront_sample *sampp;
1524         wavefront_program *progp;
1525 
1526         int i,base_note;
1527         long sizeof_patch;
1528 
1529         /* Copy in the header of the GUS patch */
1530 
1531         sizeof_patch = (long) &guspatch.data[0] - (long) &guspatch; 
1532         if (copy_from_user(&((char *) &guspatch)[offs],
1533                            &(addr)[offs], sizeof_patch - offs))
1534                 return -EFAULT;
1535 
1536         if ((i = wavefront_find_free_patch ()) == -1) {
1537                 return -EBUSY;
1538         }
1539         pat.number = i;
1540         pat.subkey = WF_ST_PATCH;
1541         patp = &pat.hdr.p;
1542 
1543         if ((i = wavefront_find_free_sample ()) == -1) {
1544                 return -EBUSY;
1545         }
1546         samp.number = i;
1547         samp.subkey = WF_ST_SAMPLE;
1548         samp.size = guspatch.len;
1549         sampp = &samp.hdr.s;
1550 
1551         prog.number = guspatch.instr_no;
1552         progp = &prog.hdr.pr;
1553 
1554         /* Setup the patch structure */
1555 
1556         patp->amplitude_bias=guspatch.volume;
1557         patp->portamento=0;
1558         patp->sample_number= samp.number & 0xff;
1559         patp->sample_msb= samp.number>>8;
1560         patp->pitch_bend= /*12*/ 0;
1561         patp->mono=1;
1562         patp->retrigger=1;
1563         patp->nohold=(guspatch.mode & WAVE_SUSTAIN_ON) ? 0:1;
1564         patp->frequency_bias=0;
1565         patp->restart=0;
1566         patp->reuse=0;
1567         patp->reset_lfo=1;
1568         patp->fm_src2=0;
1569         patp->fm_src1=WF_MOD_MOD_WHEEL;
1570         patp->am_src=WF_MOD_PRESSURE;
1571         patp->am_amount=127;
1572         patp->fc1_mod_amount=0;
1573         patp->fc2_mod_amount=0; 
1574         patp->fm_amount1=0;
1575         patp->fm_amount2=0;
1576         patp->envelope1.attack_level=127;
1577         patp->envelope1.decay1_level=127;
1578         patp->envelope1.decay2_level=127;
1579         patp->envelope1.sustain_level=127;
1580         patp->envelope1.release_level=0;
1581         patp->envelope2.attack_velocity=127;
1582         patp->envelope2.attack_level=127;
1583         patp->envelope2.decay1_level=127;
1584         patp->envelope2.decay2_level=127;
1585         patp->envelope2.sustain_level=127;
1586         patp->envelope2.release_level=0;
1587         patp->envelope2.attack_velocity=127;
1588         patp->randomizer=0;
1589 
1590         /* Program for this patch */
1591 
1592         progp->layer[0].patch_number= pat.number; /* XXX is this right ? */
1593         progp->layer[0].mute=1;
1594         progp->layer[0].pan_or_mod=1;
1595         progp->layer[0].pan=7;
1596         progp->layer[0].mix_level=127  /* guspatch.volume */;
1597         progp->layer[0].split_type=0;
1598         progp->layer[0].split_point=0;
1599         progp->layer[0].play_below=0;
1600 
1601         for (i = 1; i < 4; i++) {
1602                 progp->layer[i].mute=0;
1603         }
1604 
1605         /* Sample data */
1606 
1607         sampp->SampleResolution=((~guspatch.mode & WAVE_16_BITS)<<1);
1608 
1609         for (base_note=0;
1610              note_to_freq (base_note) < guspatch.base_note;
1611              base_note++);
1612 
1613         if ((guspatch.base_note-note_to_freq(base_note))
1614             >(note_to_freq(base_note)-guspatch.base_note))
1615                 base_note++;
1616 
1617         printk(KERN_DEBUG "ref freq=%d,base note=%d\n",
1618                guspatch.base_freq,
1619                base_note);
1620 
1621         sampp->FrequencyBias = (29550 - log2_2048(guspatch.base_freq)
1622                                 + base_note*171);
1623         printk(KERN_DEBUG "Freq Bias is %d\n", sampp->FrequencyBias);
1624         sampp->Loop=(guspatch.mode & WAVE_LOOPING) ? 1:0;
1625         sampp->sampleStartOffset.Fraction=0;
1626         sampp->sampleStartOffset.Integer=0;
1627         sampp->loopStartOffset.Fraction=0;
1628         sampp->loopStartOffset.Integer=guspatch.loop_start
1629                 >>((guspatch.mode&WAVE_16_BITS) ? 1:0);
1630         sampp->loopEndOffset.Fraction=0;
1631         sampp->loopEndOffset.Integer=guspatch.loop_end
1632                 >>((guspatch.mode&WAVE_16_BITS) ? 1:0);
1633         sampp->sampleEndOffset.Fraction=0;
1634         sampp->sampleEndOffset.Integer=guspatch.len >> (guspatch.mode&1);
1635         sampp->Bidirectional=(guspatch.mode&WAVE_BIDIR_LOOP) ? 1:0;
1636         sampp->Reverse=(guspatch.mode&WAVE_LOOP_BACK) ? 1:0;
1637 
1638         /* Now ship it down */
1639 
1640         wavefront_send_sample (&samp, 
1641                                (unsigned short __user *) &(addr)[sizeof_patch],
1642                                (guspatch.mode & WAVE_UNSIGNED) ? 1:0);
1643         wavefront_send_patch (&pat);
1644         wavefront_send_program (&prog);
1645 
1646         /* Now pan as best we can ... use the slave/internal MIDI device
1647            number if it exists (since it talks to the WaveFront), or the
1648            master otherwise.
1649         */
1650 
1651         if (dev.mididev > 0) {
1652                 midi_synth_controller (dev.mididev, guspatch.instr_no, 10,
1653                                        ((guspatch.panning << 4) > 127) ?
1654                                        127 : (guspatch.panning << 4));
1655         }
1656 
1657         return(0);
1658 }
1659 
1660 static int
1661 wavefront_load_patch (const char __user *addr)
1662 
1663 
1664 {
1665         wavefront_patch_info header;
1666         
1667         if (copy_from_user (&header, addr, sizeof(wavefront_patch_info) -
1668                             sizeof(wavefront_any))) {
1669                 printk (KERN_WARNING LOGNAME "bad address for load patch.\n");
1670                 return -EFAULT;
1671         }
1672 
1673         DPRINT (WF_DEBUG_LOAD_PATCH, "download "
1674                                       "Sample type: %d "
1675                                       "Sample number: %d "
1676                                       "Sample size: %d\n",
1677                                       header.subkey,
1678                                       header.number,
1679                                       header.size);
1680 
1681         switch (header.subkey) {
1682         case WF_ST_SAMPLE:  /* sample or sample_header, based on patch->size */
1683 
1684                 if (copy_from_user((unsigned char *) &header.hdr.s,
1685                                    (unsigned char __user *) header.hdrptr,
1686                                    sizeof (wavefront_sample)))
1687                         return -EFAULT;
1688 
1689                 return wavefront_send_sample (&header, header.dataptr, 0);
1690 
1691         case WF_ST_MULTISAMPLE:
1692 
1693                 if (copy_from_user(&header.hdr.s, header.hdrptr,
1694                                    sizeof(wavefront_multisample)))
1695                         return -EFAULT;
1696 
1697                 return wavefront_send_multisample (&header);
1698 
1699 
1700         case WF_ST_ALIAS:
1701 
1702                 if (copy_from_user(&header.hdr.a, header.hdrptr,
1703                                    sizeof (wavefront_alias)))
1704                         return -EFAULT;
1705 
1706                 return wavefront_send_alias (&header);
1707 
1708         case WF_ST_DRUM:
1709                 if (copy_from_user(&header.hdr.d, header.hdrptr,
1710                                    sizeof (wavefront_drum)))
1711                         return -EFAULT;
1712 
1713                 return wavefront_send_drum (&header);
1714 
1715         case WF_ST_PATCH:
1716                 if (copy_from_user(&header.hdr.p, header.hdrptr,
1717                                    sizeof (wavefront_patch)))
1718                         return -EFAULT;
1719 
1720                 return wavefront_send_patch (&header);
1721 
1722         case WF_ST_PROGRAM:
1723                 if (copy_from_user(&header.hdr.pr, header.hdrptr,
1724                                    sizeof (wavefront_program)))
1725                         return -EFAULT;
1726 
1727                 return wavefront_send_program (&header);
1728 
1729         default:
1730                 printk (KERN_ERR LOGNAME "unknown patch type %d.\n",
1731                         header.subkey);
1732                 return -(EINVAL);
1733         }
1734 
1735         return 0;
1736 }
1737 
1738 /***********************************************************************
1739 WaveFront: /dev/sequencer{,2} and other hardware-dependent interfaces
1740 ***********************************************************************/
1741 
1742 static void
1743 process_sample_hdr (UCHAR8 *buf)
1744 
1745 {
1746         wavefront_sample s;
1747         UCHAR8 *ptr;
1748 
1749         ptr = buf;
1750 
1751         /* The board doesn't send us an exact copy of a "wavefront_sample"
1752            in response to an Upload Sample Header command. Instead, we 
1753            have to convert the data format back into our data structure,
1754            just as in the Download Sample command, where we have to do
1755            something very similar in the reverse direction.
1756         */
1757 
1758         *((UINT32 *) &s.sampleStartOffset) = demunge_int32 (ptr, 4); ptr += 4;
1759         *((UINT32 *) &s.loopStartOffset) = demunge_int32 (ptr, 4); ptr += 4;
1760         *((UINT32 *) &s.loopEndOffset) = demunge_int32 (ptr, 4); ptr += 4;
1761         *((UINT32 *) &s.sampleEndOffset) = demunge_int32 (ptr, 4); ptr += 4;
1762         *((UINT32 *) &s.FrequencyBias) = demunge_int32 (ptr, 3); ptr += 3;
1763 
1764         s.SampleResolution = *ptr & 0x3;
1765         s.Loop = *ptr & 0x8;
1766         s.Bidirectional = *ptr & 0x10;
1767         s.Reverse = *ptr & 0x40;
1768 
1769         /* Now copy it back to where it came from */
1770 
1771         memcpy (buf, (unsigned char *) &s, sizeof (wavefront_sample));
1772 }
1773 
1774 static int
1775 wavefront_synth_control (int cmd, wavefront_control *wc)
1776 
1777 {
1778         unsigned char patchnumbuf[2];
1779         int i;
1780 
1781         DPRINT (WF_DEBUG_CMD, "synth control with "
1782                 "cmd 0x%x\n", wc->cmd);
1783 
1784         /* Pre-handling of or for various commands */
1785 
1786         switch (wc->cmd) {
1787         case WFC_DISABLE_INTERRUPTS:
1788                 printk (KERN_INFO LOGNAME "interrupts disabled.\n");
1789                 outb (0x80|0x20, dev.control_port);
1790                 dev.interrupts_on = 0;
1791                 return 0;
1792 
1793         case WFC_ENABLE_INTERRUPTS:
1794                 printk (KERN_INFO LOGNAME "interrupts enabled.\n");
1795                 outb (0x80|0x40|0x20, dev.control_port);
1796                 dev.interrupts_on = 1;
1797                 return 0;
1798 
1799         case WFC_INTERRUPT_STATUS:
1800                 wc->rbuf[0] = dev.interrupts_on;
1801                 return 0;
1802 
1803         case WFC_ROMSAMPLES_RDONLY:
1804                 dev.rom_samples_rdonly = wc->wbuf[0];
1805                 wc->status = 0;
1806                 return 0;
1807 
1808         case WFC_IDENTIFY_SLOT_TYPE:
1809                 i = wc->wbuf[0] | (wc->wbuf[1] << 7);
1810                 if (i <0 || i >= WF_MAX_SAMPLE) {
1811                         printk (KERN_WARNING LOGNAME "invalid slot ID %d\n",
1812                                 i);
1813                         wc->status = EINVAL;
1814                         return 0;
1815                 }
1816                 wc->rbuf[0] = dev.sample_status[i];
1817                 wc->status = 0;
1818                 return 0;
1819 
1820         case WFC_DEBUG_DRIVER:
1821                 dev.debug = wc->wbuf[0];
1822                 printk (KERN_INFO LOGNAME "debug = 0x%x\n", dev.debug);
1823                 return 0;
1824 
1825         case WFC_FX_IOCTL:
1826                 wffx_ioctl ((wavefront_fx_info *) &wc->wbuf[0]);
1827                 return 0;
1828 
1829         case WFC_UPLOAD_PATCH:
1830                 munge_int32 (*((UINT32 *) wc->wbuf), patchnumbuf, 2);
1831                 memcpy (wc->wbuf, patchnumbuf, 2);
1832                 break;
1833 
1834         case WFC_UPLOAD_MULTISAMPLE:
1835                 /* multisamples have to be handled differently, and
1836                    cannot be dealt with properly by wavefront_cmd() alone.
1837                 */
1838                 wc->status = wavefront_fetch_multisample
1839                         ((wavefront_patch_info *) wc->rbuf);
1840                 return 0;
1841 
1842         case WFC_UPLOAD_SAMPLE_ALIAS:
1843                 printk (KERN_INFO LOGNAME "support for sample alias upload "
1844                         "being considered.\n");
1845                 wc->status = EINVAL;
1846                 return -EINVAL;
1847         }
1848 
1849         wc->status = wavefront_cmd (wc->cmd, wc->rbuf, wc->wbuf);
1850 
1851         /* Post-handling of certain commands.
1852 
1853            In particular, if the command was an upload, demunge the data
1854            so that the user-level doesn't have to think about it.
1855         */
1856 
1857         if (wc->status == 0) {
1858                 switch (wc->cmd) {
1859                         /* intercept any freemem requests so that we know
1860                            we are always current with the user-level view
1861                            of things.
1862                         */
1863 
1864                 case WFC_REPORT_FREE_MEMORY:
1865                         dev.freemem = demunge_int32 (wc->rbuf, 4);
1866                         break;
1867 
1868                 case WFC_UPLOAD_PATCH:
1869                         demunge_buf (wc->rbuf, wc->rbuf, WF_PATCH_BYTES);
1870                         break;
1871 
1872                 case WFC_UPLOAD_PROGRAM:
1873                         demunge_buf (wc->rbuf, wc->rbuf, WF_PROGRAM_BYTES);
1874                         break;
1875 
1876                 case WFC_UPLOAD_EDRUM_PROGRAM:
1877                         demunge_buf (wc->rbuf, wc->rbuf, WF_DRUM_BYTES - 1);
1878                         break;
1879 
1880                 case WFC_UPLOAD_SAMPLE_HEADER:
1881                         process_sample_hdr (wc->rbuf);
1882                         break;
1883 
1884                 case WFC_UPLOAD_SAMPLE_ALIAS:
1885                         printk (KERN_INFO LOGNAME "support for "
1886                                 "sample aliases still "
1887                                 "being considered.\n");
1888                         break;
1889 
1890                 case WFC_VMIDI_OFF:
1891                         if (virtual_midi_disable () < 0) {
1892                                 return -(EIO);
1893                         }
1894                         break;
1895 
1896                 case WFC_VMIDI_ON:
1897                         if (virtual_midi_enable () < 0) {
1898                                 return -(EIO);
1899                         }
1900                         break;
1901                 }
1902         }
1903 
1904         return 0;
1905 }
1906 
1907 
1908 /***********************************************************************/
1909 /* WaveFront: Linux file system interface (for access via raw synth)    */
1910 /***********************************************************************/
1911 
1912 static int 
1913 wavefront_open (struct inode *inode, struct file *file)
1914 {
1915         /* XXX fix me */
1916         dev.opened = file->f_flags;
1917         return 0;
1918 }
1919 
1920 static int
1921 wavefront_release(struct inode *inode, struct file *file)
1922 {
1923         lock_kernel();
1924         dev.opened = 0;
1925         dev.debug = 0;
1926         unlock_kernel();
1927         return 0;
1928 }
1929 
1930 static int
1931 wavefront_ioctl(struct inode *inode, struct file *file,
1932                 unsigned int cmd, unsigned long arg)
1933 {
1934         wavefront_control wc;
1935         int err;
1936 
1937         switch (cmd) {
1938 
1939         case WFCTL_WFCMD:
1940                 if (copy_from_user(&wc, (void __user *) arg, sizeof (wc)))
1941                         return -EFAULT;
1942                 
1943                 if ((err = wavefront_synth_control (cmd, &wc)) == 0) {
1944                         if (copy_to_user ((void __user *) arg, &wc, sizeof (wc)))
1945                                 return -EFAULT;
1946                 }
1947 
1948                 return err;
1949                 
1950         case WFCTL_LOAD_SPP:
1951                 return wavefront_load_patch ((const char __user *) arg);
1952                 
1953         default:
1954                 printk (KERN_WARNING LOGNAME "invalid ioctl %#x\n", cmd);
1955                 return -(EINVAL);
1956 
1957         }
1958         return 0;
1959 }
1960 
1961 static /*const*/ struct file_operations wavefront_fops = {
1962         .owner          = THIS_MODULE,
1963         .llseek         = no_llseek,
1964         .ioctl          = wavefront_ioctl,
1965         .open           = wavefront_open,
1966         .release        = wavefront_release,
1967 };
1968 
1969 
1970 /***********************************************************************/
1971 /* WaveFront: OSS installation and support interface                   */
1972 /***********************************************************************/
1973 
1974 #if OSS_SUPPORT_LEVEL & OSS_SUPPORT_SEQ
1975 
1976 static struct synth_info wavefront_info =
1977 {"Turtle Beach WaveFront", 0, SYNTH_TYPE_SAMPLE, SAMPLE_TYPE_WAVEFRONT,
1978  0, 32, 0, 0, SYNTH_CAP_INPUT};
1979 
1980 static int
1981 wavefront_oss_open (int devno, int mode)
1982 
1983 {
1984         dev.opened = mode;
1985         return 0;
1986 }
1987 
1988 static void
1989 wavefront_oss_close (int devno)
1990 
1991 {
1992         dev.opened = 0;
1993         dev.debug = 0;
1994         return;
1995 }
1996 
1997 static int
1998 wavefront_oss_ioctl (int devno, unsigned int cmd, void __user * arg)
1999 
2000 {
2001         wavefront_control wc;
2002         int err;
2003 
2004         switch (cmd) {
2005         case SNDCTL_SYNTH_INFO:
2006                 if(copy_to_user(arg, &wavefront_info, sizeof (wavefront_info)))
2007                         return -EFAULT;
2008                 return 0;
2009 
2010         case SNDCTL_SEQ_RESETSAMPLES:
2011 //              printk (KERN_WARNING LOGNAME "driver cannot reset samples.\n");
2012                 return 0; /* don't force an error */
2013 
2014         case SNDCTL_SEQ_PERCMODE:
2015                 return 0; /* don't force an error */
2016 
2017         case SNDCTL_SYNTH_MEMAVL:
2018                 if ((dev.freemem = wavefront_freemem ()) < 0) {
2019                         printk (KERN_ERR LOGNAME "cannot get memory size\n");
2020                         return -EIO;
2021                 } else {
2022                         return dev.freemem;
2023                 }
2024                 break;
2025 
2026         case SNDCTL_SYNTH_CONTROL:
2027                 if(copy_from_user (&wc, arg, sizeof (wc)))
2028                         err = -EFAULT;
2029                 else if ((err = wavefront_synth_control (cmd, &wc)) == 0) {
2030                         if(copy_to_user (arg, &wc, sizeof (wc)))
2031                                 err = -EFAULT;
2032                 }
2033 
2034                 return err;
2035 
2036         default:
2037                 return -(EINVAL);
2038         }
2039 }
2040 
2041 static int
2042 wavefront_oss_load_patch (int devno, int format, const char __user *addr,
2043                           int offs, int count, int pmgr_flag)
2044 {
2045 
2046         if (format == SYSEX_PATCH) {    /* Handled by midi_synth.c */
2047                 if (midi_load_patch == NULL) {
2048                         printk (KERN_ERR LOGNAME
2049                                 "SYSEX not loadable: "
2050                                 "no midi patch loader!\n");
2051                         return -(EINVAL);
2052                 }
2053 
2054                 return midi_load_patch (devno, format, addr,
2055                                         offs, count, pmgr_flag);
2056 
2057         } else if (format == GUS_PATCH) {
2058                 return wavefront_load_gus_patch (devno, format,
2059                                                  addr, offs, count, pmgr_flag);
2060 
2061         } else if (format != WAVEFRONT_PATCH) {
2062                 printk (KERN_ERR LOGNAME "unknown patch format %d\n", format);
2063                 return -(EINVAL);
2064         }
2065 
2066         if (count < sizeof (wavefront_patch_info)) {
2067                 printk (KERN_ERR LOGNAME "sample header too short\n");
2068                 return -(EINVAL);
2069         }
2070 
2071         /* "addr" points to a user-space wavefront_patch_info */
2072 
2073         return wavefront_load_patch (addr);
2074 }       
2075 
2076 static struct synth_operations wavefront_operations =
2077 {
2078         .owner          = THIS_MODULE,
2079         .id             = "WaveFront",
2080         .info           = &wavefront_info,
2081         .midi_dev       = 0,
2082         .synth_type     = SYNTH_TYPE_SAMPLE,
2083         .synth_subtype  = SAMPLE_TYPE_WAVEFRONT,
2084         .open           = wavefront_oss_open,
2085         .close          = wavefront_oss_close,
2086         .ioctl          = wavefront_oss_ioctl,
2087         .kill_note      = midi_synth_kill_note,
2088         .start_note     = midi_synth_start_note,
2089         .set_instr      = midi_synth_set_instr,
2090         .reset          = midi_synth_reset,
2091         .load_patch     = midi_synth_load_patch,
2092         .aftertouch     = midi_synth_aftertouch,
2093         .controller     = midi_synth_controller,
2094         .panning        = midi_synth_panning,
2095         .bender         = midi_synth_bender,
2096         .setup_voice    = midi_synth_setup_voice
2097 };
2098 #endif /* OSS_SUPPORT_SEQ */
2099 
2100 #if OSS_SUPPORT_LEVEL & OSS_SUPPORT_STATIC_INSTALL
2101 
2102 static void __init attach_wavefront (struct address_info *hw_config)
2103 {
2104     (void) install_wavefront ();
2105 }
2106 
2107 static int __init probe_wavefront (struct address_info *hw_config)
2108 {
2109     return !detect_wavefront (hw_config->irq, hw_config->io_base);
2110 }
2111 
2112 static void __exit unload_wavefront (struct address_info *hw_config) 
2113 {
2114     (void) uninstall_wavefront ();
2115 }
2116 
2117 #endif /* OSS_SUPPORT_STATIC_INSTALL */
2118 
2119 /***********************************************************************/
2120 /* WaveFront: Linux modular sound kernel installation interface        */
2121 /***********************************************************************/
2122 
2123 static irqreturn_t
2124 wavefrontintr(int irq, void *dev_id, struct pt_regs *dummy)
2125 {
2126         struct wf_config *hw = dev_id;
2127 
2128         /*
2129            Some comments on interrupts. I attempted a version of this
2130            driver that used interrupts throughout the code instead of
2131            doing busy and/or sleep-waiting. Alas, it appears that once
2132            the Motorola firmware is downloaded, the card *never*
2133            generates an RX interrupt. These are successfully generated
2134            during firmware loading, and after that wavefront_status()
2135            reports that an interrupt is pending on the card from time
2136            to time, but it never seems to be delivered to this
2137            driver. Note also that wavefront_status() continues to
2138            report that RX interrupts are enabled, suggesting that I
2139            didn't goof up and disable them by mistake.
2140 
2141            Thus, I stepped back to a prior version of
2142            wavefront_wait(), the only place where this really
2143            matters. Its sad, but I've looked through the code to check
2144            on things, and I really feel certain that the Motorola
2145            firmware prevents RX-ready interrupts.
2146         */
2147 
2148         if ((wavefront_status() & (STAT_INTR_READ|STAT_INTR_WRITE)) == 0) {
2149                 return IRQ_NONE;
2150         }
2151 
2152         hw->irq_ok = 1;
2153         hw->irq_cnt++;
2154         wake_up_interruptible (&hw->interrupt_sleeper);
2155         return IRQ_HANDLED;
2156 }
2157 
2158 /* STATUS REGISTER 
2159 
2160 0 Host Rx Interrupt Enable (1=Enabled)
2161 1 Host Rx Register Full (1=Full)
2162 2 Host Rx Interrupt Pending (1=Interrupt)
2163 3 Unused
2164 4 Host Tx Interrupt (1=Enabled)
2165 5 Host Tx Register empty (1=Empty)
2166 6 Host Tx Interrupt Pending (1=Interrupt)
2167 7 Unused
2168 */
2169 
2170 static int
2171 wavefront_interrupt_bits (int irq)
2172 
2173 {
2174         int bits;
2175 
2176         switch (irq) {
2177         case 9:
2178                 bits = 0x00;
2179                 break;
2180         case 5:
2181                 bits = 0x08;
2182                 break;
2183         case 12:
2184                 bits = 0x10;
2185                 break;
2186         case 15:
2187                 bits = 0x18;
2188                 break;
2189         
2190         default:
2191                 printk (KERN_WARNING LOGNAME "invalid IRQ %d\n", irq);
2192                 bits = -1;
2193         }
2194 
2195         return bits;
2196 }
2197 
2198 static void
2199 wavefront_should_cause_interrupt (int val, int port, int timeout)
2200 
2201 {
2202         unsigned long flags;
2203 
2204         /* this will not help on SMP - but at least it compiles */
2205         spin_lock_irqsave(&lock, flags);
2206         dev.irq_ok = 0;
2207         outb (val,port);
2208         interruptible_sleep_on_timeout (&dev.interrupt_sleeper, timeout);
2209         spin_unlock_irqrestore(&lock,flags);
2210 }
2211 
2212 static int __init wavefront_hw_reset (void)
2213 {
2214         int bits;
2215         int hwv[2];
2216         unsigned long irq_mask;
2217         short reported_irq;
2218 
2219         /* IRQ already checked in init_module() */
2220 
2221         bits = wavefront_interrupt_bits (dev.irq);
2222 
2223         printk (KERN_DEBUG LOGNAME "autodetecting WaveFront IRQ\n");
2224 
2225         irq_mask = probe_irq_on ();
2226 
2227         outb (0x0, dev.control_port); 
2228         outb (0x80 | 0x40 | bits, dev.data_port);       
2229         wavefront_should_cause_interrupt(0x80|0x40|0x10|0x1,
2230                                          dev.control_port,
2231                                          (reset_time*HZ)/100);
2232 
2233         reported_irq = probe_irq_off (irq_mask);
2234 
2235         if (reported_irq != dev.irq) {
2236                 if (reported_irq == 0) {
2237                         printk (KERN_ERR LOGNAME
2238                                 "No unassigned interrupts detected "
2239                                 "after h/w reset\n");
2240                 } else if (reported_irq < 0) {
2241                         printk (KERN_ERR LOGNAME
2242                                 "Multiple unassigned interrupts detected "
2243                                 "after h/w reset\n");
2244                 } else {
2245                         printk (KERN_ERR LOGNAME "autodetected IRQ %d not the "
2246                                 "value provided (%d)\n", reported_irq,
2247                                 dev.irq);
2248                 }
2249                 dev.irq = -1;
2250                 return 1;
2251         } else {
2252                 printk (KERN_INFO LOGNAME "autodetected IRQ at %d\n",
2253                         reported_irq);
2254         }
2255 
2256         if (request_irq (dev.irq, wavefrontintr,
2257                          SA_INTERRUPT|SA_SHIRQ,
2258                          "wavefront synth", &dev) < 0) {
2259                 printk (KERN_WARNING LOGNAME "IRQ %d not available!\n",
2260                         dev.irq);
2261                 return 1;
2262         }
2263 
2264         /* try reset of port */
2265       
2266         outb (0x0, dev.control_port); 
2267   
2268         /* At this point, the board is in reset, and the H/W initialization
2269            register is accessed at the same address as the data port.
2270      
2271            Bit 7 - Enable IRQ Driver    
2272            0 - Tri-state the Wave-Board drivers for the PC Bus IRQs
2273            1 - Enable IRQ selected by bits 5:3 to be driven onto the PC Bus.
2274      
2275            Bit 6 - MIDI Interface Select
2276 
2277            0 - Use the MIDI Input from the 26-pin WaveBlaster
2278            compatible header as the serial MIDI source
2279            1 - Use the MIDI Input from the 9-pin D connector as the
2280            serial MIDI source.
2281      
2282            Bits 5:3 - IRQ Selection
2283            0 0 0 - IRQ 2/9
2284            0 0 1 - IRQ 5
2285            0 1 0 - IRQ 12
2286            0 1 1 - IRQ 15
2287            1 0 0 - Reserved
2288            1 0 1 - Reserved
2289            1 1 0 - Reserved
2290            1 1 1 - Reserved
2291      
2292            Bits 2:1 - Reserved
2293            Bit 0 - Disable Boot ROM
2294            0 - memory accesses to 03FC30-03FFFFH utilize the internal Boot ROM
2295            1 - memory accesses to 03FC30-03FFFFH are directed to external 
2296            storage.
2297      
2298         */
2299 
2300         /* configure hardware: IRQ, enable interrupts, 
2301            plus external 9-pin MIDI interface selected
2302         */
2303 
2304         outb (0x80 | 0x40 | bits, dev.data_port);       
2305   
2306         /* CONTROL REGISTER
2307 
2308            0 Host Rx Interrupt Enable (1=Enabled)      0x1
2309            1 Unused                                    0x2
2310            2 Unused                                    0x4
2311            3 Unused                                    0x8
2312            4 Host Tx Interrupt Enable                 0x10
2313            5 Mute (0=Mute; 1=Play)                    0x20
2314            6 Master Interrupt Enable (1=Enabled)      0x40
2315            7 Master Reset (0=Reset; 1=Run)            0x80
2316 
2317            Take us out of reset, mute output, master + TX + RX interrupts on.
2318            
2319            We'll get an interrupt presumably to tell us that the TX
2320            register is clear.
2321         */
2322 
2323         wavefront_should_cause_interrupt(0x80|0x40|0x10|0x1,
2324                                          dev.control_port,
2325                                          (reset_time*HZ)/100);
2326 
2327         /* Note: data port is now the data port, not the h/w initialization
2328            port.
2329          */
2330 
2331         if (!dev.irq_ok) {
2332                 printk (KERN_WARNING LOGNAME
2333                         "intr not received after h/w un-reset.\n");
2334                 goto gone_bad;
2335         } 
2336 
2337         dev.interrupts_on = 1;
2338         
2339         /* Note: data port is now the data port, not the h/w initialization
2340            port.
2341 
2342            At this point, only "HW VERSION" or "DOWNLOAD OS" commands
2343            will work. So, issue one of them, and wait for TX
2344            interrupt. This can take a *long* time after a cold boot,
2345            while the ISC ROM does its RAM test. The SDK says up to 4
2346            seconds - with 12MB of RAM on a Tropez+, it takes a lot
2347            longer than that (~16secs). Note that the card understands
2348            the difference between a warm and a cold boot, so
2349            subsequent ISC2115 reboots (say, caused by module
2350            reloading) will get through this much faster.
2351 
2352            XXX Interesting question: why is no RX interrupt received first ?
2353         */
2354 
2355         wavefront_should_cause_interrupt(WFC_HARDWARE_VERSION, 
2356                                          dev.data_port, ramcheck_time*HZ);
2357 
2358         if (!dev.irq_ok) {
2359                 printk (KERN_WARNING LOGNAME
2360                         "post-RAM-check interrupt not received.\n");
2361                 goto gone_bad;
2362         } 
2363 
2364         if (!wavefront_wait (STAT_CAN_READ)) {
2365                 printk (KERN_WARNING LOGNAME
2366                         "no response to HW version cmd.\n");
2367                 goto gone_bad;
2368         }
2369         
2370         if ((hwv[0] = wavefront_read ()) == -1) {
2371                 printk (KERN_WARNING LOGNAME
2372                         "board not responding correctly.\n");
2373                 goto gone_bad;
2374         }
2375 
2376         if (hwv[0] == 0xFF) { /* NAK */
2377 
2378                 /* Board's RAM test failed. Try to read error code,
2379                    and tell us about it either way.
2380                 */
2381                 
2382                 if ((hwv[0] = wavefront_read ()) == -1) {
2383                         printk (KERN_WARNING LOGNAME "on-board RAM test failed "
2384                                 "(bad error code).\n");
2385                 } else {
2386                         printk (KERN_WARNING LOGNAME "on-board RAM test failed "
2387                                 "(error code: 0x%x).\n",
2388                                 hwv[0]);
2389                 }
2390                 goto gone_bad;
2391         }
2392 
2393         /* We're OK, just get the next byte of the HW version response */
2394 
2395         if ((hwv[1] = wavefront_read ()) == -1) {
2396                 printk (KERN_WARNING LOGNAME "incorrect h/w response.\n");
2397                 goto gone_bad;
2398         }
2399 
2400         printk (KERN_INFO LOGNAME "hardware version %d.%d\n",
2401                 hwv[0], hwv[1]);
2402 
2403         return 0;
2404 
2405 
2406      gone_bad:
2407         if (dev.irq >= 0) {
2408                 free_irq (dev.irq, &dev);
2409                 dev.irq = -1;
2410         }
2411         return (1);
2412 }
2413 
2414 static int __init detect_wavefront (int irq, int io_base)
2415 {
2416         unsigned char   rbuf[4], wbuf[4];
2417 
2418         /* TB docs say the device takes up 8 ports, but we know that
2419            if there is an FX device present (i.e. a Tropez+) it really
2420            consumes 16.
2421         */
2422 
2423         if (check_region (io_base, 16)) {
2424                 printk (KERN_ERR LOGNAME "IO address range 0x%x - 0x%x "
2425                         "already in use - ignored\n", dev.base,
2426                         dev.base+15);
2427                 return -1;
2428         }
2429   
2430         dev.irq = irq;
2431         dev.base = io_base;
2432         dev.israw = 0;
2433         dev.debug = debug_default;
2434         dev.interrupts_on = 0;
2435         dev.irq_cnt = 0;
2436         dev.rom_samples_rdonly = 1; /* XXX default lock on ROM sample slots */
2437 
2438         if (wavefront_cmd (WFC_FIRMWARE_VERSION, rbuf, wbuf) == 0) {
2439 
2440                 dev.fw_version[0] = rbuf[0];
2441                 dev.fw_version[1] = rbuf[1];
2442                 printk (KERN_INFO LOGNAME
2443                         "firmware %d.%d already loaded.\n",
2444                         rbuf[0], rbuf[1]);
2445 
2446                 /* check that a command actually works */
2447       
2448                 if (wavefront_cmd (WFC_HARDWARE_VERSION,
2449                                    rbuf, wbuf) == 0) {
2450                         dev.hw_version[0] = rbuf[0];
2451                         dev.hw_version[1] = rbuf[1];
2452                 } else {
2453                         printk (KERN_WARNING LOGNAME "not raw, but no "
2454                                 "hardware version!\n");
2455                         return 0;
2456                 }
2457 
2458                 if (!wf_raw) {
2459                         return 1;
2460                 } else {
2461                         printk (KERN_INFO LOGNAME
2462                                 "reloading firmware anyway.\n");
2463                         dev.israw = 1;
2464                 }
2465 
2466         } else {
2467 
2468                 dev.israw = 1;
2469                 printk (KERN_INFO LOGNAME
2470                         "no response to firmware probe, assume raw.\n");
2471 
2472         }
2473 
2474         init_waitqueue_head (&dev.interrupt_sleeper);
2475 
2476         if (wavefront_hw_reset ()) {
2477                 printk (KERN_WARNING LOGNAME "hardware reset failed\n");
2478                 return 0;
2479         }
2480 
2481         /* Check for FX device, present only on Tropez+ */
2482 
2483         dev.has_fx = (detect_wffx () == 0);
2484 
2485         return 1;
2486 }
2487 
2488 #include "os.h"
2489 #include <linux/fs.h>
2490 #include <linux/mm.h>
2491 #include <linux/slab.h>
2492 #include <asm/uaccess.h>
2493 
2494 
2495 static int
2496 wavefront_download_firmware (char *path)
2497 
2498 {
2499         unsigned char section[WF_SECTION_MAX];
2500         char section_length; /* yes, just a char; max value is WF_SECTION_MAX */
2501         int section_cnt_downloaded = 0;
2502         int fd;
2503         int c;
2504         int i;
2505         mm_segment_t fs;
2506 
2507         /* This tries to be a bit cleverer than the stuff Alan Cox did for
2508            the generic sound firmware, in that it actually knows
2509            something about the structure of the Motorola firmware. In
2510            particular, it uses a version that has been stripped of the
2511            20K of useless header information, and had section lengths
2512            added, making it possible to load the entire OS without any
2513            [kv]malloc() activity, since the longest entity we ever read is
2514            42 bytes (well, WF_SECTION_MAX) long.
2515         */
2516 
2517         fs = get_fs();
2518         set_fs (get_ds());
2519 
2520         if ((fd = sys_open (path, 0, 0)) < 0) {
2521                 printk (KERN_WARNING LOGNAME "Unable to load \"%s\".\n",
2522                         path);
2523                 return 1;
2524         }
2525 
2526         while (1) {
2527                 int x;
2528 
2529                 if ((x = sys_read (fd, &section_length, sizeof (section_length))) !=
2530                     sizeof (section_length)) {
2531                         printk (KERN_ERR LOGNAME "firmware read error.\n");
2532                         goto failure;
2533                 }
2534 
2535                 if (section_length == 0) {
2536                         break;
2537                 }
2538 
2539                 if (sys_read (fd, section, section_length) != section_length) {
2540                         printk (KERN_ERR LOGNAME "firmware section "
2541                                 "read error.\n");
2542                         goto failure;
2543                 }
2544 
2545                 /* Send command */
2546         
2547                 if (wavefront_write (WFC_DOWNLOAD_OS)) {
2548                         goto failure;
2549                 }
2550         
2551                 for (i = 0; i < section_length; i++) {
2552                         if (wavefront_write (section[i])) {
2553                                 goto failure;
2554                         }
2555                 }
2556         
2557                 /* get ACK */
2558         
2559                 if (wavefront_wait (STAT_CAN_READ)) {
2560 
2561                         if ((c = inb (dev.data_port)) != WF_ACK) {
2562 
2563                                 printk (KERN_ERR LOGNAME "download "
2564                                         "of section #%d not "
2565                                         "acknowledged, ack = 0x%x\n",
2566                                         section_cnt_downloaded + 1, c);
2567                                 goto failure;
2568                 
2569                         }
2570 
2571                 } else {
2572                         printk (KERN_ERR LOGNAME "time out for firmware ACK.\n");
2573                         goto failure;
2574                 }
2575 
2576         }
2577 
2578         sys_close (fd);
2579         set_fs (fs);
2580         return 0;
2581 
2582  failure:
2583         sys_close (fd);
2584         set_fs (fs);
2585         printk (KERN_ERR "\nWaveFront: firmware download failed!!!\n");
2586         return 1;
2587 }
2588 
2589 static int __init wavefront_config_midi (void)
2590 {
2591         unsigned char rbuf[4], wbuf[4];
2592     
2593         if (detect_wf_mpu (dev.irq, dev.base) < 0) {
2594                 printk (KERN_WARNING LOGNAME
2595                         "could not find working MIDI device\n");
2596                 return -1;
2597         } 
2598 
2599         if ((dev.mididev = install_wf_mpu ()) < 0) {
2600                 printk (KERN_WARNING LOGNAME
2601                         "MIDI interfaces not configured\n");
2602                 return -1;
2603         }
2604 
2605         /* Route external MIDI to WaveFront synth (by default) */
2606     
2607         if (wavefront_cmd (WFC_MISYNTH_ON, rbuf, wbuf)) {
2608                 printk (KERN_WARNING LOGNAME
2609                         "cannot enable MIDI-IN to synth routing.\n");
2610                 /* XXX error ? */
2611         }
2612 
2613 
2614 #if OSS_SUPPORT_LEVEL & OSS_SUPPORT_SEQ
2615         /* Get the regular MIDI patch loading function, so we can
2616            use it if we ever get handed a SYSEX patch. This is
2617            unlikely, because its so damn slow, but we may as well
2618            leave this functionality from maui.c behind, since it
2619            could be useful for sequencer applications that can
2620            only use MIDI to do patch loading.
2621         */
2622 
2623         if (midi_devs[dev.mididev]->converter != NULL) {
2624                 midi_load_patch = midi_devs[dev.mididev]->converter->load_patch;
2625                 midi_devs[dev.mididev]->converter->load_patch =
2626                     &wavefront_oss_load_patch;
2627         }
2628 
2629 #endif /* OSS_SUPPORT_SEQ */
2630         
2631         /* Turn on Virtual MIDI, but first *always* turn it off,
2632            since otherwise consectutive reloads of the driver will
2633            never cause the hardware to generate the initial "internal" or 
2634            "external" source bytes in the MIDI data stream. This
2635            is pretty important, since the internal hardware generally will
2636            be used to generate none or very little MIDI output, and
2637            thus the only source of MIDI data is actually external. Without
2638            the switch bytes, the driver will think it all comes from
2639            the internal interface. Duh.
2640         */
2641 
2642         if (wavefront_cmd (WFC_VMIDI_OFF, rbuf, wbuf)) { 
2643                 printk (KERN_WARNING LOGNAME
2644                         "virtual MIDI mode not disabled\n");
2645                 return 0; /* We're OK, but missing the external MIDI dev */
2646         }
2647 
2648         if ((dev.ext_mididev = virtual_midi_enable ()) < 0) {
2649                 printk (KERN_WARNING LOGNAME "no virtual MIDI access.\n");
2650         } else {
2651                 if (wavefront_cmd (WFC_VMIDI_ON, rbuf, wbuf)) {
2652                         printk (KERN_WARNING LOGNAME
2653                                 "cannot enable virtual MIDI mode.\n");
2654                         virtual_midi_disable ();
2655                 } 
2656         }
2657     
2658         return 0;
2659 }
2660 
2661 static int __init wavefront_do_reset (int atboot)
2662 {
2663         char voices[1];
2664 
2665         if (!atboot && wavefront_hw_reset ()) {
2666                 printk (KERN_WARNING LOGNAME "hw reset failed.\n");
2667                 goto gone_bad;
2668         }
2669 
2670         if (dev.israw) {
2671                 if (wavefront_download_firmware (ospath)) {
2672                         goto gone_bad;
2673                 }
2674 
2675                 dev.israw = 0;
2676 
2677                 /* Wait for the OS to get running. The protocol for
2678                    this is non-obvious, and was determined by
2679                    using port-IO tracing in DOSemu and some
2680                    experimentation here.
2681                    
2682                    Rather than using timed waits, use interrupts creatively.
2683                 */
2684 
2685                 wavefront_should_cause_interrupt (WFC_NOOP,
2686                                                   dev.data_port,
2687                                                   (osrun_time*HZ));
2688 
2689                 if (!dev.irq_ok) {
2690                         printk (KERN_WARNING LOGNAME
2691                                 "no post-OS interrupt.\n");
2692                         goto gone_bad;
2693                 }
2694                 
2695                 /* Now, do it again ! */
2696                 
2697                 wavefront_should_cause_interrupt (WFC_NOOP,
2698                                                   dev.data_port, (10*HZ));
2699                 
2700                 if (!dev.irq_ok) {
2701                         printk (KERN_WARNING LOGNAME
2702                                 "no post-OS interrupt(2).\n");
2703                         goto gone_bad;
2704                 }
2705 
2706                 /* OK, no (RX/TX) interrupts any more, but leave mute
2707                    in effect. 
2708                 */
2709                 
2710                 outb (0x80|0x40, dev.control_port); 
2711 
2712                 /* No need for the IRQ anymore */
2713                 
2714                 free_irq (dev.irq, &dev);
2715 
2716         }
2717 
2718         if (dev.has_fx && fx_raw) {
2719                 wffx_init ();
2720         }
2721 
2722         /* SETUPSND.EXE asks for sample memory config here, but since i
2723            have no idea how to interpret the result, we'll forget
2724            about it.
2725         */
2726         
2727         if ((dev.freemem = wavefront_freemem ()) < 0) {
2728                 goto gone_bad;
2729         }
2730                 
2731         printk (KERN_INFO LOGNAME "available DRAM %dk\n", dev.freemem / 1024);
2732 
2733         if (wavefront_write (0xf0) ||
2734             wavefront_write (1) ||
2735             (wavefront_read () < 0)) {
2736                 dev.debug = 0;
2737                 printk (KERN_WARNING LOGNAME "MPU emulation mode not set.\n");
2738                 goto gone_bad;
2739         }
2740 
2741         voices[0] = 32;
2742 
2743         if (wavefront_cmd (WFC_SET_NVOICES, NULL, voices)) {
2744                 printk (KERN_WARNING LOGNAME
2745                         "cannot set number of voices to 32.\n");
2746                 goto gone_bad;
2747         }
2748 
2749 
2750         return 0;
2751 
2752  gone_bad:
2753         /* reset that sucker so that it doesn't bother us. */
2754 
2755         outb (0x0, dev.control_port);
2756         dev.interrupts_on = 0;
2757         if (dev.irq >= 0) {
2758                 free_irq (dev.irq, &dev);
2759         }
2760         return 1;
2761 }
2762 
2763 static int __init wavefront_init (int atboot)
2764 {
2765         int samples_are_from_rom;
2766 
2767         if (dev.israw) {
2768                 samples_are_from_rom = 1;
2769         } else {
2770                 /* XXX is this always true ? */
2771                 samples_are_from_rom = 0;
2772         }
2773 
2774         if (dev.israw || fx_raw) {
2775                 if (wavefront_do_reset (atboot)) {
2776                         return -1;
2777                 }
2778         }
2779 
2780         wavefront_get_sample_status (samples_are_from_rom);
2781         wavefront_get_program_status ();
2782         wavefront_get_patch_status ();
2783 
2784         /* Start normal operation: unreset, master interrupt enabled, no mute
2785         */
2786 
2787         outb (0x80|0x40|0x20, dev.control_port); 
2788 
2789         return (0);
2790 }
2791 
2792 static int __init install_wavefront (void)
2793 
2794 {
2795         if ((dev.synth_dev = register_sound_synth (&wavefront_fops, -1)) < 0) {
2796                 printk (KERN_ERR LOGNAME "cannot register raw synth\n");
2797                 return -1;
2798         }
2799 
2800 #if OSS_SUPPORT_LEVEL & OSS_SUPPORT_SEQ
2801         if ((dev.oss_dev = sound_alloc_synthdev()) == -1) {
2802                 printk (KERN_ERR LOGNAME "Too many sequencers\n");
2803                 return -1;
2804         } else {
2805                 synth_devs[dev.oss_dev] = &wavefront_operations;
2806         }
2807 #endif /* OSS_SUPPORT_SEQ */
2808 
2809         if (wavefront_init (1) < 0) {
2810                 printk (KERN_WARNING LOGNAME "initialization failed.\n");
2811 
2812 #if OSS_SUPPORT_LEVEL & OSS_SUPPORT_SEQ
2813                 sound_unload_synthdev (dev.oss_dev);
2814 #endif /* OSS_SUPPORT_SEQ */ 
2815 
2816                 return -1;
2817         }
2818     
2819         request_region (dev.base+2, 6, "wavefront synth");
2820 
2821         if (dev.has_fx) {
2822                 request_region (dev.base+8, 8, "wavefront fx");
2823         }
2824 
2825         if (wavefront_config_midi ()) {
2826                 printk (KERN_WARNING LOGNAME "could not initialize MIDI.\n");
2827         }
2828 
2829         return dev.oss_dev;
2830 }
2831 
2832 static void __exit uninstall_wavefront (void)
2833 {
2834         /* the first two i/o addresses are freed by the wf_mpu code */
2835         release_region (dev.base+2, 6);
2836 
2837         if (dev.has_fx) {
2838                 release_region (dev.base+8, 8);
2839         }
2840 
2841         unregister_sound_synth (dev.synth_dev);
2842 
2843 #if OSS_SUPPORT_LEVEL & OSS_SUPPORT_SEQ
2844         sound_unload_synthdev (dev.oss_dev);
2845 #endif /* OSS_SUPPORT_SEQ */ 
2846         uninstall_wf_mpu ();
2847 }
2848 
2849 /***********************************************************************/
2850 /*   WaveFront FX control                                              */
2851 /***********************************************************************/
2852 
2853 #include "yss225.h"
2854 
2855 /* Control bits for the Load Control Register
2856  */
2857 
2858 #define FX_LSB_TRANSFER 0x01    /* transfer after DSP LSB byte written */
2859 #define FX_MSB_TRANSFER 0x02    /* transfer after DSP MSB byte written */
2860 #define FX_AUTO_INCR    0x04    /* auto-increment DSP address after transfer */
2861 
2862 static int
2863 wffx_idle (void) 
2864     
2865 {
2866         int i;
2867         unsigned int x = 0x80;
2868     
2869         for (i = 0; i < 1000; i++) {
2870                 x = inb (dev.fx_status);
2871                 if ((x & 0x80) == 0) {
2872                         break;
2873                 }
2874         }
2875     
2876         if (x & 0x80) {
2877                 printk (KERN_ERR LOGNAME "FX device never idle.\n");
2878                 return 0;
2879         }
2880     
2881         return (1);
2882 }
2883 
2884 int __init detect_wffx (void)
2885 {
2886         /* This is a crude check, but its the best one I have for now.
2887            Certainly on the Maui and the Tropez, wffx_idle() will
2888            report "never idle", which suggests that this test should
2889            work OK.
2890         */
2891 
2892         if (inb (dev.fx_status) & 0x80) {
2893                 printk (KERN_INFO LOGNAME "Hmm, probably a Maui or Tropez.\n");
2894                 return -1;
2895         }
2896 
2897         return 0;
2898 }       
2899 
2900 void
2901 wffx_mute (int onoff)
2902     
2903 {
2904         if (!wffx_idle()) {
2905                 return;
2906         }
2907     
2908         outb (onoff ? 0x02 : 0x00, dev.fx_op);
2909 }
2910 
2911 static int
2912 wffx_memset (int page,
2913              int addr, int cnt, unsigned short *data)
2914 {
2915         if (page < 0 || page > 7) {
2916                 printk (KERN_ERR LOGNAME "FX memset: "
2917                         "page must be >= 0 and <= 7\n");
2918                 return -(EINVAL);
2919         }
2920 
2921         if (addr < 0 || addr > 0x7f) {
2922                 printk (KERN_ERR LOGNAME "FX memset: "
2923                         "addr must be >= 0 and <= 7f\n");
2924                 return -(EINVAL);
2925         }
2926 
2927         if (cnt == 1) {
2928 
2929                 outb (FX_LSB_TRANSFER, dev.fx_lcr);
2930                 outb (page, dev.fx_dsp_page);
2931                 outb (addr, dev.fx_dsp_addr);
2932                 outb ((data[0] >> 8), dev.fx_dsp_msb);
2933                 outb ((data[0] & 0xff), dev.fx_dsp_lsb);
2934 
2935                 printk (KERN_INFO LOGNAME "FX: addr %d:%x set to 0x%x\n",
2936                         page, addr, data[0]);
2937         
2938         } else {
2939                 int i;
2940 
2941                 outb (FX_AUTO_INCR|FX_LSB_TRANSFER, dev.fx_lcr);
2942                 outb (page, dev.fx_dsp_page);
2943                 outb (addr, dev.fx_dsp_addr);
2944 
2945                 for (i = 0; i < cnt; i++) {
2946                         outb ((data[i] >> 8), dev.fx_dsp_msb);
2947                         outb ((data[i] & 0xff), dev.fx_dsp_lsb);
2948                         if (!wffx_idle ()) {
2949                                 break;
2950                         }
2951                 }
2952 
2953                 if (i != cnt) {
2954                         printk (KERN_WARNING LOGNAME
2955                                 "FX memset "
2956                                 "(0x%x, 0x%x, %p, %d) incomplete\n",
2957                                 page, addr, data, cnt);
2958                         return -(EIO);
2959                 }
2960         }
2961 
2962         return 0;
2963 }
2964 
2965 static int
2966 wffx_ioctl (wavefront_fx_info *r)
2967 
2968 {
2969         unsigned short page_data[256];
2970         unsigned short *pd;
2971 
2972         switch (r->request) {
2973         case WFFX_MUTE:
2974                 wffx_mute (r->data[0]);
2975                 return 0;
2976 
2977         case WFFX_MEMSET:
2978 
2979                 if (r->data[2] <= 0) {
2980                         printk (KERN_ERR LOGNAME "cannot write "
2981                                 "<= 0 bytes to FX\n");
2982                         return -(EINVAL);
2983                 } else if (r->data[2] == 1) {
2984                         pd = (unsigned short *) &r->data[3];
2985                 } else {
2986                         if (r->data[2] > sizeof (page_data)) {
2987                                 printk (KERN_ERR LOGNAME "cannot write "
2988                                         "> 255 bytes to FX\n");
2989                                 return -(EINVAL);
2990                         }
2991                         if (copy_from_user(page_data,
2992                                            (unsigned char __user *)r->data[3],
2993                                            r->data[2]))
2994                                 return -EFAULT;
2995                         pd = page_data;
2996                 }
2997 
2998                 return wffx_memset (r->data[0], /* page */
2999                                     r->data[1], /* addr */
3000                                     r->data[2], /* cnt */
3001                                     pd);
3002 
3003         default:
3004                 printk (KERN_WARNING LOGNAME
3005                         "FX: ioctl %d not yet supported\n",
3006                         r->request);
3007                 return -(EINVAL);
3008         }
3009 }
3010 
3011 /* YSS225 initialization.
3012 
3013    This code was developed using DOSEMU. The Turtle Beach SETUPSND
3014    utility was run with I/O tracing in DOSEMU enabled, and a reconstruction
3015    of the port I/O done, using the Yamaha faxback document as a guide
3016    to add more logic to the code. Its really pretty weird.
3017 
3018    There was an alternative approach of just dumping the whole I/O
3019    sequence as a series of port/value pairs and a simple loop
3020    that output it. However, I hope that eventually I'll get more
3021    control over what this code does, and so I tried to stick with
3022    a somewhat "algorithmic" approach.
3023 */
3024 
3025 static int __init wffx_init (void)
3026 {
3027         int i;
3028         int j;
3029 
3030         /* Set all bits for all channels on the MOD unit to zero */
3031         /* XXX But why do this twice ? */
3032 
3033         for (j = 0; j < 2; j++) {
3034                 for (i = 0x10; i <= 0xff; i++) {
3035             
3036                         if (!wffx_idle ()) {
3037                                 return (-1);
3038                         }
3039             
3040                         outb (i, dev.fx_mod_addr);
3041                         outb (0x0, dev.fx_mod_data);
3042                 }
3043         }
3044 
3045         if (!wffx_idle()) return (-1);
3046         outb (0x02, dev.fx_op);                        /* mute on */
3047 
3048         if (!wffx_idle()) return (-1);
3049         outb (0x07, dev.fx_dsp_page);
3050         outb (0x44, dev.fx_dsp_addr);
3051         outb (0x00, dev.fx_dsp_msb);
3052         outb (0x00, dev.fx_dsp_lsb);
3053         if (!wffx_idle()) return (-1);
3054         outb (0x07, dev.fx_dsp_page);
3055         outb (0x42, dev.fx_dsp_addr);
3056         outb (0x00, dev.fx_dsp_msb);
3057         outb (0x00, dev.fx_dsp_lsb);
3058         if (!wffx_idle()) return (-1);
3059         outb (0x07, dev.fx_dsp_page);
3060         outb (0x43, dev.fx_dsp_addr);
3061         outb (0x00, dev.fx_dsp_msb);
3062         outb (0x00, dev.fx_dsp_lsb);
3063         if (!wffx_idle()) return (-1);
3064         outb (0x07, dev.fx_dsp_page);
3065         outb (0x7c, dev.fx_dsp_addr);
3066         outb (0x00, dev.fx_dsp_msb);
3067         outb (0x00, dev.fx_dsp_lsb);
3068         if (!wffx_idle()) return (-1);
3069         outb (0x07, dev.fx_dsp_page);
3070         outb (0x7e, dev.fx_dsp_addr);
3071         outb (0x00, dev.fx_dsp_msb);
3072         outb (0x00, dev.fx_dsp_lsb);
3073         if (!wffx_idle()) return (-1);
3074         outb (0x07, dev.fx_dsp_page);
3075         outb (0x46, dev.fx_dsp_addr);
3076         outb (0x00, dev.fx_dsp_msb);
3077         outb (0x00, dev.fx_dsp_lsb);
3078         if (!wffx_idle()) return (-1);
3079         outb (0x07, dev.fx_dsp_page);
3080         outb (0x49, dev.fx_dsp_addr);
3081         outb (0x00, dev.fx_dsp_msb);
3082         outb (0x00, dev.fx_dsp_lsb);
3083         if (!wffx_idle()) return (-1);
3084         outb (0x07, dev.fx_dsp_page);
3085         outb (0x47, dev.fx_dsp_addr);
3086         outb (0x00, dev.fx_dsp_msb);
3087         outb (0x00, dev.fx_dsp_lsb);
3088         if (!wffx_idle()) return (-1);
3089         outb (0x07, dev.fx_dsp_page);
3090         outb (0x4a, dev.fx_dsp_addr);
3091         outb (0x00, dev.fx_dsp_msb);
3092         outb (0x00, dev.fx_dsp_lsb);
3093 
3094         /* either because of stupidity by TB's programmers, or because it
3095            actually does something, rezero the MOD page.
3096         */
3097         for (i = 0x10; i <= 0xff; i++) {
3098         
3099                 if (!wffx_idle ()) {
3100                         return (-1);
3101                 }
3102         
3103                 outb (i, dev.fx_mod_addr);
3104                 outb (0x0, dev.fx_mod_data);
3105         }
3106         /* load page zero */
3107 
3108         outb (FX_AUTO_INCR|FX_LSB_TRANSFER, dev.fx_lcr);
3109         outb (0x00, dev.fx_dsp_page);
3110         outb (0x00, dev.fx_dsp_addr);
3111 
3112         for (i = 0; i < sizeof (page_zero); i += 2) {
3113                 outb (page_zero[i], dev.fx_dsp_msb);
3114                 outb (page_zero[i+1], dev.fx_dsp_lsb);
3115                 if (!wffx_idle()) return (-1);
3116         }
3117 
3118         /* Now load page one */
3119 
3120         outb (FX_AUTO_INCR|FX_LSB_TRANSFER, dev.fx_lcr);
3121         outb (0x01, dev.fx_dsp_page);
3122         outb (0x00, dev.fx_dsp_addr);
3123 
3124         for (i = 0; i < sizeof (page_one); i += 2) {
3125                 outb (page_one[i], dev.fx_dsp_msb);
3126                 outb (page_one[i+1], dev.fx_dsp_lsb);
3127                 if (!wffx_idle()) return (-1);
3128         }
3129     
3130         outb (FX_AUTO_INCR|FX_LSB_TRANSFER, dev.fx_lcr);
3131         outb (0x02, dev.fx_dsp_page);
3132         outb (0x00, dev.fx_dsp_addr);
3133 
3134         for (i = 0; i < sizeof (page_two); i++) {
3135                 outb (page_two[i], dev.fx_dsp_lsb);
3136                 if (!wffx_idle()) return (-1);
3137         }
3138     
3139         outb (FX_AUTO_INCR|FX_LSB_TRANSFER, dev.fx_lcr);
3140         outb (0x03, dev.fx_dsp_page);
3141         outb (0x00, dev.fx_dsp_addr);
3142 
3143         for (i = 0; i < sizeof (page_three); i++) {
3144                 outb (page_three[i], dev.fx_dsp_lsb);
3145                 if (!wffx_idle()) return (-1);
3146         }
3147     
3148         outb (FX_AUTO_INCR|FX_LSB_TRANSFER, dev.fx_lcr);
3149         outb (0x04, dev.fx_dsp_page);
3150         outb (0x00, dev.fx_dsp_addr);
3151 
3152         for (i = 0; i < sizeof (page_four); i++) {
3153                 outb (page_four[i], dev.fx_dsp_lsb);
3154                 if (!wffx_idle()) return (-1);
3155         }
3156 
3157         /* Load memory area (page six) */
3158     
3159         outb (FX_LSB_TRANSFER, dev.fx_lcr); 
3160         outb (0x06, dev.fx_dsp_page); 
3161 
3162         for (i = 0; i < sizeof (page_six); i += 3) {
3163                 outb (page_six[i], dev.fx_dsp_addr);
3164                 outb (page_six[i+1], dev.fx_dsp_msb);
3165                 outb (page_six[i+2], dev.fx_dsp_lsb);
3166                 if (!wffx_idle()) return (-1);
3167         }
3168     
3169         outb (FX_AUTO_INCR|FX_LSB_TRANSFER, dev.fx_lcr);
3170         outb (0x07, dev.fx_dsp_page);
3171         outb (0x00, dev.fx_dsp_addr);
3172 
3173         for (i = 0; i < sizeof (page_seven); i += 2) {
3174                 outb (page_seven[i], dev.fx_dsp_msb);
3175                 outb (page_seven[i+1], dev.fx_dsp_lsb);
3176                 if (!wffx_idle()) return (-1);
3177         }
3178 
3179         /* Now setup the MOD area. We do this algorithmically in order to
3180            save a little data space. It could be done in the same fashion
3181            as the "pages".
3182         */
3183 
3184         for (i = 0x00; i <= 0x0f; i++) {
3185                 outb (0x01, dev.fx_mod_addr);
3186                 outb (i, dev.fx_mod_data);
3187                 if (!wffx_idle()) return (-1);
3188                 outb (0x02, dev.fx_mod_addr);
3189                 outb (0x00, dev.fx_mod_data);
3190                 if (!wffx_idle()) return (-1);
3191         }
3192 
3193         for (i = 0xb0; i <= 0xbf; i++) {
3194                 outb (i, dev.fx_mod_addr);
3195                 outb (0x20, dev.fx_mod_data);
3196                 if (!wffx_idle()) return (-1);
3197         }
3198 
3199         for (i = 0xf0; i <= 0xff; i++) {
3200                 outb (i, dev.fx_mod_addr);
3201                 outb (0x20, dev.fx_mod_data);
3202                 if (!wffx_idle()) return (-1);
3203         }
3204 
3205         for (i = 0x10; i <= 0x1d; i++) {
3206                 outb (i, dev.fx_mod_addr);
3207                 outb (0xff, dev.fx_mod_data);
3208                 if (!wffx_idle()) return (-1);
3209         }
3210 
3211         outb (0x1e, dev.fx_mod_addr);
3212         outb (0x40, dev.fx_mod_data);
3213         if (!wffx_idle()) return (-1);
3214 
3215         for (i = 0x1f; i <= 0x2d; i++) {
3216                 outb (i, dev.fx_mod_addr);
3217                 outb (0xff, dev.fx_mod_data);
3218                 if (!wffx_idle()) return (-1);
3219         }
3220 
3221         outb (0x2e, dev.fx_mod_addr);
3222         outb (0x00, dev.fx_mod_data);
3223         if (!wffx_idle()) return (-1);
3224 
3225         for (i = 0x2f; i <= 0x3e; i++) {
3226                 outb (i, dev.fx_mod_addr);
3227                 outb (0x00, dev.fx_mod_data);
3228                 if (!wffx_idle()) return (-1);
3229         }
3230 
3231         outb (0x3f, dev.fx_mod_addr);
3232         outb (0x20, dev.fx_mod_data);
3233         if (!wffx_idle()) return (-1);
3234 
3235         for (i = 0x40; i <= 0x4d; i++) {
3236                 outb (i, dev.fx_mod_addr);
3237                 outb (0x00, dev.fx_mod_data);
3238                 if (!wffx_idle()) return (-1);
3239         }
3240 
3241         outb (0x4e, dev.fx_mod_addr);
3242         outb (0x0e, dev.fx_mod_data);
3243         if (!wffx_idle()) return (-1);
3244         outb (0x4f, dev.fx_mod_addr);
3245         outb (0x0e, dev.fx_mod_data);
3246         if (!wffx_idle()) return (-1);
3247 
3248 
3249         for (i = 0x50; i <= 0x6b; i++) {
3250                 outb (i, dev.fx_mod_addr);
3251                 outb (0x00, dev.fx_mod_data);
3252                 if (!wffx_idle()) return (-1);
3253         }
3254 
3255         outb (0x6c, dev.fx_mod_addr);
3256         outb (0x40, dev.fx_mod_data);
3257         if (!wffx_idle()) return (-1);
3258 
3259         outb (0x6d, dev.fx_mod_addr);
3260         outb (0x00, dev.fx_mod_data);
3261         if (!wffx_idle()) return (-1);
3262 
3263         outb (0x6e, dev.fx_mod_addr);
3264         outb (0x40, dev.fx_mod_data);
3265         if (!wffx_idle()) return (-1);
3266 
3267         outb (0x6f, dev.fx_mod_addr);
3268         outb (0x40, dev.fx_mod_data);
3269         if (!wffx_idle()) return (-1);
3270 
3271         for (i = 0x70; i <= 0x7f; i++) {
3272                 outb (i, dev.fx_mod_addr);
3273                 outb (0xc0, dev.fx_mod_data);
3274                 if (!wffx_idle()) return (-1);
3275         }
3276     
3277         for (i = 0x80; i <= 0xaf; i++) {
3278                 outb (i, dev.fx_mod_addr);
3279                 outb (0x00, dev.fx_mod_data);
3280                 if (!wffx_idle()) return (-1);
3281         }
3282 
3283         for (i = 0xc0; i <= 0xdd; i++) {
3284                 outb (i, dev.fx_mod_addr);
3285                 outb (0x00, dev.fx_mod_data);
3286                 if (!wffx_idle()) return (-1);
3287         }
3288 
3289         outb (0xde, dev.fx_mod_addr);
3290         outb (0x10, dev.fx_mod_data);
3291         if (!wffx_idle()) return (-1);
3292         outb (0xdf, dev.fx_mod_addr);
3293         outb (0x10, dev.fx_mod_data);
3294         if (!wffx_idle()) return (-1);
3295 
3296         for (i = 0xe0; i <= 0xef; i++) {
3297                 outb (i, dev.fx_mod_addr);
3298                 outb (0x00, dev.fx_mod_data);
3299                 if (!wffx_idle()) return (-1);
3300         }
3301 
3302         for (i = 0x00; i <= 0x0f; i++) {
3303                 outb (0x01, dev.fx_mod_addr);
3304                 outb (i, dev.fx_mod_data);
3305                 outb (0x02, dev.fx_mod_addr);
3306                 outb (0x01, dev.fx_mod_data);
3307                 if (!wffx_idle()) return (-1);
3308         }
3309 
3310         outb (0x02, dev.fx_op); /* mute on */
3311 
3312         /* Now set the coefficients and so forth for the programs above */
3313 
3314         for (i = 0; i < sizeof (coefficients); i += 4) {
3315                 outb (coefficients[i], dev.fx_dsp_page);
3316                 outb (coefficients[i+1], dev.fx_dsp_addr);
3317                 outb (coefficients[i+2], dev.fx_dsp_msb);
3318                 outb (coefficients[i+3], dev.fx_dsp_lsb);
3319                 if (!wffx_idle()) return (-1);
3320         }
3321 
3322         /* Some settings (?) that are too small to bundle into loops */
3323 
3324         if (!wffx_idle()) return (-1);
3325         outb (0x1e, dev.fx_mod_addr);
3326         outb (0x14, dev.fx_mod_data);
3327         if (!wffx_idle()) return (-1);
3328         outb (0xde, dev.fx_mod_addr);
3329         outb (0x20, dev.fx_mod_data);
3330         if (!wffx_idle()) return (-1);
3331         outb (0xdf, dev.fx_mod_addr);
3332         outb (0x20, dev.fx_mod_data);
3333     
3334         /* some more coefficients */
3335 
3336         if (!wffx_idle()) return (-1);
3337         outb (0x06, dev.fx_dsp_page);
3338         outb (0x78, dev.fx_dsp_addr);
3339         outb (0x00, dev.fx_dsp_msb);
3340         outb (0x40, dev.fx_dsp_lsb);
3341         if (!wffx_idle()) return (-1);
3342         outb (0x07, dev.fx_dsp_page);
3343         outb (0x03, dev.fx_dsp_addr);
3344         outb (0x0f, dev.fx_dsp_msb);
3345         outb (0xff, dev.fx_dsp_lsb);
3346         if (!wffx_idle()) return (-1);
3347         outb (0x07, dev.fx_dsp_page);
3348         outb (0x0b, dev.fx_dsp_addr);
3349         outb (0x0f, dev.fx_dsp_msb);
3350         outb (0xff, dev.fx_dsp_lsb);
3351         if (!wffx_idle()) return (-1);
3352         outb (0x07, dev.fx_dsp_page);
3353         outb (0x02, dev.fx_dsp_addr);
3354         outb (0x00, dev.fx_dsp_msb);
3355         outb (0x00, dev.fx_dsp_lsb);
3356         if (!wffx_idle()) return (-1);
3357         outb (0x07, dev.fx_dsp_page);
3358         outb (0x0a, dev.fx_dsp_addr);
3359         outb (0x00, dev.fx_dsp_msb);
3360         outb (0x00, dev.fx_dsp_lsb);
3361         if (!wffx_idle()) return (-1);
3362         outb (0x07, dev.fx_dsp_page);
3363         outb (0x46, dev.fx_dsp_addr);
3364         outb (0x00, dev.fx_dsp_msb);
3365         outb (0x00, dev.fx_dsp_lsb);
3366         if (!wffx_idle()) return (-1);
3367         outb (0x07, dev.fx_dsp_page);
3368         outb (0x49, dev.fx_dsp_addr);
3369         outb (0x00, dev.fx_dsp_msb);
3370         outb (0x00, dev.fx_dsp_lsb);
3371     
3372         /* Now, for some strange reason, lets reload every page
3373            and all the coefficients over again. I have *NO* idea
3374            why this is done. I do know that no sound is produced
3375            is this phase is omitted.
3376         */
3377 
3378         outb (FX_AUTO_INCR|FX_LSB_TRANSFER, dev.fx_lcr);
3379         outb (0x00, dev.fx_dsp_page);  
3380         outb (0x10, dev.fx_dsp_addr);
3381 
3382         for (i = 0; i < sizeof (page_zero_v2); i += 2) {
3383                 outb (page_zero_v2[i], dev.fx_dsp_msb);
3384                 outb (page_zero_v2[i+1], dev.fx_dsp_lsb);
3385                 if (!wffx_idle()) return (-1);
3386         }
3387     
3388         outb (FX_AUTO_INCR|FX_LSB_TRANSFER, dev.fx_lcr);
3389         outb (0x01, dev.fx_dsp_page);
3390         outb (0x10, dev.fx_dsp_addr);
3391 
3392         for (i = 0; i < sizeof (page_one_v2); i += 2) {
3393                 outb (page_one_v2[i], dev.fx_dsp_msb);
3394                 outb (page_one_v2[i+1], dev.fx_dsp_lsb);
3395                 if (!wffx_idle()) return (-1);
3396         }
3397     
3398         if (!wffx_idle()) return (-1);
3399         if (!wffx_idle()) return (-1);
3400     
3401         outb (FX_AUTO_INCR|FX_LSB_TRANSFER, dev.fx_lcr);
3402         outb (0x02, dev.fx_dsp_page);
3403         outb (0x10, dev.fx_dsp_addr);
3404 
3405         for (i = 0; i < sizeof (page_two_v2); i++) {
3406                 outb (page_two_v2[i], dev.fx_dsp_lsb);
3407                 if (!wffx_idle()) return (-1);
3408         }
3409         outb (FX_AUTO_INCR|FX_LSB_TRANSFER, dev.fx_lcr);
3410         outb (0x03, dev.fx_dsp_page);
3411         outb (0x10, dev.fx_dsp_addr);
3412 
3413         for (i = 0; i < sizeof (page_three_v2); i++) {
3414                 outb (page_three_v2[i], dev.fx_dsp_lsb);
3415                 if (!wffx_idle()) return (-1);
3416         }
3417     
3418         outb (FX_AUTO_INCR|FX_LSB_TRANSFER, dev.fx_lcr);
3419         outb (0x04, dev.fx_dsp_page);
3420         outb (0x10, dev.fx_dsp_addr);
3421 
3422         for (i = 0; i < sizeof (page_four_v2); i++) {
3423                 outb (page_four_v2[i], dev.fx_dsp_lsb);
3424                 if (!wffx_idle()) return (-1);
3425         }
3426     
3427         outb (FX_LSB_TRANSFER, dev.fx_lcr);
3428         outb (0x06, dev.fx_dsp_page);
3429 
3430         /* Page six v.2 is algorithmic */
3431     
3432         for (i = 0x10; i <= 0x3e; i += 2) {
3433                 outb (i, dev.fx_dsp_addr);
3434                 outb (0x00, dev.fx_dsp_msb);
3435                 outb (0x00, dev.fx_dsp_lsb);
3436                 if (!wffx_idle()) return (-1);
3437         }
3438 
3439         outb (FX_AUTO_INCR|FX_LSB_TRANSFER, dev.fx_lcr);
3440         outb (0x07, dev.fx_dsp_page);
3441         outb (0x10, dev.fx_dsp_addr);
3442 
3443         for (i = 0; i < sizeof (page_seven_v2); i += 2) {
3444                 outb (page_seven_v2[i], dev.fx_dsp_msb);
3445                 outb (page_seven_v2[i+1], dev.fx_dsp_lsb);
3446                 if (!wffx_idle()) return (-1);
3447         }
3448 
3449         for (i = 0x00; i < sizeof(mod_v2); i += 2) {
3450                 outb (mod_v2[i], dev.fx_mod_addr);
3451                 outb (mod_v2[i+1], dev.fx_mod_data);
3452                 if (!wffx_idle()) return (-1);
3453         }
3454 
3455         for (i = 0; i < sizeof (coefficients2); i += 4) {
3456                 outb (coefficients2[i], dev.fx_dsp_page);
3457                 outb (coefficients2[i+1], dev.fx_dsp_addr);
3458                 outb (coefficients2[i+2], dev.fx_dsp_msb);
3459                 outb (coefficients2[i+3], dev.fx_dsp_lsb);
3460                 if (!wffx_idle()) return (-1);
3461         }
3462 
3463         for (i = 0; i < sizeof (coefficients3); i += 2) {
3464                 int x;
3465 
3466                 outb (0x07, dev.fx_dsp_page);
3467                 x = (i % 4) ? 0x4e : 0x4c;
3468                 outb (x, dev.fx_dsp_addr);
3469                 outb (coefficients3[i], dev.fx_dsp_msb);
3470                 outb (coefficients3[i+1], dev.fx_dsp_lsb);
3471         }
3472 
3473         outb (0x00, dev.fx_op); /* mute off */
3474         if (!wffx_idle()) return (-1);
3475 
3476         return (0);
3477 }
3478 
3479 static int io = -1;
3480 static int irq = -1;
3481 
3482 MODULE_AUTHOR      ("Paul Barton-Davis <pbd@op.net>");
3483 MODULE_DESCRIPTION ("Turtle Beach WaveFront Linux Driver");
3484 MODULE_LICENSE("GPL");
3485 module_param       (io, int, 0);
3486 module_param       (irq, int, 0);
3487 
3488 static int __init init_wavfront (void)
3489 {
3490         printk ("Turtle Beach WaveFront Driver\n"
3491                 "Copyright (C) by Hannu Solvainen, "
3492                 "Paul Barton-Davis 1993-1998.\n");
3493 
3494         /* XXX t'would be lovely to ask the CS4232 for these values, eh ? */
3495 
3496         if (io == -1 || irq == -1) {
3497                 printk (KERN_INFO LOGNAME "irq and io options must be set.\n");
3498                 return -EINVAL;
3499         }
3500 
3501         if (wavefront_interrupt_bits (irq) < 0) {
3502                 printk (KERN_INFO LOGNAME
3503                         "IRQ must be 9, 5, 12 or 15 (not %d)\n", irq);
3504                 return -ENODEV;
3505         }
3506 
3507         if (detect_wavefront (irq, io) < 0) {
3508                 return -ENODEV;
3509         } 
3510 
3511         if (install_wavefront () < 0) {
3512                 return -EIO;
3513         }
3514 
3515         return 0;
3516 }
3517 
3518 static void __exit cleanup_wavfront (void)
3519 {
3520         uninstall_wavefront ();
3521 }
3522 
3523 module_init(init_wavfront);
3524 module_exit(cleanup_wavfront);
3525 
  This page was automatically generated by the LXR engine.