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
staging
csr
sdio_events.c
Go to the documentation of this file.
1
/*
2
* ---------------------------------------------------------------------------
3
* FILE: sdio_events.c
4
*
5
* PURPOSE:
6
* Process the events received by the SDIO glue layer.
7
* Optional part of the porting exercise.
8
*
9
* Copyright (C) 2009 by Cambridge Silicon Radio Ltd.
10
*
11
* Refer to LICENSE.txt included with this source code for details on
12
* the license terms.
13
*
14
* ---------------------------------------------------------------------------
15
*/
16
#include "
unifi_priv.h
"
17
18
19
/*
20
* Porting Notes:
21
* There are two ways to support the suspend/resume system events in a driver.
22
* In some operating systems these events are delivered to the OS driver
23
* directly from the system. In this case, the OS driver needs to pass these
24
* events to the API described in the CSR SDIO Abstration API document.
25
* In Linux, and other embedded operating systems, the suspend/resume events
26
* come from the SDIO driver. In this case, simply get these events in the
27
* SDIO glue layer and notify the OS layer.
28
*
29
* In either case, typically, the events are processed by the SME.
30
* Use the unifi_sys_suspend_ind() and unifi_sys_resume_ind() to pass
31
* the events to the SME.
32
*/
33
34
/*
35
* ---------------------------------------------------------------------------
36
* unifi_suspend
37
*
38
* Handles a suspend request from the SDIO driver.
39
*
40
* Arguments:
41
* ospriv Pointer to OS driver context.
42
*
43
* ---------------------------------------------------------------------------
44
*/
45
void
unifi_suspend
(
void
*ospriv)
46
{
47
unifi_priv_t
*
priv
= ospriv;
48
int
interfaceTag=0;
49
50
/* For powered suspend, tell the resume's wifi_on() not to reinit UniFi */
51
priv->
wol_suspend
= (
enable_wol
==
UNIFI_WOL_OFF
) ?
FALSE
:
TRUE
;
52
53
unifi_trace
(priv,
UDBG1
,
"unifi_suspend: wol_suspend %d, enable_wol %d"
,
54
priv->
wol_suspend
,
enable_wol
);
55
56
/* Stop network traffic. */
57
/* need to stop all the netdevices*/
58
for
( interfaceTag=0;interfaceTag<
CSR_WIFI_NUM_INTERFACES
;interfaceTag++)
59
{
60
netInterface_priv_t
*interfacePriv = priv->
interfacePriv
[interfaceTag];
61
if
(interfacePriv->
netdev_registered
== 1)
62
{
63
if
( priv->
wol_suspend
) {
64
unifi_trace
(priv,
UDBG1
,
"unifi_suspend: Don't netif_carrier_off"
);
65
}
else
{
66
unifi_trace
(priv,
UDBG1
,
"unifi_suspend: netif_carrier_off"
);
67
netif_carrier_off
(priv->
netdev
[interfaceTag]);
68
}
69
netif_tx_stop_all_queues(priv->
netdev
[interfaceTag]);
70
}
71
}
72
73
unifi_trace
(priv,
UDBG1
,
"unifi_suspend: suspend SME"
);
74
75
sme_sys_suspend
(priv);
76
77
}
/* unifi_suspend() */
78
79
80
/*
81
* ---------------------------------------------------------------------------
82
* unifi_resume
83
*
84
* Handles a resume request from the SDIO driver.
85
*
86
* Arguments:
87
* ospriv Pointer to OS driver context.
88
*
89
* ---------------------------------------------------------------------------
90
*/
91
void
unifi_resume
(
void
*ospriv)
92
{
93
unifi_priv_t
*
priv
= ospriv;
94
int
interfaceTag=0;
95
int
r
;
96
int
wol
= priv->
wol_suspend
;
97
98
unifi_trace
(priv,
UDBG1
,
"unifi_resume: resume SME, enable_wol=%d"
,
enable_wol
);
99
100
/* The resume causes wifi-on which will re-enable the BH and reinstall the ISR */
101
r =
sme_sys_resume
(priv);
102
if
(r) {
103
unifi_error
(priv,
"Failed to resume UniFi\n"
);
104
}
105
106
/* Resume the network interfaces. For the cold resume case, this will
107
* happen upon reconnection.
108
*/
109
if
(wol) {
110
unifi_trace
(priv,
UDBG1
,
"unifi_resume: try to enable carrier"
);
111
112
/* need to start all the netdevices*/
113
for
( interfaceTag=0;interfaceTag<
CSR_WIFI_NUM_INTERFACES
;interfaceTag++) {
114
netInterface_priv_t
*interfacePriv = priv->
interfacePriv
[interfaceTag];
115
116
unifi_trace
(priv,
UDBG1
,
"unifi_resume: interfaceTag %d netdev_registered %d mode %d\n"
,
117
interfaceTag, interfacePriv->
netdev_registered
, interfacePriv->
interfaceMode
);
118
119
if
(interfacePriv->
netdev_registered
== 1)
120
{
121
netif_carrier_on
(priv->
netdev
[interfaceTag]);
122
netif_tx_start_all_queues(priv->
netdev
[interfaceTag]);
123
}
124
}
125
126
/* Kick the BH thread (with reason=host) to poll for data that may have
127
* arrived during a powered suspend. This caters for the case where the SME
128
* doesn't interact with the chip (e.g install autonomous scans) during resume.
129
*/
130
unifi_send_signal
(priv->
card
,
NULL
, 0,
NULL
);
131
}
132
133
}
/* unifi_resume() */
134
Generated on Thu Jan 10 2013 14:27:57 for Linux Kernel by
1.8.2