2
* Copyright (c) 2007-2008 Atheros Communications Inc.
4
* Permission to use, copy, modify, and/or distribute this software for any
5
* purpose with or without fee is hereby granted, provided that the above
6
* copyright notice and this permission notice appear in all copies.
8
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
19
/* zfAddFreqChangeReq should be called inside the critical section */
20
static void zfAddFreqChangeReq(zdev_t* dev, u16_t frequency, u8_t bw40,
21
u8_t extOffset, zfpFreqChangeCompleteCb cb)
23
zmw_get_wlan_dev(dev);
25
//printk("zfAddFreqChangeReq freqReqQueueTail%d\n", wd->freqCtrl.freqReqQueueTail);
26
wd->freqCtrl.freqReqQueue[wd->freqCtrl.freqReqQueueTail] = frequency;
27
wd->freqCtrl.freqReqBw40[wd->freqCtrl.freqReqQueueTail] = bw40;
28
wd->freqCtrl.freqReqExtOffset[wd->freqCtrl.freqReqQueueTail] = extOffset;
29
wd->freqCtrl.freqChangeCompCb[wd->freqCtrl.freqReqQueueTail] = cb;
30
wd->freqCtrl.freqReqQueueTail++;
31
if ( wd->freqCtrl.freqReqQueueTail >= ZM_MAX_FREQ_REQ_QUEUE )
33
wd->freqCtrl.freqReqQueueTail = 0;
37
void zfCoreSetFrequencyV2(zdev_t* dev, u16_t frequency, zfpFreqChangeCompleteCb cb)
39
zfCoreSetFrequencyEx(dev, frequency, 0, 0, cb);
42
void zfCoreSetFrequencyExV2(zdev_t* dev, u16_t frequency, u8_t bw40,
43
u8_t extOffset, zfpFreqChangeCompleteCb cb, u8_t forceSetFreq)
45
u8_t setFreqImmed = 0;
47
zmw_get_wlan_dev(dev);
48
zmw_declare_for_critical_section();
50
zm_msg1_scan(ZM_LV_1, "Freq=", frequency);
52
zmw_enter_critical_section(dev);
53
if ((wd->sta.currentFrequency == frequency)
54
&& (wd->sta.currentBw40 == bw40)
55
&& (wd->sta.currentExtOffset == extOffset))
57
if ( forceSetFreq == 0 && wd->sta.flagFreqChanging == 0 )
63
/*if(frequency!=2437) {
64
zmw_leave_critical_section(dev);
69
zfAddFreqChangeReq(dev, frequency, bw40, extOffset, cb);
71
// zm_assert( wd->sta.flagFreqChanging == 0 );
72
//wd->sta.flagFreqChanging = 1;
73
if ( wd->sta.flagFreqChanging == 0 )
75
if ((wd->sta.currentBw40 != bw40) || (wd->sta.currentExtOffset != extOffset))
79
wd->sta.currentFrequency = frequency;
80
wd->sta.currentBw40 = bw40;
81
wd->sta.currentExtOffset = extOffset;
84
wd->sta.flagFreqChanging++;
86
zmw_leave_critical_section(dev);
90
//zfHpSetFrequency(dev, frequency, 0);
92
{ // Cold reset to reset the frequency after scanning !
93
zm_debug_msg0("#6_1 20070917");
94
zm_debug_msg0("It is happen!!! No error message");
95
zfHpSetFrequencyEx(dev, frequency, bw40, extOffset, 2);
99
zfHpSetFrequencyEx(dev, frequency, bw40, extOffset, initRF);
102
if ( zfStaIsConnected(dev)
103
&& (frequency == wd->frequency)) {
104
wd->sta.connPowerInHalfDbm = zfHpGetTransmitPower(dev);
110
zmw_leave_critical_section(dev);
120
void zfCoreSetFrequencyEx(zdev_t* dev, u16_t frequency, u8_t bw40,
121
u8_t extOffset, zfpFreqChangeCompleteCb cb)
123
zfCoreSetFrequencyExV2(dev, frequency, bw40, extOffset, cb, 0);
126
void zfCoreSetFrequency(zdev_t* dev, u16_t frequency)
128
zfCoreSetFrequencyV2(dev, frequency, NULL);
131
/* zfRemoveFreqChangeReq SHOULD NOT be called inside the critical section */
132
static void zfRemoveFreqChangeReq(zdev_t* dev)
134
zfpFreqChangeCompleteCb cb = NULL;
140
u8_t compExtOffset = 0;
142
zmw_get_wlan_dev(dev);
143
zmw_declare_for_critical_section();
145
zmw_enter_critical_section(dev);
147
if (wd->freqCtrl.freqReqQueueHead != wd->freqCtrl.freqReqQueueTail)
149
zm_msg1_scan(ZM_LV_1, "Freq=",
150
wd->freqCtrl.freqReqQueue[wd->freqCtrl.freqReqQueueHead]);
151
compFreq = wd->freqCtrl.freqReqQueue[wd->freqCtrl.freqReqQueueHead];
152
compBw40 = wd->freqCtrl.freqReqBw40[wd->freqCtrl.freqReqQueueHead];
153
compExtOffset = wd->freqCtrl.freqReqExtOffset[wd->freqCtrl.freqReqQueueHead];
155
wd->freqCtrl.freqReqQueue[wd->freqCtrl.freqReqQueueHead] = 0;
156
cb = wd->freqCtrl.freqChangeCompCb[wd->freqCtrl.freqReqQueueHead];
157
wd->freqCtrl.freqReqQueueHead++;
158
if ( wd->freqCtrl.freqReqQueueHead >= ZM_MAX_FREQ_REQ_QUEUE )
160
wd->freqCtrl.freqReqQueueHead = 0;
163
zmw_leave_critical_section(dev);
170
zmw_enter_critical_section(dev);
171
while (wd->freqCtrl.freqReqQueue[wd->freqCtrl.freqReqQueueHead] != 0)
173
frequency = wd->freqCtrl.freqReqQueue[wd->freqCtrl.freqReqQueueHead];
174
bw40 = wd->freqCtrl.freqReqBw40[wd->freqCtrl.freqReqQueueHead];
175
extOffset=wd->freqCtrl.freqReqExtOffset[wd->freqCtrl.freqReqQueueHead];
176
if ((compFreq == frequency)
177
&& (compBw40 == bw40)
178
&& (compExtOffset == extOffset))
180
/* Duplicated frequency command */
181
zm_msg1_scan(ZM_LV_1, "Duplicated Freq=", frequency);
183
cb = wd->freqCtrl.freqChangeCompCb[wd->freqCtrl.freqReqQueueHead];
184
wd->freqCtrl.freqReqQueue[wd->freqCtrl.freqReqQueueHead] = 0;
185
wd->freqCtrl.freqReqQueueHead++;
187
if ( wd->freqCtrl.freqReqQueueHead >= ZM_MAX_FREQ_REQ_QUEUE )
189
wd->freqCtrl.freqReqQueueHead = 0;
192
if ( wd->sta.flagFreqChanging != 0 )
194
wd->sta.flagFreqChanging--;
197
zmw_leave_critical_section(dev);
202
zmw_enter_critical_section(dev);
207
if ((wd->sta.currentBw40 != bw40) || (wd->sta.currentExtOffset != extOffset))
211
wd->sta.currentFrequency = frequency;
212
wd->sta.currentBw40 = bw40;
213
wd->sta.currentExtOffset = extOffset;
214
zmw_leave_critical_section(dev);
216
zfHpSetFrequencyEx(dev, frequency, bw40, extOffset, initRF);
217
if ( zfStaIsConnected(dev)
218
&& (frequency == wd->frequency)) {
219
wd->sta.connPowerInHalfDbm = zfHpGetTransmitPower(dev);
225
zmw_leave_critical_section(dev);
230
void zfCoreSetFrequencyComplete(zdev_t* dev)
232
zmw_get_wlan_dev(dev);
233
zmw_declare_for_critical_section();
235
zm_msg1_scan(ZM_LV_1, "flagFreqChanging=", wd->sta.flagFreqChanging);
237
zmw_enter_critical_section(dev);
238
//wd->sta.flagFreqChanging = 0;
239
if ( wd->sta.flagFreqChanging != 0 )
241
wd->sta.flagFreqChanging--;
244
zmw_leave_critical_section(dev);
246
zfRemoveFreqChangeReq(dev);
252
void zfReSetCurrentFrequency(zdev_t* dev)
254
zmw_get_wlan_dev(dev);
256
zm_debug_msg0("It is happen!!! No error message");
258
zfCoreSetFrequencyExV2(dev, wd->frequency, 0, 0, NULL, 1);