From owner-freebsd-bugs Tue Mar 4 10:25:22 2003 Delivered-To: freebsd-bugs@hub.freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id EC02137B401 for ; Tue, 4 Mar 2003 10:25:09 -0800 (PST) Received: from freefall.freebsd.org (freefall.freebsd.org [216.136.204.21]) by mx1.FreeBSD.org (Postfix) with ESMTP id B00A243FA3 for ; Tue, 4 Mar 2003 10:24:56 -0800 (PST) (envelope-from gnats@FreeBSD.org) Received: from freefall.freebsd.org (gnats@localhost [127.0.0.1]) by freefall.freebsd.org (8.12.6/8.12.6) with ESMTP id h24IA2NS033697 for ; Tue, 4 Mar 2003 10:10:02 -0800 (PST) (envelope-from gnats@freefall.freebsd.org) Received: (from gnats@localhost) by freefall.freebsd.org (8.12.6/8.12.6/Submit) id h24IA2Hb033696; Tue, 4 Mar 2003 10:10:02 -0800 (PST) Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 63D3437B401 for ; Tue, 4 Mar 2003 10:02:38 -0800 (PST) Received: from wrzx35.rz.uni-wuerzburg.de (wrzx35.rz.uni-wuerzburg.de [132.187.3.35]) by mx1.FreeBSD.org (Postfix) with ESMTP id 59E5243F93 for ; Tue, 4 Mar 2003 10:02:36 -0800 (PST) (envelope-from q@coyote.dnsalias.net) Received: from wrzx34.rz.uni-wuerzburg.de (wrzx34.rz.uni-wuerzburg.de [132.187.3.34]) by wrzx35.rz.uni-wuerzburg.de (8.8.8/8.8.8/uniwue-MM-1.05) with ESMTP id TAA336130 for ; Tue, 4 Mar 2003 19:02:35 +0100 (CET) Received: from virusscan (localhost [127.0.0.1]) by wrzx34.rz.uni-wuerzburg.de (Postfix) with ESMTP id D13EB678A2 for ; Tue, 4 Mar 2003 19:02:34 +0100 (CET) Received: from wrzx07.rz.uni-wuerzburg.de ([132.187.1.7]) by virusscan (wrzx34 [132.187.3.34:25]) (amavisd-new) with ESMTP id 29557-08 for ; Tue, 4 Mar 2003 19:02:34 +0100 (CET) Received: from spamchecker (localhost [127.0.0.1]) by wrzx07.rz.uni-wuerzburg.de (Postfix) with ESMTP id 2B2474762 for ; Tue, 4 Mar 2003 19:02:31 +0100 (CET) Received: from coyote.dnsalias.net (gb-007.galgenberg.net [132.187.222.7]) by wrzx07.rz.uni-wuerzburg.de (Postfix) with ESMTP id 6FE22471C for ; Tue, 4 Mar 2003 19:02:30 +0100 (CET) Received: from coyote.dnsalias.net (q@localhost [127.0.0.1]) by coyote.dnsalias.net (8.12.6/8.12.6) with ESMTP id h24I2TjM050282 for ; Tue, 4 Mar 2003 19:02:30 +0100 (CET) (envelope-from q@coyote.dnsalias.net) Received: (from q@localhost) by coyote.dnsalias.net (8.12.6/8.12.7/Submit) id h24I2SM1050281; Tue, 4 Mar 2003 19:02:28 +0100 (CET) Message-Id: <200303041802.h24I2SM1050281@coyote.dnsalias.net> Date: Tue, 4 Mar 2003 19:02:28 +0100 (CET) From: Ulrich Spoerlein To: FreeBSD-gnats-submit@FreeBSD.org X-Send-Pr-Version: 3.113 Subject: kern/48927: pcm: setting samplerate below 3400 or above 48700 will result in infinte loop in channel.c:chn_tryspeed() Sender: owner-freebsd-bugs@FreeBSD.ORG Precedence: bulk List-ID: List-Archive: (Web Archive) List-Help: (List Instructions) List-Subscribe: List-Unsubscribe: X-Loop: FreeBSD.org >Number: 48927 >Category: kern >Synopsis: pcm: setting samplerate below 3400 or above 48700 will result in infinte loop in channel.c:chn_tryspeed() >Confidential: no >Severity: serious >Priority: medium >Responsible: freebsd-bugs >State: open >Quarter: >Keywords: >Date-Required: >Class: sw-bug >Submitter-Id: current-users >Arrival-Date: Tue Mar 04 10:10:02 PST 2003 >Closed-Date: >Last-Modified: >Originator: Ulrich Spoerlein >Release: FreeBSD 4.7-STABLE i386 >Organization: >Environment: System: FreeBSD coyote.dnsalias.net 4.7-STABLE FreeBSD 4.7-STABLE #0: Thu Jan 23 14:05:57 CET 2003 root@roadrunner:/usr/obj/usr/src/sys/COYOTE i386 Copyright (c) 1992-2003 The FreeBSD Project. Copyright (c) 1979, 1980, 1983, 1986, 1988, 1989, 1991, 1992, 1993, 1994 The Regents of the University of California. All rights reserved. FreeBSD 4.8-RC #3: Tue Mar 4 18:19:11 CET 2003 root@roadrunner:/usr/obj/usr/src/sys/ROADRUNNER Timecounter "i8254" frequency 1193182 Hz CPU: Intel Celeron (902.05-MHz 686-class CPU) Origin = "GenuineIntel" Id = 0x686 Stepping = 6 Features=0x383f9ff real memory = 402640896 (393204K bytes) avail memory = 386125824 (377076K bytes) Preloaded elf kernel "kernel" at 0xc04ee000. Preloaded elf module "nvidia.ko" at 0xc04ee09c. link_elf: symbol linux_ioctl_register_handler undefined VESA: v3.0, 16384k memory, flags:0x1, mode table:0xc0332302 (1000022) VESA: NVidia netsmb_dev: loaded Pentium Pro MTRR support enabled md0: Malloc disk Using $PIR table, 6 entries at 0xc00f0d10 apm0: on motherboard apm0: found APM BIOS v1.2, connected at v1.2 npx0: on motherboard npx0: INT 16 interface pcib0: on motherboard pci0: on pcib0 agp0: mem 0xe4000000-0xe7ffffff at device 0.0 on pci0 pcib1: at device 1.0 on pci0 pci1: on pcib1 pci1: at 0.0 irq 11 isab0: at device 4.0 on pci0 isa0: on isab0 atapci0: port 0xd800-0xd80f at device 4.1 on pci0 ata0: at 0x1f0 irq 14 on atapci0 ata1: at 0x170 irq 15 on atapci0 pci0: at 4.2 irq 5 intpm0: port 0xe800-0xe80f irq 9 at device 4.3 on pci0 intpm0: I/O mapped e800 intpm0: intr IRQ 9 enabled revision 0 smbus0: on intsmb0 smb0: on smbus0 intpm0: PM I/O mapped e400 pcm0: port 0xd000-0xd01f irq 5 at device 9.0 on pci0 pcm0: bktr0: mem 0xd7000000-0xd7000fff irq 7 at device 11.0 on pci0 iicbb0: on bti2c0 iicbus0: on iicbb0 master-only iicsmb0: on iicbus0 smbus1: on iicsmb0 smb1: on smbus1 iicbus1: on iicbb0 master-only iicsmb1: on iicbus1 smbus2: on iicsmb1 smb2: on smbus2 smbus3: on bti2c0 smb3: on smbus3 bktr0: Hauppauge Model 44354 C221 bktr0: Detected a MSP3415D-B3 at 0x80 bktr0: Hauppauge WinCast/TV, Philips FR1216 PAL FM tuner, msp3400c stereo, remote control. pci0: (vendor=0x109e, dev=0x0878) at 11.1 irq 7 xl0: <3Com 3c905B-TX Fast Etherlink XL> port 0xb400-0xb47f mem 0xd4800000-0xd480007f irq 11 at device 12.0 on pci0 xl0: Ethernet address: 00:10:5a:d9:e7:4c miibus0: on xl0 xlphy0: <3Com internal media interface> on miibus0 xlphy0: 10baseT, 10baseT-FDX, 100baseTX, 100baseTX-FDX, auto fdc0: at port 0x3f0-0x3f5,0x3f7 irq 6 drq 2 on isa0 fdc0: FIFO enabled, 8 bytes threshold fd0: <1440-KB 3.5" drive> on fdc0 drive 0 atkbdc0: at port 0x60,0x64 on isa0 atkbd0: flags 0x1 irq 1 on atkbdc0 kbd0 at atkbd0 psm0: flags 0x8 irq 12 on atkbdc0 psm0: model IntelliMouse, device ID 3 vga0: at port 0x3c0-0x3df iomem 0xa0000-0xbffff on isa0 sc0: at flags 0x100 on isa0 sc0: VGA <16 virtual consoles, flags=0x300> sio0 at port 0x3f8-0x3ff irq 4 flags 0x10 on isa0 sio0: type 16550A sio1 at port 0x2f8-0x2ff irq 3 on isa0 sio1: type 16550A ppc0: at port 0x378-0x37f flags 0x8 on isa0 ppc0: SMC-like chipset (ECP-only) in ECP mode ppc0: FIFO with 16/16/9 bytes threshold ppbus0: IEEE1284 device found Probing for PnP devices on ppbus0: lpt0: on ppbus0 lpt0: Polled port ppi0: on ppbus0 ad0: 76351MB [155127/16/63] at ata0-master UDMA33 acd0: CD-RW at ata1-master UDMA33 Mounting root from ufs:/dev/ad0s2a cd0 at ata1 bus 0 target 0 lun 0 cd0: Removable CD-ROM SCSI-0 device cd0: 33.000MB/s transfers cd0: Attempt to query device size failed: NOT READY, Medium not present - tray closed cd9660: Joliet Extension (Level 1) nvidia0: mem 0xd8000000-0xdfffffff,0xd5000000-0xd5ffffff irq 11 at device 0.0 on pci1 pciconf -vl pcm0@pci0:9:0: class=0x040100 card=0x00201102 chip=0x00021102 rev=0x05 hdr=0x00 vendor = 'Creative Labs' device = 'EMU10K1 Audio Chipset (SB Live!)' class = multimedia subclass = audio emujoy0@pci0:9:1: class=0x098000 card=0x00201102 chip=0x70021102 rev=0x05 hdr=0x00 vendor = 'Creative Labs' device = 'PCI Gameport Joystick' class = input device >Description: While debugging WINE on FreeBSD I noticed that it was unable to _try_ setting /dev/dsp to 96kHz. It wants to try 96000, 48000, 44100, .. etc, Hz and takes the first one that got set correctly. Sadly it will enter an infinite loop while doing this ioctl: rc = 96000; ioctl(fd, SNDCTL_DSP_SPEED, &rc) I then tried which rates would cleanly exit the ioctl(), and which ones would cause infinite loops. Looks like anything below 3400 and above 48700 will cause this behaviour. A ktrace/kdump will look like this: 1982 oss-test CALL write(0x1,0x804b000,0x1f) 1982 oss-test GIO fd 1 wrote 31 bytes "setting sampling rate to 48000 " 1982 oss-test RET write 31/0x1f 1982 oss-test CALL ioctl(0x3,SNDCTL_DSP_SPEED,0xbfbff558) 1982 oss-test RET ioctl 0 1982 oss-test CALL write(0x1,0x804b000,0x1f) 1982 oss-test GIO fd 1 wrote 31 bytes "setting sampling rate to 96000 " 1982 oss-test RET write 31/0x1f 1982 oss-test CALL ioctl(0x3,SNDCTL_DSP_SPEED,0xbfbff558) 1982 oss-test RET ioctl RESTART 1982 oss-test CALL ioctl(0x3,SNDCTL_DSP_SPEED,0xbfbff558) 1982 oss-test RET ioctl RESTART 1982 oss-test CALL ioctl(0x3,SNDCTL_DSP_SPEED,0xbfbff558) 1982 oss-test RET ioctl RESTART 1982 oss-test CALL ioctl(0x3,SNDCTL_DSP_SPEED,0xbfbff558) 1982 oss-test RET ioctl RESTART 1982 oss-test CALL ioctl(0x3,SNDCTL_DSP_SPEED,0xbfbff558) 1982 oss-test RET ioctl RESTART 1982 oss-test CALL ioctl(0x3,SNDCTL_DSP_SPEED,0xbfbff558) 1982 oss-test RET ioctl RESTART 1982 oss-test CALL ioctl(0x3,SNDCTL_DSP_SPEED,0xbfbff558) 1982 oss-test RET ioctl RESTART [....] (I included the call with 48000 to make the normal behaviuor clear) truss looks similiar: setting sampling rate to 48000 write(1,0x804b000,31) = 31 (0x1f) ioctl(3,SNDCTL_DSP_SPEED,0xbfbff524) = 0 (0x0) setting sampling rate to 96000 write(1,0x804b000,31) = 31 (0x1f) ioctl(3,SNDCTL_DSP_SPEED,0xbfbff524) ERR#54 'Connection reset by peer' ioctl(3,SNDCTL_DSP_SPEED,0xbfbff524) ERR#54 'Connection reset by peer' ioctl(3,SNDCTL_DSP_SPEED,0xbfbff524) ERR#54 'Connection reset by peer' ioctl(3,SNDCTL_DSP_SPEED,0xbfbff524) ERR#54 'Connection reset by peer' ioctl(3,SNDCTL_DSP_SPEED,0xbfbff524) ERR#54 'Connection reset by peer' [...] I then turned on debugging printf() in the pcm-driver. Here is the output with rates between 8000 - 48000Hz /kernel: pcm0: port 0xd000-0xd01f irq 5 at device 9.0 on pci0 /kernel: pcm0: /kernel: want format 8 /kernel: not mapped, feederflags 0 /kernel: setspeed, channel pcm0:play:0 /kernel: want speed 8000, try speed 8000, got speed 8000 /kernel: not mapped, feederflags 0 /kernel: r = 0 /kernel: chn_setblocksize(0, 0) /kernel: chn_setblocksize: defaulting to (1024, 128) /kernel: chn_setblocksize: soft bps 1, spd 8000, irqhz == 62 /kernel: chn_setblocksize: hard blksz requested 128 (maxsize 4096), got 128, irqhz == 62 /kernel: setspeed done, r = 0 /kernel: setspeed, channel pcm0:play:0 /kernel: want speed 8000, try speed 8000, got speed 8000 /kernel: not mapped, feederflags 0 /kernel: r = 0 /kernel: chn_setblocksize(0, 0) /kernel: chn_setblocksize: defaulting to (1024, 128) /kernel: chn_setblocksize: soft bps 1, spd 8000, irqhz == 62 /kernel: chn_setblocksize: hard blksz requested 128 (maxsize 4096), got 128, irqhz == 62 /kernel: setspeed done, r = 0 /kernel: chn_setblocksize(0, 0) /kernel: chn_setblocksize: defaulting to (1024, 128) /kernel: chn_setblocksize: soft bps 1, spd 8000, irqhz == 62 /kernel: chn_setblocksize: hard blksz requested 128 (maxsize 4096), got 128, irqhz == 62 /kernel: SNDCTL_DSP_SETFRAGMENT 0x0020000b /kernel: SNDCTL_DSP_SETFRAGMENT 32 frags, 2048 sz /kernel: chn_setblocksize(32, 2048) /kernel: chn_setblocksize: soft bps 1, spd 8000, irqhz == 3 /kernel: chn_setblocksize: hard blksz requested 256 (maxsize 4096), got 256, irqhz == 31 /kernel: want format 16 /kernel: not mapped, feederflags 0 /kernel: setspeed, channel pcm0:play:0 /kernel: want speed 8000, try speed 8000, got speed 8000 /kernel: not mapped, feederflags 0 /kernel: r = 0 /kernel: chn_setblocksize(0, 0) /kernel: chn_setblocksize: updating (32, 2048) /kernel: chn_setblocksize: soft bps 2, spd 8000, irqhz == 7 /kernel: chn_setblocksize: hard blksz requested 512 (maxsize 4096), got 512, irqhz == 31 /kernel: setspeed done, r = 0 /kernel: want format 268435472 /kernel: not mapped, feederflags 0 /kernel: setspeed, channel pcm0:play:0 /kernel: want speed 8000, try speed 8000, got speed 8000 /kernel: not mapped, feederflags 0 /kernel: r = 0 /kernel: chn_setblocksize(0, 0) /kernel: chn_setblocksize: updating (32, 2048) /kernel: chn_setblocksize: soft bps 4, spd 8000, irqhz == 15 /kernel: chn_setblocksize: hard blksz requested 1024 (maxsize 4096), got 1024, irqhz == 31 /kernel: setspeed done, r = 0 /kernel: setspeed, channel pcm0:play:0 /kernel: want speed 8000, try speed 8000, got speed 8000 /kernel: not mapped, feederflags 0 /kernel: r = 0 /kernel: chn_setblocksize(0, 0) /kernel: chn_setblocksize: updating (32, 2048) /kernel: chn_setblocksize: soft bps 4, spd 8000, irqhz == 15 /kernel: chn_setblocksize: hard blksz requested 1024 (maxsize 4096), got 1024, irqhz == 31 /kernel: setspeed done, r = 0 /kernel: setspeed, channel pcm0:play:0 /kernel: want speed 11025, try speed 11025, got speed 11025 /kernel: not mapped, feederflags 0 /kernel: r = 0 /kernel: chn_setblocksize(0, 0) /kernel: chn_setblocksize: updating (32, 2048) /kernel: chn_setblocksize: soft bps 4, spd 11025, irqhz == 21 /kernel: chn_setblocksize: hard blksz requested 2048 (maxsize 4096), got 2048, irqhz == 21 /kernel: setspeed done, r = 0 /kernel: setspeed, channel pcm0:play:0 /kernel: want speed 16000, try speed 16000, got speed 16000 /kernel: not mapped, feederflags 0 /kernel: r = 0 /kernel: chn_setblocksize(0, 0) /kernel: chn_setblocksize: updating (32, 2048) /kernel: chn_setblocksize: soft bps 4, spd 16000, irqhz == 31 /kernel: chn_setblocksize: hard blksz requested 2048 (maxsize 4096), got 2048, irqhz == 31 /kernel: setspeed done, r = 0 /kernel: setspeed, channel pcm0:play:0 /kernel: want speed 22050, try speed 22050, got speed 22050 /kernel: not mapped, feederflags 0 /kernel: r = 0 /kernel: chn_setblocksize(0, 0) /kernel: chn_setblocksize: updating (32, 2048) /kernel: chn_setblocksize: soft bps 4, spd 22050, irqhz == 43 /kernel: chn_setblocksize: hard blksz requested 2048 (maxsize 4096), got 2048, irqhz == 43 /kernel: setspeed done, r = 0 /kernel: setspeed, channel pcm0:play:0 /kernel: want speed 24000, try speed 24000, got speed 24000 /kernel: not mapped, feederflags 0 /kernel: r = 0 /kernel: chn_setblocksize(0, 0) /kernel: chn_setblocksize: updating (32, 2048) /kernel: chn_setblocksize: soft bps 4, spd 24000, irqhz == 46 /kernel: chn_setblocksize: hard blksz requested 2048 (maxsize 4096), got 2048, irqhz == 46 /kernel: setspeed done, r = 0 /kernel: setspeed, channel pcm0:play:0 /kernel: want speed 32000, try speed 32000, got speed 32000 /kernel: not mapped, feederflags 0 /kernel: r = 0 /kernel: chn_setblocksize(0, 0) /kernel: chn_setblocksize: updating (32, 2048) /kernel: chn_setblocksize: soft bps 4, spd 32000, irqhz == 62 /kernel: chn_setblocksize: hard blksz requested 2048 (maxsize 4096), got 2048, irqhz == 62 /kernel: setspeed done, r = 0 /kernel: setspeed, channel pcm0:play:0 /kernel: want speed 44100, try speed 44100, got speed 44100 /kernel: not mapped, feederflags 0 /kernel: r = 0 /kernel: chn_setblocksize(0, 0) /kernel: chn_setblocksize: updating (32, 2048) /kernel: chn_setblocksize: soft bps 4, spd 44100, irqhz == 86 /kernel: chn_setblocksize: hard blksz requested 2048 (maxsize 4096), got 2048, irqhz == 86 /kernel: setspeed done, r = 0 /kernel: chn_flush c->flags 0x00013000 /kernel: chn_setblocksize(0, 0) /kernel: chn_setblocksize: defaulting to (32, 4096) /kernel: chn_setblocksize: soft bps 4, spd 44100, irqhz == 43 /kernel: chn_setblocksize: hard blksz requested 2048 (maxsize 4096), got 2048, irqhz == 86 And here comes the interessting part: /kernel: pcm0: port 0xd000-0xd01f irq 5 at device 9.0 on pci0 /kernel: pcm0: /kernel: , feederflags 10 ^^^^^ stack corruption? /kernel: find feeder type 4, got 0xc25a60e0 /kernel: added feeder 0xc25a60e0, output 10000010 /kernel: r = 0 /kernel: chn_setblocksize(0, 0) /kernel: chn_setblocksize: updating (32, 2048) /kernel: chn_setblocksize: soft bps 4, spd 96000, irqhz == 187 /kernel: chn_setblocksize: hard blksz requested 1024 (maxsize 4096), got 1024, irqhz == 187 /kernel: feedrate = 0xc268b400 /kernel: feeder_set(FEEDRATE_SRC, 96000) = -1 /kernel: setspeed done, r = -1 /kernel: Failed to set speed 96000 falling back to 8000 /kernel: setspeed, channel pcm0:play:0 /kernel: want speed 8000, try speed 8000, got speed 8000 /kernel: not mapped, feederflags 0 /kernel: r = 0 /kernel: chn_setblocksize(0, 0) /kernel: chn_setblocksize: updating (32, 2048) /kernel: chn_setblocksize: soft bps 4, spd 8000, irqhz == 15 /kernel: chn_setblocksize: hard blksz requested 1024 (maxsize 4096), got 1024, irqhz == 31 /kernel: setspeed done, r = 0 /kernel: setspeed, channel pcm0:play:0 /kernel: want speed 96000, try speed 48000, got speed 48000 /kernel: not mapped, feederflags 10 /kernel: find feeder type 4, got 0xc25a60e0 /kernel: added feeder 0xc25a60e0, output 10000010 /kernel: r = 0 /kernel: chn_setblocksize(0, 0) /kernel: chn_setblocksize: updating (32, 2048) /kernel: chn_setblocksize: sof, feederflags 10 /kernel: find feeder type 4, got 0xc25a60e0 /kernel: added feeder 0xc25a60e0, output 10000010 /kernel: r = 0 /kernel: chn_setblocksize(0, 0) /kernel: chn_setblocksize: updating (32, 2048) /kernel: chn_setblocksize: soft bps 4, spd 96000, irqhz == 187 /kernel: chn_setblocksize: hard blksz requested 1024 (maxsize 4096), got 1024, irqhz == 187 /kernel: feedrate = 0xc268b400 /kernel: feeder_set(FEEDRATE_SRC, 96000) = -1 /kernel: setspeed done, r = -1 /kernel: Failed to set speed 96000 falling back to 8000 /kernel: setspeed, channel pcm0:play:0 /kernel: want speed 8000, try speed 8000, got speed 8000 /kernel: not mapped, feederflags 0 /kernel: r = 0 /kernel: chn_setblocksize(0, 0) /kernel: chn_setblocksize: updating (32, 2048) /kernel: chn_setblocksize: soft bps 4, spd 8000, irqhz == 15 /kernel: chn_setblocksize: hard blksz requested 1024 (maxsize 4096), got 1024, irqhz == 31 /kernel: setspeed done, r = 0 /kernel: setspeed, channel pcm0:play:0 /kernel: want speed 96000, try speed 48000, got speed 48000 /kernel: not mapped, feederflags 10 /kernel: find feeder type 4, got 0xc25a60e0 /kernel: added feeder 0xc25a60e0, output 10000010 /kernel: r = 0 /kernel: chn_setblocksize(0, 0) /kernel: chn_setblocksize: updating (32, 2048) /kernel: ze: hard blksz requested 1024 (maxsize 4096), got 1024, irqhz == 187 ^^^^ stack corruption? /kernel: feedrate = 0xc268b400 /kernel: feeder_set(FEEDRATE_SRC, 96000) = -1 /kernel: setspeed done, r = -1 /kernel: Failed to set speed 96000 falling back to 8000 /kernel: setspeed, channel pcm0:play:0 /kernel: want speed 8000, try speed 8000, got speed 8000 /kernel: not mapped, feederflags 0 /kernel: r = 0 /kernel: chn_setblocksize(0, 0) /kernel: chn_setblocksize: updating (32, 2048) /kernel: chn_setblocksize: soft bps 4, spd 8000, irqhz == 15 /kernel: chn_setblocksize: hard blksz requested 1024 (maxsize 4096), got 1024, irqhz == 31 /kernel: setspeed done, r = 0 [endless loop] The obvious difference to the working example is feederflags=10 (and not 0) and it will enter the code in sys/dev/sound/pcm/channel.c at around line 830. There are several if (r) goto out; but I'm not sure which one the working example takes and which one causes the endless loop (I guess it has to do something with the return value in r. Any help is greatly appreciated, because I can't stop people from probing my hardware for 96kHz capability. >How-To-Repeat: Compile oss-test.c and see if it can set 96000 correctly. If it runs without problems, try the commented for/rc lines (these work for me, but setting i to anyhting below 3400 or above 48600 will lock /dev/dsp and eat up 100% CPU. >Fix: -CURRENT doesn't have the problem. A friend of mine, running 4.7-STABLE SMP with a SB PCI 512 doesn't have this problem too. --- oss-test.c begins here --- #include #include #include #include #include #include #include #include #include int main() { int fd, rc, i, bytesok = 0; audio_buf_info info; int frags; int rates[] = {96000, 48000, 44100, 32000, 24000, 22050, 16000, 11025, 8000}; void *p; fd = open("/dev/dsp", O_WRONLY | O_DIRECT); if (fd == -1) err(1, "can't open audio device"); frags = 0x0020000B; /* 64K buffer (32 * 2^11) */ if (ioctl(fd, SNDCTL_DSP_SETFRAGMENT, &frags) == -1) err(1, "can't set fragments"); if (ioctl(fd, SNDCTL_DSP_GETOSPACE, &info) == -1) err(1, "can't get info about i/o space"); rc = AFMT_S16_LE; if (ioctl(fd, SNDCTL_DSP_SAMPLESIZE, &rc) == -1) err(1, "can't set 16bit sample size"); rc = 1; if (ioctl(fd, SNDCTL_DSP_STEREO, &rc) == -1) err(1, "can't set stereo mode"); for (i=8; i > -1; i--) { rc = rates[i]; // for (i=3500; i < 48600; i += 100) { // rc = i; printf("setting sampling rate to %d\n", rc); if (ioctl(fd, SNDCTL_DSP_SPEED, &rc) == -1) err(1, "can't set sample rate to %d", rc); } printf("done\n"); exit (0); } --- oss-test.c ends here --- >Release-Note: >Audit-Trail: >Unformatted: To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-bugs" in the body of the message