Merge branch 'acpi-fixes'

* acpi-fixes:
  ACPI / scan: fix typo in comments of acpi_bus_unregister_driver()
  ACPI / IPMI: Fix atomic context requirement of ipmi_msg_handler()
This commit is contained in:
Rafael J. Wysocki 2013-09-27 02:45:10 +02:00
commit d93faa4885
2 changed files with 15 additions and 11 deletions

View File

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

View File

@ -1121,7 +1121,7 @@ int acpi_bus_register_driver(struct acpi_driver *driver)
EXPORT_SYMBOL(acpi_bus_register_driver); EXPORT_SYMBOL(acpi_bus_register_driver);
/** /**
* acpi_bus_unregister_driver - unregisters a driver with the APIC bus * acpi_bus_unregister_driver - unregisters a driver with the ACPI bus
* @driver: driver to unregister * @driver: driver to unregister
* *
* Unregisters a driver with the ACPI bus. Searches the namespace for all * Unregisters a driver with the ACPI bus. Searches the namespace for all