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
drivers
net
wireless
libertas
ethtool.c
Go to the documentation of this file.
1
#include <
linux/hardirq.h
>
2
#include <linux/netdevice.h>
3
#include <linux/ethtool.h>
4
#include <
linux/delay.h
>
5
6
#include "
decl.h
"
7
#include "
cmd.h
"
8
#include "
mesh.h
"
9
10
11
static
void
lbs_ethtool_get_drvinfo(
struct
net_device
*
dev
,
12
struct
ethtool_drvinfo
*
info
)
13
{
14
struct
lbs_private
*
priv
= dev->
ml_priv
;
15
16
snprintf
(info->
fw_version
,
sizeof
(info->
fw_version
),
17
"%u.%u.%u.p%u"
,
18
priv->
fwrelease
>> 24 & 0xff,
19
priv->
fwrelease
>> 16 & 0xff,
20
priv->
fwrelease
>> 8 & 0xff,
21
priv->
fwrelease
& 0xff);
22
strlcpy
(info->
driver
,
"libertas"
,
sizeof
(info->
driver
));
23
strlcpy
(info->
version
,
lbs_driver_version
,
sizeof
(info->
version
));
24
}
25
26
/*
27
* All 8388 parts have 16KiB EEPROM size at the time of writing.
28
* In case that changes this needs fixing.
29
*/
30
#define LBS_EEPROM_LEN 16384
31
32
static
int
lbs_ethtool_get_eeprom_len(
struct
net_device
*
dev
)
33
{
34
return
LBS_EEPROM_LEN
;
35
}
36
37
static
int
lbs_ethtool_get_eeprom(
struct
net_device
*
dev
,
38
struct
ethtool_eeprom
*
eeprom
,
u8
*
bytes
)
39
{
40
struct
lbs_private
*
priv
= dev->
ml_priv
;
41
struct
cmd_ds_802_11_eeprom_access
cmd
;
42
int
ret
;
43
44
lbs_deb_enter
(
LBS_DEB_ETHTOOL
);
45
46
if
(eeprom->
offset
+ eeprom->
len
>
LBS_EEPROM_LEN
||
47
eeprom->
len
>
LBS_EEPROM_READ_LEN
) {
48
ret = -
EINVAL
;
49
goto
out
;
50
}
51
52
cmd
.hdr.size =
cpu_to_le16
(
sizeof
(
struct
cmd_ds_802_11_eeprom_access
) -
53
LBS_EEPROM_READ_LEN
+ eeprom->
len
);
54
cmd
.action =
cpu_to_le16
(
CMD_ACT_GET
);
55
cmd
.offset =
cpu_to_le16
(eeprom->
offset
);
56
cmd
.len =
cpu_to_le16
(eeprom->
len
);
57
ret =
lbs_cmd_with_response
(priv,
CMD_802_11_EEPROM_ACCESS
, &
cmd
);
58
if
(!ret)
59
memcpy
(bytes,
cmd
.value, eeprom->
len
);
60
61
out
:
62
lbs_deb_leave_args
(
LBS_DEB_ETHTOOL
,
"ret %d"
, ret);
63
return
ret
;
64
}
65
66
static
void
lbs_ethtool_get_wol(
struct
net_device
*dev,
67
struct
ethtool_wolinfo
*
wol
)
68
{
69
struct
lbs_private
*priv = dev->
ml_priv
;
70
71
wol->
supported
=
WAKE_UCAST
|
WAKE_MCAST
|
WAKE_BCAST
|
WAKE_PHY
;
72
73
if
(priv->
wol_criteria
==
EHS_REMOVE_WAKEUP
)
74
return
;
75
76
if
(priv->
wol_criteria
&
EHS_WAKE_ON_UNICAST_DATA
)
77
wol->
wolopts
|=
WAKE_UCAST
;
78
if
(priv->
wol_criteria
&
EHS_WAKE_ON_MULTICAST_DATA
)
79
wol->
wolopts
|=
WAKE_MCAST
;
80
if
(priv->
wol_criteria
&
EHS_WAKE_ON_BROADCAST_DATA
)
81
wol->
wolopts
|=
WAKE_BCAST
;
82
if
(priv->
wol_criteria
&
EHS_WAKE_ON_MAC_EVENT
)
83
wol->
wolopts
|=
WAKE_PHY
;
84
}
85
86
static
int
lbs_ethtool_set_wol(
struct
net_device
*dev,
87
struct
ethtool_wolinfo
*wol)
88
{
89
struct
lbs_private
*priv = dev->
ml_priv
;
90
91
if
(wol->
wolopts
& ~(
WAKE_UCAST
|
WAKE_MCAST
|
WAKE_BCAST
|
WAKE_PHY
))
92
return
-
EOPNOTSUPP
;
93
94
priv->
wol_criteria
= 0;
95
if
(wol->
wolopts
&
WAKE_UCAST
)
96
priv->
wol_criteria
|=
EHS_WAKE_ON_UNICAST_DATA
;
97
if
(wol->
wolopts
&
WAKE_MCAST
)
98
priv->
wol_criteria
|=
EHS_WAKE_ON_MULTICAST_DATA
;
99
if
(wol->
wolopts
&
WAKE_BCAST
)
100
priv->
wol_criteria
|=
EHS_WAKE_ON_BROADCAST_DATA
;
101
if
(wol->
wolopts
&
WAKE_PHY
)
102
priv->
wol_criteria
|=
EHS_WAKE_ON_MAC_EVENT
;
103
if
(wol->
wolopts
== 0)
104
priv->
wol_criteria
|=
EHS_REMOVE_WAKEUP
;
105
return
0;
106
}
107
108
const
struct
ethtool_ops
lbs_ethtool_ops
= {
109
.get_drvinfo = lbs_ethtool_get_drvinfo,
110
.get_eeprom = lbs_ethtool_get_eeprom,
111
.get_eeprom_len = lbs_ethtool_get_eeprom_len,
112
#ifdef CONFIG_LIBERTAS_MESH
113
.get_sset_count =
lbs_mesh_ethtool_get_sset_count
,
114
.get_ethtool_stats =
lbs_mesh_ethtool_get_stats
,
115
.get_strings =
lbs_mesh_ethtool_get_strings
,
116
#endif
117
.get_wol = lbs_ethtool_get_wol,
118
.set_wol = lbs_ethtool_set_wol,
119
};
120
Generated on Thu Jan 10 2013 14:02:13 for Linux Kernel by
1.8.2