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