RT-AC56 3.0.0.4.374.37 core
[tomato.git] / release / src-rt-6.x.4708 / linux / linux-2.6.36 / drivers / staging / otus / 80211core / freqctrl.c
blobbab0df08d8263354c1c99d8c625ca311e40d5820
1 /*
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.
17 #include "cprecomp.h"
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;
46 u8_t initRF = 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 )
59 goto done;
62 #ifdef ZM_FB50
63 /*if(frequency!=2437) {
64 zmw_leave_critical_section(dev);
65 return;
66 }*/
67 #endif
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))
77 initRF = 1;
79 wd->sta.currentFrequency = frequency;
80 wd->sta.currentBw40 = bw40;
81 wd->sta.currentExtOffset = extOffset;
82 setFreqImmed = 1;
84 wd->sta.flagFreqChanging++;
86 zmw_leave_critical_section(dev);
88 if ( setFreqImmed )
90 //zfHpSetFrequency(dev, frequency, 0);
91 if ( forceSetFreq )
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);
97 else
99 zfHpSetFrequencyEx(dev, frequency, bw40, extOffset, initRF);
102 if ( zfStaIsConnected(dev)
103 && (frequency == wd->frequency)) {
104 wd->sta.connPowerInHalfDbm = zfHpGetTransmitPower(dev);
107 return;
109 done:
110 zmw_leave_critical_section(dev);
112 if ( cb != NULL )
114 cb(dev);
116 zfPushVtxq(dev);
117 return;
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;
135 u16_t frequency;
136 u8_t bw40;
137 u8_t extOffset;
138 u16_t compFreq = 0;
139 u8_t compBw40 = 0;
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);
165 if ( cb != NULL )
167 cb(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);
198 if ( cb != NULL )
200 cb(dev);
202 zmw_enter_critical_section(dev);
204 else
206 u8_t initRF = 0;
207 if ((wd->sta.currentBw40 != bw40) || (wd->sta.currentExtOffset != extOffset))
209 initRF = 1;
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);
222 return;
225 zmw_leave_critical_section(dev);
227 return;
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);
248 zfPushVtxq(dev);
249 return;
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);