Re: 2.6.4-rc2-mm1: IPMI_SMB doesnt compile

Corey Minyard
2004-03-10T16:01:16Z

[-- Attachment #1: Type: text/plain, Size: 1909 bytes --]

You need to run off the panic events, the config flag IPMI_PANIC_EVENT,
and it should compile fine. This is a flag that causes the driver to
put some information about the panic into an event log in the IPMI
controller so it can be fetched later.

To do this, the driver needs a way to run each operation to completion
without scheduling, interrupts. or the like. It needs this to do send
the panic event (since you cannot schedule during a panic), although it
also really needs it to do things like extend the watchdog timer time at
panic time. The I2C driver does not currently have this, so it doesn't
work with this option and the SMBus driver.

I have included a patch from Todd Davis at Intel that adds this function
to the I2C driver. I believe Todd has been working on getting this in
through the I2C driver writers, although the patch is fairly non-intrusive.

However, I have no real way to test this patch.

-Corey

Adrian Bunk wrote:

>On Sun, Mar 07, 2004 at 10:32:21PM -0800, Andrew Morton wrote:
>
>
>>...
>>+ipmi-updates-3.patch
>>+ipmi-socket-interface.patch
>>
>> IPMI driver updates
>>...
>>
>>
>
>This causes the following compile error:
>
><-- snip -->
>
>...
> CC drivers/char/ipmi/ipmi_smb.o
>drivers/char/ipmi/ipmi_smb.c: In function `smbus_client_read_block_data':
>drivers/char/ipmi/ipmi_smb.c:224: warning: implicit declaration of
>function `i2c_set_spin_delay'
>...
> LD .tmp_vmlinux1
>drivers/built-in.o(.text+0x1342eb): In function
>`smbus_client_read_block_data':
>: undefined reference to `i2c_set_spin_delay'
>drivers/built-in.o(.text+0x13448d): In function
>`smbus_client_write_block_data':
>: undefined reference to `i2c_set_spin_delay'
>drivers/built-in.o(.text+0x134b7f): In function `set_run_to_completion':
>: undefined reference to `i2c_set_spin_delay'
>make: *** [.tmp_vmlinux1] Error 1
>
><-- snip -->
>
>
>cu
>Adrian
>
>
>

[-- Attachment #2: linux-ipmi-2.6.3-i2c-spin.diff --]
[-- Type: text/plain, Size: 1562 bytes --]

--- linux-v31/drivers/i2c/i2c-core.c 2004-02-19 19:31:07.000000000 -0600
+++ linux/drivers/i2c/i2c-core.c 2004-03-10 09:48:08.000000000 -0600
@@ -1256,6 +1256,12 @@
return (func & adap_func) == func;
}

+int i2c_spin_delay;
+void i2c_set_spin_delay(int val)
+{
+ i2c_spin_delay = val;
+}
+
EXPORT_SYMBOL(i2c_add_adapter);
EXPORT_SYMBOL(i2c_del_adapter);
EXPORT_SYMBOL(i2c_add_driver);
@@ -1292,6 +1298,8 @@

EXPORT_SYMBOL(i2c_get_functionality);
EXPORT_SYMBOL(i2c_check_functionality);
+EXPORT_SYMBOL(i2c_set_spin_delay);
+EXPORT_SYMBOL(i2c_spin_delay);

MODULE_AUTHOR("Simon G. Vogl <simon@tk.uni-linz.ac.at>");
MODULE_DESCRIPTION("I2C-Bus main module");
--- linux-v31/include/linux/i2c.h 2003-12-17 20:58:16.000000000 -0600
+++ linux/include/linux/i2c.h 2004-03-10 09:47:21.000000000 -0600
@@ -600,10 +600,24 @@
((adapptr)->algo->id == I2C_ALGO_ISA)

/* Tiny delay function used by the i2c bus drivers */
+
+extern void i2c_set_spin_delay(int val);
+extern int i2c_spin_delay;
+#include <asm/delay.h>
static inline void i2c_delay(signed long timeout)
{
- set_current_state(TASK_INTERRUPTIBLE);
- schedule_timeout(timeout);
+ if( i2c_spin_delay ) {
+ /* spin delay is needed for panic threads and
+ shutdowns to avoid processing switching so IPMI
+ messages can be sent to the Baseboard Management
+ Controllers on the SMBus*/
+ int i;
+ for( i=0 ; i<100 ; i++ )
+ udelay(timeout*(1000000/HZ/100));
+ } else {
+ set_current_state(TASK_INTERRUPTIBLE);
+ schedule_timeout(timeout);
+ }
}

#endif /* _LINUX_I2C_H */