resolving IRQ conflicts in FreeBSD on a ThinkPad A20m

(The wordy title is to help make sure anyone who needs it can find it.)

I have not had working audio on this laptop since FreeBSD 4.6 was released (or at least since I upgraded to it). Turns out I had an IRQ conflict with the internal PCI bus: the sound chip/card and the network interface were trying to share IRQ 11 and if the card was inserted at boot time, the sound driver (pcm) never attached to the sound card. Bummer.

After many, many Google searches and a couple of queries to the freebsd-mobile list, I finally hit on something that unlocked the puzzle. I saw some notifications about the sound driver’s failure to attach: that led to a discussion of an IBM tool (called PS2.EXE) that allows you to rejigger how IRQs are assigned. In my case I wanted the PCI bus to pick from more than one, in hopes the different drivers would take take separate ones.

It worked.

Here’s what the output of PS2.EXE looked like:


C:\>ps2 ? irq


Command Syntax : PS2 ? IRQ
Description : Display the current IRQ assignments.
Current State :
System IRQ Assignment

IRQ Level
3 4 5 7 9 10 11 15
Serial-A (3 or 4) : O
Parallel (5 or 7) : X
IR (3, 4, 5, 7) : X
Second IDE : O
PCI IRQ : O

where O: Currently assigned,
X: Will be assigned after “Enable” is selected,
*: Conflict with another device.

C:\>ps2 ? pciirq

Command Syntax : PS2 PCIIRQ Disable
First IRQ (Second IRQ) (Third IRQ) (Fourth IRQ)

Valid IRQs : 3|4|5|7|9|10|11|15

Assigned IRQ(s) : 11

Description : This command is to reserve the IRQ(s) for PCI devices.
When ‘Disable’ is specified, PCI device may not work
properly. To see the current system IRQ assignment,
type “PS2 ? IRQ”.

I assigned 11, 9, 7, and 5 to the PCI bus and that did the trick: the sound card took 7, the wireless NIC took 9, and all is well.

Since the ThinkPad A20[a|m] share circuitry with the 600X and I’m sure with some of the later A, T, and X models, this might be worth documenting.