⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ipmi.h

📁 此工具是arm-linux-GCC交叉编译工具(cross-3.4.4)
💻 H
📖 第 1 页 / 共 2 页
字号:
/* * ipmi.h * * MontaVista IPMI interface * * Author: MontaVista Software, Inc. *         Corey Minyard <minyard@mvista.com> *         source@mvista.com * * Copyright 2002 MontaVista Software Inc. * *  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 SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED *  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. *  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, *  BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS *  OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND *  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR *  TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE *  USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * *  You should have received a copy of the GNU General Public License along *  with this program; if not, write to the Free Software Foundation, Inc., *  675 Mass Ave, Cambridge, MA 02139, USA. */#ifndef __LINUX_IPMI_H#define __LINUX_IPMI_H#include <linux/ipmi_msgdefs.h>#include <linux/compiler.h>/* * This file describes an interface to an IPMI driver.  You have to * have a fairly good understanding of IPMI to use this, so go read * the specs first before actually trying to do anything. * * With that said, this driver provides a multi-user interface to the * IPMI driver, and it allows multiple IPMI physical interfaces below * the driver.  The physical interfaces bind as a lower layer on the * driver.  They appear as interfaces to the application using this * interface. * * Multi-user means that multiple applications may use the driver, * send commands, receive responses, etc.  The driver keeps track of * commands the user sends and tracks the responses.  The responses * will go back to the application that send the command.  If the * response doesn't come back in time, the driver will return a * timeout error response to the application.  Asynchronous events * from the BMC event queue will go to all users bound to the driver. * The incoming event queue in the BMC will automatically be flushed * if it becomes full and it is queried once a second to see if * anything is in it.  Incoming commands to the driver will get * delivered as commands. * * This driver provides two main interfaces: one for in-kernel * applications and another for userland applications.  The * capabilities are basically the same for both interface, although * the interfaces are somewhat different.  The stuff in the * #ifdef KERNEL below is the in-kernel interface.  The userland * interface is defined later in the file.  *//* * This is an overlay for all the address types, so it's easy to * determine the actual address type.  This is kind of like addresses * work for sockets. */#define IPMI_MAX_ADDR_SIZE 32struct ipmi_addr{	 /* Try to take these from the "Channel Medium Type" table	    in section 6.5 of the IPMI 1.5 manual. */	int   addr_type;	short channel;	char  data[IPMI_MAX_ADDR_SIZE];};/* * When the address is not used, the type will be set to this value. * The channel is the BMC's channel number for the channel (usually * 0), or IPMC_BMC_CHANNEL if communicating directly with the BMC. */#define IPMI_SYSTEM_INTERFACE_ADDR_TYPE	0x0cstruct ipmi_system_interface_addr{	int           addr_type;	short         channel;	unsigned char lun;};/* An IPMB Address. */#define IPMI_IPMB_ADDR_TYPE		0x01/* Used for broadcast get device id as described in section 17.9 of the   IPMI 1.5 manual. */ #define IPMI_IPMB_BROADCAST_ADDR_TYPE	0x41struct ipmi_ipmb_addr{	int           addr_type;	short         channel;	unsigned char slave_addr;	unsigned char lun;};/* * A LAN Address.  This is an address to/from a LAN interface bridged * by the BMC, not an address actually out on the LAN. * * A concious decision was made here to deviate slightly from the IPMI * spec.  We do not use rqSWID and rsSWID like it shows in the * message.  Instead, we use remote_SWID and local_SWID.  This means * that any message (a request or response) from another device will * always have exactly the same address.  If you didn't do this, * requests and responses from the same device would have different * addresses, and that's not too cool. * * In this address, the remote_SWID is always the SWID the remote * message came from, or the SWID we are sending the message to. * local_SWID is always our SWID.  Note that having our SWID in the * message is a little weird, but this is required. */#define IPMI_LAN_ADDR_TYPE		0x04struct ipmi_lan_addr{	int           addr_type;	short         channel;	unsigned char privilege;	unsigned char session_handle;	unsigned char remote_SWID;	unsigned char local_SWID;	unsigned char lun;};/* * Channel for talking directly with the BMC.  When using this * channel, This is for the system interface address type only.  FIXME * - is this right, or should we use -1? */#define IPMI_BMC_CHANNEL  0xf#define IPMI_NUM_CHANNELS 0x10/* * A raw IPMI message without any addressing.  This covers both * commands and responses.  The completion code is always the first * byte of data in the response (as the spec shows the messages laid * out). */struct ipmi_msg{	unsigned char  netfn;	unsigned char  cmd;	unsigned short data_len;	unsigned char  __user *data;};struct kernel_ipmi_msg{	unsigned char  netfn;	unsigned char  cmd;	unsigned short data_len;	unsigned char  *data;};/* * Various defines that are useful for IPMI applications. */#define IPMI_INVALID_CMD_COMPLETION_CODE	0xC1#define IPMI_TIMEOUT_COMPLETION_CODE		0xC3#define IPMI_UNKNOWN_ERR_COMPLETION_CODE	0xff/* * Receive types for messages coming from the receive interface.  This * is used for the receive in-kernel interface and in the receive * IOCTL. * * The "IPMI_RESPONSE_RESPNOSE_TYPE" is a little strange sounding, but * it allows you to get the message results when you send a response * message. */#define IPMI_RESPONSE_RECV_TYPE		1 /* A response to a command */#define IPMI_ASYNC_EVENT_RECV_TYPE	2 /* Something from the event queue */#define IPMI_CMD_RECV_TYPE		3 /* A command from somewhere else */#define IPMI_RESPONSE_RESPONSE_TYPE	4 /* The response for					      a sent response, giving any					      error status for sending the					      response.  When you send a					      response message, this will					      be returned. *//* Note that async events and received commands do not have a completion   code as the first byte of the incoming data, unlike a response. */#ifdef __KERNEL__/* * The in-kernel interface. */#include <linux/list.h>#include <linux/module.h>#ifdef CONFIG_PROC_FS#include <linux/proc_fs.h>extern struct proc_dir_entry *proc_ipmi_root;#endif /* CONFIG_PROC_FS *//* Opaque type for a IPMI message user.  One of these is needed to   send and receive messages. */typedef struct ipmi_user *ipmi_user_t;/* * Stuff coming from the receive interface comes as one of these. * They are allocated, the receiver must free them with * ipmi_free_recv_msg() when done with the message.  The link is not * used after the message is delivered, so the upper layer may use the * link to build a linked list, if it likes. */struct ipmi_recv_msg{	struct list_head link;	/* The type of message as defined in the "Receive Types"           defines above. */	int              recv_type;	ipmi_user_t      user;	struct ipmi_addr addr;	long             msgid;	struct kernel_ipmi_msg  msg;	/* The user_msg_data is the data supplied when a message was	   sent, if this is a response to a sent message.  If this is	   not a response to a sent message, then user_msg_data will	   be NULL.  If the user above is NULL, then this will be the	   intf. */	void             *user_msg_data;	/* Call this when done with the message.  It will presumably free	   the message and do any other necessary cleanup. */	void (*done)(struct ipmi_recv_msg *msg);	/* Place-holder for the data, don't make any assumptions about	   the size or existance of this, since it may change. */	unsigned char   msg_data[IPMI_MAX_MSG_LENGTH];};/* Allocate and free the receive message. */static inline void ipmi_free_recv_msg(struct ipmi_recv_msg *msg){	msg->done(msg);}struct ipmi_user_hndl{        /* Routine type to call when a message needs to be routed to	   the upper layer.  This will be called with some locks held,	   the only IPMI routines that can be called are ipmi_request	   and the alloc/free operations.  The handler_data is the	   variable supplied when the receive handler was registered. */	void (*ipmi_recv_hndl)(struct ipmi_recv_msg *msg,			       void                 *user_msg_data);	/* Called when the interface detects a watchdog pre-timeout.  If	   this is NULL, it will be ignored for the user. */	void (*ipmi_watchdog_pretimeout)(void *handler_data);};/* Create a new user of the IPMI layer on the given interface number. */int ipmi_create_user(unsigned int          if_num,		     struct ipmi_user_hndl *handler,		     void                  *handler_data,		     ipmi_user_t           *user);/* Destroy the given user of the IPMI layer.  Note that after this   function returns, the system is guaranteed to not call any   callbacks for the user.  Thus as long as you destroy all the users   before you unload a module, you will be safe.  And if you destroy   the users before you destroy the callback structures, it should be   safe, too. */int ipmi_destroy_user(ipmi_user_t user);/* Get the IPMI version of the BMC we are talking to. */void ipmi_get_version(ipmi_user_t   user,		      unsigned char *major,		      unsigned char *minor);/* Set and get the slave address and LUN that we will use for our   source messages.  Note that this affects the interface, not just   this user, so it will affect all users of this interface.  This is   so some initialization code can come in and do the OEM-specific   things it takes to determine your address (if not the BMC) and set   it for everyone else.  Note that each channel can have its own address. */int ipmi_set_my_address(ipmi_user_t   user,			unsigned int  channel,			unsigned char address);int ipmi_get_my_address(ipmi_user_t   user,			unsigned int  channel,			unsigned char *address);int ipmi_set_my_LUN(ipmi_user_t   user,		    unsigned int  channel,		    unsigned char LUN);int ipmi_get_my_LUN(ipmi_user_t   user,

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -