1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40#include "mac.h"
41#include "device.h"
42#include "power.h"
43#include "card.h"
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65void
66PSvEnablePowerSaving(
67 void *hDeviceContext,
68 unsigned short wListenInterval
69)
70{
71 struct vnt_private *pDevice = hDeviceContext;
72 u16 wAID = pDevice->current_aid | BIT(14) | BIT(15);
73
74
75 VNSvOutPortW(pDevice->PortOffset + MAC_REG_PWBT, C_PWBT);
76 if (pDevice->op_mode != NL80211_IFTYPE_ADHOC) {
77
78 VNSvOutPortW(pDevice->PortOffset + MAC_REG_AIDATIM, wAID);
79 } else {
80
81#if 0
82 MACvWriteATIMW(pDevice->PortOffset, pMgmt->wCurrATIMWindow);
83#endif
84 }
85
86 MACvRegBitsOn(pDevice->PortOffset, MAC_REG_PSCFG, PSCFG_AUTOSLEEP);
87
88 MACvRegBitsOn(pDevice->PortOffset, MAC_REG_TFTCTL, TFTCTL_HWUTSF);
89
90 if (wListenInterval >= 2) {
91
92 MACvRegBitsOff(pDevice->PortOffset, MAC_REG_PSCTL, PSCTL_ALBCN);
93
94 MACvRegBitsOn(pDevice->PortOffset, MAC_REG_PSCTL, PSCTL_LNBCN);
95 } else {
96
97 MACvRegBitsOn(pDevice->PortOffset, MAC_REG_PSCTL, PSCTL_ALBCN);
98 }
99
100
101 MACvRegBitsOn(pDevice->PortOffset, MAC_REG_PSCTL, PSCTL_PSEN);
102 pDevice->bEnablePSMode = true;
103
104 pDevice->bPWBitOn = true;
105 pr_debug("PS:Power Saving Mode Enable...\n");
106}
107
108
109
110
111
112
113
114
115
116
117
118void
119PSvDisablePowerSaving(
120 void *hDeviceContext
121)
122{
123 struct vnt_private *pDevice = hDeviceContext;
124
125
126 MACbPSWakeup(pDevice->PortOffset);
127
128 MACvRegBitsOff(pDevice->PortOffset, MAC_REG_PSCFG, PSCFG_AUTOSLEEP);
129
130 MACvRegBitsOff(pDevice->PortOffset, MAC_REG_TFTCTL, TFTCTL_HWUTSF);
131
132 MACvRegBitsOn(pDevice->PortOffset, MAC_REG_PSCTL, PSCTL_ALBCN);
133
134 pDevice->bEnablePSMode = false;
135
136 pDevice->bPWBitOn = false;
137}
138
139
140
141
142
143
144
145
146
147
148
149
150bool
151PSbIsNextTBTTWakeUp(
152 void *hDeviceContext
153)
154{
155 struct vnt_private *pDevice = hDeviceContext;
156 struct ieee80211_hw *hw = pDevice->hw;
157 struct ieee80211_conf *conf = &hw->conf;
158 bool bWakeUp = false;
159
160 if (conf->listen_interval > 1) {
161 if (!pDevice->wake_up_count)
162 pDevice->wake_up_count = conf->listen_interval;
163
164 --pDevice->wake_up_count;
165
166 if (pDevice->wake_up_count == 1) {
167
168 MACvRegBitsOn(pDevice->PortOffset,
169 MAC_REG_PSCTL, PSCTL_LNBCN);
170 bWakeUp = true;
171 }
172 }
173
174 return bWakeUp;
175}
176