mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Rui Sousa <rui.p.m.sousa@clix.pt>
To: Rui Sousa <rui.p.m.sousa@clix.pt>
Cc: Adam Huffman <bloch@verdurin.com>,
	emu10k1-devel <emu10k1-devel@lists.sourceforge.net>,
	<linux-kernel@vger.kernel.org>
Subject: Re: Oops in emu10k1 driver
Date: Tue, 2 Apr 2002 03:14:59 +0200 (CEST)	[thread overview]
Message-ID: <Pine.LNX.4.44.0204020310550.1503-200000@localhost.localdomain> (raw)
In-Reply-To: <Pine.LNX.4.44.0204020206050.1503-100000@localhost.localdomain>

[-- Attachment #1: Type: TEXT/PLAIN, Size: 1855 bytes --]

On Tue, 2 Apr 2002, Rui Sousa wrote:

Can you please try the attached patch (against 2.4.19-pre5)?
I has some other fixes/cleanups, but these need to go
into 2.4 anyway.

Rui

> On Mon, 1 Apr 2002, Adam Huffman wrote:
> 
> Hi,
> 
> First of all, which kernel are you using?
> I believe I already fixed this bug in CVS but I haven't
> received any confirmation. Can you give it a try?
> You can get the CVS repository at:
> 
> http://sourceforge.net/cvs/?group_id=44773
> 
> Then edit the config file and point it to your kernel source,
> make, make install. That should be it.
> 
> Otherwise (when I get your kernel version) I can send you a
> patch to try out.
> 
> Rui Sousa
> 
> > On Mon, 01 Apr 2002, Alan Cox wrote:
> > 
> > > > VMware died when I put an audio CD into my DVD drive.  I wouldn't have
> > > > mentioned it here but for the fact that there was an Oops and when
> > > > decoded it pointed to the emu10k1 driver:
> > > 
> > > Yes but we don't know what vmware has been doing. Please try the same thing
> > > a few times without vmware running
> > > 
> > > > kernel BUG at audio.c:1474!
> > > > invalid operand: 0000
> > > 
> > > 
> > > This one does look like a real bug in the emu10k driver, rather than a
> > > vmware caused funny
> > 
> > Haven't been able to reproduce it with the VMware modules removed.
> > -
> > To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
> > the body of a message to majordomo@vger.kernel.org
> > More majordomo info at  http://vger.kernel.org/majordomo-info.html
> > Please read the FAQ at  http://www.tux.org/lkml/
> > 
> 
> -
> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> Please read the FAQ at  http://www.tux.org/lkml/
> 

[-- Attachment #2: emu10k1 patch --]
[-- Type: TEXT/PLAIN, Size: 13184 bytes --]

diff -ur linux-2.4.19-pre5.orig/Documentation/Configure.help linux-2.4.19-pre5/Documentation/Configure.help
--- linux-2.4.19-pre5.orig/Documentation/Configure.help	Tue Apr  2 02:46:01 2002
+++ linux-2.4.19-pre5/Documentation/Configure.help	Tue Apr  2 03:03:43 2002
@@ -18986,7 +18986,7 @@
   processing effects which include for example: signal routing,
   bass/treble control, AC3 passthrough, ...
   Userspace tools to create new patches and load/unload them can be
-  found at <http://opensource.creative.com/dist.html>.
+  found at <http://sourceforge.net/projects/emu10k1>.
 
 Creative SBLive! (EMU10K1) MIDI
 CONFIG_MIDI_EMU10K1
diff -ur linux-2.4.19-pre5.orig/drivers/sound/emu10k1/audio.c linux-2.4.19-pre5/drivers/sound/emu10k1/audio.c
--- linux-2.4.19-pre5.orig/drivers/sound/emu10k1/audio.c	Sat Mar  9 12:26:06 2002
+++ linux-2.4.19-pre5/drivers/sound/emu10k1/audio.c	Tue Apr  2 02:58:05 2002
@@ -1365,6 +1365,13 @@
 
 	buffer->fragment_size = 1 << buffer->ossfragshift;
 
+	while (buffer->fragment_size * WAVEOUT_MINFRAGS > WAVEOUT_MAXBUFSIZE)
+		buffer->fragment_size >>= 1;
+
+	/* now we are sure that:
+	 (2^WAVEOUT_MINFRAGSHIFT) <= (fragment_size = 2^n) <= (WAVEOUT_MAXBUFSIZE / WAVEOUT_MINFRAGS)
+	*/
+
 	if (!buffer->numfrags) {
 		u32 numfrags;
 
@@ -1379,19 +1386,14 @@
 		}
 	}
 
-	if (buffer->numfrags < MINFRAGS)
-		buffer->numfrags = MINFRAGS;
+	if (buffer->numfrags < WAVEOUT_MINFRAGS)
+		buffer->numfrags = WAVEOUT_MINFRAGS;
 
-	if (buffer->numfrags * buffer->fragment_size > WAVEOUT_MAXBUFSIZE) {
+	if (buffer->numfrags * buffer->fragment_size > WAVEOUT_MAXBUFSIZE)
 		buffer->numfrags = WAVEOUT_MAXBUFSIZE / buffer->fragment_size;
 
-		if (buffer->numfrags < MINFRAGS) {
-			buffer->numfrags = MINFRAGS;
-			buffer->fragment_size = WAVEOUT_MAXBUFSIZE / MINFRAGS;
-		}
-
-	} else if (buffer->numfrags * buffer->fragment_size < WAVEOUT_MINBUFSIZE)
-		buffer->numfrags = WAVEOUT_MINBUFSIZE / buffer->fragment_size;
+	if (buffer->numfrags < WAVEOUT_MINFRAGS)
+		BUG();
 
 	buffer->size = buffer->fragment_size * buffer->numfrags;
 	buffer->pages = buffer->size / PAGE_SIZE + ((buffer->size % PAGE_SIZE) ? 1 : 0);
@@ -1425,24 +1427,29 @@
 
 	buffer->fragment_size = 1 << buffer->ossfragshift;
 
+	while (buffer->fragment_size * WAVEIN_MINFRAGS > WAVEIN_MAXBUFSIZE)
+		buffer->fragment_size >>= 1;
+
+	/* now we are sure that:
+	   (2^WAVEIN_MINFRAGSHIFT) <= (fragment_size = 2^n) <= (WAVEIN_MAXBUFSIZE / WAVEIN_MINFRAGS)
+        */
+
+
 	if (!buffer->numfrags)
 		buffer->numfrags = (wiinst->format.bytespersec * WAVEIN_DEFAULTBUFLEN) / (buffer->fragment_size * 1000) - 1;
 
-	if (buffer->numfrags < MINFRAGS)
-		buffer->numfrags = MINFRAGS;
+	if (buffer->numfrags < WAVEIN_MINFRAGS)
+		buffer->numfrags = WAVEIN_MINFRAGS;
 
-	if (buffer->numfrags * buffer->fragment_size > WAVEIN_MAXBUFSIZE) {
+	if (buffer->numfrags * buffer->fragment_size > WAVEIN_MAXBUFSIZE)
 		buffer->numfrags = WAVEIN_MAXBUFSIZE / buffer->fragment_size;
 
-		if (buffer->numfrags < MINFRAGS) {
-			buffer->numfrags = MINFRAGS;
-			buffer->fragment_size = WAVEIN_MAXBUFSIZE / MINFRAGS;
-		}
-	} else if (buffer->numfrags * buffer->fragment_size < WAVEIN_MINBUFSIZE)
-		buffer->numfrags = WAVEIN_MINBUFSIZE / buffer->fragment_size;
+	if (buffer->numfrags < WAVEIN_MINFRAGS)
+		BUG();
 
 	bufsize = buffer->fragment_size * buffer->numfrags;
 
+	/* the buffer size for recording is restricted to certain values, adjust it now */
 	if (bufsize >= 0x10000) {
 		buffer->size = 0x10000;
 		buffer->sizeregval = 0x1f;
@@ -1468,10 +1475,12 @@
 		}
 	}
 
