mirror of https://gitee.com/openkylin/linux.git
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:
commit
d93faa4885
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue