From: David Barksdale <[EMAIL PROTECTED]>
This change allows the RadiSys ASCII serial driver to work on a wider
range of systems. When initializing the serial interface the driver now
tries two different commands to get the IPMB address of the controller.
Signed-off-by: David Barksdale <[EMAIL PROTECTED]>
---
--- drivers/char/ipmi/ipmi_serial_radisys_ascii.c.orig 2008-02-25
12:39:54.911766000 -0600
+++ drivers/char/ipmi/ipmi_serial_radisys_ascii.c 2008-02-25
12:02:25.000000000 -0600
@@ -292,15 +292,25 @@ static void ra_setup_termios(struct kter
return;
}
+#define RA_OEM1_NETFN 0x30
#define RA_CONTROLLER_OEM_NETFN 0x3e
#define RA_GET_IPMB_ADDR_CMD 0x12
-static unsigned char get_ipmbaddr_msg[] = { 0x01,
- RA_CONTROLLER_OEM_NETFN <<
2,
- 0x07, /* checksum1 */
- 0x00, /* source addr */
- 0x00, /* seq num/rsLUN */
- RA_GET_IPMB_ADDR_CMD,
- 0xee /* checksum2 */
+static unsigned char get_ipmbaddr_msg1[] = { 0x01, /* dest addr */
+ RA_OEM1_NETFN << 2,
+ 0x3f, /* checksum1 */
+ 0x01, /* source addr */
+ 0x00, /* seq num/rsLUN */
+ RA_GET_IPMB_ADDR_CMD,
+ 0xed /* checksum2 */
+};
+
+static unsigned char get_ipmbaddr_msg2[] = { 0x01, /* dest addr */
+ RA_CONTROLLER_OEM_NETFN <<
2,
+ 0x07, /* checksum1 */
+ 0x01, /* source addr */
+ 0x00, /* seq num/rsLUN */
+ RA_GET_IPMB_ADDR_CMD,
+ 0xed /* checksum2 */
};
static void handle_init_getipmbaddr(struct ipmi_serial_codec_data
*data,
@@ -313,12 +323,23 @@ static void handle_init_getipmbaddr(stru
return;
len--;
- if (((msg[1] >> 2) != (RA_CONTROLLER_OEM_NETFN | 1))
+ if (((msg[1] >> 2) != (RA_OEM1_NETFN | 1)
+ && (msg[1] >> 2) != (RA_CONTROLLER_OEM_NETFN | 1))
|| (msg[5] != RA_GET_IPMB_ADDR_CMD))
return;
if (msg[6] != 0) {
- ipmi_serial_ll_init_complete(data->info, -EINVAL);
+ if ((msg[1] >> 2) == (RA_OEM1_NETFN | 1)) {
+ unsigned long flags;
+
+ spin_lock_irqsave(&data->lock, flags);
+ format_msg(data, get_ipmbaddr_msg2,
+ sizeof(get_ipmbaddr_msg2));
+ try_to_send_data(data, &flags);
+ spin_unlock_irqrestore(&data->lock, flags);
+ }
+ else
+ ipmi_serial_ll_init_complete(data->info,
-EINVAL);
return;
}
@@ -337,11 +358,11 @@ static int ra_init(struct ipmi_serial_co
spin_lock_init(&data->lock);
data->info = info;
data->bmc_i2c_addr = 1; /* Initial setting should work ok. */
- data->smi_i2c_addr = 0; /* Initial setting should work ok. */
+ data->smi_i2c_addr = 1; /* Initial setting should work ok. */
data->recv_msg_handler = handle_init_getipmbaddr;
spin_lock_irqsave(&data->lock, flags);
- format_msg(data, get_ipmbaddr_msg, sizeof(get_ipmbaddr_msg));
+ format_msg(data, get_ipmbaddr_msg1, sizeof(get_ipmbaddr_msg1));
try_to_send_data(data, &flags);
spin_unlock_irqrestore(&data->lock, flags);
return 0;
-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2008.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
Openipmi-developer mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/openipmi-developer