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 /* Module Name : cwm.c */
20 /* This module contains channel width related functions. */
25 /************************************************************************/
31 void zfCwmInit(zdev_t
* dev
) {
33 zmw_get_wlan_dev(dev
);
35 switch (wd
->wlanMode
) {
37 wd
->cwm
.cw_mode
= CWM_MODE2040
;
38 wd
->cwm
.cw_width
= CWM_WIDTH40
;
39 wd
->cwm
.cw_enable
= 1;
41 case ZM_MODE_INFRASTRUCTURE
:
45 wd
->cwm
.cw_mode
= CWM_MODE2040
;
46 wd
->cwm
.cw_width
= CWM_WIDTH20
;
47 wd
->cwm
.cw_enable
= 1;
53 void zfCoreCwmBusy(zdev_t
* dev
, u16_t busy
)
56 zmw_get_wlan_dev(dev
);
58 zm_msg1_mm(ZM_LV_0
, "CwmBusy=", busy
);
60 if(wd
->cwm
.cw_mode
== CWM_MODE20
) {
61 wd
->cwm
.cw_width
= CWM_WIDTH20
;
65 if(wd
->cwm
.cw_mode
== CWM_MODE40
) {
66 wd
->cwm
.cw_width
= CWM_WIDTH40
;
71 wd
->cwm
.cw_width
= CWM_WIDTH20
;
76 if((wd
->wlanMode
== ZM_MODE_INFRASTRUCTURE
|| wd
->wlanMode
== ZM_MODE_PSEUDO
||
77 wd
->wlanMode
== ZM_MODE_IBSS
)) {
78 if ((wd
->sta
.ie
.HtCap
.HtCapInfo
& HTCAP_SupChannelWidthSet
) &&
79 (wd
->sta
.ie
.HtInfo
.ChannelInfo
& ExtHtCap_RecomTxWidthSet
) &&
80 (wd
->sta
.ie
.HtInfo
.ChannelInfo
& ExtHtCap_ExtChannelOffsetAbove
)) {
82 wd
->cwm
.cw_width
= CWM_WIDTH40
;
85 wd
->cwm
.cw_width
= CWM_WIDTH20
;
91 if(wd
->wlanMode
== ZM_MODE_AP
) {
92 wd
->cwm
.cw_width
= CWM_WIDTH40
;
100 u16_t
zfCwmIsExtChanBusy(u32_t ctlBusy
, u32_t extBusy
)
102 u32_t busy
; /* percentage */
103 u32_t cycleTime
, ctlClear
;
105 cycleTime
= 1280000; //1.28 seconds
107 if (cycleTime
> ctlBusy
) {
108 ctlClear
= cycleTime
- ctlBusy
;
115 /* Compute ratio of extension channel busy to control channel clear
116 * as an approximation to extension channel cleanliness.
118 * According to the hardware folks, ext rxclear is undefined
119 * if the ctrl rxclear is de-asserted (i.e. busy)
122 busy
= (extBusy
* 100) / ctlClear
;
126 if (busy
> ATH_CWM_EXTCH_BUSY_THRESHOLD
) {