ichsmb driver not loading on Intel SE7501CW2 motherboard

Michael A. Hovan III mhovan+freebsd at hovan.org
Sun Dec 21 20:19:52 PST 2003


Hello,

A colleague and I are currently having difficulty building a FreeBSD 
4.9 kernel that loads the ichsmb driver on an Intel SE7501CW2 
motherboard.  There appears to be some sort of problem mapping an 
interrupt to the device, as illustrated by the following boot message:

ichsmb0: <Intel 82801CA (ICH3) SMBus controller> port 0x1100-0x111f irq 
0
   at device 31.3 on pci0
pci_cfgintr_virgin: using routable interrupt 3
pci_cfgintr: ROUTE_INTERRUPT failed.
smbus0: <System Management Bus> on ichsmb0
smb0: <SMBus general purpose I/O> on smbus0

At some point near the end of the boot the console hangs, and the 
machine is in an unstable condition.  When we do not load the ichsmb 
driver, the boot works fine, but the SMBus (obviously) does not work.

As an experiment we built a 5.1 kernel which included the driver and it 
loaded fine, due to the addition of an ACPI/PCI bus driver in 5.x.  We 
were then able to run utilities which interrogated devices on the 
system management bus.  We are a little hesitant to put 5.x into 
service in a production environment at this time.  So, we would really 
like to get this working on the 4.x series.

The particular goal is to get the fan monitoring info from the Maxim 
MAX6651 chip that is on this motherboard, which appears to only support 
an SMBus interface.

We have tried this with and without ACPI, with and without APM, and 
with and without an SMP kernel, and there is no difference.


Further info that might be enlightening:

When the boot hangs, we are able to ssh into the machine remotely, 
although the console remains frozen.  When we try to run the monitoring 
utility we wrote, *it actually works* -- we get the correct fan 
information back from the max6651 chip, through the smbus interface.  
Even though the interrupt was unassigned, the smbus still worked.

However, I did notice that any call to usleep() from a userland program 
will hang infinitely.  Our guess is that this is the reason the boot 
hangs; one of the startup utilities calls usleep().


Still further info that might be enlightening to kernel folk:

This is out of our depth, but on a lark, we found the line of code that 
printed the "ROUTE_INTERRUPT failed" message, which is in the 
pci_cfgintr() function in /usr/src/sys/i386/isa/pci_cfgreg.c .  It 
returns 255 to indicate that the interrupt routing failed.  If we 
comment out the "return(255);" line and rebuild the kernel, which 
causes the value 3 (the interrupt it was trying to route) to get 
returned, the boot will no longer hang -- but the SMBus now no longer 
works.

Any suggestions on how to make this work, other things we could try, or 
other debugging information we should look at would be appreciated.

Thanks,

Mike & Carl




More information about the freebsd-hardware mailing list