Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
L
linux-davinci
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Redmine
Redmine
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Metrics
Environments
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
linux
linux-davinci
Commits
0d090b68
Commit
0d090b68
authored
Jul 22, 2007
by
Len Brown
Browse files
Options
Browse Files
Download
Plain Diff
Pull netlink into release branch
parents
b4b613fd
9c977a45
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
152 additions
and
8 deletions
+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
No files found.
drivers/acpi/bus.c
View file @
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
View file @
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
View file @
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
*/
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment