From 4065d81705714bb5690e48e765612f8149f708f6 Mon Sep 17 00:00:00 2001 From: Alex Lai Date: Thu, 23 Oct 2025 09:55:16 +0000 Subject: [PATCH] [Accton][as7946-74xkb] Modularize IPMI-Related functions 1. move the ipmi-related data and functions to accton_ipmi_intf.h and accton_ipmi_intf.c Signed-off-by: Alex Lai --- .../as7946-74xkb/modules/builds/Makefile | 2 +- .../as7946-74xkb/modules/builds/src/Makefile | 7 + .../modules/builds/src/accton_ipmi_intf.c | 232 ++++++++++++++++++ .../modules/builds/src/accton_ipmi_intf.h | 72 ++++++ .../x86-64-accton-as7946-74xkb-cpld.c | 0 .../x86-64-accton-as7946-74xkb-fan.c | 158 +----------- .../x86-64-accton-as7946-74xkb-leds.c | 158 +----------- .../x86-64-accton-as7946-74xkb-psu.c | 158 +----------- .../x86-64-accton-as7946-74xkb-sys.c | 130 +--------- .../x86-64-accton-as7946-74xkb-thermal.c | 159 +----------- .../x86_64_accton_as7946_74xkb_r0/__init__.py | 1 + 11 files changed, 318 insertions(+), 759 deletions(-) create mode 100644 packages/platforms/accton/x86-64/as7946-74xkb/modules/builds/src/Makefile create mode 100644 packages/platforms/accton/x86-64/as7946-74xkb/modules/builds/src/accton_ipmi_intf.c create mode 100644 packages/platforms/accton/x86-64/as7946-74xkb/modules/builds/src/accton_ipmi_intf.h rename packages/platforms/accton/x86-64/as7946-74xkb/modules/builds/{ => src}/x86-64-accton-as7946-74xkb-cpld.c (100%) rename packages/platforms/accton/x86-64/as7946-74xkb/modules/builds/{ => src}/x86-64-accton-as7946-74xkb-fan.c (74%) rename packages/platforms/accton/x86-64/as7946-74xkb/modules/builds/{ => src}/x86-64-accton-as7946-74xkb-leds.c (69%) rename packages/platforms/accton/x86-64/as7946-74xkb/modules/builds/{ => src}/x86-64-accton-as7946-74xkb-psu.c (79%) rename packages/platforms/accton/x86-64/as7946-74xkb/modules/builds/{ => src}/x86-64-accton-as7946-74xkb-sys.c (70%) rename packages/platforms/accton/x86-64/as7946-74xkb/modules/builds/{ => src}/x86-64-accton-as7946-74xkb-thermal.c (60%) diff --git a/packages/platforms/accton/x86-64/as7946-74xkb/modules/builds/Makefile b/packages/platforms/accton/x86-64/as7946-74xkb/modules/builds/Makefile index 19e99372fe..fe3bb5f0e9 100644 --- a/packages/platforms/accton/x86-64/as7946-74xkb/modules/builds/Makefile +++ b/packages/platforms/accton/x86-64/as7946-74xkb/modules/builds/Makefile @@ -1,5 +1,5 @@ KERNELS := onl-kernel-5.4-lts-x86-64-all:amd64 -KMODULES := $(wildcard *.c) +KMODULES := src VENDOR := accton BASENAME := x86-64-accton-as7946-74xkb ARCH := x86_64 diff --git a/packages/platforms/accton/x86-64/as7946-74xkb/modules/builds/src/Makefile b/packages/platforms/accton/x86-64/as7946-74xkb/modules/builds/src/Makefile new file mode 100644 index 0000000000..2bc8c322ac --- /dev/null +++ b/packages/platforms/accton/x86-64/as7946-74xkb/modules/builds/src/Makefile @@ -0,0 +1,7 @@ +obj-m += accton_ipmi_intf.o +obj-m += x86-64-accton-as7946-74xkb-cpld.o +obj-m += x86-64-accton-as7946-74xkb-fan.o +obj-m += x86-64-accton-as7946-74xkb-leds.o +obj-m += x86-64-accton-as7946-74xkb-psu.o +obj-m += x86-64-accton-as7946-74xkb-sys.o +obj-m += x86-64-accton-as7946-74xkb-thermal.o \ No newline at end of file diff --git a/packages/platforms/accton/x86-64/as7946-74xkb/modules/builds/src/accton_ipmi_intf.c b/packages/platforms/accton/x86-64/as7946-74xkb/modules/builds/src/accton_ipmi_intf.c new file mode 100644 index 0000000000..48a0c9acfd --- /dev/null +++ b/packages/platforms/accton/x86-64/as7946-74xkb/modules/builds/src/accton_ipmi_intf.c @@ -0,0 +1,232 @@ +// SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0 +/* + * Copyright 2024 Accton Technology Corporation. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * + * Description: + * IPMI driver related interface implementation + */ +#include +#include +#include +#include "accton_ipmi_intf.h" + +#define ACCTON_IPMI_NETFN 0x34 +#define IPMI_TIMEOUT (5 * HZ) +#define IPMI_ERR_RETRY_TIMES 1 +#define RAW_CMD_BUF_SIZE 40 + +static void ipmi_msg_handler(struct ipmi_recv_msg *msg, void *user_msg_data); + +/* Functions to talk to the IPMI layer */ + +/* Initialize IPMI data structure and create a user interface for communication */ +int init_ipmi_data(struct ipmi_data *ipmi, int iface, struct device *dev) +{ + int err; + + if (!ipmi || !dev) + return -EINVAL; + + init_completion(&ipmi->read_complete); + + // Initialize IPMI address + ipmi->address.addr_type = IPMI_SYSTEM_INTERFACE_ADDR_TYPE; + ipmi->address.channel = IPMI_BMC_CHANNEL; + ipmi->address.data[0] = 0; + ipmi->interface = iface; + ipmi->dev = dev; // Storing the device for future reference + + // Initialize message buffers + ipmi->tx_msgid = 0; + ipmi->tx_message.netfn = ACCTON_IPMI_NETFN; + + // Assign the message handler + ipmi->ipmi_hndlrs.ipmi_recv_hndl = ipmi_msg_handler; + + // Create IPMI messaging interface user + err = ipmi_create_user(ipmi->interface, &ipmi->ipmi_hndlrs, + ipmi, &ipmi->user); + if (err < 0) { + dev_err(dev, + "Unable to register user with IPMI interface %d, err: %d\n", + ipmi->interface, err); + return err; + } + + return 0; +} +EXPORT_SYMBOL(init_ipmi_data); + +/* Handler function for receiving IPMI messages */ +static void ipmi_msg_handler(struct ipmi_recv_msg *msg, void *user_msg_data) +{ + unsigned short rx_len; + struct ipmi_data *ipmi = user_msg_data; + + // Check for message ID mismatch + if (msg->msgid != ipmi->tx_msgid) { + dev_err(ipmi->dev, "Mismatch between received msgid " + "(%02x) and transmitted msgid (%02x)!\n", + (int)msg->msgid, (int)ipmi->tx_msgid); + ipmi_free_recv_msg(msg); + return; + } + + // Handle received message type + ipmi->rx_recv_type = msg->recv_type; + + // Parse message data + if (msg->msg.data_len > 0) + ipmi->rx_result = msg->msg.data[0]; + else + ipmi->rx_result = IPMI_UNKNOWN_ERR_COMPLETION_CODE; + + // Copy remaining message data if available + if (msg->msg.data_len > 1) { + rx_len = msg->msg.data_len - 1; + if (ipmi->rx_msg_len < rx_len) + rx_len = ipmi->rx_msg_len; + + ipmi->rx_msg_len = rx_len; + memcpy(ipmi->rx_msg_data, msg->msg.data + 1, ipmi->rx_msg_len); + } else { + ipmi->rx_msg_len = 0; + } + + // Free the received message and signal completion + ipmi_free_recv_msg(msg); + complete(&ipmi->read_complete); +} + +static void _ipmi_log_error(struct ipmi_data *ipmi, unsigned char cmd, + unsigned char *tx_data, unsigned short tx_len, + int status, int retry) +{ + int i, pos; + char *cmdline = NULL; + char raw_cmd[RAW_CMD_BUF_SIZE] = { 0 }; + + // Format the command and data into a raw command string + pos = snprintf(raw_cmd, sizeof(raw_cmd), "0x%02x", cmd); + for (i = 0; i < tx_len && pos < sizeof(raw_cmd); i++) { + pos += snprintf(raw_cmd + pos, sizeof(raw_cmd) - pos, + " 0x%02x", tx_data[i]); + } + + // Log the error message + cmdline = kstrdup_quotable_cmdline(current, GFP_KERNEL); + dev_err(ipmi->dev, + "ipmi_send_message: retry(%d), error(%d), cmd(%s) raw_cmd=[%s]\r\n", + retry, status, cmdline ? cmdline : "", raw_cmd); + + if (cmdline) { + kfree(cmdline); + } +} + +/* Send an IPMI command */ +static int _ipmi_send_message(struct ipmi_data *ipmi, unsigned char cmd, + unsigned char *tx_data, unsigned short tx_len, + unsigned char *rx_data, unsigned short rx_len) +{ + int err; + + // Validate the input parameters + if ((tx_len && !tx_data) || (rx_len && !rx_data)) { + return -EINVAL; + } + + // Initialize IPMI message + ipmi->tx_message.cmd = cmd; + ipmi->tx_message.data = tx_len ? tx_data : NULL; + ipmi->tx_message.data_len = tx_len; + ipmi->rx_msg_data = rx_len ? rx_data : NULL; + ipmi->rx_msg_len = rx_len; + + // Validate the IPMI address + err = ipmi_validate_addr(&ipmi->address, sizeof(ipmi->address)); + if (err) { + dev_err(ipmi->dev, "Invalid IPMI address: %x\n", err); + return err; + } + + // Increment message ID and send the request + ipmi->tx_msgid++; + err = ipmi_request_settime(ipmi->user, &ipmi->address, ipmi->tx_msgid, + &ipmi->tx_message, ipmi, 0, 0, 0); + if (err) { + dev_err(ipmi->dev, "IPMI request_settime failed: %x\n", err); + return err; + } + + // Wait for the message to complete + err = wait_for_completion_timeout(&ipmi->read_complete, IPMI_TIMEOUT); + if (!err) { + dev_err(ipmi->dev, "IPMI command timeout\n"); + return -ETIMEDOUT; + } + + return 0; +} + +/* Send an IPMI command to the IPMI device and receive the response */ +int ipmi_send_message(struct ipmi_data *ipmi, unsigned char cmd, + unsigned char *tx_data, unsigned short tx_len, + unsigned char *rx_data, unsigned short rx_len) +{ + int status = 0, retry = 0; + + // Validate the input parameters + if ((tx_len && !tx_data) || (rx_len && !rx_data)) { + return -EINVAL; + } + + for (retry = 0; retry <= IPMI_ERR_RETRY_TIMES; retry++) { + status = _ipmi_send_message(ipmi, cmd, tx_data, tx_len, rx_data, rx_len); + if (unlikely(status != 0)) { + _ipmi_log_error(ipmi, cmd, tx_data, tx_len, status, retry); + continue; + } + + if (unlikely(ipmi->rx_result != 0)) { + _ipmi_log_error(ipmi, cmd, tx_data, tx_len, status, retry); + continue; + } + + // Success, exit the retry loop + break; + } + + return status; +} + +EXPORT_SYMBOL(ipmi_send_message); + +static int __init ipmi_module_init(void) +{ + printk(KERN_INFO "Accton IPMI Module loaded\n"); + return 0; +} + +static void __exit ipmi_module_exit(void) +{ + printk(KERN_INFO "Accton IPMI Module unloaded\n"); +} + +module_init(ipmi_module_init); +module_exit(ipmi_module_exit); + +MODULE_AUTHOR("Brandon Chuang "); +MODULE_DESCRIPTION("Accton IPMI messaging module"); +MODULE_LICENSE("GPL"); diff --git a/packages/platforms/accton/x86-64/as7946-74xkb/modules/builds/src/accton_ipmi_intf.h b/packages/platforms/accton/x86-64/as7946-74xkb/modules/builds/src/accton_ipmi_intf.h new file mode 100644 index 0000000000..4b2fe59f93 --- /dev/null +++ b/packages/platforms/accton/x86-64/as7946-74xkb/modules/builds/src/accton_ipmi_intf.h @@ -0,0 +1,72 @@ +// SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0 +/* + * Copyright 2024 Accton Technology Corporation. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * + * Description: + * IPMI driver related interface declarations + */ + +#ifndef ACCTON_IPMI_INTF_H +#define ACCTON_IPMI_INTF_H + +#include +#include + +/* Structure to hold IPMI (Intelligent Platform Management Interface) data */ +struct ipmi_data { + struct completion read_complete; // Synchronization primitive for signaling message read completion + struct ipmi_addr address; // Structure to store the IPMI system interface address + struct ipmi_user *user; // Pointer to IPMI user created by the kernel + int interface; // Interface identifier for the IPMI system + + struct kernel_ipmi_msg tx_message; // Message structure for sending IPMI commands + long tx_msgid; // Message ID for tracking IPMI message transactions + + void *rx_msg_data; // Pointer to buffer for storing received IPMI message data + unsigned short rx_msg_len; // Length of the received IPMI message + unsigned char rx_result; // Result code from the received IPMI message + int rx_recv_type; // Type of the received message (e.g., system interface, LAN, etc.) + + struct ipmi_user_hndl ipmi_hndlrs; // IPMI handler structure for handling incoming IPMI messages + struct device *dev; // Device structure for logging errors +}; + +/* Function declarations */ + +/* + * Initialize IPMI data structure and create a user interface for communication. + * + * @param ipmi: Pointer to ipmi_data structure to be initialized. + * @param iface: IPMI interface identifier. + * @param dev: Device structure for logging errors. + * @return 0 on success, or an error code on failure. + */ +extern int init_ipmi_data(struct ipmi_data *ipmi, int iface, struct device *dev); + +/* + * Send an IPMI command to the IPMI device and receive the response. + * + * @param ipmi: Pointer to ipmi_data structure containing IPMI communication information. + * @param cmd: IPMI command byte. + * @param tx_data: Pointer to data buffer for the command payload. + * @param tx_len: Length of the command payload data. + * @param rx_data: Pointer to buffer for storing the response data. + * @param rx_len: Length of the response data buffer. + * @return 0 on success, or an error code on failure. + */ +extern int ipmi_send_message(struct ipmi_data *ipmi, unsigned char cmd, + unsigned char *tx_data, unsigned short tx_len, + unsigned char *rx_data, unsigned short rx_len); + +#endif /* ACCTON_IPMI_INTF_H */ diff --git a/packages/platforms/accton/x86-64/as7946-74xkb/modules/builds/x86-64-accton-as7946-74xkb-cpld.c b/packages/platforms/accton/x86-64/as7946-74xkb/modules/builds/src/x86-64-accton-as7946-74xkb-cpld.c similarity index 100% rename from packages/platforms/accton/x86-64/as7946-74xkb/modules/builds/x86-64-accton-as7946-74xkb-cpld.c rename to packages/platforms/accton/x86-64/as7946-74xkb/modules/builds/src/x86-64-accton-as7946-74xkb-cpld.c diff --git a/packages/platforms/accton/x86-64/as7946-74xkb/modules/builds/x86-64-accton-as7946-74xkb-fan.c b/packages/platforms/accton/x86-64/as7946-74xkb/modules/builds/src/x86-64-accton-as7946-74xkb-fan.c similarity index 74% rename from packages/platforms/accton/x86-64/as7946-74xkb/modules/builds/x86-64-accton-as7946-74xkb-fan.c rename to packages/platforms/accton/x86-64/as7946-74xkb/modules/builds/src/x86-64-accton-as7946-74xkb-fan.c index c17a1117e3..3d32e2b13b 100644 --- a/packages/platforms/accton/x86-64/as7946-74xkb/modules/builds/x86-64-accton-as7946-74xkb-fan.c +++ b/packages/platforms/accton/x86-64/as7946-74xkb/modules/builds/src/x86-64-accton-as7946-74xkb-fan.c @@ -31,17 +31,14 @@ #include #include #include +#include "accton_ipmi_intf.h" #define DRVNAME "as7946_74xkb_fan" -#define ACCTON_IPMI_NETFN 0x34 #define IPMI_FAN_READ_CMD 0x14 #define IPMI_FAN_WRITE_CMD 0x15 -#define IPMI_TIMEOUT (5 * HZ) -#define IPMI_ERR_RETRY_TIMES 1 #define IPMI_FAN_REG_READ_CMD 0x20 #define IPMI_FAN_REG_WRITE_CMD 0x21 -static void ipmi_msg_handler(struct ipmi_recv_msg *msg, void *user_msg_data); static ssize_t set_fan(struct device *dev, struct device_attribute *da, const char *buf, size_t count); static ssize_t show_fan(struct device *dev, struct device_attribute *attr, @@ -76,23 +73,6 @@ enum fan_data_index { FAN_DATA_COUNT }; -struct ipmi_data { - struct completion read_complete; - struct ipmi_addr address; - struct ipmi_user *user; - int interface; - - struct kernel_ipmi_msg tx_message; - long tx_msgid; - - void *rx_msg_data; - unsigned short rx_msg_len; - unsigned char rx_result; - int rx_recv_type; - - struct ipmi_user_hndl ipmi_hndlrs; -}; - struct as7946_74xkb_fan_data { struct platform_device *pdev; struct mutex update_lock; @@ -196,142 +176,6 @@ static const struct attribute_group as7946_74xkb_fan_group = { .attrs = as7946_74xkb_fan_attributes, }; -/* Functions to talk to the IPMI layer */ - -/* Initialize IPMI address, message buffers and user data */ -static int init_ipmi_data(struct ipmi_data *ipmi, int iface, - struct device *dev) -{ - int err; - - init_completion(&ipmi->read_complete); - - /* Initialize IPMI address */ - ipmi->address.addr_type = IPMI_SYSTEM_INTERFACE_ADDR_TYPE; - ipmi->address.channel = IPMI_BMC_CHANNEL; - ipmi->address.data[0] = 0; - ipmi->interface = iface; - - /* Initialize message buffers */ - ipmi->tx_msgid = 0; - ipmi->tx_message.netfn = ACCTON_IPMI_NETFN; - - ipmi->ipmi_hndlrs.ipmi_recv_hndl = ipmi_msg_handler; - - /* Create IPMI messaging interface user */ - err = ipmi_create_user(ipmi->interface, &ipmi->ipmi_hndlrs, - ipmi, &ipmi->user); - if (err < 0) { - dev_err(dev, "Unable to register user with IPMI " - "interface %d\n", ipmi->interface); - return -EACCES; - } - - return 0; -} - -/* Send an IPMI command */ -static int _ipmi_send_message(struct ipmi_data *ipmi, unsigned char cmd, - unsigned char *tx_data, unsigned short tx_len, - unsigned char *rx_data, unsigned short rx_len) -{ - int err; - - ipmi->tx_message.cmd = cmd; - ipmi->tx_message.data = tx_data; - ipmi->tx_message.data_len = tx_len; - ipmi->rx_msg_data = rx_data; - ipmi->rx_msg_len = rx_len; - - err = ipmi_validate_addr(&ipmi->address, sizeof(ipmi->address)); - if (err) - goto addr_err; - - ipmi->tx_msgid++; - err = ipmi_request_settime(ipmi->user, &ipmi->address, ipmi->tx_msgid, - &ipmi->tx_message, ipmi, 0, 0, 0); - if (err) - goto ipmi_req_err; - - err = wait_for_completion_timeout(&ipmi->read_complete, IPMI_TIMEOUT); - if (!err) - goto ipmi_timeout_err; - - return 0; - -ipmi_timeout_err: - err = -ETIMEDOUT; - dev_err(&data->pdev->dev, "request_timeout=%x\n", err); - return err; -ipmi_req_err: - dev_err(&data->pdev->dev, "request_settime=%x\n", err); - return err; -addr_err: - dev_err(&data->pdev->dev, "validate_addr=%x\n", err); - return err; -} - -/* Send an IPMI command with retry */ -static int ipmi_send_message(struct ipmi_data *ipmi, unsigned char cmd, - unsigned char *tx_data, unsigned short tx_len, - unsigned char *rx_data, unsigned short rx_len) -{ - int status = 0, retry = 0; - - for (retry = 0; retry <= IPMI_ERR_RETRY_TIMES; retry++) { - status = _ipmi_send_message(ipmi, cmd, tx_data, tx_len, rx_data, rx_len); - if (unlikely(status != 0)) { - dev_err(&data->pdev->dev, "ipmi_send_message_%d err status(%d)\r\n", - retry, status); - continue; - } - - if (unlikely(ipmi->rx_result != 0)) { - dev_err(&data->pdev->dev, "ipmi_send_message_%d err result(%d)\r\n", - retry, ipmi->rx_result); - continue; - } - - break; - } - - return status; -} - -/* Dispatch IPMI messages to callers */ -static void ipmi_msg_handler(struct ipmi_recv_msg *msg, void *user_msg_data) -{ - unsigned short rx_len; - struct ipmi_data *ipmi = user_msg_data; - - if (msg->msgid != ipmi->tx_msgid) { - dev_err(&data->pdev->dev, "Mismatch between received msgid " - "(%02x) and transmitted msgid (%02x)!\n", - (int)msg->msgid, - (int)ipmi->tx_msgid); - ipmi_free_recv_msg(msg); - return; - } - - ipmi->rx_recv_type = msg->recv_type; - if (msg->msg.data_len > 0) - ipmi->rx_result = msg->msg.data[0]; - else - ipmi->rx_result = IPMI_UNKNOWN_ERR_COMPLETION_CODE; - - if (msg->msg.data_len > 1) { - rx_len = msg->msg.data_len - 1; - if (ipmi->rx_msg_len < rx_len) - rx_len = ipmi->rx_msg_len; - ipmi->rx_msg_len = rx_len; - memcpy(ipmi->rx_msg_data, msg->msg.data + 1, ipmi->rx_msg_len); - } else - ipmi->rx_msg_len = 0; - - ipmi_free_recv_msg(msg); - complete(&ipmi->read_complete); -} - static struct as7946_74xkb_fan_data *as7946_74xkb_fan_update_device(void) { int status = 0; diff --git a/packages/platforms/accton/x86-64/as7946-74xkb/modules/builds/x86-64-accton-as7946-74xkb-leds.c b/packages/platforms/accton/x86-64/as7946-74xkb/modules/builds/src/x86-64-accton-as7946-74xkb-leds.c similarity index 69% rename from packages/platforms/accton/x86-64/as7946-74xkb/modules/builds/x86-64-accton-as7946-74xkb-leds.c rename to packages/platforms/accton/x86-64/as7946-74xkb/modules/builds/src/x86-64-accton-as7946-74xkb-leds.c index 18b91a4338..92c703178f 100644 --- a/packages/platforms/accton/x86-64/as7946-74xkb/modules/builds/x86-64-accton-as7946-74xkb-leds.c +++ b/packages/platforms/accton/x86-64/as7946-74xkb/modules/builds/src/x86-64-accton-as7946-74xkb-leds.c @@ -30,15 +30,12 @@ #include #include #include +#include "accton_ipmi_intf.h" #define DRVNAME "as7946_74xkb_led" -#define ACCTON_IPMI_NETFN 0x34 #define IPMI_LED_READ_CMD 0x1A #define IPMI_LED_WRITE_CMD 0x1B -#define IPMI_TIMEOUT (5 * HZ) -#define IPMI_ERR_RETRY_TIMES 1 -static void ipmi_msg_handler(struct ipmi_recv_msg *msg, void *user_msg_data); static ssize_t set_led(struct device *dev, struct device_attribute *da, const char *buf, size_t count); static ssize_t show_led(struct device *dev, struct device_attribute *attr, @@ -46,23 +43,6 @@ static ssize_t show_led(struct device *dev, struct device_attribute *attr, static int as7946_74xkb_led_probe(struct platform_device *pdev); static int as7946_74xkb_led_remove(struct platform_device *pdev); -struct ipmi_data { - struct completion read_complete; - struct ipmi_addr address; - struct ipmi_user *user; - int interface; - - struct kernel_ipmi_msg tx_message; - long tx_msgid; - - void *rx_msg_data; - unsigned short rx_msg_len; - unsigned char rx_result; - int rx_recv_type; - - struct ipmi_user_hndl ipmi_hndlrs; -}; - struct as7946_74xkb_led_data { struct platform_device *pdev; struct mutex update_lock; @@ -159,142 +139,6 @@ static const struct attribute_group as7946_74xkb_led_group = { .attrs = as7946_74xkb_led_attributes, }; -/* Functions to talk to the IPMI layer */ - -/* Initialize IPMI address, message buffers and user data */ -static int init_ipmi_data(struct ipmi_data *ipmi, int iface, - struct device *dev) -{ - int err; - - init_completion(&ipmi->read_complete); - - /* Initialize IPMI address */ - ipmi->address.addr_type = IPMI_SYSTEM_INTERFACE_ADDR_TYPE; - ipmi->address.channel = IPMI_BMC_CHANNEL; - ipmi->address.data[0] = 0; - ipmi->interface = iface; - - /* Initialize message buffers */ - ipmi->tx_msgid = 0; - ipmi->tx_message.netfn = ACCTON_IPMI_NETFN; - - ipmi->ipmi_hndlrs.ipmi_recv_hndl = ipmi_msg_handler; - - /* Create IPMI messaging interface user */ - err = ipmi_create_user(ipmi->interface, &ipmi->ipmi_hndlrs, - ipmi, &ipmi->user); - if (err < 0) { - dev_err(dev, "Unable to register user with IPMI " - "interface %d\n", ipmi->interface); - return -EACCES; - } - - return 0; -} - -/* Send an IPMI command */ -static int _ipmi_send_message(struct ipmi_data *ipmi, unsigned char cmd, - unsigned char *tx_data, unsigned short tx_len, - unsigned char *rx_data, unsigned short rx_len) -{ - int err; - - ipmi->tx_message.cmd = cmd; - ipmi->tx_message.data = tx_data; - ipmi->tx_message.data_len = tx_len; - ipmi->rx_msg_data = rx_data; - ipmi->rx_msg_len = rx_len; - - err = ipmi_validate_addr(&ipmi->address, sizeof(ipmi->address)); - if (err) - goto addr_err; - - ipmi->tx_msgid++; - err = ipmi_request_settime(ipmi->user, &ipmi->address, ipmi->tx_msgid, - &ipmi->tx_message, ipmi, 0, 0, 0); - if (err) - goto ipmi_req_err; - - err = wait_for_completion_timeout(&ipmi->read_complete, IPMI_TIMEOUT); - if (!err) - goto ipmi_timeout_err; - - return 0; - -ipmi_timeout_err: - err = -ETIMEDOUT; - dev_err(&data->pdev->dev, "request_timeout=%x\n", err); - return err; -ipmi_req_err: - dev_err(&data->pdev->dev, "request_settime=%x\n", err); - return err; -addr_err: - dev_err(&data->pdev->dev, "validate_addr=%x\n", err); - return err; -} - -/* Send an IPMI command with retry */ -static int ipmi_send_message(struct ipmi_data *ipmi, unsigned char cmd, - unsigned char *tx_data, unsigned short tx_len, - unsigned char *rx_data, unsigned short rx_len) -{ - int status = 0, retry = 0; - - for (retry = 0; retry <= IPMI_ERR_RETRY_TIMES; retry++) { - status = _ipmi_send_message(ipmi, cmd, tx_data, tx_len, rx_data, rx_len); - if (unlikely(status != 0)) { - dev_err(&data->pdev->dev, "ipmi_send_message_%d err status(%d)\r\n", - retry, status); - continue; - } - - if (unlikely(ipmi->rx_result != 0)) { - dev_err(&data->pdev->dev, "ipmi_send_message_%d err result(%d)\r\n", - retry, ipmi->rx_result); - continue; - } - - break; - } - - return status; -} - -/* Dispatch IPMI messages to callers */ -static void ipmi_msg_handler(struct ipmi_recv_msg *msg, void *user_msg_data) -{ - unsigned short rx_len; - struct ipmi_data *ipmi = user_msg_data; - - if (msg->msgid != ipmi->tx_msgid) { - dev_err(&data->pdev->dev, "Mismatch between received msgid " - "(%02x) and transmitted msgid (%02x)!\n", - (int)msg->msgid, - (int)ipmi->tx_msgid); - ipmi_free_recv_msg(msg); - return; - } - - ipmi->rx_recv_type = msg->recv_type; - if (msg->msg.data_len > 0) - ipmi->rx_result = msg->msg.data[0]; - else - ipmi->rx_result = IPMI_UNKNOWN_ERR_COMPLETION_CODE; - - if (msg->msg.data_len > 1) { - rx_len = msg->msg.data_len - 1; - if (ipmi->rx_msg_len < rx_len) - rx_len = ipmi->rx_msg_len; - ipmi->rx_msg_len = rx_len; - memcpy(ipmi->rx_msg_data, msg->msg.data + 1, ipmi->rx_msg_len); - } else - ipmi->rx_msg_len = 0; - - ipmi_free_recv_msg(msg); - complete(&ipmi->read_complete); -} - static struct as7946_74xkb_led_data *as7946_74xkb_led_update_device(void) { int status = 0; diff --git a/packages/platforms/accton/x86-64/as7946-74xkb/modules/builds/x86-64-accton-as7946-74xkb-psu.c b/packages/platforms/accton/x86-64/as7946-74xkb/modules/builds/src/x86-64-accton-as7946-74xkb-psu.c similarity index 79% rename from packages/platforms/accton/x86-64/as7946-74xkb/modules/builds/x86-64-accton-as7946-74xkb-psu.c rename to packages/platforms/accton/x86-64/as7946-74xkb/modules/builds/src/x86-64-accton-as7946-74xkb-psu.c index ce6202566e..b923ebc5fb 100644 --- a/packages/platforms/accton/x86-64/as7946-74xkb/modules/builds/x86-64-accton-as7946-74xkb-psu.c +++ b/packages/platforms/accton/x86-64/as7946-74xkb/modules/builds/src/x86-64-accton-as7946-74xkb-psu.c @@ -29,19 +29,16 @@ #include #include #include +#include "accton_ipmi_intf.h" #define DRVNAME "as7946_74xkb_psu" -#define ACCTON_IPMI_NETFN 0x34 #define IPMI_PSU_READ_CMD 0x16 #define IPMI_PSU_MODEL_NAME_CMD 0x10 #define IPMI_PSU_SERIAL_NUM_CMD 0x11 #define IPMI_PSU_FAN_DIR_CMD 0x13 -#define IPMI_TIMEOUT (5 * HZ) -#define IPMI_ERR_RETRY_TIMES 1 #define IPMI_MODEL_SERIAL_LEN 32 #define IPMI_FAN_DIR_LEN 3 -static void ipmi_msg_handler(struct ipmi_recv_msg *msg, void *user_msg_data); static ssize_t show_psu(struct device *dev, struct device_attribute *attr, char *buf); static ssize_t show_string(struct device *dev, struct device_attribute *attr, @@ -97,23 +94,6 @@ enum psu_data_index { PSU_SERIAL = 0 }; -struct ipmi_data { - struct completion read_complete; - struct ipmi_addr address; - struct ipmi_user *user; - int interface; - - struct kernel_ipmi_msg tx_message; - long tx_msgid; - - void *rx_msg_data; - unsigned short rx_msg_len; - unsigned char rx_result; - int rx_recv_type; - - struct ipmi_user_hndl ipmi_hndlrs; -}; - struct ipmi_psu_resp_data { unsigned char status[36]; char serial[IPMI_MODEL_SERIAL_LEN+1]; @@ -247,142 +227,6 @@ static const struct attribute_group as7946_74xkb_psu_group = { .attrs = as7946_74xkb_psu_attributes, }; -/* Functions to talk to the IPMI layer */ - -/* Initialize IPMI address, message buffers and user data */ -static int init_ipmi_data(struct ipmi_data *ipmi, int iface, - struct device *dev) -{ - int err; - - init_completion(&ipmi->read_complete); - - /* Initialize IPMI address */ - ipmi->address.addr_type = IPMI_SYSTEM_INTERFACE_ADDR_TYPE; - ipmi->address.channel = IPMI_BMC_CHANNEL; - ipmi->address.data[0] = 0; - ipmi->interface = iface; - - /* Initialize message buffers */ - ipmi->tx_msgid = 0; - ipmi->tx_message.netfn = ACCTON_IPMI_NETFN; - - ipmi->ipmi_hndlrs.ipmi_recv_hndl = ipmi_msg_handler; - - /* Create IPMI messaging interface user */ - err = ipmi_create_user(ipmi->interface, &ipmi->ipmi_hndlrs, - ipmi, &ipmi->user); - if (err < 0) { - dev_err(dev, "Unable to register user with IPMI " - "interface %d\n", ipmi->interface); - return -EACCES; - } - - return 0; -} - -/* Send an IPMI command */ -static int _ipmi_send_message(struct ipmi_data *ipmi, unsigned char cmd, - unsigned char *tx_data, unsigned short tx_len, - unsigned char *rx_data, unsigned short rx_len) -{ - int err; - - ipmi->tx_message.cmd = cmd; - ipmi->tx_message.data = tx_data; - ipmi->tx_message.data_len = tx_len; - ipmi->rx_msg_data = rx_data; - ipmi->rx_msg_len = rx_len; - - err = ipmi_validate_addr(&ipmi->address, sizeof(ipmi->address)); - if (err) - goto addr_err; - - ipmi->tx_msgid++; - err = ipmi_request_settime(ipmi->user, &ipmi->address, ipmi->tx_msgid, - &ipmi->tx_message, ipmi, 0, 0, 0); - if (err) - goto ipmi_req_err; - - err = wait_for_completion_timeout(&ipmi->read_complete, IPMI_TIMEOUT); - if (!err) - goto ipmi_timeout_err; - - return 0; - -ipmi_timeout_err: - err = -ETIMEDOUT; - dev_err(&data->pdev->dev, "request_timeout=%x\n", err); - return err; -ipmi_req_err: - dev_err(&data->pdev->dev, "request_settime=%x\n", err); - return err; -addr_err: - dev_err(&data->pdev->dev, "validate_addr=%x\n", err); - return err; -} - -/* Send an IPMI command with retry */ -static int ipmi_send_message(struct ipmi_data *ipmi, unsigned char cmd, - unsigned char *tx_data, unsigned short tx_len, - unsigned char *rx_data, unsigned short rx_len) -{ - int status = 0, retry = 0; - - for (retry = 0; retry <= IPMI_ERR_RETRY_TIMES; retry++) { - status = _ipmi_send_message(ipmi, cmd, tx_data, tx_len, rx_data, rx_len); - if (unlikely(status != 0)) { - dev_err(&data->pdev->dev, "ipmi_send_message_%d err status(%d)\r\n", - retry, status); - continue; - } - - if (unlikely(ipmi->rx_result != 0)) { - dev_err(&data->pdev->dev, "ipmi_send_message_%d err result(%d)\r\n", - retry, ipmi->rx_result); - continue; - } - - break; - } - - return status; -} - -/* Dispatch IPMI messages to callers */ -static void ipmi_msg_handler(struct ipmi_recv_msg *msg, void *user_msg_data) -{ - unsigned short rx_len; - struct ipmi_data *ipmi = user_msg_data; - - if (msg->msgid != ipmi->tx_msgid) { - dev_err(&data->pdev->dev, "Mismatch between received msgid " - "(%02x) and transmitted msgid (%02x)!\n", - (int)msg->msgid, - (int)ipmi->tx_msgid); - ipmi_free_recv_msg(msg); - return; - } - - ipmi->rx_recv_type = msg->recv_type; - if (msg->msg.data_len > 0) - ipmi->rx_result = msg->msg.data[0]; - else - ipmi->rx_result = IPMI_UNKNOWN_ERR_COMPLETION_CODE; - - if (msg->msg.data_len > 1) { - rx_len = msg->msg.data_len - 1; - if (ipmi->rx_msg_len < rx_len) - rx_len = ipmi->rx_msg_len; - ipmi->rx_msg_len = rx_len; - memcpy(ipmi->rx_msg_data, msg->msg.data + 1, ipmi->rx_msg_len); - } else - ipmi->rx_msg_len = 0; - - ipmi_free_recv_msg(msg); - complete(&ipmi->read_complete); -} - static struct as7946_74xkb_psu_data *as7946_74xkb_psu_update_device(struct device_attribute *da) { struct sensor_device_attribute *attr = to_sensor_dev_attr(da); diff --git a/packages/platforms/accton/x86-64/as7946-74xkb/modules/builds/x86-64-accton-as7946-74xkb-sys.c b/packages/platforms/accton/x86-64/as7946-74xkb/modules/builds/src/x86-64-accton-as7946-74xkb-sys.c similarity index 70% rename from packages/platforms/accton/x86-64/as7946-74xkb/modules/builds/x86-64-accton-as7946-74xkb-sys.c rename to packages/platforms/accton/x86-64/as7946-74xkb/modules/builds/src/x86-64-accton-as7946-74xkb-sys.c index 40794af7f6..4dd504aac2 100644 --- a/packages/platforms/accton/x86-64/as7946-74xkb/modules/builds/x86-64-accton-as7946-74xkb-sys.c +++ b/packages/platforms/accton/x86-64/as7946-74xkb/modules/builds/src/x86-64-accton-as7946-74xkb-sys.c @@ -29,12 +29,11 @@ #include #include #include +#include "accton_ipmi_intf.h" #define DRVNAME "as7946_74xkb_sys" -#define ACCTON_IPMI_NETFN 0x34 #define IPMI_SYSEEPROM_READ_CMD 0x18 -#define IPMI_TIMEOUT (20 * HZ) #define IPMI_READ_MAX_LEN 128 #define EEPROM_NAME "eeprom" @@ -46,29 +45,11 @@ #define SYSTEM_CPLD1_ADDR 0x60 #define FAN_CPLD_ADDR 0x68 -static void ipmi_msg_handler(struct ipmi_recv_msg *msg, void *user_msg_data); static int as7946_74xkb_sys_probe(struct platform_device *pdev); static int as7946_74xkb_sys_remove(struct platform_device *pdev); static ssize_t show_cpld_version(struct device *dev, struct device_attribute *da, char *buf); -struct ipmi_data { - struct completion read_complete; - struct ipmi_addr address; - struct ipmi_user *user; - int interface; - - struct kernel_ipmi_msg tx_message; - long tx_msgid; - - void *rx_msg_data; - unsigned short rx_msg_len; - unsigned char rx_result; - int rx_recv_type; - - struct ipmi_user_hndl ipmi_hndlrs; -}; - struct as7946_74xkb_sys_data { struct platform_device *pdev; struct mutex update_lock; @@ -116,115 +97,6 @@ static const struct attribute_group as7946_74xkb_sys_group = { .attrs = as7946_74xkb_sys_attributes, }; -/* Functions to talk to the IPMI layer */ - -/* Initialize IPMI address, message buffers and user data */ -static int init_ipmi_data(struct ipmi_data *ipmi, int iface, - struct device *dev) -{ - int err; - - init_completion(&ipmi->read_complete); - - /* Initialize IPMI address */ - ipmi->address.addr_type = IPMI_SYSTEM_INTERFACE_ADDR_TYPE; - ipmi->address.channel = IPMI_BMC_CHANNEL; - ipmi->address.data[0] = 0; - ipmi->interface = iface; - - /* Initialize message buffers */ - ipmi->tx_msgid = 0; - ipmi->tx_message.netfn = ACCTON_IPMI_NETFN; - - ipmi->ipmi_hndlrs.ipmi_recv_hndl = ipmi_msg_handler; - - /* Create IPMI messaging interface user */ - err = ipmi_create_user(ipmi->interface, &ipmi->ipmi_hndlrs, - ipmi, &ipmi->user); - if (err < 0) { - dev_err(dev, "Unable to register user with IPMI " - "interface %d\n", ipmi->interface); - return -EACCES; - } - - return 0; -} - -/* Send an IPMI command */ -static int ipmi_send_message(struct ipmi_data *ipmi, unsigned char cmd, - unsigned char *tx_data, unsigned short tx_len, - unsigned char *rx_data, unsigned short rx_len) -{ - int err; - - ipmi->tx_message.cmd = cmd; - ipmi->tx_message.data = tx_data; - ipmi->tx_message.data_len = tx_len; - ipmi->rx_msg_data = rx_data; - ipmi->rx_msg_len = rx_len; - - err = ipmi_validate_addr(&ipmi->address, sizeof(ipmi->address)); - if (err) - goto addr_err; - - ipmi->tx_msgid++; - err = ipmi_request_settime(ipmi->user, &ipmi->address, ipmi->tx_msgid, - &ipmi->tx_message, ipmi, 0, 0, 0); - if (err) - goto ipmi_req_err; - - err = wait_for_completion_timeout(&ipmi->read_complete, IPMI_TIMEOUT); - if (!err) - goto ipmi_timeout_err; - - return 0; - -ipmi_timeout_err: - err = -ETIMEDOUT; - dev_err(&data->pdev->dev, "request_timeout=%x\n", err); - return err; -ipmi_req_err: - dev_err(&data->pdev->dev, "request_settime=%x\n", err); - return err; -addr_err: - dev_err(&data->pdev->dev, "validate_addr=%x\n", err); - return err; -} - -/* Dispatch IPMI messages to callers */ -static void ipmi_msg_handler(struct ipmi_recv_msg *msg, void *user_msg_data) -{ - unsigned short rx_len; - struct ipmi_data *ipmi = user_msg_data; - - if (msg->msgid != ipmi->tx_msgid) { - dev_err(&data->pdev->dev, "Mismatch between received msgid " - "(%02x) and transmitted msgid (%02x)!\n", - (int)msg->msgid, - (int)ipmi->tx_msgid); - ipmi_free_recv_msg(msg); - return; - } - - ipmi->rx_recv_type = msg->recv_type; - if (msg->msg.data_len > 0) - ipmi->rx_result = msg->msg.data[0]; - else - ipmi->rx_result = IPMI_UNKNOWN_ERR_COMPLETION_CODE; - - if (msg->msg.data_len > 1) { - rx_len = msg->msg.data_len - 1; - if (ipmi->rx_msg_len < rx_len) - rx_len = ipmi->rx_msg_len; - ipmi->rx_msg_len = rx_len; - memcpy(ipmi->rx_msg_data, msg->msg.data + 1, ipmi->rx_msg_len); - } else - ipmi->rx_msg_len = 0; - - ipmi_free_recv_msg(msg); - complete(&ipmi->read_complete); -} - static ssize_t sys_eeprom_read(loff_t off, char *buf, size_t count) { int status = 0; diff --git a/packages/platforms/accton/x86-64/as7946-74xkb/modules/builds/x86-64-accton-as7946-74xkb-thermal.c b/packages/platforms/accton/x86-64/as7946-74xkb/modules/builds/src/x86-64-accton-as7946-74xkb-thermal.c similarity index 60% rename from packages/platforms/accton/x86-64/as7946-74xkb/modules/builds/x86-64-accton-as7946-74xkb-thermal.c rename to packages/platforms/accton/x86-64/as7946-74xkb/modules/builds/src/x86-64-accton-as7946-74xkb-thermal.c index be73da0ad1..0c599415f2 100644 --- a/packages/platforms/accton/x86-64/as7946-74xkb/modules/builds/x86-64-accton-as7946-74xkb-thermal.c +++ b/packages/platforms/accton/x86-64/as7946-74xkb/modules/builds/src/x86-64-accton-as7946-74xkb-thermal.c @@ -30,16 +30,12 @@ #include #include #include +#include "accton_ipmi_intf.h" #define DRVNAME "as7946_74xkb_thermal" -#define ACCTON_IPMI_NETFN 0x34 #define IPMI_THERMAL_READ_CMD 0x12 #define IPMI_THERMAL_WRITE_CMD 0x13 -#define IPMI_TIMEOUT (5 * HZ) -#define IPMI_ERR_RETRY_TIMES 1 - -static void ipmi_msg_handler(struct ipmi_recv_msg *msg, void *user_msg_data); static ssize_t show_temp(struct device *dev, struct device_attribute *attr, char *buf); static int as7946_74xkb_thermal_probe(struct platform_device *pdev); @@ -52,23 +48,6 @@ enum temp_data_index { TEMP_DATA_COUNT }; -struct ipmi_data { - struct completion read_complete; - struct ipmi_addr address; - struct ipmi_user *user; - int interface; - - struct kernel_ipmi_msg tx_message; - long tx_msgid; - - void *rx_msg_data; - unsigned short rx_msg_len; - unsigned char rx_result; - int rx_recv_type; - - struct ipmi_user_hndl ipmi_hndlrs; -}; - struct as7946_74xkb_thermal_data { struct platform_device *pdev; struct mutex update_lock; @@ -129,142 +108,6 @@ static const struct attribute_group as7946_74xkb_thermal_group = { .attrs = as7946_74xkb_thermal_attributes, }; -/* Functions to talk to the IPMI layer */ - -/* Initialize IPMI address, message buffers and user data */ -static int init_ipmi_data(struct ipmi_data *ipmi, int iface, - struct device *dev) -{ - int err; - - init_completion(&ipmi->read_complete); - - /* Initialize IPMI address */ - ipmi->address.addr_type = IPMI_SYSTEM_INTERFACE_ADDR_TYPE; - ipmi->address.channel = IPMI_BMC_CHANNEL; - ipmi->address.data[0] = 0; - ipmi->interface = iface; - - /* Initialize message buffers */ - ipmi->tx_msgid = 0; - ipmi->tx_message.netfn = ACCTON_IPMI_NETFN; - - ipmi->ipmi_hndlrs.ipmi_recv_hndl = ipmi_msg_handler; - - /* Create IPMI messaging interface user */ - err = ipmi_create_user(ipmi->interface, &ipmi->ipmi_hndlrs, - ipmi, &ipmi->user); - if (err < 0) { - dev_err(dev, "Unable to register user with IPMI " - "interface %d\n", ipmi->interface); - return -EACCES; - } - - return 0; -} - -/* Send an IPMI command */ -static int _ipmi_send_message(struct ipmi_data *ipmi, unsigned char cmd, - unsigned char *tx_data, unsigned short tx_len, - unsigned char *rx_data, unsigned short rx_len) -{ - int err; - - ipmi->tx_message.cmd = cmd; - ipmi->tx_message.data = tx_data; - ipmi->tx_message.data_len = tx_len; - ipmi->rx_msg_data = rx_data; - ipmi->rx_msg_len = rx_len; - - err = ipmi_validate_addr(&ipmi->address, sizeof(ipmi->address)); - if (err) - goto addr_err; - - ipmi->tx_msgid++; - err = ipmi_request_settime(ipmi->user, &ipmi->address, ipmi->tx_msgid, - &ipmi->tx_message, ipmi, 0, 0, 0); - if (err) - goto ipmi_req_err; - - err = wait_for_completion_timeout(&ipmi->read_complete, IPMI_TIMEOUT); - if (!err) - goto ipmi_timeout_err; - - return 0; - -ipmi_timeout_err: - err = -ETIMEDOUT; - dev_err(&data->pdev->dev, "request_timeout=%x\n", err); - return err; -ipmi_req_err: - dev_err(&data->pdev->dev, "request_settime=%x\n", err); - return err; -addr_err: - dev_err(&data->pdev->dev, "validate_addr=%x\n", err); - return err; -} - -/* Send an IPMI command with retry */ -static int ipmi_send_message(struct ipmi_data *ipmi, unsigned char cmd, - unsigned char *tx_data, unsigned short tx_len, - unsigned char *rx_data, unsigned short rx_len) -{ - int status = 0, retry = 0; - - for (retry = 0; retry <= IPMI_ERR_RETRY_TIMES; retry++) { - status = _ipmi_send_message(ipmi, cmd, tx_data, tx_len, rx_data, rx_len); - if (unlikely(status != 0)) { - dev_err(&data->pdev->dev, "ipmi_send_message_%d err status(%d)\r\n", - retry, status); - continue; - } - - if (unlikely(ipmi->rx_result != 0)) { - dev_err(&data->pdev->dev, "ipmi_send_message_%d err result(%d)\r\n", - retry, ipmi->rx_result); - continue; - } - - break; - } - - return status; -} - -/* Dispatch IPMI messages to callers */ -static void ipmi_msg_handler(struct ipmi_recv_msg *msg, void *user_msg_data) -{ - unsigned short rx_len; - struct ipmi_data *ipmi = user_msg_data; - - if (msg->msgid != ipmi->tx_msgid) { - dev_err(&data->pdev->dev, "Mismatch between received msgid " - "(%02x) and transmitted msgid (%02x)!\n", - (int)msg->msgid, - (int)ipmi->tx_msgid); - ipmi_free_recv_msg(msg); - return; - } - - ipmi->rx_recv_type = msg->recv_type; - if (msg->msg.data_len > 0) - ipmi->rx_result = msg->msg.data[0]; - else - ipmi->rx_result = IPMI_UNKNOWN_ERR_COMPLETION_CODE; - - if (msg->msg.data_len > 1) { - rx_len = msg->msg.data_len - 1; - if (ipmi->rx_msg_len < rx_len) - rx_len = ipmi->rx_msg_len; - ipmi->rx_msg_len = rx_len; - memcpy(ipmi->rx_msg_data, msg->msg.data + 1, ipmi->rx_msg_len); - } else - ipmi->rx_msg_len = 0; - - ipmi_free_recv_msg(msg); - complete(&ipmi->read_complete); -} - static ssize_t show_temp(struct device *dev, struct device_attribute *da, char *buf) { diff --git a/packages/platforms/accton/x86-64/as7946-74xkb/platform-config/r0/src/python/x86_64_accton_as7946_74xkb_r0/__init__.py b/packages/platforms/accton/x86-64/as7946-74xkb/platform-config/r0/src/python/x86_64_accton_as7946_74xkb_r0/__init__.py index bb85cea5ff..5a73b8a7b5 100644 --- a/packages/platforms/accton/x86-64/as7946-74xkb/platform-config/r0/src/python/x86_64_accton_as7946_74xkb_r0/__init__.py +++ b/packages/platforms/accton/x86-64/as7946-74xkb/platform-config/r0/src/python/x86_64_accton_as7946_74xkb_r0/__init__.py @@ -76,6 +76,7 @@ def baseconfig(self): return False self.insmod('optoe') + self.insmod('accton_ipmi_intf') for m in [ 'sys' , 'cpld', 'fan', 'psu', 'leds', 'thermal' ]: self.insmod("x86-64-accton-as7946-74xkb-%s.ko" % m)