Commit c403993a authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'for-linus-4.20' of https://github.com/cminyard/linux-ipmi

Pull IPMI updates from Corey Minyard:
 "Lots of small changes to the IPMI driver. Most of the changes are
  logging cleanup and style fixes. There are a few smaller bug fixes"

* tag 'for-linus-4.20' of https://github.com/cminyard/linux-ipmi: (21 commits)
  ipmi: Fix timer race with module unload
  ipmi:ssif: Add support for multi-part transmit messages > 2 parts
  MAINTAINERS: Add file patterns for ipmi device tree bindings
  ipmi: Remove platform driver overrides and use the id_table
  ipmi: Free the address list on module cleanup
  ipmi: Don't leave holes in the I2C address list in the ssif driver
  ipmi: fix return value of ipmi_set_my_LUN
  ipmi: Convert pr_xxx() to dev_xxx() in the BT code
  ipmi:dmi: Ignore IPMI SMBIOS entries with a zero base address
  ipmi:dmi: Use pr_fmt in the IPMI DMI code
  ipmi: Change to ktime_get_ts64()
  ipmi_si: fix potential integer overflow on large shift
  ipmi_si_pci: fix NULL device in ipmi_si error message
  ipmi: Convert printk(KERN_<level> to pr_<level>(
  ipmi: Use more common logging styles
  ipmi: msghandler: Add and use pr_fmt and dev_fmt, remove PFX
  pci:ipmi: Move IPMI PCI class id defines to pci_ids.h
  ipmi: Finally get rid of ipmi_user_t and ipmi_smi_t
  ipmi:powernv: Convert ipmi_smi_t to struct ipmi_smi
  hwmon:ibm: Change ipmi_user_t to struct ipmi_user *
  ...
parents 6fd577cd 0711e8c1
...@@ -7666,6 +7666,7 @@ M: Corey Minyard <minyard@acm.org> ...@@ -7666,6 +7666,7 @@ M: Corey Minyard <minyard@acm.org>
L: openipmi-developer@lists.sourceforge.net (moderated for non-subscribers) L: openipmi-developer@lists.sourceforge.net (moderated for non-subscribers)
W: http://openipmi.sourceforge.net/ W: http://openipmi.sourceforge.net/
S: Supported S: Supported
F: Documentation/devicetree/bindings/ipmi/
F: Documentation/IPMI.txt F: Documentation/IPMI.txt
F: drivers/char/ipmi/ F: drivers/char/ipmi/
F: include/linux/ipmi* F: include/linux/ipmi*
......
...@@ -46,7 +46,7 @@ struct acpi_ipmi_device { ...@@ -46,7 +46,7 @@ struct acpi_ipmi_device {
spinlock_t tx_msg_lock; spinlock_t tx_msg_lock;
acpi_handle handle; acpi_handle handle;
struct device *dev; struct device *dev;
ipmi_user_t user_interface; struct ipmi_user *user_interface;
int ipmi_ifnum; /* IPMI interface number */ int ipmi_ifnum; /* IPMI interface number */
long curr_msgid; long curr_msgid;
bool dead; bool dead;
...@@ -125,7 +125,7 @@ ipmi_dev_alloc(int iface, struct device *dev, acpi_handle handle) ...@@ -125,7 +125,7 @@ ipmi_dev_alloc(int iface, struct device *dev, acpi_handle handle)
{ {
struct acpi_ipmi_device *ipmi_device; struct acpi_ipmi_device *ipmi_device;
int err; int err;
ipmi_user_t user; struct ipmi_user *user;
ipmi_device = kzalloc(sizeof(*ipmi_device), GFP_KERNEL); ipmi_device = kzalloc(sizeof(*ipmi_device), GFP_KERNEL);
if (!ipmi_device) if (!ipmi_device)
......
...@@ -8,6 +8,8 @@ ...@@ -8,6 +8,8 @@
* Author: Rocky Craig <first.last@hp.com> * Author: Rocky Craig <first.last@hp.com>
*/ */
#define DEBUG /* So dev_dbg() is always available. */
#include <linux/kernel.h> /* For printk. */ #include <linux/kernel.h> /* For printk. */
#include <linux/string.h> #include <linux/string.h>
#include <linux/module.h> #include <linux/module.h>
...@@ -215,11 +217,11 @@ static int bt_start_transaction(struct si_sm_data *bt, ...@@ -215,11 +217,11 @@ static int bt_start_transaction(struct si_sm_data *bt,
return IPMI_NOT_IN_MY_STATE_ERR; return IPMI_NOT_IN_MY_STATE_ERR;
if (bt_debug & BT_DEBUG_MSG) { if (bt_debug & BT_DEBUG_MSG) {
printk(KERN_WARNING "BT: +++++++++++++++++ New command\n"); dev_dbg(bt->io->dev, "+++++++++++++++++ New command\n");
printk(KERN_WARNING "BT: NetFn/LUN CMD [%d data]:", size - 2); dev_dbg(bt->io->dev, "NetFn/LUN CMD [%d data]:", size - 2);
for (i = 0; i < size; i ++) for (i = 0; i < size; i ++)
printk(" %02x", data[i]); pr_cont(" %02x", data[i]);
printk("\n"); pr_cont("\n");
} }
bt->write_data[0] = size + 1; /* all data plus seq byte */ bt->write_data[0] = size + 1; /* all data plus seq byte */
bt->write_data[1] = *data; /* NetFn/LUN */ bt->write_data[1] = *data; /* NetFn/LUN */
...@@ -260,10 +262,10 @@ static int bt_get_result(struct si_sm_data *bt, ...@@ -260,10 +262,10 @@ static int bt_get_result(struct si_sm_data *bt,
memcpy(data + 2, bt->read_data + 4, msg_len - 2); memcpy(data + 2, bt->read_data + 4, msg_len - 2);
if (bt_debug & BT_DEBUG_MSG) { if (bt_debug & BT_DEBUG_MSG) {
printk(KERN_WARNING "BT: result %d bytes:", msg_len); dev_dbg(bt->io->dev, "result %d bytes:", msg_len);
for (i = 0; i < msg_len; i++) for (i = 0; i < msg_len; i++)
printk(" %02x", data[i]); pr_cont(" %02x", data[i]);
printk("\n"); pr_cont("\n");
} }
return msg_len; return msg_len;
} }
...@@ -274,8 +276,7 @@ static int bt_get_result(struct si_sm_data *bt, ...@@ -274,8 +276,7 @@ static int bt_get_result(struct si_sm_data *bt,
static void reset_flags(struct si_sm_data *bt) static void reset_flags(struct si_sm_data *bt)
{ {
if (bt_debug) if (bt_debug)
printk(KERN_WARNING "IPMI BT: flag reset %s\n", dev_dbg(bt->io->dev, "flag reset %s\n", status2txt(BT_STATUS));
status2txt(BT_STATUS));
if (BT_STATUS & BT_H_BUSY) if (BT_STATUS & BT_H_BUSY)
BT_CONTROL(BT_H_BUSY); /* force clear */ BT_CONTROL(BT_H_BUSY); /* force clear */
BT_CONTROL(BT_CLR_WR_PTR); /* always reset */ BT_CONTROL(BT_CLR_WR_PTR); /* always reset */
...@@ -301,14 +302,14 @@ static void drain_BMC2HOST(struct si_sm_data *bt) ...@@ -301,14 +302,14 @@ static void drain_BMC2HOST(struct si_sm_data *bt)
BT_CONTROL(BT_B2H_ATN); /* some BMCs are stubborn */ BT_CONTROL(BT_B2H_ATN); /* some BMCs are stubborn */
BT_CONTROL(BT_CLR_RD_PTR); /* always reset */ BT_CONTROL(BT_CLR_RD_PTR); /* always reset */
if (bt_debug) if (bt_debug)
printk(KERN_WARNING "IPMI BT: stale response %s; ", dev_dbg(bt->io->dev, "stale response %s; ",
status2txt(BT_STATUS)); status2txt(BT_STATUS));
size = BMC2HOST; size = BMC2HOST;
for (i = 0; i < size ; i++) for (i = 0; i < size ; i++)
BMC2HOST; BMC2HOST;
BT_CONTROL(BT_H_BUSY); /* now clear */ BT_CONTROL(BT_H_BUSY); /* now clear */
if (bt_debug) if (bt_debug)
printk("drained %d bytes\n", size + 1); pr_cont("drained %d bytes\n", size + 1);
} }
static inline void write_all_bytes(struct si_sm_data *bt) static inline void write_all_bytes(struct si_sm_data *bt)
...@@ -316,11 +317,11 @@ static inline void write_all_bytes(struct si_sm_data *bt) ...@@ -316,11 +317,11 @@ static inline void write_all_bytes(struct si_sm_data *bt)
int i; int i;
if (bt_debug & BT_DEBUG_MSG) { if (bt_debug & BT_DEBUG_MSG) {
printk(KERN_WARNING "BT: write %d bytes seq=0x%02X", dev_dbg(bt->io->dev, "write %d bytes seq=0x%02X",
bt->write_count, bt->seq); bt->write_count, bt->seq);
for (i = 0; i < bt->write_count; i++) for (i = 0; i < bt->write_count; i++)
printk(" %02x", bt->write_data[i]); pr_cont(" %02x", bt->write_data[i]);
printk("\n"); pr_cont("\n");
} }
for (i = 0; i < bt->write_count; i++) for (i = 0; i < bt->write_count; i++)
HOST2BMC(bt->write_data[i]); HOST2BMC(bt->write_data[i]);
...@@ -340,8 +341,8 @@ static inline int read_all_bytes(struct si_sm_data *bt) ...@@ -340,8 +341,8 @@ static inline int read_all_bytes(struct si_sm_data *bt)
if (bt->read_count < 4 || bt->read_count >= IPMI_MAX_MSG_LENGTH) { if (bt->read_count < 4 || bt->read_count >= IPMI_MAX_MSG_LENGTH) {
if (bt_debug & BT_DEBUG_MSG) if (bt_debug & BT_DEBUG_MSG)
printk(KERN_WARNING "BT: bad raw rsp len=%d\n", dev_dbg(bt->io->dev,
bt->read_count); "bad raw rsp len=%d\n", bt->read_count);
bt->truncated = 1; bt->truncated = 1;
return 1; /* let next XACTION START clean it up */ return 1; /* let next XACTION START clean it up */
} }
...@@ -352,13 +353,13 @@ static inline int read_all_bytes(struct si_sm_data *bt) ...@@ -352,13 +353,13 @@ static inline int read_all_bytes(struct si_sm_data *bt)
if (bt_debug & BT_DEBUG_MSG) { if (bt_debug & BT_DEBUG_MSG) {
int max = bt->read_count; int max = bt->read_count;
printk(KERN_WARNING "BT: got %d bytes seq=0x%02X", dev_dbg(bt->io->dev,
max, bt->read_data[2]); "got %d bytes seq=0x%02X", max, bt->read_data[2]);
if (max > 16) if (max > 16)
max = 16; max = 16;
for (i = 0; i < max; i++) for (i = 0; i < max; i++)
printk(KERN_CONT " %02x", bt->read_data[i]); pr_cont(" %02x", bt->read_data[i]);
printk(KERN_CONT "%s\n", bt->read_count == max ? "" : " ..."); pr_cont("%s\n", bt->read_count == max ? "" : " ...");
} }
/* per the spec, the (NetFn[1], Seq[2], Cmd[3]) tuples must match */ /* per the spec, the (NetFn[1], Seq[2], Cmd[3]) tuples must match */
...@@ -368,9 +369,10 @@ static inline int read_all_bytes(struct si_sm_data *bt) ...@@ -368,9 +369,10 @@ static inline int read_all_bytes(struct si_sm_data *bt)
return 1; return 1;
if (bt_debug & BT_DEBUG_MSG) if (bt_debug & BT_DEBUG_MSG)
printk(KERN_WARNING "IPMI BT: bad packet: " dev_dbg(bt->io->dev,
"want 0x(%02X, %02X, %02X) got (%02X, %02X, %02X)\n", "IPMI BT: bad packet: want 0x(%02X, %02X, %02X) got (%02X, %02X, %02X)\n",
bt->write_data[1] | 0x04, bt->write_data[2], bt->write_data[3], bt->write_data[1] | 0x04, bt->write_data[2],
bt->write_data[3],
bt->read_data[1], bt->read_data[2], bt->read_data[3]); bt->read_data[1], bt->read_data[2], bt->read_data[3]);
return 0; return 0;
} }
...@@ -394,7 +396,7 @@ static enum si_sm_result error_recovery(struct si_sm_data *bt, ...@@ -394,7 +396,7 @@ static enum si_sm_result error_recovery(struct si_sm_data *bt,
break; break;
} }
printk(KERN_WARNING "IPMI BT: %s in %s %s ", /* open-ended line */ dev_warn(bt->io->dev, "IPMI BT: %s in %s %s ", /* open-ended line */
reason, STATE2TXT, STATUS2TXT); reason, STATE2TXT, STATUS2TXT);
/* /*
...@@ -403,20 +405,20 @@ static enum si_sm_result error_recovery(struct si_sm_data *bt, ...@@ -403,20 +405,20 @@ static enum si_sm_result error_recovery(struct si_sm_data *bt,
*/ */
(bt->error_retries)++; (bt->error_retries)++;
if (bt->error_retries < bt->BT_CAP_retries) { if (bt->error_retries < bt->BT_CAP_retries) {
printk("%d retries left\n", pr_cont("%d retries left\n",
bt->BT_CAP_retries - bt->error_retries); bt->BT_CAP_retries - bt->error_retries);
bt->state = BT_STATE_RESTART; bt->state = BT_STATE_RESTART;
return SI_SM_CALL_WITHOUT_DELAY; return SI_SM_CALL_WITHOUT_DELAY;
} }
printk(KERN_WARNING "failed %d retries, sending error response\n", dev_warn(bt->io->dev, "failed %d retries, sending error response\n",
bt->BT_CAP_retries); bt->BT_CAP_retries);
if (!bt->nonzero_status) if (!bt->nonzero_status)
printk(KERN_ERR "IPMI BT: stuck, try power cycle\n"); dev_err(bt->io->dev, "stuck, try power cycle\n");
/* this is most likely during insmod */ /* this is most likely during insmod */
else if (bt->seq <= (unsigned char)(bt->BT_CAP_retries & 0xFF)) { else if (bt->seq <= (unsigned char)(bt->BT_CAP_retries & 0xFF)) {
printk(KERN_WARNING "IPMI: BT reset (takes 5 secs)\n"); dev_warn(bt->io->dev, "BT reset (takes 5 secs)\n");
bt->state = BT_STATE_RESET1; bt->state = BT_STATE_RESET1;
return SI_SM_CALL_WITHOUT_DELAY; return SI_SM_CALL_WITHOUT_DELAY;
} }
...@@ -452,7 +454,7 @@ static enum si_sm_result bt_event(struct si_sm_data *bt, long time) ...@@ -452,7 +454,7 @@ static enum si_sm_result bt_event(struct si_sm_data *bt, long time)
status = BT_STATUS; status = BT_STATUS;
bt->nonzero_status |= status; bt->nonzero_status |= status;
if ((bt_debug & BT_DEBUG_STATES) && (bt->state != last_printed)) { if ((bt_debug & BT_DEBUG_STATES) && (bt->state != last_printed)) {
printk(KERN_WARNING "BT: %s %s TO=%ld - %ld \n", dev_dbg(bt->io->dev, "BT: %s %s TO=%ld - %ld\n",
STATE2TXT, STATE2TXT,
STATUS2TXT, STATUS2TXT,
bt->timeout, bt->timeout,
......
...@@ -818,8 +818,7 @@ static void ipmi_new_smi(int if_num, struct device *device) ...@@ -818,8 +818,7 @@ static void ipmi_new_smi(int if_num, struct device *device)
entry = kmalloc(sizeof(*entry), GFP_KERNEL); entry = kmalloc(sizeof(*entry), GFP_KERNEL);
if (!entry) { if (!entry) {
printk(KERN_ERR "ipmi_devintf: Unable to create the" pr_err("ipmi_devintf: Unable to create the ipmi class device link\n");
" ipmi class device link\n");
return; return;
} }
entry->dev = dev; entry->dev = dev;
...@@ -861,18 +860,18 @@ static int __init init_ipmi_devintf(void) ...@@ -861,18 +860,18 @@ static int __init init_ipmi_devintf(void)
if (ipmi_major < 0) if (ipmi_major < 0)
return -EINVAL; return -EINVAL;
printk(KERN_INFO "ipmi device interface\n"); pr_info("ipmi device interface\n");
ipmi_class = class_create(THIS_MODULE, "ipmi"); ipmi_class = class_create(THIS_MODULE, "ipmi");
if (IS_ERR(ipmi_class)) { if (IS_ERR(ipmi_class)) {
printk(KERN_ERR "ipmi: can't register device class\n"); pr_err("ipmi: can't register device class\n");
return PTR_ERR(ipmi_class); return PTR_ERR(ipmi_class);
} }
rv = register_chrdev(ipmi_major, DEVICE_NAME, &ipmi_fops); rv = register_chrdev(ipmi_major, DEVICE_NAME, &ipmi_fops);
if (rv < 0) { if (rv < 0) {
class_destroy(ipmi_class); class_destroy(ipmi_class);
printk(KERN_ERR "ipmi: can't get major %d\n", ipmi_major); pr_err("ipmi: can't get major %d\n", ipmi_major);
return rv; return rv;
} }
...@@ -884,7 +883,7 @@ static int __init init_ipmi_devintf(void) ...@@ -884,7 +883,7 @@ static int __init init_ipmi_devintf(void)
if (rv) { if (rv) {
unregister_chrdev(ipmi_major, DEVICE_NAME); unregister_chrdev(ipmi_major, DEVICE_NAME);
class_destroy(ipmi_class); class_destroy(ipmi_class);
printk(KERN_WARNING "ipmi: can't register smi watcher\n"); pr_warn("ipmi: can't register smi watcher\n");
return rv; return rv;
} }
......
...@@ -4,6 +4,9 @@ ...@@ -4,6 +4,9 @@
* allow autoloading of the IPMI drive based on SMBIOS entries. * allow autoloading of the IPMI drive based on SMBIOS entries.
*/ */
#define pr_fmt(fmt) "%s" fmt, "ipmi:dmi: "
#define dev_fmt pr_fmt
#include <linux/ipmi.h> #include <linux/ipmi.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/dmi.h> #include <linux/dmi.h>
...@@ -41,7 +44,7 @@ static void __init dmi_add_platform_ipmi(unsigned long base_addr, ...@@ -41,7 +44,7 @@ static void __init dmi_add_platform_ipmi(unsigned long base_addr,
unsigned int num_r = 1, size; unsigned int num_r = 1, size;
struct property_entry p[5]; struct property_entry p[5];
unsigned int pidx = 0; unsigned int pidx = 0;
char *name, *override; char *name;
int rv; int rv;
enum si_type si_type; enum si_type si_type;
struct ipmi_dmi_info *info; struct ipmi_dmi_info *info;
...@@ -49,11 +52,9 @@ static void __init dmi_add_platform_ipmi(unsigned long base_addr, ...@@ -49,11 +52,9 @@ static void __init dmi_add_platform_ipmi(unsigned long base_addr,
memset(p, 0, sizeof(p)); memset(p, 0, sizeof(p));
name = "dmi-ipmi-si"; name = "dmi-ipmi-si";
override = "ipmi_si";
switch (type) { switch (type) {
case IPMI_DMI_TYPE_SSIF: case IPMI_DMI_TYPE_SSIF:
name = "dmi-ipmi-ssif"; name = "dmi-ipmi-ssif";
override = "ipmi_ssif";
offset = 1; offset = 1;
size = 1; size = 1;
si_type = SI_TYPE_INVALID; si_type = SI_TYPE_INVALID;
...@@ -71,7 +72,7 @@ static void __init dmi_add_platform_ipmi(unsigned long base_addr, ...@@ -71,7 +72,7 @@ static void __init dmi_add_platform_ipmi(unsigned long base_addr,
si_type = SI_SMIC; si_type = SI_SMIC;
break; break;
default: default:
pr_err("ipmi:dmi: Invalid IPMI type: %d\n", type); pr_err("Invalid IPMI type: %d\n", type);
return; return;
} }
...@@ -83,7 +84,7 @@ static void __init dmi_add_platform_ipmi(unsigned long base_addr, ...@@ -83,7 +84,7 @@ static void __init dmi_add_platform_ipmi(unsigned long base_addr,
info = kmalloc(sizeof(*info), GFP_KERNEL); info = kmalloc(sizeof(*info), GFP_KERNEL);
if (!info) { if (!info) {
pr_warn("ipmi:dmi: Could not allocate dmi info\n"); pr_warn("Could not allocate dmi info\n");
} else { } else {
info->si_type = si_type; info->si_type = si_type;
info->flags = flags; info->flags = flags;
...@@ -95,13 +96,9 @@ static void __init dmi_add_platform_ipmi(unsigned long base_addr, ...@@ -95,13 +96,9 @@ static void __init dmi_add_platform_ipmi(unsigned long base_addr,
pdev = platform_device_alloc(name, ipmi_dmi_nr); pdev = platform_device_alloc(name, ipmi_dmi_nr);
if (!pdev) { if (!pdev) {
pr_err("ipmi:dmi: Error allocation IPMI platform device\n"); pr_err("Error allocation IPMI platform device\n");
return; return;
} }
pdev->driver_override = kasprintf(GFP_KERNEL, "%s",
override);
if (!pdev->driver_override)
goto err;
if (type == IPMI_DMI_TYPE_SSIF) { if (type == IPMI_DMI_TYPE_SSIF) {
p[pidx++] = PROPERTY_ENTRY_U16("i2c-addr", base_addr); p[pidx++] = PROPERTY_ENTRY_U16("i2c-addr", base_addr);
...@@ -141,22 +138,20 @@ static void __init dmi_add_platform_ipmi(unsigned long base_addr, ...@@ -141,22 +138,20 @@ static void __init dmi_add_platform_ipmi(unsigned long base_addr,
rv = platform_device_add_resources(pdev, r, num_r); rv = platform_device_add_resources(pdev, r, num_r);
if (rv) { if (rv) {
dev_err(&pdev->dev, dev_err(&pdev->dev, "Unable to add resources: %d\n", rv);
"ipmi:dmi: Unable to add resources: %d\n", rv);
goto err; goto err;
} }
add_properties: add_properties:
rv = platform_device_add_properties(pdev, p); rv = platform_device_add_properties(pdev, p);
if (rv) { if (rv) {
dev_err(&pdev->dev, dev_err(&pdev->dev, "Unable to add properties: %d\n", rv);
"ipmi:dmi: Unable to add properties: %d\n", rv);
goto err; goto err;
} }
rv = platform_device_add(pdev); rv = platform_device_add(pdev);
if (rv) { if (rv) {
dev_err(&pdev->dev, "ipmi:dmi: Unable to add device: %d\n", rv); dev_err(&pdev->dev, "Unable to add device: %d\n", rv);
goto err; goto err;
} }
...@@ -217,6 +212,10 @@ static void __init dmi_decode_ipmi(const struct dmi_header *dm) ...@@ -217,6 +212,10 @@ static void __init dmi_decode_ipmi(const struct dmi_header *dm)
slave_addr = data[DMI_IPMI_SLAVEADDR]; slave_addr = data[DMI_IPMI_SLAVEADDR];
memcpy(&base_addr, data + DMI_IPMI_ADDR, sizeof(unsigned long)); memcpy(&base_addr, data + DMI_IPMI_ADDR, sizeof(unsigned long));
if (!base_addr) {
pr_err("Base address is zero, assuming no IPMI interface\n");
return;
}
if (len >= DMI_IPMI_VER2_LENGTH) { if (len >= DMI_IPMI_VER2_LENGTH) {
if (type == IPMI_DMI_TYPE_SSIF) { if (type == IPMI_DMI_TYPE_SSIF) {
offset = 0; offset = 0;
...@@ -263,7 +262,7 @@ static void __init dmi_decode_ipmi(const struct dmi_header *dm) ...@@ -263,7 +262,7 @@ static void __init dmi_decode_ipmi(const struct dmi_header *dm)
offset = 16; offset = 16;
break; break;
default: default:
pr_err("ipmi:dmi: Invalid offset: 0\n"); pr_err("Invalid offset: 0\n");
return; return;
} }
} }
......
...@@ -274,8 +274,8 @@ static int start_kcs_transaction(struct si_sm_data *kcs, unsigned char *data, ...@@ -274,8 +274,8 @@ static int start_kcs_transaction(struct si_sm_data *kcs, unsigned char *data,
if (kcs_debug & KCS_DEBUG_MSG) { if (kcs_debug & KCS_DEBUG_MSG) {
printk(KERN_DEBUG "start_kcs_transaction -"); printk(KERN_DEBUG "start_kcs_transaction -");
for (i = 0; i < size; i++) for (i = 0; i < size; i++)
printk(" %02x", (unsigned char) (data [i])); pr_cont(" %02x", data[i]);
printk("\n"); pr_cont("\n");
} }
kcs->error_retries = 0; kcs->error_retries = 0;
memcpy(kcs->write_data, data, size); memcpy(kcs->write_data, data, size);
......
...@@ -11,6 +11,9 @@ ...@@ -11,6 +11,9 @@
* Copyright 2002 MontaVista Software Inc. * Copyright 2002 MontaVista Software Inc.
*/ */
#define pr_fmt(fmt) "%s" fmt, "IPMI message handler: "
#define dev_fmt pr_fmt
#include <linux/module.h> #include <linux/module.h>
#include <linux/errno.h> #include <linux/errno.h>
#include <linux/poll.h> #include <linux/poll.h>
...@@ -30,8 +33,6 @@ ...@@ -30,8 +33,6 @@
#include <linux/workqueue.h> #include <linux/workqueue.h>
#include <linux/uuid.h> #include <linux/uuid.h>
#define PFX "IPMI message handler: "
#define IPMI_DRIVER_VERSION "39.2" #define IPMI_DRIVER_VERSION "39.2"
static struct ipmi_recv_msg *ipmi_alloc_recv_msg(void); static struct ipmi_recv_msg *ipmi_alloc_recv_msg(void);
...@@ -1343,7 +1344,7 @@ int ipmi_set_my_LUN(struct ipmi_user *user, ...@@ -1343,7 +1344,7 @@ int ipmi_set_my_LUN(struct ipmi_user *user,
user->intf->addrinfo[channel].lun = LUN & 0x3; user->intf->addrinfo[channel].lun = LUN & 0x3;
release_ipmi_user(user, index); release_ipmi_user(user, index);
return 0; return rv;
} }
EXPORT_SYMBOL(ipmi_set_my_LUN); EXPORT_SYMBOL(ipmi_set_my_LUN);
...@@ -1474,8 +1475,7 @@ int ipmi_set_gets_events(struct ipmi_user *user, bool val) ...@@ -1474,8 +1475,7 @@ int ipmi_set_gets_events(struct ipmi_user *user, bool val)
list_move_tail(&msg->link, &msgs); list_move_tail(&msg->link, &msgs);
intf->waiting_events_count = 0; intf->waiting_events_count = 0;
if (intf->event_msg_printed) { if (intf->event_msg_printed) {
dev_warn(intf->si_dev, dev_warn(intf->si_dev, "Event queue no longer full\n");
PFX "Event queue no longer full\n");
intf->event_msg_printed = 0; intf->event_msg_printed = 0;
} }
...@@ -2276,7 +2276,7 @@ static void bmc_device_id_handler(struct ipmi_smi *intf, ...@@ -2276,7 +2276,7 @@ static void bmc_device_id_handler(struct ipmi_smi *intf,
|| (msg->msg.netfn != IPMI_NETFN_APP_RESPONSE) || (msg->msg.netfn != IPMI_NETFN_APP_RESPONSE)
|| (msg->msg.cmd != IPMI_GET_DEVICE_ID_CMD)) { || (msg->msg.cmd != IPMI_GET_DEVICE_ID_CMD)) {
dev_warn(intf->si_dev, dev_warn(intf->si_dev,
PFX "invalid device_id msg: addr_type=%d netfn=%x cmd=%x\n", "invalid device_id msg: addr_type=%d netfn=%x cmd=%x\n",
msg->addr.addr_type, msg->msg.netfn, msg->msg.cmd); msg->addr.addr_type, msg->msg.netfn, msg->msg.cmd);
return; return;
} }
...@@ -2284,8 +2284,7 @@ static void bmc_device_id_handler(struct ipmi_smi *intf, ...@@ -2284,8 +2284,7 @@ static void bmc_device_id_handler(struct ipmi_smi *intf,
rv = ipmi_demangle_device_id(msg->msg.netfn, msg->msg.cmd, rv = ipmi_demangle_device_id(msg->msg.netfn, msg->msg.cmd,
msg->msg.data, msg->msg.data_len, &intf->bmc->fetch_id); msg->msg.data, msg->msg.data_len, &intf->bmc->fetch_id);
if (rv) { if (rv) {
dev_warn(intf->si_dev, dev_warn(intf->si_dev, "device id demangle failed: %d\n", rv);
PFX "device id demangle failed: %d\n", rv);
intf->bmc->dyn_id_set = 0; intf->bmc->dyn_id_set = 0;
} else { } else {
/* /*
...@@ -2908,8 +2907,7 @@ static int __ipmi_bmc_register(struct ipmi_smi *intf, ...@@ -2908,8 +2907,7 @@ static int __ipmi_bmc_register(struct ipmi_smi *intf,
mutex_unlock(&bmc->dyn_mutex); mutex_unlock(&bmc->dyn_mutex);
dev_info(intf->si_dev, dev_info(intf->si_dev,
"ipmi: interfacing existing BMC (man_id: 0x%6.6x," "interfacing existing BMC (man_id: 0x%6.6x, prod_id: 0x%4.4x, dev_id: 0x%2.2x)\n",
" prod_id: 0x%4.4x, dev_id: 0x%2.2x)\n",
bmc->id.manufacturer_id, bmc->id.manufacturer_id,
bmc->id.product_id, bmc->id.product_id,
bmc->id.device_id); bmc->id.device_id);
...@@ -2948,7 +2946,7 @@ static int __ipmi_bmc_register(struct ipmi_smi *intf, ...@@ -2948,7 +2946,7 @@ static int __ipmi_bmc_register(struct ipmi_smi *intf,
rv = platform_device_register(&bmc->pdev); rv = platform_device_register(&bmc->pdev);
if (rv) { if (rv) {
dev_err(intf->si_dev, dev_err(intf->si_dev,
PFX " Unable to register bmc device: %d\n", "Unable to register bmc device: %d\n",
rv); rv);
goto out_list_del; goto out_list_del;
} }
...@@ -2966,8 +2964,7 @@ static int __ipmi_bmc_register(struct ipmi_smi *intf, ...@@ -2966,8 +2964,7 @@ static int __ipmi_bmc_register(struct ipmi_smi *intf,
*/ */
rv = sysfs_create_link(&intf->si_dev->kobj, &bmc->pdev.dev.kobj, "bmc"); rv = sysfs_create_link(&intf->si_dev->kobj, &bmc->pdev.dev.kobj, "bmc");
if (rv) { if (rv) {
dev_err(intf->si_dev, dev_err(intf->si_dev, "Unable to create bmc symlink: %d\n", rv);
PFX "Unable to create bmc symlink: %d\n", rv);
goto out_put_bmc; goto out_put_bmc;
} }
...@@ -2976,8 +2973,8 @@ static int __ipmi_bmc_register(struct ipmi_smi *intf, ...@@ -2976,8 +2973,8 @@ static int __ipmi_bmc_register(struct ipmi_smi *intf,
intf->my_dev_name = kasprintf(GFP_KERNEL, "ipmi%d", intf_num); intf->my_dev_name = kasprintf(GFP_KERNEL, "ipmi%d", intf_num);
if (!intf->my_dev_name) { if (!intf->my_dev_name) {
rv = -ENOMEM; rv = -ENOMEM;
dev_err(intf->si_dev, dev_err(intf->si_dev, "Unable to allocate link from BMC: %d\n",
PFX "Unable to allocate link from BMC: %d\n", rv); rv);
goto out_unlink1; goto out_unlink1;
} }
...@@ -2986,8 +2983,8 @@ static int __ipmi_bmc_register(struct ipmi_smi *intf, ...@@ -2986,8 +2983,8 @@ static int __ipmi_bmc_register(struct ipmi_smi *intf,
if (rv) { if (rv) {
kfree(intf->my_dev_name); kfree(intf->my_dev_name);
intf->my_dev_name = NULL; intf->my_dev_name = NULL;
dev_err(intf->si_dev, dev_err(intf->si_dev, "Unable to create symlink to bmc: %d\n",
PFX "Unable to create symlink to bmc: %d\n", rv); rv);
goto out_free_my_dev_name; goto out_free_my_dev_name;
} }
...@@ -3071,7 +3068,7 @@ static void guid_handler(struct ipmi_smi *intf, struct ipmi_recv_msg *msg) ...@@ -3071,7 +3068,7 @@ static void guid_handler(struct ipmi_smi *intf, struct ipmi_recv_msg *msg)
if (msg->msg.data_len < 17) { if (msg->msg.data_len < 17) {
bmc->dyn_guid_set = 0; bmc->dyn_guid_set = 0;
dev_warn(intf->si_dev, dev_warn(intf->si_dev,
PFX "The GUID response from the BMC was too short, it was %d but should have been 17. Assuming GUID is not available.\n", "The GUID response from the BMC was too short, it was %d but should have been 17. Assuming GUID is not available.\n",
msg->msg.data_len); msg->msg.data_len);
goto out; goto out;
} }
...@@ -3195,7 +3192,7 @@ channel_handler(struct ipmi_smi *intf, struct ipmi_recv_msg *msg) ...@@ -3195,7 +3192,7 @@ channel_handler(struct ipmi_smi *intf, struct ipmi_recv_msg *msg)
if (rv) { if (rv) {
/* Got an error somehow, just give up. */ /* Got an error somehow, just give up. */
dev_warn(intf->si_dev, dev_warn(intf->si_dev,
PFX "Error sending channel information for channel %d: %d\n", "Error sending channel information for channel %d: %d\n",
intf->curr_channel, rv); intf->curr_channel, rv);
intf->channel_list = intf->wchannels + set; intf->channel_list = intf->wchannels + set;
...@@ -4075,7 +4072,7 @@ static int handle_read_event_rsp(struct ipmi_smi *intf, ...@@ -4075,7 +4072,7 @@ static int handle_read_event_rsp(struct ipmi_smi *intf,
* message. * message.
*/ */
dev_warn(intf->si_dev, dev_warn(intf->si_dev,
PFX "Event queue full, discarding incoming events\n"); "Event queue full, discarding incoming events\n");
intf->event_msg_printed = 1; intf->event_msg_printed = 1;
} }
...@@ -4094,7 +4091,7 @@ static int handle_bmc_rsp(struct ipmi_smi *intf, ...@@ -4094,7 +4091,7 @@ static int handle_bmc_rsp(struct ipmi_smi *intf,
recv_msg = (struct ipmi_recv_msg *) msg->user_data; recv_msg = (struct ipmi_recv_msg *) msg->user_data;
if (recv_msg == NULL) { if (recv_msg == NULL) {
dev_warn(intf->si_dev, dev_warn(intf->si_dev,
"IPMI message received with no owner. This could be because of a malformed message, or because of a hardware error. Contact your hardware vender for assistance\n"); "IPMI message received with no owner. This could be because of a malformed message, or because of a hardware error. Contact your hardware vendor for assistance.\n");
return 0; return 0;
} }
...@@ -4130,7 +4127,7 @@ static int handle_one_recv_msg(struct ipmi_smi *intf, ...@@ -4130,7 +4127,7 @@ static int handle_one_recv_msg(struct ipmi_smi *intf,
if (msg->rsp_size < 2) { if (msg->rsp_size < 2) {
/* Message is too small to be correct. */ /* Message is too small to be correct. */
dev_warn(intf->si_dev, dev_warn(intf->si_dev,
PFX "BMC returned to small a message for netfn %x cmd %x, got %d bytes\n", "BMC returned too small a message for netfn %x cmd %x, got %d bytes\n",
(msg->data[0] >> 2) | 1, msg->data[1], msg->rsp_size); (msg->data[0] >> 2) | 1, msg->data[1], msg->rsp_size);
/* Generate an error response for the message. */ /* Generate an error response for the message. */
...@@ -4145,7 +4142,7 @@ static int handle_one_recv_msg(struct ipmi_smi *intf, ...@@ -4145,7 +4142,7 @@ static int handle_one_recv_msg(struct ipmi_smi *intf,
* marginally correct. * marginally correct.
*/ */
dev_warn(intf->si_dev, dev_warn(intf->si_dev,
PFX "BMC returned incorrect response, expected netfn %x cmd %x, got netfn %x cmd %x\n", "BMC returned incorrect response, expected netfn %x cmd %x, got netfn %x cmd %x\n",
(msg->data[0] >> 2) | 1, msg->data[1], (msg->data[0] >> 2) | 1, msg->data[1],
msg->rsp[0] >> 2, msg->rsp[1]); msg->rsp[0] >> 2, msg->rsp[1]);
...@@ -5035,11 +5032,11 @@ static int ipmi_init_msghandler(void) ...@@ -5035,11 +5032,11 @@ static int ipmi_init_msghandler(void)
rv = driver_register(&ipmidriver.driver); rv = driver_register(&ipmidriver.driver);
if (rv) { if (rv) {
pr_err(PFX "Could not register IPMI driver\n"); pr_err("Could not register IPMI driver\n");
return rv; return rv;
} }
pr_info("ipmi message handler version " IPMI_DRIVER_VERSION "\n"); pr_info("version " IPMI_DRIVER_VERSION "\n");
timer_setup(&ipmi_timer, ipmi_timeout, 0); timer_setup(&ipmi_timer, ipmi_timeout, 0);
mod_timer(&ipmi_timer, jiffies + IPMI_TIMEOUT_JIFFIES); mod_timer(&ipmi_timer, jiffies + IPMI_TIMEOUT_JIFFIES);
...@@ -5086,10 +5083,10 @@ static void __exit cleanup_ipmi(void) ...@@ -5086,10 +5083,10 @@ static void __exit cleanup_ipmi(void)
/* Check for buffer leaks. */ /* Check for buffer leaks. */
count = atomic_read(&smi_msg_inuse_count); count = atomic_read(&smi_msg_inuse_count);
if (count != 0) if (count != 0)
pr_warn(PFX "SMI message count %d at exit\n", count); pr_warn("SMI message count %d at exit\n", count);
count = atomic_read(&recv_msg_inuse_count); count = atomic_read(&recv_msg_inuse_count);
if (count != 0) if (count != 0)
pr_warn(PFX "recv message count %d at exit\n", count); pr_warn("recv message count %d at exit\n", count);
} }
module_exit(cleanup_ipmi); module_exit(cleanup_ipmi);
......
...@@ -19,7 +19,7 @@ ...@@ -19,7 +19,7 @@
struct ipmi_smi_powernv { struct ipmi_smi_powernv {
u64 interface_id; u64 interface_id;
ipmi_smi_t intf; struct ipmi_smi *intf;
unsigned int irq; unsigned int irq;
/** /**
...@@ -33,7 +33,7 @@ struct ipmi_smi_powernv { ...@@ -33,7 +33,7 @@ struct ipmi_smi_powernv {
struct opal_ipmi_msg *opal_msg; struct opal_ipmi_msg *opal_msg;
}; };
static int ipmi_powernv_start_processing(void *send_info, ipmi_smi_t intf) static int ipmi_powernv_start_processing(void *send_info, struct ipmi_smi *intf)
{ {
struct ipmi_smi_powernv *smi = send_info; struct ipmi_smi_powernv *smi = send_info;
......
...@@ -11,6 +11,9 @@ ...@@ -11,6 +11,9 @@
* *
* Copyright 2002,2004 MontaVista Software Inc. * Copyright 2002,2004 MontaVista Software Inc.
*/ */
#define pr_fmt(fmt) "IPMI poweroff: " fmt
#include <linux/module.h> #include <linux/module.h>
#include <linux/moduleparam.h> #include <linux/moduleparam.h>
#include <linux/proc_fs.h> #include <linux/proc_fs.h>
...@@ -21,8 +24,6 @@ ...@@ -21,8 +24,6 @@
#include <linux/ipmi.h> #include <linux/ipmi.h>
#include <linux/ipmi_smi.h> #include <linux/ipmi_smi.h>
#define PFX "IPMI poweroff: "
static void ipmi_po_smi_gone(int if_num); static void ipmi_po_smi_gone(int if_num);
static void ipmi_po_new_smi(int if_num, struct device *device); static void ipmi_po_new_smi(int if_num, struct device *device);
...@@ -192,7 +193,7 @@ static void pps_poweroff_atca(struct ipmi_user *user) ...@@ -192,7 +193,7 @@ static void pps_poweroff_atca(struct ipmi_user *user)
smi_addr.channel = IPMI_BMC_CHANNEL; smi_addr.channel = IPMI_BMC_CHANNEL;
smi_addr.lun = 0; smi_addr.lun = 0;
printk(KERN_INFO PFX "PPS powerdown hook used"); pr_info("PPS powerdown hook used\n");
send_msg.netfn = IPMI_NETFN_OEM; send_msg.netfn = IPMI_NETFN_OEM;
send_msg.cmd = IPMI_ATCA_PPS_GRACEFUL_RESTART; send_msg.cmd = IPMI_ATCA_PPS_GRACEFUL_RESTART;
...@@ -201,10 +202,9 @@ static void pps_poweroff_atca(struct ipmi_user *user) ...@@ -201,10 +202,9 @@ static void pps_poweroff_atca(struct ipmi_user *user)
rv = ipmi_request_in_rc_mode(user, rv = ipmi_request_in_rc_mode(user,
(struct ipmi_addr *) &smi_addr, (struct ipmi_addr *) &smi_addr,
&send_msg); &send_msg);
if (rv && rv != IPMI_UNKNOWN_ERR_COMPLETION_CODE) { if (rv && rv != IPMI_UNKNOWN_ERR_COMPLETION_CODE)
printk(KERN_ERR PFX "Unable to send ATCA ," pr_err("Unable to send ATCA, IPMI error 0x%x\n", rv);
" IPMI error 0x%x\n", rv);
}
return; return;
} }
...@@ -234,12 +234,10 @@ static int ipmi_atca_detect(struct ipmi_user *user) ...@@ -234,12 +234,10 @@ static int ipmi_atca_detect(struct ipmi_user *user)
(struct ipmi_addr *) &smi_addr, (struct ipmi_addr *) &smi_addr,
&send_msg); &send_msg);
printk(KERN_INFO PFX "ATCA Detect mfg 0x%X prod 0x%X\n", pr_info("ATCA Detect mfg 0x%X prod 0x%X\n", mfg_id, prod_id);
mfg_id, prod_id);
if ((mfg_id == IPMI_MOTOROLA_MANUFACTURER_ID) if ((mfg_id == IPMI_MOTOROLA_MANUFACTURER_ID)
&& (prod_id == IPMI_MOTOROLA_PPS_IPMC_PRODUCT_ID)) { && (prod_id == IPMI_MOTOROLA_PPS_IPMC_PRODUCT_ID)) {
printk(KERN_INFO PFX pr_info("Installing Pigeon Point Systems Poweroff Hook\n");
"Installing Pigeon Point Systems Poweroff Hook\n");
atca_oem_poweroff_hook = pps_poweroff_atca; atca_oem_poweroff_hook = pps_poweroff_atca;
} }
return !rv; return !rv;
...@@ -259,7 +257,7 @@ static void ipmi_poweroff_atca(struct ipmi_user *user) ...@@ -259,7 +257,7 @@ static void ipmi_poweroff_atca(struct ipmi_user *user)
smi_addr.channel = IPMI_BMC_CHANNEL; smi_addr.channel = IPMI_BMC_CHANNEL;
smi_addr.lun = 0; smi_addr.lun = 0;
printk(KERN_INFO PFX "Powering down via ATCA power command\n"); pr_info("Powering down via ATCA power command\n");
/* /*
* Power down * Power down
...@@ -282,8 +280,8 @@ static void ipmi_poweroff_atca(struct ipmi_user *user) ...@@ -282,8 +280,8 @@ static void ipmi_poweroff_atca(struct ipmi_user *user)
* return code * return code
*/ */
if (rv && rv != IPMI_UNKNOWN_ERR_COMPLETION_CODE) { if (rv && rv != IPMI_UNKNOWN_ERR_COMPLETION_CODE) {
printk(KERN_ERR PFX "Unable to send ATCA powerdown message," pr_err("Unable to send ATCA powerdown message, IPMI error 0x%x\n",
" IPMI error 0x%x\n", rv); rv);
goto out; goto out;
} }
...@@ -334,7 +332,7 @@ static void ipmi_poweroff_cpi1(struct ipmi_user *user) ...@@ -334,7 +332,7 @@ static void ipmi_poweroff_cpi1(struct ipmi_user *user)
smi_addr.channel = IPMI_BMC_CHANNEL; smi_addr.channel = IPMI_BMC_CHANNEL;
smi_addr.lun = 0; smi_addr.lun = 0;
printk(KERN_INFO PFX "Powering down via CPI1 power command\n"); pr_info("Powering down via CPI1 power command\n");
/* /*
* Get IPMI ipmb address * Get IPMI ipmb address
...@@ -482,7 +480,7 @@ static void ipmi_poweroff_chassis(struct ipmi_user *user) ...@@ -482,7 +480,7 @@ static void ipmi_poweroff_chassis(struct ipmi_user *user)
smi_addr.lun = 0; smi_addr.lun = 0;
powercyclefailed: powercyclefailed:
printk(KERN_INFO PFX "Powering %s via IPMI chassis control command\n", pr_info("Powering %s via IPMI chassis control command\n",
(poweroff_powercycle ? "cycle" : "down")); (poweroff_powercycle ? "cycle" : "down"));
/* /*
...@@ -502,14 +500,14 @@ static void ipmi_poweroff_chassis(struct ipmi_user *user) ...@@ -502,14 +500,14 @@ static void ipmi_poweroff_chassis(struct ipmi_user *user)
if (rv) { if (rv) {
if (poweroff_powercycle) { if (poweroff_powercycle) {
/* power cycle failed, default to power down */ /* power cycle failed, default to power down */
printk(KERN_ERR PFX "Unable to send chassis power " \ pr_err("Unable to send chassis power cycle message, IPMI error 0x%x\n",
"cycle message, IPMI error 0x%x\n", rv); rv);
poweroff_powercycle = 0; poweroff_powercycle = 0;
goto powercyclefailed; goto powercyclefailed;
} }
printk(KERN_ERR PFX "Unable to send chassis power " \ pr_err("Unable to send chassis power down message, IPMI error 0x%x\n",
"down message, IPMI error 0x%x\n", rv); rv);
} }
} }
...@@ -571,8 +569,7 @@ static void ipmi_po_new_smi(int if_num, struct device *device) ...@@ -571,8 +569,7 @@ static void ipmi_po_new_smi(int if_num, struct device *device)
rv = ipmi_create_user(if_num, &ipmi_poweroff_handler, NULL, rv = ipmi_create_user(if_num, &ipmi_poweroff_handler, NULL,
&ipmi_user); &ipmi_user);
if (rv) { if (rv) {
printk(KERN_ERR PFX "could not create IPMI user, error %d\n", pr_err("could not create IPMI user, error %d\n", rv);
rv);
return; return;
} }
...@@ -594,14 +591,13 @@ static void ipmi_po_new_smi(int if_num, struct device *device) ...@@ -594,14 +591,13 @@ static void ipmi_po_new_smi(int if_num, struct device *device)
(struct ipmi_addr *) &smi_addr, (struct ipmi_addr *) &smi_addr,
&send_msg); &send_msg);
if (rv) { if (rv) {
printk(KERN_ERR PFX "Unable to send IPMI get device id info," pr_err("Unable to send IPMI get device id info, IPMI error 0x%x\n",
" IPMI error 0x%x\n", rv); rv);
goto out_err; goto out_err;
} }
if (halt_recv_msg.msg.data_len < 12) { if (halt_recv_msg.msg.data_len < 12) {
printk(KERN_ERR PFX "(chassis) IPMI get device id info too," pr_err("(chassis) IPMI get device id info too short, was %d bytes, needed %d bytes\n",
" short, was %d bytes, needed %d bytes\n",
halt_recv_msg.msg.data_len, 12); halt_recv_msg.msg.data_len, 12);
goto out_err; goto out_err;
} }
...@@ -622,13 +618,12 @@ static void ipmi_po_new_smi(int if_num, struct device *device) ...@@ -622,13 +618,12 @@ static void ipmi_po_new_smi(int if_num, struct device *device)
} }
out_err: out_err:
printk(KERN_ERR PFX "Unable to find a poweroff function that" pr_err("Unable to find a poweroff function that will work, giving up\n");
" will work, giving up\n");
ipmi_destroy_user(ipmi_user); ipmi_destroy_user(ipmi_user);
return; return;
found: found:
printk(KERN_INFO PFX "Found a %s style poweroff function\n", pr_info("Found a %s style poweroff function\n",
poweroff_functions[i].platform_type); poweroff_functions[i].platform_type);
specific_poweroff_func = poweroff_functions[i].poweroff_func; specific_poweroff_func = poweroff_functions[i].poweroff_func;
old_poweroff_func = pm_power_off; old_poweroff_func = pm_power_off;
...@@ -692,16 +687,15 @@ static int __init ipmi_poweroff_init(void) ...@@ -692,16 +687,15 @@ static int __init ipmi_poweroff_init(void)
{ {
int rv; int rv;
printk(KERN_INFO "Copyright (C) 2004 MontaVista Software -" pr_info("Copyright (C) 2004 MontaVista Software - IPMI Powerdown via sys_reboot\n");
" IPMI Powerdown via sys_reboot.\n");
if (poweroff_powercycle) if (poweroff_powercycle)
printk(KERN_INFO PFX "Power cycle is enabled.\n"); pr_info("Power cycle is enabled\n");
#ifdef CONFIG_PROC_FS #ifdef CONFIG_PROC_FS
ipmi_table_header = register_sysctl_table(ipmi_root_table); ipmi_table_header = register_sysctl_table(ipmi_root_table);
if (!ipmi_table_header) { if (!ipmi_table_header) {
printk(KERN_ERR PFX "Unable to register powercycle sysctl\n"); pr_err("Unable to register powercycle sysctl\n");
rv = -ENOMEM; rv = -ENOMEM;
goto out_err; goto out_err;
} }
...@@ -712,7 +706,7 @@ static int __init ipmi_poweroff_init(void) ...@@ -712,7 +706,7 @@ static int __init ipmi_poweroff_init(void)
#ifdef CONFIG_PROC_FS #ifdef CONFIG_PROC_FS
if (rv) { if (rv) {
unregister_sysctl_table(ipmi_table_header); unregister_sysctl_table(ipmi_table_header);
printk(KERN_ERR PFX "Unable to register SMI watcher: %d\n", rv); pr_err("Unable to register SMI watcher: %d\n", rv);
goto out_err; goto out_err;
} }
...@@ -735,8 +729,7 @@ static void __exit ipmi_poweroff_cleanup(void) ...@@ -735,8 +729,7 @@ static void __exit ipmi_poweroff_cleanup(void)
if (ready) { if (ready) {
rv = ipmi_destroy_user(ipmi_user); rv = ipmi_destroy_user(ipmi_user);
if (rv) if (rv)
printk(KERN_ERR PFX "could not cleanup the IPMI" pr_err("could not cleanup the IPMI user: 0x%x\n", rv);
" user: 0x%x\n", rv);
pm_power_off = old_poweroff_func; pm_power_off = old_poweroff_func;
} }
} }
......
// SPDX-License-Identifier: GPL-2.0+ // SPDX-License-Identifier: GPL-2.0+
#define pr_fmt(fmt) "ipmi_hardcode: " fmt
#include <linux/moduleparam.h> #include <linux/moduleparam.h>
#include "ipmi_si.h" #include "ipmi_si.h"
#define PFX "ipmi_hardcode: "
/* /*
* There can be 4 IO ports passed in (with or without IRQs), 4 addresses, * There can be 4 IO ports passed in (with or without IRQs), 4 addresses,
* a default IO port, and 1 ACPI/SPMI address. That sets SI_MAX_DRIVERS. * a default IO port, and 1 ACPI/SPMI address. That sets SI_MAX_DRIVERS.
...@@ -100,7 +101,7 @@ int ipmi_si_hardcode_find_bmc(void) ...@@ -100,7 +101,7 @@ int ipmi_si_hardcode_find_bmc(void)
continue; continue;
io.addr_source = SI_HARDCODED; io.addr_source = SI_HARDCODED;
pr_info(PFX "probing via hardcoded address\n"); pr_info("probing via hardcoded address\n");
if (!si_type[i] || strcmp(si_type[i], "kcs") == 0) { if (!si_type[i] || strcmp(si_type[i], "kcs") == 0) {
io.si_type = SI_KCS; io.si_type = SI_KCS;
...@@ -109,7 +110,7 @@ int ipmi_si_hardcode_find_bmc(void) ...@@ -109,7 +110,7 @@ int ipmi_si_hardcode_find_bmc(void)
} else if (strcmp(si_type[i], "bt") == 0) { } else if (strcmp(si_type[i], "bt") == 0) {
io.si_type = SI_BT; io.si_type = SI_BT;
} else { } else {
pr_warn(PFX "Interface type specified for interface %d, was invalid: %s\n", pr_warn("Interface type specified for interface %d, was invalid: %s\n",
i, si_type[i]); i, si_type[i]);
continue; continue;
} }
...@@ -123,7 +124,7 @@ int ipmi_si_hardcode_find_bmc(void) ...@@ -123,7 +124,7 @@ int ipmi_si_hardcode_find_bmc(void)
io.addr_data = addrs[i]; io.addr_data = addrs[i];
io.addr_type = IPMI_MEM_ADDR_SPACE; io.addr_type = IPMI_MEM_ADDR_SPACE;
} else { } else {
pr_warn(PFX "Interface type specified for interface %d, but port and address were not set or set to zero.\n", pr_warn("Interface type specified for interface %d, but port and address were not set or set to zero\n",
i); i);
continue; continue;
} }
......
...@@ -5,12 +5,13 @@ ...@@ -5,12 +5,13 @@
* Handling for dynamically adding/removing IPMI devices through * Handling for dynamically adding/removing IPMI devices through
* a module parameter (and thus sysfs). * a module parameter (and thus sysfs).
*/ */
#define pr_fmt(fmt) "ipmi_hotmod: " fmt
#include <linux/moduleparam.h> #include <linux/moduleparam.h>
#include <linux/ipmi.h> #include <linux/ipmi.h>
#include "ipmi_si.h" #include "ipmi_si.h"
#define PFX "ipmi_hotmod: "
static int hotmod_handler(const char *val, const struct kernel_param *kp); static int hotmod_handler(const char *val, const struct kernel_param *kp);
module_param_call(hotmod, hotmod_handler, NULL, NULL, 0200); module_param_call(hotmod, hotmod_handler, NULL, NULL, 0200);
...@@ -61,7 +62,7 @@ static int parse_str(const struct hotmod_vals *v, int *val, char *name, ...@@ -61,7 +62,7 @@ static int parse_str(const struct hotmod_vals *v, int *val, char *name,
s = strchr(*curr, ','); s = strchr(*curr, ',');
if (!s) { if (!s) {
pr_warn(PFX "No hotmod %s given.\n", name); pr_warn("No hotmod %s given\n", name);
return -EINVAL; return -EINVAL;
} }
*s = '\0'; *s = '\0';
...@@ -74,7 +75,7 @@ static int parse_str(const struct hotmod_vals *v, int *val, char *name, ...@@ -74,7 +75,7 @@ static int parse_str(const struct hotmod_vals *v, int *val, char *name,
} }
} }
pr_warn(PFX "Invalid hotmod %s '%s'\n", name, *curr); pr_warn("Invalid hotmod %s '%s'\n", name, *curr);
return -EINVAL; return -EINVAL;
} }
...@@ -85,12 +86,12 @@ static int check_hotmod_int_op(const char *curr, const char *option, ...@@ -85,12 +86,12 @@ static int check_hotmod_int_op(const char *curr, const char *option,
if (strcmp(curr, name) == 0) { if (strcmp(curr, name) == 0) {
if (!option) { if (!option) {
pr_warn(PFX "No option given for '%s'\n", curr); pr_warn("No option given for '%s'\n", curr);
return -EINVAL; return -EINVAL;
} }
*val = simple_strtoul(option, &n, 0); *val = simple_strtoul(option, &n, 0);
if ((*n != '\0') || (*option == '\0')) { if ((*n != '\0') || (*option == '\0')) {
pr_warn(PFX "Bad option given for '%s'\n", curr); pr_warn("Bad option given for '%s'\n", curr);
return -EINVAL; return -EINVAL;
} }
return 1; return 1;
...@@ -160,7 +161,7 @@ static int hotmod_handler(const char *val, const struct kernel_param *kp) ...@@ -160,7 +161,7 @@ static int hotmod_handler(const char *val, const struct kernel_param *kp)
} }
addr = simple_strtoul(curr, &n, 0); addr = simple_strtoul(curr, &n, 0);
if ((*n != '\0') || (*curr == '\0')) { if ((*n != '\0') || (*curr == '\0')) {
pr_warn(PFX "Invalid hotmod address '%s'\n", curr); pr_warn("Invalid hotmod address '%s'\n", curr);
break; break;
} }
...@@ -203,7 +204,7 @@ static int hotmod_handler(const char *val, const struct kernel_param *kp) ...@@ -203,7 +204,7 @@ static int hotmod_handler(const char *val, const struct kernel_param *kp)
continue; continue;
rv = -EINVAL; rv = -EINVAL;
pr_warn(PFX "Invalid hotmod option '%s'\n", curr); pr_warn("Invalid hotmod option '%s'\n", curr);
goto out; goto out;
} }
......
...@@ -19,6 +19,8 @@ ...@@ -19,6 +19,8 @@
* and drives the real SMI state machine. * and drives the real SMI state machine.
*/ */
#define pr_fmt(fmt) "ipmi_si: " fmt
#include <linux/module.h> #include <linux/module.h>
#include <linux/moduleparam.h> #include <linux/moduleparam.h>
#include <linux/sched.h> #include <linux/sched.h>
...@@ -41,8 +43,6 @@ ...@@ -41,8 +43,6 @@
#include <linux/string.h> #include <linux/string.h>
#include <linux/ctype.h> #include <linux/ctype.h>
#define PFX "ipmi_si: "
/* Measure times between events in the driver. */ /* Measure times between events in the driver. */
#undef DEBUG_TIMING #undef DEBUG_TIMING
...@@ -269,7 +269,7 @@ void debug_timestamp(char *msg) ...@@ -269,7 +269,7 @@ void debug_timestamp(char *msg)
{ {
struct timespec64 t; struct timespec64 t;
getnstimeofday64(&t); ktime_get_ts64(&t);
pr_debug("**%s: %lld.%9.9ld\n", msg, (long long) t.tv_sec, t.tv_nsec); pr_debug("**%s: %lld.%9.9ld\n", msg, (long long) t.tv_sec, t.tv_nsec);
} }
#else #else
...@@ -961,12 +961,12 @@ static inline int ipmi_thread_busy_wait(enum si_sm_result smi_result, ...@@ -961,12 +961,12 @@ static inline int ipmi_thread_busy_wait(enum si_sm_result smi_result,
if (max_busy_us == 0 || smi_result != SI_SM_CALL_WITH_DELAY) if (max_busy_us == 0 || smi_result != SI_SM_CALL_WITH_DELAY)
ipmi_si_set_not_busy(busy_until); ipmi_si_set_not_busy(busy_until);
else if (!ipmi_si_is_busy(busy_until)) { else if (!ipmi_si_is_busy(busy_until)) {
getnstimeofday64(busy_until); ktime_get_ts64(busy_until);
timespec64_add_ns(busy_until, max_busy_us*NSEC_PER_USEC); timespec64_add_ns(busy_until, max_busy_us*NSEC_PER_USEC);
} else { } else {
struct timespec64 now; struct timespec64 now;
getnstimeofday64(&now); ktime_get_ts64(&now);
if (unlikely(timespec64_compare(&now, busy_until) > 0)) { if (unlikely(timespec64_compare(&now, busy_until) > 0)) {
ipmi_si_set_not_busy(busy_until); ipmi_si_set_not_busy(busy_until);
return 0; return 0;
...@@ -1530,7 +1530,7 @@ static int try_enable_event_buffer(struct smi_info *smi_info) ...@@ -1530,7 +1530,7 @@ static int try_enable_event_buffer(struct smi_info *smi_info)
rv = wait_for_msg_done(smi_info); rv = wait_for_msg_done(smi_info);
if (rv) { if (rv) {
pr_warn(PFX "Error getting response from get global enables command, the event buffer is not enabled.\n"); pr_warn("Error getting response from get global enables command, the event buffer is not enabled\n");
goto out; goto out;
} }
...@@ -1541,7 +1541,7 @@ static int try_enable_event_buffer(struct smi_info *smi_info) ...@@ -1541,7 +1541,7 @@ static int try_enable_event_buffer(struct smi_info *smi_info)
resp[0] != (IPMI_NETFN_APP_REQUEST | 1) << 2 || resp[0] != (IPMI_NETFN_APP_REQUEST | 1) << 2 ||
resp[1] != IPMI_GET_BMC_GLOBAL_ENABLES_CMD || resp[1] != IPMI_GET_BMC_GLOBAL_ENABLES_CMD ||
resp[2] != 0) { resp[2] != 0) {
pr_warn(PFX "Invalid return from get global enables command, cannot enable the event buffer.\n"); pr_warn("Invalid return from get global enables command, cannot enable the event buffer\n");
rv = -EINVAL; rv = -EINVAL;
goto out; goto out;
} }
...@@ -1559,7 +1559,7 @@ static int try_enable_event_buffer(struct smi_info *smi_info) ...@@ -1559,7 +1559,7 @@ static int try_enable_event_buffer(struct smi_info *smi_info)
rv = wait_for_msg_done(smi_info); rv = wait_for_msg_done(smi_info);
if (rv) { if (rv) {
pr_warn(PFX "Error getting response from set global, enables command, the event buffer is not enabled.\n"); pr_warn("Error getting response from set global, enables command, the event buffer is not enabled\n");
goto out; goto out;
} }
...@@ -1569,7 +1569,7 @@ static int try_enable_event_buffer(struct smi_info *smi_info) ...@@ -1569,7 +1569,7 @@ static int try_enable_event_buffer(struct smi_info *smi_info)
if (resp_len < 3 || if (resp_len < 3 ||
resp[0] != (IPMI_NETFN_APP_REQUEST | 1) << 2 || resp[0] != (IPMI_NETFN_APP_REQUEST | 1) << 2 ||
resp[1] != IPMI_SET_BMC_GLOBAL_ENABLES_CMD) { resp[1] != IPMI_SET_BMC_GLOBAL_ENABLES_CMD) {
pr_warn(PFX "Invalid return from get global, enables command, not enable the event buffer.\n"); pr_warn("Invalid return from get global, enables command, not enable the event buffer\n");
rv = -EINVAL; rv = -EINVAL;
goto out; goto out;
} }
...@@ -1900,7 +1900,7 @@ int ipmi_si_add_smi(struct si_sm_io *io) ...@@ -1900,7 +1900,7 @@ int ipmi_si_add_smi(struct si_sm_io *io)
} }
} }
pr_info(PFX "Adding %s-specified %s state machine\n", pr_info("Adding %s-specified %s state machine\n",
ipmi_addr_src_to_str(new_smi->io.addr_source), ipmi_addr_src_to_str(new_smi->io.addr_source),
si_to_str[new_smi->io.si_type]); si_to_str[new_smi->io.si_type]);
...@@ -1924,7 +1924,7 @@ static int try_smi_init(struct smi_info *new_smi) ...@@ -1924,7 +1924,7 @@ static int try_smi_init(struct smi_info *new_smi)
int i; int i;
char *init_name = NULL; char *init_name = NULL;
pr_info(PFX "Trying %s-specified %s state machine at %s address 0x%lx, slave address 0x%x, irq %d\n", pr_info("Trying %s-specified %s state machine at %s address 0x%lx, slave address 0x%x, irq %d\n",
ipmi_addr_src_to_str(new_smi->io.addr_source), ipmi_addr_src_to_str(new_smi->io.addr_source),
si_to_str[new_smi->io.si_type], si_to_str[new_smi->io.si_type],
addr_space_to_str[new_smi->io.addr_type], addr_space_to_str[new_smi->io.addr_type],
...@@ -1964,7 +1964,7 @@ static int try_smi_init(struct smi_info *new_smi) ...@@ -1964,7 +1964,7 @@ static int try_smi_init(struct smi_info *new_smi)
new_smi->pdev = platform_device_alloc("ipmi_si", new_smi->pdev = platform_device_alloc("ipmi_si",
new_smi->si_num); new_smi->si_num);
if (!new_smi->pdev) { if (!new_smi->pdev) {
pr_err(PFX "Unable to allocate platform device\n"); pr_err("Unable to allocate platform device\n");
rv = -ENOMEM; rv = -ENOMEM;
goto out_err; goto out_err;
} }
...@@ -2097,7 +2097,7 @@ static int init_ipmi_si(void) ...@@ -2097,7 +2097,7 @@ static int init_ipmi_si(void)
if (initialized) if (initialized)
return 0; return 0;
pr_info("IPMI System Interface driver.\n"); pr_info("IPMI System Interface driver\n");
/* If the user gave us a device, they presumably want us to use it */ /* If the user gave us a device, they presumably want us to use it */
if (!ipmi_si_hardcode_find_bmc()) if (!ipmi_si_hardcode_find_bmc())
...@@ -2151,7 +2151,7 @@ static int init_ipmi_si(void) ...@@ -2151,7 +2151,7 @@ static int init_ipmi_si(void)
if (unload_when_empty && list_empty(&smi_infos)) { if (unload_when_empty && list_empty(&smi_infos)) {
mutex_unlock(&smi_infos_lock); mutex_unlock(&smi_infos_lock);
cleanup_ipmi_si(); cleanup_ipmi_si();
pr_warn(PFX "Unable to find any System Interface(s)\n"); pr_warn("Unable to find any System Interface(s)\n");
return -ENODEV; return -ENODEV;
} else { } else {
mutex_unlock(&smi_infos_lock); mutex_unlock(&smi_infos_lock);
......
...@@ -51,7 +51,7 @@ static unsigned char mem_inq(const struct si_sm_io *io, unsigned int offset) ...@@ -51,7 +51,7 @@ static unsigned char mem_inq(const struct si_sm_io *io, unsigned int offset)
static void mem_outq(const struct si_sm_io *io, unsigned int offset, static void mem_outq(const struct si_sm_io *io, unsigned int offset,
unsigned char b) unsigned char b)
{ {
writeq(b << io->regshift, (io->addr)+(offset * io->regspacing)); writeq((u64)b << io->regshift, (io->addr)+(offset * io->regspacing));
} }
#endif #endif
......
...@@ -4,12 +4,13 @@ ...@@ -4,12 +4,13 @@
* *
* Handling for IPMI devices on the PCI bus. * Handling for IPMI devices on the PCI bus.
*/ */
#define pr_fmt(fmt) "ipmi_pci: " fmt
#include <linux/module.h> #include <linux/module.h>
#include <linux/pci.h> #include <linux/pci.h>
#include "ipmi_si.h" #include "ipmi_si.h"
#define PFX "ipmi_pci: "
static bool pci_registered; static bool pci_registered;
static bool si_trypci = true; static bool si_trypci = true;
...@@ -18,11 +19,6 @@ module_param_named(trypci, si_trypci, bool, 0); ...@@ -18,11 +19,6 @@ module_param_named(trypci, si_trypci, bool, 0);
MODULE_PARM_DESC(trypci, "Setting this to zero will disable the" MODULE_PARM_DESC(trypci, "Setting this to zero will disable the"
" default scan of the interfaces identified via pci"); " default scan of the interfaces identified via pci");
#define PCI_CLASS_SERIAL_IPMI 0x0c07
#define PCI_CLASS_SERIAL_IPMI_SMIC 0x0c0700
#define PCI_CLASS_SERIAL_IPMI_KCS 0x0c0701
#define PCI_CLASS_SERIAL_IPMI_BT 0x0c0702
#define PCI_DEVICE_ID_HP_MMC 0x121A #define PCI_DEVICE_ID_HP_MMC 0x121A
static void ipmi_pci_cleanup(struct si_sm_io *io) static void ipmi_pci_cleanup(struct si_sm_io *io)
...@@ -45,8 +41,7 @@ static int ipmi_pci_probe_regspacing(struct si_sm_io *io) ...@@ -45,8 +41,7 @@ static int ipmi_pci_probe_regspacing(struct si_sm_io *io)
for (regspacing = DEFAULT_REGSPACING; regspacing <= 16;) { for (regspacing = DEFAULT_REGSPACING; regspacing <= 16;) {
io->regspacing = regspacing; io->regspacing = regspacing;
if (io->io_setup(io)) { if (io->io_setup(io)) {
dev_err(io->dev, dev_err(io->dev, "Could not setup I/O space\n");
"Could not setup I/O space\n");
return DEFAULT_REGSPACING; return DEFAULT_REGSPACING;
} }
/* write invalid cmd */ /* write invalid cmd */
...@@ -120,6 +115,8 @@ static int ipmi_pci_probe(struct pci_dev *pdev, ...@@ -120,6 +115,8 @@ static int ipmi_pci_probe(struct pci_dev *pdev,
} }
io.addr_data = pci_resource_start(pdev, 0); io.addr_data = pci_resource_start(pdev, 0);
io.dev = &pdev->dev;
io.regspacing = ipmi_pci_probe_regspacing(&io); io.regspacing = ipmi_pci_probe_regspacing(&io);
io.regsize = DEFAULT_REGSIZE; io.regsize = DEFAULT_REGSIZE;
io.regshift = 0; io.regshift = 0;
...@@ -128,8 +125,6 @@ static int ipmi_pci_probe(struct pci_dev *pdev, ...@@ -128,8 +125,6 @@ static int ipmi_pci_probe(struct pci_dev *pdev,
if (io.irq) if (io.irq)
io.irq_setup = ipmi_std_irq_setup; io.irq_setup = ipmi_std_irq_setup;
io.dev = &pdev->dev;
dev_info(&pdev->dev, "%pR regsize %d spacing %d irq %d\n", dev_info(&pdev->dev, "%pR regsize %d spacing %d irq %d\n",
&pdev->resource[0], io.regsize, io.regspacing, io.irq); &pdev->resource[0], io.regsize, io.regspacing, io.irq);
...@@ -166,7 +161,7 @@ void ipmi_si_pci_init(void) ...@@ -166,7 +161,7 @@ void ipmi_si_pci_init(void)
if (si_trypci) { if (si_trypci) {
int rv = pci_register_driver(&ipmi_pci_driver); int rv = pci_register_driver(&ipmi_pci_driver);
if (rv) if (rv)
pr_err(PFX "Unable to register PCI driver: %d\n", rv); pr_err("Unable to register PCI driver: %d\n", rv);
else else
pci_registered = true; pci_registered = true;
} }
......
...@@ -5,6 +5,10 @@ ...@@ -5,6 +5,10 @@
* Handling for platform devices in IPMI (ACPI, OF, and things * Handling for platform devices in IPMI (ACPI, OF, and things
* coming from the platform. * coming from the platform.
*/ */
#define pr_fmt(fmt) "ipmi_platform: " fmt
#define dev_fmt pr_fmt
#include <linux/types.h> #include <linux/types.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/of_device.h> #include <linux/of_device.h>
...@@ -15,8 +19,6 @@ ...@@ -15,8 +19,6 @@
#include "ipmi_si.h" #include "ipmi_si.h"
#include "ipmi_dmi.h" #include "ipmi_dmi.h"
#define PFX "ipmi_platform: "
static bool si_tryplatform = true; static bool si_tryplatform = true;
#ifdef CONFIG_ACPI #ifdef CONFIG_ACPI
static bool si_tryacpi = true; static bool si_tryacpi = true;
...@@ -158,7 +160,7 @@ static int platform_ipmi_probe(struct platform_device *pdev) ...@@ -158,7 +160,7 @@ static int platform_ipmi_probe(struct platform_device *pdev)
memset(&io, 0, sizeof(io)); memset(&io, 0, sizeof(io));
io.addr_source = addr_source; io.addr_source = addr_source;
dev_info(&pdev->dev, PFX "probing via %s\n", dev_info(&pdev->dev, "probing via %s\n",
ipmi_addr_src_to_str(addr_source)); ipmi_addr_src_to_str(addr_source));
switch (type) { switch (type) {
...@@ -236,25 +238,25 @@ static int of_ipmi_probe(struct platform_device *pdev) ...@@ -236,25 +238,25 @@ static int of_ipmi_probe(struct platform_device *pdev)
ret = of_address_to_resource(np, 0, &resource); ret = of_address_to_resource(np, 0, &resource);
if (ret) { if (ret) {
dev_warn(&pdev->dev, PFX "invalid address from OF\n"); dev_warn(&pdev->dev, "invalid address from OF\n");
return ret; return ret;
} }
regsize = of_get_property(np, "reg-size", &proplen); regsize = of_get_property(np, "reg-size", &proplen);
if (regsize && proplen != 4) { if (regsize && proplen != 4) {
dev_warn(&pdev->dev, PFX "invalid regsize from OF\n"); dev_warn(&pdev->dev, "invalid regsize from OF\n");
return -EINVAL; return -EINVAL;
} }
regspacing = of_get_property(np, "reg-spacing", &proplen); regspacing = of_get_property(np, "reg-spacing", &proplen);
if (regspacing && proplen != 4) { if (regspacing && proplen != 4) {
dev_warn(&pdev->dev, PFX "invalid regspacing from OF\n"); dev_warn(&pdev->dev, "invalid regspacing from OF\n");
return -EINVAL; return -EINVAL;
} }
regshift = of_get_property(np, "reg-shift", &proplen); regshift = of_get_property(np, "reg-shift", &proplen);
if (regshift && proplen != 4) { if (regshift && proplen != 4) {
dev_warn(&pdev->dev, PFX "invalid regshift from OF\n"); dev_warn(&pdev->dev, "invalid regshift from OF\n");
return -EINVAL; return -EINVAL;
} }
...@@ -326,7 +328,7 @@ static int acpi_ipmi_probe(struct platform_device *pdev) ...@@ -326,7 +328,7 @@ static int acpi_ipmi_probe(struct platform_device *pdev)
memset(&io, 0, sizeof(io)); memset(&io, 0, sizeof(io));
io.addr_source = SI_ACPI; io.addr_source = SI_ACPI;
dev_info(&pdev->dev, PFX "probing via ACPI\n"); dev_info(&pdev->dev, "probing via ACPI\n");
io.addr_info.acpi_info.acpi_handle = handle; io.addr_info.acpi_info.acpi_handle = handle;
...@@ -417,6 +419,11 @@ static int ipmi_remove(struct platform_device *pdev) ...@@ -417,6 +419,11 @@ static int ipmi_remove(struct platform_device *pdev)
return ipmi_si_remove_by_dev(&pdev->dev); return ipmi_si_remove_by_dev(&pdev->dev);
} }
static const struct platform_device_id si_plat_ids[] = {
{ "dmi-ipmi-si", 0 },
{ }
};
struct platform_driver ipmi_platform_driver = { struct platform_driver ipmi_platform_driver = {
.driver = { .driver = {
.name = DEVICE_NAME, .name = DEVICE_NAME,
...@@ -425,13 +432,14 @@ struct platform_driver ipmi_platform_driver = { ...@@ -425,13 +432,14 @@ struct platform_driver ipmi_platform_driver = {
}, },
.probe = ipmi_probe, .probe = ipmi_probe,
.remove = ipmi_remove, .remove = ipmi_remove,
.id_table = si_plat_ids
}; };
void ipmi_si_platform_init(void) void ipmi_si_platform_init(void)
{ {
int rv = platform_driver_register(&ipmi_platform_driver); int rv = platform_driver_register(&ipmi_platform_driver);
if (rv) if (rv)
pr_err(PFX "Unable to register driver: %d\n", rv); pr_err("Unable to register driver: %d\n", rv);
} }
void ipmi_si_platform_shutdown(void) void ipmi_si_platform_shutdown(void)
......
...@@ -132,8 +132,8 @@ static int start_smic_transaction(struct si_sm_data *smic, ...@@ -132,8 +132,8 @@ static int start_smic_transaction(struct si_sm_data *smic,
if (smic_debug & SMIC_DEBUG_MSG) { if (smic_debug & SMIC_DEBUG_MSG) {
printk(KERN_DEBUG "start_smic_transaction -"); printk(KERN_DEBUG "start_smic_transaction -");
for (i = 0; i < size; i++) for (i = 0; i < size; i++)
printk(" %02x", (unsigned char) data[i]); pr_cont(" %02x", data[i]);
printk("\n"); pr_cont("\n");
} }
smic->error_retries = 0; smic->error_retries = 0;
memcpy(smic->write_data, data, size); memcpy(smic->write_data, data, size);
...@@ -154,8 +154,8 @@ static int smic_get_result(struct si_sm_data *smic, ...@@ -154,8 +154,8 @@ static int smic_get_result(struct si_sm_data *smic,
if (smic_debug & SMIC_DEBUG_MSG) { if (smic_debug & SMIC_DEBUG_MSG) {
printk(KERN_DEBUG "smic_get result -"); printk(KERN_DEBUG "smic_get result -");
for (i = 0; i < smic->read_pos; i++) for (i = 0; i < smic->read_pos; i++)
printk(" %02x", smic->read_data[i]); pr_cont(" %02x", smic->read_data[i]);
printk("\n"); pr_cont("\n");
} }
if (length < smic->read_pos) { if (length < smic->read_pos) {
smic->read_pos = length; smic->read_pos = length;
...@@ -212,8 +212,7 @@ static inline void start_error_recovery(struct si_sm_data *smic, char *reason) ...@@ -212,8 +212,7 @@ static inline void start_error_recovery(struct si_sm_data *smic, char *reason)
(smic->error_retries)++; (smic->error_retries)++;
if (smic->error_retries > SMIC_MAX_ERROR_RETRIES) { if (smic->error_retries > SMIC_MAX_ERROR_RETRIES) {
if (smic_debug & SMIC_DEBUG_ENABLE) if (smic_debug & SMIC_DEBUG_ENABLE)
printk(KERN_WARNING pr_warn("ipmi_smic_drv: smic hosed: %s\n", reason);
"ipmi_smic_drv: smic hosed: %s\n", reason);
smic->state = SMIC_HOSED; smic->state = SMIC_HOSED;
} else { } else {
smic->write_count = smic->orig_write_count; smic->write_count = smic->orig_write_count;
...@@ -326,8 +325,7 @@ static enum si_sm_result smic_event(struct si_sm_data *smic, long time) ...@@ -326,8 +325,7 @@ static enum si_sm_result smic_event(struct si_sm_data *smic, long time)
if (smic->state != SMIC_IDLE) { if (smic->state != SMIC_IDLE) {
if (smic_debug & SMIC_DEBUG_STATES) if (smic_debug & SMIC_DEBUG_STATES)
printk(KERN_DEBUG printk(KERN_DEBUG
"smic_event - smic->smic_timeout = %ld," "smic_event - smic->smic_timeout = %ld, time = %ld\n",
" time = %ld\n",
smic->smic_timeout, time); smic->smic_timeout, time);
/* /*
* FIXME: smic_event is sometimes called with time > * FIXME: smic_event is sometimes called with time >
...@@ -347,9 +345,7 @@ static enum si_sm_result smic_event(struct si_sm_data *smic, long time) ...@@ -347,9 +345,7 @@ static enum si_sm_result smic_event(struct si_sm_data *smic, long time)
status = read_smic_status(smic); status = read_smic_status(smic);
if (smic_debug & SMIC_DEBUG_STATES) if (smic_debug & SMIC_DEBUG_STATES)
printk(KERN_DEBUG printk(KERN_DEBUG "smic_event - state = %d, flags = 0x%02x, status = 0x%02x\n",
"smic_event - state = %d, flags = 0x%02x,"
" status = 0x%02x\n",
smic->state, flags, status); smic->state, flags, status);
switch (smic->state) { switch (smic->state) {
...@@ -440,8 +436,8 @@ static enum si_sm_result smic_event(struct si_sm_data *smic, long time) ...@@ -440,8 +436,8 @@ static enum si_sm_result smic_event(struct si_sm_data *smic, long time)
data = read_smic_data(smic); data = read_smic_data(smic);
if (data != 0) { if (data != 0) {
if (smic_debug & SMIC_DEBUG_ENABLE) if (smic_debug & SMIC_DEBUG_ENABLE)
printk(KERN_DEBUG printk(KERN_DEBUG "SMIC_WRITE_END: data = %02x\n",
"SMIC_WRITE_END: data = %02x\n", data); data);
start_error_recovery(smic, start_error_recovery(smic,
"state = SMIC_WRITE_END, " "state = SMIC_WRITE_END, "
"data != SUCCESS"); "data != SUCCESS");
...@@ -520,8 +516,8 @@ static enum si_sm_result smic_event(struct si_sm_data *smic, long time) ...@@ -520,8 +516,8 @@ static enum si_sm_result smic_event(struct si_sm_data *smic, long time)
/* data register holds an error code */ /* data register holds an error code */
if (data != 0) { if (data != 0) {
if (smic_debug & SMIC_DEBUG_ENABLE) if (smic_debug & SMIC_DEBUG_ENABLE)
printk(KERN_DEBUG printk(KERN_DEBUG "SMIC_READ_END: data = %02x\n",
"SMIC_READ_END: data = %02x\n", data); data);
start_error_recovery(smic, start_error_recovery(smic,
"state = SMIC_READ_END, " "state = SMIC_READ_END, "
"data != SUCCESS"); "data != SUCCESS");
......
This diff is collapsed.
...@@ -11,6 +11,8 @@ ...@@ -11,6 +11,8 @@
* Copyright 2002 MontaVista Software Inc. * Copyright 2002 MontaVista Software Inc.
*/ */
#define pr_fmt(fmt) "IPMI Watchdog: " fmt
#include <linux/module.h> #include <linux/module.h>
#include <linux/moduleparam.h> #include <linux/moduleparam.h>
#include <linux/ipmi.h> #include <linux/ipmi.h>
...@@ -50,8 +52,6 @@ ...@@ -50,8 +52,6 @@
#define HAVE_DIE_NMI #define HAVE_DIE_NMI
#endif #endif
#define PFX "IPMI Watchdog: "
/* /*
* The IPMI command/response information for the watchdog timer. * The IPMI command/response information for the watchdog timer.
*/ */
...@@ -407,7 +407,7 @@ static int __ipmi_set_timeout(struct ipmi_smi_msg *smi_msg, ...@@ -407,7 +407,7 @@ static int __ipmi_set_timeout(struct ipmi_smi_msg *smi_msg,
recv_msg, recv_msg,
1); 1);
if (rv) if (rv)
pr_warn(PFX "set timeout error: %d\n", rv); pr_warn("set timeout error: %d\n", rv);
else if (send_heartbeat_now) else if (send_heartbeat_now)
*send_heartbeat_now = hbnow; *send_heartbeat_now = hbnow;
...@@ -530,7 +530,7 @@ static void panic_halt_ipmi_set_timeout(void) ...@@ -530,7 +530,7 @@ static void panic_halt_ipmi_set_timeout(void)
&send_heartbeat_now); &send_heartbeat_now);
if (rv) { if (rv) {
atomic_sub(1, &panic_done_count); atomic_sub(1, &panic_done_count);
pr_warn(PFX "Unable to extend the watchdog timeout."); pr_warn("Unable to extend the watchdog timeout\n");
} else { } else {
if (send_heartbeat_now) if (send_heartbeat_now)
panic_halt_ipmi_heartbeat(); panic_halt_ipmi_heartbeat();
...@@ -573,7 +573,7 @@ static int __ipmi_heartbeat(void) ...@@ -573,7 +573,7 @@ static int __ipmi_heartbeat(void)
&recv_msg, &recv_msg,
1); 1);
if (rv) { if (rv) {
pr_warn(PFX "heartbeat send failure: %d\n", rv); pr_warn("heartbeat send failure: %d\n", rv);
return rv; return rv;
} }
...@@ -583,7 +583,7 @@ static int __ipmi_heartbeat(void) ...@@ -583,7 +583,7 @@ static int __ipmi_heartbeat(void)
if (recv_msg.msg.data[0] == IPMI_WDOG_TIMER_NOT_INIT_RESP) { if (recv_msg.msg.data[0] == IPMI_WDOG_TIMER_NOT_INIT_RESP) {
timeout_retries++; timeout_retries++;
if (timeout_retries > 3) { if (timeout_retries > 3) {
pr_err(PFX ": Unable to restore the IPMI watchdog's settings, giving up.\n"); pr_err("Unable to restore the IPMI watchdog's settings, giving up\n");
rv = -EIO; rv = -EIO;
goto out; goto out;
} }
...@@ -598,7 +598,7 @@ static int __ipmi_heartbeat(void) ...@@ -598,7 +598,7 @@ static int __ipmi_heartbeat(void)
*/ */
rv = _ipmi_set_timeout(IPMI_SET_TIMEOUT_NO_HB); rv = _ipmi_set_timeout(IPMI_SET_TIMEOUT_NO_HB);
if (rv) { if (rv) {
pr_err(PFX ": Unable to send the command to set the watchdog's settings, giving up.\n"); pr_err("Unable to send the command to set the watchdog's settings, giving up\n");
goto out; goto out;
} }
...@@ -876,8 +876,7 @@ static int ipmi_close(struct inode *ino, struct file *filep) ...@@ -876,8 +876,7 @@ static int ipmi_close(struct inode *ino, struct file *filep)
_ipmi_set_timeout(IPMI_SET_TIMEOUT_NO_HB); _ipmi_set_timeout(IPMI_SET_TIMEOUT_NO_HB);
mutex_unlock(&ipmi_watchdog_mutex); mutex_unlock(&ipmi_watchdog_mutex);
} else { } else {
pr_crit(PFX pr_crit("Unexpected close, not stopping watchdog!\n");
"Unexpected close, not stopping watchdog!\n");
ipmi_heartbeat(); ipmi_heartbeat();
} }
clear_bit(0, &ipmi_wdog_open); clear_bit(0, &ipmi_wdog_open);
...@@ -911,9 +910,9 @@ static void ipmi_wdog_msg_handler(struct ipmi_recv_msg *msg, ...@@ -911,9 +910,9 @@ static void ipmi_wdog_msg_handler(struct ipmi_recv_msg *msg,
{ {
if (msg->msg.cmd == IPMI_WDOG_RESET_TIMER && if (msg->msg.cmd == IPMI_WDOG_RESET_TIMER &&
msg->msg.data[0] == IPMI_WDOG_TIMER_NOT_INIT_RESP) msg->msg.data[0] == IPMI_WDOG_TIMER_NOT_INIT_RESP)
pr_info(PFX "response: The IPMI controller appears to have been reset, will attempt to reinitialize the watchdog timer\n"); pr_info("response: The IPMI controller appears to have been reset, will attempt to reinitialize the watchdog timer\n");
else if (msg->msg.data[0] != 0) else if (msg->msg.data[0] != 0)
pr_err(PFX "response: Error %x on cmd %x\n", pr_err("response: Error %x on cmd %x\n",
msg->msg.data[0], msg->msg.data[0],
msg->msg.cmd); msg->msg.cmd);
...@@ -985,7 +984,7 @@ static void ipmi_register_watchdog(int ipmi_intf) ...@@ -985,7 +984,7 @@ static void ipmi_register_watchdog(int ipmi_intf)
rv = ipmi_create_user(ipmi_intf, &ipmi_hndlrs, NULL, &watchdog_user); rv = ipmi_create_user(ipmi_intf, &ipmi_hndlrs, NULL, &watchdog_user);
if (rv < 0) { if (rv < 0) {
pr_crit(PFX "Unable to register with ipmi\n"); pr_crit("Unable to register with ipmi\n");
goto out; goto out;
} }
...@@ -993,7 +992,7 @@ static void ipmi_register_watchdog(int ipmi_intf) ...@@ -993,7 +992,7 @@ static void ipmi_register_watchdog(int ipmi_intf)
&ipmi_version_major, &ipmi_version_major,
&ipmi_version_minor); &ipmi_version_minor);
if (rv) { if (rv) {
pr_warn(PFX "Unable to get IPMI version, assuming 1.0\n"); pr_warn("Unable to get IPMI version, assuming 1.0\n");
ipmi_version_major = 1; ipmi_version_major = 1;
ipmi_version_minor = 0; ipmi_version_minor = 0;
} }
...@@ -1002,7 +1001,7 @@ static void ipmi_register_watchdog(int ipmi_intf) ...@@ -1002,7 +1001,7 @@ static void ipmi_register_watchdog(int ipmi_intf)
if (rv < 0) { if (rv < 0) {
ipmi_destroy_user(watchdog_user); ipmi_destroy_user(watchdog_user);
watchdog_user = NULL; watchdog_user = NULL;
pr_crit(PFX "Unable to register misc device\n"); pr_crit("Unable to register misc device\n");
} }
#ifdef HAVE_DIE_NMI #ifdef HAVE_DIE_NMI
...@@ -1024,7 +1023,7 @@ static void ipmi_register_watchdog(int ipmi_intf) ...@@ -1024,7 +1023,7 @@ static void ipmi_register_watchdog(int ipmi_intf)
rv = ipmi_set_timeout(IPMI_SET_TIMEOUT_FORCE_HB); rv = ipmi_set_timeout(IPMI_SET_TIMEOUT_FORCE_HB);
if (rv) { if (rv) {
pr_warn(PFX "Error starting timer to test NMI: 0x%x. The NMI pretimeout will likely not work\n", pr_warn("Error starting timer to test NMI: 0x%x. The NMI pretimeout will likely not work\n",
rv); rv);
rv = 0; rv = 0;
goto out_restore; goto out_restore;
...@@ -1033,7 +1032,7 @@ static void ipmi_register_watchdog(int ipmi_intf) ...@@ -1033,7 +1032,7 @@ static void ipmi_register_watchdog(int ipmi_intf)
msleep(1500); msleep(1500);
if (testing_nmi != 2) { if (testing_nmi != 2) {
pr_warn(PFX "IPMI NMI didn't seem to occur. The NMI pretimeout will likely not work\n"); pr_warn("IPMI NMI didn't seem to occur. The NMI pretimeout will likely not work\n");
} }
out_restore: out_restore:
testing_nmi = 0; testing_nmi = 0;
...@@ -1049,7 +1048,7 @@ static void ipmi_register_watchdog(int ipmi_intf) ...@@ -1049,7 +1048,7 @@ static void ipmi_register_watchdog(int ipmi_intf)
start_now = 0; /* Disable this function after first startup. */ start_now = 0; /* Disable this function after first startup. */
ipmi_watchdog_state = action_val; ipmi_watchdog_state = action_val;
ipmi_set_timeout(IPMI_SET_TIMEOUT_FORCE_HB); ipmi_set_timeout(IPMI_SET_TIMEOUT_FORCE_HB);
pr_info(PFX "Starting now!\n"); pr_info("Starting now!\n");
} else { } else {
/* Stop the timer now. */ /* Stop the timer now. */
ipmi_watchdog_state = WDOG_TIMEOUT_NONE; ipmi_watchdog_state = WDOG_TIMEOUT_NONE;
...@@ -1086,7 +1085,7 @@ static void ipmi_unregister_watchdog(int ipmi_intf) ...@@ -1086,7 +1085,7 @@ static void ipmi_unregister_watchdog(int ipmi_intf)
/* Disconnect from IPMI. */ /* Disconnect from IPMI. */
rv = ipmi_destroy_user(loc_user); rv = ipmi_destroy_user(loc_user);
if (rv) if (rv)
pr_warn(PFX "error unlinking from IPMI: %d\n", rv); pr_warn("error unlinking from IPMI: %d\n", rv);
/* If it comes back, restart it properly. */ /* If it comes back, restart it properly. */
ipmi_start_timer_on_heartbeat = 1; ipmi_start_timer_on_heartbeat = 1;
...@@ -1127,7 +1126,7 @@ ipmi_nmi(unsigned int val, struct pt_regs *regs) ...@@ -1127,7 +1126,7 @@ ipmi_nmi(unsigned int val, struct pt_regs *regs)
the timer. So do so. */ the timer. So do so. */
atomic_set(&pretimeout_since_last_heartbeat, 1); atomic_set(&pretimeout_since_last_heartbeat, 1);
if (atomic_inc_and_test(&preop_panic_excl)) if (atomic_inc_and_test(&preop_panic_excl))
nmi_panic(regs, PFX "pre-timeout"); nmi_panic(regs, "pre-timeout");
} }
return NMI_HANDLED; return NMI_HANDLED;
...@@ -1259,7 +1258,7 @@ static void check_parms(void) ...@@ -1259,7 +1258,7 @@ static void check_parms(void)
if (preaction_val == WDOG_PRETIMEOUT_NMI) { if (preaction_val == WDOG_PRETIMEOUT_NMI) {
do_nmi = 1; do_nmi = 1;
if (preop_val == WDOG_PREOP_GIVE_DATA) { if (preop_val == WDOG_PREOP_GIVE_DATA) {
pr_warn(PFX "Pretimeout op is to give data but NMI pretimeout is enabled, setting pretimeout op to none\n"); pr_warn("Pretimeout op is to give data but NMI pretimeout is enabled, setting pretimeout op to none\n");
preop_op("preop_none", NULL); preop_op("preop_none", NULL);
do_nmi = 0; do_nmi = 0;
} }
...@@ -1268,7 +1267,7 @@ static void check_parms(void) ...@@ -1268,7 +1267,7 @@ static void check_parms(void)
rv = register_nmi_handler(NMI_UNKNOWN, ipmi_nmi, 0, rv = register_nmi_handler(NMI_UNKNOWN, ipmi_nmi, 0,
"ipmi"); "ipmi");
if (rv) { if (rv) {
pr_warn(PFX "Can't register nmi handler\n"); pr_warn("Can't register nmi handler\n");
return; return;
} else } else
nmi_handler_registered = 1; nmi_handler_registered = 1;
...@@ -1285,19 +1284,18 @@ static int __init ipmi_wdog_init(void) ...@@ -1285,19 +1284,18 @@ static int __init ipmi_wdog_init(void)
if (action_op(action, NULL)) { if (action_op(action, NULL)) {
action_op("reset", NULL); action_op("reset", NULL);
pr_info(PFX "Unknown action '%s', defaulting to reset\n", pr_info("Unknown action '%s', defaulting to reset\n", action);
action);
} }
if (preaction_op(preaction, NULL)) { if (preaction_op(preaction, NULL)) {
preaction_op("pre_none", NULL); preaction_op("pre_none", NULL);
pr_info(PFX "Unknown preaction '%s', defaulting to none\n", pr_info("Unknown preaction '%s', defaulting to none\n",
preaction); preaction);
} }
if (preop_op(preop, NULL)) { if (preop_op(preop, NULL)) {
preop_op("preop_none", NULL); preop_op("preop_none", NULL);
pr_info(PFX "Unknown preop '%s', defaulting to none\n", preop); pr_info("Unknown preop '%s', defaulting to none\n", preop);
} }
check_parms(); check_parms();
...@@ -1311,11 +1309,11 @@ static int __init ipmi_wdog_init(void) ...@@ -1311,11 +1309,11 @@ static int __init ipmi_wdog_init(void)
unregister_nmi_handler(NMI_UNKNOWN, "ipmi"); unregister_nmi_handler(NMI_UNKNOWN, "ipmi");
#endif #endif
unregister_reboot_notifier(&wdog_reboot_notifier); unregister_reboot_notifier(&wdog_reboot_notifier);
pr_warn(PFX "can't register smi watcher\n"); pr_warn("can't register smi watcher\n");
return rv; return rv;
} }
pr_info(PFX "driver initialized\n"); pr_info("driver initialized\n");
return 0; return 0;
} }
......
...@@ -101,7 +101,7 @@ static struct platform_driver aem_driver = { ...@@ -101,7 +101,7 @@ static struct platform_driver aem_driver = {
struct aem_ipmi_data { struct aem_ipmi_data {
struct completion read_complete; struct completion read_complete;
struct ipmi_addr address; struct ipmi_addr address;
ipmi_user_t user; struct ipmi_user *user;
int interface; int interface;
struct kernel_ipmi_msg tx_message; struct kernel_ipmi_msg tx_message;
......
...@@ -84,7 +84,7 @@ struct ibmpex_bmc_data { ...@@ -84,7 +84,7 @@ struct ibmpex_bmc_data {
struct ipmi_addr address; struct ipmi_addr address;
struct completion read_complete; struct completion read_complete;
ipmi_user_t user; struct ipmi_user *user;
int interface; int interface;
struct kernel_ipmi_msg tx_message; struct kernel_ipmi_msg tx_message;
......
...@@ -27,7 +27,7 @@ struct device; ...@@ -27,7 +27,7 @@ struct device;
* Opaque type for a IPMI message user. One of these is needed to * Opaque type for a IPMI message user. One of these is needed to
* send and receive messages. * send and receive messages.
*/ */
typedef struct ipmi_user *ipmi_user_t; struct ipmi_user;
/* /*
* Stuff coming from the receive interface comes as one of these. * Stuff coming from the receive interface comes as one of these.
......
...@@ -28,7 +28,7 @@ struct device; ...@@ -28,7 +28,7 @@ struct device;
*/ */
/* Structure for the low-level drivers. */ /* Structure for the low-level drivers. */
typedef struct ipmi_smi *ipmi_smi_t; struct ipmi_smi;
/* /*
* Messages to/from the lower layer. The smi interface will take one * Messages to/from the lower layer. The smi interface will take one
......
...@@ -117,6 +117,10 @@ ...@@ -117,6 +117,10 @@
#define PCI_CLASS_SERIAL_USB_DEVICE 0x0c03fe #define PCI_CLASS_SERIAL_USB_DEVICE 0x0c03fe
#define PCI_CLASS_SERIAL_FIBER 0x0c04 #define PCI_CLASS_SERIAL_FIBER 0x0c04
#define PCI_CLASS_SERIAL_SMBUS 0x0c05 #define PCI_CLASS_SERIAL_SMBUS 0x0c05
#define PCI_CLASS_SERIAL_IPMI 0x0c07
#define PCI_CLASS_SERIAL_IPMI_SMIC 0x0c0700
#define PCI_CLASS_SERIAL_IPMI_KCS 0x0c0701
#define PCI_CLASS_SERIAL_IPMI_BT 0x0c0702
#define PCI_BASE_CLASS_WIRELESS 0x0d #define PCI_BASE_CLASS_WIRELESS 0x0d
#define PCI_CLASS_WIRELESS_RF_CONTROLLER 0x0d10 #define PCI_CLASS_WIRELESS_RF_CONTROLLER 0x0d10
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment