diff options
Diffstat (limited to 'drivers/staging/winbond')
53 files changed, 2345 insertions, 4143 deletions
diff --git a/drivers/staging/winbond/Kconfig b/drivers/staging/winbond/Kconfig index 425219ed7ab..940460c39f3 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_80211 && USB && EXPERIMENTAL 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..b49c9730edd 100644 --- a/drivers/staging/winbond/Makefile +++ b/drivers/staging/winbond/Makefile @@ -1,15 +1,14 @@ - 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-objs := \ + mds.o \ + mlmetxrx.o \ + mto.o \ phy_calibration.o \ reg.o \ - rxisr.o \ - sme_api.o \ + wb35reg.o \ + wb35rx.o \ + wb35tx.o \ wbhal.o \ - wblinux.o \ + wbusb.o \ obj-$(CONFIG_W35UND) += w35und.o 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 index 01318315399..a433b5a8592 100644 --- a/drivers/staging/winbond/bss_f.h +++ b/drivers/staging/winbond/bss_f.h @@ -1,59 +1,63 @@ +#ifndef __WINBOND_BSS_F_H +#define __WINBOND_BSS_F_H + +#include "core.h" + +struct PMKID_Information_Element; + // // 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, +void vBSSdescriptionInit(struct wbsoft_priv * adapter); +void vBSSfoundList(struct wbsoft_priv * adapter); +u8 boChanFilter(struct wbsoft_priv * adapter, u8 ChanNo); +u16 wBSSallocateEntry(struct wbsoft_priv * adapter); +u16 wBSSGetEntry(struct wbsoft_priv * adapter); +void vSimpleHouseKeeping(struct wbsoft_priv * adapter); +u16 wBSShouseKeeping(struct wbsoft_priv * adapter); +void ClearBSSdescpt(struct wbsoft_priv * adapter, u16 i); +u16 wBSSfindBssID(struct wbsoft_priv * adapter, u8 *pbBssid); +u16 wBSSfindDedicateCandidate(struct wbsoft_priv * adapter, struct SSID_Element *psSsid, u8 *pbBssid); +u16 wBSSfindMACaddr(struct wbsoft_priv * adapter, u8 *pbMacAddr); +u16 wBSSsearchMACaddr(struct wbsoft_priv * adapter, u8 *pbMacAddr, u8 band); +u16 wBSSaddScanData(struct wbsoft_priv *, u16, psRXDATA); +u16 wBSSUpdateScanData(struct wbsoft_priv * adapter, u16 wBssIdx, psRXDATA psRcvData); +u16 wBSScreateIBSSdata(struct wbsoft_priv * adapter, PWB_BSSDESCRIPTION psDesData); +void DesiredRate2BSSdescriptor(struct wbsoft_priv * adapter, PWB_BSSDESCRIPTION psDesData, u8 *pBasicRateSet, u8 BasicRateCount, u8 *pOperationRateSet, u8 OperationRateCount); -void DesiredRate2InfoElement(PWB32_ADAPTER Adapter, u8 *addr, u16 *iFildOffset, +void DesiredRate2InfoElement(struct wbsoft_priv * adapter, u8 *addr, u16 *iFildOffset, u8 *pBasicRateSet, u8 BasicRateCount, u8 *pOperationRateSet, u8 OperationRateCount); -void BSSAddIBSSdata(PWB32_ADAPTER Adapter, PWB_BSSDESCRIPTION psDesData); +void BSSAddIBSSdata(struct wbsoft_priv * 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); +u16 wBSSfindSSID(struct wbsoft_priv * adapter, struct SSID_Element *psSsid); +u16 wRoamingQuery(struct wbsoft_priv * adapter); +void vRateToBitmap(struct wbsoft_priv * adapter, u16 index); +u8 bRateToBitmapIndex(struct wbsoft_priv * 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); +unsigned char boIsERPsta(struct wbsoft_priv * adapter, u16 i); +unsigned char boCheckConnect(struct wbsoft_priv * adapter); +unsigned char boCheckSignal(struct wbsoft_priv * adapter); +void AddIBSSIe(struct wbsoft_priv * adapter,PWB_BSSDESCRIPTION psDesData );//added by ws for WPA_None06/01/04 +void BssScanUpToDate(struct wbsoft_priv * adapter); +void BssUpToDate(struct wbsoft_priv * 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 RateReSortForSRate(struct wbsoft_priv * adapter, u8 *RateArray, u8 num); +void Assemble_IE(struct wbsoft_priv * adapter, u16 wBssIdx); +void SetMaxTxRate(struct wbsoft_priv * adapter); -void CreateWpaIE(PWB32_ADAPTER Adapter, u16* iFildOffset, u8 *msg, struct Management_Frame* msgHeader, +void CreateWpaIE(struct wbsoft_priv * 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, +void CreateRsnIE(struct wbsoft_priv * 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, +u16 SearchPmkid(struct wbsoft_priv * adapter, struct Management_Frame* msgHeader, struct PMKID_Information_Element * AssoReq_PMKID ); #endif - - - - +#endif diff --git a/drivers/staging/winbond/bssdscpt.h b/drivers/staging/winbond/bssdscpt.h index 97150a2655f..3a71d4efb89 100644 --- a/drivers/staging/winbond/bssdscpt.h +++ b/drivers/staging/winbond/bssdscpt.h @@ -1,3 +1,11 @@ +#ifndef __WINBOND_BSSDSCPT_H +#define __WINBOND_BSSDSCPT_H + +#include <linux/types.h> + +#include "mds_s.h" +#include "mlme_s.h" + //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // bssdscpt.c // BSS descriptor data base @@ -78,8 +86,8 @@ typedef struct BSSDescriptionElement 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 + void* psadapter; // pointer to THIS adapter + struct timer_list timer; // MLME timer // Authentication u16 wAuthAlgo; // peer MAC MLME use Auth algorithm, default OPEN_AUTH @@ -148,9 +156,9 @@ typedef struct BSSDescriptionElement } WB_BSSDESCRIPTION, *PWB_BSSDESCRIPTION; -#define wBSSConnectedSTA(Adapter) \ - ((u16)(Adapter)->sLocalPara.wConnectedSTAindex) - -#define psBSS(i) (&(Adapter->asBSSDescriptElement[(i)])) +#define wBSSConnectedSTA(adapter) \ + ((u16)(adapter)->sLocalPara.wConnectedSTAindex) +#define psBSS(i) (&(adapter->asBSSDescriptElement[(i)])) +#endif diff --git a/drivers/staging/winbond/common.h b/drivers/staging/winbond/common.h new file mode 100644 index 00000000000..c4d96041e9a --- /dev/null +++ b/drivers/staging/winbond/common.h @@ -0,0 +1,27 @@ +// +// 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 + +//#define DEBUG_ENABLED 1 + +//================================================================================================== +// Common function definition +//================================================================================================== +#define DEBUG_ENABLED +#define ETH_LENGTH_OF_ADDRESS 6 +#ifdef DEBUG_ENABLED +#define WBDEBUG( _M ) printk _M +#else +#define WBDEBUG( _M ) 0 +#endif + +#endif // COMMON_DEF + diff --git a/drivers/staging/winbond/core.h b/drivers/staging/winbond/core.h new file mode 100644 index 00000000000..fe142a10ea8 --- /dev/null +++ b/drivers/staging/winbond/core.h @@ -0,0 +1,42 @@ +#ifndef __WINBOND_CORE_H +#define __WINBOND_CORE_H + +#include <linux/wireless.h> + +#include "bssdscpt.h" +#include "mto.h" +#include "wbhal_s.h" + +#define WBLINUX_PACKET_ARRAY_SIZE (ETHERNET_TX_DESCRIPTORS*4) + +#define WB_MAX_LINK_NAME_LEN 40 + +struct wbsoft_priv { + 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; + + spinlock_t SpinLock; + + atomic_t ThreadCount; + + u32 RxByteCount; + u32 TxByteCount; + + struct sk_buff *packet_return; + s32 netif_state_stop; // 1: stop 0: normal + struct iw_statistics iw_stats; + + u8 LinkName[WB_MAX_LINK_NAME_LEN]; + + bool enabled; +}; + +#endif /* __WINBOND_CORE_H */ diff --git a/drivers/staging/winbond/ds_tkip.h b/drivers/staging/winbond/ds_tkip.h index 6841d66e7e8..9c5c4e73f2c 100644 --- a/drivers/staging/winbond/ds_tkip.h +++ b/drivers/staging/winbond/ds_tkip.h @@ -1,3 +1,8 @@ +#ifndef __WINBOND_DS_TKIP_H +#define __WINBOND_DS_TKIP_H + +#include <linux/types.h> + // Rotation functions on 32 bit values #define ROL32( A, n ) \ ( ((A) << (n)) | ( ((A)>>(32-(n))) & ( (1UL << (n)) - 1 ) ) ) @@ -26,8 +31,7 @@ typedef struct tkip } 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 ); - - +void Mds_MicGet( void* adapter, void* pRxLayer1, u8 *pKey, u8 *pMic ); +void Mds_MicFill( void* adapter, void* pDes, u8 *XmitBufAddress ); +#endif diff --git a/drivers/staging/winbond/gl_80211.h b/drivers/staging/winbond/gl_80211.h index 1806d817496..5a244c44a61 100644 --- a/drivers/staging/winbond/gl_80211.h +++ b/drivers/staging/winbond/gl_80211.h @@ -1,7 +1,8 @@ - #ifndef __GL_80211_H__ #define __GL_80211_H__ +#include <linux/types.h> + /****************** CONSTANT AND MACRO SECTION ******************************/ /* BSS Type */ 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/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/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/wbusb.c b/drivers/staging/winbond/linux/wbusb.c deleted file mode 100644 index f4a7875f238..00000000000 --- a/drivers/staging/winbond/linux/wbusb.c +++ /dev/null @@ -1,387 +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) -{ - PADAPTER Adapter = (PADAPTER)netdev->priv; - 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/localpara.h b/drivers/staging/winbond/localpara.h index 268cf916ab4..607bb0526cf 100644 --- a/drivers/staging/winbond/localpara.h +++ b/drivers/staging/winbond/localpara.h @@ -1,6 +1,12 @@ +#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 @@ -25,7 +31,7 @@ #define LOCAL_UNKNOWN_5_CHANNEL_NUM 34 //not include 165 -#define psLOCAL (&(Adapter->sLocalPara)) +#define psLOCAL (&(adapter->sLocalPara)) #define MODE_802_11_BG 0 #define MODE_802_11_A 1 @@ -143,7 +149,6 @@ typedef struct LOCAL_PARA //// power-save variables u8 iPowerSaveMode; // 0 indicates it is on, 1 indicates it is off - u8 ShutDowned; u8 ATIMmode; u8 ExcludeUnencrypted; @@ -272,4 +277,4 @@ typedef struct LOCAL_PARA } WB_LOCALDESCRIPT, *PWB_LOCALDESCRIPT; - +#endif diff --git a/drivers/staging/winbond/mac_structures.h b/drivers/staging/winbond/mac_structures.h index 031d2cb6cd6..0d1619601c0 100644 --- a/drivers/staging/winbond/mac_structures.h +++ b/drivers/staging/winbond/mac_structures.h @@ -21,6 +21,7 @@ #ifndef _MAC_Structures_H_ #define _MAC_Structures_H_ +#include <linux/skbuff.h> //========================================================= // Some miscellaneous definitions @@ -115,10 +116,6 @@ #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 { @@ -464,7 +461,7 @@ 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 + SUITE_SELECTOR OuiWPAAdditional;//WPA version 2.0 additional field, and should be 00:50:F2:01 u16 Version; SUITE_SELECTOR GroupKeySuite; u16 PairwiseKeySuiteCount; diff --git a/drivers/staging/winbond/mds.c b/drivers/staging/winbond/mds.c index f1de813f9c7..e431406e25a 100644 --- a/drivers/staging/winbond/mds.c +++ b/drivers/staging/winbond/mds.c @@ -1,445 +1,39 @@ +#include "ds_tkip.h" +#include "gl_80211.h" +#include "mds_f.h" +#include "mlmetxrx_f.h" +#include "mto_f.h" #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 "wbhal_f.h" +#include "wblinux_f.h" unsigned char -Mds_initial(PADAPTER Adapter) +Mds_initial(struct wbsoft_priv * adapter) { - PMDS pMds = &Adapter->Mds; + PMDS 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 ); -} - -void -Mds_Destroy(PADAPTER Adapter) -{ - 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; - - - if (pMds->TxPause) - return; - if (!hal_driver_init_OK(pHwData)) - return; - - //Only one thread can be run here - if (!OS_ATOMIC_INC( Adapter, &pMds->TxThreadCount) == 1) - goto cleanup; - - // 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; - } - - XmitBufAddress = pMds->pTxBuffer + (MAX_USB_TX_BUFFER * FillIndex); //Get buffer - XmitBufSize = 0; - FillCount = 0; - do { - PacketSize = Adapter->sMlmeFrame.len; - if (!PacketSize) - break; - - //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 - } - - - // - // 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 ); - - // Copy header. 8byte USB + 24byte 802.11Hdr. Set TxRate, Preamble type - Mds_HeaderCopy( Adapter, pTxDes, XmitBufAddress ); - - // 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; - } - - // 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); - - // - // Calculation MIC from buffer which maybe fragment, then fill into temporary address 8 byte - // 931130.5.e - if (MICAdd) - Mds_MicFill( Adapter, pTxDes, XmitBufAddress ); - - //Shift to the next address - XmitBufSize += CurrentSize; - XmitBufAddress += CurrentSize; - -#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; - - // Get packet to transmit completed, 1:TESTSTA 2:MLME 3: Ndis data - MLME_SendComplete(Adapter, 0, TRUE); - - // 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 - - // Move to the next one, if necessary - if (BufferFilled) { - // size setting - pMds->TxBufferSize[ FillIndex ] = XmitBufSize; - - // 20060928 set Tx count - pMds->TxCountInBuffer[FillIndex] = FillCount; - - // Set owner flag - pMds->TxOwner[FillIndex] = 1; - - pMds->TxFillIndex++; - pMds->TxFillIndex %= MAX_USB_TX_BUFFER_NUMBER; - BufferFilled = FALSE; - } else - break; - - if (!PacketSize) // No more pk for transmitting - break; - - } while(TRUE); - - // - // Start to send by lower module - // - if (!pHwData->IsKeyPreSet) - Wb35Tx_start(pHwData); - - cleanup: - OS_ATOMIC_DEC( Adapter, &pMds->TxThreadCount ); + return hal_get_tx_buffer( &adapter->sHwData, &pMds->pTxBuffer ); } 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; - - 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; - - 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); - } - 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)); -} - -void -Mds_HeaderCopy(PADAPTER Adapter, PDESCRIPTOR pDes, u8 *TargetBuffer) -{ - PMDS pMds = &Adapter->Mds; - u8 *src_buffer = pDes->buffer_address[0];//931130.5.g - PT00_DESCRIPTOR pT00; - PT01_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; - TargetBuffer += 4; - pT01 = (PT01_DESCRIPTOR)TargetBuffer; - TargetBuffer += 4; - - 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 - - // 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 - 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 - FragmentThreshold -= (DOT_11_MAC_HEADER_SIZE + 4); - pDes->FragmentThreshold = FragmentThreshold; - - // Set more frag bit - TargetBuffer[1] |= 0x04;// Set more frag bit - - // - // Set tx rate - // - stmp = *(u16 *)(TargetBuffer+30); // 2n alignment address - - //Use basic rate - ctmp1 = ctmpf = CURRENT_TX_RATE_FOR_MNG; - - pDes->TxRate = ctmp1; - #ifdef _PE_TX_DUMP_ - WBDEBUG(("Tx rate =%x\n", ctmp1)); - #endif - - pT01->T01_modulation_type = (ctmp1%3) ? 0 : 1; - - for( i=0; i<2; i++ ) { - if( i == 1 ) - ctmp1 = ctmpf; - - 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 ) - 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 - pDes->PreambleMode = WLAN_PREAMBLE_TYPE_LONG; - else - pDes->PreambleMode = CURRENT_PREAMBLE_MODE; - 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) +Mds_Destroy(struct wbsoft_priv * adapter) { - 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; - - 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 - - SizeLeft -= CopySize; - - // 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; - - buffer += 32; // 8B usb + 24B 802.11 header - Size += 32; - - // Copy into buffer - stmp = CopySize + 3; - stmp &= ~0x03;//4n Alignment - Size += stmp;// Current 4n offset of mpdu - - 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; - } - - memcpy(buffer, src_buffer, CopyLeft); - buffer += CopyLeft; - CopySize -= CopyLeft; - } - - // 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++; - } - } - - // 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; - } - - 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 - pDes->FragmentCount = FragmentCount; // Update the correct fragment number - return Size; } - -void -Mds_DurationSet( PADAPTER Adapter, PDESCRIPTOR pDes, u8 *buffer ) +static void Mds_DurationSet(struct wbsoft_priv *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; + unsigned char CTS_on = false, RTS_on = false; PT00_DESCRIPTOR pNextT00; u16 BodyLen = 0; - unsigned char boGroupAddr = FALSE; - + unsigned char boGroupAddr = false; OffsetSize = pDes->FragmentThreshold + 32 + 3; OffsetSize &= ~0x03; @@ -452,7 +46,7 @@ Mds_DurationSet( PADAPTER Adapter, PDESCRIPTOR pDes, u8 *buffer ) pNextT00 = (PT00_DESCRIPTOR)(buffer+OffsetSize); if( buffer[ DOT_11_DA_OFFSET+8 ] & 0x1 ) // +8 for USB hdr - boGroupAddr = TRUE; + boGroupAddr = true; //======================================== // Set RTS/CTS mechanism @@ -467,13 +61,13 @@ Mds_DurationSet( PADAPTER Adapter, PDESCRIPTOR pDes, u8 *buffer ) BodyLen += 4; //CRC if( BodyLen >= CURRENT_RTS_THRESHOLD ) - RTS_on = TRUE; // Using RTS + 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 + CTS_on = true; // Using CTS } } } @@ -624,9 +218,394 @@ Mds_DurationSet( PADAPTER Adapter, PDESCRIPTOR pDes, u8 *buffer ) } -void MDS_EthernetPacketReceive( PADAPTER Adapter, PRXLAYER1 pRxLayer1 ) +// The function return the 4n size of usb pk +static u16 Mds_BodyCopy(struct wbsoft_priv *adapter, PDESCRIPTOR pDes, u8 *TargetBuffer) +{ + 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; + + 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 + + SizeLeft -= CopySize; + + // 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; + + buffer += 32; // 8B usb + 24B 802.11 header + Size += 32; + + // Copy into buffer + stmp = CopySize + 3; + stmp &= ~0x03;//4n Alignment + Size += stmp;// Current 4n offset of mpdu + + 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; + } + + memcpy(buffer, src_buffer, CopyLeft); + buffer += CopyLeft; + CopySize -= CopyLeft; + } + + // 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++; + } + } + + // 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; + } + + 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 + pDes->FragmentCount = FragmentCount; // Update the correct fragment number + return Size; +} + +static void Mds_HeaderCopy(struct wbsoft_priv * adapter, PDESCRIPTOR pDes, u8 *TargetBuffer) +{ + PMDS pMds = &adapter->Mds; + u8 *src_buffer = pDes->buffer_address[0];//931130.5.g + PT00_DESCRIPTOR pT00; + PT01_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; + TargetBuffer += 4; + pT01 = (PT01_DESCRIPTOR)TargetBuffer; + TargetBuffer += 4; + + 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 + + // 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 + 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 + FragmentThreshold -= (DOT_11_MAC_HEADER_SIZE + 4); + pDes->FragmentThreshold = FragmentThreshold; + + // Set more frag bit + TargetBuffer[1] |= 0x04;// Set more frag bit + + // + // Set tx rate + // + stmp = *(u16 *)(TargetBuffer+30); // 2n alignment address + + //Use basic rate + ctmp1 = ctmpf = CURRENT_TX_RATE_FOR_MNG; + + pDes->TxRate = ctmp1; + #ifdef _PE_TX_DUMP_ + WBDEBUG(("Tx rate =%x\n", ctmp1)); + #endif + + pT01->T01_modulation_type = (ctmp1%3) ? 0 : 1; + + for( i=0; i<2; i++ ) { + if( i == 1 ) + ctmp1 = ctmpf; + + 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 ) + 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 + pDes->PreambleMode = WLAN_PREAMBLE_TYPE_LONG; + else + pDes->PreambleMode = CURRENT_PREAMBLE_MODE; + pT01->T01_plcp_header_length = pDes->PreambleMode; // Set preamble + +} + +void +Mds_Tx(struct wbsoft_priv * adapter) { - OS_RECEIVE_PACKET_INDICATE( Adapter, pRxLayer1 ); + 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; + + + if (pMds->TxPause) + return; + if (!hal_driver_init_OK(pHwData)) + return; + + //Only one thread can be run here + if (!atomic_inc_return(&pMds->TxThreadCount) == 1) + goto cleanup; + + // 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; + } + + XmitBufAddress = pMds->pTxBuffer + (MAX_USB_TX_BUFFER * FillIndex); //Get buffer + XmitBufSize = 0; + FillCount = 0; + do { + PacketSize = adapter->sMlmeFrame.len; + if (!PacketSize) + break; + + //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 + } + + + // + // 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 ); + + // Copy header. 8byte USB + 24byte 802.11Hdr. Set TxRate, Preamble type + Mds_HeaderCopy( adapter, pTxDes, XmitBufAddress ); + + // 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; + } + + // 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); + + // + // Calculation MIC from buffer which maybe fragment, then fill into temporary address 8 byte + // 931130.5.e + if (MICAdd) + Mds_MicFill( adapter, pTxDes, XmitBufAddress ); + + //Shift to the next address + XmitBufSize += CurrentSize; + XmitBufAddress += CurrentSize; + +#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; + + // Get packet to transmit completed, 1:TESTSTA 2:MLME 3: Ndis data + MLME_SendComplete(adapter, 0, true); + + // 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 + + // Move to the next one, if necessary + if (BufferFilled) { + // size setting + pMds->TxBufferSize[ FillIndex ] = XmitBufSize; + + // 20060928 set Tx count + pMds->TxCountInBuffer[FillIndex] = FillCount; + + // Set owner flag + pMds->TxOwner[FillIndex] = 1; + + pMds->TxFillIndex++; + pMds->TxFillIndex %= MAX_USB_TX_BUFFER_NUMBER; + BufferFilled = false; + } else + break; + + if (!PacketSize) // No more pk for transmitting + break; + + } while(true); + + // + // Start to send by lower module + // + if (!pHwData->IsKeyPreSet) + Wb35Tx_start(adapter); + + cleanup: + atomic_dec(&pMds->TxThreadCount); } +void +Mds_SendComplete(struct wbsoft_priv * 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; + 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; + + 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); + } + 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..ee0f12093db 100644 --- a/drivers/staging/winbond/mds_f.h +++ b/drivers/staging/winbond/mds_f.h @@ -1,33 +1,23 @@ -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 -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); +#include "wbhal_s.h" +#include "core.h" +unsigned char Mds_initial( struct wbsoft_priv *adapter ); +void Mds_Destroy( struct wbsoft_priv *adapter ); +void Mds_Tx( struct wbsoft_priv *adapter ); +void Mds_SendComplete( struct wbsoft_priv *adapter, PT02_DESCRIPTOR pT02 ); +void Mds_MpduProcess( struct wbsoft_priv *adapter, PDESCRIPTOR pRxDes ); +extern void DataDmp(u8 *pdata, u32 len, u32 offset); // For Asynchronous indicating. The routine collocates with USB. -void Mds_MsduProcess( PWB32_ADAPTER Adapter, PRXLAYER1 pRxLayer1, u8 SlotIndex); +void Mds_MsduProcess( struct wbsoft_priv *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 ); - +u16 MDS_GetPacketSize( struct wbsoft_priv *adapter ); +void MDS_GetNextPacket( struct wbsoft_priv *adapter, PDESCRIPTOR pDes ); +void MDS_GetNextPacketComplete( struct wbsoft_priv *adapter, PDESCRIPTOR 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..ebf61e3ce1d 100644 --- a/drivers/staging/winbond/mds_s.h +++ b/drivers/staging/winbond/mds_s.h @@ -1,9 +1,19 @@ +#ifndef __WINBOND_MDS_H +#define __WINBOND_MDS_H + +#include <linux/timer.h> +#include <linux/types.h> +#include <asm/atomic.h> + +#include "localpara.h" +#include "mac_structures.h" +#include "scan_s.h" + //////////////////////////////////////////////////////////////////////////////////////////////////////// #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 @@ -21,20 +31,19 @@ #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_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_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 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 +#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 @@ -96,9 +105,9 @@ typedef struct _MDS u8 ScanTxPause; //data Tx pause because the scanning is progressing, but probe request Tx won't. u8 TxPause;//For pause the Mds_Tx modult - OS_ATOMIC TxThreadCount;//For thread counting 931130.4.v + atomic_t TxThreadCount;//For thread counting 931130.4.v //950301 delete due to HW -// OS_ATOMIC TxConcurrentCount;//931130.4.w +// atomic_t TxConcurrentCount;//931130.4.w u16 TxResult[ ((MAX_USB_TX_DESCRIPTOR + 1) & ~0x01) ];//Collect the sending result of Mpdu @@ -133,9 +142,6 @@ typedef struct _MDS u8 boCounterMeasureBlock; u8 reserved_4[2]; - //NDIS_MINIPORT_TIMER nTimer; - OS_TIMER nTimer; - u32 TxTsc; // 20060214 u32 TxTsc_2; // 20060214 @@ -180,4 +186,4 @@ typedef struct _RXLAYER1 }RXLAYER1, * PRXLAYER1; - +#endif diff --git a/drivers/staging/winbond/mlme_mib.h b/drivers/staging/winbond/mlme_mib.h index 89759739cba..ca8922ec633 100644 --- a/drivers/staging/winbond/mlme_mib.h +++ b/drivers/staging/winbond/mlme_mib.h @@ -22,15 +22,15 @@ // Set the dot11ExcludeUnencrypted value. // // Arguments: -// Adapter - The pointer to the miniport adapter context. +// adapter - The pointer to the miniport adapter context. // ExUnencrypted - unsigned char type. The value to be set. // // Return values: // None. //============================================================================ -#define MLMESetExcludeUnencrypted(Adapter, ExUnencrypted) \ +#define MLMESetExcludeUnencrypted(adapter, ExUnencrypted) \ { \ - (Adapter)->sLocalPara.ExcludeUnencrypted = ExUnencrypted; \ + (adapter)->sLocalPara.ExcludeUnencrypted = ExUnencrypted; \ } //============================================================================ @@ -40,12 +40,12 @@ // Get the dot11ExcludeUnencrypted value. // // Arguments: -// Adapter - The pointer to the miniport adapter context. +// 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) +#define MLMEGetExcludeUnencrypted(adapter) ((unsigned char) (adapter)->sLocalPara.ExcludeUnencrypted) //============================================================================ // MLMESetMaxReceiveLifeTime -- @@ -54,15 +54,15 @@ // Set the dot11MaxReceiveLifeTime value. // // Arguments: -// Adapter - The pointer to the miniport adapter context. +// adapter - The pointer to the miniport adapter context. // ReceiveLifeTime- u32 type. The value to be set. // // Return values: // None. //============================================================================ -#define MLMESetMaxReceiveLifeTime(Adapter, ReceiveLifeTime) \ +#define MLMESetMaxReceiveLifeTime(adapter, ReceiveLifeTime) \ { \ - (Adapter)->Mds.MaxReceiveTime = ReceiveLifeTime; \ + (adapter)->Mds.MaxReceiveTime = ReceiveLifeTime; \ } //============================================================================ @@ -72,12 +72,12 @@ // Get the dot11MaxReceiveLifeTime value. // // Arguments: -// Adapter - The pointer to the miniport adapter context. +// adapter - The pointer to the miniport adapter context. // // Return values: // u32 type. The current dot11MaxReceiveLifeTime value. //============================================================================ -#define MLMEGetMaxReceiveLifeTime(Adapter) ((u32) (Adapter)->Mds.MaxReceiveTime) +#define MLMEGetMaxReceiveLifeTime(adapter) ((u32) (adapter)->Mds.MaxReceiveTime) #endif diff --git a/drivers/staging/winbond/mlme_s.h b/drivers/staging/winbond/mlme_s.h index 039fd408ba6..ea12684a2b1 100644 --- a/drivers/staging/winbond/mlme_s.h +++ b/drivers/staging/winbond/mlme_s.h @@ -1,3 +1,12 @@ +#ifndef __WINBOND_MLME_H +#define __WINBOND_MLME_H + +#include <linux/types.h> +#include <linux/spinlock.h> + +#include "mac_structures.h" +#include "mds_s.h" + //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // Mlme.h // Define the related definitions of MLME module @@ -192,4 +201,4 @@ typedef struct _RXDATA }__attribute__ ((packed)) RXDATA, *psRXDATA; - +#endif diff --git a/drivers/staging/winbond/mlmetxrx.c b/drivers/staging/winbond/mlmetxrx.c index e8533b8d197..07802afd2b8 100644 --- a/drivers/staging/winbond/mlmetxrx.c +++ b/drivers/staging/winbond/mlmetxrx.c @@ -17,113 +17,56 @@ //============================================================================ #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 -} +#include "mds_f.h" //============================================================================= -// 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) +u8 MLMESendFrame(struct wbsoft_priv * 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; + if (adapter->sMlmeFrame.IsInUsed != PACKET_FREE_TO_USE) { + adapter->sMlmeFrame.wNumTxMMPDUDiscarded++; + return false; } - Adapter->sMlmeFrame.IsInUsed = PACKET_COME_FROM_MLME; + adapter->sMlmeFrame.IsInUsed = PACKET_COME_FROM_MLME; // Keep information for sending - Adapter->sMlmeFrame.pMMPDU = pMMPDU; - Adapter->sMlmeFrame.DataType = DataType; + 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++; + 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; + Mds_Tx(adapter); + return true; } -void -MLME_GetNextPacket(PADAPTER Adapter, PDESCRIPTOR pDes) +void MLME_GetNextPacket(struct wbsoft_priv *adapter, PDESCRIPTOR desc) { -#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; + 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.DataType; } -void MLMEfreeMMPDUBuffer(PWB32_ADAPTER Adapter, s8 *pData) +static void MLMEfreeMMPDUBuffer(struct wbsoft_priv *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])) + if (pData == (s8 *)&(adapter->sMlmeFrame.TxMMPDU[i])) break; } - if (Adapter->sMlmeFrame.TxMMPDUInUse[i]) - Adapter->sMlmeFrame.TxMMPDUInUse[i] = FALSE; + if (adapter->sMlmeFrame.TxMMPDUInUse[i]) + adapter->sMlmeFrame.TxMMPDUInUse[i] = false; else { // Something wrong // PD43 Add debug code here??? @@ -131,19 +74,19 @@ void MLMEfreeMMPDUBuffer(PWB32_ADAPTER Adapter, s8 *pData) } void -MLME_SendComplete(PADAPTER Adapter, u8 PacketID, unsigned char SendOK) +MLME_SendComplete(struct wbsoft_priv * adapter, u8 PacketID, unsigned char SendOK) { MLME_TXCALLBACK TxCallback; // Reclaim the data buffer - Adapter->sMlmeFrame.len = 0; - MLMEfreeMMPDUBuffer( Adapter, Adapter->sMlmeFrame.pMMPDU ); + adapter->sMlmeFrame.len = 0; + MLMEfreeMMPDUBuffer( adapter, adapter->sMlmeFrame.pMMPDU ); TxCallback.bResult = MLME_SUCCESS; // Return resource - Adapter->sMlmeFrame.IsInUsed = PACKET_FREE_TO_USE; + adapter->sMlmeFrame.IsInUsed = PACKET_FREE_TO_USE; } diff --git a/drivers/staging/winbond/mlmetxrx_f.h b/drivers/staging/winbond/mlmetxrx_f.h index 24cd5f308d9..5f05a6e1cda 100644 --- a/drivers/staging/winbond/mlmetxrx_f.h +++ b/drivers/staging/winbond/mlmetxrx_f.h @@ -8,32 +8,25 @@ #ifndef _MLMETXRX_H #define _MLMETXRX_H +#include "core.h" + void MLMEProcThread( - PWB32_ADAPTER Adapter + struct wbsoft_priv * 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, +void MLME_GetNextPacket( struct wbsoft_priv * adapter, PDESCRIPTOR pDes ); +u8 MLMESendFrame( struct wbsoft_priv * adapter, u8 *pMMPDU, u16 len, u8 DataType); void -MLME_SendComplete( PWB32_ADAPTER Adapter, u8 PacketID, unsigned char SendOK ); +MLME_SendComplete( struct wbsoft_priv * adapter, u8 PacketID, unsigned char SendOK ); void MLMERcvFrame( - PWB32_ADAPTER Adapter, + struct wbsoft_priv * adapter, PRXBUFFER pRxBufferArray, u8 NumOfBuffer, u8 ReturnSlotIndex @@ -41,11 +34,11 @@ MLMERcvFrame( void MLMEReturnPacket( - PWB32_ADAPTER Adapter, + struct wbsoft_priv * adapter, u8 * pRxBufer ); #ifdef _IBSS_BEACON_SEQ_STICK_ -s8 SendBCNullData(PWB32_ADAPTER Adapter, u16 wIdx); +s8 SendBCNullData(struct wbsoft_priv * adapter, u16 wIdx); #endif #endif diff --git a/drivers/staging/winbond/mto.c b/drivers/staging/winbond/mto.c index 2ef60e5120c..de11a05efae 100644 --- a/drivers/staging/winbond/mto.c +++ b/drivers/staging/winbond/mto.c @@ -23,10 +23,12 @@ // LA20040210_DTO kevin #include "os_common.h" +#include "sme_api.h" +#include "gl_80211.h" +#include "wbhal_f.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 @@ -35,181 +37,15 @@ 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] = -{ +static 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] = -{ - 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; @@ -221,128 +57,14 @@ typedef struct 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; +static 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 -- @@ -353,7 +75,7 @@ void MTO_SetDTORateRange(MTO_FUNC_INPUT,u8 *pRateArray, u8 ArraySize) // This function should be invoked during system initialization. // // Arguments: -// Adapter - The pointer to the Miniport Adapter Context +// adapter - The pointer to the Miniport adapter Context // // Return Value: // None @@ -393,8 +115,8 @@ void MTO_Init(MTO_FUNC_INPUT) 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()); + //CardSet_AntennaDiversity(adapter, MTO_ANT_DIVERSITY()); + //PLMESetAntennaDiversity( adapter, MTO_ANT_DIVERSITY()); MTO_AGING_TIMEOUT() = 0;//MTO_TMR_AGING() / MTO_TMR_PERIODIC(); @@ -402,7 +124,6 @@ void MTO_Init(MTO_FUNC_INPUT) // //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; @@ -470,669 +191,6 @@ void MTO_Init(MTO_FUNC_INPUT) 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) -{ - int i; - - #ifdef _PE_DTO_DUMP_ - WBDEBUG(("GetDTOrx\n")); - #endif - - //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; - - 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; - - if(MTO_ANT_DIVERSITY_ENABLE() != 1) - return; - x = hal_get_antenna_number(MTO_HAL()); - switch(MTO_TOGGLE_STATE()) - { - - //Missing..... - case TOGGLE_STATE_IDLE: - case TOGGLE_STATE_BKOFF: - break;; - - 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); - 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; - 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; - 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; - } - } - } - - 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; -} - -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 @@ -1194,36 +252,3 @@ void MTO_SetTxCount(MTO_FUNC_INPUT, u8 tx_rate, u8 index) 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..0d3775eb257 100644 --- a/drivers/staging/winbond/mto.h +++ b/drivers/staging/winbond/mto.h @@ -11,6 +11,8 @@ #ifndef __MTO_H__ #define __MTO_H__ +#include <linux/types.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 @@ -129,17 +131,17 @@ typedef struct _MTO_PARAMETERS } 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_FUNC_INPUT struct wbsoft_priv * 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 +#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 @@ -157,7 +159,7 @@ typedef struct _MTO_PARAMETERS #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_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 @@ -166,7 +168,6 @@ typedef struct _MTO_PARAMETERS #define MTO_PREAMBLE_CHANGE_ENABLE() MTO_DATA().PreambleChangeEnable #define MTO_RATE_LEVEL() MTO_DATA().DataRateLevel -#define MTO_FALLBACK_RATE_LEVEL() MTO_DATA().FallbackRateLevel #define MTO_OFDM_RATE_LEVEL() MTO_DATA().OfdmRateLevel #define MTO_RATE_CHANGE_ENABLE() MTO_DATA().DataRateChangeEnable #define MTO_FRAG_TH_LEVEL() MTO_DATA().FragThresholdLevel @@ -199,11 +200,9 @@ typedef struct _MTO_PARAMETERS //------------------------------------------------ -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 { diff --git a/drivers/staging/winbond/mto_f.h b/drivers/staging/winbond/mto_f.h index 30b3df2ccb3..81f59137c6d 100644 --- a/drivers/staging/winbond/mto_f.h +++ b/drivers/staging/winbond/mto_f.h @@ -1,7 +1,13 @@ -extern void MTO_Init(PWB32_ADAPTER); -extern void MTO_PeriodicTimerExpired(PWB32_ADAPTER); -extern void MTO_SetDTORateRange(PWB32_ADAPTER, u8 *, u8); +#ifndef __WINBOND_MTO_F_H +#define __WINBOND_MTO_F_H + +#include "core.h" + +extern void MTO_Init(struct wbsoft_priv *); +extern void MTO_PeriodicTimerExpired(struct wbsoft_priv *); +extern void MTO_SetDTORateRange(struct wbsoft_priv *, 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); +#endif diff --git a/drivers/staging/winbond/os_common.h b/drivers/staging/winbond/os_common.h index e24ff41e871..2c276e3ab51 100644 --- a/drivers/staging/winbond/os_common.h +++ b/drivers/staging/winbond/os_common.h @@ -1,2 +1,2 @@ -#include "linux/sysdef.h" +#include "sysdef.h" diff --git a/drivers/staging/winbond/phy_calibration.c b/drivers/staging/winbond/phy_calibration.c index 272a65066ab..6782552d366 100644 --- a/drivers/staging/winbond/phy_calibration.c +++ b/drivers/staging/winbond/phy_calibration.c @@ -12,6 +12,7 @@ /****************** INCLUDE FILES SECTION ***********************************/ #include "os_common.h" #include "phy_calibration.h" +#include "wbhal_f.h" /****************** DEBUG CONSTANT AND MACRO SECTION ************************/ @@ -431,7 +432,6 @@ void _rxadc_dc_offset_cancellation_winbond(hw_data_t *phw_data, u32 frequency) 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]" #ifdef _DEBUG @@ -522,7 +522,6 @@ void _txidac_dc_offset_cancellation_winbond(hw_data_t *phw_data) 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)); @@ -536,7 +535,6 @@ void _txidac_dc_offset_cancellation_winbond(hw_data_t *phw_data) 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)); @@ -552,7 +550,6 @@ void _txidac_dc_offset_cancellation_winbond(hw_data_t *phw_data) 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)); @@ -600,7 +597,6 @@ void _txidac_dc_offset_cancellation_winbond(hw_data_t *phw_data) 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); } /////////////////////////////////////////////////////// @@ -651,7 +647,6 @@ void _txqdac_dc_offset_cacellation_winbond(hw_data_t *phw_data) 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)); @@ -665,11 +660,9 @@ void _txqdac_dc_offset_cacellation_winbond(hw_data_t *phw_data) 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); @@ -682,11 +675,9 @@ void _txqdac_dc_offset_cacellation_winbond(hw_data_t *phw_data) 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); @@ -732,7 +723,6 @@ void _txqdac_dc_offset_cacellation_winbond(hw_data_t *phw_data) 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 @@ -792,12 +782,10 @@ u8 _tx_iq_calibration_loop_winbond(hw_data_t *phw_data, 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. 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); @@ -813,7 +801,6 @@ u8 _tx_iq_calibration_loop_winbond(hw_data_t *phw_data, 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" @@ -823,12 +810,10 @@ u8 _tx_iq_calibration_loop_winbond(hw_data_t *phw_data, 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. 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); @@ -1075,7 +1060,7 @@ void _tx_iq_calibration_winbond(hw_data_t *phw_data) //; [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); - OS_SLEEP(30000); // 20060612.1.a 30ms delay. Add the follow 2 lines + 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 ); @@ -1282,13 +1267,11 @@ u8 _rx_iq_calibration_loop_winbond(hw_data_t *phw_data, u16 factor, u32 frequenc 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); 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 // c. hw_get_dxx_reg(phw_data, REG_CALIB_READ1, &val); @@ -1697,11 +1680,10 @@ unsigned char adjust_TXVGA_for_iq_mag(hw_data_t *phw_data) 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; + return false; PHY_DEBUG(("[CAL] MODE_CTRL (read) = 0x%08X\n", reg_mode_ctrl)); @@ -1714,19 +1696,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. 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); @@ -1750,9 +1728,9 @@ unsigned char adjust_TXVGA_for_iq_mag(hw_data_t *phw_data) } if( iq_mag_0_tx>=700 && iq_mag_0_tx<=1750 ) - return TRUE; + 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..03b820c6181 100644 --- a/drivers/staging/winbond/phy_calibration.h +++ b/drivers/staging/winbond/phy_calibration.h @@ -1,3 +1,8 @@ +#ifndef __WINBOND_PHY_CALIBRATION_H +#define __WINBOND_PHY_CALIBRATION_H + +#include "wbhal_f.h" + // 20031229 Turbo add #define REG_AGC_CTRL1 0x1000 #define REG_AGC_CTRL2 0x1004 @@ -99,3 +104,4 @@ void phy_set_rf_data( phw_data_t pHwData, u32 index, u32 value ); #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..cd21272d7a9 100644 --- a/drivers/staging/winbond/reg.c +++ b/drivers/staging/winbond/reg.c @@ -1,4 +1,5 @@ #include "os_common.h" +#include "wbhal_f.h" /////////////////////////////////////////////////////////////////////////////////////////////////// // Original Phy.h @@ -976,9 +977,9 @@ void Uxx_power_on_procedure( phw_data_t pHwData ) // 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 + msleep(10); // Modify 20051221.1.b Wb35Reg_WriteSync( pHwData, 0x03d4, 0xb8 );// REG_ON RF_RSTN on, and - OS_SLEEP(10000); // Modify 20051221.1.b + msleep(10); // Modify 20051221.1.b ltmp = 0x4968; if( (pHwData->phy_type == RF_WB_242) || @@ -988,12 +989,12 @@ void Uxx_power_on_procedure( phw_data_t pHwData ) Wb35Reg_WriteSync( pHwData, 0x03d4, 0xa0 );// PLL_PD REF_PD set to 0 - OS_SLEEP(20000); // Modify 20051221.1.b + msleep(20); // 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 + msleep(10); // Modify 20051221.1.b if( !Wb35Reg_ReadSync( pHwData, 0x03d0, <mp ) ) break; } @@ -1002,7 +1003,7 @@ void Uxx_power_on_procedure( phw_data_t pHwData ) } Wb35Reg_WriteSync( pHwData, 0x03b0, 1 );// Reset hardware first - OS_SLEEP(10000); // Add this 20051221.1.b + msleep(10); // Add this 20051221.1.b // Set burst write delay Wb35Reg_WriteSync( pHwData, 0x03f8, 0x7ff ); @@ -1167,23 +1168,23 @@ RFSynthesizer_initial(phw_data_t pHwData) // 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); + msleep(10); ltmp = (1 << 31) | (0 << 30) | (20 << 24) | BitReverse( al2230_rf_data[7], 20); Wb35Reg_WriteSync( pHwData, 0x0864, ltmp ); - OS_SLEEP(10000); + msleep(10); 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 + msleep(10); // Modify 20051221.1.b Wb35Reg_WriteSync( pHwData, 0x03d4, 0xa0 );// PLL_PD REF_PD set to 0 - OS_SLEEP(10000); // Modify 20051221.1.b + msleep(10); // 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 + msleep(10); // Add this 20051221.1.b //------------------------------------------------------------------------ // The follow code doesn't use the burst-write mode @@ -1191,30 +1192,30 @@ RFSynthesizer_initial(phw_data_t pHwData) ltmp = (1 << 31) | (0 << 30) | (20 << 24) | BitReverse( (0x0F<<20) | 0xF01A0, 20); Wb35Reg_WriteSync( pHwData, 0x0864, ltmp ); - ltmp = pHwData->Wb35Reg.BB5C & 0xfffff000; + ltmp = pHwData->reg.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); + pHwData->reg.BB50 |= 0x13;//(MASK_IQCAL_MODE|MASK_CALIB_START);//20060315.1 modify + Wb35Reg_WriteSync(pHwData, 0x1050, pHwData->reg.BB50); + msleep(5); //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); + msleep(5); //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); + msleep(5); //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); + 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: @@ -1229,16 +1230,16 @@ RFSynthesizer_initial(phw_data_t pHwData) //2.4GHz //ltmp = (1 << 31) | (0 << 30) | (24 << 24) | 0x1ABA8F; //Wb35Reg_WriteSync pHwData, 0x0864, ltmp ); - //OS_SLEEP(1000); // Sleep 1 ms + //msleep(1); // Sleep 1 ms ltmp = (1 << 31) | (0 << 30) | (24 << 24) | 0x9ABA8F; Wb35Reg_WriteSync( pHwData, 0x0864, ltmp ); - OS_SLEEP(5000); + msleep(5); ltmp = (1 << 31) | (0 << 30) | (24 << 24) | 0x3ABA8F; Wb35Reg_WriteSync( pHwData, 0x0864, ltmp ); - OS_SLEEP(5000); + msleep(5); ltmp = (1 << 31) | (0 << 30) | (24 << 24) | 0x1ABA8F; Wb35Reg_WriteSync( pHwData, 0x0864, ltmp ); - OS_SLEEP(5000); + msleep(5); //5GHz Wb35Reg_WriteSync( pHwData, 0x03dc, 0x00000000 ); @@ -1251,7 +1252,7 @@ RFSynthesizer_initial(phw_data_t pHwData) // 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); + msleep(5); Wb35Reg_WriteSync( pHwData, 0x03dc, 0x00000080 ); #ifdef _PE_STATE_DUMP_ @@ -1262,13 +1263,13 @@ RFSynthesizer_initial(phw_data_t pHwData) //Wb35Reg_WriteSync( pHwData, 0x0864, ltmp ); ltmp = (1 << 31) | (0 << 30) | (24 << 24) | 0x9ABA8F; Wb35Reg_WriteSync( pHwData, 0x0864, ltmp ); - OS_SLEEP(5000); + msleep(5); ltmp = (1 << 31) | (0 << 30) | (24 << 24) | 0x3ABA8F; Wb35Reg_WriteSync( pHwData, 0x0864, ltmp ); - OS_SLEEP(5000); + msleep(5); ltmp = (1 << 31) | (0 << 30) | (24 << 24) | 0x12BACF; Wb35Reg_WriteSync( pHwData, 0x0864, ltmp ); - OS_SLEEP(5000); + msleep(5); //Wb35Reg_WriteSync( pHwData, 0x03dc, 0x00000080 ); //WBDEBUG(("* PLL_ON high\n")); @@ -1280,21 +1281,21 @@ RFSynthesizer_initial(phw_data_t pHwData) // // ; Version 1.3B revision items: for FA5976A , October 3, 2005 by HTHo // - ltmp = pHwData->Wb35Reg.BB5C & 0xfffff000; + ltmp = pHwData->reg.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); + pHwData->reg.BB50 |= 0x3;//(MASK_IQCAL_MODE|MASK_CALIB_START);//20060630 + Wb35Reg_WriteSync(pHwData, 0x1050, pHwData->reg.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 + msleep(5); // 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 + msleep(2); // Sleep 2ms //----- Calibration (2). TX baseband Gm-C filter auto-tuning //Calibration (2a). turn off ENCAL signal @@ -1309,7 +1310,7 @@ RFSynthesizer_initial(phw_data_t pHwData) //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 + 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 ); @@ -1327,7 +1328,7 @@ RFSynthesizer_initial(phw_data_t pHwData) //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 + 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 ); @@ -1336,7 +1337,7 @@ RFSynthesizer_initial(phw_data_t pHwData) //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 + udelay(150); // Sleep 150 us //----- Calibration (5). RX DC offset calibration //Calibration (5a). turn off ENCAL signal and set to RX SW DC caliration mode @@ -1353,7 +1354,7 @@ RFSynthesizer_initial(phw_data_t pHwData) //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 + msleep(2); // 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 ); @@ -1365,7 +1366,7 @@ RFSynthesizer_initial(phw_data_t pHwData) //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 + msleep(2); // 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 ); @@ -1377,7 +1378,7 @@ RFSynthesizer_initial(phw_data_t pHwData) //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 + msleep(2); // 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 ); @@ -1389,7 +1390,7 @@ RFSynthesizer_initial(phw_data_t pHwData) //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 + msleep(2); // 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 ); @@ -1399,30 +1400,30 @@ RFSynthesizer_initial(phw_data_t pHwData) //; ----- Calibration (7). Switch RF chip to normal mode //0x00 0xF86100 ; 3E184 ; Switch RF chip to normal mode -// OS_SLEEP(10000); // @@ 20060721 +// msleep(10); // @@ 20060721 ltmp = (1 << 31) | (0 << 30) | (24 << 24) | BitReverse( (0x00<<24) | 0xF86100, 24); Wb35Reg_WriteSync( pHwData, 0x0864, ltmp ); - OS_SLEEP(5000); // Sleep 5 ms + msleep(5); // 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 +// Wb35Reg_WriteSync(pHwData, 0x105c, pHwData->reg.BB5C); +// pHwData->reg.BB50 &= ~0x13;//(MASK_IQCAL_MODE|MASK_CALIB_START); // 20060315.1 fix +// Wb35Reg_WriteSync(pHwData, 0x1050, pHwData->reg.BB50); +// msleep(1); // Sleep 1 ms break; } } void BBProcessor_AL7230_2400( phw_data_t 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; + reg->BB0C = 0xFFF72031; pltmp[4] = 0x0FacDCC5; // 0x1010 AGC_Ctrl5 // 20050927 0x0FacDCB7 pltmp[5] = 0x00CAA333; // 0x00eaa333; // 0x1014 AGC_Ctrl6 pltmp[6] = 0xF2211111; // 0x11111111; // 0x1018 AGC_Ctrl7 @@ -1431,25 +1432,25 @@ void BBProcessor_AL7230_2400( phw_data_t pHwData) pltmp[9] = 0xA8002A79; // 0xa9002A79; // 0x1024 AGC_Ctrl10 pltmp[10] = 0x40000528; // 20050927 0x40000228 pltmp[11] = 0x232D7F30; // 0x23457f30;// 0x102c A_ACQ_Ctrl - pWb35Reg->BB2C = 0x232D7F30; + reg->BB2C = 0x232D7F30; Wb35Reg_BurstWrite( pHwData, 0x1000, pltmp, 12, AUTO_INCREMENT ); pltmp[0] = 0x00002c54; // 0x1030 B_ACQ_Ctrl - pWb35Reg->BB30 = 0x00002c54; + 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 - pWb35Reg->BB3C = 0x00000000; + reg->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; + reg->BB50 = 0x2B106208; pltmp[9] = 0; // 0x1054 - pWb35Reg->BB54 = 0x00000000; + reg->BB54 = 0x00000000; pltmp[10] = 0x52524242; // 0x64645252; // 0x1058 IQ_Alpha - pWb35Reg->BB58 = 0x52524242; + reg->BB58 = 0x52524242; pltmp[11] = 0xAA0AC000; // 0x105c DC_Cancel Wb35Reg_BurstWrite( pHwData, 0x1030, pltmp, 12, AUTO_INCREMENT ); @@ -1457,14 +1458,14 @@ void BBProcessor_AL7230_2400( phw_data_t pHwData) void BBProcessor_AL7230_5000( phw_data_t 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; + reg->BB0C = 0xEFFF233E; pltmp[4] = 0x0FacDCC5; // 0x1010 AGC_Ctrl5 // 20050927 0x0FacDCB7 pltmp[5] = 0x00CAA333; // 0x1014 AGC_Ctrl6 pltmp[6] = 0xF2432111; // 0x1018 AGC_Ctrl7 @@ -1473,24 +1474,24 @@ void BBProcessor_AL7230_5000( phw_data_t pHwData) pltmp[9] = 0x00002A79; // 0x1024 AGC_Ctrl10 pltmp[10] = 0x40000528; // 20050927 0x40000228 pltmp[11] = 0x232FDF30;// 0x102c A_ACQ_Ctrl - pWb35Reg->BB2C = 0x232FDF30; + 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 - pWb35Reg->BB3C = 0x00000000; + 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 - pWb35Reg->BB50 = 0x2B107208; + reg->BB50 = 0x2B107208; pltmp[9] = 0; // 0x1054 - pWb35Reg->BB54 = 0x00000000; + reg->BB54 = 0x00000000; pltmp[10] = 0x52524242; // 0x1058 IQ_Alpha - pWb35Reg->BB58 = 0x52524242; + reg->BB58 = 0x52524242; pltmp[11] = 0xAA0AC000; // 0x105c DC_Cancel Wb35Reg_BurstWrite( pHwData, 0x1030, pltmp, 12, AUTO_INCREMENT ); @@ -1511,7 +1512,7 @@ void BBProcessor_AL7230_5000( phw_data_t pHwData) void BBProcessor_initial( phw_data_t pHwData ) { - PWB35REG pWb35Reg = &pHwData->Wb35Reg; + struct wb35_reg *reg = &pHwData->reg; u32 i, pltmp[12]; switch( pHwData->phy_type ) @@ -1522,7 +1523,7 @@ BBProcessor_initial( phw_data_t pHwData ) pltmp[1] = 0x9AFFAEA4; // 0x1004 AGC_Ctrl2 pltmp[2] = 0x55D00A04; // 0x1008 AGC_Ctrl3 pltmp[3] = 0xEFFF1A34; // 0x100c AGC_Ctrl4 - pWb35Reg->BB0C = 0xEFFF1A34; + reg->BB0C = 0xEFFF1A34; pltmp[4] = 0x0FABE0B7; // 0x1010 AGC_Ctrl5 pltmp[5] = 0x00CAA332; // 0x1014 AGC_Ctrl6 pltmp[6] = 0xF6632111; // 0x1018 AGC_Ctrl7 @@ -1531,25 +1532,25 @@ BBProcessor_initial( phw_data_t pHwData ) 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 + 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 - pWb35Reg->BB30 = 0x00002C54; + 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 - pWb35Reg->BB3C = 0x00000000; + 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 - pWb35Reg->BB50 = 0x27106208; + reg->BB50 = 0x27106208; pltmp[9] = 0; // 0x1054 - pWb35Reg->BB54 = 0x00000000; + reg->BB54 = 0x00000000; pltmp[10] = 0x64646464; // 0x1058 IQ_Alpha - pWb35Reg->BB58 = 0x64646464; + reg->BB58 = 0x64646464; pltmp[11] = 0xAA0AC000; // 0x105c DC_Cancel Wb35Reg_BurstWrite( pHwData, 0x1030, pltmp, 12, AUTO_INCREMENT ); @@ -1568,7 +1569,7 @@ BBProcessor_initial( phw_data_t pHwData ) pltmp[1] = 0x9affaea4; // 0x1004 AGC_Ctrl2 pltmp[2] = 0x55d00a04; // 0x1008 AGC_Ctrl3 pltmp[3] = 0xefff1a34; // 0x100c AGC_Ctrl4 - pWb35Reg->BB0C = 0xefff1a34; + reg->BB0C = 0xefff1a34; pltmp[4] = 0x0fabe0b7; // 0x1010 AGC_Ctrl5 pltmp[5] = 0x00caa332; // 0x1014 AGC_Ctrl6 pltmp[6] = 0xf6632111; // 0x1018 AGC_Ctrl7 @@ -1577,25 +1578,25 @@ BBProcessor_initial( phw_data_t pHwData ) 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 + 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 - pWb35Reg->BB30 = 0x00002C54; + 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 - pWb35Reg->BB3C = 0x00000000; + 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 - pWb35Reg->BB50 = 0x27106208; + reg->BB50 = 0x27106208; pltmp[9] = 0; // 0x1054 - pWb35Reg->BB54 = 0x00000000; + reg->BB54 = 0x00000000; pltmp[10] = 0x64646464; // 0x1058 IQ_Alpha - pWb35Reg->BB58 = 0x64646464; + reg->BB58 = 0x64646464; pltmp[11] = 0xAA28C000; // 0x105c DC_Cancel Wb35Reg_BurstWrite( pHwData, 0x1030, pltmp, 12, AUTO_INCREMENT ); @@ -1608,7 +1609,7 @@ BBProcessor_initial( phw_data_t pHwData ) 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 + reg->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 @@ -1617,25 +1618,25 @@ BBProcessor_initial( phw_data_t pHwData ) 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 + 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 - pWb35Reg->BB30 = 0x00002C54; + reg->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; + reg->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; + reg->BB50 = 0x27106208; pltmp[9] = 0; // 0x1054 - pWb35Reg->BB54 = 0x00000000; + reg->BB54 = 0x00000000; pltmp[10] = 0x64644a4a; // 0x64646464; // 0x1058 IQ_Alpha Modify for 33's 1.0.95 - pWb35Reg->BB58 = 0x64646464; + reg->BB58 = 0x64646464; pltmp[11] = 0xAA28C000; // 0x105c DC_Cancel Wb35Reg_BurstWrite( pHwData, 0x1030, pltmp, 12, AUTO_INCREMENT ); @@ -1648,7 +1649,7 @@ BBProcessor_initial( phw_data_t pHwData ) 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; + reg->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 @@ -1657,27 +1658,27 @@ BBProcessor_initial( phw_data_t pHwData ) 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 + reg->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; + reg->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; + 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 20060613.2 - pWb35Reg->BB48 = BB48_DEFAULT_AL2230_11G; // 20051221 ch14 20060613.2 + reg->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 + reg->BB4C = BB4C_DEFAULT_AL2230_11G; // 20060613.1 20060613.2 pltmp[8] = 0x27106200; // 0x1050 MODE_Ctrl - pWb35Reg->BB50 = 0x27106200; + reg->BB50 = 0x27106200; pltmp[9] = 0; // 0x1054 - pWb35Reg->BB54 = 0x00000000; + reg->BB54 = 0x00000000; pltmp[10] = 0x52524242; // 0x1058 IQ_Alpha - pWb35Reg->BB58 = 0x52524242; + reg->BB58 = 0x52524242; pltmp[11] = 0xAA0AC000; // 0x105c DC_Cancel Wb35Reg_BurstWrite( pHwData, 0x1030, pltmp, 12, AUTO_INCREMENT ); @@ -1690,7 +1691,7 @@ BBProcessor_initial( phw_data_t pHwData ) 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; + reg->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 @@ -1699,27 +1700,27 @@ BBProcessor_initial( phw_data_t pHwData ) 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 + reg->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; + reg->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; + 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 20060613.2 - pWb35Reg->BB48 = BB48_DEFAULT_AL2230_11G; // 20051221 ch14 20060613.2 + reg->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 + reg->BB4C = BB4C_DEFAULT_AL2230_11G; // 20060613.1 pltmp[8] = 0x27106200; // 0x1050 MODE_Ctrl - pWb35Reg->BB50 = 0x27106200; + reg->BB50 = 0x27106200; pltmp[9] = 0; // 0x1054 - pWb35Reg->BB54 = 0x00000000; + reg->BB54 = 0x00000000; pltmp[10] = 0x52523232; // 20060419 0x52524242; // 0x1058 IQ_Alpha - pWb35Reg->BB58 = 0x52523232; // 20060419 0x52524242; + reg->BB58 = 0x52523232; // 20060419 0x52524242; pltmp[11] = 0xAA0AC000; // 0x105c DC_Cancel Wb35Reg_BurstWrite( pHwData, 0x1030, pltmp, 12, AUTO_INCREMENT ); @@ -1732,7 +1733,7 @@ BBProcessor_initial( phw_data_t pHwData ) pltmp[1] = 0x9affafb2; // 0x1004 AGC_Ctrl2 pltmp[2] = 0x55d00a04; // 0x1008 AGC_Ctrl3 pltmp[3] = 0xFFFb203a; // 0x100c AGC_Ctrl4 - pWb35Reg->BB0c = 0xFFFb203a; + reg->BB0c = 0xFFFb203a; pltmp[4] = 0x0FBFDCB7; // 0x1010 AGC_Ctrl5 pltmp[5] = 0x00caa333; // 0x1014 AGC_Ctrl6 pltmp[6] = 0xf6632112; // 0x1018 AGC_Ctrl7 @@ -1741,25 +1742,25 @@ BBProcessor_initial( phw_data_t pHwData ) pltmp[9] = 0x00002A79; // 0x1024 AGC_Ctrl10 pltmp[10] = 0x40000228; pltmp[11] = 0x232A9F30;// 0x102c A_ACQ_Ctrl - pWb35Reg->BB2c = 0x232A9F30; + reg->BB2c = 0x232A9F30; Wb35Reg_BurstWrite( pHwData, 0x1000, pltmp, 12, AUTO_INCREMENT ); pltmp[0] = 0x00002C54; // 0x1030 B_ACQ_Ctrl - pWb35Reg->BB30 = 0x00002C54; + 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 - pWb35Reg->BB3c = 0x00000000; + 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] = 0x27106200; // 0x1050 MODE_Ctrl - pWb35Reg->BB50 = 0x27106200; + reg->BB50 = 0x27106200; pltmp[9] = 0; // 0x1054 - pWb35Reg->BB54 = 0x00000000; + reg->BB54 = 0x00000000; pltmp[10] = 0x64645252; // 0x1058 IQ_Alpha - pWb35Reg->BB58 = 0x64645252; + reg->BB58 = 0x64645252; pltmp[11] = 0xAA0AC000; // 0x105c DC_Cancel Wb35Reg_BurstWrite( pHwData, 0x1030, pltmp, 12, AUTO_INCREMENT ); */ @@ -1775,7 +1776,7 @@ BBProcessor_initial( phw_data_t pHwData ) pltmp[1] = 0x9AFF9ABA; // 0x1004 AGC_Ctrl2 pltmp[2] = 0x55D00A04; // 0x1008 AGC_Ctrl3 pltmp[3] = 0xEEE91C32; // 0x100c AGC_Ctrl4 - pWb35Reg->BB0C = 0xEEE91C32; + reg->BB0C = 0xEEE91C32; pltmp[4] = 0x0FACDCC5; // 0x1010 AGC_Ctrl5 pltmp[5] = 0x000AA344; // 0x1014 AGC_Ctrl6 pltmp[6] = 0x22222221; // 0x1018 AGC_Ctrl7 @@ -1784,27 +1785,27 @@ BBProcessor_initial( phw_data_t pHwData ) pltmp[9] = 0xA9002A79; // 0x1024 AGC_Ctrl10 pltmp[10] = 0x40000528; // 0x1028 pltmp[11] = 0x23457F30; // 0x102c A_ACQ_Ctrl - pWb35Reg->BB2C = 0x23457F30; + reg->BB2C = 0x23457F30; Wb35Reg_BurstWrite( pHwData, 0x1000, pltmp, 12, AUTO_INCREMENT ); pltmp[0] = 0x00002C54; // 0x1030 B_ACQ_Ctrl - pWb35Reg->BB30 = 0x00002C54; + 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 - pWb35Reg->BB3C = pHwData->BB3c_cal; + 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 20060613.2 - pWb35Reg->BB48 = BB48_DEFAULT_WB242_11G; // 20060613.1 20060613.2 + reg->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 + reg->BB4C = BB4C_DEFAULT_WB242_11G; // 20060613.1 20060613.2 pltmp[8] = 0x27106208; // 0x1050 MODE_Ctrl - pWb35Reg->BB50 = 0x27106208; + reg->BB50 = 0x27106208; pltmp[9] = pHwData->BB54_cal; // 0x1054 - pWb35Reg->BB54 = pHwData->BB54_cal; + reg->BB54 = pHwData->BB54_cal; pltmp[10] = 0x52523131; // 0x1058 IQ_Alpha - pWb35Reg->BB58 = 0x52523131; + reg->BB58 = 0x52523131; pltmp[11] = 0xAA0AC000; // 20060825 0xAA2AC000; // 0x105c DC_Cancel Wb35Reg_BurstWrite( pHwData, 0x1030, pltmp, 12, AUTO_INCREMENT ); @@ -1813,14 +1814,14 @@ BBProcessor_initial( phw_data_t pHwData ) } // 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; + 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 + reg->SQ3_filter[i] = 0x2f; // half of Bit 0 ~ 6 } void set_tx_power_per_channel_max2829( phw_data_t pHwData, ChanInfo Channel) @@ -1903,7 +1904,7 @@ void set_tx_power_per_channel_wb242( phw_data_t pHwData, ChanInfo Channel) void RFSynthesizer_SwitchingChannel( phw_data_t pHwData, ChanInfo Channel ) { - PWB35REG pWb35Reg = &pHwData->Wb35Reg; + struct wb35_reg *reg = &pHwData->reg; u32 pltmp[16]; // The 16 is the maximum capability of hardware u32 count, ltmp; u8 i, j, number; @@ -2090,40 +2091,40 @@ RFSynthesizer_SwitchingChannel( phw_data_t pHwData, ChanInfo Channel ) 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 + reg->BB50 &= ~(BIT(11)|BIT(12)); + Wb35Reg_Write( pHwData, 0x1050, reg->BB50 ); // MODE_Ctrl // MAC: select 2.4 GHz, bit[5]=0 - pWb35Reg->M78_ERPInformation &= ~BIT(5); - Wb35Reg_Write( pHwData, 0x0878, pWb35Reg->M78_ERPInformation ); + reg->M78_ERPInformation &= ~BIT(5); + Wb35Reg_Write( pHwData, 0x0878, reg->M78_ERPInformation ); // enable 11b Baseband - pWb35Reg->BB30 &= ~BIT(31); - Wb35Reg_Write( pHwData, 0x1030, pWb35Reg->BB30 ); + reg->BB30 &= ~BIT(31); + Wb35Reg_Write( pHwData, 0x1030, reg->BB30 ); } else if( (Channel.band == BAND_TYPE_OFDM_5) ) { // BB: select 5 GHz - pWb35Reg->BB50 &= ~(BIT(11)|BIT(12)); + reg->BB50 &= ~(BIT(11)|BIT(12)); if (Channel.ChanNo <=64 ) - pWb35Reg->BB50 |= BIT(12); // 10-5.25GHz + reg->BB50 |= BIT(12); // 10-5.25GHz else if ((Channel.ChanNo >= 100) && (Channel.ChanNo <= 124)) - pWb35Reg->BB50 |= BIT(11); // 01-5.48GHz + reg->BB50 |= BIT(11); // 01-5.48GHz else if ((Channel.ChanNo >=128) && (Channel.ChanNo <= 161)) - pWb35Reg->BB50 |= (BIT(12)|BIT(11)); // 11-5.775GHz + 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 - pWb35Reg->BB50 |= BIT(12); - Wb35Reg_Write( pHwData, 0x1050, pWb35Reg->BB50 ); // MODE_Ctrl + 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 - pWb35Reg->M78_ERPInformation |= BIT(5); - Wb35Reg_Write( pHwData, 0x0878, pWb35Reg->M78_ERPInformation ); + reg->M78_ERPInformation |= BIT(5); + Wb35Reg_Write( pHwData, 0x0878, reg->M78_ERPInformation ); // disable 11b Baseband - pWb35Reg->BB30 |= BIT(31); - Wb35Reg_Write( pHwData, 0x1030, pWb35Reg->BB30 ); + reg->BB30 |= BIT(31); + Wb35Reg_Write( pHwData, 0x1030, reg->BB30 ); } } } @@ -2313,21 +2314,21 @@ u8 RFSynthesizer_SetWinbond242Power( phw_data_t pHwData, u8 index ) //=========================================================================================================== void Dxx_initial( phw_data_t pHwData ) { - PWB35REG pWb35Reg = &pHwData->Wb35Reg; + struct wb35_reg *reg = &pHwData->reg; // 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 + 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 ) ) - pWb35Reg->D00_DmaControl = 0xc0000000;//Txon, Rxon, single Rx for new 4k DMA + reg->D00_DmaControl = 0xc0000000;//Txon, Rxon, single Rx for new 4k DMA - Wb35Reg_WriteSync( pHwData, 0x0400, pWb35Reg->D00_DmaControl ); + Wb35Reg_WriteSync( pHwData, 0x0400, reg->D00_DmaControl ); } void Mxx_initial( phw_data_t pHwData ) { - PWB35REG pWb35Reg = &pHwData->Wb35Reg; + struct wb35_reg *reg = &pHwData->reg; u32 tmp; u32 pltmp[11]; u16 i; @@ -2339,23 +2340,23 @@ void Mxx_initial( phw_data_t pHwData ) // M00 bit set #ifdef _IBSS_BEACON_SEQ_STICK_ - pWb35Reg->M00_MacControl = 0; // Solve beacon sequence number stop by software + reg->M00_MacControl = 0; // Solve beacon sequence number stop by software #else - pWb35Reg->M00_MacControl = 0x80000000; // Solve beacon sequence number stop by hardware + reg->M00_MacControl = 0x80000000; // Solve beacon sequence number stop by hardware #endif // M24 disable enter power save, BB RxOn and enable NAV attack - pWb35Reg->M24_MacControl = 0x08040042; - pltmp[0] = pWb35Reg->M24_MacControl; + reg->M24_MacControl = 0x08040042; + pltmp[0] = reg->M24_MacControl; pltmp[1] = 0; // Skip M28, because no initialize value is required. // 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 pltmp[3] = *(u32 *)pHwData->bssid; @@ -2367,35 +2368,35 @@ void Mxx_initial( phw_data_t pHwData ) 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; + 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; + reg->M3C_MacControl = tmp; pltmp[6] = tmp; // 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; + reg->M44_MacControl = tmp; pltmp[8] = tmp; // 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; + 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 ); @@ -2404,15 +2405,15 @@ void Mxx_initial( phw_data_t pHwData ) // M60 Wb35Reg_WriteSync( pHwData, 0x0860, 0x12481248 ); - pWb35Reg->M60_MacControl = 0x12481248; + reg->M60_MacControl = 0x12481248; // M68 Wb35Reg_WriteSync( pHwData, 0x0868, 0x00050900 ); // 20051018 0x000F0F00 ); // 940930 0x00131300 - pWb35Reg->M68_MacControl = 0x00050900; + reg->M68_MacControl = 0x00050900; // M98 Wb35Reg_WriteSync( pHwData, 0x0898, 0xffff8888 ); - pWb35Reg->M98_MacControl = 0xffff8888; + reg->M98_MacControl = 0xffff8888; } @@ -2620,7 +2621,7 @@ void EEPROMTxVgaAdjust( phw_data_t pHwData ) // 20060619.5 Add void BBProcessor_RateChanging( phw_data_t pHwData, u8 rate ) // 20060613.1 { - PWB35REG pWb35Reg = &pHwData->Wb35Reg; + struct wb35_reg *reg = &pHwData->reg; unsigned char Is11bRate; Is11bRate = (rate % 6) ? 1 : 0; @@ -2630,8 +2631,8 @@ void BBProcessor_RateChanging( phw_data_t pHwData, u8 rate ) // 20060613.1 case RF_AIROHA_2230S: // 20060420 Add this if( Is11bRate ) { - if( (pWb35Reg->BB48 != BB48_DEFAULT_AL2230_11B) && - (pWb35Reg->BB4C != BB4C_DEFAULT_AL2230_11B) ) + 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 ); @@ -2639,8 +2640,8 @@ void BBProcessor_RateChanging( phw_data_t pHwData, u8 rate ) // 20060613.1 } else { - if( (pWb35Reg->BB48 != BB48_DEFAULT_AL2230_11G) && - (pWb35Reg->BB4C != BB4C_DEFAULT_AL2230_11G) ) + 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 ); @@ -2651,22 +2652,22 @@ void BBProcessor_RateChanging( phw_data_t pHwData, u8 rate ) // 20060613.1 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) ) + if( (reg->BB48 != BB48_DEFAULT_WB242_11B) && + (reg->BB4C != BB4C_DEFAULT_WB242_11B) ) { - pWb35Reg->BB48 = BB48_DEFAULT_WB242_11B; - pWb35Reg->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) ) + if( (reg->BB48 != BB48_DEFAULT_WB242_11G) && + (reg->BB4C != BB4C_DEFAULT_WB242_11G) ) { - pWb35Reg->BB48 = BB48_DEFAULT_WB242_11G; - pWb35Reg->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 ); } 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 index 1d1b0c4fec1..775bb81f23c 100644 --- a/drivers/staging/winbond/scan_s.h +++ b/drivers/staging/winbond/scan_s.h @@ -1,3 +1,9 @@ +#ifndef __WINBOND_SCAN_S_H +#define __WINBOND_SCAN_S_H + +#include <linux/types.h> +#include "localpara.h" + // // SCAN task global CONSTANTS, STRUCTURES, variables // @@ -62,8 +68,7 @@ typedef struct _SCAN_PARAMETERS u8 boCCAbusy; // Wb: HWMAC CCA busy status u8 reserved_2; - //NDIS_MINIPORT_TIMER nTimer; - OS_TIMER nTimer; + struct timer_list timer; u32 ScanTimeStamp; //Increase 1 per background scan(1 minute) u32 BssTimeStamp; //Increase 1 per connect status check @@ -78,9 +83,9 @@ typedef struct _SCAN_PARAMETERS } SCAN_PARAMETERS, *psSCAN_PARAMETERS; -// Encapsulate 'Adapter' data structure -#define psSCAN (&(Adapter->sScanPara)) -#define psSCANREQ (&(Adapter->sScanPara.sScanReq)) +// Encapsulate 'adapter' data structure +#define psSCAN (&(adapter->sScanPara)) +#define psSCANREQ (&(adapter->sScanPara.sScanReq)) //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // scan.h @@ -109,7 +114,8 @@ typedef struct _SCAN_PARAMETERS // static functions -//static void ScanTimerHandler(PWB32_ADAPTER Adapter); -//static void vScanTimerStart(PWB32_ADAPTER Adapter, int timeout_value); -//static void vScanTimerStop(PWB32_ADAPTER Adapter); +//static void ScanTimerHandler(struct wbsoft_priv * adapter); +//static void vScanTimerStart(struct wbsoft_priv * adapter, int timeout_value); +//static void vScanTimerStop(struct wbsoft_priv * adapter); +#endif 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..188a2532bbf 100644 --- a/drivers/staging/winbond/sme_api.h +++ b/drivers/staging/winbond/sme_api.h @@ -13,6 +13,10 @@ #ifndef __SME_API_H__ #define __SME_API_H__ +#include <linux/types.h> + +#include "localpara.h" + /****************** INCLUDE FILES SECTION ***********************************/ //#include "GL\gl_core.h" @@ -52,9 +56,6 @@ s8 sme_set_fragment_threshold(void *pcore_data, u32 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 s8 sme_get_beacon_period(void *pcore_data, u16 *pbeacon_period); s8 sme_set_beacon_period(void *pcore_data, u16 beacon_period); diff --git a/drivers/staging/winbond/sme_s.h b/drivers/staging/winbond/sme_s.h index dfd2fbc4ede..1bd118f83d2 100644 --- a/drivers/staging/winbond/sme_s.h +++ b/drivers/staging/winbond/sme_s.h @@ -1,3 +1,11 @@ +#ifndef __WINBOND_SME_S_H +#define __WINBOND_SME_S_H + +#include <linux/types.h> + +#include "mac_structures.h" +#include "localpara.h" + // // SME_S.H - // SME task global CONSTANTS, STRUCTURES, variables @@ -106,8 +114,7 @@ typedef struct _SME_PARAMETERS u8 bDesiredPowerSave; // SME timer and timeout value - //NDIS_MINIPORT_TIMER nTimer; - OS_TIMER nTimer; + struct timer_list timer; u8 boInTimerHandler; u8 boAuthRetryActive; @@ -196,9 +203,9 @@ typedef struct _SME_PARAMETERS } SME_PARAMETERS, *PSME_PARAMETERS; -#define psSME (&(Adapter->sSmePara)) +#define psSME (&(adapter->sSmePara)) -#define wSMEGetCurrentSTAState(Adapter) ((u16)(Adapter)->sSmePara.wState) +#define wSMEGetCurrentSTAState(adapter) ((u16)(adapter)->sSmePara.wState) @@ -226,3 +233,4 @@ typedef struct _SME_PARAMETERS // Static function +#endif diff --git a/drivers/staging/winbond/linux/sysdef.h b/drivers/staging/winbond/sysdef.h index d46d63e5c67..251b9c553b6 100644 --- a/drivers/staging/winbond/linux/sysdef.h +++ b/drivers/staging/winbond/sysdef.h @@ -37,37 +37,4 @@ #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/wb35reg.c index ebb6db5438a..c74b3fdcbda 100644 --- a/drivers/staging/winbond/linux/wb35reg.c +++ b/drivers/staging/winbond/wb35reg.c @@ -1,9 +1,12 @@ #include "sysdef.h" +#include "wb35reg_f.h" + +#include <linux/usb.h> extern void phy_calibration_winbond(hw_data_t *phw_data, u32 frequency); -// TRUE : read command process successfully -// FALSE : register not support +// true : read command process successfully +// false : register not support // RegisterNo : start base // pRegisterData : data point // NumberOfData : number of register data @@ -12,135 +15,135 @@ extern void phy_calibration_winbond(hw_data_t *phw_data, u32 frequency); 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; + 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; + 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 ); + UrbSize = sizeof(struct wb35_reg_queue) + DataSize + sizeof(struct usb_ctrlrequest); + reg_queue = kzalloc(UrbSize, GFP_ATOMIC); + urb = usb_alloc_urb(0, GFP_ATOMIC); + if( urb && reg_queue ) { + 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++ ) - pRegQueue->pBuffer[i] = cpu_to_le32( pRegQueue->pBuffer[i] ); + reg_queue->pBuffer[i] = cpu_to_le32( reg_queue->pBuffer[i] ); - dr = (struct usb_ctrlrequest *)((u8 *)pRegQueue + sizeof(REG_QUEUE) + DataSize); + 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 ); - pRegQueue->Next = NULL; - pRegQueue->pUsbReq = dr; - pRegQueue->pUrb = pUrb; + reg_queue->Next = NULL; + reg_queue->pUsbReq = dr; + reg_queue->urb = urb; - spin_lock_irq( &pWb35Reg->EP0VM_spin_lock ); - if (pWb35Reg->pRegFirst == NULL) - pWb35Reg->pRegFirst = pRegQueue; + spin_lock_irq( ®->EP0VM_spin_lock ); + if (reg->reg_first == NULL) + reg->reg_first = reg_queue; else - pWb35Reg->pRegLast->Next = pRegQueue; - pWb35Reg->pRegLast = pRegQueue; + reg->reg_last->Next = reg_queue; + reg->reg_last = reg_queue; - spin_unlock_irq( &pWb35Reg->EP0VM_spin_lock ); + spin_unlock_irq( ®->EP0VM_spin_lock ); // Start EP0VM Wb35Reg_EP0VM_start(pHwData); - return TRUE; + return true; } else { - if (pUrb) - usb_free_urb(pUrb); - if (pRegQueue) - kfree(pRegQueue); - return FALSE; + if (urb) + usb_free_urb(urb); + if (reg_queue) + kfree(reg_queue); + return false; } - return FALSE; + return false; } void Wb35Reg_Update(phw_data_t pHwData, u16 RegisterNo, u32 RegisterValue) { - PWB35REG pWb35Reg = &pHwData->Wb35Reg; + struct wb35_reg *reg = &pHwData->reg; 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; + 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 +// 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; + struct wb35_reg *reg = &pHwData->reg; int ret = -1; // Module shutdown if (pHwData->SurpriseRemove) - return FALSE; + return false; RegisterValue = cpu_to_le32(RegisterValue); // update the register by send usb message------------------------------------ - pWb35Reg->SyncIoPause = 1; + reg->SyncIoPause = 1; // 20060717.5 Wait until EP0VM stop - while (pWb35Reg->EP0vm_state != VM_STOP) - OS_SLEEP(10000); + while (reg->EP0vm_state != VM_STOP) + msleep(10); // Sync IoCallDriver - pWb35Reg->EP0vm_state = VM_RUNNING; + reg->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; + reg->EP0vm_state = VM_STOP; + reg->SyncIoPause = 0; Wb35Reg_EP0VM_start(pHwData); @@ -150,38 +153,38 @@ Wb35Reg_WriteSync( phw_data_t pHwData, u16 RegisterNo, u32 RegisterValue ) #endif pHwData->SurpriseRemove = 1; // 20060704.2 - return FALSE; + return false; } - return TRUE; + return true; } -// TRUE : read command process successfully -// FALSE : register not support +// 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 wb35_reg *reg = &pHwData->reg; struct usb_ctrlrequest *dr; - PURB pUrb = NULL; - PREG_QUEUE pRegQueue = NULL; + struct urb *urb = NULL; + struct wb35_reg_queue *reg_queue = NULL; u16 UrbSize; // Module shutdown if (pHwData->SurpriseRemove) - return FALSE; + 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)); + UrbSize = sizeof(struct wb35_reg_queue) + sizeof(struct usb_ctrlrequest); + reg_queue = kzalloc(UrbSize, GFP_ATOMIC); + urb = usb_alloc_urb(0, GFP_ATOMIC); + if (urb && reg_queue) { + 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); @@ -189,61 +192,61 @@ Wb35Reg_Write( phw_data_t pHwData, u16 RegisterNo, u32 RegisterValue ) dr->wLength = cpu_to_le16(4); // Enter the sending queue - pRegQueue->Next = NULL; - pRegQueue->pUsbReq = dr; - pRegQueue->pUrb = pUrb; + reg_queue->Next = NULL; + reg_queue->pUsbReq = dr; + reg_queue->urb = urb; - spin_lock_irq(&pWb35Reg->EP0VM_spin_lock ); - if (pWb35Reg->pRegFirst == NULL) - pWb35Reg->pRegFirst = pRegQueue; + spin_lock_irq(®->EP0VM_spin_lock ); + if (reg->reg_first == NULL) + reg->reg_first = reg_queue; else - pWb35Reg->pRegLast->Next = pRegQueue; - pWb35Reg->pRegLast = pRegQueue; + reg->reg_last->Next = reg_queue; + reg->reg_last = reg_queue; - spin_unlock_irq( &pWb35Reg->EP0VM_spin_lock ); + spin_unlock_irq( ®->EP0VM_spin_lock ); // Start EP0VM Wb35Reg_EP0VM_start(pHwData); - return TRUE; + return true; } else { - if (pUrb) - usb_free_urb(pUrb); - kfree(pRegQueue); - return FALSE; + if (urb) + usb_free_urb(urb); + kfree(reg_queue); + 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 +// 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 wb35_reg *reg = &pHwData->reg; struct usb_ctrlrequest *dr; - PURB pUrb = NULL; - PREG_QUEUE pRegQueue = NULL; + struct urb *urb = NULL; + struct wb35_reg_queue *reg_queue = NULL; u16 UrbSize; // Module shutdown if (pHwData->SurpriseRemove) - return FALSE; + 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); + UrbSize = sizeof(struct wb35_reg_queue) + sizeof(struct usb_ctrlrequest); + reg_queue = kzalloc(UrbSize, GFP_ATOMIC); + urb = usb_alloc_urb(0, GFP_ATOMIC); + if (urb && reg_queue) { + 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(pRegQueue->RESERVED, pValue, Len); - pRegQueue->RESERVED_VALID = TRUE; - dr = (struct usb_ctrlrequest *)((u8 *)pRegQueue + sizeof(REG_QUEUE)); + 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); @@ -251,52 +254,52 @@ Wb35Reg_WriteWithCallbackValue( phw_data_t pHwData, u16 RegisterNo, u32 Register 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; + 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 - pWb35Reg->pRegLast->Next = pRegQueue; - pWb35Reg->pRegLast = pRegQueue; + reg->reg_last->Next = reg_queue; + reg->reg_last = reg_queue; - spin_unlock_irq ( &pWb35Reg->EP0VM_spin_lock ); + spin_unlock_irq ( ®->EP0VM_spin_lock ); // Start EP0VM Wb35Reg_EP0VM_start(pHwData); - return TRUE; + return true; } else { - if (pUrb) - usb_free_urb(pUrb); - kfree(pRegQueue); - return FALSE; + if (urb) + usb_free_urb(urb); + kfree(reg_queue); + return false; } } -// TRUE : read command process successfully -// FALSE : register not support +// 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; + struct wb35_reg *reg = &pHwData->reg; u32 * pltmp = pRegisterValue; int ret = -1; // Module shutdown if (pHwData->SurpriseRemove) - return FALSE; + return false; // Read the register by send usb message------------------------------------ - pWb35Reg->SyncIoPause = 1; + reg->SyncIoPause = 1; // 20060717.5 Wait until EP0VM stop - while (pWb35Reg->EP0vm_state != VM_STOP) - OS_SLEEP(10000); + while (reg->EP0vm_state != VM_STOP) + msleep(10); - pWb35Reg->EP0vm_state = VM_RUNNING; + reg->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, @@ -304,10 +307,10 @@ Wb35Reg_ReadSync( phw_data_t pHwData, u16 RegisterNo, u32 * pRegisterValue ) *pRegisterValue = cpu_to_le32(*pltmp); - pWb35Reg->EP0vm_state = VM_STOP; + reg->EP0vm_state = VM_STOP; Wb35Reg_Update( pHwData, RegisterNo, *pRegisterValue ); - pWb35Reg->SyncIoPause = 0; + reg->SyncIoPause = 0; Wb35Reg_EP0VM_start( pHwData ); @@ -317,38 +320,38 @@ Wb35Reg_ReadSync( phw_data_t pHwData, u16 RegisterNo, u32 * pRegisterValue ) #endif pHwData->SurpriseRemove = 1; // 20060704.2 - return FALSE; + return false; } - return TRUE; + return true; } -// TRUE : read command process successfully -// FALSE : register not support +// 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 wb35_reg *reg = &pHwData->reg; struct usb_ctrlrequest * dr; - PURB pUrb; - PREG_QUEUE pRegQueue; + struct urb *urb; + struct wb35_reg_queue *reg_queue; u16 UrbSize; // Module shutdown if (pHwData->SurpriseRemove) - return FALSE; + 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 ) + UrbSize = sizeof(struct wb35_reg_queue) + sizeof(struct usb_ctrlrequest); + reg_queue = kzalloc(UrbSize, GFP_ATOMIC); + urb = usb_alloc_urb(0, GFP_ATOMIC); + if( urb && reg_queue ) { - pRegQueue->DIRECT = 0;// read register - pRegQueue->INDEX = RegisterNo; - pRegQueue->pBuffer = pRegisterValue; - dr = (struct usb_ctrlrequest *)((u8 *)pRegQueue + sizeof(REG_QUEUE)); + 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); @@ -356,27 +359,27 @@ Wb35Reg_Read(phw_data_t pHwData, u16 RegisterNo, u32 * pRegisterValue ) 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; + 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 - pWb35Reg->pRegLast->Next = pRegQueue; - pWb35Reg->pRegLast = pRegQueue; + reg->reg_last->Next = reg_queue; + reg->reg_last = reg_queue; - spin_unlock_irq( &pWb35Reg->EP0VM_spin_lock ); + spin_unlock_irq( ®->EP0VM_spin_lock ); // Start EP0VM Wb35Reg_EP0VM_start( pHwData ); - return TRUE; + return true; } else { - if (pUrb) - usb_free_urb( pUrb ); - kfree(pRegQueue); - return FALSE; + if (urb) + usb_free_urb( urb ); + kfree(reg_queue); + return false; } } @@ -384,57 +387,57 @@ Wb35Reg_Read(phw_data_t pHwData, u16 RegisterNo, u32 * pRegisterValue ) void Wb35Reg_EP0VM_start( phw_data_t pHwData ) { - PWB35REG pWb35Reg = &pHwData->Wb35Reg; + struct wb35_reg *reg = &pHwData->reg; - if (OS_ATOMIC_INC( pHwData->Adapter, &pWb35Reg->RegFireCount) == 1) { - pWb35Reg->EP0vm_state = VM_RUNNING; + if (atomic_inc_return(®->RegFireCount) == 1) { + reg->EP0vm_state = VM_RUNNING; Wb35Reg_EP0VM(pHwData); } else - OS_ATOMIC_DEC( pHwData->Adapter, &pWb35Reg->RegFireCount ); + atomic_dec(®->RegFireCount); } void Wb35Reg_EP0VM(phw_data_t pHwData ) { - PWB35REG pWb35Reg = &pHwData->Wb35Reg; - PURB pUrb; + struct wb35_reg *reg = &pHwData->reg; + struct urb *urb; struct usb_ctrlrequest *dr; u32 * pBuffer; int ret = -1; - PREG_QUEUE pRegQueue; + struct wb35_reg_queue *reg_queue; - if (pWb35Reg->SyncIoPause) + if (reg->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 ); + spin_lock_irq( ®->EP0VM_spin_lock ); + reg_queue = reg->reg_first; + spin_unlock_irq( ®->EP0VM_spin_lock ); - if (!pRegQueue) + if (!reg_queue) goto cleanup; // Get an Urb, send it - pUrb = (PURB)pRegQueue->pUrb; + urb = (struct urb *)reg_queue->urb; - dr = pRegQueue->pUsbReq; - pUrb = pRegQueue->pUrb; - pBuffer = pRegQueue->pBuffer; - if (pRegQueue->DIRECT == 1) // output - pBuffer = &pRegQueue->VALUE; + 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( pUrb, pHwData->WbUsb.udev, - REG_DIRECTION(pHwData->WbUsb.udev,pRegQueue), + usb_fill_control_urb( urb, pHwData->WbUsb.udev, + REG_DIRECTION(pHwData->WbUsb.udev,reg_queue), (u8 *)dr,pBuffer,cpu_to_le16(dr->wLength), Wb35Reg_EP0VM_complete, (void*)pHwData); - pWb35Reg->EP0vm_state = VM_RUNNING; + reg->EP0vm_state = VM_RUNNING; - ret = wb_usb_submit_urb( pUrb ); + ret = usb_submit_urb(urb, GFP_ATOMIC); if (ret < 0) { #ifdef _PE_REG_DUMP_ @@ -446,41 +449,41 @@ Wb35Reg_EP0VM(phw_data_t pHwData ) return; cleanup: - pWb35Reg->EP0vm_state = VM_STOP; - OS_ATOMIC_DEC( pHwData->Adapter, &pWb35Reg->RegFireCount ); + reg->EP0vm_state = VM_STOP; + atomic_dec(®->RegFireCount); } void -Wb35Reg_EP0VM_complete(PURB pUrb) +Wb35Reg_EP0VM_complete(struct urb *urb) { - phw_data_t pHwData = (phw_data_t)pUrb->context; - PWB35REG pWb35Reg = &pHwData->Wb35Reg; - PREG_QUEUE pRegQueue; + phw_data_t pHwData = (phw_data_t)urb->context; + struct wb35_reg *reg = &pHwData->reg; + struct wb35_reg_queue *reg_queue; // Variable setting - pWb35Reg->EP0vm_state = VM_COMPLETED; - pWb35Reg->EP0VM_status = pUrb->status; + reg->EP0vm_state = VM_COMPLETED; + reg->EP0VM_status = urb->status; if (pHwData->SurpriseRemove) { // Let WbWlanHalt to handle surprise remove - pWb35Reg->EP0vm_state = VM_STOP; - OS_ATOMIC_DEC( pHwData->Adapter, &pWb35Reg->RegFireCount ); + reg->EP0vm_state = VM_STOP; + atomic_dec(®->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) { + 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) { #ifdef _PE_REG_DUMP_ WBDEBUG(("EP0 IoCompleteRoutine return error\n")); - DebugUsbdStatusInformation( pWb35Reg->EP0VM_status ); + DebugUsbdStatusInformation( reg->EP0VM_status ); #endif - pWb35Reg->EP0vm_state = VM_STOP; + reg->EP0vm_state = VM_STOP; pHwData->SurpriseRemove = 1; } else { // Success. Update the result @@ -489,52 +492,52 @@ Wb35Reg_EP0VM_complete(PURB pUrb) Wb35Reg_EP0VM(pHwData); } - kfree(pRegQueue); + kfree(reg_queue); } - usb_free_urb(pUrb); + usb_free_urb(urb); } void Wb35Reg_destroy(phw_data_t pHwData) { - PWB35REG pWb35Reg = &pHwData->Wb35Reg; - PURB pUrb; - PREG_QUEUE pRegQueue; + 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 { - 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 + msleep(10); // Delay for waiting function enter 940623.1.a + } while (reg->EP0vm_state != VM_STOP); + msleep(10); // 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); + 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 { #ifdef _PE_REG_DUMP_ WBDEBUG(("EP0 queue release error\n")); #endif } - spin_lock_irq( &pWb35Reg->EP0VM_spin_lock ); + spin_lock_irq( ®->EP0VM_spin_lock ); - pRegQueue = pWb35Reg->pRegFirst; + reg_queue = reg->reg_first; } - spin_unlock_irq( &pWb35Reg->EP0VM_spin_lock ); + spin_unlock_irq( ®->EP0VM_spin_lock ); } //==================================================================================== @@ -542,35 +545,35 @@ Wb35Reg_destroy(phw_data_t pHwData) //==================================================================================== unsigned char Wb35Reg_initial(phw_data_t pHwData) { - PWB35REG pWb35Reg=&pHwData->Wb35Reg; + 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( &pWb35Reg->EP0VM_spin_lock ); + 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 - pWb35Reg->EEPROMPhyType = (u8)( ltmp & 0xff ); + 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 (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; + 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 @@ -606,9 +609,9 @@ unsigned char Wb35Reg_initial(phw_data_t pHwData) 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; + reg->EEPROMRegion = (u8)(Region_ScanInterval>>8); // 20060720 + if( reg->EEPROMRegion<1 || reg->EEPROMRegion>6 ) + reg->EEPROMRegion = REGION_AUTO; //For Get Tx VGA from EEPROM 20060315.5 move here GetTxVgaFromEEPROM( pHwData ); @@ -629,9 +632,9 @@ unsigned char Wb35Reg_initial(phw_data_t pHwData) Dxx_initial(pHwData); if (pHwData->SurpriseRemove) - return FALSE; + return false; else - return TRUE; // Initial fail + return true; // Initial fail } //=================================================================================== diff --git a/drivers/staging/winbond/linux/wb35reg_f.h b/drivers/staging/winbond/wb35reg_f.h index 3006cfe99cc..d97215a1eba 100644 --- a/drivers/staging/winbond/linux/wb35reg_f.h +++ b/drivers/staging/winbond/wb35reg_f.h @@ -1,3 +1,8 @@ +#ifndef __WINBOND_WB35REG_F_H +#define __WINBOND_WB35REG_F_H + +#include "wbhal_s.h" + //==================================== // Interface function declare //==================================== @@ -42,7 +47,7 @@ unsigned char Wb35Reg_BurstWrite( phw_data_t pHwData, u16 RegisterNo, u32 * p void Wb35Reg_EP0VM( phw_data_t pHwData ); void Wb35Reg_EP0VM_start( phw_data_t pHwData ); -void Wb35Reg_EP0VM_complete( PURB pUrb ); +void Wb35Reg_EP0VM_complete(struct urb *urb); u32 BitReverse( u32 dwData, u32 DataLength); @@ -53,4 +58,4 @@ 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 ); - +#endif diff --git a/drivers/staging/winbond/linux/wb35reg_s.h b/drivers/staging/winbond/wb35reg_s.h index 8b35b93f7f0..32ef4b8a2d2 100644 --- a/drivers/staging/winbond/linux/wb35reg_s.h +++ b/drivers/staging/winbond/wb35reg_s.h @@ -1,3 +1,10 @@ +#ifndef __WINBOND_WB35REG_S_H +#define __WINBOND_WB35REG_S_H + +#include <linux/spinlock.h> +#include <linux/types.h> +#include <asm/atomic.h> + //======================================================================================= /* HAL setting function @@ -67,30 +74,25 @@ #define DEFAULT_DTIM_ALERT_TIME 0 -typedef struct _REG_QUEUE -{ - struct urb *pUrb; - void* pUsbReq; - void* Next; - union - { +struct wb35_reg_queue { + struct urb *urb; + void *pUsbReq; + void *Next; + union { u32 VALUE; - u32 * pBuffer; + 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; + 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 -typedef struct _WB35REG -{ +struct wb35_reg { //============================ // Register Bank backup //============================ @@ -145,9 +147,9 @@ typedef struct _WB35REG //------------------- spinlock_t EP0VM_spin_lock; // 4B u32 EP0VM_status;//$$ - PREG_QUEUE pRegFirst; - PREG_QUEUE pRegLast; - OS_ATOMIC RegFireCount; + struct wb35_reg_queue *reg_first; + struct wb35_reg_queue *reg_last; + atomic_t RegFireCount; // Hardware status u8 EP0vm_state; @@ -165,6 +167,6 @@ typedef struct _WB35REG u32 SQ3_filter[MAX_SQ3_FILTER_SIZE]; u32 SQ3_index; -} WB35REG, *PWB35REG; - +}; +#endif diff --git a/drivers/staging/winbond/linux/wb35rx.c b/drivers/staging/winbond/wb35rx.c index b4b9f5f371d..7f8b6d749a4 100644 --- a/drivers/staging/winbond/linux/wb35rx.c +++ b/drivers/staging/winbond/wb35rx.c @@ -8,85 +8,160 @@ // Processing the Rx message from down layer // //============================================================================ +#include <linux/usb.h> + +#include "core.h" #include "sysdef.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); -void Wb35Rx_start(phw_data_t pHwData) +/* + rx_status.rate = 10; + rx_status.channel = 1; + rx_status.freq = 12345; + rx_status.phymode = MODE_IEEE80211B; +*/ + + ieee80211_rx_irqsafe(hw, skb, &rx_status); +} + +static void Wb35Rx_adjust(PDESCRIPTOR pRxDes) { - PWB35RX pWb35Rx = &pHwData->Wb35Rx; + u32 * pRxBufferAddress; + u32 DecryptionMethod; + u32 i; + u16 BufferSize; - // 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); + 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; } -// This function cannot reentrain -void Wb35Rx( phw_data_t pHwData ) +static u16 Wb35Rx_indicate(struct ieee80211_hw *hw) { + struct wbsoft_priv *priv = hw->priv; + phw_data_t pHwData = &priv->sHwData; + DESCRIPTOR RxDes; PWB35RX pWb35Rx = &pHwData->Wb35Rx; - u8 * pRxBufferAddress; - PURB pUrb = (PURB)pWb35Rx->RxUrb; - int retv; - u32 RxBufferId; + u8 * pRxBufferAddress; + u16 PacketSize; + u16 stmp, BufferSize, stmp2 = 0; + u32 RxBufferId; - // - // Issuing URB - // - if (pHwData->SurpriseRemove || pHwData->HwStop) - goto error; + // Only one thread be allowed to run into the following + do { + RxBufferId = pWb35Rx->RxProcessIndex; + if (pWb35Rx->RxOwner[ RxBufferId ]) //Owner by VM + break; - if (pWb35Rx->rx_halt) - goto error; + pWb35Rx->RxProcessIndex++; + pWb35Rx->RxProcessIndex %= MAX_USB_RX_BUFFER_NUMBER; - // 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; - } + pRxBufferAddress = pWb35Rx->pDRx; + BufferSize = pWb35Rx->RxBufferSize[ RxBufferId ]; - // Update buffer point, then start to bulkin the data from USB - pWb35Rx->RxBufferId++; - pWb35Rx->RxBufferId %= MAX_USB_RX_BUFFER_NUMBER; + // Parse the bulkin buffer + while (BufferSize >= 4) { + if ((cpu_to_le32(*(u32 *)pRxBufferAddress) & 0x0fffffff) == RX_END_TAG) //Is ending? 921002.9.a + break; - pWb35Rx->CurrentRxBufferId = RxBufferId; + // 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; - if (1 != OS_MEMORY_ALLOC((void* *)&pWb35Rx->pDRx, MAX_USB_RX_BUFFER)) { - printk("w35und: Rx memory alloc failed\n"); - goto error; - } - pRxBufferAddress = pWb35Rx->pDRx; + // 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 - 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_STOP; + pWb35Rx->Ep3ErrorCount2++; + break; + } - pWb35Rx->EP3vm_state = VM_RUNNING; + // 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; - retv = wb_usb_submit_urb(pUrb); + 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); - if (retv != 0) { - printk("Rx URB sending error\n"); - goto error; - } - return; + packet_came(hw, pRxBufferAddress, PacketSize); -error: - // VM stop - pWb35Rx->EP3vm_state = VM_STOP; - OS_ATOMIC_DEC( pHwData->Adapter, &pWb35Rx->RxFireCounter ); + // 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; } -void Wb35Rx_Complete(PURB pUrb) +static void Wb35Rx(struct ieee80211_hw *hw); + +static void Wb35Rx_Complete(struct urb *urb) { - phw_data_t pHwData = pUrb->context; + struct ieee80211_hw *hw = urb->context; + struct wbsoft_priv *priv = hw->priv; + phw_data_t pHwData = &priv->sHwData; PWB35RX pWb35Rx = &pHwData->Wb35Rx; u8 * pRxBufferAddress; u32 SizeCheck; @@ -96,12 +171,12 @@ void Wb35Rx_Complete(PURB pUrb) // Variable setting pWb35Rx->EP3vm_state = VM_COMPLETED; - pWb35Rx->EP3VM_status = pUrb->status;//Store the last result of Irp + pWb35Rx->EP3VM_status = urb->status;//Store the last result of Irp RxBufferId = pWb35Rx->CurrentRxBufferId; pRxBufferAddress = pWb35Rx->pDRx; - BulkLength = (u16)pUrb->actual_length; + BulkLength = (u16)urb->actual_length; // The IRP is completed pWb35Rx->EP3vm_state = VM_COMPLETED; @@ -147,62 +222,99 @@ void Wb35Rx_Complete(PURB pUrb) pWb35Rx->RxBufferSize[ RxBufferId ] = BulkLength; if (!pWb35Rx->RxOwner[ RxBufferId ]) - Wb35Rx_indicate(pHwData); + Wb35Rx_indicate(hw); kfree(pWb35Rx->pDRx); // Do the next receive - Wb35Rx(pHwData); + Wb35Rx(hw); return; error: pWb35Rx->RxOwner[ RxBufferId ] = 1; // Set the owner to hardware - OS_ATOMIC_DEC( pHwData->Adapter, &pWb35Rx->RxFireCounter ); + atomic_dec(&pWb35Rx->RxFireCounter); pWb35Rx->EP3vm_state = VM_STOP; } -//===================================================================================== -unsigned char Wb35Rx_initial(phw_data_t pHwData) +// This function cannot reentrain +static void Wb35Rx(struct ieee80211_hw *hw) { - PWB35RX pWb35Rx = &pHwData->Wb35Rx; - - // Initial the Buffer Queue - Wb35Rx_reset_descriptor( pHwData ); + struct wbsoft_priv *priv = hw->priv; + phw_data_t pHwData = &priv->sHwData; + PWB35RX pWb35Rx = &pHwData->Wb35Rx; + u8 * pRxBufferAddress; + struct urb *urb = pWb35Rx->RxUrb; + int retv; + u32 RxBufferId; - pWb35Rx->RxUrb = wb_usb_alloc_urb(0); - return (!!pWb35Rx->RxUrb); -} + // + // Issuing URB + // + if (pHwData->SurpriseRemove || pHwData->HwStop) + goto error; -void Wb35Rx_stop(phw_data_t pHwData) -{ - PWB35RX pWb35Rx = &pHwData->Wb35Rx; + if (pWb35Rx->rx_halt) + goto error; - // 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 + // Get RxBuffer's ID + RxBufferId = pWb35Rx->RxBufferId; + if (!pWb35Rx->RxOwner[RxBufferId]) { + // It's impossible to run here. #ifdef _PE_RX_DUMP_ - WBDEBUG(("EP3 Rx stop\n")); + 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; + + pWb35Rx->pDRx = kzalloc(MAX_USB_RX_BUFFER, GFP_ATOMIC); + if (!pWb35Rx->pDRx) { + printk("w35und: Rx memory alloc failed\n"); + goto error; + } + pRxBufferAddress = pWb35Rx->pDRx; + + usb_fill_bulk_urb(urb, pHwData->WbUsb.udev, + usb_rcvbulkpipe(pHwData->WbUsb.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) { + printk("Rx URB sending error\n"); + goto error; } + return; + +error: + // VM stop + pWb35Rx->EP3vm_state = VM_STOP; + atomic_dec(&pWb35Rx->RxFireCounter); } -// Needs process context -void Wb35Rx_destroy(phw_data_t pHwData) +void Wb35Rx_start(struct ieee80211_hw *hw) { + struct wbsoft_priv *priv = hw->priv; + phw_data_t pHwData = &priv->sHwData; 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 + // 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); } -void Wb35Rx_reset_descriptor( phw_data_t pHwData ) +//===================================================================================== +static void Wb35Rx_reset_descriptor( phw_data_t pHwData ) { PWB35RX pWb35Rx = &pHwData->Wb35Rx; u32 i; @@ -218,117 +330,44 @@ void Wb35Rx_reset_descriptor( phw_data_t pHwData ) pWb35Rx->RxOwner[i] = 1; } -void Wb35Rx_adjust(PDESCRIPTOR pRxDes) +unsigned char Wb35Rx_initial(phw_data_t pHwData) { - u32 * pRxBufferAddress; - u32 DecryptionMethod; - u32 i; - u16 BufferSize; - - DecryptionMethod = pRxDes->R01.R01_decryption_method; - pRxBufferAddress = pRxDes->buffer_address[0]; - BufferSize = pRxDes->buffer_size[0]; + PWB35RX pWb35Rx = &pHwData->Wb35Rx; - // 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; + // Initial the Buffer Queue + Wb35Rx_reset_descriptor( pHwData ); - // 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; + pWb35Rx->RxUrb = usb_alloc_urb(0, GFP_ATOMIC); + return (!!pWb35Rx->RxUrb); } -extern void packet_came(char *pRxBufferAddress, int PacketSize); +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 + } +} -u16 Wb35Rx_indicate(phw_data_t pHwData) +// Needs process context +void Wb35Rx_destroy(phw_data_t pHwData) { - DESCRIPTOR RxDes; - PWB35RX pWb35Rx = &pHwData->Wb35Rx; - u8 * pRxBufferAddress; - u16 PacketSize; - u16 stmp, BufferSize, stmp2 = 0; - u32 RxBufferId; + PWB35RX pWb35Rx = &pHwData->Wb35Rx; - // 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); + msleep(10); // Delay for waiting function enter 940623.1.a + } while (pWb35Rx->EP3vm_state != VM_STOP); + msleep(10); // Delay for waiting function exit 940623.1.b - return stmp2; + if (pWb35Rx->RxUrb) + usb_free_urb( pWb35Rx->RxUrb ); + #ifdef _PE_RX_DUMP_ + WBDEBUG(("Wb35Rx_destroy OK\n")); + #endif } - diff --git a/drivers/staging/winbond/wb35rx_f.h b/drivers/staging/winbond/wb35rx_f.h new file mode 100644 index 00000000000..d993041e0cd --- /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_s.h" + +//==================================== +// Interface function declare +//==================================== +unsigned char Wb35Rx_initial( phw_data_t pHwData ); +void Wb35Rx_destroy( phw_data_t pHwData ); +void Wb35Rx_stop( phw_data_t pHwData ); +void Wb35Rx_start(struct ieee80211_hw *hw); + +#endif diff --git a/drivers/staging/winbond/linux/wb35rx_s.h b/drivers/staging/winbond/wb35rx_s.h index b90c269e6ad..f18350b41c4 100644 --- a/drivers/staging/winbond/linux/wb35rx_s.h +++ b/drivers/staging/winbond/wb35rx_s.h @@ -18,7 +18,7 @@ typedef struct _WB35RX { u32 ByteReceived;// For calculating throughput of BulkIn - OS_ATOMIC RxFireCounter;// Does Wb35Rx module fire? + 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) ]; diff --git a/drivers/staging/winbond/linux/wb35tx.c b/drivers/staging/winbond/wb35tx.c index ba9d51244e2..b9b4456c808 100644 --- a/drivers/staging/winbond/linux/wb35tx.c +++ b/drivers/staging/winbond/wb35tx.c @@ -8,8 +8,11 @@ // Processing the Tx message and put into down layer // //============================================================================ -#include "sysdef.h" +#include <linux/usb.h> +#include "wb35tx_f.h" +#include "mds_f.h" +#include "sysdef.h" unsigned char Wb35Tx_get_tx_buffer(phw_data_t pHwData, u8 **pBuffer) @@ -17,28 +20,54 @@ Wb35Tx_get_tx_buffer(phw_data_t pHwData, u8 **pBuffer) PWB35TX pWb35Tx = &pHwData->Wb35Tx; *pBuffer = pWb35Tx->TxBuffer[0]; - return TRUE; + return true; } -void Wb35Tx_start(phw_data_t pHwData) +static void Wb35Tx(struct wbsoft_priv *adapter); + +static void Wb35Tx_complete(struct urb * pUrb) { - PWB35TX pWb35Tx = &pHwData->Wb35Tx; + struct wbsoft_priv *adapter = pUrb->context; + phw_data_t pHwData = &adapter->sHwData; + PWB35TX pWb35Tx = &pHwData->Wb35Tx; + PMDS pMds = &adapter->Mds; - // 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 ); -} + 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; -void Wb35Tx(phw_data_t pHwData) + 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(adapter); + return; + +error: + atomic_dec(&pWb35Tx->TxFireCounter); + pWb35Tx->EP4vm_state = VM_STOP; +} + +static void Wb35Tx(struct wbsoft_priv *adapter) { + phw_data_t pHwData = &adapter->sHwData; PWB35TX pWb35Tx = &pHwData->Wb35Tx; - PADAPTER Adapter = pHwData->Adapter; u8 *pTxBufferAddress; - PMDS pMds = &Adapter->Mds; + PMDS pMds = &adapter->Mds; struct urb * pUrb = (struct urb *)pWb35Tx->Tx4Urb; int retv; u32 SendIndex; @@ -62,10 +91,10 @@ void Wb35Tx(phw_data_t pHwData) usb_fill_bulk_urb(pUrb, pHwData->WbUsb.udev, usb_sndbulkpipe(pHwData->WbUsb.udev, 4), pTxBufferAddress, pMds->TxBufferSize[ SendIndex ], - Wb35Tx_complete, pHwData); + Wb35Tx_complete, adapter); pWb35Tx->EP4vm_state = VM_RUNNING; - retv = wb_usb_submit_urb( pUrb ); + retv = usb_submit_urb(pUrb, GFP_ATOMIC); if (retv<0) { printk("EP4 Tx Irp sending error\n"); goto cleanup; @@ -74,78 +103,45 @@ void Wb35Tx(phw_data_t pHwData) // Check if driver needs issue Irp for EP2 pWb35Tx->TxFillCount += pMds->TxCountInBuffer[SendIndex]; if (pWb35Tx->TxFillCount > 12) - Wb35Tx_EP2VM_start( pHwData ); + Wb35Tx_EP2VM_start(adapter); 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; + atomic_dec(&pWb35Tx->TxFireCounter); } -void Wb35Tx_reset_descriptor( phw_data_t pHwData ) +void Wb35Tx_start(struct wbsoft_priv *adapter) { + phw_data_t pHwData = &adapter->sHwData; PWB35TX pWb35Tx = &pHwData->Wb35Tx; - pWb35Tx->TxSendIndex = 0; - pWb35Tx->tx_halt = 0; + // 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(phw_data_t pHwData) { PWB35TX pWb35Tx = &pHwData->Wb35Tx; - pWb35Tx->Tx4Urb = wb_usb_alloc_urb(0); + pWb35Tx->Tx4Urb = usb_alloc_urb(0, GFP_ATOMIC); if (!pWb35Tx->Tx4Urb) - return FALSE; + return false; - pWb35Tx->Tx2Urb = wb_usb_alloc_urb(0); + pWb35Tx->Tx2Urb = usb_alloc_urb(0, GFP_ATOMIC); if (!pWb35Tx->Tx2Urb) { usb_free_urb( pWb35Tx->Tx4Urb ); - return FALSE; + return false; } - return TRUE; + return true; } //====================================================== @@ -175,9 +171,9 @@ void Wb35Tx_destroy(phw_data_t pHwData) // Wait for VM stop do { - OS_SLEEP(10000); // Delay for waiting function enter 940623.1.a + msleep(10); // 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 + msleep(10); // Delay for waiting function enter 940623.1.b if (pWb35Tx->Tx4Urb) usb_free_urb( pWb35Tx->Tx4Urb ); @@ -190,77 +186,30 @@ void Wb35Tx_destroy(phw_data_t pHwData) #endif } -void Wb35Tx_CurrentTime(phw_data_t pHwData, u32 TimeCount) +void Wb35Tx_CurrentTime(struct wbsoft_priv *adapter, u32 TimeCount) { + phw_data_t pHwData = &adapter->sHwData; PWB35TX pWb35Tx = &pHwData->Wb35Tx; - unsigned char Trigger = FALSE; + unsigned char Trigger = false; if (pWb35Tx->TxTimer > TimeCount) - Trigger = TRUE; + Trigger = true; else if (TimeCount > (pWb35Tx->TxTimer+500)) - Trigger = TRUE; + 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 ); + Wb35Tx_EP2VM_start(adapter); } - else - OS_ATOMIC_DEC( pHwData->Adapter, &pWb35Tx->TxResultCount ); } +static void Wb35Tx_EP2VM(struct wbsoft_priv *adapter); -void Wb35Tx_EP2VM(phw_data_t pHwData) +static void Wb35Tx_EP2VM_complete(struct urb * pUrb) { - 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; + struct wbsoft_priv *adapter = pUrb->context; + phw_data_t pHwData = &adapter->sHwData; T02_DESCRIPTOR T02, TSTATUS; - PADAPTER Adapter = (PADAPTER)pHwData->Adapter; PWB35TX pWb35Tx = &pHwData->Wb35Tx; u32 * pltmp = (u32 *)pWb35Tx->EP2_buf; u32 i; @@ -295,13 +244,62 @@ void Wb35Tx_EP2VM_complete(struct urb * pUrb) T02.value |= ((cpu_to_le32(pltmp[i]) & 0xff) << 24); TSTATUS.value = T02.value; //20061009 anson's endian - Mds_SendComplete( Adapter, &TSTATUS ); + Mds_SendComplete( adapter, &TSTATUS ); T02.value = cpu_to_le32(pltmp[i]) >> 8; } return; error: - OS_ATOMIC_DEC( pHwData->Adapter, &pWb35Tx->TxResultCount ); + atomic_dec(&pWb35Tx->TxResultCount); + pWb35Tx->EP2vm_state = VM_STOP; +} + +static void Wb35Tx_EP2VM(struct wbsoft_priv *adapter) +{ + phw_data_t pHwData = &adapter->sHwData; + 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, adapter, 32); + + pWb35Tx->EP2vm_state = VM_RUNNING; + retv = usb_submit_urb(pUrb, GFP_ATOMIC); + + if (retv < 0) { + #ifdef _PE_TX_DUMP_ + WBDEBUG(("EP2 Tx Irp sending error\n")); + #endif + goto error; + } + + return; +error: pWb35Tx->EP2vm_state = VM_STOP; + atomic_dec(&pWb35Tx->TxResultCount); } +void Wb35Tx_EP2VM_start(struct wbsoft_priv *adapter) +{ + phw_data_t pHwData = &adapter->sHwData; + PWB35TX 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..4222fa80c7b --- /dev/null +++ b/drivers/staging/winbond/wb35tx_f.h @@ -0,0 +1,21 @@ +#ifndef __WINBOND_WB35TX_F_H +#define __WINBOND_WB35TX_F_H + +#include "core.h" +#include "wbhal_f.h" + +//==================================== +// 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_start(struct wbsoft_priv *adapter); + +void Wb35Tx_start(struct wbsoft_priv *adapter); +void Wb35Tx_stop( phw_data_t pHwData ); + +void Wb35Tx_CurrentTime(struct wbsoft_priv *adapter, u32 TimeCount); + +#endif diff --git a/drivers/staging/winbond/linux/wb35tx_s.h b/drivers/staging/winbond/wb35tx_s.h index ac432573676..3960276cae6 100644 --- a/drivers/staging/winbond/linux/wb35tx_s.h +++ b/drivers/staging/winbond/wb35tx_s.h @@ -1,3 +1,8 @@ +#ifndef __WINBOND_WB35_TX_S_H +#define __WINBOND_WB35_TX_S_H + +#include "mds_s.h" + //==================================== // IS89C35 Tx related definition //==================================== @@ -21,8 +26,8 @@ typedef struct _WB35TX // 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 + 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 @@ -41,7 +46,4 @@ typedef struct _WB35TX } WB35TX, *PWB35TX; - - - - +#endif diff --git a/drivers/staging/winbond/wbhal.c b/drivers/staging/winbond/wbhal.c index 5d68ecec34c..8a9d21cbb0c 100644 --- a/drivers/staging/winbond/wbhal.c +++ b/drivers/staging/winbond/wbhal.c @@ -1,11 +1,6 @@ #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 ); -} +#include "wbhal_f.h" +#include "wblinux_f.h" void hal_set_ethernet_address( phw_data_t pHwData, u8 *current_address ) { @@ -28,423 +23,11 @@ void hal_get_permanent_address( phw_data_t pHwData, u8 *pethernet_address ) 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 ) +static void hal_led_control(unsigned long data) { - 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; + struct wbsoft_priv *adapter = (struct wbsoft_priv *) data; + phw_data_t pHwData = &adapter->sHwData; + struct wb35_reg *reg = &pHwData->reg; 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 }; @@ -487,21 +70,21 @@ void hal_led_control( void* S1, phw_data_t pHwData, void* S3, void* S4 ) } pHwData->LED_Blinking++; - pWb35Reg->U1BC_LEDConfigure = ltmp; + reg->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; + reg->U1BC_LEDConfigure |= (ltmp &0xff)<<8; // Copy LED result to each LED control register + reg->U1BC_LEDConfigure |= (ltmp &0xff00)>>8; } - Wb35Reg_Write( pHwData, 0x03bc, pWb35Reg->U1BC_LEDConfigure ); + Wb35Reg_Write( pHwData, 0x03bc, reg->U1BC_LEDConfigure ); } } else if( pHwData->CurrentRadioSw || pHwData->CurrentRadioHw ) // If radio off { - if( pWb35Reg->U1BC_LEDConfigure & 0x1010 ) + if( reg->U1BC_LEDConfigure & 0x1010 ) { - pWb35Reg->U1BC_LEDConfigure &= ~0x1010; - Wb35Reg_Write( pHwData, 0x03bc, pWb35Reg->U1BC_LEDConfigure ); + reg->U1BC_LEDConfigure &= ~0x1010; + Wb35Reg_Write( pHwData, 0x03bc, reg->U1BC_LEDConfigure ); } } else @@ -516,15 +99,15 @@ void hal_led_control( void* S1, phw_data_t pHwData, void* S3, void* S4 ) { if( pHwData->LED_Blinking == 0 ) { - pWb35Reg->U1BC_LEDConfigure |= 0x10; - Wb35Reg_Write( pHwData, 0x03bc, pWb35Reg->U1BC_LEDConfigure ); // LED_0 On + reg->U1BC_LEDConfigure |= 0x10; + Wb35Reg_Write( pHwData, 0x03bc, reg->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 + reg->U1BC_LEDConfigure &= ~0x10; + Wb35Reg_Write( pHwData, 0x03bc, reg->U1BC_LEDConfigure ); // LED_0 Off pHwData->LED_Blinking = 0; TimeInterval = 300; } @@ -532,20 +115,20 @@ void hal_led_control( void* S1, phw_data_t pHwData, void* S3, void* S4 ) else { //Turn Off LED_0 - if( pWb35Reg->U1BC_LEDConfigure & 0x10 ) + if( reg->U1BC_LEDConfigure & 0x10 ) { - pWb35Reg->U1BC_LEDConfigure &= ~0x10; - Wb35Reg_Write( pHwData, 0x03bc, pWb35Reg->U1BC_LEDConfigure ); // LED_0 Off + reg->U1BC_LEDConfigure &= ~0x10; + Wb35Reg_Write( pHwData, 0x03bc, reg->U1BC_LEDConfigure ); // LED_0 Off } } } else { // Turn On LED_0 - if( (pWb35Reg->U1BC_LEDConfigure & 0x10) == 0 ) + if( (reg->U1BC_LEDConfigure & 0x10) == 0 ) { - pWb35Reg->U1BC_LEDConfigure |= 0x10; - Wb35Reg_Write( pHwData, 0x03bc, pWb35Reg->U1BC_LEDConfigure ); // LED_0 Off + reg->U1BC_LEDConfigure |= 0x10; + Wb35Reg_Write( pHwData, 0x03bc, reg->U1BC_LEDConfigure ); // LED_0 Off } } break; @@ -558,16 +141,16 @@ void hal_led_control( void* S1, phw_data_t pHwData, void* S3, void* S4 ) { if( pHwData->LED_Blinking == 0 ) { - pWb35Reg->U1BC_LEDConfigure &= ~0xf; - pWb35Reg->U1BC_LEDConfigure |= 0x10; - Wb35Reg_Write( pHwData, 0x03bc, pWb35Reg->U1BC_LEDConfigure ); // LED_0 On + 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 { - pWb35Reg->U1BC_LEDConfigure &= ~0x1f; - Wb35Reg_Write( pHwData, 0x03bc, pWb35Reg->U1BC_LEDConfigure ); // LED_0 Off + reg->U1BC_LEDConfigure &= ~0x1f; + Wb35Reg_Write( pHwData, 0x03bc, reg->U1BC_LEDConfigure ); // LED_0 Off pHwData->LED_Blinking = 0; TimeInterval = 300; } @@ -575,26 +158,26 @@ void hal_led_control( void* S1, phw_data_t pHwData, void* S3, void* S4 ) else { // 20060901 Gray blinking if in disconnect state and not scanning - ltmp = pWb35Reg->U1BC_LEDConfigure; - pWb35Reg->U1BC_LEDConfigure &= ~0x1f; + ltmp = reg->U1BC_LEDConfigure; + reg->U1BC_LEDConfigure &= ~0x1f; if( LEDgray2[(pHwData->LED_Blinking%30)] ) { - pWb35Reg->U1BC_LEDConfigure |= 0x10; - pWb35Reg->U1BC_LEDConfigure |= LEDgray2[ (pHwData->LED_Blinking%30) ]; + reg->U1BC_LEDConfigure |= 0x10; + reg->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 + if( reg->U1BC_LEDConfigure != ltmp ) + Wb35Reg_Write( pHwData, 0x03bc, reg->U1BC_LEDConfigure ); // LED_0 Off TimeInterval = 100; } } else { // Turn On LED_0 - if( (pWb35Reg->U1BC_LEDConfigure & 0x10) == 0 ) + if( (reg->U1BC_LEDConfigure & 0x10) == 0 ) { - pWb35Reg->U1BC_LEDConfigure |= 0x10; - Wb35Reg_Write( pHwData, 0x03bc, pWb35Reg->U1BC_LEDConfigure ); // LED_0 Off + reg->U1BC_LEDConfigure |= 0x10; + Wb35Reg_Write( pHwData, 0x03bc, reg->U1BC_LEDConfigure ); // LED_0 Off } } break; @@ -607,15 +190,15 @@ void hal_led_control( void* S1, phw_data_t pHwData, void* S3, void* S4 ) { if( pHwData->LED_Blinking == 0 ) { - pWb35Reg->U1BC_LEDConfigure |= 0x1000; - Wb35Reg_Write( pHwData, 0x03bc, pWb35Reg->U1BC_LEDConfigure ); // LED_1 On + reg->U1BC_LEDConfigure |= 0x1000; + Wb35Reg_Write( pHwData, 0x03bc, reg->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 + reg->U1BC_LEDConfigure &= ~0x1000; + Wb35Reg_Write( pHwData, 0x03bc, reg->U1BC_LEDConfigure ); // LED_1 Off pHwData->LED_Blinking = 0; TimeInterval = 300; } @@ -623,57 +206,57 @@ void hal_led_control( void* S1, phw_data_t pHwData, void* S3, void* S4 ) else { //Turn Off LED_1 - if( pWb35Reg->U1BC_LEDConfigure & 0x1000 ) + if( reg->U1BC_LEDConfigure & 0x1000 ) { - pWb35Reg->U1BC_LEDConfigure &= ~0x1000; - Wb35Reg_Write( pHwData, 0x03bc, pWb35Reg->U1BC_LEDConfigure ); // LED_1 Off + reg->U1BC_LEDConfigure &= ~0x1000; + Wb35Reg_Write( pHwData, 0x03bc, reg->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( (adapter->RxByteCount != pHwData->RxByteCountLast ) || + (adapter->TxByteCount != pHwData->TxByteCountLast ) ) { - if( (pWb35Reg->U1BC_LEDConfigure & 0x3000) != 0x3000 ) + if( (reg->U1BC_LEDConfigure & 0x3000) != 0x3000 ) { - pWb35Reg->U1BC_LEDConfigure |= 0x3000; - Wb35Reg_Write( pHwData, 0x03bc, pWb35Reg->U1BC_LEDConfigure ); // LED_1 On + reg->U1BC_LEDConfigure |= 0x3000; + Wb35Reg_Write( pHwData, 0x03bc, reg->U1BC_LEDConfigure ); // LED_1 On } // Update variable - pHwData->RxByteCountLast = OS_CURRENT_RX_BYTE( Adapter ); - pHwData->TxByteCountLast = OS_CURRENT_TX_BYTE( Adapter ); + pHwData->RxByteCountLast = adapter->RxByteCount; + pHwData->TxByteCountLast = adapter->TxByteCount; TimeInterval = 200; } else { // Turn On LED_1 and blinking if transmitting/receiving - if( (pWb35Reg->U1BC_LEDConfigure & 0x3000) != 0x1000 ) + if( (reg->U1BC_LEDConfigure & 0x3000) != 0x1000 ) { - pWb35Reg->U1BC_LEDConfigure &= ~0x3000; - pWb35Reg->U1BC_LEDConfigure |= 0x1000; - Wb35Reg_Write( pHwData, 0x03bc, pWb35Reg->U1BC_LEDConfigure ); // LED_1 On + 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( (pWb35Reg->U1BC_LEDConfigure & 0x3000) != 0x3000 ) + if( (reg->U1BC_LEDConfigure & 0x3000) != 0x3000 ) { - pWb35Reg->U1BC_LEDConfigure |= 0x3000;// LED_1 is always on and event enable - Wb35Reg_Write( pHwData, 0x03bc, pWb35Reg->U1BC_LEDConfigure ); + 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 - pWb35Reg->U1BC_LEDConfigure &= ~0x0f; - pWb35Reg->U1BC_LEDConfigure |= 0x10; - pWb35Reg->U1BC_LEDConfigure |= LEDgray[ (pHwData->LED_Blinking-1)%20 ]; - Wb35Reg_Write( pHwData, 0x03bc, pWb35Reg->U1BC_LEDConfigure ); + reg->U1BC_LEDConfigure &= ~0x0f; + reg->U1BC_LEDConfigure |= 0x10; + reg->U1BC_LEDConfigure |= LEDgray[ (pHwData->LED_Blinking-1)%20 ]; + Wb35Reg_Write( pHwData, 0x03bc, reg->U1BC_LEDConfigure ); pHwData->LED_Blinking += 2; if( pHwData->LED_Blinking < 40 ) @@ -681,28 +264,28 @@ void hal_led_control( void* S1, phw_data_t pHwData, void* S3, void* S4 ) else { pHwData->LED_Blinking = 0; // Stop blinking - pWb35Reg->U1BC_LEDConfigure &= ~0x0f; - Wb35Reg_Write( pHwData, 0x03bc, pWb35Reg->U1BC_LEDConfigure ); + reg->U1BC_LEDConfigure &= ~0x0f; + Wb35Reg_Write( pHwData, 0x03bc, reg->U1BC_LEDConfigure ); } break; } if( pHwData->LED_LinkOn ) { - if( !(pWb35Reg->U1BC_LEDConfigure & 0x10) ) // Check the LED_0 + if( !(reg->U1BC_LEDConfigure & 0x10) ) // Check the LED_0 { //Try to turn ON LED_0 after gray blinking - pWb35Reg->U1BC_LEDConfigure |= 0x10; + reg->U1BC_LEDConfigure |= 0x10; pHwData->LED_Blinking = 1; //Start blinking TimeInterval = 50; } } else { - if( pWb35Reg->U1BC_LEDConfigure & 0x10 ) // Check the LED_0 + if( reg->U1BC_LEDConfigure & 0x10 ) // Check the LED_0 { - pWb35Reg->U1BC_LEDConfigure &= ~0x10; - Wb35Reg_Write( pHwData, 0x03bc, pWb35Reg->U1BC_LEDConfigure ); + reg->U1BC_LEDConfigure &= ~0x10; + Wb35Reg_Write( pHwData, 0x03bc, reg->U1BC_LEDConfigure ); } } break; @@ -720,84 +303,240 @@ void hal_led_control( void* S1, phw_data_t pHwData, void* S3, void* S4 ) } pHwData->time_count += TimeInterval; - Wb35Tx_CurrentTime( pHwData, pHwData->time_count ); // 20060928 add - OS_TIMER_SET( &pHwData->LEDTimer, TimeInterval ); // 20060623.1 + Wb35Tx_CurrentTime(adapter, pHwData->time_count); // 20060928 add + pHwData->LEDTimer.expires = jiffies + msecs_to_jiffies(TimeInterval); + add_timer(&pHwData->LEDTimer); } +u8 hal_init_hardware(struct ieee80211_hw *hw) +{ + struct wbsoft_priv *priv = hw->priv; + phw_data_t pHwData = &priv->sHwData; + u16 SoftwareSet; -void hal_set_phy_type( phw_data_t pHwData, u8 PhyType ) + // Initial the variable + pHwData->MaxReceiveLifeTime = DEFAULT_MSDU_LIFE_TIME; // Setting Rx maximum MSDU life time + pHwData->FragmentThreshold = DEFAULT_FRAGMENT_THRESHOLD; // Setting default fragment threshold + + pHwData->InitialResource = 1; + if( Wb35Reg_initial(pHwData)) { + pHwData->InitialResource = 2; + if (Wb35Tx_initial(pHwData)) { + pHwData->InitialResource = 3; + if (Wb35Rx_initial(pHwData)) { + pHwData->InitialResource = 4; + 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); + + // + // 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(hw); + Wb35Tx_EP2VM_start(priv); + + return true; + } + } + } + + pHwData->SurpriseRemove = 1; + return false; +} + + +void hal_halt(phw_data_t pHwData, void *ppa_data) { - pHwData->phy_type = PhyType; + switch( pHwData->InitialResource ) + { + case 4: + case 3: del_timer_sync(&pHwData->LEDTimer); + msleep(100); // 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 + } } -void hal_get_phy_type( phw_data_t pHwData, u8 *PhyType ) +//--------------------------------------------------------------------------------------------------- +void hal_set_beacon_period( phw_data_t pHwData, u16 beacon_period ) { - *PhyType = pHwData->phy_type; + u32 tmp; + + if( pHwData->SurpriseRemove ) return; + + pHwData->BeaconPeriod = beacon_period; + tmp = pHwData->BeaconPeriod << 16; + tmp |= pHwData->ProbeDelay; + Wb35Reg_Write( pHwData, 0x0848, tmp ); } -void hal_reset_counter( phw_data_t pHwData ) + +static void hal_set_current_channel_ex( phw_data_t pHwData, ChanInfo channel ) +{ + struct wb35_reg *reg = &pHwData->reg; + + 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 + reg->M28_MacControl &= ~0xff; // Clean channel information field + reg->M28_MacControl |= channel.ChanNo; + Wb35Reg_WriteWithCallbackValue( pHwData, 0x0828, reg->M28_MacControl, + (s8 *)&channel, sizeof(ChanInfo)); +} +//--------------------------------------------------------------------------------------------------- +void hal_set_current_channel( phw_data_t pHwData, ChanInfo channel ) { - pHwData->dto_tx_retry_count = 0; - pHwData->dto_tx_frag_count = 0; - memset( pHwData->tx_retry_count, 0, 8); + hal_set_current_channel_ex( pHwData, channel ); +} +//--------------------------------------------------------------------------------------------------- +void hal_set_accept_broadcast( phw_data_t 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. +void hal_set_accept_promiscuous( phw_data_t 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 ); + } +} + +void hal_set_accept_multicast( phw_data_t 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 ); +} + +void hal_set_accept_beacon( phw_data_t pHwData, u8 enable ) +{ + struct wb35_reg *reg = &pHwData->reg; + + if( pHwData->SurpriseRemove ) return; + + // 20040108 debug + 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 ); +} +//--------------------------------------------------------------------------------------------------- + +void hal_stop( phw_data_t 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 ); +} + +unsigned char hal_idle(phw_data_t pHwData) +{ + struct wb35_reg *reg = &pHwData->reg; + PWBUSB pWbUsb = &pHwData->WbUsb; + + if( !pHwData->SurpriseRemove && ( pWbUsb->DetectCount || reg->EP0vm_state!=VM_STOP ) ) + return false; + + return true; +} +//--------------------------------------------------------------------------------------------------- +void hal_set_phy_type( phw_data_t pHwData, u8 PhyType ) +{ + pHwData->phy_type = PhyType; } void hal_set_radio_mode( phw_data_t pHwData, unsigned char radio_off) { - PWB35REG pWb35Reg = &pHwData->Wb35Reg; + struct wb35_reg *reg = &pHwData->reg; if( pHwData->SurpriseRemove ) return; if (radio_off) //disable Baseband receive off { pHwData->CurrentRadioSw = 1; // off - pWb35Reg->M24_MacControl &= 0xffffffbf; + reg->M24_MacControl &= 0xffffffbf; } else { pHwData->CurrentRadioSw = 0; // on - pWb35Reg->M24_MacControl |= 0x00000040; + reg->M24_MacControl |= 0x00000040; } - Wb35Reg_Write( pHwData, 0x0824, pWb35Reg->M24_MacControl ); + Wb35Reg_Write( pHwData, 0x0824, reg->M24_MacControl ); } u8 hal_get_antenna_number( phw_data_t pHwData ) { - PWB35REG pWb35Reg = &pHwData->Wb35Reg; + struct wb35_reg *reg = &pHwData->reg; - if ((pWb35Reg->BB2C & BIT(11)) == 0) + if ((reg->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; + struct wb35_reg *reg = &pHwData->reg; if( pHwData->SurpriseRemove ) return 1; //read the bit16 of register U1B0 - Wb35Reg_Read( pHwData, 0x3b0, &pWb35Reg->U1B0 ); - if ((pWb35Reg->U1B0 & 0x00010000)) { + Wb35Reg_Read( pHwData, 0x3b0, ®->U1B0 ); + if ((reg->U1B0 & 0x00010000)) { pHwData->CurrentRadioHw = 1; return 1; } else { @@ -823,56 +562,7 @@ unsigned char hal_set_dxx_reg( phw_data_t pHwData, u16 number, u32 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_f.h b/drivers/staging/winbond/wbhal_f.h index ea9531ac847..e805f40f635 100644 --- a/drivers/staging/winbond/wbhal_f.h +++ b/drivers/staging/winbond/wbhal_f.h @@ -1,25 +1,19 @@ //===================================================================== // 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 +#include "wb35reg_f.h" +#include "wb35tx_f.h" +#include "wb35rx_f.h" + +#include "core.h" //==================================================================================== // 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 ); +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 ); @@ -27,14 +21,11 @@ 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 ); +u8 hal_init_hardware(struct ieee80211_hw *hw); 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 ); @@ -47,39 +38,25 @@ 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 ) +#define hal_get_region_from_EEPROM( _A ) ( (_A)->reg.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 ); @@ -88,20 +65,13 @@ u8 hal_get_hw_radio_off ( phw_data_t pHwData ); #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 @@ -113,7 +83,6 @@ unsigned char hal_set_LED( phw_data_t pHwData, u32 Mode ); // 20061108 for WPS #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 ) diff --git a/drivers/staging/winbond/wbhal_s.h b/drivers/staging/winbond/wbhal_s.h index 2ee3f0fc1ad..276d2b12632 100644 --- a/drivers/staging/winbond/wbhal_s.h +++ b/drivers/staging/winbond/wbhal_s.h @@ -1,3 +1,10 @@ +#ifndef __WINBOND_WBHAL_S_H +#define __WINBOND_WBHAL_S_H + +#include <linux/types.h> + +#include "common.h" + //[20040722 WK] #define HAL_LED_SET_MASK 0x001c //20060901 Extend #define HAL_LED_SET_SHIFT 2 @@ -415,10 +422,10 @@ typedef struct _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" +#include "wbusb_s.h" +#include "wb35reg_s.h" +#include "wb35tx_s.h" +#include "wb35rx_s.h" // For Hal using ================================================================== @@ -442,16 +449,6 @@ typedef struct _HW_DATA_T 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 //=============================================== @@ -506,11 +503,11 @@ typedef struct _HW_DATA_T // Variable for each module //======================================================================== WBUSB WbUsb; // Need WbUsb.h - WB35REG Wb35Reg; // Need Wb35Reg.h + struct wb35_reg reg; // Need Wb35Reg.h WB35TX Wb35Tx; // Need Wb35Tx.h WB35RX Wb35Rx; // Need Wb35Rx.h - OS_TIMER LEDTimer;// For LED + struct timer_list LEDTimer;// For LED u32 LEDpoint;// For LED @@ -570,7 +567,7 @@ typedef struct _HW_DATA_T u32 RxByteCountLast; u32 TxByteCountLast; - s32 SurpriseRemoveCount; + atomic_t SurpriseRemoveCount; // For global timer u32 time_count;//TICK_TIME_100ms 1 = 100ms @@ -612,4 +609,4 @@ typedef struct _HAL_RATE u32 NumRate54M; } HAL_RATE, *PHAL_RATE; - +#endif 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 index 68240c5fc80..868e8772724 100644 --- a/drivers/staging/winbond/wblinux_f.h +++ b/drivers/staging/winbond/wblinux_f.h @@ -1,23 +1,16 @@ +#ifndef __WBLINUX_F_H +#define __WBLINUX_F_H + +#include "core.h" +#include "mds_s.h" + //========================================================================= // 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 ); - - +#endif 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..b003f9a7e15 --- /dev/null +++ b/drivers/staging/winbond/wbusb.c @@ -0,0 +1,438 @@ +/* + * Copyright 2008 Pavel Machek <pavel@suse.cz> + * + * Distribute under GPLv2. + */ +#include <net/mac80211.h> +#include <linux/usb.h> + +#include "core.h" +#include "mds_f.h" +#include "mlmetxrx_f.h" +#include "mto_f.h" +#include "wbhal_f.h" +#include "wblinux_f.h" + +MODULE_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>"); +MODULE_DESCRIPTION("IS89C35 802.11bg WLAN USB Driver"); +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}, +}; + +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 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) +{ + struct wbsoft_priv *priv = dev->priv; + + MLMESendFrame(priv, skb->data, skb->len, FRAME_TYPE_802_11_MANAGEMENT); + + return NETDEV_TX_OK; +} + + +static int wbsoft_start(struct ieee80211_hw *dev) +{ + struct wbsoft_priv *priv = dev->priv; + + priv->enabled = true; + + return 0; +} + +static int wbsoft_config(struct ieee80211_hw *dev, u32 changed) +{ + struct wbsoft_priv *priv = dev->priv; + struct ieee80211_conf *conf = &dev->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(&priv->sHwData, ch); + hal_set_beacon_period(&priv->sHwData, conf->beacon_int); +// hal_set_cap_info(&priv->sHwData, ?? ); +// hal_set_ssid(phw_data_t pHwData, u8 * pssid, u8 ssid_len); ?? + 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); + //hal_set_antenna_number( phw_data_t pHwData, u8 number ) + //hal_set_rf_power(phw_data_t pHwData, u8 PowerIndex) + + +// hal_start_bss(&priv->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 wb35_hw_init() 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; +}; + +static unsigned char wb35_hw_init(struct ieee80211_hw *hw) +{ + struct wbsoft_priv *priv = hw->priv; + phw_data_t pHwData; + u8 *pMacAddr; + u8 *pMacAddr2; + u32 InitStep = 0; + u8 EEPROM_region; + u8 HwRadioOff; + + // + // Setting default value for Linux + // + priv->sLocalPara.region_INF = REGION_AUTO; + priv->sLocalPara.TxRateMode = RATE_AUTO; + priv->sLocalPara.bMacOperationMode = MODE_802_11_BG; // B/G mode + priv->Mds.TxRTSThreshold = DEFAULT_RTSThreshold; + priv->Mds.TxFragmentThreshold = DEFAULT_FRAGMENT_THRESHOLD; + hal_set_phy_type( &priv->sHwData, RF_WB_242_1 ); + priv->sLocalPara.MTUsize = MAX_ETHERNET_PACKET_SIZE; + priv->sLocalPara.bPreambleMode = AUTO_MODE; + priv->sLocalPara.RadioOffStatus.boSwRadioOff = false; + pHwData = &priv->sHwData; + hal_set_phy_type( pHwData, RF_DECIDE_BY_INF ); + + //added by ws for wep key error detection + priv->sLocalPara.bWepKeyError= false; + priv->sLocalPara.bToSelfPacketReceived = false; + priv->sLocalPara.WepKeyDetectTimerCount= 2 * 100; /// 2 seconds + + // Initial USB hal + InitStep = 1; + pHwData = &priv->sHwData; + if (!hal_init_hardware(hw)) + 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 + } + + // Get Software setting flag from hal + priv->sLocalPara.boAntennaDiversity = false; + if (hal_software_set(pHwData) & 0x00000001) + priv->sLocalPara.boAntennaDiversity = true; + + // + // For TS module + // + InitStep = 2; + + // For MDS module + InitStep = 3; + Mds_initial(priv); + + //======================================= + // 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 = priv->sLocalPara.ThisMacAddress; + pMacAddr2 = priv->sLocalPara.PermanentAddress; + hal_get_permanent_address( pHwData, priv->sLocalPara.PermanentAddress );// Reading ethernet address from EEPROM + 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); + } + + //get current antenna + priv->sLocalPara.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)) + 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) ); + + 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(priv, 12); FIXME? + return true; + +error: + switch (InitStep) { + case 5: + case 4: + case 3: Mds_Destroy( priv ); + case 2: + case 1: hal_halt( pHwData, NULL ); + case 0: break; + } + + return false; +} + +static int wb35_probe(struct usb_interface *intf, const struct usb_device_id *id_table) +{ + PWBUSB pWbUsb; + struct usb_host_interface *interface; + struct usb_endpoint_descriptor *endpoint; + u32 ltmp; + struct usb_device *udev = interface_to_usbdev(intf); + struct wbsoft_priv *priv; + struct ieee80211_hw *dev; + int err; + + usb_get_dev(udev); + + // 20060630.2 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) + goto error; + + ltmp = cpu_to_le32(ltmp); + if (ltmp) { // Is already initialized? + err = -EBUSY; + goto error; + } + + dev = ieee80211_alloc_hw(sizeof(*priv), &wbsoft_ops); + if (!dev) + goto error; + + priv = dev->priv; + + spin_lock_init(&priv->SpinLock); + + pWbUsb = &priv->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 (!wb35_hw_init(dev)) { + err = -EINVAL; + goto error_free_hw; + } + + SET_IEEE80211_DEV(dev, &udev->dev); + { + phw_data_t 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 = 0; + + dev->channel_change_time = 1000; + 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, priv); + + return 0; + +error_free_hw: + ieee80211_free_hw(dev); +error: + usb_put_dev(udev); + return err; +} + +static void wb35_hw_halt(struct wbsoft_priv *adapter) +{ + 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 + msleep(100);// Waiting Irp completed + + // Halt the HAL + hal_halt(&adapter->sHwData, NULL); +} + + +static void wb35_disconnect(struct usb_interface *intf) +{ + struct wbsoft_priv *priv = usb_get_intfdata(intf); + + wb35_hw_halt(priv); + + 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, +}; + +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_s.h b/drivers/staging/winbond/wbusb_s.h index d5c1d53de70..1de93600d84 100644 --- a/drivers/staging/winbond/linux/wbusb_s.h +++ b/drivers/staging/winbond/wbusb_s.h @@ -11,9 +11,10 @@ // //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -#define OS_SLEEP( _MT ) { set_current_state(TASK_INTERRUPTIBLE); \ - schedule_timeout( _MT*HZ/1000000 ); } +#ifndef __WINBOND_WBUSB_S_H +#define __WINBOND_WBUSB_S_H +#include <linux/types.h> //--------------------------------------------------------------------------- // RW_CONTEXT -- @@ -23,20 +24,14 @@ typedef struct _RW_CONTEXT { void* pHwData; - PURB pUrb; + struct urb *urb; 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; + +#endif |