+	/* adjust the fragment size so that buffer size is an integer multiple */
+	while (buffer->size % buffer->fragment_size)
+		buffer->fragment_size >>= 1;
+
 	buffer->numfrags = buffer->size / buffer->fragment_size;
 	buffer->pages =  buffer->size / PAGE_SIZE + ((buffer->size % PAGE_SIZE) ? 1 : 0);
-	if (buffer->size % buffer->fragment_size)
-		BUG();
 
 	DPD(2, " calculated recording fragment_size -> %d\n", buffer->fragment_size);
 	DPD(2, " calculated recording numfrags -> %d\n", buffer->numfrags);
diff -ur linux-2.4.19-pre5.orig/drivers/sound/emu10k1/audio.h linux-2.4.19-pre5/drivers/sound/emu10k1/audio.h
--- linux-2.4.19-pre5.orig/drivers/sound/emu10k1/audio.h	Sat Mar  9 12:26:06 2002
+++ linux-2.4.19-pre5/drivers/sound/emu10k1/audio.h	Tue Apr  2 02:58:05 2002
@@ -33,8 +33,6 @@
 #ifndef _AUDIO_H
 #define _AUDIO_H
 
-#define MINFRAGS	3	/* _don't_ go bellow 3 */
-
 struct emu10k1_wavedevice
 {
         struct emu10k1_card *card;
diff -ur linux-2.4.19-pre5.orig/drivers/sound/emu10k1/cardwi.h linux-2.4.19-pre5/drivers/sound/emu10k1/cardwi.h
--- linux-2.4.19-pre5.orig/drivers/sound/emu10k1/cardwi.h	Sat Mar  9 12:39:41 2002
+++ linux-2.4.19-pre5/drivers/sound/emu10k1/cardwi.h	Tue Apr  2 02:58:05 2002
@@ -69,13 +69,14 @@
 	u16 fxwc;
 };
 
