34 #include <linux/module.h>
36 #include <linux/errno.h>
37 #include <linux/poll.h>
38 #include <linux/sched.h>
40 #include <linux/slab.h>
41 #include <linux/ipmi.h>
44 #include <linux/device.h>
70 was_empty = list_empty(&(priv->
recv_msgs));
84 unsigned int mask = 0;
87 poll_wait(file, &priv->
wait, wait);
99 static int ipmi_fasync(
int fd,
struct file *file,
int on)
113 .ipmi_recv_hndl = file_receive_handler,
116 static int ipmi_open(
struct inode *
inode,
struct file *file)
118 int if_num = iminor(inode);
156 static int ipmi_release(
struct inode *inode,
struct file *file)
174 unsigned int retry_time_ms)
186 msg.netfn = req->
msg.netfn;
187 msg.cmd = req->
msg.cmd;
188 msg.data_len = req->
msg.data_len;
230 static int ipmi_ioctl(
struct file *file,
249 rv = handle_send_req(priv->
user,
265 rv = handle_send_req(priv->
user,
311 if (
rsp.addr_len < addr_len)
314 goto recv_putback_on_err;
319 goto recv_putback_on_err;
321 rsp.addr_len = addr_len;
325 rsp.msg.netfn = msg->
msg.netfn;
326 rsp.msg.cmd = msg->
msg.cmd;
328 if (msg->
msg.data_len > 0) {
329 if (
rsp.msg.data_len < msg->
msg.data_len) {
332 msg->
msg.data_len =
rsp.msg.data_len;
334 goto recv_putback_on_err;
343 goto recv_putback_on_err;
345 rsp.msg.data_len = msg->
msg.data_len;
347 rsp.msg.data_len = 0;
352 goto recv_putback_on_err;
635 static long ipmi_unlocked_ioctl(
struct file *file,
642 ret = ipmi_ioctl(file, cmd, data);
655 #define COMPAT_IPMICTL_SEND_COMMAND \
656 _IOR(IPMI_IOC_MAGIC, 13, struct compat_ipmi_req)
657 #define COMPAT_IPMICTL_SEND_COMMAND_SETTIME \
658 _IOR(IPMI_IOC_MAGIC, 21, struct compat_ipmi_req_settime)
659 #define COMPAT_IPMICTL_RECEIVE_MSG \
660 _IOWR(IPMI_IOC_MAGIC, 12, struct compat_ipmi_recv)
661 #define COMPAT_IPMICTL_RECEIVE_MSG_TRUNC \
662 _IOWR(IPMI_IOC_MAGIC, 11, struct compat_ipmi_recv)
664 struct compat_ipmi_msg {
671 struct compat_ipmi_req {
675 struct compat_ipmi_msg msg;
678 struct compat_ipmi_recv {
683 struct compat_ipmi_msg msg;
686 struct compat_ipmi_req_settime {
687 struct compat_ipmi_req req;
695 static long get_compat_ipmi_msg(
struct ipmi_msg *p64,
696 struct compat_ipmi_msg __user *p32)
706 p64->
data = compat_ptr(tmp);
710 static long put_compat_ipmi_msg(
struct ipmi_msg *p64,
711 struct compat_ipmi_msg __user *p32)
721 static long get_compat_ipmi_req(
struct ipmi_req *p64,
722 struct compat_ipmi_req __user *p32)
731 get_compat_ipmi_msg(&p64->
msg, &p32->msg))
733 p64->
addr = compat_ptr(tmp);
738 struct compat_ipmi_req_settime __user *p32)
741 get_compat_ipmi_req(&p64->
req, &p32->req) ||
748 static long get_compat_ipmi_recv(
struct ipmi_recv *p64,
749 struct compat_ipmi_recv __user *p32)
758 get_compat_ipmi_msg(&p64->
msg, &p32->msg))
760 p64->
addr = compat_ptr(tmp);
764 static long put_compat_ipmi_recv(
struct ipmi_recv *p64,
765 struct compat_ipmi_recv __user *p32)
771 put_compat_ipmi_msg(&p64->
msg, &p32->msg))
779 static long compat_ipmi_ioctl(
struct file *filep,
unsigned int cmd,
786 case COMPAT_IPMICTL_SEND_COMMAND:
790 if (get_compat_ipmi_req(&
rp, compat_ptr(arg)))
793 return handle_send_req(priv->
user, &
rp,
797 case COMPAT_IPMICTL_SEND_COMMAND_SETTIME:
801 if (get_compat_ipmi_req_settime(&
sp, compat_ptr(arg)))
804 return handle_send_req(priv->
user, &
sp.req,
805 sp.retries,
sp.retry_time_ms);
807 case COMPAT_IPMICTL_RECEIVE_MSG:
808 case COMPAT_IPMICTL_RECEIVE_MSG_TRUNC:
813 if (get_compat_ipmi_recv(&recv64, compat_ptr(arg)))
820 rc = ipmi_ioctl(filep,
821 ((cmd == COMPAT_IPMICTL_RECEIVE_MSG)
824 (
unsigned long) precv64);
831 if (put_compat_ipmi_recv(&recv64, compat_ptr(arg)))
837 return ipmi_ioctl(filep, cmd, arg);
844 .unlocked_ioctl = ipmi_unlocked_ioctl,
846 .compat_ioctl = compat_ipmi_ioctl,
849 .release = ipmi_release,
850 .fasync = ipmi_fasync,
855 #define DEVICE_NAME "ipmidev"
857 static int ipmi_major;
860 " default, or if you set it to zero, it will choose the next"
861 " available device. Setting it to -1 will disable the"
862 " interface. Other values will set the major device number"
873 static struct class *ipmi_class;
875 static void ipmi_new_smi(
int if_num,
struct device *
device)
883 " ipmi class device link\n");
890 list_add(&entry->
link, ®_list);
894 static void ipmi_smi_gone(
int if_num)
901 if (entry->
dev == dev) {
914 .new_smi = ipmi_new_smi,
915 .smi_gone = ipmi_smi_gone,
918 static int __init init_ipmi_devintf(
void)
928 if (IS_ERR(ipmi_class)) {
930 return PTR_ERR(ipmi_class);
933 rv = register_chrdev(ipmi_major,
DEVICE_NAME, &ipmi_fops);
940 if (ipmi_major == 0) {
956 static void __exit cleanup_ipmi(
void)