+
+ if(sb16) {
+ irq = 0;
+ irqsel = read_mix(MIX_IRQ_SEL);
+ for(j=0; j<4; j++) {
+ if(irqsel & (1 << j)) {
+ irq = irqtab[j];
+ break;
+ }
+ }
+ if(!irq) {
+ /* try to force IRQ 5 */
+ write_mix(2, MIX_IRQ_SEL); /* bit1 selects irq 5 */
+
+ /* re-read to verify */
+ irqsel = read_mix(MIX_IRQ_SEL);
+ if(irqsel != 2) {
+ printf("sb_detect: failed to configure IRQ\n");
+ return 0;
+ }
+ irq = 5;
+ }
+
+ dma_chan = -1;
+ dma16_chan = -1;
+ dmasel = read_mix(MIX_DMA_SEL);
+ for(j=0; j<4; j++) {
+ if(dmasel & (1 << j)) {
+ dma_chan = dmatab[j];
+ break;
+ }
+ }
+ for(j=5; j<8; j++) {
+ if(dmasel & (1 << j)) {
+ dma16_chan = dmatab[j];
+ break;
+ }
+ }
+ if(dma_chan == -1) {
+ /* try to force DMA 1 */
+ dmasel |= 2;
+ }
+ if(dma16_chan == -1) {
+ /* try to force 16bit DMA 5 */
+ dmasel |= 0x20;
+ }
+
+ if(dma_chan == -1 || dma16_chan == -1) {
+ write_mix(dmasel, MIX_DMA_SEL);
+
+ /* re-read to verify */
+ tmp = read_mix(MIX_DMA_SEL);
+ if(tmp != dmasel) {
+ printf("sb_detect: failed to configure DMA\n");
+ return 0;
+ }
+ dma_chan = 1;
+ dma16_chan = 5;
+ }
+
+ printf("sb_detect: found %s (DSP v%d.%02d) at port %xh, irq %d, dma %d/%d\n",
+ sbname(ver), VER_MAJOR(ver), VER_MINOR(ver),
+ base_port, irq, dma_chan, dma16_chan);
+
+ } else {
+ /* XXX for old sound blasters, hard-code to IRQ 5 DMA 1 for now */
+ irq = 5;
+ dma_chan = 1;
+ dma16_chan = -1;
+
+ printf("sb_detect: found %s (DSP v%d.%02d) at port %xh\n", sbname(ver),
+ VER_MAJOR(ver), VER_MINOR(ver), base_port);
+ printf("sb_detect: old sound blaster dsp. assuming: irq 5, dma 1\n");
+ }
+