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