diff options
Diffstat (limited to 'drivers/staging/vt6656')
63 files changed, 3590 insertions, 22379 deletions
diff --git a/drivers/staging/vt6656/80211hdr.h b/drivers/staging/vt6656/80211hdr.h deleted file mode 100644 index 1e778ba7c634..000000000000 --- a/drivers/staging/vt6656/80211hdr.h +++ /dev/null @@ -1,324 +0,0 @@ -/* - * Copyright (c) 1996, 2003 VIA Networking Technologies, Inc. - * All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - * - * File: 80211hdr.h - * - * Purpose: 802.11 MAC headers related pre-defines and macros. - * - * Author: Lyndon Chen - * - * Date: Apr 8, 2002 - */ - -#ifndef __80211HDR_H__ -#define __80211HDR_H__ - -/* bit type */ -#define BIT0 0x00000001 -#define BIT1 0x00000002 -#define BIT2 0x00000004 -#define BIT3 0x00000008 -#define BIT4 0x00000010 -#define BIT5 0x00000020 -#define BIT6 0x00000040 -#define BIT7 0x00000080 -#define BIT8 0x00000100 -#define BIT9 0x00000200 -#define BIT10 0x00000400 -#define BIT11 0x00000800 -#define BIT12 0x00001000 -#define BIT13 0x00002000 -#define BIT14 0x00004000 -#define BIT15 0x00008000 -#define BIT16 0x00010000 -#define BIT17 0x00020000 -#define BIT18 0x00040000 -#define BIT19 0x00080000 -#define BIT20 0x00100000 -#define BIT21 0x00200000 -#define BIT22 0x00400000 -#define BIT23 0x00800000 -#define BIT24 0x01000000 -#define BIT25 0x02000000 -#define BIT26 0x04000000 -#define BIT27 0x08000000 -#define BIT28 0x10000000 -#define BIT29 0x20000000 -#define BIT30 0x40000000 -#define BIT31 0x80000000 - -/* 802.11 frame related, defined as 802.11 spec */ -#define WLAN_ADDR_LEN 6 -#define WLAN_CRC_LEN 4 -#define WLAN_CRC32_LEN 4 -#define WLAN_FCS_LEN 4 -#define WLAN_BSSID_LEN 6 -#define WLAN_BSS_TS_LEN 8 -#define WLAN_HDR_ADDR2_LEN 16 -#define WLAN_HDR_ADDR3_LEN 24 -#define WLAN_HDR_ADDR4_LEN 30 -#define WLAN_IEHDR_LEN 2 -#define WLAN_SSID_MAXLEN 32 -#define WLAN_RATES_MAXLEN 16 -#define WLAN_RATES_MAXLEN_11B 4 -#define WLAN_RSN_MAXLEN 32 -#define WLAN_DATA_MAXLEN 2312 -#define WLAN_A3FR_MAXLEN (WLAN_HDR_ADDR3_LEN \ - + WLAN_DATA_MAXLEN \ - + WLAN_CRC_LEN) - -#define WLAN_BEACON_FR_MAXLEN WLAN_A3FR_MAXLEN -#define WLAN_ATIM_FR_MAXLEN (WLAN_HDR_ADDR3_LEN + 0) -#define WLAN_NULLDATA_FR_MAXLEN (WLAN_HDR_ADDR3_LEN + 0) -#define WLAN_DISASSOC_FR_MAXLEN (WLAN_HDR_ADDR3_LEN + 2) -#define WLAN_ASSOCREQ_FR_MAXLEN WLAN_A3FR_MAXLEN -#define WLAN_ASSOCRESP_FR_MAXLEN WLAN_A3FR_MAXLEN -#define WLAN_REASSOCREQ_FR_MAXLEN WLAN_A3FR_MAXLEN -#define WLAN_REASSOCRESP_FR_MAXLEN WLAN_A3FR_MAXLEN -#define WLAN_PROBEREQ_FR_MAXLEN WLAN_A3FR_MAXLEN -#define WLAN_PROBERESP_FR_MAXLEN WLAN_A3FR_MAXLEN -#define WLAN_AUTHEN_FR_MAXLEN WLAN_A3FR_MAXLEN -#define WLAN_DEAUTHEN_FR_MAXLEN (WLAN_HDR_ADDR3_LEN + 2) - -#define WLAN_WEP_NKEYS 4 -#define WLAN_WEP40_KEYLEN 5 -#define WLAN_WEP104_KEYLEN 13 -#define WLAN_WEP232_KEYLEN 29 -#define WLAN_WEPMAX_KEYLEN 32 -#define WLAN_CHALLENGE_IE_MAXLEN 255 -#define WLAN_CHALLENGE_IE_LEN 130 -#define WLAN_CHALLENGE_LEN 128 -#define WLAN_WEP_IV_LEN 4 -#define WLAN_WEP_ICV_LEN 4 -#define WLAN_FRAGS_MAX 16 - -/* Frame Type */ -#define WLAN_TYPE_MGR 0x00 -#define WLAN_TYPE_CTL 0x01 -#define WLAN_TYPE_DATA 0x02 - -#define WLAN_FTYPE_MGMT 0x00 -#define WLAN_FTYPE_CTL 0x01 -#define WLAN_FTYPE_DATA 0x02 - -/* Frame Subtypes */ -#define WLAN_FSTYPE_ASSOCREQ 0x00 -#define WLAN_FSTYPE_ASSOCRESP 0x01 -#define WLAN_FSTYPE_REASSOCREQ 0x02 -#define WLAN_FSTYPE_REASSOCRESP 0x03 -#define WLAN_FSTYPE_PROBEREQ 0x04 -#define WLAN_FSTYPE_PROBERESP 0x05 -#define WLAN_FSTYPE_BEACON 0x08 -#define WLAN_FSTYPE_ATIM 0x09 -#define WLAN_FSTYPE_DISASSOC 0x0a -#define WLAN_FSTYPE_AUTHEN 0x0b -#define WLAN_FSTYPE_DEAUTHEN 0x0c -#define WLAN_FSTYPE_ACTION 0x0d - -/* Control */ -#define WLAN_FSTYPE_PSPOLL 0x0a -#define WLAN_FSTYPE_RTS 0x0b -#define WLAN_FSTYPE_CTS 0x0c -#define WLAN_FSTYPE_ACK 0x0d -#define WLAN_FSTYPE_CFEND 0x0e -#define WLAN_FSTYPE_CFENDCFACK 0x0f - -/* Data */ -#define WLAN_FSTYPE_DATAONLY 0x00 -#define WLAN_FSTYPE_DATA_CFACK 0x01 -#define WLAN_FSTYPE_DATA_CFPOLL 0x02 -#define WLAN_FSTYPE_DATA_CFACK_CFPOLL 0x03 -#define WLAN_FSTYPE_NULL 0x04 -#define WLAN_FSTYPE_CFACK 0x05 -#define WLAN_FSTYPE_CFPOLL 0x06 -#define WLAN_FSTYPE_CFACK_CFPOLL 0x07 - -#ifdef __BIG_ENDIAN - -/* GET & SET Frame Control bit */ -#define WLAN_GET_FC_PRVER(n) (((u16)(n) >> 8) & (BIT0 | BIT1)) -#define WLAN_GET_FC_FTYPE(n) ((((u16)(n) >> 8) & (BIT2 | BIT3)) >> 2) -#define WLAN_GET_FC_FSTYPE(n) ((((u16)(n) >> 8) \ - & (BIT4|BIT5|BIT6|BIT7)) >> 4) -#define WLAN_GET_FC_TODS(n) ((((u16)(n) << 8) & (BIT8)) >> 8) -#define WLAN_GET_FC_FROMDS(n) ((((u16)(n) << 8) & (BIT9)) >> 9) -#define WLAN_GET_FC_MOREFRAG(n) ((((u16)(n) << 8) & (BIT10)) >> 10) -#define WLAN_GET_FC_RETRY(n) ((((u16)(n) << 8) & (BIT11)) >> 11) -#define WLAN_GET_FC_PWRMGT(n) ((((u16)(n) << 8) & (BIT12)) >> 12) -#define WLAN_GET_FC_MOREDATA(n) ((((u16)(n) << 8) & (BIT13)) >> 13) -#define WLAN_GET_FC_ISWEP(n) ((((u16)(n) << 8) & (BIT14)) >> 14) -#define WLAN_GET_FC_ORDER(n) ((((u16)(n) << 8) & (BIT15)) >> 15) - -/* Sequence Field bit */ -#define WLAN_GET_SEQ_FRGNUM(n) (((u16)(n) >> 8) & (BIT0|BIT1|BIT2|BIT3)) -#define WLAN_GET_SEQ_SEQNUM(n) ((((u16)(n) >> 8) \ - & (~(BIT0|BIT1|BIT2|BIT3))) >> 4) - -/* Capability Field bit */ -#define WLAN_GET_CAP_INFO_ESS(n) (((n) >> 8) & BIT0) -#define WLAN_GET_CAP_INFO_IBSS(n) ((((n) >> 8) & BIT1) >> 1) -#define WLAN_GET_CAP_INFO_CFPOLLABLE(n) ((((n) >> 8) & BIT2) >> 2) -#define WLAN_GET_CAP_INFO_CFPOLLREQ(n) ((((n) >> 8) & BIT3) >> 3) -#define WLAN_GET_CAP_INFO_PRIVACY(n) ((((n) >> 8) & BIT4) >> 4) -#define WLAN_GET_CAP_INFO_SHORTPREAMBLE(n) ((((n) >> 8) & BIT5) >> 5) -#define WLAN_GET_CAP_INFO_PBCC(n) ((((n) >> 8) & BIT6) >> 6) -#define WLAN_GET_CAP_INFO_AGILITY(n) ((((n) >> 8) & BIT7) >> 7) -#define WLAN_GET_CAP_INFO_SPECTRUMMNG(n) ((((n)) & BIT8) >> 10) -#define WLAN_GET_CAP_INFO_SHORTSLOTTIME(n) ((((n)) & BIT10) >> 10) -#define WLAN_GET_CAP_INFO_DSSSOFDM(n) ((((n)) & BIT13) >> 13) -#define WLAN_GET_CAP_INFO_GRPACK(n) ((((n)) & BIT14) >> 14) - -#else - -/* GET & SET Frame Control bit */ -#define WLAN_GET_FC_PRVER(n) (((u16)(n)) & (BIT0 | BIT1)) -#define WLAN_GET_FC_FTYPE(n) ((((u16)(n)) & (BIT2 | BIT3)) >> 2) -#define WLAN_GET_FC_FSTYPE(n) ((((u16)(n)) & (BIT4|BIT5|BIT6|BIT7)) >> 4) -#define WLAN_GET_FC_TODS(n) ((((u16)(n)) & (BIT8)) >> 8) -#define WLAN_GET_FC_FROMDS(n) ((((u16)(n)) & (BIT9)) >> 9) -#define WLAN_GET_FC_MOREFRAG(n) ((((u16)(n)) & (BIT10)) >> 10) -#define WLAN_GET_FC_RETRY(n) ((((u16)(n)) & (BIT11)) >> 11) -#define WLAN_GET_FC_PWRMGT(n) ((((u16)(n)) & (BIT12)) >> 12) -#define WLAN_GET_FC_MOREDATA(n) ((((u16)(n)) & (BIT13)) >> 13) -#define WLAN_GET_FC_ISWEP(n) ((((u16)(n)) & (BIT14)) >> 14) -#define WLAN_GET_FC_ORDER(n) ((((u16)(n)) & (BIT15)) >> 15) - -/* Sequence Field bit */ -#define WLAN_GET_SEQ_FRGNUM(n) (((u16)(n)) & (BIT0|BIT1|BIT2|BIT3)) -#define WLAN_GET_SEQ_SEQNUM(n) ((((u16)(n)) & (~(BIT0|BIT1|BIT2|BIT3))) >> 4) - -/* Capability Field bit */ -#define WLAN_GET_CAP_INFO_ESS(n) ((n) & BIT0) -#define WLAN_GET_CAP_INFO_IBSS(n) (((n) & BIT1) >> 1) -#define WLAN_GET_CAP_INFO_CFPOLLABLE(n) (((n) & BIT2) >> 2) -#define WLAN_GET_CAP_INFO_CFPOLLREQ(n) (((n) & BIT3) >> 3) -#define WLAN_GET_CAP_INFO_PRIVACY(n) (((n) & BIT4) >> 4) -#define WLAN_GET_CAP_INFO_SHORTPREAMBLE(n) (((n) & BIT5) >> 5) -#define WLAN_GET_CAP_INFO_PBCC(n) (((n) & BIT6) >> 6) -#define WLAN_GET_CAP_INFO_AGILITY(n) (((n) & BIT7) >> 7) -#define WLAN_GET_CAP_INFO_SPECTRUMMNG(n) (((n) & BIT8) >> 10) -#define WLAN_GET_CAP_INFO_SHORTSLOTTIME(n) (((n) & BIT10) >> 10) -#define WLAN_GET_CAP_INFO_DSSSOFDM(n) (((n) & BIT13) >> 13) -#define WLAN_GET_CAP_INFO_GRPACK(n) (((n) & BIT14) >> 14) - -#endif /* #ifdef __BIG_ENDIAN */ - -#define WLAN_SET_CAP_INFO_ESS(n) (n) -#define WLAN_SET_CAP_INFO_IBSS(n) ((n) << 1) -#define WLAN_SET_CAP_INFO_CFPOLLABLE(n) ((n) << 2) -#define WLAN_SET_CAP_INFO_CFPOLLREQ(n) ((n) << 3) -#define WLAN_SET_CAP_INFO_PRIVACY(n) ((n) << 4) -#define WLAN_SET_CAP_INFO_SHORTPREAMBLE(n) ((n) << 5) -#define WLAN_SET_CAP_INFO_SPECTRUMMNG(n) ((n) << 8) -#define WLAN_SET_CAP_INFO_PBCC(n) ((n) << 6) -#define WLAN_SET_CAP_INFO_AGILITY(n) ((n) << 7) -#define WLAN_SET_CAP_INFO_SHORTSLOTTIME(n) ((n) << 10) -#define WLAN_SET_CAP_INFO_DSSSOFDM(n) ((n) << 13) -#define WLAN_SET_CAP_INFO_GRPACK(n) ((n) << 14) - -#define WLAN_SET_FC_PRVER(n) ((u16)(n)) -#define WLAN_SET_FC_FTYPE(n) (((u16)(n)) << 2) -#define WLAN_SET_FC_FSTYPE(n) (((u16)(n)) << 4) -#define WLAN_SET_FC_TODS(n) (((u16)(n)) << 8) -#define WLAN_SET_FC_FROMDS(n) (((u16)(n)) << 9) -#define WLAN_SET_FC_MOREFRAG(n) (((u16)(n)) << 10) -#define WLAN_SET_FC_RETRY(n) (((u16)(n)) << 11) -#define WLAN_SET_FC_PWRMGT(n) (((u16)(n)) << 12) -#define WLAN_SET_FC_MOREDATA(n) (((u16)(n)) << 13) -#define WLAN_SET_FC_ISWEP(n) (((u16)(n)) << 14) -#define WLAN_SET_FC_ORDER(n) (((u16)(n)) << 15) - -#define WLAN_SET_SEQ_FRGNUM(n) ((u16)(n)) -#define WLAN_SET_SEQ_SEQNUM(n) (((u16)(n)) << 4) - -/* ERP Field bit */ - -#define WLAN_GET_ERP_NONERP_PRESENT(n) ((n) & BIT0) -#define WLAN_GET_ERP_USE_PROTECTION(n) (((n) & BIT1) >> 1) -#define WLAN_GET_ERP_BARKER_MODE(n) (((n) & BIT2) >> 2) - -#define WLAN_SET_ERP_NONERP_PRESENT(n) (n) -#define WLAN_SET_ERP_USE_PROTECTION(n) ((n) << 1) -#define WLAN_SET_ERP_BARKER_MODE(n) ((n) << 2) - -/* Support & Basic Rates field */ -#define WLAN_MGMT_IS_BASICRATE(b) ((b) & BIT7) -#define WLAN_MGMT_GET_RATE(b) ((b) & ~BIT7) - -/* TIM field */ -#define WLAN_MGMT_IS_MULTICAST_TIM(b) ((b) & BIT0) -#define WLAN_MGMT_GET_TIM_OFFSET(b) (((b) & ~BIT0) >> 1) - -/* 3-Addr & 4-Addr */ -#define WLAN_HDR_A3_DATA_PTR(p) (((u8 *)(p)) + WLAN_HDR_ADDR3_LEN) -#define WLAN_HDR_A4_DATA_PTR(p) (((u8 *)(p)) + WLAN_HDR_ADDR4_LEN) - -/* IEEE ADDR */ -#define IEEE_ADDR_UNIVERSAL 0x02 -#define IEEE_ADDR_GROUP 0x01 - -typedef struct { - u8 abyAddr[6]; -} IEEE_ADDR, *PIEEE_ADDR; - -/* 802.11 Header Format */ - -typedef struct tagWLAN_80211HDR_A2 { - - u16 wFrameCtl; - u16 wDurationID; - u8 abyAddr1[WLAN_ADDR_LEN]; - u8 abyAddr2[WLAN_ADDR_LEN]; - -} __attribute__ ((__packed__)) -WLAN_80211HDR_A2, *PWLAN_80211HDR_A2; - -typedef struct tagWLAN_80211HDR_A3 { - - u16 wFrameCtl; - u16 wDurationID; - u8 abyAddr1[WLAN_ADDR_LEN]; - u8 abyAddr2[WLAN_ADDR_LEN]; - u8 abyAddr3[WLAN_ADDR_LEN]; - u16 wSeqCtl; - -} __attribute__ ((__packed__)) -WLAN_80211HDR_A3, *PWLAN_80211HDR_A3; - -typedef struct tagWLAN_80211HDR_A4 { - - u16 wFrameCtl; - u16 wDurationID; - u8 abyAddr1[WLAN_ADDR_LEN]; - u8 abyAddr2[WLAN_ADDR_LEN]; - u8 abyAddr3[WLAN_ADDR_LEN]; - u16 wSeqCtl; - u8 abyAddr4[WLAN_ADDR_LEN]; - -} __attribute__ ((__packed__)) -WLAN_80211HDR_A4, *PWLAN_80211HDR_A4; - -typedef union tagUWLAN_80211HDR { - - WLAN_80211HDR_A2 sA2; - WLAN_80211HDR_A3 sA3; - WLAN_80211HDR_A4 sA4; - -} UWLAN_80211HDR, *PUWLAN_80211HDR; - -#endif /* __80211HDR_H__ */ diff --git a/drivers/staging/vt6656/80211mgr.c b/drivers/staging/vt6656/80211mgr.c deleted file mode 100644 index 61edb51f3836..000000000000 --- a/drivers/staging/vt6656/80211mgr.c +++ /dev/null @@ -1,861 +0,0 @@ -/* - * Copyright (c) 1996, 2003 VIA Networking Technologies, Inc. - * All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - * - * File: 80211mgr.c - * - * Purpose: Handles the 802.11 management support functions - * - * Author: Lyndon Chen - * - * Date: May 8, 2002 - * - * Functions: - * vMgrEncodeBeacon - Encode the Beacon frame - * vMgrDecodeBeacon - Decode the Beacon frame - * vMgrEncodeDisassociation - Encode the Disassociation frame - * vMgrDecodeDisassociation - Decode the Disassociation frame - * vMgrEncodeAssocRequest - Encode the Association request frame - * vMgrDecodeAssocRequest - Decode the Association request frame - * vMgrEncodeAssocResponse - Encode the Association response frame - * vMgrDecodeAssocResponse - Decode the Association response frame - * vMgrEncodeReAssocRequest - Encode the ReAssociation request frame - * vMgrDecodeReAssocRequest - Decode the ReAssociation request frame - * vMgrEncodeProbeRequest - Encode the Probe request frame - * vMgrDecodeProbeRequest - Decode the Probe request frame - * vMgrEncodeProbeResponse - Encode the Probe response frame - * vMgrDecodeProbeResponse - Decode the Probe response frame - * vMgrEncodeAuthen - Encode the Authentication frame - * vMgrDecodeAuthen - Decode the Authentication frame - * vMgrEncodeDeauthen - Encode the DeAuthentication frame - * vMgrDecodeDeauthen - Decode the DeAuthentication frame - * vMgrEncodeReassocResponse - Encode the Reassociation response frame - * - * Revision History: - * - */ - -#include "device.h" -#include "tmacro.h" -#include "tether.h" -#include "80211mgr.h" -#include "80211hdr.h" -#include "wpa.h" - -static int msglevel = MSG_LEVEL_INFO; -/*static int msglevel =MSG_LEVEL_DEBUG;*/ - -/*+ - * - * Routine Description: - * Encode Beacon frame body offset - * - * Return Value: - * None. - * --*/ - -void -vMgrEncodeBeacon( - PWLAN_FR_BEACON pFrame - ) -{ - pFrame->pHdr = (PUWLAN_80211HDR)pFrame->pBuf; - - /* Fixed Fields */ - pFrame->pqwTimestamp = - (u64 *)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) + - WLAN_BEACON_OFF_TS); - pFrame->pwBeaconInterval = (u16 *)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) - + WLAN_BEACON_OFF_BCN_INT); - pFrame->pwCapInfo = (u16 *)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) - + WLAN_BEACON_OFF_CAPINFO); - - pFrame->len = WLAN_HDR_ADDR3_LEN + WLAN_BEACON_OFF_SSID; - - return; -} - -/*+ - * - * Routine Description: - * Decode Beacon frame body offset - * - * - * Return Value: - * None. - * --*/ - -void -vMgrDecodeBeacon( - PWLAN_FR_BEACON pFrame - ) -{ - PWLAN_IE pItem; - - pFrame->pHdr = (PUWLAN_80211HDR)pFrame->pBuf; - - /* Fixed Fields */ - pFrame->pqwTimestamp = - (u64 *)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) + - WLAN_BEACON_OFF_TS); - pFrame->pwBeaconInterval = (u16 *)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) - + WLAN_BEACON_OFF_BCN_INT); - pFrame->pwCapInfo = (u16 *)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) - + WLAN_BEACON_OFF_CAPINFO); - - /* Information elements */ - pItem = (PWLAN_IE)((u8 *)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))) - + WLAN_BEACON_OFF_SSID); - while (((u8 *)pItem) < (pFrame->pBuf + pFrame->len)) { - - switch (pItem->byElementID) { - case WLAN_EID_SSID: - if (pFrame->pSSID == NULL) - pFrame->pSSID = (PWLAN_IE_SSID)pItem; - break; - case WLAN_EID_SUPP_RATES: - if (pFrame->pSuppRates == NULL) - pFrame->pSuppRates = (PWLAN_IE_SUPP_RATES)pItem; - break; - case WLAN_EID_FH_PARMS: - /* pFrame->pFHParms = (PWLAN_IE_FH_PARMS)pItem; */ - break; - case WLAN_EID_DS_PARMS: - if (pFrame->pDSParms == NULL) - pFrame->pDSParms = (PWLAN_IE_DS_PARMS)pItem; - break; - case WLAN_EID_CF_PARMS: - if (pFrame->pCFParms == NULL) - pFrame->pCFParms = (PWLAN_IE_CF_PARMS)pItem; - break; - case WLAN_EID_IBSS_PARMS: - if (pFrame->pIBSSParms == NULL) - pFrame->pIBSSParms = (PWLAN_IE_IBSS_PARMS)pItem; - break; - case WLAN_EID_TIM: - if (pFrame->pTIM == NULL) - pFrame->pTIM = (PWLAN_IE_TIM)pItem; - break; - - case WLAN_EID_RSN: - if (pFrame->pRSN == NULL) - pFrame->pRSN = (PWLAN_IE_RSN)pItem; - break; - case WLAN_EID_RSN_WPA: - if (pFrame->pRSNWPA == NULL) { - if (WPAb_Is_RSN((PWLAN_IE_RSN_EXT)pItem) == true) - pFrame->pRSNWPA = (PWLAN_IE_RSN_EXT)pItem; - } - break; - - case WLAN_EID_ERP: - if (pFrame->pERP == NULL) - pFrame->pERP = (PWLAN_IE_ERP)pItem; - break; - case WLAN_EID_EXTSUPP_RATES: - if (pFrame->pExtSuppRates == NULL) - pFrame->pExtSuppRates = (PWLAN_IE_SUPP_RATES)pItem; - break; - - case WLAN_EID_COUNTRY: /* 7 */ - if (pFrame->pIE_Country == NULL) - pFrame->pIE_Country = (PWLAN_IE_COUNTRY)pItem; - break; - - case WLAN_EID_PWR_CONSTRAINT: /* 32 */ - if (pFrame->pIE_PowerConstraint == NULL) - pFrame->pIE_PowerConstraint = (PWLAN_IE_PW_CONST)pItem; - break; - - case WLAN_EID_CH_SWITCH: /* 37 */ - if (pFrame->pIE_CHSW == NULL) - pFrame->pIE_CHSW = (PWLAN_IE_CH_SW)pItem; - break; - - case WLAN_EID_QUIET: /* 40 */ - if (pFrame->pIE_Quiet == NULL) - pFrame->pIE_Quiet = (PWLAN_IE_QUIET)pItem; - break; - - case WLAN_EID_IBSS_DFS: - if (pFrame->pIE_IBSSDFS == NULL) - pFrame->pIE_IBSSDFS = (PWLAN_IE_IBSS_DFS)pItem; - break; - - default: - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Unrecognized EID=%dd in beacon decode.\n", pItem->byElementID); - break; - - } - pItem = (PWLAN_IE)(((u8 *)pItem) + 2 + pItem->len); - } -} - -/*+ - * - * Routine Description: - * Encode Disassociation - * - * - * Return Value: - * None. - * --*/ - -void -vMgrEncodeDisassociation( - PWLAN_FR_DISASSOC pFrame - ) -{ - pFrame->pHdr = (PUWLAN_80211HDR)pFrame->pBuf; - - /* Fixed Fields */ - pFrame->pwReason = (u16 *)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) - + WLAN_DISASSOC_OFF_REASON); - pFrame->len = WLAN_HDR_ADDR3_LEN + WLAN_DISASSOC_OFF_REASON + sizeof(*(pFrame->pwReason)); -} - -/*+ - * - * Routine Description: - * Decode Disassociation - * - * - * Return Value: - * None. - * --*/ - -void -vMgrDecodeDisassociation( - PWLAN_FR_DISASSOC pFrame - ) -{ - pFrame->pHdr = (PUWLAN_80211HDR)pFrame->pBuf; - - /* Fixed Fields */ - pFrame->pwReason = (u16 *)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) - + WLAN_DISASSOC_OFF_REASON); -} - -/*+ - * - * Routine Description: - * Encode Association Request - * - * - * Return Value: - * None. - * --*/ - -void -vMgrEncodeAssocRequest( - PWLAN_FR_ASSOCREQ pFrame - ) -{ - pFrame->pHdr = (PUWLAN_80211HDR)pFrame->pBuf; - /* Fixed Fields */ - pFrame->pwCapInfo = (u16 *)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) - + WLAN_ASSOCREQ_OFF_CAP_INFO); - pFrame->pwListenInterval = (u16 *)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) - + WLAN_ASSOCREQ_OFF_LISTEN_INT); - pFrame->len = WLAN_HDR_ADDR3_LEN + WLAN_ASSOCREQ_OFF_LISTEN_INT + sizeof(*(pFrame->pwListenInterval)); -} - -/*+ - * - * Routine Description: (AP) - * Decode Association Request - * - * - * Return Value: - * None. - * --*/ - -void -vMgrDecodeAssocRequest( - PWLAN_FR_ASSOCREQ pFrame - ) -{ - PWLAN_IE pItem; - - pFrame->pHdr = (PUWLAN_80211HDR)pFrame->pBuf; - /* Fixed Fields */ - pFrame->pwCapInfo = (u16 *)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) - + WLAN_ASSOCREQ_OFF_CAP_INFO); - pFrame->pwListenInterval = (u16 *)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) - + WLAN_ASSOCREQ_OFF_LISTEN_INT); - - /* Information elements */ - pItem = (PWLAN_IE)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) - + WLAN_ASSOCREQ_OFF_SSID); - - while (((u8 *)pItem) < (pFrame->pBuf + pFrame->len)) { - switch (pItem->byElementID) { - case WLAN_EID_SSID: - if (pFrame->pSSID == NULL) - pFrame->pSSID = (PWLAN_IE_SSID)pItem; - break; - case WLAN_EID_SUPP_RATES: - if (pFrame->pSuppRates == NULL) - pFrame->pSuppRates = (PWLAN_IE_SUPP_RATES)pItem; - break; - - case WLAN_EID_RSN: - if (pFrame->pRSN == NULL) - pFrame->pRSN = (PWLAN_IE_RSN)pItem; - break; - case WLAN_EID_RSN_WPA: - if (pFrame->pRSNWPA == NULL) { - if (WPAb_Is_RSN((PWLAN_IE_RSN_EXT)pItem) == true) - pFrame->pRSNWPA = (PWLAN_IE_RSN_EXT)pItem; - } - break; - case WLAN_EID_EXTSUPP_RATES: - if (pFrame->pExtSuppRates == NULL) - pFrame->pExtSuppRates = (PWLAN_IE_SUPP_RATES)pItem; - break; - - default: - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Unrecognized EID=%dd in assocreq decode.\n", - pItem->byElementID); - break; - } - pItem = (PWLAN_IE)(((u8 *)pItem) + 2 + pItem->len); - } -} - -/*+ - * - * Routine Description: (AP) - * Encode Association Response - * - * - * Return Value: - * None. - * --*/ - -void -vMgrEncodeAssocResponse( - PWLAN_FR_ASSOCRESP pFrame - ) -{ - pFrame->pHdr = (PUWLAN_80211HDR)pFrame->pBuf; - - /* Fixed Fields */ - pFrame->pwCapInfo = (u16 *)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) - + WLAN_ASSOCRESP_OFF_CAP_INFO); - pFrame->pwStatus = (u16 *)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) - + WLAN_ASSOCRESP_OFF_STATUS); - pFrame->pwAid = (u16 *)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) - + WLAN_ASSOCRESP_OFF_AID); - pFrame->len = WLAN_HDR_ADDR3_LEN + WLAN_ASSOCRESP_OFF_AID - + sizeof(*(pFrame->pwAid)); -} - -/*+ - * - * Routine Description: - * Decode Association Response - * - * - * Return Value: - * None. - * --*/ - -void -vMgrDecodeAssocResponse( - PWLAN_FR_ASSOCRESP pFrame - ) -{ - PWLAN_IE pItem; - - pFrame->pHdr = (PUWLAN_80211HDR)pFrame->pBuf; - - /* Fixed Fields */ - pFrame->pwCapInfo = (u16 *)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) - + WLAN_ASSOCRESP_OFF_CAP_INFO); - pFrame->pwStatus = (u16 *)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) - + WLAN_ASSOCRESP_OFF_STATUS); - pFrame->pwAid = (u16 *)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) - + WLAN_ASSOCRESP_OFF_AID); - - /* Information elements */ - pFrame->pSuppRates = (PWLAN_IE_SUPP_RATES)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) - + WLAN_ASSOCRESP_OFF_SUPP_RATES); - - pItem = (PWLAN_IE)(pFrame->pSuppRates); - pItem = (PWLAN_IE)(((u8 *)pItem) + 2 + pItem->len); - - if ((((u8 *)pItem) < (pFrame->pBuf + pFrame->len)) && (pItem->byElementID == WLAN_EID_EXTSUPP_RATES)) { - pFrame->pExtSuppRates = (PWLAN_IE_SUPP_RATES)pItem; - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "pFrame->pExtSuppRates=[%p].\n", pItem); - } else - pFrame->pExtSuppRates = NULL; -} - -/*+ - * - * Routine Description: - * Encode Reassociation Request - * - * - * Return Value: - * None. - * --*/ - -void -vMgrEncodeReassocRequest( - PWLAN_FR_REASSOCREQ pFrame - ) -{ - pFrame->pHdr = (PUWLAN_80211HDR)pFrame->pBuf; - - /* Fixed Fields */ - pFrame->pwCapInfo = (u16 *)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) - + WLAN_REASSOCREQ_OFF_CAP_INFO); - pFrame->pwListenInterval = (u16 *)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) - + WLAN_REASSOCREQ_OFF_LISTEN_INT); - pFrame->pAddrCurrAP = (PIEEE_ADDR)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) - + WLAN_REASSOCREQ_OFF_CURR_AP); - pFrame->len = WLAN_HDR_ADDR3_LEN + WLAN_REASSOCREQ_OFF_CURR_AP + sizeof(*(pFrame->pAddrCurrAP)); -} - -/*+ - * - * Routine Description: (AP) - * Decode Reassociation Request - * - * - * Return Value: - * None. - * --*/ - -void -vMgrDecodeReassocRequest( - PWLAN_FR_REASSOCREQ pFrame - ) -{ - PWLAN_IE pItem; - pFrame->pHdr = (PUWLAN_80211HDR)pFrame->pBuf; - - /* Fixed Fields */ - pFrame->pwCapInfo = (u16 *)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) - + WLAN_REASSOCREQ_OFF_CAP_INFO); - pFrame->pwListenInterval = (u16 *)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) - + WLAN_REASSOCREQ_OFF_LISTEN_INT); - pFrame->pAddrCurrAP = (PIEEE_ADDR)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) - + WLAN_REASSOCREQ_OFF_CURR_AP); - - /* Information elements */ - pItem = (PWLAN_IE)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) - + WLAN_REASSOCREQ_OFF_SSID); - - while (((u8 *)pItem) < (pFrame->pBuf + pFrame->len)) { - - switch (pItem->byElementID) { - case WLAN_EID_SSID: - if (pFrame->pSSID == NULL) - pFrame->pSSID = (PWLAN_IE_SSID)pItem; - break; - case WLAN_EID_SUPP_RATES: - if (pFrame->pSuppRates == NULL) - pFrame->pSuppRates = (PWLAN_IE_SUPP_RATES)pItem; - break; - - case WLAN_EID_RSN: - if (pFrame->pRSN == NULL) - pFrame->pRSN = (PWLAN_IE_RSN)pItem; - break; - case WLAN_EID_RSN_WPA: - if (pFrame->pRSNWPA == NULL) - if (WPAb_Is_RSN((PWLAN_IE_RSN_EXT)pItem) == true) - pFrame->pRSNWPA = (PWLAN_IE_RSN_EXT)pItem; - break; - - case WLAN_EID_EXTSUPP_RATES: - if (pFrame->pExtSuppRates == NULL) - pFrame->pExtSuppRates = (PWLAN_IE_SUPP_RATES)pItem; - break; - default: - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Unrecognized EID=%dd in reassocreq decode.\n", - pItem->byElementID); - break; - } - pItem = (PWLAN_IE)(((u8 *)pItem) + 2 + pItem->len); - } -} - -/*+ - * - * Routine Description: - * Encode Probe Request - * - * - * Return Value: - * None. - * --*/ - -void -vMgrEncodeProbeRequest( - PWLAN_FR_PROBEREQ pFrame - ) -{ - pFrame->pHdr = (PUWLAN_80211HDR)pFrame->pBuf; - pFrame->len = WLAN_HDR_ADDR3_LEN; -} - -/*+ - * - * Routine Description: - * Decode Probe Request - * - * - * Return Value: - * None. - * --*/ - -void -vMgrDecodeProbeRequest( - PWLAN_FR_PROBEREQ pFrame - ) -{ - PWLAN_IE pItem; - - pFrame->pHdr = (PUWLAN_80211HDR)pFrame->pBuf; - - /* Information elements */ - pItem = (PWLAN_IE)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3))); - - while (((u8 *)pItem) < (pFrame->pBuf + pFrame->len)) { - - switch (pItem->byElementID) { - case WLAN_EID_SSID: - if (pFrame->pSSID == NULL) - pFrame->pSSID = (PWLAN_IE_SSID)pItem; - break; - - case WLAN_EID_SUPP_RATES: - if (pFrame->pSuppRates == NULL) - pFrame->pSuppRates = (PWLAN_IE_SUPP_RATES)pItem; - break; - - case WLAN_EID_EXTSUPP_RATES: - if (pFrame->pExtSuppRates == NULL) - pFrame->pExtSuppRates = (PWLAN_IE_SUPP_RATES)pItem; - break; - - default: - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Bad EID=%dd in probereq\n", pItem->byElementID); - break; - } - - pItem = (PWLAN_IE)(((u8 *)pItem) + 2 + pItem->len); - } -} - -/*+ - * - * Routine Description: - * Encode Probe Response - * - * - * Return Value: - * None. - * --*/ - -void -vMgrEncodeProbeResponse( - PWLAN_FR_PROBERESP pFrame - ) -{ - pFrame->pHdr = (PUWLAN_80211HDR)pFrame->pBuf; - - /* Fixed Fields */ - pFrame->pqwTimestamp = - (u64 *)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) + - WLAN_PROBERESP_OFF_TS); - pFrame->pwBeaconInterval = (u16 *)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) - + WLAN_PROBERESP_OFF_BCN_INT); - pFrame->pwCapInfo = (u16 *)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) - + WLAN_PROBERESP_OFF_CAP_INFO); - - pFrame->len = WLAN_HDR_ADDR3_LEN + WLAN_PROBERESP_OFF_CAP_INFO + - sizeof(*(pFrame->pwCapInfo)); -} - -/*+ - * - * Routine Description: - * Decode Probe Response - * - * - * Return Value: - * None. - * --*/ - -void -vMgrDecodeProbeResponse( - PWLAN_FR_PROBERESP pFrame - ) -{ - PWLAN_IE pItem; - - pFrame->pHdr = (PUWLAN_80211HDR)pFrame->pBuf; - - /* Fixed Fields */ - pFrame->pqwTimestamp = - (u64 *)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) + - WLAN_PROBERESP_OFF_TS); - pFrame->pwBeaconInterval = (u16 *)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) - + WLAN_PROBERESP_OFF_BCN_INT); - pFrame->pwCapInfo = (u16 *)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) - + WLAN_PROBERESP_OFF_CAP_INFO); - - /* Information elements */ - pItem = (PWLAN_IE)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) - + WLAN_PROBERESP_OFF_SSID); - - while (((u8 *)pItem) < (pFrame->pBuf + pFrame->len)) { - switch (pItem->byElementID) { - case WLAN_EID_SSID: - if (pFrame->pSSID == NULL) - pFrame->pSSID = (PWLAN_IE_SSID)pItem; - break; - case WLAN_EID_SUPP_RATES: - if (pFrame->pSuppRates == NULL) - pFrame->pSuppRates = (PWLAN_IE_SUPP_RATES)pItem; - break; - case WLAN_EID_FH_PARMS: - break; - case WLAN_EID_DS_PARMS: - if (pFrame->pDSParms == NULL) - pFrame->pDSParms = (PWLAN_IE_DS_PARMS)pItem; - break; - case WLAN_EID_CF_PARMS: - if (pFrame->pCFParms == NULL) - pFrame->pCFParms = (PWLAN_IE_CF_PARMS)pItem; - break; - case WLAN_EID_IBSS_PARMS: - if (pFrame->pIBSSParms == NULL) - pFrame->pIBSSParms = (PWLAN_IE_IBSS_PARMS)pItem; - break; - - case WLAN_EID_RSN: - if (pFrame->pRSN == NULL) - pFrame->pRSN = (PWLAN_IE_RSN)pItem; - break; - case WLAN_EID_RSN_WPA: - if (pFrame->pRSNWPA == NULL) { - if (WPAb_Is_RSN((PWLAN_IE_RSN_EXT)pItem) == true) - pFrame->pRSNWPA = (PWLAN_IE_RSN_EXT)pItem; - } - break; - case WLAN_EID_ERP: - if (pFrame->pERP == NULL) - pFrame->pERP = (PWLAN_IE_ERP)pItem; - break; - case WLAN_EID_EXTSUPP_RATES: - if (pFrame->pExtSuppRates == NULL) - pFrame->pExtSuppRates = (PWLAN_IE_SUPP_RATES)pItem; - break; - - case WLAN_EID_COUNTRY: /* 7 */ - if (pFrame->pIE_Country == NULL) - pFrame->pIE_Country = (PWLAN_IE_COUNTRY)pItem; - break; - - case WLAN_EID_PWR_CONSTRAINT: /* 32 */ - if (pFrame->pIE_PowerConstraint == NULL) - pFrame->pIE_PowerConstraint = (PWLAN_IE_PW_CONST)pItem; - break; - - case WLAN_EID_CH_SWITCH: /* 37 */ - if (pFrame->pIE_CHSW == NULL) - pFrame->pIE_CHSW = (PWLAN_IE_CH_SW)pItem; - break; - - case WLAN_EID_QUIET: /* 40 */ - if (pFrame->pIE_Quiet == NULL) - pFrame->pIE_Quiet = (PWLAN_IE_QUIET)pItem; - break; - - case WLAN_EID_IBSS_DFS: - if (pFrame->pIE_IBSSDFS == NULL) - pFrame->pIE_IBSSDFS = (PWLAN_IE_IBSS_DFS)pItem; - break; - - default: - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Bad EID=%dd in proberesp\n", pItem->byElementID); - break; - } - - pItem = (PWLAN_IE)(((u8 *)pItem) + 2 + pItem->len); - } -} - -/*+ - * - * Routine Description: - * Encode Authentication frame - * - * - * Return Value: - * None. - * --*/ - -void -vMgrEncodeAuthen( - PWLAN_FR_AUTHEN pFrame - ) -{ - pFrame->pHdr = (PUWLAN_80211HDR)pFrame->pBuf; - - /* Fixed Fields */ - pFrame->pwAuthAlgorithm = (u16 *)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) - + WLAN_AUTHEN_OFF_AUTH_ALG); - pFrame->pwAuthSequence = (u16 *)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) - + WLAN_AUTHEN_OFF_AUTH_SEQ); - pFrame->pwStatus = (u16 *)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) - + WLAN_AUTHEN_OFF_STATUS); - pFrame->len = WLAN_HDR_ADDR3_LEN + WLAN_AUTHEN_OFF_STATUS + sizeof(*(pFrame->pwStatus)); -} - -/*+ - * - * Routine Description: - * Decode Authentication - * - * - * Return Value: - * None. - * --*/ - -void -vMgrDecodeAuthen( - PWLAN_FR_AUTHEN pFrame - ) -{ - PWLAN_IE pItem; - - pFrame->pHdr = (PUWLAN_80211HDR)pFrame->pBuf; - - /* Fixed Fields */ - pFrame->pwAuthAlgorithm = (u16 *)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) - + WLAN_AUTHEN_OFF_AUTH_ALG); - pFrame->pwAuthSequence = (u16 *)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) - + WLAN_AUTHEN_OFF_AUTH_SEQ); - pFrame->pwStatus = (u16 *)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) - + WLAN_AUTHEN_OFF_STATUS); - - /* Information elements */ - pItem = (PWLAN_IE)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) - + WLAN_AUTHEN_OFF_CHALLENGE); - - if ((((u8 *)pItem) < (pFrame->pBuf + pFrame->len)) && (pItem->byElementID == WLAN_EID_CHALLENGE)) - pFrame->pChallenge = (PWLAN_IE_CHALLENGE)pItem; -} - -/*+ - * - * Routine Description: - * Encode Authentication - * - * - * Return Value: - * None. - * --*/ - -void -vMgrEncodeDeauthen( - PWLAN_FR_DEAUTHEN pFrame - ) -{ - pFrame->pHdr = (PUWLAN_80211HDR)pFrame->pBuf; - - /* Fixed Fields */ - pFrame->pwReason = (u16 *)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) - + WLAN_DEAUTHEN_OFF_REASON); - pFrame->len = WLAN_HDR_ADDR3_LEN + WLAN_DEAUTHEN_OFF_REASON + sizeof(*(pFrame->pwReason)); -} - -/*+ - * - * Routine Description: - * Decode Deauthentication - * - * - * Return Value: - * None. - * --*/ - -void -vMgrDecodeDeauthen( - PWLAN_FR_DEAUTHEN pFrame - ) -{ - pFrame->pHdr = (PUWLAN_80211HDR)pFrame->pBuf; - - /* Fixed Fields */ - pFrame->pwReason = (u16 *)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) - + WLAN_DEAUTHEN_OFF_REASON); -} - -/*+ - * - * Routine Description: (AP) - * Encode Reassociation Response - * - * - * Return Value: - * None. - * --*/ - -void -vMgrEncodeReassocResponse( - PWLAN_FR_REASSOCRESP pFrame - ) -{ - pFrame->pHdr = (PUWLAN_80211HDR)pFrame->pBuf; - - /* Fixed Fields */ - pFrame->pwCapInfo = (u16 *)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) - + WLAN_REASSOCRESP_OFF_CAP_INFO); - pFrame->pwStatus = (u16 *)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) - + WLAN_REASSOCRESP_OFF_STATUS); - pFrame->pwAid = (u16 *)(WLAN_HDR_A3_DATA_PTR(&(pFrame->pHdr->sA3)) - + WLAN_REASSOCRESP_OFF_AID); - - pFrame->len = WLAN_HDR_ADDR3_LEN + WLAN_REASSOCRESP_OFF_AID + sizeof(*(pFrame->pwAid)); -} diff --git a/drivers/staging/vt6656/80211mgr.h b/drivers/staging/vt6656/80211mgr.h deleted file mode 100644 index 39cde1a0b66c..000000000000 --- a/drivers/staging/vt6656/80211mgr.h +++ /dev/null @@ -1,808 +0,0 @@ -/* - * Copyright (c) 1996, 2003 VIA Networking Technologies, Inc. - * All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - * - * - * File: 80211mgr.h - * - * Purpose: 802.11 management frames pre-defines. - * - * - * Author: Lyndon Chen - * - * Date: May 8, 2002 - * - */ - -#ifndef __80211MGR_H__ -#define __80211MGR_H__ - -#include "80211hdr.h" - -#define WLAN_MIN_ARRAY 1 - -/* Information Element ID value */ -#define WLAN_EID_SSID 0 -#define WLAN_EID_SUPP_RATES 1 -#define WLAN_EID_FH_PARMS 2 -#define WLAN_EID_DS_PARMS 3 -#define WLAN_EID_CF_PARMS 4 -#define WLAN_EID_TIM 5 -#define WLAN_EID_IBSS_PARMS 6 -#define WLAN_EID_COUNTRY 7 -#define WLAN_EID_CHALLENGE 16 -#define WLAN_EID_PWR_CONSTRAINT 32 -#define WLAN_EID_PWR_CAPABILITY 33 -#define WLAN_EID_TPC_REQ 34 -#define WLAN_EID_TPC_REP 35 -#define WLAN_EID_SUPP_CH 36 -#define WLAN_EID_CH_SWITCH 37 -#define WLAN_EID_MEASURE_REQ 38 -#define WLAN_EID_MEASURE_REP 39 -#define WLAN_EID_QUIET 40 -#define WLAN_EID_IBSS_DFS 41 -#define WLAN_EID_ERP 42 -/* reference 802.11i 7.3.2 table 20 */ -#define WLAN_EID_RSN 48 -#define WLAN_EID_EXTSUPP_RATES 50 -/* reference WiFi WPA spec */ -#define WLAN_EID_RSN_WPA 221 - -#ifdef Cisco_ccx -#define WLAN_EID_CCX 133 -#define WLAN_EID_CCX_IP 149 -#define WLAN_EID_CCX_Ver 221 -#endif - -#define WLAN_EID_ERP_NONERP_PRESENT 0x01 -#define WLAN_EID_ERP_USE_PROTECTION 0x02 -#define WLAN_EID_ERP_BARKER_MODE 0x04 - -/* reason codes */ -#define WLAN_MGMT_REASON_RSVD 0 -#define WLAN_MGMT_REASON_UNSPEC 1 -#define WLAN_MGMT_REASON_PRIOR_AUTH_INVALID 2 -#define WLAN_MGMT_REASON_DEAUTH_LEAVING 3 -#define WLAN_MGMT_REASON_DISASSOC_INACTIVE 4 -#define WLAN_MGMT_REASON_DISASSOC_AP_BUSY 5 -#define WLAN_MGMT_REASON_CLASS2_NONAUTH 6 -#define WLAN_MGMT_REASON_CLASS3_NONASSOC 7 -#define WLAN_MGMT_REASON_DISASSOC_STA_HASLEFT 8 -#define WLAN_MGMT_REASON_CANT_ASSOC_NONAUTH 9 -#define WLAN_MGMT_REASON_DISASSOC_PWR_CAP_UNACCEPT 10 -#define WLAN_MGMT_REASON_DISASSOC_SUPP_CH_UNACCEPT 11 -#define WLAN_MGMT_REASON_INVALID_IE 13 -#define WLAN_MGMT_REASON_MIC_FAILURE 14 -#define WLAN_MGMT_REASON_4WAY_HANDSHAKE_TIMEOUT 15 -#define WLAN_MGMT_REASON_GRPKEY_UPDATE_TIMEOUT 16 -#define WLAN_MGMT_REASON_4WAY_INFO_DIFFERENT 17 -#define WLAN_MGMT_REASON_MULTCAST_CIPHER_INVALID 18 -#define WLAN_MGMT_REASON_UNCAST_CIPHER_INVALID 19 -#define WLAN_MGMT_REASON_AKMP_INVALID 20 -#define WLAN_MGMT_REASON_RSNE_UNSUPPORTED 21 -#define WLAN_MGMT_REASON_RSNE_CAP_INVALID 22 -#define WLAN_MGMT_REASON_80211X_AUTH_FAILED 23 - -/* status codes */ -#define WLAN_MGMT_STATUS_SUCCESS 0 -#define WLAN_MGMT_STATUS_UNSPEC_FAILURE 1 -#define WLAN_MGMT_STATUS_CAPS_UNSUPPORTED 10 -#define WLAN_MGMT_STATUS_REASSOC_NO_ASSOC 11 -#define WLAN_MGMT_STATUS_ASSOC_DENIED_UNSPEC 12 -#define WLAN_MGMT_STATUS_UNSUPPORTED_AUTHALG 13 -#define WLAN_MGMT_STATUS_RX_AUTH_NOSEQ 14 -#define WLAN_MGMT_STATUS_CHALLENGE_FAIL 15 -#define WLAN_MGMT_STATUS_AUTH_TIMEOUT 16 -#define WLAN_MGMT_STATUS_ASSOC_DENIED_BUSY 17 -#define WLAN_MGMT_STATUS_ASSOC_DENIED_RATES 18 -#define WLAN_MGMT_STATUS_ASSOC_DENIED_SHORTPREAMBLE 19 -#define WLAN_MGMT_STATUS_ASSOC_DENIED_PBCC 20 -#define WLAN_MGMT_STATUS_ASSOC_DENIED_AGILITY 21 - -/* reference 802.11h 7.3.1.9 */ -#define WLAN_MGMT_STATUS_ASSOC_REJECT_BCS_SPECTRUM_MNG 22 -#define WLAN_MGMT_STATUS_ASSOC_REJECT_BCS_PWR_CAP 23 -#define WLAN_MGMT_STATUS_ASSOC_REJECT_BCS_SUPP_CH 24 - -/* reference 802.11g 7.3.1.9 */ -#define WLAN_MGMT_STATUS_SHORTSLOTTIME_UNSUPPORTED 25 -#define WLAN_MGMT_STATUS_DSSSOFDM_UNSUPPORTED 26 - -/* reference 802.11i 7.3.1.9 table 19 */ -#define WLAN_MGMT_STATUS_INVALID_IE 40 -#define WLAN_MGMT_STATUS_GROUP_CIPHER_INVALID 41 -#define WLAN_MGMT_STATUS_PAIRWISE_CIPHER_INVALID 42 -#define WLAN_MGMT_STATUS_AKMP_INVALID 43 -#define WLAN_MGMT_STATUS_UNSUPPORT_RSN_IE_VER 44 -#define WLAN_MGMT_STATUS_INVALID_RSN_IE_CAP 45 -#define WLAN_MGMT_STATUS_CIPHER_REJECT 46 - -/* auth algorithm */ -#define WLAN_AUTH_ALG_OPENSYSTEM 0 -#define WLAN_AUTH_ALG_SHAREDKEY 1 - -/* management frame field offsets */ - -/* - * Note: Not all fields are listed because of variable lengths - * Note: These offsets are from the start of the frame data - */ - -#define WLAN_BEACON_OFF_TS 0 -#define WLAN_BEACON_OFF_BCN_INT 8 -#define WLAN_BEACON_OFF_CAPINFO 10 -#define WLAN_BEACON_OFF_SSID 12 - -#define WLAN_DISASSOC_OFF_REASON 0 - -#define WLAN_ASSOCREQ_OFF_CAP_INFO 0 -#define WLAN_ASSOCREQ_OFF_LISTEN_INT 2 -#define WLAN_ASSOCREQ_OFF_SSID 4 - -#define WLAN_ASSOCRESP_OFF_CAP_INFO 0 -#define WLAN_ASSOCRESP_OFF_STATUS 2 -#define WLAN_ASSOCRESP_OFF_AID 4 -#define WLAN_ASSOCRESP_OFF_SUPP_RATES 6 - -#define WLAN_REASSOCREQ_OFF_CAP_INFO 0 -#define WLAN_REASSOCREQ_OFF_LISTEN_INT 2 -#define WLAN_REASSOCREQ_OFF_CURR_AP 4 -#define WLAN_REASSOCREQ_OFF_SSID 10 - -#define WLAN_REASSOCRESP_OFF_CAP_INFO 0 -#define WLAN_REASSOCRESP_OFF_STATUS 2 -#define WLAN_REASSOCRESP_OFF_AID 4 -#define WLAN_REASSOCRESP_OFF_SUPP_RATES 6 - -#define WLAN_PROBEREQ_OFF_SSID 0 - -#define WLAN_PROBERESP_OFF_TS 0 -#define WLAN_PROBERESP_OFF_BCN_INT 8 -#define WLAN_PROBERESP_OFF_CAP_INFO 10 -#define WLAN_PROBERESP_OFF_SSID 12 - -#define WLAN_AUTHEN_OFF_AUTH_ALG 0 -#define WLAN_AUTHEN_OFF_AUTH_SEQ 2 -#define WLAN_AUTHEN_OFF_STATUS 4 -#define WLAN_AUTHEN_OFF_CHALLENGE 6 - -#define WLAN_DEAUTHEN_OFF_REASON 0 - -/* cipher suite selectors defined in 802.11i */ -#define WLAN_11i_CSS_USE_GROUP 0 -#define WLAN_11i_CSS_WEP40 1 -#define WLAN_11i_CSS_TKIP 2 -#define WLAN_11i_CSS_CCMP 4 -#define WLAN_11i_CSS_WEP104 5 -#define WLAN_11i_CSS_UNKNOWN 255 - -/* authentication and key management suite selectors defined in 802.11i */ -#define WLAN_11i_AKMSS_802_1X 1 -#define WLAN_11i_AKMSS_PSK 2 -#define WLAN_11i_AKMSS_UNKNOWN 255 - -/* measurement type definitions reference IEEE 802.11h table 20b */ -#define MEASURE_TYPE_BASIC 0 -#define MEASURE_TYPE_CCA 1 -#define MEASURE_TYPE_RPI 2 - -/* measurement request mode definitions reference IEEE 802.11h figure 46h */ -#define MEASURE_MODE_ENABLE 0x02 -#define MEASURE_MODE_REQ 0x04 -#define MEASURE_MODE_REP 0x08 - -/* measurement report mode definitions reference IEEE 802.11h figure 46m */ -#define MEASURE_MODE_LATE 0x01 -#define MEASURE_MODE_INCAPABLE 0x02 -#define MEASURE_MODE_REFUSED 0x04 - -/* Information Element types */ - -#pragma pack(1) -typedef struct tagWLAN_IE { - u8 byElementID; - u8 len; -} __attribute__ ((__packed__)) -WLAN_IE, *PWLAN_IE; - -/* Service Set IDentity (SSID) */ -#pragma pack(1) -typedef struct tagWLAN_IE_SSID { - u8 byElementID; - u8 len; - u8 abySSID[1]; -} __attribute__ ((__packed__)) -WLAN_IE_SSID, *PWLAN_IE_SSID; - -/* Supported Rates */ -#pragma pack(1) -typedef struct tagWLAN_IE_SUPP_RATES { - u8 byElementID; - u8 len; - u8 abyRates[1]; -} __attribute__ ((__packed__)) -WLAN_IE_SUPP_RATES, *PWLAN_IE_SUPP_RATES; - -/* FH Parameter Set */ -#pragma pack(1) -typedef struct _WLAN_IE_FH_PARMS { - u8 byElementID; - u8 len; - u16 wDwellTime; - u8 byHopSet; - u8 byHopPattern; - u8 byHopIndex; -} WLAN_IE_FH_PARMS, *PWLAN_IE_FH_PARMS; - -/* DS Parameter Set */ -#pragma pack(1) -typedef struct tagWLAN_IE_DS_PARMS { - u8 byElementID; - u8 len; - u8 byCurrChannel; -} __attribute__ ((__packed__)) -WLAN_IE_DS_PARMS, *PWLAN_IE_DS_PARMS; - -/* CF Parameter Set */ -#pragma pack(1) -typedef struct tagWLAN_IE_CF_PARMS { - u8 byElementID; - u8 len; - u8 byCFPCount; - u8 byCFPPeriod; - u16 wCFPMaxDuration; - u16 wCFPDurRemaining; -} __attribute__ ((__packed__)) -WLAN_IE_CF_PARMS, *PWLAN_IE_CF_PARMS; - -/* TIM */ -#pragma pack(1) -typedef struct tagWLAN_IE_TIM { - u8 byElementID; - u8 len; - u8 byDTIMCount; - u8 byDTIMPeriod; - u8 byBitMapCtl; - u8 byVirtBitMap[1]; -} __attribute__ ((__packed__)) -WLAN_IE_TIM, *PWLAN_IE_TIM; - -/* IBSS Parameter Set */ -#pragma pack(1) -typedef struct tagWLAN_IE_IBSS_PARMS { - u8 byElementID; - u8 len; - u16 wATIMWindow; -} __attribute__ ((__packed__)) -WLAN_IE_IBSS_PARMS, *PWLAN_IE_IBSS_PARMS; - -/* Challenge Text */ -#pragma pack(1) -typedef struct tagWLAN_IE_CHALLENGE { - u8 byElementID; - u8 len; - u8 abyChallenge[1]; -} __attribute__ ((__packed__)) -WLAN_IE_CHALLENGE, *PWLAN_IE_CHALLENGE; - -#pragma pack(1) -typedef struct tagWLAN_IE_RSN_EXT { - u8 byElementID; - u8 len; - u8 abyOUI[4]; - u16 wVersion; - u8 abyMulticast[4]; - u16 wPKCount; - struct { - u8 abyOUI[4]; - } PKSList[1]; - /* the rest is variable so need to overlay ieauth structure */ -} WLAN_IE_RSN_EXT, *PWLAN_IE_RSN_EXT; - -#pragma pack(1) -typedef struct tagWLAN_IE_RSN_AUTH { - u16 wAuthCount; - struct { - u8 abyOUI[4]; - } AuthKSList[1]; -} WLAN_IE_RSN_AUTH, *PWLAN_IE_RSN_AUTH; - -/* RSN Identity */ -#pragma pack(1) -typedef struct tagWLAN_IE_RSN { - u8 byElementID; - u8 len; - u16 wVersion; - u8 abyRSN[WLAN_MIN_ARRAY]; -} WLAN_IE_RSN, *PWLAN_IE_RSN; - -/* CCX Identity DavidWang */ -#pragma pack(1) -typedef struct tagWLAN_IE_CCX { -u8 byElementID; -u8 len; -u8 abyCCX[30]; -} WLAN_IE_CCX, *PWLAN_IE_CCX; -#pragma pack(1) -typedef struct tagWLAN_IE_CCX_IP { -u8 byElementID; -u8 len; -u8 abyCCXOUI[4]; -u8 abyCCXIP[4]; -u8 abyCCXREV[2]; -} WLAN_IE_CCX_IP, *PWLAN_IE_CCX_IP; -#pragma pack(1) -typedef struct tagWLAN_IE_CCX_Ver { -u8 byElementID; -u8 len; -u8 abyCCXVer[5]; -} WLAN_IE_CCX_Ver, *PWLAN_IE_CCX_Ver; - -/* ERP */ -#pragma pack(1) -typedef struct tagWLAN_IE_ERP { - u8 byElementID; - u8 len; - u8 byContext; -} __attribute__ ((__packed__)) -WLAN_IE_ERP, *PWLAN_IE_ERP; - -#pragma pack(1) -typedef struct _MEASEURE_REQ { - u8 byChannel; - u8 abyStartTime[8]; - u8 abyDuration[2]; -} MEASEURE_REQ, *PMEASEURE_REQ, - MEASEURE_REQ_BASIC, *PMEASEURE_REQ_BASIC, - MEASEURE_REQ_CCA, *PMEASEURE_REQ_CCA, - MEASEURE_REQ_RPI, *PMEASEURE_REQ_RPI; - -typedef struct _MEASEURE_REP_BASIC { - u8 byChannel; - u8 abyStartTime[8]; - u8 abyDuration[2]; - u8 byMap; -} MEASEURE_REP_BASIC, *PMEASEURE_REP_BASIC; - -typedef struct _MEASEURE_REP_CCA { - u8 byChannel; - u8 abyStartTime[8]; - u8 abyDuration[2]; - u8 byCCABusyFraction; -} MEASEURE_REP_CCA, *PMEASEURE_REP_CCA; - -typedef struct _MEASEURE_REP_RPI { - u8 byChannel; - u8 abyStartTime[8]; - u8 abyDuration[2]; - u8 abyRPIdensity[8]; -} MEASEURE_REP_RPI, *PMEASEURE_REP_RPI; - -typedef union _MEASEURE_REP { - - MEASEURE_REP_BASIC sBasic; - MEASEURE_REP_CCA sCCA; - MEASEURE_REP_RPI sRPI; - -} MEASEURE_REP, *PMEASEURE_REP; - -typedef struct _WLAN_IE_MEASURE_REQ { - u8 byElementID; - u8 len; - u8 byToken; - u8 byMode; - u8 byType; - MEASEURE_REQ sReq; -} WLAN_IE_MEASURE_REQ, *PWLAN_IE_MEASURE_REQ; - -typedef struct _WLAN_IE_MEASURE_REP { - u8 byElementID; - u8 len; - u8 byToken; - u8 byMode; - u8 byType; - MEASEURE_REP sRep; -} WLAN_IE_MEASURE_REP, *PWLAN_IE_MEASURE_REP; - -typedef struct _WLAN_IE_CH_SW { - u8 byElementID; - u8 len; - u8 byMode; - u8 byChannel; - u8 byCount; -} WLAN_IE_CH_SW, *PWLAN_IE_CH_SW; - -typedef struct _WLAN_IE_QUIET { - u8 byElementID; - u8 len; - u8 byQuietCount; - u8 byQuietPeriod; - u8 abyQuietDuration[2]; - u8 abyQuietOffset[2]; -} WLAN_IE_QUIET, *PWLAN_IE_QUIET; - -typedef struct _WLAN_IE_COUNTRY { - u8 byElementID; - u8 len; - u8 abyCountryString[3]; - u8 abyCountryInfo[3]; -} WLAN_IE_COUNTRY, *PWLAN_IE_COUNTRY; - -typedef struct _WLAN_IE_PW_CONST { - u8 byElementID; - u8 len; - u8 byPower; -} WLAN_IE_PW_CONST, *PWLAN_IE_PW_CONST; - -typedef struct _WLAN_IE_PW_CAP { - u8 byElementID; - u8 len; - u8 byMinPower; - u8 byMaxPower; -} WLAN_IE_PW_CAP, *PWLAN_IE_PW_CAP; - -typedef struct _WLAN_IE_SUPP_CH { - u8 byElementID; - u8 len; - u8 abyChannelTuple[2]; -} WLAN_IE_SUPP_CH, *PWLAN_IE_SUPP_CH; - -typedef struct _WLAN_IE_TPC_REQ { - u8 byElementID; - u8 len; -} WLAN_IE_TPC_REQ, *PWLAN_IE_TPC_REQ; - -typedef struct _WLAN_IE_TPC_REP { - u8 byElementID; - u8 len; - u8 byTxPower; - u8 byLinkMargin; -} WLAN_IE_TPC_REP, *PWLAN_IE_TPC_REP; - -typedef struct _WLAN_IE_IBSS_DFS { - u8 byElementID; - u8 len; - u8 abyDFSOwner[6]; - u8 byDFSRecovery; - u8 abyChannelMap[2]; -} WLAN_IE_IBSS_DFS, *PWLAN_IE_IBSS_DFS; - -#pragma pack() - -/* frame types */ - -/* prototype structure, all mgmt frame types will start with these members */ -typedef struct tagWLAN_FR_MGMT { - - unsigned int uType; - unsigned int len; - u8 * pBuf; - PUWLAN_80211HDR pHdr; - -} WLAN_FR_MGMT, *PWLAN_FR_MGMT; - -/* beacon frame */ -typedef struct tagWLAN_FR_BEACON { - - unsigned int uType; - unsigned int len; - u8 * pBuf; - PUWLAN_80211HDR pHdr; - /* fixed fields */ - u64 *pqwTimestamp; - u16 * pwBeaconInterval; - u16 * pwCapInfo; - /* info elements */ - PWLAN_IE_SSID pSSID; - PWLAN_IE_SUPP_RATES pSuppRates; -/* PWLAN_IE_FH_PARMS pFHParms; */ - PWLAN_IE_DS_PARMS pDSParms; - PWLAN_IE_CF_PARMS pCFParms; - PWLAN_IE_TIM pTIM; - PWLAN_IE_IBSS_PARMS pIBSSParms; - PWLAN_IE_RSN pRSN; - PWLAN_IE_RSN_EXT pRSNWPA; - PWLAN_IE_ERP pERP; - PWLAN_IE_SUPP_RATES pExtSuppRates; - PWLAN_IE_COUNTRY pIE_Country; - PWLAN_IE_PW_CONST pIE_PowerConstraint; - PWLAN_IE_CH_SW pIE_CHSW; - PWLAN_IE_IBSS_DFS pIE_IBSSDFS; - PWLAN_IE_QUIET pIE_Quiet; - -} WLAN_FR_BEACON, *PWLAN_FR_BEACON; - -/* IBSS ATIM frame */ -typedef struct tagWLAN_FR_IBSSATIM { - - unsigned int uType; - unsigned int len; - u8 * pBuf; - PUWLAN_80211HDR pHdr; - - /* fixed fields */ - /* info elements */ - /* this frame type has a null body */ - -} WLAN_FR_IBSSATIM, *PWLAN_FR_IBSSATIM; - -/* disassociation */ -typedef struct tagWLAN_FR_DISASSOC { - - unsigned int uType; - unsigned int len; - u8 * pBuf; - PUWLAN_80211HDR pHdr; - /* fixed fields */ - u16 * pwReason; - /* info elements */ - -} WLAN_FR_DISASSOC, *PWLAN_FR_DISASSOC; - -/* association request */ -typedef struct tagWLAN_FR_ASSOCREQ { - - unsigned int uType; - unsigned int len; - u8 * pBuf; - PUWLAN_80211HDR pHdr; - /* fixed fields */ - u16 * pwCapInfo; - u16 * pwListenInterval; - /* info elements */ - PWLAN_IE_SSID pSSID; - PWLAN_IE_SUPP_RATES pSuppRates; - PWLAN_IE_RSN pRSN; - PWLAN_IE_CCX pCCX; - PWLAN_IE_CCX_IP pCCXIP; - PWLAN_IE_CCX_Ver pCCXVER; - PWLAN_IE_RSN_EXT pRSNWPA; - PWLAN_IE_SUPP_RATES pExtSuppRates; - PWLAN_IE_PW_CAP pCurrPowerCap; - PWLAN_IE_SUPP_CH pCurrSuppCh; - -} WLAN_FR_ASSOCREQ, *PWLAN_FR_ASSOCREQ; - -/* association response */ -typedef struct tagWLAN_FR_ASSOCRESP { - - unsigned int uType; - unsigned int len; - u8 * pBuf; - PUWLAN_80211HDR pHdr; - /* fixed fields */ - u16 * pwCapInfo; - u16 * pwStatus; - u16 * pwAid; - /* info elements */ - PWLAN_IE_SUPP_RATES pSuppRates; - PWLAN_IE_SUPP_RATES pExtSuppRates; - -} WLAN_FR_ASSOCRESP, *PWLAN_FR_ASSOCRESP; - -/* reassociation request */ -typedef struct tagWLAN_FR_REASSOCREQ { - - unsigned int uType; - unsigned int len; - u8 * pBuf; - PUWLAN_80211HDR pHdr; - - /* fixed fields */ - u16 * pwCapInfo; - u16 * pwListenInterval; - PIEEE_ADDR pAddrCurrAP; - - /* info elements */ - PWLAN_IE_SSID pSSID; - PWLAN_IE_SUPP_RATES pSuppRates; - PWLAN_IE_RSN pRSN; - PWLAN_IE_CCX pCCX; - PWLAN_IE_CCX_IP pCCXIP; - PWLAN_IE_CCX_Ver pCCXVER; - PWLAN_IE_RSN_EXT pRSNWPA; - PWLAN_IE_SUPP_RATES pExtSuppRates; - -} WLAN_FR_REASSOCREQ, *PWLAN_FR_REASSOCREQ; - -/* reassociation response */ -typedef struct tagWLAN_FR_REASSOCRESP { - - unsigned int uType; - unsigned int len; - u8 * pBuf; - PUWLAN_80211HDR pHdr; - /* fixed fields */ - u16 * pwCapInfo; - u16 * pwStatus; - u16 * pwAid; - /* info elements */ - PWLAN_IE_SUPP_RATES pSuppRates; - PWLAN_IE_SUPP_RATES pExtSuppRates; - -} WLAN_FR_REASSOCRESP, *PWLAN_FR_REASSOCRESP; - -/* probe request */ -typedef struct tagWLAN_FR_PROBEREQ { - - unsigned int uType; - unsigned int len; - u8 * pBuf; - PUWLAN_80211HDR pHdr; - /* fixed fields */ - /* info elements */ - PWLAN_IE_SSID pSSID; - PWLAN_IE_SUPP_RATES pSuppRates; - PWLAN_IE_SUPP_RATES pExtSuppRates; - -} WLAN_FR_PROBEREQ, *PWLAN_FR_PROBEREQ; - -/* probe response */ -typedef struct tagWLAN_FR_PROBERESP { - - unsigned int uType; - unsigned int len; - u8 * pBuf; - PUWLAN_80211HDR pHdr; - /* fixed fields */ - u64 *pqwTimestamp; - u16 * pwBeaconInterval; - u16 * pwCapInfo; - /* info elements */ - PWLAN_IE_SSID pSSID; - PWLAN_IE_SUPP_RATES pSuppRates; - PWLAN_IE_DS_PARMS pDSParms; - PWLAN_IE_CF_PARMS pCFParms; - PWLAN_IE_IBSS_PARMS pIBSSParms; - PWLAN_IE_RSN pRSN; - PWLAN_IE_RSN_EXT pRSNWPA; - PWLAN_IE_ERP pERP; - PWLAN_IE_SUPP_RATES pExtSuppRates; - PWLAN_IE_COUNTRY pIE_Country; - PWLAN_IE_PW_CONST pIE_PowerConstraint; - PWLAN_IE_CH_SW pIE_CHSW; - PWLAN_IE_IBSS_DFS pIE_IBSSDFS; - PWLAN_IE_QUIET pIE_Quiet; - -} WLAN_FR_PROBERESP, *PWLAN_FR_PROBERESP; - -/* authentication */ -typedef struct tagWLAN_FR_AUTHEN { - - unsigned int uType; - unsigned int len; - u8 * pBuf; - PUWLAN_80211HDR pHdr; - /* fixed fields */ - u16 * pwAuthAlgorithm; - u16 * pwAuthSequence; - u16 * pwStatus; - /* info elements */ - PWLAN_IE_CHALLENGE pChallenge; - -} WLAN_FR_AUTHEN, *PWLAN_FR_AUTHEN; - -/* deauthentication */ -typedef struct tagWLAN_FR_DEAUTHEN { - - unsigned int uType; - unsigned int len; - u8 * pBuf; - PUWLAN_80211HDR pHdr; - /* fixed fields */ - u16 * pwReason; - - /* info elements */ - -} WLAN_FR_DEAUTHEN, *PWLAN_FR_DEAUTHEN; - -void -vMgrEncodeBeacon( - PWLAN_FR_BEACON pFrame - ); - -void -vMgrDecodeBeacon( - PWLAN_FR_BEACON pFrame - ); - -void -vMgrEncodeDisassociation( - PWLAN_FR_DISASSOC pFrame - ); - -void -vMgrDecodeDisassociation( - PWLAN_FR_DISASSOC pFrame - ); - -void -vMgrEncodeAssocRequest( - PWLAN_FR_ASSOCREQ pFrame - ); - -void -vMgrDecodeAssocRequest( - PWLAN_FR_ASSOCREQ pFrame - ); - -void -vMgrEncodeAssocResponse( - PWLAN_FR_ASSOCRESP pFrame - ); - -void -vMgrDecodeAssocResponse( - PWLAN_FR_ASSOCRESP pFrame - ); - -void -vMgrEncodeReassocRequest( - PWLAN_FR_REASSOCREQ pFrame - ); - -void -vMgrDecodeReassocRequest( - PWLAN_FR_REASSOCREQ pFrame - ); - -void -vMgrEncodeProbeRequest( - PWLAN_FR_PROBEREQ pFrame - ); - -void -vMgrDecodeProbeRequest( - PWLAN_FR_PROBEREQ pFrame - ); - -void -vMgrEncodeProbeResponse( - PWLAN_FR_PROBERESP pFrame - ); - -void -vMgrDecodeProbeResponse( - PWLAN_FR_PROBERESP pFrame - ); - -void -vMgrEncodeAuthen( - PWLAN_FR_AUTHEN pFrame - ); - -void -vMgrDecodeAuthen( - PWLAN_FR_AUTHEN pFrame - ); - -void -vMgrEncodeDeauthen( - PWLAN_FR_DEAUTHEN pFrame - ); - -void -vMgrDecodeDeauthen( - PWLAN_FR_DEAUTHEN pFrame - ); - -void -vMgrEncodeReassocResponse( - PWLAN_FR_REASSOCRESP pFrame - ); - -#endif /* __80211MGR_H__ */ diff --git a/drivers/staging/vt6656/Kconfig b/drivers/staging/vt6656/Kconfig index f89ab205c8e0..b602ef175d55 100644 --- a/drivers/staging/vt6656/Kconfig +++ b/drivers/staging/vt6656/Kconfig @@ -1,8 +1,6 @@ config VT6656 tristate "VIA Technologies VT6656 support" - depends on USB && WLAN && m - select WIRELESS_EXT - select WEXT_PRIV + depends on MAC80211 && USB && WLAN && m select FW_LOADER ---help--- This is a vendor-written driver for VIA VT6656. diff --git a/drivers/staging/vt6656/Makefile b/drivers/staging/vt6656/Makefile index b5ec483f3eb4..3dbe1f89dd25 100644 --- a/drivers/staging/vt6656/Makefile +++ b/drivers/staging/vt6656/Makefile @@ -6,25 +6,12 @@ vt6656_stage-y += main_usb.o \ card.o \ mac.o \ baseband.o \ - wctl.o \ - 80211mgr.o \ wcmd.o\ - wmgr.o \ - bssdb.o \ - wpa2.o \ rxtx.o \ dpc.o \ power.o \ - datarate.o \ - rc4.o \ - tether.o \ - wpa.o \ key.o \ - tkip.o \ - michael.o \ rf.o \ - iwctl.o \ - wpactl.o \ usbpipe.o \ channel.o \ firmware.o \ diff --git a/drivers/staging/vt6656/baseband.c b/drivers/staging/vt6656/baseband.c index 694e34a5ff90..e6c7b604ede9 100644 --- a/drivers/staging/vt6656/baseband.c +++ b/drivers/staging/vt6656/baseband.c @@ -26,611 +26,106 @@ * Date: Jun. 5, 2002 * * Functions: - * BBuGetFrameTime - Calculate data frame transmitting time - * BBvCalculateParameter - Calculate PhyLength, PhyService and Phy Signal parameter for baseband Tx - * BBbVT3184Init - VIA VT3184 baseband chip init code + * vnt_get_frame_time - Calculate data frame transmitting time + * vnt_get_phy_field - Calculate PhyLength, PhyService and Phy + * Signal parameter for baseband Tx + * vnt_vt3184_init - VIA VT3184 baseband chip init code * * Revision History: * * */ -#include "tmacro.h" -#include "tether.h" #include "mac.h" #include "baseband.h" #include "rf.h" #include "usbpipe.h" -#include "datarate.h" - -static u8 abyVT3184_AGC[] = { - 0x00, //0 - 0x00, //1 - 0x02, //2 - 0x02, //3 //RobertYu:20060505, 0x04, //3 - 0x04, //4 - 0x04, //5 //RobertYu:20060505, 0x06, //5 - 0x06, //6 - 0x06, //7 - 0x08, //8 - 0x08, //9 - 0x0A, //A - 0x0A, //B - 0x0C, //C - 0x0C, //D - 0x0E, //E - 0x0E, //F - 0x10, //10 - 0x10, //11 - 0x12, //12 - 0x12, //13 - 0x14, //14 - 0x14, //15 - 0x16, //16 - 0x16, //17 - 0x18, //18 - 0x18, //19 - 0x1A, //1A - 0x1A, //1B - 0x1C, //1C - 0x1C, //1D - 0x1E, //1E - 0x1E, //1F - 0x20, //20 - 0x20, //21 - 0x22, //22 - 0x22, //23 - 0x24, //24 - 0x24, //25 - 0x26, //26 - 0x26, //27 - 0x28, //28 - 0x28, //29 - 0x2A, //2A - 0x2A, //2B - 0x2C, //2C - 0x2C, //2D - 0x2E, //2E - 0x2E, //2F - 0x30, //30 - 0x30, //31 - 0x32, //32 - 0x32, //33 - 0x34, //34 - 0x34, //35 - 0x36, //36 - 0x36, //37 - 0x38, //38 - 0x38, //39 - 0x3A, //3A - 0x3A, //3B - 0x3C, //3C - 0x3C, //3D - 0x3E, //3E - 0x3E //3F + +static u8 vnt_vt3184_agc[] = { + 0x00, 0x00, 0x02, 0x02, 0x04, 0x04, 0x06, 0x06, + 0x08, 0x08, 0x0a, 0x0a, 0x0c, 0x0c, 0x0e, 0x0e, /* 0x0f */ + 0x10, 0x10, 0x12, 0x12, 0x14, 0x14, 0x16, 0x16, + 0x18, 0x18, 0x1a, 0x1a, 0x1c, 0x1c, 0x1e, 0x1e, /* 0x1f */ + 0x20, 0x20, 0x22, 0x22, 0x24, 0x24, 0x26, 0x26, + 0x28, 0x28, 0x2a, 0x2a, 0x2c, 0x2c, 0x2e, 0x2e, /* 0x2f */ + 0x30, 0x30, 0x32, 0x32, 0x34, 0x34, 0x36, 0x36, + 0x38, 0x38, 0x3a, 0x3a, 0x3c, 0x3c, 0x3e, 0x3e /* 0x3f */ }; -static u8 abyVT3184_AL2230[] = { - 0x31,//00 - 0x00, - 0x00, - 0x00, - 0x00, - 0x80, - 0x00, - 0x00, - 0x70, - 0x45,//tx //0x64 for FPGA - 0x2A, - 0x76, - 0x00, - 0x00, - 0x80, - 0x00, - 0x00,//10 - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x8e, //RobertYu:20060522, //0x8d, - 0x0a, //RobertYu:20060515, //0x09, - 0x00, - 0x00, - 0x00, - 0x00,//20 - 0x00, - 0x00, - 0x00, - 0x00, - 0x4a, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x4a, - 0x00, - 0x0c, //RobertYu:20060522, //0x10, - 0x26,//30 - 0x5b, - 0x00, - 0x00, - 0x00, - 0x00, - 0xaa, - 0xaa, - 0xff, - 0xff, - 0x79, - 0x00, - 0x00, - 0x0b, - 0x48, - 0x04, - 0x00,//40 - 0x08, - 0x00, - 0x08, - 0x08, - 0x14, - 0x05, - 0x09, - 0x00, - 0x00, - 0x00, - 0x00, - 0x09, - 0x73, - 0x00, - 0xc5, - 0x00,//50 //RobertYu:20060505, //0x15,//50 - 0x19, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0xd0, //RobertYu:20060505, //0xb0, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0xe4,//60 - 0x80, - 0x00, - 0x00, - 0x00, - 0x00, - 0x98, - 0x0a, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, //0x80 for FPGA - 0x03, - 0x01, - 0x00, - 0x00,//70 - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x8c,//80 - 0x01, - 0x09, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x08, - 0x00, - 0x1f, //RobertYu:20060516, //0x0f, - 0xb7, - 0x88, - 0x47, - 0xaa, - 0x00, //RobertYu:20060505, //0x02, - 0x20,//90 //RobertYu:20060505, //0x22,//90 - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0xeb, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x01, - 0x00,//a0 - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x10, - 0x00, - 0x18, - 0x00, - 0x00, - 0x00, - 0x00, - 0x15, //RobertYu:20060516, //0x00, - 0x00, - 0x18, - 0x38,//b0 - 0x30, - 0x00, - 0x00, - 0xff, - 0x0f, - 0xe4, - 0xe2, - 0x00, - 0x00, - 0x00, - 0x03, - 0x01, - 0x00, - 0x00, - 0x00, - 0x18,//c0 - 0x20, - 0x07, - 0x18, - 0xff, - 0xff, //RobertYu:20060509, //0x2c, - 0x0e, //RobertYu:20060530, //0x0c, - 0x0a, - 0x0e, - 0x00, //RobertYu:20060505, //0x01, - 0x82, //RobertYu:20060516, //0x8f, - 0xa7, - 0x3c, - 0x10, - 0x30, //RobertYu:20060627, //0x0b, - 0x05, //RobertYu:20060516, //0x25, - 0x40,//d0 - 0x12, - 0x00, - 0x00, - 0x10, - 0x28, - 0x80, - 0x2A, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00,//e0 - 0xf3, //RobertYu:20060516, //0xd3, - 0x00, - 0x00, - 0x00, - 0x10, - 0x00, - 0x12, //RobertYu:20060627, //0x10, - 0x00, - 0xf4, - 0x00, - 0xff, - 0x79, - 0x20, - 0x30, - 0x05, //RobertYu:20060516, //0x0c, - 0x00,//f0 - 0x3e, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00 +static u8 vnt_vt3184_al2230[] = { + 0x31, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, + 0x70, 0x45, 0x2a, 0x76, 0x00, 0x00, 0x80, 0x00, /* 0x0f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x8e, 0x0a, 0x00, 0x00, 0x00, /* 0x1f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x4a, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x4a, 0x00, 0x0c, /* 0x2f */ + 0x26, 0x5b, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, + 0xff, 0xff, 0x79, 0x00, 0x00, 0x0b, 0x48, 0x04, /* 0x3f */ + 0x00, 0x08, 0x00, 0x08, 0x08, 0x14, 0x05, 0x09, + 0x00, 0x00, 0x00, 0x00, 0x09, 0x73, 0x00, 0xc5, /* 0x4f */ + 0x00, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x5f */ + 0xe4, 0x80, 0x00, 0x00, 0x00, 0x00, 0x98, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x01, 0x00, /* 0x6f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x7f */ + 0x8c, 0x01, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x1f, 0xb7, 0x88, 0x47, 0xaa, 0x00, /* 0x8f */ + 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xeb, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, /* 0x9f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x00, 0x15, 0x00, 0x18, /* 0xaf */ + 0x38, 0x30, 0x00, 0x00, 0xff, 0x0f, 0xe4, 0xe2, + 0x00, 0x00, 0x00, 0x03, 0x01, 0x00, 0x00, 0x00, /* 0xbf */ + 0x18, 0x20, 0x07, 0x18, 0xff, 0xff, 0x0e, 0x0a, + 0x0e, 0x00, 0x82, 0xa7, 0x3c, 0x10, 0x30, 0x05, /* 0xcf */ + 0x40, 0x12, 0x00, 0x00, 0x10, 0x28, 0x80, 0x2a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xdf */ + 0x00, 0xf3, 0x00, 0x00, 0x00, 0x10, 0x00, 0x12, + 0x00, 0xf4, 0x00, 0xff, 0x79, 0x20, 0x30, 0x05, /* 0xef */ + 0x00, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 /* 0xff */ }; -//{{RobertYu:20060515, new BB setting for VT3226D0 -static u8 abyVT3184_VT3226D0[] = { - 0x31,//00 - 0x00, - 0x00, - 0x00, - 0x00, - 0x80, - 0x00, - 0x00, - 0x70, - 0x45,//tx //0x64 for FPGA - 0x2A, - 0x76, - 0x00, - 0x00, - 0x80, - 0x00, - 0x00,//10 - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x8e, //RobertYu:20060525, //0x8d, - 0x0a, //RobertYu:20060515, //0x09, - 0x00, - 0x00, - 0x00, - 0x00,//20 - 0x00, - 0x00, - 0x00, - 0x00, - 0x4a, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x4a, - 0x00, - 0x0c, //RobertYu:20060525, //0x10, - 0x26,//30 - 0x5b, - 0x00, - 0x00, - 0x00, - 0x00, - 0xaa, - 0xaa, - 0xff, - 0xff, - 0x79, - 0x00, - 0x00, - 0x0b, - 0x48, - 0x04, - 0x00,//40 - 0x08, - 0x00, - 0x08, - 0x08, - 0x14, - 0x05, - 0x09, - 0x00, - 0x00, - 0x00, - 0x00, - 0x09, - 0x73, - 0x00, - 0xc5, - 0x00,//50 //RobertYu:20060505, //0x15,//50 - 0x19, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0xd0, //RobertYu:20060505, //0xb0, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0xe4,//60 - 0x80, - 0x00, - 0x00, - 0x00, - 0x00, - 0x98, - 0x0a, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, //0x80 for FPGA - 0x03, - 0x01, - 0x00, - 0x00,//70 - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x8c,//80 - 0x01, - 0x09, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x08, - 0x00, - 0x1f, //RobertYu:20060515, //0x0f, - 0xb7, - 0x88, - 0x47, - 0xaa, - 0x00, //RobertYu:20060505, //0x02, - 0x20,//90 //RobertYu:20060505, //0x22,//90 - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0xeb, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x01, - 0x00,//a0 - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x10, - 0x00, - 0x18, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x18, - 0x38,//b0 - 0x30, - 0x00, - 0x00, - 0xff, - 0x0f, - 0xe4, - 0xe2, - 0x00, - 0x00, - 0x00, - 0x03, - 0x01, - 0x00, - 0x00, - 0x00, - 0x18,//c0 - 0x20, - 0x07, - 0x18, - 0xff, - 0xff, //RobertYu:20060509, //0x2c, - 0x10, //RobertYu:20060525, //0x0c, - 0x0a, - 0x0e, - 0x00, //RobertYu:20060505, //0x01, - 0x84, //RobertYu:20060525, //0x8f, - 0xa7, - 0x3c, - 0x10, - 0x24, //RobertYu:20060627, //0x18, - 0x05, //RobertYu:20060515, //0x25, - 0x40,//d0 - 0x12, - 0x00, - 0x00, - 0x10, - 0x28, - 0x80, - 0x2A, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00,//e0 - 0xf3, //RobertYu:20060515, //0xd3, - 0x00, - 0x00, - 0x00, - 0x10, - 0x00, - 0x10, //RobertYu:20060627, //0x0e, - 0x00, - 0xf4, - 0x00, - 0xff, - 0x79, - 0x20, - 0x30, - 0x08, //RobertYu:20060515, //0x0c, - 0x00,//f0 - 0x3e, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, +/* {{RobertYu:20060515, new BB setting for VT3226D0 */ +static u8 vnt_vt3184_vt3226d0[] = { + 0x31, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, + 0x70, 0x45, 0x2a, 0x76, 0x00, 0x00, 0x80, 0x00, /* 0x0f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x8e, 0x0a, 0x00, 0x00, 0x00, /* 0x1f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x4a, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x4a, 0x00, 0x0c, /* 0x2f */ + 0x26, 0x5b, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, + 0xff, 0xff, 0x79, 0x00, 0x00, 0x0b, 0x48, 0x04, /* 0x3f */ + 0x00, 0x08, 0x00, 0x08, 0x08, 0x14, 0x05, 0x09, + 0x00, 0x00, 0x00, 0x00, 0x09, 0x73, 0x00, 0xc5, /* 0x4f */ + 0x00, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x5f */ + 0xe4, 0x80, 0x00, 0x00, 0x00, 0x00, 0x98, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x01, 0x00, /* 0x6f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x7f */ + 0x8c, 0x01, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x1f, 0xb7, 0x88, 0x47, 0xaa, 0x00, /* 0x8f */ + 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xeb, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, /* 0x9f */ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, /* 0xaf */ + 0x38, 0x30, 0x00, 0x00, 0xff, 0x0f, 0xe4, 0xe2, + 0x00, 0x00, 0x00, 0x03, 0x01, 0x00, 0x00, 0x00, /* 0xbf */ + 0x18, 0x20, 0x07, 0x18, 0xff, 0xff, 0x10, 0x0a, + 0x0e, 0x00, 0x84, 0xa7, 0x3c, 0x10, 0x24, 0x05, /* 0xcf */ + 0x40, 0x12, 0x00, 0x00, 0x10, 0x28, 0x80, 0x2a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xdf */ + 0x00, 0xf3, 0x00, 0x00, 0x00, 0x10, 0x00, 0x10, + 0x00, 0xf4, 0x00, 0xff, 0x79, 0x20, 0x30, 0x08, /* 0xef */ + 0x00, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 /* 0xff */ }; -static const u16 awcFrameTime[MAX_RATE] = -{10, 20, 55, 110, 24, 36, 48, 72, 96, 144, 192, 216}; +static const u16 vnt_frame_time[MAX_RATE] = { + 10, 20, 55, 110, 24, 36, 48, 72, 96, 144, 192, 216 +}; /* * Description: Calculate data frame transmitting time @@ -646,7 +141,7 @@ static const u16 awcFrameTime[MAX_RATE] = * Return Value: FrameTime * */ -unsigned int BBuGetFrameTime(u8 preamble_type, u8 pkt_type, +unsigned int vnt_get_frame_time(u8 preamble_type, u8 pkt_type, unsigned int frame_length, u16 tx_rate) { unsigned int frame_time; @@ -657,7 +152,7 @@ unsigned int BBuGetFrameTime(u8 preamble_type, u8 pkt_type, if (tx_rate > RATE_54M) return 0; - rate = (unsigned int)awcFrameTime[tx_rate]; + rate = (unsigned int)vnt_frame_time[tx_rate]; if (tx_rate <= 3) { if (preamble_type == 1) @@ -698,21 +193,21 @@ unsigned int BBuGetFrameTime(u8 preamble_type, u8 pkt_type, * tx_rate - Tx Rate * Out: * struct vnt_phy_field *phy - * - pointer to Phy Length field - * - pointer to Phy Service field - * - pointer to Phy Signal field + * - pointer to Phy Length field + * - pointer to Phy Service field + * - pointer to Phy Signal field * * Return Value: none * */ -void BBvCalculateParameter(struct vnt_private *priv, u32 frame_length, +void vnt_get_phy_field(struct vnt_private *priv, u32 frame_length, u16 tx_rate, u8 pkt_type, struct vnt_phy_field *phy) { u32 bit_count; u32 count = 0; u32 tmp; int ext_bit; - u8 preamble_type = priv->byPreambleType; + u8 preamble_type = priv->preamble_type; bit_count = frame_length * 8; ext_bit = false; @@ -850,18 +345,18 @@ void BBvCalculateParameter(struct vnt_private *priv, u32 frame_length, * Return Value: none * */ -void BBvSetAntennaMode(struct vnt_private *priv, u8 antenna_mode) +void vnt_set_antenna_mode(struct vnt_private *priv, u8 antenna_mode) { switch (antenna_mode) { case ANT_TXA: case ANT_TXB: break; case ANT_RXA: - priv->byBBRxConf &= 0xFC; + priv->bb_rx_conf &= 0xFC; break; case ANT_RXB: - priv->byBBRxConf &= 0xFE; - priv->byBBRxConf |= 0x02; + priv->bb_rx_conf &= 0xFE; + priv->bb_rx_conf |= 0x02; break; } @@ -883,7 +378,7 @@ void BBvSetAntennaMode(struct vnt_private *priv, u8 antenna_mode) * */ -int BBbVT3184Init(struct vnt_private *priv) +int vnt_vt3184_init(struct vnt_private *priv) { int status; u16 length; @@ -895,123 +390,72 @@ int BBbVT3184Init(struct vnt_private *priv) status = vnt_control_in(priv, MESSAGE_TYPE_READ, 0, MESSAGE_REQUEST_EEPROM, EEP_MAX_CONTEXT_SIZE, - priv->abyEEPROM); + priv->eeprom); if (status != STATUS_SUCCESS) return false; - /* zonetype initial */ - priv->byOriginalZonetype = priv->abyEEPROM[EEP_OFS_ZONETYPE]; - - if (priv->config_file.ZoneType >= 0) { - if ((priv->config_file.ZoneType == 0) && - (priv->abyEEPROM[EEP_OFS_ZONETYPE] != 0x00)) { - priv->abyEEPROM[EEP_OFS_ZONETYPE] = 0; - priv->abyEEPROM[EEP_OFS_MAXCHANNEL] = 0x0B; + priv->rf_type = priv->eeprom[EEP_OFS_RFTYPE]; - dev_dbg(&priv->usb->dev, "Init Zone Type :USA\n"); - } else if ((priv->config_file.ZoneType == 1) && - (priv->abyEEPROM[EEP_OFS_ZONETYPE] != 0x01)) { - priv->abyEEPROM[EEP_OFS_ZONETYPE] = 0x01; - priv->abyEEPROM[EEP_OFS_MAXCHANNEL] = 0x0D; + dev_dbg(&priv->usb->dev, "RF Type %d\n", priv->rf_type); - dev_dbg(&priv->usb->dev, "Init Zone Type :Japan\n"); - } else if ((priv->config_file.ZoneType == 2) && - (priv->abyEEPROM[EEP_OFS_ZONETYPE] != 0x02)) { - priv->abyEEPROM[EEP_OFS_ZONETYPE] = 0x02; - priv->abyEEPROM[EEP_OFS_MAXCHANNEL] = 0x0D; + if ((priv->rf_type == RF_AL2230) || + (priv->rf_type == RF_AL2230S)) { + priv->bb_rx_conf = vnt_vt3184_al2230[10]; + length = sizeof(vnt_vt3184_al2230); + addr = vnt_vt3184_al2230; + agc = vnt_vt3184_agc; + length_agc = sizeof(vnt_vt3184_agc); - dev_dbg(&priv->usb->dev, "Init Zone Type :Europe\n"); - } else { - if (priv->config_file.ZoneType != - priv->abyEEPROM[EEP_OFS_ZONETYPE]) - printk("zonetype in file[%02x]\ - mismatch with in EEPROM[%02x]\n", - priv->config_file.ZoneType, - priv->abyEEPROM[EEP_OFS_ZONETYPE]); - else - printk("Read Zonetype file success,\ - use default zonetype setting[%02x]\n", - priv->config_file.ZoneType); - } - } + priv->bb_vga[0] = 0x1C; + priv->bb_vga[1] = 0x10; + priv->bb_vga[2] = 0x0; + priv->bb_vga[3] = 0x0; - if (!priv->bZoneRegExist) - priv->byZoneType = priv->abyEEPROM[EEP_OFS_ZONETYPE]; - - priv->byRFType = priv->abyEEPROM[EEP_OFS_RFTYPE]; - - dev_dbg(&priv->usb->dev, "Zone Type %x\n", priv->byZoneType); - - dev_dbg(&priv->usb->dev, "RF Type %d\n", priv->byRFType); - - if ((priv->byRFType == RF_AL2230) || - (priv->byRFType == RF_AL2230S)) { - priv->byBBRxConf = abyVT3184_AL2230[10]; - length = sizeof(abyVT3184_AL2230); - addr = abyVT3184_AL2230; - agc = abyVT3184_AGC; - length_agc = sizeof(abyVT3184_AGC); - - priv->abyBBVGA[0] = 0x1C; - priv->abyBBVGA[1] = 0x10; - priv->abyBBVGA[2] = 0x0; - priv->abyBBVGA[3] = 0x0; - priv->ldBmThreshold[0] = -70; - priv->ldBmThreshold[1] = -48; - priv->ldBmThreshold[2] = 0; - priv->ldBmThreshold[3] = 0; - } else if (priv->byRFType == RF_AIROHA7230) { - priv->byBBRxConf = abyVT3184_AL2230[10]; - length = sizeof(abyVT3184_AL2230); - addr = abyVT3184_AL2230; - agc = abyVT3184_AGC; - length_agc = sizeof(abyVT3184_AGC); + } else if (priv->rf_type == RF_AIROHA7230) { + priv->bb_rx_conf = vnt_vt3184_al2230[10]; + length = sizeof(vnt_vt3184_al2230); + addr = vnt_vt3184_al2230; + agc = vnt_vt3184_agc; + length_agc = sizeof(vnt_vt3184_agc); addr[0xd7] = 0x06; - priv->abyBBVGA[0] = 0x1c; - priv->abyBBVGA[1] = 0x10; - priv->abyBBVGA[2] = 0x0; - priv->abyBBVGA[3] = 0x0; - priv->ldBmThreshold[0] = -70; - priv->ldBmThreshold[1] = -48; - priv->ldBmThreshold[2] = 0; - priv->ldBmThreshold[3] = 0; - } else if ((priv->byRFType == RF_VT3226) || - (priv->byRFType == RF_VT3226D0)) { - priv->byBBRxConf = abyVT3184_VT3226D0[10]; - length = sizeof(abyVT3184_VT3226D0); - addr = abyVT3184_VT3226D0; - agc = abyVT3184_AGC; - length_agc = sizeof(abyVT3184_AGC); - - priv->abyBBVGA[0] = 0x20; - priv->abyBBVGA[1] = 0x10; - priv->abyBBVGA[2] = 0x0; - priv->abyBBVGA[3] = 0x0; - priv->ldBmThreshold[0] = -70; - priv->ldBmThreshold[1] = -48; - priv->ldBmThreshold[2] = 0; - priv->ldBmThreshold[3] = 0; + priv->bb_vga[0] = 0x1c; + priv->bb_vga[1] = 0x10; + priv->bb_vga[2] = 0x0; + priv->bb_vga[3] = 0x0; + + } else if ((priv->rf_type == RF_VT3226) || + (priv->rf_type == RF_VT3226D0)) { + priv->bb_rx_conf = vnt_vt3184_vt3226d0[10]; + length = sizeof(vnt_vt3184_vt3226d0); + addr = vnt_vt3184_vt3226d0; + agc = vnt_vt3184_agc; + length_agc = sizeof(vnt_vt3184_agc); + + priv->bb_vga[0] = 0x20; + priv->bb_vga[1] = 0x10; + priv->bb_vga[2] = 0x0; + priv->bb_vga[3] = 0x0; + /* Fix VT3226 DFC system timing issue */ - MACvRegBitsOn(priv, MAC_REG_SOFTPWRCTL2, SOFTPWRCTL_RFLEOPT); - } else if ((priv->byRFType == RF_VT3342A0)) { - priv->byBBRxConf = abyVT3184_VT3226D0[10]; - length = sizeof(abyVT3184_VT3226D0); - addr = abyVT3184_VT3226D0; - agc = abyVT3184_AGC; - length_agc = sizeof(abyVT3184_AGC); - - priv->abyBBVGA[0] = 0x20; - priv->abyBBVGA[1] = 0x10; - priv->abyBBVGA[2] = 0x0; - priv->abyBBVGA[3] = 0x0; - priv->ldBmThreshold[0] = -70; - priv->ldBmThreshold[1] = -48; - priv->ldBmThreshold[2] = 0; - priv->ldBmThreshold[3] = 0; + vnt_mac_reg_bits_on(priv, MAC_REG_SOFTPWRCTL2, + SOFTPWRCTL_RFLEOPT); + } else if (priv->rf_type == RF_VT3342A0) { + priv->bb_rx_conf = vnt_vt3184_vt3226d0[10]; + length = sizeof(vnt_vt3184_vt3226d0); + addr = vnt_vt3184_vt3226d0; + agc = vnt_vt3184_agc; + length_agc = sizeof(vnt_vt3184_agc); + + priv->bb_vga[0] = 0x20; + priv->bb_vga[1] = 0x10; + priv->bb_vga[2] = 0x0; + priv->bb_vga[3] = 0x0; + /* Fix VT3226 DFC system timing issue */ - MACvRegBitsOn(priv, MAC_REG_SOFTPWRCTL2, SOFTPWRCTL_RFLEOPT); + vnt_mac_reg_bits_on(priv, MAC_REG_SOFTPWRCTL2, + SOFTPWRCTL_RFLEOPT); } else { return true; } @@ -1026,15 +470,15 @@ int BBbVT3184Init(struct vnt_private *priv) vnt_control_out(priv, MESSAGE_TYPE_WRITE, 0, MESSAGE_REQUEST_BBAGC, length_agc, array); - if ((priv->byRFType == RF_VT3226) || - (priv->byRFType == RF_VT3342A0)) { + if ((priv->rf_type == RF_VT3226) || + (priv->rf_type == RF_VT3342A0)) { vnt_control_out_u8(priv, MESSAGE_REQUEST_MACREG, MAC_REG_ITRTMSET, 0x23); - MACvRegBitsOn(priv, MAC_REG_PAPEDELAY, 0x01); - } else if (priv->byRFType == RF_VT3226D0) { + vnt_mac_reg_bits_on(priv, MAC_REG_PAPEDELAY, 0x01); + } else if (priv->rf_type == RF_VT3226D0) { vnt_control_out_u8(priv, MESSAGE_REQUEST_MACREG, MAC_REG_ITRTMSET, 0x11); - MACvRegBitsOn(priv, MAC_REG_PAPEDELAY, 0x01); + vnt_mac_reg_bits_on(priv, MAC_REG_PAPEDELAY, 0x01); } vnt_control_out_u8(priv, MESSAGE_REQUEST_BBREG, 0x04, 0x7f); @@ -1066,39 +510,39 @@ int BBbVT3184Init(struct vnt_private *priv) * Return Value: none * */ -void BBvSetShortSlotTime(struct vnt_private *priv) +void vnt_set_short_slot_time(struct vnt_private *priv) { u8 bb_vga = 0; - if (priv->bShortSlotTime) - priv->byBBRxConf &= 0xdf; + if (priv->short_slot_time) + priv->bb_rx_conf &= 0xdf; else - priv->byBBRxConf |= 0x20; + priv->bb_rx_conf |= 0x20; vnt_control_in_u8(priv, MESSAGE_REQUEST_BBREG, 0xe7, &bb_vga); - if (bb_vga == priv->abyBBVGA[0]) - priv->byBBRxConf |= 0x20; + if (bb_vga == priv->bb_vga[0]) + priv->bb_rx_conf |= 0x20; - vnt_control_out_u8(priv, MESSAGE_REQUEST_BBREG, 0x0a, priv->byBBRxConf); + vnt_control_out_u8(priv, MESSAGE_REQUEST_BBREG, 0x0a, priv->bb_rx_conf); } -void BBvSetVGAGainOffset(struct vnt_private *priv, u8 data) +void vnt_set_vga_gain_offset(struct vnt_private *priv, u8 data) { vnt_control_out_u8(priv, MESSAGE_REQUEST_BBREG, 0xE7, data); /* patch for 3253B0 Baseband with Cardbus module */ - if (priv->bShortSlotTime) - priv->byBBRxConf &= 0xdf; /* 1101 1111 */ + if (priv->short_slot_time) + priv->bb_rx_conf &= 0xdf; /* 1101 1111 */ else - priv->byBBRxConf |= 0x20; /* 0010 0000 */ + priv->bb_rx_conf |= 0x20; /* 0010 0000 */ - vnt_control_out_u8(priv, MESSAGE_REQUEST_BBREG, 0x0a, priv->byBBRxConf); + vnt_control_out_u8(priv, MESSAGE_REQUEST_BBREG, 0x0a, priv->bb_rx_conf); } /* - * Description: BBvSetDeepSleep + * Description: vnt_set_deep_sleep * * Parameters: * In: @@ -1109,24 +553,24 @@ void BBvSetVGAGainOffset(struct vnt_private *priv, u8 data) * Return Value: none * */ -void BBvSetDeepSleep(struct vnt_private *priv) +void vnt_set_deep_sleep(struct vnt_private *priv) { vnt_control_out_u8(priv, MESSAGE_REQUEST_BBREG, 0x0c, 0x17);/* CR12 */ vnt_control_out_u8(priv, MESSAGE_REQUEST_BBREG, 0x0d, 0xB9);/* CR13 */ } -void BBvExitDeepSleep(struct vnt_private *priv) +void vnt_exit_deep_sleep(struct vnt_private *priv) { vnt_control_out_u8(priv, MESSAGE_REQUEST_BBREG, 0x0c, 0x00);/* CR12 */ vnt_control_out_u8(priv, MESSAGE_REQUEST_BBREG, 0x0d, 0x01);/* CR13 */ } -void BBvUpdatePreEDThreshold(struct vnt_private *priv, int scanning) +void vnt_update_pre_ed_threshold(struct vnt_private *priv, int scanning) { u8 cr_201 = 0x0, cr_206 = 0x0; - u8 ed_inx = priv->byBBPreEDIndex; + u8 ed_inx = priv->bb_pre_ed_index; - switch (priv->byRFType) { + switch (priv->rf_type) { case RF_AL2230: case RF_AL2230S: case RF_AIROHA7230: @@ -1136,69 +580,69 @@ void BBvUpdatePreEDThreshold(struct vnt_private *priv, int scanning) break; } - if (priv->byBBPreEDRSSI <= 45) { + if (priv->bb_pre_ed_rssi <= 45) { ed_inx = 20; cr_201 = 0xff; - } else if (priv->byBBPreEDRSSI <= 46) { + } else if (priv->bb_pre_ed_rssi <= 46) { ed_inx = 19; cr_201 = 0x1a; - } else if (priv->byBBPreEDRSSI <= 47) { + } else if (priv->bb_pre_ed_rssi <= 47) { ed_inx = 18; cr_201 = 0x15; - } else if (priv->byBBPreEDRSSI <= 49) { + } else if (priv->bb_pre_ed_rssi <= 49) { ed_inx = 17; cr_201 = 0xe; - } else if (priv->byBBPreEDRSSI <= 51) { + } else if (priv->bb_pre_ed_rssi <= 51) { ed_inx = 16; cr_201 = 0x9; - } else if (priv->byBBPreEDRSSI <= 53) { + } else if (priv->bb_pre_ed_rssi <= 53) { ed_inx = 15; cr_201 = 0x6; - } else if (priv->byBBPreEDRSSI <= 55) { + } else if (priv->bb_pre_ed_rssi <= 55) { ed_inx = 14; cr_201 = 0x3; - } else if (priv->byBBPreEDRSSI <= 56) { + } else if (priv->bb_pre_ed_rssi <= 56) { ed_inx = 13; cr_201 = 0x2; cr_206 = 0xa0; - } else if (priv->byBBPreEDRSSI <= 57) { + } else if (priv->bb_pre_ed_rssi <= 57) { ed_inx = 12; cr_201 = 0x2; cr_206 = 0x20; - } else if (priv->byBBPreEDRSSI <= 58) { + } else if (priv->bb_pre_ed_rssi <= 58) { ed_inx = 11; cr_201 = 0x1; cr_206 = 0xa0; - } else if (priv->byBBPreEDRSSI <= 59) { + } else if (priv->bb_pre_ed_rssi <= 59) { ed_inx = 10; cr_201 = 0x1; cr_206 = 0x54; - } else if (priv->byBBPreEDRSSI <= 60) { + } else if (priv->bb_pre_ed_rssi <= 60) { ed_inx = 9; cr_201 = 0x1; cr_206 = 0x18; - } else if (priv->byBBPreEDRSSI <= 61) { + } else if (priv->bb_pre_ed_rssi <= 61) { ed_inx = 8; cr_206 = 0xe3; - } else if (priv->byBBPreEDRSSI <= 62) { + } else if (priv->bb_pre_ed_rssi <= 62) { ed_inx = 7; cr_206 = 0xb9; - } else if (priv->byBBPreEDRSSI <= 63) { + } else if (priv->bb_pre_ed_rssi <= 63) { ed_inx = 6; cr_206 = 0x93; - } else if (priv->byBBPreEDRSSI <= 64) { + } else if (priv->bb_pre_ed_rssi <= 64) { ed_inx = 5; cr_206 = 0x79; - } else if (priv->byBBPreEDRSSI <= 65) { + } else if (priv->bb_pre_ed_rssi <= 65) { ed_inx = 4; cr_206 = 0x62; - } else if (priv->byBBPreEDRSSI <= 66) { + } else if (priv->bb_pre_ed_rssi <= 66) { ed_inx = 3; cr_206 = 0x51; - } else if (priv->byBBPreEDRSSI <= 67) { + } else if (priv->bb_pre_ed_rssi <= 67) { ed_inx = 2; cr_206 = 0x43; - } else if (priv->byBBPreEDRSSI <= 68) { + } else if (priv->bb_pre_ed_rssi <= 68) { ed_inx = 1; cr_206 = 0x36; } else { @@ -1215,75 +659,75 @@ void BBvUpdatePreEDThreshold(struct vnt_private *priv, int scanning) break; } - if (priv->byBBPreEDRSSI <= 41) { + if (priv->bb_pre_ed_rssi <= 41) { ed_inx = 22; cr_201 = 0xff; - } else if (priv->byBBPreEDRSSI <= 42) { + } else if (priv->bb_pre_ed_rssi <= 42) { ed_inx = 21; cr_201 = 0x36; - } else if (priv->byBBPreEDRSSI <= 43) { + } else if (priv->bb_pre_ed_rssi <= 43) { ed_inx = 20; cr_201 = 0x26; - } else if (priv->byBBPreEDRSSI <= 45) { + } else if (priv->bb_pre_ed_rssi <= 45) { ed_inx = 19; cr_201 = 0x18; - } else if (priv->byBBPreEDRSSI <= 47) { + } else if (priv->bb_pre_ed_rssi <= 47) { ed_inx = 18; cr_201 = 0x11; - } else if (priv->byBBPreEDRSSI <= 49) { + } else if (priv->bb_pre_ed_rssi <= 49) { ed_inx = 17; cr_201 = 0xa; - } else if (priv->byBBPreEDRSSI <= 51) { + } else if (priv->bb_pre_ed_rssi <= 51) { ed_inx = 16; cr_201 = 0x7; - } else if (priv->byBBPreEDRSSI <= 53) { + } else if (priv->bb_pre_ed_rssi <= 53) { ed_inx = 15; cr_201 = 0x4; - } else if (priv->byBBPreEDRSSI <= 55) { + } else if (priv->bb_pre_ed_rssi <= 55) { ed_inx = 14; cr_201 = 0x2; cr_206 = 0xc0; - } else if (priv->byBBPreEDRSSI <= 56) { + } else if (priv->bb_pre_ed_rssi <= 56) { ed_inx = 13; cr_201 = 0x2; cr_206 = 0x30; - } else if (priv->byBBPreEDRSSI <= 57) { + } else if (priv->bb_pre_ed_rssi <= 57) { ed_inx = 12; cr_201 = 0x1; cr_206 = 0xb0; - } else if (priv->byBBPreEDRSSI <= 58) { + } else if (priv->bb_pre_ed_rssi <= 58) { ed_inx = 11; cr_201 = 0x1; cr_206 = 0x70; - } else if (priv->byBBPreEDRSSI <= 59) { + } else if (priv->bb_pre_ed_rssi <= 59) { ed_inx = 10; cr_201 = 0x1; cr_206 = 0x30; - } else if (priv->byBBPreEDRSSI <= 60) { + } else if (priv->bb_pre_ed_rssi <= 60) { ed_inx = 9; cr_206 = 0xea; - } else if (priv->byBBPreEDRSSI <= 61) { + } else if (priv->bb_pre_ed_rssi <= 61) { ed_inx = 8; cr_206 = 0xc0; - } else if (priv->byBBPreEDRSSI <= 62) { + } else if (priv->bb_pre_ed_rssi <= 62) { ed_inx = 7; cr_206 = 0x9c; - } else if (priv->byBBPreEDRSSI <= 63) { + } else if (priv->bb_pre_ed_rssi <= 63) { ed_inx = 6; cr_206 = 0x80; - } else if (priv->byBBPreEDRSSI <= 64) { + } else if (priv->bb_pre_ed_rssi <= 64) { ed_inx = 5; cr_206 = 0x68; - } else if (priv->byBBPreEDRSSI <= 65) { + } else if (priv->bb_pre_ed_rssi <= 65) { ed_inx = 4; cr_206 = 0x52; - } else if (priv->byBBPreEDRSSI <= 66) { + } else if (priv->bb_pre_ed_rssi <= 66) { ed_inx = 3; cr_206 = 0x43; - } else if (priv->byBBPreEDRSSI <= 67) { + } else if (priv->bb_pre_ed_rssi <= 67) { ed_inx = 2; cr_206 = 0x36; - } else if (priv->byBBPreEDRSSI <= 68) { + } else if (priv->bb_pre_ed_rssi <= 68) { ed_inx = 1; cr_206 = 0x2d; } else { @@ -1299,69 +743,69 @@ void BBvUpdatePreEDThreshold(struct vnt_private *priv, int scanning) break; } - if (priv->byBBPreEDRSSI <= 41) { + if (priv->bb_pre_ed_rssi <= 41) { ed_inx = 20; cr_201 = 0xff; - } else if (priv->byBBPreEDRSSI <= 42) { + } else if (priv->bb_pre_ed_rssi <= 42) { ed_inx = 19; cr_201 = 0x36; - } else if (priv->byBBPreEDRSSI <= 43) { + } else if (priv->bb_pre_ed_rssi <= 43) { ed_inx = 18; cr_201 = 0x26; - } else if (priv->byBBPreEDRSSI <= 45) { + } else if (priv->bb_pre_ed_rssi <= 45) { ed_inx = 17; cr_201 = 0x18; - } else if (priv->byBBPreEDRSSI <= 47) { + } else if (priv->bb_pre_ed_rssi <= 47) { ed_inx = 16; cr_201 = 0x11; - } else if (priv->byBBPreEDRSSI <= 49) { + } else if (priv->bb_pre_ed_rssi <= 49) { ed_inx = 15; cr_201 = 0xa; - } else if (priv->byBBPreEDRSSI <= 51) { + } else if (priv->bb_pre_ed_rssi <= 51) { ed_inx = 14; cr_201 = 0x7; - } else if (priv->byBBPreEDRSSI <= 53) { + } else if (priv->bb_pre_ed_rssi <= 53) { ed_inx = 13; cr_201 = 0x4; - } else if (priv->byBBPreEDRSSI <= 55) { + } else if (priv->bb_pre_ed_rssi <= 55) { ed_inx = 12; cr_201 = 0x2; cr_206 = 0xc0; - } else if (priv->byBBPreEDRSSI <= 56) { + } else if (priv->bb_pre_ed_rssi <= 56) { ed_inx = 11; cr_201 = 0x2; cr_206 = 0x30; - } else if (priv->byBBPreEDRSSI <= 57) { + } else if (priv->bb_pre_ed_rssi <= 57) { ed_inx = 10; cr_201 = 0x1; cr_206 = 0xb0; - } else if (priv->byBBPreEDRSSI <= 58) { + } else if (priv->bb_pre_ed_rssi <= 58) { ed_inx = 9; cr_201 = 0x1; cr_206 = 0x70; - } else if (priv->byBBPreEDRSSI <= 59) { + } else if (priv->bb_pre_ed_rssi <= 59) { ed_inx = 8; cr_201 = 0x1; cr_206 = 0x30; - } else if (priv->byBBPreEDRSSI <= 60) { + } else if (priv->bb_pre_ed_rssi <= 60) { ed_inx = 7; cr_206 = 0xea; - } else if (priv->byBBPreEDRSSI <= 61) { + } else if (priv->bb_pre_ed_rssi <= 61) { ed_inx = 6; cr_206 = 0xc0; - } else if (priv->byBBPreEDRSSI <= 62) { + } else if (priv->bb_pre_ed_rssi <= 62) { ed_inx = 5; cr_206 = 0x9c; - } else if (priv->byBBPreEDRSSI <= 63) { + } else if (priv->bb_pre_ed_rssi <= 63) { ed_inx = 4; cr_206 = 0x80; - } else if (priv->byBBPreEDRSSI <= 64) { + } else if (priv->bb_pre_ed_rssi <= 64) { ed_inx = 3; cr_206 = 0x68; - } else if (priv->byBBPreEDRSSI <= 65) { + } else if (priv->bb_pre_ed_rssi <= 65) { ed_inx = 2; cr_206 = 0x52; - } else if (priv->byBBPreEDRSSI <= 66) { + } else if (priv->bb_pre_ed_rssi <= 66) { ed_inx = 1; cr_206 = 0x43; } else { @@ -1372,13 +816,13 @@ void BBvUpdatePreEDThreshold(struct vnt_private *priv, int scanning) } - if (ed_inx == priv->byBBPreEDIndex && !scanning) + if (ed_inx == priv->bb_pre_ed_index && !scanning) return; - priv->byBBPreEDIndex = ed_inx; + priv->bb_pre_ed_index = ed_inx; - dev_dbg(&priv->usb->dev, "%s byBBPreEDRSSI %d\n", - __func__, priv->byBBPreEDRSSI); + dev_dbg(&priv->usb->dev, "%s bb_pre_ed_rssi %d\n", + __func__, priv->bb_pre_ed_rssi); if (!cr_201 && !cr_206) return; diff --git a/drivers/staging/vt6656/baseband.h b/drivers/staging/vt6656/baseband.h index 3044d6c42050..771ea4054174 100644 --- a/drivers/staging/vt6656/baseband.h +++ b/drivers/staging/vt6656/baseband.h @@ -33,7 +33,6 @@ #ifndef __BASEBAND_H__ #define __BASEBAND_H__ -#include "tether.h" #include "device.h" #define PREAMBLE_LONG 0 @@ -88,18 +87,18 @@ struct vnt_phy_field { __le16 len; } __packed; -unsigned int BBuGetFrameTime(u8 preamble_type, u8 pkt_type, +unsigned int vnt_get_frame_time(u8 preamble_type, u8 pkt_type, unsigned int frame_length, u16 tx_rate); -void BBvCalculateParameter(struct vnt_private *, u32 frame_length, +void vnt_get_phy_field(struct vnt_private *, u32 frame_length, u16 tx_rate, u8 pkt_type, struct vnt_phy_field *); -void BBvSetShortSlotTime(struct vnt_private *); -void BBvSetVGAGainOffset(struct vnt_private *, u8 byData); -void BBvSetAntennaMode(struct vnt_private *, u8 byAntennaMode); -int BBbVT3184Init(struct vnt_private *); -void BBvSetDeepSleep(struct vnt_private *); -void BBvExitDeepSleep(struct vnt_private *); -void BBvUpdatePreEDThreshold(struct vnt_private *, int scanning); +void vnt_set_short_slot_time(struct vnt_private *); +void vnt_set_vga_gain_offset(struct vnt_private *, u8); +void vnt_set_antenna_mode(struct vnt_private *, u8); +int vnt_vt3184_init(struct vnt_private *); +void vnt_set_deep_sleep(struct vnt_private *); +void vnt_exit_deep_sleep(struct vnt_private *); +void vnt_update_pre_ed_threshold(struct vnt_private *, int scanning); #endif /* __BASEBAND_H__ */ diff --git a/drivers/staging/vt6656/bssdb.c b/drivers/staging/vt6656/bssdb.c deleted file mode 100644 index 8e9ce96442a0..000000000000 --- a/drivers/staging/vt6656/bssdb.c +++ /dev/null @@ -1,1466 +0,0 @@ -/* - * Copyright (c) 1996, 2003 VIA Networking Technologies, Inc. - * All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - * - * File: bssdb.c - * - * Purpose: Handles the Basic Service Set & Node Database functions - * - * Functions: - * BSSpSearchBSSList - Search known BSS list for Desire SSID or BSSID - * BSSvClearBSSList - Clear BSS List - * BSSbInsertToBSSList - Insert a BSS set into known BSS list - * BSSbUpdateToBSSList - Update BSS set in known BSS list - * BSSbIsSTAInNodeDB - Search Node DB table to find the index of matched DstAddr - * BSSvCreateOneNode - Allocate an Node for Node DB - * BSSvUpdateAPNode - Update AP Node content in Index 0 of KnownNodeDB - * BSSvSecondCallBack - One second timer callback function to update Node DB info & AP link status - * BSSvUpdateNodeTxCounter - Update Tx attemps, Tx failure counter in Node DB for auto-fallback rate control - * - * Revision History: - * - * Author: Lyndon Chen - * - * Date: July 17, 2002 - */ - -#include "tmacro.h" -#include "tether.h" -#include "device.h" -#include "80211hdr.h" -#include "bssdb.h" -#include "wmgr.h" -#include "datarate.h" -#include "desc.h" -#include "wcmd.h" -#include "wpa.h" -#include "baseband.h" -#include "rf.h" -#include "card.h" -#include "mac.h" -#include "wpa2.h" -#include "usbpipe.h" -#include "iowpa.h" -#include "power.h" - -static int msglevel = MSG_LEVEL_INFO; -/* static int msglevel = MSG_LEVEL_DEBUG; */ - -static const u16 awHWRetry0[5][5] = { - {RATE_18M, RATE_18M, RATE_12M, RATE_12M, RATE_12M}, - {RATE_24M, RATE_24M, RATE_18M, RATE_12M, RATE_12M}, - {RATE_36M, RATE_36M, RATE_24M, RATE_18M, RATE_18M}, - {RATE_48M, RATE_48M, RATE_36M, RATE_24M, RATE_24M}, - {RATE_54M, RATE_54M, RATE_48M, RATE_36M, RATE_36M} - }; -static const u16 awHWRetry1[5][5] = { - {RATE_18M, RATE_18M, RATE_12M, RATE_6M, RATE_6M}, - {RATE_24M, RATE_24M, RATE_18M, RATE_6M, RATE_6M}, - {RATE_36M, RATE_36M, RATE_24M, RATE_12M, RATE_12M}, - {RATE_48M, RATE_48M, RATE_24M, RATE_12M, RATE_12M}, - {RATE_54M, RATE_54M, RATE_36M, RATE_18M, RATE_18M} - }; - -static void s_vCheckSensitivity(struct vnt_private *pDevice); -static void s_vCheckPreEDThreshold(struct vnt_private *pDevice); -static void s_uCalculateLinkQual(struct vnt_private *pDevice); - -/* - * Routine Description: - * Search known BSS list for Desire SSID or BSSID. - * - * Return Value: - * PTR to KnownBSS or NULL - */ -PKnownBSS BSSpSearchBSSList(struct vnt_private *pDevice, - u8 *pbyDesireBSSID, u8 *pbyDesireSSID, - CARD_PHY_TYPE ePhyType) -{ - struct vnt_manager *pMgmt = &pDevice->vnt_mgmt; - u8 *pbyBSSID = NULL; - PWLAN_IE_SSID pSSID = NULL; - PKnownBSS pCurrBSS = NULL; - PKnownBSS pSelect = NULL; - u8 ZeroBSSID[WLAN_BSSID_LEN] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; - int ii = 0; - int jj = 0; - - if (pbyDesireBSSID) { - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO - "BSSpSearchBSSList BSSID[%pM]\n", pbyDesireBSSID); - if (!is_broadcast_ether_addr(pbyDesireBSSID) && - memcmp(pbyDesireBSSID, ZeroBSSID, 6) != 0) - pbyBSSID = pbyDesireBSSID; - } - if (pbyDesireSSID && - ((PWLAN_IE_SSID) pbyDesireSSID)->len != 0) - pSSID = (PWLAN_IE_SSID) pbyDesireSSID; - - if (pbyBSSID && pDevice->bRoaming == false) { - /* match BSSID first */ - for (ii = 0; ii < MAX_BSS_NUM; ii++) { - pCurrBSS = &(pMgmt->sBSSList[ii]); - - pCurrBSS->bSelected = false; - - if (pCurrBSS->bActive && - pCurrBSS->bSelected == false && - ether_addr_equal(pCurrBSS->abyBSSID, pbyBSSID)) { - if (pSSID) { - /* compare ssid */ - if (!memcmp(pSSID->abySSID, - ((PWLAN_IE_SSID) pCurrBSS->abySSID)->abySSID, - pSSID->len) && - (pMgmt->eConfigMode == WMAC_CONFIG_AUTO || - (pMgmt->eConfigMode == WMAC_CONFIG_IBSS_STA && - WLAN_GET_CAP_INFO_IBSS(pCurrBSS->wCapInfo)) || - (pMgmt->eConfigMode == WMAC_CONFIG_ESS_STA && - WLAN_GET_CAP_INFO_ESS(pCurrBSS->wCapInfo)))) { - - pCurrBSS->bSelected = true; - return pCurrBSS; - } - } else if (pMgmt->eConfigMode == WMAC_CONFIG_AUTO || - (pMgmt->eConfigMode == WMAC_CONFIG_IBSS_STA && - WLAN_GET_CAP_INFO_IBSS(pCurrBSS->wCapInfo)) || - (pMgmt->eConfigMode == WMAC_CONFIG_ESS_STA && - WLAN_GET_CAP_INFO_ESS(pCurrBSS->wCapInfo))) { - pCurrBSS->bSelected = true; - return pCurrBSS; - } - } - } - } else { - /* ignore BSSID */ - for (ii = 0; ii < MAX_BSS_NUM; ii++) { - pCurrBSS = &(pMgmt->sBSSList[ii]); - - /* 2007-0721-01<Mark>by MikeLiu - * if ((pCurrBSS->bActive) && - * (pCurrBSS->bSelected == false)) { */ - - pCurrBSS->bSelected = false; - if (pCurrBSS->bActive) { - - if (pSSID && - /* matched SSID */ - (memcmp(pSSID->abySSID, - ((PWLAN_IE_SSID) pCurrBSS->abySSID)->abySSID, - pSSID->len) || - pSSID->len != - ((PWLAN_IE_SSID) pCurrBSS->abySSID)->len)) { - /* SSID not match skip this BSS */ - continue; - } - - if ((pMgmt->eConfigMode == WMAC_CONFIG_IBSS_STA && - WLAN_GET_CAP_INFO_ESS(pCurrBSS->wCapInfo)) || - (pMgmt->eConfigMode == WMAC_CONFIG_ESS_STA && - WLAN_GET_CAP_INFO_IBSS(pCurrBSS->wCapInfo))) { - /* Type not match skip this BSS */ - DBG_PRT(MSG_LEVEL_DEBUG, - KERN_INFO "BSS type mismatch.... Config[%d] BSS[0x%04x]\n", - pMgmt->eConfigMode, - pCurrBSS->wCapInfo); - continue; - } - - if (ePhyType != PHY_TYPE_AUTO && - ((ePhyType == PHY_TYPE_11A && - PHY_TYPE_11A != pCurrBSS->eNetworkTypeInUse) || - (ePhyType != PHY_TYPE_11A && - PHY_TYPE_11A == pCurrBSS->eNetworkTypeInUse))) { - /* PhyType not match skip this BSS */ - DBG_PRT(MSG_LEVEL_DEBUG, - KERN_INFO "Physical type mismatch.... ePhyType[%d] BSS[%d]\n", - ePhyType, - pCurrBSS->eNetworkTypeInUse); - continue; - } - - pMgmt->pSameBSS[jj].uChannel = pCurrBSS->uChannel; - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO - "BSSpSearchBSSList pSelect1[%pM]\n", - pCurrBSS->abyBSSID); - jj++; - - if (!pSelect) - pSelect = pCurrBSS; - /* compare RSSI, select the strongest signal */ - else if (pCurrBSS->uRSSI < pSelect->uRSSI) - pSelect = pCurrBSS; - } - } - - pDevice->bSameBSSMaxNum = jj; - - if (pSelect) { - pSelect->bSelected = true; - if (pDevice->bRoaming == false) { - /* Einsn Add @20070907 */ - memcpy(pbyDesireSSID, - pCurrBSS->abySSID, - WLAN_IEHDR_LEN + WLAN_SSID_MAXLEN + 1); - } - - return pSelect; - } - } - return NULL; - -} - -/* - * Routine Description: - * Clear BSS List - * - * Return Value: - * None. - */ -void BSSvClearBSSList(struct vnt_private *pDevice, int bKeepCurrBSSID) -{ - struct vnt_manager *pMgmt = &pDevice->vnt_mgmt; - int ii; - - for (ii = 0; ii < MAX_BSS_NUM; ii++) { - if (bKeepCurrBSSID && - pMgmt->sBSSList[ii].bActive && - ether_addr_equal(pMgmt->sBSSList[ii].abyBSSID, - pMgmt->abyCurrBSSID)) { - - /* mike mark: - * there are two BSSID's in list. If that AP is - * in hidden ssid mode, one SSID is null, but - * other's might not be obvious, so if it - * associate's with your STA, you must keep the - * two of them!! bKeepCurrBSSID = false; - */ - - continue; - } - - pMgmt->sBSSList[ii].bActive = false; - memset(&pMgmt->sBSSList[ii], 0, sizeof(KnownBSS)); - } - BSSvClearAnyBSSJoinRecord(pDevice); -} - -/* - * Routine Description: - * search BSS list by BSSID & SSID if matched - * - * Return Value: - * true if found. - */ -PKnownBSS BSSpAddrIsInBSSList(struct vnt_private *pDevice, - u8 *abyBSSID, - PWLAN_IE_SSID pSSID) -{ - struct vnt_manager *pMgmt = &pDevice->vnt_mgmt; - PKnownBSS pBSSList = NULL; - int ii; - - for (ii = 0; ii < MAX_BSS_NUM; ii++) { - pBSSList = &(pMgmt->sBSSList[ii]); - if (pBSSList->bActive && - ether_addr_equal(pBSSList->abyBSSID, abyBSSID) && - pSSID->len == ((PWLAN_IE_SSID) pBSSList->abySSID)->len && - memcmp(pSSID->abySSID, - ((PWLAN_IE_SSID) pBSSList->abySSID)->abySSID, - pSSID->len) == 0) - return pBSSList; - } - - return NULL; -} - -/* - * Routine Description: - * Insert a BSS set into known BSS list - * - * Return Value: - * true if success. - */ -int BSSbInsertToBSSList(struct vnt_private *pDevice, - u8 *abyBSSIDAddr, - u64 qwTimestamp, - u16 wBeaconInterval, - u16 wCapInfo, - u8 byCurrChannel, - PWLAN_IE_SSID pSSID, - PWLAN_IE_SUPP_RATES pSuppRates, - PWLAN_IE_SUPP_RATES pExtSuppRates, - PERPObject psERP, - PWLAN_IE_RSN pRSN, - PWLAN_IE_RSN_EXT pRSNWPA, - PWLAN_IE_COUNTRY pIE_Country, - PWLAN_IE_QUIET pIE_Quiet, - u32 uIELength, - u8 *pbyIEs, - void *pRxPacketContext) -{ - struct vnt_manager *pMgmt = &pDevice->vnt_mgmt; - struct vnt_rx_mgmt *pRxPacket = - (struct vnt_rx_mgmt *) pRxPacketContext; - PKnownBSS pBSSList = NULL; - unsigned int ii; - bool bParsingQuiet = false; - - pBSSList = (PKnownBSS) &(pMgmt->sBSSList[0]); - - for (ii = 0; ii < MAX_BSS_NUM; ii++) { - pBSSList = (PKnownBSS) &(pMgmt->sBSSList[ii]); - if (!pBSSList->bActive) - break; - } - - if (ii == MAX_BSS_NUM) { - DBG_PRT(MSG_LEVEL_DEBUG, - KERN_INFO "Get free KnowBSS node failed.\n"); - return false; - } - /* save the BSS info */ - pBSSList->bActive = true; - memcpy(pBSSList->abyBSSID, abyBSSIDAddr, WLAN_BSSID_LEN); - pBSSList->qwBSSTimestamp = cpu_to_le64(qwTimestamp); - pBSSList->wBeaconInterval = cpu_to_le16(wBeaconInterval); - pBSSList->wCapInfo = cpu_to_le16(wCapInfo); - pBSSList->uClearCount = 0; - - if (pSSID->len > WLAN_SSID_MAXLEN) - pSSID->len = WLAN_SSID_MAXLEN; - memcpy(pBSSList->abySSID, pSSID, pSSID->len + WLAN_IEHDR_LEN); - - pBSSList->uChannel = byCurrChannel; - - if (pSuppRates->len > WLAN_RATES_MAXLEN) - pSuppRates->len = WLAN_RATES_MAXLEN; - memcpy(pBSSList->abySuppRates, pSuppRates, - pSuppRates->len + WLAN_IEHDR_LEN); - - if (pExtSuppRates) { - if (pExtSuppRates->len > WLAN_RATES_MAXLEN) - pExtSuppRates->len = WLAN_RATES_MAXLEN; - memcpy(pBSSList->abyExtSuppRates, pExtSuppRates, - pExtSuppRates->len + WLAN_IEHDR_LEN); - DBG_PRT(MSG_LEVEL_DEBUG, - KERN_INFO "BSSbInsertToBSSList: pExtSuppRates->len = %d\n", - pExtSuppRates->len); - - } else { - memset(pBSSList->abyExtSuppRates, 0, - WLAN_IEHDR_LEN + WLAN_RATES_MAXLEN + 1); - } - pBSSList->sERP.byERP = psERP->byERP; - pBSSList->sERP.bERPExist = psERP->bERPExist; - - /* Check if BSS is 802.11a/b/g */ - if (pBSSList->uChannel > CB_MAX_CHANNEL_24G) - pBSSList->eNetworkTypeInUse = PHY_TYPE_11A; - else if (pBSSList->sERP.bERPExist == true) - pBSSList->eNetworkTypeInUse = PHY_TYPE_11G; - else - pBSSList->eNetworkTypeInUse = PHY_TYPE_11B; - - pBSSList->byRxRate = pRxPacket->byRxRate; - pBSSList->qwLocalTSF = pRxPacket->qwLocalTSF; - pBSSList->uRSSI = pRxPacket->uRSSI; - pBSSList->bySQ = pRxPacket->bySQ; - - if (pMgmt->eCurrMode == WMAC_MODE_ESS_STA && - pMgmt->eCurrState == WMAC_STATE_ASSOC && - /* assoc with BSS */ - pBSSList == pMgmt->pCurrBSS) - bParsingQuiet = true; - - WPA_ClearRSN(pBSSList); - - if (pRSNWPA) { - unsigned int uLen = pRSNWPA->len + 2; - - if (uLen <= (uIELength - - (unsigned int) (u32) ((u8 *) pRSNWPA - pbyIEs))) { - pBSSList->wWPALen = uLen; - memcpy(pBSSList->byWPAIE, pRSNWPA, uLen); - WPA_ParseRSN(pBSSList, pRSNWPA); - } - } - - WPA2_ClearRSN(pBSSList); - - if (pRSN) { - unsigned int uLen = pRSN->len + 2; - - if (uLen <= (uIELength - - (unsigned int) (u32) ((u8 *) pRSN - pbyIEs))) { - pBSSList->wRSNLen = uLen; - memcpy(pBSSList->byRSNIE, pRSN, uLen); - WPA2vParseRSN(pBSSList, pRSN); - } - } - - if (pMgmt->eAuthenMode == WMAC_AUTH_WPA2 || - pBSSList->bWPA2Valid == true) { - - PSKeyItem pTransmitKey = NULL; - bool bIs802_1x = false; - - for (ii = 0; ii < pBSSList->wAKMSSAuthCount; ii++) { - if (pBSSList->abyAKMSSAuthType[ii] == - WLAN_11i_AKMSS_802_1X) { - bIs802_1x = true; - break; - } - } - if (bIs802_1x == true && - pSSID->len == ((PWLAN_IE_SSID) pMgmt->abyDesireSSID)->len && - !memcmp(pSSID->abySSID, - ((PWLAN_IE_SSID) pMgmt->abyDesireSSID)->abySSID, - pSSID->len)) { - - bAdd_PMKID_Candidate((void *) pDevice, - pBSSList->abyBSSID, - &pBSSList->sRSNCapObj); - - if (pDevice->bLinkPass == true && - pMgmt->eCurrState == WMAC_STATE_ASSOC && - (KeybGetTransmitKey(&(pDevice->sKey), - pDevice->abyBSSID, - PAIRWISE_KEY, - &pTransmitKey) == true || - KeybGetTransmitKey(&(pDevice->sKey), - pDevice->abyBSSID, - GROUP_KEY, - &pTransmitKey) == true)) { - pDevice->gsPMKIDCandidate.StatusType = - Ndis802_11StatusType_PMKID_CandidateList; - pDevice->gsPMKIDCandidate.Version = 1; - - - } - } - } - - /* Monitor if RSSI is too strong. */ - pBSSList->byRSSIStatCnt = 0; - - vnt_rf_rssi_to_dbm(pDevice, (u8)pRxPacket->uRSSI, &pBSSList->ldBmMAX); - - pBSSList->ldBmAverage[0] = pBSSList->ldBmMAX; - pBSSList->ldBmAverRange = pBSSList->ldBmMAX; - for (ii = 1; ii < RSSI_STAT_COUNT; ii++) - pBSSList->ldBmAverage[ii] = 0; - - pBSSList->uIELength = uIELength; - if (pBSSList->uIELength > WLAN_BEACON_FR_MAXLEN) - pBSSList->uIELength = WLAN_BEACON_FR_MAXLEN; - memcpy(pBSSList->abyIEs, pbyIEs, pBSSList->uIELength); - - return true; -} - -/* - * Routine Description: - * Update BSS set in known BSS list - * - * Return Value: - * true if success. - */ -/* TODO: input structure modify */ -int BSSbUpdateToBSSList(struct vnt_private *pDevice, - u64 qwTimestamp, - u16 wBeaconInterval, - u16 wCapInfo, - u8 byCurrChannel, - int bChannelHit, - PWLAN_IE_SSID pSSID, - PWLAN_IE_SUPP_RATES pSuppRates, - PWLAN_IE_SUPP_RATES pExtSuppRates, - PERPObject psERP, - PWLAN_IE_RSN pRSN, - PWLAN_IE_RSN_EXT pRSNWPA, - PWLAN_IE_COUNTRY pIE_Country, - PWLAN_IE_QUIET pIE_Quiet, - PKnownBSS pBSSList, - u32 uIELength, - u8 *pbyIEs, - void *pRxPacketContext) -{ - struct vnt_manager *pMgmt = &pDevice->vnt_mgmt; - struct vnt_rx_mgmt *pRxPacket = - (struct vnt_rx_mgmt *) pRxPacketContext; - int ii, jj; - signed long ldBm, ldBmSum; - bool bParsingQuiet = false; - - if (!pBSSList) - return false; - - pBSSList->qwBSSTimestamp = cpu_to_le64(qwTimestamp); - - pBSSList->wBeaconInterval = cpu_to_le16(wBeaconInterval); - pBSSList->wCapInfo = cpu_to_le16(wCapInfo); - pBSSList->uClearCount = 0; - pBSSList->uChannel = byCurrChannel; - - if (pSSID->len > WLAN_SSID_MAXLEN) - pSSID->len = WLAN_SSID_MAXLEN; - - if (pSSID->len != 0 && pSSID->abySSID[0] != 0) - memcpy(pBSSList->abySSID, pSSID, pSSID->len + WLAN_IEHDR_LEN); - memcpy(pBSSList->abySuppRates, pSuppRates, - pSuppRates->len + WLAN_IEHDR_LEN); - - if (pExtSuppRates) - memcpy(pBSSList->abyExtSuppRates, pExtSuppRates, - pExtSuppRates->len + WLAN_IEHDR_LEN); - else - memset(pBSSList->abyExtSuppRates, 0, - WLAN_IEHDR_LEN + WLAN_RATES_MAXLEN + 1); - pBSSList->sERP.byERP = psERP->byERP; - pBSSList->sERP.bERPExist = psERP->bERPExist; - - /* Check if BSS is 802.11a/b/g */ - if (pBSSList->uChannel > CB_MAX_CHANNEL_24G) - pBSSList->eNetworkTypeInUse = PHY_TYPE_11A; - else if (pBSSList->sERP.bERPExist == true) - pBSSList->eNetworkTypeInUse = PHY_TYPE_11G; - else - pBSSList->eNetworkTypeInUse = PHY_TYPE_11B; - - pBSSList->byRxRate = pRxPacket->byRxRate; - pBSSList->qwLocalTSF = pRxPacket->qwLocalTSF; - if (bChannelHit) - pBSSList->uRSSI = pRxPacket->uRSSI; - pBSSList->bySQ = pRxPacket->bySQ; - - if (pMgmt->eCurrMode == WMAC_MODE_ESS_STA && - pMgmt->eCurrState == WMAC_STATE_ASSOC && - /* assoc with BSS */ - pBSSList == pMgmt->pCurrBSS) - bParsingQuiet = true; - - WPA_ClearRSN(pBSSList); /* mike update */ - - if (pRSNWPA) { - unsigned int uLen = pRSNWPA->len + 2; - if (uLen <= (uIELength - - (unsigned int) (u32) ((u8 *) pRSNWPA - pbyIEs))) { - pBSSList->wWPALen = uLen; - memcpy(pBSSList->byWPAIE, pRSNWPA, uLen); - WPA_ParseRSN(pBSSList, pRSNWPA); - } - } - - WPA2_ClearRSN(pBSSList); /* mike update */ - - if (pRSN) { - unsigned int uLen = pRSN->len + 2; - if (uLen <= (uIELength - - (unsigned int) (u32) ((u8 *) pRSN - pbyIEs))) { - pBSSList->wRSNLen = uLen; - memcpy(pBSSList->byRSNIE, pRSN, uLen); - WPA2vParseRSN(pBSSList, pRSN); - } - } - - if (pRxPacket->uRSSI != 0) { - vnt_rf_rssi_to_dbm(pDevice, (u8)pRxPacket->uRSSI, &ldBm); - /* Monitor if RSSI is too strong. */ - pBSSList->byRSSIStatCnt++; - pBSSList->byRSSIStatCnt %= RSSI_STAT_COUNT; - pBSSList->ldBmAverage[pBSSList->byRSSIStatCnt] = ldBm; - ldBmSum = 0; - for (ii = 0, jj = 0; ii < RSSI_STAT_COUNT; ii++) { - if (pBSSList->ldBmAverage[ii] != 0) { - pBSSList->ldBmMAX = - max(pBSSList->ldBmAverage[ii], ldBm); - ldBmSum += - pBSSList->ldBmAverage[ii]; - jj++; - } - } - pBSSList->ldBmAverRange = ldBmSum / jj; - } - - pBSSList->uIELength = uIELength; - if (pBSSList->uIELength > WLAN_BEACON_FR_MAXLEN) - pBSSList->uIELength = WLAN_BEACON_FR_MAXLEN; - memcpy(pBSSList->abyIEs, pbyIEs, pBSSList->uIELength); - - return true; -} - -/* - * Routine Description: - * Search Node DB table to find the index of matched DstAddr - * - * Return Value: - * None - */ -int BSSbIsSTAInNodeDB(struct vnt_private *pDevice, - u8 *abyDstAddr, - u32 *puNodeIndex) -{ - struct vnt_manager *pMgmt = &pDevice->vnt_mgmt; - unsigned int ii; - - /* Index = 0 reserved for AP Node */ - for (ii = 1; ii < (MAX_NODE_NUM + 1); ii++) { - if (pMgmt->sNodeDBTable[ii].bActive && - ether_addr_equal(abyDstAddr, - pMgmt->sNodeDBTable[ii].abyMACAddr)) { - *puNodeIndex = ii; - return true; - } - } - - return false; -}; - -/* - * Routine Description: - * Find an empty node and allocate it; if no empty node - * is found, then use the most inactive one. - * - * Return Value: - * None - */ -void BSSvCreateOneNode(struct vnt_private *pDevice, u32 *puNodeIndex) -{ - struct vnt_manager *pMgmt = &pDevice->vnt_mgmt; - int ii; - u32 BigestCount = 0; - u32 SelectIndex; - struct sk_buff *skb; - - /* Index = 0 reserved for AP Node (In STA mode) - Index = 0 reserved for Broadcast/MultiCast (In AP mode) */ - SelectIndex = 1; - for (ii = 1; ii < (MAX_NODE_NUM + 1); ii++) { - if (pMgmt->sNodeDBTable[ii].bActive) { - if (pMgmt->sNodeDBTable[ii].uInActiveCount > BigestCount) { - BigestCount = - pMgmt->sNodeDBTable[ii].uInActiveCount; - SelectIndex = ii; - } - } else { - break; - } - } - - /* if not found replace uInActiveCount with the largest one. */ - if (ii == (MAX_NODE_NUM + 1)) { - *puNodeIndex = SelectIndex; - DBG_PRT(MSG_LEVEL_DEBUG, - KERN_INFO "Replace inactive node = %d\n", SelectIndex); - /* clear ps buffer */ - if (pMgmt->sNodeDBTable[*puNodeIndex].sTxPSQueue.next) { - while ((skb = skb_dequeue(&pMgmt->sNodeDBTable[*puNodeIndex].sTxPSQueue))) - dev_kfree_skb(skb); - } - } else { - *puNodeIndex = ii; - } - - memset(&pMgmt->sNodeDBTable[*puNodeIndex], 0, sizeof(KnownNodeDB)); - pMgmt->sNodeDBTable[*puNodeIndex].bActive = true; - pMgmt->sNodeDBTable[*puNodeIndex].uRatePollTimeout = FALLBACK_POLL_SECOND; - /* for AP mode PS queue */ - skb_queue_head_init(&pMgmt->sNodeDBTable[*puNodeIndex].sTxPSQueue); - pMgmt->sNodeDBTable[*puNodeIndex].byAuthSequence = 0; - pMgmt->sNodeDBTable[*puNodeIndex].wEnQueueCnt = 0; - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Create node index = %d\n", ii); -} - -/* - * Routine Description: - * Remove Node by NodeIndex - * - * - * Return Value: - * None - */ -void BSSvRemoveOneNode(struct vnt_private *pDevice, u32 uNodeIndex) -{ - struct vnt_manager *pMgmt = &pDevice->vnt_mgmt; - u8 byMask[8] = {1, 2, 4, 8, 0x10, 0x20, 0x40, 0x80}; - struct sk_buff *skb; - - while ((skb = skb_dequeue(&pMgmt->sNodeDBTable[uNodeIndex].sTxPSQueue))) - dev_kfree_skb(skb); - /* clear context */ - memset(&pMgmt->sNodeDBTable[uNodeIndex], 0, sizeof(KnownNodeDB)); - /* clear tx bit map */ - pMgmt->abyPSTxMap[pMgmt->sNodeDBTable[uNodeIndex].wAID >> 3] &= - ~byMask[pMgmt->sNodeDBTable[uNodeIndex].wAID & 7]; -} - -/* - * Routine Description: - * Update AP Node content in Index 0 of KnownNodeDB - * - * - * Return Value: - * None - */ -void BSSvUpdateAPNode(struct vnt_private *pDevice, - u16 *pwCapInfo, - PWLAN_IE_SUPP_RATES pSuppRates, - PWLAN_IE_SUPP_RATES pExtSuppRates) -{ - struct vnt_manager *pMgmt = &pDevice->vnt_mgmt; - u32 uRateLen = WLAN_RATES_MAXLEN; - - memset(&pMgmt->sNodeDBTable[0], 0, sizeof(KnownNodeDB)); - - pMgmt->sNodeDBTable[0].bActive = true; - if (pDevice->byBBType == BB_TYPE_11B) - uRateLen = WLAN_RATES_MAXLEN_11B; - pMgmt->abyCurrSuppRates[1] = RATEuSetIE((PWLAN_IE_SUPP_RATES) pSuppRates, - (PWLAN_IE_SUPP_RATES) pMgmt->abyCurrSuppRates, - uRateLen); - pMgmt->abyCurrExtSuppRates[1] = RATEuSetIE((PWLAN_IE_SUPP_RATES) pExtSuppRates, - (PWLAN_IE_SUPP_RATES) pMgmt->abyCurrExtSuppRates, - uRateLen); - RATEvParseMaxRate((void *) pDevice, - (PWLAN_IE_SUPP_RATES) pMgmt->abyCurrSuppRates, - (PWLAN_IE_SUPP_RATES) pMgmt->abyCurrExtSuppRates, - true, - &(pMgmt->sNodeDBTable[0].wMaxBasicRate), - &(pMgmt->sNodeDBTable[0].wMaxSuppRate), - &(pMgmt->sNodeDBTable[0].wSuppRate), - &(pMgmt->sNodeDBTable[0].byTopCCKBasicRate), - &(pMgmt->sNodeDBTable[0].byTopOFDMBasicRate)); - memcpy(pMgmt->sNodeDBTable[0].abyMACAddr, pMgmt->abyCurrBSSID, - WLAN_ADDR_LEN); - pMgmt->sNodeDBTable[0].wTxDataRate = pMgmt->sNodeDBTable[0].wMaxSuppRate; - pMgmt->sNodeDBTable[0].bShortPreamble = - WLAN_GET_CAP_INFO_SHORTPREAMBLE(*pwCapInfo); - pMgmt->sNodeDBTable[0].uRatePollTimeout = FALLBACK_POLL_SECOND; - /* Auto rate fallback function initiation. - * RATEbInit(pDevice); */ - DBG_PRT(MSG_LEVEL_DEBUG, - KERN_INFO"pMgmt->sNodeDBTable[0].wTxDataRate = %d\n", - pMgmt->sNodeDBTable[0].wTxDataRate); - -} - -/* - * Routine Description: - * Add Multicast Node content in Index 0 of KnownNodeDB - * - * - * Return Value: - * None - */ -void BSSvAddMulticastNode(struct vnt_private *pDevice) -{ - struct vnt_manager *pMgmt = &pDevice->vnt_mgmt; - - memset(&pMgmt->sNodeDBTable[0], 0, sizeof(KnownNodeDB)); - - memset(pMgmt->sNodeDBTable[0].abyMACAddr, 0xff, WLAN_ADDR_LEN); - pMgmt->sNodeDBTable[0].bActive = true; - pMgmt->sNodeDBTable[0].bPSEnable = false; - skb_queue_head_init(&pMgmt->sNodeDBTable[0].sTxPSQueue); - RATEvParseMaxRate((void *) pDevice, - (PWLAN_IE_SUPP_RATES) pMgmt->abyCurrSuppRates, - (PWLAN_IE_SUPP_RATES) pMgmt->abyCurrExtSuppRates, - true, - &(pMgmt->sNodeDBTable[0].wMaxBasicRate), - &(pMgmt->sNodeDBTable[0].wMaxSuppRate), - &(pMgmt->sNodeDBTable[0].wSuppRate), - &(pMgmt->sNodeDBTable[0].byTopCCKBasicRate), - &(pMgmt->sNodeDBTable[0].byTopOFDMBasicRate)); - pMgmt->sNodeDBTable[0].wTxDataRate = pMgmt->sNodeDBTable[0].wMaxBasicRate; - pMgmt->sNodeDBTable[0].uRatePollTimeout = FALLBACK_POLL_SECOND; - -} - -/* - * Routine Description: - * - * - * Second call back function to update Node DB info & AP link status - * - * - * Return Value: - * none. - */ -void BSSvSecondCallBack(struct work_struct *work) -{ - struct vnt_private *pDevice = container_of(work, - struct vnt_private, second_callback_work.work); - struct vnt_manager *pMgmt = &pDevice->vnt_mgmt; - int ii; - PWLAN_IE_SSID pItemSSID, pCurrSSID; - u32 uSleepySTACnt = 0; - u32 uNonShortSlotSTACnt = 0; - u32 uLongPreambleSTACnt = 0; - - if (pDevice->Flags & fMP_DISCONNECTED) - return; - - pDevice->uAssocCount = 0; - - /* Power Saving Mode Tx Burst */ - if (pDevice->bEnablePSMode == true) { - pDevice->ulPSModeWaitTx++; - if (pDevice->ulPSModeWaitTx >= 2) { - pDevice->ulPSModeWaitTx = 0; - pDevice->bPSModeTxBurst = false; - } - } - - pDevice->byERPFlag &= - ~(WLAN_SET_ERP_BARKER_MODE(1) | WLAN_SET_ERP_NONERP_PRESENT(1)); - - if (pDevice->wUseProtectCntDown > 0) { - pDevice->wUseProtectCntDown--; - } else { - /* disable protect mode */ - pDevice->byERPFlag &= ~(WLAN_SET_ERP_USE_PROTECTION(1)); - } - - if (pDevice->byReAssocCount > 0) { - pDevice->byReAssocCount++; - if (pDevice->byReAssocCount > 10 && - pDevice->bLinkPass != true) { /* 10 sec timeout */ - printk("Re-association timeout!!!\n"); - pDevice->byReAssocCount = 0; - /* if (pDevice->bWPASuppWextEnabled == true) */ - { - union iwreq_data wrqu; - memset(&wrqu, 0, sizeof(wrqu)); - wrqu.ap_addr.sa_family = ARPHRD_ETHER; - PRINT_K("wireless_send_event--->SIOCGIWAP(disassociated)\n"); - wireless_send_event(pDevice->dev, SIOCGIWAP, - &wrqu, NULL); - } - } else if (pDevice->bLinkPass == true) { - pDevice->byReAssocCount = 0; - } - } - - pMgmt->eLastState = pMgmt->eCurrState; - - s_uCalculateLinkQual(pDevice); - - for (ii = 0; ii < (MAX_NODE_NUM + 1); ii++) { - - if (pMgmt->sNodeDBTable[ii].bActive) { - /* Increase in-activity counter */ - pMgmt->sNodeDBTable[ii].uInActiveCount++; - - if (ii > 0) { - if (pMgmt->sNodeDBTable[ii].uInActiveCount > - MAX_INACTIVE_COUNT) { - BSSvRemoveOneNode(pDevice, ii); - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO - "Inactive timeout [%d] sec, STA index = [%d] remove\n", - MAX_INACTIVE_COUNT, ii); - continue; - } - - if (pMgmt->sNodeDBTable[ii].eNodeState >= - NODE_ASSOC) { - - pDevice->uAssocCount++; - - /* check if Non ERP exist */ - if (pMgmt->sNodeDBTable[ii].uInActiveCount < - ERP_RECOVER_COUNT) { - if (!pMgmt->sNodeDBTable[ii].bShortPreamble) { - pDevice->byERPFlag |= - WLAN_SET_ERP_BARKER_MODE(1); - uLongPreambleSTACnt++; - } - if (!pMgmt->sNodeDBTable[ii].bERPExist) { - pDevice->byERPFlag |= - WLAN_SET_ERP_NONERP_PRESENT(1); - pDevice->byERPFlag |= - WLAN_SET_ERP_USE_PROTECTION(1); - } - if (!pMgmt->sNodeDBTable[ii].bShortSlotTime) - uNonShortSlotSTACnt++; - } - } - - /* check if any STA in PS mode */ - if (pMgmt->sNodeDBTable[ii].bPSEnable) - uSleepySTACnt++; - - } - - /* Rate fallback check */ - if (!pDevice->bFixRate) { - if (ii > 0) { - /* ii = 0 for multicast node (AP & Adhoc) */ - RATEvTxRateFallBack((void *) pDevice, - &(pMgmt->sNodeDBTable[ii])); - } else if (pMgmt->eCurrMode == WMAC_MODE_ESS_STA) { - /* ii = 0 reserved for unicast AP node (Infra STA) */ - RATEvTxRateFallBack((void *) pDevice, - &(pMgmt->sNodeDBTable[ii])); - } - - } - - /* check if pending PS queue */ - if (pMgmt->sNodeDBTable[ii].wEnQueueCnt != 0) { - DBG_PRT(MSG_LEVEL_DEBUG, - KERN_INFO "Index= %d, Queue = %d pending\n", - ii, - pMgmt->sNodeDBTable[ii].wEnQueueCnt); - if (ii > 0 && - pMgmt->sNodeDBTable[ii].wEnQueueCnt > 15) { - BSSvRemoveOneNode(pDevice, ii); - DBG_PRT(MSG_LEVEL_NOTICE, - KERN_INFO "Pending many queues PS STA Index = %d remove\n", - ii); - continue; - } - } - } - - } - - if (pMgmt->eCurrMode == WMAC_MODE_ESS_AP && - pDevice->byBBType == BB_TYPE_11G) { - - /* on/off protect mode */ - if (WLAN_GET_ERP_USE_PROTECTION(pDevice->byERPFlag)) { - if (!pDevice->bProtectMode) { - MACvEnableProtectMD(pDevice); - pDevice->bProtectMode = true; - } - } else if (pDevice->bProtectMode) { - MACvDisableProtectMD(pDevice); - pDevice->bProtectMode = false; - } - /* on/off short slot time */ - - if (uNonShortSlotSTACnt > 0) { - if (pDevice->bShortSlotTime) { - pDevice->bShortSlotTime = false; - BBvSetShortSlotTime(pDevice); - vUpdateIFS((void *) pDevice); - } - } else if (!pDevice->bShortSlotTime) { - pDevice->bShortSlotTime = true; - BBvSetShortSlotTime(pDevice); - vUpdateIFS((void *) pDevice); - } - - /* on/off barker long preamble mode */ - - if (uLongPreambleSTACnt > 0) { - if (!pDevice->bBarkerPreambleMd) { - MACvEnableBarkerPreambleMd(pDevice); - pDevice->bBarkerPreambleMd = true; - } - } else if (pDevice->bBarkerPreambleMd) { - MACvDisableBarkerPreambleMd(pDevice); - pDevice->bBarkerPreambleMd = false; - } - - } - - /* Check if any STA in PS mode, enable DTIM multicast deliver */ - if (pMgmt->eCurrMode == WMAC_MODE_ESS_AP) { - if (uSleepySTACnt > 0) - pMgmt->sNodeDBTable[0].bPSEnable = true; - else - pMgmt->sNodeDBTable[0].bPSEnable = false; - } - - pItemSSID = (PWLAN_IE_SSID) pMgmt->abyDesireSSID; - pCurrSSID = (PWLAN_IE_SSID) pMgmt->abyCurrSSID; - - if (pMgmt->eCurrMode == WMAC_MODE_STANDBY || - pMgmt->eCurrMode == WMAC_MODE_ESS_STA) { - - if (pMgmt->sNodeDBTable[0].bActive) { /* Assoc with BSS */ - - s_vCheckSensitivity(pDevice); - s_vCheckPreEDThreshold(pDevice); - - if (pMgmt->sNodeDBTable[0].uInActiveCount >= - (LOST_BEACON_COUNT/2) && - pDevice->byBBVGACurrent != pDevice->abyBBVGA[0]) { - pDevice->byBBVGANew = pDevice->abyBBVGA[0]; - bScheduleCommand((void *) pDevice, - WLAN_CMD_CHANGE_BBSENSITIVITY, - NULL); - } - - if (pMgmt->sNodeDBTable[0].uInActiveCount >= - LOST_BEACON_COUNT) { - pMgmt->sNodeDBTable[0].bActive = false; - pMgmt->eCurrMode = WMAC_MODE_STANDBY; - pMgmt->eCurrState = WMAC_STATE_IDLE; - netif_stop_queue(pDevice->dev); - pDevice->bLinkPass = false; - - vnt_mac_set_led(pDevice, LEDSTS_STS, - LEDSTS_SLOW); - - pDevice->bRoaming = true; - pDevice->bIsRoaming = false; - - DBG_PRT(MSG_LEVEL_NOTICE, - KERN_INFO "Lost AP beacon [%d] sec, disconnected !\n", - pMgmt->sNodeDBTable[0].uInActiveCount); - /* let wpa supplicant know AP may disconnect */ - { - union iwreq_data wrqu; - memset(&wrqu, 0, sizeof(wrqu)); - wrqu.ap_addr.sa_family = ARPHRD_ETHER; - PRINT_K("wireless_send_event--->SIOCGIWAP(disassociated)\n"); - wireless_send_event(pDevice->dev, - SIOCGIWAP, - &wrqu, - NULL); - } - } - } else if (pItemSSID->len != 0) { - /* Davidwang */ - if ((pDevice->bEnableRoaming == true) && - (!(pMgmt->Cisco_cckm))) { - DBG_PRT(MSG_LEVEL_DEBUG, - KERN_INFO "bRoaming %d, !\n", - pDevice->bRoaming); - DBG_PRT(MSG_LEVEL_DEBUG, - KERN_INFO "bIsRoaming %d, !\n", - pDevice->bIsRoaming); - if ((pDevice->bRoaming == true) && - (pDevice->bIsRoaming == true)) { - DBG_PRT(MSG_LEVEL_DEBUG, - KERN_INFO "Fast Roaming ...\n"); - BSSvClearBSSList((void *) pDevice, - pDevice->bLinkPass); - bScheduleCommand((void *) pDevice, - WLAN_CMD_BSSID_SCAN, - pMgmt->abyDesireSSID); - bScheduleCommand((void *) pDevice, - WLAN_CMD_SSID, - pMgmt->abyDesireSSID); - pDevice->uAutoReConnectTime = 0; - pDevice->uIsroamingTime = 0; - pDevice->bRoaming = false; - } else if (pDevice->bRoaming == false && - pDevice->bIsRoaming == true) { - pDevice->uIsroamingTime++; - if (pDevice->uIsroamingTime >= 20) - pDevice->bIsRoaming = false; - } - } else if (pDevice->uAutoReConnectTime < 10) { - pDevice->uAutoReConnectTime++; - /* network manager support need not do Roaming scan??? */ - if (pDevice->bWPASuppWextEnabled == true) - pDevice->uAutoReConnectTime = 0; - } else { - /* mike use old encryption status for wpa reauthen */ - if (pDevice->bWPADEVUp) - pDevice->eEncryptionStatus = - pDevice->eOldEncryptionStatus; - - DBG_PRT(MSG_LEVEL_DEBUG, - KERN_INFO "Roaming ...\n"); - BSSvClearBSSList((void *) pDevice, - pDevice->bLinkPass); - pMgmt->eScanType = WMAC_SCAN_ACTIVE; - bScheduleCommand((void *) pDevice, - WLAN_CMD_BSSID_SCAN, - pMgmt->abyDesireSSID); - bScheduleCommand((void *) pDevice, - WLAN_CMD_SSID, - pMgmt->abyDesireSSID); - pDevice->uAutoReConnectTime = 0; - } - } - } - - if (pMgmt->eCurrMode == WMAC_MODE_IBSS_STA) { - /* if adhoc started which essid is NULL string, rescanning. */ - if (pMgmt->eCurrState == WMAC_STATE_STARTED && - pCurrSSID->len == 0) { - if (pDevice->uAutoReConnectTime < 10) { - pDevice->uAutoReConnectTime++; - } else { - DBG_PRT(MSG_LEVEL_NOTICE, - KERN_INFO "Adhoc re-scanning ...\n"); - pMgmt->eScanType = WMAC_SCAN_ACTIVE; - bScheduleCommand((void *) pDevice, - WLAN_CMD_BSSID_SCAN, NULL); - bScheduleCommand((void *) pDevice, - WLAN_CMD_SSID, NULL); - pDevice->uAutoReConnectTime = 0; - } - } - if (pMgmt->eCurrState == WMAC_STATE_JOINTED) { - - s_vCheckSensitivity(pDevice); - s_vCheckPreEDThreshold(pDevice); - - if (pMgmt->sNodeDBTable[0].uInActiveCount >= - ADHOC_LOST_BEACON_COUNT) { - DBG_PRT(MSG_LEVEL_NOTICE, - KERN_INFO "Lost other STA beacon [%d] sec, started !\n", - pMgmt->sNodeDBTable[0].uInActiveCount); - pMgmt->sNodeDBTable[0].uInActiveCount = 0; - pMgmt->eCurrState = WMAC_STATE_STARTED; - netif_stop_queue(pDevice->dev); - pDevice->bLinkPass = false; - vnt_mac_set_led(pDevice, LEDSTS_STS, - LEDSTS_SLOW); - } - } - } - - if (pDevice->bLinkPass == true) { - if ((pMgmt->eAuthenMode < WMAC_AUTH_WPA || - pDevice->fWPA_Authened == true) && - (++pDevice->tx_data_time_out > 40)) { - pDevice->tx_trigger = true; - - PSbSendNullPacket(pDevice); - - pDevice->tx_trigger = false; - pDevice->tx_data_time_out = 0; - } - - if (netif_queue_stopped(pDevice->dev)) - netif_wake_queue(pDevice->dev); - } - - schedule_delayed_work(&pDevice->second_callback_work, HZ); -} - -/* - * Routine Description: - * - * - * Update Tx attemps, Tx failure counter in Node DB - * - * - * Return Value: - * none. - */ -void BSSvUpdateNodeTxCounter(struct vnt_private *pDevice, u8 byTSR, u8 byPktNO) -{ - struct vnt_manager *pMgmt = &pDevice->vnt_mgmt; - struct vnt_tx_pkt_info *pkt_info = pDevice->pkt_info; - u32 uNodeIndex = 0; - u8 byTxRetry; - u16 wRate; - u16 wFallBackRate = RATE_1M; - u8 byFallBack; - int ii; - u8 *pbyDestAddr; - u8 byPktNum; - u16 wFIFOCtl; - - byPktNum = (byPktNO & 0x0F) >> 4; - byTxRetry = (byTSR & 0xF0) >> 4; - wRate = (u16) (byPktNO & 0xF0) >> 4; - wFIFOCtl = pkt_info[byPktNum].fifo_ctl; - pbyDestAddr = pkt_info[byPktNum].dest_addr; - - if (wFIFOCtl & FIFOCTL_AUTO_FB_0) - byFallBack = AUTO_FB_0; - else if (wFIFOCtl & FIFOCTL_AUTO_FB_1) - byFallBack = AUTO_FB_1; - else - byFallBack = AUTO_FB_NONE; - - /* Only Unicast using support rates */ - if (wFIFOCtl & FIFOCTL_NEEDACK) { - if (pMgmt->eCurrMode == WMAC_MODE_ESS_STA) { - pMgmt->sNodeDBTable[0].uTxAttempts += 1; - if (!(byTSR & (TSR_TMO | TSR_RETRYTMO))) { - /* transmit success, TxAttempts at least plus one */ - pMgmt->sNodeDBTable[0].uTxOk[MAX_RATE]++; - if ((byFallBack == AUTO_FB_NONE) || - (wRate < RATE_18M)) { - wFallBackRate = wRate; - } else if (byFallBack == AUTO_FB_0) { - if (byTxRetry < 5) - wFallBackRate = - awHWRetry0[wRate-RATE_18M][byTxRetry]; - else - wFallBackRate = - awHWRetry0[wRate-RATE_18M][4]; - } else if (byFallBack == AUTO_FB_1) { - if (byTxRetry < 5) - wFallBackRate = - awHWRetry1[wRate-RATE_18M][byTxRetry]; - else - wFallBackRate = awHWRetry1[wRate-RATE_18M][4]; - } - pMgmt->sNodeDBTable[0].uTxOk[wFallBackRate]++; - } else { - pMgmt->sNodeDBTable[0].uTxFailures++; - } - pMgmt->sNodeDBTable[0].uTxRetry += byTxRetry; - if (byTxRetry != 0) { - pMgmt->sNodeDBTable[0].uTxFail[MAX_RATE] += byTxRetry; - if (byFallBack == AUTO_FB_NONE || - wRate < RATE_18M) { - pMgmt->sNodeDBTable[0].uTxFail[wRate] += byTxRetry; - } else if (byFallBack == AUTO_FB_0) { - for (ii = 0; ii < byTxRetry; ii++) { - if (ii < 5) - wFallBackRate = - awHWRetry0[wRate-RATE_18M][ii]; - else - wFallBackRate = - awHWRetry0[wRate-RATE_18M][4]; - pMgmt->sNodeDBTable[0].uTxFail[wFallBackRate]++; - } - } else if (byFallBack == AUTO_FB_1) { - for (ii = 0; ii < byTxRetry; ii++) { - if (ii < 5) - wFallBackRate = - awHWRetry1[wRate-RATE_18M][ii]; - else - wFallBackRate = - awHWRetry1[wRate-RATE_18M][4]; - pMgmt->sNodeDBTable[0].uTxFail[wFallBackRate]++; - } - } - } - } - - if ((pMgmt->eCurrMode == WMAC_MODE_IBSS_STA || - pMgmt->eCurrMode == WMAC_MODE_ESS_AP) && - BSSbIsSTAInNodeDB((void *) pDevice, - pbyDestAddr, - &uNodeIndex)) { - pMgmt->sNodeDBTable[uNodeIndex].uTxAttempts += 1; - if (!(byTSR & (TSR_TMO | TSR_RETRYTMO))) { - /* transmit success, TxAttempts at least plus one */ - pMgmt->sNodeDBTable[uNodeIndex].uTxOk[MAX_RATE]++; - if ((byFallBack == AUTO_FB_NONE) || - (wRate < RATE_18M)) { - wFallBackRate = wRate; - } else if (byFallBack == AUTO_FB_0) { - if (byTxRetry < 5) - wFallBackRate = - awHWRetry0[wRate-RATE_18M][byTxRetry]; - else - wFallBackRate = - awHWRetry0[wRate-RATE_18M][4]; - } else if (byFallBack == AUTO_FB_1) { - if (byTxRetry < 5) - wFallBackRate = - awHWRetry1[wRate-RATE_18M][byTxRetry]; - else - wFallBackRate = - awHWRetry1[wRate-RATE_18M][4]; - } - pMgmt->sNodeDBTable[uNodeIndex].uTxOk[wFallBackRate]++; - } else { - pMgmt->sNodeDBTable[uNodeIndex].uTxFailures++; - } - pMgmt->sNodeDBTable[uNodeIndex].uTxRetry += byTxRetry; - if (byTxRetry != 0) { - pMgmt->sNodeDBTable[uNodeIndex].uTxFail[MAX_RATE] += byTxRetry; - if ((byFallBack == AUTO_FB_NONE) || - (wRate < RATE_18M)) { - pMgmt->sNodeDBTable[uNodeIndex].uTxFail[wRate] += byTxRetry; - } else if (byFallBack == AUTO_FB_0) { - for (ii = 0; ii < byTxRetry; ii++) { - if (ii < 5) - wFallBackRate = - awHWRetry0[wRate-RATE_18M][ii]; - else - wFallBackRate = - awHWRetry0[wRate-RATE_18M][4]; - pMgmt->sNodeDBTable[uNodeIndex].uTxFail[wFallBackRate]++; - } - } else if (byFallBack == AUTO_FB_1) { - for (ii = 0; ii < byTxRetry; ii++) { - if (ii < 5) - wFallBackRate = awHWRetry1[wRate-RATE_18M][ii]; - else - wFallBackRate = awHWRetry1[wRate-RATE_18M][4]; - pMgmt->sNodeDBTable[uNodeIndex].uTxFail[wFallBackRate]++; - } - } - } - } - } -} - -/* - * Routine Description: - * Clear Nodes & skb in DB Table - * - * - * Parameters: - * In: - * hDeviceContext - The adapter context. - * uStartIndex - starting index - * Out: - * none - * - * Return Value: - * None. - */ -void BSSvClearNodeDBTable(struct vnt_private *pDevice, u32 uStartIndex) -{ - struct vnt_manager *pMgmt = &pDevice->vnt_mgmt; - struct sk_buff *skb; - int ii; - - for (ii = uStartIndex; ii < (MAX_NODE_NUM + 1); ii++) { - if (pMgmt->sNodeDBTable[ii].bActive) { - /* check if sTxPSQueue has been initial */ - if (pMgmt->sNodeDBTable[ii].sTxPSQueue.next) { - while ((skb = skb_dequeue(&pMgmt->sNodeDBTable[ii].sTxPSQueue))) { - DBG_PRT(MSG_LEVEL_DEBUG, - KERN_INFO "PS skb != NULL %d\n", - ii); - dev_kfree_skb(skb); - } - } - memset(&pMgmt->sNodeDBTable[ii], 0, sizeof(KnownNodeDB)); - } - } -} - -static void s_vCheckSensitivity(struct vnt_private *pDevice) -{ - PKnownBSS pBSSList = NULL; - struct vnt_manager *pMgmt = &pDevice->vnt_mgmt; - int ii; - - if (pMgmt->eCurrState == WMAC_STATE_ASSOC || - (pMgmt->eCurrMode == WMAC_MODE_IBSS_STA && - pMgmt->eCurrState == WMAC_STATE_JOINTED)) { - pBSSList = BSSpAddrIsInBSSList(pDevice, pMgmt->abyCurrBSSID, - (PWLAN_IE_SSID) pMgmt->abyCurrSSID); - if (pBSSList) { - /* Update BB register if RSSI is too strong */ - signed long LocalldBmAverage = 0; - signed long uNumofdBm = 0; - for (ii = 0; ii < RSSI_STAT_COUNT; ii++) { - if (pBSSList->ldBmAverage[ii] != 0) { - uNumofdBm++; - LocalldBmAverage += pBSSList->ldBmAverage[ii]; - } - } - if (uNumofdBm > 0) { - LocalldBmAverage = LocalldBmAverage/uNumofdBm; - for (ii = 0; ii < BB_VGA_LEVEL; ii++) { - DBG_PRT(MSG_LEVEL_DEBUG, - KERN_INFO"LocalldBmAverage:%ld, %ld %02x\n", - LocalldBmAverage, - pDevice->ldBmThreshold[ii], - pDevice->abyBBVGA[ii]); - if (LocalldBmAverage < pDevice->ldBmThreshold[ii]) { - pDevice->byBBVGANew = - pDevice->abyBBVGA[ii]; - break; - } - } - if (pDevice->byBBVGANew != - pDevice->byBBVGACurrent) { - pDevice->uBBVGADiffCount++; - if (pDevice->uBBVGADiffCount >= - BB_VGA_CHANGE_THRESHOLD) - bScheduleCommand(pDevice, - WLAN_CMD_CHANGE_BBSENSITIVITY, - NULL); - } else { - pDevice->uBBVGADiffCount = 0; - } - } - } - } -} - -static void s_uCalculateLinkQual(struct vnt_private *pDevice) -{ - struct net_device_stats *stats = &pDevice->stats; - unsigned long TxOkRatio, TxCnt; - unsigned long RxOkRatio, RxCnt; - unsigned long RssiRatio; - unsigned long qual; - long ldBm; - - TxCnt = stats->tx_packets + pDevice->wstats.discard.retries; - - RxCnt = stats->rx_packets + stats->rx_frame_errors; - - TxOkRatio = (TxCnt < 6) ? 4000:((stats->tx_packets * 4000) / TxCnt); - - RxOkRatio = (RxCnt < 6) ? 2000 : - ((stats->rx_packets * 2000) / RxCnt); - - /* decide link quality */ - if (pDevice->bLinkPass != true) { - pDevice->wstats.qual.qual = 0; - } else { - vnt_rf_rssi_to_dbm(pDevice, (u8) (pDevice->uCurrRSSI), &ldBm); - if (-ldBm < 50) - RssiRatio = 4000; - else if (-ldBm > 90) - RssiRatio = 0; - else - RssiRatio = (40-(-ldBm-50)) * 4000 / 40; - - qual = (RssiRatio + TxOkRatio + RxOkRatio) / 100; - if (qual < 100) - pDevice->wstats.qual.qual = (u8) qual; - else - pDevice->wstats.qual.qual = 100; - } -} - -void BSSvClearAnyBSSJoinRecord(struct vnt_private *pDevice) -{ - struct vnt_manager *pMgmt = &pDevice->vnt_mgmt; - int ii; - - for (ii = 0; ii < MAX_BSS_NUM; ii++) - pMgmt->sBSSList[ii].bSelected = false; - - return; -} - -static void s_vCheckPreEDThreshold(struct vnt_private *pDevice) -{ - PKnownBSS pBSSList = NULL; - struct vnt_manager *pMgmt = &pDevice->vnt_mgmt; - - if (pMgmt->eCurrState == WMAC_STATE_ASSOC || - (pMgmt->eCurrMode == WMAC_MODE_IBSS_STA && - pMgmt->eCurrState == WMAC_STATE_JOINTED)) { - pBSSList = BSSpAddrIsInBSSList(pDevice, - pMgmt->abyCurrBSSID, - (PWLAN_IE_SSID) pMgmt->abyCurrSSID); - if (pBSSList) { - pDevice->byBBPreEDRSSI = - (u8) (~(pBSSList->ldBmAverRange) + 1); - BBvUpdatePreEDThreshold(pDevice, false); - } - } -} - diff --git a/drivers/staging/vt6656/bssdb.h b/drivers/staging/vt6656/bssdb.h deleted file mode 100644 index 8df3fb2a6199..000000000000 --- a/drivers/staging/vt6656/bssdb.h +++ /dev/null @@ -1,276 +0,0 @@ -/* - * Copyright (c) 1996, 2003 VIA Networking Technologies, Inc. - * All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - * - * - * File: bssdb.h - * - * Purpose: Handles the Basic Service Set & Node Database functions - * - * Author: Lyndon Chen - * - * Date: July 16, 2002 - * - */ - -#ifndef __BSSDB_H__ -#define __BSSDB_H__ - -#include <linux/skbuff.h> -#include "80211hdr.h" -#include "80211mgr.h" -#include "card.h" - -#define MAX_NODE_NUM 64 -#define MAX_BSS_NUM 42 -#define LOST_BEACON_COUNT 10 /* 10 sec, XP defined */ -#define MAX_PS_TX_BUF 32 // sta max power saving tx buf -#define ADHOC_LOST_BEACON_COUNT 30 // 30 sec, beacon lost for adhoc only -#define MAX_INACTIVE_COUNT 300 // 300 sec, inactive STA node refresh - -#define USE_PROTECT_PERIOD 10 // 10 sec, Use protect mode check period -#define ERP_RECOVER_COUNT 30 // 30 sec, ERP support callback check -#define BSS_CLEAR_COUNT 1 - -#define RSSI_STAT_COUNT 10 -#define MAX_CHECK_RSSI_COUNT 8 - -// STA dwflags -#define WLAN_STA_AUTH BIT0 -#define WLAN_STA_ASSOC BIT1 -#define WLAN_STA_PS BIT2 -#define WLAN_STA_TIM BIT3 -// permanent; do not remove entry on expiration -#define WLAN_STA_PERM BIT4 -// If 802.1X is used, this flag is -// controlling whether STA is authorized to -// send and receive non-IEEE 802.1X frames -#define WLAN_STA_AUTHORIZED BIT5 - -#define MAX_WPA_IE_LEN 64 - -// -// IEEE 802.11 Structures and definitions -// - -typedef struct tagSERPObject { - bool bERPExist; - u8 byERP; -} ERPObject, *PERPObject; - -typedef struct tagSRSNCapObject { - bool bRSNCapExist; - u16 wRSNCap; -} SRSNCapObject, *PSRSNCapObject; - -// BSS info(AP) -typedef struct tagKnownBSS { - // BSS info - bool bActive; - u8 abyBSSID[WLAN_BSSID_LEN]; - unsigned int uChannel; - u8 abySuppRates[WLAN_IEHDR_LEN + WLAN_RATES_MAXLEN + 1]; - u8 abyExtSuppRates[WLAN_IEHDR_LEN + WLAN_RATES_MAXLEN + 1]; - unsigned int uRSSI; - u8 bySQ; - u16 wBeaconInterval; - u16 wCapInfo; - u8 abySSID[WLAN_IEHDR_LEN + WLAN_SSID_MAXLEN + 1]; - u8 byRxRate; - -// u16 wATIMWindow; - u8 byRSSIStatCnt; - signed long ldBmMAX; - signed long ldBmAverage[RSSI_STAT_COUNT]; - signed long ldBmAverRange; - //For any BSSID selection improvment - bool bSelected; - - //++ WPA informations - bool bWPAValid; - u8 byGKType; - u8 abyPKType[4]; - u16 wPKCount; - u8 abyAuthType[4]; - u16 wAuthCount; - u8 byDefaultK_as_PK; - u8 byReplayIdx; - //-- - - //++ WPA2 informations - bool bWPA2Valid; - u8 byCSSGK; - u16 wCSSPKCount; - u8 abyCSSPK[4]; - u16 wAKMSSAuthCount; - u8 abyAKMSSAuthType[4]; - - //++ wpactl - u8 byWPAIE[MAX_WPA_IE_LEN]; - u8 byRSNIE[MAX_WPA_IE_LEN]; - u16 wWPALen; - u16 wRSNLen; - - // Clear count - unsigned int uClearCount; -// u8 abyIEs[WLAN_BEACON_FR_MAXLEN]; - unsigned int uIELength; - u64 qwBSSTimestamp; - u64 qwLocalTSF;/* local TSF timer */ - - CARD_PHY_TYPE eNetworkTypeInUse; - - ERPObject sERP; - SRSNCapObject sRSNCapObj; - u8 abyIEs[1024]; // don't move this field !! - -} __attribute__ ((__packed__)) -KnownBSS , *PKnownBSS; - -typedef enum tagNODE_STATE { - NODE_FREE, - NODE_AGED, - NODE_KNOWN, - NODE_AUTH, - NODE_ASSOC -} NODE_STATE, *PNODE_STATE; - -// STA node info -typedef struct tagKnownNodeDB { - // STA info - bool bActive; - u8 abyMACAddr[WLAN_ADDR_LEN]; - u8 abyCurrSuppRates[WLAN_IEHDR_LEN + WLAN_RATES_MAXLEN]; - u8 abyCurrExtSuppRates[WLAN_IEHDR_LEN + WLAN_RATES_MAXLEN]; - u16 wTxDataRate; - bool bShortPreamble; - bool bERPExist; - bool bShortSlotTime; - unsigned int uInActiveCount; - u16 wMaxBasicRate; //Get from byTopOFDMBasicRate or byTopCCKBasicRate which depends on packetTyp. - u16 wMaxSuppRate; //Records the highest supported rate getting from SuppRates IE and ExtSuppRates IE in Beacon. - u16 wSuppRate; - u8 byTopOFDMBasicRate;//Records the highest basic rate in OFDM mode - u8 byTopCCKBasicRate; //Records the highest basic rate in CCK mode - - // For AP mode - struct sk_buff_head sTxPSQueue; - u16 wCapInfo; - u16 wListenInterval; - u16 wAID; - NODE_STATE eNodeState; - bool bPSEnable; - bool bRxPSPoll; - u8 byAuthSequence; - unsigned long ulLastRxJiffer; - u8 bySuppRate; - u32 dwFlags; - u16 wEnQueueCnt; - - bool bOnFly; - unsigned long long KeyRSC; - u8 byKeyIndex; - u32 dwKeyIndex; - u8 byCipherSuite; - u32 dwTSC47_16; - u16 wTSC15_0; - unsigned int uWepKeyLength; - u8 abyWepKey[WLAN_WEPMAX_KEYLEN]; - // - // Auto rate fallback vars - bool bIsInFallback; - unsigned int uAverageRSSI; - unsigned int uRateRecoveryTimeout; - unsigned int uRatePollTimeout; - unsigned int uTxFailures; - unsigned int uTxAttempts; - - unsigned int uTxRetry; - unsigned int uFailureRatio; - unsigned int uRetryRatio; - unsigned int uTxOk[MAX_RATE+1]; - unsigned int uTxFail[MAX_RATE+1]; - unsigned int uTimeCount; - -} KnownNodeDB, *PKnownNodeDB; - -PKnownBSS BSSpSearchBSSList(struct vnt_private *, u8 *pbyDesireBSSID, - u8 *pbyDesireSSID, CARD_PHY_TYPE ePhyType); - -PKnownBSS BSSpAddrIsInBSSList(struct vnt_private *, u8 *abyBSSID, - PWLAN_IE_SSID pSSID); - -void BSSvClearBSSList(struct vnt_private *, int bKeepCurrBSSID); - -int BSSbInsertToBSSList(struct vnt_private *, - u8 *abyBSSIDAddr, - u64 qwTimestamp, - u16 wBeaconInterval, - u16 wCapInfo, - u8 byCurrChannel, - PWLAN_IE_SSID pSSID, - PWLAN_IE_SUPP_RATES pSuppRates, - PWLAN_IE_SUPP_RATES pExtSuppRates, - PERPObject psERP, - PWLAN_IE_RSN pRSN, - PWLAN_IE_RSN_EXT pRSNWPA, - PWLAN_IE_COUNTRY pIE_Country, - PWLAN_IE_QUIET pIE_Quiet, - u32 uIELength, - u8 *pbyIEs, - void *pRxPacketContext); - -int BSSbUpdateToBSSList(struct vnt_private *, - u64 qwTimestamp, - u16 wBeaconInterval, - u16 wCapInfo, - u8 byCurrChannel, - int bChannelHit, - PWLAN_IE_SSID pSSID, - PWLAN_IE_SUPP_RATES pSuppRates, - PWLAN_IE_SUPP_RATES pExtSuppRates, - PERPObject psERP, - PWLAN_IE_RSN pRSN, - PWLAN_IE_RSN_EXT pRSNWPA, - PWLAN_IE_COUNTRY pIE_Country, - PWLAN_IE_QUIET pIE_Quiet, - PKnownBSS pBSSList, - u32 uIELength, - u8 *pbyIEs, - void *pRxPacketContext); - -int BSSbIsSTAInNodeDB(struct vnt_private *, u8 * abyDstAddr, - u32 *puNodeIndex); - -void BSSvCreateOneNode(struct vnt_private *, u32 *puNodeIndex); - -void BSSvUpdateAPNode(struct vnt_private *, u16 *pwCapInfo, - PWLAN_IE_SUPP_RATES pItemRates, PWLAN_IE_SUPP_RATES pExtSuppRates); - -void BSSvSecondCallBack(struct work_struct *work); - -void BSSvUpdateNodeTxCounter(struct vnt_private *, u8 byTSR, u8 byPktNO); - -void BSSvRemoveOneNode(struct vnt_private *, u32 uNodeIndex); - -void BSSvAddMulticastNode(struct vnt_private *); - -void BSSvClearNodeDBTable(struct vnt_private *, u32 uStartIndex); - -void BSSvClearAnyBSSJoinRecord(struct vnt_private *); - -#endif /* __BSSDB_H__ */ diff --git a/drivers/staging/vt6656/card.c b/drivers/staging/vt6656/card.c index d662e5431dad..98567a7dc5b9 100644 --- a/drivers/staging/vt6656/card.c +++ b/drivers/staging/vt6656/card.c @@ -19,34 +19,27 @@ * File: card.c * Purpose: Provide functions to setup NIC operation mode * Functions: - * s_vSafeResetTx - Rest Tx - * CARDvSetRSPINF - Set RSPINF - * vUpdateIFS - Update slotTime,SIFS,DIFS, and EIFS - * CARDvUpdateBasicTopRate - Update BasicTopRate - * CARDbAddBasicRate - Add to BasicRateSet - * CARDbSetBasicRate - Set Basic Tx Rate - * CARDbIsOFDMinBasicRate - Check if any OFDM rate is in BasicRateSet - * CARDvSetLoopbackMode - Set Loopback mode - * CARDbSoftwareReset - Sortware reset NIC - * CARDqGetTSFOffset - Calculate TSFOffset - * CARDbGetCurrentTSF - Read Current NIC TSF counter - * CARDqGetNextTBTT - Calculate Next Beacon TSF counter - * CARDvSetFirstNextTBTT - Set NIC Beacon time - * CARDvUpdateNextTBTT - Sync. NIC Beacon time - * CARDbRadioPowerOff - Turn Off NIC Radio Power - * CARDbRadioPowerOn - Turn On NIC Radio Power - * CARDbSetWEPMode - Set NIC Wep mode - * CARDbSetTxPower - Set NIC tx power + * vnt_set_rspinf - Set RSPINF + * vnt_update_ifs - Update slotTime,SIFS,DIFS, and EIFS + * vnt_update_top_rates - Update BasicTopRate + * vnt_add_basic_rate - Add to BasicRateSet + * vnt_ofdm_min_rate - Check if any OFDM rate is in BasicRateSet + * vnt_get_tsf_offset - Calculate TSFOffset + * vnt_get_current_tsf - Read Current NIC TSF counter + * vnt_get_next_tbtt - Calculate Next Beacon TSF counter + * vnt_reset_next_tbtt - Set NIC Beacon time + * vnt_update_next_tbtt - Sync. NIC Beacon time + * vnt_radio_power_off - Turn Off NIC Radio Power + * vnt_radio_power_on - Turn On NIC Radio Power * * Revision History: * 06-10-2003 Bryan YC Fan: Re-write codes to support VT3253 spec. * 08-26-2003 Kyle Hsu: Modify the definition type of dwIoBase. - * 09-01-2003 Bryan YC Fan: Add vUpdateIFS(). + * 09-01-2003 Bryan YC Fan: Add vnt_update_ifs(). * */ #include "device.h" -#include "tmacro.h" #include "card.h" #include "baseband.h" #include "mac.h" @@ -54,16 +47,14 @@ #include "rf.h" #include "power.h" #include "key.h" -#include "rc4.h" -#include "country.h" -#include "datarate.h" #include "usbpipe.h" -//const u16 cwRXBCNTSFOff[MAX_RATE] = -//{17, 34, 96, 192, 34, 23, 17, 11, 8, 5, 4, 3}; +/* const u16 cwRXBCNTSFOff[MAX_RATE] = + {17, 34, 96, 192, 34, 23, 17, 11, 8, 5, 4, 3}; */ -static const u16 cwRXBCNTSFOff[MAX_RATE] = -{192, 96, 34, 17, 34, 23, 17, 11, 8, 5, 4, 3}; +static const u16 cwRXBCNTSFOff[MAX_RATE] = { + 192, 96, 34, 17, 34, 23, 17, 11, 8, 5, 4, 3 +}; /* * Description: Set NIC media channel @@ -75,42 +66,21 @@ static const u16 cwRXBCNTSFOff[MAX_RATE] = * Out: * none */ -void CARDbSetMediaChannel(struct vnt_private *priv, u32 connection_channel) +void vnt_set_channel(struct vnt_private *priv, u32 connection_channel) { - if (priv->byBBType == BB_TYPE_11A) { - if ((connection_channel < (CB_MAX_CHANNEL_24G + 1)) || - (connection_channel > CB_MAX_CHANNEL)) - connection_channel = (CB_MAX_CHANNEL_24G + 1); - } else { - if ((connection_channel > CB_MAX_CHANNEL_24G) || - (connection_channel == 0)) - connection_channel = 1; - } + if (connection_channel > CB_MAX_CHANNEL || !connection_channel) + return; /* clear NAV */ - MACvRegBitsOn(priv, MAC_REG_MACCR, MACCR_CLRNAV); + vnt_mac_reg_bits_on(priv, MAC_REG_MACCR, MACCR_CLRNAV); /* Set Channel[7] = 0 to tell H/W channel is changing now. */ - MACvRegBitsOff(priv, MAC_REG_CHANNEL, 0xb0); + vnt_mac_reg_bits_off(priv, MAC_REG_CHANNEL, 0xb0); vnt_control_out(priv, MESSAGE_TYPE_SELECT_CHANNLE, connection_channel, 0, 0, NULL); - if (priv->byBBType == BB_TYPE_11A) { - priv->byCurPwr = 0xff; - vnt_rf_set_txpower(priv, - priv->abyOFDMAPwrTbl[connection_channel-15], RATE_54M); - } else if (priv->byBBType == BB_TYPE_11G) { - priv->byCurPwr = 0xff; - vnt_rf_set_txpower(priv, - priv->abyOFDMPwrTbl[connection_channel-1], RATE_54M); - } else { - priv->byCurPwr = 0xff; - vnt_rf_set_txpower(priv, - priv->abyCCKPwrTbl[connection_channel-1], RATE_1M); - } - vnt_control_out_u8(priv, MESSAGE_REQUEST_MACREG, MAC_REG_CHANNEL, (u8)(connection_channel|0x80)); } @@ -128,12 +98,12 @@ void CARDbSetMediaChannel(struct vnt_private *priv, u32 connection_channel) * Return Value: response Control frame rate * */ -static u16 swGetCCKControlRate(struct vnt_private *priv, u16 rate_idx) +static u16 vnt_get_cck_rate(struct vnt_private *priv, u16 rate_idx) { u16 ui = rate_idx; while (ui > RATE_1M) { - if (priv->wBasicRate & (1 << ui)) + if (priv->basic_rates & (1 << ui)) return ui; ui--; } @@ -154,14 +124,14 @@ static u16 swGetCCKControlRate(struct vnt_private *priv, u16 rate_idx) * Return Value: response Control frame rate * */ -static u16 swGetOFDMControlRate(struct vnt_private *priv, u16 rate_idx) +static u16 vnt_get_ofdm_rate(struct vnt_private *priv, u16 rate_idx) { u16 ui = rate_idx; dev_dbg(&priv->usb->dev, "%s basic rate: %d\n", - __func__, priv->wBasicRate); + __func__, priv->basic_rates); - if (!CARDbIsOFDMinBasicRate(priv)) { + if (!vnt_ofdm_min_rate(priv)) { dev_dbg(&priv->usb->dev, "%s (NO OFDM) %d\n", __func__, rate_idx); if (rate_idx > RATE_24M) @@ -170,7 +140,7 @@ static u16 swGetOFDMControlRate(struct vnt_private *priv, u16 rate_idx) } while (ui > RATE_11M) { - if (priv->wBasicRate & (1 << ui)) { + if (priv->basic_rates & (1 << ui)) { dev_dbg(&priv->usb->dev, "%s rate: %d\n", __func__, ui); return ui; @@ -197,7 +167,7 @@ static u16 swGetOFDMControlRate(struct vnt_private *priv, u16 rate_idx) * Return Value: none * */ -static void CARDvCalculateOFDMRParameter(u16 rate, u8 bb_type, +static void vnt_calculate_ofdm_rate(u16 rate, u8 bb_type, u8 *tx_rate, u8 *rsv_time) { @@ -291,7 +261,7 @@ static void CARDvCalculateOFDMRParameter(u16 rate, u8 bb_type, * */ -void CARDvSetRSPINF(struct vnt_private *priv, u8 bb_type) +void vnt_set_rspinf(struct vnt_private *priv, u8 bb_type) { struct vnt_phy_field phy[4]; u8 tx_rate[9] = {0, 0, 0, 0, 0, 0, 0, 0, 0}; /* For OFDM */ @@ -300,56 +270,51 @@ void CARDvSetRSPINF(struct vnt_private *priv, u8 bb_type) int i; /*RSPINF_b_1*/ - BBvCalculateParameter(priv, 14, - swGetCCKControlRate(priv, RATE_1M), PK_TYPE_11B, &phy[0]); + vnt_get_phy_field(priv, 14, + vnt_get_cck_rate(priv, RATE_1M), PK_TYPE_11B, &phy[0]); /*RSPINF_b_2*/ - BBvCalculateParameter(priv, 14, - swGetCCKControlRate(priv, RATE_2M), PK_TYPE_11B, &phy[1]); + vnt_get_phy_field(priv, 14, + vnt_get_cck_rate(priv, RATE_2M), PK_TYPE_11B, &phy[1]); /*RSPINF_b_5*/ - BBvCalculateParameter(priv, 14, - swGetCCKControlRate(priv, RATE_5M), PK_TYPE_11B, &phy[2]); + vnt_get_phy_field(priv, 14, + vnt_get_cck_rate(priv, RATE_5M), PK_TYPE_11B, &phy[2]); /*RSPINF_b_11*/ - BBvCalculateParameter(priv, 14, - swGetCCKControlRate(priv, RATE_11M), PK_TYPE_11B, &phy[3]); + vnt_get_phy_field(priv, 14, + vnt_get_cck_rate(priv, RATE_11M), PK_TYPE_11B, &phy[3]); /*RSPINF_a_6*/ - CARDvCalculateOFDMRParameter(RATE_6M, bb_type, - &tx_rate[0], &rsv_time[0]); + vnt_calculate_ofdm_rate(RATE_6M, bb_type, &tx_rate[0], &rsv_time[0]); /*RSPINF_a_9*/ - CARDvCalculateOFDMRParameter(RATE_9M, bb_type, - &tx_rate[1], &rsv_time[1]); + vnt_calculate_ofdm_rate(RATE_9M, bb_type, &tx_rate[1], &rsv_time[1]); /*RSPINF_a_12*/ - CARDvCalculateOFDMRParameter(RATE_12M, bb_type, - &tx_rate[2], &rsv_time[2]); + vnt_calculate_ofdm_rate(RATE_12M, bb_type, &tx_rate[2], &rsv_time[2]); /*RSPINF_a_18*/ - CARDvCalculateOFDMRParameter(RATE_18M, bb_type, - &tx_rate[3], &rsv_time[3]); + vnt_calculate_ofdm_rate(RATE_18M, bb_type, &tx_rate[3], &rsv_time[3]); /*RSPINF_a_24*/ - CARDvCalculateOFDMRParameter(RATE_24M, bb_type, - &tx_rate[4], &rsv_time[4]); + vnt_calculate_ofdm_rate(RATE_24M, bb_type, &tx_rate[4], &rsv_time[4]); /*RSPINF_a_36*/ - CARDvCalculateOFDMRParameter(swGetOFDMControlRate(priv, RATE_36M), + vnt_calculate_ofdm_rate(vnt_get_ofdm_rate(priv, RATE_36M), bb_type, &tx_rate[5], &rsv_time[5]); /*RSPINF_a_48*/ - CARDvCalculateOFDMRParameter(swGetOFDMControlRate(priv, RATE_48M), + vnt_calculate_ofdm_rate(vnt_get_ofdm_rate(priv, RATE_48M), bb_type, &tx_rate[6], &rsv_time[6]); /*RSPINF_a_54*/ - CARDvCalculateOFDMRParameter(swGetOFDMControlRate(priv, RATE_54M), + vnt_calculate_ofdm_rate(vnt_get_ofdm_rate(priv, RATE_54M), bb_type, &tx_rate[7], &rsv_time[7]); /*RSPINF_a_72*/ - CARDvCalculateOFDMRParameter(swGetOFDMControlRate(priv, RATE_54M), + vnt_calculate_ofdm_rate(vnt_get_ofdm_rate(priv, RATE_54M), bb_type, &tx_rate[8], &rsv_time[8]); put_unaligned(phy[0].len, (u16 *)&data[0]); @@ -389,77 +354,83 @@ void CARDvSetRSPINF(struct vnt_private *priv, u8 bb_type) * Return Value: None. * */ -void vUpdateIFS(struct vnt_private *priv) +void vnt_update_ifs(struct vnt_private *priv) { u8 max_min = 0; u8 data[4]; - if (priv->byPacketType == PK_TYPE_11A) { - priv->uSlot = C_SLOT_SHORT; - priv->uSIFS = C_SIFS_A; - priv->uDIFS = C_SIFS_A + 2 * C_SLOT_SHORT; - priv->uCwMin = C_CWMIN_A; + if (priv->packet_type == PK_TYPE_11A) { + priv->slot = C_SLOT_SHORT; + priv->sifs = C_SIFS_A; + priv->difs = C_SIFS_A + 2 * C_SLOT_SHORT; max_min = 4; - } else if (priv->byPacketType == PK_TYPE_11B) { - priv->uSlot = C_SLOT_LONG; - priv->uSIFS = C_SIFS_BG; - priv->uDIFS = C_SIFS_BG + 2 * C_SLOT_LONG; - priv->uCwMin = C_CWMIN_B; + } else if (priv->packet_type == PK_TYPE_11B) { + priv->slot = C_SLOT_LONG; + priv->sifs = C_SIFS_BG; + priv->difs = C_SIFS_BG + 2 * C_SLOT_LONG; max_min = 5; } else {/* PK_TYPE_11GA & PK_TYPE_11GB */ - u8 rate = 0; bool ofdm_rate = false; unsigned int ii = 0; - PWLAN_IE_SUPP_RATES item_rates = NULL; - priv->uSIFS = C_SIFS_BG; + priv->sifs = C_SIFS_BG; - if (priv->bShortSlotTime) - priv->uSlot = C_SLOT_SHORT; + if (priv->short_slot_time) + priv->slot = C_SLOT_SHORT; else - priv->uSlot = C_SLOT_LONG; - - priv->uDIFS = C_SIFS_BG + 2 * priv->uSlot; + priv->slot = C_SLOT_LONG; - item_rates = - (PWLAN_IE_SUPP_RATES)priv->vnt_mgmt.abyCurrSuppRates; + priv->difs = C_SIFS_BG + 2 * priv->slot; - for (ii = 0; ii < item_rates->len; ii++) { - rate = (u8)(item_rates->abyRates[ii] & 0x7f); - if (RATEwGetRateIdx(rate) > RATE_11M) { + for (ii = RATE_54M; ii >= RATE_6M; ii--) { + if (priv->basic_rates & ((u32)(0x1 << ii))) { ofdm_rate = true; break; } } - if (ofdm_rate == false) { - item_rates = (PWLAN_IE_SUPP_RATES)priv->vnt_mgmt - .abyCurrExtSuppRates; - for (ii = 0; ii < item_rates->len; ii++) { - rate = (u8)(item_rates->abyRates[ii] & 0x7f); - if (RATEwGetRateIdx(rate) > RATE_11M) { - ofdm_rate = true; - break; - } - } - } - - if (ofdm_rate == true) { - priv->uCwMin = C_CWMIN_A; + if (ofdm_rate == true) max_min = 4; - } else { - priv->uCwMin = C_CWMIN_B; + else max_min = 5; - } } - priv->uCwMax = C_CWMAX; - priv->uEIFS = C_EIFS; + priv->eifs = C_EIFS; - data[0] = (u8)priv->uSIFS; - data[1] = (u8)priv->uDIFS; - data[2] = (u8)priv->uEIFS; - data[3] = (u8)priv->uSlot; + switch (priv->rf_type) { + case RF_VT3226D0: + if (priv->bb_type != BB_TYPE_11B) { + priv->sifs -= 1; + priv->difs -= 1; + break; + } + case RF_AIROHA7230: + case RF_AL2230: + case RF_AL2230S: + if (priv->bb_type != BB_TYPE_11B) + break; + case RF_RFMD2959: + case RF_VT3226: + case RF_VT3342A0: + priv->sifs -= 3; + priv->difs -= 3; + break; + case RF_MAXIM2829: + if (priv->bb_type == BB_TYPE_11A) { + priv->sifs -= 5; + priv->difs -= 5; + } else { + priv->sifs -= 2; + priv->difs -= 2; + } + + break; + } + + data[0] = (u8)priv->sifs; + data[1] = (u8)priv->difs; + data[2] = (u8)priv->eifs; + data[3] = (u8)priv->slot; vnt_control_out(priv, MESSAGE_TYPE_WRITE, MAC_REG_SIFS, MESSAGE_REQUEST_MACREG, 4, &data[0]); @@ -470,23 +441,23 @@ void vUpdateIFS(struct vnt_private *priv) MESSAGE_REQUEST_MACREG, 1, &max_min); } -void CARDvUpdateBasicTopRate(struct vnt_private *priv) +void vnt_update_top_rates(struct vnt_private *priv) { u8 top_ofdm = RATE_24M, top_cck = RATE_1M; u8 i; /*Determines the highest basic rate.*/ for (i = RATE_54M; i >= RATE_6M; i--) { - if (priv->wBasicRate & (u16)(1 << i)) { + if (priv->basic_rates & (u16)(1 << i)) { top_ofdm = i; break; } } - priv->byTopOFDMBasicRate = top_ofdm; + priv->top_ofdm_basic_rate = top_ofdm; for (i = RATE_11M;; i--) { - if (priv->wBasicRate & (u16)(1 << i)) { + if (priv->basic_rates & (u16)(1 << i)) { top_cck = i; break; } @@ -494,49 +465,27 @@ void CARDvUpdateBasicTopRate(struct vnt_private *priv) break; } - priv->byTopCCKBasicRate = top_cck; - } - -/* - * Description: Set NIC Tx Basic Rate - * - * Parameters: - * In: - * pDevice - The adapter to be set - * wBasicRate - Basic Rate to be set - * Out: - * none - * - * Return Value: true if succeeded; false if failed. - * - */ -void CARDbAddBasicRate(struct vnt_private *priv, u16 rate_idx) -{ - - priv->wBasicRate |= (1 << rate_idx); - - /*Determines the highest basic rate.*/ - CARDvUpdateBasicTopRate(priv); + priv->top_cck_basic_rate = top_cck; } -int CARDbIsOFDMinBasicRate(struct vnt_private *priv) +int vnt_ofdm_min_rate(struct vnt_private *priv) { int ii; for (ii = RATE_54M; ii >= RATE_6M; ii--) { - if ((priv->wBasicRate) & ((u16)(1 << ii))) + if ((priv->basic_rates) & ((u16)(1 << ii))) return true; } return false; } -u8 CARDbyGetPktType(struct vnt_private *priv) +u8 vnt_get_pkt_type(struct vnt_private *priv) { - if (priv->byBBType == BB_TYPE_11A || priv->byBBType == BB_TYPE_11B) - return (u8)priv->byBBType; - else if (CARDbIsOFDMinBasicRate(priv)) + if (priv->bb_type == BB_TYPE_11A || priv->bb_type == BB_TYPE_11B) + return (u8)priv->bb_type; + else if (vnt_ofdm_min_rate(priv)) return PK_TYPE_11GA; else return PK_TYPE_11GB; @@ -557,7 +506,7 @@ u8 CARDbyGetPktType(struct vnt_private *priv) * Return Value: TSF Offset value * */ -u64 CARDqGetTSFOffset(u8 rx_rate, u64 tsf1, u64 tsf2) +u64 vnt_get_tsf_offset(u8 rx_rate, u64 tsf1, u64 tsf2) { u64 tsf_offset = 0; u16 rx_bcn_offset = 0; @@ -586,13 +535,13 @@ u64 CARDqGetTSFOffset(u8 rx_rate, u64 tsf1, u64 tsf2) * Return Value: none * */ -void CARDvAdjustTSF(struct vnt_private *priv, u8 rx_rate, +void vnt_adjust_tsf(struct vnt_private *priv, u8 rx_rate, u64 time_stamp, u64 local_tsf) { u64 tsf_offset = 0; u8 data[8]; - tsf_offset = CARDqGetTSFOffset(rx_rate, time_stamp, local_tsf); + tsf_offset = vnt_get_tsf_offset(rx_rate, time_stamp, local_tsf); data[0] = (u8)tsf_offset; data[1] = (u8)(tsf_offset >> 8); @@ -619,10 +568,10 @@ void CARDvAdjustTSF(struct vnt_private *priv, u8 rx_rate, * Return Value: true if success; otherwise false * */ -bool CARDbGetCurrentTSF(struct vnt_private *priv, u64 *current_tsf) +bool vnt_get_current_tsf(struct vnt_private *priv, u64 *current_tsf) { - *current_tsf = priv->qwCurrTSF; + *current_tsf = priv->current_tsf; return true; } @@ -638,12 +587,12 @@ bool CARDbGetCurrentTSF(struct vnt_private *priv, u64 *current_tsf) * Return Value: true if success; otherwise false * */ -bool CARDbClearCurrentTSF(struct vnt_private *priv) +bool vnt_clear_current_tsf(struct vnt_private *priv) { - MACvRegBitsOn(priv, MAC_REG_TFTCTL, TFTCTL_TSFCNTRST); + vnt_mac_reg_bits_on(priv, MAC_REG_TFTCTL, TFTCTL_TSFCNTRST); - priv->qwCurrTSF = 0; + priv->current_tsf = 0; return true; } @@ -662,7 +611,7 @@ bool CARDbClearCurrentTSF(struct vnt_private *priv) * Return Value: TSF value of next Beacon * */ -u64 CARDqGetNextTBTT(u64 tsf, u16 beacon_interval) +u64 vnt_get_next_tbtt(u64 tsf, u16 beacon_interval) { u32 beacon_int; @@ -694,14 +643,14 @@ u64 CARDqGetNextTBTT(u64 tsf, u16 beacon_interval) * Return Value: none * */ -void CARDvSetFirstNextTBTT(struct vnt_private *priv, u16 beacon_interval) +void vnt_reset_next_tbtt(struct vnt_private *priv, u16 beacon_interval) { u64 next_tbtt = 0; u8 data[8]; - CARDbClearCurrentTSF(priv); + vnt_clear_current_tsf(priv); - next_tbtt = CARDqGetNextTBTT(next_tbtt, beacon_interval); + next_tbtt = vnt_get_next_tbtt(next_tbtt, beacon_interval); data[0] = (u8)next_tbtt; data[1] = (u8)(next_tbtt >> 8); @@ -714,8 +663,6 @@ void CARDvSetFirstNextTBTT(struct vnt_private *priv, u16 beacon_interval) vnt_control_out(priv, MESSAGE_TYPE_SET_TSFTBTT, MESSAGE_REQUEST_TBTT, 0, 8, data); - - return; } /* @@ -733,12 +680,12 @@ void CARDvSetFirstNextTBTT(struct vnt_private *priv, u16 beacon_interval) * Return Value: none * */ -void CARDvUpdateNextTBTT(struct vnt_private *priv, u64 tsf, +void vnt_update_next_tbtt(struct vnt_private *priv, u64 tsf, u16 beacon_interval) { u8 data[8]; - tsf = CARDqGetNextTBTT(tsf, beacon_interval); + tsf = vnt_get_next_tbtt(tsf, beacon_interval); data[0] = (u8)tsf; data[1] = (u8)(tsf >> 8); @@ -750,11 +697,9 @@ void CARDvUpdateNextTBTT(struct vnt_private *priv, u64 tsf, data[7] = (u8)(tsf >> 56); vnt_control_out(priv, MESSAGE_TYPE_SET_TSFTBTT, - MESSAGE_REQUEST_TBTT, 0, 8, data); + MESSAGE_REQUEST_TBTT, 0, 8, data); dev_dbg(&priv->usb->dev, "%s TBTT: %8llx\n", __func__, tsf); - - return; } /* @@ -769,27 +714,27 @@ void CARDvUpdateNextTBTT(struct vnt_private *priv, u64 tsf, * Return Value: true if success; otherwise false * */ -int CARDbRadioPowerOff(struct vnt_private *priv) +int vnt_radio_power_off(struct vnt_private *priv) { int ret = true; - priv->bRadioOff = true; - - switch (priv->byRFType) { + switch (priv->rf_type) { case RF_AL2230: case RF_AL2230S: case RF_AIROHA7230: case RF_VT3226: case RF_VT3226D0: case RF_VT3342A0: - MACvRegBitsOff(priv, MAC_REG_SOFTPWRCTL, + vnt_mac_reg_bits_off(priv, MAC_REG_SOFTPWRCTL, (SOFTPWRCTL_SWPE2 | SOFTPWRCTL_SWPE3)); break; } - MACvRegBitsOff(priv, MAC_REG_HOSTCR, HOSTCR_RXON); + vnt_mac_reg_bits_off(priv, MAC_REG_HOSTCR, HOSTCR_RXON); + + vnt_set_deep_sleep(priv); - BBvSetDeepSleep(priv); + vnt_mac_reg_bits_on(priv, MAC_REG_GPIOCTL1, GPIO3_INTMD); return ret; } @@ -806,72 +751,71 @@ int CARDbRadioPowerOff(struct vnt_private *priv) * Return Value: true if success; otherwise false * */ -int CARDbRadioPowerOn(struct vnt_private *priv) +int vnt_radio_power_on(struct vnt_private *priv) { int ret = true; - if (priv->bHWRadioOff == true || priv->bRadioControlOff == true) - return false; - - priv->bRadioOff = false; + vnt_exit_deep_sleep(priv); - BBvExitDeepSleep(priv); + vnt_mac_reg_bits_on(priv, MAC_REG_HOSTCR, HOSTCR_RXON); - MACvRegBitsOn(priv, MAC_REG_HOSTCR, HOSTCR_RXON); - - switch (priv->byRFType) { + switch (priv->rf_type) { case RF_AL2230: case RF_AL2230S: case RF_AIROHA7230: case RF_VT3226: case RF_VT3226D0: case RF_VT3342A0: - MACvRegBitsOn(priv, MAC_REG_SOFTPWRCTL, + vnt_mac_reg_bits_on(priv, MAC_REG_SOFTPWRCTL, (SOFTPWRCTL_SWPE2 | SOFTPWRCTL_SWPE3)); break; } + vnt_mac_reg_bits_off(priv, MAC_REG_GPIOCTL1, GPIO3_INTMD); + return ret; } -void CARDvSetBSSMode(struct vnt_private *priv) +void vnt_set_bss_mode(struct vnt_private *priv) { - if (priv->byRFType == RF_AIROHA7230 && priv->byBBType == BB_TYPE_11A) - MACvSetBBType(priv, BB_TYPE_11G); + if (priv->rf_type == RF_AIROHA7230 && priv->bb_type == BB_TYPE_11A) + vnt_mac_set_bb_type(priv, BB_TYPE_11G); else - MACvSetBBType(priv, priv->byBBType); + vnt_mac_set_bb_type(priv, priv->bb_type); - priv->byPacketType = CARDbyGetPktType(priv); + priv->packet_type = vnt_get_pkt_type(priv); - if (priv->byBBType == BB_TYPE_11A) + if (priv->bb_type == BB_TYPE_11A) vnt_control_out_u8(priv, MESSAGE_REQUEST_BBREG, 0x88, 0x03); - else if (priv->byBBType == BB_TYPE_11B) + else if (priv->bb_type == BB_TYPE_11B) vnt_control_out_u8(priv, MESSAGE_REQUEST_BBREG, 0x88, 0x02); - else if (priv->byBBType == BB_TYPE_11G) + else if (priv->bb_type == BB_TYPE_11G) vnt_control_out_u8(priv, MESSAGE_REQUEST_BBREG, 0x88, 0x08); - vUpdateIFS(priv); - CARDvSetRSPINF(priv, (u8)priv->byBBType); + vnt_update_ifs(priv); + vnt_set_rspinf(priv, (u8)priv->bb_type); - if (priv->byBBType == BB_TYPE_11A) { - if (priv->byRFType == RF_AIROHA7230) { - priv->abyBBVGA[0] = 0x20; + if (priv->bb_type == BB_TYPE_11A) { + if (priv->rf_type == RF_AIROHA7230) { + priv->bb_vga[0] = 0x20; vnt_control_out_u8(priv, MESSAGE_REQUEST_BBREG, - 0xe7, priv->abyBBVGA[0]); + 0xe7, priv->bb_vga[0]); } - priv->abyBBVGA[2] = 0x10; - priv->abyBBVGA[3] = 0x10; + priv->bb_vga[2] = 0x10; + priv->bb_vga[3] = 0x10; } else { - if (priv->byRFType == RF_AIROHA7230) { - priv->abyBBVGA[0] = 0x1c; + if (priv->rf_type == RF_AIROHA7230) { + priv->bb_vga[0] = 0x1c; vnt_control_out_u8(priv, MESSAGE_REQUEST_BBREG, - 0xe7, priv->abyBBVGA[0]); + 0xe7, priv->bb_vga[0]); } - priv->abyBBVGA[2] = 0x0; - priv->abyBBVGA[3] = 0x0; + priv->bb_vga[2] = 0x0; + priv->bb_vga[3] = 0x0; } + + vnt_set_vga_gain_offset(priv, priv->bb_vga[0]); } diff --git a/drivers/staging/vt6656/card.h b/drivers/staging/vt6656/card.h index ac734714c7d1..03fc1678896b 100644 --- a/drivers/staging/vt6656/card.h +++ b/drivers/staging/vt6656/card.h @@ -32,37 +32,27 @@ /* init card type */ -typedef enum _CARD_PHY_TYPE { - PHY_TYPE_AUTO = 0, - PHY_TYPE_11B, - PHY_TYPE_11G, - PHY_TYPE_11A -} CARD_PHY_TYPE, *PCARD_PHY_TYPE; - -#define CB_MAX_CHANNEL_24G 14 -#define CB_MAX_CHANNEL_5G 42 /* add channel9(5045MHz), 41==>42 */ -#define CB_MAX_CHANNEL (CB_MAX_CHANNEL_24G+CB_MAX_CHANNEL_5G) +#define CB_MAX_CHANNEL_24G 14 +#define CB_MAX_CHANNEL_5G 42 /* add channel9(5045MHz), 41==>42 */ +#define CB_MAX_CHANNEL (CB_MAX_CHANNEL_24G + CB_MAX_CHANNEL_5G) struct vnt_private; -void CARDbSetMediaChannel(struct vnt_private *pDevice, u32 uConnectionChannel); -void CARDvSetRSPINF(struct vnt_private *, u8); -void vUpdateIFS(struct vnt_private *); -void CARDvUpdateBasicTopRate(struct vnt_private *); -void CARDbAddBasicRate(struct vnt_private *, u16); -int CARDbIsOFDMinBasicRate(struct vnt_private *pDevice); -void CARDvAdjustTSF(struct vnt_private *pDevice, u8 byRxRate, - u64 qwBSSTimestamp, u64 qwLocalTSF); -bool CARDbGetCurrentTSF(struct vnt_private *pDevice, u64 *pqwCurrTSF); -bool CARDbClearCurrentTSF(struct vnt_private *pDevice); -void CARDvSetFirstNextTBTT(struct vnt_private *pDevice, u16 wBeaconInterval); -void CARDvUpdateNextTBTT(struct vnt_private *pDevice, u64 qwTSF, - u16 wBeaconInterval); -u64 CARDqGetNextTBTT(u64 qwTSF, u16 wBeaconInterval); -u64 CARDqGetTSFOffset(u8 byRxRate, u64 qwTSF1, u64 qwTSF2); -int CARDbRadioPowerOff(struct vnt_private *pDevice); -int CARDbRadioPowerOn(struct vnt_private *pDevice); -u8 CARDbyGetPktType(struct vnt_private *pDevice); -void CARDvSetBSSMode(struct vnt_private *pDevice); +void vnt_set_channel(struct vnt_private *, u32); +void vnt_set_rspinf(struct vnt_private *, u8); +void vnt_update_ifs(struct vnt_private *); +void vnt_update_top_rates(struct vnt_private *); +int vnt_ofdm_min_rate(struct vnt_private *); +void vnt_adjust_tsf(struct vnt_private *, u8, u64, u64); +bool vnt_get_current_tsf(struct vnt_private *, u64 *); +bool vnt_clear_current_tsf(struct vnt_private *); +void vnt_reset_next_tbtt(struct vnt_private *, u16); +void vnt_update_next_tbtt(struct vnt_private *, u64, u16); +u64 vnt_get_next_tbtt(u64, u16); +u64 vnt_get_tsf_offset(u8 byRxRate, u64 qwTSF1, u64 qwTSF2); +int vnt_radio_power_off(struct vnt_private *); +int vnt_radio_power_on(struct vnt_private *); +u8 vnt_get_pkt_type(struct vnt_private *); +void vnt_set_bss_mode(struct vnt_private *); #endif /* __CARD_H__ */ diff --git a/drivers/staging/vt6656/channel.c b/drivers/staging/vt6656/channel.c index 5a4fa0e2581b..8412d0532fb2 100644 --- a/drivers/staging/vt6656/channel.c +++ b/drivers/staging/vt6656/channel.c @@ -28,446 +28,151 @@ * * * Revision History: - * 01-18-2005 RobertYu: remove the for loop searching in ChannelValid, - * change ChannelRuleTab to lookup-type, reorder table items. + * 01-18-2005 RobertYu: remove the for loop searching in + * ChannelValid, change ChannelRuleTab + * to lookup-type, reorder table items. * * */ -#include <linux/kernel.h> -#include "country.h" +#include "device.h" #include "channel.h" #include "rf.h" -static int msglevel = MSG_LEVEL_INFO; -//static int msglevel =MSG_LEVEL_DEBUG; - -static SChannelTblElement sChannelTbl[CB_MAX_CHANNEL+1] = -{ - {0, 0, false}, - {1, 2412, true}, - {2, 2417, true}, - {3, 2422, true}, - {4, 2427, true}, - {5, 2432, true}, - {6, 2437, true}, - {7, 2442, true}, - {8, 2447, true}, - {9, 2452, true}, - {10, 2457, true}, - {11, 2462, true}, - {12, 2467, true}, - {13, 2472, true}, - {14, 2484, true}, - {183, 4915, true}, //15 - {184, 4920, true}, //16 - {185, 4925, true}, //17 - {187, 4935, true}, //18 - {188, 4940, true}, //19 - {189, 4945, true}, //20 - {192, 4960, true}, //21 - {196, 4980, true}, //22 - {7, 5035, true}, //23 - {8, 5040, true}, //24 - {9, 5045, true}, //25 - {11, 5055, true}, //26 - {12, 5060, true}, //27 - {16, 5080, true}, //28 - {34, 5170, true}, //29 - {36, 5180, true}, //30 - {38, 5190, true}, //31 - {40, 5200, true}, //32 - {42, 5210, true}, //33 - {44, 5220, true}, //34 - {46, 5230, true}, //35 - {48, 5240, true}, //36 - {52, 5260, true}, //37 - {56, 5280, true}, //38 - {60, 5300, true}, //39 - {64, 5320, true}, //40 - {100, 5500, true}, //41 - {104, 5520, true}, //42 - {108, 5540, true}, //43 - {112, 5560, true}, //44 - {116, 5580, true}, //45 - {120, 5600, true}, //46 - {124, 5620, true}, //47 - {128, 5640, true}, //48 - {132, 5660, true}, //49 - {136, 5680, true}, //50 - {140, 5700, true}, //51 - {149, 5745, true}, //52 - {153, 5765, true}, //53 - {157, 5785, true}, //54 - {161, 5805, true}, //55 - {165, 5825, true} //56 +static struct ieee80211_rate vnt_rates_bg[] = { + { .bitrate = 10, .hw_value = RATE_1M }, + { .bitrate = 20, .hw_value = RATE_2M }, + { .bitrate = 55, .hw_value = RATE_5M }, + { .bitrate = 110, .hw_value = RATE_11M }, + { .bitrate = 60, .hw_value = RATE_6M }, + { .bitrate = 90, .hw_value = RATE_9M }, + { .bitrate = 120, .hw_value = RATE_12M }, + { .bitrate = 180, .hw_value = RATE_18M }, + { .bitrate = 240, .hw_value = RATE_24M }, + { .bitrate = 360, .hw_value = RATE_36M }, + { .bitrate = 480, .hw_value = RATE_48M }, + { .bitrate = 540, .hw_value = RATE_54M }, }; -/************************************************************************ - * The Radar regulation rules for each country - ************************************************************************/ -static struct -{ - u8 byChannelCountryCode; /* The country code */ - char chCountryCode[2]; - u8 bChannelIdxList[CB_MAX_CHANNEL]; /* Available channels Index */ - u8 byPower[CB_MAX_CHANNEL]; -} ChannelRuleTab[] = -{ -/************************************************************************ - * This table is based on Athero driver rules - ************************************************************************/ -/* Country Available channels, ended with 0 */ -/* 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 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 */ -{CCODE_FCC, {'U','S'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1} - , { 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 17, 0, 17, 0, 17, 23, 23, 23, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 30, 30, 30, 30} }, -{CCODE_TELEC, {'J','P'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} - , { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 23, 0, 0, 23, 0, 23, 23, 0, 23, 0, 0, 23, 23, 23, 0, 23, 0, 23, 0, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }, -{CCODE_ETSI, {'E','U'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0} - , { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 20, 0, 20, 0, 20, 20, 20, 20, 20, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 0} }, -{CCODE_RESV3, {' ',' '}, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} - , { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }, -{CCODE_RESV4, {' ',' '}, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} - , { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }, -{CCODE_RESV5, {' ',' '}, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} - , { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }, -{CCODE_RESV6, {' ',' '}, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} - , { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }, -{CCODE_RESV7, {' ',' '}, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} - , { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }, -{CCODE_RESV8, {' ',' '}, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} - , { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }, -{CCODE_RESV9, {' ',' '}, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} - , { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }, -{CCODE_RESVa, {' ',' '}, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} - , { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }, -{CCODE_RESVb, {' ',' '}, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} - , { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }, -{CCODE_RESVc, {' ',' '}, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} - , { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }, -{CCODE_RESVd, {' ',' '}, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} - , { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }, -{CCODE_RESVe, {' ',' '}, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} - , { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }, -{CCODE_ALLBAND, {' ',' '}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1} - , { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }, -{CCODE_ALBANIA, {'A','L'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} - , { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }, -{CCODE_ALGERIA, {'D','Z'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} - , { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }, -{CCODE_ARGENTINA, {'A','R'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0} - , { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 17, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 30, 30, 30, 0} }, -{CCODE_ARMENIA, {'A','M'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} - , { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 18, 0, 18, 0, 18, 18, 18, 18, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }, -{CCODE_AUSTRALIA, {'A','U'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1} - , { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 0, 23, 0, 23, 0, 23, 23, 23, 23, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 30, 30, 30, 30} }, -{CCODE_AUSTRIA, {'A','T'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} - , { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 15, 0, 15, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }, -{CCODE_AZERBAIJAN, {'A','Z'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} - , { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 18, 0, 18, 0, 18, 18, 18, 18, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }, -{CCODE_BAHRAIN, {'B','H'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} - , { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }, -{CCODE_BELARUS, {'B','Y'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} - , { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }, -{CCODE_BELGIUM, {'B','E'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} - , { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 18, 0, 18, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }, -{CCODE_BELIZE, {'B','Z'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1} - , { 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 30, 30, 30, 30} }, -{CCODE_BOLIVIA, {'B','O'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1} - , { 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 30, 30, 30, 30} }, -{CCODE_BRAZIL, {'B','R'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} - , { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }, -{CCODE_BRUNEI_DARUSSALAM, {'B','N'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1} - , { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 30, 30, 30, 30} }, -{CCODE_BULGARIA, {'B','G'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0} - , { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 0, 23, 0, 23, 0, 23, 23, 23, 0, 0, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 0, 0, 0, 0, 0} }, -{CCODE_CANADA, {'C','A'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1} - , { 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 17, 0, 17, 0, 17, 23, 23, 23, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 30, 30, 30, 30} }, -{CCODE_CHILE, {'C','L'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1} - , { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 17, 17, 17, 17} }, -{CCODE_CHINA, {'C','N'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1} - , { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 30, 30, 30, 30} }, -{CCODE_COLOMBIA, {'C','O'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1} - , { 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 17, 0, 17, 0, 17, 23, 23, 23, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 30, 30, 30, 30} }, -{CCODE_COSTA_RICA, {'C','R'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} - , { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }, -{CCODE_CROATIA, {'H','R'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} - , { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 20, 0, 20, 0, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }, -{CCODE_CYPRUS, {'C','Y'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0} - , { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 20, 0, 20, 0, 20, 20, 20, 20, 20, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 0} }, -{CCODE_CZECH, {'C','Z'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} - , { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 20, 0, 20, 0, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }, -{CCODE_DENMARK, {'D','K'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0} - , { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 20, 0, 20, 0, 20, 20, 20, 20, 20, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 0} }, -{CCODE_DOMINICAN_REPUBLIC, {'D','O'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1} - , { 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 17, 0, 17, 0, 17, 23, 23, 23, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 30, 30, 30, 30} }, -{CCODE_ECUADOR, {'E','C'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} - , { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }, -{CCODE_EGYPT, {'E','G'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} - , { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }, -{CCODE_EL_SALVADOR, {'S','V'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} - , { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }, -{CCODE_ESTONIA, {'E','E'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0} - , { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 20, 0, 20, 0, 20, 20, 20, 20, 20, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 0} }, -{CCODE_FINLAND, {'F','I'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0} - , { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 20, 0, 20, 0, 20, 20, 20, 20, 20, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 0} }, -{CCODE_FRANCE, {'F','R'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} - , { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 20, 0, 20, 0, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }, -{CCODE_GERMANY, {'D','E'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0} - , { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 20, 0, 20, 0, 20, 20, 20, 20, 20, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 0} }, -{CCODE_GREECE, {'G','R'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} - , { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }, -{CCODE_GEORGIA, {'G','E'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} - , { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 18, 0, 18, 0, 18, 18, 18, 18, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }, -{CCODE_GUATEMALA, {'G','T'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1} - , { 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 17, 0, 17, 0, 17, 23, 23, 23, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 30, 30, 30, 30} }, -{CCODE_HONDURAS, {'H','N'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} - , { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }, -{CCODE_HONG_KONG, {'H','K'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1} - , { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 0, 23, 0, 23, 0, 23, 23, 23, 23, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 30, 30, 30, 30} }, -{CCODE_HUNGARY, {'H','U'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} - , { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 18, 0, 18, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }, -{CCODE_ICELAND, {'I','S'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0} - , { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 20, 0, 20, 0, 20, 20, 20, 20, 20, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 0} }, -{CCODE_INDIA, {'I','N'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} - , { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }, -{CCODE_INDONESIA, {'I','D'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} - , { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }, -{CCODE_IRAN, {'I','R'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1} - , { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 30, 30, 30, 30} }, -{CCODE_IRELAND, {'I','E'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0} - , { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 20, 0, 20, 0, 20, 20, 20, 20, 20, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 0} }, -{CCODE_ITALY, {'I','T'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0} - , { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 20, 0, 20, 0, 20, 20, 20, 20, 20, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 0} }, -{CCODE_ISRAEL, {'I','L'}, { 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} - , { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }, -{CCODE_JAPAN, {'J','P'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} - , { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 0, 23, 0, 23, 0, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }, -{CCODE_JORDAN, {'J','O'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} - , { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }, -{CCODE_KAZAKHSTAN, {'K','Z'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} - , { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }, -{CCODE_KUWAIT, {'K','W'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} - , { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }, -{CCODE_LATVIA, {'L','V'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} - , { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }, -{CCODE_LEBANON, {'L','B'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} - , { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }, -{CCODE_LEICHTENSTEIN, {'L','I'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} - , { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 18, 0, 18, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }, -{CCODE_LITHUANIA, {'L','T'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0} - , { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 20, 0, 20, 0, 20, 20, 20, 20, 20, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 0} }, -{CCODE_LUXEMBURG, {'L','U'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0} - , { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 20, 0, 20, 0, 20, 20, 20, 20, 20, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 0} }, -{CCODE_MACAU, {'M','O'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1} - , { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 0, 23, 0, 23, 0, 23, 23, 23, 23, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 30, 30, 30, 30} }, -{CCODE_MACEDONIA, {'M','K'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} - , { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }, -{CCODE_MALTA, {'M','T'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0} - , { 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 16, 0, 16, 0, 16, 16, 16, 16, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 16, 16, 16, 0} }, -{CCODE_MALAYSIA, {'M','Y'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} - , { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }, -{CCODE_MEXICO, {'M','X'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1} - , { 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 17, 0, 17, 0, 17, 23, 23, 23, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 30, 30, 30, 30} }, -{CCODE_MONACO, {'M','C'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} - , { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 18, 0, 18, 0, 18, 18, 18, 18, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }, -{CCODE_MOROCCO, {'M','A'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} - , { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }, -{CCODE_NETHERLANDS, {'N','L'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0} - , { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 20, 0, 20, 0, 20, 20, 20, 20, 20, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 0} }, -{CCODE_NEW_ZEALAND, {'N','Z'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1} - , { 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 0, 23, 0, 23, 0, 23, 23, 23, 23, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 30, 30, 30, 30} }, -{CCODE_NORTH_KOREA, {'K','P'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0} - , { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 23, 23, 23, 0} }, -{CCODE_NORWAY, {'N','O'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0} - , { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 20, 0, 20, 0, 20, 20, 20, 20, 20, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 0} }, -{CCODE_OMAN, {'O','M'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} - , { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }, -{CCODE_PAKISTAN, {'P','K'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} - , { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }, -{CCODE_PANAMA, {'P','A'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1} - , { 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 17, 0, 17, 0, 17, 23, 23, 23, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 30, 30, 30, 30} }, -{CCODE_PERU, {'P','E'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} - , { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }, -{CCODE_PHILIPPINES, {'P','H'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1} - , { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 17, 0, 17, 0, 17, 23, 23, 23, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 30, 30, 30, 30} }, -{CCODE_POLAND, {'P','L'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0} - , { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 20, 0, 20, 0, 20, 20, 20, 20, 20, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 0} }, -{CCODE_PORTUGAL, {'P','T'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0} - , { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 20, 0, 20, 0, 20, 20, 20, 20, 20, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 0} }, -{CCODE_PUERTO_RICO, {'P','R'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1} - , { 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 17, 0, 17, 0, 17, 23, 23, 23, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 30, 30, 30, 30} }, -{CCODE_QATAR, {'Q','A'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} - , { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }, -{CCODE_ROMANIA, {'R','O'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} - , { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }, -{CCODE_RUSSIA, {'R','U'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} - , { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }, -{CCODE_SAUDI_ARABIA, {'S','A'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} - , { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }, -{CCODE_SINGAPORE, {'S','G'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1} - , { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 20, 0, 20, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 20, 20, 20, 20} }, -{CCODE_SLOVAKIA, {'S','K'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0} - , { 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 16, 0, 16, 0, 16, 16, 16, 16, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 16, 16, 16, 0} }, -{CCODE_SLOVENIA, {'S','I'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0} - , { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 20, 0, 20, 0, 20, 20, 20, 20, 20, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 0} }, -{CCODE_SOUTH_AFRICA, {'Z','A'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0} - , { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 20, 0, 20, 0, 20, 20, 20, 20, 20, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 0} }, -{CCODE_SOUTH_KOREA, {'K','R'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0} - , { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 23, 23, 23, 0} }, -{CCODE_SPAIN, {'E','S'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0} - , { 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 16, 0, 16, 0, 16, 16, 16, 16, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 16, 16, 16, 0} }, -{CCODE_SWEDEN, {'S','E'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0} - , { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 20, 0, 20, 0, 20, 20, 20, 20, 20, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 0} }, -{CCODE_SWITZERLAND, {'C','H'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} - , { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 18, 0, 18, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }, -{CCODE_SYRIA, {'S','Y'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} - , { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }, -{CCODE_TAIWAN, {'T','W'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0} - , { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 17, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 30, 30, 30, 0} }, -{CCODE_THAILAND, {'T','H'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0} - , { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 23, 23, 23, 0} }, -{CCODE_TRINIDAD_TOBAGO, {'T','T'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} - , { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 18, 0, 18, 0, 18, 18, 18, 18, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }, -{CCODE_TUNISIA, {'T','N'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} - , { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 20, 0, 20, 0, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }, -{CCODE_TURKEY, {'T','R'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} - , { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 20, 0, 20, 0, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }, -{CCODE_UK, {'G','B'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0} - , { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 20, 0, 20, 0, 20, 20, 20, 20, 20, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 0} }, -{CCODE_UKRAINE, {'U','A'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} - , { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }, -{CCODE_UNITED_ARAB_EMIRATES, {'A','E'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} - , { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }, -{CCODE_UNITED_STATES, {'U','S'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1} - , { 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 17, 0, 17, 0, 17, 23, 23, 23, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 30, 30, 30, 30} }, -{CCODE_URUGUAY, {'U','Y'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0} - , { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 23, 23, 23, 0} }, -{CCODE_UZBEKISTAN, {'U','Z'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} - , { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }, -{CCODE_VENEZUELA, {'V','E'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0} - , { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 23, 23, 23, 0} }, -{CCODE_VIETNAM, {'V','N'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} - , { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }, -{CCODE_YEMEN, {'Y','E'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} - , { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }, -{CCODE_ZIMBABWE, {'Z','W'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} - , { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }, -{CCODE_JAPAN_W52_W53, {'J','J'}, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} - , { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }, -{CCODE_MAX, {'U','N'}, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1} - , { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} } -/* 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 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 */ +static struct ieee80211_rate vnt_rates_a[] = { + { .bitrate = 60, .hw_value = RATE_6M }, + { .bitrate = 90, .hw_value = RATE_9M }, + { .bitrate = 120, .hw_value = RATE_12M }, + { .bitrate = 180, .hw_value = RATE_18M }, + { .bitrate = 240, .hw_value = RATE_24M }, + { .bitrate = 360, .hw_value = RATE_36M }, + { .bitrate = 480, .hw_value = RATE_48M }, + { .bitrate = 540, .hw_value = RATE_54M }, }; -/************************************************************************ - * Country Channel Valid - * Input: CountryCode, ChannelNum - * ChanneIndex is defined as VT3253 MAC channel: - * 1 = 2.4G channel 1 - * 2 = 2.4G channel 2 - * ... - * 14 = 2.4G channel 14 - * 15 = 4.9G channel 183 - * 16 = 4.9G channel 184 - * ..... - * Output: true if the specified 5GHz band is allowed to be used. - False otherwise. -// 4.9G => Ch 183, 184, 185, 187, 188, 189, 192, 196 (Value:15 ~ 22) - -// 5G => Ch 7, 8, 9, 11, 12, 16, 34, 36, 38, 40, 42, 44, 46, 48, 52, 56, 60, 64, -// 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140, 149, 153, 157, 161, 165 (Value 23 ~ 56) - ************************************************************************/ -bool -ChannelValid(unsigned int CountryCode, unsigned int ChannelIndex) -{ - bool bValid; - - bValid = false; - /* - * If Channel Index is invalid, return invalid - */ - if ((ChannelIndex > CB_MAX_CHANNEL) || - (ChannelIndex == 0)) - { - bValid = false; - goto exit; - } +static struct ieee80211_channel vnt_channels_2ghz[] = { + { .center_freq = 2412, .hw_value = 1 }, + { .center_freq = 2417, .hw_value = 2 }, + { .center_freq = 2422, .hw_value = 3 }, + { .center_freq = 2427, .hw_value = 4 }, + { .center_freq = 2432, .hw_value = 5 }, + { .center_freq = 2437, .hw_value = 6 }, + { .center_freq = 2442, .hw_value = 7 }, + { .center_freq = 2447, .hw_value = 8 }, + { .center_freq = 2452, .hw_value = 9 }, + { .center_freq = 2457, .hw_value = 10 }, + { .center_freq = 2462, .hw_value = 11 }, + { .center_freq = 2467, .hw_value = 12 }, + { .center_freq = 2472, .hw_value = 13 }, + { .center_freq = 2484, .hw_value = 14 } +}; - bValid = sChannelTbl[ChannelIndex].bValid; +static struct ieee80211_channel vnt_channels_5ghz[] = { + { .center_freq = 4915, .hw_value = 15 }, + { .center_freq = 4920, .hw_value = 16 }, + { .center_freq = 4925, .hw_value = 17 }, + { .center_freq = 4935, .hw_value = 18 }, + { .center_freq = 4940, .hw_value = 19 }, + { .center_freq = 4945, .hw_value = 20 }, + { .center_freq = 4960, .hw_value = 21 }, + { .center_freq = 4980, .hw_value = 22 }, + { .center_freq = 5035, .hw_value = 23 }, + { .center_freq = 5040, .hw_value = 24 }, + { .center_freq = 5045, .hw_value = 25 }, + { .center_freq = 5055, .hw_value = 26 }, + { .center_freq = 5060, .hw_value = 27 }, + { .center_freq = 5080, .hw_value = 28 }, + { .center_freq = 5170, .hw_value = 29 }, + { .center_freq = 5180, .hw_value = 30 }, + { .center_freq = 5190, .hw_value = 31 }, + { .center_freq = 5200, .hw_value = 32 }, + { .center_freq = 5210, .hw_value = 33 }, + { .center_freq = 5220, .hw_value = 34 }, + { .center_freq = 5230, .hw_value = 35 }, + { .center_freq = 5240, .hw_value = 36 }, + { .center_freq = 5260, .hw_value = 37 }, + { .center_freq = 5280, .hw_value = 38 }, + { .center_freq = 5300, .hw_value = 39 }, + { .center_freq = 5320, .hw_value = 40 }, + { .center_freq = 5500, .hw_value = 41 }, + { .center_freq = 5520, .hw_value = 42 }, + { .center_freq = 5540, .hw_value = 43 }, + { .center_freq = 5560, .hw_value = 44 }, + { .center_freq = 5580, .hw_value = 45 }, + { .center_freq = 5600, .hw_value = 46 }, + { .center_freq = 5620, .hw_value = 47 }, + { .center_freq = 5640, .hw_value = 48 }, + { .center_freq = 5660, .hw_value = 49 }, + { .center_freq = 5680, .hw_value = 50 }, + { .center_freq = 5700, .hw_value = 51 }, + { .center_freq = 5745, .hw_value = 52 }, + { .center_freq = 5765, .hw_value = 53 }, + { .center_freq = 5785, .hw_value = 54 }, + { .center_freq = 5805, .hw_value = 55 }, + { .center_freq = 5825, .hw_value = 56 } +}; -exit: - return (bValid); +static struct ieee80211_supported_band vnt_supported_2ghz_band = { + .channels = vnt_channels_2ghz, + .n_channels = ARRAY_SIZE(vnt_channels_2ghz), + .bitrates = vnt_rates_bg, + .n_bitrates = ARRAY_SIZE(vnt_rates_bg), +}; -} /* end ChannelValid */ +static struct ieee80211_supported_band vnt_supported_5ghz_band = { + .channels = vnt_channels_5ghz, + .n_channels = ARRAY_SIZE(vnt_channels_5ghz), + .bitrates = vnt_rates_a, + .n_bitrates = ARRAY_SIZE(vnt_rates_a), +}; -void CHvInitChannelTable(struct vnt_private *pDevice) +void vnt_init_bands(struct vnt_private *priv) { - bool bMultiBand = false; - int ii; - - for (ii = 1; ii <= CB_MAX_CHANNEL; ii++) - sChannelTbl[ii].bValid = false; + struct ieee80211_channel *ch; + int i; - switch (pDevice->byRFType) { - case RF_AL2230: - case RF_AL2230S: - case RF_VT3226: - case RF_VT3226D0: - bMultiBand = false; - break; - case RF_AIROHA7230: - case RF_VT3342A0: - default : - bMultiBand = true; - break; - } + switch (priv->rf_type) { + case RF_AIROHA7230: + case RF_VT3342A0: + default: + ch = vnt_channels_5ghz; - if (pDevice->b11hEable == true) { - if (bMultiBand == true) { - for (ii = 0; ii < CB_MAX_CHANNEL; ii++) { - sChannelTbl[ii+1].bValid = true; - //pDevice->abyRegPwr[ii+1] = pDevice->abyOFDMDefaultPwr[ii+1]; - //pDevice->abyLocalPwr[ii+1] = pDevice->abyOFDMDefaultPwr[ii+1]; - } - for (ii = 0; ii < CB_MAX_CHANNEL_24G; ii++) { - //pDevice->abyRegPwr[ii+1] = pDevice->abyCCKDefaultPwr[ii+1]; - //pDevice->abyLocalPwr[ii+1] = pDevice->abyCCKDefaultPwr[ii+1]; - } - } else { - for (ii = 0; ii < CB_MAX_CHANNEL_24G; ii++) { - sChannelTbl[ii+1].bValid = true; - //pDevice->abyRegPwr[ii+1] = pDevice->abyCCKDefaultPwr[ii+1]; - //pDevice->abyLocalPwr[ii+1] = pDevice->abyCCKDefaultPwr[ii+1]; + for (i = 0; i < ARRAY_SIZE(vnt_channels_5ghz); i++) { + ch[i].max_power = VNT_RF_MAX_POWER; + ch[i].flags = IEEE80211_CHAN_NO_HT40; } - } - } else if (pDevice->byZoneType <= CCODE_MAX) { - if (bMultiBand == true) { - for (ii = 0; ii < CB_MAX_CHANNEL; ii++) { - if (ChannelRuleTab[pDevice->byZoneType].bChannelIdxList[ii] != 0) { - sChannelTbl[ii+1].bValid = true; - //pDevice->abyRegPwr[ii+1] = ChannelRuleTab[pDevice->byZoneType].byPower[ii]; - //pDevice->abyLocalPwr[ii+1] = ChannelRuleTab[pDevice->byZoneType].byPower[ii]; - } - } - } else { - for (ii = 0; ii < CB_MAX_CHANNEL_24G; ii++) { - if (ChannelRuleTab[pDevice->byZoneType].bChannelIdxList[ii] != 0) { - sChannelTbl[ii+1].bValid = true; - //pDevice->abyRegPwr[ii+1] = ChannelRuleTab[pDevice->byZoneType].byPower[ii]; - //pDevice->abyLocalPwr[ii+1] = ChannelRuleTab[pDevice->byZoneType].byPower[ii]; - } + + priv->hw->wiphy->bands[IEEE80211_BAND_5GHZ] = + &vnt_supported_5ghz_band; + /* fallthrough */ + case RF_AL2230: + case RF_AL2230S: + case RF_VT3226: + case RF_VT3226D0: + ch = vnt_channels_2ghz; + + for (i = 0; i < ARRAY_SIZE(vnt_channels_2ghz); i++) { + ch[i].max_power = VNT_RF_MAX_POWER; + ch[i].flags = IEEE80211_CHAN_NO_HT40; } - } - } - DBG_PRT(MSG_LEVEL_NOTICE, KERN_INFO"Zone=[%d][%c][%c]!!\n",pDevice->byZoneType,ChannelRuleTab[pDevice->byZoneType].chCountryCode[0],ChannelRuleTab[pDevice->byZoneType].chCountryCode[1]); - for (ii = 0; ii < CB_MAX_CHANNEL; ii++) { - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Channel[%d] is [%d]\n",sChannelTbl[ii].byChannelNumber,sChannelTbl[ii+1].bValid); - /*if (pDevice->abyRegPwr[ii+1] == 0) { - pDevice->abyRegPwr[ii+1] = pDevice->abyOFDMDefaultPwr[ii+1]; - } - if (pDevice->abyLocalPwr[ii+1] == 0) { - pDevice->abyLocalPwr[ii+1] = pDevice->abyOFDMDefaultPwr[ii+1]; - }*/ - } + + priv->hw->wiphy->bands[IEEE80211_BAND_2GHZ] = + &vnt_supported_2ghz_band; + break; + } } diff --git a/drivers/staging/vt6656/channel.h b/drivers/staging/vt6656/channel.h index 95701e0cbee3..21c080803714 100644 --- a/drivers/staging/vt6656/channel.h +++ b/drivers/staging/vt6656/channel.h @@ -32,13 +32,6 @@ #include "device.h" -typedef struct tagSChannelTblElement { - u8 byChannelNumber; - unsigned int uFrequency; - bool bValid; -} SChannelTblElement, *PSChannelTblElement; - -bool ChannelValid(unsigned int CountryCode, unsigned int ChannelNum); -void CHvInitChannelTable(struct vnt_private *pDevice); +void vnt_init_bands(struct vnt_private *); #endif /* _CHANNEL_H_ */ diff --git a/drivers/staging/vt6656/country.h b/drivers/staging/vt6656/country.h deleted file mode 100644 index a0320d8f1362..000000000000 --- a/drivers/staging/vt6656/country.h +++ /dev/null @@ -1,162 +0,0 @@ -/* - * Copyright (c) 1996, 2003 VIA Networking Technologies, Inc. - * All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - * - * - * File: country.h - * - * Purpose: Country Code information - * - * Author: Lucas Lin - * - * Date: Dec 23, 2004 - * - */ - -#ifndef __COUNTRY_H__ -#define __COUNTRY_H__ - -/************************************************************************ - * The definition here should be complied with the INF country order - * Please check with VNWL.inf/VNWL64.inf/VNWL*.inf - ************************************************************************/ -typedef enum _COUNTRY_CODE { - CCODE_FCC = 0, - CCODE_TELEC, - CCODE_ETSI, - CCODE_RESV3, - CCODE_RESV4, - CCODE_RESV5, - CCODE_RESV6, - CCODE_RESV7, - CCODE_RESV8, - CCODE_RESV9, - CCODE_RESVa, - CCODE_RESVb, - CCODE_RESVc, - CCODE_RESVd, - CCODE_RESVe, - CCODE_ALLBAND, - CCODE_ALBANIA, - CCODE_ALGERIA, - CCODE_ARGENTINA, - CCODE_ARMENIA, - CCODE_AUSTRALIA, - CCODE_AUSTRIA, - CCODE_AZERBAIJAN, - CCODE_BAHRAIN, - CCODE_BELARUS, - CCODE_BELGIUM, - CCODE_BELIZE, - CCODE_BOLIVIA, - CCODE_BRAZIL, - CCODE_BRUNEI_DARUSSALAM, - CCODE_BULGARIA, - CCODE_CANADA, - CCODE_CHILE, - CCODE_CHINA, - CCODE_COLOMBIA, - CCODE_COSTA_RICA, - CCODE_CROATIA, - CCODE_CYPRUS, - CCODE_CZECH, - CCODE_DENMARK, - CCODE_DOMINICAN_REPUBLIC, - CCODE_ECUADOR, - CCODE_EGYPT, - CCODE_EL_SALVADOR, - CCODE_ESTONIA, - CCODE_FINLAND, - CCODE_FRANCE, - CCODE_GERMANY, - CCODE_GREECE, - CCODE_GEORGIA, - CCODE_GUATEMALA, - CCODE_HONDURAS, - CCODE_HONG_KONG, - CCODE_HUNGARY, - CCODE_ICELAND, - CCODE_INDIA, - CCODE_INDONESIA, - CCODE_IRAN, - CCODE_IRELAND, - CCODE_ITALY, - CCODE_ISRAEL, - CCODE_JAPAN, - CCODE_JORDAN, - CCODE_KAZAKHSTAN, - CCODE_KUWAIT, - CCODE_LATVIA, - CCODE_LEBANON, - CCODE_LEICHTENSTEIN, - CCODE_LITHUANIA, - CCODE_LUXEMBURG, - CCODE_MACAU, - CCODE_MACEDONIA, - CCODE_MALTA, - CCODE_MALAYSIA, - CCODE_MEXICO, - CCODE_MONACO, - CCODE_MOROCCO, - CCODE_NETHERLANDS, - CCODE_NEW_ZEALAND, - CCODE_NORTH_KOREA, - CCODE_NORWAY, - CCODE_OMAN, - CCODE_PAKISTAN, - CCODE_PANAMA, - CCODE_PERU, - CCODE_PHILIPPINES, - CCODE_POLAND, - CCODE_PORTUGAL, - CCODE_PUERTO_RICO, - CCODE_QATAR, - CCODE_ROMANIA, - CCODE_RUSSIA, - CCODE_SAUDI_ARABIA, - CCODE_SINGAPORE, - CCODE_SLOVAKIA, - CCODE_SLOVENIA, - CCODE_SOUTH_AFRICA, - CCODE_SOUTH_KOREA, - CCODE_SPAIN, - CCODE_SWEDEN, - CCODE_SWITZERLAND, - CCODE_SYRIA, - CCODE_TAIWAN, - CCODE_THAILAND, - CCODE_TRINIDAD_TOBAGO, - CCODE_TUNISIA, - CCODE_TURKEY, - CCODE_UK, - CCODE_UKRAINE, - CCODE_UNITED_ARAB_EMIRATES, - CCODE_UNITED_STATES, - CCODE_URUGUAY, - CCODE_UZBEKISTAN, - CCODE_VENEZUELA, - CCODE_VIETNAM, - CCODE_YEMEN, - CCODE_ZIMBABWE, - CCODE_JAPAN_W52_W53, - CCODE_MAX -} COUNTRY_CODE; - -/************************************************************************ - * Function prototype - ************************************************************************/ -#endif /* __COUNTRY_H__ */ diff --git a/drivers/staging/vt6656/datarate.c b/drivers/staging/vt6656/datarate.c deleted file mode 100644 index 8032d6b5b383..000000000000 --- a/drivers/staging/vt6656/datarate.c +++ /dev/null @@ -1,364 +0,0 @@ -/* - * Copyright (c) 1996, 2003 VIA Networking Technologies, Inc. - * All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - * - * File: datarate.c - * - * Purpose: Handles the auto fallback & data rates functions - * - * Author: Lyndon Chen - * - * Date: July 17, 2002 - * - * Functions: - * RATEvParseMaxRate - Parsing the highest basic & support rate in rate field of frame - * RATEvTxRateFallBack - Rate fallback Algorithm Implementaion - * RATEuSetIE- Set rate IE field. - * - * Revision History: - * - */ - -#include "tmacro.h" -#include "mac.h" -#include "80211mgr.h" -#include "bssdb.h" -#include "datarate.h" -#include "card.h" -#include "baseband.h" -#include "rf.h" - -/* static int msglevel = MSG_LEVEL_DEBUG; */ -static int msglevel = MSG_LEVEL_INFO; -static const u8 acbyIERate[MAX_RATE] = {0x02, 0x04, 0x0B, 0x16, 0x0C, 0x12, 0x18, - 0x24, 0x30, 0x48, 0x60, 0x6C}; - -#define AUTORATE_TXOK_CNT 0x0400 -#define AUTORATE_TXFAIL_CNT 0x0064 -#define AUTORATE_TIMEOUT 10 - -void s_vResetCounter(PKnownNodeDB psNodeDBTable); - -void s_vResetCounter(PKnownNodeDB psNodeDBTable) -{ - u8 ii; - - /* clear statistics counter for auto_rate */ - for (ii = 0; ii <= MAX_RATE; ii++) { - psNodeDBTable->uTxOk[ii] = 0; - psNodeDBTable->uTxFail[ii] = 0; - } -} - -/*+ - * - * Routine Description: - * Rate fallback Algorithm Implementaion - * - * Parameters: - * In: - * pDevice - Pointer to the adapter - * psNodeDBTable - Pointer to Node Data Base - * Out: - * none - * - * Return Value: none - * --*/ -#define AUTORATE_TXCNT_THRESHOLD 20 -#define AUTORATE_INC_THRESHOLD 30 - -/*+ - * - * Description: - * Get RateIdx from the value in SuppRates IE or ExtSuppRates IE - * - * Parameters: - * In: - * u8 - Rate value in SuppRates IE or ExtSuppRates IE - * Out: - * none - * - * Return Value: RateIdx - * --*/ -u16 RATEwGetRateIdx(u8 byRate) -{ - u16 ii; - - /* erase BasicRate flag */ - byRate = byRate & 0x7F; - - for (ii = 0; ii < MAX_RATE; ii++) { - if (acbyIERate[ii] == byRate) - return ii; - } - return 0; -} - -/*+ - * - * Description: - * Parsing the highest basic & support rate in rate field of frame. - * - * Parameters: - * In: - * pDevice - Pointer to the adapter - * pItemRates - Pointer to Rate field defined in 802.11 spec. - * pItemExtRates - Pointer to Extended Rate field defined in 802.11 spec. - * Out: - * pwMaxBasicRate - Maximum Basic Rate - * pwMaxSuppRate - Maximum Supported Rate - * pbyTopCCKRate - Maximum Basic Rate in CCK mode - * pbyTopOFDMRate - Maximum Basic Rate in OFDM mode - * - * Return Value: none - * --*/ - -void RATEvParseMaxRate(struct vnt_private *pDevice, - PWLAN_IE_SUPP_RATES pItemRates, PWLAN_IE_SUPP_RATES pItemExtRates, - int bUpdateBasicRate, u16 *pwMaxBasicRate, u16 *pwMaxSuppRate, - u16 *pwSuppRate, u8 *pbyTopCCKRate, u8 *pbyTopOFDMRate) -{ - int ii; - u8 byHighSuppRate = 0, byRate = 0; - u16 wOldBasicRate = pDevice->wBasicRate; - u32 uRateLen; - - if (pItemRates == NULL) - return; - - *pwSuppRate = 0; - uRateLen = pItemRates->len; - - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"ParseMaxRate Len: %d\n", uRateLen); - if (pDevice->byBBType != BB_TYPE_11B) { - if (uRateLen > WLAN_RATES_MAXLEN) - uRateLen = WLAN_RATES_MAXLEN; - } else { - if (uRateLen > WLAN_RATES_MAXLEN_11B) - uRateLen = WLAN_RATES_MAXLEN_11B; - } - - for (ii = 0; ii < uRateLen; ii++) { - byRate = (u8)(pItemRates->abyRates[ii]); - if (WLAN_MGMT_IS_BASICRATE(byRate) && - (bUpdateBasicRate == true)) { - /* - * add to basic rate set, update pDevice->byTopCCKBasicRate and - * pDevice->byTopOFDMBasicRate - */ - CARDbAddBasicRate((void *)pDevice, RATEwGetRateIdx(byRate)); - DBG_PRT(MSG_LEVEL_DEBUG, - KERN_INFO"ParseMaxRate AddBasicRate: %d\n", - RATEwGetRateIdx(byRate)); - } - byRate = (u8)(pItemRates->abyRates[ii]&0x7F); - if (byHighSuppRate == 0) - byHighSuppRate = byRate; - if (byRate > byHighSuppRate) - byHighSuppRate = byRate; - *pwSuppRate |= (1<<RATEwGetRateIdx(byRate)); - } - if ((pItemExtRates != NULL) && (pItemExtRates->byElementID == WLAN_EID_EXTSUPP_RATES) && - (pDevice->byBBType != BB_TYPE_11B)) { - - unsigned int uExtRateLen = pItemExtRates->len; - - if (uExtRateLen > WLAN_RATES_MAXLEN) - uExtRateLen = WLAN_RATES_MAXLEN; - - for (ii = 0; ii < uExtRateLen; ii++) { - byRate = (u8)(pItemExtRates->abyRates[ii]); - /* select highest basic rate */ - if (WLAN_MGMT_IS_BASICRATE(pItemExtRates->abyRates[ii])) { - /* - * add to basic rate set, update pDevice->byTopCCKBasicRate and - * pDevice->byTopOFDMBasicRate - */ - CARDbAddBasicRate((void *)pDevice, RATEwGetRateIdx(byRate)); - DBG_PRT(MSG_LEVEL_DEBUG, - KERN_INFO"ParseMaxRate AddBasicRate: %d\n", - RATEwGetRateIdx(byRate)); - } - byRate = (u8)(pItemExtRates->abyRates[ii]&0x7F); - if (byHighSuppRate == 0) - byHighSuppRate = byRate; - if (byRate > byHighSuppRate) - byHighSuppRate = byRate; - *pwSuppRate |= (1<<RATEwGetRateIdx(byRate)); - - /* DBG_PRN_GRP09(("ParseMaxRate : HighSuppRate: %d, %X\n", - * RATEwGetRateIdx(byRate), byRate)); - */ - } - } - - if ((pDevice->byPacketType == PK_TYPE_11GB) - && CARDbIsOFDMinBasicRate((void *)pDevice)) { - pDevice->byPacketType = PK_TYPE_11GA; - } - - *pbyTopCCKRate = pDevice->byTopCCKBasicRate; - *pbyTopOFDMRate = pDevice->byTopOFDMBasicRate; - *pwMaxSuppRate = RATEwGetRateIdx(byHighSuppRate); - if ((pDevice->byPacketType == PK_TYPE_11B) || (pDevice->byPacketType == PK_TYPE_11GB)) - *pwMaxBasicRate = pDevice->byTopCCKBasicRate; - else - *pwMaxBasicRate = pDevice->byTopOFDMBasicRate; - if (wOldBasicRate != pDevice->wBasicRate) - CARDvSetRSPINF((void *)pDevice, pDevice->byBBType); - - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Exit ParseMaxRate\n"); -} - -/*+ - * - * Routine Description: - * Rate fallback Algorithm Implementaion - * - * Parameters: - * In: - * pDevice - Pointer to the adapter - * psNodeDBTable - Pointer to Node Data Base - * Out: - * none - * - * Return Value: none - * --*/ -#define AUTORATE_TXCNT_THRESHOLD 20 -#define AUTORATE_INC_THRESHOLD 30 - -void RATEvTxRateFallBack(struct vnt_private *pDevice, - PKnownNodeDB psNodeDBTable) -{ - struct vnt_manager *pMgmt = &pDevice->vnt_mgmt; - u16 wIdxDownRate = 0; - int ii; - int bAutoRate[MAX_RATE] = {true, true, true, true, false, false, true, - true, true, true, true, true}; - u32 dwThroughputTbl[MAX_RATE] = {10, 20, 55, 110, 60, 90, 120, 180, - 240, 360, 480, 540}; - u32 dwThroughput = 0; - u16 wIdxUpRate = 0; - u32 dwTxDiff = 0; - - if (pMgmt->eScanState != WMAC_NO_SCANNING) - return; /* Don't do Fallback when scanning Channel */ - - psNodeDBTable->uTimeCount++; - - if (psNodeDBTable->uTxFail[MAX_RATE] > psNodeDBTable->uTxOk[MAX_RATE]) - dwTxDiff = psNodeDBTable->uTxFail[MAX_RATE] - psNodeDBTable->uTxOk[MAX_RATE]; - - if ((psNodeDBTable->uTxOk[MAX_RATE] < AUTORATE_TXOK_CNT) && - (dwTxDiff < AUTORATE_TXFAIL_CNT) && - (psNodeDBTable->uTimeCount < AUTORATE_TIMEOUT)) { - return; - } - - if (psNodeDBTable->uTimeCount >= AUTORATE_TIMEOUT) - psNodeDBTable->uTimeCount = 0; - - for (ii = 0; ii < MAX_RATE; ii++) { - if (psNodeDBTable->wSuppRate & (0x0001<<ii)) { - if (bAutoRate[ii] == true) - wIdxUpRate = (u16) ii; - } else { - bAutoRate[ii] = false; - } - } - - for (ii = 0; ii <= psNodeDBTable->wTxDataRate; ii++) { - if ((psNodeDBTable->uTxOk[ii] != 0) || - (psNodeDBTable->uTxFail[ii] != 0)) { - dwThroughputTbl[ii] *= psNodeDBTable->uTxOk[ii]; - if (ii < RATE_11M) - psNodeDBTable->uTxFail[ii] *= 4; - dwThroughputTbl[ii] /= (psNodeDBTable->uTxOk[ii] + psNodeDBTable->uTxFail[ii]); - } - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Rate %d,Ok: %d, Fail:%d, Throughput:%d\n", - ii, (int)psNodeDBTable->uTxOk[ii], (int)psNodeDBTable->uTxFail[ii], (int)dwThroughputTbl[ii]); - } - dwThroughput = dwThroughputTbl[psNodeDBTable->wTxDataRate]; - - wIdxDownRate = psNodeDBTable->wTxDataRate; - for (ii = psNodeDBTable->wTxDataRate; ii > 0;) { - ii--; - if ((dwThroughputTbl[ii] > dwThroughput) && - (bAutoRate[ii] == true)) { - dwThroughput = dwThroughputTbl[ii]; - wIdxDownRate = (u16) ii; - } - } - psNodeDBTable->wTxDataRate = wIdxDownRate; - if (psNodeDBTable->uTxOk[MAX_RATE]) { - if (psNodeDBTable->uTxOk[MAX_RATE] > - (psNodeDBTable->uTxFail[MAX_RATE] * 4)) { - psNodeDBTable->wTxDataRate = wIdxUpRate; - } - } else { /* adhoc, if uTxOk(total) == 0 & uTxFail(total) == 0 */ - if (psNodeDBTable->uTxFail[MAX_RATE] == 0) - psNodeDBTable->wTxDataRate = wIdxUpRate; - } - - if (pDevice->byBBType == BB_TYPE_11A) { - if (psNodeDBTable->wTxDataRate <= RATE_11M) - psNodeDBTable->wTxDataRate = RATE_6M; - } - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"uTxOk[MAX_RATE] %d, uTxFail[MAX_RATE]:%d\n", (int)psNodeDBTable->uTxOk[MAX_RATE], (int)psNodeDBTable->uTxFail[MAX_RATE]); - s_vResetCounter(psNodeDBTable); - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Rate: %d, U:%d, D:%d\n", (int)psNodeDBTable->wTxDataRate, (int)wIdxUpRate, (int)wIdxDownRate); - return; -} - -/*+ - * - * Description: - * This routine is used to assemble available Rate IE. - * - * Parameters: - * In: - * pDevice - * Out: - * - * Return Value: None - * --*/ -u8 RATEuSetIE(PWLAN_IE_SUPP_RATES pSrcRates, PWLAN_IE_SUPP_RATES pDstRates, - unsigned int uRateLen) -{ - unsigned int ii, uu, uRateCnt = 0; - - if ((pSrcRates == NULL) || (pDstRates == NULL)) - return 0; - - if (pSrcRates->len == 0) - return 0; - - for (ii = 0; ii < uRateLen; ii++) { - for (uu = 0; uu < pSrcRates->len; uu++) { - if ((pSrcRates->abyRates[uu] & 0x7F) == acbyIERate[ii]) { - pDstRates->abyRates[uRateCnt++] = pSrcRates->abyRates[uu]; - break; - } - } - } - return (u8)uRateCnt; -} diff --git a/drivers/staging/vt6656/datarate.h b/drivers/staging/vt6656/datarate.h deleted file mode 100644 index 96252adf1ea6..000000000000 --- a/drivers/staging/vt6656/datarate.h +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Copyright (c) 1996, 2003 VIA Networking Technologies, Inc. - * All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - * - * - * File: datarate.h - * - * Purpose: Handles the auto fallback & data rates functions - * - * Author: Lyndon Chen - * - * Date: July 16, 2002 - * - */ -#ifndef __DATARATE_H__ -#define __DATARATE_H__ - -#define FALLBACK_PKT_COLLECT_TR_H 50 /* pkts */ -#define FALLBACK_PKT_COLLECT_TR_L 10 /* pkts */ -#define FALLBACK_POLL_SECOND 5 /* 5 sec */ -#define FALLBACK_RECOVER_SECOND 30 /* 30 sec */ -#define FALLBACK_THRESHOLD 15 /* percent */ -#define UPGRADE_THRESHOLD 5 /* percent */ -#define UPGRADE_CNT_THRD 3 /* times */ -#define RETRY_TIMES_THRD_H 2 /* times */ -#define RETRY_TIMES_THRD_L 1 /* times */ - -#define RATE_1M 0 -#define RATE_2M 1 -#define RATE_5M 2 -#define RATE_11M 3 -#define RATE_6M 4 -#define RATE_9M 5 -#define RATE_12M 6 -#define RATE_18M 7 -#define RATE_24M 8 -#define RATE_36M 9 -#define RATE_48M 10 -#define RATE_54M 11 -#define RATE_AUTO 12 - -void RATEvParseMaxRate(struct vnt_private *, PWLAN_IE_SUPP_RATES pItemRates, - PWLAN_IE_SUPP_RATES pItemExtRates, int bUpdateBasicRate, - u16 *pwMaxBasicRate, u16 *pwMaxSuppRate, u16 *pwSuppRate, - u8 *pbyTopCCKRate, u8 *pbyTopOFDMRate); - -void RATEvTxRateFallBack(struct vnt_private *pDevice, - PKnownNodeDB psNodeDBTable); - -u8 -RATEuSetIE( - PWLAN_IE_SUPP_RATES pSrcRates, - PWLAN_IE_SUPP_RATES pDstRates, - unsigned int uRateLen - ); - -u16 -RATEwGetRateIdx( - u8 byRate - ); - -#endif /* __DATARATE_H__ */ diff --git a/drivers/staging/vt6656/desc.h b/drivers/staging/vt6656/desc.h index 617d479b85cc..f79af8513ff2 100644 --- a/drivers/staging/vt6656/desc.h +++ b/drivers/staging/vt6656/desc.h @@ -34,8 +34,6 @@ #include <linux/types.h> #include <linux/mm.h> -#include "tether.h" - /* max transmit or receive buffer size */ #define CB_MAX_BUF_SIZE 2900U /* NOTE: must be multiple of 4 */ diff --git a/drivers/staging/vt6656/device.h b/drivers/staging/vt6656/device.h index 5b64ca7b62f3..5a7ca527106e 100644 --- a/drivers/staging/vt6656/device.h +++ b/drivers/staging/vt6656/device.h @@ -35,15 +35,13 @@ #include <linux/delay.h> #include <linux/device.h> #include <linux/firmware.h> -#include <linux/etherdevice.h> #include <linux/suspend.h> #include <linux/if_arp.h> #include <linux/wireless.h> -#include <net/iw_handler.h> -#include <net/cfg80211.h> #include <linux/timer.h> #include <linux/usb.h> #include <linux/crc32.h> +#include <net/mac80211.h> #ifdef SIOCETHTOOL #define DEVICE_ETHTOOL_IOCTL_SUPPORT @@ -52,17 +50,27 @@ #undef DEVICE_ETHTOOL_IOCTL_SUPPORT #endif +#define RATE_1M 0 +#define RATE_2M 1 +#define RATE_5M 2 +#define RATE_11M 3 +#define RATE_6M 4 +#define RATE_9M 5 +#define RATE_12M 6 +#define RATE_18M 7 +#define RATE_24M 8 +#define RATE_36M 9 +#define RATE_48M 10 +#define RATE_54M 11 +#define RATE_AUTO 12 + #define MAX_RATE 12 /* * device specific */ -#include "80211hdr.h" -#include "tether.h" -#include "wmgr.h" #include "wcmd.h" -#include "rc4.h" #include "desc.h" #include "key.h" #include "card.h" @@ -73,7 +81,7 @@ #define DEVICE_NAME "vt6656" #define DEVICE_FULL_DRV_NAM "VIA Networking Wireless LAN USB Driver" -#define DEVICE_VERSION "1.19_12" +#define DEVICE_VERSION "mac80211" #define CONFIG_PATH "/etc/vntconfiguration.dat" @@ -177,23 +185,6 @@ /* USB registers */ #define USB_REG4 0x604 -#ifndef RUN_AT -#define RUN_AT(x) (jiffies+(x)) -#endif - -#define PRIVATE_Message 0 - -#define DBG_PRT(l, p, args...) { if (l <= msglevel) printk(p, ##args); } -#define PRINT_K(p, args...) { if (PRIVATE_Message) printk(p, ##args); } - -typedef enum __device_msg_level { - MSG_LEVEL_ERR = 0, /* Errors causing abnormal operation */ - MSG_LEVEL_NOTICE = 1, /* Errors needing user notification */ - MSG_LEVEL_INFO = 2, /* Normal message. */ - MSG_LEVEL_VERBOSE = 3, /* Will report all trival errors. */ - MSG_LEVEL_DEBUG = 4 /* Only for debug purpose. */ -} DEVICE_MSG_LEVEL, *PDEVICE_MSG_LEVEL; - #define DEVICE_INIT_COLD 0x0 /* cold init */ #define DEVICE_INIT_RESET 0x1 /* reset init or Dx to D0 power remain */ #define DEVICE_INIT_DXPL 0x2 /* Dx to D0 power lost init */ @@ -222,18 +213,16 @@ struct vnt_rsp_card_init { */ enum { CONTEXT_DATA_PACKET = 1, - CONTEXT_MGMT_PACKET + CONTEXT_MGMT_PACKET, + CONTEXT_BEACON_PACKET }; /* RCB (Receive Control Block) */ struct vnt_rcb { - void *Next; - signed long Ref; - void *pDevice; - struct urb *pUrb; - struct vnt_rx_mgmt sMngPacket; + void *priv; + struct urb *urb; struct sk_buff *skb; - int bBoolInUse; + int in_use; }; /* used to track bulk out irps */ @@ -241,28 +230,20 @@ struct vnt_usb_send_context { void *priv; struct sk_buff *skb; struct urb *urb; + struct ieee80211_hdr *hdr; unsigned int buf_len; + u32 frame_len; + u16 tx_hdr_size; + u16 tx_rate; u8 type; + u8 pkt_no; + u8 pkt_type; + u8 need_ack; + u8 fb_option; bool in_use; unsigned char data[MAX_TOTAL_SIZE_WITH_ALL_HEADERS]; }; -/* tx packet info for rxtx */ -struct vnt_tx_pkt_info { - u16 fifo_ctl; - u8 dest_addr[ETH_ALEN]; -}; - -/* structure got from configuration file as user-desired default settings */ -typedef struct _DEFAULT_CONFIG { - signed int ZoneType; - signed int eConfigMode; - signed int eAuthenMode; /* open/wep/wpa */ - signed int bShareKeyAlgorithm; /* open-open/{open,wep}-sharekey */ - signed int keyidx; /* wepkey index */ - signed int eEncryptionStatus; -} DEFAULT_CONFIG, *PDEFAULT_CONFIG; - /* * Structure to keep track of USB interrupt packets */ @@ -273,463 +254,154 @@ struct vnt_interrupt_buffer { /*++ NDIS related */ -typedef enum __DEVICE_NDIS_STATUS { - STATUS_SUCCESS = 0, - STATUS_FAILURE, - STATUS_RESOURCES, - STATUS_PENDING, -} DEVICE_NDIS_STATUS, *PDEVICE_NDIS_STATUS; - -#define MAX_BSSIDINFO_4_PMKID 16 -#define MAX_PMKIDLIST 5 -/* flags for PMKID Candidate list structure */ -#define NDIS_802_11_PMKID_CANDIDATE_PREAUTH_ENABLED 0x01 - -/* PMKID Structures */ -typedef unsigned char NDIS_802_11_PMKID_VALUE[16]; - -typedef enum _NDIS_802_11_WEP_STATUS -{ - Ndis802_11WEPEnabled, - Ndis802_11Encryption1Enabled = Ndis802_11WEPEnabled, - Ndis802_11WEPDisabled, - Ndis802_11EncryptionDisabled = Ndis802_11WEPDisabled, - Ndis802_11WEPKeyAbsent, - Ndis802_11Encryption1KeyAbsent = Ndis802_11WEPKeyAbsent, - Ndis802_11WEPNotSupported, - Ndis802_11EncryptionNotSupported = Ndis802_11WEPNotSupported, - Ndis802_11Encryption2Enabled, - Ndis802_11Encryption2KeyAbsent, - Ndis802_11Encryption3Enabled, - Ndis802_11Encryption3KeyAbsent -} NDIS_802_11_WEP_STATUS, *PNDIS_802_11_WEP_STATUS, - NDIS_802_11_ENCRYPTION_STATUS, *PNDIS_802_11_ENCRYPTION_STATUS; - -typedef enum _NDIS_802_11_STATUS_TYPE -{ - Ndis802_11StatusType_Authentication, - Ndis802_11StatusType_MediaStreamMode, - Ndis802_11StatusType_PMKID_CandidateList, - Ndis802_11StatusTypeMax, /* not a real type, defined as upper bound */ -} NDIS_802_11_STATUS_TYPE, *PNDIS_802_11_STATUS_TYPE; - -/* added new types for PMKID Candidate lists */ -typedef struct _PMKID_CANDIDATE { - NDIS_802_11_MAC_ADDRESS BSSID; - unsigned long Flags; -} PMKID_CANDIDATE, *PPMKID_CANDIDATE; - -typedef struct _BSSID_INFO -{ - NDIS_802_11_MAC_ADDRESS BSSID; - NDIS_802_11_PMKID_VALUE PMKID; -} BSSID_INFO, *PBSSID_INFO; - -typedef struct tagSPMKID { - unsigned long Length; - unsigned long BSSIDInfoCount; - BSSID_INFO BSSIDInfo[MAX_BSSIDINFO_4_PMKID]; -} SPMKID, *PSPMKID; - -typedef struct tagSPMKIDCandidateEvent { - NDIS_802_11_STATUS_TYPE StatusType; - unsigned long Version; /* Version of the structure */ - unsigned long NumCandidates; /* No. of pmkid candidates */ - PMKID_CANDIDATE CandidateList[MAX_PMKIDLIST]; -} SPMKIDCandidateEvent, *PSPMKIDCandidateEvent; - -/* The receive duplicate detection cache entry */ -typedef struct tagSCacheEntry{ - __le16 wFmSequence; - u8 abyAddr2[ETH_ALEN]; - __le16 wFrameCtl; -} SCacheEntry, *PSCacheEntry; - -typedef struct tagSCache{ -/* The receive cache is updated circularly. The next entry to be written is - * indexed by the "InPtr". - */ - unsigned int uInPtr; /* Place to use next */ - SCacheEntry asCacheEntry[DUPLICATE_RX_CACHE_LENGTH]; -} SCache, *PSCache; - -#define CB_MAX_RX_FRAG 64 -/* - * DeFragment Control Block, used for collecting fragments prior to reassembly - */ -typedef struct tagSDeFragControlBlock -{ - u16 wSequence; - u16 wFragNum; - u8 abyAddr2[ETH_ALEN]; - unsigned int uLifetime; - struct sk_buff* skb; - u8 * pbyRxBuffer; - unsigned int cbFrameLength; - bool bInUse; -} SDeFragControlBlock, *PSDeFragControlBlock; +enum { + STATUS_SUCCESS = 0, + STATUS_FAILURE, + STATUS_RESOURCES, + STATUS_PENDING, +}; /* flags for options */ -#define DEVICE_FLAGS_UNPLUG 0x00000001UL - -/* flags for driver status */ -#define DEVICE_FLAGS_OPENED 0x00010000UL - -typedef struct __device_opt { - int nRxDescs0; /* number of RX descriptors 0 */ - int nTxDescs0; /* number of TX descriptors 0, 1, 2, 3 */ - int rts_thresh; /* RTS threshold */ - int frag_thresh; - int OpMode; - int data_rate; - int channel_num; - int short_retry; - int long_retry; - int bbp_type; - u32 flags; -} OPTIONS, *POPTIONS; +#define DEVICE_FLAGS_UNPLUG BIT(0) +#define DEVICE_FLAGS_DISCONNECTED BIT(1) struct vnt_private { + /* mac80211 */ + struct ieee80211_hw *hw; + struct ieee80211_vif *vif; + u8 mac_hw; /* netdev */ struct usb_device *usb; - struct net_device *dev; - struct net_device_stats stats; - OPTIONS sOpts; - - struct work_struct read_work_item; - struct work_struct rx_mng_work_item; + u64 tsf_time; + u8 rx_rate; u32 rx_buf_sz; - int multicast_limit; - u8 byRxMode; + int mc_list_count; spinlock_t lock; struct mutex usb_lock; - u32 rx_bytes; - - u32 flags; - unsigned long Flags; - - SCache sDupRxCache; - - SDeFragControlBlock sRxDFCB[CB_MAX_RX_FRAG]; - u32 cbDFCB; - u32 cbFreeDFCB; - u32 uCurrentDFCBIdx; + unsigned long flags; /* USB */ - struct urb *pInterruptURB; + struct urb *interrupt_urb; u32 int_interval; /* Variables to track resources for the BULK In Pipe */ - struct vnt_rcb *pRCBMem; - struct vnt_rcb *apRCB[CB_MAX_RX_DESC]; - u32 cbRD; - struct vnt_rcb *FirstRecvFreeList; - struct vnt_rcb *LastRecvFreeList; - u32 NumRecvFreeList; - struct vnt_rcb *FirstRecvMngList; - struct vnt_rcb *LastRecvMngList; - u32 NumRecvMngList; - int bIsRxWorkItemQueued; - int bIsRxMngWorkItemQueued; - unsigned long ulRcvRefCount; /* packets that have not returned back */ + struct vnt_rcb *rcb[CB_MAX_RX_DESC]; + u32 num_rcb; /* Variables to track resources for the BULK Out Pipe */ - struct vnt_usb_send_context *apTD[CB_MAX_TX_DESC]; - u32 cbTD; - struct vnt_tx_pkt_info pkt_info[16]; + struct vnt_usb_send_context *tx_context[CB_MAX_TX_DESC]; + u32 num_tx_context; /* Variables to track resources for the Interrupt In Pipe */ struct vnt_interrupt_buffer int_buf; - /* default config from file by user setting */ - DEFAULT_CONFIG config_file; - /* Version control */ - u16 wFirmwareVersion; - u8 byLocalID; - u8 byRFType; - u8 byBBRxConf; - - u8 byZoneType; - int bZoneRegExist; - - u8 byOriginalZonetype; + u16 firmware_version; + u8 local_id; + u8 rf_type; + u8 bb_rx_conf; - int bLinkPass; /* link status: OK or fail */ struct vnt_cmd_card_init init_command; struct vnt_rsp_card_init init_response; - u8 abyCurrentNetAddr[ETH_ALEN]; - u8 abyPermanentNetAddr[ETH_ALEN]; - - int bExistSWNetAddr; - - /* Maintain statistical debug info. */ - unsigned long SendContextsInUse; - unsigned long RcvBuffersInUse; + u8 current_net_addr[ETH_ALEN]; + u8 permanent_net_addr[ETH_ALEN]; - /* 802.11 management */ - struct vnt_manager vnt_mgmt; + u8 exist_sw_net_addr; - u64 qwCurrTSF; - u32 cbBulkInMax; - int bPSRxBeacon; + u64 current_tsf; /* 802.11 MAC specific */ - u32 uCurrRSSI; - u8 byCurrSQ; + u32 current_rssi; /* Antenna Diversity */ - int bTxRxAntInv; - u32 dwRxAntennaSel; - u32 dwTxAntennaSel; - u8 byAntennaCount; - u8 byRxAntennaMode; - u8 byTxAntennaMode; - u8 byRadioCtl; - u8 bHWRadioOff; + int tx_rx_ant_inv; + u32 rx_antenna_sel; + u8 rx_antenna_mode; + u8 tx_antenna_mode; + u8 radio_ctl; /* IFS & Cw */ - u32 uSIFS; /* Current SIFS */ - u32 uDIFS; /* Current DIFS */ - u32 uEIFS; /* Current EIFS */ - u32 uSlot; /* Current SlotTime */ - u32 uCwMin; /* Current CwMin */ - u32 uCwMax; /* CwMax is fixed on 1023 */ - - /* PHY parameter */ - u8 bySIFS; - u8 byDIFS; - u8 byEIFS; - u8 bySlot; - u8 byCWMaxMin; + u32 sifs; /* Current SIFS */ + u32 difs; /* Current DIFS */ + u32 eifs; /* Current EIFS */ + u32 slot; /* Current SlotTime */ /* Rate */ - u8 byBBType; /* 0: 11A, 1:11B, 2:11G */ - u8 byPacketType; /* 0:11a 1:11b 2:11gb 3:11ga */ - u16 wBasicRate; - u8 byTopOFDMBasicRate; - u8 byTopCCKBasicRate; - - u8 abyEEPROM[EEP_MAX_CONTEXT_SIZE]; /*u32 alignment */ + u8 bb_type; /* 0: 11A, 1:11B, 2:11G */ + u8 packet_type; /* 0:11a 1:11b 2:11gb 3:11ga */ + u32 basic_rates; + u8 top_ofdm_basic_rate; + u8 top_cck_basic_rate; - u8 byMinChannel; - u8 byMaxChannel; - u32 uConnectionRate; + u8 eeprom[EEP_MAX_CONTEXT_SIZE]; /*u32 alignment */ - u8 byPreambleType; - u8 byShortPreamble; - /* CARD_PHY_TYPE */ - u8 eConfigPHYMode; + u8 preamble_type; /* For RF Power table */ - u8 byCCKPwr; - u8 byOFDMPwrG; - u8 byOFDMPwrA; - u8 byCurPwr; - u8 abyCCKPwrTbl[14]; - u8 abyOFDMPwrTbl[14]; - u8 abyOFDMAPwrTbl[42]; - - u16 wCurrentRate; + u8 cck_pwr; + u8 ofdm_pwr_g; + u8 ofdm_pwr_a; + u8 power; + u8 cck_pwr_tbl[14]; + u8 ofdm_pwr_tbl[14]; + u8 ofdm_a_pwr_tbl[42]; + + u16 current_rate; u16 tx_rate_fb0; u16 tx_rate_fb1; - u16 wRTSThreshold; - u16 wFragmentationThreshold; - u8 byShortRetryLimit; - u8 byLongRetryLimit; + u8 short_retry_limit; + u8 long_retry_limit; enum nl80211_iftype op_mode; - int bBSSIDFilter; - u16 wMaxTransmitMSDULifetime; - u8 abyBSSID[ETH_ALEN]; - u8 abyDesireBSSID[ETH_ALEN]; - - u32 dwMaxReceiveLifetime; /* dot11MaxReceiveLifetime */ - - int bEncryptionEnable; - int bShortSlotTime; - int bProtectMode; - int bNonERPPresent; - int bBarkerPreambleMd; - - u8 byERPFlag; - u16 wUseProtectCntDown; - - int bRadioControlOff; - int bRadioOff; + int short_slot_time; /* Power save */ - int bEnablePSMode; - u16 wListenInterval; - int bPWBitOn; - WMAC_POWER_MODE ePSMode; - unsigned long ulPSModeWaitTx; - int bPSModeTxBurst; + u16 current_aid; /* Beacon releated */ - u16 wSeqCounter; - int bBeaconBufReady; - int bBeaconSent; - int bFixRate; - u8 byCurrentCh; - - CMD_STATE eCommandState; + u16 seq_counter; - CMD_CODE eCommand; - int bBeaconTx; - u8 byScanBBType; + enum vnt_cmd_state command_state; - int bStopBeacon; - int bStopDataPkt; - int bStopTx0Pkt; - u32 uAutoReConnectTime; - u32 uIsroamingTime; + enum vnt_cmd command; /* 802.11 counter */ - CMD_ITEM eCmdQueue[CMD_Q_SIZE]; - u32 uCmdDequeueIdx; - u32 uCmdEnqueueIdx; - u32 cbFreeCmdQueue; - int bCmdRunning; - int bCmdClear; - int bNeedRadioOFF; - - int bEnableRoaming; - int bIsRoaming; - int bFastRoaming; - u8 bSameBSSMaxNum; - u8 bSameBSSCurNum; - int bRoaming; - int b11hEable; - - /* Encryption */ - NDIS_802_11_WEP_STATUS eEncryptionStatus; - int bTransmitKey; - NDIS_802_11_WEP_STATUS eOldEncryptionStatus; - SKeyManagement sKey; - u32 dwIVCounter; + enum vnt_cmd cmd_queue[CMD_Q_SIZE]; + u32 cmd_dequeue_idx; + u32 cmd_enqueue_idx; + u32 free_cmd_queue; + int cmd_running; - RC4Ext SBox; - u8 abyPRNG[WLAN_WEPMAX_KEYLEN+3]; - u8 byKeyIndex; + unsigned long key_entry_inuse; - u32 uKeyLength; - u8 abyKey[WLAN_WEP232_KEYLEN]; - - /* for AP mode */ - u32 uAssocCount; - int bMoreData; - - /* QoS */ - int bGrpAckPolicy; - - u8 byAutoFBCtrl; - - int bTxMICFail; - int bRxMICFail; + u8 auto_fb_ctrl; /* For Update BaseBand VGA Gain Offset */ - u32 uBBVGADiffCount; - u8 byBBVGANew; - u8 byBBVGACurrent; - u8 abyBBVGA[BB_VGA_LEVEL]; - signed long ldBmThreshold[BB_VGA_LEVEL]; + u8 bb_vga[BB_VGA_LEVEL]; - u8 byBBPreEDRSSI; - u8 byBBPreEDIndex; - - int bRadioCmd; + u8 bb_pre_ed_rssi; + u8 bb_pre_ed_index; /* command timer */ struct delayed_work run_command_work; - /* One second callback */ - struct delayed_work second_callback_work; - - u8 tx_data_time_out; - bool tx_trigger; - int fWPA_Authened; /*is WPA/WPA-PSK or WPA2/WPA2-PSK authen?? */ - u8 byReAssocCount; - u8 byLinkWaitCount; - - struct ethhdr sTxEthHeader; - struct ethhdr sRxEthHeader; - u8 abyBroadcastAddr[ETH_ALEN]; - u8 abySNAP_RFC1042[ETH_ALEN]; - u8 abySNAP_Bridgetunnel[ETH_ALEN]; - - /* Pre-Authentication & PMK cache */ - SPMKID gsPMKID; - SPMKIDCandidateEvent gsPMKIDCandidate; - - /* for 802.11h */ - int b11hEnable; - - int bChannelSwitch; - u8 byNewChannel; - u8 byChannelSwitchCount; - - /* WPA supplicant daemon */ - int bWPADEVUp; - int bwextstep0; - int bwextstep1; - int bwextstep2; - int bwextstep3; - int bWPASuppWextEnabled; - - u32 uChannel; - - struct iw_statistics wstats; /* wireless stats */ - - int bCommit; + struct ieee80211_low_level_stats low_stats; }; -#define EnqueueRCB(_Head, _Tail, _RCB) \ -{ \ - if (!_Head) { \ - _Head = _RCB; \ - } \ - else { \ - _Tail->Next = _RCB; \ - } \ - _RCB->Next = NULL; \ - _Tail = _RCB; \ +#define ADD_ONE_WITH_WRAP_AROUND(uVar, uModulo) { \ + if ((uVar) >= ((uModulo) - 1)) \ + (uVar) = 0; \ + else \ + (uVar)++; \ } -#define DequeueRCB(Head, Tail) \ -{ \ - struct vnt_rcb *RCB = Head; \ - if (!RCB->Next) { \ - Tail = NULL; \ - } \ - Head = RCB->Next; \ -} - -#define ADD_ONE_WITH_WRAP_AROUND(uVar, uModulo) { \ - if ((uVar) >= ((uModulo) - 1)) \ - (uVar) = 0; \ - else \ - (uVar)++; \ -} - -#define fMP_DISCONNECTED 0x00000002 -#define fMP_POST_READS 0x00000100 -#define fMP_POST_WRITES 0x00000200 - -#define MP_SET_FLAG(_M, _F) ((_M)->Flags |= (_F)) -#define MP_CLEAR_FLAG(_M, _F) ((_M)->Flags &= ~(_F)) -#define MP_TEST_FLAGS(_M, _F) (((_M)->Flags & (_F)) == (_F)) - -#define MP_IS_READY(_M) (((_M)->Flags & fMP_DISCONNECTED) == 0) - -int device_alloc_frag_buf(struct vnt_private *, PSDeFragControlBlock pDeF); -void vnt_configure_filter(struct vnt_private *); +int vnt_init(struct vnt_private *priv); #endif diff --git a/drivers/staging/vt6656/dpc.c b/drivers/staging/vt6656/dpc.c index c0ec5b37aa7c..e6367ed3b0bb 100644 --- a/drivers/staging/vt6656/dpc.c +++ b/drivers/staging/vt6656/dpc.c @@ -25,11 +25,6 @@ * Date: May 20, 2003 * * Functions: - * device_receive_frame - Rcv 802.11 frame function - * s_bHandleRxEncryption- Rcv decrypted data via on-fly - * s_byGetRateIdx- get rate index - * s_vGetDASA- get data offset - * s_vProcessRxMACHeader- Rcv 802.11 and translate to 802.3 * * Revision History: * @@ -37,935 +32,155 @@ #include "dpc.h" #include "device.h" -#include "rxtx.h" -#include "tether.h" -#include "card.h" -#include "bssdb.h" #include "mac.h" #include "baseband.h" -#include "michael.h" -#include "tkip.h" -#include "wctl.h" #include "rf.h" -#include "iowpa.h" -#include "datarate.h" -#include "usbpipe.h" -//static int msglevel =MSG_LEVEL_DEBUG; -static int msglevel =MSG_LEVEL_INFO; - -static const u8 acbyRxRate[MAX_RATE] = -{2, 4, 11, 22, 12, 18, 24, 36, 48, 72, 96, 108}; - -static u8 s_byGetRateIdx(u8 byRate); - -static -void -s_vGetDASA( - u8 * pbyRxBufferAddr, - unsigned int *pcbHeaderSize, - struct ethhdr *psEthHeader - ); - -static void s_vProcessRxMACHeader(struct vnt_private *pDevice, - u8 *pbyRxBufferAddr, u32 cbPacketSize, int bIsWEP, int bExtIV, - u32 *pcbHeadSize); - -static int s_bHandleRxEncryption(struct vnt_private *pDevice, u8 *pbyFrame, - u32 FrameSize, u8 *pbyRsr, u8 *pbyNewRsr, PSKeyItem *pKeyOut, - s32 *pbExtIV, u16 *pwRxTSC15_0, u32 *pdwRxTSC47_16); - -/*+ - * - * Description: - * Translate Rcv 802.11 header to 802.3 header with Rx buffer - * - * Parameters: - * In: - * pDevice - * dwRxBufferAddr - Address of Rcv Buffer - * cbPacketSize - Rcv Packet size - * bIsWEP - If Rcv with WEP - * Out: - * pcbHeaderSize - 802.11 header size - * - * Return Value: None - * --*/ - -static void s_vProcessRxMACHeader(struct vnt_private *pDevice, - u8 *pbyRxBufferAddr, u32 cbPacketSize, int bIsWEP, int bExtIV, - u32 *pcbHeadSize) +int vnt_rx_data(struct vnt_private *priv, struct vnt_rcb *ptr_rcb, + unsigned long bytes_received) { - u8 *pbyRxBuffer; - u32 cbHeaderSize = 0; - u16 *pwType; - struct ieee80211_hdr *pMACHeader; - int ii; - - pMACHeader = (struct ieee80211_hdr *) (pbyRxBufferAddr + cbHeaderSize); - - s_vGetDASA((u8 *)pMACHeader, &cbHeaderSize, &pDevice->sRxEthHeader); - - if (bIsWEP) { - if (bExtIV) { - // strip IV&ExtIV , add 8 byte - cbHeaderSize += (WLAN_HDR_ADDR3_LEN + 8); - } else { - // strip IV , add 4 byte - cbHeaderSize += (WLAN_HDR_ADDR3_LEN + 4); - } - } - else { - cbHeaderSize += WLAN_HDR_ADDR3_LEN; - }; - - pbyRxBuffer = (u8 *) (pbyRxBufferAddr + cbHeaderSize); - if (ether_addr_equal(pbyRxBuffer, pDevice->abySNAP_Bridgetunnel)) { - cbHeaderSize += 6; - } else if (ether_addr_equal(pbyRxBuffer, pDevice->abySNAP_RFC1042)) { - cbHeaderSize += 6; - pwType = (u16 *) (pbyRxBufferAddr + cbHeaderSize); - if ((*pwType == cpu_to_be16(ETH_P_IPX)) || - (*pwType == cpu_to_le16(0xF380))) { - cbHeaderSize -= 8; - pwType = (u16 *) (pbyRxBufferAddr + cbHeaderSize); - if (bIsWEP) { - if (bExtIV) { - *pwType = htons(cbPacketSize - WLAN_HDR_ADDR3_LEN - 8); // 8 is IV&ExtIV - } else { - *pwType = htons(cbPacketSize - WLAN_HDR_ADDR3_LEN - 4); // 4 is IV - } - } - else { - *pwType = htons(cbPacketSize - WLAN_HDR_ADDR3_LEN); - } - } - } - else { - cbHeaderSize -= 2; - pwType = (u16 *) (pbyRxBufferAddr + cbHeaderSize); - if (bIsWEP) { - if (bExtIV) { - *pwType = htons(cbPacketSize - WLAN_HDR_ADDR3_LEN - 8); // 8 is IV&ExtIV - } else { - *pwType = htons(cbPacketSize - WLAN_HDR_ADDR3_LEN - 4); // 4 is IV - } - } - else { - *pwType = htons(cbPacketSize - WLAN_HDR_ADDR3_LEN); - } - } - - cbHeaderSize -= (ETH_ALEN * 2); - pbyRxBuffer = (u8 *) (pbyRxBufferAddr + cbHeaderSize); - for (ii = 0; ii < ETH_ALEN; ii++) - *pbyRxBuffer++ = pDevice->sRxEthHeader.h_dest[ii]; - for (ii = 0; ii < ETH_ALEN; ii++) - *pbyRxBuffer++ = pDevice->sRxEthHeader.h_source[ii]; - - *pcbHeadSize = cbHeaderSize; -} - -static u8 s_byGetRateIdx(u8 byRate) -{ - u8 byRateIdx; - - for (byRateIdx = 0; byRateIdx <MAX_RATE ; byRateIdx++) { - if (acbyRxRate[byRateIdx%MAX_RATE] == byRate) - return byRateIdx; - } - return 0; -} - -static -void -s_vGetDASA ( - u8 * pbyRxBufferAddr, - unsigned int *pcbHeaderSize, - struct ethhdr *psEthHeader - ) -{ - unsigned int cbHeaderSize = 0; - struct ieee80211_hdr *pMACHeader; - int ii; - - pMACHeader = (struct ieee80211_hdr *) (pbyRxBufferAddr + cbHeaderSize); - - if ((pMACHeader->frame_control & FC_TODS) == 0) { - if (pMACHeader->frame_control & FC_FROMDS) { - for (ii = 0; ii < ETH_ALEN; ii++) { - psEthHeader->h_dest[ii] = - pMACHeader->addr1[ii]; - psEthHeader->h_source[ii] = - pMACHeader->addr3[ii]; - } - } else { - /* IBSS mode */ - for (ii = 0; ii < ETH_ALEN; ii++) { - psEthHeader->h_dest[ii] = - pMACHeader->addr1[ii]; - psEthHeader->h_source[ii] = - pMACHeader->addr2[ii]; - } - } - } else { - /* Is AP mode.. */ - if (pMACHeader->frame_control & FC_FROMDS) { - for (ii = 0; ii < ETH_ALEN; ii++) { - psEthHeader->h_dest[ii] = - pMACHeader->addr3[ii]; - psEthHeader->h_source[ii] = - pMACHeader->addr4[ii]; - cbHeaderSize += 6; - } - } else { - for (ii = 0; ii < ETH_ALEN; ii++) { - psEthHeader->h_dest[ii] = - pMACHeader->addr3[ii]; - psEthHeader->h_source[ii] = - pMACHeader->addr2[ii]; - } - } - }; - *pcbHeaderSize = cbHeaderSize; -} - -int RXbBulkInProcessData(struct vnt_private *pDevice, struct vnt_rcb *pRCB, - unsigned long BytesToIndicate) -{ - struct net_device_stats *pStats = &pDevice->stats; + struct ieee80211_hw *hw = priv->hw; + struct ieee80211_supported_band *sband; struct sk_buff *skb; - struct vnt_manager *pMgmt = &pDevice->vnt_mgmt; - struct vnt_rx_mgmt *pRxPacket = &pMgmt->sRxPacket; - struct ieee80211_hdr *p802_11Header; - u8 *pbyRsr, *pbyNewRsr, *pbyRSSI, *pbyFrame; - u64 *pqwTSFTime; - u32 bDeFragRx = false; - u32 cbHeaderOffset, cbIVOffset; - u32 FrameSize; - u16 wEtherType = 0; - s32 iSANodeIndex = -1; - int ii; - u8 *pbyRxSts, *pbyRxRate, *pbySQ, *pby3SQ; - u32 cbHeaderSize; - PSKeyItem pKey = NULL; - u16 wRxTSC15_0 = 0; - u32 dwRxTSC47_16 = 0; - /* signed long ldBm = 0; */ - int bIsWEP = false; int bExtIV = false; - u32 dwWbkStatus; - struct vnt_rcb *pRCBIndicate = pRCB; - u8 *pbyDAddress; - u16 *pwPLCP_Length; - u8 abyVaildRate[MAX_RATE] - = {2, 4, 11, 22, 12, 18, 24, 36, 48, 72, 96, 108}; - u16 wPLCPwithPadding; - struct ieee80211_hdr *pMACHeader; - int bRxeapol_key = false; - - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"---------- RXbBulkInProcessData---\n"); - - skb = pRCB->skb; + struct ieee80211_rx_status rx_status = { 0 }; + struct ieee80211_hdr *hdr; + __le16 fc; + u8 *rsr, *new_rsr, *rssi, *frame; + __le64 *tsf_time; + u32 frame_size; + int ii, r; + u8 *rx_sts, *rx_rate, *sq, *sq_3; + u32 wbk_status; + u8 *skb_data; + u16 *pay_load_len; + u16 pay_load_with_padding; + u8 rate_idx = 0; + u8 rate[MAX_RATE] = {2, 4, 11, 22, 12, 18, 24, 36, 48, 72, 96, 108}; + long rx_dbm; + + skb = ptr_rcb->skb; /* [31:16]RcvByteCount ( not include 4-byte Status ) */ - dwWbkStatus = *((u32 *)(skb->data)); - FrameSize = dwWbkStatus >> 16; - FrameSize += 4; + wbk_status = *((u32 *)(skb->data)); + frame_size = wbk_status >> 16; + frame_size += 4; - if (BytesToIndicate != FrameSize) { - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"------- WRONG Length 1\n"); - pStats->rx_frame_errors++; + if (bytes_received != frame_size) { + dev_dbg(&priv->usb->dev, "------- WRONG Length 1\n"); return false; } - if ((BytesToIndicate > 2372) || (BytesToIndicate <= 40)) { - // Frame Size error drop this packet. - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "---------- WRONG Length 2\n"); - pStats->rx_frame_errors++; - return false; - } - - pbyDAddress = (u8 *)(skb->data); - pbyRxSts = pbyDAddress+4; - pbyRxRate = pbyDAddress+5; - - //real Frame Size = USBFrameSize -4WbkStatus - 4RxStatus - 8TSF - 4RSR - 4SQ3 - ?Padding - //if SQ3 the range is 24~27, if no SQ3 the range is 20~23 - //real Frame size in PLCPLength field. - pwPLCP_Length = (u16 *) (pbyDAddress + 6); - //Fix hardware bug => PLCP_Length error - if ( ((BytesToIndicate - (*pwPLCP_Length)) > 27) || - ((BytesToIndicate - (*pwPLCP_Length)) < 24) || - (BytesToIndicate < (*pwPLCP_Length)) ) { - - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Wrong PLCP Length %x\n", (int) *pwPLCP_Length); - pStats->rx_frame_errors++; - return false; - } - for ( ii=RATE_1M;ii<MAX_RATE;ii++) { - if ( *pbyRxRate == abyVaildRate[ii] ) { - break; - } - } - if ( ii==MAX_RATE ) { - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Wrong RxRate %x\n",(int) *pbyRxRate); - return false; - } - - wPLCPwithPadding = ( (*pwPLCP_Length / 4) + ( (*pwPLCP_Length % 4) ? 1:0 ) ) *4; - - pqwTSFTime = (u64 *)(pbyDAddress + 8 + wPLCPwithPadding); - if(pDevice->byBBType == BB_TYPE_11G) { - pby3SQ = pbyDAddress + 8 + wPLCPwithPadding + 12; - pbySQ = pby3SQ; - } - else { - pbySQ = pbyDAddress + 8 + wPLCPwithPadding + 8; - pby3SQ = pbySQ; - } - pbyNewRsr = pbyDAddress + 8 + wPLCPwithPadding + 9; - pbyRSSI = pbyDAddress + 8 + wPLCPwithPadding + 10; - pbyRsr = pbyDAddress + 8 + wPLCPwithPadding + 11; - - FrameSize = *pwPLCP_Length; - - pbyFrame = pbyDAddress + 8; - - pMACHeader = (struct ieee80211_hdr *) pbyFrame; - -//mike add: to judge if current AP is activated? - if ((pMgmt->eCurrMode == WMAC_MODE_STANDBY) || - (pMgmt->eCurrMode == WMAC_MODE_ESS_STA)) { - if (pMgmt->sNodeDBTable[0].bActive) { - if (ether_addr_equal(pMgmt->abyCurrBSSID, pMACHeader->addr2)) { - if (pMgmt->sNodeDBTable[0].uInActiveCount != 0) - pMgmt->sNodeDBTable[0].uInActiveCount = 0; - } - } - } - - if (!is_multicast_ether_addr(pMACHeader->addr1)) { - if (WCTLbIsDuplicate(&(pDevice->sDupRxCache), (struct ieee80211_hdr *) pbyFrame)) { - return false; - } - - if (!ether_addr_equal(pDevice->abyCurrentNetAddr, pMACHeader->addr1)) { + if ((bytes_received > 2372) || (bytes_received <= 40)) { + /* Frame Size error drop this packet.*/ + dev_dbg(&priv->usb->dev, "------ WRONG Length 2\n"); return false; - } - } - - // Use for TKIP MIC - s_vGetDASA(pbyFrame, &cbHeaderSize, &pDevice->sRxEthHeader); - - if (ether_addr_equal((u8 *)pDevice->sRxEthHeader.h_source, - pDevice->abyCurrentNetAddr)) - return false; - - if ((pMgmt->eCurrMode == WMAC_MODE_ESS_AP) || (pMgmt->eCurrMode == WMAC_MODE_IBSS_STA)) { - if (IS_CTL_PSPOLL(pbyFrame) || !IS_TYPE_CONTROL(pbyFrame)) { - p802_11Header = (struct ieee80211_hdr *) (pbyFrame); - // get SA NodeIndex - if (BSSbIsSTAInNodeDB(pDevice, (u8 *)(p802_11Header->addr2), &iSANodeIndex)) { - pMgmt->sNodeDBTable[iSANodeIndex].ulLastRxJiffer = jiffies; - pMgmt->sNodeDBTable[iSANodeIndex].uInActiveCount = 0; - } - } - } - - if (IS_FC_WEP(pbyFrame)) { - bool bRxDecryOK = false; - - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"rx WEP pkt\n"); - bIsWEP = true; - - bRxDecryOK = s_bHandleRxEncryption(pDevice, pbyFrame, FrameSize, - pbyRsr, pbyNewRsr, &pKey, &bExtIV, &wRxTSC15_0, &dwRxTSC47_16); - - if (bRxDecryOK) { - if ((*pbyNewRsr & NEWRSR_DECRYPTOK) == 0) { - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"ICV Fail\n"); - if ( (pMgmt->eAuthenMode == WMAC_AUTH_WPA) || - (pMgmt->eAuthenMode == WMAC_AUTH_WPAPSK) || - (pMgmt->eAuthenMode == WMAC_AUTH_WPANONE) || - (pMgmt->eAuthenMode == WMAC_AUTH_WPA2) || - (pMgmt->eAuthenMode == WMAC_AUTH_WPA2PSK)) { - } - return false; - } - } else { - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"WEP Func Fail\n"); - return false; - } - if ((pKey != NULL) && (pKey->byCipherSuite == KEY_CTL_CCMP)) - FrameSize -= 8; // Message Integrity Code - else - FrameSize -= 4; // 4 is ICV - } - - // - // RX OK - // - /* remove the FCS/CRC length */ - FrameSize -= ETH_FCS_LEN; - - if ( !(*pbyRsr & (RSR_ADDRBROAD | RSR_ADDRMULTI)) && // unicast address - (IS_FRAGMENT_PKT((pbyFrame))) - ) { - // defragment - bDeFragRx = WCTLbHandleFragment(pDevice, (struct ieee80211_hdr *) (pbyFrame), FrameSize, bIsWEP, bExtIV); - if (bDeFragRx) { - // defrag complete - // TODO skb, pbyFrame - skb = pDevice->sRxDFCB[pDevice->uCurrentDFCBIdx].skb; - FrameSize = pDevice->sRxDFCB[pDevice->uCurrentDFCBIdx].cbFrameLength; - pbyFrame = skb->data + 8; - } - else { - return false; - } - } - - // - // Management & Control frame Handle - // - if ((IS_TYPE_DATA((pbyFrame))) == false) { - // Handle Control & Manage Frame - - if (IS_TYPE_MGMT((pbyFrame))) { - u8 * pbyData1; - u8 * pbyData2; - - pRxPacket = &(pRCB->sMngPacket); - pRxPacket->p80211Header = (PUWLAN_80211HDR)(pbyFrame); - pRxPacket->cbMPDULen = FrameSize; - pRxPacket->uRSSI = *pbyRSSI; - pRxPacket->bySQ = *pbySQ; - pRxPacket->qwLocalTSF = cpu_to_le64(*pqwTSFTime); - if (bIsWEP) { - // strip IV - pbyData1 = WLAN_HDR_A3_DATA_PTR(pbyFrame); - pbyData2 = WLAN_HDR_A3_DATA_PTR(pbyFrame) + 4; - for (ii = 0; ii < (FrameSize - 4); ii++) { - *pbyData1 = *pbyData2; - pbyData1++; - pbyData2++; - } - } - - pRxPacket->byRxRate = s_byGetRateIdx(*pbyRxRate); - - if ( *pbyRxSts == 0 ) { - //Discard beacon packet which channel is 0 - if ( (WLAN_GET_FC_FSTYPE((pRxPacket->p80211Header->sA3.wFrameCtl)) == WLAN_FSTYPE_BEACON) || - (WLAN_GET_FC_FSTYPE((pRxPacket->p80211Header->sA3.wFrameCtl)) == WLAN_FSTYPE_PROBERESP) ) { - return false; - } - } - pRxPacket->byRxChannel = (*pbyRxSts) >> 2; - - // - // Insert the RCB in the Recv Mng list - // - EnqueueRCB(pDevice->FirstRecvMngList, pDevice->LastRecvMngList, pRCBIndicate); - pDevice->NumRecvMngList++; - if ( bDeFragRx == false) { - pRCB->Ref++; - } - if (pDevice->bIsRxMngWorkItemQueued == false) { - pDevice->bIsRxMngWorkItemQueued = true; - schedule_work(&pDevice->rx_mng_work_item); - } - - } - else { - // Control Frame - }; - return false; - } - else { - if (pMgmt->eCurrMode == WMAC_MODE_ESS_AP) { - //In AP mode, hw only check addr1(BSSID or RA) if equal to local MAC. - if ( !(*pbyRsr & RSR_BSSIDOK)) { - if (bDeFragRx) { - if (!device_alloc_frag_buf(pDevice, &pDevice->sRxDFCB[pDevice->uCurrentDFCBIdx])) { - DBG_PRT(MSG_LEVEL_ERR,KERN_ERR "%s: can not alloc more frag bufs\n", - pDevice->dev->name); - } - } - return false; - } - } - else { - // discard DATA packet while not associate || BSSID error - if ((pDevice->bLinkPass == false) || - !(*pbyRsr & RSR_BSSIDOK)) { - if (bDeFragRx) { - if (!device_alloc_frag_buf(pDevice, &pDevice->sRxDFCB[pDevice->uCurrentDFCBIdx])) { - DBG_PRT(MSG_LEVEL_ERR,KERN_ERR "%s: can not alloc more frag bufs\n", - pDevice->dev->name); - } - } - return false; - } - //mike add:station mode check eapol-key challenge---> - { - u8 Protocol_Version; //802.1x Authentication - u8 Packet_Type; //802.1x Authentication - u8 Descriptor_type; - u16 Key_info; - if (bIsWEP) - cbIVOffset = 8; - else - cbIVOffset = 0; - wEtherType = (skb->data[cbIVOffset + 8 + 24 + 6] << 8) | - skb->data[cbIVOffset + 8 + 24 + 6 + 1]; - Protocol_Version = skb->data[cbIVOffset + 8 + 24 + 6 + 1 +1]; - Packet_Type = skb->data[cbIVOffset + 8 + 24 + 6 + 1 +1+1]; - if (wEtherType == ETH_P_PAE) { //Protocol Type in LLC-Header - if(((Protocol_Version==1) ||(Protocol_Version==2)) && - (Packet_Type==3)) { //802.1x OR eapol-key challenge frame receive - bRxeapol_key = true; - Descriptor_type = skb->data[cbIVOffset + 8 + 24 + 6 + 1 +1+1+1+2]; - Key_info = (skb->data[cbIVOffset + 8 + 24 + 6 + 1 +1+1+1+2+1]<<8) |skb->data[cbIVOffset + 8 + 24 + 6 + 1 +1+1+1+2+2] ; - if(Descriptor_type==2) { //RSN - // printk("WPA2_Rx_eapol-key_info<-----:%x\n",Key_info); - } - else if(Descriptor_type==254) { - // printk("WPA_Rx_eapol-key_info<-----:%x\n",Key_info); - } - } - } - } - //mike add:station mode check eapol-key challenge<--- - } - } - -// Data frame Handle - - if (pDevice->bEnablePSMode) { - if (IS_FC_MOREDATA((pbyFrame))) { - if (*pbyRsr & RSR_ADDROK) { - //PSbSendPSPOLL((PSDevice)pDevice); - } - } - else { - if (pMgmt->bInTIMWake == true) { - pMgmt->bInTIMWake = false; - } - } - } - - // ++++++++ For BaseBand Algorithm +++++++++++++++ - pDevice->uCurrRSSI = *pbyRSSI; - pDevice->byCurrSQ = *pbySQ; - - // todo -/* - if ((*pbyRSSI != 0) && - (pMgmt->pCurrBSS!=NULL)) { - RFvRSSITodBm(pDevice, *pbyRSSI, &ldBm); - // Monitor if RSSI is too strong. - pMgmt->pCurrBSS->byRSSIStatCnt++; - pMgmt->pCurrBSS->byRSSIStatCnt %= RSSI_STAT_COUNT; - pMgmt->pCurrBSS->ldBmAverage[pMgmt->pCurrBSS->byRSSIStatCnt] = ldBm; - for (ii = 0; ii < RSSI_STAT_COUNT; ii++) { - if (pMgmt->pCurrBSS->ldBmAverage[ii] != 0) { - pMgmt->pCurrBSS->ldBmMAX = - max(pMgmt->pCurrBSS->ldBmAverage[ii], ldBm); - } - } - } -*/ - - if ((pKey != NULL) && (pKey->byCipherSuite == KEY_CTL_TKIP)) { - if (bIsWEP) { - FrameSize -= 8; //MIC - } - } - - //-------------------------------------------------------------------------------- - // Soft MIC - if ((pKey != NULL) && (pKey->byCipherSuite == KEY_CTL_TKIP)) { - if (bIsWEP) { - u32 * pdwMIC_L; - u32 * pdwMIC_R; - u32 dwMIC_Priority; - u32 dwMICKey0 = 0, dwMICKey1 = 0; - u32 dwLocalMIC_L = 0; - u32 dwLocalMIC_R = 0; - - if (pMgmt->eCurrMode == WMAC_MODE_ESS_AP) { - dwMICKey0 = cpu_to_le32(*(u32 *)(&pKey->abyKey[24])); - dwMICKey1 = cpu_to_le32(*(u32 *)(&pKey->abyKey[28])); - } - else { - if (pMgmt->eAuthenMode == WMAC_AUTH_WPANONE) { - dwMICKey0 = cpu_to_le32(*(u32 *)(&pKey->abyKey[16])); - dwMICKey1 = cpu_to_le32(*(u32 *)(&pKey->abyKey[20])); - } else if ((pKey->dwKeyIndex & BIT28) == 0) { - dwMICKey0 = cpu_to_le32(*(u32 *)(&pKey->abyKey[16])); - dwMICKey1 = cpu_to_le32(*(u32 *)(&pKey->abyKey[20])); - } else { - dwMICKey0 = cpu_to_le32(*(u32 *)(&pKey->abyKey[24])); - dwMICKey1 = cpu_to_le32(*(u32 *)(&pKey->abyKey[28])); - } - } - - MIC_vInit(dwMICKey0, dwMICKey1); - MIC_vAppend((u8 *)&(pDevice->sRxEthHeader.h_dest[0]), 12); - dwMIC_Priority = 0; - MIC_vAppend((u8 *)&dwMIC_Priority, 4); - // 4 is Rcv buffer header, 24 is MAC Header, and 8 is IV and Ext IV. - MIC_vAppend((u8 *)(skb->data + 8 + WLAN_HDR_ADDR3_LEN + 8), - FrameSize - WLAN_HDR_ADDR3_LEN - 8); - MIC_vGetMIC(&dwLocalMIC_L, &dwLocalMIC_R); - MIC_vUnInit(); - - pdwMIC_L = (u32 *)(skb->data + 8 + FrameSize); - pdwMIC_R = (u32 *)(skb->data + 8 + FrameSize + 4); - - if ((cpu_to_le32(*pdwMIC_L) != dwLocalMIC_L) || (cpu_to_le32(*pdwMIC_R) != dwLocalMIC_R) || - (pDevice->bRxMICFail == true)) { - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"MIC comparison is fail!\n"); - pDevice->bRxMICFail = false; - if (bDeFragRx) { - if (!device_alloc_frag_buf(pDevice, &pDevice->sRxDFCB[pDevice->uCurrentDFCBIdx])) { - DBG_PRT(MSG_LEVEL_ERR,KERN_ERR "%s: can not alloc more frag bufs\n", - pDevice->dev->name); - } - } - //send event to wpa_supplicant - //if(pDevice->bWPASuppWextEnabled == true) - { - union iwreq_data wrqu; - struct iw_michaelmicfailure ev; - int keyidx = pbyFrame[cbHeaderSize+3] >> 6; //top two-bits - memset(&ev, 0, sizeof(ev)); - ev.flags = keyidx & IW_MICFAILURE_KEY_ID; - if ((pMgmt->eCurrMode == WMAC_MODE_ESS_STA) && - (pMgmt->eCurrState == WMAC_STATE_ASSOC) && - (*pbyRsr & (RSR_ADDRBROAD | RSR_ADDRMULTI)) == 0) { - ev.flags |= IW_MICFAILURE_PAIRWISE; - } else { - ev.flags |= IW_MICFAILURE_GROUP; - } - - ev.src_addr.sa_family = ARPHRD_ETHER; - memcpy(ev.src_addr.sa_data, pMACHeader->addr2, ETH_ALEN); - memset(&wrqu, 0, sizeof(wrqu)); - wrqu.data.length = sizeof(ev); - PRINT_K("wireless_send_event--->IWEVMICHAELMICFAILURE\n"); - wireless_send_event(pDevice->dev, IWEVMICHAELMICFAILURE, &wrqu, (char *)&ev); - - } - - return false; - - } - } - } //---end of SOFT MIC----------------------------------------------------------------------- - - // ++++++++++ Reply Counter Check +++++++++++++ - - if ((pKey != NULL) && ((pKey->byCipherSuite == KEY_CTL_TKIP) || - (pKey->byCipherSuite == KEY_CTL_CCMP))) { - if (bIsWEP) { - u16 wLocalTSC15_0 = 0; - u32 dwLocalTSC47_16 = 0; - unsigned long long RSC = 0; - // endian issues - RSC = *((unsigned long long *) &(pKey->KeyRSC)); - wLocalTSC15_0 = (u16) RSC; - dwLocalTSC47_16 = (u32) (RSC>>16); - - RSC = dwRxTSC47_16; - RSC <<= 16; - RSC += wRxTSC15_0; - memcpy(&(pKey->KeyRSC), &RSC, sizeof(u64)); - - if (pDevice->vnt_mgmt.eCurrMode == WMAC_MODE_ESS_STA && - pDevice->vnt_mgmt.eCurrState == WMAC_STATE_ASSOC) { - /* check RSC */ - if ( (wRxTSC15_0 < wLocalTSC15_0) && - (dwRxTSC47_16 <= dwLocalTSC47_16) && - !((dwRxTSC47_16 == 0) && (dwLocalTSC47_16 == 0xFFFFFFFF))) { - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"TSC is illegal~~!\n "); - - if (bDeFragRx) { - if (!device_alloc_frag_buf(pDevice, &pDevice->sRxDFCB[pDevice->uCurrentDFCBIdx])) { - DBG_PRT(MSG_LEVEL_ERR,KERN_ERR "%s: can not alloc more frag bufs\n", - pDevice->dev->name); - } - } - return false; - } - } - } - } // ----- End of Reply Counter Check -------------------------- - - s_vProcessRxMACHeader(pDevice, (u8 *)(skb->data+8), FrameSize, bIsWEP, bExtIV, &cbHeaderOffset); - FrameSize -= cbHeaderOffset; - cbHeaderOffset += 8; // 8 is Rcv buffer header - - // Null data, framesize = 12 - if (FrameSize < 12) - return false; - - skb->data += cbHeaderOffset; - skb->tail += cbHeaderOffset; - skb_put(skb, FrameSize); - skb->protocol=eth_type_trans(skb, skb->dev); - skb->ip_summed=CHECKSUM_NONE; - pStats->rx_bytes +=skb->len; - pStats->rx_packets++; - netif_rx(skb); - if (bDeFragRx) { - if (!device_alloc_frag_buf(pDevice, &pDevice->sRxDFCB[pDevice->uCurrentDFCBIdx])) { - DBG_PRT(MSG_LEVEL_ERR,KERN_ERR "%s: can not alloc more frag bufs\n", - pDevice->dev->name); - } - return false; - } - - return true; -} + } -static int s_bHandleRxEncryption(struct vnt_private *pDevice, u8 *pbyFrame, - u32 FrameSize, u8 *pbyRsr, u8 *pbyNewRsr, PSKeyItem *pKeyOut, - s32 *pbExtIV, u16 *pwRxTSC15_0, u32 *pdwRxTSC47_16) -{ - struct vnt_manager *pMgmt = &pDevice->vnt_mgmt; - u32 PayloadLen = FrameSize; - u8 *pbyIV; - u8 byKeyIdx; - PSKeyItem pKey = NULL; - u8 byDecMode = KEY_CTL_WEP; - - *pwRxTSC15_0 = 0; - *pdwRxTSC47_16 = 0; - - pbyIV = pbyFrame + WLAN_HDR_ADDR3_LEN; - if ( WLAN_GET_FC_TODS(*(u16 *)pbyFrame) && - WLAN_GET_FC_FROMDS(*(u16 *)pbyFrame) ) { - pbyIV += 6; // 6 is 802.11 address4 - PayloadLen -= 6; - } - byKeyIdx = (*(pbyIV+3) & 0xc0); - byKeyIdx >>= 6; - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"\nKeyIdx: %d\n", byKeyIdx); - - if ((pMgmt->eAuthenMode == WMAC_AUTH_WPA) || - (pMgmt->eAuthenMode == WMAC_AUTH_WPAPSK) || - (pMgmt->eAuthenMode == WMAC_AUTH_WPANONE) || - (pMgmt->eAuthenMode == WMAC_AUTH_WPA2) || - (pMgmt->eAuthenMode == WMAC_AUTH_WPA2PSK)) { - if (((*pbyRsr & (RSR_ADDRBROAD | RSR_ADDRMULTI)) == 0) && - (pMgmt->byCSSPK != KEY_CTL_NONE)) { - // unicast pkt use pairwise key - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"unicast pkt\n"); - if (KeybGetKey(&(pDevice->sKey), pDevice->abyBSSID, 0xFFFFFFFF, &pKey) == true) { - if (pMgmt->byCSSPK == KEY_CTL_TKIP) - byDecMode = KEY_CTL_TKIP; - else if (pMgmt->byCSSPK == KEY_CTL_CCMP) - byDecMode = KEY_CTL_CCMP; - } - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"unicast pkt: %d, %p\n", byDecMode, pKey); - } else { - // use group key - KeybGetKey(&(pDevice->sKey), pDevice->abyBSSID, byKeyIdx, &pKey); - if (pMgmt->byCSSGK == KEY_CTL_TKIP) - byDecMode = KEY_CTL_TKIP; - else if (pMgmt->byCSSGK == KEY_CTL_CCMP) - byDecMode = KEY_CTL_CCMP; - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"group pkt: %d, %d, %p\n", byKeyIdx, byDecMode, pKey); - } - } - // our WEP only support Default Key - if (pKey == NULL) { - // use default group key - KeybGetKey(&(pDevice->sKey), pDevice->abyBroadcastAddr, byKeyIdx, &pKey); - if (pMgmt->byCSSGK == KEY_CTL_TKIP) - byDecMode = KEY_CTL_TKIP; - else if (pMgmt->byCSSGK == KEY_CTL_CCMP) - byDecMode = KEY_CTL_CCMP; - } - *pKeyOut = pKey; - - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"AES:%d %d %d\n", pMgmt->byCSSPK, pMgmt->byCSSGK, byDecMode); - - if (pKey == NULL) { - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"pKey == NULL\n"); - return false; - } - if (byDecMode != pKey->byCipherSuite) { - *pKeyOut = NULL; - return false; - } - if (byDecMode == KEY_CTL_WEP) { - // handle WEP - if ((pDevice->byLocalID <= REV_ID_VT3253_A1) || - (((PSKeyTable)(pKey->pvKeyTable))->bSoftWEP == true)) { - // Software WEP - // 1. 3253A - // 2. WEP 256 - - PayloadLen -= (WLAN_HDR_ADDR3_LEN + 4 + 4); // 24 is 802.11 header,4 is IV, 4 is crc - memcpy(pDevice->abyPRNG, pbyIV, 3); - memcpy(pDevice->abyPRNG + 3, pKey->abyKey, pKey->uKeyLength); - rc4_init(&pDevice->SBox, pDevice->abyPRNG, pKey->uKeyLength + 3); - rc4_encrypt(&pDevice->SBox, pbyIV+4, pbyIV+4, PayloadLen); - - if (ETHbIsBufferCrc32Ok(pbyIV+4, PayloadLen)) { - *pbyNewRsr |= NEWRSR_DECRYPTOK; - } - } - } else if ((byDecMode == KEY_CTL_TKIP) || - (byDecMode == KEY_CTL_CCMP)) { - // TKIP/AES - - PayloadLen -= (WLAN_HDR_ADDR3_LEN + 8 + 4); // 24 is 802.11 header, 8 is IV&ExtIV, 4 is crc - *pdwRxTSC47_16 = cpu_to_le32(*(u32 *)(pbyIV + 4)); - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"ExtIV: %x\n", *pdwRxTSC47_16); - if (byDecMode == KEY_CTL_TKIP) { - *pwRxTSC15_0 = cpu_to_le16(MAKEWORD(*(pbyIV+2), *pbyIV)); - } else { - *pwRxTSC15_0 = cpu_to_le16(*(u16 *)pbyIV); - } - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"TSC0_15: %x\n", *pwRxTSC15_0); - - if ((byDecMode == KEY_CTL_TKIP) && - (pDevice->byLocalID <= REV_ID_VT3253_A1)) { - // Software TKIP - // 1. 3253 A - struct ieee80211_hdr *pMACHeader = (struct ieee80211_hdr *) (pbyFrame); - TKIPvMixKey(pKey->abyKey, pMACHeader->addr2, *pwRxTSC15_0, *pdwRxTSC47_16, pDevice->abyPRNG); - rc4_init(&pDevice->SBox, pDevice->abyPRNG, TKIP_KEY_LEN); - rc4_encrypt(&pDevice->SBox, pbyIV+8, pbyIV+8, PayloadLen); - if (ETHbIsBufferCrc32Ok(pbyIV+8, PayloadLen)) { - *pbyNewRsr |= NEWRSR_DECRYPTOK; - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"ICV OK!\n"); - } else { - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"ICV FAIL!!!\n"); - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"PayloadLen = %d\n", PayloadLen); - } - } - }// end of TKIP/AES - - if ((*(pbyIV+3) & 0x20) != 0) - *pbExtIV = true; - return true; -} + skb_data = (u8 *)skb->data; -void RXvWorkItem(struct work_struct *work) -{ - struct vnt_private *priv = - container_of(work, struct vnt_private, read_work_item); - int status; - struct vnt_rcb *rcb = NULL; - unsigned long flags; + rx_sts = skb_data+4; + rx_rate = skb_data+5; + + /* real Frame Size = USBframe_size -4WbkStatus - 4RxStatus */ + /* -8TSF - 4RSR - 4SQ3 - ?Padding */ - if (priv->Flags & fMP_DISCONNECTED) - return; + /* if SQ3 the range is 24~27, if no SQ3 the range is 20~23 */ - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"---->Rx Polling Thread\n"); + pay_load_len = (u16 *) (skb_data + 6); - spin_lock_irqsave(&priv->lock, flags); + /*Fix hardware bug => PLCP_Length error */ + if (((bytes_received - (*pay_load_len)) > 27) || + ((bytes_received - (*pay_load_len)) < 24) || + (bytes_received < (*pay_load_len))) { + dev_dbg(&priv->usb->dev, "Wrong PLCP Length %x\n", + *pay_load_len); + return false; + } - while ((priv->Flags & fMP_POST_READS) && MP_IS_READY(priv) && - (priv->NumRecvFreeList != 0)) { - rcb = priv->FirstRecvFreeList; + sband = hw->wiphy->bands[hw->conf.chandef.chan->band]; - priv->NumRecvFreeList--; + for (r = RATE_1M; r < MAX_RATE; r++) { + if (*rx_rate == rate[r]) + break; + } - DequeueRCB(priv->FirstRecvFreeList, priv->LastRecvFreeList); + priv->rx_rate = r; - status = PIPEnsBulkInUsbRead(priv, rcb); + for (ii = 0; ii < sband->n_bitrates; ii++) { + if (sband->bitrates[ii].hw_value == r) { + rate_idx = ii; + break; + } } - priv->bIsRxWorkItemQueued = false; + if (ii == sband->n_bitrates) { + dev_dbg(&priv->usb->dev, "Wrong RxRate %x\n", *rx_rate); + return false; + } - spin_unlock_irqrestore(&priv->lock, flags); -} + pay_load_with_padding = ((*pay_load_len / 4) + + ((*pay_load_len % 4) ? 1 : 0)) * 4; -void RXvFreeRCB(struct vnt_rcb *rcb, int re_alloc_skb) -{ - struct vnt_private *priv = rcb->pDevice; + tsf_time = (__le64 *)(skb_data + 8 + pay_load_with_padding); - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"---->RXvFreeRCB\n"); + priv->tsf_time = le64_to_cpu(*tsf_time); - if (re_alloc_skb == false) { - kfree_skb(rcb->skb); - re_alloc_skb = true; + if (priv->bb_type == BB_TYPE_11G) { + sq_3 = skb_data + 8 + pay_load_with_padding + 12; + sq = sq_3; + } else { + sq = skb_data + 8 + pay_load_with_padding + 8; + sq_3 = sq; } - if (re_alloc_skb == true) { - rcb->skb = netdev_alloc_skb(priv->dev, priv->rx_buf_sz); - /* TODO error handling */ - if (!rcb->skb) { - DBG_PRT(MSG_LEVEL_ERR, KERN_ERR - " Failed to re-alloc rx skb\n"); - } - } + new_rsr = skb_data + 8 + pay_load_with_padding + 9; + rssi = skb_data + 8 + pay_load_with_padding + 10; - /* Insert the RCB back in the Recv free list */ - EnqueueRCB(priv->FirstRecvFreeList, priv->LastRecvFreeList, rcb); - priv->NumRecvFreeList++; + rsr = skb_data + 8 + pay_load_with_padding + 11; + if (*rsr & (RSR_IVLDTYP | RSR_IVLDLEN)) + return false; - if ((priv->Flags & fMP_POST_READS) && MP_IS_READY(priv) && - (priv->bIsRxWorkItemQueued == false)) { - priv->bIsRxWorkItemQueued = true; - schedule_work(&priv->read_work_item); - } + frame_size = *pay_load_len; - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"<----RXFreeRCB %d %d\n", - priv->NumRecvFreeList, priv->NumRecvMngList); -} + vnt_rf_rssi_to_dbm(priv, *rssi, &rx_dbm); -void RXvMngWorkItem(struct work_struct *work) -{ - struct vnt_private *pDevice = - container_of(work, struct vnt_private, rx_mng_work_item); - struct vnt_rcb *pRCB = NULL; - struct vnt_rx_mgmt *pRxPacket; - int bReAllocSkb = false; - unsigned long flags; + priv->bb_pre_ed_rssi = (u8)rx_dbm + 1; + priv->current_rssi = priv->bb_pre_ed_rssi; - if (pDevice->Flags & fMP_DISCONNECTED) - return; + frame = skb_data + 8; - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"---->Rx Mng Thread\n"); + skb_pull(skb, 8); + skb_trim(skb, frame_size); - while (pDevice->NumRecvMngList!=0) - { - spin_lock_irqsave(&pDevice->lock, flags); + rx_status.mactime = priv->tsf_time; + rx_status.band = hw->conf.chandef.chan->band; + rx_status.signal = rx_dbm; + rx_status.flag = 0; + rx_status.freq = hw->conf.chandef.chan->center_freq; - pRCB = pDevice->FirstRecvMngList; - pDevice->NumRecvMngList--; - DequeueRCB(pDevice->FirstRecvMngList, pDevice->LastRecvMngList); + if (!(*rsr & RSR_CRCOK)) + rx_status.flag |= RX_FLAG_FAILED_FCS_CRC; - spin_unlock_irqrestore(&pDevice->lock, flags); + hdr = (struct ieee80211_hdr *)(skb->data); + fc = hdr->frame_control; - if(!pRCB){ - break; - } - pRxPacket = &(pRCB->sMngPacket); - vMgrRxManagePacket(pDevice, &pDevice->vnt_mgmt, pRxPacket); - pRCB->Ref--; - if (pRCB->Ref == 0) { - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"RxvFreeMng %d %d\n", - pDevice->NumRecvFreeList, pDevice->NumRecvMngList); + rx_status.rate_idx = rate_idx; - spin_lock_irqsave(&pDevice->lock, flags); + if (ieee80211_has_protected(fc)) { + if (priv->local_id > REV_ID_VT3253_A1) { + rx_status.flag |= RX_FLAG_DECRYPTED; - RXvFreeRCB(pRCB, bReAllocSkb); + /* Drop packet */ + if (!(*new_rsr & NEWRSR_DECRYPTOK)) { + dev_kfree_skb(skb); + return true; + } + } + } - spin_unlock_irqrestore(&pDevice->lock, flags); - } else { - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Rx Mng Only we have the right to free RCB\n"); - } - } + memcpy(IEEE80211_SKB_RXCB(skb), &rx_status, sizeof(rx_status)); - pDevice->bIsRxMngWorkItemQueued = false; -} + ieee80211_rx_irqsafe(priv->hw, skb); + return true; +} diff --git a/drivers/staging/vt6656/dpc.h b/drivers/staging/vt6656/dpc.h index 8d524345dfdb..fab195f8c3f5 100644 --- a/drivers/staging/vt6656/dpc.h +++ b/drivers/staging/vt6656/dpc.h @@ -30,15 +30,8 @@ #define __DPC_H__ #include "device.h" -#include "wcmd.h" -void RXvWorkItem(struct work_struct *work); - -void RXvMngWorkItem(struct work_struct *work); - -void RXvFreeRCB(struct vnt_rcb *pRCB, int bReAllocSkb); - -int RXbBulkInProcessData(struct vnt_private *, struct vnt_rcb *pRCB, - unsigned long BytesToIndicate); +int vnt_rx_data(struct vnt_private *, struct vnt_rcb *, + unsigned long bytes_recieved); #endif /* __RXTX_H__ */ diff --git a/drivers/staging/vt6656/firmware.c b/drivers/staging/vt6656/firmware.c index 1159f0b34578..eae4f32d9b66 100644 --- a/drivers/staging/vt6656/firmware.c +++ b/drivers/staging/vt6656/firmware.c @@ -35,25 +35,22 @@ #include "firmware.h" #include "usbpipe.h" -static int msglevel = MSG_LEVEL_INFO; -/* static int msglevel = MSG_LEVEL_DEBUG; */ - #define FIRMWARE_VERSION 0x133 /* version 1.51 */ #define FIRMWARE_NAME "vntwusb.fw" #define FIRMWARE_CHUNK_SIZE 0x400 -int FIRMWAREbDownload(struct vnt_private *pDevice) +int vnt_download_firmware(struct vnt_private *priv) { - struct device *dev = &pDevice->usb->dev; + struct device *dev = &priv->usb->dev; const struct firmware *fw; - int NdisStatus; - void *pBuffer = NULL; + int status; + void *buffer = NULL; bool result = false; - u16 wLength; + u16 length; int ii, rc; - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"---->Download firmware\n"); + dev_dbg(dev, "---->Download firmware\n"); rc = request_firmware(&fw, FIRMWARE_NAME, dev); if (rc) { @@ -62,24 +59,24 @@ int FIRMWAREbDownload(struct vnt_private *pDevice) goto out; } - pBuffer = kmalloc(FIRMWARE_CHUNK_SIZE, GFP_KERNEL); - if (!pBuffer) + buffer = kmalloc(FIRMWARE_CHUNK_SIZE, GFP_KERNEL); + if (!buffer) goto out; for (ii = 0; ii < fw->size; ii += FIRMWARE_CHUNK_SIZE) { - wLength = min_t(int, fw->size - ii, FIRMWARE_CHUNK_SIZE); - memcpy(pBuffer, fw->data + ii, wLength); + length = min_t(int, fw->size - ii, FIRMWARE_CHUNK_SIZE); + memcpy(buffer, fw->data + ii, length); - NdisStatus = vnt_control_out(pDevice, + status = vnt_control_out(priv, 0, 0x1200+ii, 0x0000, - wLength, - pBuffer); + length, + buffer); + + dev_dbg(dev, "Download firmware...%d %zu\n", ii, fw->size); - DBG_PRT(MSG_LEVEL_DEBUG, - KERN_INFO"Download firmware...%d %zu\n", ii, fw->size); - if (NdisStatus != STATUS_SUCCESS) + if (status != STATUS_SUCCESS) goto free_fw; } @@ -88,56 +85,59 @@ free_fw: release_firmware(fw); out: - kfree(pBuffer); + kfree(buffer); return result; } MODULE_FIRMWARE(FIRMWARE_NAME); -int FIRMWAREbBrach2Sram(struct vnt_private *pDevice) +int vnt_firmware_branch_to_sram(struct vnt_private *priv) { - int NdisStatus; + int status; - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"---->Branch to Sram\n"); + dev_dbg(&priv->usb->dev, "---->Branch to Sram\n"); - NdisStatus = vnt_control_out(pDevice, + status = vnt_control_out(priv, 1, 0x1200, 0x0000, 0, NULL); - if (NdisStatus != STATUS_SUCCESS) + if (status != STATUS_SUCCESS) return false; else return true; } -int FIRMWAREbCheckVersion(struct vnt_private *pDevice) +int vnt_check_firmware_version(struct vnt_private *priv) { - int ntStatus; + int status; - ntStatus = vnt_control_in(pDevice, + status = vnt_control_in(priv, MESSAGE_TYPE_READ, 0, MESSAGE_REQUEST_VERSION, 2, - (u8 *) &(pDevice->wFirmwareVersion)); + (u8 *)&priv->firmware_version); + + dev_dbg(&priv->usb->dev, "Firmware Version [%04x]\n", + priv->firmware_version); - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Firmware Version [%04x]\n", - pDevice->wFirmwareVersion); - if (ntStatus != STATUS_SUCCESS) { - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Firmware Invalid.\n"); + if (status != STATUS_SUCCESS) { + dev_dbg(&priv->usb->dev, "Firmware Invalid.\n"); return false; } - if (pDevice->wFirmwareVersion == 0xFFFF) { - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"In Loader.\n"); + if (priv->firmware_version == 0xFFFF) { + dev_dbg(&priv->usb->dev, "In Loader.\n"); return false; } - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Firmware Version [%04x]\n", - pDevice->wFirmwareVersion); - if (pDevice->wFirmwareVersion < FIRMWARE_VERSION) { + + dev_dbg(&priv->usb->dev, "Firmware Version [%04x]\n", + priv->firmware_version); + + if (priv->firmware_version < FIRMWARE_VERSION) { /* branch to loader for download new firmware */ - FIRMWAREbBrach2Sram(pDevice); + vnt_firmware_branch_to_sram(priv); return false; } return true; diff --git a/drivers/staging/vt6656/firmware.h b/drivers/staging/vt6656/firmware.h index e3b08db6a734..d594dbe1c147 100644 --- a/drivers/staging/vt6656/firmware.h +++ b/drivers/staging/vt6656/firmware.h @@ -32,8 +32,8 @@ #include "device.h" -int FIRMWAREbDownload(struct vnt_private *); -int FIRMWAREbBrach2Sram(struct vnt_private *); -int FIRMWAREbCheckVersion(struct vnt_private *); +int vnt_download_firmware(struct vnt_private *); +int vnt_firmware_branch_to_sram(struct vnt_private *); +int vnt_check_firmware_version(struct vnt_private *); #endif /* __FIRMWARE_H__ */ diff --git a/drivers/staging/vt6656/int.c b/drivers/staging/vt6656/int.c index f2a5225b50f8..2ef70e4701f6 100644 --- a/drivers/staging/vt6656/int.c +++ b/drivers/staging/vt6656/int.c @@ -33,155 +33,134 @@ */ #include "int.h" -#include "tmacro.h" #include "mac.h" #include "power.h" -#include "bssdb.h" #include "usbpipe.h" -static int msglevel = MSG_LEVEL_INFO; /* MSG_LEVEL_DEBUG */ - -/*+ - * - * Function: InterruptPollingThread - * - * Synopsis: Thread running at IRQL PASSIVE_LEVEL. - * - * Arguments: Device Extension - * - * Returns: - * - * Algorithm: Call USBD for input data; - * - * History: dd-mm-yyyy Author Comment - * - * - * Notes: - * - * USB reads are by nature 'Blocking', and when in a read, the device looks - * like it's in a 'stall' condition, so we deliberately time out every second - * if we've gotten no data - * --*/ -void INTvWorkItem(struct vnt_private *pDevice) +static const u8 fallback_rate0[5][5] = { + {RATE_18M, RATE_18M, RATE_12M, RATE_12M, RATE_12M}, + {RATE_24M, RATE_24M, RATE_18M, RATE_12M, RATE_12M}, + {RATE_36M, RATE_36M, RATE_24M, RATE_18M, RATE_18M}, + {RATE_48M, RATE_48M, RATE_36M, RATE_24M, RATE_24M}, + {RATE_54M, RATE_54M, RATE_48M, RATE_36M, RATE_36M} +}; + +static const u8 fallback_rate1[5][5] = { + {RATE_18M, RATE_18M, RATE_12M, RATE_6M, RATE_6M}, + {RATE_24M, RATE_24M, RATE_18M, RATE_6M, RATE_6M}, + {RATE_36M, RATE_36M, RATE_24M, RATE_12M, RATE_12M}, + {RATE_48M, RATE_48M, RATE_24M, RATE_12M, RATE_12M}, + {RATE_54M, RATE_54M, RATE_36M, RATE_18M, RATE_18M} +}; + +void vnt_int_start_interrupt(struct vnt_private *priv) { unsigned long flags; - int ntStatus; + int status; - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"---->Interrupt Polling Thread\n"); + dev_dbg(&priv->usb->dev, "---->Interrupt Polling Thread\n"); - spin_lock_irqsave(&pDevice->lock, flags); + spin_lock_irqsave(&priv->lock, flags); - ntStatus = PIPEnsInterruptRead(pDevice); + status = vnt_start_interrupt_urb(priv); - spin_unlock_irqrestore(&pDevice->lock, flags); + spin_unlock_irqrestore(&priv->lock, flags); } -void INTnsProcessData(struct vnt_private *priv) +static int vnt_int_report_rate(struct vnt_private *priv, u8 pkt_no, u8 tsr) { - struct vnt_interrupt_data *int_data; - struct vnt_manager *mgmt = &priv->vnt_mgmt; - struct net_device_stats *stats = &priv->stats; + struct vnt_usb_send_context *context; + struct ieee80211_tx_info *info; + struct ieee80211_rate *rate; + u8 tx_retry = (tsr & 0xf0) >> 4; + s8 idx; - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"---->s_nsInterruptProcessData\n"); + if (pkt_no >= priv->num_tx_context) + return -EINVAL; - int_data = (struct vnt_interrupt_data *)priv->int_buf.data_buf; + context = priv->tx_context[pkt_no]; - if (int_data->tsr0 & TSR_VALID) { - if (int_data->tsr0 & (TSR_TMO | TSR_RETRYTMO)) - priv->wstats.discard.retries++; - else - stats->tx_packets++; + if (!context->skb) + return -EINVAL; - BSSvUpdateNodeTxCounter(priv, - int_data->tsr0, - int_data->pkt0); - } + info = IEEE80211_SKB_CB(context->skb); + idx = info->control.rates[0].idx; - if (int_data->tsr1 & TSR_VALID) { - if (int_data->tsr1 & (TSR_TMO | TSR_RETRYTMO)) - priv->wstats.discard.retries++; - else - stats->tx_packets++; + if (context->fb_option && !(tsr & (TSR_TMO | TSR_RETRYTMO))) { + u8 tx_rate; + u8 retry = tx_retry; + rate = ieee80211_get_tx_rate(priv->hw, info); + tx_rate = rate->hw_value - RATE_18M; - BSSvUpdateNodeTxCounter(priv, - int_data->tsr1, - int_data->pkt1); - } + if (retry > 4) + retry = 4; - if (int_data->tsr2 & TSR_VALID) { - if (int_data->tsr2 & (TSR_TMO | TSR_RETRYTMO)) - priv->wstats.discard.retries++; - else - stats->tx_packets++; + if (context->fb_option == AUTO_FB_0) + tx_rate = fallback_rate0[tx_rate][retry]; + else if (context->fb_option == AUTO_FB_1) + tx_rate = fallback_rate1[tx_rate][retry]; - BSSvUpdateNodeTxCounter(priv, - int_data->tsr2, - int_data->pkt2); + if (info->band == IEEE80211_BAND_5GHZ) + idx = tx_rate - RATE_6M; + else + idx = tx_rate; } - if (int_data->tsr3 & TSR_VALID) { - if (int_data->tsr3 & (TSR_TMO | TSR_RETRYTMO)) - priv->wstats.discard.retries++; - else - stats->tx_packets++; + ieee80211_tx_info_clear_status(info); - BSSvUpdateNodeTxCounter(priv, - int_data->tsr3, - int_data->pkt3); + info->status.rates[0].count = tx_retry; + + if (!(tsr & (TSR_TMO | TSR_RETRYTMO))) { + info->status.rates[0].idx = idx; + info->flags |= IEEE80211_TX_STAT_ACK; } + ieee80211_tx_status_irqsafe(priv->hw, context->skb); + + context->in_use = false; + + return 0; +} + +void vnt_int_process_data(struct vnt_private *priv) +{ + struct vnt_interrupt_data *int_data; + struct ieee80211_low_level_stats *low_stats = &priv->low_stats; + + dev_dbg(&priv->usb->dev, "---->s_nsInterruptProcessData\n"); + + int_data = (struct vnt_interrupt_data *)priv->int_buf.data_buf; + + if (int_data->tsr0 & TSR_VALID) + vnt_int_report_rate(priv, int_data->pkt0, int_data->tsr0); + + if (int_data->tsr1 & TSR_VALID) + vnt_int_report_rate(priv, int_data->pkt1, int_data->tsr1); + + if (int_data->tsr2 & TSR_VALID) + vnt_int_report_rate(priv, int_data->pkt2, int_data->tsr2); + + if (int_data->tsr3 & TSR_VALID) + vnt_int_report_rate(priv, int_data->pkt3, int_data->tsr3); + if (int_data->isr0 != 0) { - if (int_data->isr0 & ISR_BNTX) { - if (priv->op_mode == NL80211_IFTYPE_AP) { - if (mgmt->byDTIMCount > 0) { - mgmt->byDTIMCount--; - mgmt->sNodeDBTable[0].bRxPSPoll = - false; - } else if (mgmt->byDTIMCount == 0) { - /* check if multicast tx buffering */ - mgmt->byDTIMCount = - mgmt->byDTIMPeriod-1; - mgmt->sNodeDBTable[0].bRxPSPoll = true; - if (mgmt->sNodeDBTable[0].bPSEnable) - bScheduleCommand((void *) priv, - WLAN_CMD_RX_PSPOLL, - NULL); - } - bScheduleCommand((void *) priv, - WLAN_CMD_BECON_SEND, - NULL); - } - priv->bBeaconSent = true; - } else { - priv->bBeaconSent = false; - } + if (int_data->isr0 & ISR_BNTX && + priv->op_mode == NL80211_IFTYPE_AP) + vnt_schedule_command(priv, WLAN_CMD_BECON_SEND); if (int_data->isr0 & ISR_TBTT) { - if (priv->bEnablePSMode) - bScheduleCommand((void *) priv, - WLAN_CMD_TBTT_WAKEUP, - NULL); - if (priv->bChannelSwitch) { - priv->byChannelSwitchCount--; - if (priv->byChannelSwitchCount == 0) - bScheduleCommand((void *) priv, - WLAN_CMD_11H_CHSW, - NULL); - } + if (priv->hw->conf.flags & IEEE80211_CONF_PS) + vnt_schedule_command(priv, + WLAN_CMD_TBTT_WAKEUP); } - priv->qwCurrTSF = le64_to_cpu(int_data->tsf); - } + priv->current_tsf = le64_to_cpu(int_data->tsf); - if (int_data->isr1 != 0) - if (int_data->isr1 & ISR_GPIO3) - bScheduleCommand((void *) priv, - WLAN_CMD_RADIO, - NULL); + low_stats->dot11RTSSuccessCount += int_data->rts_success; + low_stats->dot11RTSFailureCount += int_data->rts_fail; + low_stats->dot11ACKFailureCount += int_data->ack_fail; + low_stats->dot11FCSErrorCount += int_data->fcs_err; + } priv->int_buf.in_use = false; - - stats->tx_errors = priv->wstats.discard.retries; - stats->tx_dropped = priv->wstats.discard.retries; } diff --git a/drivers/staging/vt6656/int.h b/drivers/staging/vt6656/int.h index 08db868e1d07..154605c63947 100644 --- a/drivers/staging/vt6656/int.h +++ b/drivers/staging/vt6656/int.h @@ -55,7 +55,7 @@ struct vnt_interrupt_data { u8 sw[2]; } __packed; -void INTvWorkItem(struct vnt_private *); -void INTnsProcessData(struct vnt_private *); +void vnt_int_start_interrupt(struct vnt_private *); +void vnt_int_process_data(struct vnt_private *); #endif /* __INT_H__ */ diff --git a/drivers/staging/vt6656/iocmd.h b/drivers/staging/vt6656/iocmd.h deleted file mode 100644 index b957e6d475af..000000000000 --- a/drivers/staging/vt6656/iocmd.h +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright (c) 1996, 2003 VIA Networking Technologies, Inc. - * All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - * - * File: iocmd.h - * - * Purpose: Handles the viawget ioctl private interface functions - * - * Author: Lyndon Chen - * - * Date: May 8, 2002 - * - */ - -#ifndef __IOCMD_H__ -#define __IOCMD_H__ - -typedef enum tagWZONETYPE { - ZoneType_USA = 0, - ZoneType_Japan = 1, - ZoneType_Europe = 2 -} WZONETYPE; - -#endif /* __IOCMD_H__ */ diff --git a/drivers/staging/vt6656/iowpa.h b/drivers/staging/vt6656/iowpa.h deleted file mode 100644 index 98f2b2195af4..000000000000 --- a/drivers/staging/vt6656/iowpa.h +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Copyright (c) 1996, 2003 VIA Networking Technologies, Inc. - * All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - * - * File: iowpa.h - * - * Purpose: Handles wpa supplicant ioctl interface - * - * Author: Lyndon Chen - * - * Date: May 8, 2002 - * - */ - -#ifndef __IOWPA_H__ -#define __IOWPA_H__ - -#define WPA_IE_LEN 64 - -struct viawget_wpa_param { - u32 cmd; - u8 addr[6]; - union { - struct { - u8 len; - u8 data[0]; - } generic_elem; - struct { - u8 bssid[6]; - u8 ssid[32]; - u8 ssid_len; - u8 *wpa_ie; - u16 wpa_ie_len; - int pairwise_suite; - int group_suite; - int key_mgmt_suite; - int auth_alg; - int mode; - u8 roam_dbm; - } wpa_associate; - struct { - int alg_name; - u16 key_index; - u16 set_tx; - u8 *seq; - u16 seq_len; - u8 *key; - u16 key_len; - } wpa_key; - struct { - u8 ssid_len; - u8 ssid[32]; - } scan_req; - struct { - u16 scan_count; - u8 *buf; - } scan_results; - } u; -} __packed; - -#endif /* __IOWPA_H__ */ diff --git a/drivers/staging/vt6656/iwctl.c b/drivers/staging/vt6656/iwctl.c deleted file mode 100644 index c43718d788c0..000000000000 --- a/drivers/staging/vt6656/iwctl.c +++ /dev/null @@ -1,1802 +0,0 @@ -/* - * Copyright (c) 1996, 2003 VIA Networking Technologies, Inc. - * All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - * - * File: iwctl.c - * - * Purpose: wireless ext & ioctl functions - * - * Author: Lyndon Chen - * - * Date: July 5, 2006 - * - * Functions: - * - * Revision History: - * - */ - -#include "device.h" -#include "iwctl.h" -#include "mac.h" -#include "card.h" -#include "power.h" -#include "rf.h" -#include "iowpa.h" -#include "wpactl.h" -#include "usbpipe.h" -#include "baseband.h" - -static const long frequency_list[] = { - 2412, 2417, 2422, 2427, 2432, 2437, 2442, 2447, 2452, 2457, 2462, 2467, 2472, 2484, - 4915, 4920, 4925, 4935, 4940, 4945, 4960, 4980, - 5035, 5040, 5045, 5055, 5060, 5080, 5170, 5180, 5190, 5200, 5210, 5220, 5230, 5240, - 5260, 5280, 5300, 5320, 5500, 5520, 5540, 5560, 5580, 5600, 5620, 5640, 5660, 5680, - 5700, 5745, 5765, 5785, 5805, 5825 -}; - -static int msglevel = MSG_LEVEL_INFO; - -struct iw_statistics *iwctl_get_wireless_stats(struct net_device *dev) -{ - struct vnt_private *pDevice = netdev_priv(dev); - long ldBm; - - pDevice->wstats.status = pDevice->op_mode; - vnt_rf_rssi_to_dbm(pDevice, (u8)(pDevice->uCurrRSSI), &ldBm); - pDevice->wstats.qual.level = ldBm; - pDevice->wstats.qual.noise = 0; - pDevice->wstats.qual.updated = 1; - pDevice->wstats.discard.nwid = 0; - pDevice->wstats.discard.code = 0; - pDevice->wstats.discard.fragment = 0; - pDevice->wstats.discard.misc = 0; - pDevice->wstats.miss.beacon = 0; - return &pDevice->wstats; -} - -/* - * Wireless Handler: get protocol name - */ -int iwctl_giwname(struct net_device *dev, struct iw_request_info *info, - union iwreq_data *wrqu, char *extra) -{ - strcpy(wrqu->name, "802.11-a/b/g"); - return 0; -} - -/* - * Wireless Handler: set scan - */ -int iwctl_siwscan(struct net_device *dev, struct iw_request_info *info, - union iwreq_data *wrqu, char *extra) -{ - struct vnt_private *pDevice = netdev_priv(dev); - struct iw_point *wrq = &wrqu->data; - struct vnt_manager *pMgmt = &pDevice->vnt_mgmt; - struct iw_scan_req *req = (struct iw_scan_req *)extra; - u8 abyScanSSID[WLAN_IEHDR_LEN + WLAN_SSID_MAXLEN + 1]; - PWLAN_IE_SSID pItemSSID = NULL; - unsigned long flags; - - if (!(pDevice->flags & DEVICE_FLAGS_OPENED)) - return -EINVAL; - - PRINT_K(" SIOCSIWSCAN\n"); - - if (pMgmt == NULL) - return -EFAULT; - - if (pMgmt->eScanState == WMAC_IS_SCANNING) { - // In scanning.. - PRINT_K("SIOCSIWSCAN(overlap??)-->In scanning...\n"); - return -EAGAIN; - } - - if (pDevice->byReAssocCount > 0) { // reject scan when re-associating! - // send scan event to wpa_Supplicant - union iwreq_data wrqu; - PRINT_K("wireless_send_event--->SIOCGIWSCAN(scan done)\n"); - memset(&wrqu, 0, sizeof(wrqu)); - wireless_send_event(pDevice->dev, SIOCGIWSCAN, &wrqu, NULL); - return 0; - } - - spin_lock_irqsave(&pDevice->lock, flags); - - BSSvClearBSSList((void *)pDevice, pDevice->bLinkPass); - - // mike add: active scan OR passive scan OR desire_ssid scan - if (wrq->length == sizeof(struct iw_scan_req)) { - if (wrq->flags & IW_SCAN_THIS_ESSID) { // desire_ssid scan - memset(abyScanSSID, 0, WLAN_IEHDR_LEN + WLAN_SSID_MAXLEN + 1); - pItemSSID = (PWLAN_IE_SSID)abyScanSSID; - pItemSSID->byElementID = WLAN_EID_SSID; - memcpy(pItemSSID->abySSID, req->essid, (int)req->essid_len); - if (pItemSSID->abySSID[req->essid_len] == '\0') { - if (req->essid_len > 0) - pItemSSID->len = req->essid_len; - } else { - pItemSSID->len = req->essid_len; - } - pMgmt->eScanType = WMAC_SCAN_PASSIVE; - PRINT_K("SIOCSIWSCAN:[desired_ssid=%s,len=%d]\n", ((PWLAN_IE_SSID)abyScanSSID)->abySSID, - ((PWLAN_IE_SSID)abyScanSSID)->len); - bScheduleCommand((void *)pDevice, WLAN_CMD_BSSID_SCAN, abyScanSSID); - - spin_unlock_irqrestore(&pDevice->lock, flags); - - return 0; - } else if (req->scan_type == IW_SCAN_TYPE_PASSIVE) { // passive scan - pMgmt->eScanType = WMAC_SCAN_PASSIVE; - } - } else { // active scan - pMgmt->eScanType = WMAC_SCAN_ACTIVE; - } - - pMgmt->eScanType = WMAC_SCAN_PASSIVE; - bScheduleCommand((void *)pDevice, WLAN_CMD_BSSID_SCAN, NULL); - - spin_unlock_irqrestore(&pDevice->lock, flags); - - return 0; -} - -/* - * Wireless Handler : get scan results - */ -int iwctl_giwscan(struct net_device *dev, struct iw_request_info *info, - union iwreq_data *wrqu, char *extra) -{ - struct iw_point *wrq = &wrqu->data; - int ii; - int jj; - int kk; - struct vnt_private *pDevice = netdev_priv(dev); - struct vnt_manager *pMgmt = &pDevice->vnt_mgmt; - PKnownBSS pBSS; - PWLAN_IE_SSID pItemSSID; - PWLAN_IE_SUPP_RATES pSuppRates; - PWLAN_IE_SUPP_RATES pExtSuppRates; - char *current_ev = extra; - char *end_buf = extra + IW_SCAN_MAX_DATA; - char *current_val = NULL; - struct iw_event iwe; - long ldBm; - - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCGIWSCAN\n"); - - if (pMgmt == NULL) - return -EFAULT; - - if (pMgmt->eScanState == WMAC_IS_SCANNING) { - // In scanning.. - return -EAGAIN; - } - pBSS = &(pMgmt->sBSSList[0]); - for (ii = 0, jj = 0; jj < MAX_BSS_NUM; jj++) { - if (current_ev >= end_buf) - break; - pBSS = &(pMgmt->sBSSList[jj]); - if (pBSS->bActive) { - // ADD mac address - memset(&iwe, 0, sizeof(iwe)); - iwe.cmd = SIOCGIWAP; - iwe.u.ap_addr.sa_family = ARPHRD_ETHER; - memcpy(iwe.u.ap_addr.sa_data, pBSS->abyBSSID, WLAN_BSSID_LEN); - current_ev = iwe_stream_add_event(info, current_ev, end_buf, &iwe, IW_EV_ADDR_LEN); - // ADD ssid - memset(&iwe, 0, sizeof(iwe)); - iwe.cmd = SIOCGIWESSID; - pItemSSID = (PWLAN_IE_SSID)pBSS->abySSID; - iwe.u.data.length = pItemSSID->len; - iwe.u.data.flags = 1; - current_ev = iwe_stream_add_point(info, current_ev, end_buf, &iwe, pItemSSID->abySSID); - // ADD mode - memset(&iwe, 0, sizeof(iwe)); - iwe.cmd = SIOCGIWMODE; - if (WLAN_GET_CAP_INFO_ESS(pBSS->wCapInfo)) - iwe.u.mode = IW_MODE_INFRA; - else - iwe.u.mode = IW_MODE_ADHOC; - iwe.len = IW_EV_UINT_LEN; - current_ev = iwe_stream_add_event(info, current_ev, end_buf, &iwe, IW_EV_UINT_LEN); - // ADD frequency - pSuppRates = (PWLAN_IE_SUPP_RATES)pBSS->abySuppRates; - pExtSuppRates = (PWLAN_IE_SUPP_RATES)pBSS->abyExtSuppRates; - memset(&iwe, 0, sizeof(iwe)); - iwe.cmd = SIOCGIWFREQ; - iwe.u.freq.m = pBSS->uChannel; - iwe.u.freq.e = 0; - iwe.u.freq.i = 0; - current_ev = iwe_stream_add_event(info, current_ev, end_buf, &iwe, IW_EV_FREQ_LEN); - { - int f = (int)pBSS->uChannel - 1; - if (f < 0) - f = 0; - iwe.u.freq.m = frequency_list[f] * 100000; - iwe.u.freq.e = 1; - } - current_ev = iwe_stream_add_event(info, current_ev, end_buf, &iwe, IW_EV_FREQ_LEN); - // ADD quality - memset(&iwe, 0, sizeof(iwe)); - iwe.cmd = IWEVQUAL; - vnt_rf_rssi_to_dbm(pDevice, (u8)(pBSS->uRSSI), &ldBm); - iwe.u.qual.level = ldBm; - iwe.u.qual.noise = 0; - - if (-ldBm < 50) - iwe.u.qual.qual = 100; - else if (-ldBm > 90) - iwe.u.qual.qual = 0; - else - iwe.u.qual.qual = (40 - (-ldBm - 50)) * 100 / 40; - iwe.u.qual.updated = 7; - - current_ev = iwe_stream_add_event(info, current_ev, end_buf, &iwe, IW_EV_QUAL_LEN); - // ADD encryption - memset(&iwe, 0, sizeof(iwe)); - iwe.cmd = SIOCGIWENCODE; - iwe.u.data.length = 0; - if (WLAN_GET_CAP_INFO_PRIVACY(pBSS->wCapInfo)) - iwe.u.data.flags = IW_ENCODE_ENABLED | IW_ENCODE_NOKEY; - else - iwe.u.data.flags = IW_ENCODE_DISABLED; - current_ev = iwe_stream_add_point(info, current_ev, end_buf, &iwe, pItemSSID->abySSID); - - memset(&iwe, 0, sizeof(iwe)); - iwe.cmd = SIOCGIWRATE; - iwe.u.bitrate.fixed = iwe.u.bitrate.disabled = 0; - current_val = current_ev + IW_EV_LCP_LEN; - - for (kk = 0; kk < 12; kk++) { - if (pSuppRates->abyRates[kk] == 0) - break; - // Bit rate given in 500 kb/s units (+ 0x80) - iwe.u.bitrate.value = ((pSuppRates->abyRates[kk] & 0x7f) * 500000); - current_val = iwe_stream_add_value(info, current_ev, current_val, end_buf, &iwe, IW_EV_PARAM_LEN); - } - for (kk = 0; kk < 8; kk++) { - if (pExtSuppRates->abyRates[kk] == 0) - break; - // Bit rate given in 500 kb/s units (+ 0x80) - iwe.u.bitrate.value = ((pExtSuppRates->abyRates[kk] & 0x7f) * 500000); - current_val = iwe_stream_add_value(info, current_ev, current_val, end_buf, &iwe, IW_EV_PARAM_LEN); - } - - if ((current_val - current_ev) > IW_EV_LCP_LEN) - current_ev = current_val; - - if ((pBSS->wWPALen > 0) && (pBSS->wWPALen <= MAX_WPA_IE_LEN)) { - memset(&iwe, 0, sizeof(iwe)); - iwe.cmd = IWEVGENIE; - iwe.u.data.length = pBSS->wWPALen; - current_ev = iwe_stream_add_point(info, current_ev, end_buf, &iwe, pBSS->byWPAIE); - } - - if ((pBSS->wRSNLen > 0) && (pBSS->wRSNLen <= MAX_WPA_IE_LEN)) { - memset(&iwe, 0, sizeof(iwe)); - iwe.cmd = IWEVGENIE; - iwe.u.data.length = pBSS->wRSNLen; - current_ev = iwe_stream_add_point(info, current_ev, end_buf, &iwe, pBSS->byRSNIE); - } - } - } // for - wrq->length = current_ev - extra; - return 0; -} - -/* - * Wireless Handler: set frequence or channel - */ -int iwctl_siwfreq(struct net_device *dev, struct iw_request_info *info, - union iwreq_data *wrqu, char *extra) -{ - struct vnt_private *pDevice = netdev_priv(dev); - struct iw_freq *wrq = &wrqu->freq; - int rc = 0; - - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWFREQ\n"); - - // If setting by frequency, convert to a channel - if ((wrq->e == 1) && (wrq->m >= (int)2.412e8) && - (wrq->m <= (int)2.487e8)) { - int f = wrq->m / 100000; - int c = 0; - while ((c < 14) && (f != frequency_list[c])) - c++; - wrq->e = 0; - wrq->m = c + 1; - } - // Setting by channel number - if ((wrq->m > 14) || (wrq->e > 0)) { - rc = -EOPNOTSUPP; - } else { - int channel = wrq->m; - if ((channel < 1) || (channel > 14)) { - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "%s: New channel value of %d is invalid!\n", dev->name, wrq->m); - rc = -EINVAL; - } else { - // Yes ! We can set it !!! - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " Set to channel = %d\n", channel); - pDevice->uChannel = channel; - } - } - return rc; -} - -/* - * Wireless Handler: get frequence or channel - */ -int iwctl_giwfreq(struct net_device *dev, struct iw_request_info *info, - union iwreq_data *wrqu, char *extra) -{ - struct vnt_private *pDevice = netdev_priv(dev); - struct iw_freq *wrq = &wrqu->freq; - struct vnt_manager *pMgmt = &pDevice->vnt_mgmt; - - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCGIWFREQ\n"); - - if (pMgmt == NULL) - return -EFAULT; - -#ifdef WEXT_USECHANNELS - wrq->m = (int)pMgmt->uCurrChannel; - wrq->e = 0; -#else - { - int f = (int)pMgmt->uCurrChannel - 1; - if (f < 0) - f = 0; - wrq->m = frequency_list[f] * 100000; - wrq->e = 1; - } -#endif - return 0; -} - -/* - * Wireless Handler: set operation mode - */ -int iwctl_siwmode(struct net_device *dev, struct iw_request_info *info, - union iwreq_data *wrqu, char *extra) -{ - struct vnt_private *pDevice = netdev_priv(dev); - __u32 *wmode = &wrqu->mode; - struct vnt_manager *pMgmt = &pDevice->vnt_mgmt; - unsigned long flags; - int rc = 0; - - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWMODE\n"); - - if (pMgmt == NULL) - return -EFAULT; - - switch (*wmode) { - case IW_MODE_ADHOC: - if (pMgmt->eConfigMode != WMAC_CONFIG_IBSS_STA) { - pMgmt->eConfigMode = WMAC_CONFIG_IBSS_STA; - if (pDevice->flags & DEVICE_FLAGS_OPENED) - pDevice->bCommit = true; - } - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "set mode to ad-hoc\n"); - break; - case IW_MODE_AUTO: - case IW_MODE_INFRA: - if (pMgmt->eConfigMode != WMAC_CONFIG_ESS_STA) { - pMgmt->eConfigMode = WMAC_CONFIG_ESS_STA; - if (pDevice->flags & DEVICE_FLAGS_OPENED) - pDevice->bCommit = true; - } - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "set mode to infrastructure\n"); - break; - case IW_MODE_MASTER: - rc = -EOPNOTSUPP; - break; - - case IW_MODE_REPEAT: - pMgmt->eConfigMode = WMAC_CONFIG_ESS_STA; - rc = -EOPNOTSUPP; - break; - default: - rc = -EINVAL; - } - - if (pDevice->bCommit) { - if (pMgmt->eConfigMode == WMAC_CONFIG_AP) { - netif_stop_queue(pDevice->dev); - - spin_lock_irqsave(&pDevice->lock, flags); - - bScheduleCommand((void *) pDevice, - WLAN_CMD_RUN_AP, NULL); - - spin_unlock_irqrestore(&pDevice->lock, flags); - } else { - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO - "Commit the settings\n"); - - if (pDevice->bLinkPass && - memcmp(pMgmt->abyCurrSSID, - pMgmt->abyDesireSSID, - WLAN_IEHDR_LEN + WLAN_SSID_MAXLEN)) { - bScheduleCommand((void *) pDevice, - WLAN_CMD_DISASSOCIATE, NULL); - } else { - pDevice->bLinkPass = false; - pMgmt->eCurrState = WMAC_STATE_IDLE; - memset(pMgmt->abyCurrBSSID, 0, 6); - } - - vnt_mac_set_led(pDevice, LEDSTS_STS, LEDSTS_SLOW); - - netif_stop_queue(pDevice->dev); - - pMgmt->eScanType = WMAC_SCAN_ACTIVE; - - if (!pDevice->bWPASuppWextEnabled) - bScheduleCommand((void *) pDevice, - WLAN_CMD_BSSID_SCAN, - pMgmt->abyDesireSSID); - - bScheduleCommand((void *) pDevice, - WLAN_CMD_SSID, - NULL); - } - pDevice->bCommit = false; - } - - return rc; -} - -/* - * Wireless Handler: get operation mode - */ -int iwctl_giwmode(struct net_device *dev, struct iw_request_info *info, - union iwreq_data *wrqu, char *extra) -{ - struct vnt_private *pDevice = netdev_priv(dev); - __u32 *wmode = &wrqu->mode; - struct vnt_manager *pMgmt = &pDevice->vnt_mgmt; - - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCGIWMODE\n"); - - if (pMgmt == NULL) - return -EFAULT; - - // If not managed, assume it's ad-hoc - switch (pMgmt->eConfigMode) { - case WMAC_CONFIG_ESS_STA: - *wmode = IW_MODE_INFRA; - break; - case WMAC_CONFIG_IBSS_STA: - *wmode = IW_MODE_ADHOC; - break; - case WMAC_CONFIG_AUTO: - *wmode = IW_MODE_INFRA; - break; - case WMAC_CONFIG_AP: - *wmode = IW_MODE_MASTER; - break; - default: - *wmode = IW_MODE_ADHOC; - } - - return 0; -} - -/* - * Wireless Handler: get capability range - */ -int iwctl_giwrange(struct net_device *dev, struct iw_request_info *info, - union iwreq_data *wrqu, char *extra) -{ - struct iw_point *wrq = &wrqu->data; - struct iw_range *range = (struct iw_range *)extra; - int i; - int k; - u8 abySupportedRates[13] = { - 0x02, 0x04, 0x0B, 0x16, 0x0c, 0x12, 0x18, 0x24, 0x30, 0x48, - 0x60, 0x6C, 0x90 - }; - - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCGIWRANGE\n"); - if (wrq->pointer) { - wrq->length = sizeof(struct iw_range); - memset(range, 0, sizeof(struct iw_range)); - range->min_nwid = 0x0000; - range->max_nwid = 0x0000; - range->num_channels = 14; - // Should be based on cap_rid.country to give only - // what the current card support - k = 0; - for (i = 0; i < 14; i++) { - range->freq[k].i = i + 1; // List index - range->freq[k].m = frequency_list[i] * 100000; - range->freq[k++].e = 1; // Values in table in MHz -> * 10^5 * 10 - } - range->num_frequency = k; - // Hum... Should put the right values there - range->max_qual.qual = 100; - range->max_qual.level = 0; - range->max_qual.noise = 0; - range->sensitivity = 255; - - for (i = 0; i < 13; i++) { - range->bitrate[i] = abySupportedRates[i] * 500000; - if (range->bitrate[i] == 0) - break; - } - range->num_bitrates = i; - - // Set an indication of the max TCP throughput - // in bit/s that we can expect using this interface. - // May be use for QoS stuff... Jean II - if (i > 2) - range->throughput = 5 * 1000 * 1000; - else - range->throughput = 1.5 * 1000 * 1000; - - range->min_rts = 0; - range->max_rts = 2312; - range->min_frag = 256; - range->max_frag = 2312; - - // the encoding capabilities - range->num_encoding_sizes = 3; - // 64(40) bits WEP - range->encoding_size[0] = 5; - // 128(104) bits WEP - range->encoding_size[1] = 13; - // 256 bits for WPA-PSK - range->encoding_size[2] = 32; - // 4 keys are allowed - range->max_encoding_tokens = 4; - - range->enc_capa = IW_ENC_CAPA_WPA | IW_ENC_CAPA_WPA2 | - IW_ENC_CAPA_CIPHER_TKIP | IW_ENC_CAPA_CIPHER_CCMP; - - range->min_pmp = 0; - range->max_pmp = 1000000; // 1 secs - range->min_pmt = 0; - range->max_pmt = 1000000; // 1 secs - range->pmp_flags = IW_POWER_PERIOD; - range->pmt_flags = IW_POWER_TIMEOUT; - range->pm_capa = IW_POWER_PERIOD | IW_POWER_TIMEOUT | IW_POWER_ALL_R; - - // Transmit Power - values are in mW - range->txpower[0] = 100; - range->num_txpower = 1; - range->txpower_capa = IW_TXPOW_MWATT; - range->we_version_source = WIRELESS_EXT; - range->we_version_compiled = WIRELESS_EXT; - range->retry_capa = IW_RETRY_LIMIT | IW_RETRY_LIFETIME; - range->retry_flags = IW_RETRY_LIMIT; - range->r_time_flags = IW_RETRY_LIFETIME; - range->min_retry = 1; - range->max_retry = 65535; - range->min_r_time = 1024; - range->max_r_time = 65535 * 1024; - // Experimental measurements - boundary 11/5.5 Mb/s - // Note : with or without the (local->rssi), results - // are somewhat different. - Jean II - range->avg_qual.qual = 6; - range->avg_qual.level = 176; // -80 dBm - range->avg_qual.noise = 0; - } - - return 0; -} - -/* - * Wireless Handler : set ap mac address - */ -int iwctl_siwap(struct net_device *dev, struct iw_request_info *info, - union iwreq_data *wrqu, char *extra) -{ - struct vnt_private *pDevice = netdev_priv(dev); - struct sockaddr *wrq = &wrqu->ap_addr; - struct vnt_manager *pMgmt = &pDevice->vnt_mgmt; - int rc = 0; - u8 ZeroBSSID[WLAN_BSSID_LEN] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; - - PRINT_K(" SIOCSIWAP\n"); - - if (pMgmt == NULL) - return -EFAULT; - - if (wrq->sa_family != ARPHRD_ETHER) { - rc = -EINVAL; - } else { - memcpy(pMgmt->abyDesireBSSID, wrq->sa_data, 6); - // mike: add - if ((is_broadcast_ether_addr(pMgmt->abyDesireBSSID)) || - (memcmp(pMgmt->abyDesireBSSID, ZeroBSSID, 6) == 0)) { - PRINT_K("SIOCSIWAP:invalid desired BSSID return!\n"); - return rc; - } - // mike add: if desired AP is hidden ssid(there are - // two same BSSID in list), then ignore,because you - // don't known which one to be connect with?? - { - unsigned ii; - unsigned uSameBssidNum = 0; - for (ii = 0; ii < MAX_BSS_NUM; ii++) { - if (pMgmt->sBSSList[ii].bActive && - ether_addr_equal(pMgmt->sBSSList[ii].abyBSSID, - pMgmt->abyDesireBSSID)) { - uSameBssidNum++; - } - } - if (uSameBssidNum >= 2) { //hit: desired AP is in hidden ssid mode!!! - PRINT_K("SIOCSIWAP:ignore for desired AP in hidden mode\n"); - return rc; - } - } - - if (pDevice->flags & DEVICE_FLAGS_OPENED) - pDevice->bCommit = true; - } - return rc; -} - -/* - * Wireless Handler: get ap mac address - */ -int iwctl_giwap(struct net_device *dev, struct iw_request_info *info, - union iwreq_data *wrqu, char *extra) -{ - struct vnt_private *pDevice = netdev_priv(dev); - struct sockaddr *wrq = &wrqu->ap_addr; - struct vnt_manager *pMgmt = &pDevice->vnt_mgmt; - - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCGIWAP\n"); - - if (pMgmt == NULL) - return -EFAULT; - - memcpy(wrq->sa_data, pMgmt->abyCurrBSSID, 6); - - if ((pDevice->bLinkPass == false) && (pMgmt->eCurrMode != WMAC_MODE_ESS_AP)) - memset(wrq->sa_data, 0, 6); - - if (pMgmt->eCurrMode == WMAC_MODE_ESS_AP) - memcpy(wrq->sa_data, pMgmt->abyCurrBSSID, 6); - - wrq->sa_family = ARPHRD_ETHER; - return 0; -} - -/* - * Wireless Handler: get ap list - */ -int iwctl_giwaplist(struct net_device *dev, struct iw_request_info *info, - union iwreq_data *wrqu, char *extra) -{ - struct iw_point *wrq = &wrqu->data; - struct sockaddr *sock; - struct iw_quality *qual; - struct vnt_private *pDevice = netdev_priv(dev); - struct vnt_manager *pMgmt = &pDevice->vnt_mgmt; - PKnownBSS pBSS = &pMgmt->sBSSList[0]; - int ii; - int jj; - - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCGIWAPLIST\n"); - /* Only super-user can see AP list */ - - if (pBSS == NULL) - return -ENODEV; - - if (!capable(CAP_NET_ADMIN)) - return -EPERM; - - if (!wrq->pointer) - return -EINVAL; - - sock = kcalloc(IW_MAX_AP, sizeof(struct sockaddr), GFP_KERNEL); - if (sock == NULL) - return -ENOMEM; - qual = kcalloc(IW_MAX_AP, sizeof(struct iw_quality), GFP_KERNEL); - if (qual == NULL) { - kfree(sock); - return -ENOMEM; - } - - for (ii = 0, jj = 0; ii < MAX_BSS_NUM; ii++) { - if (!pBSS[ii].bActive) - continue; - if (jj >= IW_MAX_AP) - break; - memcpy(sock[jj].sa_data, pBSS[ii].abyBSSID, 6); - sock[jj].sa_family = ARPHRD_ETHER; - qual[jj].level = pBSS[ii].uRSSI; - qual[jj].qual = qual[jj].noise = 0; - qual[jj].updated = 2; - jj++; - } - - wrq->flags = 1; /* Should be defined */ - wrq->length = jj; - memcpy(extra, sock, sizeof(struct sockaddr) * jj); - memcpy(extra + sizeof(struct sockaddr) * jj, qual, - sizeof(struct iw_quality) * jj); - - kfree(sock); - kfree(qual); - - return 0; -} - -/* - * Wireless Handler: set essid - */ -int iwctl_siwessid(struct net_device *dev, struct iw_request_info *info, - union iwreq_data *wrqu, char *extra) -{ - struct vnt_private *pDevice = netdev_priv(dev); - struct iw_point *wrq = &wrqu->essid; - struct vnt_manager *pMgmt = &pDevice->vnt_mgmt; - PWLAN_IE_SSID pItemSSID; - - if (pMgmt == NULL) - return -EFAULT; - - if (!(pDevice->flags & DEVICE_FLAGS_OPENED)) - return -EINVAL; - - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWESSID :\n"); - - pDevice->fWPA_Authened = false; - // Check if we asked for `any' - if (wrq->flags == 0) { - // Just send an empty SSID list - memset(pMgmt->abyDesireSSID, 0, WLAN_IEHDR_LEN + WLAN_SSID_MAXLEN + 1); - memset(pMgmt->abyDesireBSSID, 0xFF, 6); - PRINT_K("set essid to 'any'\n"); - // Unknown desired AP, so here need not associate?? - return 0; - } else { - // Set the SSID - memset(pMgmt->abyDesireSSID, 0, WLAN_IEHDR_LEN + WLAN_SSID_MAXLEN + 1); - pItemSSID = (PWLAN_IE_SSID)pMgmt->abyDesireSSID; - pItemSSID->byElementID = WLAN_EID_SSID; - - memcpy(pItemSSID->abySSID, extra, wrq->length); - if (pItemSSID->abySSID[wrq->length] == '\0') { - if (wrq->length > 0) - pItemSSID->len = wrq->length; - } else { - pItemSSID->len = wrq->length; - } - PRINT_K("set essid to %s\n", pItemSSID->abySSID); - - // mike: need clear desiredBSSID - if (pItemSSID->len == 0) { - memset(pMgmt->abyDesireBSSID, 0xFF, 6); - return 0; - } - - // Wext wil order another command of siwap to link - // with desired AP, so here need not associate?? - if (pDevice->bWPASuppWextEnabled == true) { - /*******search if in hidden ssid mode ****/ - PKnownBSS pCurr = NULL; - u8 abyTmpDesireSSID[WLAN_IEHDR_LEN + WLAN_SSID_MAXLEN + 1]; - unsigned ii; - unsigned uSameBssidNum = 0; - - memcpy(abyTmpDesireSSID, pMgmt->abyDesireSSID, sizeof(abyTmpDesireSSID)); - pCurr = BSSpSearchBSSList(pDevice, NULL, - abyTmpDesireSSID, - pDevice->eConfigPHYMode); - - if (pCurr == NULL) { - PRINT_K("SIOCSIWESSID:hidden ssid site survey before associate.......\n"); - vResetCommandTimer((void *)pDevice); - pMgmt->eScanType = WMAC_SCAN_ACTIVE; - bScheduleCommand((void *)pDevice, - WLAN_CMD_BSSID_SCAN, - pMgmt->abyDesireSSID); - bScheduleCommand((void *)pDevice, - WLAN_CMD_SSID, - pMgmt->abyDesireSSID); - } else { // mike: to find out if that desired SSID is a - // hidden-ssid AP, by means of judging if there - // are two same BSSID exist in list ? - for (ii = 0; ii < MAX_BSS_NUM; ii++) { - if (pMgmt->sBSSList[ii].bActive && - ether_addr_equal(pMgmt->sBSSList[ii].abyBSSID, - pCurr->abyBSSID)) { - uSameBssidNum++; - } - } - if (uSameBssidNum >= 2) { // hit: desired AP is in hidden ssid mode!!! - PRINT_K("SIOCSIWESSID:hidden ssid directly associate.......\n"); - vResetCommandTimer((void *)pDevice); - pMgmt->eScanType = WMAC_SCAN_PASSIVE; // this scan type, you'll submit scan result! - bScheduleCommand((void *)pDevice, - WLAN_CMD_BSSID_SCAN, - pMgmt->abyDesireSSID); - bScheduleCommand((void *)pDevice, - WLAN_CMD_SSID, - pMgmt->abyDesireSSID); - } - } - return 0; - } - - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "set essid = %s\n", pItemSSID->abySSID); - } - - if (pDevice->flags & DEVICE_FLAGS_OPENED) - pDevice->bCommit = true; - - return 0; -} - -/* - * Wireless Handler: get essid - */ -int iwctl_giwessid(struct net_device *dev, struct iw_request_info *info, - union iwreq_data *wrqu, char *extra) -{ - struct vnt_private *pDevice = netdev_priv(dev); - struct iw_point *wrq = &wrqu->essid; - struct vnt_manager *pMgmt = &pDevice->vnt_mgmt; - PWLAN_IE_SSID pItemSSID; - - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCGIWESSID\n"); - - if (pMgmt == NULL) - return -EFAULT; - - // Note: if wrq->u.data.flags != 0, we should get the relevant - // SSID from the SSID list... - - // Get the current SSID - pItemSSID = (PWLAN_IE_SSID)pMgmt->abyCurrSSID; - memcpy(extra, pItemSSID->abySSID, pItemSSID->len); - extra[pItemSSID->len] = '\0'; - - wrq->length = pItemSSID->len; - wrq->flags = 1; // active - - return 0; -} - -/* - * Wireless Handler: set data rate - */ -int iwctl_siwrate(struct net_device *dev, struct iw_request_info *info, - union iwreq_data *wrqu, char *extra) -{ - struct vnt_private *pDevice = netdev_priv(dev); - struct iw_param *wrq = &wrqu->bitrate; - int rc = 0; - u8 brate = 0; - int i; - u8 abySupportedRates[13] = { - 0x02, 0x04, 0x0B, 0x16, 0x0c, 0x12, 0x18, 0x24, 0x30, 0x48, - 0x60, 0x6C, 0x90 - }; - - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWRATE\n"); - if (!(pDevice->flags & DEVICE_FLAGS_OPENED)) { - rc = -EINVAL; - return rc; - } - - // First: get a valid bit rate value - - // Which type of value - if ((wrq->value < 13) && (wrq->value >= 0)) { - // Setting by rate index - // Find value in the magic rate table - brate = wrq->value; - } else { - // Setting by frequency value - u8 normvalue = (u8)(wrq->value/500000); - - // Check if rate is valid - for (i = 0; i < 13; i++) { - if (normvalue == abySupportedRates[i]) { - brate = i; - break; - } - } - } - // -1 designed the max rate (mostly auto mode) - if (wrq->value == -1) { - // Get the highest available rate - for (i = 0; i < 13; i++) { - if (abySupportedRates[i] == 0) - break; - } - if (i != 0) - brate = i - 1; - - } - // Check that it is valid - // brate is index of abySupportedRates[] - if (brate > 13) { - rc = -EINVAL; - return rc; - } - - // Now, check if we want a fixed or auto value - if (wrq->fixed != 0) { - // Fixed mode - // One rate, fixed - pDevice->bFixRate = true; - if ((pDevice->byBBType == BB_TYPE_11B) && (brate > 3)) { - pDevice->uConnectionRate = 3; - } else { - pDevice->uConnectionRate = brate; - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Fixed to Rate %d\n", pDevice->uConnectionRate); - } - } else { - pDevice->bFixRate = false; - pDevice->uConnectionRate = 13; - } - - return rc; -} - -/* - * Wireless Handler: get data rate - */ -int iwctl_giwrate(struct net_device *dev, struct iw_request_info *info, - union iwreq_data *wrqu, char *extra) -{ - struct vnt_private *pDevice = netdev_priv(dev); - struct iw_param *wrq = &wrqu->bitrate; - struct vnt_manager *pMgmt = &pDevice->vnt_mgmt; - - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCGIWRATE\n"); - - if (pMgmt == NULL) - return -EFAULT; - - { - u8 abySupportedRates[13] = { - 0x02, 0x04, 0x0B, 0x16, 0x0c, 0x12, 0x18, 0x24, 0x30, - 0x48, 0x60, 0x6C, 0x90 - }; - int brate = 0; - - if (pDevice->uConnectionRate < 13) { - brate = abySupportedRates[pDevice->uConnectionRate]; - } else { - if (pDevice->byBBType == BB_TYPE_11B) - brate = 0x16; - if (pDevice->byBBType == BB_TYPE_11G) - brate = 0x6C; - if (pDevice->byBBType == BB_TYPE_11A) - brate = 0x6C; - } - if (pMgmt->eCurrMode == WMAC_MODE_ESS_AP) { - if (pDevice->byBBType == BB_TYPE_11B) - brate = 0x16; - if (pDevice->byBBType == BB_TYPE_11G) - brate = 0x6C; - if (pDevice->byBBType == BB_TYPE_11A) - brate = 0x6C; - } - if (pDevice->uConnectionRate == 13) - brate = abySupportedRates[pDevice->wCurrentRate]; - wrq->value = brate * 500000; - // If more than one rate, set auto - if (pDevice->bFixRate == true) - wrq->fixed = true; - } - - return 0; -} - -/* - * Wireless Handler: set rts threshold - */ -int iwctl_siwrts(struct net_device *dev, struct iw_request_info *info, - union iwreq_data *wrqu, char *extra) -{ - struct vnt_private *pDevice = netdev_priv(dev); - struct iw_param *wrq = &wrqu->rts; - - if ((wrq->value < 0 || wrq->value > 2312) && !wrq->disabled) - return -EINVAL; - - else if (wrq->disabled) - pDevice->wRTSThreshold = 2312; - else - pDevice->wRTSThreshold = wrq->value; - - return 0; -} - -/* - * Wireless Handler: get rts - */ -int iwctl_giwrts(struct net_device *dev, struct iw_request_info *info, - union iwreq_data *wrqu, char *extra) -{ - struct vnt_private *pDevice = netdev_priv(dev); - struct iw_param *wrq = &wrqu->rts; - - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCGIWRTS\n"); - wrq->value = pDevice->wRTSThreshold; - wrq->disabled = (wrq->value >= 2312); - wrq->fixed = 1; - return 0; -} - -/* - * Wireless Handler: set fragment threshold - */ -int iwctl_siwfrag(struct net_device *dev, struct iw_request_info *info, - union iwreq_data *wrqu, char *extra) -{ - struct vnt_private *pDevice = netdev_priv(dev); - struct iw_param *wrq = &wrqu->frag; - int rc = 0; - int fthr = wrq->value; - - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWFRAG\n"); - - if (wrq->disabled) - fthr = 2312; - if ((fthr < 256) || (fthr > 2312)) { - rc = -EINVAL; - } else { - fthr &= ~0x1; // Get an even value - pDevice->wFragmentationThreshold = (u16)fthr; - } - return rc; -} - -/* - * Wireless Handler: get fragment threshold - */ -int iwctl_giwfrag(struct net_device *dev, struct iw_request_info *info, - union iwreq_data *wrqu, char *extra) -{ - struct vnt_private *pDevice = netdev_priv(dev); - struct iw_param *wrq = &wrqu->frag; - - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCGIWFRAG\n"); - wrq->value = pDevice->wFragmentationThreshold; - wrq->disabled = (wrq->value >= 2312); - wrq->fixed = 1; - return 0; -} - -/* - * Wireless Handler: set retry threshold - */ -int iwctl_siwretry(struct net_device *dev, struct iw_request_info *info, - union iwreq_data *wrqu, char *extra) -{ - struct vnt_private *pDevice = netdev_priv(dev); - struct iw_param *wrq = &wrqu->retry; - int rc = 0; - - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWRETRY\n"); - - if (wrq->disabled) { - rc = -EINVAL; - return rc; - } - - if (wrq->flags & IW_RETRY_LIMIT) { - if (wrq->flags & IW_RETRY_MAX) { - pDevice->byLongRetryLimit = wrq->value; - } else if (wrq->flags & IW_RETRY_MIN) { - pDevice->byShortRetryLimit = wrq->value; - } else { - // No modifier : set both - pDevice->byShortRetryLimit = wrq->value; - pDevice->byLongRetryLimit = wrq->value; - } - } - if (wrq->flags & IW_RETRY_LIFETIME) - pDevice->wMaxTransmitMSDULifetime = wrq->value; - return rc; -} - -/* - * Wireless Handler: get retry threshold - */ -int iwctl_giwretry(struct net_device *dev, struct iw_request_info *info, - union iwreq_data *wrqu, char *extra) -{ - struct vnt_private *pDevice = netdev_priv(dev); - struct iw_param *wrq = &wrqu->retry; - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCGIWRETRY\n"); - wrq->disabled = 0; // Can't be disabled - - // Note: by default, display the min retry number - if ((wrq->flags & IW_RETRY_TYPE) == IW_RETRY_LIFETIME) { - wrq->flags = IW_RETRY_LIFETIME; - wrq->value = (int)pDevice->wMaxTransmitMSDULifetime; // ms - } else if ((wrq->flags & IW_RETRY_MAX)) { - wrq->flags = IW_RETRY_LIMIT | IW_RETRY_MAX; - wrq->value = (int)pDevice->byLongRetryLimit; - } else { - wrq->flags = IW_RETRY_LIMIT; - wrq->value = (int)pDevice->byShortRetryLimit; - if ((int)pDevice->byShortRetryLimit != (int)pDevice->byLongRetryLimit) - wrq->flags |= IW_RETRY_MIN; - } - return 0; -} - -/* - * Wireless Handler: set encode mode - */ -int iwctl_siwencode(struct net_device *dev, struct iw_request_info *info, - union iwreq_data *wrqu, char *extra) -{ - struct vnt_private *pDevice = netdev_priv(dev); - struct vnt_manager *pMgmt = &pDevice->vnt_mgmt; - struct iw_point *wrq = &wrqu->encoding; - u32 dwKeyIndex = (u32)(wrq->flags & IW_ENCODE_INDEX); - int ii; - u8 uu; - int rc = 0; - int index = (wrq->flags & IW_ENCODE_INDEX); - - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWENCODE\n"); - - if (pMgmt == NULL) - return -EFAULT; - - // Check the size of the key - if (wrq->length > WLAN_WEP232_KEYLEN) { - rc = -EINVAL; - return rc; - } - - if (dwKeyIndex > WLAN_WEP_NKEYS) { - rc = -EINVAL; - return rc; - } - - if (dwKeyIndex > 0) - dwKeyIndex--; - - // Send the key to the card - if (wrq->length > 0) { - if (wrq->length == WLAN_WEP232_KEYLEN) { - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Set 232 bit wep key\n"); - } else if (wrq->length == WLAN_WEP104_KEYLEN) { - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Set 104 bit wep key\n"); - } else if (wrq->length == WLAN_WEP40_KEYLEN) { - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Set 40 bit wep key, index= %d\n", (int)dwKeyIndex); - } - memset(pDevice->abyKey, 0, WLAN_WEP232_KEYLEN); - memcpy(pDevice->abyKey, extra, wrq->length); - - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"abyKey: "); - for (ii = 0; ii < wrq->length; ii++) - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "%02x ", pDevice->abyKey[ii]); - - if (pDevice->flags & DEVICE_FLAGS_OPENED) { - KeybSetDefaultKey(pDevice, - &(pDevice->sKey), - dwKeyIndex | (1 << 31), - wrq->length, NULL, - pDevice->abyKey, - KEY_CTL_WEP); - } - pDevice->byKeyIndex = (u8)dwKeyIndex; - pDevice->uKeyLength = wrq->length; - pDevice->bTransmitKey = true; - pDevice->bEncryptionEnable = true; - pDevice->eEncryptionStatus = Ndis802_11Encryption1Enabled; - - // Do we want to just set the transmit key index? - if (index < 4) { - pDevice->byKeyIndex = index; - } else if (!(wrq->flags & IW_ENCODE_MODE)) { - rc = -EINVAL; - return rc; - } - } - // Read the flags - if (wrq->flags & IW_ENCODE_DISABLED) { - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Disable WEP function\n"); - pMgmt->bShareKeyAlgorithm = false; - pDevice->bEncryptionEnable = false; - pDevice->eEncryptionStatus = Ndis802_11EncryptionDisabled; - if (pDevice->flags & DEVICE_FLAGS_OPENED) { - for (uu = 0; uu < MAX_KEY_TABLE; uu++) - MACvDisableKeyEntry(pDevice, uu); - } - } - if (wrq->flags & IW_ENCODE_RESTRICTED) { - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Enable WEP & ShareKey System\n"); - pMgmt->bShareKeyAlgorithm = true; - } - if (wrq->flags & IW_ENCODE_OPEN) { - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Enable WEP & Open System\n"); - pMgmt->bShareKeyAlgorithm = false; - } - - memset(pMgmt->abyDesireBSSID, 0xFF, 6); - - return rc; -} - -int iwctl_giwencode(struct net_device *dev, struct iw_request_info *info, - union iwreq_data *wrqu, char *extra) -{ - struct vnt_private *pDevice = netdev_priv(dev); - struct vnt_manager *pMgmt = &pDevice->vnt_mgmt; - struct iw_point *wrq = &wrqu->encoding; - char abyKey[WLAN_WEP232_KEYLEN]; - - unsigned index = (unsigned)(wrq->flags & IW_ENCODE_INDEX); - PSKeyItem pKey = NULL; - - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCGIWENCODE\n"); - - if (pMgmt == NULL) - return -EFAULT; - - if (index > WLAN_WEP_NKEYS) - return -EINVAL; - if (index < 1) { // get default key - if (pDevice->byKeyIndex < WLAN_WEP_NKEYS) - index = pDevice->byKeyIndex; - else - index = 0; - } else { - index--; - } - - memset(abyKey, 0, WLAN_WEP232_KEYLEN); - // Check encryption mode - wrq->flags = IW_ENCODE_NOKEY; - // Is WEP enabled ??? - if (pDevice->bEncryptionEnable) - wrq->flags |= IW_ENCODE_ENABLED; - else - wrq->flags |= IW_ENCODE_DISABLED; - - if (pMgmt->bShareKeyAlgorithm) - wrq->flags |= IW_ENCODE_RESTRICTED; - else - wrq->flags |= IW_ENCODE_OPEN; - wrq->length = 0; - - if ((index == 0) && (pDevice->eEncryptionStatus == Ndis802_11Encryption2Enabled || - pDevice->eEncryptionStatus == Ndis802_11Encryption3Enabled)) { // get wpa pairwise key - if (KeybGetKey(&(pDevice->sKey), pMgmt->abyCurrBSSID, 0xffffffff, &pKey)) { - wrq->length = pKey->uKeyLength; - memcpy(abyKey, pKey->abyKey, pKey->uKeyLength); - memcpy(extra, abyKey, WLAN_WEP232_KEYLEN); - } - } else if (KeybGetKey(&(pDevice->sKey), pDevice->abyBroadcastAddr, (u8)index, &pKey)) { - wrq->length = pKey->uKeyLength; - memcpy(abyKey, pKey->abyKey, pKey->uKeyLength); - memcpy(extra, abyKey, WLAN_WEP232_KEYLEN); - } - - wrq->flags |= index + 1; - return 0; -} - -/* - * Wireless Handler: set power mode - */ -int iwctl_siwpower(struct net_device *dev, struct iw_request_info *info, - union iwreq_data *wrqu, char *extra) -{ - struct vnt_private *pDevice = netdev_priv(dev); - struct vnt_manager *pMgmt = &pDevice->vnt_mgmt; - struct iw_param *wrq = &wrqu->power; - int rc = 0; - - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWPOWER\n"); - - if (pMgmt == NULL) - return -EFAULT; - - if (!(pDevice->flags & DEVICE_FLAGS_OPENED)) { - rc = -EINVAL; - return rc; - } - - if (wrq->disabled) { - pDevice->ePSMode = WMAC_POWER_CAM; - PSvDisablePowerSaving(pDevice); - return rc; - } - if ((wrq->flags & IW_POWER_TYPE) == IW_POWER_TIMEOUT) { - pDevice->ePSMode = WMAC_POWER_FAST; - PSvEnablePowerSaving((void *)pDevice, pMgmt->wListenInterval); - - } else if ((wrq->flags & IW_POWER_TYPE) == IW_POWER_PERIOD) { - pDevice->ePSMode = WMAC_POWER_FAST; - PSvEnablePowerSaving((void *)pDevice, pMgmt->wListenInterval); - } - - switch (wrq->flags & IW_POWER_MODE) { - case IW_POWER_UNICAST_R: - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWPOWER: IW_POWER_UNICAST_R\n"); - rc = -EINVAL; - break; - case IW_POWER_ALL_R: - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWPOWER: IW_POWER_ALL_R\n"); - rc = -EINVAL; - case IW_POWER_ON: - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWPOWER: IW_POWER_ON\n"); - break; - default: - rc = -EINVAL; - } - - return rc; -} - -/* - * Wireless Handler: get power mode - */ -int iwctl_giwpower(struct net_device *dev, struct iw_request_info *info, - union iwreq_data *wrqu, char *extra) -{ - struct vnt_private *pDevice = netdev_priv(dev); - struct vnt_manager *pMgmt = &pDevice->vnt_mgmt; - struct iw_param *wrq = &wrqu->power; - int mode = pDevice->ePSMode; - - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCGIWPOWER\n"); - - if (pMgmt == NULL) - return -EFAULT; - - wrq->disabled = (mode == WMAC_POWER_CAM); - if (wrq->disabled) - return 0; - - if ((wrq->flags & IW_POWER_TYPE) == IW_POWER_TIMEOUT) { - wrq->value = (int)((pMgmt->wListenInterval * - pMgmt->wCurrBeaconPeriod) / 100); - wrq->flags = IW_POWER_TIMEOUT; - } else { - wrq->value = (int)((pMgmt->wListenInterval * - pMgmt->wCurrBeaconPeriod) / 100); - wrq->flags = IW_POWER_PERIOD; - } - - wrq->flags |= IW_POWER_ALL_R; - return 0; -} - -/* - * Wireless Handler: get Sensitivity - */ -int iwctl_giwsens(struct net_device *dev, struct iw_request_info *info, - union iwreq_data *wrqu, char *extra) -{ - struct vnt_private *pDevice = netdev_priv(dev); - struct iw_param *wrq = &wrqu->sens; - long ldBm; - - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCGIWSENS\n"); - if (pDevice->bLinkPass == true) { - vnt_rf_rssi_to_dbm(pDevice, (u8)(pDevice->uCurrRSSI), &ldBm); - wrq->value = ldBm; - } else { - wrq->value = 0; - } - wrq->disabled = (wrq->value == 0); - wrq->fixed = 1; - return 0; -} - -int iwctl_siwauth(struct net_device *dev, struct iw_request_info *info, - union iwreq_data *wrqu, char *extra) -{ - struct vnt_private *pDevice = netdev_priv(dev); - struct vnt_manager *pMgmt = &pDevice->vnt_mgmt; - struct iw_param *wrq = &wrqu->param; - int ret = 0; - static int wpa_version = 0; // must be static to save the last value, einsn liu - static int pairwise = 0; - - if (pMgmt == NULL) - return -EFAULT; - - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWAUTH\n"); - switch (wrq->flags & IW_AUTH_INDEX) { - case IW_AUTH_WPA_VERSION: - wpa_version = wrq->value; - if (wrq->value == IW_AUTH_WPA_VERSION_DISABLED) { - PRINT_K("iwctl_siwauth:set WPADEV to disable at 1??????\n"); - } else if (wrq->value == IW_AUTH_WPA_VERSION_WPA) { - PRINT_K("iwctl_siwauth:set WPADEV to WPA1******\n"); - } else { - PRINT_K("iwctl_siwauth:set WPADEV to WPA2******\n"); - } - break; - case IW_AUTH_CIPHER_PAIRWISE: - pairwise = wrq->value; - PRINT_K("iwctl_siwauth:set pairwise=%d\n", pairwise); - if (pairwise == IW_AUTH_CIPHER_CCMP) { - pDevice->eEncryptionStatus = Ndis802_11Encryption3Enabled; - } else if (pairwise == IW_AUTH_CIPHER_TKIP) { - pDevice->eEncryptionStatus = Ndis802_11Encryption2Enabled; - } else if (pairwise == IW_AUTH_CIPHER_WEP40 || - pairwise == IW_AUTH_CIPHER_WEP104) { - pDevice->eEncryptionStatus = Ndis802_11Encryption1Enabled; - } else if (pairwise == IW_AUTH_CIPHER_NONE) { - // do nothing, einsn liu - } else { - pDevice->eEncryptionStatus = Ndis802_11EncryptionDisabled; - } - break; - case IW_AUTH_CIPHER_GROUP: - PRINT_K("iwctl_siwauth:set GROUP=%d\n", wrq->value); - if (wpa_version == IW_AUTH_WPA_VERSION_DISABLED) - break; - if (pairwise == IW_AUTH_CIPHER_NONE) { - if (wrq->value == IW_AUTH_CIPHER_CCMP) - pDevice->eEncryptionStatus = Ndis802_11Encryption3Enabled; - else - pDevice->eEncryptionStatus = Ndis802_11Encryption2Enabled; - } - break; - case IW_AUTH_KEY_MGMT: - PRINT_K("iwctl_siwauth(wpa_version=%d):set KEY_MGMT=%d\n", wpa_version, wrq->value); - if (wpa_version == IW_AUTH_WPA_VERSION_WPA2) { - if (wrq->value == IW_AUTH_KEY_MGMT_PSK) - pMgmt->eAuthenMode = WMAC_AUTH_WPA2PSK; - else pMgmt->eAuthenMode = WMAC_AUTH_WPA2; - } else if (wpa_version == IW_AUTH_WPA_VERSION_WPA) { - if (wrq->value == 0) { - pMgmt->eAuthenMode = WMAC_AUTH_WPANONE; - } else if (wrq->value == IW_AUTH_KEY_MGMT_PSK) - pMgmt->eAuthenMode = WMAC_AUTH_WPAPSK; - } else { - pMgmt->eAuthenMode = WMAC_AUTH_WPA; - } - break; - case IW_AUTH_TKIP_COUNTERMEASURES: - break; /* FIXME */ - case IW_AUTH_DROP_UNENCRYPTED: - break; - case IW_AUTH_80211_AUTH_ALG: - PRINT_K("iwctl_siwauth:set AUTH_ALG=%d\n", wrq->value); - if (wrq->value == IW_AUTH_ALG_OPEN_SYSTEM) - pMgmt->bShareKeyAlgorithm = false; - else if (wrq->value == IW_AUTH_ALG_SHARED_KEY) - pMgmt->bShareKeyAlgorithm = true; - break; - case IW_AUTH_WPA_ENABLED: - break; - case IW_AUTH_RX_UNENCRYPTED_EAPOL: - break; - case IW_AUTH_ROAMING_CONTROL: - ret = -EOPNOTSUPP; - break; - case IW_AUTH_PRIVACY_INVOKED: - pDevice->bEncryptionEnable = !!wrq->value; - if (pDevice->bEncryptionEnable == false) { - wpa_version = 0; - pairwise = 0; - pDevice->eEncryptionStatus = Ndis802_11EncryptionDisabled; - pMgmt->bShareKeyAlgorithm = false; - pMgmt->eAuthenMode = WMAC_AUTH_OPEN; - PRINT_K("iwctl_siwauth:set WPADEV to disaable at 2?????\n"); - } - break; - default: - PRINT_K("iwctl_siwauth: not supported %x\n", wrq->flags); - ret = -EOPNOTSUPP; - break; - } - return ret; -} - -int iwctl_giwauth(struct net_device *dev, struct iw_request_info *info, - union iwreq_data *wrqu, char *extra) -{ - return -EOPNOTSUPP; -} - -int iwctl_siwgenie(struct net_device *dev, struct iw_request_info *info, - union iwreq_data *wrqu, char *extra) -{ - struct vnt_private *pDevice = netdev_priv(dev); - struct vnt_manager *pMgmt = &pDevice->vnt_mgmt; - struct iw_point *wrq = &wrqu->data; - int ret = 0; - - if (pMgmt == NULL) - return -EFAULT; - - if (wrq->length) { - if ((wrq->length < 2) || (extra[1] + 2 != wrq->length)) { - ret = -EINVAL; - goto out; - } - if (wrq->length > MAX_WPA_IE_LEN) { - ret = -ENOMEM; - goto out; - } - memset(pMgmt->abyWPAIE, 0, MAX_WPA_IE_LEN); - - memcpy(pMgmt->abyWPAIE, extra, wrq->length); - pMgmt->wWPAIELen = wrq->length; - } else { - memset(pMgmt->abyWPAIE, 0, MAX_WPA_IE_LEN); - pMgmt->wWPAIELen = 0; - } - -out: // not completely ...not necessary in wpa_supplicant 0.5.8 - return ret; -} - -int iwctl_giwgenie(struct net_device *dev, struct iw_request_info *info, - union iwreq_data *wrqu, char *extra) -{ - struct vnt_private *pDevice = netdev_priv(dev); - struct vnt_manager *pMgmt = &pDevice->vnt_mgmt; - struct iw_point *wrq = &wrqu->data; - int ret = 0; - int space = wrq->length; - - if (pMgmt == NULL) - return -EFAULT; - - wrq->length = 0; - if (pMgmt->wWPAIELen > 0) { - wrq->length = pMgmt->wWPAIELen; - - if (pMgmt->wWPAIELen <= space) - memcpy(extra, pMgmt->abyWPAIE, pMgmt->wWPAIELen); - else - ret = -E2BIG; - } - return ret; -} - -int iwctl_siwencodeext(struct net_device *dev, struct iw_request_info *info, - union iwreq_data *wrqu, char *extra) -{ - struct vnt_private *pDevice = netdev_priv(dev); - struct vnt_manager *pMgmt = &pDevice->vnt_mgmt; - struct iw_point *wrq = &wrqu->encoding; - struct iw_encode_ext *ext = (struct iw_encode_ext*)extra; - struct viawget_wpa_param *param = NULL; -// original member - wpa_alg alg_name; - u8 addr[6]; - int key_idx; - int set_tx = 0; - u8 seq[IW_ENCODE_SEQ_MAX_SIZE]; - u8 key[64]; - size_t seq_len = 0; - size_t key_len = 0; - u8 *buf; - u8 key_array[64]; - int ret = 0; - - PRINT_K("SIOCSIWENCODEEXT......\n"); - - if (pMgmt == NULL) - return -EFAULT; - - if (!(pDevice->flags & DEVICE_FLAGS_OPENED)) - return -ENODEV; - - buf = kzalloc(sizeof(struct viawget_wpa_param), GFP_KERNEL); - if (buf == NULL) - return -ENOMEM; - - param = (struct viawget_wpa_param *)buf; - -// recover alg_name - switch (ext->alg) { - case IW_ENCODE_ALG_NONE: - alg_name = WPA_ALG_NONE; - break; - case IW_ENCODE_ALG_WEP: - alg_name = WPA_ALG_WEP; - break; - case IW_ENCODE_ALG_TKIP: - alg_name = WPA_ALG_TKIP; - break; - case IW_ENCODE_ALG_CCMP: - alg_name = WPA_ALG_CCMP; - break; - default: - PRINT_K("Unknown alg = %d\n", ext->alg); - ret = -ENOMEM; - goto error; - } -// recover addr - memcpy(addr, ext->addr.sa_data, ETH_ALEN); -// recover key_idx - key_idx = (wrq->flags&IW_ENCODE_INDEX) - 1; -// recover set_tx - if (ext->ext_flags & IW_ENCODE_EXT_SET_TX_KEY) - set_tx = 1; -// recover seq,seq_len - if (ext->ext_flags & IW_ENCODE_EXT_RX_SEQ_VALID) { - seq_len = IW_ENCODE_SEQ_MAX_SIZE; - memcpy(seq, ext->rx_seq, seq_len); - } -// recover key,key_len - if (ext->key_len) { - key_len = ext->key_len; - memcpy(key, &ext->key[0], key_len); - } - memset(key_array, 0, 64); - if (key_len > 0) { - memcpy(key_array, key, key_len); - if (key_len == 32) { - // notice ! the oder - memcpy(&key_array[16], &key[24], 8); - memcpy(&key_array[24], &key[16], 8); - } - } - -/**************Translate iw_encode_ext to viawget_wpa_param****************/ - memcpy(param->addr, addr, ETH_ALEN); - param->u.wpa_key.alg_name = (int)alg_name; - param->u.wpa_key.set_tx = set_tx; - param->u.wpa_key.key_index = key_idx; - param->u.wpa_key.key_len = key_len; - param->u.wpa_key.key = (u8 *)key_array; - param->u.wpa_key.seq = (u8 *)seq; - param->u.wpa_key.seq_len = seq_len; - -/****set if current action is Network Manager count?? */ -/****this method is so foolish,but there is no other way??? */ - if (param->u.wpa_key.alg_name == WPA_ALG_NONE) { - if (param->u.wpa_key.key_index == 0) { - pDevice->bwextstep0 = true; - } - if ((pDevice->bwextstep0 == true) && (param->u.wpa_key.key_index == 1)) { - pDevice->bwextstep0 = false; - pDevice->bwextstep1 = true; - } - if ((pDevice->bwextstep1 == true) && (param->u.wpa_key.key_index == 2)) { - pDevice->bwextstep1 = false; - pDevice->bwextstep2 = true; - } - if ((pDevice->bwextstep2 == true) && (param->u.wpa_key.key_index == 3)) { - pDevice->bwextstep2 = false; - pDevice->bwextstep3 = true; - } - } - if (pDevice->bwextstep3 == true) { - PRINT_K("SIOCSIWENCODEEXT:Enable WPA WEXT SUPPORT!!!!!\n"); - pDevice->bwextstep0 = false; - pDevice->bwextstep1 = false; - pDevice->bwextstep2 = false; - pDevice->bwextstep3 = false; - pDevice->bWPASuppWextEnabled = true; - memset(pMgmt->abyDesireBSSID, 0xFF, 6); - KeyvInitTable(pDevice, &pDevice->sKey); - } -/*******/ - ret = wpa_set_keys(pDevice, param); - -error: - kfree(buf); - return ret; -} - -int iwctl_giwencodeext(struct net_device *dev, struct iw_request_info *info, - union iwreq_data *wrqu, char *extra) -{ - return -EOPNOTSUPP; -} - -int iwctl_siwmlme(struct net_device *dev, struct iw_request_info *info, - union iwreq_data *wrqu, char *extra) -{ - struct vnt_private *pDevice = netdev_priv(dev); - struct vnt_manager *pMgmt = &pDevice->vnt_mgmt; - struct iw_mlme *mlme = (struct iw_mlme *)extra; - int ret = 0; - - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " SIOCSIWMLME\n"); - - if (pMgmt == NULL) - return -EFAULT; - - if (memcmp(pMgmt->abyCurrBSSID, mlme->addr.sa_data, ETH_ALEN)) { - ret = -EINVAL; - return ret; - } - switch (mlme->cmd) { - case IW_MLME_DEAUTH: - case IW_MLME_DISASSOC: - if (pDevice->bLinkPass == true) { - PRINT_K("iwctl_siwmlme--->send DISASSOCIATE\n"); - bScheduleCommand((void *)pDevice, WLAN_CMD_DISASSOCIATE, - NULL); - } - break; - default: - ret = -EOPNOTSUPP; - } - return ret; -} - -static int iwctl_config_commit(struct net_device *dev, - struct iw_request_info *info, union iwreq_data *wrqu, char *extra) -{ - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "SIOCSIWCOMMIT\n"); - - return 0; -} - -static const iw_handler iwctl_handler[] = { - IW_HANDLER(SIOCSIWCOMMIT, iwctl_config_commit), - IW_HANDLER(SIOCGIWNAME, iwctl_giwname), - IW_HANDLER(SIOCSIWFREQ, iwctl_siwfreq), - IW_HANDLER(SIOCGIWFREQ, iwctl_giwfreq), - IW_HANDLER(SIOCSIWMODE, iwctl_siwmode), - IW_HANDLER(SIOCGIWMODE, iwctl_giwmode), - IW_HANDLER(SIOCGIWSENS, iwctl_giwsens), - IW_HANDLER(SIOCGIWRANGE, iwctl_giwrange), - IW_HANDLER(SIOCSIWAP, iwctl_siwap), - IW_HANDLER(SIOCGIWAP, iwctl_giwap), - IW_HANDLER(SIOCSIWMLME, iwctl_siwmlme), - IW_HANDLER(SIOCGIWAPLIST, iwctl_giwaplist), - IW_HANDLER(SIOCSIWSCAN, iwctl_siwscan), - IW_HANDLER(SIOCGIWSCAN, iwctl_giwscan), - IW_HANDLER(SIOCSIWESSID, iwctl_siwessid), - IW_HANDLER(SIOCGIWESSID, iwctl_giwessid), - IW_HANDLER(SIOCSIWRATE, iwctl_siwrate), - IW_HANDLER(SIOCGIWRATE, iwctl_giwrate), - IW_HANDLER(SIOCSIWRTS, iwctl_siwrts), - IW_HANDLER(SIOCGIWRTS, iwctl_giwrts), - IW_HANDLER(SIOCSIWFRAG, iwctl_siwfrag), - IW_HANDLER(SIOCGIWFRAG, iwctl_giwfrag), - IW_HANDLER(SIOCSIWRETRY, iwctl_siwretry), - IW_HANDLER(SIOCGIWRETRY, iwctl_giwretry), - IW_HANDLER(SIOCSIWENCODE, iwctl_siwencode), - IW_HANDLER(SIOCGIWENCODE, iwctl_giwencode), - IW_HANDLER(SIOCSIWPOWER, iwctl_siwpower), - IW_HANDLER(SIOCGIWPOWER, iwctl_giwpower), - IW_HANDLER(SIOCSIWGENIE, iwctl_siwgenie), - IW_HANDLER(SIOCGIWGENIE, iwctl_giwgenie), - IW_HANDLER(SIOCSIWAUTH, iwctl_siwauth), - IW_HANDLER(SIOCGIWAUTH, iwctl_giwauth), - IW_HANDLER(SIOCSIWENCODEEXT, iwctl_siwencodeext), - IW_HANDLER(SIOCGIWENCODEEXT, iwctl_giwencodeext) -}; - -static const iw_handler iwctl_private_handler[] = { - NULL, // SIOCIWFIRSTPRIV -}; - -const struct iw_handler_def iwctl_handler_def = { - .get_wireless_stats = &iwctl_get_wireless_stats, - .num_standard = ARRAY_SIZE(iwctl_handler), - .num_private = 0, - .num_private_args = 0, - .standard = iwctl_handler, - .private = NULL, - .private_args = NULL, -}; diff --git a/drivers/staging/vt6656/iwctl.h b/drivers/staging/vt6656/iwctl.h deleted file mode 100644 index dceda0dbdfe1..000000000000 --- a/drivers/staging/vt6656/iwctl.h +++ /dev/null @@ -1,138 +0,0 @@ -/* - * Copyright (c) 1996, 2003 VIA Networking Technologies, Inc. - * All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - * - * File: iwctl.h - * - * Purpose: - * - * Author: Lyndon Chen - * - * Date: May 21, 2004 - * - */ - -#ifndef __IWCTL_H__ -#define __IWCTL_H__ - -#include "device.h" - -struct iw_statistics *iwctl_get_wireless_stats(struct net_device *dev); - -int iwctl_siwap(struct net_device *dev, struct iw_request_info *info, - union iwreq_data *wrqu, char *extra); - -int iwctl_giwrange(struct net_device *dev, struct iw_request_info *info, - union iwreq_data *wrqu, char *extra); - -int iwctl_giwmode(struct net_device *dev, struct iw_request_info *info, - union iwreq_data *wrqu, char *extra); - -int iwctl_siwmode(struct net_device *dev, struct iw_request_info *info, - union iwreq_data *wrqu, char *extra); - -int iwctl_giwfreq(struct net_device *dev, struct iw_request_info *info, - union iwreq_data *wrqu, char *extra); - -int iwctl_siwfreq(struct net_device *dev, struct iw_request_info *info, - union iwreq_data *wrqu, char *extra); - -int iwctl_giwname(struct net_device *dev, struct iw_request_info *info, - union iwreq_data *wrqu, char *extra); - -int iwctl_giwsens(struct net_device *dev, struct iw_request_info *info, - union iwreq_data *wrqu, char *extra); - -int iwctl_giwap(struct net_device *dev, struct iw_request_info *info, - union iwreq_data *wrqu, char *extra); - -int iwctl_giwaplist(struct net_device *dev, struct iw_request_info *info, - union iwreq_data *wrqu, char *extra); - -int iwctl_siwessid(struct net_device *dev, struct iw_request_info *info, - union iwreq_data *wrqu, char *extra); - -int iwctl_giwessid(struct net_device *dev, struct iw_request_info *info, - union iwreq_data *wrqu, char *extra); - -int iwctl_siwrate(struct net_device *dev, struct iw_request_info *info, - union iwreq_data *wrqu, char *extra); - -int iwctl_giwrate(struct net_device *dev, struct iw_request_info *info, - union iwreq_data *wrqu, char *extra); - -int iwctl_siwrts(struct net_device *dev, struct iw_request_info *info, - union iwreq_data *wrqu, char *extra); - -int iwctl_giwrts(struct net_device *dev, struct iw_request_info *info, - union iwreq_data *wrqu, char *extra); - -int iwctl_siwfrag(struct net_device *dev, struct iw_request_info *info, - union iwreq_data *wrqu, char *extra); - -int iwctl_giwfrag(struct net_device *dev, struct iw_request_info *info, - union iwreq_data *wrqu, char *extra); - -int iwctl_siwretry(struct net_device *dev, struct iw_request_info *info, - union iwreq_data *wrqu, char *extra); - -int iwctl_giwretry(struct net_device *dev, struct iw_request_info *info, - union iwreq_data *wrqu, char *extra); - -int iwctl_siwencode(struct net_device *dev, struct iw_request_info *info, - union iwreq_data *wrqu, char *extra); - -int iwctl_giwencode(struct net_device *dev, struct iw_request_info *info, - union iwreq_data *wrqu, char *extra); - -int iwctl_siwpower(struct net_device *dev, struct iw_request_info *info, - union iwreq_data *wrqu, char *extra); - -int iwctl_giwpower(struct net_device *dev, struct iw_request_info *info, - union iwreq_data *wrqu, char *extra); - -int iwctl_giwscan(struct net_device *dev, struct iw_request_info *info, - union iwreq_data *wrqu, char *extra); - -int iwctl_siwscan(struct net_device *dev, struct iw_request_info *info, - union iwreq_data *wrqu, char *extra); - -int iwctl_siwauth(struct net_device *dev, struct iw_request_info *info, - union iwreq_data *wrqu, char *extra); - -int iwctl_giwauth(struct net_device *dev, struct iw_request_info *info, - union iwreq_data *wrqu, char *extra); - -int iwctl_siwgenie(struct net_device *dev, struct iw_request_info *info, - union iwreq_data *wrqu, char *extra); - -int iwctl_giwgenie(struct net_device *dev, struct iw_request_info *info, - union iwreq_data *wrqu, char *extra); - -int iwctl_siwencodeext(struct net_device *dev, struct iw_request_info *info, - union iwreq_data *wrqu, char *extra); - -int iwctl_giwencodeext(struct net_device *dev, struct iw_request_info *info, - union iwreq_data *wrqu, char *extra); - -int iwctl_siwmlme(struct net_device *dev, struct iw_request_info *info, - union iwreq_data *wrqu, char *extra); - -extern const struct iw_handler_def iwctl_handler_def; -extern const struct iw_priv_args iwctl_priv_args; - -#endif /* __IWCTL_H__ */ diff --git a/drivers/staging/vt6656/key.c b/drivers/staging/vt6656/key.c index 38ea67531d97..22f2961d2225 100644 --- a/drivers/staging/vt6656/key.c +++ b/drivers/staging/vt6656/key.c @@ -26,706 +26,157 @@ * Date: May 29, 2003 * * Functions: - * KeyvInitTable - Init Key management table - * KeybGetKey - Get Key from table - * KeybSetKey - Set Key to table - * KeybRemoveKey - Remove Key from table - * KeybGetTransmitKey - Get Transmit Key from table * * Revision History: * */ #include "mac.h" -#include "tmacro.h" #include "key.h" #include "usbpipe.h" -static int msglevel =MSG_LEVEL_INFO; -//static int msglevel =MSG_LEVEL_DEBUG; - -static void s_vCheckKeyTableValid(struct vnt_private *pDevice, - PSKeyManagement pTable) -{ - int i; - u16 wLength = 0; - u8 pbyData[MAX_KEY_TABLE]; - - for (i=0;i<MAX_KEY_TABLE;i++) { - if ((pTable->KeyTable[i].bInUse == true) && - (pTable->KeyTable[i].PairwiseKey.bKeyValid == false) && - (pTable->KeyTable[i].GroupKey[0].bKeyValid == false) && - (pTable->KeyTable[i].GroupKey[1].bKeyValid == false) && - (pTable->KeyTable[i].GroupKey[2].bKeyValid == false) && - (pTable->KeyTable[i].GroupKey[3].bKeyValid == false) - ) { - - pTable->KeyTable[i].bInUse = false; - pTable->KeyTable[i].wKeyCtl = 0; - pTable->KeyTable[i].bSoftWEP = false; - pbyData[wLength++] = (u8) i; - //MACvDisableKeyEntry(pDevice, i); - } - } - - if (wLength != 0) - vnt_control_out(pDevice, MESSAGE_TYPE_CLRKEYENTRY, - 0, 0, wLength, pbyData); - -} - -/* - * Description: Init Key management table - * - * Parameters: - * In: - * pTable - Pointer to Key table - * Out: - * none - * - * Return Value: none - * - */ -void KeyvInitTable(struct vnt_private *pDevice, PSKeyManagement pTable) +int vnt_key_init_table(struct vnt_private *priv) { - int i, jj; - u8 pbyData[MAX_KEY_TABLE+1]; - - for (i=0;i<MAX_KEY_TABLE;i++) { - pTable->KeyTable[i].bInUse = false; - pTable->KeyTable[i].PairwiseKey.bKeyValid = false; - pTable->KeyTable[i].PairwiseKey.pvKeyTable = - (void *)&pTable->KeyTable[i]; - for (jj=0; jj < MAX_GROUP_KEY; jj++) { - pTable->KeyTable[i].GroupKey[jj].bKeyValid = false; - pTable->KeyTable[i].GroupKey[jj].pvKeyTable = - (void *) &(pTable->KeyTable[i]); - } - pTable->KeyTable[i].wKeyCtl = 0; - pTable->KeyTable[i].dwGTKeyIndex = 0; - pTable->KeyTable[i].bSoftWEP = false; - pbyData[i] = (u8) i; - } - pbyData[i] = (u8) i; + int ret; + u8 i; + u8 data[MAX_KEY_TABLE]; - vnt_control_out(pDevice, MESSAGE_TYPE_CLRKEYENTRY, - 0, 0, 11, pbyData); + for (i = 0; i < MAX_KEY_TABLE; i++) + data[i] = i; - return; -} - -/* - * Description: Get Key from table - * - * Parameters: - * In: - * pTable - Pointer to Key table - * pbyBSSID - BSSID of Key - * dwKeyIndex - Key Index (0xFFFFFFFF means pairwise key) - * Out: - * pKey - Key return - * - * Return Value: true if found otherwise false - * - */ -int KeybGetKey(PSKeyManagement pTable, u8 *pbyBSSID, u32 dwKeyIndex, - PSKeyItem *pKey) -{ - int i; - - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"KeybGetKey()\n"); + ret = vnt_control_out(priv, MESSAGE_TYPE_CLRKEYENTRY, + 0, 0, ARRAY_SIZE(data), data); - *pKey = NULL; - for (i=0;i<MAX_KEY_TABLE;i++) { - if ((pTable->KeyTable[i].bInUse == true) && - ether_addr_equal(pTable->KeyTable[i].abyBSSID, pbyBSSID)) { - if (dwKeyIndex == 0xFFFFFFFF) { - if (pTable->KeyTable[i].PairwiseKey.bKeyValid == true) { - *pKey = &(pTable->KeyTable[i].PairwiseKey); - return (true); - } - else { - return (false); - } - } else if (dwKeyIndex < MAX_GROUP_KEY) { - if (pTable->KeyTable[i].GroupKey[dwKeyIndex].bKeyValid == true) { - *pKey = &(pTable->KeyTable[i].GroupKey[dwKeyIndex]); - return (true); - } - else { - return (false); - } - } - else { - return (false); - } - } - } - return (false); + return ret; } -/* - * Description: Set Key to table - * - * Parameters: - * In: - * pTable - Pointer to Key table - * pbyBSSID - BSSID of Key - * dwKeyIndex - Key index (reference to NDIS DDK) - * uKeyLength - Key length - * KeyRSC - Key RSC - * pbyKey - Pointer to key - * Out: - * none - * - * Return Value: true if success otherwise false - * - */ -int KeybSetKey(struct vnt_private *pDevice, PSKeyManagement pTable, - u8 *pbyBSSID, u32 dwKeyIndex, u32 uKeyLength, u64 *KeyRSC, u8 *pbyKey, - u8 byKeyDecMode) +static int vnt_set_keymode(struct ieee80211_hw *hw, u8 *mac_addr, + struct ieee80211_key_conf *key, u32 key_type, u32 mode, + bool onfly_latch) { - PSKeyItem pKey; - int i, j, ii; - u32 uKeyIdx; - - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO - "Enter KeybSetKey: %X\n", dwKeyIndex); - - j = (MAX_KEY_TABLE-1); - for (i=0;i<(MAX_KEY_TABLE-1);i++) { - if ((pTable->KeyTable[i].bInUse == false) && - (j == (MAX_KEY_TABLE-1))) { - // found empty table - j = i; - } - if ((pTable->KeyTable[i].bInUse == true) && - ether_addr_equal(pTable->KeyTable[i].abyBSSID, pbyBSSID)) { - // found table already exist - if ((dwKeyIndex & PAIRWISE_KEY) != 0) { - // Pairwise key - pKey = &(pTable->KeyTable[i].PairwiseKey); - pTable->KeyTable[i].wKeyCtl &= 0xFFF0; // clear pairwise key control filed - pTable->KeyTable[i].wKeyCtl |= byKeyDecMode; - uKeyIdx = 4; // use HW key entry 4 for pairwise key - } else { - // Group key - if ((dwKeyIndex & 0x000000FF) >= MAX_GROUP_KEY) - return (false); - pKey = &(pTable->KeyTable[i].GroupKey[dwKeyIndex & 0x000000FF]); - if ((dwKeyIndex & TRANSMIT_KEY) != 0) { - // Group transmit key - pTable->KeyTable[i].dwGTKeyIndex = dwKeyIndex; - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO - "Group transmit key(R)[%X]: %d\n", - pTable->KeyTable[i].dwGTKeyIndex, i); - } - pTable->KeyTable[i].wKeyCtl &= 0xFF0F; // clear group key control filed - pTable->KeyTable[i].wKeyCtl |= (byKeyDecMode << 4); - pTable->KeyTable[i].wKeyCtl |= 0x0040; // use group key for group address - uKeyIdx = (dwKeyIndex & 0x000000FF); - } - pTable->KeyTable[i].wKeyCtl |= 0x8000; // enable on-fly - - pKey->bKeyValid = true; - pKey->uKeyLength = uKeyLength; - pKey->dwKeyIndex = dwKeyIndex; - pKey->byCipherSuite = byKeyDecMode; - memcpy(pKey->abyKey, pbyKey, uKeyLength); - if (byKeyDecMode == KEY_CTL_WEP) { - if (uKeyLength == WLAN_WEP40_KEYLEN) - pKey->abyKey[15] &= 0x7F; - if (uKeyLength == WLAN_WEP104_KEYLEN) - pKey->abyKey[15] |= 0x80; - } - - MACvSetKeyEntry(pDevice, pTable->KeyTable[i].wKeyCtl, i, uKeyIdx, - pbyBSSID, pKey->abyKey); - - if ((dwKeyIndex & USE_KEYRSC) == 0) - pKey->KeyRSC = 0; /* RSC set by NIC */ - else - pKey->KeyRSC = *KeyRSC; - - pKey->dwTSC47_16 = 0; - pKey->wTSC15_0 = 0; - - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"KeybSetKey(R): \n"); - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"pKey->bKeyValid: %d\n ", pKey->bKeyValid); - //DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"pKey->uKeyLength: %d\n ", pKey->uKeyLength); - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"pKey->abyKey: "); - for (ii = 0; ii < pKey->uKeyLength; ii++) { - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "%02x ", pKey->abyKey[ii]); - } - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"\n"); - - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"pKey->dwTSC47_16: %x\n ", - pKey->dwTSC47_16); - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"pKey->wTSC15_0: %x\n ", - pKey->wTSC15_0); - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"pKey->dwKeyIndex: %x\n ", - pKey->dwKeyIndex); - - return (true); - } - } - if (j < (MAX_KEY_TABLE-1)) { - memcpy(pTable->KeyTable[j].abyBSSID, pbyBSSID, ETH_ALEN); - pTable->KeyTable[j].bInUse = true; - if ((dwKeyIndex & PAIRWISE_KEY) != 0) { - // Pairwise key - pKey = &(pTable->KeyTable[j].PairwiseKey); - pTable->KeyTable[j].wKeyCtl &= 0xFFF0; // clear pairwise key control filed - pTable->KeyTable[j].wKeyCtl |= byKeyDecMode; - uKeyIdx = 4; // use HW key entry 4 for pairwise key - } else { - // Group key - if ((dwKeyIndex & 0x000000FF) >= MAX_GROUP_KEY) - return (false); - pKey = &(pTable->KeyTable[j].GroupKey[dwKeyIndex & 0x000000FF]); - if ((dwKeyIndex & TRANSMIT_KEY) != 0) { - // Group transmit key - pTable->KeyTable[j].dwGTKeyIndex = dwKeyIndex; - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO - "Group transmit key(N)[%X]: %d\n", - pTable->KeyTable[j].dwGTKeyIndex, j); - } - pTable->KeyTable[j].wKeyCtl &= 0xFF0F; // clear group key control filed - pTable->KeyTable[j].wKeyCtl |= (byKeyDecMode << 4); - pTable->KeyTable[j].wKeyCtl |= 0x0040; // use group key for group address - uKeyIdx = (dwKeyIndex & 0x000000FF); - } - pTable->KeyTable[j].wKeyCtl |= 0x8000; // enable on-fly - - pKey->bKeyValid = true; - pKey->uKeyLength = uKeyLength; - pKey->dwKeyIndex = dwKeyIndex; - pKey->byCipherSuite = byKeyDecMode; - memcpy(pKey->abyKey, pbyKey, uKeyLength); - if (byKeyDecMode == KEY_CTL_WEP) { - if (uKeyLength == WLAN_WEP40_KEYLEN) - pKey->abyKey[15] &= 0x7F; - if (uKeyLength == WLAN_WEP104_KEYLEN) - pKey->abyKey[15] |= 0x80; - } - - MACvSetKeyEntry(pDevice, pTable->KeyTable[j].wKeyCtl, j, uKeyIdx, - pbyBSSID, pKey->abyKey); - - if ((dwKeyIndex & USE_KEYRSC) == 0) - pKey->KeyRSC = 0; /* RSC set by NIC */ - else - pKey->KeyRSC = *KeyRSC; - - pKey->dwTSC47_16 = 0; - pKey->wTSC15_0 = 0; - - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"KeybSetKey(N): \n"); - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"pKey->bKeyValid: %d\n ", pKey->bKeyValid); - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"pKey->uKeyLength: %d\n ", (int)pKey->uKeyLength); - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"pKey->abyKey: "); - for (ii = 0; ii < pKey->uKeyLength; ii++) { - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "%02x ", pKey->abyKey[ii]); - } - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"\n"); - - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"pKey->dwTSC47_16: %x\n ", - pKey->dwTSC47_16); - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"pKey->wTSC15_0: %x\n ", pKey->wTSC15_0); - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"pKey->dwKeyIndex: %x\n ", - pKey->dwKeyIndex); - - return (true); - } - return (false); + struct vnt_private *priv = hw->priv; + u8 broadcast[6] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; + u16 key_mode = 0; + u32 entry = 0; + u8 *bssid; + u8 key_inx = key->keyidx; + u8 i; + + if (mac_addr) + bssid = mac_addr; + else + bssid = &broadcast[0]; + + if (key_type != VNT_KEY_DEFAULTKEY) { + for (i = 0; i < (MAX_KEY_TABLE - 1); i++) { + if (!test_bit(i, &priv->key_entry_inuse)) { + set_bit(i, &priv->key_entry_inuse); + + key->hw_key_idx = i; + entry = key->hw_key_idx; + break; + } + } + } + + switch (key_type) { + /* fallthrough */ + case VNT_KEY_DEFAULTKEY: + /* default key last entry */ + entry = MAX_KEY_TABLE - 1; + key->hw_key_idx = entry; + case VNT_KEY_ALLGROUP: + key_mode |= VNT_KEY_ALLGROUP; + if (onfly_latch) + key_mode |= VNT_KEY_ONFLY_ALL; + case VNT_KEY_GROUP_ADDRESS: + key_mode |= mode; + case VNT_KEY_GROUP: + key_mode |= (mode << 4); + key_mode |= VNT_KEY_GROUP; + break; + case VNT_KEY_PAIRWISE: + key_mode |= mode; + key_inx = 4; + /* Don't save entry for pairwise key for station mode */ + if (priv->op_mode == NL80211_IFTYPE_STATION) + clear_bit(entry, &priv->key_entry_inuse); + break; + default: + return -EINVAL; + } + + if (onfly_latch) + key_mode |= VNT_KEY_ONFLY; + + if (mode == KEY_CTL_WEP) { + if (key->keylen == WLAN_KEY_LEN_WEP40) + key->key[15] &= 0x7f; + if (key->keylen == WLAN_KEY_LEN_WEP104) + key->key[15] |= 0x80; + } + + vnt_mac_set_keyentry(priv, key_mode, entry, key_inx, bssid, key->key); + + return 0; } -/* - * Description: Remove Key from table - * - * Parameters: - * In: - * pTable - Pointer to Key table - * pbyBSSID - BSSID of Key - * dwKeyIndex - Key Index (reference to NDIS DDK) - * Out: - * none - * - * Return Value: true if success otherwise false - * - */ - -int KeybRemoveKey(struct vnt_private *pDevice, PSKeyManagement pTable, - u8 *pbyBSSID, u32 dwKeyIndex) +int vnt_set_keys(struct ieee80211_hw *hw, struct ieee80211_sta *sta, + struct ieee80211_vif *vif, struct ieee80211_key_conf *key) { - int i; - int bReturnValue = false; - - if (is_broadcast_ether_addr(pbyBSSID)) { - // delete all keys - if ((dwKeyIndex & PAIRWISE_KEY) != 0) { - for (i=0;i<MAX_KEY_TABLE;i++) { - pTable->KeyTable[i].PairwiseKey.bKeyValid = false; - } - bReturnValue = true; - } - else if ((dwKeyIndex & 0x000000FF) < MAX_GROUP_KEY) { - for (i=0;i<MAX_KEY_TABLE;i++) { - pTable->KeyTable[i].GroupKey[dwKeyIndex & 0x000000FF].bKeyValid = false; - if ((dwKeyIndex & 0x7FFFFFFF) == (pTable->KeyTable[i].dwGTKeyIndex & 0x7FFFFFFF)) { - // remove Group transmit key - pTable->KeyTable[i].dwGTKeyIndex = 0; - } - } - bReturnValue = true; - } - else { - bReturnValue = false; - } - - } else { - for (i=0;i<MAX_KEY_TABLE;i++) { - if ( (pTable->KeyTable[i].bInUse == true) && - ether_addr_equal(pTable->KeyTable[i].abyBSSID, pbyBSSID)) { - - if ((dwKeyIndex & PAIRWISE_KEY) != 0) { - pTable->KeyTable[i].PairwiseKey.bKeyValid = false; - bReturnValue = true; - break; - } - else if ((dwKeyIndex & 0x000000FF) < MAX_GROUP_KEY) { - pTable->KeyTable[i].GroupKey[dwKeyIndex & 0x000000FF].bKeyValid = false; - if ((dwKeyIndex & 0x7FFFFFFF) == (pTable->KeyTable[i].dwGTKeyIndex & 0x7FFFFFFF)) { - // remove Group transmit key - pTable->KeyTable[i].dwGTKeyIndex = 0; - } - bReturnValue = true; - break; - } - else { - bReturnValue = false; - break; - } - } //pTable->KeyTable[i].bInUse == true - } //for - bReturnValue = true; - } + struct ieee80211_bss_conf *conf = &vif->bss_conf; + struct vnt_private *priv = hw->priv; + u8 *mac_addr = NULL; + u8 key_dec_mode = 0; + int ret = 0, u; - s_vCheckKeyTableValid(pDevice,pTable); - return bReturnValue; + if (sta) + mac_addr = &sta->addr[0]; -} - -/* - * Description: Remove Key from table - * - * Parameters: - * In: - * pTable - Pointer to Key table - * pbyBSSID - BSSID of Key - * Out: - * none - * - * Return Value: true if success otherwise false - * - */ -int KeybRemoveAllKey(struct vnt_private *pDevice, PSKeyManagement pTable, - u8 *pbyBSSID) -{ - int i, u; - - for (i=0;i<MAX_KEY_TABLE;i++) { - if ((pTable->KeyTable[i].bInUse == true) && - ether_addr_equal(pTable->KeyTable[i].abyBSSID, pbyBSSID)) { - pTable->KeyTable[i].PairwiseKey.bKeyValid = false; - for (u = 0; u < MAX_GROUP_KEY; u++) - pTable->KeyTable[i].GroupKey[u].bKeyValid = false; - - pTable->KeyTable[i].dwGTKeyIndex = 0; - s_vCheckKeyTableValid(pDevice, pTable); - return (true); - } - } - return (false); -} - -/* - * Description: Get Transmit Key from table - * - * Parameters: - * In: - * pTable - Pointer to Key table - * pbyBSSID - BSSID of Key - * Out: - * pKey - Key return - * - * Return Value: true if found otherwise false - * - */ -int KeybGetTransmitKey(PSKeyManagement pTable, u8 *pbyBSSID, u32 dwKeyType, - PSKeyItem *pKey) -{ - int i, ii; - - *pKey = NULL; - - for (i = 0; i < MAX_KEY_TABLE; i++) { - if ((pTable->KeyTable[i].bInUse == true) && - ether_addr_equal(pTable->KeyTable[i].abyBSSID, pbyBSSID)) { - - if (dwKeyType == PAIRWISE_KEY) { - - if (pTable->KeyTable[i].PairwiseKey.bKeyValid == true) { - *pKey = &(pTable->KeyTable[i].PairwiseKey); - - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"KeybGetTransmitKey:"); - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"PAIRWISE_KEY: KeyTable.abyBSSID: "); - for (ii = 0; ii < 6; ii++) { - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"%x ", pTable->KeyTable[i].abyBSSID[ii]); - } - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"\n"); - - return (true); - } - else { - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"PairwiseKey.bKeyValid == false\n"); - return (false); - } - } // End of Type == PAIRWISE - else { - if (pTable->KeyTable[i].dwGTKeyIndex == 0) { - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"ERROR: dwGTKeyIndex == 0 !!!\n"); - return false; - } - if (pTable->KeyTable[i].GroupKey[(pTable->KeyTable[i].dwGTKeyIndex&0x000000FF)].bKeyValid == true) { - *pKey = &(pTable->KeyTable[i].GroupKey[(pTable->KeyTable[i].dwGTKeyIndex&0x000000FF)]); - - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"KeybGetTransmitKey:"); - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"GROUP_KEY: KeyTable.abyBSSID\n"); - for (ii = 0; ii < 6; ii++) { - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"%x ", pTable->KeyTable[i].abyBSSID[ii]); - } - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"\n"); - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"dwGTKeyIndex: %X\n", - pTable->KeyTable[i].dwGTKeyIndex); - - return (true); - } - else { - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"GroupKey.bKeyValid == false\n"); - return (false); - } - } // End of Type = GROUP - } // BSSID match - } - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"ERROR: NO Match BSSID !!! "); - for (ii = 0; ii < 6; ii++) { - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"%02x ", *(pbyBSSID+ii)); - } - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"\n"); - return (false); -} - -/* - * Description: Set Key to table - * - * Parameters: - * In: - * pTable - Pointer to Key table - * dwKeyIndex - Key index (reference to NDIS DDK) - * uKeyLength - Key length - * KeyRSC - Key RSC - * pbyKey - Pointer to key - * Out: - * none - * - * Return Value: true if success otherwise false - * - */ - -int KeybSetDefaultKey(struct vnt_private *pDevice, PSKeyManagement pTable, - u32 dwKeyIndex, u32 uKeyLength, u64 *KeyRSC, u8 *pbyKey, - u8 byKeyDecMode) -{ - int ii; - PSKeyItem pKey; - u32 uKeyIdx; - - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Enter KeybSetDefaultKey: %1x, %d\n", - (int) dwKeyIndex, (int) uKeyLength); - - if ((dwKeyIndex & PAIRWISE_KEY) != 0) { // Pairwise key - return (false); - } else if ((dwKeyIndex & 0x000000FF) >= MAX_GROUP_KEY) { - return (false); - } - - if (uKeyLength > MAX_KEY_LEN) - return false; - - pTable->KeyTable[MAX_KEY_TABLE-1].bInUse = true; - for (ii = 0; ii < ETH_ALEN; ii++) - pTable->KeyTable[MAX_KEY_TABLE-1].abyBSSID[ii] = 0xFF; - - // Group key - pKey = &(pTable->KeyTable[MAX_KEY_TABLE-1].GroupKey[dwKeyIndex & 0x000000FF]); - if ((dwKeyIndex & TRANSMIT_KEY) != 0) { - // Group transmit key - pTable->KeyTable[MAX_KEY_TABLE-1].dwGTKeyIndex = dwKeyIndex; - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO - "Group transmit key(R)[%X]: %d\n", - pTable->KeyTable[MAX_KEY_TABLE-1].dwGTKeyIndex, - MAX_KEY_TABLE-1); - - } - pTable->KeyTable[MAX_KEY_TABLE-1].wKeyCtl &= 0x7F00; // clear all key control filed - pTable->KeyTable[MAX_KEY_TABLE-1].wKeyCtl |= (byKeyDecMode << 4); - pTable->KeyTable[MAX_KEY_TABLE-1].wKeyCtl |= (byKeyDecMode); - pTable->KeyTable[MAX_KEY_TABLE-1].wKeyCtl |= 0x0044; // use group key for all address - uKeyIdx = (dwKeyIndex & 0x000000FF); - - if ((uKeyLength == WLAN_WEP232_KEYLEN) && - (byKeyDecMode == KEY_CTL_WEP)) { - pTable->KeyTable[MAX_KEY_TABLE-1].wKeyCtl |= 0x4000; // disable on-fly disable address match - pTable->KeyTable[MAX_KEY_TABLE-1].bSoftWEP = true; - } else { - if (pTable->KeyTable[MAX_KEY_TABLE-1].bSoftWEP == false) - pTable->KeyTable[MAX_KEY_TABLE-1].wKeyCtl |= 0xC000; // enable on-fly disable address match - } - - pKey->bKeyValid = true; - pKey->uKeyLength = uKeyLength; - pKey->dwKeyIndex = dwKeyIndex; - pKey->byCipherSuite = byKeyDecMode; - memcpy(pKey->abyKey, pbyKey, uKeyLength); - if (byKeyDecMode == KEY_CTL_WEP) { - if (uKeyLength == WLAN_WEP40_KEYLEN) - pKey->abyKey[15] &= 0x7F; - if (uKeyLength == WLAN_WEP104_KEYLEN) - pKey->abyKey[15] |= 0x80; - } - - MACvSetKeyEntry(pDevice, pTable->KeyTable[MAX_KEY_TABLE-1].wKeyCtl, - MAX_KEY_TABLE-1, uKeyIdx, - pTable->KeyTable[MAX_KEY_TABLE-1].abyBSSID, pKey->abyKey); - - if ((dwKeyIndex & USE_KEYRSC) == 0) - pKey->KeyRSC = 0; /* RSC set by NIC */ - else - pKey->KeyRSC = *KeyRSC; - - pKey->dwTSC47_16 = 0; - pKey->wTSC15_0 = 0; - - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"KeybSetKey(R): \n"); - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"pKey->bKeyValid: %d\n", pKey->bKeyValid); - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"pKey->uKeyLength: %d\n", (int)pKey->uKeyLength); - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"pKey->abyKey: \n"); - for (ii = 0; ii < pKey->uKeyLength; ii++) { - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"%x", pKey->abyKey[ii]); - } - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"\n"); - - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"pKey->dwTSC47_16: %x\n", - pKey->dwTSC47_16); - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"pKey->wTSC15_0: %x\n", pKey->wTSC15_0); - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"pKey->dwKeyIndex: %x\n", - pKey->dwKeyIndex); - - return (true); -} - -/* - * Description: Set Key to table - * - * Parameters: - * In: - * pTable - Pointer to Key table - * dwKeyIndex - Key index (reference to NDIS DDK) - * uKeyLength - Key length - * KeyRSC - Key RSC - * pbyKey - Pointer to key - * Out: - * none - * - * Return Value: true if success otherwise false - * - */ - -int KeybSetAllGroupKey(struct vnt_private *pDevice, PSKeyManagement pTable, - u32 dwKeyIndex, u32 uKeyLength, u64 *KeyRSC, u8 *pbyKey, - u8 byKeyDecMode) -{ - int i, ii; - PSKeyItem pKey; - u32 uKeyIdx; + switch (key->cipher) { + case 0: + for (u = 0 ; u < MAX_KEY_TABLE; u++) + vnt_mac_disable_keyentry(priv, u); + return ret; - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Enter KeybSetAllGroupKey: %X\n", - dwKeyIndex); + case WLAN_CIPHER_SUITE_WEP40: + case WLAN_CIPHER_SUITE_WEP104: + for (u = 0; u < MAX_KEY_TABLE; u++) + vnt_mac_disable_keyentry(priv, u); - if ((dwKeyIndex & PAIRWISE_KEY) != 0) { // Pairwise key - return (false); - } else if ((dwKeyIndex & 0x000000FF) >= MAX_GROUP_KEY) { - return (false); - } + vnt_set_keymode(hw, mac_addr, key, VNT_KEY_DEFAULTKEY, + KEY_CTL_WEP, true); - for (i=0; i < MAX_KEY_TABLE-1; i++) { - if (pTable->KeyTable[i].bInUse == true) { - // found table already exist - // Group key - pKey = &(pTable->KeyTable[i].GroupKey[dwKeyIndex & 0x000000FF]); - if ((dwKeyIndex & TRANSMIT_KEY) != 0) { - // Group transmit key - pTable->KeyTable[i].dwGTKeyIndex = dwKeyIndex; - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO - "Group transmit key(R)[%X]: %d\n", - pTable->KeyTable[i].dwGTKeyIndex, i); + key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV; - } - pTable->KeyTable[i].wKeyCtl &= 0xFF0F; // clear group key control filed - pTable->KeyTable[i].wKeyCtl |= (byKeyDecMode << 4); - pTable->KeyTable[i].wKeyCtl |= 0x0040; // use group key for group address - uKeyIdx = (dwKeyIndex & 0x000000FF); + return ret; + case WLAN_CIPHER_SUITE_TKIP: + key->flags |= IEEE80211_KEY_FLAG_GENERATE_MMIC; + key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV; - pTable->KeyTable[i].wKeyCtl |= 0x8000; // enable on-fly + key_dec_mode = KEY_CTL_TKIP; - pKey->bKeyValid = true; - pKey->uKeyLength = uKeyLength; - pKey->dwKeyIndex = dwKeyIndex; - pKey->byCipherSuite = byKeyDecMode; - memcpy(pKey->abyKey, pbyKey, uKeyLength); - if (byKeyDecMode == KEY_CTL_WEP) { - if (uKeyLength == WLAN_WEP40_KEYLEN) - pKey->abyKey[15] &= 0x7F; - if (uKeyLength == WLAN_WEP104_KEYLEN) - pKey->abyKey[15] |= 0x80; - } + break; + case WLAN_CIPHER_SUITE_CCMP: + if (priv->local_id <= MAC_REVISION_A1) + return -EINVAL; - MACvSetKeyEntry(pDevice, pTable->KeyTable[i].wKeyCtl, i, uKeyIdx, - pTable->KeyTable[i].abyBSSID, pKey->abyKey); + key_dec_mode = KEY_CTL_CCMP; - if ((dwKeyIndex & USE_KEYRSC) == 0) - pKey->KeyRSC = 0; /* RSC set by NIC */ - else - pKey->KeyRSC = *KeyRSC; + key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV; + } - pKey->dwTSC47_16 = 0; - pKey->wTSC15_0 = 0; - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"KeybSetKey(R): \n"); - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"pKey->bKeyValid: %d\n ", pKey->bKeyValid); - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"pKey->uKeyLength: %d\n ", (int)pKey->uKeyLength); - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"pKey->abyKey: "); - for (ii = 0; ii < pKey->uKeyLength; ii++) { - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"%02x ", pKey->abyKey[ii]); - } - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"\n"); + if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE) { + vnt_set_keymode(hw, mac_addr, key, VNT_KEY_PAIRWISE, + key_dec_mode, true); + } else { + vnt_set_keymode(hw, mac_addr, key, VNT_KEY_DEFAULTKEY, + key_dec_mode, true); - //DBG_PRN_GRP12(("pKey->dwTSC47_16: %lX\n ", pKey->dwTSC47_16)); - //DBG_PRN_GRP12(("pKey->wTSC15_0: %X\n ", pKey->wTSC15_0)); - //DBG_PRN_GRP12(("pKey->dwKeyIndex: %lX\n ", pKey->dwKeyIndex)); + vnt_set_keymode(hw, (u8 *)conf->bssid, key, + VNT_KEY_GROUP_ADDRESS, key_dec_mode, true); + } - } // (pTable->KeyTable[i].bInUse == true) - } - return (true); + return 0; } diff --git a/drivers/staging/vt6656/key.h b/drivers/staging/vt6656/key.h index 23e188d125ba..3cb1291055ed 100644 --- a/drivers/staging/vt6656/key.h +++ b/drivers/staging/vt6656/key.h @@ -30,83 +30,26 @@ #ifndef __KEY_H__ #define __KEY_H__ -#include "tether.h" -#include "80211mgr.h" +#include "device.h" -#define MAX_GROUP_KEY 4 #define MAX_KEY_TABLE 11 -#define MAX_KEY_LEN 32 -#define AES_KEY_LEN 16 - -#define AUTHENTICATOR_KEY 0x10000000 -#define USE_KEYRSC 0x20000000 -#define PAIRWISE_KEY 0x40000000 -#define TRANSMIT_KEY 0x80000000 - -#define GROUP_KEY 0x00000000 #define KEY_CTL_WEP 0x00 #define KEY_CTL_NONE 0x01 #define KEY_CTL_TKIP 0x02 #define KEY_CTL_CCMP 0x03 -#define KEY_CTL_INVALID 0xFF - -typedef struct tagSKeyItem -{ - bool bKeyValid; - u32 uKeyLength; - u8 abyKey[MAX_KEY_LEN]; - u64 KeyRSC; - u32 dwTSC47_16; - u16 wTSC15_0; - u8 byCipherSuite; - u8 byReserved0; - u32 dwKeyIndex; - void *pvKeyTable; -} SKeyItem, *PSKeyItem; //64 - -typedef struct tagSKeyTable -{ - u8 abyBSSID[ETH_ALEN]; /* 6 */ - u8 byReserved0[2]; //8 - SKeyItem PairwiseKey; - SKeyItem GroupKey[MAX_GROUP_KEY]; //64*5 = 320, 320+8=328 - u32 dwGTKeyIndex; // GroupTransmitKey Index - bool bInUse; - u16 wKeyCtl; - bool bSoftWEP; - u8 byReserved1[6]; -} SKeyTable, *PSKeyTable; //352 - -typedef struct tagSKeyManagement -{ - SKeyTable KeyTable[MAX_KEY_TABLE]; -} SKeyManagement, *PSKeyManagement; - -void KeyvInitTable(struct vnt_private *, PSKeyManagement pTable); - -int KeybGetKey(PSKeyManagement pTable, u8 *pbyBSSID, u32 dwKeyIndex, - PSKeyItem *pKey); - -int KeybSetKey(struct vnt_private *, PSKeyManagement pTable, u8 *pbyBSSID, - u32 dwKeyIndex, u32 uKeyLength, u64 *KeyRSC, u8 *pbyKey, - u8 byKeyDecMode); - -int KeybRemoveKey(struct vnt_private *, PSKeyManagement pTable, - u8 *pbyBSSID, u32 dwKeyIndex); - -int KeybRemoveAllKey(struct vnt_private *, PSKeyManagement pTable, - u8 *pbyBSSID); -int KeybGetTransmitKey(PSKeyManagement pTable, u8 *pbyBSSID, u32 dwKeyType, - PSKeyItem *pKey); +#define VNT_KEY_DEFAULTKEY 0x1 +#define VNT_KEY_GROUP_ADDRESS 0x2 +#define VNT_KEY_ALLGROUP 0x4 +#define VNT_KEY_GROUP 0x40 +#define VNT_KEY_PAIRWISE 0x00 +#define VNT_KEY_ONFLY 0x8000 +#define VNT_KEY_ONFLY_ALL 0x4000 -int KeybSetDefaultKey(struct vnt_private *, PSKeyManagement pTable, - u32 dwKeyIndex, u32 uKeyLength, u64 *KeyRSC, u8 *pbyKey, - u8 byKeyDecMode); +int vnt_key_init_table(struct vnt_private *); -int KeybSetAllGroupKey(struct vnt_private *, PSKeyManagement pTable, - u32 dwKeyIndex, u32 uKeyLength, u64 *KeyRSC, u8 *pbyKey, - u8 byKeyDecMode); +int vnt_set_keys(struct ieee80211_hw *hw, struct ieee80211_sta *sta, + struct ieee80211_vif *vif, struct ieee80211_key_conf *key); #endif /* __KEY_H__ */ diff --git a/drivers/staging/vt6656/mac.c b/drivers/staging/vt6656/mac.c index cadf7cd280c3..bb37e33b9ffa 100644 --- a/drivers/staging/vt6656/mac.c +++ b/drivers/staging/vt6656/mac.c @@ -30,11 +30,8 @@ * Revision History: */ -#include "tmacro.h" -#include "tether.h" #include "desc.h" #include "mac.h" -#include "80211hdr.h" #include "usbpipe.h" /* @@ -50,7 +47,7 @@ * Return Value: none * */ -void MACvWriteMultiAddr(struct vnt_private *priv, u64 mc_filter) +void vnt_mac_set_filter(struct vnt_private *priv, u64 mc_filter) { __le64 le_mc = cpu_to_le64(mc_filter); @@ -69,12 +66,12 @@ void MACvWriteMultiAddr(struct vnt_private *priv, u64 mc_filter) * * */ -void MACbShutdown(struct vnt_private *priv) +void vnt_mac_shutdown(struct vnt_private *priv) { vnt_control_out(priv, MESSAGE_TYPE_MACSHUTDOWN, 0, 0, 0, NULL); } -void MACvSetBBType(struct vnt_private *priv, u8 type) +void vnt_mac_set_bb_type(struct vnt_private *priv, u8 type) { u8 data[2]; @@ -99,7 +96,7 @@ void MACvSetBBType(struct vnt_private *priv, u8 type) * Return Value: none * */ -void MACvDisableKeyEntry(struct vnt_private *priv, u8 entry_idx) +void vnt_mac_disable_keyentry(struct vnt_private *priv, u8 entry_idx) { vnt_control_out(priv, MESSAGE_TYPE_CLRKEYENTRY, 0, 0, sizeof(entry_idx), &entry_idx); @@ -119,16 +116,12 @@ void MACvDisableKeyEntry(struct vnt_private *priv, u8 entry_idx) * Return Value: none * */ -void MACvSetKeyEntry(struct vnt_private *priv, u16 key_ctl, u32 entry_idx, +void vnt_mac_set_keyentry(struct vnt_private *priv, u16 key_ctl, u32 entry_idx, u32 key_idx, u8 *addr, u8 *key) { struct vnt_mac_set_key set_key; u16 offset; - if (priv->byLocalID <= MAC_REVISION_A1) - if (priv->vnt_mgmt.byCSSPK == KEY_CTL_CCMP) - return; - offset = MISCFIFO_KEYETRY0; offset += (entry_idx * MISCFIFO_KEYENTRYSIZE); @@ -147,7 +140,7 @@ void MACvSetKeyEntry(struct vnt_private *priv, u16 key_ctl, u32 entry_idx, (u16)key_idx, sizeof(struct vnt_mac_set_key), (u8 *)&set_key); } -void MACvRegBitsOff(struct vnt_private *priv, u8 reg_ofs, u8 bits) +void vnt_mac_reg_bits_off(struct vnt_private *priv, u8 reg_ofs, u8 bits) { u8 data[2]; @@ -158,7 +151,7 @@ void MACvRegBitsOff(struct vnt_private *priv, u8 reg_ofs, u8 bits) reg_ofs, MESSAGE_REQUEST_MACREG, ARRAY_SIZE(data), data); } -void MACvRegBitsOn(struct vnt_private *priv, u8 reg_ofs, u8 bits) +void vnt_mac_reg_bits_on(struct vnt_private *priv, u8 reg_ofs, u8 bits) { u8 data[2]; @@ -169,7 +162,7 @@ void MACvRegBitsOn(struct vnt_private *priv, u8 reg_ofs, u8 bits) reg_ofs, MESSAGE_REQUEST_MACREG, ARRAY_SIZE(data), data); } -void MACvWriteWord(struct vnt_private *priv, u8 reg_ofs, u16 word) +void vnt_mac_write_word(struct vnt_private *priv, u8 reg_ofs, u16 word) { u8 data[2]; @@ -180,13 +173,13 @@ void MACvWriteWord(struct vnt_private *priv, u8 reg_ofs, u16 word) reg_ofs, MESSAGE_REQUEST_MACREG, ARRAY_SIZE(data), data); } -void MACvWriteBSSIDAddress(struct vnt_private *priv, u8 *addr) +void vnt_mac_set_bssid_addr(struct vnt_private *priv, u8 *addr) { vnt_control_out(priv, MESSAGE_TYPE_WRITE, MAC_REG_BSSID0, MESSAGE_REQUEST_MACREG, ETH_ALEN, addr); } -void MACvEnableProtectMD(struct vnt_private *priv) +void vnt_mac_enable_protect_mode(struct vnt_private *priv) { u8 data[2]; @@ -197,7 +190,7 @@ void MACvEnableProtectMD(struct vnt_private *priv) MAC_REG_ENCFG0, MESSAGE_REQUEST_MACREG, ARRAY_SIZE(data), data); } -void MACvDisableProtectMD(struct vnt_private *priv) +void vnt_mac_disable_protect_mode(struct vnt_private *priv) { u8 data[2]; @@ -208,7 +201,7 @@ void MACvDisableProtectMD(struct vnt_private *priv) MAC_REG_ENCFG0, MESSAGE_REQUEST_MACREG, ARRAY_SIZE(data), data); } -void MACvEnableBarkerPreambleMd(struct vnt_private *priv) +void vnt_mac_enable_barker_preamble_mode(struct vnt_private *priv) { u8 data[2]; @@ -219,7 +212,7 @@ void MACvEnableBarkerPreambleMd(struct vnt_private *priv) MAC_REG_ENCFG2, MESSAGE_REQUEST_MACREG, ARRAY_SIZE(data), data); } -void MACvDisableBarkerPreambleMd(struct vnt_private *priv) +void vnt_mac_disable_barker_preamble_mode(struct vnt_private *priv) { u8 data[2]; @@ -230,7 +223,7 @@ void MACvDisableBarkerPreambleMd(struct vnt_private *priv) MAC_REG_ENCFG2, MESSAGE_REQUEST_MACREG, ARRAY_SIZE(data), data); } -void MACvWriteBeaconInterval(struct vnt_private *priv, u16 interval) +void vnt_mac_set_beacon_interval(struct vnt_private *priv, u16 interval) { u8 data[2]; @@ -250,6 +243,4 @@ void vnt_mac_set_led(struct vnt_private *priv, u8 state, u8 led) vnt_control_out(priv, MESSAGE_TYPE_WRITE_MASK, MAC_REG_PAPEDELAY, MESSAGE_REQUEST_MACREG, ARRAY_SIZE(data), data); - - return; } diff --git a/drivers/staging/vt6656/mac.h b/drivers/staging/vt6656/mac.h index 986ca95f7204..d53fcef87b4a 100644 --- a/drivers/staging/vt6656/mac.h +++ b/drivers/staging/vt6656/mac.h @@ -35,373 +35,327 @@ #define __MAC_H__ #include "device.h" -#include "tmacro.h" - -#define REV_ID_VT3253_A0 0x00 -#define REV_ID_VT3253_A1 0x01 -#define REV_ID_VT3253_B0 0x08 -#define REV_ID_VT3253_B1 0x09 - -// -// Registers in the MAC -// -#define MAC_REG_BISTCMD 0x04 -#define MAC_REG_BISTSR0 0x05 -#define MAC_REG_BISTSR1 0x06 -#define MAC_REG_BISTSR2 0x07 -#define MAC_REG_I2MCSR 0x08 -#define MAC_REG_I2MTGID 0x09 -#define MAC_REG_I2MTGAD 0x0A -#define MAC_REG_I2MCFG 0x0B -#define MAC_REG_I2MDIPT 0x0C -#define MAC_REG_I2MDOPT 0x0E -#define MAC_REG_USBSUS 0x0F - -#define MAC_REG_LOCALID 0x14 -#define MAC_REG_TESTCFG 0x15 -#define MAC_REG_JUMPER0 0x16 -#define MAC_REG_JUMPER1 0x17 -#define MAC_REG_TMCTL 0x18 -#define MAC_REG_TMDATA0 0x1C -#define MAC_REG_TMDATA1 0x1D -#define MAC_REG_TMDATA2 0x1E -#define MAC_REG_TMDATA3 0x1F - -// MAC Parameter related -#define MAC_REG_LRT 0x20 // -#define MAC_REG_SRT 0x21 // -#define MAC_REG_SIFS 0x22 // -#define MAC_REG_DIFS 0x23 // -#define MAC_REG_EIFS 0x24 // -#define MAC_REG_SLOT 0x25 // -#define MAC_REG_BI 0x26 // -#define MAC_REG_CWMAXMIN0 0x28 // -#define MAC_REG_LINKOFFTOTM 0x2A -#define MAC_REG_SWTMOT 0x2B -#define MAC_REG_RTSOKCNT 0x2C -#define MAC_REG_RTSFAILCNT 0x2D -#define MAC_REG_ACKFAILCNT 0x2E -#define MAC_REG_FCSERRCNT 0x2F -// TSF Related -#define MAC_REG_TSFCNTR 0x30 // -#define MAC_REG_NEXTTBTT 0x38 // -#define MAC_REG_TSFOFST 0x40 // -#define MAC_REG_TFTCTL 0x48 // -// WMAC Control/Status Related -#define MAC_REG_ENCFG0 0x4C // -#define MAC_REG_ENCFG1 0x4D // -#define MAC_REG_ENCFG2 0x4E // - -#define MAC_REG_CFG 0x50 // -#define MAC_REG_TEST 0x52 // -#define MAC_REG_HOSTCR 0x54 // -#define MAC_REG_MACCR 0x55 // -#define MAC_REG_RCR 0x56 // -#define MAC_REG_TCR 0x57 // -#define MAC_REG_IMR 0x58 // -#define MAC_REG_ISR 0x5C -#define MAC_REG_ISR1 0x5D -// Power Saving Related -#define MAC_REG_PSCFG 0x60 // -#define MAC_REG_PSCTL 0x61 // -#define MAC_REG_PSPWRSIG 0x62 // -#define MAC_REG_BBCR13 0x63 -#define MAC_REG_AIDATIM 0x64 -#define MAC_REG_PWBT 0x66 -#define MAC_REG_WAKEOKTMR 0x68 -#define MAC_REG_CALTMR 0x69 -#define MAC_REG_SYNSPACCNT 0x6A -#define MAC_REG_WAKSYNOPT 0x6B -// Baseband/IF Control Group -#define MAC_REG_BBREGCTL 0x6C // -#define MAC_REG_CHANNEL 0x6D -#define MAC_REG_BBREGADR 0x6E -#define MAC_REG_BBREGDATA 0x6F -#define MAC_REG_IFREGCTL 0x70 // -#define MAC_REG_IFDATA 0x71 // -#define MAC_REG_ITRTMSET 0x74 // -#define MAC_REG_PAPEDELAY 0x77 -#define MAC_REG_SOFTPWRCTL 0x78 // -#define MAC_REG_SOFTPWRCTL2 0x79 // -#define MAC_REG_GPIOCTL0 0x7A // -#define MAC_REG_GPIOCTL1 0x7B // - -// MiscFF PIO related -#define MAC_REG_MISCFFNDEX 0xBC -#define MAC_REG_MISCFFCTL 0xBE -#define MAC_REG_MISCFFDATA 0xC0 - -// MAC Configuration Group -#define MAC_REG_PAR0 0xC4 -#define MAC_REG_PAR4 0xC8 -#define MAC_REG_BSSID0 0xCC -#define MAC_REG_BSSID4 0xD0 -#define MAC_REG_MAR0 0xD4 -#define MAC_REG_MAR4 0xD8 -// MAC RSPPKT INFO Group -#define MAC_REG_RSPINF_B_1 0xDC -#define MAC_REG_RSPINF_B_2 0xE0 -#define MAC_REG_RSPINF_B_5 0xE4 -#define MAC_REG_RSPINF_B_11 0xE8 -#define MAC_REG_RSPINF_A_6 0xEC -#define MAC_REG_RSPINF_A_9 0xEE -#define MAC_REG_RSPINF_A_12 0xF0 -#define MAC_REG_RSPINF_A_18 0xF2 -#define MAC_REG_RSPINF_A_24 0xF4 -#define MAC_REG_RSPINF_A_36 0xF6 -#define MAC_REG_RSPINF_A_48 0xF8 -#define MAC_REG_RSPINF_A_54 0xFA -#define MAC_REG_RSPINF_A_72 0xFC - -// -// Bits in the I2MCFG EEPROM register -// -#define I2MCFG_BOUNDCTL 0x80 -#define I2MCFG_WAITCTL 0x20 -#define I2MCFG_SCLOECTL 0x10 -#define I2MCFG_WBUSYCTL 0x08 -#define I2MCFG_NORETRY 0x04 -#define I2MCFG_I2MLDSEQ 0x02 -#define I2MCFG_I2CMFAST 0x01 - -// -// Bits in the I2MCSR EEPROM register -// -#define I2MCSR_EEMW 0x80 -#define I2MCSR_EEMR 0x40 -#define I2MCSR_AUTOLD 0x08 -#define I2MCSR_NACK 0x02 -#define I2MCSR_DONE 0x01 - -// -// Bits in the TMCTL register -// -#define TMCTL_TSUSP 0x04 -#define TMCTL_TMD 0x02 -#define TMCTL_TE 0x01 - -// -// Bits in the TFTCTL register -// -#define TFTCTL_HWUTSF 0x80 // -#define TFTCTL_TBTTSYNC 0x40 -#define TFTCTL_HWUTSFEN 0x20 -#define TFTCTL_TSFCNTRRD 0x10 // -#define TFTCTL_TBTTSYNCEN 0x08 // -#define TFTCTL_TSFSYNCEN 0x04 // -#define TFTCTL_TSFCNTRST 0x02 // -#define TFTCTL_TSFCNTREN 0x01 // - -// -// Bits in the EnhanceCFG_0 register -// -#define EnCFG_BBType_a 0x00 -#define EnCFG_BBType_b 0x01 -#define EnCFG_BBType_g 0x02 -#define EnCFG_BBType_MASK 0x03 -#define EnCFG_ProtectMd 0x20 - -// -// Bits in the EnhanceCFG_1 register -// -#define EnCFG_BcnSusInd 0x01 -#define EnCFG_BcnSusClr 0x02 - -// -// Bits in the EnhanceCFG_2 register -// -#define EnCFG_NXTBTTCFPSTR 0x01 -#define EnCFG_BarkerPream 0x02 -#define EnCFG_PktBurstMode 0x04 - -// -// Bits in the CFG register -// -#define CFG_TKIPOPT 0x80 -#define CFG_RXDMAOPT 0x40 -#define CFG_TMOT_SW 0x20 -#define CFG_TMOT_HWLONG 0x10 -#define CFG_TMOT_HW 0x00 -#define CFG_CFPENDOPT 0x08 -#define CFG_BCNSUSEN 0x04 -#define CFG_NOTXTIMEOUT 0x02 -#define CFG_NOBUFOPT 0x01 - -// -// Bits in the TEST register -// -#define TEST_LBEXT 0x80 // -#define TEST_LBINT 0x40 // -#define TEST_LBNONE 0x00 // -#define TEST_SOFTINT 0x20 // -#define TEST_CONTTX 0x10 // -#define TEST_TXPE 0x08 // -#define TEST_NAVDIS 0x04 // -#define TEST_NOCTS 0x02 // -#define TEST_NOACK 0x01 // - -// -// Bits in the HOSTCR register -// -#define HOSTCR_TXONST 0x80 // -#define HOSTCR_RXONST 0x40 // -#define HOSTCR_ADHOC 0x20 // Network Type 1 = Ad-hoc -#define HOSTCR_AP 0x10 // Port Type 1 = AP -#define HOSTCR_TXON 0x08 //0000 1000 -#define HOSTCR_RXON 0x04 //0000 0100 -#define HOSTCR_MACEN 0x02 //0000 0010 -#define HOSTCR_SOFTRST 0x01 //0000 0001 - -// -// Bits in the MACCR register -// -#define MACCR_SYNCFLUSHOK 0x04 // -#define MACCR_SYNCFLUSH 0x02 // -#define MACCR_CLRNAV 0x01 // - -// -// Bits in the RCR register -// -#define RCR_SSID 0x80 -#define RCR_RXALLTYPE 0x40 // -#define RCR_UNICAST 0x20 // -#define RCR_BROADCAST 0x10 // -#define RCR_MULTICAST 0x08 // -#define RCR_WPAERR 0x04 // -#define RCR_ERRCRC 0x02 // -#define RCR_BSSID 0x01 // - -// -// Bits in the TCR register -// -#define TCR_SYNCDCFOPT 0x02 // -#define TCR_AUTOBCNTX 0x01 // Beacon automatically transmit enable - -//ISR1 -#define ISR_GPIO3 0x40 -#define ISR_RXNOBUF 0x08 -#define ISR_MIBNEARFULL 0x04 -#define ISR_SOFTINT 0x02 -#define ISR_FETALERR 0x01 - -#define LEDSTS_STS 0x06 -#define LEDSTS_TMLEN 0x78 -#define LEDSTS_OFF 0x00 -#define LEDSTS_ON 0x02 -#define LEDSTS_SLOW 0x04 -#define LEDSTS_INTER 0x06 - -//ISR0 -#define ISR_WATCHDOG 0x80 -#define ISR_SOFTTIMER 0x40 -#define ISR_GPIO0 0x20 -#define ISR_TBTT 0x10 -#define ISR_RXDMA0 0x08 -#define ISR_BNTX 0x04 -#define ISR_ACTX 0x01 - -// -// Bits in the PSCFG register -// -#define PSCFG_PHILIPMD 0x40 // -#define PSCFG_WAKECALEN 0x20 // -#define PSCFG_WAKETMREN 0x10 // -#define PSCFG_BBPSPROG 0x08 // -#define PSCFG_WAKESYN 0x04 // -#define PSCFG_SLEEPSYN 0x02 // -#define PSCFG_AUTOSLEEP 0x01 // - -// -// Bits in the PSCTL register -// -#define PSCTL_WAKEDONE 0x20 // -#define PSCTL_PS 0x10 // -#define PSCTL_GO2DOZE 0x08 // -#define PSCTL_LNBCN 0x04 // -#define PSCTL_ALBCN 0x02 // -#define PSCTL_PSEN 0x01 // - -// -// Bits in the PSPWSIG register -// -#define PSSIG_WPE3 0x80 // -#define PSSIG_WPE2 0x40 // -#define PSSIG_WPE1 0x20 // -#define PSSIG_WRADIOPE 0x10 // -#define PSSIG_SPE3 0x08 // -#define PSSIG_SPE2 0x04 // -#define PSSIG_SPE1 0x02 // -#define PSSIG_SRADIOPE 0x01 // - -// -// Bits in the BBREGCTL register -// -#define BBREGCTL_DONE 0x04 // -#define BBREGCTL_REGR 0x02 // -#define BBREGCTL_REGW 0x01 // - -// -// Bits in the IFREGCTL register -// -#define IFREGCTL_DONE 0x04 // -#define IFREGCTL_IFRF 0x02 // -#define IFREGCTL_REGW 0x01 // - -// -// Bits in the SOFTPWRCTL register -// -#define SOFTPWRCTL_RFLEOPT 0x08 // -#define SOFTPWRCTL_TXPEINV 0x02 // -#define SOFTPWRCTL_SWPECTI 0x01 // -#define SOFTPWRCTL_SWPAPE 0x20 // -#define SOFTPWRCTL_SWCALEN 0x10 // -#define SOFTPWRCTL_SWRADIO_PE 0x08 // -#define SOFTPWRCTL_SWPE2 0x04 // -#define SOFTPWRCTL_SWPE1 0x02 // -#define SOFTPWRCTL_SWPE3 0x01 // - -// -// Bits in the GPIOCTL1 register -// -#define GPIO3_MD 0x20 // -#define GPIO3_DATA 0x40 // -#define GPIO3_INTMD 0x80 // - -// -// Bits in the MISCFFCTL register -// -#define MISCFFCTL_WRITE 0x0001 // - -// Loopback mode -#define MAC_LB_EXT 0x02 // -#define MAC_LB_INTERNAL 0x01 // -#define MAC_LB_NONE 0x00 // - -// Ethernet address filter type -#define PKT_TYPE_NONE 0x00 // turn off receiver -#define PKT_TYPE_ALL_MULTICAST 0x80 -#define PKT_TYPE_PROMISCUOUS 0x40 -#define PKT_TYPE_DIRECTED 0x20 // obselete, directed address is always accepted -#define PKT_TYPE_BROADCAST 0x10 -#define PKT_TYPE_MULTICAST 0x08 -#define PKT_TYPE_ERROR_WPA 0x04 -#define PKT_TYPE_ERROR_CRC 0x02 -#define PKT_TYPE_BSSID 0x01 -#define Default_BI 0x200 - -// MiscFIFO Offset -#define MISCFIFO_KEYETRY0 32 -#define MISCFIFO_KEYENTRYSIZE 22 +#define REV_ID_VT3253_A0 0x00 +#define REV_ID_VT3253_A1 0x01 +#define REV_ID_VT3253_B0 0x08 +#define REV_ID_VT3253_B1 0x09 + +/* Registers in the MAC */ +#define MAC_REG_BISTCMD 0x04 +#define MAC_REG_BISTSR0 0x05 +#define MAC_REG_BISTSR1 0x06 +#define MAC_REG_BISTSR2 0x07 +#define MAC_REG_I2MCSR 0x08 +#define MAC_REG_I2MTGID 0x09 +#define MAC_REG_I2MTGAD 0x0a +#define MAC_REG_I2MCFG 0x0b +#define MAC_REG_I2MDIPT 0x0c +#define MAC_REG_I2MDOPT 0x0e +#define MAC_REG_USBSUS 0x0f + +#define MAC_REG_LOCALID 0x14 +#define MAC_REG_TESTCFG 0x15 +#define MAC_REG_JUMPER0 0x16 +#define MAC_REG_JUMPER1 0x17 +#define MAC_REG_TMCTL 0x18 +#define MAC_REG_TMDATA0 0x1c +#define MAC_REG_TMDATA1 0x1d +#define MAC_REG_TMDATA2 0x1e +#define MAC_REG_TMDATA3 0x1f + +/* MAC Parameter related */ +#define MAC_REG_LRT 0x20 +#define MAC_REG_SRT 0x21 +#define MAC_REG_SIFS 0x22 +#define MAC_REG_DIFS 0x23 +#define MAC_REG_EIFS 0x24 +#define MAC_REG_SLOT 0x25 +#define MAC_REG_BI 0x26 +#define MAC_REG_CWMAXMIN0 0x28 +#define MAC_REG_LINKOFFTOTM 0x2a +#define MAC_REG_SWTMOT 0x2b +#define MAC_REG_RTSOKCNT 0x2c +#define MAC_REG_RTSFAILCNT 0x2d +#define MAC_REG_ACKFAILCNT 0x2e +#define MAC_REG_FCSERRCNT 0x2f + +/* TSF Related */ +#define MAC_REG_TSFCNTR 0x30 +#define MAC_REG_NEXTTBTT 0x38 +#define MAC_REG_TSFOFST 0x40 +#define MAC_REG_TFTCTL 0x48 + +/* WMAC Control/Status Related */ +#define MAC_REG_ENCFG0 0x4c +#define MAC_REG_ENCFG1 0x4d +#define MAC_REG_ENCFG2 0x4e + +#define MAC_REG_CFG 0x50 +#define MAC_REG_TEST 0x52 +#define MAC_REG_HOSTCR 0x54 +#define MAC_REG_MACCR 0x55 +#define MAC_REG_RCR 0x56 +#define MAC_REG_TCR 0x57 +#define MAC_REG_IMR 0x58 +#define MAC_REG_ISR 0x5c +#define MAC_REG_ISR1 0x5d + +/* Power Saving Related */ +#define MAC_REG_PSCFG 0x60 +#define MAC_REG_PSCTL 0x61 +#define MAC_REG_PSPWRSIG 0x62 +#define MAC_REG_BBCR13 0x63 +#define MAC_REG_AIDATIM 0x64 +#define MAC_REG_PWBT 0x66 +#define MAC_REG_WAKEOKTMR 0x68 +#define MAC_REG_CALTMR 0x69 +#define MAC_REG_SYNSPACCNT 0x6a +#define MAC_REG_WAKSYNOPT 0x6b + +/* Baseband/IF Control Group */ +#define MAC_REG_BBREGCTL 0x6c +#define MAC_REG_CHANNEL 0x6d +#define MAC_REG_BBREGADR 0x6e +#define MAC_REG_BBREGDATA 0x6f +#define MAC_REG_IFREGCTL 0x70 +#define MAC_REG_IFDATA 0x71 +#define MAC_REG_ITRTMSET 0x74 +#define MAC_REG_PAPEDELAY 0x77 +#define MAC_REG_SOFTPWRCTL 0x78 +#define MAC_REG_SOFTPWRCTL2 0x79 +#define MAC_REG_GPIOCTL0 0x7a +#define MAC_REG_GPIOCTL1 0x7b + +/* MiscFF PIO related */ +#define MAC_REG_MISCFFNDEX 0xbc +#define MAC_REG_MISCFFCTL 0xbe +#define MAC_REG_MISCFFDATA 0xc0 + +/* MAC Configuration Group */ +#define MAC_REG_PAR0 0xc4 +#define MAC_REG_PAR4 0xc8 +#define MAC_REG_BSSID0 0xcc +#define MAC_REG_BSSID4 0xd0 +#define MAC_REG_MAR0 0xd4 +#define MAC_REG_MAR4 0xd8 + +/* MAC RSPPKT INFO Group */ +#define MAC_REG_RSPINF_B_1 0xdC +#define MAC_REG_RSPINF_B_2 0xe0 +#define MAC_REG_RSPINF_B_5 0xe4 +#define MAC_REG_RSPINF_B_11 0xe8 +#define MAC_REG_RSPINF_A_6 0xec +#define MAC_REG_RSPINF_A_9 0xee +#define MAC_REG_RSPINF_A_12 0xf0 +#define MAC_REG_RSPINF_A_18 0xf2 +#define MAC_REG_RSPINF_A_24 0xf4 +#define MAC_REG_RSPINF_A_36 0xf6 +#define MAC_REG_RSPINF_A_48 0xf8 +#define MAC_REG_RSPINF_A_54 0xfa +#define MAC_REG_RSPINF_A_72 0xfc + +/* Bits in the I2MCFG EEPROM register */ +#define I2MCFG_BOUNDCTL 0x80 +#define I2MCFG_WAITCTL 0x20 +#define I2MCFG_SCLOECTL 0x10 +#define I2MCFG_WBUSYCTL 0x08 +#define I2MCFG_NORETRY 0x04 +#define I2MCFG_I2MLDSEQ 0x02 +#define I2MCFG_I2CMFAST 0x01 + +/* Bits in the I2MCSR EEPROM register */ +#define I2MCSR_EEMW 0x80 +#define I2MCSR_EEMR 0x40 +#define I2MCSR_AUTOLD 0x08 +#define I2MCSR_NACK 0x02 +#define I2MCSR_DONE 0x01 + +/* Bits in the TMCTL register */ +#define TMCTL_TSUSP 0x04 +#define TMCTL_TMD 0x02 +#define TMCTL_TE 0x01 + +/* Bits in the TFTCTL register */ +#define TFTCTL_HWUTSF 0x80 +#define TFTCTL_TBTTSYNC 0x40 +#define TFTCTL_HWUTSFEN 0x20 +#define TFTCTL_TSFCNTRRD 0x10 +#define TFTCTL_TBTTSYNCEN 0x08 +#define TFTCTL_TSFSYNCEN 0x04 +#define TFTCTL_TSFCNTRST 0x02 +#define TFTCTL_TSFCNTREN 0x01 + +/* Bits in the EnhanceCFG_0 register */ +#define EnCFG_BBType_a 0x00 +#define EnCFG_BBType_b 0x01 +#define EnCFG_BBType_g 0x02 +#define EnCFG_BBType_MASK 0x03 +#define EnCFG_ProtectMd 0x20 + +/* Bits in the EnhanceCFG_1 register */ +#define EnCFG_BcnSusInd 0x01 +#define EnCFG_BcnSusClr 0x02 + +/* Bits in the EnhanceCFG_2 register */ +#define EnCFG_NXTBTTCFPSTR 0x01 +#define EnCFG_BarkerPream 0x02 +#define EnCFG_PktBurstMode 0x04 + +/* Bits in the CFG register */ +#define CFG_TKIPOPT 0x80 +#define CFG_RXDMAOPT 0x40 +#define CFG_TMOT_SW 0x20 +#define CFG_TMOT_HWLONG 0x10 +#define CFG_TMOT_HW 0x00 +#define CFG_CFPENDOPT 0x08 +#define CFG_BCNSUSEN 0x04 +#define CFG_NOTXTIMEOUT 0x02 +#define CFG_NOBUFOPT 0x01 + +/* Bits in the TEST register */ +#define TEST_LBEXT 0x80 +#define TEST_LBINT 0x40 +#define TEST_LBNONE 0x00 +#define TEST_SOFTINT 0x20 +#define TEST_CONTTX 0x10 +#define TEST_TXPE 0x08 +#define TEST_NAVDIS 0x04 +#define TEST_NOCTS 0x02 +#define TEST_NOACK 0x01 + +/* Bits in the HOSTCR register */ +#define HOSTCR_TXONST 0x80 +#define HOSTCR_RXONST 0x40 +#define HOSTCR_ADHOC 0x20 +#define HOSTCR_AP 0x10 +#define HOSTCR_TXON 0x08 +#define HOSTCR_RXON 0x04 +#define HOSTCR_MACEN 0x02 +#define HOSTCR_SOFTRST 0x01 + +/* Bits in the MACCR register */ +#define MACCR_SYNCFLUSHOK 0x04 +#define MACCR_SYNCFLUSH 0x02 +#define MACCR_CLRNAV 0x01 + +/* Bits in the RCR register */ +#define RCR_SSID 0x80 +#define RCR_RXALLTYPE 0x40 +#define RCR_UNICAST 0x20 +#define RCR_BROADCAST 0x10 +#define RCR_MULTICAST 0x08 +#define RCR_WPAERR 0x04 +#define RCR_ERRCRC 0x02 +#define RCR_BSSID 0x01 + +/* Bits in the TCR register */ +#define TCR_SYNCDCFOPT 0x02 +#define TCR_AUTOBCNTX 0x01 + +/* ISR1 */ +#define ISR_GPIO3 0x40 +#define ISR_RXNOBUF 0x08 +#define ISR_MIBNEARFULL 0x04 +#define ISR_SOFTINT 0x02 +#define ISR_FETALERR 0x01 + +#define LEDSTS_STS 0x06 +#define LEDSTS_TMLEN 0x78 +#define LEDSTS_OFF 0x00 +#define LEDSTS_ON 0x02 +#define LEDSTS_SLOW 0x04 +#define LEDSTS_INTER 0x06 + +/* ISR0 */ +#define ISR_WATCHDOG 0x80 +#define ISR_SOFTTIMER 0x40 +#define ISR_GPIO0 0x20 +#define ISR_TBTT 0x10 +#define ISR_RXDMA0 0x08 +#define ISR_BNTX 0x04 +#define ISR_ACTX 0x01 + +/* Bits in the PSCFG register */ +#define PSCFG_PHILIPMD 0x40 +#define PSCFG_WAKECALEN 0x20 +#define PSCFG_WAKETMREN 0x10 +#define PSCFG_BBPSPROG 0x08 +#define PSCFG_WAKESYN 0x04 +#define PSCFG_SLEEPSYN 0x02 +#define PSCFG_AUTOSLEEP 0x01 + +/* Bits in the PSCTL register */ +#define PSCTL_WAKEDONE 0x20 +#define PSCTL_PS 0x10 +#define PSCTL_GO2DOZE 0x08 +#define PSCTL_LNBCN 0x04 +#define PSCTL_ALBCN 0x02 +#define PSCTL_PSEN 0x01 + +/* Bits in the PSPWSIG register */ +#define PSSIG_WPE3 0x80 +#define PSSIG_WPE2 0x40 +#define PSSIG_WPE1 0x20 +#define PSSIG_WRADIOPE 0x10 +#define PSSIG_SPE3 0x08 +#define PSSIG_SPE2 0x04 +#define PSSIG_SPE1 0x02 +#define PSSIG_SRADIOPE 0x01 + +/* Bits in the BBREGCTL register */ +#define BBREGCTL_DONE 0x04 +#define BBREGCTL_REGR 0x02 +#define BBREGCTL_REGW 0x01 + +/* Bits in the IFREGCTL register */ +#define IFREGCTL_DONE 0x04 +#define IFREGCTL_IFRF 0x02 +#define IFREGCTL_REGW 0x01 + +/* Bits in the SOFTPWRCTL register */ +#define SOFTPWRCTL_RFLEOPT 0x08 +#define SOFTPWRCTL_TXPEINV 0x02 +#define SOFTPWRCTL_SWPECTI 0x01 +#define SOFTPWRCTL_SWPAPE 0x20 +#define SOFTPWRCTL_SWCALEN 0x10 +#define SOFTPWRCTL_SWRADIO_PE 0x08 +#define SOFTPWRCTL_SWPE2 0x04 +#define SOFTPWRCTL_SWPE1 0x02 +#define SOFTPWRCTL_SWPE3 0x01 + +/* Bits in the GPIOCTL1 register */ +#define GPIO3_MD 0x20 +#define GPIO3_DATA 0x40 +#define GPIO3_INTMD 0x80 + +/* Bits in the MISCFFCTL register */ +#define MISCFFCTL_WRITE 0x0001 + +/* Loopback mode */ +#define MAC_LB_EXT 0x02 +#define MAC_LB_INTERNAL 0x01 +#define MAC_LB_NONE 0x00 + +/* Ethernet address filter type */ +#define PKT_TYPE_NONE 0x00 /* turn off receiver */ +#define PKT_TYPE_ALL_MULTICAST 0x80 +#define PKT_TYPE_PROMISCUOUS 0x40 +#define PKT_TYPE_DIRECTED 0x20 /* obselete */ +#define PKT_TYPE_BROADCAST 0x10 +#define PKT_TYPE_MULTICAST 0x08 +#define PKT_TYPE_ERROR_WPA 0x04 +#define PKT_TYPE_ERROR_CRC 0x02 +#define PKT_TYPE_BSSID 0x01 -// max time out delay time -#define W_MAX_TIMEOUT 0xFFF0U // +#define Default_BI 0x200 -// wait time within loop -#define CB_DELAY_LOOP_WAIT 10 // 10ms +/* MiscFIFO Offset */ +#define MISCFIFO_KEYETRY0 32 +#define MISCFIFO_KEYENTRYSIZE 22 -#define MAC_REVISION_A0 0x00 -#define MAC_REVISION_A1 0x01 +#define MAC_REVISION_A0 0x00 +#define MAC_REVISION_A1 0x01 struct vnt_mac_set_key { union { @@ -414,20 +368,20 @@ struct vnt_mac_set_key { u8 key[WLAN_KEY_LEN_CCMP]; } __packed; -void MACvWriteMultiAddr(struct vnt_private *, u64); -void MACbShutdown(struct vnt_private *); -void MACvSetBBType(struct vnt_private *, u8); -void MACvDisableKeyEntry(struct vnt_private *, u8); -void MACvSetKeyEntry(struct vnt_private *, u16, u32, u32, u8 *, u8 *); -void MACvRegBitsOff(struct vnt_private *, u8, u8); -void MACvRegBitsOn(struct vnt_private *, u8, u8); -void MACvWriteWord(struct vnt_private *, u8, u16); -void MACvWriteBSSIDAddress(struct vnt_private *, u8 *); -void MACvEnableProtectMD(struct vnt_private *); -void MACvDisableProtectMD(struct vnt_private *); -void MACvEnableBarkerPreambleMd(struct vnt_private *); -void MACvDisableBarkerPreambleMd(struct vnt_private *); -void MACvWriteBeaconInterval(struct vnt_private *, u16); +void vnt_mac_set_filter(struct vnt_private *, u64); +void vnt_mac_shutdown(struct vnt_private *); +void vnt_mac_set_bb_type(struct vnt_private *, u8); +void vnt_mac_disable_keyentry(struct vnt_private *, u8); +void vnt_mac_set_keyentry(struct vnt_private *, u16, u32, u32, u8 *, u8 *); +void vnt_mac_reg_bits_off(struct vnt_private *, u8, u8); +void vnt_mac_reg_bits_on(struct vnt_private *, u8, u8); +void vnt_mac_write_word(struct vnt_private *, u8, u16); +void vnt_mac_set_bssid_addr(struct vnt_private *, u8 *); +void vnt_mac_enable_protect_mode(struct vnt_private *); +void vnt_mac_disable_protect_mode(struct vnt_private *); +void vnt_mac_enable_barker_preamble_mode(struct vnt_private *); +void vnt_mac_disable_barker_preamble_mode(struct vnt_private *); +void vnt_mac_set_beacon_interval(struct vnt_private *, u16); void vnt_mac_set_led(struct vnt_private *priv, u8, u8); #endif /* __MAC_H__ */ diff --git a/drivers/staging/vt6656/main_usb.c b/drivers/staging/vt6656/main_usb.c index e18071f121c5..422fcbabafac 100644 --- a/drivers/staging/vt6656/main_usb.c +++ b/drivers/staging/vt6656/main_usb.c @@ -27,20 +27,8 @@ * Functions: * * vt6656_probe - module initial (insmod) driver entry - * device_remove1 - module remove entry - * device_open - allocate dma/descripter resource & initial mac/bbp function - * device_xmit - asynchronous data tx function - * device_set_multi - set mac filter - * device_ioctl - ioctl entry - * device_close - shutdown mac/bbp & free dma/descriptor resource - * device_alloc_frag_buf - rx fragement pre-allocated function - * device_free_tx_bufs - free tx buffer function - * device_dma0_tx_80211- tx 802.11 frame via dma0 - * device_dma0_xmit- tx PS buffered frame via dma0 - * device_init_registers- initial MAC & BBP & RF internal registers. - * device_init_rings- initial tx/rx ring buffer - * device_init_defrag_cb- initial & allocate de-fragement buffer. - * device_tx_srv- tx interrupt service function + * vnt_free_tx_bufs - free tx buffer function + * vnt_init_registers- initial MAC & BBP & RF internal registers. * * Revision History: */ @@ -51,27 +39,15 @@ #include "card.h" #include "baseband.h" #include "mac.h" -#include "tether.h" -#include "wmgr.h" -#include "wctl.h" #include "power.h" #include "wcmd.h" -#include "iocmd.h" #include "rxtx.h" -#include "bssdb.h" -#include "wpactl.h" -#include "iwctl.h" #include "dpc.h" -#include "datarate.h" #include "rf.h" #include "firmware.h" #include "usbpipe.h" #include "channel.h" #include "int.h" -#include "iowpa.h" - -/* static int msglevel = MSG_LEVEL_DEBUG; */ -static int msglevel =MSG_LEVEL_INFO; /* * define module options @@ -84,77 +60,20 @@ MODULE_AUTHOR(DRIVER_AUTHOR); MODULE_LICENSE("GPL"); MODULE_DESCRIPTION(DEVICE_FULL_DRV_NAM); -#define DEVICE_PARAM(N,D) \ - static int N[MAX_UINTS]=OPTION_DEFAULT;\ - module_param_array(N, int, NULL, 0);\ - MODULE_PARM_DESC(N, D); - -#define RX_DESC_DEF0 64 -DEVICE_PARAM(RxDescriptors0,"Number of receive usb desc buffer"); - -#define TX_DESC_DEF0 64 -DEVICE_PARAM(TxDescriptors0,"Number of transmit usb desc buffer"); +#define RX_DESC_DEF0 64 +static int vnt_rx_buffers = RX_DESC_DEF0; +module_param_named(rx_buffers, vnt_rx_buffers, int, 0644); +MODULE_PARM_DESC(rx_buffers, "Number of receive usb rx buffers"); -#define CHANNEL_DEF 6 -DEVICE_PARAM(Channel, "Channel number"); - -/* PreambleType[] is the preamble length used for transmit. - 0: indicate allows long preamble type - 1: indicate allows short preamble type -*/ - -#define PREAMBLE_TYPE_DEF 1 - -DEVICE_PARAM(PreambleType, "Preamble Type"); +#define TX_DESC_DEF0 64 +static int vnt_tx_buffers = TX_DESC_DEF0; +module_param_named(tx_buffers, vnt_tx_buffers, int, 0644); +MODULE_PARM_DESC(tx_buffers, "Number of receive usb tx buffers"); #define RTS_THRESH_DEF 2347 -DEVICE_PARAM(RTSThreshold, "RTS threshold"); - #define FRAG_THRESH_DEF 2346 -DEVICE_PARAM(FragThreshold, "Fragmentation threshold"); - -#define DATA_RATE_DEF 13 -/* datarate[] index - 0: indicate 1 Mbps 0x02 - 1: indicate 2 Mbps 0x04 - 2: indicate 5.5 Mbps 0x0B - 3: indicate 11 Mbps 0x16 - 4: indicate 6 Mbps 0x0c - 5: indicate 9 Mbps 0x12 - 6: indicate 12 Mbps 0x18 - 7: indicate 18 Mbps 0x24 - 8: indicate 24 Mbps 0x30 - 9: indicate 36 Mbps 0x48 - 10: indicate 48 Mbps 0x60 - 11: indicate 54 Mbps 0x6c - 12: indicate 72 Mbps 0x90 - 13: indicate auto rate -*/ - -DEVICE_PARAM(ConnectionRate, "Connection data rate"); - -#define OP_MODE_DEF 0 -DEVICE_PARAM(OPMode, "Infrastruct, adhoc, AP mode "); - -/* OpMode[] is used for transmit. - 0: indicate infrastruct mode used - 1: indicate adhoc mode used - 2: indicate AP mode used -*/ - -/* PSMode[] - 0: indicate disable power saving mode - 1: indicate enable power saving mode -*/ - -#define PS_MODE_DEF 0 -DEVICE_PARAM(PSMode, "Power saving mode"); - #define SHORT_RETRY_DEF 8 -DEVICE_PARAM(ShortRetryLimit, "Short frame retry limits"); - #define LONG_RETRY_DEF 4 -DEVICE_PARAM(LongRetryLimit, "long frame retry limits"); /* BasebandType[] baseband type selected 0: indicate 802.11a type @@ -163,16 +82,6 @@ DEVICE_PARAM(LongRetryLimit, "long frame retry limits"); */ #define BBP_TYPE_DEF 2 -DEVICE_PARAM(BasebandType, "baseband type"); - -/* 80211hEnable[] - 0: indicate disable 802.11h - 1: indicate enable 802.11h -*/ - -#define X80211h_MODE_DEF 0 - -DEVICE_PARAM(b80211hEnable, "802.11h mode"); /* * Static vars definitions @@ -183,501 +92,287 @@ static struct usb_device_id vt6656_table[] = { {} }; -/* frequency list (map channels to frequencies) */ -/* -static const long frequency_list[] = { - 2412, 2417, 2422, 2427, 2432, 2437, 2442, 2447, 2452, 2457, 2462, 2467, 2472, 2484, - 4915, 4920, 4925, 4935, 4940, 4945, 4960, 4980, - 5035, 5040, 5045, 5055, 5060, 5080, 5170, 5180, 5190, 5200, 5210, 5220, 5230, 5240, - 5260, 5280, 5300, 5320, 5500, 5520, 5540, 5560, 5580, 5600, 5620, 5640, 5660, 5680, - 5700, 5745, 5765, 5785, 5805, 5825 - }; - -static const struct iw_handler_def iwctl_handler_def; -*/ - -static int vt6656_probe(struct usb_interface *intf, - const struct usb_device_id *id); -static void vt6656_disconnect(struct usb_interface *intf); - -#ifdef CONFIG_PM /* Minimal support for suspend and resume */ -static int vt6656_suspend(struct usb_interface *intf, pm_message_t message); -static int vt6656_resume(struct usb_interface *intf); -#endif /* CONFIG_PM */ +static void vnt_set_options(struct vnt_private *priv) +{ + /* Set number of TX buffers */ + if (vnt_tx_buffers < CB_MIN_TX_DESC || vnt_tx_buffers > CB_MAX_TX_DESC) + priv->num_tx_context = TX_DESC_DEF0; + else + priv->num_tx_context = vnt_tx_buffers; -static struct net_device_stats *device_get_stats(struct net_device *dev); -static int device_open(struct net_device *dev); -static int device_xmit(struct sk_buff *skb, struct net_device *dev); -static void device_set_multi(struct net_device *dev); -static int device_close(struct net_device *dev); -static int device_ioctl(struct net_device *dev, struct ifreq *rq, int cmd); - -static int device_init_registers(struct vnt_private *pDevice); -static bool device_init_defrag_cb(struct vnt_private *pDevice); - -static int ethtool_ioctl(struct net_device *dev, struct ifreq *); -static void device_free_tx_bufs(struct vnt_private *pDevice); -static void device_free_rx_bufs(struct vnt_private *pDevice); -static void device_free_int_bufs(struct vnt_private *pDevice); -static void device_free_frag_bufs(struct vnt_private *pDevice); -static bool device_alloc_bufs(struct vnt_private *pDevice); - -static int Read_config_file(struct vnt_private *pDevice); -static unsigned char *Config_FileOperation(struct vnt_private *pDevice); -static int Config_FileGetParameter(unsigned char *string, - unsigned char *dest, - unsigned char *source); - -static void usb_device_reset(struct vnt_private *pDevice); - -static void -device_set_options(struct vnt_private *pDevice) { - - u8 abyBroadcastAddr[ETH_ALEN] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; - u8 abySNAP_RFC1042[ETH_ALEN] = {0xAA, 0xAA, 0x03, 0x00, 0x00, 0x00}; - u8 abySNAP_Bridgetunnel[ETH_ALEN] = {0xAA, 0xAA, 0x03, 0x00, 0x00, 0xF8}; - - memcpy(pDevice->abyBroadcastAddr, abyBroadcastAddr, ETH_ALEN); - memcpy(pDevice->abySNAP_RFC1042, abySNAP_RFC1042, ETH_ALEN); - memcpy(pDevice->abySNAP_Bridgetunnel, abySNAP_Bridgetunnel, ETH_ALEN); - - pDevice->cbTD = TX_DESC_DEF0; - pDevice->cbRD = RX_DESC_DEF0; - pDevice->uChannel = CHANNEL_DEF; - pDevice->wRTSThreshold = RTS_THRESH_DEF; - pDevice->wFragmentationThreshold = FRAG_THRESH_DEF; - pDevice->byShortRetryLimit = SHORT_RETRY_DEF; - pDevice->byLongRetryLimit = LONG_RETRY_DEF; - pDevice->wMaxTransmitMSDULifetime = DEFAULT_MSDU_LIFETIME; - pDevice->byShortPreamble = PREAMBLE_TYPE_DEF; - pDevice->ePSMode = PS_MODE_DEF; - pDevice->b11hEnable = X80211h_MODE_DEF; - pDevice->op_mode = NL80211_IFTYPE_UNSPECIFIED; - pDevice->uConnectionRate = DATA_RATE_DEF; - if (pDevice->uConnectionRate < RATE_AUTO) pDevice->bFixRate = true; - pDevice->byBBType = BBP_TYPE_DEF; - pDevice->byPacketType = pDevice->byBBType; - pDevice->byAutoFBCtrl = AUTO_FB_0; - pDevice->byPreambleType = 0; - pDevice->bExistSWNetAddr = false; + /* Set number of RX buffers */ + if (vnt_rx_buffers < CB_MIN_RX_DESC || vnt_rx_buffers > CB_MAX_RX_DESC) + priv->num_rcb = RX_DESC_DEF0; + else + priv->num_rcb = vnt_rx_buffers; + + priv->short_retry_limit = SHORT_RETRY_DEF; + priv->long_retry_limit = LONG_RETRY_DEF; + priv->op_mode = NL80211_IFTYPE_UNSPECIFIED; + priv->bb_type = BBP_TYPE_DEF; + priv->packet_type = priv->bb_type; + priv->auto_fb_ctrl = AUTO_FB_0; + priv->preamble_type = 0; + priv->exist_sw_net_addr = false; } /* * initialization of MAC & BBP registers */ -static int device_init_registers(struct vnt_private *pDevice) +static int vnt_init_registers(struct vnt_private *priv) { - struct vnt_manager *pMgmt = &pDevice->vnt_mgmt; - struct vnt_cmd_card_init *init_cmd = &pDevice->init_command; - struct vnt_rsp_card_init *init_rsp = &pDevice->init_response; - u8 abyBroadcastAddr[ETH_ALEN] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; - u8 abySNAP_RFC1042[ETH_ALEN] = {0xaa, 0xaa, 0x03, 0x00, 0x00, 0x00}; - u8 abySNAP_Bridgetunnel[ETH_ALEN] - = {0xaa, 0xaa, 0x03, 0x00, 0x00, 0xf8}; - u8 byAntenna; + struct vnt_cmd_card_init *init_cmd = &priv->init_command; + struct vnt_rsp_card_init *init_rsp = &priv->init_response; + u8 antenna; int ii; - int ntStatus = STATUS_SUCCESS; - u8 byTmp; - u8 byCalibTXIQ = 0, byCalibTXDC = 0, byCalibRXIQ = 0; - - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "---->INIbInitAdapter. [%d][%d]\n", - DEVICE_INIT_COLD, pDevice->byPacketType); - - memcpy(pDevice->abyBroadcastAddr, abyBroadcastAddr, ETH_ALEN); - memcpy(pDevice->abySNAP_RFC1042, abySNAP_RFC1042, ETH_ALEN); - memcpy(pDevice->abySNAP_Bridgetunnel, abySNAP_Bridgetunnel, ETH_ALEN); - - if (!FIRMWAREbCheckVersion(pDevice)) { - if (FIRMWAREbDownload(pDevice) == true) { - if (FIRMWAREbBrach2Sram(pDevice) == false) { - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO - " FIRMWAREbBrach2Sram fail\n"); + int status = STATUS_SUCCESS; + u8 tmp; + u8 calib_tx_iq = 0, calib_tx_dc = 0, calib_rx_iq = 0; + + dev_dbg(&priv->usb->dev, "---->INIbInitAdapter. [%d][%d]\n", + DEVICE_INIT_COLD, priv->packet_type); + + if (!vnt_check_firmware_version(priv)) { + if (vnt_download_firmware(priv) == true) { + if (vnt_firmware_branch_to_sram(priv) == false) { + dev_dbg(&priv->usb->dev, + " vnt_firmware_branch_to_sram fail\n"); return false; } } else { - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO - " FIRMWAREbDownload fail\n"); + dev_dbg(&priv->usb->dev, "FIRMWAREbDownload fail\n"); return false; } } - if (!BBbVT3184Init(pDevice)) { - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO" BBbVT3184Init fail\n"); + if (!vnt_vt3184_init(priv)) { + dev_dbg(&priv->usb->dev, "vnt_vt3184_init fail\n"); return false; } init_cmd->init_class = DEVICE_INIT_COLD; - init_cmd->exist_sw_net_addr = (u8) pDevice->bExistSWNetAddr; + init_cmd->exist_sw_net_addr = priv->exist_sw_net_addr; for (ii = 0; ii < 6; ii++) - init_cmd->sw_net_addr[ii] = pDevice->abyCurrentNetAddr[ii]; - init_cmd->short_retry_limit = pDevice->byShortRetryLimit; - init_cmd->long_retry_limit = pDevice->byLongRetryLimit; + init_cmd->sw_net_addr[ii] = priv->current_net_addr[ii]; + init_cmd->short_retry_limit = priv->short_retry_limit; + init_cmd->long_retry_limit = priv->long_retry_limit; /* issue card_init command to device */ - ntStatus = vnt_control_out(pDevice, + status = vnt_control_out(priv, MESSAGE_TYPE_CARDINIT, 0, 0, sizeof(struct vnt_cmd_card_init), (u8 *)init_cmd); - if (ntStatus != STATUS_SUCCESS) { - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO" Issue Card init fail\n"); + if (status != STATUS_SUCCESS) { + dev_dbg(&priv->usb->dev, "Issue Card init fail\n"); return false; } - ntStatus = vnt_control_in(pDevice, MESSAGE_TYPE_INIT_RSP, 0, 0, + status = vnt_control_in(priv, MESSAGE_TYPE_INIT_RSP, 0, 0, sizeof(struct vnt_rsp_card_init), (u8 *)init_rsp); - if (ntStatus != STATUS_SUCCESS) { - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO + if (status != STATUS_SUCCESS) { + dev_dbg(&priv->usb->dev, "Cardinit request in status fail!\n"); return false; } /* local ID for AES functions */ - ntStatus = vnt_control_in(pDevice, MESSAGE_TYPE_READ, + status = vnt_control_in(priv, MESSAGE_TYPE_READ, MAC_REG_LOCALID, MESSAGE_REQUEST_MACREG, 1, - &pDevice->byLocalID); - if (ntStatus != STATUS_SUCCESS) + &priv->local_id); + if (status != STATUS_SUCCESS) return false; /* do MACbSoftwareReset in MACvInitialize */ - pDevice->bProtectMode = false; - /* only used in 11g type, sync with ERP IE */ - pDevice->bNonERPPresent = false; - pDevice->bBarkerPreambleMd = false; - if (pDevice->bFixRate) { - pDevice->wCurrentRate = (u16)pDevice->uConnectionRate; - } else { - if (pDevice->byBBType == BB_TYPE_11B) - pDevice->wCurrentRate = RATE_11M; - else - pDevice->wCurrentRate = RATE_54M; - } - - CHvInitChannelTable(pDevice); - - pDevice->byTopOFDMBasicRate = RATE_24M; - pDevice->byTopCCKBasicRate = RATE_1M; + priv->top_ofdm_basic_rate = RATE_24M; + priv->top_cck_basic_rate = RATE_1M; /* target to IF pin while programming to RF chip */ - pDevice->byCurPwr = 0xFF; + priv->power = 0xFF; - pDevice->byCCKPwr = pDevice->abyEEPROM[EEP_OFS_PWR_CCK]; - pDevice->byOFDMPwrG = pDevice->abyEEPROM[EEP_OFS_PWR_OFDMG]; + priv->cck_pwr = priv->eeprom[EEP_OFS_PWR_CCK]; + priv->ofdm_pwr_g = priv->eeprom[EEP_OFS_PWR_OFDMG]; /* load power table */ for (ii = 0; ii < 14; ii++) { - pDevice->abyCCKPwrTbl[ii] = - pDevice->abyEEPROM[ii + EEP_OFS_CCK_PWR_TBL]; - - if (pDevice->abyCCKPwrTbl[ii] == 0) - pDevice->abyCCKPwrTbl[ii] = pDevice->byCCKPwr; - pDevice->abyOFDMPwrTbl[ii] = - pDevice->abyEEPROM[ii + EEP_OFS_OFDM_PWR_TBL]; - if (pDevice->abyOFDMPwrTbl[ii] == 0) - pDevice->abyOFDMPwrTbl[ii] = pDevice->byOFDMPwrG; + priv->cck_pwr_tbl[ii] = + priv->eeprom[ii + EEP_OFS_CCK_PWR_TBL]; + if (priv->cck_pwr_tbl[ii] == 0) + priv->cck_pwr_tbl[ii] = priv->cck_pwr; + + priv->ofdm_pwr_tbl[ii] = + priv->eeprom[ii + EEP_OFS_OFDM_PWR_TBL]; + if (priv->ofdm_pwr_tbl[ii] == 0) + priv->ofdm_pwr_tbl[ii] = priv->ofdm_pwr_g; } /* * original zonetype is USA, but custom zonetype is Europe, * then need to recover 12, 13, 14 channels with 11 channel */ - if (((pDevice->abyEEPROM[EEP_OFS_ZONETYPE] == ZoneType_Japan) || - (pDevice->abyEEPROM[EEP_OFS_ZONETYPE] == ZoneType_Europe)) && - (pDevice->byOriginalZonetype == ZoneType_USA)) { - for (ii = 11; ii < 14; ii++) { - pDevice->abyCCKPwrTbl[ii] = pDevice->abyCCKPwrTbl[10]; - pDevice->abyOFDMPwrTbl[ii] = pDevice->abyOFDMPwrTbl[10]; - } + for (ii = 11; ii < 14; ii++) { + priv->cck_pwr_tbl[ii] = priv->cck_pwr_tbl[10]; + priv->ofdm_pwr_tbl[ii] = priv->ofdm_pwr_tbl[10]; } - pDevice->byOFDMPwrA = 0x34; /* same as RFbMA2829SelectChannel */ + priv->ofdm_pwr_a = 0x34; /* same as RFbMA2829SelectChannel */ /* load OFDM A power table */ for (ii = 0; ii < CB_MAX_CHANNEL_5G; ii++) { - pDevice->abyOFDMAPwrTbl[ii] = - pDevice->abyEEPROM[ii + EEP_OFS_OFDMA_PWR_TBL]; + priv->ofdm_a_pwr_tbl[ii] = + priv->eeprom[ii + EEP_OFS_OFDMA_PWR_TBL]; - if (pDevice->abyOFDMAPwrTbl[ii] == 0) - pDevice->abyOFDMAPwrTbl[ii] = pDevice->byOFDMPwrA; + if (priv->ofdm_a_pwr_tbl[ii] == 0) + priv->ofdm_a_pwr_tbl[ii] = priv->ofdm_pwr_a; } - byAntenna = pDevice->abyEEPROM[EEP_OFS_ANTENNA]; + antenna = priv->eeprom[EEP_OFS_ANTENNA]; - if (byAntenna & EEP_ANTINV) - pDevice->bTxRxAntInv = true; + if (antenna & EEP_ANTINV) + priv->tx_rx_ant_inv = true; else - pDevice->bTxRxAntInv = false; + priv->tx_rx_ant_inv = false; - byAntenna &= (EEP_ANTENNA_AUX | EEP_ANTENNA_MAIN); + antenna &= (EEP_ANTENNA_AUX | EEP_ANTENNA_MAIN); - if (byAntenna == 0) /* if not set default is both */ - byAntenna = (EEP_ANTENNA_AUX | EEP_ANTENNA_MAIN); + if (antenna == 0) /* if not set default is both */ + antenna = (EEP_ANTENNA_AUX | EEP_ANTENNA_MAIN); - if (byAntenna == (EEP_ANTENNA_AUX | EEP_ANTENNA_MAIN)) { - pDevice->byAntennaCount = 2; - pDevice->byTxAntennaMode = ANT_B; - pDevice->dwTxAntennaSel = 1; - pDevice->dwRxAntennaSel = 1; + if (antenna == (EEP_ANTENNA_AUX | EEP_ANTENNA_MAIN)) { + priv->tx_antenna_mode = ANT_B; + priv->rx_antenna_sel = 1; - if (pDevice->bTxRxAntInv == true) - pDevice->byRxAntennaMode = ANT_A; + if (priv->tx_rx_ant_inv == true) + priv->rx_antenna_mode = ANT_A; else - pDevice->byRxAntennaMode = ANT_B; + priv->rx_antenna_mode = ANT_B; } else { - pDevice->byAntennaCount = 1; - pDevice->dwTxAntennaSel = 0; - pDevice->dwRxAntennaSel = 0; + priv->rx_antenna_sel = 0; - if (byAntenna & EEP_ANTENNA_AUX) { - pDevice->byTxAntennaMode = ANT_A; + if (antenna & EEP_ANTENNA_AUX) { + priv->tx_antenna_mode = ANT_A; - if (pDevice->bTxRxAntInv == true) - pDevice->byRxAntennaMode = ANT_B; + if (priv->tx_rx_ant_inv == true) + priv->rx_antenna_mode = ANT_B; else - pDevice->byRxAntennaMode = ANT_A; + priv->rx_antenna_mode = ANT_A; } else { - pDevice->byTxAntennaMode = ANT_B; + priv->tx_antenna_mode = ANT_B; - if (pDevice->bTxRxAntInv == true) - pDevice->byRxAntennaMode = ANT_A; + if (priv->tx_rx_ant_inv == true) + priv->rx_antenna_mode = ANT_A; else - pDevice->byRxAntennaMode = ANT_B; + priv->rx_antenna_mode = ANT_B; } } + /* Set initial antenna mode */ + vnt_set_antenna_mode(priv, priv->rx_antenna_mode); + /* get Auto Fall Back type */ - pDevice->byAutoFBCtrl = AUTO_FB_0; + priv->auto_fb_ctrl = AUTO_FB_0; /* default Auto Mode */ - /* pDevice->NetworkType = Ndis802_11Automode; */ - pDevice->eConfigPHYMode = PHY_TYPE_AUTO; - pDevice->byBBType = BB_TYPE_11G; - - /* get channel range */ - pDevice->byMinChannel = 1; - pDevice->byMaxChannel = CB_MAX_CHANNEL; + priv->bb_type = BB_TYPE_11G; /* get RFType */ - pDevice->byRFType = init_rsp->rf_type; + priv->rf_type = init_rsp->rf_type; /* load vt3266 calibration parameters in EEPROM */ - if (pDevice->byRFType == RF_VT3226D0) { - if ((pDevice->abyEEPROM[EEP_OFS_MAJOR_VER] == 0x1) && - (pDevice->abyEEPROM[EEP_OFS_MINOR_VER] >= 0x4)) { - - byCalibTXIQ = pDevice->abyEEPROM[EEP_OFS_CALIB_TX_IQ]; - byCalibTXDC = pDevice->abyEEPROM[EEP_OFS_CALIB_TX_DC]; - byCalibRXIQ = pDevice->abyEEPROM[EEP_OFS_CALIB_RX_IQ]; - if (byCalibTXIQ || byCalibTXDC || byCalibRXIQ) { - /* CR255, enable TX/RX IQ and DC compensation mode */ - vnt_control_out_u8(pDevice, - MESSAGE_REQUEST_BBREG, - 0xff, - 0x03); - /* CR251, TX I/Q Imbalance Calibration */ - vnt_control_out_u8(pDevice, - MESSAGE_REQUEST_BBREG, - 0xfb, - byCalibTXIQ); - /* CR252, TX DC-Offset Calibration */ - vnt_control_out_u8(pDevice, - MESSAGE_REQUEST_BBREG, - 0xfC, - byCalibTXDC); - /* CR253, RX I/Q Imbalance Calibration */ - vnt_control_out_u8(pDevice, - MESSAGE_REQUEST_BBREG, - 0xfd, - byCalibRXIQ); + if (priv->rf_type == RF_VT3226D0) { + if ((priv->eeprom[EEP_OFS_MAJOR_VER] == 0x1) && + (priv->eeprom[EEP_OFS_MINOR_VER] >= 0x4)) { + + calib_tx_iq = priv->eeprom[EEP_OFS_CALIB_TX_IQ]; + calib_tx_dc = priv->eeprom[EEP_OFS_CALIB_TX_DC]; + calib_rx_iq = priv->eeprom[EEP_OFS_CALIB_RX_IQ]; + if (calib_tx_iq || calib_tx_dc || calib_rx_iq) { + /* CR255, enable TX/RX IQ and + DC compensation mode */ + vnt_control_out_u8(priv, + MESSAGE_REQUEST_BBREG, + 0xff, + 0x03); + /* CR251, TX I/Q Imbalance Calibration */ + vnt_control_out_u8(priv, + MESSAGE_REQUEST_BBREG, + 0xfb, + calib_tx_iq); + /* CR252, TX DC-Offset Calibration */ + vnt_control_out_u8(priv, + MESSAGE_REQUEST_BBREG, + 0xfC, + calib_tx_dc); + /* CR253, RX I/Q Imbalance Calibration */ + vnt_control_out_u8(priv, + MESSAGE_REQUEST_BBREG, + 0xfd, + calib_rx_iq); } else { - /* CR255, turn off BB Calibration compensation */ - vnt_control_out_u8(pDevice, - MESSAGE_REQUEST_BBREG, - 0xff, - 0x0); + /* CR255, turn off + BB Calibration compensation */ + vnt_control_out_u8(priv, + MESSAGE_REQUEST_BBREG, + 0xff, + 0x0); } } } - pMgmt->eScanType = WMAC_SCAN_PASSIVE; - pMgmt->uCurrChannel = pDevice->uChannel; - pMgmt->uIBSSChannel = pDevice->uChannel; - CARDbSetMediaChannel(pDevice, pMgmt->uCurrChannel); - /* get permanent network address */ - memcpy(pDevice->abyPermanentNetAddr, init_rsp->net_addr, 6); - memcpy(pDevice->abyCurrentNetAddr, - pDevice->abyPermanentNetAddr, ETH_ALEN); + memcpy(priv->permanent_net_addr, init_rsp->net_addr, 6); + memcpy(priv->current_net_addr, priv->permanent_net_addr, ETH_ALEN); /* if exist SW network address, use it */ - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Network address = %pM\n", - pDevice->abyCurrentNetAddr); + dev_dbg(&priv->usb->dev, "Network address = %pM\n", + priv->current_net_addr); /* * set BB and packet type at the same time * set Short Slot Time, xIFS, and RSPINF */ - if (pDevice->byBBType == BB_TYPE_11A) { - CARDbAddBasicRate(pDevice, RATE_6M); - pDevice->bShortSlotTime = true; - } else { - CARDbAddBasicRate(pDevice, RATE_1M); - pDevice->bShortSlotTime = false; - } - - BBvSetShortSlotTime(pDevice); - CARDvSetBSSMode(pDevice); - - pDevice->byBBVGACurrent = pDevice->abyBBVGA[0]; - pDevice->byBBVGANew = pDevice->byBBVGACurrent; + if (priv->bb_type == BB_TYPE_11A) + priv->short_slot_time = true; + else + priv->short_slot_time = false; - BBvSetVGAGainOffset(pDevice, pDevice->abyBBVGA[0]); + vnt_set_short_slot_time(priv); - pDevice->byRadioCtl = pDevice->abyEEPROM[EEP_OFS_RADIOCTL]; - pDevice->bHWRadioOff = false; + priv->radio_ctl = priv->eeprom[EEP_OFS_RADIOCTL]; - if ((pDevice->byRadioCtl & EEP_RADIOCTL_ENABLE) != 0) { - ntStatus = vnt_control_in(pDevice, MESSAGE_TYPE_READ, - MAC_REG_GPIOCTL1, MESSAGE_REQUEST_MACREG, 1, &byTmp); + if ((priv->radio_ctl & EEP_RADIOCTL_ENABLE) != 0) { + status = vnt_control_in(priv, MESSAGE_TYPE_READ, + MAC_REG_GPIOCTL1, MESSAGE_REQUEST_MACREG, 1, &tmp); - if (ntStatus != STATUS_SUCCESS) + if (status != STATUS_SUCCESS) return false; - if ((byTmp & GPIO3_DATA) == 0) { - pDevice->bHWRadioOff = true; - MACvRegBitsOn(pDevice, MAC_REG_GPIOCTL1, GPIO3_INTMD); - } else { - MACvRegBitsOff(pDevice, MAC_REG_GPIOCTL1, GPIO3_INTMD); - pDevice->bHWRadioOff = false; - } - + if ((tmp & GPIO3_DATA) == 0) + vnt_mac_reg_bits_on(priv, MAC_REG_GPIOCTL1, + GPIO3_INTMD); + else + vnt_mac_reg_bits_off(priv, MAC_REG_GPIOCTL1, + GPIO3_INTMD); } - vnt_mac_set_led(pDevice, LEDSTS_TMLEN, 0x38); + vnt_mac_set_led(priv, LEDSTS_TMLEN, 0x38); - vnt_mac_set_led(pDevice, LEDSTS_STS, LEDSTS_SLOW); + vnt_mac_set_led(priv, LEDSTS_STS, LEDSTS_SLOW); - MACvRegBitsOn(pDevice, MAC_REG_GPIOCTL0, 0x01); + vnt_mac_reg_bits_on(priv, MAC_REG_GPIOCTL0, 0x01); - if ((pDevice->bHWRadioOff == true) || - (pDevice->bRadioControlOff == true)) { - CARDbRadioPowerOff(pDevice); - } else { - CARDbRadioPowerOn(pDevice); - } + vnt_radio_power_on(priv); - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"<----INIbInitAdapter Exit\n"); + dev_dbg(&priv->usb->dev, "<----INIbInitAdapter Exit\n"); return true; } -#ifdef CONFIG_PM /* Minimal support for suspend and resume */ - -static int vt6656_suspend(struct usb_interface *intf, pm_message_t message) -{ - struct vnt_private *device = usb_get_intfdata(intf); - - if (!device || !device->dev) - return -ENODEV; - - if (device->flags & DEVICE_FLAGS_OPENED) - device_close(device->dev); - - return 0; -} - -static int vt6656_resume(struct usb_interface *intf) -{ - struct vnt_private *device = usb_get_intfdata(intf); - - if (!device || !device->dev) - return -ENODEV; - - if (!(device->flags & DEVICE_FLAGS_OPENED)) - device_open(device->dev); - - return 0; -} - -#endif /* CONFIG_PM */ - -static const struct net_device_ops device_netdev_ops = { - .ndo_open = device_open, - .ndo_stop = device_close, - .ndo_do_ioctl = device_ioctl, - .ndo_get_stats = device_get_stats, - .ndo_start_xmit = device_xmit, - .ndo_set_rx_mode = device_set_multi, -}; - -static int -vt6656_probe(struct usb_interface *intf, const struct usb_device_id *id) -{ - u8 fake_mac[ETH_ALEN] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x01}; - struct usb_device *udev = interface_to_usbdev(intf); - int rc = 0; - struct net_device *netdev = NULL; - struct vnt_private *pDevice; - - printk(KERN_NOTICE "%s Ver. %s\n", DEVICE_FULL_DRV_NAM, DEVICE_VERSION); - printk(KERN_NOTICE "Copyright (c) 2004 VIA Networking Technologies, Inc.\n"); - - udev = usb_get_dev(udev); - netdev = alloc_etherdev(sizeof(struct vnt_private)); - if (!netdev) { - printk(KERN_ERR DEVICE_NAME ": allocate net device failed\n"); - rc = -ENOMEM; - goto err_nomem; - } - - pDevice = netdev_priv(netdev); - memset(pDevice, 0, sizeof(struct vnt_private)); - - pDevice->dev = netdev; - pDevice->usb = udev; - - device_set_options(pDevice); - spin_lock_init(&pDevice->lock); - mutex_init(&pDevice->usb_lock); - - INIT_DELAYED_WORK(&pDevice->run_command_work, vRunCommand); - INIT_DELAYED_WORK(&pDevice->second_callback_work, BSSvSecondCallBack); - INIT_WORK(&pDevice->read_work_item, RXvWorkItem); - INIT_WORK(&pDevice->rx_mng_work_item, RXvMngWorkItem); - - pDevice->vnt_mgmt.pAdapter = (void *) pDevice; - - netdev->netdev_ops = &device_netdev_ops; - netdev->wireless_handlers = - (struct iw_handler_def *) &iwctl_handler_def; - - usb_set_intfdata(intf, pDevice); - SET_NETDEV_DEV(netdev, &intf->dev); - memcpy(pDevice->dev->dev_addr, fake_mac, ETH_ALEN); - - usb_device_reset(pDevice); - - rc = register_netdev(netdev); - if (rc) { - printk(KERN_ERR DEVICE_NAME " Failed to register netdev\n"); - goto err_netdev; - } - - return 0; - -err_netdev: - free_netdev(netdev); -err_nomem: - usb_put_dev(udev); - - return rc; -} - -static void device_free_tx_bufs(struct vnt_private *priv) +static void vnt_free_tx_bufs(struct vnt_private *priv) { struct vnt_usb_send_context *tx_context; int ii; - for (ii = 0; ii < priv->cbTD; ii++) { - tx_context = priv->apTD[ii]; + for (ii = 0; ii < priv->num_tx_context; ii++) { + tx_context = priv->tx_context[ii]; /* deallocate URBs */ if (tx_context->urb) { usb_kill_urb(tx_context->urb); @@ -686,677 +381,670 @@ static void device_free_tx_bufs(struct vnt_private *priv) kfree(tx_context); } - - return; } -static void device_free_rx_bufs(struct vnt_private *priv) +static void vnt_free_rx_bufs(struct vnt_private *priv) { struct vnt_rcb *rcb; int ii; - for (ii = 0; ii < priv->cbRD; ii++) { - rcb = priv->apRCB[ii]; + for (ii = 0; ii < priv->num_rcb; ii++) { + rcb = priv->rcb[ii]; + if (!rcb) + continue; /* deallocate URBs */ - if (rcb->pUrb) { - usb_kill_urb(rcb->pUrb); - usb_free_urb(rcb->pUrb); + if (rcb->urb) { + usb_kill_urb(rcb->urb); + usb_free_urb(rcb->urb); } /* deallocate skb */ if (rcb->skb) dev_kfree_skb(rcb->skb); - } - kfree(priv->pRCBMem); - - return; + kfree(rcb); + } } -static void usb_device_reset(struct vnt_private *pDevice) +static void usb_device_reset(struct vnt_private *priv) { - int status; - status = usb_reset_device(pDevice->usb); + int status; + + status = usb_reset_device(priv->usb); if (status) - printk("usb_device_reset fail status=%d\n",status); - return ; + dev_warn(&priv->usb->dev, + "usb_device_reset fail status=%d\n", status); } -static void device_free_int_bufs(struct vnt_private *priv) +static void vnt_free_int_bufs(struct vnt_private *priv) { kfree(priv->int_buf.data_buf); - - return; } -static bool device_alloc_bufs(struct vnt_private *priv) +static bool vnt_alloc_bufs(struct vnt_private *priv) { struct vnt_usb_send_context *tx_context; struct vnt_rcb *rcb; int ii; - for (ii = 0; ii < priv->cbTD; ii++) { + for (ii = 0; ii < priv->num_tx_context; ii++) { tx_context = kmalloc(sizeof(struct vnt_usb_send_context), GFP_KERNEL); if (tx_context == NULL) { - DBG_PRT(MSG_LEVEL_ERR, KERN_ERR - "%s : allocate tx usb context failed\n", - priv->dev->name); + dev_err(&priv->usb->dev, + "allocate tx usb context failed\n"); goto free_tx; } - priv->apTD[ii] = tx_context; + priv->tx_context[ii] = tx_context; tx_context->priv = priv; + tx_context->pkt_no = ii; /* allocate URBs */ tx_context->urb = usb_alloc_urb(0, GFP_ATOMIC); if (!tx_context->urb) { - DBG_PRT(MSG_LEVEL_ERR, - KERN_ERR "alloc tx urb failed\n"); + dev_err(&priv->usb->dev, "alloc tx urb failed\n"); goto free_tx; } tx_context->in_use = false; } - /* allocate RCB mem */ - priv->pRCBMem = kzalloc((sizeof(struct vnt_rcb) * priv->cbRD), - GFP_KERNEL); - if (priv->pRCBMem == NULL) { - DBG_PRT(MSG_LEVEL_ERR, KERN_ERR - "%s : alloc rx usb context failed\n", - priv->dev->name); - goto free_tx; - } - - priv->FirstRecvFreeList = NULL; - priv->LastRecvFreeList = NULL; - priv->FirstRecvMngList = NULL; - priv->LastRecvMngList = NULL; - priv->NumRecvFreeList = 0; + for (ii = 0; ii < priv->num_rcb; ii++) { + priv->rcb[ii] = kzalloc(sizeof(struct vnt_rcb), GFP_KERNEL); + if (!priv->rcb[ii]) { + dev_err(&priv->usb->dev, + "failed to allocate rcb no %d\n", ii); + goto free_rx_tx; + } - rcb = (struct vnt_rcb *)priv->pRCBMem; + rcb = priv->rcb[ii]; - for (ii = 0; ii < priv->cbRD; ii++) { - priv->apRCB[ii] = rcb; - rcb->pDevice = priv; + rcb->priv = priv; /* allocate URBs */ - rcb->pUrb = usb_alloc_urb(0, GFP_ATOMIC); - if (rcb->pUrb == NULL) { - DBG_PRT(MSG_LEVEL_ERR, KERN_ERR - " Failed to alloc rx urb\n"); + rcb->urb = usb_alloc_urb(0, GFP_ATOMIC); + if (rcb->urb == NULL) { + dev_err(&priv->usb->dev, "Failed to alloc rx urb\n"); goto free_rx_tx; } - rcb->skb = netdev_alloc_skb(priv->dev, priv->rx_buf_sz); + rcb->skb = dev_alloc_skb(priv->rx_buf_sz); if (rcb->skb == NULL) { - DBG_PRT(MSG_LEVEL_ERR, KERN_ERR - " Failed to alloc rx skb\n"); + dev_err(&priv->usb->dev, "Failed to alloc rx skb\n"); goto free_rx_tx; } - rcb->bBoolInUse = false; + rcb->in_use = false; - EnqueueRCB(priv->FirstRecvFreeList, - priv->LastRecvFreeList, rcb); - - priv->NumRecvFreeList++; - rcb++; + /* submit rx urb */ + if (vnt_submit_rx_urb(priv, rcb)) + goto free_rx_tx; } - priv->pInterruptURB = usb_alloc_urb(0, GFP_ATOMIC); - if (priv->pInterruptURB == NULL) { - DBG_PRT(MSG_LEVEL_ERR, KERN_ERR"Failed to alloc int urb\n"); + priv->interrupt_urb = usb_alloc_urb(0, GFP_ATOMIC); + if (priv->interrupt_urb == NULL) { + dev_err(&priv->usb->dev, "Failed to alloc int urb\n"); goto free_rx_tx; } priv->int_buf.data_buf = kmalloc(MAX_INTERRUPT_SIZE, GFP_KERNEL); if (priv->int_buf.data_buf == NULL) { - DBG_PRT(MSG_LEVEL_ERR, KERN_ERR"Failed to alloc int buf\n"); - usb_free_urb(priv->pInterruptURB); + dev_err(&priv->usb->dev, "Failed to alloc int buf\n"); + usb_free_urb(priv->interrupt_urb); goto free_rx_tx; } return true; free_rx_tx: - device_free_rx_bufs(priv); + vnt_free_rx_bufs(priv); free_tx: - device_free_tx_bufs(priv); + vnt_free_tx_bufs(priv); return false; } -static bool device_init_defrag_cb(struct vnt_private *pDevice) +static void vnt_tx_80211(struct ieee80211_hw *hw, + struct ieee80211_tx_control *control, struct sk_buff *skb) { - int i; - PSDeFragControlBlock pDeF; - - /* Init the fragment ctl entries */ - for (i = 0; i < CB_MAX_RX_FRAG; i++) { - pDeF = &(pDevice->sRxDFCB[i]); - if (!device_alloc_frag_buf(pDevice, pDeF)) { - DBG_PRT(MSG_LEVEL_ERR,KERN_ERR "%s: can not alloc frag bufs\n", - pDevice->dev->name); - goto free_frag; - } - } - pDevice->cbDFCB = CB_MAX_RX_FRAG; - pDevice->cbFreeDFCB = pDevice->cbDFCB; - return true; - -free_frag: - device_free_frag_bufs(pDevice); - return false; + struct vnt_private *priv = hw->priv; + + ieee80211_stop_queues(hw); + + if (vnt_tx_packet(priv, skb)) { + ieee80211_free_txskb(hw, skb); + + ieee80211_wake_queues(hw); + } } -static void device_free_frag_bufs(struct vnt_private *pDevice) +static int vnt_start(struct ieee80211_hw *hw) { - PSDeFragControlBlock pDeF; - int i; + struct vnt_private *priv = hw->priv; + + priv->rx_buf_sz = MAX_TOTAL_SIZE_WITH_ALL_HEADERS; - for (i = 0; i < CB_MAX_RX_FRAG; i++) { + if (vnt_alloc_bufs(priv) == false) { + dev_dbg(&priv->usb->dev, "vnt_alloc_bufs fail...\n"); + return -ENOMEM; + } - pDeF = &(pDevice->sRxDFCB[i]); + clear_bit(DEVICE_FLAGS_DISCONNECTED, &priv->flags); - if (pDeF->skb) - dev_kfree_skb(pDeF->skb); - } -} + if (vnt_init_registers(priv) == false) { + dev_dbg(&priv->usb->dev, " init register fail\n"); + goto free_all; + } -int device_alloc_frag_buf(struct vnt_private *pDevice, - PSDeFragControlBlock pDeF) -{ - pDeF->skb = netdev_alloc_skb(pDevice->dev, pDevice->rx_buf_sz); - if (!pDeF->skb) - return false; + priv->int_interval = 1; /* bInterval is set to 1 */ - return true; -} + vnt_int_start_interrupt(priv); -static int device_open(struct net_device *dev) -{ - struct vnt_private *pDevice = netdev_priv(dev); + ieee80211_wake_queues(hw); - pDevice->fWPA_Authened = false; + return 0; - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " device_open...\n"); +free_all: + vnt_free_rx_bufs(priv); + vnt_free_tx_bufs(priv); + vnt_free_int_bufs(priv); - pDevice->rx_buf_sz = MAX_TOTAL_SIZE_WITH_ALL_HEADERS; + usb_kill_urb(priv->interrupt_urb); + usb_free_urb(priv->interrupt_urb); - if (device_alloc_bufs(pDevice) == false) { - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " device_alloc_bufs fail... \n"); - return -ENOMEM; - } + return -ENOMEM; +} - if (device_init_defrag_cb(pDevice)== false) { - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " Initial defragment cb fail \n"); - goto free_rx_tx; - } +static void vnt_stop(struct ieee80211_hw *hw) +{ + struct vnt_private *priv = hw->priv; + int i; - MP_CLEAR_FLAG(pDevice, fMP_DISCONNECTED); - MP_SET_FLAG(pDevice, fMP_POST_READS); - MP_SET_FLAG(pDevice, fMP_POST_WRITES); + if (!priv) + return; - /* read config file */ - Read_config_file(pDevice); + for (i = 0; i < MAX_KEY_TABLE; i++) + vnt_mac_disable_keyentry(priv, i); - if (device_init_registers(pDevice) == false) { - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO " init register fail\n"); - goto free_all; - } + /* clear all keys */ + priv->key_entry_inuse = 0; - /* init for key management */ - KeyvInitTable(pDevice,&pDevice->sKey); - memcpy(pDevice->vnt_mgmt.abyMACAddr, - pDevice->abyCurrentNetAddr, ETH_ALEN); - memcpy(pDevice->dev->dev_addr, pDevice->abyCurrentNetAddr, ETH_ALEN); - pDevice->bStopTx0Pkt = false; - pDevice->bStopDataPkt = false; - pDevice->bRoaming = false; - pDevice->bIsRoaming = false; - pDevice->bEnableRoaming = false; - - vMgrObjectInit(pDevice); - - schedule_delayed_work(&pDevice->second_callback_work, HZ); - - pDevice->int_interval = 1; /* bInterval is set to 1 */ - pDevice->eEncryptionStatus = Ndis802_11EncryptionDisabled; - - pDevice->bIsRxWorkItemQueued = true; - - pDevice->bWPADEVUp = false; - pDevice->bwextstep0 = false; - pDevice->bwextstep1 = false; - pDevice->bwextstep2 = false; - pDevice->bwextstep3 = false; - pDevice->bWPASuppWextEnabled = false; - pDevice->byReAssocCount = 0; - - schedule_work(&pDevice->read_work_item); - INTvWorkItem(pDevice); - - /* if WEP key already set by iwconfig but device not yet open */ - if ((pDevice->bEncryptionEnable == true) && (pDevice->bTransmitKey == true)) { - KeybSetDefaultKey( pDevice, - &(pDevice->sKey), - pDevice->byKeyIndex | (1 << 31), - pDevice->uKeyLength, - NULL, - pDevice->abyKey, - KEY_CTL_WEP - ); - - pDevice->eEncryptionStatus = Ndis802_11Encryption1Enabled; - } - - if (pDevice->vnt_mgmt.eConfigMode == WMAC_CONFIG_AP) - bScheduleCommand((void *) pDevice, WLAN_CMD_RUN_AP, NULL); - else - bScheduleCommand((void *) pDevice, WLAN_CMD_BSSID_SCAN, NULL); + if (!test_bit(DEVICE_FLAGS_UNPLUG, &priv->flags)) + vnt_mac_shutdown(priv); - netif_stop_queue(pDevice->dev); - pDevice->flags |= DEVICE_FLAGS_OPENED; + ieee80211_stop_queues(hw); - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "device_open success..\n"); - return 0; + set_bit(DEVICE_FLAGS_DISCONNECTED, &priv->flags); -free_all: - device_free_frag_bufs(pDevice); -free_rx_tx: - device_free_rx_bufs(pDevice); - device_free_tx_bufs(pDevice); - device_free_int_bufs(pDevice); - usb_kill_urb(pDevice->pInterruptURB); - usb_free_urb(pDevice->pInterruptURB); - - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "device_open fail.. \n"); - return -ENOMEM; + cancel_delayed_work_sync(&priv->run_command_work); + + priv->cmd_running = false; + + vnt_free_tx_bufs(priv); + vnt_free_rx_bufs(priv); + vnt_free_int_bufs(priv); + + usb_kill_urb(priv->interrupt_urb); + usb_free_urb(priv->interrupt_urb); } -static int device_close(struct net_device *dev) +static int vnt_add_interface(struct ieee80211_hw *hw, struct ieee80211_vif *vif) { - struct vnt_private *pDevice = netdev_priv(dev); - struct vnt_manager *pMgmt = &pDevice->vnt_mgmt; - u8 uu; + struct vnt_private *priv = hw->priv; + + priv->vif = vif; - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "device_close1\n"); - if (pDevice == NULL) - return -ENODEV; + switch (vif->type) { + case NL80211_IFTYPE_STATION: + break; + case NL80211_IFTYPE_ADHOC: + vnt_mac_reg_bits_off(priv, MAC_REG_RCR, RCR_UNICAST); - if (pDevice->bLinkPass) { - bScheduleCommand((void *) pDevice, WLAN_CMD_DISASSOCIATE, NULL); - mdelay(30); - } + vnt_mac_reg_bits_on(priv, MAC_REG_HOSTCR, HOSTCR_ADHOC); - memset(pMgmt->abyDesireSSID, 0, WLAN_IEHDR_LEN + WLAN_SSID_MAXLEN + 1); - pMgmt->bShareKeyAlgorithm = false; - pDevice->bEncryptionEnable = false; - pDevice->eEncryptionStatus = Ndis802_11EncryptionDisabled; + break; + case NL80211_IFTYPE_AP: + vnt_mac_reg_bits_off(priv, MAC_REG_RCR, RCR_UNICAST); - for (uu = 0; uu < MAX_KEY_TABLE; uu++) - MACvDisableKeyEntry(pDevice,uu); + vnt_mac_reg_bits_on(priv, MAC_REG_HOSTCR, HOSTCR_AP); - if ((pDevice->flags & DEVICE_FLAGS_UNPLUG) == false) { - MACbShutdown(pDevice); - } - netif_stop_queue(pDevice->dev); - MP_SET_FLAG(pDevice, fMP_DISCONNECTED); - MP_CLEAR_FLAG(pDevice, fMP_POST_WRITES); - MP_CLEAR_FLAG(pDevice, fMP_POST_READS); + break; + default: + return -EOPNOTSUPP; + } - cancel_delayed_work_sync(&pDevice->run_command_work); - cancel_delayed_work_sync(&pDevice->second_callback_work); + priv->op_mode = vif->type; - cancel_work_sync(&pDevice->rx_mng_work_item); - cancel_work_sync(&pDevice->read_work_item); + vnt_set_bss_mode(priv); - pDevice->bRoaming = false; - pDevice->bIsRoaming = false; - pDevice->bEnableRoaming = false; - pDevice->bCmdRunning = false; - pDevice->bLinkPass = false; - memset(pMgmt->abyCurrBSSID, 0, 6); - pMgmt->eCurrState = WMAC_STATE_IDLE; + /* LED blink on TX */ + vnt_mac_set_led(priv, LEDSTS_STS, LEDSTS_INTER); - pDevice->flags &= ~DEVICE_FLAGS_OPENED; + return 0; +} - device_free_tx_bufs(pDevice); - device_free_rx_bufs(pDevice); - device_free_int_bufs(pDevice); - device_free_frag_bufs(pDevice); +static void vnt_remove_interface(struct ieee80211_hw *hw, + struct ieee80211_vif *vif) +{ + struct vnt_private *priv = hw->priv; - usb_kill_urb(pDevice->pInterruptURB); - usb_free_urb(pDevice->pInterruptURB); + switch (vif->type) { + case NL80211_IFTYPE_STATION: + break; + case NL80211_IFTYPE_ADHOC: + vnt_mac_reg_bits_off(priv, MAC_REG_TCR, TCR_AUTOBCNTX); + vnt_mac_reg_bits_off(priv, MAC_REG_TFTCTL, TFTCTL_TSFCNTREN); + vnt_mac_reg_bits_off(priv, MAC_REG_HOSTCR, HOSTCR_ADHOC); + break; + case NL80211_IFTYPE_AP: + vnt_mac_reg_bits_off(priv, MAC_REG_TCR, TCR_AUTOBCNTX); + vnt_mac_reg_bits_off(priv, MAC_REG_TFTCTL, TFTCTL_TSFCNTREN); + vnt_mac_reg_bits_off(priv, MAC_REG_HOSTCR, HOSTCR_AP); + break; + default: + break; + } - BSSvClearNodeDBTable(pDevice, 0); + vnt_radio_power_off(priv); - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "device_close2 \n"); + priv->op_mode = NL80211_IFTYPE_UNSPECIFIED; - return 0; + /* LED slow blink */ + vnt_mac_set_led(priv, LEDSTS_STS, LEDSTS_SLOW); } -static void vt6656_disconnect(struct usb_interface *intf) +static int vnt_config(struct ieee80211_hw *hw, u32 changed) { - struct vnt_private *device = usb_get_intfdata(intf); + struct vnt_private *priv = hw->priv; + struct ieee80211_conf *conf = &hw->conf; + u8 bb_type; - if (!device) - return; + if (changed & IEEE80211_CONF_CHANGE_PS) { + if (conf->flags & IEEE80211_CONF_PS) + vnt_enable_power_saving(priv, conf->listen_interval); + else + vnt_disable_power_saving(priv); + } - usb_set_intfdata(intf, NULL); - usb_put_dev(interface_to_usbdev(intf)); + if ((changed & IEEE80211_CONF_CHANGE_CHANNEL) || + (conf->flags & IEEE80211_CONF_OFFCHANNEL)) { + vnt_set_channel(priv, conf->chandef.chan->hw_value); + + if (conf->chandef.chan->band == IEEE80211_BAND_5GHZ) + bb_type = BB_TYPE_11A; + else + bb_type = BB_TYPE_11G; - device->flags |= DEVICE_FLAGS_UNPLUG; + if (priv->bb_type != bb_type) { + priv->bb_type = bb_type; - if (device->dev) { - unregister_netdev(device->dev); - free_netdev(device->dev); + vnt_set_bss_mode(priv); + } + } + + if (changed & IEEE80211_CONF_CHANGE_POWER) { + if (priv->bb_type == BB_TYPE_11B) + priv->current_rate = RATE_1M; + else + priv->current_rate = RATE_54M; + + vnt_rf_setpower(priv, priv->current_rate, + conf->chandef.chan->hw_value); } + + return 0; } -static int device_xmit(struct sk_buff *skb, struct net_device *dev) +static void vnt_bss_info_changed(struct ieee80211_hw *hw, + struct ieee80211_vif *vif, struct ieee80211_bss_conf *conf, + u32 changed) { - struct vnt_private *pDevice = netdev_priv(dev); - struct net_device_stats *stats = &pDevice->stats; - unsigned long flags; + struct vnt_private *priv = hw->priv; + + priv->current_aid = conf->aid; + + if (changed & BSS_CHANGED_BSSID) + vnt_mac_set_bssid_addr(priv, (u8 *)conf->bssid); - spin_lock_irqsave(&pDevice->lock, flags); - netif_stop_queue(dev); + if (changed & BSS_CHANGED_BASIC_RATES) { + priv->basic_rates = conf->basic_rates; - if (!pDevice->bLinkPass) { - dev_kfree_skb_irq(skb); - goto out; + vnt_update_top_rates(priv); + + dev_dbg(&priv->usb->dev, "basic rates %x\n", conf->basic_rates); } - if (pDevice->bStopDataPkt) { - dev_kfree_skb_irq(skb); - stats->tx_dropped++; - goto out; + if (changed & BSS_CHANGED_ERP_PREAMBLE) { + if (conf->use_short_preamble) { + vnt_mac_enable_barker_preamble_mode(priv); + priv->preamble_type = true; + } else { + vnt_mac_disable_barker_preamble_mode(priv); + priv->preamble_type = false; + } } - if (nsDMA_tx_packet(pDevice, skb)) { - if (netif_queue_stopped(dev)) - netif_wake_queue(dev); + if (changed & BSS_CHANGED_ERP_CTS_PROT) { + if (conf->use_cts_prot) + vnt_mac_enable_protect_mode(priv); + else + vnt_mac_disable_protect_mode(priv); } -out: - spin_unlock_irqrestore(&pDevice->lock, flags); + if (changed & BSS_CHANGED_ERP_SLOT) { + if (conf->use_short_slot) + priv->short_slot_time = true; + else + priv->short_slot_time = false; - return NETDEV_TX_OK; -} + vnt_set_short_slot_time(priv); + vnt_set_vga_gain_offset(priv, priv->bb_vga[0]); + vnt_update_pre_ed_threshold(priv, false); + } + + if (changed & BSS_CHANGED_TXPOWER) + vnt_rf_setpower(priv, priv->current_rate, + conf->chandef.chan->hw_value); + + if (changed & BSS_CHANGED_BEACON_ENABLED) { + dev_dbg(&priv->usb->dev, + "Beacon enable %d\n", conf->enable_beacon); -/* find out the start position of str2 from str1 */ -static unsigned char *kstrstr(const unsigned char *str1, - const unsigned char *str2) { - int str1_len = strlen(str1); - int str2_len = strlen(str2); - - while (str1_len >= str2_len) { - str1_len--; - if(memcmp(str1,str2,str2_len)==0) - return (unsigned char *) str1; - str1++; - } - return NULL; + if (conf->enable_beacon) { + vnt_beacon_enable(priv, vif, conf); + + vnt_mac_reg_bits_on(priv, MAC_REG_TCR, TCR_AUTOBCNTX); + } else { + vnt_mac_reg_bits_off(priv, MAC_REG_TCR, TCR_AUTOBCNTX); + } + } } -static int Config_FileGetParameter(unsigned char *string, - unsigned char *dest, - unsigned char *source) +static u64 vnt_prepare_multicast(struct ieee80211_hw *hw, + struct netdev_hw_addr_list *mc_list) { - unsigned char buf1[100]; - unsigned char buf2[100]; - unsigned char *start_p = NULL, *end_p = NULL, *tmp_p = NULL; - int ii; - - memset(buf1,0,100); - strcat(buf1, string); - strcat(buf1, "="); - source+=strlen(buf1); - - /* find target string start point */ - start_p = kstrstr(source,buf1); - if (start_p == NULL) - return false; + struct vnt_private *priv = hw->priv; + struct netdev_hw_addr *ha; + u64 mc_filter = 0; + u32 bit_nr = 0; - /* check if current config line is marked by "#" */ - for (ii = 1; ; ii++) { - if (memcmp(start_p - ii, "\n", 1) == 0) - break; - if (memcmp(start_p - ii, "#", 1) == 0) - return false; - } - - /* find target string end point */ - end_p = kstrstr(start_p,"\n"); - if (end_p == NULL) { /* can't find "\n", but don't care */ - end_p = start_p + strlen(start_p); /* no include "\n" */ - } - - memset(buf2,0,100); - memcpy(buf2, start_p, end_p-start_p); /* get the target line */ - buf2[end_p-start_p]='\0'; - - /* find value */ - start_p = kstrstr(buf2,"="); - if (start_p == NULL) - return false; - memset(buf1,0,100); - strcpy(buf1,start_p+1); - - /* except space */ - tmp_p = buf1; - while(*tmp_p != 0x00) { - if(*tmp_p==' ') - tmp_p++; - else - break; - } - - memcpy(dest,tmp_p,strlen(tmp_p)); - return true; + netdev_hw_addr_list_for_each(ha, mc_list) { + bit_nr = ether_crc(ETH_ALEN, ha->addr) >> 26; + + mc_filter |= 1ULL << (bit_nr & 0x3f); + } + + priv->mc_list_count = mc_list->count; + + return mc_filter; } -/* if read fails, return NULL, or return data pointer */ -static unsigned char *Config_FileOperation(struct vnt_private *pDevice) +static void vnt_configure(struct ieee80211_hw *hw, + unsigned int changed_flags, unsigned int *total_flags, u64 multicast) { - unsigned char *buffer = kmalloc(1024, GFP_KERNEL); - struct file *file; + struct vnt_private *priv = hw->priv; + u8 rx_mode = 0; + int rc; + + *total_flags &= FIF_ALLMULTI | FIF_OTHER_BSS | FIF_PROMISC_IN_BSS | + FIF_BCN_PRBRESP_PROMISC; + + rc = vnt_control_in(priv, MESSAGE_TYPE_READ, MAC_REG_RCR, + MESSAGE_REQUEST_MACREG, sizeof(u8), &rx_mode); + + if (!rc) + rx_mode = RCR_MULTICAST | RCR_BROADCAST; + + dev_dbg(&priv->usb->dev, "rx mode in = %x\n", rx_mode); - if (!buffer) { - printk("allocate mem for file fail?\n"); - return NULL; + if (changed_flags & FIF_PROMISC_IN_BSS) { + /* unconditionally log net taps */ + if (*total_flags & FIF_PROMISC_IN_BSS) + rx_mode |= RCR_UNICAST; + else + rx_mode &= ~RCR_UNICAST; } - file = filp_open(CONFIG_PATH, O_RDONLY, 0); - if (IS_ERR(file)) { - kfree(buffer); - printk("Config_FileOperation file Not exist\n"); - return NULL; + if (changed_flags & FIF_ALLMULTI) { + if (*total_flags & FIF_ALLMULTI) { + if (priv->mc_list_count > 2) + vnt_mac_set_filter(priv, ~0); + else + vnt_mac_set_filter(priv, multicast); + + rx_mode |= RCR_MULTICAST | RCR_BROADCAST; + } else { + rx_mode &= ~(RCR_MULTICAST | RCR_BROADCAST); + } + } - if (kernel_read(file, 0, buffer, 1024) < 0) { - printk("read file error?\n"); - kfree(buffer); - buffer = NULL; + if (changed_flags & (FIF_OTHER_BSS | FIF_BCN_PRBRESP_PROMISC)) { + if (*total_flags & (FIF_OTHER_BSS | FIF_BCN_PRBRESP_PROMISC)) + rx_mode &= ~RCR_BSSID; + else + rx_mode |= RCR_BSSID; } - fput(file); - return buffer; + vnt_control_out_u8(priv, MESSAGE_REQUEST_MACREG, MAC_REG_RCR, rx_mode); + + dev_dbg(&priv->usb->dev, "rx mode out= %x\n", rx_mode); } -/* return --->-1:fail; >=0:successful */ -static int Read_config_file(struct vnt_private *pDevice) +static int vnt_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd, + struct ieee80211_vif *vif, struct ieee80211_sta *sta, + struct ieee80211_key_conf *key) { - int result = 0; - unsigned char tmpbuffer[100]; - unsigned char *buffer = NULL; - - /* init config setting */ - pDevice->config_file.ZoneType = -1; - pDevice->config_file.eAuthenMode = -1; - pDevice->config_file.eEncryptionStatus = -1; - - buffer = Config_FileOperation(pDevice); - if (buffer == NULL) { - result =-1; - return result; - } - -/* get zonetype */ -{ - memset(tmpbuffer,0,sizeof(tmpbuffer)); - if(Config_FileGetParameter("ZONETYPE",tmpbuffer,buffer) ==true) { - if(memcmp(tmpbuffer,"USA",3)==0) { - pDevice->config_file.ZoneType=ZoneType_USA; - } - else if(memcmp(tmpbuffer,"JAPAN",5)==0) { - pDevice->config_file.ZoneType=ZoneType_Japan; - } - else if(memcmp(tmpbuffer,"EUROPE",6)==0) { - pDevice->config_file.ZoneType=ZoneType_Europe; - } - else { - printk("Unknown Zonetype[%s]?\n",tmpbuffer); - } - } -} + struct vnt_private *priv = hw->priv; -/* get other parameter */ - { - memset(tmpbuffer,0,sizeof(tmpbuffer)); - if(Config_FileGetParameter("AUTHENMODE",tmpbuffer,buffer)==true) { - pDevice->config_file.eAuthenMode = (int) simple_strtol(tmpbuffer, NULL, 10); - } - - memset(tmpbuffer,0,sizeof(tmpbuffer)); - if(Config_FileGetParameter("ENCRYPTIONMODE",tmpbuffer,buffer)==true) { - pDevice->config_file.eEncryptionStatus= (int) simple_strtol(tmpbuffer, NULL, 10); - } - } - - kfree(buffer); - return result; + switch (cmd) { + case SET_KEY: + if (vnt_set_keys(hw, sta, vif, key)) + return -EOPNOTSUPP; + break; + case DISABLE_KEY: + if (test_bit(key->hw_key_idx, &priv->key_entry_inuse)) + clear_bit(key->hw_key_idx, &priv->key_entry_inuse); + default: + break; + } + + return 0; } -static void device_set_multi(struct net_device *dev) +static void vnt_sw_scan_start(struct ieee80211_hw *hw) { - struct vnt_private *priv = netdev_priv(dev); - unsigned long flags; + struct vnt_private *priv = hw->priv; - if (priv->flags & DEVICE_FLAGS_OPENED) { - spin_lock_irqsave(&priv->lock, flags); + vnt_set_bss_mode(priv); + /* Set max sensitivity*/ + vnt_update_pre_ed_threshold(priv, true); +} - bScheduleCommand(priv, WLAN_CMD_CONFIGURE_FILTER, NULL); +static void vnt_sw_scan_complete(struct ieee80211_hw *hw) +{ + struct vnt_private *priv = hw->priv; - spin_unlock_irqrestore(&priv->lock, flags); - } + /* Return sensitivity to channel level*/ + vnt_update_pre_ed_threshold(priv, false); } -void vnt_configure_filter(struct vnt_private *priv) +static int vnt_get_stats(struct ieee80211_hw *hw, + struct ieee80211_low_level_stats *stats) { - struct net_device *dev = priv->dev; - struct vnt_manager *mgmt = &priv->vnt_mgmt; - struct netdev_hw_addr *ha; - u64 mc_filter = 0; - u8 tmp = 0; - int rc; + struct vnt_private *priv = hw->priv; - rc = vnt_control_in(priv, MESSAGE_TYPE_READ, - MAC_REG_RCR, MESSAGE_REQUEST_MACREG, 1, &tmp); - if (rc == 0) - priv->byRxMode = tmp; + memcpy(stats, &priv->low_stats, sizeof(*stats)); - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "priv->byRxMode in= %x\n", - priv->byRxMode); + return 0; +} - if (dev->flags & IFF_PROMISC) { /* set promiscuous mode */ - DBG_PRT(MSG_LEVEL_ERR, KERN_NOTICE - "%s: Promiscuous mode enabled.\n", dev->name); - /* unconditionally log net taps */ - priv->byRxMode |= (RCR_MULTICAST|RCR_BROADCAST|RCR_UNICAST); - } else if ((netdev_mc_count(dev) > priv->multicast_limit) || - (dev->flags & IFF_ALLMULTI)) { - mc_filter = ~0x0; - MACvWriteMultiAddr(priv, mc_filter); - - priv->byRxMode |= (RCR_MULTICAST|RCR_BROADCAST); - } else { - netdev_for_each_mc_addr(ha, dev) { - int bit_nr = ether_crc(ETH_ALEN, ha->addr) >> 26; - - mc_filter |= 1ULL << (bit_nr & 0x3f); - } +static u64 vnt_get_tsf(struct ieee80211_hw *hw, struct ieee80211_vif *vif) +{ + struct vnt_private *priv = hw->priv; - MACvWriteMultiAddr(priv, mc_filter); + return priv->current_tsf; +} - priv->byRxMode &= ~(RCR_UNICAST); - priv->byRxMode |= (RCR_MULTICAST|RCR_BROADCAST); - } +static void vnt_set_tsf(struct ieee80211_hw *hw, struct ieee80211_vif *vif, + u64 tsf) +{ + struct vnt_private *priv = hw->priv; - if (mgmt->eConfigMode == WMAC_CONFIG_AP) { - /* - * If AP mode, don't enable RCR_UNICAST since HW only compares - * addr1 with local MAC - */ - priv->byRxMode |= (RCR_MULTICAST|RCR_BROADCAST); - priv->byRxMode &= ~(RCR_UNICAST); - } + vnt_update_next_tbtt(priv, tsf, vif->bss_conf.beacon_int); +} + +static void vnt_reset_tsf(struct ieee80211_hw *hw, struct ieee80211_vif *vif) +{ + struct vnt_private *priv = hw->priv; - vnt_control_out_u8(priv, MESSAGE_REQUEST_MACREG, - MAC_REG_RCR, priv->byRxMode); + vnt_mac_reg_bits_off(priv, MAC_REG_TFTCTL, TFTCTL_TSFCNTREN); - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO - "priv->byRxMode out= %x\n", priv->byRxMode); + vnt_clear_current_tsf(priv); } -static struct net_device_stats *device_get_stats(struct net_device *dev) +static const struct ieee80211_ops vnt_mac_ops = { + .tx = vnt_tx_80211, + .start = vnt_start, + .stop = vnt_stop, + .add_interface = vnt_add_interface, + .remove_interface = vnt_remove_interface, + .config = vnt_config, + .bss_info_changed = vnt_bss_info_changed, + .prepare_multicast = vnt_prepare_multicast, + .configure_filter = vnt_configure, + .set_key = vnt_set_key, + .sw_scan_start = vnt_sw_scan_start, + .sw_scan_complete = vnt_sw_scan_complete, + .get_stats = vnt_get_stats, + .get_tsf = vnt_get_tsf, + .set_tsf = vnt_set_tsf, + .reset_tsf = vnt_reset_tsf, +}; + +int vnt_init(struct vnt_private *priv) { - struct vnt_private *pDevice = netdev_priv(dev); - return &pDevice->stats; + if (!(vnt_init_registers(priv))) + return -EAGAIN; + + SET_IEEE80211_PERM_ADDR(priv->hw, priv->permanent_net_addr); + + vnt_init_bands(priv); + + if (ieee80211_register_hw(priv->hw)) + return -ENODEV; + + priv->mac_hw = true; + + vnt_radio_power_off(priv); + + return 0; } -static int device_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) +static int +vt6656_probe(struct usb_interface *intf, const struct usb_device_id *id) { + struct usb_device *udev; + struct vnt_private *priv; + struct ieee80211_hw *hw; + struct wiphy *wiphy; int rc = 0; - switch (cmd) { - case SIOCETHTOOL: - return ethtool_ioctl(dev, rq); + udev = usb_get_dev(interface_to_usbdev(intf)); + dev_notice(&udev->dev, "%s Ver. %s\n", + DEVICE_FULL_DRV_NAM, DEVICE_VERSION); + dev_notice(&udev->dev, + "Copyright (c) 2004 VIA Networking Technologies, Inc.\n"); + + hw = ieee80211_alloc_hw(sizeof(struct vnt_private), &vnt_mac_ops); + if (!hw) { + dev_err(&udev->dev, "could not register ieee80211_hw\n"); + goto err_nomem; } + priv = hw->priv; + priv->hw = hw; + priv->usb = udev; + + vnt_set_options(priv); + + spin_lock_init(&priv->lock); + mutex_init(&priv->usb_lock); + + INIT_DELAYED_WORK(&priv->run_command_work, vnt_run_command); + + usb_set_intfdata(intf, priv); + + wiphy = priv->hw->wiphy; + + wiphy->frag_threshold = FRAG_THRESH_DEF; + wiphy->rts_threshold = RTS_THRESH_DEF; + wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION) | + BIT(NL80211_IFTYPE_ADHOC) | BIT(NL80211_IFTYPE_AP); + + priv->hw->flags = IEEE80211_HW_RX_INCLUDES_FCS | + IEEE80211_HW_REPORTS_TX_ACK_STATUS | + IEEE80211_HW_SIGNAL_DBM | + IEEE80211_HW_TIMING_BEACON_ONLY; + + priv->hw->rate_control_algorithm = "pid"; + priv->hw->max_signal = 100; + + SET_IEEE80211_DEV(priv->hw, &intf->dev); + + usb_device_reset(priv); + + clear_bit(DEVICE_FLAGS_DISCONNECTED, &priv->flags); + vnt_reset_command_timer(priv); + + vnt_schedule_command(priv, WLAN_CMD_INIT_MAC80211); + + return 0; + +err_nomem: + usb_put_dev(udev); + return rc; } -static int ethtool_ioctl(struct net_device *dev, struct ifreq *rq) +static void vt6656_disconnect(struct usb_interface *intf) { - u32 ethcmd; - - if (copy_from_user(ðcmd, rq->ifr_data, sizeof(ethcmd))) - return -EFAULT; - - switch (ethcmd) { - case ETHTOOL_GDRVINFO: { - struct ethtool_drvinfo info = {ETHTOOL_GDRVINFO}; - strncpy(info.driver, DEVICE_NAME, sizeof(info.driver)-1); - strncpy(info.version, DEVICE_VERSION, sizeof(info.version)-1); - if (copy_to_user(rq->ifr_data, &info, sizeof(info))) - return -EFAULT; - return 0; - } + struct vnt_private *priv = usb_get_intfdata(intf); + + if (!priv) + return; - } + if (priv->mac_hw) + ieee80211_unregister_hw(priv->hw); - return -EOPNOTSUPP; + usb_set_intfdata(intf, NULL); + usb_put_dev(interface_to_usbdev(intf)); + + set_bit(DEVICE_FLAGS_UNPLUG, &priv->flags); + + ieee80211_free_hw(priv->hw); +} + +#ifdef CONFIG_PM + +static int vt6656_suspend(struct usb_interface *intf, pm_message_t message) +{ + return 0; } +static int vt6656_resume(struct usb_interface *intf) +{ + return 0; +} + +#endif /* CONFIG_PM */ + MODULE_DEVICE_TABLE(usb, vt6656_table); static struct usb_driver vt6656_driver = { diff --git a/drivers/staging/vt6656/michael.c b/drivers/staging/vt6656/michael.c deleted file mode 100644 index 9a5a0b6761ed..000000000000 --- a/drivers/staging/vt6656/michael.c +++ /dev/null @@ -1,167 +0,0 @@ -/* - * Copyright (c) 1996, 2003 VIA Networking Technologies, Inc. - * All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - * - * - * File: michael.cpp - * - * Purpose: The implementation of LIST data structure. - * - * Author: Kyle Hsu - * - * Date: Sep 4, 2002 - * - * Functions: - * s_dwGetUINT32 - Convert from u8[] to u32 in a portable way - * s_vPutUINT32 - Convert from u32 to u8[] in a portable way - * s_vClear - Reset the state to the empty message. - * s_vSetKey - Set the key. - * MIC_vInit - Set the key. - * s_vAppendByte - Append the byte to our word-sized buffer. - * MIC_vAppend - call s_vAppendByte. - * MIC_vGetMIC - Append the minimum padding and call s_vAppendByte. - * - * Revision History: - * - */ - -#include "tmacro.h" -#include "michael.h" - -/* - * static u32 s_dwGetUINT32(u8 * p); Get u32 from - * 4 bytes LSByte first - * static void s_vPutUINT32(u8* p, u32 val); Put u32 into - * 4 bytes LSByte first - */ -static void s_vClear(void); /* Clear the internal message, - * resets the object to the - * state just after construction. */ -static void s_vSetKey(u32 dwK0, u32 dwK1); -static void s_vAppendByte(u8 b); /* Add a single byte to the internal - * message */ - -static u32 L, R; /* Current state */ -static u32 K0, K1; /* Key */ -static u32 M; /* Message accumulator (single word) */ -static unsigned int nBytesInM; /* # bytes in M */ - -/* -static u32 s_dwGetUINT32 (u8 * p) -// Convert from u8[] to u32 in a portable way -{ - u32 res = 0; - unsigned int i; - for (i = 0; i < 4; i++) - res |= (*p++) << (8*i); - return res; -} - -static void s_vPutUINT32(u8 *p, u32 val) -// Convert from u32 to u8[] in a portable way -{ - unsigned int i; - for (i = 0; i < 4; i++) { - *p++ = (u8) (val & 0xff); - val >>= 8; - } -} -*/ - -static void s_vClear(void) -{ - /* Reset the state to the empty message. */ - L = K0; - R = K1; - nBytesInM = 0; - M = 0; -} - -static void s_vSetKey(u32 dwK0, u32 dwK1) -{ - /* Set the key */ - K0 = dwK0; - K1 = dwK1; - /* and reset the message */ - s_vClear(); -} - -static void s_vAppendByte(u8 b) -{ - /* Append the byte to our word-sized buffer */ - M |= b << (8*nBytesInM); - nBytesInM++; - /* Process the word if it is full. */ - if (nBytesInM >= 4) { - L ^= M; - R ^= ROL32(L, 17); - L += R; - R ^= ((L & 0xff00ff00) >> 8) | ((L & 0x00ff00ff) << 8); - L += R; - R ^= ROL32(L, 3); - L += R; - R ^= ROR32(L, 2); - L += R; - /* Clear the buffer */ - M = 0; - nBytesInM = 0; - } -} - -void MIC_vInit(u32 dwK0, u32 dwK1) -{ - /* Set the key */ - s_vSetKey(dwK0, dwK1); -} - -void MIC_vUnInit(void) -{ - /* Wipe the key material */ - K0 = 0; - K1 = 0; - - /* And the other fields as well. */ - /* Note that this sets (L,R) to (K0,K1) which is just fine. */ - s_vClear(); -} - -void MIC_vAppend(u8 * src, unsigned int nBytes) -{ - /* This is simple */ - while (nBytes > 0) { - s_vAppendByte(*src++); - nBytes--; - } -} - -void MIC_vGetMIC(u32 * pdwL, u32 * pdwR) -{ - /* Append the minimum padding */ - s_vAppendByte(0x5a); - s_vAppendByte(0); - s_vAppendByte(0); - s_vAppendByte(0); - s_vAppendByte(0); - /* and then zeroes until the length is a multiple of 4 */ - while (nBytesInM != 0) - s_vAppendByte(0); - /* The s_vAppendByte function has already computed the result. */ - *pdwL = L; - *pdwR = R; - /* Reset to the empty message. */ - s_vClear(); -} diff --git a/drivers/staging/vt6656/michael.h b/drivers/staging/vt6656/michael.h deleted file mode 100644 index 9c69a42640a7..000000000000 --- a/drivers/staging/vt6656/michael.h +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright (c) 1996, 2003 VIA Networking Technologies, Inc. - * All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - * - * - * File: Michael.h - * - * Purpose: Reference implementation for Michael - * written by Niels Ferguson - * - * Author: Kyle Hsu - * - * Date: Jan 2, 2003 - * - */ - -#ifndef __MICHAEL_H__ -#define __MICHAEL_H__ - -#include <linux/types.h> - -void MIC_vInit(u32 dwK0, u32 dwK1); - -void MIC_vUnInit(void); - -// Append bytes to the message to be MICed -void MIC_vAppend(u8 * src, unsigned int nBytes); - -// Get the MIC result. Destination should accept 8 bytes of result. -// This also resets the message to empty. -void MIC_vGetMIC(u32 * pdwL, u32 * pdwR); - -// Rotation functions on 32 bit values -#define ROL32(A, n) \ - (((A) << (n)) | (((A)>>(32-(n))) & ((1UL << (n)) - 1))) -#define ROR32(A, n) ROL32((A), 32-(n)) - -#endif /* __MICHAEL_H__ */ diff --git a/drivers/staging/vt6656/power.c b/drivers/staging/vt6656/power.c index ddbd04695c99..0ffbaed5d774 100644 --- a/drivers/staging/vt6656/power.c +++ b/drivers/staging/vt6656/power.c @@ -26,12 +26,9 @@ * Date: July 17, 2002 * * Functions: - * PSvEnablePowerSaving - Enable Power Saving Mode + * vnt_enable_power_saving - Enable Power Saving Mode * PSvDiasblePowerSaving - Disable Power Saving Mode - * PSbConsiderPowerDown - Decide if we can Power Down - * PSvSendPSPOLL - Send PS-POLL packet - * PSbSendNullPacket - Send Null packet - * PSbIsNextTBTTWakeUp - Decide if we need to wake up at next Beacon + * vnt_next_tbtt_wakeup - Decide if we need to wake up at next Beacon * * Revision History: * @@ -39,15 +36,12 @@ #include "mac.h" #include "device.h" -#include "wmgr.h" #include "power.h" #include "wcmd.h" #include "rxtx.h" #include "card.h" #include "usbpipe.h" -static int msglevel = MSG_LEVEL_INFO; - /* * * Routine Description: @@ -58,61 +52,46 @@ static int msglevel = MSG_LEVEL_INFO; * */ -void PSvEnablePowerSaving(struct vnt_private *pDevice, u16 wListenInterval) +void vnt_enable_power_saving(struct vnt_private *priv, u16 listen_interval) { - struct vnt_manager *pMgmt = &pDevice->vnt_mgmt; - u16 wAID = pMgmt->wCurrAID | BIT14 | BIT15; + u16 aid = priv->current_aid | BIT(14) | BIT(15); /* set period of power up before TBTT */ - MACvWriteWord(pDevice, MAC_REG_PWBT, C_PWBT); + vnt_mac_write_word(priv, MAC_REG_PWBT, C_PWBT); - if (pDevice->op_mode != NL80211_IFTYPE_ADHOC) { + if (priv->op_mode != NL80211_IFTYPE_ADHOC) { /* set AID */ - MACvWriteWord(pDevice, MAC_REG_AIDATIM, wAID); + vnt_mac_write_word(priv, MAC_REG_AIDATIM, aid); } /* Warren:06-18-2004,the sequence must follow * PSEN->AUTOSLEEP->GO2DOZE */ /* enable power saving hw function */ - MACvRegBitsOn(pDevice, MAC_REG_PSCTL, PSCTL_PSEN); + vnt_mac_reg_bits_on(priv, MAC_REG_PSCTL, PSCTL_PSEN); /* Set AutoSleep */ - MACvRegBitsOn(pDevice, MAC_REG_PSCFG, PSCFG_AUTOSLEEP); + vnt_mac_reg_bits_on(priv, MAC_REG_PSCFG, PSCFG_AUTOSLEEP); /* Warren:MUST turn on this once before turn on AUTOSLEEP ,or the * AUTOSLEEP doesn't work */ - MACvRegBitsOn(pDevice, MAC_REG_PSCTL, PSCTL_GO2DOZE); + vnt_mac_reg_bits_on(priv, MAC_REG_PSCTL, PSCTL_GO2DOZE); - if (wListenInterval >= 2) { + if (listen_interval >= 2) { /* clear always listen beacon */ - MACvRegBitsOff(pDevice, MAC_REG_PSCTL, PSCTL_ALBCN); + vnt_mac_reg_bits_off(priv, MAC_REG_PSCTL, PSCTL_ALBCN); /* first time set listen next beacon */ - MACvRegBitsOn(pDevice, MAC_REG_PSCTL, PSCTL_LNBCN); - - pMgmt->wCountToWakeUp = wListenInterval; - + vnt_mac_reg_bits_on(priv, MAC_REG_PSCTL, PSCTL_LNBCN); } else { /* always listen beacon */ - MACvRegBitsOn(pDevice, MAC_REG_PSCTL, PSCTL_ALBCN); - - pMgmt->wCountToWakeUp = 0; + vnt_mac_reg_bits_on(priv, MAC_REG_PSCTL, PSCTL_ALBCN); } - pDevice->bEnablePSMode = true; - - /* We don't send null pkt in ad hoc mode - * since beacon will handle this. - */ - if (pDevice->op_mode == NL80211_IFTYPE_STATION) - PSbSendNullPacket(pDevice); - - pDevice->bPWBitOn = true; - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "PS:Power Saving Mode Enable...\n"); + dev_dbg(&priv->usb->dev, "PS:Power Saving Mode Enable...\n"); } /* @@ -125,181 +104,18 @@ void PSvEnablePowerSaving(struct vnt_private *pDevice, u16 wListenInterval) * */ -void PSvDisablePowerSaving(struct vnt_private *pDevice) +void vnt_disable_power_saving(struct vnt_private *priv) { /* disable power saving hw function */ - vnt_control_out(pDevice, MESSAGE_TYPE_DISABLE_PS, 0, + vnt_control_out(priv, MESSAGE_TYPE_DISABLE_PS, 0, 0, 0, NULL); /* clear AutoSleep */ - MACvRegBitsOff(pDevice, MAC_REG_PSCFG, PSCFG_AUTOSLEEP); + vnt_mac_reg_bits_off(priv, MAC_REG_PSCFG, PSCFG_AUTOSLEEP); /* set always listen beacon */ - MACvRegBitsOn(pDevice, MAC_REG_PSCTL, PSCTL_ALBCN); - pDevice->bEnablePSMode = false; - - if (pDevice->op_mode == NL80211_IFTYPE_STATION) - PSbSendNullPacket(pDevice); - - pDevice->bPWBitOn = false; -} - -/* - * - * Routine Description: - * Consider to power down when no more packets to tx or rx. - * - * Return Value: - * true, if power down success - * false, if fail - */ - -int PSbConsiderPowerDown(struct vnt_private *pDevice, int bCheckRxDMA, - int bCheckCountToWakeUp) -{ - struct vnt_manager *pMgmt = &pDevice->vnt_mgmt; - u8 byData; - - /* check if already in Doze mode */ - vnt_control_in_u8(pDevice, MESSAGE_REQUEST_MACREG, - MAC_REG_PSCTL, &byData); - - if ((byData & PSCTL_PS) != 0) - return true; - - if (pMgmt->eCurrMode != WMAC_MODE_IBSS_STA) { - /* check if in TIM wake period */ - if (pMgmt->bInTIMWake) - return false; - } - - /* check scan state */ - if (pDevice->bCmdRunning) - return false; - - /* Tx Burst */ - if (pDevice->bPSModeTxBurst) - return false; - - /* Froce PSEN on */ - MACvRegBitsOn(pDevice, MAC_REG_PSCTL, PSCTL_PSEN); - - if (pMgmt->eCurrMode != WMAC_MODE_IBSS_STA) { - if (bCheckCountToWakeUp && (pMgmt->wCountToWakeUp == 0 - || pMgmt->wCountToWakeUp == 1)) { - return false; - } - } - - pDevice->bPSRxBeacon = true; - - /* no Tx, no Rx isr, now go to Doze */ - MACvRegBitsOn(pDevice, MAC_REG_PSCTL, PSCTL_GO2DOZE); - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Go to Doze ZZZZZZZZZZZZZZZ\n"); - return true; -} - -/* - * - * Routine Description: - * Send PS-POLL packet - * - * Return Value: - * None. - * - */ - -void PSvSendPSPOLL(struct vnt_private *pDevice) -{ - struct vnt_manager *pMgmt = &pDevice->vnt_mgmt; - struct vnt_tx_mgmt *pTxPacket = NULL; - - memset(pMgmt->pbyPSPacketPool, 0, sizeof(struct vnt_tx_mgmt) - + WLAN_HDR_ADDR2_LEN); - pTxPacket = (struct vnt_tx_mgmt *)pMgmt->pbyPSPacketPool; - pTxPacket->p80211Header = (PUWLAN_80211HDR)((u8 *)pTxPacket - + sizeof(struct vnt_tx_mgmt)); - - pTxPacket->p80211Header->sA2.wFrameCtl = cpu_to_le16( - ( - WLAN_SET_FC_FTYPE(WLAN_TYPE_CTL) | - WLAN_SET_FC_FSTYPE(WLAN_FSTYPE_PSPOLL) | - WLAN_SET_FC_PWRMGT(0) - )); - - pTxPacket->p80211Header->sA2.wDurationID = - pMgmt->wCurrAID | BIT14 | BIT15; - memcpy(pTxPacket->p80211Header->sA2.abyAddr1, pMgmt->abyCurrBSSID, - WLAN_ADDR_LEN); - memcpy(pTxPacket->p80211Header->sA2.abyAddr2, pMgmt->abyMACAddr, - WLAN_ADDR_LEN); - pTxPacket->cbMPDULen = WLAN_HDR_ADDR2_LEN; - pTxPacket->cbPayloadLen = 0; - - /* log failure if sending failed */ - if (csMgmt_xmit(pDevice, pTxPacket) != CMD_STATUS_PENDING) - DBG_PRT(MSG_LEVEL_DEBUG, - KERN_INFO "Send PS-Poll packet failed..\n"); -} - -/* - * - * Routine Description: - * Send NULL packet to AP for notification power state of STA - * - * Return Value: - * None. - * - */ - -int PSbSendNullPacket(struct vnt_private *pDevice) -{ - struct vnt_tx_mgmt *pTxPacket = NULL; - struct vnt_manager *pMgmt = &pDevice->vnt_mgmt; - u16 flags = 0; - - if (pDevice->bLinkPass == false) - return false; - - if (pDevice->bEnablePSMode == false && pDevice->tx_trigger == false) - return false; - - memset(pMgmt->pbyPSPacketPool, 0, sizeof(struct vnt_tx_mgmt) - + WLAN_NULLDATA_FR_MAXLEN); - pTxPacket = (struct vnt_tx_mgmt *)pMgmt->pbyPSPacketPool; - pTxPacket->p80211Header = (PUWLAN_80211HDR)((u8 *)pTxPacket - + sizeof(struct vnt_tx_mgmt)); - - flags = WLAN_SET_FC_FTYPE(WLAN_TYPE_DATA) | - WLAN_SET_FC_FSTYPE(WLAN_FSTYPE_NULL); - - if (pDevice->bEnablePSMode) - flags |= WLAN_SET_FC_PWRMGT(1); - else - flags |= WLAN_SET_FC_PWRMGT(0); - - pTxPacket->p80211Header->sA3.wFrameCtl = cpu_to_le16(flags); - - if (pMgmt->eCurrMode != WMAC_MODE_IBSS_STA) - pTxPacket->p80211Header->sA3.wFrameCtl |= - cpu_to_le16((u16)WLAN_SET_FC_TODS(1)); - - memcpy(pTxPacket->p80211Header->sA3.abyAddr1, pMgmt->abyCurrBSSID, - WLAN_ADDR_LEN); - memcpy(pTxPacket->p80211Header->sA3.abyAddr2, pMgmt->abyMACAddr, - WLAN_ADDR_LEN); - memcpy(pTxPacket->p80211Header->sA3.abyAddr3, pMgmt->abyCurrBSSID, - WLAN_BSSID_LEN); - pTxPacket->cbMPDULen = WLAN_HDR_ADDR3_LEN; - pTxPacket->cbPayloadLen = 0; - /* log error if sending failed */ - if (csMgmt_xmit(pDevice, pTxPacket) != CMD_STATUS_PENDING) { - DBG_PRT(MSG_LEVEL_DEBUG, - KERN_INFO "Send Null Packet failed !\n"); - return false; - } - return true; + vnt_mac_reg_bits_on(priv, MAC_REG_PSCTL, PSCTL_ALBCN); } /* @@ -312,27 +128,17 @@ int PSbSendNullPacket(struct vnt_private *pDevice) * */ -int PSbIsNextTBTTWakeUp(struct vnt_private *pDevice) +int vnt_next_tbtt_wakeup(struct vnt_private *priv) { - struct vnt_manager *pMgmt = &pDevice->vnt_mgmt; - int bWakeUp = false; - - if (pMgmt->wListenInterval >= 2) { - if (pMgmt->wCountToWakeUp == 0) - pMgmt->wCountToWakeUp = pMgmt->wListenInterval; - - pMgmt->wCountToWakeUp--; - - if (pMgmt->wCountToWakeUp == 1) { - /* Turn on wake up to listen next beacon */ - MACvRegBitsOn(pDevice, MAC_REG_PSCTL, PSCTL_LNBCN); - pDevice->bPSRxBeacon = false; - bWakeUp = true; - } else if (!pDevice->bPSRxBeacon) { - /* Listen until RxBeacon */ - MACvRegBitsOn(pDevice, MAC_REG_PSCTL, PSCTL_LNBCN); - } + struct ieee80211_hw *hw = priv->hw; + struct ieee80211_conf *conf = &hw->conf; + int wake_up = false; + + if (conf->listen_interval == 1) { + /* Turn on wake up to listen next beacon */ + vnt_mac_reg_bits_on(priv, MAC_REG_PSCTL, PSCTL_LNBCN); + wake_up = true; } - return bWakeUp; -} + return wake_up; +} diff --git a/drivers/staging/vt6656/power.h b/drivers/staging/vt6656/power.h index 778358239437..7696b714850c 100644 --- a/drivers/staging/vt6656/power.h +++ b/drivers/staging/vt6656/power.h @@ -29,19 +29,10 @@ #ifndef __POWER_H__ #define __POWER_H__ -#define C_PWBT 1000 // micro sec. power up before TBTT -#define PS_FAST_INTERVAL 1 // Fast power saving listen interval -#define PS_MAX_INTERVAL 4 // MAX power saving listen interval +#define C_PWBT 1000 /* micro sec. power up before TBTT */ -/* PSDevice pDevice */ -/* PSDevice hDeviceContext */ - -int PSbConsiderPowerDown(struct vnt_private *, int bCheckRxDMA, - int bCheckCountToWakeUp); -void PSvDisablePowerSaving(struct vnt_private *); -void PSvEnablePowerSaving(struct vnt_private *, u16 wListenInterval); -void PSvSendPSPOLL(struct vnt_private *); -int PSbSendNullPacket(struct vnt_private *); -int PSbIsNextTBTTWakeUp(struct vnt_private *); +void vnt_disable_power_saving(struct vnt_private *); +void vnt_enable_power_saving(struct vnt_private *, u16); +int vnt_next_tbtt_wakeup(struct vnt_private *); #endif /* __POWER_H__ */ diff --git a/drivers/staging/vt6656/rc4.c b/drivers/staging/vt6656/rc4.c deleted file mode 100644 index 2fd836f07536..000000000000 --- a/drivers/staging/vt6656/rc4.c +++ /dev/null @@ -1,87 +0,0 @@ -/* - * Copyright (c) 1996, 2003 VIA Networking Technologies, Inc. - * All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - * - * File: rc4.c - * - * Purpose: - * - * Functions: - * - * Revision History: - * - * Author: Kyle Hsu - * - * Date: Sep 4, 2002 - * - */ - -#include "rc4.h" - -void rc4_init(PRC4Ext pRC4, u8 * pbyKey, unsigned int cbKey_len) -{ - unsigned int ust1, ust2; - unsigned int keyindex; - unsigned int stateindex; - u8 * pbyst; - unsigned int idx; - - pbyst = pRC4->abystate; - pRC4->ux = 0; - pRC4->uy = 0; - for (idx = 0; idx < 256; idx++) - pbyst[idx] = (u8)idx; - keyindex = 0; - stateindex = 0; - for (idx = 0; idx < 256; idx++) { - ust1 = pbyst[idx]; - stateindex = (stateindex + pbyKey[keyindex] + ust1) & 0xff; - ust2 = pbyst[stateindex]; - pbyst[stateindex] = (u8)ust1; - pbyst[idx] = (u8)ust2; - if (++keyindex >= cbKey_len) - keyindex = 0; - } -} - -unsigned int rc4_byte(PRC4Ext pRC4) -{ - unsigned int ux; - unsigned int uy; - unsigned int ustx, usty; - u8 * pbyst; - - pbyst = pRC4->abystate; - ux = (pRC4->ux + 1) & 0xff; - ustx = pbyst[ux]; - uy = (ustx + pRC4->uy) & 0xff; - usty = pbyst[uy]; - pRC4->ux = ux; - pRC4->uy = uy; - pbyst[uy] = (u8)ustx; - pbyst[ux] = (u8)usty; - - return pbyst[(ustx + usty) & 0xff]; -} - -void rc4_encrypt(PRC4Ext pRC4, u8 * pbyDest, - u8 * pbySrc, unsigned int cbData_len) -{ - unsigned int ii; - for (ii = 0; ii < cbData_len; ii++) - pbyDest[ii] = (u8)(pbySrc[ii] ^ rc4_byte(pRC4)); -} diff --git a/drivers/staging/vt6656/rc4.h b/drivers/staging/vt6656/rc4.h deleted file mode 100644 index d376e1adcc1c..000000000000 --- a/drivers/staging/vt6656/rc4.h +++ /dev/null @@ -1,46 +0,0 @@ -/* - * File: rc4.h - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Purpose: - * - * Functions: - * - * Revision History: - * - * Author: Kyle Hsu - * - * Date: Sep 4, 2002 - * - */ - -#ifndef __RC4_H__ -#define __RC4_H__ - -#include <linux/types.h> - -typedef struct { - unsigned int ux; - unsigned int uy; - u8 abystate[256]; -} RC4Ext, *PRC4Ext; - -void rc4_init(PRC4Ext pRC4, u8 * pbyKey, unsigned int cbKey_len); -unsigned int rc4_byte(PRC4Ext pRC4); -void rc4_encrypt(PRC4Ext pRC4, u8 * pbyDest, u8 * pbySrc, - unsigned int cbData_len); - -#endif /* __RC4_H__ */ diff --git a/drivers/staging/vt6656/rf.c b/drivers/staging/vt6656/rf.c index 3f54ae3cfb4e..c0edcae55e30 100644 --- a/drivers/staging/vt6656/rf.c +++ b/drivers/staging/vt6656/rf.c @@ -39,675 +39,576 @@ #include "rf.h" #include "baseband.h" #include "usbpipe.h" -#include "datarate.h" -#define BY_AL2230_REG_LEN 23 //24bit #define CB_AL2230_INIT_SEQ 15 #define AL2230_PWR_IDX_LEN 64 -#define BY_AL7230_REG_LEN 23 //24bit #define CB_AL7230_INIT_SEQ 16 #define AL7230_PWR_IDX_LEN 64 -//{{RobertYu:20051111 -#define BY_VT3226_REG_LEN 23 #define CB_VT3226_INIT_SEQ 11 #define VT3226_PWR_IDX_LEN 64 -//}} -//{{RobertYu:20060609 -#define BY_VT3342_REG_LEN 23 #define CB_VT3342_INIT_SEQ 13 #define VT3342_PWR_IDX_LEN 64 -//}} static u8 al2230_init_table[CB_AL2230_INIT_SEQ][3] = { - {0x03, 0xF7, 0x90}, - {0x03, 0x33, 0x31}, - {0x01, 0xB8, 0x02}, - {0x00, 0xFF, 0xF3}, - {0x00, 0x05, 0xA4}, - {0x0F, 0x4D, 0xC5}, //RobertYu:20060814 - {0x08, 0x05, 0xB6}, - {0x01, 0x47, 0xC7}, - {0x00, 0x06, 0x88}, - {0x04, 0x03, 0xB9}, - {0x00, 0xDB, 0xBA}, - {0x00, 0x09, 0x9B}, - {0x0B, 0xDF, 0xFC}, - {0x00, 0x00, 0x0D}, - {0x00, 0x58, 0x0F} - }; + {0x03, 0xf7, 0x90}, + {0x03, 0x33, 0x31}, + {0x01, 0xb8, 0x02}, + {0x00, 0xff, 0xf3}, + {0x00, 0x05, 0xa4}, + {0x0f, 0x4d, 0xc5}, + {0x08, 0x05, 0xb6}, + {0x01, 0x47, 0xc7}, + {0x00, 0x06, 0x88}, + {0x04, 0x03, 0xb9}, + {0x00, 0xdb, 0xba}, + {0x00, 0x09, 0x9b}, + {0x0b, 0xdf, 0xfc}, + {0x00, 0x00, 0x0d}, + {0x00, 0x58, 0x0f} +}; static u8 al2230_channel_table0[CB_MAX_CHANNEL_24G][3] = { - {0x03, 0xF7, 0x90}, // channel = 1, Tf = 2412MHz - {0x03, 0xF7, 0x90}, // channel = 2, Tf = 2417MHz - {0x03, 0xE7, 0x90}, // channel = 3, Tf = 2422MHz - {0x03, 0xE7, 0x90}, // channel = 4, Tf = 2427MHz - {0x03, 0xF7, 0xA0}, // channel = 5, Tf = 2432MHz - {0x03, 0xF7, 0xA0}, // channel = 6, Tf = 2437MHz - {0x03, 0xE7, 0xA0}, // channel = 7, Tf = 2442MHz - {0x03, 0xE7, 0xA0}, // channel = 8, Tf = 2447MHz - {0x03, 0xF7, 0xB0}, // channel = 9, Tf = 2452MHz - {0x03, 0xF7, 0xB0}, // channel = 10, Tf = 2457MHz - {0x03, 0xE7, 0xB0}, // channel = 11, Tf = 2462MHz - {0x03, 0xE7, 0xB0}, // channel = 12, Tf = 2467MHz - {0x03, 0xF7, 0xC0}, // channel = 13, Tf = 2472MHz - {0x03, 0xE7, 0xC0} // channel = 14, Tf = 2412M - }; + {0x03, 0xf7, 0x90}, + {0x03, 0xf7, 0x90}, + {0x03, 0xe7, 0x90}, + {0x03, 0xe7, 0x90}, + {0x03, 0xf7, 0xa0}, + {0x03, 0xf7, 0xa0}, + {0x03, 0xe7, 0xa0}, + {0x03, 0xe7, 0xa0}, + {0x03, 0xf7, 0xb0}, + {0x03, 0xf7, 0xb0}, + {0x03, 0xe7, 0xb0}, + {0x03, 0xe7, 0xb0}, + {0x03, 0xf7, 0xc0}, + {0x03, 0xe7, 0xc0} +}; static u8 al2230_channel_table1[CB_MAX_CHANNEL_24G][3] = { - {0x03, 0x33, 0x31}, // channel = 1, Tf = 2412MHz - {0x0B, 0x33, 0x31}, // channel = 2, Tf = 2417MHz - {0x03, 0x33, 0x31}, // channel = 3, Tf = 2422MHz - {0x0B, 0x33, 0x31}, // channel = 4, Tf = 2427MHz - {0x03, 0x33, 0x31}, // channel = 5, Tf = 2432MHz - {0x0B, 0x33, 0x31}, // channel = 6, Tf = 2437MHz - {0x03, 0x33, 0x31}, // channel = 7, Tf = 2442MHz - {0x0B, 0x33, 0x31}, // channel = 8, Tf = 2447MHz - {0x03, 0x33, 0x31}, // channel = 9, Tf = 2452MHz - {0x0B, 0x33, 0x31}, // channel = 10, Tf = 2457MHz - {0x03, 0x33, 0x31}, // channel = 11, Tf = 2462MHz - {0x0B, 0x33, 0x31}, // channel = 12, Tf = 2467MHz - {0x03, 0x33, 0x31}, // channel = 13, Tf = 2472MHz - {0x06, 0x66, 0x61} // channel = 14, Tf = 2412M - }; - -// 40MHz reference frequency -// Need to Pull PLLON(PE3) low when writing channel registers through 3-wire. + {0x03, 0x33, 0x31}, + {0x0b, 0x33, 0x31}, + {0x03, 0x33, 0x31}, + {0x0b, 0x33, 0x31}, + {0x03, 0x33, 0x31}, + {0x0b, 0x33, 0x31}, + {0x03, 0x33, 0x31}, + {0x0b, 0x33, 0x31}, + {0x03, 0x33, 0x31}, + {0x0b, 0x33, 0x31}, + {0x03, 0x33, 0x31}, + {0x0b, 0x33, 0x31}, + {0x03, 0x33, 0x31}, + {0x06, 0x66, 0x61} +}; + static u8 al7230_init_table[CB_AL7230_INIT_SEQ][3] = { - {0x20, 0x37, 0x90}, // Channel1 // Need modify for 11a - {0x13, 0x33, 0x31}, // Channel1 // Need modify for 11a - {0x84, 0x1F, 0xF2}, // Need modify for 11a: 451FE2 - {0x3F, 0xDF, 0xA3}, // Need modify for 11a: 5FDFA3 - {0x7F, 0xD7, 0x84}, // 11b/g // Need modify for 11a - //0x802B4500+(BY_AL7230_REG_LEN<<3)+IFREGCTL_REGW, // Need modify for 11a: 8D1B45 - // RoberYu:20050113, Rev0.47 Regsiter Setting Guide - {0x80, 0x2B, 0x55}, // Need modify for 11a: 8D1B55 - {0x56, 0xAF, 0x36}, - {0xCE, 0x02, 0x07}, // Need modify for 11a: 860207 - {0x6E, 0xBC, 0x98}, - {0x22, 0x1B, 0xB9}, - {0xE0, 0x00, 0x0A}, // Need modify for 11a: E0600A - {0x08, 0x03, 0x1B}, // init 0x080B1B00 => 0x080F1B00 for 3 wire control TxGain(D10) - //0x00093C00+(BY_AL7230_REG_LEN<<3)+IFREGCTL_REGW, // Need modify for 11a: 00143C - // RoberYu:20050113, Rev0.47 Regsiter Setting Guide - {0x00, 0x0A, 0x3C}, // Need modify for 11a: 00143C - {0xFF, 0xFF, 0xFD}, - {0x00, 0x00, 0x0E}, - {0x1A, 0xBA, 0x8F} // Need modify for 11a: 12BACF - }; + {0x20, 0x37, 0x90}, + {0x13, 0x33, 0x31}, + {0x84, 0x1f, 0xf2}, + {0x3f, 0xdf, 0xa3}, + {0x7f, 0xd7, 0x84}, + {0x80, 0x2b, 0x55}, + {0x56, 0xaf, 0x36}, + {0xce, 0x02, 0x07}, + {0x6e, 0xbc, 0x98}, + {0x22, 0x1b, 0xb9}, + {0xe0, 0x00, 0x0a}, + {0x08, 0x03, 0x1b}, + {0x00, 0x0a, 0x3c}, + {0xff, 0xff, 0xfd}, + {0x00, 0x00, 0x0e}, + {0x1a, 0xba, 0x8f} +}; static u8 al7230_init_table_amode[CB_AL7230_INIT_SEQ][3] = { - {0x2F, 0xF5, 0x20}, // Channel184 // Need modify for 11b/g - {0x00, 0x00, 0x01}, // Channel184 // Need modify for 11b/g - {0x45, 0x1F, 0xE2}, // Need modify for 11b/g - {0x5F, 0xDF, 0xA3}, // Need modify for 11b/g - {0x6F, 0xD7, 0x84}, // 11a // Need modify for 11b/g - {0x85, 0x3F, 0x55}, // Need modify for 11b/g, RoberYu:20050113 - {0x56, 0xAF, 0x36}, - {0xCE, 0x02, 0x07}, // Need modify for 11b/g - {0x6E, 0xBC, 0x98}, - {0x22, 0x1B, 0xB9}, - {0xE0, 0x60, 0x0A}, // Need modify for 11b/g - {0x08, 0x03, 0x1B}, // init 0x080B1B00 => 0x080F1B00 for 3 wire control TxGain(D10) - {0x00, 0x14, 0x7C}, // Need modify for 11b/g - {0xFF, 0xFF, 0xFD}, - {0x00, 0x00, 0x0E}, - {0x12, 0xBA, 0xCF} // Need modify for 11b/g - }; + {0x2f, 0xf5, 0x20}, + {0x00, 0x00, 0x01}, + {0x45, 0x1f, 0xe2}, + {0x5f, 0xdf, 0xa3}, + {0x6f, 0xd7, 0x84}, + {0x85, 0x3f, 0x55}, + {0x56, 0xaf, 0x36}, + {0xce, 0x02, 0x07}, + {0x6e, 0xbc, 0x98}, + {0x22, 0x1b, 0xb9}, + {0xe0, 0x60, 0x0a}, + {0x08, 0x03, 0x1b}, + {0x00, 0x14, 0x7c}, + {0xff, 0xff, 0xfd}, + {0x00, 0x00, 0x0e}, + {0x12, 0xba, 0xcf} +}; static u8 al7230_channel_table0[CB_MAX_CHANNEL][3] = { - {0x20, 0x37, 0x90}, // channel = 1, Tf = 2412MHz - {0x20, 0x37, 0x90}, // channel = 2, Tf = 2417MHz - {0x20, 0x37, 0x90}, // channel = 3, Tf = 2422MHz - {0x20, 0x37, 0x90}, // channel = 4, Tf = 2427MHz - {0x20, 0x37, 0xA0}, // channel = 5, Tf = 2432MHz - {0x20, 0x37, 0xA0}, // channel = 6, Tf = 2437MHz - {0x20, 0x37, 0xA0}, // channel = 7, Tf = 2442MHz - {0x20, 0x37, 0xA0}, // channel = 8, Tf = 2447MHz //RobertYu: 20050218, update for APNode 0.49 - {0x20, 0x37, 0xB0}, // channel = 9, Tf = 2452MHz //RobertYu: 20050218, update for APNode 0.49 - {0x20, 0x37, 0xB0}, // channel = 10, Tf = 2457MHz //RobertYu: 20050218, update for APNode 0.49 - {0x20, 0x37, 0xB0}, // channel = 11, Tf = 2462MHz //RobertYu: 20050218, update for APNode 0.49 - {0x20, 0x37, 0xB0}, // channel = 12, Tf = 2467MHz //RobertYu: 20050218, update for APNode 0.49 - {0x20, 0x37, 0xC0}, // channel = 13, Tf = 2472MHz //RobertYu: 20050218, update for APNode 0.49 - {0x20, 0x37, 0xC0}, // channel = 14, Tf = 2484MHz - - // 4.9G => Ch 183, 184, 185, 187, 188, 189, 192, 196 (Value:15 ~ 22) - {0x0F, 0xF5, 0x20}, // channel = 183, Tf = 4915MHz (15) - {0x2F, 0xF5, 0x20}, // channel = 184, Tf = 4920MHz (16) - {0x0F, 0xF5, 0x20}, // channel = 185, Tf = 4925MHz (17) - {0x0F, 0xF5, 0x20}, // channel = 187, Tf = 4935MHz (18) - {0x2F, 0xF5, 0x20}, // channel = 188, Tf = 4940MHz (19) - {0x0F, 0xF5, 0x20}, // channel = 189, Tf = 4945MHz (20) - {0x2F, 0xF5, 0x30}, // channel = 192, Tf = 4960MHz (21) - {0x2F, 0xF5, 0x30}, // channel = 196, Tf = 4980MHz (22) - - // 5G => Ch 7, 8, 9, 11, 12, 16, 34, 36, 38, 40, 42, 44, 46, 48, 52, 56, 60, 64, - // 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140, 149, 153, 157, 161, 165 (Value 23 ~ 56) - - {0x0F, 0xF5, 0x40}, // channel = 7, Tf = 5035MHz (23) - {0x2F, 0xF5, 0x40}, // channel = 8, Tf = 5040MHz (24) - {0x0F, 0xF5, 0x40}, // channel = 9, Tf = 5045MHz (25) - {0x0F, 0xF5, 0x40}, // channel = 11, Tf = 5055MHz (26) - {0x2F, 0xF5, 0x40}, // channel = 12, Tf = 5060MHz (27) - {0x2F, 0xF5, 0x50}, // channel = 16, Tf = 5080MHz (28) - {0x2F, 0xF5, 0x60}, // channel = 34, Tf = 5170MHz (29) - {0x2F, 0xF5, 0x60}, // channel = 36, Tf = 5180MHz (30) - {0x2F, 0xF5, 0x70}, // channel = 38, Tf = 5190MHz (31) //RobertYu: 20050218, update for APNode 0.49 - {0x2F, 0xF5, 0x70}, // channel = 40, Tf = 5200MHz (32) - {0x2F, 0xF5, 0x70}, // channel = 42, Tf = 5210MHz (33) - {0x2F, 0xF5, 0x70}, // channel = 44, Tf = 5220MHz (34) - {0x2F, 0xF5, 0x70}, // channel = 46, Tf = 5230MHz (35) - {0x2F, 0xF5, 0x70}, // channel = 48, Tf = 5240MHz (36) - {0x2F, 0xF5, 0x80}, // channel = 52, Tf = 5260MHz (37) - {0x2F, 0xF5, 0x80}, // channel = 56, Tf = 5280MHz (38) - {0x2F, 0xF5, 0x80}, // channel = 60, Tf = 5300MHz (39) - {0x2F, 0xF5, 0x90}, // channel = 64, Tf = 5320MHz (40) - - {0x2F, 0xF5, 0xC0}, // channel = 100, Tf = 5500MHz (41) - {0x2F, 0xF5, 0xC0}, // channel = 104, Tf = 5520MHz (42) - {0x2F, 0xF5, 0xC0}, // channel = 108, Tf = 5540MHz (43) - {0x2F, 0xF5, 0xD0}, // channel = 112, Tf = 5560MHz (44) - {0x2F, 0xF5, 0xD0}, // channel = 116, Tf = 5580MHz (45) - {0x2F, 0xF5, 0xD0}, // channel = 120, Tf = 5600MHz (46) - {0x2F, 0xF5, 0xE0}, // channel = 124, Tf = 5620MHz (47) - {0x2F, 0xF5, 0xE0}, // channel = 128, Tf = 5640MHz (48) - {0x2F, 0xF5, 0xE0}, // channel = 132, Tf = 5660MHz (49) - {0x2F, 0xF5, 0xF0}, // channel = 136, Tf = 5680MHz (50) - {0x2F, 0xF5, 0xF0}, // channel = 140, Tf = 5700MHz (51) - {0x2F, 0xF6, 0x00}, // channel = 149, Tf = 5745MHz (52) - {0x2F, 0xF6, 0x00}, // channel = 153, Tf = 5765MHz (53) - {0x2F, 0xF6, 0x00}, // channel = 157, Tf = 5785MHz (54) - {0x2F, 0xF6, 0x10}, // channel = 161, Tf = 5805MHz (55) - {0x2F, 0xF6, 0x10} // channel = 165, Tf = 5825MHz (56) - }; + {0x20, 0x37, 0x90}, + {0x20, 0x37, 0x90}, + {0x20, 0x37, 0x90}, + {0x20, 0x37, 0x90}, + {0x20, 0x37, 0xa0}, + {0x20, 0x37, 0xa0}, + {0x20, 0x37, 0xa0}, + {0x20, 0x37, 0xa0}, + {0x20, 0x37, 0xb0}, + {0x20, 0x37, 0xb0}, + {0x20, 0x37, 0xb0}, + {0x20, 0x37, 0xb0}, + {0x20, 0x37, 0xc0}, + {0x20, 0x37, 0xc0}, + {0x0f, 0xf5, 0x20}, /* channel 15 Tf = 4915MHz */ + {0x2f, 0xf5, 0x20}, + {0x0f, 0xf5, 0x20}, + {0x0f, 0xf5, 0x20}, + {0x2f, 0xf5, 0x20}, + {0x0f, 0xf5, 0x20}, + {0x2f, 0xf5, 0x30}, + {0x2f, 0xf5, 0x30}, + {0x0f, 0xf5, 0x40}, + {0x2f, 0xf5, 0x40}, + {0x0f, 0xf5, 0x40}, + {0x0f, 0xf5, 0x40}, + {0x2f, 0xf5, 0x40}, + {0x2f, 0xf5, 0x50}, + {0x2f, 0xf5, 0x60}, + {0x2f, 0xf5, 0x60}, + {0x2f, 0xf5, 0x70}, + {0x2f, 0xf5, 0x70}, + {0x2f, 0xf5, 0x70}, + {0x2f, 0xf5, 0x70}, + {0x2f, 0xf5, 0x70}, + {0x2f, 0xf5, 0x70}, + {0x2f, 0xf5, 0x80}, + {0x2f, 0xf5, 0x80}, + {0x2f, 0xf5, 0x80}, + {0x2f, 0xf5, 0x90}, + {0x2f, 0xf5, 0xc0}, + {0x2f, 0xf5, 0xc0}, + {0x2f, 0xf5, 0xc0}, + {0x2f, 0xf5, 0xd0}, + {0x2f, 0xf5, 0xd0}, + {0x2f, 0xf5, 0xd0}, + {0x2f, 0xf5, 0xe0}, + {0x2f, 0xf5, 0xe0}, + {0x2f, 0xf5, 0xe0}, + {0x2f, 0xf5, 0xf0}, + {0x2f, 0xf5, 0xf0}, + {0x2f, 0xf6, 0x00}, + {0x2f, 0xf6, 0x00}, + {0x2f, 0xf6, 0x00}, + {0x2f, 0xf6, 0x10}, + {0x2f, 0xf6, 0x10} +}; static u8 al7230_channel_table1[CB_MAX_CHANNEL][3] = { - {0x13, 0x33, 0x31}, // channel = 1, Tf = 2412MHz - {0x1B, 0x33, 0x31}, // channel = 2, Tf = 2417MHz - {0x03, 0x33, 0x31}, // channel = 3, Tf = 2422MHz - {0x0B, 0x33, 0x31}, // channel = 4, Tf = 2427MHz - {0x13, 0x33, 0x31}, // channel = 5, Tf = 2432MHz - {0x1B, 0x33, 0x31}, // channel = 6, Tf = 2437MHz - {0x03, 0x33, 0x31}, // channel = 7, Tf = 2442MHz - {0x0B, 0x33, 0x31}, // channel = 8, Tf = 2447MHz - {0x13, 0x33, 0x31}, // channel = 9, Tf = 2452MHz - {0x1B, 0x33, 0x31}, // channel = 10, Tf = 2457MHz - {0x03, 0x33, 0x31}, // channel = 11, Tf = 2462MHz - {0x0B, 0x33, 0x31}, // channel = 12, Tf = 2467MHz - {0x13, 0x33, 0x31}, // channel = 13, Tf = 2472MHz - {0x06, 0x66, 0x61}, // channel = 14, Tf = 2484MHz - - // 4.9G => Ch 183, 184, 185, 187, 188, 189, 192, 196 (Value:15 ~ 22) - {0x1D, 0x55, 0x51}, // channel = 183, Tf = 4915MHz (15) - {0x00, 0x00, 0x01}, // channel = 184, Tf = 4920MHz (16) - {0x02, 0xAA, 0xA1}, // channel = 185, Tf = 4925MHz (17) - {0x08, 0x00, 0x01}, // channel = 187, Tf = 4935MHz (18) - {0x0A, 0xAA, 0xA1}, // channel = 188, Tf = 4940MHz (19) - {0x0D, 0x55, 0x51}, // channel = 189, Tf = 4945MHz (20) - {0x15, 0x55, 0x51}, // channel = 192, Tf = 4960MHz (21) - {0x00, 0x00, 0x01}, // channel = 196, Tf = 4980MHz (22) - - // 5G => Ch 7, 8, 9, 11, 12, 16, 34, 36, 38, 40, 42, 44, 46, 48, 52, 56, 60, 64, - // 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140, 149, 153, 157, 161, 165 (Value 23 ~ 56) - {0x1D, 0x55, 0x51}, // channel = 7, Tf = 5035MHz (23) - {0x00, 0x00, 0x01}, // channel = 8, Tf = 5040MHz (24) - {0x02, 0xAA, 0xA1}, // channel = 9, Tf = 5045MHz (25) - {0x08, 0x00, 0x01}, // channel = 11, Tf = 5055MHz (26) - {0x0A, 0xAA, 0xA1}, // channel = 12, Tf = 5060MHz (27) - {0x15, 0x55, 0x51}, // channel = 16, Tf = 5080MHz (28) - {0x05, 0x55, 0x51}, // channel = 34, Tf = 5170MHz (29) - {0x0A, 0xAA, 0xA1}, // channel = 36, Tf = 5180MHz (30) - {0x10, 0x00, 0x01}, // channel = 38, Tf = 5190MHz (31) - {0x15, 0x55, 0x51}, // channel = 40, Tf = 5200MHz (32) - {0x1A, 0xAA, 0xA1}, // channel = 42, Tf = 5210MHz (33) - {0x00, 0x00, 0x01}, // channel = 44, Tf = 5220MHz (34) - {0x05, 0x55, 0x51}, // channel = 46, Tf = 5230MHz (35) - {0x0A, 0xAA, 0xA1}, // channel = 48, Tf = 5240MHz (36) - {0x15, 0x55, 0x51}, // channel = 52, Tf = 5260MHz (37) - {0x00, 0x00, 0x01}, // channel = 56, Tf = 5280MHz (38) - {0x0A, 0xAA, 0xA1}, // channel = 60, Tf = 5300MHz (39) - {0x15, 0x55, 0x51}, // channel = 64, Tf = 5320MHz (40) - {0x15, 0x55, 0x51}, // channel = 100, Tf = 5500MHz (41) - {0x00, 0x00, 0x01}, // channel = 104, Tf = 5520MHz (42) - {0x0A, 0xAA, 0xA1}, // channel = 108, Tf = 5540MHz (43) - {0x15, 0x55, 0x51}, // channel = 112, Tf = 5560MHz (44) - {0x00, 0x00, 0x01}, // channel = 116, Tf = 5580MHz (45) - {0x0A, 0xAA, 0xA1}, // channel = 120, Tf = 5600MHz (46) - {0x15, 0x55, 0x51}, // channel = 124, Tf = 5620MHz (47) - {0x00, 0x00, 0x01}, // channel = 128, Tf = 5640MHz (48) - {0x0A, 0xAA, 0xA1}, // channel = 132, Tf = 5660MHz (49) - {0x15, 0x55, 0x51}, // channel = 136, Tf = 5680MHz (50) - {0x00, 0x00, 0x01}, // channel = 140, Tf = 5700MHz (51) - {0x18, 0x00, 0x01}, // channel = 149, Tf = 5745MHz (52) - {0x02, 0xAA, 0xA1}, // channel = 153, Tf = 5765MHz (53) - {0x0D, 0x55, 0x51}, // channel = 157, Tf = 5785MHz (54) - {0x18, 0x00, 0x01}, // channel = 161, Tf = 5805MHz (55) - {0x02, 0xAA, 0xB1} // channel = 165, Tf = 5825MHz (56) - }; + {0x13, 0x33, 0x31}, + {0x1b, 0x33, 0x31}, + {0x03, 0x33, 0x31}, + {0x0b, 0x33, 0x31}, + {0x13, 0x33, 0x31}, + {0x1b, 0x33, 0x31}, + {0x03, 0x33, 0x31}, + {0x0b, 0x33, 0x31}, + {0x13, 0x33, 0x31}, + {0x1b, 0x33, 0x31}, + {0x03, 0x33, 0x31}, + {0x0b, 0x33, 0x31}, + {0x13, 0x33, 0x31}, + {0x06, 0x66, 0x61}, + {0x1d, 0x55, 0x51}, /* channel = 15, Tf = 4915MHz */ + {0x00, 0x00, 0x01}, + {0x02, 0xaa, 0xa1}, + {0x08, 0x00, 0x01}, + {0x0a, 0xaa, 0xa1}, + {0x0d, 0x55, 0x51}, + {0x15, 0x55, 0x51}, + {0x00, 0x00, 0x01}, + {0x1d, 0x55, 0x51}, + {0x00, 0x00, 0x01}, + {0x02, 0xaa, 0xa1}, + {0x08, 0x00, 0x01}, + {0x0a, 0xaa, 0xa1}, + {0x15, 0x55, 0x51}, + {0x05, 0x55, 0x51}, + {0x0a, 0xaa, 0xa1}, + {0x10, 0x00, 0x01}, + {0x15, 0x55, 0x51}, + {0x1a, 0xaa, 0xa1}, + {0x00, 0x00, 0x01}, + {0x05, 0x55, 0x51}, + {0x0a, 0xaa, 0xa1}, + {0x15, 0x55, 0x51}, + {0x00, 0x00, 0x01}, + {0x0a, 0xaa, 0xa1}, + {0x15, 0x55, 0x51}, + {0x15, 0x55, 0x51}, + {0x00, 0x00, 0x01}, + {0x0a, 0xaa, 0xa1}, + {0x15, 0x55, 0x51}, + {0x00, 0x00, 0x01}, + {0x0a, 0xaa, 0xa1}, + {0x15, 0x55, 0x51}, + {0x00, 0x00, 0x01}, + {0x0a, 0xaa, 0xa1}, + {0x15, 0x55, 0x51}, + {0x00, 0x00, 0x01}, + {0x18, 0x00, 0x01}, + {0x02, 0xaa, 0xa1}, + {0x0d, 0x55, 0x51}, + {0x18, 0x00, 0x01}, + {0x02, 0xaa, 0xb1} +}; static u8 al7230_channel_table2[CB_MAX_CHANNEL][3] = { - {0x7F, 0xD7, 0x84}, // channel = 1, Tf = 2412MHz - {0x7F, 0xD7, 0x84}, // channel = 2, Tf = 2417MHz - {0x7F, 0xD7, 0x84}, // channel = 3, Tf = 2422MHz - {0x7F, 0xD7, 0x84}, // channel = 4, Tf = 2427MHz - {0x7F, 0xD7, 0x84}, // channel = 5, Tf = 2432MHz - {0x7F, 0xD7, 0x84}, // channel = 6, Tf = 2437MHz - {0x7F, 0xD7, 0x84}, // channel = 7, Tf = 2442MHz - {0x7F, 0xD7, 0x84}, // channel = 8, Tf = 2447MHz - {0x7F, 0xD7, 0x84}, // channel = 9, Tf = 2452MHz - {0x7F, 0xD7, 0x84}, // channel = 10, Tf = 2457MHz - {0x7F, 0xD7, 0x84}, // channel = 11, Tf = 2462MHz - {0x7F, 0xD7, 0x84}, // channel = 12, Tf = 2467MHz - {0x7F, 0xD7, 0x84}, // channel = 13, Tf = 2472MHz - {0x7F, 0xD7, 0x84}, // channel = 14, Tf = 2484MHz - - // 4.9G => Ch 183, 184, 185, 187, 188, 189, 192, 196 (Value:15 ~ 22) - {0x7F, 0xD7, 0x84}, // channel = 183, Tf = 4915MHz (15) - {0x6F, 0xD7, 0x84}, // channel = 184, Tf = 4920MHz (16) - {0x7F, 0xD7, 0x84}, // channel = 185, Tf = 4925MHz (17) - {0x7F, 0xD7, 0x84}, // channel = 187, Tf = 4935MHz (18) - {0x7F, 0xD7, 0x84}, // channel = 188, Tf = 4940MHz (19) - {0x7F, 0xD7, 0x84}, // channel = 189, Tf = 4945MHz (20) - {0x7F, 0xD7, 0x84}, // channel = 192, Tf = 4960MHz (21) - {0x6F, 0xD7, 0x84}, // channel = 196, Tf = 4980MHz (22) - - // 5G => Ch 7, 8, 9, 11, 12, 16, 34, 36, 38, 40, 42, 44, 46, 48, 52, 56, 60, 64, - // 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140, 149, 153, 157, 161, 165 (Value 23 ~ 56) - {0x7F, 0xD7, 0x84}, // channel = 7, Tf = 5035MHz (23) - {0x6F, 0xD7, 0x84}, // channel = 8, Tf = 5040MHz (24) - {0x7F, 0xD7, 0x84}, // channel = 9, Tf = 5045MHz (25) - {0x7F, 0xD7, 0x84}, // channel = 11, Tf = 5055MHz (26) - {0x7F, 0xD7, 0x84}, // channel = 12, Tf = 5060MHz (27) - {0x7F, 0xD7, 0x84}, // channel = 16, Tf = 5080MHz (28) - {0x7F, 0xD7, 0x84}, // channel = 34, Tf = 5170MHz (29) - {0x7F, 0xD7, 0x84}, // channel = 36, Tf = 5180MHz (30) - {0x7F, 0xD7, 0x84}, // channel = 38, Tf = 5190MHz (31) - {0x7F, 0xD7, 0x84}, // channel = 40, Tf = 5200MHz (32) - {0x7F, 0xD7, 0x84}, // channel = 42, Tf = 5210MHz (33) - {0x6F, 0xD7, 0x84}, // channel = 44, Tf = 5220MHz (34) - {0x7F, 0xD7, 0x84}, // channel = 46, Tf = 5230MHz (35) - {0x7F, 0xD7, 0x84}, // channel = 48, Tf = 5240MHz (36) - {0x7F, 0xD7, 0x84}, // channel = 52, Tf = 5260MHz (37) - {0x6F, 0xD7, 0x84}, // channel = 56, Tf = 5280MHz (38) - {0x7F, 0xD7, 0x84}, // channel = 60, Tf = 5300MHz (39) - {0x7F, 0xD7, 0x84}, // channel = 64, Tf = 5320MHz (40) - {0x7F, 0xD7, 0x84}, // channel = 100, Tf = 5500MHz (41) - {0x6F, 0xD7, 0x84}, // channel = 104, Tf = 5520MHz (42) - {0x7F, 0xD7, 0x84}, // channel = 108, Tf = 5540MHz (43) - {0x7F, 0xD7, 0x84}, // channel = 112, Tf = 5560MHz (44) - {0x6F, 0xD7, 0x84}, // channel = 116, Tf = 5580MHz (45) - {0x7F, 0xD7, 0x84}, // channel = 120, Tf = 5600MHz (46) - {0x7F, 0xD7, 0x84}, // channel = 124, Tf = 5620MHz (47) - {0x6F, 0xD7, 0x84}, // channel = 128, Tf = 5640MHz (48) - {0x7F, 0xD7, 0x84}, // channel = 132, Tf = 5660MHz (49) - {0x7F, 0xD7, 0x84}, // channel = 136, Tf = 5680MHz (50) - {0x6F, 0xD7, 0x84}, // channel = 140, Tf = 5700MHz (51) - {0x7F, 0xD7, 0x84}, // channel = 149, Tf = 5745MHz (52) - {0x7F, 0xD7, 0x84}, // channel = 153, Tf = 5765MHz (53) - {0x7F, 0xD7, 0x84}, // channel = 157, Tf = 5785MHz (54) - {0x7F, 0xD7, 0x84}, // channel = 161, Tf = 5805MHz (55) - {0x7F, 0xD7, 0x84} // channel = 165, Tf = 5825MHz (56) - }; - -///{{RobertYu:20051111 + {0x7f, 0xd7, 0x84}, + {0x7f, 0xd7, 0x84}, + {0x7f, 0xd7, 0x84}, + {0x7f, 0xd7, 0x84}, + {0x7f, 0xd7, 0x84}, + {0x7f, 0xd7, 0x84}, + {0x7f, 0xd7, 0x84}, + {0x7f, 0xd7, 0x84}, + {0x7f, 0xd7, 0x84}, + {0x7f, 0xd7, 0x84}, + {0x7f, 0xd7, 0x84}, + {0x7f, 0xd7, 0x84}, + {0x7f, 0xd7, 0x84}, + {0x7f, 0xd7, 0x84}, + {0x7f, 0xd7, 0x84}, /* channel = 15 Tf = 4915MHz */ + {0x6f, 0xd7, 0x84}, + {0x7f, 0xd7, 0x84}, + {0x7f, 0xd7, 0x84}, + {0x7f, 0xd7, 0x84}, + {0x7f, 0xd7, 0x84}, + {0x7f, 0xd7, 0x84}, + {0x6f, 0xd7, 0x84}, + {0x7f, 0xd7, 0x84}, + {0x6f, 0xd7, 0x84}, + {0x7f, 0xd7, 0x84}, + {0x7f, 0xd7, 0x84}, + {0x7f, 0xd7, 0x84}, + {0x7f, 0xd7, 0x84}, + {0x7f, 0xd7, 0x84}, + {0x7f, 0xd7, 0x84}, + {0x7f, 0xd7, 0x84}, + {0x7f, 0xd7, 0x84}, + {0x7f, 0xd7, 0x84}, + {0x6f, 0xd7, 0x84}, + {0x7f, 0xd7, 0x84}, + {0x7f, 0xd7, 0x84}, + {0x7f, 0xd7, 0x84}, + {0x6f, 0xd7, 0x84}, + {0x7f, 0xd7, 0x84}, + {0x7f, 0xd7, 0x84}, + {0x7f, 0xd7, 0x84}, + {0x6f, 0xd7, 0x84}, + {0x7f, 0xd7, 0x84}, + {0x7f, 0xd7, 0x84}, + {0x6f, 0xd7, 0x84}, + {0x7f, 0xd7, 0x84}, + {0x7f, 0xd7, 0x84}, + {0x6f, 0xd7, 0x84}, + {0x7f, 0xd7, 0x84}, + {0x7f, 0xd7, 0x84}, + {0x6f, 0xd7, 0x84}, + {0x7f, 0xd7, 0x84}, + {0x7f, 0xd7, 0x84}, + {0x7f, 0xd7, 0x84}, + {0x7f, 0xd7, 0x84}, + {0x7f, 0xd7, 0x84} +}; + static u8 vt3226_init_table[CB_VT3226_INIT_SEQ][3] = { - {0x03, 0xFF, 0x80}, - {0x02, 0x82, 0xA1}, - {0x03, 0xC6, 0xA2}, - {0x01, 0x97, 0x93}, - {0x03, 0x66, 0x64}, - {0x00, 0x61, 0xA5}, - {0x01, 0x7B, 0xD6}, - {0x00, 0x80, 0x17}, - {0x03, 0xF8, 0x08}, - {0x00, 0x02, 0x39}, //RobertYu:20051116 - {0x02, 0x00, 0x2A} - }; + {0x03, 0xff, 0x80}, + {0x02, 0x82, 0xa1}, + {0x03, 0xc6, 0xa2}, + {0x01, 0x97, 0x93}, + {0x03, 0x66, 0x64}, + {0x00, 0x61, 0xa5}, + {0x01, 0x7b, 0xd6}, + {0x00, 0x80, 0x17}, + {0x03, 0xf8, 0x08}, + {0x00, 0x02, 0x39}, + {0x02, 0x00, 0x2a} +}; static u8 vt3226d0_init_table[CB_VT3226_INIT_SEQ][3] = { - {0x03, 0xFF, 0x80}, - {0x03, 0x02, 0x21}, //RobertYu:20060327 - {0x03, 0xC6, 0xA2}, - {0x01, 0x97, 0x93}, - {0x03, 0x66, 0x64}, - {0x00, 0x71, 0xA5}, //RobertYu:20060103 - {0x01, 0x15, 0xC6}, //RobertYu:20060420 - {0x01, 0x2E, 0x07}, //RobertYu:20060420 - {0x00, 0x58, 0x08}, //RobertYu:20060111 - {0x00, 0x02, 0x79}, //RobertYu:20060420 - {0x02, 0x01, 0xAA} //RobertYu:20060523 - }; + {0x03, 0xff, 0x80}, + {0x03, 0x02, 0x21}, + {0x03, 0xc6, 0xa2}, + {0x01, 0x97, 0x93}, + {0x03, 0x66, 0x64}, + {0x00, 0x71, 0xa5}, + {0x01, 0x15, 0xc6}, + {0x01, 0x2e, 0x07}, + {0x00, 0x58, 0x08}, + {0x00, 0x02, 0x79}, + {0x02, 0x01, 0xaa} +}; static u8 vt3226_channel_table0[CB_MAX_CHANNEL_24G][3] = { - {0x01, 0x97, 0x83}, // channel = 1, Tf = 2412MHz - {0x01, 0x97, 0x83}, // channel = 2, Tf = 2417MHz - {0x01, 0x97, 0x93}, // channel = 3, Tf = 2422MHz - {0x01, 0x97, 0x93}, // channel = 4, Tf = 2427MHz - {0x01, 0x97, 0x93}, // channel = 5, Tf = 2432MHz - {0x01, 0x97, 0x93}, // channel = 6, Tf = 2437MHz - {0x01, 0x97, 0xA3}, // channel = 7, Tf = 2442MHz - {0x01, 0x97, 0xA3}, // channel = 8, Tf = 2447MHz - {0x01, 0x97, 0xA3}, // channel = 9, Tf = 2452MHz - {0x01, 0x97, 0xA3}, // channel = 10, Tf = 2457MHz - {0x01, 0x97, 0xB3}, // channel = 11, Tf = 2462MHz - {0x01, 0x97, 0xB3}, // channel = 12, Tf = 2467MHz - {0x01, 0x97, 0xB3}, // channel = 13, Tf = 2472MHz - {0x03, 0x37, 0xC3} // channel = 14, Tf = 2484MHz - }; + {0x01, 0x97, 0x83}, + {0x01, 0x97, 0x83}, + {0x01, 0x97, 0x93}, + {0x01, 0x97, 0x93}, + {0x01, 0x97, 0x93}, + {0x01, 0x97, 0x93}, + {0x01, 0x97, 0xa3}, + {0x01, 0x97, 0xa3}, + {0x01, 0x97, 0xa3}, + {0x01, 0x97, 0xa3}, + {0x01, 0x97, 0xb3}, + {0x01, 0x97, 0xb3}, + {0x01, 0x97, 0xb3}, + {0x03, 0x37, 0xc3} +}; static u8 vt3226_channel_table1[CB_MAX_CHANNEL_24G][3] = { - {0x02, 0x66, 0x64}, // channel = 1, Tf = 2412MHz - {0x03, 0x66, 0x64}, // channel = 2, Tf = 2417MHz - {0x00, 0x66, 0x64}, // channel = 3, Tf = 2422MHz - {0x01, 0x66, 0x64}, // channel = 4, Tf = 2427MHz - {0x02, 0x66, 0x64}, // channel = 5, Tf = 2432MHz - {0x03, 0x66, 0x64}, // channel = 6, Tf = 2437MHz - {0x00, 0x66, 0x64}, // channel = 7, Tf = 2442MHz - {0x01, 0x66, 0x64}, // channel = 8, Tf = 2447MHz - {0x02, 0x66, 0x64}, // channel = 9, Tf = 2452MHz - {0x03, 0x66, 0x64}, // channel = 10, Tf = 2457MHz - {0x00, 0x66, 0x64}, // channel = 11, Tf = 2462MHz - {0x01, 0x66, 0x64}, // channel = 12, Tf = 2467MHz - {0x02, 0x66, 0x64}, // channel = 13, Tf = 2472MHz - {0x00, 0xCC, 0xC4} // channel = 14, Tf = 2484MHz - }; -///}}RobertYu - -//{{RobertYu:20060502, TWIF 1.14, LO Current for 11b mode + {0x02, 0x66, 0x64}, + {0x03, 0x66, 0x64}, + {0x00, 0x66, 0x64}, + {0x01, 0x66, 0x64}, + {0x02, 0x66, 0x64}, + {0x03, 0x66, 0x64}, + {0x00, 0x66, 0x64}, + {0x01, 0x66, 0x64}, + {0x02, 0x66, 0x64}, + {0x03, 0x66, 0x64}, + {0x00, 0x66, 0x64}, + {0x01, 0x66, 0x64}, + {0x02, 0x66, 0x64}, + {0x00, 0xcc, 0xc4} +}; + static const u32 vt3226d0_lo_current_table[CB_MAX_CHANNEL_24G] = { - 0x0135C600+(BY_VT3226_REG_LEN<<3)+IFREGCTL_REGW, // channel = 1, Tf = 2412MHz - 0x0135C600+(BY_VT3226_REG_LEN<<3)+IFREGCTL_REGW, // channel = 2, Tf = 2417MHz - 0x0235C600+(BY_VT3226_REG_LEN<<3)+IFREGCTL_REGW, // channel = 3, Tf = 2422MHz - 0x0235C600+(BY_VT3226_REG_LEN<<3)+IFREGCTL_REGW, // channel = 4, Tf = 2427MHz - 0x0235C600+(BY_VT3226_REG_LEN<<3)+IFREGCTL_REGW, // channel = 5, Tf = 2432MHz - 0x0335C600+(BY_VT3226_REG_LEN<<3)+IFREGCTL_REGW, // channel = 6, Tf = 2437MHz - 0x0335C600+(BY_VT3226_REG_LEN<<3)+IFREGCTL_REGW, // channel = 7, Tf = 2442MHz - 0x0335C600+(BY_VT3226_REG_LEN<<3)+IFREGCTL_REGW, // channel = 8, Tf = 2447MHz - 0x0335C600+(BY_VT3226_REG_LEN<<3)+IFREGCTL_REGW, // channel = 9, Tf = 2452MHz - 0x0335C600+(BY_VT3226_REG_LEN<<3)+IFREGCTL_REGW, // channel = 10, Tf = 2457MHz - 0x0335C600+(BY_VT3226_REG_LEN<<3)+IFREGCTL_REGW, // channel = 11, Tf = 2462MHz - 0x0335C600+(BY_VT3226_REG_LEN<<3)+IFREGCTL_REGW, // channel = 12, Tf = 2467MHz - 0x0335C600+(BY_VT3226_REG_LEN<<3)+IFREGCTL_REGW, // channel = 13, Tf = 2472MHz - 0x0135C600+(BY_VT3226_REG_LEN<<3)+IFREGCTL_REGW // channel = 14, Tf = 2484MHz + 0x0135c600, + 0x0135c600, + 0x0235c600, + 0x0235c600, + 0x0235c600, + 0x0335c600, + 0x0335c600, + 0x0335c600, + 0x0335c600, + 0x0335c600, + 0x0335c600, + 0x0335c600, + 0x0335c600, + 0x0135c600 }; -//}} -//{{RobertYu:20060609 static u8 vt3342a0_init_table[CB_VT3342_INIT_SEQ][3] = { /* 11b/g mode */ - {0x03, 0xFF, 0x80}, //update for mode// - {0x02, 0x08, 0x81}, - {0x00, 0xC6, 0x02}, - {0x03, 0xC5, 0x13}, // channel6 - {0x00, 0xEE, 0xE4}, // channel6 - {0x00, 0x71, 0xA5}, - {0x01, 0x75, 0x46}, - {0x01, 0x40, 0x27}, - {0x01, 0x54, 0x08}, - {0x00, 0x01, 0x69}, - {0x02, 0x00, 0xAA}, - {0x00, 0x08, 0xCB}, - {0x01, 0x70, 0x0C} - }; - - //11b/g mode: 0x03, 0xFF, 0x80, - //11a mode: 0x03, 0xFF, 0xC0, - - // channel44, 5220MHz 0x00C402 - // channel56, 5280MHz 0x00C402 for disable Frac - // other channels 0x00C602 + {0x03, 0xff, 0x80}, + {0x02, 0x08, 0x81}, + {0x00, 0xc6, 0x02}, + {0x03, 0xc5, 0x13}, + {0x00, 0xee, 0xe4}, + {0x00, 0x71, 0xa5}, + {0x01, 0x75, 0x46}, + {0x01, 0x40, 0x27}, + {0x01, 0x54, 0x08}, + {0x00, 0x01, 0x69}, + {0x02, 0x00, 0xaa}, + {0x00, 0x08, 0xcb}, + {0x01, 0x70, 0x0c} +}; static u8 vt3342_channel_table0[CB_MAX_CHANNEL][3] = { - {0x02, 0x05, 0x03}, // channel = 1, Tf = 2412MHz - {0x01, 0x15, 0x03}, // channel = 2, Tf = 2417MHz - {0x03, 0xC5, 0x03}, // channel = 3, Tf = 2422MHz - {0x02, 0x65, 0x03}, // channel = 4, Tf = 2427MHz - {0x01, 0x15, 0x13}, // channel = 5, Tf = 2432MHz - {0x03, 0xC5, 0x13}, // channel = 6, Tf = 2437MHz - {0x02, 0x05, 0x13}, // channel = 7, Tf = 2442MHz - {0x01, 0x15, 0x13}, // channel = 8, Tf = 2447MHz - {0x03, 0xC5, 0x13}, // channel = 9, Tf = 2452MHz - {0x02, 0x65, 0x13}, // channel = 10, Tf = 2457MHz - {0x01, 0x15, 0x23}, // channel = 11, Tf = 2462MHz - {0x03, 0xC5, 0x23}, // channel = 12, Tf = 2467MHz - {0x02, 0x05, 0x23}, // channel = 13, Tf = 2472MHz - {0x00, 0xD5, 0x23}, // channel = 14, Tf = 2484MHz - - // 4.9G => Ch 183, 184, 185, 187, 188, 189, 192, 196 (Value:15 ~ 22) - {0x01, 0x15, 0x13}, // channel = 183, Tf = 4915MHz (15), TBD - {0x01, 0x15, 0x13}, // channel = 184, Tf = 4920MHz (16), TBD - {0x01, 0x15, 0x13}, // channel = 185, Tf = 4925MHz (17), TBD - {0x01, 0x15, 0x13}, // channel = 187, Tf = 4935MHz (18), TBD - {0x01, 0x15, 0x13}, // channel = 188, Tf = 4940MHz (19), TBD - {0x01, 0x15, 0x13}, // channel = 189, Tf = 4945MHz (20), TBD - {0x01, 0x15, 0x13}, // channel = 192, Tf = 4960MHz (21), TBD - {0x01, 0x15, 0x13}, // channel = 196, Tf = 4980MHz (22), TBD - - // 5G => Ch 7, 8, 9, 11, 12, 16, 34, 36, 38, 40, 42, 44, 46, 48, 52, 56, 60, 64, - // 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140, 149, 153, 157, 161, 165 (Value 23 ~ 56) - {0x01, 0x15, 0x13}, // channel = 7, Tf = 5035MHz (23), TBD - {0x01, 0x15, 0x13}, // channel = 8, Tf = 5040MHz (24), TBD - {0x01, 0x15, 0x13}, // channel = 9, Tf = 5045MHz (25), TBD - {0x01, 0x15, 0x13}, // channel = 11, Tf = 5055MHz (26), TBD - {0x01, 0x15, 0x13}, // channel = 12, Tf = 5060MHz (27), TBD - {0x01, 0x15, 0x13}, // channel = 16, Tf = 5080MHz (28), TBD - {0x01, 0x15, 0x13}, // channel = 34, Tf = 5170MHz (29), TBD - {0x01, 0x55, 0x63}, // channel = 36, Tf = 5180MHz (30) - {0x01, 0x55, 0x63}, // channel = 38, Tf = 5190MHz (31), TBD - {0x02, 0xA5, 0x63}, // channel = 40, Tf = 5200MHz (32) - {0x02, 0xA5, 0x63}, // channel = 42, Tf = 5210MHz (33), TBD - {0x00, 0x05, 0x73}, // channel = 44, Tf = 5220MHz (34) - {0x00, 0x05, 0x73}, // channel = 46, Tf = 5230MHz (35), TBD - {0x01, 0x55, 0x73}, // channel = 48, Tf = 5240MHz (36) - {0x02, 0xA5, 0x73}, // channel = 52, Tf = 5260MHz (37) - {0x00, 0x05, 0x83}, // channel = 56, Tf = 5280MHz (38) - {0x01, 0x55, 0x83}, // channel = 60, Tf = 5300MHz (39) - {0x02, 0xA5, 0x83}, // channel = 64, Tf = 5320MHz (40) - - {0x02, 0xA5, 0x83}, // channel = 100, Tf = 5500MHz (41), TBD - {0x02, 0xA5, 0x83}, // channel = 104, Tf = 5520MHz (42), TBD - {0x02, 0xA5, 0x83}, // channel = 108, Tf = 5540MHz (43), TBD - {0x02, 0xA5, 0x83}, // channel = 112, Tf = 5560MHz (44), TBD - {0x02, 0xA5, 0x83}, // channel = 116, Tf = 5580MHz (45), TBD - {0x02, 0xA5, 0x83}, // channel = 120, Tf = 5600MHz (46), TBD - {0x02, 0xA5, 0x83}, // channel = 124, Tf = 5620MHz (47), TBD - {0x02, 0xA5, 0x83}, // channel = 128, Tf = 5640MHz (48), TBD - {0x02, 0xA5, 0x83}, // channel = 132, Tf = 5660MHz (49), TBD - {0x02, 0xA5, 0x83}, // channel = 136, Tf = 5680MHz (50), TBD - {0x02, 0xA5, 0x83}, // channel = 140, Tf = 5700MHz (51), TBD - - {0x00, 0x05, 0xF3}, // channel = 149, Tf = 5745MHz (52) - {0x01, 0x56, 0x03}, // channel = 153, Tf = 5765MHz (53) - {0x02, 0xA6, 0x03}, // channel = 157, Tf = 5785MHz (54) - {0x00, 0x06, 0x03}, // channel = 161, Tf = 5805MHz (55) - {0x00, 0x06, 0x03} // channel = 165, Tf = 5825MHz (56), TBD - }; + {0x02, 0x05, 0x03}, + {0x01, 0x15, 0x03}, + {0x03, 0xc5, 0x03}, + {0x02, 0x65, 0x03}, + {0x01, 0x15, 0x13}, + {0x03, 0xc5, 0x13}, + {0x02, 0x05, 0x13}, + {0x01, 0x15, 0x13}, + {0x03, 0xc5, 0x13}, + {0x02, 0x65, 0x13}, + {0x01, 0x15, 0x23}, + {0x03, 0xc5, 0x23}, + {0x02, 0x05, 0x23}, + {0x00, 0xd5, 0x23}, + {0x01, 0x15, 0x13}, /* channel = 15 Tf = 4915MHz */ + {0x01, 0x15, 0x13}, + {0x01, 0x15, 0x13}, + {0x01, 0x15, 0x13}, + {0x01, 0x15, 0x13}, + {0x01, 0x15, 0x13}, + {0x01, 0x15, 0x13}, + {0x01, 0x15, 0x13}, + {0x01, 0x15, 0x13}, + {0x01, 0x15, 0x13}, + {0x01, 0x15, 0x13}, + {0x01, 0x15, 0x13}, + {0x01, 0x15, 0x13}, + {0x01, 0x15, 0x13}, + {0x01, 0x15, 0x13}, + {0x01, 0x55, 0x63}, + {0x01, 0x55, 0x63}, + {0x02, 0xa5, 0x63}, + {0x02, 0xa5, 0x63}, + {0x00, 0x05, 0x73}, + {0x00, 0x05, 0x73}, + {0x01, 0x55, 0x73}, + {0x02, 0xa5, 0x73}, + {0x00, 0x05, 0x83}, + {0x01, 0x55, 0x83}, + {0x02, 0xa5, 0x83}, + {0x02, 0xa5, 0x83}, + {0x02, 0xa5, 0x83}, + {0x02, 0xa5, 0x83}, + {0x02, 0xa5, 0x83}, + {0x02, 0xa5, 0x83}, + {0x02, 0xa5, 0x83}, + {0x02, 0xa5, 0x83}, + {0x02, 0xa5, 0x83}, + {0x02, 0xa5, 0x83}, + {0x02, 0xa5, 0x83}, + {0x02, 0xa5, 0x83}, + {0x00, 0x05, 0xF3}, + {0x01, 0x56, 0x03}, + {0x02, 0xa6, 0x03}, + {0x00, 0x06, 0x03}, + {0x00, 0x06, 0x03} +}; static u8 vt3342_channel_table1[CB_MAX_CHANNEL][3] = { - {0x01, 0x99, 0x94}, // channel = 1, Tf = 2412MHz - {0x02, 0x44, 0x44}, // channel = 2, Tf = 2417MHz - {0x02, 0xEE, 0xE4}, // channel = 3, Tf = 2422MHz - {0x03, 0x99, 0x94}, // channel = 4, Tf = 2427MHz - {0x00, 0x44, 0x44}, // channel = 5, Tf = 2432MHz - {0x00, 0xEE, 0xE4}, // channel = 6, Tf = 2437MHz - {0x01, 0x99, 0x94}, // channel = 7, Tf = 2442MHz - {0x02, 0x44, 0x44}, // channel = 8, Tf = 2447MHz - {0x02, 0xEE, 0xE4}, // channel = 9, Tf = 2452MHz - {0x03, 0x99, 0x94}, // channel = 10, Tf = 2457MHz - {0x00, 0x44, 0x44}, // channel = 11, Tf = 2462MHz - {0x00, 0xEE, 0xE4}, // channel = 12, Tf = 2467MHz - {0x01, 0x99, 0x94}, // channel = 13, Tf = 2472MHz - {0x03, 0x33, 0x34}, // channel = 14, Tf = 2484MHz - - // 4.9G => Ch 183, 184, 185, 187, 188, 189, 192, 196 (Value:15 ~ 22) - {0x00, 0x44, 0x44}, // channel = 183, Tf = 4915MHz (15), TBD - {0x00, 0x44, 0x44}, // channel = 184, Tf = 4920MHz (16), TBD - {0x00, 0x44, 0x44}, // channel = 185, Tf = 4925MHz (17), TBD - {0x00, 0x44, 0x44}, // channel = 187, Tf = 4935MHz (18), TBD - {0x00, 0x44, 0x44}, // channel = 188, Tf = 4940MHz (19), TBD - {0x00, 0x44, 0x44}, // channel = 189, Tf = 4945MHz (20), TBD - {0x00, 0x44, 0x44}, // channel = 192, Tf = 4960MHz (21), TBD - {0x00, 0x44, 0x44}, // channel = 196, Tf = 4980MHz (22), TBD - - // 5G => Ch 7, 8, 9, 11, 12, 16, 34, 36, 38, 40, 42, 44, 46, 48, 52, 56, 60, 64, - // 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140, 149, 153, 157, 161, 165 (Value 23 ~ 56) - {0x00, 0x44, 0x44}, // channel = 7, Tf = 5035MHz (23), TBD - {0x00, 0x44, 0x44}, // channel = 8, Tf = 5040MHz (24), TBD - {0x00, 0x44, 0x44}, // channel = 9, Tf = 5045MHz (25), TBD - {0x00, 0x44, 0x44}, // channel = 11, Tf = 5055MHz (26), TBD - {0x00, 0x44, 0x44}, // channel = 12, Tf = 5060MHz (27), TBD - {0x00, 0x44, 0x44}, // channel = 16, Tf = 5080MHz (28), TBD - {0x00, 0x44, 0x44}, // channel = 34, Tf = 5170MHz (29), TBD - {0x01, 0x55, 0x54}, // channel = 36, Tf = 5180MHz (30) - {0x01, 0x55, 0x54}, // channel = 38, Tf = 5190MHz (31), TBD - {0x02, 0xAA, 0xA4}, // channel = 40, Tf = 5200MHz (32) - {0x02, 0xAA, 0xA4}, // channel = 42, Tf = 5210MHz (33), TBD - {0x00, 0x00, 0x04}, // channel = 44, Tf = 5220MHz (34) - {0x00, 0x00, 0x04}, // channel = 46, Tf = 5230MHz (35), TBD - {0x01, 0x55, 0x54}, // channel = 48, Tf = 5240MHz (36) - {0x02, 0xAA, 0xA4}, // channel = 52, Tf = 5260MHz (37) - {0x00, 0x00, 0x04}, // channel = 56, Tf = 5280MHz (38) - {0x01, 0x55, 0x54}, // channel = 60, Tf = 5300MHz (39) - {0x02, 0xAA, 0xA4}, // channel = 64, Tf = 5320MHz (40) - {0x02, 0xAA, 0xA4}, // channel = 100, Tf = 5500MHz (41), TBD - {0x02, 0xAA, 0xA4}, // channel = 104, Tf = 5520MHz (42), TBD - {0x02, 0xAA, 0xA4}, // channel = 108, Tf = 5540MHz (43), TBD - {0x02, 0xAA, 0xA4}, // channel = 112, Tf = 5560MHz (44), TBD - {0x02, 0xAA, 0xA4}, // channel = 116, Tf = 5580MHz (45), TBD - {0x02, 0xAA, 0xA4}, // channel = 120, Tf = 5600MHz (46), TBD - {0x02, 0xAA, 0xA4}, // channel = 124, Tf = 5620MHz (47), TBD - {0x02, 0xAA, 0xA4}, // channel = 128, Tf = 5640MHz (48), TBD - {0x02, 0xAA, 0xA4}, // channel = 132, Tf = 5660MHz (49), TBD - {0x02, 0xAA, 0xA4}, // channel = 136, Tf = 5680MHz (50), TBD - {0x02, 0xAA, 0xA4}, // channel = 140, Tf = 5700MHz (51), TBD - {0x03, 0x00, 0x04}, // channel = 149, Tf = 5745MHz (52) - {0x00, 0x55, 0x54}, // channel = 153, Tf = 5765MHz (53) - {0x01, 0xAA, 0xA4}, // channel = 157, Tf = 5785MHz (54) - {0x03, 0x00, 0x04}, // channel = 161, Tf = 5805MHz (55) - {0x03, 0x00, 0x04} // channel = 165, Tf = 5825MHz (56), TBD - }; - -/*+ - * - * Power Table - * --*/ + {0x01, 0x99, 0x94}, + {0x02, 0x44, 0x44}, + {0x02, 0xee, 0xe4}, + {0x03, 0x99, 0x94}, + {0x00, 0x44, 0x44}, + {0x00, 0xee, 0xe4}, + {0x01, 0x99, 0x94}, + {0x02, 0x44, 0x44}, + {0x02, 0xee, 0xe4}, + {0x03, 0x99, 0x94}, + {0x00, 0x44, 0x44}, + {0x00, 0xee, 0xe4}, + {0x01, 0x99, 0x94}, + {0x03, 0x33, 0x34}, + {0x00, 0x44, 0x44}, /* channel = 15 Tf = 4915MHz */ + {0x00, 0x44, 0x44}, + {0x00, 0x44, 0x44}, + {0x00, 0x44, 0x44}, + {0x00, 0x44, 0x44}, + {0x00, 0x44, 0x44}, + {0x00, 0x44, 0x44}, + {0x00, 0x44, 0x44}, + {0x00, 0x44, 0x44}, + {0x00, 0x44, 0x44}, + {0x00, 0x44, 0x44}, + {0x00, 0x44, 0x44}, + {0x00, 0x44, 0x44}, + {0x00, 0x44, 0x44}, + {0x00, 0x44, 0x44}, + {0x01, 0x55, 0x54}, + {0x01, 0x55, 0x54}, + {0x02, 0xaa, 0xa4}, + {0x02, 0xaa, 0xa4}, + {0x00, 0x00, 0x04}, + {0x00, 0x00, 0x04}, + {0x01, 0x55, 0x54}, + {0x02, 0xaa, 0xa4}, + {0x00, 0x00, 0x04}, + {0x01, 0x55, 0x54}, + {0x02, 0xaa, 0xa4}, + {0x02, 0xaa, 0xa4}, + {0x02, 0xaa, 0xa4}, + {0x02, 0xaa, 0xa4}, + {0x02, 0xaa, 0xa4}, + {0x02, 0xaa, 0xa4}, + {0x02, 0xaa, 0xa4}, + {0x02, 0xaa, 0xa4}, + {0x02, 0xaa, 0xa4}, + {0x02, 0xaa, 0xa4}, + {0x02, 0xaa, 0xa4}, + {0x02, 0xaa, 0xa4}, + {0x03, 0x00, 0x04}, + {0x00, 0x55, 0x54}, + {0x01, 0xaa, 0xa4}, + {0x03, 0x00, 0x04}, + {0x03, 0x00, 0x04} +}; +/* Power Table */ static const u32 al2230_power_table[AL2230_PWR_IDX_LEN] = { - 0x04040900+(BY_AL2230_REG_LEN<<3)+IFREGCTL_REGW, - 0x04041900+(BY_AL2230_REG_LEN<<3)+IFREGCTL_REGW, - 0x04042900+(BY_AL2230_REG_LEN<<3)+IFREGCTL_REGW, - 0x04043900+(BY_AL2230_REG_LEN<<3)+IFREGCTL_REGW, - 0x04044900+(BY_AL2230_REG_LEN<<3)+IFREGCTL_REGW, - 0x04045900+(BY_AL2230_REG_LEN<<3)+IFREGCTL_REGW, - 0x04046900+(BY_AL2230_REG_LEN<<3)+IFREGCTL_REGW, - 0x04047900+(BY_AL2230_REG_LEN<<3)+IFREGCTL_REGW, - 0x04048900+(BY_AL2230_REG_LEN<<3)+IFREGCTL_REGW, - 0x04049900+(BY_AL2230_REG_LEN<<3)+IFREGCTL_REGW, - 0x0404A900+(BY_AL2230_REG_LEN<<3)+IFREGCTL_REGW, - 0x0404B900+(BY_AL2230_REG_LEN<<3)+IFREGCTL_REGW, - 0x0404C900+(BY_AL2230_REG_LEN<<3)+IFREGCTL_REGW, - 0x0404D900+(BY_AL2230_REG_LEN<<3)+IFREGCTL_REGW, - 0x0404E900+(BY_AL2230_REG_LEN<<3)+IFREGCTL_REGW, - 0x0404F900+(BY_AL2230_REG_LEN<<3)+IFREGCTL_REGW, - 0x04050900+(BY_AL2230_REG_LEN<<3)+IFREGCTL_REGW, - 0x04051900+(BY_AL2230_REG_LEN<<3)+IFREGCTL_REGW, - 0x04052900+(BY_AL2230_REG_LEN<<3)+IFREGCTL_REGW, - 0x04053900+(BY_AL2230_REG_LEN<<3)+IFREGCTL_REGW, - 0x04054900+(BY_AL2230_REG_LEN<<3)+IFREGCTL_REGW, - 0x04055900+(BY_AL2230_REG_LEN<<3)+IFREGCTL_REGW, - 0x04056900+(BY_AL2230_REG_LEN<<3)+IFREGCTL_REGW, - 0x04057900+(BY_AL2230_REG_LEN<<3)+IFREGCTL_REGW, - 0x04058900+(BY_AL2230_REG_LEN<<3)+IFREGCTL_REGW, - 0x04059900+(BY_AL2230_REG_LEN<<3)+IFREGCTL_REGW, - 0x0405A900+(BY_AL2230_REG_LEN<<3)+IFREGCTL_REGW, - 0x0405B900+(BY_AL2230_REG_LEN<<3)+IFREGCTL_REGW, - 0x0405C900+(BY_AL2230_REG_LEN<<3)+IFREGCTL_REGW, - 0x0405D900+(BY_AL2230_REG_LEN<<3)+IFREGCTL_REGW, - 0x0405E900+(BY_AL2230_REG_LEN<<3)+IFREGCTL_REGW, - 0x0405F900+(BY_AL2230_REG_LEN<<3)+IFREGCTL_REGW, - 0x04060900+(BY_AL2230_REG_LEN<<3)+IFREGCTL_REGW, - 0x04061900+(BY_AL2230_REG_LEN<<3)+IFREGCTL_REGW, - 0x04062900+(BY_AL2230_REG_LEN<<3)+IFREGCTL_REGW, - 0x04063900+(BY_AL2230_REG_LEN<<3)+IFREGCTL_REGW, - 0x04064900+(BY_AL2230_REG_LEN<<3)+IFREGCTL_REGW, - 0x04065900+(BY_AL2230_REG_LEN<<3)+IFREGCTL_REGW, - 0x04066900+(BY_AL2230_REG_LEN<<3)+IFREGCTL_REGW, - 0x04067900+(BY_AL2230_REG_LEN<<3)+IFREGCTL_REGW, - 0x04068900+(BY_AL2230_REG_LEN<<3)+IFREGCTL_REGW, - 0x04069900+(BY_AL2230_REG_LEN<<3)+IFREGCTL_REGW, - 0x0406A900+(BY_AL2230_REG_LEN<<3)+IFREGCTL_REGW, - 0x0406B900+(BY_AL2230_REG_LEN<<3)+IFREGCTL_REGW, - 0x0406C900+(BY_AL2230_REG_LEN<<3)+IFREGCTL_REGW, - 0x0406D900+(BY_AL2230_REG_LEN<<3)+IFREGCTL_REGW, - 0x0406E900+(BY_AL2230_REG_LEN<<3)+IFREGCTL_REGW, - 0x0406F900+(BY_AL2230_REG_LEN<<3)+IFREGCTL_REGW, - 0x04070900+(BY_AL2230_REG_LEN<<3)+IFREGCTL_REGW, - 0x04071900+(BY_AL2230_REG_LEN<<3)+IFREGCTL_REGW, - 0x04072900+(BY_AL2230_REG_LEN<<3)+IFREGCTL_REGW, - 0x04073900+(BY_AL2230_REG_LEN<<3)+IFREGCTL_REGW, - 0x04074900+(BY_AL2230_REG_LEN<<3)+IFREGCTL_REGW, - 0x04075900+(BY_AL2230_REG_LEN<<3)+IFREGCTL_REGW, - 0x04076900+(BY_AL2230_REG_LEN<<3)+IFREGCTL_REGW, - 0x04077900+(BY_AL2230_REG_LEN<<3)+IFREGCTL_REGW, - 0x04078900+(BY_AL2230_REG_LEN<<3)+IFREGCTL_REGW, - 0x04079900+(BY_AL2230_REG_LEN<<3)+IFREGCTL_REGW, - 0x0407A900+(BY_AL2230_REG_LEN<<3)+IFREGCTL_REGW, - 0x0407B900+(BY_AL2230_REG_LEN<<3)+IFREGCTL_REGW, - 0x0407C900+(BY_AL2230_REG_LEN<<3)+IFREGCTL_REGW, - 0x0407D900+(BY_AL2230_REG_LEN<<3)+IFREGCTL_REGW, - 0x0407E900+(BY_AL2230_REG_LEN<<3)+IFREGCTL_REGW, - 0x0407F900+(BY_AL2230_REG_LEN<<3)+IFREGCTL_REGW - }; - -//{{ RobertYu:20050103, Channel 11a Number To Index -// 4.9G => Ch 183, 184, 185, 187, 188, 189, 192, 196 (Value:15 ~ 22) -// 5G => Ch 7, 8, 9, 11, 12, 16, 34, 36, 38, 40, 42, 44, 46, 48, 52, 56, 60, 64, -// 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140, 149, 153, 157, 161, 165 (Value 23 ~ 56) - -const u8 RFaby11aChannelIndex[200] = { - // 1 2 3 4 5 6 7 8 9 10 - 00, 00, 00, 00, 00, 00, 23, 24, 25, 00, // 10 - 26, 27, 00, 00, 00, 28, 00, 00, 00, 00, // 20 - 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, // 30 - 00, 00, 00, 29, 00, 30, 00, 31, 00, 32, // 40 - 00, 33, 00, 34, 00, 35, 00, 36, 00, 00, // 50 - 00, 37, 00, 00, 00, 38, 00, 00, 00, 39, // 60 - 00, 00, 00, 40, 00, 00, 00, 00, 00, 00, // 70 - 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, // 80 - 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, // 90 - 00, 00, 00, 00, 00, 00, 00, 00, 00, 41, //100 - - 00, 00, 00, 42, 00, 00, 00, 43, 00, 00, //110 - 00, 44, 00, 00, 00, 45, 00, 00, 00, 46, //120 - 00, 00, 00, 47, 00, 00, 00, 48, 00, 00, //130 - 00, 49, 00, 00, 00, 50, 00, 00, 00, 51, //140 - 00, 00, 00, 00, 00, 00, 00, 00, 52, 00, //150 - 00, 00, 53, 00, 00, 00, 54, 00, 00, 00, //160 - 55, 00, 00, 00, 56, 00, 00, 00, 00, 00, //170 - 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, //180 - 00, 00, 15, 16, 17, 00, 18, 19, 20, 00, //190 - 00, 21, 00, 00, 00, 22, 00, 00, 00, 00 //200 + 0x04040900, + 0x04041900, + 0x04042900, + 0x04043900, + 0x04044900, + 0x04045900, + 0x04046900, + 0x04047900, + 0x04048900, + 0x04049900, + 0x0404a900, + 0x0404b900, + 0x0404c900, + 0x0404d900, + 0x0404e900, + 0x0404f900, + 0x04050900, + 0x04051900, + 0x04052900, + 0x04053900, + 0x04054900, + 0x04055900, + 0x04056900, + 0x04057900, + 0x04058900, + 0x04059900, + 0x0405a900, + 0x0405b900, + 0x0405c900, + 0x0405d900, + 0x0405e900, + 0x0405f900, + 0x04060900, + 0x04061900, + 0x04062900, + 0x04063900, + 0x04064900, + 0x04065900, + 0x04066900, + 0x04067900, + 0x04068900, + 0x04069900, + 0x0406a900, + 0x0406b900, + 0x0406c900, + 0x0406d900, + 0x0406e900, + 0x0406f900, + 0x04070900, + 0x04071900, + 0x04072900, + 0x04073900, + 0x04074900, + 0x04075900, + 0x04076900, + 0x04077900, + 0x04078900, + 0x04079900, + 0x0407a900, + 0x0407b900, + 0x0407c900, + 0x0407d900, + 0x0407e900, + 0x0407f900 }; -//}} RobertYu /* * Description: Write to IF/RF, by embedded programming - * - * Parameters: - * In: - * dwData - data to write - * Out: - * none - * - * Return Value: true if succeeded; false if failed. - * */ int vnt_rf_write_embedded(struct vnt_private *priv, u32 data) { u8 reg_data[4]; + data |= (VNT_RF_REG_LEN << 3) | IFREGCTL_REGW; + reg_data[0] = (u8)data; reg_data[1] = (u8)(data >> 8); reg_data[2] = (u8)(data >> 16); @@ -719,23 +620,11 @@ int vnt_rf_write_embedded(struct vnt_private *priv, u32 data) return true; } -/* - * Description: Set Tx power - * - * Parameters: - * In: - * dwIoBase - I/O base address - * dwRFPowerTable - RF Tx Power Setting - * Out: - * none - * - * Return Value: true if succeeded; false if failed. - * - */ +/* Set Tx power by rate and channel number */ int vnt_rf_setpower(struct vnt_private *priv, u32 rate, u32 channel) { int ret = true; - u8 power = priv->byCCKPwr; + u8 power = priv->cck_pwr; if (channel == 0) return -EINVAL; @@ -745,7 +634,10 @@ int vnt_rf_setpower(struct vnt_private *priv, u32 rate, u32 channel) case RATE_2M: case RATE_5M: case RATE_11M: - power = priv->abyCCKPwrTbl[channel-1]; + channel--; + + if (channel < sizeof(priv->cck_pwr_tbl)) + power = priv->cck_pwr_tbl[channel]; break; case RATE_6M: case RATE_9M: @@ -755,9 +647,9 @@ int vnt_rf_setpower(struct vnt_private *priv, u32 rate, u32 channel) case RATE_48M: case RATE_54M: if (channel > CB_MAX_CHANNEL_24G) - power = priv->abyOFDMAPwrTbl[channel-15]; + power = priv->ofdm_a_pwr_tbl[channel-15]; else - power = priv->abyOFDMPwrTbl[channel-1]; + power = priv->ofdm_pwr_tbl[channel-1]; break; } @@ -768,12 +660,12 @@ int vnt_rf_setpower(struct vnt_private *priv, u32 rate, u32 channel) static u8 vnt_rf_addpower(struct vnt_private *priv) { - s32 rssi = -priv->uCurrRSSI; + s32 rssi = -priv->current_rssi; if (!rssi) return 7; - if (priv->byRFType == RF_VT3226D0) { + if (priv->rf_type == RF_VT3226D0) { if (rssi < -70) return 9; else if (rssi < -65) @@ -792,20 +684,7 @@ static u8 vnt_rf_addpower(struct vnt_private *priv) return 0; } -/* - * Description: Set Tx power - * - * Parameters: - * In: - * dwIoBase - I/O base address - * dwRFPowerTable - RF Tx Power Setting - * Out: - * none - * - * Return Value: true if succeeded; false if failed. - * - */ - +/* Set Tx power by power level and rate */ int vnt_rf_set_txpower(struct vnt_private *priv, u8 power, u32 rate) { u32 power_setting = 0; @@ -815,133 +694,105 @@ int vnt_rf_set_txpower(struct vnt_private *priv, u8 power, u32 rate) if (power > VNT_RF_MAX_POWER) power = VNT_RF_MAX_POWER; - if (priv->byCurPwr == power) + if (priv->power == power) return true; - priv->byCurPwr = power; + priv->power = power; - switch (priv->byRFType) { + switch (priv->rf_type) { case RF_AL2230: - if (priv->byCurPwr >= AL2230_PWR_IDX_LEN) + if (power >= AL2230_PWR_IDX_LEN) return false; - ret &= vnt_rf_write_embedded(priv, - al2230_power_table[priv->byCurPwr]); + ret &= vnt_rf_write_embedded(priv, al2230_power_table[power]); if (rate <= RATE_11M) - ret &= vnt_rf_write_embedded(priv, 0x0001b400 + - (BY_AL2230_REG_LEN << 3) + IFREGCTL_REGW); + ret &= vnt_rf_write_embedded(priv, 0x0001b400); else - ret &= vnt_rf_write_embedded(priv, 0x0005a400 + - (BY_AL2230_REG_LEN << 3) + IFREGCTL_REGW); + ret &= vnt_rf_write_embedded(priv, 0x0005a400); break; case RF_AL2230S: - if (priv->byCurPwr >= AL2230_PWR_IDX_LEN) + if (power >= AL2230_PWR_IDX_LEN) return false; - ret &= vnt_rf_write_embedded(priv, - al2230_power_table[priv->byCurPwr]); + ret &= vnt_rf_write_embedded(priv, al2230_power_table[power]); if (rate <= RATE_11M) { - ret &= vnt_rf_write_embedded(priv, 0x040c1400 + - (BY_AL2230_REG_LEN << 3) + IFREGCTL_REGW); - ret &= vnt_rf_write_embedded(priv, 0x00299b00 + - (BY_AL2230_REG_LEN << 3) + IFREGCTL_REGW); + ret &= vnt_rf_write_embedded(priv, 0x040c1400); + ret &= vnt_rf_write_embedded(priv, 0x00299b00); } else { - ret &= vnt_rf_write_embedded(priv, 0x0005a400 + - (BY_AL2230_REG_LEN << 3) + IFREGCTL_REGW); - ret &= vnt_rf_write_embedded(priv, 0x00099b00 + - (BY_AL2230_REG_LEN << 3) + IFREGCTL_REGW); + ret &= vnt_rf_write_embedded(priv, 0x0005a400); + ret &= vnt_rf_write_embedded(priv, 0x00099b00); } break; case RF_AIROHA7230: if (rate <= RATE_11M) - ret &= vnt_rf_write_embedded(priv, 0x111bb900 + - (BY_AL7230_REG_LEN << 3)+IFREGCTL_REGW); + ret &= vnt_rf_write_embedded(priv, 0x111bb900); else - ret &= vnt_rf_write_embedded(priv, 0x221bb900 + - (BY_AL7230_REG_LEN << 3)+IFREGCTL_REGW); + ret &= vnt_rf_write_embedded(priv, 0x221bb900); - if (priv->byCurPwr > AL7230_PWR_IDX_LEN) + if (power >= AL7230_PWR_IDX_LEN) return false; /* * 0x080F1B00 for 3 wire control TxGain(D10) * and 0x31 as TX Gain value */ - power_setting = 0x080c0b00 | ((priv->byCurPwr) << 12) | - (BY_AL7230_REG_LEN << 3) | IFREGCTL_REGW; + power_setting = 0x080c0b00 | (power << 12); ret &= vnt_rf_write_embedded(priv, power_setting); break; case RF_VT3226: - if (priv->byCurPwr >= VT3226_PWR_IDX_LEN) + if (power >= VT3226_PWR_IDX_LEN) return false; - power_setting = ((0x3f - priv->byCurPwr) << 20) | (0x17 << 8) | - (BY_VT3226_REG_LEN << 3) | IFREGCTL_REGW; + power_setting = ((0x3f - power) << 20) | (0x17 << 8); ret &= vnt_rf_write_embedded(priv, power_setting); break; case RF_VT3226D0: - if (priv->byCurPwr >= VT3226_PWR_IDX_LEN) + if (power >= VT3226_PWR_IDX_LEN) return false; if (rate <= RATE_11M) { - power_setting = ((0x3f-priv->byCurPwr) << 20) | - (0xe07 << 8) | (BY_VT3226_REG_LEN << 3) | - IFREGCTL_REGW; + u16 hw_value = priv->hw->conf.chandef.chan->hw_value; + + power_setting = ((0x3f - power) << 20) | (0xe07 << 8); ret &= vnt_rf_write_embedded(priv, power_setting); - ret &= vnt_rf_write_embedded(priv, 0x03c6a200 + - (BY_VT3226_REG_LEN<<3)+IFREGCTL_REGW); + ret &= vnt_rf_write_embedded(priv, 0x03c6a200); - if (priv->vnt_mgmt.eScanState != WMAC_NO_SCANNING) { - dev_dbg(&priv->usb->dev, - "vnt_rf_set_txpower> 11B mode uCurrChannel[%d]\n", - priv->vnt_mgmt.uScanChannel); - ret &= vnt_rf_write_embedded(priv, - vt3226d0_lo_current_table[priv-> - vnt_mgmt.uScanChannel - 1]); - } else { - dev_dbg(&priv->usb->dev, - "vnt_rf_set_txpower> 11B mode uCurrChannel[%d]\n", - priv->vnt_mgmt.uCurrChannel); + dev_dbg(&priv->usb->dev, + "%s 11b channel [%d]\n", __func__, hw_value); + + hw_value--; + + if (hw_value < ARRAY_SIZE(vt3226d0_lo_current_table)) ret &= vnt_rf_write_embedded(priv, - vt3226d0_lo_current_table[priv-> - vnt_mgmt.uCurrChannel - 1]); - } + vt3226d0_lo_current_table[hw_value]); - ret &= vnt_rf_write_embedded(priv, 0x015C0800 + - (BY_VT3226_REG_LEN<<3)+IFREGCTL_REGW); + ret &= vnt_rf_write_embedded(priv, 0x015C0800); } else { dev_dbg(&priv->usb->dev, "@@@@ vnt_rf_set_txpower> 11G mode\n"); - power_setting = ((0x3f-priv->byCurPwr) << 20) | - (0x7 << 8) | (BY_VT3226_REG_LEN << 3) | - IFREGCTL_REGW; + power_setting = ((0x3f - power) << 20) | (0x7 << 8); ret &= vnt_rf_write_embedded(priv, power_setting); - ret &= vnt_rf_write_embedded(priv, 0x00C6A200 + - (BY_VT3226_REG_LEN << 3) + IFREGCTL_REGW); - ret &= vnt_rf_write_embedded(priv, 0x016BC600 + - (BY_VT3226_REG_LEN<<3)+IFREGCTL_REGW); - ret &= vnt_rf_write_embedded(priv, 0x00900800 + - (BY_VT3226_REG_LEN<<3)+IFREGCTL_REGW); + ret &= vnt_rf_write_embedded(priv, 0x00C6A200); + ret &= vnt_rf_write_embedded(priv, 0x016BC600); + ret &= vnt_rf_write_embedded(priv, 0x00900800); } break; case RF_VT3342A0: - if (priv->byCurPwr >= VT3342_PWR_IDX_LEN) + if (power >= VT3342_PWR_IDX_LEN) return false; - power_setting = ((0x3F-priv->byCurPwr) << 20) | - (0x27 << 8) | (BY_VT3342_REG_LEN << 3) | - IFREGCTL_REGW; + power_setting = ((0x3f - power) << 20) | (0x27 << 8); ret &= vnt_rf_write_embedded(priv, power_setting); @@ -952,21 +803,7 @@ int vnt_rf_set_txpower(struct vnt_private *priv, u8 power, u32 rate) return ret; } -/*+ - * - * Routine Description: - * Translate RSSI to dBm - * - * Parameters: - * In: - * pDevice - The adapter to be translated - * byCurrRSSI - RSSI to be translated - * Out: - * pdwdbm - Translated dbm number - * - * Return Value: none - * --*/ +/* Convert rssi to dbm */ void vnt_rf_rssi_to_dbm(struct vnt_private *priv, u8 rssi, long *dbm) { u8 idx = (((rssi & 0xc0) >> 6) & 0x03); @@ -974,7 +811,7 @@ void vnt_rf_rssi_to_dbm(struct vnt_private *priv, u8 rssi, long *dbm) long a = 0; u8 airoharf[4] = {0, 18, 0, 40}; - switch (priv->byRFType) { + switch (priv->rf_type) { case RF_AL2230: case RF_AL2230S: case RF_AIROHA7230: @@ -997,7 +834,7 @@ void vnt_rf_table_download(struct vnt_private *priv) u16 length, value; u8 array[256]; - switch (priv->byRFType) { + switch (priv->rf_type) { case RF_AL2230: case RF_AL2230S: length1 = CB_AL2230_INIT_SEQ * 3; @@ -1083,7 +920,7 @@ void vnt_rf_table_download(struct vnt_private *priv) addr3 += length; } - if (priv->byRFType == RF_AIROHA7230) { + if (priv->rf_type == RF_AIROHA7230) { length1 = CB_AL7230_INIT_SEQ * 3; length2 = CB_MAX_CHANNEL * 3; addr1 = &(al7230_init_table_amode[0][0]); diff --git a/drivers/staging/vt6656/rf.h b/drivers/staging/vt6656/rf.h index cb331518568e..3acdc65b1e56 100644 --- a/drivers/staging/vt6656/rf.h +++ b/drivers/staging/vt6656/rf.h @@ -32,9 +32,7 @@ #include "device.h" -// -// Baseband RF pair definition in eeprom (Bits 6..0) -// +/* Baseband RF pair definition in eeprom (Bits 6..0) */ #define RF_RFMD2959 0x01 #define RF_MAXIMAG 0x02 #define RF_AL2230 0x03 @@ -46,16 +44,15 @@ #define RF_VT3226 0x09 #define RF_AIROHA7230 0x0a #define RF_UW2453 0x0b -#define RF_VT3226D0 0x0c //RobertYu:20051114 -#define RF_VT3342A0 0x0d //RobertYu:20060609 +#define RF_VT3226D0 0x0c /* RobertYu:20051114 */ +#define RF_VT3342A0 0x0d /* RobertYu:20060609 */ #define RF_AL2230S 0x0e #define RF_EMU 0x80 #define RF_MASK 0x7F #define VNT_RF_MAX_POWER 0x3f - -extern const u8 RFaby11aChannelIndex[200]; +#define VNT_RF_REG_LEN 0x17 /* 24 bit length */ int vnt_rf_write_embedded(struct vnt_private *, u32); int vnt_rf_setpower(struct vnt_private *, u32, u32); diff --git a/drivers/staging/vt6656/rxtx.c b/drivers/staging/vt6656/rxtx.c index 704f4d3639be..2d1ef88808ff 100644 --- a/drivers/staging/vt6656/rxtx.c +++ b/drivers/staging/vt6656/rxtx.c @@ -25,22 +25,12 @@ * Date: May 20, 2003 * * Functions: - * s_vGenerateTxParameter - Generate tx dma required parameter. - * s_vGenerateMACHeader - Translate 802.3 to 802.11 header - * csBeacon_xmit - beacon tx function - * csMgmt_xmit - management tx function - * s_uGetDataDuration - get tx data required duration - * s_uFillDataHead- fulfill tx data duration header - * s_uGetRTSCTSDuration- get rtx/cts required duration - * s_uGetRTSCTSRsvTime- get rts/cts reserved time - * s_uGetTxRsvTime- get frame reserved time - * s_vFillCTSHead- fulfill CTS ctl header - * s_vFillFragParameter- Set fragment ctl parameter. - * s_vFillRTSHead- fulfill RTS ctl header - * s_vFillTxKey- fulfill tx encrypt key - * s_vSWencryption- Software encrypt header - * vDMA0_tx_80211- tx 802.11 frame via dma0 - * vGenerateFIFOHeader- Generate tx FIFO ctl header + * vnt_generate_tx_parameter - Generate tx dma required parameter. + * vnt_get_duration_le - get tx data required duration + * vnt_get_rtscts_duration_le- get rtx/cts required duration + * vnt_get_rtscts_rsvtime_le- get rts/cts reserved time + * vnt_get_rsvtime- get frame reserved time + * vnt_fill_cts_head- fulfill CTS ctl header * * Revision History: * @@ -48,33 +38,25 @@ #include "device.h" #include "rxtx.h" -#include "tether.h" #include "card.h" -#include "bssdb.h" #include "mac.h" -#include "michael.h" -#include "tkip.h" -#include "wctl.h" #include "rf.h" -#include "datarate.h" #include "usbpipe.h" -#include "iocmd.h" -static int msglevel = MSG_LEVEL_INFO; +static const u16 vnt_time_stampoff[2][MAX_RATE] = { + {384, 288, 226, 209, 54, 43, 37, 31, 28, 25, 24, 23},/* Long Preamble */ + {384, 192, 130, 113, 54, 43, 37, 31, 28, 25, 24, 23},/* Short Preamble */ +}; -static const u16 wTimeStampOff[2][MAX_RATE] = { - {384, 288, 226, 209, 54, 43, 37, 31, 28, 25, 24, 23}, // Long Preamble - {384, 192, 130, 113, 54, 43, 37, 31, 28, 25, 24, 23}, // Short Preamble - }; +static const u16 vnt_fb_opt0[2][5] = { + {RATE_12M, RATE_18M, RATE_24M, RATE_36M, RATE_48M}, /* fallback_rate0 */ + {RATE_12M, RATE_12M, RATE_18M, RATE_24M, RATE_36M}, /* fallback_rate1 */ +}; -static const u16 wFB_Opt0[2][5] = { - {RATE_12M, RATE_18M, RATE_24M, RATE_36M, RATE_48M}, // fallback_rate0 - {RATE_12M, RATE_12M, RATE_18M, RATE_24M, RATE_36M}, // fallback_rate1 - }; -static const u16 wFB_Opt1[2][5] = { - {RATE_12M, RATE_18M, RATE_24M, RATE_24M, RATE_36M}, // fallback_rate0 - {RATE_6M , RATE_6M, RATE_12M, RATE_12M, RATE_18M}, // fallback_rate1 - }; +static const u16 vnt_fb_opt1[2][5] = { + {RATE_12M, RATE_18M, RATE_24M, RATE_24M, RATE_36M}, /* fallback_rate0 */ + {RATE_6M , RATE_6M, RATE_12M, RATE_12M, RATE_18M}, /* fallback_rate1 */ +}; #define RTSDUR_BB 0 #define RTSDUR_BA 1 @@ -91,268 +73,59 @@ static const u16 wFB_Opt1[2][5] = { #define DATADUR_A_F0 12 #define DATADUR_A_F1 13 -static void s_vSaveTxPktInfo(struct vnt_private *pDevice, u8 byPktNum, - u8 *pbyDestAddr, u16 wPktLength, u16 wFIFOCtl); - -static struct vnt_usb_send_context *s_vGetFreeContext(struct vnt_private *); - -static u16 s_vGenerateTxParameter(struct vnt_private *pDevice, - u8 byPktType, u16 wCurrentRate, struct vnt_tx_buffer *tx_buffer, - struct vnt_mic_hdr **mic_hdr, u32 need_mic, u32 cbFrameSize, - int bNeedACK, struct ethhdr *psEthHeader, bool need_rts); - -static void s_vGenerateMACHeader(struct vnt_private *pDevice, - u8 *pbyBufferAddr, u16 wDuration, struct ethhdr *psEthHeader, - int bNeedEncrypt, u16 wFragType, u32 uFragIdx); - -static void s_vFillTxKey(struct vnt_private *pDevice, - struct vnt_tx_fifo_head *fifo_head, u8 *pbyIVHead, - PSKeyItem pTransmitKey, u8 *pbyHdrBuf, u16 wPayloadLen, - struct vnt_mic_hdr *mic_hdr); - -static void s_vSWencryption(struct vnt_private *pDevice, - PSKeyItem pTransmitKey, u8 *pbyPayloadHead, u16 wPayloadSize); - -static unsigned int s_uGetTxRsvTime(struct vnt_private *pDevice, u8 byPktType, - u32 cbFrameLength, u16 wRate, int bNeedAck); - -static __le16 s_uGetRTSCTSRsvTime(struct vnt_private *priv, - u8 rsv_type, u8 pkt_type, u32 frame_length, u16 current_rate); - -static u16 s_vFillCTSHead(struct vnt_private *pDevice, - u8 byPktType, union vnt_tx_data_head *head, u32 cbFrameLength, - int bNeedAck, u16 wCurrentRate, u8 byFBOption); - -static u16 s_vFillRTSHead(struct vnt_private *pDevice, u8 byPktType, - union vnt_tx_data_head *head, u32 cbFrameLength, int bNeedAck, - struct ethhdr *psEthHeader, u16 wCurrentRate, u8 byFBOption); - -static __le16 s_uGetDataDuration(struct vnt_private *pDevice, - u8 byPktType, int bNeedAck); - -static __le16 s_uGetRTSCTSDuration(struct vnt_private *pDevice, - u8 byDurType, u32 cbFrameLength, u8 byPktType, u16 wRate, - int bNeedAck, u8 byFBOption); - static struct vnt_usb_send_context - *s_vGetFreeContext(struct vnt_private *priv) + *vnt_get_free_context(struct vnt_private *priv) { struct vnt_usb_send_context *context = NULL; int ii; - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"GetFreeContext()\n"); + dev_dbg(&priv->usb->dev, "%s\n", __func__); - for (ii = 0; ii < priv->cbTD; ii++) { - if (!priv->apTD[ii]) + for (ii = 0; ii < priv->num_tx_context; ii++) { + if (!priv->tx_context[ii]) return NULL; - context = priv->apTD[ii]; + context = priv->tx_context[ii]; if (context->in_use == false) { context->in_use = true; memset(context->data, 0, MAX_TOTAL_SIZE_WITH_ALL_HEADERS); + + context->hdr = NULL; + return context; } } - if (ii == priv->cbTD) - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"No Free Tx Context\n"); + if (ii == priv->num_tx_context) + dev_dbg(&priv->usb->dev, "%s No Free Tx Context\n", __func__); return NULL; } -static void s_vSaveTxPktInfo(struct vnt_private *pDevice, u8 byPktNum, - u8 *pbyDestAddr, u16 wPktLength, u16 wFIFOCtl) -{ - struct net_device_stats *stats = &pDevice->stats; - struct vnt_tx_pkt_info *pkt_info = pDevice->pkt_info; - - pkt_info[byPktNum].fifo_ctl = wFIFOCtl; - memcpy(pkt_info[byPktNum].dest_addr, pbyDestAddr, ETH_ALEN); - - stats->tx_bytes += wPktLength; -} - -static void s_vFillTxKey(struct vnt_private *pDevice, - struct vnt_tx_fifo_head *fifo_head, u8 *pbyIVHead, - PSKeyItem pTransmitKey, u8 *pbyHdrBuf, u16 wPayloadLen, - struct vnt_mic_hdr *mic_hdr) -{ - u8 *pbyBuf = (u8 *)&fifo_head->adwTxKey[0]; - __le32 *pdwIV = (__le32 *)pbyIVHead; - __le32 *pdwExtIV = (__le32 *)((u8 *)pbyIVHead + 4); - struct ieee80211_hdr *pMACHeader = (struct ieee80211_hdr *)pbyHdrBuf; - __le32 rev_iv_counter; - - /* Fill TXKEY */ - if (pTransmitKey == NULL) - return; - - rev_iv_counter = cpu_to_le32(pDevice->dwIVCounter); - *pdwIV = cpu_to_le32(pDevice->dwIVCounter); - pDevice->byKeyIndex = pTransmitKey->dwKeyIndex & 0xf; - - switch (pTransmitKey->byCipherSuite) { - case KEY_CTL_WEP: - if (pTransmitKey->uKeyLength == WLAN_WEP232_KEYLEN) { - memcpy(pDevice->abyPRNG, (u8 *)&rev_iv_counter, 3); - memcpy(pDevice->abyPRNG + 3, pTransmitKey->abyKey, - pTransmitKey->uKeyLength); - } else { - memcpy(pbyBuf, (u8 *)&rev_iv_counter, 3); - memcpy(pbyBuf + 3, pTransmitKey->abyKey, - pTransmitKey->uKeyLength); - if (pTransmitKey->uKeyLength == WLAN_WEP40_KEYLEN) { - memcpy(pbyBuf+8, (u8 *)&rev_iv_counter, 3); - memcpy(pbyBuf+11, pTransmitKey->abyKey, - pTransmitKey->uKeyLength); - } - - memcpy(pDevice->abyPRNG, pbyBuf, 16); - } - /* Append IV after Mac Header */ - *pdwIV &= cpu_to_le32(WEP_IV_MASK); - *pdwIV |= cpu_to_le32((u32)pDevice->byKeyIndex << 30); - - pDevice->dwIVCounter++; - if (pDevice->dwIVCounter > WEP_IV_MASK) - pDevice->dwIVCounter = 0; - - break; - case KEY_CTL_TKIP: - pTransmitKey->wTSC15_0++; - if (pTransmitKey->wTSC15_0 == 0) - pTransmitKey->dwTSC47_16++; - - TKIPvMixKey(pTransmitKey->abyKey, pDevice->abyCurrentNetAddr, - pTransmitKey->wTSC15_0, pTransmitKey->dwTSC47_16, - pDevice->abyPRNG); - memcpy(pbyBuf, pDevice->abyPRNG, 16); - - /* Make IV */ - memcpy(pdwIV, pDevice->abyPRNG, 3); - - *(pbyIVHead+3) = (u8)(((pDevice->byKeyIndex << 6) & - 0xc0) | 0x20); - /* Append IV&ExtIV after Mac Header */ - *pdwExtIV = cpu_to_le32(pTransmitKey->dwTSC47_16); - - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO - "vFillTxKey()---- pdwExtIV: %x\n", *pdwExtIV); - - break; - case KEY_CTL_CCMP: - pTransmitKey->wTSC15_0++; - if (pTransmitKey->wTSC15_0 == 0) - pTransmitKey->dwTSC47_16++; - - memcpy(pbyBuf, pTransmitKey->abyKey, 16); - - /* Make IV */ - *pdwIV = 0; - *(pbyIVHead+3) = (u8)(((pDevice->byKeyIndex << 6) & - 0xc0) | 0x20); - - *pdwIV |= cpu_to_le32((u32)(pTransmitKey->wTSC15_0)); - - /* Append IV&ExtIV after Mac Header */ - *pdwExtIV = cpu_to_le32(pTransmitKey->dwTSC47_16); - - if (!mic_hdr) - return; - - /* MICHDR0 */ - mic_hdr->id = 0x59; - mic_hdr->payload_len = cpu_to_be16(wPayloadLen); - memcpy(mic_hdr->mic_addr2, pMACHeader->addr2, ETH_ALEN); - - mic_hdr->tsc_47_16 = cpu_to_be32(pTransmitKey->dwTSC47_16); - mic_hdr->tsc_15_0 = cpu_to_be16(pTransmitKey->wTSC15_0); - - /* MICHDR1 */ - if (ieee80211_has_a4(pMACHeader->frame_control)) - mic_hdr->hlen = cpu_to_be16(28); - else - mic_hdr->hlen = cpu_to_be16(22); - - memcpy(mic_hdr->addr1, pMACHeader->addr1, ETH_ALEN); - memcpy(mic_hdr->addr2, pMACHeader->addr2, ETH_ALEN); - - /* MICHDR2 */ - memcpy(mic_hdr->addr3, pMACHeader->addr3, ETH_ALEN); - mic_hdr->frame_control = cpu_to_le16( - le16_to_cpu(pMACHeader->frame_control) & 0xc78f); - mic_hdr->seq_ctrl = cpu_to_le16( - le16_to_cpu(pMACHeader->seq_ctrl) & 0xf); - - if (ieee80211_has_a4(pMACHeader->frame_control)) - memcpy(mic_hdr->addr4, pMACHeader->addr4, ETH_ALEN); - } -} - -static void s_vSWencryption(struct vnt_private *pDevice, - PSKeyItem pTransmitKey, u8 *pbyPayloadHead, u16 wPayloadSize) -{ - u32 cbICVlen = 4; - u32 dwICV = 0xffffffff; - u32 *pdwICV; - - if (pTransmitKey == NULL) - return; - - if (pTransmitKey->byCipherSuite == KEY_CTL_WEP) { - //======================================================================= - // Append ICV after payload - dwICV = ether_crc_le(wPayloadSize, pbyPayloadHead); - pdwICV = (u32 *)(pbyPayloadHead + wPayloadSize); - // finally, we must invert dwCRC to get the correct answer - *pdwICV = cpu_to_le32(~dwICV); - // RC4 encryption - rc4_init(&pDevice->SBox, pDevice->abyPRNG, pTransmitKey->uKeyLength + 3); - rc4_encrypt(&pDevice->SBox, pbyPayloadHead, pbyPayloadHead, wPayloadSize+cbICVlen); - //======================================================================= - } else if (pTransmitKey->byCipherSuite == KEY_CTL_TKIP) { - //======================================================================= - //Append ICV after payload - dwICV = ether_crc_le(wPayloadSize, pbyPayloadHead); - pdwICV = (u32 *)(pbyPayloadHead + wPayloadSize); - // finally, we must invert dwCRC to get the correct answer - *pdwICV = cpu_to_le32(~dwICV); - // RC4 encryption - rc4_init(&pDevice->SBox, pDevice->abyPRNG, TKIP_KEY_LEN); - rc4_encrypt(&pDevice->SBox, pbyPayloadHead, pbyPayloadHead, wPayloadSize+cbICVlen); - //======================================================================= - } -} - static __le16 vnt_time_stamp_off(struct vnt_private *priv, u16 rate) { - return cpu_to_le16(wTimeStampOff[priv->byPreambleType % 2] + return cpu_to_le16(vnt_time_stampoff[priv->preamble_type % 2] [rate % MAX_RATE]); } -/*byPktType : PK_TYPE_11A 0 - PK_TYPE_11B 1 - PK_TYPE_11GB 2 - PK_TYPE_11GA 3 -*/ -static u32 s_uGetTxRsvTime(struct vnt_private *priv, u8 pkt_type, +static u32 vnt_get_rsvtime(struct vnt_private *priv, u8 pkt_type, u32 frame_length, u16 rate, int need_ack) { u32 data_time, ack_time; - data_time = BBuGetFrameTime(priv->byPreambleType, pkt_type, + data_time = vnt_get_frame_time(priv->preamble_type, pkt_type, frame_length, rate); if (pkt_type == PK_TYPE_11B) - ack_time = BBuGetFrameTime(priv->byPreambleType, pkt_type, 14, - (u16)priv->byTopCCKBasicRate); + ack_time = vnt_get_frame_time(priv->preamble_type, pkt_type, + 14, (u16)priv->top_cck_basic_rate); else - ack_time = BBuGetFrameTime(priv->byPreambleType, pkt_type, 14, - (u16)priv->byTopOFDMBasicRate); + ack_time = vnt_get_frame_time(priv->preamble_type, pkt_type, + 14, (u16)priv->top_ofdm_basic_rate); if (need_ack) - return data_time + priv->uSIFS + ack_time; + return data_time + priv->sifs + ack_time; return data_time; } @@ -360,1715 +133,970 @@ static u32 s_uGetTxRsvTime(struct vnt_private *priv, u8 pkt_type, static __le16 vnt_rxtx_rsvtime_le16(struct vnt_private *priv, u8 pkt_type, u32 frame_length, u16 rate, int need_ack) { - return cpu_to_le16((u16)s_uGetTxRsvTime(priv, pkt_type, + return cpu_to_le16((u16)vnt_get_rsvtime(priv, pkt_type, frame_length, rate, need_ack)); } -//byFreqType: 0=>5GHZ 1=>2.4GHZ -static __le16 s_uGetRTSCTSRsvTime(struct vnt_private *priv, +static __le16 vnt_get_rtscts_rsvtime_le(struct vnt_private *priv, u8 rsv_type, u8 pkt_type, u32 frame_length, u16 current_rate) { u32 rrv_time, rts_time, cts_time, ack_time, data_time; rrv_time = rts_time = cts_time = ack_time = data_time = 0; - data_time = BBuGetFrameTime(priv->byPreambleType, pkt_type, + data_time = vnt_get_frame_time(priv->preamble_type, pkt_type, frame_length, current_rate); if (rsv_type == 0) { - rts_time = BBuGetFrameTime(priv->byPreambleType, - pkt_type, 20, priv->byTopCCKBasicRate); - cts_time = ack_time = BBuGetFrameTime(priv->byPreambleType, - pkt_type, 14, priv->byTopCCKBasicRate); + rts_time = vnt_get_frame_time(priv->preamble_type, + pkt_type, 20, priv->top_cck_basic_rate); + cts_time = ack_time = vnt_get_frame_time(priv->preamble_type, + pkt_type, 14, priv->top_cck_basic_rate); } else if (rsv_type == 1) { - rts_time = BBuGetFrameTime(priv->byPreambleType, - pkt_type, 20, priv->byTopCCKBasicRate); - cts_time = BBuGetFrameTime(priv->byPreambleType, pkt_type, - 14, priv->byTopCCKBasicRate); - ack_time = BBuGetFrameTime(priv->byPreambleType, pkt_type, - 14, priv->byTopOFDMBasicRate); + rts_time = vnt_get_frame_time(priv->preamble_type, + pkt_type, 20, priv->top_cck_basic_rate); + cts_time = vnt_get_frame_time(priv->preamble_type, pkt_type, + 14, priv->top_cck_basic_rate); + ack_time = vnt_get_frame_time(priv->preamble_type, pkt_type, + 14, priv->top_ofdm_basic_rate); } else if (rsv_type == 2) { - rts_time = BBuGetFrameTime(priv->byPreambleType, pkt_type, - 20, priv->byTopOFDMBasicRate); - cts_time = ack_time = BBuGetFrameTime(priv->byPreambleType, - pkt_type, 14, priv->byTopOFDMBasicRate); + rts_time = vnt_get_frame_time(priv->preamble_type, pkt_type, + 20, priv->top_ofdm_basic_rate); + cts_time = ack_time = vnt_get_frame_time(priv->preamble_type, + pkt_type, 14, priv->top_ofdm_basic_rate); } else if (rsv_type == 3) { - cts_time = BBuGetFrameTime(priv->byPreambleType, pkt_type, - 14, priv->byTopCCKBasicRate); - ack_time = BBuGetFrameTime(priv->byPreambleType, pkt_type, - 14, priv->byTopOFDMBasicRate); + cts_time = vnt_get_frame_time(priv->preamble_type, pkt_type, + 14, priv->top_cck_basic_rate); + ack_time = vnt_get_frame_time(priv->preamble_type, pkt_type, + 14, priv->top_ofdm_basic_rate); - rrv_time = cts_time + ack_time + data_time + 2 * priv->uSIFS; + rrv_time = cts_time + ack_time + data_time + 2 * priv->sifs; return cpu_to_le16((u16)rrv_time); } - rrv_time = rts_time + cts_time + ack_time + data_time + 3 * priv->uSIFS; + rrv_time = rts_time + cts_time + ack_time + data_time + 3 * priv->sifs; return cpu_to_le16((u16)rrv_time); } -//byFreqType 0: 5GHz, 1:2.4Ghz -static __le16 s_uGetDataDuration(struct vnt_private *pDevice, - u8 byPktType, int bNeedAck) +static __le16 vnt_get_duration_le(struct vnt_private *priv, + u8 pkt_type, int need_ack) { - u32 uAckTime = 0; + u32 ack_time = 0; - if (bNeedAck) { - if (byPktType == PK_TYPE_11B) - uAckTime = BBuGetFrameTime(pDevice->byPreambleType, - byPktType, 14, pDevice->byTopCCKBasicRate); + if (need_ack) { + if (pkt_type == PK_TYPE_11B) + ack_time = vnt_get_frame_time(priv->preamble_type, + pkt_type, 14, priv->top_cck_basic_rate); else - uAckTime = BBuGetFrameTime(pDevice->byPreambleType, - byPktType, 14, pDevice->byTopOFDMBasicRate); - return cpu_to_le16((u16)(pDevice->uSIFS + uAckTime)); + ack_time = vnt_get_frame_time(priv->preamble_type, + pkt_type, 14, priv->top_ofdm_basic_rate); + + return cpu_to_le16((u16)(priv->sifs + ack_time)); } return 0; } -//byFreqType: 0=>5GHZ 1=>2.4GHZ -static __le16 s_uGetRTSCTSDuration(struct vnt_private *pDevice, u8 byDurType, - u32 cbFrameLength, u8 byPktType, u16 wRate, int bNeedAck, - u8 byFBOption) +static __le16 vnt_get_rtscts_duration_le(struct vnt_usb_send_context *context, + u8 dur_type, u8 pkt_type, u16 rate) { - u32 uCTSTime = 0, uDurTime = 0; + struct vnt_private *priv = context->priv; + u32 cts_time = 0, dur_time = 0; + u32 frame_length = context->frame_len; + u8 need_ack = context->need_ack; - switch (byDurType) { + switch (dur_type) { case RTSDUR_BB: case RTSDUR_BA: case RTSDUR_BA_F0: case RTSDUR_BA_F1: - uCTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, - 14, pDevice->byTopCCKBasicRate); - uDurTime = uCTSTime + 2 * pDevice->uSIFS + - s_uGetTxRsvTime(pDevice, byPktType, - cbFrameLength, wRate, bNeedAck); + cts_time = vnt_get_frame_time(priv->preamble_type, + pkt_type, 14, priv->top_cck_basic_rate); + dur_time = cts_time + 2 * priv->sifs + + vnt_get_rsvtime(priv, pkt_type, + frame_length, rate, need_ack); break; case RTSDUR_AA: case RTSDUR_AA_F0: case RTSDUR_AA_F1: - uCTSTime = BBuGetFrameTime(pDevice->byPreambleType, byPktType, - 14, pDevice->byTopOFDMBasicRate); - uDurTime = uCTSTime + 2 * pDevice->uSIFS + - s_uGetTxRsvTime(pDevice, byPktType, - cbFrameLength, wRate, bNeedAck); + cts_time = vnt_get_frame_time(priv->preamble_type, + pkt_type, 14, priv->top_ofdm_basic_rate); + dur_time = cts_time + 2 * priv->sifs + + vnt_get_rsvtime(priv, pkt_type, + frame_length, rate, need_ack); break; case CTSDUR_BA: case CTSDUR_BA_F0: case CTSDUR_BA_F1: - uDurTime = pDevice->uSIFS + s_uGetTxRsvTime(pDevice, - byPktType, cbFrameLength, wRate, bNeedAck); + dur_time = priv->sifs + vnt_get_rsvtime(priv, + pkt_type, frame_length, rate, need_ack); break; default: break; } - return cpu_to_le16((u16)uDurTime); + return cpu_to_le16((u16)dur_time); } -static u16 vnt_rxtx_datahead_g(struct vnt_private *priv, u8 pkt_type, u16 rate, - struct vnt_tx_datahead_g *buf, u32 frame_len, int need_ack) +static u16 vnt_mac_hdr_pos(struct vnt_usb_send_context *tx_context, + struct ieee80211_hdr *hdr) { + u8 *head = tx_context->data + offsetof(struct vnt_tx_buffer, fifo_head); + u8 *hdr_pos = (u8 *)hdr; + + tx_context->hdr = hdr; + if (!tx_context->hdr) + return 0; + + return (u16)(hdr_pos - head); +} + +static u16 vnt_rxtx_datahead_g(struct vnt_usb_send_context *tx_context, + struct vnt_tx_datahead_g *buf) +{ + + struct vnt_private *priv = tx_context->priv; + struct ieee80211_hdr *hdr = + (struct ieee80211_hdr *)tx_context->skb->data; + u32 frame_len = tx_context->frame_len; + u16 rate = tx_context->tx_rate; + u8 need_ack = tx_context->need_ack; + /* Get SignalField,ServiceField,Length */ - BBvCalculateParameter(priv, frame_len, rate, pkt_type, &buf->a); - BBvCalculateParameter(priv, frame_len, priv->byTopCCKBasicRate, + vnt_get_phy_field(priv, frame_len, rate, tx_context->pkt_type, &buf->a); + vnt_get_phy_field(priv, frame_len, priv->top_cck_basic_rate, PK_TYPE_11B, &buf->b); /* Get Duration and TimeStamp */ - buf->duration_a = s_uGetDataDuration(priv, pkt_type, need_ack); - buf->duration_b = s_uGetDataDuration(priv, PK_TYPE_11B, need_ack); + if (ieee80211_is_pspoll(hdr->frame_control)) { + __le16 dur = cpu_to_le16(priv->current_aid | BIT(14) | BIT(15)); + + buf->duration_a = dur; + buf->duration_b = dur; + } else { + buf->duration_a = vnt_get_duration_le(priv, + tx_context->pkt_type, need_ack); + buf->duration_b = vnt_get_duration_le(priv, + PK_TYPE_11B, need_ack); + } buf->time_stamp_off_a = vnt_time_stamp_off(priv, rate); buf->time_stamp_off_b = vnt_time_stamp_off(priv, - priv->byTopCCKBasicRate); + priv->top_cck_basic_rate); + + tx_context->tx_hdr_size = vnt_mac_hdr_pos(tx_context, &buf->hdr); return le16_to_cpu(buf->duration_a); } -static u16 vnt_rxtx_datahead_g_fb(struct vnt_private *priv, u8 pkt_type, - u16 rate, struct vnt_tx_datahead_g_fb *buf, - u32 frame_len, int need_ack) +static u16 vnt_rxtx_datahead_g_fb(struct vnt_usb_send_context *tx_context, + struct vnt_tx_datahead_g_fb *buf) { + struct vnt_private *priv = tx_context->priv; + u32 frame_len = tx_context->frame_len; + u16 rate = tx_context->tx_rate; + u8 need_ack = tx_context->need_ack; + /* Get SignalField,ServiceField,Length */ - BBvCalculateParameter(priv, frame_len, rate, pkt_type, &buf->a); + vnt_get_phy_field(priv, frame_len, rate, tx_context->pkt_type, &buf->a); - BBvCalculateParameter(priv, frame_len, priv->byTopCCKBasicRate, + vnt_get_phy_field(priv, frame_len, priv->top_cck_basic_rate, PK_TYPE_11B, &buf->b); /* Get Duration and TimeStamp */ - buf->duration_a = s_uGetDataDuration(priv, pkt_type, need_ack); - buf->duration_b = s_uGetDataDuration(priv, PK_TYPE_11B, need_ack); + buf->duration_a = vnt_get_duration_le(priv, tx_context->pkt_type, + need_ack); + buf->duration_b = vnt_get_duration_le(priv, PK_TYPE_11B, need_ack); - buf->duration_a_f0 = s_uGetDataDuration(priv, pkt_type, need_ack); - buf->duration_a_f1 = s_uGetDataDuration(priv, pkt_type, need_ack); + buf->duration_a_f0 = vnt_get_duration_le(priv, tx_context->pkt_type, + need_ack); + buf->duration_a_f1 = vnt_get_duration_le(priv, tx_context->pkt_type, + need_ack); buf->time_stamp_off_a = vnt_time_stamp_off(priv, rate); buf->time_stamp_off_b = vnt_time_stamp_off(priv, - priv->byTopCCKBasicRate); + priv->top_cck_basic_rate); + + tx_context->tx_hdr_size = vnt_mac_hdr_pos(tx_context, &buf->hdr); return le16_to_cpu(buf->duration_a); } -static u16 vnt_rxtx_datahead_a_fb(struct vnt_private *priv, u8 pkt_type, - u16 rate, struct vnt_tx_datahead_a_fb *buf, - u32 frame_len, int need_ack) +static u16 vnt_rxtx_datahead_a_fb(struct vnt_usb_send_context *tx_context, + struct vnt_tx_datahead_a_fb *buf) { + struct vnt_private *priv = tx_context->priv; + u16 rate = tx_context->tx_rate; + u8 pkt_type = tx_context->pkt_type; + u8 need_ack = tx_context->need_ack; + u32 frame_len = tx_context->frame_len; + /* Get SignalField,ServiceField,Length */ - BBvCalculateParameter(priv, frame_len, rate, pkt_type, &buf->a); + vnt_get_phy_field(priv, frame_len, rate, pkt_type, &buf->a); /* Get Duration and TimeStampOff */ - buf->duration = s_uGetDataDuration(priv, pkt_type, need_ack); + buf->duration = vnt_get_duration_le(priv, pkt_type, need_ack); - buf->duration_f0 = s_uGetDataDuration(priv, pkt_type, need_ack); - buf->duration_f1 = s_uGetDataDuration(priv, pkt_type, need_ack); + buf->duration_f0 = vnt_get_duration_le(priv, pkt_type, need_ack); + buf->duration_f1 = vnt_get_duration_le(priv, pkt_type, need_ack); buf->time_stamp_off = vnt_time_stamp_off(priv, rate); + tx_context->tx_hdr_size = vnt_mac_hdr_pos(tx_context, &buf->hdr); + return le16_to_cpu(buf->duration); } -static u16 vnt_rxtx_datahead_ab(struct vnt_private *priv, u8 pkt_type, - u16 rate, struct vnt_tx_datahead_ab *buf, - u32 frame_len, int need_ack) +static u16 vnt_rxtx_datahead_ab(struct vnt_usb_send_context *tx_context, + struct vnt_tx_datahead_ab *buf) { + struct vnt_private *priv = tx_context->priv; + struct ieee80211_hdr *hdr = + (struct ieee80211_hdr *)tx_context->skb->data; + u32 frame_len = tx_context->frame_len; + u16 rate = tx_context->tx_rate; + u8 need_ack = tx_context->need_ack; + /* Get SignalField,ServiceField,Length */ - BBvCalculateParameter(priv, frame_len, rate, pkt_type, &buf->ab); + vnt_get_phy_field(priv, frame_len, rate, + tx_context->pkt_type, &buf->ab); + /* Get Duration and TimeStampOff */ - buf->duration = s_uGetDataDuration(priv, pkt_type, need_ack); + if (ieee80211_is_pspoll(hdr->frame_control)) { + __le16 dur = cpu_to_le16(priv->current_aid | BIT(14) | BIT(15)); + + buf->duration = dur; + } else { + buf->duration = vnt_get_duration_le(priv, tx_context->pkt_type, + need_ack); + } buf->time_stamp_off = vnt_time_stamp_off(priv, rate); + tx_context->tx_hdr_size = vnt_mac_hdr_pos(tx_context, &buf->hdr); + return le16_to_cpu(buf->duration); } -static int vnt_fill_ieee80211_rts(struct vnt_private *priv, - struct ieee80211_rts *rts, struct ethhdr *eth_hdr, - __le16 duration) +static int vnt_fill_ieee80211_rts(struct vnt_usb_send_context *tx_context, + struct ieee80211_rts *rts, __le16 duration) { + struct ieee80211_hdr *hdr = + (struct ieee80211_hdr *)tx_context->skb->data; + rts->duration = duration; rts->frame_control = cpu_to_le16(IEEE80211_FTYPE_CTL | IEEE80211_STYPE_RTS); - if (priv->op_mode == NL80211_IFTYPE_ADHOC || - priv->op_mode == NL80211_IFTYPE_AP) - memcpy(rts->ra, eth_hdr->h_dest, ETH_ALEN); - else - memcpy(rts->ra, priv->abyBSSID, ETH_ALEN); - - if (priv->op_mode == NL80211_IFTYPE_AP) - memcpy(rts->ta, priv->abyBSSID, ETH_ALEN); - else - memcpy(rts->ta, eth_hdr->h_source, ETH_ALEN); + memcpy(rts->ra, hdr->addr1, ETH_ALEN); + memcpy(rts->ta, hdr->addr2, ETH_ALEN); return 0; } -static u16 vnt_rxtx_rts_g_head(struct vnt_private *priv, - struct vnt_rts_g *buf, struct ethhdr *eth_hdr, - u8 pkt_type, u32 frame_len, int need_ack, - u16 current_rate, u8 fb_option) +static u16 vnt_rxtx_rts_g_head(struct vnt_usb_send_context *tx_context, + struct vnt_rts_g *buf) { + struct vnt_private *priv = tx_context->priv; u16 rts_frame_len = 20; + u16 current_rate = tx_context->tx_rate; - BBvCalculateParameter(priv, rts_frame_len, priv->byTopCCKBasicRate, + vnt_get_phy_field(priv, rts_frame_len, priv->top_cck_basic_rate, PK_TYPE_11B, &buf->b); - BBvCalculateParameter(priv, rts_frame_len, - priv->byTopOFDMBasicRate, pkt_type, &buf->a); - - buf->duration_bb = s_uGetRTSCTSDuration(priv, RTSDUR_BB, frame_len, - PK_TYPE_11B, priv->byTopCCKBasicRate, need_ack, fb_option); - buf->duration_aa = s_uGetRTSCTSDuration(priv, RTSDUR_AA, frame_len, - pkt_type, current_rate, need_ack, fb_option); - buf->duration_ba = s_uGetRTSCTSDuration(priv, RTSDUR_BA, frame_len, - pkt_type, current_rate, need_ack, fb_option); - - vnt_fill_ieee80211_rts(priv, &buf->data, eth_hdr, buf->duration_aa); - - return vnt_rxtx_datahead_g(priv, pkt_type, current_rate, - &buf->data_head, frame_len, need_ack); + vnt_get_phy_field(priv, rts_frame_len, priv->top_ofdm_basic_rate, + tx_context->pkt_type, &buf->a); + + buf->duration_bb = vnt_get_rtscts_duration_le(tx_context, RTSDUR_BB, + PK_TYPE_11B, + priv->top_cck_basic_rate); + buf->duration_aa = vnt_get_rtscts_duration_le(tx_context, RTSDUR_AA, + tx_context->pkt_type, + current_rate); + buf->duration_ba = vnt_get_rtscts_duration_le(tx_context, RTSDUR_BA, + tx_context->pkt_type, + current_rate); + + vnt_fill_ieee80211_rts(tx_context, &buf->data, buf->duration_aa); + + return vnt_rxtx_datahead_g(tx_context, &buf->data_head); } -static u16 vnt_rxtx_rts_g_fb_head(struct vnt_private *priv, - struct vnt_rts_g_fb *buf, struct ethhdr *eth_hdr, - u8 pkt_type, u32 frame_len, int need_ack, - u16 current_rate, u8 fb_option) +static u16 vnt_rxtx_rts_g_fb_head(struct vnt_usb_send_context *tx_context, + struct vnt_rts_g_fb *buf) { + struct vnt_private *priv = tx_context->priv; + u16 current_rate = tx_context->tx_rate; u16 rts_frame_len = 20; - BBvCalculateParameter(priv, rts_frame_len, priv->byTopCCKBasicRate, + vnt_get_phy_field(priv, rts_frame_len, priv->top_cck_basic_rate, PK_TYPE_11B, &buf->b); - BBvCalculateParameter(priv, rts_frame_len, - priv->byTopOFDMBasicRate, pkt_type, &buf->a); - - - buf->duration_bb = s_uGetRTSCTSDuration(priv, RTSDUR_BB, frame_len, - PK_TYPE_11B, priv->byTopCCKBasicRate, need_ack, fb_option); - buf->duration_aa = s_uGetRTSCTSDuration(priv, RTSDUR_AA, frame_len, - pkt_type, current_rate, need_ack, fb_option); - buf->duration_ba = s_uGetRTSCTSDuration(priv, RTSDUR_BA, frame_len, - pkt_type, current_rate, need_ack, fb_option); - - - buf->rts_duration_ba_f0 = s_uGetRTSCTSDuration(priv, RTSDUR_BA_F0, - frame_len, pkt_type, priv->tx_rate_fb0, need_ack, fb_option); - buf->rts_duration_aa_f0 = s_uGetRTSCTSDuration(priv, RTSDUR_AA_F0, - frame_len, pkt_type, priv->tx_rate_fb0, need_ack, fb_option); - buf->rts_duration_ba_f1 = s_uGetRTSCTSDuration(priv, RTSDUR_BA_F1, - frame_len, pkt_type, priv->tx_rate_fb1, need_ack, fb_option); - buf->rts_duration_aa_f1 = s_uGetRTSCTSDuration(priv, RTSDUR_AA_F1, - frame_len, pkt_type, priv->tx_rate_fb1, need_ack, fb_option); - - vnt_fill_ieee80211_rts(priv, &buf->data, eth_hdr, buf->duration_aa); - - return vnt_rxtx_datahead_g_fb(priv, pkt_type, current_rate, - &buf->data_head, frame_len, need_ack); + vnt_get_phy_field(priv, rts_frame_len, priv->top_ofdm_basic_rate, + tx_context->pkt_type, &buf->a); + + buf->duration_bb = vnt_get_rtscts_duration_le(tx_context, RTSDUR_BB, + PK_TYPE_11B, + priv->top_cck_basic_rate); + buf->duration_aa = vnt_get_rtscts_duration_le(tx_context, RTSDUR_AA, + tx_context->pkt_type, + current_rate); + buf->duration_ba = vnt_get_rtscts_duration_le(tx_context, RTSDUR_BA, + tx_context->pkt_type, + current_rate); + + buf->rts_duration_ba_f0 = + vnt_get_rtscts_duration_le(tx_context, RTSDUR_BA_F0, + tx_context->pkt_type, + priv->tx_rate_fb0); + buf->rts_duration_aa_f0 = + vnt_get_rtscts_duration_le(tx_context, RTSDUR_AA_F0, + tx_context->pkt_type, + priv->tx_rate_fb0); + buf->rts_duration_ba_f1 = + vnt_get_rtscts_duration_le(tx_context, RTSDUR_BA_F1, + tx_context->pkt_type, + priv->tx_rate_fb1); + buf->rts_duration_aa_f1 = + vnt_get_rtscts_duration_le(tx_context, RTSDUR_AA_F1, + tx_context->pkt_type, + priv->tx_rate_fb1); + + vnt_fill_ieee80211_rts(tx_context, &buf->data, buf->duration_aa); + + return vnt_rxtx_datahead_g_fb(tx_context, &buf->data_head); } -static u16 vnt_rxtx_rts_ab_head(struct vnt_private *priv, - struct vnt_rts_ab *buf, struct ethhdr *eth_hdr, - u8 pkt_type, u32 frame_len, int need_ack, - u16 current_rate, u8 fb_option) +static u16 vnt_rxtx_rts_ab_head(struct vnt_usb_send_context *tx_context, + struct vnt_rts_ab *buf) { + struct vnt_private *priv = tx_context->priv; + u16 current_rate = tx_context->tx_rate; u16 rts_frame_len = 20; - BBvCalculateParameter(priv, rts_frame_len, - priv->byTopOFDMBasicRate, pkt_type, &buf->ab); + vnt_get_phy_field(priv, rts_frame_len, priv->top_ofdm_basic_rate, + tx_context->pkt_type, &buf->ab); - buf->duration = s_uGetRTSCTSDuration(priv, RTSDUR_AA, frame_len, - pkt_type, current_rate, need_ack, fb_option); + buf->duration = vnt_get_rtscts_duration_le(tx_context, RTSDUR_AA, + tx_context->pkt_type, + current_rate); - vnt_fill_ieee80211_rts(priv, &buf->data, eth_hdr, buf->duration); + vnt_fill_ieee80211_rts(tx_context, &buf->data, buf->duration); - return vnt_rxtx_datahead_ab(priv, pkt_type, current_rate, - &buf->data_head, frame_len, need_ack); + return vnt_rxtx_datahead_ab(tx_context, &buf->data_head); } -static u16 vnt_rxtx_rts_a_fb_head(struct vnt_private *priv, - struct vnt_rts_a_fb *buf, struct ethhdr *eth_hdr, - u8 pkt_type, u32 frame_len, int need_ack, - u16 current_rate, u8 fb_option) +static u16 vnt_rxtx_rts_a_fb_head(struct vnt_usb_send_context *tx_context, + struct vnt_rts_a_fb *buf) { + struct vnt_private *priv = tx_context->priv; + u16 current_rate = tx_context->tx_rate; u16 rts_frame_len = 20; - BBvCalculateParameter(priv, rts_frame_len, - priv->byTopOFDMBasicRate, pkt_type, &buf->a); + vnt_get_phy_field(priv, rts_frame_len, + priv->top_ofdm_basic_rate, tx_context->pkt_type, &buf->a); - buf->duration = s_uGetRTSCTSDuration(priv, RTSDUR_AA, frame_len, - pkt_type, current_rate, need_ack, fb_option); + buf->duration = vnt_get_rtscts_duration_le(tx_context, RTSDUR_AA, + tx_context->pkt_type, + current_rate); - buf->rts_duration_f0 = s_uGetRTSCTSDuration(priv, RTSDUR_AA_F0, - frame_len, pkt_type, priv->tx_rate_fb0, need_ack, fb_option); + buf->rts_duration_f0 = + vnt_get_rtscts_duration_le(tx_context, RTSDUR_AA_F0, + tx_context->pkt_type, + priv->tx_rate_fb0); - buf->rts_duration_f1 = s_uGetRTSCTSDuration(priv, RTSDUR_AA_F1, - frame_len, pkt_type, priv->tx_rate_fb1, need_ack, fb_option); + buf->rts_duration_f1 = + vnt_get_rtscts_duration_le(tx_context, RTSDUR_AA_F1, + tx_context->pkt_type, + priv->tx_rate_fb1); - vnt_fill_ieee80211_rts(priv, &buf->data, eth_hdr, buf->duration); + vnt_fill_ieee80211_rts(tx_context, &buf->data, buf->duration); - return vnt_rxtx_datahead_a_fb(priv, pkt_type, current_rate, - &buf->data_head, frame_len, need_ack); + return vnt_rxtx_datahead_a_fb(tx_context, &buf->data_head); } -static u16 s_vFillRTSHead(struct vnt_private *pDevice, u8 byPktType, - union vnt_tx_data_head *head, u32 cbFrameLength, int bNeedAck, - struct ethhdr *psEthHeader, u16 wCurrentRate, u8 byFBOption) +static u16 vnt_fill_cts_head(struct vnt_usb_send_context *tx_context, + union vnt_tx_data_head *head) { + struct vnt_private *priv = tx_context->priv; + u32 cts_frame_len = 14; + u16 current_rate = tx_context->tx_rate; if (!head) return 0; - /* Note: So far RTSHead doesn't appear in ATIM - * & Beacom DMA, so we don't need to take them - * into account. - * Otherwise, we need to modified codes for them. - */ - switch (byPktType) { - case PK_TYPE_11GB: - case PK_TYPE_11GA: - if (byFBOption == AUTO_FB_NONE) - return vnt_rxtx_rts_g_head(pDevice, &head->rts_g, - psEthHeader, byPktType, cbFrameLength, - bNeedAck, wCurrentRate, byFBOption); - else - return vnt_rxtx_rts_g_fb_head(pDevice, &head->rts_g_fb, - psEthHeader, byPktType, cbFrameLength, - bNeedAck, wCurrentRate, byFBOption); - break; - case PK_TYPE_11A: - if (byFBOption) { - return vnt_rxtx_rts_a_fb_head(pDevice, &head->rts_a_fb, - psEthHeader, byPktType, cbFrameLength, - bNeedAck, wCurrentRate, byFBOption); - break; - } - case PK_TYPE_11B: - return vnt_rxtx_rts_ab_head(pDevice, &head->rts_ab, - psEthHeader, byPktType, cbFrameLength, - bNeedAck, wCurrentRate, byFBOption); - } - - return 0; -} - -static u16 s_vFillCTSHead(struct vnt_private *pDevice, - u8 byPktType, union vnt_tx_data_head *head, u32 cbFrameLength, - int bNeedAck, u16 wCurrentRate, u8 byFBOption) -{ - u32 uCTSFrameLen = 14; - - if (!head) - return 0; - - if (byFBOption != AUTO_FB_NONE) { + if (tx_context->fb_option) { /* Auto Fall back */ - struct vnt_cts_fb *pBuf = &head->cts_g_fb; + struct vnt_cts_fb *buf = &head->cts_g_fb; /* Get SignalField,ServiceField,Length */ - BBvCalculateParameter(pDevice, uCTSFrameLen, - pDevice->byTopCCKBasicRate, PK_TYPE_11B, &pBuf->b); - pBuf->duration_ba = s_uGetRTSCTSDuration(pDevice, CTSDUR_BA, - cbFrameLength, byPktType, - wCurrentRate, bNeedAck, byFBOption); + vnt_get_phy_field(priv, cts_frame_len, + priv->top_cck_basic_rate, PK_TYPE_11B, &buf->b); + buf->duration_ba = + vnt_get_rtscts_duration_le(tx_context, CTSDUR_BA, + tx_context->pkt_type, + current_rate); /* Get CTSDuration_ba_f0 */ - pBuf->cts_duration_ba_f0 = s_uGetRTSCTSDuration(pDevice, - CTSDUR_BA_F0, cbFrameLength, byPktType, - pDevice->tx_rate_fb0, bNeedAck, byFBOption); + buf->cts_duration_ba_f0 = + vnt_get_rtscts_duration_le(tx_context, CTSDUR_BA_F0, + tx_context->pkt_type, + priv->tx_rate_fb0); /* Get CTSDuration_ba_f1 */ - pBuf->cts_duration_ba_f1 = s_uGetRTSCTSDuration(pDevice, - CTSDUR_BA_F1, cbFrameLength, byPktType, - pDevice->tx_rate_fb1, bNeedAck, byFBOption); + buf->cts_duration_ba_f1 = + vnt_get_rtscts_duration_le(tx_context, CTSDUR_BA_F1, + tx_context->pkt_type, + priv->tx_rate_fb1); /* Get CTS Frame body */ - pBuf->data.duration = pBuf->duration_ba; - pBuf->data.frame_control = + buf->data.duration = buf->duration_ba; + buf->data.frame_control = cpu_to_le16(IEEE80211_FTYPE_CTL | IEEE80211_STYPE_CTS); - memcpy(pBuf->data.ra, pDevice->abyCurrentNetAddr, ETH_ALEN); + memcpy(buf->data.ra, priv->current_net_addr, ETH_ALEN); - return vnt_rxtx_datahead_g_fb(pDevice, byPktType, wCurrentRate, - &pBuf->data_head, cbFrameLength, bNeedAck); + return vnt_rxtx_datahead_g_fb(tx_context, &buf->data_head); } else { - struct vnt_cts *pBuf = &head->cts_g; + struct vnt_cts *buf = &head->cts_g; /* Get SignalField,ServiceField,Length */ - BBvCalculateParameter(pDevice, uCTSFrameLen, - pDevice->byTopCCKBasicRate, PK_TYPE_11B, &pBuf->b); + vnt_get_phy_field(priv, cts_frame_len, + priv->top_cck_basic_rate, PK_TYPE_11B, &buf->b); /* Get CTSDuration_ba */ - pBuf->duration_ba = s_uGetRTSCTSDuration(pDevice, - CTSDUR_BA, cbFrameLength, byPktType, - wCurrentRate, bNeedAck, byFBOption); + buf->duration_ba = + vnt_get_rtscts_duration_le(tx_context, CTSDUR_BA, + tx_context->pkt_type, + current_rate); /*Get CTS Frame body*/ - pBuf->data.duration = pBuf->duration_ba; - pBuf->data.frame_control = + buf->data.duration = buf->duration_ba; + buf->data.frame_control = cpu_to_le16(IEEE80211_FTYPE_CTL | IEEE80211_STYPE_CTS); - memcpy(pBuf->data.ra, pDevice->abyCurrentNetAddr, ETH_ALEN); + memcpy(buf->data.ra, priv->current_net_addr, ETH_ALEN); - return vnt_rxtx_datahead_g(pDevice, byPktType, wCurrentRate, - &pBuf->data_head, cbFrameLength, bNeedAck); + return vnt_rxtx_datahead_g(tx_context, &buf->data_head); } return 0; } -/*+ - * - * Description: - * Generate FIFO control for MAC & Baseband controller - * - * Parameters: - * In: - * pDevice - Pointer to adpater - * pTxDataHead - Transmit Data Buffer - * pTxBufHead - pTxBufHead - * pvRrvTime - pvRrvTime - * pvRTS - RTS Buffer - * pCTS - CTS Buffer - * cbFrameSize - Transmit Data Length (Hdr+Payload+FCS) - * bNeedACK - If need ACK - * Out: - * none - * - * Return Value: none - * --*/ +static u16 vnt_rxtx_rts(struct vnt_usb_send_context *tx_context, + union vnt_tx_head *tx_head, bool need_mic) +{ + struct vnt_private *priv = tx_context->priv; + struct vnt_rrv_time_rts *buf = &tx_head->tx_rts.rts; + union vnt_tx_data_head *head = &tx_head->tx_rts.tx.head; + u32 frame_len = tx_context->frame_len; + u16 current_rate = tx_context->tx_rate; + u8 need_ack = tx_context->need_ack; + + buf->rts_rrv_time_aa = vnt_get_rtscts_rsvtime_le(priv, 2, + tx_context->pkt_type, frame_len, current_rate); + buf->rts_rrv_time_ba = vnt_get_rtscts_rsvtime_le(priv, 1, + tx_context->pkt_type, frame_len, current_rate); + buf->rts_rrv_time_bb = vnt_get_rtscts_rsvtime_le(priv, 0, + tx_context->pkt_type, frame_len, current_rate); + + buf->rrv_time_a = vnt_rxtx_rsvtime_le16(priv, tx_context->pkt_type, + frame_len, current_rate, + need_ack); + buf->rrv_time_b = vnt_rxtx_rsvtime_le16(priv, PK_TYPE_11B, frame_len, + priv->top_cck_basic_rate, need_ack); + + if (need_mic) + head = &tx_head->tx_rts.tx.mic.head; + + if (tx_context->fb_option) + return vnt_rxtx_rts_g_fb_head(tx_context, &head->rts_g_fb); + + return vnt_rxtx_rts_g_head(tx_context, &head->rts_g); +} -static u16 s_vGenerateTxParameter(struct vnt_private *pDevice, - u8 byPktType, u16 wCurrentRate, struct vnt_tx_buffer *tx_buffer, - struct vnt_mic_hdr **mic_hdr, u32 need_mic, u32 cbFrameSize, - int bNeedACK, struct ethhdr *psEthHeader, bool need_rts) +static u16 vnt_rxtx_cts(struct vnt_usb_send_context *tx_context, + union vnt_tx_head *tx_head, bool need_mic) { - struct vnt_tx_fifo_head *pFifoHead = &tx_buffer->fifo_head; - union vnt_tx_data_head *head = NULL; - u16 wFifoCtl; - u8 byFBOption = AUTO_FB_NONE; + struct vnt_private *priv = tx_context->priv; + struct vnt_rrv_time_cts *buf = &tx_head->tx_cts.cts; + union vnt_tx_data_head *head = &tx_head->tx_cts.tx.head; + u32 frame_len = tx_context->frame_len; + u16 current_rate = tx_context->tx_rate; + u8 need_ack = tx_context->need_ack; + + buf->rrv_time_a = vnt_rxtx_rsvtime_le16(priv, tx_context->pkt_type, + frame_len, current_rate, need_ack); + buf->rrv_time_b = vnt_rxtx_rsvtime_le16(priv, PK_TYPE_11B, + frame_len, priv->top_cck_basic_rate, need_ack); + + buf->cts_rrv_time_ba = vnt_get_rtscts_rsvtime_le(priv, 3, + tx_context->pkt_type, frame_len, current_rate); + + if (need_mic) + head = &tx_head->tx_cts.tx.mic.head; + + /* Fill CTS */ + return vnt_fill_cts_head(tx_context, head); +} - pFifoHead->current_rate = cpu_to_le16(wCurrentRate); - wFifoCtl = pFifoHead->wFIFOCtl; +static u16 vnt_rxtx_ab(struct vnt_usb_send_context *tx_context, + union vnt_tx_head *tx_head, bool need_rts, bool need_mic) +{ + struct vnt_private *priv = tx_context->priv; + struct vnt_rrv_time_ab *buf = &tx_head->tx_ab.ab; + union vnt_tx_data_head *head = &tx_head->tx_ab.tx.head; + u32 frame_len = tx_context->frame_len; + u16 current_rate = tx_context->tx_rate; + u8 need_ack = tx_context->need_ack; + + buf->rrv_time = vnt_rxtx_rsvtime_le16(priv, tx_context->pkt_type, + frame_len, current_rate, need_ack); + + if (need_mic) + head = &tx_head->tx_ab.tx.mic.head; + + if (need_rts) { + if (tx_context->pkt_type == PK_TYPE_11B) + buf->rts_rrv_time = vnt_get_rtscts_rsvtime_le(priv, 0, + tx_context->pkt_type, frame_len, current_rate); + else /* PK_TYPE_11A */ + buf->rts_rrv_time = vnt_get_rtscts_rsvtime_le(priv, 2, + tx_context->pkt_type, frame_len, current_rate); + + if (tx_context->fb_option && + tx_context->pkt_type == PK_TYPE_11A) + return vnt_rxtx_rts_a_fb_head(tx_context, + &head->rts_a_fb); + + return vnt_rxtx_rts_ab_head(tx_context, &head->rts_ab); + } - if (wFifoCtl & FIFOCTL_AUTO_FB_0) - byFBOption = AUTO_FB_0; - else if (wFifoCtl & FIFOCTL_AUTO_FB_1) - byFBOption = AUTO_FB_1; + if (tx_context->pkt_type == PK_TYPE_11A) + return vnt_rxtx_datahead_a_fb(tx_context, + &head->data_head_a_fb); - if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) { + return vnt_rxtx_datahead_ab(tx_context, &head->data_head_ab); +} + +static u16 vnt_generate_tx_parameter(struct vnt_usb_send_context *tx_context, + struct vnt_tx_buffer *tx_buffer, + struct vnt_mic_hdr **mic_hdr, u32 need_mic, + bool need_rts) +{ + + if (tx_context->pkt_type == PK_TYPE_11GB || + tx_context->pkt_type == PK_TYPE_11GA) { if (need_rts) { - struct vnt_rrv_time_rts *pBuf = - &tx_buffer->tx_head.tx_rts.rts; - - pBuf->rts_rrv_time_aa = s_uGetRTSCTSRsvTime(pDevice, 2, - byPktType, cbFrameSize, wCurrentRate); - pBuf->rts_rrv_time_ba = s_uGetRTSCTSRsvTime(pDevice, 1, - byPktType, cbFrameSize, wCurrentRate); - pBuf->rts_rrv_time_bb = s_uGetRTSCTSRsvTime(pDevice, 0, - byPktType, cbFrameSize, wCurrentRate); - - pBuf->rrv_time_a = vnt_rxtx_rsvtime_le16(pDevice, - byPktType, cbFrameSize, wCurrentRate, bNeedACK); - pBuf->rrv_time_b = vnt_rxtx_rsvtime_le16(pDevice, - PK_TYPE_11B, cbFrameSize, - pDevice->byTopCCKBasicRate, bNeedACK); - - if (need_mic) { + if (need_mic) *mic_hdr = &tx_buffer-> tx_head.tx_rts.tx.mic.hdr; - head = &tx_buffer->tx_head.tx_rts.tx.mic.head; - } else { - head = &tx_buffer->tx_head.tx_rts.tx.head; - } - - /* Fill RTS */ - return s_vFillRTSHead(pDevice, byPktType, head, - cbFrameSize, bNeedACK, psEthHeader, - wCurrentRate, byFBOption); - - } else { - struct vnt_rrv_time_cts *pBuf = &tx_buffer-> - tx_head.tx_cts.cts; - - pBuf->rrv_time_a = vnt_rxtx_rsvtime_le16(pDevice, - byPktType, cbFrameSize, wCurrentRate, bNeedACK); - pBuf->rrv_time_b = vnt_rxtx_rsvtime_le16(pDevice, - PK_TYPE_11B, cbFrameSize, - pDevice->byTopCCKBasicRate, bNeedACK); - - pBuf->cts_rrv_time_ba = s_uGetRTSCTSRsvTime(pDevice, 3, - byPktType, cbFrameSize, wCurrentRate); - - if (need_mic) { - *mic_hdr = &tx_buffer-> - tx_head.tx_cts.tx.mic.hdr; - head = &tx_buffer->tx_head.tx_cts.tx.mic.head; - } else { - head = &tx_buffer->tx_head.tx_cts.tx.head; - } - - /* Fill CTS */ - return s_vFillCTSHead(pDevice, byPktType, - head, cbFrameSize, bNeedACK, wCurrentRate, - byFBOption); - } - } else if (byPktType == PK_TYPE_11A) { - if (need_mic) { - *mic_hdr = &tx_buffer->tx_head.tx_ab.tx.mic.hdr; - head = &tx_buffer->tx_head.tx_ab.tx.mic.head; - } else { - head = &tx_buffer->tx_head.tx_ab.tx.head; - } - if (need_rts) { - struct vnt_rrv_time_ab *pBuf = &tx_buffer-> - tx_head.tx_ab.ab; - - pBuf->rts_rrv_time = s_uGetRTSCTSRsvTime(pDevice, 2, - byPktType, cbFrameSize, wCurrentRate); - - pBuf->rrv_time = vnt_rxtx_rsvtime_le16(pDevice, - byPktType, cbFrameSize, wCurrentRate, bNeedACK); - - /* Fill RTS */ - return s_vFillRTSHead(pDevice, byPktType, head, - cbFrameSize, bNeedACK, psEthHeader, - wCurrentRate, byFBOption); - } else { - struct vnt_rrv_time_ab *pBuf = &tx_buffer-> - tx_head.tx_ab.ab; - - pBuf->rrv_time = vnt_rxtx_rsvtime_le16(pDevice, - PK_TYPE_11A, cbFrameSize, - wCurrentRate, bNeedACK); - - return vnt_rxtx_datahead_a_fb(pDevice, byPktType, - wCurrentRate, &head->data_head_a_fb, - cbFrameSize, bNeedACK); - } - } else if (byPktType == PK_TYPE_11B) { - if (need_mic) { - *mic_hdr = &tx_buffer->tx_head.tx_ab.tx.mic.hdr; - head = &tx_buffer->tx_head.tx_ab.tx.mic.head; - } else { - head = &tx_buffer->tx_head.tx_ab.tx.head; + return vnt_rxtx_rts(tx_context, &tx_buffer->tx_head, + need_mic); } - if (need_rts) { - struct vnt_rrv_time_ab *pBuf = &tx_buffer-> - tx_head.tx_ab.ab; - - pBuf->rts_rrv_time = s_uGetRTSCTSRsvTime(pDevice, 0, - byPktType, cbFrameSize, wCurrentRate); - - pBuf->rrv_time = vnt_rxtx_rsvtime_le16(pDevice, - PK_TYPE_11B, cbFrameSize, wCurrentRate, - bNeedACK); - - /* Fill RTS */ - return s_vFillRTSHead(pDevice, byPktType, head, - cbFrameSize, - bNeedACK, psEthHeader, wCurrentRate, byFBOption); - } else { - struct vnt_rrv_time_ab *pBuf = &tx_buffer-> - tx_head.tx_ab.ab; - - pBuf->rrv_time = vnt_rxtx_rsvtime_le16(pDevice, - PK_TYPE_11B, cbFrameSize, - wCurrentRate, bNeedACK); - - return vnt_rxtx_datahead_ab(pDevice, byPktType, - wCurrentRate, &head->data_head_ab, - cbFrameSize, bNeedACK); - } + if (need_mic) + *mic_hdr = &tx_buffer->tx_head.tx_cts.tx.mic.hdr; + + return vnt_rxtx_cts(tx_context, &tx_buffer->tx_head, need_mic); } - return 0; + if (need_mic) + *mic_hdr = &tx_buffer->tx_head.tx_ab.tx.mic.hdr; + + return vnt_rxtx_ab(tx_context, &tx_buffer->tx_head, need_rts, need_mic); } -/* - u8 * pbyBuffer,//point to pTxBufHead - u16 wFragType,//00:Non-Frag, 01:Start, 02:Mid, 03:Last - unsigned int cbFragmentSize,//Hdr+payoad+FCS -*/ - -static int s_bPacketToWirelessUsb(struct vnt_private *pDevice, u8 byPktType, - struct vnt_tx_buffer *tx_buffer, int bNeedEncryption, - u32 uSkbPacketLen, struct ethhdr *psEthHeader, - u8 *pPacket, PSKeyItem pTransmitKey, u32 uNodeIndex, u16 wCurrentRate, - u32 *pcbHeaderLen, u32 *pcbTotalLen) -{ - struct vnt_tx_fifo_head *pTxBufHead = &tx_buffer->fifo_head; - u32 cbFrameSize, cbFrameBodySize; - u32 cb802_1_H_len; - u32 cbIVlen = 0, cbICVlen = 0, cbMIClen = 0, cbMACHdLen = 0; - u32 cbFCSlen = 4, cbMICHDR = 0; - int bNeedACK; - bool bRTS = false; - u8 *pbyType, *pbyMacHdr, *pbyIVHead, *pbyPayloadHead, *pbyTxBufferAddr; - u8 abySNAP_RFC1042[ETH_ALEN] = {0xAA, 0xAA, 0x03, 0x00, 0x00, 0x00}; - u8 abySNAP_Bridgetunnel[ETH_ALEN] - = {0xAA, 0xAA, 0x03, 0x00, 0x00, 0xF8}; - u32 uDuration; - u32 cbHeaderLength = 0, uPadding = 0; - struct vnt_mic_hdr *pMICHDR; - u8 byFBOption = AUTO_FB_NONE, byFragType; - u16 wTxBufSize; - u32 dwMICKey0, dwMICKey1, dwMIC_Priority; - u32 *pdwMIC_L, *pdwMIC_R; - int bSoftWEP = false; - - pMICHDR = NULL; - - if (bNeedEncryption && pTransmitKey->pvKeyTable) { - if (((PSKeyTable)pTransmitKey->pvKeyTable)->bSoftWEP == true) - bSoftWEP = true; /* WEP 256 */ - } - /* Get pkt type */ - if (ntohs(psEthHeader->h_proto) > ETH_DATA_LEN) - cb802_1_H_len = 8; - else - cb802_1_H_len = 0; - - cbFrameBodySize = uSkbPacketLen - ETH_HLEN + cb802_1_H_len; - - //Set packet type - pTxBufHead->wFIFOCtl |= (u16)(byPktType<<8); - - if (pDevice->op_mode == NL80211_IFTYPE_ADHOC || - pDevice->op_mode == NL80211_IFTYPE_AP) { - if (is_multicast_ether_addr(psEthHeader->h_dest)) { - bNeedACK = false; - pTxBufHead->wFIFOCtl = - pTxBufHead->wFIFOCtl & (~FIFOCTL_NEEDACK); - } else { - bNeedACK = true; - pTxBufHead->wFIFOCtl |= FIFOCTL_NEEDACK; +static void vnt_fill_txkey(struct vnt_usb_send_context *tx_context, + u8 *key_buffer, struct ieee80211_key_conf *tx_key, struct sk_buff *skb, + u16 payload_len, struct vnt_mic_hdr *mic_hdr) +{ + struct ieee80211_hdr *hdr = tx_context->hdr; + struct ieee80211_key_seq seq; + u8 *iv = ((u8 *)hdr + ieee80211_get_hdrlen_from_skb(skb)); + + /* strip header and icv len from payload */ + payload_len -= ieee80211_get_hdrlen_from_skb(skb); + payload_len -= tx_key->icv_len; + + switch (tx_key->cipher) { + case WLAN_CIPHER_SUITE_WEP40: + case WLAN_CIPHER_SUITE_WEP104: + memcpy(key_buffer, iv, 3); + memcpy(key_buffer + 3, tx_key->key, tx_key->keylen); + + if (tx_key->keylen == WLAN_KEY_LEN_WEP40) { + memcpy(key_buffer + 8, iv, 3); + memcpy(key_buffer + 11, + tx_key->key, WLAN_KEY_LEN_WEP40); } - } else { - /* MSDUs in Infra mode always need ACK */ - bNeedACK = true; - pTxBufHead->wFIFOCtl |= FIFOCTL_NEEDACK; - } - pTxBufHead->time_stamp = cpu_to_le16(DEFAULT_MSDU_LIFETIME_RES_64us); + break; + case WLAN_CIPHER_SUITE_TKIP: + ieee80211_get_tkip_p2k(tx_key, skb, key_buffer); - //Set FRAGCTL_MACHDCNT - cbMACHdLen = WLAN_HDR_ADDR3_LEN; + break; + case WLAN_CIPHER_SUITE_CCMP: - pTxBufHead->wFragCtl |= (u16)(cbMACHdLen << 10); + if (!mic_hdr) + return; - //Set FIFOCTL_GrpAckPolicy - if (pDevice->bGrpAckPolicy == true) {//0000 0100 0000 0000 - pTxBufHead->wFIFOCtl |= FIFOCTL_GRPACK; - } + mic_hdr->id = 0x59; + mic_hdr->payload_len = cpu_to_be16(payload_len); + memcpy(mic_hdr->mic_addr2, hdr->addr2, ETH_ALEN); - /* Set Auto Fallback Ctl */ - if (wCurrentRate >= RATE_18M) { - if (pDevice->byAutoFBCtrl == AUTO_FB_0) { - pTxBufHead->wFIFOCtl |= FIFOCTL_AUTO_FB_0; + ieee80211_get_key_tx_seq(tx_key, &seq); - pDevice->tx_rate_fb0 = - wFB_Opt0[FB_RATE0][wCurrentRate - RATE_18M]; - pDevice->tx_rate_fb1 = - wFB_Opt0[FB_RATE1][wCurrentRate - RATE_18M]; + memcpy(mic_hdr->ccmp_pn, seq.ccmp.pn, IEEE80211_CCMP_PN_LEN); - byFBOption = AUTO_FB_0; - } else if (pDevice->byAutoFBCtrl == AUTO_FB_1) { - pTxBufHead->wFIFOCtl |= FIFOCTL_AUTO_FB_1; - pDevice->tx_rate_fb0 = - wFB_Opt1[FB_RATE0][wCurrentRate - RATE_18M]; - pDevice->tx_rate_fb1 = - wFB_Opt1[FB_RATE1][wCurrentRate - RATE_18M]; + if (ieee80211_has_a4(hdr->frame_control)) + mic_hdr->hlen = cpu_to_be16(28); + else + mic_hdr->hlen = cpu_to_be16(22); - byFBOption = AUTO_FB_1; - } - } + memcpy(mic_hdr->addr1, hdr->addr1, ETH_ALEN); + memcpy(mic_hdr->addr2, hdr->addr2, ETH_ALEN); + memcpy(mic_hdr->addr3, hdr->addr3, ETH_ALEN); - if (bSoftWEP != true) { - if ((bNeedEncryption) && (pTransmitKey != NULL)) { //WEP enabled - if (pTransmitKey->byCipherSuite == KEY_CTL_WEP) { //WEP40 or WEP104 - pTxBufHead->wFragCtl |= FRAGCTL_LEGACY; - } - if (pTransmitKey->byCipherSuite == KEY_CTL_TKIP) { - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Tx Set wFragCtl == FRAGCTL_TKIP\n"); - pTxBufHead->wFragCtl |= FRAGCTL_TKIP; - } - else if (pTransmitKey->byCipherSuite == KEY_CTL_CCMP) { //CCMP - pTxBufHead->wFragCtl |= FRAGCTL_AES; - } - } - } + mic_hdr->frame_control = cpu_to_le16( + le16_to_cpu(hdr->frame_control) & 0xc78f); + mic_hdr->seq_ctrl = cpu_to_le16( + le16_to_cpu(hdr->seq_ctrl) & 0xf); + + if (ieee80211_has_a4(hdr->frame_control)) + memcpy(mic_hdr->addr4, hdr->addr4, ETH_ALEN); - if ((bNeedEncryption) && (pTransmitKey != NULL)) { - if (pTransmitKey->byCipherSuite == KEY_CTL_WEP) { - cbIVlen = 4; - cbICVlen = 4; - } - else if (pTransmitKey->byCipherSuite == KEY_CTL_TKIP) { - cbIVlen = 8;//IV+ExtIV - cbMIClen = 8; - cbICVlen = 4; - } - if (pTransmitKey->byCipherSuite == KEY_CTL_CCMP) { - cbIVlen = 8;//RSN Header - cbICVlen = 8;//MIC - cbMICHDR = sizeof(struct vnt_mic_hdr); - } - if (bSoftWEP == false) { - //MAC Header should be padding 0 to DW alignment. - uPadding = 4 - (cbMACHdLen%4); - uPadding %= 4; - } - } - - cbFrameSize = cbMACHdLen + cbIVlen + (cbFrameBodySize + cbMIClen) + cbICVlen + cbFCSlen; - - if ( (bNeedACK == false) ||(cbFrameSize < pDevice->wRTSThreshold) ) { - bRTS = false; - } else { - bRTS = true; - pTxBufHead->wFIFOCtl |= (FIFOCTL_RTS | FIFOCTL_LRETRY); - } - - pbyTxBufferAddr = (u8 *) &(pTxBufHead->adwTxKey[0]); - wTxBufSize = sizeof(struct vnt_tx_fifo_head); - - if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {//802.11g packet - if (byFBOption == AUTO_FB_NONE) { - if (bRTS == true) {//RTS_need - cbHeaderLength = wTxBufSize + sizeof(struct vnt_rrv_time_rts) + - cbMICHDR + sizeof(struct vnt_rts_g); - } - else { //RTS_needless - cbHeaderLength = wTxBufSize + sizeof(struct vnt_rrv_time_cts) + - cbMICHDR + sizeof(struct vnt_cts); - } - } else { - // Auto Fall Back - if (bRTS == true) {//RTS_need - cbHeaderLength = wTxBufSize + sizeof(struct vnt_rrv_time_rts) + - cbMICHDR + sizeof(struct vnt_rts_g_fb); - } - else if (bRTS == false) { //RTS_needless - cbHeaderLength = wTxBufSize + sizeof(struct vnt_rrv_time_cts) + - cbMICHDR + sizeof(struct vnt_cts_fb); - } - } // Auto Fall Back - } - else {//802.11a/b packet - if (byFBOption == AUTO_FB_NONE) { - if (bRTS == true) {//RTS_need - cbHeaderLength = wTxBufSize + sizeof(struct vnt_rrv_time_ab) + - cbMICHDR + sizeof(struct vnt_rts_ab); - } - else if (bRTS == false) { //RTS_needless, no MICHDR - cbHeaderLength = wTxBufSize + sizeof(struct vnt_rrv_time_ab) + - cbMICHDR + sizeof(struct vnt_tx_datahead_ab); - } - } else { - // Auto Fall Back - if (bRTS == true) {//RTS_need - cbHeaderLength = wTxBufSize + sizeof(struct vnt_rrv_time_ab) + - cbMICHDR + sizeof(struct vnt_rts_a_fb); - } - else if (bRTS == false) { //RTS_needless - cbHeaderLength = wTxBufSize + sizeof(struct vnt_rrv_time_ab) + - cbMICHDR + sizeof(struct vnt_tx_datahead_a_fb); - } - } // Auto Fall Back - } - - pbyMacHdr = (u8 *)(pbyTxBufferAddr + cbHeaderLength); - pbyIVHead = (u8 *)(pbyMacHdr + cbMACHdLen + uPadding); - pbyPayloadHead = (u8 *)(pbyMacHdr + cbMACHdLen + uPadding + cbIVlen); - - //========================= - // No Fragmentation - //========================= - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"No Fragmentation...\n"); - byFragType = FRAGCTL_NONFRAG; - //pTxBufHead = (PSTxBufHead) &(pTxBufHead->adwTxKey[0]); - - /* Fill FIFO, RrvTime, RTS and CTS */ - uDuration = s_vGenerateTxParameter(pDevice, byPktType, wCurrentRate, - tx_buffer, &pMICHDR, cbMICHDR, - cbFrameSize, bNeedACK, psEthHeader, bRTS); - - // Generate TX MAC Header - s_vGenerateMACHeader(pDevice, pbyMacHdr, (u16)uDuration, psEthHeader, bNeedEncryption, - byFragType, 0); - - if (bNeedEncryption == true) { - //Fill TXKEY - s_vFillTxKey(pDevice, pTxBufHead, pbyIVHead, pTransmitKey, - pbyMacHdr, (u16)cbFrameBodySize, pMICHDR); - } - - /* 802.1H */ - if (ntohs(psEthHeader->h_proto) > ETH_DATA_LEN) { - if ((psEthHeader->h_proto == cpu_to_be16(ETH_P_IPX)) || - (psEthHeader->h_proto == cpu_to_le16(0xF380))) - memcpy((u8 *) (pbyPayloadHead), - abySNAP_Bridgetunnel, 6); - else - memcpy((u8 *) (pbyPayloadHead), &abySNAP_RFC1042[0], 6); - pbyType = (u8 *) (pbyPayloadHead + 6); + memcpy(key_buffer, tx_key->key, WLAN_KEY_LEN_CCMP); - memcpy(pbyType, &(psEthHeader->h_proto), sizeof(u16)); + break; + default: + break; } - if (pPacket != NULL) { - // Copy the Packet into a tx Buffer - memcpy((pbyPayloadHead + cb802_1_H_len), - (pPacket + ETH_HLEN), - uSkbPacketLen - ETH_HLEN - ); +} - } else { - // while bRelayPacketSend psEthHeader is point to header+payload - memcpy((pbyPayloadHead + cb802_1_H_len), ((u8 *)psEthHeader) + ETH_HLEN, uSkbPacketLen - ETH_HLEN); - } +int vnt_tx_packet(struct vnt_private *priv, struct sk_buff *skb) +{ + struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); + struct ieee80211_tx_rate *tx_rate = &info->control.rates[0]; + struct ieee80211_rate *rate; + struct ieee80211_key_conf *tx_key; + struct ieee80211_hdr *hdr; + struct vnt_mic_hdr *mic_hdr = NULL; + struct vnt_tx_buffer *tx_buffer; + struct vnt_tx_fifo_head *tx_buffer_head; + struct vnt_usb_send_context *tx_context; + unsigned long flags; + u16 tx_bytes, tx_header_size, tx_body_size, current_rate, duration_id; + u8 pkt_type, fb_option = AUTO_FB_NONE; + bool need_rts = false, is_pspoll = false; + bool need_mic = false; - if ((bNeedEncryption == true) && (pTransmitKey != NULL) && (pTransmitKey->byCipherSuite == KEY_CTL_TKIP)) { + hdr = (struct ieee80211_hdr *)(skb->data); - /////////////////////////////////////////////////////////////////// + rate = ieee80211_get_tx_rate(priv->hw, info); - if (pDevice->vnt_mgmt.eAuthenMode == WMAC_AUTH_WPANONE) { - dwMICKey0 = *(u32 *)(&pTransmitKey->abyKey[16]); - dwMICKey1 = *(u32 *)(&pTransmitKey->abyKey[20]); + current_rate = rate->hw_value; + if (priv->current_rate != current_rate && + !(priv->hw->conf.flags & IEEE80211_CONF_OFFCHANNEL)) { + priv->current_rate = current_rate; + vnt_schedule_command(priv, WLAN_CMD_SETPOWER); } - else if ((pTransmitKey->dwKeyIndex & AUTHENTICATOR_KEY) != 0) { - dwMICKey0 = *(u32 *)(&pTransmitKey->abyKey[16]); - dwMICKey1 = *(u32 *)(&pTransmitKey->abyKey[20]); - } - else { - dwMICKey0 = *(u32 *)(&pTransmitKey->abyKey[24]); - dwMICKey1 = *(u32 *)(&pTransmitKey->abyKey[28]); - } - // DO Software Michael - MIC_vInit(dwMICKey0, dwMICKey1); - MIC_vAppend((u8 *)&(psEthHeader->h_dest[0]), 12); - dwMIC_Priority = 0; - MIC_vAppend((u8 *)&dwMIC_Priority, 4); - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"MIC KEY: %X, %X\n", - dwMICKey0, dwMICKey1); - - /////////////////////////////////////////////////////////////////// - - //DBG_PRN_GRP12(("Length:%d, %d\n", cbFrameBodySize, uFromHDtoPLDLength)); - //for (ii = 0; ii < cbFrameBodySize; ii++) { - // DBG_PRN_GRP12(("%02x ", *((u8 *)((pbyPayloadHead + cb802_1_H_len) + ii)))); - //} - //DBG_PRN_GRP12(("\n\n\n")); - - MIC_vAppend(pbyPayloadHead, cbFrameBodySize); - - pdwMIC_L = (u32 *)(pbyPayloadHead + cbFrameBodySize); - pdwMIC_R = (u32 *)(pbyPayloadHead + cbFrameBodySize + 4); - - MIC_vGetMIC(pdwMIC_L, pdwMIC_R); - MIC_vUnInit(); - - if (pDevice->bTxMICFail == true) { - *pdwMIC_L = 0; - *pdwMIC_R = 0; - pDevice->bTxMICFail = false; - } - //DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"uLength: %d, %d\n", uLength, cbFrameBodySize); - //DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"cbReqCount:%d, %d, %d, %d\n", cbReqCount, cbHeaderLength, uPadding, cbIVlen); - //DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"MIC:%lX, %lX\n", *pdwMIC_L, *pdwMIC_R); - } - if (bSoftWEP == true) { + if (current_rate > RATE_11M) + pkt_type = priv->packet_type; + else + pkt_type = PK_TYPE_11B; - s_vSWencryption(pDevice, pTransmitKey, (pbyPayloadHead), (u16)(cbFrameBodySize + cbMIClen)); + spin_lock_irqsave(&priv->lock, flags); - } else if ( ((pDevice->eEncryptionStatus == Ndis802_11Encryption1Enabled) && (bNeedEncryption == true)) || - ((pDevice->eEncryptionStatus == Ndis802_11Encryption2Enabled) && (bNeedEncryption == true)) || - ((pDevice->eEncryptionStatus == Ndis802_11Encryption3Enabled) && (bNeedEncryption == true)) ) { - cbFrameSize -= cbICVlen; - } + tx_context = vnt_get_free_context(priv); + if (!tx_context) { + dev_dbg(&priv->usb->dev, "%s No free context\n", __func__); + spin_unlock_irqrestore(&priv->lock, flags); + return -ENOMEM; + } - cbFrameSize -= cbFCSlen; + tx_context->skb = skb; + tx_context->pkt_type = pkt_type; + tx_context->need_ack = false; + tx_context->frame_len = skb->len + 4; + tx_context->tx_rate = current_rate; + + spin_unlock_irqrestore(&priv->lock, flags); + + tx_buffer = (struct vnt_tx_buffer *)tx_context->data; + tx_buffer_head = &tx_buffer->fifo_head; + tx_body_size = skb->len; + + /*Set fifo controls */ + if (pkt_type == PK_TYPE_11A) + tx_buffer_head->fifo_ctl = 0; + else if (pkt_type == PK_TYPE_11B) + tx_buffer_head->fifo_ctl = cpu_to_le16(FIFOCTL_11B); + else if (pkt_type == PK_TYPE_11GB) + tx_buffer_head->fifo_ctl = cpu_to_le16(FIFOCTL_11GB); + else if (pkt_type == PK_TYPE_11GA) + tx_buffer_head->fifo_ctl = cpu_to_le16(FIFOCTL_11GA); + + if (!ieee80211_is_data(hdr->frame_control)) { + tx_buffer_head->fifo_ctl |= cpu_to_le16(FIFOCTL_GENINT | + FIFOCTL_ISDMA0); + tx_buffer_head->fifo_ctl |= cpu_to_le16(FIFOCTL_TMOEN); + + tx_buffer_head->time_stamp = + cpu_to_le16(DEFAULT_MGN_LIFETIME_RES_64us); + } else { + tx_buffer_head->time_stamp = + cpu_to_le16(DEFAULT_MSDU_LIFETIME_RES_64us); + } - *pcbHeaderLen = cbHeaderLength; - *pcbTotalLen = cbHeaderLength + cbFrameSize ; + if (!(info->flags & IEEE80211_TX_CTL_NO_ACK)) { + tx_buffer_head->fifo_ctl |= cpu_to_le16(FIFOCTL_NEEDACK); + tx_context->need_ack = true; + } - //Set FragCtl in TxBufferHead - pTxBufHead->wFragCtl |= (u16)byFragType; + if (ieee80211_has_retry(hdr->frame_control)) + tx_buffer_head->fifo_ctl |= cpu_to_le16(FIFOCTL_LRETRY); - return true; + if (tx_rate->flags & IEEE80211_TX_RC_USE_SHORT_PREAMBLE) + priv->preamble_type = PREAMBLE_SHORT; + else + priv->preamble_type = PREAMBLE_LONG; -} + if (tx_rate->flags & IEEE80211_TX_RC_USE_RTS_CTS) { + need_rts = true; + tx_buffer_head->fifo_ctl |= cpu_to_le16(FIFOCTL_RTS); + } -/*+ - * - * Description: - * Translate 802.3 to 802.11 header - * - * Parameters: - * In: - * pDevice - Pointer to adapter - * dwTxBufferAddr - Transmit Buffer - * pPacket - Packet from upper layer - * cbPacketSize - Transmit Data Length - * Out: - * pcbHeadSize - Header size of MAC&Baseband control and 802.11 Header - * pcbAppendPayload - size of append payload for 802.1H translation - * - * Return Value: none - * --*/ + if (ieee80211_has_a4(hdr->frame_control)) + tx_buffer_head->fifo_ctl |= cpu_to_le16(FIFOCTL_LHEAD); -static void s_vGenerateMACHeader(struct vnt_private *pDevice, - u8 *pbyBufferAddr, u16 wDuration, struct ethhdr *psEthHeader, - int bNeedEncrypt, u16 wFragType, u32 uFragIdx) -{ - struct ieee80211_hdr *pMACHeader = (struct ieee80211_hdr *)pbyBufferAddr; - - pMACHeader->frame_control = TYPE_802_11_DATA; - - if (pDevice->op_mode == NL80211_IFTYPE_AP) { - memcpy(&(pMACHeader->addr1[0]), - &(psEthHeader->h_dest[0]), - ETH_ALEN); - memcpy(&(pMACHeader->addr2[0]), &(pDevice->abyBSSID[0]), ETH_ALEN); - memcpy(&(pMACHeader->addr3[0]), - &(psEthHeader->h_source[0]), - ETH_ALEN); - pMACHeader->frame_control |= FC_FROMDS; - } else { - if (pDevice->op_mode == NL80211_IFTYPE_ADHOC) { - memcpy(&(pMACHeader->addr1[0]), - &(psEthHeader->h_dest[0]), - ETH_ALEN); - memcpy(&(pMACHeader->addr2[0]), - &(psEthHeader->h_source[0]), - ETH_ALEN); - memcpy(&(pMACHeader->addr3[0]), - &(pDevice->abyBSSID[0]), - ETH_ALEN); - } else { - memcpy(&(pMACHeader->addr3[0]), - &(psEthHeader->h_dest[0]), - ETH_ALEN); - memcpy(&(pMACHeader->addr2[0]), - &(psEthHeader->h_source[0]), - ETH_ALEN); - memcpy(&(pMACHeader->addr1[0]), - &(pDevice->abyBSSID[0]), - ETH_ALEN); - pMACHeader->frame_control |= FC_TODS; - } - } + if (info->flags & IEEE80211_TX_CTL_NO_PS_BUFFER) + is_pspoll = true; - if (bNeedEncrypt) - pMACHeader->frame_control |= cpu_to_le16((u16)WLAN_SET_FC_ISWEP(1)); + tx_buffer_head->frag_ctl = + cpu_to_le16(ieee80211_get_hdrlen_from_skb(skb) << 10); - pMACHeader->duration_id = cpu_to_le16(wDuration); + if (info->control.hw_key) { + tx_key = info->control.hw_key; + switch (info->control.hw_key->cipher) { + case WLAN_CIPHER_SUITE_WEP40: + case WLAN_CIPHER_SUITE_WEP104: + tx_buffer_head->frag_ctl |= cpu_to_le16(FRAGCTL_LEGACY); + break; + case WLAN_CIPHER_SUITE_TKIP: + tx_buffer_head->frag_ctl |= cpu_to_le16(FRAGCTL_TKIP); + break; + case WLAN_CIPHER_SUITE_CCMP: + tx_buffer_head->frag_ctl |= cpu_to_le16(FRAGCTL_AES); + need_mic = true; + default: + break; + } + tx_context->frame_len += tx_key->icv_len; + } - pMACHeader->seq_ctrl = cpu_to_le16(pDevice->wSeqCounter << 4); + tx_buffer_head->current_rate = cpu_to_le16(current_rate); - //Set FragNumber in Sequence Control - pMACHeader->seq_ctrl |= cpu_to_le16((u16)uFragIdx); + /* legacy rates TODO use ieee80211_tx_rate */ + if (current_rate >= RATE_18M && ieee80211_is_data(hdr->frame_control)) { + if (priv->auto_fb_ctrl == AUTO_FB_0) { + tx_buffer_head->fifo_ctl |= + cpu_to_le16(FIFOCTL_AUTO_FB_0); - if ((wFragType == FRAGCTL_ENDFRAG) || (wFragType == FRAGCTL_NONFRAG)) { - pDevice->wSeqCounter++; - if (pDevice->wSeqCounter > 0x0fff) - pDevice->wSeqCounter = 0; - } + priv->tx_rate_fb0 = + vnt_fb_opt0[FB_RATE0][current_rate - RATE_18M]; + priv->tx_rate_fb1 = + vnt_fb_opt0[FB_RATE1][current_rate - RATE_18M]; - if ((wFragType == FRAGCTL_STAFRAG) || (wFragType == FRAGCTL_MIDFRAG)) { //StartFrag or MidFrag - pMACHeader->frame_control |= FC_MOREFRAG; - } -} + fb_option = AUTO_FB_0; + } else if (priv->auto_fb_ctrl == AUTO_FB_1) { + tx_buffer_head->fifo_ctl |= + cpu_to_le16(FIFOCTL_AUTO_FB_1); -/*+ - * - * Description: - * Request instructs a MAC to transmit a 802.11 management packet through - * the adapter onto the medium. - * - * Parameters: - * In: - * hDeviceContext - Pointer to the adapter - * pPacket - A pointer to a descriptor for the packet to transmit - * Out: - * none - * - * Return Value: CMD_STATUS_PENDING if MAC Tx resource available; otherwise false - * --*/ + priv->tx_rate_fb0 = + vnt_fb_opt1[FB_RATE0][current_rate - RATE_18M]; + priv->tx_rate_fb1 = + vnt_fb_opt1[FB_RATE1][current_rate - RATE_18M]; -CMD_STATUS csMgmt_xmit(struct vnt_private *pDevice, - struct vnt_tx_mgmt *pPacket) -{ - struct vnt_manager *pMgmt = &pDevice->vnt_mgmt; - struct vnt_tx_buffer *pTX_Buffer; - struct vnt_usb_send_context *pContext; - struct vnt_tx_fifo_head *pTxBufHead; - struct ieee80211_hdr *pMACHeader; - struct ethhdr sEthHeader; - u8 byPktType, *pbyTxBufferAddr; - struct vnt_mic_hdr *pMICHDR = NULL; - u32 uDuration, cbReqCount, cbHeaderSize, cbFrameBodySize, cbFrameSize; - int bNeedACK, bIsPSPOLL = false; - u32 cbIVlen = 0, cbICVlen = 0, cbMIClen = 0, cbFCSlen = 4; - u32 uPadding = 0; - u16 wTxBufSize; - u32 cbMacHdLen; - u16 wCurrentRate = RATE_1M; - unsigned long flags; + fb_option = AUTO_FB_1; + } + } - if (pDevice->byBBType == BB_TYPE_11A) { - wCurrentRate = RATE_6M; - byPktType = PK_TYPE_11A; - } else { - wCurrentRate = RATE_1M; - byPktType = PK_TYPE_11B; + tx_context->fb_option = fb_option; + + duration_id = vnt_generate_tx_parameter(tx_context, tx_buffer, &mic_hdr, + need_mic, need_rts); + + tx_header_size = tx_context->tx_hdr_size; + if (!tx_header_size) { + tx_context->in_use = false; + return -ENOMEM; } - if (pMgmt->eScanState != WMAC_NO_SCANNING) - vnt_rf_setpower(pDevice, wCurrentRate, pDevice->byCurrentCh); - else - vnt_rf_setpower(pDevice, wCurrentRate, pMgmt->uCurrChannel); + tx_buffer_head->frag_ctl |= cpu_to_le16(FRAGCTL_NONFRAG); - pDevice->wCurrentRate = wCurrentRate; + tx_bytes = tx_header_size + tx_body_size; - spin_lock_irqsave(&pDevice->lock, flags); + memcpy(tx_context->hdr, skb->data, tx_body_size); - pContext = s_vGetFreeContext(pDevice); - if (!pContext) { - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO - "ManagementSend TX...NO CONTEXT!\n"); - spin_unlock_irqrestore(&pDevice->lock, flags); - return CMD_STATUS_RESOURCES; - } + hdr->duration_id = cpu_to_le16(duration_id); - pTX_Buffer = (struct vnt_tx_buffer *)&pContext->data[0]; - cbFrameBodySize = pPacket->cbPayloadLen; - pTxBufHead = &pTX_Buffer->fifo_head; - pbyTxBufferAddr = (u8 *)&pTxBufHead->adwTxKey[0]; - wTxBufSize = sizeof(struct vnt_tx_fifo_head); - - - //Set packet type - if (byPktType == PK_TYPE_11A) {//0000 0000 0000 0000 - pTxBufHead->wFIFOCtl = 0; - } - else if (byPktType == PK_TYPE_11B) {//0000 0001 0000 0000 - pTxBufHead->wFIFOCtl |= FIFOCTL_11B; - } - else if (byPktType == PK_TYPE_11GB) {//0000 0010 0000 0000 - pTxBufHead->wFIFOCtl |= FIFOCTL_11GB; - } - else if (byPktType == PK_TYPE_11GA) {//0000 0011 0000 0000 - pTxBufHead->wFIFOCtl |= FIFOCTL_11GA; - } - - pTxBufHead->wFIFOCtl |= FIFOCTL_TMOEN; - pTxBufHead->time_stamp = cpu_to_le16(DEFAULT_MGN_LIFETIME_RES_64us); - - if (is_multicast_ether_addr(pPacket->p80211Header->sA3.abyAddr1)) { - bNeedACK = false; - } - else { - bNeedACK = true; - pTxBufHead->wFIFOCtl |= FIFOCTL_NEEDACK; - }; - - if ((pMgmt->eCurrMode == WMAC_MODE_ESS_AP) || - (pMgmt->eCurrMode == WMAC_MODE_IBSS_STA) ) { - - pTxBufHead->wFIFOCtl |= FIFOCTL_LRETRY; - //Set Preamble type always long - //pDevice->byPreambleType = PREAMBLE_LONG; - // probe-response don't retry - //if ((pPacket->p80211Header->sA4.wFrameCtl & TYPE_SUBTYPE_MASK) == TYPE_MGMT_PROBE_RSP) { - // bNeedACK = false; - // pTxBufHead->wFIFOCtl &= (~FIFOCTL_NEEDACK); - //} - } - - pTxBufHead->wFIFOCtl |= (FIFOCTL_GENINT | FIFOCTL_ISDMA0); - - if ((pPacket->p80211Header->sA4.wFrameCtl & TYPE_SUBTYPE_MASK) == TYPE_CTL_PSPOLL) { - bIsPSPOLL = true; - cbMacHdLen = WLAN_HDR_ADDR2_LEN; - } else { - cbMacHdLen = WLAN_HDR_ADDR3_LEN; - } - - //Set FRAGCTL_MACHDCNT - pTxBufHead->wFragCtl |= cpu_to_le16((u16)(cbMacHdLen << 10)); - - // Notes: - // Although spec says MMPDU can be fragmented; In most case, - // no one will send a MMPDU under fragmentation. With RTS may occur. - - if (WLAN_GET_FC_ISWEP(pPacket->p80211Header->sA4.wFrameCtl) != 0) { - if (pDevice->eEncryptionStatus == Ndis802_11Encryption1Enabled) { - cbIVlen = 4; - cbICVlen = 4; - pTxBufHead->wFragCtl |= FRAGCTL_LEGACY; - } - else if (pDevice->eEncryptionStatus == Ndis802_11Encryption2Enabled) { - cbIVlen = 8;//IV+ExtIV - cbMIClen = 8; - cbICVlen = 4; - pTxBufHead->wFragCtl |= FRAGCTL_TKIP; - //We need to get seed here for filling TxKey entry. - //TKIPvMixKey(pTransmitKey->abyKey, pDevice->abyCurrentNetAddr, - // pTransmitKey->wTSC15_0, pTransmitKey->dwTSC47_16, pDevice->abyPRNG); - } - else if (pDevice->eEncryptionStatus == Ndis802_11Encryption3Enabled) { - cbIVlen = 8;//RSN Header - cbICVlen = 8;//MIC - pTxBufHead->wFragCtl |= FRAGCTL_AES; - } - //MAC Header should be padding 0 to DW alignment. - uPadding = 4 - (cbMacHdLen%4); - uPadding %= 4; - } - - cbFrameSize = cbMacHdLen + cbFrameBodySize + cbIVlen + cbMIClen + cbICVlen + cbFCSlen; - - //Set FIFOCTL_GrpAckPolicy - if (pDevice->bGrpAckPolicy == true) {//0000 0100 0000 0000 - pTxBufHead->wFIFOCtl |= FIFOCTL_GRPACK; - } - //the rest of pTxBufHead->wFragCtl:FragTyp will be set later in s_vFillFragParameter() - - //Set RrvTime/RTS/CTS Buffer - if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) {//802.11g packet - cbHeaderSize = wTxBufSize + sizeof(struct vnt_rrv_time_cts) + - sizeof(struct vnt_cts); - } - else { // 802.11a/b packet - cbHeaderSize = wTxBufSize + sizeof(struct vnt_rrv_time_ab) + - sizeof(struct vnt_tx_datahead_ab); - } - - memcpy(&(sEthHeader.h_dest[0]), - &(pPacket->p80211Header->sA3.abyAddr1[0]), - ETH_ALEN); - memcpy(&(sEthHeader.h_source[0]), - &(pPacket->p80211Header->sA3.abyAddr2[0]), - ETH_ALEN); - //========================= - // No Fragmentation - //========================= - pTxBufHead->wFragCtl |= (u16)FRAGCTL_NONFRAG; - - /* Fill FIFO,RrvTime,RTS,and CTS */ - uDuration = s_vGenerateTxParameter(pDevice, byPktType, wCurrentRate, - pTX_Buffer, &pMICHDR, 0, - cbFrameSize, bNeedACK, &sEthHeader, false); - - pMACHeader = (struct ieee80211_hdr *) (pbyTxBufferAddr + cbHeaderSize); - - cbReqCount = cbHeaderSize + cbMacHdLen + uPadding + cbIVlen + cbFrameBodySize; - - if (WLAN_GET_FC_ISWEP(pPacket->p80211Header->sA4.wFrameCtl) != 0) { - u8 * pbyIVHead; - u8 * pbyPayloadHead; - u8 * pbyBSSID; - PSKeyItem pTransmitKey = NULL; - - pbyIVHead = (u8 *)(pbyTxBufferAddr + cbHeaderSize + cbMacHdLen + uPadding); - pbyPayloadHead = (u8 *)(pbyTxBufferAddr + cbHeaderSize + cbMacHdLen + uPadding + cbIVlen); - do { - if (pDevice->op_mode == NL80211_IFTYPE_STATION && - pDevice->bLinkPass == true) { - pbyBSSID = pDevice->abyBSSID; - // get pairwise key - if (KeybGetTransmitKey(&(pDevice->sKey), pbyBSSID, PAIRWISE_KEY, &pTransmitKey) == false) { - // get group key - if(KeybGetTransmitKey(&(pDevice->sKey), pbyBSSID, GROUP_KEY, &pTransmitKey) == true) { - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Get GTK.\n"); - break; - } - } else { - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Get PTK.\n"); - break; - } - } - // get group key - pbyBSSID = pDevice->abyBroadcastAddr; - if(KeybGetTransmitKey(&(pDevice->sKey), pbyBSSID, GROUP_KEY, &pTransmitKey) == false) { - pTransmitKey = NULL; - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"KEY is NULL. OP Mode[%d]\n", pDevice->op_mode); - } else { - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Get GTK.\n"); - } - } while(false); - //Fill TXKEY - s_vFillTxKey(pDevice, pTxBufHead, pbyIVHead, pTransmitKey, - (u8 *)pMACHeader, (u16)cbFrameBodySize, NULL); - - memcpy(pMACHeader, pPacket->p80211Header, cbMacHdLen); - memcpy(pbyPayloadHead, ((u8 *)(pPacket->p80211Header) + cbMacHdLen), - cbFrameBodySize); - } - else { - // Copy the Packet into a tx Buffer - memcpy(pMACHeader, pPacket->p80211Header, pPacket->cbMPDULen); - } - - pMACHeader->seq_ctrl = cpu_to_le16(pDevice->wSeqCounter << 4); - pDevice->wSeqCounter++ ; - if (pDevice->wSeqCounter > 0x0fff) - pDevice->wSeqCounter = 0; - - if (bIsPSPOLL) { - // The MAC will automatically replace the Duration-field of MAC header by Duration-field - // of FIFO control header. - // This will cause AID-field of PS-POLL packet be incorrect (Because PS-POLL's AID field is - // in the same place of other packet's Duration-field). - // And it will cause Cisco-AP to issue Disassociation-packet - if (byPktType == PK_TYPE_11GB || byPktType == PK_TYPE_11GA) { - struct vnt_tx_datahead_g *data_head = &pTX_Buffer->tx_head. - tx_cts.tx.head.cts_g.data_head; - data_head->duration_a = - cpu_to_le16(pPacket->p80211Header->sA2.wDurationID); - data_head->duration_b = - cpu_to_le16(pPacket->p80211Header->sA2.wDurationID); - } else { - struct vnt_tx_datahead_ab *data_head = &pTX_Buffer->tx_head. - tx_ab.tx.head.data_head_ab; - data_head->duration = - cpu_to_le16(pPacket->p80211Header->sA2.wDurationID); + if (info->control.hw_key) { + tx_key = info->control.hw_key; + if (tx_key->keylen > 0) + vnt_fill_txkey(tx_context, tx_buffer_head->tx_key, + tx_key, skb, tx_body_size, mic_hdr); } - } - pTX_Buffer->tx_byte_count = cpu_to_le16((u16)(cbReqCount)); - pTX_Buffer->byPKTNO = (u8) (((wCurrentRate<<4) &0x00F0) | ((pDevice->wSeqCounter - 1) & 0x000F)); - pTX_Buffer->byType = 0x00; + priv->seq_counter = (le16_to_cpu(hdr->seq_ctrl) & + IEEE80211_SCTL_SEQ) >> 4; - pContext->skb = NULL; - pContext->type = CONTEXT_MGMT_PACKET; - pContext->buf_len = (u16)cbReqCount + 4; /* USB header */ + tx_buffer->tx_byte_count = cpu_to_le16(tx_bytes); + tx_buffer->pkt_no = tx_context->pkt_no; + tx_buffer->type = 0x00; - if (WLAN_GET_FC_TODS(pMACHeader->frame_control) == 0) { - s_vSaveTxPktInfo(pDevice, (u8)(pTX_Buffer->byPKTNO & 0x0F), - &pMACHeader->addr1[0], (u16)cbFrameSize, - pTxBufHead->wFIFOCtl); - } - else { - s_vSaveTxPktInfo(pDevice, (u8)(pTX_Buffer->byPKTNO & 0x0F), - &pMACHeader->addr3[0], (u16)cbFrameSize, - pTxBufHead->wFIFOCtl); - } + tx_bytes += 4; - PIPEnsSendBulkOut(pDevice,pContext); + tx_context->type = CONTEXT_DATA_PACKET; + tx_context->buf_len = tx_bytes; - spin_unlock_irqrestore(&pDevice->lock, flags); + spin_lock_irqsave(&priv->lock, flags); - return CMD_STATUS_PENDING; + if (vnt_tx_context(priv, tx_context) != STATUS_PENDING) { + spin_unlock_irqrestore(&priv->lock, flags); + return -EIO; + } + + spin_unlock_irqrestore(&priv->lock, flags); + + return 0; } -CMD_STATUS csBeacon_xmit(struct vnt_private *pDevice, - struct vnt_tx_mgmt *pPacket) +static int vnt_beacon_xmit(struct vnt_private *priv, + struct sk_buff *skb) { - struct vnt_beacon_buffer *pTX_Buffer; + struct vnt_beacon_buffer *beacon_buffer; struct vnt_tx_short_buf_head *short_head; - u32 cbFrameSize = pPacket->cbMPDULen + WLAN_FCS_LEN; - u32 cbHeaderSize = 0; - struct ieee80211_hdr *pMACHeader; - u16 wCurrentRate; - u32 cbFrameBodySize; - u32 cbReqCount; - struct vnt_usb_send_context *pContext; - CMD_STATUS status; + struct ieee80211_tx_info *info; + struct vnt_usb_send_context *context; + struct ieee80211_mgmt *mgmt_hdr; + unsigned long flags; + u32 frame_size = skb->len + 4; + u16 current_rate, count; + + spin_lock_irqsave(&priv->lock, flags); - pContext = s_vGetFreeContext(pDevice); - if (NULL == pContext) { - status = CMD_STATUS_RESOURCES; - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"ManagementSend TX...NO CONTEXT!\n"); - return status ; - } + context = vnt_get_free_context(priv); + if (!context) { + dev_dbg(&priv->usb->dev, "%s No free context!\n", __func__); + spin_unlock_irqrestore(&priv->lock, flags); + return -ENOMEM; + } - pTX_Buffer = (struct vnt_beacon_buffer *)&pContext->data[0]; - short_head = &pTX_Buffer->short_head; + context->skb = skb; - cbFrameBodySize = pPacket->cbPayloadLen; + spin_unlock_irqrestore(&priv->lock, flags); - cbHeaderSize = sizeof(struct vnt_tx_short_buf_head); + beacon_buffer = (struct vnt_beacon_buffer *)&context->data[0]; + short_head = &beacon_buffer->short_head; - if (pDevice->byBBType == BB_TYPE_11A) { - wCurrentRate = RATE_6M; + if (priv->bb_type == BB_TYPE_11A) { + current_rate = RATE_6M; /* Get SignalField,ServiceField,Length */ - BBvCalculateParameter(pDevice, cbFrameSize, wCurrentRate, + vnt_get_phy_field(priv, frame_size, current_rate, PK_TYPE_11A, &short_head->ab); /* Get Duration and TimeStampOff */ - short_head->duration = s_uGetDataDuration(pDevice, + short_head->duration = vnt_get_duration_le(priv, PK_TYPE_11A, false); short_head->time_stamp_off = - vnt_time_stamp_off(pDevice, wCurrentRate); + vnt_time_stamp_off(priv, current_rate); } else { - wCurrentRate = RATE_1M; - short_head->fifo_ctl |= FIFOCTL_11B; + current_rate = RATE_1M; + short_head->fifo_ctl |= cpu_to_le16(FIFOCTL_11B); /* Get SignalField,ServiceField,Length */ - BBvCalculateParameter(pDevice, cbFrameSize, wCurrentRate, + vnt_get_phy_field(priv, frame_size, current_rate, PK_TYPE_11B, &short_head->ab); /* Get Duration and TimeStampOff */ - short_head->duration = s_uGetDataDuration(pDevice, + short_head->duration = vnt_get_duration_le(priv, PK_TYPE_11B, false); short_head->time_stamp_off = - vnt_time_stamp_off(pDevice, wCurrentRate); + vnt_time_stamp_off(priv, current_rate); } - /* Generate Beacon Header */ - pMACHeader = &pTX_Buffer->hdr; - - memcpy(pMACHeader, pPacket->p80211Header, pPacket->cbMPDULen); - - pMACHeader->duration_id = 0; - pMACHeader->seq_ctrl = cpu_to_le16(pDevice->wSeqCounter << 4); - pDevice->wSeqCounter++; - if (pDevice->wSeqCounter > 0x0fff) - pDevice->wSeqCounter = 0; - - cbReqCount = cbHeaderSize + WLAN_HDR_ADDR3_LEN + cbFrameBodySize; + mgmt_hdr = &beacon_buffer->mgmt_hdr; + memcpy(mgmt_hdr, skb->data, skb->len); - pTX_Buffer->tx_byte_count = cpu_to_le16((u16)cbReqCount); - pTX_Buffer->byPKTNO = (u8) (((wCurrentRate<<4) &0x00F0) | ((pDevice->wSeqCounter - 1) & 0x000F)); - pTX_Buffer->byType = 0x01; + /* time stamp always 0 */ + mgmt_hdr->u.beacon.timestamp = 0; - pContext->skb = NULL; - pContext->type = CONTEXT_MGMT_PACKET; - pContext->buf_len = (u16)cbReqCount + 4; /* USB header */ + info = IEEE80211_SKB_CB(skb); + if (info->flags & IEEE80211_TX_CTL_ASSIGN_SEQ) { + struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)mgmt_hdr; + hdr->duration_id = 0; + hdr->seq_ctrl = cpu_to_le16(priv->seq_counter << 4); + } - PIPEnsSendBulkOut(pDevice,pContext); - return CMD_STATUS_PENDING; + priv->seq_counter++; + if (priv->seq_counter > 0x0fff) + priv->seq_counter = 0; -} + count = sizeof(struct vnt_tx_short_buf_head) + skb->len; -//TYPE_AC0DMA data tx -/* - * Description: - * Tx packet via AC0DMA(DMA1) - * - * Parameters: - * In: - * pDevice - Pointer to the adapter - * skb - Pointer to tx skb packet - * Out: - * void - * - * Return Value: NULL - */ + beacon_buffer->tx_byte_count = cpu_to_le16(count); + beacon_buffer->pkt_no = context->pkt_no; + beacon_buffer->type = 0x01; -int nsDMA_tx_packet(struct vnt_private *pDevice, struct sk_buff *skb) -{ - struct net_device_stats *pStats = &pDevice->stats; - struct vnt_manager *pMgmt = &pDevice->vnt_mgmt; - struct vnt_tx_buffer *pTX_Buffer; - u32 BytesToWrite = 0, uHeaderLen = 0; - u32 uNodeIndex = 0; - u8 byMask[8] = {1, 2, 4, 8, 0x10, 0x20, 0x40, 0x80}; - u16 wAID; - u8 byPktType; - int bNeedEncryption = false; - PSKeyItem pTransmitKey = NULL; - int ii; - int bTKIP_UseGTK = false; - int bNeedDeAuth = false; - u8 *pbyBSSID; - int bNodeExist = false; - struct vnt_usb_send_context *pContext; - bool fConvertedPacket; - u32 status; - u16 wKeepRate = pDevice->wCurrentRate; - int bTxeapol_key = false; - - if (pMgmt->eCurrMode == WMAC_MODE_ESS_AP) { - - if (pDevice->uAssocCount == 0) { - dev_kfree_skb_irq(skb); - return 0; - } + context->type = CONTEXT_BEACON_PACKET; + context->buf_len = count + 4; /* USB header */ - if (is_multicast_ether_addr((u8 *)(skb->data))) { - uNodeIndex = 0; - bNodeExist = true; - if (pMgmt->sNodeDBTable[0].bPSEnable) { - - skb_queue_tail(&(pMgmt->sNodeDBTable[0].sTxPSQueue), skb); - pMgmt->sNodeDBTable[0].wEnQueueCnt++; - // set tx map - pMgmt->abyPSTxMap[0] |= byMask[0]; - return 0; - } - // multicast/broadcast data rate - - if (pDevice->byBBType != BB_TYPE_11A) - pDevice->wCurrentRate = RATE_2M; - else - pDevice->wCurrentRate = RATE_24M; - // long preamble type - pDevice->byPreambleType = PREAMBLE_SHORT; - - }else { - - if (BSSbIsSTAInNodeDB(pDevice, (u8 *)(skb->data), &uNodeIndex)) { - - if (pMgmt->sNodeDBTable[uNodeIndex].bPSEnable) { - - skb_queue_tail(&pMgmt->sNodeDBTable[uNodeIndex].sTxPSQueue, skb); - - pMgmt->sNodeDBTable[uNodeIndex].wEnQueueCnt++; - // set tx map - wAID = pMgmt->sNodeDBTable[uNodeIndex].wAID; - pMgmt->abyPSTxMap[wAID >> 3] |= byMask[wAID & 7]; - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Set:pMgmt->abyPSTxMap[%d]= %d\n", - (wAID >> 3), pMgmt->abyPSTxMap[wAID >> 3]); - - return 0; - } - // AP rate decided from node - pDevice->wCurrentRate = pMgmt->sNodeDBTable[uNodeIndex].wTxDataRate; - // tx preamble decided from node - - if (pMgmt->sNodeDBTable[uNodeIndex].bShortPreamble) { - pDevice->byPreambleType = pDevice->byShortPreamble; - - }else { - pDevice->byPreambleType = PREAMBLE_LONG; - } - bNodeExist = true; - } - } + spin_lock_irqsave(&priv->lock, flags); - if (bNodeExist == false) { - DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"Unknown STA not found in node DB \n"); - dev_kfree_skb_irq(skb); - return 0; - } - } + if (vnt_tx_context(priv, context) != STATUS_PENDING) + ieee80211_free_txskb(priv->hw, context->skb); - memcpy(&pDevice->sTxEthHeader, skb->data, ETH_HLEN); + spin_unlock_irqrestore(&priv->lock, flags); -//mike add:station mode check eapol-key challenge---> -{ - u8 Protocol_Version; //802.1x Authentication - u8 Packet_Type; //802.1x Authentication - u8 Descriptor_type; - u16 Key_info; - - Protocol_Version = skb->data[ETH_HLEN]; - Packet_Type = skb->data[ETH_HLEN+1]; - Descriptor_type = skb->data[ETH_HLEN+1+1+2]; - Key_info = (skb->data[ETH_HLEN+1+1+2+1] << 8)|(skb->data[ETH_HLEN+1+1+2+2]); - if (pDevice->sTxEthHeader.h_proto == cpu_to_be16(ETH_P_PAE)) { - /* 802.1x OR eapol-key challenge frame transfer */ - if (((Protocol_Version == 1) || (Protocol_Version == 2)) && - (Packet_Type == 3)) { - bTxeapol_key = true; - if(!(Key_info & BIT3) && //WPA or RSN group-key challenge - (Key_info & BIT8) && (Key_info & BIT9)) { //send 2/2 key - if(Descriptor_type==254) { - pDevice->fWPA_Authened = true; - PRINT_K("WPA "); - } - else { - pDevice->fWPA_Authened = true; - PRINT_K("WPA2(re-keying) "); - } - PRINT_K("Authentication completed!!\n"); - } - else if((Key_info & BIT3) && (Descriptor_type==2) && //RSN pairwise-key challenge - (Key_info & BIT8) && (Key_info & BIT9)) { - pDevice->fWPA_Authened = true; - PRINT_K("WPA2 Authentication completed!!\n"); - } - } - } + return 0; } -//mike add:station mode check eapol-key challenge<--- - - if (pDevice->bEncryptionEnable == true) { - bNeedEncryption = true; - // get Transmit key - do { - if ((pMgmt->eCurrMode == WMAC_MODE_ESS_STA) && - (pMgmt->eCurrState == WMAC_STATE_ASSOC)) { - pbyBSSID = pDevice->abyBSSID; - // get pairwise key - if (KeybGetTransmitKey(&(pDevice->sKey), pbyBSSID, PAIRWISE_KEY, &pTransmitKey) == false) { - // get group key - if(KeybGetTransmitKey(&(pDevice->sKey), pbyBSSID, GROUP_KEY, &pTransmitKey) == true) { - bTKIP_UseGTK = true; - DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"Get GTK.\n"); - break; - } - } else { - DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"Get PTK.\n"); - break; - } - }else if (pMgmt->eCurrMode == WMAC_MODE_IBSS_STA) { - /* TO_DS = 0 and FROM_DS = 0 --> 802.11 MAC Address1 */ - pbyBSSID = pDevice->sTxEthHeader.h_dest; - DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"IBSS Serach Key: \n"); - for (ii = 0; ii< 6; ii++) - DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"%x \n", *(pbyBSSID+ii)); - DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"\n"); - - // get pairwise key - if(KeybGetTransmitKey(&(pDevice->sKey), pbyBSSID, PAIRWISE_KEY, &pTransmitKey) == true) - break; - } - // get group key - pbyBSSID = pDevice->abyBroadcastAddr; - if(KeybGetTransmitKey(&(pDevice->sKey), pbyBSSID, GROUP_KEY, &pTransmitKey) == false) { - pTransmitKey = NULL; - if (pMgmt->eCurrMode == WMAC_MODE_IBSS_STA) { - DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"IBSS and KEY is NULL. [%d]\n", pMgmt->eCurrMode); - } - else - DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"NOT IBSS and KEY is NULL. [%d]\n", pMgmt->eCurrMode); - } else { - bTKIP_UseGTK = true; - DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG"Get GTK.\n"); - } - } while(false); - } - - byPktType = (u8)pDevice->byPacketType; - - if (pDevice->bFixRate) { - if (pDevice->byBBType == BB_TYPE_11B) { - if (pDevice->uConnectionRate >= RATE_11M) { - pDevice->wCurrentRate = RATE_11M; - } else { - pDevice->wCurrentRate = (u16)pDevice->uConnectionRate; - } - } else { - if ((pDevice->byBBType == BB_TYPE_11A) && - (pDevice->uConnectionRate <= RATE_6M)) { - pDevice->wCurrentRate = RATE_6M; - } else { - if (pDevice->uConnectionRate >= RATE_54M) - pDevice->wCurrentRate = RATE_54M; - else - pDevice->wCurrentRate = (u16)pDevice->uConnectionRate; - } - } - } - else { - if (pDevice->op_mode == NL80211_IFTYPE_ADHOC) { - // Adhoc Tx rate decided from node DB - if (is_multicast_ether_addr(pDevice->sTxEthHeader.h_dest)) { - // Multicast use highest data rate - pDevice->wCurrentRate = pMgmt->sNodeDBTable[0].wTxDataRate; - // preamble type - pDevice->byPreambleType = pDevice->byShortPreamble; - } - else { - if (BSSbIsSTAInNodeDB(pDevice, &(pDevice->sTxEthHeader.h_dest[0]), &uNodeIndex)) { - pDevice->wCurrentRate = pMgmt->sNodeDBTable[uNodeIndex].wTxDataRate; - if (pMgmt->sNodeDBTable[uNodeIndex].bShortPreamble) { - pDevice->byPreambleType = pDevice->byShortPreamble; - - } - else { - pDevice->byPreambleType = PREAMBLE_LONG; - } - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Found Node Index is [%d] Tx Data Rate:[%d]\n",uNodeIndex, pDevice->wCurrentRate); - } - else { - if (pDevice->byBBType != BB_TYPE_11A) - pDevice->wCurrentRate = RATE_2M; - else - pDevice->wCurrentRate = RATE_24M; // refer to vMgrCreateOwnIBSS()'s - // abyCurrExtSuppRates[] - pDevice->byPreambleType = PREAMBLE_SHORT; - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Not Found Node use highest basic Rate.....\n"); - } - } - } - if (pDevice->op_mode == NL80211_IFTYPE_STATION) { - // Infra STA rate decided from AP Node, index = 0 - pDevice->wCurrentRate = pMgmt->sNodeDBTable[0].wTxDataRate; - } - } - - if (pDevice->sTxEthHeader.h_proto == cpu_to_be16(ETH_P_PAE)) { - if (pDevice->byBBType != BB_TYPE_11A) { - pDevice->wCurrentRate = RATE_1M; - pDevice->byTopCCKBasicRate = RATE_1M; - pDevice->byTopOFDMBasicRate = RATE_6M; - } else { - pDevice->wCurrentRate = RATE_6M; - pDevice->byTopCCKBasicRate = RATE_1M; - pDevice->byTopOFDMBasicRate = RATE_6M; - } - } - - DBG_PRT(MSG_LEVEL_DEBUG, - KERN_INFO "dma_tx: pDevice->wCurrentRate = %d\n", - pDevice->wCurrentRate); - - if (wKeepRate != pDevice->wCurrentRate) { - bScheduleCommand((void *) pDevice, WLAN_CMD_SETPOWER, NULL); - } - - if (pDevice->wCurrentRate <= RATE_11M) { - byPktType = PK_TYPE_11B; - } - - if (bNeedEncryption == true) { - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"ntohs Pkt Type=%04x\n", ntohs(pDevice->sTxEthHeader.h_proto)); - if ((pDevice->sTxEthHeader.h_proto) == cpu_to_be16(ETH_P_PAE)) { - bNeedEncryption = false; - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Pkt Type=%04x\n", (pDevice->sTxEthHeader.h_proto)); - if ((pMgmt->eCurrMode == WMAC_MODE_ESS_STA) && (pMgmt->eCurrState == WMAC_STATE_ASSOC)) { - if (pTransmitKey == NULL) { - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Don't Find TX KEY\n"); - } - else { - if (bTKIP_UseGTK == true) { - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"error: KEY is GTK!!~~\n"); - } - else { - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Find PTK [%X]\n", - pTransmitKey->dwKeyIndex); - bNeedEncryption = true; - } - } - } - } - else { - - if (pTransmitKey == NULL) { - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"return no tx key\n"); - dev_kfree_skb_irq(skb); - pStats->tx_dropped++; - return STATUS_FAILURE; - } - } - } - - pContext = s_vGetFreeContext(pDevice); - if (!pContext) { - DBG_PRT(MSG_LEVEL_DEBUG, KERN_DEBUG" pContext == NULL\n"); - dev_kfree_skb_irq(skb); - return STATUS_RESOURCES; - } - pTX_Buffer = (struct vnt_tx_buffer *)&pContext->data[0]; +int vnt_beacon_make(struct vnt_private *priv, struct ieee80211_vif *vif) +{ + struct sk_buff *beacon; - fConvertedPacket = s_bPacketToWirelessUsb(pDevice, byPktType, - pTX_Buffer, bNeedEncryption, - skb->len, &pDevice->sTxEthHeader, - (u8 *)skb->data, pTransmitKey, uNodeIndex, - pDevice->wCurrentRate, - &uHeaderLen, &BytesToWrite - ); + beacon = ieee80211_beacon_get(priv->hw, vif); + if (!beacon) + return -ENOMEM; - if (fConvertedPacket == false) { - pContext->in_use = false; - dev_kfree_skb_irq(skb); - return STATUS_FAILURE; + if (vnt_beacon_xmit(priv, beacon)) { + ieee80211_free_txskb(priv->hw, beacon); + return -ENODEV; } - if ( pDevice->bEnablePSMode == true ) { - if ( !pDevice->bPSModeTxBurst ) { - bScheduleCommand((void *) pDevice, - WLAN_CMD_MAC_DISPOWERSAVING, - NULL); - pDevice->bPSModeTxBurst = true; - } - } + return 0; +} - pTX_Buffer->byPKTNO = (u8) (((pDevice->wCurrentRate<<4) &0x00F0) | ((pDevice->wSeqCounter - 1) & 0x000F)); - pTX_Buffer->tx_byte_count = cpu_to_le16((u16)BytesToWrite); +int vnt_beacon_enable(struct vnt_private *priv, struct ieee80211_vif *vif, + struct ieee80211_bss_conf *conf) +{ + int ret; - pContext->skb = skb; - pContext->type = CONTEXT_DATA_PACKET; - pContext->buf_len = (u16)BytesToWrite + 4 ; /* USB header */ + vnt_mac_reg_bits_off(priv, MAC_REG_TCR, TCR_AUTOBCNTX); - s_vSaveTxPktInfo(pDevice, (u8)(pTX_Buffer->byPKTNO & 0x0F), - &pDevice->sTxEthHeader.h_dest[0], - (u16)(BytesToWrite-uHeaderLen), - pTX_Buffer->fifo_head.wFIFOCtl); + vnt_mac_reg_bits_off(priv, MAC_REG_TFTCTL, TFTCTL_TSFCNTREN); - status = PIPEnsSendBulkOut(pDevice,pContext); + vnt_mac_set_beacon_interval(priv, conf->beacon_int); - if (bNeedDeAuth == true) { - u16 wReason = WLAN_MGMT_REASON_MIC_FAILURE; + vnt_clear_current_tsf(priv); - bScheduleCommand((void *) pDevice, WLAN_CMD_DEAUTH, (u8 *) &wReason); - } + vnt_mac_reg_bits_on(priv, MAC_REG_TFTCTL, TFTCTL_TSFCNTREN); - if (status != STATUS_PENDING) { - pContext->in_use = false; - dev_kfree_skb_irq(skb); - return STATUS_FAILURE; - } + vnt_reset_next_tbtt(priv, conf->beacon_int); + ret = vnt_beacon_make(priv, vif); - return 0; + return ret; } diff --git a/drivers/staging/vt6656/rxtx.h b/drivers/staging/vt6656/rxtx.h index 6db3337f1d1d..90b34ab2f6ce 100644 --- a/drivers/staging/vt6656/rxtx.h +++ b/drivers/staging/vt6656/rxtx.h @@ -33,13 +33,15 @@ #include "wcmd.h" #include "baseband.h" +#define DEFAULT_MGN_LIFETIME_RES_64us 125 /* 64us */ +#define DEFAULT_MSDU_LIFETIME_RES_64us 8000 + /* MIC HDR data header */ struct vnt_mic_hdr { u8 id; u8 tx_priority; u8 mic_addr2[6]; - __be32 tsc_47_16; - __be16 tsc_15_0; + u8 ccmp_pn[IEEE80211_CCMP_PN_LEN]; __be16 payload_len; __be16 hlen; __le16 frame_control; @@ -81,6 +83,7 @@ struct vnt_tx_datahead_g { __le16 duration_a; __le16 time_stamp_off_b; __le16 time_stamp_off_a; + struct ieee80211_hdr hdr; } __packed; struct vnt_tx_datahead_g_fb { @@ -92,12 +95,14 @@ struct vnt_tx_datahead_g_fb { __le16 duration_a_f1; __le16 time_stamp_off_b; __le16 time_stamp_off_a; + struct ieee80211_hdr hdr; } __packed; struct vnt_tx_datahead_ab { struct vnt_phy_field ab; __le16 duration; __le16 time_stamp_off; + struct ieee80211_hdr hdr; } __packed; struct vnt_tx_datahead_a_fb { @@ -106,6 +111,7 @@ struct vnt_tx_datahead_a_fb { __le16 time_stamp_off; __le16 duration_f0; __le16 duration_f1; + struct ieee80211_hdr hdr; } __packed; /* RTS buffer header */ @@ -215,23 +221,23 @@ union vnt_tx_head { }; struct vnt_tx_fifo_head { - u32 adwTxKey[4]; - u16 wFIFOCtl; + u8 tx_key[WLAN_KEY_LEN_CCMP]; + __le16 fifo_ctl; __le16 time_stamp; - u16 wFragCtl; + __le16 frag_ctl; __le16 current_rate; } __packed; struct vnt_tx_buffer { - u8 byType; - u8 byPKTNO; + u8 type; + u8 pkt_no; __le16 tx_byte_count; struct vnt_tx_fifo_head fifo_head; union vnt_tx_head tx_head; } __packed; struct vnt_tx_short_buf_head { - u16 fifo_ctl; + __le16 fifo_ctl; u16 time_stamp; struct vnt_phy_field ab; __le16 duration; @@ -239,16 +245,16 @@ struct vnt_tx_short_buf_head { } __packed; struct vnt_beacon_buffer { - u8 byType; - u8 byPKTNO; + u8 type; + u8 pkt_no; __le16 tx_byte_count; struct vnt_tx_short_buf_head short_head; - struct ieee80211_hdr hdr; + struct ieee80211_mgmt mgmt_hdr; } __packed; -void vDMA0_tx_80211(struct vnt_private *, struct sk_buff *skb); -int nsDMA_tx_packet(struct vnt_private *, struct sk_buff *skb); -CMD_STATUS csMgmt_xmit(struct vnt_private *, struct vnt_tx_mgmt *); -CMD_STATUS csBeacon_xmit(struct vnt_private *, struct vnt_tx_mgmt *); +int vnt_tx_packet(struct vnt_private *, struct sk_buff *); +int vnt_beacon_make(struct vnt_private *, struct ieee80211_vif *); +int vnt_beacon_enable(struct vnt_private *, struct ieee80211_vif *, + struct ieee80211_bss_conf *); #endif /* __RXTX_H__ */ diff --git a/drivers/staging/vt6656/tether.c b/drivers/staging/vt6656/tether.c deleted file mode 100644 index 2ef54f608cbc..000000000000 --- a/drivers/staging/vt6656/tether.c +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright (c) 2003 VIA Networking, Inc. All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - * - * - * File: tether.c - * - * Purpose: - * - * Author: Tevin Chen - * - * Date: May 21, 1996 - * - * Functions: - * ETHbIsBufferCrc32Ok - Check CRC value of the buffer if Ok or not - * - * Revision History: - * - */ - -#include "device.h" -#include "tmacro.h" -#include "tether.h" - -/* - * Description: Check CRC value of the buffer if Ok or not - * - * Parameters: - * In: - * pbyBuffer - pointer of buffer (normally is rx buffer) - * cbFrameLength - length of buffer, including CRC portion - * Out: - * none - * - * Return Value: true if ok; false if error. - * - */ -bool ETHbIsBufferCrc32Ok(u8 * pbyBuffer, unsigned int cbFrameLength) -{ - u32 n_crc = ~ether_crc_le(cbFrameLength - 4, pbyBuffer); - - if (le32_to_cpu(*((__le32 *)(pbyBuffer + cbFrameLength - 4))) != n_crc) - return false; - - return true; -} - diff --git a/drivers/staging/vt6656/tether.h b/drivers/staging/vt6656/tether.h deleted file mode 100644 index f57fcfdc24d5..000000000000 --- a/drivers/staging/vt6656/tether.h +++ /dev/null @@ -1,101 +0,0 @@ -/* - * Copyright (c) 1996, 2003 VIA Networking Technologies, Inc. - * All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - * - * File: tether.h - * - * Purpose: - * - * Author: Tevin Chen - * - * Date: Jan. 28, 1997 - * - */ - -#ifndef __TETHER_H__ -#define __TETHER_H__ - -#include <linux/if_ether.h> - -// -// constants -// -#define U_ETHER_ADDR_STR_LEN (ETH_ALEN * 2 + 1) - // Ethernet address string length -#define U_MULTI_ADDR_LEN 8 // multicast address length - -#ifdef __BIG_ENDIAN - -#define TYPE_MGMT_PROBE_RSP 0x5000 - -#define FC_TODS 0x0001 -#define FC_FROMDS 0x0002 -#define FC_MOREFRAG 0x0004 -#define FC_RETRY 0x0008 -#define FC_POWERMGT 0x0010 -#define FC_MOREDATA 0x0020 -#define FC_WEP 0x0040 -#define TYPE_802_11_ATIM 0x9000 - -#define TYPE_802_11_DATA 0x0800 -#define TYPE_802_11_CTL 0x0400 -#define TYPE_802_11_MGMT 0x0000 -#define TYPE_802_11_MASK 0x0C00 -#define TYPE_SUBTYPE_MASK 0xFC00 -#define TYPE_802_11_NODATA 0x4000 -#define TYPE_DATE_NULL 0x4800 - -#define TYPE_CTL_PSPOLL 0xa400 -#define TYPE_CTL_ACK 0xd400 - -#else //if LITTLE_ENDIAN -// -// wType field in the SEthernetHeader -// -// NOTE.... -// in network byte order, high byte is going first - -#define TYPE_MGMT_PROBE_RSP 0x0050 - -#define FC_TODS 0x0100 -#define FC_FROMDS 0x0200 -#define FC_MOREFRAG 0x0400 -#define FC_RETRY 0x0800 -#define FC_POWERMGT 0x1000 -#define FC_MOREDATA 0x2000 -#define FC_WEP 0x4000 -#define TYPE_802_11_ATIM 0x0090 - -#define TYPE_802_11_DATA 0x0008 -#define TYPE_802_11_CTL 0x0004 -#define TYPE_802_11_MGMT 0x0000 -#define TYPE_802_11_MASK 0x000C -#define TYPE_SUBTYPE_MASK 0x00FC -#define TYPE_802_11_NODATA 0x0040 -#define TYPE_DATE_NULL 0x0048 - -#define TYPE_CTL_PSPOLL 0x00a4 -#define TYPE_CTL_ACK 0x00d4 - -#endif //#ifdef __BIG_ENDIAN - -#define WEP_IV_MASK 0x00FFFFFF - -//u8 ETHbyGetHashIndexByCrc(u8 * pbyMultiAddr); -bool ETHbIsBufferCrc32Ok(u8 * pbyBuffer, unsigned int cbFrameLength); - -#endif /* __TETHER_H__ */ diff --git a/drivers/staging/vt6656/tkip.c b/drivers/staging/vt6656/tkip.c deleted file mode 100644 index 28282f345901..000000000000 --- a/drivers/staging/vt6656/tkip.c +++ /dev/null @@ -1,246 +0,0 @@ -/* - * Copyright (c) 1996, 2003 VIA Networking Technologies, Inc. - * All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - * - * - * File: tkip.c - * - * Purpose: Implement functions for 802.11i TKIP - * - * Author: Jerry Chen - * - * Date: Mar. 11, 2003 - * - * Functions: - * TKIPvMixKey - Get TKIP RC4 Key from TK,TA, and TSC - * - * Revision History: - * - */ - -#include "tmacro.h" -#include "tkip.h" - -/* The Sbox is reduced to 2 16-bit wide tables, each with 256 entries. */ -/* The 2nd table is the same as the 1st but with the upper and lower */ -/* bytes swapped. To allow an endian tolerant implementation, the byte */ -/* halves have been expressed independently here. */ -static const u8 TKIP_Sbox_Lower[256] = { - 0xA5,0x84,0x99,0x8D,0x0D,0xBD,0xB1,0x54, - 0x50,0x03,0xA9,0x7D,0x19,0x62,0xE6,0x9A, - 0x45,0x9D,0x40,0x87,0x15,0xEB,0xC9,0x0B, - 0xEC,0x67,0xFD,0xEA,0xBF,0xF7,0x96,0x5B, - 0xC2,0x1C,0xAE,0x6A,0x5A,0x41,0x02,0x4F, - 0x5C,0xF4,0x34,0x08,0x93,0x73,0x53,0x3F, - 0x0C,0x52,0x65,0x5E,0x28,0xA1,0x0F,0xB5, - 0x09,0x36,0x9B,0x3D,0x26,0x69,0xCD,0x9F, - 0x1B,0x9E,0x74,0x2E,0x2D,0xB2,0xEE,0xFB, - 0xF6,0x4D,0x61,0xCE,0x7B,0x3E,0x71,0x97, - 0xF5,0x68,0x00,0x2C,0x60,0x1F,0xC8,0xED, - 0xBE,0x46,0xD9,0x4B,0xDE,0xD4,0xE8,0x4A, - 0x6B,0x2A,0xE5,0x16,0xC5,0xD7,0x55,0x94, - 0xCF,0x10,0x06,0x81,0xF0,0x44,0xBA,0xE3, - 0xF3,0xFE,0xC0,0x8A,0xAD,0xBC,0x48,0x04, - 0xDF,0xC1,0x75,0x63,0x30,0x1A,0x0E,0x6D, - 0x4C,0x14,0x35,0x2F,0xE1,0xA2,0xCC,0x39, - 0x57,0xF2,0x82,0x47,0xAC,0xE7,0x2B,0x95, - 0xA0,0x98,0xD1,0x7F,0x66,0x7E,0xAB,0x83, - 0xCA,0x29,0xD3,0x3C,0x79,0xE2,0x1D,0x76, - 0x3B,0x56,0x4E,0x1E,0xDB,0x0A,0x6C,0xE4, - 0x5D,0x6E,0xEF,0xA6,0xA8,0xA4,0x37,0x8B, - 0x32,0x43,0x59,0xB7,0x8C,0x64,0xD2,0xE0, - 0xB4,0xFA,0x07,0x25,0xAF,0x8E,0xE9,0x18, - 0xD5,0x88,0x6F,0x72,0x24,0xF1,0xC7,0x51, - 0x23,0x7C,0x9C,0x21,0xDD,0xDC,0x86,0x85, - 0x90,0x42,0xC4,0xAA,0xD8,0x05,0x01,0x12, - 0xA3,0x5F,0xF9,0xD0,0x91,0x58,0x27,0xB9, - 0x38,0x13,0xB3,0x33,0xBB,0x70,0x89,0xA7, - 0xB6,0x22,0x92,0x20,0x49,0xFF,0x78,0x7A, - 0x8F,0xF8,0x80,0x17,0xDA,0x31,0xC6,0xB8, - 0xC3,0xB0,0x77,0x11,0xCB,0xFC,0xD6,0x3A -}; - -static const u8 TKIP_Sbox_Upper[256] = { - 0xC6,0xF8,0xEE,0xF6,0xFF,0xD6,0xDE,0x91, - 0x60,0x02,0xCE,0x56,0xE7,0xB5,0x4D,0xEC, - 0x8F,0x1F,0x89,0xFA,0xEF,0xB2,0x8E,0xFB, - 0x41,0xB3,0x5F,0x45,0x23,0x53,0xE4,0x9B, - 0x75,0xE1,0x3D,0x4C,0x6C,0x7E,0xF5,0x83, - 0x68,0x51,0xD1,0xF9,0xE2,0xAB,0x62,0x2A, - 0x08,0x95,0x46,0x9D,0x30,0x37,0x0A,0x2F, - 0x0E,0x24,0x1B,0xDF,0xCD,0x4E,0x7F,0xEA, - 0x12,0x1D,0x58,0x34,0x36,0xDC,0xB4,0x5B, - 0xA4,0x76,0xB7,0x7D,0x52,0xDD,0x5E,0x13, - 0xA6,0xB9,0x00,0xC1,0x40,0xE3,0x79,0xB6, - 0xD4,0x8D,0x67,0x72,0x94,0x98,0xB0,0x85, - 0xBB,0xC5,0x4F,0xED,0x86,0x9A,0x66,0x11, - 0x8A,0xE9,0x04,0xFE,0xA0,0x78,0x25,0x4B, - 0xA2,0x5D,0x80,0x05,0x3F,0x21,0x70,0xF1, - 0x63,0x77,0xAF,0x42,0x20,0xE5,0xFD,0xBF, - 0x81,0x18,0x26,0xC3,0xBE,0x35,0x88,0x2E, - 0x93,0x55,0xFC,0x7A,0xC8,0xBA,0x32,0xE6, - 0xC0,0x19,0x9E,0xA3,0x44,0x54,0x3B,0x0B, - 0x8C,0xC7,0x6B,0x28,0xA7,0xBC,0x16,0xAD, - 0xDB,0x64,0x74,0x14,0x92,0x0C,0x48,0xB8, - 0x9F,0xBD,0x43,0xC4,0x39,0x31,0xD3,0xF2, - 0xD5,0x8B,0x6E,0xDA,0x01,0xB1,0x9C,0x49, - 0xD8,0xAC,0xF3,0xCF,0xCA,0xF4,0x47,0x10, - 0x6F,0xF0,0x4A,0x5C,0x38,0x57,0x73,0x97, - 0xCB,0xA1,0xE8,0x3E,0x96,0x61,0x0D,0x0F, - 0xE0,0x7C,0x71,0xCC,0x90,0x06,0xF7,0x1C, - 0xC2,0x6A,0xAE,0x69,0x17,0x99,0x3A,0x27, - 0xD9,0xEB,0x2B,0x22,0xD2,0xA9,0x07,0x33, - 0x2D,0x3C,0x15,0xC9,0x87,0xAA,0x50,0xA5, - 0x03,0x59,0x09,0x1A,0x65,0xD7,0x84,0xD0, - 0x82,0x29,0x5A,0x1E,0x7B,0xA8,0x6D,0x2C -}; - -//STKIPKeyManagement sTKIPKeyTable[MAX_TKIP_KEY]; - -/************************************************************/ -/* tkip_sbox() */ -/* Returns a 16 bit value from a 64K entry table. The Table */ -/* is synthesized from two 256 entry byte wide tables. */ -/************************************************************/ -static unsigned int tkip_sbox(unsigned int index) -{ - unsigned int index_low; - unsigned int index_high; - unsigned int left, right; - - index_low = (index % 256); - index_high = ((index >> 8) % 256); - - left = TKIP_Sbox_Lower[index_low] + (TKIP_Sbox_Upper[index_low] * 256); - right = TKIP_Sbox_Upper[index_high] + (TKIP_Sbox_Lower[index_high] * 256); - - return (left ^ right); -}; - -static unsigned int rotr1(unsigned int a) -{ - unsigned int b; - - if ((a & 0x01) == 0x01) { - b = (a >> 1) | 0x8000; - } else { - b = (a >> 1) & 0x7fff; - } - b = b % 65536; - return b; -} - -/* - * Description: Calculate RC4Key fom TK, TA, and TSC - * - * Parameters: - * In: - * pbyTKey - TKey - * pbyTA - TA - * dwTSC - TSC - * Out: - * pbyRC4Key - RC4Key - * - * Return Value: none - * - */ -void TKIPvMixKey( - u8 * pbyTKey, - u8 * pbyTA, - u16 wTSC15_0, - u32 dwTSC47_16, - u8 * pbyRC4Key - ) -{ - u32 p1k[5]; - u32 tsc0, tsc1, tsc2; - u32 ppk0, ppk1, ppk2, ppk3, ppk4, ppk5; - u32 pnl, pnh; - int i, j; - - pnl = (u32)wTSC15_0; - pnh = (u32)(dwTSC47_16 & 0xffffffff); - - tsc0 = (u32)((pnh >> 16) % 65536); /* msb */ - tsc1 = (u32)(pnh % 65536); - tsc2 = (u32)(pnl % 65536); /* lsb */ - - /* Phase 1, step 1 */ - p1k[0] = tsc1; - p1k[1] = tsc0; - p1k[2] = (u32)(pbyTA[0] + (pbyTA[1]*256)); - p1k[3] = (u32)(pbyTA[2] + (pbyTA[3]*256)); - p1k[4] = (u32)(pbyTA[4] + (pbyTA[5]*256)); - - /* Phase 1, step 2 */ - for (i=0; i<8; i++) { - j = 2*(i & 1); - p1k[0] = (p1k[0] + tkip_sbox((p1k[4] ^ ((256*pbyTKey[1+j]) + pbyTKey[j])) % 65536)) % 65536; - p1k[1] = (p1k[1] + tkip_sbox((p1k[0] ^ ((256*pbyTKey[5+j]) + pbyTKey[4+j])) % 65536)) % 65536; - p1k[2] = (p1k[2] + tkip_sbox((p1k[1] ^ ((256*pbyTKey[9+j]) + pbyTKey[8+j])) % 65536)) % 65536; - p1k[3] = (p1k[3] + tkip_sbox((p1k[2] ^ ((256*pbyTKey[13+j]) + pbyTKey[12+j])) % 65536)) % 65536; - p1k[4] = (p1k[4] + tkip_sbox((p1k[3] ^ (((256*pbyTKey[1+j]) + pbyTKey[j]))) % 65536)) % 65536; - p1k[4] = (p1k[4] + i) % 65536; - } - - /* Phase 2, Step 1 */ - ppk0 = p1k[0]; - ppk1 = p1k[1]; - ppk2 = p1k[2]; - ppk3 = p1k[3]; - ppk4 = p1k[4]; - ppk5 = (p1k[4] + tsc2) % 65536; - - /* Phase2, Step 2 */ - ppk0 = ppk0 + tkip_sbox((ppk5 ^ ((256*pbyTKey[1]) + pbyTKey[0])) % 65536); - ppk1 = ppk1 + tkip_sbox((ppk0 ^ ((256*pbyTKey[3]) + pbyTKey[2])) % 65536); - ppk2 = ppk2 + tkip_sbox((ppk1 ^ ((256*pbyTKey[5]) + pbyTKey[4])) % 65536); - ppk3 = ppk3 + tkip_sbox((ppk2 ^ ((256*pbyTKey[7]) + pbyTKey[6])) % 65536); - ppk4 = ppk4 + tkip_sbox((ppk3 ^ ((256*pbyTKey[9]) + pbyTKey[8])) % 65536); - ppk5 = ppk5 + tkip_sbox((ppk4 ^ ((256*pbyTKey[11]) + pbyTKey[10])) % 65536); - - ppk0 = ppk0 + rotr1(ppk5 ^ ((256*pbyTKey[13]) + pbyTKey[12])); - ppk1 = ppk1 + rotr1(ppk0 ^ ((256*pbyTKey[15]) + pbyTKey[14])); - ppk2 = ppk2 + rotr1(ppk1); - ppk3 = ppk3 + rotr1(ppk2); - ppk4 = ppk4 + rotr1(ppk3); - ppk5 = ppk5 + rotr1(ppk4); - - /* Phase 2, Step 3 */ - pbyRC4Key[0] = (tsc2 >> 8) % 256; - pbyRC4Key[1] = (((tsc2 >> 8) % 256) | 0x20) & 0x7f; - pbyRC4Key[2] = tsc2 % 256; - pbyRC4Key[3] = ((ppk5 ^ ((256*pbyTKey[1]) + pbyTKey[0])) >> 1) % 256; - - pbyRC4Key[4] = ppk0 % 256; - pbyRC4Key[5] = (ppk0 >> 8) % 256; - - pbyRC4Key[6] = ppk1 % 256; - pbyRC4Key[7] = (ppk1 >> 8) % 256; - - pbyRC4Key[8] = ppk2 % 256; - pbyRC4Key[9] = (ppk2 >> 8) % 256; - - pbyRC4Key[10] = ppk3 % 256; - pbyRC4Key[11] = (ppk3 >> 8) % 256; - - pbyRC4Key[12] = ppk4 % 256; - pbyRC4Key[13] = (ppk4 >> 8) % 256; - - pbyRC4Key[14] = ppk5 % 256; - pbyRC4Key[15] = (ppk5 >> 8) % 256; -} diff --git a/drivers/staging/vt6656/tkip.h b/drivers/staging/vt6656/tkip.h deleted file mode 100644 index 4fba7ef38266..000000000000 --- a/drivers/staging/vt6656/tkip.h +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright (c) 1996, 2003 VIA Networking Technologies, Inc. - * All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - * - * - * File: tkip.h - * - * Purpose: Implement functions for 802.11i TKIP - * - * Author: Jerry Chen - * - * Date: Mar. 11, 2003 - * - */ - -#ifndef __TKIP_H__ -#define __TKIP_H__ - -#include "tether.h" - -#define TKIP_KEY_LEN 16 - -void TKIPvMixKey( - u8 * pbyTKey, - u8 * pbyTA, - u16 wTSC15_0, - u32 dwTSC47_16, - u8 * pbyRC4Key - ); - -#endif /* __TKIP_H__ */ diff --git a/drivers/staging/vt6656/tmacro.h b/drivers/staging/vt6656/tmacro.h deleted file mode 100644 index 15e724e4d4ba..000000000000 --- a/drivers/staging/vt6656/tmacro.h +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright (c) 1996, 2003 VIA Networking Technologies, Inc. - * All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - * - * File: tmacro.h - * - * Purpose: define basic common types and macros - * - * Author: Tevin Chen - * - * Date: May 21, 1996 - * - */ - -#ifndef __TMACRO_H__ -#define __TMACRO_H__ - -/****** Common helper macros ***********************************************/ - -#if !defined(LOBYTE) -#define LOBYTE(w) ((u8)(w)) -#endif -#if !defined(HIBYTE) -#define HIBYTE(w) ((u8)(((u16)(w) >> 8) & 0xFF)) -#endif - -#if !defined(LOWORD) -#define LOWORD(d) ((u16)(d)) -#endif -#if !defined(HIWORD) -#define HIWORD(d) ((u16)((((u32)(d)) >> 16) & 0xFFFF)) -#endif - -#if !defined(MAKEWORD) -#define MAKEWORD(lb, hb) ((u16)(((u8)(lb)) | (((u16)((u8)(hb))) << 8))) -#endif - -#endif /* __TMACRO_H__ */ diff --git a/drivers/staging/vt6656/usbpipe.c b/drivers/staging/vt6656/usbpipe.c index e4751b71e4d3..cba653292996 100644 --- a/drivers/staging/vt6656/usbpipe.c +++ b/drivers/staging/vt6656/usbpipe.c @@ -30,7 +30,6 @@ * vnt_control_in - Read variable length bytes from MEM/BB/MAC/EEPROM * vnt_control_out_u8 - Write one byte to MEM/BB/MAC/EEPROM * vnt_control_in_u8 - Read one byte from MEM/BB/MAC/EEPROM - * ControlvMaskByte - Read one byte from MEM/BB/MAC/EEPROM and clear/set some bits in the same address * * Revision History: * 04-05-2004 Jerry Chen: Initial release @@ -45,28 +44,14 @@ #include "device.h" #include "usbpipe.h" -//endpoint def -//endpoint 0: control -//endpoint 1: interrupt -//endpoint 2: read bulk -//endpoint 3: write bulk - -#define USB_CTL_WAIT 500 //ms - -#ifndef URB_ASYNC_UNLINK -#define URB_ASYNC_UNLINK 0 -#endif - -static void s_nsInterruptUsbIoCompleteRead(struct urb *urb); -static void s_nsBulkInUsbIoCompleteRead(struct urb *urb); -static void s_nsBulkOutIoCompleteWrite(struct urb *urb); +#define USB_CTL_WAIT 500 /* ms */ int vnt_control_out(struct vnt_private *priv, u8 request, u16 value, u16 index, u16 length, u8 *buffer) { int status = 0; - if (priv->Flags & fMP_DISCONNECTED) + if (test_bit(DEVICE_FLAGS_DISCONNECTED, &priv->flags)) return STATUS_FAILURE; mutex_lock(&priv->usb_lock); @@ -94,7 +79,7 @@ int vnt_control_in(struct vnt_private *priv, u8 request, u16 value, { int status; - if (priv->Flags & fMP_DISCONNECTED) + if (test_bit(DEVICE_FLAGS_DISCONNECTED, &priv->flags)) return STATUS_FAILURE; mutex_lock(&priv->usb_lock); @@ -117,63 +102,7 @@ void vnt_control_in_u8(struct vnt_private *priv, u8 reg, u8 reg_off, u8 *data) reg_off, reg, sizeof(u8), data); } -/* - * Description: - * Allocates an usb interrupt in irp and calls USBD. - * - * Parameters: - * In: - * pDevice - Pointer to the adapter - * Out: - * none - * - * Return Value: STATUS_INSUFFICIENT_RESOURCES or result of IoCallDriver - * - */ - -int PIPEnsInterruptRead(struct vnt_private *priv) -{ - int status = STATUS_FAILURE; - - if (priv->int_buf.in_use == true) - return STATUS_FAILURE; - - priv->int_buf.in_use = true; - - usb_fill_int_urb(priv->pInterruptURB, - priv->usb, - usb_rcvintpipe(priv->usb, 1), - priv->int_buf.data_buf, - MAX_INTERRUPT_SIZE, - s_nsInterruptUsbIoCompleteRead, - priv, - priv->int_interval); - - status = usb_submit_urb(priv->pInterruptURB, GFP_ATOMIC); - if (status) { - dev_dbg(&priv->usb->dev, "Submit int URB failed %d\n", status); - priv->int_buf.in_use = false; - } - - return status; -} - -/* - * Description: - * Complete function of usb interrupt in irp. - * - * Parameters: - * In: - * pDevice - Pointer to the adapter - * - * Out: - * none - * - * Return Value: STATUS_INSUFFICIENT_RESOURCES or result of IoCallDriver - * - */ - -static void s_nsInterruptUsbIoCompleteRead(struct urb *urb) +static void vnt_start_interrupt_urb_complete(struct urb *urb) { struct vnt_private *priv = urb->context; int status; @@ -198,88 +127,49 @@ static void s_nsInterruptUsbIoCompleteRead(struct urb *urb) dev_dbg(&priv->usb->dev, "%s status = %d\n", __func__, status); } else { - INTnsProcessData(priv); + vnt_int_process_data(priv); } - status = usb_submit_urb(priv->pInterruptURB, GFP_ATOMIC); + status = usb_submit_urb(priv->interrupt_urb, GFP_ATOMIC); if (status) { dev_dbg(&priv->usb->dev, "Submit int URB failed %d\n", status); } else { priv->int_buf.in_use = true; } - - return; } -/* - * Description: - * Allocates an usb BulkIn irp and calls USBD. - * - * Parameters: - * In: - * pDevice - Pointer to the adapter - * Out: - * none - * - * Return Value: STATUS_INSUFFICIENT_RESOURCES or result of IoCallDriver - * - */ - -int PIPEnsBulkInUsbRead(struct vnt_private *priv, struct vnt_rcb *rcb) +int vnt_start_interrupt_urb(struct vnt_private *priv) { - int status = 0; - struct urb *urb; + int status = STATUS_FAILURE; - if (priv->Flags & fMP_DISCONNECTED) + if (priv->int_buf.in_use == true) return STATUS_FAILURE; - urb = rcb->pUrb; - if (rcb->skb == NULL) { - dev_dbg(&priv->usb->dev, "rcb->skb is null\n"); - return status; - } + priv->int_buf.in_use = true; - usb_fill_bulk_urb(urb, - priv->usb, - usb_rcvbulkpipe(priv->usb, 2), - (void *) (rcb->skb->data), - MAX_TOTAL_SIZE_WITH_ALL_HEADERS, - s_nsBulkInUsbIoCompleteRead, - rcb); + usb_fill_int_urb(priv->interrupt_urb, + priv->usb, + usb_rcvintpipe(priv->usb, 1), + priv->int_buf.data_buf, + MAX_INTERRUPT_SIZE, + vnt_start_interrupt_urb_complete, + priv, + priv->int_interval); - status = usb_submit_urb(urb, GFP_ATOMIC); - if (status != 0) { - dev_dbg(&priv->usb->dev, "Submit Rx URB failed %d\n", status); - return STATUS_FAILURE ; + status = usb_submit_urb(priv->interrupt_urb, GFP_ATOMIC); + if (status) { + dev_dbg(&priv->usb->dev, "Submit int URB failed %d\n", status); + priv->int_buf.in_use = false; } - rcb->Ref = 1; - rcb->bBoolInUse = true; - return status; } -/* - * Description: - * Complete function of usb BulkIn irp. - * - * Parameters: - * In: - * pDevice - Pointer to the adapter - * - * Out: - * none - * - * Return Value: STATUS_INSUFFICIENT_RESOURCES or result of IoCallDriver - * - */ - -static void s_nsBulkInUsbIoCompleteRead(struct urb *urb) +static void vnt_submit_rx_urb_complete(struct urb *urb) { struct vnt_rcb *rcb = urb->context; - struct vnt_private *priv = rcb->pDevice; + struct vnt_private *priv = rcb->priv; unsigned long flags; - int re_alloc_skb = false; switch (urb->status) { case 0: @@ -297,108 +187,68 @@ static void s_nsBulkInUsbIoCompleteRead(struct urb *urb) if (urb->actual_length) { spin_lock_irqsave(&priv->lock, flags); - if (RXbBulkInProcessData(priv, rcb, urb->actual_length) == true) - re_alloc_skb = true; + if (vnt_rx_data(priv, rcb, urb->actual_length)) { + rcb->skb = dev_alloc_skb(priv->rx_buf_sz); + if (!rcb->skb) { + dev_dbg(&priv->usb->dev, + "Failed to re-alloc rx skb\n"); + + rcb->in_use = false; + spin_unlock_irqrestore(&priv->lock, flags); + return; + } + } else { + skb_push(rcb->skb, skb_headroom(rcb->skb)); + skb_trim(rcb->skb, 0); + } + + urb->transfer_buffer = skb_put(rcb->skb, + skb_tailroom(rcb->skb)); spin_unlock_irqrestore(&priv->lock, flags); } - rcb->Ref--; - if (rcb->Ref == 0) { - dev_dbg(&priv->usb->dev, - "RxvFreeNormal %d\n", priv->NumRecvFreeList); + if (usb_submit_urb(urb, GFP_ATOMIC)) { + dev_dbg(&priv->usb->dev, "Failed to re submit rx skb\n"); - spin_lock_irqsave(&priv->lock, flags); - - RXvFreeRCB(rcb, re_alloc_skb); - - spin_unlock_irqrestore(&priv->lock, flags); + rcb->in_use = false; } - - return; } -/* - * Description: - * Allocates an usb BulkOut irp and calls USBD. - * - * Parameters: - * In: - * pDevice - Pointer to the adapter - * Out: - * none - * - * Return Value: STATUS_INSUFFICIENT_RESOURCES or result of IoCallDriver - * - */ - -int PIPEnsSendBulkOut(struct vnt_private *priv, - struct vnt_usb_send_context *context) +int vnt_submit_rx_urb(struct vnt_private *priv, struct vnt_rcb *rcb) { - int status; + int status = 0; struct urb *urb; - priv->bPWBitOn = false; - - if (!(MP_IS_READY(priv) && priv->Flags & fMP_POST_WRITES)) { - context->in_use = false; - return STATUS_RESOURCES; + urb = rcb->urb; + if (rcb->skb == NULL) { + dev_dbg(&priv->usb->dev, "rcb->skb is null\n"); + return status; } - urb = context->urb; - usb_fill_bulk_urb(urb, - priv->usb, - usb_sndbulkpipe(priv->usb, 3), - context->data, - context->buf_len, - s_nsBulkOutIoCompleteWrite, - context); + priv->usb, + usb_rcvbulkpipe(priv->usb, 2), + skb_put(rcb->skb, skb_tailroom(rcb->skb)), + MAX_TOTAL_SIZE_WITH_ALL_HEADERS, + vnt_submit_rx_urb_complete, + rcb); status = usb_submit_urb(urb, GFP_ATOMIC); if (status != 0) { - dev_dbg(&priv->usb->dev, "Submit Tx URB failed %d\n", status); - - context->in_use = false; + dev_dbg(&priv->usb->dev, "Submit Rx URB failed %d\n", status); return STATUS_FAILURE; } - return STATUS_PENDING; -} + rcb->in_use = true; -/* - * Description: s_nsBulkOutIoCompleteWrite - * 1a) Indicate to the protocol the status of the write. - * 1b) Return ownership of the packet to the protocol. - * - * 2) If any more packets are queue for sending, send another packet - * to USBD. - * If the attempt to send the packet to the driver fails, - * return ownership of the packet to the protocol and - * try another packet (until one succeeds). - * - * Parameters: - * In: - * pdoUsbDevObj - pointer to the USB device object which - * completed the irp - * pIrp - the irp which was completed by the - * device object - * pContext - the context given to IoSetCompletionRoutine - * before calling IoCallDriver on the irp - * The pContext is a pointer to the USB device object. - * Out: - * none - * - * Return Value: STATUS_MORE_PROCESSING_REQUIRED - allows the completion routine - * (IofCompleteRequest) to stop working on the irp. - * - */ + return status; +} -static void s_nsBulkOutIoCompleteWrite(struct urb *urb) +static void vnt_tx_context_complete(struct urb *urb) { struct vnt_usb_send_context *context = urb->context; struct vnt_private *priv = context->priv; - u8 context_type = context->type; switch (urb->status) { case 0: @@ -415,26 +265,45 @@ static void s_nsBulkOutIoCompleteWrite(struct urb *urb) break; } - if (!netif_device_present(priv->dev)) - return; + if (context->type == CONTEXT_DATA_PACKET) + ieee80211_wake_queues(priv->hw); - if (CONTEXT_DATA_PACKET == context_type) { - if (context->skb != NULL) { - dev_kfree_skb_irq(context->skb); - context->skb = NULL; - dev_dbg(&priv->usb->dev, - "tx %d bytes\n", context->buf_len); - } + if (urb->status || context->type == CONTEXT_BEACON_PACKET) { + if (context->skb) + ieee80211_free_txskb(priv->hw, context->skb); - priv->dev->trans_start = jiffies; + context->in_use = false; } +} + +int vnt_tx_context(struct vnt_private *priv, + struct vnt_usb_send_context *context) +{ + int status; + struct urb *urb; - if (priv->bLinkPass == true) { - if (netif_queue_stopped(priv->dev)) - netif_wake_queue(priv->dev); + if (test_bit(DEVICE_FLAGS_DISCONNECTED, &priv->flags)) { + context->in_use = false; + return STATUS_RESOURCES; } - context->in_use = false; + urb = context->urb; + + usb_fill_bulk_urb(urb, + priv->usb, + usb_sndbulkpipe(priv->usb, 3), + context->data, + context->buf_len, + vnt_tx_context_complete, + context); - return; + status = usb_submit_urb(urb, GFP_ATOMIC); + if (status != 0) { + dev_dbg(&priv->usb->dev, "Submit Tx URB failed %d\n", status); + + context->in_use = false; + return STATUS_FAILURE; + } + + return STATUS_PENDING; } diff --git a/drivers/staging/vt6656/usbpipe.h b/drivers/staging/vt6656/usbpipe.h index ea71782d8901..e74aa0809928 100644 --- a/drivers/staging/vt6656/usbpipe.h +++ b/drivers/staging/vt6656/usbpipe.h @@ -38,9 +38,8 @@ int vnt_control_in(struct vnt_private *, u8, u16, u16, u16, u8 *); void vnt_control_out_u8(struct vnt_private *, u8, u8, u8); void vnt_control_in_u8(struct vnt_private *, u8, u8, u8 *); -int PIPEnsInterruptRead(struct vnt_private *); -int PIPEnsBulkInUsbRead(struct vnt_private *, struct vnt_rcb *pRCB); -int PIPEnsSendBulkOut(struct vnt_private *, - struct vnt_usb_send_context *pContext); +int vnt_start_interrupt_urb(struct vnt_private *); +int vnt_submit_rx_urb(struct vnt_private *, struct vnt_rcb *); +int vnt_tx_context(struct vnt_private *, struct vnt_usb_send_context *); #endif /* __USBPIPE_H__ */ diff --git a/drivers/staging/vt6656/vntconfiguration.dat b/drivers/staging/vt6656/vntconfiguration.dat deleted file mode 100644 index 933774c7d27f..000000000000 --- a/drivers/staging/vt6656/vntconfiguration.dat +++ /dev/null @@ -1,6 +0,0 @@ -#VNT Configuration -[start] -ZONETYPE=EUROPE -AUTHENMODE=12 -ENCRYPTIONMODE=34 -[end]
\ No newline at end of file diff --git a/drivers/staging/vt6656/wcmd.c b/drivers/staging/vt6656/wcmd.c index da72d4df6fca..3cbf4791bac1 100644 --- a/drivers/staging/vt6656/wcmd.c +++ b/drivers/staging/vt6656/wcmd.c @@ -25,1070 +25,170 @@ * Date: May 8, 2003 * * Functions: - * s_vProbeChannel - Active scan channel - * s_MgrMakeProbeRequest - Make ProbeRequest packet - * CommandTimer - Timer function to handle command - * s_bCommandComplete - Command Complete function - * bScheduleCommand - Push Command and wait Command Scheduler to do - * vCommandTimer- Command call back functions - * vCommandTimerWait- Call back timer - * s_bClearBSSID_SCAN- Clear BSSID_SCAN cmd in CMD Queue + * vnt_cmd_complete - Command Complete function + * vnt_schedule_command - Push Command and wait Command Scheduler to do + * vnt_cmd_timer_wait- Call back timer * * Revision History: * */ -#include "tmacro.h" #include "device.h" #include "mac.h" -#include "card.h" -#include "80211hdr.h" #include "wcmd.h" -#include "wmgr.h" #include "power.h" -#include "wctl.h" -#include "baseband.h" #include "usbpipe.h" #include "rxtx.h" #include "rf.h" -#include "channel.h" -#include "iowpa.h" -static int msglevel = MSG_LEVEL_INFO; -//static int msglevel = MSG_LEVEL_DEBUG; - -static void s_vProbeChannel(struct vnt_private *); - -static struct vnt_tx_mgmt *s_MgrMakeProbeRequest(struct vnt_private *, - struct vnt_manager *pMgmt, u8 *pScanBSSID, PWLAN_IE_SSID pSSID, - PWLAN_IE_SUPP_RATES pCurrRates, PWLAN_IE_SUPP_RATES pCurrExtSuppRates); - -static int s_bCommandComplete(struct vnt_private *); - -static int s_bClearBSSID_SCAN(struct vnt_private *); - -/* - * Description: - * Stop AdHoc beacon during scan process - * - * Parameters: - * In: - * pDevice - Pointer to the adapter - * Out: - * none - * - * Return Value: none - * - */ - -static void vAdHocBeaconStop(struct vnt_private *pDevice) +static void vnt_cmd_timer_wait(struct vnt_private *priv, unsigned long msecs) { - struct vnt_manager *pMgmt = &pDevice->vnt_mgmt; - int bStop; - - /* - * temporarily stop Beacon packet for AdHoc Server - * if all of the following coditions are met: - * (1) STA is in AdHoc mode - * (2) VT3253 is programmed as automatic Beacon Transmitting - * (3) One of the following conditions is met - * (3.1) AdHoc channel is in B/G band and the - * current scan channel is in A band - * or - * (3.2) AdHoc channel is in A mode - */ - bStop = false; - if ((pMgmt->eCurrMode == WMAC_MODE_IBSS_STA) && - (pMgmt->eCurrState >= WMAC_STATE_STARTED)) { - if ((pMgmt->uIBSSChannel <= CB_MAX_CHANNEL_24G) && - (pMgmt->uScanChannel > CB_MAX_CHANNEL_24G)) { - bStop = true; - } - if (pMgmt->uIBSSChannel > CB_MAX_CHANNEL_24G) - bStop = true; - } - - if (bStop) { - //PMESG(("STOP_BEACON: IBSSChannel = %u, ScanChannel = %u\n", - // pMgmt->uIBSSChannel, pMgmt->uScanChannel)); - MACvRegBitsOff(pDevice, MAC_REG_TCR, TCR_AUTOBCNTX); - } - -} /* vAdHocBeaconStop */ + schedule_delayed_work(&priv->run_command_work, msecs_to_jiffies(msecs)); +} -/* - * Description: - * Restart AdHoc beacon after scan process complete - * - * Parameters: - * In: - * pDevice - Pointer to the adapter - * Out: - * none - * - * Return Value: none - * - */ -static void vAdHocBeaconRestart(struct vnt_private *pDevice) +static int vnt_cmd_complete(struct vnt_private *priv) { - struct vnt_manager *pMgmt = &pDevice->vnt_mgmt; - /* - * Restart Beacon packet for AdHoc Server - * if all of the following coditions are met: - * (1) STA is in AdHoc mode - * (2) VT3253 is programmed as automatic Beacon Transmitting - */ - if ((pMgmt->eCurrMode == WMAC_MODE_IBSS_STA) && - (pMgmt->eCurrState >= WMAC_STATE_STARTED)) { - //PMESG(("RESTART_BEACON\n")); - MACvRegBitsOn(pDevice, MAC_REG_TCR, TCR_AUTOBCNTX); + priv->command_state = WLAN_CMD_IDLE; + if (priv->free_cmd_queue == CMD_Q_SIZE) { + /* Command Queue Empty */ + priv->cmd_running = false; + return true; } -} - -/*+ - * - * Routine Description: - * Prepare and send probe request management frames. - * - * - * Return Value: - * none. - * --*/ - -static void s_vProbeChannel(struct vnt_private *pDevice) -{ - struct vnt_manager *pMgmt = &pDevice->vnt_mgmt; - struct vnt_tx_mgmt *pTxPacket; - u8 abyCurrSuppRatesG[] = {WLAN_EID_SUPP_RATES, - 8, 0x02, 0x04, 0x0B, 0x16, 0x24, 0x30, 0x48, 0x6C}; - /* 1M, 2M, 5M, 11M, 18M, 24M, 36M, 54M*/ - u8 abyCurrExtSuppRatesG[] = {WLAN_EID_EXTSUPP_RATES, - 4, 0x0C, 0x12, 0x18, 0x60}; - /* 6M, 9M, 12M, 48M*/ - u8 abyCurrSuppRatesA[] = {WLAN_EID_SUPP_RATES, - 8, 0x0C, 0x12, 0x18, 0x24, 0x30, 0x48, 0x60, 0x6C}; - u8 abyCurrSuppRatesB[] = {WLAN_EID_SUPP_RATES, - 4, 0x02, 0x04, 0x0B, 0x16}; - u8 *pbyRate; - int ii; + priv->command = priv->cmd_queue[priv->cmd_dequeue_idx]; - if (pDevice->byBBType == BB_TYPE_11A) - pbyRate = &abyCurrSuppRatesA[0]; - else if (pDevice->byBBType == BB_TYPE_11B) - pbyRate = &abyCurrSuppRatesB[0]; - else - pbyRate = &abyCurrSuppRatesG[0]; + ADD_ONE_WITH_WRAP_AROUND(priv->cmd_dequeue_idx, CMD_Q_SIZE); + priv->free_cmd_queue++; + priv->cmd_running = true; - // build an assocreq frame and send it - pTxPacket = s_MgrMakeProbeRequest - ( - pDevice, - pMgmt, - pMgmt->abyScanBSSID, - (PWLAN_IE_SSID)pMgmt->abyScanSSID, - (PWLAN_IE_SUPP_RATES)pbyRate, - (PWLAN_IE_SUPP_RATES)abyCurrExtSuppRatesG - ); + switch (priv->command) { + case WLAN_CMD_INIT_MAC80211: + priv->command_state = WLAN_CMD_INIT_MAC80211_START; + break; - if (pTxPacket != NULL) { - for (ii = 0; ii < 1; ii++) { - if (csMgmt_xmit(pDevice, pTxPacket) != CMD_STATUS_PENDING) { - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Probe request sending fail..\n"); - } else { - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Probe request is sending..\n"); - } - } - } + case WLAN_CMD_TBTT_WAKEUP: + priv->command_state = WLAN_CMD_TBTT_WAKEUP_START; + break; -} + case WLAN_CMD_BECON_SEND: + priv->command_state = WLAN_CMD_BECON_SEND_START; + break; -/*+ - * - * Routine Description: - * Constructs an probe request frame - * - * - * Return Value: - * A ptr to Tx frame or NULL on allocation failure - * --*/ + case WLAN_CMD_SETPOWER: + priv->command_state = WLAN_CMD_SETPOWER_START; + break; -static struct vnt_tx_mgmt *s_MgrMakeProbeRequest(struct vnt_private *pDevice, - struct vnt_manager *pMgmt, u8 *pScanBSSID, PWLAN_IE_SSID pSSID, - PWLAN_IE_SUPP_RATES pCurrRates, PWLAN_IE_SUPP_RATES pCurrExtSuppRates) -{ - struct vnt_tx_mgmt *pTxPacket = NULL; - WLAN_FR_PROBEREQ sFrame; + case WLAN_CMD_CHANGE_ANTENNA: + priv->command_state = WLAN_CMD_CHANGE_ANTENNA_START; + break; - pTxPacket = (struct vnt_tx_mgmt *)pMgmt->pbyMgmtPacketPool; - memset(pTxPacket, 0, sizeof(struct vnt_tx_mgmt) - + WLAN_PROBEREQ_FR_MAXLEN); - pTxPacket->p80211Header = (PUWLAN_80211HDR)((u8 *)pTxPacket - + sizeof(struct vnt_tx_mgmt)); - sFrame.pBuf = (u8 *)pTxPacket->p80211Header; - sFrame.len = WLAN_PROBEREQ_FR_MAXLEN; - vMgrEncodeProbeRequest(&sFrame); - sFrame.pHdr->sA3.wFrameCtl = cpu_to_le16( - ( - WLAN_SET_FC_FTYPE(WLAN_TYPE_MGR) | - WLAN_SET_FC_FSTYPE(WLAN_FSTYPE_PROBEREQ) - )); - memcpy(sFrame.pHdr->sA3.abyAddr1, pScanBSSID, WLAN_ADDR_LEN); - memcpy(sFrame.pHdr->sA3.abyAddr2, pMgmt->abyMACAddr, WLAN_ADDR_LEN); - memcpy(sFrame.pHdr->sA3.abyAddr3, pScanBSSID, WLAN_BSSID_LEN); - // Copy the SSID, pSSID->len=0 indicate broadcast SSID - sFrame.pSSID = (PWLAN_IE_SSID)(sFrame.pBuf + sFrame.len); - sFrame.len += pSSID->len + WLAN_IEHDR_LEN; - memcpy(sFrame.pSSID, pSSID, pSSID->len + WLAN_IEHDR_LEN); - sFrame.pSuppRates = (PWLAN_IE_SUPP_RATES)(sFrame.pBuf + sFrame.len); - sFrame.len += pCurrRates->len + WLAN_IEHDR_LEN; - memcpy(sFrame.pSuppRates, pCurrRates, pCurrRates->len + WLAN_IEHDR_LEN); - // Copy the extension rate set - if (pDevice->byBBType == BB_TYPE_11G) { - sFrame.pExtSuppRates = (PWLAN_IE_SUPP_RATES)(sFrame.pBuf + sFrame.len); - sFrame.len += pCurrExtSuppRates->len + WLAN_IEHDR_LEN; - memcpy(sFrame.pExtSuppRates, pCurrExtSuppRates, pCurrExtSuppRates->len + WLAN_IEHDR_LEN); + default: + break; } - pTxPacket->cbMPDULen = sFrame.len; - pTxPacket->cbPayloadLen = sFrame.len - WLAN_HDR_ADDR3_LEN; - return pTxPacket; -} + vnt_cmd_timer_wait(priv, 0); -static void -vCommandTimerWait(struct vnt_private *pDevice, unsigned long MSecond) -{ - schedule_delayed_work(&pDevice->run_command_work, - msecs_to_jiffies(MSecond)); + return true; } -void vRunCommand(struct work_struct *work) +void vnt_run_command(struct work_struct *work) { - struct vnt_private *pDevice = + struct vnt_private *priv = container_of(work, struct vnt_private, run_command_work.work); - struct vnt_manager *pMgmt = &pDevice->vnt_mgmt; - PWLAN_IE_SSID pItemSSID; - PWLAN_IE_SSID pItemSSIDCurr; - CMD_STATUS Status; - struct sk_buff *skb; - union iwreq_data wrqu; - int ii; - u8 byMask[8] = {1, 2, 4, 8, 0x10, 0x20, 0x40, 0x80}; - u8 byData; - unsigned long flags; - if (pDevice->Flags & fMP_DISCONNECTED) + if (test_bit(DEVICE_FLAGS_DISCONNECTED, &priv->flags)) return; - if (pDevice->bCmdRunning != true) + if (priv->cmd_running != true) return; - switch (pDevice->eCommandState) { - - case WLAN_CMD_SCAN_START: - - pDevice->byReAssocCount = 0; - if (pDevice->bRadioOff == true) + switch (priv->command_state) { + case WLAN_CMD_INIT_MAC80211_START: + if (priv->mac_hw) break; - if (pMgmt->eCurrMode == WMAC_MODE_ESS_AP) - break; + dev_info(&priv->usb->dev, "Starting mac80211\n"); - pItemSSID = (PWLAN_IE_SSID)pMgmt->abyScanSSID; - - if (pMgmt->uScanChannel == 0) - pMgmt->uScanChannel = pDevice->byMinChannel; - if (pMgmt->uScanChannel > pDevice->byMaxChannel) { - pDevice->eCommandState = WLAN_CMD_SCAN_END; - break; - } else { - if (!ChannelValid(pDevice->byZoneType, pMgmt->uScanChannel)) { - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Invalid channel pMgmt->uScanChannel = %d\n", pMgmt->uScanChannel); - pMgmt->uScanChannel++; - break; - } - if (pMgmt->uScanChannel == pDevice->byMinChannel) { - // pMgmt->eScanType = WMAC_SCAN_ACTIVE; //mike mark - pMgmt->abyScanBSSID[0] = 0xFF; - pMgmt->abyScanBSSID[1] = 0xFF; - pMgmt->abyScanBSSID[2] = 0xFF; - pMgmt->abyScanBSSID[3] = 0xFF; - pMgmt->abyScanBSSID[4] = 0xFF; - pMgmt->abyScanBSSID[5] = 0xFF; - pItemSSID->byElementID = WLAN_EID_SSID; - // clear bssid list - /* BSSvClearBSSList((void *) pDevice, pDevice->bLinkPass); */ - pMgmt->eScanState = WMAC_IS_SCANNING; - pDevice->byScanBBType = pDevice->byBBType; //lucas - pDevice->bStopDataPkt = true; - // Turn off RCR_BSSID filter every time - MACvRegBitsOff(pDevice, MAC_REG_RCR, RCR_BSSID); - pDevice->byRxMode &= ~RCR_BSSID; - } - //lucas - vAdHocBeaconStop(pDevice); - if ((pDevice->byBBType != BB_TYPE_11A) && - (pMgmt->uScanChannel > CB_MAX_CHANNEL_24G)) { - pDevice->byBBType = BB_TYPE_11A; - CARDvSetBSSMode(pDevice); - } else if ((pDevice->byBBType == BB_TYPE_11A) && - (pMgmt->uScanChannel <= CB_MAX_CHANNEL_24G)) { - pDevice->byBBType = BB_TYPE_11G; - CARDvSetBSSMode(pDevice); - } - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Scanning.... channel: [%d]\n", pMgmt->uScanChannel); - // Set channel - CARDbSetMediaChannel(pDevice, pMgmt->uScanChannel); - // Set Baseband to be more sensitive. - - BBvSetShortSlotTime(pDevice); - BBvSetVGAGainOffset(pDevice, pDevice->abyBBVGA[0]); - BBvUpdatePreEDThreshold(pDevice, true); - - pMgmt->uScanChannel++; - - while (!ChannelValid(pDevice->byZoneType, pMgmt->uScanChannel) && - pMgmt->uScanChannel <= pDevice->byMaxChannel){ - pMgmt->uScanChannel++; - } - - if (pMgmt->uScanChannel > pDevice->byMaxChannel) { - // Set Baseband to be not sensitive and rescan - pDevice->eCommandState = WLAN_CMD_SCAN_END; - } - if ((pMgmt->b11hEnable == false) || - (pMgmt->uScanChannel < CB_MAX_CHANNEL_24G)) { - s_vProbeChannel(pDevice); - vCommandTimerWait((void *) pDevice, 100); - return; - } else { - vCommandTimerWait((void *) pDevice, WCMD_PASSIVE_SCAN_TIME); - return; - } - } - - break; - - case WLAN_CMD_SCAN_END: - - // Set Baseband's sensitivity back. - if (pDevice->byBBType != pDevice->byScanBBType) { - pDevice->byBBType = pDevice->byScanBBType; - CARDvSetBSSMode(pDevice); - } - - BBvSetShortSlotTime(pDevice); - BBvSetVGAGainOffset(pDevice, pDevice->byBBVGACurrent); - BBvUpdatePreEDThreshold(pDevice, false); - - // Set channel back - vAdHocBeaconRestart(pDevice); - // Set channel back - CARDbSetMediaChannel(pDevice, pMgmt->uCurrChannel); - // Set Filter - if (pMgmt->bCurrBSSIDFilterOn) { - MACvRegBitsOn(pDevice, MAC_REG_RCR, RCR_BSSID); - pDevice->byRxMode |= RCR_BSSID; - } - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Scanning, set back to channel: [%d]\n", pMgmt->uCurrChannel); - pMgmt->uScanChannel = 0; - pMgmt->eScanState = WMAC_NO_SCANNING; - pDevice->bStopDataPkt = false; - - /*send scan event to wpa_Supplicant*/ - PRINT_K("wireless_send_event--->SIOCGIWSCAN(scan done)\n"); - memset(&wrqu, 0, sizeof(wrqu)); - wireless_send_event(pDevice->dev, SIOCGIWSCAN, &wrqu, NULL); - - break; - - case WLAN_CMD_DISASSOCIATE_START: - pDevice->byReAssocCount = 0; - if ((pMgmt->eCurrMode == WMAC_MODE_ESS_STA) && - (pMgmt->eCurrState != WMAC_STATE_ASSOC)) { - break; - } else { - pDevice->bwextstep0 = false; - pDevice->bwextstep1 = false; - pDevice->bwextstep2 = false; - pDevice->bwextstep3 = false; - pDevice->bWPASuppWextEnabled = false; - pDevice->fWPA_Authened = false; - - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Send Disassociation Packet..\n"); - // reason = 8 : disassoc because sta has left - vMgrDisassocBeginSta((void *) pDevice, - pMgmt, - pMgmt->abyCurrBSSID, - (8), - &Status); - pDevice->bLinkPass = false; - - vnt_mac_set_led(pDevice, LEDSTS_STS, LEDSTS_SLOW); - - // unlock command busy - pItemSSID = (PWLAN_IE_SSID)pMgmt->abyCurrSSID; - pItemSSID->len = 0; - memset(pItemSSID->abySSID, 0, WLAN_SSID_MAXLEN); - pMgmt->eCurrState = WMAC_STATE_IDLE; - pMgmt->sNodeDBTable[0].bActive = false; -// pDevice->bBeaconBufReady = false; - } - netif_stop_queue(pDevice->dev); - if (pDevice->bNeedRadioOFF == true) - CARDbRadioPowerOff(pDevice); - - break; - - case WLAN_CMD_SSID_START: - - pDevice->byReAssocCount = 0; - if (pDevice->bRadioOff == true) - break; - - memcpy(pMgmt->abyAdHocSSID, pMgmt->abyDesireSSID, - ((PWLAN_IE_SSID)pMgmt->abyDesireSSID)->len + WLAN_IEHDR_LEN); - - pItemSSID = (PWLAN_IE_SSID)pMgmt->abyDesireSSID; - pItemSSIDCurr = (PWLAN_IE_SSID)pMgmt->abyCurrSSID; - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO" cmd: desire ssid = %s\n", pItemSSID->abySSID); - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO" cmd: curr ssid = %s\n", pItemSSIDCurr->abySSID); - - if (pMgmt->eCurrState == WMAC_STATE_ASSOC) { - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO" Cmd pMgmt->eCurrState == WMAC_STATE_ASSOC\n"); - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO" pItemSSID->len =%d\n", pItemSSID->len); - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO" pItemSSIDCurr->len = %d\n", pItemSSIDCurr->len); - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO" desire ssid = %s\n", pItemSSID->abySSID); - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO" curr ssid = %s\n", pItemSSIDCurr->abySSID); - } - - if ((pMgmt->eCurrState == WMAC_STATE_ASSOC) || - ((pMgmt->eCurrMode == WMAC_MODE_IBSS_STA) && (pMgmt->eCurrState == WMAC_STATE_JOINTED))) { - if (pItemSSID->len == pItemSSIDCurr->len) { - if (!memcmp(pItemSSID->abySSID, - pItemSSIDCurr->abySSID, pItemSSID->len)) - break; - } - netif_stop_queue(pDevice->dev); - pDevice->bLinkPass = false; - - vnt_mac_set_led(pDevice, LEDSTS_STS, LEDSTS_SLOW); - } - // set initial state - pMgmt->eCurrState = WMAC_STATE_IDLE; - pMgmt->eCurrMode = WMAC_MODE_STANDBY; - PSvDisablePowerSaving((void *) pDevice); - BSSvClearNodeDBTable(pDevice, 0); - vMgrJoinBSSBegin((void *) pDevice, &Status); - // if Infra mode - if ((pMgmt->eCurrMode == WMAC_MODE_ESS_STA) && (pMgmt->eCurrState == WMAC_STATE_JOINTED)) { - // Call mgr to begin the deauthentication - // reason = (3) because sta has left ESS - if (pMgmt->eCurrState >= WMAC_STATE_AUTH) { - vMgrDeAuthenBeginSta((void *)pDevice, - pMgmt, - pMgmt->abyCurrBSSID, - (3), - &Status); - } - // Call mgr to begin the authentication - vMgrAuthenBeginSta((void *) pDevice, pMgmt, &Status); - if (Status == CMD_STATUS_SUCCESS) { - pDevice->byLinkWaitCount = 0; - pDevice->eCommandState = WLAN_AUTHENTICATE_WAIT; - vCommandTimerWait((void *) pDevice, AUTHENTICATE_TIMEOUT); - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO" Set eCommandState = WLAN_AUTHENTICATE_WAIT\n"); - return; - } - } - // if Adhoc mode - else if (pMgmt->eCurrMode == WMAC_MODE_IBSS_STA) { - if (pMgmt->eCurrState == WMAC_STATE_JOINTED) { - if (netif_queue_stopped(pDevice->dev)) - netif_wake_queue(pDevice->dev); - pDevice->bLinkPass = true; - - vnt_mac_set_led(pDevice, LEDSTS_STS, LEDSTS_INTER); - - pMgmt->sNodeDBTable[0].bActive = true; - pMgmt->sNodeDBTable[0].uInActiveCount = 0; - } else { - // start own IBSS - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "CreateOwn IBSS by CurrMode = IBSS_STA\n"); - vMgrCreateOwnIBSS((void *) pDevice, &Status); - if (Status != CMD_STATUS_SUCCESS) { - DBG_PRT(MSG_LEVEL_DEBUG, - KERN_INFO "WLAN_CMD_IBSS_CREATE fail!\n"); - } - BSSvAddMulticastNode(pDevice); - } - s_bClearBSSID_SCAN(pDevice); - } - // if SSID not found - else if (pMgmt->eCurrMode == WMAC_MODE_STANDBY) { - if (pMgmt->eConfigMode == WMAC_CONFIG_IBSS_STA || - pMgmt->eConfigMode == WMAC_CONFIG_AUTO) { - // start own IBSS - DBG_PRT(MSG_LEVEL_DEBUG, - KERN_INFO "CreateOwn IBSS by CurrMode = STANDBY\n"); - vMgrCreateOwnIBSS((void *) pDevice, &Status); - if (Status != CMD_STATUS_SUCCESS) { - DBG_PRT(MSG_LEVEL_DEBUG, - KERN_INFO "WLAN_CMD_IBSS_CREATE fail!\n"); - } - BSSvAddMulticastNode(pDevice); - s_bClearBSSID_SCAN(pDevice); -/* - pDevice->bLinkPass = true; - if (netif_queue_stopped(pDevice->dev)){ - netif_wake_queue(pDevice->dev); - } - s_bClearBSSID_SCAN(pDevice); -*/ - } else { - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Disconnect SSID none\n"); - // if(pDevice->bWPASuppWextEnabled == true) - { - union iwreq_data wrqu; - memset(&wrqu, 0, sizeof(wrqu)); - wrqu.ap_addr.sa_family = ARPHRD_ETHER; - PRINT_K("wireless_send_event--->SIOCGIWAP(disassociated:vMgrJoinBSSBegin Fail !!)\n"); - wireless_send_event(pDevice->dev, SIOCGIWAP, &wrqu, NULL); - } - } - } - break; - - case WLAN_AUTHENTICATE_WAIT: - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"eCommandState == WLAN_AUTHENTICATE_WAIT\n"); - if (pMgmt->eCurrState == WMAC_STATE_AUTH) { - pDevice->byLinkWaitCount = 0; - // Call mgr to begin the association - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"eCurrState == WMAC_STATE_AUTH\n"); - vMgrAssocBeginSta((void *) pDevice, pMgmt, &Status); - if (Status == CMD_STATUS_SUCCESS) { - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"eCommandState = WLAN_ASSOCIATE_WAIT\n"); - pDevice->byLinkWaitCount = 0; - pDevice->eCommandState = WLAN_ASSOCIATE_WAIT; - vCommandTimerWait((void *) pDevice, ASSOCIATE_TIMEOUT); - return; - } - } else if (pMgmt->eCurrState < WMAC_STATE_AUTHPENDING) { - printk("WLAN_AUTHENTICATE_WAIT:Authen Fail???\n"); - } else if (pDevice->byLinkWaitCount <= 4) { - //mike add:wait another 2 sec if authenticated_frame delay! - pDevice->byLinkWaitCount++; - printk("WLAN_AUTHENTICATE_WAIT:wait %d times!!\n", pDevice->byLinkWaitCount); - vCommandTimerWait((void *) pDevice, AUTHENTICATE_TIMEOUT/2); + if (vnt_init(priv)) { + /* If fail all ends TODO retry */ + dev_err(&priv->usb->dev, "failed to start\n"); + ieee80211_free_hw(priv->hw); return; } - pDevice->byLinkWaitCount = 0; - - break; - - case WLAN_ASSOCIATE_WAIT: - if (pMgmt->eCurrState == WMAC_STATE_ASSOC) { - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"eCurrState == WMAC_STATE_ASSOC\n"); - if (pDevice->ePSMode != WMAC_POWER_CAM) { - PSvEnablePowerSaving((void *) pDevice, - pMgmt->wListenInterval); - } -/* - if (pMgmt->eAuthenMode >= WMAC_AUTH_WPA) { - KeybRemoveAllKey(pDevice, &(pDevice->sKey), pDevice->abyBSSID); - } -*/ - pDevice->byLinkWaitCount = 0; - pDevice->byReAssocCount = 0; - pDevice->bLinkPass = true; - - vnt_mac_set_led(pDevice, LEDSTS_STS, LEDSTS_INTER); - - s_bClearBSSID_SCAN(pDevice); - - if (netif_queue_stopped(pDevice->dev)) - netif_wake_queue(pDevice->dev); - - } else if (pMgmt->eCurrState < WMAC_STATE_ASSOCPENDING) { - printk("WLAN_ASSOCIATE_WAIT:Association Fail???\n"); - } else if (pDevice->byLinkWaitCount <= 4) { - //mike add:wait another 2 sec if associated_frame delay! - pDevice->byLinkWaitCount++; - printk("WLAN_ASSOCIATE_WAIT:wait %d times!!\n", pDevice->byLinkWaitCount); - vCommandTimerWait((void *) pDevice, ASSOCIATE_TIMEOUT/2); - return; - } - - break; - - case WLAN_CMD_AP_MODE_START: - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"eCommandState == WLAN_CMD_AP_MODE_START\n"); - - if (pMgmt->eConfigMode == WMAC_CONFIG_AP) { - cancel_delayed_work_sync(&pDevice->second_callback_work); - pMgmt->eCurrState = WMAC_STATE_IDLE; - pMgmt->eCurrMode = WMAC_MODE_STANDBY; - pDevice->bLinkPass = false; - - vnt_mac_set_led(pDevice, LEDSTS_STS, LEDSTS_SLOW); - - BSSvClearNodeDBTable(pDevice, 0); - - pDevice->uAssocCount = 0; - pMgmt->eCurrState = WMAC_STATE_IDLE; - pDevice->bFixRate = false; - - vMgrCreateOwnIBSS((void *) pDevice, &Status); - if (Status != CMD_STATUS_SUCCESS) { - DBG_PRT(MSG_LEVEL_DEBUG, - KERN_INFO "vMgrCreateOwnIBSS fail!\n"); - } - // always turn off unicast bit - MACvRegBitsOff(pDevice, MAC_REG_RCR, RCR_UNICAST); - pDevice->byRxMode &= ~RCR_UNICAST; - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "wcmd: rx_mode = %x\n", pDevice->byRxMode); - BSSvAddMulticastNode(pDevice); - if (netif_queue_stopped(pDevice->dev)) - netif_wake_queue(pDevice->dev); - pDevice->bLinkPass = true; - - vnt_mac_set_led(pDevice, LEDSTS_STS, LEDSTS_INTER); - - schedule_delayed_work(&pDevice->second_callback_work, HZ); - } - break; - - case WLAN_CMD_TX_PSPACKET_START: - // DTIM Multicast tx - if (pMgmt->sNodeDBTable[0].bRxPSPoll) { - while ((skb = skb_dequeue(&pMgmt->sNodeDBTable[0].sTxPSQueue)) != NULL) { - if (skb_queue_empty(&pMgmt->sNodeDBTable[0].sTxPSQueue)) { - pMgmt->abyPSTxMap[0] &= ~byMask[0]; - pDevice->bMoreData = false; - } else { - pDevice->bMoreData = true; - } - - spin_lock_irqsave(&pDevice->lock, flags); - - if (nsDMA_tx_packet(pDevice, skb) != 0) - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Multicast ps tx fail\n"); - - spin_unlock_irqrestore(&pDevice->lock, flags); - - pMgmt->sNodeDBTable[0].wEnQueueCnt--; - } - } - - // PS nodes tx - for (ii = 1; ii < (MAX_NODE_NUM + 1); ii++) { - if (pMgmt->sNodeDBTable[ii].bActive && - pMgmt->sNodeDBTable[ii].bRxPSPoll) { - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Index=%d Enqueu Cnt= %d\n", - ii, pMgmt->sNodeDBTable[ii].wEnQueueCnt); - while ((skb = skb_dequeue(&pMgmt->sNodeDBTable[ii].sTxPSQueue)) != NULL) { - if (skb_queue_empty(&pMgmt->sNodeDBTable[ii].sTxPSQueue)) { - // clear tx map - pMgmt->abyPSTxMap[pMgmt->sNodeDBTable[ii].wAID >> 3] &= - ~byMask[pMgmt->sNodeDBTable[ii].wAID & 7]; - pDevice->bMoreData = false; - } else { - pDevice->bMoreData = true; - } - - spin_lock_irqsave(&pDevice->lock, flags); - if (nsDMA_tx_packet(pDevice, skb) != 0) - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "sta ps tx fail\n"); - - spin_unlock_irqrestore(&pDevice->lock, flags); - - pMgmt->sNodeDBTable[ii].wEnQueueCnt--; - // check if sta ps enable, wait next pspoll - // if sta ps disable, send all pending buffers. - if (pMgmt->sNodeDBTable[ii].bPSEnable) - break; - } - if (skb_queue_empty(&pMgmt->sNodeDBTable[ii].sTxPSQueue)) { - // clear tx map - pMgmt->abyPSTxMap[pMgmt->sNodeDBTable[ii].wAID >> 3] &= - ~byMask[pMgmt->sNodeDBTable[ii].wAID & 7]; - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Index=%d PS queue clear\n", ii); - } - pMgmt->sNodeDBTable[ii].bRxPSPoll = false; - } - } break; - case WLAN_CMD_RADIO_START: - - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"eCommandState == WLAN_CMD_RADIO_START\n"); -// if (pDevice->bRadioCmd == true) -// CARDbRadioPowerOn(pDevice); -// else -// CARDbRadioPowerOff(pDevice); - { - int ntStatus = STATUS_SUCCESS; - u8 byTmp; - - ntStatus = vnt_control_in(pDevice, - MESSAGE_TYPE_READ, - MAC_REG_GPIOCTL1, - MESSAGE_REQUEST_MACREG, - 1, - &byTmp); - - if (ntStatus != STATUS_SUCCESS) - break; - if ((byTmp & GPIO3_DATA) == 0) { - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO" WLAN_CMD_RADIO_START_OFF........................\n"); - // Old commands are useless. - // empty command Q - pDevice->cbFreeCmdQueue = CMD_Q_SIZE; - pDevice->uCmdDequeueIdx = 0; - pDevice->uCmdEnqueueIdx = 0; - //0415pDevice->bCmdRunning = false; - pDevice->bCmdClear = true; - pDevice->bStopTx0Pkt = false; - pDevice->bStopDataPkt = true; - - pDevice->byKeyIndex = 0; - pDevice->bTransmitKey = false; - - KeyvInitTable(pDevice, &pDevice->sKey); - - pMgmt->byCSSPK = KEY_CTL_NONE; - pMgmt->byCSSGK = KEY_CTL_NONE; - - if (pDevice->bLinkPass == true) { - // reason = 8 : disassoc because sta has left - vMgrDisassocBeginSta((void *) pDevice, - pMgmt, - pMgmt->abyCurrBSSID, - (8), - &Status); - pDevice->bLinkPass = false; - // unlock command busy - pMgmt->eCurrState = WMAC_STATE_IDLE; - pMgmt->sNodeDBTable[0].bActive = false; - // if(pDevice->bWPASuppWextEnabled == true) - { - union iwreq_data wrqu; - memset(&wrqu, 0, sizeof(wrqu)); - wrqu.ap_addr.sa_family = ARPHRD_ETHER; - PRINT_K("wireless_send_event--->SIOCGIWAP(disassociated)\n"); - wireless_send_event(pDevice->dev, SIOCGIWAP, &wrqu, NULL); - } - } - pDevice->bwextstep0 = false; - pDevice->bwextstep1 = false; - pDevice->bwextstep2 = false; - pDevice->bwextstep3 = false; - pDevice->bWPASuppWextEnabled = false; - //clear current SSID - pItemSSID = (PWLAN_IE_SSID)pMgmt->abyCurrSSID; - pItemSSID->len = 0; - memset(pItemSSID->abySSID, 0, WLAN_SSID_MAXLEN); - //clear desired SSID - pItemSSID = (PWLAN_IE_SSID)pMgmt->abyDesireSSID; - pItemSSID->len = 0; - memset(pItemSSID->abySSID, 0, WLAN_SSID_MAXLEN); - - netif_stop_queue(pDevice->dev); - CARDbRadioPowerOff(pDevice); - MACvRegBitsOn(pDevice, MAC_REG_GPIOCTL1, GPIO3_INTMD); - - vnt_mac_set_led(pDevice, LEDSTS_STS, LEDSTS_OFF); - - pDevice->bHWRadioOff = true; - } else { - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO" WLAN_CMD_RADIO_START_ON........................\n"); - pDevice->bHWRadioOff = false; - CARDbRadioPowerOn(pDevice); - MACvRegBitsOff(pDevice, MAC_REG_GPIOCTL1, GPIO3_INTMD); - - vnt_mac_set_led(pDevice, LEDSTS_STS, LEDSTS_ON); - } - } - + case WLAN_CMD_TBTT_WAKEUP_START: + vnt_next_tbtt_wakeup(priv); break; - case WLAN_CMD_CHANGE_BBSENSITIVITY_START: + case WLAN_CMD_BECON_SEND_START: + if (!priv->vif) + break; - pDevice->bStopDataPkt = true; - pDevice->byBBVGACurrent = pDevice->byBBVGANew; - BBvSetVGAGainOffset(pDevice, pDevice->byBBVGACurrent); - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Change sensitivity pDevice->byBBVGACurrent = %x\n", pDevice->byBBVGACurrent); - pDevice->bStopDataPkt = false; - break; + vnt_beacon_make(priv, priv->vif); - case WLAN_CMD_TBTT_WAKEUP_START: - PSbIsNextTBTTWakeUp(pDevice); - break; + vnt_mac_reg_bits_on(priv, MAC_REG_TCR, TCR_AUTOBCNTX); - case WLAN_CMD_BECON_SEND_START: - bMgrPrepareBeaconToSend(pDevice, pMgmt); break; case WLAN_CMD_SETPOWER_START: - vnt_rf_setpower(pDevice, pDevice->wCurrentRate, - pMgmt->uCurrChannel); + vnt_rf_setpower(priv, priv->current_rate, + priv->hw->conf.chandef.chan->hw_value); break; case WLAN_CMD_CHANGE_ANTENNA_START: - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Change from Antenna%d to", (int)pDevice->dwRxAntennaSel); - if (pDevice->dwRxAntennaSel == 0) { - pDevice->dwRxAntennaSel = 1; - if (pDevice->bTxRxAntInv == true) - BBvSetAntennaMode(pDevice, ANT_RXA); + dev_dbg(&priv->usb->dev, "Change from Antenna%d to", + priv->rx_antenna_sel); + + if (priv->rx_antenna_sel == 0) { + priv->rx_antenna_sel = 1; + if (priv->tx_rx_ant_inv == true) + vnt_set_antenna_mode(priv, ANT_RXA); else - BBvSetAntennaMode(pDevice, ANT_RXB); + vnt_set_antenna_mode(priv, ANT_RXB); } else { - pDevice->dwRxAntennaSel = 0; - if (pDevice->bTxRxAntInv == true) - BBvSetAntennaMode(pDevice, ANT_RXB); + priv->rx_antenna_sel = 0; + if (priv->tx_rx_ant_inv == true) + vnt_set_antenna_mode(priv, ANT_RXB); else - BBvSetAntennaMode(pDevice, ANT_RXA); + vnt_set_antenna_mode(priv, ANT_RXA); } break; - case WLAN_CMD_REMOVE_ALLKEY_START: - KeybRemoveAllKey(pDevice, &(pDevice->sKey), pDevice->abyBSSID); - break; - - case WLAN_CMD_MAC_DISPOWERSAVING_START: - vnt_control_in_u8(pDevice, MESSAGE_REQUEST_MACREG, MAC_REG_PSCTL, &byData); - if ((byData & PSCTL_PS) != 0) { - // disable power saving hw function - vnt_control_out(pDevice, - MESSAGE_TYPE_DISABLE_PS, - 0, - 0, - 0, - NULL - ); - } - break; - - case WLAN_CMD_11H_CHSW_START: - CARDbSetMediaChannel(pDevice, pDevice->byNewChannel); - pDevice->bChannelSwitch = false; - pMgmt->uCurrChannel = pDevice->byNewChannel; - pDevice->bStopDataPkt = false; - break; - - case WLAN_CMD_CONFIGURE_FILTER_START: - vnt_configure_filter(pDevice); - break; default: break; - } //switch - - s_bCommandComplete(pDevice); - - return; -} - -static int s_bCommandComplete(struct vnt_private *pDevice) -{ - struct vnt_manager *pMgmt = &pDevice->vnt_mgmt; - PWLAN_IE_SSID pSSID; - int bRadioCmd = false; - int bForceSCAN = true; - - pDevice->eCommandState = WLAN_CMD_IDLE; - if (pDevice->cbFreeCmdQueue == CMD_Q_SIZE) { - //Command Queue Empty - pDevice->bCmdRunning = false; - return true; - } else { - pDevice->eCommand = pDevice->eCmdQueue[pDevice->uCmdDequeueIdx].eCmd; - pSSID = (PWLAN_IE_SSID)pDevice->eCmdQueue[pDevice->uCmdDequeueIdx].abyCmdDesireSSID; - bRadioCmd = pDevice->eCmdQueue[pDevice->uCmdDequeueIdx].bRadioCmd; - bForceSCAN = pDevice->eCmdQueue[pDevice->uCmdDequeueIdx].bForceSCAN; - ADD_ONE_WITH_WRAP_AROUND(pDevice->uCmdDequeueIdx, CMD_Q_SIZE); - pDevice->cbFreeCmdQueue++; - pDevice->bCmdRunning = true; - switch (pDevice->eCommand) { - case WLAN_CMD_BSSID_SCAN: - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"eCommandState= WLAN_CMD_BSSID_SCAN\n"); - pDevice->eCommandState = WLAN_CMD_SCAN_START; - pMgmt->uScanChannel = 0; - if (pSSID->len != 0) - memcpy(pMgmt->abyScanSSID, pSSID, WLAN_IEHDR_LEN + WLAN_SSID_MAXLEN + 1); - else - memset(pMgmt->abyScanSSID, 0, WLAN_IEHDR_LEN + WLAN_SSID_MAXLEN + 1); -/* - if ((bForceSCAN == false) && (pDevice->bLinkPass == true)) { - if ((pSSID->len == ((PWLAN_IE_SSID)pMgmt->abyCurrSSID)->len) && - ( !memcmp(pSSID->abySSID, ((PWLAN_IE_SSID)pMgmt->abyCurrSSID)->abySSID, pSSID->len))) { - pDevice->eCommandState = WLAN_CMD_IDLE; - } - } -*/ - break; - case WLAN_CMD_SSID: - pDevice->eCommandState = WLAN_CMD_SSID_START; - if (pSSID->len > WLAN_SSID_MAXLEN) - pSSID->len = WLAN_SSID_MAXLEN; - if (pSSID->len != 0) - memcpy(pMgmt->abyDesireSSID, pSSID, WLAN_IEHDR_LEN + WLAN_SSID_MAXLEN + 1); - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"eCommandState= WLAN_CMD_SSID_START\n"); - break; - case WLAN_CMD_DISASSOCIATE: - pDevice->eCommandState = WLAN_CMD_DISASSOCIATE_START; - break; - case WLAN_CMD_RX_PSPOLL: - pDevice->eCommandState = WLAN_CMD_TX_PSPACKET_START; - break; - case WLAN_CMD_RUN_AP: - pDevice->eCommandState = WLAN_CMD_AP_MODE_START; - break; - case WLAN_CMD_RADIO: - pDevice->eCommandState = WLAN_CMD_RADIO_START; - pDevice->bRadioCmd = bRadioCmd; - break; - case WLAN_CMD_CHANGE_BBSENSITIVITY: - pDevice->eCommandState = WLAN_CMD_CHANGE_BBSENSITIVITY_START; - break; - - case WLAN_CMD_TBTT_WAKEUP: - pDevice->eCommandState = WLAN_CMD_TBTT_WAKEUP_START; - break; - - case WLAN_CMD_BECON_SEND: - pDevice->eCommandState = WLAN_CMD_BECON_SEND_START; - break; - - case WLAN_CMD_SETPOWER: - pDevice->eCommandState = WLAN_CMD_SETPOWER_START; - break; - - case WLAN_CMD_CHANGE_ANTENNA: - pDevice->eCommandState = WLAN_CMD_CHANGE_ANTENNA_START; - break; - - case WLAN_CMD_REMOVE_ALLKEY: - pDevice->eCommandState = WLAN_CMD_REMOVE_ALLKEY_START; - break; - - case WLAN_CMD_MAC_DISPOWERSAVING: - pDevice->eCommandState = WLAN_CMD_MAC_DISPOWERSAVING_START; - break; - - case WLAN_CMD_11H_CHSW: - pDevice->eCommandState = WLAN_CMD_11H_CHSW_START; - break; - - case WLAN_CMD_CONFIGURE_FILTER: - pDevice->eCommandState = - WLAN_CMD_CONFIGURE_FILTER_START; - break; - - default: - break; - } - vCommandTimerWait(pDevice, 0); } - return true; + vnt_cmd_complete(priv); } -int bScheduleCommand(struct vnt_private *pDevice, - CMD_CODE eCommand, u8 *pbyItem0) +int vnt_schedule_command(struct vnt_private *priv, enum vnt_cmd command) { - if (pDevice->cbFreeCmdQueue == 0) + if (priv->free_cmd_queue == 0) return false; - pDevice->eCmdQueue[pDevice->uCmdEnqueueIdx].eCmd = eCommand; - pDevice->eCmdQueue[pDevice->uCmdEnqueueIdx].bForceSCAN = true; - memset(pDevice->eCmdQueue[pDevice->uCmdEnqueueIdx].abyCmdDesireSSID, 0 , WLAN_IEHDR_LEN + WLAN_SSID_MAXLEN + 1); - if (pbyItem0 != NULL) { - switch (eCommand) { - case WLAN_CMD_BSSID_SCAN: - pDevice->eCmdQueue[pDevice->uCmdEnqueueIdx].bForceSCAN = false; - memcpy(pDevice->eCmdQueue[pDevice->uCmdEnqueueIdx].abyCmdDesireSSID, - pbyItem0, WLAN_IEHDR_LEN + WLAN_SSID_MAXLEN + 1); - break; - - case WLAN_CMD_SSID: - memcpy(pDevice->eCmdQueue[pDevice->uCmdEnqueueIdx].abyCmdDesireSSID, - pbyItem0, WLAN_IEHDR_LEN + WLAN_SSID_MAXLEN + 1); - break; - - case WLAN_CMD_DISASSOCIATE: - pDevice->eCmdQueue[pDevice->uCmdEnqueueIdx].bNeedRadioOFF = *((int *)pbyItem0); - break; -/* - case WLAN_CMD_DEAUTH: - pDevice->eCmdQueue[pDevice->uCmdEnqueueIdx].wDeAuthenReason = *((u16 *)pbyItem0); - break; -*/ - - case WLAN_CMD_RADIO: - pDevice->eCmdQueue[pDevice->uCmdEnqueueIdx].bRadioCmd = *((int *)pbyItem0); - break; - default: - break; - } - } + priv->cmd_queue[priv->cmd_enqueue_idx] = command; - ADD_ONE_WITH_WRAP_AROUND(pDevice->uCmdEnqueueIdx, CMD_Q_SIZE); - pDevice->cbFreeCmdQueue--; + ADD_ONE_WITH_WRAP_AROUND(priv->cmd_enqueue_idx, CMD_Q_SIZE); + priv->free_cmd_queue--; - if (pDevice->bCmdRunning == false) - s_bCommandComplete(pDevice); + if (priv->cmd_running == false) + vnt_cmd_complete(priv); return true; } -/* - * Description: - * Clear BSSID_SCAN cmd in CMD Queue - * - * Parameters: - * In: - * hDeviceContext - Pointer to the adapter - * eCommand - Command - * Out: - * none - * - * Return Value: true if success; otherwise false - * - */ -static int s_bClearBSSID_SCAN(struct vnt_private *pDevice) +void vnt_reset_command_timer(struct vnt_private *priv) { - unsigned int uCmdDequeueIdx = pDevice->uCmdDequeueIdx; - unsigned int ii; - - if ((pDevice->cbFreeCmdQueue < CMD_Q_SIZE) && (uCmdDequeueIdx != pDevice->uCmdEnqueueIdx)) { - for (ii = 0; ii < (CMD_Q_SIZE - pDevice->cbFreeCmdQueue); ii++) { - if (pDevice->eCmdQueue[uCmdDequeueIdx].eCmd == WLAN_CMD_BSSID_SCAN) - pDevice->eCmdQueue[uCmdDequeueIdx].eCmd = WLAN_CMD_IDLE; - ADD_ONE_WITH_WRAP_AROUND(uCmdDequeueIdx, CMD_Q_SIZE); - if (uCmdDequeueIdx == pDevice->uCmdEnqueueIdx) - break; - } - } - return true; -} - -//mike add:reset command timer -void vResetCommandTimer(struct vnt_private *pDevice) -{ - cancel_delayed_work_sync(&pDevice->run_command_work); - - pDevice->cbFreeCmdQueue = CMD_Q_SIZE; - pDevice->uCmdDequeueIdx = 0; - pDevice->uCmdEnqueueIdx = 0; - pDevice->eCommandState = WLAN_CMD_IDLE; - pDevice->bCmdRunning = false; - pDevice->bCmdClear = false; + priv->free_cmd_queue = CMD_Q_SIZE; + priv->cmd_dequeue_idx = 0; + priv->cmd_enqueue_idx = 0; + priv->command_state = WLAN_CMD_IDLE; + priv->cmd_running = false; } diff --git a/drivers/staging/vt6656/wcmd.h b/drivers/staging/vt6656/wcmd.h index 736572101bad..2b0ee285eb0b 100644 --- a/drivers/staging/vt6656/wcmd.h +++ b/drivers/staging/vt6656/wcmd.h @@ -29,84 +29,35 @@ #ifndef __WCMD_H__ #define __WCMD_H__ -#include "80211hdr.h" -#include "80211mgr.h" +#include "device.h" -#define AUTHENTICATE_TIMEOUT 1000 //ms -#define ASSOCIATE_TIMEOUT 1000 //ms - -// Command code -typedef enum tagCMD_CODE { - WLAN_CMD_BSSID_SCAN, - WLAN_CMD_SSID, - WLAN_CMD_DISASSOCIATE, - WLAN_CMD_DEAUTH, - WLAN_CMD_RX_PSPOLL, - WLAN_CMD_RADIO, - WLAN_CMD_CHANGE_BBSENSITIVITY, - WLAN_CMD_SETPOWER, - WLAN_CMD_TBTT_WAKEUP, - WLAN_CMD_BECON_SEND, - WLAN_CMD_CHANGE_ANTENNA, - WLAN_CMD_REMOVE_ALLKEY, - WLAN_CMD_MAC_DISPOWERSAVING, - WLAN_CMD_11H_CHSW, - WLAN_CMD_RUN_AP, - WLAN_CMD_CONFIGURE_FILTER -} CMD_CODE, *PCMD_CODE; +/* Command code */ +enum vnt_cmd { + WLAN_CMD_INIT_MAC80211, + WLAN_CMD_SETPOWER, + WLAN_CMD_TBTT_WAKEUP, + WLAN_CMD_BECON_SEND, + WLAN_CMD_CHANGE_ANTENNA +}; #define CMD_Q_SIZE 32 -typedef enum tagCMD_STATUS { - - CMD_STATUS_SUCCESS = 0, - CMD_STATUS_FAILURE, - CMD_STATUS_RESOURCES, - CMD_STATUS_TIMEOUT, - CMD_STATUS_PENDING - -} CMD_STATUS, *PCMD_STATUS; - -typedef struct tagCMD_ITEM { - CMD_CODE eCmd; - u8 abyCmdDesireSSID[WLAN_IEHDR_LEN + WLAN_SSID_MAXLEN + 1]; - bool bNeedRadioOFF; - bool bRadioCmd; - bool bForceSCAN; - u16 wDeAuthenReason; -} CMD_ITEM, *PCMD_ITEM; - -// Command state -typedef enum tagCMD_STATE { - WLAN_CMD_SCAN_START, - WLAN_CMD_SCAN_END, - WLAN_CMD_DISASSOCIATE_START, - WLAN_CMD_DEAUTHEN_START, - WLAN_CMD_SSID_START, - WLAN_AUTHENTICATE_WAIT, - WLAN_ASSOCIATE_WAIT, - WLAN_DISASSOCIATE_WAIT, - WLAN_CMD_TX_PSPACKET_START, - WLAN_CMD_RADIO_START, - WLAN_CMD_CHANGE_BBSENSITIVITY_START, - WLAN_CMD_SETPOWER_START, - WLAN_CMD_AP_MODE_START, - WLAN_CMD_TBTT_WAKEUP_START, - WLAN_CMD_BECON_SEND_START, - WLAN_CMD_CHANGE_ANTENNA_START, - WLAN_CMD_REMOVE_ALLKEY_START, - WLAN_CMD_MAC_DISPOWERSAVING_START, - WLAN_CMD_11H_CHSW_START, - WLAN_CMD_CONFIGURE_FILTER_START, - WLAN_CMD_IDLE -} CMD_STATE, *PCMD_STATE; +/* Command state */ +enum vnt_cmd_state { + WLAN_CMD_INIT_MAC80211_START, + WLAN_CMD_SETPOWER_START, + WLAN_CMD_TBTT_WAKEUP_START, + WLAN_CMD_BECON_SEND_START, + WLAN_CMD_CHANGE_ANTENNA_START, + WLAN_CMD_IDLE +}; struct vnt_private; -void vResetCommandTimer(struct vnt_private *); +void vnt_reset_command_timer(struct vnt_private *); -int bScheduleCommand(struct vnt_private *, CMD_CODE eCommand, u8 *pbyItem0); +int vnt_schedule_command(struct vnt_private *, enum vnt_cmd); -void vRunCommand(struct work_struct *work); +void vnt_run_command(struct work_struct *work); #endif /* __WCMD_H__ */ diff --git a/drivers/staging/vt6656/wctl.c b/drivers/staging/vt6656/wctl.c deleted file mode 100644 index efdc5d5d38ee..000000000000 --- a/drivers/staging/vt6656/wctl.c +++ /dev/null @@ -1,244 +0,0 @@ -/* - * Copyright (c) 1996, 2003 VIA Networking Technologies, Inc. - * All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - * - * File: wctl.c - * - * Purpose: handle WMAC duplicate filter & defragment - * - * Author: Jerry Chen - * - * Date: Jun. 27, 2002 - * - * Functions: - * WCTLbIsDuplicate - Test if duplicate packet - * WCTLuSearchDFCB - Search DeFragment Control Database - * WCTLuInsertDFCB - Insert DeFragment Control Database - * WCTLbHandleFragment - Handle received fragment packet - * - * Revision History: - * - */ - -#include "wctl.h" -#include "device.h" -#include "card.h" -#include "tmacro.h" - -// static int msglevel =MSG_LEVEL_INFO; - -/* - * Description: - * Scan Rx cache. Return true if packet is duplicate, else - * inserts in receive cache and returns false. - * - * Parameters: - * In: - * pCache - Receive packets history - * pMACHeader - 802.11 MAC Header of received packet - * Out: - * none - * - * Return Value: true if packet duplicate; otherwise false - * - */ - -bool WCTLbIsDuplicate (PSCache pCache, struct ieee80211_hdr *pMACHeader) -{ - unsigned int uIndex; - unsigned int ii; - PSCacheEntry pCacheEntry; - - if (IS_FC_RETRY(pMACHeader)) { - - uIndex = pCache->uInPtr; - for (ii = 0; ii < DUPLICATE_RX_CACHE_LENGTH; ii++) { - pCacheEntry = &(pCache->asCacheEntry[uIndex]); - if ((pCacheEntry->wFmSequence == pMACHeader->seq_ctrl) && - ether_addr_equal(pCacheEntry->abyAddr2, pMACHeader->addr2) && - (pCacheEntry->wFrameCtl == pMACHeader->frame_control) - ) { - /* Duplicate match */ - return true; - } - ADD_ONE_WITH_WRAP_AROUND(uIndex, DUPLICATE_RX_CACHE_LENGTH); - } - } - /* Not found in cache - insert */ - pCacheEntry = &pCache->asCacheEntry[pCache->uInPtr]; - pCacheEntry->wFmSequence = pMACHeader->seq_ctrl; - memcpy(&(pCacheEntry->abyAddr2[0]), &(pMACHeader->addr2[0]), ETH_ALEN); - pCacheEntry->wFrameCtl = pMACHeader->frame_control; - ADD_ONE_WITH_WRAP_AROUND(pCache->uInPtr, DUPLICATE_RX_CACHE_LENGTH); - return false; -} - -/* - * Description: - * Found if sequence number of received fragment packet in Defragment Database - * - * Parameters: - * In: - * pDevice - Pointer to adapter - * pMACHeader - 802.11 MAC Header of received packet - * Out: - * none - * - * Return Value: index number in Defragment Database - * - */ - -unsigned int WCTLuSearchDFCB(struct vnt_private *pDevice, - struct ieee80211_hdr *pMACHeader) -{ - unsigned int ii; - - for (ii = 0; ii < pDevice->cbDFCB; ii++) { - if ((pDevice->sRxDFCB[ii].bInUse == true) && - ether_addr_equal(pDevice->sRxDFCB[ii].abyAddr2, - pMACHeader->addr2)) { - return ii; - } - } - return pDevice->cbDFCB; -} - -/* - * Description: - * Insert received fragment packet in Defragment Database - * - * Parameters: - * In: - * pDevice - Pointer to adapter - * pMACHeader - 802.11 MAC Header of received packet - * Out: - * none - * - * Return Value: index number in Defragment Database - * - */ -unsigned int WCTLuInsertDFCB(struct vnt_private *pDevice, - struct ieee80211_hdr *pMACHeader) -{ - unsigned int ii; - - if (pDevice->cbFreeDFCB == 0) - return(pDevice->cbDFCB); - for (ii = 0; ii < pDevice->cbDFCB; ii++) { - if (pDevice->sRxDFCB[ii].bInUse == false) { - pDevice->cbFreeDFCB--; - pDevice->sRxDFCB[ii].uLifetime = pDevice->dwMaxReceiveLifetime; - pDevice->sRxDFCB[ii].bInUse = true; - pDevice->sRxDFCB[ii].wSequence = (pMACHeader->seq_ctrl >> 4); - pDevice->sRxDFCB[ii].wFragNum = (pMACHeader->seq_ctrl & 0x000F); - memcpy(&(pDevice->sRxDFCB[ii].abyAddr2[0]), - &(pMACHeader->addr2[0]), - ETH_ALEN); - return(ii); - } - } - return(pDevice->cbDFCB); -} - -/* - * Description: - * Handle received fragment packet - * - * Parameters: - * In: - * pDevice - Pointer to adapter - * pMACHeader - 802.11 MAC Header of received packet - * cbFrameLength - Frame length - * bWEP - is WEP packet - * Out: - * none - * - * Return Value: true if it is valid fragment packet and we have resource to defragment; otherwise false - * - */ -bool WCTLbHandleFragment(struct vnt_private *pDevice, struct ieee80211_hdr *pMACHeader, unsigned int cbFrameLength, bool bWEP, bool bExtIV) -{ - unsigned int uHeaderSize; - - if (bWEP == true) { - uHeaderSize = 28; - if (bExtIV) - // ExtIV - uHeaderSize +=4; - } - else { - uHeaderSize = 24; - } - - if (IS_FIRST_FRAGMENT_PKT(pMACHeader)) { - pDevice->uCurrentDFCBIdx = WCTLuSearchDFCB(pDevice, pMACHeader); - if (pDevice->uCurrentDFCBIdx < pDevice->cbDFCB) { - // duplicate, we must flush previous DCB - pDevice->sRxDFCB[pDevice->uCurrentDFCBIdx].uLifetime = pDevice->dwMaxReceiveLifetime; - pDevice->sRxDFCB[pDevice->uCurrentDFCBIdx].wSequence = (pMACHeader->seq_ctrl >> 4); - pDevice->sRxDFCB[pDevice->uCurrentDFCBIdx].wFragNum = (pMACHeader->seq_ctrl & 0x000F); - } - else { - pDevice->uCurrentDFCBIdx = WCTLuInsertDFCB(pDevice, pMACHeader); - if (pDevice->uCurrentDFCBIdx == pDevice->cbDFCB) { - return(false); - } - } - // reserve 8 byte to match MAC RX Buffer - pDevice->sRxDFCB[pDevice->uCurrentDFCBIdx].pbyRxBuffer = (u8 *) (pDevice->sRxDFCB[pDevice->uCurrentDFCBIdx].skb->data + 8); -// pDevice->sRxDFCB[pDevice->uCurrentDFCBIdx].pbyRxBuffer = (u8 *) (pDevice->sRxDFCB[pDevice->uCurrentDFCBIdx].skb->data + 4); - memcpy(pDevice->sRxDFCB[pDevice->uCurrentDFCBIdx].pbyRxBuffer, pMACHeader, cbFrameLength); - pDevice->sRxDFCB[pDevice->uCurrentDFCBIdx].cbFrameLength = cbFrameLength; - pDevice->sRxDFCB[pDevice->uCurrentDFCBIdx].pbyRxBuffer += cbFrameLength; - pDevice->sRxDFCB[pDevice->uCurrentDFCBIdx].wFragNum++; - //DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "First pDevice->uCurrentDFCBIdx= %d\n", pDevice->uCurrentDFCBIdx); - return(false); - } - else { - pDevice->uCurrentDFCBIdx = WCTLuSearchDFCB(pDevice, pMACHeader); - if (pDevice->uCurrentDFCBIdx != pDevice->cbDFCB) { - if ((pDevice->sRxDFCB[pDevice->uCurrentDFCBIdx].wSequence == (pMACHeader->seq_ctrl >> 4)) && - (pDevice->sRxDFCB[pDevice->uCurrentDFCBIdx].wFragNum == (pMACHeader->seq_ctrl & 0x000F)) && - ((pDevice->sRxDFCB[pDevice->uCurrentDFCBIdx].cbFrameLength + cbFrameLength - uHeaderSize) < 2346)) { - - memcpy(pDevice->sRxDFCB[pDevice->uCurrentDFCBIdx].pbyRxBuffer, ((u8 *) (pMACHeader) + uHeaderSize), (cbFrameLength - uHeaderSize)); - pDevice->sRxDFCB[pDevice->uCurrentDFCBIdx].cbFrameLength += (cbFrameLength - uHeaderSize); - pDevice->sRxDFCB[pDevice->uCurrentDFCBIdx].pbyRxBuffer += (cbFrameLength - uHeaderSize); - pDevice->sRxDFCB[pDevice->uCurrentDFCBIdx].wFragNum++; - //DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Second pDevice->uCurrentDFCBIdx= %d\n", pDevice->uCurrentDFCBIdx); - } - else { - // seq error or frag # error flush DFCB - pDevice->cbFreeDFCB++; - pDevice->sRxDFCB[pDevice->uCurrentDFCBIdx].bInUse = false; - return(false); - } - } - else { - return(false); - } - if (IS_LAST_FRAGMENT_PKT(pMACHeader)) { - //enq defragcontrolblock - pDevice->cbFreeDFCB++; - pDevice->sRxDFCB[pDevice->uCurrentDFCBIdx].bInUse = false; - //DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Last pDevice->uCurrentDFCBIdx= %d\n", pDevice->uCurrentDFCBIdx); - return(true); - } - return(false); - } -} - diff --git a/drivers/staging/vt6656/wctl.h b/drivers/staging/vt6656/wctl.h deleted file mode 100644 index 14cb41177045..000000000000 --- a/drivers/staging/vt6656/wctl.h +++ /dev/null @@ -1,94 +0,0 @@ -/* - * Copyright (c) 1996, 2003 VIA Networking Technologies, Inc. - * All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - * - * File: wctl.h - * - * Purpose: - * - * Author: Jerry Chen - * - * Date: Jun. 27, 2002 - * - */ - -#ifndef __WCTL_H__ -#define __WCTL_H__ - -#include "tether.h" -#include "device.h" - -#define IS_TYPE_DATA(pMACHeader) \ - ((((struct ieee80211_hdr *) pMACHeader)->frame_control & TYPE_802_11_MASK) == TYPE_802_11_DATA) - -#define IS_TYPE_MGMT(pMACHeader) \ - ((((struct ieee80211_hdr *) pMACHeader)->frame_control & TYPE_802_11_MASK) == TYPE_802_11_MGMT) - -#define IS_TYPE_CONTROL(pMACHeader) \ - ((((struct ieee80211_hdr *) pMACHeader)->frame_control & TYPE_802_11_MASK) == TYPE_802_11_CTL) - -#define IS_FC_MOREDATA(pMACHeader) \ - ((((struct ieee80211_hdr *) pMACHeader)->frame_control & FC_MOREDATA) == FC_MOREDATA) - -#define IS_FC_POWERMGT(pMACHeader) \ - ((((struct ieee80211_hdr *) pMACHeader)->frame_control & FC_POWERMGT) == FC_POWERMGT) - -#define IS_FC_RETRY(pMACHeader) \ - ((((struct ieee80211_hdr *) pMACHeader)->frame_control & FC_RETRY) == FC_RETRY) - -#define IS_FC_WEP(pMACHeader) \ - ((((struct ieee80211_hdr *) pMACHeader)->frame_control & FC_WEP) == FC_WEP) - -#ifdef __BIG_ENDIAN - -#define IS_FRAGMENT_PKT(pMACHeader) \ - (((((struct ieee80211_hdr *) pMACHeader)->frame_control & FC_MOREFRAG) != 0) | \ - ((((struct ieee80211_hdr *) pMACHeader)->seq_ctrl & 0x0F00) != 0)) - -#define IS_FIRST_FRAGMENT_PKT(pMACHeader) \ - ((((struct ieee80211_hdr *) pMACHeader)->seq_ctrl & 0x0F00) == 0) - -#else - -#define IS_FRAGMENT_PKT(pMACHeader) \ - (((((struct ieee80211_hdr *) pMACHeader)->frame_control & FC_MOREFRAG) != 0) | \ - ((((struct ieee80211_hdr *) pMACHeader)->seq_ctrl & 0x000F) != 0)) - -#define IS_FIRST_FRAGMENT_PKT(pMACHeader) \ - ((((struct ieee80211_hdr *) pMACHeader)->seq_ctrl & 0x000F) == 0) - -#endif//#ifdef __BIG_ENDIAN - -#define IS_LAST_FRAGMENT_PKT(pMACHeader) \ - ((((struct ieee80211_hdr *) pMACHeader)->frame_control & FC_MOREFRAG) == 0) - -#define IS_CTL_PSPOLL(pMACHeader) \ - ((((struct ieee80211_hdr *) pMACHeader)->frame_control & TYPE_SUBTYPE_MASK) == TYPE_CTL_PSPOLL) - -#define ADD_ONE_WITH_WRAP_AROUND(uVar, uModulo) { \ - if ((uVar) >= ((uModulo) - 1)) \ - (uVar) = 0; \ - else \ - (uVar)++; \ -} - -bool WCTLbIsDuplicate(PSCache pCache, struct ieee80211_hdr *pMACHeader); -bool WCTLbHandleFragment(struct vnt_private *, struct ieee80211_hdr *pMACHeader, unsigned int cbFrameLength, bool bWEP, bool bExtIV); -unsigned int WCTLuSearchDFCB(struct vnt_private *, struct ieee80211_hdr *pMACHeader); -unsigned int WCTLuInsertDFCB(struct vnt_private *, struct ieee80211_hdr *pMACHeader); - -#endif /* __WCTL_H__ */ diff --git a/drivers/staging/vt6656/wmgr.c b/drivers/staging/vt6656/wmgr.c deleted file mode 100644 index 18723eab93d2..000000000000 --- a/drivers/staging/vt6656/wmgr.c +++ /dev/null @@ -1,4362 +0,0 @@ -/* - * Copyright (c) 1996, 2003 VIA Networking Technologies, Inc. - * All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - * - * - * File: wmgr.c - * - * Purpose: Handles the 802.11 management functions - * - * Author: Lyndon Chen - * - * Date: May 8, 2002 - * - * Functions: - * nsMgrObjectInitial - Initialize Management Objet data structure - * vMgrObjectReset - Reset Management Object data structure - * vMgrAssocBeginSta - Start associate function - * vMgrReAssocBeginSta - Start reassociate function - * vMgrDisassocBeginSta - Start disassociate function - * s_vMgrRxAssocRequest - Handle Rcv associate_request - * s_vMgrRxAssocResponse - Handle Rcv associate_response - * vMrgAuthenBeginSta - Start authentication function - * vMgrDeAuthenDeginSta - Start deauthentication function - * s_vMgrRxAuthentication - Handle Rcv authentication - * s_vMgrRxAuthenSequence_1 - Handle Rcv authentication sequence 1 - * s_vMgrRxAuthenSequence_2 - Handle Rcv authentication sequence 2 - * s_vMgrRxAuthenSequence_3 - Handle Rcv authentication sequence 3 - * s_vMgrRxAuthenSequence_4 - Handle Rcv authentication sequence 4 - * s_vMgrRxDisassociation - Handle Rcv disassociation - * s_vMgrRxBeacon - Handle Rcv Beacon - * vMgrCreateOwnIBSS - Create ad_hoc IBSS or AP BSS - * vMgrJoinBSSBegin - Join BSS function - * s_vMgrSynchBSS - Synch & adopt BSS parameters - * s_MgrMakeBeacon - Create Baecon frame - * s_MgrMakeProbeResponse - Create Probe Response frame - * s_MgrMakeAssocRequest - Create Associate Request frame - * s_MgrMakeReAssocRequest - Create ReAssociate Request frame - * s_vMgrRxProbeResponse - Handle Rcv probe_response - * s_vMrgRxProbeRequest - Handle Rcv probe_request - * bMgrPrepareBeaconToSend - Prepare Beacon frame - * s_vMgrLogStatus - Log 802.11 Status - * vMgrRxManagePacket - Rcv management frame dispatch function - * s_vMgrFormatTIM- Assembler TIM field of beacon - * vMgrTimerInit- Initial 1-sec and command call back funtions - * - * Revision History: - * - */ - -#include "tmacro.h" -#include "desc.h" -#include "device.h" -#include "card.h" -#include "80211hdr.h" -#include "80211mgr.h" -#include "wmgr.h" -#include "wcmd.h" -#include "mac.h" -#include "bssdb.h" -#include "power.h" -#include "datarate.h" -#include "baseband.h" -#include "rxtx.h" -#include "wpa.h" -#include "rf.h" -#include "iowpa.h" -#include "usbpipe.h" - -static int msglevel = MSG_LEVEL_INFO; -//static int msglevel =MSG_LEVEL_DEBUG; - -static int ChannelExceedZoneType(struct vnt_private *, u8 byCurrChannel); - -/* Association/diassociation functions */ -static struct vnt_tx_mgmt *s_MgrMakeAssocRequest(struct vnt_private *, - struct vnt_manager *pMgmt, u8 *pDAddr, u16 wCurrCapInfo, - u16 wListenInterval, PWLAN_IE_SSID pCurrSSID, - PWLAN_IE_SUPP_RATES pCurrRates, PWLAN_IE_SUPP_RATES pCurrExtSuppRates); - -static void s_vMgrRxAssocRequest(struct vnt_private *, - struct vnt_manager *pMgmt, struct vnt_rx_mgmt *pRxPacket, - u32 uNodeIndex); - -static struct vnt_tx_mgmt *s_MgrMakeReAssocRequest(struct vnt_private *, - struct vnt_manager *pMgmt, u8 *pDAddr, u16 wCurrCapInfo, - u16 wListenInterval, PWLAN_IE_SSID pCurrSSID, - PWLAN_IE_SUPP_RATES pCurrRates, PWLAN_IE_SUPP_RATES pCurrExtSuppRates); - -static void s_vMgrRxAssocResponse(struct vnt_private *, - struct vnt_manager *pMgmt, struct vnt_rx_mgmt *pRxPacket, - int bReAssocType); - -static void s_vMgrRxDisassociation(struct vnt_private *, - struct vnt_manager *pMgmt, struct vnt_rx_mgmt *pRxPacket); - -/* Authentication/deauthen functions */ -static void s_vMgrRxAuthenSequence_1(struct vnt_private *, - struct vnt_manager *pMgmt, PWLAN_FR_AUTHEN pFrame); - -static void s_vMgrRxAuthenSequence_2(struct vnt_private *, - struct vnt_manager *pMgmt, PWLAN_FR_AUTHEN pFrame); - -static void s_vMgrRxAuthenSequence_3(struct vnt_private *, - struct vnt_manager *pMgmt, PWLAN_FR_AUTHEN pFrame); - -static void s_vMgrRxAuthenSequence_4(struct vnt_private *, - struct vnt_manager *pMgmt, PWLAN_FR_AUTHEN pFrame); - -static void s_vMgrRxAuthentication(struct vnt_private *, - struct vnt_manager *pMgmt, struct vnt_rx_mgmt *pRxPacket); - -static void s_vMgrRxDeauthentication(struct vnt_private *, - struct vnt_manager *pMgmt, struct vnt_rx_mgmt *pRxPacket); - -/* Scan functions -* probe request/response functions */ - -static void s_vMgrRxProbeRequest(struct vnt_private *, - struct vnt_manager *pMgmt, struct vnt_rx_mgmt *pRxPacket); - -static void s_vMgrRxProbeResponse(struct vnt_private *, - struct vnt_manager *pMgmt, struct vnt_rx_mgmt *pRxPacket); - -/* beacon functions */ -static void s_vMgrRxBeacon(struct vnt_private *pDevice, - struct vnt_manager *pMgmt, struct vnt_rx_mgmt *pRxPacket, - int bInScan); - -static void s_vMgrFormatTIM(struct vnt_manager *pMgmt, PWLAN_IE_TIM pTIM); - -static struct vnt_tx_mgmt *s_MgrMakeBeacon(struct vnt_private *pDevice, - struct vnt_manager *pMgmt, u16 wCurrCapInfo, u16 wCurrBeaconPeriod, - u32 uCurrChannel, u16 wCurrATIMWinodw, PWLAN_IE_SSID pCurrSSID, - u8 *pCurrBSSID, PWLAN_IE_SUPP_RATES pCurrSuppRates, - PWLAN_IE_SUPP_RATES pCurrExtSuppRates); - -/* Association response */ -static struct vnt_tx_mgmt *s_MgrMakeAssocResponse(struct vnt_private *, - struct vnt_manager *pMgmt, u16 wCurrCapInfo, u16 wAssocStatus, - u16 wAssocAID, u8 *pDstAddr, PWLAN_IE_SUPP_RATES pCurrSuppRates, - PWLAN_IE_SUPP_RATES pCurrExtSuppRates); - -/* ReAssociation response */ -static struct vnt_tx_mgmt *s_MgrMakeReAssocResponse(struct vnt_private *, - struct vnt_manager *pMgmt, u16 wCurrCapInfo, u16 wAssocStatus, - u16 wAssocAID, u8 *pDstAddr, PWLAN_IE_SUPP_RATES pCurrSuppRates, - PWLAN_IE_SUPP_RATES pCurrExtSuppRates); - -/* Probe response */ -static struct vnt_tx_mgmt *s_MgrMakeProbeResponse(struct vnt_private *, - struct vnt_manager *pMgmt, u16 wCurrCapInfo, u16 wCurrBeaconPeriod, - u32 uCurrChannel, u16 wCurrATIMWinodw, u8 *pDstAddr, - PWLAN_IE_SSID pCurrSSID, u8 *pCurrBSSID, - PWLAN_IE_SUPP_RATES pCurrSuppRates, - PWLAN_IE_SUPP_RATES pCurrExtSuppRates, u8 byPHYType); - -/* received status */ -static void s_vMgrLogStatus(struct vnt_manager *pMgmt, u16 wStatus); - -static void s_vMgrSynchBSS(struct vnt_private *, u32 uBSSMode, - PKnownBSS pCurr, PCMD_STATUS pStatus); - -static bool -s_bCipherMatch ( - PKnownBSS pBSSNode, - NDIS_802_11_ENCRYPTION_STATUS EncStatus, - u8 * pbyCCSPK, - u8 * pbyCCSGK - ); - -static void Encyption_Rebuild(struct vnt_private *, PKnownBSS pCurr); - -/*+ - * - * Routine Description: - * Allocates and initializes the Management object. - * - * Return Value: - * Ndis_staus. - * --*/ - -void vMgrObjectInit(struct vnt_private *pDevice) -{ - struct vnt_manager *pMgmt = &pDevice->vnt_mgmt; - int ii; - - pMgmt->pbyPSPacketPool = &pMgmt->byPSPacketPool[0]; - pMgmt->pbyMgmtPacketPool = &pMgmt->byMgmtPacketPool[0]; - pMgmt->uCurrChannel = pDevice->uChannel; - for (ii = 0; ii < WLAN_BSSID_LEN; ii++) - pMgmt->abyDesireBSSID[ii] = 0xFF; - - pMgmt->sAssocInfo.AssocInfo.Length = sizeof(NDIS_802_11_ASSOCIATION_INFORMATION); - //memset(pMgmt->abyDesireSSID, 0, WLAN_IEHDR_LEN + WLAN_SSID_MAXLEN +1); - pMgmt->byCSSPK = KEY_CTL_NONE; - pMgmt->byCSSGK = KEY_CTL_NONE; - pMgmt->wIBSSBeaconPeriod = DEFAULT_IBSS_BI; - BSSvClearBSSList((void *) pDevice, false); - - pDevice->cbFreeCmdQueue = CMD_Q_SIZE; - pDevice->uCmdDequeueIdx = 0; - pDevice->uCmdEnqueueIdx = 0; - pDevice->eCommandState = WLAN_CMD_IDLE; - pDevice->bCmdRunning = false; - pDevice->bCmdClear = false; - - return; -} - -/*+ - * - * Routine Description: - * Start the station association procedure. Namely, send an - * association request frame to the AP. - * - * Return Value: - * None. - * --*/ - -void vMgrAssocBeginSta(struct vnt_private *pDevice, - struct vnt_manager *pMgmt, PCMD_STATUS pStatus) -{ - struct vnt_tx_mgmt *pTxPacket; - - pMgmt->wCurrCapInfo = 0; - pMgmt->wCurrCapInfo |= WLAN_SET_CAP_INFO_ESS(1); - if (pDevice->bEncryptionEnable) { - pMgmt->wCurrCapInfo |= WLAN_SET_CAP_INFO_PRIVACY(1); - } - // always allow receive short preamble - //if (pDevice->byPreambleType == 1) { - // pMgmt->wCurrCapInfo |= WLAN_SET_CAP_INFO_SHORTPREAMBLE(1); - //} - pMgmt->wCurrCapInfo |= WLAN_SET_CAP_INFO_SHORTPREAMBLE(1); - if (pMgmt->wListenInterval == 0) - pMgmt->wListenInterval = 1; // at least one. - - // ERP Phy (802.11g) should support short preamble. - if (pMgmt->eCurrentPHYMode == PHY_TYPE_11G) { - pMgmt->wCurrCapInfo |= WLAN_SET_CAP_INFO_SHORTPREAMBLE(1); - if (pDevice->bShortSlotTime == true) - pMgmt->wCurrCapInfo |= WLAN_SET_CAP_INFO_SHORTSLOTTIME(1); - - } else if (pMgmt->eCurrentPHYMode == PHY_TYPE_11B) { - if (pDevice->byPreambleType == 1) { - pMgmt->wCurrCapInfo |= WLAN_SET_CAP_INFO_SHORTPREAMBLE(1); - } - } - if (pMgmt->b11hEnable == true) - pMgmt->wCurrCapInfo |= WLAN_SET_CAP_INFO_SPECTRUMMNG(1); - - // build an assocreq frame and send it - pTxPacket = s_MgrMakeAssocRequest - ( - pDevice, - pMgmt, - pMgmt->abyCurrBSSID, - pMgmt->wCurrCapInfo, - pMgmt->wListenInterval, - (PWLAN_IE_SSID)pMgmt->abyCurrSSID, - (PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates, - (PWLAN_IE_SUPP_RATES)pMgmt->abyCurrExtSuppRates - ); - - if (pTxPacket != NULL ){ - // send the frame - *pStatus = csMgmt_xmit(pDevice, pTxPacket); - if (*pStatus == CMD_STATUS_PENDING) { - pMgmt->eCurrState = WMAC_STATE_ASSOCPENDING; - *pStatus = CMD_STATUS_SUCCESS; - } - } - else - *pStatus = CMD_STATUS_RESOURCES; - - return ; -} - -/*+ - * - * Routine Description: - * Start the station re-association procedure. - * - * Return Value: - * None. - * --*/ - -void vMgrReAssocBeginSta(struct vnt_private *pDevice, - struct vnt_manager *pMgmt, PCMD_STATUS pStatus) -{ - struct vnt_tx_mgmt *pTxPacket; - - pMgmt->wCurrCapInfo = 0; - pMgmt->wCurrCapInfo |= WLAN_SET_CAP_INFO_ESS(1); - if (pDevice->bEncryptionEnable) { - pMgmt->wCurrCapInfo |= WLAN_SET_CAP_INFO_PRIVACY(1); - } - - //if (pDevice->byPreambleType == 1) { - // pMgmt->wCurrCapInfo |= WLAN_SET_CAP_INFO_SHORTPREAMBLE(1); - //} - pMgmt->wCurrCapInfo |= WLAN_SET_CAP_INFO_SHORTPREAMBLE(1); - - if (pMgmt->wListenInterval == 0) - pMgmt->wListenInterval = 1; // at least one. - - // ERP Phy (802.11g) should support short preamble. - if (pMgmt->eCurrentPHYMode == PHY_TYPE_11G) { - pMgmt->wCurrCapInfo |= WLAN_SET_CAP_INFO_SHORTPREAMBLE(1); - if (pDevice->bShortSlotTime == true) - pMgmt->wCurrCapInfo |= WLAN_SET_CAP_INFO_SHORTSLOTTIME(1); - - } else if (pMgmt->eCurrentPHYMode == PHY_TYPE_11B) { - if (pDevice->byPreambleType == 1) { - pMgmt->wCurrCapInfo |= WLAN_SET_CAP_INFO_SHORTPREAMBLE(1); - } - } - if (pMgmt->b11hEnable == true) - pMgmt->wCurrCapInfo |= WLAN_SET_CAP_INFO_SPECTRUMMNG(1); - - pTxPacket = s_MgrMakeReAssocRequest - ( - pDevice, - pMgmt, - pMgmt->abyCurrBSSID, - pMgmt->wCurrCapInfo, - pMgmt->wListenInterval, - (PWLAN_IE_SSID)pMgmt->abyCurrSSID, - (PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates, - (PWLAN_IE_SUPP_RATES)pMgmt->abyCurrExtSuppRates - ); - - if (pTxPacket != NULL ){ - // send the frame - *pStatus = csMgmt_xmit(pDevice, pTxPacket); - if (*pStatus != CMD_STATUS_PENDING) { - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Mgt:Reassociation tx failed.\n"); - } - else { - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Mgt:Reassociation tx sending.\n"); - } - } - - return ; -} - -/*+ - * - * Routine Description: - * Send an dis-association request frame to the AP. - * - * Return Value: - * None. - * --*/ - -void vMgrDisassocBeginSta(struct vnt_private *pDevice, - struct vnt_manager *pMgmt, u8 *abyDestAddress, u16 wReason, - PCMD_STATUS pStatus) -{ - struct vnt_tx_mgmt *pTxPacket = NULL; - WLAN_FR_DISASSOC sFrame; - - pTxPacket = (struct vnt_tx_mgmt *)pMgmt->pbyMgmtPacketPool; - memset(pTxPacket, 0, sizeof(struct vnt_tx_mgmt) - + WLAN_DISASSOC_FR_MAXLEN); - pTxPacket->p80211Header = (PUWLAN_80211HDR)((u8 *)pTxPacket - + sizeof(struct vnt_tx_mgmt)); - - // Setup the sFrame structure - sFrame.pBuf = (u8 *)pTxPacket->p80211Header; - sFrame.len = WLAN_DISASSOC_FR_MAXLEN; - - // format fixed field frame structure - vMgrEncodeDisassociation(&sFrame); - - // Setup the header - sFrame.pHdr->sA3.wFrameCtl = cpu_to_le16( - ( - WLAN_SET_FC_FTYPE(WLAN_TYPE_MGR) | - WLAN_SET_FC_FSTYPE(WLAN_FSTYPE_DISASSOC) - )); - - memcpy( sFrame.pHdr->sA3.abyAddr1, abyDestAddress, WLAN_ADDR_LEN); - memcpy( sFrame.pHdr->sA3.abyAddr2, pMgmt->abyMACAddr, WLAN_ADDR_LEN); - memcpy( sFrame.pHdr->sA3.abyAddr3, pMgmt->abyCurrBSSID, WLAN_BSSID_LEN); - - // Set reason code - *(sFrame.pwReason) = cpu_to_le16(wReason); - pTxPacket->cbMPDULen = sFrame.len; - pTxPacket->cbPayloadLen = sFrame.len - WLAN_HDR_ADDR3_LEN; - - // send the frame - *pStatus = csMgmt_xmit(pDevice, pTxPacket); - if (*pStatus == CMD_STATUS_PENDING) { - pMgmt->eCurrState = WMAC_STATE_IDLE; - *pStatus = CMD_STATUS_SUCCESS; - } - - return; -} - -/*+ - * - * Routine Description:(AP function) - * Handle incoming station association request frames. - * - * Return Value: - * None. - * --*/ - -static void s_vMgrRxAssocRequest(struct vnt_private *pDevice, - struct vnt_manager *pMgmt, struct vnt_rx_mgmt *pRxPacket, - u32 uNodeIndex) -{ - WLAN_FR_ASSOCREQ sFrame; - CMD_STATUS Status; - struct vnt_tx_mgmt *pTxPacket; - u16 wAssocStatus = 0; - u16 wAssocAID = 0; - u32 uRateLen = WLAN_RATES_MAXLEN; - u8 abyCurrSuppRates[WLAN_IEHDR_LEN + WLAN_RATES_MAXLEN + 1]; - u8 abyCurrExtSuppRates[WLAN_IEHDR_LEN + WLAN_RATES_MAXLEN + 1]; - - if (pMgmt->eCurrMode != WMAC_MODE_ESS_AP) - return; - // node index not found - if (!uNodeIndex) - return; - - //check if node is authenticated - //decode the frame - memset(&sFrame, 0, sizeof(WLAN_FR_ASSOCREQ)); - memset(abyCurrSuppRates, 0, WLAN_IEHDR_LEN + WLAN_RATES_MAXLEN + 1); - memset(abyCurrExtSuppRates, 0, WLAN_IEHDR_LEN + WLAN_RATES_MAXLEN + 1); - sFrame.len = pRxPacket->cbMPDULen; - sFrame.pBuf = (u8 *)pRxPacket->p80211Header; - - vMgrDecodeAssocRequest(&sFrame); - - if (pMgmt->sNodeDBTable[uNodeIndex].eNodeState >= NODE_AUTH) { - pMgmt->sNodeDBTable[uNodeIndex].eNodeState = NODE_ASSOC; - pMgmt->sNodeDBTable[uNodeIndex].wCapInfo = cpu_to_le16(*sFrame.pwCapInfo); - pMgmt->sNodeDBTable[uNodeIndex].wListenInterval = cpu_to_le16(*sFrame.pwListenInterval); - pMgmt->sNodeDBTable[uNodeIndex].bPSEnable = - WLAN_GET_FC_PWRMGT(sFrame.pHdr->sA3.wFrameCtl) ? true : false; - // Todo: check sta basic rate, if ap can't support, set status code - if (pDevice->byBBType == BB_TYPE_11B) { - uRateLen = WLAN_RATES_MAXLEN_11B; - } - abyCurrSuppRates[0] = WLAN_EID_SUPP_RATES; - abyCurrSuppRates[1] = RATEuSetIE((PWLAN_IE_SUPP_RATES)sFrame.pSuppRates, - (PWLAN_IE_SUPP_RATES)abyCurrSuppRates, - uRateLen); - abyCurrExtSuppRates[0] = WLAN_EID_EXTSUPP_RATES; - if (pDevice->byBBType == BB_TYPE_11G) { - abyCurrExtSuppRates[1] = RATEuSetIE((PWLAN_IE_SUPP_RATES)sFrame.pExtSuppRates, - (PWLAN_IE_SUPP_RATES)abyCurrExtSuppRates, - uRateLen); - } else { - abyCurrExtSuppRates[1] = 0; - } - - RATEvParseMaxRate((void *)pDevice, - (PWLAN_IE_SUPP_RATES)abyCurrSuppRates, - (PWLAN_IE_SUPP_RATES)abyCurrExtSuppRates, - false, // do not change our basic rate - &(pMgmt->sNodeDBTable[uNodeIndex].wMaxBasicRate), - &(pMgmt->sNodeDBTable[uNodeIndex].wMaxSuppRate), - &(pMgmt->sNodeDBTable[uNodeIndex].wSuppRate), - &(pMgmt->sNodeDBTable[uNodeIndex].byTopCCKBasicRate), - &(pMgmt->sNodeDBTable[uNodeIndex].byTopOFDMBasicRate) - ); - - // set max tx rate - pMgmt->sNodeDBTable[uNodeIndex].wTxDataRate = - pMgmt->sNodeDBTable[uNodeIndex].wMaxSuppRate; - // Todo: check sta preamble, if ap can't support, set status code - pMgmt->sNodeDBTable[uNodeIndex].bShortPreamble = - WLAN_GET_CAP_INFO_SHORTPREAMBLE(*sFrame.pwCapInfo); - pMgmt->sNodeDBTable[uNodeIndex].bShortSlotTime = - WLAN_GET_CAP_INFO_SHORTSLOTTIME(*sFrame.pwCapInfo); - pMgmt->sNodeDBTable[uNodeIndex].wAID = (u16)uNodeIndex; - wAssocStatus = WLAN_MGMT_STATUS_SUCCESS; - wAssocAID = (u16)uNodeIndex; - // check if ERP support - if(pMgmt->sNodeDBTable[uNodeIndex].wMaxSuppRate > RATE_11M) - pMgmt->sNodeDBTable[uNodeIndex].bERPExist = true; - - if (pMgmt->sNodeDBTable[uNodeIndex].wMaxSuppRate <= RATE_11M) { - // B only STA join - pDevice->bProtectMode = true; - pDevice->bNonERPPresent = true; - } - if (pMgmt->sNodeDBTable[uNodeIndex].bShortPreamble == false) { - pDevice->bBarkerPreambleMd = true; - } - - DBG_PRT(MSG_LEVEL_INFO, KERN_INFO "Associate AID= %d \n", wAssocAID); - DBG_PRT(MSG_LEVEL_INFO, KERN_INFO "MAC=%2.2X:%2.2X:%2.2X:%2.2X:%2.2X:%2.2X \n", - sFrame.pHdr->sA3.abyAddr2[0], - sFrame.pHdr->sA3.abyAddr2[1], - sFrame.pHdr->sA3.abyAddr2[2], - sFrame.pHdr->sA3.abyAddr2[3], - sFrame.pHdr->sA3.abyAddr2[4], - sFrame.pHdr->sA3.abyAddr2[5] - ) ; - DBG_PRT(MSG_LEVEL_INFO, KERN_INFO "Max Support rate = %d \n", - pMgmt->sNodeDBTable[uNodeIndex].wMaxSuppRate); - } - - // assoc response reply.. - pTxPacket = s_MgrMakeAssocResponse - ( - pDevice, - pMgmt, - pMgmt->wCurrCapInfo, - wAssocStatus, - wAssocAID, - sFrame.pHdr->sA3.abyAddr2, - (PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates, - (PWLAN_IE_SUPP_RATES)pMgmt->abyCurrExtSuppRates - ); - if (pTxPacket != NULL ){ - /* send the frame */ - Status = csMgmt_xmit(pDevice, pTxPacket); - if (Status != CMD_STATUS_PENDING) { - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Mgt:Assoc response tx failed\n"); - } - else { - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Mgt:Assoc response tx sending..\n"); - } - - } - - return; -} - -/*+ - * - * Description:(AP function) - * Handle incoming station re-association request frames. - * - * Parameters: - * In: - * pMgmt - Management Object structure - * pRxPacket - Received Packet - * Out: - * none - * - * Return Value: None. - * --*/ - -static void s_vMgrRxReAssocRequest(struct vnt_private *pDevice, - struct vnt_manager *pMgmt, struct vnt_rx_mgmt *pRxPacket, - u32 uNodeIndex) -{ - WLAN_FR_REASSOCREQ sFrame; - CMD_STATUS Status; - struct vnt_tx_mgmt *pTxPacket; - u16 wAssocStatus = 0; - u16 wAssocAID = 0; - u32 uRateLen = WLAN_RATES_MAXLEN; - u8 abyCurrSuppRates[WLAN_IEHDR_LEN + WLAN_RATES_MAXLEN + 1]; - u8 abyCurrExtSuppRates[WLAN_IEHDR_LEN + WLAN_RATES_MAXLEN + 1]; - - if (pMgmt->eCurrMode != WMAC_MODE_ESS_AP) - return; - // node index not found - if (!uNodeIndex) - return; - //check if node is authenticated - //decode the frame - memset(&sFrame, 0, sizeof(WLAN_FR_REASSOCREQ)); - sFrame.len = pRxPacket->cbMPDULen; - sFrame.pBuf = (u8 *)pRxPacket->p80211Header; - vMgrDecodeReassocRequest(&sFrame); - - if (pMgmt->sNodeDBTable[uNodeIndex].eNodeState >= NODE_AUTH) { - pMgmt->sNodeDBTable[uNodeIndex].eNodeState = NODE_ASSOC; - pMgmt->sNodeDBTable[uNodeIndex].wCapInfo = cpu_to_le16(*sFrame.pwCapInfo); - pMgmt->sNodeDBTable[uNodeIndex].wListenInterval = cpu_to_le16(*sFrame.pwListenInterval); - pMgmt->sNodeDBTable[uNodeIndex].bPSEnable = - WLAN_GET_FC_PWRMGT(sFrame.pHdr->sA3.wFrameCtl) ? true : false; - // Todo: check sta basic rate, if ap can't support, set status code - - if (pDevice->byBBType == BB_TYPE_11B) { - uRateLen = WLAN_RATES_MAXLEN_11B; - } - - abyCurrSuppRates[0] = WLAN_EID_SUPP_RATES; - abyCurrSuppRates[1] = RATEuSetIE((PWLAN_IE_SUPP_RATES)sFrame.pSuppRates, - (PWLAN_IE_SUPP_RATES)abyCurrSuppRates, - uRateLen); - abyCurrExtSuppRates[0] = WLAN_EID_EXTSUPP_RATES; - if (pDevice->byBBType == BB_TYPE_11G) { - abyCurrExtSuppRates[1] = RATEuSetIE((PWLAN_IE_SUPP_RATES)sFrame.pExtSuppRates, - (PWLAN_IE_SUPP_RATES)abyCurrExtSuppRates, - uRateLen); - } else { - abyCurrExtSuppRates[1] = 0; - } - - RATEvParseMaxRate((void *)pDevice, - (PWLAN_IE_SUPP_RATES)abyCurrSuppRates, - (PWLAN_IE_SUPP_RATES)abyCurrExtSuppRates, - false, // do not change our basic rate - &(pMgmt->sNodeDBTable[uNodeIndex].wMaxBasicRate), - &(pMgmt->sNodeDBTable[uNodeIndex].wMaxSuppRate), - &(pMgmt->sNodeDBTable[uNodeIndex].wSuppRate), - &(pMgmt->sNodeDBTable[uNodeIndex].byTopCCKBasicRate), - &(pMgmt->sNodeDBTable[uNodeIndex].byTopOFDMBasicRate) - ); - - // set max tx rate - pMgmt->sNodeDBTable[uNodeIndex].wTxDataRate = - pMgmt->sNodeDBTable[uNodeIndex].wMaxSuppRate; - // Todo: check sta preamble, if ap can't support, set status code - pMgmt->sNodeDBTable[uNodeIndex].bShortPreamble = - WLAN_GET_CAP_INFO_SHORTPREAMBLE(*sFrame.pwCapInfo); - pMgmt->sNodeDBTable[uNodeIndex].bShortSlotTime = - WLAN_GET_CAP_INFO_SHORTSLOTTIME(*sFrame.pwCapInfo); - pMgmt->sNodeDBTable[uNodeIndex].wAID = (u16)uNodeIndex; - wAssocStatus = WLAN_MGMT_STATUS_SUCCESS; - wAssocAID = (u16)uNodeIndex; - - // if suppurt ERP - if(pMgmt->sNodeDBTable[uNodeIndex].wMaxSuppRate > RATE_11M) - pMgmt->sNodeDBTable[uNodeIndex].bERPExist = true; - - if (pMgmt->sNodeDBTable[uNodeIndex].wMaxSuppRate <= RATE_11M) { - // B only STA join - pDevice->bProtectMode = true; - pDevice->bNonERPPresent = true; - } - if (pMgmt->sNodeDBTable[uNodeIndex].bShortPreamble == false) { - pDevice->bBarkerPreambleMd = true; - } - - DBG_PRT(MSG_LEVEL_INFO, KERN_INFO "Rx ReAssociate AID= %d \n", wAssocAID); - DBG_PRT(MSG_LEVEL_INFO, KERN_INFO "MAC=%2.2X:%2.2X:%2.2X:%2.2X:%2.2X:%2.2X \n", - sFrame.pHdr->sA3.abyAddr2[0], - sFrame.pHdr->sA3.abyAddr2[1], - sFrame.pHdr->sA3.abyAddr2[2], - sFrame.pHdr->sA3.abyAddr2[3], - sFrame.pHdr->sA3.abyAddr2[4], - sFrame.pHdr->sA3.abyAddr2[5] - ) ; - DBG_PRT(MSG_LEVEL_INFO, KERN_INFO "Max Support rate = %d \n", - pMgmt->sNodeDBTable[uNodeIndex].wMaxSuppRate); - - } - - // assoc response reply.. - pTxPacket = s_MgrMakeReAssocResponse - ( - pDevice, - pMgmt, - pMgmt->wCurrCapInfo, - wAssocStatus, - wAssocAID, - sFrame.pHdr->sA3.abyAddr2, - (PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates, - (PWLAN_IE_SUPP_RATES)pMgmt->abyCurrExtSuppRates - ); - - if (pTxPacket != NULL ){ - /* send the frame */ - Status = csMgmt_xmit(pDevice, pTxPacket); - if (Status != CMD_STATUS_PENDING) { - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Mgt:ReAssoc response tx failed\n"); - } - else { - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Mgt:ReAssoc response tx sending..\n"); - } - } - return; -} - -/*+ - * - * Routine Description: - * Handle incoming association response frames. - * - * Return Value: - * None. - * --*/ - -static void s_vMgrRxAssocResponse(struct vnt_private *pDevice, - struct vnt_manager *pMgmt, struct vnt_rx_mgmt *pRxPacket, - int bReAssocType) -{ - WLAN_FR_ASSOCRESP sFrame; - PWLAN_IE_SSID pItemSSID; - u8 *pbyIEs; - - if (pMgmt->eCurrState == WMAC_STATE_ASSOCPENDING || - pMgmt->eCurrState == WMAC_STATE_ASSOC) { - - sFrame.len = pRxPacket->cbMPDULen; - sFrame.pBuf = (u8 *)pRxPacket->p80211Header; - // decode the frame - vMgrDecodeAssocResponse(&sFrame); - if ((sFrame.pwCapInfo == NULL) - || (sFrame.pwStatus == NULL) - || (sFrame.pwAid == NULL) - || (sFrame.pSuppRates == NULL)) { - return; - } - - pMgmt->sAssocInfo.AssocInfo.ResponseFixedIEs.Capabilities = *(sFrame.pwCapInfo); - pMgmt->sAssocInfo.AssocInfo.ResponseFixedIEs.StatusCode = *(sFrame.pwStatus); - pMgmt->sAssocInfo.AssocInfo.ResponseFixedIEs.AssociationId = *(sFrame.pwAid); - pMgmt->sAssocInfo.AssocInfo.AvailableResponseFixedIEs |= 0x07; - - pMgmt->sAssocInfo.AssocInfo.ResponseIELength = sFrame.len - 24 - 6; - pMgmt->sAssocInfo.AssocInfo.OffsetResponseIEs = pMgmt->sAssocInfo.AssocInfo.OffsetRequestIEs + pMgmt->sAssocInfo.AssocInfo.RequestIELength; - pbyIEs = pMgmt->sAssocInfo.abyIEs; - pbyIEs += pMgmt->sAssocInfo.AssocInfo.RequestIELength; - memcpy(pbyIEs, (sFrame.pBuf + 24 +6), pMgmt->sAssocInfo.AssocInfo.ResponseIELength); - - // save values and set current BSS state - if (cpu_to_le16((*(sFrame.pwStatus))) == WLAN_MGMT_STATUS_SUCCESS ){ - // set AID - pMgmt->wCurrAID = cpu_to_le16((*(sFrame.pwAid))); - if ( (pMgmt->wCurrAID >> 14) != (BIT0 | BIT1) ) - { - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "AID from AP, has two msb clear.\n"); - } - DBG_PRT(MSG_LEVEL_INFO, KERN_INFO "Association Successful, AID=%d.\n", pMgmt->wCurrAID & ~(BIT14|BIT15)); - pMgmt->eCurrState = WMAC_STATE_ASSOC; - BSSvUpdateAPNode((void *) pDevice, - sFrame.pwCapInfo, - sFrame.pSuppRates, - sFrame.pExtSuppRates); - pItemSSID = (PWLAN_IE_SSID)pMgmt->abyCurrSSID; - DBG_PRT(MSG_LEVEL_INFO, KERN_INFO "Link with AP(SSID): %s\n", pItemSSID->abySSID); - pDevice->bLinkPass = true; - - vnt_mac_set_led(pDevice, LEDSTS_STS, LEDSTS_INTER); - - //if(pDevice->bWPASuppWextEnabled == true) - { - u8 buf[512]; - size_t len; - union iwreq_data wrqu; - int we_event; - - memset(buf, 0, 512); - - len = pMgmt->sAssocInfo.AssocInfo.RequestIELength; - if(len) { - memcpy(buf, pMgmt->sAssocInfo.abyIEs, len); - memset(&wrqu, 0, sizeof (wrqu)); - wrqu.data.length = len; - we_event = IWEVASSOCREQIE; - PRINT_K("wireless_send_event--->IWEVASSOCREQIE\n"); - wireless_send_event(pDevice->dev, we_event, &wrqu, buf); - } - - memset(buf, 0, 512); - len = pMgmt->sAssocInfo.AssocInfo.ResponseIELength; - - if(len) { - memcpy(buf, pbyIEs, len); - memset(&wrqu, 0, sizeof (wrqu)); - wrqu.data.length = len; - we_event = IWEVASSOCRESPIE; - PRINT_K("wireless_send_event--->IWEVASSOCRESPIE\n"); - wireless_send_event(pDevice->dev, we_event, &wrqu, buf); - } - - memset(&wrqu, 0, sizeof (wrqu)); - memcpy(wrqu.ap_addr.sa_data, &pMgmt->abyCurrBSSID[0], ETH_ALEN); - wrqu.ap_addr.sa_family = ARPHRD_ETHER; - PRINT_K("wireless_send_event--->SIOCGIWAP(associated)\n"); - wireless_send_event(pDevice->dev, SIOCGIWAP, &wrqu, NULL); - - } - - } - else { - if (bReAssocType) { - pMgmt->eCurrState = WMAC_STATE_IDLE; - } - else { - // jump back to the auth state and indicate the error - pMgmt->eCurrState = WMAC_STATE_AUTH; - } - s_vMgrLogStatus(pMgmt,cpu_to_le16((*(sFrame.pwStatus)))); - } - - } - -//need clear flags related to Networkmanager - pDevice->bwextstep0 = false; - pDevice->bwextstep1 = false; - pDevice->bwextstep2 = false; - pDevice->bwextstep3 = false; - pDevice->bWPASuppWextEnabled = false; - - if (pMgmt->eCurrState == WMAC_STATE_ASSOC) - schedule_delayed_work(&pDevice->run_command_work, 0); - - return; -} - -/*+ - * - * Routine Description: - * Start the station authentication procedure. Namely, send an - * authentication frame to the AP. - * - * Return Value: - * None. - * --*/ - -void vMgrAuthenBeginSta(struct vnt_private *pDevice, - struct vnt_manager *pMgmt, PCMD_STATUS pStatus) -{ - WLAN_FR_AUTHEN sFrame; - struct vnt_tx_mgmt *pTxPacket = - (struct vnt_tx_mgmt *)pMgmt->pbyMgmtPacketPool; - - memset(pTxPacket, 0, sizeof(struct vnt_tx_mgmt) - + WLAN_AUTHEN_FR_MAXLEN); - pTxPacket->p80211Header = (PUWLAN_80211HDR)((u8 *)pTxPacket - + sizeof(struct vnt_tx_mgmt)); - sFrame.pBuf = (u8 *)pTxPacket->p80211Header; - sFrame.len = WLAN_AUTHEN_FR_MAXLEN; - vMgrEncodeAuthen(&sFrame); - /* insert values */ - sFrame.pHdr->sA3.wFrameCtl = cpu_to_le16( - ( - WLAN_SET_FC_FTYPE(WLAN_TYPE_MGR) | - WLAN_SET_FC_FSTYPE(WLAN_FSTYPE_AUTHEN) - )); - memcpy( sFrame.pHdr->sA3.abyAddr1, pMgmt->abyCurrBSSID, WLAN_ADDR_LEN); - memcpy( sFrame.pHdr->sA3.abyAddr2, pMgmt->abyMACAddr, WLAN_ADDR_LEN); - memcpy( sFrame.pHdr->sA3.abyAddr3, pMgmt->abyCurrBSSID, WLAN_BSSID_LEN); - if (pMgmt->bShareKeyAlgorithm) - *(sFrame.pwAuthAlgorithm) = cpu_to_le16(WLAN_AUTH_ALG_SHAREDKEY); - else - *(sFrame.pwAuthAlgorithm) = cpu_to_le16(WLAN_AUTH_ALG_OPENSYSTEM); - - *(sFrame.pwAuthSequence) = cpu_to_le16(1); - /* Adjust the length fields */ - pTxPacket->cbMPDULen = sFrame.len; - pTxPacket->cbPayloadLen = sFrame.len - WLAN_HDR_ADDR3_LEN; - - *pStatus = csMgmt_xmit(pDevice, pTxPacket); - if (*pStatus == CMD_STATUS_PENDING){ - pMgmt->eCurrState = WMAC_STATE_AUTHPENDING; - *pStatus = CMD_STATUS_SUCCESS; - } - - return ; -} - -/*+ - * - * Routine Description: - * Start the station(AP) deauthentication procedure. Namely, send an - * deauthentication frame to the AP or Sta. - * - * Return Value: - * None. - * --*/ - -void vMgrDeAuthenBeginSta(struct vnt_private *pDevice, - struct vnt_manager *pMgmt, u8 *abyDestAddress, u16 wReason, - PCMD_STATUS pStatus) -{ - WLAN_FR_DEAUTHEN sFrame; - struct vnt_tx_mgmt *pTxPacket = - (struct vnt_tx_mgmt *)pMgmt->pbyMgmtPacketPool; - - memset(pTxPacket, 0, sizeof(struct vnt_tx_mgmt) - + WLAN_DEAUTHEN_FR_MAXLEN); - pTxPacket->p80211Header = (PUWLAN_80211HDR)((u8 *)pTxPacket - + sizeof(struct vnt_tx_mgmt)); - sFrame.pBuf = (u8 *)pTxPacket->p80211Header; - sFrame.len = WLAN_DEAUTHEN_FR_MAXLEN; - vMgrEncodeDeauthen(&sFrame); - /* insert values */ - sFrame.pHdr->sA3.wFrameCtl = cpu_to_le16( - ( - WLAN_SET_FC_FTYPE(WLAN_TYPE_MGR) | - WLAN_SET_FC_FSTYPE(WLAN_FSTYPE_DEAUTHEN) - )); - - memcpy( sFrame.pHdr->sA3.abyAddr1, abyDestAddress, WLAN_ADDR_LEN); - memcpy( sFrame.pHdr->sA3.abyAddr2, pMgmt->abyMACAddr, WLAN_ADDR_LEN); - memcpy( sFrame.pHdr->sA3.abyAddr3, pMgmt->abyCurrBSSID, WLAN_BSSID_LEN); - - *(sFrame.pwReason) = cpu_to_le16(wReason); // deauthen. bcs left BSS - /* Adjust the length fields */ - pTxPacket->cbMPDULen = sFrame.len; - pTxPacket->cbPayloadLen = sFrame.len - WLAN_HDR_ADDR3_LEN; - - *pStatus = csMgmt_xmit(pDevice, pTxPacket); - if (*pStatus == CMD_STATUS_PENDING){ - *pStatus = CMD_STATUS_SUCCESS; - } - - return ; -} - -/*+ - * - * Routine Description: - * Handle incoming authentication frames. - * - * Return Value: - * None. - * --*/ - -static void s_vMgrRxAuthentication(struct vnt_private *pDevice, - struct vnt_manager *pMgmt, struct vnt_rx_mgmt *pRxPacket) -{ - WLAN_FR_AUTHEN sFrame; - - // we better be an AP or a STA in AUTHPENDING otherwise ignore - if (!(pMgmt->eCurrMode == WMAC_MODE_ESS_AP || - pMgmt->eCurrState == WMAC_STATE_AUTHPENDING)) { - return; - } - - // decode the frame - sFrame.len = pRxPacket->cbMPDULen; - sFrame.pBuf = (u8 *)pRxPacket->p80211Header; - vMgrDecodeAuthen(&sFrame); - switch (cpu_to_le16((*(sFrame.pwAuthSequence )))){ - case 1: - //AP funciton - s_vMgrRxAuthenSequence_1(pDevice,pMgmt, &sFrame); - break; - case 2: - s_vMgrRxAuthenSequence_2(pDevice, pMgmt, &sFrame); - break; - case 3: - //AP funciton - s_vMgrRxAuthenSequence_3(pDevice, pMgmt, &sFrame); - break; - case 4: - s_vMgrRxAuthenSequence_4(pDevice, pMgmt, &sFrame); - break; - default: - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Auth Sequence error, seq = %d\n", - cpu_to_le16((*(sFrame.pwAuthSequence)))); - break; - } - return; -} - -/*+ - * - * Routine Description: - * Handles incoming authen frames with sequence 1. Currently - * assumes we're an AP. So far, no one appears to use authentication - * in Ad-Hoc mode. - * - * Return Value: - * None. - * --*/ - -static void s_vMgrRxAuthenSequence_1(struct vnt_private *pDevice, - struct vnt_manager *pMgmt, PWLAN_FR_AUTHEN pFrame) -{ - struct vnt_tx_mgmt *pTxPacket = NULL; - u32 uNodeIndex; - WLAN_FR_AUTHEN sFrame; - PSKeyItem pTransmitKey; - - /* Insert a Node entry */ - if (!BSSbIsSTAInNodeDB(pDevice, pFrame->pHdr->sA3.abyAddr2, - &uNodeIndex)) { - BSSvCreateOneNode(pDevice, &uNodeIndex); - memcpy(pMgmt->sNodeDBTable[uNodeIndex].abyMACAddr, - pFrame->pHdr->sA3.abyAddr2, WLAN_ADDR_LEN); - } - - if (pMgmt->bShareKeyAlgorithm) { - pMgmt->sNodeDBTable[uNodeIndex].eNodeState = NODE_KNOWN; - pMgmt->sNodeDBTable[uNodeIndex].byAuthSequence = 1; - } - else { - pMgmt->sNodeDBTable[uNodeIndex].eNodeState = NODE_AUTH; - } - - // send auth reply - pTxPacket = (struct vnt_tx_mgmt *)pMgmt->pbyMgmtPacketPool; - memset(pTxPacket, 0, sizeof(struct vnt_tx_mgmt) - + WLAN_AUTHEN_FR_MAXLEN); - pTxPacket->p80211Header = (PUWLAN_80211HDR)((u8 *)pTxPacket - + sizeof(struct vnt_tx_mgmt)); - sFrame.pBuf = (u8 *)pTxPacket->p80211Header; - sFrame.len = WLAN_AUTHEN_FR_MAXLEN; - // format buffer structure - vMgrEncodeAuthen(&sFrame); - // insert values - sFrame.pHdr->sA3.wFrameCtl = cpu_to_le16( - ( - WLAN_SET_FC_FTYPE(WLAN_TYPE_MGR) | - WLAN_SET_FC_FSTYPE(WLAN_FSTYPE_AUTHEN)| - WLAN_SET_FC_ISWEP(0) - )); - memcpy( sFrame.pHdr->sA3.abyAddr1, pFrame->pHdr->sA3.abyAddr2, WLAN_ADDR_LEN); - memcpy( sFrame.pHdr->sA3.abyAddr2, pMgmt->abyMACAddr, WLAN_ADDR_LEN); - memcpy( sFrame.pHdr->sA3.abyAddr3, pMgmt->abyCurrBSSID, WLAN_BSSID_LEN); - *(sFrame.pwAuthAlgorithm) = *(pFrame->pwAuthAlgorithm); - *(sFrame.pwAuthSequence) = cpu_to_le16(2); - - if (cpu_to_le16(*(pFrame->pwAuthAlgorithm)) == WLAN_AUTH_ALG_SHAREDKEY) { - if (pMgmt->bShareKeyAlgorithm) - *(sFrame.pwStatus) = cpu_to_le16(WLAN_MGMT_STATUS_SUCCESS); - else - *(sFrame.pwStatus) = cpu_to_le16(WLAN_MGMT_STATUS_UNSUPPORTED_AUTHALG); - } - else { - if (pMgmt->bShareKeyAlgorithm) - *(sFrame.pwStatus) = cpu_to_le16(WLAN_MGMT_STATUS_UNSUPPORTED_AUTHALG); - else - *(sFrame.pwStatus) = cpu_to_le16(WLAN_MGMT_STATUS_SUCCESS); - } - - if (pMgmt->bShareKeyAlgorithm && - (cpu_to_le16(*(sFrame.pwStatus)) == WLAN_MGMT_STATUS_SUCCESS)) { - - sFrame.pChallenge = (PWLAN_IE_CHALLENGE)(sFrame.pBuf + sFrame.len); - sFrame.len += WLAN_CHALLENGE_IE_LEN; - sFrame.pChallenge->byElementID = WLAN_EID_CHALLENGE; - sFrame.pChallenge->len = WLAN_CHALLENGE_LEN; - memset(pMgmt->abyChallenge, 0, WLAN_CHALLENGE_LEN); - // get group key - if(KeybGetTransmitKey(&(pDevice->sKey), pDevice->abyBroadcastAddr, GROUP_KEY, &pTransmitKey) == true) { - rc4_init(&pDevice->SBox, pDevice->abyPRNG, pTransmitKey->uKeyLength+3); - rc4_encrypt(&pDevice->SBox, pMgmt->abyChallenge, pMgmt->abyChallenge, WLAN_CHALLENGE_LEN); - } - memcpy(sFrame.pChallenge->abyChallenge, pMgmt->abyChallenge , WLAN_CHALLENGE_LEN); - } - - /* Adjust the length fields */ - pTxPacket->cbMPDULen = sFrame.len; - pTxPacket->cbPayloadLen = sFrame.len - WLAN_HDR_ADDR3_LEN; - // send the frame - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Mgt:Authreq_reply sequence_1 tx.. \n"); - if (csMgmt_xmit(pDevice, pTxPacket) != CMD_STATUS_PENDING) { - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Mgt:Authreq_reply sequence_1 tx failed.\n"); - } - return; -} - -/*+ - * - * Routine Description: - * Handles incoming auth frames with sequence number 2. Currently - * assumes we're a station. - * - * - * Return Value: - * None. - * --*/ - -static void s_vMgrRxAuthenSequence_2(struct vnt_private *pDevice, - struct vnt_manager *pMgmt, PWLAN_FR_AUTHEN pFrame) -{ - WLAN_FR_AUTHEN sFrame; - struct vnt_tx_mgmt *pTxPacket = NULL; - - switch (cpu_to_le16((*(pFrame->pwAuthAlgorithm)))) - { - case WLAN_AUTH_ALG_OPENSYSTEM: - if ( cpu_to_le16((*(pFrame->pwStatus))) == WLAN_MGMT_STATUS_SUCCESS ){ - DBG_PRT(MSG_LEVEL_INFO, KERN_INFO "802.11 Authen (OPEN) Successful.\n"); - pMgmt->eCurrState = WMAC_STATE_AUTH; - schedule_delayed_work(&pDevice->run_command_work, 0); - } - else { - DBG_PRT(MSG_LEVEL_INFO, KERN_INFO "802.11 Authen (OPEN) Failed.\n"); - s_vMgrLogStatus(pMgmt, cpu_to_le16((*(pFrame->pwStatus)))); - pMgmt->eCurrState = WMAC_STATE_IDLE; - } - if (pDevice->eCommandState == WLAN_AUTHENTICATE_WAIT) { - /* spin_unlock_irq(&pDevice->lock); - vCommandTimerWait((void *) pDevice, 0); - spin_lock_irq(&pDevice->lock); */ - } - break; - - case WLAN_AUTH_ALG_SHAREDKEY: - - if (cpu_to_le16((*(pFrame->pwStatus))) == WLAN_MGMT_STATUS_SUCCESS) { - pTxPacket = (struct vnt_tx_mgmt *) - pMgmt->pbyMgmtPacketPool; - memset(pTxPacket, 0, sizeof(struct vnt_tx_mgmt) - + WLAN_AUTHEN_FR_MAXLEN); - pTxPacket->p80211Header - = (PUWLAN_80211HDR)((u8 *)pTxPacket - + sizeof(struct vnt_tx_mgmt)); - sFrame.pBuf = (u8 *)pTxPacket->p80211Header; - sFrame.len = WLAN_AUTHEN_FR_MAXLEN; - // format buffer structure - vMgrEncodeAuthen(&sFrame); - // insert values - sFrame.pHdr->sA3.wFrameCtl = cpu_to_le16( - ( - WLAN_SET_FC_FTYPE(WLAN_TYPE_MGR) | - WLAN_SET_FC_FSTYPE(WLAN_FSTYPE_AUTHEN)| - WLAN_SET_FC_ISWEP(1) - )); - memcpy( sFrame.pHdr->sA3.abyAddr1, pMgmt->abyCurrBSSID, WLAN_BSSID_LEN); - memcpy( sFrame.pHdr->sA3.abyAddr2, pMgmt->abyMACAddr, WLAN_ADDR_LEN); - memcpy( sFrame.pHdr->sA3.abyAddr3, pMgmt->abyCurrBSSID, WLAN_BSSID_LEN); - *(sFrame.pwAuthAlgorithm) = *(pFrame->pwAuthAlgorithm); - *(sFrame.pwAuthSequence) = cpu_to_le16(3); - *(sFrame.pwStatus) = cpu_to_le16(WLAN_MGMT_STATUS_SUCCESS); - sFrame.pChallenge = (PWLAN_IE_CHALLENGE)(sFrame.pBuf + sFrame.len); - sFrame.len += WLAN_CHALLENGE_IE_LEN; - sFrame.pChallenge->byElementID = WLAN_EID_CHALLENGE; - sFrame.pChallenge->len = WLAN_CHALLENGE_LEN; - memcpy( sFrame.pChallenge->abyChallenge, pFrame->pChallenge->abyChallenge, WLAN_CHALLENGE_LEN); - // Adjust the length fields - pTxPacket->cbMPDULen = sFrame.len; - pTxPacket->cbPayloadLen = sFrame.len - WLAN_HDR_ADDR3_LEN; - // send the frame - if (csMgmt_xmit(pDevice, pTxPacket) != CMD_STATUS_PENDING) { - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Mgt:Auth_reply sequence_2 tx failed.\n"); - } - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Mgt:Auth_reply sequence_2 tx ...\n"); - } - else { - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Mgt:rx Auth_reply sequence_2 status error ...\n"); - if ( pDevice->eCommandState == WLAN_AUTHENTICATE_WAIT ) { - /* spin_unlock_irq(&pDevice->lock); - vCommandTimerWait((void *) pDevice, 0); - spin_lock_irq(&pDevice->lock); */ - } - s_vMgrLogStatus(pMgmt, cpu_to_le16((*(pFrame->pwStatus)))); - } - break; - default: - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Mgt: rx auth.seq = 2 unknown AuthAlgorithm=%d\n", cpu_to_le16((*(pFrame->pwAuthAlgorithm)))); - break; - } - return; -} - -/*+ - * - * Routine Description: - * Handles incoming authen frames with sequence 3. Currently - * assumes we're an AP. This function assumes the frame has - * already been successfully decrypted. - * - * - * Return Value: - * None. - * --*/ - -static void s_vMgrRxAuthenSequence_3(struct vnt_private *pDevice, - struct vnt_manager *pMgmt, PWLAN_FR_AUTHEN pFrame) -{ - struct vnt_tx_mgmt *pTxPacket = NULL; - u32 uStatusCode = 0 ; - u32 uNodeIndex = 0; - WLAN_FR_AUTHEN sFrame; - - if (!WLAN_GET_FC_ISWEP(pFrame->pHdr->sA3.wFrameCtl)) { - uStatusCode = WLAN_MGMT_STATUS_CHALLENGE_FAIL; - goto reply; - } - if (BSSbIsSTAInNodeDB(pDevice, pFrame->pHdr->sA3.abyAddr2, &uNodeIndex)) { - if (pMgmt->sNodeDBTable[uNodeIndex].byAuthSequence != 1) { - uStatusCode = WLAN_MGMT_STATUS_RX_AUTH_NOSEQ; - goto reply; - } - if (memcmp(pMgmt->abyChallenge, pFrame->pChallenge->abyChallenge, WLAN_CHALLENGE_LEN) != 0) { - uStatusCode = WLAN_MGMT_STATUS_CHALLENGE_FAIL; - goto reply; - } - } - else { - uStatusCode = WLAN_MGMT_STATUS_UNSPEC_FAILURE; - goto reply; - } - - if (uNodeIndex) { - pMgmt->sNodeDBTable[uNodeIndex].eNodeState = NODE_AUTH; - pMgmt->sNodeDBTable[uNodeIndex].byAuthSequence = 0; - } - uStatusCode = WLAN_MGMT_STATUS_SUCCESS; - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Challenge text check ok..\n"); - -reply: - // send auth reply - pTxPacket = (struct vnt_tx_mgmt *)pMgmt->pbyMgmtPacketPool; - memset(pTxPacket, 0, sizeof(struct vnt_tx_mgmt) - + WLAN_AUTHEN_FR_MAXLEN); - pTxPacket->p80211Header = (PUWLAN_80211HDR)((u8 *)pTxPacket - + sizeof(struct vnt_tx_mgmt)); - sFrame.pBuf = (u8 *)pTxPacket->p80211Header; - sFrame.len = WLAN_AUTHEN_FR_MAXLEN; - // format buffer structure - vMgrEncodeAuthen(&sFrame); - /* insert values */ - sFrame.pHdr->sA3.wFrameCtl = cpu_to_le16( - ( - WLAN_SET_FC_FTYPE(WLAN_TYPE_MGR) | - WLAN_SET_FC_FSTYPE(WLAN_FSTYPE_AUTHEN)| - WLAN_SET_FC_ISWEP(0) - )); - memcpy( sFrame.pHdr->sA3.abyAddr1, pFrame->pHdr->sA3.abyAddr2, WLAN_ADDR_LEN); - memcpy( sFrame.pHdr->sA3.abyAddr2, pMgmt->abyMACAddr, WLAN_ADDR_LEN); - memcpy( sFrame.pHdr->sA3.abyAddr3, pMgmt->abyCurrBSSID, WLAN_BSSID_LEN); - *(sFrame.pwAuthAlgorithm) = *(pFrame->pwAuthAlgorithm); - *(sFrame.pwAuthSequence) = cpu_to_le16(4); - *(sFrame.pwStatus) = cpu_to_le16(uStatusCode); - - /* Adjust the length fields */ - pTxPacket->cbMPDULen = sFrame.len; - pTxPacket->cbPayloadLen = sFrame.len - WLAN_HDR_ADDR3_LEN; - // send the frame - if (csMgmt_xmit(pDevice, pTxPacket) != CMD_STATUS_PENDING) { - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Mgt:Authreq_reply sequence_4 tx failed.\n"); - } - return; - -} - -/*+ - * - * Routine Description: - * Handles incoming authen frames with sequence 4 - * - * - * Return Value: - * None. - * --*/ -static void s_vMgrRxAuthenSequence_4(struct vnt_private *pDevice, - struct vnt_manager *pMgmt, PWLAN_FR_AUTHEN pFrame) -{ - - if ( cpu_to_le16((*(pFrame->pwStatus))) == WLAN_MGMT_STATUS_SUCCESS ){ - DBG_PRT(MSG_LEVEL_INFO, KERN_INFO "802.11 Authen (SHAREDKEY) Successful.\n"); - pMgmt->eCurrState = WMAC_STATE_AUTH; - schedule_delayed_work(&pDevice->run_command_work, 0); - } - else{ - DBG_PRT(MSG_LEVEL_INFO, KERN_INFO "802.11 Authen (SHAREDKEY) Failed.\n"); - s_vMgrLogStatus(pMgmt, cpu_to_le16((*(pFrame->pwStatus))) ); - pMgmt->eCurrState = WMAC_STATE_IDLE; - } - - if ( pDevice->eCommandState == WLAN_AUTHENTICATE_WAIT ) { - /* spin_unlock_irq(&pDevice->lock); - vCommandTimerWait((void *) pDevice, 0); - spin_lock_irq(&pDevice->lock); */ - } -} - -/*+ - * - * Routine Description: - * Handles incoming disassociation frames - * - * - * Return Value: - * None. - * --*/ - -static void s_vMgrRxDisassociation(struct vnt_private *pDevice, - struct vnt_manager *pMgmt, struct vnt_rx_mgmt *pRxPacket) -{ - WLAN_FR_DISASSOC sFrame; - u32 uNodeIndex = 0; - CMD_STATUS CmdStatus; - - if ( pMgmt->eCurrMode == WMAC_MODE_ESS_AP ){ - // if is acting an AP.. - // a STA is leaving this BSS.. - sFrame.len = pRxPacket->cbMPDULen; - sFrame.pBuf = (u8 *)pRxPacket->p80211Header; - if (BSSbIsSTAInNodeDB(pDevice, pRxPacket->p80211Header->sA3.abyAddr2, &uNodeIndex)) { - BSSvRemoveOneNode(pDevice, uNodeIndex); - } - else { - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Rx disassoc, sta not found\n"); - } - } - else if (pMgmt->eCurrMode == WMAC_MODE_ESS_STA ){ - sFrame.len = pRxPacket->cbMPDULen; - sFrame.pBuf = (u8 *)pRxPacket->p80211Header; - vMgrDecodeDisassociation(&sFrame); - DBG_PRT(MSG_LEVEL_NOTICE, KERN_INFO "AP disassociated me, reason=%d.\n", cpu_to_le16(*(sFrame.pwReason))); - - pDevice->fWPA_Authened = false; - - //TODO: do something let upper layer know or - //try to send associate packet again because of inactivity timeout - if (pMgmt->eCurrState == WMAC_STATE_ASSOC) { - pDevice->bLinkPass = false; - pMgmt->sNodeDBTable[0].bActive = false; - pDevice->byReAssocCount = 0; - pMgmt->eCurrState = WMAC_STATE_AUTH; // jump back to the auth state! - pDevice->eCommandState = WLAN_ASSOCIATE_WAIT; - vMgrReAssocBeginSta(pDevice, pMgmt, &CmdStatus); - if(CmdStatus == CMD_STATUS_PENDING) { - pDevice->byReAssocCount ++; - return; //mike add: you'll retry for many times, so it cann't be regarded as disconnected! - } - } - - // if(pDevice->bWPASuppWextEnabled == true) - { - union iwreq_data wrqu; - memset(&wrqu, 0, sizeof (wrqu)); - wrqu.ap_addr.sa_family = ARPHRD_ETHER; - PRINT_K("wireless_send_event--->SIOCGIWAP(disassociated)\n"); - wireless_send_event(pDevice->dev, SIOCGIWAP, &wrqu, NULL); - } - } - /* else, ignore it */ - - return; -} - -/*+ - * - * Routine Description: - * Handles incoming deauthentication frames - * - * - * Return Value: - * None. - * --*/ - -static void s_vMgrRxDeauthentication(struct vnt_private *pDevice, - struct vnt_manager *pMgmt, struct vnt_rx_mgmt *pRxPacket) -{ - WLAN_FR_DEAUTHEN sFrame; - u32 uNodeIndex = 0; - - if (pMgmt->eCurrMode == WMAC_MODE_ESS_AP ){ - //Todo: - // if is acting an AP.. - // a STA is leaving this BSS.. - sFrame.len = pRxPacket->cbMPDULen; - sFrame.pBuf = (u8 *)pRxPacket->p80211Header; - if (BSSbIsSTAInNodeDB(pDevice, pRxPacket->p80211Header->sA3.abyAddr2, &uNodeIndex)) { - BSSvRemoveOneNode(pDevice, uNodeIndex); - } - else { - DBG_PRT(MSG_LEVEL_NOTICE, KERN_INFO "Rx deauth, sta not found\n"); - } - } - else { - if (pMgmt->eCurrMode == WMAC_MODE_ESS_STA ) { - sFrame.len = pRxPacket->cbMPDULen; - sFrame.pBuf = (u8 *)pRxPacket->p80211Header; - vMgrDecodeDeauthen(&sFrame); - pDevice->fWPA_Authened = false; - DBG_PRT(MSG_LEVEL_NOTICE, KERN_INFO "AP deauthed me, reason=%d.\n", cpu_to_le16((*(sFrame.pwReason)))); - // TODO: update BSS list for specific BSSID if pre-authentication case - if (ether_addr_equal(sFrame.pHdr->sA3.abyAddr3, - pMgmt->abyCurrBSSID)) { - if (pMgmt->eCurrState >= WMAC_STATE_AUTHPENDING) { - pMgmt->sNodeDBTable[0].bActive = false; - pMgmt->eCurrMode = WMAC_MODE_STANDBY; - pMgmt->eCurrState = WMAC_STATE_IDLE; - netif_stop_queue(pDevice->dev); - pDevice->bLinkPass = false; - - vnt_mac_set_led(pDevice, LEDSTS_STS, LEDSTS_SLOW); - } - } - - // if(pDevice->bWPASuppWextEnabled == true) - { - union iwreq_data wrqu; - memset(&wrqu, 0, sizeof (wrqu)); - wrqu.ap_addr.sa_family = ARPHRD_ETHER; - PRINT_K("wireless_send_event--->SIOCGIWAP(disauthen)\n"); - wireless_send_event(pDevice->dev, SIOCGIWAP, &wrqu, NULL); - } - - } - /* else, ignore it. TODO: IBSS authentication service - would be implemented here */ - }; - return; -} - -/*+ - * - * Routine Description: - * check if current channel is match ZoneType. - *for USA:1~11; - * Japan:1~13; - * Europe:1~13 - * Return Value: - * True:exceed; - * False:normal case --*/ -static int ChannelExceedZoneType(struct vnt_private *pDevice, u8 byCurrChannel) -{ - int exceed = false; - - switch(pDevice->byZoneType) { - case 0x00: //USA:1~11 - if((byCurrChannel<1) ||(byCurrChannel>11)) - exceed = true; - break; - case 0x01: //Japan:1~13 - case 0x02: //Europe:1~13 - if((byCurrChannel<1) ||(byCurrChannel>13)) - exceed = true; - break; - default: //reserve for other zonetype - break; - } - - return exceed; -} - -/*+ - * - * Routine Description: - * Handles and analysis incoming beacon frames. - * - * - * Return Value: - * None. - * --*/ - -static void s_vMgrRxBeacon(struct vnt_private *pDevice, - struct vnt_manager *pMgmt, struct vnt_rx_mgmt *pRxPacket, - int bInScan) -{ - PKnownBSS pBSSList; - WLAN_FR_BEACON sFrame; - u64 qwTSFOffset; - int bIsBSSIDEqual = false; - int bIsSSIDEqual = false; - int bTSFLargeDiff = false; - int bTSFOffsetPostive = false; - int bUpdateTSF = false; - int bIsAPBeacon = false; - int bIsChannelEqual = false; - u32 uLocateByteIndex; - u8 byTIMBitOn = 0; - u16 wAIDNumber = 0; - u32 uNodeIndex; - u64 qwTimestamp, qwLocalTSF; - u64 qwCurrTSF; - u16 wStartIndex = 0; - u16 wAIDIndex = 0; - u8 byCurrChannel = pRxPacket->byRxChannel; - ERPObject sERP; - u32 uRateLen = WLAN_RATES_MAXLEN; - int bChannelHit = false; - u8 byOldPreambleType; - - if (pMgmt->eCurrMode == WMAC_MODE_ESS_AP) - return; - - memset(&sFrame, 0, sizeof(WLAN_FR_BEACON)); - sFrame.len = pRxPacket->cbMPDULen; - sFrame.pBuf = (u8 *)pRxPacket->p80211Header; - - // decode the beacon frame - vMgrDecodeBeacon(&sFrame); - - if ((sFrame.pwBeaconInterval == NULL) - || (sFrame.pwCapInfo == NULL) - || (sFrame.pSSID == NULL) - || (sFrame.pSuppRates == NULL)) { - - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Rx beacon frame error\n"); - return; - } - - if( byCurrChannel > CB_MAX_CHANNEL_24G ) - { - if (sFrame.pDSParms != NULL) { - if (byCurrChannel == RFaby11aChannelIndex[sFrame.pDSParms->byCurrChannel-1]) - bChannelHit = true; - byCurrChannel = RFaby11aChannelIndex[sFrame.pDSParms->byCurrChannel-1]; - } else { - bChannelHit = true; - } - - } else { - if (sFrame.pDSParms != NULL) { - if (byCurrChannel == sFrame.pDSParms->byCurrChannel) - bChannelHit = true; - byCurrChannel = sFrame.pDSParms->byCurrChannel; - } else { - bChannelHit = true; - } - } - -if(ChannelExceedZoneType(pDevice,byCurrChannel)==true) - return; - - if (sFrame.pERP != NULL) { - sERP.byERP = sFrame.pERP->byContext; - sERP.bERPExist = true; - - } else { - sERP.bERPExist = false; - sERP.byERP = 0; - } - - pBSSList = BSSpAddrIsInBSSList((void *) pDevice, - sFrame.pHdr->sA3.abyAddr3, - sFrame.pSSID); - if (pBSSList == NULL) { - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Beacon/insert: RxChannel = : %d\n", byCurrChannel); - BSSbInsertToBSSList((void *) pDevice, - sFrame.pHdr->sA3.abyAddr3, - *sFrame.pqwTimestamp, - *sFrame.pwBeaconInterval, - *sFrame.pwCapInfo, - byCurrChannel, - sFrame.pSSID, - sFrame.pSuppRates, - sFrame.pExtSuppRates, - &sERP, - sFrame.pRSN, - sFrame.pRSNWPA, - sFrame.pIE_Country, - sFrame.pIE_Quiet, - sFrame.len - WLAN_HDR_ADDR3_LEN, - sFrame.pHdr->sA4.abyAddr4, // payload of beacon - (void *) pRxPacket); - } - else { -// DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"update bcn: RxChannel = : %d\n", byCurrChannel); - BSSbUpdateToBSSList((void *) pDevice, - *sFrame.pqwTimestamp, - *sFrame.pwBeaconInterval, - *sFrame.pwCapInfo, - byCurrChannel, - bChannelHit, - sFrame.pSSID, - sFrame.pSuppRates, - sFrame.pExtSuppRates, - &sERP, - sFrame.pRSN, - sFrame.pRSNWPA, - sFrame.pIE_Country, - sFrame.pIE_Quiet, - pBSSList, - sFrame.len - WLAN_HDR_ADDR3_LEN, - sFrame.pHdr->sA4.abyAddr4, // payload of probresponse - (void *) pRxPacket); - - } - - if (bInScan) { - return; - } - - if(byCurrChannel == (u8)pMgmt->uCurrChannel) - bIsChannelEqual = true; - - if (bIsChannelEqual && (pMgmt->eCurrMode == WMAC_MODE_ESS_AP)) { - - // if rx beacon without ERP field - if (sERP.bERPExist) { - if (WLAN_GET_ERP_USE_PROTECTION(sERP.byERP)){ - pDevice->byERPFlag |= WLAN_SET_ERP_USE_PROTECTION(1); - pDevice->wUseProtectCntDown = USE_PROTECT_PERIOD; - } - } - else { - pDevice->byERPFlag |= WLAN_SET_ERP_USE_PROTECTION(1); - pDevice->wUseProtectCntDown = USE_PROTECT_PERIOD; - } - - if (pMgmt->eCurrMode == WMAC_MODE_IBSS_STA) { - if(!WLAN_GET_CAP_INFO_SHORTPREAMBLE(*sFrame.pwCapInfo)) - pDevice->byERPFlag |= WLAN_SET_ERP_BARKER_MODE(1); - if(!sERP.bERPExist) - pDevice->byERPFlag |= WLAN_SET_ERP_NONERP_PRESENT(1); - } - } - - // check if BSSID the same - if (memcmp(sFrame.pHdr->sA3.abyAddr3, - pMgmt->abyCurrBSSID, - WLAN_BSSID_LEN) == 0) { - - bIsBSSIDEqual = true; - pDevice->uCurrRSSI = pRxPacket->uRSSI; - pDevice->byCurrSQ = pRxPacket->bySQ; - if (pMgmt->sNodeDBTable[0].uInActiveCount != 0) { - pMgmt->sNodeDBTable[0].uInActiveCount = 0; - //DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"BCN:Wake Count= [%d]\n", pMgmt->wCountToWakeUp); - } - } - // check if SSID the same - if (sFrame.pSSID->len == ((PWLAN_IE_SSID)pMgmt->abyCurrSSID)->len) { - if (memcmp(sFrame.pSSID->abySSID, - ((PWLAN_IE_SSID)pMgmt->abyCurrSSID)->abySSID, - sFrame.pSSID->len - ) == 0) { - bIsSSIDEqual = true; - } - } - - if ((WLAN_GET_CAP_INFO_ESS(*sFrame.pwCapInfo)== true) && - (bIsBSSIDEqual == true) && - (bIsSSIDEqual == true) && - (pMgmt->eCurrMode == WMAC_MODE_ESS_STA) && - (pMgmt->eCurrState == WMAC_STATE_ASSOC)) { - // add state check to prevent reconnect fail since we'll receive Beacon - - bIsAPBeacon = true; - if (pBSSList != NULL) { - - // Sync ERP field - if ((pBSSList->sERP.bERPExist == true) && (pDevice->byBBType == BB_TYPE_11G)) { - if ((pBSSList->sERP.byERP & WLAN_EID_ERP_USE_PROTECTION) != pDevice->bProtectMode) {//0000 0010 - pDevice->bProtectMode = (pBSSList->sERP.byERP & WLAN_EID_ERP_USE_PROTECTION); - if (pDevice->bProtectMode) { - MACvEnableProtectMD(pDevice); - } else { - MACvDisableProtectMD(pDevice); - } - vUpdateIFS(pDevice); - } - if ((pBSSList->sERP.byERP & WLAN_EID_ERP_NONERP_PRESENT) != pDevice->bNonERPPresent) {//0000 0001 - pDevice->bNonERPPresent = (pBSSList->sERP.byERP & WLAN_EID_ERP_USE_PROTECTION); - } - if ((pBSSList->sERP.byERP & WLAN_EID_ERP_BARKER_MODE) != pDevice->bBarkerPreambleMd) {//0000 0100 - pDevice->bBarkerPreambleMd = (pBSSList->sERP.byERP & WLAN_EID_ERP_BARKER_MODE); - //BarkerPreambleMd has higher priority than shortPreamble bit in Cap - if (pDevice->bBarkerPreambleMd) { - MACvEnableBarkerPreambleMd(pDevice); - } else { - MACvDisableBarkerPreambleMd(pDevice); - } - } - } - // Sync Short Slot Time - if (WLAN_GET_CAP_INFO_SHORTSLOTTIME(pBSSList->wCapInfo) != pDevice->bShortSlotTime) { - bool bShortSlotTime; - - bShortSlotTime = WLAN_GET_CAP_INFO_SHORTSLOTTIME(pBSSList->wCapInfo); - //DBG_PRN_WLAN05(("Set Short Slot Time: %d\n", pDevice->bShortSlotTime)); - //Kyle check if it is OK to set G. - if (pDevice->byBBType == BB_TYPE_11A) { - bShortSlotTime = true; - } - else if (pDevice->byBBType == BB_TYPE_11B) { - bShortSlotTime = false; - } - if (bShortSlotTime != pDevice->bShortSlotTime) { - pDevice->bShortSlotTime = bShortSlotTime; - BBvSetShortSlotTime(pDevice); - vUpdateIFS(pDevice); - } - } - - // - // Preamble may change dynamically - // - byOldPreambleType = pDevice->byPreambleType; - if (WLAN_GET_CAP_INFO_SHORTPREAMBLE(pBSSList->wCapInfo)) { - pDevice->byPreambleType = pDevice->byShortPreamble; - } - else { - pDevice->byPreambleType = 0; - } - if (pDevice->byPreambleType != byOldPreambleType) - CARDvSetRSPINF(pDevice, (u8)pDevice->byBBType); - // - // Basic Rate Set may change dynamically - // - if (pBSSList->eNetworkTypeInUse == PHY_TYPE_11B) { - uRateLen = WLAN_RATES_MAXLEN_11B; - } - pMgmt->abyCurrSuppRates[1] = RATEuSetIE((PWLAN_IE_SUPP_RATES)pBSSList->abySuppRates, - (PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates, - uRateLen); - pMgmt->abyCurrExtSuppRates[1] = RATEuSetIE((PWLAN_IE_SUPP_RATES)pBSSList->abyExtSuppRates, - (PWLAN_IE_SUPP_RATES)pMgmt->abyCurrExtSuppRates, - uRateLen); - RATEvParseMaxRate((void *)pDevice, - (PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates, - (PWLAN_IE_SUPP_RATES)pMgmt->abyCurrExtSuppRates, - true, - &(pMgmt->sNodeDBTable[0].wMaxBasicRate), - &(pMgmt->sNodeDBTable[0].wMaxSuppRate), - &(pMgmt->sNodeDBTable[0].wSuppRate), - &(pMgmt->sNodeDBTable[0].byTopCCKBasicRate), - &(pMgmt->sNodeDBTable[0].byTopOFDMBasicRate) - ); - - } - } - -// DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Beacon 2 \n"); - // check if CF field exisit - if (WLAN_GET_CAP_INFO_ESS(*sFrame.pwCapInfo)) { - if (sFrame.pCFParms->wCFPDurRemaining > 0) { - // TODO: deal with CFP period to set NAV - } - } - - qwTimestamp = cpu_to_le64(*sFrame.pqwTimestamp); - qwLocalTSF = pRxPacket->qwLocalTSF; - - // check if beacon TSF larger or small than our local TSF - if (qwTimestamp >= qwLocalTSF) - bTSFOffsetPostive = true; - else - bTSFOffsetPostive = false; - - if (bTSFOffsetPostive) { - qwTSFOffset = CARDqGetTSFOffset(pRxPacket->byRxRate, (qwTimestamp), (qwLocalTSF)); - } - else { - qwTSFOffset = CARDqGetTSFOffset(pRxPacket->byRxRate, (qwLocalTSF), (qwTimestamp)); - } - - if (qwTSFOffset > TRIVIAL_SYNC_DIFFERENCE) - bTSFLargeDiff = true; - - // if infra mode - if (bIsAPBeacon == true) { - - // Infra mode: Local TSF always follow AP's TSF if Difference huge. - if (bTSFLargeDiff) - bUpdateTSF = true; - - if ((pDevice->bEnablePSMode == true) && (sFrame.pTIM)) { - - /* deal with DTIM, analysis TIM */ - pMgmt->bMulticastTIM = WLAN_MGMT_IS_MULTICAST_TIM(sFrame.pTIM->byBitMapCtl) ? true : false ; - pMgmt->byDTIMCount = sFrame.pTIM->byDTIMCount; - pMgmt->byDTIMPeriod = sFrame.pTIM->byDTIMPeriod; - wAIDNumber = pMgmt->wCurrAID & ~(BIT14|BIT15); - - // check if AID in TIM field bit on - // wStartIndex = N1 - wStartIndex = WLAN_MGMT_GET_TIM_OFFSET(sFrame.pTIM->byBitMapCtl) << 1; - // AIDIndex = N2 - wAIDIndex = (wAIDNumber >> 3); - if ((wAIDNumber > 0) && (wAIDIndex >= wStartIndex)) { - uLocateByteIndex = wAIDIndex - wStartIndex; - // len = byDTIMCount + byDTIMPeriod + byDTIMPeriod + byVirtBitMap[0~250] - if (sFrame.pTIM->len >= (uLocateByteIndex + 4)) { - byTIMBitOn = (0x01) << ((wAIDNumber) % 8); - pMgmt->bInTIM = sFrame.pTIM->byVirtBitMap[uLocateByteIndex] & byTIMBitOn ? true : false; - } - else { - pMgmt->bInTIM = false; - }; - } - else { - pMgmt->bInTIM = false; - }; - - if (pMgmt->bInTIM || - (pMgmt->bMulticastTIM && (pMgmt->byDTIMCount == 0))) { - pMgmt->bInTIMWake = true; - /* send out ps-poll packet */ - if (pMgmt->bInTIM) - PSvSendPSPOLL(pDevice); - - } - else { - pMgmt->bInTIMWake = false; - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "BCN: Not In TIM..\n"); - if (pDevice->bPWBitOn == false) { - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "BCN: Send Null Packet\n"); - if (PSbSendNullPacket(pDevice)) - pDevice->bPWBitOn = true; - } - if(PSbConsiderPowerDown(pDevice, false, false)) { - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "BCN: Power down now...\n"); - } - } - - } - - } - // if adhoc mode - if ((pMgmt->eCurrMode == WMAC_MODE_IBSS_STA) && !bIsAPBeacon && bIsChannelEqual) { - if (bIsBSSIDEqual) { - // Use sNodeDBTable[0].uInActiveCount as IBSS beacons received count. - if (pMgmt->sNodeDBTable[0].uInActiveCount != 0) - pMgmt->sNodeDBTable[0].uInActiveCount = 0; - - // adhoc mode:TSF updated only when beacon larger then local TSF - if (bTSFLargeDiff && bTSFOffsetPostive && - (pMgmt->eCurrState == WMAC_STATE_JOINTED)) - bUpdateTSF = true; - - // During dpc, already in spinlocked. - if (BSSbIsSTAInNodeDB(pDevice, sFrame.pHdr->sA3.abyAddr2, &uNodeIndex)) { - - // Update the STA, (Technically the Beacons of all the IBSS nodes - // should be identical, but that's not happening in practice. - pMgmt->abyCurrSuppRates[1] = RATEuSetIE((PWLAN_IE_SUPP_RATES)sFrame.pSuppRates, - (PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates, - WLAN_RATES_MAXLEN_11B); - RATEvParseMaxRate((void *)pDevice, - (PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates, - NULL, - true, - &(pMgmt->sNodeDBTable[uNodeIndex].wMaxBasicRate), - &(pMgmt->sNodeDBTable[uNodeIndex].wMaxSuppRate), - &(pMgmt->sNodeDBTable[uNodeIndex].wSuppRate), - &(pMgmt->sNodeDBTable[uNodeIndex].byTopCCKBasicRate), - &(pMgmt->sNodeDBTable[uNodeIndex].byTopOFDMBasicRate) - ); - pMgmt->sNodeDBTable[uNodeIndex].bShortPreamble = WLAN_GET_CAP_INFO_SHORTPREAMBLE(*sFrame.pwCapInfo); - pMgmt->sNodeDBTable[uNodeIndex].bShortSlotTime = WLAN_GET_CAP_INFO_SHORTSLOTTIME(*sFrame.pwCapInfo); - pMgmt->sNodeDBTable[uNodeIndex].uInActiveCount = 0; - } - else { - /* Todo, initial Node content */ - BSSvCreateOneNode(pDevice, &uNodeIndex); - - pMgmt->abyCurrSuppRates[1] = RATEuSetIE((PWLAN_IE_SUPP_RATES)sFrame.pSuppRates, - (PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates, - WLAN_RATES_MAXLEN_11B); - RATEvParseMaxRate((void *)pDevice, - (PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates, - NULL, - true, - &(pMgmt->sNodeDBTable[uNodeIndex].wMaxBasicRate), - &(pMgmt->sNodeDBTable[uNodeIndex].wMaxSuppRate), - &(pMgmt->sNodeDBTable[uNodeIndex].wSuppRate), - &(pMgmt->sNodeDBTable[uNodeIndex].byTopCCKBasicRate), - &(pMgmt->sNodeDBTable[uNodeIndex].byTopOFDMBasicRate) - ); - - memcpy(pMgmt->sNodeDBTable[uNodeIndex].abyMACAddr, sFrame.pHdr->sA3.abyAddr2, WLAN_ADDR_LEN); - pMgmt->sNodeDBTable[uNodeIndex].bShortPreamble = WLAN_GET_CAP_INFO_SHORTPREAMBLE(*sFrame.pwCapInfo); - pMgmt->sNodeDBTable[uNodeIndex].wTxDataRate = pMgmt->sNodeDBTable[uNodeIndex].wMaxSuppRate; -/* - pMgmt->sNodeDBTable[uNodeIndex].bShortSlotTime = WLAN_GET_CAP_INFO_SHORTSLOTTIME(*sFrame.pwCapInfo); - if(pMgmt->sNodeDBTable[uNodeIndex].wMaxSuppRate > RATE_11M) - pMgmt->sNodeDBTable[uNodeIndex].bERPExist = true; -*/ - } - - // if other stations jointed, indicate connect to upper layer.. - if (pMgmt->eCurrState == WMAC_STATE_STARTED) { - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Current IBSS State: [Started]........to: [Jointed] \n"); - pMgmt->eCurrState = WMAC_STATE_JOINTED; - pDevice->bLinkPass = true; - - vnt_mac_set_led(pDevice, LEDSTS_STS, LEDSTS_INTER); - - if (netif_queue_stopped(pDevice->dev)){ - netif_wake_queue(pDevice->dev); - } - pMgmt->sNodeDBTable[0].bActive = true; - pMgmt->sNodeDBTable[0].uInActiveCount = 0; - - } - } - else if (bIsSSIDEqual) { - - // See other adhoc sta with the same SSID but BSSID is different. - // adpot this vars only when TSF larger then us. - if (bTSFLargeDiff && bTSFOffsetPostive) { - // we don't support ATIM under adhoc mode - // if ( sFrame.pIBSSParms->wATIMWindow == 0) { - // adpot this vars - // TODO: check sFrame cap if privacy on, and support rate syn - memcpy(pMgmt->abyCurrBSSID, sFrame.pHdr->sA3.abyAddr3, WLAN_BSSID_LEN); - memcpy(pDevice->abyBSSID, pMgmt->abyCurrBSSID, WLAN_BSSID_LEN); - pMgmt->wCurrATIMWindow = cpu_to_le16(sFrame.pIBSSParms->wATIMWindow); - pMgmt->wCurrBeaconPeriod = cpu_to_le16(*sFrame.pwBeaconInterval); - pMgmt->abyCurrSuppRates[1] = RATEuSetIE((PWLAN_IE_SUPP_RATES)sFrame.pSuppRates, - (PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates, - WLAN_RATES_MAXLEN_11B); - // set HW beacon interval and re-synchronizing.... - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Rejoining to Other Adhoc group with same SSID........\n"); - - MACvWriteBeaconInterval(pDevice, pMgmt->wCurrBeaconPeriod); - CARDvAdjustTSF(pDevice, pRxPacket->byRxRate, qwTimestamp, pRxPacket->qwLocalTSF); - CARDvUpdateNextTBTT(pDevice, qwTimestamp, pMgmt->wCurrBeaconPeriod); - - // Turn off bssid filter to avoid filter others adhoc station which bssid is different. - MACvWriteBSSIDAddress(pDevice, pMgmt->abyCurrBSSID); - - byOldPreambleType = pDevice->byPreambleType; - if (WLAN_GET_CAP_INFO_SHORTPREAMBLE(*sFrame.pwCapInfo)) { - pDevice->byPreambleType = pDevice->byShortPreamble; - } - else { - pDevice->byPreambleType = 0; - } - if (pDevice->byPreambleType != byOldPreambleType) - CARDvSetRSPINF(pDevice, (u8)pDevice->byBBType); - - // MACvRegBitsOff(pDevice->PortOffset, MAC_REG_RCR, RCR_BSSID); - // set highest basic rate - // s_vSetHighestBasicRate(pDevice, (PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates); - // Prepare beacon frame - bMgrPrepareBeaconToSend((void *) pDevice, pMgmt); - // } - } - } - } - // endian issue ??? - // Update TSF - if (bUpdateTSF) { - CARDbGetCurrentTSF(pDevice, &qwCurrTSF); - CARDvAdjustTSF(pDevice, pRxPacket->byRxRate, qwTimestamp , pRxPacket->qwLocalTSF); - CARDbGetCurrentTSF(pDevice, &qwCurrTSF); - CARDvUpdateNextTBTT(pDevice, qwTimestamp, pMgmt->wCurrBeaconPeriod); - } - - return; -} - -/*+ - * - * Routine Description: - * Instructs the hw to create a bss using the supplied - * attributes. Note that this implementation only supports Ad-Hoc - * BSS creation. - * - * - * Return Value: - * CMD_STATUS - * --*/ - -void vMgrCreateOwnIBSS(struct vnt_private *pDevice, PCMD_STATUS pStatus) -{ - struct vnt_manager *pMgmt = &pDevice->vnt_mgmt; - u16 wMaxBasicRate; - u16 wMaxSuppRate; - u8 byTopCCKBasicRate; - u8 byTopOFDMBasicRate; - u64 qwCurrTSF = 0; - int ii; - u8 abyRATE[] = {0x82, 0x84, 0x8B, 0x96, 0x24, 0x30, 0x48, 0x6C, 0x0C, - 0x12, 0x18, 0x60}; - u8 abyCCK_RATE[] = {0x82, 0x84, 0x8B, 0x96}; - u8 abyOFDM_RATE[] = {0x0C, 0x12, 0x18, 0x24, 0x30, 0x48, 0x60, 0x6C}; - u16 wSuppRate; - - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Create Basic Service Set .......\n"); - - if (pMgmt->eConfigMode == WMAC_CONFIG_IBSS_STA) { - if ((pMgmt->eAuthenMode == WMAC_AUTH_WPANONE) && - (pDevice->eEncryptionStatus != Ndis802_11Encryption2Enabled) && - (pDevice->eEncryptionStatus != Ndis802_11Encryption3Enabled)) { - // encryption mode error - *pStatus = CMD_STATUS_FAILURE; - return; - } - } - - pMgmt->abyCurrSuppRates[0] = WLAN_EID_SUPP_RATES; - pMgmt->abyCurrExtSuppRates[0] = WLAN_EID_EXTSUPP_RATES; - - if (pMgmt->eConfigMode == WMAC_CONFIG_AP) { - pMgmt->eCurrentPHYMode = pMgmt->byAPBBType; - } else { - if (pDevice->byBBType == BB_TYPE_11G) - pMgmt->eCurrentPHYMode = PHY_TYPE_11G; - if (pDevice->byBBType == BB_TYPE_11B) - pMgmt->eCurrentPHYMode = PHY_TYPE_11B; - if (pDevice->byBBType == BB_TYPE_11A) - pMgmt->eCurrentPHYMode = PHY_TYPE_11A; - } - - if (pMgmt->eCurrentPHYMode != PHY_TYPE_11A) { - pMgmt->abyCurrSuppRates[1] = WLAN_RATES_MAXLEN_11B; - pMgmt->abyCurrExtSuppRates[1] = 0; - for (ii = 0; ii < 4; ii++) - pMgmt->abyCurrSuppRates[2+ii] = abyRATE[ii]; - } else { - pMgmt->abyCurrSuppRates[1] = 8; - pMgmt->abyCurrExtSuppRates[1] = 0; - for (ii = 0; ii < 8; ii++) - pMgmt->abyCurrSuppRates[2+ii] = abyRATE[ii]; - } - - if (pMgmt->eCurrentPHYMode == PHY_TYPE_11G) { - pMgmt->abyCurrSuppRates[1] = 8; - pMgmt->abyCurrExtSuppRates[1] = 4; - for (ii = 0; ii < 4; ii++) - pMgmt->abyCurrSuppRates[2+ii] = abyCCK_RATE[ii]; - for (ii = 4; ii < 8; ii++) - pMgmt->abyCurrSuppRates[2+ii] = abyOFDM_RATE[ii-4]; - for (ii = 0; ii < 4; ii++) - pMgmt->abyCurrExtSuppRates[2+ii] = abyOFDM_RATE[ii+4]; - } - - // Disable Protect Mode - pDevice->bProtectMode = 0; - MACvDisableProtectMD(pDevice); - - pDevice->bBarkerPreambleMd = 0; - MACvDisableBarkerPreambleMd(pDevice); - - // Kyle Test 2003.11.04 - - // set HW beacon interval - if (pMgmt->wIBSSBeaconPeriod == 0) - pMgmt->wIBSSBeaconPeriod = DEFAULT_IBSS_BI; - MACvWriteBeaconInterval(pDevice, pMgmt->wIBSSBeaconPeriod); - - CARDbGetCurrentTSF(pDevice, &qwCurrTSF); - // clear TSF counter - CARDbClearCurrentTSF(pDevice); - - // enable TSF counter - MACvRegBitsOn(pDevice,MAC_REG_TFTCTL,TFTCTL_TSFCNTREN); - // set Next TBTT - CARDvSetFirstNextTBTT(pDevice, pMgmt->wIBSSBeaconPeriod); - - pMgmt->uIBSSChannel = pDevice->uChannel; - - if (pMgmt->uIBSSChannel == 0) - pMgmt->uIBSSChannel = DEFAULT_IBSS_CHANNEL; - - // set channel and clear NAV - CARDbSetMediaChannel(pDevice, pMgmt->uIBSSChannel); - pMgmt->uCurrChannel = pMgmt->uIBSSChannel; - - pDevice->byPreambleType = pDevice->byShortPreamble; - - // set basic rate - - RATEvParseMaxRate((void *)pDevice, - (PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates, - (PWLAN_IE_SUPP_RATES)pMgmt->abyCurrExtSuppRates, true, - &wMaxBasicRate, &wMaxSuppRate, &wSuppRate, - &byTopCCKBasicRate, &byTopOFDMBasicRate); - - if (pDevice->byBBType == BB_TYPE_11A) { - pDevice->bShortSlotTime = true; - } else { - pDevice->bShortSlotTime = false; - } - BBvSetShortSlotTime(pDevice); - // vUpdateIFS() use pDevice->bShortSlotTime as parameter so it must be called - // after setting ShortSlotTime. - // CARDvSetBSSMode call vUpdateIFS() - CARDvSetBSSMode(pDevice); - - if (pMgmt->eConfigMode == WMAC_CONFIG_AP) { - MACvRegBitsOn(pDevice, MAC_REG_HOSTCR, HOSTCR_AP); - pMgmt->eCurrMode = WMAC_MODE_ESS_AP; - } - - if (pMgmt->eConfigMode == WMAC_CONFIG_IBSS_STA) { - MACvRegBitsOn(pDevice, MAC_REG_HOSTCR, HOSTCR_ADHOC); - pMgmt->eCurrMode = WMAC_MODE_IBSS_STA; - } - - // Adopt pre-configured IBSS vars to current vars - pMgmt->eCurrState = WMAC_STATE_STARTED; - pMgmt->wCurrBeaconPeriod = pMgmt->wIBSSBeaconPeriod; - pMgmt->uCurrChannel = pMgmt->uIBSSChannel; - pMgmt->wCurrATIMWindow = pMgmt->wIBSSATIMWindow; - pDevice->uCurrRSSI = 0; - pDevice->byCurrSQ = 0; - - memcpy(pMgmt->abyDesireSSID,pMgmt->abyAdHocSSID, - ((PWLAN_IE_SSID)pMgmt->abyAdHocSSID)->len + WLAN_IEHDR_LEN); - - memset(pMgmt->abyCurrSSID, 0, WLAN_IEHDR_LEN + WLAN_SSID_MAXLEN + 1); - memcpy(pMgmt->abyCurrSSID, - pMgmt->abyDesireSSID, - ((PWLAN_IE_SSID)pMgmt->abyDesireSSID)->len + WLAN_IEHDR_LEN - ); - - if (pMgmt->eCurrMode == WMAC_MODE_ESS_AP) { - // AP mode BSSID = MAC addr - memcpy(pMgmt->abyCurrBSSID, pMgmt->abyMACAddr, WLAN_ADDR_LEN); - DBG_PRT(MSG_LEVEL_INFO, KERN_INFO"AP beacon created BSSID:" - "%pM\n", pMgmt->abyCurrBSSID); - } - - if (pMgmt->eCurrMode == WMAC_MODE_IBSS_STA) { - - // BSSID selected must be randomized as spec 11.1.3 - pMgmt->abyCurrBSSID[5] = (u8)(qwCurrTSF & 0x000000ff); - pMgmt->abyCurrBSSID[4] = (u8)((qwCurrTSF & 0x0000ff00) >> 8); - pMgmt->abyCurrBSSID[3] = (u8)((qwCurrTSF & 0x00ff0000) >> 16); - pMgmt->abyCurrBSSID[2] = (u8)((qwCurrTSF & 0x00000ff0) >> 4); - pMgmt->abyCurrBSSID[1] = (u8)((qwCurrTSF & 0x000ff000) >> 12); - pMgmt->abyCurrBSSID[0] = (u8)((qwCurrTSF & 0x0ff00000) >> 20); - pMgmt->abyCurrBSSID[5] ^= pMgmt->abyMACAddr[0]; - pMgmt->abyCurrBSSID[4] ^= pMgmt->abyMACAddr[1]; - pMgmt->abyCurrBSSID[3] ^= pMgmt->abyMACAddr[2]; - pMgmt->abyCurrBSSID[2] ^= pMgmt->abyMACAddr[3]; - pMgmt->abyCurrBSSID[1] ^= pMgmt->abyMACAddr[4]; - pMgmt->abyCurrBSSID[0] ^= pMgmt->abyMACAddr[5]; - pMgmt->abyCurrBSSID[0] &= ~IEEE_ADDR_GROUP; - pMgmt->abyCurrBSSID[0] |= IEEE_ADDR_UNIVERSAL; - - DBG_PRT(MSG_LEVEL_INFO, KERN_INFO"Adhoc beacon created bssid:" - "%pM\n", pMgmt->abyCurrBSSID); - } - - // set BSSID filter - MACvWriteBSSIDAddress(pDevice, pMgmt->abyCurrBSSID); - memcpy(pDevice->abyBSSID, pMgmt->abyCurrBSSID, WLAN_ADDR_LEN); - - MACvRegBitsOn(pDevice, MAC_REG_RCR, RCR_BSSID); - pDevice->byRxMode |= RCR_BSSID; - pMgmt->bCurrBSSIDFilterOn = true; - - // Set Capability Info - pMgmt->wCurrCapInfo = 0; - - if (pMgmt->eCurrMode == WMAC_MODE_ESS_AP) { - pMgmt->wCurrCapInfo |= WLAN_SET_CAP_INFO_ESS(1); - pMgmt->byDTIMPeriod = DEFAULT_DTIM_PERIOD; - pMgmt->byDTIMCount = pMgmt->byDTIMPeriod - 1; - pDevice->op_mode = NL80211_IFTYPE_AP; - } - - if (pMgmt->eCurrMode == WMAC_MODE_IBSS_STA) { - pMgmt->wCurrCapInfo |= WLAN_SET_CAP_INFO_IBSS(1); - pDevice->op_mode = NL80211_IFTYPE_ADHOC; - } - - if (pDevice->bEncryptionEnable) { - pMgmt->wCurrCapInfo |= WLAN_SET_CAP_INFO_PRIVACY(1); - if (pMgmt->eAuthenMode == WMAC_AUTH_WPANONE) { - if (pDevice->eEncryptionStatus == Ndis802_11Encryption3Enabled) { - pMgmt->byCSSPK = KEY_CTL_CCMP; - pMgmt->byCSSGK = KEY_CTL_CCMP; - } else if (pDevice->eEncryptionStatus == Ndis802_11Encryption2Enabled) { - pMgmt->byCSSPK = KEY_CTL_TKIP; - pMgmt->byCSSGK = KEY_CTL_TKIP; - } else { - pMgmt->byCSSPK = KEY_CTL_NONE; - pMgmt->byCSSGK = KEY_CTL_WEP; - } - } else { - pMgmt->byCSSPK = KEY_CTL_WEP; - pMgmt->byCSSGK = KEY_CTL_WEP; - } - } - - pMgmt->byERPContext = 0; - - if (pDevice->byPreambleType == 1) { - pMgmt->wCurrCapInfo |= WLAN_SET_CAP_INFO_SHORTPREAMBLE(1); - } else { - pMgmt->wCurrCapInfo &= (~WLAN_SET_CAP_INFO_SHORTPREAMBLE(1)); - } - - pMgmt->eCurrState = WMAC_STATE_STARTED; - // Prepare beacon to send - if (bMgrPrepareBeaconToSend((void *) pDevice, pMgmt)) - *pStatus = CMD_STATUS_SUCCESS; - - return; -} - -/*+ - * - * Routine Description: - * Instructs wmac to join a bss using the supplied attributes. - * The arguments may the BSSID or SSID and the rest of the - * attributes are obtained from the scan result of known bss list. - * - * - * Return Value: - * None. - * --*/ - -void vMgrJoinBSSBegin(struct vnt_private *pDevice, PCMD_STATUS pStatus) -{ - struct vnt_manager *pMgmt = &pDevice->vnt_mgmt; - PKnownBSS pCurr = NULL; - int ii, uu; - PWLAN_IE_SUPP_RATES pItemRates = NULL; - PWLAN_IE_SUPP_RATES pItemExtRates = NULL; - PWLAN_IE_SSID pItemSSID; - u32 uRateLen = WLAN_RATES_MAXLEN; - u16 wMaxBasicRate = RATE_1M; - u16 wMaxSuppRate = RATE_1M; - u16 wSuppRate; - u8 byTopCCKBasicRate = RATE_1M; - u8 byTopOFDMBasicRate = RATE_1M; - u8 bShortSlotTime = false; - - for (ii = 0; ii < MAX_BSS_NUM; ii++) { - if (pMgmt->sBSSList[ii].bActive == true) - break; - } - - if (ii == MAX_BSS_NUM) { - *pStatus = CMD_STATUS_RESOURCES; - DBG_PRT(MSG_LEVEL_NOTICE, KERN_INFO "BSS finding:BSS list is empty.\n"); - return; - } - - // memset(pMgmt->abyDesireBSSID, 0, WLAN_BSSID_LEN); - // Search known BSS list for prefer BSSID or SSID - - pCurr = BSSpSearchBSSList(pDevice, - pMgmt->abyDesireBSSID, - pMgmt->abyDesireSSID, - pDevice->eConfigPHYMode - ); - - if (pCurr == NULL){ - *pStatus = CMD_STATUS_RESOURCES; - pItemSSID = (PWLAN_IE_SSID)pMgmt->abyDesireSSID; - DBG_PRT(MSG_LEVEL_NOTICE, KERN_INFO "Scanning [%s] not found, disconnected !\n", pItemSSID->abySSID); - return; - } - - DBG_PRT(MSG_LEVEL_NOTICE, KERN_INFO "AP(BSS) finding:Found a AP(BSS)..\n"); - - if (WLAN_GET_CAP_INFO_ESS(cpu_to_le16(pCurr->wCapInfo))){ - - if ((pMgmt->eAuthenMode == WMAC_AUTH_WPA) || - (pMgmt->eAuthenMode == WMAC_AUTH_WPAPSK)) { - /* - if (pDevice->eEncryptionStatus == Ndis802_11Encryption2Enabled) { - if (WPA_SearchRSN(0, WPA_TKIP, pCurr) == false) { - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"No match RSN info. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n"); - // encryption mode error - pMgmt->eCurrState = WMAC_STATE_IDLE; - return; - } - } else if (pDevice->eEncryptionStatus == Ndis802_11Encryption3Enabled) { - if (WPA_SearchRSN(0, WPA_AESCCMP, pCurr) == false) { - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"No match RSN info. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n"); - // encryption mode error - pMgmt->eCurrState = WMAC_STATE_IDLE; - return; - } - } -*/ - } - - //if(pDevice->bWPASuppWextEnabled == true) - Encyption_Rebuild(pDevice, pCurr); - - // Infrastructure BSS - s_vMgrSynchBSS(pDevice, - WMAC_MODE_ESS_STA, - pCurr, - pStatus - ); - - if (*pStatus == CMD_STATUS_SUCCESS){ - - // Adopt this BSS state vars in Mgmt Object - pMgmt->uCurrChannel = pCurr->uChannel; - - memset(pMgmt->abyCurrSuppRates, 0 , WLAN_IEHDR_LEN + WLAN_RATES_MAXLEN + 1); - memset(pMgmt->abyCurrExtSuppRates, 0 , WLAN_IEHDR_LEN + WLAN_RATES_MAXLEN + 1); - - if (pCurr->eNetworkTypeInUse == PHY_TYPE_11B) { - uRateLen = WLAN_RATES_MAXLEN_11B; - } - - pItemRates = (PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates; - pItemExtRates = (PWLAN_IE_SUPP_RATES)pMgmt->abyCurrExtSuppRates; - - // Parse Support Rate IE - pItemRates->byElementID = WLAN_EID_SUPP_RATES; - pItemRates->len = RATEuSetIE((PWLAN_IE_SUPP_RATES)pCurr->abySuppRates, - pItemRates, - uRateLen); - - // Parse Extension Support Rate IE - pItemExtRates->byElementID = WLAN_EID_EXTSUPP_RATES; - pItemExtRates->len = RATEuSetIE((PWLAN_IE_SUPP_RATES)pCurr->abyExtSuppRates, - pItemExtRates, - uRateLen); - // Stuffing Rate IE - if ((pItemExtRates->len > 0) && (pItemRates->len < 8)) { - for (ii = 0; ii < (unsigned int) (8 - pItemRates->len); ) { - pItemRates->abyRates[pItemRates->len + ii] = - pItemExtRates->abyRates[ii]; - ii++; - if (pItemExtRates->len <= ii) - break; - } - pItemRates->len += (u8)ii; - if (pItemExtRates->len - ii > 0) { - pItemExtRates->len -= (u8)ii; - for (uu = 0; uu < pItemExtRates->len; uu ++) { - pItemExtRates->abyRates[uu] = pItemExtRates->abyRates[uu + ii]; - } - } else { - pItemExtRates->len = 0; - } - } - - RATEvParseMaxRate((void *)pDevice, pItemRates, pItemExtRates, true, - &wMaxBasicRate, &wMaxSuppRate, &wSuppRate, - &byTopCCKBasicRate, &byTopOFDMBasicRate); - vUpdateIFS(pDevice); - // TODO: deal with if wCapInfo the privacy is on, but station WEP is off - // TODO: deal with if wCapInfo the PS-Pollable is on. - pMgmt->wCurrBeaconPeriod = pCurr->wBeaconInterval; - memset(pMgmt->abyCurrSSID, 0, WLAN_IEHDR_LEN + WLAN_SSID_MAXLEN + 1); - memcpy(pMgmt->abyCurrBSSID, pCurr->abyBSSID, WLAN_BSSID_LEN); - memcpy(pMgmt->abyCurrSSID, pCurr->abySSID, WLAN_IEHDR_LEN + WLAN_SSID_MAXLEN + 1); - - pMgmt->eCurrMode = WMAC_MODE_ESS_STA; - - pMgmt->eCurrState = WMAC_STATE_JOINTED; - // Adopt BSS state in Adapter Device Object - pDevice->op_mode = NL80211_IFTYPE_STATION; - memcpy(pDevice->abyBSSID, pCurr->abyBSSID, WLAN_BSSID_LEN); - - // Add current BSS to Candidate list - // This should only work for WPA2 BSS, and WPA2 BSS check must be done before. - if (pMgmt->eAuthenMode == WMAC_AUTH_WPA2) { - bool bResult = bAdd_PMKID_Candidate((void *) pDevice, - pMgmt->abyCurrBSSID, - &pCurr->sRSNCapObj); - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"bAdd_PMKID_Candidate: 1(%d)\n", bResult); - if (bResult == false) { - vFlush_PMKID_Candidate((void *) pDevice); - DBG_PRT(MSG_LEVEL_DEBUG, - KERN_INFO "vFlush_PMKID_Candidate: 4\n"); - bAdd_PMKID_Candidate((void *) pDevice, - pMgmt->abyCurrBSSID, - &pCurr->sRSNCapObj); - } - } - - // Preamble type auto-switch: if AP can receive short-preamble cap, - // we can turn on too. - if (WLAN_GET_CAP_INFO_SHORTPREAMBLE(pCurr->wCapInfo)) { - pDevice->byPreambleType = pDevice->byShortPreamble; - } - else { - pDevice->byPreambleType = 0; - } - // Change PreambleType must set RSPINF again - CARDvSetRSPINF(pDevice, (u8)pDevice->byBBType); - - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Join ESS\n"); - - if (pCurr->eNetworkTypeInUse == PHY_TYPE_11G) { - - if ((pCurr->sERP.byERP & WLAN_EID_ERP_USE_PROTECTION) != pDevice->bProtectMode) {//0000 0010 - pDevice->bProtectMode = (pCurr->sERP.byERP & WLAN_EID_ERP_USE_PROTECTION); - if (pDevice->bProtectMode) { - MACvEnableProtectMD(pDevice); - } else { - MACvDisableProtectMD(pDevice); - } - vUpdateIFS(pDevice); - } - if ((pCurr->sERP.byERP & WLAN_EID_ERP_NONERP_PRESENT) != pDevice->bNonERPPresent) {//0000 0001 - pDevice->bNonERPPresent = (pCurr->sERP.byERP & WLAN_EID_ERP_USE_PROTECTION); - } - if ((pCurr->sERP.byERP & WLAN_EID_ERP_BARKER_MODE) != pDevice->bBarkerPreambleMd) {//0000 0100 - pDevice->bBarkerPreambleMd = (pCurr->sERP.byERP & WLAN_EID_ERP_BARKER_MODE); - //BarkerPreambleMd has higher priority than shortPreamble bit in Cap - if (pDevice->bBarkerPreambleMd) { - MACvEnableBarkerPreambleMd(pDevice); - } else { - MACvDisableBarkerPreambleMd(pDevice); - } - } - } - //DBG_PRN_WLAN05(("wCapInfo: %X\n", pCurr->wCapInfo)); - if (WLAN_GET_CAP_INFO_SHORTSLOTTIME(pCurr->wCapInfo) != pDevice->bShortSlotTime) { - if (pDevice->byBBType == BB_TYPE_11A) { - bShortSlotTime = true; - } - else if (pDevice->byBBType == BB_TYPE_11B) { - bShortSlotTime = false; - } - else { - bShortSlotTime = WLAN_GET_CAP_INFO_SHORTSLOTTIME(pCurr->wCapInfo); - } - //DBG_PRN_WLAN05(("Set Short Slot Time: %d\n", pDevice->bShortSlotTime)); - if (bShortSlotTime != pDevice->bShortSlotTime) { - pDevice->bShortSlotTime = bShortSlotTime; - BBvSetShortSlotTime(pDevice); - vUpdateIFS(pDevice); - } - } - - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"End of Join AP -- A/B/G Action\n"); - } - else { - pMgmt->eCurrState = WMAC_STATE_IDLE; - }; - - } - else { - // ad-hoc mode BSS - if (pMgmt->eAuthenMode == WMAC_AUTH_WPANONE) { - - if (pDevice->eEncryptionStatus == Ndis802_11Encryption2Enabled) { -/* - if (WPA_SearchRSN(0, WPA_TKIP, pCurr) == false) { - // encryption mode error - pMgmt->eCurrState = WMAC_STATE_IDLE; - return; - } -*/ - } else if (pDevice->eEncryptionStatus == Ndis802_11Encryption3Enabled) { -/* - if (WPA_SearchRSN(0, WPA_AESCCMP, pCurr) == false) { - // encryption mode error - pMgmt->eCurrState = WMAC_STATE_IDLE; - return; - } -*/ - } else { - // encryption mode error - pMgmt->eCurrState = WMAC_STATE_IDLE; - return; - } - } - - s_vMgrSynchBSS(pDevice, - WMAC_MODE_IBSS_STA, - pCurr, - pStatus - ); - - if (*pStatus == CMD_STATUS_SUCCESS){ - // Adopt this BSS state vars in Mgmt Object - // TODO: check if CapInfo privacy on, but we don't.. - pMgmt->uCurrChannel = pCurr->uChannel; - - // Parse Support Rate IE - pMgmt->abyCurrSuppRates[0] = WLAN_EID_SUPP_RATES; - pMgmt->abyCurrSuppRates[1] = RATEuSetIE((PWLAN_IE_SUPP_RATES)pCurr->abySuppRates, - (PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates, - WLAN_RATES_MAXLEN_11B); - // set basic rate - RATEvParseMaxRate((void *)pDevice, - (PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates, - NULL, true, &wMaxBasicRate, &wMaxSuppRate, &wSuppRate, - &byTopCCKBasicRate, &byTopOFDMBasicRate); - vUpdateIFS(pDevice); - pMgmt->wCurrCapInfo = pCurr->wCapInfo; - pMgmt->wCurrBeaconPeriod = pCurr->wBeaconInterval; - memset(pMgmt->abyCurrSSID, 0, WLAN_IEHDR_LEN + WLAN_SSID_MAXLEN); - memcpy(pMgmt->abyCurrBSSID, pCurr->abyBSSID, WLAN_BSSID_LEN); - memcpy(pMgmt->abyCurrSSID, pCurr->abySSID, WLAN_IEHDR_LEN + WLAN_SSID_MAXLEN); -// pMgmt->wCurrATIMWindow = pCurr->wATIMWindow; - pMgmt->eCurrMode = WMAC_MODE_IBSS_STA; - pMgmt->eCurrState = WMAC_STATE_STARTED; - // Adopt BSS state in Adapter Device Object - pDevice->op_mode = NL80211_IFTYPE_ADHOC; - pDevice->bLinkPass = true; - - vnt_mac_set_led(pDevice, LEDSTS_STS, LEDSTS_INTER); - - memcpy(pDevice->abyBSSID, pCurr->abyBSSID, WLAN_BSSID_LEN); - - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Join IBSS ok:%pM\n", - pMgmt->abyCurrBSSID); - // Preamble type auto-switch: if AP can receive short-preamble cap, - // and if registry setting is short preamble we can turn on too. - - if (WLAN_GET_CAP_INFO_SHORTPREAMBLE(pCurr->wCapInfo)) { - pDevice->byPreambleType = pDevice->byShortPreamble; - } - else { - pDevice->byPreambleType = 0; - } - // Change PreambleType must set RSPINF again - CARDvSetRSPINF(pDevice, (u8)pDevice->byBBType); - - // Prepare beacon - bMgrPrepareBeaconToSend((void *) pDevice, pMgmt); - } - else { - pMgmt->eCurrState = WMAC_STATE_IDLE; - }; - }; - return; -} - -/*+ - * - * Routine Description: - * Set HW to synchronize a specific BSS from known BSS list. - * - * - * Return Value: - * PCM_STATUS - * --*/ -static void s_vMgrSynchBSS(struct vnt_private *pDevice, u32 uBSSMode, - PKnownBSS pCurr, PCMD_STATUS pStatus) -{ - struct vnt_manager *pMgmt = &pDevice->vnt_mgmt; - u8 abyCurrSuppRatesG[] = {WLAN_EID_SUPP_RATES, - 8, 0x02, 0x04, 0x0B, 0x16, 0x24, 0x30, 0x48, 0x6C}; - /* 1M, 2M, 5M, 11M, 18M, 24M, 36M, 54M*/ - u8 abyCurrExtSuppRatesG[] = {WLAN_EID_EXTSUPP_RATES, - 4, 0x0C, 0x12, 0x18, 0x60}; - /* 6M, 9M, 12M, 48M*/ - u8 abyCurrSuppRatesA[] = {WLAN_EID_SUPP_RATES, - 8, 0x0C, 0x12, 0x18, 0x24, 0x30, 0x48, 0x60, 0x6C}; - u8 abyCurrSuppRatesB[] = {WLAN_EID_SUPP_RATES, - 4, 0x02, 0x04, 0x0B, 0x16}; - - *pStatus = CMD_STATUS_FAILURE; - - if (s_bCipherMatch(pCurr, - pDevice->eEncryptionStatus, - &(pMgmt->byCSSPK), - &(pMgmt->byCSSGK)) == false) { - DBG_PRT(MSG_LEVEL_NOTICE, KERN_INFO "s_bCipherMatch Fail .......\n"); - return; - } - - pMgmt->pCurrBSS = pCurr; - - // if previous mode is IBSS. - if(pMgmt->eCurrMode == WMAC_MODE_IBSS_STA) { - MACvRegBitsOff(pDevice, MAC_REG_TCR, TCR_AUTOBCNTX); - } - - // Init the BSS informations - pDevice->bProtectMode = false; - MACvDisableProtectMD(pDevice); - pDevice->bBarkerPreambleMd = false; - MACvDisableBarkerPreambleMd(pDevice); - pDevice->bNonERPPresent = false; - pDevice->byPreambleType = 0; - pDevice->wBasicRate = 0; - // Set Basic Rate - CARDbAddBasicRate((void *)pDevice, RATE_1M); - - // calculate TSF offset - // TSF Offset = Received Timestamp TSF - Marked Local's TSF - CARDvAdjustTSF(pDevice, pCurr->byRxRate, pCurr->qwBSSTimestamp, pCurr->qwLocalTSF); - - // set HW beacon interval - MACvWriteBeaconInterval(pDevice, pCurr->wBeaconInterval); - - // set Next TBTT - // Next TBTT = ((local_current_TSF / beacon_interval) + 1 ) * beacon_interval - CARDvSetFirstNextTBTT(pDevice, pCurr->wBeaconInterval); - - // set BSSID - MACvWriteBSSIDAddress(pDevice, pCurr->abyBSSID); - - memcpy(pMgmt->abyCurrBSSID, pCurr->abyBSSID, 6); - - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Sync:set CurrBSSID address = " - "%pM\n", pMgmt->abyCurrBSSID); - - if (pCurr->eNetworkTypeInUse == PHY_TYPE_11A) { - if ((pDevice->eConfigPHYMode == PHY_TYPE_11A) || - (pDevice->eConfigPHYMode == PHY_TYPE_AUTO)) { - pDevice->byBBType = BB_TYPE_11A; - pMgmt->eCurrentPHYMode = PHY_TYPE_11A; - pDevice->bShortSlotTime = true; - BBvSetShortSlotTime(pDevice); - CARDvSetBSSMode(pDevice); - } else { - return; - } - } else if (pCurr->eNetworkTypeInUse == PHY_TYPE_11B) { - if ((pDevice->eConfigPHYMode == PHY_TYPE_11B) || - (pDevice->eConfigPHYMode == PHY_TYPE_11G) || - (pDevice->eConfigPHYMode == PHY_TYPE_AUTO)) { - pDevice->byBBType = BB_TYPE_11B; - pMgmt->eCurrentPHYMode = PHY_TYPE_11B; - pDevice->bShortSlotTime = false; - BBvSetShortSlotTime(pDevice); - CARDvSetBSSMode(pDevice); - } else { - return; - } - } else { - if ((pDevice->eConfigPHYMode == PHY_TYPE_11G) || - (pDevice->eConfigPHYMode == PHY_TYPE_AUTO)) { - pDevice->byBBType = BB_TYPE_11G; - pMgmt->eCurrentPHYMode = PHY_TYPE_11G; - pDevice->bShortSlotTime = true; - BBvSetShortSlotTime(pDevice); - CARDvSetBSSMode(pDevice); - } else if (pDevice->eConfigPHYMode == PHY_TYPE_11B) { - pDevice->byBBType = BB_TYPE_11B; - pDevice->bShortSlotTime = false; - BBvSetShortSlotTime(pDevice); - CARDvSetBSSMode(pDevice); - } else { - return; - } - } - - if (uBSSMode == WMAC_MODE_ESS_STA) { - MACvRegBitsOff(pDevice, MAC_REG_HOSTCR, HOSTCR_ADHOC); - MACvRegBitsOn(pDevice, MAC_REG_RCR, RCR_BSSID); - pDevice->byRxMode |= RCR_BSSID; - pMgmt->bCurrBSSIDFilterOn = true; - } - - // set channel and clear NAV - CARDbSetMediaChannel(pDevice, pCurr->uChannel); - pMgmt->uCurrChannel = pCurr->uChannel; - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "<----s_bSynchBSS Set Channel [%d]\n", pCurr->uChannel); - - if (pDevice->byBBVGACurrent != pDevice->abyBBVGA[0]) { - pDevice->byBBVGACurrent = pDevice->abyBBVGA[0]; - BBvSetVGAGainOffset(pDevice, pDevice->byBBVGACurrent); - BBvSetShortSlotTime(pDevice); - } - // - // Notes: - // 1. In Ad-hoc mode : check if received others beacon as jointed indication, - // otherwise we will start own IBSS. - // 2. In Infra mode : Supposed we already synchronized with AP right now. - - if (uBSSMode == WMAC_MODE_IBSS_STA) { - MACvRegBitsOn(pDevice, MAC_REG_HOSTCR, HOSTCR_ADHOC); - MACvRegBitsOn(pDevice, MAC_REG_RCR, RCR_BSSID); - pDevice->byRxMode |= RCR_BSSID; - pMgmt->bCurrBSSIDFilterOn = true; - } - - if (pDevice->byBBType == BB_TYPE_11A) { - memcpy(pMgmt->abyCurrSuppRates, &abyCurrSuppRatesA[0], sizeof(abyCurrSuppRatesA)); - pMgmt->abyCurrExtSuppRates[1] = 0; - } else if (pDevice->byBBType == BB_TYPE_11B) { - memcpy(pMgmt->abyCurrSuppRates, &abyCurrSuppRatesB[0], sizeof(abyCurrSuppRatesB)); - pMgmt->abyCurrExtSuppRates[1] = 0; - } else { - memcpy(pMgmt->abyCurrSuppRates, &abyCurrSuppRatesG[0], sizeof(abyCurrSuppRatesG)); - memcpy(pMgmt->abyCurrExtSuppRates, &abyCurrExtSuppRatesG[0], sizeof(abyCurrExtSuppRatesG)); - } - pMgmt->byERPContext = pCurr->sERP.byERP; - - *pStatus = CMD_STATUS_SUCCESS; - - return; -}; - -static void Encyption_Rebuild(struct vnt_private *pDevice, PKnownBSS pCurr) - { - struct vnt_manager *pMgmt = &pDevice->vnt_mgmt; - - if ((pMgmt->eAuthenMode == WMAC_AUTH_WPAPSK) || - (pMgmt->eAuthenMode == WMAC_AUTH_WPA2PSK)) { - if (pCurr->bWPAValid == true) { /*WPA-PSK */ - pMgmt->eAuthenMode = WMAC_AUTH_WPAPSK; - if(pCurr->abyPKType[0] == WPA_TKIP) { - pDevice->eEncryptionStatus = Ndis802_11Encryption2Enabled; //TKIP - PRINT_K("Encyption_Rebuild--->ssid reset config to [WPAPSK-TKIP]\n"); - } - else if(pCurr->abyPKType[0] == WPA_AESCCMP) { - pDevice->eEncryptionStatus = Ndis802_11Encryption3Enabled; //AES - PRINT_K("Encyption_Rebuild--->ssid reset config to [WPAPSK-AES]\n"); - } - } - else if(pCurr->bWPA2Valid == true) { //WPA2-PSK - pMgmt->eAuthenMode = WMAC_AUTH_WPA2PSK; - if(pCurr->abyCSSPK[0] == WLAN_11i_CSS_TKIP) { - pDevice->eEncryptionStatus = Ndis802_11Encryption2Enabled; //TKIP - PRINT_K("Encyption_Rebuild--->ssid reset config to [WPA2PSK-TKIP]\n"); - } - else if(pCurr->abyCSSPK[0] == WLAN_11i_CSS_CCMP) { - pDevice->eEncryptionStatus = Ndis802_11Encryption3Enabled; //AES - PRINT_K("Encyption_Rebuild--->ssid reset config to [WPA2PSK-AES]\n"); - } - } - } - // } - return; - } - -/*+ - * - * Routine Description: - * Format TIM field - * - * - * Return Value: - * void - * --*/ - -static void s_vMgrFormatTIM(struct vnt_manager *pMgmt, PWLAN_IE_TIM pTIM) -{ - u8 byMask[8] = {1, 2, 4, 8, 0x10, 0x20, 0x40, 0x80}; - u8 byMap; - int ii, jj; - int bStartFound = false; - int bMulticast = false; - u16 wStartIndex = 0; - u16 wEndIndex = 0; - - // Find size of partial virtual bitmap - for (ii = 0; ii < (MAX_NODE_NUM + 1); ii++) { - byMap = pMgmt->abyPSTxMap[ii]; - if (!ii) { - // Mask out the broadcast bit which is indicated separately. - bMulticast = (byMap & byMask[0]) != 0; - if(bMulticast) { - pMgmt->sNodeDBTable[0].bRxPSPoll = true; - } - byMap = 0; - } - if (byMap) { - if (!bStartFound) { - bStartFound = true; - wStartIndex = (u16)ii; - } - wEndIndex = (u16)ii; - } - } - - // Round start index down to nearest even number - wStartIndex &= ~BIT0; - - // Round end index up to nearest even number - wEndIndex = ((wEndIndex + 1) & ~BIT0); - - // Size of element payload - - pTIM->len = 3 + (wEndIndex - wStartIndex) + 1; - - // Fill in the Fixed parts of the TIM - pTIM->byDTIMCount = pMgmt->byDTIMCount; - pTIM->byDTIMPeriod = pMgmt->byDTIMPeriod; - pTIM->byBitMapCtl = (bMulticast ? TIM_MULTICAST_MASK : 0) | - (((wStartIndex >> 1) << 1) & TIM_BITMAPOFFSET_MASK); - - // Append variable part of TIM - - for (ii = wStartIndex, jj =0 ; ii <= wEndIndex; ii++, jj++) { - pTIM->byVirtBitMap[jj] = pMgmt->abyPSTxMap[ii]; - } - - // Aid = 0 don't used. - pTIM->byVirtBitMap[0] &= ~BIT0; -} - -/*+ - * - * Routine Description: - * Constructs an Beacon frame( Ad-hoc mode) - * - * - * Return Value: - * PTR to frame; or NULL on allocation failure - * --*/ - -static struct vnt_tx_mgmt *s_MgrMakeBeacon(struct vnt_private *pDevice, - struct vnt_manager *pMgmt, u16 wCurrCapInfo, u16 wCurrBeaconPeriod, - u32 uCurrChannel, u16 wCurrATIMWinodw, PWLAN_IE_SSID pCurrSSID, - u8 *pCurrBSSID, PWLAN_IE_SUPP_RATES pCurrSuppRates, - PWLAN_IE_SUPP_RATES pCurrExtSuppRates) -{ - struct vnt_tx_mgmt *pTxPacket = NULL; - WLAN_FR_BEACON sFrame; - u8 abyBroadcastAddr[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; - - /* prepare beacon frame */ - pTxPacket = (struct vnt_tx_mgmt *)pMgmt->pbyMgmtPacketPool; - memset(pTxPacket, 0, sizeof(struct vnt_tx_mgmt) - + WLAN_BEACON_FR_MAXLEN); - pTxPacket->p80211Header = (PUWLAN_80211HDR)((u8 *)pTxPacket - + sizeof(struct vnt_tx_mgmt)); - // Setup the sFrame structure. - sFrame.pBuf = (u8 *)pTxPacket->p80211Header; - sFrame.len = WLAN_BEACON_FR_MAXLEN; - vMgrEncodeBeacon(&sFrame); - // Setup the header - sFrame.pHdr->sA3.wFrameCtl = cpu_to_le16( - ( - WLAN_SET_FC_FTYPE(WLAN_TYPE_MGR) | - WLAN_SET_FC_FSTYPE(WLAN_FSTYPE_BEACON) - )); - - if (pDevice->bEnablePSMode) { - sFrame.pHdr->sA3.wFrameCtl |= cpu_to_le16((u16)WLAN_SET_FC_PWRMGT(1)); - } - - memcpy( sFrame.pHdr->sA3.abyAddr1, abyBroadcastAddr, WLAN_ADDR_LEN); - memcpy( sFrame.pHdr->sA3.abyAddr2, pMgmt->abyMACAddr, WLAN_ADDR_LEN); - memcpy( sFrame.pHdr->sA3.abyAddr3, pCurrBSSID, WLAN_BSSID_LEN); - *sFrame.pwBeaconInterval = cpu_to_le16(wCurrBeaconPeriod); - *sFrame.pwCapInfo = cpu_to_le16(wCurrCapInfo); - // Copy SSID - sFrame.pSSID = (PWLAN_IE_SSID)(sFrame.pBuf + sFrame.len); - sFrame.len += ((PWLAN_IE_SSID)pMgmt->abyCurrSSID)->len + WLAN_IEHDR_LEN; - memcpy(sFrame.pSSID, - pCurrSSID, - ((PWLAN_IE_SSID)pCurrSSID)->len + WLAN_IEHDR_LEN - ); - // Copy the rate set - sFrame.pSuppRates = (PWLAN_IE_SUPP_RATES)(sFrame.pBuf + sFrame.len); - sFrame.len += ((PWLAN_IE_SUPP_RATES)pCurrSuppRates)->len + WLAN_IEHDR_LEN; - memcpy(sFrame.pSuppRates, - pCurrSuppRates, - ((PWLAN_IE_SUPP_RATES)pCurrSuppRates)->len + WLAN_IEHDR_LEN - ); - // DS parameter - if (pDevice->byBBType != BB_TYPE_11A) { - sFrame.pDSParms = (PWLAN_IE_DS_PARMS)(sFrame.pBuf + sFrame.len); - sFrame.len += (1) + WLAN_IEHDR_LEN; - sFrame.pDSParms->byElementID = WLAN_EID_DS_PARMS; - sFrame.pDSParms->len = 1; - sFrame.pDSParms->byCurrChannel = (u8)uCurrChannel; - } - // TIM field - if (pMgmt->eCurrMode == WMAC_MODE_ESS_AP) { - sFrame.pTIM = (PWLAN_IE_TIM)(sFrame.pBuf + sFrame.len); - sFrame.pTIM->byElementID = WLAN_EID_TIM; - s_vMgrFormatTIM(pMgmt, sFrame.pTIM); - sFrame.len += (WLAN_IEHDR_LEN + sFrame.pTIM->len); - } - - if (pMgmt->eCurrMode == WMAC_MODE_IBSS_STA) { - - // IBSS parameter - sFrame.pIBSSParms = (PWLAN_IE_IBSS_PARMS)(sFrame.pBuf + sFrame.len); - sFrame.len += (2) + WLAN_IEHDR_LEN; - sFrame.pIBSSParms->byElementID = WLAN_EID_IBSS_PARMS; - sFrame.pIBSSParms->len = 2; - sFrame.pIBSSParms->wATIMWindow = wCurrATIMWinodw; - if (pMgmt->eAuthenMode == WMAC_AUTH_WPANONE) { - /* RSN parameter */ - sFrame.pRSNWPA = (PWLAN_IE_RSN_EXT)(sFrame.pBuf + sFrame.len); - sFrame.pRSNWPA->byElementID = WLAN_EID_RSN_WPA; - sFrame.pRSNWPA->len = 12; - sFrame.pRSNWPA->abyOUI[0] = 0x00; - sFrame.pRSNWPA->abyOUI[1] = 0x50; - sFrame.pRSNWPA->abyOUI[2] = 0xf2; - sFrame.pRSNWPA->abyOUI[3] = 0x01; - sFrame.pRSNWPA->wVersion = 1; - sFrame.pRSNWPA->abyMulticast[0] = 0x00; - sFrame.pRSNWPA->abyMulticast[1] = 0x50; - sFrame.pRSNWPA->abyMulticast[2] = 0xf2; - if (pDevice->eEncryptionStatus == Ndis802_11Encryption3Enabled) - sFrame.pRSNWPA->abyMulticast[3] = 0x04;//AES - else if (pDevice->eEncryptionStatus == Ndis802_11Encryption2Enabled) - sFrame.pRSNWPA->abyMulticast[3] = 0x02;//TKIP - else if (pDevice->eEncryptionStatus == Ndis802_11Encryption1Enabled) - sFrame.pRSNWPA->abyMulticast[3] = 0x01;//WEP40 - else - sFrame.pRSNWPA->abyMulticast[3] = 0x00;//NONE - - // Pairwise Key Cipher Suite - sFrame.pRSNWPA->wPKCount = 0; - // Auth Key Management Suite - *((u16 *)(sFrame.pBuf + sFrame.len + sFrame.pRSNWPA->len))=0; - sFrame.pRSNWPA->len +=2; - - // RSN Capabilites - *((u16 *)(sFrame.pBuf + sFrame.len + sFrame.pRSNWPA->len))=0; - sFrame.pRSNWPA->len +=2; - sFrame.len += sFrame.pRSNWPA->len + WLAN_IEHDR_LEN; - } - } - - if (pMgmt->eCurrentPHYMode == PHY_TYPE_11G) { - sFrame.pERP = (PWLAN_IE_ERP)(sFrame.pBuf + sFrame.len); - sFrame.len += 1 + WLAN_IEHDR_LEN; - sFrame.pERP->byElementID = WLAN_EID_ERP; - sFrame.pERP->len = 1; - sFrame.pERP->byContext = 0; - if (pDevice->bProtectMode == true) - sFrame.pERP->byContext |= WLAN_EID_ERP_USE_PROTECTION; - if (pDevice->bNonERPPresent == true) - sFrame.pERP->byContext |= WLAN_EID_ERP_NONERP_PRESENT; - if (pDevice->bBarkerPreambleMd == true) - sFrame.pERP->byContext |= WLAN_EID_ERP_BARKER_MODE; - } - if (((PWLAN_IE_SUPP_RATES)pCurrExtSuppRates)->len != 0) { - sFrame.pExtSuppRates = (PWLAN_IE_SUPP_RATES)(sFrame.pBuf + sFrame.len); - sFrame.len += ((PWLAN_IE_SUPP_RATES)pCurrExtSuppRates)->len + WLAN_IEHDR_LEN; - memcpy(sFrame.pExtSuppRates, - pCurrExtSuppRates, - ((PWLAN_IE_SUPP_RATES)pCurrExtSuppRates)->len + WLAN_IEHDR_LEN - ); - } - - /* Adjust the length fields */ - pTxPacket->cbMPDULen = sFrame.len; - pTxPacket->cbPayloadLen = sFrame.len - WLAN_HDR_ADDR3_LEN; - - return pTxPacket; -} - -/*+ - * - * Routine Description: - * Constructs an Prob-response frame - * - * - * Return Value: - * PTR to frame; or NULL on allocation failure - * --*/ - -static struct vnt_tx_mgmt *s_MgrMakeProbeResponse(struct vnt_private *pDevice, - struct vnt_manager *pMgmt, u16 wCurrCapInfo, u16 wCurrBeaconPeriod, - u32 uCurrChannel, u16 wCurrATIMWinodw, u8 *pDstAddr, - PWLAN_IE_SSID pCurrSSID, u8 *pCurrBSSID, - PWLAN_IE_SUPP_RATES pCurrSuppRates, - PWLAN_IE_SUPP_RATES pCurrExtSuppRates, u8 byPHYType) -{ - struct vnt_tx_mgmt *pTxPacket = NULL; - WLAN_FR_PROBERESP sFrame; - - pTxPacket = (struct vnt_tx_mgmt *)pMgmt->pbyMgmtPacketPool; - memset(pTxPacket, 0, sizeof(struct vnt_tx_mgmt) - + WLAN_PROBERESP_FR_MAXLEN); - pTxPacket->p80211Header = (PUWLAN_80211HDR)((u8 *)pTxPacket - + sizeof(struct vnt_tx_mgmt)); - // Setup the sFrame structure. - sFrame.pBuf = (u8 *)pTxPacket->p80211Header; - sFrame.len = WLAN_PROBERESP_FR_MAXLEN; - vMgrEncodeProbeResponse(&sFrame); - // Setup the header - sFrame.pHdr->sA3.wFrameCtl = cpu_to_le16( - ( - WLAN_SET_FC_FTYPE(WLAN_TYPE_MGR) | - WLAN_SET_FC_FSTYPE(WLAN_FSTYPE_PROBERESP) - )); - memcpy( sFrame.pHdr->sA3.abyAddr1, pDstAddr, WLAN_ADDR_LEN); - memcpy( sFrame.pHdr->sA3.abyAddr2, pMgmt->abyMACAddr, WLAN_ADDR_LEN); - memcpy( sFrame.pHdr->sA3.abyAddr3, pCurrBSSID, WLAN_BSSID_LEN); - *sFrame.pwBeaconInterval = cpu_to_le16(wCurrBeaconPeriod); - *sFrame.pwCapInfo = cpu_to_le16(wCurrCapInfo); - - if (byPHYType == BB_TYPE_11B) { - *sFrame.pwCapInfo &= cpu_to_le16((u16)~(WLAN_SET_CAP_INFO_SHORTSLOTTIME(1))); - } - - // Copy SSID - sFrame.pSSID = (PWLAN_IE_SSID)(sFrame.pBuf + sFrame.len); - sFrame.len += ((PWLAN_IE_SSID)pMgmt->abyCurrSSID)->len + WLAN_IEHDR_LEN; - memcpy(sFrame.pSSID, - pCurrSSID, - ((PWLAN_IE_SSID)pCurrSSID)->len + WLAN_IEHDR_LEN - ); - // Copy the rate set - sFrame.pSuppRates = (PWLAN_IE_SUPP_RATES)(sFrame.pBuf + sFrame.len); - - sFrame.len += ((PWLAN_IE_SUPP_RATES)pCurrSuppRates)->len + WLAN_IEHDR_LEN; - memcpy(sFrame.pSuppRates, - pCurrSuppRates, - ((PWLAN_IE_SUPP_RATES)pCurrSuppRates)->len + WLAN_IEHDR_LEN - ); - - // DS parameter - if (pDevice->byBBType != BB_TYPE_11A) { - sFrame.pDSParms = (PWLAN_IE_DS_PARMS)(sFrame.pBuf + sFrame.len); - sFrame.len += (1) + WLAN_IEHDR_LEN; - sFrame.pDSParms->byElementID = WLAN_EID_DS_PARMS; - sFrame.pDSParms->len = 1; - sFrame.pDSParms->byCurrChannel = (u8)uCurrChannel; - } - - if (pMgmt->eCurrMode != WMAC_MODE_ESS_AP) { - // IBSS parameter - sFrame.pIBSSParms = (PWLAN_IE_IBSS_PARMS)(sFrame.pBuf + sFrame.len); - sFrame.len += (2) + WLAN_IEHDR_LEN; - sFrame.pIBSSParms->byElementID = WLAN_EID_IBSS_PARMS; - sFrame.pIBSSParms->len = 2; - sFrame.pIBSSParms->wATIMWindow = 0; - } - if (pDevice->byBBType == BB_TYPE_11G) { - sFrame.pERP = (PWLAN_IE_ERP)(sFrame.pBuf + sFrame.len); - sFrame.len += 1 + WLAN_IEHDR_LEN; - sFrame.pERP->byElementID = WLAN_EID_ERP; - sFrame.pERP->len = 1; - sFrame.pERP->byContext = 0; - if (pDevice->bProtectMode == true) - sFrame.pERP->byContext |= WLAN_EID_ERP_USE_PROTECTION; - if (pDevice->bNonERPPresent == true) - sFrame.pERP->byContext |= WLAN_EID_ERP_NONERP_PRESENT; - if (pDevice->bBarkerPreambleMd == true) - sFrame.pERP->byContext |= WLAN_EID_ERP_BARKER_MODE; - } - - if (((PWLAN_IE_SUPP_RATES)pCurrExtSuppRates)->len != 0) { - sFrame.pExtSuppRates = (PWLAN_IE_SUPP_RATES)(sFrame.pBuf + sFrame.len); - sFrame.len += ((PWLAN_IE_SUPP_RATES)pCurrExtSuppRates)->len + WLAN_IEHDR_LEN; - memcpy(sFrame.pExtSuppRates, - pCurrExtSuppRates, - ((PWLAN_IE_SUPP_RATES)pCurrExtSuppRates)->len + WLAN_IEHDR_LEN - ); - } - - // Adjust the length fields - pTxPacket->cbMPDULen = sFrame.len; - pTxPacket->cbPayloadLen = sFrame.len - WLAN_HDR_ADDR3_LEN; - - return pTxPacket; -} - -/*+ - * - * Routine Description: - * Constructs an association request frame - * - * - * Return Value: - * A ptr to frame or NULL on allocation failure - * --*/ - -static struct vnt_tx_mgmt *s_MgrMakeAssocRequest(struct vnt_private *pDevice, - struct vnt_manager *pMgmt, u8 *pDAddr, u16 wCurrCapInfo, - u16 wListenInterval, - PWLAN_IE_SSID pCurrSSID, - PWLAN_IE_SUPP_RATES pCurrRates, - PWLAN_IE_SUPP_RATES pCurrExtSuppRates) -{ - struct vnt_tx_mgmt *pTxPacket = NULL; - WLAN_FR_ASSOCREQ sFrame; - u8 *pbyIEs; - u8 *pbyRSN; - - pTxPacket = (struct vnt_tx_mgmt *)pMgmt->pbyMgmtPacketPool; - memset(pTxPacket, 0, sizeof(struct vnt_tx_mgmt) - + WLAN_ASSOCREQ_FR_MAXLEN); - pTxPacket->p80211Header = (PUWLAN_80211HDR)((u8 *)pTxPacket - + sizeof(struct vnt_tx_mgmt)); - // Setup the sFrame structure. - sFrame.pBuf = (u8 *)pTxPacket->p80211Header; - sFrame.len = WLAN_ASSOCREQ_FR_MAXLEN; - // format fixed field frame structure - vMgrEncodeAssocRequest(&sFrame); - // Setup the header - sFrame.pHdr->sA3.wFrameCtl = cpu_to_le16( - ( - WLAN_SET_FC_FTYPE(WLAN_TYPE_MGR) | - WLAN_SET_FC_FSTYPE(WLAN_FSTYPE_ASSOCREQ) - )); - memcpy( sFrame.pHdr->sA3.abyAddr1, pDAddr, WLAN_ADDR_LEN); - memcpy( sFrame.pHdr->sA3.abyAddr2, pMgmt->abyMACAddr, WLAN_ADDR_LEN); - memcpy( sFrame.pHdr->sA3.abyAddr3, pMgmt->abyCurrBSSID, WLAN_BSSID_LEN); - - // Set the capability and listen interval - *(sFrame.pwCapInfo) = cpu_to_le16(wCurrCapInfo); - *(sFrame.pwListenInterval) = cpu_to_le16(wListenInterval); - - // sFrame.len point to end of fixed field - sFrame.pSSID = (PWLAN_IE_SSID)(sFrame.pBuf + sFrame.len); - sFrame.len += pCurrSSID->len + WLAN_IEHDR_LEN; - memcpy(sFrame.pSSID, pCurrSSID, pCurrSSID->len + WLAN_IEHDR_LEN); - - pMgmt->sAssocInfo.AssocInfo.RequestIELength = pCurrSSID->len + WLAN_IEHDR_LEN; - pMgmt->sAssocInfo.AssocInfo.OffsetRequestIEs = sizeof(NDIS_802_11_ASSOCIATION_INFORMATION); - pbyIEs = pMgmt->sAssocInfo.abyIEs; - memcpy(pbyIEs, pCurrSSID, pCurrSSID->len + WLAN_IEHDR_LEN); - pbyIEs += pCurrSSID->len + WLAN_IEHDR_LEN; - - // Copy the rate set - sFrame.pSuppRates = (PWLAN_IE_SUPP_RATES)(sFrame.pBuf + sFrame.len); - if ((pDevice->byBBType == BB_TYPE_11B) && (pCurrRates->len > 4)) - sFrame.len += 4 + WLAN_IEHDR_LEN; - else - sFrame.len += pCurrRates->len + WLAN_IEHDR_LEN; - memcpy(sFrame.pSuppRates, pCurrRates, pCurrRates->len + WLAN_IEHDR_LEN); - - // Copy the extension rate set - if ((pDevice->byBBType == BB_TYPE_11G) && (pCurrExtSuppRates->len > 0)) { - sFrame.pExtSuppRates = (PWLAN_IE_SUPP_RATES)(sFrame.pBuf + sFrame.len); - sFrame.len += pCurrExtSuppRates->len + WLAN_IEHDR_LEN; - memcpy(sFrame.pExtSuppRates, pCurrExtSuppRates, pCurrExtSuppRates->len + WLAN_IEHDR_LEN); - } - - pMgmt->sAssocInfo.AssocInfo.RequestIELength += pCurrRates->len + WLAN_IEHDR_LEN; - memcpy(pbyIEs, pCurrRates, pCurrRates->len + WLAN_IEHDR_LEN); - pbyIEs += pCurrRates->len + WLAN_IEHDR_LEN; - - if (((pMgmt->eAuthenMode == WMAC_AUTH_WPA) || - (pMgmt->eAuthenMode == WMAC_AUTH_WPAPSK) || - (pMgmt->eAuthenMode == WMAC_AUTH_WPANONE)) && - (pMgmt->pCurrBSS != NULL)) { - /* WPA IE */ - sFrame.pRSNWPA = (PWLAN_IE_RSN_EXT)(sFrame.pBuf + sFrame.len); - sFrame.pRSNWPA->byElementID = WLAN_EID_RSN_WPA; - sFrame.pRSNWPA->len = 16; - sFrame.pRSNWPA->abyOUI[0] = 0x00; - sFrame.pRSNWPA->abyOUI[1] = 0x50; - sFrame.pRSNWPA->abyOUI[2] = 0xf2; - sFrame.pRSNWPA->abyOUI[3] = 0x01; - sFrame.pRSNWPA->wVersion = 1; - //Group Key Cipher Suite - sFrame.pRSNWPA->abyMulticast[0] = 0x00; - sFrame.pRSNWPA->abyMulticast[1] = 0x50; - sFrame.pRSNWPA->abyMulticast[2] = 0xf2; - if (pMgmt->byCSSGK == KEY_CTL_WEP) { - sFrame.pRSNWPA->abyMulticast[3] = pMgmt->pCurrBSS->byGKType; - } else if (pMgmt->byCSSGK == KEY_CTL_TKIP) { - sFrame.pRSNWPA->abyMulticast[3] = WPA_TKIP; - } else if (pMgmt->byCSSGK == KEY_CTL_CCMP) { - sFrame.pRSNWPA->abyMulticast[3] = WPA_AESCCMP; - } else { - sFrame.pRSNWPA->abyMulticast[3] = WPA_NONE; - } - // Pairwise Key Cipher Suite - sFrame.pRSNWPA->wPKCount = 1; - sFrame.pRSNWPA->PKSList[0].abyOUI[0] = 0x00; - sFrame.pRSNWPA->PKSList[0].abyOUI[1] = 0x50; - sFrame.pRSNWPA->PKSList[0].abyOUI[2] = 0xf2; - if (pMgmt->byCSSPK == KEY_CTL_TKIP) { - sFrame.pRSNWPA->PKSList[0].abyOUI[3] = WPA_TKIP; - } else if (pMgmt->byCSSPK == KEY_CTL_CCMP) { - sFrame.pRSNWPA->PKSList[0].abyOUI[3] = WPA_AESCCMP; - } else { - sFrame.pRSNWPA->PKSList[0].abyOUI[3] = WPA_NONE; - } - // Auth Key Management Suite - pbyRSN = (u8 *)(sFrame.pBuf + sFrame.len + 2 + sFrame.pRSNWPA->len); - *pbyRSN++=0x01; - *pbyRSN++=0x00; - *pbyRSN++=0x00; - - *pbyRSN++=0x50; - *pbyRSN++=0xf2; - if (pMgmt->eAuthenMode == WMAC_AUTH_WPAPSK) { - *pbyRSN++=WPA_AUTH_PSK; - } - else if (pMgmt->eAuthenMode == WMAC_AUTH_WPA) { - *pbyRSN++=WPA_AUTH_IEEE802_1X; - } - else { - *pbyRSN++=WPA_NONE; - } - - sFrame.pRSNWPA->len +=6; - - // RSN Capabilites - - *pbyRSN++=0x00; - *pbyRSN++=0x00; - sFrame.pRSNWPA->len +=2; - - sFrame.len += sFrame.pRSNWPA->len + WLAN_IEHDR_LEN; - // copy to AssocInfo. for OID_802_11_ASSOCIATION_INFORMATION - pMgmt->sAssocInfo.AssocInfo.RequestIELength += sFrame.pRSNWPA->len + WLAN_IEHDR_LEN; - memcpy(pbyIEs, sFrame.pRSNWPA, sFrame.pRSNWPA->len + WLAN_IEHDR_LEN); - pbyIEs += sFrame.pRSNWPA->len + WLAN_IEHDR_LEN; - - } else if (((pMgmt->eAuthenMode == WMAC_AUTH_WPA2) || - (pMgmt->eAuthenMode == WMAC_AUTH_WPA2PSK)) && - (pMgmt->pCurrBSS != NULL)) { - unsigned int ii; - u16 * pwPMKID; - - // WPA IE - sFrame.pRSN = (PWLAN_IE_RSN)(sFrame.pBuf + sFrame.len); - sFrame.pRSN->byElementID = WLAN_EID_RSN; - sFrame.pRSN->len = 6; //Version(2)+GK(4) - sFrame.pRSN->wVersion = 1; - //Group Key Cipher Suite - sFrame.pRSN->abyRSN[0] = 0x00; - sFrame.pRSN->abyRSN[1] = 0x0F; - sFrame.pRSN->abyRSN[2] = 0xAC; - if (pMgmt->byCSSGK == KEY_CTL_WEP) { - sFrame.pRSN->abyRSN[3] = pMgmt->pCurrBSS->byCSSGK; - } else if (pMgmt->byCSSGK == KEY_CTL_TKIP) { - sFrame.pRSN->abyRSN[3] = WLAN_11i_CSS_TKIP; - } else if (pMgmt->byCSSGK == KEY_CTL_CCMP) { - sFrame.pRSN->abyRSN[3] = WLAN_11i_CSS_CCMP; - } else { - sFrame.pRSN->abyRSN[3] = WLAN_11i_CSS_UNKNOWN; - } - - // Pairwise Key Cipher Suite - sFrame.pRSN->abyRSN[4] = 1; - sFrame.pRSN->abyRSN[5] = 0; - sFrame.pRSN->abyRSN[6] = 0x00; - sFrame.pRSN->abyRSN[7] = 0x0F; - sFrame.pRSN->abyRSN[8] = 0xAC; - if (pMgmt->byCSSPK == KEY_CTL_TKIP) { - sFrame.pRSN->abyRSN[9] = WLAN_11i_CSS_TKIP; - } else if (pMgmt->byCSSPK == KEY_CTL_CCMP) { - sFrame.pRSN->abyRSN[9] = WLAN_11i_CSS_CCMP; - } else if (pMgmt->byCSSPK == KEY_CTL_NONE) { - sFrame.pRSN->abyRSN[9] = WLAN_11i_CSS_USE_GROUP; - } else { - sFrame.pRSN->abyRSN[9] = WLAN_11i_CSS_UNKNOWN; - } - sFrame.pRSN->len += 6; - - // Auth Key Management Suite - sFrame.pRSN->abyRSN[10] = 1; - sFrame.pRSN->abyRSN[11] = 0; - sFrame.pRSN->abyRSN[12] = 0x00; - sFrame.pRSN->abyRSN[13] = 0x0F; - sFrame.pRSN->abyRSN[14] = 0xAC; - if (pMgmt->eAuthenMode == WMAC_AUTH_WPA2PSK) { - sFrame.pRSN->abyRSN[15] = WLAN_11i_AKMSS_PSK; - } else if (pMgmt->eAuthenMode == WMAC_AUTH_WPA2) { - sFrame.pRSN->abyRSN[15] = WLAN_11i_AKMSS_802_1X; - } else { - sFrame.pRSN->abyRSN[15] = WLAN_11i_AKMSS_UNKNOWN; - } - sFrame.pRSN->len +=6; - - // RSN Capabilites - if (pMgmt->pCurrBSS->sRSNCapObj.bRSNCapExist == true) { - memcpy(&sFrame.pRSN->abyRSN[16], &pMgmt->pCurrBSS->sRSNCapObj.wRSNCap, 2); - } else { - sFrame.pRSN->abyRSN[16] = 0; - sFrame.pRSN->abyRSN[17] = 0; - } - sFrame.pRSN->len +=2; - - if ((pDevice->gsPMKID.BSSIDInfoCount > 0) && (pDevice->bRoaming == true) && (pMgmt->eAuthenMode == WMAC_AUTH_WPA2)) { - // RSN PMKID - pbyRSN = &sFrame.pRSN->abyRSN[18]; - pwPMKID = (u16 *)pbyRSN; // Point to PMKID count - *pwPMKID = 0; // Initialize PMKID count - pbyRSN += 2; // Point to PMKID list - for (ii = 0; ii < pDevice->gsPMKID.BSSIDInfoCount; ii++) { - if (!memcmp(&pDevice->gsPMKID.BSSIDInfo[ii].BSSID[0], - pMgmt->abyCurrBSSID, - ETH_ALEN)) { - (*pwPMKID)++; - memcpy(pbyRSN, - pDevice->gsPMKID.BSSIDInfo[ii].PMKID, - 16); - pbyRSN += 16; - } - } - if (*pwPMKID != 0) { - sFrame.pRSN->len += (2 + (*pwPMKID)*16); - } - } - - sFrame.len += sFrame.pRSN->len + WLAN_IEHDR_LEN; - // copy to AssocInfo. for OID_802_11_ASSOCIATION_INFORMATION - pMgmt->sAssocInfo.AssocInfo.RequestIELength += sFrame.pRSN->len + WLAN_IEHDR_LEN; - memcpy(pbyIEs, sFrame.pRSN, sFrame.pRSN->len + WLAN_IEHDR_LEN); - pbyIEs += sFrame.pRSN->len + WLAN_IEHDR_LEN; - } - - // Adjust the length fields - pTxPacket->cbMPDULen = sFrame.len; - pTxPacket->cbPayloadLen = sFrame.len - WLAN_HDR_ADDR3_LEN; - return pTxPacket; -} - -/*+ - * - * Routine Description: - * Constructs an re-association request frame - * - * - * Return Value: - * A ptr to frame or NULL on allocation failure - * --*/ - -static struct vnt_tx_mgmt *s_MgrMakeReAssocRequest(struct vnt_private *pDevice, - struct vnt_manager *pMgmt, u8 *pDAddr, u16 wCurrCapInfo, - u16 wListenInterval, PWLAN_IE_SSID pCurrSSID, - PWLAN_IE_SUPP_RATES pCurrRates, - PWLAN_IE_SUPP_RATES pCurrExtSuppRates) -{ - struct vnt_tx_mgmt *pTxPacket = NULL; - WLAN_FR_REASSOCREQ sFrame; - u8 *pbyIEs; - u8 *pbyRSN; - - pTxPacket = (struct vnt_tx_mgmt *)pMgmt->pbyMgmtPacketPool; - memset(pTxPacket, 0, sizeof(struct vnt_tx_mgmt) - + WLAN_REASSOCREQ_FR_MAXLEN); - pTxPacket->p80211Header = (PUWLAN_80211HDR)((u8 *)pTxPacket - + sizeof(struct vnt_tx_mgmt)); - /* Setup the sFrame structure. */ - sFrame.pBuf = (u8 *)pTxPacket->p80211Header; - sFrame.len = WLAN_REASSOCREQ_FR_MAXLEN; - - // format fixed field frame structure - vMgrEncodeReassocRequest(&sFrame); - - /* Setup the header */ - sFrame.pHdr->sA3.wFrameCtl = cpu_to_le16( - ( - WLAN_SET_FC_FTYPE(WLAN_TYPE_MGR) | - WLAN_SET_FC_FSTYPE(WLAN_FSTYPE_REASSOCREQ) - )); - memcpy( sFrame.pHdr->sA3.abyAddr1, pDAddr, WLAN_ADDR_LEN); - memcpy( sFrame.pHdr->sA3.abyAddr2, pMgmt->abyMACAddr, WLAN_ADDR_LEN); - memcpy( sFrame.pHdr->sA3.abyAddr3, pMgmt->abyCurrBSSID, WLAN_BSSID_LEN); - - /* Set the capability and listen interval */ - *(sFrame.pwCapInfo) = cpu_to_le16(wCurrCapInfo); - *(sFrame.pwListenInterval) = cpu_to_le16(wListenInterval); - - memcpy(sFrame.pAddrCurrAP, pMgmt->abyCurrBSSID, WLAN_BSSID_LEN); - /* Copy the SSID */ - /* sFrame.len point to end of fixed field */ - sFrame.pSSID = (PWLAN_IE_SSID)(sFrame.pBuf + sFrame.len); - sFrame.len += pCurrSSID->len + WLAN_IEHDR_LEN; - memcpy(sFrame.pSSID, pCurrSSID, pCurrSSID->len + WLAN_IEHDR_LEN); - - pMgmt->sAssocInfo.AssocInfo.RequestIELength = pCurrSSID->len + WLAN_IEHDR_LEN; - pMgmt->sAssocInfo.AssocInfo.OffsetRequestIEs = sizeof(NDIS_802_11_ASSOCIATION_INFORMATION); - pbyIEs = pMgmt->sAssocInfo.abyIEs; - memcpy(pbyIEs, pCurrSSID, pCurrSSID->len + WLAN_IEHDR_LEN); - pbyIEs += pCurrSSID->len + WLAN_IEHDR_LEN; - - /* Copy the rate set */ - /* sFrame.len point to end of SSID */ - sFrame.pSuppRates = (PWLAN_IE_SUPP_RATES)(sFrame.pBuf + sFrame.len); - sFrame.len += pCurrRates->len + WLAN_IEHDR_LEN; - memcpy(sFrame.pSuppRates, pCurrRates, pCurrRates->len + WLAN_IEHDR_LEN); - - // Copy the extension rate set - if ((pMgmt->eCurrentPHYMode == PHY_TYPE_11G) && (pCurrExtSuppRates->len > 0)) { - sFrame.pExtSuppRates = (PWLAN_IE_SUPP_RATES)(sFrame.pBuf + sFrame.len); - sFrame.len += pCurrExtSuppRates->len + WLAN_IEHDR_LEN; - memcpy(sFrame.pExtSuppRates, pCurrExtSuppRates, pCurrExtSuppRates->len + WLAN_IEHDR_LEN); - } - - pMgmt->sAssocInfo.AssocInfo.RequestIELength += pCurrRates->len + WLAN_IEHDR_LEN; - memcpy(pbyIEs, pCurrRates, pCurrRates->len + WLAN_IEHDR_LEN); - pbyIEs += pCurrRates->len + WLAN_IEHDR_LEN; - - if (((pMgmt->eAuthenMode == WMAC_AUTH_WPA) || - (pMgmt->eAuthenMode == WMAC_AUTH_WPAPSK) || - (pMgmt->eAuthenMode == WMAC_AUTH_WPANONE)) && - (pMgmt->pCurrBSS != NULL)) { - /* WPA IE */ - sFrame.pRSNWPA = (PWLAN_IE_RSN_EXT)(sFrame.pBuf + sFrame.len); - sFrame.pRSNWPA->byElementID = WLAN_EID_RSN_WPA; - sFrame.pRSNWPA->len = 16; - sFrame.pRSNWPA->abyOUI[0] = 0x00; - sFrame.pRSNWPA->abyOUI[1] = 0x50; - sFrame.pRSNWPA->abyOUI[2] = 0xf2; - sFrame.pRSNWPA->abyOUI[3] = 0x01; - sFrame.pRSNWPA->wVersion = 1; - //Group Key Cipher Suite - sFrame.pRSNWPA->abyMulticast[0] = 0x00; - sFrame.pRSNWPA->abyMulticast[1] = 0x50; - sFrame.pRSNWPA->abyMulticast[2] = 0xf2; - if (pMgmt->byCSSGK == KEY_CTL_WEP) { - sFrame.pRSNWPA->abyMulticast[3] = pMgmt->pCurrBSS->byGKType; - } else if (pMgmt->byCSSGK == KEY_CTL_TKIP) { - sFrame.pRSNWPA->abyMulticast[3] = WPA_TKIP; - } else if (pMgmt->byCSSGK == KEY_CTL_CCMP) { - sFrame.pRSNWPA->abyMulticast[3] = WPA_AESCCMP; - } else { - sFrame.pRSNWPA->abyMulticast[3] = WPA_NONE; - } - // Pairwise Key Cipher Suite - sFrame.pRSNWPA->wPKCount = 1; - sFrame.pRSNWPA->PKSList[0].abyOUI[0] = 0x00; - sFrame.pRSNWPA->PKSList[0].abyOUI[1] = 0x50; - sFrame.pRSNWPA->PKSList[0].abyOUI[2] = 0xf2; - if (pMgmt->byCSSPK == KEY_CTL_TKIP) { - sFrame.pRSNWPA->PKSList[0].abyOUI[3] = WPA_TKIP; - } else if (pMgmt->byCSSPK == KEY_CTL_CCMP) { - sFrame.pRSNWPA->PKSList[0].abyOUI[3] = WPA_AESCCMP; - } else { - sFrame.pRSNWPA->PKSList[0].abyOUI[3] = WPA_NONE; - } - // Auth Key Management Suite - pbyRSN = (u8 *)(sFrame.pBuf + sFrame.len + 2 + sFrame.pRSNWPA->len); - *pbyRSN++=0x01; - *pbyRSN++=0x00; - *pbyRSN++=0x00; - - *pbyRSN++=0x50; - *pbyRSN++=0xf2; - if (pMgmt->eAuthenMode == WMAC_AUTH_WPAPSK) { - *pbyRSN++=WPA_AUTH_PSK; - } else if (pMgmt->eAuthenMode == WMAC_AUTH_WPA) { - *pbyRSN++=WPA_AUTH_IEEE802_1X; - } else { - *pbyRSN++=WPA_NONE; - } - - sFrame.pRSNWPA->len +=6; - - // RSN Capabilites - *pbyRSN++=0x00; - *pbyRSN++=0x00; - sFrame.pRSNWPA->len +=2; - - sFrame.len += sFrame.pRSNWPA->len + WLAN_IEHDR_LEN; - // copy to AssocInfo. for OID_802_11_ASSOCIATION_INFORMATION - pMgmt->sAssocInfo.AssocInfo.RequestIELength += sFrame.pRSNWPA->len + WLAN_IEHDR_LEN; - memcpy(pbyIEs, sFrame.pRSNWPA, sFrame.pRSNWPA->len + WLAN_IEHDR_LEN); - pbyIEs += sFrame.pRSNWPA->len + WLAN_IEHDR_LEN; - - } else if (((pMgmt->eAuthenMode == WMAC_AUTH_WPA2) || - (pMgmt->eAuthenMode == WMAC_AUTH_WPA2PSK)) && - (pMgmt->pCurrBSS != NULL)) { - unsigned int ii; - u16 * pwPMKID; - - /* WPA IE */ - sFrame.pRSN = (PWLAN_IE_RSN)(sFrame.pBuf + sFrame.len); - sFrame.pRSN->byElementID = WLAN_EID_RSN; - sFrame.pRSN->len = 6; //Version(2)+GK(4) - sFrame.pRSN->wVersion = 1; - //Group Key Cipher Suite - sFrame.pRSN->abyRSN[0] = 0x00; - sFrame.pRSN->abyRSN[1] = 0x0F; - sFrame.pRSN->abyRSN[2] = 0xAC; - if (pMgmt->byCSSGK == KEY_CTL_WEP) { - sFrame.pRSN->abyRSN[3] = pMgmt->pCurrBSS->byCSSGK; - } else if (pMgmt->byCSSGK == KEY_CTL_TKIP) { - sFrame.pRSN->abyRSN[3] = WLAN_11i_CSS_TKIP; - } else if (pMgmt->byCSSGK == KEY_CTL_CCMP) { - sFrame.pRSN->abyRSN[3] = WLAN_11i_CSS_CCMP; - } else { - sFrame.pRSN->abyRSN[3] = WLAN_11i_CSS_UNKNOWN; - } - - // Pairwise Key Cipher Suite - sFrame.pRSN->abyRSN[4] = 1; - sFrame.pRSN->abyRSN[5] = 0; - sFrame.pRSN->abyRSN[6] = 0x00; - sFrame.pRSN->abyRSN[7] = 0x0F; - sFrame.pRSN->abyRSN[8] = 0xAC; - if (pMgmt->byCSSPK == KEY_CTL_TKIP) { - sFrame.pRSN->abyRSN[9] = WLAN_11i_CSS_TKIP; - } else if (pMgmt->byCSSPK == KEY_CTL_CCMP) { - sFrame.pRSN->abyRSN[9] = WLAN_11i_CSS_CCMP; - } else if (pMgmt->byCSSPK == KEY_CTL_NONE) { - sFrame.pRSN->abyRSN[9] = WLAN_11i_CSS_USE_GROUP; - } else { - sFrame.pRSN->abyRSN[9] = WLAN_11i_CSS_UNKNOWN; - } - sFrame.pRSN->len += 6; - - // Auth Key Management Suite - sFrame.pRSN->abyRSN[10] = 1; - sFrame.pRSN->abyRSN[11] = 0; - sFrame.pRSN->abyRSN[12] = 0x00; - sFrame.pRSN->abyRSN[13] = 0x0F; - sFrame.pRSN->abyRSN[14] = 0xAC; - if (pMgmt->eAuthenMode == WMAC_AUTH_WPA2PSK) { - sFrame.pRSN->abyRSN[15] = WLAN_11i_AKMSS_PSK; - } else if (pMgmt->eAuthenMode == WMAC_AUTH_WPA2) { - sFrame.pRSN->abyRSN[15] = WLAN_11i_AKMSS_802_1X; - } else { - sFrame.pRSN->abyRSN[15] = WLAN_11i_AKMSS_UNKNOWN; - } - sFrame.pRSN->len +=6; - - // RSN Capabilites - if (pMgmt->pCurrBSS->sRSNCapObj.bRSNCapExist == true) { - memcpy(&sFrame.pRSN->abyRSN[16], &pMgmt->pCurrBSS->sRSNCapObj.wRSNCap, 2); - } else { - sFrame.pRSN->abyRSN[16] = 0; - sFrame.pRSN->abyRSN[17] = 0; - } - sFrame.pRSN->len +=2; - - if ((pDevice->gsPMKID.BSSIDInfoCount > 0) && (pDevice->bRoaming == true) && (pMgmt->eAuthenMode == WMAC_AUTH_WPA2)) { - // RSN PMKID - pbyRSN = &sFrame.pRSN->abyRSN[18]; - pwPMKID = (u16 *)pbyRSN; // Point to PMKID count - *pwPMKID = 0; // Initialize PMKID count - pbyRSN += 2; // Point to PMKID list - for (ii = 0; ii < pDevice->gsPMKID.BSSIDInfoCount; ii++) { - if (!memcmp(&pDevice->gsPMKID.BSSIDInfo[ii].BSSID[0], - pMgmt->abyCurrBSSID, - ETH_ALEN)) { - (*pwPMKID)++; - memcpy(pbyRSN, - pDevice->gsPMKID.BSSIDInfo[ii].PMKID, - 16); - pbyRSN += 16; - } - } - if (*pwPMKID != 0) { - sFrame.pRSN->len += (2 + (*pwPMKID)*16); - } - } - - sFrame.len += sFrame.pRSN->len + WLAN_IEHDR_LEN; - // copy to AssocInfo. for OID_802_11_ASSOCIATION_INFORMATION - pMgmt->sAssocInfo.AssocInfo.RequestIELength += sFrame.pRSN->len + WLAN_IEHDR_LEN; - memcpy(pbyIEs, sFrame.pRSN, sFrame.pRSN->len + WLAN_IEHDR_LEN); - pbyIEs += sFrame.pRSN->len + WLAN_IEHDR_LEN; - } - - /* Adjust the length fields */ - pTxPacket->cbMPDULen = sFrame.len; - pTxPacket->cbPayloadLen = sFrame.len - WLAN_HDR_ADDR3_LEN; - - return pTxPacket; -} - -/*+ - * - * Routine Description: - * Constructs an assoc-response frame - * - * - * Return Value: - * PTR to frame; or NULL on allocation failure - * --*/ - -static struct vnt_tx_mgmt *s_MgrMakeAssocResponse(struct vnt_private *pDevice, - struct vnt_manager *pMgmt, u16 wCurrCapInfo, u16 wAssocStatus, - u16 wAssocAID, u8 *pDstAddr, PWLAN_IE_SUPP_RATES pCurrSuppRates, - PWLAN_IE_SUPP_RATES pCurrExtSuppRates) -{ - struct vnt_tx_mgmt *pTxPacket = NULL; - WLAN_FR_ASSOCRESP sFrame; - - pTxPacket = (struct vnt_tx_mgmt *)pMgmt->pbyMgmtPacketPool; - memset(pTxPacket, 0, sizeof(struct vnt_tx_mgmt) - + WLAN_ASSOCREQ_FR_MAXLEN); - pTxPacket->p80211Header = (PUWLAN_80211HDR)((u8 *)pTxPacket - + sizeof(struct vnt_tx_mgmt)); - // Setup the sFrame structure - sFrame.pBuf = (u8 *)pTxPacket->p80211Header; - sFrame.len = WLAN_REASSOCRESP_FR_MAXLEN; - vMgrEncodeAssocResponse(&sFrame); - // Setup the header - sFrame.pHdr->sA3.wFrameCtl = cpu_to_le16( - ( - WLAN_SET_FC_FTYPE(WLAN_TYPE_MGR) | - WLAN_SET_FC_FSTYPE(WLAN_FSTYPE_ASSOCRESP) - )); - memcpy( sFrame.pHdr->sA3.abyAddr1, pDstAddr, WLAN_ADDR_LEN); - memcpy( sFrame.pHdr->sA3.abyAddr2, pMgmt->abyMACAddr, WLAN_ADDR_LEN); - memcpy( sFrame.pHdr->sA3.abyAddr3, pMgmt->abyCurrBSSID, WLAN_BSSID_LEN); - - *sFrame.pwCapInfo = cpu_to_le16(wCurrCapInfo); - *sFrame.pwStatus = cpu_to_le16(wAssocStatus); - *sFrame.pwAid = cpu_to_le16((u16)(wAssocAID | BIT14 | BIT15)); - - // Copy the rate set - sFrame.pSuppRates = (PWLAN_IE_SUPP_RATES)(sFrame.pBuf + sFrame.len); - sFrame.len += ((PWLAN_IE_SUPP_RATES)pCurrSuppRates)->len + WLAN_IEHDR_LEN; - memcpy(sFrame.pSuppRates, - pCurrSuppRates, - ((PWLAN_IE_SUPP_RATES)pCurrSuppRates)->len + WLAN_IEHDR_LEN - ); - - if (((PWLAN_IE_SUPP_RATES)pCurrExtSuppRates)->len != 0) { - sFrame.pExtSuppRates = (PWLAN_IE_SUPP_RATES)(sFrame.pBuf + sFrame.len); - sFrame.len += ((PWLAN_IE_SUPP_RATES)pCurrExtSuppRates)->len + WLAN_IEHDR_LEN; - memcpy(sFrame.pExtSuppRates, - pCurrExtSuppRates, - ((PWLAN_IE_SUPP_RATES)pCurrExtSuppRates)->len + WLAN_IEHDR_LEN - ); - } - - // Adjust the length fields - pTxPacket->cbMPDULen = sFrame.len; - pTxPacket->cbPayloadLen = sFrame.len - WLAN_HDR_ADDR3_LEN; - - return pTxPacket; -} - -/*+ - * - * Routine Description: - * Constructs an reassoc-response frame - * - * - * Return Value: - * PTR to frame; or NULL on allocation failure - * --*/ - -static struct vnt_tx_mgmt *s_MgrMakeReAssocResponse(struct vnt_private *pDevice, - struct vnt_manager *pMgmt, u16 wCurrCapInfo, u16 wAssocStatus, - u16 wAssocAID, u8 *pDstAddr, PWLAN_IE_SUPP_RATES pCurrSuppRates, - PWLAN_IE_SUPP_RATES pCurrExtSuppRates) -{ - struct vnt_tx_mgmt *pTxPacket = NULL; - WLAN_FR_REASSOCRESP sFrame; - - pTxPacket = (struct vnt_tx_mgmt *)pMgmt->pbyMgmtPacketPool; - memset(pTxPacket, 0, sizeof(struct vnt_tx_mgmt) - + WLAN_ASSOCREQ_FR_MAXLEN); - pTxPacket->p80211Header = (PUWLAN_80211HDR)((u8 *)pTxPacket - + sizeof(struct vnt_tx_mgmt)); - // Setup the sFrame structure - sFrame.pBuf = (u8 *)pTxPacket->p80211Header; - sFrame.len = WLAN_REASSOCRESP_FR_MAXLEN; - vMgrEncodeReassocResponse(&sFrame); - // Setup the header - sFrame.pHdr->sA3.wFrameCtl = cpu_to_le16( - ( - WLAN_SET_FC_FTYPE(WLAN_TYPE_MGR) | - WLAN_SET_FC_FSTYPE(WLAN_FSTYPE_REASSOCRESP) - )); - memcpy( sFrame.pHdr->sA3.abyAddr1, pDstAddr, WLAN_ADDR_LEN); - memcpy( sFrame.pHdr->sA3.abyAddr2, pMgmt->abyMACAddr, WLAN_ADDR_LEN); - memcpy( sFrame.pHdr->sA3.abyAddr3, pMgmt->abyCurrBSSID, WLAN_BSSID_LEN); - - *sFrame.pwCapInfo = cpu_to_le16(wCurrCapInfo); - *sFrame.pwStatus = cpu_to_le16(wAssocStatus); - *sFrame.pwAid = cpu_to_le16((u16)(wAssocAID | BIT14 | BIT15)); - - // Copy the rate set - sFrame.pSuppRates = (PWLAN_IE_SUPP_RATES)(sFrame.pBuf + sFrame.len); - sFrame.len += ((PWLAN_IE_SUPP_RATES)pCurrSuppRates)->len + WLAN_IEHDR_LEN; - memcpy(sFrame.pSuppRates, - pCurrSuppRates, - ((PWLAN_IE_SUPP_RATES)pCurrSuppRates)->len + WLAN_IEHDR_LEN - ); - - if (((PWLAN_IE_SUPP_RATES)pCurrExtSuppRates)->len != 0) { - sFrame.pExtSuppRates = (PWLAN_IE_SUPP_RATES)(sFrame.pBuf + sFrame.len); - sFrame.len += ((PWLAN_IE_SUPP_RATES)pCurrExtSuppRates)->len + WLAN_IEHDR_LEN; - memcpy(sFrame.pExtSuppRates, - pCurrExtSuppRates, - ((PWLAN_IE_SUPP_RATES)pCurrExtSuppRates)->len + WLAN_IEHDR_LEN - ); - } - - // Adjust the length fields - pTxPacket->cbMPDULen = sFrame.len; - pTxPacket->cbPayloadLen = sFrame.len - WLAN_HDR_ADDR3_LEN; - - return pTxPacket; -} - -/*+ - * - * Routine Description: - * Handles probe response management frames. - * - * - * Return Value: - * none. - * --*/ - -static void s_vMgrRxProbeResponse(struct vnt_private *pDevice, - struct vnt_manager *pMgmt, struct vnt_rx_mgmt *pRxPacket) -{ - PKnownBSS pBSSList = NULL; - WLAN_FR_PROBERESP sFrame; - u8 byCurrChannel = pRxPacket->byRxChannel; - ERPObject sERP; - int bChannelHit = true; - - memset(&sFrame, 0, sizeof(WLAN_FR_PROBERESP)); - // decode the frame - sFrame.len = pRxPacket->cbMPDULen; - sFrame.pBuf = (u8 *)pRxPacket->p80211Header; - vMgrDecodeProbeResponse(&sFrame); - - if ((sFrame.pqwTimestamp == NULL) - || (sFrame.pwBeaconInterval == NULL) - || (sFrame.pwCapInfo == NULL) - || (sFrame.pSSID == NULL) - || (sFrame.pSuppRates == NULL)) { - - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Probe resp:Fail addr:[%p]\n", - pRxPacket->p80211Header); - return; - } - - if(sFrame.pSSID->len == 0) - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Rx Probe resp: SSID len = 0 \n"); - - //{{ RobertYu:20050201, 11a byCurrChannel != sFrame.pDSParms->byCurrChannel mapping - if( byCurrChannel > CB_MAX_CHANNEL_24G ) - { - if (sFrame.pDSParms) { - if (byCurrChannel == - RFaby11aChannelIndex[sFrame.pDSParms->byCurrChannel-1]) - bChannelHit = true; - byCurrChannel = - RFaby11aChannelIndex[sFrame.pDSParms->byCurrChannel-1]; - } else { - bChannelHit = true; - } - } else { - if (sFrame.pDSParms) { - if (byCurrChannel == sFrame.pDSParms->byCurrChannel) - bChannelHit = true; - byCurrChannel = sFrame.pDSParms->byCurrChannel; - } else { - bChannelHit = true; - } - } - //RobertYu:20050201 - -if(ChannelExceedZoneType(pDevice,byCurrChannel)==true) - return; - - if (sFrame.pERP) { - sERP.byERP = sFrame.pERP->byContext; - sERP.bERPExist = true; - } else { - sERP.bERPExist = false; - sERP.byERP = 0; - } - - // update or insert the bss - pBSSList = BSSpAddrIsInBSSList((void *) pDevice, - sFrame.pHdr->sA3.abyAddr3, - sFrame.pSSID); - if (pBSSList) { - BSSbUpdateToBSSList((void *) pDevice, - *sFrame.pqwTimestamp, - *sFrame.pwBeaconInterval, - *sFrame.pwCapInfo, - byCurrChannel, - bChannelHit, - sFrame.pSSID, - sFrame.pSuppRates, - sFrame.pExtSuppRates, - &sERP, - sFrame.pRSN, - sFrame.pRSNWPA, - sFrame.pIE_Country, - sFrame.pIE_Quiet, - pBSSList, - sFrame.len - WLAN_HDR_ADDR3_LEN, - /* payload of probresponse */ - sFrame.pHdr->sA4.abyAddr4, - (void *) pRxPacket); - } else { - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Probe resp/insert: RxChannel = : %d\n", byCurrChannel); - BSSbInsertToBSSList((void *) pDevice, - sFrame.pHdr->sA3.abyAddr3, - *sFrame.pqwTimestamp, - *sFrame.pwBeaconInterval, - *sFrame.pwCapInfo, - byCurrChannel, - sFrame.pSSID, - sFrame.pSuppRates, - sFrame.pExtSuppRates, - &sERP, - sFrame.pRSN, - sFrame.pRSNWPA, - sFrame.pIE_Country, - sFrame.pIE_Quiet, - sFrame.len - WLAN_HDR_ADDR3_LEN, - sFrame.pHdr->sA4.abyAddr4, /* payload of beacon */ - (void *) pRxPacket); - } - return; - -} - -/*+ - * - * Routine Description:(AP)or(Ad-hoc STA) - * Handles probe request management frames. - * - * - * Return Value: - * none. - * --*/ - -static void s_vMgrRxProbeRequest(struct vnt_private *pDevice, - struct vnt_manager *pMgmt, struct vnt_rx_mgmt *pRxPacket) -{ - WLAN_FR_PROBEREQ sFrame; - CMD_STATUS Status; - struct vnt_tx_mgmt *pTxPacket; - u8 byPHYType = BB_TYPE_11B; - - // STA in Ad-hoc mode: when latest TBTT beacon transmit success, - // STA have to response this request. - if ((pMgmt->eCurrMode == WMAC_MODE_ESS_AP) || - ((pMgmt->eCurrMode == WMAC_MODE_IBSS_STA) && pDevice->bBeaconSent)) { - - memset(&sFrame, 0, sizeof(WLAN_FR_PROBEREQ)); - // decode the frame - sFrame.len = pRxPacket->cbMPDULen; - sFrame.pBuf = (u8 *)pRxPacket->p80211Header; - vMgrDecodeProbeRequest(&sFrame); -/* - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Probe request rx:MAC addr:%pM\n", - sFrame.pHdr->sA3.abyAddr2); -*/ - if (sFrame.pSSID->len != 0) { - if (sFrame.pSSID->len != ((PWLAN_IE_SSID)pMgmt->abyCurrSSID)->len) - return; - if (memcmp(sFrame.pSSID->abySSID, - ((PWLAN_IE_SSID)pMgmt->abyCurrSSID)->abySSID, - ((PWLAN_IE_SSID)pMgmt->abyCurrSSID)->len) != 0) { - return; - } - } - - if ((sFrame.pSuppRates->len > 4) || (sFrame.pExtSuppRates != NULL)) { - byPHYType = BB_TYPE_11G; - } - - // Probe response reply.. - pTxPacket = s_MgrMakeProbeResponse - ( - pDevice, - pMgmt, - pMgmt->wCurrCapInfo, - pMgmt->wCurrBeaconPeriod, - pMgmt->uCurrChannel, - 0, - sFrame.pHdr->sA3.abyAddr2, - (PWLAN_IE_SSID)pMgmt->abyCurrSSID, - (u8 *)pMgmt->abyCurrBSSID, - (PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates, - (PWLAN_IE_SUPP_RATES)pMgmt->abyCurrExtSuppRates, - byPHYType - ); - if (pTxPacket != NULL ){ - /* send the frame */ - Status = csMgmt_xmit(pDevice, pTxPacket); - if (Status != CMD_STATUS_PENDING) { - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Mgt:Probe response tx failed\n"); - } - else { -// DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Mgt:Probe response tx sending..\n"); - } - } - } - - return; -} - -/*+ - * - * Routine Description: - * - * Entry point for the reception and handling of 802.11 management - * frames. Makes a determination of the frame type and then calls - * the appropriate function. - * - * - * Return Value: - * none. - * --*/ - -void vMgrRxManagePacket(struct vnt_private *pDevice, struct vnt_manager *pMgmt, - struct vnt_rx_mgmt *pRxPacket) -{ - int bInScan = false; - u32 uNodeIndex = 0; - NODE_STATE eNodeState = 0; - CMD_STATUS Status; - - if (pMgmt->eCurrMode == WMAC_MODE_ESS_AP) { - if (BSSbIsSTAInNodeDB(pDevice, pRxPacket->p80211Header->sA3.abyAddr2, &uNodeIndex)) - eNodeState = pMgmt->sNodeDBTable[uNodeIndex].eNodeState; - } - - switch( WLAN_GET_FC_FSTYPE((pRxPacket->p80211Header->sA3.wFrameCtl)) ){ - - case WLAN_FSTYPE_ASSOCREQ: - // Frame Clase = 2 - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "rx assocreq\n"); - if ((pMgmt->eCurrMode == WMAC_MODE_ESS_AP) && - (eNodeState < NODE_AUTH)) { - // send deauth notification - // reason = (6) class 2 received from nonauth sta - vMgrDeAuthenBeginSta(pDevice, - pMgmt, - pRxPacket->p80211Header->sA3.abyAddr2, - (6), - &Status - ); - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "wmgr: send vMgrDeAuthenBeginSta 1\n"); - } - else { - s_vMgrRxAssocRequest(pDevice, pMgmt, pRxPacket, uNodeIndex); - } - break; - - case WLAN_FSTYPE_ASSOCRESP: - // Frame Clase = 2 - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "rx assocresp1\n"); - s_vMgrRxAssocResponse(pDevice, pMgmt, pRxPacket, false); - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "rx assocresp2\n"); - break; - - case WLAN_FSTYPE_REASSOCREQ: - // Frame Clase = 2 - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "rx reassocreq\n"); - // Todo: reassoc - if ((pMgmt->eCurrMode == WMAC_MODE_ESS_AP) && - (eNodeState < NODE_AUTH)) { - // send deauth notification - // reason = (6) class 2 received from nonauth sta - vMgrDeAuthenBeginSta(pDevice, - pMgmt, - pRxPacket->p80211Header->sA3.abyAddr2, - (6), - &Status - ); - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "wmgr: send vMgrDeAuthenBeginSta 2\n"); - - } - s_vMgrRxReAssocRequest(pDevice, pMgmt, pRxPacket, uNodeIndex); - break; - - case WLAN_FSTYPE_REASSOCRESP: - // Frame Clase = 2 - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "rx reassocresp\n"); - s_vMgrRxAssocResponse(pDevice, pMgmt, pRxPacket, true); - break; - - case WLAN_FSTYPE_PROBEREQ: - // Frame Clase = 0 - //DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "rx probereq\n"); - s_vMgrRxProbeRequest(pDevice, pMgmt, pRxPacket); - break; - - case WLAN_FSTYPE_PROBERESP: - // Frame Clase = 0 - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "rx proberesp\n"); - - s_vMgrRxProbeResponse(pDevice, pMgmt, pRxPacket); - break; - - case WLAN_FSTYPE_BEACON: - // Frame Clase = 0 - //DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "rx beacon\n"); - if (pMgmt->eScanState != WMAC_NO_SCANNING) { - bInScan = true; - } - s_vMgrRxBeacon(pDevice, pMgmt, pRxPacket, bInScan); - break; - - case WLAN_FSTYPE_ATIM: - // Frame Clase = 1 - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "rx atim\n"); - break; - - case WLAN_FSTYPE_DISASSOC: - // Frame Clase = 2 - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "rx disassoc\n"); - if ((pMgmt->eCurrMode == WMAC_MODE_ESS_AP) && - (eNodeState < NODE_AUTH)) { - // send deauth notification - // reason = (6) class 2 received from nonauth sta - vMgrDeAuthenBeginSta(pDevice, - pMgmt, - pRxPacket->p80211Header->sA3.abyAddr2, - (6), - &Status - ); - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "wmgr: send vMgrDeAuthenBeginSta 3\n"); - } - s_vMgrRxDisassociation(pDevice, pMgmt, pRxPacket); - break; - - case WLAN_FSTYPE_AUTHEN: - // Frame Clase = 1 - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "rx authen\n"); - s_vMgrRxAuthentication(pDevice, pMgmt, pRxPacket); - break; - - case WLAN_FSTYPE_DEAUTHEN: - // Frame Clase = 1 - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "rx deauthen\n"); - s_vMgrRxDeauthentication(pDevice, pMgmt, pRxPacket); - break; - - default: - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "rx unknown mgmt\n"); - } - - return; -} - -/*+ - * - * Routine Description: - * - * - * Prepare beacon to send - * - * Return Value: - * true if success; false if failed. - * --*/ -int bMgrPrepareBeaconToSend(struct vnt_private *pDevice, - struct vnt_manager *pMgmt) -{ - struct vnt_tx_mgmt *pTxPacket; - unsigned long flags; - -// pDevice->bBeaconBufReady = false; - if (pDevice->bEncryptionEnable) - pMgmt->wCurrCapInfo |= WLAN_SET_CAP_INFO_PRIVACY(1); - else - pMgmt->wCurrCapInfo &= ~WLAN_SET_CAP_INFO_PRIVACY(1); - - pTxPacket = s_MgrMakeBeacon - ( - pDevice, - pMgmt, - pMgmt->wCurrCapInfo, - pMgmt->wCurrBeaconPeriod, - pMgmt->uCurrChannel, - pMgmt->wCurrATIMWindow, //0, - (PWLAN_IE_SSID)pMgmt->abyCurrSSID, - (u8 *)pMgmt->abyCurrBSSID, - (PWLAN_IE_SUPP_RATES)pMgmt->abyCurrSuppRates, - (PWLAN_IE_SUPP_RATES)pMgmt->abyCurrExtSuppRates - ); - - if ((pMgmt->eCurrMode == WMAC_MODE_IBSS_STA) && - (pMgmt->abyCurrBSSID[0] == 0)) - return false; - - spin_lock_irqsave(&pDevice->lock, flags); - - csBeacon_xmit(pDevice, pTxPacket); - - spin_unlock_irqrestore(&pDevice->lock, flags); - - MACvRegBitsOn(pDevice, MAC_REG_TCR, TCR_AUTOBCNTX); - - return true; -} - -/*+ - * - * Routine Description: - * - * Log a warning message based on the contents of the Status - * Code field of an 802.11 management frame. Defines are - * derived from 802.11-1997 SPEC. - * - * Return Value: - * none. - * --*/ -static void s_vMgrLogStatus(struct vnt_manager *pMgmt, u16 wStatus) -{ - switch( wStatus ){ - case WLAN_MGMT_STATUS_UNSPEC_FAILURE: - DBG_PRT(MSG_LEVEL_NOTICE, KERN_INFO "Status code == Unspecified error.\n"); - break; - case WLAN_MGMT_STATUS_CAPS_UNSUPPORTED: - DBG_PRT(MSG_LEVEL_NOTICE, KERN_INFO "Status code == Can't support all requested capabilities.\n"); - break; - case WLAN_MGMT_STATUS_REASSOC_NO_ASSOC: - DBG_PRT(MSG_LEVEL_NOTICE, KERN_INFO "Status code == Reassoc denied, can't confirm original Association.\n"); - break; - case WLAN_MGMT_STATUS_ASSOC_DENIED_UNSPEC: - DBG_PRT(MSG_LEVEL_NOTICE, KERN_INFO "Status code == Assoc denied, undefine in spec\n"); - break; - case WLAN_MGMT_STATUS_UNSUPPORTED_AUTHALG: - DBG_PRT(MSG_LEVEL_NOTICE, KERN_INFO "Status code == Peer doesn't support authen algorithm.\n"); - break; - case WLAN_MGMT_STATUS_RX_AUTH_NOSEQ: - DBG_PRT(MSG_LEVEL_NOTICE, KERN_INFO "Status code == Authen frame received out of sequence.\n"); - break; - case WLAN_MGMT_STATUS_CHALLENGE_FAIL: - DBG_PRT(MSG_LEVEL_NOTICE, KERN_INFO "Status code == Authen rejected, challenge failure.\n"); - break; - case WLAN_MGMT_STATUS_AUTH_TIMEOUT: - DBG_PRT(MSG_LEVEL_NOTICE, KERN_INFO "Status code == Authen rejected, timeout waiting for next frame.\n"); - break; - case WLAN_MGMT_STATUS_ASSOC_DENIED_BUSY: - DBG_PRT(MSG_LEVEL_NOTICE, KERN_INFO "Status code == Assoc denied, AP too busy.\n"); - break; - case WLAN_MGMT_STATUS_ASSOC_DENIED_RATES: - DBG_PRT(MSG_LEVEL_NOTICE, KERN_INFO "Status code == Assoc denied, we haven't enough basic rates.\n"); - break; - case WLAN_MGMT_STATUS_ASSOC_DENIED_SHORTPREAMBLE: - DBG_PRT(MSG_LEVEL_NOTICE, KERN_INFO "Status code == Assoc denied, we do not support short preamble.\n"); - break; - case WLAN_MGMT_STATUS_ASSOC_DENIED_PBCC: - DBG_PRT(MSG_LEVEL_NOTICE, KERN_INFO "Status code == Assoc denied, we do not support PBCC.\n"); - break; - case WLAN_MGMT_STATUS_ASSOC_DENIED_AGILITY: - DBG_PRT(MSG_LEVEL_NOTICE, KERN_INFO "Status code == Assoc denied, we do not support channel agility.\n"); - break; - default: - DBG_PRT(MSG_LEVEL_NOTICE, KERN_INFO "Unknown status code %d.\n", wStatus); - break; - } -} - -/* - * - * Description: - * Add BSSID in PMKID Candidate list. - * - * Parameters: - * In: - * hDeviceContext - device structure point - * pbyBSSID - BSSID address for adding - * wRSNCap - BSS's RSN capability - * Out: - * none - * - * Return Value: none. - * --*/ - -int bAdd_PMKID_Candidate(struct vnt_private *pDevice, u8 *pbyBSSID, - PSRSNCapObject psRSNCapObj) -{ - PPMKID_CANDIDATE pCandidateList; - int ii = 0; - - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"bAdd_PMKID_Candidate START: (%d)\n", (int)pDevice->gsPMKIDCandidate.NumCandidates); - - if ((pDevice == NULL) || (pbyBSSID == NULL) || (psRSNCapObj == NULL)) - return false; - - if (pDevice->gsPMKIDCandidate.NumCandidates >= MAX_PMKIDLIST) - return false; - - // Update Old Candidate - for (ii = 0; ii < pDevice->gsPMKIDCandidate.NumCandidates; ii++) { - pCandidateList = &pDevice->gsPMKIDCandidate.CandidateList[ii]; - if (!memcmp(pCandidateList->BSSID, pbyBSSID, ETH_ALEN)) { - if ((psRSNCapObj->bRSNCapExist == true) - && (psRSNCapObj->wRSNCap & BIT0)) { - pCandidateList->Flags |= - NDIS_802_11_PMKID_CANDIDATE_PREAUTH_ENABLED; - } else { - pCandidateList->Flags &= - ~(NDIS_802_11_PMKID_CANDIDATE_PREAUTH_ENABLED); - } - return true; - } - } - - // New Candidate - pCandidateList = &pDevice->gsPMKIDCandidate.CandidateList[pDevice->gsPMKIDCandidate.NumCandidates]; - if ((psRSNCapObj->bRSNCapExist == true) && (psRSNCapObj->wRSNCap & BIT0)) { - pCandidateList->Flags |= NDIS_802_11_PMKID_CANDIDATE_PREAUTH_ENABLED; - } else { - pCandidateList->Flags &= ~(NDIS_802_11_PMKID_CANDIDATE_PREAUTH_ENABLED); - } - memcpy(pCandidateList->BSSID, pbyBSSID, ETH_ALEN); - pDevice->gsPMKIDCandidate.NumCandidates++; - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"NumCandidates:%d\n", (int)pDevice->gsPMKIDCandidate.NumCandidates); - return true; -} - -/* - * - * Description: - * Flush PMKID Candidate list. - * - * Parameters: - * In: - * hDeviceContext - device structure point - * Out: - * none - * - * Return Value: none. - * --*/ - -void vFlush_PMKID_Candidate(struct vnt_private *pDevice) -{ - if (pDevice == NULL) - return; - - memset(&pDevice->gsPMKIDCandidate, 0, sizeof(SPMKIDCandidateEvent)); - - return; -} - -static bool -s_bCipherMatch ( - PKnownBSS pBSSNode, - NDIS_802_11_ENCRYPTION_STATUS EncStatus, - u8 * pbyCCSPK, - u8 * pbyCCSGK - ) -{ - u8 byMulticastCipher = KEY_CTL_INVALID; - u8 byCipherMask = 0x00; - int i; - - if (pBSSNode == NULL) - return false; - - // check cap. of BSS - if ((WLAN_GET_CAP_INFO_PRIVACY(pBSSNode->wCapInfo) != 0) && - (EncStatus == Ndis802_11Encryption1Enabled)) { - // default is WEP only - byMulticastCipher = KEY_CTL_WEP; - } - - if ((WLAN_GET_CAP_INFO_PRIVACY(pBSSNode->wCapInfo) != 0) && - (pBSSNode->bWPA2Valid == true) && - - ((EncStatus == Ndis802_11Encryption3Enabled) || - (EncStatus == Ndis802_11Encryption2Enabled))) { - //WPA2 - // check Group Key Cipher - if ((pBSSNode->byCSSGK == WLAN_11i_CSS_WEP40) || - (pBSSNode->byCSSGK == WLAN_11i_CSS_WEP104)) { - byMulticastCipher = KEY_CTL_WEP; - } else if (pBSSNode->byCSSGK == WLAN_11i_CSS_TKIP) { - byMulticastCipher = KEY_CTL_TKIP; - } else if (pBSSNode->byCSSGK == WLAN_11i_CSS_CCMP) { - byMulticastCipher = KEY_CTL_CCMP; - } else { - byMulticastCipher = KEY_CTL_INVALID; - } - - /* check Pairwise Key Cipher */ - for (i = 0; i < pBSSNode->wCSSPKCount; i++) { - if ((pBSSNode->abyCSSPK[i] == WLAN_11i_CSS_WEP40) || - (pBSSNode->abyCSSPK[i] == WLAN_11i_CSS_WEP104)) { - /* this should not happen as defined 802.11i */ - byCipherMask |= 0x01; - } else if (pBSSNode->abyCSSPK[i] == WLAN_11i_CSS_TKIP) { - byCipherMask |= 0x02; - } else if (pBSSNode->abyCSSPK[i] == WLAN_11i_CSS_CCMP) { - byCipherMask |= 0x04; - } else if (pBSSNode->abyCSSPK[i] == WLAN_11i_CSS_USE_GROUP) { - /* use group key only ignore all others */ - byCipherMask = 0; - i = pBSSNode->wCSSPKCount; - } - } - - } else if ((WLAN_GET_CAP_INFO_PRIVACY(pBSSNode->wCapInfo) != 0) && - (pBSSNode->bWPAValid == true) && - ((EncStatus == Ndis802_11Encryption2Enabled) || (EncStatus == Ndis802_11Encryption3Enabled))) { - //WPA - // check Group Key Cipher - if ((pBSSNode->byGKType == WPA_WEP40) || - (pBSSNode->byGKType == WPA_WEP104)) { - byMulticastCipher = KEY_CTL_WEP; - } else if (pBSSNode->byGKType == WPA_TKIP) { - byMulticastCipher = KEY_CTL_TKIP; - } else if (pBSSNode->byGKType == WPA_AESCCMP) { - byMulticastCipher = KEY_CTL_CCMP; - } else { - byMulticastCipher = KEY_CTL_INVALID; - } - - /* check Pairwise Key Cipher */ - for (i = 0; i < pBSSNode->wPKCount; i++) { - if (pBSSNode->abyPKType[i] == WPA_TKIP) { - byCipherMask |= 0x02; - } else if (pBSSNode->abyPKType[i] == WPA_AESCCMP) { - byCipherMask |= 0x04; - } else if (pBSSNode->abyPKType[i] == WPA_NONE) { - /* use group key only ignore all others */ - byCipherMask = 0; - i = pBSSNode->wPKCount; - } - } - } - - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"%d, %d, %d, %d, EncStatus:%d\n", - byMulticastCipher, byCipherMask, pBSSNode->bWPAValid, pBSSNode->bWPA2Valid, EncStatus); - - // mask our cap. with BSS - if (EncStatus == Ndis802_11Encryption1Enabled) { - - // For supporting Cisco migration mode, don't care pairwise key cipher - //if ((byMulticastCipher == KEY_CTL_WEP) && - // (byCipherMask == 0)) { - if ((byMulticastCipher == KEY_CTL_WEP) && - (byCipherMask == 0)) { - *pbyCCSGK = KEY_CTL_WEP; - *pbyCCSPK = KEY_CTL_NONE; - return true; - } else { - return false; - } - - } else if (EncStatus == Ndis802_11Encryption2Enabled) { - if ((byMulticastCipher == KEY_CTL_TKIP) && - (byCipherMask == 0)) { - *pbyCCSGK = KEY_CTL_TKIP; - *pbyCCSPK = KEY_CTL_NONE; - return true; - } else if ((byMulticastCipher == KEY_CTL_WEP) && - ((byCipherMask & 0x02) != 0)) { - *pbyCCSGK = KEY_CTL_WEP; - *pbyCCSPK = KEY_CTL_TKIP; - return true; - } else if ((byMulticastCipher == KEY_CTL_TKIP) && - ((byCipherMask & 0x02) != 0)) { - *pbyCCSGK = KEY_CTL_TKIP; - *pbyCCSPK = KEY_CTL_TKIP; - return true; - } else { - return false; - } - } else if (EncStatus == Ndis802_11Encryption3Enabled) { - if ((byMulticastCipher == KEY_CTL_CCMP) && - (byCipherMask == 0)) { - // When CCMP is enable, "Use group cipher suite" shall not be a valid option. - return false; - } else if ((byMulticastCipher == KEY_CTL_WEP) && - ((byCipherMask & 0x04) != 0)) { - *pbyCCSGK = KEY_CTL_WEP; - *pbyCCSPK = KEY_CTL_CCMP; - return true; - } else if ((byMulticastCipher == KEY_CTL_TKIP) && - ((byCipherMask & 0x04) != 0)) { - *pbyCCSGK = KEY_CTL_TKIP; - *pbyCCSPK = KEY_CTL_CCMP; - return true; - } else if ((byMulticastCipher == KEY_CTL_CCMP) && - ((byCipherMask & 0x04) != 0)) { - *pbyCCSGK = KEY_CTL_CCMP; - *pbyCCSPK = KEY_CTL_CCMP; - return true; - } else { - return false; - } - } - return true; -} - diff --git a/drivers/staging/vt6656/wmgr.h b/drivers/staging/vt6656/wmgr.h deleted file mode 100644 index 26ba47da467b..000000000000 --- a/drivers/staging/vt6656/wmgr.h +++ /dev/null @@ -1,397 +0,0 @@ -/* - * Copyright (c) 1996, 2003 VIA Networking Technologies, Inc. - * All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - * - * - * File: wmgr.h - * - * Purpose: - * - * Author: lyndon chen - * - * Date: Jan 2, 2003 - * - * Functions: - * - * Revision History: - * - */ - -#ifndef __WMGR_H__ -#define __WMGR_H__ - -#include "80211mgr.h" -#include "80211hdr.h" -#include "wcmd.h" -#include "bssdb.h" -#include "wpa2.h" -#include "card.h" - -// Scan time -#define PROBE_DELAY 100 // (us) -#define SWITCH_CHANNEL_DELAY 200 // (us) -#define WLAN_SCAN_MINITIME 25 // (ms) -#define WLAN_SCAN_MAXTIME 100 // (ms) -#define TRIVIAL_SYNC_DIFFERENCE 0 // (us) -#define DEFAULT_IBSS_BI 100 // (ms) - -#define WCMD_ACTIVE_SCAN_TIME 20 //(ms) -#define WCMD_PASSIVE_SCAN_TIME 100 //(ms) - -#define DEFAULT_MSDU_LIFETIME 512 // ms -#define DEFAULT_MSDU_LIFETIME_RES_64us 8000 // 64us - -#define DEFAULT_MGN_LIFETIME 8 // ms -#define DEFAULT_MGN_LIFETIME_RES_64us 125 // 64us - -#define MAKE_BEACON_RESERVED 10 //(us) - -#define TIM_MULTICAST_MASK 0x01 -#define TIM_BITMAPOFFSET_MASK 0xFE -#define DEFAULT_DTIM_PERIOD 1 - -#define AP_LONG_RETRY_LIMIT 4 - -#define DEFAULT_IBSS_CHANNEL 6 //2.4G - -//mike define: make timer to expire after desired times -#define timer_expire(timer, next_tick) mod_timer(&timer, RUN_AT(next_tick)) - -typedef void (*TimerFunction)(unsigned long); - -//+++ NDIS related - -typedef u8 NDIS_802_11_MAC_ADDRESS[ETH_ALEN]; -typedef struct _NDIS_802_11_AI_REQFI -{ - u16 Capabilities; - u16 ListenInterval; - NDIS_802_11_MAC_ADDRESS CurrentAPAddress; -} NDIS_802_11_AI_REQFI, *PNDIS_802_11_AI_REQFI; - -typedef struct _NDIS_802_11_AI_RESFI -{ - u16 Capabilities; - u16 StatusCode; - u16 AssociationId; -} NDIS_802_11_AI_RESFI, *PNDIS_802_11_AI_RESFI; - -typedef struct _NDIS_802_11_ASSOCIATION_INFORMATION -{ - u32 Length; - u16 AvailableRequestFixedIEs; - NDIS_802_11_AI_REQFI RequestFixedIEs; - u32 RequestIELength; - u32 OffsetRequestIEs; - u16 AvailableResponseFixedIEs; - NDIS_802_11_AI_RESFI ResponseFixedIEs; - u32 ResponseIELength; - u32 OffsetResponseIEs; -} NDIS_802_11_ASSOCIATION_INFORMATION, *PNDIS_802_11_ASSOCIATION_INFORMATION; - -typedef struct tagSAssocInfo { - NDIS_802_11_ASSOCIATION_INFORMATION AssocInfo; - u8 abyIEs[WLAN_BEACON_FR_MAXLEN+WLAN_BEACON_FR_MAXLEN]; - /* store ReqIEs set by OID_802_11_ASSOCIATION_INFORMATION */ - u32 RequestIELength; - u8 abyReqIEs[WLAN_BEACON_FR_MAXLEN]; -} SAssocInfo, *PSAssocInfo; - -typedef enum tagWMAC_AUTHENTICATION_MODE { - - WMAC_AUTH_OPEN, - WMAC_AUTH_SHAREKEY, - WMAC_AUTH_AUTO, - WMAC_AUTH_WPA, - WMAC_AUTH_WPAPSK, - WMAC_AUTH_WPANONE, - WMAC_AUTH_WPA2, - WMAC_AUTH_WPA2PSK, - WMAC_AUTH_MAX // Not a real mode, defined as upper bound -} WMAC_AUTHENTICATION_MODE, *PWMAC_AUTHENTICATION_MODE; - -// Pre-configured Mode (from XP) - -typedef enum tagWMAC_CONFIG_MODE { - WMAC_CONFIG_ESS_STA, - WMAC_CONFIG_IBSS_STA, - WMAC_CONFIG_AUTO, - WMAC_CONFIG_AP - -} WMAC_CONFIG_MODE, *PWMAC_CONFIG_MODE; - -typedef enum tagWMAC_SCAN_TYPE { - - WMAC_SCAN_ACTIVE, - WMAC_SCAN_PASSIVE, - WMAC_SCAN_HYBRID - -} WMAC_SCAN_TYPE, *PWMAC_SCAN_TYPE; - -typedef enum tagWMAC_SCAN_STATE { - - WMAC_NO_SCANNING, - WMAC_IS_SCANNING, - WMAC_IS_PROBEPENDING - -} WMAC_SCAN_STATE, *PWMAC_SCAN_STATE; - -// Notes: -// Basic Service Set state explained as following: -// WMAC_STATE_IDLE : no BSS is selected (Adhoc or Infra) -// WMAC_STATE_STARTED : no BSS is selected, start own IBSS (Adhoc only) -// WMAC_STATE_JOINTED : BSS is selected and synchronized (Adhoc or Infra) -// WMAC_STATE_AUTHPENDING : Authentication pending (Infra) -// WMAC_STATE_AUTH : Authenticated (Infra) -// WMAC_STATE_ASSOCPENDING : Association pending (Infra) -// WMAC_STATE_ASSOC : Associated (Infra) - -typedef enum tagWMAC_BSS_STATE { - - WMAC_STATE_IDLE, - WMAC_STATE_STARTED, - WMAC_STATE_JOINTED, - WMAC_STATE_AUTHPENDING, - WMAC_STATE_AUTH, - WMAC_STATE_ASSOCPENDING, - WMAC_STATE_ASSOC - -} WMAC_BSS_STATE, *PWMAC_BSS_STATE; - -// WMAC selected running mode -typedef enum tagWMAC_CURRENT_MODE { - - WMAC_MODE_STANDBY, - WMAC_MODE_ESS_STA, - WMAC_MODE_IBSS_STA, - WMAC_MODE_ESS_AP - -} WMAC_CURRENT_MODE, *PWMAC_CURRENT_MODE; - -typedef enum tagWMAC_POWER_MODE { - - WMAC_POWER_CAM, - WMAC_POWER_FAST, - WMAC_POWER_MAX - -} WMAC_POWER_MODE, *PWMAC_POWER_MODE; - -/* Tx Management Packet descriptor */ -struct vnt_tx_mgmt { - PUWLAN_80211HDR p80211Header; - u32 cbMPDULen; - u32 cbPayloadLen; -}; - -/* Rx Management Packet descriptor */ -struct vnt_rx_mgmt { - PUWLAN_80211HDR p80211Header; - u64 qwLocalTSF; - u32 cbMPDULen; - u32 cbPayloadLen; - u32 uRSSI; - u8 bySQ; - u8 byRxRate; - u8 byRxChannel; -}; - -struct vnt_manager { - void *pAdapter; - - /* MAC address */ - u8 abyMACAddr[WLAN_ADDR_LEN]; - - /* Configuration Mode */ - WMAC_CONFIG_MODE eConfigMode; /* MAC pre-configed mode */ - - CARD_PHY_TYPE eCurrentPHYMode; - - /* Operation state variables */ - WMAC_CURRENT_MODE eCurrMode; /* MAC current connection mode */ - WMAC_BSS_STATE eCurrState; /* MAC current BSS state */ - WMAC_BSS_STATE eLastState; /* MAC last BSS state */ - - PKnownBSS pCurrBSS; - u8 byCSSGK; - u8 byCSSPK; - - int bCurrBSSIDFilterOn; - - /* Current state vars */ - u32 uCurrChannel; - u8 abyCurrSuppRates[WLAN_IEHDR_LEN + WLAN_RATES_MAXLEN + 1]; - u8 abyCurrExtSuppRates[WLAN_IEHDR_LEN + WLAN_RATES_MAXLEN + 1]; - u8 abyCurrSSID[WLAN_IEHDR_LEN + WLAN_SSID_MAXLEN + 1]; - u8 abyCurrBSSID[WLAN_BSSID_LEN]; - u16 wCurrCapInfo; - u16 wCurrAID; - u32 uRSSITrigger; - u16 wCurrATIMWindow; - u16 wCurrBeaconPeriod; - int bIsDS; - u8 byERPContext; - - CMD_STATE eCommandState; - u32 uScanChannel; - - /* Desire joinning BSS vars */ - u8 abyDesireSSID[WLAN_IEHDR_LEN + WLAN_SSID_MAXLEN + 1]; - u8 abyDesireBSSID[WLAN_BSSID_LEN]; - - /*restore BSS info for Ad-Hoc mode */ - u8 abyAdHocSSID[WLAN_IEHDR_LEN + WLAN_SSID_MAXLEN + 1]; - - /* Adhoc or AP configuration vars */ - u16 wIBSSBeaconPeriod; - u16 wIBSSATIMWindow; - u32 uIBSSChannel; - u8 abyIBSSSuppRates[WLAN_IEHDR_LEN + WLAN_RATES_MAXLEN + 1]; - u8 byAPBBType; - u8 abyWPAIE[MAX_WPA_IE_LEN]; - u16 wWPAIELen; - - u32 uAssocCount; - int bMoreData; - - /* Scan state vars */ - WMAC_SCAN_STATE eScanState; - WMAC_SCAN_TYPE eScanType; - u32 uScanStartCh; - u32 uScanEndCh; - u16 wScanSteps; - u32 uScanBSSType; - /* Desire scannig vars */ - u8 abyScanSSID[WLAN_IEHDR_LEN + WLAN_SSID_MAXLEN + 1]; - u8 abyScanBSSID[WLAN_BSSID_LEN]; - - /* Privacy */ - WMAC_AUTHENTICATION_MODE eAuthenMode; - int bShareKeyAlgorithm; - u8 abyChallenge[WLAN_CHALLENGE_LEN]; - int bPrivacyInvoked; - - /* Received beacon state vars */ - int bInTIM; - int bMulticastTIM; - u8 byDTIMCount; - u8 byDTIMPeriod; - - /* Power saving state vars */ - WMAC_POWER_MODE ePSMode; - u16 wListenInterval; - u16 wCountToWakeUp; - int bInTIMWake; - u8 *pbyPSPacketPool; - u8 byPSPacketPool[sizeof(struct vnt_tx_mgmt) - + WLAN_NULLDATA_FR_MAXLEN]; - int bRxBeaconInTBTTWake; - u8 abyPSTxMap[MAX_NODE_NUM + 1]; - - /* management command related */ - u32 uCmdBusy; - u32 uCmdHostAPBusy; - - /* management packet pool */ - u8 *pbyMgmtPacketPool; - u8 byMgmtPacketPool[sizeof(struct vnt_tx_mgmt) - + WLAN_A3FR_MAXLEN]; - - /* Temporarily Rx Mgmt Packet Descriptor */ - struct vnt_rx_mgmt sRxPacket; - - /* link list of known bss's (scan results) */ - KnownBSS sBSSList[MAX_BSS_NUM]; - /* link list of same bss's */ - KnownBSS pSameBSS[6]; - int Cisco_cckm; - u8 Roam_dbm; - - /* table list of known node */ - /* sNodeDBList[0] is reserved for AP under Infra mode */ - /* sNodeDBList[0] is reserved for Multicast under adhoc/AP mode */ - KnownNodeDB sNodeDBTable[MAX_NODE_NUM + 1]; - - /* WPA2 PMKID Cache */ - SPMKIDCache gsPMKIDCache; - int bRoaming; - - /* associate info */ - SAssocInfo sAssocInfo; - - /* for 802.11h */ - int b11hEnable; - int bSwitchChannel; - u8 byNewChannel; - PWLAN_IE_MEASURE_REP pCurrMeasureEIDRep; - u32 uLengthOfRepEIDs; - u8 abyCurrentMSRReq[sizeof(struct vnt_tx_mgmt) - + WLAN_A3FR_MAXLEN]; - u8 abyCurrentMSRRep[sizeof(struct vnt_tx_mgmt) - + WLAN_A3FR_MAXLEN]; - u8 abyIECountry[WLAN_A3FR_MAXLEN]; - u8 abyIBSSDFSOwner[6]; - u8 byIBSSDFSRecovery; - - struct sk_buff skb; - -}; - -void vMgrObjectInit(struct vnt_private *pDevice); - -void vMgrAssocBeginSta(struct vnt_private *pDevice, - struct vnt_manager *, PCMD_STATUS pStatus); - -void vMgrReAssocBeginSta(struct vnt_private *pDevice, - struct vnt_manager *, PCMD_STATUS pStatus); - -void vMgrDisassocBeginSta(struct vnt_private *pDevice, - struct vnt_manager *, u8 *abyDestAddress, u16 wReason, - PCMD_STATUS pStatus); - -void vMgrAuthenBeginSta(struct vnt_private *pDevice, - struct vnt_manager *, PCMD_STATUS pStatus); - -void vMgrCreateOwnIBSS(struct vnt_private *pDevice, - PCMD_STATUS pStatus); - -void vMgrJoinBSSBegin(struct vnt_private *pDevice, - PCMD_STATUS pStatus); - -void vMgrRxManagePacket(struct vnt_private *pDevice, - struct vnt_manager *, struct vnt_rx_mgmt *); - -/* -void -vMgrScanBegin( - void *hDeviceContext, - PCMD_STATUS pStatus - ); -*/ - -void vMgrDeAuthenBeginSta(struct vnt_private *pDevice, - struct vnt_manager *, u8 *abyDestAddress, u16 wReason, - PCMD_STATUS pStatus); - -int bMgrPrepareBeaconToSend(struct vnt_private *pDevice, - struct vnt_manager *); - -int bAdd_PMKID_Candidate(struct vnt_private *pDevice, - u8 *pbyBSSID, PSRSNCapObject psRSNCapObj); - -void vFlush_PMKID_Candidate(struct vnt_private *pDevice); - -#endif /* __WMGR_H__ */ diff --git a/drivers/staging/vt6656/wpa.c b/drivers/staging/vt6656/wpa.c deleted file mode 100644 index 403c295cc02c..000000000000 --- a/drivers/staging/vt6656/wpa.c +++ /dev/null @@ -1,314 +0,0 @@ -/* - * Copyright (c) 1996, 2003 VIA Networking Technologies, Inc. - * All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - * - * - * File: wpa.c - * - * Purpose: Handles the Basic Service Set & Node Database functions - * - * Functions: - * WPA_ParseRSN - Parse RSN IE. - * - * Revision History: - * - * Author: Kyle Hsu - * - * Date: July 14, 2003 - * - */ - -#include "tmacro.h" -#include "tether.h" -#include "device.h" -#include "80211hdr.h" -#include "bssdb.h" -#include "wmgr.h" -#include "wpa.h" -#include "80211mgr.h" - -static int msglevel =MSG_LEVEL_INFO; - -static const u8 abyOUI00[4] = { 0x00, 0x50, 0xf2, 0x00 }; -static const u8 abyOUI01[4] = { 0x00, 0x50, 0xf2, 0x01 }; -static const u8 abyOUI02[4] = { 0x00, 0x50, 0xf2, 0x02 }; -static const u8 abyOUI03[4] = { 0x00, 0x50, 0xf2, 0x03 }; -static const u8 abyOUI04[4] = { 0x00, 0x50, 0xf2, 0x04 }; -static const u8 abyOUI05[4] = { 0x00, 0x50, 0xf2, 0x05 }; - -/*+ - * - * Description: - * Clear RSN information in BSSList. - * - * Parameters: - * In: - * pBSSList - BSS list. - * Out: - * none - * - * Return Value: none. - * --*/ - -void -WPA_ClearRSN( - PKnownBSS pBSSList - ) -{ - int ii; - pBSSList->byGKType = WPA_TKIP; - for (ii=0; ii < 4; ii ++) - pBSSList->abyPKType[ii] = WPA_TKIP; - pBSSList->wPKCount = 0; - for (ii=0; ii < 4; ii ++) - pBSSList->abyAuthType[ii] = WPA_AUTH_IEEE802_1X; - pBSSList->wAuthCount = 0; - pBSSList->byDefaultK_as_PK = 0; - pBSSList->byReplayIdx = 0; - pBSSList->sRSNCapObj.bRSNCapExist = false; - pBSSList->sRSNCapObj.wRSNCap = 0; - pBSSList->bWPAValid = false; -} - -/*+ - * - * Description: - * Parse RSN IE. - * - * Parameters: - * In: - * pBSSList - BSS list. - * pRSN - Pointer to the RSN IE. - * Out: - * none - * - * Return Value: none. - * --*/ -void -WPA_ParseRSN( - PKnownBSS pBSSList, - PWLAN_IE_RSN_EXT pRSN - ) -{ - PWLAN_IE_RSN_AUTH pIE_RSN_Auth = NULL; - int i, j, m, n = 0; - u8 * pbyCaps; - - WPA_ClearRSN(pBSSList); - - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"WPA_ParseRSN: [%d]\n", pRSN->len); - - // information element header makes sense - if ((pRSN->len >= 6) // oui1(4)+ver(2) - && (pRSN->byElementID == WLAN_EID_RSN_WPA) && !memcmp(pRSN->abyOUI, abyOUI01, 4) - && (pRSN->wVersion == 1)) { - - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Legal RSN\n"); - // update each variable if pRSN is long enough to contain the variable - if (pRSN->len >= 10) //oui1(4)+ver(2)+GKSuite(4) - { - if ( !memcmp(pRSN->abyMulticast, abyOUI01, 4)) - pBSSList->byGKType = WPA_WEP40; - else if ( !memcmp(pRSN->abyMulticast, abyOUI02, 4)) - pBSSList->byGKType = WPA_TKIP; - else if ( !memcmp(pRSN->abyMulticast, abyOUI03, 4)) - pBSSList->byGKType = WPA_AESWRAP; - else if ( !memcmp(pRSN->abyMulticast, abyOUI04, 4)) - pBSSList->byGKType = WPA_AESCCMP; - else if ( !memcmp(pRSN->abyMulticast, abyOUI05, 4)) - pBSSList->byGKType = WPA_WEP104; - else - // any vendor checks here - pBSSList->byGKType = WPA_NONE; - - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"byGKType: %x\n", pBSSList->byGKType); - } - - if (pRSN->len >= 12) //oui1(4)+ver(2)+GKS(4)+PKSCnt(2) - { - j = 0; - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"wPKCount: %d, sizeof(pBSSList->abyPKType): %zu\n", pRSN->wPKCount, sizeof(pBSSList->abyPKType)); - for (i = 0; (i < pRSN->wPKCount) && - (j < ARRAY_SIZE(pBSSList->abyPKType)); i++) { - if(pRSN->len >= 12+i*4+4) { //oui1(4)+ver(2)+GKS(4)+PKSCnt(2)+PKS(4*i) - if ( !memcmp(pRSN->PKSList[i].abyOUI, abyOUI00, 4)) - pBSSList->abyPKType[j++] = WPA_NONE; - else if ( !memcmp(pRSN->PKSList[i].abyOUI, abyOUI02, 4)) - pBSSList->abyPKType[j++] = WPA_TKIP; - else if ( !memcmp(pRSN->PKSList[i].abyOUI, abyOUI03, 4)) - pBSSList->abyPKType[j++] = WPA_AESWRAP; - else if ( !memcmp(pRSN->PKSList[i].abyOUI, abyOUI04, 4)) - pBSSList->abyPKType[j++] = WPA_AESCCMP; - else - // any vendor checks here - ; - } - else - break; - //DBG_PRN_GRP14(("abyPKType[%d]: %X\n", j-1, pBSSList->abyPKType[j-1])); - } //for - pBSSList->wPKCount = (u16)j; - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"wPKCount: %d\n", pBSSList->wPKCount); - } - - m = pRSN->wPKCount; - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"m: %d\n", m); - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"14+m*4: %d\n", 14+m*4); - - if (pRSN->len >= 14+m*4) { //oui1(4)+ver(2)+GKS(4)+PKSCnt(2)+PKS(4*m)+AKC(2) - // overlay IE_RSN_Auth structure into correct place - pIE_RSN_Auth = (PWLAN_IE_RSN_AUTH) pRSN->PKSList[m].abyOUI; - j = 0; - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"wAuthCount: %d, sizeof(pBSSList->abyAuthType): %zu\n", - pIE_RSN_Auth->wAuthCount, sizeof(pBSSList->abyAuthType)); - for (i = 0; (i < pIE_RSN_Auth->wAuthCount) && - (j < ARRAY_SIZE(pBSSList->abyAuthType)); i++) { - if(pRSN->len >= 14+4+(m+i)*4) { //oui1(4)+ver(2)+GKS(4)+PKSCnt(2)+PKS(4*m)+AKC(2)+AKS(4*i) - if ( !memcmp(pIE_RSN_Auth->AuthKSList[i].abyOUI, abyOUI01, 4)) - pBSSList->abyAuthType[j++] = WPA_AUTH_IEEE802_1X; - else if ( !memcmp(pIE_RSN_Auth->AuthKSList[i].abyOUI, abyOUI02, 4)) - pBSSList->abyAuthType[j++] = WPA_AUTH_PSK; - else - // any vendor checks here - ; - } - else - break; - //DBG_PRN_GRP14(("abyAuthType[%d]: %X\n", j-1, pBSSList->abyAuthType[j-1])); - } - if(j > 0) - pBSSList->wAuthCount = (u16)j; - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"wAuthCount: %d\n", pBSSList->wAuthCount); - } - - if (pIE_RSN_Auth != NULL) { - - n = pIE_RSN_Auth->wAuthCount; - - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"n: %d\n", n); - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"14+4+(m+n)*4: %d\n", 14+4+(m+n)*4); - - if(pRSN->len+2 >= 14+4+(m+n)*4) { //oui1(4)+ver(2)+GKS(4)+PKSCnt(2)+PKS(4*m)+AKC(2)+AKS(4*n)+Cap(2) - pbyCaps = (u8 *)pIE_RSN_Auth->AuthKSList[n].abyOUI; - pBSSList->byDefaultK_as_PK = (*pbyCaps) & WPA_GROUPFLAG; - pBSSList->byReplayIdx = 2 << ((*pbyCaps >> WPA_REPLAYBITSSHIFT) & WPA_REPLAYBITS); - pBSSList->sRSNCapObj.bRSNCapExist = true; - pBSSList->sRSNCapObj.wRSNCap = *(u16 *)pbyCaps; - //DBG_PRN_GRP14(("pbyCaps: %X\n", *pbyCaps)); - //DBG_PRN_GRP14(("byDefaultK_as_PK: %X\n", pBSSList->byDefaultK_as_PK)); - //DBG_PRN_GRP14(("byReplayIdx: %X\n", pBSSList->byReplayIdx)); - } - } - pBSSList->bWPAValid = true; - } -} - -/*+ - * - * Description: - * Search RSN information in BSSList. - * - * Parameters: - * In: - * byCmd - Search type - * byEncrypt- Encrypt Type - * pBSSList - BSS list - * Out: - * none - * - * Return Value: none. - * --*/ -bool -WPA_SearchRSN( - u8 byCmd, - u8 byEncrypt, - PKnownBSS pBSSList - ) -{ - int ii; - u8 byPKType = WPA_NONE; - - if (pBSSList->bWPAValid == false) - return false; - - switch(byCmd) { - case 0: - - if (byEncrypt != pBSSList->byGKType) - return false; - - if (pBSSList->wPKCount > 0) { - for (ii = 0; ii < pBSSList->wPKCount; ii ++) { - if (pBSSList->abyPKType[ii] == WPA_AESCCMP) - byPKType = WPA_AESCCMP; - else if ((pBSSList->abyPKType[ii] == WPA_TKIP) && (byPKType != WPA_AESCCMP)) - byPKType = WPA_TKIP; - else if ((pBSSList->abyPKType[ii] == WPA_WEP40) && (byPKType != WPA_AESCCMP) && (byPKType != WPA_TKIP)) - byPKType = WPA_WEP40; - else if ((pBSSList->abyPKType[ii] == WPA_WEP104) && (byPKType != WPA_AESCCMP) && (byPKType != WPA_TKIP)) - byPKType = WPA_WEP104; - } - if (byEncrypt != byPKType) - return false; - } - return true; -// if (pBSSList->wAuthCount > 0) -// for (ii=0; ii < pBSSList->wAuthCount; ii ++) -// if (byAuth == pBSSList->abyAuthType[ii]) -// break; - break; - - default: - break; - } - return false; -} - -/*+ - * - * Description: - * Check if RSN IE makes sense. - * - * Parameters: - * In: - * pRSN - Pointer to the RSN IE. - * Out: - * none - * - * Return Value: none. - * --*/ -bool -WPAb_Is_RSN( - PWLAN_IE_RSN_EXT pRSN - ) -{ - if (pRSN == NULL) - return false; - - if ((pRSN->len >= 6) && // oui1(4)+ver(2) - (pRSN->byElementID == WLAN_EID_RSN_WPA) && !memcmp(pRSN->abyOUI, abyOUI01, 4) && - (pRSN->wVersion == 1)) { - return true; - } - else - return false; -} - diff --git a/drivers/staging/vt6656/wpa.h b/drivers/staging/vt6656/wpa.h deleted file mode 100644 index 2a724c064e59..000000000000 --- a/drivers/staging/vt6656/wpa.h +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Copyright (c) 1996, 2003 VIA Networking Technologies, Inc. - * All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - * - * - * File: wpa.h - * - * Purpose: Defines the macros, types, and functions for dealing - * with WPA informations. - * - * Author: Kyle Hsu - * - * Date: Jul 14, 2003 - * - */ - -#ifndef __WPA_H__ -#define __WPA_H__ - -#include "80211hdr.h" - -#define WPA_NONE 0 -#define WPA_WEP40 1 -#define WPA_TKIP 2 -#define WPA_AESWRAP 3 -#define WPA_AESCCMP 4 -#define WPA_WEP104 5 -#define WPA_AUTH_IEEE802_1X 1 -#define WPA_AUTH_PSK 2 - -#define WPA_GROUPFLAG 0x02 -#define WPA_REPLAYBITSSHIFT 2 -#define WPA_REPLAYBITS 0x03 - -void -WPA_ClearRSN( - PKnownBSS pBSSList - ); - -void -WPA_ParseRSN( - PKnownBSS pBSSList, - PWLAN_IE_RSN_EXT pRSN - ); - -bool -WPA_SearchRSN( - u8 byCmd, - u8 byEncrypt, - PKnownBSS pBSSList - ); - -bool -WPAb_Is_RSN( - PWLAN_IE_RSN_EXT pRSN - ); - -#endif /* __WPA_H__ */ diff --git a/drivers/staging/vt6656/wpa2.c b/drivers/staging/vt6656/wpa2.c deleted file mode 100644 index df5541794e0f..000000000000 --- a/drivers/staging/vt6656/wpa2.c +++ /dev/null @@ -1,235 +0,0 @@ -/* - * Copyright (c) 1996, 2003 VIA Networking Technologies, Inc. - * All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - * - * - * File: wpa2.c - * - * Purpose: Handles the Basic Service Set & Node Database functions - * - * Functions: - * - * Revision History: - * - * Author: Yiching Chen - * - * Date: Oct. 4, 2004 - * - */ - -#include "device.h" -#include "wpa2.h" - -static int msglevel =MSG_LEVEL_INFO; -//static int msglevel =MSG_LEVEL_DEBUG; - -static const u8 abyOUIGK[4] = { 0x00, 0x0F, 0xAC, 0x00 }; -static const u8 abyOUIWEP40[4] = { 0x00, 0x0F, 0xAC, 0x01 }; -static const u8 abyOUIWEP104[4] = { 0x00, 0x0F, 0xAC, 0x05 }; -static const u8 abyOUITKIP[4] = { 0x00, 0x0F, 0xAC, 0x02 }; -static const u8 abyOUICCMP[4] = { 0x00, 0x0F, 0xAC, 0x04 }; - -static const u8 abyOUI8021X[4] = { 0x00, 0x0F, 0xAC, 0x01 }; -static const u8 abyOUIPSK[4] = { 0x00, 0x0F, 0xAC, 0x02 }; - -/*+ - * - * Description: - * Clear RSN information in BSSList. - * - * Parameters: - * In: - * pBSSNode - BSS list. - * Out: - * none - * - * Return Value: none. - * --*/ -void -WPA2_ClearRSN ( - PKnownBSS pBSSNode - ) -{ - int ii; - - pBSSNode->bWPA2Valid = false; - - pBSSNode->byCSSGK = WLAN_11i_CSS_CCMP; - for (ii=0; ii < 4; ii ++) - pBSSNode->abyCSSPK[ii] = WLAN_11i_CSS_CCMP; - pBSSNode->wCSSPKCount = 1; - for (ii=0; ii < 4; ii ++) - pBSSNode->abyAKMSSAuthType[ii] = WLAN_11i_AKMSS_802_1X; - pBSSNode->wAKMSSAuthCount = 1; - pBSSNode->sRSNCapObj.bRSNCapExist = false; - pBSSNode->sRSNCapObj.wRSNCap = 0; -} - -/*+ - * - * Description: - * Parse RSN IE. - * - * Parameters: - * In: - * pBSSNode - BSS list. - * pRSN - Pointer to the RSN IE. - * Out: - * none - * - * Return Value: none. - * --*/ -void -WPA2vParseRSN ( - PKnownBSS pBSSNode, - PWLAN_IE_RSN pRSN - ) -{ - int i, j; - u16 m = 0, n = 0; - u8 * pbyOUI; - bool bUseGK = false; - - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"WPA2_ParseRSN: [%d]\n", pRSN->len); - - WPA2_ClearRSN(pBSSNode); - - if (pRSN->len == 2) { // ver(2) - if ((pRSN->byElementID == WLAN_EID_RSN) && (pRSN->wVersion == 1)) { - pBSSNode->bWPA2Valid = true; - } - return; - } - - if (pRSN->len < 6) { // ver(2) + GK(4) - // invalid CSS, P802.11i/D10.0, p31 - return; - } - - // information element header makes sense - if ((pRSN->byElementID == WLAN_EID_RSN) && - (pRSN->wVersion == 1)) { - - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Legal 802.11i RSN\n"); - - pbyOUI = &(pRSN->abyRSN[0]); - if ( !memcmp(pbyOUI, abyOUIWEP40, 4)) - pBSSNode->byCSSGK = WLAN_11i_CSS_WEP40; - else if ( !memcmp(pbyOUI, abyOUITKIP, 4)) - pBSSNode->byCSSGK = WLAN_11i_CSS_TKIP; - else if ( !memcmp(pbyOUI, abyOUICCMP, 4)) - pBSSNode->byCSSGK = WLAN_11i_CSS_CCMP; - else if ( !memcmp(pbyOUI, abyOUIWEP104, 4)) - pBSSNode->byCSSGK = WLAN_11i_CSS_WEP104; - else if ( !memcmp(pbyOUI, abyOUIGK, 4)) { - // invalid CSS, P802.11i/D10.0, p32 - return; - } else - // any vendor checks here - pBSSNode->byCSSGK = WLAN_11i_CSS_UNKNOWN; - - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"802.11i CSS: %X\n", pBSSNode->byCSSGK); - - if (pRSN->len == 6) { - pBSSNode->bWPA2Valid = true; - return; - } - - if (pRSN->len >= 8) { // ver(2) + GK(4) + PK count(2) - pBSSNode->wCSSPKCount = *((u16 *) &(pRSN->abyRSN[4])); - j = 0; - pbyOUI = &(pRSN->abyRSN[6]); - - for (i = 0; (i < pBSSNode->wCSSPKCount) && (j < sizeof(pBSSNode->abyCSSPK)/sizeof(u8)); i++) { - - if (pRSN->len >= 8+i*4+4) { // ver(2)+GK(4)+PKCnt(2)+PKS(4*i) - if ( !memcmp(pbyOUI, abyOUIGK, 4)) { - pBSSNode->abyCSSPK[j++] = WLAN_11i_CSS_USE_GROUP; - bUseGK = true; - } else if ( !memcmp(pbyOUI, abyOUIWEP40, 4)) { - // Invalid CSS, continue parsing - } else if ( !memcmp(pbyOUI, abyOUITKIP, 4)) { - if (pBSSNode->byCSSGK != WLAN_11i_CSS_CCMP) - pBSSNode->abyCSSPK[j++] = WLAN_11i_CSS_TKIP; - else - ; // Invalid CSS, continue parsing - } else if ( !memcmp(pbyOUI, abyOUICCMP, 4)) { - pBSSNode->abyCSSPK[j++] = WLAN_11i_CSS_CCMP; - } else if ( !memcmp(pbyOUI, abyOUIWEP104, 4)) { - // Invalid CSS, continue parsing - } else { - // any vendor checks here - pBSSNode->abyCSSPK[j++] = WLAN_11i_CSS_UNKNOWN; - } - pbyOUI += 4; - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"abyCSSPK[%d]: %X\n", j-1, pBSSNode->abyCSSPK[j-1]); - } else - break; - } //for - - if (bUseGK == true) { - if (j != 1) { - // invalid CSS, This should be only PK CSS. - return; - } - if (pBSSNode->byCSSGK == WLAN_11i_CSS_CCMP) { - // invalid CSS, If CCMP is enable , PK can't be CSSGK. - return; - } - } - if ((pBSSNode->wCSSPKCount != 0) && (j == 0)) { - // invalid CSS, No valid PK. - return; - } - pBSSNode->wCSSPKCount = (u16)j; - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"wCSSPKCount: %d\n", pBSSNode->wCSSPKCount); - } - - m = *((u16 *) &(pRSN->abyRSN[4])); - - if (pRSN->len >= 10+m*4) { // ver(2) + GK(4) + PK count(2) + PKS(4*m) + AKMSS count(2) - pBSSNode->wAKMSSAuthCount = *((u16 *) &(pRSN->abyRSN[6+4*m])); - j = 0; - pbyOUI = &(pRSN->abyRSN[8+4*m]); - for (i = 0; (i < pBSSNode->wAKMSSAuthCount) && (j < sizeof(pBSSNode->abyAKMSSAuthType)/sizeof(u8)); i++) { - if (pRSN->len >= 10+(m+i)*4+4) { // ver(2)+GK(4)+PKCnt(2)+PKS(4*m)+AKMSS(2)+AKS(4*i) - if ( !memcmp(pbyOUI, abyOUI8021X, 4)) - pBSSNode->abyAKMSSAuthType[j++] = WLAN_11i_AKMSS_802_1X; - else if ( !memcmp(pbyOUI, abyOUIPSK, 4)) - pBSSNode->abyAKMSSAuthType[j++] = WLAN_11i_AKMSS_PSK; - else - // any vendor checks here - pBSSNode->abyAKMSSAuthType[j++] = WLAN_11i_AKMSS_UNKNOWN; - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"abyAKMSSAuthType[%d]: %X\n", j-1, pBSSNode->abyAKMSSAuthType[j-1]); - } else - break; - } - pBSSNode->wAKMSSAuthCount = (u16)j; - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"wAKMSSAuthCount: %d\n", pBSSNode->wAKMSSAuthCount); - - n = *((u16 *) &(pRSN->abyRSN[6+4*m])); - if (pRSN->len >= 12+4*m+4*n) { // ver(2)+GK(4)+PKCnt(2)+PKS(4*m)+AKMSSCnt(2)+AKMSS(4*n)+Cap(2) - pBSSNode->sRSNCapObj.bRSNCapExist = true; - pBSSNode->sRSNCapObj.wRSNCap = *((u16 *) &(pRSN->abyRSN[8+4*m+4*n])); - } - } - //ignore PMKID lists bcs only (Re)Assocrequest has this field - pBSSNode->bWPA2Valid = true; - } -} diff --git a/drivers/staging/vt6656/wpa2.h b/drivers/staging/vt6656/wpa2.h deleted file mode 100644 index dc505ce7a7e4..000000000000 --- a/drivers/staging/vt6656/wpa2.h +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright (c) 1996, 2003 VIA Networking Technologies, Inc. - * All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - * - * - * File: wpa2.h - * - * Purpose: Defines the macros, types, and functions for dealing - * with WPA2 informations. - * - * Author: Yiching Chen - * - * Date: Oct. 4, 2004 - * - */ - -#ifndef __WPA2_H__ -#define __WPA2_H__ - -#include "80211mgr.h" -#include "80211hdr.h" -#include "bssdb.h" - -#define MAX_PMKID_CACHE 16 - -typedef struct tagsPMKIDInfo { - u8 abyBSSID[6]; - u8 abyPMKID[16]; -} PMKIDInfo, *PPMKIDInfo; - -typedef struct tagSPMKIDCache { - u32 BSSIDInfoCount; - PMKIDInfo BSSIDInfo[MAX_PMKID_CACHE]; -} SPMKIDCache, *PSPMKIDCache; - -void WPA2_ClearRSN(PKnownBSS pBSSNode); -void WPA2vParseRSN(PKnownBSS pBSSNode, PWLAN_IE_RSN pRSN); - -#endif /* __WPA2_H__ */ diff --git a/drivers/staging/vt6656/wpactl.c b/drivers/staging/vt6656/wpactl.c deleted file mode 100644 index 0a067151eca5..000000000000 --- a/drivers/staging/vt6656/wpactl.c +++ /dev/null @@ -1,247 +0,0 @@ -/* - * Copyright (c) 1996, 2003 VIA Networking Technologies, Inc. - * All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - * - * - * File: wpactl.c - * - * Purpose: handle wpa supplicant ioctl input/out functions - * - * Author: Lyndon Chen - * - * Date: July 28, 2006 - * - * Functions: - * - * Revision History: - * - */ - -#include "wpactl.h" -#include "key.h" -#include "mac.h" -#include "device.h" -#include "wmgr.h" -#include "iocmd.h" -#include "iowpa.h" -#include "usbpipe.h" -#include "rf.h" - -static int msglevel = MSG_LEVEL_INFO; - -/* - * Description: - * Set WPA algorithm & keys - * - * Parameters: - * In: - * pDevice - - * param - - * Out: - * - * Return Value: - * - */ -int wpa_set_keys(struct vnt_private *pDevice, void *ctx) -{ - struct viawget_wpa_param *param = ctx; - struct vnt_manager *pMgmt = &pDevice->vnt_mgmt; - u32 dwKeyIndex = 0; - u8 abyKey[MAX_KEY_LEN]; - u8 abySeq[MAX_KEY_LEN]; - u64 KeyRSC; - u8 byKeyDecMode = KEY_CTL_WEP; - int ret = 0; - u8 uu; - int ii; - - if (param->u.wpa_key.alg_name > WPA_ALG_CCMP) - return -EINVAL; - - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "param->u.wpa_key.alg_name = %d \n", - param->u.wpa_key.alg_name); - if (param->u.wpa_key.alg_name == WPA_ALG_NONE) { - pDevice->eEncryptionStatus = Ndis802_11EncryptionDisabled; - pDevice->bEncryptionEnable = false; - pDevice->byKeyIndex = 0; - pDevice->bTransmitKey = false; - for (uu=0; uu<MAX_KEY_TABLE; uu++) { - MACvDisableKeyEntry(pDevice, uu); - } - return ret; - } - - if (param->u.wpa_key.key_len > sizeof(abyKey)) - return -EINVAL; - - memcpy(&abyKey[0], param->u.wpa_key.key, param->u.wpa_key.key_len); - - dwKeyIndex = (u32)(param->u.wpa_key.key_index); - - if (param->u.wpa_key.alg_name == WPA_ALG_WEP) { - if (dwKeyIndex > 3) { - return -EINVAL; - } else { - if (param->u.wpa_key.set_tx) { - pDevice->byKeyIndex = (u8)dwKeyIndex; - pDevice->bTransmitKey = true; - dwKeyIndex |= (1 << 31); - } - KeybSetDefaultKey( pDevice, - &(pDevice->sKey), - dwKeyIndex & ~(BIT30 | USE_KEYRSC), - param->u.wpa_key.key_len, - NULL, - abyKey, - KEY_CTL_WEP - ); - - } - pDevice->eEncryptionStatus = Ndis802_11Encryption1Enabled; - pDevice->bEncryptionEnable = true; - return ret; - } - - if (param->u.wpa_key.seq && param->u.wpa_key.seq_len > sizeof(abySeq)) - return -EINVAL; - - memcpy(&abySeq[0], param->u.wpa_key.seq, param->u.wpa_key.seq_len); - - if (param->u.wpa_key.seq_len > 0) { - for (ii = 0 ; ii < param->u.wpa_key.seq_len ; ii++) { - if (ii < 4) - KeyRSC |= (abySeq[ii] << (ii * 8)); - else - KeyRSC |= (abySeq[ii] << ((ii-4) * 8)); - } - dwKeyIndex |= 1 << 29; - } - - if (param->u.wpa_key.key_index >= MAX_GROUP_KEY) { - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "return dwKeyIndex > 3\n"); - return -EINVAL; - } - - if (param->u.wpa_key.alg_name == WPA_ALG_TKIP) { - pDevice->eEncryptionStatus = Ndis802_11Encryption2Enabled; - } - - if (param->u.wpa_key.alg_name == WPA_ALG_CCMP) { - pDevice->eEncryptionStatus = Ndis802_11Encryption3Enabled; - } - - if (param->u.wpa_key.set_tx) - dwKeyIndex |= (1 << 31); - - if (pDevice->eEncryptionStatus == Ndis802_11Encryption3Enabled) - byKeyDecMode = KEY_CTL_CCMP; - else if (pDevice->eEncryptionStatus == Ndis802_11Encryption2Enabled) - byKeyDecMode = KEY_CTL_TKIP; - else - byKeyDecMode = KEY_CTL_WEP; - - // Fix HCT test that set 256 bits KEY and Ndis802_11Encryption3Enabled - if (pDevice->eEncryptionStatus == Ndis802_11Encryption3Enabled) { - if (param->u.wpa_key.key_len == MAX_KEY_LEN) - byKeyDecMode = KEY_CTL_TKIP; - else if (param->u.wpa_key.key_len == WLAN_WEP40_KEYLEN) - byKeyDecMode = KEY_CTL_WEP; - else if (param->u.wpa_key.key_len == WLAN_WEP104_KEYLEN) - byKeyDecMode = KEY_CTL_WEP; - } else if (pDevice->eEncryptionStatus == Ndis802_11Encryption2Enabled) { - if (param->u.wpa_key.key_len == WLAN_WEP40_KEYLEN) - byKeyDecMode = KEY_CTL_WEP; - else if (param->u.wpa_key.key_len == WLAN_WEP104_KEYLEN) - byKeyDecMode = KEY_CTL_WEP; - } - - // Check TKIP key length - if ((byKeyDecMode == KEY_CTL_TKIP) && - (param->u.wpa_key.key_len != MAX_KEY_LEN)) { - // TKIP Key must be 256 bits - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "return - TKIP Key must be 256 bits!\n"); - return -EINVAL; - } - // Check AES key length - if ((byKeyDecMode == KEY_CTL_CCMP) && - (param->u.wpa_key.key_len != AES_KEY_LEN)) { - // AES Key must be 128 bits - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "return - AES Key must be 128 bits\n"); - return -EINVAL; - } - - if (is_broadcast_ether_addr(¶m->addr[0]) || (param->addr == NULL)) { - /* if broadcast, set the key as every key entry's group key */ - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Groupe Key Assign.\n"); - - if ((KeybSetAllGroupKey(pDevice, &(pDevice->sKey), dwKeyIndex, - param->u.wpa_key.key_len, - &KeyRSC, - (u8 *)abyKey, - byKeyDecMode - ) == true) && - (KeybSetDefaultKey(pDevice, - &(pDevice->sKey), - dwKeyIndex, - param->u.wpa_key.key_len, - &KeyRSC, - (u8 *)abyKey, - byKeyDecMode - ) == true) ) { - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "GROUP Key Assign.\n"); - } else { - return -EINVAL; - } - } else { - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Pairwise Key Assign.\n"); - // BSSID not 0xffffffffffff - // Pairwise Key can't be WEP - if (byKeyDecMode == KEY_CTL_WEP) { - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Pairwise Key can't be WEP\n"); - return -EINVAL; - } - dwKeyIndex |= (1 << 30); // set pairwise key - if (pMgmt->eConfigMode == WMAC_CONFIG_IBSS_STA) { - //DBG_PRN_WLAN03(("return NDIS_STATUS_INVALID_DATA - WMAC_CONFIG_IBSS_STA\n")); - return -EINVAL; - } - if (KeybSetKey(pDevice, &(pDevice->sKey), ¶m->addr[0], - dwKeyIndex, param->u.wpa_key.key_len, - &KeyRSC, (u8 *)abyKey, byKeyDecMode - ) == true) { - DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Pairwise Key Set\n"); - } else { - // Key Table Full - if (ether_addr_equal(param->addr, pDevice->abyBSSID)) { - //DBG_PRN_WLAN03(("return NDIS_STATUS_INVALID_DATA -Key Table Full.2\n")); - return -EINVAL; - } else { - // Save Key and configure just before associate/reassociate to BSSID - // we do not implement now - return -EINVAL; - } - } - } // BSSID not 0xffffffffffff - if ((ret == 0) && ((param->u.wpa_key.set_tx) != 0)) { - pDevice->byKeyIndex = (u8)param->u.wpa_key.key_index; - pDevice->bTransmitKey = true; - } - pDevice->bEncryptionEnable = true; - - return ret; -} - diff --git a/drivers/staging/vt6656/wpactl.h b/drivers/staging/vt6656/wpactl.h deleted file mode 100644 index e032a1b94ae8..000000000000 --- a/drivers/staging/vt6656/wpactl.h +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright (c) 1996, 2003 VIA Networking Technologies, Inc. - * All rights reserved. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - * - * File: wpactl.h - * - * Purpose: - * - * Author: Lyndon Chen - * - * Date: March 1, 2005 - * - */ - -#ifndef __WPACTL_H__ -#define __WPACTL_H__ - -#include "device.h" -#include "iowpa.h" - -//WPA related - -typedef enum { WPA_ALG_NONE, WPA_ALG_WEP, WPA_ALG_TKIP, WPA_ALG_CCMP } wpa_alg; - -#define AUTH_ALG_OPEN_SYSTEM 0x01 -#define AUTH_ALG_SHARED_KEY 0x02 -#define AUTH_ALG_LEAP 0x04 - -typedef unsigned long long NDIS_802_11_KEY_RSC; - -int wpa_set_keys(struct vnt_private *, void *ctx); - -#endif /* __WPACL_H__ */ |