cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

wavefront_synth.c (53714B)


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