Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openeuler
Kernel
提交
0d090b68
K
Kernel
项目概览
openeuler
/
Kernel
大约 1 年 前同步成功
通知
5
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
K
Kernel
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
0d090b68
编写于
7月 22, 2007
作者:
L
Len Brown
浏览文件
操作
浏览文件
下载
差异文件
Pull netlink into release branch
上级
b4b613fd
9c977a45
变更
3
显示空白变更内容
内联
并排
Showing
3 changed file
with
152 addition
and
8 deletion
+152
-8
drivers/acpi/bus.c
drivers/acpi/bus.c
+4
-0
drivers/acpi/event.c
drivers/acpi/event.c
+146
-7
include/acpi/acpi_bus.h
include/acpi/acpi_bus.h
+2
-1
未找到文件。
drivers/acpi/bus.c
浏览文件 @
0d090b68
...
...
@@ -292,6 +292,10 @@ int acpi_bus_generate_event(struct acpi_device *device, u8 type, int data)
if
(
!
device
)
return
-
EINVAL
;
if
(
acpi_bus_generate_genetlink_event
(
device
,
type
,
data
))
printk
(
KERN_WARNING
PREFIX
"Failed to generate an ACPI event via genetlink!
\n
"
);
/* drop event on the floor if no one's listening */
if
(
!
event_is_open
)
return
0
;
...
...
drivers/acpi/event.c
浏览文件 @
0d090b68
...
...
@@ -11,6 +11,8 @@
#include <linux/init.h>
#include <linux/poll.h>
#include <acpi/acpi_drivers.h>
#include <net/netlink.h>
#include <net/genetlink.h>
#define _COMPONENT ACPI_SYSTEM_COMPONENT
ACPI_MODULE_NAME
(
"event"
);
...
...
@@ -48,7 +50,6 @@ acpi_system_read_event(struct file *file, char __user * buffer, size_t count,
static
int
chars_remaining
=
0
;
static
char
*
ptr
;
if
(
!
chars_remaining
)
{
memset
(
&
event
,
0
,
sizeof
(
struct
acpi_bus_event
));
...
...
@@ -106,23 +107,161 @@ static const struct file_operations acpi_system_event_ops = {
.
poll
=
acpi_system_poll_event
,
};
#ifdef CONFIG_NET
unsigned
int
acpi_event_seqnum
;
struct
acpi_genl_event
{
acpi_device_class
device_class
;
char
bus_id
[
15
];
u32
type
;
u32
data
;
};
/* attributes of acpi_genl_family */
enum
{
ACPI_GENL_ATTR_UNSPEC
,
ACPI_GENL_ATTR_EVENT
,
/* ACPI event info needed by user space */
__ACPI_GENL_ATTR_MAX
,
};
#define ACPI_GENL_ATTR_MAX (__ACPI_GENL_ATTR_MAX - 1)
/* commands supported by the acpi_genl_family */
enum
{
ACPI_GENL_CMD_UNSPEC
,
ACPI_GENL_CMD_EVENT
,
/* kernel->user notifications for ACPI events */
__ACPI_GENL_CMD_MAX
,
};
#define ACPI_GENL_CMD_MAX (__ACPI_GENL_CMD_MAX - 1)
#define ACPI_GENL_FAMILY_NAME "acpi_event"
#define ACPI_GENL_VERSION 0x01
#define ACPI_GENL_MCAST_GROUP_NAME "acpi_mc_group"
static
struct
genl_family
acpi_event_genl_family
=
{
.
id
=
GENL_ID_GENERATE
,
.
name
=
ACPI_GENL_FAMILY_NAME
,
.
version
=
ACPI_GENL_VERSION
,
.
maxattr
=
ACPI_GENL_ATTR_MAX
,
};
static
struct
genl_multicast_group
acpi_event_mcgrp
=
{
.
name
=
ACPI_GENL_MCAST_GROUP_NAME
,
};
int
acpi_bus_generate_genetlink_event
(
struct
acpi_device
*
device
,
u8
type
,
int
data
)
{
struct
sk_buff
*
skb
;
struct
nlattr
*
attr
;
struct
acpi_genl_event
*
event
;
void
*
msg_header
;
int
size
;
int
result
;
/* allocate memory */
size
=
nla_total_size
(
sizeof
(
struct
acpi_genl_event
))
+
nla_total_size
(
0
);
skb
=
genlmsg_new
(
size
,
GFP_ATOMIC
);
if
(
!
skb
)
return
-
ENOMEM
;
/* add the genetlink message header */
msg_header
=
genlmsg_put
(
skb
,
0
,
acpi_event_seqnum
++
,
&
acpi_event_genl_family
,
0
,
ACPI_GENL_CMD_EVENT
);
if
(
!
msg_header
)
{
nlmsg_free
(
skb
);
return
-
ENOMEM
;
}
/* fill the data */
attr
=
nla_reserve
(
skb
,
ACPI_GENL_ATTR_EVENT
,
sizeof
(
struct
acpi_genl_event
));
if
(
!
attr
)
{
nlmsg_free
(
skb
);
return
-
EINVAL
;
}
event
=
nla_data
(
attr
);
if
(
!
event
)
{
nlmsg_free
(
skb
);
return
-
EINVAL
;
}
memset
(
event
,
0
,
sizeof
(
struct
acpi_genl_event
));
strcpy
(
event
->
device_class
,
device
->
pnp
.
device_class
);
strcpy
(
event
->
bus_id
,
device
->
dev
.
bus_id
);
event
->
type
=
type
;
event
->
data
=
data
;
/* send multicast genetlink message */
result
=
genlmsg_end
(
skb
,
msg_header
);
if
(
result
<
0
)
{
nlmsg_free
(
skb
);
return
result
;
}
result
=
genlmsg_multicast
(
skb
,
0
,
acpi_event_mcgrp
.
id
,
GFP_ATOMIC
);
if
(
result
)
ACPI_DEBUG_PRINT
((
ACPI_DB_INFO
,
"Failed to send a Genetlink message!
\n
"
));
return
0
;
}
static
int
acpi_event_genetlink_init
(
void
)
{
int
result
;
result
=
genl_register_family
(
&
acpi_event_genl_family
);
if
(
result
)
return
result
;
result
=
genl_register_mc_group
(
&
acpi_event_genl_family
,
&
acpi_event_mcgrp
);
if
(
result
)
genl_unregister_family
(
&
acpi_event_genl_family
);
return
result
;
}
#else
int
acpi_bus_generate_genetlink_event
(
struct
acpi_device
*
device
,
u8
type
,
int
data
)
{
return
0
;
}
static
int
acpi_event_genetlink_init
(
void
)
{
return
-
ENODEV
;
}
#endif
static
int
__init
acpi_event_init
(
void
)
{
struct
proc_dir_entry
*
entry
;
int
error
=
0
;
if
(
acpi_disabled
)
return
0
;
/* create genetlink for acpi event */
error
=
acpi_event_genetlink_init
();
if
(
error
)
printk
(
KERN_WARNING
PREFIX
"Failed to create genetlink family for ACPI event
\n
"
);
/* 'event' [R] */
entry
=
create_proc_entry
(
"event"
,
S_IRUSR
,
acpi_root_dir
);
if
(
entry
)
entry
->
proc_fops
=
&
acpi_system_event_ops
;
else
{
error
=
-
ENODEV
;
}
return
error
;
else
return
-
ENODEV
;
return
0
;
}
subsy
s_initcall
(
acpi_event_init
);
f
s_initcall
(
acpi_event_init
);
include/acpi/acpi_bus.h
浏览文件 @
0d090b68
...
...
@@ -321,7 +321,8 @@ struct acpi_bus_event {
};
extern
struct
kset
acpi_subsys
;
extern
int
acpi_bus_generate_genetlink_event
(
struct
acpi_device
*
device
,
u8
type
,
int
data
);
/*
* External Functions
*/
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录