@ -39,6 +39,7 @@
# include <linux/ipmi.h>
# include <linux/device.h>
# include <linux/pnp.h>
# include <linux/spinlock.h>
MODULE_AUTHOR ( " Zhao Yakui " ) ;
MODULE_DESCRIPTION ( " ACPI IPMI Opregion driver " ) ;
@ -57,7 +58,7 @@ struct acpi_ipmi_device {
struct list_head head ;
/* the IPMI request message list */
struct list_head tx_msg_list ;
struct mutex tx_msg_lock ;
spinlock_t tx_msg_lock ;
acpi_handle handle ;
struct pnp_dev * pnp_dev ;
ipmi_user_t user_interface ;
@ -147,6 +148,7 @@ static void acpi_format_ipmi_msg(struct acpi_ipmi_msg *tx_msg,
struct kernel_ipmi_msg * msg ;
struct acpi_ipmi_buffer * buffer ;
struct acpi_ipmi_device * device ;
unsigned long flags ;
msg = & tx_msg - > tx_message ;
/*
@ -177,10 +179,10 @@ static void acpi_format_ipmi_msg(struct acpi_ipmi_msg *tx_msg,
/* Get the msgid */
device = tx_msg - > device ;
mutex_lock ( & device - > tx_msg_lock ) ;
spin_lock_irqsave ( & device - > tx_msg_lock , flags ) ;
device - > curr_msgid + + ;
tx_msg - > tx_msgid = device - > curr_msgid ;
mutex_unlock ( & device - > tx_msg_lock ) ;
spin_unlock_irqrestore ( & device - > tx_msg_lock , flags ) ;
}
static void acpi_format_ipmi_response ( struct acpi_ipmi_msg * msg ,
@ -242,6 +244,7 @@ static void ipmi_msg_handler(struct ipmi_recv_msg *msg, void *user_msg_data)
int msg_found = 0 ;
struct acpi_ipmi_msg * tx_msg ;
struct pnp_dev * pnp_dev = ipmi_device - > pnp_dev ;
unsigned long flags ;
if ( msg - > user ! = ipmi_device - > user_interface ) {
dev_warn ( & pnp_dev - > dev , " Unexpected response is returned. "
@ -250,7 +253,7 @@ static void ipmi_msg_handler(struct ipmi_recv_msg *msg, void *user_msg_data)
ipmi_free_recv_msg ( msg ) ;
return ;
}
mutex_lock ( & ipmi_device - > tx_msg_lock ) ;
spin_lock_irqsave ( & ipmi_device - > tx_msg_lock , flags ) ;
list_for_each_entry ( tx_msg , & ipmi_device - > tx_msg_list , head ) {
if ( msg - > msgid = = tx_msg - > tx_msgid ) {
msg_found = 1 ;
@ -258,7 +261,7 @@ static void ipmi_msg_handler(struct ipmi_recv_msg *msg, void *user_msg_data)
}
}
mutex_unlock ( & ipmi_device - > tx_msg_lock ) ;
spin_unlock_irqrestore ( & ipmi_device - > tx_msg_lock , flags ) ;
if ( ! msg_found ) {
dev_warn ( & pnp_dev - > dev , " Unexpected response (msg id %ld) is "
" returned. \n " , msg - > msgid ) ;
@ -378,6 +381,7 @@ acpi_ipmi_space_handler(u32 function, acpi_physical_address address,
struct acpi_ipmi_device * ipmi_device = handler_context ;
int err , rem_time ;
acpi_status status ;
unsigned long flags ;
/*
* IPMI opregion message .
* IPMI message is firstly written to the BMC and system software
@ -395,9 +399,9 @@ acpi_ipmi_space_handler(u32 function, acpi_physical_address address,
return AE_NO_MEMORY ;
acpi_format_ipmi_msg ( tx_msg , address , value ) ;
mutex_lock ( & ipmi_device - > tx_msg_lock ) ;
spin_lock_irqsave ( & ipmi_device - > tx_msg_lock , flags ) ;
list_add_tail ( & tx_msg - > head , & ipmi_device - > tx_msg_list ) ;
mutex_unlock ( & ipmi_device - > tx_msg_lock ) ;
spin_unlock_irqrestore ( & ipmi_device - > tx_msg_lock , flags ) ;
err = ipmi_request_settime ( ipmi_device - > user_interface ,
& tx_msg - > addr ,
tx_msg - > tx_msgid ,
@ -413,9 +417,9 @@ acpi_ipmi_space_handler(u32 function, acpi_physical_address address,
status = AE_OK ;
end_label :
mutex_lock ( & ipmi_device - > tx_msg_lock ) ;
spin_lock_irqsave ( & ipmi_device - > tx_msg_lock , flags ) ;
list_del ( & tx_msg - > head ) ;
mutex_unlock ( & ipmi_device - > tx_msg_lock ) ;
spin_unlock_irqrestore ( & ipmi_device - > tx_msg_lock , flags ) ;
kfree ( tx_msg ) ;
return status ;
}
@ -457,7 +461,7 @@ static void acpi_add_ipmi_device(struct acpi_ipmi_device *ipmi_device)
INIT_LIST_HEAD ( & ipmi_device - > head ) ;
mutex _init( & ipmi_device - > tx_msg_lock ) ;
spin_lock _init( & ipmi_device - > tx_msg_lock ) ;
INIT_LIST_HEAD ( & ipmi_device - > tx_msg_list ) ;
ipmi_install_space_handler ( ipmi_device ) ;