Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d93faa48 authored by Rafael J. Wysocki's avatar Rafael J. Wysocki
Browse files

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()
parents 4a10c2ac b27b14ce
Loading
Loading
Loading
Loading
+14 −10
Original line number Diff line number Diff line
@@ -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);

+1 −1
Original line number Diff line number Diff line
@@ -1121,7 +1121,7 @@ int acpi_bus_register_driver(struct acpi_driver *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
 *
 * Unregisters a driver with the ACPI bus.  Searches the namespace for all