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 : init.c */
20 /* This module contains init functions. */
25 /************************************************************************/
27 #include "../hal/hpreg.h"
29 extern const u8_t zcUpToAc
[8];
31 u16_t zcIndextoRateBG
[16] = {1000, 2000, 5500, 11000, 0, 0, 0, 0, 48000,
32 24000, 12000, 6000, 54000, 36000, 18000, 9000};
33 u32_t zcIndextoRateN20L
[16] = {6500, 13000, 19500, 26000, 39000, 52000, 58500,
34 65000, 13000, 26000, 39000, 52000, 78000, 104000,
36 u32_t zcIndextoRateN20S
[16] = {7200, 14400, 21700, 28900, 43300, 57800, 65000,
37 72200, 14400, 28900, 43300, 57800, 86700, 115600,
39 u32_t zcIndextoRateN40L
[16] = {13500, 27000, 40500, 54000, 81000, 108000, 121500,
40 135000, 27000, 54000, 81000, 108000, 162000, 216000,
42 u32_t zcIndextoRateN40S
[16] = {15000, 30000, 45000, 60000, 90000, 120000, 135000,
43 150000, 30000, 60000, 90000, 120000, 180000, 240000,
46 /************************************************************************/
48 /* FUNCTION DESCRIPTION zfTxGenWlanHeader */
49 /* Generate WLAN MAC header and LLC header. */
52 /* dev : device pointer */
53 /* buf : buffer pointer */
54 /* id : Index of TxD */
55 /* port : WLAN port */
58 /* length of removed Ethernet header */
61 /* Stephen ZyDAS Technology Corporation 2005.5 */
63 /************************************************************************/
64 u16_t
zfTxGenWlanHeader(zdev_t
* dev
, zbuf_t
* buf
, u16_t
* header
, u16_t seq
,
65 u8_t flag
, u16_t plusLen
, u16_t minusLen
, u16_t port
,
66 u16_t
* da
, u16_t
* sa
, u8_t up
, u16_t
*micLen
,
67 u16_t
* snap
, u16_t snapLen
, struct aggControl
*aggControl
)
82 u8_t encExemptionActionType
;
83 u16_t rateProbingFlag
= 0;
84 u8_t tkipFrameOffset
= 0;
86 #ifdef ZM_ENABLE_IBSS_WPA2PSK
93 zmw_get_wlan_dev(dev
);
95 /* Generate WLAN header */
97 header
[4] = 0x0008 | (flag
<<8);
101 if (wd
->wlanMode
== ZM_MODE_INFRASTRUCTURE
)
106 /*Sometimes we wake up to tx/rx but AP still think we are sleeping, so still need to set this bit*/
107 if ( zfPowerSavingMgrIsSleeping(dev
) || wd
->sta
.psMgr
.tempWakeUp
== 1 )
112 /* Address 1 = BSSID */
113 header
[6] = wd
->sta
.bssid
[0];
114 header
[7] = wd
->sta
.bssid
[1];
115 header
[8] = wd
->sta
.bssid
[2];
121 else if (wd
->wlanMode
== ZM_MODE_PSEUDO
)
127 /* Address 3 = 00:00:00:00:00:00 */
132 /* PSEUDO test : WDS */
135 /* ToDS and FromDS bit */
146 else if (wd
->wlanMode
== ZM_MODE_IBSS
)
152 /* Address 3 = BSSID */
153 header
[12] = wd
->sta
.bssid
[0];
154 header
[13] = wd
->sta
.bssid
[1];
155 header
[14] = wd
->sta
.bssid
[2];
157 #ifdef ZM_ENABLE_IBSS_WPA2PSK
158 zmw_enter_critical_section(dev
);
159 res
= zfStaFindOppositeByMACAddr(dev
, da
, &peerIdx
);
160 if(res
== 0) // Find opposite in our OppositeInfo Structure !
164 zmw_leave_critical_section(dev
);
167 else if (wd
->wlanMode
== ZM_MODE_AP
)
184 if (port
< ZM_MAX_AP_SUPPORT
)
187 header
[14] += (vap
<<8);
193 /* ToDS and FromDS bit */
196 wdsPortId
= port
- 0x20;
199 header
[6] = wd
->ap
.wds
.macAddr
[wdsPortId
][0];
200 header
[7] = wd
->ap
.wds
.macAddr
[wdsPortId
][1];
201 header
[8] = wd
->ap
.wds
.macAddr
[wdsPortId
][2];
213 } /* else if (wd->wlanMode == ZM_MODE_AP) */
216 header
[9] = wd
->macAddr
[0];
217 header
[10] = wd
->macAddr
[1];
218 #ifdef ZM_VAPMODE_MULTILE_SSID
219 header
[11] = wd
->macAddr
[2]; //Multiple SSID
221 header
[11] = wd
->macAddr
[2] + (vap
<<8); //VAP
224 if ( (wd
->wlanMode
== ZM_MODE_IBSS
) && (wd
->XLinkMode
) )
231 /* Sequence Control */
235 if (wd
->wlanMode
== ZM_MODE_AP
)
237 zfApGetStaTxRateAndQosType(dev
, da
, &phyCtrl
, &qosType
, &rateProbingFlag
);
238 mt
= (u16_t
)(phyCtrl
& 0x3);
239 mcs
= (u16_t
)((phyCtrl
>> 16) & 0x3f);
241 //zfApGetStaQosType(dev, da, &qosType);
243 /* if DA == WME STA */
258 if (header
[6] == 0x8000)
269 if (wd
->wlanMode
== ZM_MODE_AP
) {
270 /* Todo: rate control here for qos field */
274 zfStaGetTxRate(dev
, da
, &phyCtrl
, &rateProbingFlag
);
275 mt
= (u16_t
)(phyCtrl
& 0x3);
276 mcs
= (u16_t
)((phyCtrl
>> 16) & 0x3f);
279 if (wd
->txMCS
!= 0xff)
282 phyCtrl
= ((u32_t
)wd
->txMCS
<<16) + wd
->txMT
;
287 if (wd
->enableAggregation
)
289 /* force enable aggregation */
290 if (wd
->enableAggregation
==2 && !(header
[6]&0x1))
299 /* if wd->enableAggregation=1 => force disable */
300 /* if wd->enableAggregation=0 => auto */
303 #ifdef ZM_ENABLE_AGGREGATION
305 * aggregation control
311 if (wd
->wlanMode
== ZM_MODE_AP
) {
312 if (aggControl
&& mt
== 2) {
313 if (wd
->enableAggregation
==0 && !(header
[6]&0x1))
328 len
= zfwBufGetSize(dev
, buf
);
330 /* Generate control setting */
331 /* Backoff, Non-Burst and hardware duration */
335 if ((header
[6] & 0x1) == 0x1)
337 /* multicast frame : Set NO-ACK bit */
344 // Enable RTS according to MPDU Lengths ( not MSDU Lengths )
345 if (len
>= wd
->rtsThreshold
)
355 if (wd
->wlanMode
== ZM_MODE_AP
)
361 /* Check whether this is a multicast frame */
362 if ((header
[6] & 0x1) == 0x1)
364 /* multicast frame */
365 if (wd
->ap
.encryMode
[vap
] == ZM_TKIP
)
369 if(wd
->ap
.iv16
[vap
] == 0)
374 b1
= (u8_t
) (wd
->ap
.iv16
[vap
] >> 8);
375 b2
= (b1
| 0x20) & 0x7f;
376 header
[hlen
] = ((u16_t
)b2
<< 8) + b1
;
377 b1
= (u8_t
) wd
->ap
.iv16
[vap
];
378 b2
= 0x20 | (wd
->ap
.bcKeyIndex
[vap
] << 6);
379 header
[hlen
+1] = ((u16_t
)b2
<< 8) + b1
;
380 header
[hlen
+2] = (u16_t
) wd
->ap
.iv32
[vap
];
381 header
[hlen
+3] = (u16_t
) (wd
->ap
.iv32
[vap
] >> 16);
387 /* set hardware MIC */
388 if ( (!(seq
& 0xf))&&(!(flag
& 0x4)) )
398 else if (wd
->ap
.encryMode
[vap
] == ZM_AES
)
402 if(wd
->ap
.iv16
[vap
] == 0)
407 b1
= (u8_t
) wd
->ap
.iv16
[vap
];
408 b2
= (u8_t
) (wd
->ap
.iv16
[vap
] >> 8);
409 header
[hlen
] = ((u16_t
)b2
<< 8) + b1
;
410 header
[hlen
+1] = 0x2000 | (wd
->ap
.bcKeyIndex
[vap
] << 14);
411 header
[hlen
+2] = (u16_t
) (wd
->ap
.iv32
[vap
]);
412 header
[hlen
+3] = (u16_t
) (wd
->ap
.iv32
[vap
] >> 16);
415 icvLen
= 8; /* MIC */
420 #ifdef ZM_ENABLE_CENC
421 else if (wd
->ap
.encryMode
[vap
] == ZM_CENC
)
425 wd
->ap
.txiv
[vap
][0]++;
427 if (wd
->ap
.txiv
[vap
][0] == 0)
429 wd
->ap
.txiv
[vap
][1]++;
432 if (wd
->ap
.txiv
[vap
][1] == 0)
434 wd
->ap
.txiv
[vap
][2]++;
437 if (wd
->ap
.txiv
[vap
][2] == 0)
439 wd
->ap
.txiv
[vap
][3]++;
442 if (wd
->ap
.txiv
[vap
][3] == 0)
444 wd
->ap
.txiv
[vap
][0] = 0;
445 wd
->ap
.txiv
[vap
][1] = 0;
446 wd
->ap
.txiv
[vap
][2] = 0;
449 header
[hlen
] = (wd
->ap
.bcKeyIndex
[vap
] & 0x0001); /* For Key Id and reserved field */
450 header
[hlen
+1] = (u16_t
)wd
->ap
.txiv
[vap
][0];
451 header
[hlen
+2] = (u16_t
)(wd
->ap
.txiv
[vap
][0] >> 16);
452 header
[hlen
+3] = (u16_t
)wd
->ap
.txiv
[vap
][1];
453 header
[hlen
+4] = (u16_t
)(wd
->ap
.txiv
[vap
][1] >> 16);
454 header
[hlen
+5] = (u16_t
)wd
->ap
.txiv
[vap
][2];
455 header
[hlen
+6] = (u16_t
)(wd
->ap
.txiv
[vap
][2] >> 16);
456 header
[hlen
+7] = (u16_t
)wd
->ap
.txiv
[vap
][3];
457 header
[hlen
+8] = (u16_t
)(wd
->ap
.txiv
[vap
][3] >> 16);
460 icvLen
= 16; /* MIC */
465 #endif //ZM_ENABLE_CENC
469 /* Get STA's encryption type */
470 zfApGetStaEncryType(dev
, da
, &encryType
);
472 if (encryType
== ZM_TKIP
)
474 /* Get iv16 and iv32 */
475 zfApGetStaWpaIv(dev
, da
, &iv16
, &iv32
);
483 b1
= (u8_t
) (iv16
>> 8);
484 b2
= (b1
| 0x20) & 0x7f;
485 header
[hlen
] = ((u16_t
)b2
<< 8) + b1
;
488 header
[hlen
+1] = ((u16_t
)b2
<< 8) + b1
;
489 header
[hlen
+2] = (u16_t
) iv32
;
490 header
[hlen
+3] = (u16_t
) (iv32
>> 16);
496 /* set hardware MIC */
497 if ( (!(seq
& 0xf))&&(!(flag
& 0x4)) )
507 /* Set iv16 and iv32 */
508 zfApSetStaWpaIv(dev
, da
, iv16
, iv32
);
510 else if (encryType
== ZM_AES
)
512 /* Get iv16 and iv32 */
513 zfApGetStaWpaIv(dev
, da
, &iv16
, &iv32
);
522 b2
= (u8_t
) (iv16
>> 8);
523 header
[hlen
] = ((u16_t
)b2
<< 8) + b1
;
524 header
[hlen
+1] = 0x2000;
525 header
[hlen
+2] = (u16_t
) (iv32
);
526 header
[hlen
+3] = (u16_t
) (iv32
>> 16);
529 icvLen
= 8; /* MIC */
534 /* Set iv16 and iv32 */
535 zfApSetStaWpaIv(dev
, da
, iv16
, iv32
);
537 #ifdef ZM_ENABLE_CENC
538 else if (encryType
== ZM_CENC
)
544 zfApGetStaCencIvAndKeyIdx(dev
, da
, txiv
, &keyIdx
);
548 if (txiv
[0] == 0 || txiv
[0] == 1)
570 header
[hlen
] = (keyIdx
& 0x0001); /* For Key Id and reserved field */
571 header
[hlen
+1] = (u16_t
)txiv
[0];
572 header
[hlen
+2] = (u16_t
)(txiv
[0] >> 16);
573 header
[hlen
+3] = (u16_t
)txiv
[1];
574 header
[hlen
+4] = (u16_t
)(txiv
[1] >> 16);
575 header
[hlen
+5] = (u16_t
)txiv
[2];
576 header
[hlen
+6] = (u16_t
)(txiv
[2] >> 16);
577 header
[hlen
+7] = (u16_t
)txiv
[3];
578 header
[hlen
+8] = (u16_t
)(txiv
[3] >> 16);
581 icvLen
= 16; /* MIC */
587 zfApSetStaCencIv(dev
, da
, txiv
);
589 #endif //ZM_ENABLE_CENC
592 /* protection mode */
593 if (wd
->ap
.protectionMode
== 1)
595 /* Enable Self-CTS */
605 if ((wd
->ap
.encryMode
[vap
] == ZM_WEP64
) ||
606 (wd
->ap
.encryMode
[vap
] == ZM_WEP128
) ||
607 (wd
->ap
.encryMode
[vap
] == ZM_WEP256
))
610 header
[hlen
] = 0x0; //IV
611 header
[hlen
+1] = wd
->ap
.bcKeyIndex
[vap
] << 14; //IV with Keyid--CWYang(m)
621 /* TODO : Fixed rate to 54M */
622 phyCtrl
= 0xc0001; //PHY control L
624 /* WDS port checking */
625 if ((wdsPort
= (port
- 0x20)) >= ZM_MAX_WDS_SUPPORT
)
632 switch (wd
->ap
.wds
.encryMode
[wdsPort
])
638 header
[hlen
] = 0x0; //IV
639 header
[hlen
+1] = wd
->ap
.bcKeyIndex
[vap
] << 14; //IV with Keyid
648 if ( wd
->sta
.iv16
== 0 )
653 b1
= (u8_t
) (wd
->sta
.iv16
>> 8);
654 b2
= (b1
| 0x20) & 0x7f;
655 header
[hlen
] = ((u16_t
)b2
<< 8) + b1
;
656 b1
= (u8_t
) wd
->sta
.iv16
;
658 header
[hlen
+1] = ((u16_t
)b2
<< 8) + b1
;
659 header
[hlen
+2] = (u16_t
) wd
->sta
.iv32
;
660 header
[hlen
+3] = (u16_t
) (wd
->sta
.iv32
>> 16);
666 /* set hardware MIC */
667 if ( (!(seq
& 0xf))&&(!(flag
& 0x4)) )
680 if ( wd
->sta
.iv16
== 0 )
685 b1
= (u8_t
) wd
->sta
.iv16
;
686 b2
= (u8_t
) (wd
->sta
.iv16
>> 8);
687 header
[hlen
] = ((u16_t
)b2
<< 8) + b1
;
688 header
[hlen
+1] = 0x2000;
689 header
[hlen
+2] = (u16_t
) (wd
->sta
.iv32
);
690 header
[hlen
+3] = (u16_t
) (wd
->sta
.iv32
>> 16);
692 macCtrl
|= 0xc0; /* Set to AES in control setting */
693 icvLen
= 8; /* MIC */
695 header
[4] |= 0x4000; /* Set WEP bit in wlan header */
696 hlen
+= 4; /* plus IV length */
702 else /* wd->wlanMode != ZM_MODE_AP */
704 encExemptionActionType
= zfwGetPktEncExemptionActionType(dev
, buf
);
706 if ( wd
->wlanMode
== ZM_MODE_INFRASTRUCTURE
)
710 if (wd
->sta
.wmeConnected
!= 0)
721 if ( encExemptionActionType
== ZM_ENCRYPTION_EXEMPT_NO_EXEMPTION
)
723 if ( wd
->sta
.authMode
< ZM_AUTH_MODE_WPA
)
725 if ( wd
->sta
.wepStatus
== ZM_ENCRYPTION_WEP_ENABLED
)
727 if ( (wd
->sta
.encryMode
== ZM_WEP64
)||
728 (wd
->sta
.encryMode
== ZM_WEP128
)||
729 (wd
->sta
.encryMode
== ZM_WEP256
) )
732 header
[hlen
] = 0x0; //IV
733 header
[hlen
+1] = 0x0; //IV
734 header
[hlen
+1] |= (((u16_t
) wd
->sta
.keyId
) << 14);
738 /* For Software WEP */
739 if ((wd
->sta
.SWEncryptEnable
& ZM_SW_WEP_ENCRY_EN
) != 0)
748 if (wd
->sta
.SWEncryMode
[wd
->sta
.keyId
] == ZM_WEP64
)
752 else if (wd
->sta
.SWEncryMode
[wd
->sta
.keyId
] == ZM_WEP128
)
756 else if (wd
->sta
.SWEncryMode
[wd
->sta
.keyId
] == ZM_WEP256
)
761 zfWEPEncrypt(dev
, buf
, (u8_t
*) snap
, snapLen
, minusLen
, keyLen
,
762 wd
->sta
.wepKey
[wd
->sta
.keyId
], iv
);
773 if ( wd
->sta
.wpaState
>= ZM_STA_WPA_STATE_PK_OK
)
776 if ( wd
->sta
.iv16
== 0 )
781 /* set encryption mode */
782 if ( wd
->sta
.encryMode
== ZM_TKIP
)
784 b1
= (u8_t
) (wd
->sta
.iv16
>> 8);
785 b2
= (b1
| 0x20) & 0x7f;
786 header
[hlen
] = ((u16_t
)b2
<< 8) + b1
;
787 b1
= (u8_t
) wd
->sta
.iv16
;
790 // header[hlen+1] = (((u16_t) wd->sta.keyId) << 14) | (((u16_t)b2 << 8) + b1);
791 // STA in infrastructure mode should use keyId = 0 to transmit unicast !
792 header
[hlen
+1] = (((u16_t
)b2
<< 8) + b1
);
793 header
[hlen
+2] = (u16_t
) wd
->sta
.iv32
;
794 header
[hlen
+3] = (u16_t
) (wd
->sta
.iv32
>> 16);
796 /* If software encryption enable */
797 if ((wd
->sta
.SWEncryptEnable
& ZM_SW_TKIP_ENCRY_EN
) == 0)
800 /* TKIP same to WEP */
804 /* set hardware MIC */
805 if ( (!(seq
& 0xf))&&(!(flag
& 0x4)) )
819 /* TODO: Remove the criticial section here. */
820 zmw_declare_for_critical_section();
822 zmw_enter_critical_section(dev
);
824 zfCalTxMic(dev
, buf
, (u8_t
*)snap
, snapLen
, minusLen
, da
, sa
, up
, mic
);
826 offset
= zfwBufGetSize(dev
, buf
);
828 /* Append MIC to the buffer */
829 zfCopyToIntTxBuffer(dev
, buf
, mic
, offset
, 8);
830 zfwBufSetSize(dev
, buf
, offset
+8);
831 zmw_leave_critical_section(dev
);
833 /* TKIP Key Mixing */
834 zfTkipPhase1KeyMix(wd
->sta
.iv32
, &wd
->sta
.txSeed
);
835 zfTkipPhase2KeyMix(wd
->sta
.iv16
, &wd
->sta
.txSeed
);
836 zfTkipGetseeds(wd
->sta
.iv16
, RC4Key
, &wd
->sta
.txSeed
);
839 zfTKIPEncrypt(dev
, buf
, (u8_t
*)snap
, snapLen
, minusLen
, 16, RC4Key
, &icv
);
848 else if ( wd
->sta
.encryMode
== ZM_AES
)
850 b1
= (u8_t
) wd
->sta
.iv16
;
851 b2
= (u8_t
) (wd
->sta
.iv16
>> 8);
852 header
[hlen
] = ((u16_t
)b2
<< 8) + b1
;
853 // header[hlen+1] = (((u16_t) wd->sta.keyId) << 14) | (0x2000);
854 // STA in infrastructure mode should use keyId = 0 to transmit unicast !
855 header
[hlen
+1] = 0x2000;
856 header
[hlen
+2] = (u16_t
) (wd
->sta
.iv32
);
857 header
[hlen
+3] = (u16_t
) (wd
->sta
.iv32
>> 16);
860 icvLen
= 8; /* MIC */
865 #ifdef ZM_ENABLE_CENC
866 else if ( wd
->sta
.encryMode
== ZM_CENC
)
868 /* Accumlate the PN sequence */
869 wd
->sta
.txiv
[0] += 2;
871 if (wd
->sta
.txiv
[0] == 0 || wd
->sta
.txiv
[0] == 1)
876 if (wd
->sta
.txiv
[1] == 0)
881 if (wd
->sta
.txiv
[2] == 0)
886 if (wd
->sta
.txiv
[3] == 0)
893 header
[hlen
] = (wd
->sta
.cencKeyId
& 0x0001); /* For Key Id and reserved field */
894 header
[hlen
+1] = (u16_t
) wd
->sta
.txiv
[0];
895 header
[hlen
+2] = (u16_t
) (wd
->sta
.txiv
[0] >> 16);
896 header
[hlen
+3] = (u16_t
) wd
->sta
.txiv
[1];
897 header
[hlen
+4] = (u16_t
) (wd
->sta
.txiv
[1] >> 16);
898 header
[hlen
+5] = (u16_t
) wd
->sta
.txiv
[2];
899 header
[hlen
+6] = (u16_t
) (wd
->sta
.txiv
[2] >> 16);
900 header
[hlen
+7] = (u16_t
) wd
->sta
.txiv
[3];
901 header
[hlen
+8] = (u16_t
) (wd
->sta
.txiv
[3] >> 16);
904 icvLen
= 16; /* MIC */
909 #endif //ZM_ENABLE_CENC
912 } // if ( encExemptionActionType == ZM_ENCRYPTION_EXEMPT_NO_EXEMPTION )
913 } /* if ( wd->wlanMode != ZM_MODE_INFRASTRUCTURE ) */
915 if ( wd
->wlanMode
== ZM_MODE_IBSS
)
917 if ( encExemptionActionType
== ZM_ENCRYPTION_EXEMPT_NO_EXEMPTION
)
919 #ifdef ZM_ENABLE_IBSS_WPA2PSK
920 if( wd
->sta
.oppositeInfo
[userIdx
].wpaState
>= ZM_STA_WPA_STATE_PK_OK
|| wd
->sta
.wpaState
>= ZM_STA_WPA_STATE_PK_OK
)
926 isUnicast
= 0 ; // Not unicast , is broadcast
929 if( wd
->sta
.ibssWpa2Psk
== 1 )
930 { /* The IV order is not the same between unicast and broadcast ! */
933 iv16
= &wd
->sta
.oppositeInfo
[userIdx
].iv16
;
934 iv32
= &wd
->sta
.oppositeInfo
[userIdx
].iv32
;
938 iv16
= &wd
->sta
.iv16
;
939 iv32
= &wd
->sta
.iv32
;
944 iv16
= &wd
->sta
.iv16
;
945 iv32
= &wd
->sta
.iv32
;
954 if ( wd
->sta
.oppositeInfo
[userIdx
].encryMode
== ZM_AES
|| wd
->sta
.encryMode
== ZM_AES
)
956 //printk("Station encryption mode is AES-CCMP\n") ;
958 b2
= (u8_t
) ((*iv16
) >> 8);
959 header
[hlen
] = ((u16_t
)b2
<< 8) + b1
;
963 header
[hlen
+1] = 0x2000;
967 header
[hlen
+1] = 0x2000 | (((u16_t
) wd
->sta
.keyId
) << 14);
970 header
[hlen
+2] = (u16_t
) (*iv32
);
971 header
[hlen
+3] = (u16_t
) ((*iv32
) >> 16);
973 icvLen
= 8; /* MIC */
979 else if ( wd
->sta
.wepStatus
== ZM_ENCRYPTION_WEP_ENABLED
)
981 if ( (wd
->sta
.encryMode
== ZM_WEP64
)||
982 (wd
->sta
.encryMode
== ZM_WEP128
)||
983 (wd
->sta
.encryMode
== ZM_WEP256
) )
986 header
[hlen
] = 0x0; //IV
987 header
[hlen
+1] = 0x0; //IV
988 header
[hlen
+1] |= (((u16_t
) wd
->sta
.keyId
) << 14);
995 /* ----- 20070405 add by Mxzeng ----- */
996 if( wd
->sta
.wpaState
>= ZM_STA_WPA_STATE_PK_OK
)
1002 isUnicast
= 0 ; // Not unicast , is broadcast
1006 if ( wd
->sta
.iv16
== 0 )
1011 if ( wd
->sta
.encryMode
== ZM_AES
)
1013 //printk("Station encryption mode is AES-CCMP\n") ;
1014 b1
= (u8_t
) wd
->sta
.iv16
;
1015 b2
= (u8_t
) (wd
->sta
.iv16
>> 8);
1016 header
[hlen
] = ((u16_t
)b2
<< 8) + b1
;
1020 header
[hlen
+1] = 0x2000;
1024 header
[hlen
+1] = 0x2000 | (((u16_t
) wd
->sta
.keyId
) << 14);
1027 header
[hlen
+2] = (u16_t
) (wd
->sta
.iv32
);
1028 header
[hlen
+3] = (u16_t
) (wd
->sta
.iv32
>> 16);
1030 icvLen
= 8; /* MIC */
1033 header
[4] |= 0x4000;
1036 else if ( wd
->sta
.wepStatus
== ZM_ENCRYPTION_WEP_ENABLED
)
1038 if ( (wd
->sta
.encryMode
== ZM_WEP64
)||
1039 (wd
->sta
.encryMode
== ZM_WEP128
)||
1040 (wd
->sta
.encryMode
== ZM_WEP256
) )
1042 header
[4] |= 0x4000;
1043 header
[hlen
] = 0x0; //IV
1044 header
[hlen
+1] = 0x0; //IV
1045 header
[hlen
+1] |= (((u16_t
) wd
->sta
.keyId
) << 14);
1052 } // End if ( encExemptionActionType == ZM_ENCRYPTION_EXEMPT_NO_EXEMPTION )
1053 } // End if ( wd->wlanMode == ZM_MODE_IBSS )
1054 else if ( wd
->wlanMode
== ZM_MODE_PSEUDO
)
1056 switch (wd
->sta
.encryMode
)
1061 header
[4] |= 0x4000;
1062 header
[hlen
] = 0x0; //IV
1063 header
[hlen
+1] = 0x0; //IV
1072 if ( wd
->sta
.iv16
== 0 )
1077 b1
= (u8_t
) (wd
->sta
.iv16
>> 8);
1078 b2
= (b1
| 0x20) & 0x7f;
1079 header
[hlen
] = ((u16_t
)b2
<< 8) + b1
;
1080 b1
= (u8_t
) wd
->sta
.iv16
;
1082 header
[hlen
+1] = ((u16_t
)b2
<< 8) + b1
;
1083 header
[hlen
+2] = (u16_t
) wd
->sta
.iv32
;
1084 header
[hlen
+3] = (u16_t
) (wd
->sta
.iv32
>> 16);
1090 /* set hardware MIC */
1091 if ( (!(seq
& 0xf))&&(!(flag
& 0x4)) )
1098 header
[4] |= 0x4000;
1100 }/* end of PSEUDO TKIP */
1106 if ( wd
->sta
.iv16
== 0 )
1111 b1
= (u8_t
) wd
->sta
.iv16
;
1112 b2
= (u8_t
) (wd
->sta
.iv16
>> 8);
1113 header
[hlen
] = ((u16_t
)b2
<< 8) + b1
;
1114 header
[hlen
+1] = 0x2000;
1115 header
[hlen
+2] = (u16_t
) (wd
->sta
.iv32
);
1116 header
[hlen
+3] = (u16_t
) (wd
->sta
.iv32
>> 16);
1118 icvLen
= 8; /* MIC */
1119 header
[4] |= 0x4000;
1121 }/* end of PSEUDO AES */
1124 #ifdef ZM_ENABLE_CENC
1126 /* Accumlate the PN sequence */
1127 wd
->sta
.txiv
[0] += 2;
1129 if (wd
->sta
.txiv
[0] == 0 || wd
->sta
.txiv
[0] == 1)
1134 if (wd
->sta
.txiv
[1] == 0)
1139 if (wd
->sta
.txiv
[2] == 0)
1144 if (wd
->sta
.txiv
[3] == 0)
1146 wd
->sta
.txiv
[0] = 0;
1147 wd
->sta
.txiv
[1] = 0;
1148 wd
->sta
.txiv
[2] = 0;
1152 header
[hlen
+1] = (u16_t
) wd
->sta
.txiv
[0];
1153 header
[hlen
+2] = (u16_t
) (wd
->sta
.txiv
[0] >> 16);
1154 header
[hlen
+3] = (u16_t
) wd
->sta
.txiv
[1];
1155 header
[hlen
+4] = (u16_t
) (wd
->sta
.txiv
[1] >> 16);
1156 header
[hlen
+5] = (u16_t
) wd
->sta
.txiv
[2];
1157 header
[hlen
+6] = (u16_t
) (wd
->sta
.txiv
[2] >> 16);
1158 header
[hlen
+7] = (u16_t
) wd
->sta
.txiv
[3];
1159 header
[hlen
+8] = (u16_t
) (wd
->sta
.txiv
[3] >> 16);
1162 icvLen
= 16; /* MIC */
1164 header
[4] |= 0x4000;
1167 #endif //ZM_ENABLE_CENC
1168 }/* end of switch */
1171 /* Generate control setting */
1173 /* protection mode */
1174 if (wd
->enableProtectionMode
)
1176 if (wd
->enableProtectionMode
==2)
1178 /* Force enable protection: self cts */
1182 /* if wd->enableProtectionMode=1 => force disable */
1183 /* if wd->enableProtectionMode=0 => auto */
1188 /* protection mode */
1189 if (wd
->sta
.bProtectionMode
== TRUE
)
1191 /* Enable Self-CTS */
1199 if (wd
->txMCS
!= 0xff)
1202 phyCtrl
= ((u32_t
)wd
->txMCS
<<16) + wd
->txMT
;
1210 /* HT PT: 0 Mixed mode 1 Green field */
1211 if (wd
->sta
.preambleTypeHT
== ZM_PREAMBLE_TYPE_GREEN_FIELD
)
1213 phyCtrl
|= 0x4; /* Bit 2 */
1217 if (wd
->sta
.htCtrlBandwidth
== ZM_BANDWIDTH_40MHZ
)
1219 phyCtrl
|= (0x80<<16); /* BIT 23 */
1223 if (wd
->sta
.htCtrlSTBC
<=0x3)
1225 phyCtrl
|= (wd
->sta
.htCtrlSTBC
<<28); /* BIT 23 */
1229 if(wd
->sta
.htCtrlSG
)
1231 phyCtrl
|= (0x8000<<16); /* BIT 31 */
1235 if ( ((mcs
>=0x8) && (mcs
<=0xf)) || (wd
->sta
.htCtrlSTBC
) )
1237 phyCtrl
|= 0x1800; /* BIT 11 12 */
1243 //bug that cause OFDM rate become duplicate legacy rate
1245 if (wd
->sta
.htCtrlBandwidth
== ZM_BANDWIDTH_40MHZ
)
1247 phyCtrl
|= (0x80<<16); /* BIT 23 */
1248 mt
= 3; /* duplicate legacy */
1255 /* CCK PT: Legcy Preamble: 1 long preamble 2 short preamble */
1256 if (wd
->preambleTypeInUsed
== ZM_PREAMBLE_TYPE_SHORT
)
1258 //phyCtrl |= 0x4; /* BIT 2 */
1263 if (wd
->sta
.defaultTA
)
1272 //Get CurrentTxRate -- CWYang(+)
1273 if ((mt
== 0) || (mt
== 1)) //B,G Rate
1277 wd
->CurrentTxRateKbps
= zcIndextoRateBG
[mcs
];
1284 if (wd
->sta
.htCtrlBandwidth
== ZM_BANDWIDTH_40MHZ
)
1286 if((phyCtrl
& 0x80000000) != 0)
1288 /* Short GI 40 MHz MIMO Rate */
1289 wd
->CurrentTxRateKbps
= zcIndextoRateN40S
[mcs
];
1293 /* Long GI 40 MHz MIMO Rate */
1294 wd
->CurrentTxRateKbps
= zcIndextoRateN40L
[mcs
];
1299 if((phyCtrl
& 0x80000000) != 0)
1301 /* Short GI 20 MHz MIMO Rate */
1302 wd
->CurrentTxRateKbps
= zcIndextoRateN20S
[mcs
];
1306 /* Long GI 20 MHz MIMO Rate */
1307 wd
->CurrentTxRateKbps
= zcIndextoRateN20L
[mcs
];
1313 //802.11 header(include IV) = (hlen<<1)-8
1314 //ethernet frame = len
1315 //snap + mic = plusLen
1316 //ethernet header = minusLen
1319 //length=802.11 header+snap+(ethernet frame-ethernet header)+mic+icv+crc32
1320 header
[0] = ((hlen
<<1)-8)+plusLen
+(len
-minusLen
)+icvLen
+4; //Length
1322 // header[0] : MPDU Lengths
1323 if ((header
[6] & 0x1) != 0x1) // Unicast Frame
1325 if (header
[0] >= wd
->rtsThreshold
)
1332 if ( wd
->sta
.encryMode
== ZM_TKIP
)
1333 tkipFrameOffset
= 8;
1335 if( wd
->sta
.EnableHT
!= 1 )
1336 { // Aggregation should not be fragmented !
1337 if ( header
[0] > ( wd
->fragThreshold
+ tkipFrameOffset
) )
1339 return 0; // Need to be fragmented ! !
1343 //if ( wd->sta.encryMode == ZM_TKIP )
1345 // zm_debug_msg1("ctrl length = ", header[0]);
1349 if (rateProbingFlag
!= 0)
1353 header
[1] = macCtrl
;
1355 header
[2] = (u16_t
) ((phyCtrl
&0xffff) | 0x700 | (zcUpToAc
[up
&0x7]<<13));
1357 header
[3] = (u16_t
) ((phyCtrl
>>16) | 0x700);
1359 if (wd
->enableAggregation
)
1361 /* force enable aggregation */
1362 if (wd
->enableAggregation
==2 && !(header
[6]&0x1))
1364 if (((header
[2] & 0x3) == 2))
1366 /* Enable aggregation */
1370 /* if wd->enableAggregation=1 => force disable */
1371 /* if wd->enableAggregation=0 => auto */
1374 #ifdef ZM_ENABLE_AGGREGATION
1375 if (wd
->addbaComplete
) {
1376 #ifdef ZM_BYPASS_AGGR_SCHEDULING
1377 if (!(header
[6]&0x1) && !rateProbingFlag
&& (wd
->enableAggregation
!= 1))
1379 if (((header
[2] & 0x3) == 2))
1381 /* Unicast frame with HT rate => Enable aggregation */
1382 /* We only support software encryption in single packet mode */
1383 if ((wd
->sta
.SWEncryptEnable
& ZM_SW_TKIP_ENCRY_EN
) == 0 &&
1384 (wd
->sta
.SWEncryptEnable
& ZM_SW_WEP_ENCRY_EN
) == 0)
1386 /* Set aggregation group bits per AC */
1387 header
[1] |= (0x20 | (zcUpToAc
[up
&0x7]<<10));
1389 //if (wd->sta.currentFrequency < 3000)
1391 /* issue: -PB42 Enable RTS/CTS to prevent OWL Tx hang up */
1392 /* If this is Owl Ap, enable RTS/CTS protect */
1393 if ( (wd
->sta
.athOwlAp
== 1) || (wd
->sta
.RTSInAGGMode
== TRUE
) )
1395 header
[1] &= 0xfffc;
1399 /* Enable RIFS : workaround 854T RTS/CTS */
1400 /* Bit13 : TI enable RIFS */
1401 //header[1] |= 0x2000;
1408 * aggregation ampduIndication control
1410 if (aggControl
&& aggControl
->aggEnabled
) {
1411 if (wd
->enableAggregation
==0 && !(header
[6]&0x1))
1413 if (((header
[2] & 0x3) == 2))
1415 /* Enable aggregation */
1417 if (ZM_AGG_LAST_MPDU
== aggControl
->ampduIndication
)
1418 header
[1] |= 0x4000;
1421 zm_debug_msg1("no aggr, header[2]&0x3 = ",header
[2] & 0x3)
1422 aggControl
->aggEnabled
= 0;
1426 zm_debug_msg1("no aggr, wd->enableAggregation = ", wd
->enableAggregation
);
1427 zm_debug_msg1("no aggr, !header[6]&0x1 = ",!(header
[6]&0x1));
1428 aggControl
->aggEnabled
= 0;
1433 #ifdef ZM_AGGR_BIT_ON
1434 if (!(header
[6]&0x1) && !rateProbingFlag
)
1436 if (((header
[2] & 0x3) == 2))
1438 /* Unicast frame with HT rate => Enable aggregation */
1439 /* Set aggregation group bits per AC */
1440 header
[1] |= (0x20 | (zcUpToAc
[up
&0x7]<<10));
1442 //if (wd->sta.currentFrequency < 3000)
1444 /* Enable RTS/CTS to prevent OWL Tx hang up */
1445 header
[1] &= 0xfffc;
1458 u16_t
zfTxGenMmHeader(zdev_t
* dev
, u8_t frameType
, u16_t
* dst
,
1459 u16_t
* header
, u16_t len
, zbuf_t
* buf
, u16_t vap
, u8_t encrypt
)
1462 u8_t hlen
= 32; // MAC ctrl + PHY ctrl + 802.11 MM header
1464 zmw_get_wlan_dev(dev
);
1466 zmw_declare_for_critical_section();
1468 /* Generate control setting */
1469 //bodyLen = zfwBufGetSize(dev, buf);
1470 header
[0] = 24+len
+4; //Length
1471 if ((dst
[0] & 0x1) != 0) //Broadcast, multicast frames
1473 header
[1] = 0xc; //MAC control, backoff + noack
1477 header
[1] = 0x8; //MAC control, backoff + (ack)
1479 /* Dualband Management frame tx Rate */
1480 if (wd
->wlanMode
== ZM_MODE_AP
)
1482 if (wd
->frequency
< 3000)
1485 header
[2] = 0x0f00; //PHY control L
1486 header
[3] = 0x0000; //PHY control H
1491 header
[2] = 0x0f01; //PHY control L
1492 header
[3] = 0x000B; //PHY control H
1497 if (wd
->sta
.currentFrequency
< 3000)
1500 header
[2] = 0x0f00; //PHY control L
1501 header
[3] = 0x0001; //PHY control H
1506 header
[2] = 0x0f01; //PHY control L
1507 header
[3] = 0x000B; //PHY control H
1510 /* Generate WLAN header */
1512 header
[4+0] = frameType
;
1516 if (wd
->wlanMode
== ZM_MODE_INFRASTRUCTURE
)
1518 if ( frameType
== ZM_WLAN_FRAME_TYPE_PROBEREQ
)
1520 header
[4+8] = 0xFFFF;
1521 header
[4+9] = 0xFFFF;
1522 header
[4+10] = 0xFFFF;
1524 else if ( frameType
== ZM_WLAN_FRAME_TYPE_BA
) {
1529 header
[4+8] = wd
->sta
.bssid
[0];
1530 header
[4+9] = wd
->sta
.bssid
[1];
1531 header
[4+10] = wd
->sta
.bssid
[2];
1534 else if (wd
->wlanMode
== ZM_MODE_PSEUDO
)
1536 /* Address 3 = 00:00:00:00:00:00 */
1541 else if (wd
->wlanMode
== ZM_MODE_IBSS
)
1543 header
[4+8] = wd
->sta
.bssid
[0];
1544 header
[4+9] = wd
->sta
.bssid
[1];
1545 header
[4+10] = wd
->sta
.bssid
[2];
1547 if ( frameType
== ZM_WLAN_FRAME_TYPE_ATIM
)
1549 /* put ATIM to queue 5th */
1550 //header[2] |= (ZM_BIT_13|ZM_BIT_14);
1551 header
[2] |= ZM_BIT_15
;
1554 else if (wd
->wlanMode
== ZM_MODE_AP
)
1556 /* Address 3 = BSSID */
1557 header
[4+8] = wd
->macAddr
[0];
1558 header
[4+9] = wd
->macAddr
[1];
1559 #ifdef ZM_VAPMODE_MULTILE_SSID
1560 header
[4+10] = wd
->macAddr
[2]; //Multiple SSID
1562 header
[4+10] = wd
->macAddr
[2] + (vap
<<8); //VAP
1564 //if in scan, must set address 3 to broadcast because of some ap would care this
1565 //if ((wd->heartBeatNotification & ZM_BSSID_LIST_SCAN)
1566 // == ZM_BSSID_LIST_SCAN)
1567 //if FrameType is Probe Request, Address3 should be boradcast
1568 if (frameType
== ZM_WLAN_FRAME_TYPE_PROBEREQ
)
1570 header
[4+8] = 0xFFFF;
1571 header
[4+9] = 0xFFFF;
1572 header
[4+10] = 0xFFFF;
1576 /* Address 1 = DA */
1577 header
[4+2] = dst
[0];
1578 header
[4+3] = dst
[1];
1579 header
[4+4] = dst
[2];
1581 /* Address 2 = SA */
1582 header
[4+5] = wd
->macAddr
[0];
1583 header
[4+6] = wd
->macAddr
[1];
1584 if (wd
->wlanMode
== ZM_MODE_AP
)
1586 #ifdef ZM_VAPMODE_MULTILE_SSID
1587 header
[4+7] = wd
->macAddr
[2]; //Multiple SSID
1589 header
[4+7] = wd
->macAddr
[2] + (vap
<<8); //VAP
1594 header
[4+7] = wd
->macAddr
[2];
1597 /* Sequence Control */
1598 zmw_enter_critical_section(dev
);
1599 header
[4+11] = ((wd
->mmseq
++)<<4);
1600 zmw_leave_critical_section(dev
);
1602 if( frameType
== ZM_WLAN_FRAME_TYPE_QOS_NULL
)
1612 if ( wd
->sta
.wepStatus
== ZM_ENCRYPTION_WEP_ENABLED
)
1614 if ( (wd
->sta
.encryMode
== ZM_WEP64
)||
1615 (wd
->sta
.encryMode
== ZM_WEP128
)||
1616 (wd
->sta
.encryMode
== ZM_WEP256
) )
1618 header
[4] |= 0x4000;
1619 header
[16] = 0x0; //IV
1620 header
[17] = 0x0; //IV
1621 header
[17] |= (((u16_t
) wd
->sta
.keyId
) << 14);
1624 header
[0] += 8; // icvLen = 4;
1625 header
[1] |= 0x40; // enable encryption on macCtrl
1630 // Enable HW duration
1631 if ( frameType
!= ZM_WLAN_FRAME_TYPE_PSPOLL
)
1639 void zfInitMacApMode(zdev_t
* dev
)
1643 zmw_get_wlan_dev(dev
);
1645 zfHpEnableBeacon(dev
, ZM_MODE_AP
, (wd
->beaconInterval
/wd
->ap
.vapNumber
), 1, 0);
1648 zfHpSetApStaMode(dev
, ZM_HAL_80211_MODE_AP
);
1652 if (wd
->ap
.vapNumber
>= 2)
1654 for (i
=1; i
<ZM_MAX_AP_SUPPORT
; i
++)
1656 if (((wd
->ap
.apBitmap
>> i
) & 0x1) != 0)
1659 mac
[0] = wd
->macAddr
[0];
1660 mac
[1] = wd
->macAddr
[1];
1661 #ifdef ZM_VAPMODE_MULTILE_SSID
1662 mac
[2] = wd
->macAddr
[2]; //Multiple SSID
1664 mac
[2] = wd
->macAddr
[2] + (i
<<8); //VAP
1666 zfHpSetMacAddress(dev
, mac
, i
);
1672 /* basic rate setting */
1673 zfHpSetBasicRateSet(dev
, wd
->bRateBasic
, wd
->gRateBasic
);
1675 /* Set TxQs CWMIN, CWMAX, AIFS and TXO to WME AP default. */
1676 zfUpdateDefaultQosParameter(dev
, 1);
1681 u16_t
zfChGetNextChannel(zdev_t
* dev
, u16_t frequency
, u8_t
* pbPassive
)
1686 zmw_get_wlan_dev(dev
);
1688 /* Avoid NULL value */
1689 if ( pbPassive
== NULL
)
1691 pbPassive
= &bPassive
;
1694 for( i
=0; i
<wd
->regulationTable
.allowChannelCnt
; i
++ )
1696 if ( wd
->regulationTable
.allowChannel
[i
].channel
== frequency
)
1698 if ( i
== (wd
->regulationTable
.allowChannelCnt
-1) )
1707 if ( wd
->regulationTable
.allowChannel
[i
].channelFlags
1708 & ZM_REG_FLAG_CHANNEL_PASSIVE
)
1717 return wd
->regulationTable
.allowChannel
[i
].channel
;
1724 u16_t
zfChGetFirstChannel(zdev_t
* dev
, u8_t
* pbPassive
)
1728 zmw_get_wlan_dev(dev
);
1730 /* Avoid NULL value */
1731 if ( pbPassive
== NULL
)
1733 pbPassive
= &bPassive
;
1736 if ( wd
->regulationTable
.allowChannel
[0].channelFlags
& ZM_REG_FLAG_CHANNEL_PASSIVE
)
1745 return wd
->regulationTable
.allowChannel
[0].channel
;
1748 u16_t
zfChGetFirst2GhzChannel(zdev_t
* dev
)
1752 zmw_get_wlan_dev(dev
);
1754 for( i
=0; i
<wd
->regulationTable
.allowChannelCnt
; i
++ )
1756 if ( wd
->regulationTable
.allowChannel
[i
].channel
< 3000 )
1758 /* find the first 2Ghz channel */
1759 return wd
->regulationTable
.allowChannel
[i
].channel
;
1763 /* Can not find any 2Ghz channel */
1767 u16_t
zfChGetFirst5GhzChannel(zdev_t
* dev
)
1771 zmw_get_wlan_dev(dev
);
1773 for( i
=0; i
<wd
->regulationTable
.allowChannelCnt
; i
++ )
1775 if ( wd
->regulationTable
.allowChannel
[i
].channel
> 3000 )
1777 /* find the first 5Ghz channel */
1778 return wd
->regulationTable
.allowChannel
[i
].channel
;
1782 /* Can not find any 5Ghz channel */
1786 u16_t
zfChGetLastChannel(zdev_t
* dev
, u8_t
* pbPassive
)
1791 zmw_get_wlan_dev(dev
);
1793 ChannelIndex
= wd
->regulationTable
.allowChannelCnt
-1;
1795 /* Avoid NULL value */
1796 if ( pbPassive
== NULL
)
1798 pbPassive
= &bPassive
;
1801 if ( wd
->regulationTable
.allowChannel
[ChannelIndex
].channelFlags
1802 & ZM_REG_FLAG_CHANNEL_PASSIVE
)
1811 return wd
->regulationTable
.allowChannel
[ChannelIndex
].channel
;
1814 u16_t
zfChGetLast5GhzChannel(zdev_t
* dev
)
1817 u16_t last5Ghzfrequency
;
1819 zmw_get_wlan_dev(dev
);
1821 last5Ghzfrequency
= 0;
1822 for( i
=0; i
<wd
->regulationTable
.allowChannelCnt
; i
++ )
1824 if ( wd
->regulationTable
.allowChannel
[i
].channel
> 3000 )
1826 last5Ghzfrequency
= wd
->regulationTable
.allowChannel
[i
].channel
;
1830 return last5Ghzfrequency
;
1833 /* freqBand = 0 => auto check */
1834 /* = 1 => 2.4 GHz band */
1835 /* = 2 => 5 GHz band */
1836 u16_t
zfChNumToFreq(zdev_t
* dev
, u8_t ch
, u8_t freqBand
)
1838 u16_t freq
= 0xffff;
1840 if ( freqBand
== 0 )
1843 { /* adapter is at 5 GHz band */
1852 if ( freqBand
== 2 )
1853 { /* the channel belongs to 5 GHz band */
1854 if ( (ch
>= 184)&&(ch
<= 196) )
1864 { /* the channel belongs to 2.4 GHz band */
1871 freq
= ZM_CH_G_1
+ (ch
-1)*5;
1878 u8_t
zfChFreqToNum(u16_t freq
, u8_t
* pbIs5GBand
)
1883 /* to avoid NULL value */
1884 if ( pbIs5GBand
== NULL
)
1886 pbIs5GBand
= &Is5GBand
;
1889 *pbIs5GBand
= FALSE
;
1891 if ( freq
== ZM_CH_G_14
)
1895 else if ( freq
< 4000 )
1897 ch
= (freq
- ZM_CH_G_1
) / 5 + 1;
1899 else if ( freq
< 5000 )
1901 ch
= (freq
- 4000) / 5;
1906 ch
= (freq
- 5000) / 5;