upload tizen1.0 source
[kernel/linux-2.6.36.git] / sound / isa / wavefront / wavefront_synth.c
1 /* Copyright (C) by Paul Barton-Davis 1998-1999
2  *
3  * Some portions of this file are taken from work that is
4  * copyright (C) by Hannu Savolainen 1993-1996
5  *
6  * This program is distributed under the GNU GENERAL PUBLIC LICENSE (GPL)
7  * Version 2 (June 1991). See the "COPYING" file distributed with this software
8  * for more info.  
9  */
10
11 /*  
12  * An ALSA lowlevel driver for Turtle Beach ICS2115 wavetable synth
13  *                                             (Maui, Tropez, Tropez Plus)
14  *
15  * This driver supports the onboard wavetable synthesizer (an ICS2115),
16  * including patch, sample and program loading and unloading, conversion
17  * of GUS patches during loading, and full user-level access to all
18  * WaveFront commands. It tries to provide semi-intelligent patch and
19  * sample management as well.
20  *
21  */
22
23 #include <asm/io.h>
24 #include <linux/interrupt.h>
25 #include <linux/init.h>
26 #include <linux/delay.h>
27 #include <linux/time.h>
28 #include <linux/wait.h>
29 #include <linux/firmware.h>
30 #include <linux/moduleparam.h>
31 #include <linux/slab.h>
32 #include <sound/core.h>
33 #include <sound/snd_wavefront.h>
34 #include <sound/initval.h>
35
36 static int wf_raw = 0; /* we normally check for "raw state" to firmware
37                           loading. if non-zero, then during driver loading, the
38                           state of the board is ignored, and we reset the
39                           board and load the firmware anyway.
40                        */
41                    
42 static int fx_raw = 1; /* if this is zero, we'll leave the FX processor in
43                           whatever state it is when the driver is loaded.
44                           The default is to download the microprogram and
45                           associated coefficients to set it up for "default"
46                           operation, whatever that means.
47                        */
48
49 static int debug_default = 0;  /* you can set this to control debugging
50                                   during driver loading. it takes any combination
51                                   of the WF_DEBUG_* flags defined in
52                                   wavefront.h
53                                */
54
55 /* XXX this needs to be made firmware and hardware version dependent */
56
57 #define DEFAULT_OSPATH  "wavefront.os"
58 static char *ospath = DEFAULT_OSPATH; /* the firmware file name */
59
60 static int wait_usecs = 150; /* This magic number seems to give pretty optimal
61                                 throughput based on my limited experimentation.
62                                 If you want to play around with it and find a better
63                                 value, be my guest. Remember, the idea is to
64                                 get a number that causes us to just busy wait
65                                 for as many WaveFront commands as possible, without
66                                 coming up with a number so large that we hog the
67                                 whole CPU.
68
69                                 Specifically, with this number, out of about 134,000
70                                 status waits, only about 250 result in a sleep.
71                             */
72
73 static int sleep_interval = 100;   /* HZ/sleep_interval seconds per sleep */
74 static int sleep_tries = 50;       /* number of times we'll try to sleep */
75
76 static int reset_time = 2;        /* hundreths of a second we wait after a HW
77                                      reset for the expected interrupt.
78                                   */
79
80 static int ramcheck_time = 20;    /* time in seconds to wait while ROM code
81                                      checks on-board RAM.
82                                   */
83
84 static int osrun_time = 10;       /* time in seconds we wait for the OS to
85                                      start running.
86                                   */
87 module_param(wf_raw, int, 0444);
88 MODULE_PARM_DESC(wf_raw, "if non-zero, assume that we need to boot the OS");
89 module_param(fx_raw, int, 0444);
90 MODULE_PARM_DESC(fx_raw, "if non-zero, assume that the FX process needs help");
91 module_param(debug_default, int, 0444);
92 MODULE_PARM_DESC(debug_default, "debug parameters for card initialization");
93 module_param(wait_usecs, int, 0444);
94 MODULE_PARM_DESC(wait_usecs, "how long to wait without sleeping, usecs");
95 module_param(sleep_interval, int, 0444);
96 MODULE_PARM_DESC(sleep_interval, "how long to sleep when waiting for reply");
97 module_param(sleep_tries, int, 0444);
98 MODULE_PARM_DESC(sleep_tries, "how many times to try sleeping during a wait");
99 module_param(ospath, charp, 0444);
100 MODULE_PARM_DESC(ospath, "pathname to processed ICS2115 OS firmware");
101 module_param(reset_time, int, 0444);
102 MODULE_PARM_DESC(reset_time, "how long to wait for a reset to take effect");
103 module_param(ramcheck_time, int, 0444);
104 MODULE_PARM_DESC(ramcheck_time, "how many seconds to wait for the RAM test");
105 module_param(osrun_time, int, 0444);
106 MODULE_PARM_DESC(osrun_time, "how many seconds to wait for the ICS2115 OS");
107
108 /* if WF_DEBUG not defined, no run-time debugging messages will
109    be available via the debug flag setting. Given the current
110    beta state of the driver, this will remain set until a future 
111    version.
112 */
113
114 #define WF_DEBUG 1
115
116 #ifdef WF_DEBUG
117
118 #define DPRINT(cond, ...) \
119        if ((dev->debug & (cond)) == (cond)) { \
120              snd_printk (__VA_ARGS__); \
121        }
122 #else
123 #define DPRINT(cond, args...)
124 #endif /* WF_DEBUG */
125
126 #define LOGNAME "WaveFront: "
127
128 /* bitmasks for WaveFront status port value */
129
130 #define STAT_RINTR_ENABLED      0x01
131 #define STAT_CAN_READ           0x02
132 #define STAT_INTR_READ          0x04
133 #define STAT_WINTR_ENABLED      0x10
134 #define STAT_CAN_WRITE          0x20
135 #define STAT_INTR_WRITE         0x40
136
137 static int wavefront_delete_sample (snd_wavefront_t *, int sampnum);
138 static int wavefront_find_free_sample (snd_wavefront_t *);
139
140 struct wavefront_command {
141         int cmd;
142         char *action;
143         unsigned int read_cnt;
144         unsigned int write_cnt;
145         int need_ack;
146 };
147
148 static struct {
149         int errno;
150         const char *errstr;
151 } wavefront_errors[] = {
152         { 0x01, "Bad sample number" },
153         { 0x02, "Out of sample memory" },
154         { 0x03, "Bad patch number" },
155         { 0x04, "Error in number of voices" },
156         { 0x06, "Sample load already in progress" },
157         { 0x0B, "No sample load request pending" },
158         { 0x0E, "Bad MIDI channel number" },
159         { 0x10, "Download Record Error" },
160         { 0x80, "Success" },
161         { 0x0 }
162 };
163
164 #define NEEDS_ACK 1
165
166 static struct wavefront_command wavefront_commands[] = {
167         { WFC_SET_SYNTHVOL, "set synthesizer volume", 0, 1, NEEDS_ACK },
168         { WFC_GET_SYNTHVOL, "get synthesizer volume", 1, 0, 0},
169         { WFC_SET_NVOICES, "set number of voices", 0, 1, NEEDS_ACK },
170         { WFC_GET_NVOICES, "get number of voices", 1, 0, 0 },
171         { WFC_SET_TUNING, "set synthesizer tuning", 0, 2, NEEDS_ACK },
172         { WFC_GET_TUNING, "get synthesizer tuning", 2, 0, 0 },
173         { WFC_DISABLE_CHANNEL, "disable synth channel", 0, 1, NEEDS_ACK },
174         { WFC_ENABLE_CHANNEL, "enable synth channel", 0, 1, NEEDS_ACK },
175         { WFC_GET_CHANNEL_STATUS, "get synth channel status", 3, 0, 0 },
176         { WFC_MISYNTH_OFF, "disable midi-in to synth", 0, 0, NEEDS_ACK },
177         { WFC_MISYNTH_ON, "enable midi-in to synth", 0, 0, NEEDS_ACK },
178         { WFC_VMIDI_ON, "enable virtual midi mode", 0, 0, NEEDS_ACK },
179         { WFC_VMIDI_OFF, "disable virtual midi mode", 0, 0, NEEDS_ACK },
180         { WFC_MIDI_STATUS, "report midi status", 1, 0, 0 },
181         { WFC_FIRMWARE_VERSION, "report firmware version", 2, 0, 0 },
182         { WFC_HARDWARE_VERSION, "report hardware version", 2, 0, 0 },
183         { WFC_GET_NSAMPLES, "report number of samples", 2, 0, 0 },
184         { WFC_INSTOUT_LEVELS, "report instantaneous output levels", 7, 0, 0 },
185         { WFC_PEAKOUT_LEVELS, "report peak output levels", 7, 0, 0 },
186         { WFC_DOWNLOAD_SAMPLE, "download sample",
187           0, WF_SAMPLE_BYTES, NEEDS_ACK },
188         { WFC_DOWNLOAD_BLOCK, "download block", 0, 0, NEEDS_ACK},
189         { WFC_DOWNLOAD_SAMPLE_HEADER, "download sample header",
190           0, WF_SAMPLE_HDR_BYTES, NEEDS_ACK },
191         { WFC_UPLOAD_SAMPLE_HEADER, "upload sample header", 13, 2, 0 },
192
193         /* This command requires a variable number of bytes to be written.
194            There is a hack in snd_wavefront_cmd() to support this. The actual
195            count is passed in as the read buffer ptr, cast appropriately.
196            Ugh.
197         */
198
199         { WFC_DOWNLOAD_MULTISAMPLE, "download multisample", 0, 0, NEEDS_ACK },
200
201         /* This one is a hack as well. We just read the first byte of the
202            response, don't fetch an ACK, and leave the rest to the 
203            calling function. Ugly, ugly, ugly.
204         */
205
206         { WFC_UPLOAD_MULTISAMPLE, "upload multisample", 2, 1, 0 },
207         { WFC_DOWNLOAD_SAMPLE_ALIAS, "download sample alias",
208           0, WF_ALIAS_BYTES, NEEDS_ACK },
209         { WFC_UPLOAD_SAMPLE_ALIAS, "upload sample alias", WF_ALIAS_BYTES, 2, 0},
210         { WFC_DELETE_SAMPLE, "delete sample", 0, 2, NEEDS_ACK },
211         { WFC_IDENTIFY_SAMPLE_TYPE, "identify sample type", 5, 2, 0 },
212         { WFC_UPLOAD_SAMPLE_PARAMS, "upload sample parameters" },
213         { WFC_REPORT_FREE_MEMORY, "report free memory", 4, 0, 0 },
214         { WFC_DOWNLOAD_PATCH, "download patch", 0, 134, NEEDS_ACK },
215         { WFC_UPLOAD_PATCH, "upload patch", 132, 2, 0 },
216         { WFC_DOWNLOAD_PROGRAM, "download program", 0, 33, NEEDS_ACK },
217         { WFC_UPLOAD_PROGRAM, "upload program", 32, 1, 0 },
218         { WFC_DOWNLOAD_EDRUM_PROGRAM, "download enhanced drum program", 0, 9,
219           NEEDS_ACK},
220         { WFC_UPLOAD_EDRUM_PROGRAM, "upload enhanced drum program", 8, 1, 0},
221         { WFC_SET_EDRUM_CHANNEL, "set enhanced drum program channel",
222           0, 1, NEEDS_ACK },
223         { WFC_DISABLE_DRUM_PROGRAM, "disable drum program", 0, 1, NEEDS_ACK },
224         { WFC_REPORT_CHANNEL_PROGRAMS, "report channel program numbers",
225           32, 0, 0 },
226         { WFC_NOOP, "the no-op command", 0, 0, NEEDS_ACK },
227         { 0x00 }
228 };
229
230 static const char *
231 wavefront_errorstr (int errnum)
232
233 {
234         int i;
235
236         for (i = 0; wavefront_errors[i].errstr; i++) {
237                 if (wavefront_errors[i].errno == errnum) {
238                         return wavefront_errors[i].errstr;
239                 }
240         }
241
242         return "Unknown WaveFront error";
243 }
244
245 static struct wavefront_command *
246 wavefront_get_command (int cmd) 
247
248 {
249         int i;
250
251         for (i = 0; wavefront_commands[i].cmd != 0; i++) {
252                 if (cmd == wavefront_commands[i].cmd) {
253                         return &wavefront_commands[i];
254                 }
255         }
256
257         return NULL;
258 }
259
260 static inline int
261 wavefront_status (snd_wavefront_t *dev) 
262
263 {
264         return inb (dev->status_port);
265 }
266
267 static int
268 wavefront_sleep (int limit)
269
270 {
271         schedule_timeout_interruptible(limit);
272
273         return signal_pending(current);
274 }
275
276 static int
277 wavefront_wait (snd_wavefront_t *dev, int mask)
278
279 {
280         int             i;
281
282         /* Spin for a short period of time, because >99% of all
283            requests to the WaveFront can be serviced inline like this.
284         */
285
286         for (i = 0; i < wait_usecs; i += 5) {
287                 if (wavefront_status (dev) & mask) {
288                         return 1;
289                 }
290                 udelay(5);
291         }
292
293         for (i = 0; i < sleep_tries; i++) {
294
295                 if (wavefront_status (dev) & mask) {
296                         return 1;
297                 }
298
299                 if (wavefront_sleep (HZ/sleep_interval)) {
300                         return (0);
301                 }
302         }
303
304         return (0);
305 }
306
307 static int
308 wavefront_read (snd_wavefront_t *dev)
309
310 {
311         if (wavefront_wait (dev, STAT_CAN_READ))
312                 return inb (dev->data_port);
313
314         DPRINT (WF_DEBUG_DATA, "read timeout.\n");
315
316         return -1;
317 }
318
319 static int
320 wavefront_write (snd_wavefront_t *dev, unsigned char data)
321
322 {
323         if (wavefront_wait (dev, STAT_CAN_WRITE)) {
324                 outb (data, dev->data_port);
325                 return 0;
326         }
327
328         DPRINT (WF_DEBUG_DATA, "write timeout.\n");
329
330         return -1;
331 }
332
333 int
334 snd_wavefront_cmd (snd_wavefront_t *dev, 
335                    int cmd, unsigned char *rbuf, unsigned char *wbuf)
336
337 {
338         int ack;
339         unsigned int i;
340         int c;
341         struct wavefront_command *wfcmd;
342
343         if ((wfcmd = wavefront_get_command (cmd)) == NULL) {
344                 snd_printk ("command 0x%x not supported.\n",
345                         cmd);
346                 return 1;
347         }
348
349         /* Hack to handle the one variable-size write command. See
350            wavefront_send_multisample() for the other half of this
351            gross and ugly strategy.
352         */
353
354         if (cmd == WFC_DOWNLOAD_MULTISAMPLE) {
355                 wfcmd->write_cnt = (unsigned long) rbuf;
356                 rbuf = NULL;
357         }
358
359         DPRINT (WF_DEBUG_CMD, "0x%x [%s] (%d,%d,%d)\n",
360                                cmd, wfcmd->action, wfcmd->read_cnt,
361                                wfcmd->write_cnt, wfcmd->need_ack);
362     
363         if (wavefront_write (dev, cmd)) { 
364                 DPRINT ((WF_DEBUG_IO|WF_DEBUG_CMD), "cannot request "
365                                                      "0x%x [%s].\n",
366                                                      cmd, wfcmd->action);
367                 return 1;
368         } 
369
370         if (wfcmd->write_cnt > 0) {
371                 DPRINT (WF_DEBUG_DATA, "writing %d bytes "
372                                         "for 0x%x\n",
373                                         wfcmd->write_cnt, cmd);
374
375                 for (i = 0; i < wfcmd->write_cnt; i++) {
376                         if (wavefront_write (dev, wbuf[i])) {
377                                 DPRINT (WF_DEBUG_IO, "bad write for byte "
378                                                       "%d of 0x%x [%s].\n",
379                                                       i, cmd, wfcmd->action);
380                                 return 1;
381                         }
382
383                         DPRINT (WF_DEBUG_DATA, "write[%d] = 0x%x\n",
384                                                 i, wbuf[i]);
385                 }
386         }
387
388         if (wfcmd->read_cnt > 0) {
389                 DPRINT (WF_DEBUG_DATA, "reading %d ints "
390                                         "for 0x%x\n",
391                                         wfcmd->read_cnt, cmd);
392
393                 for (i = 0; i < wfcmd->read_cnt; i++) {
394
395                         if ((c = wavefront_read (dev)) == -1) {
396                                 DPRINT (WF_DEBUG_IO, "bad read for byte "
397                                                       "%d of 0x%x [%s].\n",
398                                                       i, cmd, wfcmd->action);
399                                 return 1;
400                         }
401
402                         /* Now handle errors. Lots of special cases here */
403             
404                         if (c == 0xff) { 
405                                 if ((c = wavefront_read (dev)) == -1) {
406                                         DPRINT (WF_DEBUG_IO, "bad read for "
407                                                               "error byte at "
408                                                               "read byte %d "
409                                                               "of 0x%x [%s].\n",
410                                                               i, cmd,
411                                                               wfcmd->action);
412                                         return 1;
413                                 }
414
415                                 /* Can you believe this madness ? */
416
417                                 if (c == 1 &&
418                                     wfcmd->cmd == WFC_IDENTIFY_SAMPLE_TYPE) {
419                                         rbuf[0] = WF_ST_EMPTY;
420                                         return (0);
421
422                                 } else if (c == 3 &&
423                                            wfcmd->cmd == WFC_UPLOAD_PATCH) {
424
425                                         return 3;
426
427                                 } else if (c == 1 &&
428                                            wfcmd->cmd == WFC_UPLOAD_PROGRAM) {
429
430                                         return 1;
431
432                                 } else {
433
434                                         DPRINT (WF_DEBUG_IO, "error %d (%s) "
435                                                               "during "
436                                                               "read for byte "
437                                                               "%d of 0x%x "
438                                                               "[%s].\n",
439                                                               c,
440                                                               wavefront_errorstr (c),
441                                                               i, cmd,
442                                                               wfcmd->action);
443                                         return 1;
444
445                                 }
446                 
447                 } else {
448                                 rbuf[i] = c;
449                         }
450                         
451                         DPRINT (WF_DEBUG_DATA, "read[%d] = 0x%x\n",i, rbuf[i]);
452                 }
453         }
454         
455         if ((wfcmd->read_cnt == 0 && wfcmd->write_cnt == 0) || wfcmd->need_ack) {
456
457                 DPRINT (WF_DEBUG_CMD, "reading ACK for 0x%x\n", cmd);
458
459                 /* Some commands need an ACK, but return zero instead
460                    of the standard value.
461                 */
462             
463                 if ((ack = wavefront_read (dev)) == 0) {
464                         ack = WF_ACK;
465                 }
466         
467                 if (ack != WF_ACK) {
468                         if (ack == -1) {
469                                 DPRINT (WF_DEBUG_IO, "cannot read ack for "
470                                                       "0x%x [%s].\n",
471                                                       cmd, wfcmd->action);
472                                 return 1;
473                 
474                         } else {
475                                 int err = -1; /* something unknown */
476
477                                 if (ack == 0xff) { /* explicit error */
478                     
479                                         if ((err = wavefront_read (dev)) == -1) {
480                                                 DPRINT (WF_DEBUG_DATA,
481                                                         "cannot read err "
482                                                         "for 0x%x [%s].\n",
483                                                         cmd, wfcmd->action);
484                                         }
485                                 }
486                                 
487                                 DPRINT (WF_DEBUG_IO, "0x%x [%s] "
488                                         "failed (0x%x, 0x%x, %s)\n",
489                                         cmd, wfcmd->action, ack, err,
490                                         wavefront_errorstr (err));
491                                 
492                                 return -err;
493                         }
494                 }
495                 
496                 DPRINT (WF_DEBUG_DATA, "ack received "
497                                         "for 0x%x [%s]\n",
498                                         cmd, wfcmd->action);
499         } else {
500
501                 DPRINT (WF_DEBUG_CMD, "0x%x [%s] does not need "
502                                        "ACK (%d,%d,%d)\n",
503                                        cmd, wfcmd->action, wfcmd->read_cnt,
504                                        wfcmd->write_cnt, wfcmd->need_ack);
505         }
506
507         return 0;
508         
509 }
510 \f
511 /***********************************************************************
512 WaveFront data munging   
513
514 Things here are weird. All data written to the board cannot 
515 have its most significant bit set. Any data item with values 
516 potentially > 0x7F (127) must be split across multiple bytes.
517
518 Sometimes, we need to munge numeric values that are represented on
519 the x86 side as 8-32 bit values. Sometimes, we need to munge data
520 that is represented on the x86 side as an array of bytes. The most
521 efficient approach to handling both cases seems to be to use 2
522 different functions for munging and 2 for de-munging. This avoids
523 weird casting and worrying about bit-level offsets.
524
525 **********************************************************************/
526
527 static unsigned char *
528 munge_int32 (unsigned int src,
529              unsigned char *dst,
530              unsigned int dst_size)
531 {
532         unsigned int i;
533
534         for (i = 0; i < dst_size; i++) {
535                 *dst = src & 0x7F;  /* Mask high bit of LSB */
536                 src = src >> 7;     /* Rotate Right 7 bits  */
537                                     /* Note: we leave the upper bits in place */ 
538
539                 dst++;
540         };
541         return dst;
542 };
543
544 static int 
545 demunge_int32 (unsigned char* src, int src_size)
546
547 {
548         int i;
549         int outval = 0;
550         
551         for (i = src_size - 1; i >= 0; i--) {
552                 outval=(outval<<7)+src[i];
553         }
554
555         return outval;
556 };
557
558 static 
559 unsigned char *
560 munge_buf (unsigned char *src, unsigned char *dst, unsigned int dst_size)
561
562 {
563         unsigned int i;
564         unsigned int last = dst_size / 2;
565
566         for (i = 0; i < last; i++) {
567                 *dst++ = src[i] & 0x7f;
568                 *dst++ = src[i] >> 7;
569         }
570         return dst;
571 }
572
573 static 
574 unsigned char *
575 demunge_buf (unsigned char *src, unsigned char *dst, unsigned int src_bytes)
576
577 {
578         int i;
579         unsigned char *end = src + src_bytes;
580     
581         end = src + src_bytes;
582
583         /* NOTE: src and dst *CAN* point to the same address */
584
585         for (i = 0; src != end; i++) {
586                 dst[i] = *src++;
587                 dst[i] |= (*src++)<<7;
588         }
589
590         return dst;
591 }
592 \f
593 /***********************************************************************
594 WaveFront: sample, patch and program management.
595 ***********************************************************************/
596
597 static int
598 wavefront_delete_sample (snd_wavefront_t *dev, int sample_num)
599
600 {
601         unsigned char wbuf[2];
602         int x;
603
604         wbuf[0] = sample_num & 0x7f;
605         wbuf[1] = sample_num >> 7;
606
607         if ((x = snd_wavefront_cmd (dev, WFC_DELETE_SAMPLE, NULL, wbuf)) == 0) {
608                 dev->sample_status[sample_num] = WF_ST_EMPTY;
609         }
610
611         return x;
612 }
613
614 static int
615 wavefront_get_sample_status (snd_wavefront_t *dev, int assume_rom)
616
617 {
618         int i;
619         unsigned char rbuf[32], wbuf[32];
620         unsigned int    sc_real, sc_alias, sc_multi;
621
622         /* check sample status */
623     
624         if (snd_wavefront_cmd (dev, WFC_GET_NSAMPLES, rbuf, wbuf)) {
625                 snd_printk ("cannot request sample count.\n");
626                 return -1;
627         } 
628     
629         sc_real = sc_alias = sc_multi = dev->samples_used = 0;
630     
631         for (i = 0; i < WF_MAX_SAMPLE; i++) {
632         
633                 wbuf[0] = i & 0x7f;
634                 wbuf[1] = i >> 7;
635
636                 if (snd_wavefront_cmd (dev, WFC_IDENTIFY_SAMPLE_TYPE, rbuf, wbuf)) {
637                         snd_printk(KERN_WARNING "cannot identify sample "
638                                    "type of slot %d\n", i);
639                         dev->sample_status[i] = WF_ST_EMPTY;
640                         continue;
641                 }
642
643                 dev->sample_status[i] = (WF_SLOT_FILLED|rbuf[0]);
644
645                 if (assume_rom) {
646                         dev->sample_status[i] |= WF_SLOT_ROM;
647                 }
648
649                 switch (rbuf[0] & WF_ST_MASK) {
650                 case WF_ST_SAMPLE:
651                         sc_real++;
652                         break;
653                 case WF_ST_MULTISAMPLE:
654                         sc_multi++;
655                         break;
656                 case WF_ST_ALIAS:
657                         sc_alias++;
658                         break;
659                 case WF_ST_EMPTY:
660                         break;
661
662                 default:
663                         snd_printk ("unknown sample type for "
664                                     "slot %d (0x%x)\n", 
665                                     i, rbuf[0]);
666                 }
667
668                 if (rbuf[0] != WF_ST_EMPTY) {
669                         dev->samples_used++;
670                 } 
671         }
672
673         snd_printk ("%d samples used (%d real, %d aliases, %d multi), "
674                     "%d empty\n", dev->samples_used, sc_real, sc_alias, sc_multi,
675                     WF_MAX_SAMPLE - dev->samples_used);
676
677
678         return (0);
679
680 }
681
682 static int
683 wavefront_get_patch_status (snd_wavefront_t *dev)
684
685 {
686         unsigned char patchbuf[WF_PATCH_BYTES];
687         unsigned char patchnum[2];
688         wavefront_patch *p;
689         int i, x, cnt, cnt2;
690
691         for (i = 0; i < WF_MAX_PATCH; i++) {
692                 patchnum[0] = i & 0x7f;
693                 patchnum[1] = i >> 7;
694
695                 if ((x = snd_wavefront_cmd (dev, WFC_UPLOAD_PATCH, patchbuf,
696                                         patchnum)) == 0) {
697
698                         dev->patch_status[i] |= WF_SLOT_FILLED;
699                         p = (wavefront_patch *) patchbuf;
700                         dev->sample_status
701                                 [p->sample_number|(p->sample_msb<<7)] |=
702                                 WF_SLOT_USED;
703             
704                 } else if (x == 3) { /* Bad patch number */
705                         dev->patch_status[i] = 0;
706                 } else {
707                         snd_printk ("upload patch "
708                                     "error 0x%x\n", x);
709                         dev->patch_status[i] = 0;
710                         return 1;
711                 }
712         }
713
714         /* program status has already filled in slot_used bits */
715
716         for (i = 0, cnt = 0, cnt2 = 0; i < WF_MAX_PATCH; i++) {
717                 if (dev->patch_status[i] & WF_SLOT_FILLED) {
718                         cnt++;
719                 }
720                 if (dev->patch_status[i] & WF_SLOT_USED) {
721                         cnt2++;
722                 }
723         
724         }
725         snd_printk ("%d patch slots filled, %d in use\n", cnt, cnt2);
726
727         return (0);
728 }
729
730 static int
731 wavefront_get_program_status (snd_wavefront_t *dev)
732
733 {
734         unsigned char progbuf[WF_PROGRAM_BYTES];
735         wavefront_program prog;
736         unsigned char prognum;
737         int i, x, l, cnt;
738
739         for (i = 0; i < WF_MAX_PROGRAM; i++) {
740                 prognum = i;
741
742                 if ((x = snd_wavefront_cmd (dev, WFC_UPLOAD_PROGRAM, progbuf,
743                                         &prognum)) == 0) {
744
745                         dev->prog_status[i] |= WF_SLOT_USED;
746
747                         demunge_buf (progbuf, (unsigned char *) &prog,
748                                      WF_PROGRAM_BYTES);
749
750                         for (l = 0; l < WF_NUM_LAYERS; l++) {
751                                 if (prog.layer[l].mute) {
752                                         dev->patch_status
753                                                 [prog.layer[l].patch_number] |=
754                                                 WF_SLOT_USED;
755                                 }
756                         }
757                 } else if (x == 1) { /* Bad program number */
758                         dev->prog_status[i] = 0;
759                 } else {
760                         snd_printk ("upload program "
761                                     "error 0x%x\n", x);
762                         dev->prog_status[i] = 0;
763                 }
764         }
765
766         for (i = 0, cnt = 0; i < WF_MAX_PROGRAM; i++) {
767                 if (dev->prog_status[i]) {
768                         cnt++;
769                 }
770         }
771
772         snd_printk ("%d programs slots in use\n", cnt);
773
774         return (0);
775 }
776
777 static int
778 wavefront_send_patch (snd_wavefront_t *dev, wavefront_patch_info *header)
779
780 {
781         unsigned char buf[WF_PATCH_BYTES+2];
782         unsigned char *bptr;
783
784         DPRINT (WF_DEBUG_LOAD_PATCH, "downloading patch %d\n",
785                                       header->number);
786
787         dev->patch_status[header->number] |= WF_SLOT_FILLED;
788
789         bptr = buf;
790         bptr = munge_int32 (header->number, buf, 2);
791         munge_buf ((unsigned char *)&header->hdr.p, bptr, WF_PATCH_BYTES);
792     
793         if (snd_wavefront_cmd (dev, WFC_DOWNLOAD_PATCH, NULL, buf)) {
794                 snd_printk ("download patch failed\n");
795                 return -(EIO);
796         }
797
798         return (0);
799 }
800
801 static int
802 wavefront_send_program (snd_wavefront_t *dev, wavefront_patch_info *header)
803
804 {
805         unsigned char buf[WF_PROGRAM_BYTES+1];
806         int i;
807
808         DPRINT (WF_DEBUG_LOAD_PATCH, "downloading program %d\n",
809                 header->number);
810
811         dev->prog_status[header->number] = WF_SLOT_USED;
812
813         /* XXX need to zero existing SLOT_USED bit for program_status[i]
814            where `i' is the program that's being (potentially) overwritten.
815         */
816     
817         for (i = 0; i < WF_NUM_LAYERS; i++) {
818                 if (header->hdr.pr.layer[i].mute) {
819                         dev->patch_status[header->hdr.pr.layer[i].patch_number] |=
820                                 WF_SLOT_USED;
821
822                         /* XXX need to mark SLOT_USED for sample used by
823                            patch_number, but this means we have to load it. Ick.
824                         */
825                 }
826         }
827
828         buf[0] = header->number;
829         munge_buf ((unsigned char *)&header->hdr.pr, &buf[1], WF_PROGRAM_BYTES);
830     
831         if (snd_wavefront_cmd (dev, WFC_DOWNLOAD_PROGRAM, NULL, buf)) {
832                 snd_printk ("download patch failed\n"); 
833                 return -(EIO);
834         }
835
836         return (0);
837 }
838
839 static int
840 wavefront_freemem (snd_wavefront_t *dev)
841
842 {
843         char rbuf[8];
844
845         if (snd_wavefront_cmd (dev, WFC_REPORT_FREE_MEMORY, rbuf, NULL)) {
846                 snd_printk ("can't get memory stats.\n");
847                 return -1;
848         } else {
849                 return demunge_int32 (rbuf, 4);
850         }
851 }
852
853 static int
854 wavefront_send_sample (snd_wavefront_t *dev, 
855                        wavefront_patch_info *header,
856                        u16 __user *dataptr,
857                        int data_is_unsigned)
858
859 {
860         /* samples are downloaded via a 16-bit wide i/o port
861            (you could think of it as 2 adjacent 8-bit wide ports
862            but its less efficient that way). therefore, all
863            the blocksizes and so forth listed in the documentation,
864            and used conventionally to refer to sample sizes,
865            which are given in 8-bit units (bytes), need to be
866            divided by 2.
867         */
868
869         u16 sample_short = 0;
870         u32 length;
871         u16 __user *data_end = NULL;
872         unsigned int i;
873         const unsigned int max_blksize = 4096/2;
874         unsigned int written;
875         unsigned int blocksize;
876         int dma_ack;
877         int blocknum;
878         unsigned char sample_hdr[WF_SAMPLE_HDR_BYTES];
879         unsigned char *shptr;
880         int skip = 0;
881         int initial_skip = 0;
882
883         DPRINT (WF_DEBUG_LOAD_PATCH, "sample %sdownload for slot %d, "
884                                       "type %d, %d bytes from 0x%lx\n",
885                                       header->size ? "" : "header ", 
886                                       header->number, header->subkey,
887                                       header->size,
888                                       (unsigned long) header->dataptr);
889
890         if (header->number == WAVEFRONT_FIND_FREE_SAMPLE_SLOT) {
891                 int x;
892
893                 if ((x = wavefront_find_free_sample (dev)) < 0) {
894                         return -ENOMEM;
895                 }
896                 snd_printk ("unspecified sample => %d\n", x);
897                 header->number = x;
898         }
899
900         if (header->size) {
901
902                 /* XXX it's a debatable point whether or not RDONLY semantics
903                    on the ROM samples should cover just the sample data or
904                    the sample header. For now, it only covers the sample data,
905                    so anyone is free at all times to rewrite sample headers.
906
907                    My reason for this is that we have the sample headers
908                    available in the WFB file for General MIDI, and so these
909                    can always be reset if needed. The sample data, however,
910                    cannot be recovered without a complete reset and firmware
911                    reload of the ICS2115, which is a very expensive operation.
912
913                    So, doing things this way allows us to honor the notion of
914                    "RESETSAMPLES" reasonably cheaply. Note however, that this
915                    is done purely at user level: there is no WFB parser in
916                    this driver, and so a complete reset (back to General MIDI,
917                    or theoretically some other configuration) is the
918                    responsibility of the user level library. 
919
920                    To try to do this in the kernel would be a little
921                    crazy: we'd need 158K of kernel space just to hold
922                    a copy of the patch/program/sample header data.
923                 */
924
925                 if (dev->rom_samples_rdonly) {
926                         if (dev->sample_status[header->number] & WF_SLOT_ROM) {
927                                 snd_printk ("sample slot %d "
928                                             "write protected\n",
929                                             header->number);
930                                 return -EACCES;
931                         }
932                 }
933
934                 wavefront_delete_sample (dev, header->number);
935         }
936
937         if (header->size) {
938                 dev->freemem = wavefront_freemem (dev);
939
940                 if (dev->freemem < (int)header->size) {
941                         snd_printk ("insufficient memory to "
942                                     "load %d byte sample.\n",
943                                     header->size);
944                         return -ENOMEM;
945                 }
946         
947         }
948
949         skip = WF_GET_CHANNEL(&header->hdr.s);
950
951         if (skip > 0 && header->hdr.s.SampleResolution != LINEAR_16BIT) {
952                 snd_printk ("channel selection only "
953                             "possible on 16-bit samples");
954                 return -(EINVAL);
955         }
956
957         switch (skip) {
958         case 0:
959                 initial_skip = 0;
960                 skip = 1;
961                 break;
962         case 1:
963                 initial_skip = 0;
964                 skip = 2;
965                 break;
966         case 2:
967                 initial_skip = 1;
968                 skip = 2;
969                 break;
970         case 3:
971                 initial_skip = 2;
972                 skip = 3;
973                 break;
974         case 4:
975                 initial_skip = 3;
976                 skip = 4;
977                 break;
978         case 5:
979                 initial_skip = 4;
980                 skip = 5;
981                 break;
982         case 6:
983                 initial_skip = 5;
984                 skip = 6;
985                 break;
986         }
987
988         DPRINT (WF_DEBUG_LOAD_PATCH, "channel selection: %d => "
989                                       "initial skip = %d, skip = %d\n",
990                                       WF_GET_CHANNEL (&header->hdr.s),
991                                       initial_skip, skip);
992     
993         /* Be safe, and zero the "Unused" bits ... */
994
995         WF_SET_CHANNEL(&header->hdr.s, 0);
996
997         /* adjust size for 16 bit samples by dividing by two.  We always
998            send 16 bits per write, even for 8 bit samples, so the length
999            is always half the size of the sample data in bytes.
1000         */
1001
1002         length = header->size / 2;
1003
1004         /* the data we're sent has not been munged, and in fact, the
1005            header we have to send isn't just a munged copy either.
1006            so, build the sample header right here.
1007         */
1008
1009         shptr = &sample_hdr[0];
1010
1011         shptr = munge_int32 (header->number, shptr, 2);
1012
1013         if (header->size) {
1014                 shptr = munge_int32 (length, shptr, 4);
1015         }
1016
1017         /* Yes, a 4 byte result doesn't contain all of the offset bits,
1018            but the offset only uses 24 bits.
1019         */
1020
1021         shptr = munge_int32 (*((u32 *) &header->hdr.s.sampleStartOffset),
1022                              shptr, 4);
1023         shptr = munge_int32 (*((u32 *) &header->hdr.s.loopStartOffset),
1024                              shptr, 4);
1025         shptr = munge_int32 (*((u32 *) &header->hdr.s.loopEndOffset),
1026                              shptr, 4);
1027         shptr = munge_int32 (*((u32 *) &header->hdr.s.sampleEndOffset),
1028                              shptr, 4);
1029         
1030         /* This one is truly weird. What kind of weirdo decided that in
1031            a system dominated by 16 and 32 bit integers, they would use
1032            a just 12 bits ?
1033         */
1034         
1035         shptr = munge_int32 (header->hdr.s.FrequencyBias, shptr, 3);
1036         
1037         /* Why is this nybblified, when the MSB is *always* zero ? 
1038            Anyway, we can't take address of bitfield, so make a
1039            good-faith guess at where it starts.
1040         */
1041         
1042         shptr = munge_int32 (*(&header->hdr.s.FrequencyBias+1),
1043                              shptr, 2);
1044
1045         if (snd_wavefront_cmd (dev, 
1046                            header->size ?
1047                            WFC_DOWNLOAD_SAMPLE : WFC_DOWNLOAD_SAMPLE_HEADER,
1048                            NULL, sample_hdr)) {
1049                 snd_printk ("sample %sdownload refused.\n",
1050                             header->size ? "" : "header ");
1051                 return -(EIO);
1052         }
1053
1054         if (header->size == 0) {
1055                 goto sent; /* Sorry. Just had to have one somewhere */
1056         }
1057     
1058         data_end = dataptr + length;
1059
1060         /* Do any initial skip over an unused channel's data */
1061
1062         dataptr += initial_skip;
1063     
1064         for (written = 0, blocknum = 0;
1065              written < length; written += max_blksize, blocknum++) {
1066         
1067                 if ((length - written) > max_blksize) {
1068                         blocksize = max_blksize;
1069                 } else {
1070                         /* round to nearest 16-byte value */
1071                         blocksize = ALIGN(length - written, 8);
1072                 }
1073
1074                 if (snd_wavefront_cmd (dev, WFC_DOWNLOAD_BLOCK, NULL, NULL)) {
1075                         snd_printk ("download block "
1076                                     "request refused.\n");
1077                         return -(EIO);
1078                 }
1079
1080                 for (i = 0; i < blocksize; i++) {
1081
1082                         if (dataptr < data_end) {
1083                 
1084                                 __get_user (sample_short, dataptr);
1085                                 dataptr += skip;
1086                 
1087                                 if (data_is_unsigned) { /* GUS ? */
1088
1089                                         if (WF_SAMPLE_IS_8BIT(&header->hdr.s)) {
1090                         
1091                                                 /* 8 bit sample
1092                                                  resolution, sign
1093                                                  extend both bytes.
1094                                                 */
1095                         
1096                                                 ((unsigned char*)
1097                                                  &sample_short)[0] += 0x7f;
1098                                                 ((unsigned char*)
1099                                                  &sample_short)[1] += 0x7f;
1100                         
1101                                         } else {
1102                         
1103                                                 /* 16 bit sample
1104                                                  resolution, sign
1105                                                  extend the MSB.
1106                                                 */
1107                         
1108                                                 sample_short += 0x7fff;
1109                                         }
1110                                 }
1111
1112                         } else {
1113
1114                                 /* In padding section of final block:
1115
1116                                    Don't fetch unsupplied data from
1117                                    user space, just continue with
1118                                    whatever the final value was.
1119                                 */
1120                         }
1121             
1122                         if (i < blocksize - 1) {
1123                                 outw (sample_short, dev->block_port);
1124                         } else {
1125                                 outw (sample_short, dev->last_block_port);
1126                         }
1127                 }
1128
1129                 /* Get "DMA page acknowledge", even though its really
1130                    nothing to do with DMA at all.
1131                 */
1132         
1133                 if ((dma_ack = wavefront_read (dev)) != WF_DMA_ACK) {
1134                         if (dma_ack == -1) {
1135                                 snd_printk ("upload sample "
1136                                             "DMA ack timeout\n");
1137                                 return -(EIO);
1138                         } else {
1139                                 snd_printk ("upload sample "
1140                                             "DMA ack error 0x%x\n",
1141                                             dma_ack);
1142                                 return -(EIO);
1143                         }
1144                 }
1145         }
1146
1147         dev->sample_status[header->number] = (WF_SLOT_FILLED|WF_ST_SAMPLE);
1148
1149         /* Note, label is here because sending the sample header shouldn't
1150            alter the sample_status info at all.
1151         */
1152
1153  sent:
1154         return (0);
1155 }
1156
1157 static int
1158 wavefront_send_alias (snd_wavefront_t *dev, wavefront_patch_info *header)
1159
1160 {
1161         unsigned char alias_hdr[WF_ALIAS_BYTES];
1162
1163         DPRINT (WF_DEBUG_LOAD_PATCH, "download alias, %d is "
1164                                       "alias for %d\n",
1165                                       header->number,
1166                                       header->hdr.a.OriginalSample);
1167     
1168         munge_int32 (header->number, &alias_hdr[0], 2);
1169         munge_int32 (header->hdr.a.OriginalSample, &alias_hdr[2], 2);
1170         munge_int32 (*((unsigned int *)&header->hdr.a.sampleStartOffset),
1171                      &alias_hdr[4], 4);
1172         munge_int32 (*((unsigned int *)&header->hdr.a.loopStartOffset),
1173                      &alias_hdr[8], 4);
1174         munge_int32 (*((unsigned int *)&header->hdr.a.loopEndOffset),
1175                      &alias_hdr[12], 4);
1176         munge_int32 (*((unsigned int *)&header->hdr.a.sampleEndOffset),
1177                      &alias_hdr[16], 4);
1178         munge_int32 (header->hdr.a.FrequencyBias, &alias_hdr[20], 3);
1179         munge_int32 (*(&header->hdr.a.FrequencyBias+1), &alias_hdr[23], 2);
1180
1181         if (snd_wavefront_cmd (dev, WFC_DOWNLOAD_SAMPLE_ALIAS, NULL, alias_hdr)) {
1182                 snd_printk ("download alias failed.\n");
1183                 return -(EIO);
1184         }
1185
1186         dev->sample_status[header->number] = (WF_SLOT_FILLED|WF_ST_ALIAS);
1187
1188         return (0);
1189 }
1190
1191 static int
1192 wavefront_send_multisample (snd_wavefront_t *dev, wavefront_patch_info *header)
1193 {
1194         int i;
1195         int num_samples;
1196         unsigned char *msample_hdr;
1197
1198         msample_hdr = kmalloc(sizeof(WF_MSAMPLE_BYTES), GFP_KERNEL);
1199         if (! msample_hdr)
1200                 return -ENOMEM;
1201
1202         munge_int32 (header->number, &msample_hdr[0], 2);
1203
1204         /* You'll recall at this point that the "number of samples" value
1205            in a wavefront_multisample struct is actually the log2 of the
1206            real number of samples.
1207         */
1208
1209         num_samples = (1<<(header->hdr.ms.NumberOfSamples&7));
1210         msample_hdr[2] = (unsigned char) header->hdr.ms.NumberOfSamples;
1211
1212         DPRINT (WF_DEBUG_LOAD_PATCH, "multi %d with %d=%d samples\n",
1213                                       header->number,
1214                                       header->hdr.ms.NumberOfSamples,
1215                                       num_samples);
1216
1217         for (i = 0; i < num_samples; i++) {
1218                 DPRINT(WF_DEBUG_LOAD_PATCH|WF_DEBUG_DATA, "sample[%d] = %d\n",
1219                        i, header->hdr.ms.SampleNumber[i]);
1220                 munge_int32 (header->hdr.ms.SampleNumber[i],
1221                      &msample_hdr[3+(i*2)], 2);
1222         }
1223     
1224         /* Need a hack here to pass in the number of bytes
1225            to be written to the synth. This is ugly, and perhaps
1226            one day, I'll fix it.
1227         */
1228
1229         if (snd_wavefront_cmd (dev, WFC_DOWNLOAD_MULTISAMPLE, 
1230                            (unsigned char *) (long) ((num_samples*2)+3),
1231                            msample_hdr)) {
1232                 snd_printk ("download of multisample failed.\n");
1233                 kfree(msample_hdr);
1234                 return -(EIO);
1235         }
1236
1237         dev->sample_status[header->number] = (WF_SLOT_FILLED|WF_ST_MULTISAMPLE);
1238
1239         kfree(msample_hdr);
1240         return (0);
1241 }
1242
1243 static int
1244 wavefront_fetch_multisample (snd_wavefront_t *dev, 
1245                              wavefront_patch_info *header)
1246 {
1247         int i;
1248         unsigned char log_ns[1];
1249         unsigned char number[2];
1250         int num_samples;
1251
1252         munge_int32 (header->number, number, 2);
1253     
1254         if (snd_wavefront_cmd (dev, WFC_UPLOAD_MULTISAMPLE, log_ns, number)) {
1255                 snd_printk ("upload multisample failed.\n");
1256                 return -(EIO);
1257         }
1258     
1259         DPRINT (WF_DEBUG_DATA, "msample %d has %d samples\n",
1260                                 header->number, log_ns[0]);
1261
1262         header->hdr.ms.NumberOfSamples = log_ns[0];
1263
1264         /* get the number of samples ... */
1265
1266         num_samples = (1 << log_ns[0]);
1267     
1268         for (i = 0; i < num_samples; i++) {
1269                 char d[2];
1270                 int val;
1271         
1272                 if ((val = wavefront_read (dev)) == -1) {
1273                         snd_printk ("upload multisample failed "
1274                                     "during sample loop.\n");
1275                         return -(EIO);
1276                 }
1277                 d[0] = val;
1278
1279                 if ((val = wavefront_read (dev)) == -1) {
1280                         snd_printk ("upload multisample failed "
1281                                     "during sample loop.\n");
1282                         return -(EIO);
1283                 }
1284                 d[1] = val;
1285         
1286                 header->hdr.ms.SampleNumber[i] =
1287                         demunge_int32 ((unsigned char *) d, 2);
1288         
1289                 DPRINT (WF_DEBUG_DATA, "msample sample[%d] = %d\n",
1290                                         i, header->hdr.ms.SampleNumber[i]);
1291         }
1292
1293         return (0);
1294 }
1295
1296
1297 static int
1298 wavefront_send_drum (snd_wavefront_t *dev, wavefront_patch_info *header)
1299
1300 {
1301         unsigned char drumbuf[WF_DRUM_BYTES];
1302         wavefront_drum *drum = &header->hdr.d;
1303         int i;
1304
1305         DPRINT (WF_DEBUG_LOAD_PATCH, "downloading edrum for MIDI "
1306                 "note %d, patch = %d\n", 
1307                 header->number, drum->PatchNumber);
1308
1309         drumbuf[0] = header->number & 0x7f;
1310
1311         for (i = 0; i < 4; i++) {
1312                 munge_int32 (((unsigned char *)drum)[i], &drumbuf[1+(i*2)], 2);
1313         }
1314
1315         if (snd_wavefront_cmd (dev, WFC_DOWNLOAD_EDRUM_PROGRAM, NULL, drumbuf)) {
1316                 snd_printk ("download drum failed.\n");
1317                 return -(EIO);
1318         }
1319
1320         return (0);
1321 }
1322
1323 static int 
1324 wavefront_find_free_sample (snd_wavefront_t *dev)
1325
1326 {
1327         int i;
1328
1329         for (i = 0; i < WF_MAX_SAMPLE; i++) {
1330                 if (!(dev->sample_status[i] & WF_SLOT_FILLED)) {
1331                         return i;
1332                 }
1333         }
1334         snd_printk ("no free sample slots!\n");
1335         return -1;
1336 }
1337
1338 #if 0
1339 static int 
1340 wavefront_find_free_patch (snd_wavefront_t *dev)
1341
1342 {
1343         int i;
1344
1345         for (i = 0; i < WF_MAX_PATCH; i++) {
1346                 if (!(dev->patch_status[i] & WF_SLOT_FILLED)) {
1347                         return i;
1348                 }
1349         }
1350         snd_printk ("no free patch slots!\n");
1351         return -1;
1352 }
1353 #endif
1354
1355 static int
1356 wavefront_load_patch (snd_wavefront_t *dev, const char __user *addr)
1357 {
1358         wavefront_patch_info *header;
1359         int err;
1360         
1361         header = kmalloc(sizeof(*header), GFP_KERNEL);
1362         if (! header)
1363                 return -ENOMEM;
1364
1365         if (copy_from_user (header, addr, sizeof(wavefront_patch_info) -
1366                             sizeof(wavefront_any))) {
1367                 snd_printk ("bad address for load patch.\n");
1368                 err = -EFAULT;
1369                 goto __error;
1370         }
1371
1372         DPRINT (WF_DEBUG_LOAD_PATCH, "download "
1373                                       "Sample type: %d "
1374                                       "Sample number: %d "
1375                                       "Sample size: %d\n",
1376                                       header->subkey,
1377                                       header->number,
1378                                       header->size);
1379
1380         switch (header->subkey) {
1381         case WF_ST_SAMPLE:  /* sample or sample_header, based on patch->size */
1382
1383                 if (copy_from_user (&header->hdr.s, header->hdrptr,
1384                                     sizeof (wavefront_sample))) {
1385                         err = -EFAULT;
1386                         break;
1387                 }
1388
1389                 err = wavefront_send_sample (dev, header, header->dataptr, 0);
1390                 break;
1391
1392         case WF_ST_MULTISAMPLE:
1393
1394                 if (copy_from_user (&header->hdr.s, header->hdrptr,
1395                                     sizeof (wavefront_multisample))) {
1396                         err = -EFAULT;
1397                         break;
1398                 }
1399
1400                 err = wavefront_send_multisample (dev, header);
1401                 break;
1402
1403         case WF_ST_ALIAS:
1404
1405                 if (copy_from_user (&header->hdr.a, header->hdrptr,
1406                                     sizeof (wavefront_alias))) {
1407                         err = -EFAULT;
1408                         break;
1409                 }
1410
1411                 err = wavefront_send_alias (dev, header);
1412                 break;
1413
1414         case WF_ST_DRUM:
1415                 if (copy_from_user (&header->hdr.d, header->hdrptr,
1416                                     sizeof (wavefront_drum))) {
1417                         err = -EFAULT;
1418                         break;
1419                 }
1420
1421                 err = wavefront_send_drum (dev, header);
1422                 break;
1423
1424         case WF_ST_PATCH:
1425                 if (copy_from_user (&header->hdr.p, header->hdrptr,
1426                                     sizeof (wavefront_patch))) {
1427                         err = -EFAULT;
1428                         break;
1429                 }
1430                 
1431                 err = wavefront_send_patch (dev, header);
1432                 break;
1433
1434         case WF_ST_PROGRAM:
1435                 if (copy_from_user (&header->hdr.pr, header->hdrptr,
1436                                     sizeof (wavefront_program))) {
1437                         err = -EFAULT;
1438                         break;
1439                 }
1440
1441                 err = wavefront_send_program (dev, header);
1442                 break;
1443
1444         default:
1445                 snd_printk ("unknown patch type %d.\n",
1446                             header->subkey);
1447                 err = -EINVAL;
1448                 break;
1449         }
1450
1451  __error:
1452         kfree(header);
1453         return err;
1454 }
1455 \f
1456 /***********************************************************************
1457 WaveFront: hardware-dependent interface
1458 ***********************************************************************/
1459
1460 static void
1461 process_sample_hdr (u8 *buf)
1462
1463 {
1464         wavefront_sample s;
1465         u8 *ptr;
1466
1467         ptr = buf;
1468
1469         /* The board doesn't send us an exact copy of a "wavefront_sample"
1470            in response to an Upload Sample Header command. Instead, we 
1471            have to convert the data format back into our data structure,
1472            just as in the Download Sample command, where we have to do
1473            something very similar in the reverse direction.
1474         */
1475
1476         *((u32 *) &s.sampleStartOffset) = demunge_int32 (ptr, 4); ptr += 4;
1477         *((u32 *) &s.loopStartOffset) = demunge_int32 (ptr, 4); ptr += 4;
1478         *((u32 *) &s.loopEndOffset) = demunge_int32 (ptr, 4); ptr += 4;
1479         *((u32 *) &s.sampleEndOffset) = demunge_int32 (ptr, 4); ptr += 4;
1480         *((u32 *) &s.FrequencyBias) = demunge_int32 (ptr, 3); ptr += 3;
1481
1482         s.SampleResolution = *ptr & 0x3;
1483         s.Loop = *ptr & 0x8;
1484         s.Bidirectional = *ptr & 0x10;
1485         s.Reverse = *ptr & 0x40;
1486
1487         /* Now copy it back to where it came from */
1488
1489         memcpy (buf, (unsigned char *) &s, sizeof (wavefront_sample));
1490 }
1491
1492 static int
1493 wavefront_synth_control (snd_wavefront_card_t *acard, 
1494                          wavefront_control *wc)
1495
1496 {
1497         snd_wavefront_t *dev = &acard->wavefront;
1498         unsigned char patchnumbuf[2];
1499         int i;
1500
1501         DPRINT (WF_DEBUG_CMD, "synth control with "
1502                 "cmd 0x%x\n", wc->cmd);
1503
1504         /* Pre-handling of or for various commands */
1505
1506         switch (wc->cmd) {
1507                 
1508         case WFC_DISABLE_INTERRUPTS:
1509                 snd_printk ("interrupts disabled.\n");
1510                 outb (0x80|0x20, dev->control_port);
1511                 dev->interrupts_are_midi = 1;
1512                 return 0;
1513
1514         case WFC_ENABLE_INTERRUPTS:
1515                 snd_printk ("interrupts enabled.\n");
1516                 outb (0x80|0x40|0x20, dev->control_port);
1517                 dev->interrupts_are_midi = 1;
1518                 return 0;
1519
1520         case WFC_INTERRUPT_STATUS:
1521                 wc->rbuf[0] = dev->interrupts_are_midi;
1522                 return 0;
1523
1524         case WFC_ROMSAMPLES_RDONLY:
1525                 dev->rom_samples_rdonly = wc->wbuf[0];
1526                 wc->status = 0;
1527                 return 0;
1528
1529         case WFC_IDENTIFY_SLOT_TYPE:
1530                 i = wc->wbuf[0] | (wc->wbuf[1] << 7);
1531                 if (i <0 || i >= WF_MAX_SAMPLE) {
1532                         snd_printk ("invalid slot ID %d\n",
1533                                 i);
1534                         wc->status = EINVAL;
1535                         return -EINVAL;
1536                 }
1537                 wc->rbuf[0] = dev->sample_status[i];
1538                 wc->status = 0;
1539                 return 0;
1540
1541         case WFC_DEBUG_DRIVER:
1542                 dev->debug = wc->wbuf[0];
1543                 snd_printk ("debug = 0x%x\n", dev->debug);
1544                 return 0;
1545
1546         case WFC_UPLOAD_PATCH:
1547                 munge_int32 (*((u32 *) wc->wbuf), patchnumbuf, 2);
1548                 memcpy (wc->wbuf, patchnumbuf, 2);
1549                 break;
1550
1551         case WFC_UPLOAD_MULTISAMPLE:
1552                 /* multisamples have to be handled differently, and
1553                    cannot be dealt with properly by snd_wavefront_cmd() alone.
1554                 */
1555                 wc->status = wavefront_fetch_multisample
1556                         (dev, (wavefront_patch_info *) wc->rbuf);
1557                 return 0;
1558
1559         case WFC_UPLOAD_SAMPLE_ALIAS:
1560                 snd_printk ("support for sample alias upload "
1561                         "being considered.\n");
1562                 wc->status = EINVAL;
1563                 return -EINVAL;
1564         }
1565
1566         wc->status = snd_wavefront_cmd (dev, wc->cmd, wc->rbuf, wc->wbuf);
1567
1568         /* Post-handling of certain commands.
1569
1570            In particular, if the command was an upload, demunge the data
1571            so that the user-level doesn't have to think about it.
1572         */
1573
1574         if (wc->status == 0) {
1575                 switch (wc->cmd) {
1576                         /* intercept any freemem requests so that we know
1577                            we are always current with the user-level view
1578                            of things.
1579                         */
1580
1581                 case WFC_REPORT_FREE_MEMORY:
1582                         dev->freemem = demunge_int32 (wc->rbuf, 4);
1583                         break;
1584
1585                 case WFC_UPLOAD_PATCH:
1586                         demunge_buf (wc->rbuf, wc->rbuf, WF_PATCH_BYTES);
1587                         break;
1588
1589                 case WFC_UPLOAD_PROGRAM:
1590                         demunge_buf (wc->rbuf, wc->rbuf, WF_PROGRAM_BYTES);
1591                         break;
1592
1593                 case WFC_UPLOAD_EDRUM_PROGRAM:
1594                         demunge_buf (wc->rbuf, wc->rbuf, WF_DRUM_BYTES - 1);
1595                         break;
1596
1597                 case WFC_UPLOAD_SAMPLE_HEADER:
1598                         process_sample_hdr (wc->rbuf);
1599                         break;
1600
1601                 case WFC_UPLOAD_SAMPLE_ALIAS:
1602                         snd_printk ("support for "
1603                                     "sample aliases still "
1604                                     "being considered.\n");
1605                         break;
1606
1607                 case WFC_VMIDI_OFF:
1608                         snd_wavefront_midi_disable_virtual (acard);
1609                         break;
1610
1611                 case WFC_VMIDI_ON:
1612                         snd_wavefront_midi_enable_virtual (acard);
1613                         break;
1614                 }
1615         }
1616
1617         return 0;
1618 }
1619
1620 int 
1621 snd_wavefront_synth_open (struct snd_hwdep *hw, struct file *file)
1622
1623 {
1624         if (!try_module_get(hw->card->module))
1625                 return -EFAULT;
1626         file->private_data = hw;
1627         return 0;
1628 }
1629
1630 int 
1631 snd_wavefront_synth_release (struct snd_hwdep *hw, struct file *file)
1632
1633 {
1634         module_put(hw->card->module);
1635         return 0;
1636 }
1637
1638 int
1639 snd_wavefront_synth_ioctl (struct snd_hwdep *hw, struct file *file,
1640                            unsigned int cmd, unsigned long arg)
1641
1642 {
1643         struct snd_card *card;
1644         snd_wavefront_t *dev;
1645         snd_wavefront_card_t *acard;
1646         wavefront_control *wc;
1647         void __user *argp = (void __user *)arg;
1648         int err;
1649
1650         card = (struct snd_card *) hw->card;
1651
1652         if (snd_BUG_ON(!card))
1653                 return -ENODEV;
1654         if (snd_BUG_ON(!card->private_data))
1655                 return -ENODEV;
1656
1657         acard = card->private_data;
1658         dev = &acard->wavefront;
1659         
1660         switch (cmd) {
1661         case WFCTL_LOAD_SPP:
1662                 if (wavefront_load_patch (dev, argp) != 0) {
1663                         return -EIO;
1664                 }
1665                 break;
1666
1667         case WFCTL_WFCMD:
1668                 wc = memdup_user(argp, sizeof(*wc));
1669                 if (IS_ERR(wc))
1670                         return PTR_ERR(wc);
1671
1672                 if (wavefront_synth_control (acard, wc) < 0)
1673                         err = -EIO;
1674                 else if (copy_to_user (argp, wc, sizeof (*wc)))
1675                         err = -EFAULT;
1676                 else
1677                         err = 0;
1678                 kfree(wc);
1679                 return err;
1680
1681         default:
1682                 return -EINVAL;
1683         }
1684
1685         return 0;
1686 }
1687
1688 \f
1689 /***********************************************************************/
1690 /*  WaveFront: interface for card-level wavefront module               */
1691 /***********************************************************************/
1692
1693 void
1694 snd_wavefront_internal_interrupt (snd_wavefront_card_t *card)
1695 {
1696         snd_wavefront_t *dev = &card->wavefront;
1697
1698         /*
1699            Some comments on interrupts. I attempted a version of this
1700            driver that used interrupts throughout the code instead of
1701            doing busy and/or sleep-waiting. Alas, it appears that once
1702            the Motorola firmware is downloaded, the card *never*
1703            generates an RX interrupt. These are successfully generated
1704            during firmware loading, and after that wavefront_status()
1705            reports that an interrupt is pending on the card from time
1706            to time, but it never seems to be delivered to this
1707            driver. Note also that wavefront_status() continues to
1708            report that RX interrupts are enabled, suggesting that I
1709            didn't goof up and disable them by mistake.
1710
1711            Thus, I stepped back to a prior version of
1712            wavefront_wait(), the only place where this really
1713            matters. Its sad, but I've looked through the code to check
1714            on things, and I really feel certain that the Motorola
1715            firmware prevents RX-ready interrupts.
1716         */
1717
1718         if ((wavefront_status(dev) & (STAT_INTR_READ|STAT_INTR_WRITE)) == 0) {
1719                 return;
1720         }
1721
1722         spin_lock(&dev->irq_lock);
1723         dev->irq_ok = 1;
1724         dev->irq_cnt++;
1725         spin_unlock(&dev->irq_lock);
1726         wake_up(&dev->interrupt_sleeper);
1727 }
1728
1729 /* STATUS REGISTER 
1730
1731 0 Host Rx Interrupt Enable (1=Enabled)
1732 1 Host Rx Register Full (1=Full)
1733 2 Host Rx Interrupt Pending (1=Interrupt)
1734 3 Unused
1735 4 Host Tx Interrupt (1=Enabled)
1736 5 Host Tx Register empty (1=Empty)
1737 6 Host Tx Interrupt Pending (1=Interrupt)
1738 7 Unused
1739 */
1740
1741 static int __devinit
1742 snd_wavefront_interrupt_bits (int irq)
1743
1744 {
1745         int bits;
1746
1747         switch (irq) {
1748         case 9:
1749                 bits = 0x00;
1750                 break;
1751         case 5:
1752                 bits = 0x08;
1753                 break;
1754         case 12:
1755                 bits = 0x10;
1756                 break;
1757         case 15:
1758                 bits = 0x18;
1759                 break;
1760         
1761         default:
1762                 snd_printk ("invalid IRQ %d\n", irq);
1763                 bits = -1;
1764         }
1765
1766         return bits;
1767 }
1768
1769 static void __devinit
1770 wavefront_should_cause_interrupt (snd_wavefront_t *dev, 
1771                                   int val, int port, unsigned long timeout)
1772
1773 {
1774         wait_queue_t wait;
1775
1776         init_waitqueue_entry(&wait, current);
1777         spin_lock_irq(&dev->irq_lock);
1778         add_wait_queue(&dev->interrupt_sleeper, &wait);
1779         dev->irq_ok = 0;
1780         outb (val,port);
1781         spin_unlock_irq(&dev->irq_lock);
1782         while (!dev->irq_ok && time_before(jiffies, timeout)) {
1783                 schedule_timeout_uninterruptible(1);
1784                 barrier();
1785         }
1786 }
1787
1788 static int __devinit
1789 wavefront_reset_to_cleanliness (snd_wavefront_t *dev)
1790
1791 {
1792         int bits;
1793         int hwv[2];
1794
1795         /* IRQ already checked */
1796
1797         bits = snd_wavefront_interrupt_bits (dev->irq);
1798
1799         /* try reset of port */
1800
1801         outb (0x0, dev->control_port); 
1802   
1803         /* At this point, the board is in reset, and the H/W initialization
1804            register is accessed at the same address as the data port.
1805      
1806            Bit 7 - Enable IRQ Driver    
1807            0 - Tri-state the Wave-Board drivers for the PC Bus IRQs
1808            1 - Enable IRQ selected by bits 5:3 to be driven onto the PC Bus.
1809      
1810            Bit 6 - MIDI Interface Select
1811
1812            0 - Use the MIDI Input from the 26-pin WaveBlaster
1813            compatible header as the serial MIDI source
1814            1 - Use the MIDI Input from the 9-pin D connector as the
1815            serial MIDI source.
1816      
1817            Bits 5:3 - IRQ Selection
1818            0 0 0 - IRQ 2/9
1819            0 0 1 - IRQ 5
1820            0 1 0 - IRQ 12
1821            0 1 1 - IRQ 15
1822            1 0 0 - Reserved
1823            1 0 1 - Reserved
1824            1 1 0 - Reserved
1825            1 1 1 - Reserved
1826      
1827            Bits 2:1 - Reserved
1828            Bit 0 - Disable Boot ROM
1829            0 - memory accesses to 03FC30-03FFFFH utilize the internal Boot ROM
1830            1 - memory accesses to 03FC30-03FFFFH are directed to external 
1831            storage.
1832      
1833         */
1834
1835         /* configure hardware: IRQ, enable interrupts, 
1836            plus external 9-pin MIDI interface selected
1837         */
1838
1839         outb (0x80 | 0x40 | bits, dev->data_port);      
1840   
1841         /* CONTROL REGISTER
1842
1843            0 Host Rx Interrupt Enable (1=Enabled)      0x1
1844            1 Unused                                    0x2
1845            2 Unused                                    0x4
1846            3 Unused                                    0x8
1847            4 Host Tx Interrupt Enable                 0x10
1848            5 Mute (0=Mute; 1=Play)                    0x20
1849            6 Master Interrupt Enable (1=Enabled)      0x40
1850            7 Master Reset (0=Reset; 1=Run)            0x80
1851
1852            Take us out of reset, mute output, master + TX + RX interrupts on.
1853            
1854            We'll get an interrupt presumably to tell us that the TX
1855            register is clear.
1856         */
1857
1858         wavefront_should_cause_interrupt(dev, 0x80|0x40|0x10|0x1,
1859                                          dev->control_port,
1860                                          (reset_time*HZ)/100);
1861
1862         /* Note: data port is now the data port, not the h/w initialization
1863            port.
1864          */
1865
1866         if (!dev->irq_ok) {
1867                 snd_printk ("intr not received after h/w un-reset.\n");
1868                 goto gone_bad;
1869         } 
1870
1871         /* Note: data port is now the data port, not the h/w initialization
1872            port.
1873
1874            At this point, only "HW VERSION" or "DOWNLOAD OS" commands
1875            will work. So, issue one of them, and wait for TX
1876            interrupt. This can take a *long* time after a cold boot,
1877            while the ISC ROM does its RAM test. The SDK says up to 4
1878            seconds - with 12MB of RAM on a Tropez+, it takes a lot
1879            longer than that (~16secs). Note that the card understands
1880            the difference between a warm and a cold boot, so
1881            subsequent ISC2115 reboots (say, caused by module
1882            reloading) will get through this much faster.
1883
1884            XXX Interesting question: why is no RX interrupt received first ?
1885         */
1886
1887         wavefront_should_cause_interrupt(dev, WFC_HARDWARE_VERSION, 
1888                                          dev->data_port, ramcheck_time*HZ);
1889
1890         if (!dev->irq_ok) {
1891                 snd_printk ("post-RAM-check interrupt not received.\n");
1892                 goto gone_bad;
1893         } 
1894
1895         if (!wavefront_wait (dev, STAT_CAN_READ)) {
1896                 snd_printk ("no response to HW version cmd.\n");
1897                 goto gone_bad;
1898         }
1899         
1900         if ((hwv[0] = wavefront_read (dev)) == -1) {
1901                 snd_printk ("board not responding correctly.\n");
1902                 goto gone_bad;
1903         }
1904
1905         if (hwv[0] == 0xFF) { /* NAK */
1906
1907                 /* Board's RAM test failed. Try to read error code,
1908                    and tell us about it either way.
1909                 */
1910                 
1911                 if ((hwv[0] = wavefront_read (dev)) == -1) {
1912                         snd_printk ("on-board RAM test failed "
1913                                     "(bad error code).\n");
1914                 } else {
1915                         snd_printk ("on-board RAM test failed "
1916                                     "(error code: 0x%x).\n",
1917                                 hwv[0]);
1918                 }
1919                 goto gone_bad;
1920         }
1921
1922         /* We're OK, just get the next byte of the HW version response */
1923
1924         if ((hwv[1] = wavefront_read (dev)) == -1) {
1925                 snd_printk ("incorrect h/w response.\n");
1926                 goto gone_bad;
1927         }
1928
1929         snd_printk ("hardware version %d.%d\n",
1930                     hwv[0], hwv[1]);
1931
1932         return 0;
1933
1934
1935      gone_bad:
1936         return (1);
1937 }
1938
1939 static int __devinit
1940 wavefront_download_firmware (snd_wavefront_t *dev, char *path)
1941
1942 {
1943         const unsigned char *buf;
1944         int len, err;
1945         int section_cnt_downloaded = 0;
1946         const struct firmware *firmware;
1947
1948         err = request_firmware(&firmware, path, dev->card->dev);
1949         if (err < 0) {
1950                 snd_printk(KERN_ERR "firmware (%s) download failed!!!\n", path);
1951                 return 1;
1952         }
1953
1954         len = 0;
1955         buf = firmware->data;
1956         for (;;) {
1957                 int section_length = *(signed char *)buf;
1958                 if (section_length == 0)
1959                         break;
1960                 if (section_length < 0 || section_length > WF_SECTION_MAX) {
1961                         snd_printk(KERN_ERR
1962                                    "invalid firmware section length %d\n",
1963                                    section_length);
1964                         goto failure;
1965                 }
1966                 buf++;
1967                 len++;
1968
1969                 if (firmware->size < len + section_length) {
1970                         snd_printk(KERN_ERR "firmware section read error.\n");
1971                         goto failure;
1972                 }
1973
1974                 /* Send command */
1975                 if (wavefront_write(dev, WFC_DOWNLOAD_OS))
1976                         goto failure;
1977         
1978                 for (; section_length; section_length--) {
1979                         if (wavefront_write(dev, *buf))
1980                                 goto failure;
1981                         buf++;
1982                         len++;
1983                 }
1984         
1985                 /* get ACK */
1986                 if (!wavefront_wait(dev, STAT_CAN_READ)) {
1987                         snd_printk(KERN_ERR "time out for firmware ACK.\n");
1988                         goto failure;
1989                 }
1990                 err = inb(dev->data_port);
1991                 if (err != WF_ACK) {
1992                         snd_printk(KERN_ERR
1993                                    "download of section #%d not "
1994                                    "acknowledged, ack = 0x%x\n",
1995                                    section_cnt_downloaded + 1, err);
1996                         goto failure;
1997                 }
1998
1999                 section_cnt_downloaded++;
2000         }
2001
2002         release_firmware(firmware);
2003         return 0;
2004
2005  failure:
2006         release_firmware(firmware);
2007         snd_printk(KERN_ERR "firmware download failed!!!\n");
2008         return 1;
2009 }
2010
2011
2012 static int __devinit
2013 wavefront_do_reset (snd_wavefront_t *dev)
2014
2015 {
2016         char voices[1];
2017
2018         if (wavefront_reset_to_cleanliness (dev)) {
2019                 snd_printk ("hw reset failed.\n");
2020                 goto gone_bad;
2021         }
2022
2023         if (dev->israw) {
2024                 if (wavefront_download_firmware (dev, ospath)) {
2025                         goto gone_bad;
2026                 }
2027
2028                 dev->israw = 0;
2029
2030                 /* Wait for the OS to get running. The protocol for
2031                    this is non-obvious, and was determined by
2032                    using port-IO tracing in DOSemu and some
2033                    experimentation here.
2034                    
2035                    Rather than using timed waits, use interrupts creatively.
2036                 */
2037
2038                 wavefront_should_cause_interrupt (dev, WFC_NOOP,
2039                                                   dev->data_port,
2040                                                   (osrun_time*HZ));
2041
2042                 if (!dev->irq_ok) {
2043                         snd_printk ("no post-OS interrupt.\n");
2044                         goto gone_bad;
2045                 }
2046                 
2047                 /* Now, do it again ! */
2048                 
2049                 wavefront_should_cause_interrupt (dev, WFC_NOOP,
2050                                                   dev->data_port, (10*HZ));
2051                 
2052                 if (!dev->irq_ok) {
2053                         snd_printk ("no post-OS interrupt(2).\n");
2054                         goto gone_bad;
2055                 }
2056
2057                 /* OK, no (RX/TX) interrupts any more, but leave mute
2058                    in effect. 
2059                 */
2060                 
2061                 outb (0x80|0x40, dev->control_port); 
2062         }
2063
2064         /* SETUPSND.EXE asks for sample memory config here, but since i
2065            have no idea how to interpret the result, we'll forget
2066            about it.
2067         */
2068         
2069         if ((dev->freemem = wavefront_freemem (dev)) < 0) {
2070                 goto gone_bad;
2071         }
2072                 
2073         snd_printk ("available DRAM %dk\n", dev->freemem / 1024);
2074
2075         if (wavefront_write (dev, 0xf0) ||
2076             wavefront_write (dev, 1) ||
2077             (wavefront_read (dev) < 0)) {
2078                 dev->debug = 0;
2079                 snd_printk ("MPU emulation mode not set.\n");
2080                 goto gone_bad;
2081         }
2082
2083         voices[0] = 32;
2084
2085         if (snd_wavefront_cmd (dev, WFC_SET_NVOICES, NULL, voices)) {
2086                 snd_printk ("cannot set number of voices to 32.\n");
2087                 goto gone_bad;
2088         }
2089
2090
2091         return 0;
2092
2093  gone_bad:
2094         /* reset that sucker so that it doesn't bother us. */
2095
2096         outb (0x0, dev->control_port);
2097         dev->interrupts_are_midi = 0;
2098         return 1;
2099 }
2100
2101 int __devinit
2102 snd_wavefront_start (snd_wavefront_t *dev)
2103
2104 {
2105         int samples_are_from_rom;
2106
2107         /* IMPORTANT: assumes that snd_wavefront_detect() and/or
2108            wavefront_reset_to_cleanliness() has already been called 
2109         */
2110
2111         if (dev->israw) {
2112                 samples_are_from_rom = 1;
2113         } else {
2114                 /* XXX is this always true ? */
2115                 samples_are_from_rom = 0;
2116         }
2117
2118         if (dev->israw || fx_raw) {
2119                 if (wavefront_do_reset (dev)) {
2120                         return -1;
2121                 }
2122         }
2123         /* Check for FX device, present only on Tropez+ */
2124
2125         dev->has_fx = (snd_wavefront_fx_detect (dev) == 0);
2126
2127         if (dev->has_fx && fx_raw) {
2128                 snd_wavefront_fx_start (dev);
2129         }
2130
2131         wavefront_get_sample_status (dev, samples_are_from_rom);
2132         wavefront_get_program_status (dev);
2133         wavefront_get_patch_status (dev);
2134
2135         /* Start normal operation: unreset, master interrupt enabled, no mute
2136         */
2137
2138         outb (0x80|0x40|0x20, dev->control_port); 
2139
2140         return (0);
2141 }
2142
2143 int __devinit
2144 snd_wavefront_detect (snd_wavefront_card_t *card)
2145
2146 {
2147         unsigned char   rbuf[4], wbuf[4];
2148         snd_wavefront_t *dev = &card->wavefront;
2149         
2150         /* returns zero if a WaveFront card is successfully detected.
2151            negative otherwise.
2152         */
2153
2154         dev->israw = 0;
2155         dev->has_fx = 0;
2156         dev->debug = debug_default;
2157         dev->interrupts_are_midi = 0;
2158         dev->irq_cnt = 0;
2159         dev->rom_samples_rdonly = 1;
2160
2161         if (snd_wavefront_cmd (dev, WFC_FIRMWARE_VERSION, rbuf, wbuf) == 0) {
2162
2163                 dev->fw_version[0] = rbuf[0];
2164                 dev->fw_version[1] = rbuf[1];
2165
2166                 snd_printk ("firmware %d.%d already loaded.\n",
2167                             rbuf[0], rbuf[1]);
2168
2169                 /* check that a command actually works */
2170       
2171                 if (snd_wavefront_cmd (dev, WFC_HARDWARE_VERSION,
2172                                        rbuf, wbuf) == 0) {
2173                         dev->hw_version[0] = rbuf[0];
2174                         dev->hw_version[1] = rbuf[1];
2175                 } else {
2176                         snd_printk ("not raw, but no "
2177                                     "hardware version!\n");
2178                         return -1;
2179                 }
2180
2181                 if (!wf_raw) {
2182                         return 0;
2183                 } else {
2184                         snd_printk ("reloading firmware as you requested.\n");
2185                         dev->israw = 1;
2186                 }
2187
2188         } else {
2189
2190                 dev->israw = 1;
2191                 snd_printk ("no response to firmware probe, assume raw.\n");
2192
2193         }
2194
2195         return 0;
2196 }
2197
2198 MODULE_FIRMWARE(DEFAULT_OSPATH);