At Thu, 23 Oct 2008 19:07:40 +0200, I wrote:
At Thu, 23 Oct 2008 15:23:24 +0100, Jason Harvey wrote:
Takashi Iwai wrote:
What is the last kernel message from sbxfi driver? Usually it prints some messages (as debug=1 as default).
I applied the patch and when trying "mplayer wn.wav" I consistently get the following message on the console
PANIC: double fault, gdt at c13f6000 [255 bytes]
nothing else, either reboots instantly or locks up.
In case you might find it of use I modprobed at debug=3 and ran dmesg before I ran mplayer. Output attached.
Thanks.
The last entries are:
SBXFI: Setting TLB buffer page 0x1daff000 SBXFI: write(0) 0x13b004 = 0x1daff000 SBXFI: write(0) 0x13b000 = 0x0
Hm, this smells like a buffer handling issue.
I updated the sbxfi driver code now, added mutex around the code handling TLB pages. Please give it a try.
Another patch to try is the one like below (on the top of the latest code). Any change with this?
thanks,
Takashi
diff --git a/sound/pci/sbxfi/sbxfi.c b/sound/pci/sbxfi/sbxfi.c index 458294f..cbb56eb 100644 --- a/sound/pci/sbxfi/sbxfi.c +++ b/sound/pci/sbxfi/sbxfi.c @@ -603,10 +603,6 @@ static void sbxfi_capture_start(struct sbxfi *chip, struct sbxfi_port *port) /* slave */ ctrl = ratec; sbxfi_setup_src(chip, port->src[1], start, loop, 0x80, ctrl); -#if 0 /* XXX */ - /* Enable SRC input from Audio Ring */ - sbxfi_write(chip, SRC_MASTER_CTL, 0x1); -#endif }
static void sbxfi_capture_stop(struct sbxfi *chip, struct sbxfi_port *port) @@ -620,10 +616,6 @@ static void sbxfi_capture_stop(struct sbxfi *chip, struct sbxfi_port *port) val = sbxfi_read(chip, SRCCTL(port->src[1])); val &= ~0x0f; sbxfi_write(chip, SRCCTL(port->src[1]), val); -#if 0 /* XXX */ - /* Disable SRC inputs from Audio Ring */ - sbxfi_write(chip, SRC_MASTER_CTL, 0x0); -#endif }
/* some sync of reset sequence */ @@ -900,6 +892,8 @@ static void sbxfi_clear_tlb(struct sbxfi *chip, struct sbxfi_port *port) port->tlb_pages = 0; port->tlb_index = -1; if (!chip->used_pages) { + /* Disable SRC inputs from Audio Ring */ + sbxfi_write(chip, SRC_MASTER_CTL, 0x0); LOG(1, "Disabling TLB buffer\n"); sbxfi_write(chip, TRANS_TLB_PHY_ADDR_LO_0, 0); sbxfi_write(chip, TRANS_TLB_PHY_ADDR_HI_0, 0); @@ -938,6 +932,8 @@ static int sbxfi_setup_tlb(struct sbxfi *chip, struct sbxfi_port *port, sbxfi_write(chip, TRANS_TLB_PHY_ADDR_LO_0, (u32)chip->tlb.addr); sbxfi_write(chip, TRANS_TLB_PHY_ADDR_HI_0, upper_32_bits(chip->tlb.addr)); + /* Enable SRC input from Audio Ring */ + sbxfi_write(chip, SRC_MASTER_CTL, 0x1); } chip->used_pages += pages;
@@ -977,10 +973,6 @@ static struct sbxfi_port *sbxfi_port_alloc(struct sbxfi *chip, port->src[1] = src + 1; LOG(1, "Allocate SRC %d\n", src); spin_lock_irq(&chip->port_lock); - if (list_empty(&chip->port_list)) { - /* Enable SRC input from Audio Ring */ - sbxfi_write(chip, SRC_MASTER_CTL, 0x1); - } list_add(&port->list, &chip->port_list); spin_unlock_irq(&chip->port_lock); return port; @@ -992,10 +984,6 @@ static void sbxfi_port_free(struct sbxfi *chip, struct sbxfi_port *port) return; spin_lock_irq(&chip->port_lock); list_del(&port->list); - if (list_empty(&chip->port_list)) { - /* Disable SRC inputs from Audio Ring */ - sbxfi_write(chip, SRC_MASTER_CTL, 0x0); - } spin_unlock_irq(&chip->port_lock); LOG(1, "Release SRC %d\n", port->src[0]); bitmap_release_region(chip->src_bitmap, port->src[0], 1); @@ -1338,7 +1326,6 @@ static int sbxfi_playback_close(struct snd_pcm_substream *substream) { struct sbxfi *chip = snd_pcm_substream_chip(substream); struct sbxfi_port *port = substream->runtime->private_data; - sbxfi_cleanup_play_mapper(chip, port); sbxfi_port_free(chip, port); return 0; } @@ -1379,6 +1366,7 @@ static int sbxfi_pcm_hw_params(struct snd_pcm_substream *substream, unsigned int bytes = params_buffer_bytes(hw_params); int err;
+ sbxfi_cleanup_play_mapper(chip, port); sbxfi_clear_tlb(chip, port); err = snd_pcm_lib_malloc_pages(substream, bytes); if (err < 0) @@ -1396,6 +1384,7 @@ static int sbxfi_pcm_hw_free(struct snd_pcm_substream *substream) struct sbxfi *chip = snd_pcm_substream_chip(substream); struct sbxfi_port *port = substream->runtime->private_data;
+ sbxfi_cleanup_play_mapper(chip, port); sbxfi_clear_tlb(chip, port); return snd_pcm_lib_free_pages(substream); }