Solution
This issue is caused by a bug related to the SMBALERT_DIS bit in the SLVCMD register. When this bit is not configured correctly, the i801_smbus driver continuously polls for interrupts, resulting in high CPU usage.
Before implementing the solution, verify that:
- The controller is an NI cRIO-904x Revision C (normal or TPM variant). Refer to Find the Revision of NI Hardware for instructions on determining the hardware revision.
- Excessive interrupts are observed for
i801_SMB by running the following command from the controller console:
This issue was caused by a SMBALERT_DIS bit of SLVCMD register that enables polling on i801_smbus interrupt, which increases the CPU usage. This was determined to be a bug. There are several solutions to this issue, depending on NI Linux Real-Time versions installed on NI cRIO 904x.
A rapidly increasing interrupt count on IRQ20 i801_smbus indicates that the controller is affected by this issue.
Also determine the installed NI Linux Real-Time version from NI MAX>>System Settings, as the corrective action depends on the operating system version.

If NI Linux Real-Time Version Is Later Than x64 4.9.47-rt37-6.0.0f1 (NI CompactRIO 18.5)
- Update the BIOS on the NI cRIO-904x to version 2.0.3f0 or later.
- Download the latest BIOS from the cRIO-904x Firmware and Additional Drivers download page.
- Follow the instructions in the CompactRIO 904x Firmware and Additional Drivers Readme to complete the BIOS update.
Note: BIOS downgrades are not supported and Emerson T&M is not responsible for issues resulting from a BIOS downgrade.
If NI Linux Real-Time Version Is x64 4.9.47-rt37-6.0.0f1 (NI CompactRIO 18.5) or Earlier
Implement either Method 1 or Method 2.
Method 1: Create an RTOS Startup Script to Configure the SMBALERT_DIS Bit
- Update the BIOS on the NI cRIO-904x to version 2.0.3f0 or later.
- Reboot the controller and establish an SSH connection. Refer to Accessing the Shell on NI Linux Real-Time Devices for instructions.
- Create the startup script by entering the following commands:
cat > /etc/rc5.d/S01smbfix
#!/bin/bash
devmem 0x91612011 8 0x5
- Press
<Ctrl-D> to save the file. - Make the script executable:
chmod +x /etc/rc5.d/S01smbfix
-
The following example shows the creation of the startup script and setting execute permissions:
- Reboot the controller from NI MAX.
- Reconnect through SSH and verify the configuration:
devmem 0x91612011 8
-
Run the following command to confirm that excessive
i801_smbus interrupts are no longer occurring:
cat /proc/interrupts
- Run cat /proc/interrupts command and check whether high CPU usage on i801_smbus interrupt is resolved:
Method 2: Configure modprobe to Ignore i801_smbus Interrupts
-
Establish an SSH connection to the controller. Refer to Accessing the Shell on NI Linux Real-Time Devices for instructions.
-
Run the following command:
echo "options i2c-i801 disable_features=0x10" >> /etc/modprobe.d/i2c-i801.conf && reboot
-
After the controller reboots, reconnect through SSH and run:
-
Verify that the interrupt count for i801_smbus is no longer increasing excessively.