Linux Kernel
3.7.1
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
net
wimax
op-reset.c
Go to the documentation of this file.
1
/*
2
* Linux WiMAX
3
* Implement and export a method for resetting a WiMAX device
4
*
5
*
6
* Copyright (C) 2008 Intel Corporation <
[email protected]
>
7
* Inaky Perez-Gonzalez <
[email protected]
>
8
*
9
* This program is free software; you can redistribute it and/or
10
* modify it under the terms of the GNU General Public License version
11
* 2 as published by the Free Software Foundation.
12
*
13
* This program is distributed in the hope that it will be useful,
14
* but WITHOUT ANY WARRANTY; without even the implied warranty of
15
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16
* GNU General Public License for more details.
17
*
18
* You should have received a copy of the GNU General Public License
19
* along with this program; if not, write to the Free Software
20
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
21
* 02110-1301, USA.
22
*
23
*
24
* This implements a simple synchronous call to reset a WiMAX device.
25
*
26
* Resets aim at being warm, keeping the device handles active;
27
* however, when that fails, it falls back to a cold reset (that will
28
* disconnect and reconnect the device).
29
*/
30
31
#include <
net/wimax.h
>
32
#include <
net/genetlink.h
>
33
#include <
linux/wimax.h
>
34
#include <
linux/security.h
>
35
#include <linux/export.h>
36
#include "
wimax-internal.h
"
37
38
#define D_SUBMODULE op_reset
39
#include "
debug-levels.h
"
40
41
69
int
wimax_reset
(
struct
wimax_dev
*
wimax_dev
)
70
{
71
int
result
= -
EINVAL
;
72
struct
device
*
dev
= wimax_dev_to_dev(wimax_dev);
73
enum
wimax_st
state
;
74
75
might_sleep
();
76
d_fnstart
(3, dev,
"(wimax_dev %p)\n"
, wimax_dev);
77
mutex_lock
(&wimax_dev->
mutex
);
78
dev_hold(wimax_dev->
net_dev
);
79
state = wimax_dev->
state
;
80
mutex_unlock
(&wimax_dev->
mutex
);
81
82
if
(state >=
WIMAX_ST_DOWN
) {
83
mutex_lock
(&wimax_dev->
mutex_reset
);
84
result = wimax_dev->
op_reset
(wimax_dev);
85
mutex_unlock
(&wimax_dev->
mutex_reset
);
86
}
87
dev_put(wimax_dev->
net_dev
);
88
89
d_fnend
(3, dev,
"(wimax_dev %p) = %d\n"
, wimax_dev, result);
90
return
result
;
91
}
92
EXPORT_SYMBOL
(
wimax_reset
);
93
94
95
static
const
struct
nla_policy
wimax_gnl_reset_policy[
WIMAX_GNL_ATTR_MAX
+ 1] = {
96
[
WIMAX_GNL_RESET_IFIDX
] = {
97
.type =
NLA_U32
,
98
},
99
};
100
101
102
/*
103
* Exporting to user space over generic netlink
104
*
105
* Parse the reset command from user space, return error code.
106
*
107
* No attributes.
108
*/
109
static
110
int
wimax_gnl_doit_reset(
struct
sk_buff
*
skb
,
struct
genl_info
*
info
)
111
{
112
int
result
, ifindex;
113
struct
wimax_dev
*
wimax_dev
;
114
115
d_fnstart
(3,
NULL
,
"(skb %p info %p)\n"
, skb, info);
116
result = -
ENODEV
;
117
if
(info->
attrs
[
WIMAX_GNL_RESET_IFIDX
] ==
NULL
) {
118
printk
(
KERN_ERR
"WIMAX_GNL_OP_RFKILL: can't find IFIDX "
119
"attribute\n"
);
120
goto
error_no_wimax_dev;
121
}
122
ifindex = nla_get_u32(info->
attrs
[
WIMAX_GNL_RESET_IFIDX
]);
123
wimax_dev =
wimax_dev_get_by_genl_info
(info, ifindex);
124
if
(wimax_dev ==
NULL
)
125
goto
error_no_wimax_dev;
126
/* Execute the operation and send the result back to user space */
127
result =
wimax_reset
(wimax_dev);
128
dev_put(wimax_dev->
net_dev
);
129
error_no_wimax_dev:
130
d_fnend
(3,
NULL
,
"(skb %p info %p) = %d\n"
, skb, info, result);
131
return
result
;
132
}
133
134
135
struct
genl_ops
wimax_gnl_reset
= {
136
.cmd =
WIMAX_GNL_OP_RESET
,
137
.flags =
GENL_ADMIN_PERM
,
138
.policy = wimax_gnl_reset_policy,
139
.doit = wimax_gnl_doit_reset,
140
.dumpit =
NULL
,
141
};
Generated on Thu Jan 10 2013 15:02:27 for Linux Kernel by
1.8.2