-#define WAVEIN_MAXBUFSIZE         65536
-#define WAVEIN_MINBUFSIZE	  368
+#define WAVEIN_MAXBUFSIZE	65536
+#define WAVEIN_MINBUFSIZE	368
 
-#define WAVEIN_DEFAULTFRAGLEN     100 
-#define WAVEIN_DEFAULTBUFLEN      1000
+#define WAVEIN_DEFAULTFRAGLEN	100 
+#define WAVEIN_DEFAULTBUFLEN	1000
 
-#define WAVEIN_MINFRAGSHIFT   	  8 
+#define WAVEIN_MINFRAGSHIFT	8 
+#define WAVEIN_MINFRAGS		2
 
 int emu10k1_wavein_open(struct emu10k1_wavedevice *);
 void emu10k1_wavein_close(struct emu10k1_wavedevice *);
diff -ur linux-2.4.19-pre5.orig/drivers/sound/emu10k1/cardwo.h linux-2.4.19-pre5/drivers/sound/emu10k1/cardwo.h
--- linux-2.4.19-pre5.orig/drivers/sound/emu10k1/cardwo.h	Sat Mar  9 12:39:41 2002
+++ linux-2.4.19-pre5/drivers/sound/emu10k1/cardwo.h	Tue Apr  2 02:58:05 2002
@@ -39,13 +39,13 @@
 
 /* setting this to other than a power of two may break some applications */
 #define WAVEOUT_MAXBUFSIZE	MAXBUFSIZE
-#define WAVEOUT_MINBUFSIZE	64
 
 #define WAVEOUT_DEFAULTFRAGLEN	20 /* Time to play a fragment in ms (latency) */
 #define WAVEOUT_DEFAULTBUFLEN	500 /* Time to play the entire buffer in ms */
 
-#define WAVEOUT_MINFRAGSHIFT	6
-#define WAVEOUT_MAXVOICES 6
+#define WAVEOUT_MINFRAGSHIFT	6 /* Minimum fragment size in bytes is 2^6 */
+#define WAVEOUT_MINFRAGS	3 /* _don't_ go bellow 3, it would break silence filling */
+#define WAVEOUT_MAXVOICES	6
 
 struct waveout_buffer {
 	u16 ossfragshift;
diff -ur linux-2.4.19-pre5.orig/drivers/sound/emu10k1/efxmgr.c linux-2.4.19-pre5/drivers/sound/emu10k1/efxmgr.c
--- linux-2.4.19-pre5.orig/drivers/sound/emu10k1/efxmgr.c	Sat Mar  9 12:26:06 2002
+++ linux-2.4.19-pre5/drivers/sound/emu10k1/efxmgr.c	Tue Apr  2 02:58:05 2002
@@ -103,7 +103,7 @@
 
 	card->ac97.mixer_state[oss_mixer] = (right << 8) | left;
 
-	if (!card->isaps)
+	if (!card->is_aps)
 		card->ac97.write_mixer(&card->ac97, oss_mixer, left, right);
 	
 	emu10k1_set_volume_gpr(card, card->mgr.ctrl_gpr[oss_mixer][0], left,
diff -ur linux-2.4.19-pre5.orig/drivers/sound/emu10k1/hwaccess.h linux-2.4.19-pre5/drivers/sound/emu10k1/hwaccess.h
--- linux-2.4.19-pre5.orig/drivers/sound/emu10k1/hwaccess.h	Sat Mar  9 12:39:41 2002
+++ linux-2.4.19-pre5/drivers/sound/emu10k1/hwaccess.h	Tue Apr  2 02:58:05 2002
@@ -182,7 +182,7 @@
 
 	u8 chiprev;                    /* Chip revision                */
 
-	int isaps;
+	u8 is_aps;
 
 	struct patch_manager mgr;
 	struct pt_data pt;
diff -ur linux-2.4.19-pre5.orig/drivers/sound/emu10k1/main.c linux-2.4.19-pre5/drivers/sound/emu10k1/main.c
--- linux-2.4.19-pre5.orig/drivers/sound/emu10k1/main.c	Sat Mar  9 12:26:06 2002
+++ linux-2.4.19-pre5/drivers/sound/emu10k1/main.c	Tue Apr  2 02:58:05 2002
@@ -196,7 +196,7 @@
 
 	/* Assign default recording parameters */
 	/* FIXME */
-	if(card->isaps)
+	if (card->is_aps)
 		card->wavein.recsrc = WAVERECORD_FX;
 	else
 		card->wavein.recsrc = WAVERECORD_AC97;
@@ -229,7 +229,7 @@
 
 	card->ac97.private_data = card;
 
-	if (!card->isaps) {
+	if (!card->is_aps) {
 		card->ac97.id = 0;
 		card->ac97.codec_read = emu10k1_ac97_read;
         	card->ac97.codec_write = emu10k1_ac97_write;
@@ -287,7 +287,7 @@
 {
 	char s[32];
 
-	if (!card->isaps) {
+	if (!card->is_aps) {
 		sprintf(s, "driver/emu10k1/%s/ac97", card->pci_dev->slot_name);
 		remove_proc_entry(s, NULL);
 
@@ -867,19 +867,19 @@
 	}
 
 	for (pagecount = 0; pagecount < MAXPAGES; pagecount++)
-		((u32 *) card->virtualpagetable.addr)[pagecount] = cpu_to_le32((card->silentpage.dma_handle * 2) | pagecount);
+		((u32 *) card->virtualpagetable.addr)[pagecount] = cpu_to_le32(((u32)card->silentpage.dma_handle * 2) | pagecount);
 
 	/* Init page table & tank memory base register */
 	sblive_writeptr_tag(card, 0,
-			    PTB, card->virtualpagetable.dma_handle,
+			    PTB, (u32)card->virtualpagetable.dma_handle,
 			    TCB, 0,
 			    TCBS, 0,
 			    TAGLIST_END);
 
 	for (nCh = 0; nCh < NUM_G; nCh++) {
 		sblive_writeptr_tag(card, nCh,
-				    MAPA, MAP_PTI_MASK | (card->silentpage.dma_handle * 2),
-				    MAPB, MAP_PTI_MASK | (card->silentpage.dma_handle * 2),
+				    MAPA, MAP_PTI_MASK |( (u32)card->silentpage.dma_handle * 2),
+				    MAPB, MAP_PTI_MASK |( (u32)card->silentpage.dma_handle * 2),
 				    TAGLIST_END);
 	}
 
@@ -1059,7 +1059,7 @@
 		card->iobase + card->length - 1, card->irq);
 
 	pci_read_config_dword(pci_dev, PCI_SUBSYSTEM_VENDOR_ID, &subsysvid);
-	card->isaps = (subsysvid == EMU_APS_SUBID);
+	card->is_aps = (subsysvid == EMU_APS_SUBID);
 
 	spin_lock_init(&card->lock);
 	init_MUTEX(&card->open_sem);
@@ -1090,7 +1090,7 @@
 		goto err_emu10k1_init;
 	}
 
-	if (card->isaps)
+	if (card->is_aps)
 		emu10k1_ecard_init(card);
 
 	list_add(&card->list, &emu10k1_devs);
@@ -1135,7 +1135,7 @@
 	pci_set_drvdata(pci_dev, NULL);
 }
 
-MODULE_AUTHOR("Bertrand Lee, Cai Ying. (Email to: emu10k1-devel@opensource.creative.com)");
+MODULE_AUTHOR("Bertrand Lee, Cai Ying. (Email to: emu10k1-devel@lists.sourceforge.net)");
 MODULE_DESCRIPTION("Creative EMU10K1 PCI Audio Driver v" DRIVER_VERSION "\nCopyright (C) 1999 Creative Technology Ltd.");
 MODULE_LICENSE("GPL");
 
diff -ur linux-2.4.19-pre5.orig/drivers/sound/emu10k1/mixer.c linux-2.4.19-pre5/drivers/sound/emu10k1/mixer.c
--- linux-2.4.19-pre5.orig/drivers/sound/emu10k1/mixer.c	Sat Mar  9 12:26:06 2002
+++ linux-2.4.19-pre5/drivers/sound/emu10k1/mixer.c	Tue Apr  2 02:58:05 2002
@@ -251,7 +251,7 @@
 		case CMD_SETRECSRC:
 			switch (ctl->val[0]) {
 			case WAVERECORD_AC97:
-				if (card->isaps) {
+				if (card->is_aps) {
 					ret = -EINVAL;
 					break;
 				}
@@ -455,7 +455,7 @@
 
 			card->mgr.ctrl_gpr[id][ch] = addr;
 
-			if (card->isaps)
+			if (card->is_aps)
 				break;
 
 			if (addr >= 0) {
@@ -558,7 +558,7 @@
 
 				card->tankmem.size = size;
 
-				sblive_writeptr_tag(card, 0, TCB, card->tankmem.dma_handle, TCBS, size_reg, TAGLIST_END);
+				sblive_writeptr_tag(card, 0, TCB,(u32) card->tankmem.dma_handle, TCBS, size_reg, TAGLIST_END);
 
 				emu10k1_writefn0(card, HCFG_LOCKTANKCACHE, 0);
 			}
@@ -621,7 +621,7 @@
 	unsigned int oss_mixer = _IOC_NR(cmd);
 	
 	ret = -EINVAL;
-	if (!card->isaps) {
+	if (!card->is_aps) {
 		if (cmd == SOUND_MIXER_INFO) {
 			mixer_info info;
 
diff -ur linux-2.4.19-pre5.orig/drivers/sound/emu10k1/recmgr.c linux-2.4.19-pre5/drivers/sound/emu10k1/recmgr.c
--- linux-2.4.19-pre5.orig/drivers/sound/emu10k1/recmgr.c	Sat Mar  9 12:26:06 2002
+++ linux-2.4.19-pre5/drivers/sound/emu10k1/recmgr.c	Tue Apr  2 02:58:05 2002
@@ -132,7 +132,7 @@
 
 	DPD(2, "bus addx: %#lx\n", (unsigned long) buffer->dma_handle);
 
-	sblive_writeptr(card, buffer->addrreg, 0, buffer->dma_handle);
+	sblive_writeptr(card, buffer->addrreg, 0, (u32)buffer->dma_handle);
 
 	return;
 }
diff -ur linux-2.4.19-pre5.orig/drivers/sound/emu10k1/voicemgr.c linux-2.4.19-pre5/drivers/sound/emu10k1/voicemgr.c
--- linux-2.4.19-pre5.orig/drivers/sound/emu10k1/voicemgr.c	Sat Mar  9 12:26:06 2002
+++ linux-2.4.19-pre5/drivers/sound/emu10k1/voicemgr.c	Tue Apr  2 02:58:05 2002
@@ -66,7 +66,7 @@
 		DPD(2, "Virtual Addx: %p\n", mem->addr[pagecount]);
 
 		for (i = 0; i < PAGE_SIZE / EMUPAGESIZE; i++) {
-			busaddx = mem->dma_handle[pagecount] + i * EMUPAGESIZE;
+			busaddx = (u32)(mem->dma_handle[pagecount]) + i * EMUPAGESIZE;
 
 			DPD(3, "Bus Addx: %#lx\n", busaddx);
 
@@ -102,7 +102,7 @@
 		for (i = 0; i < PAGE_SIZE / EMUPAGESIZE; i++) {
 			pageindex = mem->emupageindex + pagecount * PAGE_SIZE / EMUPAGESIZE + i;
 			((u32 *) card->virtualpagetable.addr)[pageindex] =
-				cpu_to_le32((card->silentpage.dma_handle * 2) | pageindex);
+				cpu_to_le32(((u32)card->silentpage.dma_handle * 2) | pageindex);
 		}
 	}
 
@@ -231,8 +231,8 @@
 				    Z1, 0,
 				    Z2, 0,
 				    /* Invalidate maps */
-				    MAPA, MAP_PTI_MASK | (card->silentpage.dma_handle * 2),
-				    MAPB, MAP_PTI_MASK | (card->silentpage.dma_handle * 2),
+				    MAPA, MAP_PTI_MASK | ((u32)card->silentpage.dma_handle * 2),
+				    MAPB, MAP_PTI_MASK | ((u32)card->silentpage.dma_handle * 2),
 				/* modulation envelope */
 				    CVCF, 0x0000ffff,
 				    VTFT, 0x0000ffff,

      reply	other threads:[~2002-04-02  1:19 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2002-04-01 21:51 Adam Huffman
2002-04-01 22:41 ` Alan Cox
2002-04-01 22:45   ` Adam Huffman
2002-04-02  0:14     ` Rui Sousa
2002-04-02  1:14       ` Rui Sousa [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=Pine.LNX.4.44.0204020310550.1503-200000@localhost.localdomain \
    --to=rui.p.m.sousa@clix.pt \
    --cc=bloch@verdurin.com \
    --cc=emu10k1-devel@lists.sourceforge.net \
    --cc=linux-kernel@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®