X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;ds=sidebyside;f=drivers%2Fchar%2Fipmi%2Fipmi_msghandler.c;h=83ae6f5309e218a43310efde4fa921eb6f587058;hb=9bf4aaab3e101692164d49b7ca357651eb691cb6;hp=aa0fe2dbfaf0e01e900ffe240edfc0f2f7bc9ca7;hpb=db216c3d5e4c040e557a50f8f5d35d5c415e8c1c;p=linux-2.6.git diff --git a/drivers/char/ipmi/ipmi_msghandler.c b/drivers/char/ipmi/ipmi_msghandler.c index aa0fe2dbf..83ae6f530 100644 --- a/drivers/char/ipmi/ipmi_msghandler.c +++ b/drivers/char/ipmi/ipmi_msghandler.c @@ -46,7 +46,7 @@ #include #include -#define IPMI_MSGHANDLER_VERSION "v31" +#define IPMI_MSGHANDLER_VERSION "v32" struct ipmi_recv_msg *ipmi_alloc_recv_msg(void); static int ipmi_init_msghandler(void); @@ -907,7 +907,7 @@ ipmb_checksum(unsigned char *data, int size) } static inline void format_ipmb_msg(struct ipmi_smi_msg *smi_msg, - struct ipmi_msg *msg, + struct kernel_ipmi_msg *msg, struct ipmi_ipmb_addr *ipmb_addr, long msgid, unsigned char ipmb_seq, @@ -949,7 +949,7 @@ static inline void format_ipmb_msg(struct ipmi_smi_msg *smi_msg, } static inline void format_lan_msg(struct ipmi_smi_msg *smi_msg, - struct ipmi_msg *msg, + struct kernel_ipmi_msg *msg, struct ipmi_lan_addr *lan_addr, long msgid, unsigned char ipmb_seq, @@ -993,7 +993,7 @@ static inline int i_ipmi_request(ipmi_user_t user, ipmi_smi_t intf, struct ipmi_addr *addr, long msgid, - struct ipmi_msg *msg, + struct kernel_ipmi_msg *msg, void *user_msg_data, void *supplied_smi, struct ipmi_recv_msg *supplied_recv, @@ -1335,7 +1335,7 @@ static inline int i_ipmi_request(ipmi_user_t user, goto out_err; } -#if DEBUG_MSGING +#ifdef DEBUG_MSGING { int m; for (m=0; mdata_size; m++) @@ -1356,7 +1356,7 @@ static inline int i_ipmi_request(ipmi_user_t user, int ipmi_request(ipmi_user_t user, struct ipmi_addr *addr, long msgid, - struct ipmi_msg *msg, + struct kernel_ipmi_msg *msg, void *user_msg_data, int priority) { @@ -1376,7 +1376,7 @@ int ipmi_request(ipmi_user_t user, int ipmi_request_settime(ipmi_user_t user, struct ipmi_addr *addr, long msgid, - struct ipmi_msg *msg, + struct kernel_ipmi_msg *msg, void *user_msg_data, int priority, int retries, @@ -1399,7 +1399,7 @@ int ipmi_request_settime(ipmi_user_t user, int ipmi_request_supply_msgs(ipmi_user_t user, struct ipmi_addr *addr, long msgid, - struct ipmi_msg *msg, + struct kernel_ipmi_msg *msg, void *user_msg_data, void *supplied_smi, struct ipmi_recv_msg *supplied_recv, @@ -1422,7 +1422,7 @@ int ipmi_request_supply_msgs(ipmi_user_t user, int ipmi_request_with_source(ipmi_user_t user, struct ipmi_addr *addr, long msgid, - struct ipmi_msg *msg, + struct kernel_ipmi_msg *msg, void *user_msg_data, int priority, unsigned char source_address, @@ -1609,7 +1609,7 @@ static void remove_proc_entries(ipmi_smi_t smi) static int send_channel_info_cmd(ipmi_smi_t intf, int chan) { - struct ipmi_msg msg; + struct kernel_ipmi_msg msg; unsigned char data[1]; struct ipmi_system_interface_addr si; @@ -1648,6 +1648,22 @@ channel_handler(ipmi_smi_t intf, struct ipmi_smi_msg *msg) /* It's the one we want */ if (msg->rsp[2] != 0) { /* Got an error from the channel, just go on. */ + + if (msg->rsp[2] == IPMI_INVALID_COMMAND_ERR) { + /* If the MC does not support this + command, that is legal. We just + assume it has one IPMB at channel + zero. */ + intf->channels[0].medium + = IPMI_CHANNEL_MEDIUM_IPMB; + intf->channels[0].protocol + = IPMI_CHANNEL_PROTOCOL_IPMB; + rv = -ENOSYS; + + intf->curr_channel = IPMI_MAX_CHANNELS; + wake_up(&intf->waitq); + goto out; + } goto next_channel; } if (msg->rsp_size < 6) { @@ -1671,10 +1687,20 @@ channel_handler(ipmi_smi_t intf, struct ipmi_smi_msg *msg) wake_up(&intf->waitq); printk(KERN_WARNING "ipmi_msghandler: Error sending" - "channel information: 0x%x\n", + "channel information: %d\n", rv); } } + out: + return; +} + +void ipmi_poll_interface(ipmi_user_t user) +{ + ipmi_smi_t intf = user->intf; + + if (intf->handlers->poll) + intf->handlers->poll(intf->send_info); } int ipmi_register_smi(struct ipmi_smi_handlers *handlers, @@ -2007,7 +2033,7 @@ static int handle_ipmb_get_msg_cmd(ipmi_smi_t intf, msg->data[10] = ipmb_checksum(&(msg->data[6]), 4); msg->data_size = 11; -#if DEBUG_MSGING +#ifdef DEBUG_MSGING { int m; printk("Invalid command:"); @@ -2398,7 +2424,7 @@ static int handle_new_recv_msg(ipmi_smi_t intf, int requeue; int chan; -#if DEBUG_MSGING +#ifdef DEBUG_MSGING int m; printk("Recv:"); for (m=0; mrsp_size; m++) @@ -2613,7 +2639,7 @@ send_from_recv_msg(ipmi_smi_t intf, struct ipmi_recv_msg *recv_msg, MC, which don't get resent. */ intf->handlers->sender(intf->send_info, smi_msg, 0); -#if DEBUG_MSGING +#ifdef DEBUG_MSGING { int m; printk("Resend: "); @@ -2847,7 +2873,7 @@ static void device_id_fetcher(ipmi_smi_t intf, struct ipmi_smi_msg *msg) static void send_panic_events(char *str) { - struct ipmi_msg msg; + struct kernel_ipmi_msg msg; ipmi_smi_t intf; unsigned char data[16]; int i; @@ -3072,7 +3098,7 @@ static struct notifier_block panic_block = { 200 /* priority: INT_MAX >= x >= 0 */ }; -static __init int ipmi_init_msghandler(void) +static int ipmi_init_msghandler(void) { int i; @@ -3086,7 +3112,7 @@ static __init int ipmi_init_msghandler(void) ipmi_interfaces[i] = NULL; } - proc_ipmi_root = proc_mkdir("ipmi", 0); + proc_ipmi_root = proc_mkdir("ipmi", NULL); if (!proc_ipmi_root) { printk("Unable to create IPMI proc dir"); return -ENOMEM; @@ -3107,6 +3133,12 @@ static __init int ipmi_init_msghandler(void) return 0; } +static __init int ipmi_init_msghandler_mod(void) +{ + ipmi_init_msghandler(); + return 0; +} + static __exit void cleanup_ipmi(void) { int count; @@ -3143,7 +3175,7 @@ static __exit void cleanup_ipmi(void) } module_exit(cleanup_ipmi); -module_init(ipmi_init_msghandler); +module_init(ipmi_init_msghandler_mod); MODULE_LICENSE("GPL"); EXPORT_SYMBOL(ipmi_alloc_recv_msg); @@ -3154,6 +3186,7 @@ EXPORT_SYMBOL(ipmi_request); EXPORT_SYMBOL(ipmi_request_settime); EXPORT_SYMBOL(ipmi_request_supply_msgs); EXPORT_SYMBOL(ipmi_request_with_source); +EXPORT_SYMBOL(ipmi_poll_interface); EXPORT_SYMBOL(ipmi_register_smi); EXPORT_SYMBOL(ipmi_unregister_smi); EXPORT_SYMBOL(ipmi_register_for_cmd);