diff options
Diffstat (limited to 'drivers/staging/winbond')
63 files changed, 7013 insertions, 12744 deletions
diff --git a/drivers/staging/winbond/Kconfig b/drivers/staging/winbond/Kconfig index 425219ed7ab..db5b053d9bc 100644 --- a/drivers/staging/winbond/Kconfig +++ b/drivers/staging/winbond/Kconfig @@ -1,7 +1,11 @@ config W35UND - tristate "Winbond driver" - depends on MAC80211 && WLAN_80211 && USB && EXPERIMENTAL && !4KSTACKS + tristate "IS89C35 WLAN USB driver" + depends on MAC80211 && WLAN && USB default n ---help--- - This is highly experimental driver for winbond wifi card on some Kohjinsha notebooks - Check http://code.google.com/p/winbondport/ for new version + This is highly experimental driver for Winbond WIFI card. + + Hardware is present in some Kohjinsha subnotebooks, and in some + stand-alone USB modules. Chipset name seems to be w89c35d. + + Check <http://code.google.com/p/winbondport/> for new version. diff --git a/drivers/staging/winbond/Makefile b/drivers/staging/winbond/Makefile index 29c98bf1bc9..081d48db04c 100644 --- a/drivers/staging/winbond/Makefile +++ b/drivers/staging/winbond/Makefile @@ -1,15 +1,12 @@ - DRIVER_DIR=./linux - -w35und-objs := $(DRIVER_DIR)/wbusb.o $(DRIVER_DIR)/wb35reg.o $(DRIVER_DIR)/wb35rx.o $(DRIVER_DIR)/wb35tx.o \ - mds.o \ - mlmetxrx.o \ - mto.o \ +w35und-y := \ + mds.o \ + mto.o \ phy_calibration.o \ reg.o \ - rxisr.o \ - sme_api.o \ - wbhal.o \ - wblinux.o \ + wb35reg.o \ + wb35rx.o \ + wb35tx.o \ + wbusb.o \ obj-$(CONFIG_W35UND) += w35und.o diff --git a/drivers/staging/winbond/README b/drivers/staging/winbond/TODO index cb944e4bf17..b4c592a9684 100644 --- a/drivers/staging/winbond/README +++ b/drivers/staging/winbond/TODO @@ -2,10 +2,11 @@ TODO: - sparse cleanups - checkpatch cleanups - kerneldoc cleanups - - remove typedefs + - fix severeCamelCaseInfestation - remove unused ioctls - use cfg80211 for regulatory stuff - fix 4k stack problems + - fix locking problems (it's done using atomics...) Please send patches to Greg Kroah-Hartman <greg@kroah.com> and -Pavel Machek <pavel@suse.cz> +Pavel Machek <pavel@ucw.cz> diff --git a/drivers/staging/winbond/adapter.h b/drivers/staging/winbond/adapter.h deleted file mode 100644 index 609701d21cf..00000000000 --- a/drivers/staging/winbond/adapter.h +++ /dev/null @@ -1,23 +0,0 @@ -// -// ADAPTER.H - -// Windows NDIS global variable 'Adapter' typedef -// -#define MAX_ANSI_STRING 40 -typedef struct WB32_ADAPTER -{ - u32 AdapterIndex; // 20060703.4 Add for using pAdapterContext global Adapter point - - WB_LOCALDESCRIPT sLocalPara; // Myself connected parameters - PWB_BSSDESCRIPTION asBSSDescriptElement; - - MLME_FRAME sMlmeFrame; // connect to peerSTA parameters - - MTO_PARAMETERS sMtoPara; // MTO_struct ... - hw_data_t sHwData; //For HAL - MDS Mds; - - WBLINUX WbLinux; - struct iw_statistics iw_stats; - - u8 LinkName[MAX_ANSI_STRING]; -} WB32_ADAPTER, ADAPTER, *PWB32_ADAPTER, *PADAPTER; diff --git a/drivers/staging/winbond/bss_f.h b/drivers/staging/winbond/bss_f.h deleted file mode 100644 index 01318315399..00000000000 --- a/drivers/staging/winbond/bss_f.h +++ /dev/null @@ -1,59 +0,0 @@ -// -// BSS descriptor DataBase management global function -// - -void vBSSdescriptionInit(PWB32_ADAPTER Adapter); -void vBSSfoundList(PWB32_ADAPTER Adapter); -u8 boChanFilter(PWB32_ADAPTER Adapter, u8 ChanNo); -u16 wBSSallocateEntry(PWB32_ADAPTER Adapter); -u16 wBSSGetEntry(PWB32_ADAPTER Adapter); -void vSimpleHouseKeeping(PWB32_ADAPTER Adapter); -u16 wBSShouseKeeping(PWB32_ADAPTER Adapter); -void ClearBSSdescpt(PWB32_ADAPTER Adapter, u16 i); -u16 wBSSfindBssID(PWB32_ADAPTER Adapter, u8 *pbBssid); -u16 wBSSfindDedicateCandidate(PWB32_ADAPTER Adapter, struct SSID_Element *psSsid, u8 *pbBssid); -u16 wBSSfindMACaddr(PWB32_ADAPTER Adapter, u8 *pbMacAddr); -u16 wBSSsearchMACaddr(PWB32_ADAPTER Adapter, u8 *pbMacAddr, u8 band); -u16 wBSSaddScanData(PWB32_ADAPTER, u16, psRXDATA); -u16 wBSSUpdateScanData(PWB32_ADAPTER Adapter, u16 wBssIdx, psRXDATA psRcvData); -u16 wBSScreateIBSSdata(PWB32_ADAPTER Adapter, PWB_BSSDESCRIPTION psDesData); -void DesiredRate2BSSdescriptor(PWB32_ADAPTER Adapter, PWB_BSSDESCRIPTION psDesData, - u8 *pBasicRateSet, u8 BasicRateCount, - u8 *pOperationRateSet, u8 OperationRateCount); -void DesiredRate2InfoElement(PWB32_ADAPTER Adapter, u8 *addr, u16 *iFildOffset, - u8 *pBasicRateSet, u8 BasicRateCount, - u8 *pOperationRateSet, u8 OperationRateCount); -void BSSAddIBSSdata(PWB32_ADAPTER Adapter, PWB_BSSDESCRIPTION psDesData); -unsigned char boCmpMacAddr( u8 *, u8 *); -unsigned char boCmpSSID(struct SSID_Element *psSSID1, struct SSID_Element *psSSID2); -u16 wBSSfindSSID(PWB32_ADAPTER Adapter, struct SSID_Element *psSsid); -u16 wRoamingQuery(PWB32_ADAPTER Adapter); -void vRateToBitmap(PWB32_ADAPTER Adapter, u16 index); -u8 bRateToBitmapIndex(PWB32_ADAPTER Adapter, u8 bRate); -u8 bBitmapToRate(u8 i); -unsigned char boIsERPsta(PWB32_ADAPTER Adapter, u16 i); -unsigned char boCheckConnect(PWB32_ADAPTER Adapter); -unsigned char boCheckSignal(PWB32_ADAPTER Adapter); -void AddIBSSIe(PWB32_ADAPTER Adapter,PWB_BSSDESCRIPTION psDesData );//added by ws for WPA_None06/01/04 -void BssScanUpToDate(PWB32_ADAPTER Adapter); -void BssUpToDate(PWB32_ADAPTER Adapter); -void RateSort(u8 *RateArray, u8 num, u8 mode); -void RateReSortForSRate(PWB32_ADAPTER Adapter, u8 *RateArray, u8 num); -void Assemble_IE(PWB32_ADAPTER Adapter, u16 wBssIdx); -void SetMaxTxRate(PWB32_ADAPTER Adapter); - -void CreateWpaIE(PWB32_ADAPTER Adapter, u16* iFildOffset, u8 *msg, struct Management_Frame* msgHeader, - struct Association_Request_Frame_Body* msgBody, u16 iMSindex); //added by WS 05/14/05 - -#ifdef _WPA2_ -void CreateRsnIE(PWB32_ADAPTER Adapter, u16* iFildOffset, u8 *msg, struct Management_Frame* msgHeader, - struct Association_Request_Frame_Body* msgBody, u16 iMSindex);//added by WS 05/14/05 - -u16 SearchPmkid(PWB32_ADAPTER Adapter, struct Management_Frame* msgHeader, - struct PMKID_Information_Element * AssoReq_PMKID ); -#endif - - - - - diff --git a/drivers/staging/winbond/bssdscpt.h b/drivers/staging/winbond/bssdscpt.h deleted file mode 100644 index 97150a2655f..00000000000 --- a/drivers/staging/winbond/bssdscpt.h +++ /dev/null @@ -1,156 +0,0 @@ -//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -// bssdscpt.c -// BSS descriptor data base -// history : -// -// Description: -// BSS descriptor data base will store the information of the stations at the -// surrounding environment. The first entry( psBSS(0) ) will not be used and the -// second one( psBSS(1) ) will be used for the broadcast address. -//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - -//#define MAX_ACC_RSSI_COUNT 10 -#define MAX_ACC_RSSI_COUNT 6 - -/////////////////////////////////////////////////////////////////////////// -// -// BSS Description set Element , to store scan received Beacon information -// -// Our's differs slightly from the specs. The specify a PHY_Parameter_Set. -// Since we're only doing a DS design right now, we just have a DS structure. -////////////////////////////////////////////////////////////////////////////// -typedef struct BSSDescriptionElement -{ - u32 SlotValid; - u32 PowerSaveMode; - RXLAYER1 RxLayer1; - - u8 abPeerAddress[ MAC_ADDR_LENGTH + 2 ]; // peer MAC Address associated with this session. 6-OCTET value - u32 dwBgScanStamp; // BgScan Sequence Counter stamp, record psROAM->dwScanCounter. - - u16 Beacon_Period; - u16 wATIM_Window; - - u8 abBssID[ MAC_ADDR_LENGTH + 2 ]; // 6B - - u8 bBssType; - u8 DTIM_Period; // 1 octet usually from TIM element, if present - u8 boInTimerHandler; - u8 boERP; // analysis ERP or (extended) supported rate element - - u8 Timestamp[8]; - u8 BasicRate[32]; - u8 OperationalRate[32]; - u32 dwBasicRateBitmap; //bit map, retrieve from SupportedRateSet - u32 dwOperationalRateBitmap; //bit map, retrieve from SupportedRateSet and - // ExtendedSupportedRateSet - // For RSSI calculating - u32 HalRssi[MAX_ACC_RSSI_COUNT]; // Encode. It must use MACRO of HAL to get the LNA and AGC data - u32 HalRssiIndex; - - ////From beacon/probe response - struct SSID_Element SSID; // 34B - u8 reserved_1[ 2 ]; - - struct Capability_Information_Element CapabilityInformation; // 2B - u8 reserved_2[ 2 ]; - - struct CF_Parameter_Set_Element CF_Parameter_Set; // 8B - struct IBSS_Parameter_Set_Element IBSS_Parameter_Set; // 4B - struct TIM_Element TIM_Element_Set; // 256B - - struct DS_Parameter_Set_Element DS_Parameter_Set; // 3B - u8 reserved_3; - - struct ERP_Information_Element ERP_Information_Set; // 3B - u8 reserved_4; - - struct Supported_Rates_Element SupportedRateSet; // 10B - u8 reserved_5[2]; - - struct Extended_Supported_Rates_Element ExtendedSupportedRateSet; // 257B - u8 reserved_6[3]; - - u8 band; - u8 reserved_7[3]; - - // for MLME module - u16 wState; // the current state of the system - u16 wIndex; // THIS BSS element entry index - - void* psAdapter; // pointer to THIS Adapter - OS_TIMER nTimer; // MLME timer - - // Authentication - u16 wAuthAlgo; // peer MAC MLME use Auth algorithm, default OPEN_AUTH - u16 wAuthSeqNum; // current local MAC sendout AuthReq sequence number - - u8 auth_challengeText[128]; - - ////For XP: - u32 ies_len; // information element length - u8 ies[256]; // information element - - ////For WPA - u8 RsnIe_Type[2]; //added by ws for distinguish WPA and WPA2 05/14/04 - u8 RsnIe_len; - u8 Rsn_Num; - - // to record the rsn cipher suites,addded by ws 09/05/04 - SUITE_SELECTOR group_cipher; // 4B - SUITE_SELECTOR pairwise_key_cipher_suites[WLAN_MAX_PAIRWISE_CIPHER_SUITE_COUNT]; - SUITE_SELECTOR auth_key_mgt_suites[WLAN_MAX_AUTH_KEY_MGT_SUITE_LIST_COUNT]; - - u16 pairwise_key_cipher_suite_count; - u16 auth_key_mgt_suite_count; - - u8 pairwise_key_cipher_suite_selected; - u8 auth_key_mgt_suite_selected; - u8 reserved_8[2]; - - struct RSN_Capability_Element rsn_capabilities; // 2B - u8 reserved_9[2]; - - //to record the rsn cipher suites for WPA2 - #ifdef _WPA2_ - u32 pre_auth; //added by WS for distinguish for 05/04/04 - SUITE_SELECTOR wpa2_group_cipher; // 4B - SUITE_SELECTOR wpa2_pairwise_key_cipher_suites[WLAN_MAX_PAIRWISE_CIPHER_SUITE_COUNT]; - SUITE_SELECTOR wpa2_auth_key_mgt_suites[WLAN_MAX_AUTH_KEY_MGT_SUITE_LIST_COUNT]; - - u16 wpa2_pairwise_key_cipher_suite_count; - u16 wpa2_auth_key_mgt_suite_count; - - u8 wpa2_pairwise_key_cipher_suite_selected; - u8 wpa2_auth_key_mgt_suite_selected; - u8 reserved_10[2]; - - struct RSN_Capability_Element wpa2_rsn_capabilities; // 2B - u8 reserved_11[2]; - #endif //endif _WPA2_ - - //For Replay protection -// u8 PairwiseTSC[6]; -// u8 GroupTSC[6]; - - ////For up-to-date - u32 ScanTimeStamp; //for the decision whether the station/AP(may exist at - //different channels) has left. It must be detected by - //scanning. Local device may connected or disconnected. - u32 BssTimeStamp; //Only for the decision whether the station/AP(exist in - //the same channel, and no scanning) if local device has - //connected successfully. - - // 20061108 Add for storing WPS_IE. [E id][Length][OUI][Data] - u8 WPS_IE_Data[MAX_IE_APPEND_SIZE]; - u16 WPS_IE_length; - u16 WPS_IE_length_tmp; // For verify there is an WPS_IE in Beacon or probe response - -} WB_BSSDESCRIPTION, *PWB_BSSDESCRIPTION; - -#define wBSSConnectedSTA(Adapter) \ - ((u16)(Adapter)->sLocalPara.wConnectedSTAindex) - -#define psBSS(i) (&(Adapter->asBSSDescriptElement[(i)])) - - diff --git a/drivers/staging/winbond/core.h b/drivers/staging/winbond/core.h new file mode 100644 index 00000000000..fc0ef24fad3 --- /dev/null +++ b/drivers/staging/winbond/core.h @@ -0,0 +1,61 @@ +#ifndef __WINBOND_CORE_H +#define __WINBOND_CORE_H + +#include <linux/wireless.h> +#include <linux/types.h> +#include <linux/delay.h> + +#include "wbhal.h" +#include "mto.h" + +#include "mac_structures.h" +#include "mds_s.h" + +#define MAX_NUM_TX_MMPDU 2 +#define MAX_MMPDU_SIZE 1512 +#define MAX_NUM_RX_MMPDU 6 + +struct mlme_frame { + s8 *pMMPDU; + u16 len; + u8 data_type; + u8 is_in_used; + + u8 TxMMPDU[MAX_NUM_TX_MMPDU][MAX_MMPDU_SIZE]; + u8 TxMMPDUInUse[(MAX_NUM_TX_MMPDU + 3) & ~0x03]; + + u16 wNumTxMMPDU; + u16 wNumTxMMPDUDiscarded; + + u8 RxMMPDU[MAX_NUM_RX_MMPDU][MAX_MMPDU_SIZE]; + u8 SaveRxBufSlotInUse[(MAX_NUM_RX_MMPDU + 3) & ~0x03]; + + u16 wNumRxMMPDU; + u16 wNumRxMMPDUDiscarded; + + u16 wNumRxMMPDUInMLME; /* Number of the Rx MMPDU */ + u16 reserved_1; /* in MLME. */ + /* excluding the discarded */ +}; + +#define WBLINUX_PACKET_ARRAY_SIZE (ETHERNET_TX_DESCRIPTORS*4) + +#define WB_MAX_LINK_NAME_LEN 40 + +struct wbsoft_priv { + struct wb_local_para sLocalPara; /* Myself connected + parameters */ + + struct mlme_frame sMlmeFrame; /* connect to peerSTA parameters */ + + struct wb35_mto_params sMtoPara; /* MTO_struct ... */ + struct hw_data sHwData; /*For HAL */ + struct wb35_mds Mds; + + u32 RxByteCount; + u32 TxByteCount; + + bool enabled; +}; + +#endif /* __WINBOND_CORE_H */ diff --git a/drivers/staging/winbond/ds_tkip.h b/drivers/staging/winbond/ds_tkip.h deleted file mode 100644 index 6841d66e7e8..00000000000 --- a/drivers/staging/winbond/ds_tkip.h +++ /dev/null @@ -1,33 +0,0 @@ -// 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) ) - - -typedef struct tkip -{ - u32 K0, K1; // Key - union - { - struct // Current state - { - u32 L; - u32 R; - }; - u8 LR[8]; - }; - union - { - u32 M; // Message accumulator (single word) - u8 Mb[4]; - }; - s32 bytes_in_M; // # bytes in M -} tkip_t; - -//void _append_data( u8 *pData, u16 size, tkip_t *p ); -void Mds_MicGet( void* Adapter, void* pRxLayer1, u8 *pKey, u8 *pMic ); -void Mds_MicFill( void* Adapter, void* pDes, u8 *XmitBufAddress ); - - - diff --git a/drivers/staging/winbond/gl_80211.h b/drivers/staging/winbond/gl_80211.h deleted file mode 100644 index 1806d817496..00000000000 --- a/drivers/staging/winbond/gl_80211.h +++ /dev/null @@ -1,125 +0,0 @@ - -#ifndef __GL_80211_H__ -#define __GL_80211_H__ - -/****************** CONSTANT AND MACRO SECTION ******************************/ - -/* BSS Type */ -enum { - WLAN_BSSTYPE_INFRASTRUCTURE = 0, - WLAN_BSSTYPE_INDEPENDENT, - WLAN_BSSTYPE_ANY_BSS, -}; - - - -/* Preamble_Type, see <SFS-802.11G-MIB-203> */ -typedef enum preamble_type { - WLAN_PREAMBLE_TYPE_SHORT, - WLAN_PREAMBLE_TYPE_LONG, -} preamble_type_e; - - -/* Slot_Time_Type, see <SFS-802.11G-MIB-208> */ -typedef enum slot_time_type { - WLAN_SLOT_TIME_TYPE_LONG, - WLAN_SLOT_TIME_TYPE_SHORT, -} slot_time_type_e; - -/*--------------------------------------------------------------------------*/ -/* Encryption Mode */ -typedef enum { - WEP_DISABLE = 0, - WEP_64, - WEP_128, - - ENCRYPT_DISABLE, - ENCRYPT_WEP, - ENCRYPT_WEP_NOKEY, - ENCRYPT_TKIP, - ENCRYPT_TKIP_NOKEY, - ENCRYPT_CCMP, - ENCRYPT_CCMP_NOKEY, -} encryption_mode_e; - -typedef enum _WLAN_RADIO { - WLAN_RADIO_ON, - WLAN_RADIO_OFF, - WLAN_RADIO_MAX, // not a real type, defined as an upper bound -} WLAN_RADIO; - -typedef struct _WLAN_RADIO_STATUS { - WLAN_RADIO HWStatus; - WLAN_RADIO SWStatus; -} WLAN_RADIO_STATUS; - -//---------------------------------------------------------------------------- -// 20041021 1.1.81.1000 ybjiang -// add for radio notification -typedef -void (*RADIO_NOTIFICATION_HANDLER)( - void *Data, - void *RadioStatusBuffer, - u32 RadioStatusBufferLen - ); - -typedef struct _WLAN_RADIO_NOTIFICATION -{ - RADIO_NOTIFICATION_HANDLER RadioChangeHandler; - void *Data; -} WLAN_RADIO_NOTIFICATION; - -//---------------------------------------------------------------------------- -// 20041102 1.1.91.1000 ybjiang -// add for OID_802_11_CUST_REGION_CAPABILITIES and OID_802_11_OID_REGION -typedef enum _WLAN_REGION_CODE -{ - WLAN_REGION_UNKNOWN, - WLAN_REGION_EUROPE, - WLAN_REGION_JAPAN, - WLAN_REGION_USA, - WLAN_REGION_FRANCE, - WLAN_REGION_SPAIN, - WLAN_REGION_ISRAEL, - WLAN_REGION_MAX, // not a real type, defined as an upper bound -} WLAN_REGION_CODE; - -#define REGION_NAME_MAX_LENGTH 256 - -typedef struct _WLAN_REGION_CHANNELS -{ - u32 Length; - u32 NameLength; - u8 Name[REGION_NAME_MAX_LENGTH]; - WLAN_REGION_CODE Code; - u32 Frequency[1]; -} WLAN_REGION_CHANNELS; - -typedef struct _WLAN_REGION_CAPABILITIES -{ - u32 NumberOfItems; - WLAN_REGION_CHANNELS Region[1]; -} WLAN_REGION_CAPABILITIES; - -typedef struct _region_name_map { - WLAN_REGION_CODE region; - u8 *name; - u32 *channels; -} region_name_map; - -/*--------------------------------------------------------------------------*/ -#define MAC2STR(a) (a)[0], (a)[1], (a)[2], (a)[3], (a)[4], (a)[5] -#define MACSTR "%02X:%02X:%02X:%02X:%02X:%02X" - -// TODO: 0627 kevin -#define MIC2STR(a) (a)[0], (a)[1], (a)[2], (a)[3], (a)[4], (a)[5], (a)[6], (a)[7] -#define MICSTR "%02X %02X %02X %02X %02X %02X %02X %02X" - -#define MICKEY2STR(a) MIC2STR(a) -#define MICKEYSTR MICSTR - - -#endif /* __GL_80211_H__ */ -/*** end of file ***/ - - diff --git a/drivers/staging/winbond/ioctls.h b/drivers/staging/winbond/ioctls.h deleted file mode 100644 index e8b35dc7e32..00000000000 --- a/drivers/staging/winbond/ioctls.h +++ /dev/null @@ -1,678 +0,0 @@ -//============================================================================ -// IOCTLS.H - -// -// Description: -// Define the IOCTL codes. -// -// Revision history: -// -------------------------------------------------------------------------- -// -// Copyright (c) 2002-2004 Winbond Electronics Corp. All rights reserved. -//============================================================================= - -#ifndef _IOCTLS_H -#define _IOCTLS_H - -// PD43 Keep it - Used with the Win33 application -// #include <winioctl.h> - -//======================================================== -// 20040108 ADD the follow for test -//======================================================== -#define INFORMATION_LENGTH sizeof(unsigned int) - -#define WB32_IOCTL_INDEX 0x0900 //×§ďĽHŤKŹŰŽe// - -#define Wb32_RegisterRead CTL_CODE( \ - FILE_DEVICE_UNKNOWN, \ - WB32_IOCTL_INDEX + 0, \ - METHOD_BUFFERED, \ - FILE_ANY_ACCESS) - -#define Wb32_RegisterWrite CTL_CODE( \ - FILE_DEVICE_UNKNOWN, \ - WB32_IOCTL_INDEX + 1, \ - METHOD_BUFFERED, \ - FILE_ANY_ACCESS) - -#define Wb32_SendPacket CTL_CODE( \ - FILE_DEVICE_UNKNOWN, \ - WB32_IOCTL_INDEX + 2, \ - METHOD_BUFFERED, \ - FILE_ANY_ACCESS) - -#define Wb32_QuerySendResult CTL_CODE( \ - FILE_DEVICE_UNKNOWN, \ - WB32_IOCTL_INDEX + 3, \ - METHOD_BUFFERED, \ - FILE_ANY_ACCESS) - -#define Wb32_SetFragmentThreshold CTL_CODE( \ - FILE_DEVICE_UNKNOWN, \ - WB32_IOCTL_INDEX + 4, \ - METHOD_BUFFERED, \ - FILE_ANY_ACCESS) - -#define Wb32_SetLinkStatus CTL_CODE( \ - FILE_DEVICE_UNKNOWN, \ - WB32_IOCTL_INDEX + 5, \ - METHOD_BUFFERED, \ - FILE_ANY_ACCESS) - -#define Wb32_SetBulkIn CTL_CODE( \ - FILE_DEVICE_UNKNOWN, \ - WB32_IOCTL_INDEX + 6, \ - METHOD_BUFFERED, \ - FILE_ANY_ACCESS) - -#define Wb32_LoopbackTest CTL_CODE( \ - FILE_DEVICE_UNKNOWN, \ - WB32_IOCTL_INDEX + 7, \ - METHOD_BUFFERED, \ - FILE_ANY_ACCESS) - -#define Wb35_EEPromRead CTL_CODE( \ - FILE_DEVICE_UNKNOWN, \ - WB32_IOCTL_INDEX + 8, \ - METHOD_BUFFERED, \ - FILE_ANY_ACCESS) - -#define Wb35_EEPromWrite CTL_CODE( \ - FILE_DEVICE_UNKNOWN, \ - WB32_IOCTL_INDEX + 9, \ - METHOD_BUFFERED, \ - FILE_ANY_ACCESS) - -#define Wb35_FlashReadData CTL_CODE( \ - FILE_DEVICE_UNKNOWN, \ - WB32_IOCTL_INDEX + 10, \ - METHOD_BUFFERED, \ - FILE_ANY_ACCESS) - -#define Wb35_FlashWrite CTL_CODE( \ - FILE_DEVICE_UNKNOWN, \ - WB32_IOCTL_INDEX + 11, \ - METHOD_BUFFERED, \ - FILE_ANY_ACCESS) - -#define Wb35_FlashWriteBurst CTL_CODE( \ - FILE_DEVICE_UNKNOWN, \ - WB32_IOCTL_INDEX + 12, \ - METHOD_BUFFERED, \ - FILE_ANY_ACCESS) - -#define Wb35_TxBurstStart CTL_CODE( \ - FILE_DEVICE_UNKNOWN, \ - WB32_IOCTL_INDEX + 13, \ - METHOD_BUFFERED, \ - FILE_ANY_ACCESS) - -#define Wb35_TxBurstStop CTL_CODE( \ - FILE_DEVICE_UNKNOWN, \ - WB32_IOCTL_INDEX + 14, \ - METHOD_BUFFERED, \ - FILE_ANY_ACCESS) - -#define Wb35_TxBurstStatus CTL_CODE( \ - FILE_DEVICE_UNKNOWN, \ - WB32_IOCTL_INDEX + 15, \ - METHOD_BUFFERED, \ - FILE_ANY_ACCESS) - -// For IOCTL interface -//================================================ -#define LINKNAME_STRING "\\DosDevices\\W35UND" -#define NTDEVICE_STRING "\\Device\\W35UND" -#define APPLICATION_LINK "\\\\.\\W35UND" - -#define WB_IOCTL_INDEX 0x0800 -#define WB_IOCTL_TS_INDEX WB_IOCTL_INDEX + 60 -#define WB_IOCTL_DUT_INDEX WB_IOCTL_TS_INDEX + 40 - -//============================================================================= -// IOCTLS defined for DUT (Device Under Test) - -// IOCTL_WB_802_11_DUT_MAC_ADDRESS -// Query: Return the dot11StationID -// Set : Set the dot11StationID. Demo only. -// -#define IOCTL_WB_802_11_DUT_MAC_ADDRESS CTL_CODE( \ - FILE_DEVICE_UNKNOWN, \ - WB_IOCTL_DUT_INDEX + 1, \ - METHOD_BUFFERED, \ - FILE_ANY_ACCESS) - -// IOCTL_WB_802_11_DUT_BSS_DESCRIPTION -// Query: Return the info. of the current connected BSS. -// Set : None. -// -#define IOCTL_WB_802_11_DUT_BSS_DESCRIPTION CTL_CODE( \ - FILE_DEVICE_UNKNOWN, \ - WB_IOCTL_DUT_INDEX + 2, \ - METHOD_BUFFERED, \ - FILE_ANY_ACCESS) - -// IOCTL_WB_802_11_DUT_TX_RATE -// Query: Return the current transmission rate. -// Set : Set the transmission rate of the Tx packets. -// -#define IOCTL_WB_802_11_DUT_TX_RATE CTL_CODE( \ - FILE_DEVICE_UNKNOWN, \ - WB_IOCTL_DUT_INDEX + 3, \ - METHOD_BUFFERED, \ - FILE_ANY_ACCESS) - -// IOCTL_WB_802_11_DUT_CURRENT_STA_STATE -// Query: Return the current STA state. (WB_STASTATE type) -// Set : None. -// -#define IOCTL_WB_802_11_DUT_CURRENT_STA_STATE CTL_CODE( \ - FILE_DEVICE_UNKNOWN, \ - WB_IOCTL_DUT_INDEX + 4, \ - METHOD_BUFFERED, \ - FILE_ANY_ACCESS) - -/////////// 10/31/02' Added ///////////////////// - -// IOCTL_WB_802_11_DUT_START_IBSS_REQUEST -// Query: None. -// Set : Start a new IBSS -// -#define IOCTL_WB_802_11_DUT_START_IBSS_REQUEST CTL_CODE( \ - FILE_DEVICE_UNKNOWN, \ - WB_IOCTL_DUT_INDEX + 5, \ - METHOD_BUFFERED, \ - FILE_ANY_ACCESS) - -// IOCTL_WB_802_11_DUT_JOIN_REQUEST -// Query: None. -// Set : Synchronize with the selected BSS -// -#define IOCTL_WB_802_11_DUT_JOIN_REQUEST CTL_CODE( \ - FILE_DEVICE_UNKNOWN, \ - WB_IOCTL_DUT_INDEX + 6, \ - METHOD_BUFFERED, \ - FILE_ANY_ACCESS) - -// IOCTL_WB_802_11_DUT_AUTHEN_REQUEST -// Query: None. -// Set : Authenticate with the BSS -// -#define IOCTL_WB_802_11_DUT_AUTHEN_REQUEST CTL_CODE( \ - FILE_DEVICE_UNKNOWN, \ - WB_IOCTL_DUT_INDEX + 7, \ - METHOD_BUFFERED, \ - FILE_ANY_ACCESS) - -// IOCTL_WB_802_11_DUT_DEAUTHEN_REQUEST -// Query: None. -// Set : DeAuthenticate withe the BSS -// -#define IOCTL_WB_802_11_DUT_DEAUTHEN_REQUEST CTL_CODE( \ - FILE_DEVICE_UNKNOWN, \ - WB_IOCTL_DUT_INDEX + 8, \ - METHOD_BUFFERED, \ - FILE_ANY_ACCESS) - -// IOCTL_WB_802_11_DUT_ASSOC_REQUEST -// Query: None. -// Set : Associate withe the BSS -// -#define IOCTL_WB_802_11_DUT_ASSOC_REQUEST CTL_CODE( \ - FILE_DEVICE_UNKNOWN, \ - WB_IOCTL_DUT_INDEX + 9, \ - METHOD_BUFFERED, \ - FILE_ANY_ACCESS) - -// IOCTL_WB_802_11_DUT_REASSOC_REQUEST -// Query: None. -// Set : ReAssociate withe the BSS -// -#define IOCTL_WB_802_11_DUT_REASSOC_REQUEST CTL_CODE( \ - FILE_DEVICE_UNKNOWN, \ - WB_IOCTL_DUT_INDEX + 10, \ - METHOD_BUFFERED, \ - FILE_ANY_ACCESS) - - -// IOCTL_WB_802_11_DUT_DISASSOC_REQUEST -// Query: None. -// Set : DisAssociate withe the BSS -// -#define IOCTL_WB_802_11_DUT_DISASSOC_REQUEST CTL_CODE( \ - FILE_DEVICE_UNKNOWN, \ - WB_IOCTL_DUT_INDEX + 11, \ - METHOD_BUFFERED, \ - FILE_ANY_ACCESS) - -// IOCTL_WB_802_11_DUT_FRAG_THRESHOLD -// Query: Return the dot11FragmentThreshold -// Set : Set the dot11FragmentThreshold -// -#define IOCTL_WB_802_11_DUT_FRAG_THRESHOLD CTL_CODE( \ - FILE_DEVICE_UNKNOWN, \ - WB_IOCTL_DUT_INDEX + 12, \ - METHOD_BUFFERED, \ - FILE_ANY_ACCESS) - -// IOCTL_WB_802_11_DUT_RTS_THRESHOLD -// Query: Return the dot11RTSThreshold -// Set : Set the dot11RTSThresold -// -#define IOCTL_WB_802_11_DUT_RTS_THRESHOLD CTL_CODE( \ - FILE_DEVICE_UNKNOWN, \ - WB_IOCTL_DUT_INDEX + 13, \ - METHOD_BUFFERED, \ - FILE_ANY_ACCESS) - -// IOCTL_WB_802_11_DUT_WEP_KEYMODE -// Query: Get the WEP key mode. -// Set : Set the WEP key mode: disable/64 bits/128 bits -// -#define IOCTL_WB_802_11_DUT_WEP_KEYMODE CTL_CODE( \ - FILE_DEVICE_UNKNOWN, \ - WB_IOCTL_DUT_INDEX + 14, \ - METHOD_BUFFERED, \ - FILE_ANY_ACCESS) - -// IOCTL_WB_802_11_DUT_WEP_KEYVALUE -// Query: None. -// Set : fill in the WEP key value -// -#define IOCTL_WB_802_11_DUT_WEP_KEYVALUE CTL_CODE( \ - FILE_DEVICE_UNKNOWN, \ - WB_IOCTL_DUT_INDEX + 15, \ - METHOD_BUFFERED, \ - FILE_ANY_ACCESS) - -// IOCTL_WB_802_11_DUT_RESET -// Query: None. -// Set : Reset S/W and H/W -// -#define IOCTL_WB_802_11_DUT_RESET CTL_CODE( \ - FILE_DEVICE_UNKNOWN, \ - WB_IOCTL_DUT_INDEX + 16, \ - METHOD_BUFFERED, \ - FILE_ANY_ACCESS) - -// IOCTL_WB_802_11_DUT_POWER_SAVE -// Query: None. -// Set : Set Power Save Mode -// -#define IOCTL_WB_802_11_DUT_POWER_SAVE CTL_CODE( \ - FILE_DEVICE_UNKNOWN, \ - WB_IOCTL_DUT_INDEX + 17, \ - METHOD_BUFFERED, \ - FILE_ANY_ACCESS) - -// IOCTL_WB_802_11_DUT_BSSID_LIST_SCAN -// Query: None. -// Set : -// -#define IOCTL_WB_802_11_DUT_BSSID_LIST_SCAN CTL_CODE( \ - FILE_DEVICE_UNKNOWN, \ - WB_IOCTL_DUT_INDEX + 18, \ - METHOD_BUFFERED, \ - FILE_ANY_ACCESS) - -// IOCTL_WB_802_11_DUT_BSSID_LIST -// Query: Return the BSS info of BSSs in the last scanning process -// Set : None. -// -#define IOCTL_WB_802_11_DUT_BSSID_LIST CTL_CODE( \ - FILE_DEVICE_UNKNOWN, \ - WB_IOCTL_DUT_INDEX + 19, \ - METHOD_BUFFERED, \ - FILE_ANY_ACCESS) - -// IOCTL_WB_802_11_DUT_STATISTICS -// Query: Return the statistics of Tx/Rx. -// Set : None. -// -#define IOCTL_WB_802_11_DUT_STATISTICS CTL_CODE( \ - FILE_DEVICE_UNKNOWN, \ - WB_IOCTL_DUT_INDEX + 20, \ - METHOD_BUFFERED, \ - FILE_ANY_ACCESS) - -// IOCTL_WB_802_11_DUT_ACCEPT_BEACON -// Query: Return the current mode to accept beacon or not. -// Set : Enable or disable allowing the HW-MAC to pass the beacon to the SW-MAC -// Arguments: unsigned char -// -#define IOCTL_WB_802_11_DUT_ACCEPT_BEACON CTL_CODE( \ - FILE_DEVICE_UNKNOWN, \ - WB_IOCTL_DUT_INDEX + 21, \ - METHOD_BUFFERED, \ - FILE_ANY_ACCESS) - -// IOCTL_WB_802_11_DUT_ROAMING -// Query: Return the roaming function status -// Set : Enable/Disable the roaming function. -#define IOCTL_WB_802_11_DUT_ROAMING CTL_CODE( \ - FILE_DEVICE_UNKNOWN, \ - WB_IOCTL_DUT_INDEX + 22, \ - METHOD_BUFFERED, \ - FILE_ANY_ACCESS) - -// IOCTL_WB_802_11_DUT_DTO -// Query: Return the DTO(Data Throughput Optimization) -// function status (TRUE or FALSE) -// Set : Enable/Disable the DTO function. -// -#define IOCTL_WB_802_11_DUT_DTO CTL_CODE( \ - FILE_DEVICE_UNKNOWN, \ - WB_IOCTL_DUT_INDEX + 23, \ - METHOD_BUFFERED, \ - FILE_ANY_ACCESS) - -// IOCTL_WB_802_11_DUT_ANTENNA_DIVERSITY -// Query: Return the antenna diversity status. (TRUE/ON or FALSE/OFF) -// Set : Enable/Disable the antenna diversity. -// -#define IOCTL_WB_802_11_DUT_ANTENNA_DIVERSITY CTL_CODE( \ - FILE_DEVICE_UNKNOWN, \ - WB_IOCTL_DUT_INDEX + 24, \ - METHOD_BUFFERED, \ - FILE_ANY_ACCESS) - -//-------------- new added for a+b+g --------------------- -// IOCTL_WB_802_11_DUT_MAC_OPERATION_MODE -// Query: Return the MAC operation mode. (MODE_802_11_BG, MODE_802_11_A, -// MODE_802_11_ABG, MODE_802_11_BG_IBSS) -// Set : Set the MAC operation mode. -// -#define IOCTL_WB_802_11_DUT_MAC_OPERATION_MODE CTL_CODE( \ - FILE_DEVICE_UNKNOWN, \ - WB_IOCTL_DUT_INDEX + 25, \ - METHOD_BUFFERED, \ - FILE_ANY_ACCESS) - -// IOCTL_WB_802_11_DUT_TX_RATE_REDEFINED -// Query: Return the current tx rate which follows the definition in spec. (for -// example, 5.5M => 0x0b) -// Set : None -// -#define IOCTL_WB_802_11_DUT_TX_RATE_REDEFINED CTL_CODE( \ - FILE_DEVICE_UNKNOWN, \ - WB_IOCTL_DUT_INDEX + 26, \ - METHOD_BUFFERED, \ - FILE_ANY_ACCESS) - -// IOCTL_WB_802_11_DUT_PREAMBLE_MODE -// Query: Return the preamble mode. (auto or long) -// Set : Set the preamble mode. -// -#define IOCTL_WB_802_11_DUT_PREAMBLE_MODE CTL_CODE( \ - FILE_DEVICE_UNKNOWN, \ - WB_IOCTL_DUT_INDEX + 27, \ - METHOD_BUFFERED, \ - FILE_ANY_ACCESS) - -// IOCTL_WB_802_11_DUT_SLOT_TIME_MODE -// Query: Return the slot time mode. (auto or long) -// Set : Set the slot time mode. -// -#define IOCTL_WB_802_11_DUT_SLOT_TIME_MODE CTL_CODE( \ - FILE_DEVICE_UNKNOWN, \ - WB_IOCTL_DUT_INDEX + 28, \ - METHOD_BUFFERED, \ - FILE_ANY_ACCESS) -//------------------------------------------------------------------ - -// IOCTL_WB_802_11_DUT_ADVANCE_STATUS -// Query: -// Set : NONE -// -#define IOCTL_WB_802_11_DUT_ADVANCE_STATUS CTL_CODE( \ - FILE_DEVICE_UNKNOWN, \ - WB_IOCTL_DUT_INDEX + 29, \ - METHOD_BUFFERED, \ - FILE_ANY_ACCESS) - -// IOCTL_WB_802_11_DUT_TX_RATE_MODE -// Query: Return the tx rate mode. (RATE_AUTO, RATE_1M, .., RATE_54M, RATE_MAX) -// Set : Set the tx rate mode. (RATE_AUTO, RATE_1M, .., RATE_54M, RATE_MAX) -// -#define IOCTL_WB_802_11_DUT_TX_RATE_MODE CTL_CODE( \ - FILE_DEVICE_UNKNOWN, \ - WB_IOCTL_DUT_INDEX + 30, \ - METHOD_BUFFERED, \ - FILE_ANY_ACCESS) - -// IOCTL_WB_802_11_DUT_DTO_PARA -// Query: Return the DTO parameters -// Set : Set the DTO parameters -// -#define IOCTL_WB_802_11_DUT_DTO_PARA CTL_CODE( \ - FILE_DEVICE_UNKNOWN, \ - WB_IOCTL_DUT_INDEX + 31, \ - METHOD_BUFFERED, \ - FILE_ANY_ACCESS) - -// IOCTL_WB_802_11_DUT_EVENT_LOG -// Query: Return event log -// Set : Reset event log -// -#define IOCTL_WB_802_11_DUT_EVENT_LOG CTL_CODE( \ - FILE_DEVICE_UNKNOWN, \ - WB_IOCTL_DUT_INDEX + 32, \ - METHOD_BUFFERED, \ - FILE_ANY_ACCESS) - -// IOCTL_WB_802_11_DUT_CWMIN -// Query: NONE(It will be obtained by IOCTL_WB_802_11_DUT_ADVANCE_STATUS) -// Set : Set CWMin value -// -#define IOCTL_WB_802_11_DUT_CWMIN CTL_CODE( \ - FILE_DEVICE_UNKNOWN, \ - WB_IOCTL_DUT_INDEX + 33, \ - METHOD_BUFFERED, \ - FILE_ANY_ACCESS) - -// IOCTL_WB_802_11_DUT_CWMAX -// Query: NONE(It will be obtained by IOCTL_WB_802_11_DUT_ADVANCE_STATUS) -// Set : Set CWMax value -// -#define IOCTL_WB_802_11_DUT_CWMAX CTL_CODE( \ - FILE_DEVICE_UNKNOWN, \ - WB_IOCTL_DUT_INDEX + 34, \ - METHOD_BUFFERED, \ - FILE_ANY_ACCESS) - - -//========================================================== -// IOCTLs for Testing - -// IOCTL_WB_802_11_TS_SET_CXX_REG -// Query: None -// Set : Write the value to one of Cxx register. -// -#define IOCTL_WB_802_11_TS_SET_CXX_REG CTL_CODE( \ - FILE_DEVICE_UNKNOWN, \ - WB_IOCTL_TS_INDEX + 0, \ - METHOD_BUFFERED, \ - FILE_ANY_ACCESS) - -// IOCTL_WB_802_11_TS_GET_CXX_REG -// Query: Return the value of the Cxx register. -// Set : Write the reg no. (0x00, 0x04, 0x08 etc) -// -#define IOCTL_WB_802_11_TS_GET_CXX_REG CTL_CODE( \ - FILE_DEVICE_UNKNOWN, \ - WB_IOCTL_TS_INDEX + 1, \ - METHOD_BUFFERED, \ - FILE_ANY_ACCESS) - -// IOCTL_WB_802_11_TS_SET_DXX_REG -// Query: None -// Set : Write the value to one of Dxx register. -// -#define IOCTL_WB_802_11_TS_SET_DXX_REG CTL_CODE( \ - FILE_DEVICE_UNKNOWN, \ - WB_IOCTL_TS_INDEX + 2, \ - METHOD_BUFFERED, \ - FILE_ANY_ACCESS) - -// IOCTL_WB_802_11_TS_GET_DXX_REG -// Query: Return the value of the Dxx register. -// Set : Write the reg no. (0x00, 0x04, 0x08 etc) -// -#define IOCTL_WB_802_11_TS_GET_DXX_REG CTL_CODE( \ - FILE_DEVICE_UNKNOWN, \ - WB_IOCTL_TS_INDEX + 3, \ - METHOD_BUFFERED, \ - FILE_ANY_ACCESS) - -//============================================================ -// [TS] - -#define IOCTL_WB_802_11_TS_TX_RATE CTL_CODE( \ - FILE_DEVICE_UNKNOWN, \ - WB_IOCTL_TS_INDEX + 4, \ - METHOD_BUFFERED, \ - FILE_ANY_ACCESS) - -#define IOCTL_WB_802_11_TS_CURRENT_CHANNEL CTL_CODE( \ - FILE_DEVICE_UNKNOWN, \ - WB_IOCTL_TS_INDEX + 5, \ - METHOD_BUFFERED, \ - FILE_ANY_ACCESS) - -#define IOCTL_WB_802_11_TS_ENABLE_SEQNO CTL_CODE( \ - FILE_DEVICE_UNKNOWN, \ - WB_IOCTL_TS_INDEX + 6, \ - METHOD_BUFFERED, \ - FILE_ANY_ACCESS) - -#define IOCTL_WB_802_11_TS_ENALBE_ACKEDPACKET CTL_CODE( \ - FILE_DEVICE_UNKNOWN, \ - WB_IOCTL_TS_INDEX + 7, \ - METHOD_BUFFERED, \ - FILE_ANY_ACCESS) - -#define IOCTL_WB_802_11_TS_INHIBIT_CRC CTL_CODE( \ - FILE_DEVICE_UNKNOWN, \ - WB_IOCTL_TS_INDEX + 8, \ - METHOD_BUFFERED, \ - FILE_ANY_ACCESS) - -#define IOCTL_WB_802_11_TS_RESET_RCV_COUNTER CTL_CODE( \ - FILE_DEVICE_UNKNOWN, \ - WB_IOCTL_TS_INDEX + 9, \ - METHOD_BUFFERED, \ - FILE_ANY_ACCESS) - -#define IOCTL_WB_802_11_TS_SET_TX_TRIGGER CTL_CODE( \ - FILE_DEVICE_UNKNOWN, \ - WB_IOCTL_TS_INDEX + 10, \ - METHOD_BUFFERED, \ - FILE_ANY_ACCESS) - -#define IOCTL_WB_802_11_TS_FAILED_TX_COUNT CTL_CODE( \ - FILE_DEVICE_UNKNOWN, \ - WB_IOCTL_TS_INDEX + 11, \ - METHOD_BUFFERED, \ - FILE_ANY_ACCESS) - -// [TS1] -#define IOCTL_WB_802_11_TS_TX_POWER CTL_CODE( \ - FILE_DEVICE_UNKNOWN, \ - WB_IOCTL_TS_INDEX + 12, \ - METHOD_BUFFERED, \ - FILE_ANY_ACCESS) - -#define IOCTL_WB_802_11_TS_MODE_ENABLE CTL_CODE( \ - FILE_DEVICE_UNKNOWN, \ - WB_IOCTL_TS_INDEX + 13, \ - METHOD_BUFFERED, \ - FILE_ANY_ACCESS) - -#define IOCTL_WB_802_11_TS_MODE_DISABLE CTL_CODE( \ - FILE_DEVICE_UNKNOWN, \ - WB_IOCTL_TS_INDEX + 14, \ - METHOD_BUFFERED, \ - FILE_ANY_ACCESS) - -#define IOCTL_WB_802_11_TS_ANTENNA CTL_CODE( \ - FILE_DEVICE_UNKNOWN, \ - WB_IOCTL_TS_INDEX + 15, \ - METHOD_BUFFERED, \ - FILE_ANY_ACCESS) - -#define IOCTL_WB_802_11_TS_ADAPTER_INFO CTL_CODE( \ - FILE_DEVICE_UNKNOWN, \ - WB_IOCTL_TS_INDEX + 16, \ - METHOD_BUFFERED, \ - FILE_ANY_ACCESS) - -#define IOCTL_WB_802_11_TS_MAC_ADDRESS CTL_CODE( \ - FILE_DEVICE_UNKNOWN, \ - WB_IOCTL_TS_INDEX + 17, \ - METHOD_BUFFERED, \ - FILE_ANY_ACCESS) - -#define IOCTL_WB_802_11_TS_BSSID CTL_CODE( \ - FILE_DEVICE_UNKNOWN, \ - WB_IOCTL_TS_INDEX + 18, \ - METHOD_BUFFERED, \ - FILE_ANY_ACCESS) - -#define IOCTL_WB_802_11_TS_RF_PARAMETER CTL_CODE( \ - FILE_DEVICE_UNKNOWN, \ - WB_IOCTL_TS_INDEX + 19, \ - METHOD_BUFFERED, \ - FILE_ANY_ACCESS) - -#define IOCTL_WB_802_11_TS_FILTER CTL_CODE( \ - FILE_DEVICE_UNKNOWN, \ - WB_IOCTL_TS_INDEX + 20, \ - METHOD_BUFFERED, \ - FILE_ANY_ACCESS) - -#define IOCTL_WB_802_11_TS_CALIBRATION CTL_CODE( \ - FILE_DEVICE_UNKNOWN, \ - WB_IOCTL_TS_INDEX + 21, \ - METHOD_BUFFERED, \ - FILE_ANY_ACCESS) - -#define IOCTL_WB_802_11_TS_BSS_MODE CTL_CODE( \ - FILE_DEVICE_UNKNOWN, \ - WB_IOCTL_TS_INDEX + 22, \ - METHOD_BUFFERED, \ - FILE_ANY_ACCESS) - -#define IOCTL_WB_802_11_TS_SET_SSID CTL_CODE( \ - FILE_DEVICE_UNKNOWN, \ - WB_IOCTL_TS_INDEX + 23, \ - METHOD_BUFFERED, \ - FILE_ANY_ACCESS) - -#define IOCTL_WB_802_11_TS_IBSS_CHANNEL CTL_CODE( \ - FILE_DEVICE_UNKNOWN, \ - WB_IOCTL_TS_INDEX + 24, \ - METHOD_BUFFERED, \ - FILE_ANY_ACCESS) - -// set/query the slot time value(short or long slot time) -#define IOCTL_WB_802_11_TS_SLOT_TIME CTL_CODE( \ - FILE_DEVICE_UNKNOWN, \ - WB_IOCTL_TS_INDEX + 25, \ - METHOD_BUFFERED, \ - FILE_ANY_ACCESS) - -#define IOCTL_WB_802_11_TS_SLOT_TIME CTL_CODE( \ - FILE_DEVICE_UNKNOWN, \ - WB_IOCTL_TS_INDEX + 25, \ - METHOD_BUFFERED, \ - FILE_ANY_ACCESS) - -#define IOCTL_WB_802_11_TS_RX_STATISTICS CTL_CODE( \ - FILE_DEVICE_UNKNOWN, \ - WB_IOCTL_TS_INDEX + 26, \ - METHOD_BUFFERED, \ - FILE_ANY_ACCESS) - -#endif // #ifndef _IOCTLS_H - - diff --git a/drivers/staging/winbond/linux/common.h b/drivers/staging/winbond/linux/common.h deleted file mode 100644 index 712a86cfa68..00000000000 --- a/drivers/staging/winbond/linux/common.h +++ /dev/null @@ -1,128 +0,0 @@ -// -// common.h -// -// This file contains the OS dependant definition and function. -// Every OS has this file individual. -// - -#define DebugUsbdStatusInformation( _A ) - -#ifndef COMMON_DEF -#define COMMON_DEF - -#include <linux/version.h> -#include <linux/usb.h> -#include <linux/kernel.h> //need for kernel alert -#include <linux/autoconf.h> -#include <linux/sched.h> -#include <linux/signal.h> -#include <linux/slab.h> //memory allocate -#include <linux/module.h> -#include <linux/netdevice.h> -#include <linux/etherdevice.h> -#include <linux/init.h>//need for init and exit modules marco -#include <linux/ctype.h> -#include <linux/wait.h> -#include <linux/list.h> -#include <linux/wireless.h> -#include <linux/if_arp.h> -#include <asm/uaccess.h> -#include <net/iw_handler.h> -#include <linux/skbuff.h> - - -//#define DEBUG_ENABLED 1 - - - -//=============================================================== -// Common type definition -//=============================================================== - -//=========================================== -#define IGNORE 2 -#define SUCCESS 1 -#define FAILURE 0 - - -#ifndef true -#define true 1 -#endif - -#ifndef false -#define false 0 -#endif - -// PD43 20021108 -#ifndef TRUE -#define TRUE 1 -#endif - -#ifndef FALSE -#define FALSE 0 -#endif - -#define STATUS_MEDIA_CONNECT 1 -#define STATUS_MEDIA_DISCONNECT 0 - -#ifndef BIT -#define BIT(x) (1 << (x)) -#endif - -typedef struct urb * PURB; - - - -//================================================================================================== -// Common function definition -//================================================================================================== -#ifndef abs -#define abs(_T) ((_T) < 0 ? -_T : _T) -#endif -#define DEBUG_ENABLED -#define ETH_LENGTH_OF_ADDRESS 6 -#ifdef DEBUG_ENABLED -#define WBDEBUG( _M ) printk _M -#else -#define WBDEBUG( _M ) 0 -#endif - -#define OS_DISCONNECTED 0 -#define OS_CONNECTED 1 - - -#define OS_EVENT_INDICATE( _A, _B, _F ) -#define OS_PMKID_STATUS_EVENT( _A ) - - -/* Uff, no, longs are not atomic on all architectures Linux - * supports. This should really use atomic_t */ - -#define OS_ATOMIC u32 -#define OS_ATOMIC_READ( _A, _V ) _V -#define OS_ATOMIC_INC( _A, _V ) EncapAtomicInc( _A, (void*)_V ) -#define OS_ATOMIC_DEC( _A, _V ) EncapAtomicDec( _A, (void*)_V ) -#define OS_MEMORY_CLEAR( _A, _S ) memset( (u8 *)_A,0,_S) -#define OS_MEMORY_COMPARE( _A, _B, _S ) (memcmp(_A,_B,_S)? 0 : 1) // Definition is reverse with Ndis 1: the same 0: different - -#define OS_TIMER struct timer_list -#define OS_TIMER_INITIAL( _T, _F, _P ) \ -{ \ - init_timer( _T ); \ - (_T)->function = (void *)_F##_1a; \ - (_T)->data = (unsigned long)_P; \ -} - -// _S : Millisecond -// 20060420 At least 1 large than jiffies -#define OS_TIMER_SET( _T, _S ) \ -{ \ - (_T)->expires = jiffies + ((_S*HZ+999)/1000);\ - add_timer( _T ); \ -} -#define OS_TIMER_CANCEL( _T, _B ) del_timer_sync( _T ) -#define OS_TIMER_GET_SYS_TIME( _T ) (*_T=jiffies) - - -#endif // COMMON_DEF - diff --git a/drivers/staging/winbond/linux/sysdef.h b/drivers/staging/winbond/linux/sysdef.h deleted file mode 100644 index d46d63e5c67..00000000000 --- a/drivers/staging/winbond/linux/sysdef.h +++ /dev/null @@ -1,73 +0,0 @@ - - -// -// Winbond WLAN System Configuration defines -// - -//===================================================================== -// Current directory is Linux -// The definition WB_LINUX is a keyword for this OS -//===================================================================== -#ifndef SYS_DEF_H -#define SYS_DEF_H -#define WB_LINUX -#define WB_LINUX_WPA_PSK - - -//#define _IBSS_BEACON_SEQ_STICK_ -#define _USE_FALLBACK_RATE_ -//#define ANTDIV_DEFAULT_ON - -#define _WPA2_ // 20061122 It's needed for current Linux driver - - -#ifndef _WPA_PSK_DEBUG -#undef _WPA_PSK_DEBUG -#endif - -// debug print options, mark what debug you don't need - -#ifdef FULL_DEBUG -#define _PE_STATE_DUMP_ -#define _PE_TX_DUMP_ -#define _PE_RX_DUMP_ -#define _PE_OID_DUMP_ -#define _PE_DTO_DUMP_ -#define _PE_REG_DUMP_ -#define _PE_USB_INI_DUMP_ -#endif - - - -#include "common.h" // Individual file depends on OS - -#include "../wb35_ver.h" -#include "../mac_structures.h" -#include "../ds_tkip.h" -#include "../localpara.h" -#include "../sme_s.h" -#include "../scan_s.h" -#include "../mds_s.h" -#include "../mlme_s.h" -#include "../bssdscpt.h" -#include "../sme_api.h" -#include "../gl_80211.h" -#include "../mto.h" -#include "../wblinux_s.h" -#include "../wbhal_s.h" - - -#include "../adapter.h" - -#include "../mlme_mib.h" -#include "../mds_f.h" -#include "../bss_f.h" -#include "../mlmetxrx_f.h" -#include "../mto_f.h" -#include "../wbhal_f.h" -#include "../wblinux_f.h" -// Kernel Timer resolution, NDIS is 10ms, 10000us -#define MIN_TIMEOUT_VAL (10) //ms - - -#endif diff --git a/drivers/staging/winbond/linux/wb35reg.c b/drivers/staging/winbond/linux/wb35reg.c deleted file mode 100644 index ebb6db5438a..00000000000 --- a/drivers/staging/winbond/linux/wb35reg.c +++ /dev/null @@ -1,744 +0,0 @@ -#include "sysdef.h" - -extern void phy_calibration_winbond(hw_data_t *phw_data, u32 frequency); - -// TRUE : read command process successfully -// FALSE : register not support -// RegisterNo : start base -// pRegisterData : data point -// NumberOfData : number of register data -// Flag : AUTO_INCREMENT - RegisterNo will auto increment 4 -// NO_INCREMENT - Function will write data into the same register -unsigned char -Wb35Reg_BurstWrite(phw_data_t pHwData, u16 RegisterNo, u32 * pRegisterData, u8 NumberOfData, u8 Flag) -{ - PWB35REG pWb35Reg = &pHwData->Wb35Reg; - PURB pUrb = NULL; - PREG_QUEUE pRegQueue = NULL; - u16 UrbSize; - struct usb_ctrlrequest *dr; - u16 i, DataSize = NumberOfData*4; - - // Module shutdown - if (pHwData->SurpriseRemove) - return FALSE; - - // Trying to use burst write function if use new hardware - UrbSize = sizeof(REG_QUEUE) + DataSize + sizeof(struct usb_ctrlrequest); - OS_MEMORY_ALLOC( (void* *)&pRegQueue, UrbSize ); - pUrb = wb_usb_alloc_urb(0); - if( pUrb && pRegQueue ) { - pRegQueue->DIRECT = 2;// burst write register - pRegQueue->INDEX = RegisterNo; - pRegQueue->pBuffer = (u32 *)((u8 *)pRegQueue + sizeof(REG_QUEUE)); - memcpy( pRegQueue->pBuffer, pRegisterData, DataSize ); - //the function for reversing register data from little endian to big endian - for( i=0; i<NumberOfData ; i++ ) - pRegQueue->pBuffer[i] = cpu_to_le32( pRegQueue->pBuffer[i] ); - - dr = (struct usb_ctrlrequest *)((u8 *)pRegQueue + sizeof(REG_QUEUE) + DataSize); - dr->bRequestType = USB_TYPE_VENDOR | USB_DIR_OUT | USB_RECIP_DEVICE; - dr->bRequest = 0x04; // USB or vendor-defined request code, burst mode - dr->wValue = cpu_to_le16( Flag ); // 0: Register number auto-increment, 1: No auto increment - dr->wIndex = cpu_to_le16( RegisterNo ); - dr->wLength = cpu_to_le16( DataSize ); - pRegQueue->Next = NULL; - pRegQueue->pUsbReq = dr; - pRegQueue->pUrb = pUrb; - - spin_lock_irq( &pWb35Reg->EP0VM_spin_lock ); - if (pWb35Reg->pRegFirst == NULL) - pWb35Reg->pRegFirst = pRegQueue; - else - pWb35Reg->pRegLast->Next = pRegQueue; - pWb35Reg->pRegLast = pRegQueue; - - spin_unlock_irq( &pWb35Reg->EP0VM_spin_lock ); - - // Start EP0VM - Wb35Reg_EP0VM_start(pHwData); - - return TRUE; - } else { - if (pUrb) - usb_free_urb(pUrb); - if (pRegQueue) - kfree(pRegQueue); - return FALSE; - } - return FALSE; -} - -void -Wb35Reg_Update(phw_data_t pHwData, u16 RegisterNo, u32 RegisterValue) -{ - PWB35REG pWb35Reg = &pHwData->Wb35Reg; - switch (RegisterNo) { - case 0x3b0: pWb35Reg->U1B0 = RegisterValue; break; - case 0x3bc: pWb35Reg->U1BC_LEDConfigure = RegisterValue; break; - case 0x400: pWb35Reg->D00_DmaControl = RegisterValue; break; - case 0x800: pWb35Reg->M00_MacControl = RegisterValue; break; - case 0x804: pWb35Reg->M04_MulticastAddress1 = RegisterValue; break; - case 0x808: pWb35Reg->M08_MulticastAddress2 = RegisterValue; break; - case 0x824: pWb35Reg->M24_MacControl = RegisterValue; break; - case 0x828: pWb35Reg->M28_MacControl = RegisterValue; break; - case 0x82c: pWb35Reg->M2C_MacControl = RegisterValue; break; - case 0x838: pWb35Reg->M38_MacControl = RegisterValue; break; - case 0x840: pWb35Reg->M40_MacControl = RegisterValue; break; - case 0x844: pWb35Reg->M44_MacControl = RegisterValue; break; - case 0x848: pWb35Reg->M48_MacControl = RegisterValue; break; - case 0x84c: pWb35Reg->M4C_MacStatus = RegisterValue; break; - case 0x860: pWb35Reg->M60_MacControl = RegisterValue; break; - case 0x868: pWb35Reg->M68_MacControl = RegisterValue; break; - case 0x870: pWb35Reg->M70_MacControl = RegisterValue; break; - case 0x874: pWb35Reg->M74_MacControl = RegisterValue; break; - case 0x878: pWb35Reg->M78_ERPInformation = RegisterValue; break; - case 0x87C: pWb35Reg->M7C_MacControl = RegisterValue; break; - case 0x880: pWb35Reg->M80_MacControl = RegisterValue; break; - case 0x884: pWb35Reg->M84_MacControl = RegisterValue; break; - case 0x888: pWb35Reg->M88_MacControl = RegisterValue; break; - case 0x898: pWb35Reg->M98_MacControl = RegisterValue; break; - case 0x100c: pWb35Reg->BB0C = RegisterValue; break; - case 0x102c: pWb35Reg->BB2C = RegisterValue; break; - case 0x1030: pWb35Reg->BB30 = RegisterValue; break; - case 0x103c: pWb35Reg->BB3C = RegisterValue; break; - case 0x1048: pWb35Reg->BB48 = RegisterValue; break; - case 0x104c: pWb35Reg->BB4C = RegisterValue; break; - case 0x1050: pWb35Reg->BB50 = RegisterValue; break; - case 0x1054: pWb35Reg->BB54 = RegisterValue; break; - case 0x1058: pWb35Reg->BB58 = RegisterValue; break; - case 0x105c: pWb35Reg->BB5C = RegisterValue; break; - case 0x1060: pWb35Reg->BB60 = RegisterValue; break; - } -} - -// TRUE : read command process successfully -// FALSE : register not support -unsigned char -Wb35Reg_WriteSync( phw_data_t pHwData, u16 RegisterNo, u32 RegisterValue ) -{ - PWB35REG pWb35Reg = &pHwData->Wb35Reg; - int ret = -1; - - // Module shutdown - if (pHwData->SurpriseRemove) - return FALSE; - - RegisterValue = cpu_to_le32(RegisterValue); - - // update the register by send usb message------------------------------------ - pWb35Reg->SyncIoPause = 1; - - // 20060717.5 Wait until EP0VM stop - while (pWb35Reg->EP0vm_state != VM_STOP) - OS_SLEEP(10000); - - // Sync IoCallDriver - pWb35Reg->EP0vm_state = VM_RUNNING; - ret = usb_control_msg( pHwData->WbUsb.udev, - usb_sndctrlpipe( pHwData->WbUsb.udev, 0 ), - 0x03, USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_OUT, - 0x0,RegisterNo, &RegisterValue, 4, HZ*100 ); - pWb35Reg->EP0vm_state = VM_STOP; - pWb35Reg->SyncIoPause = 0; - - Wb35Reg_EP0VM_start(pHwData); - - if (ret < 0) { - #ifdef _PE_REG_DUMP_ - WBDEBUG(("EP0 Write register usb message sending error\n")); - #endif - - pHwData->SurpriseRemove = 1; // 20060704.2 - return FALSE; - } - - return TRUE; -} - -// TRUE : read command process successfully -// FALSE : register not support -unsigned char -Wb35Reg_Write( phw_data_t pHwData, u16 RegisterNo, u32 RegisterValue ) -{ - PWB35REG pWb35Reg = &pHwData->Wb35Reg; - struct usb_ctrlrequest *dr; - PURB pUrb = NULL; - PREG_QUEUE pRegQueue = NULL; - u16 UrbSize; - - - // Module shutdown - if (pHwData->SurpriseRemove) - return FALSE; - - // update the register by send urb request------------------------------------ - UrbSize = sizeof(REG_QUEUE) + sizeof(struct usb_ctrlrequest); - OS_MEMORY_ALLOC( (void* *)&pRegQueue, UrbSize ); - pUrb = wb_usb_alloc_urb(0); - if (pUrb && pRegQueue) { - pRegQueue->DIRECT = 1;// burst write register - pRegQueue->INDEX = RegisterNo; - pRegQueue->VALUE = cpu_to_le32(RegisterValue); - pRegQueue->RESERVED_VALID = FALSE; - dr = (struct usb_ctrlrequest *)((u8 *)pRegQueue + sizeof(REG_QUEUE)); - dr->bRequestType = USB_TYPE_VENDOR|USB_DIR_OUT |USB_RECIP_DEVICE; - dr->bRequest = 0x03; // USB or vendor-defined request code, burst mode - dr->wValue = cpu_to_le16(0x0); - dr->wIndex = cpu_to_le16(RegisterNo); - dr->wLength = cpu_to_le16(4); - - // Enter the sending queue - pRegQueue->Next = NULL; - pRegQueue->pUsbReq = dr; - pRegQueue->pUrb = pUrb; - - spin_lock_irq(&pWb35Reg->EP0VM_spin_lock ); - if (pWb35Reg->pRegFirst == NULL) - pWb35Reg->pRegFirst = pRegQueue; - else - pWb35Reg->pRegLast->Next = pRegQueue; - pWb35Reg->pRegLast = pRegQueue; - - spin_unlock_irq( &pWb35Reg->EP0VM_spin_lock ); - - // Start EP0VM - Wb35Reg_EP0VM_start(pHwData); - - return TRUE; - } else { - if (pUrb) - usb_free_urb(pUrb); - kfree(pRegQueue); - return FALSE; - } -} - -//This command will be executed with a user defined value. When it completes, -//this value is useful. For example, hal_set_current_channel will use it. -// TRUE : read command process successfully -// FALSE : register not support -unsigned char -Wb35Reg_WriteWithCallbackValue( phw_data_t pHwData, u16 RegisterNo, u32 RegisterValue, - s8 *pValue, s8 Len) -{ - PWB35REG pWb35Reg = &pHwData->Wb35Reg; - struct usb_ctrlrequest *dr; - PURB pUrb = NULL; - PREG_QUEUE pRegQueue = NULL; - u16 UrbSize; - - // Module shutdown - if (pHwData->SurpriseRemove) - return FALSE; - - // update the register by send urb request------------------------------------ - UrbSize = sizeof(REG_QUEUE) + sizeof(struct usb_ctrlrequest); - OS_MEMORY_ALLOC((void* *) &pRegQueue, UrbSize ); - pUrb = wb_usb_alloc_urb(0); - if (pUrb && pRegQueue) { - pRegQueue->DIRECT = 1;// burst write register - pRegQueue->INDEX = RegisterNo; - pRegQueue->VALUE = cpu_to_le32(RegisterValue); - //NOTE : Users must guarantee the size of value will not exceed the buffer size. - memcpy(pRegQueue->RESERVED, pValue, Len); - pRegQueue->RESERVED_VALID = TRUE; - dr = (struct usb_ctrlrequest *)((u8 *)pRegQueue + sizeof(REG_QUEUE)); - dr->bRequestType = USB_TYPE_VENDOR|USB_DIR_OUT |USB_RECIP_DEVICE; - dr->bRequest = 0x03; // USB or vendor-defined request code, burst mode - dr->wValue = cpu_to_le16(0x0); - dr->wIndex = cpu_to_le16(RegisterNo); - dr->wLength = cpu_to_le16(4); - - // Enter the sending queue - pRegQueue->Next = NULL; - pRegQueue->pUsbReq = dr; - pRegQueue->pUrb = pUrb; - spin_lock_irq (&pWb35Reg->EP0VM_spin_lock ); - if( pWb35Reg->pRegFirst == NULL ) - pWb35Reg->pRegFirst = pRegQueue; - else - pWb35Reg->pRegLast->Next = pRegQueue; - pWb35Reg->pRegLast = pRegQueue; - - spin_unlock_irq ( &pWb35Reg->EP0VM_spin_lock ); - - // Start EP0VM - Wb35Reg_EP0VM_start(pHwData); - return TRUE; - } else { - if (pUrb) - usb_free_urb(pUrb); - kfree(pRegQueue); - return FALSE; - } -} - -// TRUE : read command process successfully -// FALSE : register not support -// pRegisterValue : It must be a resident buffer due to asynchronous read register. -unsigned char -Wb35Reg_ReadSync( phw_data_t pHwData, u16 RegisterNo, u32 * pRegisterValue ) -{ - PWB35REG pWb35Reg = &pHwData->Wb35Reg; - u32 * pltmp = pRegisterValue; - int ret = -1; - - // Module shutdown - if (pHwData->SurpriseRemove) - return FALSE; - - // Read the register by send usb message------------------------------------ - - pWb35Reg->SyncIoPause = 1; - - // 20060717.5 Wait until EP0VM stop - while (pWb35Reg->EP0vm_state != VM_STOP) - OS_SLEEP(10000); - - pWb35Reg->EP0vm_state = VM_RUNNING; - ret = usb_control_msg( pHwData->WbUsb.udev, - usb_rcvctrlpipe(pHwData->WbUsb.udev, 0), - 0x01, USB_TYPE_VENDOR|USB_RECIP_DEVICE|USB_DIR_IN, - 0x0, RegisterNo, pltmp, 4, HZ*100 ); - - *pRegisterValue = cpu_to_le32(*pltmp); - - pWb35Reg->EP0vm_state = VM_STOP; - - Wb35Reg_Update( pHwData, RegisterNo, *pRegisterValue ); - pWb35Reg->SyncIoPause = 0; - - Wb35Reg_EP0VM_start( pHwData ); - - if (ret < 0) { - #ifdef _PE_REG_DUMP_ - WBDEBUG(("EP0 Read register usb message sending error\n")); - #endif - - pHwData->SurpriseRemove = 1; // 20060704.2 - return FALSE; - } - - return TRUE; -} - -// TRUE : read command process successfully -// FALSE : register not support -// pRegisterValue : It must be a resident buffer due to asynchronous read register. -unsigned char -Wb35Reg_Read(phw_data_t pHwData, u16 RegisterNo, u32 * pRegisterValue ) -{ - PWB35REG pWb35Reg = &pHwData->Wb35Reg; - struct usb_ctrlrequest * dr; - PURB pUrb; - PREG_QUEUE pRegQueue; - u16 UrbSize; - - // Module shutdown - if (pHwData->SurpriseRemove) - return FALSE; - - // update the variable by send Urb to read register ------------------------------------ - UrbSize = sizeof(REG_QUEUE) + sizeof(struct usb_ctrlrequest); - OS_MEMORY_ALLOC( (void* *)&pRegQueue, UrbSize ); - pUrb = wb_usb_alloc_urb(0); - if( pUrb && pRegQueue ) - { - pRegQueue->DIRECT = 0;// read register - pRegQueue->INDEX = RegisterNo; - pRegQueue->pBuffer = pRegisterValue; - dr = (struct usb_ctrlrequest *)((u8 *)pRegQueue + sizeof(REG_QUEUE)); - dr->bRequestType = USB_TYPE_VENDOR|USB_RECIP_DEVICE|USB_DIR_IN; - dr->bRequest = 0x01; // USB or vendor-defined request code, burst mode - dr->wValue = cpu_to_le16(0x0); - dr->wIndex = cpu_to_le16 (RegisterNo); - dr->wLength = cpu_to_le16 (4); - - // Enter the sending queue - pRegQueue->Next = NULL; - pRegQueue->pUsbReq = dr; - pRegQueue->pUrb = pUrb; - spin_lock_irq ( &pWb35Reg->EP0VM_spin_lock ); - if( pWb35Reg->pRegFirst == NULL ) - pWb35Reg->pRegFirst = pRegQueue; - else - pWb35Reg->pRegLast->Next = pRegQueue; - pWb35Reg->pRegLast = pRegQueue; - - spin_unlock_irq( &pWb35Reg->EP0VM_spin_lock ); - - // Start EP0VM - Wb35Reg_EP0VM_start( pHwData ); - - return TRUE; - } else { - if (pUrb) - usb_free_urb( pUrb ); - kfree(pRegQueue); - return FALSE; - } -} - - -void -Wb35Reg_EP0VM_start( phw_data_t pHwData ) -{ - PWB35REG pWb35Reg = &pHwData->Wb35Reg; - - if (OS_ATOMIC_INC( pHwData->Adapter, &pWb35Reg->RegFireCount) == 1) { - pWb35Reg->EP0vm_state = VM_RUNNING; - Wb35Reg_EP0VM(pHwData); - } else - OS_ATOMIC_DEC( pHwData->Adapter, &pWb35Reg->RegFireCount ); -} - -void -Wb35Reg_EP0VM(phw_data_t pHwData ) -{ - PWB35REG pWb35Reg = &pHwData->Wb35Reg; - PURB pUrb; - struct usb_ctrlrequest *dr; - u32 * pBuffer; - int ret = -1; - PREG_QUEUE pRegQueue; - - - if (pWb35Reg->SyncIoPause) - goto cleanup; - - if (pHwData->SurpriseRemove) - goto cleanup; - - // Get the register data and send to USB through Irp - spin_lock_irq( &pWb35Reg->EP0VM_spin_lock ); - pRegQueue = pWb35Reg->pRegFirst; - spin_unlock_irq( &pWb35Reg->EP0VM_spin_lock ); - - if (!pRegQueue) - goto cleanup; - - // Get an Urb, send it - pUrb = (PURB)pRegQueue->pUrb; - - dr = pRegQueue->pUsbReq; - pUrb = pRegQueue->pUrb; - pBuffer = pRegQueue->pBuffer; - if (pRegQueue->DIRECT == 1) // output - pBuffer = &pRegQueue->VALUE; - - usb_fill_control_urb( pUrb, pHwData->WbUsb.udev, - REG_DIRECTION(pHwData->WbUsb.udev,pRegQueue), - (u8 *)dr,pBuffer,cpu_to_le16(dr->wLength), - Wb35Reg_EP0VM_complete, (void*)pHwData); - - pWb35Reg->EP0vm_state = VM_RUNNING; - - ret = wb_usb_submit_urb( pUrb ); - - if (ret < 0) { -#ifdef _PE_REG_DUMP_ - WBDEBUG(("EP0 Irp sending error\n")); -#endif - goto cleanup; - } - - return; - - cleanup: - pWb35Reg->EP0vm_state = VM_STOP; - OS_ATOMIC_DEC( pHwData->Adapter, &pWb35Reg->RegFireCount ); -} - - -void -Wb35Reg_EP0VM_complete(PURB pUrb) -{ - phw_data_t pHwData = (phw_data_t)pUrb->context; - PWB35REG pWb35Reg = &pHwData->Wb35Reg; - PREG_QUEUE pRegQueue; - - - // Variable setting - pWb35Reg->EP0vm_state = VM_COMPLETED; - pWb35Reg->EP0VM_status = pUrb->status; - - if (pHwData->SurpriseRemove) { // Let WbWlanHalt to handle surprise remove - pWb35Reg->EP0vm_state = VM_STOP; - OS_ATOMIC_DEC( pHwData->Adapter, &pWb35Reg->RegFireCount ); - } else { - // Complete to send, remove the URB from the first - spin_lock_irq( &pWb35Reg->EP0VM_spin_lock ); - pRegQueue = pWb35Reg->pRegFirst; - if (pRegQueue == pWb35Reg->pRegLast) - pWb35Reg->pRegLast = NULL; - pWb35Reg->pRegFirst = pWb35Reg->pRegFirst->Next; - spin_unlock_irq( &pWb35Reg->EP0VM_spin_lock ); - - if (pWb35Reg->EP0VM_status) { -#ifdef _PE_REG_DUMP_ - WBDEBUG(("EP0 IoCompleteRoutine return error\n")); - DebugUsbdStatusInformation( pWb35Reg->EP0VM_status ); -#endif - pWb35Reg->EP0vm_state = VM_STOP; - pHwData->SurpriseRemove = 1; - } else { - // Success. Update the result - - // Start the next send - Wb35Reg_EP0VM(pHwData); - } - - kfree(pRegQueue); - } - - usb_free_urb(pUrb); -} - - -void -Wb35Reg_destroy(phw_data_t pHwData) -{ - PWB35REG pWb35Reg = &pHwData->Wb35Reg; - PURB pUrb; - PREG_QUEUE pRegQueue; - - - Uxx_power_off_procedure(pHwData); - - // Wait for Reg operation completed - do { - OS_SLEEP(10000); // Delay for waiting function enter 940623.1.a - } while (pWb35Reg->EP0vm_state != VM_STOP); - OS_SLEEP(10000); // Delay for waiting function enter 940623.1.b - - // Release all the data in RegQueue - spin_lock_irq( &pWb35Reg->EP0VM_spin_lock ); - pRegQueue = pWb35Reg->pRegFirst; - while (pRegQueue) { - if (pRegQueue == pWb35Reg->pRegLast) - pWb35Reg->pRegLast = NULL; - pWb35Reg->pRegFirst = pWb35Reg->pRegFirst->Next; - - pUrb = pRegQueue->pUrb; - spin_unlock_irq( &pWb35Reg->EP0VM_spin_lock ); - if (pUrb) { - usb_free_urb(pUrb); - kfree(pRegQueue); - } else { - #ifdef _PE_REG_DUMP_ - WBDEBUG(("EP0 queue release error\n")); - #endif - } - spin_lock_irq( &pWb35Reg->EP0VM_spin_lock ); - - pRegQueue = pWb35Reg->pRegFirst; - } - spin_unlock_irq( &pWb35Reg->EP0VM_spin_lock ); -} - -//==================================================================================== -// The function can be run in passive-level only. -//==================================================================================== -unsigned char Wb35Reg_initial(phw_data_t pHwData) -{ - PWB35REG pWb35Reg=&pHwData->Wb35Reg; - u32 ltmp; - u32 SoftwareSet, VCO_trim, TxVga, Region_ScanInterval; - - // Spin lock is acquired for read and write IRP command - spin_lock_init( &pWb35Reg->EP0VM_spin_lock ); - - // Getting RF module type from EEPROM ------------------------------------ - Wb35Reg_WriteSync( pHwData, 0x03b4, 0x080d0000 ); // Start EEPROM access + Read + address(0x0d) - Wb35Reg_ReadSync( pHwData, 0x03b4, <mp ); - - //Update RF module type and determine the PHY type by inf or EEPROM - pWb35Reg->EEPROMPhyType = (u8)( ltmp & 0xff ); - // 0 V MAX2825, 1 V MAX2827, 2 V MAX2828, 3 V MAX2829 - // 16V AL2230, 17 - AL7230, 18 - AL2230S - // 32 Reserved - // 33 - W89RF242(TxVGA 0~19), 34 - W89RF242(TxVGA 0~34) - if (pWb35Reg->EEPROMPhyType != RF_DECIDE_BY_INF) { - if( (pWb35Reg->EEPROMPhyType == RF_MAXIM_2825) || - (pWb35Reg->EEPROMPhyType == RF_MAXIM_2827) || - (pWb35Reg->EEPROMPhyType == RF_MAXIM_2828) || - (pWb35Reg->EEPROMPhyType == RF_MAXIM_2829) || - (pWb35Reg->EEPROMPhyType == RF_MAXIM_V1) || - (pWb35Reg->EEPROMPhyType == RF_AIROHA_2230) || - (pWb35Reg->EEPROMPhyType == RF_AIROHA_2230S) || - (pWb35Reg->EEPROMPhyType == RF_AIROHA_7230) || - (pWb35Reg->EEPROMPhyType == RF_WB_242) || - (pWb35Reg->EEPROMPhyType == RF_WB_242_1)) - pHwData->phy_type = pWb35Reg->EEPROMPhyType; - } - - // Power On procedure running. The relative parameter will be set according to phy_type - Uxx_power_on_procedure( pHwData ); - - // Reading MAC address - Uxx_ReadEthernetAddress( pHwData ); - - // Read VCO trim for RF parameter - Wb35Reg_WriteSync( pHwData, 0x03b4, 0x08200000 ); - Wb35Reg_ReadSync( pHwData, 0x03b4, &VCO_trim ); - - // Read Antenna On/Off of software flag - Wb35Reg_WriteSync( pHwData, 0x03b4, 0x08210000 ); - Wb35Reg_ReadSync( pHwData, 0x03b4, &SoftwareSet ); - - // Read TXVGA - Wb35Reg_WriteSync( pHwData, 0x03b4, 0x08100000 ); - Wb35Reg_ReadSync( pHwData, 0x03b4, &TxVga ); - - // Get Scan interval setting from EEPROM offset 0x1c - Wb35Reg_WriteSync( pHwData, 0x03b4, 0x081d0000 ); - Wb35Reg_ReadSync( pHwData, 0x03b4, &Region_ScanInterval ); - - // Update Ethernet address - memcpy( pHwData->CurrentMacAddress, pHwData->PermanentMacAddress, ETH_LENGTH_OF_ADDRESS ); - - // Update software variable - pHwData->SoftwareSet = (u16)(SoftwareSet & 0xffff); - TxVga &= 0x000000ff; - pHwData->PowerIndexFromEEPROM = (u8)TxVga; - pHwData->VCO_trim = (u8)VCO_trim & 0xff; - if (pHwData->VCO_trim == 0xff) - pHwData->VCO_trim = 0x28; - - pWb35Reg->EEPROMRegion = (u8)(Region_ScanInterval>>8); // 20060720 - if( pWb35Reg->EEPROMRegion<1 || pWb35Reg->EEPROMRegion>6 ) - pWb35Reg->EEPROMRegion = REGION_AUTO; - - //For Get Tx VGA from EEPROM 20060315.5 move here - GetTxVgaFromEEPROM( pHwData ); - - // Set Scan Interval - pHwData->Scan_Interval = (u8)(Region_ScanInterval & 0xff) * 10; - if ((pHwData->Scan_Interval == 2550) || (pHwData->Scan_Interval < 10)) // Is default setting 0xff * 10 - pHwData->Scan_Interval = SCAN_MAX_CHNL_TIME; - - // Initial register - RFSynthesizer_initial(pHwData); - - BBProcessor_initial(pHwData); // Async write, must wait until complete - - Wb35Reg_phy_calibration(pHwData); - - Mxx_initial(pHwData); - Dxx_initial(pHwData); - - if (pHwData->SurpriseRemove) - return FALSE; - else - return TRUE; // Initial fail -} - -//=================================================================================== -// CardComputeCrc -- -// -// Description: -// Runs the AUTODIN II CRC algorithm on buffer Buffer of length, Length. -// -// Arguments: -// Buffer - the input buffer -// Length - the length of Buffer -// -// Return Value: -// The 32-bit CRC value. -// -// Note: -// This is adapted from the comments in the assembly language -// version in _GENREQ.ASM of the DWB NE1000/2000 driver. -//================================================================================== -u32 -CardComputeCrc(u8 * Buffer, u32 Length) -{ - u32 Crc, Carry; - u32 i, j; - u8 CurByte; - - Crc = 0xffffffff; - - for (i = 0; i < Length; i++) { - - CurByte = Buffer[i]; - - for (j = 0; j < 8; j++) { - - Carry = ((Crc & 0x80000000) ? 1 : 0) ^ (CurByte & 0x01); - Crc <<= 1; - CurByte >>= 1; - - if (Carry) { - Crc =(Crc ^ 0x04c11db6) | Carry; - } - } - } - - return Crc; -} - - -//================================================================== -// BitReverse -- -// Reverse the bits in the input argument, dwData, which is -// regarded as a string of bits with the length, DataLength. -// -// Arguments: -// dwData : -// DataLength : -// -// Return: -// The converted value. -//================================================================== -u32 BitReverse( u32 dwData, u32 DataLength) -{ - u32 HalfLength, i, j; - u32 BitA, BitB; - - if ( DataLength <= 0) return 0; // No conversion is done. - dwData = dwData & (0xffffffff >> (32 - DataLength)); - - HalfLength = DataLength / 2; - for ( i = 0, j = DataLength-1 ; i < HalfLength; i++, j--) - { - BitA = GetBit( dwData, i); - BitB = GetBit( dwData, j); - if (BitA && !BitB) { - dwData = ClearBit( dwData, i); - dwData = SetBit( dwData, j); - } else if (!BitA && BitB) { - dwData = SetBit( dwData, i); - dwData = ClearBit( dwData, j); - } else - { - // Do nothing since these two bits are of the save values. - } - } - - return dwData; -} - -void Wb35Reg_phy_calibration( phw_data_t pHwData ) -{ - u32 BB3c, BB54; - - if ((pHwData->phy_type == RF_WB_242) || - (pHwData->phy_type == RF_WB_242_1)) { - phy_calibration_winbond ( pHwData, 2412 ); // Sync operation - Wb35Reg_ReadSync( pHwData, 0x103c, &BB3c ); - Wb35Reg_ReadSync( pHwData, 0x1054, &BB54 ); - - pHwData->BB3c_cal = BB3c; - pHwData->BB54_cal = BB54; - - RFSynthesizer_initial(pHwData); - BBProcessor_initial(pHwData); // Async operation - - Wb35Reg_WriteSync( pHwData, 0x103c, BB3c ); - Wb35Reg_WriteSync( pHwData, 0x1054, BB54 ); - } -} - - diff --git a/drivers/staging/winbond/linux/wb35reg_f.h b/drivers/staging/winbond/linux/wb35reg_f.h deleted file mode 100644 index 3006cfe99cc..00000000000 --- a/drivers/staging/winbond/linux/wb35reg_f.h +++ /dev/null @@ -1,56 +0,0 @@ -//==================================== -// Interface function declare -//==================================== -unsigned char Wb35Reg_initial( phw_data_t pHwData ); -void Uxx_power_on_procedure( phw_data_t pHwData ); -void Uxx_power_off_procedure( phw_data_t pHwData ); -void Uxx_ReadEthernetAddress( phw_data_t pHwData ); -void Dxx_initial( phw_data_t pHwData ); -void Mxx_initial( phw_data_t pHwData ); -void RFSynthesizer_initial( phw_data_t pHwData ); -//void RFSynthesizer_SwitchingChannel( phw_data_t pHwData, s8 Channel ); -void RFSynthesizer_SwitchingChannel( phw_data_t pHwData, ChanInfo Channel ); -void BBProcessor_initial( phw_data_t pHwData ); -void BBProcessor_RateChanging( phw_data_t pHwData, u8 rate ); // 20060613.1 -//void RF_RateChanging( phw_data_t pHwData, u8 rate ); // 20060626.5.c Add -u8 RFSynthesizer_SetPowerIndex( phw_data_t pHwData, u8 PowerIndex ); -u8 RFSynthesizer_SetMaxim2828_24Power( phw_data_t, u8 index ); -u8 RFSynthesizer_SetMaxim2828_50Power( phw_data_t, u8 index ); -u8 RFSynthesizer_SetMaxim2827_24Power( phw_data_t, u8 index ); -u8 RFSynthesizer_SetMaxim2827_50Power( phw_data_t, u8 index ); -u8 RFSynthesizer_SetMaxim2825Power( phw_data_t, u8 index ); -u8 RFSynthesizer_SetAiroha2230Power( phw_data_t, u8 index ); -u8 RFSynthesizer_SetAiroha7230Power( phw_data_t, u8 index ); -u8 RFSynthesizer_SetWinbond242Power( phw_data_t, u8 index ); -void GetTxVgaFromEEPROM( phw_data_t pHwData ); -void EEPROMTxVgaAdjust( phw_data_t pHwData ); // 20060619.5 Add - -#define RFWriteControlData( _A, _V ) Wb35Reg_Write( _A, 0x0864, _V ) - -void Wb35Reg_destroy( phw_data_t pHwData ); - -unsigned char Wb35Reg_Read( phw_data_t pHwData, u16 RegisterNo, u32 * pRegisterValue ); -unsigned char Wb35Reg_ReadSync( phw_data_t pHwData, u16 RegisterNo, u32 * pRegisterValue ); -unsigned char Wb35Reg_Write( phw_data_t pHwData, u16 RegisterNo, u32 RegisterValue ); -unsigned char Wb35Reg_WriteSync( phw_data_t pHwData, u16 RegisterNo, u32 RegisterValue ); -unsigned char Wb35Reg_WriteWithCallbackValue( phw_data_t pHwData, - u16 RegisterNo, - u32 RegisterValue, - s8 *pValue, - s8 Len); -unsigned char Wb35Reg_BurstWrite( phw_data_t pHwData, u16 RegisterNo, u32 * pRegisterData, u8 NumberOfData, u8 Flag ); - -void Wb35Reg_EP0VM( phw_data_t pHwData ); -void Wb35Reg_EP0VM_start( phw_data_t pHwData ); -void Wb35Reg_EP0VM_complete( PURB pUrb ); - -u32 BitReverse( u32 dwData, u32 DataLength); - -void CardGetMulticastBit( u8 Address[MAC_ADDR_LENGTH], u8 *Byte, u8 *Value ); -u32 CardComputeCrc( u8 * Buffer, u32 Length ); - -void Wb35Reg_phy_calibration( phw_data_t pHwData ); -void Wb35Reg_Update( phw_data_t pHwData, u16 RegisterNo, u32 RegisterValue ); -unsigned char adjust_TXVGA_for_iq_mag( phw_data_t pHwData ); - - diff --git a/drivers/staging/winbond/linux/wb35reg_s.h b/drivers/staging/winbond/linux/wb35reg_s.h deleted file mode 100644 index 8b35b93f7f0..00000000000 --- a/drivers/staging/winbond/linux/wb35reg_s.h +++ /dev/null @@ -1,170 +0,0 @@ -//======================================================================================= -/* - HAL setting function - - ======================================== - |Uxx| |Dxx| |Mxx| |BB| |RF| - ======================================== - | | - Wb35Reg_Read Wb35Reg_Write - - ---------------------------------------- - WbUsb_CallUSBDASync supplied By WbUsb module -*/ -//======================================================================================= - -#define GetBit( dwData, i) ( dwData & (0x00000001 << i)) -#define SetBit( dwData, i) ( dwData | (0x00000001 << i)) -#define ClearBit( dwData, i) ( dwData & ~(0x00000001 << i)) - -#define IGNORE_INCREMENT 0 -#define AUTO_INCREMENT 0 -#define NO_INCREMENT 1 -#define REG_DIRECTION(_x,_y) ((_y)->DIRECT ==0 ? usb_rcvctrlpipe(_x,0) : usb_sndctrlpipe(_x,0)) -#define REG_BUF_SIZE(_x) ((_x)->bRequest== 0x04 ? cpu_to_le16((_x)->wLength) : 4) - -// 20060613.2 Add the follow definition -#define BB48_DEFAULT_AL2230_11B 0x0033447c -#define BB4C_DEFAULT_AL2230_11B 0x0A00FEFF -#define BB48_DEFAULT_AL2230_11G 0x00332C1B -#define BB4C_DEFAULT_AL2230_11G 0x0A00FEFF - - -#define BB48_DEFAULT_WB242_11B 0x00292315 //backoff 2dB -#define BB4C_DEFAULT_WB242_11B 0x0800FEFF //backoff 2dB -//#define BB48_DEFAULT_WB242_11B 0x00201B11 //backoff 4dB -//#define BB4C_DEFAULT_WB242_11B 0x0600FF00 //backoff 4dB -#define BB48_DEFAULT_WB242_11G 0x00453B24 -#define BB4C_DEFAULT_WB242_11G 0x0E00FEFF - -//==================================== -// Default setting for Mxx -//==================================== -#define DEFAULT_CWMIN 31 //(M2C) CWmin. Its value is in the range 0-31. -#define DEFAULT_CWMAX 1023 //(M2C) CWmax. Its value is in the range 0-1023. -#define DEFAULT_AID 1 //(M34) AID. Its value is in the range 1-2007. - -#ifdef _USE_FALLBACK_RATE_ -#define DEFAULT_RATE_RETRY_LIMIT 2 //(M38) as named -#else -#define DEFAULT_RATE_RETRY_LIMIT 7 //(M38) as named -#endif - -#define DEFAULT_LONG_RETRY_LIMIT 7 //(M38) LongRetryLimit. Its value is in the range 0-15. -#define DEFAULT_SHORT_RETRY_LIMIT 7 //(M38) ShortRetryLimit. Its value is in the range 0-15. -#define DEFAULT_PIFST 25 //(M3C) PIFS Time. Its value is in the range 0-65535. -#define DEFAULT_EIFST 354 //(M3C) EIFS Time. Its value is in the range 0-1048575. -#define DEFAULT_DIFST 45 //(M3C) DIFS Time. Its value is in the range 0-65535. -#define DEFAULT_SIFST 5 //(M3C) SIFS Time. Its value is in the range 0-65535. -#define DEFAULT_OSIFST 10 //(M3C) Original SIFS Time. Its value is in the range 0-15. -#define DEFAULT_ATIMWD 0 //(M40) ATIM Window. Its value is in the range 0-65535. -#define DEFAULT_SLOT_TIME 20 //(M40) ($) SlotTime. Its value is in the range 0-255. -#define DEFAULT_MAX_TX_MSDU_LIFE_TIME 512 //(M44) MaxTxMSDULifeTime. Its value is in the range 0-4294967295. -#define DEFAULT_BEACON_INTERVAL 500 //(M48) Beacon Interval. Its value is in the range 0-65535. -#define DEFAULT_PROBE_DELAY_TIME 200 //(M48) Probe Delay Time. Its value is in the range 0-65535. -#define DEFAULT_PROTOCOL_VERSION 0 //(M4C) -#define DEFAULT_MAC_POWER_STATE 2 //(M4C) 2: MAC at power active -#define DEFAULT_DTIM_ALERT_TIME 0 - - -typedef struct _REG_QUEUE -{ - struct urb *pUrb; - void* pUsbReq; - void* Next; - union - { - u32 VALUE; - u32 * pBuffer; - }; - u8 RESERVED[4];// space reserved for communication - - u16 INDEX; // For storing the register index - u8 RESERVED_VALID; //Indicate whether the RESERVED space is valid at this command. - u8 DIRECT; // 0:In 1:Out - -} REG_QUEUE, *PREG_QUEUE; - -//==================================== -// Internal variable for module -//==================================== -#define MAX_SQ3_FILTER_SIZE 5 -typedef struct _WB35REG -{ - //============================ - // Register Bank backup - //============================ - u32 U1B0; //bit16 record the h/w radio on/off status - u32 U1BC_LEDConfigure; - u32 D00_DmaControl; - u32 M00_MacControl; - union { - struct { - u32 M04_MulticastAddress1; - u32 M08_MulticastAddress2; - }; - u8 Multicast[8]; // contents of card multicast registers - }; - - u32 M24_MacControl; - u32 M28_MacControl; - u32 M2C_MacControl; - u32 M38_MacControl; - u32 M3C_MacControl; // 20060214 backup only - u32 M40_MacControl; - u32 M44_MacControl; // 20060214 backup only - u32 M48_MacControl; // 20060214 backup only - u32 M4C_MacStatus; - u32 M60_MacControl; // 20060214 backup only - u32 M68_MacControl; // 20060214 backup only - u32 M70_MacControl; // 20060214 backup only - u32 M74_MacControl; // 20060214 backup only - u32 M78_ERPInformation;//930206.2.b - u32 M7C_MacControl; // 20060214 backup only - u32 M80_MacControl; // 20060214 backup only - u32 M84_MacControl; // 20060214 backup only - u32 M88_MacControl; // 20060214 backup only - u32 M98_MacControl; // 20060214 backup only - - //[20040722 WK] - //Baseband register - u32 BB0C; // Used for LNA calculation - u32 BB2C; // - u32 BB30; //11b acquisition control register - u32 BB3C; - u32 BB48; // 20051221.1.a 20060613.1 Fix OBW issue of 11b/11g rate - u32 BB4C; // 20060613.1 Fix OBW issue of 11b/11g rate - u32 BB50; //mode control register - u32 BB54; - u32 BB58; //IQ_ALPHA - u32 BB5C; // For test - u32 BB60; // for WTO read value - - //------------------- - // VM - //------------------- - spinlock_t EP0VM_spin_lock; // 4B - u32 EP0VM_status;//$$ - PREG_QUEUE pRegFirst; - PREG_QUEUE pRegLast; - OS_ATOMIC RegFireCount; - - // Hardware status - u8 EP0vm_state; - u8 mac_power_save; - u8 EEPROMPhyType; // 0 ~ 15 for Maxim (0 ĄV MAX2825, 1 ĄV MAX2827, 2 ĄV MAX2828, 3 ĄV MAX2829), - // 16 ~ 31 for Airoha (16 ĄV AL2230, 11 - AL7230) - // 32 ~ Reserved - // 33 ~ 47 For WB242 ( 33 - WB242, 34 - WB242 with new Txvga 0.5 db step) - // 48 ~ 255 ARE RESERVED. - u8 EEPROMRegion; //Region setting in EEPROM - - u32 SyncIoPause; // If user use the Sync Io to access Hw, then pause the async access - - u8 LNAValue[4]; //Table for speed up running - u32 SQ3_filter[MAX_SQ3_FILTER_SIZE]; - u32 SQ3_index; - -} WB35REG, *PWB35REG; - - diff --git a/drivers/staging/winbond/linux/wb35rx.c b/drivers/staging/winbond/linux/wb35rx.c deleted file mode 100644 index b4b9f5f371d..00000000000 --- a/drivers/staging/winbond/linux/wb35rx.c +++ /dev/null @@ -1,334 +0,0 @@ -//============================================================================ -// Copyright (c) 1996-2002 Winbond Electronic Corporation -// -// Module Name: -// Wb35Rx.c -// -// Abstract: -// Processing the Rx message from down layer -// -//============================================================================ -#include "sysdef.h" - - -void Wb35Rx_start(phw_data_t pHwData) -{ - PWB35RX pWb35Rx = &pHwData->Wb35Rx; - - // Allow only one thread to run into the Wb35Rx() function - if (OS_ATOMIC_INC(pHwData->Adapter, &pWb35Rx->RxFireCounter) == 1) { - pWb35Rx->EP3vm_state = VM_RUNNING; - Wb35Rx(pHwData); - } else - OS_ATOMIC_DEC(pHwData->Adapter, &pWb35Rx->RxFireCounter); -} - -// This function cannot reentrain -void Wb35Rx( phw_data_t pHwData ) -{ - PWB35RX pWb35Rx = &pHwData->Wb35Rx; - u8 * pRxBufferAddress; - PURB pUrb = (PURB)pWb35Rx->RxUrb; - int retv; - u32 RxBufferId; - - // - // Issuing URB - // - if (pHwData->SurpriseRemove || pHwData->HwStop) - goto error; - - if (pWb35Rx->rx_halt) - goto error; - - // Get RxBuffer's ID - RxBufferId = pWb35Rx->RxBufferId; - if (!pWb35Rx->RxOwner[RxBufferId]) { - // It's impossible to run here. - #ifdef _PE_RX_DUMP_ - WBDEBUG(("Rx driver fifo unavailable\n")); - #endif - goto error; - } - - // Update buffer point, then start to bulkin the data from USB - pWb35Rx->RxBufferId++; - pWb35Rx->RxBufferId %= MAX_USB_RX_BUFFER_NUMBER; - - pWb35Rx->CurrentRxBufferId = RxBufferId; - - if (1 != OS_MEMORY_ALLOC((void* *)&pWb35Rx->pDRx, MAX_USB_RX_BUFFER)) { - printk("w35und: Rx memory alloc failed\n"); - goto error; - } - pRxBufferAddress = pWb35Rx->pDRx; - - usb_fill_bulk_urb(pUrb, pHwData->WbUsb.udev, - usb_rcvbulkpipe(pHwData->WbUsb.udev, 3), - pRxBufferAddress, MAX_USB_RX_BUFFER, - Wb35Rx_Complete, pHwData); - - pWb35Rx->EP3vm_state = VM_RUNNING; - - retv = wb_usb_submit_urb(pUrb); - - if (retv != 0) { - printk("Rx URB sending error\n"); - goto error; - } - return; - -error: - // VM stop - pWb35Rx->EP3vm_state = VM_STOP; - OS_ATOMIC_DEC( pHwData->Adapter, &pWb35Rx->RxFireCounter ); -} - -void Wb35Rx_Complete(PURB pUrb) -{ - phw_data_t pHwData = pUrb->context; - PWB35RX pWb35Rx = &pHwData->Wb35Rx; - u8 * pRxBufferAddress; - u32 SizeCheck; - u16 BulkLength; - u32 RxBufferId; - R00_DESCRIPTOR R00; - - // Variable setting - pWb35Rx->EP3vm_state = VM_COMPLETED; - pWb35Rx->EP3VM_status = pUrb->status;//Store the last result of Irp - - RxBufferId = pWb35Rx->CurrentRxBufferId; - - pRxBufferAddress = pWb35Rx->pDRx; - BulkLength = (u16)pUrb->actual_length; - - // The IRP is completed - pWb35Rx->EP3vm_state = VM_COMPLETED; - - if (pHwData->SurpriseRemove || pHwData->HwStop) // Must be here, or RxBufferId is invalid - goto error; - - if (pWb35Rx->rx_halt) - goto error; - - // Start to process the data only in successful condition - pWb35Rx->RxOwner[ RxBufferId ] = 0; // Set the owner to driver - R00.value = le32_to_cpu(*(u32 *)pRxBufferAddress); - - // The URB is completed, check the result - if (pWb35Rx->EP3VM_status != 0) { - #ifdef _PE_USB_STATE_DUMP_ - WBDEBUG(("EP3 IoCompleteRoutine return error\n")); - DebugUsbdStatusInformation( pWb35Rx->EP3VM_status ); - #endif - pWb35Rx->EP3vm_state = VM_STOP; - goto error; - } - - // 20060220 For recovering. check if operating in single USB mode - if (!HAL_USB_MODE_BURST(pHwData)) { - SizeCheck = R00.R00_receive_byte_count; //20060926 anson's endian - if ((SizeCheck & 0x03) > 0) - SizeCheck -= 4; - SizeCheck = (SizeCheck + 3) & ~0x03; - SizeCheck += 12; // 8 + 4 badbeef - if ((BulkLength > 1600) || - (SizeCheck > 1600) || - (BulkLength != SizeCheck) || - (BulkLength == 0)) { // Add for fail Urb - pWb35Rx->EP3vm_state = VM_STOP; - pWb35Rx->Ep3ErrorCount2++; - } - } - - // Indicating the receiving data - pWb35Rx->ByteReceived += BulkLength; - pWb35Rx->RxBufferSize[ RxBufferId ] = BulkLength; - - if (!pWb35Rx->RxOwner[ RxBufferId ]) - Wb35Rx_indicate(pHwData); - - kfree(pWb35Rx->pDRx); - // Do the next receive - Wb35Rx(pHwData); - return; - -error: - pWb35Rx->RxOwner[ RxBufferId ] = 1; // Set the owner to hardware - OS_ATOMIC_DEC( pHwData->Adapter, &pWb35Rx->RxFireCounter ); - pWb35Rx->EP3vm_state = VM_STOP; -} - -//===================================================================================== -unsigned char Wb35Rx_initial(phw_data_t pHwData) -{ - PWB35RX pWb35Rx = &pHwData->Wb35Rx; - - // Initial the Buffer Queue - Wb35Rx_reset_descriptor( pHwData ); - - pWb35Rx->RxUrb = wb_usb_alloc_urb(0); - return (!!pWb35Rx->RxUrb); -} - -void Wb35Rx_stop(phw_data_t pHwData) -{ - PWB35RX pWb35Rx = &pHwData->Wb35Rx; - - // Canceling the Irp if already sends it out. - if (pWb35Rx->EP3vm_state == VM_RUNNING) { - usb_unlink_urb( pWb35Rx->RxUrb ); // Only use unlink, let Wb35Rx_destroy to free them - #ifdef _PE_RX_DUMP_ - WBDEBUG(("EP3 Rx stop\n")); - #endif - } -} - -// Needs process context -void Wb35Rx_destroy(phw_data_t pHwData) -{ - PWB35RX pWb35Rx = &pHwData->Wb35Rx; - - do { - OS_SLEEP(10000); // Delay for waiting function enter 940623.1.a - } while (pWb35Rx->EP3vm_state != VM_STOP); - OS_SLEEP(10000); // Delay for waiting function exit 940623.1.b - - if (pWb35Rx->RxUrb) - usb_free_urb( pWb35Rx->RxUrb ); - #ifdef _PE_RX_DUMP_ - WBDEBUG(("Wb35Rx_destroy OK\n")); - #endif -} - -void Wb35Rx_reset_descriptor( phw_data_t pHwData ) -{ - PWB35RX pWb35Rx = &pHwData->Wb35Rx; - u32 i; - - pWb35Rx->ByteReceived = 0; - pWb35Rx->RxProcessIndex = 0; - pWb35Rx->RxBufferId = 0; - pWb35Rx->EP3vm_state = VM_STOP; - pWb35Rx->rx_halt = 0; - - // Initial the Queue. The last buffer is reserved for used if the Rx resource is unavailable. - for( i=0; i<MAX_USB_RX_BUFFER_NUMBER; i++ ) - pWb35Rx->RxOwner[i] = 1; -} - -void Wb35Rx_adjust(PDESCRIPTOR pRxDes) -{ - u32 * pRxBufferAddress; - u32 DecryptionMethod; - u32 i; - u16 BufferSize; - - DecryptionMethod = pRxDes->R01.R01_decryption_method; - pRxBufferAddress = pRxDes->buffer_address[0]; - BufferSize = pRxDes->buffer_size[0]; - - // Adjust the last part of data. Only data left - BufferSize -= 4; // For CRC-32 - if (DecryptionMethod) - BufferSize -= 4; - if (DecryptionMethod == 3) // For CCMP - BufferSize -= 4; - - // Adjust the IV field which after 802.11 header and ICV field. - if (DecryptionMethod == 1) // For WEP - { - for( i=6; i>0; i-- ) - pRxBufferAddress[i] = pRxBufferAddress[i-1]; - pRxDes->buffer_address[0] = pRxBufferAddress + 1; - BufferSize -= 4; // 4 byte for IV - } - else if( DecryptionMethod ) // For TKIP and CCMP - { - for (i=7; i>1; i--) - pRxBufferAddress[i] = pRxBufferAddress[i-2]; - pRxDes->buffer_address[0] = pRxBufferAddress + 2;//Update the descriptor, shift 8 byte - BufferSize -= 8; // 8 byte for IV + ICV - } - pRxDes->buffer_size[0] = BufferSize; -} - -extern void packet_came(char *pRxBufferAddress, int PacketSize); - - -u16 Wb35Rx_indicate(phw_data_t pHwData) -{ - DESCRIPTOR RxDes; - PWB35RX pWb35Rx = &pHwData->Wb35Rx; - u8 * pRxBufferAddress; - u16 PacketSize; - u16 stmp, BufferSize, stmp2 = 0; - u32 RxBufferId; - - // Only one thread be allowed to run into the following - do { - RxBufferId = pWb35Rx->RxProcessIndex; - if (pWb35Rx->RxOwner[ RxBufferId ]) //Owner by VM - break; - - pWb35Rx->RxProcessIndex++; - pWb35Rx->RxProcessIndex %= MAX_USB_RX_BUFFER_NUMBER; - - pRxBufferAddress = pWb35Rx->pDRx; - BufferSize = pWb35Rx->RxBufferSize[ RxBufferId ]; - - // Parse the bulkin buffer - while (BufferSize >= 4) { - if ((cpu_to_le32(*(u32 *)pRxBufferAddress) & 0x0fffffff) == RX_END_TAG) //Is ending? 921002.9.a - break; - - // Get the R00 R01 first - RxDes.R00.value = le32_to_cpu(*(u32 *)pRxBufferAddress); - PacketSize = (u16)RxDes.R00.R00_receive_byte_count; - RxDes.R01.value = le32_to_cpu(*((u32 *)(pRxBufferAddress+4))); - // For new DMA 4k - if ((PacketSize & 0x03) > 0) - PacketSize -= 4; - - // Basic check for Rx length. Is length valid? - if (PacketSize > MAX_PACKET_SIZE) { - #ifdef _PE_RX_DUMP_ - WBDEBUG(("Serious ERROR : Rx data size too long, size =%d\n", PacketSize)); - #endif - - pWb35Rx->EP3vm_state = VM_STOP; - pWb35Rx->Ep3ErrorCount2++; - break; - } - - // Start to process Rx buffer -// RxDes.Descriptor_ID = RxBufferId; // Due to synchronous indicate, the field doesn't necessary to use. - BufferSize -= 8; //subtract 8 byte for 35's USB header length - pRxBufferAddress += 8; - - RxDes.buffer_address[0] = pRxBufferAddress; - RxDes.buffer_size[0] = PacketSize; - RxDes.buffer_number = 1; - RxDes.buffer_start_index = 0; - RxDes.buffer_total_size = RxDes.buffer_size[0]; - Wb35Rx_adjust(&RxDes); - - packet_came(pRxBufferAddress, PacketSize); - - // Move RxBuffer point to the next - stmp = PacketSize + 3; - stmp &= ~0x03; // 4n alignment - pRxBufferAddress += stmp; - BufferSize -= stmp; - stmp2 += stmp; - } - - // Reclaim resource - pWb35Rx->RxOwner[ RxBufferId ] = 1; - } while(TRUE); - - return stmp2; -} - - diff --git a/drivers/staging/winbond/linux/wb35rx_f.h b/drivers/staging/winbond/linux/wb35rx_f.h deleted file mode 100644 index daa3e73042b..00000000000 --- a/drivers/staging/winbond/linux/wb35rx_f.h +++ /dev/null @@ -1,17 +0,0 @@ -//==================================== -// Interface function declare -//==================================== -void Wb35Rx_reset_descriptor( phw_data_t pHwData ); -unsigned char Wb35Rx_initial( phw_data_t pHwData ); -void Wb35Rx_destroy( phw_data_t pHwData ); -void Wb35Rx_stop( phw_data_t pHwData ); -u16 Wb35Rx_indicate( phw_data_t pHwData ); -void Wb35Rx_adjust( PDESCRIPTOR pRxDes ); -void Wb35Rx_start( phw_data_t pHwData ); - -void Wb35Rx( phw_data_t pHwData ); -void Wb35Rx_Complete( PURB pUrb ); - - - - diff --git a/drivers/staging/winbond/linux/wb35rx_s.h b/drivers/staging/winbond/linux/wb35rx_s.h deleted file mode 100644 index b90c269e6ad..00000000000 --- a/drivers/staging/winbond/linux/wb35rx_s.h +++ /dev/null @@ -1,48 +0,0 @@ -//============================================================================ -// wb35rx.h -- -//============================================================================ - -// Definition for this module used -#define MAX_USB_RX_BUFFER 4096 // This parameter must be 4096 931130.4.f - -#define MAX_USB_RX_BUFFER_NUMBER ETHERNET_RX_DESCRIPTORS // Maximum 254, 255 is RESERVED ID -#define RX_INTERFACE 0 // Interface 1 -#define RX_PIPE 2 // Pipe 3 -#define MAX_PACKET_SIZE 1600 //1568 // 8 + 1532 + 4 + 24(IV EIV MIC ICV CRC) for check DMA data 931130.4.g -#define RX_END_TAG 0x0badbeef - - -//==================================== -// Internal variable for module -//==================================== -typedef struct _WB35RX -{ - u32 ByteReceived;// For calculating throughput of BulkIn - OS_ATOMIC RxFireCounter;// Does Wb35Rx module fire? - - u8 RxBuffer[ MAX_USB_RX_BUFFER_NUMBER ][ ((MAX_USB_RX_BUFFER+3) & ~0x03 ) ]; - u16 RxBufferSize[ ((MAX_USB_RX_BUFFER_NUMBER+1) & ~0x01) ]; - u8 RxOwner[ ((MAX_USB_RX_BUFFER_NUMBER+3) & ~0x03 ) ];//Ownership of buffer 0: SW 1:HW - - u32 RxProcessIndex;//The next index to process - u32 RxBufferId; - u32 EP3vm_state; - - u32 rx_halt; // For VM stopping - - u16 MoreDataSize; - u16 PacketSize; - - u32 CurrentRxBufferId; // For complete routine usage - u32 Rx3UrbCancel; - - u32 LastR1; // For RSSI reporting - struct urb * RxUrb; - u32 Ep3ErrorCount2; // 20060625.1 Usbd for Rx DMA error count - - int EP3VM_status; - u8 * pDRx; - -} WB35RX, *PWB35RX; - - diff --git a/drivers/staging/winbond/linux/wb35tx.c b/drivers/staging/winbond/linux/wb35tx.c deleted file mode 100644 index ba9d51244e2..00000000000 --- a/drivers/staging/winbond/linux/wb35tx.c +++ /dev/null @@ -1,307 +0,0 @@ -//============================================================================ -// Copyright (c) 1996-2002 Winbond Electronic Corporation -// -// Module Name: -// Wb35Tx.c -// -// Abstract: -// Processing the Tx message and put into down layer -// -//============================================================================ -#include "sysdef.h" - - -unsigned char -Wb35Tx_get_tx_buffer(phw_data_t pHwData, u8 **pBuffer) -{ - PWB35TX pWb35Tx = &pHwData->Wb35Tx; - - *pBuffer = pWb35Tx->TxBuffer[0]; - return TRUE; -} - -void Wb35Tx_start(phw_data_t pHwData) -{ - PWB35TX pWb35Tx = &pHwData->Wb35Tx; - - // Allow only one thread to run into function - if (OS_ATOMIC_INC(pHwData->Adapter, &pWb35Tx->TxFireCounter) == 1) { - pWb35Tx->EP4vm_state = VM_RUNNING; - Wb35Tx(pHwData); - } else - OS_ATOMIC_DEC( pHwData->Adapter, &pWb35Tx->TxFireCounter ); -} - - -void Wb35Tx(phw_data_t pHwData) -{ - PWB35TX pWb35Tx = &pHwData->Wb35Tx; - PADAPTER Adapter = pHwData->Adapter; - u8 *pTxBufferAddress; - PMDS pMds = &Adapter->Mds; - struct urb * pUrb = (struct urb *)pWb35Tx->Tx4Urb; - int retv; - u32 SendIndex; - - - if (pHwData->SurpriseRemove || pHwData->HwStop) - goto cleanup; - - if (pWb35Tx->tx_halt) - goto cleanup; - - // Ownership checking - SendIndex = pWb35Tx->TxSendIndex; - if (!pMds->TxOwner[SendIndex]) //No more data need to be sent, return immediately - goto cleanup; - - pTxBufferAddress = pWb35Tx->TxBuffer[SendIndex]; - // - // Issuing URB - // - usb_fill_bulk_urb(pUrb, pHwData->WbUsb.udev, - usb_sndbulkpipe(pHwData->WbUsb.udev, 4), - pTxBufferAddress, pMds->TxBufferSize[ SendIndex ], - Wb35Tx_complete, pHwData); - - pWb35Tx->EP4vm_state = VM_RUNNING; - retv = wb_usb_submit_urb( pUrb ); - if (retv<0) { - printk("EP4 Tx Irp sending error\n"); - goto cleanup; - } - - // Check if driver needs issue Irp for EP2 - pWb35Tx->TxFillCount += pMds->TxCountInBuffer[SendIndex]; - if (pWb35Tx->TxFillCount > 12) - Wb35Tx_EP2VM_start( pHwData ); - - pWb35Tx->ByteTransfer += pMds->TxBufferSize[SendIndex]; - return; - - cleanup: - pWb35Tx->EP4vm_state = VM_STOP; - OS_ATOMIC_DEC( pHwData->Adapter, &pWb35Tx->TxFireCounter ); -} - - -void Wb35Tx_complete(struct urb * pUrb) -{ - phw_data_t pHwData = pUrb->context; - PADAPTER Adapter = (PADAPTER)pHwData->Adapter; - PWB35TX pWb35Tx = &pHwData->Wb35Tx; - PMDS pMds = &Adapter->Mds; - - printk("wb35: tx complete\n"); - // Variable setting - pWb35Tx->EP4vm_state = VM_COMPLETED; - pWb35Tx->EP4VM_status = pUrb->status; //Store the last result of Irp - pMds->TxOwner[ pWb35Tx->TxSendIndex ] = 0;// Set the owner. Free the owner bit always. - pWb35Tx->TxSendIndex++; - pWb35Tx->TxSendIndex %= MAX_USB_TX_BUFFER_NUMBER; - - if (pHwData->SurpriseRemove || pHwData->HwStop) // Let WbWlanHalt to handle surprise remove - goto error; - - if (pWb35Tx->tx_halt) - goto error; - - // The URB is completed, check the result - if (pWb35Tx->EP4VM_status != 0) { - printk("URB submission failed\n"); - pWb35Tx->EP4vm_state = VM_STOP; - goto error; - } - - Mds_Tx(Adapter); - Wb35Tx(pHwData); - return; - -error: - OS_ATOMIC_DEC( pHwData->Adapter, &pWb35Tx->TxFireCounter ); - pWb35Tx->EP4vm_state = VM_STOP; -} - -void Wb35Tx_reset_descriptor( phw_data_t pHwData ) -{ - PWB35TX pWb35Tx = &pHwData->Wb35Tx; - - pWb35Tx->TxSendIndex = 0; - pWb35Tx->tx_halt = 0; -} - -unsigned char Wb35Tx_initial(phw_data_t pHwData) -{ - PWB35TX pWb35Tx = &pHwData->Wb35Tx; - - pWb35Tx->Tx4Urb = wb_usb_alloc_urb(0); - if (!pWb35Tx->Tx4Urb) - return FALSE; - - pWb35Tx->Tx2Urb = wb_usb_alloc_urb(0); - if (!pWb35Tx->Tx2Urb) - { - usb_free_urb( pWb35Tx->Tx4Urb ); - return FALSE; - } - - return TRUE; -} - -//====================================================== -void Wb35Tx_stop(phw_data_t pHwData) -{ - PWB35TX pWb35Tx = &pHwData->Wb35Tx; - - // Trying to canceling the Trp of EP2 - if (pWb35Tx->EP2vm_state == VM_RUNNING) - usb_unlink_urb( pWb35Tx->Tx2Urb ); // Only use unlink, let Wb35Tx_destrot to free them - #ifdef _PE_TX_DUMP_ - WBDEBUG(("EP2 Tx stop\n")); - #endif - - // Trying to canceling the Irp of EP4 - if (pWb35Tx->EP4vm_state == VM_RUNNING) - usb_unlink_urb( pWb35Tx->Tx4Urb ); // Only use unlink, let Wb35Tx_destrot to free them - #ifdef _PE_TX_DUMP_ - WBDEBUG(("EP4 Tx stop\n")); - #endif -} - -//====================================================== -void Wb35Tx_destroy(phw_data_t pHwData) -{ - PWB35TX pWb35Tx = &pHwData->Wb35Tx; - - // Wait for VM stop - do { - OS_SLEEP(10000); // Delay for waiting function enter 940623.1.a - } while( (pWb35Tx->EP2vm_state != VM_STOP) && (pWb35Tx->EP4vm_state != VM_STOP) ); - OS_SLEEP(10000); // Delay for waiting function enter 940623.1.b - - if (pWb35Tx->Tx4Urb) - usb_free_urb( pWb35Tx->Tx4Urb ); - - if (pWb35Tx->Tx2Urb) - usb_free_urb( pWb35Tx->Tx2Urb ); - - #ifdef _PE_TX_DUMP_ - WBDEBUG(("Wb35Tx_destroy OK\n")); - #endif -} - -void Wb35Tx_CurrentTime(phw_data_t pHwData, u32 TimeCount) -{ - PWB35TX pWb35Tx = &pHwData->Wb35Tx; - unsigned char Trigger = FALSE; - - if (pWb35Tx->TxTimer > TimeCount) - Trigger = TRUE; - else if (TimeCount > (pWb35Tx->TxTimer+500)) - Trigger = TRUE; - - if (Trigger) { - pWb35Tx->TxTimer = TimeCount; - Wb35Tx_EP2VM_start( pHwData ); - } -} - -void Wb35Tx_EP2VM_start(phw_data_t pHwData) -{ - PWB35TX pWb35Tx = &pHwData->Wb35Tx; - - // Allow only one thread to run into function - if (OS_ATOMIC_INC( pHwData->Adapter, &pWb35Tx->TxResultCount ) == 1) { - pWb35Tx->EP2vm_state = VM_RUNNING; - Wb35Tx_EP2VM( pHwData ); - } - else - OS_ATOMIC_DEC( pHwData->Adapter, &pWb35Tx->TxResultCount ); -} - - -void Wb35Tx_EP2VM(phw_data_t pHwData) -{ - PWB35TX pWb35Tx = &pHwData->Wb35Tx; - struct urb * pUrb = (struct urb *)pWb35Tx->Tx2Urb; - u32 * pltmp = (u32 *)pWb35Tx->EP2_buf; - int retv; - - if (pHwData->SurpriseRemove || pHwData->HwStop) - goto error; - - if (pWb35Tx->tx_halt) - goto error; - - // - // Issuing URB - // - usb_fill_int_urb( pUrb, pHwData->WbUsb.udev, usb_rcvintpipe(pHwData->WbUsb.udev,2), - pltmp, MAX_INTERRUPT_LENGTH, Wb35Tx_EP2VM_complete, pHwData, 32); - - pWb35Tx->EP2vm_state = VM_RUNNING; - retv = wb_usb_submit_urb( pUrb ); - - if (retv < 0) { - #ifdef _PE_TX_DUMP_ - WBDEBUG(("EP2 Tx Irp sending error\n")); - #endif - goto error; - } - - return; -error: - pWb35Tx->EP2vm_state = VM_STOP; - OS_ATOMIC_DEC( pHwData->Adapter, &pWb35Tx->TxResultCount ); -} - - -void Wb35Tx_EP2VM_complete(struct urb * pUrb) -{ - phw_data_t pHwData = pUrb->context; - T02_DESCRIPTOR T02, TSTATUS; - PADAPTER Adapter = (PADAPTER)pHwData->Adapter; - PWB35TX pWb35Tx = &pHwData->Wb35Tx; - u32 * pltmp = (u32 *)pWb35Tx->EP2_buf; - u32 i; - u16 InterruptInLength; - - - // Variable setting - pWb35Tx->EP2vm_state = VM_COMPLETED; - pWb35Tx->EP2VM_status = pUrb->status; - - // For Linux 2.4. Interrupt will always trigger - if (pHwData->SurpriseRemove || pHwData->HwStop) // Let WbWlanHalt to handle surprise remove - goto error; - - if (pWb35Tx->tx_halt) - goto error; - - //The Urb is completed, check the result - if (pWb35Tx->EP2VM_status != 0) { - WBDEBUG(("EP2 IoCompleteRoutine return error\n")); - pWb35Tx->EP2vm_state= VM_STOP; - goto error; - } - - // Update the Tx result - InterruptInLength = pUrb->actual_length; - // Modify for minimum memory access and DWORD alignment. - T02.value = cpu_to_le32(pltmp[0]) >> 8; // [31:8] -> [24:0] - InterruptInLength -= 1;// 20051221.1.c Modify the follow for more stable - InterruptInLength >>= 2; // InterruptInLength/4 - for (i = 1; i <= InterruptInLength; i++) { - T02.value |= ((cpu_to_le32(pltmp[i]) & 0xff) << 24); - - TSTATUS.value = T02.value; //20061009 anson's endian - Mds_SendComplete( Adapter, &TSTATUS ); - T02.value = cpu_to_le32(pltmp[i]) >> 8; - } - - return; -error: - OS_ATOMIC_DEC( pHwData->Adapter, &pWb35Tx->TxResultCount ); - pWb35Tx->EP2vm_state = VM_STOP; -} - diff --git a/drivers/staging/winbond/linux/wb35tx_f.h b/drivers/staging/winbond/linux/wb35tx_f.h deleted file mode 100644 index 107b1291813..00000000000 --- a/drivers/staging/winbond/linux/wb35tx_f.h +++ /dev/null @@ -1,20 +0,0 @@ -//==================================== -// Interface function declare -//==================================== -unsigned char Wb35Tx_initial( phw_data_t pHwData ); -void Wb35Tx_destroy( phw_data_t pHwData ); -unsigned char Wb35Tx_get_tx_buffer( phw_data_t pHwData, u8 **pBuffer ); - -void Wb35Tx_EP2VM( phw_data_t pHwData ); -void Wb35Tx_EP2VM_start( phw_data_t pHwData ); -void Wb35Tx_EP2VM_complete( PURB purb ); - -void Wb35Tx_start( phw_data_t pHwData ); -void Wb35Tx_stop( phw_data_t pHwData ); -void Wb35Tx( phw_data_t pHwData ); -void Wb35Tx_complete( PURB purb ); -void Wb35Tx_reset_descriptor( phw_data_t pHwData ); - -void Wb35Tx_CurrentTime( phw_data_t pHwData, u32 TimeCount ); - - diff --git a/drivers/staging/winbond/linux/wb35tx_s.h b/drivers/staging/winbond/linux/wb35tx_s.h deleted file mode 100644 index ac432573676..00000000000 --- a/drivers/staging/winbond/linux/wb35tx_s.h +++ /dev/null @@ -1,47 +0,0 @@ -//==================================== -// IS89C35 Tx related definition -//==================================== -#define TX_INTERFACE 0 // Interface 1 -#define TX_PIPE 3 // endpoint 4 -#define TX_INTERRUPT 1 // endpoint 2 -#define MAX_INTERRUPT_LENGTH 64 // It must be 64 for EP2 hardware - - - -//==================================== -// Internal variable for module -//==================================== - - -typedef struct _WB35TX -{ - // For Tx buffer - u8 TxBuffer[ MAX_USB_TX_BUFFER_NUMBER ][ MAX_USB_TX_BUFFER ]; - - // For Interrupt pipe - u8 EP2_buf[MAX_INTERRUPT_LENGTH]; - - OS_ATOMIC TxResultCount;// For thread control of EP2 931130.4.m - OS_ATOMIC TxFireCounter;// For thread control of EP4 931130.4.n - u32 ByteTransfer; - - u32 TxSendIndex;// The next index of Mds array to be sent - u32 EP2vm_state; // for EP2vm state - u32 EP4vm_state; // for EP4vm state - u32 tx_halt; // Stopping VM - - struct urb * Tx4Urb; - struct urb * Tx2Urb; - - int EP2VM_status; - int EP4VM_status; - - u32 TxFillCount; // 20060928 - u32 TxTimer; // 20060928 Add if sending packet not great than 13 - -} WB35TX, *PWB35TX; - - - - - diff --git a/drivers/staging/winbond/linux/wbusb.c b/drivers/staging/winbond/linux/wbusb.c deleted file mode 100644 index 39ca9b9878f..00000000000 --- a/drivers/staging/winbond/linux/wbusb.c +++ /dev/null @@ -1,391 +0,0 @@ -/* - * Copyright 2008 Pavel Machek <pavel@suse.cz> - * - * Distribute under GPLv2. - */ -#include "sysdef.h" -#include <net/mac80211.h> - -MODULE_AUTHOR(DRIVER_AUTHOR); -MODULE_DESCRIPTION(DRIVER_DESC); -MODULE_LICENSE("GPL"); -MODULE_VERSION("0.1"); - -static struct usb_device_id wb35_table[] __devinitdata = { - {USB_DEVICE(0x0416, 0x0035)}, - {USB_DEVICE(0x18E8, 0x6201)}, - {USB_DEVICE(0x18E8, 0x6206)}, - {USB_DEVICE(0x18E8, 0x6217)}, - {USB_DEVICE(0x18E8, 0x6230)}, - {USB_DEVICE(0x18E8, 0x6233)}, - {USB_DEVICE(0x1131, 0x2035)}, - { 0, } -}; - -MODULE_DEVICE_TABLE(usb, wb35_table); - -static struct ieee80211_rate wbsoft_rates[] = { - { .bitrate = 10, .flags = IEEE80211_RATE_SHORT_PREAMBLE }, -}; - -static struct ieee80211_channel wbsoft_channels[] = { - { .center_freq = 2412}, -}; - -int wbsoft_enabled; -struct ieee80211_hw *my_dev; -PADAPTER my_adapter; - -static int wbsoft_add_interface(struct ieee80211_hw *dev, - struct ieee80211_if_init_conf *conf) -{ - printk("wbsoft_add interface called\n"); - return 0; -} - -static void wbsoft_remove_interface(struct ieee80211_hw *dev, - struct ieee80211_if_init_conf *conf) -{ - printk("wbsoft_remove interface called\n"); -} - -static void wbsoft_stop(struct ieee80211_hw *hw) -{ - printk(KERN_INFO "%s called\n", __func__); -} - -static int wbsoft_get_stats(struct ieee80211_hw *hw, - struct ieee80211_low_level_stats *stats) -{ - printk(KERN_INFO "%s called\n", __func__); - return 0; -} - -static int wbsoft_get_tx_stats(struct ieee80211_hw *hw, - struct ieee80211_tx_queue_stats *stats) -{ - printk(KERN_INFO "%s called\n", __func__); - return 0; -} - -static void wbsoft_configure_filter(struct ieee80211_hw *dev, - unsigned int changed_flags, - unsigned int *total_flags, - int mc_count, struct dev_mc_list *mclist) -{ - unsigned int bit_nr, new_flags; - u32 mc_filter[2]; - int i; - - new_flags = 0; - - if (*total_flags & FIF_PROMISC_IN_BSS) { - new_flags |= FIF_PROMISC_IN_BSS; - mc_filter[1] = mc_filter[0] = ~0; - } else if ((*total_flags & FIF_ALLMULTI) || (mc_count > 32)) { - new_flags |= FIF_ALLMULTI; - mc_filter[1] = mc_filter[0] = ~0; - } else { - mc_filter[1] = mc_filter[0] = 0; - for (i = 0; i < mc_count; i++) { - if (!mclist) - break; - printk("Should call ether_crc here\n"); - //bit_nr = ether_crc(ETH_ALEN, mclist->dmi_addr) >> 26; - bit_nr = 0; - - bit_nr &= 0x3F; - mc_filter[bit_nr >> 5] |= 1 << (bit_nr & 31); - mclist = mclist->next; - } - } - - dev->flags &= ~IEEE80211_HW_RX_INCLUDES_FCS; - - *total_flags = new_flags; -} - -static int wbsoft_tx(struct ieee80211_hw *dev, struct sk_buff *skb) -{ - char *buffer = kmalloc(skb->len, GFP_ATOMIC); - printk("Sending frame %d bytes\n", skb->len); - memcpy(buffer, skb->data, skb->len); - if (1 == MLMESendFrame(my_adapter, buffer, skb->len, FRAME_TYPE_802_11_MANAGEMENT)) - printk("frame sent ok (%d bytes)?\n", skb->len); - return NETDEV_TX_OK; -} - - -static int wbsoft_start(struct ieee80211_hw *dev) -{ - wbsoft_enabled = 1; - printk("wbsoft_start called\n"); - return 0; -} - -static int wbsoft_config(struct ieee80211_hw *dev, struct ieee80211_conf *conf) -{ - ChanInfo ch; - printk("wbsoft_config called\n"); - - ch.band = 1; - ch.ChanNo = 1; /* Should use channel_num, or something, as that is already pre-translated */ - - - hal_set_current_channel(&my_adapter->sHwData, ch); - hal_set_beacon_period(&my_adapter->sHwData, conf->beacon_int); -// hal_set_cap_info(&my_adapter->sHwData, ?? ); -// hal_set_ssid(phw_data_t pHwData, u8 * pssid, u8 ssid_len); ?? - hal_set_accept_broadcast(&my_adapter->sHwData, 1); - hal_set_accept_promiscuous(&my_adapter->sHwData, 1); - hal_set_accept_multicast(&my_adapter->sHwData, 1); - hal_set_accept_beacon(&my_adapter->sHwData, 1); - hal_set_radio_mode(&my_adapter->sHwData, 0); - //hal_set_antenna_number( phw_data_t pHwData, u8 number ) - //hal_set_rf_power(phw_data_t pHwData, u8 PowerIndex) - - -// hal_start_bss(&my_adapter->sHwData, WLAN_BSSTYPE_INFRASTRUCTURE); ?? - -//void hal_set_rates(phw_data_t pHwData, u8 * pbss_rates, -// u8 length, unsigned char basic_rate_set) - - return 0; -} - -static int wbsoft_config_interface(struct ieee80211_hw *dev, - struct ieee80211_vif *vif, - struct ieee80211_if_conf *conf) -{ - printk("wbsoft_config_interface called\n"); - return 0; -} - -static u64 wbsoft_get_tsf(struct ieee80211_hw *dev) -{ - printk("wbsoft_get_tsf called\n"); - return 0; -} - -static const struct ieee80211_ops wbsoft_ops = { - .tx = wbsoft_tx, - .start = wbsoft_start, /* Start can be pretty much empty as we do WbWLanInitialize() during probe? */ - .stop = wbsoft_stop, - .add_interface = wbsoft_add_interface, - .remove_interface = wbsoft_remove_interface, - .config = wbsoft_config, - .config_interface = wbsoft_config_interface, - .configure_filter = wbsoft_configure_filter, - .get_stats = wbsoft_get_stats, - .get_tx_stats = wbsoft_get_tx_stats, - .get_tsf = wbsoft_get_tsf, -// conf_tx: hal_set_cwmin()/hal_set_cwmax; -}; - -struct wbsoft_priv { -}; - - -// Usb kernel subsystem will call this function when a new device is plugged into. -int wb35_probe(struct usb_interface *intf, const struct usb_device_id *id_table) -{ - PADAPTER Adapter; - PWBLINUX pWbLinux; - PWBUSB pWbUsb; - struct usb_host_interface *interface; - struct usb_endpoint_descriptor *endpoint; - int ret = -1; - u32 ltmp; - struct usb_device *udev = interface_to_usbdev(intf); - - usb_get_dev(udev); - - printk("[w35und]wb35_probe ->\n"); - - // 20060630.2 Check the device if it already be opened - ret = usb_control_msg(udev, usb_rcvctrlpipe( udev, 0 ), - 0x01, USB_TYPE_VENDOR|USB_RECIP_DEVICE|USB_DIR_IN, - 0x0, 0x400, <mp, 4, HZ*100 ); - if (ret < 0) - goto error; - - ltmp = cpu_to_le32(ltmp); - if (ltmp) // Is already initialized? - goto error; - - Adapter = kzalloc(sizeof(ADAPTER), GFP_KERNEL); - - my_adapter = Adapter; - pWbLinux = &Adapter->WbLinux; - pWbUsb = &Adapter->sHwData.WbUsb; - pWbUsb->udev = udev; - - interface = intf->cur_altsetting; - endpoint = &interface->endpoint[0].desc; - - if (endpoint[2].wMaxPacketSize == 512) { - printk("[w35und] Working on USB 2.0\n"); - pWbUsb->IsUsb20 = 1; - } - - if (!WbWLanInitialize(Adapter)) { - printk("[w35und]WbWLanInitialize fail\n"); - goto error; - } - - { - struct wbsoft_priv *priv; - struct ieee80211_hw *dev; - static struct ieee80211_supported_band band; - int res; - - dev = ieee80211_alloc_hw(sizeof(*priv), &wbsoft_ops); - - if (!dev) { - printk("w35und: ieee80211 alloc failed\n" ); - BUG(); - } - - my_dev = dev; - - SET_IEEE80211_DEV(dev, &udev->dev); - { - phw_data_t pHwData = &Adapter->sHwData; - unsigned char dev_addr[MAX_ADDR_LEN]; - hal_get_permanent_address(pHwData, dev_addr); - SET_IEEE80211_PERM_ADDR(dev, dev_addr); - } - - - dev->extra_tx_headroom = 12; /* FIXME */ - dev->flags = 0; - - dev->channel_change_time = 1000; -// dev->max_rssi = 100; - - dev->queues = 1; - - band.channels = wbsoft_channels; - band.n_channels = ARRAY_SIZE(wbsoft_channels); - band.bitrates = wbsoft_rates; - band.n_bitrates = ARRAY_SIZE(wbsoft_rates); - - dev->wiphy->bands[IEEE80211_BAND_2GHZ] = &band; -#if 0 - wbsoft_modes[0].num_channels = 1; - wbsoft_modes[0].channels = wbsoft_channels; - wbsoft_modes[0].mode = MODE_IEEE80211B; - wbsoft_modes[0].num_rates = ARRAY_SIZE(wbsoft_rates); - wbsoft_modes[0].rates = wbsoft_rates; - - res = ieee80211_register_hwmode(dev, &wbsoft_modes[0]); - BUG_ON(res); -#endif - - res = ieee80211_register_hw(dev); - BUG_ON(res); - } - - usb_set_intfdata( intf, Adapter ); - - printk("[w35und] _probe OK\n"); - return 0; -error: - return -ENOMEM; -} - -void packet_came(char *pRxBufferAddress, int PacketSize) -{ - struct sk_buff *skb; - struct ieee80211_rx_status rx_status = {0}; - - if (!wbsoft_enabled) - return; - - skb = dev_alloc_skb(PacketSize); - if (!skb) { - printk("Not enough memory for packet, FIXME\n"); - return; - } - - memcpy(skb_put(skb, PacketSize), - pRxBufferAddress, - PacketSize); - -/* - rx_status.rate = 10; - rx_status.channel = 1; - rx_status.freq = 12345; - rx_status.phymode = MODE_IEEE80211B; -*/ - - ieee80211_rx_irqsafe(my_dev, skb, &rx_status); -} - -unsigned char -WbUsb_initial(phw_data_t pHwData) -{ - return 1; -} - - -void -WbUsb_destroy(phw_data_t pHwData) -{ -} - -int wb35_open(struct net_device *netdev) -{ - /* netdev_priv() or netdev->ml_priv should reference to the address of - * private data(PADAPTER). It depends on whether private data memory is - * allocated when alloc_netdev(). - */ - PADAPTER Adapter = (PADAPTER)netdev_priv(netdev); - phw_data_t pHwData = &Adapter->sHwData; - - netif_start_queue(netdev); - - //TODO : put here temporarily - hal_set_accept_broadcast(pHwData, 1); // open accept broadcast - - return 0; -} - -int wb35_close(struct net_device *netdev) -{ - netif_stop_queue(netdev); - return 0; -} - -void wb35_disconnect(struct usb_interface *intf) -{ - PWBLINUX pWbLinux; - PADAPTER Adapter = usb_get_intfdata(intf); - usb_set_intfdata(intf, NULL); - - pWbLinux = &Adapter->WbLinux; - - // Card remove - WbWlanHalt(Adapter); - -} - -static struct usb_driver wb35_driver = { - .name = "w35und", - .id_table = wb35_table, - .probe = wb35_probe, - .disconnect = wb35_disconnect, -}; - -static int __init wb35_init(void) -{ - return usb_register(&wb35_driver); -} - -static void __exit wb35_exit(void) -{ - usb_deregister(&wb35_driver); -} - -module_init(wb35_init); -module_exit(wb35_exit); diff --git a/drivers/staging/winbond/linux/wbusb_f.h b/drivers/staging/winbond/linux/wbusb_f.h deleted file mode 100644 index cae29e107e1..00000000000 --- a/drivers/staging/winbond/linux/wbusb_f.h +++ /dev/null @@ -1,34 +0,0 @@ -//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -// Copyright (c) 1996-2004 Winbond Electronic Corporation -// -// Module Name: -// wbusb_f.h -// -// Abstract: -// Linux driver. -// -// Author: -// -//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - -int wb35_open(struct net_device *netdev); -int wb35_close(struct net_device *netdev); -unsigned char WbUsb_initial(phw_data_t pHwData); -void WbUsb_destroy(phw_data_t pHwData); -unsigned char WbWLanInitialize(PADAPTER Adapter); -#define WbUsb_Stop( _A ) - -int wb35_probe(struct usb_interface *intf,const struct usb_device_id *id_table); -void wb35_disconnect(struct usb_interface *intf); - - -#define wb_usb_submit_urb(_A) usb_submit_urb(_A, GFP_ATOMIC) -#define wb_usb_alloc_urb(_A) usb_alloc_urb(_A, GFP_ATOMIC) - -#define WbUsb_CheckForHang( _P ) -#define WbUsb_DetectStart( _P, _I ) - - - - - diff --git a/drivers/staging/winbond/linux/wbusb_s.h b/drivers/staging/winbond/linux/wbusb_s.h deleted file mode 100644 index d5c1d53de70..00000000000 --- a/drivers/staging/winbond/linux/wbusb_s.h +++ /dev/null @@ -1,42 +0,0 @@ -//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -// Copyright (c) 1996-2004 Winbond Electronic Corporation -// -// Module Name: -// wbusb_s.h -// -// Abstract: -// Linux driver. -// -// Author: -// -//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - -#define OS_SLEEP( _MT ) { set_current_state(TASK_INTERRUPTIBLE); \ - schedule_timeout( _MT*HZ/1000000 ); } - - -//--------------------------------------------------------------------------- -// RW_CONTEXT -- -// -// Used to track driver-generated io irps -//--------------------------------------------------------------------------- -typedef struct _RW_CONTEXT -{ - void* pHwData; - PURB pUrb; - void* pCallBackFunctionParameter; -} RW_CONTEXT, *PRW_CONTEXT; - - - - -#define DRIVER_AUTHOR "Original by: Jeff Lee<YY_Lee@issc.com.tw> Adapted to 2.6.x by Costantino Leandro (Rxart Desktop) <le_costantino@pixartargentina.com.ar>" -#define DRIVER_DESC "IS89C35 802.11bg WLAN USB Driver" - - - -typedef struct _WBUSB { - u32 IsUsb20; - struct usb_device *udev; - u32 DetectCount; -} WBUSB, *PWBUSB; diff --git a/drivers/staging/winbond/localpara.h b/drivers/staging/winbond/localpara.h index 268cf916ab4..8ca80ddda59 100644 --- a/drivers/staging/winbond/localpara.h +++ b/drivers/staging/winbond/localpara.h @@ -1,275 +1,311 @@ -//============================================================= -// LocalPara.h - -//============================================================= -//Define the local ability - -#define LOCAL_DEFAULT_BEACON_PERIOD 100 //ms -#define LOCAL_DEFAULT_ATIM_WINDOW 0 -#define LOCAL_DEFAULT_ERP_CAPABILITY 0x0431 //0x0001: ESS - //0x0010: Privacy - //0x0020: short preamble - //0x0400: short slot time -#define LOCAL_DEFAULT_LISTEN_INTERVAL 5 - -//#define LOCAL_DEFAULT_24_CHANNEL_NUM 11 // channel 1..11 -#define LOCAL_DEFAULT_24_CHANNEL_NUM 13 // channel 1..13 -#define LOCAL_DEFAULT_5_CHANNEL_NUM 8 // channel 36..64 - -#define LOCAL_USA_24_CHANNEL_NUM 11 -#define LOCAL_USA_5_CHANNEL_NUM 12 -#define LOCAL_EUROPE_24_CHANNEL_NUM 13 -#define LOCAL_EUROPE_5_CHANNEL_NUM 19 -#define LOCAL_JAPAN_24_CHANNEL_NUM 14 -#define LOCAL_JAPAN_5_CHANNEL_NUM 11 -#define LOCAL_UNKNOWN_24_CHANNEL_NUM 14 -#define LOCAL_UNKNOWN_5_CHANNEL_NUM 34 //not include 165 - - -#define psLOCAL (&(Adapter->sLocalPara)) +#ifndef __WINBOND_LOCALPARA_H +#define __WINBOND_LOCALPARA_H + +/* + * ============================================================= + * LocalPara.h - + * ============================================================= + */ + +#include "mac_structures.h" + +/* Define the local ability */ + +#define LOCAL_DEFAULT_BEACON_PERIOD 100 /* ms */ +#define LOCAL_DEFAULT_ATIM_WINDOW 0 +#define LOCAL_DEFAULT_ERP_CAPABILITY 0x0431 /* + * 0x0001: ESS + * 0x0010: Privacy + * 0x0020: short preamble + * 0x0400: short slot time + */ +#define LOCAL_DEFAULT_LISTEN_INTERVAL 5 + +#define LOCAL_DEFAULT_24_CHANNEL_NUM 13 /* channel 1..13 */ +#define LOCAL_DEFAULT_5_CHANNEL_NUM 8 /* channel 36..64 */ + +#define LOCAL_USA_24_CHANNEL_NUM 11 +#define LOCAL_USA_5_CHANNEL_NUM 12 +#define LOCAL_EUROPE_24_CHANNEL_NUM 13 +#define LOCAL_EUROPE_5_CHANNEL_NUM 19 +#define LOCAL_JAPAN_24_CHANNEL_NUM 14 +#define LOCAL_JAPAN_5_CHANNEL_NUM 11 +#define LOCAL_UNKNOWN_24_CHANNEL_NUM 14 +#define LOCAL_UNKNOWN_5_CHANNEL_NUM 34 /* not include 165 */ + +#define psLOCAL (&(adapter->sLocalPara)) #define MODE_802_11_BG 0 #define MODE_802_11_A 1 #define MODE_802_11_ABG 2 #define MODE_802_11_BG_IBSS 3 #define MODE_802_11_B 4 -#define MODE_AUTO 255 +#define MODE_AUTO 255 #define BAND_TYPE_DSSS 0 #define BAND_TYPE_OFDM_24 1 #define BAND_TYPE_OFDM_5 2 -//refer Bitmap2RateValue table -#define LOCAL_ALL_SUPPORTED_RATES_BITMAP 0x130c1a66 //the bitmap value of all the H/W supported rates - //1, 2, 5.5, 11, 6, 9, 12, 18, 24, 36, 48, 54 -#define LOCAL_OFDM_SUPPORTED_RATES_BITMAP 0x130c1240 //the bitmap value of all the H/W supported rates - //except to non-OFDM rates - //6, 9, 12, 18, 24, 36, 48, 54 - -#define LOCAL_11B_SUPPORTED_RATE_BITMAP 0x826 -#define LOCAL_11B_BASIC_RATE_BITMAP 0x826 -#define LOCAL_11B_OPERATION_RATE_BITMAP 0x826 -#define LOCAL_11G_BASIC_RATE_BITMAP 0x826 //1, 2, 5.5, 11 -#define LOCAL_11G_OPERATION_RATE_BITMAP 0x130c1240 //6, 9, 12, 18, 24, 36, 48, 54 -#define LOCAL_11A_BASIC_RATE_BITMAP 0x01001040 //6, 12, 24 -#define LOCAL_11A_OPERATION_RATE_BITMAP 0x120c0200 //9, 18, 36, 48, 54 - - - -#define PWR_ACTIVE 0 -#define PWR_SAVE 1 +/* refer Bitmap2RateValue table */ + +/* the bitmap value of all the H/W supported rates: */ +/* 1, 2, 5.5, 11, 6, 9, 12, 18, 24, 36, 48, 54 */ +#define LOCAL_ALL_SUPPORTED_RATES_BITMAP 0x130c1a66 +/* the bitmap value of all the H/W supported rates except to non-OFDM rates: */ +/* 6, 9, 12, 18, 24, 36, 48, 54 */ +#define LOCAL_OFDM_SUPPORTED_RATES_BITMAP 0x130c1240 +#define LOCAL_11B_SUPPORTED_RATE_BITMAP 0x826 +#define LOCAL_11B_BASIC_RATE_BITMAP 0x826 +#define LOCAL_11B_OPERATION_RATE_BITMAP 0x826 +#define LOCAL_11G_BASIC_RATE_BITMAP 0x826 /* 1, 2, 5.5, 11 */ +#define LOCAL_11G_OPERATION_RATE_BITMAP 0x130c1240 /* 6, 9, 12, 18, + * 24, 36, 48, 54 + */ +#define LOCAL_11A_BASIC_RATE_BITMAP 0x01001040 /* 6, 12, 24 */ +#define LOCAL_11A_OPERATION_RATE_BITMAP 0x120c0200 /* 9, 18, 36, + * 48, 54 + */ + + +#define PWR_ACTIVE 0 +#define PWR_SAVE 1 #define PWR_TX_IDLE_CYCLE 6 -//bPreambleMode and bSlotTimeMode -#define AUTO_MODE 0 -#define LONG_MODE 1 - -//Region definition -#define REGION_AUTO 0xff -#define REGION_UNKNOWN 0 -#define REGION_EUROPE 1 //ETSI -#define REGION_JAPAN 2 //MKK -#define REGION_USA 3 //FCC -#define REGION_FRANCE 4 //FRANCE -#define REGION_SPAIN 5 //SPAIN -#define REGION_ISRAEL 6 //ISRAEL -//#define REGION_CANADA 7 //IC +/* bPreambleMode and bSlotTimeMode */ +#define AUTO_MODE 0 +#define LONG_MODE 1 + +/* Region definition */ +#define REGION_AUTO 0xff +#define REGION_UNKNOWN 0 +#define REGION_EUROPE 1 /* ETSI */ +#define REGION_JAPAN 2 /* MKK */ +#define REGION_USA 3 /* FCC */ +#define REGION_FRANCE 4 /* FRANCE */ +#define REGION_SPAIN 5 /* SPAIN */ +#define REGION_ISRAEL 6 /* ISRAEL */ #define MAX_BSS_DESCRIPT_ELEMENT 32 -#define MAX_PMKID_CandidateList 16 - -//High byte : Event number, low byte : reason -//Event definition -//-- SME/MLME event -#define EVENT_RCV_DEAUTH 0x0100 -#define EVENT_JOIN_FAIL 0x0200 -#define EVENT_AUTH_FAIL 0x0300 -#define EVENT_ASSOC_FAIL 0x0400 -#define EVENT_LOST_SIGNAL 0x0500 -#define EVENT_BSS_DESCRIPT_LACK 0x0600 -#define EVENT_COUNTERMEASURE 0x0700 -#define EVENT_JOIN_FILTER 0x0800 -//-- TX/RX event -#define EVENT_RX_BUFF_UNAVAILABLE 0x4100 - -#define EVENT_CONNECT 0x8100 -#define EVENT_DISCONNECT 0x8200 -#define EVENT_SCAN_REQ 0x8300 - -//Reason of Event +#define MAX_PMKID_CandidateList 16 + +/* + * High byte : Event number, low byte : reason + * Event definition + * -- SME/MLME event + */ +#define EVENT_RCV_DEAUTH 0x0100 +#define EVENT_JOIN_FAIL 0x0200 +#define EVENT_AUTH_FAIL 0x0300 +#define EVENT_ASSOC_FAIL 0x0400 +#define EVENT_LOST_SIGNAL 0x0500 +#define EVENT_BSS_DESCRIPT_LACK 0x0600 +#define EVENT_COUNTERMEASURE 0x0700 +#define EVENT_JOIN_FILTER 0x0800 +/* -- TX/RX event */ +#define EVENT_RX_BUFF_UNAVAILABLE 0x4100 + +#define EVENT_CONNECT 0x8100 +#define EVENT_DISCONNECT 0x8200 +#define EVENT_SCAN_REQ 0x8300 + +/* Reason of Event */ #define EVENT_REASON_FILTER_BASIC_RATE 0x0001 -#define EVENT_REASON_FILTER_PRIVACY 0x0002 +#define EVENT_REASON_FILTER_PRIVACY 0x0002 #define EVENT_REASON_FILTER_AUTH_MODE 0x0003 -#define EVENT_REASON_TIMEOUT 0x00ff - -// 20061108 WPS IE buffer -#define MAX_IE_APPEND_SIZE 256 + 4 // Due to [E id][Length][OUI][Data] may 257 bytes - -typedef struct _EVENTLOG -{ - u16 Count; //Total count from start - u16 index; //Buffer index, 0 ~ 63 - u32 EventValue[64]; //BYTE 3~2 : count, BYTE 1 : Event, BYTE 0 : reason -} Event_Log, *pEvent_Log; - -typedef struct _ChanInfo -{ - u8 band; - u8 ChanNo; -} ChanInfo, *pChanInfo; - -typedef struct _CHAN_LIST -{ - u16 Count; - ChanInfo Channel[50]; // 100B -} CHAN_LIST, *psCHAN_LIST; - -typedef struct _RadioOff -{ - u8 boHwRadioOff; - u8 boSwRadioOff; -} RadioOff, *psRadioOff; - -//=========================================================================== -typedef struct LOCAL_PARA -{ - u8 PermanentAddress[ MAC_ADDR_LENGTH + 2 ]; // read from EPROM, manufacture set for each NetCard - u8 ThisMacAddress[ MAC_ADDR_LENGTH + 2 ]; // the driver will use actually. - - u32 MTUsize; // Ind to Uplayer, Max transmission unit size - - u8 region_INF; //region setting from INF - u8 region; //real region setting of the device - u8 Reserved_1[2]; - - //// power-save variables - u8 iPowerSaveMode; // 0 indicates it is on, 1 indicates it is off - u8 ShutDowned; - u8 ATIMmode; - u8 ExcludeUnencrypted; - - u16 CheckCountForPS; //Unit ime count for the decision to enter PS mode - u8 boHasTxActivity; //tx activity has occurred - u8 boMacPsValid; //Power save mode obtained from H/W is valid or not - - //// Rate - u8 TxRateMode; // Initial, input from Registry, may be updated by GUI - //Tx Rate Mode: auto(DTO on), max, 1M, 2M, .. - u8 CurrentTxRate; // The current Tx rate - u8 CurrentTxRateForMng; // The current Tx rate for management frames - // It will be decided before connection succeeds. - u8 CurrentTxFallbackRate; - - //for Rate handler - u8 BRateSet[32]; //basic rate set - u8 SRateSet[32]; //support rate set - - u8 NumOfBRate; - u8 NumOfSRate; - u8 NumOfDsssRateInSRate; //number of DSSS rates in supported rate set - u8 reserved1; - - u32 dwBasicRateBitmap; //bit map of basic rates - u32 dwSupportRateBitmap; //bit map of all support rates including - //basic and operational rates - - ////For SME/MLME handler - u16 wOldSTAindex; // valid when boHandover=TRUE, store old connected STA index - u16 wConnectedSTAindex; // Index of peerly connected AP or IBSS in - // the descriptionset. - u16 Association_ID; // The Association ID in the (Re)Association - // Response frame. - u16 ListenInterval; // The listen interval when SME invoking MLME_ - // (Re)Associate_Request(). - - RadioOff RadioOffStatus; - u8 Reserved0[2]; - - u8 boMsRadioOff; // Ndis demands to be true when set Disassoc. OID and be false when set SSID OID. - u8 boAntennaDiversity; //TRUE/ON or FALSE/OFF - u8 bAntennaNo; //which antenna - u8 bConnectFlag; //the connect status flag for roaming task - - u8 RoamStatus; - u8 reserved7[3]; - - ChanInfo CurrentChan; //Current channel no. and channel band. It may be changed by scanning. - u8 boHandover; // Roaming, Hnadover to other AP. - u8 boCCAbusy; - - u16 CWMax; // It may not be the real value that H/W used - u8 CWMin; // 255: set according to 802.11 spec. - u8 reserved2; - - //11G: - u8 bMacOperationMode; // operation in 802.11b or 802.11g - u8 bSlotTimeMode; //AUTO, s32 - u8 bPreambleMode; //AUTO, s32 - u8 boNonERPpresent; - - u8 boProtectMechanism; // H/W will take the necessary action based on this variable - u8 boShortPreamble; // H/W will take the necessary action based on this variable - u8 boShortSlotTime; // H/W will take the necessary action based on this variable - u8 reserved_3; - - u32 RSN_IE_Bitmap; //added by WS - u32 RSN_OUI_Type; //added by WS - - //For the BSSID - u8 HwBssid[MAC_ADDR_LENGTH + 2]; - u32 HwBssidValid; - - //For scan list - u8 BssListCount; //Total count of valid descriptor indexes - u8 boReceiveUncorrectInfo; //important settings in beacon/probe resp. have been changed - u8 NoOfJoinerInIbss; - u8 reserved_4; - - u8 BssListIndex[ (MAX_BSS_DESCRIPT_ELEMENT+3) & ~0x03 ]; //Store the valid descriptor indexes obtained from scannings - u8 JoinerInIbss[ (MAX_BSS_DESCRIPT_ELEMENT+3) & ~0x03 ]; //save the BssDescriptor index in this - //IBSS. The index 0 is local descriptor - //(psLOCAL->wConnectedSTAindex). - //If CONNECTED : NoOfJoinerInIbss >=2 - // else : NoOfJoinerInIbss <=1 - - //// General Statistics, count at Rx_handler or Tx_callback interrupt handler - u64 GS_XMIT_OK; // Good Frames Transmitted - u64 GS_RCV_OK; // Good Frames Received - u32 GS_RCV_ERROR; // Frames received with crc error - u32 GS_XMIT_ERROR; // Bad Frames Transmitted - u32 GS_RCV_NO_BUFFER; // Receive Buffer underrun - u32 GS_XMIT_ONE_COLLISION; // one collision - u32 GS_XMIT_MORE_COLLISIONS;// more collisions - - //================================================================ - // Statistics (no matter whether it had done successfully) -wkchen - //================================================================ - u32 _NumRxMSDU; - u32 _NumTxMSDU; - u32 _dot11WEPExcludedCount; - u32 _dot11WEPUndecryptableCount; - u32 _dot11FrameDuplicateCount; - - ChanInfo IbssChanSetting; // 2B. Start IBSS Channel setting by registry or WWU. - u8 reserved_5[2]; //It may not be used after considering RF type, - //region and modulation type. - - CHAN_LIST sSupportChanList; // 86B. It will be obtained according to RF type and region - u8 reserved_6[2]; //two variables are for wep key error detection added by ws 02/02/04 - - u32 bWepKeyError; - u32 bToSelfPacketReceived; - u32 WepKeyDetectTimerCount; - - Event_Log EventLog; - - u16 SignalLostTh; - u16 SignalRoamTh; - - // 20061108 WPS IE Append +#define EVENT_REASON_TIMEOUT 0x00ff + +/* Due to[E id][Length][OUI][Data] may be 257 bytes */ +#define MAX_IE_APPEND_SIZE (256 + 4) + +struct chan_info { + u8 band; + u8 ChanNo; +}; + +struct radio_off { + u8 boHwRadioOff; + u8 boSwRadioOff; +}; + +struct wb_local_para { + /* read from EPROM, manufacture set for each NetCard */ + u8 PermanentAddress[MAC_ADDR_LENGTH + 2]; + /* the driver will use this one actually. */ + u8 ThisMacAddress[MAC_ADDR_LENGTH + 2]; + u32 MTUsize; /* Ind to Uplayer, Max transmission unit size */ + u8 region_INF; /* region setting from INF */ + u8 region; /* real region setting of the device */ + u8 Reserved_1[2]; + + /* power-save variables */ + u8 iPowerSaveMode; /* 0 indicates on, 1 indicates off */ + u8 ATIMmode; + u8 ExcludeUnencrypted; + /* Unit time count for the decision to enter PS mode */ + u16 CheckCountForPS; + u8 boHasTxActivity;/* tx activity has occurred */ + u8 boMacPsValid; /* Power save mode obtained + * from H/W is valid or not + */ + + /* Rate */ + u8 TxRateMode; /* + * Initial, input from Registry, + * may be updated by GUI + * Tx Rate Mode: auto(DTO on), max, 1M, 2M, .. + */ + u8 CurrentTxRate; /* The current Tx rate */ + u8 CurrentTxRateForMng; /* + * The current Tx rate for management + * frames. It will be decided before + * connection succeeds. + */ + u8 CurrentTxFallbackRate; + + /* for Rate handler */ + u8 BRateSet[32]; /* basic rate set */ + u8 SRateSet[32]; /* support rate set */ + + u8 NumOfBRate; + u8 NumOfSRate; + u8 NumOfDsssRateInSRate; /* number of DSSS rates in + * supported rate set + */ + u8 reserved1; + + u32 dwBasicRateBitmap; /* bit map of basic rates */ + + u32 dwSupportRateBitmap; /* bit map of all support rates + * including basic and operational + * rates + */ + + + /* For SME/MLME handler */ + + u16 wOldSTAindex; /* valid when boHandover=TRUE, + * store old connected STA index + */ + u16 wConnectedSTAindex; /* Index of peerly connected AP or + * IBSS in the descriptionset. + */ + u16 Association_ID; /* The Association ID in the + * (Re)Association Response frame. + */ + u16 ListenInterval; /* The listen interval when SME invoking + * MLME_ (Re)Associate_Request(). + */ + + struct radio_off RadioOffStatus; + u8 Reserved0[2]; + u8 boMsRadioOff; /* Ndis demands to be true when set + * Disassoc. OID and be false when + * set SSID OID. + */ + u8 bAntennaNo; /* which antenna */ + u8 bConnectFlag; /* the connect status flag for + * roaming task + */ + + u8 RoamStatus; + u8 reserved7[3]; + + struct chan_info CurrentChan; /* Current channel no. and channel band. + * It may be changed by scanning. + */ + u8 boHandover; /* Roaming, Handover to other AP. */ + u8 boCCAbusy; + + u16 CWMax; /* It may not be the real value + * that H/W used + */ + u8 CWMin; /* 255: set according to 802.11 spec. */ + u8 reserved2; + + /* 11G: */ + u8 bMacOperationMode; /* operation in 802.11b or 802.11g */ + u8 bSlotTimeMode; /* AUTO, s32 */ + u8 bPreambleMode; /* AUTO, s32 */ + u8 boNonERPpresent; + + u8 boProtectMechanism; /* H/W will take the necessary action + * based on this variable + */ + u8 boShortPreamble; /* Same here */ + u8 boShortSlotTime; /* Same here */ + u8 reserved_3; + + u32 RSN_IE_Bitmap; + u32 RSN_OUI_Type; + + /* For the BSSID */ + u8 HwBssid[MAC_ADDR_LENGTH + 2]; + u32 HwBssidValid; + + /* For scan list */ + u8 BssListCount; /* Total count of valid + * descriptor indexes + */ + u8 boReceiveUncorrectInfo; /* important settings in beacon/probe + * resp. have been changed + */ + u8 NoOfJoinerInIbss; + u8 reserved_4; + + /* Store the valid descriptor indexes obtained from scannings */ + u8 BssListIndex[(MAX_BSS_DESCRIPT_ELEMENT + 3) & ~0x03]; + /* + * Save the BssDescriptor index in this IBSS. + * The index 0 is local descriptor (psLOCAL->wConnectedSTAindex). + * If CONNECTED : NoOfJoinerInIbss >= 2 + * else : NoOfJoinerInIbss <= 1 + */ + u8 JoinerInIbss[(MAX_BSS_DESCRIPT_ELEMENT + 3) & ~0x03]; + + /* General Statistics, count at Rx_handler or + * Tx_callback interrupt handler + */ + u64 GS_XMIT_OK; /* Good Frames Transmitted */ + u64 GS_RCV_OK; /* Good Frames Received */ + u32 GS_RCV_ERROR; /* Frames received with crc error */ + u32 GS_XMIT_ERROR; /* Bad Frames Transmitted */ + u32 GS_RCV_NO_BUFFER; /* Receive Buffer underrun */ + u32 GS_XMIT_ONE_COLLISION; /* one collision */ + u32 GS_XMIT_MORE_COLLISIONS;/* more collisions */ + + /* + * ================================================================ + * Statistics (no matter whether it had done successfully) -wkchen + * ================================================================ + */ + u32 _NumRxMSDU; + u32 _NumTxMSDU; + u32 _dot11WEPExcludedCount; + u32 _dot11WEPUndecryptableCount; + u32 _dot11FrameDuplicateCount; + + struct chan_info IbssChanSetting; /* 2B. Start IBSS Channel + * setting by registry or + * WWU. + */ + u8 reserved_5[2]; /* It may not be used after + * considering RF type, region + * and modulation type. + */ + + u8 reserved_6[2]; /* two variables are for wep + * key error detection + */ + u32 bWepKeyError; + u32 bToSelfPacketReceived; + u32 WepKeyDetectTimerCount; + + u16 SignalLostTh; + u16 SignalRoamTh; + u8 IE_Append_data[MAX_IE_APPEND_SIZE]; u16 IE_Append_size; u16 reserved_7; +}; -} WB_LOCALDESCRIPT, *PWB_LOCALDESCRIPT; - - +#endif diff --git a/drivers/staging/winbond/mac_structures.h b/drivers/staging/winbond/mac_structures.h index 031d2cb6cd6..76c63c74d50 100644 --- a/drivers/staging/winbond/mac_structures.h +++ b/drivers/staging/winbond/mac_structures.h @@ -1,4 +1,4 @@ -//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // MAC_Structures.h // // This file contains the definitions and data structures used by SW-MAC. @@ -16,44 +16,29 @@ // Deleted some unused. // 20021129 PD43 Austin // 20030617 increase the 802.11g definition -//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ #ifndef _MAC_Structures_H_ #define _MAC_Structures_H_ - -//========================================================= -// Some miscellaneous definitions -//----- -#define MAX_CHANNELS 30 #define MAC_ADDR_LENGTH 6 -#define MAX_WEP_KEY_SIZE 16 // 128 bits -#define MAX_802_11_FRAGMENT_NUMBER 10 // By spec -//======================================================== +/* ======================================================== // 802.11 Frame define -//----- -#define MASK_PROTOCOL_VERSION_TYPE 0x0F -#define MASK_FRAGMENT_NUMBER 0x000F -#define SEQUENCE_NUMBER_SHIFT 4 -#define DIFFER_11_TO_3 18 +//----- */ #define DOT_11_MAC_HEADER_SIZE 24 #define DOT_11_SNAP_SIZE 6 #define DOT_11_DURATION_OFFSET 2 -#define DOT_11_SEQUENCE_OFFSET 22 //Sequence control offset -#define DOT_11_TYPE_OFFSET 30 //The start offset of 802.11 Frame// +/* Sequence control offset */ +#define DOT_11_SEQUENCE_OFFSET 22 +/* The start offset of 802.11 Frame// */ +#define DOT_11_TYPE_OFFSET 30 #define DOT_11_DATA_OFFSET 24 #define DOT_11_DA_OFFSET 4 -#define DOT_3_TYPE_ARP 0x80F3 -#define DOT_3_TYPE_IPX 0x8137 -#define DOT_3_TYPE_OFFSET 12 - -#define ETHERNET_HEADER_SIZE 14 #define MAX_ETHERNET_PACKET_SIZE 1514 - -//----- management : Type of Bits (2, 3) and Subtype of Bits (4, 5, 6, 7) +/* ----- management : Type of Bits (2, 3) and Subtype of Bits (4, 5, 6, 7) */ #define MAC_SUBTYPE_MNGMNT_ASSOC_REQUEST 0x00 #define MAC_SUBTYPE_MNGMNT_ASSOC_RESPONSE 0x10 #define MAC_SUBTYPE_MNGMNT_REASSOC_REQUEST 0x20 @@ -66,158 +51,6 @@ #define MAC_SUBTYPE_MNGMNT_AUTHENTICATION 0xB0 #define MAC_SUBTYPE_MNGMNT_DEAUTHENTICATION 0xC0 -//----- control : Type of Bits (2, 3) and Subtype of Bits (4, 5, 6, 7) -#define MAC_SUBTYPE_CONTROL_PSPOLL 0xA4 -#define MAC_SUBTYPE_CONTROL_RTS 0xB4 -#define MAC_SUBTYPE_CONTROL_CTS 0xC4 -#define MAC_SUBTYPE_CONTROL_ACK 0xD4 -#define MAC_SUBTYPE_CONTROL_CFEND 0xE4 -#define MAC_SUBTYPE_CONTROL_CFEND_CFACK 0xF4 - -//----- data : Type of Bits (2, 3) and Subtype of Bits (4, 5, 6, 7) -#define MAC_SUBTYPE_DATA 0x08 -#define MAC_SUBTYPE_DATA_CFACK 0x18 -#define MAC_SUBTYPE_DATA_CFPOLL 0x28 -#define MAC_SUBTYPE_DATA_CFACK_CFPOLL 0x38 -#define MAC_SUBTYPE_DATA_NULL 0x48 -#define MAC_SUBTYPE_DATA_CFACK_NULL 0x58 -#define MAC_SUBTYPE_DATA_CFPOLL_NULL 0x68 -#define MAC_SUBTYPE_DATA_CFACK_CFPOLL_NULL 0x78 - -//----- Frame Type of Bits (2, 3) -#define MAC_TYPE_MANAGEMENT 0x00 -#define MAC_TYPE_CONTROL 0x04 -#define MAC_TYPE_DATA 0x08 - -//----- definitions for Management Frame Element ID (1 BYTE) -#define ELEMENT_ID_SSID 0 -#define ELEMENT_ID_SUPPORTED_RATES 1 -#define ELEMENT_ID_FH_PARAMETER_SET 2 -#define ELEMENT_ID_DS_PARAMETER_SET 3 -#define ELEMENT_ID_CF_PARAMETER_SET 4 -#define ELEMENT_ID_TIM 5 -#define ELEMENT_ID_IBSS_PARAMETER_SET 6 -// 7~15 reserverd -#define ELEMENT_ID_CHALLENGE_TEXT 16 -// 17~31 reserved for challenge text extension -// 32~255 reserved -//-- 11G -- -#define ELEMENT_ID_ERP_INFORMATION 42 -#define ELEMENT_ID_EXTENDED_SUPPORTED_RATES 50 - -//-- WPA -- - -#define ELEMENT_ID_RSN_WPA 221 -#ifdef _WPA2_ -#define ELEMENT_ID_RSN_WPA2 48 -#endif //endif WPA2 - -#define WLAN_MAX_PAIRWISE_CIPHER_SUITE_COUNT ((u16) 6) -#define WLAN_MAX_AUTH_KEY_MGT_SUITE_LIST_COUNT ((u16) 2) - -#ifdef WB_LINUX -#define UNALIGNED -#endif - -//======================================================== -typedef enum enum_PowerManagementMode -{ - ACTIVE = 0, - POWER_SAVE -} WB_PM_Mode, *PWB_PM_MODE; - -//=================================================================== -// Reason Code (Table 18): indicate the reason of DisAssoc, DeAuthen -// length of ReasonCode is 2 Octs. -//=================================================================== -#define REASON_REASERED 0 -#define REASON_UNSPECIDIED 1 -#define REASON_PREAUTH_INVALID 2 -#define DEAUTH_REASON_LEFT_BSS 3 -#define DISASS_REASON_AP_INACTIVE 4 -#define DISASS_REASON_AP_BUSY 5 -#define REASON_CLASS2_FRAME_FROM_NONAUTH_STA 6 -#define REASON_CLASS3_FRAME_FROM_NONASSO_STA 7 -#define DISASS_REASON_LEFT_BSS 8 -#define REASON_NOT_AUTH_YET 9 -//802.11i define -#define REASON_INVALID_IE 13 -#define REASON_MIC_ERROR 14 -#define REASON_4WAY_HANDSHAKE_TIMEOUT 15 -#define REASON_GROUPKEY_UPDATE_TIMEOUT 16 -#define REASON_IE_DIFF_4WAY_ASSOC 17 -#define REASON_INVALID_MULTICAST_CIPHER 18 -#define REASON_INVALID_UNICAST_CIPHER 19 -#define REASON_INVALID_AKMP 20 -#define REASON_UNSUPPORTED_RSNIE_VERSION 21 -#define REASON_INVALID_RSNIE_CAPABILITY 22 -#define REASON_802_1X_AUTH_FAIL 23 -#define REASON_CIPHER_REJECT_PER_SEC_POLICY 14 - -/* -//=========================================================== -// enum_MMPDUResultCode -- -// Status code (2 Octs) in the MMPDU's frame body. Table.19 -// -//=========================================================== -enum enum_MMPDUResultCode -{ -// SUCCESS = 0, // Redefined - UNSPECIFIED_FAILURE = 1, - - // 2 - 9 Reserved - - NOT_SUPPROT_CAPABILITIES = 10, - - //REASSOCIATION_DENIED - // - REASSOC_DENIED_UNABLE_CFM_ASSOC_EXIST = 11, - - //ASSOCIATION_DENIED_NOT_IN_STANDARD - // - ASSOC_DENIED_REASON_NOT_IN_STANDARD = 12, - PEER_NOT_SUPPORT_AUTH_ALGORITHM = 13, - AUTH_SEQNUM_OUT_OF_EXPECT = 14, - AUTH_REJECT_REASON_CHALLENGE_FAIL = 15, - AUTH_REJECT_REASON_WAIT_TIMEOUT = 16, - ASSOC_DENIED_REASON_AP_BUSY = 17, - ASSOC_DENIED_REASON_NOT_SUPPORT_BASIC_RATE = 18 -} WB_MMPDURESULTCODE, *PWB_MMPDURESULTCODE; -*/ - -//=========================================================== -// enum_TxRate -- -// Define the transmission constants based on W89C32 MAC -// target specification. -//=========================================================== -typedef enum enum_TxRate -{ - TXRATE_1M = 0, - TXRATE_2MLONG = 2, - TXRATE_2MSHORT = 3, - TXRATE_55MLONG = 4, - TXRATE_55MSHORT = 5, - TXRATE_11MLONG = 6, - TXRATE_11MSHORT = 7, - TXRATE_AUTO = 255 // PD43 20021108 -} WB_TXRATE, *PWB_TXRATE; - - -#define RATE_BITMAP_1M 1 -#define RATE_BITMAP_2M 2 -#define RATE_BITMAP_5dot5M 5 -#define RATE_BITMAP_6M 6 -#define RATE_BITMAP_9M 9 -#define RATE_BITMAP_11M 11 -#define RATE_BITMAP_12M 12 -#define RATE_BITMAP_18M 18 -#define RATE_BITMAP_22M 22 -#define RATE_BITMAP_24M 24 -#define RATE_BITMAP_33M 17 -#define RATE_BITMAP_36M 19 -#define RATE_BITMAP_48M 25 -#define RATE_BITMAP_54M 28 - #define RATE_AUTO 0 #define RATE_1M 2 #define RATE_2M 4 @@ -235,436 +68,4 @@ typedef enum enum_TxRate #define RATE_54M 108 #define RATE_MAX 255 -//CAPABILITY -#define CAPABILITY_ESS_BIT 0x0001 -#define CAPABILITY_IBSS_BIT 0x0002 -#define CAPABILITY_CF_POLL_BIT 0x0004 -#define CAPABILITY_CF_POLL_REQ_BIT 0x0008 -#define CAPABILITY_PRIVACY_BIT 0x0010 -#define CAPABILITY_SHORT_PREAMBLE_BIT 0x0020 -#define CAPABILITY_PBCC_BIT 0x0040 -#define CAPABILITY_CHAN_AGILITY_BIT 0x0080 -#define CAPABILITY_SHORT_SLOT_TIME_BIT 0x0400 -#define CAPABILITY_DSSS_OFDM_BIT 0x2000 - - -struct Capability_Information_Element -{ - union - { - u16 __attribute__ ((packed)) wValue; - #ifdef _BIG_ENDIAN_ //20060926 add by anson's endian - struct _Capability - { - //-- 11G -- - u8 Reserved3 : 2; - u8 DSSS_OFDM : 1; - u8 Reserved2 : 2; - u8 Short_Slot_Time : 1; - u8 Reserved1 : 2; - u8 Channel_Agility : 1; - u8 PBCC : 1; - u8 ShortPreamble : 1; - u8 CF_Privacy : 1; - u8 CF_Poll_Request : 1; - u8 CF_Pollable : 1; - u8 IBSS : 1; - u8 ESS : 1; - } __attribute__ ((packed)) Capability; - #else - struct _Capability - { - u8 ESS : 1; - u8 IBSS : 1; - u8 CF_Pollable : 1; - u8 CF_Poll_Request : 1; - u8 CF_Privacy : 1; - u8 ShortPreamble : 1; - u8 PBCC : 1; - u8 Channel_Agility : 1; - u8 Reserved1 : 2; - //-- 11G -- - u8 Short_Slot_Time : 1; - u8 Reserved2 : 2; - u8 DSSS_OFDM : 1; - u8 Reserved3 : 2; - } __attribute__ ((packed)) Capability; - #endif - }__attribute__ ((packed)) ; -}__attribute__ ((packed)); - -struct FH_Parameter_Set_Element -{ - u8 Element_ID; - u8 Length; - u8 Dwell_Time[2]; - u8 Hop_Set; - u8 Hop_Pattern; - u8 Hop_Index; -}; - -struct DS_Parameter_Set_Element -{ - u8 Element_ID; - u8 Length; - u8 Current_Channel; -}; - -struct Supported_Rates_Element -{ - u8 Element_ID; - u8 Length; - u8 SupportedRates[8]; -}__attribute__ ((packed)); - -struct SSID_Element -{ - u8 Element_ID; - u8 Length; - u8 SSID[32]; -}__attribute__ ((packed)) ; - -struct CF_Parameter_Set_Element -{ - u8 Element_ID; - u8 Length; - u8 CFP_Count; - u8 CFP_Period; - u8 CFP_MaxDuration[2]; // in Time Units - u8 CFP_DurRemaining[2]; // in time units -}; - -struct TIM_Element -{ - u8 Element_ID; - u8 Length; - u8 DTIM_Count; - u8 DTIM_Period; - u8 Bitmap_Control; - u8 Partial_Virtual_Bitmap[251]; -}; - -struct IBSS_Parameter_Set_Element -{ - u8 Element_ID; - u8 Length; - u8 ATIM_Window[2]; -}; - -struct Challenge_Text_Element -{ - u8 Element_ID; - u8 Length; - u8 Challenge_Text[253]; -}; - -struct PHY_Parameter_Set_Element -{ -// int aSlotTime; -// int aSifsTime; - s32 aCCATime; - s32 aRxTxTurnaroundTime; - s32 aTxPLCPDelay; - s32 RxPLCPDelay; - s32 aRxTxSwitchTime; - s32 aTxRampOntime; - s32 aTxRampOffTime; - s32 aTxRFDelay; - s32 aRxRFDelay; - s32 aAirPropagationTime; - s32 aMACProcessingDelay; - s32 aPreambleLength; - s32 aPLCPHeaderLength; - s32 aMPDUDurationFactor; - s32 aMPDUMaxLength; -// int aCWmin; -// int aCWmax; -}; - -//-- 11G -- -struct ERP_Information_Element -{ - u8 Element_ID; - u8 Length; - #ifdef _BIG_ENDIAN_ //20060926 add by anson's endian - u8 Reserved:5; //20060926 add by anson - u8 Barker_Preamble_Mode:1; - u8 Use_Protection:1; - u8 NonERP_Present:1; - #else - u8 NonERP_Present:1; - u8 Use_Protection:1; - u8 Barker_Preamble_Mode:1; - u8 Reserved:5; - #endif -}; - -struct Extended_Supported_Rates_Element -{ - u8 Element_ID; - u8 Length; - u8 ExtendedSupportedRates[255]; -}__attribute__ ((packed)); - -//WPA(802.11i draft 3.0) -#define VERSION_WPA 1 -#ifdef _WPA2_ -#define VERSION_WPA2 1 -#endif //end def _WPA2_ -#define OUI_WPA 0x00F25000 //WPA2.0 OUI=00:50:F2, the MSB is reserved for suite type -#ifdef _WPA2_ -#define OUI_WPA2 0x00AC0F00 // for wpa2 change to 0x00ACOF04 by Ws 26/04/04 -#endif //end def _WPA2_ - -#define OUI_WPA_ADDITIONAL 0x01 -#define WLAN_MIN_RSN_WPA_LENGTH 6 //added by ws 09/10/04 -#ifdef _WPA2_ -#define WLAN_MIN_RSN_WPA2_LENGTH 2 // Fix to 2 09/14/05 -#endif //end def _WPA2_ - -#define oui_wpa (u32)(OUI_WPA|OUI_WPA_ADDITIONAL) - -#define WPA_OUI_BIG ((u32) 0x01F25000)//added by ws 09/23/04 -#define WPA_OUI_LITTLE ((u32) 0x01F25001)//added by ws 09/23/04 - -#define WPA_WPS_OUI cpu_to_le32(0x04F25000) // 20061108 For WPS. It's little endian. Big endian is 0x0050F204 - -//-----WPA2----- -#ifdef _WPA2_ -#define WPA2_OUI_BIG ((u32)0x01AC0F00) -#define WPA2_OUI_LITTLE ((u32)0x01AC0F01) -#endif //end def _WPA2_ - -//Authentication suite -#define OUI_AUTH_WPA_NONE 0x00 //for WPA_NONE -#define OUI_AUTH_8021X 0x01 -#define OUI_AUTH_PSK 0x02 -//Cipher suite -#define OUI_CIPHER_GROUP_KEY 0x00 //added by ws 05/21/04 -#define OUI_CIPHER_WEP_40 0x01 -#define OUI_CIPHER_TKIP 0x02 -#define OUI_CIPHER_CCMP 0x04 -#define OUI_CIPHER_WEP_104 0x05 - -typedef struct _SUITE_SELECTOR_ -{ - union - { - u8 Value[4]; - struct _SUIT_ - { - u8 OUI[3]; - u8 Type; - }SuitSelector; - }; -}SUITE_SELECTOR; - -//-- WPA -- -struct RSN_Information_Element -{ - u8 Element_ID; - u8 Length; - UNALIGNED SUITE_SELECTOR OuiWPAAdditional;//WPA version 2.0 additional field, and should be 00:50:F2:01 - u16 Version; - SUITE_SELECTOR GroupKeySuite; - u16 PairwiseKeySuiteCount; - SUITE_SELECTOR PairwiseKeySuite[1]; -}__attribute__ ((packed)); -struct RSN_Auth_Sub_Information_Element -{ - u16 AuthKeyMngtSuiteCount; - SUITE_SELECTOR AuthKeyMngtSuite[1]; -}__attribute__ ((packed)); - -//-- WPA2 -- -struct RSN_Capability_Element -{ - union - { - u16 __attribute__ ((packed)) wValue; - #ifdef _BIG_ENDIAN_ //20060927 add by anson's endian - struct _RSN_Capability - { - u16 __attribute__ ((packed)) Reserved2 : 8; // 20051201 - u16 __attribute__ ((packed)) Reserved1 : 2; - u16 __attribute__ ((packed)) GTK_Replay_Counter : 2; - u16 __attribute__ ((packed)) PTK_Replay_Counter : 2; - u16 __attribute__ ((packed)) No_Pairwise : 1; - u16 __attribute__ ((packed)) Pre_Auth : 1; - }__attribute__ ((packed)) RSN_Capability; - #else - struct _RSN_Capability - { - u16 __attribute__ ((packed)) Pre_Auth : 1; - u16 __attribute__ ((packed)) No_Pairwise : 1; - u16 __attribute__ ((packed)) PTK_Replay_Counter : 2; - u16 __attribute__ ((packed)) GTK_Replay_Counter : 2; - u16 __attribute__ ((packed)) Reserved1 : 2; - u16 __attribute__ ((packed)) Reserved2 : 8; // 20051201 - }__attribute__ ((packed)) RSN_Capability; - #endif - - }__attribute__ ((packed)) ; -}__attribute__ ((packed)) ; - -#ifdef _WPA2_ -typedef struct _PMKID -{ - u8 pValue[16]; -}PMKID; - -struct WPA2_RSN_Information_Element -{ - u8 Element_ID; - u8 Length; - u16 Version; - SUITE_SELECTOR GroupKeySuite; - u16 PairwiseKeySuiteCount; - SUITE_SELECTOR PairwiseKeySuite[1]; - -}__attribute__ ((packed)); - -struct WPA2_RSN_Auth_Sub_Information_Element -{ - u16 AuthKeyMngtSuiteCount; - SUITE_SELECTOR AuthKeyMngtSuite[1]; -}__attribute__ ((packed)); - - -struct PMKID_Information_Element -{ - u16 PMKID_Count; - PMKID pmkid [16] ; -}__attribute__ ((packed)); - -#endif //enddef _WPA2_ -//============================================================ -// MAC Frame structure (different type) and subfield structure -//============================================================ -struct MAC_frame_control -{ - u8 mac_frame_info; // a combination of the [Protocol Version, Control Type, Control Subtype] - #ifdef _BIG_ENDIAN_ //20060927 add by anson's endian - u8 order:1; - u8 WEP:1; - u8 more_data:1; - u8 pwr_mgt:1; - u8 retry:1; - u8 more_frag:1; - u8 from_ds:1; - u8 to_ds:1; - #else - u8 to_ds:1; - u8 from_ds:1; - u8 more_frag:1; - u8 retry:1; - u8 pwr_mgt:1; - u8 more_data:1; - u8 WEP:1; - u8 order:1; - #endif -} __attribute__ ((packed)); - -struct Management_Frame { - struct MAC_frame_control frame_control; // 2B, ToDS,FromDS,MoreFrag,MoreData,Order=0 - u16 duration; - u8 DA[MAC_ADDR_LENGTH]; // Addr1 - u8 SA[MAC_ADDR_LENGTH]; // Addr2 - u8 BSSID[MAC_ADDR_LENGTH]; // Addr3 - u16 Sequence_Control; - // Management Frame Body <= 325 bytes - // FCS 4 bytes -}__attribute__ ((packed)); - -// SW-MAC don't Tx/Rx Control-Frame, HW-MAC do it. -struct Control_Frame { - struct MAC_frame_control frame_control; // ToDS,FromDS,MoreFrag,Retry,MoreData,WEP,Order=0 - u16 duration; - u8 RA[MAC_ADDR_LENGTH]; - u8 TA[MAC_ADDR_LENGTH]; - u16 FCS; -}__attribute__ ((packed)); - -struct Data_Frame { - struct MAC_frame_control frame_control; - u16 duration; - u8 Addr1[MAC_ADDR_LENGTH]; - u8 Addr2[MAC_ADDR_LENGTH]; - u8 Addr3[MAC_ADDR_LENGTH]; - u16 Sequence_Control; - u8 Addr4[MAC_ADDR_LENGTH]; // only exist when ToDS=FromDS=1 - // Data Frame Body <= 2312 - // FCS -}__attribute__ ((packed)); - -struct Disassociation_Frame_Body -{ - u16 reasonCode; -}__attribute__ ((packed)); - -struct Association_Request_Frame_Body -{ - u16 capability_information; - u16 listenInterval; - u8 Current_AP_Address[MAC_ADDR_LENGTH];//for reassociation only - // SSID (2+32 bytes) - // Supported_Rates (2+8 bytes) -}__attribute__ ((packed)); - -struct Association_Response_Frame_Body -{ - u16 capability_information; - u16 statusCode; - u16 Association_ID; - struct Supported_Rates_Element supportedRates; -}__attribute__ ((packed)); - -/*struct Reassociation_Request_Frame_Body -{ - u16 capability_information; - u16 listenInterval; - u8 Current_AP_Address[MAC_ADDR_LENGTH]; - // SSID (2+32 bytes) - // Supported_Rates (2+8 bytes) -};*/ -// eliminated by WS 07/22/04 comboined with associateion request frame. - -struct Reassociation_Response_Frame_Body -{ - u16 capability_information; - u16 statusCode; - u16 Association_ID; - struct Supported_Rates_Element supportedRates; -}__attribute__ ((packed)); - -struct Deauthentication_Frame_Body -{ - u16 reasonCode; -}__attribute__ ((packed)); - - -struct Probe_Response_Frame_Body -{ - u16 Timestamp; - u16 Beacon_Interval; - u16 Capability_Information; - // SSID - // Supported_Rates - // PHY parameter Set (DS Parameters) - // CF parameter Set - // IBSS parameter Set -}__attribute__ ((packed)); - -struct Authentication_Frame_Body -{ - u16 algorithmNumber; - u16 sequenceNumber; - u16 statusCode; - // NB: don't include ChallengeText in this structure - // struct Challenge_Text_Element sChallengeTextElement; // wkchen added -}__attribute__ ((packed)); - - -#endif // _MAC_Structure_H_ - - +#endif /* _MAC_Structure_H_ */ diff --git a/drivers/staging/winbond/mds.c b/drivers/staging/winbond/mds.c index f1de813f9c7..aef0855f4c6 100644 --- a/drivers/staging/winbond/mds.c +++ b/drivers/staging/winbond/mds.c @@ -1,632 +1,650 @@ -#include "os_common.h" - -void -Mds_reset_descriptor(PADAPTER Adapter) -{ - PMDS pMds = &Adapter->Mds; - - pMds->TxPause = 0; - pMds->TxThreadCount = 0; - pMds->TxFillIndex = 0; - pMds->TxDesIndex = 0; - pMds->ScanTxPause = 0; - memset(pMds->TxOwner, 0, ((MAX_USB_TX_BUFFER_NUMBER + 3) & ~0x03)); -} +#include "mds_f.h" +#include "mto.h" +#include "wbhal.h" +#include "wb35tx_f.h" unsigned char -Mds_initial(PADAPTER Adapter) +Mds_initial(struct wbsoft_priv *adapter) { - PMDS pMds = &Adapter->Mds; + struct wb35_mds *pMds = &adapter->Mds; - pMds->TxPause = FALSE; + pMds->TxPause = false; pMds->TxRTSThreshold = DEFAULT_RTSThreshold; pMds->TxFragmentThreshold = DEFAULT_FRAGMENT_THRESHOLD; - vRxTimerInit(Adapter);//for WPA countermeasure - - return hal_get_tx_buffer( &Adapter->sHwData, &pMds->pTxBuffer ); + return hal_get_tx_buffer(&adapter->sHwData, &pMds->pTxBuffer); } -void -Mds_Destroy(PADAPTER Adapter) +static void Mds_DurationSet(struct wbsoft_priv *adapter, + struct wb35_descriptor *pDes, u8 *buffer) { - vRxTimerStop(Adapter); -} - -void -Mds_Tx(PADAPTER Adapter) -{ - phw_data_t pHwData = &Adapter->sHwData; - PMDS pMds = &Adapter->Mds; - DESCRIPTOR TxDes; - PDESCRIPTOR pTxDes = &TxDes; - u8 *XmitBufAddress; - u16 XmitBufSize, PacketSize, stmp, CurrentSize, FragmentThreshold; - u8 FillIndex, TxDesIndex, FragmentCount, FillCount; - unsigned char BufferFilled = FALSE, MICAdd = 0; + struct T00_descriptor *pT00; + struct T01_descriptor *pT01; + u16 Duration, NextBodyLen, OffsetSize; + u8 Rate, i; + unsigned char CTS_on = false, RTS_on = false; + struct T00_descriptor *pNextT00; + u16 BodyLen = 0; + unsigned char boGroupAddr = false; + OffsetSize = pDes->FragmentThreshold + 32 + 3; + OffsetSize &= ~0x03; + Rate = pDes->TxRate >> 1; + if (!Rate) + Rate = 1; - if (pMds->TxPause) - return; - if (!hal_driver_init_OK(pHwData)) - return; + pT00 = (struct T00_descriptor *)buffer; + pT01 = (struct T01_descriptor *)(buffer+4); + pNextT00 = (struct T00_descriptor *)(buffer+OffsetSize); + + if (buffer[DOT_11_DA_OFFSET+8] & 0x1) /* +8 for USB hdr */ + boGroupAddr = true; + + /****************************************** + * Set RTS/CTS mechanism + ******************************************/ + if (!boGroupAddr) { + /* NOTE : If the protection mode is enabled and the MSDU will + * be fragmented, the tx rates of MPDUs will all be DSSS + * rates. So it will not use CTS-to-self in this case. + * CTS-To-self will only be used when without + * fragmentation. -- 20050112 */ + BodyLen = (u16)pT00->T00_frame_length; /* include 802.11 header */ + BodyLen += 4; /* CRC */ + + if (BodyLen >= CURRENT_RTS_THRESHOLD) + RTS_on = true; /* Using RTS */ + else { + if (pT01->T01_modulation_type) { /* Is using OFDM */ + /* Is using protect */ + if (CURRENT_PROTECT_MECHANISM) + CTS_on = true; /* Using CTS */ + } + } + } - //Only one thread can be run here - if (!OS_ATOMIC_INC( Adapter, &pMds->TxThreadCount) == 1) - goto cleanup; + if (RTS_on || CTS_on) { + if (pT01->T01_modulation_type) { /* Is using OFDM */ + /* CTS duration + * 2 SIFS + DATA transmit time + 1 ACK + * ACK Rate : 24 Mega bps + * ACK frame length = 14 bytes */ + Duration = 2*DEFAULT_SIFSTIME + + 2*PREAMBLE_PLUS_SIGNAL_PLUS_SIGNALEXTENSION + + ((BodyLen*8 + 22 + Rate*4 - 1)/(Rate*4))*Tsym + + ((112 + 22 + 95)/96)*Tsym; + } else { /* DSSS */ + /* CTS duration + * 2 SIFS + DATA transmit time + 1 ACK + * Rate : ?? Mega bps + * ACK frame length = 14 bytes */ + if (pT01->T01_plcp_header_length) /* long preamble */ + Duration = LONG_PREAMBLE_PLUS_PLCPHEADER_TIME*2; + else + Duration = SHORT_PREAMBLE_PLUS_PLCPHEADER_TIME*2; - // Start to fill the data - do { - FillIndex = pMds->TxFillIndex; - if (pMds->TxOwner[FillIndex]) { // Is owned by software 0:Yes 1:No -#ifdef _PE_TX_DUMP_ - WBDEBUG(("[Mds_Tx] Tx Owner is H/W.\n")); -#endif - break; + Duration += (((BodyLen + 14)*8 + Rate-1) / Rate + + DEFAULT_SIFSTIME*2); } - XmitBufAddress = pMds->pTxBuffer + (MAX_USB_TX_BUFFER * FillIndex); //Get buffer - XmitBufSize = 0; - FillCount = 0; - do { - PacketSize = Adapter->sMlmeFrame.len; - if (!PacketSize) - break; + if (RTS_on) { + if (pT01->T01_modulation_type) { /* Is using OFDM */ + /* CTS + 1 SIFS + CTS duration + * CTS Rate : 24 Mega bps + * CTS frame length = 14 bytes */ + Duration += (DEFAULT_SIFSTIME + + PREAMBLE_PLUS_SIGNAL_PLUS_SIGNALEXTENSION + + ((112 + 22 + 95)/96)*Tsym); + } else { + /* CTS + 1 SIFS + CTS duration + * CTS Rate : ?? Mega bps + * CTS frame length = 14 bytes + */ + /* long preamble */ + if (pT01->T01_plcp_header_length) + Duration += LONG_PREAMBLE_PLUS_PLCPHEADER_TIME; + else + Duration += SHORT_PREAMBLE_PLUS_PLCPHEADER_TIME; - //For Check the buffer resource - FragmentThreshold = CURRENT_FRAGMENT_THRESHOLD; - //931130.5.b - FragmentCount = PacketSize/FragmentThreshold + 1; - stmp = PacketSize + FragmentCount*32 + 8;//931130.5.c 8:MIC - if ((XmitBufSize + stmp) >= MAX_USB_TX_BUFFER) { - printk("[Mds_Tx] Excess max tx buffer.\n"); - break; // buffer is not enough + Duration += (((112 + Rate-1) / Rate) + + DEFAULT_SIFSTIME); } + } + /* Set the value into USB descriptor */ + pT01->T01_add_rts = RTS_on ? 1 : 0; + pT01->T01_add_cts = CTS_on ? 1 : 0; + pT01->T01_rts_cts_duration = Duration; + } - // - // Start transmitting - // - BufferFilled = TRUE; - - /* Leaves first u8 intact */ - memset((u8 *)pTxDes + 1, 0, sizeof(DESCRIPTOR) - 1); - - TxDesIndex = pMds->TxDesIndex;//Get the current ID - pTxDes->Descriptor_ID = TxDesIndex; - pMds->TxDesFrom[ TxDesIndex ] = 2;//Storing the information of source comming from - pMds->TxDesIndex++; - pMds->TxDesIndex %= MAX_USB_TX_DESCRIPTOR; - - MLME_GetNextPacket( Adapter, pTxDes ); + /****************************************** + * Fill the more fragment descriptor + ******************************************/ + if (boGroupAddr) + Duration = 0; + else { + for (i = pDes->FragmentCount-1; i > 0; i--) { + NextBodyLen = (u16)pNextT00->T00_frame_length; + NextBodyLen += 4; /* CRC */ - // Copy header. 8byte USB + 24byte 802.11Hdr. Set TxRate, Preamble type - Mds_HeaderCopy( Adapter, pTxDes, XmitBufAddress ); + if (pT01->T01_modulation_type) { + /* OFDM + * data transmit time + 3 SIFS + 2 ACK + * Rate : ??Mega bps + * ACK frame length = 14 bytes, tx rate = 24M */ + Duration = PREAMBLE_PLUS_SIGNAL_PLUS_SIGNALEXTENSION * 3; + Duration += (((NextBodyLen*8 + 22 + Rate*4 - 1) + /(Rate*4)) * Tsym + + (((2*14)*8 + 22 + 95)/96)*Tsym + + DEFAULT_SIFSTIME*3); + } else { + /* DSSS + * data transmit time + 2 ACK + 3 SIFS + * Rate : ??Mega bps + * ACK frame length = 14 bytes + * TODO : */ + if (pT01->T01_plcp_header_length) /* long preamble */ + Duration = LONG_PREAMBLE_PLUS_PLCPHEADER_TIME*3; + else + Duration = SHORT_PREAMBLE_PLUS_PLCPHEADER_TIME*3; - // For speed up Key setting - if (pTxDes->EapFix) { -#ifdef _PE_TX_DUMP_ - WBDEBUG(("35: EPA 4th frame detected. Size = %d\n", PacketSize)); -#endif - pHwData->IsKeyPreSet = 1; + Duration += (((NextBodyLen + (2*14))*8 + + Rate-1) / Rate + + DEFAULT_SIFSTIME*3); } + /* 4 USHOR for skip 8B USB, 2USHORT=FC + Duration */ + ((u16 *)buffer)[5] = cpu_to_le16(Duration); - // Copy (fragment) frame body, and set USB, 802.11 hdr flag - CurrentSize = Mds_BodyCopy(Adapter, pTxDes, XmitBufAddress); - - // Set RTS/CTS and Normal duration field into buffer - Mds_DurationSet(Adapter, pTxDes, XmitBufAddress); + /* ----20061009 add by anson's endian */ + pNextT00->value = cpu_to_le32(pNextT00->value); + pT01->value = cpu_to_le32(pT01->value); + /* ----end 20061009 add by anson's endian */ - // - // Calculation MIC from buffer which maybe fragment, then fill into temporary address 8 byte - // 931130.5.e - if (MICAdd) - Mds_MicFill( Adapter, pTxDes, XmitBufAddress ); + buffer += OffsetSize; + pT01 = (struct T01_descriptor *)(buffer+4); + /* The last fragment will not have the next fragment */ + if (i != 1) + pNextT00 = (struct T00_descriptor *)(buffer+OffsetSize); + } - //Shift to the next address - XmitBufSize += CurrentSize; - XmitBufAddress += CurrentSize; + /******************************************* + * Fill the last fragment descriptor + *******************************************/ + if (pT01->T01_modulation_type) { + /* OFDM + * 1 SIFS + 1 ACK + * Rate : 24 Mega bps + * ACK frame length = 14 bytes */ + Duration = PREAMBLE_PLUS_SIGNAL_PLUS_SIGNALEXTENSION; + /* The Tx rate of ACK use 24M */ + Duration += (((112 + 22 + 95)/96)*Tsym + + DEFAULT_SIFSTIME); + } else { + /* DSSS + * 1 ACK + 1 SIFS + * Rate : ?? Mega bps + * ACK frame length = 14 bytes(112 bits) */ + if (pT01->T01_plcp_header_length) /* long preamble */ + Duration = LONG_PREAMBLE_PLUS_PLCPHEADER_TIME; + else + Duration = SHORT_PREAMBLE_PLUS_PLCPHEADER_TIME; -#ifdef _IBSS_BEACON_SEQ_STICK_ - if ((XmitBufAddress[ DOT_11_DA_OFFSET+8 ] & 0xfc) != MAC_SUBTYPE_MNGMNT_PROBE_REQUEST) // +8 for USB hdr -#endif - pMds->TxToggle = TRUE; + Duration += ((112 + Rate-1)/Rate + DEFAULT_SIFSTIME); + } + } - // Get packet to transmit completed, 1:TESTSTA 2:MLME 3: Ndis data - MLME_SendComplete(Adapter, 0, TRUE); + /* 4 USHOR for skip 8B USB, 2USHORT=FC + Duration */ + ((u16 *)buffer)[5] = cpu_to_le16(Duration); + pT00->value = cpu_to_le32(pT00->value); + pT01->value = cpu_to_le32(pT01->value); + /* --end 20061009 add */ - // Software TSC count 20060214 - pMds->TxTsc++; - if (pMds->TxTsc == 0) - pMds->TxTsc_2++; +} - FillCount++; // 20060928 - } while (HAL_USB_MODE_BURST(pHwData)); // End of multiple MSDU copy loop. FALSE = single TRUE = multiple sending +/* The function return the 4n size of usb pk */ +static u16 Mds_BodyCopy(struct wbsoft_priv *adapter, + struct wb35_descriptor *pDes, u8 *TargetBuffer) +{ + struct T00_descriptor *pT00; + struct wb35_mds *pMds = &adapter->Mds; + u8 *buffer; + u8 *src_buffer; + u8 *pctmp; + u16 Size = 0; + u16 SizeLeft, CopySize, CopyLeft, stmp; + u8 buf_index, FragmentCount = 0; - // Move to the next one, if necessary - if (BufferFilled) { - // size setting - pMds->TxBufferSize[ FillIndex ] = XmitBufSize; - // 20060928 set Tx count - pMds->TxCountInBuffer[FillIndex] = FillCount; + /* Copy fragment body */ + buffer = TargetBuffer; /* shift 8B usb + 24B 802.11 */ + SizeLeft = pDes->buffer_total_size; + buf_index = pDes->buffer_start_index; - // Set owner flag - pMds->TxOwner[FillIndex] = 1; + pT00 = (struct T00_descriptor *)buffer; + while (SizeLeft) { + pT00 = (struct T00_descriptor *)buffer; + CopySize = SizeLeft; + if (SizeLeft > pDes->FragmentThreshold) { + CopySize = pDes->FragmentThreshold; + /* Set USB length */ + pT00->T00_frame_length = 24 + CopySize; + } else /* Set USB length */ + pT00->T00_frame_length = 24 + SizeLeft; - pMds->TxFillIndex++; - pMds->TxFillIndex %= MAX_USB_TX_BUFFER_NUMBER; - BufferFilled = FALSE; - } else - break; + SizeLeft -= CopySize; - if (!PacketSize) // No more pk for transmitting - break; + /* 1 Byte operation */ + pctmp = (u8 *)(buffer + 8 + DOT_11_SEQUENCE_OFFSET); + *pctmp &= 0xf0; + *pctmp |= FragmentCount; /* 931130.5.m */ + if (!FragmentCount) + pT00->T00_first_mpdu = 1; - } while(TRUE); + buffer += 32; /* 8B usb + 24B 802.11 header */ + Size += 32; - // - // Start to send by lower module - // - if (!pHwData->IsKeyPreSet) - Wb35Tx_start(pHwData); + /* Copy into buffer */ + stmp = CopySize + 3; + stmp &= ~0x03; /* 4n Alignment */ + Size += stmp; /* Current 4n offset of mpdu */ - cleanup: - OS_ATOMIC_DEC( Adapter, &pMds->TxThreadCount ); -} + while (CopySize) { + /* Copy body */ + src_buffer = pDes->buffer_address[buf_index]; + CopyLeft = CopySize; + if (CopySize >= pDes->buffer_size[buf_index]) { + CopyLeft = pDes->buffer_size[buf_index]; -void -Mds_SendComplete(PADAPTER Adapter, PT02_DESCRIPTOR pT02) -{ - PMDS pMds = &Adapter->Mds; - phw_data_t pHwData = &Adapter->sHwData; - u8 PacketId = (u8)pT02->T02_Tx_PktID; - unsigned char SendOK = TRUE; - u8 RetryCount, TxRate; + /* Get the next buffer of descriptor */ + buf_index++; + buf_index %= MAX_DESCRIPTOR_BUFFER_INDEX; + } else { + u8 *pctmp = pDes->buffer_address[buf_index]; + pctmp += CopySize; + pDes->buffer_address[buf_index] = pctmp; + pDes->buffer_size[buf_index] -= CopySize; + } - if (pT02->T02_IgnoreResult) // Don't care the result - return; - if (pT02->T02_IsLastMpdu) { - //TODO: DTO -- get the retry count and fragment count - // Tx rate - TxRate = pMds->TxRate[ PacketId ][ 0 ]; - RetryCount = (u8)pT02->T02_MPDU_Cnt; - if (pT02->value & FLAG_ERROR_TX_MASK) { - SendOK = FALSE; + memcpy(buffer, src_buffer, CopyLeft); + buffer += CopyLeft; + CopySize -= CopyLeft; + } - if (pT02->T02_transmit_abort || pT02->T02_out_of_MaxTxMSDULiftTime) { - //retry error - pHwData->dto_tx_retry_count += (RetryCount+1); - //[for tx debug] - if (RetryCount<7) - pHwData->tx_retry_count[RetryCount] += RetryCount; - else - pHwData->tx_retry_count[7] += RetryCount; - #ifdef _PE_STATE_DUMP_ - WBDEBUG(("dto_tx_retry_count =%d\n", pHwData->dto_tx_retry_count)); - #endif - MTO_SetTxCount(Adapter, TxRate, RetryCount); + /* 931130.5.n */ + if (pMds->MicAdd) { + if (!SizeLeft) { + pMds->MicWriteAddress[pMds->MicWriteIndex] = + buffer - pMds->MicAdd; + pMds->MicWriteSize[pMds->MicWriteIndex] = + pMds->MicAdd; + pMds->MicAdd = 0; + } else if (SizeLeft < 8) { /* 931130.5.p */ + pMds->MicAdd = SizeLeft; + pMds->MicWriteAddress[pMds->MicWriteIndex] = + buffer - (8 - SizeLeft); + pMds->MicWriteSize[pMds->MicWriteIndex] = + 8 - SizeLeft; + pMds->MicWriteIndex++; } - pHwData->dto_tx_frag_count += (RetryCount+1); + } - //[for tx debug] - if (pT02->T02_transmit_abort_due_to_TBTT) - pHwData->tx_TBTT_start_count++; - if (pT02->T02_transmit_without_encryption_due_to_wep_on_false) - pHwData->tx_WepOn_false_count++; - if (pT02->T02_discard_due_to_null_wep_key) - pHwData->tx_Null_key_count++; - } else { - if (pT02->T02_effective_transmission_rate) - pHwData->tx_ETR_count++; - MTO_SetTxCount(Adapter, TxRate, RetryCount); + /* Does it need to generate the new header for next mpdu? */ + if (SizeLeft) { + /* Get the next 4n start address */ + buffer = TargetBuffer + Size; + /* Copy 8B USB +24B 802.11 */ + memcpy(buffer, TargetBuffer, 32); + pT00 = (struct T00_descriptor *)buffer; + pT00->T00_first_mpdu = 0; } - // Clear send result buffer - pMds->TxResult[ PacketId ] = 0; - } else - pMds->TxResult[ PacketId ] |= ((u16)(pT02->value & 0x0ffff)); + FragmentCount++; + } + + pT00->T00_last_mpdu = 1; + pT00->T00_IsLastMpdu = 1; + buffer = (u8 *)pT00 + 8; /* +8 for USB hdr */ + buffer[1] &= ~0x04; /* Clear more frag bit of 802.11 frame control */ + /* Update the correct fragment number */ + pDes->FragmentCount = FragmentCount; + return Size; } -void -Mds_HeaderCopy(PADAPTER Adapter, PDESCRIPTOR pDes, u8 *TargetBuffer) +static void Mds_HeaderCopy(struct wbsoft_priv *adapter, + struct wb35_descriptor *pDes, u8 *TargetBuffer) { - PMDS pMds = &Adapter->Mds; - u8 *src_buffer = pDes->buffer_address[0];//931130.5.g - PT00_DESCRIPTOR pT00; - PT01_DESCRIPTOR pT01; + struct wb35_mds *pMds = &adapter->Mds; + u8 *src_buffer = pDes->buffer_address[0]; /* 931130.5.g */ + struct T00_descriptor *pT00; + struct T01_descriptor *pT01; u16 stmp; u8 i, ctmp1, ctmp2, ctmpf; u16 FragmentThreshold = CURRENT_FRAGMENT_THRESHOLD; stmp = pDes->buffer_total_size; - // - // Set USB header 8 byte - // - pT00 = (PT00_DESCRIPTOR)TargetBuffer; + /* + * Set USB header 8 byte + */ + pT00 = (struct T00_descriptor *)TargetBuffer; TargetBuffer += 4; - pT01 = (PT01_DESCRIPTOR)TargetBuffer; + pT01 = (struct T01_descriptor *)TargetBuffer; TargetBuffer += 4; - pT00->value = 0;// Clear - pT01->value = 0;// Clear + pT00->value = 0; /* Clear */ + pT01->value = 0; /* Clear */ - pT00->T00_tx_packet_id = pDes->Descriptor_ID;// Set packet ID - pT00->T00_header_length = 24;// Set header length - pT01->T01_retry_abort_ebable = 1;//921013 931130.5.h + pT00->T00_tx_packet_id = pDes->Descriptor_ID; /* Set packet ID */ + pT00->T00_header_length = 24; /* Set header length */ + pT01->T01_retry_abort_enable = 1; /* 921013 931130.5.h */ - // Key ID setup + /* Key ID setup */ pT01->T01_wep_id = 0; - FragmentThreshold = DEFAULT_FRAGMENT_THRESHOLD; //Do not fragment - // Copy full data, the 1'st buffer contain all the data 931130.5.j - memcpy( TargetBuffer, src_buffer, DOT_11_MAC_HEADER_SIZE );// Copy header + FragmentThreshold = DEFAULT_FRAGMENT_THRESHOLD; /* Do not fragment */ + /* Copy full data, the 1'st buffer contain all the data 931130.5.j */ + /* Copy header */ + memcpy(TargetBuffer, src_buffer, DOT_11_MAC_HEADER_SIZE); pDes->buffer_address[0] = src_buffer + DOT_11_MAC_HEADER_SIZE; pDes->buffer_total_size -= DOT_11_MAC_HEADER_SIZE; pDes->buffer_size[0] = pDes->buffer_total_size; - // Set fragment threshold + /* Set fragment threshold */ FragmentThreshold -= (DOT_11_MAC_HEADER_SIZE + 4); pDes->FragmentThreshold = FragmentThreshold; - // Set more frag bit - TargetBuffer[1] |= 0x04;// Set more frag bit + /* Set more frag bit */ + TargetBuffer[1] |= 0x04; /* Set more frag bit */ - // - // Set tx rate - // - stmp = *(u16 *)(TargetBuffer+30); // 2n alignment address + /* + * Set tx rate + */ + stmp = *(u16 *)(TargetBuffer+30); /* 2n alignment address */ - //Use basic rate + /* Use basic rate */ ctmp1 = ctmpf = CURRENT_TX_RATE_FOR_MNG; pDes->TxRate = ctmp1; - #ifdef _PE_TX_DUMP_ - WBDEBUG(("Tx rate =%x\n", ctmp1)); - #endif + pr_debug("Tx rate =%x\n", ctmp1); pT01->T01_modulation_type = (ctmp1%3) ? 0 : 1; - for( i=0; i<2; i++ ) { - if( i == 1 ) + for (i = 0; i < 2; i++) { + if (i == 1) ctmp1 = ctmpf; + /* backup the ta rate and fall back rate */ + pMds->TxRate[pDes->Descriptor_ID][i] = ctmp1; + + if (ctmp1 == 108) + ctmp2 = 7; + else if (ctmp1 == 96) + ctmp2 = 6; /* Rate convert for USB */ + else if (ctmp1 == 72) + ctmp2 = 5; + else if (ctmp1 == 48) + ctmp2 = 4; + else if (ctmp1 == 36) + ctmp2 = 3; + else if (ctmp1 == 24) + ctmp2 = 2; + else if (ctmp1 == 18) + ctmp2 = 1; + else if (ctmp1 == 12) + ctmp2 = 0; + else if (ctmp1 == 22) + ctmp2 = 3; + else if (ctmp1 == 11) + ctmp2 = 2; + else if (ctmp1 == 4) + ctmp2 = 1; + else + ctmp2 = 0; /* if( ctmp1 == 2 ) or default */ - pMds->TxRate[pDes->Descriptor_ID][i] = ctmp1; // backup the ta rate and fall back rate - - if( ctmp1 == 108) ctmp2 = 7; - else if( ctmp1 == 96 ) ctmp2 = 6; // Rate convert for USB - else if( ctmp1 == 72 ) ctmp2 = 5; - else if( ctmp1 == 48 ) ctmp2 = 4; - else if( ctmp1 == 36 ) ctmp2 = 3; - else if( ctmp1 == 24 ) ctmp2 = 2; - else if( ctmp1 == 18 ) ctmp2 = 1; - else if( ctmp1 == 12 ) ctmp2 = 0; - else if( ctmp1 == 22 ) ctmp2 = 3; - else if( ctmp1 == 11 ) ctmp2 = 2; - else if( ctmp1 == 4 ) ctmp2 = 1; - else ctmp2 = 0; // if( ctmp1 == 2 ) or default - - if( i == 0 ) + if (i == 0) pT01->T01_transmit_rate = ctmp2; else pT01->T01_fall_back_rate = ctmp2; } - // - // Set preamble type - // - if ((pT01->T01_modulation_type == 0) && (pT01->T01_transmit_rate == 0)) // RATE_1M + /* + * Set preamble type + */ + /* RATE_1M */ + if ((pT01->T01_modulation_type == 0) && (pT01->T01_transmit_rate == 0)) pDes->PreambleMode = WLAN_PREAMBLE_TYPE_LONG; else pDes->PreambleMode = CURRENT_PREAMBLE_MODE; - pT01->T01_plcp_header_length = pDes->PreambleMode; // Set preamble + pT01->T01_plcp_header_length = pDes->PreambleMode; /* Set preamble */ } -// The function return the 4n size of usb pk -u16 -Mds_BodyCopy(PADAPTER Adapter, PDESCRIPTOR pDes, u8 *TargetBuffer) +static void MLME_GetNextPacket(struct wbsoft_priv *adapter, + struct wb35_descriptor *desc) { - PT00_DESCRIPTOR pT00; - PMDS pMds = &Adapter->Mds; - u8 *buffer; - u8 *src_buffer; - u8 *pctmp; - u16 Size = 0; - u16 SizeLeft, CopySize, CopyLeft, stmp; - u8 buf_index, FragmentCount = 0; - - - // Copy fragment body - buffer = TargetBuffer; // shift 8B usb + 24B 802.11 - SizeLeft = pDes->buffer_total_size; - buf_index = pDes->buffer_start_index; + desc->InternalUsed = desc->buffer_start_index + desc->buffer_number; + desc->InternalUsed %= MAX_DESCRIPTOR_BUFFER_INDEX; + desc->buffer_address[desc->InternalUsed] = adapter->sMlmeFrame.pMMPDU; + desc->buffer_size[desc->InternalUsed] = adapter->sMlmeFrame.len; + desc->buffer_total_size += adapter->sMlmeFrame.len; + desc->buffer_number++; + desc->Type = adapter->sMlmeFrame.data_type; +} - pT00 = (PT00_DESCRIPTOR)buffer; - while (SizeLeft) { - pT00 = (PT00_DESCRIPTOR)buffer; - CopySize = SizeLeft; - if (SizeLeft > pDes->FragmentThreshold) { - CopySize = pDes->FragmentThreshold; - pT00->T00_frame_length = 24 + CopySize;//Set USB length - } else - pT00->T00_frame_length = 24 + SizeLeft;//Set USB length +static void MLMEfreeMMPDUBuffer(struct wbsoft_priv *adapter, s8 *pData) +{ + int i; - SizeLeft -= CopySize; + /* Reclaim the data buffer */ + for (i = 0; i < MAX_NUM_TX_MMPDU; i++) { + if (pData == (s8 *)&(adapter->sMlmeFrame.TxMMPDU[i])) + break; + } + if (adapter->sMlmeFrame.TxMMPDUInUse[i]) + adapter->sMlmeFrame.TxMMPDUInUse[i] = false; + else { + /* Something wrong + PD43 Add debug code here??? */ + } +} - // 1 Byte operation - pctmp = (u8 *)( buffer + 8 + DOT_11_SEQUENCE_OFFSET ); - *pctmp &= 0xf0; - *pctmp |= FragmentCount;//931130.5.m - if( !FragmentCount ) - pT00->T00_first_mpdu = 1; +static void MLME_SendComplete(struct wbsoft_priv *adapter, u8 PacketID, + unsigned char SendOK) +{ + /* Reclaim the data buffer */ + adapter->sMlmeFrame.len = 0; + MLMEfreeMMPDUBuffer(adapter, adapter->sMlmeFrame.pMMPDU); - buffer += 32; // 8B usb + 24B 802.11 header - Size += 32; + /* Return resource */ + adapter->sMlmeFrame.is_in_used = PACKET_FREE_TO_USE; +} - // Copy into buffer - stmp = CopySize + 3; - stmp &= ~0x03;//4n Alignment - Size += stmp;// Current 4n offset of mpdu +void +Mds_Tx(struct wbsoft_priv *adapter) +{ + struct hw_data *pHwData = &adapter->sHwData; + struct wb35_mds *pMds = &adapter->Mds; + struct wb35_descriptor TxDes; + struct wb35_descriptor *pTxDes = &TxDes; + u8 *XmitBufAddress; + u16 XmitBufSize, PacketSize, stmp, CurrentSize, FragmentThreshold; + u8 FillIndex, TxDesIndex, FragmentCount, FillCount; + unsigned char BufferFilled = false; - while (CopySize) { - // Copy body - src_buffer = pDes->buffer_address[buf_index]; - CopyLeft = CopySize; - if (CopySize >= pDes->buffer_size[buf_index]) { - CopyLeft = pDes->buffer_size[buf_index]; - // Get the next buffer of descriptor - buf_index++; - buf_index %= MAX_DESCRIPTOR_BUFFER_INDEX; - } else { - u8 *pctmp = pDes->buffer_address[buf_index]; - pctmp += CopySize; - pDes->buffer_address[buf_index] = pctmp; - pDes->buffer_size[buf_index] -= CopySize; - } + if (pMds->TxPause) + return; + if (!hal_driver_init_OK(pHwData)) + return; - memcpy(buffer, src_buffer, CopyLeft); - buffer += CopyLeft; - CopySize -= CopyLeft; - } + /* Only one thread can be run here */ + if (atomic_inc_return(&pMds->TxThreadCount) != 1) + goto cleanup; - // 931130.5.n - if (pMds->MicAdd) { - if (!SizeLeft) { - pMds->MicWriteAddress[ pMds->MicWriteIndex ] = buffer - pMds->MicAdd; - pMds->MicWriteSize[ pMds->MicWriteIndex ] = pMds->MicAdd; - pMds->MicAdd = 0; - } - else if( SizeLeft < 8 ) //931130.5.p - { - pMds->MicAdd = SizeLeft; - pMds->MicWriteAddress[ pMds->MicWriteIndex ] = buffer - ( 8 - SizeLeft ); - pMds->MicWriteSize[ pMds->MicWriteIndex ] = 8 - SizeLeft; - pMds->MicWriteIndex++; - } + /* Start to fill the data */ + do { + FillIndex = pMds->TxFillIndex; + /* Is owned by software 0:Yes 1:No */ + if (pMds->TxOwner[FillIndex]) { + pr_debug("[Mds_Tx] Tx Owner is H/W.\n"); + break; } - // Does it need to generate the new header for next mpdu? - if (SizeLeft) { - buffer = TargetBuffer + Size; // Get the next 4n start address - memcpy( buffer, TargetBuffer, 32 );//Copy 8B USB +24B 802.11 - pT00 = (PT00_DESCRIPTOR)buffer; - pT00->T00_first_mpdu = 0; - } + /* Get buffer */ + XmitBufAddress = pMds->pTxBuffer + (MAX_USB_TX_BUFFER * FillIndex); + XmitBufSize = 0; + FillCount = 0; + do { + PacketSize = adapter->sMlmeFrame.len; + if (!PacketSize) + break; - FragmentCount++; - } + /* For Check the buffer resource */ + FragmentThreshold = CURRENT_FRAGMENT_THRESHOLD; + /* 931130.5.b */ + FragmentCount = PacketSize/FragmentThreshold + 1; + /* 931130.5.c 8:MIC */ + stmp = PacketSize + FragmentCount*32 + 8; + if ((XmitBufSize + stmp) >= MAX_USB_TX_BUFFER) + break; /* buffer is not enough */ - pT00->T00_last_mpdu = 1; - pT00->T00_IsLastMpdu = 1; - buffer = (u8 *)pT00 + 8; // +8 for USB hdr - buffer[1] &= ~0x04; // Clear more frag bit of 802.11 frame control - pDes->FragmentCount = FragmentCount; // Update the correct fragment number - return Size; -} + /* + * Start transmitting + */ + BufferFilled = true; + /* Leaves first u8 intact */ + memset((u8 *)pTxDes + 1, 0, sizeof(struct wb35_descriptor) - 1); -void -Mds_DurationSet( PADAPTER Adapter, PDESCRIPTOR pDes, u8 *buffer ) -{ - PT00_DESCRIPTOR pT00; - PT01_DESCRIPTOR pT01; - u16 Duration, NextBodyLen, OffsetSize; - u8 Rate, i; - unsigned char CTS_on = FALSE, RTS_on = FALSE; - PT00_DESCRIPTOR pNextT00; - u16 BodyLen = 0; - unsigned char boGroupAddr = FALSE; + TxDesIndex = pMds->TxDesIndex; /* Get the current ID */ + pTxDes->Descriptor_ID = TxDesIndex; + /* Storing the information of source coming from */ + pMds->TxDesFrom[TxDesIndex] = 2; + pMds->TxDesIndex++; + pMds->TxDesIndex %= MAX_USB_TX_DESCRIPTOR; + MLME_GetNextPacket(adapter, pTxDes); - OffsetSize = pDes->FragmentThreshold + 32 + 3; - OffsetSize &= ~0x03; - Rate = pDes->TxRate >> 1; - if (!Rate) - Rate = 1; + /* + * Copy header. 8byte USB + 24byte 802.11Hdr. + * Set TxRate, Preamble type + */ + Mds_HeaderCopy(adapter, pTxDes, XmitBufAddress); - pT00 = (PT00_DESCRIPTOR)buffer; - pT01 = (PT01_DESCRIPTOR)(buffer+4); - pNextT00 = (PT00_DESCRIPTOR)(buffer+OffsetSize); - - if( buffer[ DOT_11_DA_OFFSET+8 ] & 0x1 ) // +8 for USB hdr - boGroupAddr = TRUE; - - //======================================== - // Set RTS/CTS mechanism - //======================================== - if (!boGroupAddr) - { - //NOTE : If the protection mode is enabled and the MSDU will be fragmented, - // the tx rates of MPDUs will all be DSSS rates. So it will not use - // CTS-to-self in this case. CTS-To-self will only be used when without - // fragmentation. -- 20050112 - BodyLen = (u16)pT00->T00_frame_length; //include 802.11 header - BodyLen += 4; //CRC - - if( BodyLen >= CURRENT_RTS_THRESHOLD ) - RTS_on = TRUE; // Using RTS - else - { - if( pT01->T01_modulation_type ) // Is using OFDM - { - if( CURRENT_PROTECT_MECHANISM ) // Is using protect - CTS_on = TRUE; // Using CTS + /* For speed up Key setting */ + if (pTxDes->EapFix) { + pr_debug("35: EPA 4th frame detected. Size = %d\n", + PacketSize); + pHwData->IsKeyPreSet = 1; } - } - } - if( RTS_on || CTS_on ) - { - if( pT01->T01_modulation_type) // Is using OFDM - { - //CTS duration - // 2 SIFS + DATA transmit time + 1 ACK - // ACK Rate : 24 Mega bps - // ACK frame length = 14 bytes - Duration = 2*DEFAULT_SIFSTIME + - 2*PREAMBLE_PLUS_SIGNAL_PLUS_SIGNALEXTENSION + - ((BodyLen*8 + 22 + Rate*4 - 1)/(Rate*4))*Tsym + - ((112 + 22 + 95)/96)*Tsym; - } - else //DSSS - { - //CTS duration - // 2 SIFS + DATA transmit time + 1 ACK - // Rate : ?? Mega bps - // ACK frame length = 14 bytes - if( pT01->T01_plcp_header_length ) //long preamble - Duration = LONG_PREAMBLE_PLUS_PLCPHEADER_TIME*2; - else - Duration = SHORT_PREAMBLE_PLUS_PLCPHEADER_TIME*2; + /* Copy (fragment) frame body, and set USB, 802.11 hdr flag */ + CurrentSize = Mds_BodyCopy(adapter, pTxDes, XmitBufAddress); - Duration += ( ((BodyLen + 14)*8 + Rate-1) / Rate + - DEFAULT_SIFSTIME*2 ); - } + /* Set RTS/CTS and Normal duration field into buffer */ + Mds_DurationSet(adapter, pTxDes, XmitBufAddress); - if( RTS_on ) - { - if( pT01->T01_modulation_type ) // Is using OFDM - { - //CTS + 1 SIFS + CTS duration - //CTS Rate : 24 Mega bps - //CTS frame length = 14 bytes - Duration += (DEFAULT_SIFSTIME + - PREAMBLE_PLUS_SIGNAL_PLUS_SIGNALEXTENSION + - ((112 + 22 + 95)/96)*Tsym); - } - else - { - //CTS + 1 SIFS + CTS duration - //CTS Rate : ?? Mega bps - //CTS frame length = 14 bytes - if( pT01->T01_plcp_header_length ) //long preamble - Duration += LONG_PREAMBLE_PLUS_PLCPHEADER_TIME; - else - Duration += SHORT_PREAMBLE_PLUS_PLCPHEADER_TIME; + /* Shift to the next address */ + XmitBufSize += CurrentSize; + XmitBufAddress += CurrentSize; - Duration += ( ((112 + Rate-1) / Rate) + DEFAULT_SIFSTIME ); - } - } + /* Get packet to transmit completed, + * 1:TESTSTA 2:MLME 3: Ndis data + */ + MLME_SendComplete(adapter, 0, true); - // Set the value into USB descriptor - pT01->T01_add_rts = RTS_on ? 1 : 0; - pT01->T01_add_cts = CTS_on ? 1 : 0; - pT01->T01_rts_cts_duration = Duration; - } + /* Software TSC count 20060214 */ + pMds->TxTsc++; + if (pMds->TxTsc == 0) + pMds->TxTsc_2++; - //===================================== - // Fill the more fragment descriptor - //===================================== - if( boGroupAddr ) - Duration = 0; - else - { - for( i=pDes->FragmentCount-1; i>0; i-- ) - { - NextBodyLen = (u16)pNextT00->T00_frame_length; - NextBodyLen += 4; //CRC - - if( pT01->T01_modulation_type ) - { - //OFDM - // data transmit time + 3 SIFS + 2 ACK - // Rate : ??Mega bps - // ACK frame length = 14 bytes, tx rate = 24M - Duration = PREAMBLE_PLUS_SIGNAL_PLUS_SIGNALEXTENSION * 3; - Duration += (((NextBodyLen*8 + 22 + Rate*4 - 1)/(Rate*4)) * Tsym + - (((2*14)*8 + 22 + 95)/96)*Tsym + - DEFAULT_SIFSTIME*3); - } - else - { - //DSSS - // data transmit time + 2 ACK + 3 SIFS - // Rate : ??Mega bps - // ACK frame length = 14 bytes - //TODO : - if( pT01->T01_plcp_header_length ) //long preamble - Duration = LONG_PREAMBLE_PLUS_PLCPHEADER_TIME*3; - else - Duration = SHORT_PREAMBLE_PLUS_PLCPHEADER_TIME*3; + FillCount++; /* 20060928 */ + /* + * End of multiple MSDU copy loop. + * false = single + * true = multiple sending + */ + } while (HAL_USB_MODE_BURST(pHwData)); - Duration += ( ((NextBodyLen + (2*14))*8 + Rate-1) / Rate + - DEFAULT_SIFSTIME*3 ); - } + /* Move to the next one, if necessary */ + if (BufferFilled) { + /* size setting */ + pMds->TxBufferSize[FillIndex] = XmitBufSize; - ((u16 *)buffer)[5] = cpu_to_le16(Duration);// 4 USHOR for skip 8B USB, 2USHORT=FC + Duration + /* 20060928 set Tx count */ + pMds->TxCountInBuffer[FillIndex] = FillCount; - //----20061009 add by anson's endian - pNextT00->value = cpu_to_le32(pNextT00->value); - pT01->value = cpu_to_le32( pT01->value ); - //----end 20061009 add by anson's endian + /* Set owner flag */ + pMds->TxOwner[FillIndex] = 1; - buffer += OffsetSize; - pT01 = (PT01_DESCRIPTOR)(buffer+4); - if (i != 1) //The last fragment will not have the next fragment - pNextT00 = (PT00_DESCRIPTOR)(buffer+OffsetSize); - } + pMds->TxFillIndex++; + pMds->TxFillIndex %= MAX_USB_TX_BUFFER_NUMBER; + BufferFilled = false; + } else + break; - //===================================== - // Fill the last fragment descriptor - //===================================== - if( pT01->T01_modulation_type ) - { - //OFDM - // 1 SIFS + 1 ACK - // Rate : 24 Mega bps - // ACK frame length = 14 bytes - Duration = PREAMBLE_PLUS_SIGNAL_PLUS_SIGNALEXTENSION; - //The Tx rate of ACK use 24M - Duration += (((112 + 22 + 95)/96)*Tsym + DEFAULT_SIFSTIME ); - } - else - { - // DSSS - // 1 ACK + 1 SIFS - // Rate : ?? Mega bps - // ACK frame length = 14 bytes(112 bits) - if( pT01->T01_plcp_header_length ) //long preamble - Duration = LONG_PREAMBLE_PLUS_PLCPHEADER_TIME; - else - Duration = SHORT_PREAMBLE_PLUS_PLCPHEADER_TIME; + if (!PacketSize) /* No more pk for transmitting */ + break; - Duration += ( (112 + Rate-1)/Rate + DEFAULT_SIFSTIME ); - } - } + } while (true); - ((u16 *)buffer)[5] = cpu_to_le16(Duration);// 4 USHOR for skip 8B USB, 2USHORT=FC + Duration - pT00->value = cpu_to_le32(pT00->value); - pT01->value = cpu_to_le32(pT01->value); - //--end 20061009 add + /* + * Start to send by lower module + */ + if (!pHwData->IsKeyPreSet) + Wb35Tx_start(adapter); +cleanup: + atomic_dec(&pMds->TxThreadCount); } -void MDS_EthernetPacketReceive( PADAPTER Adapter, PRXLAYER1 pRxLayer1 ) +void +Mds_SendComplete(struct wbsoft_priv *adapter, struct T02_descriptor *pT02) { - OS_RECEIVE_PACKET_INDICATE( Adapter, pRxLayer1 ); -} + struct wb35_mds *pMds = &adapter->Mds; + struct hw_data *pHwData = &adapter->sHwData; + u8 PacketId = (u8)pT02->T02_Tx_PktID; + unsigned char SendOK = true; + u8 RetryCount, TxRate; + if (pT02->T02_IgnoreResult) /* Don't care about the result */ + return; + if (pT02->T02_IsLastMpdu) { + /* TODO: DTO -- get the retry count and fragment count */ + /* Tx rate */ + TxRate = pMds->TxRate[PacketId][0]; + RetryCount = (u8)pT02->T02_MPDU_Cnt; + if (pT02->value & FLAG_ERROR_TX_MASK) { + SendOK = false; + if (pT02->T02_transmit_abort || pT02->T02_out_of_MaxTxMSDULiftTime) { + /* retry error */ + pHwData->dto_tx_retry_count += (RetryCount+1); + /* [for tx debug] */ + if (RetryCount < 7) + pHwData->tx_retry_count[RetryCount] += RetryCount; + else + pHwData->tx_retry_count[7] += RetryCount; + pr_debug("dto_tx_retry_count =%d\n", + pHwData->dto_tx_retry_count); + MTO_SetTxCount(adapter, TxRate, RetryCount); + } + pHwData->dto_tx_frag_count += (RetryCount+1); + + /* [for tx debug] */ + if (pT02->T02_transmit_abort_due_to_TBTT) + pHwData->tx_TBTT_start_count++; + if (pT02->T02_transmit_without_encryption_due_to_wep_on_false) + pHwData->tx_WepOn_false_count++; + if (pT02->T02_discard_due_to_null_wep_key) + pHwData->tx_Null_key_count++; + } else { + if (pT02->T02_effective_transmission_rate) + pHwData->tx_ETR_count++; + MTO_SetTxCount(adapter, TxRate, RetryCount); + } + + /* Clear send result buffer */ + pMds->TxResult[PacketId] = 0; + } else + pMds->TxResult[PacketId] |= ((u16)(pT02->value & 0x0ffff)); +} diff --git a/drivers/staging/winbond/mds_f.h b/drivers/staging/winbond/mds_f.h index 7a682d4cfbd..159b2eb366e 100644 --- a/drivers/staging/winbond/mds_f.h +++ b/drivers/staging/winbond/mds_f.h @@ -1,33 +1,22 @@ -unsigned char Mds_initial( PADAPTER Adapter ); -void Mds_Destroy( PADAPTER Adapter ); -void Mds_Tx( PADAPTER Adapter ); -void Mds_HeaderCopy( PADAPTER Adapter, PDESCRIPTOR pDes, u8 *TargetBuffer ); -u16 Mds_BodyCopy( PADAPTER Adapter, PDESCRIPTOR pDes, u8 *TargetBuffer ); -void Mds_DurationSet( PADAPTER Adapter, PDESCRIPTOR pDes, u8 *TargetBuffer ); -void Mds_SendComplete( PADAPTER Adapter, PT02_DESCRIPTOR pT02 ); -void Mds_MpduProcess( PADAPTER Adapter, PDESCRIPTOR pRxDes ); -void Mds_reset_descriptor( PADAPTER Adapter ); -extern void DataDmp(u8 *pdata, u32 len, u32 offset); +#ifndef __WINBOND_MDS_F_H +#define __WINBOND_MDS_F_H +#include "wbhal.h" +#include "core.h" -void vRxTimerInit(PWB32_ADAPTER Adapter); -void vRxTimerStart(PWB32_ADAPTER Adapter, int timeout_value); -void RxTimerHandler_1a( PADAPTER Adapter); -void vRxTimerStop(PWB32_ADAPTER Adapter); -void RxTimerHandler( void* SystemSpecific1, - PWB32_ADAPTER Adapter, - void* SystemSpecific2, - void* SystemSpecific3); - - -// For Asynchronous indicating. The routine collocates with USB. -void Mds_MsduProcess( PWB32_ADAPTER Adapter, PRXLAYER1 pRxLayer1, u8 SlotIndex); - -// For data frame sending 20060802 -u16 MDS_GetPacketSize( PADAPTER Adapter ); -void MDS_GetNextPacket( PADAPTER Adapter, PDESCRIPTOR pDes ); -void MDS_GetNextPacketComplete( PADAPTER Adapter, PDESCRIPTOR pDes ); -void MDS_SendResult( PADAPTER Adapter, u8 PacketId, unsigned char SendOK ); -void MDS_EthernetPacketReceive( PADAPTER Adapter, PRXLAYER1 pRxLayer1 ); +unsigned char Mds_initial(struct wbsoft_priv *adapter); +void Mds_Tx(struct wbsoft_priv *adapter); +void Mds_SendComplete(struct wbsoft_priv *adapter, struct T02_descriptor *pt02); +void Mds_MpduProcess(struct wbsoft_priv *adapter, + struct wb35_descriptor *prxdes); +/* For data frame sending */ +u16 MDS_GetPacketSize(struct wbsoft_priv *adapter); +void MDS_GetNextPacket(struct wbsoft_priv *adapter, + struct wb35_descriptor *pdes); +void MDS_GetNextPacketComplete(struct wbsoft_priv *adapter, + struct wb35_descriptor *pdes); +void MDS_SendResult(struct wbsoft_priv *adapter, u8 packetid, + unsigned char sendok); +#endif diff --git a/drivers/staging/winbond/mds_s.h b/drivers/staging/winbond/mds_s.h index 9df2e0936bf..2972d66c943 100644 --- a/drivers/staging/winbond/mds_s.h +++ b/drivers/staging/winbond/mds_s.h @@ -1,183 +1,130 @@ -//////////////////////////////////////////////////////////////////////////////////////////////////////// -#define MAX_USB_TX_DESCRIPTOR 15 // IS89C35 ability -#define MAX_USB_TX_BUFFER_NUMBER 4 // Virtual pre-buffer number of MAX_USB_TX_BUFFER -#define MAX_USB_TX_BUFFER 4096 // IS89C35 ability 4n alignment is required for hardware - -#define MDS_EVENT_INDICATE( _A, _B, _F ) OS_EVENT_INDICATE( _A, _B, _F ) -#define AUTH_REQUEST_PAIRWISE_ERROR 0 // _F flag setting -#define AUTH_REQUEST_GROUP_ERROR 1 // _F flag setting - -// For variable setting -#define CURRENT_BSS_TYPE psBSS(psLOCAL->wConnectedSTAindex)->bBssType -#define CURRENT_WEP_MODE psSME->_dot11PrivacyInvoked -#define CURRENT_BSSID psBSS(psLOCAL->wConnectedSTAindex)->abBssID -#define CURRENT_DESIRED_WPA_ENABLE ((psSME->bDesiredAuthMode==WPA_AUTH)||(psSME->bDesiredAuthMode==WPAPSK_AUTH)) -#ifdef _WPA2_ -#define CURRENT_DESIRED_WPA2_ENABLE ((psSME->bDesiredAuthMode==WPA2_AUTH)||(psSME->bDesiredAuthMode==WPA2PSK_AUTH)) -#endif //end def _WPA2_ -#define CURRENT_PAIRWISE_KEY_OK psSME->pairwise_key_ok -//[20040712 WS] -#define CURRENT_GROUP_KEY_OK psSME->group_key_ok -#define CURRENT_PAIRWISE_KEY psSME->tx_mic_key -#define CURRENT_GROUP_KEY psSME->group_tx_mic_key -#define CURRENT_ENCRYPT_STATUS psSME->encrypt_status -#define CURRENT_WEP_ID Adapter->sSmePara._dot11WEPDefaultKeyID -#define CURRENT_CONTROL_PORT_BLOCK ( psSME->wpa_ok!=1 || (Adapter->Mds.boCounterMeasureBlock==1 && (CURRENT_ENCRYPT_STATUS==ENCRYPT_TKIP)) ) -#define CURRENT_FRAGMENT_THRESHOLD (Adapter->Mds.TxFragmentThreshold & ~0x1) -#define CURRENT_PREAMBLE_MODE psLOCAL->boShortPreamble?WLAN_PREAMBLE_TYPE_SHORT:WLAN_PREAMBLE_TYPE_LONG -#define CURRENT_LINK_ON OS_LINK_STATUS -#define CURRENT_TX_RATE Adapter->sLocalPara.CurrentTxRate -#define CURRENT_FALL_BACK_TX_RATE Adapter->sLocalPara.CurrentTxFallbackRate -#define CURRENT_TX_RATE_FOR_MNG Adapter->sLocalPara.CurrentTxRateForMng -#define CURRENT_PROTECT_MECHANISM psLOCAL->boProtectMechanism -#define CURRENT_RTS_THRESHOLD Adapter->Mds.TxRTSThreshold - -#define MIB_GS_XMIT_OK_INC Adapter->sLocalPara.GS_XMIT_OK++ -#define MIB_GS_RCV_OK_INC Adapter->sLocalPara.GS_RCV_OK++ -#define MIB_GS_XMIT_ERROR_INC Adapter->sLocalPara.GS_XMIT_ERROR - -//---------- TX ----------------------------------- -#define ETHERNET_TX_DESCRIPTORS MAX_USB_TX_BUFFER_NUMBER - -//---------- RX ------------------------------------ -#define ETHERNET_RX_DESCRIPTORS 8 //It's not necessary to allocate more than 2 in sync indicate - -//================================================================ -// Configration default value -//================================================================ -#define DEFAULT_MULTICASTLISTMAX 32 // standard -#define DEFAULT_TX_BURSTLENGTH 3 // 32 Longwords -#define DEFAULT_RX_BURSTLENGTH 3 // 32 Longwords -#define DEFAULT_TX_THRESHOLD 0 // Full Packet -#define DEFAULT_RX_THRESHOLD 0 // Full Packet -#define DEFAULT_MAXTXRATE 6 // 11 Mbps (Long) -#define DEFAULT_CHANNEL 3 // Chennel 3 -#define DEFAULT_RTSThreshold 2347 // Disable RTS -//#define DEFAULT_PME 1 // Enable -#define DEFAULT_PME 0 // Disable -#define DEFAULT_SIFSTIME 10 -#define DEFAULT_ACKTIME_1ML 304 // 148+44+112 911220 by LCC -#define DEFAULT_ACKTIME_2ML 248 // 148+44+56 911220 by LCC -#define DEFAULT_FRAGMENT_THRESHOLD 2346 // No fragment -#define DEFAULT_PREAMBLE_LENGTH 72 -#define DEFAULT_PLCPHEADERTIME_LENGTH 24 - -/*------------------------------------------------------------------------ - 0.96 sec since time unit of the R03 for the current, W89C32 is about 60ns - instead of 960 ns. This shall be fixed in the future W89C32 - -------------------------------------------------------------------------*/ -#define DEFAULT_MAX_RECEIVE_TIME 16440000 - -#define RX_BUF_SIZE 2352 // 600 // For 301 must be multiple of 8 -#define MAX_RX_DESCRIPTORS 18 // Rx Layer 2 -#define MAX_BUFFER_QUEUE 8 // The value is always equal 8 due to NDIS_PACKET's MiniportReserved field size - - -// For brand-new rx system -#define MDS_ID_IGNORE ETHERNET_RX_DESCRIPTORS - -// For Tx Packet status classify -#define PACKET_FREE_TO_USE 0 -#define PACKET_COME_FROM_NDIS 0x08 -#define PACKET_COME_FROM_MLME 0x80 -#define PACKET_SEND_COMPLETE 0xff - -typedef struct _MDS -{ - // For Tx usage - u8 TxOwner[ ((MAX_USB_TX_BUFFER_NUMBER + 3) & ~0x03) ]; - u8 *pTxBuffer; - u16 TxBufferSize[ ((MAX_USB_TX_BUFFER_NUMBER + 1) & ~0x01) ]; - u8 TxDesFrom[ ((MAX_USB_TX_DESCRIPTOR + 3) & ~0x03) ];//931130.4.u // 1: MLME 2: NDIS control 3: NDIS data - u8 TxCountInBuffer[ ((MAX_USB_TX_DESCRIPTOR + 3) & ~0x03) ]; // 20060928 +#ifndef __WINBOND_MDS_H +#define __WINBOND_MDS_H - u8 TxFillIndex;//the next index of TxBuffer can be used - u8 TxDesIndex;//The next index of TxDes can be used - u8 ScanTxPause; //data Tx pause because the scanning is progressing, but probe request Tx won't. - u8 TxPause;//For pause the Mds_Tx modult +#include <linux/timer.h> +#include <linux/types.h> +#include <linux/atomic.h> - OS_ATOMIC TxThreadCount;//For thread counting 931130.4.v -//950301 delete due to HW -// OS_ATOMIC TxConcurrentCount;//931130.4.w +#include "localpara.h" +#include "mac_structures.h" - u16 TxResult[ ((MAX_USB_TX_DESCRIPTOR + 1) & ~0x01) ];//Collect the sending result of Mpdu +/* Preamble_Type, see <SFS-802.11G-MIB-203> */ +enum { + WLAN_PREAMBLE_TYPE_SHORT, + WLAN_PREAMBLE_TYPE_LONG, +}; - u8 MicRedundant[8]; // For tmp use - u8 *MicWriteAddress[2]; //The start address to fill the Mic, use 2 point due to Mic maybe fragment +/*****************************************************************************/ +#define MAX_USB_TX_DESCRIPTOR 15 /* IS89C35 ability */ +#define MAX_USB_TX_BUFFER_NUMBER 4 /* Virtual pre-buffer number of MAX_USB_TX_BUFFER */ +#define MAX_USB_TX_BUFFER 4096 /* IS89C35 ability 4n alignment is required for hardware */ - u16 MicWriteSize[2]; //931130.4.x +#define AUTH_REQUEST_PAIRWISE_ERROR 0 /* _F flag setting */ +#define AUTH_REQUEST_GROUP_ERROR 1 /* _F flag setting */ - u16 MicAdd; // If want to add the Mic, this variable equal to 8 - u16 MicWriteIndex;//The number of MicWriteAddress 931130.4.y +#define CURRENT_FRAGMENT_THRESHOLD (adapter->Mds.TxFragmentThreshold & ~0x1) +#define CURRENT_PREAMBLE_MODE (psLOCAL->boShortPreamble ? WLAN_PREAMBLE_TYPE_SHORT : WLAN_PREAMBLE_TYPE_LONG) +#define CURRENT_TX_RATE_FOR_MNG (adapter->sLocalPara.CurrentTxRateForMng) +#define CURRENT_PROTECT_MECHANISM (psLOCAL->boProtectMechanism) +#define CURRENT_RTS_THRESHOLD (adapter->Mds.TxRTSThreshold) - u8 TxRate[ ((MAX_USB_TX_DESCRIPTOR+1)&~0x01) ][2]; // [0] current tx rate, [1] fall back rate - u8 TxInfo[ ((MAX_USB_TX_DESCRIPTOR+1)&~0x01) ]; //Store information for callback function +#define MIB_GS_XMIT_OK_INC (adapter->sLocalPara.GS_XMIT_OK++) +#define MIB_GS_RCV_OK_INC (adapter->sLocalPara.GS_RCV_OK++) +#define MIB_GS_XMIT_ERROR_INC (adapter->sLocalPara.GS_XMIT_ERROR) - //WKCHEN added for scanning mechanism - u8 TxToggle; //It is TRUE if there are tx activities in some time interval - u8 Reserved_[3]; - - //---------- for Tx Parameter - u16 TxFragmentThreshold; // For frame body only - u16 TxRTSThreshold; - - u32 MaxReceiveTime;//911220.3 Add - - // depend on OS, - u32 MulticastListNo; - u32 PacketFilter; // Setting by NDIS, the current packet filter in use. - u8 MulticastAddressesArray[DEFAULT_MULTICASTLISTMAX][MAC_ADDR_LENGTH]; - - //COUNTERMEASURE - u8 bMICfailCount; - u8 boCounterMeasureBlock; - u8 reserved_4[2]; +/* ---------- TX ----------------------------------- */ +#define ETHERNET_TX_DESCRIPTORS MAX_USB_TX_BUFFER_NUMBER - //NDIS_MINIPORT_TIMER nTimer; - OS_TIMER nTimer; +/* ---------- RX ----------------------------------- */ +#define ETHERNET_RX_DESCRIPTORS 8 /* It's not necessary to allocate more than 2 in sync indicate */ + +/* + * ================================================================ + * Configuration default value + * ================================================================ + */ +#define DEFAULT_MULTICASTLISTMAX 32 /* standard */ +#define DEFAULT_TX_BURSTLENGTH 3 /* 32 Longwords */ +#define DEFAULT_RX_BURSTLENGTH 3 /* 32 Longwords */ +#define DEFAULT_TX_THRESHOLD 0 /* Full Packet */ +#define DEFAULT_RX_THRESHOLD 0 /* Full Packet */ +#define DEFAULT_MAXTXRATE 6 /* 11 Mbps (Long) */ +#define DEFAULT_CHANNEL 3 /* Chennel 3 */ +#define DEFAULT_RTSThreshold 2347 /* Disable RTS */ +#define DEFAULT_PME 0 /* Disable */ +#define DEFAULT_SIFSTIME 10 +#define DEFAULT_ACKTIME_1ML 304 /* 148 + 44 + 112 */ +#define DEFAULT_ACKTIME_2ML 248 /* 148 + 44 + 56 */ +#define DEFAULT_FRAGMENT_THRESHOLD 2346 /* No fragment */ +#define DEFAULT_PREAMBLE_LENGTH 72 +#define DEFAULT_PLCPHEADERTIME_LENGTH 24 - u32 TxTsc; // 20060214 - u32 TxTsc_2; // 20060214 +/* + * ------------------------------------------------------------------------ + * 0.96 sec since time unit of the R03 for the current, W89C32 is about 60ns + * instead of 960 ns. This shall be fixed in the future W89C32 + * ------------------------------------------------------------------------- + */ +#define DEFAULT_MAX_RECEIVE_TIME 16440000 + +#define RX_BUF_SIZE 2352 /* 600 - For 301 must be multiple of 8 */ +#define MAX_RX_DESCRIPTORS 18 /* Rx Layer 2 */ + +/* For brand-new rx system */ +#define MDS_ID_IGNORE ETHERNET_RX_DESCRIPTORS + +/* For Tx Packet status classify */ +#define PACKET_FREE_TO_USE 0 +#define PACKET_COME_FROM_NDIS 0x08 +#define PACKET_COME_FROM_MLME 0x80 +#define PACKET_SEND_COMPLETE 0xff + +struct wb35_mds { + /* For Tx usage */ + u8 TxOwner[((MAX_USB_TX_BUFFER_NUMBER + 3) & ~0x03)]; + u8 *pTxBuffer; + u16 TxBufferSize[((MAX_USB_TX_BUFFER_NUMBER + 1) & ~0x01)]; + u8 TxDesFrom[((MAX_USB_TX_DESCRIPTOR + 3) & ~0x03)];/* 1: MLME 2: NDIS control 3: NDIS data */ + u8 TxCountInBuffer[((MAX_USB_TX_DESCRIPTOR + 3) & ~0x03)]; -} MDS, *PMDS; + u8 TxFillIndex; /* the next index of TxBuffer can be used */ + u8 TxDesIndex; /* The next index of TxDes can be used */ + u8 ScanTxPause; /* data Tx pause because the scanning is progressing, but probe request Tx won't. */ + u8 TxPause; /*For pause the Mds_Tx modult */ + atomic_t TxThreadCount; /* For thread counting */ -typedef struct _RxBuffer -{ - u8 * pBufferAddress; // Pointer the received data buffer. - u16 BufferSize; - u8 RESERVED; - u8 BufferIndex;// Only 1 byte -} RXBUFFER, *PRXBUFFER; + u16 TxResult[((MAX_USB_TX_DESCRIPTOR + 1) & ~0x01)];/* Collect the sending result of Mpdu */ -// -// Reveive Layer 1 Format. -//---------------------------- -typedef struct _RXLAYER1 -{ - u16 SequenceNumber; // The sequence number of the last received packet. - u16 BufferTotalSize; + u8 MicRedundant[8]; /* For tmp use */ + u8 *MicWriteAddress[2]; /* The start address to fill the Mic, use 2 point due to Mic maybe fragment */ - u32 InUsed; - u32 DecryptionMethod; // The desired defragment number of the next incoming packet. + u16 MicWriteSize[2]; - u8 DeFragmentNumber; - u8 FrameType; - u8 TypeEncapsulated; - u8 BufferNumber; + u16 MicAdd; /* If want to add the Mic, this variable equal to 8 */ + u16 MicWriteIndex; /* The number of MicWriteAddress */ - u32 FirstFrameArrivedTime; + u8 TxRate[((MAX_USB_TX_DESCRIPTOR + 1) & ~0x01)][2]; /* [0] current tx rate, [1] fall back rate */ + u8 TxInfo[((MAX_USB_TX_DESCRIPTOR + 1) & ~0x01)]; /*Store information for callback function */ - RXBUFFER BufferQueue[ MAX_BUFFER_QUEUE ]; + /* ---- for Tx Parameter */ + u16 TxFragmentThreshold; /* For frame body only */ + u16 TxRTSThreshold; - u8 LastFrameType; // 20061004 for fix intel 3945 's bug - u8 RESERVED[3]; //@@ anson + u32 MaxReceiveTime; - ///////////////////////////////////////////////////////////////////////////////////////////// - // For brand-new Rx system - u8 ReservedBuffer[ 2400 ];//If Buffer ID is reserved one, it must copy the data into this area - u8 *ReservedBufferPoint;// Point to the next availabe address of reserved buffer + /* depend on OS, */ + u32 MulticastListNo; + u32 PacketFilter; /* Setting by NDIS, the current packet filter in use. */ + u8 MulticastAddressesArray[DEFAULT_MULTICASTLISTMAX][MAC_ADDR_LENGTH]; -}RXLAYER1, * PRXLAYER1; + /* COUNTERMEASURE */ + u8 bMICfailCount; + u8 boCounterMeasureBlock; + u8 reserved_4[2]; + u32 TxTsc; + u32 TxTsc_2; +}; +#endif diff --git a/drivers/staging/winbond/mlme_mib.h b/drivers/staging/winbond/mlme_mib.h deleted file mode 100644 index 89759739cba..00000000000 --- a/drivers/staging/winbond/mlme_mib.h +++ /dev/null @@ -1,84 +0,0 @@ -//============================================================================ -// MLMEMIB.H - -// -// Description: -// Get and Set some of MLME MIB attributes. -// -// Revision history: -// -------------------------------------------------------------------------- -// 20030117 PD43 Austin Liu -// Initial release -// -// Copyright (c) 2003 Winbond Electronics Corp. All rights reserved. -//============================================================================ - -#ifndef _MLME_MIB_H -#define _MLME_MIB_H - -//============================================================================ -// MLMESetExcludeUnencrypted -- -// -// Description: -// Set the dot11ExcludeUnencrypted value. -// -// Arguments: -// Adapter - The pointer to the miniport adapter context. -// ExUnencrypted - unsigned char type. The value to be set. -// -// Return values: -// None. -//============================================================================ -#define MLMESetExcludeUnencrypted(Adapter, ExUnencrypted) \ -{ \ - (Adapter)->sLocalPara.ExcludeUnencrypted = ExUnencrypted; \ -} - -//============================================================================ -// MLMEGetExcludeUnencrypted -- -// -// Description: -// Get the dot11ExcludeUnencrypted value. -// -// Arguments: -// Adapter - The pointer to the miniport adapter context. -// -// Return values: -// unsigned char type. The current dot11ExcludeUnencrypted value. -//============================================================================ -#define MLMEGetExcludeUnencrypted(Adapter) ((unsigned char) (Adapter)->sLocalPara.ExcludeUnencrypted) - -//============================================================================ -// MLMESetMaxReceiveLifeTime -- -// -// Description: -// Set the dot11MaxReceiveLifeTime value. -// -// Arguments: -// Adapter - The pointer to the miniport adapter context. -// ReceiveLifeTime- u32 type. The value to be set. -// -// Return values: -// None. -//============================================================================ -#define MLMESetMaxReceiveLifeTime(Adapter, ReceiveLifeTime) \ -{ \ - (Adapter)->Mds.MaxReceiveTime = ReceiveLifeTime; \ -} - -//============================================================================ -// MLMESetMaxReceiveLifeTime -- -// -// Description: -// Get the dot11MaxReceiveLifeTime value. -// -// Arguments: -// Adapter - The pointer to the miniport adapter context. -// -// Return values: -// u32 type. The current dot11MaxReceiveLifeTime value. -//============================================================================ -#define MLMEGetMaxReceiveLifeTime(Adapter) ((u32) (Adapter)->Mds.MaxReceiveTime) - -#endif - - diff --git a/drivers/staging/winbond/mlme_s.h b/drivers/staging/winbond/mlme_s.h deleted file mode 100644 index 039fd408ba6..00000000000 --- a/drivers/staging/winbond/mlme_s.h +++ /dev/null @@ -1,195 +0,0 @@ -//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -// Mlme.h -// Define the related definitions of MLME module -// history -- 01/14/03' created -// -//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - -#define AUTH_REJECT_REASON_CHALLENGE_FAIL 1 - -//====== the state of MLME module -#define INACTIVE 0x0 -#define IDLE_SCAN 0x1 - -//====== the state of MLME/ESS module -#define STATE_1 0x2 -#define AUTH_REQ 0x3 -#define AUTH_WEP 0x4 -#define STATE_2 0x5 -#define ASSOC_REQ 0x6 -#define STATE_3 0x7 - -//====== the state of MLME/IBSS module -#define IBSS_JOIN_SYNC 0x8 -#define IBSS_AUTH_REQ 0x9 -#define IBSS_AUTH_CHANLGE 0xa -#define IBSS_AUTH_WEP 0xb -#define IBSS_AUTH_IND 0xc -#define IBSS_STATE_2 0xd - - - -//========================================= -//depend on D5C(MAC timing control 03 register): MaxTxMSDULifeTime default 0x80000us -#define AUTH_FAIL_TIMEOUT 550 -#define ASSOC_FAIL_TIMEOUT 550 -#define REASSOC_FAIL_TIMEOUT 550 - - - -// -// MLME task global CONSTANTS, STRUCTURE, variables -// - - -///////////////////////////////////////////////////////////// -// enum_ResultCode -- -// Result code returned from MLME to SME. -// -///////////////////////////////////////////////////////////// -// PD43 20030829 Modifiled -//#define SUCCESS 0 -#define MLME_SUCCESS 0 //follow spec. -#define INVALID_PARAMETERS 1 //Not following spec. -#define NOT_SUPPPORTED 2 -#define TIMEOUT 3 -#define TOO_MANY_SIMULTANEOUS_REQUESTS 4 -#define REFUSED 5 -#define BSS_ALREADY_STARTED_OR_JOINED 6 -#define TRANSMIT_FRAME_FAIL 7 -#define NO_BSS_FOUND 8 -#define RETRY 9 -#define GIVE_UP 10 - - -#define OPEN_AUTH 0 -#define SHARE_AUTH 1 -#define ANY_AUTH 2 -#define WPA_AUTH 3 //for WPA -#define WPAPSK_AUTH 4 -#define WPANONE_AUTH 5 -///////////////////////////////////////////// added by ws 04/19/04 -#ifdef _WPA2_ -#define WPA2_AUTH 6//for WPA2 -#define WPA2PSK_AUTH 7 -#endif //end def _WPA2_ - -////////////////////////////////////////////////////////////////// -//define the msg type of MLME module -////////////////////////////////////////////////////////////////// -//-------------------------------------------------------- -//from SME - -#define MLMEMSG_AUTH_REQ 0x0b -#define MLMEMSG_DEAUTH_REQ 0x0c -#define MLMEMSG_ASSOC_REQ 0x0d -#define MLMEMSG_REASSOC_REQ 0x0e -#define MLMEMSG_DISASSOC_REQ 0x0f -#define MLMEMSG_START_IBSS_REQ 0x10 -#define MLMEMSG_IBSS_NET_CFM 0x11 - -//from RX : -#define MLMEMSG_RCV_MLMEFRAME 0x20 -#define MLMEMSG_RCV_ASSOCRSP 0x22 -#define MLMEMSG_RCV_REASSOCRSP 0x24 -#define MLMEMSG_RCV_DISASSOC 0x2b -#define MLMEMSG_RCV_AUTH 0x2c -#define MLMEMSG_RCV_DEAUTH 0x2d - - -//from TX callback -#define MLMEMSG_TX_CALLBACK 0x40 -#define MLMEMSG_ASSOCREQ_CALLBACK 0x41 -#define MLMEMSG_REASSOCREQ_CALLBACK 0x43 -#define MLMEMSG_DISASSOC_CALLBACK 0x4a -#define MLMEMSG_AUTH_CALLBACK 0x4c -#define MLMEMSG_DEAUTH_CALLBACK 0x4d - -//#define MLMEMSG_JOIN_FAIL 4 -//#define MLMEMSG_AUTHEN_FAIL 18 -#define MLMEMSG_TIMEOUT 0x50 - -/////////////////////////////////////////////////////////////////////////// -//Global data structures -#define MAX_NUM_TX_MMPDU 2 -#define MAX_MMPDU_SIZE 1512 -#define MAX_NUM_RX_MMPDU 6 - - -/////////////////////////////////////////////////////////////////////////// -//MACRO -#define boMLME_InactiveState(_AA_) (_AA_->wState==INACTIVE) -#define boMLME_IdleScanState(_BB_) (_BB_->wState==IDLE_SCAN) -#define boMLME_FoundSTAinfo(_CC_) (_CC_->wState>=IDLE_SCAN) - -typedef struct _MLME_FRAME -{ - //NDIS_PACKET MLME_Packet; - s8 * pMMPDU; - u16 len; - u8 DataType; - u8 IsInUsed; - - spinlock_t MLMESpinLock; - - u8 TxMMPDU[MAX_NUM_TX_MMPDU][MAX_MMPDU_SIZE]; - u8 TxMMPDUInUse[ (MAX_NUM_TX_MMPDU+3) & ~0x03 ]; - - u16 wNumTxMMPDU; - u16 wNumTxMMPDUDiscarded; - - u8 RxMMPDU[MAX_NUM_RX_MMPDU][MAX_MMPDU_SIZE]; - u8 SaveRxBufSlotInUse[ (MAX_NUM_RX_MMPDU+3) & ~0x03 ]; - - u16 wNumRxMMPDU; - u16 wNumRxMMPDUDiscarded; - - u16 wNumRxMMPDUInMLME; // Number of the Rx MMPDU - u16 reserved_1; // in MLME. - // excluding the discarded -} MLME_FRAME, *psMLME_FRAME; - -typedef struct _AUTHREQ { - - u8 peerMACaddr[MAC_ADDR_LENGTH]; - u16 wAuthAlgorithm; - -} MLME_AUTHREQ_PARA, *psMLME_AUTHREQ_PARA; - -struct _Reason_Code { - - u8 peerMACaddr[MAC_ADDR_LENGTH]; - u16 wReasonCode; -}; -typedef struct _Reason_Code MLME_DEAUTHREQ_PARA, *psMLME_DEAUTHREQ_PARA; -typedef struct _Reason_Code MLME_DISASSOCREQ_PARA, *psMLME_DISASSOCREQ_PARA; - -typedef struct _ASSOCREQ { - u8 PeerSTAAddr[MAC_ADDR_LENGTH]; - u16 CapabilityInfo; - u16 ListenInterval; - -}__attribute__ ((packed)) MLME_ASSOCREQ_PARA, *psMLME_ASSOCREQ_PARA; - -typedef struct _REASSOCREQ { - u8 NewAPAddr[MAC_ADDR_LENGTH]; - u16 CapabilityInfo; - u16 ListenInterval; - -}__attribute__ ((packed)) MLME_REASSOCREQ_PARA, *psMLME_REASSOCREQ_PARA; - -typedef struct _MLMECALLBACK { - - u8 *psFramePtr; - u8 bResult; - -} MLME_TXCALLBACK, *psMLME_TXCALLBACK; - -typedef struct _RXDATA -{ - s32 FrameLength; - u8 __attribute__ ((packed)) *pbFramePtr; - -}__attribute__ ((packed)) RXDATA, *psRXDATA; - - diff --git a/drivers/staging/winbond/mlmetxrx.c b/drivers/staging/winbond/mlmetxrx.c deleted file mode 100644 index e8533b8d197..00000000000 --- a/drivers/staging/winbond/mlmetxrx.c +++ /dev/null @@ -1,150 +0,0 @@ -//============================================================================ -// Module Name: -// MLMETxRx.C -// -// Description: -// The interface between MDS (MAC Data Service) and MLME. -// -// Revision History: -// -------------------------------------------------------------------------- -// 200209 UN20 Jennifer Xu -// Initial Release -// 20021108 PD43 Austin Liu -// 20030117 PD43 Austin Liu -// Deleted MLMEReturnPacket and MLMEProcThread() -// -// Copyright (c) 1996-2002 Winbond Electronics Corp. All Rights Reserved. -//============================================================================ -#include "os_common.h" - -void MLMEResetTxRx(PWB32_ADAPTER Adapter) -{ - s32 i; - - // Reset the interface between MDS and MLME - for (i = 0; i < MAX_NUM_TX_MMPDU; i++) - Adapter->sMlmeFrame.TxMMPDUInUse[i] = FALSE; - for (i = 0; i < MAX_NUM_RX_MMPDU; i++) - Adapter->sMlmeFrame.SaveRxBufSlotInUse[i] = FALSE; - - Adapter->sMlmeFrame.wNumRxMMPDUInMLME = 0; - Adapter->sMlmeFrame.wNumRxMMPDUDiscarded = 0; - Adapter->sMlmeFrame.wNumRxMMPDU = 0; - Adapter->sMlmeFrame.wNumTxMMPDUDiscarded = 0; - Adapter->sMlmeFrame.wNumTxMMPDU = 0; - Adapter->sLocalPara.boCCAbusy = FALSE; - Adapter->sLocalPara.iPowerSaveMode = PWR_ACTIVE; // Power active -} - -//============================================================================= -// Function: -// MLMEGetMMPDUBuffer() -// -// Description: -// Return the pointer to an available data buffer with -// the size MAX_MMPDU_SIZE for a MMPDU. -// -// Arguments: -// Adapter - pointer to the miniport adapter context. -// -// Return value: -// NULL : No available data buffer available -// Otherwise: Pointer to the data buffer -//============================================================================= - -/* FIXME: Should this just be replaced with kmalloc() and kfree()? */ -u8 *MLMEGetMMPDUBuffer(PWB32_ADAPTER Adapter) -{ - s32 i; - u8 *returnVal; - - for (i = 0; i< MAX_NUM_TX_MMPDU; i++) { - if (Adapter->sMlmeFrame.TxMMPDUInUse[i] == FALSE) - break; - } - if (i >= MAX_NUM_TX_MMPDU) return NULL; - - returnVal = (u8 *)&(Adapter->sMlmeFrame.TxMMPDU[i]); - Adapter->sMlmeFrame.TxMMPDUInUse[i] = TRUE; - - return returnVal; -} - -//============================================================================= -u8 MLMESendFrame(PWB32_ADAPTER Adapter, u8 *pMMPDU, u16 len, u8 DataType) -/* DataType : FRAME_TYPE_802_11_MANAGEMENT, FRAME_TYPE_802_11_MANAGEMENT_CHALLENGE, - FRAME_TYPE_802_11_DATA */ -{ - if (Adapter->sMlmeFrame.IsInUsed != PACKET_FREE_TO_USE) { - Adapter->sMlmeFrame.wNumTxMMPDUDiscarded++; - return FALSE; - } - Adapter->sMlmeFrame.IsInUsed = PACKET_COME_FROM_MLME; - - // Keep information for sending - Adapter->sMlmeFrame.pMMPDU = pMMPDU; - Adapter->sMlmeFrame.DataType = DataType; - // len must be the last setting due to QUERY_SIZE_SECOND of Mds - Adapter->sMlmeFrame.len = len; - Adapter->sMlmeFrame.wNumTxMMPDU++; - - // H/W will enter power save by set the register. S/W don't send null frame - //with PWRMgt bit enbled to enter power save now. - - // Transmit NDIS packet - Mds_Tx(Adapter); - return TRUE; -} - -void -MLME_GetNextPacket(PADAPTER Adapter, PDESCRIPTOR pDes) -{ -#define DESCRIPTOR_ADD_BUFFER( _D, _A, _S ) \ -{\ - _D->InternalUsed = _D->buffer_start_index + _D->buffer_number; \ - _D->InternalUsed %= MAX_DESCRIPTOR_BUFFER_INDEX; \ - _D->buffer_address[ _D->InternalUsed ] = _A; \ - _D->buffer_size[ _D->InternalUsed ] = _S; \ - _D->buffer_total_size += _S; \ - _D->buffer_number++;\ -} - - DESCRIPTOR_ADD_BUFFER( pDes, Adapter->sMlmeFrame.pMMPDU, Adapter->sMlmeFrame.len ); - pDes->Type = Adapter->sMlmeFrame.DataType; -} - -void MLMEfreeMMPDUBuffer(PWB32_ADAPTER Adapter, s8 *pData) -{ - int i; - - // Reclaim the data buffer - for (i = 0; i < MAX_NUM_TX_MMPDU; i++) { - if (pData == (s8 *)&(Adapter->sMlmeFrame.TxMMPDU[i])) - break; - } - if (Adapter->sMlmeFrame.TxMMPDUInUse[i]) - Adapter->sMlmeFrame.TxMMPDUInUse[i] = FALSE; - else { - // Something wrong - // PD43 Add debug code here??? - } -} - -void -MLME_SendComplete(PADAPTER Adapter, u8 PacketID, unsigned char SendOK) -{ - MLME_TXCALLBACK TxCallback; - - // Reclaim the data buffer - Adapter->sMlmeFrame.len = 0; - MLMEfreeMMPDUBuffer( Adapter, Adapter->sMlmeFrame.pMMPDU ); - - - TxCallback.bResult = MLME_SUCCESS; - - // Return resource - Adapter->sMlmeFrame.IsInUsed = PACKET_FREE_TO_USE; -} - - - diff --git a/drivers/staging/winbond/mlmetxrx_f.h b/drivers/staging/winbond/mlmetxrx_f.h deleted file mode 100644 index 24cd5f308d9..00000000000 --- a/drivers/staging/winbond/mlmetxrx_f.h +++ /dev/null @@ -1,52 +0,0 @@ -//================================================================ -// MLMETxRx.H -- -// -// Functions defined in MLMETxRx.c. -// -// Copyright (c) 2002 Winbond Electrics Corp. All Rights Reserved. -//================================================================ -#ifndef _MLMETXRX_H -#define _MLMETXRX_H - -void -MLMEProcThread( - PWB32_ADAPTER Adapter - ); - -void MLMEResetTxRx( PWB32_ADAPTER Adapter); - -u8 * -MLMEGetMMPDUBuffer( - PWB32_ADAPTER Adapter - ); - -void MLMEfreeMMPDUBuffer( PWB32_ADAPTER Adapter, s8 * pData); - -void MLME_GetNextPacket( PADAPTER Adapter, PDESCRIPTOR pDes ); -u8 MLMESendFrame( PWB32_ADAPTER Adapter, - u8 *pMMPDU, - u16 len, - u8 DataType); - -void -MLME_SendComplete( PWB32_ADAPTER Adapter, u8 PacketID, unsigned char SendOK ); - -void -MLMERcvFrame( - PWB32_ADAPTER Adapter, - PRXBUFFER pRxBufferArray, - u8 NumOfBuffer, - u8 ReturnSlotIndex - ); - -void -MLMEReturnPacket( - PWB32_ADAPTER Adapter, - u8 * pRxBufer - ); -#ifdef _IBSS_BEACON_SEQ_STICK_ -s8 SendBCNullData(PWB32_ADAPTER Adapter, u16 wIdx); -#endif - -#endif - diff --git a/drivers/staging/winbond/mto.c b/drivers/staging/winbond/mto.c index 2ef60e5120c..b031ecd4f3c 100644 --- a/drivers/staging/winbond/mto.c +++ b/drivers/staging/winbond/mto.c @@ -1,1229 +1,167 @@ -//============================================================================ -// MTO.C - -// -// Description: -// MAC Throughput Optimization for W89C33 802.11g WLAN STA. -// -// The following MIB attributes or internal variables will be affected -// while the MTO is being executed: -// dot11FragmentationThreshold, -// dot11RTSThreshold, -// transmission rate and PLCP preamble type, -// CCA mode, -// antenna diversity. -// -// Revision history: -// -------------------------------------------------------------------------- -// 20031227 UN20 Pete Chao -// First draft -// 20031229 Turbo copy from PD43 -// 20040210 Kevin revised -// Copyright (c) 2003 Winbond Electronics Corp. All rights reserved. -//============================================================================ - -// LA20040210_DTO kevin -#include "os_common.h" - -// Declare SQ3 to rate and fragmentation threshold table -// Declare fragmentation thresholds table -#define MTO_MAX_SQ3_LEVELS 14 -#define MTO_MAX_FRAG_TH_LEVELS 5 -#define MTO_MAX_DATA_RATE_LEVELS 12 - -u16 MTO_Frag_Th_Tbl[MTO_MAX_FRAG_TH_LEVELS] = -{ - 256, 384, 512, 768, 1536 +/* + * ============================================================================ + * MTO.C - + * + * Description: + * MAC Throughput Optimization for W89C33 802.11g WLAN STA. + * + * The following MIB attributes or internal variables will be affected + * while the MTO is being executed: + * dot11FragmentationThreshold, + * dot11RTSThreshold, + * transmission rate and PLCP preamble type, + * CCA mode, + * antenna diversity. + * + * Copyright (c) 2003 Winbond Electronics Corp. All rights reserved. + * ============================================================================ + */ + +#include "sme_api.h" +#include "wbhal.h" +#include "wb35reg_f.h" +#include "core.h" +#include "mto.h" + +/* Declare SQ3 to rate and fragmentation threshold table */ +/* Declare fragmentation threshold table */ +#define MTO_MAX_FRAG_TH_LEVELS 5 +#define MTO_MAX_DATA_RATE_LEVELS 12 + +u16 MTO_Frag_Th_Tbl[MTO_MAX_FRAG_TH_LEVELS] = { + 256, 384, 512, 768, 1536 }; -u8 MTO_SQ3_Level[MTO_MAX_SQ3_LEVELS] = -{ - 0, 26, 30, 32, 34, 35, 37, 42, 44, 46, 54, 62, 78, 81 -}; -u8 MTO_SQ3toRate[MTO_MAX_SQ3_LEVELS] = -{ - 0, 1, 1, 2, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 -}; -u8 MTO_SQ3toFrag[MTO_MAX_SQ3_LEVELS] = -{ - 0, 2, 2, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4 -}; - -// One Exchange Time table -// -u16 MTO_One_Exchange_Time_Tbl_l[MTO_MAX_FRAG_TH_LEVELS][MTO_MAX_DATA_RATE_LEVELS] = -{ - { 2554, 1474, 822, 0, 0, 636, 0, 0, 0, 0, 0, 0}, - { 3578, 1986, 1009, 0, 0, 729, 0, 0, 0, 0, 0, 0}, - { 4602, 2498, 1195, 0, 0, 822, 0, 0, 0, 0, 0, 0}, - { 6650, 3522, 1567, 0, 0, 1009, 0, 0, 0, 0, 0, 0}, - {12794, 6594, 2684, 0, 0, 1567, 0, 0, 0, 0, 0, 0} -}; - -u16 MTO_One_Exchange_Time_Tbl_s[MTO_MAX_FRAG_TH_LEVELS][MTO_MAX_DATA_RATE_LEVELS] = -{ - { 0, 1282, 630, 404, 288, 444, 232, 172, 144, 116, 100, 96}, - { 0, 1794, 817, 572, 400, 537, 316, 228, 188, 144, 124, 116}, - { 0, 2306, 1003, 744, 516, 630, 400, 288, 228, 172, 144, 136}, - { 0, 3330, 1375, 1084, 744, 817, 572, 400, 316, 228, 188, 172}, - { 0, 6402, 2492, 2108, 1424, 1375, 1084, 740, 572, 400, 316, 284} -}; - -#define MTO_ONE_EXCHANGE_TIME(preamble_type, frag_th_lvl, data_rate_lvl) \ - (preamble_type) ? MTO_One_Exchange_Time_Tbl_s[frag_th_lvl][data_rate_lvl] : \ - MTO_One_Exchange_Time_Tbl_l[frag_th_lvl][data_rate_lvl] - -// Declare data rate table -//The following table will be changed at anytime if the opration rate supported by AP don't -//match the table -u8 MTO_Data_Rate_Tbl[MTO_MAX_DATA_RATE_LEVELS] = -{ - 2, 4, 11, 22, 12, 18, 24, 36, 48, 72, 96, 108 -}; - -//The Stardard_Data_Rate_Tbl and Level2PerTbl table is used to indirectly retreive PER -//information from Rate_PER_TBL -//The default settings is AP can support full rate set. -static u8 Stardard_Data_Rate_Tbl[MTO_MAX_DATA_RATE_LEVELS] = -{ +/* + * Declare data rate table: + * The following table will be changed at anytime if the operation rate + * supported by AP don't match the table + */ +static u8 MTO_Data_Rate_Tbl[MTO_MAX_DATA_RATE_LEVELS] = { 2, 4, 11, 22, 12, 18, 24, 36, 48, 72, 96, 108 }; -static u8 Level2PerTbl[MTO_MAX_DATA_RATE_LEVELS] = -{ - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 -}; -//How many kind of tx rate can be supported by AP -//DTO will change Rate between MTO_Data_Rate_Tbl[0] and MTO_Data_Rate_Tbl[MTO_DataRateAvailableLevel-1] -static u8 MTO_DataRateAvailableLevel = MTO_MAX_DATA_RATE_LEVELS; -//Smoothed PER table for each different RATE based on packet length of 1514 -static int Rate_PER_TBL[91][MTO_MAX_DATA_RATE_LEVELS] = { -// 1M 2M 5.5M 11M 6M 9M 12M 18M 24M 36M 48M 54M -/* 0% */{ 93, 177, 420, 538, 690, 774, 1001, 1401, 1768, 2358, 2838, 3039}, -/* 1% */{ 92, 176, 416, 533, 683, 767, 992, 1389, 1752, 2336, 2811, 3010}, -/* 2% */{ 91, 174, 412, 528, 675, 760, 983, 1376, 1735, 2313, 2783, 2979}, -/* 3% */{ 90, 172, 407, 523, 667, 753, 973, 1363, 1719, 2290, 2755, 2948}, -/* 4% */{ 90, 170, 403, 518, 659, 746, 964, 1350, 1701, 2266, 2726, 2916}, -/* 5% */{ 89, 169, 398, 512, 651, 738, 954, 1336, 1684, 2242, 2696, 2884}, -/* 6% */{ 88, 167, 394, 507, 643, 731, 944, 1322, 1666, 2217, 2665, 2851}, -/* 7% */{ 87, 165, 389, 502, 635, 723, 935, 1308, 1648, 2192, 2634, 2817}, -/* 8% */{ 86, 163, 384, 497, 626, 716, 924, 1294, 1629, 2166, 2602, 2782}, -/* 9% */{ 85, 161, 380, 491, 618, 708, 914, 1279, 1611, 2140, 2570, 2747}, -/* 10% */{ 84, 160, 375, 486, 609, 700, 904, 1265, 1591, 2113, 2537, 2711}, -/* 11% */{ 83, 158, 370, 480, 600, 692, 894, 1250, 1572, 2086, 2503, 2675}, -/* 12% */{ 82, 156, 365, 475, 592, 684, 883, 1234, 1552, 2059, 2469, 2638}, -/* 13% */{ 81, 154, 360, 469, 583, 676, 872, 1219, 1532, 2031, 2435, 2600}, -/* 14% */{ 80, 152, 355, 464, 574, 668, 862, 1204, 1512, 2003, 2400, 2562}, -/* 15% */{ 79, 150, 350, 458, 565, 660, 851, 1188, 1492, 1974, 2365, 2524}, -/* 16% */{ 78, 148, 345, 453, 556, 652, 840, 1172, 1471, 1945, 2329, 2485}, -/* 17% */{ 77, 146, 340, 447, 547, 643, 829, 1156, 1450, 1916, 2293, 2446}, -/* 18% */{ 76, 144, 335, 441, 538, 635, 818, 1140, 1429, 1887, 2256, 2406}, -/* 19% */{ 75, 143, 330, 436, 529, 627, 807, 1124, 1408, 1857, 2219, 2366}, -/* 20% */{ 74, 141, 325, 430, 520, 618, 795, 1107, 1386, 1827, 2182, 2326}, -/* 21% */{ 73, 139, 320, 424, 510, 610, 784, 1091, 1365, 1797, 2145, 2285}, -/* 22% */{ 72, 137, 314, 418, 501, 601, 772, 1074, 1343, 1766, 2107, 2244}, -/* 23% */{ 71, 135, 309, 412, 492, 592, 761, 1057, 1321, 1736, 2069, 2203}, -/* 24% */{ 70, 133, 304, 407, 482, 584, 749, 1040, 1299, 1705, 2031, 2161}, -/* 25% */{ 69, 131, 299, 401, 473, 575, 738, 1023, 1277, 1674, 1992, 2120}, -/* 26% */{ 68, 129, 293, 395, 464, 566, 726, 1006, 1254, 1642, 1953, 2078}, -/* 27% */{ 67, 127, 288, 389, 454, 557, 714, 989, 1232, 1611, 1915, 2035}, -/* 28% */{ 66, 125, 283, 383, 445, 549, 703, 972, 1209, 1579, 1876, 1993}, -/* 29% */{ 65, 123, 278, 377, 436, 540, 691, 955, 1187, 1548, 1836, 1951}, -/* 30% */{ 64, 121, 272, 371, 426, 531, 679, 937, 1164, 1516, 1797, 1908}, -/* 31% */{ 63, 119, 267, 365, 417, 522, 667, 920, 1141, 1484, 1758, 1866}, -/* 32% */{ 62, 117, 262, 359, 407, 513, 655, 902, 1118, 1453, 1719, 1823}, -/* 33% */{ 61, 115, 256, 353, 398, 504, 643, 885, 1095, 1421, 1679, 1781}, -/* 34% */{ 60, 113, 251, 347, 389, 495, 631, 867, 1072, 1389, 1640, 1738}, -/* 35% */{ 59, 111, 246, 341, 379, 486, 619, 850, 1049, 1357, 1600, 1695}, -/* 36% */{ 58, 108, 240, 335, 370, 477, 607, 832, 1027, 1325, 1561, 1653}, -/* 37% */{ 57, 106, 235, 329, 361, 468, 595, 815, 1004, 1293, 1522, 1610}, -/* 38% */{ 56, 104, 230, 323, 351, 459, 584, 797, 981, 1261, 1483, 1568}, -/* 39% */{ 55, 102, 224, 317, 342, 450, 572, 780, 958, 1230, 1443, 1526}, -/* 40% */{ 54, 100, 219, 311, 333, 441, 560, 762, 935, 1198, 1404, 1484}, -/* 41% */{ 53, 98, 214, 305, 324, 432, 548, 744, 912, 1166, 1366, 1442}, -/* 42% */{ 52, 96, 209, 299, 315, 423, 536, 727, 889, 1135, 1327, 1400}, -/* 43% */{ 51, 94, 203, 293, 306, 414, 524, 709, 866, 1104, 1289, 1358}, -/* 44% */{ 50, 92, 198, 287, 297, 405, 512, 692, 844, 1072, 1250, 1317}, -/* 45% */{ 49, 90, 193, 281, 288, 396, 500, 675, 821, 1041, 1212, 1276}, -/* 46% */{ 48, 88, 188, 275, 279, 387, 488, 657, 799, 1011, 1174, 1236}, -/* 47% */{ 47, 86, 183, 269, 271, 378, 476, 640, 777, 980, 1137, 1195}, -/* 48% */{ 46, 84, 178, 262, 262, 369, 464, 623, 754, 949, 1100, 1155}, -/* 49% */{ 45, 82, 173, 256, 254, 360, 452, 606, 732, 919, 1063, 1116}, -/* 50% */{ 44, 80, 168, 251, 245, 351, 441, 589, 710, 889, 1026, 1076}, -/* 51% */{ 43, 78, 163, 245, 237, 342, 429, 572, 689, 860, 990, 1038}, -/* 52% */{ 42, 76, 158, 239, 228, 333, 417, 555, 667, 830, 955, 999}, -/* 53% */{ 41, 74, 153, 233, 220, 324, 406, 538, 645, 801, 919, 961}, -/* 54% */{ 40, 72, 148, 227, 212, 315, 394, 522, 624, 773, 884, 924}, -/* 55% */{ 39, 70, 143, 221, 204, 307, 383, 505, 603, 744, 850, 887}, -/* 56% */{ 38, 68, 138, 215, 196, 298, 371, 489, 582, 716, 816, 851}, -/* 57% */{ 37, 67, 134, 209, 189, 289, 360, 473, 562, 688, 783, 815}, -/* 58% */{ 36, 65, 129, 203, 181, 281, 349, 457, 541, 661, 750, 780}, -/* 59% */{ 35, 63, 124, 197, 174, 272, 338, 441, 521, 634, 717, 745}, -/* 60% */{ 34, 61, 120, 192, 166, 264, 327, 425, 501, 608, 686, 712}, -/* 61% */{ 33, 59, 115, 186, 159, 255, 316, 409, 482, 582, 655, 678}, -/* 62% */{ 32, 57, 111, 180, 152, 247, 305, 394, 462, 556, 624, 646}, -/* 63% */{ 31, 55, 107, 174, 145, 238, 294, 379, 443, 531, 594, 614}, -/* 64% */{ 30, 53, 102, 169, 138, 230, 283, 364, 425, 506, 565, 583}, -/* 65% */{ 29, 52, 98, 163, 132, 222, 273, 349, 406, 482, 536, 553}, -/* 66% */{ 28, 50, 94, 158, 125, 214, 262, 334, 388, 459, 508, 523}, -/* 67% */{ 27, 48, 90, 152, 119, 206, 252, 320, 370, 436, 481, 495}, -/* 68% */{ 26, 46, 86, 147, 113, 198, 242, 306, 353, 413, 455, 467}, -/* 69% */{ 26, 44, 82, 141, 107, 190, 231, 292, 336, 391, 429, 440}, -/* 70% */{ 25, 43, 78, 136, 101, 182, 221, 278, 319, 370, 405, 414}, -/* 71% */{ 24, 41, 74, 130, 95, 174, 212, 265, 303, 350, 381, 389}, -/* 72% */{ 23, 39, 71, 125, 90, 167, 202, 252, 287, 329, 358, 365}, -/* 73% */{ 22, 37, 67, 119, 85, 159, 192, 239, 271, 310, 335, 342}, -/* 74% */{ 21, 36, 63, 114, 80, 151, 183, 226, 256, 291, 314, 320}, -/* 75% */{ 20, 34, 60, 109, 75, 144, 174, 214, 241, 273, 294, 298}, -/* 76% */{ 19, 32, 57, 104, 70, 137, 164, 202, 227, 256, 274, 278}, -/* 77% */{ 18, 31, 53, 99, 66, 130, 155, 190, 213, 239, 256, 259}, -/* 78% */{ 17, 29, 50, 94, 62, 122, 146, 178, 200, 223, 238, 241}, -/* 79% */{ 16, 28, 47, 89, 58, 115, 138, 167, 187, 208, 222, 225}, -/* 80% */{ 16, 26, 44, 84, 54, 109, 129, 156, 175, 194, 206, 209}, -/* 81% */{ 15, 24, 41, 79, 50, 102, 121, 146, 163, 180, 192, 194}, -/* 82% */{ 14, 23, 39, 74, 47, 95, 113, 136, 151, 167, 178, 181}, -/* 83% */{ 13, 21, 36, 69, 44, 89, 105, 126, 140, 155, 166, 169}, -/* 84% */{ 12, 20, 33, 64, 41, 82, 97, 116, 130, 144, 155, 158}, -/* 85% */{ 11, 19, 31, 60, 39, 76, 89, 107, 120, 134, 145, 149}, -/* 86% */{ 11, 17, 29, 55, 36, 70, 82, 98, 110, 125, 136, 140}, -/* 87% */{ 10, 16, 26, 51, 34, 64, 75, 90, 102, 116, 128, 133}, -/* 88% */{ 9, 14, 24, 46, 32, 58, 68, 81, 93, 108, 121, 128}, -/* 89% */{ 8, 13, 22, 42, 31, 52, 61, 74, 86, 102, 116, 124}, -/* 90% */{ 7, 12, 21, 37, 29, 46, 54, 66, 79, 96, 112, 121} -}; - -#define RSSIBUF_NUM 10 -#define RSSI2RATE_SIZE 9 - -static TXRETRY_REC TxRateRec={MTO_MAX_DATA_RATE_LEVELS - 1, 0}; //new record=>TxRateRec -static int TxRetryRate; -//static int SQ3, BSS_PK_CNT, NIDLESLOT, SLOT_CNT, INTERF_CNT, GAP_CNT, DS_EVM; -static s32 RSSIBuf[RSSIBUF_NUM]={-70, -70, -70, -70, -70, -70, -70, -70, -70, -70}; -static s32 RSSISmoothed=-700; -static int RSSIBufIndex=0; -static u8 max_rssi_rate; -static int rate_tbl[13] = {0,1,2,5,11,6,9,12,18,24,36,48,54}; -//[WKCHEN]static core_data_t *pMTOcore_data=NULL; - -static int TotalTxPkt = 0; -static int TotalTxPktRetry = 0; -static int TxPktPerAnt[3] = {0,0,0}; -static int RXRSSIANT[3] ={-70,-70,-70}; -static int TxPktRetryPerAnt[3] = {0,0,0}; -//static int TxDominateFlag=FALSE; -static u8 old_antenna[4]={1 ,0 ,1 ,0}; -static int retryrate_rec[MTO_MAX_DATA_RATE_LEVELS];//this record the retry rate at different data rate - -static int PeriodTotalTxPkt = 0; -static int PeriodTotalTxPktRetry = 0; -typedef struct -{ - s32 RSSI; - u8 TxRate; -}RSSI2RATE; - -static RSSI2RATE RSSI2RateTbl[RSSI2RATE_SIZE] = -{ - {-740, 108}, // 54M - {-760, 96}, // 48M - {-820, 72}, // 36M - {-850, 48}, // 24M - {-870, 36}, // 18M - {-890, 24}, // 12M - {-900, 12}, // 6M - {-920, 11}, // 5.5M - {-950, 4}, // 2M -}; -static u8 untogglecount; -static u8 last_rate_ant; //this is used for antenna backoff-hh - -u8 boSparseTxTraffic = FALSE; - -void MTO_Init(MTO_FUNC_INPUT); -void AntennaToggleInitiator(MTO_FUNC_INPUT); -void AntennaToggleState(MTO_FUNC_INPUT); -void TxPwrControl(MTO_FUNC_INPUT); -void GetFreshAntennaData(MTO_FUNC_INPUT); -void TxRateReductionCtrl(MTO_FUNC_INPUT); -/** 1.1.31.1000 Turbo modify */ -//void MTO_SetDTORateRange(int type); -void MTO_SetDTORateRange(MTO_FUNC_INPUT, u8 *pRateArray, u8 ArraySize); -void MTO_SetTxCount(MTO_FUNC_INPUT, u8 t0, u8 index); -void MTO_TxFailed(MTO_FUNC_INPUT); -void SmoothRSSI(s32 new_rssi); -void hal_get_dto_para(MTO_FUNC_INPUT, char *buffer); -u8 CalcNewRate(MTO_FUNC_INPUT, u8 old_rate, u32 retry_cnt, u32 tx_frag_cnt); -u8 GetMaxRateLevelFromRSSI(void); -u8 MTO_GetTxFallbackRate(MTO_FUNC_INPUT); -int Divide(int a, int b); -void multiagc(MTO_FUNC_INPUT, u8 high_gain_mode); - -//=========================================================================== -// MTO_Init -- -// -// Description: -// Set DTO Tx Rate Scope because different AP could have different Rate set. -// After our staion join with AP, LM core will call this function to initialize -// Tx Rate table. -// -// Arguments: -// pRateArray - The pointer to the Tx Rate Array by the following order -// - 2, 4, 11, 22, 12, 18, 24, 36, 48, 72, 96, 108 -// - DTO won't check whether rate order is invalid or not -// ArraySize - The array size to indicate how many tx rate we can choose -// -// sample code: -// { -// u8 RateArray[4] = {2, 4, 11, 22}; -// MTO_SetDTORateRange(RateArray, 4); -// } -// -// Return Value: -// None -//============================================================================ -void MTO_SetDTORateRange(MTO_FUNC_INPUT,u8 *pRateArray, u8 ArraySize) -{ - u8 i, j=0; - - for(i=0;i<ArraySize;i++) - { - if(pRateArray[i] == 22) - break; - } - if(i < ArraySize) //we need adjust the order of rate list because 11Mbps rate exists - { - for(;i>0;i--) - { - if(pRateArray[i-1] <= 11) - break; - pRateArray[i] = pRateArray[i-1]; - } - pRateArray[i] = 22; - MTO_OFDM_RATE_LEVEL() = i; - } - else - { - for(i=0; i<ArraySize; i++) - { - if (pRateArray[i] >= 12) - break; - } - MTO_OFDM_RATE_LEVEL() = i; - } - - for(i=0;i<ArraySize;i++) - { - MTO_Data_Rate_Tbl[i] = pRateArray[i]; - for(;j<MTO_MAX_DATA_RATE_LEVELS;j++) - { - if(Stardard_Data_Rate_Tbl[j] == pRateArray[i]) - break; - } - Level2PerTbl[i] = j; - #ifdef _PE_DTO_DUMP_ - WBDEBUG(("[MTO]:Op Rate[%d]: %d\n",i, MTO_Data_Rate_Tbl[i])); - #endif - } - MTO_DataRateAvailableLevel = ArraySize; - if( MTO_DATA().RatePolicy ) // 0 means that no registry setting - { - if( MTO_DATA().RatePolicy == 1 ) - TxRateRec.tx_rate = 0; //ascent - else - TxRateRec.tx_rate = MTO_DataRateAvailableLevel -1 ; //descent - } - else - { - if( MTO_INITTXRATE_MODE ) - TxRateRec.tx_rate = 0; //ascent - else - TxRateRec.tx_rate = MTO_DataRateAvailableLevel -1 ; //descent - } - TxRateRec.tx_retry_rate = 0; - //set default rate for initial use - MTO_RATE_LEVEL() = TxRateRec.tx_rate; - MTO_FALLBACK_RATE_LEVEL() = MTO_RATE_LEVEL(); -} - -//=========================================================================== -// MTO_Init -- -// -// Description: -// Initialize MTO parameters. -// -// This function should be invoked during system initialization. -// -// Arguments: -// Adapter - The pointer to the Miniport Adapter Context -// -// Return Value: -// None -//============================================================================ -void MTO_Init(MTO_FUNC_INPUT) -{ - int i; - //WBDEBUG(("[MTO] -> MTO_Init()\n")); - //[WKCHEN]pMTOcore_data = pcore_data; -// 20040510 Turbo add for global variable - MTO_TMR_CNT() = 0; - MTO_TOGGLE_STATE() = TOGGLE_STATE_IDLE; - MTO_TX_RATE_REDUCTION_STATE() = RATE_CHGSTATE_IDLE; - MTO_BACKOFF_TMR() = 0; - MTO_LAST_RATE() = 11; - MTO_CO_EFFICENT() = 0; - - //MTO_TH_FIXANT() = MTO_DEFAULT_TH_FIXANT; - MTO_TH_CNT() = MTO_DEFAULT_TH_CNT; - MTO_TH_SQ3() = MTO_DEFAULT_TH_SQ3; - MTO_TH_IDLE_SLOT() = MTO_DEFAULT_TH_IDLE_SLOT; - MTO_TH_PR_INTERF() = MTO_DEFAULT_TH_PR_INTERF; - - MTO_TMR_AGING() = MTO_DEFAULT_TMR_AGING; - MTO_TMR_PERIODIC() = MTO_DEFAULT_TMR_PERIODIC; - - //[WKCHEN]MTO_CCA_MODE_SETUP()= (u8) hal_get_cca_mode(MTO_HAL()); - //[WKCHEN]MTO_CCA_MODE() = MTO_CCA_MODE_SETUP(); - - //MTO_PREAMBLE_TYPE() = MTO_PREAMBLE_LONG; - MTO_PREAMBLE_TYPE() = MTO_PREAMBLE_SHORT; // for test - - MTO_ANT_SEL() = hal_get_antenna_number(MTO_HAL()); - MTO_ANT_MAC() = MTO_ANT_SEL(); - MTO_CNT_ANT(0) = 0; - MTO_CNT_ANT(1) = 0; - MTO_SQ_ANT(0) = 0; - MTO_SQ_ANT(1) = 0; - MTO_ANT_DIVERSITY() = MTO_ANTENNA_DIVERSITY_ON; - //CardSet_AntennaDiversity(Adapter, MTO_ANT_DIVERSITY()); - //PLMESetAntennaDiversity( Adapter, MTO_ANT_DIVERSITY()); - - MTO_AGING_TIMEOUT() = 0;//MTO_TMR_AGING() / MTO_TMR_PERIODIC(); - - // The following parameters should be initialized to the values set by user - // - //MTO_RATE_LEVEL() = 10; - MTO_RATE_LEVEL() = 0; - MTO_FALLBACK_RATE_LEVEL() = MTO_RATE_LEVEL(); - MTO_FRAG_TH_LEVEL() = 4; - /** 1.1.23.1000 Turbo modify from -1 to +1 - MTO_RTS_THRESHOLD() = MTO_FRAG_TH() - 1; - MTO_RTS_THRESHOLD_SETUP() = MTO_FRAG_TH() - 1; - */ - MTO_RTS_THRESHOLD() = MTO_FRAG_TH() + 1; - MTO_RTS_THRESHOLD_SETUP() = MTO_FRAG_TH() + 1; - // 1.1.23.1000 Turbo add for mto change preamble from 0 to 1 - MTO_RATE_CHANGE_ENABLE() = 1; - MTO_FRAG_CHANGE_ENABLE() = 0; // 1.1.29.1000 Turbo add don't support frag - //The default valud of ANTDIV_DEFAULT_ON will be decided by EEPROM - //#ifdef ANTDIV_DEFAULT_ON - //MTO_ANT_DIVERSITY_ENABLE() = 1; - //#else - //MTO_ANT_DIVERSITY_ENABLE() = 0; - //#endif - MTO_POWER_CHANGE_ENABLE() = 1; - MTO_PREAMBLE_CHANGE_ENABLE()= 1; - MTO_RTS_CHANGE_ENABLE() = 0; // 1.1.29.1000 Turbo add don't support frag - // 20040512 Turbo add - //old_antenna[0] = 1; - //old_antenna[1] = 0; - //old_antenna[2] = 1; - //old_antenna[3] = 0; - for (i=0;i<MTO_MAX_DATA_RATE_LEVELS;i++) - retryrate_rec[i]=5; - - MTO_TXFLOWCOUNT() = 0; - //--------- DTO threshold parameters ------------- - //MTOPARA_PERIODIC_CHECK_CYCLE() = 50; - MTOPARA_PERIODIC_CHECK_CYCLE() = 10; - MTOPARA_RSSI_TH_FOR_ANTDIV() = 10; - MTOPARA_TXCOUNT_TH_FOR_CALC_RATE() = 50; - MTOPARA_TXRATE_INC_TH() = 10; - MTOPARA_TXRATE_DEC_TH() = 30; - MTOPARA_TXRATE_EQ_TH() = 40; - MTOPARA_TXRATE_BACKOFF() = 12; - MTOPARA_TXRETRYRATE_REDUCE() = 6; - if ( MTO_TXPOWER_FROM_EEPROM == 0xff) - { - switch( MTO_HAL()->phy_type) - { - case RF_AIROHA_2230: - case RF_AIROHA_2230S: // 20060420 Add this - MTOPARA_TXPOWER_INDEX() = 46; // MAX-8 // @@ Only for AL 2230 - break; - case RF_AIROHA_7230: - MTOPARA_TXPOWER_INDEX() = 49; - break; - case RF_WB_242: - MTOPARA_TXPOWER_INDEX() = 10; - break; - case RF_WB_242_1: - MTOPARA_TXPOWER_INDEX() = 24; // ->10 20060316.1 modify - break; - } - } - else //follow the setting from EEPROM - MTOPARA_TXPOWER_INDEX() = MTO_TXPOWER_FROM_EEPROM; - hal_set_rf_power(MTO_HAL(), (u8)MTOPARA_TXPOWER_INDEX()); - //------------------------------------------------ - - // For RSSI turning 20060808.4 Cancel load from EEPROM - MTO_DATA().RSSI_high = -41; - MTO_DATA().RSSI_low = -60; -} - -//---------------------------------------------------------------------------// -static u32 DTO_Rx_Info[13][3]; -static u32 DTO_RxCRCFail_Info[13][3]; -static u32 AntennaToggleBkoffTimer=5; -typedef struct{ - int RxRate; - int RxRatePkts; - int index; -}RXRATE_ANT; -RXRATE_ANT RxRatePeakAnt[3]; - -#define ANT0 0 -#define ANT1 1 -#define OLD_ANT 2 - -void SearchPeakRxRate(int index) -{ - int i; - RxRatePeakAnt[index].RxRatePkts=0; - //Find out the best rx rate which is used on different antenna - for(i=1;i<13;i++) - { - if(DTO_Rx_Info[i][index] > (u32) RxRatePeakAnt[index].RxRatePkts) - { - RxRatePeakAnt[index].RxRatePkts = DTO_Rx_Info[i][index]; - RxRatePeakAnt[index].RxRate = rate_tbl[i]; - RxRatePeakAnt[index].index = i; - } - } -} - -void ResetDTO_RxInfo(int index, MTO_FUNC_INPUT) -{ - int i; - - #ifdef _PE_DTO_DUMP_ - WBDEBUG(("ResetDTOrx\n")); - #endif - - for(i=0;i<13;i++) - DTO_Rx_Info[i][index] = MTO_HAL()->rx_ok_count[i]; - - for(i=0;i<13;i++) - DTO_RxCRCFail_Info[i][index] = MTO_HAL()->rx_err_count[i]; - - TotalTxPkt = 0; - TotalTxPktRetry = 0; -} - -void GetDTO_RxInfo(int index, MTO_FUNC_INPUT) +/* this record the retry rate at different data rate */ +static int retryrate_rec[MTO_MAX_DATA_RATE_LEVELS]; + +static u8 boSparseTxTraffic; + +/* + * =========================================================================== + * MTO_Init -- + * + * Description: + * Initialize MTO parameters. + * + * This function should be invoked during system initialization. + * + * Arguments: + * adapter - The pointer to the Miniport adapter Context + * =========================================================================== + */ +void MTO_Init(struct wbsoft_priv *adapter) { int i; - #ifdef _PE_DTO_DUMP_ - WBDEBUG(("GetDTOrx\n")); - #endif + MTO_PREAMBLE_TYPE() = MTO_PREAMBLE_SHORT; /* for test */ - //PDEBUG(("[MTO]:DTO_Rx_Info[%d]=%d, rx_ok_count=%d\n", index, DTO_Rx_Info[0][index], phw_data->rx_ok_count[0])); - for(i=0;i<13;i++) - DTO_Rx_Info[i][index] = abs(MTO_HAL()->rx_ok_count[i] - DTO_Rx_Info[i][index]); - if(DTO_Rx_Info[0][index]==0) DTO_Rx_Info[0][index] = 1; + MTO_CNT_ANT(0) = 0; + MTO_CNT_ANT(1) = 0; + MTO_SQ_ANT(0) = 0; + MTO_SQ_ANT(1) = 0; - for(i=0;i<13;i++) - DTO_RxCRCFail_Info[i][index] = MTO_HAL()->rx_err_count[i] - DTO_RxCRCFail_Info[i][index]; - - TxPktPerAnt[index] = TotalTxPkt; - TxPktRetryPerAnt[index] = TotalTxPktRetry; - TotalTxPkt = 0; - TotalTxPktRetry = 0; -} - -void OutputDebugInfo(int index1, int index2) -{ - #ifdef _PE_DTO_DUMP_ - WBDEBUG(("[HHDTO]:Total Rx (%d)\t\t(%d) \n ", DTO_Rx_Info[0][index1], DTO_Rx_Info[0][index2])); - WBDEBUG(("[HHDTO]:RECEIVE RSSI: (%d)\t\t(%d) \n ", RXRSSIANT[index1], RXRSSIANT[index2])); - WBDEBUG(("[HHDTO]:TX packet correct rate: (%d)%%\t\t(%d)%% \n ",Divide(TxPktPerAnt[index1]*100,TxPktRetryPerAnt[index1]), Divide(TxPktPerAnt[index2]*100,TxPktRetryPerAnt[index2]))); - #endif - { - int tmp1, tmp2; - #ifdef _PE_DTO_DUMP_ - WBDEBUG(("[HHDTO]:Total Tx (%d)\t\t(%d) \n ", TxPktPerAnt[index1], TxPktPerAnt[index2])); - WBDEBUG(("[HHDTO]:Total Tx retry (%d)\t\t(%d) \n ", TxPktRetryPerAnt[index1], TxPktRetryPerAnt[index2])); - #endif - tmp1 = TxPktPerAnt[index1] + DTO_Rx_Info[0][index1]; - tmp2 = TxPktPerAnt[index2] + DTO_Rx_Info[0][index2]; - #ifdef _PE_DTO_DUMP_ - WBDEBUG(("[HHDTO]:Total Tx+RX (%d)\t\t(%d) \n ", tmp1, tmp2)); - #endif - } -} - -unsigned char TxDominate(int index) -{ - int tmp; - - tmp = TxPktPerAnt[index] + DTO_Rx_Info[0][index]; - - if(Divide(TxPktPerAnt[index]*100, tmp) > 40) - return TRUE; - else - return FALSE; -} - -unsigned char CmpTxRetryRate(int index1, int index2) -{ - int tx_retry_rate1, tx_retry_rate2; - tx_retry_rate1 = Divide((TxPktRetryPerAnt[index1] - TxPktPerAnt[index1])*100, TxPktRetryPerAnt[index1]); - tx_retry_rate2 = Divide((TxPktRetryPerAnt[index2] - TxPktPerAnt[index2])*100, TxPktRetryPerAnt[index2]); - #ifdef _PE_DTO_DUMP_ - WBDEBUG(("[MTO]:TxRetry Ant0: (%d%%) Ant1: (%d%%) \n ", tx_retry_rate1, tx_retry_rate2)); - #endif - - if(tx_retry_rate1 > tx_retry_rate2) - return TRUE; - else - return FALSE; -} - -void GetFreshAntennaData(MTO_FUNC_INPUT) -{ - u8 x; - - x = hal_get_antenna_number(MTO_HAL()); - //hal_get_bss_pk_cnt(MTO_HAL()); - //hal_get_est_sq3(MTO_HAL(), 1); - old_antenna[0] = x; - //if this is the function for timer - ResetDTO_RxInfo(x, MTO_FUNC_INPUT_DATA); - if(AntennaToggleBkoffTimer) - AntennaToggleBkoffTimer--; - if (abs(last_rate_ant-MTO_RATE_LEVEL())>1) //backoff timer reset - AntennaToggleBkoffTimer=0; - - if (MTO_ANT_DIVERSITY() != MTO_ANTENNA_DIVERSITY_ON || - MTO_ANT_DIVERSITY_ENABLE() != 1) - AntennaToggleBkoffTimer=1; - #ifdef _PE_DTO_DUMP_ - WBDEBUG(("[HHDTO]:**last data rate=%d,now data rate=%d**antenna toggle timer=%d",last_rate_ant,MTO_RATE_LEVEL(),AntennaToggleBkoffTimer)); - #endif - last_rate_ant=MTO_RATE_LEVEL(); - if(AntennaToggleBkoffTimer==0) - { - MTO_TOGGLE_STATE() = TOGGLE_STATE_WAIT0; - #ifdef _PE_DTO_DUMP_ - WBDEBUG(("[HHDTO]:===state is starting==for antenna toggle===")); - #endif - } - else - MTO_TOGGLE_STATE() = TOGGLE_STATE_IDLE; - - if ((MTO_BACKOFF_TMR()!=0)&&(MTO_RATE_LEVEL()>MTO_DataRateAvailableLevel - 3)) - { - MTO_TOGGLE_STATE() = TOGGLE_STATE_IDLE; - #ifdef _PE_DTO_DUMP_ - WBDEBUG(("[HHDTO]:===the data rate is %d (good)and will not toogle ===",MTO_DATA_RATE()>>1)); - #endif - } - - -} - -int WB_PCR[2]; //packet correct rate - -void AntennaToggleState(MTO_FUNC_INPUT) -{ - int decideantflag = 0; - u8 x; - s32 rssi; + MTO_AGING_TIMEOUT() = 0; - if(MTO_ANT_DIVERSITY_ENABLE() != 1) - return; - x = hal_get_antenna_number(MTO_HAL()); - switch(MTO_TOGGLE_STATE()) - { + /* The following parameters should be initialized to the values set by user */ + MTO_RATE_LEVEL() = 0; + MTO_FRAG_TH_LEVEL() = 4; + MTO_RTS_THRESHOLD() = MTO_FRAG_TH() + 1; + MTO_RTS_THRESHOLD_SETUP() = MTO_FRAG_TH() + 1; + MTO_RATE_CHANGE_ENABLE() = 1; + MTO_FRAG_CHANGE_ENABLE() = 0; + MTO_POWER_CHANGE_ENABLE() = 1; + MTO_PREAMBLE_CHANGE_ENABLE() = 1; + MTO_RTS_CHANGE_ENABLE() = 0; - //Missing..... - case TOGGLE_STATE_IDLE: - case TOGGLE_STATE_BKOFF: - break;; + for (i = 0; i < MTO_MAX_DATA_RATE_LEVELS; i++) + retryrate_rec[i] = 5; - case TOGGLE_STATE_WAIT0://======== - GetDTO_RxInfo(x, MTO_FUNC_INPUT_DATA); - sme_get_rssi(MTO_FUNC_INPUT_DATA, &rssi); - RXRSSIANT[x] = rssi; - #ifdef _PE_DTO_DUMP_ - WBDEBUG(("[HHDTO] **wait0==== Collecting Ant%d--rssi=%d\n", x,RXRSSIANT[x])); - #endif - - //change antenna and reset the data at changed antenna - x = (~x) & 0x01; - MTO_ANT_SEL() = x; - hal_set_antenna_number(MTO_HAL(), MTO_ANT_SEL()); - LOCAL_ANTENNA_NO() = x; - - MTO_TOGGLE_STATE() = TOGGLE_STATE_WAIT1;//go to wait1 - ResetDTO_RxInfo(x, MTO_FUNC_INPUT_DATA); + MTO_TXFLOWCOUNT() = 0; + /* --------- DTO threshold parameters ------------- */ + MTOPARA_PERIODIC_CHECK_CYCLE() = 10; + MTOPARA_RSSI_TH_FOR_ANTDIV() = 10; + MTOPARA_TXCOUNT_TH_FOR_CALC_RATE() = 50; + MTOPARA_TXRATE_INC_TH() = 10; + MTOPARA_TXRATE_DEC_TH() = 30; + MTOPARA_TXRATE_EQ_TH() = 40; + MTOPARA_TXRATE_BACKOFF() = 12; + MTOPARA_TXRETRYRATE_REDUCE() = 6; + if (MTO_TXPOWER_FROM_EEPROM == 0xff) { + switch (MTO_HAL()->phy_type) { + case RF_AIROHA_2230: + case RF_AIROHA_2230S: + MTOPARA_TXPOWER_INDEX() = 46; /* MAX-8 @@ Only for AL 2230 */ break; - case TOGGLE_STATE_WAIT1://=====wait1 - //MTO_CNT_ANT(x) = hal_get_bss_pk_cnt(MTO_HAL()); - //RXRSSIANT[x] = hal_get_rssi(MTO_HAL()); - sme_get_rssi(MTO_FUNC_INPUT_DATA, &rssi); - RXRSSIANT[x] = rssi; - GetDTO_RxInfo(x, MTO_FUNC_INPUT_DATA); - #ifdef _PE_DTO_DUMP_ - WBDEBUG(("[HHDTO] **wait1==== Collecting Ant%d--rssi=%d\n", x,RXRSSIANT[x])); - #endif - MTO_TOGGLE_STATE() = TOGGLE_STATE_MAKEDESISION; + case RF_AIROHA_7230: + MTOPARA_TXPOWER_INDEX() = 49; break; - case TOGGLE_STATE_MAKEDESISION: - #ifdef _PE_DTO_DUMP_ - WBDEBUG(("[HHDTO]:Ant--0-----------------1---\n")); - OutputDebugInfo(ANT0,ANT1); - #endif - //PDEBUG(("[HHDTO] **decision====\n ")); - - //=====following is the decision produrce - // - // first: compare the rssi if difference >10 - // select the larger one - // ,others go to second - // second: comapre the tx+rx packet count if difference >100 - // use larger total packets antenna - // third::compare the tx PER if packets>20 - // if difference >5% using the bigger one - // - // fourth:compare the RX PER if packets>20 - // if PER difference <5% - // using old antenna - // - // - if (abs(RXRSSIANT[ANT0]-RXRSSIANT[ANT1]) > MTOPARA_RSSI_TH_FOR_ANTDIV())//====rssi_th - { - if (RXRSSIANT[ANT0]>RXRSSIANT[ANT1]) - { - decideantflag=1; - MTO_ANT_MAC() = ANT0; - } - else - { - decideantflag=1; - MTO_ANT_MAC() = ANT1; - } - #ifdef _PE_DTO_DUMP_ - WBDEBUG(("Select antenna by RSSI\n")); - #endif - } - else if (abs(TxPktPerAnt[ANT0] + DTO_Rx_Info[0][ANT0]-TxPktPerAnt[ANT1]-DTO_Rx_Info[0][ANT1])<50)//=====total packet_th - { - #ifdef _PE_DTO_DUMP_ - WBDEBUG(("Total tx/rx is close\n")); - #endif - if (TxDominate(ANT0) && TxDominate(ANT1)) - { - if ((TxPktPerAnt[ANT0]>10) && (TxPktPerAnt[ANT1]>10))//====tx packet_th - { - WB_PCR[ANT0]=Divide(TxPktPerAnt[ANT0]*100,TxPktRetryPerAnt[ANT0]); - WB_PCR[ANT1]=Divide(TxPktPerAnt[ANT1]*100,TxPktRetryPerAnt[ANT1]); - if (abs(WB_PCR[ANT0]-WB_PCR[ANT1])>5)// tx PER_th - { - #ifdef _PE_DTO_DUMP_ - WBDEBUG(("Decide by Tx correct rate\n")); - #endif - if (WB_PCR[ANT0]>WB_PCR[ANT1]) - { - decideantflag=1; - MTO_ANT_MAC() = ANT0; - } - else - { - decideantflag=1; - MTO_ANT_MAC() = ANT1; - } - } - else - { - decideantflag=0; - untogglecount++; - MTO_ANT_MAC() = old_antenna[0]; - } - } - else - { - decideantflag=0; - MTO_ANT_MAC() = old_antenna[0]; - } - } - else if ((DTO_Rx_Info[0][ANT0]>10)&&(DTO_Rx_Info[0][ANT1]>10))//rx packet th - { - #ifdef _PE_DTO_DUMP_ - WBDEBUG(("Decide by Rx\n")); - #endif - if (abs(DTO_Rx_Info[0][ANT0] - DTO_Rx_Info[0][ANT1])>50) - { - if (DTO_Rx_Info[0][ANT0] > DTO_Rx_Info[0][ANT1]) - { - decideantflag=1; - MTO_ANT_MAC() = ANT0; - } - else - { - decideantflag=1; - MTO_ANT_MAC() = ANT1; - } - } - else - { - decideantflag=0; - untogglecount++; - MTO_ANT_MAC() = old_antenna[0]; - } - } - else - { - decideantflag=0; - MTO_ANT_MAC() = old_antenna[0]; - } - } - else if ((TxPktPerAnt[ANT0]+DTO_Rx_Info[0][ANT0])>(TxPktPerAnt[ANT1]+DTO_Rx_Info[0][ANT1]))//use more packekts - { - #ifdef _PE_DTO_DUMP_ - WBDEBUG(("decide by total tx/rx : ANT 0\n")); - #endif - - decideantflag=1; - MTO_ANT_MAC() = ANT0; - } - else - { - #ifdef _PE_DTO_DUMP_ - WBDEBUG(("decide by total tx/rx : ANT 1\n")); - #endif - decideantflag=1; - MTO_ANT_MAC() = ANT1; - - } - //this is force ant toggle - if (decideantflag==1) - untogglecount=0; - - untogglecount=untogglecount%4; - if (untogglecount==3) //change antenna - MTO_ANT_MAC() = ((~old_antenna[0]) & 0x1); - #ifdef _PE_DTO_DUMP_ - WBDEBUG(("[HHDTO]:==================untoggle-count=%d",untogglecount)); - #endif - - - - - //PDEBUG(("[HHDTO] **********************************DTO ENABLE=%d",MTO_ANT_DIVERSITY_ENABLE())); - if(MTO_ANT_DIVERSITY_ENABLE() == 1) - { - MTO_ANT_SEL() = MTO_ANT_MAC(); - hal_set_antenna_number(MTO_HAL(), MTO_ANT_SEL()); - LOCAL_ANTENNA_NO() = MTO_ANT_SEL(); - #ifdef _PE_DTO_DUMP_ - WBDEBUG(("[HHDTO] ==decision==*******antflag=%d******************selected antenna=%d\n",decideantflag,MTO_ANT_SEL())); - #endif - } - if (decideantflag) - { - old_antenna[3]=old_antenna[2];//store antenna info - old_antenna[2]=old_antenna[1]; - old_antenna[1]=old_antenna[0]; - old_antenna[0]= MTO_ANT_MAC(); - } - #ifdef _PE_DTO_DUMP_ - WBDEBUG(("[HHDTO]:**old antenna=[%d][%d][%d][%d]\n",old_antenna[0],old_antenna[1],old_antenna[2],old_antenna[3])); - #endif - if (old_antenna[0]!=old_antenna[1]) - AntennaToggleBkoffTimer=0; - else if (old_antenna[1]!=old_antenna[2]) - AntennaToggleBkoffTimer=1; - else if (old_antenna[2]!=old_antenna[3]) - AntennaToggleBkoffTimer=2; - else - AntennaToggleBkoffTimer=4; - - #ifdef _PE_DTO_DUMP_ - WBDEBUG(("[HHDTO]:**back off timer=%d",AntennaToggleBkoffTimer)); - #endif - - ResetDTO_RxInfo(MTO_ANT_MAC(), MTO_FUNC_INPUT_DATA); - if (AntennaToggleBkoffTimer==0 && decideantflag) - MTO_TOGGLE_STATE() = TOGGLE_STATE_WAIT0; - else - MTO_TOGGLE_STATE() = TOGGLE_STATE_IDLE; + case RF_WB_242: + MTOPARA_TXPOWER_INDEX() = 10; + break; + case RF_WB_242_1: + MTOPARA_TXPOWER_INDEX() = 24; break; - } - -} - -void multiagc(MTO_FUNC_INPUT, u8 high_gain_mode ) -{ - s32 rssi; - hw_data_t *pHwData = MTO_HAL(); - - sme_get_rssi(MTO_FUNC_INPUT_DATA, &rssi); - - if( (RF_WB_242 == pHwData->phy_type) || - (RF_WB_242_1 == pHwData->phy_type) ) // 20060619.5 Add - { - if (high_gain_mode==1) - { - //hw_set_dxx_reg(phw_data, 0x0C, 0xf8f52230); - //hw_set_dxx_reg(phw_data, 0x20, 0x06C43440); - Wb35Reg_Write( pHwData, 0x100C, 0xF2F32232 ); // 940916 0xf8f52230 ); - Wb35Reg_Write( pHwData, 0x1020, 0x04cb3440 ); // 940915 0x06C43440 - } - else if (high_gain_mode==0) - { - //hw_set_dxx_reg(phw_data, 0x0C, 0xEEEE000D); - //hw_set_dxx_reg(phw_data, 0x20, 0x06c41440); - Wb35Reg_Write( pHwData, 0x100C, 0xEEEE000D ); - Wb35Reg_Write( pHwData, 0x1020, 0x04cb1440 ); // 940915 0x06c41440 - } - #ifdef _PE_DTO_DUMP_ - WBDEBUG(("[HHDTOAGC] **rssi=%d, high gain mode=%d", rssi, high_gain_mode)); - #endif - } -} - -void TxPwrControl(MTO_FUNC_INPUT) -{ - s32 rssi; - hw_data_t *pHwData = MTO_HAL(); - - sme_get_rssi(MTO_FUNC_INPUT_DATA, &rssi); - if( (RF_WB_242 == pHwData->phy_type) || - (RF_WB_242_1 == pHwData->phy_type) ) // 20060619.5 Add - { - static u8 high_gain_mode; //this is for winbond RF switch LNA - //using different register setting - - if (high_gain_mode==1) - { - if( rssi > MTO_DATA().RSSI_high ) - { - //hw_set_dxx_reg(phw_data, 0x0C, 0xf8f52230); - //hw_set_dxx_reg(phw_data, 0x20, 0x05541640); - high_gain_mode=0; - } - else - { - //hw_set_dxx_reg(phw_data, 0x0C, 0xf8f51830); - //hw_set_dxx_reg(phw_data, 0x20, 0x05543E40); - high_gain_mode=1; - } - } - else //if (high_gain_mode==0) - { - if( rssi < MTO_DATA().RSSI_low ) - { - //hw_set_dxx_reg(phw_data, 0x0C, 0xf8f51830); - //hw_set_dxx_reg(phw_data, 0x20, 0x05543E40); - high_gain_mode=1; - } - else - { - //hw_set_dxx_reg(phw_data, 0x0C, 0xf8f52230); - //hw_set_dxx_reg(phw_data, 0x20, 0x05541640); - high_gain_mode=0; - } - } - - // Always high gain 20051014. Using the initial value only. - multiagc(MTO_FUNC_INPUT_DATA, high_gain_mode); - } -} - - -u8 CalcNewRate(MTO_FUNC_INPUT, u8 old_rate, u32 retry_cnt, u32 tx_frag_cnt) -{ - int i; - u8 new_rate; - u32 retry_rate; - int TxThrouput1, TxThrouput2, TxThrouput3, BestThroupht; - - if(tx_frag_cnt < MTOPARA_TXCOUNT_TH_FOR_CALC_RATE()) //too few packets transmit - { - return 0xff; - } - retry_rate = Divide(retry_cnt * 100, tx_frag_cnt); - - if(retry_rate > 90) retry_rate = 90; //always truncate to 90% due to lookup table size - #ifdef _PE_DTO_DUMP_ - WBDEBUG(("##### Current level =%d, Retry count =%d, Frag count =%d\n", - old_rate, retry_cnt, tx_frag_cnt)); - WBDEBUG(("*##* Retry rate =%d, throughput =%d\n", - retry_rate, Rate_PER_TBL[retry_rate][old_rate])); - WBDEBUG(("TxRateRec.tx_rate =%d, Retry rate = %d, throughput = %d\n", - TxRateRec.tx_rate, TxRateRec.tx_retry_rate, - Rate_PER_TBL[TxRateRec.tx_retry_rate][Level2PerTbl[TxRateRec.tx_rate]])); - WBDEBUG(("old_rate-1 =%d, Retry rate = %d, throughput = %d\n", - old_rate-1, retryrate_rec[old_rate-1], - Rate_PER_TBL[retryrate_rec[old_rate-1]][old_rate-1])); - WBDEBUG(("old_rate+1 =%d, Retry rate = %d, throughput = %d\n", - old_rate+1, retryrate_rec[old_rate+1], - Rate_PER_TBL[retryrate_rec[old_rate+1]][old_rate+1])); - #endif - - //following is for record the retry rate at the different data rate - if (abs(retry_rate-retryrate_rec[old_rate])<50)//---the per TH - retryrate_rec[old_rate] = retry_rate; //update retry rate - else - { - for (i=0;i<MTO_DataRateAvailableLevel;i++) //reset all retry rate - retryrate_rec[i]=0; - retryrate_rec[old_rate] = retry_rate; - #ifdef _PE_DTO_DUMP_ - WBDEBUG(("Reset retry rate table\n")); - #endif - } - - if(TxRateRec.tx_rate > old_rate) //Decrease Tx Rate - { - TxThrouput1 = Rate_PER_TBL[TxRateRec.tx_retry_rate][Level2PerTbl[TxRateRec.tx_rate]]; - TxThrouput2 = Rate_PER_TBL[retry_rate][Level2PerTbl[old_rate]]; - if(TxThrouput1 > TxThrouput2) - { - new_rate = TxRateRec.tx_rate; - BestThroupht = TxThrouput1; - } - else - { - new_rate = old_rate; - BestThroupht = TxThrouput2; - } - if((old_rate > 0) &&(retry_rate>MTOPARA_TXRATE_DEC_TH())) //Min Rate - { - TxThrouput3 = Rate_PER_TBL[retryrate_rec[old_rate-1]][Level2PerTbl[old_rate-1]]; - if(BestThroupht < TxThrouput3) - { - new_rate = old_rate - 1; - #ifdef _PE_DTO_DUMP_ - WBDEBUG(("--------\n")); - #endif - BestThroupht = TxThrouput3; - } - } - } - else if(TxRateRec.tx_rate < old_rate) //Increase Tx Rate - { - TxThrouput1 = Rate_PER_TBL[TxRateRec.tx_retry_rate][Level2PerTbl[TxRateRec.tx_rate]]; - TxThrouput2 = Rate_PER_TBL[retry_rate][Level2PerTbl[old_rate]]; - if(TxThrouput1 > TxThrouput2) - { - new_rate = TxRateRec.tx_rate; - BestThroupht = TxThrouput1; - } - else - { - new_rate = old_rate; - BestThroupht = TxThrouput2; - } - if ((old_rate < MTO_DataRateAvailableLevel - 1)&&(retry_rate<MTOPARA_TXRATE_INC_TH())) - { - //TxThrouput3 = Rate_PER_TBL[retryrate_rec[old_rate+1]][Level2PerTbl[old_rate+1]]; - if (retryrate_rec[old_rate+1] > MTOPARA_TXRETRYRATE_REDUCE()) - TxThrouput3 = Rate_PER_TBL[retryrate_rec[old_rate+1]-MTOPARA_TXRETRYRATE_REDUCE()][Level2PerTbl[old_rate+1]]; - else - TxThrouput3 = Rate_PER_TBL[retryrate_rec[old_rate+1]][Level2PerTbl[old_rate+1]]; - if(BestThroupht < TxThrouput3) - { - new_rate = old_rate + 1; - #ifdef _PE_DTO_DUMP_ - WBDEBUG(("++++++++++\n")); - #endif - BestThroupht = TxThrouput3; - } - } - } - else //Tx Rate no change - { - TxThrouput2 = Rate_PER_TBL[retry_rate][Level2PerTbl[old_rate]]; - new_rate = old_rate; - BestThroupht = TxThrouput2; - - if (retry_rate <MTOPARA_TXRATE_EQ_TH()) //th for change higher rate - { - if(old_rate < MTO_DataRateAvailableLevel - 1) - { - //TxThrouput3 = Rate_PER_TBL[retryrate_rec[old_rate+1]][Level2PerTbl[old_rate+1]]; - if (retryrate_rec[old_rate+1] > MTOPARA_TXRETRYRATE_REDUCE()) - TxThrouput3 = Rate_PER_TBL[retryrate_rec[old_rate+1]-MTOPARA_TXRETRYRATE_REDUCE()][Level2PerTbl[old_rate+1]]; - else - TxThrouput3 = Rate_PER_TBL[retryrate_rec[old_rate+1]][Level2PerTbl[old_rate+1]]; - if(BestThroupht < TxThrouput3) - { - new_rate = old_rate + 1; - BestThroupht = TxThrouput3; - #ifdef _PE_DTO_DUMP_ - WBDEBUG(("=++++++++++\n")); - #endif - } - } - } - else - if(old_rate > 0) //Min Rate - { - TxThrouput3 = Rate_PER_TBL[retryrate_rec[old_rate-1]][Level2PerTbl[old_rate-1]]; - if(BestThroupht < TxThrouput3) - { - new_rate = old_rate - 1; - #ifdef _PE_DTO_DUMP_ - WBDEBUG(("=--------\n")); - #endif - BestThroupht = TxThrouput3; - } } + } else { /* follow the setting from EEPROM */ + MTOPARA_TXPOWER_INDEX() = MTO_TXPOWER_FROM_EEPROM; } + RFSynthesizer_SetPowerIndex(MTO_HAL(), (u8) MTOPARA_TXPOWER_INDEX()); + /* ------------------------------------------------ */ - if (!LOCAL_IS_IBSS_MODE()) - { - max_rssi_rate = GetMaxRateLevelFromRSSI(); - #ifdef _PE_DTO_DUMP_ - WBDEBUG(("[MTO]:RSSI2Rate=%d\n", MTO_Data_Rate_Tbl[max_rssi_rate])); - #endif - if(new_rate > max_rssi_rate) - new_rate = max_rssi_rate; - } - - //save new rate; - TxRateRec.tx_rate = old_rate; - TxRateRec.tx_retry_rate = (u8) retry_rate; - TxRetryRate = retry_rate; - return new_rate; -} - -void SmoothRSSI(s32 new_rssi) -{ - RSSISmoothed = RSSISmoothed + new_rssi - RSSIBuf[RSSIBufIndex]; - RSSIBuf[RSSIBufIndex] = new_rssi; - RSSIBufIndex = (RSSIBufIndex + 1) % 10; + /* For RSSI turning -- Cancel load from EEPROM */ + MTO_DATA().RSSI_high = -41; + MTO_DATA().RSSI_low = -60; } -u8 GetMaxRateLevelFromRSSI(void) -{ - u8 i; - u8 TxRate; - - for(i=0;i<RSSI2RATE_SIZE;i++) - { - if(RSSISmoothed > RSSI2RateTbl[i].RSSI) - break; - } - #ifdef _PE_DTO_DUMP_ - WBDEBUG(("[MTO]:RSSI=%d\n", Divide(RSSISmoothed, 10))); - #endif - if(i < RSSI2RATE_SIZE) - TxRate = RSSI2RateTbl[i].TxRate; - else - TxRate = 2; //divided by 2 = 1Mbps - - for(i=MTO_DataRateAvailableLevel-1;i>0;i--) - { - if(TxRate >=MTO_Data_Rate_Tbl[i]) - break; - } - return i; -} +/* =========================================================================== + * Description: + * If we enable DTO, we will ignore the tx count with different tx rate + * from DTO rate. This is because when we adjust DTO tx rate, there could + * be some packets in the tx queue with previous tx rate + */ -//=========================================================================== -// Description: -// If we enable DTO, we will ignore the tx count with different tx rate from -// DTO rate. This is because when we adjust DTO tx rate, there could be some -// packets in the tx queue with previous tx rate -void MTO_SetTxCount(MTO_FUNC_INPUT, u8 tx_rate, u8 index) +void MTO_SetTxCount(struct wbsoft_priv *adapter, u8 tx_rate, u8 index) { MTO_TXFLOWCOUNT()++; - if ((MTO_ENABLE==1) && (MTO_RATE_CHANGE_ENABLE()==1)) - { - if(tx_rate == MTO_DATA_RATE()) - { - if (index == 0) - { + if ((MTO_ENABLE == 1) && (MTO_RATE_CHANGE_ENABLE() == 1)) { + if (tx_rate == MTO_DATA_RATE()) { + if (index == 0) { if (boSparseTxTraffic) MTO_HAL()->dto_tx_frag_count += MTOPARA_PERIODIC_CHECK_CYCLE(); else MTO_HAL()->dto_tx_frag_count += 1; - } - else - { - if (index<8) - { + } else { + if (index < 8) { MTO_HAL()->dto_tx_retry_count += index; - MTO_HAL()->dto_tx_frag_count += (index+1); - } - else - { + MTO_HAL()->dto_tx_frag_count += (index + 1); + } else { MTO_HAL()->dto_tx_retry_count += 7; MTO_HAL()->dto_tx_frag_count += 7; } } - } - else if(MTO_DATA_RATE()>48 && tx_rate ==48) - {//ALFRED - if (index<3) //for reduciing data rate scheme , - //do not calcu different data rate - //3 is the reducing data rate at retry - { + } else if (MTO_DATA_RATE() > 48 && tx_rate == 48) { + /* for reducing data rate scheme, do not calculate different data rate. 3 is the reducing data rate at retry. */ + if (index < 3) { MTO_HAL()->dto_tx_retry_count += index; - MTO_HAL()->dto_tx_frag_count += (index+1); - } - else - { + MTO_HAL()->dto_tx_frag_count += (index + 1); + } else { MTO_HAL()->dto_tx_retry_count += 3; MTO_HAL()->dto_tx_frag_count += 3; } } - } - else - { + } else { MTO_HAL()->dto_tx_retry_count += index; - MTO_HAL()->dto_tx_frag_count += (index+1); + MTO_HAL()->dto_tx_frag_count += (index + 1); } - TotalTxPkt ++; - TotalTxPktRetry += (index+1); - - PeriodTotalTxPkt ++; - PeriodTotalTxPktRetry += (index+1); -} - -u8 MTO_GetTxFallbackRate(MTO_FUNC_INPUT) -{ - return MTO_DATA_FALLBACK_RATE(); -} - - -//=========================================================================== -// MTO_TxFailed -- -// -// Description: -// Failure of transmitting a packet indicates that certain MTO parmeters -// may need to be adjusted. This function is called when NIC just failed -// to transmit a packet or when MSDULifeTime expired. -// -// Arguments: -// Adapter - The pointer to the Miniport Adapter Context -// -// Return Value: -// None -//============================================================================ -void MTO_TxFailed(MTO_FUNC_INPUT) -{ - return; } - -int Divide(int a, int b) -{ - if (b==0) b=1; - return a/b; -} - - diff --git a/drivers/staging/winbond/mto.h b/drivers/staging/winbond/mto.h index f47936f46d1..8d41eeda45b 100644 --- a/drivers/staging/winbond/mto.h +++ b/drivers/staging/winbond/mto.h @@ -1,192 +1,115 @@ -//================================================================== -// MTO.H -// -// Revision history -//================================= -// 20030110 UN20 Pete Chao -// Initial Release -// -// Copyright (c) 2003 Winbond Electronics Corp. All rights reserved. -//================================================================== +/* + * ================================================================== + * MTO.H + * + * Copyright (c) 2003 Winbond Electronics Corp. All rights reserved. + * ================================================================== + */ #ifndef __MTO_H__ #define __MTO_H__ -#define MTO_DEFAULT_TH_CNT 5 -#define MTO_DEFAULT_TH_SQ3 112 //OLD IS 13 reference JohnXu -#define MTO_DEFAULT_TH_IDLE_SLOT 15 -#define MTO_DEFAULT_TH_PR_INTERF 30 -#define MTO_DEFAULT_TMR_AGING 25 // unit: slot time 10 reference JohnXu -#define MTO_DEFAULT_TMR_PERIODIC 5 // unit: slot time +#include <linux/types.h> -#define MTO_ANTENNA_DIVERSITY_OFF 0 -#define MTO_ANTENNA_DIVERSITY_ON 1 +struct wbsoft_priv; -// LA20040210_DTO kevin -//#define MTO_PREAMBLE_LONG 0 -//#define MTO_PREAMBLE_SHORT 1 #define MTO_PREAMBLE_LONG WLAN_PREAMBLE_TYPE_LONG #define MTO_PREAMBLE_SHORT WLAN_PREAMBLE_TYPE_SHORT -typedef enum { - TOGGLE_STATE_IDLE = 0, - TOGGLE_STATE_WAIT0 = 1, - TOGGLE_STATE_WAIT1 = 2, - TOGGLE_STATE_MAKEDESISION = 3, - TOGGLE_STATE_BKOFF = 4 -} TOGGLE_STATE; - -typedef enum { - RATE_CHGSTATE_IDLE = 0, - RATE_CHGSTATE_CALCULATE = 1, - RATE_CHGSTATE_BACKOFF = 2 -} TX_RATE_REDUCTION_STATE; - -//============================================================================ -// struct _MTOParameters -- -// -// Defines the parameters used in the MAC Throughput Optimization algorithm -//============================================================================ -typedef struct _MTO_PARAMETERS -{ - u8 Th_Fixant; - u8 Th_Cnt; - u8 Th_SQ3; - u8 Th_IdleSlot; - - u16 Tmr_Aging; - u8 Th_PrInterf; - u8 Tmr_Periodic; - - //--------- wkchen added ------------- - u32 TxFlowCount; //to judge what kind the tx flow(sparse or busy) is - //------------------------------------------------ - - //--------- DTO threshold parameters ------------- - u16 DTO_PeriodicCheckCycle; - u16 DTO_RssiThForAntDiv; - - u16 DTO_TxCountThForCalcNewRate; - u16 DTO_TxRateIncTh; - - u16 DTO_TxRateDecTh; - u16 DTO_TxRateEqTh; - - u16 DTO_TxRateBackOff; - u16 DTO_TxRetryRateReduce; - - u16 DTO_TxPowerIndex; //0 ~ 31 - u16 reserved_1; - //------------------------------------------------ - - u8 PowerChangeEnable; - u8 AntDiversityEnable; - u8 Ant_mac; - u8 Ant_div; - - u8 CCA_Mode; - u8 CCA_Mode_Setup; - u8 Preamble_Type; - u8 PreambleChangeEnable; - - u8 DataRateLevel; - u8 DataRateChangeEnable; - u8 FragThresholdLevel; - u8 FragThresholdChangeEnable; - - u16 RTSThreshold; - u16 RTSThreshold_Setup; - - u32 AvgIdleSlot; - u32 Pr_Interf; - u32 AvgGapBtwnInterf; - - u8 RTSChangeEnable; - u8 Ant_sel; - u8 aging_timeout; - u8 reserved_2; - - u32 Cnt_Ant[2]; - u32 SQ_Ant[2]; - -// 20040510 remove from globe vairable - u32 TmrCnt; - u32 BackoffTmr; - TOGGLE_STATE ToggleState; - TX_RATE_REDUCTION_STATE TxRateReductionState; - - u8 Last_Rate; - u8 Co_efficent; - u8 FallbackRateLevel; - u8 OfdmRateLevel; - - u8 RatePolicy; - u8 reserved_3[3]; - - // For RSSI turning - s32 RSSI_high; - s32 RSSI_low; - -} MTO_PARAMETERS, *PMTO_PARAMETERS; - - -#define MTO_FUNC_INPUT PWB32_ADAPTER Adapter -#define MTO_FUNC_INPUT_DATA Adapter -#define MTO_DATA() (Adapter->sMtoPara) -#define MTO_HAL() (&Adapter->sHwData) -#define MTO_SET_PREAMBLE_TYPE(x) // 20040511 Turbo mark LM_PREAMBLE_TYPE(&pcore_data->lm_data) = (x) -#define MTO_ENABLE (Adapter->sLocalPara.TxRateMode == RATE_AUTO) -#define MTO_TXPOWER_FROM_EEPROM (Adapter->sHwData.PowerIndexFromEEPROM) -#define LOCAL_ANTENNA_NO() (Adapter->sLocalPara.bAntennaNo) -#define LOCAL_IS_CONNECTED() (Adapter->sLocalPara.wConnectedSTAindex != 0) -#define LOCAL_IS_IBSS_MODE() (Adapter->asBSSDescriptElement[Adapter->sLocalPara.wConnectedSTAindex].bBssType == IBSS_NET) -#define MTO_INITTXRATE_MODE (Adapter->sHwData.SoftwareSet&0x2) //bit 1 -// 20040510 Turbo add -#define MTO_TMR_CNT() MTO_DATA().TmrCnt -#define MTO_TOGGLE_STATE() MTO_DATA().ToggleState -#define MTO_TX_RATE_REDUCTION_STATE() MTO_DATA().TxRateReductionState -#define MTO_BACKOFF_TMR() MTO_DATA().BackoffTmr -#define MTO_LAST_RATE() MTO_DATA().Last_Rate -#define MTO_CO_EFFICENT() MTO_DATA().Co_efficent - -#define MTO_TH_CNT() MTO_DATA().Th_Cnt -#define MTO_TH_SQ3() MTO_DATA().Th_SQ3 -#define MTO_TH_IDLE_SLOT() MTO_DATA().Th_IdleSlot -#define MTO_TH_PR_INTERF() MTO_DATA().Th_PrInterf - -#define MTO_TMR_AGING() MTO_DATA().Tmr_Aging -#define MTO_TMR_PERIODIC() MTO_DATA().Tmr_Periodic - -#define MTO_POWER_CHANGE_ENABLE() MTO_DATA().PowerChangeEnable -#define MTO_ANT_DIVERSITY_ENABLE() Adapter->sLocalPara.boAntennaDiversity -#define MTO_ANT_MAC() MTO_DATA().Ant_mac -#define MTO_ANT_DIVERSITY() MTO_DATA().Ant_div -#define MTO_CCA_MODE() MTO_DATA().CCA_Mode -#define MTO_CCA_MODE_SETUP() MTO_DATA().CCA_Mode_Setup -#define MTO_PREAMBLE_TYPE() MTO_DATA().Preamble_Type -#define MTO_PREAMBLE_CHANGE_ENABLE() MTO_DATA().PreambleChangeEnable - -#define MTO_RATE_LEVEL() MTO_DATA().DataRateLevel -#define MTO_FALLBACK_RATE_LEVEL() MTO_DATA().FallbackRateLevel +/* Defines the parameters used in the MAC Throughput Optimization algorithm */ +struct wb35_mto_params { + u32 TxFlowCount; /* to judge what kind the tx flow(sparse or busy) is */ + + /* --------- DTO threshold parameters ------------- */ + u16 DTO_PeriodicCheckCycle; + u16 DTO_RssiThForAntDiv; + + u16 DTO_TxCountThForCalcNewRate; + u16 DTO_TxRateIncTh; + + u16 DTO_TxRateDecTh; + u16 DTO_TxRateEqTh; + + u16 DTO_TxRateBackOff; + u16 DTO_TxRetryRateReduce; + + u16 DTO_TxPowerIndex; /* 0 ~ 31 */ + u16 reserved_1; + /* ------------------------------------------------ */ + + u8 PowerChangeEnable; + u8 AntDiversityEnable; + u8 CCA_Mode; + u8 CCA_Mode_Setup; + u8 Preamble_Type; + u8 PreambleChangeEnable; + + u8 DataRateLevel; + u8 DataRateChangeEnable; + u8 FragThresholdLevel; + u8 FragThresholdChangeEnable; + + u16 RTSThreshold; + u16 RTSThreshold_Setup; + + u32 AvgIdleSlot; + u32 Pr_Interf; + u32 AvgGapBtwnInterf; + + u8 RTSChangeEnable; + u8 Ant_sel; + u8 aging_timeout; + u8 reserved_2; + + u32 Cnt_Ant[2]; + u32 SQ_Ant[2]; + + u8 FallbackRateLevel; + u8 OfdmRateLevel; + + u8 RatePolicy; + u8 reserved_3[3]; + + /* For RSSI turning */ + s32 RSSI_high; + s32 RSSI_low; +}; + + +#define MTO_DATA() (adapter->sMtoPara) +#define MTO_HAL() (&adapter->sHwData) +#define MTO_SET_PREAMBLE_TYPE(x) /* Turbo mark LM_PREAMBLE_TYPE(&pcore_data->lm_data) = (x) */ +#define MTO_ENABLE (adapter->sLocalPara.TxRateMode == RATE_AUTO) +#define MTO_TXPOWER_FROM_EEPROM (adapter->sHwData.PowerIndexFromEEPROM) +#define LOCAL_ANTENNA_NO() (adapter->sLocalPara.bAntennaNo) +#define LOCAL_IS_CONNECTED() (adapter->sLocalPara.wConnectedSTAindex != 0) +#define MTO_INITTXRATE_MODE (adapter->sHwData.SoftwareSet&0x2) /* bit 1 */ + +#define MTO_POWER_CHANGE_ENABLE() MTO_DATA().PowerChangeEnable +#define MTO_CCA_MODE() MTO_DATA().CCA_Mode +#define MTO_CCA_MODE_SETUP() MTO_DATA().CCA_Mode_Setup +#define MTO_PREAMBLE_TYPE() MTO_DATA().Preamble_Type +#define MTO_PREAMBLE_CHANGE_ENABLE() MTO_DATA().PreambleChangeEnable + +#define MTO_RATE_LEVEL() MTO_DATA().DataRateLevel #define MTO_OFDM_RATE_LEVEL() MTO_DATA().OfdmRateLevel -#define MTO_RATE_CHANGE_ENABLE() MTO_DATA().DataRateChangeEnable -#define MTO_FRAG_TH_LEVEL() MTO_DATA().FragThresholdLevel -#define MTO_FRAG_CHANGE_ENABLE() MTO_DATA().FragThresholdChangeEnable -#define MTO_RTS_THRESHOLD() MTO_DATA().RTSThreshold -#define MTO_RTS_CHANGE_ENABLE() MTO_DATA().RTSChangeEnable -#define MTO_RTS_THRESHOLD_SETUP() MTO_DATA().RTSThreshold_Setup +#define MTO_RATE_CHANGE_ENABLE() MTO_DATA().DataRateChangeEnable +#define MTO_FRAG_TH_LEVEL() MTO_DATA().FragThresholdLevel +#define MTO_FRAG_CHANGE_ENABLE() MTO_DATA().FragThresholdChangeEnable +#define MTO_RTS_THRESHOLD() MTO_DATA().RTSThreshold +#define MTO_RTS_CHANGE_ENABLE() MTO_DATA().RTSChangeEnable +#define MTO_RTS_THRESHOLD_SETUP() MTO_DATA().RTSThreshold_Setup -#define MTO_AVG_IDLE_SLOT() MTO_DATA().AvgIdleSlot -#define MTO_PR_INTERF() MTO_DATA().Pr_Interf -#define MTO_AVG_GAP_BTWN_INTERF() MTO_DATA().AvgGapBtwnInterf +#define MTO_AVG_IDLE_SLOT() MTO_DATA().AvgIdleSlot +#define MTO_PR_INTERF() MTO_DATA().Pr_Interf +#define MTO_AVG_GAP_BTWN_INTERF() MTO_DATA().AvgGapBtwnInterf -#define MTO_ANT_SEL() MTO_DATA().Ant_sel -#define MTO_CNT_ANT(x) MTO_DATA().Cnt_Ant[(x)] -#define MTO_SQ_ANT(x) MTO_DATA().SQ_Ant[(x)] -#define MTO_AGING_TIMEOUT() MTO_DATA().aging_timeout +#define MTO_CNT_ANT(x) MTO_DATA().Cnt_Ant[(x)] +#define MTO_SQ_ANT(x) MTO_DATA().SQ_Ant[(x)] +#define MTO_AGING_TIMEOUT() MTO_DATA().aging_timeout +#define MTO_TXFLOWCOUNT() MTO_DATA().TxFlowCount -#define MTO_TXFLOWCOUNT() MTO_DATA().TxFlowCount -//--------- DTO threshold parameters ------------- +/* --------- DTO threshold parameters ------------- */ #define MTOPARA_PERIODIC_CHECK_CYCLE() MTO_DATA().DTO_PeriodicCheckCycle #define MTOPARA_RSSI_TH_FOR_ANTDIV() MTO_DATA().DTO_RssiThForAntDiv #define MTOPARA_TXCOUNT_TH_FOR_CALC_RATE() MTO_DATA().DTO_TxCountThForCalcNewRate @@ -196,70 +119,16 @@ typedef struct _MTO_PARAMETERS #define MTOPARA_TXRATE_BACKOFF() MTO_DATA().DTO_TxRateBackOff #define MTOPARA_TXRETRYRATE_REDUCE() MTO_DATA().DTO_TxRetryRateReduce #define MTOPARA_TXPOWER_INDEX() MTO_DATA().DTO_TxPowerIndex -//------------------------------------------------ - - -extern u8 MTO_Data_Rate_Tbl[]; -extern u16 MTO_Frag_Th_Tbl[]; - -#define MTO_DATA_RATE() MTO_Data_Rate_Tbl[MTO_RATE_LEVEL()] -#define MTO_DATA_FALLBACK_RATE() MTO_Data_Rate_Tbl[MTO_FALLBACK_RATE_LEVEL()] //next level -#define MTO_FRAG_TH() MTO_Frag_Th_Tbl[MTO_FRAG_TH_LEVEL()] - -typedef struct { - u8 tx_rate; - u8 tx_retry_rate; -} TXRETRY_REC; - -typedef struct _STATISTICS_INFO { - u32 Rate54M; - u32 Rate48M; - u32 Rate36M; - u32 Rate24M; - u32 Rate18M; - u32 Rate12M; - u32 Rate9M; - u32 Rate6M; - u32 Rate11MS; - u32 Rate11ML; - u32 Rate55MS; - u32 Rate55ML; - u32 Rate2MS; - u32 Rate2ML; - u32 Rate1M; - u32 Rate54MOK; - u32 Rate48MOK; - u32 Rate36MOK; - u32 Rate24MOK; - u32 Rate18MOK; - u32 Rate12MOK; - u32 Rate9MOK; - u32 Rate6MOK; - u32 Rate11MSOK; - u32 Rate11MLOK; - u32 Rate55MSOK; - u32 Rate55MLOK; - u32 Rate2MSOK; - u32 Rate2MLOK; - u32 Rate1MOK; - u32 SQ3; - s32 RSSIAVG; - s32 RSSIMAX; - s32 TXRATE; - s32 TxRetryRate; - s32 BSS_PK_CNT; - s32 NIDLESLOT; - s32 SLOT_CNT; - s32 INTERF_CNT; - s32 GAP_CNT; - s32 DS_EVM; - s32 RcvBeaconNum; - s32 RXRATE; - s32 RxBytes; - s32 TxBytes; - s32 Antenna; -} STATISTICS_INFO, *PSTATISTICS_INFO; - -#endif //__MTO_H__ +/* ------------------------------------------------ */ + + +extern u16 MTO_Frag_Th_Tbl[]; + +#define MTO_DATA_RATE() MTO_Data_Rate_Tbl[MTO_RATE_LEVEL()] +#define MTO_FRAG_TH() MTO_Frag_Th_Tbl[MTO_FRAG_TH_LEVEL()] + +void MTO_Init(struct wbsoft_priv *); +void MTO_SetTxCount(struct wbsoft_priv *adapter, u8 t0, u8 index); +#endif /* __MTO_H__ */ diff --git a/drivers/staging/winbond/mto_f.h b/drivers/staging/winbond/mto_f.h deleted file mode 100644 index 30b3df2ccb3..00000000000 --- a/drivers/staging/winbond/mto_f.h +++ /dev/null @@ -1,7 +0,0 @@ -extern void MTO_Init(PWB32_ADAPTER); -extern void MTO_PeriodicTimerExpired(PWB32_ADAPTER); -extern void MTO_SetDTORateRange(PWB32_ADAPTER, u8 *, u8); -extern u8 MTO_GetTxRate(MTO_FUNC_INPUT, u32 fpdu_len); -extern u8 MTO_GetTxFallbackRate(MTO_FUNC_INPUT); -extern void MTO_SetTxCount(MTO_FUNC_INPUT, u8 t0, u8 index); - diff --git a/drivers/staging/winbond/os_common.h b/drivers/staging/winbond/os_common.h deleted file mode 100644 index e24ff41e871..00000000000 --- a/drivers/staging/winbond/os_common.h +++ /dev/null @@ -1,2 +0,0 @@ -#include "linux/sysdef.h" - diff --git a/drivers/staging/winbond/phy_calibration.c b/drivers/staging/winbond/phy_calibration.c index 272a65066ab..8aecced62dd 100644 --- a/drivers/staging/winbond/phy_calibration.c +++ b/drivers/staging/winbond/phy_calibration.c @@ -10,400 +10,330 @@ */ /****************** INCLUDE FILES SECTION ***********************************/ -#include "os_common.h" #include "phy_calibration.h" +#include "wbhal.h" +#include "wb35reg_f.h" +#include "core.h" /****************** DEBUG CONSTANT AND MACRO SECTION ************************/ /****************** LOCAL CONSTANT AND MACRO SECTION ************************/ #define LOOP_TIMES 20 -#define US 1000//MICROSECOND +#define US 1000/* MICROSECOND*/ #define AG_CONST 0.6072529350 #define FIXED(X) ((s32)((X) * 32768.0)) -#define DEG2RAD(X) 0.017453 * (X) - -/****************** LOCAL TYPE DEFINITION SECTION ***************************/ -typedef s32 fixed; /* 16.16 fixed-point */ - -static const fixed Angles[]= -{ - FIXED(DEG2RAD(45.0)), FIXED(DEG2RAD(26.565)), FIXED(DEG2RAD(14.0362)), - FIXED(DEG2RAD(7.12502)), FIXED(DEG2RAD(3.57633)), FIXED(DEG2RAD(1.78991)), - FIXED(DEG2RAD(0.895174)),FIXED(DEG2RAD(0.447614)),FIXED(DEG2RAD(0.223811)), - FIXED(DEG2RAD(0.111906)),FIXED(DEG2RAD(0.055953)),FIXED(DEG2RAD(0.027977)) +#define DEG2RAD(X) (0.017453 * (X)) + +static const s32 Angles[] = { + FIXED(DEG2RAD(45.0)), FIXED(DEG2RAD(26.565)), + FIXED(DEG2RAD(14.0362)), FIXED(DEG2RAD(7.12502)), + FIXED(DEG2RAD(3.57633)), FIXED(DEG2RAD(1.78991)), + FIXED(DEG2RAD(0.895174)), FIXED(DEG2RAD(0.447614)), + FIXED(DEG2RAD(0.223811)), FIXED(DEG2RAD(0.111906)), + FIXED(DEG2RAD(0.055953)), FIXED(DEG2RAD(0.027977)) }; /****************** LOCAL FUNCTION DECLARATION SECTION **********************/ -//void _phy_rf_write_delay(hw_data_t *phw_data); -//void phy_init_rf(hw_data_t *phw_data); + +/* + * void _phy_rf_write_delay(struct hw_data *phw_data); + * void phy_init_rf(struct hw_data *phw_data); + */ /****************** FUNCTION DEFINITION SECTION *****************************/ -s32 _s13_to_s32(u32 data) +static s32 _s13_to_s32(u32 data) { - u32 val; + u32 val; - val = (data & 0x0FFF); + val = (data & 0x0FFF); - if ((data & BIT(12)) != 0) - { - val |= 0xFFFFF000; - } + if ((data & BIT(12)) != 0) + val |= 0xFFFFF000; - return ((s32) val); + return (s32) val; } -u32 _s32_to_s13(s32 data) +/****************************************************************************/ +static s32 _s4_to_s32(u32 data) { - u32 val; + s32 val; - if (data > 4095) - { - data = 4095; - } - else if (data < -4096) - { - data = -4096; - } + val = (data & 0x0007); - val = data & 0x1FFF; + if ((data & BIT(3)) != 0) + val |= 0xFFFFFFF8; - return val; + return val; } -/****************************************************************************/ -s32 _s4_to_s32(u32 data) +static u32 _s32_to_s4(s32 data) { - s32 val; + u32 val; - val = (data & 0x0007); + if (data > 7) + data = 7; + else if (data < -8) + data = -8; - if ((data & BIT(3)) != 0) - { - val |= 0xFFFFFFF8; - } + val = data & 0x000F; - return val; + return val; } -u32 _s32_to_s4(s32 data) +/****************************************************************************/ +static s32 _s5_to_s32(u32 data) { - u32 val; + s32 val; - if (data > 7) - { - data = 7; - } - else if (data < -8) - { - data = -8; - } + val = (data & 0x000F); - val = data & 0x000F; + if ((data & BIT(4)) != 0) + val |= 0xFFFFFFF0; - return val; + return val; } -/****************************************************************************/ -s32 _s5_to_s32(u32 data) +static u32 _s32_to_s5(s32 data) { - s32 val; + u32 val; - val = (data & 0x000F); + if (data > 15) + data = 15; + else if (data < -16) + data = -16; - if ((data & BIT(4)) != 0) - { - val |= 0xFFFFFFF0; - } + val = data & 0x001F; - return val; + return val; } -u32 _s32_to_s5(s32 data) +/****************************************************************************/ +static s32 _s6_to_s32(u32 data) { - u32 val; + s32 val; - if (data > 15) - { - data = 15; - } - else if (data < -16) - { - data = -16; - } + val = (data & 0x001F); - val = data & 0x001F; + if ((data & BIT(5)) != 0) + val |= 0xFFFFFFE0; - return val; + return val; } -/****************************************************************************/ -s32 _s6_to_s32(u32 data) +static u32 _s32_to_s6(s32 data) { - s32 val; + u32 val; - val = (data & 0x001F); + if (data > 31) + data = 31; + else if (data < -32) + data = -32; - if ((data & BIT(5)) != 0) - { - val |= 0xFFFFFFE0; - } + val = data & 0x003F; - return val; + return val; } -u32 _s32_to_s6(s32 data) +/****************************************************************************/ +static s32 _floor(s32 n) { - u32 val; - - if (data > 31) - { - data = 31; - } - else if (data < -32) - { - data = -32; - } - - val = data & 0x003F; + if (n > 0) + n += 5; + else + n -= 5; - return val; + return n/10; } /****************************************************************************/ -s32 _s9_to_s32(u32 data) +/* + * The following code is sqare-root function. + * sqsum is the input and the output is sq_rt; + * The maximum of sqsum = 2^27 -1; + */ +static u32 _sqrt(u32 sqsum) { - s32 val; + u32 sq_rt; + + int g0, g1, g2, g3, g4; + int seed; + int next; + int step; + + g4 = sqsum / 100000000; + g3 = (sqsum - g4*100000000) / 1000000; + g2 = (sqsum - g4*100000000 - g3*1000000) / 10000; + g1 = (sqsum - g4*100000000 - g3*1000000 - g2*10000) / 100; + g0 = (sqsum - g4*100000000 - g3*1000000 - g2*10000 - g1*100); + + next = g4; + step = 0; + seed = 0; + while (((seed+1)*(step+1)) <= next) { + step++; + seed++; + } - val = data & 0x00FF; + sq_rt = seed * 10000; + next = (next-(seed*step))*100 + g3; - if ((data & BIT(8)) != 0) - { - val |= 0xFFFFFF00; - } + step = 0; + seed = 2 * seed * 10; + while (((seed+1)*(step+1)) <= next) { + step++; + seed++; + } - return val; -} + sq_rt = sq_rt + step * 1000; + next = (next - seed * step) * 100 + g2; + seed = (seed + step) * 10; + step = 0; + while (((seed+1)*(step+1)) <= next) { + step++; + seed++; + } -u32 _s32_to_s9(s32 data) -{ - u32 val; + sq_rt = sq_rt + step * 100; + next = (next - seed * step) * 100 + g1; + seed = (seed + step) * 10; + step = 0; + + while (((seed+1)*(step+1)) <= next) { + step++; + seed++; + } - if (data > 255) - { - data = 255; - } - else if (data < -256) - { - data = -256; - } + sq_rt = sq_rt + step * 10; + next = (next - seed * step) * 100 + g0; + seed = (seed + step) * 10; + step = 0; - val = data & 0x01FF; + while (((seed+1)*(step+1)) <= next) { + step++; + seed++; + } - return val; + sq_rt = sq_rt + step; + + return sq_rt; } /****************************************************************************/ -s32 _floor(s32 n) +static void _sin_cos(s32 angle, s32 *sin, s32 *cos) { - if (n > 0) - { - n += 5; - } - else - { - n -= 5; - } - - return (n/10); + s32 X, Y, TargetAngle, CurrAngle; + unsigned Step; + + X = FIXED(AG_CONST); /* AG_CONST * cos(0) */ + Y = 0; /* AG_CONST * sin(0) */ + TargetAngle = abs(angle); + CurrAngle = 0; + + for (Step = 0; Step < 12; Step++) { + s32 NewX; + + if (TargetAngle > CurrAngle) { + NewX = X - (Y >> Step); + Y = (X >> Step) + Y; + X = NewX; + CurrAngle += Angles[Step]; + } else { + NewX = X + (Y >> Step); + Y = -(X >> Step) + Y; + X = NewX; + CurrAngle -= Angles[Step]; + } + } + + if (angle > 0) { + *cos = X; + *sin = Y; + } else { + *cos = X; + *sin = -Y; + } } -/****************************************************************************/ -// The following code is sqare-root function. -// sqsum is the input and the output is sq_rt; -// The maximum of sqsum = 2^27 -1; -u32 _sqrt(u32 sqsum) +static unsigned char hal_get_dxx_reg(struct hw_data *pHwData, u16 number, + u32 *pValue) { - u32 sq_rt; - - int g0, g1, g2, g3, g4; - int seed; - int next; - int step; - - g4 = sqsum / 100000000; - g3 = (sqsum - g4*100000000) /1000000; - g2 = (sqsum - g4*100000000 - g3*1000000) /10000; - g1 = (sqsum - g4*100000000 - g3*1000000 - g2*10000) /100; - g0 = (sqsum - g4*100000000 - g3*1000000 - g2*10000 - g1*100); - - next = g4; - step = 0; - seed = 0; - while (((seed+1)*(step+1)) <= next) - { - step++; - seed++; - } - - sq_rt = seed * 10000; - next = (next-(seed*step))*100 + g3; - - step = 0; - seed = 2 * seed * 10; - while (((seed+1)*(step+1)) <= next) - { - step++; - seed++; - } - - sq_rt = sq_rt + step * 1000; - next = (next - seed * step) * 100 + g2; - seed = (seed + step) * 10; - step = 0; - while (((seed+1)*(step+1)) <= next) - { - step++; - seed++; - } - - sq_rt = sq_rt + step * 100; - next = (next - seed * step) * 100 + g1; - seed = (seed + step) * 10; - step = 0; - - while (((seed+1)*(step+1)) <= next) - { - step++; - seed++; - } - - sq_rt = sq_rt + step * 10; - next = (next - seed* step) * 100 + g0; - seed = (seed + step) * 10; - step = 0; - - while (((seed+1)*(step+1)) <= next) - { - step++; - seed++; - } - - sq_rt = sq_rt + step; - - return sq_rt; + if (number < 0x1000) + number += 0x1000; + return Wb35Reg_ReadSync(pHwData, number, pValue); } +#define hw_get_dxx_reg(_A, _B, _C) hal_get_dxx_reg(_A, _B, (u32 *)_C) -/****************************************************************************/ -void _sin_cos(s32 angle, s32 *sin, s32 *cos) +static unsigned char hal_set_dxx_reg(struct hw_data *pHwData, u16 number, + u32 value) { - fixed X, Y, TargetAngle, CurrAngle; - unsigned Step; - - X=FIXED(AG_CONST); // AG_CONST * cos(0) - Y=0; // AG_CONST * sin(0) - TargetAngle=abs(angle); - CurrAngle=0; - - for (Step=0; Step < 12; Step++) - { - fixed NewX; - - if(TargetAngle > CurrAngle) - { - NewX=X - (Y >> Step); - Y=(X >> Step) + Y; - X=NewX; - CurrAngle += Angles[Step]; - } - else - { - NewX=X + (Y >> Step); - Y=-(X >> Step) + Y; - X=NewX; - CurrAngle -= Angles[Step]; - } - } - - if (angle > 0) - { - *cos = X; - *sin = Y; - } - else - { - *cos = X; - *sin = -Y; - } + unsigned char ret; + + if (number < 0x1000) + number += 0x1000; + ret = Wb35Reg_WriteSync(pHwData, number, value); + return ret; } +#define hw_set_dxx_reg(_A, _B, _C) hal_set_dxx_reg(_A, _B, (u32)_C) -void _reset_rx_cal(hw_data_t *phw_data) +static void _reset_rx_cal(struct hw_data *phw_data) { u32 val; hw_get_dxx_reg(phw_data, 0x54, &val); - if (phw_data->revision == 0x2002) // 1st-cut - { + if (phw_data->revision == 0x2002) /* 1st-cut */ val &= 0xFFFF0000; - } - else // 2nd-cut - { + else /* 2nd-cut */ val &= 0x000003FF; - } hw_set_dxx_reg(phw_data, 0x54, val); } -// ************for winbond calibration********* -// +/**************for winbond calibration*********/ + -// -// -// ********************************************* -void _rxadc_dc_offset_cancellation_winbond(hw_data_t *phw_data, u32 frequency) + +/**********************************************/ +static void _rxadc_dc_offset_cancellation_winbond(struct hw_data *phw_data, u32 frequency) { - u32 reg_agc_ctrl3; - u32 reg_a_acq_ctrl; - u32 reg_b_acq_ctrl; - u32 val; - - PHY_DEBUG(("[CAL] -> [1]_rxadc_dc_offset_cancellation()\n")); - phy_init_rf(phw_data); - - // set calibration channel - if( (RF_WB_242 == phw_data->phy_type) || - (RF_WB_242_1 == phw_data->phy_type) ) // 20060619.5 Add - { - if ((frequency >= 2412) && (frequency <= 2484)) - { - // w89rf242 change frequency to 2390Mhz - PHY_DEBUG(("[CAL] W89RF242/11G/Channel=2390Mhz\n")); + u32 reg_agc_ctrl3; + u32 reg_a_acq_ctrl; + u32 reg_b_acq_ctrl; + u32 val; + + PHY_DEBUG(("[CAL] -> [1]_rxadc_dc_offset_cancellation()\n")); + phy_init_rf(phw_data); + + /* set calibration channel */ + if ((RF_WB_242 == phw_data->phy_type) || + (RF_WB_242_1 == phw_data->phy_type)) /* 20060619.5 Add */{ + if ((frequency >= 2412) && (frequency <= 2484)) { + /* w89rf242 change frequency to 2390Mhz */ + PHY_DEBUG(("[CAL] W89RF242/11G/Channel=2390Mhz\n")); phy_set_rf_data(phw_data, 3, (3<<24)|0x025586); - } - } - else - { + } + } else { } - // reset cancel_dc_i[9:5] and cancel_dc_q[4:0] in register DC_Cancel + /* reset cancel_dc_i[9:5] and cancel_dc_q[4:0] in register DC_Cancel */ hw_get_dxx_reg(phw_data, 0x5C, &val); val &= ~(0x03FF); hw_set_dxx_reg(phw_data, 0x5C, val); - // reset the TX and RX IQ calibration data + /* reset the TX and RX IQ calibration data */ hw_set_dxx_reg(phw_data, 0x3C, 0); hw_set_dxx_reg(phw_data, 0x54, 0); - hw_set_dxx_reg(phw_data, 0x58, 0x30303030); // IQ_Alpha Changed + hw_set_dxx_reg(phw_data, 0x58, 0x30303030); /* IQ_Alpha Changed */ - // a. Disable AGC + /* a. Disable AGC */ hw_get_dxx_reg(phw_data, REG_AGC_CTRL3, ®_agc_ctrl3); reg_agc_ctrl3 &= ~BIT(2); reg_agc_ctrl3 |= (MASK_LNA_FIX_GAIN|MASK_AGC_FIX); @@ -413,7 +343,7 @@ void _rxadc_dc_offset_cancellation_winbond(hw_data_t *phw_data, u32 frequency) val |= MASK_AGC_FIX_GAIN; hw_set_dxx_reg(phw_data, REG_AGC_CTRL5, val); - // b. Turn off BB RX + /* b. Turn off BB RX */ hw_get_dxx_reg(phw_data, REG_A_ACQ_CTRL, ®_a_acq_ctrl); reg_a_acq_ctrl |= MASK_AMER_OFF_REG; hw_set_dxx_reg(phw_data, REG_A_ACQ_CTRL, reg_a_acq_ctrl); @@ -422,18 +352,17 @@ void _rxadc_dc_offset_cancellation_winbond(hw_data_t *phw_data, u32 frequency) reg_b_acq_ctrl |= MASK_BMER_OFF_REG; hw_set_dxx_reg(phw_data, REG_B_ACQ_CTRL, reg_b_acq_ctrl); - // c. Make sure MAC is in receiving mode - // d. Turn ON ADC calibration - // - ADC calibrator is triggered by this signal rising from 0 to 1 + /* c. Make sure MAC is in receiving mode + * d. Turn ON ADC calibration + * - ADC calibrator is triggered by this signal rising from 0 to 1 */ hw_get_dxx_reg(phw_data, REG_MODE_CTRL, &val); val &= ~MASK_ADC_DC_CAL_STR; hw_set_dxx_reg(phw_data, REG_MODE_CTRL, val); val |= MASK_ADC_DC_CAL_STR; hw_set_dxx_reg(phw_data, REG_MODE_CTRL, val); - pa_stall_execution(US); // *MUST* wait for a while - // e. The result are shown in "adc_dc_cal_i[8:0] and adc_dc_cal_q[8:0]" + /* e. The results are shown in "adc_dc_cal_i[8:0] and adc_dc_cal_q[8:0]" */ #ifdef _DEBUG hw_get_dxx_reg(phw_data, REG_OFFSET_READ, &val); PHY_DEBUG(("[CAL] REG_OFFSET_READ = 0x%08X\n", val)); @@ -441,302 +370,32 @@ void _rxadc_dc_offset_cancellation_winbond(hw_data_t *phw_data, u32 frequency) PHY_DEBUG(("[CAL] ** adc_dc_cal_i = %d (0x%04X)\n", _s9_to_s32(val&0x000001FF), val&0x000001FF)); PHY_DEBUG(("[CAL] ** adc_dc_cal_q = %d (0x%04X)\n", - _s9_to_s32((val&0x0003FE00)>>9), (val&0x0003FE00)>>9)); + _s9_to_s32((val&0x0003FE00)>>9), + (val&0x0003FE00)>>9)); #endif hw_get_dxx_reg(phw_data, REG_MODE_CTRL, &val); val &= ~MASK_ADC_DC_CAL_STR; hw_set_dxx_reg(phw_data, REG_MODE_CTRL, val); - // f. Turn on BB RX - //hw_get_dxx_reg(phw_data, REG_A_ACQ_CTRL, ®_a_acq_ctrl); + /* f. Turn on BB RX */ + /* hw_get_dxx_reg(phw_data, REG_A_ACQ_CTRL, ®_a_acq_ctrl); */ reg_a_acq_ctrl &= ~MASK_AMER_OFF_REG; hw_set_dxx_reg(phw_data, REG_A_ACQ_CTRL, reg_a_acq_ctrl); - //hw_get_dxx_reg(phw_data, REG_B_ACQ_CTRL, ®_b_acq_ctrl); + /* hw_get_dxx_reg(phw_data, REG_B_ACQ_CTRL, ®_b_acq_ctrl); */ reg_b_acq_ctrl &= ~MASK_BMER_OFF_REG; hw_set_dxx_reg(phw_data, REG_B_ACQ_CTRL, reg_b_acq_ctrl); - // g. Enable AGC - //hw_get_dxx_reg(phw_data, REG_AGC_CTRL3, &val); + /* g. Enable AGC */ + /* hw_get_dxx_reg(phw_data, REG_AGC_CTRL3, &val); */ reg_agc_ctrl3 |= BIT(2); reg_agc_ctrl3 &= ~(MASK_LNA_FIX_GAIN|MASK_AGC_FIX); hw_set_dxx_reg(phw_data, REG_AGC_CTRL3, reg_agc_ctrl3); } -//////////////////////////////////////////////////////// -void _txidac_dc_offset_cancellation_winbond(hw_data_t *phw_data) -{ - u32 reg_agc_ctrl3; - u32 reg_mode_ctrl; - u32 reg_dc_cancel; - s32 iqcal_image_i; - s32 iqcal_image_q; - u32 sqsum; - s32 mag_0; - s32 mag_1; - s32 fix_cancel_dc_i = 0; - u32 val; - int loop; - - PHY_DEBUG(("[CAL] -> [2]_txidac_dc_offset_cancellation()\n")); - - // a. Set to "TX calibration mode" - - //0x01 0xEE3FC2 ; 3B8FF ; Calibration (6a). enable TX IQ calibration loop circuits - phy_set_rf_data(phw_data, 1, (1<<24)|0xEE3FC2); - //0x0B 0x1905D6 ; 06417 ; Calibration (6b). enable TX I/Q cal loop squaring circuit - phy_set_rf_data(phw_data, 11, (11<<24)|0x1901D6); - //0x05 0x24C60A ; 09318 ; Calibration (6c). setting TX-VGA gain: TXGCH=2 & GPK=110 --> to be optimized - phy_set_rf_data(phw_data, 5, (5<<24)|0x24C48A); - //0x06 0x06880C ; 01A20 ; Calibration (6d). RXGCH=00; RXGCL=100 000 (RXVGA=32) --> to be optimized - phy_set_rf_data(phw_data, 6, (6<<24)|0x06890C); - //0x00 0xFDF1C0 ; 3F7C7 ; Calibration (6e). turn on IQ imbalance/Test mode - phy_set_rf_data(phw_data, 0, (0<<24)|0xFDF1C0); - - hw_set_dxx_reg(phw_data, 0x58, 0x30303030); // IQ_Alpha Changed - - // a. Disable AGC - hw_get_dxx_reg(phw_data, REG_AGC_CTRL3, ®_agc_ctrl3); - reg_agc_ctrl3 &= ~BIT(2); - reg_agc_ctrl3 |= (MASK_LNA_FIX_GAIN|MASK_AGC_FIX); - hw_set_dxx_reg(phw_data, REG_AGC_CTRL3, reg_agc_ctrl3); - - hw_get_dxx_reg(phw_data, REG_AGC_CTRL5, &val); - val |= MASK_AGC_FIX_GAIN; - hw_set_dxx_reg(phw_data, REG_AGC_CTRL5, val); - - // b. set iqcal_mode[1:0] to 0x2 and set iqcal_tone[3:2] to 0 - hw_get_dxx_reg(phw_data, REG_MODE_CTRL, ®_mode_ctrl); - - PHY_DEBUG(("[CAL] MODE_CTRL (read) = 0x%08X\n", reg_mode_ctrl)); - reg_mode_ctrl &= ~(MASK_IQCAL_TONE_SEL|MASK_IQCAL_MODE); - - // mode=2, tone=0 - //reg_mode_ctrl |= (MASK_CALIB_START|2); - - // mode=2, tone=1 - //reg_mode_ctrl |= (MASK_CALIB_START|2|(1<<2)); - - // mode=2, tone=2 - reg_mode_ctrl |= (MASK_CALIB_START|2|(2<<2)); - hw_set_dxx_reg(phw_data, REG_MODE_CTRL, reg_mode_ctrl); - PHY_DEBUG(("[CAL] MODE_CTRL (write) = 0x%08X\n", reg_mode_ctrl)); - pa_stall_execution(US); - - hw_get_dxx_reg(phw_data, 0x5C, ®_dc_cancel); - PHY_DEBUG(("[CAL] DC_CANCEL (read) = 0x%08X\n", reg_dc_cancel)); - - for (loop = 0; loop < LOOP_TIMES; loop++) - { - PHY_DEBUG(("[CAL] [%d.] ==================================\n", loop)); - - // c. - // reset cancel_dc_i[9:5] and cancel_dc_q[4:0] in register DC_Cancel - reg_dc_cancel &= ~(0x03FF); - PHY_DEBUG(("[CAL] DC_CANCEL (write) = 0x%08X\n", reg_dc_cancel)); - hw_set_dxx_reg(phw_data, 0x5C, reg_dc_cancel); - pa_stall_execution(US); - - hw_get_dxx_reg(phw_data, REG_CALIB_READ2, &val); - PHY_DEBUG(("[CAL] CALIB_READ2 = 0x%08X\n", val)); - - iqcal_image_i = _s13_to_s32(val & 0x00001FFF); - iqcal_image_q = _s13_to_s32((val & 0x03FFE000) >> 13); - sqsum = iqcal_image_i*iqcal_image_i + iqcal_image_q*iqcal_image_q; - mag_0 = (s32) _sqrt(sqsum); - PHY_DEBUG(("[CAL] mag_0=%d (iqcal_image_i=%d, iqcal_image_q=%d)\n", - mag_0, iqcal_image_i, iqcal_image_q)); - - // d. - reg_dc_cancel |= (1 << CANCEL_DC_I_SHIFT); - PHY_DEBUG(("[CAL] DC_CANCEL (write) = 0x%08X\n", reg_dc_cancel)); - hw_set_dxx_reg(phw_data, 0x5C, reg_dc_cancel); - pa_stall_execution(US); - - hw_get_dxx_reg(phw_data, REG_CALIB_READ2, &val); - PHY_DEBUG(("[CAL] CALIB_READ2 = 0x%08X\n", val)); - - iqcal_image_i = _s13_to_s32(val & 0x00001FFF); - iqcal_image_q = _s13_to_s32((val & 0x03FFE000) >> 13); - sqsum = iqcal_image_i*iqcal_image_i + iqcal_image_q*iqcal_image_q; - mag_1 = (s32) _sqrt(sqsum); - PHY_DEBUG(("[CAL] mag_1=%d (iqcal_image_i=%d, iqcal_image_q=%d)\n", - mag_1, iqcal_image_i, iqcal_image_q)); - - // e. Calculate the correct DC offset cancellation value for I - if (mag_0 != mag_1) - { - fix_cancel_dc_i = (mag_0*10000) / (mag_0*10000 - mag_1*10000); - } - else - { - if (mag_0 == mag_1) - { - PHY_DEBUG(("[CAL] ***** mag_0 = mag_1 !!\n")); - } - - fix_cancel_dc_i = 0; - } - - PHY_DEBUG(("[CAL] ** fix_cancel_dc_i = %d (0x%04X)\n", - fix_cancel_dc_i, _s32_to_s5(fix_cancel_dc_i))); - - if ((abs(mag_1-mag_0)*6) > mag_0) - { - break; - } - } - - if ( loop >= 19 ) - fix_cancel_dc_i = 0; - - reg_dc_cancel &= ~(0x03FF); - reg_dc_cancel |= (_s32_to_s5(fix_cancel_dc_i) << CANCEL_DC_I_SHIFT); - hw_set_dxx_reg(phw_data, 0x5C, reg_dc_cancel); - PHY_DEBUG(("[CAL] DC_CANCEL (write) = 0x%08X\n", reg_dc_cancel)); - - // g. - reg_mode_ctrl &= ~MASK_CALIB_START; - hw_set_dxx_reg(phw_data, REG_MODE_CTRL, reg_mode_ctrl); - PHY_DEBUG(("[CAL] MODE_CTRL (write) = 0x%08X\n", reg_mode_ctrl)); - pa_stall_execution(US); -} - -/////////////////////////////////////////////////////// -void _txqdac_dc_offset_cacellation_winbond(hw_data_t *phw_data) -{ - u32 reg_agc_ctrl3; - u32 reg_mode_ctrl; - u32 reg_dc_cancel; - s32 iqcal_image_i; - s32 iqcal_image_q; - u32 sqsum; - s32 mag_0; - s32 mag_1; - s32 fix_cancel_dc_q = 0; - u32 val; - int loop; - - PHY_DEBUG(("[CAL] -> [3]_txqdac_dc_offset_cacellation()\n")); - //0x01 0xEE3FC2 ; 3B8FF ; Calibration (6a). enable TX IQ calibration loop circuits - phy_set_rf_data(phw_data, 1, (1<<24)|0xEE3FC2); - //0x0B 0x1905D6 ; 06417 ; Calibration (6b). enable TX I/Q cal loop squaring circuit - phy_set_rf_data(phw_data, 11, (11<<24)|0x1901D6); - //0x05 0x24C60A ; 09318 ; Calibration (6c). setting TX-VGA gain: TXGCH=2 & GPK=110 --> to be optimized - phy_set_rf_data(phw_data, 5, (5<<24)|0x24C48A); - //0x06 0x06880C ; 01A20 ; Calibration (6d). RXGCH=00; RXGCL=100 000 (RXVGA=32) --> to be optimized - phy_set_rf_data(phw_data, 6, (6<<24)|0x06890C); - //0x00 0xFDF1C0 ; 3F7C7 ; Calibration (6e). turn on IQ imbalance/Test mode - phy_set_rf_data(phw_data, 0, (0<<24)|0xFDF1C0); - - hw_set_dxx_reg(phw_data, 0x58, 0x30303030); // IQ_Alpha Changed - - // a. Disable AGC - hw_get_dxx_reg(phw_data, REG_AGC_CTRL3, ®_agc_ctrl3); - reg_agc_ctrl3 &= ~BIT(2); - reg_agc_ctrl3 |= (MASK_LNA_FIX_GAIN|MASK_AGC_FIX); - hw_set_dxx_reg(phw_data, REG_AGC_CTRL3, reg_agc_ctrl3); - - hw_get_dxx_reg(phw_data, REG_AGC_CTRL5, &val); - val |= MASK_AGC_FIX_GAIN; - hw_set_dxx_reg(phw_data, REG_AGC_CTRL5, val); - - // a. set iqcal_mode[1:0] to 0x3 and set iqcal_tone[3:2] to 0 - hw_get_dxx_reg(phw_data, REG_MODE_CTRL, ®_mode_ctrl); - PHY_DEBUG(("[CAL] MODE_CTRL (read) = 0x%08X\n", reg_mode_ctrl)); - - //reg_mode_ctrl &= ~(MASK_IQCAL_TONE_SEL|MASK_IQCAL_MODE); - reg_mode_ctrl &= ~(MASK_IQCAL_MODE); - reg_mode_ctrl |= (MASK_CALIB_START|3); - hw_set_dxx_reg(phw_data, REG_MODE_CTRL, reg_mode_ctrl); - PHY_DEBUG(("[CAL] MODE_CTRL (write) = 0x%08X\n", reg_mode_ctrl)); - pa_stall_execution(US); - - hw_get_dxx_reg(phw_data, 0x5C, ®_dc_cancel); - PHY_DEBUG(("[CAL] DC_CANCEL (read) = 0x%08X\n", reg_dc_cancel)); - - for (loop = 0; loop < LOOP_TIMES; loop++) - { - PHY_DEBUG(("[CAL] [%d.] ==================================\n", loop)); - - // b. - // reset cancel_dc_q[4:0] in register DC_Cancel - reg_dc_cancel &= ~(0x001F); - PHY_DEBUG(("[CAL] DC_CANCEL (write) = 0x%08X\n", reg_dc_cancel)); - hw_set_dxx_reg(phw_data, 0x5C, reg_dc_cancel); - pa_stall_execution(US); - - hw_get_dxx_reg(phw_data, REG_CALIB_READ2, &val); - PHY_DEBUG(("[CAL] CALIB_READ2 = 0x%08X\n", val)); - pa_stall_execution(US); - - iqcal_image_i = _s13_to_s32(val & 0x00001FFF); - iqcal_image_q = _s13_to_s32((val & 0x03FFE000) >> 13); - sqsum = iqcal_image_i*iqcal_image_i + iqcal_image_q*iqcal_image_q; - mag_0 = _sqrt(sqsum); - PHY_DEBUG(("[CAL] mag_0=%d (iqcal_image_i=%d, iqcal_image_q=%d)\n", - mag_0, iqcal_image_i, iqcal_image_q)); - - // c. - reg_dc_cancel |= (1 << CANCEL_DC_Q_SHIFT); - PHY_DEBUG(("[CAL] DC_CANCEL (write) = 0x%08X\n", reg_dc_cancel)); - hw_set_dxx_reg(phw_data, 0x5C, reg_dc_cancel); - pa_stall_execution(US); - - hw_get_dxx_reg(phw_data, REG_CALIB_READ2, &val); - PHY_DEBUG(("[CAL] CALIB_READ2 = 0x%08X\n", val)); - pa_stall_execution(US); - - iqcal_image_i = _s13_to_s32(val & 0x00001FFF); - iqcal_image_q = _s13_to_s32((val & 0x03FFE000) >> 13); - sqsum = iqcal_image_i*iqcal_image_i + iqcal_image_q*iqcal_image_q; - mag_1 = _sqrt(sqsum); - PHY_DEBUG(("[CAL] mag_1=%d (iqcal_image_i=%d, iqcal_image_q=%d)\n", - mag_1, iqcal_image_i, iqcal_image_q)); - - // d. Calculate the correct DC offset cancellation value for I - if (mag_0 != mag_1) - { - fix_cancel_dc_q = (mag_0*10000) / (mag_0*10000 - mag_1*10000); - } - else - { - if (mag_0 == mag_1) - { - PHY_DEBUG(("[CAL] ***** mag_0 = mag_1 !!\n")); - } - - fix_cancel_dc_q = 0; - } - - PHY_DEBUG(("[CAL] ** fix_cancel_dc_q = %d (0x%04X)\n", - fix_cancel_dc_q, _s32_to_s5(fix_cancel_dc_q))); - - if ((abs(mag_1-mag_0)*6) > mag_0) - { - break; - } - } - - if ( loop >= 19 ) - fix_cancel_dc_q = 0; - - reg_dc_cancel &= ~(0x001F); - reg_dc_cancel |= (_s32_to_s5(fix_cancel_dc_q) << CANCEL_DC_Q_SHIFT); - hw_set_dxx_reg(phw_data, 0x5C, reg_dc_cancel); - PHY_DEBUG(("[CAL] DC_CANCEL (write) = 0x%08X\n", reg_dc_cancel)); - - - // f. - reg_mode_ctrl &= ~MASK_CALIB_START; - hw_set_dxx_reg(phw_data, REG_MODE_CTRL, reg_mode_ctrl); - PHY_DEBUG(("[CAL] MODE_CTRL (write) = 0x%08X\n", reg_mode_ctrl)); - pa_stall_execution(US); -} - -//20060612.1.a 20060718.1 Modify -u8 _tx_iq_calibration_loop_winbond(hw_data_t *phw_data, +/* 20060612.1.a 20060718.1 Modify */ +static u8 _tx_iq_calibration_loop_winbond(struct hw_data *phw_data, s32 a_2_threshold, s32 b_2_threshold) { @@ -759,7 +418,7 @@ u8 _tx_iq_calibration_loop_winbond(hw_data_t *phw_data, s32 temp1, temp2; u32 val; u16 loop; - s32 iqcal_tone_i_avg,iqcal_tone_q_avg; + s32 iqcal_tone_i_avg, iqcal_tone_q_avg; u8 verify_count; int capture_time; @@ -774,30 +433,29 @@ u8 _tx_iq_calibration_loop_winbond(hw_data_t *phw_data, loop = LOOP_TIMES; - while (loop > 0) - { - PHY_DEBUG(("[CAL] [%d.] <_tx_iq_calibration_loop>\n", (LOOP_TIMES-loop+1))); + while (loop > 0) { + PHY_DEBUG(("[CAL] [%d.] <_tx_iq_calibration_loop>\n", + (LOOP_TIMES-loop+1))); - iqcal_tone_i_avg=0; - iqcal_tone_q_avg=0; - if( !hw_set_dxx_reg(phw_data, 0x3C, 0x00) ) // 20060718.1 modify + iqcal_tone_i_avg = 0; + iqcal_tone_q_avg = 0; + if (!hw_set_dxx_reg(phw_data, 0x3C, 0x00)) /* 20060718.1 modify */ return 0; - for(capture_time=0;capture_time<10;capture_time++) - { - // a. Set iqcal_mode[1:0] to 0x2 and set "calib_start" to 0x1 to - // enable "IQ alibration Mode II" + for (capture_time = 0; capture_time < 10; capture_time++) { + /* + * a. Set iqcal_mode[1:0] to 0x2 and set "calib_start" + * to 0x1 to enable "IQ calibration Mode II" + */ reg_mode_ctrl &= ~(MASK_IQCAL_TONE_SEL|MASK_IQCAL_MODE); reg_mode_ctrl &= ~MASK_IQCAL_MODE; reg_mode_ctrl |= (MASK_CALIB_START|0x02); reg_mode_ctrl |= (MASK_CALIB_START|0x02|2<<2); hw_set_dxx_reg(phw_data, REG_MODE_CTRL, reg_mode_ctrl); PHY_DEBUG(("[CAL] MODE_CTRL (write) = 0x%08X\n", reg_mode_ctrl)); - pa_stall_execution(US); - // b. + /* b. */ hw_get_dxx_reg(phw_data, REG_CALIB_READ1, &val); PHY_DEBUG(("[CAL] CALIB_READ1 = 0x%08X\n", val)); - pa_stall_execution(US); iqcal_tone_i0 = _s13_to_s32(val & 0x00001FFF); iqcal_tone_q0 = _s13_to_s32((val & 0x03FFE000) >> 13); @@ -809,39 +467,35 @@ u8 _tx_iq_calibration_loop_winbond(hw_data_t *phw_data, iq_mag_0_tx = (s32) _sqrt(sqsum); PHY_DEBUG(("[CAL] ** iq_mag_0_tx=%d\n", iq_mag_0_tx)); - // c. Set "calib_start" to 0x0 + /* c. Set "calib_start" to 0x0 */ reg_mode_ctrl &= ~MASK_CALIB_START; hw_set_dxx_reg(phw_data, REG_MODE_CTRL, reg_mode_ctrl); PHY_DEBUG(("[CAL] MODE_CTRL (write) = 0x%08X\n", reg_mode_ctrl)); - pa_stall_execution(US); - // d. Set iqcal_mode[1:0] to 0x3 and set "calib_start" to 0x1 to - // enable "IQ alibration Mode II" - //hw_get_dxx_reg(phw_data, REG_MODE_CTRL, &val); + /* + * d. Set iqcal_mode[1:0] to 0x3 and set "calib_start" + * to 0x1 to enable "IQ calibration Mode II" + */ + /* hw_get_dxx_reg(phw_data, REG_MODE_CTRL, &val); */ hw_get_dxx_reg(phw_data, REG_MODE_CTRL, ®_mode_ctrl); reg_mode_ctrl &= ~MASK_IQCAL_MODE; reg_mode_ctrl |= (MASK_CALIB_START|0x03); hw_set_dxx_reg(phw_data, REG_MODE_CTRL, reg_mode_ctrl); PHY_DEBUG(("[CAL] MODE_CTRL (write) = 0x%08X\n", reg_mode_ctrl)); - pa_stall_execution(US); - // e. + /* e. */ hw_get_dxx_reg(phw_data, REG_CALIB_READ1, &val); PHY_DEBUG(("[CAL] CALIB_READ1 = 0x%08X\n", val)); - pa_stall_execution(US); iqcal_tone_i = _s13_to_s32(val & 0x00001FFF); iqcal_tone_q = _s13_to_s32((val & 0x03FFE000) >> 13); PHY_DEBUG(("[CAL] ** iqcal_tone_i = %d, iqcal_tone_q = %d\n", - iqcal_tone_i, iqcal_tone_q)); - if( capture_time == 0) - { + iqcal_tone_i, iqcal_tone_q)); + if (capture_time == 0) continue; - } - else - { - iqcal_tone_i_avg=( iqcal_tone_i_avg*(capture_time-1) +iqcal_tone_i)/capture_time; - iqcal_tone_q_avg=( iqcal_tone_q_avg*(capture_time-1) +iqcal_tone_q)/capture_time; + else { + iqcal_tone_i_avg = (iqcal_tone_i_avg*(capture_time-1) + iqcal_tone_i)/capture_time; + iqcal_tone_q_avg = (iqcal_tone_q_avg*(capture_time-1) + iqcal_tone_q)/capture_time; } } @@ -856,11 +510,10 @@ u8 _tx_iq_calibration_loop_winbond(hw_data_t *phw_data, PHY_DEBUG(("[CAL] ** rot_i_b = %d, rot_q_b = %d\n", rot_i_b, rot_q_b)); - // f. + /* f. */ divisor = ((iq_mag_0_tx * iq_mag_0_tx * 2)/1024 - rot_i_b) * 2; - if (divisor == 0) - { + if (divisor == 0) { PHY_DEBUG(("[CAL] ** <_tx_iq_calibration_loop> ERROR *******\n")); PHY_DEBUG(("[CAL] ** divisor=0 to calculate EPS and THETA !!\n")); PHY_DEBUG(("[CAL] ******************************************\n")); @@ -875,18 +528,16 @@ u8 _tx_iq_calibration_loop_winbond(hw_data_t *phw_data, phw_data->iq_rsdl_gain_tx_d2 = a_2; phw_data->iq_rsdl_phase_tx_d2 = b_2; - //if ((abs(a_2) < 150) && (abs(b_2) < 100)) - //if ((abs(a_2) < 200) && (abs(b_2) < 200)) - if ((abs(a_2) < a_2_threshold) && (abs(b_2) < b_2_threshold)) - { + /* if ((abs(a_2) < 150) && (abs(b_2) < 100)) */ + /* if ((abs(a_2) < 200) && (abs(b_2) < 200)) */ + if ((abs(a_2) < a_2_threshold) && (abs(b_2) < b_2_threshold)) { verify_count++; PHY_DEBUG(("[CAL] ** <_tx_iq_calibration_loop> *************\n")); PHY_DEBUG(("[CAL] ** VERIFY OK # %d !!\n", verify_count)); PHY_DEBUG(("[CAL] ******************************************\n")); - if (verify_count > 2) - { + if (verify_count > 2) { PHY_DEBUG(("[CAL] ** <_tx_iq_calibration_loop> *********\n")); PHY_DEBUG(("[CAL] ** TX_IQ_CALIBRATION (EPS,THETA) OK !!\n")); PHY_DEBUG(("[CAL] **************************************\n")); @@ -894,37 +545,29 @@ u8 _tx_iq_calibration_loop_winbond(hw_data_t *phw_data, } continue; - } - else - { + } else verify_count = 0; - } _sin_cos(b_2, &sin_b, &cos_b); _sin_cos(b_2*2, &sin_2b, &cos_2b); PHY_DEBUG(("[CAL] ** sin(b/2)=%d, cos(b/2)=%d\n", sin_b, cos_b)); PHY_DEBUG(("[CAL] ** sin(b)=%d, cos(b)=%d\n", sin_2b, cos_2b)); - if (cos_2b == 0) - { + if (cos_2b == 0) { PHY_DEBUG(("[CAL] ** <_tx_iq_calibration_loop> ERROR *******\n")); PHY_DEBUG(("[CAL] ** cos(b)=0 !!\n")); PHY_DEBUG(("[CAL] ******************************************\n")); break; } - // 1280 * 32768 = 41943040 + /* 1280 * 32768 = 41943040 */ temp1 = (41943040/cos_2b)*cos_b; - //temp2 = (41943040/cos_2b)*sin_b*(-1); - if (phw_data->revision == 0x2002) // 1st-cut - { + /* temp2 = (41943040/cos_2b)*sin_b*(-1); */ + if (phw_data->revision == 0x2002) /* 1st-cut */ temp2 = (41943040/cos_2b)*sin_b*(-1); - } - else // 2nd-cut - { + else /* 2nd-cut */ temp2 = (41943040*4/cos_2b)*sin_b*(-1); - } tx_cal_flt_b[0] = _floor(temp1/(32768+a_2)); tx_cal_flt_b[1] = _floor(temp2/(32768+a_2)); @@ -936,37 +579,34 @@ u8 _tx_iq_calibration_loop_winbond(hw_data_t *phw_data, PHY_DEBUG(("[CAL] tx_cal_flt_b[3] = %d\n", tx_cal_flt_b[3])); tx_cal[2] = tx_cal_flt_b[2]; - tx_cal[2] = tx_cal[2] +3; + tx_cal[2] = tx_cal[2] + 3; tx_cal[1] = tx_cal[2]; tx_cal[3] = tx_cal_flt_b[3] - 128; - tx_cal[0] = -tx_cal[3]+1; + tx_cal[0] = -tx_cal[3] + 1; PHY_DEBUG(("[CAL] tx_cal[0] = %d\n", tx_cal[0])); PHY_DEBUG(("[CAL] tx_cal[1] = %d\n", tx_cal[1])); PHY_DEBUG(("[CAL] tx_cal[2] = %d\n", tx_cal[2])); PHY_DEBUG(("[CAL] tx_cal[3] = %d\n", tx_cal[3])); - //if ((tx_cal[0] == 0) && (tx_cal[1] == 0) && - // (tx_cal[2] == 0) && (tx_cal[3] == 0)) - //{ - // PHY_DEBUG(("[CAL] ** <_tx_iq_calibration_loop> *************\n")); - // PHY_DEBUG(("[CAL] ** TX_IQ_CALIBRATION COMPLETE !!\n")); - // PHY_DEBUG(("[CAL] ******************************************\n")); - // return 0; - //} - - // g. - if (phw_data->revision == 0x2002) // 1st-cut - { + /* if ((tx_cal[0] == 0) && (tx_cal[1] == 0) && + (tx_cal[2] == 0) && (tx_cal[3] == 0)) + { */ + /* PHY_DEBUG(("[CAL] ** <_tx_iq_calibration_loop> *************\n")); + * PHY_DEBUG(("[CAL] ** TX_IQ_CALIBRATION COMPLETE !!\n")); + * PHY_DEBUG(("[CAL] ******************************************\n")); + * return 0; + } */ + + /* g. */ + if (phw_data->revision == 0x2002) /* 1st-cut */{ hw_get_dxx_reg(phw_data, 0x54, &val); PHY_DEBUG(("[CAL] ** 0x54 = 0x%08X\n", val)); tx_cal_reg[0] = _s4_to_s32((val & 0xF0000000) >> 28); tx_cal_reg[1] = _s4_to_s32((val & 0x0F000000) >> 24); tx_cal_reg[2] = _s4_to_s32((val & 0x00F00000) >> 20); tx_cal_reg[3] = _s4_to_s32((val & 0x000F0000) >> 16); - } - else // 2nd-cut - { + } else /* 2nd-cut */{ hw_get_dxx_reg(phw_data, 0x3C, &val); PHY_DEBUG(("[CAL] ** 0x3C = 0x%08X\n", val)); tx_cal_reg[0] = _s5_to_s32((val & 0xF8000000) >> 27); @@ -981,22 +621,17 @@ u8 _tx_iq_calibration_loop_winbond(hw_data_t *phw_data, PHY_DEBUG(("[CAL] tx_cal_reg[2] = %d\n", tx_cal_reg[2])); PHY_DEBUG(("[CAL] tx_cal_reg[3] = %d\n", tx_cal_reg[3])); - if (phw_data->revision == 0x2002) // 1st-cut - { - if (((tx_cal_reg[0]==7) || (tx_cal_reg[0]==(-8))) && - ((tx_cal_reg[3]==7) || (tx_cal_reg[3]==(-8)))) - { + if (phw_data->revision == 0x2002) /* 1st-cut */{ + if (((tx_cal_reg[0] == 7) || (tx_cal_reg[0] == (-8))) && + ((tx_cal_reg[3] == 7) || (tx_cal_reg[3] == (-8)))) { PHY_DEBUG(("[CAL] ** <_tx_iq_calibration_loop> *********\n")); PHY_DEBUG(("[CAL] ** TX_IQ_CALIBRATION SATUATION !!\n")); PHY_DEBUG(("[CAL] **************************************\n")); break; } - } - else // 2nd-cut - { - if (((tx_cal_reg[0]==31) || (tx_cal_reg[0]==(-32))) && - ((tx_cal_reg[3]==31) || (tx_cal_reg[3]==(-32)))) - { + } else /* 2nd-cut */{ + if (((tx_cal_reg[0] == 31) || (tx_cal_reg[0] == (-32))) && + ((tx_cal_reg[3] == 31) || (tx_cal_reg[3] == (-32)))) { PHY_DEBUG(("[CAL] ** <_tx_iq_calibration_loop> *********\n")); PHY_DEBUG(("[CAL] ** TX_IQ_CALIBRATION SATUATION !!\n")); PHY_DEBUG(("[CAL] **************************************\n")); @@ -1013,8 +648,7 @@ u8 _tx_iq_calibration_loop_winbond(hw_data_t *phw_data, PHY_DEBUG(("[CAL] apply tx_cal[2] = %d\n", tx_cal[2])); PHY_DEBUG(("[CAL] apply tx_cal[3] = %d\n", tx_cal[3])); - if (phw_data->revision == 0x2002) // 1st-cut - { + if (phw_data->revision == 0x2002) /* 1st-cut */{ val &= 0x0000FFFF; val |= ((_s32_to_s4(tx_cal[0]) << 28)| (_s32_to_s4(tx_cal[1]) << 24)| @@ -1023,9 +657,7 @@ u8 _tx_iq_calibration_loop_winbond(hw_data_t *phw_data, hw_set_dxx_reg(phw_data, 0x54, val); PHY_DEBUG(("[CAL] ** CALIB_DATA = 0x%08X\n", val)); return 0; - } - else // 2nd-cut - { + } else /* 2nd-cut */{ val &= 0x000003FF; val |= ((_s32_to_s5(tx_cal[0]) << 27)| (_s32_to_s6(tx_cal[1]) << 21)| @@ -1036,7 +668,7 @@ u8 _tx_iq_calibration_loop_winbond(hw_data_t *phw_data, return 0; } - // i. Set "calib_start" to 0x0 + /* i. Set "calib_start" to 0x0 */ reg_mode_ctrl &= ~MASK_CALIB_START; hw_set_dxx_reg(phw_data, REG_MODE_CTRL, reg_mode_ctrl); PHY_DEBUG(("[CAL] MODE_CTRL (write) = 0x%08X\n", reg_mode_ctrl)); @@ -1047,7 +679,7 @@ u8 _tx_iq_calibration_loop_winbond(hw_data_t *phw_data, return 1; } -void _tx_iq_calibration_winbond(hw_data_t *phw_data) +static void _tx_iq_calibration_winbond(struct hw_data *phw_data) { u32 reg_agc_ctrl3; #ifdef _DEBUG @@ -1060,26 +692,26 @@ void _tx_iq_calibration_winbond(hw_data_t *phw_data) PHY_DEBUG(("[CAL] -> [4]_tx_iq_calibration()\n")); - //0x01 0xEE3FC2 ; 3B8FF ; Calibration (6a). enable TX IQ calibration loop circuits + /* 0x01 0xEE3FC2 ; 3B8FF ; Calibration (6a). enable TX IQ calibration loop circuits */ phy_set_rf_data(phw_data, 1, (1<<24)|0xEE3FC2); - //0x0B 0x1905D6 ; 06417 ; Calibration (6b). enable TX I/Q cal loop squaring circuit - phy_set_rf_data(phw_data, 11, (11<<24)|0x19BDD6); // 20060612.1.a 0x1905D6); - //0x05 0x24C60A ; 09318 ; Calibration (6c). setting TX-VGA gain: TXGCH=2 & GPK=110 --> to be optimized - phy_set_rf_data(phw_data, 5, (5<<24)|0x24C60A); //0x24C60A (high temperature) - //0x06 0x06880C ; 01A20 ; Calibration (6d). RXGCH=00; RXGCL=100 000 (RXVGA=32) --> to be optimized - phy_set_rf_data(phw_data, 6, (6<<24)|0x34880C); // 20060612.1.a 0x06890C); - //0x00 0xFDF1C0 ; 3F7C7 ; Calibration (6e). turn on IQ imbalance/Test mode + /* 0x0B 0x1905D6 ; 06417 ; Calibration (6b). enable TX I/Q cal loop squaring circuit */ + phy_set_rf_data(phw_data, 11, (11<<24)|0x19BDD6); /* 20060612.1.a 0x1905D6); */ + /* 0x05 0x24C60A ; 09318 ; Calibration (6c). setting TX-VGA gain: TXGCH=2 & GPK=110 --> to be optimized */ + phy_set_rf_data(phw_data, 5, (5<<24)|0x24C60A); /* 0x24C60A (high temperature) */ + /* 0x06 0x06880C ; 01A20 ; Calibration (6d). RXGCH=00; RXGCL=100 000 (RXVGA=32) --> to be optimized */ + phy_set_rf_data(phw_data, 6, (6<<24)|0x34880C); /* 20060612.1.a 0x06890C); */ + /* 0x00 0xFDF1C0 ; 3F7C7 ; Calibration (6e). turn on IQ imbalance/Test mode */ phy_set_rf_data(phw_data, 0, (0<<24)|0xFDF1C0); - //; [BB-chip]: Calibration (6f).Send test pattern - //; [BB-chip]: Calibration (6g). Search RXGCL optimal value - //; [BB-chip]: Calibration (6h). Caculate TX-path IQ imbalance and setting TX path IQ compensation table - //phy_set_rf_data(phw_data, 3, (3<<24)|0x025586); + /* ; [BB-chip]: Calibration (6f).Send test pattern */ + /* ; [BB-chip]: Calibration (6g). Search RXGCL optimal value */ + /* ; [BB-chip]: Calibration (6h). Calculate TX-path IQ imbalance and setting TX path IQ compensation table */ + /* phy_set_rf_data(phw_data, 3, (3<<24)|0x025586); */ - OS_SLEEP(30000); // 20060612.1.a 30ms delay. Add the follow 2 lines - //To adjust TXVGA to fit iq_mag_0 range from 1250 ~ 1750 - adjust_TXVGA_for_iq_mag( phw_data ); + msleep(30); /* 20060612.1.a 30ms delay. Add the follow 2 lines */ + /* To adjust TXVGA to fit iq_mag_0 range from 1250 ~ 1750 */ + adjust_TXVGA_for_iq_mag(phw_data); - // a. Disable AGC + /* a. Disable AGC */ hw_get_dxx_reg(phw_data, REG_AGC_CTRL3, ®_agc_ctrl3); reg_agc_ctrl3 &= ~BIT(2); reg_agc_ctrl3 |= (MASK_LNA_FIX_GAIN|MASK_AGC_FIX); @@ -1091,16 +723,12 @@ void _tx_iq_calibration_winbond(hw_data_t *phw_data) result = _tx_iq_calibration_loop_winbond(phw_data, 150, 100); - if (result > 0) - { - if (phw_data->revision == 0x2002) // 1st-cut - { + if (result > 0) { + if (phw_data->revision == 0x2002) /* 1st-cut */{ hw_get_dxx_reg(phw_data, 0x54, &val); val &= 0x0000FFFF; hw_set_dxx_reg(phw_data, 0x54, val); - } - else // 2nd-cut - { + } else /* 2nd-cut*/{ hw_get_dxx_reg(phw_data, 0x3C, &val); val &= 0x000003FF; hw_set_dxx_reg(phw_data, 0x3C, val); @@ -1108,32 +736,24 @@ void _tx_iq_calibration_winbond(hw_data_t *phw_data) result = _tx_iq_calibration_loop_winbond(phw_data, 300, 200); - if (result > 0) - { - if (phw_data->revision == 0x2002) // 1st-cut - { + if (result > 0) { + if (phw_data->revision == 0x2002) /* 1st-cut */{ hw_get_dxx_reg(phw_data, 0x54, &val); val &= 0x0000FFFF; hw_set_dxx_reg(phw_data, 0x54, val); - } - else // 2nd-cut - { + } else /* 2nd-cut*/{ hw_get_dxx_reg(phw_data, 0x3C, &val); val &= 0x000003FF; hw_set_dxx_reg(phw_data, 0x3C, val); } result = _tx_iq_calibration_loop_winbond(phw_data, 500, 400); - if (result > 0) - { - if (phw_data->revision == 0x2002) // 1st-cut - { + if (result > 0) { + if (phw_data->revision == 0x2002) /* 1st-cut */{ hw_get_dxx_reg(phw_data, 0x54, &val); val &= 0x0000FFFF; hw_set_dxx_reg(phw_data, 0x54, val); - } - else // 2nd-cut - { + } else /* 2nd-cut */{ hw_get_dxx_reg(phw_data, 0x3C, &val); val &= 0x000003FF; hw_set_dxx_reg(phw_data, 0x3C, val); @@ -1142,20 +762,16 @@ void _tx_iq_calibration_winbond(hw_data_t *phw_data) result = _tx_iq_calibration_loop_winbond(phw_data, 700, 500); - if (result > 0) - { + if (result > 0) { PHY_DEBUG(("[CAL] ** <_tx_iq_calibration> **************\n")); PHY_DEBUG(("[CAL] ** TX_IQ_CALIBRATION FAILURE !!\n")); PHY_DEBUG(("[CAL] **************************************\n")); - if (phw_data->revision == 0x2002) // 1st-cut - { + if (phw_data->revision == 0x2002) /* 1st-cut */{ hw_get_dxx_reg(phw_data, 0x54, &val); val &= 0x0000FFFF; hw_set_dxx_reg(phw_data, 0x54, val); - } - else // 2nd-cut - { + } else /* 2nd-cut */{ hw_get_dxx_reg(phw_data, 0x3C, &val); val &= 0x000003FF; hw_set_dxx_reg(phw_data, 0x3C, val); @@ -1165,30 +781,27 @@ void _tx_iq_calibration_winbond(hw_data_t *phw_data) } } - // i. Set "calib_start" to 0x0 + /* i. Set "calib_start" to 0x0 */ hw_get_dxx_reg(phw_data, REG_MODE_CTRL, ®_mode_ctrl); reg_mode_ctrl &= ~MASK_CALIB_START; hw_set_dxx_reg(phw_data, REG_MODE_CTRL, reg_mode_ctrl); PHY_DEBUG(("[CAL] MODE_CTRL (write) = 0x%08X\n", reg_mode_ctrl)); - // g. Enable AGC - //hw_get_dxx_reg(phw_data, REG_AGC_CTRL3, &val); + /* g. Enable AGC */ + /* hw_get_dxx_reg(phw_data, REG_AGC_CTRL3, &val); */ reg_agc_ctrl3 |= BIT(2); reg_agc_ctrl3 &= ~(MASK_LNA_FIX_GAIN|MASK_AGC_FIX); hw_set_dxx_reg(phw_data, REG_AGC_CTRL3, reg_agc_ctrl3); #ifdef _DEBUG - if (phw_data->revision == 0x2002) // 1st-cut - { + if (phw_data->revision == 0x2002) /* 1st-cut */{ hw_get_dxx_reg(phw_data, 0x54, &val); PHY_DEBUG(("[CAL] ** 0x54 = 0x%08X\n", val)); tx_cal_reg[0] = _s4_to_s32((val & 0xF0000000) >> 28); tx_cal_reg[1] = _s4_to_s32((val & 0x0F000000) >> 24); tx_cal_reg[2] = _s4_to_s32((val & 0x00F00000) >> 20); tx_cal_reg[3] = _s4_to_s32((val & 0x000F0000) >> 16); - } - else // 2nd-cut - { + } else /* 2nd-cut */ { hw_get_dxx_reg(phw_data, 0x3C, &val); PHY_DEBUG(("[CAL] ** 0x3C = 0x%08X\n", val)); tx_cal_reg[0] = _s5_to_s32((val & 0xF8000000) >> 27); @@ -1205,12 +818,14 @@ void _tx_iq_calibration_winbond(hw_data_t *phw_data) #endif - // for test - BEN - // RF Control Override + /* + * for test - BEN + * RF Control Override + */ } -///////////////////////////////////////////////////////////////////////////////////////// -u8 _rx_iq_calibration_loop_winbond(hw_data_t *phw_data, u16 factor, u32 frequency) +/*****************************************************/ +static u8 _rx_iq_calibration_loop_winbond(struct hw_data *phw_data, u16 factor, u32 frequency) { u32 reg_mode_ctrl; s32 iqcal_tone_i; @@ -1235,87 +850,69 @@ u8 _rx_iq_calibration_loop_winbond(hw_data_t *phw_data, u16 factor, u32 frequenc u32 pwr_image; u8 verify_count; - s32 iqcal_tone_i_avg,iqcal_tone_q_avg; - s32 iqcal_image_i_avg,iqcal_image_q_avg; - u16 capture_time; + s32 iqcal_tone_i_avg, iqcal_tone_q_avg; + s32 iqcal_image_i_avg, iqcal_image_q_avg; + u16 capture_time; PHY_DEBUG(("[CAL] -> [5]_rx_iq_calibration_loop()\n")); PHY_DEBUG(("[CAL] ** factor = %d\n", factor)); + hw_set_dxx_reg(phw_data, 0x58, 0x44444444); /* IQ_Alpha */ -// RF Control Override - hw_get_cxx_reg(phw_data, 0x80, &val); - val |= BIT(19); - hw_set_cxx_reg(phw_data, 0x80, val); - -// RF_Ctrl - hw_get_cxx_reg(phw_data, 0xE4, &val); - val |= BIT(0); - hw_set_cxx_reg(phw_data, 0xE4, val); - PHY_DEBUG(("[CAL] ** RF_CTRL(0xE4) = 0x%08X", val)); - - hw_set_dxx_reg(phw_data, 0x58, 0x44444444); // IQ_Alpha - - // b. + /* b. */ hw_get_dxx_reg(phw_data, REG_MODE_CTRL, ®_mode_ctrl); PHY_DEBUG(("[CAL] MODE_CTRL (read) = 0x%08X\n", reg_mode_ctrl)); verify_count = 0; - //for (loop = 0; loop < 1; loop++) - //for (loop = 0; loop < LOOP_TIMES; loop++) + /* for (loop = 0; loop < 1; loop++) */ + /* for (loop = 0; loop < LOOP_TIMES; loop++) */ loop = LOOP_TIMES; - while (loop > 0) - { - PHY_DEBUG(("[CAL] [%d.] <_rx_iq_calibration_loop>\n", (LOOP_TIMES-loop+1))); - iqcal_tone_i_avg=0; - iqcal_tone_q_avg=0; - iqcal_image_i_avg=0; - iqcal_image_q_avg=0; - capture_time=0; - - for(capture_time=0; capture_time<10; capture_time++) - { - // i. Set "calib_start" to 0x0 - reg_mode_ctrl &= ~MASK_CALIB_START; - if( !hw_set_dxx_reg(phw_data, REG_MODE_CTRL, reg_mode_ctrl) )//20060718.1 modify - return 0; - PHY_DEBUG(("[CAL] MODE_CTRL (write) = 0x%08X\n", reg_mode_ctrl)); - pa_stall_execution(US); + while (loop > 0) { + PHY_DEBUG(("[CAL] [%d.] <_rx_iq_calibration_loop>\n", + (LOOP_TIMES-loop+1))); + iqcal_tone_i_avg = 0; + iqcal_tone_q_avg = 0; + iqcal_image_i_avg = 0; + iqcal_image_q_avg = 0; + capture_time = 0; + + for (capture_time = 0; capture_time < 10; capture_time++) { + /* i. Set "calib_start" to 0x0 */ + reg_mode_ctrl &= ~MASK_CALIB_START; + if (!hw_set_dxx_reg(phw_data, REG_MODE_CTRL, reg_mode_ctrl))/*20060718.1 modify */ + return 0; + PHY_DEBUG(("[CAL] MODE_CTRL (write) = 0x%08X\n", reg_mode_ctrl)); - reg_mode_ctrl &= ~MASK_IQCAL_MODE; - reg_mode_ctrl |= (MASK_CALIB_START|0x1); - hw_set_dxx_reg(phw_data, REG_MODE_CTRL, reg_mode_ctrl); - PHY_DEBUG(("[CAL] MODE_CTRL (write) = 0x%08X\n", reg_mode_ctrl)); - pa_stall_execution(US); //Should be read out after 450us + reg_mode_ctrl &= ~MASK_IQCAL_MODE; + reg_mode_ctrl |= (MASK_CALIB_START|0x1); + hw_set_dxx_reg(phw_data, REG_MODE_CTRL, reg_mode_ctrl); + PHY_DEBUG(("[CAL] MODE_CTRL (write) = 0x%08X\n", reg_mode_ctrl)); - // c. - hw_get_dxx_reg(phw_data, REG_CALIB_READ1, &val); - PHY_DEBUG(("[CAL] CALIB_READ1 = 0x%08X\n", val)); + /* c. */ + hw_get_dxx_reg(phw_data, REG_CALIB_READ1, &val); + PHY_DEBUG(("[CAL] CALIB_READ1 = 0x%08X\n", val)); - iqcal_tone_i = _s13_to_s32(val & 0x00001FFF); - iqcal_tone_q = _s13_to_s32((val & 0x03FFE000) >> 13); - PHY_DEBUG(("[CAL] ** iqcal_tone_i = %d, iqcal_tone_q = %d\n", - iqcal_tone_i, iqcal_tone_q)); + iqcal_tone_i = _s13_to_s32(val & 0x00001FFF); + iqcal_tone_q = _s13_to_s32((val & 0x03FFE000) >> 13); + PHY_DEBUG(("[CAL] ** iqcal_tone_i = %d, iqcal_tone_q = %d\n", + iqcal_tone_i, iqcal_tone_q)); - hw_get_dxx_reg(phw_data, REG_CALIB_READ2, &val); - PHY_DEBUG(("[CAL] CALIB_READ2 = 0x%08X\n", val)); + hw_get_dxx_reg(phw_data, REG_CALIB_READ2, &val); + PHY_DEBUG(("[CAL] CALIB_READ2 = 0x%08X\n", val)); - iqcal_image_i = _s13_to_s32(val & 0x00001FFF); - iqcal_image_q = _s13_to_s32((val & 0x03FFE000) >> 13); - PHY_DEBUG(("[CAL] ** iqcal_image_i = %d, iqcal_image_q = %d\n", - iqcal_image_i, iqcal_image_q)); - if( capture_time == 0) - { + iqcal_image_i = _s13_to_s32(val & 0x00001FFF); + iqcal_image_q = _s13_to_s32((val & 0x03FFE000) >> 13); + PHY_DEBUG(("[CAL] ** iqcal_image_i = %d, iqcal_image_q = %d\n", + iqcal_image_i, iqcal_image_q)); + if (capture_time == 0) continue; - } - else - { - iqcal_image_i_avg=( iqcal_image_i_avg*(capture_time-1) +iqcal_image_i)/capture_time; - iqcal_image_q_avg=( iqcal_image_q_avg*(capture_time-1) +iqcal_image_q)/capture_time; - iqcal_tone_i_avg=( iqcal_tone_i_avg*(capture_time-1) +iqcal_tone_i)/capture_time; - iqcal_tone_q_avg=( iqcal_tone_q_avg*(capture_time-1) +iqcal_tone_q)/capture_time; + else { + iqcal_image_i_avg = (iqcal_image_i_avg*(capture_time-1) + iqcal_image_i)/capture_time; + iqcal_image_q_avg = (iqcal_image_q_avg*(capture_time-1) + iqcal_image_q)/capture_time; + iqcal_tone_i_avg = (iqcal_tone_i_avg*(capture_time-1) + iqcal_tone_i)/capture_time; + iqcal_tone_q_avg = (iqcal_tone_q_avg*(capture_time-1) + iqcal_tone_q)/capture_time; } } @@ -1325,24 +922,23 @@ u8 _rx_iq_calibration_loop_winbond(hw_data_t *phw_data, u16 factor, u32 frequenc iqcal_tone_i = iqcal_tone_i_avg; iqcal_tone_q = iqcal_tone_q_avg; - // d. + /* d. */ rot_tone_i_b = (iqcal_tone_i * iqcal_tone_i + - iqcal_tone_q * iqcal_tone_q) / 1024; + iqcal_tone_q * iqcal_tone_q) / 1024; rot_tone_q_b = (iqcal_tone_i * iqcal_tone_q * (-1) + - iqcal_tone_q * iqcal_tone_i) / 1024; + iqcal_tone_q * iqcal_tone_i) / 1024; rot_image_i_b = (iqcal_image_i * iqcal_tone_i - - iqcal_image_q * iqcal_tone_q) / 1024; + iqcal_image_q * iqcal_tone_q) / 1024; rot_image_q_b = (iqcal_image_i * iqcal_tone_q + - iqcal_image_q * iqcal_tone_i) / 1024; + iqcal_image_q * iqcal_tone_i) / 1024; PHY_DEBUG(("[CAL] ** rot_tone_i_b = %d\n", rot_tone_i_b)); PHY_DEBUG(("[CAL] ** rot_tone_q_b = %d\n", rot_tone_q_b)); PHY_DEBUG(("[CAL] ** rot_image_i_b = %d\n", rot_image_i_b)); PHY_DEBUG(("[CAL] ** rot_image_q_b = %d\n", rot_image_q_b)); - // f. - if (rot_tone_i_b == 0) - { + /* f. */ + if (rot_tone_i_b == 0) { PHY_DEBUG(("[CAL] ** <_rx_iq_calibration_loop> ERROR *******\n")); PHY_DEBUG(("[CAL] ** rot_tone_i_b=0 to calculate EPS and THETA !!\n")); PHY_DEBUG(("[CAL] ******************************************\n")); @@ -1354,8 +950,10 @@ u8 _rx_iq_calibration_loop_winbond(hw_data_t *phw_data, u16 factor, u32 frequenc b_2 = (rot_image_q_b * 32768) / rot_tone_i_b - phw_data->iq_rsdl_phase_tx_d2; - PHY_DEBUG(("[CAL] ** iq_rsdl_gain_tx_d2 = %d\n", phw_data->iq_rsdl_gain_tx_d2)); - PHY_DEBUG(("[CAL] ** iq_rsdl_phase_tx_d2= %d\n", phw_data->iq_rsdl_phase_tx_d2)); + PHY_DEBUG(("[CAL] ** iq_rsdl_gain_tx_d2 = %d\n", + phw_data->iq_rsdl_gain_tx_d2)); + PHY_DEBUG(("[CAL] ** iq_rsdl_phase_tx_d2= %d\n", + phw_data->iq_rsdl_phase_tx_d2)); PHY_DEBUG(("[CAL] ***** EPSILON/2 = %d\n", a_2)); PHY_DEBUG(("[CAL] ***** THETA/2 = %d\n", b_2)); @@ -1364,26 +962,21 @@ u8 _rx_iq_calibration_loop_winbond(hw_data_t *phw_data, u16 factor, u32 frequenc PHY_DEBUG(("[CAL] ** sin(b/2)=%d, cos(b/2)=%d\n", sin_b, cos_b)); PHY_DEBUG(("[CAL] ** sin(b)=%d, cos(b)=%d\n", sin_2b, cos_2b)); - if (cos_2b == 0) - { + if (cos_2b == 0) { PHY_DEBUG(("[CAL] ** <_rx_iq_calibration_loop> ERROR *******\n")); PHY_DEBUG(("[CAL] ** cos(b)=0 !!\n")); PHY_DEBUG(("[CAL] ******************************************\n")); break; } - // 1280 * 32768 = 41943040 + /* 1280 * 32768 = 41943040 */ temp1 = (41943040/cos_2b)*cos_b; - //temp2 = (41943040/cos_2b)*sin_b*(-1); - if (phw_data->revision == 0x2002) // 1st-cut - { + /* temp2 = (41943040/cos_2b)*sin_b*(-1); */ + if (phw_data->revision == 0x2002)/* 1st-cut */ temp2 = (41943040/cos_2b)*sin_b*(-1); - } - else // 2nd-cut - { + else/* 2nd-cut */ temp2 = (41943040*4/cos_2b)*sin_b*(-1); - } rx_cal_flt_b[0] = _floor(temp1/(32768+a_2)); rx_cal_flt_b[1] = _floor(temp2/(32768-a_2)); @@ -1404,23 +997,22 @@ u8 _rx_iq_calibration_loop_winbond(hw_data_t *phw_data, u16 factor, u32 frequenc PHY_DEBUG(("[CAL] rx_cal[2] = %d\n", rx_cal[2])); PHY_DEBUG(("[CAL] rx_cal[3] = %d\n", rx_cal[3])); - // e. + /* e. */ pwr_tone = (iqcal_tone_i*iqcal_tone_i + iqcal_tone_q*iqcal_tone_q); - pwr_image = (iqcal_image_i*iqcal_image_i + iqcal_image_q*iqcal_image_q)*factor; + pwr_image = (iqcal_image_i*iqcal_image_i + + iqcal_image_q*iqcal_image_q)*factor; PHY_DEBUG(("[CAL] ** pwr_tone = %d\n", pwr_tone)); PHY_DEBUG(("[CAL] ** pwr_image = %d\n", pwr_image)); - if (pwr_tone > pwr_image) - { + if (pwr_tone > pwr_image) { verify_count++; PHY_DEBUG(("[CAL] ** <_rx_iq_calibration_loop> *************\n")); PHY_DEBUG(("[CAL] ** VERIFY OK # %d !!\n", verify_count)); PHY_DEBUG(("[CAL] ******************************************\n")); - if (verify_count > 2) - { + if (verify_count > 2) { PHY_DEBUG(("[CAL] ** <_rx_iq_calibration_loop> *********\n")); PHY_DEBUG(("[CAL] ** RX_IQ_CALIBRATION OK !!\n")); PHY_DEBUG(("[CAL] **************************************\n")); @@ -1429,19 +1021,16 @@ u8 _rx_iq_calibration_loop_winbond(hw_data_t *phw_data, u16 factor, u32 frequenc continue; } - // g. + /* g. */ hw_get_dxx_reg(phw_data, 0x54, &val); PHY_DEBUG(("[CAL] ** 0x54 = 0x%08X\n", val)); - if (phw_data->revision == 0x2002) // 1st-cut - { + if (phw_data->revision == 0x2002) /* 1st-cut */{ rx_cal_reg[0] = _s4_to_s32((val & 0x0000F000) >> 12); rx_cal_reg[1] = _s4_to_s32((val & 0x00000F00) >> 8); rx_cal_reg[2] = _s4_to_s32((val & 0x000000F0) >> 4); rx_cal_reg[3] = _s4_to_s32((val & 0x0000000F)); - } - else // 2nd-cut - { + } else /* 2nd-cut */{ rx_cal_reg[0] = _s5_to_s32((val & 0xF8000000) >> 27); rx_cal_reg[1] = _s6_to_s32((val & 0x07E00000) >> 21); rx_cal_reg[2] = _s6_to_s32((val & 0x001F8000) >> 15); @@ -1453,22 +1042,17 @@ u8 _rx_iq_calibration_loop_winbond(hw_data_t *phw_data, u16 factor, u32 frequenc PHY_DEBUG(("[CAL] rx_cal_reg[2] = %d\n", rx_cal_reg[2])); PHY_DEBUG(("[CAL] rx_cal_reg[3] = %d\n", rx_cal_reg[3])); - if (phw_data->revision == 0x2002) // 1st-cut - { - if (((rx_cal_reg[0]==7) || (rx_cal_reg[0]==(-8))) && - ((rx_cal_reg[3]==7) || (rx_cal_reg[3]==(-8)))) - { + if (phw_data->revision == 0x2002) /* 1st-cut */{ + if (((rx_cal_reg[0] == 7) || (rx_cal_reg[0] == (-8))) && + ((rx_cal_reg[3] == 7) || (rx_cal_reg[3] == (-8)))) { PHY_DEBUG(("[CAL] ** <_rx_iq_calibration_loop> *********\n")); PHY_DEBUG(("[CAL] ** RX_IQ_CALIBRATION SATUATION !!\n")); PHY_DEBUG(("[CAL] **************************************\n")); break; } - } - else // 2nd-cut - { - if (((rx_cal_reg[0]==31) || (rx_cal_reg[0]==(-32))) && - ((rx_cal_reg[3]==31) || (rx_cal_reg[3]==(-32)))) - { + } else /* 2nd-cut */{ + if (((rx_cal_reg[0] == 31) || (rx_cal_reg[0] == (-32))) && + ((rx_cal_reg[3] == 31) || (rx_cal_reg[3] == (-32)))) { PHY_DEBUG(("[CAL] ** <_rx_iq_calibration_loop> *********\n")); PHY_DEBUG(("[CAL] ** RX_IQ_CALIBRATION SATUATION !!\n")); PHY_DEBUG(("[CAL] **************************************\n")); @@ -1486,17 +1070,14 @@ u8 _rx_iq_calibration_loop_winbond(hw_data_t *phw_data, u16 factor, u32 frequenc PHY_DEBUG(("[CAL] apply rx_cal[3] = %d\n", rx_cal[3])); hw_get_dxx_reg(phw_data, 0x54, &val); - if (phw_data->revision == 0x2002) // 1st-cut - { + if (phw_data->revision == 0x2002) /* 1st-cut */{ val &= 0x0000FFFF; val |= ((_s32_to_s4(rx_cal[0]) << 12)| (_s32_to_s4(rx_cal[1]) << 8)| (_s32_to_s4(rx_cal[2]) << 4)| (_s32_to_s4(rx_cal[3]))); hw_set_dxx_reg(phw_data, 0x54, val); - } - else // 2nd-cut - { + } else /* 2nd-cut */{ val &= 0x000003FF; val |= ((_s32_to_s5(rx_cal[0]) << 27)| (_s32_to_s6(rx_cal[1]) << 21)| @@ -1504,8 +1085,8 @@ u8 _rx_iq_calibration_loop_winbond(hw_data_t *phw_data, u16 factor, u32 frequenc (_s32_to_s5(rx_cal[3]) << 10)); hw_set_dxx_reg(phw_data, 0x54, val); - if( loop == 3 ) - return 0; + if (loop == 3) + return 0; } PHY_DEBUG(("[CAL] ** CALIB_DATA = 0x%08X\n", val)); @@ -1515,12 +1096,12 @@ u8 _rx_iq_calibration_loop_winbond(hw_data_t *phw_data, u16 factor, u32 frequenc return 1; } -////////////////////////////////////////////////////////// +/*************************************************/ -////////////////////////////////////////////////////////////////////////// -void _rx_iq_calibration_winbond(hw_data_t *phw_data, u32 frequency) +/***************************************************************/ +static void _rx_iq_calibration_winbond(struct hw_data *phw_data, u32 frequency) { -// figo 20050523 marked thsi flag for can't compile for relesase +/* figo 20050523 marked this flag for can't compile for release */ #ifdef _DEBUG s32 rx_cal_reg[4]; u32 val; @@ -1529,37 +1110,34 @@ void _rx_iq_calibration_winbond(hw_data_t *phw_data, u32 frequency) u8 result; PHY_DEBUG(("[CAL] -> [5]_rx_iq_calibration()\n")); -// a. Set RFIC to "RX calibration mode" - //; ----- Calibration (7). RX path IQ imbalance calibration loop - // 0x01 0xFFBFC2 ; 3FEFF ; Calibration (7a). enable RX IQ calibration loop circuits +/* a. Set RFIC to "RX calibration mode" */ + /* ; ----- Calibration (7). RX path IQ imbalance calibration loop */ + /* 0x01 0xFFBFC2 ; 3FEFF ; Calibration (7a). enable RX IQ calibration loop circuits */ phy_set_rf_data(phw_data, 1, (1<<24)|0xEFBFC2); - // 0x0B 0x1A01D6 ; 06817 ; Calibration (7b). enable RX I/Q cal loop SW1 circuit + /* 0x0B 0x1A01D6 ; 06817 ; Calibration (7b). enable RX I/Q cal loop SW1 circuits */ phy_set_rf_data(phw_data, 11, (11<<24)|0x1A05D6); - //0x05 0x24848A ; 09212 ; Calibration (7c). setting TX-VGA gain (TXGCH) to 2 --> to be optimized - phy_set_rf_data(phw_data, 5, (5<<24)| phw_data->txvga_setting_for_cal); - //0x06 0x06840C ; 01A10 ; Calibration (7d). RXGCH=00; RXGCL=010 000 (RXVGA) --> to be optimized + /* 0x05 0x24848A ; 09212 ; Calibration (7c). setting TX-VGA gain (TXGCH) to 2 --> to be optimized */ + phy_set_rf_data(phw_data, 5, (5<<24) | phw_data->txvga_setting_for_cal); + /* 0x06 0x06840C ; 01A10 ; Calibration (7d). RXGCH=00; RXGCL=010 000 (RXVGA) --> to be optimized */ phy_set_rf_data(phw_data, 6, (6<<24)|0x06834C); - //0x00 0xFFF1C0 ; 3F7C7 ; Calibration (7e). turn on IQ imbalance/Test mode + /* 0x00 0xFFF1C0 ; 3F7C7 ; Calibration (7e). turn on IQ imbalance/Test mode */ phy_set_rf_data(phw_data, 0, (0<<24)|0xFFF1C0); - // ; [BB-chip]: Calibration (7f). Send test pattern - // ; [BB-chip]: Calibration (7g). Search RXGCL optimal value - // ; [BB-chip]: Calibration (7h). Caculate RX-path IQ imbalance and setting RX path IQ compensation table + /* ; [BB-chip]: Calibration (7f). Send test pattern */ + /* ; [BB-chip]: Calibration (7g). Search RXGCL optimal value */ + /* ; [BB-chip]: Calibration (7h). Calculate RX-path IQ imbalance and setting RX path IQ compensation table */ result = _rx_iq_calibration_loop_winbond(phw_data, 12589, frequency); - if (result > 0) - { + if (result > 0) { _reset_rx_cal(phw_data); result = _rx_iq_calibration_loop_winbond(phw_data, 7943, frequency); - if (result > 0) - { + if (result > 0) { _reset_rx_cal(phw_data); result = _rx_iq_calibration_loop_winbond(phw_data, 5011, frequency); - if (result > 0) - { + if (result > 0) { PHY_DEBUG(("[CAL] ** <_rx_iq_calibration> **************\n")); PHY_DEBUG(("[CAL] ** RX_IQ_CALIBRATION FAILURE !!\n")); PHY_DEBUG(("[CAL] **************************************\n")); @@ -1572,15 +1150,12 @@ void _rx_iq_calibration_winbond(hw_data_t *phw_data, u32 frequency) hw_get_dxx_reg(phw_data, 0x54, &val); PHY_DEBUG(("[CAL] ** 0x54 = 0x%08X\n", val)); - if (phw_data->revision == 0x2002) // 1st-cut - { + if (phw_data->revision == 0x2002) /* 1st-cut */{ rx_cal_reg[0] = _s4_to_s32((val & 0x0000F000) >> 12); rx_cal_reg[1] = _s4_to_s32((val & 0x00000F00) >> 8); rx_cal_reg[2] = _s4_to_s32((val & 0x000000F0) >> 4); rx_cal_reg[3] = _s4_to_s32((val & 0x0000000F)); - } - else // 2nd-cut - { + } else /* 2nd-cut */{ rx_cal_reg[0] = _s5_to_s32((val & 0xF8000000) >> 27); rx_cal_reg[1] = _s6_to_s32((val & 0x07E00000) >> 21); rx_cal_reg[2] = _s6_to_s32((val & 0x001F8000) >> 15); @@ -1595,89 +1170,80 @@ void _rx_iq_calibration_winbond(hw_data_t *phw_data, u32 frequency) } -//////////////////////////////////////////////////////////////////////// -void phy_calibration_winbond(hw_data_t *phw_data, u32 frequency) +/*******************************************************/ +void phy_calibration_winbond(struct hw_data *phw_data, u32 frequency) { u32 reg_mode_ctrl; u32 iq_alpha; PHY_DEBUG(("[CAL] -> phy_calibration_winbond()\n")); - // 20040701 1.1.25.1000 kevin - hw_get_cxx_reg(phw_data, 0x80, &mac_ctrl); - hw_get_cxx_reg(phw_data, 0xE4, &rf_ctrl); hw_get_dxx_reg(phw_data, 0x58, &iq_alpha); - - _rxadc_dc_offset_cancellation_winbond(phw_data, frequency); - //_txidac_dc_offset_cancellation_winbond(phw_data); - //_txqdac_dc_offset_cacellation_winbond(phw_data); + /* _txidac_dc_offset_cancellation_winbond(phw_data); */ + /* _txqdac_dc_offset_cancellation_winbond(phw_data); */ _tx_iq_calibration_winbond(phw_data); _rx_iq_calibration_winbond(phw_data, frequency); - //------------------------------------------------------------------------ + /*********************************************************************/ hw_get_dxx_reg(phw_data, REG_MODE_CTRL, ®_mode_ctrl); - reg_mode_ctrl &= ~(MASK_IQCAL_TONE_SEL|MASK_IQCAL_MODE|MASK_CALIB_START); // set when finish + reg_mode_ctrl &= ~(MASK_IQCAL_TONE_SEL|MASK_IQCAL_MODE|MASK_CALIB_START); /* set when finish */ hw_set_dxx_reg(phw_data, REG_MODE_CTRL, reg_mode_ctrl); PHY_DEBUG(("[CAL] MODE_CTRL (write) = 0x%08X\n", reg_mode_ctrl)); - // i. Set RFIC to "Normal mode" - hw_set_cxx_reg(phw_data, 0x80, mac_ctrl); - hw_set_cxx_reg(phw_data, 0xE4, rf_ctrl); + /* i. Set RFIC to "Normal mode" */ hw_set_dxx_reg(phw_data, 0x58, iq_alpha); - - //------------------------------------------------------------------------ + /*********************************************************************/ phy_init_rf(phw_data); } -//=========================== -void phy_set_rf_data( phw_data_t pHwData, u32 index, u32 value ) +/******************/ +void phy_set_rf_data(struct hw_data *pHwData, u32 index, u32 value) { - u32 ltmp=0; - - switch( pHwData->phy_type ) - { - case RF_MAXIM_2825: - case RF_MAXIM_V1: // 11g Winbond 2nd BB(with Phy board (v1) + Maxim 331) - ltmp = (1 << 31) | (0 << 30) | (18 << 24) | BitReverse( value, 18 ); - break; - - case RF_MAXIM_2827: - ltmp = (1 << 31) | (0 << 30) | (18 << 24) | BitReverse( value, 18 ); - break; - - case RF_MAXIM_2828: - ltmp = (1 << 31) | (0 << 30) | (18 << 24) | BitReverse( value, 18 ); - break; - - case RF_MAXIM_2829: - ltmp = (1 << 31) | (0 << 30) | (18 << 24) | BitReverse( value, 18 ); - break; - - case RF_AIROHA_2230: - case RF_AIROHA_2230S: // 20060420 Add this - ltmp = (1 << 31) | (0 << 30) | (20 << 24) | BitReverse( value, 20 ); - break; - - case RF_AIROHA_7230: - ltmp = (1 << 31) | (0 << 30) | (24 << 24) | (value&0xffffff); - break; - - case RF_WB_242: - case RF_WB_242_1: // 20060619.5 Add - ltmp = (1 << 31) | (0 << 30) | (24 << 24) | BitReverse( value, 24 ); - break; + u32 ltmp = 0; + + switch (pHwData->phy_type) { + case RF_MAXIM_2825: + case RF_MAXIM_V1: /* 11g Winbond 2nd BB(with Phy board (v1) + Maxim 331) */ + ltmp = (1 << 31) | (0 << 30) | (18 << 24) | BitReverse(value, 18); + break; + + case RF_MAXIM_2827: + ltmp = (1 << 31) | (0 << 30) | (18 << 24) | BitReverse(value, 18); + break; + + case RF_MAXIM_2828: + ltmp = (1 << 31) | (0 << 30) | (18 << 24) | BitReverse(value, 18); + break; + + case RF_MAXIM_2829: + ltmp = (1 << 31) | (0 << 30) | (18 << 24) | BitReverse(value, 18); + break; + + case RF_AIROHA_2230: + case RF_AIROHA_2230S: /* 20060420 Add this */ + ltmp = (1 << 31) | (0 << 30) | (20 << 24) | BitReverse(value, 20); + break; + + case RF_AIROHA_7230: + ltmp = (1 << 31) | (0 << 30) | (24 << 24) | (value&0xffffff); + break; + + case RF_WB_242: + case RF_WB_242_1:/* 20060619.5 Add */ + ltmp = (1 << 31) | (0 << 30) | (24 << 24) | BitReverse(value, 24); + break; } - Wb35Reg_WriteSync( pHwData, 0x0864, ltmp ); + Wb35Reg_WriteSync(pHwData, 0x0864, ltmp); } -// 20060717 modify as Bruce's mail -unsigned char adjust_TXVGA_for_iq_mag(hw_data_t *phw_data) +/* 20060717 modify as Bruce's mail */ +unsigned char adjust_TXVGA_for_iq_mag(struct hw_data *phw_data) { int init_txvga = 0; u32 reg_mode_ctrl; @@ -1686,27 +1252,27 @@ unsigned char adjust_TXVGA_for_iq_mag(hw_data_t *phw_data) s32 iqcal_tone_q0; u32 sqsum; s32 iq_mag_0_tx; - u8 reg_state; - int current_txvga; + u8 reg_state; + int current_txvga; reg_state = 0; - for( init_txvga=0; init_txvga<10; init_txvga++) - { - current_txvga = ( 0x24C40A|(init_txvga<<6) ); - phy_set_rf_data(phw_data, 5, ((5<<24)|current_txvga) ); + for (init_txvga = 0; init_txvga < 10; init_txvga++) { + current_txvga = (0x24C40A|(init_txvga<<6)); + phy_set_rf_data(phw_data, 5, ((5<<24)|current_txvga)); phw_data->txvga_setting_for_cal = current_txvga; - //pa_stall_execution(30000);//Sleep(30); - OS_SLEEP(30000); // 20060612.1.a + msleep(30);/* 20060612.1.a */ - if( !hw_get_dxx_reg(phw_data, REG_MODE_CTRL, ®_mode_ctrl) ) // 20060718.1 modify - return FALSE; + if (!hw_get_dxx_reg(phw_data, REG_MODE_CTRL, ®_mode_ctrl))/* 20060718.1 modify */ + return false; PHY_DEBUG(("[CAL] MODE_CTRL (read) = 0x%08X\n", reg_mode_ctrl)); - // a. Set iqcal_mode[1:0] to 0x2 and set "calib_start" to 0x1 to - // enable "IQ alibration Mode II" + /* + * a. Set iqcal_mode[1:0] to 0x2 and set "calib_start" to 0x1 to + * enable "IQ alibration Mode II" + */ reg_mode_ctrl &= ~(MASK_IQCAL_TONE_SEL|MASK_IQCAL_MODE); reg_mode_ctrl &= ~MASK_IQCAL_MODE; reg_mode_ctrl |= (MASK_CALIB_START|0x02); @@ -1714,19 +1280,15 @@ unsigned char adjust_TXVGA_for_iq_mag(hw_data_t *phw_data) hw_set_dxx_reg(phw_data, REG_MODE_CTRL, reg_mode_ctrl); PHY_DEBUG(("[CAL] MODE_CTRL (write) = 0x%08X\n", reg_mode_ctrl)); - //pa_stall_execution(US); - OS_SLEEP(1); // 20060612.1.a + udelay(1);/* 20060612.1.a */ - //pa_stall_execution(300);//Sleep(30); - OS_SLEEP(300); // 20060612.1.a + udelay(300);/* 20060612.1.a */ - // b. + /* b. */ hw_get_dxx_reg(phw_data, REG_CALIB_READ1, &val); PHY_DEBUG(("[CAL] CALIB_READ1 = 0x%08X\n", val)); - //pa_stall_execution(US); - //pa_stall_execution(300);//Sleep(30); - OS_SLEEP(300); // 20060612.1.a + udelay(300);/* 20060612.1.a */ iqcal_tone_i0 = _s13_to_s32(val & 0x00001FFF); iqcal_tone_q0 = _s13_to_s32((val & 0x03FFE000) >> 13); @@ -1735,25 +1297,21 @@ unsigned char adjust_TXVGA_for_iq_mag(hw_data_t *phw_data) sqsum = iqcal_tone_i0*iqcal_tone_i0 + iqcal_tone_q0*iqcal_tone_q0; iq_mag_0_tx = (s32) _sqrt(sqsum); - PHY_DEBUG(("[CAL] ** auto_adjust_txvga_for_iq_mag_0_tx=%d\n", iq_mag_0_tx)); + PHY_DEBUG(("[CAL] ** auto_adjust_txvga_for_iq_mag_0_tx=%d\n", + iq_mag_0_tx)); - if( iq_mag_0_tx>=700 && iq_mag_0_tx<=1750 ) + if (iq_mag_0_tx >= 700 && iq_mag_0_tx <= 1750) break; - else if(iq_mag_0_tx > 1750) - { - init_txvga=-2; + else if (iq_mag_0_tx > 1750) { + init_txvga = -2; continue; - } - else + } else continue; } - if( iq_mag_0_tx>=700 && iq_mag_0_tx<=1750 ) - return TRUE; + if (iq_mag_0_tx >= 700 && iq_mag_0_tx <= 1750) + return true; else - return FALSE; + return false; } - - - diff --git a/drivers/staging/winbond/phy_calibration.h b/drivers/staging/winbond/phy_calibration.h index b6a65d31301..78fc6805860 100644 --- a/drivers/staging/winbond/phy_calibration.h +++ b/drivers/staging/winbond/phy_calibration.h @@ -1,101 +1,85 @@ -// 20031229 Turbo add -#define REG_AGC_CTRL1 0x1000 -#define REG_AGC_CTRL2 0x1004 -#define REG_AGC_CTRL3 0x1008 -#define REG_AGC_CTRL4 0x100C -#define REG_AGC_CTRL5 0x1010 -#define REG_AGC_CTRL6 0x1014 -#define REG_AGC_CTRL7 0x1018 -#define REG_AGC_CTRL8 0x101C -#define REG_AGC_CTRL9 0x1020 -#define REG_AGC_CTRL10 0x1024 -#define REG_CCA_CTRL 0x1028 -#define REG_A_ACQ_CTRL 0x102C -#define REG_B_ACQ_CTRL 0x1030 -#define REG_A_TXRX_CTRL 0x1034 -#define REG_B_TXRX_CTRL 0x1038 -#define REG_A_TX_COEF3 0x103C -#define REG_A_TX_COEF2 0x1040 -#define REG_A_TX_COEF1 0x1044 -#define REG_B_TX_COEF2 0x1048 -#define REG_B_TX_COEF1 0x104C -#define REG_MODE_CTRL 0x1050 -#define REG_CALIB_DATA 0x1054 -#define REG_IQ_ALPHA 0x1058 -#define REG_DC_CANCEL 0x105C -#define REG_WTO_READ 0x1060 -#define REG_OFFSET_READ 0x1064 -#define REG_CALIB_READ1 0x1068 -#define REG_CALIB_READ2 0x106C -#define REG_A_FREQ_EST 0x1070 - - - - -// 20031101 Turbo add -#define MASK_AMER_OFF_REG BIT(31) - -#define MASK_BMER_OFF_REG BIT(31) - -#define MASK_LNA_FIX_GAIN (BIT(3)|BIT(4)) -#define MASK_AGC_FIX BIT(1) - -#define MASK_AGC_FIX_GAIN 0xFF00 - -#define MASK_ADC_DC_CAL_STR BIT(10) -#define MASK_CALIB_START BIT(4) -#define MASK_IQCAL_TONE_SEL (BIT(3)|BIT(2)) -#define MASK_IQCAL_MODE (BIT(1)|BIT(0)) - -#define MASK_TX_CAL_0 0xF0000000 -#define TX_CAL_0_SHIFT 28 -#define MASK_TX_CAL_1 0x0F000000 -#define TX_CAL_1_SHIFT 24 -#define MASK_TX_CAL_2 0x00F00000 -#define TX_CAL_2_SHIFT 20 -#define MASK_TX_CAL_3 0x000F0000 -#define TX_CAL_3_SHIFT 16 -#define MASK_RX_CAL_0 0x0000F000 -#define RX_CAL_0_SHIFT 12 -#define MASK_RX_CAL_1 0x00000F00 -#define RX_CAL_1_SHIFT 8 -#define MASK_RX_CAL_2 0x000000F0 -#define RX_CAL_2_SHIFT 4 -#define MASK_RX_CAL_3 0x0000000F -#define RX_CAL_3_SHIFT 0 - -#define MASK_CANCEL_DC_I 0x3E0 -#define CANCEL_DC_I_SHIFT 5 -#define MASK_CANCEL_DC_Q 0x01F -#define CANCEL_DC_Q_SHIFT 0 - -// LA20040210 kevin -//#define MASK_ADC_DC_CAL_I(x) (((x)&0x1FE00)>>9) -//#define MASK_ADC_DC_CAL_Q(x) ((x)&0x1FF) -#define MASK_ADC_DC_CAL_I(x) (((x)&0x0003FE00)>>9) -#define MASK_ADC_DC_CAL_Q(x) ((x)&0x000001FF) - -// LA20040210 kevin (Turbo has wrong definition) -//#define MASK_IQCAL_TONE_I 0x7FFC000 -//#define SHIFT_IQCAL_TONE_I(x) ((x)>>13) -//#define MASK_IQCAL_TONE_Q 0x1FFF -//#define SHIFT_IQCAL_TONE_Q(x) ((x)>>0) -#define MASK_IQCAL_TONE_I 0x00001FFF -#define SHIFT_IQCAL_TONE_I(x) ((x)>>0) -#define MASK_IQCAL_TONE_Q 0x03FFE000 -#define SHIFT_IQCAL_TONE_Q(x) ((x)>>13) - -// LA20040210 kevin (Turbo has wrong definition) -//#define MASK_IQCAL_IMAGE_I 0x7FFC000 -//#define SHIFT_IQCAL_IMAGE_I(x) ((x)>>13) -//#define MASK_IQCAL_IMAGE_Q 0x1FFF -//#define SHIFT_IQCAL_IMAGE_Q(x) ((x)>>0) - -//#define MASK_IQCAL_IMAGE_I 0x00001FFF -//#define SHIFT_IQCAL_IMAGE_I(x) ((x)>>0) -//#define MASK_IQCAL_IMAGE_Q 0x03FFE000 -//#define SHIFT_IQCAL_IMAGE_Q(x) ((x)>>13) - -void phy_set_rf_data( phw_data_t pHwData, u32 index, u32 value ); -#define phy_init_rf( _A ) //RFSynthesizer_initial( _A ) - +#ifndef __WINBOND_PHY_CALIBRATION_H +#define __WINBOND_PHY_CALIBRATION_H + +#include "wbhal.h" + +#define REG_AGC_CTRL1 0x1000 +#define REG_AGC_CTRL2 0x1004 +#define REG_AGC_CTRL3 0x1008 +#define REG_AGC_CTRL4 0x100C +#define REG_AGC_CTRL5 0x1010 +#define REG_AGC_CTRL6 0x1014 +#define REG_AGC_CTRL7 0x1018 +#define REG_AGC_CTRL8 0x101C +#define REG_AGC_CTRL9 0x1020 +#define REG_AGC_CTRL10 0x1024 +#define REG_CCA_CTRL 0x1028 +#define REG_A_ACQ_CTRL 0x102C +#define REG_B_ACQ_CTRL 0x1030 +#define REG_A_TXRX_CTRL 0x1034 +#define REG_B_TXRX_CTRL 0x1038 +#define REG_A_TX_COEF3 0x103C +#define REG_A_TX_COEF2 0x1040 +#define REG_A_TX_COEF1 0x1044 +#define REG_B_TX_COEF2 0x1048 +#define REG_B_TX_COEF1 0x104C +#define REG_MODE_CTRL 0x1050 +#define REG_CALIB_DATA 0x1054 +#define REG_IQ_ALPHA 0x1058 +#define REG_DC_CANCEL 0x105C +#define REG_WTO_READ 0x1060 +#define REG_OFFSET_READ 0x1064 +#define REG_CALIB_READ1 0x1068 +#define REG_CALIB_READ2 0x106C +#define REG_A_FREQ_EST 0x1070 + + +#define MASK_AMER_OFF_REG BIT(31) + +#define MASK_BMER_OFF_REG BIT(31) + +#define MASK_LNA_FIX_GAIN (BIT(3) | BIT(4)) +#define MASK_AGC_FIX BIT(1) + +#define MASK_AGC_FIX_GAIN 0xFF00 + +#define MASK_ADC_DC_CAL_STR BIT(10) +#define MASK_CALIB_START BIT(4) +#define MASK_IQCAL_TONE_SEL (BIT(3) | BIT(2)) +#define MASK_IQCAL_MODE (BIT(1) | BIT(0)) + +#define MASK_TX_CAL_0 0xF0000000 +#define TX_CAL_0_SHIFT 28 +#define MASK_TX_CAL_1 0x0F000000 +#define TX_CAL_1_SHIFT 24 +#define MASK_TX_CAL_2 0x00F00000 +#define TX_CAL_2_SHIFT 20 +#define MASK_TX_CAL_3 0x000F0000 +#define TX_CAL_3_SHIFT 16 +#define MASK_RX_CAL_0 0x0000F000 +#define RX_CAL_0_SHIFT 12 +#define MASK_RX_CAL_1 0x00000F00 +#define RX_CAL_1_SHIFT 8 +#define MASK_RX_CAL_2 0x000000F0 +#define RX_CAL_2_SHIFT 4 +#define MASK_RX_CAL_3 0x0000000F +#define RX_CAL_3_SHIFT 0 + +#define MASK_CANCEL_DC_I 0x3E0 +#define CANCEL_DC_I_SHIFT 5 +#define MASK_CANCEL_DC_Q 0x01F +#define CANCEL_DC_Q_SHIFT 0 + +#define MASK_ADC_DC_CAL_I(x) (((x) & 0x0003FE00) >> 9) +#define MASK_ADC_DC_CAL_Q(x) ((x) & 0x000001FF) + +#define MASK_IQCAL_TONE_I 0x00001FFF +#define SHIFT_IQCAL_TONE_I(x) ((x) >> 0) +#define MASK_IQCAL_TONE_Q 0x03FFE000 +#define SHIFT_IQCAL_TONE_Q(x) ((x) >> 13) + +void phy_set_rf_data(struct hw_data *pHwData, u32 index, u32 value); +void phy_calibration_winbond(struct hw_data *phw_data, u32 frequency); +#define phy_init_rf(_A) /* RFSynthesizer_initial(_A) */ + +#endif diff --git a/drivers/staging/winbond/reg.c b/drivers/staging/winbond/reg.c index 57af5b83150..5fd4c4a72ee 100644 --- a/drivers/staging/winbond/reg.c +++ b/drivers/staging/winbond/reg.c @@ -1,513 +1,408 @@ -#include "os_common.h" - -/////////////////////////////////////////////////////////////////////////////////////////////////// -// Original Phy.h -//***************************************************************************** - -/***************************************************************************** -; For MAXIM2825/6/7 Ver. 331 or more -; Edited by Tiger, Sep-17-2003 -; revised by Ben, Sep-18-2003 - -0x00 0x000a2 -0x01 0x21cc0 -;0x02 0x13802 -0x02 0x1383a - -;channe1 01 ; 0x03 0x30142 ; 0x04 0x0b333; -;channe1 02 ;0x03 0x32141 ;0x04 0x08444; -;channe1 03 ;0x03 0x32143 ;0x04 0x0aeee; -;channe1 04 ;0x03 0x32142 ;0x04 0x0b333; -;channe1 05 ;0x03 0x31141 ;0x04 0x08444; -;channe1 06 ; -0x03 0x31143; -0x04 0x0aeee; -;channe1 07 ;0x03 0x31142 ;0x04 0x0b333; -;channe1 08 ;0x03 0x33141 ;0x04 0x08444; -;channe1 09 ;0x03 0x33143 ;0x04 0x0aeee; -;channe1 10 ;0x03 0x33142 ;0x04 0x0b333; -;channe1 11 ;0x03 0x30941 ;0x04 0x08444; -;channe1 12 ;0x03 0x30943 ;0x04 0x0aeee; -;channe1 13 ;0x03 0x30942 ;0x04 0x0b333; - -0x05 0x28986 -0x06 0x18008 -0x07 0x38400 -0x08 0x05100; 100 Hz DC -;0x08 0x05900; 30 KHz DC -0x09 0x24f08 -0x0a 0x17e00, 0x17ea0 -0x0b 0x37d80 -0x0c 0x0c900 // 0x0ca00 (lager power 9db than 0x0c000), 0x0c000 -*****************************************************************************/ -// MAX2825 (pure b/g) -u32 max2825_rf_data[] = -{ - (0x00<<18)|0x000a2, - (0x01<<18)|0x21cc0, - (0x02<<18)|0x13806, - (0x03<<18)|0x30142, - (0x04<<18)|0x0b333, - (0x05<<18)|0x289A6, - (0x06<<18)|0x18008, - (0x07<<18)|0x38000, - (0x08<<18)|0x05100, - (0x09<<18)|0x24f08, - (0x0A<<18)|0x14000, - (0x0B<<18)|0x37d80, - (0x0C<<18)|0x0c100 // 11a: 0x0c300, 11g: 0x0c100 -}; - -u32 max2825_channel_data_24[][3] = -{ - {(0x03<<18)|0x30142, (0x04<<18)|0x0b333, (0x05<<18)|0x289A6}, // channe1 01 - {(0x03<<18)|0x32141, (0x04<<18)|0x08444, (0x05<<18)|0x289A6}, // channe1 02 - {(0x03<<18)|0x32143, (0x04<<18)|0x0aeee, (0x05<<18)|0x289A6}, // channe1 03 - {(0x03<<18)|0x32142, (0x04<<18)|0x0b333, (0x05<<18)|0x289A6}, // channe1 04 - {(0x03<<18)|0x31141, (0x04<<18)|0x08444, (0x05<<18)|0x289A6}, // channe1 05 - {(0x03<<18)|0x31143, (0x04<<18)|0x0aeee, (0x05<<18)|0x289A6}, // channe1 06 - {(0x03<<18)|0x31142, (0x04<<18)|0x0b333, (0x05<<18)|0x289A6}, // channe1 07 - {(0x03<<18)|0x33141, (0x04<<18)|0x08444, (0x05<<18)|0x289A6}, // channe1 08 - {(0x03<<18)|0x33143, (0x04<<18)|0x0aeee, (0x05<<18)|0x289A6}, // channe1 09 - {(0x03<<18)|0x33142, (0x04<<18)|0x0b333, (0x05<<18)|0x289A6}, // channe1 10 - {(0x03<<18)|0x30941, (0x04<<18)|0x08444, (0x05<<18)|0x289A6}, // channe1 11 - {(0x03<<18)|0x30943, (0x04<<18)|0x0aeee, (0x05<<18)|0x289A6}, // channe1 12 - {(0x03<<18)|0x30942, (0x04<<18)|0x0b333, (0x05<<18)|0x289A6}, // channe1 13 - {(0x03<<18)|0x32941, (0x04<<18)|0x09999, (0x05<<18)|0x289A6} // 14 (2484MHz) hhmodify -}; +#include "wbhal.h" +#include "wb35reg_f.h" +#include "core.h" -u32 max2825_power_data_24[] = {(0x0C<<18)|0x0c000, (0x0C<<18)|0x0c100}; +/* + * ==================================================== + * Original Phy.h + * ==================================================== + */ -/****************************************************************************/ -// MAX2827 (a/b/g) -u32 max2827_rf_data[] = -{ - (0x00<<18)|0x000a2, - (0x01<<18)|0x21cc0, - (0x02<<18)|0x13806, - (0x03<<18)|0x30142, - (0x04<<18)|0x0b333, - (0x05<<18)|0x289A6, - (0x06<<18)|0x18008, - (0x07<<18)|0x38000, - (0x08<<18)|0x05100, - (0x09<<18)|0x24f08, - (0x0A<<18)|0x14000, - (0x0B<<18)|0x37d80, - (0x0C<<18)|0x0c100 // 11a: 0x0c300, 11g: 0x0c100 +/* + * ==================================================== + * For MAXIM2825/6/7 Ver. 331 or more + * + * 0x00 0x000a2 + * 0x01 0x21cc0 + * 0x02 0x13802 + * 0x02 0x1383a + * + * channe1 01 ; 0x03 0x30142 ; 0x04 0x0b333; + * channe1 02 ; 0x03 0x32141 ; 0x04 0x08444; + * channe1 03 ; 0x03 0x32143 ; 0x04 0x0aeee; + * channe1 04 ; 0x03 0x32142 ; 0x04 0x0b333; + * channe1 05 ; 0x03 0x31141 ; 0x04 0x08444; + * channe1 06 ; 0x03 0x31143 ; 0x04 0x0aeee; + * channe1 07 ; 0x03 0x31142 ; 0x04 0x0b333; + * channe1 08 ; 0x03 0x33141 ; 0x04 0x08444; + * channe1 09 ; 0x03 0x33143 ; 0x04 0x0aeee; + * channe1 10 ; 0x03 0x33142 ; 0x04 0x0b333; + * channe1 11 ; 0x03 0x30941 ; 0x04 0x08444; + * channe1 12 ; 0x03 0x30943 ; 0x04 0x0aeee; + * channe1 13 ; 0x03 0x30942 ; 0x04 0x0b333; + * + * 0x05 0x28986 + * 0x06 0x18008 + * 0x07 0x38400 + * 0x08 0x05100; 100 Hz DC + * 0x08 0x05900; 30 KHz DC + * 0x09 0x24f08 + * 0x0a 0x17e00, 0x17ea0 + * 0x0b 0x37d80 + * 0x0c 0x0c900 -- 0x0ca00 (lager power 9db than 0x0c000), 0x0c000 + */ + +/* MAX2825 (pure b/g) */ +static u32 max2825_rf_data[] = { + (0x00<<18) | 0x000a2, + (0x01<<18) | 0x21cc0, + (0x02<<18) | 0x13806, + (0x03<<18) | 0x30142, + (0x04<<18) | 0x0b333, + (0x05<<18) | 0x289A6, + (0x06<<18) | 0x18008, + (0x07<<18) | 0x38000, + (0x08<<18) | 0x05100, + (0x09<<18) | 0x24f08, + (0x0A<<18) | 0x14000, + (0x0B<<18) | 0x37d80, + (0x0C<<18) | 0x0c100 /* 11a: 0x0c300, 11g: 0x0c100 */ }; -u32 max2827_channel_data_24[][3] = -{ - {(0x03<<18)|0x30142, (0x04<<18)|0x0b333, (0x05<<18)|0x289A6}, // channe1 01 - {(0x03<<18)|0x32141, (0x04<<18)|0x08444, (0x05<<18)|0x289A6}, // channe1 02 - {(0x03<<18)|0x32143, (0x04<<18)|0x0aeee, (0x05<<18)|0x289A6}, // channe1 03 - {(0x03<<18)|0x32142, (0x04<<18)|0x0b333, (0x05<<18)|0x289A6}, // channe1 04 - {(0x03<<18)|0x31141, (0x04<<18)|0x08444, (0x05<<18)|0x289A6}, // channe1 05 - {(0x03<<18)|0x31143, (0x04<<18)|0x0aeee, (0x05<<18)|0x289A6}, // channe1 06 - {(0x03<<18)|0x31142, (0x04<<18)|0x0b333, (0x05<<18)|0x289A6}, // channe1 07 - {(0x03<<18)|0x33141, (0x04<<18)|0x08444, (0x05<<18)|0x289A6}, // channe1 08 - {(0x03<<18)|0x33143, (0x04<<18)|0x0aeee, (0x05<<18)|0x289A6}, // channe1 09 - {(0x03<<18)|0x33142, (0x04<<18)|0x0b333, (0x05<<18)|0x289A6}, // channe1 10 - {(0x03<<18)|0x30941, (0x04<<18)|0x08444, (0x05<<18)|0x289A6}, // channe1 11 - {(0x03<<18)|0x30943, (0x04<<18)|0x0aeee, (0x05<<18)|0x289A6}, // channe1 12 - {(0x03<<18)|0x30942, (0x04<<18)|0x0b333, (0x05<<18)|0x289A6}, // channe1 13 - {(0x03<<18)|0x32941, (0x04<<18)|0x09999, (0x05<<18)|0x289A6} // 14 (2484MHz) hhmodify +static u32 max2825_channel_data_24[][3] = { + {(0x03 << 18) | 0x30142, (0x04 << 18) | 0x0b333, (0x05 << 18) | 0x289A6}, /* channel 01 */ + {(0x03 << 18) | 0x32141, (0x04 << 18) | 0x08444, (0x05 << 18) | 0x289A6}, /* channel 02 */ + {(0x03 << 18) | 0x32143, (0x04 << 18) | 0x0aeee, (0x05 << 18) | 0x289A6}, /* channel 03 */ + {(0x03 << 18) | 0x32142, (0x04 << 18) | 0x0b333, (0x05 << 18) | 0x289A6}, /* channel 04 */ + {(0x03 << 18) | 0x31141, (0x04 << 18) | 0x08444, (0x05 << 18) | 0x289A6}, /* channel 05 */ + {(0x03 << 18) | 0x31143, (0x04 << 18) | 0x0aeee, (0x05 << 18) | 0x289A6}, /* channel 06 */ + {(0x03 << 18) | 0x31142, (0x04 << 18) | 0x0b333, (0x05 << 18) | 0x289A6}, /* channel 07 */ + {(0x03 << 18) | 0x33141, (0x04 << 18) | 0x08444, (0x05 << 18) | 0x289A6}, /* channel 08 */ + {(0x03 << 18) | 0x33143, (0x04 << 18) | 0x0aeee, (0x05 << 18) | 0x289A6}, /* channel 09 */ + {(0x03 << 18) | 0x33142, (0x04 << 18) | 0x0b333, (0x05 << 18) | 0x289A6}, /* channel 10 */ + {(0x03 << 18) | 0x30941, (0x04 << 18) | 0x08444, (0x05 << 18) | 0x289A6}, /* channel 11 */ + {(0x03 << 18) | 0x30943, (0x04 << 18) | 0x0aeee, (0x05 << 18) | 0x289A6}, /* channel 12 */ + {(0x03 << 18) | 0x30942, (0x04 << 18) | 0x0b333, (0x05 << 18) | 0x289A6}, /* channel 13 */ + {(0x03 << 18) | 0x32941, (0x04 << 18) | 0x09999, (0x05 << 18) | 0x289A6} /* channel 14 (2484MHz) */ }; -u32 max2827_channel_data_50[][3] = -{ - {(0x03<<18)|0x33cc3, (0x04<<18)|0x08ccc, (0x05<<18)|0x2A9A6}, // channel 36 - {(0x03<<18)|0x302c0, (0x04<<18)|0x08000, (0x05<<18)|0x2A9A6}, // channel 40 - {(0x03<<18)|0x302c2, (0x04<<18)|0x0b333, (0x05<<18)|0x2A9A6}, // channel 44 - {(0x03<<18)|0x322c1, (0x04<<18)|0x09999, (0x05<<18)|0x2A9A6}, // channel 48 - {(0x03<<18)|0x312c1, (0x04<<18)|0x0a666, (0x05<<18)|0x2A9A6}, // channel 52 - {(0x03<<18)|0x332c3, (0x04<<18)|0x08ccc, (0x05<<18)|0x2A9A6}, // channel 56 - {(0x03<<18)|0x30ac0, (0x04<<18)|0x08000, (0x05<<18)|0x2A9A6}, // channel 60 - {(0x03<<18)|0x30ac2, (0x04<<18)|0x0b333, (0x05<<18)|0x2A9A6} // channel 64 +static u32 max2825_power_data_24[] = {(0x0C << 18) | 0x0c000, (0x0C << 18) | 0x0c100}; + +/* ========================================== */ +/* MAX2827 (a/b/g) */ +static u32 max2827_rf_data[] = { + (0x00 << 18) | 0x000a2, + (0x01 << 18) | 0x21cc0, + (0x02 << 18) | 0x13806, + (0x03 << 18) | 0x30142, + (0x04 << 18) | 0x0b333, + (0x05 << 18) | 0x289A6, + (0x06 << 18) | 0x18008, + (0x07 << 18) | 0x38000, + (0x08 << 18) | 0x05100, + (0x09 << 18) | 0x24f08, + (0x0A << 18) | 0x14000, + (0x0B << 18) | 0x37d80, + (0x0C << 18) | 0x0c100 /* 11a: 0x0c300, 11g: 0x0c100 */ }; -u32 max2827_power_data_24[] = {(0x0C<<18)|0x0C000, (0x0C<<18)|0x0D600, (0x0C<<18)|0x0C100}; -u32 max2827_power_data_50[] = {(0x0C<<18)|0x0C400, (0x0C<<18)|0x0D500, (0x0C<<18)|0x0C300}; - -/****************************************************************************/ -// MAX2828 (a/b/g) -u32 max2828_rf_data[] = -{ - (0x00<<18)|0x000a2, - (0x01<<18)|0x21cc0, - (0x02<<18)|0x13806, - (0x03<<18)|0x30142, - (0x04<<18)|0x0b333, - (0x05<<18)|0x289A6, - (0x06<<18)|0x18008, - (0x07<<18)|0x38000, - (0x08<<18)|0x05100, - (0x09<<18)|0x24f08, - (0x0A<<18)|0x14000, - (0x0B<<18)|0x37d80, - (0x0C<<18)|0x0c100 // 11a: 0x0c300, 11g: 0x0c100 +static u32 max2827_channel_data_24[][3] = { + {(0x03 << 18) | 0x30142, (0x04 << 18) | 0x0b333, (0x05 << 18) | 0x289A6}, /* channe1 01 */ + {(0x03 << 18) | 0x32141, (0x04 << 18) | 0x08444, (0x05 << 18) | 0x289A6}, /* channe1 02 */ + {(0x03 << 18) | 0x32143, (0x04 << 18) | 0x0aeee, (0x05 << 18) | 0x289A6}, /* channe1 03 */ + {(0x03 << 18) | 0x32142, (0x04 << 18) | 0x0b333, (0x05 << 18) | 0x289A6}, /* channe1 04 */ + {(0x03 << 18) | 0x31141, (0x04 << 18) | 0x08444, (0x05 << 18) | 0x289A6}, /* channe1 05 */ + {(0x03 << 18) | 0x31143, (0x04 << 18) | 0x0aeee, (0x05 << 18) | 0x289A6}, /* channe1 06 */ + {(0x03 << 18) | 0x31142, (0x04 << 18) | 0x0b333, (0x05 << 18) | 0x289A6}, /* channe1 07 */ + {(0x03 << 18) | 0x33141, (0x04 << 18) | 0x08444, (0x05 << 18) | 0x289A6}, /* channe1 08 */ + {(0x03 << 18) | 0x33143, (0x04 << 18) | 0x0aeee, (0x05 << 18) | 0x289A6}, /* channe1 09 */ + {(0x03 << 18) | 0x33142, (0x04 << 18) | 0x0b333, (0x05 << 18) | 0x289A6}, /* channe1 10 */ + {(0x03 << 18) | 0x30941, (0x04 << 18) | 0x08444, (0x05 << 18) | 0x289A6}, /* channe1 11 */ + {(0x03 << 18) | 0x30943, (0x04 << 18) | 0x0aeee, (0x05 << 18) | 0x289A6}, /* channe1 12 */ + {(0x03 << 18) | 0x30942, (0x04 << 18) | 0x0b333, (0x05 << 18) | 0x289A6}, /* channe1 13 */ + {(0x03 << 18) | 0x32941, (0x04 << 18) | 0x09999, (0x05 << 18) | 0x289A6} /* channel 14 (2484MHz) */ }; -u32 max2828_channel_data_24[][3] = -{ - {(0x03<<18)|0x30142, (0x04<<18)|0x0b333, (0x05<<18)|0x289A6}, // channe1 01 - {(0x03<<18)|0x32141, (0x04<<18)|0x08444, (0x05<<18)|0x289A6}, // channe1 02 - {(0x03<<18)|0x32143, (0x04<<18)|0x0aeee, (0x05<<18)|0x289A6}, // channe1 03 - {(0x03<<18)|0x32142, (0x04<<18)|0x0b333, (0x05<<18)|0x289A6}, // channe1 04 - {(0x03<<18)|0x31141, (0x04<<18)|0x08444, (0x05<<18)|0x289A6}, // channe1 05 - {(0x03<<18)|0x31143, (0x04<<18)|0x0aeee, (0x05<<18)|0x289A6}, // channe1 06 - {(0x03<<18)|0x31142, (0x04<<18)|0x0b333, (0x05<<18)|0x289A6}, // channe1 07 - {(0x03<<18)|0x33141, (0x04<<18)|0x08444, (0x05<<18)|0x289A6}, // channe1 08 - {(0x03<<18)|0x33143, (0x04<<18)|0x0aeee, (0x05<<18)|0x289A6}, // channe1 09 - {(0x03<<18)|0x33142, (0x04<<18)|0x0b333, (0x05<<18)|0x289A6}, // channe1 10 - {(0x03<<18)|0x30941, (0x04<<18)|0x08444, (0x05<<18)|0x289A6}, // channe1 11 - {(0x03<<18)|0x30943, (0x04<<18)|0x0aeee, (0x05<<18)|0x289A6}, // channe1 12 - {(0x03<<18)|0x30942, (0x04<<18)|0x0b333, (0x05<<18)|0x289A6}, // channe1 13 - {(0x03<<18)|0x32941, (0x04<<18)|0x09999, (0x05<<18)|0x289A6} // 14 (2484MHz) hhmodify +static u32 max2827_channel_data_50[][3] = { + {(0x03 << 18) | 0x33cc3, (0x04 << 18) | 0x08ccc, (0x05 << 18) | 0x2A9A6}, /* channel 36 */ + {(0x03 << 18) | 0x302c0, (0x04 << 18) | 0x08000, (0x05 << 18) | 0x2A9A6}, /* channel 40 */ + {(0x03 << 18) | 0x302c2, (0x04 << 18) | 0x0b333, (0x05 << 18) | 0x2A9A6}, /* channel 44 */ + {(0x03 << 18) | 0x322c1, (0x04 << 18) | 0x09999, (0x05 << 18) | 0x2A9A6}, /* channel 48 */ + {(0x03 << 18) | 0x312c1, (0x04 << 18) | 0x0a666, (0x05 << 18) | 0x2A9A6}, /* channel 52 */ + {(0x03 << 18) | 0x332c3, (0x04 << 18) | 0x08ccc, (0x05 << 18) | 0x2A9A6}, /* channel 56 */ + {(0x03 << 18) | 0x30ac0, (0x04 << 18) | 0x08000, (0x05 << 18) | 0x2A9A6}, /* channel 60 */ + {(0x03 << 18) | 0x30ac2, (0x04 << 18) | 0x0b333, (0x05 << 18) | 0x2A9A6} /* channel 64 */ }; -u32 max2828_channel_data_50[][3] = -{ - {(0x03<<18)|0x33cc3, (0x04<<18)|0x08ccc, (0x05<<18)|0x289A6}, // channel 36 - {(0x03<<18)|0x302c0, (0x04<<18)|0x08000, (0x05<<18)|0x289A6}, // channel 40 - {(0x03<<18)|0x302c2, (0x04<<18)|0x0b333, (0x05<<18)|0x289A6}, // channel 44 - {(0x03<<18)|0x322c1, (0x04<<18)|0x09999, (0x05<<18)|0x289A6}, // channel 48 - {(0x03<<18)|0x312c1, (0x04<<18)|0x0a666, (0x05<<18)|0x289A6}, // channel 52 - {(0x03<<18)|0x332c3, (0x04<<18)|0x08ccc, (0x05<<18)|0x289A6}, // channel 56 - {(0x03<<18)|0x30ac0, (0x04<<18)|0x08000, (0x05<<18)|0x289A6}, // channel 60 - {(0x03<<18)|0x30ac2, (0x04<<18)|0x0b333, (0x05<<18)|0x289A6} // channel 64 +static u32 max2827_power_data_24[] = {(0x0C << 18) | 0x0C000, (0x0C << 18) | 0x0D600, (0x0C << 18) | 0x0C100}; +static u32 max2827_power_data_50[] = {(0x0C << 18) | 0x0C400, (0x0C << 18) | 0x0D500, (0x0C << 18) | 0x0C300}; + +/* ======================================================= */ +/* MAX2828 (a/b/g) */ +static u32 max2828_rf_data[] = { + (0x00 << 18) | 0x000a2, + (0x01 << 18) | 0x21cc0, + (0x02 << 18) | 0x13806, + (0x03 << 18) | 0x30142, + (0x04 << 18) | 0x0b333, + (0x05 << 18) | 0x289A6, + (0x06 << 18) | 0x18008, + (0x07 << 18) | 0x38000, + (0x08 << 18) | 0x05100, + (0x09 << 18) | 0x24f08, + (0x0A << 18) | 0x14000, + (0x0B << 18) | 0x37d80, + (0x0C << 18) | 0x0c100 /* 11a: 0x0c300, 11g: 0x0c100 */ }; -u32 max2828_power_data_24[] = {(0x0C<<18)|0x0c000, (0x0C<<18)|0x0c100}; -u32 max2828_power_data_50[] = {(0x0C<<18)|0x0c000, (0x0C<<18)|0x0c100}; - -/****************************************************************************/ -// LA20040728 kevin -// MAX2829 (a/b/g) -u32 max2829_rf_data[] = -{ - (0x00<<18)|0x000a2, - (0x01<<18)|0x23520, - (0x02<<18)|0x13802, - (0x03<<18)|0x30142, - (0x04<<18)|0x0b333, - (0x05<<18)|0x28906, - (0x06<<18)|0x18008, - (0x07<<18)|0x3B500, - (0x08<<18)|0x05100, - (0x09<<18)|0x24f08, - (0x0A<<18)|0x14000, - (0x0B<<18)|0x37d80, - (0x0C<<18)|0x0F300 //TXVGA=51, (MAX-6 dB) +static u32 max2828_channel_data_24[][3] = { + {(0x03 << 18) | 0x30142, (0x04 << 18) | 0x0b333, (0x05 << 18) | 0x289A6}, /* channe1 01 */ + {(0x03 << 18) | 0x32141, (0x04 << 18) | 0x08444, (0x05 << 18) | 0x289A6}, /* channe1 02 */ + {(0x03 << 18) | 0x32143, (0x04 << 18) | 0x0aeee, (0x05 << 18) | 0x289A6}, /* channe1 03 */ + {(0x03 << 18) | 0x32142, (0x04 << 18) | 0x0b333, (0x05 << 18) | 0x289A6}, /* channe1 04 */ + {(0x03 << 18) | 0x31141, (0x04 << 18) | 0x08444, (0x05 << 18) | 0x289A6}, /* channe1 05 */ + {(0x03 << 18) | 0x31143, (0x04 << 18) | 0x0aeee, (0x05 << 18) | 0x289A6}, /* channe1 06 */ + {(0x03 << 18) | 0x31142, (0x04 << 18) | 0x0b333, (0x05 << 18) | 0x289A6}, /* channe1 07 */ + {(0x03 << 18) | 0x33141, (0x04 << 18) | 0x08444, (0x05 << 18) | 0x289A6}, /* channe1 08 */ + {(0x03 << 18) | 0x33143, (0x04 << 18) | 0x0aeee, (0x05 << 18) | 0x289A6}, /* channe1 09 */ + {(0x03 << 18) | 0x33142, (0x04 << 18) | 0x0b333, (0x05 << 18) | 0x289A6}, /* channe1 10 */ + {(0x03 << 18) | 0x30941, (0x04 << 18) | 0x08444, (0x05 << 18) | 0x289A6}, /* channe1 11 */ + {(0x03 << 18) | 0x30943, (0x04 << 18) | 0x0aeee, (0x05 << 18) | 0x289A6}, /* channe1 12 */ + {(0x03 << 18) | 0x30942, (0x04 << 18) | 0x0b333, (0x05 << 18) | 0x289A6}, /* channe1 13 */ + {(0x03 << 18) | 0x32941, (0x04 << 18) | 0x09999, (0x05 << 18) | 0x289A6} /* channel 14 (2484MHz) */ }; -u32 max2829_channel_data_24[][3] = -{ - {(3<<18)|0x30142, (4<<18)|0x0b333, (5<<18)|0x289C6}, // 01 (2412MHz) - {(3<<18)|0x32141, (4<<18)|0x08444, (5<<18)|0x289C6}, // 02 (2417MHz) - {(3<<18)|0x32143, (4<<18)|0x0aeee, (5<<18)|0x289C6}, // 03 (2422MHz) - {(3<<18)|0x32142, (4<<18)|0x0b333, (5<<18)|0x289C6}, // 04 (2427MHz) - {(3<<18)|0x31141, (4<<18)|0x08444, (5<<18)|0x289C6}, // 05 (2432MHz) - {(3<<18)|0x31143, (4<<18)|0x0aeee, (5<<18)|0x289C6}, // 06 (2437MHz) - {(3<<18)|0x31142, (4<<18)|0x0b333, (5<<18)|0x289C6}, // 07 (2442MHz) - {(3<<18)|0x33141, (4<<18)|0x08444, (5<<18)|0x289C6}, // 08 (2447MHz) - {(3<<18)|0x33143, (4<<18)|0x0aeee, (5<<18)|0x289C6}, // 09 (2452MHz) - {(3<<18)|0x33142, (4<<18)|0x0b333, (5<<18)|0x289C6}, // 10 (2457MHz) - {(3<<18)|0x30941, (4<<18)|0x08444, (5<<18)|0x289C6}, // 11 (2462MHz) - {(3<<18)|0x30943, (4<<18)|0x0aeee, (5<<18)|0x289C6}, // 12 (2467MHz) - {(3<<18)|0x30942, (4<<18)|0x0b333, (5<<18)|0x289C6}, // 13 (2472MHz) - {(3<<18)|0x32941, (4<<18)|0x09999, (5<<18)|0x289C6}, // 14 (2484MHz) hh-modify +static u32 max2828_channel_data_50[][3] = { + {(0x03 << 18) | 0x33cc3, (0x04 << 18) | 0x08ccc, (0x05 << 18) | 0x289A6}, /* channel 36 */ + {(0x03 << 18) | 0x302c0, (0x04 << 18) | 0x08000, (0x05 << 18) | 0x289A6}, /* channel 40 */ + {(0x03 << 18) | 0x302c2, (0x04 << 18) | 0x0b333, (0x05 << 18) | 0x289A6}, /* channel 44 */ + {(0x03 << 18) | 0x322c1, (0x04 << 18) | 0x09999, (0x05 << 18) | 0x289A6}, /* channel 48 */ + {(0x03 << 18) | 0x312c1, (0x04 << 18) | 0x0a666, (0x05 << 18) | 0x289A6}, /* channel 52 */ + {(0x03 << 18) | 0x332c3, (0x04 << 18) | 0x08ccc, (0x05 << 18) | 0x289A6}, /* channel 56 */ + {(0x03 << 18) | 0x30ac0, (0x04 << 18) | 0x08000, (0x05 << 18) | 0x289A6}, /* channel 60 */ + {(0x03 << 18) | 0x30ac2, (0x04 << 18) | 0x0b333, (0x05 << 18) | 0x289A6} /* channel 64 */ }; -u32 max2829_channel_data_50[][4] = -{ - {36, (3<<18)|0x33cc3, (4<<18)|0x08ccc, (5<<18)|0x2A946}, // 36 (5.180GHz) - {40, (3<<18)|0x302c0, (4<<18)|0x08000, (5<<18)|0x2A946}, // 40 (5.200GHz) - {44, (3<<18)|0x302c2, (4<<18)|0x0b333, (5<<18)|0x2A946}, // 44 (5.220GHz) - {48, (3<<18)|0x322c1, (4<<18)|0x09999, (5<<18)|0x2A946}, // 48 (5.240GHz) - {52, (3<<18)|0x312c1, (4<<18)|0x0a666, (5<<18)|0x2A946}, // 52 (5.260GHz) - {56, (3<<18)|0x332c3, (4<<18)|0x08ccc, (5<<18)|0x2A946}, // 56 (5.280GHz) - {60, (3<<18)|0x30ac0, (4<<18)|0x08000, (5<<18)|0x2A946}, // 60 (5.300GHz) - {64, (3<<18)|0x30ac2, (4<<18)|0x0b333, (5<<18)|0x2A946}, // 64 (5.320GHz) - - {100, (3<<18)|0x30ec0, (4<<18)|0x08000, (5<<18)|0x2A9C6}, // 100 (5.500GHz) - {104, (3<<18)|0x30ec2, (4<<18)|0x0b333, (5<<18)|0x2A9C6}, // 104 (5.520GHz) - {108, (3<<18)|0x32ec1, (4<<18)|0x09999, (5<<18)|0x2A9C6}, // 108 (5.540GHz) - {112, (3<<18)|0x31ec1, (4<<18)|0x0a666, (5<<18)|0x2A9C6}, // 112 (5.560GHz) - {116, (3<<18)|0x33ec3, (4<<18)|0x08ccc, (5<<18)|0x2A9C6}, // 116 (5.580GHz) - {120, (3<<18)|0x301c0, (4<<18)|0x08000, (5<<18)|0x2A9C6}, // 120 (5.600GHz) - {124, (3<<18)|0x301c2, (4<<18)|0x0b333, (5<<18)|0x2A9C6}, // 124 (5.620GHz) - {128, (3<<18)|0x321c1, (4<<18)|0x09999, (5<<18)|0x2A9C6}, // 128 (5.640GHz) - {132, (3<<18)|0x311c1, (4<<18)|0x0a666, (5<<18)|0x2A9C6}, // 132 (5.660GHz) - {136, (3<<18)|0x331c3, (4<<18)|0x08ccc, (5<<18)|0x2A9C6}, // 136 (5.680GHz) - {140, (3<<18)|0x309c0, (4<<18)|0x08000, (5<<18)|0x2A9C6}, // 140 (5.700GHz) - - {149, (3<<18)|0x329c2, (4<<18)|0x0b333, (5<<18)|0x2A9C6}, // 149 (5.745GHz) - {153, (3<<18)|0x319c1, (4<<18)|0x09999, (5<<18)|0x2A9C6}, // 153 (5.765GHz) - {157, (3<<18)|0x339c1, (4<<18)|0x0a666, (5<<18)|0x2A9C6}, // 157 (5.785GHz) - {161, (3<<18)|0x305c3, (4<<18)|0x08ccc, (5<<18)|0x2A9C6}, // 161 (5.805GHz) - - // Japan - { 184, (3<<18)|0x308c2, (4<<18)|0x0b333, (5<<18)|0x2A946}, // 184 (4.920GHz) - { 188, (3<<18)|0x328c1, (4<<18)|0x09999, (5<<18)|0x2A946}, // 188 (4.940GHz) - { 192, (3<<18)|0x318c1, (4<<18)|0x0a666, (5<<18)|0x2A946}, // 192 (4.960GHz) - { 196, (3<<18)|0x338c3, (4<<18)|0x08ccc, (5<<18)|0x2A946}, // 196 (4.980GHz) - { 8, (3<<18)|0x324c1, (4<<18)|0x09999, (5<<18)|0x2A946}, // 8 (5.040GHz) - { 12, (3<<18)|0x314c1, (4<<18)|0x0a666, (5<<18)|0x2A946}, // 12 (5.060GHz) - { 16, (3<<18)|0x334c3, (4<<18)|0x08ccc, (5<<18)|0x2A946}, // 16 (5.080GHz) - { 34, (3<<18)|0x31cc2, (4<<18)|0x0b333, (5<<18)|0x2A946}, // 34 (5.170GHz) - { 38, (3<<18)|0x33cc1, (4<<18)|0x09999, (5<<18)|0x2A946}, // 38 (5.190GHz) - { 42, (3<<18)|0x302c1, (4<<18)|0x0a666, (5<<18)|0x2A946}, // 42 (5.210GHz) - { 46, (3<<18)|0x322c3, (4<<18)|0x08ccc, (5<<18)|0x2A946}, // 46 (5.230GHz) +static u32 max2828_power_data_24[] = {(0x0C << 18) | 0x0c000, (0x0C << 18) | 0x0c100}; +static u32 max2828_power_data_50[] = {(0x0C << 18) | 0x0c000, (0x0C << 18) | 0x0c100}; + +/* ========================================================== */ +/* MAX2829 (a/b/g) */ +static u32 max2829_rf_data[] = { + (0x00 << 18) | 0x000a2, + (0x01 << 18) | 0x23520, + (0x02 << 18) | 0x13802, + (0x03 << 18) | 0x30142, + (0x04 << 18) | 0x0b333, + (0x05 << 18) | 0x28906, + (0x06 << 18) | 0x18008, + (0x07 << 18) | 0x3B500, + (0x08 << 18) | 0x05100, + (0x09 << 18) | 0x24f08, + (0x0A << 18) | 0x14000, + (0x0B << 18) | 0x37d80, + (0x0C << 18) | 0x0F300 /* TXVGA=51, (MAX-6 dB) */ }; -/***************************************************************************** -; For MAXIM2825/6/7 Ver. 317 or less -; Edited by Tiger, Sep-17-2003 for 2.4Ghz channels -; Updated by Tiger, Sep-22-2003 for 5.0Ghz channels -; Corrected by Tiger, Sep-23-2003, for 0x03 and 0x04 of 5.0Ghz channels - -0x00 0x00080 -0x01 0x214c0 -0x02 0x13802 - -;2.4GHz Channels -;channe1 01 (2.412GHz); 0x03 0x30143 ;0x04 0x0accc -;channe1 02 (2.417GHz); 0x03 0x32140 ;0x04 0x09111 -;channe1 03 (2.422GHz); 0x03 0x32142 ;0x04 0x0bbbb -;channe1 04 (2.427GHz); 0x03 0x32143 ;0x04 0x0accc -;channe1 05 (2.432GHz); 0x03 0x31140 ;0x04 0x09111 -;channe1 06 (2.437GHz); 0x03 0x31142 ;0x04 0x0bbbb -;channe1 07 (2.442GHz); 0x03 0x31143 ;0x04 0x0accc -;channe1 08 (2.447GHz); 0x03 0x33140 ;0x04 0x09111 -;channe1 09 (2.452GHz); 0x03 0x33142 ;0x04 0x0bbbb -;channe1 10 (2.457GHz); 0x03 0x33143 ;0x04 0x0accc -;channe1 11 (2.462GHz); 0x03 0x30940 ;0x04 0x09111 -;channe1 12 (2.467GHz); 0x03 0x30942 ;0x04 0x0bbbb -;channe1 13 (2.472GHz); 0x03 0x30943 ;0x04 0x0accc - -;5.0Ghz Channels -;channel 36 (5.180GHz); 0x03 0x33cc0 ;0x04 0x0b333 -;channel 40 (5.200GHz); 0x03 0x302c0 ;0x04 0x08000 -;channel 44 (5.220GHz); 0x03 0x302c2 ;0x04 0x0b333 -;channel 48 (5.240GHz); 0x03 0x322c1 ;0x04 0x09999 -;channel 52 (5.260GHz); 0x03 0x312c1 ;0x04 0x0a666 -;channel 56 (5.280GHz); 0x03 0x332c3 ;0x04 0x08ccc -;channel 60 (5.300GHz); 0x03 0x30ac0 ;0x04 0x08000 -;channel 64 (5.320GHz); 0x03 0x30ac2 ;0x04 0x08333 - -;2.4GHz band ;0x05 0x28986; -;5.0GHz band -0x05 0x2a986 - -0x06 0x18008 -0x07 0x38400 -0x08 0x05108 -0x09 0x27ff8 -0x0a 0x14000 -0x0b 0x37f99 -0x0c 0x0c000 -*****************************************************************************/ -u32 maxim_317_rf_data[] = -{ - (0x00<<18)|0x000a2, - (0x01<<18)|0x214c0, - (0x02<<18)|0x13802, - (0x03<<18)|0x30143, - (0x04<<18)|0x0accc, - (0x05<<18)|0x28986, - (0x06<<18)|0x18008, - (0x07<<18)|0x38400, - (0x08<<18)|0x05108, - (0x09<<18)|0x27ff8, - (0x0A<<18)|0x14000, - (0x0B<<18)|0x37f99, - (0x0C<<18)|0x0c000 +static u32 max2829_channel_data_24[][3] = { + {(3 << 18) | 0x30142, (4 << 18) | 0x0b333, (5 << 18) | 0x289C6}, /* 01 (2412MHz) */ + {(3 << 18) | 0x32141, (4 << 18) | 0x08444, (5 << 18) | 0x289C6}, /* 02 (2417MHz) */ + {(3 << 18) | 0x32143, (4 << 18) | 0x0aeee, (5 << 18) | 0x289C6}, /* 03 (2422MHz) */ + {(3 << 18) | 0x32142, (4 << 18) | 0x0b333, (5 << 18) | 0x289C6}, /* 04 (2427MHz) */ + {(3 << 18) | 0x31141, (4 << 18) | 0x08444, (5 << 18) | 0x289C6}, /* 05 (2432MHz) */ + {(3 << 18) | 0x31143, (4 << 18) | 0x0aeee, (5 << 18) | 0x289C6}, /* 06 (2437MHz) */ + {(3 << 18) | 0x31142, (4 << 18) | 0x0b333, (5 << 18) | 0x289C6}, /* 07 (2442MHz) */ + {(3 << 18) | 0x33141, (4 << 18) | 0x08444, (5 << 18) | 0x289C6}, /* 08 (2447MHz) */ + {(3 << 18) | 0x33143, (4 << 18) | 0x0aeee, (5 << 18) | 0x289C6}, /* 09 (2452MHz) */ + {(3 << 18) | 0x33142, (4 << 18) | 0x0b333, (5 << 18) | 0x289C6}, /* 10 (2457MHz) */ + {(3 << 18) | 0x30941, (4 << 18) | 0x08444, (5 << 18) | 0x289C6}, /* 11 (2462MHz) */ + {(3 << 18) | 0x30943, (4 << 18) | 0x0aeee, (5 << 18) | 0x289C6}, /* 12 (2467MHz) */ + {(3 << 18) | 0x30942, (4 << 18) | 0x0b333, (5 << 18) | 0x289C6}, /* 13 (2472MHz) */ + {(3 << 18) | 0x32941, (4 << 18) | 0x09999, (5 << 18) | 0x289C6}, /* 14 (2484MHz) */ }; -u32 maxim_317_channel_data_24[][3] = -{ - {(0x03<<18)|0x30143, (0x04<<18)|0x0accc, (0x05<<18)|0x28986}, // channe1 01 - {(0x03<<18)|0x32140, (0x04<<18)|0x09111, (0x05<<18)|0x28986}, // channe1 02 - {(0x03<<18)|0x32142, (0x04<<18)|0x0bbbb, (0x05<<18)|0x28986}, // channe1 03 - {(0x03<<18)|0x32143, (0x04<<18)|0x0accc, (0x05<<18)|0x28986}, // channe1 04 - {(0x03<<18)|0x31140, (0x04<<18)|0x09111, (0x05<<18)|0x28986}, // channe1 05 - {(0x03<<18)|0x31142, (0x04<<18)|0x0bbbb, (0x05<<18)|0x28986}, // channe1 06 - {(0x03<<18)|0x31143, (0x04<<18)|0x0accc, (0x05<<18)|0x28986}, // channe1 07 - {(0x03<<18)|0x33140, (0x04<<18)|0x09111, (0x05<<18)|0x28986}, // channe1 08 - {(0x03<<18)|0x33142, (0x04<<18)|0x0bbbb, (0x05<<18)|0x28986}, // channe1 09 - {(0x03<<18)|0x33143, (0x04<<18)|0x0accc, (0x05<<18)|0x28986}, // channe1 10 - {(0x03<<18)|0x30940, (0x04<<18)|0x09111, (0x05<<18)|0x28986}, // channe1 11 - {(0x03<<18)|0x30942, (0x04<<18)|0x0bbbb, (0x05<<18)|0x28986}, // channe1 12 - {(0x03<<18)|0x30943, (0x04<<18)|0x0accc, (0x05<<18)|0x28986} // channe1 13 +static u32 max2829_channel_data_50[][4] = { + {36, (3 << 18) | 0x33cc3, (4 << 18) | 0x08ccc, (5 << 18) | 0x2A946}, /* 36 (5.180GHz) */ + {40, (3 << 18) | 0x302c0, (4 << 18) | 0x08000, (5 << 18) | 0x2A946}, /* 40 (5.200GHz) */ + {44, (3 << 18) | 0x302c2, (4 << 18) | 0x0b333, (5 << 18) | 0x2A946}, /* 44 (5.220GHz) */ + {48, (3 << 18) | 0x322c1, (4 << 18) | 0x09999, (5 << 18) | 0x2A946}, /* 48 (5.240GHz) */ + {52, (3 << 18) | 0x312c1, (4 << 18) | 0x0a666, (5 << 18) | 0x2A946}, /* 52 (5.260GHz) */ + {56, (3 << 18) | 0x332c3, (4 << 18) | 0x08ccc, (5 << 18) | 0x2A946}, /* 56 (5.280GHz) */ + {60, (3 << 18) | 0x30ac0, (4 << 18) | 0x08000, (5 << 18) | 0x2A946}, /* 60 (5.300GHz) */ + {64, (3 << 18) | 0x30ac2, (4 << 18) | 0x0b333, (5 << 18) | 0x2A946}, /* 64 (5.320GHz) */ + + {100, (3 << 18) | 0x30ec0, (4 << 18) | 0x08000, (5 << 18) | 0x2A9C6}, /* 100 (5.500GHz) */ + {104, (3 << 18) | 0x30ec2, (4 << 18) | 0x0b333, (5 << 18) | 0x2A9C6}, /* 104 (5.520GHz) */ + {108, (3 << 18) | 0x32ec1, (4 << 18) | 0x09999, (5 << 18) | 0x2A9C6}, /* 108 (5.540GHz) */ + {112, (3 << 18) | 0x31ec1, (4 << 18) | 0x0a666, (5 << 18) | 0x2A9C6}, /* 112 (5.560GHz) */ + {116, (3 << 18) | 0x33ec3, (4 << 18) | 0x08ccc, (5 << 18) | 0x2A9C6}, /* 116 (5.580GHz) */ + {120, (3 << 18) | 0x301c0, (4 << 18) | 0x08000, (5 << 18) | 0x2A9C6}, /* 120 (5.600GHz) */ + {124, (3 << 18) | 0x301c2, (4 << 18) | 0x0b333, (5 << 18) | 0x2A9C6}, /* 124 (5.620GHz) */ + {128, (3 << 18) | 0x321c1, (4 << 18) | 0x09999, (5 << 18) | 0x2A9C6}, /* 128 (5.640GHz) */ + {132, (3 << 18) | 0x311c1, (4 << 18) | 0x0a666, (5 << 18) | 0x2A9C6}, /* 132 (5.660GHz) */ + {136, (3 << 18) | 0x331c3, (4 << 18) | 0x08ccc, (5 << 18) | 0x2A9C6}, /* 136 (5.680GHz) */ + {140, (3 << 18) | 0x309c0, (4 << 18) | 0x08000, (5 << 18) | 0x2A9C6}, /* 140 (5.700GHz) */ + + {149, (3 << 18) | 0x329c2, (4 << 18) | 0x0b333, (5 << 18) | 0x2A9C6}, /* 149 (5.745GHz) */ + {153, (3 << 18) | 0x319c1, (4 << 18) | 0x09999, (5 << 18) | 0x2A9C6}, /* 153 (5.765GHz) */ + {157, (3 << 18) | 0x339c1, (4 << 18) | 0x0a666, (5 << 18) | 0x2A9C6}, /* 157 (5.785GHz) */ + {161, (3 << 18) | 0x305c3, (4 << 18) | 0x08ccc, (5 << 18) | 0x2A9C6}, /* 161 (5.805GHz) */ + + /* Japan */ + { 184, (3 << 18) | 0x308c2, (4 << 18) | 0x0b333, (5 << 18) | 0x2A946}, /* 184 (4.920GHz) */ + { 188, (3 << 18) | 0x328c1, (4 << 18) | 0x09999, (5 << 18) | 0x2A946}, /* 188 (4.940GHz) */ + { 192, (3 << 18) | 0x318c1, (4 << 18) | 0x0a666, (5 << 18) | 0x2A946}, /* 192 (4.960GHz) */ + { 196, (3 << 18) | 0x338c3, (4 << 18) | 0x08ccc, (5 << 18) | 0x2A946}, /* 196 (4.980GHz) */ + { 8, (3 << 18) | 0x324c1, (4 << 18) | 0x09999, (5 << 18) | 0x2A946}, /* 8 (5.040GHz) */ + { 12, (3 << 18) | 0x314c1, (4 << 18) | 0x0a666, (5 << 18) | 0x2A946}, /* 12 (5.060GHz) */ + { 16, (3 << 18) | 0x334c3, (4 << 18) | 0x08ccc, (5 << 18) | 0x2A946}, /* 16 (5.080GHz) */ + { 34, (3 << 18) | 0x31cc2, (4 << 18) | 0x0b333, (5 << 18) | 0x2A946}, /* 34 (5.170GHz) */ + { 38, (3 << 18) | 0x33cc1, (4 << 18) | 0x09999, (5 << 18) | 0x2A946}, /* 38 (5.190GHz) */ + { 42, (3 << 18) | 0x302c1, (4 << 18) | 0x0a666, (5 << 18) | 0x2A946}, /* 42 (5.210GHz) */ + { 46, (3 << 18) | 0x322c3, (4 << 18) | 0x08ccc, (5 << 18) | 0x2A946}, /* 46 (5.230GHz) */ }; -u32 maxim_317_channel_data_50[][3] = -{ - {(0x03<<18)|0x33cc0, (0x04<<18)|0x0b333, (0x05<<18)|0x2a986}, // channel 36 - {(0x03<<18)|0x302c0, (0x04<<18)|0x08000, (0x05<<18)|0x2a986}, // channel 40 - {(0x03<<18)|0x302c3, (0x04<<18)|0x0accc, (0x05<<18)|0x2a986}, // channel 44 - {(0x03<<18)|0x322c1, (0x04<<18)|0x09666, (0x05<<18)|0x2a986}, // channel 48 - {(0x03<<18)|0x312c2, (0x04<<18)|0x09999, (0x05<<18)|0x2a986}, // channel 52 - {(0x03<<18)|0x332c0, (0x04<<18)|0x0b333, (0x05<<18)|0x2a99e}, // channel 56 - {(0x03<<18)|0x30ac0, (0x04<<18)|0x08000, (0x05<<18)|0x2a99e}, // channel 60 - {(0x03<<18)|0x30ac3, (0x04<<18)|0x0accc, (0x05<<18)|0x2a99e} // channel 64 -}; +/* + * ==================================================================== + * For MAXIM2825/6/7 Ver. 317 or less + * + * 0x00 0x00080 + * 0x01 0x214c0 + * 0x02 0x13802 + * + * 2.4GHz Channels + * channe1 01 (2.412GHz); 0x03 0x30143 ;0x04 0x0accc + * channe1 02 (2.417GHz); 0x03 0x32140 ;0x04 0x09111 + * channe1 03 (2.422GHz); 0x03 0x32142 ;0x04 0x0bbbb + * channe1 04 (2.427GHz); 0x03 0x32143 ;0x04 0x0accc + * channe1 05 (2.432GHz); 0x03 0x31140 ;0x04 0x09111 + * channe1 06 (2.437GHz); 0x03 0x31142 ;0x04 0x0bbbb + * channe1 07 (2.442GHz); 0x03 0x31143 ;0x04 0x0accc + * channe1 08 (2.447GHz); 0x03 0x33140 ;0x04 0x09111 + * channe1 09 (2.452GHz); 0x03 0x33142 ;0x04 0x0bbbb + * channe1 10 (2.457GHz); 0x03 0x33143 ;0x04 0x0accc + * channe1 11 (2.462GHz); 0x03 0x30940 ;0x04 0x09111 + * channe1 12 (2.467GHz); 0x03 0x30942 ;0x04 0x0bbbb + * channe1 13 (2.472GHz); 0x03 0x30943 ;0x04 0x0accc + * + * 5.0Ghz Channels + * channel 36 (5.180GHz); 0x03 0x33cc0 ;0x04 0x0b333 + * channel 40 (5.200GHz); 0x03 0x302c0 ;0x04 0x08000 + * channel 44 (5.220GHz); 0x03 0x302c2 ;0x04 0x0b333 + * channel 48 (5.240GHz); 0x03 0x322c1 ;0x04 0x09999 + * channel 52 (5.260GHz); 0x03 0x312c1 ;0x04 0x0a666 + * channel 56 (5.280GHz); 0x03 0x332c3 ;0x04 0x08ccc + * channel 60 (5.300GHz); 0x03 0x30ac0 ;0x04 0x08000 + * channel 64 (5.320GHz); 0x03 0x30ac2 ;0x04 0x08333 + * + * 2.4GHz band ; 0x05 0x28986; + * 5.0GHz band ; 0x05 0x2a986 + * 0x06 0x18008 + * 0x07 0x38400 + * 0x08 0x05108 + * 0x09 0x27ff8 + * 0x0a 0x14000 + * 0x0b 0x37f99 + * 0x0c 0x0c000 + * ==================================================================== + */ -u32 maxim_317_power_data_24[] = {(0x0C<<18)|0x0c000, (0x0C<<18)|0x0c100}; -u32 maxim_317_power_data_50[] = {(0x0C<<18)|0x0c000, (0x0C<<18)|0x0c100}; - -/***************************************************************************** -;;AL2230 MP (Mass Production Version) -;;RF Registers Setting for Airoha AL2230 silicon after June 1st, 2004 -;;Updated by Tiger Huang (June 1st, 2004) -;;20-bit length and LSB first - -;;Ch01 (2412MHz) ;0x00 0x09EFC ;0x01 0x8CCCC; -;;Ch02 (2417MHz) ;0x00 0x09EFC ;0x01 0x8CCCD; -;;Ch03 (2422MHz) ;0x00 0x09E7C ;0x01 0x8CCCC; -;;Ch04 (2427MHz) ;0x00 0x09E7C ;0x01 0x8CCCD; -;;Ch05 (2432MHz) ;0x00 0x05EFC ;0x01 0x8CCCC; -;;Ch06 (2437MHz) ;0x00 0x05EFC ;0x01 0x8CCCD; -;;Ch07 (2442MHz) ;0x00 0x05E7C ;0x01 0x8CCCC; -;;Ch08 (2447MHz) ;0x00 0x05E7C ;0x01 0x8CCCD; -;;Ch09 (2452MHz) ;0x00 0x0DEFC ;0x01 0x8CCCC; -;;Ch10 (2457MHz) ;0x00 0x0DEFC ;0x01 0x8CCCD; -;;Ch11 (2462MHz) ;0x00 0x0DE7C ;0x01 0x8CCCC; -;;Ch12 (2467MHz) ;0x00 0x0DE7C ;0x01 0x8CCCD; -;;Ch13 (2472MHz) ;0x00 0x03EFC ;0x01 0x8CCCC; -;;Ch14 (2484Mhz) ;0x00 0x03E7C ;0x01 0x86666; - -0x02 0x401D8; RXDCOC BW 100Hz for RXHP low -;;0x02 0x481DC; RXDCOC BW 30Khz for RXHP low - -0x03 0xCFFF0 -0x04 0x23800 -0x05 0xA3B72 -0x06 0x6DA01 -0x07 0xE1688 -0x08 0x11600 -0x09 0x99E02 -0x0A 0x5DDB0 -0x0B 0xD9900 -0x0C 0x3FFBD -0x0D 0xB0000 -0x0F 0xF00A0 - -;RF Calibration for Airoha AL2230 -;Edit by Ben Chang (01/30/04) -;Updated by Tiger Huang (03/03/04) -0x0f 0xf00a0 ; Initial Setting -0x0f 0xf00b0 ; Activate TX DCC -0x0f 0xf02a0 ; Activate Phase Calibration -0x0f 0xf00e0 ; Activate Filter RC Calibration -0x0f 0xf00a0 ; Restore Initial Setting -*****************************************************************************/ - -u32 al2230_rf_data[] = -{ - (0x00<<20)|0x09EFC, - (0x01<<20)|0x8CCCC, - (0x02<<20)|0x40058,// 20060627 Anson 0x401D8, - (0x03<<20)|0xCFFF0, - (0x04<<20)|0x24100,// 20060627 Anson 0x23800, - (0x05<<20)|0xA3B2F,// 20060627 Anson 0xA3B72 - (0x06<<20)|0x6DA01, - (0x07<<20)|0xE3628,// 20060627 Anson 0xE1688, - (0x08<<20)|0x11600, - (0x09<<20)|0x9DC02,// 20060627 Anosn 0x97602,//0x99E02, //0x9AE02 - (0x0A<<20)|0x5ddb0, // 941206 For QCOM interference 0x588b0,//0x5DDB0, 940601 adj 0x5aa30 for bluetooth - (0x0B<<20)|0xD9900, - (0x0C<<20)|0x3FFBD, - (0x0D<<20)|0xB0000, - (0x0F<<20)|0xF01A0 // 20060627 Anson 0xF00A0 +/* + * =================================================================== + * AL2230 MP (Mass Production Version) + * RF Registers Setting for Airoha AL2230 silicon after June 1st, 2004 + * 20-bit length and LSB first + * + * Ch01 (2412MHz) ;0x00 0x09EFC ;0x01 0x8CCCC; + * Ch02 (2417MHz) ;0x00 0x09EFC ;0x01 0x8CCCD; + * Ch03 (2422MHz) ;0x00 0x09E7C ;0x01 0x8CCCC; + * Ch04 (2427MHz) ;0x00 0x09E7C ;0x01 0x8CCCD; + * Ch05 (2432MHz) ;0x00 0x05EFC ;0x01 0x8CCCC; + * Ch06 (2437MHz) ;0x00 0x05EFC ;0x01 0x8CCCD; + * Ch07 (2442MHz) ;0x00 0x05E7C ;0x01 0x8CCCC; + * Ch08 (2447MHz) ;0x00 0x05E7C ;0x01 0x8CCCD; + * Ch09 (2452MHz) ;0x00 0x0DEFC ;0x01 0x8CCCC; + * Ch10 (2457MHz) ;0x00 0x0DEFC ;0x01 0x8CCCD; + * Ch11 (2462MHz) ;0x00 0x0DE7C ;0x01 0x8CCCC; + * Ch12 (2467MHz) ;0x00 0x0DE7C ;0x01 0x8CCCD; + * Ch13 (2472MHz) ;0x00 0x03EFC ;0x01 0x8CCCC; + * Ch14 (2484Mhz) ;0x00 0x03E7C ;0x01 0x86666; + * + * 0x02 0x401D8; RXDCOC BW 100Hz for RXHP low + * 0x02 0x481DC; RXDCOC BW 30Khz for RXHP low + * + * 0x03 0xCFFF0 + * 0x04 0x23800 + * 0x05 0xA3B72 + * 0x06 0x6DA01 + * 0x07 0xE1688 + * 0x08 0x11600 + * 0x09 0x99E02 + * 0x0A 0x5DDB0 + * 0x0B 0xD9900 + * 0x0C 0x3FFBD + * 0x0D 0xB0000 + * 0x0F 0xF00A0 + * + * RF Calibration for Airoha AL2230 + * + * 0x0f 0xf00a0 ; Initial Setting + * 0x0f 0xf00b0 ; Activate TX DCC + * 0x0f 0xf02a0 ; Activate Phase Calibration + * 0x0f 0xf00e0 ; Activate Filter RC Calibration + * 0x0f 0xf00a0 ; Restore Initial Setting + * ================================================================== + */ +static u32 al2230_rf_data[] = { + (0x00 << 20) | 0x09EFC, + (0x01 << 20) | 0x8CCCC, + (0x02 << 20) | 0x40058, + (0x03 << 20) | 0xCFFF0, + (0x04 << 20) | 0x24100, + (0x05 << 20) | 0xA3B2F, + (0x06 << 20) | 0x6DA01, + (0x07 << 20) | 0xE3628, + (0x08 << 20) | 0x11600, + (0x09 << 20) | 0x9DC02, + (0x0A << 20) | 0x5ddb0, + (0x0B << 20) | 0xD9900, + (0x0C << 20) | 0x3FFBD, + (0x0D << 20) | 0xB0000, + (0x0F << 20) | 0xF01A0 }; -u32 al2230s_rf_data[] = -{ - (0x00<<20)|0x09EFC, - (0x01<<20)|0x8CCCC, - (0x02<<20)|0x40058,// 20060419 0x401D8, - (0x03<<20)|0xCFFF0, - (0x04<<20)|0x24100,// 20060419 0x23800, - (0x05<<20)|0xA3B2F,// 20060419 0xA3B72, - (0x06<<20)|0x6DA01, - (0x07<<20)|0xE3628,// 20060419 0xE1688, - (0x08<<20)|0x11600, - (0x09<<20)|0x9DC02,// 20060419 0x97602,//0x99E02, //0x9AE02 - (0x0A<<20)|0x5DDB0,// 941206 For QCOM interference 0x588b0,//0x5DDB0, 940601 adj 0x5aa30 for bluetooth - (0x0B<<20)|0xD9900, - (0x0C<<20)|0x3FFBD, - (0x0D<<20)|0xB0000, - (0x0F<<20)|0xF01A0 // 20060419 0xF00A0 +static u32 al2230s_rf_data[] = { + (0x00 << 20) | 0x09EFC, + (0x01 << 20) | 0x8CCCC, + (0x02 << 20) | 0x40058, + (0x03 << 20) | 0xCFFF0, + (0x04 << 20) | 0x24100, + (0x05 << 20) | 0xA3B2F, + (0x06 << 20) | 0x6DA01, + (0x07 << 20) | 0xE3628, + (0x08 << 20) | 0x11600, + (0x09 << 20) | 0x9DC02, + (0x0A << 20) | 0x5DDB0, + (0x0B << 20) | 0xD9900, + (0x0C << 20) | 0x3FFBD, + (0x0D << 20) | 0xB0000, + (0x0F << 20) | 0xF01A0 }; -u32 al2230_channel_data_24[][2] = -{ - {(0x00<<20)|0x09EFC, (0x01<<20)|0x8CCCC}, // channe1 01 - {(0x00<<20)|0x09EFC, (0x01<<20)|0x8CCCD}, // channe1 02 - {(0x00<<20)|0x09E7C, (0x01<<20)|0x8CCCC}, // channe1 03 - {(0x00<<20)|0x09E7C, (0x01<<20)|0x8CCCD}, // channe1 04 - {(0x00<<20)|0x05EFC, (0x01<<20)|0x8CCCC}, // channe1 05 - {(0x00<<20)|0x05EFC, (0x01<<20)|0x8CCCD}, // channe1 06 - {(0x00<<20)|0x05E7C, (0x01<<20)|0x8CCCC}, // channe1 07 - {(0x00<<20)|0x05E7C, (0x01<<20)|0x8CCCD}, // channe1 08 - {(0x00<<20)|0x0DEFC, (0x01<<20)|0x8CCCC}, // channe1 09 - {(0x00<<20)|0x0DEFC, (0x01<<20)|0x8CCCD}, // channe1 10 - {(0x00<<20)|0x0DE7C, (0x01<<20)|0x8CCCC}, // channe1 11 - {(0x00<<20)|0x0DE7C, (0x01<<20)|0x8CCCD}, // channe1 12 - {(0x00<<20)|0x03EFC, (0x01<<20)|0x8CCCC}, // channe1 13 - {(0x00<<20)|0x03E7C, (0x01<<20)|0x86666} // channe1 14 +static u32 al2230_channel_data_24[][2] = { + {(0x00 << 20) | 0x09EFC, (0x01 << 20) | 0x8CCCC}, /* channe1 01 */ + {(0x00 << 20) | 0x09EFC, (0x01 << 20) | 0x8CCCD}, /* channe1 02 */ + {(0x00 << 20) | 0x09E7C, (0x01 << 20) | 0x8CCCC}, /* channe1 03 */ + {(0x00 << 20) | 0x09E7C, (0x01 << 20) | 0x8CCCD}, /* channe1 04 */ + {(0x00 << 20) | 0x05EFC, (0x01 << 20) | 0x8CCCC}, /* channe1 05 */ + {(0x00 << 20) | 0x05EFC, (0x01 << 20) | 0x8CCCD}, /* channe1 06 */ + {(0x00 << 20) | 0x05E7C, (0x01 << 20) | 0x8CCCC}, /* channe1 07 */ + {(0x00 << 20) | 0x05E7C, (0x01 << 20) | 0x8CCCD}, /* channe1 08 */ + {(0x00 << 20) | 0x0DEFC, (0x01 << 20) | 0x8CCCC}, /* channe1 09 */ + {(0x00 << 20) | 0x0DEFC, (0x01 << 20) | 0x8CCCD}, /* channe1 10 */ + {(0x00 << 20) | 0x0DE7C, (0x01 << 20) | 0x8CCCC}, /* channe1 11 */ + {(0x00 << 20) | 0x0DE7C, (0x01 << 20) | 0x8CCCD}, /* channe1 12 */ + {(0x00 << 20) | 0x03EFC, (0x01 << 20) | 0x8CCCC}, /* channe1 13 */ + {(0x00 << 20) | 0x03E7C, (0x01 << 20) | 0x86666} /* channe1 14 */ }; -// Current setting. u32 airoha_power_data_24[] = {(0x09<<20)|0x90202, (0x09<<20)|0x96602, (0x09<<20)|0x97602}; -#define AIROHA_TXVGA_LOW_INDEX 31 // Index for 0x90202 -#define AIROHA_TXVGA_MIDDLE_INDEX 12 // Index for 0x96602 -#define AIROHA_TXVGA_HIGH_INDEX 8 // Index for 0x97602 1.0.24.0 1.0.28.0 -/* -u32 airoha_power_data_24[] = -{ - 0x9FE02, // Max - 0 dB - 0x9BE02, // Max - 1 dB - 0x9DE02, // Max - 2 dB - 0x99E02, // Max - 3 dB - 0x9EE02, // Max - 4 dB - 0x9AE02, // Max - 5 dB - 0x9CE02, // Max - 6 dB - 0x98E02, // Max - 7 dB - 0x97602, // Max - 8 dB - 0x93602, // Max - 9 dB - 0x95602, // Max - 10 dB - 0x91602, // Max - 11 dB - 0x96602, // Max - 12 dB - 0x92602, // Max - 13 dB - 0x94602, // Max - 14 dB - 0x90602, // Max - 15 dB - 0x97A02, // Max - 16 dB - 0x93A02, // Max - 17 dB - 0x95A02, // Max - 18 dB - 0x91A02, // Max - 19 dB - 0x96A02, // Max - 20 dB - 0x92A02, // Max - 21 dB - 0x94A02, // Max - 22 dB - 0x90A02, // Max - 23 dB - 0x97202, // Max - 24 dB - 0x93202, // Max - 25 dB - 0x95202, // Max - 26 dB - 0x91202, // Max - 27 dB - 0x96202, // Max - 28 dB - 0x92202, // Max - 29 dB - 0x94202, // Max - 30 dB - 0x90202 // Max - 31 dB -}; -*/ +/* Current setting. u32 airoha_power_data_24[] = {(0x09 << 20) | 0x90202, (0x09 << 20) | 0x96602, (0x09 << 20) | 0x97602}; */ +#define AIROHA_TXVGA_LOW_INDEX 31 /* Index for 0x90202 */ +#define AIROHA_TXVGA_MIDDLE_INDEX 12 /* Index for 0x96602 */ +#define AIROHA_TXVGA_HIGH_INDEX 8 /* Index for 0x97602 1.0.24.0 1.0.28.0 */ -// 20040927 1.1.69.1000 ybjiang -// from John -u32 al2230_txvga_data[][2] = -{ - //value , index +static u32 al2230_txvga_data[][2] = { + /* value , index */ {0x090202, 0}, {0x094202, 2}, {0x092202, 4}, @@ -550,263 +445,240 @@ u32 al2230_txvga_data[][2] = {0x09FE02, 63} }; -//-------------------------------- -// For Airoha AL7230, 2.4Ghz band -// Edit by Tiger, (March, 9, 2005) -// 24bit, MSB first - -//channel independent registers: -u32 al7230_rf_data_24[] = -{ - (0x00<<24)|0x003790, - (0x01<<24)|0x133331, - (0x02<<24)|0x841FF2, - (0x03<<24)|0x3FDFA3, - (0x04<<24)|0x7FD784, - (0x05<<24)|0x802B55, - (0x06<<24)|0x56AF36, - (0x07<<24)|0xCE0207, - (0x08<<24)|0x6EBC08, - (0x09<<24)|0x221BB9, - (0x0A<<24)|0xE0000A, - (0x0B<<24)|0x08071B, - (0x0C<<24)|0x000A3C, - (0x0D<<24)|0xFFFFFD, - (0x0E<<24)|0x00000E, - (0x0F<<24)|0x1ABA8F +/* + * ========================================== + * For Airoha AL7230, 2.4Ghz band + * 24bit, MSB first + */ + +/* channel independent registers: */ +static u32 al7230_rf_data_24[] = { + (0x00 << 24) | 0x003790, + (0x01 << 24) | 0x133331, + (0x02 << 24) | 0x841FF2, + (0x03 << 24) | 0x3FDFA3, + (0x04 << 24) | 0x7FD784, + (0x05 << 24) | 0x802B55, + (0x06 << 24) | 0x56AF36, + (0x07 << 24) | 0xCE0207, + (0x08 << 24) | 0x6EBC08, + (0x09 << 24) | 0x221BB9, + (0x0A << 24) | 0xE0000A, + (0x0B << 24) | 0x08071B, + (0x0C << 24) | 0x000A3C, + (0x0D << 24) | 0xFFFFFD, + (0x0E << 24) | 0x00000E, + (0x0F << 24) | 0x1ABA8F }; -u32 al7230_channel_data_24[][2] = -{ - {(0x00<<24)|0x003790, (0x01<<24)|0x133331}, // channe1 01 - {(0x00<<24)|0x003790, (0x01<<24)|0x1B3331}, // channe1 02 - {(0x00<<24)|0x003790, (0x01<<24)|0x033331}, // channe1 03 - {(0x00<<24)|0x003790, (0x01<<24)|0x0B3331}, // channe1 04 - {(0x00<<24)|0x0037A0, (0x01<<24)|0x133331}, // channe1 05 - {(0x00<<24)|0x0037A0, (0x01<<24)|0x1B3331}, // channe1 06 - {(0x00<<24)|0x0037A0, (0x01<<24)|0x033331}, // channe1 07 - {(0x00<<24)|0x0037A0, (0x01<<24)|0x0B3331}, // channe1 08 - {(0x00<<24)|0x0037B0, (0x01<<24)|0x133331}, // channe1 09 - {(0x00<<24)|0x0037B0, (0x01<<24)|0x1B3331}, // channe1 10 - {(0x00<<24)|0x0037B0, (0x01<<24)|0x033331}, // channe1 11 - {(0x00<<24)|0x0037B0, (0x01<<24)|0x0B3331}, // channe1 12 - {(0x00<<24)|0x0037C0, (0x01<<24)|0x133331}, // channe1 13 - {(0x00<<24)|0x0037C0, (0x01<<24)|0x066661} // channel 14 +static u32 al7230_channel_data_24[][2] = { + {(0x00 << 24) | 0x003790, (0x01 << 24) | 0x133331}, /* channe1 01 */ + {(0x00 << 24) | 0x003790, (0x01 << 24) | 0x1B3331}, /* channe1 02 */ + {(0x00 << 24) | 0x003790, (0x01 << 24) | 0x033331}, /* channe1 03 */ + {(0x00 << 24) | 0x003790, (0x01 << 24) | 0x0B3331}, /* channe1 04 */ + {(0x00 << 24) | 0x0037A0, (0x01 << 24) | 0x133331}, /* channe1 05 */ + {(0x00 << 24) | 0x0037A0, (0x01 << 24) | 0x1B3331}, /* channe1 06 */ + {(0x00 << 24) | 0x0037A0, (0x01 << 24) | 0x033331}, /* channe1 07 */ + {(0x00 << 24) | 0x0037A0, (0x01 << 24) | 0x0B3331}, /* channe1 08 */ + {(0x00 << 24) | 0x0037B0, (0x01 << 24) | 0x133331}, /* channe1 09 */ + {(0x00 << 24) | 0x0037B0, (0x01 << 24) | 0x1B3331}, /* channe1 10 */ + {(0x00 << 24) | 0x0037B0, (0x01 << 24) | 0x033331}, /* channe1 11 */ + {(0x00 << 24) | 0x0037B0, (0x01 << 24) | 0x0B3331}, /* channe1 12 */ + {(0x00 << 24) | 0x0037C0, (0x01 << 24) | 0x133331}, /* channe1 13 */ + {(0x00 << 24) | 0x0037C0, (0x01 << 24) | 0x066661} /* channel 14 */ }; -//channel independent registers: -u32 al7230_rf_data_50[] = -{ - (0x00<<24)|0x0FF520, - (0x01<<24)|0x000001, - (0x02<<24)|0x451FE2, - (0x03<<24)|0x5FDFA3, - (0x04<<24)|0x6FD784, - (0x05<<24)|0x853F55, - (0x06<<24)|0x56AF36, - (0x07<<24)|0xCE0207, - (0x08<<24)|0x6EBC08, - (0x09<<24)|0x221BB9, - (0x0A<<24)|0xE0600A, - (0x0B<<24)|0x08044B, - (0x0C<<24)|0x00143C, - (0x0D<<24)|0xFFFFFD, - (0x0E<<24)|0x00000E, - (0x0F<<24)|0x12BACF //5Ghz default state +/* channel independent registers: */ +static u32 al7230_rf_data_50[] = { + (0x00 << 24) | 0x0FF520, + (0x01 << 24) | 0x000001, + (0x02 << 24) | 0x451FE2, + (0x03 << 24) | 0x5FDFA3, + (0x04 << 24) | 0x6FD784, + (0x05 << 24) | 0x853F55, + (0x06 << 24) | 0x56AF36, + (0x07 << 24) | 0xCE0207, + (0x08 << 24) | 0x6EBC08, + (0x09 << 24) | 0x221BB9, + (0x0A << 24) | 0xE0600A, + (0x0B << 24) | 0x08044B, + (0x0C << 24) | 0x00143C, + (0x0D << 24) | 0xFFFFFD, + (0x0E << 24) | 0x00000E, + (0x0F << 24) | 0x12BACF /* 5Ghz default state */ }; -u32 al7230_channel_data_5[][4] = -{ - //channel dependent registers: 0x00, 0x01 and 0x04 - //11J =========== - {184, (0x00<<24)|0x0FF520, (0x01<<24)|0x000001, (0x04<<24)|0x67F784}, // channel 184 - {188, (0x00<<24)|0x0FF520, (0x01<<24)|0x0AAAA1, (0x04<<24)|0x77F784}, // channel 188 - {192, (0x00<<24)|0x0FF530, (0x01<<24)|0x155551, (0x04<<24)|0x77F784}, // channel 192 - {196, (0x00<<24)|0x0FF530, (0x01<<24)|0x000001, (0x04<<24)|0x67F784}, // channel 196 - {8, (0x00<<24)|0x0FF540, (0x01<<24)|0x000001, (0x04<<24)|0x67F784}, // channel 008 - {12, (0x00<<24)|0x0FF540, (0x01<<24)|0x0AAAA1, (0x04<<24)|0x77F784}, // channel 012 - {16, (0x00<<24)|0x0FF550, (0x01<<24)|0x155551, (0x04<<24)|0x77F784}, // channel 016 - {34, (0x00<<24)|0x0FF560, (0x01<<24)|0x055551, (0x04<<24)|0x77F784}, // channel 034 - {38, (0x00<<24)|0x0FF570, (0x01<<24)|0x100001, (0x04<<24)|0x77F784}, // channel 038 - {42, (0x00<<24)|0x0FF570, (0x01<<24)|0x1AAAA1, (0x04<<24)|0x77F784}, // channel 042 - {46, (0x00<<24)|0x0FF570, (0x01<<24)|0x055551, (0x04<<24)|0x77F784}, // channel 046 - //11 A/H ========= - {36, (0x00<<24)|0x0FF560, (0x01<<24)|0x0AAAA1, (0x04<<24)|0x77F784}, // channel 036 - {40, (0x00<<24)|0x0FF570, (0x01<<24)|0x155551, (0x04<<24)|0x77F784}, // channel 040 - {44, (0x00<<24)|0x0FF570, (0x01<<24)|0x000001, (0x04<<24)|0x67F784}, // channel 044 - {48, (0x00<<24)|0x0FF570, (0x01<<24)|0x0AAAA1, (0x04<<24)|0x77F784}, // channel 048 - {52, (0x00<<24)|0x0FF580, (0x01<<24)|0x155551, (0x04<<24)|0x77F784}, // channel 052 - {56, (0x00<<24)|0x0FF580, (0x01<<24)|0x000001, (0x04<<24)|0x67F784}, // channel 056 - {60, (0x00<<24)|0x0FF580, (0x01<<24)|0x0AAAA1, (0x04<<24)|0x77F784}, // channel 060 - {64, (0x00<<24)|0x0FF590, (0x01<<24)|0x155551, (0x04<<24)|0x77F784}, // channel 064 - {100, (0x00<<24)|0x0FF5C0, (0x01<<24)|0x155551, (0x04<<24)|0x77F784}, // channel 100 - {104, (0x00<<24)|0x0FF5C0, (0x01<<24)|0x000001, (0x04<<24)|0x67F784}, // channel 104 - {108, (0x00<<24)|0x0FF5C0, (0x01<<24)|0x0AAAA1, (0x04<<24)|0x77F784}, // channel 108 - {112, (0x00<<24)|0x0FF5D0, (0x01<<24)|0x155551, (0x04<<24)|0x77F784}, // channel 112 - {116, (0x00<<24)|0x0FF5D0, (0x01<<24)|0x000001, (0x04<<24)|0x67F784}, // channel 116 - {120, (0x00<<24)|0x0FF5D0, (0x01<<24)|0x0AAAA1, (0x04<<24)|0x77F784}, // channel 120 - {124, (0x00<<24)|0x0FF5E0, (0x01<<24)|0x155551, (0x04<<24)|0x77F784}, // channel 124 - {128, (0x00<<24)|0x0FF5E0, (0x01<<24)|0x000001, (0x04<<24)|0x67F784}, // channel 128 - {132, (0x00<<24)|0x0FF5E0, (0x01<<24)|0x0AAAA1, (0x04<<24)|0x77F784}, // channel 132 - {136, (0x00<<24)|0x0FF5F0, (0x01<<24)|0x155551, (0x04<<24)|0x77F784}, // channel 136 - {140, (0x00<<24)|0x0FF5F0, (0x01<<24)|0x000001, (0x04<<24)|0x67F784}, // channel 140 - {149, (0x00<<24)|0x0FF600, (0x01<<24)|0x180001, (0x04<<24)|0x77F784}, // channel 149 - {153, (0x00<<24)|0x0FF600, (0x01<<24)|0x02AAA1, (0x04<<24)|0x77F784}, // channel 153 - {157, (0x00<<24)|0x0FF600, (0x01<<24)|0x0D5551, (0x04<<24)|0x77F784}, // channel 157 - {161, (0x00<<24)|0x0FF610, (0x01<<24)|0x180001, (0x04<<24)|0x77F784}, // channel 161 - {165, (0x00<<24)|0x0FF610, (0x01<<24)|0x02AAA1, (0x04<<24)|0x77F784} // channel 165 +static u32 al7230_channel_data_5[][4] = { + /* channel dependent registers: 0x00, 0x01 and 0x04 */ + /* 11J =========== */ + {184, (0x00 << 24) | 0x0FF520, (0x01 << 24) | 0x000001, (0x04 << 24) | 0x67F784}, /* channel 184 */ + {188, (0x00 << 24) | 0x0FF520, (0x01 << 24) | 0x0AAAA1, (0x04 << 24) | 0x77F784}, /* channel 188 */ + {192, (0x00 << 24) | 0x0FF530, (0x01 << 24) | 0x155551, (0x04 << 24) | 0x77F784}, /* channel 192 */ + {196, (0x00 << 24) | 0x0FF530, (0x01 << 24) | 0x000001, (0x04 << 24) | 0x67F784}, /* channel 196 */ + {8, (0x00 << 24) | 0x0FF540, (0x01 << 24) | 0x000001, (0x04 << 24) | 0x67F784}, /* channel 008 */ + {12, (0x00 << 24) | 0x0FF540, (0x01 << 24) | 0x0AAAA1, (0x04 << 24) | 0x77F784}, /* channel 012 */ + {16, (0x00 << 24) | 0x0FF550, (0x01 << 24) | 0x155551, (0x04 << 24) | 0x77F784}, /* channel 016 */ + {34, (0x00 << 24) | 0x0FF560, (0x01 << 24) | 0x055551, (0x04 << 24) | 0x77F784}, /* channel 034 */ + {38, (0x00 << 24) | 0x0FF570, (0x01 << 24) | 0x100001, (0x04 << 24) | 0x77F784}, /* channel 038 */ + {42, (0x00 << 24) | 0x0FF570, (0x01 << 24) | 0x1AAAA1, (0x04 << 24) | 0x77F784}, /* channel 042 */ + {46, (0x00 << 24) | 0x0FF570, (0x01 << 24) | 0x055551, (0x04 << 24) | 0x77F784}, /* channel 046 */ + /* 11 A/H ========= */ + {36, (0x00 << 24) | 0x0FF560, (0x01 << 24) | 0x0AAAA1, (0x04 << 24) | 0x77F784}, /* channel 036 */ + {40, (0x00 << 24) | 0x0FF570, (0x01 << 24) | 0x155551, (0x04 << 24) | 0x77F784}, /* channel 040 */ + {44, (0x00 << 24) | 0x0FF570, (0x01 << 24) | 0x000001, (0x04 << 24) | 0x67F784}, /* channel 044 */ + {48, (0x00 << 24) | 0x0FF570, (0x01 << 24) | 0x0AAAA1, (0x04 << 24) | 0x77F784}, /* channel 048 */ + {52, (0x00 << 24) | 0x0FF580, (0x01 << 24) | 0x155551, (0x04 << 24) | 0x77F784}, /* channel 052 */ + {56, (0x00 << 24) | 0x0FF580, (0x01 << 24) | 0x000001, (0x04 << 24) | 0x67F784}, /* channel 056 */ + {60, (0x00 << 24) | 0x0FF580, (0x01 << 24) | 0x0AAAA1, (0x04 << 24) | 0x77F784}, /* channel 060 */ + {64, (0x00 << 24) | 0x0FF590, (0x01 << 24) | 0x155551, (0x04 << 24) | 0x77F784}, /* channel 064 */ + {100, (0x00 << 24) | 0x0FF5C0, (0x01 << 24) | 0x155551, (0x04 << 24) | 0x77F784}, /* channel 100 */ + {104, (0x00 << 24) | 0x0FF5C0, (0x01 << 24) | 0x000001, (0x04 << 24) | 0x67F784}, /* channel 104 */ + {108, (0x00 << 24) | 0x0FF5C0, (0x01 << 24) | 0x0AAAA1, (0x04 << 24) | 0x77F784}, /* channel 108 */ + {112, (0x00 << 24) | 0x0FF5D0, (0x01 << 24) | 0x155551, (0x04 << 24) | 0x77F784}, /* channel 112 */ + {116, (0x00 << 24) | 0x0FF5D0, (0x01 << 24) | 0x000001, (0x04 << 24) | 0x67F784}, /* channel 116 */ + {120, (0x00 << 24) | 0x0FF5D0, (0x01 << 24) | 0x0AAAA1, (0x04 << 24) | 0x77F784}, /* channel 120 */ + {124, (0x00 << 24) | 0x0FF5E0, (0x01 << 24) | 0x155551, (0x04 << 24) | 0x77F784}, /* channel 124 */ + {128, (0x00 << 24) | 0x0FF5E0, (0x01 << 24) | 0x000001, (0x04 << 24) | 0x67F784}, /* channel 128 */ + {132, (0x00 << 24) | 0x0FF5E0, (0x01 << 24) | 0x0AAAA1, (0x04 << 24) | 0x77F784}, /* channel 132 */ + {136, (0x00 << 24) | 0x0FF5F0, (0x01 << 24) | 0x155551, (0x04 << 24) | 0x77F784}, /* channel 136 */ + {140, (0x00 << 24) | 0x0FF5F0, (0x01 << 24) | 0x000001, (0x04 << 24) | 0x67F784}, /* channel 140 */ + {149, (0x00 << 24) | 0x0FF600, (0x01 << 24) | 0x180001, (0x04 << 24) | 0x77F784}, /* channel 149 */ + {153, (0x00 << 24) | 0x0FF600, (0x01 << 24) | 0x02AAA1, (0x04 << 24) | 0x77F784}, /* channel 153 */ + {157, (0x00 << 24) | 0x0FF600, (0x01 << 24) | 0x0D5551, (0x04 << 24) | 0x77F784}, /* channel 157 */ + {161, (0x00 << 24) | 0x0FF610, (0x01 << 24) | 0x180001, (0x04 << 24) | 0x77F784}, /* channel 161 */ + {165, (0x00 << 24) | 0x0FF610, (0x01 << 24) | 0x02AAA1, (0x04 << 24) | 0x77F784} /* channel 165 */ }; -//; RF Calibration <=== Register 0x0F -//0x0F 0x1ABA8F; start from 2.4Ghz default state -//0x0F 0x9ABA8F; TXDC compensation -//0x0F 0x3ABA8F; RXFIL adjustment -//0x0F 0x1ABA8F; restore 2.4Ghz default state - -//;TXVGA Mapping Table <=== Register 0x0B -u32 al7230_txvga_data[][2] = -{ - {0x08040B, 0}, //TXVGA=0; - {0x08041B, 1}, //TXVGA=1; - {0x08042B, 2}, //TXVGA=2; - {0x08043B, 3}, //TXVGA=3; - {0x08044B, 4}, //TXVGA=4; - {0x08045B, 5}, //TXVGA=5; - {0x08046B, 6}, //TXVGA=6; - {0x08047B, 7}, //TXVGA=7; - {0x08048B, 8}, //TXVGA=8; - {0x08049B, 9}, //TXVGA=9; - {0x0804AB, 10}, //TXVGA=10; - {0x0804BB, 11}, //TXVGA=11; - {0x0804CB, 12}, //TXVGA=12; - {0x0804DB, 13}, //TXVGA=13; - {0x0804EB, 14}, //TXVGA=14; - {0x0804FB, 15}, //TXVGA=15; - {0x08050B, 16}, //TXVGA=16; - {0x08051B, 17}, //TXVGA=17; - {0x08052B, 18}, //TXVGA=18; - {0x08053B, 19}, //TXVGA=19; - {0x08054B, 20}, //TXVGA=20; - {0x08055B, 21}, //TXVGA=21; - {0x08056B, 22}, //TXVGA=22; - {0x08057B, 23}, //TXVGA=23; - {0x08058B, 24}, //TXVGA=24; - {0x08059B, 25}, //TXVGA=25; - {0x0805AB, 26}, //TXVGA=26; - {0x0805BB, 27}, //TXVGA=27; - {0x0805CB, 28}, //TXVGA=28; - {0x0805DB, 29}, //TXVGA=29; - {0x0805EB, 30}, //TXVGA=30; - {0x0805FB, 31}, //TXVGA=31; - {0x08060B, 32}, //TXVGA=32; - {0x08061B, 33}, //TXVGA=33; - {0x08062B, 34}, //TXVGA=34; - {0x08063B, 35}, //TXVGA=35; - {0x08064B, 36}, //TXVGA=36; - {0x08065B, 37}, //TXVGA=37; - {0x08066B, 38}, //TXVGA=38; - {0x08067B, 39}, //TXVGA=39; - {0x08068B, 40}, //TXVGA=40; - {0x08069B, 41}, //TXVGA=41; - {0x0806AB, 42}, //TXVGA=42; - {0x0806BB, 43}, //TXVGA=43; - {0x0806CB, 44}, //TXVGA=44; - {0x0806DB, 45}, //TXVGA=45; - {0x0806EB, 46}, //TXVGA=46; - {0x0806FB, 47}, //TXVGA=47; - {0x08070B, 48}, //TXVGA=48; - {0x08071B, 49}, //TXVGA=49; - {0x08072B, 50}, //TXVGA=50; - {0x08073B, 51}, //TXVGA=51; - {0x08074B, 52}, //TXVGA=52; - {0x08075B, 53}, //TXVGA=53; - {0x08076B, 54}, //TXVGA=54; - {0x08077B, 55}, //TXVGA=55; - {0x08078B, 56}, //TXVGA=56; - {0x08079B, 57}, //TXVGA=57; - {0x0807AB, 58}, //TXVGA=58; - {0x0807BB, 59}, //TXVGA=59; - {0x0807CB, 60}, //TXVGA=60; - {0x0807DB, 61}, //TXVGA=61; - {0x0807EB, 62}, //TXVGA=62; - {0x0807FB, 63}, //TXVGA=63; +/* + * RF Calibration <=== Register 0x0F + * 0x0F 0x1ABA8F; start from 2.4Ghz default state + * 0x0F 0x9ABA8F; TXDC compensation + * 0x0F 0x3ABA8F; RXFIL adjustment + * 0x0F 0x1ABA8F; restore 2.4Ghz default state + */ + +/* TXVGA Mapping Table <=== Register 0x0B */ +static u32 al7230_txvga_data[][2] = { + {0x08040B, 0}, /* TXVGA = 0; */ + {0x08041B, 1}, /* TXVGA = 1; */ + {0x08042B, 2}, /* TXVGA = 2; */ + {0x08043B, 3}, /* TXVGA = 3; */ + {0x08044B, 4}, /* TXVGA = 4; */ + {0x08045B, 5}, /* TXVGA = 5; */ + {0x08046B, 6}, /* TXVGA = 6; */ + {0x08047B, 7}, /* TXVGA = 7; */ + {0x08048B, 8}, /* TXVGA = 8; */ + {0x08049B, 9}, /* TXVGA = 9; */ + {0x0804AB, 10}, /* TXVGA = 10; */ + {0x0804BB, 11}, /* TXVGA = 11; */ + {0x0804CB, 12}, /* TXVGA = 12; */ + {0x0804DB, 13}, /* TXVGA = 13; */ + {0x0804EB, 14}, /* TXVGA = 14; */ + {0x0804FB, 15}, /* TXVGA = 15; */ + {0x08050B, 16}, /* TXVGA = 16; */ + {0x08051B, 17}, /* TXVGA = 17; */ + {0x08052B, 18}, /* TXVGA = 18; */ + {0x08053B, 19}, /* TXVGA = 19; */ + {0x08054B, 20}, /* TXVGA = 20; */ + {0x08055B, 21}, /* TXVGA = 21; */ + {0x08056B, 22}, /* TXVGA = 22; */ + {0x08057B, 23}, /* TXVGA = 23; */ + {0x08058B, 24}, /* TXVGA = 24; */ + {0x08059B, 25}, /* TXVGA = 25; */ + {0x0805AB, 26}, /* TXVGA = 26; */ + {0x0805BB, 27}, /* TXVGA = 27; */ + {0x0805CB, 28}, /* TXVGA = 28; */ + {0x0805DB, 29}, /* TXVGA = 29; */ + {0x0805EB, 30}, /* TXVGA = 30; */ + {0x0805FB, 31}, /* TXVGA = 31; */ + {0x08060B, 32}, /* TXVGA = 32; */ + {0x08061B, 33}, /* TXVGA = 33; */ + {0x08062B, 34}, /* TXVGA = 34; */ + {0x08063B, 35}, /* TXVGA = 35; */ + {0x08064B, 36}, /* TXVGA = 36; */ + {0x08065B, 37}, /* TXVGA = 37; */ + {0x08066B, 38}, /* TXVGA = 38; */ + {0x08067B, 39}, /* TXVGA = 39; */ + {0x08068B, 40}, /* TXVGA = 40; */ + {0x08069B, 41}, /* TXVGA = 41; */ + {0x0806AB, 42}, /* TXVGA = 42; */ + {0x0806BB, 43}, /* TXVGA = 43; */ + {0x0806CB, 44}, /* TXVGA = 44; */ + {0x0806DB, 45}, /* TXVGA = 45; */ + {0x0806EB, 46}, /* TXVGA = 46; */ + {0x0806FB, 47}, /* TXVGA = 47; */ + {0x08070B, 48}, /* TXVGA = 48; */ + {0x08071B, 49}, /* TXVGA = 49; */ + {0x08072B, 50}, /* TXVGA = 50; */ + {0x08073B, 51}, /* TXVGA = 51; */ + {0x08074B, 52}, /* TXVGA = 52; */ + {0x08075B, 53}, /* TXVGA = 53; */ + {0x08076B, 54}, /* TXVGA = 54; */ + {0x08077B, 55}, /* TXVGA = 55; */ + {0x08078B, 56}, /* TXVGA = 56; */ + {0x08079B, 57}, /* TXVGA = 57; */ + {0x0807AB, 58}, /* TXVGA = 58; */ + {0x0807BB, 59}, /* TXVGA = 59; */ + {0x0807CB, 60}, /* TXVGA = 60; */ + {0x0807DB, 61}, /* TXVGA = 61; */ + {0x0807EB, 62}, /* TXVGA = 62; */ + {0x0807FB, 63}, /* TXVGA = 63; */ }; -//-------------------------------- +/* ============================================= */ - -//; W89RF242 RFIC SPI programming initial data -//; Winbond WLAN 11g RFIC BB-SPI register -- version FA5976A rev 1.3b -//; Update Date: Ocotber 3, 2005 by PP10 Hsiang-Te Ho -//; -//; Version 1.3b revision items: (Oct. 1, 2005 by HTHo) for FA5976A -u32 w89rf242_rf_data[] = -{ - (0x00<<24)|0xF86100, // 20060721 0xF86100, //; 3E184; MODA (0x00) -- Normal mode ; calibration off - (0x01<<24)|0xEFFFC2, //; 3BFFF; MODB (0x01) -- turn off RSSI, and other circuits are turned on - (0x02<<24)|0x102504, //; 04094; FSET (0x02) -- default 20MHz crystal ; Icmp=1.5mA - (0x03<<24)|0x026286, //; 0098A; FCHN (0x03) -- default CH7, 2442MHz - (0x04<<24)|0x000208, // 20060612.1.a 0x0002C8, // 20050818 // 20050816 0x000388 - //; 02008; FCAL (0x04) -- XTAL Freq Trim=001000 (socket board#1); FA5976AYG_v1.3C - (0x05<<24)|0x24C60A, // 20060612.1.a 0x24C58A, // 941003 0x24C48A, // 20050818.2 0x24848A, // 20050818 // 20050816 0x24C48A - //; 09316; GANA (0x05) -- TX VGA default (TXVGA=0x18(12)) & TXGPK=110 ; FA5976A_1.3D - (0x06<<24)|0x3432CC, // 941003 0x26C34C, // 20050818 0x06B40C - //; 0D0CB; GANB (0x06) -- RXDC(DC offset) on; LNA=11; RXVGA=001011(11) ; RXFLSW=11(010001); RXGPK=00; RXGCF=00; -50dBm input - (0x07<<24)|0x0C68CE, // 20050818.2 0x0C66CE, // 20050818 // 20050816 0x0C68CE - //; 031A3; FILT (0x07) -- TX/RX filter with auto-tuning; TFLBW=011; RFLBW=100 - (0x08<<24)|0x100010, //; 04000; TCAL (0x08) -- //for LO - (0x09<<24)|0x004012, // 20060612.1.a 0x6E4012, // 0x004012, - //; 1B900; RCALA (0x09) -- FASTS=11; HPDE=01 (100nsec); SEHP=1 (select B0 pin=RXHP); RXHP=1 (Turn on RXHP function)(FA5976A_1.3C) - (0x0A<<24)|0x704014, //; 1C100; RCALB (0x0A) - (0x0B<<24)|0x18BDD6, // 941003 0x1805D6, // 20050818.2 0x1801D6, // 20050818 // 20050816 0x1805D6 - //; 062F7; IQCAL (0x0B) -- Turn on LO phase tuner=0111 & RX-LO phase = 0111; FA5976A_1.3B (2005/09/29) - (0x0C<<24)|0x575558, // 20050818.2 0x555558, // 20050818 // 20050816 0x575558 - //; 15D55 ; IBSA (0x0C) -- IFPre =11 ; TC5376A_v1.3A for corner - (0x0D<<24)|0x55545A, // 20060612.1.a 0x55555A, - //; 15555 ; IBSB (0x0D) - (0x0E<<24)|0x5557DC, // 20060612.1.a 0x55555C, // 941003 0x5557DC, - //; 1555F ; IBSC (0x0E) -- IRLNA & IRLNB (PTAT & Const current)=01/01; FA5976B_1.3F (2005/11/25) - (0x10<<24)|0x000C20, // 941003 0x000020, // 20050818 - //; 00030 ; TMODA (0x10) -- LNA_gain_step=0011 ; LNA=15/16dB - (0x11<<24)|0x0C0022, // 941003 0x030022 // 20050818.2 0x030022 // 20050818 // 20050816 0x0C0022 - //; 03000 ; TMODB (0x11) -- Turn ON RX-Q path Test Switch; To improve IQ path group delay (FA5976A_1.3C) - (0x12<<24)|0x000024 // 20060612.1.a 0x001824 // 941003 add - //; TMODC (0x12) -- Turn OFF Tempearure sensor +/* + * W89RF242 RFIC SPI programming initial data + * Winbond WLAN 11g RFIC BB-SPI register -- version FA5976A rev 1.3b + */ +static u32 w89rf242_rf_data[] = { + (0x00 << 24) | 0xF86100, /* 3E184; MODA (0x00) -- Normal mode ; calibration off */ + (0x01 << 24) | 0xEFFFC2, /* 3BFFF; MODB (0x01) -- turn off RSSI, and other circuits are turned on */ + (0x02 << 24) | 0x102504, /* 04094; FSET (0x02) -- default 20MHz crystal ; Icmp=1.5mA */ + (0x03 << 24) | 0x026286, /* 0098A; FCHN (0x03) -- default CH7, 2442MHz */ + (0x04 << 24) | 0x000208, /* 02008; FCAL (0x04) -- XTAL Freq Trim=001000 (socket board#1); FA5976AYG_v1.3C */ + (0x05 << 24) | 0x24C60A, /* 09316; GANA (0x05) -- TX VGA default (TXVGA=0x18(12)) & TXGPK=110 ; FA5976A_1.3D */ + (0x06 << 24) | 0x3432CC, /* 0D0CB; GANB (0x06) -- RXDC(DC offset) on; LNA=11; RXVGA=001011(11) ; RXFLSW=11(010001); RXGPK=00; RXGCF=00; -50dBm input */ + (0x07 << 24) | 0x0C68CE, /* 031A3; FILT (0x07) -- TX/RX filter with auto-tuning; TFLBW=011; RFLBW=100 */ + (0x08 << 24) | 0x100010, /* 04000; TCAL (0x08) -- for LO */ + (0x09 << 24) | 0x004012, /* 1B900; RCALA (0x09) -- FASTS=11; HPDE=01 (100nsec); SEHP=1 (select B0 pin=RXHP); RXHP=1 (Turn on RXHP function)(FA5976A_1.3C) */ + (0x0A << 24) | 0x704014, /* 1C100; RCALB (0x0A) */ + (0x0B << 24) | 0x18BDD6, /* 062F7; IQCAL (0x0B) -- Turn on LO phase tuner=0111 & RX-LO phase = 0111; FA5976A_1.3B */ + (0x0C << 24) | 0x575558, /* 15D55 ; IBSA (0x0C) -- IFPre =11 ; TC5376A_v1.3A for corner */ + (0x0D << 24) | 0x55545A, /* 15555 ; IBSB (0x0D) */ + (0x0E << 24) | 0x5557DC, /* 1555F ; IBSC (0x0E) -- IRLNA & IRLNB (PTAT & Const current)=01/01; FA5976B_1.3F */ + (0x10 << 24) | 0x000C20, /* 00030 ; TMODA (0x10) -- LNA_gain_step=0011 ; LNA=15/16dB */ + (0x11 << 24) | 0x0C0022, /* 03000 ; TMODB (0x11) -- Turn ON RX-Q path Test Switch; To improve IQ path group delay (FA5976A_1.3C) */ + (0x12 << 24) | 0x000024 /* TMODC (0x12) -- Turn OFF Temperature sensor */ }; -u32 w89rf242_channel_data_24[][2] = -{ - {(0x03<<24)|0x025B06, (0x04<<24)|0x080408}, // channe1 01 - {(0x03<<24)|0x025C46, (0x04<<24)|0x080408}, // channe1 02 - {(0x03<<24)|0x025D86, (0x04<<24)|0x080408}, // channe1 03 - {(0x03<<24)|0x025EC6, (0x04<<24)|0x080408}, // channe1 04 - {(0x03<<24)|0x026006, (0x04<<24)|0x080408}, // channe1 05 - {(0x03<<24)|0x026146, (0x04<<24)|0x080408}, // channe1 06 - {(0x03<<24)|0x026286, (0x04<<24)|0x080408}, // channe1 07 - {(0x03<<24)|0x0263C6, (0x04<<24)|0x080408}, // channe1 08 - {(0x03<<24)|0x026506, (0x04<<24)|0x080408}, // channe1 09 - {(0x03<<24)|0x026646, (0x04<<24)|0x080408}, // channe1 10 - {(0x03<<24)|0x026786, (0x04<<24)|0x080408}, // channe1 11 - {(0x03<<24)|0x0268C6, (0x04<<24)|0x080408}, // channe1 12 - {(0x03<<24)|0x026A06, (0x04<<24)|0x080408}, // channe1 13 - {(0x03<<24)|0x026D06, (0x04<<24)|0x080408} // channe1 14 +static u32 w89rf242_channel_data_24[][2] = { + {(0x03 << 24) | 0x025B06, (0x04 << 24) | 0x080408}, /* channe1 01 */ + {(0x03 << 24) | 0x025C46, (0x04 << 24) | 0x080408}, /* channe1 02 */ + {(0x03 << 24) | 0x025D86, (0x04 << 24) | 0x080408}, /* channe1 03 */ + {(0x03 << 24) | 0x025EC6, (0x04 << 24) | 0x080408}, /* channe1 04 */ + {(0x03 << 24) | 0x026006, (0x04 << 24) | 0x080408}, /* channe1 05 */ + {(0x03 << 24) | 0x026146, (0x04 << 24) | 0x080408}, /* channe1 06 */ + {(0x03 << 24) | 0x026286, (0x04 << 24) | 0x080408}, /* channe1 07 */ + {(0x03 << 24) | 0x0263C6, (0x04 << 24) | 0x080408}, /* channe1 08 */ + {(0x03 << 24) | 0x026506, (0x04 << 24) | 0x080408}, /* channe1 09 */ + {(0x03 << 24) | 0x026646, (0x04 << 24) | 0x080408}, /* channe1 10 */ + {(0x03 << 24) | 0x026786, (0x04 << 24) | 0x080408}, /* channe1 11 */ + {(0x03 << 24) | 0x0268C6, (0x04 << 24) | 0x080408}, /* channe1 12 */ + {(0x03 << 24) | 0x026A06, (0x04 << 24) | 0x080408}, /* channe1 13 */ + {(0x03 << 24) | 0x026D06, (0x04 << 24) | 0x080408} /* channe1 14 */ }; -u32 w89rf242_power_data_24[] = {(0x05<<24)|0x24C48A, (0x05<<24)|0x24C48A, (0x05<<24)|0x24C48A}; - -// 20060315.6 Enlarge for new scale -// 20060316.6 20060619.2.a add mapping array -u32 w89rf242_txvga_old_mapping[][2] = -{ - {0, 0} , // New <-> Old +static u32 w89rf242_txvga_old_mapping[][2] = { + {0, 0} , /* New <-> Old */ {1, 1} , {2, 2} , {3, 3} , {4, 4} , {6, 5} , - {8, 6 }, - {10, 7 }, - {12, 8 }, - {14, 9 }, + {8, 6}, + {10, 7}, + {12, 8}, + {14, 9}, {16, 10}, {18, 11}, {20, 12}, @@ -817,1705 +689,1503 @@ u32 w89rf242_txvga_old_mapping[][2] = {30, 17}, {32, 18}, {34, 19}, +}; +static u32 w89rf242_txvga_data[][5] = { + /* low gain mode */ + {(0x05 << 24) | 0x24C00A, 0, 0x00292315, 0x0800FEFF, 0x52523131}, /* min gain */ + {(0x05 << 24) | 0x24C80A, 1, 0x00292315, 0x0800FEFF, 0x52523131}, + {(0x05 << 24) | 0x24C04A, 2, 0x00292315, 0x0800FEFF, 0x52523131}, /* (default) +14dBm (ANT) */ + {(0x05 << 24) | 0x24C84A, 3, 0x00292315, 0x0800FEFF, 0x52523131}, -}; + /* TXVGA=0x10 */ + {(0x05 << 24) | 0x24C40A, 4, 0x00292315, 0x0800FEFF, 0x60603838}, + {(0x05 << 24) | 0x24C40A, 5, 0x00262114, 0x0700FEFF, 0x65653B3B}, -// 20060619.3 modify from Bruce's mail -u32 w89rf242_txvga_data[][5] = -{ - //low gain mode - { (0x05<<24)|0x24C00A, 0, 0x00292315, 0x0800FEFF, 0x52523131 },// ; min gain - { (0x05<<24)|0x24C80A, 1, 0x00292315, 0x0800FEFF, 0x52523131 }, - { (0x05<<24)|0x24C04A, 2, 0x00292315, 0x0800FEFF, 0x52523131 },// (default) +14dBm (ANT) - { (0x05<<24)|0x24C84A, 3, 0x00292315, 0x0800FEFF, 0x52523131 }, - - //TXVGA=0x10 - { (0x05<<24)|0x24C40A, 4, 0x00292315, 0x0800FEFF, 0x60603838 }, - { (0x05<<24)|0x24C40A, 5, 0x00262114, 0x0700FEFF, 0x65653B3B }, - - //TXVGA=0x11 - { (0x05<<24)|0x24C44A, 6, 0x00241F13, 0x0700FFFF, 0x58583333 }, - { (0x05<<24)|0x24C44A, 7, 0x00292315, 0x0800FEFF, 0x5E5E3737 }, - - //TXVGA=0x12 - { (0x05<<24)|0x24C48A, 8, 0x00262114, 0x0700FEFF, 0x53533030 }, - { (0x05<<24)|0x24C48A, 9, 0x00241F13, 0x0700FFFF, 0x59593434 }, - - //TXVGA=0x13 - { (0x05<<24)|0x24C4CA, 10, 0x00292315, 0x0800FEFF, 0x52523030 }, - { (0x05<<24)|0x24C4CA, 11, 0x00262114, 0x0700FEFF, 0x56563232 }, - - //TXVGA=0x14 - { (0x05<<24)|0x24C50A, 12, 0x00292315, 0x0800FEFF, 0x54543131 }, - { (0x05<<24)|0x24C50A, 13, 0x00262114, 0x0700FEFF, 0x58583434 }, - - //TXVGA=0x15 - { (0x05<<24)|0x24C54A, 14, 0x00292315, 0x0800FEFF, 0x54543131 }, - { (0x05<<24)|0x24C54A, 15, 0x00262114, 0x0700FEFF, 0x59593434 }, - - //TXVGA=0x16 - { (0x05<<24)|0x24C58A, 16, 0x00292315, 0x0800FEFF, 0x55553131 }, - { (0x05<<24)|0x24C58A, 17, 0x00292315, 0x0800FEFF, 0x5B5B3535 }, - - //TXVGA=0x17 - { (0x05<<24)|0x24C5CA, 18, 0x00262114, 0x0700FEFF, 0x51512F2F }, - { (0x05<<24)|0x24C5CA, 19, 0x00241F13, 0x0700FFFF, 0x55553131 }, - - //TXVGA=0x18 - { (0x05<<24)|0x24C60A, 20, 0x00292315, 0x0800FEFF, 0x4F4F2E2E }, - { (0x05<<24)|0x24C60A, 21, 0x00262114, 0x0700FEFF, 0x53533030 }, - - //TXVGA=0x19 - { (0x05<<24)|0x24C64A, 22, 0x00292315, 0x0800FEFF, 0x4E4E2D2D }, - { (0x05<<24)|0x24C64A, 23, 0x00262114, 0x0700FEFF, 0x53533030 }, - - //TXVGA=0x1A - { (0x05<<24)|0x24C68A, 24, 0x00292315, 0x0800FEFF, 0x50502E2E }, - { (0x05<<24)|0x24C68A, 25, 0x00262114, 0x0700FEFF, 0x55553131 }, - - //TXVGA=0x1B - { (0x05<<24)|0x24C6CA, 26, 0x00262114, 0x0700FEFF, 0x53533030 }, - { (0x05<<24)|0x24C6CA, 27, 0x00292315, 0x0800FEFF, 0x5A5A3434 }, - - //TXVGA=0x1C - { (0x05<<24)|0x24C70A, 28, 0x00292315, 0x0800FEFF, 0x55553131 }, - { (0x05<<24)|0x24C70A, 29, 0x00292315, 0x0800FEFF, 0x5D5D3636 }, - - //TXVGA=0x1D - { (0x05<<24)|0x24C74A, 30, 0x00292315, 0x0800FEFF, 0x5F5F3737 }, - { (0x05<<24)|0x24C74A, 31, 0x00262114, 0x0700FEFF, 0x65653B3B }, - - //TXVGA=0x1E - { (0x05<<24)|0x24C78A, 32, 0x00292315, 0x0800FEFF, 0x66663B3B }, - { (0x05<<24)|0x24C78A, 33, 0x00262114, 0x0700FEFF, 0x70704141 }, - - //TXVGA=0x1F - { (0x05<<24)|0x24C7CA, 34, 0x00292315, 0x0800FEFF, 0x72724242 } + /* TXVGA=0x11 */ + { (0x05 << 24) | 0x24C44A, 6, 0x00241F13, 0x0700FFFF, 0x58583333}, + { (0x05 << 24) | 0x24C44A, 7, 0x00292315, 0x0800FEFF, 0x5E5E3737}, + + /* TXVGA=0x12 */ + {(0x05 << 24) | 0x24C48A, 8, 0x00262114, 0x0700FEFF, 0x53533030}, + {(0x05 << 24) | 0x24C48A, 9, 0x00241F13, 0x0700FFFF, 0x59593434}, + + /* TXVGA=0x13 */ + {(0x05 << 24) | 0x24C4CA, 10, 0x00292315, 0x0800FEFF, 0x52523030}, + {(0x05 << 24) | 0x24C4CA, 11, 0x00262114, 0x0700FEFF, 0x56563232}, + + /* TXVGA=0x14 */ + {(0x05 << 24) | 0x24C50A, 12, 0x00292315, 0x0800FEFF, 0x54543131}, + {(0x05 << 24) | 0x24C50A, 13, 0x00262114, 0x0700FEFF, 0x58583434}, + + /* TXVGA=0x15 */ + {(0x05 << 24) | 0x24C54A, 14, 0x00292315, 0x0800FEFF, 0x54543131}, + {(0x05 << 24) | 0x24C54A, 15, 0x00262114, 0x0700FEFF, 0x59593434}, + + /* TXVGA=0x16 */ + {(0x05 << 24) | 0x24C58A, 16, 0x00292315, 0x0800FEFF, 0x55553131}, + {(0x05 << 24) | 0x24C58A, 17, 0x00292315, 0x0800FEFF, 0x5B5B3535}, + + /* TXVGA=0x17 */ + {(0x05 << 24) | 0x24C5CA, 18, 0x00262114, 0x0700FEFF, 0x51512F2F}, + {(0x05 << 24) | 0x24C5CA, 19, 0x00241F13, 0x0700FFFF, 0x55553131}, + + /* TXVGA=0x18 */ + {(0x05 << 24) | 0x24C60A, 20, 0x00292315, 0x0800FEFF, 0x4F4F2E2E}, + {(0x05 << 24) | 0x24C60A, 21, 0x00262114, 0x0700FEFF, 0x53533030}, + + /* TXVGA=0x19 */ + {(0x05 << 24) | 0x24C64A, 22, 0x00292315, 0x0800FEFF, 0x4E4E2D2D}, + {(0x05 << 24) | 0x24C64A, 23, 0x00262114, 0x0700FEFF, 0x53533030}, + + /* TXVGA=0x1A */ + {(0x05 << 24) | 0x24C68A, 24, 0x00292315, 0x0800FEFF, 0x50502E2E}, + {(0x05 << 24) | 0x24C68A, 25, 0x00262114, 0x0700FEFF, 0x55553131}, + + /* TXVGA=0x1B */ + {(0x05 << 24) | 0x24C6CA, 26, 0x00262114, 0x0700FEFF, 0x53533030}, + {(0x05 << 24) | 0x24C6CA, 27, 0x00292315, 0x0800FEFF, 0x5A5A3434}, + + /* TXVGA=0x1C */ + {(0x05 << 24) | 0x24C70A, 28, 0x00292315, 0x0800FEFF, 0x55553131}, + {(0x05 << 24) | 0x24C70A, 29, 0x00292315, 0x0800FEFF, 0x5D5D3636}, + + /* TXVGA=0x1D */ + {(0x05 << 24) | 0x24C74A, 30, 0x00292315, 0x0800FEFF, 0x5F5F3737}, + {(0x05 << 24) | 0x24C74A, 31, 0x00262114, 0x0700FEFF, 0x65653B3B}, + + /* TXVGA=0x1E */ + {(0x05 << 24) | 0x24C78A, 32, 0x00292315, 0x0800FEFF, 0x66663B3B}, + {(0x05 << 24) | 0x24C78A, 33, 0x00262114, 0x0700FEFF, 0x70704141}, + + /* TXVGA=0x1F */ + {(0x05 << 24) | 0x24C7CA, 34, 0x00292315, 0x0800FEFF, 0x72724242} }; -/////////////////////////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////////////////////////// - - - -//============================================================================================================= -// Uxx_ReadEthernetAddress -- -// -// Routine Description: -// Reads in the Ethernet address from the IC. -// -// Arguments: -// pHwData - The pHwData structure -// -// Return Value: -// -// The address is stored in EthernetIDAddr. -//============================================================================================================= -void -Uxx_ReadEthernetAddress( phw_data_t pHwData ) +/* ================================================================================================== */ + + + +/* + * ============================================================================================================= + * Uxx_ReadEthernetAddress -- + * + * Routine Description: + * Reads in the Ethernet address from the IC. + * + * Arguments: + * pHwData - The pHwData structure + * + * Return Value: + * + * The address is stored in EthernetIDAddr. + * ============================================================================================================= + */ +void Uxx_ReadEthernetAddress(struct hw_data *pHwData) { u32 ltmp; - // Reading Ethernet address from EEPROM and set into hardware due to MAC address maybe change. - // Only unplug and plug again can make hardware read EEPROM again. 20060727 - Wb35Reg_WriteSync( pHwData, 0x03b4, 0x08000000 ); // Start EEPROM access + Read + address(0x0d) - Wb35Reg_ReadSync( pHwData, 0x03b4, <mp ); - *(u16 *)pHwData->PermanentMacAddress = cpu_to_le16((u16)ltmp); //20060926 anson's endian - Wb35Reg_WriteSync( pHwData, 0x03b4, 0x08010000 ); // Start EEPROM access + Read + address(0x0d) - Wb35Reg_ReadSync( pHwData, 0x03b4, <mp ); - *(u16 *)(pHwData->PermanentMacAddress + 2) = cpu_to_le16((u16)ltmp); //20060926 anson's endian - Wb35Reg_WriteSync( pHwData, 0x03b4, 0x08020000 ); // Start EEPROM access + Read + address(0x0d) - Wb35Reg_ReadSync( pHwData, 0x03b4, <mp ); - *(u16 *)(pHwData->PermanentMacAddress + 4) = cpu_to_le16((u16)ltmp); //20060926 anson's endian + /* + * Reading Ethernet address from EEPROM and set into hardware due to MAC address maybe change. + * Only unplug and plug again can make hardware read EEPROM again. + */ + Wb35Reg_WriteSync(pHwData, 0x03b4, 0x08000000); /* Start EEPROM access + Read + address(0x0d) */ + Wb35Reg_ReadSync(pHwData, 0x03b4, <mp); + *(u16 *)pHwData->PermanentMacAddress = cpu_to_le16((u16) ltmp); + Wb35Reg_WriteSync(pHwData, 0x03b4, 0x08010000); /* Start EEPROM access + Read + address(0x0d) */ + Wb35Reg_ReadSync(pHwData, 0x03b4, <mp); + *(u16 *)(pHwData->PermanentMacAddress + 2) = cpu_to_le16((u16) ltmp); + Wb35Reg_WriteSync(pHwData, 0x03b4, 0x08020000); /* Start EEPROM access + Read + address(0x0d) */ + Wb35Reg_ReadSync(pHwData, 0x03b4, <mp); + *(u16 *)(pHwData->PermanentMacAddress + 4) = cpu_to_le16((u16) ltmp); *(u16 *)(pHwData->PermanentMacAddress + 6) = 0; - Wb35Reg_WriteSync( pHwData, 0x03e8, cpu_to_le32(*(u32 *)pHwData->PermanentMacAddress) ); //20060926 anson's endian - Wb35Reg_WriteSync( pHwData, 0x03ec, cpu_to_le32(*(u32 *)(pHwData->PermanentMacAddress+4)) ); //20060926 anson's endian + Wb35Reg_WriteSync(pHwData, 0x03e8, cpu_to_le32(*(u32 *)pHwData->PermanentMacAddress)); + Wb35Reg_WriteSync(pHwData, 0x03ec, cpu_to_le32(*(u32 *)(pHwData->PermanentMacAddress + 4))); } -//=============================================================================================================== -// CardGetMulticastBit -- -// Description: -// For a given multicast address, returns the byte and bit in the card multicast registers that it hashes to. -// Calls CardComputeCrc() to determine the CRC value. -// Arguments: -// Address - the address -// Byte - the byte that it hashes to -// Value - will have a 1 in the relevant bit -// Return Value: -// None. -//============================================================================================================== -void CardGetMulticastBit( u8 Address[ETH_LENGTH_OF_ADDRESS], - u8 *Byte, u8 *Value ) +/* + * =============================================================================================================== + * CardGetMulticastBit -- + * Description: + * For a given multicast address, returns the byte and bit in the card multicast registers that it hashes to. + * Calls CardComputeCrc() to determine the CRC value. + * Arguments: + * Address - the address + * Byte - the byte that it hashes to + * Value - will have a 1 in the relevant bit + * Return Value: + * None. + * ============================================================================================================== + */ +void CardGetMulticastBit(u8 Address[ETH_ALEN], u8 *Byte, u8 *Value) { - u32 Crc; - u32 BitNumber; + u32 Crc; + u32 BitNumber; - // First compute the CRC. - Crc = CardComputeCrc(Address, ETH_LENGTH_OF_ADDRESS); + /* First compute the CRC. */ + Crc = CardComputeCrc(Address, ETH_ALEN); - // The computed CRC is bit0~31 from left to right - //At first we should do right shift 25bits, and read 7bits by using '&', 2^7=128 + /* The computed CRC is bit0~31 from left to right */ + /* At first we should do right shift 25bits, and read 7bits by using '&', 2^7=128 */ BitNumber = (u32) ((Crc >> 26) & 0x3f); - *Byte = (u8) (BitNumber >> 3);// 900514 original (BitNumber / 8) - *Value = (u8) ((u8)1 << (BitNumber % 8)); + *Byte = (u8) (BitNumber >> 3); /* 900514 original (BitNumber / 8) */ + *Value = (u8) ((u8) 1 << (BitNumber % 8)); } -void Uxx_power_on_procedure( phw_data_t pHwData ) +void Uxx_power_on_procedure(struct hw_data *pHwData) { u32 ltmp, loop; - if( pHwData->phy_type <= RF_MAXIM_V1 ) - Wb35Reg_WriteSync( pHwData, 0x03d4, 0xffffff38 ); - else - { - Wb35Reg_WriteSync( pHwData, 0x03f4, 0xFF5807FF );// 20060721 For NEW IC 0xFF5807FF - - // 20060511.1 Fix the following 4 steps for Rx of RF 2230 initial fail - Wb35Reg_WriteSync( pHwData, 0x03d4, 0x80 );// regulator on only - OS_SLEEP(10000); // Modify 20051221.1.b - Wb35Reg_WriteSync( pHwData, 0x03d4, 0xb8 );// REG_ON RF_RSTN on, and - OS_SLEEP(10000); // Modify 20051221.1.b - + if (pHwData->phy_type <= RF_MAXIM_V1) + Wb35Reg_WriteSync(pHwData, 0x03d4, 0xffffff38); + else { + Wb35Reg_WriteSync(pHwData, 0x03f4, 0xFF5807FF); + Wb35Reg_WriteSync(pHwData, 0x03d4, 0x80); /* regulator on only */ + msleep(10); + Wb35Reg_WriteSync(pHwData, 0x03d4, 0xb8); /* REG_ON RF_RSTN on, and */ + msleep(10); ltmp = 0x4968; - if( (pHwData->phy_type == RF_WB_242) || - (RF_WB_242_1 == pHwData->phy_type) ) // 20060619.5 Add + if ((pHwData->phy_type == RF_WB_242) || + (RF_WB_242_1 == pHwData->phy_type)) ltmp = 0x4468; - Wb35Reg_WriteSync( pHwData, 0x03d0, ltmp ); - Wb35Reg_WriteSync( pHwData, 0x03d4, 0xa0 );// PLL_PD REF_PD set to 0 + Wb35Reg_WriteSync(pHwData, 0x03d0, ltmp); + Wb35Reg_WriteSync(pHwData, 0x03d4, 0xa0); /* PLL_PD REF_PD set to 0 */ - OS_SLEEP(20000); // Modify 20051221.1.b - Wb35Reg_ReadSync( pHwData, 0x03d0, <mp ); - loop = 500; // Wait for 5 second 20061101 - while( !(ltmp & 0x20) && loop-- ) - { - OS_SLEEP(10000); // Modify 20051221.1.b - if( !Wb35Reg_ReadSync( pHwData, 0x03d0, <mp ) ) + msleep(20); + Wb35Reg_ReadSync(pHwData, 0x03d0, <mp); + loop = 500; /* Wait for 5 second */ + while (!(ltmp & 0x20) && loop--) { + msleep(10); + if (!Wb35Reg_ReadSync(pHwData, 0x03d0, <mp)) break; } - Wb35Reg_WriteSync( pHwData, 0x03d4, 0xe0 );// MLK_EN + Wb35Reg_WriteSync(pHwData, 0x03d4, 0xe0); /* MLK_EN */ } - Wb35Reg_WriteSync( pHwData, 0x03b0, 1 );// Reset hardware first - OS_SLEEP(10000); // Add this 20051221.1.b + Wb35Reg_WriteSync(pHwData, 0x03b0, 1); /* Reset hardware first */ + msleep(10); - // Set burst write delay - Wb35Reg_WriteSync( pHwData, 0x03f8, 0x7ff ); + /* Set burst write delay */ + Wb35Reg_WriteSync(pHwData, 0x03f8, 0x7ff); } -void Set_ChanIndep_RfData_al7230_24( phw_data_t pHwData, u32 *pltmp ,char number) +static void Set_ChanIndep_RfData_al7230_24(struct hw_data *pHwData, u32 *pltmp, + char number) { u8 i; - - for( i=0; i<number; i++ ) - { + for (i = 0; i < number; i++) { pHwData->phy_para[i] = al7230_rf_data_24[i]; - pltmp[i] = (1 << 31) | (0 << 30) | (24 << 24) | (al7230_rf_data_24[i]&0xffffff); + pltmp[i] = (1 << 31) | (0 << 30) | (24 << 24) | (al7230_rf_data_24[i] & 0xffffff); } } -void Set_ChanIndep_RfData_al7230_50( phw_data_t pHwData, u32 *pltmp, char number) +static void Set_ChanIndep_RfData_al7230_50(struct hw_data *pHwData, u32 *pltmp, + char number) { u8 i; - - for( i=0; i<number; i++ ) - { + for (i = 0; i < number; i++) { pHwData->phy_para[i] = al7230_rf_data_50[i]; - pltmp[i] = (1 << 31) | (0 << 30) | (24 << 24) | (al7230_rf_data_50[i]&0xffffff); + pltmp[i] = (1 << 31) | (0 << 30) | (24 << 24) | (al7230_rf_data_50[i] & 0xffffff); } } -//============================================================================================================= -// RFSynthesizer_initial -- -//============================================================================================================= -void -RFSynthesizer_initial(phw_data_t pHwData) +/* + * ============================================================================================================= + * RFSynthesizer_initial -- + * ============================================================================================================= + */ +void RFSynthesizer_initial(struct hw_data *pHwData) { u32 altmp[32]; - u32 * pltmp = altmp; + u32 *pltmp = altmp; u32 ltmp; - u8 number=0x00; // The number of register vale + u8 number = 0x00; /* The number of register vale */ u8 i; - // - // bit[31] SPI Enable. - // 1=perform synthesizer program operation. This bit will - // cleared automatically after the operation is completed. - // bit[30] SPI R/W Control - // 0=write, 1=read - // bit[29:24] SPI Data Format Length - // bit[17:4 ] RF Data bits. - // bit[3 :0 ] RF address. - switch( pHwData->phy_type ) - { + /* + * bit[31] SPI Enable. + * 1=perform synthesizer program operation. This bit will + * cleared automatically after the operation is completed. + * bit[30] SPI R/W Control + * 0=write, 1=read + * bit[29:24] SPI Data Format Length + * bit[17:4 ] RF Data bits. + * bit[3 :0 ] RF address. + */ + switch (pHwData->phy_type) { case RF_MAXIM_2825: - case RF_MAXIM_V1: // 11g Winbond 2nd BB(with Phy board (v1) + Maxim 331) - number = sizeof(max2825_rf_data)/sizeof(max2825_rf_data[0]); - for( i=0; i<number; i++ ) - { - pHwData->phy_para[i] = max2825_rf_data[i];// Backup Rf parameter - pltmp[i] = (1 << 31) | (0 << 30) | (18 << 24) | BitReverse( max2825_rf_data[i], 18); + case RF_MAXIM_V1: /* 11g Winbond 2nd BB(with Phy board (v1) + Maxim 331) */ + number = ARRAY_SIZE(max2825_rf_data); + for (i = 0; i < number; i++) { + pHwData->phy_para[i] = max2825_rf_data[i]; /* Backup Rf parameter */ + pltmp[i] = (1 << 31) | (0 << 30) | (18 << 24) | BitReverse(max2825_rf_data[i], 18); } break; - case RF_MAXIM_2827: - number = sizeof(max2827_rf_data)/sizeof(max2827_rf_data[0]); - for( i=0; i<number; i++ ) - { + number = ARRAY_SIZE(max2827_rf_data); + for (i = 0; i < number; i++) { pHwData->phy_para[i] = max2827_rf_data[i]; - pltmp[i] = (1 << 31) | (0 << 30) | (18 << 24) | BitReverse( max2827_rf_data[i], 18); + pltmp[i] = (1 << 31) | (0 << 30) | (18 << 24) | BitReverse(max2827_rf_data[i], 18); } break; - case RF_MAXIM_2828: - number = sizeof(max2828_rf_data)/sizeof(max2828_rf_data[0]); - for( i=0; i<number; i++ ) - { + number = ARRAY_SIZE(max2828_rf_data); + for (i = 0; i < number; i++) { pHwData->phy_para[i] = max2828_rf_data[i]; - pltmp[i] = (1 << 31) | (0 << 30) | (18 << 24) | BitReverse( max2828_rf_data[i], 18); + pltmp[i] = (1 << 31) | (0 << 30) | (18 << 24) | BitReverse(max2828_rf_data[i], 18); } break; - case RF_MAXIM_2829: - number = sizeof(max2829_rf_data)/sizeof(max2829_rf_data[0]); - for( i=0; i<number; i++ ) - { + number = ARRAY_SIZE(max2829_rf_data); + for (i = 0; i < number; i++) { pHwData->phy_para[i] = max2829_rf_data[i]; - pltmp[i] = (1 << 31) | (0 << 30) | (18 << 24) | BitReverse( max2829_rf_data[i], 18); + pltmp[i] = (1 << 31) | (0 << 30) | (18 << 24) | BitReverse(max2829_rf_data[i], 18); } break; - case RF_AIROHA_2230: - number = sizeof(al2230_rf_data)/sizeof(al2230_rf_data[0]); - for( i=0; i<number; i++ ) - { + number = ARRAY_SIZE(al2230_rf_data); + for (i = 0; i < number; i++) { pHwData->phy_para[i] = al2230_rf_data[i]; - pltmp[i] = (1 << 31) | (0 << 30) | (20 << 24) | BitReverse( al2230_rf_data[i], 20); + pltmp[i] = (1 << 31) | (0 << 30) | (20 << 24) | BitReverse(al2230_rf_data[i], 20); } break; - case RF_AIROHA_2230S: - number = sizeof(al2230s_rf_data)/sizeof(al2230s_rf_data[0]); - for( i=0; i<number; i++ ) - { + number = ARRAY_SIZE(al2230s_rf_data); + for (i = 0; i < number; i++) { pHwData->phy_para[i] = al2230s_rf_data[i]; - pltmp[i] = (1 << 31) | (0 << 30) | (20 << 24) | BitReverse( al2230s_rf_data[i], 20); + pltmp[i] = (1 << 31) | (0 << 30) | (20 << 24) | BitReverse(al2230s_rf_data[i], 20); } break; - case RF_AIROHA_7230: - - //Start to fill RF parameters, PLL_ON should be pulled low. - Wb35Reg_WriteSync( pHwData, 0x03dc, 0x00000000 ); -#ifdef _PE_STATE_DUMP_ - WBDEBUG(("* PLL_ON low\n")); -#endif - - number = sizeof(al7230_rf_data_24)/sizeof(al7230_rf_data_24[0]); + /* Start to fill RF parameters, PLL_ON should be pulled low. */ + Wb35Reg_WriteSync(pHwData, 0x03dc, 0x00000000); + pr_debug("* PLL_ON low\n"); + number = ARRAY_SIZE(al7230_rf_data_24); Set_ChanIndep_RfData_al7230_24(pHwData, pltmp, number); break; - case RF_WB_242: - case RF_WB_242_1: // 20060619.5 Add - number = sizeof(w89rf242_rf_data)/sizeof(w89rf242_rf_data[0]); - for( i=0; i<number; i++ ) - { + case RF_WB_242_1: + number = ARRAY_SIZE(w89rf242_rf_data); + for (i = 0; i < number; i++) { ltmp = w89rf242_rf_data[i]; - if( i == 4 ) // Update the VCO trim from EEPROM - { - ltmp &= ~0xff0; // Mask bit4 ~bit11 - ltmp |= pHwData->VCO_trim<<4; + if (i == 4) { /* Update the VCO trim from EEPROM */ + ltmp &= ~0xff0; /* Mask bit4 ~bit11 */ + ltmp |= pHwData->VCO_trim << 4; } pHwData->phy_para[i] = ltmp; - pltmp[i] = (1 << 31) | (0 << 30) | (24 << 24) | BitReverse( ltmp, 24); + pltmp[i] = (1 << 31) | (0 << 30) | (24 << 24) | BitReverse(ltmp, 24); } break; } pHwData->phy_number = number; - // The 16 is the maximum capability of hardware. Here use 12 - if( number > 12 ) { - //Wb35Reg_BurstWrite( pHwData, 0x0864, pltmp, 12, NO_INCREMENT ); - for( i=0; i<12; i++ ) // For Al2230 - Wb35Reg_WriteSync( pHwData, 0x0864, pltmp[i] ); + /* The 16 is the maximum capability of hardware. Here use 12 */ + if (number > 12) { + for (i = 0; i < 12; i++) /* For Al2230 */ + Wb35Reg_WriteSync(pHwData, 0x0864, pltmp[i]); pltmp += 12; number -= 12; } - // Write to register. number must less and equal than 16 - for( i=0; i<number; i++ ) - Wb35Reg_WriteSync( pHwData, 0x864, pltmp[i] ); + /* Write to register. number must less and equal than 16 */ + for (i = 0; i < number; i++) + Wb35Reg_WriteSync(pHwData, 0x864, pltmp[i]); - // 20060630.1 Calibration only 1 time - if( pHwData->CalOneTime ) + /* Calibration only 1 time */ + if (pHwData->CalOneTime) return; pHwData->CalOneTime = 1; - switch( pHwData->phy_type ) - { - case RF_AIROHA_2230: - - // 20060511.1 --- Modifying the follow step for Rx issue----------------- - ltmp = (1 << 31) | (0 << 30) | (20 << 24) | BitReverse( (0x07<<20)|0xE168E, 20); - Wb35Reg_WriteSync( pHwData, 0x0864, ltmp ); - OS_SLEEP(10000); - ltmp = (1 << 31) | (0 << 30) | (20 << 24) | BitReverse( al2230_rf_data[7], 20); - Wb35Reg_WriteSync( pHwData, 0x0864, ltmp ); - OS_SLEEP(10000); - - case RF_AIROHA_2230S: // 20060420 Add this - - // 20060511.1 --- Modifying the follow step for Rx issue----------------- - Wb35Reg_WriteSync( pHwData, 0x03d4, 0x80 );// regulator on only - OS_SLEEP(10000); // Modify 20051221.1.b - - Wb35Reg_WriteSync( pHwData, 0x03d4, 0xa0 );// PLL_PD REF_PD set to 0 - OS_SLEEP(10000); // Modify 20051221.1.b - - Wb35Reg_WriteSync( pHwData, 0x03d4, 0xe0 );// MLK_EN - Wb35Reg_WriteSync( pHwData, 0x03b0, 1 );// Reset hardware first - OS_SLEEP(10000); // Add this 20051221.1.b - //------------------------------------------------------------------------ - - // The follow code doesn't use the burst-write mode - //phy_set_rf_data(phw_data, 0x0F, (0x0F<<20) | 0xF01A0); //Raise Initial Setting - ltmp = (1 << 31) | (0 << 30) | (20 << 24) | BitReverse( (0x0F<<20) | 0xF01A0, 20); - Wb35Reg_WriteSync( pHwData, 0x0864, ltmp ); - - ltmp = pHwData->Wb35Reg.BB5C & 0xfffff000; - Wb35Reg_WriteSync( pHwData, 0x105c, ltmp ); - pHwData->Wb35Reg.BB50 |= 0x13;//(MASK_IQCAL_MODE|MASK_CALIB_START);//20060315.1 modify - Wb35Reg_WriteSync( pHwData, 0x1050, pHwData->Wb35Reg.BB50); - OS_SLEEP(5000); - - //phy_set_rf_data(phw_data, 0x0F, (0x0F<<20) | 0xF01B0); //Activate Filter Cal. - ltmp = (1 << 31) | (0 << 30) | (20 << 24) | BitReverse( (0x0F<<20) | 0xF01B0, 20); - Wb35Reg_WriteSync( pHwData, 0x0864, ltmp ); - OS_SLEEP(5000); - - //phy_set_rf_data(phw_data, 0x0F, (0x0F<<20) | 0xF01e0); //Activate TX DCC - ltmp = (1 << 31) | (0 << 30) | (20 << 24) | BitReverse( (0x0F<<20) | 0xF01E0, 20); - Wb35Reg_WriteSync( pHwData, 0x0864, ltmp ); - OS_SLEEP(5000); - - //phy_set_rf_data(phw_data, 0x0F, (0x0F<<20) | 0xF01A0); //Resotre Initial Setting - ltmp = (1 << 31) | (0 << 30) | (20 << 24) | BitReverse( (0x0F<<20) | 0xF01A0, 20); - Wb35Reg_WriteSync( pHwData, 0x0864, ltmp ); - -// //Force TXI(Q)P(N) to normal control - Wb35Reg_WriteSync( pHwData, 0x105c, pHwData->Wb35Reg.BB5C ); - pHwData->Wb35Reg.BB50 &= ~0x13;//(MASK_IQCAL_MODE|MASK_CALIB_START); - Wb35Reg_WriteSync( pHwData, 0x1050, pHwData->Wb35Reg.BB50); - break; - - case RF_AIROHA_7230: - - //RF parameters have filled completely, PLL_ON should be - //pulled high - Wb35Reg_WriteSync( pHwData, 0x03dc, 0x00000080 ); - #ifdef _PE_STATE_DUMP_ - WBDEBUG(("* PLL_ON high\n")); - #endif - - //2.4GHz - //ltmp = (1 << 31) | (0 << 30) | (24 << 24) | 0x1ABA8F; - //Wb35Reg_WriteSync pHwData, 0x0864, ltmp ); - //OS_SLEEP(1000); // Sleep 1 ms - ltmp = (1 << 31) | (0 << 30) | (24 << 24) | 0x9ABA8F; - Wb35Reg_WriteSync( pHwData, 0x0864, ltmp ); - OS_SLEEP(5000); - ltmp = (1 << 31) | (0 << 30) | (24 << 24) | 0x3ABA8F; - Wb35Reg_WriteSync( pHwData, 0x0864, ltmp ); - OS_SLEEP(5000); - ltmp = (1 << 31) | (0 << 30) | (24 << 24) | 0x1ABA8F; - Wb35Reg_WriteSync( pHwData, 0x0864, ltmp ); - OS_SLEEP(5000); - - //5GHz - Wb35Reg_WriteSync( pHwData, 0x03dc, 0x00000000 ); - #ifdef _PE_STATE_DUMP_ - WBDEBUG(("* PLL_ON low\n")); - #endif - - number = sizeof(al7230_rf_data_50)/sizeof(al7230_rf_data_50[0]); - Set_ChanIndep_RfData_al7230_50(pHwData, pltmp, number); - // Write to register. number must less and equal than 16 - for( i=0; i<number; i++ ) - Wb35Reg_WriteSync( pHwData, 0x0864, pltmp[i] ); - OS_SLEEP(5000); - - Wb35Reg_WriteSync( pHwData, 0x03dc, 0x00000080 ); - #ifdef _PE_STATE_DUMP_ - WBDEBUG(("* PLL_ON high\n")); - #endif - - //ltmp = (1 << 31) | (0 << 30) | (24 << 24) | 0x12BACF; - //Wb35Reg_WriteSync( pHwData, 0x0864, ltmp ); - ltmp = (1 << 31) | (0 << 30) | (24 << 24) | 0x9ABA8F; - Wb35Reg_WriteSync( pHwData, 0x0864, ltmp ); - OS_SLEEP(5000); - ltmp = (1 << 31) | (0 << 30) | (24 << 24) | 0x3ABA8F; - Wb35Reg_WriteSync( pHwData, 0x0864, ltmp ); - OS_SLEEP(5000); - ltmp = (1 << 31) | (0 << 30) | (24 << 24) | 0x12BACF; - Wb35Reg_WriteSync( pHwData, 0x0864, ltmp ); - OS_SLEEP(5000); - - //Wb35Reg_WriteSync( pHwData, 0x03dc, 0x00000080 ); - //WBDEBUG(("* PLL_ON high\n")); - break; - - case RF_WB_242: - case RF_WB_242_1: // 20060619.5 Add - - // - // ; Version 1.3B revision items: for FA5976A , October 3, 2005 by HTHo - // - ltmp = pHwData->Wb35Reg.BB5C & 0xfffff000; - Wb35Reg_WriteSync( pHwData, 0x105c, ltmp ); - Wb35Reg_WriteSync( pHwData, 0x1058, 0 ); - pHwData->Wb35Reg.BB50 |= 0x3;//(MASK_IQCAL_MODE|MASK_CALIB_START);//20060630 - Wb35Reg_WriteSync( pHwData, 0x1050, pHwData->Wb35Reg.BB50); - - //----- Calibration (1). VCO frequency calibration - //Calibration (1a.0). Synthesizer reset (HTHo corrected 2005/05/10) - ltmp = (1 << 31) | (0 << 30) | (24 << 24) | BitReverse( (0x0F<<24) | 0x00101E, 24); - Wb35Reg_WriteSync( pHwData, 0x0864, ltmp ); - OS_SLEEP( 5000 ); // Sleep 5ms - //Calibration (1a). VCO frequency calibration mode ; waiting 2msec VCO calibration time - ltmp = (1 << 31) | (0 << 30) | (24 << 24) | BitReverse( (0x00<<24) | 0xFE69c0, 24); - Wb35Reg_WriteSync( pHwData, 0x0864, ltmp ); - OS_SLEEP( 2000 ); // Sleep 2ms - - //----- Calibration (2). TX baseband Gm-C filter auto-tuning - //Calibration (2a). turn off ENCAL signal - ltmp = (1 << 31) | (0 << 30) | (24 << 24) | BitReverse( (0x00<<24) | 0xF8EBC0, 24); - Wb35Reg_WriteSync( pHwData, 0x0864, ltmp ); - //Calibration (2b.0). TX filter auto-tuning BW: TFLBW=101 (TC5376A default) - ltmp = (1 << 31) | (0 << 30) | (24 << 24) | BitReverse( (0x07<<24) | 0x0C68CE, 24); - Wb35Reg_WriteSync( pHwData, 0x0864, ltmp ); - //Calibration (2b). send TX reset signal (HTHo corrected May 10, 2005) - ltmp = (1 << 31) | (0 << 30) | (24 << 24) | BitReverse( (0x0F<<24) | 0x00201E, 24); - Wb35Reg_WriteSync( pHwData, 0x0864, ltmp ); - //Calibration (2c). turn-on TX Gm-C filter auto-tuning - ltmp = (1 << 31) | (0 << 30) | (24 << 24) | BitReverse( (0x00<<24) | 0xFCEBC0, 24); - Wb35Reg_WriteSync( pHwData, 0x0864, ltmp ); - OS_SLEEP( 150 ); // Sleep 150 us - //turn off ENCAL signal - ltmp = (1 << 31) | (0 << 30) | (24 << 24) | BitReverse( (0x00<<24) | 0xF8EBC0, 24); - Wb35Reg_WriteSync( pHwData, 0x0864, ltmp ); - - //----- Calibration (3). RX baseband Gm-C filter auto-tuning - //Calibration (3a). turn off ENCAL signal - ltmp = (1 << 31) | (0 << 30) | (24 << 24) | BitReverse( (0x00<<24) | 0xFAEDC0, 24); - Wb35Reg_WriteSync( pHwData, 0x0864, ltmp ); - //Calibration (3b.0). RX filter auto-tuning BW: RFLBW=100 (TC5376A+corner default; July 26, 2005) - ltmp = (1 << 31) | (0 << 30) | (24 << 24) | BitReverse( (0x07<<24) | 0x0C68CE, 24); - Wb35Reg_WriteSync( pHwData, 0x0864, ltmp ); - //Calibration (3b). send RX reset signal (HTHo corrected May 10, 2005) - ltmp = (1 << 31) | (0 << 30) | (24 << 24) | BitReverse( (0x0F<<24) | 0x00401E, 24); - Wb35Reg_WriteSync( pHwData, 0x0864, ltmp ); - //Calibration (3c). turn-on RX Gm-C filter auto-tuning - ltmp = (1 << 31) | (0 << 30) | (24 << 24) | BitReverse( (0x00<<24) | 0xFEEDC0, 24); - Wb35Reg_WriteSync( pHwData, 0x0864, ltmp ); - OS_SLEEP( 150 ); // Sleep 150 us - //Calibration (3e). turn off ENCAL signal - ltmp = (1 << 31) | (0 << 30) | (24 << 24) | BitReverse( (0x00<<24) | 0xFAEDC0, 24); - Wb35Reg_WriteSync( pHwData, 0x0864, ltmp ); - - //----- Calibration (4). TX LO leakage calibration - //Calibration (4a). TX LO leakage calibration - ltmp = (1 << 31) | (0 << 30) | (24 << 24) | BitReverse( (0x00<<24) | 0xFD6BC0, 24); - Wb35Reg_WriteSync( pHwData, 0x0864, ltmp ); - OS_SLEEP( 150 ); // Sleep 150 us - - //----- Calibration (5). RX DC offset calibration - //Calibration (5a). turn off ENCAL signal and set to RX SW DC caliration mode - ltmp = (1 << 31) | (0 << 30) | (24 << 24) | BitReverse( (0x00<<24) | 0xFAEDC0, 24); - Wb35Reg_WriteSync( pHwData, 0x0864, ltmp ); - //Calibration (5b). turn off AGC servo-loop & RSSI - ltmp = (1 << 31) | (0 << 30) | (24 << 24) | BitReverse( (0x01<<24) | 0xEBFFC2, 24); - Wb35Reg_WriteSync( pHwData, 0x0864, ltmp ); - - //; for LNA=11 -------- - //Calibration (5c-h). RX DC offset current bias ON; & LNA=11; RXVGA=111111 - ltmp = (1 << 31) | (0 << 30) | (24 << 24) | BitReverse( (0x06<<24) | 0x343FCC, 24); - Wb35Reg_WriteSync( pHwData, 0x0864, ltmp ); - //Calibration (5d). turn on RX DC offset cal function; and waiting 2 msec cal time - ltmp = (1 << 31) | (0 << 30) | (24 << 24) | BitReverse( (0x00<<24) | 0xFF6DC0, 24); - Wb35Reg_WriteSync( pHwData, 0x0864, ltmp ); - OS_SLEEP(2000); // Sleep 2ms - //Calibration (5f). turn off ENCAL signal - ltmp = (1 << 31) | (0 << 30) | (24 << 24) | BitReverse( (0x00<<24) | 0xFAEDC0, 24); - Wb35Reg_WriteSync( pHwData, 0x0864, ltmp ); - - //; for LNA=10 -------- - //Calibration (5c-m). RX DC offset current bias ON; & LNA=10; RXVGA=111111 - ltmp = (1 << 31) | (0 << 30) | (24 << 24) | BitReverse( (0x06<<24) | 0x342FCC, 24); - Wb35Reg_WriteSync( pHwData, 0x0864, ltmp ); - //Calibration (5d). turn on RX DC offset cal function; and waiting 2 msec cal time - ltmp = (1 << 31) | (0 << 30) | (24 << 24) | BitReverse( (0x00<<24) | 0xFF6DC0, 24); - Wb35Reg_WriteSync( pHwData, 0x0864, ltmp ); - OS_SLEEP(2000); // Sleep 2ms - //Calibration (5f). turn off ENCAL signal - ltmp = (1 << 31) | (0 << 30) | (24 << 24) | BitReverse( (0x00<<24) | 0xFAEDC0, 24); - Wb35Reg_WriteSync( pHwData, 0x0864, ltmp ); - - //; for LNA=01 -------- - //Calibration (5c-m). RX DC offset current bias ON; & LNA=01; RXVGA=111111 - ltmp = (1 << 31) | (0 << 30) | (24 << 24) | BitReverse( (0x06<<24) | 0x341FCC, 24); - Wb35Reg_WriteSync( pHwData, 0x0864, ltmp ); - //Calibration (5d). turn on RX DC offset cal function; and waiting 2 msec cal time - ltmp = (1 << 31) | (0 << 30) | (24 << 24) | BitReverse( (0x00<<24) | 0xFF6DC0, 24); - Wb35Reg_WriteSync( pHwData, 0x0864, ltmp ); - OS_SLEEP(2000); // Sleep 2ms - //Calibration (5f). turn off ENCAL signal - ltmp = (1 << 31) | (0 << 30) | (24 << 24) | BitReverse( (0x00<<24) | 0xFAEDC0, 24); - Wb35Reg_WriteSync( pHwData, 0x0864, ltmp ); - - //; for LNA=00 -------- - //Calibration (5c-l). RX DC offset current bias ON; & LNA=00; RXVGA=111111 - ltmp = (1 << 31) | (0 << 30) | (24 << 24) | BitReverse( (0x06<<24) | 0x340FCC, 24); - Wb35Reg_WriteSync( pHwData, 0x0864, ltmp ); - //Calibration (5d). turn on RX DC offset cal function; and waiting 2 msec cal time - ltmp = (1 << 31) | (0 << 30) | (24 << 24) | BitReverse( (0x00<<24) | 0xFF6DC0, 24); - Wb35Reg_WriteSync( pHwData, 0x0864, ltmp ); - OS_SLEEP(2000); // Sleep 2ms - //Calibration (5f). turn off ENCAL signal - ltmp = (1 << 31) | (0 << 30) | (24 << 24) | BitReverse( (0x00<<24) | 0xFAEDC0, 24); - Wb35Reg_WriteSync( pHwData, 0x0864, ltmp ); - //Calibration (5g). turn on AGC servo-loop - ltmp = (1 << 31) | (0 << 30) | (24 << 24) | BitReverse( (0x01<<24) | 0xEFFFC2, 24); - Wb35Reg_WriteSync( pHwData, 0x0864, ltmp ); - - //; ----- Calibration (7). Switch RF chip to normal mode - //0x00 0xF86100 ; 3E184 ; Switch RF chip to normal mode -// OS_SLEEP(10000); // @@ 20060721 - ltmp = (1 << 31) | (0 << 30) | (24 << 24) | BitReverse( (0x00<<24) | 0xF86100, 24); - Wb35Reg_WriteSync( pHwData, 0x0864, ltmp ); - OS_SLEEP(5000); // Sleep 5 ms - -// //write back -// Wb35Reg_WriteSync( pHwData, 0x105c, pHwData->Wb35Reg.BB5C ); -// pHwData->Wb35Reg.BB50 &= ~0x13;//(MASK_IQCAL_MODE|MASK_CALIB_START); // 20060315.1 fix -// Wb35Reg_WriteSync( pHwData, 0x1050, pHwData->Wb35Reg.BB50); -// OS_SLEEP(1000); // Sleep 1 ms - break; + switch (pHwData->phy_type) { + case RF_AIROHA_2230: + ltmp = (1 << 31) | (0 << 30) | (20 << 24) | BitReverse((0x07 << 20) | 0xE168E, 20); + Wb35Reg_WriteSync(pHwData, 0x0864, ltmp); + msleep(10); + ltmp = (1 << 31) | (0 << 30) | (20 << 24) | BitReverse(al2230_rf_data[7], 20); + Wb35Reg_WriteSync(pHwData, 0x0864, ltmp); + msleep(10); + case RF_AIROHA_2230S: + Wb35Reg_WriteSync(pHwData, 0x03d4, 0x80); /* regulator on only */ + msleep(10); + Wb35Reg_WriteSync(pHwData, 0x03d4, 0xa0); /* PLL_PD REF_PD set to 0 */ + msleep(10); + Wb35Reg_WriteSync(pHwData, 0x03d4, 0xe0); /* MLK_EN */ + Wb35Reg_WriteSync(pHwData, 0x03b0, 1); /* Reset hardware first */ + msleep(10); + /* ========================================================= */ + + /* The follow code doesn't use the burst-write mode */ + ltmp = (1 << 31) | (0 << 30) | (20 << 24) | BitReverse((0x0F<<20) | 0xF01A0, 20); + Wb35Reg_WriteSync(pHwData, 0x0864, ltmp); + + ltmp = pHwData->reg.BB5C & 0xfffff000; + Wb35Reg_WriteSync(pHwData, 0x105c, ltmp); + pHwData->reg.BB50 |= 0x13; /* (MASK_IQCAL_MODE|MASK_CALIB_START) */ + Wb35Reg_WriteSync(pHwData, 0x1050, pHwData->reg.BB50); + msleep(5); + + ltmp = (1 << 31) | (0 << 30) | (20 << 24) | BitReverse((0x0F << 20) | 0xF01B0, 20); + Wb35Reg_WriteSync(pHwData, 0x0864, ltmp); + msleep(5); + + ltmp = (1 << 31) | (0 << 30) | (20 << 24) | BitReverse((0x0F << 20) | 0xF01E0, 20); + Wb35Reg_WriteSync(pHwData, 0x0864, ltmp); + msleep(5); + + ltmp = (1 << 31) | (0 << 30) | (20 << 24) | BitReverse((0x0F << 20) | 0xF01A0, 20); + Wb35Reg_WriteSync(pHwData, 0x0864, ltmp); + + Wb35Reg_WriteSync(pHwData, 0x105c, pHwData->reg.BB5C); + pHwData->reg.BB50 &= ~0x13; /* (MASK_IQCAL_MODE|MASK_CALIB_START); */ + Wb35Reg_WriteSync(pHwData, 0x1050, pHwData->reg.BB50); + break; + case RF_AIROHA_7230: + /* RF parameters have filled completely, PLL_ON should be pulled high */ + Wb35Reg_WriteSync(pHwData, 0x03dc, 0x00000080); + pr_debug("* PLL_ON high\n"); + + /* 2.4GHz */ + ltmp = (1 << 31) | (0 << 30) | (24 << 24) | 0x9ABA8F; + Wb35Reg_WriteSync(pHwData, 0x0864, ltmp); + msleep(5); + ltmp = (1 << 31) | (0 << 30) | (24 << 24) | 0x3ABA8F; + Wb35Reg_WriteSync(pHwData, 0x0864, ltmp); + msleep(5); + ltmp = (1 << 31) | (0 << 30) | (24 << 24) | 0x1ABA8F; + Wb35Reg_WriteSync(pHwData, 0x0864, ltmp); + msleep(5); + + /* 5GHz */ + Wb35Reg_WriteSync(pHwData, 0x03dc, 0x00000000); + pr_debug("* PLL_ON low\n"); + + number = ARRAY_SIZE(al7230_rf_data_50); + Set_ChanIndep_RfData_al7230_50(pHwData, pltmp, number); + /* Write to register. number must less and equal than 16 */ + for (i = 0; i < number; i++) + Wb35Reg_WriteSync(pHwData, 0x0864, pltmp[i]); + msleep(5); + + Wb35Reg_WriteSync(pHwData, 0x03dc, 0x00000080); + pr_debug("* PLL_ON high\n"); + + ltmp = (1 << 31) | (0 << 30) | (24 << 24) | 0x9ABA8F; + Wb35Reg_WriteSync(pHwData, 0x0864, ltmp); + msleep(5); + ltmp = (1 << 31) | (0 << 30) | (24 << 24) | 0x3ABA8F; + Wb35Reg_WriteSync(pHwData, 0x0864, ltmp); + msleep(5); + ltmp = (1 << 31) | (0 << 30) | (24 << 24) | 0x12BACF; + Wb35Reg_WriteSync(pHwData, 0x0864, ltmp); + msleep(5); + break; + case RF_WB_242: + case RF_WB_242_1: + /* for FA5976A */ + ltmp = pHwData->reg.BB5C & 0xfffff000; + Wb35Reg_WriteSync(pHwData, 0x105c, ltmp); + Wb35Reg_WriteSync(pHwData, 0x1058, 0); + pHwData->reg.BB50 |= 0x3; /* (MASK_IQCAL_MODE|MASK_CALIB_START); */ + Wb35Reg_WriteSync(pHwData, 0x1050, pHwData->reg.BB50); + + /* ----- Calibration (1). VCO frequency calibration */ + /* Calibration (1a.0). Synthesizer reset */ + ltmp = (1 << 31) | (0 << 30) | (24 << 24) | BitReverse((0x0F<<24) | 0x00101E, 24); + Wb35Reg_WriteSync(pHwData, 0x0864, ltmp); + msleep(5); + /* Calibration (1a). VCO frequency calibration mode ; waiting 2msec VCO calibration time */ + ltmp = (1 << 31) | (0 << 30) | (24 << 24) | BitReverse((0x00<<24) | 0xFE69c0, 24); + Wb35Reg_WriteSync(pHwData, 0x0864, ltmp); + msleep(2); + + /* ----- Calibration (2). TX baseband Gm-C filter auto-tuning */ + /* Calibration (2a). turn off ENCAL signal */ + ltmp = (1 << 31) | (0 << 30) | (24 << 24) | BitReverse((0x00<<24) | 0xF8EBC0, 24); + Wb35Reg_WriteSync(pHwData, 0x0864, ltmp); + /* Calibration (2b.0). TX filter auto-tuning BW: TFLBW=101 (TC5376A default) */ + ltmp = (1 << 31) | (0 << 30) | (24 << 24) | BitReverse((0x07<<24) | 0x0C68CE, 24); + Wb35Reg_WriteSync(pHwData, 0x0864, ltmp); + /* Calibration (2b). send TX reset signal */ + ltmp = (1 << 31) | (0 << 30) | (24 << 24) | BitReverse((0x0F<<24) | 0x00201E, 24); + Wb35Reg_WriteSync(pHwData, 0x0864, ltmp); + /* Calibration (2c). turn-on TX Gm-C filter auto-tuning */ + ltmp = (1 << 31) | (0 << 30) | (24 << 24) | BitReverse((0x00<<24) | 0xFCEBC0, 24); + Wb35Reg_WriteSync(pHwData, 0x0864, ltmp); + udelay(150); /* Sleep 150 us */ + /* turn off ENCAL signal */ + ltmp = (1 << 31) | (0 << 30) | (24 << 24) | BitReverse((0x00<<24) | 0xF8EBC0, 24); + Wb35Reg_WriteSync(pHwData, 0x0864, ltmp); + + /* ----- Calibration (3). RX baseband Gm-C filter auto-tuning */ + /* Calibration (3a). turn off ENCAL signal */ + ltmp = (1 << 31) | (0 << 30) | (24 << 24) | BitReverse((0x00<<24) | 0xFAEDC0, 24); + Wb35Reg_WriteSync(pHwData, 0x0864, ltmp); + /* Calibration (3b.0). RX filter auto-tuning BW: RFLBW=100 (TC5376A+corner default;) */ + ltmp = (1 << 31) | (0 << 30) | (24 << 24) | BitReverse((0x07<<24) | 0x0C68CE, 24); + Wb35Reg_WriteSync(pHwData, 0x0864, ltmp); + /* Calibration (3b). send RX reset signal */ + ltmp = (1 << 31) | (0 << 30) | (24 << 24) | BitReverse((0x0F<<24) | 0x00401E, 24); + Wb35Reg_WriteSync(pHwData, 0x0864, ltmp); + /* Calibration (3c). turn-on RX Gm-C filter auto-tuning */ + ltmp = (1 << 31) | (0 << 30) | (24 << 24) | BitReverse((0x00<<24) | 0xFEEDC0, 24); + Wb35Reg_WriteSync(pHwData, 0x0864, ltmp); + udelay(150); /* Sleep 150 us */ + /* Calibration (3e). turn off ENCAL signal */ + ltmp = (1 << 31) | (0 << 30) | (24 << 24) | BitReverse((0x00<<24) | 0xFAEDC0, 24); + Wb35Reg_WriteSync(pHwData, 0x0864, ltmp); + + /* ----- Calibration (4). TX LO leakage calibration */ + /* Calibration (4a). TX LO leakage calibration */ + ltmp = (1 << 31) | (0 << 30) | (24 << 24) | BitReverse((0x00<<24) | 0xFD6BC0, 24); + Wb35Reg_WriteSync(pHwData, 0x0864, ltmp); + udelay(150); /* Sleep 150 us */ + + /* ----- Calibration (5). RX DC offset calibration */ + /* Calibration (5a). turn off ENCAL signal and set to RX SW DC calibration mode */ + ltmp = (1 << 31) | (0 << 30) | (24 << 24) | BitReverse((0x00<<24) | 0xFAEDC0, 24); + Wb35Reg_WriteSync(pHwData, 0x0864, ltmp); + /* Calibration (5b). turn off AGC servo-loop & RSSI */ + ltmp = (1 << 31) | (0 << 30) | (24 << 24) | BitReverse((0x01<<24) | 0xEBFFC2, 24); + Wb35Reg_WriteSync(pHwData, 0x0864, ltmp); + + /* for LNA=11 -------- */ + /* Calibration (5c-h). RX DC offset current bias ON; & LNA=11; RXVGA=111111 */ + ltmp = (1 << 31) | (0 << 30) | (24 << 24) | BitReverse((0x06<<24) | 0x343FCC, 24); + Wb35Reg_WriteSync(pHwData, 0x0864, ltmp); + /* Calibration (5d). turn on RX DC offset cal function; and waiting 2 msec cal time */ + ltmp = (1 << 31) | (0 << 30) | (24 << 24) | BitReverse((0x00<<24) | 0xFF6DC0, 24); + Wb35Reg_WriteSync(pHwData, 0x0864, ltmp); + msleep(2); + /* Calibration (5f). turn off ENCAL signal */ + ltmp = (1 << 31) | (0 << 30) | (24 << 24) | BitReverse((0x00<<24) | 0xFAEDC0, 24); + Wb35Reg_WriteSync(pHwData, 0x0864, ltmp); + + /* for LNA=10 -------- */ + /* Calibration (5c-m). RX DC offset current bias ON; & LNA=10; RXVGA=111111 */ + ltmp = (1 << 31) | (0 << 30) | (24 << 24) | BitReverse((0x06<<24) | 0x342FCC, 24); + Wb35Reg_WriteSync(pHwData, 0x0864, ltmp); + /* Calibration (5d). turn on RX DC offset cal function; and waiting 2 msec cal time */ + ltmp = (1 << 31) | (0 << 30) | (24 << 24) | BitReverse((0x00<<24) | 0xFF6DC0, 24); + Wb35Reg_WriteSync(pHwData, 0x0864, ltmp); + msleep(2); + /* Calibration (5f). turn off ENCAL signal */ + ltmp = (1 << 31) | (0 << 30) | (24 << 24) | BitReverse((0x00<<24) | 0xFAEDC0, 24); + Wb35Reg_WriteSync(pHwData, 0x0864, ltmp); + + /* for LNA=01 -------- */ + /* Calibration (5c-m). RX DC offset current bias ON; & LNA=01; RXVGA=111111 */ + ltmp = (1 << 31) | (0 << 30) | (24 << 24) | BitReverse((0x06<<24) | 0x341FCC, 24); + Wb35Reg_WriteSync(pHwData, 0x0864, ltmp); + /* Calibration (5d). turn on RX DC offset cal function; and waiting 2 msec cal time */ + ltmp = (1 << 31) | (0 << 30) | (24 << 24) | BitReverse((0x00<<24) | 0xFF6DC0, 24); + Wb35Reg_WriteSync(pHwData, 0x0864, ltmp); + msleep(2); + /* Calibration (5f). turn off ENCAL signal */ + ltmp = (1 << 31) | (0 << 30) | (24 << 24) | BitReverse((0x00<<24) | 0xFAEDC0, 24); + Wb35Reg_WriteSync(pHwData, 0x0864, ltmp); + + /* for LNA=00 -------- */ + /* Calibration (5c-l). RX DC offset current bias ON; & LNA=00; RXVGA=111111 */ + ltmp = (1 << 31) | (0 << 30) | (24 << 24) | BitReverse((0x06<<24) | 0x340FCC, 24); + Wb35Reg_WriteSync(pHwData, 0x0864, ltmp); + /* Calibration (5d). turn on RX DC offset cal function; and waiting 2 msec cal time */ + ltmp = (1 << 31) | (0 << 30) | (24 << 24) | BitReverse((0x00<<24) | 0xFF6DC0, 24); + Wb35Reg_WriteSync(pHwData, 0x0864, ltmp); + msleep(2); + /* Calibration (5f). turn off ENCAL signal */ + ltmp = (1 << 31) | (0 << 30) | (24 << 24) | BitReverse((0x00<<24) | 0xFAEDC0, 24); + Wb35Reg_WriteSync(pHwData, 0x0864, ltmp); + /* Calibration (5g). turn on AGC servo-loop */ + ltmp = (1 << 31) | (0 << 30) | (24 << 24) | BitReverse((0x01<<24) | 0xEFFFC2, 24); + Wb35Reg_WriteSync(pHwData, 0x0864, ltmp); + + /* ----- Calibration (7). Switch RF chip to normal mode */ + /* 0x00 0xF86100 ; 3E184 ; Switch RF chip to normal mode */ + ltmp = (1 << 31) | (0 << 30) | (24 << 24) | BitReverse((0x00<<24) | 0xF86100, 24); + Wb35Reg_WriteSync(pHwData, 0x0864, ltmp); + msleep(5); + break; } } -void BBProcessor_AL7230_2400( phw_data_t pHwData) +static void BBProcessor_AL7230_2400(struct hw_data *pHwData) { - PWB35REG pWb35Reg = &pHwData->Wb35Reg; + struct wb35_reg *reg = &pHwData->reg; u32 pltmp[12]; - pltmp[0] = 0x16A8337A; // 0x16a5215f; // 0x1000 AGC_Ctrl1 - pltmp[1] = 0x9AFF9AA6; // 0x9aff9ca6; // 0x1004 AGC_Ctrl2 - pltmp[2] = 0x55D00A04; // 0x55d00a04; // 0x1008 AGC_Ctrl3 - pltmp[3] = 0xFFF72031; // 0xFfFf2138; // 0x100c AGC_Ctrl4 - pWb35Reg->BB0C = 0xFFF72031; - pltmp[4] = 0x0FacDCC5; // 0x1010 AGC_Ctrl5 // 20050927 0x0FacDCB7 - pltmp[5] = 0x00CAA333; // 0x00eaa333; // 0x1014 AGC_Ctrl6 - pltmp[6] = 0xF2211111; // 0x11111111; // 0x1018 AGC_Ctrl7 - pltmp[7] = 0x0FA3F0ED; // 0x101c AGC_Ctrl8 - pltmp[8] = 0x06443440; // 0x1020 AGC_Ctrl9 - pltmp[9] = 0xA8002A79; // 0xa9002A79; // 0x1024 AGC_Ctrl10 - pltmp[10] = 0x40000528; // 20050927 0x40000228 - pltmp[11] = 0x232D7F30; // 0x23457f30;// 0x102c A_ACQ_Ctrl - pWb35Reg->BB2C = 0x232D7F30; - Wb35Reg_BurstWrite( pHwData, 0x1000, pltmp, 12, AUTO_INCREMENT ); - - pltmp[0] = 0x00002c54; // 0x1030 B_ACQ_Ctrl - pWb35Reg->BB30 = 0x00002c54; - pltmp[1] = 0x00C0D6C5; // 0x1034 A_TXRX_Ctrl - pltmp[2] = 0x5B2C8769; // 0x1038 B_TXRX_Ctrl - pltmp[3] = 0x00000000; // 0x103c 11a TX LS filter - pWb35Reg->BB3C = 0x00000000; - pltmp[4] = 0x00003F29; // 0x1040 11a TX LS filter - pltmp[5] = 0x0EFEFBFE; // 0x1044 11a TX LS filter - pltmp[6] = 0x00332C1B; // 0x00453B24; // 0x1048 11b TX RC filter - pltmp[7] = 0x0A00FEFF; // 0x0E00FEFF; // 0x104c 11b TX RC filter - pltmp[8] = 0x2B106208; // 0x1050 MODE_Ctrl - pWb35Reg->BB50 = 0x2B106208; - pltmp[9] = 0; // 0x1054 - pWb35Reg->BB54 = 0x00000000; - pltmp[10] = 0x52524242; // 0x64645252; // 0x1058 IQ_Alpha - pWb35Reg->BB58 = 0x52524242; - pltmp[11] = 0xAA0AC000; // 0x105c DC_Cancel - Wb35Reg_BurstWrite( pHwData, 0x1030, pltmp, 12, AUTO_INCREMENT ); - + pltmp[0] = 0x16A8337A; /* 0x1000 AGC_Ctrl1 */ + pltmp[1] = 0x9AFF9AA6; /* 0x1004 AGC_Ctrl2 */ + pltmp[2] = 0x55D00A04; /* 0x1008 AGC_Ctrl3 */ + pltmp[3] = 0xFFF72031; /* 0x100c AGC_Ctrl4 */ + reg->BB0C = 0xFFF72031; + pltmp[4] = 0x0FacDCC5; /* 0x1010 AGC_Ctrl5 */ + pltmp[5] = 0x00CAA333; /* 0x1014 AGC_Ctrl6 */ + pltmp[6] = 0xF2211111; /* 0x1018 AGC_Ctrl7 */ + pltmp[7] = 0x0FA3F0ED; /* 0x101c AGC_Ctrl8 */ + pltmp[8] = 0x06443440; /* 0x1020 AGC_Ctrl9 */ + pltmp[9] = 0xA8002A79; /* 0x1024 AGC_Ctrl10 */ + pltmp[10] = 0x40000528; + pltmp[11] = 0x232D7F30; /* 0x102c A_ACQ_Ctrl */ + reg->BB2C = 0x232D7F30; + Wb35Reg_BurstWrite(pHwData, 0x1000, pltmp, 12, AUTO_INCREMENT); + + pltmp[0] = 0x00002c54; /* 0x1030 B_ACQ_Ctrl */ + reg->BB30 = 0x00002c54; + pltmp[1] = 0x00C0D6C5; /* 0x1034 A_TXRX_Ctrl */ + pltmp[2] = 0x5B2C8769; /* 0x1038 B_TXRX_Ctrl */ + pltmp[3] = 0x00000000; /* 0x103c 11a TX LS filter */ + reg->BB3C = 0x00000000; + pltmp[4] = 0x00003F29; /* 0x1040 11a TX LS filter */ + pltmp[5] = 0x0EFEFBFE; /* 0x1044 11a TX LS filter */ + pltmp[6] = 0x00332C1B; /* 0x1048 11b TX RC filter */ + pltmp[7] = 0x0A00FEFF; /* 0x104c 11b TX RC filter */ + pltmp[8] = 0x2B106208; /* 0x1050 MODE_Ctrl */ + reg->BB50 = 0x2B106208; + pltmp[9] = 0; /* 0x1054 */ + reg->BB54 = 0x00000000; + pltmp[10] = 0x52524242; /* 0x1058 IQ_Alpha */ + reg->BB58 = 0x52524242; + pltmp[11] = 0xAA0AC000; /* 0x105c DC_Cancel */ + Wb35Reg_BurstWrite(pHwData, 0x1030, pltmp, 12, AUTO_INCREMENT); } -void BBProcessor_AL7230_5000( phw_data_t pHwData) +static void BBProcessor_AL7230_5000(struct hw_data *pHwData) { - PWB35REG pWb35Reg = &pHwData->Wb35Reg; + struct wb35_reg *reg = &pHwData->reg; u32 pltmp[12]; - pltmp[0] = 0x16AA6678; // 0x1000 AGC_Ctrl1 - pltmp[1] = 0x9AFFA0B2; // 0x1004 AGC_Ctrl2 - pltmp[2] = 0x55D00A04; // 0x1008 AGC_Ctrl3 - pltmp[3] = 0xEFFF233E; // 0x100c AGC_Ctrl4 - pWb35Reg->BB0C = 0xEFFF233E; - pltmp[4] = 0x0FacDCC5; // 0x1010 AGC_Ctrl5 // 20050927 0x0FacDCB7 - pltmp[5] = 0x00CAA333; // 0x1014 AGC_Ctrl6 - pltmp[6] = 0xF2432111; // 0x1018 AGC_Ctrl7 - pltmp[7] = 0x0FA3F0ED; // 0x101c AGC_Ctrl8 - pltmp[8] = 0x05C43440; // 0x1020 AGC_Ctrl9 - pltmp[9] = 0x00002A79; // 0x1024 AGC_Ctrl10 - pltmp[10] = 0x40000528; // 20050927 0x40000228 - pltmp[11] = 0x232FDF30;// 0x102c A_ACQ_Ctrl - pWb35Reg->BB2C = 0x232FDF30; - Wb35Reg_BurstWrite( pHwData, 0x1000, pltmp, 12, AUTO_INCREMENT ); - - pltmp[0] = 0x80002C7C; // 0x1030 B_ACQ_Ctrl - pltmp[1] = 0x00C0D6C5; // 0x1034 A_TXRX_Ctrl - pltmp[2] = 0x5B2C8769; // 0x1038 B_TXRX_Ctrl - pltmp[3] = 0x00000000; // 0x103c 11a TX LS filter - pWb35Reg->BB3C = 0x00000000; - pltmp[4] = 0x00003F29; // 0x1040 11a TX LS filter - pltmp[5] = 0x0EFEFBFE; // 0x1044 11a TX LS filter - pltmp[6] = 0x00332C1B; // 0x1048 11b TX RC filter - pltmp[7] = 0x0A00FEFF; // 0x104c 11b TX RC filter - pltmp[8] = 0x2B107208; // 0x1050 MODE_Ctrl - pWb35Reg->BB50 = 0x2B107208; - pltmp[9] = 0; // 0x1054 - pWb35Reg->BB54 = 0x00000000; - pltmp[10] = 0x52524242; // 0x1058 IQ_Alpha - pWb35Reg->BB58 = 0x52524242; - pltmp[11] = 0xAA0AC000; // 0x105c DC_Cancel - Wb35Reg_BurstWrite( pHwData, 0x1030, pltmp, 12, AUTO_INCREMENT ); - + pltmp[0] = 0x16AA6678; /* 0x1000 AGC_Ctrl1 */ + pltmp[1] = 0x9AFFA0B2; /* 0x1004 AGC_Ctrl2 */ + pltmp[2] = 0x55D00A04; /* 0x1008 AGC_Ctrl3 */ + pltmp[3] = 0xEFFF233E; /* 0x100c AGC_Ctrl4 */ + reg->BB0C = 0xEFFF233E; + pltmp[4] = 0x0FacDCC5; /* 0x1010 AGC_Ctrl5 */ + pltmp[5] = 0x00CAA333; /* 0x1014 AGC_Ctrl6 */ + pltmp[6] = 0xF2432111; /* 0x1018 AGC_Ctrl7 */ + pltmp[7] = 0x0FA3F0ED; /* 0x101c AGC_Ctrl8 */ + pltmp[8] = 0x05C43440; /* 0x1020 AGC_Ctrl9 */ + pltmp[9] = 0x00002A79; /* 0x1024 AGC_Ctrl10 */ + pltmp[10] = 0x40000528; + pltmp[11] = 0x232FDF30;/* 0x102c A_ACQ_Ctrl */ + reg->BB2C = 0x232FDF30; + Wb35Reg_BurstWrite(pHwData, 0x1000, pltmp, 12, AUTO_INCREMENT); + + pltmp[0] = 0x80002C7C; /* 0x1030 B_ACQ_Ctrl */ + pltmp[1] = 0x00C0D6C5; /* 0x1034 A_TXRX_Ctrl */ + pltmp[2] = 0x5B2C8769; /* 0x1038 B_TXRX_Ctrl */ + pltmp[3] = 0x00000000; /* 0x103c 11a TX LS filter */ + reg->BB3C = 0x00000000; + pltmp[4] = 0x00003F29; /* 0x1040 11a TX LS filter */ + pltmp[5] = 0x0EFEFBFE; /* 0x1044 11a TX LS filter */ + pltmp[6] = 0x00332C1B; /* 0x1048 11b TX RC filter */ + pltmp[7] = 0x0A00FEFF; /* 0x104c 11b TX RC filter */ + pltmp[8] = 0x2B107208; /* 0x1050 MODE_Ctrl */ + reg->BB50 = 0x2B107208; + pltmp[9] = 0; /* 0x1054 */ + reg->BB54 = 0x00000000; + pltmp[10] = 0x52524242; /* 0x1058 IQ_Alpha */ + reg->BB58 = 0x52524242; + pltmp[11] = 0xAA0AC000; /* 0x105c DC_Cancel */ + Wb35Reg_BurstWrite(pHwData, 0x1030, pltmp, 12, AUTO_INCREMENT); } -//============================================================================================================= -// BBProcessorPowerupInit -- -// -// Description: -// Initialize the Baseband processor. -// -// Arguments: -// pHwData - Handle of the USB Device. -// -// Return values: -// None. -//============================================================================================================= -void -BBProcessor_initial( phw_data_t pHwData ) +/* + * =========================================================================== + * BBProcessorPowerupInit -- + * + * Description: + * Initialize the Baseband processor. + * + * Arguments: + * pHwData - Handle of the USB Device. + * + * Return values: + * None. + *============================================================================ + */ +void BBProcessor_initial(struct hw_data *pHwData) { - PWB35REG pWb35Reg = &pHwData->Wb35Reg; + struct wb35_reg *reg = &pHwData->reg; u32 i, pltmp[12]; - switch( pHwData->phy_type ) - { - case RF_MAXIM_V1: // Initializng the Winbond 2nd BB(with Phy board (v1) + Maxim 331) - - pltmp[0] = 0x16F47E77; // 0x1000 AGC_Ctrl1 - pltmp[1] = 0x9AFFAEA4; // 0x1004 AGC_Ctrl2 - pltmp[2] = 0x55D00A04; // 0x1008 AGC_Ctrl3 - pltmp[3] = 0xEFFF1A34; // 0x100c AGC_Ctrl4 - pWb35Reg->BB0C = 0xEFFF1A34; - pltmp[4] = 0x0FABE0B7; // 0x1010 AGC_Ctrl5 - pltmp[5] = 0x00CAA332; // 0x1014 AGC_Ctrl6 - pltmp[6] = 0xF6632111; // 0x1018 AGC_Ctrl7 - pltmp[7] = 0x0FA3F0ED; // 0x101c AGC_Ctrl8 - pltmp[8] = 0x04CC3640; // 0x1020 AGC_Ctrl9 - pltmp[9] = 0x00002A79; // 0x1024 AGC_Ctrl10 - pltmp[10] = (pHwData->phy_type==3) ? 0x40000a28 : 0x40000228; // 0x1028 MAXIM_331(b31=0) + WBRF_V1(b11=1) : MAXIM_331(b31=0) + WBRF_V2(b11=0) - pltmp[11] = 0x232FDF30; // 0x102c A_ACQ_Ctrl - pWb35Reg->BB2C = 0x232FDF30; //Modify for 33's 1.0.95.xxx version, antenna 1 - Wb35Reg_BurstWrite( pHwData, 0x1000, pltmp, 12, AUTO_INCREMENT ); - - pltmp[0] = 0x00002C54; // 0x1030 B_ACQ_Ctrl - pWb35Reg->BB30 = 0x00002C54; - pltmp[1] = 0x00C0D6C5; // 0x1034 A_TXRX_Ctrl - pltmp[2] = 0x5B6C8769; // 0x1038 B_TXRX_Ctrl - pltmp[3] = 0x00000000; // 0x103c 11a TX LS filter - pWb35Reg->BB3C = 0x00000000; - pltmp[4] = 0x00003F29; // 0x1040 11a TX LS filter - pltmp[5] = 0x0EFEFBFE; // 0x1044 11a TX LS filter - pltmp[6] = 0x00453B24; // 0x1048 11b TX RC filter - pltmp[7] = 0x0E00FEFF; // 0x104c 11b TX RC filter - pltmp[8] = 0x27106208; // 0x1050 MODE_Ctrl - pWb35Reg->BB50 = 0x27106208; - pltmp[9] = 0; // 0x1054 - pWb35Reg->BB54 = 0x00000000; - pltmp[10] = 0x64646464; // 0x1058 IQ_Alpha - pWb35Reg->BB58 = 0x64646464; - pltmp[11] = 0xAA0AC000; // 0x105c DC_Cancel - Wb35Reg_BurstWrite( pHwData, 0x1030, pltmp, 12, AUTO_INCREMENT ); - - Wb35Reg_Write( pHwData, 0x1070, 0x00000045 ); - break; - - //------------------------------------------------------------------ - //[20040722 WK] - //Only for baseband version 2 -// case RF_MAXIM_317: - case RF_MAXIM_2825: - case RF_MAXIM_2827: - case RF_MAXIM_2828: - - pltmp[0] = 0x16b47e77; // 0x1000 AGC_Ctrl1 - pltmp[1] = 0x9affaea4; // 0x1004 AGC_Ctrl2 - pltmp[2] = 0x55d00a04; // 0x1008 AGC_Ctrl3 - pltmp[3] = 0xefff1a34; // 0x100c AGC_Ctrl4 - pWb35Reg->BB0C = 0xefff1a34; - pltmp[4] = 0x0fabe0b7; // 0x1010 AGC_Ctrl5 - pltmp[5] = 0x00caa332; // 0x1014 AGC_Ctrl6 - pltmp[6] = 0xf6632111; // 0x1018 AGC_Ctrl7 - pltmp[7] = 0x0FA3F0ED; // 0x101c AGC_Ctrl8 - pltmp[8] = 0x04CC3640; // 0x1020 AGC_Ctrl9 - pltmp[9] = 0x00002A79; // 0x1024 AGC_Ctrl10 - pltmp[10] = 0x40000528; // 0x40000128; Modify for 33's 1.0.95 - pltmp[11] = 0x232fdf30; // 0x102c A_ACQ_Ctrl - pWb35Reg->BB2C = 0x232fdf30; //Modify for 33's 1.0.95.xxx version, antenna 1 - Wb35Reg_BurstWrite( pHwData, 0x1000, pltmp, 12, AUTO_INCREMENT ); - - pltmp[0] = 0x00002C54; // 0x1030 B_ACQ_Ctrl - pWb35Reg->BB30 = 0x00002C54; - pltmp[1] = 0x00C0D6C5; // 0x1034 A_TXRX_Ctrl - pltmp[2] = 0x5B6C8769; // 0x1038 B_TXRX_Ctrl - pltmp[3] = 0x00000000; // 0x103c 11a TX LS filter - pWb35Reg->BB3C = 0x00000000; - pltmp[4] = 0x00003F29; // 0x1040 11a TX LS filter - pltmp[5] = 0x0EFEFBFE; // 0x1044 11a TX LS filter - pltmp[6] = 0x00453B24; // 0x1048 11b TX RC filter - pltmp[7] = 0x0D00FDFF; // 0x104c 11b TX RC filter - pltmp[8] = 0x27106208; // 0x1050 MODE_Ctrl - pWb35Reg->BB50 = 0x27106208; - pltmp[9] = 0; // 0x1054 - pWb35Reg->BB54 = 0x00000000; - pltmp[10] = 0x64646464; // 0x1058 IQ_Alpha - pWb35Reg->BB58 = 0x64646464; - pltmp[11] = 0xAA28C000; // 0x105c DC_Cancel - Wb35Reg_BurstWrite( pHwData, 0x1030, pltmp, 12, AUTO_INCREMENT ); - - Wb35Reg_Write( pHwData, 0x1070, 0x00000045 ); - break; - - case RF_MAXIM_2829: - - pltmp[0] = 0x16b47e77; // 0x1000 AGC_Ctrl1 - pltmp[1] = 0x9affaea4; // 0x1004 AGC_Ctrl2 - pltmp[2] = 0x55d00a04; // 0x1008 AGC_Ctrl3 - pltmp[3] = 0xf4ff1632; // 0xefff1a34; // 0x100c AGC_Ctrl4 Modify for 33's 1.0.95 - pWb35Reg->BB0C = 0xf4ff1632; // 0xefff1a34; Modify for 33's 1.0.95 - pltmp[4] = 0x0fabe0b7; // 0x1010 AGC_Ctrl5 - pltmp[5] = 0x00caa332; // 0x1014 AGC_Ctrl6 - pltmp[6] = 0xf8632112; // 0xf6632111; // 0x1018 AGC_Ctrl7 Modify for 33's 1.0.95 - pltmp[7] = 0x0FA3F0ED; // 0x101c AGC_Ctrl8 - pltmp[8] = 0x04CC3640; // 0x1020 AGC_Ctrl9 - pltmp[9] = 0x00002A79; // 0x1024 AGC_Ctrl10 - pltmp[10] = 0x40000528; // 0x40000128; modify for 33's 1.0.95 - pltmp[11] = 0x232fdf30; // 0x102c A_ACQ_Ctrl - pWb35Reg->BB2C = 0x232fdf30; //Modify for 33's 1.0.95.xxx version, antenna 1 - Wb35Reg_BurstWrite( pHwData, 0x1000, pltmp, 12, AUTO_INCREMENT ); - - pltmp[0] = 0x00002C54; // 0x1030 B_ACQ_Ctrl - pWb35Reg->BB30 = 0x00002C54; - pltmp[1] = 0x00C0D6C5; // 0x1034 A_TXRX_Ctrl - pltmp[2] = 0x5b2c8769; // 0x5B6C8769; // 0x1038 B_TXRX_Ctrl Modify for 33's 1.0.95 - pltmp[3] = 0x00000000; // 0x103c 11a TX LS filter - pWb35Reg->BB3C = 0x00000000; - pltmp[4] = 0x00003F29; // 0x1040 11a TX LS filter - pltmp[5] = 0x0EFEFBFE; // 0x1044 11a TX LS filter - pltmp[6] = 0x002c2617; // 0x00453B24; // 0x1048 11b TX RC filter Modify for 33's 1.0.95 - pltmp[7] = 0x0800feff; // 0x0D00FDFF; // 0x104c 11b TX RC filter Modify for 33's 1.0.95 - pltmp[8] = 0x27106208; // 0x1050 MODE_Ctrl - pWb35Reg->BB50 = 0x27106208; - pltmp[9] = 0; // 0x1054 - pWb35Reg->BB54 = 0x00000000; - pltmp[10] = 0x64644a4a; // 0x64646464; // 0x1058 IQ_Alpha Modify for 33's 1.0.95 - pWb35Reg->BB58 = 0x64646464; - pltmp[11] = 0xAA28C000; // 0x105c DC_Cancel - Wb35Reg_BurstWrite( pHwData, 0x1030, pltmp, 12, AUTO_INCREMENT ); - - Wb35Reg_Write( pHwData, 0x1070, 0x00000045 ); - break; - - case RF_AIROHA_2230: - - pltmp[0] = 0X16764A77; // 0x1000 AGC_Ctrl1 //0x16765A77 - pltmp[1] = 0x9affafb2; // 0x1004 AGC_Ctrl2 - pltmp[2] = 0x55d00a04; // 0x1008 AGC_Ctrl3 - pltmp[3] = 0xFFFd203c; // 0xFFFb203a; // 0x100c AGC_Ctrl4 Modify for 33's 1.0.95.xxx version - pWb35Reg->BB0C = 0xFFFd203c; - pltmp[4] = 0X0FBFDCc5; // 0X0FBFDCA0; // 0x1010 AGC_Ctrl5 //0x0FB2E0B7 Modify for 33's 1.0.95.xxx version - pltmp[5] = 0x00caa332; // 0x00caa333; // 0x1014 AGC_Ctrl6 Modify for 33's 1.0.95.xxx version - pltmp[6] = 0XF6632111; // 0XF1632112; // 0x1018 AGC_Ctrl7 //0xf6632112 Modify for 33's 1.0.95.xxx version - pltmp[7] = 0x0FA3F0ED; // 0x101c AGC_Ctrl8 - pltmp[8] = 0x04C43640; // 0x1020 AGC_Ctrl9 - pltmp[9] = 0x00002A79; // 0x1024 AGC_Ctrl10 - pltmp[10] = 0X40000528; //0x40000228 - pltmp[11] = 0x232dfF30; // 0x232A9F30; // 0x102c A_ACQ_Ctrl //0x232a9730 - pWb35Reg->BB2C = 0x232dfF30; //Modify for 33's 1.0.95.xxx version, antenna 1 - Wb35Reg_BurstWrite( pHwData, 0x1000, pltmp, 12, AUTO_INCREMENT ); - - pltmp[0] = 0x00002C54; // 0x1030 B_ACQ_Ctrl - pWb35Reg->BB30 = 0x00002C54; - pltmp[1] = 0x00C0D6C5; // 0x1034 A_TXRX_Ctrl - pltmp[2] = 0x5B2C8769; // 0x1038 B_TXRX_Ctrl //0x5B6C8769 - pltmp[3] = 0x00000000; // 0x103c 11a TX LS filter - pWb35Reg->BB3C = 0x00000000; - pltmp[4] = 0x00003F29; // 0x1040 11a TX LS filter - pltmp[5] = 0x0EFEFBFE; // 0x1044 11a TX LS filter - pltmp[6] = BB48_DEFAULT_AL2230_11G; // 0x1048 11b TX RC filter 20060613.2 - pWb35Reg->BB48 = BB48_DEFAULT_AL2230_11G; // 20051221 ch14 20060613.2 - pltmp[7] = BB4C_DEFAULT_AL2230_11G; // 0x104c 11b TX RC filter 20060613.2 - pWb35Reg->BB4C = BB4C_DEFAULT_AL2230_11G; // 20060613.1 20060613.2 - pltmp[8] = 0x27106200; // 0x1050 MODE_Ctrl - pWb35Reg->BB50 = 0x27106200; - pltmp[9] = 0; // 0x1054 - pWb35Reg->BB54 = 0x00000000; - pltmp[10] = 0x52524242; // 0x1058 IQ_Alpha - pWb35Reg->BB58 = 0x52524242; - pltmp[11] = 0xAA0AC000; // 0x105c DC_Cancel - Wb35Reg_BurstWrite( pHwData, 0x1030, pltmp, 12, AUTO_INCREMENT ); - - Wb35Reg_Write( pHwData, 0x1070, 0x00000045 ); - break; + switch (pHwData->phy_type) { + case RF_MAXIM_V1: /* Initializng the Winbond 2nd BB(with Phy board (v1) + Maxim 331) */ + pltmp[0] = 0x16F47E77; /* 0x1000 AGC_Ctrl1 */ + pltmp[1] = 0x9AFFAEA4; /* 0x1004 AGC_Ctrl2 */ + pltmp[2] = 0x55D00A04; /* 0x1008 AGC_Ctrl3 */ + pltmp[3] = 0xEFFF1A34; /* 0x100c AGC_Ctrl4 */ + reg->BB0C = 0xEFFF1A34; + pltmp[4] = 0x0FABE0B7; /* 0x1010 AGC_Ctrl5 */ + pltmp[5] = 0x00CAA332; /* 0x1014 AGC_Ctrl6 */ + pltmp[6] = 0xF6632111; /* 0x1018 AGC_Ctrl7 */ + pltmp[7] = 0x0FA3F0ED; /* 0x101c AGC_Ctrl8 */ + pltmp[8] = 0x04CC3640; /* 0x1020 AGC_Ctrl9 */ + pltmp[9] = 0x00002A79; /* 0x1024 AGC_Ctrl10 */ + pltmp[10] = (pHwData->phy_type == 3) ? 0x40000a28 : 0x40000228; /* 0x1028 MAXIM_331(b31=0) + WBRF_V1(b11=1) : MAXIM_331(b31=0) + WBRF_V2(b11=0) */ + pltmp[11] = 0x232FDF30; /* 0x102c A_ACQ_Ctrl */ + reg->BB2C = 0x232FDF30; /* Modify for 33's 1.0.95.xxx version, antenna 1 */ + Wb35Reg_BurstWrite(pHwData, 0x1000, pltmp, 12, AUTO_INCREMENT); + + pltmp[0] = 0x00002C54; /* 0x1030 B_ACQ_Ctrl */ + reg->BB30 = 0x00002C54; + pltmp[1] = 0x00C0D6C5; /* 0x1034 A_TXRX_Ctrl */ + pltmp[2] = 0x5B6C8769; /* 0x1038 B_TXRX_Ctrl */ + pltmp[3] = 0x00000000; /* 0x103c 11a TX LS filter */ + reg->BB3C = 0x00000000; + pltmp[4] = 0x00003F29; /* 0x1040 11a TX LS filter */ + pltmp[5] = 0x0EFEFBFE; /* 0x1044 11a TX LS filter */ + pltmp[6] = 0x00453B24; /* 0x1048 11b TX RC filter */ + pltmp[7] = 0x0E00FEFF; /* 0x104c 11b TX RC filter */ + pltmp[8] = 0x27106208; /* 0x1050 MODE_Ctrl */ + reg->BB50 = 0x27106208; + pltmp[9] = 0; /* 0x1054 */ + reg->BB54 = 0x00000000; + pltmp[10] = 0x64646464; /* 0x1058 IQ_Alpha */ + reg->BB58 = 0x64646464; + pltmp[11] = 0xAA0AC000; /* 0x105c DC_Cancel */ + Wb35Reg_BurstWrite(pHwData, 0x1030, pltmp, 12, AUTO_INCREMENT); + + Wb35Reg_Write(pHwData, 0x1070, 0x00000045); + break; - case RF_AIROHA_2230S: // 20060420 Add this - - pltmp[0] = 0X16764A77; // 0x1000 AGC_Ctrl1 //0x16765A77 - pltmp[1] = 0x9affafb2; // 0x1004 AGC_Ctrl2 - pltmp[2] = 0x55d00a04; // 0x1008 AGC_Ctrl3 - pltmp[3] = 0xFFFd203c; // 0xFFFb203a; // 0x100c AGC_Ctrl4 Modify for 33's 1.0.95.xxx version - pWb35Reg->BB0C = 0xFFFd203c; - pltmp[4] = 0X0FBFDCc5; // 0X0FBFDCA0; // 0x1010 AGC_Ctrl5 //0x0FB2E0B7 Modify for 33's 1.0.95.xxx version - pltmp[5] = 0x00caa332; // 0x00caa333; // 0x1014 AGC_Ctrl6 Modify for 33's 1.0.95.xxx version - pltmp[6] = 0XF6632111; // 0XF1632112; // 0x1018 AGC_Ctrl7 //0xf6632112 Modify for 33's 1.0.95.xxx version - pltmp[7] = 0x0FA3F0ED; // 0x101c AGC_Ctrl8 - pltmp[8] = 0x04C43640; // 0x1020 AGC_Ctrl9 - pltmp[9] = 0x00002A79; // 0x1024 AGC_Ctrl10 - pltmp[10] = 0X40000528; //0x40000228 - pltmp[11] = 0x232dfF30; // 0x232A9F30; // 0x102c A_ACQ_Ctrl //0x232a9730 - pWb35Reg->BB2C = 0x232dfF30; //Modify for 33's 1.0.95.xxx version, antenna 1 - Wb35Reg_BurstWrite( pHwData, 0x1000, pltmp, 12, AUTO_INCREMENT ); - - pltmp[0] = 0x00002C54; // 0x1030 B_ACQ_Ctrl - pWb35Reg->BB30 = 0x00002C54; - pltmp[1] = 0x00C0D6C5; // 0x1034 A_TXRX_Ctrl - pltmp[2] = 0x5B2C8769; // 0x1038 B_TXRX_Ctrl //0x5B6C8769 - pltmp[3] = 0x00000000; // 0x103c 11a TX LS filter - pWb35Reg->BB3C = 0x00000000; - pltmp[4] = 0x00003F29; // 0x1040 11a TX LS filter - pltmp[5] = 0x0EFEFBFE; // 0x1044 11a TX LS filter - pltmp[6] = BB48_DEFAULT_AL2230_11G; // 0x1048 11b TX RC filter 20060613.2 - pWb35Reg->BB48 = BB48_DEFAULT_AL2230_11G; // 20051221 ch14 20060613.2 - pltmp[7] = BB4C_DEFAULT_AL2230_11G; // 0x104c 11b TX RC filter 20060613.2 - pWb35Reg->BB4C = BB4C_DEFAULT_AL2230_11G; // 20060613.1 - pltmp[8] = 0x27106200; // 0x1050 MODE_Ctrl - pWb35Reg->BB50 = 0x27106200; - pltmp[9] = 0; // 0x1054 - pWb35Reg->BB54 = 0x00000000; - pltmp[10] = 0x52523232; // 20060419 0x52524242; // 0x1058 IQ_Alpha - pWb35Reg->BB58 = 0x52523232; // 20060419 0x52524242; - pltmp[11] = 0xAA0AC000; // 0x105c DC_Cancel - Wb35Reg_BurstWrite( pHwData, 0x1030, pltmp, 12, AUTO_INCREMENT ); - - Wb35Reg_Write( pHwData, 0x1070, 0x00000045 ); - break; + case RF_MAXIM_2825: + case RF_MAXIM_2827: + case RF_MAXIM_2828: + pltmp[0] = 0x16b47e77; /* 0x1000 AGC_Ctrl1 */ + pltmp[1] = 0x9affaea4; /* 0x1004 AGC_Ctrl2 */ + pltmp[2] = 0x55d00a04; /* 0x1008 AGC_Ctrl3 */ + pltmp[3] = 0xefff1a34; /* 0x100c AGC_Ctrl4 */ + reg->BB0C = 0xefff1a34; + pltmp[4] = 0x0fabe0b7; /* 0x1010 AGC_Ctrl5 */ + pltmp[5] = 0x00caa332; /* 0x1014 AGC_Ctrl6 */ + pltmp[6] = 0xf6632111; /* 0x1018 AGC_Ctrl7 */ + pltmp[7] = 0x0FA3F0ED; /* 0x101c AGC_Ctrl8 */ + pltmp[8] = 0x04CC3640; /* 0x1020 AGC_Ctrl9 */ + pltmp[9] = 0x00002A79; /* 0x1024 AGC_Ctrl10 */ + pltmp[10] = 0x40000528; + pltmp[11] = 0x232fdf30; /* 0x102c A_ACQ_Ctrl */ + reg->BB2C = 0x232fdf30; /* antenna 1 */ + Wb35Reg_BurstWrite(pHwData, 0x1000, pltmp, 12, AUTO_INCREMENT); + + pltmp[0] = 0x00002C54; /* 0x1030 B_ACQ_Ctrl */ + reg->BB30 = 0x00002C54; + pltmp[1] = 0x00C0D6C5; /* 0x1034 A_TXRX_Ctrl */ + pltmp[2] = 0x5B6C8769; /* 0x1038 B_TXRX_Ctrl */ + pltmp[3] = 0x00000000; /* 0x103c 11a TX LS filter */ + reg->BB3C = 0x00000000; + pltmp[4] = 0x00003F29; /* 0x1040 11a TX LS filter */ + pltmp[5] = 0x0EFEFBFE; /* 0x1044 11a TX LS filter */ + pltmp[6] = 0x00453B24; /* 0x1048 11b TX RC filter */ + pltmp[7] = 0x0D00FDFF; /* 0x104c 11b TX RC filter */ + pltmp[8] = 0x27106208; /* 0x1050 MODE_Ctrl */ + reg->BB50 = 0x27106208; + pltmp[9] = 0; /* 0x1054 */ + reg->BB54 = 0x00000000; + pltmp[10] = 0x64646464; /* 0x1058 IQ_Alpha */ + reg->BB58 = 0x64646464; + pltmp[11] = 0xAA28C000; /* 0x105c DC_Cancel */ + Wb35Reg_BurstWrite(pHwData, 0x1030, pltmp, 12, AUTO_INCREMENT); + + Wb35Reg_Write(pHwData, 0x1070, 0x00000045); + break; - case RF_AIROHA_7230: -/* - pltmp[0] = 0x16a84a77; // 0x1000 AGC_Ctrl1 - pltmp[1] = 0x9affafb2; // 0x1004 AGC_Ctrl2 - pltmp[2] = 0x55d00a04; // 0x1008 AGC_Ctrl3 - pltmp[3] = 0xFFFb203a; // 0x100c AGC_Ctrl4 - pWb35Reg->BB0c = 0xFFFb203a; - pltmp[4] = 0x0FBFDCB7; // 0x1010 AGC_Ctrl5 - pltmp[5] = 0x00caa333; // 0x1014 AGC_Ctrl6 - pltmp[6] = 0xf6632112; // 0x1018 AGC_Ctrl7 - pltmp[7] = 0x0FA3F0ED; // 0x101c AGC_Ctrl8 - pltmp[8] = 0x04C43640; // 0x1020 AGC_Ctrl9 - pltmp[9] = 0x00002A79; // 0x1024 AGC_Ctrl10 - pltmp[10] = 0x40000228; - pltmp[11] = 0x232A9F30;// 0x102c A_ACQ_Ctrl - pWb35Reg->BB2c = 0x232A9F30; - Wb35Reg_BurstWrite( pHwData, 0x1000, pltmp, 12, AUTO_INCREMENT ); - - pltmp[0] = 0x00002C54; // 0x1030 B_ACQ_Ctrl - pWb35Reg->BB30 = 0x00002C54; - pltmp[1] = 0x00C0D6C5; // 0x1034 A_TXRX_Ctrl - pltmp[2] = 0x5B2C8769; // 0x1038 B_TXRX_Ctrl - pltmp[3] = 0x00000000; // 0x103c 11a TX LS filter - pWb35Reg->BB3c = 0x00000000; - pltmp[4] = 0x00003F29; // 0x1040 11a TX LS filter - pltmp[5] = 0x0EFEFBFE; // 0x1044 11a TX LS filter - pltmp[6] = 0x00453B24; // 0x1048 11b TX RC filter - pltmp[7] = 0x0E00FEFF; // 0x104c 11b TX RC filter - pltmp[8] = 0x27106200; // 0x1050 MODE_Ctrl - pWb35Reg->BB50 = 0x27106200; - pltmp[9] = 0; // 0x1054 - pWb35Reg->BB54 = 0x00000000; - pltmp[10] = 0x64645252; // 0x1058 IQ_Alpha - pWb35Reg->BB58 = 0x64645252; - pltmp[11] = 0xAA0AC000; // 0x105c DC_Cancel - Wb35Reg_BurstWrite( pHwData, 0x1030, pltmp, 12, AUTO_INCREMENT ); -*/ - BBProcessor_AL7230_2400( pHwData ); - - Wb35Reg_Write( pHwData, 0x1070, 0x00000045 ); - break; + case RF_MAXIM_2829: + pltmp[0] = 0x16b47e77; /* 0x1000 AGC_Ctrl1 */ + pltmp[1] = 0x9affaea4; /* 0x1004 AGC_Ctrl2 */ + pltmp[2] = 0x55d00a04; /* 0x1008 AGC_Ctrl3 */ + pltmp[3] = 0xf4ff1632; /* 0x100c AGC_Ctrl4 */ + reg->BB0C = 0xf4ff1632; + pltmp[4] = 0x0fabe0b7; /* 0x1010 AGC_Ctrl5 */ + pltmp[5] = 0x00caa332; /* 0x1014 AGC_Ctrl6 */ + pltmp[6] = 0xf8632112; /* 0x1018 AGC_Ctrl7 */ + pltmp[7] = 0x0FA3F0ED; /* 0x101c AGC_Ctrl8 */ + pltmp[8] = 0x04CC3640; /* 0x1020 AGC_Ctrl9 */ + pltmp[9] = 0x00002A79; /* 0x1024 AGC_Ctrl10 */ + pltmp[10] = 0x40000528; + pltmp[11] = 0x232fdf30; /* 0x102c A_ACQ_Ctrl */ + reg->BB2C = 0x232fdf30; /* antenna 1 */ + Wb35Reg_BurstWrite(pHwData, 0x1000, pltmp, 12, AUTO_INCREMENT); + + pltmp[0] = 0x00002C54; /* 0x1030 B_ACQ_Ctrl */ + reg->BB30 = 0x00002C54; + pltmp[1] = 0x00C0D6C5; /* 0x1034 A_TXRX_Ctrl */ + pltmp[2] = 0x5b2c8769; /* 0x1038 B_TXRX_Ctrl */ + pltmp[3] = 0x00000000; /* 0x103c 11a TX LS filter */ + reg->BB3C = 0x00000000; + pltmp[4] = 0x00003F29; /* 0x1040 11a TX LS filter */ + pltmp[5] = 0x0EFEFBFE; /* 0x1044 11a TX LS filter */ + pltmp[6] = 0x002c2617; /* 0x1048 11b TX RC filter */ + pltmp[7] = 0x0800feff; /* 0x104c 11b TX RC filter */ + pltmp[8] = 0x27106208; /* 0x1050 MODE_Ctrl */ + reg->BB50 = 0x27106208; + pltmp[9] = 0; /* 0x1054 */ + reg->BB54 = 0x00000000; + pltmp[10] = 0x64644a4a; /* 0x1058 IQ_Alpha */ + reg->BB58 = 0x64646464; + pltmp[11] = 0xAA28C000; /* 0x105c DC_Cancel */ + Wb35Reg_BurstWrite(pHwData, 0x1030, pltmp, 12, AUTO_INCREMENT); + Wb35Reg_Write(pHwData, 0x1070, 0x00000045); + break; + case RF_AIROHA_2230: + pltmp[0] = 0X16764A77; /* 0x1000 AGC_Ctrl1 */ + pltmp[1] = 0x9affafb2; /* 0x1004 AGC_Ctrl2 */ + pltmp[2] = 0x55d00a04; /* 0x1008 AGC_Ctrl3 */ + pltmp[3] = 0xFFFd203c; /* 0x100c AGC_Ctrl4 */ + reg->BB0C = 0xFFFd203c; + pltmp[4] = 0X0FBFDCc5; /* 0x1010 AGC_Ctrl5 */ + pltmp[5] = 0x00caa332; /* 0x1014 AGC_Ctrl6 */ + pltmp[6] = 0XF6632111; /* 0x1018 AGC_Ctrl7 */ + pltmp[7] = 0x0FA3F0ED; /* 0x101c AGC_Ctrl8 */ + pltmp[8] = 0x04C43640; /* 0x1020 AGC_Ctrl9 */ + pltmp[9] = 0x00002A79; /* 0x1024 AGC_Ctrl10 */ + pltmp[10] = 0X40000528; + pltmp[11] = 0x232dfF30; /* 0x102c A_ACQ_Ctrl */ + reg->BB2C = 0x232dfF30; /* antenna 1 */ + Wb35Reg_BurstWrite(pHwData, 0x1000, pltmp, 12, AUTO_INCREMENT); + + pltmp[0] = 0x00002C54; /* 0x1030 B_ACQ_Ctrl */ + reg->BB30 = 0x00002C54; + pltmp[1] = 0x00C0D6C5; /* 0x1034 A_TXRX_Ctrl */ + pltmp[2] = 0x5B2C8769; /* 0x1038 B_TXRX_Ctrl */ + pltmp[3] = 0x00000000; /* 0x103c 11a TX LS filter */ + reg->BB3C = 0x00000000; + pltmp[4] = 0x00003F29; /* 0x1040 11a TX LS filter */ + pltmp[5] = 0x0EFEFBFE; /* 0x1044 11a TX LS filter */ + pltmp[6] = BB48_DEFAULT_AL2230_11G; /* 0x1048 11b TX RC filter */ + reg->BB48 = BB48_DEFAULT_AL2230_11G; /* 20051221 ch14 */ + pltmp[7] = BB4C_DEFAULT_AL2230_11G; /* 0x104c 11b TX RC filter */ + reg->BB4C = BB4C_DEFAULT_AL2230_11G; + pltmp[8] = 0x27106200; /* 0x1050 MODE_Ctrl */ + reg->BB50 = 0x27106200; + pltmp[9] = 0; /* 0x1054 */ + reg->BB54 = 0x00000000; + pltmp[10] = 0x52524242; /* 0x1058 IQ_Alpha */ + reg->BB58 = 0x52524242; + pltmp[11] = 0xAA0AC000; /* 0x105c DC_Cancel */ + Wb35Reg_BurstWrite(pHwData, 0x1030, pltmp, 12, AUTO_INCREMENT); + + Wb35Reg_Write(pHwData, 0x1070, 0x00000045); + break; + case RF_AIROHA_2230S: + pltmp[0] = 0X16764A77; /* 0x1000 AGC_Ctrl1 */ + pltmp[1] = 0x9affafb2; /* 0x1004 AGC_Ctrl2 */ + pltmp[2] = 0x55d00a04; /* 0x1008 AGC_Ctrl3 */ + pltmp[3] = 0xFFFd203c; /* 0x100c AGC_Ctrl4 */ + reg->BB0C = 0xFFFd203c; + pltmp[4] = 0X0FBFDCc5; /* 0x1010 AGC_Ctrl5 */ + pltmp[5] = 0x00caa332; /* 0x1014 AGC_Ctrl6 */ + pltmp[6] = 0XF6632111; /* 0x1018 AGC_Ctrl7 */ + pltmp[7] = 0x0FA3F0ED; /* 0x101c AGC_Ctrl8 */ + pltmp[8] = 0x04C43640; /* 0x1020 AGC_Ctrl9 */ + pltmp[9] = 0x00002A79; /* 0x1024 AGC_Ctrl10 */ + pltmp[10] = 0X40000528; + pltmp[11] = 0x232dfF30; /* 0x102c A_ACQ_Ctrl */ + reg->BB2C = 0x232dfF30; /* antenna 1 */ + Wb35Reg_BurstWrite(pHwData, 0x1000, pltmp, 12, AUTO_INCREMENT); + + pltmp[0] = 0x00002C54; /* 0x1030 B_ACQ_Ctrl */ + reg->BB30 = 0x00002C54; + pltmp[1] = 0x00C0D6C5; /* 0x1034 A_TXRX_Ctrl */ + pltmp[2] = 0x5B2C8769; /* 0x1038 B_TXRX_Ctrl */ + pltmp[3] = 0x00000000; /* 0x103c 11a TX LS filter */ + reg->BB3C = 0x00000000; + pltmp[4] = 0x00003F29; /* 0x1040 11a TX LS filter */ + pltmp[5] = 0x0EFEFBFE; /* 0x1044 11a TX LS filter */ + pltmp[6] = BB48_DEFAULT_AL2230_11G; /* 0x1048 11b TX RC filter */ + reg->BB48 = BB48_DEFAULT_AL2230_11G; /* ch14 */ + pltmp[7] = BB4C_DEFAULT_AL2230_11G; /* 0x104c 11b TX RC filter */ + reg->BB4C = BB4C_DEFAULT_AL2230_11G; + pltmp[8] = 0x27106200; /* 0x1050 MODE_Ctrl */ + reg->BB50 = 0x27106200; + pltmp[9] = 0; /* 0x1054 */ + reg->BB54 = 0x00000000; + pltmp[10] = 0x52523232; /* 0x1058 IQ_Alpha */ + reg->BB58 = 0x52523232; + pltmp[11] = 0xAA0AC000; /* 0x105c DC_Cancel */ + Wb35Reg_BurstWrite(pHwData, 0x1030, pltmp, 12, AUTO_INCREMENT); + + Wb35Reg_Write(pHwData, 0x1070, 0x00000045); + break; + case RF_AIROHA_7230: + BBProcessor_AL7230_2400(pHwData); - case RF_WB_242: - case RF_WB_242_1: // 20060619.5 Add - - pltmp[0] = 0x16A8525D; // 0x1000 AGC_Ctrl1 - pltmp[1] = 0x9AFF9ABA; // 0x1004 AGC_Ctrl2 - pltmp[2] = 0x55D00A04; // 0x1008 AGC_Ctrl3 - pltmp[3] = 0xEEE91C32; // 0x100c AGC_Ctrl4 - pWb35Reg->BB0C = 0xEEE91C32; - pltmp[4] = 0x0FACDCC5; // 0x1010 AGC_Ctrl5 - pltmp[5] = 0x000AA344; // 0x1014 AGC_Ctrl6 - pltmp[6] = 0x22222221; // 0x1018 AGC_Ctrl7 - pltmp[7] = 0x0FA3F0ED; // 0x101c AGC_Ctrl8 - pltmp[8] = 0x04CC3440; // 20051018 0x03CB3440; // 0x1020 AGC_Ctrl9 20051014 0x03C33440 - pltmp[9] = 0xA9002A79; // 0x1024 AGC_Ctrl10 - pltmp[10] = 0x40000528; // 0x1028 - pltmp[11] = 0x23457F30; // 0x102c A_ACQ_Ctrl - pWb35Reg->BB2C = 0x23457F30; - Wb35Reg_BurstWrite( pHwData, 0x1000, pltmp, 12, AUTO_INCREMENT ); - - pltmp[0] = 0x00002C54; // 0x1030 B_ACQ_Ctrl - pWb35Reg->BB30 = 0x00002C54; - pltmp[1] = 0x00C0D6C5; // 0x1034 A_TXRX_Ctrl - pltmp[2] = 0x5B2C8769; // 0x1038 B_TXRX_Ctrl - pltmp[3] = pHwData->BB3c_cal; // 0x103c 11a TX LS filter - pWb35Reg->BB3C = pHwData->BB3c_cal; - pltmp[4] = 0x00003F29; // 0x1040 11a TX LS filter - pltmp[5] = 0x0EFEFBFE; // 0x1044 11a TX LS filter - pltmp[6] = BB48_DEFAULT_WB242_11G; // 0x1048 11b TX RC filter 20060613.2 - pWb35Reg->BB48 = BB48_DEFAULT_WB242_11G; // 20060613.1 20060613.2 - pltmp[7] = BB4C_DEFAULT_WB242_11G; // 0x104c 11b TX RC filter 20060613.2 - pWb35Reg->BB4C = BB4C_DEFAULT_WB242_11G; // 20060613.1 20060613.2 - pltmp[8] = 0x27106208; // 0x1050 MODE_Ctrl - pWb35Reg->BB50 = 0x27106208; - pltmp[9] = pHwData->BB54_cal; // 0x1054 - pWb35Reg->BB54 = pHwData->BB54_cal; - pltmp[10] = 0x52523131; // 0x1058 IQ_Alpha - pWb35Reg->BB58 = 0x52523131; - pltmp[11] = 0xAA0AC000; // 20060825 0xAA2AC000; // 0x105c DC_Cancel - Wb35Reg_BurstWrite( pHwData, 0x1030, pltmp, 12, AUTO_INCREMENT ); - - Wb35Reg_Write( pHwData, 0x1070, 0x00000045 ); - break; - } + Wb35Reg_Write(pHwData, 0x1070, 0x00000045); + break; + case RF_WB_242: + case RF_WB_242_1: + pltmp[0] = 0x16A8525D; /* 0x1000 AGC_Ctrl1 */ + pltmp[1] = 0x9AFF9ABA; /* 0x1004 AGC_Ctrl2 */ + pltmp[2] = 0x55D00A04; /* 0x1008 AGC_Ctrl3 */ + pltmp[3] = 0xEEE91C32; /* 0x100c AGC_Ctrl4 */ + reg->BB0C = 0xEEE91C32; + pltmp[4] = 0x0FACDCC5; /* 0x1010 AGC_Ctrl5 */ + pltmp[5] = 0x000AA344; /* 0x1014 AGC_Ctrl6 */ + pltmp[6] = 0x22222221; /* 0x1018 AGC_Ctrl7 */ + pltmp[7] = 0x0FA3F0ED; /* 0x101c AGC_Ctrl8 */ + pltmp[8] = 0x04CC3440; /* 0x1020 AGC_Ctrl9 */ + pltmp[9] = 0xA9002A79; /* 0x1024 AGC_Ctrl10 */ + pltmp[10] = 0x40000528; /* 0x1028 */ + pltmp[11] = 0x23457F30; /* 0x102c A_ACQ_Ctrl */ + reg->BB2C = 0x23457F30; + Wb35Reg_BurstWrite(pHwData, 0x1000, pltmp, 12, AUTO_INCREMENT); + + pltmp[0] = 0x00002C54; /* 0x1030 B_ACQ_Ctrl */ + reg->BB30 = 0x00002C54; + pltmp[1] = 0x00C0D6C5; /* 0x1034 A_TXRX_Ctrl */ + pltmp[2] = 0x5B2C8769; /* 0x1038 B_TXRX_Ctrl */ + pltmp[3] = pHwData->BB3c_cal; /* 0x103c 11a TX LS filter */ + reg->BB3C = pHwData->BB3c_cal; + pltmp[4] = 0x00003F29; /* 0x1040 11a TX LS filter */ + pltmp[5] = 0x0EFEFBFE; /* 0x1044 11a TX LS filter */ + pltmp[6] = BB48_DEFAULT_WB242_11G; /* 0x1048 11b TX RC filter */ + reg->BB48 = BB48_DEFAULT_WB242_11G; + pltmp[7] = BB4C_DEFAULT_WB242_11G; /* 0x104c 11b TX RC filter */ + reg->BB4C = BB4C_DEFAULT_WB242_11G; + pltmp[8] = 0x27106208; /* 0x1050 MODE_Ctrl */ + reg->BB50 = 0x27106208; + pltmp[9] = pHwData->BB54_cal; /* 0x1054 */ + reg->BB54 = pHwData->BB54_cal; + pltmp[10] = 0x52523131; /* 0x1058 IQ_Alpha */ + reg->BB58 = 0x52523131; + pltmp[11] = 0xAA0AC000; /* 0x105c DC_Cancel */ + Wb35Reg_BurstWrite(pHwData, 0x1030, pltmp, 12, AUTO_INCREMENT); + + Wb35Reg_Write(pHwData, 0x1070, 0x00000045); + break; + } - // Fill the LNA table - pWb35Reg->LNAValue[0] = (u8)(pWb35Reg->BB0C & 0xff); - pWb35Reg->LNAValue[1] = 0; - pWb35Reg->LNAValue[2] = (u8)((pWb35Reg->BB0C & 0xff00)>>8); - pWb35Reg->LNAValue[3] = 0; + /* Fill the LNA table */ + reg->LNAValue[0] = (u8) (reg->BB0C & 0xff); + reg->LNAValue[1] = 0; + reg->LNAValue[2] = (u8) ((reg->BB0C & 0xff00) >> 8); + reg->LNAValue[3] = 0; - // Fill SQ3 table - for( i=0; i<MAX_SQ3_FILTER_SIZE; i++ ) - pWb35Reg->SQ3_filter[i] = 0x2f; // half of Bit 0 ~ 6 + /* Fill SQ3 table */ + for (i = 0; i < MAX_SQ3_FILTER_SIZE; i++) + reg->SQ3_filter[i] = 0x2f; /* half of Bit 0 ~ 6 */ } -void set_tx_power_per_channel_max2829( phw_data_t pHwData, ChanInfo Channel) +static inline void set_tx_power_per_channel_max2829(struct hw_data *pHwData, + struct chan_info Channel) { - RFSynthesizer_SetPowerIndex( pHwData, 100 ); // 20060620.1 Modify + RFSynthesizer_SetPowerIndex(pHwData, 100); } -void set_tx_power_per_channel_al2230( phw_data_t pHwData, ChanInfo Channel ) +static void set_tx_power_per_channel_al2230(struct hw_data *pHwData, + struct chan_info Channel) { u8 index = 100; - - if (pHwData->TxVgaFor24[Channel.ChanNo - 1] != 0xff) // 20060620.1 Add + if (pHwData->TxVgaFor24[Channel.ChanNo - 1] != 0xff) index = pHwData->TxVgaFor24[Channel.ChanNo - 1]; - RFSynthesizer_SetPowerIndex( pHwData, index ); + RFSynthesizer_SetPowerIndex(pHwData, index); } -void set_tx_power_per_channel_al7230( phw_data_t pHwData, ChanInfo Channel) +static void set_tx_power_per_channel_al7230(struct hw_data *pHwData, + struct chan_info Channel) { u8 i, index = 100; - switch ( Channel.band ) - { - case BAND_TYPE_DSSS: - case BAND_TYPE_OFDM_24: - { - if (pHwData->TxVgaFor24[Channel.ChanNo - 1] != 0xff) - index = pHwData->TxVgaFor24[Channel.ChanNo - 1]; - } - break; - case BAND_TYPE_OFDM_5: - { - for (i =0; i<35; i++) - { - if (Channel.ChanNo == pHwData->TxVgaFor50[i].ChanNo) - { - if (pHwData->TxVgaFor50[i].TxVgaValue != 0xff) - index = pHwData->TxVgaFor50[i].TxVgaValue; - break; - } - } + switch (Channel.band) { + case BAND_TYPE_DSSS: + case BAND_TYPE_OFDM_24: + if (pHwData->TxVgaFor24[Channel.ChanNo - 1] != 0xff) + index = pHwData->TxVgaFor24[Channel.ChanNo - 1]; + break; + case BAND_TYPE_OFDM_5: + for (i = 0; i < 35; i++) { + if (Channel.ChanNo == pHwData->TxVgaFor50[i].ChanNo) { + if (pHwData->TxVgaFor50[i].TxVgaValue != 0xff) + index = pHwData->TxVgaFor50[i].TxVgaValue; + break; } - break; + } + break; } - RFSynthesizer_SetPowerIndex( pHwData, index ); + RFSynthesizer_SetPowerIndex(pHwData, index); } -void set_tx_power_per_channel_wb242( phw_data_t pHwData, ChanInfo Channel) +static void set_tx_power_per_channel_wb242(struct hw_data *pHwData, + struct chan_info Channel) { u8 index = 100; - switch ( Channel.band ) - { - case BAND_TYPE_DSSS: - case BAND_TYPE_OFDM_24: - { - if (pHwData->TxVgaFor24[Channel.ChanNo - 1] != 0xff) - index = pHwData->TxVgaFor24[Channel.ChanNo - 1]; - } - break; - case BAND_TYPE_OFDM_5: - break; + switch (Channel.band) { + case BAND_TYPE_DSSS: + case BAND_TYPE_OFDM_24: + if (pHwData->TxVgaFor24[Channel.ChanNo - 1] != 0xff) + index = pHwData->TxVgaFor24[Channel.ChanNo - 1]; + break; + case BAND_TYPE_OFDM_5: + break; } - RFSynthesizer_SetPowerIndex( pHwData, index ); + RFSynthesizer_SetPowerIndex(pHwData, index); } -//============================================================================================================= -// RFSynthesizer_SwitchingChannel -- -// -// Description: -// Swithch the RF channel. -// -// Arguments: -// pHwData - Handle of the USB Device. -// Channel - The channel no. -// -// Return values: -// None. -//============================================================================================================= -void -RFSynthesizer_SwitchingChannel( phw_data_t pHwData, ChanInfo Channel ) +/* + * ========================================================================== + * RFSynthesizer_SwitchingChannel -- + * + * Description: + * Swithch the RF channel. + * + * Arguments: + * pHwData - Handle of the USB Device. + * Channel - The channel no. + * + * Return values: + * None. + * =========================================================================== + */ +void RFSynthesizer_SwitchingChannel(struct hw_data *pHwData, struct chan_info Channel) { - PWB35REG pWb35Reg = &pHwData->Wb35Reg; - u32 pltmp[16]; // The 16 is the maximum capability of hardware + struct wb35_reg *reg = &pHwData->reg; + u32 pltmp[16]; /* The 16 is the maximum capability of hardware */ u32 count, ltmp; u8 i, j, number; u8 ChnlTmp; - switch( pHwData->phy_type ) - { - case RF_MAXIM_2825: - case RF_MAXIM_V1: // 11g Winbond 2nd BB(with Phy board (v1) + Maxim 331) - - if( Channel.band <= BAND_TYPE_OFDM_24 ) // channel 1 ~ 13 - { - for( i=0; i<3; i++ ) - pltmp[i] = (1 << 31) | (0 << 30) | (18 << 24) | BitReverse( max2825_channel_data_24[Channel.ChanNo-1][i], 18); - Wb35Reg_BurstWrite( pHwData, 0x0864, pltmp, 3, NO_INCREMENT ); - } - RFSynthesizer_SetPowerIndex( pHwData, 100 ); - break; - - case RF_MAXIM_2827: - - if( Channel.band <= BAND_TYPE_OFDM_24 ) // channel 1 ~ 13 - { - for( i=0; i<3; i++ ) - pltmp[i] = (1 << 31) | (0 << 30) | (18 << 24) | BitReverse( max2827_channel_data_24[Channel.ChanNo-1][i], 18); - Wb35Reg_BurstWrite( pHwData, 0x0864, pltmp, 3, NO_INCREMENT ); - } - else if( Channel.band == BAND_TYPE_OFDM_5 ) // channel 36 ~ 64 - { - ChnlTmp = (Channel.ChanNo - 36) / 4; - for( i=0; i<3; i++ ) - pltmp[i] = (1 << 31) | (0 << 30) | (18 << 24) | BitReverse( max2827_channel_data_50[ChnlTmp][i], 18); - Wb35Reg_BurstWrite( pHwData, 0x0864, pltmp, 3, NO_INCREMENT ); - } - RFSynthesizer_SetPowerIndex( pHwData, 100 ); - break; - - case RF_MAXIM_2828: - - if( Channel.band <= BAND_TYPE_OFDM_24 ) // channel 1 ~ 13 - { - for( i=0; i<3; i++ ) - pltmp[i] = (1 << 31) | (0 << 30) | (18 << 24) | BitReverse( max2828_channel_data_24[Channel.ChanNo-1][i], 18); - Wb35Reg_BurstWrite( pHwData, 0x0864, pltmp, 3, NO_INCREMENT ); - } - else if( Channel.band == BAND_TYPE_OFDM_5 ) // channel 36 ~ 64 - { - ChnlTmp = (Channel.ChanNo - 36) / 4; - for ( i = 0; i < 3; i++) - pltmp[i] = (1 << 31) | (0 << 30) | (18 << 24) | BitReverse( max2828_channel_data_50[ChnlTmp][i], 18); - Wb35Reg_BurstWrite( pHwData, 0x0864, pltmp, 3, NO_INCREMENT ); - } - RFSynthesizer_SetPowerIndex( pHwData, 100 ); - break; - - case RF_MAXIM_2829: + switch (pHwData->phy_type) { + case RF_MAXIM_2825: + case RF_MAXIM_V1: /* 11g Winbond 2nd BB(with Phy board (v1) + Maxim 331) */ - if( Channel.band <= BAND_TYPE_OFDM_24) - { - for( i=0; i<3; i++ ) - pltmp[i] = (1 << 31) | (0 << 30) | (18 << 24) | BitReverse( max2829_channel_data_24[Channel.ChanNo-1][i], 18); - Wb35Reg_BurstWrite( pHwData, 0x0864, pltmp, 3, NO_INCREMENT ); - } - else if( Channel.band == BAND_TYPE_OFDM_5 ) - { - count = sizeof(max2829_channel_data_50) / sizeof(max2829_channel_data_50[0]); - - for( i=0; i<count; i++ ) - { - if( max2829_channel_data_50[i][0] == Channel.ChanNo ) - { - for( j=0; j<3; j++ ) - pltmp[j] = (1 << 31) | (0 << 30) | (18 << 24) | BitReverse( max2829_channel_data_50[i][j+1], 18); - Wb35Reg_BurstWrite( pHwData, 0x0864, pltmp, 3, NO_INCREMENT ); - - if( (max2829_channel_data_50[i][3] & 0x3FFFF) == 0x2A946 ) - { - ltmp = (1 << 31) | (0 << 30) | (18 << 24) | BitReverse( (5<<18)|0x2A906, 18); - Wb35Reg_Write( pHwData, 0x0864, ltmp ); - } - else // 0x2A9C6 - { - ltmp = (1 << 31) | (0 << 30) | (18 << 24) | BitReverse( (5<<18)|0x2A986, 18); - Wb35Reg_Write( pHwData, 0x0864, ltmp ); - } + if (Channel.band <= BAND_TYPE_OFDM_24) { /* channel 1 ~ 13 */ + for (i = 0; i < 3; i++) + pltmp[i] = (1 << 31) | (0 << 30) | (18 << 24) | BitReverse(max2825_channel_data_24[Channel.ChanNo-1][i], 18); + Wb35Reg_BurstWrite(pHwData, 0x0864, pltmp, 3, NO_INCREMENT); + } + RFSynthesizer_SetPowerIndex(pHwData, 100); + break; + case RF_MAXIM_2827: + if (Channel.band <= BAND_TYPE_OFDM_24) { /* channel 1 ~ 13 */ + for (i = 0; i < 3; i++) + pltmp[i] = (1 << 31) | (0 << 30) | (18 << 24) | BitReverse(max2827_channel_data_24[Channel.ChanNo-1][i], 18); + Wb35Reg_BurstWrite(pHwData, 0x0864, pltmp, 3, NO_INCREMENT); + } else if (Channel.band == BAND_TYPE_OFDM_5) { /* channel 36 ~ 64 */ + ChnlTmp = (Channel.ChanNo - 36) / 4; + for (i = 0; i < 3; i++) + pltmp[i] = (1 << 31) | (0 << 30) | (18 << 24) | BitReverse(max2827_channel_data_50[ChnlTmp][i], 18); + Wb35Reg_BurstWrite(pHwData, 0x0864, pltmp, 3, NO_INCREMENT); + } + RFSynthesizer_SetPowerIndex(pHwData, 100); + break; + case RF_MAXIM_2828: + if (Channel.band <= BAND_TYPE_OFDM_24) { /* channel 1 ~ 13 */ + for (i = 0; i < 3; i++) + pltmp[i] = (1 << 31) | (0 << 30) | (18 << 24) | BitReverse(max2828_channel_data_24[Channel.ChanNo-1][i], 18); + Wb35Reg_BurstWrite(pHwData, 0x0864, pltmp, 3, NO_INCREMENT); + } else if (Channel.band == BAND_TYPE_OFDM_5) { /* channel 36 ~ 64 */ + ChnlTmp = (Channel.ChanNo - 36) / 4; + for (i = 0; i < 3; i++) + pltmp[i] = (1 << 31) | (0 << 30) | (18 << 24) | BitReverse(max2828_channel_data_50[ChnlTmp][i], 18); + Wb35Reg_BurstWrite(pHwData, 0x0864, pltmp, 3, NO_INCREMENT); + } + RFSynthesizer_SetPowerIndex(pHwData, 100); + break; + case RF_MAXIM_2829: + if (Channel.band <= BAND_TYPE_OFDM_24) { + for (i = 0; i < 3; i++) + pltmp[i] = (1 << 31) | (0 << 30) | (18 << 24) | BitReverse(max2829_channel_data_24[Channel.ChanNo-1][i], 18); + Wb35Reg_BurstWrite(pHwData, 0x0864, pltmp, 3, NO_INCREMENT); + } else if (Channel.band == BAND_TYPE_OFDM_5) { + count = ARRAY_SIZE(max2829_channel_data_50); + + for (i = 0; i < count; i++) { + if (max2829_channel_data_50[i][0] == Channel.ChanNo) { + for (j = 0; j < 3; j++) + pltmp[j] = (1 << 31) | (0 << 30) | (18 << 24) | BitReverse(max2829_channel_data_50[i][j+1], 18); + Wb35Reg_BurstWrite(pHwData, 0x0864, pltmp, 3, NO_INCREMENT); + + if ((max2829_channel_data_50[i][3] & 0x3FFFF) == 0x2A946) { + ltmp = (1 << 31) | (0 << 30) | (18 << 24) | BitReverse((5 << 18) | 0x2A906, 18); + Wb35Reg_Write(pHwData, 0x0864, ltmp); + } else { /* 0x2A9C6 */ + ltmp = (1 << 31) | (0 << 30) | (18 << 24) | BitReverse((5 << 18) | 0x2A986, 18); + Wb35Reg_Write(pHwData, 0x0864, ltmp); } } } - set_tx_power_per_channel_max2829( pHwData, Channel ); - break; - - case RF_AIROHA_2230: - case RF_AIROHA_2230S: // 20060420 Add this - - if( Channel.band <= BAND_TYPE_OFDM_24 ) // channel 1 ~ 14 - { - for( i=0; i<2; i++ ) - pltmp[i] = (1 << 31) | (0 << 30) | (20 << 24) | BitReverse( al2230_channel_data_24[Channel.ChanNo-1][i], 20); - Wb35Reg_BurstWrite( pHwData, 0x0864, pltmp, 2, NO_INCREMENT ); + } + set_tx_power_per_channel_max2829(pHwData, Channel); + break; + case RF_AIROHA_2230: + case RF_AIROHA_2230S: + if (Channel.band <= BAND_TYPE_OFDM_24) { /* channel 1 ~ 14 */ + for (i = 0; i < 2; i++) + pltmp[i] = (1 << 31) | (0 << 30) | (20 << 24) | BitReverse(al2230_channel_data_24[Channel.ChanNo-1][i], 20); + Wb35Reg_BurstWrite(pHwData, 0x0864, pltmp, 2, NO_INCREMENT); + } + set_tx_power_per_channel_al2230(pHwData, Channel); + break; + case RF_AIROHA_7230: + /* Channel independent registers */ + if (Channel.band != pHwData->band) { + if (Channel.band <= BAND_TYPE_OFDM_24) { + /* Update BB register */ + BBProcessor_AL7230_2400(pHwData); + + number = ARRAY_SIZE(al7230_rf_data_24); + Set_ChanIndep_RfData_al7230_24(pHwData, pltmp, number); + } else { + /* Update BB register */ + BBProcessor_AL7230_5000(pHwData); + + number = ARRAY_SIZE(al7230_rf_data_50); + Set_ChanIndep_RfData_al7230_50(pHwData, pltmp, number); } - set_tx_power_per_channel_al2230( pHwData, Channel ); - break; - - case RF_AIROHA_7230: - - //Start to fill RF parameters, PLL_ON should be pulled low. - //Wb35Reg_Write( pHwData, 0x03dc, 0x00000000 ); - //WBDEBUG(("* PLL_ON low\n")); - - //Channel independent registers - if( Channel.band != pHwData->band) - { - if (Channel.band <= BAND_TYPE_OFDM_24) - { - //Update BB register - BBProcessor_AL7230_2400(pHwData); - number = sizeof(al7230_rf_data_24)/sizeof(al7230_rf_data_24[0]); - Set_ChanIndep_RfData_al7230_24(pHwData, pltmp, number); - } - else - { - //Update BB register - BBProcessor_AL7230_5000(pHwData); - - number = sizeof(al7230_rf_data_50)/sizeof(al7230_rf_data_50[0]); - Set_ChanIndep_RfData_al7230_50(pHwData, pltmp, number); - } - - // Write to register. number must less and equal than 16 - Wb35Reg_BurstWrite( pHwData, 0x0864, pltmp, number, NO_INCREMENT ); - #ifdef _PE_STATE_DUMP_ - WBDEBUG(("Band changed\n")); - #endif - } + /* Write to register. number must less and equal than 16 */ + Wb35Reg_BurstWrite(pHwData, 0x0864, pltmp, number, NO_INCREMENT); + pr_debug("Band changed\n"); + } - if( Channel.band <= BAND_TYPE_OFDM_24 ) // channel 1 ~ 14 - { - for( i=0; i<2; i++ ) - pltmp[i] = (1 << 31) | (0 << 30) | (24 << 24) | (al7230_channel_data_24[Channel.ChanNo-1][i]&0xffffff); - Wb35Reg_BurstWrite( pHwData, 0x0864, pltmp, 2, NO_INCREMENT ); + if (Channel.band <= BAND_TYPE_OFDM_24) { /* channel 1 ~ 14 */ + for (i = 0; i < 2; i++) + pltmp[i] = (1 << 31) | (0 << 30) | (24 << 24) | (al7230_channel_data_24[Channel.ChanNo-1][i]&0xffffff); + Wb35Reg_BurstWrite(pHwData, 0x0864, pltmp, 2, NO_INCREMENT); + } else if (Channel.band == BAND_TYPE_OFDM_5) { + /* Update Reg12 */ + if ((Channel.ChanNo > 64) && (Channel.ChanNo <= 165)) { + ltmp = (1 << 31) | (0 << 30) | (24 << 24) | 0x00143c; + Wb35Reg_Write(pHwData, 0x0864, ltmp); + } else { /* reg12 = 0x00147c at Channel 4920 ~ 5320 */ + ltmp = (1 << 31) | (0 << 30) | (24 << 24) | 0x00147c; + Wb35Reg_Write(pHwData, 0x0864, ltmp); } - else if( Channel.band == BAND_TYPE_OFDM_5 ) - { - //Update Reg12 - if ((Channel.ChanNo > 64) && (Channel.ChanNo <= 165)) - { - ltmp = (1 << 31) | (0 << 30) | (24 << 24) | 0x00143c; - Wb35Reg_Write( pHwData, 0x0864, ltmp ); - } - else //reg12 = 0x00147c at Channel 4920 ~ 5320 - { - ltmp = (1 << 31) | (0 << 30) | (24 << 24) | 0x00147c; - Wb35Reg_Write( pHwData, 0x0864, ltmp ); - } - count = sizeof(al7230_channel_data_5) / sizeof(al7230_channel_data_5[0]); + count = ARRAY_SIZE(al7230_channel_data_5); - for (i=0; i<count; i++) - { - if (al7230_channel_data_5[i][0] == Channel.ChanNo) - { - for( j=0; j<3; j++ ) - pltmp[j] = (1 << 31) | (0 << 30) | (24 << 24) | ( al7230_channel_data_5[i][j+1]&0xffffff); - Wb35Reg_BurstWrite( pHwData, 0x0864, pltmp, 3, NO_INCREMENT ); - } + for (i = 0; i < count; i++) { + if (al7230_channel_data_5[i][0] == Channel.ChanNo) { + for (j = 0; j < 3; j++) + pltmp[j] = (1 << 31) | (0 << 30) | (24 << 24) | (al7230_channel_data_5[i][j+1] & 0xffffff); + Wb35Reg_BurstWrite(pHwData, 0x0864, pltmp, 3, NO_INCREMENT); } } - set_tx_power_per_channel_al7230(pHwData, Channel); - break; - - case RF_WB_242: - case RF_WB_242_1: // 20060619.5 Add + } + set_tx_power_per_channel_al7230(pHwData, Channel); + break; + case RF_WB_242: + case RF_WB_242_1: - if( Channel.band <= BAND_TYPE_OFDM_24 ) // channel 1 ~ 14 - { - ltmp = (1 << 31) | (0 << 30) | (24 << 24) | BitReverse( w89rf242_channel_data_24[Channel.ChanNo-1][0], 24); - Wb35Reg_Write( pHwData, 0x864, ltmp ); - } - set_tx_power_per_channel_wb242(pHwData, Channel); - break; + if (Channel.band <= BAND_TYPE_OFDM_24) { /* channel 1 ~ 14 */ + ltmp = (1 << 31) | (0 << 30) | (24 << 24) | BitReverse(w89rf242_channel_data_24[Channel.ChanNo-1][0], 24); + Wb35Reg_Write(pHwData, 0x864, ltmp); + } + set_tx_power_per_channel_wb242(pHwData, Channel); + break; } - if( Channel.band <= BAND_TYPE_OFDM_24 ) - { - // BB: select 2.4 GHz, bit[12-11]=00 - pWb35Reg->BB50 &= ~(BIT(11)|BIT(12)); - Wb35Reg_Write( pHwData, 0x1050, pWb35Reg->BB50 ); // MODE_Ctrl - // MAC: select 2.4 GHz, bit[5]=0 - pWb35Reg->M78_ERPInformation &= ~BIT(5); - Wb35Reg_Write( pHwData, 0x0878, pWb35Reg->M78_ERPInformation ); - // enable 11b Baseband - pWb35Reg->BB30 &= ~BIT(31); - Wb35Reg_Write( pHwData, 0x1030, pWb35Reg->BB30 ); - } - else if( (Channel.band == BAND_TYPE_OFDM_5) ) - { - // BB: select 5 GHz - pWb35Reg->BB50 &= ~(BIT(11)|BIT(12)); - if (Channel.ChanNo <=64 ) - pWb35Reg->BB50 |= BIT(12); // 10-5.25GHz + if (Channel.band <= BAND_TYPE_OFDM_24) { + /* BB: select 2.4 GHz, bit[12-11]=00 */ + reg->BB50 &= ~(BIT(11) | BIT(12)); + Wb35Reg_Write(pHwData, 0x1050, reg->BB50); /* MODE_Ctrl */ + /* MAC: select 2.4 GHz, bit[5]=0 */ + reg->M78_ERPInformation &= ~BIT(5); + Wb35Reg_Write(pHwData, 0x0878, reg->M78_ERPInformation); + /* enable 11b Baseband */ + reg->BB30 &= ~BIT(31); + Wb35Reg_Write(pHwData, 0x1030, reg->BB30); + } else if (Channel.band == BAND_TYPE_OFDM_5) { + /* BB: select 5 GHz */ + reg->BB50 &= ~(BIT(11) | BIT(12)); + if (Channel.ChanNo <= 64) + reg->BB50 |= BIT(12); /* 10-5.25GHz */ else if ((Channel.ChanNo >= 100) && (Channel.ChanNo <= 124)) - pWb35Reg->BB50 |= BIT(11); // 01-5.48GHz - else if ((Channel.ChanNo >=128) && (Channel.ChanNo <= 161)) - pWb35Reg->BB50 |= (BIT(12)|BIT(11)); // 11-5.775GHz - else //Chan 184 ~ 196 will use bit[12-11] = 10 in version sh-src-1.2.25 - pWb35Reg->BB50 |= BIT(12); - Wb35Reg_Write( pHwData, 0x1050, pWb35Reg->BB50 ); // MODE_Ctrl - - //(1) M78 should alway use 2.4G setting when using RF_AIROHA_7230 - //(2) BB30 has been updated previously. - if (pHwData->phy_type != RF_AIROHA_7230) - { - // MAC: select 5 GHz, bit[5]=1 - pWb35Reg->M78_ERPInformation |= BIT(5); - Wb35Reg_Write( pHwData, 0x0878, pWb35Reg->M78_ERPInformation ); - - // disable 11b Baseband - pWb35Reg->BB30 |= BIT(31); - Wb35Reg_Write( pHwData, 0x1030, pWb35Reg->BB30 ); + reg->BB50 |= BIT(11); /* 01-5.48GHz */ + else if ((Channel.ChanNo >= 128) && (Channel.ChanNo <= 161)) + reg->BB50 |= (BIT(12) | BIT(11)); /* 11-5.775GHz */ + else /* Chan 184 ~ 196 will use bit[12-11] = 10 in version sh-src-1.2.25 */ + reg->BB50 |= BIT(12); + Wb35Reg_Write(pHwData, 0x1050, reg->BB50); /* MODE_Ctrl */ + + /* (1) M78 should alway use 2.4G setting when using RF_AIROHA_7230 */ + /* (2) BB30 has been updated previously. */ + if (pHwData->phy_type != RF_AIROHA_7230) { + /* MAC: select 5 GHz, bit[5]=1 */ + reg->M78_ERPInformation |= BIT(5); + Wb35Reg_Write(pHwData, 0x0878, reg->M78_ERPInformation); + + /* disable 11b Baseband */ + reg->BB30 |= BIT(31); + Wb35Reg_Write(pHwData, 0x1030, reg->BB30); } } } -//Set the tx power directly from DUT GUI, not from the EEPROM. Return the current setting -u8 RFSynthesizer_SetPowerIndex( phw_data_t pHwData, u8 PowerIndex ) +/* + * Set the tx power directly from DUT GUI, not from the EEPROM. + * Return the current setting + */ +u8 RFSynthesizer_SetPowerIndex(struct hw_data *pHwData, u8 PowerIndex) { u32 Band = pHwData->band; - u8 index=0; + u8 index = 0; - if( pHwData->power_index == PowerIndex ) // 20060620.1 Add + if (pHwData->power_index == PowerIndex) return PowerIndex; - if (RF_MAXIM_2825 == pHwData->phy_type) - { - // Channel 1 - 13 - index = RFSynthesizer_SetMaxim2825Power( pHwData, PowerIndex ); - } - else if (RF_MAXIM_2827 == pHwData->phy_type) - { - if( Band <= BAND_TYPE_OFDM_24 ) // Channel 1 - 13 - index = RFSynthesizer_SetMaxim2827_24Power( pHwData, PowerIndex ); - else// if( Band == BAND_TYPE_OFDM_5 ) // Channel 36 - 64 - index = RFSynthesizer_SetMaxim2827_50Power( pHwData, PowerIndex ); - } - else if (RF_MAXIM_2828 == pHwData->phy_type) - { - if( Band <= BAND_TYPE_OFDM_24 ) // Channel 1 - 13 - index = RFSynthesizer_SetMaxim2828_24Power( pHwData, PowerIndex ); - else// if( Band == BAND_TYPE_OFDM_5 ) // Channel 36 - 64 - index = RFSynthesizer_SetMaxim2828_50Power( pHwData, PowerIndex ); - } - else if( RF_AIROHA_2230 == pHwData->phy_type ) - { - //Power index: 0 ~ 63 // Channel 1 - 14 - index = RFSynthesizer_SetAiroha2230Power( pHwData, PowerIndex ); - index = (u8)al2230_txvga_data[index][1]; - } - else if( RF_AIROHA_2230S == pHwData->phy_type ) // 20060420 Add this - { - //Power index: 0 ~ 63 // Channel 1 - 14 - index = RFSynthesizer_SetAiroha2230Power( pHwData, PowerIndex ); - index = (u8)al2230_txvga_data[index][1]; - } - else if( RF_AIROHA_7230 == pHwData->phy_type ) - { - //Power index: 0 ~ 63 - index = RFSynthesizer_SetAiroha7230Power( pHwData, PowerIndex ); + if (RF_MAXIM_2825 == pHwData->phy_type) { + /* Channel 1 - 13 */ + index = RFSynthesizer_SetMaxim2825Power(pHwData, PowerIndex); + } else if (RF_MAXIM_2827 == pHwData->phy_type) { + if (Band <= BAND_TYPE_OFDM_24) /* Channel 1 - 13 */ + index = RFSynthesizer_SetMaxim2827_24Power(pHwData, PowerIndex); + else /* Channel 36 - 64 */ + index = RFSynthesizer_SetMaxim2827_50Power(pHwData, PowerIndex); + } else if (RF_MAXIM_2828 == pHwData->phy_type) { + if (Band <= BAND_TYPE_OFDM_24) /* Channel 1 - 13 */ + index = RFSynthesizer_SetMaxim2828_24Power(pHwData, PowerIndex); + else /* Channel 36 - 64 */ + index = RFSynthesizer_SetMaxim2828_50Power(pHwData, PowerIndex); + } else if (RF_AIROHA_2230 == pHwData->phy_type) { + /* Power index: 0 ~ 63 --- Channel 1 - 14 */ + index = RFSynthesizer_SetAiroha2230Power(pHwData, PowerIndex); + index = (u8) al2230_txvga_data[index][1]; + } else if (RF_AIROHA_2230S == pHwData->phy_type) { + /* Power index: 0 ~ 63 --- Channel 1 - 14 */ + index = RFSynthesizer_SetAiroha2230Power(pHwData, PowerIndex); + index = (u8) al2230_txvga_data[index][1]; + } else if (RF_AIROHA_7230 == pHwData->phy_type) { + /* Power index: 0 ~ 63 */ + index = RFSynthesizer_SetAiroha7230Power(pHwData, PowerIndex); index = (u8)al7230_txvga_data[index][1]; - } - else if( (RF_WB_242 == pHwData->phy_type) || - (RF_WB_242_1 == pHwData->phy_type) ) // 20060619.5 Add - { - //Power index: 0 ~ 19 for original. New range is 0 ~ 33 - index = RFSynthesizer_SetWinbond242Power( pHwData, PowerIndex ); + } else if ((RF_WB_242 == pHwData->phy_type) || + (RF_WB_242_1 == pHwData->phy_type)) { + /* Power index: 0 ~ 19 for original. New range is 0 ~ 33 */ + index = RFSynthesizer_SetWinbond242Power(pHwData, PowerIndex); index = (u8)w89rf242_txvga_data[index][1]; } - pHwData->power_index = index; // Backup current + pHwData->power_index = index; /* Backup current */ return index; } -//-- Sub function -u8 RFSynthesizer_SetMaxim2828_24Power( phw_data_t pHwData, u8 index ) +/* -- Sub function */ +u8 RFSynthesizer_SetMaxim2828_24Power(struct hw_data *pHwData, u8 index) { - u32 PowerData; - if( index > 1 ) index = 1; - PowerData = (1 << 31) | (0 << 30) | (18 << 24) | BitReverse( max2828_power_data_24[index], 18); - Wb35Reg_Write( pHwData, 0x0864, PowerData ); + u32 PowerData; + if (index > 1) + index = 1; + PowerData = (1 << 31) | (0 << 30) | (18 << 24) | BitReverse(max2828_power_data_24[index], 18); + Wb35Reg_Write(pHwData, 0x0864, PowerData); return index; } -//-- -u8 RFSynthesizer_SetMaxim2828_50Power( phw_data_t pHwData, u8 index ) + +u8 RFSynthesizer_SetMaxim2828_50Power(struct hw_data *pHwData, u8 index) { - u32 PowerData; - if( index > 1 ) index = 1; - PowerData = (1 << 31) | (0 << 30) | (18 << 24) | BitReverse( max2828_power_data_50[index], 18); - Wb35Reg_Write( pHwData, 0x0864, PowerData ); + u32 PowerData; + if (index > 1) + index = 1; + PowerData = (1 << 31) | (0 << 30) | (18 << 24) | BitReverse(max2828_power_data_50[index], 18); + Wb35Reg_Write(pHwData, 0x0864, PowerData); return index; } -//-- -u8 RFSynthesizer_SetMaxim2827_24Power( phw_data_t pHwData, u8 index ) + +u8 RFSynthesizer_SetMaxim2827_24Power(struct hw_data *pHwData, u8 index) { - u32 PowerData; - if( index > 1 ) index = 1; - PowerData = (1 << 31) | (0 << 30) | (18 << 24) | BitReverse( max2827_power_data_24[index], 18); - Wb35Reg_Write( pHwData, 0x0864, PowerData ); + u32 PowerData; + if (index > 1) + index = 1; + PowerData = (1 << 31) | (0 << 30) | (18 << 24) | BitReverse(max2827_power_data_24[index], 18); + Wb35Reg_Write(pHwData, 0x0864, PowerData); return index; } -//-- -u8 RFSynthesizer_SetMaxim2827_50Power( phw_data_t pHwData, u8 index ) + +u8 RFSynthesizer_SetMaxim2827_50Power(struct hw_data *pHwData, u8 index) { - u32 PowerData; - if( index > 1 ) index = 1; - PowerData = (1 << 31) | (0 << 30) | (18 << 24) | BitReverse( max2827_power_data_50[index], 18); - Wb35Reg_Write( pHwData, 0x0864, PowerData ); + u32 PowerData; + if (index > 1) + index = 1; + PowerData = (1 << 31) | (0 << 30) | (18 << 24) | BitReverse(max2827_power_data_50[index], 18); + Wb35Reg_Write(pHwData, 0x0864, PowerData); return index; } -//-- -u8 RFSynthesizer_SetMaxim2825Power( phw_data_t pHwData, u8 index ) + +u8 RFSynthesizer_SetMaxim2825Power(struct hw_data *pHwData, u8 index) { - u32 PowerData; - if( index > 1 ) index = 1; - PowerData = (1 << 31) | (0 << 30) | (18 << 24) | BitReverse( max2825_power_data_24[index], 18); - Wb35Reg_Write( pHwData, 0x0864, PowerData ); + u32 PowerData; + if (index > 1) + index = 1; + PowerData = (1 << 31) | (0 << 30) | (18 << 24) | BitReverse(max2825_power_data_24[index], 18); + Wb35Reg_Write(pHwData, 0x0864, PowerData); return index; } -//-- -u8 RFSynthesizer_SetAiroha2230Power( phw_data_t pHwData, u8 index ) + +u8 RFSynthesizer_SetAiroha2230Power(struct hw_data *pHwData, u8 index) { - u32 PowerData; - u8 i,count; + u32 PowerData; + u8 i, count; - count = sizeof(al2230_txvga_data) / sizeof(al2230_txvga_data[0]); - for (i=0; i<count; i++) - { + count = ARRAY_SIZE(al2230_txvga_data); + for (i = 0; i < count; i++) { if (al2230_txvga_data[i][1] >= index) break; } if (i == count) i--; - PowerData = (1 << 31) | (0 << 30) | (20 << 24) | BitReverse( al2230_txvga_data[i][0], 20); - Wb35Reg_Write( pHwData, 0x0864, PowerData ); + PowerData = (1 << 31) | (0 << 30) | (20 << 24) | BitReverse(al2230_txvga_data[i][0], 20); + Wb35Reg_Write(pHwData, 0x0864, PowerData); return i; } -//-- -u8 RFSynthesizer_SetAiroha7230Power( phw_data_t pHwData, u8 index ) + +u8 RFSynthesizer_SetAiroha7230Power(struct hw_data *pHwData, u8 index) { - u32 PowerData; - u8 i,count; + u32 PowerData; + u8 i, count; - //PowerData = (1 << 31) | (0 << 30) | (20 << 24) | BitReverse( airoha_power_data_24[index], 20); - count = sizeof(al7230_txvga_data) / sizeof(al7230_txvga_data[0]); - for (i=0; i<count; i++) - { + count = ARRAY_SIZE(al7230_txvga_data); + for (i = 0; i < count; i++) { if (al7230_txvga_data[i][1] >= index) break; } if (i == count) i--; - PowerData = (1 << 31) | (0 << 30) | (24 << 24) | (al7230_txvga_data[i][0]&0xffffff); - Wb35Reg_Write( pHwData, 0x0864, PowerData ); + PowerData = (1 << 31) | (0 << 30) | (24 << 24) | (al7230_txvga_data[i][0] & 0xffffff); + Wb35Reg_Write(pHwData, 0x0864, PowerData); return i; } -u8 RFSynthesizer_SetWinbond242Power( phw_data_t pHwData, u8 index ) +u8 RFSynthesizer_SetWinbond242Power(struct hw_data *pHwData, u8 index) { - u32 PowerData; - u8 i,count; + u32 PowerData; + u8 i, count; - count = sizeof(w89rf242_txvga_data) / sizeof(w89rf242_txvga_data[0]); - for (i=0; i<count; i++) - { + count = ARRAY_SIZE(w89rf242_txvga_data); + for (i = 0; i < count; i++) { if (w89rf242_txvga_data[i][1] >= index) break; } if (i == count) i--; - // Set TxVga into RF - PowerData = (1 << 31) | (0 << 30) | (24 << 24) | BitReverse( w89rf242_txvga_data[i][0], 24); - Wb35Reg_Write( pHwData, 0x0864, PowerData ); - - // Update BB48 BB4C BB58 for high precision txvga - Wb35Reg_Write( pHwData, 0x1048, w89rf242_txvga_data[i][2] ); - Wb35Reg_Write( pHwData, 0x104c, w89rf242_txvga_data[i][3] ); - Wb35Reg_Write( pHwData, 0x1058, w89rf242_txvga_data[i][4] ); - -// Rf vga 0 ~ 3 for temperature compensate. It will affect the scan Bss. -// The i value equals to 8 or 7 usually. So It's not necessary to setup this RF register. -// if( i <= 3 ) -// PowerData = (1 << 31) | (0 << 30) | (24 << 24) | BitReverse( 0x000024, 24 ); -// else -// PowerData = (1 << 31) | (0 << 30) | (24 << 24) | BitReverse( 0x001824, 24 ); -// Wb35Reg_Write( pHwData, 0x0864, PowerData ); + /* Set TxVga into RF */ + PowerData = (1 << 31) | (0 << 30) | (24 << 24) | BitReverse(w89rf242_txvga_data[i][0], 24); + Wb35Reg_Write(pHwData, 0x0864, PowerData); + + /* Update BB48 BB4C BB58 for high precision txvga */ + Wb35Reg_Write(pHwData, 0x1048, w89rf242_txvga_data[i][2]); + Wb35Reg_Write(pHwData, 0x104c, w89rf242_txvga_data[i][3]); + Wb35Reg_Write(pHwData, 0x1058, w89rf242_txvga_data[i][4]); + return i; } -//=========================================================================================================== -// Dxx_initial -- -// Mxx_initial -- - // -// Routine Description: -// Initial the hardware setting and module variable - // -//=========================================================================================================== -void Dxx_initial( phw_data_t pHwData ) +/* + * =========================================================================== + * Dxx_initial -- + * Mxx_initial -- + * + * Routine Description: + * Initial the hardware setting and module variable + * =========================================================================== + */ +void Dxx_initial(struct hw_data *pHwData) { - PWB35REG pWb35Reg = &pHwData->Wb35Reg; - - // Old IC:Single mode only. - // New IC: operation decide by Software set bit[4]. 1:multiple 0: single - pWb35Reg->D00_DmaControl = 0xc0000004; //Txon, Rxon, multiple Rx for new 4k DMA - //Txon, Rxon, single Rx for old 8k ASIC - if( !HAL_USB_MODE_BURST( pHwData ) ) - pWb35Reg->D00_DmaControl = 0xc0000000;//Txon, Rxon, single Rx for new 4k DMA - - Wb35Reg_WriteSync( pHwData, 0x0400, pWb35Reg->D00_DmaControl ); + struct wb35_reg *reg = &pHwData->reg; + + /* + * Old IC: Single mode only. + * New IC: operation decide by Software set bit[4]. 1:multiple 0: single + */ + reg->D00_DmaControl = 0xc0000004; /* Txon, Rxon, multiple Rx for new 4k DMA */ + /* Txon, Rxon, single Rx for old 8k ASIC */ + if (!HAL_USB_MODE_BURST(pHwData)) + reg->D00_DmaControl = 0xc0000000; /* Txon, Rxon, single Rx for new 4k DMA */ + + Wb35Reg_WriteSync(pHwData, 0x0400, reg->D00_DmaControl); } -void Mxx_initial( phw_data_t pHwData ) +void Mxx_initial(struct hw_data *pHwData) { - PWB35REG pWb35Reg = &pHwData->Wb35Reg; - u32 tmp; - u32 pltmp[11]; + struct wb35_reg *reg = &pHwData->reg; + u32 tmp; + u32 pltmp[11]; u16 i; - //====================================================== - // Initial Mxx register - //====================================================== + /* + * ====================================================== + * Initial Mxx register + * ====================================================== + */ - // M00 bit set -#ifdef _IBSS_BEACON_SEQ_STICK_ - pWb35Reg->M00_MacControl = 0; // Solve beacon sequence number stop by software -#else - pWb35Reg->M00_MacControl = 0x80000000; // Solve beacon sequence number stop by hardware -#endif + /* M00 bit set */ + reg->M00_MacControl = 0x80000000; /* Solve beacon sequence number stop by hardware */ - // M24 disable enter power save, BB RxOn and enable NAV attack - pWb35Reg->M24_MacControl = 0x08040042; - pltmp[0] = pWb35Reg->M24_MacControl; + /* M24 disable enter power save, BB RxOn and enable NAV attack */ + reg->M24_MacControl = 0x08040042; + pltmp[0] = reg->M24_MacControl; - pltmp[1] = 0; // Skip M28, because no initialize value is required. + pltmp[1] = 0; /* Skip M28, because no initialize value is required. */ - // M2C CWmin and CWmax setting + /* M2C CWmin and CWmax setting */ pHwData->cwmin = DEFAULT_CWMIN; pHwData->cwmax = DEFAULT_CWMAX; - pWb35Reg->M2C_MacControl = DEFAULT_CWMIN << 10; - pWb35Reg->M2C_MacControl |= DEFAULT_CWMAX; - pltmp[2] = pWb35Reg->M2C_MacControl; + reg->M2C_MacControl = DEFAULT_CWMIN << 10; + reg->M2C_MacControl |= DEFAULT_CWMAX; + pltmp[2] = reg->M2C_MacControl; - // M30 BSSID + /* M30 BSSID */ pltmp[3] = *(u32 *)pHwData->bssid; - // M34 + /* M34 */ pHwData->AID = DEFAULT_AID; - tmp = *(u16 *)(pHwData->bssid+4); + tmp = *(u16 *) (pHwData->bssid + 4); tmp |= DEFAULT_AID << 16; pltmp[4] = tmp; - // M38 - pWb35Reg->M38_MacControl = (DEFAULT_RATE_RETRY_LIMIT<<8) | (DEFAULT_LONG_RETRY_LIMIT << 4) | DEFAULT_SHORT_RETRY_LIMIT; - pltmp[5] = pWb35Reg->M38_MacControl; + /* M38 */ + reg->M38_MacControl = (DEFAULT_RATE_RETRY_LIMIT << 8) | (DEFAULT_LONG_RETRY_LIMIT << 4) | DEFAULT_SHORT_RETRY_LIMIT; + pltmp[5] = reg->M38_MacControl; - // M3C - tmp = (DEFAULT_PIFST << 26) | (DEFAULT_EIFST << 16) | (DEFAULT_DIFST << 8) | (DEFAULT_SIFST << 4) | DEFAULT_OSIFST ; - pWb35Reg->M3C_MacControl = tmp; + /* M3C */ + tmp = (DEFAULT_PIFST << 26) | (DEFAULT_EIFST << 16) | (DEFAULT_DIFST << 8) | (DEFAULT_SIFST << 4) | DEFAULT_OSIFST; + reg->M3C_MacControl = tmp; pltmp[6] = tmp; - // M40 + /* M40 */ pHwData->slot_time_select = DEFAULT_SLOT_TIME; tmp = (DEFAULT_ATIMWD << 16) | DEFAULT_SLOT_TIME; - pWb35Reg->M40_MacControl = tmp; + reg->M40_MacControl = tmp; pltmp[7] = tmp; - // M44 - tmp = DEFAULT_MAX_TX_MSDU_LIFE_TIME << 10; // *1024 - pWb35Reg->M44_MacControl = tmp; + /* M44 */ + tmp = DEFAULT_MAX_TX_MSDU_LIFE_TIME << 10; /* *1024 */ + reg->M44_MacControl = tmp; pltmp[8] = tmp; - // M48 + /* M48 */ pHwData->BeaconPeriod = DEFAULT_BEACON_INTERVAL; pHwData->ProbeDelay = DEFAULT_PROBE_DELAY_TIME; tmp = (DEFAULT_BEACON_INTERVAL << 16) | DEFAULT_PROBE_DELAY_TIME; - pWb35Reg->M48_MacControl = tmp; + reg->M48_MacControl = tmp; pltmp[9] = tmp; - //M4C - pWb35Reg->M4C_MacStatus = (DEFAULT_PROTOCOL_VERSION << 30) | (DEFAULT_MAC_POWER_STATE << 28) | (DEFAULT_DTIM_ALERT_TIME << 24); - pltmp[10] = pWb35Reg->M4C_MacStatus; + /* M4C */ + reg->M4C_MacStatus = (DEFAULT_PROTOCOL_VERSION << 30) | (DEFAULT_MAC_POWER_STATE << 28) | (DEFAULT_DTIM_ALERT_TIME << 24); + pltmp[10] = reg->M4C_MacStatus; - // Burst write - //Wb35Reg_BurstWrite( pHwData, 0x0824, pltmp, 11, AUTO_INCREMENT ); - for( i=0; i<11; i++ ) - Wb35Reg_WriteSync( pHwData, 0x0824 + i*4, pltmp[i] ); + for (i = 0; i < 11; i++) + Wb35Reg_WriteSync(pHwData, 0x0824 + i * 4, pltmp[i]); - // M60 - Wb35Reg_WriteSync( pHwData, 0x0860, 0x12481248 ); - pWb35Reg->M60_MacControl = 0x12481248; + /* M60 */ + Wb35Reg_WriteSync(pHwData, 0x0860, 0x12481248); + reg->M60_MacControl = 0x12481248; - // M68 - Wb35Reg_WriteSync( pHwData, 0x0868, 0x00050900 ); // 20051018 0x000F0F00 ); // 940930 0x00131300 - pWb35Reg->M68_MacControl = 0x00050900; + /* M68 */ + Wb35Reg_WriteSync(pHwData, 0x0868, 0x00050900); + reg->M68_MacControl = 0x00050900; - // M98 - Wb35Reg_WriteSync( pHwData, 0x0898, 0xffff8888 ); - pWb35Reg->M98_MacControl = 0xffff8888; + /* M98 */ + Wb35Reg_WriteSync(pHwData, 0x0898, 0xffff8888); + reg->M98_MacControl = 0xffff8888; } -void Uxx_power_off_procedure( phw_data_t pHwData ) +void Uxx_power_off_procedure(struct hw_data *pHwData) { - // SW, PMU reset and turn off clock - Wb35Reg_WriteSync( pHwData, 0x03b0, 3 ); - Wb35Reg_WriteSync( pHwData, 0x03f0, 0xf9 ); + /* SW, PMU reset and turn off clock */ + Wb35Reg_WriteSync(pHwData, 0x03b0, 3); + Wb35Reg_WriteSync(pHwData, 0x03f0, 0xf9); } -//Decide the TxVga of every channel -void GetTxVgaFromEEPROM( phw_data_t pHwData ) +/*Decide the TxVga of every channel */ +void GetTxVgaFromEEPROM(struct hw_data *pHwData) { - u32 i, j, ltmp; - u16 Value[MAX_TXVGA_EEPROM]; - u8 *pctmp; - u8 ctmp=0; - - // Get the entire TxVga setting in EEPROM - for( i=0; i<MAX_TXVGA_EEPROM; i++ ) - { - Wb35Reg_WriteSync( pHwData, 0x03b4, 0x08100000 + 0x00010000*i ); - Wb35Reg_ReadSync( pHwData, 0x03b4, <mp ); - Value[i] = (u16)( ltmp & 0xffff ); // Get 16 bit available - Value[i] = cpu_to_le16( Value[i] ); // [7:0]2412 [7:0]2417 .... + u32 i, j, ltmp; + u16 Value[MAX_TXVGA_EEPROM]; + u8 *pctmp; + u8 ctmp = 0; + + /* Get the entire TxVga setting in EEPROM */ + for (i = 0; i < MAX_TXVGA_EEPROM; i++) { + Wb35Reg_WriteSync(pHwData, 0x03b4, 0x08100000 + 0x00010000 * i); + Wb35Reg_ReadSync(pHwData, 0x03b4, <mp); + Value[i] = (u16) (ltmp & 0xffff); /* Get 16 bit available */ + Value[i] = cpu_to_le16(Value[i]); /* [7:0]2412 [7:0]2417 .... */ } - // Adjust the filed which fills with reserved value. - pctmp = (u8 *)Value; - for( i=0; i<(MAX_TXVGA_EEPROM*2); i++ ) - { - if( pctmp[i] != 0xff ) + /* Adjust the filed which fills with reserved value. */ + pctmp = (u8 *) Value; + for (i = 0; i < (MAX_TXVGA_EEPROM * 2); i++) { + if (pctmp[i] != 0xff) ctmp = pctmp[i]; else pctmp[i] = ctmp; } - // Adjust WB_242 to WB_242_1 TxVga scale - if( pHwData->phy_type == RF_WB_242 ) - { - for( i=0; i<4; i++ ) // Only 2412 2437 2462 2484 case must be modified - { - for( j=0; j<(sizeof(w89rf242_txvga_old_mapping)/sizeof(w89rf242_txvga_old_mapping[0])); j++ ) - { - if( pctmp[i] < (u8)w89rf242_txvga_old_mapping[j][1] ) - { - pctmp[i] = (u8)w89rf242_txvga_old_mapping[j][0]; + /* Adjust WB_242 to WB_242_1 TxVga scale */ + if (pHwData->phy_type == RF_WB_242) { + for (i = 0; i < 4; i++) { /* Only 2412 2437 2462 2484 case must be modified */ + for (j = 0; j < ARRAY_SIZE(w89rf242_txvga_old_mapping); j++) { + if (pctmp[i] < (u8) w89rf242_txvga_old_mapping[j][1]) { + pctmp[i] = (u8) w89rf242_txvga_old_mapping[j][0]; break; } } - if( j == (sizeof(w89rf242_txvga_old_mapping)/sizeof(w89rf242_txvga_old_mapping[0])) ) + if (j == ARRAY_SIZE(w89rf242_txvga_old_mapping)) pctmp[i] = (u8)w89rf242_txvga_old_mapping[j-1][0]; } } - // 20060621 Add - memcpy( pHwData->TxVgaSettingInEEPROM, pctmp, MAX_TXVGA_EEPROM*2 ); //MAX_TXVGA_EEPROM is u16 count - EEPROMTxVgaAdjust( pHwData ); + memcpy(pHwData->TxVgaSettingInEEPROM, pctmp, MAX_TXVGA_EEPROM * 2); /* MAX_TXVGA_EEPROM is u16 count */ + EEPROMTxVgaAdjust(pHwData); } -// This function will affect the TxVga parameter in HAL. If hal_set_current_channel -// or RFSynthesizer_SetPowerIndex be called, new TxVga will take effect. -// TxVgaSettingInEEPROM of sHwData is an u8 array point to EEPROM contain for IS89C35 -// This function will use default TxVgaSettingInEEPROM data to calculate new TxVga. -void EEPROMTxVgaAdjust( phw_data_t pHwData ) // 20060619.5 Add +/* + * This function will affect the TxVga parameter in HAL. If hal_set_current_channel + * or RFSynthesizer_SetPowerIndex be called, new TxVga will take effect. + * TxVgaSettingInEEPROM of sHwData is an u8 array point to EEPROM contain for IS89C35 + * This function will use default TxVgaSettingInEEPROM data to calculate new TxVga. + */ +void EEPROMTxVgaAdjust(struct hw_data *pHwData) { - u8 * pTxVga = pHwData->TxVgaSettingInEEPROM; - s16 i, stmp; + u8 *pTxVga = pHwData->TxVgaSettingInEEPROM; + s16 i, stmp; - //-- 2.4G -- 20060704.2 Request from Tiger - //channel 1 ~ 5 + /* -- 2.4G -- */ + /* channel 1 ~ 5 */ stmp = pTxVga[1] - pTxVga[0]; - for( i=0; i<5; i++ ) - pHwData->TxVgaFor24[i] = pTxVga[0] + stmp*i/4; - //channel 6 ~ 10 + for (i = 0; i < 5; i++) + pHwData->TxVgaFor24[i] = pTxVga[0] + stmp * i / 4; + /* channel 6 ~ 10 */ stmp = pTxVga[2] - pTxVga[1]; - for( i=5; i<10; i++ ) - pHwData->TxVgaFor24[i] = pTxVga[1] + stmp*(i-5)/4; - //channel 11 ~ 13 + for (i = 5; i < 10; i++) + pHwData->TxVgaFor24[i] = pTxVga[1] + stmp * (i - 5) / 4; + /* channel 11 ~ 13 */ stmp = pTxVga[3] - pTxVga[2]; - for( i=10; i<13; i++ ) - pHwData->TxVgaFor24[i] = pTxVga[2] + stmp*(i-10)/2; - //channel 14 + for (i = 10; i < 13; i++) + pHwData->TxVgaFor24[i] = pTxVga[2] + stmp * (i - 10) / 2; + /* channel 14 */ pHwData->TxVgaFor24[13] = pTxVga[3]; - //-- 5G -- - if( pHwData->phy_type == RF_AIROHA_7230 ) - { - //channel 184 + /* -- 5G -- */ + if (pHwData->phy_type == RF_AIROHA_7230) { + /* channel 184 */ pHwData->TxVgaFor50[0].ChanNo = 184; pHwData->TxVgaFor50[0].TxVgaValue = pTxVga[4]; - //channel 196 + /* channel 196 */ pHwData->TxVgaFor50[3].ChanNo = 196; pHwData->TxVgaFor50[3].TxVgaValue = pTxVga[5]; - //interpolate + /* interpolate */ pHwData->TxVgaFor50[1].ChanNo = 188; pHwData->TxVgaFor50[2].ChanNo = 192; stmp = pTxVga[5] - pTxVga[4]; - pHwData->TxVgaFor50[2].TxVgaValue = pTxVga[5] - stmp/3; - pHwData->TxVgaFor50[1].TxVgaValue = pTxVga[5] - stmp*2/3; + pHwData->TxVgaFor50[2].TxVgaValue = pTxVga[5] - stmp / 3; + pHwData->TxVgaFor50[1].TxVgaValue = pTxVga[5] - stmp * 2 / 3; - //channel 16 + /* channel 16 */ pHwData->TxVgaFor50[6].ChanNo = 16; pHwData->TxVgaFor50[6].TxVgaValue = pTxVga[6]; pHwData->TxVgaFor50[4].ChanNo = 8; @@ -2523,7 +2193,7 @@ void EEPROMTxVgaAdjust( phw_data_t pHwData ) // 20060619.5 Add pHwData->TxVgaFor50[5].ChanNo = 12; pHwData->TxVgaFor50[5].TxVgaValue = pTxVga[6]; - //channel 36 + /* channel 36 */ pHwData->TxVgaFor50[8].ChanNo = 36; pHwData->TxVgaFor50[8].TxVgaValue = pTxVga[7]; pHwData->TxVgaFor50[7].ChanNo = 34; @@ -2531,153 +2201,128 @@ void EEPROMTxVgaAdjust( phw_data_t pHwData ) // 20060619.5 Add pHwData->TxVgaFor50[9].ChanNo = 38; pHwData->TxVgaFor50[9].TxVgaValue = pTxVga[7]; - //channel 40 + /* channel 40 */ pHwData->TxVgaFor50[10].ChanNo = 40; pHwData->TxVgaFor50[10].TxVgaValue = pTxVga[8]; - //channel 48 + /* channel 48 */ pHwData->TxVgaFor50[14].ChanNo = 48; pHwData->TxVgaFor50[14].TxVgaValue = pTxVga[9]; - //interpolate + /* interpolate */ pHwData->TxVgaFor50[11].ChanNo = 42; pHwData->TxVgaFor50[12].ChanNo = 44; pHwData->TxVgaFor50[13].ChanNo = 46; stmp = pTxVga[9] - pTxVga[8]; - pHwData->TxVgaFor50[13].TxVgaValue = pTxVga[9] - stmp/4; - pHwData->TxVgaFor50[12].TxVgaValue = pTxVga[9] - stmp*2/4; - pHwData->TxVgaFor50[11].TxVgaValue = pTxVga[9] - stmp*3/4; + pHwData->TxVgaFor50[13].TxVgaValue = pTxVga[9] - stmp / 4; + pHwData->TxVgaFor50[12].TxVgaValue = pTxVga[9] - stmp * 2 / 4; + pHwData->TxVgaFor50[11].TxVgaValue = pTxVga[9] - stmp * 3 / 4; - //channel 52 + /* channel 52 */ pHwData->TxVgaFor50[15].ChanNo = 52; pHwData->TxVgaFor50[15].TxVgaValue = pTxVga[10]; - //channel 64 + /* channel 64 */ pHwData->TxVgaFor50[18].ChanNo = 64; pHwData->TxVgaFor50[18].TxVgaValue = pTxVga[11]; - //interpolate + /* interpolate */ pHwData->TxVgaFor50[16].ChanNo = 56; pHwData->TxVgaFor50[17].ChanNo = 60; stmp = pTxVga[11] - pTxVga[10]; - pHwData->TxVgaFor50[17].TxVgaValue = pTxVga[11] - stmp/3; - pHwData->TxVgaFor50[16].TxVgaValue = pTxVga[11] - stmp*2/3; + pHwData->TxVgaFor50[17].TxVgaValue = pTxVga[11] - stmp / 3; + pHwData->TxVgaFor50[16].TxVgaValue = pTxVga[11] - stmp * 2 / 3; - //channel 100 + /* channel 100 */ pHwData->TxVgaFor50[19].ChanNo = 100; pHwData->TxVgaFor50[19].TxVgaValue = pTxVga[12]; - //channel 112 + /* channel 112 */ pHwData->TxVgaFor50[22].ChanNo = 112; pHwData->TxVgaFor50[22].TxVgaValue = pTxVga[13]; - //interpolate + /* interpolate */ pHwData->TxVgaFor50[20].ChanNo = 104; pHwData->TxVgaFor50[21].ChanNo = 108; stmp = pTxVga[13] - pTxVga[12]; - pHwData->TxVgaFor50[21].TxVgaValue = pTxVga[13] - stmp/3; - pHwData->TxVgaFor50[20].TxVgaValue = pTxVga[13] - stmp*2/3; + pHwData->TxVgaFor50[21].TxVgaValue = pTxVga[13] - stmp / 3; + pHwData->TxVgaFor50[20].TxVgaValue = pTxVga[13] - stmp * 2 / 3; - //channel 128 + /* channel 128 */ pHwData->TxVgaFor50[26].ChanNo = 128; pHwData->TxVgaFor50[26].TxVgaValue = pTxVga[14]; - //interpolate + /* interpolate */ pHwData->TxVgaFor50[23].ChanNo = 116; pHwData->TxVgaFor50[24].ChanNo = 120; pHwData->TxVgaFor50[25].ChanNo = 124; stmp = pTxVga[14] - pTxVga[13]; - pHwData->TxVgaFor50[25].TxVgaValue = pTxVga[14] - stmp/4; - pHwData->TxVgaFor50[24].TxVgaValue = pTxVga[14] - stmp*2/4; - pHwData->TxVgaFor50[23].TxVgaValue = pTxVga[14] - stmp*3/4; + pHwData->TxVgaFor50[25].TxVgaValue = pTxVga[14] - stmp / 4; + pHwData->TxVgaFor50[24].TxVgaValue = pTxVga[14] - stmp * 2 / 4; + pHwData->TxVgaFor50[23].TxVgaValue = pTxVga[14] - stmp * 3 / 4; - //channel 140 + /* channel 140 */ pHwData->TxVgaFor50[29].ChanNo = 140; pHwData->TxVgaFor50[29].TxVgaValue = pTxVga[15]; - //interpolate + /* interpolate */ pHwData->TxVgaFor50[27].ChanNo = 132; pHwData->TxVgaFor50[28].ChanNo = 136; stmp = pTxVga[15] - pTxVga[14]; - pHwData->TxVgaFor50[28].TxVgaValue = pTxVga[15] - stmp/3; - pHwData->TxVgaFor50[27].TxVgaValue = pTxVga[15] - stmp*2/3; + pHwData->TxVgaFor50[28].TxVgaValue = pTxVga[15] - stmp / 3; + pHwData->TxVgaFor50[27].TxVgaValue = pTxVga[15] - stmp * 2 / 3; - //channel 149 + /* channel 149 */ pHwData->TxVgaFor50[30].ChanNo = 149; pHwData->TxVgaFor50[30].TxVgaValue = pTxVga[16]; - //channel 165 + /* channel 165 */ pHwData->TxVgaFor50[34].ChanNo = 165; pHwData->TxVgaFor50[34].TxVgaValue = pTxVga[17]; - //interpolate + /* interpolate */ pHwData->TxVgaFor50[31].ChanNo = 153; pHwData->TxVgaFor50[32].ChanNo = 157; pHwData->TxVgaFor50[33].ChanNo = 161; stmp = pTxVga[17] - pTxVga[16]; - pHwData->TxVgaFor50[33].TxVgaValue = pTxVga[17] - stmp/4; - pHwData->TxVgaFor50[32].TxVgaValue = pTxVga[17] - stmp*2/4; - pHwData->TxVgaFor50[31].TxVgaValue = pTxVga[17] - stmp*3/4; + pHwData->TxVgaFor50[33].TxVgaValue = pTxVga[17] - stmp / 4; + pHwData->TxVgaFor50[32].TxVgaValue = pTxVga[17] - stmp * 2 / 4; + pHwData->TxVgaFor50[31].TxVgaValue = pTxVga[17] - stmp * 3 / 4; } - - #ifdef _PE_STATE_DUMP_ - WBDEBUG((" TxVgaFor24 : \n")); - DataDmp((u8 *)pHwData->TxVgaFor24, 14 ,0); - WBDEBUG((" TxVgaFor50 : \n")); - DataDmp((u8 *)pHwData->TxVgaFor50, 70 ,0); - #endif } -void BBProcessor_RateChanging( phw_data_t pHwData, u8 rate ) // 20060613.1 +void BBProcessor_RateChanging(struct hw_data *pHwData, u8 rate) { - PWB35REG pWb35Reg = &pHwData->Wb35Reg; - unsigned char Is11bRate; + struct wb35_reg *reg = &pHwData->reg; + unsigned char Is11bRate; Is11bRate = (rate % 6) ? 1 : 0; - switch( pHwData->phy_type ) - { - case RF_AIROHA_2230: - case RF_AIROHA_2230S: // 20060420 Add this - if( Is11bRate ) - { - if( (pWb35Reg->BB48 != BB48_DEFAULT_AL2230_11B) && - (pWb35Reg->BB4C != BB4C_DEFAULT_AL2230_11B) ) - { - Wb35Reg_Write( pHwData, 0x1048, BB48_DEFAULT_AL2230_11B ); - Wb35Reg_Write( pHwData, 0x104c, BB4C_DEFAULT_AL2230_11B ); - } + switch (pHwData->phy_type) { + case RF_AIROHA_2230: + case RF_AIROHA_2230S: + if (Is11bRate) { + if ((reg->BB48 != BB48_DEFAULT_AL2230_11B) && + (reg->BB4C != BB4C_DEFAULT_AL2230_11B)) { + Wb35Reg_Write(pHwData, 0x1048, BB48_DEFAULT_AL2230_11B); + Wb35Reg_Write(pHwData, 0x104c, BB4C_DEFAULT_AL2230_11B); } - else - { - if( (pWb35Reg->BB48 != BB48_DEFAULT_AL2230_11G) && - (pWb35Reg->BB4C != BB4C_DEFAULT_AL2230_11G) ) - { - Wb35Reg_Write( pHwData, 0x1048, BB48_DEFAULT_AL2230_11G ); - Wb35Reg_Write( pHwData, 0x104c, BB4C_DEFAULT_AL2230_11G ); - } + } else { + if ((reg->BB48 != BB48_DEFAULT_AL2230_11G) && + (reg->BB4C != BB4C_DEFAULT_AL2230_11G)) { + Wb35Reg_Write(pHwData, 0x1048, BB48_DEFAULT_AL2230_11G); + Wb35Reg_Write(pHwData, 0x104c, BB4C_DEFAULT_AL2230_11G); } - break; - - case RF_WB_242: // 20060623 The fix only for old TxVGA setting - if( Is11bRate ) - { - if( (pWb35Reg->BB48 != BB48_DEFAULT_WB242_11B) && - (pWb35Reg->BB4C != BB4C_DEFAULT_WB242_11B) ) - { - pWb35Reg->BB48 = BB48_DEFAULT_WB242_11B; - pWb35Reg->BB4C = BB4C_DEFAULT_WB242_11B; - Wb35Reg_Write( pHwData, 0x1048, BB48_DEFAULT_WB242_11B ); - Wb35Reg_Write( pHwData, 0x104c, BB4C_DEFAULT_WB242_11B ); - } + } + break; + case RF_WB_242: + if (Is11bRate) { + if ((reg->BB48 != BB48_DEFAULT_WB242_11B) && + (reg->BB4C != BB4C_DEFAULT_WB242_11B)) { + reg->BB48 = BB48_DEFAULT_WB242_11B; + reg->BB4C = BB4C_DEFAULT_WB242_11B; + Wb35Reg_Write(pHwData, 0x1048, BB48_DEFAULT_WB242_11B); + Wb35Reg_Write(pHwData, 0x104c, BB4C_DEFAULT_WB242_11B); } - else - { - if( (pWb35Reg->BB48 != BB48_DEFAULT_WB242_11G) && - (pWb35Reg->BB4C != BB4C_DEFAULT_WB242_11G) ) - { - pWb35Reg->BB48 = BB48_DEFAULT_WB242_11G; - pWb35Reg->BB4C = BB4C_DEFAULT_WB242_11G; - Wb35Reg_Write( pHwData, 0x1048, BB48_DEFAULT_WB242_11G ); - Wb35Reg_Write( pHwData, 0x104c, BB4C_DEFAULT_WB242_11G ); - } + } else { + if ((reg->BB48 != BB48_DEFAULT_WB242_11G) && + (reg->BB4C != BB4C_DEFAULT_WB242_11G)) { + reg->BB48 = BB48_DEFAULT_WB242_11G; + reg->BB4C = BB4C_DEFAULT_WB242_11G; + Wb35Reg_Write(pHwData, 0x1048, BB48_DEFAULT_WB242_11G); + Wb35Reg_Write(pHwData, 0x104c, BB4C_DEFAULT_WB242_11G); } - break; + } + break; } } - - - - - - diff --git a/drivers/staging/winbond/rxisr.c b/drivers/staging/winbond/rxisr.c deleted file mode 100644 index 18e942c9b82..00000000000 --- a/drivers/staging/winbond/rxisr.c +++ /dev/null @@ -1,30 +0,0 @@ -#include "os_common.h" - -void vRxTimerInit(PWB32_ADAPTER Adapter) -{ - OS_TIMER_INITIAL(&(Adapter->Mds.nTimer), (void*) RxTimerHandler, (void*) Adapter); -} - -void vRxTimerStart(PWB32_ADAPTER Adapter, int timeout_value) -{ - if (timeout_value<MIN_TIMEOUT_VAL) - timeout_value=MIN_TIMEOUT_VAL; - - OS_TIMER_SET( &(Adapter->Mds.nTimer), timeout_value ); -} - -void vRxTimerStop(PWB32_ADAPTER Adapter) -{ - OS_TIMER_CANCEL( &(Adapter->Mds.nTimer), 0 ); -} - -void RxTimerHandler_1a( PADAPTER Adapter) -{ - RxTimerHandler(NULL, Adapter, NULL, NULL); -} - -void RxTimerHandler(void* SystemSpecific1, PWB32_ADAPTER Adapter, - void* SystemSpecific2, void* SystemSpecific3) -{ - WARN_ON(1); -} diff --git a/drivers/staging/winbond/scan_s.h b/drivers/staging/winbond/scan_s.h deleted file mode 100644 index 1d1b0c4fec1..00000000000 --- a/drivers/staging/winbond/scan_s.h +++ /dev/null @@ -1,115 +0,0 @@ -// -// SCAN task global CONSTANTS, STRUCTURES, variables -// - -////////////////////////////////////////////////////////////////////////// -//define the msg type of SCAN module -#define SCANMSG_SCAN_REQ 0x01 -#define SCANMSG_BEACON 0x02 -#define SCANMSG_PROBE_RESPONSE 0x03 -#define SCANMSG_TIMEOUT 0x04 -#define SCANMSG_TXPROBE_FAIL 0x05 -#define SCANMSG_ENABLE_BGSCAN 0x06 -#define SCANMSG_STOP_SCAN 0x07 - -// BSS Type =>conform to -// IBSS : ToDS/FromDS = 00 -// Infrastructure : ToDS/FromDS = 01 -#define IBSS_NET 0 -#define ESS_NET 1 -#define ANYBSS_NET 2 - -// Scan Type -#define ACTIVE_SCAN 0 -#define PASSIVE_SCAN 1 - -/////////////////////////////////////////////////////////////////////////// -//Global data structures, Initial Scan & Background Scan -typedef struct _SCAN_REQ_PARA //mandatory parameters for SCAN request -{ - u32 ScanType; //passive/active scan - - CHAN_LIST sChannelList; // 86B - u8 reserved_1[2]; - - struct SSID_Element sSSID; // 34B. scan only for this SSID - u8 reserved_2[2]; - -} SCAN_REQ_PARA, *psSCAN_REQ_PARA; - -typedef struct _SCAN_PARAMETERS -{ - u16 wState; - u16 iCurrentChannelIndex; - - SCAN_REQ_PARA sScanReq; - - u8 BSSID[MAC_ADDR_LENGTH + 2]; //scan only for this BSSID - - u32 BssType; //scan only for this BSS type - - //struct SSID_Element sSSID; //scan only for this SSID - u16 ProbeDelay; - u16 MinChannelTime; - - u16 MaxChannelTime; - u16 reserved_1; - - s32 iBgScanPeriod; // XP: 5 sec - - u8 boBgScan; // Wb: enable BG scan, For XP, this value must be FALSE - u8 boFastScan; // Wb: reserved - u8 boCCAbusy; // Wb: HWMAC CCA busy status - u8 reserved_2; - - //NDIS_MINIPORT_TIMER nTimer; - OS_TIMER nTimer; - - u32 ScanTimeStamp; //Increase 1 per background scan(1 minute) - u32 BssTimeStamp; //Increase 1 per connect status check - u32 RxNumPerAntenna[2]; // - - u8 AntennaToggle; // - u8 boInTimerHandler; - u8 boTimerActive; // Wb: reserved - u8 boSave; - - u32 BScanEnable; // Background scan enable. Default is On - -} SCAN_PARAMETERS, *psSCAN_PARAMETERS; - -// Encapsulate 'Adapter' data structure -#define psSCAN (&(Adapter->sScanPara)) -#define psSCANREQ (&(Adapter->sScanPara.sScanReq)) - -//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -// scan.h -// Define the related definitions of scan module -// history -- 01/14/03' created -// -//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - -//Define the state of scan module -#define SCAN_INACTIVE 0 -#define WAIT_PROBE_DELAY 1 -#define WAIT_RESPONSE_MIN 2 -#define WAIT_RESPONSE_MAX_ACTIVE 3 -#define WAIT_BEACON_MAX_PASSIVE 4 -#define SCAN_COMPLETE 5 -#define BG_SCAN 6 -#define BG_SCANNING 7 - - -// The value will load from EEPROM -// If 0xff is set in EEPOM, the driver will use SCAN_MAX_CHNL_TIME instead. -// The definition is in WbHal.h -// #define SCAN_MAX_CHNL_TIME (50) - - - -// static functions - -//static void ScanTimerHandler(PWB32_ADAPTER Adapter); -//static void vScanTimerStart(PWB32_ADAPTER Adapter, int timeout_value); -//static void vScanTimerStop(PWB32_ADAPTER Adapter); - diff --git a/drivers/staging/winbond/sme_api.c b/drivers/staging/winbond/sme_api.c deleted file mode 100644 index 31c9673ea86..00000000000 --- a/drivers/staging/winbond/sme_api.c +++ /dev/null @@ -1,14 +0,0 @@ -//------------------------------------------------------------------------------------ -// sme_api.c -// -// Copyright(C) 2002 Winbond Electronics Corp. -// -// -//------------------------------------------------------------------------------------ -#include "os_common.h" - -s8 sme_get_rssi(void *pcore_data, s32 *prssi) -{ - BUG(); - return 0; -} diff --git a/drivers/staging/winbond/sme_api.h b/drivers/staging/winbond/sme_api.h index 745eb376bc7..652ae7085a5 100644 --- a/drivers/staging/winbond/sme_api.h +++ b/drivers/staging/winbond/sme_api.h @@ -2,60 +2,51 @@ * sme_api.h * * Copyright(C) 2002 Winbond Electronics Corp. - * - * modification history - * --------------------------------------------------------------------------- - * 1.00.001, 2003-04-21, Kevin created - * 1.00.002, 2003-05-14, PD43 & PE20 modified - * */ #ifndef __SME_API_H__ #define __SME_API_H__ -/****************** INCLUDE FILES SECTION ***********************************/ -//#include "GL\gl_core.h" +#include <linux/types.h> + +#include "localpara.h" /****************** CONSTANT AND MACRO SECTION ******************************/ -#define _INLINE __inline -#define MEDIA_STATE_DISCONNECTED 0 -#define MEDIA_STATE_CONNECTED 1 +#define MEDIA_STATE_DISCONNECTED 0 +#define MEDIA_STATE_CONNECTED 1 -//ARRAY CHECK -#define MAX_POWER_TO_DB 32 +/* ARRAY CHECK */ +#define MAX_POWER_TO_DB 32 /****************** TYPE DEFINITION SECTION *********************************/ /****************** EXPORTED FUNCTION DECLARATION SECTION *******************/ -// OID_802_11_BSSID +/* OID_802_11_BSSID */ s8 sme_get_bssid(void *pcore_data, u8 *pbssid); -s8 sme_get_desired_bssid(void *pcore_data, u8 *pbssid);//Not use +s8 sme_get_desired_bssid(void *pcore_data, u8 *pbssid); /* Unused */ s8 sme_set_desired_bssid(void *pcore_data, u8 *pbssid); -// OID_802_11_SSID +/* OID_802_11_SSID */ s8 sme_get_ssid(void *pcore_data, u8 *pssid, u8 *pssid_len); -s8 sme_get_desired_ssid(void *pcore_data, u8 *pssid, u8 *pssid_len);// Not use +s8 sme_get_desired_ssid(void *pcore_data, u8 *pssid, u8 *pssid_len);/* Unused */ s8 sme_set_desired_ssid(void *pcore_data, u8 *pssid, u8 ssid_len); -// OID_802_11_INFRASTRUCTURE_MODE +/* OID_802_11_INFRASTRUCTURE_MODE */ s8 sme_get_bss_type(void *pcore_data, u8 *pbss_type); -s8 sme_get_desired_bss_type(void *pcore_data, u8 *pbss_type);//Not use +s8 sme_get_desired_bss_type(void *pcore_data, u8 *pbss_type); /* Unused */ s8 sme_set_desired_bss_type(void *pcore_data, u8 bss_type); -// OID_802_11_FRAGMENTATION_THRESHOLD +/* OID_802_11_FRAGMENTATION_THRESHOLD */ s8 sme_get_fragment_threshold(void *pcore_data, u32 *pthreshold); s8 sme_set_fragment_threshold(void *pcore_data, u32 threshold); -// OID_802_11_RTS_THRESHOLD +/* OID_802_11_RTS_THRESHOLD */ s8 sme_get_rts_threshold(void *pcore_data, u32 *pthreshold); s8 sme_set_rts_threshold(void *pcore_data, u32 threshold); -// OID_802_11_RSSI -s8 sme_get_rssi(void *pcore_data, s32 *prssi); - -// OID_802_11_CONFIGURATION +/* OID_802_11_CONFIGURATION */ s8 sme_get_beacon_period(void *pcore_data, u16 *pbeacon_period); s8 sme_set_beacon_period(void *pcore_data, u16 beacon_period); @@ -66,116 +57,69 @@ s8 sme_get_current_channel(void *pcore_data, u8 *pcurrent_channel); s8 sme_get_current_band(void *pcore_data, u8 *pcurrent_band); s8 sme_set_current_channel(void *pcore_data, u8 current_channel); -// OID_802_11_BSSID_LIST +/* OID_802_11_BSSID_LIST */ s8 sme_get_scan_bss_count(void *pcore_data, u8 *pcount); s8 sme_get_scan_bss(void *pcore_data, u8 index, void **ppbss); s8 sme_get_connected_bss(void *pcore_data, void **ppbss_now); -// OID_802_11_AUTHENTICATION_MODE +/* OID_802_11_AUTHENTICATION_MODE */ s8 sme_get_auth_mode(void *pcore_data, u8 *pauth_mode); s8 sme_set_auth_mode(void *pcore_data, u8 auth_mode); -// OID_802_11_WEP_STATUS / OID_802_11_ENCRYPTION_STATUS +/* OID_802_11_WEP_STATUS / OID_802_11_ENCRYPTION_STATUS */ s8 sme_get_wep_mode(void *pcore_data, u8 *pwep_mode); s8 sme_set_wep_mode(void *pcore_data, u8 wep_mode); -//s8 sme_get_encryption_status(void *pcore_data, u8 *pstatus); -//s8 sme_set_encryption_status(void *pcore_data, u8 status); -// ??????????????????????????????????????? - -// OID_GEN_VENDOR_ID -// OID_802_3_PERMANENT_ADDRESS +/* OID_GEN_VENDOR_ID */ +/* OID_802_3_PERMANENT_ADDRESS */ s8 sme_get_permanent_mac_addr(void *pcore_data, u8 *pmac_addr); -// OID_802_3_CURRENT_ADDRESS +/* OID_802_3_CURRENT_ADDRESS */ s8 sme_get_current_mac_addr(void *pcore_data, u8 *pmac_addr); -// OID_802_11_NETWORK_TYPE_IN_USE +/* OID_802_11_NETWORK_TYPE_IN_USE */ s8 sme_get_network_type_in_use(void *pcore_data, u8 *ptype); s8 sme_set_network_type_in_use(void *pcore_data, u8 type); -// OID_802_11_SUPPORTED_RATES +/* OID_802_11_SUPPORTED_RATES */ s8 sme_get_supported_rate(void *pcore_data, u8 *prates); -// OID_802_11_ADD_WEP -//12/29/03' wkchen +/* OID_802_11_ADD_WEP */ s8 sme_set_add_wep(void *pcore_data, u32 key_index, u32 key_len, u8 *Address, u8 *key); -// OID_802_11_REMOVE_WEP +/* OID_802_11_REMOVE_WEP */ s8 sme_set_remove_wep(void *pcre_data, u32 key_index); -// OID_802_11_DISASSOCIATE +/* OID_802_11_DISASSOCIATE */ s8 sme_set_disassociate(void *pcore_data); -// OID_802_11_POWER_MODE +/* OID_802_11_POWER_MODE */ s8 sme_get_power_mode(void *pcore_data, u8 *pmode); s8 sme_set_power_mode(void *pcore_data, u8 mode); -// OID_802_11_BSSID_LIST_SCAN +/* OID_802_11_BSSID_LIST_SCAN */ s8 sme_set_bssid_list_scan(void *pcore_data, void *pscan_para); -// OID_802_11_RELOAD_DEFAULTS +/* OID_802_11_RELOAD_DEFAULTS */ s8 sme_set_reload_defaults(void *pcore_data, u8 reload_type); -// The following SME API functions are used for WPA -// -// Mandatory OIDs for WPA -// - -// OID_802_11_ADD_KEY -//s8 sme_set_add_key(void *pcore_data, NDIS_802_11_KEY *pkey); - -// OID_802_11_REMOVE_KEY -//s8 sme_set_remove_key(void *pcore_data, NDIS_802_11_REMOVE_KEY *pkey); - -// OID_802_11_ASSOCIATION_INFORMATION -//s8 sme_set_association_information(void *pcore_data, -// NDIS_802_11_ASSOCIATION_INFORMATION *pinfo); - -// OID_802_11_TEST -//s8 sme_set_test(void *pcore_data, NDIS_802_11_TEST *ptest_data); - -//--------------------------------------------------------------------------// -/* -// The left OIDs - -// OID_802_11_NETWORK_TYPES_SUPPORTED -// OID_802_11_TX_POWER_LEVEL -// OID_802_11_RSSI_TRIGGER -// OID_802_11_NUMBER_OF_ANTENNAS -// OID_802_11_RX_ANTENNA_SELECTED -// OID_802_11_TX_ANTENNA_SELECTED -// OID_802_11_STATISTICS -// OID_802_11_DESIRED_RATES -// OID_802_11_PRIVACY_FILTER - -*/ - -/*------------------------- none-standard ----------------------------------*/ +/*------------------------- non-standard ----------------------------------*/ s8 sme_get_connect_status(void *pcore_data, u8 *pstatus); - -/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ -//s8 sme_get_scan_type(void *pcore_data, u8 *pscan_type); -//s8 sme_set_scan_type(void *pcore_data, u8 scan_type); - -//s8 sme_get_scan_channel_list(void *pcore_data, u8 *pscan_type); -//s8 sme_set_scan_channel_list(void *pcore_data, u8 scan_type); - +/*--------------------------------------------------------------------------*/ void sme_get_encryption_status(void *pcore_data, u8 *EncryptStatus); void sme_set_encryption_status(void *pcore_data, u8 EncryptStatus); -s8 sme_add_key(void *pcore_data, - u32 key_index, - u8 key_len, - u8 key_type, - u8 *key_bssid, - //u8 *key_rsc, - u8 *ptx_tsc, - u8 *prx_tsc, - u8 *key_material); +s8 sme_add_key(void *pcore_data, + u32 key_index, + u8 key_len, + u8 key_type, + u8 *key_bssid, + u8 *ptx_tsc, + u8 *prx_tsc, + u8 *key_material); void sme_remove_default_key(void *pcore_data, int index); void sme_remove_mapping_key(void *pcore_data, u8 *pmac_addr); void sme_clear_all_mapping_key(void *pcore_data); @@ -193,10 +137,8 @@ s8 sme_set_txrate_policy(void *pcore_data, u8 policy); s8 sme_get_txrate_policy(void *pcore_data, u8 *policy); s8 sme_get_cwmin_value(void *pcore_data, u8 *cwmin); s8 sme_get_cwmax_value(void *pcore_data, u16 *cwmax); -s8 sme_get_ms_radio_mode(void *pcore_data, u8 * pMsRadioOff); +s8 sme_get_ms_radio_mode(void *pcore_data, u8 *pMsRadioOff); s8 sme_set_ms_radio_mode(void *pcore_data, u8 boMsRadioOff); -s8 sme_get_radio_mode(void *pcore_data, psRadioOff pRadioOffData); -s8 sme_set_radio_mode(void *pcore_data, RadioOff RadioOffData); void sme_get_tx_power_level(void *pcore_data, u32 *TxPower); u8 sme_set_tx_power_level(void *pcore_data, u32 TxPower); @@ -205,61 +147,45 @@ void sme_get_rx_antenna(void *pcore_data, u32 *RxAntenna); u8 sme_set_rx_antenna(void *pcore_data, u32 RxAntenna); void sme_get_tx_antenna(void *pcore_data, u32 *TxAntenna); s8 sme_set_tx_antenna(void *pcore_data, u32 TxAntenna); -s8 sme_set_IBSS_chan(void *pcore_data, ChanInfo chan); - -//20061108 WPS +s8 sme_set_IBSS_chan(void *pcore_data, struct chan_info chan); s8 sme_set_IE_append(void *pcore_data, u8 *buffer, u16 buf_len); - - - -//================== Local functions ====================== -//#ifdef _HSINCHU -//void drv_translate_rssi(); // HW RSSI bit -> NDIS RSSI representation -//void drv_translate_bss_description(); // Local bss desc -> NDIS bss desc -//void drv_translate_channel(u8 NetworkType, u8 ChannelNumber, u32 *freq); // channel number -> channel /freq. -//#endif _HSINCHU -// -static const u32 PowerDbToMw[] = -{ - 56, //mW, MAX - 0, 17.5 dbm - 40, //mW, MAX - 1, 16.0 dbm - 30, //mW, MAX - 2, 14.8 dbm - 20, //mW, MAX - 3, 13.0 dbm - 15, //mW, MAX - 4, 11.8 dbm - 12, //mW, MAX - 5, 10.6 dbm - 9, //mW, MAX - 6, 9.4 dbm - 7, //mW, MAX - 7, 8.3 dbm - 5, //mW, MAX - 8, 6.4 dbm - 4, //mW, MAX - 9, 5.3 dbm - 3, //mW, MAX - 10, 4.0 dbm - 2, //mW, MAX - 11, ? dbm - 2, //mW, MAX - 12, ? dbm - 2, //mW, MAX - 13, ? dbm - 2, //mW, MAX - 14, ? dbm - 2, //mW, MAX - 15, ? dbm - 2, //mW, MAX - 16, ? dbm - 2, //mW, MAX - 17, ? dbm - 2, //mW, MAX - 18, ? dbm - 1, //mW, MAX - 19, ? dbm - 1, //mW, MAX - 20, ? dbm - 1, //mW, MAX - 21, ? dbm - 1, //mW, MAX - 22, ? dbm - 1, //mW, MAX - 23, ? dbm - 1, //mW, MAX - 24, ? dbm - 1, //mW, MAX - 25, ? dbm - 1, //mW, MAX - 26, ? dbm - 1, //mW, MAX - 27, ? dbm - 1, //mW, MAX - 28, ? dbm - 1, //mW, MAX - 29, ? dbm - 1, //mW, MAX - 30, ? dbm - 1 //mW, MAX - 31, ? dbm +/* ================== Local functions ====================== */ +static const u32 PowerDbToMw[] = { + 56, /* mW, MAX - 0, 17.5 dbm */ + 40, /* mW, MAX - 1, 16.0 dbm */ + 30, /* mW, MAX - 2, 14.8 dbm */ + 20, /* mW, MAX - 3, 13.0 dbm */ + 15, /* mW, MAX - 4, 11.8 dbm */ + 12, /* mW, MAX - 5, 10.6 dbm */ + 9, /* mW, MAX - 6, 9.4 dbm */ + 7, /* mW, MAX - 7, 8.3 dbm */ + 5, /* mW, MAX - 8, 6.4 dbm */ + 4, /* mW, MAX - 9, 5.3 dbm */ + 3, /* mW, MAX - 10, 4.0 dbm */ + 2, /* mW, MAX - 11, ? dbm */ + 2, /* mW, MAX - 12, ? dbm */ + 2, /* mW, MAX - 13, ? dbm */ + 2, /* mW, MAX - 14, ? dbm */ + 2, /* mW, MAX - 15, ? dbm */ + 2, /* mW, MAX - 16, ? dbm */ + 2, /* mW, MAX - 17, ? dbm */ + 2, /* mW, MAX - 18, ? dbm */ + 1, /* mW, MAX - 19, ? dbm */ + 1, /* mW, MAX - 20, ? dbm */ + 1, /* mW, MAX - 21, ? dbm */ + 1, /* mW, MAX - 22, ? dbm */ + 1, /* mW, MAX - 23, ? dbm */ + 1, /* mW, MAX - 24, ? dbm */ + 1, /* mW, MAX - 25, ? dbm */ + 1, /* mW, MAX - 26, ? dbm */ + 1, /* mW, MAX - 27, ? dbm */ + 1, /* mW, MAX - 28, ? dbm */ + 1, /* mW, MAX - 29, ? dbm */ + 1, /* mW, MAX - 30, ? dbm */ + 1 /* mW, MAX - 31, ? dbm */ }; - - - - #endif /* __SME_API_H__ */ diff --git a/drivers/staging/winbond/sme_s.h b/drivers/staging/winbond/sme_s.h deleted file mode 100644 index dfd2fbc4ede..00000000000 --- a/drivers/staging/winbond/sme_s.h +++ /dev/null @@ -1,228 +0,0 @@ -// -// SME_S.H - -// SME task global CONSTANTS, STRUCTURES, variables -// - -////////////////////////////////////////////////////////////////////////// -//define the msg type of SME module -// 0x00~0x1F : MSG from GUI dispatch -// 0x20~0x3F : MSG from MLME -// 0x40~0x5F : MSG from SCAN -// 0x60~0x6F : MSG from TX/RX -// 0x70~0x7F : MSG from ROAMING -// 0x80~0x8F : MSG from ISR -// 0x90 : MSG TimeOut - -// from GUI -#define SMEMSG_SCAN_REQ 0x01 -//#define SMEMSG_PASSIVE_SCAN_REQ 0x02 -#define SMEMSG_JOIN_REQ 0x03 -#define SMEMSG_START_IBSS 0x04 -#define SMEMSG_DISCONNECT_REQ 0x05 -#define SMEMSG_AUTHEN_REQ 0x06 -#define SMEMSG_DEAUTHEN_REQ 0x07 -#define SMEMSG_ASSOC_REQ 0x08 -#define SMEMSG_REASSOC_REQ 0x09 -#define SMEMSG_DISASSOC_REQ 0x0a -#define SMEMSG_POWERSAVE_REQ 0x0b - - -// from MLME -#define SMEMSG_AUTHEN_CFM 0x21 -#define SMEMSG_AUTHEN_IND 0x22 -#define SMEMSG_ASSOC_CFM 0x23 -#define SMEMSG_DEAUTHEN_IND 0x24 -#define SMEMSG_DISASSOC_IND 0x25 -// from SCAN -#define SMEMSG_SCAN_CFM 0x41 -#define SMEMSG_START_IBSS_CFM 0x42 -// from MTO, function call to set SME parameters - -// 0x60~0x6F : MSG from TX/RX -//#define SMEMSG_IBSS_JOIN_UPDATE_BSSID 0x61 -#define SMEMSG_COUNTERMEASURE_MICFAIL_TIMEOUT 0x62 -#define SMEMSG_COUNTERMEASURE_BLOCK_TIMEOUT 0x63 -// from ROAMING -#define SMEMSG_HANDOVER_JOIN_REQ 0x71 -#define SMEMSG_END_ROAMING 0x72 -#define SMEMSG_SCAN_JOIN_REQ 0x73 -// from ISR -#define SMEMSG_TSF_SYNC_IND 0x81 -// from TimeOut -#define SMEMSG_TIMEOUT 0x91 - - - -#define MAX_PMKID_Accunt 16 -//@added by ws 04/22/05 -#define Cipher_Disabled 0 -#define Cipher_Wep 1 -#define Cipher_Tkip 2 -#define Cipher_Ccmp 4 - - -/////////////////////////////////////////////////////////////////////////// -//Constants - -/////////////////////////////////////////////////////////////////////////// -//Global data structures - -#define NUMOFWEPENTRIES 64 - -typedef enum _WEPKeyMode -{ - WEPKEY_DISABLED = 0, - WEPKEY_64 = 1, - WEPKEY_128 = 2 - -} WEPKEYMODE, *pWEPKEYMODE; - -#ifdef _WPA2_ - -typedef struct _BSSInfo -{ - u8 PreAuthBssID[6]; - PMKID pmkid_value; -}BSSID_Info; - -typedef struct _PMKID_Table //added by ws 05/05/04 -{ - u32 Length; - u32 BSSIDInfoCount; - BSSID_Info BSSIDInfo[16]; - -} PMKID_Table; - -#endif //end def _WPA2_ - -#define MAX_BASIC_RATE_SET 15 -#define MAX_OPT_RATE_SET MAX_BASIC_RATE_SET - - -typedef struct _SME_PARAMETERS -{ - u16 wState; - u8 boDUTmode; - u8 bDesiredPowerSave; - - // SME timer and timeout value - //NDIS_MINIPORT_TIMER nTimer; - OS_TIMER nTimer; - - u8 boInTimerHandler; - u8 boAuthRetryActive; - u8 reserved_0[2]; - - u32 AuthenRetryTimerVal; // NOTE: Assoc don't fail timeout - u32 JoinFailTimerVal; // 10*Beacon-Interval - - //Rates - u8 BSSBasicRateSet[(MAX_BASIC_RATE_SET + 3) & ~0x03 ]; // BSS basic rate set - u8 OperationalRateSet[(MAX_OPT_RATE_SET + 3) & ~0x03 ]; // Operational rate set - - u8 NumOfBSSBasicRate; - u8 NumOfOperationalRate; - u8 reserved_1[2]; - - u32 BasicRateBitmap; - u32 OpRateBitmap; - - // System parameters Set by GUI - //-------------------- start IBSS parameter ---------------------------// - u32 boStartIBSS; //Start IBSS toggle - - u16 wBeaconPeriod; - u16 wATIM_Window; - - ChanInfo IbssChan; // 2B //channel setting when start IBSS - u8 reserved_2[2]; - - // Join related - u16 wDesiredJoinBSS; // BSS index which desire to join - u8 boJoinReq; //Join request toggle - u8 bDesiredBSSType; //for Join request - - u16 wCapabilityInfo; // Used when invoking the MLME_Associate_request(). - u16 wNonERPcapabilityInfo; - - struct SSID_Element sDesiredSSID; // 34 B - u8 reserved_3[2]; - - u8 abDesiredBSSID[MAC_ADDR_LENGTH + 2]; - - u8 bJoinScanCount; // the time of scan-join action need to do - u8 bDesiredAuthMode; // AUTH_OPEN_SYSTEM or AUTH_SHARED_KEY - u8 reserved_4[2]; - - // Encryption parameters - u8 _dot11PrivacyInvoked; - u8 _dot11PrivacyOptionImplemented; - u8 reserved_5[2]; - - //@ ws added - u8 DesiredEncrypt; - u8 encrypt_status; //ENCRYPT_DISABLE, ENCRYPT_WEP, ENCRYPT_WEP_NOKEY, ENCRYPT_TKIP, ... - u8 key_length; - u8 pairwise_key_ok; - - u8 group_key_ok; - u8 wpa_ok; // indicate the control port of 802.1x is open or close - u8 pairwise_key_type; - u8 group_key_type; - - u32 _dot11WEPDefaultKeyID; - - u8 tx_mic_key[8]; // TODO: 0627 kevin-TKIP - u8 rx_mic_key[8]; // TODO: 0627 kevin-TKIP - u8 group_tx_mic_key[8]; - u8 group_rx_mic_key[8]; - -// #ifdef _WPA_ - u8 AssocReqVarIE[200]; - u8 AssocRespVarIE[200]; - - u16 AssocReqVarLen; - u16 AssocRespVarLen; - u8 boReassoc; //use assoc. or reassoc. - u8 reserved_6[3]; - u16 AssocRespCapability; - u16 AssocRespStatus; -// #endif - - #ifdef _WPA2_ - u8 PmkIdTable[256]; - u32 PmkidTableIndex; - #endif //end def _WPA2_ - -} SME_PARAMETERS, *PSME_PARAMETERS; - -#define psSME (&(Adapter->sSmePara)) - -#define wSMEGetCurrentSTAState(Adapter) ((u16)(Adapter)->sSmePara.wState) - - - -//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -// SmeModule.h -// Define the related definitions of SME module -// history -- 01/14/03' created -// -//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - -//Define the state of SME module -#define DISABLED 0 -#define INIT_SCAN 1 -#define SCAN_READY 2 -#define START_IBSS 3 -#define JOIN_PENDING 4 -#define JOIN_CFM 5 -#define AUTHENTICATE_PENDING 6 -#define AUTHENTICATED 7 -#define CONNECTED 8 -//#define EAP_STARTING 9 -//#define EAPOL_AUTHEN_PENDING 10 -//#define SECURE_CONNECTED 11 - - -// Static function - diff --git a/drivers/staging/winbond/wb35_ver.h b/drivers/staging/winbond/wb35_ver.h deleted file mode 100644 index 2433bc07300..00000000000 --- a/drivers/staging/winbond/wb35_ver.h +++ /dev/null @@ -1,30 +0,0 @@ -// -// Only define one of follow -// - -#ifdef WB_WIN - #define VER_FILEVERSION 1,00,47,00 - #define VER_FILEVERSION_STR "1.00.47.00" - #define WB32_DRIVER_MAJOR_VERSION 0x0100 - #define WB32_DRIVER_MINOR_VERSION 0x4700 -#endif - -#ifdef WB_CE - #define VER_FILEVERSION 2,00,47,00 - #define VER_FILEVERSION_STR "2.00.47.00" - #define WB32_DRIVER_MAJOR_VERSION 0x0200 - #define WB32_DRIVER_MINOR_VERSION 0x4700 -#endif - -#ifdef WB_LINUX - #define VER_FILEVERSION 3,00,47,00 - #define VER_FILEVERSION_STR "3.00.47.00" - #define WB32_DRIVER_MAJOR_VERSION 0x0300 - #define WB32_DRIVER_MINOR_VERSION 0x4700 -#endif - - - - - - diff --git a/drivers/staging/winbond/wb35reg.c b/drivers/staging/winbond/wb35reg.c new file mode 100644 index 00000000000..bbc5ddcce6f --- /dev/null +++ b/drivers/staging/winbond/wb35reg.c @@ -0,0 +1,806 @@ +#include "wb35reg_f.h" +#include "phy_calibration.h" + +#include <linux/usb.h> +#include <linux/slab.h> + +/* + * true : read command process successfully + * false : register not support + * RegisterNo : start base + * pRegisterData : data point + * NumberOfData : number of register data + * Flag : AUTO_INCREMENT - RegisterNo will auto increment 4 + * NO_INCREMENT - Function will write data into the same register + */ +unsigned char Wb35Reg_BurstWrite(struct hw_data *pHwData, u16 RegisterNo, + u32 *pRegisterData, u8 NumberOfData, u8 Flag) +{ + struct wb35_reg *reg = &pHwData->reg; + struct urb *urb = NULL; + struct wb35_reg_queue *reg_queue = NULL; + u16 UrbSize; + struct usb_ctrlrequest *dr; + u16 i, DataSize = NumberOfData * 4; + + /* Module shutdown */ + if (pHwData->SurpriseRemove) + return false; + + /* Trying to use burst write function if use new hardware */ + UrbSize = sizeof(struct wb35_reg_queue) + DataSize + sizeof(struct usb_ctrlrequest); + reg_queue = kzalloc(UrbSize, GFP_ATOMIC); + if (reg_queue == NULL) + return false; + + urb = usb_alloc_urb(0, GFP_ATOMIC); + if (urb == NULL) { + kfree(reg_queue); + return false; + } + + reg_queue->DIRECT = 2; /* burst write register */ + reg_queue->INDEX = RegisterNo; + reg_queue->pBuffer = (u32 *)((u8 *)reg_queue + sizeof(struct wb35_reg_queue)); + memcpy(reg_queue->pBuffer, pRegisterData, DataSize); + /* the function for reversing register data from little endian to big endian */ + for (i = 0; i < NumberOfData; i++) + reg_queue->pBuffer[i] = cpu_to_le32(reg_queue->pBuffer[i]); + + dr = (struct usb_ctrlrequest *)((u8 *)reg_queue + sizeof(struct wb35_reg_queue) + DataSize); + dr->bRequestType = USB_TYPE_VENDOR | USB_DIR_OUT | USB_RECIP_DEVICE; + dr->bRequest = 0x04; /* USB or vendor-defined request code, burst mode */ + dr->wValue = cpu_to_le16(Flag); /* 0: Register number auto-increment, 1: No auto increment */ + dr->wIndex = cpu_to_le16(RegisterNo); + dr->wLength = cpu_to_le16(DataSize); + reg_queue->Next = NULL; + reg_queue->pUsbReq = dr; + reg_queue->urb = urb; + + spin_lock_irq(®->EP0VM_spin_lock); + if (reg->reg_first == NULL) + reg->reg_first = reg_queue; + else + reg->reg_last->Next = reg_queue; + reg->reg_last = reg_queue; + + spin_unlock_irq(®->EP0VM_spin_lock); + + /* Start EP0VM */ + Wb35Reg_EP0VM_start(pHwData); + + return true; +} + +void Wb35Reg_Update(struct hw_data *pHwData, u16 RegisterNo, u32 RegisterValue) +{ + struct wb35_reg *reg = &pHwData->reg; + switch (RegisterNo) { + case 0x3b0: + reg->U1B0 = RegisterValue; + break; + case 0x3bc: + reg->U1BC_LEDConfigure = RegisterValue; + break; + case 0x400: + reg->D00_DmaControl = RegisterValue; + break; + case 0x800: + reg->M00_MacControl = RegisterValue; + break; + case 0x804: + reg->M04_MulticastAddress1 = RegisterValue; + break; + case 0x808: + reg->M08_MulticastAddress2 = RegisterValue; + break; + case 0x824: + reg->M24_MacControl = RegisterValue; + break; + case 0x828: + reg->M28_MacControl = RegisterValue; + break; + case 0x82c: + reg->M2C_MacControl = RegisterValue; + break; + case 0x838: + reg->M38_MacControl = RegisterValue; + break; + case 0x840: + reg->M40_MacControl = RegisterValue; + break; + case 0x844: + reg->M44_MacControl = RegisterValue; + break; + case 0x848: + reg->M48_MacControl = RegisterValue; + break; + case 0x84c: + reg->M4C_MacStatus = RegisterValue; + break; + case 0x860: + reg->M60_MacControl = RegisterValue; + break; + case 0x868: + reg->M68_MacControl = RegisterValue; + break; + case 0x870: + reg->M70_MacControl = RegisterValue; + break; + case 0x874: + reg->M74_MacControl = RegisterValue; + break; + case 0x878: + reg->M78_ERPInformation = RegisterValue; + break; + case 0x87C: + reg->M7C_MacControl = RegisterValue; + break; + case 0x880: + reg->M80_MacControl = RegisterValue; + break; + case 0x884: + reg->M84_MacControl = RegisterValue; + break; + case 0x888: + reg->M88_MacControl = RegisterValue; + break; + case 0x898: + reg->M98_MacControl = RegisterValue; + break; + case 0x100c: + reg->BB0C = RegisterValue; + break; + case 0x102c: + reg->BB2C = RegisterValue; + break; + case 0x1030: + reg->BB30 = RegisterValue; + break; + case 0x103c: + reg->BB3C = RegisterValue; + break; + case 0x1048: + reg->BB48 = RegisterValue; + break; + case 0x104c: + reg->BB4C = RegisterValue; + break; + case 0x1050: + reg->BB50 = RegisterValue; + break; + case 0x1054: + reg->BB54 = RegisterValue; + break; + case 0x1058: + reg->BB58 = RegisterValue; + break; + case 0x105c: + reg->BB5C = RegisterValue; + break; + case 0x1060: + reg->BB60 = RegisterValue; + break; + } +} + +/* + * true : read command process successfully + * false : register not support + */ +unsigned char Wb35Reg_WriteSync(struct hw_data *pHwData, u16 RegisterNo, + u32 RegisterValue) +{ + struct wb35_reg *reg = &pHwData->reg; + int ret = -1; + + /* Module shutdown */ + if (pHwData->SurpriseRemove) + return false; + + RegisterValue = cpu_to_le32(RegisterValue); + + /* update the register by send usb message */ + reg->SyncIoPause = 1; + + /* Wait until EP0VM stop */ + while (reg->EP0vm_state != VM_STOP) + msleep(10); + + /* Sync IoCallDriver */ + reg->EP0vm_state = VM_RUNNING; + ret = usb_control_msg(pHwData->udev, + usb_sndctrlpipe(pHwData->udev, 0), + 0x03, + USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_OUT, + 0x0, RegisterNo, &RegisterValue, 4, HZ * 100); + reg->EP0vm_state = VM_STOP; + reg->SyncIoPause = 0; + + Wb35Reg_EP0VM_start(pHwData); + + if (ret < 0) { + pr_debug("EP0 Write register usb message sending error\n"); + pHwData->SurpriseRemove = 1; + return false; + } + return true; +} + +/* + * true : read command process successfully + * false : register not support + */ +unsigned char Wb35Reg_Write(struct hw_data *pHwData, u16 RegisterNo, + u32 RegisterValue) +{ + struct wb35_reg *reg = &pHwData->reg; + struct usb_ctrlrequest *dr; + struct urb *urb = NULL; + struct wb35_reg_queue *reg_queue = NULL; + u16 UrbSize; + + /* Module shutdown */ + if (pHwData->SurpriseRemove) + return false; + + /* update the register by send urb request */ + UrbSize = sizeof(struct wb35_reg_queue) + sizeof(struct usb_ctrlrequest); + reg_queue = kzalloc(UrbSize, GFP_ATOMIC); + if (reg_queue == NULL) + return false; + + urb = usb_alloc_urb(0, GFP_ATOMIC); + if (urb == NULL) { + kfree(reg_queue); + return false; + } + + reg_queue->DIRECT = 1; /* burst write register */ + reg_queue->INDEX = RegisterNo; + reg_queue->VALUE = cpu_to_le32(RegisterValue); + reg_queue->RESERVED_VALID = false; + dr = (struct usb_ctrlrequest *)((u8 *)reg_queue + sizeof(struct wb35_reg_queue)); + dr->bRequestType = USB_TYPE_VENDOR | USB_DIR_OUT | USB_RECIP_DEVICE; + dr->bRequest = 0x03; /* USB or vendor-defined request code, burst mode */ + dr->wValue = cpu_to_le16(0x0); + dr->wIndex = cpu_to_le16(RegisterNo); + dr->wLength = cpu_to_le16(4); + + /* Enter the sending queue */ + reg_queue->Next = NULL; + reg_queue->pUsbReq = dr; + reg_queue->urb = urb; + + spin_lock_irq(®->EP0VM_spin_lock); + if (reg->reg_first == NULL) + reg->reg_first = reg_queue; + else + reg->reg_last->Next = reg_queue; + reg->reg_last = reg_queue; + + spin_unlock_irq(®->EP0VM_spin_lock); + + /* Start EP0VM */ + Wb35Reg_EP0VM_start(pHwData); + + return true; +} + +/* + * This command will be executed with a user defined value. When it completes, + * this value is useful. For example, hal_set_current_channel will use it. + * true : read command process successfully + * false : register not supported + */ +unsigned char Wb35Reg_WriteWithCallbackValue(struct hw_data *pHwData, + u16 RegisterNo, + u32 RegisterValue, + s8 *pValue, + s8 Len) +{ + struct wb35_reg *reg = &pHwData->reg; + struct usb_ctrlrequest *dr; + struct urb *urb = NULL; + struct wb35_reg_queue *reg_queue = NULL; + u16 UrbSize; + + /* Module shutdown */ + if (pHwData->SurpriseRemove) + return false; + + /* update the register by send urb request */ + UrbSize = sizeof(struct wb35_reg_queue) + sizeof(struct usb_ctrlrequest); + reg_queue = kzalloc(UrbSize, GFP_ATOMIC); + if (reg_queue == NULL) + return false; + + urb = usb_alloc_urb(0, GFP_ATOMIC); + if (urb == NULL) { + kfree(reg_queue); + return false; + } + + reg_queue->DIRECT = 1; /* burst write register */ + reg_queue->INDEX = RegisterNo; + reg_queue->VALUE = cpu_to_le32(RegisterValue); + /* NOTE : Users must guarantee the size of value will not exceed the buffer size. */ + memcpy(reg_queue->RESERVED, pValue, Len); + reg_queue->RESERVED_VALID = true; + dr = (struct usb_ctrlrequest *)((u8 *)reg_queue + sizeof(struct wb35_reg_queue)); + dr->bRequestType = USB_TYPE_VENDOR | USB_DIR_OUT | USB_RECIP_DEVICE; + dr->bRequest = 0x03; /* USB or vendor-defined request code, burst mode */ + dr->wValue = cpu_to_le16(0x0); + dr->wIndex = cpu_to_le16(RegisterNo); + dr->wLength = cpu_to_le16(4); + + /* Enter the sending queue */ + reg_queue->Next = NULL; + reg_queue->pUsbReq = dr; + reg_queue->urb = urb; + spin_lock_irq(®->EP0VM_spin_lock); + if (reg->reg_first == NULL) + reg->reg_first = reg_queue; + else + reg->reg_last->Next = reg_queue; + reg->reg_last = reg_queue; + + spin_unlock_irq(®->EP0VM_spin_lock); + + /* Start EP0VM */ + Wb35Reg_EP0VM_start(pHwData); + + return true; +} + +/* + * true : read command process successfully + * false : register not support + * pRegisterValue : It must be a resident buffer due to + * asynchronous read register. + */ +unsigned char Wb35Reg_ReadSync(struct hw_data *pHwData, u16 RegisterNo, + u32 *pRegisterValue) +{ + struct wb35_reg *reg = &pHwData->reg; + u32 *pltmp = pRegisterValue; + int ret = -1; + + /* Module shutdown */ + if (pHwData->SurpriseRemove) + return false; + + /* Read the register by send usb message */ + reg->SyncIoPause = 1; + + /* Wait until EP0VM stop */ + while (reg->EP0vm_state != VM_STOP) + msleep(10); + + reg->EP0vm_state = VM_RUNNING; + ret = usb_control_msg(pHwData->udev, + usb_rcvctrlpipe(pHwData->udev, 0), + 0x01, + USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_IN, + 0x0, RegisterNo, pltmp, 4, HZ * 100); + + *pRegisterValue = cpu_to_le32(*pltmp); + + reg->EP0vm_state = VM_STOP; + + Wb35Reg_Update(pHwData, RegisterNo, *pRegisterValue); + reg->SyncIoPause = 0; + + Wb35Reg_EP0VM_start(pHwData); + + if (ret < 0) { + pr_debug("EP0 Read register usb message sending error\n"); + pHwData->SurpriseRemove = 1; + return false; + } + return true; +} + +/* + * true : read command process successfully + * false : register not support + * pRegisterValue : It must be a resident buffer due to + * asynchronous read register. + */ +unsigned char Wb35Reg_Read(struct hw_data *pHwData, u16 RegisterNo, + u32 *pRegisterValue) +{ + struct wb35_reg *reg = &pHwData->reg; + struct usb_ctrlrequest *dr; + struct urb *urb; + struct wb35_reg_queue *reg_queue; + u16 UrbSize; + + /* Module shutdown */ + if (pHwData->SurpriseRemove) + return false; + + /* update the variable by send Urb to read register */ + UrbSize = sizeof(struct wb35_reg_queue) + sizeof(struct usb_ctrlrequest); + reg_queue = kzalloc(UrbSize, GFP_ATOMIC); + if (reg_queue == NULL) + return false; + + urb = usb_alloc_urb(0, GFP_ATOMIC); + if (urb == NULL) { + kfree(reg_queue); + return false; + } + reg_queue->DIRECT = 0; /* read register */ + reg_queue->INDEX = RegisterNo; + reg_queue->pBuffer = pRegisterValue; + dr = (struct usb_ctrlrequest *)((u8 *)reg_queue + sizeof(struct wb35_reg_queue)); + dr->bRequestType = USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_IN; + dr->bRequest = 0x01; /* USB or vendor-defined request code, burst mode */ + dr->wValue = cpu_to_le16(0x0); + dr->wIndex = cpu_to_le16(RegisterNo); + dr->wLength = cpu_to_le16(4); + + /* Enter the sending queue */ + reg_queue->Next = NULL; + reg_queue->pUsbReq = dr; + reg_queue->urb = urb; + spin_lock_irq(®->EP0VM_spin_lock); + if (reg->reg_first == NULL) + reg->reg_first = reg_queue; + else + reg->reg_last->Next = reg_queue; + reg->reg_last = reg_queue; + + spin_unlock_irq(®->EP0VM_spin_lock); + + /* Start EP0VM */ + Wb35Reg_EP0VM_start(pHwData); + + return true; +} + + +void Wb35Reg_EP0VM_start(struct hw_data *pHwData) +{ + struct wb35_reg *reg = &pHwData->reg; + + if (atomic_inc_return(®->RegFireCount) == 1) { + reg->EP0vm_state = VM_RUNNING; + Wb35Reg_EP0VM(pHwData); + } else + atomic_dec(®->RegFireCount); +} + +void Wb35Reg_EP0VM(struct hw_data *pHwData) +{ + struct wb35_reg *reg = &pHwData->reg; + struct urb *urb; + struct usb_ctrlrequest *dr; + u32 *pBuffer; + int ret = -1; + struct wb35_reg_queue *reg_queue; + + + if (reg->SyncIoPause) + goto cleanup; + + if (pHwData->SurpriseRemove) + goto cleanup; + + /* Get the register data and send to USB through Irp */ + spin_lock_irq(®->EP0VM_spin_lock); + reg_queue = reg->reg_first; + spin_unlock_irq(®->EP0VM_spin_lock); + + if (!reg_queue) + goto cleanup; + + /* Get an Urb, send it */ + urb = (struct urb *)reg_queue->urb; + + dr = reg_queue->pUsbReq; + urb = reg_queue->urb; + pBuffer = reg_queue->pBuffer; + if (reg_queue->DIRECT == 1) /* output */ + pBuffer = ®_queue->VALUE; + + usb_fill_control_urb(urb, pHwData->udev, + REG_DIRECTION(pHwData->udev, reg_queue), + (u8 *)dr, pBuffer, cpu_to_le16(dr->wLength), + Wb35Reg_EP0VM_complete, (void *)pHwData); + + reg->EP0vm_state = VM_RUNNING; + + ret = usb_submit_urb(urb, GFP_ATOMIC); + + if (ret < 0) { + pr_debug("EP0 Irp sending error\n"); + goto cleanup; + } + return; + + cleanup: + reg->EP0vm_state = VM_STOP; + atomic_dec(®->RegFireCount); +} + + +void Wb35Reg_EP0VM_complete(struct urb *urb) +{ + struct hw_data *pHwData = (struct hw_data *)urb->context; + struct wb35_reg *reg = &pHwData->reg; + struct wb35_reg_queue *reg_queue; + + + /* Variable setting */ + reg->EP0vm_state = VM_COMPLETED; + reg->EP0VM_status = urb->status; + + if (pHwData->SurpriseRemove) { /* Let WbWlanHalt to handle surprise remove */ + reg->EP0vm_state = VM_STOP; + atomic_dec(®->RegFireCount); + } else { + /* Complete to send, remove the URB from the first */ + spin_lock_irq(®->EP0VM_spin_lock); + reg_queue = reg->reg_first; + if (reg_queue == reg->reg_last) + reg->reg_last = NULL; + reg->reg_first = reg->reg_first->Next; + spin_unlock_irq(®->EP0VM_spin_lock); + + if (reg->EP0VM_status) { + pr_debug("EP0 IoCompleteRoutine return error\n"); + reg->EP0vm_state = VM_STOP; + pHwData->SurpriseRemove = 1; + } else { + /* Success. Update the result */ + + /* Start the next send */ + Wb35Reg_EP0VM(pHwData); + } + + kfree(reg_queue); + } + + usb_free_urb(urb); +} + + +void Wb35Reg_destroy(struct hw_data *pHwData) +{ + struct wb35_reg *reg = &pHwData->reg; + struct urb *urb; + struct wb35_reg_queue *reg_queue; + + Uxx_power_off_procedure(pHwData); + + /* Wait for Reg operation completed */ + do { + msleep(10); /* Delay for waiting function enter */ + } while (reg->EP0vm_state != VM_STOP); + msleep(10); /* Delay for waiting function enter */ + + /* Release all the data in RegQueue */ + spin_lock_irq(®->EP0VM_spin_lock); + reg_queue = reg->reg_first; + while (reg_queue) { + if (reg_queue == reg->reg_last) + reg->reg_last = NULL; + reg->reg_first = reg->reg_first->Next; + + urb = reg_queue->urb; + spin_unlock_irq(®->EP0VM_spin_lock); + if (urb) { + usb_free_urb(urb); + kfree(reg_queue); + } else { + pr_debug("EP0 queue release error\n"); + } + spin_lock_irq(®->EP0VM_spin_lock); + + reg_queue = reg->reg_first; + } + spin_unlock_irq(®->EP0VM_spin_lock); +} + +/* + * ======================================================================= + * The function can be run in passive-level only. + * ========================================================================= + */ +unsigned char Wb35Reg_initial(struct hw_data *pHwData) +{ + struct wb35_reg *reg = &pHwData->reg; + u32 ltmp; + u32 SoftwareSet, VCO_trim, TxVga, Region_ScanInterval; + + /* Spin lock is acquired for read and write IRP command */ + spin_lock_init(®->EP0VM_spin_lock); + + /* Getting RF module type from EEPROM */ + Wb35Reg_WriteSync(pHwData, 0x03b4, 0x080d0000); /* Start EEPROM access + Read + address(0x0d) */ + Wb35Reg_ReadSync(pHwData, 0x03b4, <mp); + + /* Update RF module type and determine the PHY type by inf or EEPROM */ + reg->EEPROMPhyType = (u8)(ltmp & 0xff); + /* + * 0 V MAX2825, 1 V MAX2827, 2 V MAX2828, 3 V MAX2829 + * 16V AL2230, 17 - AL7230, 18 - AL2230S + * 32 Reserved + * 33 - W89RF242(TxVGA 0~19), 34 - W89RF242(TxVGA 0~34) + */ + if (reg->EEPROMPhyType != RF_DECIDE_BY_INF) { + if ((reg->EEPROMPhyType == RF_MAXIM_2825) || + (reg->EEPROMPhyType == RF_MAXIM_2827) || + (reg->EEPROMPhyType == RF_MAXIM_2828) || + (reg->EEPROMPhyType == RF_MAXIM_2829) || + (reg->EEPROMPhyType == RF_MAXIM_V1) || + (reg->EEPROMPhyType == RF_AIROHA_2230) || + (reg->EEPROMPhyType == RF_AIROHA_2230S) || + (reg->EEPROMPhyType == RF_AIROHA_7230) || + (reg->EEPROMPhyType == RF_WB_242) || + (reg->EEPROMPhyType == RF_WB_242_1)) + pHwData->phy_type = reg->EEPROMPhyType; + } + + /* Power On procedure running. The relative parameter will be set according to phy_type */ + Uxx_power_on_procedure(pHwData); + + /* Reading MAC address */ + Uxx_ReadEthernetAddress(pHwData); + + /* Read VCO trim for RF parameter */ + Wb35Reg_WriteSync(pHwData, 0x03b4, 0x08200000); + Wb35Reg_ReadSync(pHwData, 0x03b4, &VCO_trim); + + /* Read Antenna On/Off of software flag */ + Wb35Reg_WriteSync(pHwData, 0x03b4, 0x08210000); + Wb35Reg_ReadSync(pHwData, 0x03b4, &SoftwareSet); + + /* Read TXVGA */ + Wb35Reg_WriteSync(pHwData, 0x03b4, 0x08100000); + Wb35Reg_ReadSync(pHwData, 0x03b4, &TxVga); + + /* Get Scan interval setting from EEPROM offset 0x1c */ + Wb35Reg_WriteSync(pHwData, 0x03b4, 0x081d0000); + Wb35Reg_ReadSync(pHwData, 0x03b4, &Region_ScanInterval); + + /* Update Ethernet address */ + memcpy(pHwData->CurrentMacAddress, pHwData->PermanentMacAddress, ETH_ALEN); + + /* Update software variable */ + pHwData->SoftwareSet = (u16)(SoftwareSet & 0xffff); + TxVga &= 0x000000ff; + pHwData->PowerIndexFromEEPROM = (u8)TxVga; + pHwData->VCO_trim = (u8)VCO_trim & 0xff; + if (pHwData->VCO_trim == 0xff) + pHwData->VCO_trim = 0x28; + + reg->EEPROMRegion = (u8)(Region_ScanInterval >> 8); + if (reg->EEPROMRegion < 1 || reg->EEPROMRegion > 6) + reg->EEPROMRegion = REGION_AUTO; + + /* For Get Tx VGA from EEPROM */ + GetTxVgaFromEEPROM(pHwData); + + /* Set Scan Interval */ + pHwData->Scan_Interval = (u8)(Region_ScanInterval & 0xff) * 10; + if ((pHwData->Scan_Interval == 2550) || (pHwData->Scan_Interval < 10)) /* Is default setting 0xff * 10 */ + pHwData->Scan_Interval = SCAN_MAX_CHNL_TIME; + + /* Initial register */ + RFSynthesizer_initial(pHwData); + + BBProcessor_initial(pHwData); /* Async write, must wait until complete */ + + Wb35Reg_phy_calibration(pHwData); + + Mxx_initial(pHwData); + Dxx_initial(pHwData); + + if (pHwData->SurpriseRemove) + return false; + else + return true; /* Initial fail */ +} + +/* + * ================================================================ + * CardComputeCrc -- + * + * Description: + * Runs the AUTODIN II CRC algorithm on the buffers Buffer length. + * + * Arguments: + * Buffer - the input buffer + * Length - the length of Buffer + * + * Return Value: + * The 32-bit CRC value. + * =================================================================== + */ +u32 CardComputeCrc(u8 *Buffer, u32 Length) +{ + u32 Crc, Carry; + u32 i, j; + u8 CurByte; + + Crc = 0xffffffff; + + for (i = 0; i < Length; i++) { + CurByte = Buffer[i]; + for (j = 0; j < 8; j++) { + Carry = ((Crc & 0x80000000) ? 1 : 0) ^ (CurByte & 0x01); + Crc <<= 1; + CurByte >>= 1; + if (Carry) + Crc = (Crc ^ 0x04c11db6) | Carry; + } + } + return Crc; +} + + +/* + * ================================================================== + * BitReverse -- + * Reverse the bits in the input argument, dwData, which is + * regarded as a string of bits with the length, DataLength. + * + * Arguments: + * dwData : + * DataLength : + * + * Return: + * The converted value. + * ================================================================== + */ +u32 BitReverse(u32 dwData, u32 DataLength) +{ + u32 HalfLength, i, j; + u32 BitA, BitB; + + if (DataLength <= 0) + return 0; /* No conversion is done. */ + dwData = dwData & (0xffffffff >> (32 - DataLength)); + + HalfLength = DataLength / 2; + for (i = 0, j = DataLength - 1; i < HalfLength; i++, j--) { + BitA = GetBit(dwData, i); + BitB = GetBit(dwData, j); + if (BitA && !BitB) { + dwData = ClearBit(dwData, i); + dwData = SetBit(dwData, j); + } else if (!BitA && BitB) { + dwData = SetBit(dwData, i); + dwData = ClearBit(dwData, j); + } else { + /* Do nothing since these two bits are of the save values. */ + } + } + return dwData; +} + +void Wb35Reg_phy_calibration(struct hw_data *pHwData) +{ + u32 BB3c, BB54; + + if ((pHwData->phy_type == RF_WB_242) || + (pHwData->phy_type == RF_WB_242_1)) { + phy_calibration_winbond(pHwData, 2412); /* Sync operation */ + Wb35Reg_ReadSync(pHwData, 0x103c, &BB3c); + Wb35Reg_ReadSync(pHwData, 0x1054, &BB54); + + pHwData->BB3c_cal = BB3c; + pHwData->BB54_cal = BB54; + + RFSynthesizer_initial(pHwData); + BBProcessor_initial(pHwData); /* Async operation */ + + Wb35Reg_WriteSync(pHwData, 0x103c, BB3c); + Wb35Reg_WriteSync(pHwData, 0x1054, BB54); + } +} + + diff --git a/drivers/staging/winbond/wb35reg_f.h b/drivers/staging/winbond/wb35reg_f.h new file mode 100644 index 00000000000..95dc9809684 --- /dev/null +++ b/drivers/staging/winbond/wb35reg_f.h @@ -0,0 +1,65 @@ +#ifndef __WINBOND_WB35REG_F_H +#define __WINBOND_WB35REG_F_H + +#include "wbhal.h" + +/* + * ==================================== + * Interface function declare + * ==================================== + */ +unsigned char Wb35Reg_initial(struct hw_data *hw_data); +void Uxx_power_on_procedure(struct hw_data *hw_data); +void Uxx_power_off_procedure(struct hw_data *hw_data); +void Uxx_ReadEthernetAddress(struct hw_data *hw_data); +void Dxx_initial(struct hw_data *hw_data); +void Mxx_initial(struct hw_data *hw_data); +void RFSynthesizer_initial(struct hw_data *hw_data); +void RFSynthesizer_SwitchingChannel(struct hw_data *hw_data, struct chan_info channel); +void BBProcessor_initial(struct hw_data *hw_data); +void BBProcessor_RateChanging(struct hw_data *hw_data, u8 rate); +u8 RFSynthesizer_SetPowerIndex(struct hw_data *hw_data, u8 power_index); +u8 RFSynthesizer_SetMaxim2828_24Power(struct hw_data *, u8 index); +u8 RFSynthesizer_SetMaxim2828_50Power(struct hw_data *, u8 index); +u8 RFSynthesizer_SetMaxim2827_24Power(struct hw_data *, u8 index); +u8 RFSynthesizer_SetMaxim2827_50Power(struct hw_data *, u8 index); +u8 RFSynthesizer_SetMaxim2825Power(struct hw_data *, u8 index); +u8 RFSynthesizer_SetAiroha2230Power(struct hw_data *, u8 index); +u8 RFSynthesizer_SetAiroha7230Power(struct hw_data *, u8 index); +u8 RFSynthesizer_SetWinbond242Power(struct hw_data *, u8 index); +void GetTxVgaFromEEPROM(struct hw_data *hw_data); +void EEPROMTxVgaAdjust(struct hw_data *hw_data); + +#define RFWriteControlData(_A, _V) Wb35Reg_Write(_A, 0x0864, _V) + +void Wb35Reg_destroy(struct hw_data *hw_data); + +unsigned char Wb35Reg_Read(struct hw_data *hw_data, u16 register_no, u32 *register_value); +unsigned char Wb35Reg_ReadSync(struct hw_data *hw_data, u16 register_no, u32 *register_value); +unsigned char Wb35Reg_Write(struct hw_data *hw_data, u16 register_no, u32 register_value); +unsigned char Wb35Reg_WriteSync(struct hw_data *hw_data, u16 register_no, u32 register_value); +unsigned char Wb35Reg_WriteWithCallbackValue(struct hw_data *hw_data, + u16 register_no, + u32 register_value, + s8 *value, + s8 len); +unsigned char Wb35Reg_BurstWrite(struct hw_data *hw_data, + u16 register_no, + u32 *register_data, + u8 number_of_data, + u8 flag); + +void Wb35Reg_EP0VM(struct hw_data *hw_data); +void Wb35Reg_EP0VM_start(struct hw_data *hw_data); +void Wb35Reg_EP0VM_complete(struct urb *urb); + +u32 BitReverse(u32 data, u32 data_length); + +void CardGetMulticastBit(u8 address[MAC_ADDR_LENGTH], u8 *byte, u8 *value); +u32 CardComputeCrc(u8 *buffer, u32 length); + +void Wb35Reg_phy_calibration(struct hw_data *hw_data); +void Wb35Reg_Update(struct hw_data *hw_data, u16 register_no, u32 register_value); +unsigned char adjust_TXVGA_for_iq_mag(struct hw_data *hw_data); + +#endif diff --git a/drivers/staging/winbond/wb35reg_s.h b/drivers/staging/winbond/wb35reg_s.h new file mode 100644 index 00000000000..dc79faa4029 --- /dev/null +++ b/drivers/staging/winbond/wb35reg_s.h @@ -0,0 +1,240 @@ +#ifndef __WINBOND_WB35REG_S_H +#define __WINBOND_WB35REG_S_H + +#include <linux/spinlock.h> +#include <linux/types.h> +#include <linux/atomic.h> + +struct hw_data; + +/* ========================================================================= + * + * HAL setting function + * + * ======================================== + * |Uxx| |Dxx| |Mxx| |BB| |RF| + * ======================================== + * | | + * Wb35Reg_Read Wb35Reg_Write + * + * ---------------------------------------- + * WbUsb_CallUSBDASync supplied By WbUsb module + * ========================================================================== + */ +#define GetBit(dwData, i) (dwData & (0x00000001 << i)) +#define SetBit(dwData, i) (dwData | (0x00000001 << i)) +#define ClearBit(dwData, i) (dwData & ~(0x00000001 << i)) + +#define IGNORE_INCREMENT 0 +#define AUTO_INCREMENT 0 +#define NO_INCREMENT 1 +#define REG_DIRECTION(_x, _y) ((_y)->DIRECT == 0 ? usb_rcvctrlpipe(_x, 0) : usb_sndctrlpipe(_x, 0)) +#define REG_BUF_SIZE(_x) ((_x)->bRequest == 0x04 ? cpu_to_le16((_x)->wLength) : 4) + +#define BB48_DEFAULT_AL2230_11B 0x0033447c +#define BB4C_DEFAULT_AL2230_11B 0x0A00FEFF +#define BB48_DEFAULT_AL2230_11G 0x00332C1B +#define BB4C_DEFAULT_AL2230_11G 0x0A00FEFF + + +#define BB48_DEFAULT_WB242_11B 0x00292315 /* backoff 2dB */ +#define BB4C_DEFAULT_WB242_11B 0x0800FEFF /* backoff 2dB */ +#define BB48_DEFAULT_WB242_11G 0x00453B24 +#define BB4C_DEFAULT_WB242_11G 0x0E00FEFF + +/* + * ==================================== + * Default setting for Mxx + * ==================================== + */ +#define DEFAULT_CWMIN 31 /* (M2C) CWmin. Its value is in the range 0-31. */ +#define DEFAULT_CWMAX 1023 /* (M2C) CWmax. Its value is in the range 0-1023. */ +#define DEFAULT_AID 1 /* (M34) AID. Its value is in the range 1-2007. */ + +#define DEFAULT_RATE_RETRY_LIMIT 2 /* (M38) as named */ + +#define DEFAULT_LONG_RETRY_LIMIT 7 /* (M38) LongRetryLimit. Its value is in the range 0-15. */ +#define DEFAULT_SHORT_RETRY_LIMIT 7 /* (M38) ShortRetryLimit. Its value is in the range 0-15. */ +#define DEFAULT_PIFST 25 /* (M3C) PIFS Time. Its value is in the range 0-65535. */ +#define DEFAULT_EIFST 354 /* (M3C) EIFS Time. Its value is in the range 0-1048575. */ +#define DEFAULT_DIFST 45 /* (M3C) DIFS Time. Its value is in the range 0-65535. */ +#define DEFAULT_SIFST 5 /* (M3C) SIFS Time. Its value is in the range 0-65535. */ +#define DEFAULT_OSIFST 10 /* (M3C) Original SIFS Time. Its value is in the range 0-15. */ +#define DEFAULT_ATIMWD 0 /* (M40) ATIM Window. Its value is in the range 0-65535. */ +#define DEFAULT_SLOT_TIME 20 /* (M40) ($) SlotTime. Its value is in the range 0-255. */ +#define DEFAULT_MAX_TX_MSDU_LIFE_TIME 512 /* (M44) MaxTxMSDULifeTime. Its value is in the range 0-4294967295. */ +#define DEFAULT_BEACON_INTERVAL 500 /* (M48) Beacon Interval. Its value is in the range 0-65535. */ +#define DEFAULT_PROBE_DELAY_TIME 200 /* (M48) Probe Delay Time. Its value is in the range 0-65535. */ +#define DEFAULT_PROTOCOL_VERSION 0 /* (M4C) */ +#define DEFAULT_MAC_POWER_STATE 2 /* (M4C) 2: MAC at power active */ +#define DEFAULT_DTIM_ALERT_TIME 0 + + +struct wb35_reg_queue { + struct urb *urb; + void *pUsbReq; + void *Next; + union { + u32 VALUE; + u32 *pBuffer; + }; + u8 RESERVED[4]; /* space reserved for communication */ + u16 INDEX; /* For storing the register index */ + u8 RESERVED_VALID; /* Indicate whether the RESERVED space is valid at this command. */ + u8 DIRECT; /* 0:In 1:Out */ +}; + +/* + * ==================================== + * Internal variable for module + * ==================================== + */ +#define MAX_SQ3_FILTER_SIZE 5 +struct wb35_reg { + /* + * ============================ + * Register Bank backup + * ============================ + */ + u32 U1B0; /* bit16 record the h/w radio on/off status */ + u32 U1BC_LEDConfigure; + u32 D00_DmaControl; + u32 M00_MacControl; + union { + struct { + u32 M04_MulticastAddress1; + u32 M08_MulticastAddress2; + }; + u8 Multicast[8]; /* contents of card multicast registers */ + }; + + u32 M24_MacControl; + u32 M28_MacControl; + u32 M2C_MacControl; + u32 M38_MacControl; + u32 M3C_MacControl; + u32 M40_MacControl; + u32 M44_MacControl; + u32 M48_MacControl; + u32 M4C_MacStatus; + u32 M60_MacControl; + u32 M68_MacControl; + u32 M70_MacControl; + u32 M74_MacControl; + u32 M78_ERPInformation; + u32 M7C_MacControl; + u32 M80_MacControl; + u32 M84_MacControl; + u32 M88_MacControl; + u32 M98_MacControl; + + /* Baseband register */ + u32 BB0C; /* Used for LNA calculation */ + u32 BB2C; + u32 BB30; /* 11b acquisition control register */ + u32 BB3C; + u32 BB48; + u32 BB4C; + u32 BB50; /* mode control register */ + u32 BB54; + u32 BB58; /* IQ_ALPHA */ + u32 BB5C; /* For test */ + u32 BB60; /* for WTO read value */ + + /* VM */ + spinlock_t EP0VM_spin_lock; /* 4B */ + u32 EP0VM_status; /* $$ */ + struct wb35_reg_queue *reg_first; + struct wb35_reg_queue *reg_last; + atomic_t RegFireCount; + + /* Hardware status */ + u8 EP0vm_state; + u8 mac_power_save; + u8 EEPROMPhyType; /* + * 0 ~ 15 for Maxim (0 ĄV MAX2825, 1 ĄV MAX2827, 2 ĄV MAX2828, 3 ĄV MAX2829), + * 16 ~ 31 for Airoha (16 ĄV AL2230, 11 - AL7230) + * 32 ~ Reserved + * 33 ~ 47 For WB242 ( 33 - WB242, 34 - WB242 with new Txvga 0.5 db step) + * 48 ~ 255 ARE RESERVED. + */ + u8 EEPROMRegion; /* Region setting in EEPROM */ + + u32 SyncIoPause; /* If user use the Sync Io to access Hw, then pause the async access */ + + u8 LNAValue[4]; /* Table for speed up running */ + u32 SQ3_filter[MAX_SQ3_FILTER_SIZE]; + u32 SQ3_index; +}; + +/* ===================================================================== + * Function declaration + * ===================================================================== + */ +void hal_remove_mapping_key(struct hw_data *hw_data, u8 *mac_addr); +void hal_remove_default_key(struct hw_data *hw_data, u32 index); +unsigned char hal_set_mapping_key(struct hw_data *adapter, u8 *mac_addr, + u8 null_key, u8 wep_on, u8 *tx_tsc, + u8 *rx_tsc, u8 key_type, u8 key_len, + u8 *key_data); +unsigned char hal_set_default_key(struct hw_data *adapter, u8 index, + u8 null_key, u8 wep_on, u8 *tx_tsc, + u8 *rx_tsc, u8 key_type, u8 key_len, + u8 *key_data); +void hal_clear_all_default_key(struct hw_data *hw_data); +void hal_clear_all_group_key(struct hw_data *hw_data); +void hal_clear_all_mapping_key(struct hw_data *hw_data); +void hal_clear_all_key(struct hw_data *hw_data); +void hal_set_power_save_mode(struct hw_data *hw_data, unsigned char power_save, + unsigned char wakeup, unsigned char dtim); +void hal_get_power_save_mode(struct hw_data *hw_data, u8 *in_pwr_save); +void hal_set_slot_time(struct hw_data *hw_data, u8 type); + +#define hal_set_atim_window(_A, _ATM) + +void hal_start_bss(struct hw_data *hw_data, u8 mac_op_mode); + +/* 0:BSS STA 1:IBSS STA */ +void hal_join_request(struct hw_data *hw_data, u8 bss_type); + +void hal_stop_sync_bss(struct hw_data *hw_data); +void hal_resume_sync_bss(struct hw_data *hw_data); +void hal_set_aid(struct hw_data *hw_data, u16 aid); +void hal_set_bssid(struct hw_data *hw_data, u8 *bssid); +void hal_get_bssid(struct hw_data *hw_data, u8 *bssid); +void hal_set_listen_interval(struct hw_data *hw_data, u16 listen_interval); +void hal_set_cap_info(struct hw_data *hw_data, u16 capability_info); +void hal_set_ssid(struct hw_data *hw_data, u8 *ssid, u8 ssid_len); +void hal_start_tx0(struct hw_data *hw_data); + +#define hal_get_cwmin(_A) ((_A)->cwmin) + +void hal_set_cwmax(struct hw_data *hw_data, u16 cwin_max); + +#define hal_get_cwmax(_A) ((_A)->cwmax) + +void hal_set_rsn_wpa(struct hw_data *hw_data, u32 *rsn_ie_bitmap, + u32 *rsn_oui_type , unsigned char desired_auth_mode); +void hal_set_connect_info(struct hw_data *hw_data, unsigned char bo_connect); +u8 hal_get_est_sq3(struct hw_data *hw_data, u8 count); +void hal_descriptor_indicate(struct hw_data *hw_data, + struct wb35_descriptor *des); +u8 hal_get_antenna_number(struct hw_data *hw_data); +u32 hal_get_bss_pk_cnt(struct hw_data *hw_data); + +#define hal_get_region_from_EEPROM(_A) ((_A)->reg.EEPROMRegion) +#define hal_get_tx_buffer(_A, _B) Wb35Tx_get_tx_buffer(_A, _B) +#define hal_software_set(_A) (_A->SoftwareSet) +#define hal_driver_init_OK(_A) (_A->IsInitOK) +#define hal_rssi_boundary_high(_A) (_A->RSSI_high) +#define hal_rssi_boundary_low(_A) (_A->RSSI_low) +#define hal_scan_interval(_A) (_A->Scan_Interval) + +#define PHY_DEBUG(msg, args...) + +/* return 100ms count */ +#define hal_get_time_count(_P) (_P->time_count / 10) + +#define hal_ibss_disconnect(_A) (hal_stop_sync_bss(_A)) + +#endif diff --git a/drivers/staging/winbond/wb35rx.c b/drivers/staging/winbond/wb35rx.c new file mode 100644 index 00000000000..f006b166aeb --- /dev/null +++ b/drivers/staging/winbond/wb35rx.c @@ -0,0 +1,358 @@ +/* + * ============================================================================ + * Copyright (c) 1996-2002 Winbond Electronic Corporation + * + * Module Name: + * Wb35Rx.c + * + * Abstract: + * Processing the Rx message from down layer + * + * ============================================================================ + */ +#include <linux/usb.h> +#include <linux/slab.h> + +#include "core.h" +#include "wb35rx_f.h" + +static void packet_came(struct ieee80211_hw *hw, char *pRxBufferAddress, + int PacketSize) +{ + struct wbsoft_priv *priv = hw->priv; + struct sk_buff *skb; + struct ieee80211_rx_status rx_status = {0}; + + if (!priv->enabled) + return; + + skb = dev_alloc_skb(PacketSize); + if (!skb) { + printk("Not enough memory for packet, FIXME\n"); + return; + } + + memcpy(skb_put(skb, PacketSize), pRxBufferAddress, PacketSize); + + memcpy(IEEE80211_SKB_RXCB(skb), &rx_status, sizeof(rx_status)); + ieee80211_rx_irqsafe(hw, skb); +} + +static void Wb35Rx_adjust(struct wb35_descriptor *pRxDes) +{ + u32 *pRxBufferAddress; + u32 DecryptionMethod; + u32 i; + u16 BufferSize; + + DecryptionMethod = pRxDes->R01.R01_decryption_method; + pRxBufferAddress = pRxDes->buffer_address[0]; + BufferSize = pRxDes->buffer_size[0]; + + /* Adjust the last part of data. Only data left */ + BufferSize -= 4; /* For CRC-32 */ + if (DecryptionMethod) + BufferSize -= 4; + if (DecryptionMethod == 3) /* For CCMP */ + BufferSize -= 4; + + /* Adjust the IV field which after 802.11 header and ICV field. */ + if (DecryptionMethod == 1) { /* For WEP */ + for (i = 6; i > 0; i--) + pRxBufferAddress[i] = pRxBufferAddress[i - 1]; + pRxDes->buffer_address[0] = pRxBufferAddress + 1; + BufferSize -= 4; /* 4 byte for IV */ + } else if (DecryptionMethod) { /* For TKIP and CCMP */ + for (i = 7; i > 1; i--) + pRxBufferAddress[i] = pRxBufferAddress[i - 2]; + /* Update the descriptor, shift 8 byte */ + pRxDes->buffer_address[0] = pRxBufferAddress + 2; + BufferSize -= 8; /* 8 byte for IV + ICV */ + } + pRxDes->buffer_size[0] = BufferSize; +} + +static u16 Wb35Rx_indicate(struct ieee80211_hw *hw) +{ + struct wbsoft_priv *priv = hw->priv; + struct hw_data *pHwData = &priv->sHwData; + struct wb35_descriptor RxDes; + struct wb35_rx *pWb35Rx = &pHwData->Wb35Rx; + u8 *pRxBufferAddress; + u16 PacketSize; + u16 stmp, BufferSize, stmp2 = 0; + u32 RxBufferId; + + /* Only one thread be allowed to run into the following */ + do { + RxBufferId = pWb35Rx->RxProcessIndex; + if (pWb35Rx->RxOwner[RxBufferId]) /* Owner by VM */ + break; + + pWb35Rx->RxProcessIndex++; + pWb35Rx->RxProcessIndex %= MAX_USB_RX_BUFFER_NUMBER; + + pRxBufferAddress = pWb35Rx->pDRx; + BufferSize = pWb35Rx->RxBufferSize[RxBufferId]; + + /* Parse the bulkin buffer */ + while (BufferSize >= 4) { + /* Is ending? */ + if ((cpu_to_le32(*(u32 *)pRxBufferAddress) & 0x0fffffff) == + RX_END_TAG) + break; + + /* Get the R00 R01 first */ + RxDes.R00.value = le32_to_cpu(*(u32 *)pRxBufferAddress); + PacketSize = (u16)RxDes.R00.R00_receive_byte_count; + RxDes.R01.value = le32_to_cpu(*((u32 *)(pRxBufferAddress + 4))); + /* For new DMA 4k */ + if ((PacketSize & 0x03) > 0) + PacketSize -= 4; + + /* Basic check for Rx length. Is length valid? */ + if (PacketSize > MAX_PACKET_SIZE) { + pr_debug("Serious ERROR : Rx data size too long, size =%d\n", + PacketSize); + pWb35Rx->EP3vm_state = VM_STOP; + pWb35Rx->Ep3ErrorCount2++; + break; + } + + /* + * Wb35Rx_indicate() is called synchronously so it isn't + * necessary to set "RxDes.Desctriptor_ID = RxBufferID;" + */ + /* subtract 8 byte for 35's USB header length */ + BufferSize -= 8; + pRxBufferAddress += 8; + + RxDes.buffer_address[0] = pRxBufferAddress; + RxDes.buffer_size[0] = PacketSize; + RxDes.buffer_number = 1; + RxDes.buffer_start_index = 0; + RxDes.buffer_total_size = RxDes.buffer_size[0]; + Wb35Rx_adjust(&RxDes); + + packet_came(hw, pRxBufferAddress, PacketSize); + + /* Move RxBuffer point to the next */ + stmp = PacketSize + 3; + stmp &= ~0x03; /* 4n alignment */ + pRxBufferAddress += stmp; + BufferSize -= stmp; + stmp2 += stmp; + } + + /* Reclaim resource */ + pWb35Rx->RxOwner[RxBufferId] = 1; + } while (true); + return stmp2; +} + +static void Wb35Rx(struct ieee80211_hw *hw); + +static void Wb35Rx_Complete(struct urb *urb) +{ + struct ieee80211_hw *hw = urb->context; + struct wbsoft_priv *priv = hw->priv; + struct hw_data *pHwData = &priv->sHwData; + struct wb35_rx *pWb35Rx = &pHwData->Wb35Rx; + u8 *pRxBufferAddress; + u32 SizeCheck; + u16 BulkLength; + u32 RxBufferId; + struct R00_descriptor R00; + + /* Variable setting */ + pWb35Rx->EP3vm_state = VM_COMPLETED; + pWb35Rx->EP3VM_status = urb->status; /* Store the last result of Irp */ + + RxBufferId = pWb35Rx->CurrentRxBufferId; + + pRxBufferAddress = pWb35Rx->pDRx; + BulkLength = (u16)urb->actual_length; + + /* The IRP is completed */ + pWb35Rx->EP3vm_state = VM_COMPLETED; + + if (pHwData->SurpriseRemove) /* Must be here, or RxBufferId is invalid */ + goto error; + + if (pWb35Rx->rx_halt) + goto error; + + /* Start to process the data only in successful condition */ + pWb35Rx->RxOwner[RxBufferId] = 0; /* Set the owner to driver */ + R00.value = le32_to_cpu(*(u32 *)pRxBufferAddress); + + /* The URB is completed, check the result */ + if (pWb35Rx->EP3VM_status != 0) { + pr_debug("EP3 IoCompleteRoutine return error\n"); + pWb35Rx->EP3vm_state = VM_STOP; + goto error; + } + + /* For recovering. check if operating in single USB mode */ + if (!HAL_USB_MODE_BURST(pHwData)) { + SizeCheck = R00.R00_receive_byte_count; + if ((SizeCheck & 0x03) > 0) + SizeCheck -= 4; + SizeCheck = (SizeCheck + 3) & ~0x03; + SizeCheck += 12; /* 8 + 4 badbeef */ + if ((BulkLength > 1600) || + (SizeCheck > 1600) || + (BulkLength != SizeCheck) || + (BulkLength == 0)) { /* Add for fail Urb */ + pWb35Rx->EP3vm_state = VM_STOP; + pWb35Rx->Ep3ErrorCount2++; + } + } + + /* Indicating the receiving data */ + pWb35Rx->ByteReceived += BulkLength; + pWb35Rx->RxBufferSize[RxBufferId] = BulkLength; + + if (!pWb35Rx->RxOwner[RxBufferId]) + Wb35Rx_indicate(hw); + + kfree(pWb35Rx->pDRx); + /* Do the next receive */ + Wb35Rx(hw); + return; + +error: + pWb35Rx->RxOwner[RxBufferId] = 1; /* Set the owner to hardware */ + atomic_dec(&pWb35Rx->RxFireCounter); + pWb35Rx->EP3vm_state = VM_STOP; +} + +/* This function cannot reentrain */ +static void Wb35Rx(struct ieee80211_hw *hw) +{ + struct wbsoft_priv *priv = hw->priv; + struct hw_data *pHwData = &priv->sHwData; + struct wb35_rx *pWb35Rx = &pHwData->Wb35Rx; + u8 *pRxBufferAddress; + struct urb *urb = pWb35Rx->RxUrb; + int retv; + u32 RxBufferId; + + /* Issuing URB */ + if (pHwData->SurpriseRemove) + goto error; + + if (pWb35Rx->rx_halt) + goto error; + + /* Get RxBuffer's ID */ + RxBufferId = pWb35Rx->RxBufferId; + if (!pWb35Rx->RxOwner[RxBufferId]) { + /* It's impossible to run here. */ + pr_debug("Rx driver fifo unavailable\n"); + goto error; + } + + /* Update buffer point, then start to bulkin the data from USB */ + pWb35Rx->RxBufferId++; + pWb35Rx->RxBufferId %= MAX_USB_RX_BUFFER_NUMBER; + + pWb35Rx->CurrentRxBufferId = RxBufferId; + + pWb35Rx->pDRx = kzalloc(MAX_USB_RX_BUFFER, GFP_ATOMIC); + if (!pWb35Rx->pDRx) { + dev_info(&hw->wiphy->dev, "w35und: Rx memory alloc failed\n"); + goto error; + } + pRxBufferAddress = pWb35Rx->pDRx; + + usb_fill_bulk_urb(urb, pHwData->udev, + usb_rcvbulkpipe(pHwData->udev, 3), + pRxBufferAddress, MAX_USB_RX_BUFFER, + Wb35Rx_Complete, hw); + + pWb35Rx->EP3vm_state = VM_RUNNING; + + retv = usb_submit_urb(urb, GFP_ATOMIC); + + if (retv != 0) { + dev_info(&hw->wiphy->dev, "Rx URB sending error\n"); + goto error; + } + return; + +error: + /* VM stop */ + pWb35Rx->EP3vm_state = VM_STOP; + atomic_dec(&pWb35Rx->RxFireCounter); +} + +void Wb35Rx_start(struct ieee80211_hw *hw) +{ + struct wbsoft_priv *priv = hw->priv; + struct hw_data *pHwData = &priv->sHwData; + struct wb35_rx *pWb35Rx = &pHwData->Wb35Rx; + + /* Allow only one thread to run into the Wb35Rx() function */ + if (atomic_inc_return(&pWb35Rx->RxFireCounter) == 1) { + pWb35Rx->EP3vm_state = VM_RUNNING; + Wb35Rx(hw); + } else + atomic_dec(&pWb35Rx->RxFireCounter); +} + +static void Wb35Rx_reset_descriptor(struct hw_data *pHwData) +{ + struct wb35_rx *pWb35Rx = &pHwData->Wb35Rx; + u32 i; + + pWb35Rx->ByteReceived = 0; + pWb35Rx->RxProcessIndex = 0; + pWb35Rx->RxBufferId = 0; + pWb35Rx->EP3vm_state = VM_STOP; + pWb35Rx->rx_halt = 0; + + /* Initial the Queue. The last buffer is reserved for used + * if the Rx resource is unavailable. + */ + for (i = 0; i < MAX_USB_RX_BUFFER_NUMBER; i++) + pWb35Rx->RxOwner[i] = 1; +} + +unsigned char Wb35Rx_initial(struct hw_data *pHwData) +{ + struct wb35_rx *pWb35Rx = &pHwData->Wb35Rx; + + /* Initial the Buffer Queue */ + Wb35Rx_reset_descriptor(pHwData); + + pWb35Rx->RxUrb = usb_alloc_urb(0, GFP_ATOMIC); + return !!pWb35Rx->RxUrb; +} + +void Wb35Rx_stop(struct hw_data *pHwData) +{ + struct wb35_rx *pWb35Rx = &pHwData->Wb35Rx; + + /* Canceling the Irp if already sends it out. */ + if (pWb35Rx->EP3vm_state == VM_RUNNING) { + /* Only use unlink, let Wb35Rx_destroy to free them */ + usb_unlink_urb(pWb35Rx->RxUrb); + pr_debug("EP3 Rx stop\n"); + } +} + +/* Needs process context */ +void Wb35Rx_destroy(struct hw_data *pHwData) +{ + struct wb35_rx *pWb35Rx = &pHwData->Wb35Rx; + + do { + msleep(10); /* Delay for waiting function enter */ + } while (pWb35Rx->EP3vm_state != VM_STOP); + msleep(10); /* Delay for waiting function exit */ + + usb_free_urb(pWb35Rx->RxUrb); + pr_debug("Wb35Rx_destroy OK\n"); +} + diff --git a/drivers/staging/winbond/wb35rx_f.h b/drivers/staging/winbond/wb35rx_f.h new file mode 100644 index 00000000000..559bdca12e1 --- /dev/null +++ b/drivers/staging/winbond/wb35rx_f.h @@ -0,0 +1,15 @@ +#ifndef __WINBOND_WB35RX_F_H +#define __WINBOND_WB35RX_F_H + +#include <net/mac80211.h> +#include "wbhal.h" + +/* + * Interface function declaration + */ +unsigned char Wb35Rx_initial(struct hw_data *pHwData); +void Wb35Rx_destroy(struct hw_data *pHwData); +void Wb35Rx_stop(struct hw_data *pHwData); +void Wb35Rx_start(struct ieee80211_hw *hw); + +#endif diff --git a/drivers/staging/winbond/wb35rx_s.h b/drivers/staging/winbond/wb35rx_s.h new file mode 100644 index 00000000000..545bc950072 --- /dev/null +++ b/drivers/staging/winbond/wb35rx_s.h @@ -0,0 +1,44 @@ +#ifndef __WINBOND_35RX_S_H +#define __WINBOND_35RX_S_H + +/* Definition for this module used */ +#define MAX_USB_RX_BUFFER 4096 /* This parameter must be 4096 931130.4.f */ +#define MAX_USB_RX_BUFFER_NUMBER ETHERNET_RX_DESCRIPTORS /* Maximum 254, 255 is RESERVED ID */ +#define RX_INTERFACE 0 /* Interface 1 */ +#define RX_PIPE 2 /* Pipe 3 */ +#define MAX_PACKET_SIZE 1600 /* 1568 = 8 + 1532 + 4 + 24(IV EIV MIC ICV CRC) for check DMA data 931130.4.g */ +#define RX_END_TAG 0x0badbeef + + +/* + * Internal variable for module + */ +struct wb35_rx { + u32 ByteReceived; /* For calculating throughput of BulkIn */ + atomic_t RxFireCounter;/* Does Wb35Rx module fire? */ + + u8 RxBuffer[MAX_USB_RX_BUFFER_NUMBER][((MAX_USB_RX_BUFFER+3) & ~0x03)]; + u16 RxBufferSize[((MAX_USB_RX_BUFFER_NUMBER+1) & ~0x01)]; + u8 RxOwner[((MAX_USB_RX_BUFFER_NUMBER+3) & ~0x03)]; /* Ownership of buffer 0:SW 1:HW */ + + u32 RxProcessIndex; /* The next index to process */ + u32 RxBufferId; + u32 EP3vm_state; + + u32 rx_halt; /* For VM stopping */ + + u16 MoreDataSize; + u16 PacketSize; + + u32 CurrentRxBufferId; /* For complete routine usage */ + u32 Rx3UrbCancel; + + u32 LastR1; /* For RSSI reporting */ + struct urb *RxUrb; + u32 Ep3ErrorCount2; /* 20060625.1 Usbd for Rx DMA error count */ + + int EP3VM_status; + u8 *pDRx; +}; + +#endif /* __WINBOND_35RX_S_H */ diff --git a/drivers/staging/winbond/wb35tx.c b/drivers/staging/winbond/wb35tx.c new file mode 100644 index 00000000000..870cff39a22 --- /dev/null +++ b/drivers/staging/winbond/wb35tx.c @@ -0,0 +1,290 @@ +/* + * Copyright (c) 1996-2002 Winbond Electronic Corporation + * + * Module Name: + * Wb35Tx.c + * + * Abstract: + * Processing the Tx message and put into down layer + * + */ +#include <linux/usb.h> +#include <linux/gfp.h> + +#include "wb35tx_f.h" +#include "mds_f.h" + +unsigned char +Wb35Tx_get_tx_buffer(struct hw_data *pHwData, u8 **pBuffer) +{ + struct wb35_tx *pWb35Tx = &pHwData->Wb35Tx; + + *pBuffer = pWb35Tx->TxBuffer[0]; + return true; +} + +static void Wb35Tx(struct wbsoft_priv *adapter); + +static void Wb35Tx_complete(struct urb *pUrb) +{ + struct wbsoft_priv *adapter = pUrb->context; + struct hw_data *pHwData = &adapter->sHwData; + struct wb35_tx *pWb35Tx = &pHwData->Wb35Tx; + struct wb35_mds *pMds = &adapter->Mds; + + printk("wb35: tx complete\n"); + /* Variable setting */ + pWb35Tx->EP4vm_state = VM_COMPLETED; + pWb35Tx->EP4VM_status = pUrb->status; /* Store the last result of Irp */ + /* Set the owner. Free the owner bit always. */ + pMds->TxOwner[pWb35Tx->TxSendIndex] = 0; + pWb35Tx->TxSendIndex++; + pWb35Tx->TxSendIndex %= MAX_USB_TX_BUFFER_NUMBER; + + if (pHwData->SurpriseRemove) /* Let WbWlanHalt handle surprise remove */ + goto error; + + if (pWb35Tx->tx_halt) + goto error; + + /* The URB is completed, check the result */ + if (pWb35Tx->EP4VM_status != 0) { + dev_err(&pUrb->dev->dev, "URB submission failed\n"); + pWb35Tx->EP4vm_state = VM_STOP; + goto error; + } + + Mds_Tx(adapter); + Wb35Tx(adapter); + return; + +error: + atomic_dec(&pWb35Tx->TxFireCounter); + pWb35Tx->EP4vm_state = VM_STOP; +} + +static void Wb35Tx(struct wbsoft_priv *adapter) +{ + struct hw_data *pHwData = &adapter->sHwData; + struct wb35_tx *pWb35Tx = &pHwData->Wb35Tx; + u8 *pTxBufferAddress; + struct wb35_mds *pMds = &adapter->Mds; + struct urb *pUrb = (struct urb *)pWb35Tx->Tx4Urb; + int retv; + u32 SendIndex; + + if (pHwData->SurpriseRemove) + goto cleanup; + + if (pWb35Tx->tx_halt) + goto cleanup; + + /* Ownership checking */ + SendIndex = pWb35Tx->TxSendIndex; + /* No more data need to be sent, return immediately */ + if (!pMds->TxOwner[SendIndex]) + goto cleanup; + + pTxBufferAddress = pWb35Tx->TxBuffer[SendIndex]; + + /* Issuing URB */ + usb_fill_bulk_urb(pUrb, pHwData->udev, + usb_sndbulkpipe(pHwData->udev, 4), + pTxBufferAddress, pMds->TxBufferSize[SendIndex], + Wb35Tx_complete, adapter); + + pWb35Tx->EP4vm_state = VM_RUNNING; + retv = usb_submit_urb(pUrb, GFP_ATOMIC); + if (retv < 0) { + dev_err(&pUrb->dev->dev, "EP4 Tx Irp sending error\n"); + goto cleanup; + } + + /* Check if driver needs issue Irp for EP2 */ + pWb35Tx->TxFillCount += pMds->TxCountInBuffer[SendIndex]; + if (pWb35Tx->TxFillCount > 12) + Wb35Tx_EP2VM_start(adapter); + + pWb35Tx->ByteTransfer += pMds->TxBufferSize[SendIndex]; + return; + + cleanup: + pWb35Tx->EP4vm_state = VM_STOP; + atomic_dec(&pWb35Tx->TxFireCounter); +} + +void Wb35Tx_start(struct wbsoft_priv *adapter) +{ + struct hw_data *pHwData = &adapter->sHwData; + struct wb35_tx *pWb35Tx = &pHwData->Wb35Tx; + + /* Allow only one thread to run into function */ + if (atomic_inc_return(&pWb35Tx->TxFireCounter) == 1) { + pWb35Tx->EP4vm_state = VM_RUNNING; + Wb35Tx(adapter); + } else + atomic_dec(&pWb35Tx->TxFireCounter); +} + +unsigned char Wb35Tx_initial(struct hw_data *pHwData) +{ + struct wb35_tx *pWb35Tx = &pHwData->Wb35Tx; + + pWb35Tx->Tx4Urb = usb_alloc_urb(0, GFP_ATOMIC); + if (!pWb35Tx->Tx4Urb) + return false; + + pWb35Tx->Tx2Urb = usb_alloc_urb(0, GFP_ATOMIC); + if (!pWb35Tx->Tx2Urb) { + usb_free_urb(pWb35Tx->Tx4Urb); + return false; + } + + return true; +} + +void Wb35Tx_stop(struct hw_data *pHwData) +{ + struct wb35_tx *pWb35Tx = &pHwData->Wb35Tx; + + /* Try to cancel the Trp of EP2 */ + if (pWb35Tx->EP2vm_state == VM_RUNNING) + /* Only use unlink, let Wb35Tx_destroy free them */ + usb_unlink_urb(pWb35Tx->Tx2Urb); + pr_debug("EP2 Tx stop\n"); + + /* Try to cancel the Irp of EP4 */ + if (pWb35Tx->EP4vm_state == VM_RUNNING) + /* Only use unlink, let Wb35Tx_destroy free them */ + usb_unlink_urb(pWb35Tx->Tx4Urb); + pr_debug("EP4 Tx stop\n"); +} + +void Wb35Tx_destroy(struct hw_data *pHwData) +{ + struct wb35_tx *pWb35Tx = &pHwData->Wb35Tx; + + /* Wait for VM stop */ + do { + msleep(10); /* Delay for waiting function enter 940623.1.a */ + } while ((pWb35Tx->EP2vm_state != VM_STOP) && (pWb35Tx->EP4vm_state != VM_STOP)); + msleep(10); /* Delay for waiting function enter 940623.1.b */ + + usb_free_urb(pWb35Tx->Tx4Urb); + usb_free_urb(pWb35Tx->Tx2Urb); + + pr_debug("Wb35Tx_destroy OK\n"); +} + +void Wb35Tx_CurrentTime(struct wbsoft_priv *adapter, u32 TimeCount) +{ + struct hw_data *pHwData = &adapter->sHwData; + struct wb35_tx *pWb35Tx = &pHwData->Wb35Tx; + bool Trigger = false; + + if (pWb35Tx->TxTimer > TimeCount) + Trigger = true; + else if (TimeCount > (pWb35Tx->TxTimer+500)) + Trigger = true; + + if (Trigger) { + pWb35Tx->TxTimer = TimeCount; + Wb35Tx_EP2VM_start(adapter); + } +} + +static void Wb35Tx_EP2VM(struct wbsoft_priv *adapter); + +static void Wb35Tx_EP2VM_complete(struct urb *pUrb) +{ + struct wbsoft_priv *adapter = pUrb->context; + struct hw_data *pHwData = &adapter->sHwData; + struct T02_descriptor T02, TSTATUS; + struct wb35_tx *pWb35Tx = &pHwData->Wb35Tx; + u32 *pltmp = (u32 *)pWb35Tx->EP2_buf; + u32 i; + u16 InterruptInLength; + + /* Variable setting */ + pWb35Tx->EP2vm_state = VM_COMPLETED; + pWb35Tx->EP2VM_status = pUrb->status; + + /* For Linux 2.4. Interrupt will always trigger */ + if (pHwData->SurpriseRemove) /* Let WbWlanHalt handle surprise remove */ + goto error; + + if (pWb35Tx->tx_halt) + goto error; + + /* The Urb is completed, check the result */ + if (pWb35Tx->EP2VM_status != 0) { + dev_err(&pUrb->dev->dev, "EP2 IoCompleteRoutine return error\n"); + pWb35Tx->EP2vm_state = VM_STOP; + goto error; + } + + /* Update the Tx result */ + InterruptInLength = pUrb->actual_length; + /* Modify for minimum memory access and DWORD alignment. */ + T02.value = cpu_to_le32(pltmp[0]) >> 8; /* [31:8] -> [24:0] */ + InterruptInLength -= 1; /* 20051221.1.c Modify the follow for more stable */ + InterruptInLength >>= 2; /* InterruptInLength/4 */ + for (i = 1; i <= InterruptInLength; i++) { + T02.value |= ((cpu_to_le32(pltmp[i]) & 0xff) << 24); + + TSTATUS.value = T02.value; /* 20061009 anson's endian */ + Mds_SendComplete(adapter, &TSTATUS); + T02.value = cpu_to_le32(pltmp[i]) >> 8; + } + + return; +error: + atomic_dec(&pWb35Tx->TxResultCount); + pWb35Tx->EP2vm_state = VM_STOP; +} + +static void Wb35Tx_EP2VM(struct wbsoft_priv *adapter) +{ + struct hw_data *pHwData = &adapter->sHwData; + struct wb35_tx *pWb35Tx = &pHwData->Wb35Tx; + struct urb *pUrb = (struct urb *)pWb35Tx->Tx2Urb; + u32 *pltmp = (u32 *)pWb35Tx->EP2_buf; + int retv; + + if (pHwData->SurpriseRemove) + goto error; + + if (pWb35Tx->tx_halt) + goto error; + + /* Issuing URB */ + usb_fill_int_urb(pUrb, pHwData->udev, usb_rcvintpipe(pHwData->udev, 2), + pltmp, MAX_INTERRUPT_LENGTH, Wb35Tx_EP2VM_complete, + adapter, 32); + + pWb35Tx->EP2vm_state = VM_RUNNING; + retv = usb_submit_urb(pUrb, GFP_ATOMIC); + + if (retv < 0) { + pr_debug("EP2 Tx Irp sending error\n"); + goto error; + } + + return; +error: + pWb35Tx->EP2vm_state = VM_STOP; + atomic_dec(&pWb35Tx->TxResultCount); +} + +void Wb35Tx_EP2VM_start(struct wbsoft_priv *adapter) +{ + struct hw_data *pHwData = &adapter->sHwData; + struct wb35_tx *pWb35Tx = &pHwData->Wb35Tx; + + /* Allow only one thread to run into function */ + if (atomic_inc_return(&pWb35Tx->TxResultCount) == 1) { + pWb35Tx->EP2vm_state = VM_RUNNING; + Wb35Tx_EP2VM(adapter); + } else + atomic_dec(&pWb35Tx->TxResultCount); +} diff --git a/drivers/staging/winbond/wb35tx_f.h b/drivers/staging/winbond/wb35tx_f.h new file mode 100644 index 00000000000..018fd35e815 --- /dev/null +++ b/drivers/staging/winbond/wb35tx_f.h @@ -0,0 +1,22 @@ +#ifndef __WINBOND_WB35TX_F_H +#define __WINBOND_WB35TX_F_H + +#include "core.h" + +/* + * ==================================== + * Interface function declare + * ==================================== + */ +unsigned char Wb35Tx_initial(struct hw_data *hw_data); +void Wb35Tx_destroy(struct hw_data *hw_data); +unsigned char Wb35Tx_get_tx_buffer(struct hw_data *hw_data, u8 **buffer); + +void Wb35Tx_EP2VM_start(struct wbsoft_priv *adapter); + +void Wb35Tx_start(struct wbsoft_priv *adapter); +void Wb35Tx_stop(struct hw_data *hw_data); + +void Wb35Tx_CurrentTime(struct wbsoft_priv *adapter, u32 time_count); + +#endif diff --git a/drivers/staging/winbond/wb35tx_s.h b/drivers/staging/winbond/wb35tx_s.h new file mode 100644 index 00000000000..dc120085d52 --- /dev/null +++ b/drivers/staging/winbond/wb35tx_s.h @@ -0,0 +1,39 @@ +#ifndef __WINBOND_WB35_TX_S_H +#define __WINBOND_WB35_TX_S_H + +#include "mds_s.h" + +/* IS89C35 Tx related definition */ +#define TX_INTERFACE 0 /* Interface 1 */ +#define TX_PIPE 3 /* Endpoint 4 */ +#define TX_INTERRUPT 1 /* Endpoint 2 */ +#define MAX_INTERRUPT_LENGTH 64 /* It must be 64 for EP2 hardware */ + +/* Internal variable for module */ +struct wb35_tx { + /* For Tx buffer */ + u8 TxBuffer[MAX_USB_TX_BUFFER_NUMBER][MAX_USB_TX_BUFFER]; + + /* For Interrupt pipe */ + u8 EP2_buf[MAX_INTERRUPT_LENGTH]; + + atomic_t TxResultCount; /* For thread control of EP2 931130.4.m */ + atomic_t TxFireCounter; /* For thread control of EP4 931130.4.n */ + u32 ByteTransfer; + + u32 TxSendIndex; /* The next index of Mds array to be sent */ + u32 EP2vm_state; /* for EP2vm state */ + u32 EP4vm_state; /* for EP4vm state */ + u32 tx_halt; /* Stopping VM */ + + struct urb *Tx4Urb; + struct urb *Tx2Urb; + + int EP2VM_status; + int EP4VM_status; + + u32 TxFillCount; /* 20060928 */ + u32 TxTimer; /* 20060928 Add if sending packet is greater than 13 */ +}; + +#endif diff --git a/drivers/staging/winbond/wbhal.c b/drivers/staging/winbond/wbhal.c deleted file mode 100644 index 5d68ecec34c..00000000000 --- a/drivers/staging/winbond/wbhal.c +++ /dev/null @@ -1,878 +0,0 @@ -#include "os_common.h" - -void hal_get_ethernet_address( phw_data_t pHwData, u8 *current_address ) -{ - if( pHwData->SurpriseRemove ) return; - - memcpy( current_address, pHwData->CurrentMacAddress, ETH_LENGTH_OF_ADDRESS ); -} - -void hal_set_ethernet_address( phw_data_t pHwData, u8 *current_address ) -{ - u32 ltmp[2]; - - if( pHwData->SurpriseRemove ) return; - - memcpy( pHwData->CurrentMacAddress, current_address, ETH_LENGTH_OF_ADDRESS ); - - ltmp[0]= cpu_to_le32( *(u32 *)pHwData->CurrentMacAddress ); - ltmp[1]= cpu_to_le32( *(u32 *)(pHwData->CurrentMacAddress + 4) ) & 0xffff; - - Wb35Reg_BurstWrite( pHwData, 0x03e8, ltmp, 2, AUTO_INCREMENT ); -} - -void hal_get_permanent_address( phw_data_t pHwData, u8 *pethernet_address ) -{ - if( pHwData->SurpriseRemove ) return; - - memcpy( pethernet_address, pHwData->PermanentMacAddress, 6 ); -} - -u8 hal_init_hardware(phw_data_t pHwData, PWB32_ADAPTER Adapter) -{ - u16 SoftwareSet; - pHwData->Adapter = Adapter; - - // Initial the variable - pHwData->MaxReceiveLifeTime = DEFAULT_MSDU_LIFE_TIME; // Setting Rx maximum MSDU life time - pHwData->FragmentThreshold = DEFAULT_FRAGMENT_THRESHOLD; // Setting default fragment threshold - - if (WbUsb_initial(pHwData)) { - pHwData->InitialResource = 1; - if( Wb35Reg_initial(pHwData)) { - pHwData->InitialResource = 2; - if (Wb35Tx_initial(pHwData)) { - pHwData->InitialResource = 3; - if (Wb35Rx_initial(pHwData)) { - pHwData->InitialResource = 4; - OS_TIMER_INITIAL( &pHwData->LEDTimer, hal_led_control, pHwData ); - OS_TIMER_SET( &pHwData->LEDTimer, 1000 ); // 20060623 - - // - // For restrict to vendor's hardware - // - SoftwareSet = hal_software_set( pHwData ); - - #ifdef Vendor2 - // Try to make sure the EEPROM contain - SoftwareSet >>= 8; - if( SoftwareSet != 0x82 ) - return FALSE; - #endif - - Wb35Rx_start( pHwData ); - Wb35Tx_EP2VM_start( pHwData ); - - return TRUE; - } - } - } - } - - pHwData->SurpriseRemove = 1; - return FALSE; -} - - -void hal_halt(phw_data_t pHwData, void *ppa_data) -{ - switch( pHwData->InitialResource ) - { - case 4: - case 3: OS_TIMER_CANCEL( &pHwData->LEDTimer, &cancel ); - OS_SLEEP(100000); // Wait for Timer DPC exit 940623.2 - Wb35Rx_destroy( pHwData ); // Release the Rx - case 2: Wb35Tx_destroy( pHwData ); // Release the Tx - case 1: Wb35Reg_destroy( pHwData ); // Release the Wb35 Regisster resources - WbUsb_destroy( pHwData );// Release the WbUsb - } -} - -//--------------------------------------------------------------------------------------------------- -void hal_set_rates(phw_data_t pHwData, u8 *pbss_rates, - u8 length, unsigned char basic_rate_set) -{ - PWB35REG pWb35Reg = &pHwData->Wb35Reg; - u32 tmp, tmp1; - u8 Rate[12]={ 2, 4, 11, 22, 12, 18, 24, 36, 48, 72, 96, 108 }; - u8 SupportedRate[16]; - u8 i, j, k, Count1, Count2, Byte; - - if( pHwData->SurpriseRemove ) return; - - if (basic_rate_set) { - pWb35Reg->M28_MacControl &= ~0x000fff00; - tmp1 = 0x00000100; - } else { - pWb35Reg->M28_MacControl &= ~0xfff00000; - tmp1 = 0x00100000; - } - - tmp = 0; - for (i=0; i<length; i++) { - Byte = pbss_rates[i] & 0x7f; - for (j=0; j<12; j++) { - if( Byte == Rate[j] ) - break; - } - - if (j < 12) - tmp |= (tmp1<<j); - } - - pWb35Reg->M28_MacControl |= tmp; - Wb35Reg_Write( pHwData, 0x0828, pWb35Reg->M28_MacControl ); - - // 930206.2.c M78 setting - j = k = Count1 = Count2 = 0; - memset( SupportedRate, 0, 16 ); - tmp = 0x00100000; - tmp1 = 0x00000100; - for (i=0; i<12; i++) { // Get the supported rate - if (tmp & pWb35Reg->M28_MacControl) { - SupportedRate[j] = Rate[i]; - - if (tmp1 & pWb35Reg->M28_MacControl) - SupportedRate[j] |= 0x80; - - if (k) - Count2++; - else - Count1++; - - j++; - } - - if (i==4 && k==0) { - if( !(pWb35Reg->M28_MacControl & 0x000ff000) ) // if basic rate in 11g domain) - { - k = 1; - j = 8; - } - } - - tmp <<= 1; - tmp1 <<= 1; - } - - // Fill data into support rate until buffer full - //---20060926 add by anson's endian - for (i=0; i<4; i++) - *(u32 *)(SupportedRate+(i<<2)) = cpu_to_le32( *(u32 *)(SupportedRate+(i<<2)) ); - //--- end 20060926 add by anson's endian - Wb35Reg_BurstWrite( pHwData,0x087c, (u32 *)SupportedRate, 4, AUTO_INCREMENT ); - pWb35Reg->M7C_MacControl = ((u32 *)SupportedRate)[0]; - pWb35Reg->M80_MacControl = ((u32 *)SupportedRate)[1]; - pWb35Reg->M84_MacControl = ((u32 *)SupportedRate)[2]; - pWb35Reg->M88_MacControl = ((u32 *)SupportedRate)[3]; - - // Fill length - tmp = Count1<<28 | Count2<<24; - pWb35Reg->M78_ERPInformation &= ~0xff000000; - pWb35Reg->M78_ERPInformation |= tmp; - Wb35Reg_Write( pHwData, 0x0878, pWb35Reg->M78_ERPInformation ); -} - - -//--------------------------------------------------------------------------------------------------- -void hal_set_beacon_period( phw_data_t pHwData, u16 beacon_period ) -{ - u32 tmp; - - if( pHwData->SurpriseRemove ) return; - - pHwData->BeaconPeriod = beacon_period; - tmp = pHwData->BeaconPeriod << 16; - tmp |= pHwData->ProbeDelay; - Wb35Reg_Write( pHwData, 0x0848, tmp ); -} - - -void hal_set_current_channel_ex( phw_data_t pHwData, ChanInfo channel ) -{ - PWB35REG pWb35Reg = &pHwData->Wb35Reg; - - if( pHwData->SurpriseRemove ) - return; - - printk("Going to channel: %d/%d\n", channel.band, channel.ChanNo); - - RFSynthesizer_SwitchingChannel( pHwData, channel );// Switch channel - pHwData->Channel = channel.ChanNo; - pHwData->band = channel.band; - #ifdef _PE_STATE_DUMP_ - WBDEBUG(("Set channel is %d, band =%d\n", pHwData->Channel, pHwData->band)); - #endif - pWb35Reg->M28_MacControl &= ~0xff; // Clean channel information field - pWb35Reg->M28_MacControl |= channel.ChanNo; - Wb35Reg_WriteWithCallbackValue( pHwData, 0x0828, pWb35Reg->M28_MacControl, - (s8 *)&channel, sizeof(ChanInfo)); -} -//--------------------------------------------------------------------------------------------------- -void hal_set_current_channel( phw_data_t pHwData, ChanInfo channel ) -{ - hal_set_current_channel_ex( pHwData, channel ); -} -//--------------------------------------------------------------------------------------------------- -void hal_get_current_channel( phw_data_t pHwData, ChanInfo *channel ) -{ - channel->ChanNo = pHwData->Channel; - channel->band = pHwData->band; -} -//--------------------------------------------------------------------------------------------------- -void hal_set_accept_broadcast( phw_data_t pHwData, u8 enable ) -{ - PWB35REG pWb35Reg = &pHwData->Wb35Reg; - - if( pHwData->SurpriseRemove ) return; - - pWb35Reg->M00_MacControl &= ~0x02000000;//The HW value - - if (enable) - pWb35Reg->M00_MacControl |= 0x02000000;//The HW value - - Wb35Reg_Write( pHwData, 0x0800, pWb35Reg->M00_MacControl ); -} - -//for wep key error detection, we need to accept broadcast packets to be received temporary. -void hal_set_accept_promiscuous( phw_data_t pHwData, u8 enable) -{ - PWB35REG pWb35Reg = &pHwData->Wb35Reg; - - if (pHwData->SurpriseRemove) return; - if (enable) { - pWb35Reg->M00_MacControl |= 0x00400000; - Wb35Reg_Write( pHwData, 0x0800, pWb35Reg->M00_MacControl ); - } else { - pWb35Reg->M00_MacControl&=~0x00400000; - Wb35Reg_Write( pHwData, 0x0800, pWb35Reg->M00_MacControl ); - } -} - -void hal_set_accept_multicast( phw_data_t pHwData, u8 enable ) -{ - PWB35REG pWb35Reg = &pHwData->Wb35Reg; - - if( pHwData->SurpriseRemove ) return; - - pWb35Reg->M00_MacControl &= ~0x01000000;//The HW value - if (enable) pWb35Reg->M00_MacControl |= 0x01000000;//The HW value - Wb35Reg_Write( pHwData, 0x0800, pWb35Reg->M00_MacControl ); -} - -void hal_set_accept_beacon( phw_data_t pHwData, u8 enable ) -{ - PWB35REG pWb35Reg = &pHwData->Wb35Reg; - - if( pHwData->SurpriseRemove ) return; - - // 20040108 debug - if( !enable )//Due to SME and MLME are not suitable for 35 - return; - - pWb35Reg->M00_MacControl &= ~0x04000000;//The HW value - if( enable ) - pWb35Reg->M00_MacControl |= 0x04000000;//The HW value - - Wb35Reg_Write( pHwData, 0x0800, pWb35Reg->M00_MacControl ); -} -//--------------------------------------------------------------------------------------------------- -void hal_set_multicast_address( phw_data_t pHwData, u8 *address, u8 number ) -{ - PWB35REG pWb35Reg = &pHwData->Wb35Reg; - u8 Byte, Bit; - - if( pHwData->SurpriseRemove ) return; - - //Erases and refills the card multicast registers. Used when an address - // has been deleted and all bits must be recomputed. - pWb35Reg->M04_MulticastAddress1 = 0; - pWb35Reg->M08_MulticastAddress2 = 0; - - while( number ) - { - number--; - CardGetMulticastBit( (address+(number*ETH_LENGTH_OF_ADDRESS)), &Byte, &Bit); - pWb35Reg->Multicast[Byte] |= Bit; - } - - // Updating register - Wb35Reg_BurstWrite( pHwData, 0x0804, (u32 *)pWb35Reg->Multicast, 2, AUTO_INCREMENT ); -} -//--------------------------------------------------------------------------------------------------- -u8 hal_get_accept_beacon( phw_data_t pHwData ) -{ - PWB35REG pWb35Reg = &pHwData->Wb35Reg; - - if( pHwData->SurpriseRemove ) return 0; - - if( pWb35Reg->M00_MacControl & 0x04000000 ) - return 1; - else - return 0; -} - -unsigned char hal_reset_hardware( phw_data_t pHwData, void* ppa ) -{ - // Not implement yet - return TRUE; -} - -void hal_stop( phw_data_t pHwData ) -{ - PWB35REG pWb35Reg = &pHwData->Wb35Reg; - - pHwData->Wb35Rx.rx_halt = 1; - Wb35Rx_stop( pHwData ); - - pHwData->Wb35Tx.tx_halt = 1; - Wb35Tx_stop( pHwData ); - - pWb35Reg->D00_DmaControl &= ~0xc0000000;//Tx Off, Rx Off - Wb35Reg_Write( pHwData, 0x0400, pWb35Reg->D00_DmaControl ); - - WbUsb_Stop( pHwData ); // 20051230 Add.4 -} - -unsigned char hal_idle(phw_data_t pHwData) -{ - PWB35REG pWb35Reg = &pHwData->Wb35Reg; - PWBUSB pWbUsb = &pHwData->WbUsb; - - if( !pHwData->SurpriseRemove && ( pWbUsb->DetectCount || pWb35Reg->EP0vm_state!=VM_STOP ) ) - return FALSE; - - return TRUE; -} -//--------------------------------------------------------------------------------------------------- -void hal_set_cwmin( phw_data_t pHwData, u8 cwin_min ) -{ - PWB35REG pWb35Reg = &pHwData->Wb35Reg; - - if( pHwData->SurpriseRemove ) return; - - pHwData->cwmin = cwin_min; - pWb35Reg->M2C_MacControl &= ~0x7c00; //bit 10 ~ 14 - pWb35Reg->M2C_MacControl |= (pHwData->cwmin<<10); - Wb35Reg_Write( pHwData, 0x082c, pWb35Reg->M2C_MacControl ); -} - -s32 hal_get_rssi( phw_data_t pHwData, u32 *HalRssiArry, u8 Count ) -{ - PWB35REG pWb35Reg = &pHwData->Wb35Reg; - R01_DESCRIPTOR r01; - s32 ltmp = 0, tmp; - u8 i; - - if( pHwData->SurpriseRemove ) return -200; - if( Count > MAX_ACC_RSSI_COUNT ) // Because the TS may use this funtion - Count = MAX_ACC_RSSI_COUNT; - - // RSSI = C1 + C2 * (agc_state[7:0] + offset_map(lna_state[1:0])) - // C1 = -195, C2 = 0.66 = 85/128 - for (i=0; i<Count; i++) - { - r01.value = HalRssiArry[i]; - tmp = ((( r01.R01_AGC_state + pWb35Reg->LNAValue[r01.R01_LNA_state]) * 85 ) >>7 ) - 195; - ltmp += tmp; - } - ltmp /= Count; - if( pHwData->phy_type == RF_AIROHA_2230 ) ltmp -= 5; // 10; - if( pHwData->phy_type == RF_AIROHA_2230S ) ltmp -= 5; // 10; 20060420 Add this - - //if( ltmp < -200 ) ltmp = -200; - if( ltmp < -110 ) ltmp = -110;// 1.0.24.0 For NJRC - - return ltmp; -} -//---------------------------------------------------------------------------------------------------- -s32 hal_get_rssi_bss( phw_data_t pHwData, u16 idx, u8 Count ) -{ - PWB35REG pWb35Reg = &pHwData->Wb35Reg; - R01_DESCRIPTOR r01; - s32 ltmp = 0, tmp; - u8 i, j; - PADAPTER Adapter = pHwData->Adapter; -// u32 *HalRssiArry = psBSS(idx)->HalRssi; - - if( pHwData->SurpriseRemove ) return -200; - if( Count > MAX_ACC_RSSI_COUNT ) // Because the TS may use this funtion - Count = MAX_ACC_RSSI_COUNT; - - // RSSI = C1 + C2 * (agc_state[7:0] + offset_map(lna_state[1:0])) - // C1 = -195, C2 = 0.66 = 85/128 -#if 0 - for (i=0; i<Count; i++) - { - r01.value = HalRssiArry[i]; - tmp = ((( r01.R01_AGC_state + pWb35Reg->LNAValue[r01.R01_LNA_state]) * 85 ) >>7 ) - 195; - ltmp += tmp; - } -#else - if (psBSS(idx)->HalRssiIndex == 0) - psBSS(idx)->HalRssiIndex = MAX_ACC_RSSI_COUNT; - j = (u8)psBSS(idx)->HalRssiIndex-1; - - for (i=0; i<Count; i++) - { - r01.value = psBSS(idx)->HalRssi[j]; - tmp = ((( r01.R01_AGC_state + pWb35Reg->LNAValue[r01.R01_LNA_state]) * 85 ) >>7 ) - 195; - ltmp += tmp; - if (j == 0) - { - j = MAX_ACC_RSSI_COUNT; - } - j--; - } -#endif - ltmp /= Count; - if( pHwData->phy_type == RF_AIROHA_2230 ) ltmp -= 5; // 10; - if( pHwData->phy_type == RF_AIROHA_2230S ) ltmp -= 5; // 10; 20060420 Add this - - //if( ltmp < -200 ) ltmp = -200; - if( ltmp < -110 ) ltmp = -110;// 1.0.24.0 For NJRC - - return ltmp; -} - -//--------------------------------------------------------------------------- -void hal_led_control_1a( phw_data_t pHwData ) -{ - hal_led_control( NULL, pHwData, NULL, NULL ); -} - -void hal_led_control( void* S1, phw_data_t pHwData, void* S3, void* S4 ) -{ - PADAPTER Adapter = pHwData->Adapter; - PWB35REG pWb35Reg = &pHwData->Wb35Reg; - u32 LEDSet = (pHwData->SoftwareSet & HAL_LED_SET_MASK) >> HAL_LED_SET_SHIFT; - u8 LEDgray[20] = { 0,3,4,6,8,10,11,12,13,14,15,14,13,12,11,10,8,6,4,2 }; - u8 LEDgray2[30] = { 7,8,9,10,11,12,13,14,15,0,0,0,0,0,0,0,0,0,0,0,0,0,15,14,13,12,11,10,9,8 }; - u32 TimeInterval = 500, ltmp, ltmp2; - ltmp=0; - - if( pHwData->SurpriseRemove ) return; - - if( pHwData->LED_control ) { - ltmp2 = pHwData->LED_control & 0xff; - if( ltmp2 == 5 ) // 5 is WPS mode - { - TimeInterval = 100; - ltmp2 = (pHwData->LED_control>>8) & 0xff; - switch( ltmp2 ) - { - case 1: // [0.2 On][0.1 Off]... - pHwData->LED_Blinking %= 3; - ltmp = 0x1010; // Led 1 & 0 Green and Red - if( pHwData->LED_Blinking == 2 ) // Turn off - ltmp = 0; - break; - case 2: // [0.1 On][0.1 Off]... - pHwData->LED_Blinking %= 2; - ltmp = 0x0010; // Led 0 red color - if( pHwData->LED_Blinking ) // Turn off - ltmp = 0; - break; - case 3: // [0.1 On][0.1 Off][0.1 On][0.1 Off][0.1 On][0.1 Off][0.1 On][0.1 Off][0.1 On][0.1 Off][0.5 Off]... - pHwData->LED_Blinking %= 15; - ltmp = 0x0010; // Led 0 red color - if( (pHwData->LED_Blinking >= 9) || (pHwData->LED_Blinking%2) ) // Turn off 0.6 sec - ltmp = 0; - break; - case 4: // [300 On][ off ] - ltmp = 0x1000; // Led 1 Green color - if( pHwData->LED_Blinking >= 3000 ) - ltmp = 0; // led maybe on after 300sec * 32bit counter overlap. - break; - } - pHwData->LED_Blinking++; - - pWb35Reg->U1BC_LEDConfigure = ltmp; - if( LEDSet != 7 ) // Only 111 mode has 2 LEDs on PCB. - { - pWb35Reg->U1BC_LEDConfigure |= (ltmp &0xff)<<8; // Copy LED result to each LED control register - pWb35Reg->U1BC_LEDConfigure |= (ltmp &0xff00)>>8; - } - Wb35Reg_Write( pHwData, 0x03bc, pWb35Reg->U1BC_LEDConfigure ); - } - } - else if( pHwData->CurrentRadioSw || pHwData->CurrentRadioHw ) // If radio off - { - if( pWb35Reg->U1BC_LEDConfigure & 0x1010 ) - { - pWb35Reg->U1BC_LEDConfigure &= ~0x1010; - Wb35Reg_Write( pHwData, 0x03bc, pWb35Reg->U1BC_LEDConfigure ); - } - } - else - { - switch( LEDSet ) - { - case 4: // [100] Only 1 Led be placed on PCB and use pin 21 of IC. Use LED_0 for showing - if( !pHwData->LED_LinkOn ) // Blink only if not Link On - { - // Blinking if scanning is on progress - if( pHwData->LED_Scanning ) - { - if( pHwData->LED_Blinking == 0 ) - { - pWb35Reg->U1BC_LEDConfigure |= 0x10; - Wb35Reg_Write( pHwData, 0x03bc, pWb35Reg->U1BC_LEDConfigure ); // LED_0 On - pHwData->LED_Blinking = 1; - TimeInterval = 300; - } - else - { - pWb35Reg->U1BC_LEDConfigure &= ~0x10; - Wb35Reg_Write( pHwData, 0x03bc, pWb35Reg->U1BC_LEDConfigure ); // LED_0 Off - pHwData->LED_Blinking = 0; - TimeInterval = 300; - } - } - else - { - //Turn Off LED_0 - if( pWb35Reg->U1BC_LEDConfigure & 0x10 ) - { - pWb35Reg->U1BC_LEDConfigure &= ~0x10; - Wb35Reg_Write( pHwData, 0x03bc, pWb35Reg->U1BC_LEDConfigure ); // LED_0 Off - } - } - } - else - { - // Turn On LED_0 - if( (pWb35Reg->U1BC_LEDConfigure & 0x10) == 0 ) - { - pWb35Reg->U1BC_LEDConfigure |= 0x10; - Wb35Reg_Write( pHwData, 0x03bc, pWb35Reg->U1BC_LEDConfigure ); // LED_0 Off - } - } - break; - - case 6: // [110] Only 1 Led be placed on PCB and use pin 21 of IC. Use LED_0 for showing - if( !pHwData->LED_LinkOn ) // Blink only if not Link On - { - // Blinking if scanning is on progress - if( pHwData->LED_Scanning ) - { - if( pHwData->LED_Blinking == 0 ) - { - pWb35Reg->U1BC_LEDConfigure &= ~0xf; - pWb35Reg->U1BC_LEDConfigure |= 0x10; - Wb35Reg_Write( pHwData, 0x03bc, pWb35Reg->U1BC_LEDConfigure ); // LED_0 On - pHwData->LED_Blinking = 1; - TimeInterval = 300; - } - else - { - pWb35Reg->U1BC_LEDConfigure &= ~0x1f; - Wb35Reg_Write( pHwData, 0x03bc, pWb35Reg->U1BC_LEDConfigure ); // LED_0 Off - pHwData->LED_Blinking = 0; - TimeInterval = 300; - } - } - else - { - // 20060901 Gray blinking if in disconnect state and not scanning - ltmp = pWb35Reg->U1BC_LEDConfigure; - pWb35Reg->U1BC_LEDConfigure &= ~0x1f; - if( LEDgray2[(pHwData->LED_Blinking%30)] ) - { - pWb35Reg->U1BC_LEDConfigure |= 0x10; - pWb35Reg->U1BC_LEDConfigure |= LEDgray2[ (pHwData->LED_Blinking%30) ]; - } - pHwData->LED_Blinking++; - if( pWb35Reg->U1BC_LEDConfigure != ltmp ) - Wb35Reg_Write( pHwData, 0x03bc, pWb35Reg->U1BC_LEDConfigure ); // LED_0 Off - TimeInterval = 100; - } - } - else - { - // Turn On LED_0 - if( (pWb35Reg->U1BC_LEDConfigure & 0x10) == 0 ) - { - pWb35Reg->U1BC_LEDConfigure |= 0x10; - Wb35Reg_Write( pHwData, 0x03bc, pWb35Reg->U1BC_LEDConfigure ); // LED_0 Off - } - } - break; - - case 5: // [101] Only 1 Led be placed on PCB and use LED_1 for showing - if( !pHwData->LED_LinkOn ) // Blink only if not Link On - { - // Blinking if scanning is on progress - if( pHwData->LED_Scanning ) - { - if( pHwData->LED_Blinking == 0 ) - { - pWb35Reg->U1BC_LEDConfigure |= 0x1000; - Wb35Reg_Write( pHwData, 0x03bc, pWb35Reg->U1BC_LEDConfigure ); // LED_1 On - pHwData->LED_Blinking = 1; - TimeInterval = 300; - } - else - { - pWb35Reg->U1BC_LEDConfigure &= ~0x1000; - Wb35Reg_Write( pHwData, 0x03bc, pWb35Reg->U1BC_LEDConfigure ); // LED_1 Off - pHwData->LED_Blinking = 0; - TimeInterval = 300; - } - } - else - { - //Turn Off LED_1 - if( pWb35Reg->U1BC_LEDConfigure & 0x1000 ) - { - pWb35Reg->U1BC_LEDConfigure &= ~0x1000; - Wb35Reg_Write( pHwData, 0x03bc, pWb35Reg->U1BC_LEDConfigure ); // LED_1 Off - } - } - } - else - { - // Is transmitting/receiving ?? - if( (OS_CURRENT_RX_BYTE( Adapter ) != pHwData->RxByteCountLast ) || - (OS_CURRENT_TX_BYTE( Adapter ) != pHwData->TxByteCountLast ) ) - { - if( (pWb35Reg->U1BC_LEDConfigure & 0x3000) != 0x3000 ) - { - pWb35Reg->U1BC_LEDConfigure |= 0x3000; - Wb35Reg_Write( pHwData, 0x03bc, pWb35Reg->U1BC_LEDConfigure ); // LED_1 On - } - - // Update variable - pHwData->RxByteCountLast = OS_CURRENT_RX_BYTE( Adapter ); - pHwData->TxByteCountLast = OS_CURRENT_TX_BYTE( Adapter ); - TimeInterval = 200; - } - else - { - // Turn On LED_1 and blinking if transmitting/receiving - if( (pWb35Reg->U1BC_LEDConfigure & 0x3000) != 0x1000 ) - { - pWb35Reg->U1BC_LEDConfigure &= ~0x3000; - pWb35Reg->U1BC_LEDConfigure |= 0x1000; - Wb35Reg_Write( pHwData, 0x03bc, pWb35Reg->U1BC_LEDConfigure ); // LED_1 On - } - } - } - break; - - default: // Default setting. 2 LED be placed on PCB. LED_0: Link On LED_1 Active - if( (pWb35Reg->U1BC_LEDConfigure & 0x3000) != 0x3000 ) - { - pWb35Reg->U1BC_LEDConfigure |= 0x3000;// LED_1 is always on and event enable - Wb35Reg_Write( pHwData, 0x03bc, pWb35Reg->U1BC_LEDConfigure ); - } - - if( pHwData->LED_Blinking ) - { - // Gray blinking - pWb35Reg->U1BC_LEDConfigure &= ~0x0f; - pWb35Reg->U1BC_LEDConfigure |= 0x10; - pWb35Reg->U1BC_LEDConfigure |= LEDgray[ (pHwData->LED_Blinking-1)%20 ]; - Wb35Reg_Write( pHwData, 0x03bc, pWb35Reg->U1BC_LEDConfigure ); - - pHwData->LED_Blinking += 2; - if( pHwData->LED_Blinking < 40 ) - TimeInterval = 100; - else - { - pHwData->LED_Blinking = 0; // Stop blinking - pWb35Reg->U1BC_LEDConfigure &= ~0x0f; - Wb35Reg_Write( pHwData, 0x03bc, pWb35Reg->U1BC_LEDConfigure ); - } - break; - } - - if( pHwData->LED_LinkOn ) - { - if( !(pWb35Reg->U1BC_LEDConfigure & 0x10) ) // Check the LED_0 - { - //Try to turn ON LED_0 after gray blinking - pWb35Reg->U1BC_LEDConfigure |= 0x10; - pHwData->LED_Blinking = 1; //Start blinking - TimeInterval = 50; - } - } - else - { - if( pWb35Reg->U1BC_LEDConfigure & 0x10 ) // Check the LED_0 - { - pWb35Reg->U1BC_LEDConfigure &= ~0x10; - Wb35Reg_Write( pHwData, 0x03bc, pWb35Reg->U1BC_LEDConfigure ); - } - } - break; - } - - //20060828.1 Active send null packet to avoid AP disconnect - if( pHwData->LED_LinkOn ) - { - pHwData->NullPacketCount += TimeInterval; - if( pHwData->NullPacketCount >= DEFAULT_NULL_PACKET_COUNT ) - { - pHwData->NullPacketCount = 0; - } - } - } - - pHwData->time_count += TimeInterval; - Wb35Tx_CurrentTime( pHwData, pHwData->time_count ); // 20060928 add - OS_TIMER_SET( &pHwData->LEDTimer, TimeInterval ); // 20060623.1 -} - - -void hal_set_phy_type( phw_data_t pHwData, u8 PhyType ) -{ - pHwData->phy_type = PhyType; -} - -void hal_get_phy_type( phw_data_t pHwData, u8 *PhyType ) -{ - *PhyType = pHwData->phy_type; -} - -void hal_reset_counter( phw_data_t pHwData ) -{ - pHwData->dto_tx_retry_count = 0; - pHwData->dto_tx_frag_count = 0; - memset( pHwData->tx_retry_count, 0, 8); -} - -void hal_set_radio_mode( phw_data_t pHwData, unsigned char radio_off) -{ - PWB35REG pWb35Reg = &pHwData->Wb35Reg; - - if( pHwData->SurpriseRemove ) return; - - if (radio_off) //disable Baseband receive off - { - pHwData->CurrentRadioSw = 1; // off - pWb35Reg->M24_MacControl &= 0xffffffbf; - } - else - { - pHwData->CurrentRadioSw = 0; // on - pWb35Reg->M24_MacControl |= 0x00000040; - } - Wb35Reg_Write( pHwData, 0x0824, pWb35Reg->M24_MacControl ); -} - -u8 hal_get_antenna_number( phw_data_t pHwData ) -{ - PWB35REG pWb35Reg = &pHwData->Wb35Reg; - - if ((pWb35Reg->BB2C & BIT(11)) == 0) - return 0; - else - return 1; -} - -void hal_set_antenna_number( phw_data_t pHwData, u8 number ) -{ - - PWB35REG pWb35Reg = &pHwData->Wb35Reg; - - if (number == 1) { - pWb35Reg->BB2C |= BIT(11); - } else { - pWb35Reg->BB2C &= ~BIT(11); - } - Wb35Reg_Write( pHwData, 0x102c, pWb35Reg->BB2C ); -#ifdef _PE_STATE_DUMP_ - WBDEBUG(("Current antenna number : %d\n", number)); -#endif -} - -//---------------------------------------------------------------------------------------------------- -//0 : radio on; 1: radio off -u8 hal_get_hw_radio_off( phw_data_t pHwData ) -{ - PWB35REG pWb35Reg = &pHwData->Wb35Reg; - - if( pHwData->SurpriseRemove ) return 1; - - //read the bit16 of register U1B0 - Wb35Reg_Read( pHwData, 0x3b0, &pWb35Reg->U1B0 ); - if ((pWb35Reg->U1B0 & 0x00010000)) { - pHwData->CurrentRadioHw = 1; - return 1; - } else { - pHwData->CurrentRadioHw = 0; - return 0; - } -} - -unsigned char hal_get_dxx_reg( phw_data_t pHwData, u16 number, u32 * pValue ) -{ - if( number < 0x1000 ) - number += 0x1000; - return Wb35Reg_ReadSync( pHwData, number, pValue ); -} - -unsigned char hal_set_dxx_reg( phw_data_t pHwData, u16 number, u32 value ) -{ - unsigned char ret; - - if( number < 0x1000 ) - number += 0x1000; - ret = Wb35Reg_WriteSync( pHwData, number, value ); - return ret; -} - -void hal_scan_status_indicate(phw_data_t pHwData, unsigned char IsOnProgress) -{ - if( pHwData->SurpriseRemove ) return; - pHwData->LED_Scanning = IsOnProgress ? 1 : 0; -} - -void hal_system_power_change(phw_data_t pHwData, u32 PowerState) -{ - if( PowerState != 0 ) - { - pHwData->SurpriseRemove = 1; - if( pHwData->WbUsb.IsUsb20 ) - hal_stop( pHwData ); - } - else - { - if( !pHwData->WbUsb.IsUsb20 ) - hal_stop( pHwData ); - } -} - -void hal_surprise_remove( phw_data_t pHwData ) -{ - PADAPTER Adapter = pHwData->Adapter; - if (OS_ATOMIC_INC( Adapter, &pHwData->SurpriseRemoveCount ) == 1) { - #ifdef _PE_STATE_DUMP_ - WBDEBUG(("Calling hal_surprise_remove\n")); - #endif - OS_STOP( Adapter ); - } -} - -void hal_rate_change( phw_data_t pHwData ) // Notify the HAL rate is changing 20060613.1 -{ - PADAPTER Adapter = pHwData->Adapter; - u8 rate = CURRENT_TX_RATE; - - BBProcessor_RateChanging( pHwData, rate ); -} - -void hal_set_rf_power(phw_data_t pHwData, u8 PowerIndex) -{ - RFSynthesizer_SetPowerIndex( pHwData, PowerIndex ); -} - -unsigned char hal_set_LED(phw_data_t pHwData, u32 Mode) // 20061108 for WPS led control -{ - pHwData->LED_Blinking = 0; - pHwData->LED_control = Mode; - OS_TIMER_SET( &pHwData->LEDTimer, 10 ); // 20060623 - return TRUE; -} - diff --git a/drivers/staging/winbond/wbhal.h b/drivers/staging/winbond/wbhal.h new file mode 100644 index 00000000000..289ee549146 --- /dev/null +++ b/drivers/staging/winbond/wbhal.h @@ -0,0 +1,513 @@ +#ifndef __WINBOND_WBHAL_S_H +#define __WINBOND_WBHAL_S_H + +#include <linux/types.h> +#include <linux/if_ether.h> /* for ETH_ALEN */ + +#define HAL_LED_SET_MASK 0x001c +#define HAL_LED_SET_SHIFT 2 + +/* supported RF type */ +#define RF_MAXIM_2825 0 +#define RF_MAXIM_2827 1 +#define RF_MAXIM_2828 2 +#define RF_MAXIM_2829 3 +#define RF_MAXIM_V1 15 +#define RF_AIROHA_2230 16 +#define RF_AIROHA_7230 17 +#define RF_AIROHA_2230S 18 +#define RF_WB_242 33 +#define RF_WB_242_1 34 +#define RF_DECIDE_BY_INF 255 + +/* + * ---------------------------------------------------------------- + * The follow define connect to upper layer + * User must modify for connection between HAL and upper layer + * ---------------------------------------------------------------- + */ + +/* + * ============================== + * Common define + * ============================== + */ +/* Bit 5 */ +#define HAL_USB_MODE_BURST(_H) (_H->SoftwareSet & 0x20) + +/* Scan interval */ +#define SCAN_MAX_CHNL_TIME (50) + +/* For TxL2 Frame typr recognise */ +#define FRAME_TYPE_802_3_DATA 0 +#define FRAME_TYPE_802_11_MANAGEMENT 1 +#define FRAME_TYPE_802_11_MANAGEMENT_CHALLENGE 2 +#define FRAME_TYPE_802_11_CONTROL 3 +#define FRAME_TYPE_802_11_DATA 4 +#define FRAME_TYPE_PROMISCUOUS 5 + +/* The follow definition is used for convert the frame------------ */ +#define DOT_11_SEQUENCE_OFFSET 22 /* Sequence control offset */ +#define DOT_3_TYPE_OFFSET 12 +#define DOT_11_MAC_HEADER_SIZE 24 +#define DOT_11_SNAP_SIZE 6 +#define DOT_11_TYPE_OFFSET 30 /* The start offset of 802.11 Frame. Type encapsulation. */ +#define DEFAULT_SIFSTIME 10 +#define DEFAULT_FRAGMENT_THRESHOLD 2346 /* No fragment */ +#define DEFAULT_MSDU_LIFE_TIME 0xffff + +#define LONG_PREAMBLE_PLUS_PLCPHEADER_TIME (144 + 48) +#define SHORT_PREAMBLE_PLUS_PLCPHEADER_TIME (72 + 24) +#define PREAMBLE_PLUS_SIGNAL_PLUS_SIGNALEXTENSION (16 + 4 + 6) +#define Tsym 4 + +/* Frame Type of Bits (2, 3)----------------------------------- */ +#define MAC_TYPE_MANAGEMENT 0x00 +#define MAC_TYPE_CONTROL 0x04 +#define MAC_TYPE_DATA 0x08 +#define MASK_FRAGMENT_NUMBER 0x000F +#define SEQUENCE_NUMBER_SHIFT 4 + +#define HAL_WOL_TYPE_WAKEUP_FRAME 0x01 +#define HAL_WOL_TYPE_MAGIC_PACKET 0x02 + +#define HAL_KEYTYPE_WEP40 0 +#define HAL_KEYTYPE_WEP104 1 +#define HAL_KEYTYPE_TKIP 2 /* 128 bit key */ +#define HAL_KEYTYPE_AES_CCMP 3 /* 128 bit key */ + +/* For VM state */ +enum { + VM_STOP = 0, + VM_RUNNING, + VM_COMPLETED +}; + +/* + * ================================ + * Normal Key table format + * ================================ + */ + +/* The order of KEY index is MAPPING_KEY_START_INDEX > GROUP_KEY_START_INDEX */ +#define MAX_KEY_TABLE 24 /* 24 entry for storing key data */ +#define GROUP_KEY_START_INDEX 4 +#define MAPPING_KEY_START_INDEX 8 + +/* + * ========================================= + * Descriptor + * ========================================= + */ +#define MAX_DESCRIPTOR_BUFFER_INDEX 8 /* Have to multiple of 2 */ +#define FLAG_ERROR_TX_MASK 0x000000bf +#define FLAG_ERROR_RX_MASK 0x0000083f + +#define FLAG_BAND_RX_MASK 0x10000000 /* Bit 28 */ + +struct R00_descriptor { + union { + u32 value; +#ifdef _BIG_ENDIAN_ + struct { + u32 R00_packet_or_buffer_status:1; + u32 R00_packet_in_fifo:1; + u32 R00_RESERVED:2; + u32 R00_receive_byte_count:12; + u32 R00_receive_time_index:16; + }; +#else + struct { + u32 R00_receive_time_index:16; + u32 R00_receive_byte_count:12; + u32 R00_RESERVED:2; + u32 R00_packet_in_fifo:1; + u32 R00_packet_or_buffer_status:1; + }; +#endif + }; +}; + +struct T00_descriptor { + union { + u32 value; +#ifdef _BIG_ENDIAN_ + struct { + u32 T00_first_mpdu:1; /* for hardware use */ + u32 T00_last_mpdu:1; /* for hardware use */ + u32 T00_IsLastMpdu:1;/* 0:not 1:Yes for software used */ + u32 T00_IgnoreResult:1;/* The same mechanism with T00 setting. */ + u32 T00_RESERVED_ID:2;/* 3 bit ID reserved */ + u32 T00_tx_packet_id:4; + u32 T00_RESERVED:4; + u32 T00_header_length:6; + u32 T00_frame_length:12; + }; +#else + struct { + u32 T00_frame_length:12; + u32 T00_header_length:6; + u32 T00_RESERVED:4; + u32 T00_tx_packet_id:4; + u32 T00_RESERVED_ID:2; /* 3 bit ID reserved */ + u32 T00_IgnoreResult:1; /* The same mechanism with T00 setting. */ + u32 T00_IsLastMpdu:1; /* 0:not 1:Yes for software used */ + u32 T00_last_mpdu:1; /* for hardware use */ + u32 T00_first_mpdu:1; /* for hardware use */ + }; +#endif + }; +}; + +struct R01_descriptor { + union { + u32 value; +#ifdef _BIG_ENDIAN_ + struct { + u32 R01_RESERVED:3; + u32 R01_mod_type:1; + u32 R01_pre_type:1; + u32 R01_data_rate:3; + u32 R01_AGC_state:8; + u32 R01_LNA_state:2; + u32 R01_decryption_method:2; + u32 R01_mic_error:1; + u32 R01_replay:1; + u32 R01_broadcast_frame:1; + u32 R01_multicast_frame:1; + u32 R01_directed_frame:1; + u32 R01_receive_frame_antenna_selection:1; + u32 R01_frame_receive_during_atim_window:1; + u32 R01_protocol_version_error:1; + u32 R01_authentication_frame_icv_error:1; + u32 R01_null_key_to_authentication_frame:1; + u32 R01_icv_error:1; + u32 R01_crc_error:1; + }; +#else + struct { + u32 R01_crc_error:1; + u32 R01_icv_error:1; + u32 R01_null_key_to_authentication_frame:1; + u32 R01_authentication_frame_icv_error:1; + u32 R01_protocol_version_error:1; + u32 R01_frame_receive_during_atim_window:1; + u32 R01_receive_frame_antenna_selection:1; + u32 R01_directed_frame:1; + u32 R01_multicast_frame:1; + u32 R01_broadcast_frame:1; + u32 R01_replay:1; + u32 R01_mic_error:1; + u32 R01_decryption_method:2; + u32 R01_LNA_state:2; + u32 R01_AGC_state:8; + u32 R01_data_rate:3; + u32 R01_pre_type:1; + u32 R01_mod_type:1; + u32 R01_RESERVED:3; + }; +#endif + }; +}; + +struct T01_descriptor { + union { + u32 value; +#ifdef _BIG_ENDIAN_ + struct { + u32 T01_rts_cts_duration:16; + u32 T01_fall_back_rate:3; + u32 T01_add_rts:1; + u32 T01_add_cts:1; + u32 T01_modulation_type:1; + u32 T01_plcp_header_length:1; + u32 T01_transmit_rate:3; + u32 T01_wep_id:2; + u32 T01_add_challenge_text:1; + u32 T01_inhibit_crc:1; + u32 T01_loop_back_wep_mode:1; + u32 T01_retry_abort_enable:1; + }; +#else + struct { + u32 T01_retry_abort_enable:1; + u32 T01_loop_back_wep_mode:1; + u32 T01_inhibit_crc:1; + u32 T01_add_challenge_text:1; + u32 T01_wep_id:2; + u32 T01_transmit_rate:3; + u32 T01_plcp_header_length:1; + u32 T01_modulation_type:1; + u32 T01_add_cts:1; + u32 T01_add_rts:1; + u32 T01_fall_back_rate:3; + u32 T01_rts_cts_duration:16; + }; +#endif + }; +}; + +struct T02_descriptor { + union { + u32 value; +#ifdef _BIG_ENDIAN_ + struct { + u32 T02_IsLastMpdu:1; /* The same mechanism with T00 setting */ + u32 T02_IgnoreResult:1; /* The same mechanism with T00 setting. */ + u32 T02_RESERVED_ID:2; /* The same mechanism with T00 setting */ + u32 T02_Tx_PktID:4; + u32 T02_MPDU_Cnt:4; + u32 T02_RTS_Cnt:4; + u32 T02_RESERVED:7; + u32 T02_transmit_complete:1; + u32 T02_transmit_abort_due_to_TBTT:1; + u32 T02_effective_transmission_rate:1; + u32 T02_transmit_without_encryption_due_to_wep_on_false:1; + u32 T02_discard_due_to_null_wep_key:1; + u32 T02_RESERVED_1:1; + u32 T02_out_of_MaxTxMSDULiftTime:1; + u32 T02_transmit_abort:1; + u32 T02_transmit_fail:1; + }; +#else + struct { + u32 T02_transmit_fail:1; + u32 T02_transmit_abort:1; + u32 T02_out_of_MaxTxMSDULiftTime:1; + u32 T02_RESERVED_1:1; + u32 T02_discard_due_to_null_wep_key:1; + u32 T02_transmit_without_encryption_due_to_wep_on_false:1; + u32 T02_effective_transmission_rate:1; + u32 T02_transmit_abort_due_to_TBTT:1; + u32 T02_transmit_complete:1; + u32 T02_RESERVED:7; + u32 T02_RTS_Cnt:4; + u32 T02_MPDU_Cnt:4; + u32 T02_Tx_PktID:4; + u32 T02_RESERVED_ID:2; /* The same mechanism with T00 setting */ + u32 T02_IgnoreResult:1; /* The same mechanism with T00 setting. */ + u32 T02_IsLastMpdu:1; /* The same mechanism with T00 setting */ + }; +#endif + }; +}; + +struct wb35_descriptor { /* Skip length = 8 DWORD */ + /* ID for descriptor ---, The field doesn't be cleard in the operation of Descriptor definition */ + u8 Descriptor_ID; + /* ----------------------The above region doesn't be cleared by DESCRIPTOR_RESET------ */ + u8 RESERVED[3]; + + u16 FragmentThreshold; + u8 InternalUsed; /* Only can be used by operation of descriptor definition */ + u8 Type; /* 0: 802.3 1:802.11 data frame 2:802.11 management frame */ + + u8 PreambleMode;/* 0: short 1:long */ + u8 TxRate; + u8 FragmentCount; + u8 EapFix; /* For speed up key install */ + + /* For R00 and T00 ------------------------------ */ + union { + struct R00_descriptor R00; + struct T00_descriptor T00; + }; + + /* For R01 and T01 ------------------------------ */ + union { + struct R01_descriptor R01; + struct T01_descriptor T01; + }; + + /* For R02 and T02 ------------------------------ */ + union { + u32 R02; + struct T02_descriptor T02; + }; + + /* For R03 and T03 ------------------------------ */ + /* For software used */ + union { + u32 R03; + u32 T03; + struct { + u8 buffer_number; + u8 buffer_start_index; + u16 buffer_total_size; + }; + }; + + /* For storing the buffer */ + u16 buffer_size[MAX_DESCRIPTOR_BUFFER_INDEX]; + void *buffer_address[MAX_DESCRIPTOR_BUFFER_INDEX]; +}; + +#define MAX_TXVGA_EEPROM 9 /* How many word(u16) of EEPROM will be used for TxVGA */ +#define MAX_RF_PARAMETER 32 + +struct txvga_for_50 { + u8 ChanNo; + u8 TxVgaValue; +}; + +/* + * ============================================== + * Device related include + * ============================================== + */ + +#include "wb35reg_s.h" +#include "wb35tx_s.h" +#include "wb35rx_s.h" + +/* For Hal using ============================================ */ +struct hw_data { + /* For compatible with 33 */ + u32 revision; + u32 BB3c_cal; /* The value for Tx calibration comes from EEPROM */ + u32 BB54_cal; /* The value for Rx calibration comes from EEPROM */ + + /* For surprise remove */ + u32 SurpriseRemove; /* 0: Normal 1: Surprise remove */ + u8 IsKeyPreSet; + u8 CalOneTime; + + u8 VCO_trim; + + u32 FragCount; + u32 DMAFix; /* V1_DMA_FIX The variable can be removed if driver want to save mem space for V2. */ + + /* + * =============================================== + * Definition for MAC address + * =============================================== + */ + u8 PermanentMacAddress[ETH_ALEN + 2]; /* The Ethernet addr that are stored in EEPROM. + 2 to 8-byte alignment */ + u8 CurrentMacAddress[ETH_ALEN + 2]; /* The Enthernet addr that are in used. + 2 to 8-byte alignment */ + + /* + * ========================================= + * Definition for 802.11 + * ========================================= + */ + u8 *bssid_pointer; /* Used by hal_get_bssid for return value */ + u8 bssid[8]; /* Only 6 byte will be used. 8 byte is required for read buffer */ + u8 ssid[32]; /* maximum ssid length is 32 byte */ + + u16 AID; + u8 ssid_length; + u8 Channel; + + u16 ListenInterval; + u16 CapabilityInformation; + + u16 BeaconPeriod; + u16 ProbeDelay; + + u8 bss_type;/* 0: IBSS_NET or 1:ESS_NET */ + u8 preamble;/* 0: short preamble, 1: long preamble */ + u8 slot_time_select; /* 9 or 20 value */ + u8 phy_type; /* Phy select */ + + u32 phy_para[MAX_RF_PARAMETER]; + u32 phy_number; + + u32 CurrentRadioSw; /* 0:On 1:Off */ + u32 CurrentRadioHw; /* 0:On 1:Off */ + + u8 *power_save_point; /* Used by hal_get_power_save_mode for return value */ + u8 cwmin; + u8 desired_power_save; + u8 dtim; /* Is running dtim */ + u8 mapping_key_replace_index; /* In Key table, the next index be replaced */ + + u16 MaxReceiveLifeTime; + u16 FragmentThreshold; + u16 FragmentThreshold_tmp; + u16 cwmax; + + u8 Key_slot[MAX_KEY_TABLE][8]; /* Ownership record for key slot. For Alignment */ + u32 Key_content[MAX_KEY_TABLE][12]; /* 10DW for each entry + 2 for burst command (Off and On valid bit) */ + u8 CurrentDefaultKeyIndex; + u32 CurrentDefaultKeyLength; + + /* + * ================================================== + * Variable for each module + * ================================================== + */ + struct usb_device *udev; + struct wb35_reg reg; /* Need Wb35Reg.h */ + struct wb35_tx Wb35Tx; /* Need Wb35Tx.h */ + struct wb35_rx Wb35Rx; /* Need Wb35Rx.h */ + + struct timer_list LEDTimer; /* For LED */ + + u32 LEDpoint; /* For LED */ + + u32 dto_tx_retry_count; + u32 dto_tx_frag_count; + u32 rx_ok_count[13]; /* index=0: total rx ok */ + u32 rx_err_count[13]; /* index=0: total rx err */ + + /* for Tx debug */ + u32 tx_TBTT_start_count; + u32 tx_ETR_count; + u32 tx_WepOn_false_count; + u32 tx_Null_key_count; + u32 tx_retry_count[8]; + + u8 PowerIndexFromEEPROM; /* For 2412MHz */ + u8 power_index; + u8 IsWaitJoinComplete; /* TRUE: set join request */ + u8 band; + + u16 SoftwareSet; + u16 Reserved_s; + + u32 IsInitOK; /* 0: Driver starting 1: Driver init OK */ + + /* For Phy calibration */ + s32 iq_rsdl_gain_tx_d2; + s32 iq_rsdl_phase_tx_d2; + u32 txvga_setting_for_cal; + + u8 TxVgaSettingInEEPROM[(((MAX_TXVGA_EEPROM * 2) + 3) & ~0x03)]; /* For EEPROM value */ + u8 TxVgaFor24[16]; /* Max is 14, 2 for alignment */ + struct txvga_for_50 TxVgaFor50[36]; /* 35 channels in 5G. 35x2 = 70 byte. 2 for alignments */ + + u16 Scan_Interval; + u16 RESERVED6; + + /* LED control */ + u32 LED_control; + /* + * LED_control 4 byte: Gray_Led_1[3] Gray_Led_0[2] Led[1] Led[0] + * Gray_Led + * For Led gray setting + * Led + * 0: normal control, + * LED behavior will decide by EEPROM setting + * 1: Turn off specific LED + * 2: Always on specific LED + * 3: slow blinking specific LED + * 4: fast blinking specific LED + * 5: WPS led control is set. Led0 is Red, Led1 id Green + * + * Led[1] is parameter for WPS LED mode + * 1:InProgress + * 2: Error + * 3: Session overlap + * 4: Success control + */ + u32 LED_LinkOn; /* Turn LED on control */ + u32 LED_Scanning; /* Let LED in scan process control */ + u32 LED_Blinking; /* Temp variable for shining */ + u32 RxByteCountLast; + u32 TxByteCountLast; + + /* For global timer */ + u32 time_count; /* TICK_TIME_100ms 1 = 100ms */ +}; + +#endif diff --git a/drivers/staging/winbond/wbhal_f.h b/drivers/staging/winbond/wbhal_f.h deleted file mode 100644 index ea9531ac847..00000000000 --- a/drivers/staging/winbond/wbhal_f.h +++ /dev/null @@ -1,122 +0,0 @@ -//===================================================================== -// Device related include -//===================================================================== -#ifdef WB_LINUX - #include "linux/wbusb_f.h" - #include "linux/wb35reg_f.h" - #include "linux/wb35tx_f.h" - #include "linux/wb35rx_f.h" -#else - #include "wbusb_f.h" - #include "wb35reg_f.h" - #include "wb35tx_f.h" - #include "wb35rx_f.h" -#endif - -//==================================================================================== -// Function declaration -//==================================================================================== -void hal_remove_mapping_key( phw_data_t pHwData, u8 *pmac_addr ); -void hal_remove_default_key( phw_data_t pHwData, u32 index ); -unsigned char hal_set_mapping_key( phw_data_t Adapter, u8 *pmac_addr, u8 null_key, u8 wep_on, u8 *ptx_tsc, u8 *prx_tsc, u8 key_type, u8 key_len, u8 *pkey_data ); -unsigned char hal_set_default_key( phw_data_t Adapter, u8 index, u8 null_key, u8 wep_on, u8 *ptx_tsc, u8 *prx_tsc, u8 key_type, u8 key_len, u8 *pkey_data ); -void hal_clear_all_default_key( phw_data_t pHwData ); -void hal_clear_all_group_key( phw_data_t pHwData ); -void hal_clear_all_mapping_key( phw_data_t pHwData ); -void hal_clear_all_key( phw_data_t pHwData ); -void hal_get_ethernet_address( phw_data_t pHwData, u8 *current_address ); -void hal_set_ethernet_address( phw_data_t pHwData, u8 *current_address ); -void hal_get_permanent_address( phw_data_t pHwData, u8 *pethernet_address ); -unsigned char hal_init_hardware( phw_data_t pHwData, PADAPTER Adapter ); -void hal_set_power_save_mode( phw_data_t pHwData, unsigned char power_save, unsigned char wakeup, unsigned char dtim ); -void hal_get_power_save_mode( phw_data_t pHwData, u8 *pin_pwr_save ); -void hal_set_slot_time( phw_data_t pHwData, u8 type ); -#define hal_set_atim_window( _A, _ATM ) -void hal_set_rates( phw_data_t pHwData, u8 *pbss_rates, u8 length, unsigned char basic_rate_set ); -#define hal_set_basic_rates( _A, _R, _L ) hal_set_rates( _A, _R, _L, TRUE ) -#define hal_set_op_rates( _A, _R, _L ) hal_set_rates( _A, _R, _L, FALSE ) -void hal_start_bss( phw_data_t pHwData, u8 mac_op_mode ); -void hal_join_request( phw_data_t pHwData, u8 bss_type ); // 0:BSS STA 1:IBSS STA// -void hal_stop_sync_bss( phw_data_t pHwData ); -void hal_resume_sync_bss( phw_data_t pHwData); -void hal_set_aid( phw_data_t pHwData, u16 aid ); -void hal_set_bssid( phw_data_t pHwData, u8 *pbssid ); -void hal_get_bssid( phw_data_t pHwData, u8 *pbssid ); -void hal_set_beacon_period( phw_data_t pHwData, u16 beacon_period ); -void hal_set_listen_interval( phw_data_t pHwData, u16 listen_interval ); -void hal_set_cap_info( phw_data_t pHwData, u16 capability_info ); -void hal_set_ssid( phw_data_t pHwData, u8 *pssid, u8 ssid_len ); -void hal_set_current_channel( phw_data_t pHwData, ChanInfo channel ); -void hal_set_current_channel_ex( phw_data_t pHwData, ChanInfo channel ); -void hal_get_current_channel( phw_data_t pHwData, ChanInfo *channel ); -void hal_set_accept_broadcast( phw_data_t pHwData, u8 enable ); -void hal_set_accept_multicast( phw_data_t pHwData, u8 enable ); -void hal_set_accept_beacon( phw_data_t pHwData, u8 enable ); -void hal_set_multicast_address( phw_data_t pHwData, u8 *address, u8 number ); -u8 hal_get_accept_beacon( phw_data_t pHwData ); -void hal_stop( phw_data_t pHwData ); -void hal_halt( phw_data_t pHwData, void *ppa_data ); -void hal_start_tx0( phw_data_t pHwData ); -void hal_set_phy_type( phw_data_t pHwData, u8 PhyType ); -void hal_get_phy_type( phw_data_t pHwData, u8 *PhyType ); -unsigned char hal_reset_hardware( phw_data_t pHwData, void* ppa ); -void hal_set_cwmin( phw_data_t pHwData, u8 cwin_min ); -#define hal_get_cwmin( _A ) ( (_A)->cwmin ) -void hal_set_cwmax( phw_data_t pHwData, u16 cwin_max ); -#define hal_get_cwmax( _A ) ( (_A)->cwmax ) -void hal_set_rsn_wpa( phw_data_t pHwData, u32 * RSN_IE_Bitmap , u32 * RSN_OUI_type , unsigned char bDesiredAuthMode); -//s32 hal_get_rssi( phw_data_t pHwData, u32 HalRssi ); -s32 hal_get_rssi( phw_data_t pHwData, u32 *HalRssiArry, u8 Count ); -s32 hal_get_rssi_bss( phw_data_t pHwData, u16 idx, u8 Count ); -void hal_set_connect_info( phw_data_t pHwData, unsigned char boConnect ); -u8 hal_get_est_sq3( phw_data_t pHwData, u8 Count ); -void hal_led_control_1a( phw_data_t pHwData ); -void hal_led_control( void* S1, phw_data_t pHwData, void* S3, void* S4 ); -void hal_set_rf_power( phw_data_t pHwData, u8 PowerIndex ); // 20060621 Modify -void hal_reset_counter( phw_data_t pHwData ); -void hal_set_radio_mode( phw_data_t pHwData, unsigned char boValue); -void hal_descriptor_indicate( phw_data_t pHwData, PDESCRIPTOR pDes ); -u8 hal_get_antenna_number( phw_data_t pHwData ); -void hal_set_antenna_number( phw_data_t pHwData, u8 number ); -u32 hal_get_bss_pk_cnt( phw_data_t pHwData ); -#define hal_get_region_from_EEPROM( _A ) ( (_A)->Wb35Reg.EEPROMRegion ) -void hal_set_accept_promiscuous ( phw_data_t pHwData, u8 enable); -#define hal_get_tx_buffer( _A, _B ) Wb35Tx_get_tx_buffer( _A, _B ) -u8 hal_get_hw_radio_off ( phw_data_t pHwData ); -#define hal_software_set( _A ) (_A->SoftwareSet) -#define hal_driver_init_OK( _A ) (_A->IsInitOK) -#define hal_rssi_boundary_high( _A ) (_A->RSSI_high) -#define hal_rssi_boundary_low( _A ) (_A->RSSI_low) -#define hal_scan_interval( _A ) (_A->Scan_Interval) -void hal_scan_status_indicate( phw_data_t pHwData, u8 status); // 0: complete, 1: in progress -void hal_system_power_change( phw_data_t pHwData, u32 PowerState ); // 20051230 -=D0 1=D1 .. -void hal_surprise_remove( phw_data_t pHwData ); - -#define PHY_DEBUG( msg, args... ) - - - -void hal_rate_change( phw_data_t pHwData ); // Notify the HAL rate is changing 20060613.1 -unsigned char hal_get_dxx_reg( phw_data_t pHwData, u16 number, u32 * pValue ); -unsigned char hal_set_dxx_reg( phw_data_t pHwData, u16 number, u32 value ); -#define hal_get_time_count( _P ) (_P->time_count/10) // return 100ms count -#define hal_detect_error( _P ) (_P->WbUsb.DetectCount) -unsigned char hal_set_LED( phw_data_t pHwData, u32 Mode ); // 20061108 for WPS led control - -//------------------------------------------------------------------------- -// The follow function is unused for IS89C35 -//------------------------------------------------------------------------- -#define hal_disable_interrupt(_A) -#define hal_enable_interrupt(_A) -#define hal_get_interrupt_type( _A) -#define hal_get_clear_interrupt(_A) -#define hal_ibss_disconnect(_A) hal_stop_sync_bss(_A) -#define hal_join_request_stop(_A) -unsigned char hal_idle( phw_data_t pHwData ); -#define pa_stall_execution( _A ) //OS_SLEEP( 1 ) -#define hw_get_cxx_reg( _A, _B, _C ) -#define hw_set_cxx_reg( _A, _B, _C ) -#define hw_get_dxx_reg( _A, _B, _C ) hal_get_dxx_reg( _A, _B, (u32 *)_C ) -#define hw_set_dxx_reg( _A, _B, _C ) hal_set_dxx_reg( _A, _B, (u32)_C ) - - diff --git a/drivers/staging/winbond/wbhal_s.h b/drivers/staging/winbond/wbhal_s.h deleted file mode 100644 index 2ee3f0fc1ad..00000000000 --- a/drivers/staging/winbond/wbhal_s.h +++ /dev/null @@ -1,615 +0,0 @@ -//[20040722 WK] -#define HAL_LED_SET_MASK 0x001c //20060901 Extend -#define HAL_LED_SET_SHIFT 2 - -//supported RF type -#define RF_MAXIM_2825 0 -#define RF_MAXIM_2827 1 -#define RF_MAXIM_2828 2 -#define RF_MAXIM_2829 3 -#define RF_MAXIM_V1 15 -#define RF_AIROHA_2230 16 -#define RF_AIROHA_7230 17 -#define RF_AIROHA_2230S 18 // 20060420 Add this -// #define RF_RFMD_2959 32 // 20060626 Remove all about RFMD -#define RF_WB_242 33 -#define RF_WB_242_1 34 // 20060619.5 Add -#define RF_DECIDE_BY_INF 255 - -//---------------------------------------------------------------- -// The follow define connect to upper layer -// User must modify for connection between HAL and upper layer -//---------------------------------------------------------------- - - - - -///////////////////////////////////////////////////////////////////////////////////////////////////// -//================================================================================================ -// Common define -//================================================================================================ -#define HAL_USB_MODE_BURST( _H ) (_H->SoftwareSet & 0x20 ) // Bit 5 20060901 Modify - -// Scan interval -#define SCAN_MAX_CHNL_TIME (50) - -// For TxL2 Frame typr recognise -#define FRAME_TYPE_802_3_DATA 0 -#define FRAME_TYPE_802_11_MANAGEMENT 1 -#define FRAME_TYPE_802_11_MANAGEMENT_CHALLENGE 2 -#define FRAME_TYPE_802_11_CONTROL 3 -#define FRAME_TYPE_802_11_DATA 4 -#define FRAME_TYPE_PROMISCUOUS 5 - -// The follow definition is used for convert the frame-------------------- -#define DOT_11_SEQUENCE_OFFSET 22 //Sequence control offset -#define DOT_3_TYPE_OFFSET 12 -#define DOT_11_MAC_HEADER_SIZE 24 -#define DOT_11_SNAP_SIZE 6 -#define DOT_11_TYPE_OFFSET 30 //The start offset of 802.11 Frame. Type encapsulatuin. -#define DEFAULT_SIFSTIME 10 -#define DEFAULT_FRAGMENT_THRESHOLD 2346 // No fragment -#define DEFAULT_MSDU_LIFE_TIME 0xffff - -#define LONG_PREAMBLE_PLUS_PLCPHEADER_TIME (144+48) -#define SHORT_PREAMBLE_PLUS_PLCPHEADER_TIME (72+24) -#define PREAMBLE_PLUS_SIGNAL_PLUS_SIGNALEXTENSION (16+4+6) -#define Tsym 4 - -// Frame Type of Bits (2, 3)--------------------------------------------- -#define MAC_TYPE_MANAGEMENT 0x00 -#define MAC_TYPE_CONTROL 0x04 -#define MAC_TYPE_DATA 0x08 -#define MASK_FRAGMENT_NUMBER 0x000F -#define SEQUENCE_NUMBER_SHIFT 4 - -#define HAL_WOL_TYPE_WAKEUP_FRAME 0x01 -#define HAL_WOL_TYPE_MAGIC_PACKET 0x02 - -// 20040106 ADDED -#define HAL_KEYTYPE_WEP40 0 -#define HAL_KEYTYPE_WEP104 1 -#define HAL_KEYTYPE_TKIP 2 // 128 bit key -#define HAL_KEYTYPE_AES_CCMP 3 // 128 bit key - -// For VM state -enum { - VM_STOP = 0, - VM_RUNNING, - VM_COMPLETED -}; - -// Be used for 802.11 mac header -typedef struct _MAC_FRAME_CONTROL { - u8 mac_frame_info; // this is a combination of the protovl version, type and subtype - u8 to_ds:1; - u8 from_ds:1; - u8 more_frag:1; - u8 retry:1; - u8 pwr_mgt:1; - u8 more_data:1; - u8 WEP:1; - u8 order:1; -} MAC_FRAME_CONTROL, *PMAC_FRAME_CONTROL; - -//----------------------------------------------------- -// Normal Key table format -//----------------------------------------------------- -// The order of KEY index is MAPPING_KEY_START_INDEX > GROUP_KEY_START_INDEX -#define MAX_KEY_TABLE 24 // 24 entry for storing key data -#define GROUP_KEY_START_INDEX 4 -#define MAPPING_KEY_START_INDEX 8 -typedef struct _KEY_TABLE -{ - u32 DW0_Valid:1; - u32 DW0_NullKey:1; - u32 DW0_Security_Mode:2;//0:WEP 40 bit 1:WEP 104 bit 2:TKIP 128 bit 3:CCMP 128 bit - u32 DW0_WEPON:1; - u32 DW0_RESERVED:11; - u32 DW0_Address1:16; - - u32 DW1_Address2; - - u32 DW2_RxSequenceCount1; - - u32 DW3_RxSequenceCount2:16; - u32 DW3_RESERVED:16; - - u32 DW4_TxSequenceCount1; - - u32 DW5_TxSequenceCount2:16; - u32 DW5_RESERVED:16; - -} KEY_TABLE, *PKEY_TABLE; - -//-------------------------------------------------------- -// Descriptor -//-------------------------------------------------------- -#define MAX_DESCRIPTOR_BUFFER_INDEX 8 // Have to multiple of 2 -//#define FLAG_ERROR_TX_MASK cpu_to_le32(0x000000bf) //20061009 marked by anson's endian -#define FLAG_ERROR_TX_MASK 0x000000bf //20061009 anson's endian -//#define FLAG_ERROR_RX_MASK 0x00000c3f -//#define FLAG_ERROR_RX_MASK cpu_to_le32(0x0000083f) //20061009 marked by anson's endian - //Don't care replay error, - //it is handled by S/W -#define FLAG_ERROR_RX_MASK 0x0000083f //20060926 anson's endian - -#define FLAG_BAND_RX_MASK 0x10000000 //Bit 28 - -typedef struct _R00_DESCRIPTOR -{ - union - { - u32 value; - #ifdef _BIG_ENDIAN_ //20060926 anson's endian - struct - { - u32 R00_packet_or_buffer_status:1; - u32 R00_packet_in_fifo:1; - u32 R00_RESERVED:2; - u32 R00_receive_byte_count:12; - u32 R00_receive_time_index:16; - }; - #else - struct - { - u32 R00_receive_time_index:16; - u32 R00_receive_byte_count:12; - u32 R00_RESERVED:2; - u32 R00_packet_in_fifo:1; - u32 R00_packet_or_buffer_status:1; - }; - #endif - }; -} R00_DESCRIPTOR, *PR00_DESCRIPTOR; - -typedef struct _T00_DESCRIPTOR -{ - union - { - u32 value; - #ifdef _BIG_ENDIAN_ //20061009 anson's endian - struct - { - u32 T00_first_mpdu:1; // for hardware use - u32 T00_last_mpdu:1; // for hardware use - u32 T00_IsLastMpdu:1;// 0: not 1:Yes for software used - u32 T00_IgnoreResult:1;// The same mechanism with T00 setting. 050111 Modify for TS - u32 T00_RESERVED_ID:2;//3 bit ID reserved - u32 T00_tx_packet_id:4;//930519.4.e 930810.3.c - u32 T00_RESERVED:4; - u32 T00_header_length:6; - u32 T00_frame_length:12; - }; - #else - struct - { - u32 T00_frame_length:12; - u32 T00_header_length:6; - u32 T00_RESERVED:4; - u32 T00_tx_packet_id:4;//930519.4.e 930810.3.c - u32 T00_RESERVED_ID:2;//3 bit ID reserved - u32 T00_IgnoreResult:1;// The same mechanism with T00 setting. 050111 Modify for TS - u32 T00_IsLastMpdu:1;// 0: not 1:Yes for software used - u32 T00_last_mpdu:1; // for hardware use - u32 T00_first_mpdu:1; // for hardware use - }; - #endif - }; -} T00_DESCRIPTOR, *PT00_DESCRIPTOR; - -typedef struct _R01_DESCRIPTOR -{ - union - { - u32 value; - #ifdef _BIG_ENDIAN_ //20060926 add by anson's endian - struct - { - u32 R01_RESERVED:3; - u32 R01_mod_type:1; - u32 R01_pre_type:1; - u32 R01_data_rate:3; - u32 R01_AGC_state:8; - u32 R01_LNA_state:2; - u32 R01_decryption_method:2; - u32 R01_mic_error:1; - u32 R01_replay:1; - u32 R01_broadcast_frame:1; - u32 R01_multicast_frame:1; - u32 R01_directed_frame:1; - u32 R01_receive_frame_antenna_selection:1; - u32 R01_frame_receive_during_atim_window:1; - u32 R01_protocol_version_error:1; - u32 R01_authentication_frame_icv_error:1; - u32 R01_null_key_to_authentication_frame:1; - u32 R01_icv_error:1; - u32 R01_crc_error:1; - }; - #else - struct - { - u32 R01_crc_error:1; - u32 R01_icv_error:1; - u32 R01_null_key_to_authentication_frame:1; - u32 R01_authentication_frame_icv_error:1; - u32 R01_protocol_version_error:1; - u32 R01_frame_receive_during_atim_window:1; - u32 R01_receive_frame_antenna_selection:1; - u32 R01_directed_frame:1; - u32 R01_multicast_frame:1; - u32 R01_broadcast_frame:1; - u32 R01_replay:1; - u32 R01_mic_error:1; - u32 R01_decryption_method:2; - u32 R01_LNA_state:2; - u32 R01_AGC_state:8; - u32 R01_data_rate:3; - u32 R01_pre_type:1; - u32 R01_mod_type:1; - u32 R01_RESERVED:3; - }; - #endif - }; -} R01_DESCRIPTOR, *PR01_DESCRIPTOR; - -typedef struct _T01_DESCRIPTOR -{ - union - { - u32 value; - #ifdef _BIG_ENDIAN_ //20061009 anson's endian - struct - { - u32 T01_rts_cts_duration:16; - u32 T01_fall_back_rate:3; - u32 T01_add_rts:1; - u32 T01_add_cts:1; - u32 T01_modulation_type:1; - u32 T01_plcp_header_length:1; - u32 T01_transmit_rate:3; - u32 T01_wep_id:2; - u32 T01_add_challenge_text:1; - u32 T01_inhibit_crc:1; - u32 T01_loop_back_wep_mode:1; - u32 T01_retry_abort_ebable:1; - }; - #else - struct - { - u32 T01_retry_abort_ebable:1; - u32 T01_loop_back_wep_mode:1; - u32 T01_inhibit_crc:1; - u32 T01_add_challenge_text:1; - u32 T01_wep_id:2; - u32 T01_transmit_rate:3; - u32 T01_plcp_header_length:1; - u32 T01_modulation_type:1; - u32 T01_add_cts:1; - u32 T01_add_rts:1; - u32 T01_fall_back_rate:3; - u32 T01_rts_cts_duration:16; - }; - #endif - }; -} T01_DESCRIPTOR, *PT01_DESCRIPTOR; - -typedef struct _T02_DESCRIPTOR -{ - union - { - u32 value; - #ifdef _BIG_ENDIAN_ //20061009 add by anson's endian - struct - { - u32 T02_IsLastMpdu:1;// The same mechanism with T00 setting - u32 T02_IgnoreResult:1;// The same mechanism with T00 setting. 050111 Modify for TS - u32 T02_RESERVED_ID:2;// The same mechanism with T00 setting - u32 T02_Tx_PktID:4; - u32 T02_MPDU_Cnt:4; - u32 T02_RTS_Cnt:4; - u32 T02_RESERVED:7; - u32 T02_transmit_complete:1; - u32 T02_transmit_abort_due_to_TBTT:1; - u32 T02_effective_transmission_rate:1; - u32 T02_transmit_without_encryption_due_to_wep_on_false:1; - u32 T02_discard_due_to_null_wep_key:1; - u32 T02_RESERVED_1:1; - u32 T02_out_of_MaxTxMSDULiftTime:1; - u32 T02_transmit_abort:1; - u32 T02_transmit_fail:1; - }; - #else - struct - { - u32 T02_transmit_fail:1; - u32 T02_transmit_abort:1; - u32 T02_out_of_MaxTxMSDULiftTime:1; - u32 T02_RESERVED_1:1; - u32 T02_discard_due_to_null_wep_key:1; - u32 T02_transmit_without_encryption_due_to_wep_on_false:1; - u32 T02_effective_transmission_rate:1; - u32 T02_transmit_abort_due_to_TBTT:1; - u32 T02_transmit_complete:1; - u32 T02_RESERVED:7; - u32 T02_RTS_Cnt:4; - u32 T02_MPDU_Cnt:4; - u32 T02_Tx_PktID:4; - u32 T02_RESERVED_ID:2;// The same mechanism with T00 setting - u32 T02_IgnoreResult:1;// The same mechanism with T00 setting. 050111 Modify for TS - u32 T02_IsLastMpdu:1;// The same mechanism with T00 setting - }; - #endif - }; -} T02_DESCRIPTOR, *PT02_DESCRIPTOR; - -typedef struct _DESCRIPTOR { // Skip length = 8 DWORD - // ID for descriptor ---, The field doesn't be cleard in the operation of Descriptor definition - u8 Descriptor_ID; - //----------------------The above region doesn't be cleared by DESCRIPTOR_RESET------ - u8 RESERVED[3]; - - u16 FragmentThreshold; - u8 InternalUsed;//Only can be used by operation of descriptor definition - u8 Type;// 0: 802.3 1:802.11 data frame 2:802.11 management frame - - u8 PreambleMode;// 0: short 1:long - u8 TxRate; - u8 FragmentCount; - u8 EapFix; // For speed up key install - - // For R00 and T00 ---------------------------------------------- - union - { - R00_DESCRIPTOR R00; - T00_DESCRIPTOR T00; - }; - - // For R01 and T01 ---------------------------------------------- - union - { - R01_DESCRIPTOR R01; - T01_DESCRIPTOR T01; - }; - - // For R02 and T02 ---------------------------------------------- - union - { - u32 R02; - T02_DESCRIPTOR T02; - }; - - // For R03 and T03 ---------------------------------------------- - // For software used - union - { - u32 R03; - u32 T03; - struct - { - u8 buffer_number; - u8 buffer_start_index; - u16 buffer_total_size; - }; - }; - - // For storing the buffer - u16 buffer_size[ MAX_DESCRIPTOR_BUFFER_INDEX ]; - void* buffer_address[ MAX_DESCRIPTOR_BUFFER_INDEX ];//931130.4.q - -} DESCRIPTOR, *PDESCRIPTOR; - - -#define DEFAULT_NULL_PACKET_COUNT 180000 //20060828.1 Add. 180 seconds - -#define MAX_TXVGA_EEPROM 9 //How many word(u16) of EEPROM will be used for TxVGA -#define MAX_RF_PARAMETER 32 - -typedef struct _TXVGA_FOR_50 { - u8 ChanNo; - u8 TxVgaValue; -} TXVGA_FOR_50; - - -//===================================================================== -// Device related include -//===================================================================== - -#include "linux/wbusb_s.h" -#include "linux/wb35reg_s.h" -#include "linux/wb35tx_s.h" -#include "linux/wb35rx_s.h" - - -// For Hal using ================================================================== -typedef struct _HW_DATA_T -{ - // For compatible with 33 - u32 revision; - u32 BB3c_cal; // The value for Tx calibration comes from EEPROM - u32 BB54_cal; // The value for Rx calibration comes from EEPROM - - - // For surprise remove - u32 SurpriseRemove; // 0: Normal 1: Surprise remove - u8 InitialResource; - u8 IsKeyPreSet; - u8 CalOneTime; // 20060630.1 - - u8 VCO_trim; - - // For Fix 1'st DMA bug - u32 FragCount; - u32 DMAFix; //V1_DMA_FIX The variable can be removed if driver want to save mem space for V2. - - //======================================================================================= - // For USB driver, hal need more variables. Due to - // 1. NDIS-WDM operation - // 2. The SME, MLME and OLD MDS need Adapter structure, but the driver under HAL doesn't - // have that parameter when receiving and indicating packet. - // The MDS must input the Adapter pointer as the second parameter of hal_init_hardware. - // The function usage is different than PCI driver. - //======================================================================================= - void* Adapter; - - //=============================================== - // Definition for MAC address - //=============================================== - u8 PermanentMacAddress[ETH_LENGTH_OF_ADDRESS + 2]; // The Enthernet addr that are stored in EEPROM. + 2 to 8-byte alignment - u8 CurrentMacAddress[ETH_LENGTH_OF_ADDRESS + 2]; // The Enthernet addr that are in used. + 2 to 8-byte alignment - - //===================================================================== - // Definition for 802.11 - //===================================================================== - u8 *bssid_pointer; // Used by hal_get_bssid for return value - u8 bssid[8];// Only 6 byte will be used. 8 byte is required for read buffer - u8 ssid[32];// maximum ssid length is 32 byte - - u16 AID; - u8 ssid_length; - u8 Channel; - - u16 ListenInterval; - u16 CapabilityInformation; - - u16 BeaconPeriod; - u16 ProbeDelay; - - u8 bss_type;// 0: IBSS_NET or 1:ESS_NET - u8 preamble;// 0: short preamble, 1: long preamble - u8 slot_time_select;// 9 or 20 value - u8 phy_type;// Phy select - - u32 phy_para[MAX_RF_PARAMETER]; - u32 phy_number; - - u32 CurrentRadioSw; // 20060320.2 0:On 1:Off - u32 CurrentRadioHw; // 20060825 0:On 1:Off - - u8 *power_save_point; // Used by hal_get_power_save_mode for return value - u8 cwmin; - u8 desired_power_save; - u8 dtim;// Is running dtim - u8 mapping_key_replace_index;//In Key table, the next index be replaced 931130.4.r - - u16 MaxReceiveLifeTime; - u16 FragmentThreshold; - u16 FragmentThreshold_tmp; - u16 cwmax; - - u8 Key_slot[MAX_KEY_TABLE][8]; //Ownership record for key slot. For Alignment - u32 Key_content[MAX_KEY_TABLE][12]; // 10DW for each entry + 2 for burst command( Off and On valid bit) - u8 CurrentDefaultKeyIndex; - u32 CurrentDefaultKeyLength; - - //======================================================================== - // Variable for each module - //======================================================================== - WBUSB WbUsb; // Need WbUsb.h - WB35REG Wb35Reg; // Need Wb35Reg.h - WB35TX Wb35Tx; // Need Wb35Tx.h - WB35RX Wb35Rx; // Need Wb35Rx.h - - OS_TIMER LEDTimer;// For LED - - u32 LEDpoint;// For LED - - u32 dto_tx_retry_count; // LA20040210_DTO kevin - u32 dto_tx_frag_count; // LA20040210_DTO kevin - u32 rx_ok_count[13]; // index=0: total rx ok - //u32 rx_ok_bytes[13]; // index=0, total rx ok bytes - u32 rx_err_count[13]; // index=0: total rx err - - //for Tx debug - u32 tx_TBTT_start_count; - u32 tx_ETR_count; - u32 tx_WepOn_false_count; - u32 tx_Null_key_count; - u32 tx_retry_count[8]; - - u8 PowerIndexFromEEPROM; // For 2412MHz - u8 power_index; - u8 IsWaitJoinComplete; // TRUE: set join request - u8 band; - - u16 SoftwareSet; - u16 Reserved_s; - - u32 IsInitOK; // 0: Driver starting 1: Driver init OK - - // For Phy calibration - s32 iq_rsdl_gain_tx_d2; - s32 iq_rsdl_phase_tx_d2; - u32 txvga_setting_for_cal; // 20060703.1 Add - - u8 TxVgaSettingInEEPROM[ (((MAX_TXVGA_EEPROM*2)+3) & ~0x03) ]; // 20060621 For backup EEPROM value - u8 TxVgaFor24[16]; // Max is 14, 2 for alignment - TXVGA_FOR_50 TxVgaFor50[36]; // 35 channels in 5G. 35x2 = 70 byte. 2 for alignments - - u16 Scan_Interval; - u16 RESERVED6; - - // LED control - u32 LED_control; - // LED_control 4 byte: Gray_Led_1[3] Gray_Led_0[2] Led[1] Led[0] - // Gray_Led - // For Led gray setting - // Led - // 0: normal control, LED behavior will decide by EEPROM setting - // 1: Turn off specific LED - // 2: Always on specific LED - // 3: slow blinking specific LED - // 4: fast blinking specific LED - // 5: WPS led control is set. Led0 is Red, Led1 id Green - // Led[1] is parameter for WPS LED mode - // // 1:InProgress 2: Error 3: Session overlap 4: Success 20061108 control - - u32 LED_LinkOn; //Turn LED on control - u32 LED_Scanning; // Let LED in scan process control - u32 LED_Blinking; // Temp variable for shining - u32 RxByteCountLast; - u32 TxByteCountLast; - - s32 SurpriseRemoveCount; - - // For global timer - u32 time_count;//TICK_TIME_100ms 1 = 100ms - - // For error recover - u32 HwStop; - - // 20060828.1 for avoid AP disconnect - u32 NullPacketCount; - -} hw_data_t, *phw_data_t; - -// The mapping of Rx and Tx descriptor field -typedef struct _HAL_RATE -{ - // DSSS - u32 RESERVED_0; - u32 NumRate2MS; - u32 NumRate55MS; - u32 NumRate11MS; - - u32 RESERVED_1[4]; - - u32 NumRate1M; - u32 NumRate2ML; - u32 NumRate55ML; - u32 NumRate11ML; - - u32 RESERVED_2[4]; - - // OFDM - u32 NumRate6M; - u32 NumRate9M; - u32 NumRate12M; - u32 NumRate18M; - u32 NumRate24M; - u32 NumRate36M; - u32 NumRate48M; - u32 NumRate54M; -} HAL_RATE, *PHAL_RATE; - - diff --git a/drivers/staging/winbond/wblinux.c b/drivers/staging/winbond/wblinux.c deleted file mode 100644 index 4ed45e48831..00000000000 --- a/drivers/staging/winbond/wblinux.c +++ /dev/null @@ -1,275 +0,0 @@ -//============================================================================ -// Copyright (c) 1996-2005 Winbond Electronic Corporation -// -// Module Name: -// wblinux.c -// -// Abstract: -// Linux releated routines -// -//============================================================================ -#include "os_common.h" - -u32 -WBLINUX_MemoryAlloc(void* *VirtualAddress, u32 Length) -{ - *VirtualAddress = kzalloc( Length, GFP_ATOMIC ); //GFP_KERNEL is not suitable - - if (*VirtualAddress == NULL) - return 0; - return 1; -} - -s32 -EncapAtomicInc(PADAPTER Adapter, void* pAtomic) -{ - PWBLINUX pWbLinux = &Adapter->WbLinux; - u32 ltmp; - u32 * pltmp = (u32 *)pAtomic; - spin_lock_irq( &pWbLinux->AtomicSpinLock ); - (*pltmp)++; - ltmp = (*pltmp); - spin_unlock_irq( &pWbLinux->AtomicSpinLock ); - return ltmp; -} - -s32 -EncapAtomicDec(PADAPTER Adapter, void* pAtomic) -{ - PWBLINUX pWbLinux = &Adapter->WbLinux; - u32 ltmp; - u32 * pltmp = (u32 *)pAtomic; - spin_lock_irq( &pWbLinux->AtomicSpinLock ); - (*pltmp)--; - ltmp = (*pltmp); - spin_unlock_irq( &pWbLinux->AtomicSpinLock ); - return ltmp; -} - -unsigned char -WBLINUX_Initial(PADAPTER Adapter) -{ - PWBLINUX pWbLinux = &Adapter->WbLinux; - - spin_lock_init( &pWbLinux->SpinLock ); - spin_lock_init( &pWbLinux->AtomicSpinLock ); - return TRUE; -} - -void -WBLinux_ReceivePacket(PADAPTER Adapter, PRXLAYER1 pRxLayer1) -{ - BUG(); -} - - -void -WBLINUX_GetNextPacket(PADAPTER Adapter, PDESCRIPTOR pDes) -{ - BUG(); -} - -void -WBLINUX_GetNextPacketCompleted(PADAPTER Adapter, PDESCRIPTOR pDes) -{ - BUG(); -} - -void -WBLINUX_Destroy(PADAPTER Adapter) -{ - WBLINUX_stop( Adapter ); -#ifdef _PE_USB_INI_DUMP_ - WBDEBUG(("[w35und] unregister_netdev!\n")); -#endif -} - -void -WBLINUX_stop( PADAPTER Adapter ) -{ - PWBLINUX pWbLinux = &Adapter->WbLinux; - struct sk_buff *pSkb; - - if (OS_ATOMIC_INC( Adapter, &pWbLinux->ThreadCount ) == 1) { - // Shutdown module immediately - pWbLinux->shutdown = 1; - - while (pWbLinux->skb_array[ pWbLinux->skb_GetIndex ]) { - // Trying to free the un-sending packet - pSkb = pWbLinux->skb_array[ pWbLinux->skb_GetIndex ]; - pWbLinux->skb_array[ pWbLinux->skb_GetIndex ] = NULL; - if( in_irq() ) - dev_kfree_skb_irq( pSkb ); - else - dev_kfree_skb( pSkb ); - - pWbLinux->skb_GetIndex++; - pWbLinux->skb_GetIndex %= WBLINUX_PACKET_ARRAY_SIZE; - } - -#ifdef _PE_STATE_DUMP_ - WBDEBUG(( "[w35und] SKB_RELEASE OK\n" )); -#endif - } - - OS_ATOMIC_DEC( Adapter, &pWbLinux->ThreadCount ); -} - -void -WbWlanHalt( PADAPTER Adapter ) -{ - //--------------------- - Adapter->sLocalPara.ShutDowned = TRUE; - - Mds_Destroy( Adapter ); - - // Turn off Rx and Tx hardware ability - hal_stop( &Adapter->sHwData ); -#ifdef _PE_USB_INI_DUMP_ - WBDEBUG(("[w35und] Hal_stop O.K.\n")); -#endif - OS_SLEEP(100000);// Waiting Irp completed - - // Destroy the NDIS module - WBLINUX_Destroy( Adapter ); - - // Halt the HAL - hal_halt(&Adapter->sHwData, NULL); -} - -unsigned char -WbWLanInitialize(PADAPTER Adapter) -{ - phw_data_t pHwData; - u8 *pMacAddr; - u8 *pMacAddr2; - u32 InitStep = 0; - u8 EEPROM_region; - u8 HwRadioOff; - - // - // Setting default value for Linux - // - Adapter->sLocalPara.region_INF = REGION_AUTO; - Adapter->sLocalPara.TxRateMode = RATE_AUTO; - psLOCAL->bMacOperationMode = MODE_802_11_BG; // B/G mode - Adapter->Mds.TxRTSThreshold = DEFAULT_RTSThreshold; - Adapter->Mds.TxFragmentThreshold = DEFAULT_FRAGMENT_THRESHOLD; - hal_set_phy_type( &Adapter->sHwData, RF_WB_242_1 ); - Adapter->sLocalPara.MTUsize = MAX_ETHERNET_PACKET_SIZE; - psLOCAL->bPreambleMode = AUTO_MODE; - Adapter->sLocalPara.RadioOffStatus.boSwRadioOff = FALSE; - pHwData = &Adapter->sHwData; - hal_set_phy_type( pHwData, RF_DECIDE_BY_INF ); - - // - // Initial each module and variable - // - if (!WBLINUX_Initial(Adapter)) { -#ifdef _PE_USB_INI_DUMP_ - WBDEBUG(("[w35und]WBNDIS initialization failed\n")); -#endif - goto error; - } - - // Initial Software variable - Adapter->sLocalPara.ShutDowned = FALSE; - - //added by ws for wep key error detection - Adapter->sLocalPara.bWepKeyError= FALSE; - Adapter->sLocalPara.bToSelfPacketReceived = FALSE; - Adapter->sLocalPara.WepKeyDetectTimerCount= 2 * 100; /// 2 seconds - - // Initial USB hal - InitStep = 1; - pHwData = &Adapter->sHwData; - if (!hal_init_hardware(pHwData, Adapter)) - goto error; - - EEPROM_region = hal_get_region_from_EEPROM( pHwData ); - if (EEPROM_region != REGION_AUTO) - psLOCAL->region = EEPROM_region; - else { - if (psLOCAL->region_INF != REGION_AUTO) - psLOCAL->region = psLOCAL->region_INF; - else - psLOCAL->region = REGION_USA; //default setting - } - - // Get Software setting flag from hal - Adapter->sLocalPara.boAntennaDiversity = FALSE; - if (hal_software_set(pHwData) & 0x00000001) - Adapter->sLocalPara.boAntennaDiversity = TRUE; - - // - // For TS module - // - InitStep = 2; - - // For MDS module - InitStep = 3; - Mds_initial(Adapter); - - //======================================= - // Initialize the SME, SCAN, MLME, ROAM - //======================================= - InitStep = 4; - InitStep = 5; - InitStep = 6; - - // If no user-defined address in the registry, use the addresss "burned" on the NIC instead. - pMacAddr = Adapter->sLocalPara.ThisMacAddress; - pMacAddr2 = Adapter->sLocalPara.PermanentAddress; - hal_get_permanent_address( pHwData, Adapter->sLocalPara.PermanentAddress );// Reading ethernet address from EEPROM - if (OS_MEMORY_COMPARE(pMacAddr, "\x00\x00\x00\x00\x00\x00", MAC_ADDR_LENGTH )) // Is equal - { - memcpy( pMacAddr, pMacAddr2, MAC_ADDR_LENGTH ); - } else { - // Set the user define MAC address - hal_set_ethernet_address( pHwData, Adapter->sLocalPara.ThisMacAddress ); - } - - //get current antenna - psLOCAL->bAntennaNo = hal_get_antenna_number(pHwData); -#ifdef _PE_STATE_DUMP_ - WBDEBUG(("Driver init, antenna no = %d\n", psLOCAL->bAntennaNo)); -#endif - hal_get_hw_radio_off( pHwData ); - - // Waiting for HAL setting OK - while (!hal_idle(pHwData)) - OS_SLEEP(10000); - - MTO_Init(Adapter); - - HwRadioOff = hal_get_hw_radio_off( pHwData ); - psLOCAL->RadioOffStatus.boHwRadioOff = !!HwRadioOff; - - hal_set_radio_mode( pHwData, (unsigned char)(psLOCAL->RadioOffStatus.boSwRadioOff || psLOCAL->RadioOffStatus.boHwRadioOff) ); - - hal_driver_init_OK(pHwData) = 1; // Notify hal that the driver is ready now. - //set a tx power for reference..... -// sme_set_tx_power_level(Adapter, 12); FIXME? - return TRUE; - -error: - switch (InitStep) { - case 5: - case 4: - case 3: Mds_Destroy( Adapter ); - case 2: - case 1: WBLINUX_Destroy( Adapter ); - hal_halt( pHwData, NULL ); - case 0: break; - } - - return FALSE; -} - -void WBLINUX_ConnectStatus(PADAPTER Adapter, u32 flag) -{ - PWBLINUX pWbLinux = &Adapter->WbLinux; - - pWbLinux->LinkStatus = flag; // OS_DISCONNECTED or OS_CONNECTED -} - diff --git a/drivers/staging/winbond/wblinux_f.h b/drivers/staging/winbond/wblinux_f.h deleted file mode 100644 index 68240c5fc80..00000000000 --- a/drivers/staging/winbond/wblinux_f.h +++ /dev/null @@ -1,23 +0,0 @@ -//========================================================================= -// Copyright (c) 1996-2004 Winbond Electronic Corporation -// -// wblinux_f.h -// -u32 WBLINUX_MemoryAlloc( void* *VirtualAddress, u32 Length ); -s32 EncapAtomicInc( PADAPTER Adapter, void* pAtomic ); -s32 EncapAtomicDec( PADAPTER Adapter, void* pAtomic ); -void WBLinux_ReceivePacket( PADAPTER Adapter, PRXLAYER1 pRxLayer1 ); -unsigned char WBLINUX_Initial( PADAPTER Adapter ); -int wb35_start_xmit(struct sk_buff *skb, struct net_device *netdev ); -void WBLINUX_GetNextPacket( PADAPTER Adapter, PDESCRIPTOR pDes ); -void WBLINUX_GetNextPacketCompleted( PADAPTER Adapter, PDESCRIPTOR pDes ); -void WBLINUX_stop( PADAPTER Adapter ); -void WBLINUX_Destroy( PADAPTER Adapter ); -void wb35_set_multicast( struct net_device *netdev ); -struct net_device_stats * wb35_netdev_stats( struct net_device *netdev ); -void WBLINUX_stop( PADAPTER Adapter ); -void WbWlanHalt( PADAPTER Adapter ); -void WBLINUX_ConnectStatus( PADAPTER Adapter, u32 flag ); - - - diff --git a/drivers/staging/winbond/wblinux_s.h b/drivers/staging/winbond/wblinux_s.h deleted file mode 100644 index fd2bb43bf3c..00000000000 --- a/drivers/staging/winbond/wblinux_s.h +++ /dev/null @@ -1,45 +0,0 @@ -//============================================================ -// wblinux_s.h -// -#define OS_MEMORY_ALLOC( _V, _S ) WBLINUX_MemoryAlloc( _V, _S ) -#define OS_LINK_STATUS (Adapter->WbLinux.LinkStatus == OS_CONNECTED) -#define OS_SET_SHUTDOWN( _A ) _A->WbLinux.shutdown=1 -#define OS_SET_RESUME( _A ) _A->WbLinux.shutdown=0 -#define OS_CONNECT_STATUS_INDICATE( _A, _F ) WBLINUX_ConnectStatus( _A, _F ) -#define OS_DISCONNECTED 0 -#define OS_CONNECTED 1 -#define OS_STOP( _A ) WBLINUX_stop( _A ) - -#define OS_CURRENT_RX_BYTE( _A ) _A->WbLinux.RxByteCount -#define OS_CURRENT_TX_BYTE( _A ) _A->WbLinux.TxByteCount -#define OS_EVENT_INDICATE( _A, _B, _F ) -#define OS_PMKID_STATUS_EVENT( _A ) -#define OS_RECEIVE_PACKET_INDICATE( _A, _D ) WBLinux_ReceivePacket( _A, _D ) -#define OS_RECEIVE_802_1X_PACKET_INDICATE( _A, _D ) EAP_ReceivePacket( _A, _D ) -#define OS_GET_PACKET( _A, _D ) WBLINUX_GetNextPacket( _A, _D ) -#define OS_GET_PACKET_COMPLETE( _A, _D ) WBLINUX_GetNextPacketCompleted( _A, _D ) -#define OS_SEND_RESULT( _A, _ID, _R ) - -#define WBLINUX_PACKET_ARRAY_SIZE (ETHERNET_TX_DESCRIPTORS*4) - -typedef struct _WBLINUX -{ - spinlock_t AtomicSpinLock; - spinlock_t SpinLock; - u32 shutdown; - - OS_ATOMIC ThreadCount; - - u32 LinkStatus; // OS_DISCONNECTED or OS_CONNECTED - - u32 RxByteCount; - u32 TxByteCount; - - struct sk_buff *skb_array[ WBLINUX_PACKET_ARRAY_SIZE ]; - struct sk_buff *packet_return; - s32 skb_SetIndex; - s32 skb_GetIndex; - s32 netif_state_stop; // 1: stop 0: normal -} WBLINUX, *PWBLINUX; - - diff --git a/drivers/staging/winbond/wbusb.c b/drivers/staging/winbond/wbusb.c new file mode 100644 index 00000000000..0d29624416c --- /dev/null +++ b/drivers/staging/winbond/wbusb.c @@ -0,0 +1,853 @@ +/* + * Copyright 2008 Pavel Machek <pavel@ucw.cz> + * + * Distribute under GPLv2. + * + * The original driver was written by: + * Jeff Lee <YY_Lee@issc.com.tw> + * + * and was adapted to the 2.6 kernel by: + * Costantino Leandro (Rxart Desktop) <le_costantino@pixartargentina.com.ar> + */ +#include <net/mac80211.h> +#include <linux/usb.h> +#include <linux/module.h> + +#include "core.h" +#include "mds_f.h" +#include "mto.h" +#include "wbhal.h" +#include "wb35reg_f.h" +#include "wb35tx_f.h" +#include "wb35rx_f.h" + +MODULE_DESCRIPTION("IS89C35 802.11bg WLAN USB Driver"); +MODULE_LICENSE("GPL"); +MODULE_VERSION("0.1"); + +static const struct usb_device_id wb35_table[] = { + { USB_DEVICE(0x0416, 0x0035) }, + { USB_DEVICE(0x18E8, 0x6201) }, + { USB_DEVICE(0x18E8, 0x6206) }, + { USB_DEVICE(0x18E8, 0x6217) }, + { USB_DEVICE(0x18E8, 0x6230) }, + { USB_DEVICE(0x18E8, 0x6233) }, + { USB_DEVICE(0x1131, 0x2035) }, + { 0, } +}; + +MODULE_DEVICE_TABLE(usb, wb35_table); + +static struct ieee80211_rate wbsoft_rates[] = { + { .bitrate = 10, .flags = IEEE80211_RATE_SHORT_PREAMBLE }, +}; + +static struct ieee80211_channel wbsoft_channels[] = { + { .center_freq = 2412 }, +}; + +static struct ieee80211_supported_band wbsoft_band_2GHz = { + .channels = wbsoft_channels, + .n_channels = ARRAY_SIZE(wbsoft_channels), + .bitrates = wbsoft_rates, + .n_bitrates = ARRAY_SIZE(wbsoft_rates), +}; + +static void hal_set_beacon_period(struct hw_data *pHwData, u16 beacon_period) +{ + u32 tmp; + + if (pHwData->SurpriseRemove) + return; + + pHwData->BeaconPeriod = beacon_period; + tmp = pHwData->BeaconPeriod << 16; + tmp |= pHwData->ProbeDelay; + Wb35Reg_Write(pHwData, 0x0848, tmp); +} + +static int wbsoft_add_interface(struct ieee80211_hw *dev, + struct ieee80211_vif *vif) +{ + struct wbsoft_priv *priv = dev->priv; + + hal_set_beacon_period(&priv->sHwData, vif->bss_conf.beacon_int); + + return 0; +} + +static void wbsoft_remove_interface(struct ieee80211_hw *dev, + struct ieee80211_vif *vif) +{ +} + +static void wbsoft_stop(struct ieee80211_hw *hw) +{ +} + +static int wbsoft_get_stats(struct ieee80211_hw *hw, + struct ieee80211_low_level_stats *stats) +{ + return 0; +} + +static u64 wbsoft_prepare_multicast(struct ieee80211_hw *hw, + struct netdev_hw_addr_list *mc_list) +{ + return netdev_hw_addr_list_count(mc_list); +} + +static void wbsoft_configure_filter(struct ieee80211_hw *dev, + unsigned int changed_flags, + unsigned int *total_flags, + u64 multicast) +{ + unsigned int new_flags; + + new_flags = 0; + + if (*total_flags & FIF_PROMISC_IN_BSS) + new_flags |= FIF_PROMISC_IN_BSS; + else if ((*total_flags & FIF_ALLMULTI) || (multicast > 32)) + new_flags |= FIF_ALLMULTI; + + dev->flags &= ~IEEE80211_HW_RX_INCLUDES_FCS; + + *total_flags = new_flags; +} + +static void wbsoft_tx(struct ieee80211_hw *dev, + struct ieee80211_tx_control *control, + struct sk_buff *skb) +{ + struct wbsoft_priv *priv = dev->priv; + + if (priv->sMlmeFrame.is_in_used != PACKET_FREE_TO_USE) { + priv->sMlmeFrame.wNumTxMMPDUDiscarded++; + kfree_skb(skb); + return; + } + + priv->sMlmeFrame.is_in_used = PACKET_COME_FROM_MLME; + + priv->sMlmeFrame.pMMPDU = skb->data; + priv->sMlmeFrame.data_type = FRAME_TYPE_802_11_MANAGEMENT; + priv->sMlmeFrame.len = skb->len; + priv->sMlmeFrame.wNumTxMMPDU++; + + /* + * H/W will enter power save by set the register. S/W don't send null + * frame with PWRMgt bit enbled to enter power save now. + */ + + Mds_Tx(priv); +} + +static int wbsoft_start(struct ieee80211_hw *dev) +{ + struct wbsoft_priv *priv = dev->priv; + + priv->enabled = true; + + return 0; +} + +static void hal_set_radio_mode(struct hw_data *pHwData, unsigned char radio_off) +{ + struct wb35_reg *reg = &pHwData->reg; + + if (pHwData->SurpriseRemove) + return; + + if (radio_off) { /* disable Baseband receive off */ + pHwData->CurrentRadioSw = 1; /* off */ + reg->M24_MacControl &= 0xffffffbf; + } else { + pHwData->CurrentRadioSw = 0; /* on */ + reg->M24_MacControl |= 0x00000040; + } + Wb35Reg_Write(pHwData, 0x0824, reg->M24_MacControl); +} + +static void hal_set_current_channel_ex(struct hw_data *pHwData, struct chan_info channel) +{ + struct wb35_reg *reg = &pHwData->reg; + + if (pHwData->SurpriseRemove) + return; + + RFSynthesizer_SwitchingChannel(pHwData, channel); /* Switch channel */ + pHwData->Channel = channel.ChanNo; + pHwData->band = channel.band; + reg->M28_MacControl &= ~0xff; /* Clean channel information field */ + reg->M28_MacControl |= channel.ChanNo; + Wb35Reg_WriteWithCallbackValue(pHwData, 0x0828, reg->M28_MacControl, + (s8 *) &channel, + sizeof(struct chan_info)); +} + +static void hal_set_current_channel(struct hw_data *pHwData, struct chan_info channel) +{ + hal_set_current_channel_ex(pHwData, channel); +} + +static void hal_set_accept_broadcast(struct hw_data *pHwData, u8 enable) +{ + struct wb35_reg *reg = &pHwData->reg; + + if (pHwData->SurpriseRemove) + return; + + reg->M00_MacControl &= ~0x02000000; /* The HW value */ + + if (enable) + reg->M00_MacControl |= 0x02000000; /* The HW value */ + + Wb35Reg_Write(pHwData, 0x0800, reg->M00_MacControl); +} + +/* For wep key error detection, we need to accept broadcast packets to be received temporary. */ +static void hal_set_accept_promiscuous(struct hw_data *pHwData, u8 enable) +{ + struct wb35_reg *reg = &pHwData->reg; + + if (pHwData->SurpriseRemove) + return; + + if (enable) { + reg->M00_MacControl |= 0x00400000; + Wb35Reg_Write(pHwData, 0x0800, reg->M00_MacControl); + } else { + reg->M00_MacControl &= ~0x00400000; + Wb35Reg_Write(pHwData, 0x0800, reg->M00_MacControl); + } +} + +static void hal_set_accept_multicast(struct hw_data *pHwData, u8 enable) +{ + struct wb35_reg *reg = &pHwData->reg; + + if (pHwData->SurpriseRemove) + return; + + reg->M00_MacControl &= ~0x01000000; /* The HW value */ + if (enable) + reg->M00_MacControl |= 0x01000000; /* The HW value */ + Wb35Reg_Write(pHwData, 0x0800, reg->M00_MacControl); +} + +static void hal_set_accept_beacon(struct hw_data *pHwData, u8 enable) +{ + struct wb35_reg *reg = &pHwData->reg; + + if (pHwData->SurpriseRemove) + return; + + if (!enable) /* Due to SME and MLME are not suitable for 35 */ + return; + + reg->M00_MacControl &= ~0x04000000; /* The HW value */ + if (enable) + reg->M00_MacControl |= 0x04000000; /* The HW value */ + + Wb35Reg_Write(pHwData, 0x0800, reg->M00_MacControl); +} + +static int wbsoft_config(struct ieee80211_hw *dev, u32 changed) +{ + struct wbsoft_priv *priv = dev->priv; + struct chan_info ch; + + /* Should use channel_num, or something, as that is already pre-translated */ + ch.band = 1; + ch.ChanNo = 1; + + hal_set_current_channel(&priv->sHwData, ch); + hal_set_accept_broadcast(&priv->sHwData, 1); + hal_set_accept_promiscuous(&priv->sHwData, 1); + hal_set_accept_multicast(&priv->sHwData, 1); + hal_set_accept_beacon(&priv->sHwData, 1); + hal_set_radio_mode(&priv->sHwData, 0); + + return 0; +} + +static u64 wbsoft_get_tsf(struct ieee80211_hw *dev, struct ieee80211_vif *vif) +{ + return 0; +} + +static const struct ieee80211_ops wbsoft_ops = { + .tx = wbsoft_tx, + .start = wbsoft_start, + .stop = wbsoft_stop, + .add_interface = wbsoft_add_interface, + .remove_interface = wbsoft_remove_interface, + .config = wbsoft_config, + .prepare_multicast = wbsoft_prepare_multicast, + .configure_filter = wbsoft_configure_filter, + .get_stats = wbsoft_get_stats, + .get_tsf = wbsoft_get_tsf, +}; + +static void hal_set_ethernet_address(struct hw_data *pHwData, u8 *current_address) +{ + u32 ltmp[2]; + + if (pHwData->SurpriseRemove) + return; + + memcpy(pHwData->CurrentMacAddress, current_address, ETH_ALEN); + + ltmp[0] = cpu_to_le32(*(u32 *) pHwData->CurrentMacAddress); + ltmp[1] = cpu_to_le32(*(u32 *) (pHwData->CurrentMacAddress + 4)) & 0xffff; + + Wb35Reg_BurstWrite(pHwData, 0x03e8, ltmp, 2, AUTO_INCREMENT); +} + +static void hal_get_permanent_address(struct hw_data *pHwData, u8 *pethernet_address) +{ + if (pHwData->SurpriseRemove) + return; + + memcpy(pethernet_address, pHwData->PermanentMacAddress, 6); +} + +static void hal_stop(struct hw_data *pHwData) +{ + struct wb35_reg *reg = &pHwData->reg; + + pHwData->Wb35Rx.rx_halt = 1; + Wb35Rx_stop(pHwData); + + pHwData->Wb35Tx.tx_halt = 1; + Wb35Tx_stop(pHwData); + + reg->D00_DmaControl &= ~0xc0000000; /* Tx Off, Rx Off */ + Wb35Reg_Write(pHwData, 0x0400, reg->D00_DmaControl); +} + +static unsigned char hal_idle(struct hw_data *pHwData) +{ + struct wb35_reg *reg = &pHwData->reg; + + if (!pHwData->SurpriseRemove && reg->EP0vm_state != VM_STOP) + return false; + + return true; +} + +u8 hal_get_antenna_number(struct hw_data *pHwData) +{ + struct wb35_reg *reg = &pHwData->reg; + + if ((reg->BB2C & BIT(11)) == 0) + return 0; + else + return 1; +} + +/* 0 : radio on; 1: radio off */ +static u8 hal_get_hw_radio_off(struct hw_data *pHwData) +{ + struct wb35_reg *reg = &pHwData->reg; + + if (pHwData->SurpriseRemove) + return 1; + + /* read the bit16 of register U1B0 */ + Wb35Reg_Read(pHwData, 0x3b0, ®->U1B0); + if ((reg->U1B0 & 0x00010000)) { + pHwData->CurrentRadioHw = 1; + return 1; + } else { + pHwData->CurrentRadioHw = 0; + return 0; + } +} + +static u8 LED_GRAY[20] = { + 0, 3, 4, 6, 8, 10, 11, 12, 13, 14, 15, 14, 13, 12, 11, 10, 8, 6, 4, 2 +}; + +static u8 LED_GRAY2[30] = { + 7, 8, 9, 10, 11, 12, 13, 14, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 15, 14, 13, 12, 11, 10, 9, 8 +}; + +static void hal_led_control(unsigned long data) +{ + struct wbsoft_priv *adapter = (struct wbsoft_priv *)data; + struct hw_data *pHwData = &adapter->sHwData; + struct wb35_reg *reg = &pHwData->reg; + u32 LEDSet = (pHwData->SoftwareSet & HAL_LED_SET_MASK) >> HAL_LED_SET_SHIFT; + u32 TimeInterval = 500, ltmp, ltmp2; + ltmp = 0; + + if (pHwData->SurpriseRemove) + return; + + if (pHwData->LED_control) { + ltmp2 = pHwData->LED_control & 0xff; + if (ltmp2 == 5) { /* 5 is WPS mode */ + TimeInterval = 100; + ltmp2 = (pHwData->LED_control >> 8) & 0xff; + switch (ltmp2) { + case 1: /* [0.2 On][0.1 Off]... */ + pHwData->LED_Blinking %= 3; + ltmp = 0x1010; /* Led 1 & 0 Green and Red */ + if (pHwData->LED_Blinking == 2) /* Turn off */ + ltmp = 0; + break; + case 2: /* [0.1 On][0.1 Off]... */ + pHwData->LED_Blinking %= 2; + ltmp = 0x0010; /* Led 0 red color */ + if (pHwData->LED_Blinking) /* Turn off */ + ltmp = 0; + break; + case 3: /* [0.1 On][0.1 Off][0.1 On][0.1 Off][0.1 On][0.1 Off][0.1 On][0.1 Off][0.1 On][0.1 Off][0.5 Off]... */ + pHwData->LED_Blinking %= 15; + ltmp = 0x0010; /* Led 0 red color */ + if ((pHwData->LED_Blinking >= 9) || (pHwData->LED_Blinking % 2)) /* Turn off 0.6 sec */ + ltmp = 0; + break; + case 4: /* [300 On][ off ] */ + ltmp = 0x1000; /* Led 1 Green color */ + if (pHwData->LED_Blinking >= 3000) + ltmp = 0; /* led maybe on after 300sec * 32bit counter overlap. */ + break; + } + pHwData->LED_Blinking++; + + reg->U1BC_LEDConfigure = ltmp; + if (LEDSet != 7) { /* Only 111 mode has 2 LEDs on PCB. */ + reg->U1BC_LEDConfigure |= (ltmp & 0xff) << 8; /* Copy LED result to each LED control register */ + reg->U1BC_LEDConfigure |= (ltmp & 0xff00) >> 8; + } + Wb35Reg_Write(pHwData, 0x03bc, reg->U1BC_LEDConfigure); + } + } else if (pHwData->CurrentRadioSw || pHwData->CurrentRadioHw) { /* If radio off */ + if (reg->U1BC_LEDConfigure & 0x1010) { + reg->U1BC_LEDConfigure &= ~0x1010; + Wb35Reg_Write(pHwData, 0x03bc, reg->U1BC_LEDConfigure); + } + } else { + switch (LEDSet) { + case 4: /* [100] Only 1 Led be placed on PCB and use pin 21 of IC. Use LED_0 for showing */ + if (!pHwData->LED_LinkOn) { /* Blink only if not Link On */ + /* Blinking if scanning is on progress */ + if (pHwData->LED_Scanning) { + if (pHwData->LED_Blinking == 0) { + reg->U1BC_LEDConfigure |= 0x10; + Wb35Reg_Write(pHwData, 0x03bc, reg->U1BC_LEDConfigure); /* LED_0 On */ + pHwData->LED_Blinking = 1; + TimeInterval = 300; + } else { + reg->U1BC_LEDConfigure &= ~0x10; + Wb35Reg_Write(pHwData, 0x03bc, reg->U1BC_LEDConfigure); /* LED_0 Off */ + pHwData->LED_Blinking = 0; + TimeInterval = 300; + } + } else { + /* Turn Off LED_0 */ + if (reg->U1BC_LEDConfigure & 0x10) { + reg->U1BC_LEDConfigure &= ~0x10; + Wb35Reg_Write(pHwData, 0x03bc, reg->U1BC_LEDConfigure); /* LED_0 Off */ + } + } + } else { + /* Turn On LED_0 */ + if ((reg->U1BC_LEDConfigure & 0x10) == 0) { + reg->U1BC_LEDConfigure |= 0x10; + Wb35Reg_Write(pHwData, 0x03bc, reg->U1BC_LEDConfigure); /* LED_0 Off */ + } + } + break; + case 6: /* [110] Only 1 Led be placed on PCB and use pin 21 of IC. Use LED_0 for showing */ + if (!pHwData->LED_LinkOn) { /* Blink only if not Link On */ + /* Blinking if scanning is on progress */ + if (pHwData->LED_Scanning) { + if (pHwData->LED_Blinking == 0) { + reg->U1BC_LEDConfigure &= ~0xf; + reg->U1BC_LEDConfigure |= 0x10; + Wb35Reg_Write(pHwData, 0x03bc, reg->U1BC_LEDConfigure); /* LED_0 On */ + pHwData->LED_Blinking = 1; + TimeInterval = 300; + } else { + reg->U1BC_LEDConfigure &= ~0x1f; + Wb35Reg_Write(pHwData, 0x03bc, reg->U1BC_LEDConfigure); /* LED_0 Off */ + pHwData->LED_Blinking = 0; + TimeInterval = 300; + } + } else { + /* Gray blinking if in disconnect state and not scanning */ + ltmp = reg->U1BC_LEDConfigure; + reg->U1BC_LEDConfigure &= ~0x1f; + if (LED_GRAY2[(pHwData->LED_Blinking % 30)]) { + reg->U1BC_LEDConfigure |= 0x10; + reg->U1BC_LEDConfigure |= + LED_GRAY2[(pHwData->LED_Blinking % 30)]; + } + pHwData->LED_Blinking++; + if (reg->U1BC_LEDConfigure != ltmp) + Wb35Reg_Write(pHwData, 0x03bc, reg->U1BC_LEDConfigure); /* LED_0 Off */ + TimeInterval = 100; + } + } else { + /* Turn On LED_0 */ + if ((reg->U1BC_LEDConfigure & 0x10) == 0) { + reg->U1BC_LEDConfigure |= 0x10; + Wb35Reg_Write(pHwData, 0x03bc, reg->U1BC_LEDConfigure); /* LED_0 Off */ + } + } + break; + case 5: /* [101] Only 1 Led be placed on PCB and use LED_1 for showing */ + if (!pHwData->LED_LinkOn) { /* Blink only if not Link On */ + /* Blinking if scanning is on progress */ + if (pHwData->LED_Scanning) { + if (pHwData->LED_Blinking == 0) { + reg->U1BC_LEDConfigure |= 0x1000; + Wb35Reg_Write(pHwData, 0x03bc, reg->U1BC_LEDConfigure); /* LED_1 On */ + pHwData->LED_Blinking = 1; + TimeInterval = 300; + } else { + reg->U1BC_LEDConfigure &= ~0x1000; + Wb35Reg_Write(pHwData, 0x03bc, reg->U1BC_LEDConfigure); /* LED_1 Off */ + pHwData->LED_Blinking = 0; + TimeInterval = 300; + } + } else { + /* Turn Off LED_1 */ + if (reg->U1BC_LEDConfigure & 0x1000) { + reg->U1BC_LEDConfigure &= ~0x1000; + Wb35Reg_Write(pHwData, 0x03bc, reg->U1BC_LEDConfigure); /* LED_1 Off */ + } + } + } else { + /* Is transmitting/receiving ?? */ + if ((adapter->RxByteCount != + pHwData->RxByteCountLast) + || (adapter->TxByteCount != + pHwData->TxByteCountLast)) { + if ((reg->U1BC_LEDConfigure & 0x3000) != + 0x3000) { + reg->U1BC_LEDConfigure |= 0x3000; + Wb35Reg_Write(pHwData, 0x03bc, reg->U1BC_LEDConfigure); /* LED_1 On */ + } + /* Update variable */ + pHwData->RxByteCountLast = + adapter->RxByteCount; + pHwData->TxByteCountLast = + adapter->TxByteCount; + TimeInterval = 200; + } else { + /* Turn On LED_1 and blinking if transmitting/receiving */ + if ((reg->U1BC_LEDConfigure & 0x3000) != + 0x1000) { + reg->U1BC_LEDConfigure &= + ~0x3000; + reg->U1BC_LEDConfigure |= + 0x1000; + Wb35Reg_Write(pHwData, 0x03bc, reg->U1BC_LEDConfigure); /* LED_1 On */ + } + } + } + break; + default: /* Default setting. 2 LED be placed on PCB. LED_0: Link On LED_1 Active */ + if ((reg->U1BC_LEDConfigure & 0x3000) != 0x3000) { + reg->U1BC_LEDConfigure |= 0x3000; /* LED_1 is always on and event enable */ + Wb35Reg_Write(pHwData, 0x03bc, + reg->U1BC_LEDConfigure); + } + + if (pHwData->LED_Blinking) { + /* Gray blinking */ + reg->U1BC_LEDConfigure &= ~0x0f; + reg->U1BC_LEDConfigure |= 0x10; + reg->U1BC_LEDConfigure |= + LED_GRAY[(pHwData->LED_Blinking - 1) % 20]; + Wb35Reg_Write(pHwData, 0x03bc, + reg->U1BC_LEDConfigure); + + pHwData->LED_Blinking += 2; + if (pHwData->LED_Blinking < 40) + TimeInterval = 100; + else { + pHwData->LED_Blinking = 0; /* Stop blinking */ + reg->U1BC_LEDConfigure &= ~0x0f; + Wb35Reg_Write(pHwData, 0x03bc, + reg->U1BC_LEDConfigure); + } + break; + } + + if (pHwData->LED_LinkOn) { + if (!(reg->U1BC_LEDConfigure & 0x10)) { /* Check the LED_0 */ + /* Try to turn ON LED_0 after gray blinking */ + reg->U1BC_LEDConfigure |= 0x10; + pHwData->LED_Blinking = 1; /* Start blinking */ + TimeInterval = 50; + } + } else { + if (reg->U1BC_LEDConfigure & 0x10) { /* Check the LED_0 */ + reg->U1BC_LEDConfigure &= ~0x10; + Wb35Reg_Write(pHwData, 0x03bc, + reg->U1BC_LEDConfigure); + } + } + break; + } + } + + pHwData->time_count += TimeInterval; + Wb35Tx_CurrentTime(adapter, pHwData->time_count); + pHwData->LEDTimer.expires = jiffies + msecs_to_jiffies(TimeInterval); + add_timer(&pHwData->LEDTimer); +} + +static int hal_init_hardware(struct ieee80211_hw *hw) +{ + struct wbsoft_priv *priv = hw->priv; + struct hw_data *pHwData = &priv->sHwData; + u16 SoftwareSet; + + pHwData->MaxReceiveLifeTime = DEFAULT_MSDU_LIFE_TIME; + pHwData->FragmentThreshold = DEFAULT_FRAGMENT_THRESHOLD; + + if (!Wb35Reg_initial(pHwData)) + goto error_reg_destroy; + + if (!Wb35Tx_initial(pHwData)) + goto error_tx_destroy; + + if (!Wb35Rx_initial(pHwData)) + goto error_rx_destroy; + + init_timer(&pHwData->LEDTimer); + pHwData->LEDTimer.function = hal_led_control; + pHwData->LEDTimer.data = (unsigned long)priv; + pHwData->LEDTimer.expires = jiffies + msecs_to_jiffies(1000); + add_timer(&pHwData->LEDTimer); + + SoftwareSet = hal_software_set(pHwData); + + Wb35Rx_start(hw); + Wb35Tx_EP2VM_start(priv); + + return 0; + +error_rx_destroy: + Wb35Rx_destroy(pHwData); +error_tx_destroy: + Wb35Tx_destroy(pHwData); +error_reg_destroy: + Wb35Reg_destroy(pHwData); + + pHwData->SurpriseRemove = 1; + return -EINVAL; +} + +static int wb35_hw_init(struct ieee80211_hw *hw) +{ + struct wbsoft_priv *priv = hw->priv; + struct hw_data *pHwData = &priv->sHwData; + u8 EEPROM_region; + u8 HwRadioOff; + u8 *pMacAddr2; + u8 *pMacAddr; + int err; + + pHwData->phy_type = RF_DECIDE_BY_INF; + + priv->Mds.TxRTSThreshold = DEFAULT_RTSThreshold; + priv->Mds.TxFragmentThreshold = DEFAULT_FRAGMENT_THRESHOLD; + + priv->sLocalPara.region_INF = REGION_AUTO; + priv->sLocalPara.TxRateMode = RATE_AUTO; + priv->sLocalPara.bMacOperationMode = MODE_802_11_BG; + priv->sLocalPara.MTUsize = MAX_ETHERNET_PACKET_SIZE; + priv->sLocalPara.bPreambleMode = AUTO_MODE; + priv->sLocalPara.bWepKeyError = false; + priv->sLocalPara.bToSelfPacketReceived = false; + priv->sLocalPara.WepKeyDetectTimerCount = 2 * 100; /* 2 seconds */ + + priv->sLocalPara.RadioOffStatus.boSwRadioOff = false; + + err = hal_init_hardware(hw); + if (err) + goto error; + + EEPROM_region = hal_get_region_from_EEPROM(pHwData); + if (EEPROM_region != REGION_AUTO) + priv->sLocalPara.region = EEPROM_region; + else { + if (priv->sLocalPara.region_INF != REGION_AUTO) + priv->sLocalPara.region = priv->sLocalPara.region_INF; + else + priv->sLocalPara.region = REGION_USA; /* default setting */ + } + + Mds_initial(priv); + + /* + * If no user-defined address in the registry, use the address + * "burned" on the NIC instead. + */ + pMacAddr = priv->sLocalPara.ThisMacAddress; + pMacAddr2 = priv->sLocalPara.PermanentAddress; + + /* Reading ethernet address from EEPROM */ + hal_get_permanent_address(pHwData, priv->sLocalPara.PermanentAddress); + if (memcmp(pMacAddr, "\x00\x00\x00\x00\x00\x00", MAC_ADDR_LENGTH) == 0) + memcpy(pMacAddr, pMacAddr2, MAC_ADDR_LENGTH); + else { + /* Set the user define MAC address */ + hal_set_ethernet_address(pHwData, + priv->sLocalPara.ThisMacAddress); + } + + priv->sLocalPara.bAntennaNo = hal_get_antenna_number(pHwData); + hal_get_hw_radio_off(pHwData); + + /* Waiting for HAL setting OK */ + while (!hal_idle(pHwData)) + msleep(10); + + MTO_Init(priv); + + HwRadioOff = hal_get_hw_radio_off(pHwData); + priv->sLocalPara.RadioOffStatus.boHwRadioOff = !!HwRadioOff; + + hal_set_radio_mode(pHwData, + (unsigned char)(priv->sLocalPara.RadioOffStatus. + boSwRadioOff + || priv->sLocalPara.RadioOffStatus. + boHwRadioOff)); + + /* Notify hal that the driver is ready now. */ + hal_driver_init_OK(pHwData) = 1; + +error: + return err; +} + +static int wb35_probe(struct usb_interface *intf, + const struct usb_device_id *id_table) +{ + struct usb_device *udev = interface_to_usbdev(intf); + struct usb_endpoint_descriptor *endpoint; + struct usb_host_interface *interface; + struct ieee80211_hw *dev; + struct wbsoft_priv *priv; + int err; + u32 ltmp; + + usb_get_dev(udev); + + /* Check the device if it already be opened */ + err = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), + 0x01, + USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_IN, + 0x0, 0x400, <mp, 4, HZ * 100); + if (err < 0) + goto error; + + /* Is already initialized? */ + ltmp = cpu_to_le32(ltmp); + if (ltmp) { + err = -EBUSY; + goto error; + } + + dev = ieee80211_alloc_hw(sizeof(*priv), &wbsoft_ops); + if (!dev) { + err = -ENOMEM; + goto error; + } + + priv = dev->priv; + + priv->sHwData.udev = udev; + + interface = intf->cur_altsetting; + endpoint = &interface->endpoint[0].desc; + + err = wb35_hw_init(dev); + if (err) + goto error_free_hw; + + SET_IEEE80211_DEV(dev, &udev->dev); + { + struct hw_data *pHwData = &priv->sHwData; + unsigned char dev_addr[MAX_ADDR_LEN]; + hal_get_permanent_address(pHwData, dev_addr); + SET_IEEE80211_PERM_ADDR(dev, dev_addr); + } + + dev->extra_tx_headroom = 12; /* FIXME */ + dev->flags = IEEE80211_HW_SIGNAL_UNSPEC; + dev->wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION); + + dev->max_signal = 100; + dev->queues = 1; + + dev->wiphy->bands[IEEE80211_BAND_2GHZ] = &wbsoft_band_2GHz; + + err = ieee80211_register_hw(dev); + if (err) + goto error_free_hw; + + usb_set_intfdata(intf, dev); + + return 0; + +error_free_hw: + ieee80211_free_hw(dev); +error: + usb_put_dev(udev); + return err; +} + +static void hal_halt(struct hw_data *pHwData) +{ + del_timer_sync(&pHwData->LEDTimer); + /* XXX: Wait for Timer DPC exit. */ + msleep(100); + Wb35Rx_destroy(pHwData); + Wb35Tx_destroy(pHwData); + Wb35Reg_destroy(pHwData); +} + +static void wb35_hw_halt(struct wbsoft_priv *adapter) +{ + /* Turn off Rx and Tx hardware ability */ + hal_stop(&adapter->sHwData); + /* Waiting Irp completed */ + msleep(100); + + hal_halt(&adapter->sHwData); +} + +static void wb35_disconnect(struct usb_interface *intf) +{ + struct ieee80211_hw *hw = usb_get_intfdata(intf); + struct wbsoft_priv *priv = hw->priv; + + wb35_hw_halt(priv); + + ieee80211_stop_queues(hw); + ieee80211_unregister_hw(hw); + ieee80211_free_hw(hw); + + usb_set_intfdata(intf, NULL); + usb_put_dev(interface_to_usbdev(intf)); +} + +static struct usb_driver wb35_driver = { + .name = "w35und", + .id_table = wb35_table, + .probe = wb35_probe, + .disconnect = wb35_disconnect, +}; + +module_usb_driver(wb35_driver); |
